diff -Nru a/CREDITS b/CREDITS
--- a/CREDITS	Sat Apr 19 19:51:49 2003
+++ b/CREDITS	Sat Apr 19 19:51:49 2003
@@ -2750,6 +2750,10 @@
 E: wsalamon@nai.com
 D: portions of the Linux Security Module (LSM) framework and security modules
 
+N: Robert Sanders
+E: gt8134b@prism.gatech.edu
+D: Dosemu
+
 N: Duncan Sands
 E: duncan.sands@wanadoo.fr
 W: http://topo.math.u-psud.fr/~sands
@@ -2757,10 +2761,6 @@
 S: 69 rue Dunois
 S: 75013 Paris
 S: France
-
-N: Robert Sanders
-E: gt8134b@prism.gatech.edu
-D: Dosemu
 
 N: Hannu Savolainen
 E: hannu@opensound.com
diff -Nru a/Documentation/Changes b/Documentation/Changes
--- a/Documentation/Changes	Sat Apr 19 19:51:50 2003
+++ b/Documentation/Changes	Sat Apr 19 19:51:50 2003
@@ -62,6 +62,7 @@
 o  isdn4k-utils           3.1pre1                 # isdnctrl 2>&1|grep version
 o  procps                 2.0.9                   # ps --version
 o  oprofile               0.5                     # oprofiled --version
+o  nfs-utils              1.0.3                   # showmount --version
 
 Kernel compilation
 ==================
diff -Nru a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl
--- a/Documentation/DocBook/kernel-api.tmpl	Sat Apr 19 19:51:27 2003
+++ b/Documentation/DocBook/kernel-api.tmpl	Sat Apr 19 19:51:27 2003
@@ -177,7 +177,6 @@
      </sect1>
      <sect1><title>PCI Hotplug Support Library</title>
 !Edrivers/hotplug/pci_hotplug_core.c
-!Edrivers/hotplug/pci_hotplug_util.c
      </sect1>
      <sect1><title>MCA Architecture</title>
 	<sect2><title>MCA Device Functions</title>
diff -Nru a/Documentation/DocBook/usb.tmpl b/Documentation/DocBook/usb.tmpl
--- a/Documentation/DocBook/usb.tmpl	Sat Apr 19 19:51:51 2003
+++ b/Documentation/DocBook/usb.tmpl	Sat Apr 19 19:51:51 2003
@@ -100,7 +100,8 @@
 <chapter id="host">
     <title>USB Host-Side API Model</title>
 
-    <para>Host-side drivers for USB devices talk to the "usbcore" APIs.
+    <para>Within the kernel,
+    host-side drivers for USB devices talk to the "usbcore" APIs.
     There are two types of public "usbcore" APIs, targetted at two different
     layers of USB driver.  Those are
     <emphasis>general purpose</emphasis> drivers, exposed through
@@ -287,6 +288,686 @@
 !Edrivers/usb/core/hcd.c
 !Edrivers/usb/core/hcd-pci.c
 !Edrivers/usb/core/buffer.c
+    </chapter>
+
+    <chapter>
+	<title>The USB Filesystem (usbfs)</title>
+
+	<para>This chapter presents the Linux <emphasis>usbfs</emphasis>.
+	You may prefer to avoid writing new kernel code for your
+	USB driver; that's the problem that usbfs set out to solve.
+	User mode device drivers are usually packaged as applications
+	or libraries, and may use usbfs through some programming library
+	that wraps it.  Such libraries include
+	<ulink url="http://libusb.sourceforge.net">libusb</ulink>
+	for C/C++, and
+	<ulink url="http://jUSB.sourceforge.net">jUSB</ulink> for Java.
+	</para>
+
+	<note><title>Unfinished</title>
+	    <para>This particular documentation is incomplete,
+	    especially with respect to the asynchronous mode.
+	    As of kernel 2.5.66 the code and this (new) documentation
+	    need to be cross-reviewed.
+	    </para>
+	    </note>
+
+	<para>Configure usbfs into Linux kernels by enabling the
+	<emphasis>USB filesystem</emphasis> option (CONFIG_USB_DEVICEFS),
+	and you get basic support for user mode USB device drivers.
+	Until relatively recently it was often (confusingly) called
+	<emphasis>usbdevfs</emphasis> although it wasn't solving what
+	<emphasis>devfs</emphasis> was.
+	Every USB device will appear in usbfs, regardless of whether or
+	not it has a kernel driver; but only devices with kernel drivers
+	show up in devfs.
+	</para>
+
+	<sect1>
+	    <title>What files are in "usbfs"?</title>
+
+	    <para>Conventionally mounted at
+	    <filename>/proc/bus/usb</filename>, usbfs 
+	    features include:
+	    <itemizedlist>
+		<listitem><para><filename>/proc/bus/usb/devices</filename>
+		    ... a text file
+		    showing each of the USB devices on known to the kernel,
+		    and their configuration descriptors.
+		    You can also poll() this to learn about new devices.
+		    </para></listitem>
+		<listitem><para><filename>/proc/bus/usb/BBB/DDD</filename>
+		    ... magic files
+		    exposing the each device's configuration descriptors, and
+		    supporting a series of ioctls for making device requests,
+		    including I/O to devices.  (Purely for access by programs.)
+		    </para></listitem>
+	    </itemizedlist>
+	    </para>
+
+	    <para> Each bus is given a number (BBB) based on when it was
+	    enumerated; within each bus, each device is given a similar
+	    number (DDD).
+	    Those BBB/DDD paths are not "stable" identifiers;
+	    expect them to change even if you always leave the devices
+	    plugged in to the same hub port.
+	    <emphasis>Don't even think of saving these in application
+	    configuration files.</emphasis>
+	    Stable identifiers are available, for user mode applications
+	    that want to use them.  HID and networking devices expose
+	    these stable IDs, so that for example you can be sure that
+	    you told the right UPS to power down its second server.
+	    "usbfs" doesn't (yet) expose those IDs.
+	    </para>
+
+	</sect1>
+
+	<sect1>
+	    <title>Mounting and Access Control</title>
+
+	    <para>There are a number of mount options for usbfs, which will
+	    be of most interest to you if you need to override the default
+	    access control policy.
+	    That policy is that only root may read or write device files
+	    (<filename>/proc/bus/BBB/DDD</filename>) although anyone may read
+	    the <filename>devices</filename>
+	    or <filename>drivers</filename> files.
+	    I/O requests to the device also need the CAP_SYS_RAWIO capability,
+	    </para>
+
+	    <para>The significance of that is that by default, all user mode
+	    device drivers need super-user privileges.
+	    You can change modes or ownership in a driver setup
+	    when the device hotplugs, or maye just start the
+	    driver right then, as a privileged server (or some activity
+	    within one).
+	    That's the most secure approach for multi-user systems,
+	    but for single user systems ("trusted" by that user)
+	    it's more convenient just to grant everyone all access
+	    (using the <emphasis>devmode=0666</emphasis> option)
+	    so the driver can start whenever it's needed.
+	    </para>
+
+	    <para>The mount options for usbfs, usable in /etc/fstab or
+	    in command line invocations of <emphasis>mount</emphasis>, are:
+
+	    <variablelist>
+		<varlistentry>
+		    <term><emphasis>busgid</emphasis>=NNNNN</term>
+		    <listitem><para>Controls the GID used for the
+		    /proc/bus/usb/BBB
+		    directories.  (Default: 0)</para></listitem></varlistentry>
+		<varlistentry><term><emphasis>busmode</emphasis>=MMM</term>
+		    <listitem><para>Controls the file mode used for the
+		    /proc/bus/usb/BBB
+		    directories.  (Default: 0555)
+		    </para></listitem></varlistentry>
+		<varlistentry><term><emphasis>busuid</emphasis>=NNNNN</term>
+		    <listitem><para>Controls the UID used for the
+		    /proc/bus/usb/BBB
+		    directories.  (Default: 0)</para></listitem></varlistentry>
+
+		<varlistentry><term><emphasis>devgid</emphasis>=NNNNN</term>
+		    <listitem><para>Controls the GID used for the
+		    /proc/bus/usb/BBB/DDD
+		    files.  (Default: 0)</para></listitem></varlistentry>
+		<varlistentry><term><emphasis>devmode</emphasis>=MMM</term>
+		    <listitem><para>Controls the file mode used for the
+		    /proc/bus/usb/BBB/DDD
+		    files.  (Default: 0644)</para></listitem></varlistentry>
+		<varlistentry><term><emphasis>devuid</emphasis>=NNNNN</term>
+		    <listitem><para>Controls the UID used for the
+		    /proc/bus/usb/BBB/DDD
+		    files.  (Default: 0)</para></listitem></varlistentry>
+
+		<varlistentry><term><emphasis>listgid</emphasis>=NNNNN</term>
+		    <listitem><para>Controls the GID used for the
+		    /proc/bus/usb/devices and drivers files.
+		    (Default: 0)</para></listitem></varlistentry>
+		<varlistentry><term><emphasis>listmode</emphasis>=MMM</term>
+		    <listitem><para>Controls the file mode used for the
+		    /proc/bus/usb/devices and drivers files.
+		    (Default: 0444)</para></listitem></varlistentry>
+		<varlistentry><term><emphasis>listuid</emphasis>=NNNNN</term>
+		    <listitem><para>Controls the UID used for the
+		    /proc/bus/usb/devices and drivers files.
+		    (Default: 0)</para></listitem></varlistentry>
+	    </variablelist>
+
+	    </para>
+
+	    <para>Note that many Linux distributions hard-wire the mount options
+	    for usbfs in their init scripts, such as
+	    <filename>/etc/rc.d/rc.sysinit</filename>,
+	    rather than making it easy to set this per-system
+	    policy in <filename>/etc/fstab</filename>.
+	    </para>
+
+	</sect1>
+
+	<sect1>
+	    <title>/proc/bus/usb/devices</title>
+
+	    <para>This file is handy for status viewing tools in user
+	    mode, which can scan the text format and ignore most of it.
+	    More detailed device status (including class and vendor
+	    status) is available from device-specific files.
+	    For information about the current format of this file,
+	    see the
+	    <filename>Documentation/usb/proc_usb_info.txt</filename>
+	    file in your Linux kernel sources.
+	    </para>
+
+	    <para>Otherwise the main use for this file from programs
+	    is to poll() it to get notifications of usb devices
+	    as they're plugged or unplugged.
+	    To see what changed, you'd need to read the file and
+	    compare "before" and "after" contents, scan the filesystem,
+	    or see its hotplug event.
+	    </para>
+
+	</sect1>
+
+	<sect1>
+	    <title>/proc/bus/usb/BBB/DDD</title>
+
+	    <para>Use these files in one of these basic ways:
+	    </para>
+
+	    <para><emphasis>They can be read,</emphasis>
+	    producing first the device descriptor
+	    (18 bytes) and then the descriptors for the current configuration.
+	    See the USB 2.0 spec for details about those binary data formats.
+	    You'll need to convert most multibyte values from little endian
+	    format to your native host byte order, although a few of the
+	    fields in the device descriptor (both of the BCD-encoded fields,
+	    and the vendor and product IDs) will be byteswapped for you.
+	    Note that configuration descriptors include descriptors for
+	    interfaces, altsettings, endpoints, and maybe additional
+	    class descriptors.
+	    </para>
+
+	    <para><emphasis>Perform USB operations</emphasis> using 
+	    <emphasis>ioctl()</emphasis> requests to make endpoint I/O
+	    requests (synchronously or asynchronously) or manage
+	    the device.
+	    These requests need the CAP_SYS_RAWIO capability,
+	    as well as filesystem access permissions.
+	    Only one ioctl request can be made on one of these
+	    device files at a time.
+	    This means that if you are synchronously reading an endpoint
+	    from one thread, you won't be able to write to a different
+	    endpoint from another thread until the read completes.
+	    This works for <emphasis>half duplex</emphasis> protocols,
+	    but otherwise you'd use asynchronous i/o requests. 
+	    </para>
+
+	    </sect1>
+
+
+	<sect1>
+	    <title>Life Cycle of User Mode Drivers</title>
+
+	    <para>Such a driver first needs to find a device file
+	    for a device it knows how to handle.
+	    Maybe it was told about it because a
+	    <filename>/sbin/hotplug</filename> event handling agent
+	    chose that driver to handle the new device.
+	    Or maybe it's an application that scans all the
+	    /proc/bus/usb device files, and ignores most devices.
+	    In either case, it should <function>read()</function> all
+	    the descriptors from the device file,
+	    and check them against what it knows how to handle.
+	    It might just reject everything except a particular
+	    vendor and product ID, or need a more complex policy.
+	    </para>
+
+	    <para>Never assume there will only be one such device
+	    on the system at a time!
+	    If your code can't handle more than one device at
+	    a time, at least detect when there's more than one, and
+	    have your users choose which device to use.
+	    </para>
+
+	    <para>Once your user mode driver knows what device to use,
+	    it interacts with it in either of two styles.
+	    The simple style is to make only control requests; some
+	    devices don't need more complex interactions than those.
+	    (An example might be software using vendor-specific control
+	    requests for some initialization or configuration tasks,
+	    with a kernel driver for the rest.)
+	    </para>
+
+	    <para>More likely, you need a more complex style driver:
+	    one using non-control endpoints, reading or writing data
+	    and claiming exclusive use of an interface.
+	    <emphasis>Bulk</emphasis> transfers are easiest to use,
+	    but only their sibling <emphasis>interrupt</emphasis> transfers 
+	    work with low speed devices.
+	    Both interrupt and <emphasis>isochronous</emphasis> transfers
+	    offer service guarantees because their bandwidth is reserved.
+	    Such "periodic" transfers are awkward to use through usbfs,
+	    unless you're using the asynchronous calls.  However, interrupt
+	    transfers can also be used in a synchronous "one shot" style.
+	    </para>
+
+	    <para>Your user-mode driver should never need to worry
+	    about cleaning up request state when the device is
+	    disconnected, although it should close its open file
+	    descriptors as soon as it starts seeing the ENODEV
+	    errors.
+	    </para>
+
+	    </sect1>
+
+	<sect1><title>The ioctl() Requests</title>
+
+	    <para>To use these ioctls, you need to include the following
+	    headers in your userspace program:
+<programlisting>#include &lt;linux/usb.h&gt;
+#include &lt;linux/usbdevice_fs.h&gt;
+#include &lt;asm/byteorder.h&gt;</programlisting>
+	    The standard USB device model requests, from "Chapter 9" of
+	    the USB 2.0 specification, are automatically included from
+	    the <filename>&lt;linux/usb_ch9.h&gt;</filename> header.
+	    </para>
+
+	    <para>Unless noted otherwise, the ioctl requests
+	    described here will
+	    update the modification time on the usbfs file to which
+	    they are applied (unless they fail).
+	    A return of zero indicates success; otherwise, a
+	    standard USB error code is returned.  (These are
+	    documented in
+	    <filename>Documentation/usb/error-codes.txt</filename>
+	    in your kernel sources.)
+	    </para>
+
+	    <para>Each of these files multiplexes access to several
+	    I/O streams, one per endpoint.
+	    Each device has one control endpoint (endpoint zero)
+	    which supports a limited RPC style RPC access.
+	    Devices are configured
+	    by khubd (in the kernel) setting a device-wide
+	    <emphasis>configuration</emphasis> that affects things
+	    like power consumption and basic functionality.
+	    The endpoints are part of USB <emphasis>interfaces</emphasis>,
+	    which may have <emphasis>altsettings</emphasis>
+	    affecting things like which endpoints are available.
+	    Many devices only have a single configuration and interface,
+	    so drivers for them will ignore configurations and altsettings.
+	    </para>
+
+
+	    <sect2>
+		<title>Management/Status Requests</title>
+
+		<para>A number of usbfs requests don't deal very directly
+		with device I/O.
+		They mostly relate to device management and status.
+		These are all synchronous requests.
+		</para>
+
+		<variablelist>
+
+		<varlistentry><term>USBDEVFS_CLAIMINTERFACE</term>
+		    <listitem><para>This is used to force usbfs to
+		    claim a specific interface,
+		    which has not previously been claimed by usbfs or any other
+		    kernel driver.
+		    The ioctl parameter is an integer holding the number of
+		    the interface (bInterfaceNumber from descriptor).
+		    </para><para>
+		    Note that if your driver doesn't claim an interface
+		    before trying to use one of its endpoints, and no
+		    other driver has bound to it, then the interface is
+		    automatically claimed by usbfs.
+		    </para><para>
+		    This claim will be released by a RELEASEINTERFACE ioctl,
+		    or by closing the file descriptor.
+		    File modification time is not updated by this request.
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_CONNECTINFO</term>
+		    <listitem><para>Says whether the device is lowspeed.
+		    The ioctl parameter points to a structure like this:
+<programlisting>struct usbdevfs_connectinfo {
+        unsigned int   devnum;
+        unsigned char  slow;
+}; </programlisting>
+		    File modification time is not updated by this request.
+		    </para><para>
+		    <emphasis>You can't tell whether a "not slow"
+		    device is connected at high speed (480 MBit/sec)
+		    or just full speed (12 MBit/sec).</emphasis>
+		    You should know the devnum value already,
+		    it's the DDD value of the device file name.
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_GETDRIVER</term>
+		    <listitem><para>Returns the name of the kernel driver
+		    bound to a given interface (a string).  Parameter
+		    is a pointer to this structure, which is modified:
+<programlisting>struct usbdevfs_getdriver {
+        unsigned int  interface;
+        char          driver[USBDEVFS_MAXDRIVERNAME + 1];
+};</programlisting>
+		    File modification time is not updated by this request.
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_IOCTL</term>
+		    <listitem><para>Passes a request from userspace through
+		    to a kernel driver that has an ioctl entry in the
+		    <emphasis>struct usb_driver</emphasis> it registered.
+<programlisting>struct usbdevfs_ioctl {
+        int     ifno;
+        int     ioctl_code;
+        void    *data;
+};
+
+/* user mode call looks like this.
+ * 'request' becomes the driver->ioctl() 'code' parameter.
+ * the size of 'param' is encoded in 'request', and that data
+ * is copied to or from the driver->ioctl() 'buf' parameter.
+ */
+static int
+usbdev_ioctl (int fd, int ifno, unsigned request, void *param)
+{
+        struct usbdevfs_ioctl	wrapper;
+
+        wrapper.ifno = ifno;
+        wrapper.ioctl_code = request;
+        wrapper.data = param;
+
+        return ioctl (fd, USBDEVFS_IOCTL, &amp;wrapper);
+} </programlisting>
+		    File modification time is not updated by this request.
+		    </para><para>
+		    This request lets kernel drivers talk to user mode code
+		    through filesystem operations even when they don't create
+		    a charactor or block special device.
+		    It's also been used to do things like ask devices what
+		    device special file should be used.
+		    Two pre-defined ioctls are used
+		    to disconnect and reconnect kernel drivers, so
+		    that user mode code can completely manage binding
+		    and configuration of devices.
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_RELEASEINTERFACE</term>
+		    <listitem><para>This is used to release the claim usbfs
+		    made on interface, either implicitly or because of a
+		    USBDEVFS_CLAIMINTERFACE call, before the file
+		    descriptor is closed.
+		    The ioctl parameter is an integer holding the number of
+		    the interface (bInterfaceNumber from descriptor);
+		    File modification time is not updated by this request.
+		    </para><warning><para>
+		    <emphasis>No security check is made to ensure
+		    that the task which made the claim is the one
+		    which is releasing it.
+		    This means that user mode driver may interfere
+		    other ones.  </emphasis>
+		    </para></warning></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_RESETEP</term>
+		    <listitem><para>Resets the data toggle value for an endpoint
+		    (bulk or interrupt) to DATA0.
+		    The ioctl parameter is an integer endpoint number
+		    (1 to 15, as identified in the endpoint descriptor),
+		    with USB_DIR_IN added if the device's endpoint sends
+		    data to the host.
+		    </para><warning><para>
+		    <emphasis>Avoid using this request.
+		    It should probably be removed.</emphasis>
+		    Using it typically means the device and driver will lose
+		    toggle synchronization.  If you really lost synchronization,
+		    you likely need to completely handshake with the device,
+		    using a request like CLEAR_HALT
+		    or SET_INTERFACE.
+		    </para></warning></listitem></varlistentry>
+
+		</variablelist>
+
+		</sect2>
+
+	    <sect2>
+		<title>Synchronous I/O Support</title>
+
+		<para>Synchronous requests involve the kernel blocking
+		until until the user mode request completes, either by
+		finishing successfully or by reporting an error.
+		In most cases this is the simplest way to use usbfs,
+		although as noted above it does prevent performing I/O
+		to more than one endpoint at a time.
+		</para>
+
+		<variablelist>
+
+		<varlistentry><term>USBDEVFS_BULK</term>
+		    <listitem><para>Issues a bulk read or write request to the
+		    device.
+		    The ioctl parameter is a pointer to this structure:
+<programlisting>struct usbdevfs_bulktransfer {
+        unsigned int  ep;
+        unsigned int  len;
+        unsigned int  timeout; /* in milliseconds */
+        void          *data;
+};</programlisting>
+		    </para><para>The "ep" value identifies a
+		    bulk endpoint number (1 to 15, as identified in an endpoint
+		    descriptor),
+		    masked with USB_DIR_IN when referring to an endpoint which
+		    sends data to the host from the device.
+		    The length of the data buffer is identified by "len";
+		    Recent kernels support requests up to about 128KBytes.
+		    <emphasis>FIXME say how read length is returned,
+		    and how short reads are handled.</emphasis>.
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_CLEAR_HALT</term>
+		    <listitem><para>Clears endpoint halt (stall) and
+		    resets the endpoint toggle.  This is only
+		    meaningful for bulk or interrupt endpoints.
+		    The ioctl parameter is an integer endpoint number
+		    (1 to 15, as identified in an endpoint descriptor),
+		    masked with USB_DIR_IN when referring to an endpoint which
+		    sends data to the host from the device.
+		    </para><para>
+		    Use this on bulk or interrupt endpoints which have
+		    stalled, returning <emphasis>-EPIPE</emphasis> status
+		    to a data transfer request.
+		    Do not issue the control request directly, since
+		    that could invalidate the host's record of the
+		    data toggle.
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_CONTROL</term>
+		    <listitem><para>Issues a control request to the device.
+		    The ioctl parameter points to a structure like this:
+<programlisting>struct usbdevfs_ctrltransfer {
+        __u8   bRequestType;
+        __u8   bRequest;
+        __u16  wValue;
+        __u16  wIndex;
+        __u16  wLength;
+        __u32  timeout;  /* in milliseconds */
+        void   *data;
+};</programlisting>
+		    </para><para>
+		    The first eight bytes of this structure are the contents
+		    of the SETUP packet to be sent to the device; see the
+		    USB 2.0 specification for details.
+		    The bRequestType value is composed by combining a
+		    USB_TYPE_* value, a USB_DIR_* value, and a
+		    USB_RECIP_* value (from
+		    <emphasis>&lt;linux/usb.h&gt;</emphasis>).
+		    If wLength is nonzero, it describes the length of the data
+		    buffer, which is either written to the device
+		    (USB_DIR_OUT) or read from the device (USB_DIR_IN).
+		    </para><para>
+		    At this writing, you can't transfer more than 4 KBytes
+		    of data to or from a device; usbfs has a limit, and
+		    some host controller drivers have a limit.
+		    (That's not usually a problem.)
+		    <emphasis>Also</emphasis> there's no way to say it's
+		    not OK to get a short read back from the device.
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_RESET</term>
+		    <listitem><para>Does a USB level device reset.
+		    The ioctl parameter is ignored.
+		    After the reset, this rebinds all device interfaces.
+		    File modification time is not updated by this request.
+		    </para><warning><para>
+		    <emphasis>Avoid using this call</emphasis>
+		    until some usbcore bugs get fixed,
+		    since it does not fully synchronize device, interface,
+		    and driver (not just usbfs) state.
+		    </para></warning></listitem></varlistentry>
+	    
+		<varlistentry><term>USBDEVFS_SETINTERFACE</term>
+		    <listitem><para>Sets the alternate setting for an
+		    interface.  The ioctl parameter is a pointer to a
+		    structure like this:
+<programlisting>struct usbdevfs_setinterface {
+        unsigned int  interface;
+        unsigned int  altsetting;
+}; </programlisting>
+		    File modification time is not updated by this request.
+		    </para><para>
+		    Those struct members are from some interface descriptor
+		    applying to the the current configuration.
+		    The interface number is the bInterfaceNumber value, and
+		    the altsetting number is the bAlternateSetting value.
+		    (This resets each endpoint in the interface.)
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_SETCONFIGURATION</term>
+		    <listitem><para>Issues the
+		    <function>usb_set_configuration</function> call
+		    for the device.
+		    The parameter is an integer holding the number of
+		    a configuration (bConfigurationValue from descriptor).
+		    File modification time is not updated by this request.
+		    </para><warning><para>
+		    <emphasis>Avoid using this call</emphasis>
+		    until some usbcore bugs get fixed,
+		    since it does not fully synchronize device, interface,
+		    and driver (not just usbfs) state.
+		    </para></warning></listitem></varlistentry>
+
+		</variablelist>
+	    </sect2>
+
+	    <sect2>
+		<title>Asynchronous I/O Support</title>
+
+		<para>As mentioned above, there are situations where it may be
+		important to initiate concurrent operations from user mode code.
+		This is particularly important for periodic transfers
+		(interrupt and isochronous), but it can be used for other
+		kinds of USB requests too.
+		In such cases, the asynchronous requests described here
+		are essential.  Rather than submitting one request and having
+		the kernel block until it completes, the blocking is separate.
+		</para>
+
+		<para>These requests are packaged into a structure that
+		resembles the URB used by kernel device drivers.
+		(No POSIX Async I/O support here, sorry.)
+		It identifies the endpoint type (USBDEVFS_URB_TYPE_*),
+		endpoint (number, masked with USB_DIR_IN as appropriate),
+		buffer and length, and a user "context" value serving to
+		uniquely identify each request.
+		(It's usually a pointer to per-request data.)
+		Flags can modify requests (not as many as supported for
+		kernel drivers).
+		</para>
+
+		<para>Each request can specify a realtime signal number
+		(between SIGRTMIN and SIGRTMAX, inclusive) to request a
+		signal be sent when the request completes.
+		</para>
+
+		<para>When usbfs returns these urbs, the status value
+		is updated, and the buffer may have been modified.
+		Except for isochronous transfers, the actual_length is
+		updated to say how many bytes were transferred; if the
+		USBDEVFS_URB_DISABLE_SPD flag is set
+		("short packets are not OK"), if fewer bytes were read
+		than were requested then you get an error report.
+		</para>
+
+<programlisting>struct usbdevfs_iso_packet_desc {
+        unsigned int                     length;
+        unsigned int                     actual_length;
+        unsigned int                     status;
+};
+
+struct usbdevfs_urb {
+        unsigned char                    type;
+        unsigned char                    endpoint;
+        int                              status;
+        unsigned int                     flags;
+        void                             *buffer;
+        int                              buffer_length;
+        int                              actual_length;
+        int                              start_frame;
+        int                              number_of_packets;
+        int                              error_count;
+        unsigned int                     signr;
+        void                             *usercontext;
+        struct usbdevfs_iso_packet_desc  iso_frame_desc[];
+};</programlisting>
+
+		<para> For these asynchronous requests, the file modification
+		time reflects when the request was initiated.
+		This contrasts with their use with the synchronous requests,
+		where it reflects when requests complete.
+		</para>
+
+		<variablelist>
+
+		<varlistentry><term>USBDEVFS_DISCARDURB</term>
+		    <listitem><para>
+		    <emphasis>TBS</emphasis>
+		    File modification time is not updated by this request.
+		    </para><para>
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_DISCSIGNAL</term>
+		    <listitem><para>
+		    <emphasis>TBS</emphasis>
+		    File modification time is not updated by this request.
+		    </para><para>
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_REAPURB</term>
+		    <listitem><para>
+		    <emphasis>TBS</emphasis>
+		    File modification time is not updated by this request.
+		    </para><para>
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_REAPURBNDELAY</term>
+		    <listitem><para>
+		    <emphasis>TBS</emphasis>
+		    File modification time is not updated by this request.
+		    </para><para>
+		    </para></listitem></varlistentry>
+
+		<varlistentry><term>USBDEVFS_SUBMITURB</term>
+		    <listitem><para>
+		    <emphasis>TBS</emphasis>
+		    </para><para>
+		    </para></listitem></varlistentry>
+
+		</variablelist>
+	    </sect2>
+
+	</sect1>
+
     </chapter>
 
 </book>
diff -Nru a/Documentation/arm/Porting b/Documentation/arm/Porting
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/arm/Porting	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,135 @@
+Taken from list archive at http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-July/004064.html
+
+Initial definitions
+-------------------
+
+The following symbol definitions rely on you knowing the translation that
+__virt_to_phys() does for your machine.  This macro converts the passed
+virtual address to a physical address.  Normally, it is simply:
+
+		phys = virt - PAGE_OFFSET + PHYS_OFFSET
+
+
+Decompressor Symbols
+--------------------
+
+ZTEXTADDR
+	Start address of decompressor.  There's no point in talking about
+	virtual or physical addresses here, since the MMU will be off at
+	the time when you call the decompressor code.  You normally call
+	the kernel at this address to start it booting.  This doesn't have
+	to be located in RAM, it can be in flash or other read-only or
+	read-write addressable medium.
+
+ZBSSADDR
+	Start address of zero-initialised work area for the decompressor.
+	This must be pointing at RAM.  The decompressor will zero initialise
+	this for you.  Again, the MMU will be off.
+
+ZRELADDR
+	This is the address where the decompressed kernel will be written,
+	and eventually executed.  The following constraint must be valid:
+
+		__virt_to_phys(TEXTADDR) == ZRELADDR
+
+	The initial part of the kernel is carefully coded to be position
+	independent.
+
+INITRD_PHYS
+	Physical address to place the initial RAM disk.  Only relevant if
+	you are using the bootpImage stuff (which only works on the old
+	struct param_struct).
+
+INITRD_VIRT
+	Virtual address of the initial RAM disk.  The following  constraint
+	must be valid:
+
+		__virt_to_phys(INITRD_VIRT) == INITRD_PHYS
+
+PARAMS_PHYS
+	Physical address of the struct param_struct or tag list, giving the
+	kernel various parameters about its execution environment.
+
+
+Kernel Symbols
+--------------
+
+PHYS_OFFSET
+	Physical start address of the first bank of RAM.
+
+PAGE_OFFSET
+	Virtual start address of the first bank of RAM.  During the kernel
+	boot phase, virtual address PAGE_OFFSET will be mapped to physical
+	address PHYS_OFFSET, along with any other mappings you supply.
+	This should be the same value as TASK_SIZE.
+
+TASK_SIZE
+	The maximum size of a user process in bytes.  Since user space
+	always starts at zero, this is the maximum address that a user
+	process can access+1.  The user space stack grows down from this
+	address.
+
+	Any virtual address below TASK_SIZE is deemed to be user process
+	area, and therefore managed dynamically on a process by process
+	basis by the kernel.  I'll call this the user segment.
+
+	Anything above TASK_SIZE is common to all processes.  I'll call
+	this the kernel segment.
+
+	(In other words, you can't put IO mappings below TASK_SIZE, and
+	hence PAGE_OFFSET).
+
+TEXTADDR
+	Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.
+	This is where the kernel image ends up.  With the latest kernels,
+	it must be located at 32768 bytes into a 128MB region.  Previous
+	kernels placed a restriction of 256MB here.
+
+DATAADDR
+	Virtual address for the kernel data segment.  Must not be defined
+	when using the decompressor.
+
+VMALLOC_START
+VMALLOC_END
+	Virtual addresses bounding the vmalloc() area.  There must not be
+	any static mappings in this area; vmalloc will overwrite them.
+	The addresses must also be in the kernel segment (see above).
+	Normally, the vmalloc() area starts VMALLOC_OFFSET bytes above the
+	last virtual RAM address (found using variable high_memory).
+
+VMALLOC_OFFSET
+	Offset normally incorporated into VMALLOC_START to provide a hole
+	between virtual RAM and the vmalloc area.  We do this to allow
+	out of bounds memory accesses (eg, something writing off the end
+	of the mapped memory map) to be caught.  Normally set to 8MB.
+
+Architecture Specific Macros
+----------------------------
+
+BOOT_MEM(pram,pio,vio)
+	`pram' specifies the physical start address of RAM.  Must always
+	be present, and should be the same as PHYS_OFFSET.
+
+	`pio' is the physical address of an 8MB region containing IO for
+	use with the debugging macros in arch/arm/kernel/debug-armv.S.
+
+	`vio' is the virtual address of the 8MB debugging region.
+
+	It is expected that the debugging region will be re-initialised
+	by the architecture specific code later in the code (via the
+	MAPIO function).
+
+BOOT_PARAMS
+	Same as, and see PARAMS_PHYS.
+
+FIXUP(func)
+	Machine specific fixups, run before memory subsystems have been
+	initialised.
+
+MAPIO(func)
+	Machine specific function to map IO areas (including the debug
+	region above).
+
+INITIRQ(func)
+	Machine specific function to initialise interrupts.
+
diff -Nru a/Documentation/cachetlb.txt b/Documentation/cachetlb.txt
--- a/Documentation/cachetlb.txt	Sat Apr 19 19:51:46 2003
+++ b/Documentation/cachetlb.txt	Sat Apr 19 19:51:46 2003
@@ -75,7 +75,7 @@
 	Platform developers note that generic code will always
 	invoke this interface with mm->page_table_lock held.
 
-4) void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
+4) void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
 
 	This time we need to remove the PAGE_SIZE sized translation
 	from the TLB.  The 'vma' is the backing structure used by
@@ -87,9 +87,9 @@
 
 	After running, this interface must make sure that any previous
 	page table modification for address space 'vma->vm_mm' for
-	user virtual address 'page' will be visible to the cpu.  That
+	user virtual address 'addr' will be visible to the cpu.  That
 	is, after running, there will be no entries in the TLB for
-	'vma->vm_mm' for virtual address 'page'.
+	'vma->vm_mm' for virtual address 'addr'.
 
 	This is used primarily during fault processing.
 
@@ -144,9 +144,9 @@
 	   change_range_of_page_tables(mm, start, end);
 	   flush_tlb_range(vma, start, end);
 
-	3) flush_cache_page(vma, page);
+	3) flush_cache_page(vma, addr);
 	   set_pte(pte_pointer, new_pte_val);
-	   flush_tlb_page(vma, page);
+	   flush_tlb_page(vma, addr);
 
 The cache level flush will always be first, because this allows
 us to properly handle systems whose caches are strict and require
@@ -200,7 +200,7 @@
 	call flush_cache_page (see below) for each entry which may be
 	modified.
 
-4) void flush_cache_page(struct vm_area_struct *vma, unsigned long page)
+4) void flush_cache_page(struct vm_area_struct *vma, unsigned long addr)
 
 	This time we need to remove a PAGE_SIZE sized range
 	from the cache.  The 'vma' is the backing structure used by
@@ -211,7 +211,7 @@
 	"Harvard" type cache layouts).
 
 	After running, there will be no entries in the cache for
-	'vma->vm_mm' for virtual address 'page'.
+	'vma->vm_mm' for virtual address 'addr'.
 
 	This is used primarily during fault processing.
 
@@ -235,7 +235,7 @@
 NOTE: This does not fix shared mmaps, check out the sparc64 port for
 one way to solve this (in particular SPARC_FLAG_MMAPSHARED).
 
-Next, you have two methods to solve the D-cache aliasing issue for all
+Next, you have to solve the D-cache aliasing issue for all
 other cases.  Please keep in mind that fact that, for a given page
 mapped into some user address space, there is always at least one more
 mapping, that of the kernel in it's linear mapping starting at
@@ -244,35 +244,8 @@
 aliasing problem has the potential to exist since the kernel already
 maps this page at its virtual address.
 
-First, I describe the old method to deal with this problem.  I am
-describing it for documentation purposes, but it is deprecated and the
-latter method I describe next should be used by all new ports and all
-existing ports should move over to the new mechanism as well.
-
-  flush_page_to_ram(struct page *page)
-
-	The physical page 'page' is about to be place into the
-	user address space of a process.  If it is possible for
-	stores done recently by the kernel into this physical
-	page, to not be visible to an arbitrary mapping in userspace,
-	you must flush this page from the D-cache.
-
-	If the D-cache is writeback in nature, the dirty data (if
-	any) for this physical page must be written back to main
-	memory before the cache lines are invalidated.
-
-Admittedly, the author did not think very much when designing this
-interface.  It does not give the architecture enough information about
-what exactly is going on, and there is no context to base a judgment
-on about whether an alias is possible at all.  The new interfaces to
-deal with D-cache aliasing are meant to address this by telling the
-architecture specific code exactly which is going on at the proper points
-in time.
-
-Here is the new interface:
-
-  void copy_user_page(void *to, void *from, unsigned long address)
-  void clear_user_page(void *to, unsigned long address)
+  void copy_user_page(void *to, void *from, unsigned long addr, struct page *page)
+  void clear_user_page(void *to, unsigned long addr, struct page *page)
 
 	These two routines store data in user anonymous or COW
 	pages.  It allows a port to efficiently avoid D-cache alias
@@ -285,8 +258,9 @@
 	of the same "color" as the user mapping of the page.  Sparc64
 	for example, uses this technique.
 
-	The "address" parameter tells the virtual address where the
-	user will ultimately have this page mapped.
+	The 'addr' parameter tells the virtual address where the
+	user will ultimately have this page mapped, and the 'page'
+	parameter gives a pointer to the struct page of the target.
 
 	If D-cache aliasing is not an issue, these two routines may
 	simply call memcpy/memset directly and do nothing more.
@@ -363,5 +337,5 @@
 
   void flush_icache_page(struct vm_area_struct *vma, struct page *page)
 	All the functionality of flush_icache_page can be implemented in
-	flush_dcache_page and update_mmu_cache. In 2.5 the hope is to
+	flush_dcache_page and update_mmu_cache. In 2.7 the hope is to
 	remove this interface completely.
diff -Nru a/Documentation/devices.txt b/Documentation/devices.txt
--- a/Documentation/devices.txt	Sat Apr 19 19:51:46 2003
+++ b/Documentation/devices.txt	Sat Apr 19 19:51:46 2003
@@ -693,13 +693,6 @@
 		    ...
 		 31 = /dev/fb31		32nd frame buffer
 
-		For backwards compatibility {2.6} the following
-		progression is also handled by current kernels:
-		  0 = /dev/fb0
-		 32 = /dev/fb1
-		    ...
-		224 = /dev/fb7
-
     block	Aztech/Orchid/Okano/Wearnes CD-ROM
 		  0 = /dev/aztcd	Aztech CD-ROM
 
diff -Nru a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
--- a/Documentation/filesystems/proc.txt	Sat Apr 19 19:51:29 2003
+++ b/Documentation/filesystems/proc.txt	Sat Apr 19 19:51:29 2003
@@ -362,6 +362,93 @@
   ide-cdrom version 4.53 
   ide-disk version 1.08 
 
+..............................................................................
+
+meminfo:
+
+Provides information about distribution and utilization of memory.  This
+varies by architecture and compile options.  The following is from a
+16GB PIII, which has highmem enabled.  You may not have all of these fields.
+
+> cat /proc/meminfo
+
+
+MemTotal:     16344972 kB
+MemFree:      13634064 kB
+Buffers:          3656 kB
+Cached:        1195708 kB
+SwapCached:          0 kB
+Active:         891636 kB
+Inactive:      1077224 kB
+HighTotal:    15597528 kB
+HighFree:     13629632 kB
+LowTotal:       747444 kB
+LowFree:          4432 kB
+SwapTotal:           0 kB
+SwapFree:            0 kB
+Dirty:             968 kB
+Writeback:           0 kB
+Mapped:         280372 kB
+Slab:           684068 kB
+Committed_AS:  1576424 kB
+PageTables:      24448 kB
+ReverseMaps:   1080904
+VmallocTotal:   112216 kB
+VmallocUsed:       428 kB
+VmallocChunk:   111088 kB
+
+    MemTotal: Total usable ram (i.e. physical ram minus a few reserved
+              bits and the kernel binary code)
+     MemFree: The sum of LowFree+HighFree
+     Buffers: Relatively temporary storage for raw disk blocks
+              shouldn't get tremendously large (20MB or so)
+      Cached: in-memory cache for files read from the disk (the
+              pagecache).  Doesn't include SwapCached
+  SwapCached: Memory that once was swapped out, is swapped back in but
+              still also is in the swapfile (if memory is needed it
+              doesn't need to be swapped out AGAIN because it is already
+              in the swapfile. This saves I/O)
+      Active: Memory that has been used more recently and usually not
+              reclaimed unless absolutely necessary.
+    Inactive: Memory which has been less recently used.  It is more
+              eligible to be reclaimed for other purposes
+   HighTotal:
+    HighFree: Highmem is all memory above ~860MB of physical memory
+              Highmem areas are for use by userspace programs, or
+              for the pagecache.  The kernel must use tricks to access
+              this memory, making it slower to access than lowmem.
+    LowTotal:
+     LowFree: Lowmem is memory which can be used for everything that
+              highmem can be used for, but it is also availble for the
+              kernel's use for its own data structures.  Among many
+              other things, it is where everything from the Slab is
+              allocated.  Bad things happen when you're out of lowmem.
+   SwapTotal: total amount of swap space available
+    SwapFree: Memory which has been evicted from RAM, and is temporarily
+              on the disk
+       Dirty: Memory which is waiting to get written back to the disk
+   Writeback: Memory which is actively being written back to the disk
+      Mapped: files which have been mmaped, such as libraries
+              Slab: in-kernel data structures cache
+Committed_AS: An estimate of how much RAM you would need to make a
+              99.99% guarantee that there never is OOM (out of memory)
+              for this workload. Normally the kernel will overcommit
+              memory. That means, say you do a 1GB malloc, nothing
+              happens, really. Only when you start USING that malloc
+              memory you will get real memory on demand, and just as
+              much as you use. So you sort of take a mortgage and hope
+              the bank doesn't go bust. Other cases might include when
+              you mmap a file that's shared only when you write to it
+              and you get a private copy of that data. While it normally
+              is shared between processes. The Committed_AS is a
+              guesstimate of how much RAM/swap you would need
+              worst-case.
+  PageTables: amount of memory dedicated to the lowest level of page
+              tables.
+ ReverseMaps: number of reverse mappings performed
+VmallocTotal: total size of vmalloc memory area
+ VmallocUsed: amount of vmalloc area which is used
+VmallocChunk: largest contigious block of vmalloc area which is free
 
 More detailed  information  can  be  found  in  the  controller  specific
 subdirectories. These  are  named  ide0,  ide1  and  so  on.  Each  of  these
diff -Nru a/Documentation/io_ordering.txt b/Documentation/io_ordering.txt
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/Documentation/io_ordering.txt	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,47 @@
+On some platforms, so-called memory-mapped I/O is weakly ordered.  On such
+platforms, driver writers are responsible for ensuring that I/O writes to
+memory-mapped addresses on their device arrive in the order intended.  This is
+typically done by reading a 'safe' device or bridge register, causing the I/O
+chipset to flush pending writes to the device before any reads are posted.  A
+driver would usually use this technique immediately prior to the exit of a
+critical section of code protected by spinlocks.  This would ensure that
+subsequent writes to I/O space arrived only after all prior writes (much like a
+memory barrier op, mb(), only with respect to I/O).
+
+A more concrete example from a hypothetical device driver:
+
+        ...
+CPU A:  spin_lock_irqsave(&dev_lock, flags)
+CPU A:  val = readl(my_status);
+CPU A:  ...
+CPU A:  writel(newval, ring_ptr);
+CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
+        ...
+CPU B:  spin_lock_irqsave(&dev_lock, flags)
+CPU B:  val = readl(my_status);
+CPU B:  ...
+CPU B:  writel(newval2, ring_ptr);
+CPU B:  spin_unlock_irqrestore(&dev_lock, flags)
+        ...
+
+In the case above, the device may receive newval2 before it receives newval,
+which could cause problems.  Fixing it is easy enough though:
+
+        ...
+CPU A:  spin_lock_irqsave(&dev_lock, flags)
+CPU A:  val = readl(my_status);
+CPU A:  ...
+CPU A:  writel(newval, ring_ptr);
+CPU A:  (void)readl(safe_register); /* maybe a config register? */
+CPU A:  spin_unlock_irqrestore(&dev_lock, flags)
+        ...
+CPU B:  spin_lock_irqsave(&dev_lock, flags)
+CPU B:  val = readl(my_status);
+CPU B:  ...
+CPU B:  writel(newval2, ring_ptr);
+CPU B:  (void)readl(safe_register); /* maybe a config register? */
+CPU B:  spin_unlock_irqrestore(&dev_lock, flags)
+
+Here, the reads from safe_register will cause the I/O chipset to flush any
+pending writes before actually posting the read to the chipset, preventing
+possible data corruption.
diff -Nru a/Documentation/isdn/README.hysdn b/Documentation/isdn/README.hysdn
--- a/Documentation/isdn/README.hysdn	Sat Apr 19 19:51:50 2003
+++ b/Documentation/isdn/README.hysdn	Sat Apr 19 19:51:50 2003
@@ -131,7 +131,7 @@
    1006 Second boot stage failure
    1007 Timeout waiting for card ready during boot
    1008 Operation only allowed in booted state
-   1009 Config line to long 
+   1009 Config line too long 
    1010 Invalid channel number 
    1011 Timeout sending config data
 
diff -Nru a/Documentation/scsi/st.txt b/Documentation/scsi/st.txt
--- a/Documentation/scsi/st.txt	Sat Apr 19 19:51:28 2003
+++ b/Documentation/scsi/st.txt	Sat Apr 19 19:51:28 2003
@@ -1,8 +1,8 @@
 This file contains brief information about the SCSI tape driver.
 The driver is currently maintained by Kai Mäkisara (email
-Kai.Makisara@metla.fi)
+Kai.Makisara@kolumbus.fi)
 
-Last modified: Sat Dec 14 14:35:30 2002 by makisara
+Last modified: Sat Apr 12 20:26:37 2003 by makisara
 
 
 BASICS
@@ -132,7 +132,7 @@
 Asynchronous writing. Writing the buffer contents to the tape is
 started and the write call returns immediately. The status is checked
 at the next tape operation. Asynchronous writes are not done with
-direct i/o.
+direct i/o and not in fixed block mode.
 
 Buffered writes and asynchronous writes may in some rare cases cause
 problems in multivolume operations if there is not enough space on the
@@ -143,11 +143,6 @@
 this read command. Should be disabled for those drives that don't like
 a filemark to truncate a read request or that don't like backspacing.
 
-The threshold for triggering asynchronous write in fixed block mode
-is defined by ST_WRITE_THRESHOLD. This may be optimized for each
-use pattern. The default triggers asynchronous write after three
-default sized writes (10 kB) from tar.
-
 Scatter/gather buffers (buffers that consist of chunks non-contiguous
 in the physical memory) are used if contiguous buffers can't be
 allocated. To support all SCSI adapters (including those not
@@ -206,11 +201,17 @@
 
 If the driver is compiled into the kernel, the same parameters can be
 also set using, e.g., the LILO command line. The preferred syntax is
-to use the same keywords as when loading the driver as module. If
-several parameters are set, the keyword-value pairs are separated with
-a comma (no spaces allowed). A colon can be used instead of the equal
-mark. The definition is prepended by the string st=. Here is an
-example:
+is to use the same keyword used when loading as module but prepended
+with 'st.'. For instance, to set the maximum number of scatter/gather
+segments, the parameter 'st.max_sg_segs=xx' should be used (xx is the
+number of scatter/gather segments).
+
+For compatibility, the old syntax from early 2.5 and 2.4 kernel
+versions is supported. The same keywords can be used as when loading
+the driver as module. If several parameters are set, the keyword-value
+pairs are separated with a comma (no spaces allowed). A colon can be
+used instead of the equal mark. The definition is prepended by the
+string st=. Here is an example:
 
 	st=buffer_kbs:64,write_threhold_kbs:60
 
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	Sat Apr 19 19:51:30 2003
+++ b/Documentation/sound/alsa/DocBook/writing-an-alsa-driver.tmpl	Sat Apr 19 19:51:30 2003
@@ -18,8 +18,8 @@
       </affiliation>
      </author>
 
-     <date>Dec. 27, 2002</date>
-     <edition>0.2 (reborn at Christmas)</edition>
+     <date>Mar. 26, 2003</date>
+     <edition>0.3</edition>
 
     <abstract>
       <para>
@@ -30,7 +30,7 @@
 
     <legalnotice>
     <para>
-    Copyright (c) 2002  Takashi Iwai <email>tiwai@suse.de</email>
+    Copyright (c) 2002, 2003  Takashi Iwai <email>tiwai@suse.de</email>
     </para>
 
     <para>
@@ -1425,11 +1425,11 @@
     <section id="pci-resource-resource-allocation">
       <title>Resource Allocation</title>
       <para>
-        The allocation of ports and irqs are done via standard kernel
+        The allocation of I/O ports and irqs are done via standard kernel
       functions. Unlike ALSA ver.0.5.x., there are no helpers for
       that. And these resources must be released in the destructor
-      function (see below). Also, on ALSA 0.9.x, you don't need
-      allocate (pseudo-)DMA for PCI like 0.5.x. 
+      function (see below). Also, on ALSA 0.9.x, you don't need to
+      allocate (pseudo-)DMA for PCI like ALSA 0.5.x. 
       </para>
 
       <para>
@@ -1461,7 +1461,7 @@
       since irq 0 is valid. The port address and its resource pointer
       can be initialized as null by
       <function>snd_magic_kcalloc()</function> automatically, so you
-      don't have to take care of it. 
+      don't have to take care of resetting them. 
       </para>
 
       <para>
@@ -2227,79 +2227,157 @@
       </para>
     </section>
 
-    <section id="pcm-interface-operators">
-      <title>Operators</title>
-      <para>
-        OK, now let me explain the detail of each pcm callback
-      (<parameter>ops</parameter>). In general, every callback must
-      return 0 if successful, or a negative number with the error
-      number such as <constant>-EINVAL</constant> at any
-      error. 
-      </para>
-
-      <para>
-        The callback function takes at least the argument with
-        <type>snd_pcm_substream_t</type> pointer. For retrieving the
-        chip record from the given substream instance, you can use the
-        following macro. 
-
-        <informalexample>
-          <programlisting>
-<![CDATA[
-  #define chip_t mychip_t
-
-  int xxx() {
-          mychip_t *chip = snd_pcm_substream_chip(substream);
-          ....
-  }
-]]>
-          </programlisting>
-        </informalexample>
-      </para>
-
-      <para>
-        It's expanded with a magic-cast, so the cast-error is
-      automatically checked. You should define <type>chip_t</type> at
-      the beginning of the code, since this will be referred in many
-      places of pcm and control interfaces. 
-      </para>
+    <section id="pcm-interface-runtime">
+      <title>Runtime Pointer - The Chest of PCM Information</title>
+	<para>
+	  When the PCM substream is opened, a PCM runtime instance is
+	allocated and assigned to the substream. This pointer is
+	accessible via <constant>substream-&gt;runtime</constant>.
+	This runtime pointer holds the various information; it holds
+	the copy of hw_params and sw_params configurations, the buffer
+	pointers, mmap records, spinlocks, etc.  Almost everyhing you
+	need for controlling the PCM can be found there.
+	</para>
 
-      <section id="pcm-interface-operators-open-callback">
-        <title>open callback</title>
-        <para>
+	<para>
+	The definition of runtime instance is found in
+	<filename>&lt;sound/pcm.h&gt;</filename>.  Here is the
+	copy from the file.
           <informalexample>
             <programlisting>
 <![CDATA[
-  static int snd_xxx_open(snd_pcm_substream_t *subs);
+struct _snd_pcm_runtime {
+	/* -- Status -- */
+	snd_pcm_substream_t *trigger_master;
+	snd_timestamp_t trigger_tstamp;	/* trigger timestamp */
+	int overrange;
+	snd_pcm_uframes_t avail_max;
+	snd_pcm_uframes_t hw_ptr_base;	/* Position at buffer restart */
+	snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time*/
+
+	/* -- HW params -- */
+	snd_pcm_access_t access;	/* access mode */
+	snd_pcm_format_t format;	/* SNDRV_PCM_FORMAT_* */
+	snd_pcm_subformat_t subformat;	/* subformat */
+	unsigned int rate;		/* rate in Hz */
+	unsigned int channels;		/* channels */
+	snd_pcm_uframes_t period_size;	/* period size */
+	unsigned int periods;		/* periods */
+	snd_pcm_uframes_t buffer_size;	/* buffer size */
+	unsigned int tick_time;		/* tick time */
+	snd_pcm_uframes_t min_align;	/* Min alignment for the format */
+	size_t byte_align;
+	unsigned int frame_bits;
+	unsigned int sample_bits;
+	unsigned int info;
+	unsigned int rate_num;
+	unsigned int rate_den;
+
+	/* -- SW params -- */
+	int tstamp_timespec;		/* use timeval (0) or timespec (1) */
+	snd_pcm_tstamp_t tstamp_mode;	/* mmap timestamp is updated */
+  	unsigned int period_step;
+	unsigned int sleep_min;		/* min ticks to sleep */
+	snd_pcm_uframes_t xfer_align;	/* xfer size need to be a multiple */
+	snd_pcm_uframes_t start_threshold;
+	snd_pcm_uframes_t stop_threshold;
+	snd_pcm_uframes_t silence_threshold; /* Silence filling happens when
+						noise is nearest than this */
+	snd_pcm_uframes_t silence_size;	/* Silence filling size */
+	snd_pcm_uframes_t boundary;	/* pointers wrap point */
+
+	snd_pcm_uframes_t silenced_start;
+	snd_pcm_uframes_t silenced_size;
+
+	snd_pcm_sync_id_t sync;		/* hardware synchronization ID */
+
+	/* -- mmap -- */
+	volatile snd_pcm_mmap_status_t *status;
+	volatile snd_pcm_mmap_control_t *control;
+	atomic_t mmap_count;
+
+	/* -- locking / scheduling -- */
+	spinlock_t lock;
+	wait_queue_head_t sleep;
+	struct timer_list tick_timer;
+	struct fasync_struct *fasync;
+
+	/* -- private section -- */
+	void *private_data;
+	void (*private_free)(snd_pcm_runtime_t *runtime);
+
+	/* -- hardware description -- */
+	snd_pcm_hardware_t hw;
+	snd_pcm_hw_constraints_t hw_constraints;
+
+	/* -- interrupt callbacks -- */
+	void (*transfer_ack_begin)(snd_pcm_substream_t *substream);
+	void (*transfer_ack_end)(snd_pcm_substream_t *substream);
+
+	/* -- timer -- */
+	unsigned int timer_resolution;	/* timer resolution */
+
+	/* -- DMA -- */           
+	unsigned char *dma_area;	/* DMA area */
+	dma_addr_t dma_addr;		/* physical bus address (not accessible from main CPU) */
+	size_t dma_bytes;		/* size of DMA area */
+	void *dma_private;		/* private DMA data for the memory allocator */
+
+#if defined(CONFIG_SND_PCM_OSS) || defined(CONFIG_SND_PCM_OSS_MODULE)
+	/* -- OSS things -- */
+	snd_pcm_oss_runtime_t oss;
+#endif
+};
 ]]>
             </programlisting>
           </informalexample>
+	</para>
 
-          This is called when a pcm substream is opened.
-        </para>
+	<para>
+	  For the operators (callbacks) of each sound driver, most of
+	these records are supposed to be read-only.  Only the PCM
+	middle-layer changes / updates these info.  The excpetions are
+	the hardware description (hw), interrupt callbacks
+	(transfer_ack_xxx), DMA buffer information, and the private
+	data.  Besides, if you use the standard buffer allocation
+	method via <function>snd_pcm_lib_malloc_pages()</function>,
+	you don't need to set the DMA buffer information by yourself.
+	</para>
 
-        <para>
-          At least, here you have to initialize the runtime hardware
-          record. Typically, this is done by like this: 
+	<para>
+	In the sections below, important records are explained.
+	</para>
 
+	<section id="pcm-interface-runtime-hw">
+	<title>Hardware Description</title>
+	<para>
+	  The hardware descriptor (<type>snd_pcm_hardware_t</type>)
+	contains the definitions of the fundamental hardware
+	configuration.  Above all, you'll need to define this in
+	<link linkend="pcm-interface-operators-open-callback"><citetitle>
+	the open callback</citetitle></link>.
+	Note that the runtime instance holds the copy of the
+	descriptor, not the pointer to the existing descriptor.  That
+	is, in the open callback, you can modify the copied descriptor
+	(<constant>runtime-&gt;hw</constant>) as you need.  For example, if the maximum
+	number of channels is 1 only on some chip models, you can
+	still use the same hardware descriptor and change the
+	channels_max later:
           <informalexample>
             <programlisting>
 <![CDATA[
-  static int snd_xxx_open(snd_pcm_substream_t *substream)
-  {
-          mychip_t *chip = snd_pcm_substream_chip(substream);
           snd_pcm_runtime_t *runtime = substream->runtime;
-
-          runtime->hw = snd_mychip_playback_hw;
-          return 0;
-  }
+          ...
+          runtime->hw = snd_mychip_playback_hw; // common definition
+          if (chip->model == VERY_OLD_ONE)
+                  runtime->hw.channels_max = 1;
 ]]>
             </programlisting>
           </informalexample>
+	</para>
 
-          where <parameter>snd_mychip_playback_hw</parameter> is the
-          pre-defined hardware record.
-
+	<para>
+	  Typically, you'll have a hardware descriptor like below:
           <informalexample>
             <programlisting>
 <![CDATA[
@@ -2326,11 +2404,8 @@
         </para>
 
         <para>
-          The similar struct exists on ALSA 0.5.x driver, so you can
-        guess the values if you already wrote a driver. 
-        </para>
-
-        <para>
+	<itemizedlist>
+	<listitem><para>
           The <structfield>info</structfield> field contains the type and
         capabilities of this pcm. The bit flags are defined in
         <filename>&lt;sound/asound.h&gt;</filename> as
@@ -2366,6 +2441,17 @@
         must handle the corresponding commands. 
         </para>
 
+	<para>
+	  When the PCM substreams can be synchronized (typically,
+	synchorinized start/stop of a playback and a capture streams),
+	you can give <constant>SNDRV_PCM_INFO_SYNC_START</constant>,
+	too.  In this case, you'll need to check the linked-list of
+	PCM substreams in the trigger callback.  This will be
+	described in the later section.
+	</para>
+	</listitem>
+
+	<listitem>
         <para>
           <structfield>formats</structfield> field contains the bit-flags
         of supported formats (<constant>SNDRV_PCM_FMTBIT_XXX</constant>).
@@ -2373,38 +2459,181 @@
         bits.  In the example above, the signed 16bit little-endian
         format is specified.
         </para>
+	</listitem>
 
+	<listitem>
         <para>
         <structfield>rates</structfield> field contains the bit-flags of
         supported rates (<constant>SNDRV_PCM_RATE_XXX</constant>).
         When the chip supports continuous rates, pass
         <constant>CONTINUOUS</constant> bit additionally.
-        The pre-defined rate bits are only for typical rates. If your
-        chip supports unconventional rates, you need to add
-        <constant>KNOT</constant> bit and set up the
+        The pre-defined rate bits are provided only for typical
+	rates. If your chip supports unconventional rates, you need to add
+        <constant>KNOT</constant> bit and set up the hardware
         constraint manually (explained later).
         </para>
+	</listitem>
 
-        <para>
-        There have been many changes of terminology between
-        ALSA 0.5.x and 0.9.x.
-        On the ALSA 0.9.x world, <quote>period</quote> means what is
-        known as <quote>fragment</quote> in the OSS.  It's the least
-        size of (a part of) the buffer to generate an interrupt.
+	<listitem>
+	<para>
+	<structfield>rate_min</structfield> and
+	<structfield>rate_max</structfield> define the minimal and
+	maximal sample rate.  This should correspond somehow to
+	<structfield>rates</structfield> bits.
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	<structfield>channel_min</structfield> and
+	<structfield>channel_max</structfield> 
+	define, as you might already expected, the minimal and maximal
+	number of channels.
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	<structfield>buffer_bytes_max</structfield> defines the
+	maximal buffer size in bytes.  There is no
+	<structfield>buffer_bytes_min</structfield> field, since
+	it can be calculated from the minimal period size and the
+	minimal number of periods.
+	Meanwhile, <structfield>period_bytes_min</structfield> and
+	define the minimal and maximal size of the period in bytes.
+	<structfield>periods_max</structfield> and
+	<structfield>periods_min</structfield> define the maximal and
+	minimal number of periods in the buffer.
         </para>
 
-        <para>
-        Now, taking the new terminology into account, the other fields
-        are self-explanatory (I hope). Please note that here, both 
-        min/max buffer and period sizes are specified in bytes. 
+	<para>
+	The <quote>period</quote> is a term, that corresponds to
+	fragment in the OSS world.  The period defines the size at
+	which the PCM interrupt is generated. This size strongly
+	depends on the hardware. 
+	Generally, the smaller period size will give you more
+	interrupts, that is, more controls. 
+	In the case of capture, this size defines the input latency.
+	On the other hand, the whole buffer size defines the
+	output latency for the playback direction.
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	There is also a field <structfield>fifo_size</structfield>.
+	This specifies the size of the hardware FIFO, but it's not
+	used currently in the driver nor in the alsa-lib.  So, you
+	can ignore this field.
+	</para>
+	</listitem>
+	</itemizedlist>
+	</para>
+	</section>
+
+	<section id="pcm-interface-runtime-config">
+	<title>PCM Configurations</title>
+	<para>
+	Ok, let's go back again to the PCM runtime records.
+	The most frequently referred records in the runtime instance are
+	the PCM configurations.
+	The PCM configurations are stored on runtime instance
+	after the application sends <type>hw_params</type> data via
+	alsa-lib.  There are many fields copied from hw_params and
+	sw_params structs.  For example,
+	<structfield>format</structfield> holds the format type
+	chosen by the application.  This field contains the enum value
+	<constant>SNDRV_PCM_FORMAT_XXX</constant>.
+	</para>
+
+	<para>
+	One thing to be noted is that the configured buffer and period
+	sizes are stored in <quote>frames</quote> in the runtime
+        In the ALSA world, 1 frame = channels * samples-size.
+	For conversion between frames and bytes, you can use the
+	helper functions, <function>frames_to_bytes()</function> and
+          <function>bytes_to_frames()</function>. 
+          <informalexample>
+            <programlisting>
+<![CDATA[
+  period_bytes = frames_to_bytes(runtime, runtime->period_size);
+]]>
+            </programlisting>
+          </informalexample>
         </para>
 
-        <para>
-          Some drivers allocate the private instance for each pcm
-          substream. It can be stored in
-          <constant>substream->runtime-&gt;private_data</constant>.
-          Since it's a void pointer, you 
-          should use magic-kmalloc and magic-cast for such an object. 
+	<para>
+	Also, many software parameters (sw_params) are
+	stored in frames, too.  Please check the type of the field.
+	<type>snd_pcm_uframes_t</type> is for the frames as unsigned
+	integer while <type>snd_pcm_sframes_t</type> is for the frames
+	as signed integer.
+	</para>
+	</section>
+
+	<section id="pcm-interface-runtime-dma">
+	<title>DMA Buffer Information</title>
+	<para>
+	The DMA buffer is defined by the following four fields,
+	<structfield>dma_area</structfield>,
+	<structfield>dma_addr</structfield>,
+	<structfield>dma_bytes</structfield> and
+	<structfield>dma_private</structfield>.
+	The <structfield>dma_area</structfield> holds the buffer
+	pointer (the logical address).  You can call
+	<function>memcpy</function> from/to 
+	this pointer.  Meanwhile, <structfield>dma_addr</structfield>
+	holds the physical address of the buffer.  This field is
+	specified only when the buffer is a linear buffer.
+	<structfield>dma_bytes</structfield> holds the size of buffer
+	in bytes.  <structfield>dma_private</structfield> is used for
+	the ALSA DMA allocator.
+	</para>
+
+	<para>
+	If you use a standard ALSA function,
+	<function>snd_pcm_lib_malloc_pages()</function>, for
+	allocating the buffer, these fields are set by the ALSA middle
+	layer, and you should <emphasis>not</emphasis> change them by
+	yourself.  You can read them but not write them.
+	On the other hand, if you want to allocate the buffer by
+	yourself, you'll need to manage it in hw_params callback.
+	At least, <structfield>dma_bytes</structfield> is mandatory.
+	<structfield>dma_area</structfield> is necessary when the
+	buffer is mmapped.  If your driver doesn't support mmap, this
+	field is not necessary.  <structfield>dma_addr</structfield>
+	is also not mandatory.  You can use
+	<structfield>dma_private</structfield> as you like, too.
+	</para>
+	</section>
+
+	<section id="pcm-interface-runtime-status">
+	<title>Running Status</title>
+	<para>
+	The running status can be referred via <constant>runtime-&gt;status</constant>.
+	This is the pointer to <type>snd_pcm_mmap_status_t</type>
+	record.  For example, you can get the current DMA hardware
+	pointer via <constant>runtime-&gt;status-&gt;hw_ptr</constant>.
+	</para>
+
+	<para>
+	The DMA application pointer can be referred via
+	<constant>runtime-&gt;control</constant>, which points
+	<type>snd_pcm_mmap_control_t</type> record.
+	However, accessing directly to this value is not recommended.
+	</para>
+	</section>
+
+	<section id="pcm-interface-runtime-private">
+	<title>Private Data</title> 
+	<para>
+	You can allocate a record for the substream and store it in
+	<constant>runtime-&gt;private_data</constant>.  Usually, this
+	done in
+	<link linkend="pcm-interface-operators-open-callback"><citetitle>
+	the open callback</citetitle></link>.
+        Since it's a void pointer, you should use magic-kmalloc and
+	magic-cast for such an object. 
 
           <informalexample>
             <programlisting>
@@ -2423,8 +2652,110 @@
         </para>
 
         <para>
-          The allocated object must be released in the close callback below.
+          The allocated object must be released in
+	<link linkend="pcm-interface-operators-open-callback"><citetitle>
+	the close callback</citetitle></link>.
         </para>
+	</section>
+
+	<section id="pcm-interface-runtime-intr">
+	<title>Interrupt Callbacks</title>
+	<para>
+	The field <structfield>transfer_ack_begin</structfield> and
+	<structfield>transfer_ack_end</structfield> are called at
+	the beginning and the end of
+	<function>snd_pcm_period_elapsed()</function>, respectively. 
+	</para>
+	</section>
+
+    </section>
+
+    <section id="pcm-interface-operators">
+      <title>Operators</title>
+      <para>
+        OK, now let me explain the detail of each pcm callback
+      (<parameter>ops</parameter>). In general, every callback must
+      return 0 if successful, or a negative number with the error
+      number such as <constant>-EINVAL</constant> at any
+      error. 
+      </para>
+
+      <para>
+        The callback function takes at least the argument with
+        <type>snd_pcm_substream_t</type> pointer. For retrieving the
+        chip record from the given substream instance, you can use the
+        following macro. 
+
+        <informalexample>
+          <programlisting>
+<![CDATA[
+  #define chip_t mychip_t
+
+  int xxx() {
+          mychip_t *chip = snd_pcm_substream_chip(substream);
+          ....
+  }
+]]>
+          </programlisting>
+        </informalexample>
+      </para>
+
+      <para>
+        It's expanded with a magic-cast, so the cast-error is
+      automatically checked. You should define <type>chip_t</type> at
+      the beginning of the code, since this will be referred in many
+      places of pcm and control interfaces. 
+      </para>
+
+      <section id="pcm-interface-operators-open-callback">
+        <title>open callback</title>
+        <para>
+          <informalexample>
+            <programlisting>
+<![CDATA[
+  static int snd_xxx_open(snd_pcm_substream_t *subs);
+]]>
+            </programlisting>
+          </informalexample>
+
+          This is called when a pcm substream is opened.
+        </para>
+
+        <para>
+          At least, here you have to initialize the runtime-&gt;hw
+          record. Typically, this is done by like this: 
+
+          <informalexample>
+            <programlisting>
+<![CDATA[
+  static int snd_xxx_open(snd_pcm_substream_t *substream)
+  {
+          mychip_t *chip = snd_pcm_substream_chip(substream);
+          snd_pcm_runtime_t *runtime = substream->runtime;
+
+          runtime->hw = snd_mychip_playback_hw;
+          return 0;
+  }
+]]>
+            </programlisting>
+          </informalexample>
+
+          where <parameter>snd_mychip_playback_hw</parameter> is the
+          pre-defined hardware description.
+	</para>
+
+	<para>
+	You can allocate a private data in this callback, as described
+	in <link linkend="pcm-interface-runtime-private"><citetitle>
+	Private Data</citetitle></link> section.
+	</para>
+
+	<para>
+	If the hardware configuration needs more constraints, set the
+	hardware constraints here, too.
+	See <link linkend="pcm-interface-constraints"><citetitle>
+	Constraints</citetitle></link> for more details.
+	</para>
       </section>
 
       <section id="pcm-interface-operators-close-callback">
@@ -2622,23 +2953,6 @@
         </para>
 
         <para>
-          Note that the period and the buffer sizes are stored in
-          <quote>frames</quote>. In the ALSA world, 1 frame = channels
-          * samples-size. For conversion between frames and bytes, you
-          can use the helper functions,
-          <function>frames_to_bytes()</function> and
-          <function>bytes_to_frames()</function>. 
-
-          <informalexample>
-            <programlisting>
-<![CDATA[
-  period_bytes = frames_to_bytes(runtime, runtime->period_size);
-]]>
-            </programlisting>
-          </informalexample>
-        </para>
-
-        <para>
           Be careful that this callback will be called many times at
         each set up, too. 
         </para>
@@ -5115,6 +5429,217 @@
     </para>
   </chapter>
 
+
+<!-- ****************************************************** -->
+<!-- How To Put Your Driver  -->
+<!-- ****************************************************** -->
+  <chapter id="how-to-put-your-driver">
+    <title>How To Put Your Driver Into ALSA Tree</title>
+	<section>
+	<title>General</title>
+	<para>
+	So far, you've learned how to write the driver codes.
+	And you might have a question now: how to put my own
+	driver into the ALSA driver tree?
+	Here (finally :) the standard procedure is described briefly.
+	</para>
+
+	<para>
+	Suppose that you'll create a new PCI driver for the card
+	<quote>xyz</quote>.  The card module name would be
+	snd-xyz.  The new driver is usually put into alsa-driver
+	tree.  Then the driver is evaluated, audited and tested
+	by developers and users.  After a certain time, the driver
+	will go to alsa-kernel tree and eventually integrated into
+	Linux 2.5 tree.
+	</para>
+
+	<para>
+	In the following sections, the driver code is supposed
+	to be put into alsa-driver tree.  The two cases are assumed:
+	a driver consisting of a single source file and one consisting
+	of several source files.
+	</para>
+	</section>
+
+	<section>
+	<title>Driver with A Single Source File</title>
+	<para>
+	<orderedlist>
+	<listitem>
+	<para>
+	Modify alsa-driver/pci/Makefile
+	</para>
+
+	<para>
+	Suppose you have a file xyz.c.  Add the following
+	two lines
+      <informalexample>
+        <programlisting>
+<![CDATA[
+  snd-xyz-objs := xyz.o
+  extra-obj-$(CONFIG_SND_XYZ) += snd-xyz.o
+]]>
+        </programlisting>
+      </informalexample>
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	Modify alsa-driver/acore/Makefile
+	</para>
+
+	<para>
+	Here define the dependent modules.
+      <informalexample>
+        <programlisting>
+<![CDATA[
+  obj-$(CONFIG_SND_XYZ) += snd.o ...
+]]>
+        </programlisting>
+      </informalexample>
+
+	If the driver supports PCM, snd-pcm.o,
+	snd-timer.o and snd-page-alloc.o
+	will be needed.
+	</para>
+	<para>
+	For rawmidi, snd-rawmidi.o is needed in addition.
+	The MIDI stuff is also related to the sequencer.
+	You'll need to modify alsa-driver/acore/seq/Makefile.
+	</para>
+
+	<para>
+	For OPL3, snd-hwdep.o is needed, too.
+	It's involved with the sequencer, and as well as rawmidi,
+	you'll need to modify alsa-driver/acore/seq/Makefile
+	and acore/seq/instr/Makefile in addition.
+	Also, a new entry is necessary in
+	alsa-driver/drivers/opl3/Makefile.
+	</para>
+
+	</listitem>
+
+	<listitem>
+	<para>
+	Modify alsa-driver/utils/Modules.dep
+	</para>
+
+	<para>
+	Add the module definition for configure, here.
+	The beginning of the line must be a vertical bar, following
+	the card module name (snd-xyz) and the list of its all 
+	dependent modules.
+
+      <informalexample>
+        <programlisting>
+<![CDATA[
+  %dir linux/sound/pci
+  |snd-azt3328 snd-pcm snd-mpu401-uart snd-opl3-lib snd-opl3-synth
+  |snd-xyz snd-pcm ...
+]]>
+        </programlisting>
+      </informalexample>
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	Run cvscompile script to re-generate the configure script and
+	build the whole stuff again.
+	</para>
+	</listitem>
+	</orderedlist>
+	</para>
+	</section>
+
+	<section>
+	<title>Drivers with Several Source Files</title>
+	<para>
+	Suppose that the driver snd-xyz have several source files.
+	They are located in the new subdirectory,
+	pci/xyz.
+
+	<orderedlist>
+	<listitem>
+	<para>
+	Add a new directory (xyz) to extra-subdir-y list in alsa-driver/pci/Makefile
+
+      <informalexample>
+        <programlisting>
+<![CDATA[
+  extra-subdir-y := pdplus vx222 xyz
+]]>
+        </programlisting>
+      </informalexample>
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	Under the directory xyz, create a Makefile
+
+      <example>
+	<title>Sample Makefile for a driver xyz</title>
+        <programlisting>
+<![CDATA[
+  TOPDIR = ../..
+
+  include $(TOPDIR)/toplevel.config
+  include $(TOPDIR)/Makefile.conf
+
+  TOPDIR = $(MAINSRCDIR)
+
+  snd-xyz-objs := xyz.o abc.o def.o
+
+  obj-$(CONFIG_SND_XYZ) += snd-xyz.o
+
+  include $(TOPDIR)/Rules.make
+]]>
+        </programlisting>
+      </example>
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	Modify alsa-driver/acore/Makefile
+	</para>
+
+	<para>
+	This procedure is as same as in the last section.
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	Modify alsa-driver/utils/Modules.dep
+	</para>
+
+	<para>
+      <informalexample>
+        <programlisting>
+<![CDATA[
+	%dir linux/sound/pci/xyz
+	|snd-xyz snd-pcm ...
+]]>
+        </programlisting>
+      </informalexample>
+	</para>
+	</listitem>
+
+	<listitem>
+	<para>
+	Run cvscompile script to re-generate the configure script and
+	build the whole stuff again.
+	</para>
+	</listitem>
+	</orderedlist>
+	</para>
+	</section>
+
+  </chapter>
 
 <!-- ****************************************************** -->
 <!-- Useful Functions  -->
diff -Nru a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
--- a/Documentation/sysctl/kernel.txt	Sat Apr 19 19:51:48 2003
+++ b/Documentation/sysctl/kernel.txt	Sat Apr 19 19:51:48 2003
@@ -204,6 +204,18 @@
 
 ==============================================================
 
+panic_on_oops:
+
+Controls the kernel's behaviour when an oops or BUG is encountered.
+
+0: try to continue operation
+
+1: delay a few seconds (to give klogd time to record the oops output) and
+   then panic.  If the `panic' sysctl is also non-zero then the machine will
+   be rebooted.
+
+==============================================================
+
 pid_max:
 
 PID allocation wrap value.  When the kenrel's next PID value
diff -Nru a/MAINTAINERS b/MAINTAINERS
--- a/MAINTAINERS	Sat Apr 19 19:51:49 2003
+++ b/MAINTAINERS	Sat Apr 19 19:51:49 2003
@@ -931,8 +931,8 @@
 S:	Supported
 
 INTERMEZZO FILE SYSTEM
-P:	Peter J. Braam
-M:	braam@clusterfs.com
+P:	Chen Yang
+M:	intermezzo-devel@lists.sf.net
 W:	http://www.inter-mezzo.org/
 L:	intermezzo-discuss@lists.sourceforge.net
 S:	Maintained
diff -Nru a/Makefile b/Makefile
--- a/Makefile	Sat Apr 19 19:51:49 2003
+++ b/Makefile	Sat Apr 19 19:51:49 2003
@@ -1,6 +1,6 @@
 VERSION = 2
 PATCHLEVEL = 5
-SUBLEVEL = 67
+SUBLEVEL = 68
 EXTRAVERSION =
 
 # *DOCUMENTATION*
@@ -33,7 +33,9 @@
 # then ARCH is assigned, getting whatever value it gets normally, and 
 # SUBARCH is subsequently ignored.
 
-SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
+				  -e s/arm.*/arm/ -e s/sa110/arm/ \
+				  -e s/s390x/s390/ )
 ARCH := $(SUBARCH)
 
 # Remove hyphens since they have special meaning in RPM filenames
@@ -342,17 +344,9 @@
 	echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
 endef
 
-ifdef CONFIG_SMP
-#	Final awk script makes sure per-cpu vars are in per-cpu section, as
-#	old gcc (eg egcs 2.92.11) ignores section attribute if uninitialized.
-
-check_per_cpu =	$(AWK) -f $(srctree)/scripts/per-cpu-check.awk < System.map
-endif
-
 define rule_vmlinux
 	$(rule_vmlinux__)
 	$(NM) $@ | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map
-	$(check_per_cpu)
 endef
 
 LDFLAGS_vmlinux += -T arch/$(ARCH)/vmlinux.lds.s
diff -Nru a/arch/alpha/Kconfig b/arch/alpha/Kconfig
--- a/arch/alpha/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/arch/alpha/Kconfig	Sat Apr 19 19:51:50 2003
@@ -59,6 +59,7 @@
 	  Jensen              DECpc 150, DEC 2000 model 300,
 	  DEC 2000 model 500
 	  LX164               AlphaPC164-LX
+	  Lynx                AS 2100A
 	  Miata               Personal Workstation 433a, 433au, 500a,
 	  500au, 600a, or 600au
 	  Marvel              AlphaServer ES47 / ES80 / GS1280
@@ -169,6 +170,11 @@
 	  A technical overview of this board is available at
 	  <http://www.unix-ag.org/Linux-Alpha/Architectures/LX164.html>.
 
+config ALPHA_LYNX
+	bool "Lynx"
+	help
+	  AlphaServer 2100A-based systems.
+
 config ALPHA_MARVEL
 	bool "Marvel"
 	help
@@ -263,22 +269,6 @@
 	  (MCA) or VESA.  ISA is an older system, now being displaced by PCI;
 	  newer boards don't support it.  If you have ISA, say Y, otherwise N.
 
-config EISA
-	bool
-	default y
-	---help---
-	  The Extended Industry Standard Architecture (EISA) bus was
-	  developed as an open alternative to the IBM MicroChannel bus.
-
-	  The EISA bus provided some of the features of the IBM MicroChannel
-	  bus while maintaining backward compatibility with cards made for
-	  the older ISA bus.  The EISA bus saw limited use between 1988 and
-	  1995 when it was made obsolete by the PCI bus.
-
-	  Say Y here if you are building a kernel for an EISA-based machine.
-
-	  Otherwise, say N.
-
 config SBUS
 	bool
 
@@ -325,8 +315,8 @@
 
 config ALPHA_EV4
 	bool
-	depends on ALPHA_JENSEN || ALPHA_SABLE && !ALPHA_GAMMA || ALPHA_NORITAKE && !ALPHA_PRIMO || ALPHA_MIKASA && !ALPHA_PRIMO || ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P_CH || ALPHA_XL || ALPHA_NONAME || ALPHA_EB66 || ALPHA_EB66P || ALPHA_P2K
-	default y
+	depends on ALPHA_JENSEN || (ALPHA_SABLE && !ALPHA_GAMMA) || ALPHA_LYNX || ALPHA_NORITAKE && !ALPHA_PRIMO || ALPHA_MIKASA && !ALPHA_PRIMO || ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P_CH || ALPHA_XL || ALPHA_NONAME || ALPHA_EB66 || ALPHA_EB66P || ALPHA_P2K
+	default y if !ALPHA_LYNX
 
 config ALPHA_LCA
 	bool
@@ -351,9 +341,12 @@
 	  Runs from standard PC power supply.
 
 config ALPHA_EV5
+	bool "EV5 CPU(s) (model 5/xxx)?" if ALPHA_LYNX
+	default y if ALPHA_RX164 || ALPHA_RAWHIDE || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_RUFFIAN || ALPHA_SABLE && ALPHA_GAMMA || ALPHA_NORITAKE && ALPHA_PRIMO || ALPHA_MIKASA && ALPHA_PRIMO || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR
+
+config ALPHA_EV4
 	bool
-	depends on ALPHA_RX164 || ALPHA_RAWHIDE || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_RUFFIAN || ALPHA_SABLE && ALPHA_GAMMA || ALPHA_NORITAKE && ALPHA_PRIMO || ALPHA_MIKASA && ALPHA_PRIMO || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR
-	default y
+	default y if ALPHA_LYNX && !ALPHA_EV5
 
 config ALPHA_CIA
 	bool
@@ -384,9 +377,14 @@
 	help
 	  Say Y if you have an AS 2000 5/xxx or an AS 2100 5/xxx.
 
+config ALPHA_GAMMA
+	bool
+	depends on ALPHA_LYNX
+	default y
+
 config ALPHA_T2
 	bool
-	depends on ALPHA_SABLE
+	depends on ALPHA_SABLE || ALPHA_LYNX
 	default y
 
 config ALPHA_PYXIS
@@ -431,9 +429,23 @@
 	depends on ALPHA_NAUTILUS
 	default y
 
+config ALPHA_AVANTI
+	bool
+	depends on ALPHA_XL || ALPHA_AVANTI_CH
+	default y
+	help
+	  Avanti AS 200, AS 205, AS 250, AS 255, AS 300, and AS 400-based
+	  Alphas. Info at
+	  <http://www.unix-ag.org/Linux-Alpha/Architectures/Avanti.html>.
+
+config ALPHA_BROKEN_IRQ_MASK
+	bool
+	depends on ALPHA_GENERIC || ALPHA_PC164
+	default y
+
 config ALPHA_SRM
 	bool "Use SRM as bootloader" if ALPHA_CABRIOLET || ALPHA_AVANTI_CH || ALPHA_EB64P || ALPHA_PC164 || ALPHA_TAKARA || ALPHA_EB164 || ALPHA_ALCOR || ALPHA_MIATA || ALPHA_LX164 || ALPHA_SX164 || ALPHA_NAUTILUS || ALPHA_NONAME
-	default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL
+	default y if ALPHA_JENSEN || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_DP264 || ALPHA_RAWHIDE || ALPHA_EIGER || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_SHARK || ALPHA_MARVEL
 	---help---
 	  There are two different types of booting firmware on Alphas: SRM,
 	  which is command line driven, and ARC, which uses menus and arrow
@@ -459,28 +471,26 @@
 	depends on ALPHA_GENERIC || ALPHA_SRM
 	default y
 
-config ALPHA_EISA
+config EISA
 	bool
-	depends on ALPHA_ALCOR || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_NORITAKE || ALPHA_RAWHIDE
+	depends on ALPHA_GENERIC || ALPHA_JENSEN || ALPHA_ALCOR || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_RAWHIDE
 	default y
+	---help---
+	  The Extended Industry Standard Architecture (EISA) bus was
+	  developed as an open alternative to the IBM MicroChannel bus.
 
-config ALPHA_AVANTI
-	bool
-	depends on ALPHA_XL || ALPHA_AVANTI_CH
-	default y
-	help
-	  Avanti AS 200, AS 205, AS 250, AS 255, AS 300, and AS 400-based
-	  Alphas. Info at
-	  <http://www.unix-ag.org/Linux-Alpha/Architectures/Avanti.html>.
+	  The EISA bus provided some of the features of the IBM MicroChannel
+	  bus while maintaining backward compatibility with cards made for
+	  the older ISA bus.  The EISA bus saw limited use between 1988 and
+	  1995 when it was made obsolete by the PCI bus.
 
-config ALPHA_BROKEN_IRQ_MASK
-	bool
-	depends on ALPHA_GENERIC || ALPHA_PC164
-	default y
+	  Say Y here if you are building a kernel for an EISA-based machine.
+
+	  Otherwise, say N.
 
 config SMP
 	bool "Symmetric multi-processing support"
-	depends on ALPHA_SABLE || ALPHA_RAWHIDE || ALPHA_DP264 || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_GENERIC || ALPHA_SHARK || ALPHA_MARVEL
+	depends on ALPHA_SABLE || ALPHA_LYNX || ALPHA_RAWHIDE || ALPHA_DP264 || ALPHA_WILDFIRE || ALPHA_TITAN || ALPHA_GENERIC || ALPHA_SHARK || ALPHA_MARVEL
 	---help---
 	  This enables support for systems with more than one CPU. If you have
 	  a system with only one CPU, like most personal computers, say N. If
diff -Nru a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile
--- a/arch/alpha/kernel/Makefile	Sat Apr 19 19:51:47 2003
+++ b/arch/alpha/kernel/Makefile	Sat Apr 19 19:51:47 2003
@@ -83,6 +83,7 @@
 obj-$(CONFIG_ALPHA_RUFFIAN)	+= sys_ruffian.o irq_pyxis.o irq_i8259.o
 obj-$(CONFIG_ALPHA_RX164)	+= sys_rx164.o irq_i8259.o
 obj-$(CONFIG_ALPHA_SABLE)	+= sys_sable.o
+obj-$(CONFIG_ALPHA_LYNX)	+= sys_sable.o
 obj-$(CONFIG_ALPHA_BOOK1)	+= sys_sio.o irq_i8259.o irq_srm.o ns87312.o
 obj-$(CONFIG_ALPHA_AVANTI)	+= sys_sio.o irq_i8259.o irq_srm.o ns87312.o
 obj-$(CONFIG_ALPHA_NONAME)	+= sys_sio.o irq_i8259.o irq_srm.o ns87312.o
diff -Nru a/arch/alpha/kernel/core_cia.c b/arch/alpha/kernel/core_cia.c
--- a/arch/alpha/kernel/core_cia.c	Sat Apr 19 19:51:48 2003
+++ b/arch/alpha/kernel/core_cia.c	Sat Apr 19 19:51:48 2003
@@ -610,7 +610,7 @@
 		*(vip)CIA_IOC_CIA_CNFG = temp;
 	}
 
-	/* Syncronize with all previous changes.  */
+	/* Synchronize with all previous changes.  */
 	mb();
 	*(vip)CIA_IOC_CIA_REV;
 
diff -Nru a/arch/alpha/kernel/core_t2.c b/arch/alpha/kernel/core_t2.c
--- a/arch/alpha/kernel/core_t2.c	Sat Apr 19 19:51:28 2003
+++ b/arch/alpha/kernel/core_t2.c	Sat Apr 19 19:51:28 2003
@@ -17,6 +17,7 @@
 
 #include <asm/ptrace.h>
 #include <asm/system.h>
+#include <asm/delay.h>
 
 #define __EXTERN_INLINE
 #include <asm/io.h>
@@ -26,6 +27,12 @@
 #include "proto.h"
 #include "pci_impl.h"
 
+/* For dumping initial DMA window settings. */
+#define DEBUG_PRINT_INITIAL_SETTINGS 0
+
+/* For dumping final DMA window settings. */
+#define DEBUG_PRINT_FINAL_SETTINGS 0
+
 /*
  * By default, we direct-map starting at 2GB, in order to allow the
  * maximum size direct-map window (2GB) to match the maximum amount of
@@ -34,11 +41,23 @@
  * ISA DMA, since the maximum ISA DMA address is 2GB-1.
  *
  * For now, this seems a reasonable trade-off: even though most SABLEs
- * have far less than even 1GB of memory, floppy usage/performance will
- * not really be affected by forcing it to go via scatter/gather...
+ * have less than 1GB of memory, floppy usage/performance will not
+ * really be affected by forcing it to go via scatter/gather...
  */
 #define T2_DIRECTMAP_2G 1
 
+#if T2_DIRECTMAP_2G
+# define T2_DIRECTMAP_START	0x80000000UL
+# define T2_DIRECTMAP_LENGTH	0x80000000UL
+#else
+# define T2_DIRECTMAP_START	0x40000000UL
+# define T2_DIRECTMAP_LENGTH	0x40000000UL
+#endif
+
+/* The ISA scatter/gather window settings. */
+#define T2_ISA_SG_START		0x00800000UL
+#define T2_ISA_SG_LENGTH	0x00800000UL
+
 /*
  * NOTE: Herein lie back-to-back mb instructions.  They are magic. 
  * One plausible explanation is that the i/o controller does not properly
@@ -57,6 +76,24 @@
 # define DBG(args)
 #endif
 
+static volatile unsigned int t2_mcheck_any_expected;
+static volatile unsigned int t2_mcheck_last_taken;
+
+/* Place to save the DMA Window registers as set up by SRM
+   for restoration during shutdown. */
+static struct
+{
+	struct {
+		unsigned long wbase;
+		unsigned long wmask;
+		unsigned long tbase;
+	} window[2];
+	unsigned long hae_1;
+  	unsigned long hae_2;
+	unsigned long hae_3;
+	unsigned long hae_4;
+	unsigned long hbase;
+} t2_saved_config __attribute((common));
 
 /*
  * Given a bus, device, and function number, compute resulting
@@ -134,42 +171,34 @@
 	return 0;
 }
 
+/*
+ * NOTE: both conf_read() and conf_write() may set HAE_3 when needing
+ *       to do type1 access. This is protected by the use of spinlock IRQ
+ *       primitives in the wrapper functions pci_{read,write}_config_*()
+ *       defined in drivers/pci/pci.c.
+ */
 static unsigned int
 conf_read(unsigned long addr, unsigned char type1)
 {
-	unsigned long flags;
-	unsigned int value, cpu;
+	unsigned int value, cpu, taken;
 	unsigned long t2_cfg = 0;
 
 	cpu = smp_processor_id();
 
-	local_irq_save(flags);	/* avoid getting hit by machine check */
-
 	DBG(("conf_read(addr=0x%lx, type1=%d)\n", addr, type1));
 
-#if 0
-	{
-	  unsigned long stat0;
-	  /* Reset status register to avoid losing errors.  */
-	  stat0 = *(vulp)T2_IOCSR;
-	  *(vulp)T2_IOCSR = stat0;
-	  mb();
-	  DBG(("conf_read: T2 IOCSR was 0x%x\n", stat0));
-	}
-#endif
-
 	/* If Type1 access, must set T2 CFG.  */
 	if (type1) {
 		t2_cfg = *(vulp)T2_HAE_3 & ~0xc0000000UL;
 		*(vulp)T2_HAE_3 = 0x40000000UL | t2_cfg;
 		mb();
-		DBG(("conf_read: TYPE1 access\n"));
 	}
 	mb();
 	draina();
 
 	mcheck_expected(cpu) = 1;
 	mcheck_taken(cpu) = 0;
+	t2_mcheck_any_expected |= (1 << cpu);
 	mb();
 
 	/* Access configuration space. */
@@ -177,12 +206,20 @@
 	mb();
 	mb();  /* magic */
 
-	if (mcheck_taken(cpu)) {
+	/* Wait for possible mcheck. Also, this lets other CPUs clear
+	   their mchecks as well, as they can reliably tell when
+	   another CPU is in the midst of handling a real mcheck via
+	   the "taken" function. */
+	udelay(100);
+
+	if ((taken = mcheck_taken(cpu))) {
 		mcheck_taken(cpu) = 0;
+		t2_mcheck_last_taken |= (1 << cpu);
 		value = 0xffffffffU;
 		mb();
 	}
 	mcheck_expected(cpu) = 0;
+	t2_mcheck_any_expected = 0;
 	mb();
 
 	/* If Type1 access, must reset T2 CFG so normal IO space ops work.  */
@@ -190,45 +227,30 @@
 		*(vulp)T2_HAE_3 = t2_cfg;
 		mb();
 	}
-	DBG(("conf_read(): finished\n"));
 
-	local_irq_restore(flags);
 	return value;
 }
 
 static void
 conf_write(unsigned long addr, unsigned int value, unsigned char type1)
 {
-	unsigned long flags;
-	unsigned int cpu;
+	unsigned int cpu, taken;
 	unsigned long t2_cfg = 0;
 
 	cpu = smp_processor_id();
 
-	local_irq_save(flags);	/* avoid getting hit by machine check */
-
-#if 0
-	{
-	  unsigned long stat0;
-	  /* Reset status register to avoid losing errors.  */
-	  stat0 = *(vulp)T2_IOCSR;
-	  *(vulp)T2_IOCSR = stat0;
-	  mb();
-	  DBG(("conf_write: T2 ERR was 0x%x\n", stat0));
-	}
-#endif
-
 	/* If Type1 access, must set T2 CFG.  */
 	if (type1) {
 		t2_cfg = *(vulp)T2_HAE_3 & ~0xc0000000UL;
 		*(vulp)T2_HAE_3 = t2_cfg | 0x40000000UL;
 		mb();
-		DBG(("conf_write: TYPE1 access\n"));
 	}
 	mb();
 	draina();
 
 	mcheck_expected(cpu) = 1;
+	mcheck_taken(cpu) = 0;
+	t2_mcheck_any_expected |= (1 << cpu);
 	mb();
 
 	/* Access configuration space.  */
@@ -236,7 +258,19 @@
 	mb();
 	mb();  /* magic */
 
+	/* Wait for possible mcheck. Also, this lets other CPUs clear
+	   their mchecks as well, as they can reliably tell when
+	   this CPU is in the midst of handling a real mcheck via
+	   the "taken" function. */
+	udelay(100);
+
+	if ((taken = mcheck_taken(cpu))) {
+		mcheck_taken(cpu) = 0;
+		t2_mcheck_last_taken |= (1 << cpu);
+		mb();
+	}
 	mcheck_expected(cpu) = 0;
+	t2_mcheck_any_expected = 0;
 	mb();
 
 	/* If Type1 access, must reset T2 CFG so normal IO space ops work.  */
@@ -244,8 +278,6 @@
 		*(vulp)T2_HAE_3 = t2_cfg;
 		mb();
 	}
-	DBG(("conf_write(): finished\n"));
-	local_irq_restore(flags);
 }
 
 static int
@@ -290,48 +322,121 @@
 	.write =	t2_write_config,
 };
 
+static void __init
+t2_direct_map_window1(unsigned long base, unsigned long length)
+{
+	unsigned long temp;
+
+	__direct_map_base = base;
+	__direct_map_size = length;
+
+	temp = (base & 0xfff00000UL) | ((base + length - 1) >> 20);
+	*(vulp)T2_WBASE1 = temp | 0x80000UL; /* OR in ENABLE bit */
+	temp = (length - 1) & 0xfff00000UL;
+	*(vulp)T2_WMASK1 = temp;
+	*(vulp)T2_TBASE1 = 0;
+
+#if DEBUG_PRINT_FINAL_SETTINGS
+	printk("%s: setting WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n",
+	       __FUNCTION__,
+	       *(vulp)T2_WBASE1,
+	       *(vulp)T2_WMASK1,
+	       *(vulp)T2_TBASE1);
+#endif
+}
+
+static void __init
+t2_sg_map_window2(struct pci_controller *hose,
+		  unsigned long base,
+		  unsigned long length)
+{
+	unsigned long temp;
+
+	/* Note we can only do 1 SG window, as the other is for direct, so
+	   do an ISA SG area, especially for the floppy. */
+	hose->sg_isa = iommu_arena_new(hose, base, length, 0);
+	hose->sg_pci = NULL;
+
+	temp = (base & 0xfff00000UL) | ((base + length - 1) >> 20);
+	*(vulp)T2_WBASE2 = temp | 0xc0000UL; /* OR in ENABLE/SG bits */
+	temp = (length - 1) & 0xfff00000UL;
+	*(vulp)T2_WMASK2 = temp;
+	*(vulp)T2_TBASE2 = virt_to_phys(hose->sg_isa->ptes) >> 1;
+	mb();
+
+	t2_pci_tbi(hose, 0, -1); /* flush TLB all */
+
+#if DEBUG_PRINT_FINAL_SETTINGS
+	printk("%s: setting WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n",
+	       __FUNCTION__,
+	       *(vulp)T2_WBASE2,
+	       *(vulp)T2_WMASK2,
+	       *(vulp)T2_TBASE2);
+#endif
+}
+
+static void __init
+t2_save_configuration(void)
+{
+#if DEBUG_PRINT_INITIAL_SETTINGS
+	printk("%s: HAE_1 was 0x%lx\n", __FUNCTION__, srm_hae); /* HW is 0 */
+	printk("%s: HAE_2 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_2);
+	printk("%s: HAE_3 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_3);
+	printk("%s: HAE_4 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_4);
+	printk("%s: HBASE was 0x%lx\n", __FUNCTION__, *(vulp)T2_HBASE);
+
+	printk("%s: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", __FUNCTION__, 
+	       *(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);
+	printk("%s: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", __FUNCTION__, 
+	       *(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);
+#endif
+
+	/*
+	 * Save the DMA Window registers.
+	 */
+	t2_saved_config.window[0].wbase = *(vulp)T2_WBASE1;
+	t2_saved_config.window[0].wmask = *(vulp)T2_WMASK1;
+	t2_saved_config.window[0].tbase = *(vulp)T2_TBASE1;
+	t2_saved_config.window[1].wbase = *(vulp)T2_WBASE2;
+	t2_saved_config.window[1].wmask = *(vulp)T2_WMASK2;
+	t2_saved_config.window[1].tbase = *(vulp)T2_TBASE2;
+
+	t2_saved_config.hae_1 = srm_hae; /* HW is already set to 0 */
+	t2_saved_config.hae_2 = *(vulp)T2_HAE_2;
+	t2_saved_config.hae_3 = *(vulp)T2_HAE_3;
+	t2_saved_config.hae_4 = *(vulp)T2_HAE_4;
+	t2_saved_config.hbase = *(vulp)T2_HBASE;
+}
+
 void __init
 t2_init_arch(void)
 {
 	struct pci_controller *hose;
-	unsigned long t2_iocsr;
+	unsigned long temp;
 	unsigned int i;
 
 	for (i = 0; i < NR_CPUS; i++) {
 		mcheck_expected(i) = 0;
 		mcheck_taken(i) = 0;
 	}
-
-#if 0
-	/* Set up error reporting.  */
-	t2_iocsr = *(vulp)T2_IOCSR;
-	*(vulp)T2_IOCSR = t2_iocsr | (0x1UL << 7); /* TLB error check */
-	mb();
-	*(vulp)T2_IOCSR; /* read it back to make sure */
-#endif
+	t2_mcheck_any_expected = 0;
+	t2_mcheck_last_taken = 0;
 
 	/* Enable scatter/gather TLB use.  */
-	t2_iocsr = *(vulp)T2_IOCSR;
-	if (!(t2_iocsr & (0x1UL << 26))) {
+	temp = *(vulp)T2_IOCSR;
+	if (!(temp & (0x1UL << 26))) {
 		printk("t2_init_arch: enabling SG TLB, IOCSR was 0x%lx\n",
-		       t2_iocsr);
-		*(vulp)T2_IOCSR = t2_iocsr | (0x1UL << 26);
+		       temp);
+		*(vulp)T2_IOCSR = temp | (0x1UL << 26);
 		mb();	
 		*(vulp)T2_IOCSR; /* read it back to make sure */
 	}
 
-#if 0
-	printk("t2_init_arch: HBASE was 0x%lx\n", *(vulp)T2_HBASE);
-	printk("t2_init_arch: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n",
-	       *(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);
-	printk("t2_init_arch: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n",
-	       *(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);
-#endif
+	t2_save_configuration();
 
 	/*
 	 * Create our single hose.
 	 */
-
 	pci_isa_hose = hose = alloc_pci_controller();
 	hose->io_space = &ioport_resource;
 	hose->mem_space = &iomem_resource;
@@ -342,52 +447,51 @@
 	hose->sparse_io_base = T2_IO - IDENT_ADDR;
 	hose->dense_io_base = 0;
 
-	/* Note we can only do 1 SG window, as the other is for direct, so
-	   do an ISA SG area, especially for the floppy. */
-        hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, 0);
-	hose->sg_pci = NULL;
-
 	/*
 	 * Set up the PCI->physical memory translation windows.
 	 *
-	 * Window 1 goes at ? GB and is ?GB large, direct mapped.
-	 * Window 2 goes at 8 MB and is 8MB large, scatter/gather (for ISA).
+	 * Window 1 is direct mapped.
+	 * Window 2 is scatter/gather (for ISA).
 	 */
 
-#if T2_DIRECTMAP_2G
-	__direct_map_base = 0x80000000UL;
-	__direct_map_size = 0x80000000UL;
+	t2_direct_map_window1(T2_DIRECTMAP_START, T2_DIRECTMAP_LENGTH);
 
-	/* WARNING!! must correspond to the direct map window params!!! */
-	*(vulp)T2_WBASE1 = 0x80080fffU;
-	*(vulp)T2_WMASK1 = 0x7ff00000U;
-	*(vulp)T2_TBASE1 = 0;
-#else /* T2_DIRECTMAP_2G */
-	__direct_map_base = 0x40000000UL;
-	__direct_map_size = 0x40000000UL;
-
-	/* WARNING!! must correspond to the direct map window params!!! */
-	*(vulp)T2_WBASE1 = 0x400807ffU;
-	*(vulp)T2_WMASK1 = 0x3ff00000U;
-	*(vulp)T2_TBASE1 = 0;
-#endif /* T2_DIRECTMAP_2G */
+	/* Always make an ISA DMA window. */
+	t2_sg_map_window2(hose, T2_ISA_SG_START, T2_ISA_SG_LENGTH);
 
-	/* WARNING!! must correspond to the SG arena/window params!!! */
-	*(vulp)T2_WBASE2 = 0x008c000fU;
-	*(vulp)T2_WMASK2 = 0x00700000U;
-	*(vulp)T2_TBASE2 = virt_to_phys(hose->sg_isa->ptes) >> 1;
-
-	*(vulp)T2_HBASE = 0x0;
+	*(vulp)T2_HBASE = 0x0; /* Disable HOLES. */
 
 	/* Zero HAE.  */
-	*(vulp)T2_HAE_1 = 0; mb();
-	*(vulp)T2_HAE_2 = 0; mb();
-	*(vulp)T2_HAE_3 = 0; mb();
+	*(vulp)T2_HAE_1 = 0; mb(); /* Sparse MEM HAE */
+	*(vulp)T2_HAE_2 = 0; mb(); /* Sparse I/O HAE */
+	*(vulp)T2_HAE_3 = 0; mb(); /* Config Space HAE */
 #if 0
-	*(vulp)T2_HAE_4 = 0; mb(); /* DO NOT TOUCH THIS!!! */
+	/* !!! DO NOT EVER TOUCH THIS !!! */
+	*(vulp)T2_HAE_4 = 0; mb(); /* Dense MEM HAE */
 #endif
+}
 
-	t2_pci_tbi(hose, 0, -1); /* flush TLB all */
+void
+t2_kill_arch(int mode)
+{
+	/*
+	 * Restore the DMA Window registers.
+	 */
+	*(vulp)T2_WBASE1 = t2_saved_config.window[0].wbase;
+	*(vulp)T2_WMASK1 = t2_saved_config.window[0].wmask;
+	*(vulp)T2_TBASE1 = t2_saved_config.window[0].tbase;
+	*(vulp)T2_WBASE2 = t2_saved_config.window[1].wbase;
+	*(vulp)T2_WMASK2 = t2_saved_config.window[1].wmask;
+	*(vulp)T2_TBASE2 = t2_saved_config.window[1].tbase;
+	mb();
+
+	*(vulp)T2_HAE_1 = srm_hae;
+	*(vulp)T2_HAE_2 = t2_saved_config.hae_2;
+	*(vulp)T2_HAE_3 = t2_saved_config.hae_3;
+	*(vulp)T2_HAE_4 = t2_saved_config.hae_4;
+	*(vulp)T2_HBASE = t2_saved_config.hbase;
+	mb();
+	*(vulp)T2_HBASE; /* READ it back to ensure WRITE occurred. */
 }
 
 void
@@ -415,13 +519,7 @@
 {
 	struct sable_cpu_csr *cpu_regs;
 
-	cpu_regs = (struct sable_cpu_csr *)T2_CPU0_BASE;
-	if (cpu == 1)
-		cpu_regs = (struct sable_cpu_csr *)T2_CPU1_BASE;
-	if (cpu == 2)
-		cpu_regs = (struct sable_cpu_csr *)T2_CPU2_BASE;
-	if (cpu == 3)
-		cpu_regs = (struct sable_cpu_csr *)T2_CPU3_BASE;
+	cpu_regs = (struct sable_cpu_csr *)T2_CPUn_BASE(cpu);
 		
 	cpu_regs->sic &= ~SIC_SEIC;
 
@@ -438,19 +536,76 @@
 	mb();  /* magic */
 }
 
+/*
+ * SABLE seems to have a "broadcast" style machine check, in that all
+ * CPUs receive it. And, the issuing CPU, in the case of PCI Config
+ * space read/write faults, will also receive a second mcheck, upon
+ * lowering IPL during completion processing in pci_read_config_byte()
+ * et al.
+ *
+ * Hence all the taken/expected/any_expected/last_taken stuff...
+ */
 void
 t2_machine_check(unsigned long vector, unsigned long la_ptr,
 		 struct pt_regs * regs)
 {
 	int cpu = smp_processor_id();
+#if DEBUG_MCHECK > 0
+	struct el_common *mchk_header = (struct el_common *)la_ptr;
+#endif /* DEBUG_MCHECK */
 
 	/* Clear the error before any reporting.  */
 	mb();
 	mb();  /* magic */
 	draina();
 	t2_clear_errors(cpu);
-	wrmces(rdmces()|1);	/* ??? */
-	mb();
+
+	/* This should not actually be done until the logout frame is
+	   examined, but, since we don't do that, go on and do this... */
+	wrmces(0x7);
+	mb();
+
+	/* Now, do testing for the anomalous conditions. */
+	if (!mcheck_expected(cpu) && t2_mcheck_any_expected) {
+		/*
+		 * FUNKY: Received mcheck on a CPU and not
+		 * expecting it, but another CPU is expecting one.
+		 *
+		 * Just dismiss it for now on this CPU...
+		 */
+#if DEBUG_MCHECK > 0
+		printk("t2_machine_check(cpu%d): any_expected 0x%x -"
+                       " (assumed) spurious -"
+                       " code 0x%x\n", cpu, t2_mcheck_any_expected,
+                       (unsigned int)mchk_header->code);
+#endif /* DEBUG_MCHECK */
+		return;
+	}
+
+	if (!mcheck_expected(cpu) && !t2_mcheck_any_expected) {
+		if (t2_mcheck_last_taken & (1 << cpu)) {
+#if DEBUG_MCHECK > 0
+			printk("t2_machine_check(cpu%d): last_taken 0x%x - "
+			       "unexpected mcheck - code 0x%x\n",
+			       cpu, t2_mcheck_last_taken,
+			       (unsigned int)mchk_header->code);
+#endif /* DEBUG_MCHECK */
+			t2_mcheck_last_taken = 0;
+			mb();
+			return;
+		} else {
+			t2_mcheck_last_taken = 0;
+			mb();
+		}
+	}
+
+#if DEBUG_MCHECK > 0
+	printk("%s t2_mcheck(cpu%d): last_taken 0x%x - "
+	       "any_expected 0x%x - code 0x%x\n",
+	       (mcheck_expected(cpu) ? "EX" : "UN"), cpu,
+	       t2_mcheck_last_taken, t2_mcheck_any_expected,
+	       (unsigned int)mchk_header->code);
+#endif /* DEBUG_MCHECK */
 
 	process_mcheck_info(vector, la_ptr, regs, "T2", mcheck_expected(cpu));
 }
diff -Nru a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c
--- a/arch/alpha/kernel/pci.c	Sat Apr 19 19:51:28 2003
+++ b/arch/alpha/kernel/pci.c	Sat Apr 19 19:51:28 2003
@@ -19,6 +19,7 @@
 #include <linux/ioport.h>
 #include <linux/kernel.h>
 #include <linux/bootmem.h>
+#include <linux/module.h>
 #include <linux/cache.h>
 #include <asm/machvec.h>
 
@@ -230,7 +231,7 @@
 void __init
 pcibios_fixup_bus(struct pci_bus *bus)
 {
-	/* Propogate hose info into the subordinate devices.  */
+	/* Propagate hose info into the subordinate devices.  */
 
 	struct pci_controller *hose = bus->sysdata;
 	struct list_head *ln;
diff -Nru a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c
--- a/arch/alpha/kernel/pci_iommu.c	Sat Apr 19 19:51:50 2003
+++ b/arch/alpha/kernel/pci_iommu.c	Sat Apr 19 19:51:50 2003
@@ -431,7 +431,7 @@
 /* Free and unmap a consistent DMA buffer.  CPU_ADDR and DMA_ADDR must
    be values that were returned from pci_alloc_consistent.  SIZE must
    be the same as what as passed into pci_alloc_consistent.
-   References to the memory and mappings assosciated with CPU_ADDR or
+   References to the memory and mappings associated with CPU_ADDR or
    DMA_ADDR past this call are illegal.  */
 
 void
diff -Nru a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h
--- a/arch/alpha/kernel/proto.h	Sat Apr 19 19:51:29 2003
+++ b/arch/alpha/kernel/proto.h	Sat Apr 19 19:51:29 2003
@@ -76,6 +76,7 @@
 /* core_t2.c */
 extern struct pci_ops t2_pci_ops;
 extern void t2_init_arch(void);
+extern void t2_kill_arch(int);
 extern void t2_machine_check(u64, u64, struct pt_regs *);
 extern void t2_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t);
 
diff -Nru a/arch/alpha/kernel/semaphore.c b/arch/alpha/kernel/semaphore.c
--- a/arch/alpha/kernel/semaphore.c	Sat Apr 19 19:51:47 2003
+++ b/arch/alpha/kernel/semaphore.c	Sat Apr 19 19:51:47 2003
@@ -122,7 +122,7 @@
 		long tmp, tmp2, tmp3;
 
 		/* We must undo the sem->count down_interruptible decrement
-		   simultaneously and atomicly with the sem->waking
+		   simultaneously and atomically with the sem->waking
 		   adjustment, otherwise we can race with __up.  This is
 		   accomplished by doing a 64-bit ll/sc on two 32-bit words.
 		
diff -Nru a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c
--- a/arch/alpha/kernel/setup.c	Sat Apr 19 19:51:28 2003
+++ b/arch/alpha/kernel/setup.c	Sat Apr 19 19:51:28 2003
@@ -162,6 +162,7 @@
 WEAK(eiger_mv);
 WEAK(jensen_mv);
 WEAK(lx164_mv);
+WEAK(lynx_mv);
 WEAK(marvel_ev7_mv);
 WEAK(miata_mv);
 WEAK(mikasa_mv);
@@ -268,7 +269,7 @@
 	unsigned long size;
 
 	size = initrd_end - initrd_start;
-	start = __alloc_bootmem(size, PAGE_SIZE, 0);
+	start = __alloc_bootmem(PAGE_ALIGN(size), PAGE_SIZE, 0);
 	if (!start || __pa(start) + size > mem_limit) {
 		initrd_start = initrd_end = 0;
 		return NULL;
@@ -486,7 +487,7 @@
 	notifier_chain_register(&panic_notifier_list, &alpha_panic_block);
 
 #ifdef CONFIG_ALPHA_GENERIC
-	/* Assume that we've booted from SRM if we havn't booted from MILO.
+	/* Assume that we've booted from SRM if we haven't booted from MILO.
 	   Detect the later by looking for "MILO" in the system serial nr.  */
 	alpha_using_srm = strncmp((const char *)hwrpb->ssn, "MILO", 4) != 0;
 #endif
@@ -569,7 +570,7 @@
 #endif
 
 	/*
-	 * Indentify and reconfigure for the current system.
+	 * Identify and reconfigure for the current system.
 	 */
 	cpu = (struct percpu_struct*)((char*)hwrpb + hwrpb->processor_offset);
 
@@ -739,7 +740,7 @@
 		NULL,		/* Turbolaser */
 		&avanti_mv,
 		NULL,		/* Mustang */
-		&alcor_mv,	/* Alcor, Bret, Maverick.  */
+		NULL,		/* Alcor, Bret, Maverick. HWRPB inaccurate? */
 		NULL,		/* Tradewind */
 		NULL,		/* Mikasa -- see below.  */
 		NULL,		/* EB64 */
@@ -748,7 +749,7 @@
 		&alphabook1_mv,
 		&rawhide_mv,
 		NULL,		/* K2 */
-		NULL,		/* Lynx */
+		&lynx_mv,	/* Lynx */
 		&xl_mv,
 		NULL,		/* EB164 -- see variation.  */
 		NULL,		/* Noritake -- see below.  */
@@ -930,6 +931,7 @@
 		&eiger_mv,
 		&jensen_mv,
 		&lx164_mv,
+		&lynx_mv,
 		&miata_mv,
 		&mikasa_mv,
 		&mikasa_primo_mv,
diff -Nru a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c
--- a/arch/alpha/kernel/sys_cabriolet.c	Sat Apr 19 19:51:29 2003
+++ b/arch/alpha/kernel/sys_cabriolet.c	Sat Apr 19 19:51:29 2003
@@ -132,11 +132,13 @@
 	setup_irq(16+4, &isa_cascade_irqaction);
 }
 
+#ifndef CONFIG_ALPHA_PC164
 static void __init
 cabriolet_init_irq(void)
 {
 	common_init_irq(srm_device_interrupt);
 }
+#endif
 
 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_PC164)
 /* In theory, the PC164 has the same interrupt hardware as the other
diff -Nru a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c
--- a/arch/alpha/kernel/sys_sable.c	Sat Apr 19 19:51:28 2003
+++ b/arch/alpha/kernel/sys_sable.c	Sat Apr 19 19:51:28 2003
@@ -5,7 +5,7 @@
  *	Copyright (C) 1996 Jay A Estabrook
  *	Copyright (C) 1998, 1999 Richard Henderson
  *
- * Code supporting the Sable and Sable-Gamma systems.
+ * Code supporting the Sable, Sable-Gamma, and Lynx systems.
  */
 
 #include <linux/config.h>
@@ -31,8 +31,28 @@
 #include "pci_impl.h"
 #include "machvec_impl.h"
 
-spinlock_t sable_irq_lock = SPIN_LOCK_UNLOCKED;
+spinlock_t sable_lynx_irq_lock = SPIN_LOCK_UNLOCKED;
 
+typedef struct irq_swizzle_struct
+{
+	char irq_to_mask[64];
+	char mask_to_irq[64];
+
+	/* Note mask bit is true for DISABLED irqs.  */
+	unsigned long shadow_mask;
+
+	void (*update_irq_hw)(unsigned long bit, unsigned long mask);
+	void (*ack_irq_hw)(unsigned long bit);
+
+} irq_swizzle_t;
+
+static irq_swizzle_t *sable_lynx_irq_swizzle;
+
+static void sable_lynx_init_irq(int nr_irqs);
+
+#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SABLE)
+
+/***********************************************************************/
 /*
  *   For SABLE, which is really baroque, we manage 40 IRQ's, but the
  *   hardware really only supports 24, not via normal ISA PIC,
@@ -71,30 +91,7 @@
  *23        IIC				-
  */
 
-static struct 
-{
-	char irq_to_mask[40];
-	char mask_to_irq[40];
-
-	/* Note mask bit is true for DISABLED irqs.  */
-	unsigned long shadow_mask;
-} sable_irq_swizzle = {
-	{
-		-1,  6, -1,  8, 15, 12,  7,  9,	/* pseudo PIC  0-7  */
-		-1, 16, 17, 18,  3, -1, 21, 22,	/* pseudo PIC  8-15 */
-		-1, -1, -1, -1, -1, -1, -1, -1,	/* pseudo EISA 0-7  */
-		-1, -1, -1, -1, -1, -1, -1, -1,	/* pseudo EISA 8-15 */
-		 2,  1,  0,  4,  5, -1, -1, -1,	/* pseudo PCI */
-	},
-	{
-		34, 33, 32, 12, 35, 36,  1,  6,	/* mask 0-7  */
-		 3,  7, -1, -1,  5, -1, -1,  4,	/* mask 8-15  */
-		 9, 10, 11, -1, -1, 14, 15, -1,	/* mask 16-23  */
-	},
-	-1
-};
-
-static inline void
+static void
 sable_update_irq_hw(unsigned long bit, unsigned long mask)
 {
 	int port = 0x537;
@@ -110,7 +107,7 @@
 	outb(mask, port);
 }
 
-static inline void
+static void
 sable_ack_irq_hw(unsigned long bit)
 {
 	int port, val1, val2;
@@ -133,102 +130,46 @@
 	outb(val2, 0x534);	/* ack the master */
 }
 
-static inline void
-sable_enable_irq(unsigned int irq)
-{
-	unsigned long bit, mask;
-
-	bit = sable_irq_swizzle.irq_to_mask[irq];
-	spin_lock(&sable_irq_lock);
-	mask = sable_irq_swizzle.shadow_mask &= ~(1UL << bit);
-	sable_update_irq_hw(bit, mask);
-	spin_unlock(&sable_irq_lock);
-}
-
-static void
-sable_disable_irq(unsigned int irq)
-{
-	unsigned long bit, mask;
-
-	bit = sable_irq_swizzle.irq_to_mask[irq];
-	spin_lock(&sable_irq_lock);
-	mask = sable_irq_swizzle.shadow_mask |= 1UL << bit;
-	sable_update_irq_hw(bit, mask);
-	spin_unlock(&sable_irq_lock);
-}
-
-static unsigned int
-sable_startup_irq(unsigned int irq)
-{
-	sable_enable_irq(irq);
-	return 0;
-}
-
-static void
-sable_end_irq(unsigned int irq)
-{
-	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-		sable_enable_irq(irq);
-}
-
-static void
-sable_mask_and_ack_irq(unsigned int irq)
-{
-	unsigned long bit, mask;
-
-	bit = sable_irq_swizzle.irq_to_mask[irq];
-	spin_lock(&sable_irq_lock);
-	mask = sable_irq_swizzle.shadow_mask |= 1UL << bit;
-	sable_update_irq_hw(bit, mask);
-	sable_ack_irq_hw(bit);
-	spin_unlock(&sable_irq_lock);
-}
-
-static struct hw_interrupt_type sable_irq_type = {
-	.typename	= "SABLE",
-	.startup	= sable_startup_irq,
-	.shutdown	= sable_disable_irq,
-	.enable		= sable_enable_irq,
-	.disable	= sable_disable_irq,
-	.ack		= sable_mask_and_ack_irq,
-	.end		= sable_end_irq,
+static irq_swizzle_t sable_irq_swizzle = {
+	{
+		-1,  6, -1,  8, 15, 12,  7,  9,	/* pseudo PIC  0-7  */
+		-1, 16, 17, 18,  3, -1, 21, 22,	/* pseudo PIC  8-15 */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/* pseudo EISA 0-7  */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/* pseudo EISA 8-15  */
+		 2,  1,  0,  4,  5, -1, -1, -1,	/* pseudo PCI */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/*  */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/*  */
+		-1, -1, -1, -1, -1, -1, -1, -1 	/*  */
+	},
+	{
+		34, 33, 32, 12, 35, 36,  1,  6,	/* mask 0-7  */
+		 3,  7, -1, -1,  5, -1, -1,  4,	/* mask 8-15  */
+		 9, 10, 11, -1, -1, 14, 15, -1,	/* mask 16-23  */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/*  */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/*  */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/*  */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/*  */
+		-1, -1, -1, -1, -1, -1, -1, -1	/*  */
+	},
+	-1,
+	sable_update_irq_hw,
+	sable_ack_irq_hw
 };
 
-static void 
-sable_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
-{
-	/* Note that the vector reported by the SRM PALcode corresponds
-	   to the interrupt mask bits, but we have to manage via more
-	   normal IRQs.  */
-
-	int bit, irq;
-
-	bit = (vector - 0x800) >> 4;
-	irq = sable_irq_swizzle.mask_to_irq[bit];
-	handle_irq(irq, regs);
-}
-
 static void __init
 sable_init_irq(void)
 {
-	long i;
-
 	outb(-1, 0x537);	/* slave 0 */
 	outb(-1, 0x53b);	/* slave 1 */
 	outb(-1, 0x53d);	/* slave 2 */
 	outb(0x44, 0x535);	/* enable cascades in master */
 
-	for (i = 0; i < 40; ++i) {
-		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL;
-		irq_desc[i].handler = &sable_irq_type;
-	}
-	
-	common_init_isa_dma();
+	sable_lynx_irq_swizzle = &sable_irq_swizzle;
+	sable_lynx_init_irq(40);
 }
 
-
 /*
- * PCI Fixup configuration for ALPHA SABLE (2100) - 2100A is different ??
+ * PCI Fixup configuration for ALPHA SABLE (2100).
  *
  * The device to slot mapping looks like:
  *
@@ -256,7 +197,7 @@
 static int __init
 sable_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 {
-        static char irq_tab[9][5] __initdata = {
+	static char irq_tab[9][5] __initdata = {
 		/*INT    INTA   INTB   INTC   INTD */
 		{ 32+0,  32+0,  32+0,  32+0,  32+0},  /* IdSel 0,  TULIP  */
 		{ 32+1,  32+1,  32+1,  32+1,  32+1},  /* IdSel 1,  SCSI   */
@@ -266,13 +207,349 @@
 		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 5,  none   */
 		{ 32+2,  32+2,  32+2,  32+2,  32+2},  /* IdSel 6,  slot 0 */
 		{ 32+3,  32+3,  32+3,  32+3,  32+3},  /* IdSel 7,  slot 1 */
-		{ 32+4,  32+4,  32+4,  32+4,  32+4},  /* IdSel 8,  slot 2 */
-        };
+		{ 32+4,  32+4,  32+4,  32+4,  32+4}   /* IdSel 8,  slot 2 */
+	};
 	long min_idsel = 0, max_idsel = 8, irqs_per_slot = 5;
 	return COMMON_TABLE_LOOKUP;
 }
+#endif /* defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_SABLE) */
 
+#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_LYNX)
 
+/***********************************************************************/
+/* LYNX hardware specifics
+ */
+/*
+ *   For LYNX, which is also baroque, we manage 64 IRQs, via a custom IC.
+ *
+ * Bit      Meaning               Kernel IRQ
+ *------------------------------------------
+ * 0        
+ * 1        
+ * 2        
+ * 3        mouse			12
+ * 4        
+ * 5        
+ * 6        keyboard			1
+ * 7        floppy			6
+ * 8        COM2			3
+ * 9        parallel port		7
+ *10        EISA irq 3			-
+ *11        EISA irq 4			-
+ *12        EISA irq 5			5
+ *13        EISA irq 6			-
+ *14        EISA irq 7			-
+ *15        COM1			4
+ *16        EISA irq 9			9
+ *17        EISA irq 10			10
+ *18        EISA irq 11			11
+ *19        EISA irq 12			-
+ *20        
+ *21        EISA irq 14			14
+ *22        EISA irq 15			15
+ *23        IIC				-
+ *24        VGA (builtin)               -
+ *25
+ *26
+ *27
+ *28        NCR810 (builtin)		28
+ *29
+ *30
+ *31
+ *32        PCI 0 slot 4 A primary bus  32
+ *33        PCI 0 slot 4 B primary bus  33
+ *34        PCI 0 slot 4 C primary bus  34
+ *35        PCI 0 slot 4 D primary bus
+ *36        PCI 0 slot 5 A primary bus
+ *37        PCI 0 slot 5 B primary bus
+ *38        PCI 0 slot 5 C primary bus
+ *39        PCI 0 slot 5 D primary bus
+ *40        PCI 0 slot 6 A primary bus
+ *41        PCI 0 slot 6 B primary bus
+ *42        PCI 0 slot 6 C primary bus
+ *43        PCI 0 slot 6 D primary bus
+ *44        PCI 0 slot 7 A primary bus
+ *45        PCI 0 slot 7 B primary bus
+ *46        PCI 0 slot 7 C primary bus
+ *47        PCI 0 slot 7 D primary bus
+ *48        PCI 0 slot 0 A secondary bus
+ *49        PCI 0 slot 0 B secondary bus
+ *50        PCI 0 slot 0 C secondary bus
+ *51        PCI 0 slot 0 D secondary bus
+ *52        PCI 0 slot 1 A secondary bus
+ *53        PCI 0 slot 1 B secondary bus
+ *54        PCI 0 slot 1 C secondary bus
+ *55        PCI 0 slot 1 D secondary bus
+ *56        PCI 0 slot 2 A secondary bus
+ *57        PCI 0 slot 2 B secondary bus
+ *58        PCI 0 slot 2 C secondary bus
+ *59        PCI 0 slot 2 D secondary bus
+ *60        PCI 0 slot 3 A secondary bus
+ *61        PCI 0 slot 3 B secondary bus
+ *62        PCI 0 slot 3 C secondary bus
+ *63        PCI 0 slot 3 D secondary bus
+ */
+
+static void
+lynx_update_irq_hw(unsigned long bit, unsigned long mask)
+{
+	/*
+	 * Write the AIR register on the T3/T4 with the
+	 * address of the IC mask register (offset 0x40)
+	 */
+	*(vulp)T2_AIR = 0x40;
+	mb();
+	*(vulp)T2_AIR; /* re-read to force write */
+	mb();
+	*(vulp)T2_DIR = mask;    
+	mb();
+	mb();
+}
+
+static void
+lynx_ack_irq_hw(unsigned long bit)
+{
+	*(vulp)T2_VAR = (u_long) bit;
+	mb();
+	mb();
+}
+
+static irq_swizzle_t lynx_irq_swizzle = {
+	{ /* irq_to_mask */
+		-1,  6, -1,  8, 15, 12,  7,  9,	/* pseudo PIC  0-7  */
+		-1, 16, 17, 18,  3, -1, 21, 22,	/* pseudo PIC  8-15 */
+		-1, -1, -1, -1, -1, -1, -1, -1,	/* pseudo */
+		-1, -1, -1, -1, 28, -1, -1, -1,	/* pseudo */
+		32, 33, 34, 35, 36, 37, 38, 39,	/* mask 32-39 */
+		40, 41, 42, 43, 44, 45, 46, 47,	/* mask 40-47 */
+		48, 49, 50, 51, 52, 53, 54, 55,	/* mask 48-55 */
+		56, 57, 58, 59, 60, 61, 62, 63	/* mask 56-63 */
+	},
+	{ /* mask_to_irq */
+		-1, -1, -1, 12, -1, -1,  1,  6,	/* mask 0-7   */
+		 3,  7, -1, -1,  5, -1, -1,  4,	/* mask 8-15  */
+		 9, 10, 11, -1, -1, 14, 15, -1,	/* mask 16-23 */
+		-1, -1, -1, -1, 28, -1, -1, -1,	/* mask 24-31 */
+		32, 33, 34, 35, 36, 37, 38, 39,	/* mask 32-39 */
+		40, 41, 42, 43, 44, 45, 46, 47,	/* mask 40-47 */
+		48, 49, 50, 51, 52, 53, 54, 55,	/* mask 48-55 */
+		56, 57, 58, 59, 60, 61, 62, 63	/* mask 56-63 */
+	},
+	-1,
+	lynx_update_irq_hw,
+	lynx_ack_irq_hw
+};
+
+static void __init
+lynx_init_irq(void)
+{
+	sable_lynx_irq_swizzle = &lynx_irq_swizzle;
+	sable_lynx_init_irq(64);
+}
+
+/*
+ * PCI Fixup configuration for ALPHA LYNX (2100A)
+ *
+ * The device to slot mapping looks like:
+ *
+ * Slot     Device
+ *  0       none
+ *  1       none
+ *  2       PCI-EISA bridge
+ *  3       PCI-PCI bridge
+ *  4       NCR 810 (Demi-Lynx only)
+ *  5       none
+ *  6       PCI on board slot 4
+ *  7       PCI on board slot 5
+ *  8       PCI on board slot 6
+ *  9       PCI on board slot 7
+ *
+ * And behind the PPB we have:
+ *
+ * 11       PCI on board slot 0
+ * 12       PCI on board slot 1
+ * 13       PCI on board slot 2
+ * 14       PCI on board slot 3
+ */
+/*
+ * NOTE: the IRQ assignments below are arbitrary, but need to be consistent
+ * with the values in the irq swizzling tables above.
+ */
+
+static int __init
+lynx_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+{
+	static char irq_tab[19][5] __initdata = {
+		/*INT    INTA   INTB   INTC   INTD */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 13,  PCEB   */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 14,  PPB    */
+		{   28,    28,    28,    28,    28},  /* IdSel 15,  NCR demi */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 16,  none   */
+		{   32,    32,    33,    34,    35},  /* IdSel 17,  slot 4 */
+		{   36,    36,    37,    38,    39},  /* IdSel 18,  slot 5 */
+		{   40,    40,    41,    42,    43},  /* IdSel 19,  slot 6 */
+		{   44,    44,    45,    46,    47},  /* IdSel 20,  slot 7 */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 22,  none   */
+		/* The following are actually behind the PPB. */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 16   none */
+		{   28,    28,    28,    28,    28},  /* IdSel 17   NCR lynx */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 18   none */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 19   none */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 20   none */
+		{   -1,    -1,    -1,    -1,    -1},  /* IdSel 21   none */
+		{   48,    48,    49,    50,    51},  /* IdSel 22   slot 0 */
+		{   52,    52,    53,    54,    55},  /* IdSel 23   slot 1 */
+		{   56,    56,    57,    58,    59},  /* IdSel 24   slot 2 */
+		{   60,    60,    61,    62,    63}   /* IdSel 25   slot 3 */
+	};
+	const long min_idsel = 2, max_idsel = 20, irqs_per_slot = 5;
+	return COMMON_TABLE_LOOKUP;
+}
+
+static u8 __init
+lynx_swizzle(struct pci_dev *dev, u8 *pinp)
+{
+	int slot, pin = *pinp;
+
+	if (dev->bus->number == 0) {
+		slot = PCI_SLOT(dev->devfn);
+	}
+	/* Check for the built-in bridge */
+	else if (PCI_SLOT(dev->bus->self->devfn) == 3) {
+		slot = PCI_SLOT(dev->devfn) + 11;
+	}
+	else
+	{
+		/* Must be a card-based bridge.  */
+		do {
+			if (PCI_SLOT(dev->bus->self->devfn) == 3) {
+				slot = PCI_SLOT(dev->devfn) + 11;
+				break;
+			}
+			pin = bridge_swizzle(pin, PCI_SLOT(dev->devfn)) ;
+
+			/* Move up the chain of bridges.  */
+			dev = dev->bus->self;
+			/* Slot of the next bridge.  */
+			slot = PCI_SLOT(dev->devfn);
+		} while (dev->bus->self);
+	}
+	*pinp = pin;
+	return slot;
+}
+
+#endif /* defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_LYNX) */
+
+/***********************************************************************/
+/* GENERIC irq routines */
+
+static inline void
+sable_lynx_enable_irq(unsigned int irq)
+{
+	unsigned long bit, mask;
+
+	bit = sable_lynx_irq_swizzle->irq_to_mask[irq];
+	spin_lock(&sable_lynx_irq_lock);
+	mask = sable_lynx_irq_swizzle->shadow_mask &= ~(1UL << bit);
+	sable_lynx_irq_swizzle->update_irq_hw(bit, mask);
+	spin_unlock(&sable_lynx_irq_lock);
+#if 0
+	printk("%s: mask 0x%lx bit 0x%x irq 0x%x\n",
+	       __FUNCTION__, mask, bit, irq);
+#endif
+}
+
+static void
+sable_lynx_disable_irq(unsigned int irq)
+{
+	unsigned long bit, mask;
+
+	bit = sable_lynx_irq_swizzle->irq_to_mask[irq];
+	spin_lock(&sable_lynx_irq_lock);
+	mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;
+	sable_lynx_irq_swizzle->update_irq_hw(bit, mask);
+	spin_unlock(&sable_lynx_irq_lock);
+#if 0
+	printk("%s: mask 0x%lx bit 0x%x irq 0x%x\n",
+	       __FUNCTION__, mask, bit, irq);
+#endif
+}
+
+static unsigned int
+sable_lynx_startup_irq(unsigned int irq)
+{
+	sable_lynx_enable_irq(irq);
+	return 0;
+}
+
+static void
+sable_lynx_end_irq(unsigned int irq)
+{
+	if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
+		sable_lynx_enable_irq(irq);
+}
+
+static void
+sable_lynx_mask_and_ack_irq(unsigned int irq)
+{
+	unsigned long bit, mask;
+
+	bit = sable_lynx_irq_swizzle->irq_to_mask[irq];
+	spin_lock(&sable_lynx_irq_lock);
+	mask = sable_lynx_irq_swizzle->shadow_mask |= 1UL << bit;
+	sable_lynx_irq_swizzle->update_irq_hw(bit, mask);
+	sable_lynx_irq_swizzle->ack_irq_hw(bit);
+	spin_unlock(&sable_lynx_irq_lock);
+}
+
+static struct hw_interrupt_type sable_lynx_irq_type = {
+	.typename	= "SABLE/LYNX",
+	.startup	= sable_lynx_startup_irq,
+	.shutdown	= sable_lynx_disable_irq,
+	.enable		= sable_lynx_enable_irq,
+	.disable	= sable_lynx_disable_irq,
+	.ack		= sable_lynx_mask_and_ack_irq,
+	.end		= sable_lynx_end_irq,
+};
+
+static void 
+sable_lynx_srm_device_interrupt(unsigned long vector, struct pt_regs * regs)
+{
+	/* Note that the vector reported by the SRM PALcode corresponds
+	   to the interrupt mask bits, but we have to manage via the
+	   so-called legacy IRQs for many common devices.  */
+
+	int bit, irq;
+
+	bit = (vector - 0x800) >> 4;
+	irq = sable_lynx_irq_swizzle->mask_to_irq[bit];
+#if 0
+	printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n",
+	       __FUNCTION__, vector, bit, irq);
+#endif
+	handle_irq(irq, regs);
+}
+
+static void __init
+sable_lynx_init_irq(int nr_irqs)
+{
+	long i;
+
+	for (i = 0; i < nr_irqs; ++i) {
+		irq_desc[i].status = IRQ_DISABLED | IRQ_LEVEL;
+		irq_desc[i].handler = &sable_lynx_irq_type;
+	}
+
+	common_init_isa_dma();
+}
+
+static void __init
+sable_lynx_init_pci(void)
+{
+	common_init_pci();
+}
+
+/*****************************************************************/
 /*
  * The System Vectors
  *
@@ -280,7 +557,8 @@
  * these games with GAMMA_BIAS.
  */
 
-#if defined(CONFIG_ALPHA_GENERIC) || !defined(CONFIG_ALPHA_GAMMA)
+#if defined(CONFIG_ALPHA_GENERIC) || \
+    (defined(CONFIG_ALPHA_SABLE) && !defined(CONFIG_ALPHA_GAMMA))
 #undef GAMMA_BIAS
 #define GAMMA_BIAS 0
 struct alpha_machine_vector sable_mv __initmv = {
@@ -295,13 +573,13 @@
 	.min_mem_address	= T2_DEFAULT_MEM_BASE,
 
 	.nr_irqs		= 40,
-	.device_interrupt	= sable_srm_device_interrupt,
+	.device_interrupt	= sable_lynx_srm_device_interrupt,
 
 	.init_arch		= t2_init_arch,
 	.init_irq		= sable_init_irq,
 	.init_rtc		= common_init_rtc,
-	.init_pci		= common_init_pci,
-	.kill_arch		= NULL,
+	.init_pci		= sable_lynx_init_pci,
+	.kill_arch		= t2_kill_arch,
 	.pci_map_irq		= sable_map_irq,
 	.pci_swizzle		= common_swizzle,
 
@@ -310,9 +588,10 @@
 	} }
 };
 ALIAS_MV(sable)
-#endif
+#endif /* GENERIC || (SABLE && !GAMMA) */
 
-#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_GAMMA)
+#if defined(CONFIG_ALPHA_GENERIC) || \
+    (defined(CONFIG_ALPHA_SABLE) && defined(CONFIG_ALPHA_GAMMA))
 #undef GAMMA_BIAS
 #define GAMMA_BIAS _GAMMA_BIAS
 struct alpha_machine_vector sable_gamma_mv __initmv = {
@@ -327,12 +606,13 @@
 	.min_mem_address	= T2_DEFAULT_MEM_BASE,
 
 	.nr_irqs		= 40,
-	.device_interrupt	= sable_srm_device_interrupt,
+	.device_interrupt	= sable_lynx_srm_device_interrupt,
 
 	.init_arch		= t2_init_arch,
 	.init_irq		= sable_init_irq,
 	.init_rtc		= common_init_rtc,
-	.init_pci		= common_init_pci,
+	.init_pci		= sable_lynx_init_pci,
+	.kill_arch		= t2_kill_arch,
 	.pci_map_irq		= sable_map_irq,
 	.pci_swizzle		= common_swizzle,
 
@@ -341,4 +621,36 @@
 	} }
 };
 ALIAS_MV(sable_gamma)
-#endif
+#endif /* GENERIC || (SABLE && GAMMA) */
+
+#if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_LYNX)
+#undef GAMMA_BIAS
+#define GAMMA_BIAS _GAMMA_BIAS
+struct alpha_machine_vector lynx_mv __initmv = {
+	.vector_name		= "Lynx",
+	DO_EV4_MMU,
+	DO_DEFAULT_RTC,
+	DO_T2_IO,
+	DO_T2_BUS,
+	.machine_check		= t2_machine_check,
+	.max_isa_dma_address	= ALPHA_SABLE_MAX_ISA_DMA_ADDRESS,
+	.min_io_address		= EISA_DEFAULT_IO_BASE,
+	.min_mem_address	= T2_DEFAULT_MEM_BASE,
+
+	.nr_irqs		= 64,
+	.device_interrupt	= sable_lynx_srm_device_interrupt,
+
+	.init_arch		= t2_init_arch,
+	.init_irq		= lynx_init_irq,
+	.init_rtc		= common_init_rtc,
+	.init_pci		= sable_lynx_init_pci,
+	.kill_arch		= t2_kill_arch,
+	.pci_map_irq		= lynx_map_irq,
+	.pci_swizzle		= lynx_swizzle,
+
+	.sys = { .t2 = {
+	    .gamma_bias		= _GAMMA_BIAS
+	} }
+};
+ALIAS_MV(lynx)
+#endif /* GENERIC || LYNX */
diff -Nru a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c
--- a/arch/alpha/kernel/time.c	Sat Apr 19 19:51:47 2003
+++ b/arch/alpha/kernel/time.c	Sat Apr 19 19:51:47 2003
@@ -331,7 +331,7 @@
 
 	/* From John Bowman <bowman@math.ualberta.ca>: allow the values
 	   to settle, as the Update-In-Progress bit going low isn't good
-	   enough on some hardware.  2ms is our guess; we havn't found 
+	   enough on some hardware.  2ms is our guess; we haven't found 
 	   bogomips yet, but this is close on a 500Mhz box.  */
 	__delay(1000000);
 
diff -Nru a/arch/alpha/lib/strrchr.S b/arch/alpha/lib/strrchr.S
--- a/arch/alpha/lib/strrchr.S	Sat Apr 19 19:51:50 2003
+++ b/arch/alpha/lib/strrchr.S	Sat Apr 19 19:51:50 2003
@@ -2,7 +2,7 @@
  * arch/alpha/lib/strrchr.S
  * Contributed by Richard Henderson (rth@tamu.edu)
  *
- * Return the address of the last occurrance of a given character
+ * Return the address of the last occurrence of a given character
  * within a null-terminated string, or null if it is not found.
  */
 
diff -Nru a/arch/alpha/math-emu/math.c b/arch/alpha/math-emu/math.c
--- a/arch/alpha/math-emu/math.c	Sat Apr 19 19:51:51 2003
+++ b/arch/alpha/math-emu/math.c	Sat Apr 19 19:51:51 2003
@@ -294,7 +294,7 @@
 	 *	  the appropriate signal to the translated program.
 	 *
 	 * In addition, properly track the exception state in software
-	 * as described in the Alpha Architectre Handbook section 4.7.7.3.
+	 * as described in the Alpha Architecture Handbook section 4.7.7.3.
 	 */
 done:
 	if (_fex) {
diff -Nru a/arch/alpha/vmlinux.lds.S b/arch/alpha/vmlinux.lds.S
--- a/arch/alpha/vmlinux.lds.S	Sat Apr 19 19:51:48 2003
+++ b/arch/alpha/vmlinux.lds.S	Sat Apr 19 19:51:48 2003
@@ -32,7 +32,11 @@
   /* Will be freed after init */
   . = ALIGN(8192);				/* Init code and data */
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
 
   . = ALIGN(16);
diff -Nru a/arch/arm/Kconfig b/arch/arm/Kconfig
--- a/arch/arm/Kconfig	Sat Apr 19 19:51:48 2003
+++ b/arch/arm/Kconfig	Sat Apr 19 19:51:48 2003
@@ -138,8 +138,8 @@
 config ARCH_INTEGRATOR
 	bool "Integrator"
 
-config ARCH_IOP310
-	bool "IOP310-based"
+config ARCH_IOP3XX
+	bool "IOP3xx-based"
 
 config ARCH_L7200
 	bool "LinkUp-L7200"
@@ -175,7 +175,7 @@
 
 source "arch/arm/mach-footbridge/Kconfig"
 
-source "arch/arm/mach-iop310/Kconfig"
+source "arch/arm/mach-iop3xx/Kconfig"
 
 source "arch/arm/mach-pxa/Kconfig"
 
@@ -342,7 +342,7 @@
 # XScale
 config CPU_XSCALE
 	bool
-	depends on ARCH_IOP310 || ARCH_ADIFCC || ARCH_PXA
+	depends on ARCH_IOP3XX || ARCH_ADIFCC || ARCH_PXA
 	default y
 
 # Figure out what processor architecture version we should be using.
@@ -359,7 +359,7 @@
 
 config CPU_32v5
 	bool
-	depends on ARCH_IOP310 || ARCH_ADIFCC || ARCH_PXA
+	depends on ARCH_IOP3XX || ARCH_ADIFCC || ARCH_PXA
 	default y
 
 comment "Processor Features"
@@ -436,8 +436,8 @@
 # Now handle the bus types
 config PCI
 	bool
-	default PCI_INTEGRATOR if !ARCH_FTVPCI && !ARCH_SHARK && !FOOTBRIDGE_HOST && !ARCH_IOP310 && ARCH_INTEGRATOR
-	default y if ARCH_FTVPCI || ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP310
+	default PCI_INTEGRATOR if !ARCH_FTVPCI && !ARCH_SHARK && !FOOTBRIDGE_HOST && !ARCH_IOP3XX && ARCH_INTEGRATOR
+	default y if ARCH_FTVPCI || ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP3XX
 	help
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  bus system, i.e. the way the CPU talks to the other stuff inside
@@ -451,7 +451,7 @@
 
 config PCI_INTEGRATOR
 	bool "PCI support"
-	depends on !ARCH_FTVPCI && !ARCH_SHARK && !FOOTBRIDGE_HOST && !ARCH_IOP310 && ARCH_INTEGRATOR
+	depends on !ARCH_FTVPCI && !ARCH_SHARK && !FOOTBRIDGE_HOST && !ARCH_IOP3XX && ARCH_INTEGRATOR
 	help
 	  Find out whether you have a PCI motherboard. PCI is the name of a
 	  bus system, i.e. the way the CPU talks to the other stuff inside
diff -Nru a/arch/arm/Makefile b/arch/arm/Makefile
--- a/arch/arm/Makefile	Sat Apr 19 19:51:46 2003
+++ b/arch/arm/Makefile	Sat Apr 19 19:51:46 2003
@@ -105,7 +105,7 @@
  machine-$(CONFIG_ARCH_CLPS711X)   := clps711x
 textaddr-$(CONFIG_ARCH_FORTUNET)   := 0xc0008000
  machine-$(CONFIG_ARCH_ANAKIN)	   := anakin
- machine-$(CONFIG_ARCH_IOP310)	   := iop310
+ machine-$(CONFIG_ARCH_IOP3XX)	   := iop3xx
  machine-$(CONFIG_ARCH_ADIFCC)	   := adifcc
 
 MACHINE  := $(machine-y)
diff -Nru a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile
--- a/arch/arm/boot/Makefile	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/boot/Makefile	Sat Apr 19 19:51:28 2003
@@ -13,9 +13,6 @@
 #   PARAMS_PHYS must be with 4MB of ZRELADDR
 #   INITRD_PHYS must be in RAM
 
-   zreladdr-$(CONFIG_CPU_26)		:= 0x02080000 
-params_phys-$(CONFIG_CPU_26)		:= 0x0207c000
-initrd_phys-$(CONFIG_CPU_26)		:= 0x02180000
    zreladdr-$(CONFIG_ARCH_RPC)		:= 0x10008000
 params_phys-$(CONFIG_ARCH_RPC)		:= 0x10000100
 initrd_phys-$(CONFIG_ARCH_RPC)		:= 0x18000000
@@ -48,6 +45,7 @@
   zreladdr-$(CONFIG_ARCH_PXA)		:= 0xa0008000
   zreladdr-$(CONFIG_ARCH_ANAKIN)	:= 0x20008000
   zreladdr-$(CONFIG_ARCH_IQ80310)	:= 0xa0008000
+  zreladdr-$(CONFIG_ARCH_IQ80321)	:= 0xa0008000
   zreladdr-$(CONFIG_ARCH_ADIFCC)	:= 0xc0008000
 
 ZRELADDR    := $(zreladdr-y)
diff -Nru a/arch/arm/boot/compressed/head-xscale.S b/arch/arm/boot/compressed/head-xscale.S
--- a/arch/arm/boot/compressed/head-xscale.S	Sat Apr 19 19:51:29 2003
+++ b/arch/arm/boot/compressed/head-xscale.S	Sat Apr 19 19:51:30 2003
@@ -34,6 +34,12 @@
 		bic	r0, r0, #0x1000		@ clear Icache
 		mcr	p15, 0, r0, c1, c0, 0
 
+#ifdef	CONFIG_ARCH_IQ80321
+		orr	pc, pc, #0xa0000000
+		nop
+		mov	r7, #MACH_TYPE_IQ80321
+#endif
+
 #ifdef CONFIG_ARCH_LUBBOCK
 		mov	r7, #MACH_TYPE_LUBBOCK
 #endif
diff -Nru a/arch/arm/common/sa1111.c b/arch/arm/common/sa1111.c
--- a/arch/arm/common/sa1111.c	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/common/sa1111.c	Sat Apr 19 19:51:50 2003
@@ -60,6 +60,7 @@
 	},
 	.skpcr_mask	= SKPCR_UCLKEN,
 	.devid		= SA1111_DEVID_USB,
+	.dma_mask	= 0xffffffffLL,
 	.irq = {
 		IRQ_USBPWR,
 		IRQ_HCIM,
@@ -494,6 +495,7 @@
 
 	sadev->dev.parent = sachip->dev;
 	sadev->dev.bus    = &sa1111_bus_type;
+	sadev->dev.dma_mask = &sadev->dma_mask;
 	sadev->res.start  = sachip->res.start + offset;
 	sadev->res.end    = sadev->res.start + 511;
 	sadev->res.name   = sadev->dev.name;
diff -Nru a/arch/arm/def-configs/iq80310 b/arch/arm/def-configs/iq80310
--- a/arch/arm/def-configs/iq80310	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/def-configs/iq80310	Sat Apr 19 19:51:28 2003
@@ -1,26 +1,31 @@
 #
-# Automatically generated by make menuconfig: don't edit
+# Automatically generated make config: don't edit
 #
 CONFIG_ARM=y
-# CONFIG_EISA is not set
-# CONFIG_SBUS is not set
-# CONFIG_MCA is not set
+CONFIG_MMU=y
 CONFIG_UID16=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
-# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
-# CONFIG_GENERIC_BUST_SPINLOCK is not set
-# CONFIG_GENERIC_ISA_DMA is not set
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-# CONFIG_OBSOLETE is not set
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=14
 
 #
 # Loadable module support
 #
 CONFIG_MODULES=y
+# CONFIG_MODULE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
 # CONFIG_MODVERSIONS is not set
 CONFIG_KMOD=y
 
@@ -33,11 +38,12 @@
 # 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 is not set
 # CONFIG_ARCH_INTEGRATOR is not set
-CONFIG_ARCH_IOP310=y
+CONFIG_ARCH_IOP3XX=y
 # CONFIG_ARCH_L7200 is not set
 # CONFIG_ARCH_RPC is not set
 # CONFIG_ARCH_SA1100 is not set
@@ -46,112 +52,72 @@
 #
 # Archimedes/A5000 Implementations
 #
-# CONFIG_ARCH_ARC is not set
-# CONFIG_ARCH_A5K is not set
 
 #
-# Footbridge Implementations
+# Archimedes/A5000 Implementations (select only ONE)
 #
-# 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 is not set
 
 #
-# SA11x0 Implementations
+# CLPS711X/EP721X Implementations
 #
-# CONFIG_SA1100_ASSABET is not set
-# CONFIG_ASSABET_NEPONSET is not set
-# CONFIG_SA1100_ADSBITSY is not set
-# CONFIG_SA1100_BRUTUS is not set
-# CONFIG_SA1100_CERF is not set
-# CONFIG_SA1100_H3600 is not set
-# CONFIG_SA1100_EXTENEX1 is not set
-# CONFIG_SA1100_FLEXANET is not set
-# CONFIG_SA1100_FREEBIRD is not set
-# CONFIG_SA1100_GRAPHICSCLIENT is not set
-# CONFIG_SA1100_GRAPHICSMASTER is not set
-# CONFIG_SA1100_JORNADA720 is not set
-# CONFIG_SA1100_HUW_WEBPANEL is not set
-# CONFIG_SA1100_ITSY is not set
-# CONFIG_SA1100_LART is not set
-# CONFIG_SA1100_NANOENGINE is not set
-# CONFIG_SA1100_OMNIMETER is not set
-# CONFIG_SA1100_PANGOLIN is not set
-# CONFIG_SA1100_PLEB is not set
-# CONFIG_SA1100_SHANNON is not set
-# CONFIG_SA1100_SHERMAN is not set
-# CONFIG_SA1100_SIMPAD is not set
-# CONFIG_SA1100_PFS168 is not set
-# CONFIG_SA1100_VICTOR is not set
-# CONFIG_SA1100_XP860 is not set
-# CONFIG_SA1100_YOPY is not set
-# CONFIG_SA1100_USB is not set
-# CONFIG_SA1100_USB_NETLINK is not set
-# CONFIG_SA1100_USB_CHAR is not set
 
 #
-# CLPS711X/EP721X Implementations
+# Epxa10db
 #
-# CONFIG_ARCH_AUTCPU12 is not set
-# CONFIG_ARCH_CDB89712 is not set
-# CONFIG_ARCH_CLEP7312 is not set
-# CONFIG_ARCH_EDB7211 is not set
-# CONFIG_ARCH_P720T is not set
-# CONFIG_ARCH_EP7211 is not set
-# CONFIG_ARCH_EP7212 is not set
 
 #
-# IOP310 Implementation Options
+# Footbridge Implementations
+#
+
+#
+# IOP3xx Implementation Options
 #
 CONFIG_ARCH_IQ80310=y
-# CONFIG_IOP310_AAU is not set
-# CONFIG_IOP310_DMA is not set
-# CONFIG_IOP310_MU is not set
-# CONFIG_IOP310_PMON is not set
-# CONFIG_ARCH_ACORN is not set
-# CONFIG_FOOTBRIDGE is not set
-# CONFIG_FOOTBRIDGE_HOST is not set
-# CONFIG_FOOTBRIDGE_ADDIN is not set
+CONFIG_ARCH_IOP310=y
+
+#
+# IOP3xx Chipset Features
+#
+# CONFIG_IOP3XX_AAU is not set
+# CONFIG_IOP3XX_DMA is not set
+# CONFIG_IOP3XX_MU is not set
+# CONFIG_IOP3XX_PMON is not set
+
+#
+# Intel PXA250/210 Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+
+#
+# Processor Type
+#
 CONFIG_CPU_32=y
-# CONFIG_CPU_26 is not set
-# CONFIG_CPU_32v3 is not set
-# CONFIG_CPU_32v4 is not set
-# CONFIG_CPU_ARM610 is not set
-# CONFIG_CPU_ARM710 is not set
-# CONFIG_CPU_ARM720T is not set
-# CONFIG_CPU_ARM920T is not set
-# CONFIG_CPU_ARM922T is not set
-# CONFIG_CPU_ARM926T is not set
-# CONFIG_CPU_ARM1020 is not set
-# CONFIG_CPU_SA110 is not set
-# CONFIG_CPU_SA1100 is not set
-CONFIG_CPU_32v4=y
 CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+
+#
+# Processor Features
+#
 CONFIG_ARM_THUMB=y
-# CONFIG_XSCALE_TOOLS is not set
-# CONFIG_XSCALE_CACHE_WRITE_ALLOC is not set
 CONFIG_XSCALE_PMU=y
-CONFIG_ARM_THUMB=y
-# CONFIG_DISCONTIGMEM is not set
 
 #
 # General setup
 #
-CONFIG_ZBOOT_ROM=y
+CONFIG_PCI=y
+# CONFIG_ZBOOT_ROM is not set
 CONFIG_ZBOOT_ROM_TEXT=0x00060000
 CONFIG_ZBOOT_ROM_BSS=0xa1008000
-CONFIG_PCI=y
-# CONFIG_ISA is not set
-# CONFIG_ISA_DMA is not set
+# CONFIG_PCI_LEGACY_PROC is not set
 CONFIG_PCI_NAMES=y
 # CONFIG_HOTPLUG is not set
-# CONFIG_PCMCIA is not set
-CONFIG_NET=y
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
+
+#
+# At least one math emulation must be selected
+#
 CONFIG_FPE_NWFPE=y
 # CONFIG_FPE_FASTFPE is not set
 CONFIG_KCORE_ELF=y
@@ -160,6 +126,7 @@
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 # CONFIG_PM is not set
+# CONFIG_PREEMPT is not set
 # CONFIG_ARTHUR is not set
 CONFIG_CMDLINE="console=ttyS0,115200 ip=bootp mem=32M root=/dev/nfs initrd=0xc0800000,4M"
 CONFIG_ALIGNMENT_TRAP=y
@@ -175,9 +142,14 @@
 CONFIG_MTD=y
 # CONFIG_MTD_DEBUG is not set
 CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_CONCAT is not set
 CONFIG_MTD_REDBOOT_PARTS=y
-# CONFIG_MTD_BOOTLDR_PARTS is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
 # CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
 CONFIG_MTD_CHAR=y
 CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
@@ -196,9 +168,6 @@
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_ABSENT is not set
 # CONFIG_MTD_OBSOLETE_CHIPS is not set
-# CONFIG_MTD_AMDSTD is not set
-# CONFIG_MTD_SHARP is not set
-# CONFIG_MTD_JEDEC is not set
 
 #
 # Mapping drivers for chip access
@@ -206,12 +175,10 @@
 # CONFIG_MTD_PHYSMAP is not set
 # CONFIG_MTD_NORA is not set
 # CONFIG_MTD_ARM_INTEGRATOR is not set
-# CONFIG_MTD_CDB89712 is not set
-# CONFIG_MTD_SA1100 is not set
-# CONFIG_MTD_DC21285 is not set
 CONFIG_MTD_IQ80310=y
-# CONFIG_MTD_EPXA10DB is not set
+# CONFIG_MTD_EDB7312 is not set
 # CONFIG_MTD_PCI is not set
+# CONFIG_MTD_UCLINUX is not set
 
 #
 # Self-contained MTD device drivers
@@ -220,10 +187,13 @@
 # CONFIG_MTD_SLRAM is not set
 # CONFIG_MTD_MTDRAM is not set
 # CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
 # CONFIG_MTD_DOC1000 is not set
 # CONFIG_MTD_DOC2000 is not set
 # CONFIG_MTD_DOC2001 is not set
-# CONFIG_MTD_DOCPROBE is not set
 
 #
 # NAND Flash Device Drivers
@@ -231,20 +201,18 @@
 # CONFIG_MTD_NAND is not set
 
 #
-# Plug and Play configuration
+# Plug and Play support
 #
 # CONFIG_PNP is not set
-# CONFIG_ISAPNP 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 is not set
 # CONFIG_BLK_DEV_NBD is not set
 CONFIG_BLK_DEV_RAM=y
@@ -255,25 +223,22 @@
 # Multi-device support (RAID and LVM)
 #
 # CONFIG_MD is not set
-# CONFIG_BLK_DEV_MD is not set
-# CONFIG_MD_LINEAR is not set
-# CONFIG_MD_RAID0 is not set
-# CONFIG_MD_RAID1 is not set
-# CONFIG_MD_RAID5 is not set
-# CONFIG_MD_MULTIPATH is not set
-# CONFIG_BLK_DEV_LVM is not set
+
+#
+# Networking support
+#
+CONFIG_NET=y
 
 #
 # Networking options
 #
 # CONFIG_PACKET is not set
-CONFIG_NETLINK=y
-CONFIG_RTNETLINK=y
 # CONFIG_NETLINK_DEV is not set
 CONFIG_NETFILTER=y
 # CONFIG_NETFILTER_DEBUG is not set
 # CONFIG_FILTER is not set
 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
@@ -286,26 +251,33 @@
 # 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_XFRM_USER is not set
 
 #
-#   IP: Netfilter Configuration
+# IP: Netfilter Configuration
 #
 # CONFIG_IP_NF_CONNTRACK is not set
 # CONFIG_IP_NF_QUEUE is not set
 # CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES 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_KHTTPD 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_IPX is not set
-# CONFIG_ATALK is not set
+# CONFIG_LLC is not set
 # CONFIG_DECNET is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_X25 is not set
 # CONFIG_LAPB is not set
-# CONFIG_LLC is not set
 # CONFIG_NET_DIVERT is not set
 # CONFIG_ECONET is not set
 # CONFIG_WAN_ROUTER is not set
@@ -318,8 +290,9 @@
 # CONFIG_NET_SCHED is not set
 
 #
-# Network device support
+# Network testing
 #
+# CONFIG_NET_PKTGEN is not set
 CONFIG_NETDEVICES=y
 
 #
@@ -336,62 +309,50 @@
 # Ethernet (10 or 100Mbit)
 #
 CONFIG_NET_ETHERNET=y
-# CONFIG_ARM_AM79C961A is not set
-# CONFIG_SUNLANCE is not set
+CONFIG_MII=y
 # CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNBMAC is not set
-# CONFIG_SUNQE is not set
-# CONFIG_SUNLANCE is not set
 # CONFIG_SUNGEM is not set
 # CONFIG_NET_VENDOR_3COM is not set
-# CONFIG_LANCE is not set
-# CONFIG_NET_VENDOR_SMC is not set
-# CONFIG_NET_VENDOR_RACAL is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
 # CONFIG_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_APRICOT is not set
-# CONFIG_CS89x0 is not set
-# CONFIG_TULIP is not set
-# CONFIG_DE4X5 is not set
+# CONFIG_B44 is not set
 # CONFIG_DGRS is not set
-# CONFIG_DM9102 is not set
 CONFIG_EEPRO100=y
-# CONFIG_LNE390 is not set
+# CONFIG_EEPRO100_PIO is not set
+# CONFIG_E100 is not set
 # CONFIG_FEALNX is not set
 # CONFIG_NATSEMI is not set
 # CONFIG_NE2K_PCI is not set
-# CONFIG_NE3210 is not set
-# CONFIG_ES3210 is not set
 # CONFIG_8139CP is not set
 # CONFIG_8139TOO is not set
-# CONFIG_8139TOO_PIO is not set
-# CONFIG_8139TOO_TUNE_TWISTER is not set
-# CONFIG_8139TOO_8129 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_VIA_RHINE_MMIO is not set
-# CONFIG_WINBOND_840 is not set
-# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
 #
 # CONFIG_ACENIC is not set
 # CONFIG_DL2K is not set
-# CONFIG_MYRI_SBUS 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_SK98LIN is not set
+# CONFIG_TIGON3 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
 
@@ -401,10 +362,8 @@
 # CONFIG_NET_RADIO is not set
 
 #
-# Token Ring devices
+# Token Ring devices (depends on LLC=y)
 #
-# CONFIG_TR is not set
-# CONFIG_NET_FC is not set
 # CONFIG_RCPCI is not set
 # CONFIG_SHAPER is not set
 
@@ -414,17 +373,17 @@
 # CONFIG_WAN is not set
 
 #
-# Amateur Radio support
+# IrDA (infrared) support
 #
-# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
 
 #
-# IrDA (infrared) support
+# Amateur Radio support
 #
-# CONFIG_IRDA is not set
+# CONFIG_HAMRADIO is not set
 
 #
-# ATA/IDE/MFM/RLL support
+# ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
 
@@ -432,54 +391,22 @@
 # IDE, ATA and ATAPI Block devices
 #
 CONFIG_BLK_DEV_IDE=y
-# CONFIG_BLK_DEV_HD_IDE is not set
+
+#
+# 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_BLK_DEV_IDECS 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 is not set
-# CONFIG_BLK_DEV_IDESCSI is not set
-# CONFIG_BLK_DEV_CMD640 is not set
-# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
-# CONFIG_BLK_DEV_ISAPNP is not set
-# CONFIG_BLK_DEV_RZ1000 is not set
-# CONFIG_IDEPCI_SHARE_IRQ is not set
-CONFIG_BLK_DEV_IDEDMA_PCI=y
-# CONFIG_BLK_DEV_OFFBOARD is not set
-CONFIG_IDEDMA_PCI_AUTO=y
-CONFIG_BLK_DEV_IDEDMA=y
-# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set
-# CONFIG_BLK_DEV_AEC62XX is not set
-# CONFIG_AEC62XX_TUNING is not set
-# CONFIG_BLK_DEV_ALI15X3 is not set
-# CONFIG_WDC_ALI15X3 is not set
-# CONFIG_BLK_DEV_AMD74XX is not set
-# CONFIG_AMD74XX_OVERRIDE is not set
-CONFIG_BLK_DEV_CMD64X=y
-# CONFIG_BLK_DEV_CY82C693 is not set
-# CONFIG_BLK_DEV_CS5530 is not set
-# CONFIG_BLK_DEV_HPT34X is not set
-# CONFIG_HPT34X_AUTODMA is not set
-# CONFIG_BLK_DEV_HPT366 is not set
-# CONFIG_BLK_DEV_NS87415 is not set
-# CONFIG_BLK_DEV_OPTI621 is not set
-# CONFIG_BLK_DEV_PDC202XX is not set
-# CONFIG_PDC202XX_BURST is not set
-# CONFIG_PDC202XX_FORCE is not set
-# CONFIG_BLK_DEV_SVWKS is not set
-# CONFIG_BLK_DEV_SIS5513 is not set
-# CONFIG_BLK_DEV_TRM290 is not set
-# CONFIG_BLK_DEV_VIA82CXXX is not set
-# CONFIG_BLK_DEV_SL82C105 is not set
-# CONFIG_IDE_CHIPSETS is not set
-CONFIG_IDEDMA_AUTO=y
-# CONFIG_IDEDMA_IVB is not set
-CONFIG_BLK_DEV_IDE_MODES=y
-# CONFIG_BLK_DEV_ATARAID is not set
-# CONFIG_BLK_DEV_ATARAID_PDC is not set
-# CONFIG_BLK_DEV_ATARAID_HPT is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+# CONFIG_BLK_DEV_IDEPCI is not set
 
 #
 # SCSI support
@@ -495,59 +422,50 @@
 # I2O device support
 #
 # CONFIG_I2O is not set
-# CONFIG_I2O_PCI is not set
-# CONFIG_I2O_BLOCK is not set
-# CONFIG_I2O_LAN is not set
-# CONFIG_I2O_SCSI is not set
-# CONFIG_I2O_PROC is not set
 
 #
 # ISDN subsystem
 #
-# CONFIG_ISDN is not set
+# CONFIG_ISDN_BOOL is not set
 
 #
-# Input core support
+# Input device support
 #
 # CONFIG_INPUT is not set
-# CONFIG_INPUT_KEYBDEV is not set
-# CONFIG_INPUT_MOUSEDEV is not set
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_EVDEV is not set
+
+#
+# Userland interfaces
+#
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+# CONFIG_SERIO is not set
+
+#
+# Input Device Drivers
+#
 
 #
 # Character devices
 #
-# CONFIG_VT is not set
-CONFIG_SERIAL=y
-CONFIG_SERIAL_CONSOLE=y
-# CONFIG_SERIAL_EXTENDED is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_ANAKIN is not set
-# CONFIG_SERIAL_ANAKIN_CONSOLE is not set
-# CONFIG_SERIAL_AMBA is not set
-# CONFIG_SERIAL_AMBA_CONSOLE is not set
-# CONFIG_SERIAL_CLPS711X is not set
-# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
-# CONFIG_SERIAL_21285 is not set
-# CONFIG_SERIAL_21285_OLD is not set
-# CONFIG_SERIAL_21285_CONSOLE is not set
-# CONFIG_SERIAL_UART00 is not set
-# CONFIG_SERIAL_UART00_CONSOLE is not set
-# CONFIG_SERIAL_SA1100 is not set
-# CONFIG_SERIAL_SA1100_CONSOLE is not set
-# CONFIG_SERIAL_8250 is not set
-# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
 # CONFIG_SERIAL_8250_EXTENDED is not set
-# CONFIG_SERIAL_8250_MANY_PORTS is not set
-# CONFIG_SERIAL_8250_SHARE_IRQ is not set
-# CONFIG_SERIAL_8250_DETECT_IRQ is not set
-# CONFIG_SERIAL_8250_MULTIPORT is not set
-# CONFIG_SERIAL_8250_HUB6 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_DZ is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_UNIX98_PTY_COUNT=256
 
@@ -557,36 +475,36 @@
 # CONFIG_I2C is not set
 
 #
+# I2C Hardware Sensors Mainboard support
+#
+
+#
+# I2C Hardware Sensors Chip support
+#
+
+#
 # L3 serial bus support
 #
 # CONFIG_L3 is not set
-# CONFIG_L3_ALGOBIT is not set
-# CONFIG_L3_BIT_SA1100_GPIO is not set
-# CONFIG_L3_SA1111 is not set
-# CONFIG_BIT_SA1100_GPIO is not set
 
 #
 # Mice
 #
 # CONFIG_BUSMOUSE is not set
-CONFIG_MOUSE=y
-CONFIG_PSMOUSE=y
-# CONFIG_82C710_MOUSE is not set
-# CONFIG_PC110_PAD is not set
+# CONFIG_QIC02_TAPE is not set
 
 #
-# Joysticks
+# IPMI
 #
-# CONFIG_INPUT_GAMEPORT is not set
-# CONFIG_QIC02_TAPE is not set
+# CONFIG_IPMI_HANDLER is not set
 
 #
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
-# CONFIG_INTEL_RNG is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
+# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
@@ -597,88 +515,130 @@
 # CONFIG_FTAPE is not set
 # CONFIG_AGP is not set
 # CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_HANGCHECK_TIMER is not set
 
 #
 # Multimedia devices
 #
-# CONFIG_VIDEO_DEV is not set
+CONFIG_VIDEO_DEV=y
+
+#
+# Video For Linux
+#
+# CONFIG_VIDEO_PROC_FS is not set
+
+#
+# Video Adapters
+#
+# CONFIG_VIDEO_PMS is not set
+# CONFIG_VIDEO_CPIA is not set
+# CONFIG_VIDEO_STRADIS is not set
+
+#
+# Radio Adapters
+#
+# CONFIG_RADIO_GEMTEK_PCI is not set
+# CONFIG_RADIO_MAXIRADIO is not set
+# CONFIG_RADIO_MAESTRO is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+CONFIG_DVB=y
+CONFIG_DVB_CORE=y
+
+#
+# Supported Frontend Modules
+#
+CONFIG_DVB_ALPS_BSRU6=y
+# CONFIG_DVB_ALPS_BSRV2 is not set
+# CONFIG_DVB_ALPS_TDLB7 is not set
+# CONFIG_DVB_ALPS_TDMB7 is not set
+# CONFIG_DVB_GRUNDIG_29504_491 is not set
+# CONFIG_DVB_GRUNDIG_29504_401 is not set
+# CONFIG_DVB_VES1820 is not set
+
+#
+# Supported DVB Adapters
+#
+# CONFIG_DVB_AV7110 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 is not set
 # CONFIG_AUTOFS4_FS is not set
-# CONFIG_REISERFS_FS is not set
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS 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_TMPFS=y
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
 # CONFIG_ADFS_FS is not set
-# CONFIG_ADFS_FS_RW 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 is not set
-# CONFIG_JBD is not set
-# CONFIG_JBD_DEBUG is not set
-# CONFIG_FAT_FS is not set
-# CONFIG_MSDOS_FS is not set
-# CONFIG_UMSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
 # CONFIG_EFS_FS is not set
 # CONFIG_JFFS_FS is not set
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
+# CONFIG_JFFS2_FS_NAND is not set
 # CONFIG_CRAMFS is not set
-CONFIG_TMPFS=y
-# CONFIG_RAMFS is not set
-# CONFIG_ISO9660_FS is not set
-# CONFIG_JOLIET is not set
-# CONFIG_ZISOFS is not set
-# CONFIG_MINIX_FS is not set
 # CONFIG_VXFS_FS is not set
-# CONFIG_NTFS_FS is not set
-# CONFIG_NTFS_DEBUG is not set
-# CONFIG_NTFS_RW is not set
 # CONFIG_HPFS_FS is not set
-CONFIG_PROC_FS=y
-# CONFIG_DEVFS_FS is not set
-# CONFIG_DEVFS_MOUNT is not set
-# CONFIG_DEVFS_DEBUG is not set
-CONFIG_DEVPTS_FS=y
 # CONFIG_QNX4FS_FS is not set
-# CONFIG_QNX4FS_RW is not set
-# CONFIG_ROMFS_FS is not set
-CONFIG_EXT2_FS=y
 # CONFIG_SYSV_FS is not set
-# CONFIG_UDF_FS is not set
-# CONFIG_UDF_RW is not set
 # CONFIG_UFS_FS is not set
-# CONFIG_UFS_FS_WRITE 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 is not set
-CONFIG_ROOT_NFS=y
+# CONFIG_NFS_V4 is not set
 # CONFIG_NFSD is not set
-# CONFIG_NFSD_V3 is not set
-CONFIG_SUNRPC=y
+CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
+# CONFIG_EXPORTFS is not set
 # CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
 # CONFIG_NCP_FS is not set
-# CONFIG_NCPFS_PACKET_SIGNING is not set
-# CONFIG_NCPFS_IOCTL_LOCKING is not set
-# CONFIG_NCPFS_STRONG is not set
-# CONFIG_NCPFS_NFS_NS is not set
-# CONFIG_NCPFS_OS2_NS is not set
-# CONFIG_NCPFS_SMALLDOS is not set
-# CONFIG_NCPFS_NLS is not set
-# CONFIG_NCPFS_EXTRAS is not set
-# CONFIG_ZISOFS_FS is not set
-# CONFIG_ZLIB_FS_INFLATE is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_INTERMEZZO_FS is not set
+CONFIG_SUNRPC=y
+# CONFIG_SUNRPC_GSS is not set
+# CONFIG_AFS_FS is not set
 
 #
 # Partition Types
@@ -698,8 +658,19 @@
 # CONFIG_SGI_PARTITION is not set
 # CONFIG_ULTRIX_PARTITION is not set
 # CONFIG_SUN_PARTITION is not set
-# CONFIG_SMB_NLS is not set
-# CONFIG_NLS is not set
+# CONFIG_EFI_PARTITION 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
@@ -707,76 +678,23 @@
 # CONFIG_SOUND is not set
 
 #
+# Misc devices
+#
+
+#
 # Multimedia Capabilities Port drivers
 #
 # CONFIG_MCP is not set
-# CONFIG_MCP_SA1100 is not set
-# CONFIG_MCP_UCB1200 is not set
-# CONFIG_MCP_UCB1200_AUDIO is not set
-# CONFIG_MCP_UCB1200_TS is not set
+
+#
+# Console Switches
+#
+# CONFIG_SWITCHES is not set
 
 #
 # USB support
 #
 # CONFIG_USB is not set
-# CONFIG_USB_UHCI is not set
-# CONFIG_USB_UHCI_ALT is not set
-# CONFIG_USB_OHCI is not set
-# CONFIG_USB_OHCI_SA1111 is not set
-# CONFIG_USB_AUDIO is not set
-# CONFIG_USB_BLUETOOTH is not set
-# CONFIG_USB_STORAGE is not set
-# CONFIG_USB_STORAGE_DEBUG is not set
-# CONFIG_USB_STORAGE_DATAFAB is not set
-# CONFIG_USB_STORAGE_FREECOM is not set
-# CONFIG_USB_STORAGE_ISD200 is not set
-# CONFIG_USB_STORAGE_DPCM is not set
-# CONFIG_USB_STORAGE_HP8200e is not set
-# CONFIG_USB_STORAGE_SDDR09 is not set
-# CONFIG_USB_STORAGE_JUMPSHOT is not set
-# CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
-# CONFIG_USB_DC2XX is not set
-# CONFIG_USB_MDC800 is not set
-# CONFIG_USB_SCANNER is not set
-# CONFIG_USB_MICROTEK is not set
-# CONFIG_USB_HPUSBSCSI is not set
-# CONFIG_USB_PEGASUS is not set
-# CONFIG_USB_KAWETH is not set
-# CONFIG_USB_CATC is not set
-# CONFIG_USB_CDCETHER is not set
-# CONFIG_USB_USBNET is not set
-# CONFIG_USB_USS720 is not set
-
-#
-# USB Serial Converter support
-#
-# CONFIG_USB_SERIAL is not set
-# CONFIG_USB_SERIAL_GENERIC is not set
-# CONFIG_USB_SERIAL_BELKIN is not set
-# CONFIG_USB_SERIAL_WHITEHEAT is not set
-# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
-# CONFIG_USB_SERIAL_EMPEG is not set
-# CONFIG_USB_SERIAL_FTDI_SIO is not set
-# CONFIG_USB_SERIAL_VISOR is not set
-# CONFIG_USB_SERIAL_IR is not set
-# CONFIG_USB_SERIAL_EDGEPORT is not set
-# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
-# CONFIG_USB_SERIAL_KEYSPAN is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
-# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
-# CONFIG_USB_SERIAL_MCT_U232 is not set
-# CONFIG_USB_SERIAL_PL2303 is not set
-# CONFIG_USB_SERIAL_CYBERJACK is not set
-# CONFIG_USB_SERIAL_XIRCOM is not set
-# CONFIG_USB_SERIAL_OMNINET is not set
-# CONFIG_USB_RIO500 is not set
 
 #
 # Bluetooth support
@@ -789,7 +707,6 @@
 CONFIG_FRAME_POINTER=y
 CONFIG_DEBUG_USER=y
 # CONFIG_DEBUG_INFO is not set
-# CONFIG_NO_PGT_CACHE is not set
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_MAGIC_SYSRQ is not set
@@ -797,6 +714,22 @@
 # CONFIG_DEBUG_WAITQ is not set
 CONFIG_DEBUG_BUGVERBOSE=y
 CONFIG_DEBUG_ERRORS=y
+CONFIG_KALLSYMS=y
 CONFIG_DEBUG_LL=y
-# CONFIG_DEBUG_DC21285_PORT is not set
-# CONFIG_DEBUG_CLPS711X_UART2 is not set
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC32 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -Nru a/arch/arm/def-configs/iq80321 b/arch/arm/def-configs/iq80321
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/def-configs/iq80321	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,695 @@
+#
+# 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 is not set
+
+#
+# General setup
+#
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=14
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+# CONFIG_MODULE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+CONFIG_KMOD=y
+
+#
+# System Type
+#
+# 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
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_CAMELOT is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+CONFIG_ARCH_IOP3XX=y
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SHARK is not set
+
+#
+# Archimedes/A5000 Implementations
+#
+
+#
+# Archimedes/A5000 Implementations (select only ONE)
+#
+
+#
+# CLPS711X/EP721X Implementations
+#
+
+#
+# Epxa10db
+#
+
+#
+# Footbridge Implementations
+#
+
+#
+# IOP3xx Implementation Options
+#
+# CONFIG_ARCH_IQ80310 is not set
+CONFIG_ARCH_IQ80321=y
+# CONFIG_ARCH_IOP310 is not set
+CONFIG_ARCH_IOP321=y
+
+#
+# IOP3xx Chipset Features
+#
+
+#
+# Intel PXA250/210 Implementations
+#
+
+#
+# SA11x0 Implementations
+#
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_XSCALE=y
+CONFIG_CPU_32v5=y
+
+#
+# Processor Features
+#
+CONFIG_XSCALE_PMU=y
+
+#
+# General setup
+#
+CONFIG_PCI=y
+# CONFIG_ZBOOT_ROM is not set
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+# CONFIG_PCI_LEGACY_PROC is not set
+CONFIG_PCI_NAMES=y
+# CONFIG_HOTPLUG is not set
+
+#
+# At least one math emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+CONFIG_KCORE_ELF=y
+# CONFIG_KCORE_AOUT is not set
+CONFIG_BINFMT_AOUT=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_PM is not set
+# CONFIG_ARTHUR is not set
+CONFIG_CMDLINE="ip=boot root=nfs console=ttyS0,115200"
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Parallel port support
+#
+# CONFIG_PARPORT is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_REDBOOT_PARTS=y
+# CONFIG_MTD_CMDLINE_PARTS is not set
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_NORA is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+CONFIG_MTD_IQ80321=y
+# CONFIG_MTD_EDB7312 is not set
+# CONFIG_MTD_PCI is not set
+# CONFIG_MTD_UCLINUX is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLKMTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC1000 is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND 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_LOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_SIZE=8192
+# 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 is not set
+# CONFIG_NETLINK_DEV is not set
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_DEBUG is not set
+# CONFIG_FILTER is not set
+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 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_INET_ECN is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_XFRM_USER is not set
+
+#
+# IP: Netfilter Configuration
+#
+# CONFIG_IP_NF_CONNTRACK is not set
+# CONFIG_IP_NF_IPTABLES is not set
+# CONFIG_IP_NF_ARPTABLES is not set
+# CONFIG_IP_NF_COMPAT_IPCHAINS is not set
+# CONFIG_IP_NF_COMPAT_IPFWADM is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_LLC is not set
+# CONFIG_DECNET is not set
+# CONFIG_BRIDGE 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
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+# CONFIG_HAPPYMEAL is not set
+# CONFIG_SUNGEM is not set
+# CONFIG_NET_VENDOR_3COM is not set
+
+#
+# Tulip family network device support
+#
+# CONFIG_NET_TULIP is not set
+# CONFIG_HP100 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_DGRS is not set
+CONFIG_EEPRO100=y
+# CONFIG_EEPRO100_PIO is not set
+# CONFIG_E100 is not set
+# CONFIG_FEALNX is not set
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI 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
+
+#
+# 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_R8169 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_FDDI 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 (depends on LLC=y)
+#
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+
+#
+# IrDA (infrared) support
+#
+# CONFIG_IRDA is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO 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_IDEFLOPPY is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_BLK_DEV_IDEPCI=y
+# CONFIG_BLK_DEV_GENERIC is not set
+# CONFIG_IDEPCI_SHARE_IRQ is not set
+CONFIG_BLK_DEV_IDEDMA_PCI=y
+# CONFIG_BLK_DEV_OFFBOARD is not set
+# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
+CONFIG_IDEDMA_PCI_AUTO=y
+# CONFIG_IDEDMA_ONLYDISK is not set
+CONFIG_BLK_DEV_IDEDMA=y
+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_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_SL82C105 is not set
+CONFIG_IDEDMA_AUTO=y
+# CONFIG_IDEDMA_IVB is not set
+CONFIG_BLK_DEV_IDE_MODES=y
+
+#
+# SCSI support
+#
+# CONFIG_SCSI is not set
+
+#
+# I2O device support
+#
+# CONFIG_I2O is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN_BOOL is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Userland interfaces
+#
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+# CONFIG_SERIO is not set
+
+#
+# Input Device Drivers
+#
+
+#
+# Character devices
+#
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_DZ is not set
+CONFIG_UNIX98_PTYS=y
+CONFIG_UNIX98_PTY_COUNT=256
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# I2C Hardware Sensors Mainboard support
+#
+
+#
+# I2C Hardware Sensors Chip support
+#
+
+#
+# L3 serial bus support
+#
+# CONFIG_L3 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_RTC is not set
+# CONFIG_GEN_RTC 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
+# CONFIG_HANGCHECK_TIMER is not set
+
+#
+# Multimedia devices
+#
+CONFIG_VIDEO_DEV=y
+
+#
+# Video For Linux
+#
+# CONFIG_VIDEO_PROC_FS is not set
+
+#
+# Video Adapters
+#
+# CONFIG_VIDEO_PMS is not set
+# CONFIG_VIDEO_CPIA is not set
+
+#
+# Radio Adapters
+#
+# CONFIG_RADIO_GEMTEK_PCI is not set
+# CONFIG_RADIO_MAXIRADIO is not set
+# CONFIG_RADIO_MAESTRO is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB 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 is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS 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_DEVPTS_FS=y
+CONFIG_TMPFS=y
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_JFFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+# 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 is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+# CONFIG_EXPORTFS 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_SUNRPC=y
+
+#
+# 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_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_EFI_PARTITION 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
+
+#
+# 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
+
+#
+# Bluetooth support
+#
+# CONFIG_BT 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 is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_WAITQ is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_ERRORS=y
+# CONFIG_KALLSYMS is not set
+CONFIG_DEBUG_LL=y
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC32 is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
diff -Nru a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
--- a/arch/arm/kernel/Makefile	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/kernel/Makefile	Sat Apr 19 19:51:50 2003
@@ -27,10 +27,8 @@
   obj-y		+= io.o
 endif
 
-ifeq ($(CONFIG_CPU_32),y)
 head-y			:= head.o
 obj-$(CONFIG_DEBUG_LL)	+= debug.o
-endif
 
 extra-y := $(head-y) init_task.o
 
diff -Nru a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c
--- a/arch/arm/kernel/armksyms.c	Sat Apr 19 19:51:46 2003
+++ b/arch/arm/kernel/armksyms.c	Sat Apr 19 19:51:46 2003
@@ -95,11 +95,6 @@
 EXPORT_SYMBOL_ALIAS(fp_printk,printk);
 EXPORT_SYMBOL_ALIAS(fp_send_sig,send_sig);
 
-#ifdef CONFIG_CPU_26
-EXPORT_SYMBOL(fpundefinstr);
-EXPORT_SYMBOL(ret_from_exception);
-#endif
-
 #ifdef CONFIG_VT
 EXPORT_SYMBOL(kd_mksound);
 #endif
@@ -111,10 +106,8 @@
 EXPORT_SYMBOL(dump_thread);
 EXPORT_SYMBOL(dump_fpu);
 EXPORT_SYMBOL(udelay);
-#ifdef CONFIG_CPU_32
 EXPORT_SYMBOL(__ioremap);
 EXPORT_SYMBOL(__iounmap);
-#endif
 EXPORT_SYMBOL(kernel_thread);
 EXPORT_SYMBOL(system_rev);
 EXPORT_SYMBOL(system_serial_low);
@@ -196,7 +189,6 @@
 EXPORT_SYMBOL_NOVERS(__memzero);
 
 	/* user mem (segment) */
-#if defined(CONFIG_CPU_32)
 EXPORT_SYMBOL(__arch_copy_from_user);
 EXPORT_SYMBOL(__arch_copy_to_user);
 EXPORT_SYMBOL(__arch_clear_user);
@@ -206,11 +198,6 @@
 EXPORT_SYMBOL(consistent_alloc);
 EXPORT_SYMBOL(consistent_free);
 EXPORT_SYMBOL(consistent_sync);
-
-#elif defined(CONFIG_CPU_26)
-EXPORT_SYMBOL(uaccess_kernel);
-EXPORT_SYMBOL(uaccess_user);
-#endif
 
 EXPORT_SYMBOL_NOVERS(__get_user_1);
 EXPORT_SYMBOL_NOVERS(__get_user_2);
diff -Nru a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
--- a/arch/arm/kernel/asm-offsets.c	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/kernel/asm-offsets.c	Sat Apr 19 19:51:28 2003
@@ -21,10 +21,7 @@
 /*
  * Make sure that the compiler and target are compatible.
  */
-#if defined(__APCS_32__) && defined(CONFIG_CPU_26)
-#error Sorry, your compiler targets APCS-32 but this kernel requires APCS-26
-#endif
-#if defined(__APCS_26__) && defined(CONFIG_CPU_32)
+#if defined(__APCS_26__)
 #error Sorry, your compiler targets APCS-26 but this kernel requires APCS-32
 #endif
 #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 95)
@@ -52,7 +49,6 @@
   BLANK();
   DEFINE(VM_EXEC,	       	VM_EXEC);
   BLANK();
-#ifdef CONFIG_CPU_32
   DEFINE(HPTE_TYPE_SMALL,      	PTE_TYPE_SMALL);
   DEFINE(HPTE_AP_READ,		PTE_AP_READ);
   DEFINE(HPTE_AP_WRITE,		PTE_AP_WRITE);
@@ -65,15 +61,7 @@
   DEFINE(LPTE_WRITE,		L_PTE_WRITE);
   DEFINE(LPTE_EXEC,		L_PTE_EXEC);
   DEFINE(LPTE_DIRTY,		L_PTE_DIRTY);
-#endif
   BLANK();
-#ifdef CONFIG_CPU_26
-  DEFINE(PAGE_PRESENT,		_PAGE_PRESENT);
-  DEFINE(PAGE_READONLY,		_PAGE_READONLY);
-  DEFINE(PAGE_NOT_USER,		_PAGE_NOT_USER);
-  DEFINE(PAGE_OLD,		_PAGE_OLD);
-  DEFINE(PAGE_CLEAN,		_PAGE_CLEAN);
-#endif
   BLANK();
   DEFINE(PAGE_SZ,	       	PAGE_SIZE);
   BLANK();
diff -Nru a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S
--- a/arch/arm/kernel/debug.S	Sat Apr 19 19:51:46 2003
+++ b/arch/arm/kernel/debug.S	Sat Apr 19 19:51:46 2003
@@ -410,11 +410,17 @@
 		bne	1001b
 		.endm
 
-#elif defined(CONFIG_ARCH_IQ80310)
+#elif defined(CONFIG_ARCH_IOP3XX)
 
 		.macro	addruart,rx
 		mov	\rx, #0xfe000000	@ physical
-		orr	\rx, \rx, #0x00810000
+#ifdef CONFIG_ARCH_IQ80310
+		orr	\rx, \rx, #0x00810000	@ location of the UART
+#elif defined(CONFIG_ARCH_IQ80321)
+		orr	\rx, \rx, #0x00800000	@ location of the UART
+#else
+#error Unknown IOP3XX implementation
+#endif
 		.endm
 
 		.macro	senduart,rd,rx
@@ -429,9 +435,11 @@
 		.endm
 
 		.macro	waituart,rd,rx
+#ifndef	CONFIG_ARCH_IQ80321
 1001:		ldrb	\rd, [\rx, #0x6]
 		tst	\rd, #0x10
 		beq	1001b
+#endif
 		.endm
 
 #elif defined(CONFIG_ARCH_ADI_EVB)
diff -Nru a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c
--- a/arch/arm/kernel/ecard.c	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/kernel/ecard.c	Sat Apr 19 19:51:50 2003
@@ -220,7 +220,6 @@
 	}
 }
 
-#ifdef CONFIG_CPU_32
 #include <linux/completion.h>
 
 static pid_t ecard_pid;
@@ -341,13 +340,6 @@
 	 */
 	wait_for_completion(&ecard_completion);
 }
-#else
-/*
- * On 26-bit processors, we don't need the kcardd thread to access the
- * expansion card loaders.  We do it directly.
- */
-#define ecard_call(req)	ecard_do_request(req)
-#endif
 
 /* ======================= Mid-level card control ===================== */
 
@@ -1026,9 +1018,7 @@
 {
 	int slot, irqhw;
 
-#ifdef CONFIG_CPU_32
 	init_waitqueue_head(&ecard_wait);
-#endif
 
 	printk("Probing expansion cards\n");
 
diff -Nru a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
--- a/arch/arm/kernel/entry-armv.S	Sat Apr 19 19:51:30 2003
+++ b/arch/arm/kernel/entry-armv.S	Sat Apr 19 19:51:30 2003
@@ -584,6 +584,28 @@
   		.macro	irq_prio_table
  		.endm
 
+#elif defined(CONFIG_ARCH_IOP321)
+		.macro  disable_fiq
+		.endm
+
+		/*
+		 * Note: only deal with normal interrupts, not FIQ
+		 */
+		.macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+		mov     \irqnr, #0
+		mrc     p6, 0, \irqstat, c8, c0, 0      @ Read IINTSRC
+		cmp     \irqstat, #0
+		beq     1001f
+		clz     \irqnr, \irqstat
+		mov     \base, #31
+		subs    \irqnr,\base,\irqnr
+		add     \irqnr,\irqnr,#IRQ_IOP321_DMA0_EOT
+1001:
+		.endm
+
+		.macro  irq_prio_table
+		.endm
+
 #elif defined(CONFIG_ARCH_PXA)
 
 		.macro	disable_fiq
diff -Nru a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S
--- a/arch/arm/kernel/entry-header.S	Sat Apr 19 19:51:47 2003
+++ b/arch/arm/kernel/entry-header.S	Sat Apr 19 19:51:47 2003
@@ -41,14 +41,8 @@
 @ Stack format (ensured by USER_* and SVC_*)
 @
 #define S_FRAME_SIZE	72
-#ifdef CONFIG_CPU_32
 #define S_OLD_R0	68
 #define S_PSR		64
-#else
-#define S_OLD_R0	64
-#define S_PSR		60
-#define S_PC		60
-#endif
 
 #define S_PC		60
 #define S_LR		56
@@ -68,8 +62,6 @@
 #define S_R0		0
 #define S_OFF		8
 
-#ifdef CONFIG_CPU_32
-
 	.macro	set_cpsr_c, reg, mode
 #if 1
 	/* broken binutils */
@@ -159,58 +151,6 @@
 	mcr	p15, 0, \rtemp, c1, c0
 #endif
 	.endm
-
-#else
-	.macro	save_user_regs
-	str	r0, [sp, #-4]!
-	str	lr, [sp, #-4]!
-	sub	sp, sp, #15*4
-	stmia	sp, {r0 - lr}^
-	mov	r0, r0
-	.endm
-
-	.macro	restore_user_regs
-	ldmia	sp, {r0 - lr}^
-	mov	r0, r0
-	ldr	lr, [sp, #15*4]
-	add	sp, sp, #15*4+8
-	movs	pc, lr
-	.endm
-
-	.macro	fast_restore_user_regs
-	add	sp, sp, #S_OFF
-	ldmib	sp, {r1 - lr}^
-	mov	r0, r0
-	ldr	lr, [sp, #15*4]
-	add	sp, sp, #15*4+8
-	movs	pc, lr
-	.endm
-
-	.macro	mask_pc, rd, rm
-	bic	\rd, \rm, #PCMASK
-	.endm
-
-	.macro	enable_irqs, temp
-	teqp	pc, #0x00000003
-	.endm
-
-	.macro	initialise_traps_extra
-	.endm
-
-	.macro	get_thread_info, rd
-	mov	\rd, sp, lsr #13
-	mov	\rd, \rd, lsl #13
-	.endm
-
-	/*
-	 * Like adr, but force SVC mode (if required)
-	 */
-	.macro	adrsvc, cond, reg, label
-	adr\cond	\reg, \label
-	orr\cond	\reg, \reg, #0x08000003
-	.endm
-
-#endif
 
 
 /*
diff -Nru a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c
--- a/arch/arm/kernel/fiq.c	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/kernel/fiq.c	Sat Apr 19 19:51:50 2003
@@ -54,7 +54,6 @@
 
 static unsigned long no_fiq_insn;
 
-#ifdef CONFIG_CPU_32
 static inline void unprotect_page_0(void)
 {
 	modify_domain(DOMAIN_USER, DOMAIN_MANAGER);
@@ -64,12 +63,6 @@
 {
 	modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
 }
-#else
-
-#define unprotect_page_0()
-#define protect_page_0()
-
-#endif
 
 /* Default reacquire function
  * - we always relinquish FIQ control
@@ -120,17 +113,6 @@
 {
 	register unsigned long tmp, tmp2;
 	__asm__ volatile (
-#ifdef CONFIG_CPU_26
-	"mov	%0, pc
-	bic	%1, %0, #0x3
-	orr	%1, %1, %3
-	teqp	%1, #0		@ select FIQ mode
-	mov	r0, r0
-	ldmia	%2, {r8 - r14}
-	teqp	%0, #0		@ return to SVC mode
-	mov	r0, r0"
-#endif
-#ifdef CONFIG_CPU_32
 	"mrs	%0, cpsr
 	mov	%1, %3
 	msr	cpsr_c, %1	@ select FIQ mode
@@ -138,7 +120,6 @@
 	ldmia	%2, {r8 - r14}
 	msr	cpsr_c, %0	@ return to SVC mode
 	mov	r0, r0"
-#endif
 	: "=&r" (tmp), "=&r" (tmp2)
 	: "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)
 	/* These registers aren't modified by the above code in a way
@@ -152,17 +133,6 @@
 {
 	register unsigned long tmp, tmp2;
 	__asm__ volatile (
-#ifdef CONFIG_CPU_26
-	"mov	%0, pc
-	bic	%1, %0, #0x3
-	orr	%1, %1, %3
-	teqp	%1, #0		@ select FIQ mode
-	mov	r0, r0
-	stmia	%2, {r8 - r14}
-	teqp	%0, #0		@ return to SVC mode
-	mov	r0, r0"
-#endif
-#ifdef CONFIG_CPU_32
 	"mrs	%0, cpsr
 	mov	%1, %3
 	msr	cpsr_c, %1	@ select FIQ mode
@@ -170,7 +140,6 @@
 	stmia	%2, {r8 - r14}
 	msr	cpsr_c, %0	@ return to SVC mode
 	mov	r0, r0"
-#endif
 	: "=&r" (tmp), "=&r" (tmp2)
 	: "r" (&regs->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE)
 	/* These registers aren't modified by the above code in a way
diff -Nru a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
--- a/arch/arm/kernel/head.S	Sat Apr 19 19:51:27 2003
+++ b/arch/arm/kernel/head.S	Sat Apr 19 19:51:27 2003
@@ -205,18 +205,6 @@
 	add	r3, r3, #1 << 20
 	str	r3, [r0], #4			@ KERNEL + 3MB
 
-	/*
-	 * Ensure that the first section of RAM is present.
-	 * we assume that:
-	 *  1. the RAM is aligned to a 32MB boundary
-	 *  2. the kernel is executing in the same 32MB chunk
-	 *     as the start of RAM.
-	 */
-	bic	r0, r0, #0x01f00000 >> 18	@ round down
-	and	r2, r5, #0xfe000000		@ round down
-	add	r3, r8, r2			@ flags + rambase
-	str	r3, [r0]
-
 	bic	r8, r8, #0x0c			@ turn off cacheable
 						@ and bufferable bits
 #ifdef CONFIG_DEBUG_LL
diff -Nru a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
--- a/arch/arm/kernel/process.c	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/kernel/process.c	Sat Apr 19 19:51:50 2003
@@ -188,7 +188,6 @@
 		processor_modes[processor_mode(regs)],
 		thumb_mode(regs) ? " (T)" : "",
 		get_fs() == get_ds() ? "kernel" : "user");
-#if defined(CONFIG_CPU_32)
 	{
 		unsigned int ctrl, transbase, dac;
 		  __asm__ (
@@ -199,7 +198,6 @@
 		printk("Control: %04X  Table: %08X  DAC: %08X\n",
 		  	ctrl, transbase, dac);
 	}
-#endif
 }
 
 void show_fpregs(struct user_fp *regs)
@@ -237,18 +235,9 @@
 static unsigned long *thread_info_head;
 static unsigned int nr_thread_info;
 
-#ifdef CONFIG_CPU_32
 #define EXTRA_TASK_STRUCT	4
 #define ll_alloc_task_struct() ((struct thread_info *) __get_free_pages(GFP_KERNEL,1))
 #define ll_free_task_struct(p) free_pages((unsigned long)(p),1)
-#else
-extern unsigned long get_page_8k(int priority);
-extern void free_page_8k(unsigned long page);
-
-#define EXTRA_TASK_STRUCT	0
-#define ll_alloc_task_struct()	((struct task_struct *)get_page_8k(GFP_KERNEL))
-#define ll_free_task_struct(p)  free_page_8k((unsigned long)(p))
-#endif
 
 struct thread_info *alloc_thread_info(void)
 {
diff -Nru a/arch/arm/kernel/semaphore.c b/arch/arm/kernel/semaphore.c
--- a/arch/arm/kernel/semaphore.c	Sat Apr 19 19:51:46 2003
+++ b/arch/arm/kernel/semaphore.c	Sat Apr 19 19:51:46 2003
@@ -177,44 +177,6 @@
  * registers (r0 to r3 and lr), but not ip, as we use it as a return
  * value in some cases..
  */
-#ifdef CONFIG_CPU_26
-asm("	.align	5				\n\
-	.globl	__down_failed			\n\
-__down_failed:					\n\
-	stmfd	sp!, {r0 - r3, lr}		\n\
-	mov	r0, ip				\n\
-	bl	__down				\n\
-	ldmfd	sp!, {r0 - r3, pc}^		\n\
-						\n\
-	.align	5				\n\
-	.globl	__down_interruptible_failed	\n\
-__down_interruptible_failed:			\n\
-	stmfd	sp!, {r0 - r3, lr}		\n\
-	mov	r0, ip				\n\
-	bl	__down_interruptible		\n\
-	mov	ip, r0				\n\
-	ldmfd	sp!, {r0 - r3, pc}^		\n\
-						\n\
-	.align	5				\n\
-	.globl	__down_trylock_failed		\n\
-__down_trylock_failed:				\n\
-	stmfd	sp!, {r0 - r3, lr}		\n\
-	mov	r0, ip				\n\
-	bl	__down_trylock			\n\
-	mov	ip, r0				\n\
-	ldmfd	sp!, {r0 - r3, pc}^		\n\
-						\n\
-	.align	5				\n\
-	.globl	__up_wakeup			\n\
-__up_wakeup:					\n\
-	stmfd	sp!, {r0 - r3, lr}		\n\
-	mov	r0, ip				\n\
-	bl	__up				\n\
-	ldmfd	sp!, {r0 - r3, pc}^		\n\
-	");
-
-#else
-/* 32 bit version */
 asm("	.align	5				\n\
 	.globl	__down_failed			\n\
 __down_failed:					\n\
@@ -250,4 +212,3 @@
 	ldmfd	sp!, {r0 - r3, pc}		\n\
 	");
 
-#endif
diff -Nru a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
--- a/arch/arm/kernel/setup.c	Sat Apr 19 19:51:48 2003
+++ b/arch/arm/kernel/setup.c	Sat Apr 19 19:51:48 2003
@@ -113,7 +113,6 @@
 #define lp1 io_res[1]
 #define lp2 io_res[2]
 
-#ifdef CONFIG_CPU_32
 static const char *cache_types[16] = {
 	"write-through",
 	"write-back",
@@ -231,10 +230,6 @@
 	}
 }
 
-#else
-#define dump_cpu_info() do { } while (0)
-#endif
-
 int cpu_architecture(void)
 {
 	int cpu_arch;
@@ -768,7 +763,6 @@
 	}
 	seq_printf(m, "CPU revision\t: %d\n", processor_id & 15);
 
-#ifdef CONFIG_CPU_32
 	{
 		unsigned int cache_info;
 
@@ -791,7 +785,6 @@
 			}
 		}
 	}
-#endif
 
 	seq_puts(m, "\n");
 
diff -Nru a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
--- a/arch/arm/kernel/signal.c	Sat Apr 19 19:51:27 2003
+++ b/arch/arm/kernel/signal.c	Sat Apr 19 19:51:27 2003
@@ -174,9 +174,7 @@
 	__get_user_error(regs->ARM_sp, &sc->arm_sp, err);
 	__get_user_error(regs->ARM_lr, &sc->arm_lr, err);
 	__get_user_error(regs->ARM_pc, &sc->arm_pc, err);
-#ifdef CONFIG_CPU_32
 	__get_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err);
-#endif
 
 	err |= !valid_user_regs(regs);
 
@@ -292,9 +290,7 @@
 	__put_user_error(regs->ARM_sp, &sc->arm_sp, err);
 	__put_user_error(regs->ARM_lr, &sc->arm_lr, err);
 	__put_user_error(regs->ARM_pc, &sc->arm_pc, err);
-#ifdef CONFIG_CPU_32
 	__put_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err);
-#endif
 
 	__put_user_error(current->thread.trap_no, &sc->trap_no, err);
 	__put_user_error(current->thread.error_code, &sc->error_code, err);
@@ -328,7 +324,6 @@
 	unsigned long handler = (unsigned long)ka->sa.sa_handler;
 	unsigned long retcode;
 	int thumb = 0;
-#ifdef CONFIG_CPU_32
 	unsigned long cpsr = regs->ARM_cpsr & ~PSR_f;
 
 	/*
@@ -351,7 +346,6 @@
 			cpsr &= ~PSR_T_BIT;
 	}
 #endif
-#endif
 
 	if (ka->sa.sa_flags & SA_RESTORER) {
 		retcode = (unsigned long)ka->sa.sa_restorer;
@@ -378,10 +372,7 @@
 	regs->ARM_sp = (unsigned long)frame;
 	regs->ARM_lr = retcode;
 	regs->ARM_pc = handler;
-
-#ifdef CONFIG_CPU_32
 	regs->ARM_cpsr = cpsr;
-#endif
 
 	return 0;
 }
diff -Nru a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c
--- a/arch/arm/kernel/sys_arm.c	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/kernel/sys_arm.c	Sat Apr 19 19:51:28 2003
@@ -229,7 +229,7 @@
 		return sys_shmctl (first, second,
 				   (struct shmid_ds *) ptr);
 	default:
-		return -EINVAL;
+		return -ENOSYS;
 	}
 }
 
diff -Nru a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
--- a/arch/arm/kernel/traps.c	Sat Apr 19 19:51:46 2003
+++ b/arch/arm/kernel/traps.c	Sat Apr 19 19:51:46 2003
@@ -271,31 +271,6 @@
 	die_if_kernel("Oops - undefined instruction", regs, 0);
 }
 
-#ifdef CONFIG_CPU_26
-asmlinkage void do_excpt(unsigned long address, struct pt_regs *regs, int mode)
-{
-	siginfo_t info;
-
-#ifdef CONFIG_DEBUG_USER
-	printk(KERN_INFO "%s (%d): address exception: pc=%08lx\n",
-		current->comm, current->pid, instruction_pointer(regs));
-	dump_instr(regs);
-#endif
-
-	current->thread.error_code = 0;
-	current->thread.trap_no = 11;
-
-	info.si_signo = SIGBUS;
-	info.si_errno = 0;
-	info.si_code  = BUS_ADRERR;
-	info.si_addr  = (void *)address;
-
-	force_sig_info(SIGBUS, &info, current);
-
-	die_if_kernel("Oops - address exception", regs, mode);
-}
-#endif
-
 asmlinkage void do_unexp_fiq (struct pt_regs *regs)
 {
 #ifndef CONFIG_IGNORE_FIQ
@@ -405,7 +380,6 @@
 		ptrace_break(current, regs);
 		return regs->ARM_r0;
 
-#ifdef CONFIG_CPU_32
 	/*
 	 * Flush a region from virtual address 'r0' to virtual address 'r1'
 	 * _inclusive_.  There is no alignment requirement on either address;
@@ -435,14 +409,6 @@
 			break;
 		regs->ARM_cpsr |= MODE32_BIT;
 		return regs->ARM_r0;
-#else
-	case NR(cacheflush):
-		return 0;
-
-	case NR(usr26):
-	case NR(usr32):
-		break;
-#endif
 
 	default:
 		/* Calls 9f00xx..9f07ff are defined to return -ENOSYS
@@ -563,7 +529,5 @@
 	if (base != 0)
 		printk(KERN_DEBUG "Relocating machine vectors to 0x%08lx\n",
 			base);
-#ifdef CONFIG_CPU_32
 	modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
-#endif
 }
diff -Nru a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
--- a/arch/arm/lib/Makefile	Sat Apr 19 19:51:49 2003
+++ b/arch/arm/lib/Makefile	Sat Apr 19 19:51:49 2003
@@ -39,8 +39,6 @@
 obj-$(v4)	+= io-readsw-armv4.o io-writesw-armv4.o io-readsl-armv4.o
 obj-y		+= io-writesl.o
 
-obj-$(CONFIG_CPU_26) += uaccess-armo.o
-
 $(obj)/csumpartialcopy.o:	$(obj)/csumpartialcopygeneric.S
 $(obj)/csumpartialcopyuser.o:	$(obj)/csumpartialcopygeneric.S
 
diff -Nru a/arch/arm/lib/backtrace.S b/arch/arm/lib/backtrace.S
--- a/arch/arm/lib/backtrace.S	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/lib/backtrace.S	Sat Apr 19 19:51:28 2003
@@ -6,6 +6,9 @@
  * 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.
+ *
+ * 27/03/03 Ian Molton Clean up CONFIG_CPU
+ *
  */
 #include <linux/config.h>
 #include <linux/linkage.h>
@@ -31,13 +34,9 @@
 #else
 
 		stmfd	sp!, {r4 - r8, lr}	@ Save an extra register so we have a location...
-#ifdef CONFIG_CPU_32
 		tst	r1, #0x10		@ 26 or 32-bit?
 		moveq	mask, #0xfc000003
 		movne	mask, #0
-#else
-		mov	mask, #0xfc000003
-#endif
 		tst	mask, r0
 		movne	r0, #0
 		movs	frame, r0
diff -Nru a/arch/arm/lib/copy_page.S b/arch/arm/lib/copy_page.S
--- a/arch/arm/lib/copy_page.S	Sat Apr 19 19:51:48 2003
+++ b/arch/arm/lib/copy_page.S	Sat Apr 19 19:51:48 2003
@@ -13,6 +13,12 @@
 #include <asm/assembler.h>
 #include <asm/constants.h>
 
+#ifndef PLD
+#define COPY_COUNT PAGE_SZ/64
+#else
+#define COPY_COUNT PAGE_SZ/64-1
+#endif
+
 		.text
 		.align	5
 /*
@@ -23,9 +29,13 @@
  */
 ENTRY(copy_page)
 		stmfd	sp!, {r4, lr}			@	2
-		mov	r2, #PAGE_SZ/64			@	1
+	PLD(	pld	[r1, #0]		)
+	PLD(	pld	[r1, #32]		)
+		mov	r2, #COPY_COUNT			@	1
 		ldmia	r1!, {r3, r4, ip, lr}		@	4+1
-1:		stmia	r0!, {r3, r4, ip, lr}		@	4
+1:	PLD(	pld	[r1, #64]		)
+	PLD(	pld	[r1, #96]		)
+2:		stmia	r0!, {r3, r4, ip, lr}		@	4
 		ldmia	r1!, {r3, r4, ip, lr}		@	4+1
 		stmia	r0!, {r3, r4, ip, lr}		@	4
 		ldmia	r1!, {r3, r4, ip, lr}		@	4+1
@@ -33,6 +43,8 @@
 		ldmia	r1!, {r3, r4, ip, lr}		@	4
 		subs	r2, r2, #1			@	1
 		stmia	r0!, {r3, r4, ip, lr}		@	4
-		ldmneia	r1!, {r3, r4, ip, lr}		@	4
-		bne	1b				@	1
+		ldmgtia	r1!, {r3, r4, ip, lr}		@	4
+		bgt	1b				@	1
+	PLD(	ldmeqia r1!, {r3, r4, ip, lr}	)
+	PLD(	beq	2b			)
 		LOADREGS(fd, sp!, {r4, pc})		@	3
diff -Nru a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S
--- a/arch/arm/lib/csumpartialcopyuser.S	Sat Apr 19 19:51:49 2003
+++ b/arch/arm/lib/csumpartialcopyuser.S	Sat Apr 19 19:51:49 2003
@@ -6,8 +6,10 @@
  * 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.
+ *
+ * 27/03/03 Ian Molton Clean up CONFIG_CPU
+ *
  */
-#include <linux/config.h>
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/errno.h>
@@ -15,8 +17,6 @@
 
 		.text
 
-#if defined(CONFIG_CPU_32)
-
 		.macro	save_regs
 		stmfd	sp!, {r1 - r2, r4 - r8, fp, ip, lr, pc}
 		.endm
@@ -72,82 +72,6 @@
 		.previous
 		.endm
 
-#elif defined(CONFIG_CPU_26)
-
-		.macro	save_regs
-		stmfd	sp!, {r1 - r2, r4 - r9, fp, ip, lr, pc}
-		mov	r9, sp, lsr #13
-		mov	r9, r9, lsl #13
-		ldr	r9, [r9, #TSK_ADDR_LIMIT]
-		mov	r9, r9, lsr #24
-		.endm
-
-		.macro	load_regs,flags
-		ldm\flags	fp, {r1, r2, r4-r9, fp, sp, pc}^
-		.endm
-
-		.macro	load1b,	reg1
-		tst	r9, #0x01
-9999:		ldreqbt	\reg1, [r0], #1
-		ldrneb	\reg1, [r0], #1
-		.section __ex_table, "a"
-		.align	3
-		.long	9999b, 6001f
-		.previous
-		.endm
-
-		.macro	load2b, reg1, reg2
-		tst	r9, #0x01
-9999:		ldreqbt	\reg1, [r0], #1
-		ldrneb	\reg1, [r0], #1
-9998:		ldreqbt	\reg2, [r0], #1
-		ldrneb	\reg2, [r0], #1
-		.section __ex_table, "a"
-		.long	9999b, 6001f
-		.long	9998b, 6001f
-		.previous
-		.endm
-
-		.macro	load1l, reg1
-		tst	r9, #0x01
-9999:		ldreqt	\reg1, [r0], #4
-		ldrne	\reg1, [r0], #4
-		.section __ex_table, "a"
-		.align	3
-		.long	9999b, 6001f
-		.previous
-		.endm
-
-		.macro	load2l, reg1, reg2
-		tst	r9, #0x01
-		ldmneia	r0!, {\reg1, \reg2}
-9999:		ldreqt	\reg1, [r0], #4
-9998:		ldreqt	\reg2, [r0], #4
-		.section __ex_table, "a"
-		.long	9999b, 6001f
-		.long	9998b, 6001f
-		.previous
-		.endm
-
-		.macro	load4l, reg1, reg2, reg3, reg4
-		tst	r9, #0x01
-		ldmneia	r0!, {\reg1, \reg2, \reg3, \reg4}
-9999:		ldreqt	\reg1, [r0], #4
-9998:		ldreqt	\reg2, [r0], #4
-9997:		ldreqt	\reg3, [r0], #4
-9996:		ldreqt	\reg4, [r0], #4
-		.section __ex_table, "a"
-		.long	9999b, 6001f
-		.long	9998b, 6001f
-		.long	9997b, 6001f
-		.long	9996b, 6001f
-		.previous
-		.endm
-
-#else
-#error Unknown CPU architecture
-#endif
-
 /*
  * unsigned int
  * csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *err_ptr)
@@ -165,9 +89,7 @@
  * so properly, we would have to add in whatever registers were loaded before
  * the fault, which, with the current asm above is not predictable.
  */
-#if defined(CONFIG_CPU_32)
 		.section .fixup,"ax"
-#endif
 		.align	4
 6001:		mov	r4, #-EFAULT
 		ldr	r5, [fp, #4]		@ *err_ptr
@@ -179,6 +101,4 @@
 		strneb	r0, [r1], #1
 		bne	6002b
 		load_regs	ea
-#if defined(CONFIG_CPU_32)
 		.previous
-#endif
diff -Nru a/arch/arm/lib/ecard.S b/arch/arm/lib/ecard.S
--- a/arch/arm/lib/ecard.S	Sat Apr 19 19:51:30 2003
+++ b/arch/arm/lib/ecard.S	Sat Apr 19 19:51:30 2003
@@ -6,19 +6,17 @@
  * 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.
+ *
+ * 27/03/03 Ian Molton Clean up CONFIG_CPU
+ *
  */
-#include <linux/config.h> /* for CONFIG_CPU_nn */
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/hardware.h>
 
-#ifdef CONFIG_CPU_26
-#define CPSR2SPSR(rt)
-#else
 #define CPSR2SPSR(rt) \
 		mrs	rt, cpsr; \
 		msr	spsr, rt
-#endif
 
 @ Purpose: call an expansion card loader to read bytes.
 @ Proto  : char read_loader(int offset, char *card_base, char *loader);
diff -Nru a/arch/arm/lib/io-acorn.S b/arch/arm/lib/io-acorn.S
--- a/arch/arm/lib/io-acorn.S	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/lib/io-acorn.S	Sat Apr 19 19:51:28 2003
@@ -6,8 +6,10 @@
  * 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.
+ *
+ * 27/03/03 Ian Molton Clean up CONFIG_CPU
+ *
  */
-#include <linux/config.h> /* for CONFIG_CPU_nn */
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/hardware.h>
@@ -53,21 +55,3 @@
 		adr	r0, .iosl_warning
 		mov	r1, lr
 		b	printk
-
-@ Purpose: write a memc register
-@ Proto  : void memc_write(int register, int value);
-@ Returns: nothing
-
-#ifdef CONFIG_CPU_26
-ENTRY(memc_write)
-		cmp	r0, #7
-		RETINSTR(movgt,pc,lr)
-		mov	r0, r0, lsl #17
-		mov	r1, r1, lsl #15
-		mov	r1, r1, lsr #17
-		orr	r0, r0, r1, lsl #2
-		add	r0, r0, #0x03600000
-		strb	r0, [r0]
-		RETINSTR(mov,pc,lr)
-#endif
-
diff -Nru a/arch/arm/lib/lib1funcs.S b/arch/arm/lib/lib1funcs.S
--- a/arch/arm/lib/lib1funcs.S	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/lib/lib1funcs.S	Sat Apr 19 19:51:28 2003
@@ -33,23 +33,19 @@
    This exception does not however invalidate any other reasons why
    the executable file might be covered by the GNU General Public License.
  */
-/* This code is derived from gcc 2.95.3 */
-/* I Molton     29/07/01 */
+/* This code is derived from gcc 2.95.3
+ * 29/07/01 Adapted for linux
+ * 27/03/03 Ian Molton Clean up CONFIG_CPU
+ */
 
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/hardware.h>
 #include <linux/config.h>
 
-#ifdef CONFIG_CPU_26
-#define RET	movs
-#define RETc(x)	mov##x##s
-#define RETCOND ^
-#else
 #define RET	mov
 #define RETc(x)	mov##x
 #define RETCOND
-#endif
 
 dividend	.req	r0
 divisor		.req	r1
diff -Nru a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S
--- a/arch/arm/lib/memcpy.S	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/lib/memcpy.S	Sat Apr 19 19:51:50 2003
@@ -27,15 +27,15 @@
 
 /*
  * Prototype: void memcpy(void *to,const void *from,unsigned long n);
- * ARM3: cant use memcopy here!!!
  */
 ENTRY(memcpy)
 ENTRY(memmove)
 		ENTER
 		cmp	r1, r0
-		bcc	19f
+		bcc	23f
 		subs	r2, r2, #4
 		blt	6f
+	PLD(	pld	[r1, #0]		)
 		ands	ip, r0, #3
 		bne	7f
 		ands	ip, r1, #3
@@ -43,29 +43,42 @@
 
 1:		subs	r2, r2, #8
 		blt	5f
-		subs	r2, r2, #0x14
-		blt	3f
-2:		ldmia	r1!,{r3 - r9, ip}
-		stmia	r0!,{r3 - r9, ip}
+		subs	r2, r2, #20
+		blt	4f
+	PLD(	pld	[r1, #28]		)
+	PLD(	subs	r2, r2, #64		)
+	PLD(	blt	3f			)
+2:	PLD(	pld	[r1, #60]		)
+	PLD(	pld	[r1, #92]		)
+		ldmia	r1!, {r3 - r9, ip}
 		subs	r2, r2, #32
+		stmgeia	r0!, {r3 - r9, ip}
+		ldmgeia	r1!, {r3 - r9, ip}
+		subges	r2, r2, #32
+		stmia	r0!, {r3 - r9, ip}
 		bge	2b
-		cmn	r2, #16
+3:	PLD(	ldmia	r1!, {r3 - r9, ip}	)
+	PLD(	adds	r2, r2, #32		)
+	PLD(	stmgeia	r0!, {r3 - r9, ip}	)
+	PLD(	ldmgeia	r1!, {r3 - r9, ip}	)
+	PLD(	subges	r2, r2, #32		)
+	PLD(	stmia	r0!, {r3 - r9, ip}	)
+4:		cmn	r2, #16
 		ldmgeia	r1!, {r3 - r6}
+		subge	r2, r2, #16
 		stmgeia	r0!, {r3 - r6}
-		subge	r2, r2, #0x10
-3:		adds	r2, r2, #0x14
-4:		ldmgeia	r1!, {r3 - r5}
+		adds	r2, r2, #20
+		ldmgeia	r1!, {r3 - r5}
+		subge	r2, r2, #12
 		stmgeia	r0!, {r3 - r5}
-		subges	r2, r2, #12
-		bge	4b
 5:		adds	r2, r2, #8
 		blt	6f
 		subs	r2, r2, #4
 		ldrlt	r3, [r1], #4
 		ldmgeia	r1!, {r4, r5}
+		subge	r2, r2, #4
 		strlt	r3, [r0], #4
 		stmgeia	r0!, {r4, r5}
-		subge	r2, r2, #4
 
 6:		adds	r2, r2, #4
 		EXITEQ
@@ -94,13 +107,19 @@
 8:		bic	r1, r1, #3
 		ldr	r7, [r1], #4
 		cmp	ip, #2
-		bgt	15f
-		beq	11f
+		bgt	18f
+		beq	13f
 		cmp	r2, #12
-		blt	10f
+		blt	11f
+	PLD(	pld	[r1, #12]		)
 		sub	r2, r2, #12
-9:		mov	r3, r7, pull #8
+	PLD(	subs	r2, r2, #32		)
+	PLD(	blt	10f			)
+	PLD(	pld	[r1, #28]		)
+9:	PLD(	pld	[r1, #44]		)
+10:		mov	r3, r7, pull #8
 		ldmia	r1!, {r4 - r7}
+		subs	r2, r2, #16
 		orr	r3, r3, r4, push #24
 		mov	r4, r4, pull #8
 		orr	r4, r4, r5, push #24
@@ -109,24 +128,32 @@
 		mov	r6, r6, pull #8
 		orr	r6, r6, r7, push #24
 		stmia	r0!, {r3 - r6}
-		subs	r2, r2, #16
 		bge	9b
+	PLD(	cmn	r2, #32			)
+	PLD(	bge	10b			)
+	PLD(	add	r2, r2, #32		)
 		adds	r2, r2, #12
-		blt	100f
-10:		mov	r3, r7, pull #8
+		blt	12f
+11:		mov	r3, r7, pull #8
 		ldr	r7, [r1], #4
 		subs	r2, r2, #4
 		orr	r3, r3, r7, push #24
 		str	r3, [r0], #4
-		bge	10b
-100:		sub	r1, r1, #3
+		bge	11b
+12:		sub	r1, r1, #3
 		b	6b
 
-11:		cmp	r2, #12
-		blt	13f		/* */
+13:		cmp	r2, #12
+		blt	16f
+	PLD(	pld	[r1, #12]		)
 		sub	r2, r2, #12
-12:		mov	r3, r7, pull #16
+	PLD(	subs	r2, r2, #32		)
+	PLD(	blt	15f			)
+	PLD(	pld	[r1, #28]		)
+14:	PLD(	pld	[r1, #44]		)
+15:		mov	r3, r7, pull #16
 		ldmia	r1!, {r4 - r7}
+		subs	r2, r2, #16
 		orr	r3, r3, r4, push #16
 		mov	r4, r4, pull #16
 		orr	r4, r4, r5, push #16
@@ -135,24 +162,32 @@
 		mov	r6, r6, pull #16
 		orr	r6, r6, r7, push #16
 		stmia	r0!, {r3 - r6}
-		subs	r2, r2, #16
-		bge	12b
+		bge	14b
+	PLD(	cmn	r2, #32			)
+	PLD(	bge	15b			)
+	PLD(	add	r2, r2, #32		)
 		adds	r2, r2, #12
-		blt	14f
-13:		mov	r3, r7, pull #16
+		blt	17f
+16:		mov	r3, r7, pull #16
 		ldr	r7, [r1], #4
 		subs	r2, r2, #4
 		orr	r3, r3, r7, push #16
 		str	r3, [r0], #4
-		bge	13b
-14:		sub	r1, r1, #2
+		bge	16b
+17:		sub	r1, r1, #2
 		b	6b
 
-15:		cmp	r2, #12
-		blt	17f
+18:		cmp	r2, #12
+		blt	21f
+	PLD(	pld	[r1, #12]		)
 		sub	r2, r2, #12
-16:		mov	r3, r7, pull #24
+	PLD(	subs	r2, r2, #32		)
+	PLD(	blt	20f			)
+	PLD(	pld	[r1, #28]		)
+19:	PLD(	pld	[r1, #44]		)
+20:		mov	r3, r7, pull #24
 		ldmia	r1!, {r4 - r7}
+		subs	r2, r2, #16
 		orr	r3, r3, r4, push #8
 		mov	r4, r4, pull #24
 		orr	r4, r4, r5, push #8
@@ -161,55 +196,72 @@
 		mov	r6, r6, pull #24
 		orr	r6, r6, r7, push #8
 		stmia	r0!, {r3 - r6}
-		subs	r2, r2, #16
-		bge	16b
+		bge	19b
+	PLD(	cmn	r2, #32			)
+	PLD(	bge	20b			)
+	PLD(	add	r2, r2, #32		)
 		adds	r2, r2, #12
-		blt	18f
-17:		mov	r3, r7, pull #24
+		blt	22f
+21:		mov	r3, r7, pull #24
 		ldr	r7, [r1], #4
 		subs	r2, r2, #4
 		orr	r3, r3, r7, push #8
 		str	r3, [r0], #4
-		bge	17b
-18:		sub	r1, r1, #1
+		bge	21b
+22:		sub	r1, r1, #1
 		b	6b
 
 
-19:		add	r1, r1, r2
+23:		add	r1, r1, r2
 		add	r0, r0, r2
 		subs	r2, r2, #4
-		blt	24f
+		blt	29f
+	PLD(	pld	[r1, #-4]		)
 		ands	ip, r0, #3
-		bne	25f
+		bne	30f
 		ands	ip, r1, #3
-		bne	26f
+		bne	31f
 
-20:		subs	r2, r2, #8
-		blt	23f
-		subs	r2, r2, #0x14
-		blt	22f
-21:		ldmdb	r1!, {r3 - r9, ip}
-		stmdb	r0!, {r3 - r9, ip}
+24:		subs	r2, r2, #8
+		blt	28f
+		subs	r2, r2, #20
+		blt	27f
+	PLD(	pld	[r1, #-32]		)
+	PLD(	subs	r2, r2, #64		)
+	PLD(	blt	26f			)
+25:	PLD(	pld	[r1, #-64]		)
+	PLD(	pld	[r1, #-96]		)
+		ldmdb	r1!, {r3 - r9, ip}
 		subs	r2, r2, #32
-		bge	21b
-22:		cmn	r2, #16
+		stmgedb	r0!, {r3 - r9, ip}
+		ldmgedb	r1!, {r3 - r9, ip}
+		subges	r2, r2, #32
+		stmdb	r0!, {r3 - r9, ip}
+		bge	25b
+26:	PLD(	ldmdb	r1!, {r3 - r9, ip}	)
+	PLD(	adds	r2, r2, #32		)
+	PLD(	stmgedb	r0!, {r3 - r9, ip}	)
+	PLD(	ldmgedb	r1!, {r3 - r9, ip}	)
+	PLD(	subges	r2, r2, #32		)
+	PLD(	stmdb	r0!, {r3 - r9, ip}	)
+27:		cmn	r2, #16
 		ldmgedb	r1!, {r3 - r6}
-		stmgedb	r0!, {r3 - r6}
 		subge	r2, r2, #16
+		stmgedb	r0!, {r3 - r6}
 		adds	r2, r2, #20
 		ldmgedb	r1!, {r3 - r5}
-		stmgedb	r0!, {r3 - r5}
 		subge	r2, r2, #12
-23:		adds	r2, r2, #8
-		blt	24f
+		stmgedb	r0!, {r3 - r5}
+28:		adds	r2, r2, #8
+		blt	29f
 		subs	r2, r2, #4
 		ldrlt	r3, [r1, #-4]!
 		ldmgedb	r1!, {r4, r5}
+		subge	r2, r2, #4
 		strlt	r3, [r0, #-4]!
 		stmgedb	r0!, {r4, r5}
-		subge	r2, r2, #4
 
-24:		adds	r2, r2, #4
+29:		adds	r2, r2, #4
 		EXITEQ
 		cmp	r2, #2
 		ldrb	r3, [r1, #-1]!
@@ -220,7 +272,7 @@
 		strgtb	r5, [r0, #-1]!
 		EXIT
 
-25:		cmp	ip, #2
+30:		cmp	ip, #2
 		ldrb	r3, [r1, #-1]!
 		ldrgeb	r4, [r1, #-1]!
 		ldrgtb	r5, [r1, #-1]!
@@ -228,20 +280,26 @@
 		strgeb	r4, [r0, #-1]!
 		strgtb	r5, [r0, #-1]!
 		subs	r2, r2, ip
-		blt	24b
+		blt	29b
 		ands	ip, r1, #3
-		beq	20b
+		beq	24b
 
-26:		bic	r1, r1, #3
+31:		bic	r1, r1, #3
 		ldr	r3, [r1], #0
 		cmp	ip, #2
-		blt	34f
-		beq	30f
+		blt	41f
+		beq	36f
 		cmp	r2, #12
-		blt	28f
+		blt	34f
+	PLD(	pld	[r1, #-16]		)
 		sub	r2, r2, #12
-27:		mov	r7, r3, push #8
+	PLD(	subs	r2, r2, #32		)
+	PLD(	blt	33f			)
+	PLD(	pld	[r1, #-32]		)
+32:	PLD(	pld	[r1, #-48]		)
+33:		mov	r7, r3, push #8
 		ldmdb	r1!, {r3, r4, r5, r6}
+		subs	r2, r2, #16
 		orr	r7, r7, r6, pull #24
 		mov	r6, r6, push #8
 		orr	r6, r6, r5, pull #24
@@ -250,24 +308,32 @@
 		mov	r4, r4, push #8
 		orr	r4, r4, r3, pull #24
 		stmdb	r0!, {r4, r5, r6, r7}
-		subs	r2, r2, #16
-		bge	27b
+		bge	32b
+	PLD(	cmn	r2, #32			)
+	PLD(	bge	33b			)
+	PLD(	add	r2, r2, #32		)
 		adds	r2, r2, #12
-		blt	29f
-28:		mov	ip, r3, push #8
+		blt	35f
+34:		mov	ip, r3, push #8
 		ldr	r3, [r1, #-4]!
 		subs	r2, r2, #4
 		orr	ip, ip, r3, pull #24
 		str	ip, [r0, #-4]!
-		bge	28b
-29:		add	r1, r1, #3
-		b	24b
-
-30:		cmp	r2, #12
-		blt	32f
+		bge	34b
+35:		add	r1, r1, #3
+		b	29b
+
+36:		cmp	r2, #12
+		blt	39f
+	PLD(	pld	[r1, #-16]		)
 		sub	r2, r2, #12
-31:		mov	r7, r3, push #16
+	PLD(	subs	r2, r2, #32		)
+	PLD(	blt	38f			)
+	PLD(	pld	[r1, #-32]		)
+37:	PLD(	pld	[r1, #-48]		)
+38:		mov	r7, r3, push #16
 		ldmdb	r1!, {r3, r4, r5, r6}
+		subs	r2, r2, #16
 		orr	r7, r7, r6, pull #16
 		mov	r6, r6, push #16
 		orr	r6, r6, r5, pull #16
@@ -276,24 +342,32 @@
 		mov	r4, r4, push #16
 		orr	r4, r4, r3, pull #16
 		stmdb	r0!, {r4, r5, r6, r7}
-		subs	r2, r2, #16
-		bge	31b
+		bge	37b
+	PLD(	cmn	r2, #32			)
+	PLD(	bge	38b			)
+	PLD(	add	r2, r2, #32		)
 		adds	r2, r2, #12
-		blt	33f
-32:		mov	ip, r3, push #16
+		blt	40f
+39:		mov	ip, r3, push #16
 		ldr	r3, [r1, #-4]!
 		subs	r2, r2, #4
 		orr	ip, ip, r3, pull #16
 		str	ip, [r0, #-4]!
-		bge	32b
-33:		add	r1, r1, #2
-		b	24b
-
-34:		cmp	r2, #12
-		blt	36f
+		bge	39b
+40:		add	r1, r1, #2
+		b	29b
+
+41:		cmp	r2, #12
+		blt	44f
+	PLD(	pld	[r1, #-16]		)
 		sub	r2, r2, #12
-35:		mov	r7, r3, push #24
+	PLD(	subs	r2, r2, #32		)
+	PLD(	blt	43f			)
+	PLD(	pld	[r1, #-32]		)
+42:	PLD(	pld	[r1, #-48]		)
+43:		mov	r7, r3, push #24
 		ldmdb	r1!, {r3, r4, r5, r6}
+		subs	r2, r2, #16
 		orr	r7, r7, r6, pull #8
 		mov	r6, r6, push #24
 		orr	r6, r6, r5, pull #8
@@ -302,17 +376,18 @@
 		mov	r4, r4, push #24
 		orr	r4, r4, r3, pull #8
 		stmdb	r0!, {r4, r5, r6, r7}
-		subs	r2, r2, #16
-		bge	35b
+		bge	42b
+	PLD(	cmn	r2, #32			)
+	PLD(	bge	43b			)
+	PLD(	add	r2, r2, #32		)
 		adds	r2, r2, #12
-		blt	37f
-36:		mov	ip, r3, push #24
+		blt	45f
+44:		mov	ip, r3, push #24
 		ldr	r3, [r1, #-4]!
 		subs	r2, r2, #4
 		orr	ip, ip, r3, pull #8
 		str	ip, [r0, #-4]!
-		bge	36b
-37:		add	r1, r1, #1
-		b	24b
+		bge	44b
+45:		add	r1, r1, #1
+		b	29b
 
-		.align
diff -Nru a/arch/arm/lib/uaccess-armo.S b/arch/arm/lib/uaccess-armo.S
--- a/arch/arm/lib/uaccess-armo.S	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,231 +0,0 @@
-/*
- *  linux/arch/arm/lib/uaccess-armo.S
- *
- *  Copyright (C) 1998 Russell King
- *
- *  Note!  Some code fragments found in here have a special calling
- *  convention - they are not APCS compliant!
- *
- * 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>
-#include <asm/assembler.h>
-
-		.text
-
-		.globl	uaccess_user
-uaccess_user:
-		.word	uaccess_user_put_byte
-		.word	uaccess_user_get_byte
-		.word	uaccess_user_put_half
-		.word	uaccess_user_get_half
-		.word	uaccess_user_put_word
-		.word	uaccess_user_get_word
-		.word	__arch_copy_from_user
-		.word	__arch_copy_to_user
-		.word	__arch_clear_user
-		.word	__arch_strncpy_from_user
-		.word	__arch_strnlen_user
-
-
-@ In : r0 = x, r1 = addr, r2 = error
-@ Out: r2 = error
-uaccess_user_put_byte:
-		stmfd	sp!, {lr}
-USER(		strbt	r0, [r1])
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = x, r1 = addr, r2 = error
-@ Out: r2 = error
-uaccess_user_put_half:
-		stmfd	sp!, {lr}
-USER(		strbt	r0, [r1], #1)
-		mov	r0, r0, lsr #8
-USER(		strbt	r0, [r1])
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = x, r1 = addr, r2 = error
-@ Out: r2 = error
-uaccess_user_put_word:
-		stmfd	sp!, {lr}
-USER(		strt	r0, [r1])
-		ldmfd	sp!, {pc}^
-
-9001:		mov	r2, #-EFAULT
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = addr, r1 = error
-@ Out: r0 = x, r1 = error
-uaccess_user_get_byte:
-		stmfd	sp!, {lr}
-USER(		ldrbt	r0, [r0])
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = addr, r1 = error
-@ Out: r0 = x, r1 = error
-uaccess_user_get_half:
-		stmfd	sp!, {lr}
-USER(		ldrt	r0, [r0])
-		mov	r0, r0, lsl #16
-		mov	r0, r0, lsr #16
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = addr, r1 = error
-@ Out: r0 = x, r1 = error
-uaccess_user_get_word:
-		stmfd	sp!, {lr}
-USER(		ldrt	r0, [r0])
-		ldmfd	sp!, {pc}^
-
-9001:		mov	r1, #-EFAULT
-		ldmfd	sp!, {pc}^
-
-
-
-		.globl	uaccess_kernel
-uaccess_kernel:
-		.word	uaccess_kernel_put_byte
-		.word	uaccess_kernel_get_byte
-		.word	uaccess_kernel_put_half
-		.word	uaccess_kernel_get_half
-		.word	uaccess_kernel_put_word
-		.word	uaccess_kernel_get_word
-		.word	uaccess_kernel_copy
-		.word	uaccess_kernel_copy
-		.word	uaccess_kernel_clear
-		.word	uaccess_kernel_strncpy_from
-		.word	uaccess_kernel_strnlen
-
-@ In : r0 = x, r1 = addr, r2 = error
-@ Out: r2 = error
-uaccess_kernel_put_byte:
-		stmfd	sp!, {lr}
-		strb	r0, [r1]
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = x, r1 = addr, r2 = error
-@ Out: r2 = error
-uaccess_kernel_put_half:
-		stmfd	sp!, {lr}
-		strb	r0, [r1]
-		mov	r0, r0, lsr #8
-		strb	r0, [r1, #1]
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = x, r1 = addr, r2 = error
-@ Out: r2 = error
-uaccess_kernel_put_word:
-		stmfd	sp!, {lr}
-		str	r0, [r1]
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = addr, r1 = error
-@ Out: r0 = x, r1 = error
-uaccess_kernel_get_byte:
-		stmfd	sp!, {lr}
-		ldrb	r0, [r0]
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = addr, r1 = error
-@ Out: r0 = x, r1 = error
-uaccess_kernel_get_half:
-		stmfd	sp!, {lr}
-		ldr	r0, [r0]
-		mov	r0, r0, lsl #16
-		mov	r0, r0, lsr #16
-		ldmfd	sp!, {pc}^
-
-@ In : r0 = addr, r1 = error
-@ Out: r0 = x, r1 = error
-uaccess_kernel_get_word:
-		stmfd	sp!, {lr}
-		ldr	r0, [r0]
-		ldmfd	sp!, {pc}^
-
-
-/* Prototype: int uaccess_kernel_copy(void *to, const char *from, size_t n)
- * Purpose  : copy a block to kernel memory from kernel memory
- * Params   : to   - kernel memory
- *          : from - kernel memory
- *          : n    - number of bytes to copy
- * Returns  : Number of bytes NOT copied.
- */
-uaccess_kernel_copy:
-		stmfd	sp!, {lr}
-		bl	memcpy
-		mov	r0, #0
-		ldmfd	sp!, {pc}^
-
-/* Prototype: int uaccess_kernel_clear(void *addr, size_t sz)
- * Purpose  : clear some kernel memory
- * Params   : addr - kernel memory address to clear
- *          : sz   - number of bytes to clear
- * Returns  : number of bytes NOT cleared
- */
-uaccess_kernel_clear:
-		stmfd	sp!, {lr}
-		mov	r2, #0
-		cmp	r1, #4
-		blt	2f
-		ands	ip, r0, #3
-		beq	1f
-		cmp	ip, #1
-		strb	r2, [r0], #1
-		strleb	r2, [r0], #1
-		strltb	r2, [r0], #1
-		rsb	ip, ip, #4
-		sub	r1, r1, ip		@  7  6  5  4  3  2  1
-1:		subs	r1, r1, #8		@ -1 -2 -3 -4 -5 -6 -7
-		bmi	2f
-		str	r2, [r0], #4
-		str	r2, [r0], #4
-		b	1b
-2:		adds	r1, r1, #4		@  3  2  1  0 -1 -2 -3
-		strpl	r2, [r0], #4
-		tst	r1, #2			@ 1x 1x 0x 0x 1x 1x 0x
-		strneb	r2, [r0], #1
-		strneb	r2, [r0], #1
-		tst	r1, #1			@ x1 x0 x1 x0 x1 x0 x1
-		strneb	r2, [r0], #1
-		mov	r0, #0
-		ldmfd	sp!, {pc}^
-
-/* Prototype: size_t uaccess_kernel_strncpy_from(char *dst, char *src, size_t len)
- * Purpose  : copy a string from kernel memory to kernel memory
- * Params   : dst - kernel memory destination
- *          : src - kernel memory source
- *          : len - maximum length of string
- * Returns  : number of characters copied
- */
-uaccess_kernel_strncpy_from:
-		stmfd	sp!, {lr}
-		mov	ip, r2
-1:		subs	r2, r2, #1
-		bmi	2f
-		ldrb	r3, [r1], #1
-		strb	r3, [r0], #1
-		teq	r3, #0
-		bne	1b
-2:		subs	r0, ip, r2
-		ldmfd	sp!, {pc}^
-
-/* Prototype: int uaccess_kernel_strlen(char *str, long n)
- * Purpose  : get length of a string in kernel memory
- * Params   : str - address of string in kernel memory
- * Returns  : length of string *including terminator*,
- *            or zero on exception, or n + 1 if too long
- */
-uaccess_kernel_strnlen:
-		stmfd	sp!, {lr}
-		mov	r2, r0
-1:		ldrb	r1, [r0], #1
-		teq	r1, #0
-		beq	2f
-		subs	r1, r1, #1
-		bne	1b
-		add	r0, r0, #1
-2:		sub	r0, r0, r2
-		ldmfd	sp!, {pc}^
-
diff -Nru a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S
--- a/arch/arm/lib/uaccess.S	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/lib/uaccess.S	Sat Apr 19 19:51:28 2003
@@ -43,6 +43,8 @@
 		stmfd	sp!, {r2, r4 - r7, lr}
 		cmp	r2, #4
 		blt	.c2u_not_enough
+	PLD(	pld	[r1, #0]		)
+	PLD(	pld	[r0, #0]		)
 		ands	ip, r0, #3
 		bne	.c2u_dest_not_aligned
 .c2u_dest_aligned:
@@ -71,13 +73,26 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #32
 		blt	.c2u_0rem8lp
-
-.c2u_0cpy8lp:	ldmia	r1!, {r3 - r6}
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+	PLD(	subs	ip, ip, #64			)
+	PLD(	blt	.c2u_0cpynopld		)
+	PLD(	pld	[r1, #60]		)
+	PLD(	pld	[r0, #60]		)
+
+.c2u_0cpy8lp:
+	PLD(	pld	[r1, #92]		)
+	PLD(	pld	[r0, #92]		)
+.c2u_0cpynopld:	ldmia	r1!, {r3 - r6}
 		stmia	r0!, {r3 - r6}			@ Shouldnt fault
 		ldmia	r1!, {r3 - r6}
-		stmia	r0!, {r3 - r6}			@ Shouldnt fault
 		subs	ip, ip, #32
+		stmia	r0!, {r3 - r6}			@ Shouldnt fault
 		bpl	.c2u_0cpy8lp
+	PLD(	cmn	ip, #64			)
+	PLD(	bge	.c2u_0cpynopld		)
+	PLD(	add	ip, ip, #64		)
+
 .c2u_0rem8lp:	cmn	ip, #16
 		ldmgeia	r1!, {r3 - r6}
 		stmgeia	r0!, {r3 - r6}			@ Shouldnt fault
@@ -128,9 +143,19 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #16
 		blt	.c2u_1rem8lp
-
-.c2u_1cpy8lp:	mov	r3, r7, pull #8
+	PLD(	pld	[r1, #12]		)
+	PLD(	pld	[r0, #12]		)
+	PLD(	subs	ip, ip, #32		)
+	PLD(	blt	.c2u_1cpynopld		)
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+
+.c2u_1cpy8lp:
+	PLD(	pld	[r1, #44]		)
+	PLD(	pld	[r0, #44]		)
+.c2u_1cpynopld:	mov	r3, r7, pull #8
 		ldmia	r1!, {r4 - r7}
+		subs	ip, ip, #16
 		orr	r3, r3, r4, push #24
 		mov	r4, r4, pull #8
 		orr	r4, r4, r5, push #24
@@ -139,8 +164,11 @@
 		mov	r6, r6, pull #8
 		orr	r6, r6, r7, push #24
 		stmia	r0!, {r3 - r6}			@ Shouldnt fault
-		subs	ip, ip, #16
 		bpl	.c2u_1cpy8lp
+	PLD(	cmn	ip, #32			)
+	PLD(	bge	.c2u_1cpynopld		)
+	PLD(	add	ip, ip, #32		)
+
 .c2u_1rem8lp:	tst	ip, #8
 		movne	r3, r7, pull #8
 		ldmneia	r1!, {r4, r7}
@@ -182,9 +210,19 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #16
 		blt	.c2u_2rem8lp
-
-.c2u_2cpy8lp:	mov	r3, r7, pull #16
+	PLD(	pld	[r1, #12]		)
+	PLD(	pld	[r0, #12]		)
+	PLD(	subs	ip, ip, #32		)
+	PLD(	blt	.c2u_2cpynopld		)
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+
+.c2u_2cpy8lp:
+	PLD(	pld	[r1, #44]		)
+	PLD(	pld	[r0, #44]		)
+.c2u_2cpynopld:	mov	r3, r7, pull #16
 		ldmia	r1!, {r4 - r7}
+		subs	ip, ip, #16
 		orr	r3, r3, r4, push #16
 		mov	r4, r4, pull #16
 		orr	r4, r4, r5, push #16
@@ -193,8 +231,11 @@
 		mov	r6, r6, pull #16
 		orr	r6, r6, r7, push #16
 		stmia	r0!, {r3 - r6}			@ Shouldnt fault
-		subs	ip, ip, #16
 		bpl	.c2u_2cpy8lp
+	PLD(	cmn	ip, #32			)
+	PLD(	bge	.c2u_2cpynopld		)
+	PLD(	add	ip, ip, #32		)
+
 .c2u_2rem8lp:	tst	ip, #8
 		movne	r3, r7, pull #16
 		ldmneia	r1!, {r4, r7}
@@ -236,9 +277,19 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #16
 		blt	.c2u_3rem8lp
-
-.c2u_3cpy8lp:	mov	r3, r7, pull #24
+	PLD(	pld	[r1, #12]		)
+	PLD(	pld	[r0, #12]		)
+	PLD(	subs	ip, ip, #32		)
+	PLD(	blt	.c2u_3cpynopld		)
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+
+.c2u_3cpy8lp:
+	PLD(	pld	[r1, #44]		)
+	PLD(	pld	[r0, #44]		)
+.c2u_3cpynopld:	mov	r3, r7, pull #24
 		ldmia	r1!, {r4 - r7}
+		subs	ip, ip, #16
 		orr	r3, r3, r4, push #8
 		mov	r4, r4, pull #24
 		orr	r4, r4, r5, push #8
@@ -247,8 +298,11 @@
 		mov	r6, r6, pull #24
 		orr	r6, r6, r7, push #8
 		stmia	r0!, {r3 - r6}			@ Shouldnt fault
-		subs	ip, ip, #16
 		bpl	.c2u_3cpy8lp
+	PLD(	cmn	ip, #32			)
+	PLD(	bge	.c2u_3cpynopld		)
+	PLD(	add	ip, ip, #32		)
+
 .c2u_3rem8lp:	tst	ip, #8
 		movne	r3, r7, pull #24
 		ldmneia	r1!, {r4, r7}
@@ -302,6 +356,8 @@
 		stmfd	sp!, {r0, r2, r4 - r7, lr}
 		cmp	r2, #4
 		blt	.cfu_not_enough
+	PLD(	pld	[r1, #0]		)
+	PLD(	pld	[r0, #0]		)
 		ands	ip, r0, #3
 		bne	.cfu_dest_not_aligned
 .cfu_dest_aligned:
@@ -329,13 +385,26 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #32
 		blt	.cfu_0rem8lp
-
-.cfu_0cpy8lp:	ldmia	r1!, {r3 - r6}			@ Shouldnt fault
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+	PLD(	subs	ip, ip, #64			)
+	PLD(	blt	.cfu_0cpynopld		)
+	PLD(	pld	[r1, #60]		)
+	PLD(	pld	[r0, #60]		)
+
+.cfu_0cpy8lp:
+	PLD(	pld	[r1, #92]		)
+	PLD(	pld	[r0, #92]		)
+.cfu_0cpynopld:	ldmia	r1!, {r3 - r6}			@ Shouldnt fault
 		stmia	r0!, {r3 - r6}
 		ldmia	r1!, {r3 - r6}			@ Shouldnt fault
-		stmia	r0!, {r3 - r6}
 		subs	ip, ip, #32
+		stmia	r0!, {r3 - r6}
 		bpl	.cfu_0cpy8lp
+	PLD(	cmn	ip, #64			)
+	PLD(	bge	.cfu_0cpynopld		)
+	PLD(	add	ip, ip, #64		)
+
 .cfu_0rem8lp:	cmn	ip, #16
 		ldmgeia	r1!, {r3 - r6}			@ Shouldnt fault
 		stmgeia	r0!, {r3 - r6}
@@ -387,9 +456,19 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #16
 		blt	.cfu_1rem8lp
-
-.cfu_1cpy8lp:	mov	r3, r7, pull #8
+	PLD(	pld	[r1, #12]		)
+	PLD(	pld	[r0, #12]		)
+	PLD(	subs	ip, ip, #32		)
+	PLD(	blt	.cfu_1cpynopld		)
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+
+.cfu_1cpy8lp:
+	PLD(	pld	[r1, #44]		)
+	PLD(	pld	[r0, #44]		)
+.cfu_1cpynopld:	mov	r3, r7, pull #8
 		ldmia	r1!, {r4 - r7}			@ Shouldnt fault
+		subs	ip, ip, #16
 		orr	r3, r3, r4, push #24
 		mov	r4, r4, pull #8
 		orr	r4, r4, r5, push #24
@@ -398,8 +477,11 @@
 		mov	r6, r6, pull #8
 		orr	r6, r6, r7, push #24
 		stmia	r0!, {r3 - r6}
-		subs	ip, ip, #16
 		bpl	.cfu_1cpy8lp
+	PLD(	cmn	ip, #32			)
+	PLD(	bge	.cfu_1cpynopld		)
+	PLD(	add	ip, ip, #32		)
+
 .cfu_1rem8lp:	tst	ip, #8
 		movne	r3, r7, pull #8
 		ldmneia	r1!, {r4, r7}			@ Shouldnt fault
@@ -441,9 +523,19 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #16
 		blt	.cfu_2rem8lp
-
-.cfu_2cpy8lp:	mov	r3, r7, pull #16
+	PLD(	pld	[r1, #12]		)
+	PLD(	pld	[r0, #12]		)
+	PLD(	subs	ip, ip, #32		)
+	PLD(	blt	.cfu_2cpynopld		)
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+
+.cfu_2cpy8lp:
+	PLD(	pld	[r1, #44]		)
+	PLD(	pld	[r0, #44]		)
+.cfu_2cpynopld:	mov	r3, r7, pull #16
 		ldmia	r1!, {r4 - r7}			@ Shouldnt fault
+		subs	ip, ip, #16
 		orr	r3, r3, r4, push #16
 		mov	r4, r4, pull #16
 		orr	r4, r4, r5, push #16
@@ -452,8 +544,11 @@
 		mov	r6, r6, pull #16
 		orr	r6, r6, r7, push #16
 		stmia	r0!, {r3 - r6}
-		subs	ip, ip, #16
 		bpl	.cfu_2cpy8lp
+	PLD(	cmn	ip, #32			)
+	PLD(	bge	.cfu_2cpynopld		)
+	PLD(	add	ip, ip, #32		)
+
 .cfu_2rem8lp:	tst	ip, #8
 		movne	r3, r7, pull #16
 		ldmneia	r1!, {r4, r7}			@ Shouldnt fault
@@ -495,8 +590,17 @@
 		sub	r2, r2, ip
 		subs	ip, ip, #16
 		blt	.cfu_3rem8lp
-
-.cfu_3cpy8lp:	mov	r3, r7, pull #24
+	PLD(	pld	[r1, #12]		)
+	PLD(	pld	[r0, #12]		)
+	PLD(	subs	ip, ip, #32		)
+	PLD(	blt	.cfu_3cpynopld		)
+	PLD(	pld	[r1, #28]		)
+	PLD(	pld	[r0, #28]		)
+
+.cfu_3cpy8lp:
+	PLD(	pld	[r1, #44]		)
+	PLD(	pld	[r0, #44]		)
+.cfu_3cpynopld:	mov	r3, r7, pull #24
 		ldmia	r1!, {r4 - r7}			@ Shouldnt fault
 		orr	r3, r3, r4, push #8
 		mov	r4, r4, pull #24
@@ -508,6 +612,10 @@
 		stmia	r0!, {r3 - r6}
 		subs	ip, ip, #16
 		bpl	.cfu_3cpy8lp
+	PLD(	cmn	ip, #32			)
+	PLD(	bge	.cfu_3cpynopld		)
+	PLD(	add	ip, ip, #32		)
+
 .cfu_3rem8lp:	tst	ip, #8
 		movne	r3, r7, pull #24
 		ldmneia	r1!, {r4, r7}			@ Shouldnt fault
diff -Nru a/arch/arm/mach-iop310/Kconfig b/arch/arm/mach-iop310/Kconfig
--- a/arch/arm/mach-iop310/Kconfig	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,30 +0,0 @@
-
-menu "IOP310 Implementation Options"
-
-config ARCH_IQ80310
-	bool "IQ80310"
-	depends on ARCH_IOP310
-	help
-	  Say Y here if you want to run your kernel on the Intel IQ80310
-	  evaluation kit for the IOP310 chipset.
-
-comment "IOP310 Chipset Features"
-
-config IOP310_AAU
-	bool "Support Intel 80312 Application Accelerator Unit (EXPERIMENTAL)"
-	depends on ARCH_IOP310 && EXPERIMENTAL
-
-config IOP310_DMA
-	bool "Support Intel 80312 DMA (EXPERIMENTAL)"
-	depends on ARCH_IOP310 && EXPERIMENTAL
-
-config IOP310_MU
-	bool "Support Intel 80312 Messaging Unit (EXPERIMENTAL)"
-	depends on ARCH_IOP310 && EXPERIMENTAL
-
-config IOP310_PMON
-	bool "Support Intel 80312 Performance Monitor (EXPERIMENTAL)"
-	depends on ARCH_IOP310 && EXPERIMENTAL
-
-endmenu
-
diff -Nru a/arch/arm/mach-iop310/Makefile b/arch/arm/mach-iop310/Makefile
--- a/arch/arm/mach-iop310/Makefile	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,22 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-# Object file lists.
-
-obj-y			:= arch.o mm.o xs80200-irq.o iop310-irq.o \
-			   iop310-pci.o
-obj-m			:=
-obj-n			:=
-obj-			:=
-
-obj-$(CONFIG_ARCH_IQ80310) += iq80310-pci.o iq80310-irq.o
-
-ifneq ($(CONFIG_XSCALE_PMU_TIMER),y)
-obj-y			+= iq80310-time.o
-endif
-
-obj-$(CONFIG_IOP310_AAU) += aau.o
-obj-$(CONFIG_IOP310_DMA) += dma.o
-obj-$(CONFIG_IOP310_MU) += message.o
-obj-$(CONFIG_IOP310_PMON) += pmon.o
diff -Nru a/arch/arm/mach-iop310/arch.c b/arch/arm/mach-iop310/arch.c
--- a/arch/arm/mach-iop310/arch.c	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,48 +0,0 @@
-/*
- * linux/arch/arm/mach-iop310/arch.c
- *
- * Author: Nicolas Pitre <nico@cam.org>
- * Copyright (C) 2001 MontaVista 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/config.h>
-#include <linux/init.h>
-#include <linux/major.h>
-#include <linux/fs.h>
-
-#include <asm/setup.h>
-#include <asm/system.h>
-#include <asm/memory.h>
-#include <asm/hardware.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-
-#ifdef CONFIG_ARCH_IQ80310
-extern void iq80310_map_io(void);
-extern void iq80310_init_irq(void);
-
-static void __init
-fixup_iq80310(struct machine_desc *desc, struct tag *tags,
-	      char **cmdline, struct meminfo *mi)
-{
-	system_rev = (*(volatile unsigned int*)0xfe830000) & 0x0f;
-
-	if (system_rev)
-		system_rev = 0xF;
-}
-
-MACHINE_START(IQ80310, "Cyclone IQ80310")
-	MAINTAINER("MontaVista Software Inc.")
-	BOOT_MEM(0xa0000000, 0xfe000000, 0xfe000000)
-	FIXUP(fixup_iq80310)
-	MAPIO(iq80310_map_io)
-	INITIRQ(iq80310_init_irq)
-MACHINE_END
-
-#else
-#error No machine descriptor defined for this IOP310 implementation
-#endif
diff -Nru a/arch/arm/mach-iop310/iop310-irq.c b/arch/arm/mach-iop310/iop310-irq.c
--- a/arch/arm/mach-iop310/iop310-irq.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,113 +0,0 @@
-/*
- * linux/arch/arm/mach-iop310/iop310-irq.c
- *
- * Generic IOP310 IRQ handling functionality
- *
- * Author:  Nicolas Pitre
- * Copyright:   (C) 2001 MontaVista 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.
- *
- * Added IOP310 chipset and IQ80310 board demuxing, masking code. - DS
- *
- */
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-
-#include <asm/mach/irq.h>
-#include <asm/irq.h>
-#include <asm/hardware.h>
-
-#include <asm/mach-types.h>
-
-extern void xs80200_irq_mask(unsigned int);
-extern void xs80200_irq_unmask(unsigned int);
-extern void xs80200_init_irq(void);
-
-extern void do_IRQ(int, struct pt_regs *);
-
-static u32 iop310_mask /* = 0 */;
-
-static void iop310_irq_mask (unsigned int irq)
-{
-	iop310_mask ++;
-
-	/*
-	 * No mask bits on the 80312, so we have to
-	 * mask everything from the outside!
-	 */
-	if (iop310_mask == 1) {
-		disable_irq(IRQ_XS80200_EXTIRQ);
-		irq_desc[IRQ_XS80200_EXTIRQ].chip->mask(IRQ_XS80200_EXTIRQ);
-	}
-}
-
-static void iop310_irq_unmask (unsigned int irq)
-{
-	if (iop310_mask)
-		iop310_mask --;
-
-	/*
-	 * Check if all 80312 sources are unmasked now
-	 */
-	if (iop310_mask == 0)
-		enable_irq(IRQ_XS80200_EXTIRQ);
-}
-
-struct irqchip ext_chip = {
-	.ack	= iop310_irq_mask,
-	.mask	= iop310_irq_mask,
-	.unmask = iop310_irq_unmask,
-};
-
-void
-iop310_irq_demux(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
-{
-	u32 fiq1isr = *((volatile u32*)IOP310_FIQ1ISR);
-	u32 fiq2isr = *((volatile u32*)IOP310_FIQ2ISR);
-	struct irqdesc *d;
-	unsigned int irqno = 0;
-
-	if(fiq1isr)
-	{
-		if(fiq1isr & 0x1)
-			irqno = IRQ_IOP310_DMA0;
-		if(fiq1isr & 0x2)
-			irqno = IRQ_IOP310_DMA1;
-		if(fiq1isr & 0x4)
-			irqno = IRQ_IOP310_DMA2;
-		if(fiq1isr & 0x10)
-			irqno = IRQ_IOP310_PMON;
-		if(fiq1isr & 0x20)
-			irqno = IRQ_IOP310_AAU;
-	}
-	else
-	{
-		if(fiq2isr & 0x2)
-			irqno = IRQ_IOP310_I2C;
-		if(fiq2isr & 0x4)
-			irqno = IRQ_IOP310_MU;
-	}
-
-	if (irqno) {
-		d = irq_desc + irqno;
-		d->handle(irqno, d, regs);
-	}
-}
-
-void __init iop310_init_irq(void)
-{
-	unsigned int i;
-
-	for(i = IOP310_IRQ_OFS; i < NR_IOP310_IRQS; i++)
-	{
-		set_irq_chip(i, &ext_chip);
-		set_irq_handler(i, do_level_IRQ);
-		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
-	}
-
-	xs80200_init_irq();
-}
diff -Nru a/arch/arm/mach-iop310/iop310-pci.c b/arch/arm/mach-iop310/iop310-pci.c
--- a/arch/arm/mach-iop310/iop310-pci.c	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,434 +0,0 @@
-/*
- * arch/arm/mach-iop310/iop310-pci.c
- *
- * PCI support for the Intel IOP310 chipset
- *
- * Matt Porter <mporter@mvista.com>
- *
- * Copyright (C) 2001 MontaVista 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/kernel.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/system.h>
-#include <asm/hardware.h>
-#include <asm/mach/pci.h>
-
-#include <asm/arch/iop310.h>
-
-/*
- *    *** Special note - why the IOP310 should NOT be used ***
- *
- * The PCI ATU is a brain dead implementation, only allowing 32-bit
- * accesses to PCI configuration space.  This is especially brain
- * dead for writes to this space.  A simple for-instance:
- *
- *  You want to modify the command register *without* corrupting the
- *  status register.
- *
- *  To perform this, you need to read *32* bits of data from offset 4,
- *  mask off the low 16, replace them with the new data, and write *32*
- *  bits back.
- *
- *  Writing the status register at offset 6 with status bits set *clears*
- *  the status.
- *
- * Hello?  Could we have a *SANE* implementation of a PCI ATU some day
- * *PLEASE*?
- */
-#undef DEBUG
-#ifdef DEBUG
-#define  DBG(x...) printk(x)
-#else
-#define  DBG(x...) do { } while (0)
-#endif
-
-/*
- * Calculate the address, etc from the bus, devfn and register
- * offset.  Note that we have two root buses, so we need some
- * method to determine whether we need config type 0 or 1 cycles.
- * We use a root bus number in our bus->sysdata structure for this.
- */
-static u32 iop310_cfg_address(struct pci_bus *bus, int devfn, int where)
-{
-	struct pci_sys_data *sys = bus->sysdata;
-	u32 addr;
-
-	if (sys->busnr == bus->number)
-		addr = 1 << (PCI_SLOT(devfn) + 16);
-	else
-		addr = bus->number << 16 | PCI_SLOT(devfn) << 11 | 1;
-
-	addr |=	PCI_FUNC(devfn) << 8 | (where & ~3);
-
-	return addr;
-}
-
-/*
- * Primary PCI interface support.
- */
-static int iop310_pri_pci_status(void)
-{
-	unsigned int status;
-	int ret = 0;
-
-	status = *IOP310_PATUSR;
-	if (status & 0xf900) {
-		*IOP310_PATUSR = status & 0xf900;
-		ret = 1;
-	}
-	status = *IOP310_PATUISR;
-	if (status & 0x0000018f) {
-		*IOP310_PATUISR = status & 0x0000018f;
-		ret = 1;
-	}
-	status = *IOP310_PSR;
-	if (status & 0xf900) {
-		*IOP310_PSR = status & 0xf900;
-		ret = 1;
-	}
-	status = *IOP310_PBISR;
-	if (status & 0x003f) {
-		*IOP310_PBISR = status & 0x003f;
-		ret = 1;
-	}
-	return ret;
-}
-
-/*
- * Simply write the address register and read the configuration
- * data.  Note that the 4 nop's ensure that we are able to handle
- * a delayed abort (in theory.)
- */
-static inline u32 iop310_pri_read(unsigned long addr)
-{
-	u32 val;
-
-	__asm__ __volatile__(
-		"str	%1, [%2]\n\t"
-		"ldr	%0, [%3]\n\t"
-		"nop\n\t"
-		"nop\n\t"
-		"nop\n\t"
-		"nop\n\t"
-		: "=r" (val)
-		: "r" (addr), "r" (IOP310_POCCAR), "r" (IOP310_POCCDR));
-
-	return val;
-}
-
-static int
-iop310_pri_read_config(struct pci_bus *bus, unsigned int devfn, int where,
-		       int size, u32 *value)
-{
-	unsigned long addr = iop310_cfg_address(bus, devfn, where);
-	u32 val = iop310_pri_read(addr) >> ((where & 3) * 8);
-
-	if (iop310_pri_pci_status())
-		val = 0xffffffff;
-
-	*value = val;
-
-	return PCIBIOS_SUCCESSFUL;
-}
-
-static int
-iop310_pri_write_config(struct pci_bus *bus, unsigned int devfn, int where,
-			int size, u32 value)
-{
-	unsigned long addr = iop310_cfg_address(bus, devfn, where);
-	u32 val;
-
-	if (size != 4) {
-		val = iop310_pri_read(addr);
-		if (!iop310_pri_pci_status() == 0)
-			return PCIBIOS_SUCCESSFUL;
-
-		where = (where & 3) * 8;
-
-		if (size == 1)
-			val &= ~(0xff << where);
-		else
-			val &= ~(0xffff << where);
-
-		*IOP310_POCCDR = val | value << where;
-	} else {
-		asm volatile(
-			"str	%1, [%2]\n\t"
-			"str	%0, [%3]\n\t"
-			"nop\n\t"
-			"nop\n\t"
-			"nop\n\t"
-			"nop\n\t"
-			:
-			: "r" (value), "r" (addr),
-			  "r" (IOP310_POCCAR), "r" (IOP310_POCCDR));
-	}
-
-	return PCIBIOS_SUCCESSFUL;
-}
-
-static struct pci_ops iop310_primary_ops = {
-	.read	= iop310_pri_read_config,
-	.write	= iop310_pri_write_config,
-};
-
-/*
- * Secondary PCI interface support.
- */
-static int iop310_sec_pci_status(void)
-{
-	unsigned int usr, uisr;
-	int ret = 0;
-
-	usr = *IOP310_SATUSR;
-	uisr = *IOP310_SATUISR;
-	if (usr & 0xf900) {
-		*IOP310_SATUSR = usr & 0xf900;
-		ret = 1;
-	}
-	if (uisr & 0x0000069f) {
-		*IOP310_SATUISR = uisr & 0x0000069f;
-		ret = 1;
-	}
-	if (ret)
-		DBG("ERROR (%08x %08x)", usr, uisr);
-	return ret;
-}
-
-/*
- * Simply write the address register and read the configuration
- * data.  Note that the 4 nop's ensure that we are able to handle
- * a delayed abort (in theory.)
- */
-static inline u32 iop310_sec_read(unsigned long addr)
-{
-	u32 val;
-
-	__asm__ __volatile__(
-		"str	%1, [%2]\n\t"
-		"ldr	%0, [%3]\n\t"
-		"nop\n\t"
-		"nop\n\t"
-		"nop\n\t"
-		"nop\n\t"
-		: "=r" (val)
-		: "r" (addr), "r" (IOP310_SOCCAR), "r" (IOP310_SOCCDR));
-
-	return val;
-}
-
-static int
-iop310_sec_read_config(struct pci_bus *bus, unsigned int devfn, int where,
-		       int size, u32 *value)
-{
-	unsigned long addr = iop310_cfg_address(bus, devfn, where);
-	u32 val = iop310_sec_read(addr) >> ((where & 3) * 8);
-
-	if (iop310_sec_pci_status())
-		val = 0xffffffff;
-
-	*value = val;
-
-	return PCIBIOS_SUCCESSFUL;
-}
-
-static int
-iop310_sec_write_config(struct pci_bus *bus, unsigned int devfn, int where,
-			int size, u32 value)
-{
-	unsigned long addr = iop310_cfg_address(bus, devfn, where);
-	u32 val;
-
-	if (size != 4) {
-		val = iop310_sec_read(addr);
-
-		if (!iop310_sec_pci_status() == 0)
-			return PCIBIOS_SUCCESSFUL;
-
-		where = (where & 3) * 8;
-
-		if (size == 1)
-			val &= ~(0xff << where);
-		else
-			val &= ~(0xffff << where);
-
-		*IOP310_SOCCDR = val | value << where;
-	} else {
-		asm volatile(
-			"str	%1, [%2]\n\t"
-			"str	%0, [%3]\n\t"
-			"nop\n\t"
-			"nop\n\t"
-			"nop\n\t"
-			"nop\n\t"
-			:
-			: "r" (value), "r" (addr),
-			  "r" (IOP310_SOCCAR), "r" (IOP310_SOCCDR));
-	}
-
-	return PCIBIOS_SUCCESSFUL;
-}
-
-static struct pci_ops iop310_secondary_ops = {
-	.read	= iop310_sec_read_config,
-	.write	= iop310_sec_write_config,
-};
-
-/*
- * When a PCI device does not exist during config cycles, the 80200 gets
- * an external abort instead of returning 0xffffffff.  If it was an
- * imprecise abort, we need to correct the return address to point after
- * the instruction.  Also note that the Xscale manual says:
- *
- *  "if a stall-until-complete LD or ST instruction triggers an
- *  imprecise fault, then that fault will be seen by the program
- *  within 3 instructions."
- *
- * This does not appear to be the case.  With 8 NOPs after the load, we
- * see the imprecise abort occurring on the STM of iop310_sec_pci_status()
- * which is about 10 instructions away.
- *
- * Always trust reality!
- */
-static int
-iop310_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
-{
-	DBG("PCI abort: address = 0x%08lx fsr = 0x%03x PC = 0x%08lx LR = 0x%08lx\n",
-		addr, fsr, regs->ARM_pc, regs->ARM_lr);
-
-	/*
-	 * If it was an imprecise abort, then we need to correct the
-	 * return address to be _after_ the instruction.
-	 */
-	if (fsr & (1 << 10))
-		regs->ARM_pc += 4;
-
-	return 0;
-}
-
-/*
- * Scan an IOP310 PCI bus.  sys->bus defines which bus we scan.
- */
-struct pci_bus *iop310_scan_bus(int nr, struct pci_sys_data *sys)
-{
-	struct pci_ops *ops;
-
-	if (nr)
-		ops = &iop310_secondary_ops;
-	else
-		ops = &iop310_primary_ops;
-
-	return pci_scan_bus(sys->busnr, ops, sys);
-}
-
-/*
- * Setup the system data for controller 'nr'.   Return 0 if none found,
- * 1 if found, or negative error.
- *
- * We can alter:
- *  io_offset   - offset between IO resources and PCI bus BARs
- *  mem_offset  - offset between mem resources and PCI bus BARs
- *  resource[0] - parent IO resource
- *  resource[1] - parent non-prefetchable memory resource
- *  resource[2] - parent prefetchable memory resource
- *  swizzle     - bridge swizzling function
- *  map_irq     - irq mapping function
- *
- * Note that 'io_offset' and 'mem_offset' are left as zero since
- * the IOP310 doesn't attempt to perform any address translation
- * on accesses from the host to the bus.
- */
-int iop310_setup(int nr, struct pci_sys_data *sys)
-{
-	struct resource *res;
-
-	if (nr >= 2)
-		return 0;
-
-	res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL);
-	if (!res)
-		panic("PCI: unable to alloc resources");
-
-	memset(res, 0, sizeof(struct resource) * 2);
-
-	switch (nr) {
-	case 0:
-		res[0].start = IOP310_PCIPRI_LOWER_IO + 0x6e000000;
-		res[0].end   = IOP310_PCIPRI_LOWER_IO + 0x6e00ffff;
-		res[0].name  = "PCI IO Primary";
-		res[0].flags = IORESOURCE_IO;
-
-		res[1].start = IOP310_PCIPRI_LOWER_MEM;
-		res[1].end   = IOP310_PCIPRI_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
-		res[1].name  = "PCI Memory Primary";
-		res[1].flags = IORESOURCE_MEM;
-		break;
-
-	case 1:
-		res[0].start = IOP310_PCISEC_LOWER_IO + 0x6e000000;
-		res[0].end   = IOP310_PCISEC_LOWER_IO + 0x6e00ffff;
-		res[0].name  = "PCI IO Secondary";
-		res[0].flags = IORESOURCE_IO;
-
-		res[1].start = IOP310_PCISEC_LOWER_MEM;
-		res[1].end   = IOP310_PCISEC_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
-		res[1].name  = "PCI Memory Secondary";
-		res[1].flags = IORESOURCE_MEM;
-		break;
-	}
-
-	request_resource(&ioport_resource, &res[0]);
-	request_resource(&iomem_resource, &res[1]);
-
-	sys->resource[0] = &res[0];
-	sys->resource[1] = &res[1];
-	sys->resource[2] = NULL;
-	sys->io_offset   = 0x6e000000;
-
-	return 1;
-}
-
-void iop310_init(void)
-{
-	DBG("PCI:  Intel 80312 PCI-to-PCI init code.\n");
-	DBG("  ATU secondary: ATUCR =0x%08x\n", *IOP310_ATUCR);
-	DBG("  ATU secondary: SOMWVR=0x%08x  SOIOWVR=0x%08x\n",
-		*IOP310_SOMWVR,	*IOP310_SOIOWVR);
-	DBG("  ATU secondary: SIABAR=0x%08x  SIALR  =0x%08x SIATVR=%08x\n",
-		*IOP310_SIABAR, *IOP310_SIALR, *IOP310_SIATVR);
-	DBG("  ATU primary:   POMWVR=0x%08x  POIOWVR=0x%08x\n",
-		*IOP310_POMWVR,	*IOP310_POIOWVR);
-	DBG("  ATU primary:   PIABAR=0x%08x  PIALR  =0x%08x PIATVR=%08x\n",
-		*IOP310_PIABAR, *IOP310_PIALR, *IOP310_PIATVR);
-	DBG("  P2P: PCR=0x%04x BCR=0x%04x EBCR=0x%04x\n",
-		*IOP310_PCR, *IOP310_BCR, *IOP310_EBCR);
-
-	/*
-	 * Windows have to be carefully opened via a nice set of calls
-	 * here or just some direct register fiddling in the board
-	 * specific init when we want transactions to occur between the
-	 * two PCI hoses.
-	 *
-	 * To do this, we will have manage RETRY assertion between the
-	 * firmware and the kernel.  This will ensure that the host
-	 * system's enumeration code is held off until we have tweaked
-	 * the interrupt routing and public/private IDSELs.
-	 *
-	 * For now we will simply default to disabling the integrated type
-	 * 81 P2P bridge.
-	 */
-	*IOP310_PCR &= 0xfff8;
-
-	hook_fault_code(16+6, iop310_pci_abort, SIGBUS, "imprecise external abort");
-}
diff -Nru a/arch/arm/mach-iop310/iq80310-irq.c b/arch/arm/mach-iop310/iq80310-irq.c
--- a/arch/arm/mach-iop310/iq80310-irq.c	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,141 +0,0 @@
-/*
- * linux/arch/arm/mach-iop310/iq80310-irq.c
- *
- * IRQ hadling/demuxing for IQ80310 board
- *
- * Author:  Nicolas Pitre
- * Copyright:   (C) 2001 MontaVista 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.
- *
- * 2.4.7-rmk1-iop310.1
- *     Moved demux from asm to C - DS
- *     Fixes for various revision boards - DS
- */
-#include <linux/init.h>
-#include <linux/list.h>
-
-#include <asm/irq.h>
-#include <asm/mach/irq.h>
-#include <asm/hardware.h>
-#include <asm/system.h>
-
-#include <asm/mach-types.h>
-
-extern void iop310_init_irq(void);
-extern void iop310_irq_demux(unsigned int, struct irqdesc *, struct pt_regs *);
-
-static void iq80310_irq_mask(unsigned int irq)
-{
-	*(volatile char *)IQ80310_INT_MASK |= (1 << (irq - IQ80310_IRQ_OFS));
-}
-
-static void iq80310_irq_unmask(unsigned int irq)
-{
-	*(volatile char *)IQ80310_INT_MASK &= ~(1 << (irq - IQ80310_IRQ_OFS));
-}
-
-static struct irqchip iq80310_irq_chip = {
-	.ack	= iq80310_irq_mask,
-	.mask	= iq80310_irq_mask,
-	.unmask = iq80310_irq_unmask,
-};
-
-extern struct irqchip ext_chip;
-
-static void
-iq80310_cpld_irq_handler(unsigned int irq, struct irqdesc *desc,
-			 struct pt_regs *regs)
-{
-	unsigned int irq_stat = *(volatile u8*)IQ80310_INT_STAT;
-	unsigned int irq_mask = *(volatile u8*)IQ80310_INT_MASK;
-	unsigned int i, handled = 0;
-	struct irqdesc *d;
-
-	desc->chip->ack(irq);
-
-	/*
-	 * Mask out the interrupts which aren't enabled.
-	 */
-	irq_stat &= 0x1f & ~irq_mask;
-
-	/*
-	 * Test each IQ80310 CPLD interrupt
-	 */
-	for (i = IRQ_IQ80310_TIMER, d = irq_desc + IRQ_IQ80310_TIMER;
-	     irq_stat; i++, d++, irq_stat >>= 1)
-		if (irq_stat & 1) {
-			d->handle(i, d, regs);
-			handled++;
-		}
-
-	/*
-	 * If running on a board later than REV D.1, we can
-	 * decode the PCI interrupt status.
-	 */
-	if (system_rev) {
-		irq_stat = *((volatile u8*)IQ80310_PCI_INT_STAT) & 7;
-
-		for (i = IRQ_IQ80310_INTA, d = irq_desc + IRQ_IQ80310_INTA;
-		     irq_stat; i++, d++, irq_stat >>= 1)
-			if (irq_stat & 0x1) {
-				d->handle(i, d, regs);
-				handled++;
-			}
-	}
-
-	/*
-	 * If on a REV D.1 or lower board, we just assumed INTA
-	 * since PCI is not routed, and it may actually be an
-	 * on-chip interrupt.
-	 *
-	 * Note that we're giving on-chip interrupts slightly
-	 * higher priority than PCI by handling them first.
-	 *
-	 * On boards later than REV D.1, if we didn't read a
-	 * CPLD interrupt, we assume it's from a device on the
-	 * chipset itself.
-	 */
-	if (system_rev == 0 || handled == 0)
-		iop310_irq_demux(irq, desc, regs);
-
-	desc->chip->unmask(irq);
-}
-
-void __init iq80310_init_irq(void)
-{
-	volatile char *mask = (volatile char *)IQ80310_INT_MASK;
-	unsigned int i;
-
-	iop310_init_irq();
-
-	/*
-	 * Setup PIRSR to route PCI interrupts into xs80200
-	 */
-	*IOP310_PIRSR = 0xff;
-
-	/*
-	 * Setup the IRQs in the FE820000/FE860000 registers
-	 */
-	for (i = IQ80310_IRQ_OFS; i <= IRQ_IQ80310_INTD; i++) {
-		set_irq_chip(i, &iq80310_irq_chip);
-		set_irq_handler(i, do_level_IRQ);
-		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
-	}
-
-	/*
-	 * Setup the PCI IRQs
-	 */
-	for (i = IRQ_IQ80310_INTA; i < IRQ_IQ80310_INTC; i++) {
-		set_irq_chip(i, &ext_chip);
-		set_irq_handler(i, do_level_IRQ);
-		set_irq_flags(i, IRQF_VALID);
-	}
-
-	*mask = 0xff;  /* mask all sources */
-
-	set_irq_chained_handler(IRQ_XS80200_EXTIRQ,
-				&iq80310_cpld_irq_handler);
-}
diff -Nru a/arch/arm/mach-iop310/iq80310-pci.c b/arch/arm/mach-iop310/iq80310-pci.c
--- a/arch/arm/mach-iop310/iq80310-pci.c	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,164 +0,0 @@
-/*
- * arch/arm/mach-iop310/iq80310-pci.c
- *
- * PCI support for the Intel IQ80310 reference board
- *
- * Matt Porter <mporter@mvista.com>
- *
- * Copyright (C) 2001 MontaVista 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/kernel.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-
-#include <asm/hardware.h>
-#include <asm/irq.h>
-#include <asm/mach/pci.h>
-#include <asm/mach-types.h>
-
-/*
- * The following macro is used to lookup irqs in a standard table
- * format for those systems that do not already have PCI
- * interrupts properly routed.  We assume 1 <= pin <= 4
- */
-#define PCI_IRQ_TABLE_LOOKUP(minid,maxid)	\
-({ int _ctl_ = -1;				\
-   unsigned int _idsel = idsel - minid;		\
-   if (_idsel <= maxid)				\
-      _ctl_ = pci_irq_table[_idsel][pin-1];	\
-   _ctl_; })
-
-#define INTA	IRQ_IQ80310_INTA
-#define INTB	IRQ_IQ80310_INTB
-#define INTC	IRQ_IQ80310_INTC
-#define INTD	IRQ_IQ80310_INTD
-
-#define INTE	IRQ_IQ80310_I82559
-
-typedef u8 irq_table[4];
-
-/*
- * IRQ tables for primary bus.
- *
- * On a Rev D.1 and older board, INT A-C are not routed, so we
- * just fake it as INTA and than we take care of handling it
- * correctly in the IRQ demux routine.
- */
-static irq_table pci_pri_d_irq_table[] = {
-/* Pin:    A     B     C     D */
-	{ INTA, INTD, INTA, INTA }, /*  PCI Slot J3 */
-	{ INTD, INTA, INTA, INTA }, /*  PCI Slot J4 */
-};
-
-static irq_table pci_pri_f_irq_table[] = {
-/* Pin:    A     B     C     D */
-	{ INTC, INTD, INTA, INTB }, /*  PCI Slot J3 */
-	{ INTD, INTA, INTB, INTC }, /*  PCI Slot J4 */
-};
-
-static int __init
-iq80310_pri_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
-{
-	irq_table *pci_irq_table;
-
-	BUG_ON(pin < 1 || pin > 4);
-
-	if (!system_rev) {
-		pci_irq_table = pci_pri_d_irq_table;
-	} else {
-		pci_irq_table = pci_pri_f_irq_table;
-	}
-
-	return PCI_IRQ_TABLE_LOOKUP(2, 3);
-}
-
-/*
- * IRQ tables for secondary bus.
- *
- * On a Rev D.1 and older board, INT A-C are not routed, so we
- * just fake it as INTA and than we take care of handling it
- * correctly in the IRQ demux routine.
- */
-static irq_table pci_sec_d_irq_table[] = {
-/* Pin:    A     B     C     D */
-	{ INTA, INTA, INTA, INTD }, /*  PCI Slot J1 */
-	{ INTA, INTA, INTD, INTA }, /*  PCI Slot J5 */
-	{ INTE, INTE, INTE, INTE }, /*  P2P Bridge */
-};
-
-static irq_table pci_sec_f_irq_table[] = {
-/* Pin:	   A     B     C     D */
-	{ INTA, INTB, INTC, INTD }, /* PCI Slot J1 */
-	{ INTB, INTC, INTD, INTA }, /* PCI Slot J5 */
-	{ INTE, INTE, INTE, INTE }, /* P2P Bridge */
-};
-
-static int __init
-iq80310_sec_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
-{
-	irq_table *pci_irq_table;
-
-	BUG_ON(pin < 1 || pin > 4);
-
-	if (!system_rev) {
-		pci_irq_table = pci_sec_d_irq_table;
-	} else {
-		pci_irq_table = pci_sec_f_irq_table;
-	}
-
-	return PCI_IRQ_TABLE_LOOKUP(0, 2);
-}
-
-static int iq80310_pri_host;
-
-static int iq80310_setup(int nr, struct pci_sys_data *sys)
-{
-	switch (nr) {
-	case 0:
-		if (!iq80310_pri_host)
-			return 0;
-
-		sys->map_irq = iq80310_pri_map_irq;
-		break;
-
-	case 1:
-		sys->map_irq = iq80310_sec_map_irq;
-		break;
-
-	default:
-		return 0;
-	}
-
-	return iop310_setup(nr, sys);
-}
-
-static void iq80310_preinit(void)
-{
-	iq80310_pri_host = *(volatile u32 *)IQ80310_BACKPLANE & 1;
-
-	printk(KERN_INFO "PCI: IQ80310 is a%s\n",
-		iq80310_pri_host ? " system controller" : "n agent");
-
-	iop310_init();
-}
-
-static struct hw_pci iq80310_pci __initdata = {
-	.swizzle	= pci_std_swizzle,
-	.nr_controllers = 2,
-	.setup		= iq80310_setup,
-	.scan		= iop310_scan_bus,
-	.preinit	= iq80310_preinit,
-};
-
-static int __init iq80310_pci_init(void)
-{
-	if (machine_is_iq80310())
-		pci_common_init(&iq80310_pci);
-	return 0;
-}
-
-subsys_initcall(iq80310_pci_init);
diff -Nru a/arch/arm/mach-iop310/iq80310-time.c b/arch/arm/mach-iop310/iq80310-time.c
--- a/arch/arm/mach-iop310/iq80310-time.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,134 +0,0 @@
-/*
- * linux/arch/arm/mach-iop310/time-iq80310.c
- *
- * Timer functions for IQ80310 onboard timer
- *
- * Author:  Nicolas Pitre
- * Copyright:   (C) 2001 MontaVista 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/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/time.h>
-#include <linux/init.h>
-#include <linux/timex.h>
-
-#include <asm/hardware.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/uaccess.h>
-#include <asm/mach-types.h>
-#include <asm/mach/irq.h>
-
-static void iq80310_write_timer (u_long val)
-{
-	volatile u_char *la0 = (volatile u_char *)IQ80310_TIMER_LA0;
-	volatile u_char *la1 = (volatile u_char *)IQ80310_TIMER_LA1;
-	volatile u_char *la2 = (volatile u_char *)IQ80310_TIMER_LA2;
-
-	*la0 = val;
-	*la1 = val >> 8;
-	*la2 = (val >> 16) & 0x3f;
-}
-
-static u_long iq80310_read_timer (void)
-{
-	volatile u_char *la0 = (volatile u_char *)IQ80310_TIMER_LA0;
-	volatile u_char *la1 = (volatile u_char *)IQ80310_TIMER_LA1;
-	volatile u_char *la2 = (volatile u_char *)IQ80310_TIMER_LA2;
-	volatile u_char *la3 = (volatile u_char *)IQ80310_TIMER_LA3;
-	u_long b0, b1, b2, b3, val;
-
-	b0 = *la0; b1 = *la1; b2 = *la2; b3 = *la3;
-	b0 = (((b0 & 0x40) >> 1) | (b0 & 0x1f));
-	b1 = (((b1 & 0x40) >> 1) | (b1 & 0x1f));
-	b2 = (((b2 & 0x40) >> 1) | (b2 & 0x1f));
-	b3 = (b3 & 0x0f);
-	val = ((b0 << 0) | (b1 << 6) | (b2 << 12) | (b3 << 18));
-	return val;
-}
-
-/*
- * IRQs are disabled before entering here from do_gettimeofday().
- * Note that the counter may wrap.  When it does, 'elapsed' will
- * be small, but we will have a pending interrupt.
- */
-static unsigned long iq80310_gettimeoffset (void)
-{
-	unsigned long elapsed, usec;
-	unsigned int stat1, stat2;
-
-	stat1 = *(volatile u8 *)IQ80310_INT_STAT;
-	elapsed = iq80310_read_timer();
-	stat2 = *(volatile u8 *)IQ80310_INT_STAT;
-
-	/*
-	 * If an interrupt was pending before we read the timer,
-	 * we've already wrapped.  Factor this into the time.
-	 * If an interrupt was pending after we read the timer,
-	 * it may have wrapped between checking the interrupt
-	 * status and reading the timer.  Re-read the timer to
-	 * be sure its value is after the wrap.
-	 */
-	if (stat1 & 1)
-		elapsed += LATCH;
-	else if (stat2 & 1)
-		elapsed = LATCH + iq80310_read_timer();
-
-	/*
-	 * Now convert them to usec.
-	 */
-	usec = (unsigned long)(elapsed * (tick_nsec / 1000))/LATCH;
-
-	return usec;
-}
-
-
-static void iq80310_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-	volatile u_char *timer_en = (volatile u_char *)IQ80310_TIMER_EN;
-
-	/* clear timer interrupt */
-	*timer_en &= ~2;
-	*timer_en |= 2;
-
-	/*
-	 * AHEM..HACK
-	 *
-	 * Since the timer interrupt is cascaded through the CPLD and
-	 * the 80312 and the demux code calls do_IRQ, the irq count is
-	 * going to be atleast 2 when we get here and this will cause the
-	 * kernel to increment the system tick counter even if we're
-	 * idle. This causes it to look like there's always 100% system
-	 * time, which is not the case.  To get around it, we just decrement
-	 * the IRQ count before calling do_timer. We increment it again
-	 * b/c otherwise it will go negative and than bad things happen.
-	 *
-	 * -DS
-	 */
-	do_timer(regs);
-}
-
-extern unsigned long (*gettimeoffset)(void);
-
-static struct irqaction timer_irq = {
-	.name		= "timer",
-	.handler	= iq80310_timer_interrupt,
-};
-
-
-void __init time_init(void)
-{
-	volatile u_char *timer_en = (volatile u_char *)IQ80310_TIMER_EN;
-
-	gettimeoffset = iq80310_gettimeoffset;
-	setup_irq(IRQ_IQ80310_TIMER, &timer_irq);
-	*timer_en = 0;
-	iq80310_write_timer(LATCH);
-	*timer_en |= 2;
-	*timer_en |= 1;
-}
diff -Nru a/arch/arm/mach-iop310/mm.c b/arch/arm/mach-iop310/mm.c
--- a/arch/arm/mach-iop310/mm.c	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,70 +0,0 @@
-/*
- * linux/arch/arm/mach-iop310/mm.c
- *
- * Low level memory initialization for IOP310 based systems
- *
- * Author: Nicolas Pitre <npitre@mvista.com>
- *
- * Copyright 2000-2001 MontaVista Software Inc.
- *
- * This program is free software; you can redistribute  it and/or modify it
- * under  the terms of  the GNU General  Public License as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- *
- */
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-
-#include <asm/mach/map.h>
-#include <asm/mach-types.h>
-
-#ifdef CONFIG_IOP310_MU
-#include "message.h"
-#endif
-
-/*
- * Standard IO mapping for all IOP310 based systems
- */
-static struct map_desc iop80310_std_desc[] __initdata = {
- /* virtual     physical      length       type */
- // IOP310 Memory Mapped Registers
- { 0xe8001000,  0x00001000,   0x00001000,  MT_DEVICE },
- // PCI I/O Space
- { 0xfe000000,  0x90000000,   0x00020000,  MT_DEVICE }
-};
-
-void __init iop310_map_io(void)
-{
-	iotable_init(iop80310_std_desc, ARRAY_SIZE(iop80310_std_desc));
-}
-
-/*
- * IQ80310 specific IO mappings
- */
-#ifdef CONFIG_ARCH_IQ80310
-static struct map_desc iq80310_io_desc[] __initdata = {
- /* virtual     physical      length        type */
- // IQ80310 On-Board Devices
- { 0xfe800000,  0xfe800000,   0x00100000,   MT_DEVICE }
-};
-
-void __init iq80310_map_io(void)
-{
-#ifdef CONFIG_IOP310_MU
-	/* acquiring 1MB of memory aligned on 1MB boundary for MU */
-	mu_mem = __alloc_bootmem(0x100000, 0x100000, 0);
-#endif
-
-	iop310_map_io();
-
-	iotable_init(iq80310_io_desc, ARRAY_SIZE(iq80310_io_desc));
-}
-#endif // CONFIG_ARCH_IQ80310
-
diff -Nru a/arch/arm/mach-iop310/xs80200-irq.c b/arch/arm/mach-iop310/xs80200-irq.c
--- a/arch/arm/mach-iop310/xs80200-irq.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,65 +0,0 @@
-/*
- * linux/arch/arm/mach-iop310/xs80200-irq.c
- *
- * Generic IRQ handling for the XS80200 XScale core.
- *
- * Author:  Nicolas Pitre
- * Copyright:   (C) 2001 MontaVista 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/init.h>
-#include <linux/list.h>
-
-#include <asm/mach/irq.h>
-#include <asm/irq.h>
-#include <asm/hardware.h>
-
-#include <asm/mach-types.h>
-
-static void xs80200_irq_mask (unsigned int irq)
-{
-	unsigned long intctl;
-	asm ("mrc p13, 0, %0, c0, c0, 0" : "=r" (intctl));
-	switch (irq) {
-	    case IRQ_XS80200_BCU:     intctl &= ~(1<<3); break;
-	    case IRQ_XS80200_PMU:     intctl &= ~(1<<2); break;
-	    case IRQ_XS80200_EXTIRQ:  intctl &= ~(1<<1); break;
-	    case IRQ_XS80200_EXTFIQ:  intctl &= ~(1<<0); break;
-	}
-	asm ("mcr p13, 0, %0, c0, c0, 0" : : "r" (intctl));
-}
-
-static void xs80200_irq_unmask (unsigned int irq)
-{
-	unsigned long intctl;
-	asm ("mrc p13, 0, %0, c0, c0, 0" : "=r" (intctl));
-	switch (irq) {
-	    case IRQ_XS80200_BCU:	intctl |= (1<<3); break;
-	    case IRQ_XS80200_PMU:	intctl |= (1<<2); break;
-	    case IRQ_XS80200_EXTIRQ:	intctl |= (1<<1); break;
-	    case IRQ_XS80200_EXTFIQ:	intctl |= (1<<0); break;
-	}
-	asm ("mcr p13, 0, %0, c0, c0, 0" : : "r" (intctl));
-}
-
-static struct irqchip xs80200_chip = {
-	.ack	= xs80200_irq_mask,
-	.mask	= xs80200_irq_mask,
-	.unmask = xs80200_irq_unmask,
-};
-
-void __init xs80200_init_irq(void)
-{
-	unsigned int i;
-
-	asm("mcr p13, 0, %0, c0, c0, 0" : : "r" (0));
-
-	for (i = 0; i < NR_XS80200_IRQS; i++) {
-		set_irq_chip(i, &xs80200_chip);
-		set_irq_handler(i, do_level_IRQ);
-		set_irq_flags(i, IRQF_VALID);
-	}
-}
diff -Nru a/arch/arm/mach-iop3xx/Kconfig b/arch/arm/mach-iop3xx/Kconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/Kconfig	Sat Apr 19 19:51:50 2003
@@ -0,0 +1,54 @@
+
+menu "IOP3xx Implementation Options"
+
+choice
+	prompt "IOP3xx System Type"
+	default ARCH_IQ80310
+	depends on ARCH_IOP3XX
+
+config ARCH_IQ80310
+	bool "IQ80310"
+	help
+	  Say Y here if you want to run your kernel on the Intel IQ80310
+	  evaluation kit for the IOP310 chipset.
+
+config ARCH_IQ80321
+	bool "IQ80321"
+	help
+	  Say Y here if you want to run your kernel on the Intel IQ80321
+	  evaluation kit for the IOP321 chipset.
+endchoice
+
+# Which IOP variant are we running?
+config ARCH_IOP310
+	bool
+	default ARCH_IQ80310
+	help
+	  The IQ80310 uses the IOP310 variant.
+
+config ARCH_IOP321
+	bool
+	default ARCH_IQ80321
+	help
+	  The IQ80321 uses the IOP321 variant.
+
+comment "IOP3xx Chipset Features"
+
+config IOP3XX_AAU
+	bool "Support Intel IOP3xx Application Accelerator Unit (EXPERIMENTAL)"
+	depends on ARCH_IOP3XX && EXPERIMENTAL
+
+config IOP3XX_DMA
+	bool "Support Intel IOP3xx DMA (EXPERIMENTAL)"
+	depends on ARCH_IOP3XX && EXPERIMENTAL
+
+config IOP3XX_MU
+	bool "Support Intel IOP3xx Messaging Unit (EXPERIMENTAL)"
+	depends on ARCH_IOP3XX && EXPERIMENTAL
+
+config IOP3XX_PMON
+	bool "Support Intel IOP3xx Performance Monitor (EXPERIMENTAL)"
+	depends on ARCH_IOP3XX && EXPERIMENTAL
+
+endmenu
+
diff -Nru a/arch/arm/mach-iop3xx/Makefile b/arch/arm/mach-iop3xx/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/Makefile	Sat Apr 19 19:51:50 2003
@@ -0,0 +1,30 @@
+#
+# Makefile for the linux kernel.
+#
+
+# Object file lists.
+
+obj-y			:= arch.o
+
+obj-m			:=
+obj-n			:=
+obj-			:=
+
+obj-$(CONFIG_ARCH_IOP310)  += xs80200-irq.o iop310-irq.o iop310-pci.o mm.o
+
+obj-$(CONFIG_ARCH_IQ80310) += iq80310-pci.o iq80310-irq.o
+
+obj-$(CONFIG_ARCH_IOP321)  += iop321-irq.o iop321-pci.o mm-321.o iop321-time.o
+
+obj-$(CONFIG_ARCH_IQ80321) += iq80321-pci.o
+
+ifeq ($(CONFIG_ARCH_IQ80310),y)
+   ifneq ($(CONFIG_XSCALE_PMU_TIMER),y)
+      obj-y			+= iq80310-time.o
+   endif
+endif
+
+obj-$(CONFIG_IOP3XX_AAU) += aau.o
+obj-$(CONFIG_IOP3XX_DMA) += dma.o
+obj-$(CONFIG_IOP3XX_MU) += message.o
+obj-$(CONFIG_IOP3XX_PMON) += pmon.o
diff -Nru a/arch/arm/mach-iop3xx/arch.c b/arch/arm/mach-iop3xx/arch.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/arch.c	Sat Apr 19 19:51:48 2003
@@ -0,0 +1,74 @@
+/*
+ * linux/arch/arm/mach-iop3xx/arch.c
+ *
+ * Author: Nicolas Pitre <nico@cam.org>
+ * Copyright (C) 2001 MontaVista 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/config.h>
+#include <linux/init.h>
+#include <linux/major.h>
+#include <linux/fs.h>
+
+#include <asm/setup.h>
+#include <asm/system.h>
+#include <asm/memory.h>
+#include <asm/hardware.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+
+#ifdef CONFIG_ARCH_IQ80310
+extern void iq80310_map_io(void);
+extern void iq80310_init_irq(void);
+#endif
+
+#ifdef CONFIG_ARCH_IQ80321
+extern void iq80321_map_io(void);
+extern void iop321_init_irq(void);
+#endif
+
+#ifdef CONFIG_ARCH_IQ80310
+static void __init
+fixup_iq80310(struct machine_desc *desc, struct tag *tags,
+	      char **cmdline, struct meminfo *mi)
+{
+	system_rev = (*(volatile unsigned int*)0xfe830000) & 0x0f;
+
+	if (system_rev)
+		system_rev = 0xF;
+}
+#endif
+
+#ifdef CONFIG_ARCH_IQ80321
+static void __init
+fixup_iop321(struct machine_desc *desc, struct param_struct *params,
+	      char **cmdline, struct meminfo *mi)
+{
+}
+#endif
+
+#ifdef CONFIG_ARCH_IQ80310
+MACHINE_START(IQ80310, "Cyclone IQ80310")
+	MAINTAINER("MontaVista Software Inc.")
+	BOOT_MEM(0xa0000000, 0xfe000000, 0xfe000000)
+	FIXUP(fixup_iq80310)
+	MAPIO(iq80310_map_io)
+	INITIRQ(iq80310_init_irq)
+MACHINE_END
+
+#elif defined(CONFIG_ARCH_IQ80321)
+MACHINE_START(IQ80321, "Intel IQ80321")
+	MAINTAINER("MontaVista Software, Inc.")
+	BOOT_MEM(PHYS_OFFSET, IQ80321_UART1, 0xfe800000)
+	FIXUP(fixup_iop321)
+	MAPIO(iq80321_map_io)
+	INITIRQ(iop321_init_irq)
+MACHINE_END
+
+#else
+#error No machine descriptor defined for this IOP310 implementation
+#endif
diff -Nru a/arch/arm/mach-iop3xx/iop310-irq.c b/arch/arm/mach-iop3xx/iop310-irq.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iop310-irq.c	Sat Apr 19 19:51:50 2003
@@ -0,0 +1,113 @@
+/*
+ * linux/arch/arm/mach-iop3xx/iop310-irq.c
+ *
+ * Generic IOP310 IRQ handling functionality
+ *
+ * Author:  Nicolas Pitre
+ * Copyright:   (C) 2001 MontaVista 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.
+ *
+ * Added IOP310 chipset and IQ80310 board demuxing, masking code. - DS
+ *
+ */
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+
+#include <asm/mach/irq.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+
+#include <asm/mach-types.h>
+
+extern void xs80200_irq_mask(unsigned int);
+extern void xs80200_irq_unmask(unsigned int);
+extern void xs80200_init_irq(void);
+
+extern void do_IRQ(int, struct pt_regs *);
+
+static u32 iop310_mask /* = 0 */;
+
+static void iop310_irq_mask (unsigned int irq)
+{
+	iop310_mask ++;
+
+	/*
+	 * No mask bits on the 80312, so we have to
+	 * mask everything from the outside!
+	 */
+	if (iop310_mask == 1) {
+		disable_irq(IRQ_XS80200_EXTIRQ);
+		irq_desc[IRQ_XS80200_EXTIRQ].chip->mask(IRQ_XS80200_EXTIRQ);
+	}
+}
+
+static void iop310_irq_unmask (unsigned int irq)
+{
+	if (iop310_mask)
+		iop310_mask --;
+
+	/*
+	 * Check if all 80312 sources are unmasked now
+	 */
+	if (iop310_mask == 0)
+		enable_irq(IRQ_XS80200_EXTIRQ);
+}
+
+struct irqchip ext_chip = {
+	.ack	= iop310_irq_mask,
+	.mask	= iop310_irq_mask,
+	.unmask = iop310_irq_unmask,
+};
+
+void
+iop310_irq_demux(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
+{
+	u32 fiq1isr = *((volatile u32*)IOP310_FIQ1ISR);
+	u32 fiq2isr = *((volatile u32*)IOP310_FIQ2ISR);
+	struct irqdesc *d;
+	unsigned int irqno = 0;
+
+	if(fiq1isr)
+	{
+		if(fiq1isr & 0x1)
+			irqno = IRQ_IOP310_DMA0;
+		if(fiq1isr & 0x2)
+			irqno = IRQ_IOP310_DMA1;
+		if(fiq1isr & 0x4)
+			irqno = IRQ_IOP310_DMA2;
+		if(fiq1isr & 0x10)
+			irqno = IRQ_IOP310_PMON;
+		if(fiq1isr & 0x20)
+			irqno = IRQ_IOP310_AAU;
+	}
+	else
+	{
+		if(fiq2isr & 0x2)
+			irqno = IRQ_IOP310_I2C;
+		if(fiq2isr & 0x4)
+			irqno = IRQ_IOP310_MU;
+	}
+
+	if (irqno) {
+		d = irq_desc + irqno;
+		d->handle(irqno, d, regs);
+	}
+}
+
+void __init iop310_init_irq(void)
+{
+	unsigned int i;
+
+	for(i = IOP310_IRQ_OFS; i < NR_IOP310_IRQS; i++)
+	{
+		set_irq_chip(i, &ext_chip);
+		set_irq_handler(i, do_level_IRQ);
+		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
+	}
+
+	xs80200_init_irq();
+}
diff -Nru a/arch/arm/mach-iop3xx/iop310-pci.c b/arch/arm/mach-iop3xx/iop310-pci.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iop310-pci.c	Sat Apr 19 19:51:46 2003
@@ -0,0 +1,434 @@
+/*
+ * arch/arm/mach-iop3xx/iop310-pci.c
+ *
+ * PCI support for the Intel IOP310 chipset
+ *
+ * Matt Porter <mporter@mvista.com>
+ *
+ * Copyright (C) 2001 MontaVista 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/kernel.h>
+#include <linux/pci.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/hardware.h>
+#include <asm/mach/pci.h>
+
+#include <asm/arch/iop310.h>
+
+/*
+ *    *** Special note - why the IOP310 should NOT be used ***
+ *
+ * The PCI ATU is a brain dead implementation, only allowing 32-bit
+ * accesses to PCI configuration space.  This is especially brain
+ * dead for writes to this space.  A simple for-instance:
+ *
+ *  You want to modify the command register *without* corrupting the
+ *  status register.
+ *
+ *  To perform this, you need to read *32* bits of data from offset 4,
+ *  mask off the low 16, replace them with the new data, and write *32*
+ *  bits back.
+ *
+ *  Writing the status register at offset 6 with status bits set *clears*
+ *  the status.
+ *
+ * Hello?  Could we have a *SANE* implementation of a PCI ATU some day
+ * *PLEASE*?
+ */
+#undef DEBUG
+#ifdef DEBUG
+#define  DBG(x...) printk(x)
+#else
+#define  DBG(x...) do { } while (0)
+#endif
+
+/*
+ * Calculate the address, etc from the bus, devfn and register
+ * offset.  Note that we have two root buses, so we need some
+ * method to determine whether we need config type 0 or 1 cycles.
+ * We use a root bus number in our bus->sysdata structure for this.
+ */
+static u32 iop310_cfg_address(struct pci_bus *bus, int devfn, int where)
+{
+	struct pci_sys_data *sys = bus->sysdata;
+	u32 addr;
+
+	if (sys->busnr == bus->number)
+		addr = 1 << (PCI_SLOT(devfn) + 16);
+	else
+		addr = bus->number << 16 | PCI_SLOT(devfn) << 11 | 1;
+
+	addr |=	PCI_FUNC(devfn) << 8 | (where & ~3);
+
+	return addr;
+}
+
+/*
+ * Primary PCI interface support.
+ */
+static int iop310_pri_pci_status(void)
+{
+	unsigned int status;
+	int ret = 0;
+
+	status = *IOP310_PATUSR;
+	if (status & 0xf900) {
+		*IOP310_PATUSR = status & 0xf900;
+		ret = 1;
+	}
+	status = *IOP310_PATUISR;
+	if (status & 0x0000018f) {
+		*IOP310_PATUISR = status & 0x0000018f;
+		ret = 1;
+	}
+	status = *IOP310_PSR;
+	if (status & 0xf900) {
+		*IOP310_PSR = status & 0xf900;
+		ret = 1;
+	}
+	status = *IOP310_PBISR;
+	if (status & 0x003f) {
+		*IOP310_PBISR = status & 0x003f;
+		ret = 1;
+	}
+	return ret;
+}
+
+/*
+ * Simply write the address register and read the configuration
+ * data.  Note that the 4 nop's ensure that we are able to handle
+ * a delayed abort (in theory.)
+ */
+static inline u32 iop310_pri_read(unsigned long addr)
+{
+	u32 val;
+
+	__asm__ __volatile__(
+		"str	%1, [%2]\n\t"
+		"ldr	%0, [%3]\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		: "=r" (val)
+		: "r" (addr), "r" (IOP310_POCCAR), "r" (IOP310_POCCDR));
+
+	return val;
+}
+
+static int
+iop310_pri_read_config(struct pci_bus *bus, unsigned int devfn, int where,
+		       int size, u32 *value)
+{
+	unsigned long addr = iop310_cfg_address(bus, devfn, where);
+	u32 val = iop310_pri_read(addr) >> ((where & 3) * 8);
+
+	if (iop310_pri_pci_status())
+		val = 0xffffffff;
+
+	*value = val;
+
+	return PCIBIOS_SUCCESSFUL;
+}
+
+static int
+iop310_pri_write_config(struct pci_bus *bus, unsigned int devfn, int where,
+			int size, u32 value)
+{
+	unsigned long addr = iop310_cfg_address(bus, devfn, where);
+	u32 val;
+
+	if (size != 4) {
+		val = iop310_pri_read(addr);
+		if (!iop310_pri_pci_status() == 0)
+			return PCIBIOS_SUCCESSFUL;
+
+		where = (where & 3) * 8;
+
+		if (size == 1)
+			val &= ~(0xff << where);
+		else
+			val &= ~(0xffff << where);
+
+		*IOP310_POCCDR = val | value << where;
+	} else {
+		asm volatile(
+			"str	%1, [%2]\n\t"
+			"str	%0, [%3]\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			:
+			: "r" (value), "r" (addr),
+			  "r" (IOP310_POCCAR), "r" (IOP310_POCCDR));
+	}
+
+	return PCIBIOS_SUCCESSFUL;
+}
+
+static struct pci_ops iop310_primary_ops = {
+	.read	= iop310_pri_read_config,
+	.write	= iop310_pri_write_config,
+};
+
+/*
+ * Secondary PCI interface support.
+ */
+static int iop310_sec_pci_status(void)
+{
+	unsigned int usr, uisr;
+	int ret = 0;
+
+	usr = *IOP310_SATUSR;
+	uisr = *IOP310_SATUISR;
+	if (usr & 0xf900) {
+		*IOP310_SATUSR = usr & 0xf900;
+		ret = 1;
+	}
+	if (uisr & 0x0000069f) {
+		*IOP310_SATUISR = uisr & 0x0000069f;
+		ret = 1;
+	}
+	if (ret)
+		DBG("ERROR (%08x %08x)", usr, uisr);
+	return ret;
+}
+
+/*
+ * Simply write the address register and read the configuration
+ * data.  Note that the 4 nop's ensure that we are able to handle
+ * a delayed abort (in theory.)
+ */
+static inline u32 iop310_sec_read(unsigned long addr)
+{
+	u32 val;
+
+	__asm__ __volatile__(
+		"str	%1, [%2]\n\t"
+		"ldr	%0, [%3]\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		: "=r" (val)
+		: "r" (addr), "r" (IOP310_SOCCAR), "r" (IOP310_SOCCDR));
+
+	return val;
+}
+
+static int
+iop310_sec_read_config(struct pci_bus *bus, unsigned int devfn, int where,
+		       int size, u32 *value)
+{
+	unsigned long addr = iop310_cfg_address(bus, devfn, where);
+	u32 val = iop310_sec_read(addr) >> ((where & 3) * 8);
+
+	if (iop310_sec_pci_status())
+		val = 0xffffffff;
+
+	*value = val;
+
+	return PCIBIOS_SUCCESSFUL;
+}
+
+static int
+iop310_sec_write_config(struct pci_bus *bus, unsigned int devfn, int where,
+			int size, u32 value)
+{
+	unsigned long addr = iop310_cfg_address(bus, devfn, where);
+	u32 val;
+
+	if (size != 4) {
+		val = iop310_sec_read(addr);
+
+		if (!iop310_sec_pci_status() == 0)
+			return PCIBIOS_SUCCESSFUL;
+
+		where = (where & 3) * 8;
+
+		if (size == 1)
+			val &= ~(0xff << where);
+		else
+			val &= ~(0xffff << where);
+
+		*IOP310_SOCCDR = val | value << where;
+	} else {
+		asm volatile(
+			"str	%1, [%2]\n\t"
+			"str	%0, [%3]\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			:
+			: "r" (value), "r" (addr),
+			  "r" (IOP310_SOCCAR), "r" (IOP310_SOCCDR));
+	}
+
+	return PCIBIOS_SUCCESSFUL;
+}
+
+static struct pci_ops iop310_secondary_ops = {
+	.read	= iop310_sec_read_config,
+	.write	= iop310_sec_write_config,
+};
+
+/*
+ * When a PCI device does not exist during config cycles, the 80200 gets
+ * an external abort instead of returning 0xffffffff.  If it was an
+ * imprecise abort, we need to correct the return address to point after
+ * the instruction.  Also note that the Xscale manual says:
+ *
+ *  "if a stall-until-complete LD or ST instruction triggers an
+ *  imprecise fault, then that fault will be seen by the program
+ *  within 3 instructions."
+ *
+ * This does not appear to be the case.  With 8 NOPs after the load, we
+ * see the imprecise abort occurring on the STM of iop310_sec_pci_status()
+ * which is about 10 instructions away.
+ *
+ * Always trust reality!
+ */
+static int
+iop310_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
+{
+	DBG("PCI abort: address = 0x%08lx fsr = 0x%03x PC = 0x%08lx LR = 0x%08lx\n",
+		addr, fsr, regs->ARM_pc, regs->ARM_lr);
+
+	/*
+	 * If it was an imprecise abort, then we need to correct the
+	 * return address to be _after_ the instruction.
+	 */
+	if (fsr & (1 << 10))
+		regs->ARM_pc += 4;
+
+	return 0;
+}
+
+/*
+ * Scan an IOP310 PCI bus.  sys->bus defines which bus we scan.
+ */
+struct pci_bus *iop310_scan_bus(int nr, struct pci_sys_data *sys)
+{
+	struct pci_ops *ops;
+
+	if (nr)
+		ops = &iop310_secondary_ops;
+	else
+		ops = &iop310_primary_ops;
+
+	return pci_scan_bus(sys->busnr, ops, sys);
+}
+
+/*
+ * Setup the system data for controller 'nr'.   Return 0 if none found,
+ * 1 if found, or negative error.
+ *
+ * We can alter:
+ *  io_offset   - offset between IO resources and PCI bus BARs
+ *  mem_offset  - offset between mem resources and PCI bus BARs
+ *  resource[0] - parent IO resource
+ *  resource[1] - parent non-prefetchable memory resource
+ *  resource[2] - parent prefetchable memory resource
+ *  swizzle     - bridge swizzling function
+ *  map_irq     - irq mapping function
+ *
+ * Note that 'io_offset' and 'mem_offset' are left as zero since
+ * the IOP310 doesn't attempt to perform any address translation
+ * on accesses from the host to the bus.
+ */
+int iop310_setup(int nr, struct pci_sys_data *sys)
+{
+	struct resource *res;
+
+	if (nr >= 2)
+		return 0;
+
+	res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL);
+	if (!res)
+		panic("PCI: unable to alloc resources");
+
+	memset(res, 0, sizeof(struct resource) * 2);
+
+	switch (nr) {
+	case 0:
+		res[0].start = IOP310_PCIPRI_LOWER_IO + 0x6e000000;
+		res[0].end   = IOP310_PCIPRI_LOWER_IO + 0x6e00ffff;
+		res[0].name  = "PCI IO Primary";
+		res[0].flags = IORESOURCE_IO;
+
+		res[1].start = IOP310_PCIPRI_LOWER_MEM;
+		res[1].end   = IOP310_PCIPRI_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
+		res[1].name  = "PCI Memory Primary";
+		res[1].flags = IORESOURCE_MEM;
+		break;
+
+	case 1:
+		res[0].start = IOP310_PCISEC_LOWER_IO + 0x6e000000;
+		res[0].end   = IOP310_PCISEC_LOWER_IO + 0x6e00ffff;
+		res[0].name  = "PCI IO Secondary";
+		res[0].flags = IORESOURCE_IO;
+
+		res[1].start = IOP310_PCISEC_LOWER_MEM;
+		res[1].end   = IOP310_PCISEC_LOWER_MEM + IOP310_PCI_WINDOW_SIZE;
+		res[1].name  = "PCI Memory Secondary";
+		res[1].flags = IORESOURCE_MEM;
+		break;
+	}
+
+	request_resource(&ioport_resource, &res[0]);
+	request_resource(&iomem_resource, &res[1]);
+
+	sys->resource[0] = &res[0];
+	sys->resource[1] = &res[1];
+	sys->resource[2] = NULL;
+	sys->io_offset   = 0x6e000000;
+
+	return 1;
+}
+
+void iop310_init(void)
+{
+	DBG("PCI:  Intel 80312 PCI-to-PCI init code.\n");
+	DBG("  ATU secondary: ATUCR =0x%08x\n", *IOP310_ATUCR);
+	DBG("  ATU secondary: SOMWVR=0x%08x  SOIOWVR=0x%08x\n",
+		*IOP310_SOMWVR,	*IOP310_SOIOWVR);
+	DBG("  ATU secondary: SIABAR=0x%08x  SIALR  =0x%08x SIATVR=%08x\n",
+		*IOP310_SIABAR, *IOP310_SIALR, *IOP310_SIATVR);
+	DBG("  ATU primary:   POMWVR=0x%08x  POIOWVR=0x%08x\n",
+		*IOP310_POMWVR,	*IOP310_POIOWVR);
+	DBG("  ATU primary:   PIABAR=0x%08x  PIALR  =0x%08x PIATVR=%08x\n",
+		*IOP310_PIABAR, *IOP310_PIALR, *IOP310_PIATVR);
+	DBG("  P2P: PCR=0x%04x BCR=0x%04x EBCR=0x%04x\n",
+		*IOP310_PCR, *IOP310_BCR, *IOP310_EBCR);
+
+	/*
+	 * Windows have to be carefully opened via a nice set of calls
+	 * here or just some direct register fiddling in the board
+	 * specific init when we want transactions to occur between the
+	 * two PCI hoses.
+	 *
+	 * To do this, we will have manage RETRY assertion between the
+	 * firmware and the kernel.  This will ensure that the host
+	 * system's enumeration code is held off until we have tweaked
+	 * the interrupt routing and public/private IDSELs.
+	 *
+	 * For now we will simply default to disabling the integrated type
+	 * 81 P2P bridge.
+	 */
+	*IOP310_PCR &= 0xfff8;
+
+	hook_fault_code(16+6, iop310_pci_abort, SIGBUS, "imprecise external abort");
+}
diff -Nru a/arch/arm/mach-iop3xx/iop321-irq.c b/arch/arm/mach-iop3xx/iop321-irq.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iop321-irq.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,95 @@
+/*
+ * linux/arch/arm/mach-iop3xx/iop321-irq.c
+ *
+ * Generic IOP321 IRQ handling functionality
+ *
+ * Author: Rory Bolt <rorybolt@pacbell.net>
+ * Copyright (C) 2002 Rory Bolt
+ *
+ * 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.
+ *
+ * Added IOP3XX chipset and IQ80321 board masking code.
+ *
+ */
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+
+#include <asm/mach/irq.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+
+#include <asm/mach-types.h>
+
+static u32 iop321_mask /* = 0 */;
+
+static inline void intctl_write(u32 val)
+{
+	asm volatile("mcr p6,0,%0,c0,c0,0"::"r" (val));
+}
+
+static inline void intstr_write(u32 val)
+{
+	asm volatile("mcr p6,0,%0,c4,c0,0"::"r" (val));
+}
+
+static void
+iop321_irq_mask (unsigned int irq)
+{
+
+	iop321_mask &= ~(1 << (irq - IOP321_IRQ_OFS));
+
+	intctl_write(iop321_mask);
+}
+
+static void
+iop321_irq_unmask (unsigned int irq)
+{
+	iop321_mask |= (1 << (irq - IOP321_IRQ_OFS));
+
+	intctl_write(iop321_mask);
+}
+
+struct irqchip ext_chip = {
+	.ack    = iop321_irq_mask,
+	.mask   = iop321_irq_mask,
+	.unmask = iop321_irq_unmask,
+};
+
+void __init iop321_init_irq(void)
+{
+	unsigned int i, tmp;
+
+	/* Enable access to coprocessor 6 for dealing with IRQs.
+	 * From RMK:
+	 * Basically, the Intel documentation here is poor.  It appears that
+	 * you need to set the bit to be able to access the coprocessor from
+	 * SVC mode.  Whether that allows access from user space or not is
+	 * unclear.
+	 */
+	asm volatile (
+		"mrc p15, 0, %0, c15, c1, 0\n\t"
+		"orr %0, %0, %1\n\t"
+		"mcr p15, 0, %0, c15, c1, 0\n\t"
+		/* The action is delayed, so we have to do this: */
+		"mrc p15, 0, %0, c15, c1, 0\n\t"
+		"mov %0, %0\n\t"
+		"sub pc, pc, #4"
+		: "=r" (tmp) : "i" (1 << 6) );
+
+	intctl_write(0);		// disable all interrupts
+	intstr_write(0);		// treat all as IRQ
+	if(machine_is_iq80321()) 	// all interrupts are inputs to chip
+		*IOP321_PCIIRSR = 0x0f;
+
+	for(i = IOP321_IRQ_OFS; i < NR_IOP321_IRQS; i++)
+	{
+		set_irq_chip(i, &ext_chip);
+		set_irq_handler(i, do_level_IRQ);
+		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
+
+	}
+}
+
diff -Nru a/arch/arm/mach-iop3xx/iop321-pci.c b/arch/arm/mach-iop3xx/iop321-pci.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iop321-pci.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,257 @@
+/*
+ * arch/arm/mach-iop3xx/iop321-pci.c
+ *
+ * PCI support for the Intel IOP321 chipset
+ *
+ * Author: Rory Bolt <rorybolt@pacbell.net>
+ * Copyright (C) 2002 Rory Bolt
+ *
+ * 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/kernel.h>
+#include <linux/pci.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/hardware.h>
+#include <asm/mach/pci.h>
+
+#include <asm/arch/iop321.h>
+
+// #define DEBUG
+
+#ifdef DEBUG
+#define  DBG(x...) printk(x)
+#else
+#define  DBG(x...) do { } while (0)
+#endif
+
+/*
+ * This routine builds either a type0 or type1 configuration command.  If the
+ * bus is on the 80321 then a type0 made, else a type1 is created.
+ */
+static u32 iop321_cfg_address(struct pci_bus *bus, int devfn, int where)
+{
+	struct pci_sys_data *sys = bus->sysdata;
+	u32 addr;
+
+	if (sys->busnr == bus->number)
+		addr = 1 << (PCI_SLOT(devfn) + 16);
+	else
+		addr = bus->number << 16 | PCI_SLOT(devfn) << 11 | 1;
+
+	addr |=	PCI_FUNC(devfn) << 8 | (where & ~3);
+
+	return addr;
+}
+
+/*
+ * This routine checks the status of the last configuration cycle.  If an error
+ * was detected it returns a 1, else it returns a 0.  The errors being checked
+ * are parity, master abort, target abort (master and target).  These types of
+ * errors occure during a config cycle where there is no device, like during
+ * the discovery stage.
+ */
+static int iop321_pci_status(void)
+{
+	unsigned int status;
+	int ret = 0;
+
+	/*
+	 * Check the status registers.
+	 */
+	status = *IOP321_ATUSR;
+	if (status & 0xf900)
+	{
+		DBG("\t\t\tPCI: P0 - status = 0x%08x\n", status);
+		*IOP321_ATUSR = status & 0xf900;
+		ret = 1;
+	}
+	status = *IOP321_ATUISR;
+	if (status & 0x679f)
+	{
+		DBG("\t\t\tPCI: P1 - status = 0x%08x\n", status);
+		*IOP321_ATUISR = status & 0x679f;
+		ret = 1;
+	}
+	return ret;
+}
+
+/*
+ * Simply write the address register and read the configuration
+ * data.  Note that the 4 nop's ensure that we are able to handle
+ * a delayed abort (in theory.)
+ */
+static inline u32 iop321_read(unsigned long addr)
+{
+	u32 val;
+
+	__asm__ __volatile__(
+		"str	%1, [%2]\n\t"
+		"ldr	%0, [%3]\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		"nop\n\t"
+		: "=r" (val)
+		: "r" (addr), "r" (IOP321_OCCAR), "r" (IOP321_OCCDR));
+
+	return val;
+}
+
+/*
+ * The read routines must check the error status of the last configuration
+ * cycle.  If there was an error, the routine returns all hex f's.
+ */
+static int
+iop321_read_config(struct pci_bus *bus, unsigned int devfn, int where,
+		int size, u32 *value)
+{
+	unsigned long addr = iop321_cfg_address(bus, devfn, where);
+	u32 val = iop321_read(addr) >> ((where & 3) * 8);
+
+	if( iop321_pci_status() )
+		val = 0xffffffff;
+
+	*value = val;
+
+	return PCIBIOS_SUCCESSFUL;
+}
+
+static int
+iop321_write_config(struct pci_bus *bus, unsigned int devfn, int where,
+		int size, u32 value)
+{
+	unsigned long addr = iop321_cfg_address(bus, devfn, where);
+	u32 val;
+
+	if (size != 4) {
+		val = iop321_read(addr);
+		if (!iop321_pci_status() == 0)
+			return PCIBIOS_SUCCESSFUL;
+
+		where = (where & 3) * 8;
+
+		if (size == 1)
+			val &= ~(0xff << where);
+		else
+			val &= ~(0xffff << where);
+
+		*IOP321_OCCDR = val | value << where;
+	} else {
+		asm volatile(
+			"str	%1, [%2]\n\t"
+			"str	%0, [%3]\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			"nop\n\t"
+			:
+			: "r" (value), "r" (addr),
+			  "r" (IOP321_OCCAR), "r" (IOP321_OCCDR));
+	}
+}
+
+static struct pci_ops iop321_ops = {
+	.read	= iop321_read_config,
+	.write	= iop321_write_config,
+};
+
+/*
+ * When a PCI device does not exist during config cycles, the 80200 gets a
+ * bus error instead of returning 0xffffffff. This handler simply returns.
+ */
+int
+iop321_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
+{
+	DBG("PCI abort: address = 0x%08lx fsr = 0x%03x PC = 0x%08lx LR = 0x%08lx\n",
+		addr, fsr, regs->ARM_pc, regs->ARM_lr);
+
+	/*
+	 * If it was an imprecise abort, then we need to correct the
+	 * return address to be _after_ the instruction.
+	 */
+	if (fsr & (1 << 10))
+		regs->ARM_pc += 4;
+
+	return 0;
+}
+
+/*
+ * Scan an IOP321 PCI bus.  sys->bus defines which bus we scan.
+ */
+struct pci_bus *iop321_scan_bus(int nr, struct pci_sys_data *sys)
+{
+	return pci_scan_bus(sys->busnr, &iop321_ops, sys);
+}
+
+/*
+ * Setup the system data for controller 'nr'.   Return 0 if none found,
+ * 1 if found, or negative error.
+ */
+int iop321_setup(int nr, struct pci_sys_data *sys)
+{
+	struct resource *res;
+
+	if (nr >= 1)
+		return 0;
+
+	res = kmalloc(sizeof(struct resource) * 2, GFP_KERNEL);
+	if (!res)
+		panic("PCI: unable to alloc resources");
+
+	memset(res, 0, sizeof(struct resource) * 2);
+
+	switch (nr) {
+	case 0:
+		res[0].start = IOP321_PCI_LOWER_IO + 0x6e000000;
+		res[0].end   = IOP321_PCI_LOWER_IO + 0x6e00ffff;
+		res[0].name  = "PCI IO Primary";
+		res[0].flags = IORESOURCE_IO;
+
+		res[1].start = IOP321_PCI_LOWER_MEM;
+		res[1].end   = IOP321_PCI_LOWER_MEM + IOP321_PCI_WINDOW_SIZE;
+		res[1].name  = "PCI Memory Primary";
+		res[1].flags = IORESOURCE_MEM;
+		break;
+	}
+
+	request_resource(&ioport_resource, &res[0]);
+	request_resource(&iomem_resource, &res[1]);
+
+	sys->resource[0] = &res[0];
+	sys->resource[1] = &res[1];
+	sys->resource[2] = NULL;
+	sys->io_offset   = 0x6e000000;
+
+	return 1;
+}
+
+
+
+
+void iop321_init(void)
+{
+	DBG("PCI:  Intel 80321 PCI init code.\n");
+	DBG("\tATU: IOP321_ATUCMD=0x%04x\n", *IOP321_ATUCMD);
+	DBG("\tATU: IOP321_OMWTVR0=0x%04x, IOP321_OIOWTVR=0x%04x\n",
+			*IOP321_OMWTVR0,
+			*IOP321_OIOWTVR);
+	DBG("\tATU: IOP321_ATUCR=0x%08x\n", *IOP321_ATUCR);
+	DBG("\tATU: IOP321_IABAR0=0x%08x IOP321_IALR0=0x%08x IOP321_IATVR0=%08x\n", *IOP321_IABAR0, *IOP321_IALR0, *IOP321_IATVR0);
+	DBG("\tATU: IOP321_ERBAR=0x%08x IOP321_ERLR=0x%08x IOP321_ERTVR=%08x\n", *IOP321_ERBAR, *IOP321_ERLR, *IOP321_ERTVR);
+	DBG("\tATU: IOP321_IABAR2=0x%08x IOP321_IALR2=0x%08x IOP321_IATVR2=%08x\n", *IOP321_IABAR2, *IOP321_IALR2, *IOP321_IATVR2);
+	DBG("\tATU: IOP321_IABAR3=0x%08x IOP321_IALR3=0x%08x IOP321_IATVR3=%08x\n", *IOP321_IABAR3, *IOP321_IALR3, *IOP321_IATVR3);
+
+	hook_fault_code(16+6, iop321_pci_abort, SIGBUS, "imprecise external abort");
+
+}
+
diff -Nru a/arch/arm/mach-iop3xx/iop321-time.c b/arch/arm/mach-iop3xx/iop321-time.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iop321-time.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,92 @@
+/*
+ * arch/arm/mach-iop3xx/iop321-time.c
+ *
+ * Timer code for IOP321 based systems
+ *
+ * Author: Deepak Saxena <dsaxena@mvista.com>
+ *
+ * Copyright 2002 MontaVista Software Inc.
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ */
+
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/time.h>
+#include <linux/init.h>
+#include <linux/timex.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+#include <asm/mach-types.h>
+#include <asm/mach/irq.h>
+
+static unsigned long iop321_gettimeoffset(void)
+{
+	unsigned long elapsed, usec;
+
+	/*
+	 * FIXME: Implement what is described in this comment.
+	 *
+	 * If an interrupt was pending before we read the timer,
+	 * we've already wrapped.  Factor this into the time.
+	 * If an interrupt was pending after we read the timer,
+	 * it may have wrapped between checking the interrupt
+	 * status and reading the timer.  Re-read the timer to
+	 * be sure its value is after the wrap.
+	 */
+
+	elapsed = *IOP321_TU_TCR0;
+
+	/*
+	 * Now convert them to usec.
+	 */
+	usec = (unsigned long)((LATCH - elapsed) * (tick_nsec / 1000)) / LATCH;
+
+	return usec;
+}
+
+static void iop321_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	u32 tisr;
+
+	asm volatile("mrc p6, 0, %0, c6, c1, 0" : "=r" (tisr));
+
+	tisr |= 1;
+
+	asm volatile("mcr p6, 0, %0, c6, c1, 0" : : "r" (tisr));
+
+	do_timer(regs);
+}
+
+extern unsigned long (*gettimeoffset)(void);
+
+static struct irqaction timer_irq = {
+	.name		= "timer",
+	.handler	= iop321_timer_interrupt,
+};
+
+extern int setup_arm_irq(int, struct irqaction*);
+
+void __init time_init(void)
+{
+	u32 timer_ctl;
+	u32 latch = LATCH;
+
+	gettimeoffset = iop321_gettimeoffset;
+	setup_irq(IRQ_IOP321_TIMER0, &timer_irq);
+
+	timer_ctl = IOP321_TMR_EN | IOP321_TMR_PRIVILEGED | IOP321_TMR_RELOAD |
+			IOP321_TMR_RATIO_1_1;
+
+	asm volatile("mcr p6, 0, %0, c4, c1, 0" : : "r" (LATCH));
+
+	asm volatile("mcr p6, 0, %0, c0, c1, 0"	: : "r" (timer_ctl));
+}
+
+
diff -Nru a/arch/arm/mach-iop3xx/iq80310-irq.c b/arch/arm/mach-iop3xx/iq80310-irq.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iq80310-irq.c	Sat Apr 19 19:51:28 2003
@@ -0,0 +1,141 @@
+/*
+ * linux/arch/arm/mach-iop3xx/iq80310-irq.c
+ *
+ * IRQ hadling/demuxing for IQ80310 board
+ *
+ * Author:  Nicolas Pitre
+ * Copyright:   (C) 2001 MontaVista 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.
+ *
+ * 2.4.7-rmk1-iop310.1
+ *     Moved demux from asm to C - DS
+ *     Fixes for various revision boards - DS
+ */
+#include <linux/init.h>
+#include <linux/list.h>
+
+#include <asm/irq.h>
+#include <asm/mach/irq.h>
+#include <asm/hardware.h>
+#include <asm/system.h>
+
+#include <asm/mach-types.h>
+
+extern void iop310_init_irq(void);
+extern void iop310_irq_demux(unsigned int, struct irqdesc *, struct pt_regs *);
+
+static void iq80310_irq_mask(unsigned int irq)
+{
+	*(volatile char *)IQ80310_INT_MASK |= (1 << (irq - IQ80310_IRQ_OFS));
+}
+
+static void iq80310_irq_unmask(unsigned int irq)
+{
+	*(volatile char *)IQ80310_INT_MASK &= ~(1 << (irq - IQ80310_IRQ_OFS));
+}
+
+static struct irqchip iq80310_irq_chip = {
+	.ack	= iq80310_irq_mask,
+	.mask	= iq80310_irq_mask,
+	.unmask = iq80310_irq_unmask,
+};
+
+extern struct irqchip ext_chip;
+
+static void
+iq80310_cpld_irq_handler(unsigned int irq, struct irqdesc *desc,
+			 struct pt_regs *regs)
+{
+	unsigned int irq_stat = *(volatile u8*)IQ80310_INT_STAT;
+	unsigned int irq_mask = *(volatile u8*)IQ80310_INT_MASK;
+	unsigned int i, handled = 0;
+	struct irqdesc *d;
+
+	desc->chip->ack(irq);
+
+	/*
+	 * Mask out the interrupts which aren't enabled.
+	 */
+	irq_stat &= 0x1f & ~irq_mask;
+
+	/*
+	 * Test each IQ80310 CPLD interrupt
+	 */
+	for (i = IRQ_IQ80310_TIMER, d = irq_desc + IRQ_IQ80310_TIMER;
+	     irq_stat; i++, d++, irq_stat >>= 1)
+		if (irq_stat & 1) {
+			d->handle(i, d, regs);
+			handled++;
+		}
+
+	/*
+	 * If running on a board later than REV D.1, we can
+	 * decode the PCI interrupt status.
+	 */
+	if (system_rev) {
+		irq_stat = *((volatile u8*)IQ80310_PCI_INT_STAT) & 7;
+
+		for (i = IRQ_IQ80310_INTA, d = irq_desc + IRQ_IQ80310_INTA;
+		     irq_stat; i++, d++, irq_stat >>= 1)
+			if (irq_stat & 0x1) {
+				d->handle(i, d, regs);
+				handled++;
+			}
+	}
+
+	/*
+	 * If on a REV D.1 or lower board, we just assumed INTA
+	 * since PCI is not routed, and it may actually be an
+	 * on-chip interrupt.
+	 *
+	 * Note that we're giving on-chip interrupts slightly
+	 * higher priority than PCI by handling them first.
+	 *
+	 * On boards later than REV D.1, if we didn't read a
+	 * CPLD interrupt, we assume it's from a device on the
+	 * chipset itself.
+	 */
+	if (system_rev == 0 || handled == 0)
+		iop310_irq_demux(irq, desc, regs);
+
+	desc->chip->unmask(irq);
+}
+
+void __init iq80310_init_irq(void)
+{
+	volatile char *mask = (volatile char *)IQ80310_INT_MASK;
+	unsigned int i;
+
+	iop310_init_irq();
+
+	/*
+	 * Setup PIRSR to route PCI interrupts into xs80200
+	 */
+	*IOP310_PIRSR = 0xff;
+
+	/*
+	 * Setup the IRQs in the FE820000/FE860000 registers
+	 */
+	for (i = IQ80310_IRQ_OFS; i <= IRQ_IQ80310_INTD; i++) {
+		set_irq_chip(i, &iq80310_irq_chip);
+		set_irq_handler(i, do_level_IRQ);
+		set_irq_flags(i, IRQF_VALID | IRQF_PROBE);
+	}
+
+	/*
+	 * Setup the PCI IRQs
+	 */
+	for (i = IRQ_IQ80310_INTA; i < IRQ_IQ80310_INTC; i++) {
+		set_irq_chip(i, &ext_chip);
+		set_irq_handler(i, do_level_IRQ);
+		set_irq_flags(i, IRQF_VALID);
+	}
+
+	*mask = 0xff;  /* mask all sources */
+
+	set_irq_chained_handler(IRQ_XS80200_EXTIRQ,
+				&iq80310_cpld_irq_handler);
+}
diff -Nru a/arch/arm/mach-iop3xx/iq80310-pci.c b/arch/arm/mach-iop3xx/iq80310-pci.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iq80310-pci.c	Sat Apr 19 19:51:46 2003
@@ -0,0 +1,164 @@
+/*
+ * arch/arm/mach-iop3xx/iq80310-pci.c
+ *
+ * PCI support for the Intel IQ80310 reference board
+ *
+ * Matt Porter <mporter@mvista.com>
+ *
+ * Copyright (C) 2001 MontaVista 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/kernel.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
+
+/*
+ * The following macro is used to lookup irqs in a standard table
+ * format for those systems that do not already have PCI
+ * interrupts properly routed.  We assume 1 <= pin <= 4
+ */
+#define PCI_IRQ_TABLE_LOOKUP(minid,maxid)	\
+({ int _ctl_ = -1;				\
+   unsigned int _idsel = idsel - minid;		\
+   if (_idsel <= maxid)				\
+      _ctl_ = pci_irq_table[_idsel][pin-1];	\
+   _ctl_; })
+
+#define INTA	IRQ_IQ80310_INTA
+#define INTB	IRQ_IQ80310_INTB
+#define INTC	IRQ_IQ80310_INTC
+#define INTD	IRQ_IQ80310_INTD
+
+#define INTE	IRQ_IQ80310_I82559
+
+typedef u8 irq_table[4];
+
+/*
+ * IRQ tables for primary bus.
+ *
+ * On a Rev D.1 and older board, INT A-C are not routed, so we
+ * just fake it as INTA and than we take care of handling it
+ * correctly in the IRQ demux routine.
+ */
+static irq_table pci_pri_d_irq_table[] = {
+/* Pin:    A     B     C     D */
+	{ INTA, INTD, INTA, INTA }, /*  PCI Slot J3 */
+	{ INTD, INTA, INTA, INTA }, /*  PCI Slot J4 */
+};
+
+static irq_table pci_pri_f_irq_table[] = {
+/* Pin:    A     B     C     D */
+	{ INTC, INTD, INTA, INTB }, /*  PCI Slot J3 */
+	{ INTD, INTA, INTB, INTC }, /*  PCI Slot J4 */
+};
+
+static int __init
+iq80310_pri_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
+{
+	irq_table *pci_irq_table;
+
+	BUG_ON(pin < 1 || pin > 4);
+
+	if (!system_rev) {
+		pci_irq_table = pci_pri_d_irq_table;
+	} else {
+		pci_irq_table = pci_pri_f_irq_table;
+	}
+
+	return PCI_IRQ_TABLE_LOOKUP(2, 3);
+}
+
+/*
+ * IRQ tables for secondary bus.
+ *
+ * On a Rev D.1 and older board, INT A-C are not routed, so we
+ * just fake it as INTA and than we take care of handling it
+ * correctly in the IRQ demux routine.
+ */
+static irq_table pci_sec_d_irq_table[] = {
+/* Pin:    A     B     C     D */
+	{ INTA, INTA, INTA, INTD }, /*  PCI Slot J1 */
+	{ INTA, INTA, INTD, INTA }, /*  PCI Slot J5 */
+	{ INTE, INTE, INTE, INTE }, /*  P2P Bridge */
+};
+
+static irq_table pci_sec_f_irq_table[] = {
+/* Pin:	   A     B     C     D */
+	{ INTA, INTB, INTC, INTD }, /* PCI Slot J1 */
+	{ INTB, INTC, INTD, INTA }, /* PCI Slot J5 */
+	{ INTE, INTE, INTE, INTE }, /* P2P Bridge */
+};
+
+static int __init
+iq80310_sec_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
+{
+	irq_table *pci_irq_table;
+
+	BUG_ON(pin < 1 || pin > 4);
+
+	if (!system_rev) {
+		pci_irq_table = pci_sec_d_irq_table;
+	} else {
+		pci_irq_table = pci_sec_f_irq_table;
+	}
+
+	return PCI_IRQ_TABLE_LOOKUP(0, 2);
+}
+
+static int iq80310_pri_host;
+
+static int iq80310_setup(int nr, struct pci_sys_data *sys)
+{
+	switch (nr) {
+	case 0:
+		if (!iq80310_pri_host)
+			return 0;
+
+		sys->map_irq = iq80310_pri_map_irq;
+		break;
+
+	case 1:
+		sys->map_irq = iq80310_sec_map_irq;
+		break;
+
+	default:
+		return 0;
+	}
+
+	return iop310_setup(nr, sys);
+}
+
+static void iq80310_preinit(void)
+{
+	iq80310_pri_host = *(volatile u32 *)IQ80310_BACKPLANE & 1;
+
+	printk(KERN_INFO "PCI: IQ80310 is a%s\n",
+		iq80310_pri_host ? " system controller" : "n agent");
+
+	iop310_init();
+}
+
+static struct hw_pci iq80310_pci __initdata = {
+	.swizzle	= pci_std_swizzle,
+	.nr_controllers = 2,
+	.setup		= iq80310_setup,
+	.scan		= iop310_scan_bus,
+	.preinit	= iq80310_preinit,
+};
+
+static int __init iq80310_pci_init(void)
+{
+	if (machine_is_iq80310())
+		pci_common_init(&iq80310_pci);
+	return 0;
+}
+
+subsys_initcall(iq80310_pci_init);
diff -Nru a/arch/arm/mach-iop3xx/iq80310-time.c b/arch/arm/mach-iop3xx/iq80310-time.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iq80310-time.c	Sat Apr 19 19:51:49 2003
@@ -0,0 +1,134 @@
+/*
+ * linux/arch/arm/mach-iop3xx/time-iq80310.c
+ *
+ * Timer functions for IQ80310 onboard timer
+ *
+ * Author:  Nicolas Pitre
+ * Copyright:   (C) 2001 MontaVista 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/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/time.h>
+#include <linux/init.h>
+#include <linux/timex.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/uaccess.h>
+#include <asm/mach-types.h>
+#include <asm/mach/irq.h>
+
+static void iq80310_write_timer (u_long val)
+{
+	volatile u_char *la0 = (volatile u_char *)IQ80310_TIMER_LA0;
+	volatile u_char *la1 = (volatile u_char *)IQ80310_TIMER_LA1;
+	volatile u_char *la2 = (volatile u_char *)IQ80310_TIMER_LA2;
+
+	*la0 = val;
+	*la1 = val >> 8;
+	*la2 = (val >> 16) & 0x3f;
+}
+
+static u_long iq80310_read_timer (void)
+{
+	volatile u_char *la0 = (volatile u_char *)IQ80310_TIMER_LA0;
+	volatile u_char *la1 = (volatile u_char *)IQ80310_TIMER_LA1;
+	volatile u_char *la2 = (volatile u_char *)IQ80310_TIMER_LA2;
+	volatile u_char *la3 = (volatile u_char *)IQ80310_TIMER_LA3;
+	u_long b0, b1, b2, b3, val;
+
+	b0 = *la0; b1 = *la1; b2 = *la2; b3 = *la3;
+	b0 = (((b0 & 0x40) >> 1) | (b0 & 0x1f));
+	b1 = (((b1 & 0x40) >> 1) | (b1 & 0x1f));
+	b2 = (((b2 & 0x40) >> 1) | (b2 & 0x1f));
+	b3 = (b3 & 0x0f);
+	val = ((b0 << 0) | (b1 << 6) | (b2 << 12) | (b3 << 18));
+	return val;
+}
+
+/*
+ * IRQs are disabled before entering here from do_gettimeofday().
+ * Note that the counter may wrap.  When it does, 'elapsed' will
+ * be small, but we will have a pending interrupt.
+ */
+static unsigned long iq80310_gettimeoffset (void)
+{
+	unsigned long elapsed, usec;
+	unsigned int stat1, stat2;
+
+	stat1 = *(volatile u8 *)IQ80310_INT_STAT;
+	elapsed = iq80310_read_timer();
+	stat2 = *(volatile u8 *)IQ80310_INT_STAT;
+
+	/*
+	 * If an interrupt was pending before we read the timer,
+	 * we've already wrapped.  Factor this into the time.
+	 * If an interrupt was pending after we read the timer,
+	 * it may have wrapped between checking the interrupt
+	 * status and reading the timer.  Re-read the timer to
+	 * be sure its value is after the wrap.
+	 */
+	if (stat1 & 1)
+		elapsed += LATCH;
+	else if (stat2 & 1)
+		elapsed = LATCH + iq80310_read_timer();
+
+	/*
+	 * Now convert them to usec.
+	 */
+	usec = (unsigned long)(elapsed * (tick_nsec / 1000))/LATCH;
+
+	return usec;
+}
+
+
+static void iq80310_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+	volatile u_char *timer_en = (volatile u_char *)IQ80310_TIMER_EN;
+
+	/* clear timer interrupt */
+	*timer_en &= ~2;
+	*timer_en |= 2;
+
+	/*
+	 * AHEM..HACK
+	 *
+	 * Since the timer interrupt is cascaded through the CPLD and
+	 * the 80312 and the demux code calls do_IRQ, the irq count is
+	 * going to be atleast 2 when we get here and this will cause the
+	 * kernel to increment the system tick counter even if we're
+	 * idle. This causes it to look like there's always 100% system
+	 * time, which is not the case.  To get around it, we just decrement
+	 * the IRQ count before calling do_timer. We increment it again
+	 * b/c otherwise it will go negative and than bad things happen.
+	 *
+	 * -DS
+	 */
+	do_timer(regs);
+}
+
+extern unsigned long (*gettimeoffset)(void);
+
+static struct irqaction timer_irq = {
+	.name		= "timer",
+	.handler	= iq80310_timer_interrupt,
+};
+
+
+void __init time_init(void)
+{
+	volatile u_char *timer_en = (volatile u_char *)IQ80310_TIMER_EN;
+
+	gettimeoffset = iq80310_gettimeoffset;
+	setup_irq(IRQ_IQ80310_TIMER, &timer_irq);
+	*timer_en = 0;
+	iq80310_write_timer(LATCH);
+	*timer_en |= 2;
+	*timer_en |= 1;
+}
diff -Nru a/arch/arm/mach-iop3xx/iq80321-pci.c b/arch/arm/mach-iop3xx/iq80321-pci.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/iq80321-pci.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,98 @@
+/*
+ * arch/arm/mach-iop3xx/iq80321-pci.c
+ *
+ * PCI support for the Intel IQ80321 reference board
+ *
+ * Author: Rory Bolt <rorybolt@pacbell.net>
+ * Copyright (C) 2002 Rory Bolt
+ *
+ * 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/kernel.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/mach/pci.h>
+#include <asm/mach-types.h>
+
+/*
+ * The following macro is used to lookup irqs in a standard table
+ * format for those systems that do not already have PCI
+ * interrupts properly routed.  We assume 1 <= pin <= 4
+ */
+#define PCI_IRQ_TABLE_LOOKUP(minid,maxid)	\
+({ int _ctl_ = -1;				\
+   unsigned int _idsel = idsel - minid;		\
+   if (_idsel <= maxid)				\
+      _ctl_ = pci_irq_table[_idsel][pin-1];	\
+   _ctl_; })
+
+#define INTA	IRQ_IQ80321_INTA
+#define INTB	IRQ_IQ80321_INTB
+#define INTC	IRQ_IQ80321_INTC
+#define INTD	IRQ_IQ80321_INTD
+
+#define INTE	IRQ_IQ80321_I82544
+
+typedef u8 irq_table[4];
+
+static irq_table pci_irq_table[] = {
+	/*
+	 * PCI IDSEL/INTPIN->INTLINE
+	 * A       B       C       D
+	 */
+	{INTE, INTE, INTE, INTE}, /* Gig-E */
+	{INTD, INTC, INTD, INTA}, /* Unused */
+	{INTC, INTD, INTA, INTB}, /* PCI-X Slot */
+};
+
+static inline int __init
+iq80321_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
+{
+	BUG_ON(pin < 1 || pin > 4);
+
+	return PCI_IRQ_TABLE_LOOKUP(2, 3);
+}
+
+static int iq80321_setup(int nr, struct pci_sys_data *sys)
+{
+	switch (nr) {
+	case 0:
+		sys->map_irq = iq80321_map_irq;
+		break;
+	default:
+		return 0;
+	}
+
+	return iop321_setup(nr, sys);
+}
+
+static void iq80321_preinit(void)
+{
+	iop321_init();
+}
+
+static struct hw_pci iq80321_pci __initdata = {
+	.swizzle	= pci_std_swizzle,
+	.nr_controllers = 1,
+	.setup		= iq80321_setup,
+	.scan		= iop321_scan_bus,
+	.preinit	= iq80321_preinit,
+};
+
+static int __init iq80321_pci_init(void)
+{
+	if (machine_is_iq80321())
+		pci_common_init(&iq80321_pci);
+	return 0;
+}
+
+subsys_initcall(iq80321_pci_init);
+
+
+
+
diff -Nru a/arch/arm/mach-iop3xx/mm-321.c b/arch/arm/mach-iop3xx/mm-321.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/mm-321.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,64 @@
+/*
+ * linux/arch/arm/mach-iop3xx/mm.c
+ *
+ * Low level memory intialization for IOP321 based systems
+ *
+ * Author: Rory Bolt <rorybolt@pacbell.net>
+ * Copyright (C) 2002 Rory Bolt
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+#include <linux/mm.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+
+#include <asm/mach/map.h>
+#include <asm/mach-types.h>
+
+
+/*
+ * Standard IO mapping for all IOP321 based systems
+ */
+static struct map_desc iop80321_std_desc[] __initdata = {
+ /* virtual     physical      length      type */
+
+ /* mem mapped registers */
+ { 0xfff00000,  0xffffe000,   0x00002000,  MT_DEVICE },
+
+ /* PCI IO space */
+ { 0xfe000000,  0x90000000,   0x00020000,  MT_DEVICE }
+};
+
+void __init iop321_map_io(void)
+{
+	iotable_init(iop80321_std_desc, ARRAY_SIZE(iop80321_std_desc));
+}
+
+/*
+ * IQ80321 specific IO mappings
+ *
+ * We use RedBoot's setup for the onboard devices.
+ */
+#ifdef CONFIG_ARCH_IQ80321
+static struct map_desc iq80321_io_desc[] __initdata = {
+ /* virtual     physical      length        type */
+
+ /* on-board devices */
+ { 0xfe800000,  0xfe800000,   0x00100000,   MT_DEVICE }
+};
+
+void __init iq80321_map_io(void)
+{
+	iop321_map_io();
+
+	iotable_init(iq80321_io_desc, ARRAY_SIZE(iq80321_io_desc));
+}
+#endif // CONFIG_ARCH_IQ80321
diff -Nru a/arch/arm/mach-iop3xx/mm.c b/arch/arm/mach-iop3xx/mm.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/mm.c	Sat Apr 19 19:51:28 2003
@@ -0,0 +1,70 @@
+/*
+ * linux/arch/arm/mach-iop3xx/mm.c
+ *
+ * Low level memory initialization for IOP310 based systems
+ *
+ * Author: Nicolas Pitre <npitre@mvista.com>
+ *
+ * Copyright 2000-2001 MontaVista Software Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+
+#include <asm/mach/map.h>
+#include <asm/mach-types.h>
+
+#ifdef CONFIG_IOP310_MU
+#include "message.h"
+#endif
+
+/*
+ * Standard IO mapping for all IOP310 based systems
+ */
+static struct map_desc iop80310_std_desc[] __initdata = {
+ /* virtual     physical      length       type */
+ // IOP310 Memory Mapped Registers
+ { 0xe8001000,  0x00001000,   0x00001000,  MT_DEVICE },
+ // PCI I/O Space
+ { 0xfe000000,  0x90000000,   0x00020000,  MT_DEVICE }
+};
+
+void __init iop310_map_io(void)
+{
+	iotable_init(iop80310_std_desc, ARRAY_SIZE(iop80310_std_desc));
+}
+
+/*
+ * IQ80310 specific IO mappings
+ */
+#ifdef CONFIG_ARCH_IQ80310
+static struct map_desc iq80310_io_desc[] __initdata = {
+ /* virtual     physical      length        type */
+ // IQ80310 On-Board Devices
+ { 0xfe800000,  0xfe800000,   0x00100000,   MT_DEVICE }
+};
+
+void __init iq80310_map_io(void)
+{
+#ifdef CONFIG_IOP310_MU
+	/* acquiring 1MB of memory aligned on 1MB boundary for MU */
+	mu_mem = __alloc_bootmem(0x100000, 0x100000, 0);
+#endif
+
+	iop310_map_io();
+
+	iotable_init(iq80310_io_desc, ARRAY_SIZE(iq80310_io_desc));
+}
+#endif // CONFIG_ARCH_IQ80310
+
diff -Nru a/arch/arm/mach-iop3xx/xs80200-irq.c b/arch/arm/mach-iop3xx/xs80200-irq.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/arm/mach-iop3xx/xs80200-irq.c	Sat Apr 19 19:51:49 2003
@@ -0,0 +1,65 @@
+/*
+ * linux/arch/arm/mach-iop3xx/xs80200-irq.c
+ *
+ * Generic IRQ handling for the XS80200 XScale core.
+ *
+ * Author:  Nicolas Pitre
+ * Copyright:   (C) 2001 MontaVista 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/init.h>
+#include <linux/list.h>
+
+#include <asm/mach/irq.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+
+#include <asm/mach-types.h>
+
+static void xs80200_irq_mask (unsigned int irq)
+{
+	unsigned long intctl;
+	asm ("mrc p13, 0, %0, c0, c0, 0" : "=r" (intctl));
+	switch (irq) {
+	    case IRQ_XS80200_BCU:     intctl &= ~(1<<3); break;
+	    case IRQ_XS80200_PMU:     intctl &= ~(1<<2); break;
+	    case IRQ_XS80200_EXTIRQ:  intctl &= ~(1<<1); break;
+	    case IRQ_XS80200_EXTFIQ:  intctl &= ~(1<<0); break;
+	}
+	asm ("mcr p13, 0, %0, c0, c0, 0" : : "r" (intctl));
+}
+
+static void xs80200_irq_unmask (unsigned int irq)
+{
+	unsigned long intctl;
+	asm ("mrc p13, 0, %0, c0, c0, 0" : "=r" (intctl));
+	switch (irq) {
+	    case IRQ_XS80200_BCU:	intctl |= (1<<3); break;
+	    case IRQ_XS80200_PMU:	intctl |= (1<<2); break;
+	    case IRQ_XS80200_EXTIRQ:	intctl |= (1<<1); break;
+	    case IRQ_XS80200_EXTFIQ:	intctl |= (1<<0); break;
+	}
+	asm ("mcr p13, 0, %0, c0, c0, 0" : : "r" (intctl));
+}
+
+static struct irqchip xs80200_chip = {
+	.ack	= xs80200_irq_mask,
+	.mask	= xs80200_irq_mask,
+	.unmask = xs80200_irq_unmask,
+};
+
+void __init xs80200_init_irq(void)
+{
+	unsigned int i;
+
+	asm("mcr p13, 0, %0, c0, c0, 0" : : "r" (0));
+
+	for (i = 0; i < NR_XS80200_IRQS; i++) {
+		set_irq_chip(i, &xs80200_chip);
+		set_irq_handler(i, do_level_IRQ);
+		set_irq_flags(i, IRQF_VALID);
+	}
+}
diff -Nru a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c
--- a/arch/arm/mach-sa1100/badge4.c	Sat Apr 19 19:51:28 2003
+++ b/arch/arm/mach-sa1100/badge4.c	Sat Apr 19 19:51:28 2003
@@ -186,11 +186,26 @@
   {0xf4000000, 0x48000000, 0x00100000, MT_DEVICE } /* SA-1111      */
 };
 
+static void
+badge4_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
+{
+	if (!state) {
+		Ser1SDCR0 |= SDCR0_UART;
+	}
+}
+
+static struct sa1100_port_fns badge4_port_fns __initdata = {
+	//.get_mctrl	= badge4_get_mctrl,
+	//.set_mctrl	= badge4_set_mctrl,
+	.pm		= badge4_uart_pm,
+};
+
 static void __init badge4_map_io(void)
 {
 	sa1100_map_io();
 	iotable_init(badge4_io_desc, ARRAY_SIZE(badge4_io_desc));
 
+	sa1100_register_uart_fns(&badge4_port_fns);
 	sa1100_register_uart(0, 3);
 	sa1100_register_uart(1, 1);
 }
diff -Nru a/arch/arm/mm/copypage-xscale.S b/arch/arm/mm/copypage-xscale.S
--- a/arch/arm/mm/copypage-xscale.S	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/mm/copypage-xscale.S	Sat Apr 19 19:51:50 2003
@@ -39,11 +39,25 @@
 	mov	r0, r1
 	bl	map_page_minicache
 	mov	r1, r5
-	mov	lr, #PAGE_SZ/32
+	mov	lr, #PAGE_SZ/64-1
 
-1:	mov	ip, r1
-	ldrd	r2, [r0], #8
+	/*
+	 * Strangely enough, best performance is achieved
+	 * when prefetching destination as well.  (NP)
+	 */
+	pld	[r0, #0]
+	pld	[r0, #32]
+	pld	[r1, #0]
+	pld	[r1, #32]
+
+1:	pld	[r0, #64]
+	pld	[r0, #96]
+	pld	[r1, #64]
+	pld	[r1, #96]
+
+2:	ldrd	r2, [r0], #8
 	ldrd	r4, [r0], #8
+	mov	ip, r1
 	strd	r2, [r1], #8
 	ldrd	r2, [r0], #8
 	strd	r4, [r1], #8
@@ -51,9 +65,21 @@
 	strd	r2, [r1], #8
 	strd	r4, [r1], #8
 	mcr	p15, 0, ip, c7, c10, 1		@ clean D line
+	ldrd	r2, [r0], #8
 	mcr	p15, 0, ip, c7, c6, 1		@ invalidate D line
+	ldrd	r4, [r0], #8
+	mov	ip, r1
+	strd	r2, [r1], #8
+	ldrd	r2, [r0], #8
+	strd	r4, [r1], #8
+	ldrd	r4, [r0], #8
+	strd	r2, [r1], #8
+	strd	r4, [r1], #8
+	mcr	p15, 0, ip, c7, c10, 1		@ clean D line
 	subs	lr, lr, #1
-	bne	1b
+	mcr	p15, 0, ip, c7, c6, 1		@ invalidate D line
+	bgt	1b
+	beq	2b
 
 	ldmfd	sp!, {r4, r5, pc}
 
@@ -64,7 +90,6 @@
  *  r1 = virtual user address of ultimate destination page
  */
 ENTRY(xscale_mc_clear_user_page)
-	str	lr, [sp, #-4]!
 	mov	r1, #PAGE_SZ/32
 	mov	r2, #0
 	mov	r3, #0
@@ -74,10 +99,10 @@
 	strd	r2, [r0], #8
 	strd	r2, [r0], #8
 	mcr	p15, 0, ip, c7, c10, 1		@ clean D line
-	mcr	p15, 0, ip, c7, c6, 1		@ invalidate D line
 	subs	r1, r1, #1
+	mcr	p15, 0, ip, c7, c6, 1		@ invalidate D line
 	bne	1b
-	ldr	pc, [sp], #4
+	mov	pc, lr
 
 	__INIT
 
diff -Nru a/arch/arm/mm/extable.c b/arch/arm/mm/extable.c
--- a/arch/arm/mm/extable.c	Sat Apr 19 19:51:48 2003
+++ b/arch/arm/mm/extable.c	Sat Apr 19 19:51:48 2003
@@ -1,7 +1,7 @@
 /*
  *  linux/arch/arm/mm/extable.c
  */
-#include <linux/config.h>
+#include <linux/module.h>
 #include <asm/uaccess.h>
 
 const struct exception_table_entry *
@@ -23,4 +23,15 @@
                         last = mid-1;
         }
         return NULL;
+}
+
+int fixup_exception(struct pt_regs *regs)
+{
+	const struct exception_table_entry *fixup;
+
+	fixup = search_exception_tables(instruction_pointer(regs));
+	if (fixup)
+		regs->ARM_pc = fixup->fixup;
+
+	return fixup != NULL;
 }
diff -Nru a/arch/arm/mm/fault-common.c b/arch/arm/mm/fault-common.c
--- a/arch/arm/mm/fault-common.c	Sat Apr 19 19:51:48 2003
+++ b/arch/arm/mm/fault-common.c	Sat Apr 19 19:51:48 2003
@@ -25,6 +25,7 @@
 
 #include <asm/system.h>
 #include <asm/pgtable.h>
+#include <asm/uaccess.h>
 
 #include "fault.h"
 
@@ -103,20 +104,11 @@
 __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr,
 		  struct pt_regs *regs)
 {
-	const struct exception_table_entry *fixup;
-
 	/*
 	 * Are we prepared to handle this kernel fault?
 	 */
-	fixup = search_exception_tables(instruction_pointer(regs));
-	if (fixup) {
-#ifdef DEBUG
-		printk(KERN_DEBUG "%s: Exception at [<%lx>] addr=%lx (fixup: %lx)\n",
-			current->comm, regs->ARM_pc, addr, fixup->fixup);
-#endif
-		regs->ARM_pc = fixup->fixup;
+	if (fixup_exception(regs))
 		return;
-	}
 
 	/*
 	 * No handler, we'll have to terminate things with extreme prejudice.
diff -Nru a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S
--- a/arch/arm/mm/proc-xscale.S	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/mm/proc-xscale.S	Sat Apr 19 19:51:50 2003
@@ -654,6 +654,9 @@
 cpu_80200_name:
 	.asciz	"XScale-80200"
 
+cpu_80321_name:
+	.asciz	"XScale-IOP80321"
+
 cpu_pxa250_name:
 	.asciz	"XScale-PXA250"
 
@@ -747,6 +750,22 @@
 	.long	v4wbi_tlb_fns
 	.long	xscale_mc_user_fns
 	.size	__80200_proc_info, . - __80200_proc_info
+
+	.type	__80321_proc_info,#object
+__80321_proc_info:
+	.long	0x69052420
+	.long	0xfffffff0
+	.long	0x00000c0e
+	b	__xscale_setup
+	.long	cpu_arch_name
+	.long	cpu_elf_name
+	.long	HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
+	.long	cpu_80321_name
+	.long	xscale_processor_functions
+	.long	v4wbi_tlb_fns
+	.long	xscale_mc_user_fns
+	.long	xscale_cache_fns
+	.size	__80321_proc_info, . - __80321_proc_info
 
 	.type	__pxa250_proc_info,#object
 __pxa250_proc_info:
diff -Nru a/arch/arm/nwfpe/fpmodule.h b/arch/arm/nwfpe/fpmodule.h
--- a/arch/arm/nwfpe/fpmodule.h	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/nwfpe/fpmodule.h	Sat Apr 19 19:51:50 2003
@@ -17,21 +17,15 @@
     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.
+
+    27/03/03 Ian Molton Clean up CONFIG_CPU
 */
 
 #ifndef __FPMODULE_H__
 #define __FPMODULE_H__
 
-#include <linux/config.h>
-
-#ifdef CONFIG_CPU_32
 #define REG_ORIG_R0	17
 #define REG_CPSR	16
-#else
-#define REG_ORIG_R0	16
-#define REG_CPSR	15
-#endif
-
 #define REG_PC		15
 #define REG_LR		14
 #define REG_SP		13
diff -Nru a/arch/arm/vmlinux-armo.lds.in b/arch/arm/vmlinux-armo.lds.in
--- a/arch/arm/vmlinux-armo.lds.in	Sat Apr 19 19:51:50 2003
+++ b/arch/arm/vmlinux-armo.lds.in	Sat Apr 19 19:51:50 2003
@@ -14,7 +14,9 @@
 	.init : {			/* Init code and data		*/
 		_stext = .;
 		__init_begin = .;
+			_sinittext = .;
 			*(.init.text)
+			_einittext = .;
 		__proc_info_begin = .;
 			*(.proc.info)
 		__proc_info_end = .;
diff -Nru a/arch/arm/vmlinux-armv.lds.in b/arch/arm/vmlinux-armv.lds.in
--- a/arch/arm/vmlinux-armv.lds.in	Sat Apr 19 19:51:46 2003
+++ b/arch/arm/vmlinux-armv.lds.in	Sat Apr 19 19:51:46 2003
@@ -18,7 +18,9 @@
 	.init : {			/* Init code and data		*/
 		_stext = .;
 		__init_begin = .;
+			_sinittext = .;
 			*(.init.text)
+			_einittext = .;
 		__proc_info_begin = .;
 			*(.proc.info)
 		__proc_info_end = .;
diff -Nru a/arch/h8300/Kconfig b/arch/h8300/Kconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/Kconfig	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,427 @@
+#
+# For a description of the syntax of this configuration file,
+# see Documentation/kbuild/config-language.txt.
+#
+
+mainmenu "uClinux/h8300 (w/o MMU) Kernel Configuration"
+
+config MMU
+	bool
+	default n
+
+config SWAP
+	bool
+	default n
+
+config FPU
+	bool
+	default n
+
+config UID16
+	bool
+	default y
+
+config RWSEM_GENERIC_SPINLOCK
+	bool
+	default y
+
+config RWSEM_XCHGADD_ALGORITHM
+	bool
+	default n
+
+
+source "init/Kconfig"
+
+menu "Processor type and features"
+
+choice
+	prompt "H8/300 platform"
+	default H8300H_GENERIC
+
+config H8300H_GENERIC
+	bool "Generic"
+	help
+	  H8/300H CPU Generic Hardware Support
+
+config H8300H_AKI3068NET
+	bool "AE-3068/69"
+	help
+	  AKI-H8/3068F / AKI-H8/3069F Flashmicom LAN Board Suppot
+	  More Information. (Japanese Only)
+	  <http://akizukidensi.com/catalog/h8.html>
+	  AE-3068/69 Evalution Board Support
+	  More Information.
+	  <http://www.microtronique.com/ae3069lan.htm>
+
+config H8300H_H8MAX
+	bool "H8MAX"
+	help
+	  H8MAX Evalution Board Suooprt
+	  More Information. (Japanese Only)
+	  <http://strawberry-linux.com/h8/index.html>
+
+config H8300H_SIM
+	bool "H8/300H Simulator"
+	help
+	  GDB Simulator Support
+	  More Information.
+	  arch/h8300/Doc/simulator.txt
+
+endchoice
+
+choice 
+	prompt "CPU Selection"
+
+config H83002
+	bool "H8/3001,3002,3003"
+	depends on H8300H_GENERIC
+
+config H83007
+	bool "H8/3006,3007"
+	depends on (H8300H_GENERIC || H8300H_SIM)
+
+config H83048
+	bool "H8/3044,3045,3046,3047,3048,3052"
+	depends on H8300H_GENERIC
+
+config H83068
+	bool "H8/3065,3066,3067,3068,3069"
+	depends on (H8300H_GENERIC || H8300H_AKI3068NET || H8300H_H8MAX)
+
+endchoice
+
+config CPU_H8300H
+	bool
+	depends on (H8300H_GENERIC || H8300H_AKI3068NET || H8300H_H8MAX || H8300H_SIM)
+	default y
+
+config CPU_CLOCK
+	int "CPU Clock Frequency (/1KHz)"	
+	default "20000" if H8300H_AKI3068NET
+	default "25000" if H8300H_H8MAX
+	default "16000" if H8300H_SIM
+	default "16000" if H8300H_GENERIC
+	help
+	  CPU Clock Frequency divide to 1000
+choice
+	prompt "Kernel executes from"
+	---help---
+	  Choose the memory type that the kernel will be running in.
+
+config RAMKERNEL
+	bool "RAM"
+	help
+	  The kernel will be resident in RAM when running.
+
+config ROMKERNEL
+	bool "ROM"
+	help
+	  The kernel will be resident in FLASH/ROM when running.
+
+endchoice
+
+config DEFAULT_CMDLINE
+	bool
+	help
+	  buildin kernel commandline enabled.
+
+config KERNEL_COMMAND
+	string
+	help
+	  buildin kernel commandline strings.
+
+endmenu
+
+menu "Executable file formats"
+
+config KCORE_AOUT
+	bool
+	default y
+
+config KCORE_ELF
+	default y
+
+config BINFMT_FLAT
+	tristate "Kernel support for flat binaries"
+	help
+	  Support uClinux FLAT format binaries.
+
+endmenu
+
+source "drivers/block/Kconfig"
+
+
+menu "ATA/IDE/MFM/RLL support"
+
+config IDE
+	tristate "ATA/ATAPI/MFM/RLL device support"
+	---help---
+	  If you say Y here, your kernel will be able to manage low cost mass
+	  storage units such as ATA/(E)IDE and ATAPI units. The most common
+	  cases are IDE hard drives and ATAPI CD-ROM drives.
+
+	  It only makes sense to choose this option if your board actually
+	  has an IDE interface. If unsure, say N.
+
+source "drivers/ide/Kconfig"
+
+endmenu
+
+source "net/Kconfig"
+
+
+menu "Network device support"
+	depends on NET
+
+config NETDEVICES
+	bool "Network device support"
+	---help---
+	  You can say N here if you don't intend to connect your Linux box to
+	  any other computer at all or if all your connections will be over a
+	  telephone line with a modem either via UUCP (UUCP is a protocol to
+	  forward mail and news between unix hosts over telephone lines; read
+	  the UUCP-HOWTO, available from
+	  <http://www.linuxdoc.org/docs.html#howto>) or dialing up a shell
+	  account or a BBS, even using term (term is a program which gives you
+	  almost full Internet connectivity if you have a regular dial up
+	  shell account on some Internet connected Unix computer. Read
+	  <http://www.bart.nl/~patrickr/term-howto/Term-HOWTO.html>).
+
+	  You'll have to say Y if your computer contains a network card that
+	  you want to use under Linux (make sure you know its name because you
+	  will be asked for it and read the Ethernet-HOWTO (especially if you
+	  plan to use more than one network card under Linux)) or if you want
+	  to use SLIP (Serial Line Internet Protocol is the protocol used to
+	  send Internet traffic over telephone lines or null modem cables) or
+	  CSLIP (compressed SLIP) or PPP (Point to Point Protocol, a better
+	  and newer replacement for SLIP) or PLIP (Parallel Line Internet
+	  Protocol is mainly used to create a mini network by connecting the
+	  parallel ports of two local machines) or AX.25/KISS (protocol for
+	  sending Internet traffic over amateur radio links).
+
+	  Make sure to read the NET-3-HOWTO. Eventually, you will have to read
+	  Olaf Kirch's excellent and free book "Network Administrator's
+	  Guide", to be found in <http://www.linuxdoc.org/docs.html#guide>. If
+	  unsure, say Y.
+
+endmenu
+
+source "net/ax25/Kconfig"
+
+source "net/irda/Kconfig"
+
+source "drivers/isdn/Kconfig"
+
+source "drivers/telephony/Kconfig"
+
+#
+# input before char - char/joystick depends on it. As does USB.
+#
+source "drivers/input/Kconfig"
+
+#
+# Character device configuration
+#
+
+menu "Character devices"
+
+config VT
+	bool "Virtual terminal"
+	requires INPUT=y
+	---help---
+	  If you say Y here, you will get support for terminal devices with
+	  display and keyboard devices. These are called "virtual" because you
+	  can run several virtual terminals (also called virtual consoles) on
+	  one physical terminal. This is rather useful, for example one
+	  virtual terminal can collect system messages and warnings, another
+	  one can be used for a text-mode user session, and a third could run
+	  an X session, all in parallel. Switching between virtual terminals
+	  is done with certain key combinations, usually Alt-<function key>.
+
+	  The setterm command ("man setterm") can be used to change the
+	  properties (such as colors or beeping) of a virtual terminal. The
+	  man page console_codes(4) ("man console_codes") contains the special
+	  character sequences that can be used to change those properties
+	  directly. The fonts used on virtual terminals can be changed with
+	  the setfont ("man setfont") command and the key bindings are defined
+	  with the loadkeys ("man loadkeys") command.
+
+	  You need at least one virtual terminal device in order to make use
+	  of your keyboard and monitor. Therefore, only people configuring an
+	  embedded system would want to say N here in order to save some
+	  memory; the only way to log into such a system is then via a serial
+	  or network connection.
+
+	  If unsure, say Y, or else you won't be able to do much with your new
+	  shiny Linux system :-)
+
+config VT_CONSOLE
+	bool "Support for console on virtual terminal"
+	depends on VT
+	---help---
+	  The system console is the device which receives all kernel messages
+	  and warnings and which allows logins in single user mode. If you
+	  answer Y here, a virtual terminal (the device used to interact with
+	  a physical terminal) can be used as system console. This is the most
+	  common mode of operations, so you should say Y here unless you want
+	  the kernel messages be output only to a serial port (in which case
+	  you should say Y to "Console on serial port", below).
+
+	  If you do say Y here, by default the currently visible virtual
+	  terminal (/dev/tty0) will be used as system console. You can change
+	  that with a kernel command line option such as "console=tty3" which
+	  would use the third virtual terminal as system console. (Try "man
+	  bootparam" or see the documentation of your boot loader (lilo or
+	  loadlin) about how to pass options to the kernel at boot time.)
+
+	  If unsure, say Y.
+
+config HW_CONSOLE
+	bool
+	depends on VT && !S390 && !UM
+	default y
+
+config SH_SCI
+	tristate "Serial (SCI) support"
+	help
+	  Selecting this option will allow the Linux kernel to transfer data
+	  over SCI (Serial Communication Interface) and/or SCIF (Serial
+	  Communication Interface with FIFO) which are built into the Hitachi
+	  SuperH processor.  The option provides 1 to 3 (depending
+	  on the CPU model) standard Linux tty devices, /dev/ttySC[012]; one
+	  of these is normally used as the system console.
+
+	  If in doubt, press "y".
+
+config SERIAL_CONSOLE
+	bool "Support for console on serial port"
+	depends on SERIAL=y || SH_SCI=y
+	---help---
+	  If you say Y here, it will be possible to use a serial port as the
+	  system console (the system console is the device which receives all
+	  kernel messages and warnings and which allows logins in single user
+	  mode). This could be useful if some terminal or printer is connected
+	  to that serial port.
+
+	  Even if you say Y here, the currently visible virtual console
+	  (/dev/tty0) will still be used as the system console by default, but
+	  you can alter that using a kernel command line option such as
+	  "console=ttyS1". (Try "man bootparam" or see the documentation of
+	  your boot loader (lilo or loadlin) about how to pass options to the
+	  kernel at boot time.)
+
+	  If you don't have a VGA card installed and you say Y here, the
+	  kernel will automatically use the first serial line, /dev/ttyS0, as
+	  system console.
+
+	  If unsure, say N.
+
+config UNIX98_PTYS
+	bool "Unix98 PTY support"
+	---help---
+	  A pseudo terminal (PTY) is a software device consisting of two
+	  halves: a master and a slave. The slave device behaves identical to
+	  a physical terminal; the master device is used by a process to
+	  read data from and write data to the slave, thereby emulating a
+	  terminal. Typical programs for the master side are telnet servers
+	  and xterms.
+
+	  Linux has traditionally used the BSD-like names /dev/ptyxx for
+	  masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
+	  has a number of problems. The GNU C library glibc 2.1 and later,
+	  however, supports the Unix98 naming standard: in order to acquire a
+	  pseudo terminal, a process opens /dev/ptmx; the number of the pseudo
+	  terminal is then made available to the process and the pseudo
+	  terminal slave can be accessed as /dev/pts/<number>. What was
+	  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
+
+	  The entries in /dev/pts/ are created on the fly by a virtual
+	  file system; therefore, if you say Y here you should say Y to
+	  "/dev/pts file system for Unix98 PTYs" as well.
+
+	  If you want to say Y here, you need to have the C library glibc 2.1
+	  or later (equal to libc-6.1, check with "ls -l /lib/libc.so.*").
+	  Read the instructions in <file:Documentation/Changes> pertaining to
+	  pseudo terminals. It's safe to say N.
+
+config UNIX98_PTY_COUNT
+	int "Maximum number of Unix98 PTYs in use (0-2048)"
+	depends on UNIX98_PTYS
+	default "256"
+	help
+	  The maximum number of Unix98 PTYs that can be used at any one time.
+	  The default is 256, and should be enough for desktop systems. Server
+	  machines which support incoming telnet/rlogin/ssh connections and/or
+	  serve several X terminals may want to increase this: every incoming
+	  connection and every xterm uses up one PTY.
+
+	  When not in use, each additional set of 256 PTYs occupy
+	  approximately 8 KB of kernel memory on 32-bit architectures.
+
+endmenu
+
+#source drivers/misc/Config.in
+source "drivers/media/Kconfig"
+
+source "fs/Kconfig"
+
+source "drivers/usb/Kconfig"
+
+source "net/bluetooth/Kconfig"
+
+
+menu "Kernel hacking"
+
+config FULLDEBUG
+	bool "Full Symbolic/Source Debugging support"
+	help
+	  Enable debugging symbols on kernel build.
+
+config MAGIC_SYSRQ
+	bool "Magic SysRq key"
+	help
+	  Enables console device to interprent special characters as
+	  commands to dump state information.
+
+config HIGHPROFILE
+	bool "Use fast second timer for profiling"
+	help
+	  Use a fast secondary clock to produce profiling information.
+
+config NO_KERNEL_MSG
+	bool "Suppress Kernel BUG Messages"
+	help
+	  Do not output any debug BUG messages within the kernel.
+
+config GDB_MAGICPRINT
+	bool "Message Output for GDB MagicPrint service"
+	depends on H8300H_SIM
+	help
+	  kernel messages output useing MagicPrint service from GDB
+
+config SYSCALL_PRINT
+	bool "SystemCall trace print"
+	help
+	  outout history of systemcall
+
+config GDB_DEBUG
+   	bool "Use gdb stub"
+	depends on !H8300H_SIM
+	help
+	  gdb stub exception support
+
+config CONFIG_SH_STANDARD_BIOS
+	bool "Use gdb protocol serial console"
+	depends on !H8300H_SIM
+	help
+	  serial console output using GDB protocol.
+	  Require eCos/RedBoot
+
+endmenu
+
+source "security/Kconfig"
+
+source "crypto/Kconfig"
+
+source "lib/Kconfig"
+
diff -Nru a/arch/h8300/Makefile b/arch/h8300/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,61 @@
+#
+# arch/h8300/Makefile
+#
+# 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.
+#
+# (C) Copyright 2002, Yoshinori Sato <ysato@users.sourceforge.jp>
+#
+ifndef include-config
+-include $(TOPDIR)/.config
+endif
+
+platform-$(CONFIG_CPU_H8300H)	:= h8300h
+PLATFORM := $(platform-y)
+
+board-$(CONFIG_H8300H_GENERIC)		:= generic
+board-$(CONFIG_H8300H_AKI3068NET)	:= ucsimm
+board-$(CONFIG_H8300H_H8MAX)		:= ucdimm
+board-$(CONFIG_H8300H_SIM)		:= generic
+BOARD := $(board-y)
+
+model-$(CONFIG_RAMKERNEL)	:= ram
+model-$(CONFIG_ROMKERNEL)	:= rom
+MODEL := $(model-y)
+
+cflags-$(CONFIG_CPU_H8300H)		:= -mh
+ldflags-$(CONFIG_CPU_H8300H)	:= -mh8300helf
+
+CFLAGS += $(cflags-y)
+CFLAGS += -mint32 -fno-builtin
+CFLAGS += -O2 -g
+CFLAGS += -D__linux__
+CFLAGS += -DUTS_SYSNAME=\"uClinux\" -DTARGET=$(BOARD)
+AFLAGS += -DPLATFORM=$(PLATFORM) -DTARGET=$(BOARD) -DMODEL=$(MODEL) $(cflags-y)
+LDFLAGS += $(ldflags-y)
+LDFLAGS_BLOB :=  --format binary --oformat elf32-h8300
+
+CROSS_COMPILE = h8300-elf-
+#HEAD := arch/$(ARCH)/platform/$(platform-y)/$(board-y)/crt0_$(model-y).o
+LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(CFLAGS) -print-libgcc-file-name)
+
+core-y	+= arch/$(ARCH)/kernel/ \
+	   arch/$(ARCH)/mm/ \
+	   arch/$(ARCH)/platform/$(PLATFORM)/ \
+	   arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/
+
+libs-y	+= arch/$(ARCH)/lib/ $(LIBGCC)
+
+export MODEL
+
+archmrproper:
+
+archclean:
+	$(call descend arch/$(ARCH), subdirclean)
+
+prepare: include/asm-$(ARCH)/asm-offsets.h
+
+include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \
+				   include/asm include/linux/version.h
+	$(call filechk,gen-asm-offsets)
diff -Nru a/arch/h8300/README b/arch/h8300/README
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/README	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,35 @@
+uClinux-2.4 for H8/300 README
+Yoshinori Sato <ysato@users.sourceforge.jp>
+
+* Supported CPU
+H8/300H
+H8S is planning.
+
+* Supported Target
+1.simulator of GDB
+  require patches.
+
+2.AE 3068/AE 3069
+  more information 
+  MICROTRONIQUE <http://www.microtronique.com/>
+  Akizuki Denshi Tsusho Ltd. <http://www.akizuki.ne.jp> (Japanese Only)
+
+3.H8MAX 
+  Under development
+  see http://www.strawbelly-linux.com (Japanese Only)
+
+* Toolchain Version
+gcc-3.1 or higher and patch
+see arch/h8300/tools_patch/README
+binutils-2.12 or higher
+gdb-5.2 or higher
+The environment that can compile a h8300-elf binary is necessary.
+
+* Userland Develop environment
+Tempolary used h8300-hms(h8300-coff) Toolchain.
+I prepare toolchain corresponding to h8300-elf.
+
+* A few words of thanks
+Porting to H8/300H is support of Information-technology Promotion Agency, Japan.
+I thank support.
+and All developer/user.
diff -Nru a/arch/h8300/defconfig b/arch/h8300/defconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/defconfig	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,199 @@
+#
+# Automatically generated make config: don't edit
+#
+# CONFIG_MMU is not set
+# CONFIG_SWAP is not set
+# CONFIG_FPU is not set
+CONFIG_UID16=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+
+#
+# General setup
+#
+# CONFIG_SYSVIPC is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_SYSCTL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_IKCONFIG is not set
+
+#
+# Loadable module support
+#
+# CONFIG_MODULES is not set
+
+#
+# Processor type and features
+#
+# CONFIG_H8300H_GENERIC is not set
+# CONFIG_H8300H_AKI3068NET is not set
+# CONFIG_H8300H_H8MAX is not set
+CONFIG_H8300H_SIM=y
+# CONFIG_H83002 is not set
+CONFIG_H83007=y
+# CONFIG_H83048 is not set
+# CONFIG_H83068 is not set
+CONFIG_CPU_H8300H=y
+CONFIG_CPU_CLOCK=16000
+# CONFIG_RAMKERNEL is not set
+CONFIG_ROMKERNEL=y
+
+#
+# Executable file formats
+#
+CONFIG_KCORE_AOUT=y
+CONFIG_BINFMT_FLAT=y
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_LOOP is not set
+# CONFIG_BLK_DEV_RAM is not set
+
+#
+# ATA/IDE/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# Networking support
+#
+# CONFIG_NET is not set
+
+#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
+# ISDN subsystem
+#
+
+#
+# Telephony Support
+#
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+# CONFIG_INPUT is not set
+
+#
+# Userland interfaces
+#
+
+#
+# Input I/O drivers
+#
+# CONFIG_GAMEPORT is not set
+CONFIG_SOUND_GAMEPORT=y
+# CONFIG_SERIO is not set
+
+#
+# Input Device Drivers
+#
+
+#
+# Character devices
+#
+CONFIG_SH_SCI=y
+CONFIG_SERIAL_CONSOLE=y
+# CONFIG_UNIX98_PTYS is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV 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 is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS 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_TMPFS is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# USB support
+#
+
+#
+# Kernel hacking
+#
+CONFIG_FULLDEBUG=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_HIGHPROFILE is not set
+CONFIG_NO_KERNEL_MSG=y
+# CONFIG_GDB_MAGICPRINT is not set
+# CONFIG_SYSCALL_PRINT is not set
+
+#
+# Security options
+#
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC32 is not set
diff -Nru a/arch/h8300/kernel/Makefile b/arch/h8300/kernel/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+#
+# Makefile for the linux kernel.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definitions are now in the main makefile...
+
+obj-y := process.o traps.o ptrace.o \
+	 sys_h8300.o time.o semaphore.o signal.o \
+         setup.o h8300_ksyms.o gpio.o init_task.o \
+         syscalls.o
diff -Nru a/arch/h8300/kernel/asm-offsets.c b/arch/h8300/kernel/asm-offsets.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/asm-offsets.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,49 @@
+/*
+ * This program is used to generate definitions needed by
+ * assembly language modules.
+ *
+ * We use the technique used in the OSF Mach kernel code:
+ * generate asm statements containing #defines,
+ * compile this file to assembler, and then extract the
+ * #defines from the assembly-language output.
+ */
+
+#include <linux/stddef.h>
+#include <linux/sched.h>
+#include <linux/kernel_stat.h>
+#include <linux/ptrace.h>
+#include <asm/bootinfo.h>
+#include <asm/irq.h>
+#include <asm/hardirq.h>
+
+#define DEFINE(sym, val) \
+        asm volatile("\n->" #sym " %0 " #val : : "i" (val))
+
+#define BLANK() asm volatile("\n->" : : )
+
+int main(void)
+{
+	/* offsets into the task struct */
+	DEFINE(TASK_STATE, offsetof(struct task_struct, state));
+	DEFINE(TASK_FLAGS, offsetof(struct task_struct, flags));
+	DEFINE(TASK_PTRACE, offsetof(struct task_struct, ptrace));
+	DEFINE(TASK_BLOCKED, offsetof(struct task_struct, blocked));
+	DEFINE(TASK_THREAD, offsetof(struct task_struct, thread));
+	DEFINE(TASK_THREAD_INFO, offsetof(struct task_struct, thread_info));
+	DEFINE(TASK_MM, offsetof(struct task_struct, mm));
+	DEFINE(TASK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
+
+	/* offsets into the irq_cpustat_t struct */
+	DEFINE(CPUSTAT_SOFTIRQ_PENDING, offsetof(irq_cpustat_t, __softirq_pending));
+
+	/* offsets into the thread struct */
+	DEFINE(THREAD_KSP, offsetof(struct thread_struct, ksp));
+	DEFINE(THREAD_USP, offsetof(struct thread_struct, usp));
+	DEFINE(THREAD_CCR, offsetof(struct thread_struct, ccr));
+	DEFINE(THREAD_VFORK, offsetof(struct thread_struct, vfork_ret));
+
+	DEFINE(PT_PTRACED, PT_PTRACED);
+	DEFINE(PT_DTRACE, PT_DTRACE);
+
+	return 0;
+}
diff -Nru a/arch/h8300/kernel/gpio.c b/arch/h8300/kernel/gpio.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/gpio.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,166 @@
+/*
+ *  linux/arch/h8300/kernel/gpio.c
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ */
+
+/*
+ * H8/300H Internal I/O Port Management
+ */
+
+#include <linux/config.h>
+#include <linux/stddef.h>
+#include <linux/proc_fs.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+
+#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
+#define P1DDR (unsigned char *)0xfee000
+#define P2DDR (unsigned char *)0xfee001
+#define P3DDR (unsigned char *)0xfee002
+#define P4DDR (unsigned char *)0xfee003
+#define P5DDR (unsigned char *)0xfee004
+#define P6DDR (unsigned char *)0xfee005
+#define P8DDR (unsigned char *)0xfee007
+#define P9DDR (unsigned char *)0xfee008
+#define PADDR (unsigned char *)0xfee009
+#define PBDDR (unsigned char *)0xfee00A
+#endif
+#if defined(CONFIG_H83002) || defined(CONFIG_H8048)
+#define P1DDR (unsigned char *)0xffffc0
+#define P2DDR (unsigned char *)0xffffc1
+#define P3DDR (unsigned char *)0xffffc4
+#define P4DDR (unsigned char *)0xffffc5
+#define P5DDR (unsigned char *)0xffffc8
+#define P6DDR (unsigned char *)0xffffc9
+#define P8DDR (unsigned char *)0xffffcd
+#define P9DDR (unsigned char *)0xffffd0
+#define PADDR (unsigned char *)0xffffd1
+#define PBDDR (unsigned char *)0xffffd4
+#endif
+
+#if defined(P1DDR)
+
+#define MAX_PORT 11
+
+static struct {
+	unsigned char used;
+	unsigned char ddr;
+} gpio_regs[MAX_PORT];
+
+static volatile unsigned char *ddrs[] = {
+	P1DDR,P2DDR,P3DDR,P4DDR,P5DDR,P6DDR,NULL,P8DDR,P9DDR,PADDR,PBDDR,
+};
+
+extern char *_platform_gpio_table(int length);
+
+int h8300_reserved_gpio(int port, unsigned int bits)
+{
+	unsigned char *used;
+	if (port < 0 || port >= MAX_PORT)
+		return -1;
+	used = &(gpio_regs[port].used);
+	if ((*used & bits) != 0)
+		return 0;
+	*used |= bits;
+	return 1;
+}
+
+int h8300_free_gpio(int port, unsigned int bits)
+{
+	unsigned char *used;
+	if (port < 0 || port >= MAX_PORT)
+		return -1;
+	used = &(gpio_regs[port].used);
+	if ((*used & bits) != bits)
+		return 0;
+	*used &= (~bits);
+	return 1;
+}
+
+int h8300_set_gpio_dir(int port_bit,int dir)
+{
+	const unsigned char mask[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
+	int port = (port_bit >> 8) & 0xff;
+	int bit  = port_bit & 0x07;
+	if (ddrs[port] == NULL)
+		return 0;
+	if (gpio_regs[port].used & mask[bit]) {
+		if (dir)
+			gpio_regs[port].ddr |= mask[bit];
+		else
+			gpio_regs[port].ddr &= ~mask[bit];
+		*ddrs[port] = gpio_regs[port].ddr;
+		return 1;
+	} else
+		return 0;
+}
+
+int h8300_get_gpio_dir(int port_bit)
+{
+	const unsigned char mask[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
+	int port = (port_bit >> 8) & 0xff;
+	int bit  = port_bit & 0x07;
+	if (ddrs[port] == NULL)
+		return 0;
+	if (gpio_regs[port].used & mask[bit]) {
+		return (gpio_regs[port].ddr & mask[bit]) != 0;
+	} else
+		return -1;
+}
+
+#if defined(CONFIG_PROC_FS)
+static char *port_status(int portno)
+{
+	static char result[10];
+	const static char io[2]={'I','O'};
+	char *rp;
+	int c;
+	unsigned char used,ddr;
+	
+	used = gpio_regs[portno].used;
+	ddr  = gpio_regs[portno].ddr;
+	result[8]='\0';
+	rp = result + 7;
+	for (c = 8; c > 0; c--,rp--,used >>= 1, ddr >>= 1)
+		if (used & 0x01)
+			*rp = io[ ddr & 0x01];
+		else	
+			*rp = '-';
+	return result;
+}
+
+static int gpio_proc_read(char *buf, char **start, off_t offset, int len, int unused)
+{
+	int c,outlen;
+	const static char port_name[]="123456789AB";
+	outlen = 0;
+	for (c = 0; c < MAX_PORT; c++) {
+		if (ddrs[c] == NULL)
+			continue ;
+		len = sprintf(buf,"P%c: %s\n",port_name[c],port_status(c));
+		buf += len;
+		outlen += len;
+	}
+	return outlen;
+}
+
+static const struct proc_dir_entry proc_gpio = {
+	0, 4,"gpio",S_IFREG | S_IRUGO, 1, 0, 0, 0, NULL, gpio_proc_read,
+};
+#endif
+
+int h8300_gpio_init(void)
+{
+	memcpy(gpio_regs,_platform_gpio_table(sizeof(gpio_regs)),sizeof(gpio_regs));
+#if 0 && defined(CONFIG_PROC_FS)
+	proc_register(&proc_root,&proc_gpio);
+#endif
+	return 0;
+}
+
+#else
+#error Unsuppoted CPU Selection
+#endif
diff -Nru a/arch/h8300/kernel/h8300_ksyms.c b/arch/h8300/kernel/h8300_ksyms.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/h8300_ksyms.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,113 @@
+#include <linux/module.h>
+#include <linux/linkage.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/user.h>
+#include <linux/elfcore.h>
+#include <linux/in6.h>
+#include <linux/interrupt.h>
+#include <linux/config.h>
+
+#include <asm/setup.h>
+#include <asm/pgalloc.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+#include <asm/semaphore.h>
+#include <asm/checksum.h>
+#include <asm/hardirq.h>
+#include <asm/softirq.h>
+#include <asm/current.h>
+
+//asmlinkage long long __ashrdi3 (long long, int);
+//asmlinkage long long __lshrdi3 (long long, int);
+extern char h8300_debug_device[];
+
+extern void dump_thread(struct pt_regs *, struct user *);
+
+/* platform dependent support */
+
+EXPORT_SYMBOL(dump_thread);
+EXPORT_SYMBOL(strnlen);
+EXPORT_SYMBOL(strrchr);
+EXPORT_SYMBOL(strstr);
+EXPORT_SYMBOL(strchr);
+EXPORT_SYMBOL(strcat);
+EXPORT_SYMBOL(strlen);
+EXPORT_SYMBOL(strcmp);
+EXPORT_SYMBOL(strncmp);
+
+EXPORT_SYMBOL(ip_fast_csum);
+
+EXPORT_SYMBOL(mach_enable_irq);
+EXPORT_SYMBOL(mach_disable_irq);
+EXPORT_SYMBOL(kernel_thread);
+
+/* Networking helper routines. */
+EXPORT_SYMBOL(csum_partial_copy);
+
+/* The following are special because they're not called
+   explicitly (the C compiler generates them).  Fortunately,
+   their interface isn't gonna change any time soon now, so
+   it's OK to leave it out of version control.  */
+//EXPORT_SYMBOL_NOVERS(__ashrdi3);
+//EXPORT_SYMBOL_NOVERS(__lshrdi3);
+EXPORT_SYMBOL_NOVERS(memcpy);
+EXPORT_SYMBOL_NOVERS(memset);
+EXPORT_SYMBOL_NOVERS(memcmp);
+EXPORT_SYMBOL_NOVERS(memscan);
+EXPORT_SYMBOL_NOVERS(memmove);
+
+EXPORT_SYMBOL(get_wchan);
+
+/*
+ * libgcc functions - functions that are used internally by the
+ * compiler...  (prototypes are not correct though, but that
+ * doesn't really matter since they're not versioned).
+ */
+extern void __gcc_bcmp(void);
+extern void __ashldi3(void);
+extern void __ashrdi3(void);
+extern void __cmpdi2(void);
+extern void __divdi3(void);
+extern void __divsi3(void);
+extern void __lshrdi3(void);
+extern void __moddi3(void);
+extern void __modsi3(void);
+extern void __muldi3(void);
+extern void __mulsi3(void);
+extern void __negdi2(void);
+extern void __ucmpdi2(void);
+extern void __udivdi3(void);
+extern void __udivmoddi4(void);
+extern void __udivsi3(void);
+extern void __umoddi3(void);
+extern void __umodsi3(void);
+
+        /* gcc lib functions */
+EXPORT_SYMBOL_NOVERS(__gcc_bcmp);
+EXPORT_SYMBOL_NOVERS(__ashldi3);
+EXPORT_SYMBOL_NOVERS(__ashrdi3);
+EXPORT_SYMBOL_NOVERS(__cmpdi2);
+EXPORT_SYMBOL_NOVERS(__divdi3);
+EXPORT_SYMBOL_NOVERS(__divsi3);
+EXPORT_SYMBOL_NOVERS(__lshrdi3);
+EXPORT_SYMBOL_NOVERS(__moddi3);
+EXPORT_SYMBOL_NOVERS(__modsi3);
+EXPORT_SYMBOL_NOVERS(__muldi3);
+EXPORT_SYMBOL_NOVERS(__mulsi3);
+EXPORT_SYMBOL_NOVERS(__negdi2);
+EXPORT_SYMBOL_NOVERS(__ucmpdi2);
+EXPORT_SYMBOL_NOVERS(__udivdi3);
+EXPORT_SYMBOL_NOVERS(__udivmoddi4);
+EXPORT_SYMBOL_NOVERS(__udivsi3);
+EXPORT_SYMBOL_NOVERS(__umoddi3);
+EXPORT_SYMBOL_NOVERS(__umodsi3);
+
+EXPORT_SYMBOL_NOVERS(_current_task);
+
+EXPORT_SYMBOL_NOVERS(is_in_rom);
+
+EXPORT_SYMBOL_NOVERS(h8300_reserved_gpio)
+EXPORT_SYMBOL_NOVERS(h8300_free_gpio)
+EXPORT_SYMBOL_NOVERS(h8300_set_gpio_dir)
diff -Nru a/arch/h8300/kernel/init_task.c b/arch/h8300/kernel/init_task.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/init_task.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,38 @@
+/*
+ *  linux/arch/h8300/kernel/init_task.c
+ */
+#include <linux/mm.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+#include <linux/init_task.h>
+#include <linux/fs.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgtable.h>
+
+static struct fs_struct init_fs = INIT_FS;
+static struct files_struct init_files = INIT_FILES;
+static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
+static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
+struct mm_struct init_mm = INIT_MM(init_mm);
+
+/*
+ * Initial task structure.
+ *
+ * All other task structs will be allocated on slabs in fork.c
+ */
+__asm__(".align 4");
+struct task_struct init_task = INIT_TASK(init_task);
+
+
+/*
+ * Initial thread structure.
+ *
+ * We need to make sure that this is 8192-byte aligned due to the
+ * way process stacks are handled. This is done by having a special
+ * "init_task" linker map entry..
+ */
+union thread_union init_thread_union
+	__attribute__((__section__(".data.init_task"))) =
+		{ INIT_THREAD_INFO(init_task) };
+
diff -Nru a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/process.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,317 @@
+/*
+ *  linux/arch/h8300/kernel/process.c
+ *
+ * Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/kernel/process.c
+ *
+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>,
+ *                      Kenneth Albanowski <kjahds@kjahds.com>,
+ *                      The Silver Hammer Group, Ltd.
+ *
+ *  linux/arch/m68k/kernel/process.c
+ *
+ *  Copyright (C) 1995  Hamish Macdonald
+ *
+ *  68060 fixes by Jesper Skov
+ */
+
+/*
+ * This file handles the architecture-dependent parts of process handling..
+ */
+
+#include <linux/config.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/stddef.h>
+#include <linux/unistd.h>
+#include <linux/ptrace.h>
+#include <linux/slab.h>
+#include <linux/user.h>
+#include <linux/a.out.h>
+#include <linux/interrupt.h>
+#include <linux/reboot.h>
+
+#include <asm/uaccess.h>
+#include <asm/system.h>
+#include <asm/traps.h>
+#include <asm/setup.h>
+#include <asm/pgtable.h>
+
+asmlinkage void ret_from_exception(void);
+
+/*
+ * The idle loop on an H8/300..
+ */
+#if !defined(CONFIG_H8300H_SIM)
+void default_idle(void)
+{
+	while(1) {
+		if (need_resched()) {
+			sti();
+			__asm__("sleep");
+			cli();
+		}
+		schedule();
+	}
+}
+#else
+void default_idle(void)
+{
+	while(1) {
+		if (need_resched())
+			schedule();
+	}
+}
+#endif
+void (*idle)(void) = default_idle;
+
+/*
+ * The idle thread. There's no useful work to be
+ * done, so just try to conserve power and have a
+ * low exit latency (ie sit in a loop waiting for
+ * somebody to say that they'd like to reschedule)
+ */
+void cpu_idle(void)
+{
+	idle();
+}
+
+void machine_restart(char * __unused)
+{
+	cli();
+	__asm__("jmp @@0"); 
+}
+
+void machine_halt(void)
+{
+	cli();
+	__asm__("sleep");
+	for (;;);
+}
+
+void machine_power_off(void)
+{
+	cli();
+	__asm__("sleep");
+	for (;;);
+}
+
+void show_regs(struct pt_regs * regs)
+{
+	printk("\n");
+	printk("PC: %08lx  Status: %02x\n",
+	       regs->pc, regs->ccr);
+	printk("ORIG_ER0: %08lx ER0: %08lx ER1: %08lx\n",
+	       regs->orig_er0, regs->er0, regs->er1);
+	printk("ER2: %08lx ER3: %08lx\n",
+	       regs->er2, regs->er3);
+	if (!(regs->ccr & 0x10))
+		printk("USP: %08lx\n", rdusp());
+}
+
+/*
+ * Create a kernel thread
+ */
+int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
+{
+	long retval;
+	register long clone_arg asm("er1");
+	mm_segment_t fs;
+
+	fs = get_fs();
+	set_fs (KERNEL_DS);
+	clone_arg = flags | CLONE_VM;
+
+	__asm__ __volatile__ (
+			"mov.l	sp, er2\n\t"
+			"mov.l  %1,er0\n\t"
+			"mov.l  %5,er1\n\t"
+			"trapa	#0\n\t"
+			"cmp.l	sp, er2\n\t"
+			"beq	1f\n\t"
+			"mov.l	%3, er0\n\t"
+			"jsr	@%4\n\t"
+			"mov.l	%2, er0\n\t"
+			"trapa	#0\n"
+			"1:\n\t"
+			"mov.l er0,%0"
+		: "=r" (retval)
+		: "i" (__NR_clone),
+		  "i" (__NR_exit),
+		  "r" (arg),
+		  "r" (fn),
+		  "r" (clone_arg)
+		: "cc", "er0", "er1", "er2", "er3");
+
+	set_fs (fs);
+	return retval;
+}
+
+void flush_thread(void)
+{
+}
+
+/*
+ * "h8300_fork()".. By the time we get here, the
+ * non-volatile registers have also been saved on the
+ * stack. We do some ugly pointer stuff here.. (see
+ * also copy_thread)
+ */
+
+asmlinkage int h8300_fork(struct pt_regs *regs)
+{
+	return -EINVAL;
+}
+
+asmlinkage int h8300_vfork(struct pt_regs *regs)
+{
+	struct task_struct *p;
+	p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL);
+	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+}
+
+asmlinkage int h8300_clone(struct pt_regs *regs)
+{
+	unsigned long clone_flags;
+	unsigned long newsp;
+	struct task_struct *p;
+
+	/* syscall2 puts clone_flags in er1 and usp in er2 */
+	clone_flags = regs->er1;
+	newsp = regs->er2;
+	if (!newsp)
+		newsp  = rdusp();
+	p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, regs, 0, NULL, NULL);
+	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+
+}
+
+int copy_thread(int nr, unsigned long clone_flags,
+                unsigned long usp, unsigned long topstk,
+		 struct task_struct * p, struct pt_regs * regs)
+{
+	struct pt_regs * childregs;
+	struct switch_stack * childstack, *stack;
+	unsigned long stack_offset, *retp;
+
+	stack_offset = KTHREAD_SIZE - sizeof(struct pt_regs);
+	childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
+
+	*childregs = *regs;
+
+	retp = (unsigned long *) regs-2;
+	stack = ((struct switch_stack *) retp) - 1;
+
+	childstack = ((struct switch_stack *) childregs) - 1;
+	*childstack = *stack;
+	childregs->er0 = 0;
+	childstack->retpc = (unsigned long) ret_from_exception;
+
+	p->thread.usp = usp;
+	p->thread.ksp = (unsigned long)childstack;
+	p->thread.vfork_ret = 0;
+
+	return 0;
+}
+
+/*
+ * fill in the user structure for a core dump..
+ */
+void dump_thread(struct pt_regs * regs, struct user * dump)
+{
+	struct switch_stack *sw;
+
+/* changed the size calculations - should hopefully work better. lbt */
+	dump->magic = CMAGIC;
+	dump->start_code = 0;
+	dump->start_stack = rdusp() & ~(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_ar0 = (struct user_regs_struct *)(((int)(&dump->regs)) -((int)(dump)));
+	sw = ((struct switch_stack *)regs) - 1;
+	dump->regs.er0 = regs->er0;
+	dump->regs.er1 = regs->er1;
+	dump->regs.er2 = regs->er2;
+	dump->regs.er3 = regs->er3;
+	dump->regs.er4 = sw->er4;
+	dump->regs.er5 = sw->er5;
+	dump->regs.er6 = sw->er6;
+	dump->regs.orig_er0 = regs->orig_er0;
+	dump->regs.ccr = regs->ccr;
+	dump->regs.pc  = regs->pc;
+}
+
+/*
+ * sys_execve() executes a new program.
+ */
+asmlinkage int sys_execve(char *name, char **argv, char **envp,int dummy,...)
+{
+	int error;
+	char * filename;
+	struct pt_regs *regs = (struct pt_regs *) ((unsigned char *)&dummy+4);
+
+	lock_kernel();
+	filename = getname(name);
+	error = PTR_ERR(filename);
+	if (IS_ERR(filename))
+		goto out;
+	error = do_execve(filename, argv, envp, regs);
+	putname(filename);
+out:
+	unlock_kernel();
+	return error;
+}
+
+/*
+ * These bracket the sleeping functions..
+ */
+extern void scheduling_functions_start_here(void);
+extern void scheduling_functions_end_here(void);
+#define first_sched	((unsigned long) scheduling_functions_start_here)
+#define last_sched	((unsigned long) scheduling_functions_end_here)
+
+unsigned long thread_saved_pc(struct task_struct *tsk)
+{
+	struct switch_stack *sw = (struct switch_stack *)(tsk->thread.ksp);
+
+	/* Check whether the thread is blocked in resume() */
+	if (sw->retpc > (unsigned long)scheduling_functions_start_here &&
+	    sw->retpc < (unsigned long)scheduling_functions_end_here)
+		return ((unsigned long *)sw->er6)[1];
+	else
+		return sw->retpc;
+}
+
+unsigned long get_wchan(struct task_struct *p)
+{
+	unsigned long fp, pc;
+	unsigned long stack_page;
+	int count = 0;
+	if (!p || p == current || p->state == TASK_RUNNING)
+		return 0;
+
+	stack_page = (unsigned long)p;
+	fp = ((struct switch_stack *)p->thread.ksp)->er6;
+	do {
+		if (fp < stack_page+sizeof(struct task_struct) ||
+		    fp >= 8184+stack_page)
+			return 0;
+		pc = ((unsigned long *)fp)[1];
+		/* FIXME: This depends on the order of these functions. */
+		if (pc < first_sched || pc >= last_sched)
+			return pc;
+		fp = *(unsigned long *) fp;
+	} while (count++ < 16);
+	return 0;
+}
diff -Nru a/arch/h8300/kernel/ptrace.c b/arch/h8300/kernel/ptrace.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/ptrace.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,470 @@
+/*
+ *  linux/arch/h8300/kernel/ptrace.c
+ *
+ *  Yoshinori Sato <qzb04471@nifty.ne.jp>
+ *
+ *  Based on:
+ *  linux/arch/m68k/kernel/ptrace.c
+ *
+ *  Copyright (C) 1994 by Hamish Macdonald
+ *  Taken from linux/kernel/ptrace.c and modified for M680x0.
+ *  linux/kernel/ptrace.c is by Ross Biro 1/23/92, edited by Linus Torvalds
+ *
+ * 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.
+ */
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/errno.h>
+#include <linux/ptrace.h>
+#include <linux/user.h>
+#include <linux/config.h>
+
+#include <asm/uaccess.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/system.h>
+#include <asm/processor.h>
+#include <asm/signal.h>
+
+/*
+ * does not yet catch signals sent when the child dies.
+ * in exit.c or in signal.c.
+ */
+
+/* determines which bits in the SR the user has access to. */
+/* 1 = access 0 = no access */
+#define SR_MASK 0x001f
+
+/* sets the trace bits. */
+#define TRACE_BITS 0x8000
+
+/* Find the stack offset for a register, relative to thread.esp0. */
+#define PT_REG(reg)	((long)&((struct pt_regs *)0)->reg)
+#define SW_REG(reg)	((long)&((struct switch_stack *)0)->reg \
+			 - sizeof(struct switch_stack))
+/* Mapping from PT_xxx to the stack offset at which the register is
+   saved.  Notice that usp has no stack-slot and needs to be treated
+   specially (see get_reg/put_reg below). */
+static const int regoff[] = {
+	PT_REG(er1), PT_REG(er2), PT_REG(er3), SW_REG(er4),
+	SW_REG(er5), SW_REG(er6), PT_REG(er0), PT_REG(orig_er0),
+	PT_REG(ccr), PT_REG(pc)
+};
+
+/*
+ * Get contents of register REGNO in task TASK.
+ */
+static inline long get_reg(struct task_struct *task, int regno)
+{
+	unsigned long *addr;
+
+	if (regno == PT_USP)
+		addr = &task->thread.usp;
+	else if (regno < sizeof(regoff)/sizeof(regoff[0]))
+		addr = (unsigned long *)(task->thread.esp0 + regoff[regno]);
+	else
+		return 0;
+	return *addr;
+}
+
+/*
+ * Write contents of register REGNO in task TASK.
+ */
+static inline int put_reg(struct task_struct *task, int regno,
+			  unsigned long data)
+{
+	unsigned long *addr;
+
+	if (regno == PT_USP)
+		addr = &task->thread.usp;
+	else if (regno < sizeof(regoff)/sizeof(regoff[0]))
+		addr = (unsigned long *) (task->thread.esp0 + regoff[regno]);
+	else
+		return -1;
+	*addr = data;
+	return 0;
+}
+
+/*
+ * Called by kernel/ptrace.c when detaching..
+ *
+ * Make sure the single step bit is not set.
+ */
+int ptrace_cancel_bpt(struct task_struct *child)
+{
+        int i,r=0;
+
+	for(i=0; i<4; i++) {
+	        if (child->thread.debugreg[i]) {
+		        if (child->thread.debugreg[i] != ~0)
+		                put_user(child->thread.debugreg[i+4],
+                                         (unsigned short *)child->thread.debugreg[i]);
+			r = 1;
+			child->thread.debugreg[i] = 0;
+		}
+	}
+	return r;
+}
+
+const static unsigned char opcode0[]={
+  0x04,0x02,0x04,0x02,0x04,0x02,0x04,0x02,  /* 0x58 */
+  0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,  /* 0x60 */
+  0x02,0x02,0x11,0x11,0x02,0x02,0x04,0x04,  /* 0x68 */
+  0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,  /* 0x70 */
+  0x08,0x04,0x06,0x04,0x04,0x04,0x04,0x04}; /* 0x78 */
+
+const static int table_parser01(unsigned char *pc);
+const static int table_parser02(unsigned char *pc);
+const static int table_parser100(unsigned char *pc);
+const static int table_parser101(unsigned char *pc);
+
+const static int (*parsers[])(unsigned char *pc)={table_parser01,table_parser02};
+
+static int insn_length(unsigned char *pc)
+{
+  if (*pc == 0x01)
+    return table_parser01(pc+1);
+  if (*pc < 0x58 || *pc>=0x80) 
+    return 2;
+  else
+    if (opcode0[*pc-0x58]<0x10)
+      return opcode0[*pc-0x58];
+    else
+      return (*parsers[opcode0[*pc-0x58]-0x10])(pc+1);
+}
+
+const static int table_parser01(unsigned char *pc)
+{
+  const unsigned char codelen[]={0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,
+                                 0x02,0x00,0x00,0x00,0x04,0x04,0x00,0x04};
+  const static int (*parsers[])(unsigned char *)={table_parser100,table_parser101};
+  unsigned char second_index;
+  second_index = (*pc) >> 4;
+  if (codelen[second_index]<0x10)
+    return codelen[second_index];
+  else
+    return parsers[codelen[second_index]-0x10](pc);
+}
+
+const static int table_parser02(unsigned char *pc)
+{
+  return (*pc & 0x20)?0x06:0x04;
+}
+
+const static int table_parser100(unsigned char *pc)
+{
+  return (*(pc+2) & 0x02)?0x08:0x06;
+}
+
+const static int table_parser101(unsigned char *pc)
+{
+  return (*(pc+2) & 0x02)?0x08:0x06;
+}
+
+#define BREAK_INST 0x5730 /* TRAPA #3 */
+
+int ptrace_set_bpt(struct task_struct *child)
+{
+        unsigned long pc,next;
+	unsigned short insn;
+	pc = get_reg(child,PT_PC);
+	next = insn_length((unsigned char *)pc) + pc;
+	get_user(insn,(unsigned short *)pc);
+	if (insn == 0x5470) {
+	        /* rts */ 
+	        unsigned long sp;
+		sp = get_reg(child,PT_USP);
+		get_user(next,(unsigned long *)sp);
+	} else if ((insn & 0xfb00) != 0x5800) {
+	        /* jmp / jsr */
+	        int regs;
+		const short reg_tbl[]={PT_ER0,PT_ER1,PT_ER2,PT_ER3,
+                                       PT_ER4,PT_ER5,PT_ER6,PT_USP};
+	        switch(insn & 0xfb00) {
+		        case 0x5900:
+			       regs = (insn & 0x0070) >> 8;
+                               next = get_reg(child,reg_tbl[regs]);
+			       break;
+		        case 0x5a00:
+			       get_user(next,(unsigned long *)(pc+2));
+			       next &= 0x00ffffff;
+			       break;
+		        case 0x5b00:
+			       /* unneccessary? */
+			       next = *(unsigned long *)(insn & 0xff);
+                               break;
+		}
+	} else if (((insn & 0xf000) == 0x4000) || ((insn &0xff00) == 0x5500)) { 
+	        /* b**:8 */
+	        unsigned long dsp;
+		dsp = (long)(insn && 0xff)+pc+2;
+		child->thread.debugreg[1] = dsp;
+		get_user(child->thread.debugreg[5],(unsigned short *)dsp);
+		put_user(BREAK_INST,(unsigned short *)dsp);
+	} else if (((insn & 0xff00) == 0x5800) || ((insn &0xff00) == 0x5c00)) { 
+	        /* b**:16 */
+	        unsigned long dsp;
+		get_user(dsp,(unsigned short *)(pc+2));
+		dsp = (long)dsp+pc+4;
+		child->thread.debugreg[1] = dsp;
+		get_user(child->thread.debugreg[5],(unsigned short *)dsp);
+		put_user(BREAK_INST,(unsigned short *)dsp);
+	}
+	child->thread.debugreg[0] = next;
+	get_user(child->thread.debugreg[4],(unsigned short *)next);
+	put_user(BREAK_INST,(unsigned short *)next);
+	return 0;
+}
+
+inline
+static int read_long(struct task_struct * tsk, unsigned long addr,
+	unsigned long * result)
+{
+	*result = *(unsigned long *)addr;
+	return 0;
+}
+
+void ptrace_disable(struct task_struct *child)
+{
+	ptrace_cancel_bpt(child);
+}
+
+asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
+{
+	struct task_struct *child;
+	int ret;
+
+	lock_kernel();
+	ret = -EPERM;
+	if (request == PTRACE_TRACEME) {
+		/* are we already being traced? */
+		if (current->ptrace & PT_PTRACED)
+			goto out;
+		/* set the ptrace bit in the process flags. */
+		current->ptrace |= PT_PTRACED;
+		ret = 0;
+		goto out;
+	}
+	ret = -ESRCH;
+	read_lock(&tasklist_lock);
+	child = find_task_by_pid(pid);
+	if (child)
+		get_task_struct(child);
+	read_unlock(&tasklist_lock);
+	if (!child)
+		goto out;
+
+	ret = -EPERM;
+	if (pid == 1)		/* you may not mess with init */
+		goto out_tsk;
+
+	if (request == PTRACE_ATTACH) {
+		ret = ptrace_attach(child);
+		goto out_tsk;
+	}
+	ret = -ESRCH;
+	if (!(child->ptrace & PT_PTRACED))
+		goto out_tsk;
+	if (child->state != TASK_STOPPED) {
+		if (request != PTRACE_KILL)
+			goto out_tsk;
+	}
+	ret = ptrace_check_attach(child, request == PTRACE_KILL);
+	if (ret < 0)
+		goto out_tsk;
+
+	switch (request) {
+		case PTRACE_PEEKTEXT: /* read word at location addr. */ 
+		case PTRACE_PEEKDATA: {
+			unsigned long tmp;
+
+			ret = read_long(child, addr, &tmp);
+			if (ret < 0)
+				break ;
+			ret = verify_area(VERIFY_WRITE, (void *) data, sizeof(long));
+			if (!ret)
+				put_user(tmp, (unsigned long *) data);
+			break ;
+		}
+
+	/* read the word at location addr in the USER area. */
+		case PTRACE_PEEKUSR: {
+			unsigned long tmp;
+			
+			if ((addr & 3) || addr < 0 || addr >= sizeof(struct user))
+				ret = -EIO;
+			
+			ret = verify_area(VERIFY_WRITE, (void *) data,
+					  sizeof(long));
+			if (ret)
+				break ;
+			tmp = 0;  /* Default return condition */
+			addr = addr >> 2; /* temporary hack. */
+			if (addr < 10)
+				tmp = get_reg(child, addr);
+			else {
+				ret = -EIO;
+				break ;
+			}
+			put_user(tmp,(unsigned long *) data);
+			ret = 0;
+			break ;
+		}
+
+      /* when I and D space are separate, this will have to be fixed. */
+		case PTRACE_POKETEXT: /* write the word at location addr. */
+		case PTRACE_POKEDATA:
+			ret = 0;
+			if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data))
+				break;
+			ret = -EIO;
+			break;
+
+		case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
+			if ((addr & 3) || addr < 0 || addr >= sizeof(struct user)) {
+				ret = -EIO;
+				break ;
+			}
+			addr = addr >> 2; /* temporary hack. */
+			    
+			if (addr == PT_ORIG_ER0) {
+				ret = -EIO;
+				break ;
+			}
+			if (addr == PT_CCR) {
+				data &= SR_MASK;
+			}
+			if (addr < 10) {
+				if (put_reg(child, addr, data))
+					ret = -EIO;
+				else
+					ret = 0;
+				break ;
+			}
+			ret = -EIO;
+			break ;
+		case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
+		case PTRACE_CONT: { /* restart after signal. */
+			ret = -EIO;
+			if ((unsigned long) data >= _NSIG)
+				break ;
+			if (request == PTRACE_SYSCALL)
+				set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+			else
+				clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+			child->exit_code = data;
+			wake_up_process(child);
+			/* make sure the single step bit is not set. */
+			ptrace_cancel_bpt(child);
+			ret = 0;
+		}
+
+/*
+ * make the child exit.  Best I can do is send it a sigkill. 
+ * perhaps it should be put in the status that it wants to 
+ * exit.
+ */
+		case PTRACE_KILL: {
+
+			ret = 0;
+			if (child->state == TASK_ZOMBIE) /* already dead */
+				break;
+			child->exit_code = SIGKILL;
+			ptrace_cancel_bpt(child);
+			wake_up_process(child);
+			break;
+		}
+
+		case PTRACE_SINGLESTEP: {  /* set the trap flag. */
+			ret = -EIO;
+			if ((unsigned long) data > _NSIG)
+				break;
+			clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
+			child->thread.debugreg[0]=-1;
+			child->exit_code = data;
+			wake_up_process(child);
+			ret = 0;
+			break;
+		}
+
+		case PTRACE_DETACH:	/* detach a process that was attached. */
+			ret = ptrace_detach(child, data);
+			break;
+
+		case PTRACE_GETREGS: { /* Get all gp regs from the child. */
+		  	int i;
+			unsigned long tmp;
+			for (i = 0; i < 19; i++) {
+			    tmp = get_reg(child, i);
+			    if (put_user(tmp, (unsigned long *) data)) {
+				ret = -EFAULT;
+				break;
+			    }
+			    data += sizeof(long);
+			}
+			ret = 0;
+			break;
+		}
+
+		case PTRACE_SETREGS: { /* Set all gp regs in the child. */
+			int i;
+			unsigned long tmp;
+			for (i = 0; i < 10; i++) {
+			    if (get_user(tmp, (unsigned long *) data)) {
+				ret = -EFAULT;
+				break;
+			    }
+			    put_reg(child, i, tmp);
+			    data += sizeof(long);
+			}
+			ret = 0;
+			break;
+		}
+
+		default:
+			ret = -EIO;
+			break;
+	}
+out_tsk:
+	put_task_struct(child);
+out:
+	unlock_kernel();
+	return ret;
+}
+
+asmlinkage void syscall_trace(void)
+{
+	if (!test_thread_flag(TIF_SYSCALL_TRACE))
+		return;
+	if (!(current->ptrace & PT_PTRACED))
+		return;
+	current->exit_code = SIGTRAP;
+	current->state = TASK_STOPPED;
+	notify_parent(current, SIGCHLD);
+	schedule();
+	/*
+	 * this isn't the same as continuing with a signal, but it will do
+	 * for normal use.  strace only continues with a signal if the
+	 * stopping signal is not SIGTRAP.  -brl
+	 */
+	if (current->exit_code) {
+		send_sig(current->exit_code, current, 1);
+		current->exit_code = 0;
+	}
+}
+
+asmlinkage void trace_trap(unsigned long bp)
+{
+	if (current->thread.debugreg[0] == bp ||
+            current->thread.debugreg[1] == bp) {
+	        ptrace_cancel_bpt(current);
+		force_sig(SIGTRAP,current);
+	} else
+	        force_sig(SIGILL,current);
+}
diff -Nru a/arch/h8300/kernel/semaphore.c b/arch/h8300/kernel/semaphore.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/semaphore.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,132 @@
+/*
+ *  Generic semaphore code. Buyer beware. Do your own
+ * specific changes in <asm/semaphore-helper.h>
+ */
+
+#include <linux/config.h>
+#include <linux/sched.h>
+#include <asm/semaphore-helper.h>
+
+#ifndef CONFIG_RMW_INSNS
+spinlock_t semaphore_wake_lock;
+#endif
+
+/*
+ * Semaphores are implemented using a two-way counter:
+ * The "count" variable is decremented for each process
+ * that tries to sleep, while the "waking" variable is
+ * incremented when the "up()" code goes to wake up waiting
+ * processes.
+ *
+ * Notably, the inline "up()" and "down()" functions can
+ * efficiently test if they need to do any extra work (up
+ * needs to do something only if count was negative before
+ * the increment operation.
+ *
+ * waking_non_zero() (from asm/semaphore.h) must execute
+ * atomically.
+ *
+ * When __up() is called, the count was negative before
+ * incrementing it, and we need to wake up somebody.
+ *
+ * This routine adds one to the count of processes that need to
+ * wake up and exit.  ALL waiting processes actually wake up but
+ * only the one that gets to the "waking" field first will gate
+ * through and acquire the semaphore.  The others will go back
+ * to sleep.
+ *
+ * Note that these functions are only called when there is
+ * contention on the lock, and as such all this is the
+ * "non-critical" part of the whole semaphore business. The
+ * critical part is the inline stuff in <asm/semaphore.h>
+ * where we want to avoid any extra jumps and calls.
+ */
+void __up(struct semaphore *sem)
+{
+	wake_one_more(sem);
+	wake_up(&sem->wait);
+}
+
+/*
+ * Perform the "down" function.  Return zero for semaphore acquired,
+ * return negative for signalled out of the function.
+ *
+ * If called from __down, the return is ignored and the wait loop is
+ * not interruptible.  This means that a task waiting on a semaphore
+ * using "down()" cannot be killed until someone does an "up()" on
+ * the semaphore.
+ *
+ * If called from __down_interruptible, the return value gets checked
+ * upon return.  If the return value is negative then the task continues
+ * with the negative value in the return register (it can be tested by
+ * the caller).
+ *
+ * Either form may be used in conjunction with "up()".
+ *
+ */
+
+
+#define DOWN_HEAD(task_state)						\
+									\
+									\
+	current->state = (task_state);					\
+	add_wait_queue(&sem->wait, &wait);				\
+									\
+	/*								\
+	 * Ok, we're set up.  sem->count is known to be less than zero	\
+	 * so we must wait.						\
+	 *								\
+	 * We can let go the lock for purposes of waiting.		\
+	 * We re-acquire it after awaking so as to protect		\
+	 * all semaphore operations.					\
+	 *								\
+	 * If "up()" is called before we call waking_non_zero() then	\
+	 * we will catch it right away.  If it is called later then	\
+	 * we will have to go through a wakeup cycle to catch it.	\
+	 *								\
+	 * Multiple waiters contend for the semaphore lock to see	\
+	 * who gets to gate through and who has to wait some more.	\
+	 */								\
+	for (;;) {
+
+#define DOWN_TAIL(task_state)			\
+		current->state = (task_state);	\
+	}					\
+	current->state = TASK_RUNNING;		\
+	remove_wait_queue(&sem->wait, &wait);
+
+void __down(struct semaphore * sem)
+{
+	DECLARE_WAITQUEUE(wait, current);
+
+	DOWN_HEAD(TASK_UNINTERRUPTIBLE)
+	if (waking_non_zero(sem))
+		break;
+	schedule();
+	DOWN_TAIL(TASK_UNINTERRUPTIBLE)
+}
+
+int __down_interruptible(struct semaphore * sem)
+{
+	DECLARE_WAITQUEUE(wait, current);
+	int ret = 0;
+
+	DOWN_HEAD(TASK_INTERRUPTIBLE)
+
+	ret = waking_non_zero_interruptible(sem, current);
+	if (ret)
+	{
+		if (ret == 1)
+			/* ret != 0 only if we get interrupted -arca */
+			ret = 0;
+		break;
+	}
+	schedule();
+	DOWN_TAIL(TASK_INTERRUPTIBLE)
+	return ret;
+}
+
+int __down_trylock(struct semaphore * sem)
+{
+	return waking_non_zero_trylock(sem);
+}
diff -Nru a/arch/h8300/kernel/setup.c b/arch/h8300/kernel/setup.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/setup.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,231 @@
+/*
+ *  linux/arch/h8300h/kernel/setup.c
+ *
+ *  Copyleft  ()) 2000       James D. Schettine {james@telos-systems.com}
+ *  Copyright (C) 1999,2000  Greg Ungerer (gerg@snapgear.com)
+ *  Copyright (C) 1998,1999  D. Jeff Dionne <jeff@lineo.ca>
+ *  Copyright (C) 1998       Kenneth Albanowski <kjahds@kjahds.com>
+ *  Copyright (C) 1995       Hamish Macdonald
+ *  Copyright (C) 2000       Lineo Inc. (www.lineo.com) 
+ *  Copyright (C) 2001 	     Lineo, Inc. <www.lineo.com>
+ *
+ *  H8/300H porting Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+/*
+ * This file handles the architecture-dependent parts of system setup
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/fs.h>
+#include <linux/fb.h>
+#include <linux/console.h>
+#include <linux/genhd.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/major.h>
+#include <linux/bootmem.h>
+#include <linux/seq_file.h>
+
+#include <asm/setup.h>
+#include <asm/irq.h>
+
+#ifdef CONFIG_BLK_DEV_INITRD
+#include <linux/blk.h>
+#include <asm/pgtable.h>
+#endif
+
+#if defined(CONFIG_CPU_H8300H)
+#define CPU "H8/300H"
+#endif
+
+unsigned long rom_length;
+unsigned long memory_start;
+unsigned long memory_end;
+
+struct task_struct *_current_task;
+
+char command_line[512];
+char saved_command_line[512];
+
+extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end;
+extern int _ramstart, _ramend;
+extern char _target_name[];
+
+#if defined(CONFIG_H8300H_SIM) && defined(CONFIG_GDB_MAGICPRINT)
+/* printk with gdb service */
+static void gdb_console_output(struct console *c, char *msg, unsigned len)
+{
+	for (; len > 0; len--) {
+		asm("mov.w %0,r2\n\t"
+                    "jsr @0xc4"::"r"(*msg++):"er2");
+	}
+}
+
+/*
+ *	Setup initial baud/bits/parity. We do two things here:
+ *	- construct a cflag setting for the first rs_open()
+ *	- initialize the serial port
+ *	Return non-zero if we didn't find a serial port.
+ */
+static int __init gdb_console_setup(struct console *co, char *options)
+{
+	return 0;
+}
+
+static const struct console gdb_console = {
+	name:		"gdb",
+	write:		gdb_console_output,
+	device:		NULL,
+	setup:		gdb_console_setup,
+	flags:		CON_PRINTBUFFER,
+	index:		-1,
+};
+#endif
+
+void setup_arch(char **cmdline_p)
+{
+	int bootmap_size;
+
+	memory_start = PAGE_ALIGN((unsigned long)(&_ramstart));
+	memory_end = &_ramend; /* by now the stack is part of the init task */
+
+	init_mm.start_code = (unsigned long) &_stext;
+	init_mm.end_code = (unsigned long) &_etext;
+	init_mm.end_data = (unsigned long) &_edata;
+	init_mm.brk = (unsigned long) 0; 
+
+#if defined(CONFIG_H8300H_SIM) && defined(CONFIG_GDB_MAGICPRINT)
+	register_console(&gdb_console);
+#endif
+
+	printk("\x0F\r\n\nuClinux " CPU "\n");
+	printk("Target Hardware: %s\n",_target_name);
+	printk("Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne\n");
+	printk("H8/300H support by Yoshinori Sato <ysato@users.sourceforge.jp>\n");
+
+#ifdef DEBUG
+	printk("KERNEL -> TEXT=0x%06x-0x%06x DATA=0x%06x-0x%06x "
+		"BSS=0x%06x-0x%06x\n", (int) &_stext, (int) &_etext,
+		(int) &_sdata, (int) &_edata,
+		(int) &_sbss, (int) &_ebss);
+	printk("KERNEL -> ROMFS=0x%06x-0x%06x MEM=0x%06x-0x%06x "
+		"STACK=0x%06x-0x%06x\n",
+	       (int) &_ebss, (int) memory_start,
+		(int) memory_start, (int) memory_end,
+		(int) memory_end, (int) &_ramend);
+#endif
+
+#ifdef CONFIG_BLK_DEV_BLKMEM
+	ROOT_DEV = MKDEV(BLKMEM_MAJOR,0);
+#endif
+
+#ifdef CONFIG_DEFAULT_CMDLINE
+	/* set from default command line */
+	if (*command_line == '\0')
+		strcpy(command_line,CONFIG_KERNEL_COMMAND);
+#endif
+	/* Keep a copy of command line */
+	*cmdline_p = &command_line[0];
+	memcpy(saved_command_line, command_line, sizeof(saved_command_line));
+	saved_command_line[sizeof(saved_command_line)-1] = 0;
+
+#ifdef DEBUG
+	if (strlen(*cmdline_p)) 
+		printk("Command line: '%s'\n", *cmdline_p);
+#endif
+
+	/*
+	 * give all the memory to the bootmap allocator,  tell it to put the
+	 * boot mem_map at the start of memory
+	 */
+	bootmap_size = init_bootmem_node(
+			NODE_DATA(0),
+			memory_start >> PAGE_SHIFT, /* map goes here */
+			PAGE_OFFSET >> PAGE_SHIFT,	/* 0 on coldfire */
+			memory_end >> PAGE_SHIFT);
+	/*
+	 * free the usable memory,  we have to make sure we do not free
+	 * the bootmem bitmap so we then reserve it after freeing it :-)
+	 */
+	free_bootmem(memory_start, memory_end - memory_start);
+	reserve_bootmem(memory_start, bootmap_size);
+	/*
+	 * get kmalloc into gear
+	 */
+	paging_init();
+#ifdef DEBUG
+	printk("Done setup_arch\n");
+#endif
+}
+
+int get_cpuinfo(char * buffer)
+{
+    char *cpu;
+    u_long clockfreq;
+
+    cpu = CPU;
+
+    clockfreq = CONFIG_CPU_CLOCK;
+
+    return(sprintf(buffer, "CPU:\t\t%s\n"
+		   "Clock:\t%lu.%1luMHz\n"
+		   "BogoMips:\t%lu.%02lu\n"
+		   "Calibration:\t%lu loops\n",
+		   cpu,
+		   clockfreq/100,clockfreq%100,
+		   (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100,
+		   (loops_per_jiffy*HZ)));
+
+}
+
+/*
+ *	Get CPU information for use by the procfs.
+ */
+
+static int show_cpuinfo(struct seq_file *m, void *v)
+{
+    char *cpu;
+    u_long clockfreq;
+
+    cpu = CPU;
+
+    clockfreq = CONFIG_CPU_CLOCK;
+
+    seq_printf(m,  "CPU:\t\t%s\n"
+		   "Clock:\t%lu.%1luMHz\n"
+		   "BogoMips:\t%lu.%02lu\n"
+		   "Calibration:\t%lu loops\n",
+		   cpu,
+		   clockfreq/100,clockfreq%100,
+		   (loops_per_jiffy*HZ)/500000,((loops_per_jiffy*HZ)/5000)%100,
+		   (loops_per_jiffy*HZ));
+
+    return 0;
+}
+
+static void *c_start(struct seq_file *m, loff_t *pos)
+{
+	return *pos < NR_CPUS ? ((void *) 0x12345678) : NULL;
+}
+
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
+{
+	++*pos;
+	return c_start(m, pos);
+}
+
+static void c_stop(struct seq_file *m, void *v)
+{
+}
+
+struct seq_operations cpuinfo_op = {
+	start:	c_start,
+	next:	c_next,
+	stop:	c_stop,
+	show:	show_cpuinfo,
+};
diff -Nru a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/signal.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,642 @@
+/*
+ *  linux/arch/h8300/kernel/signal.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ * 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.
+ */
+
+/*
+ * uClinux H8/300 support by Yoshinori Sato
+ *
+ * Based on
+ * Linux/m68k by Hamish Macdonald
+ */
+
+/*
+ * ++roman (07/09/96): implemented signal stacks (specially for tosemu on
+ * Atari :-) Current limitation: Only one sigstack can be active at one time.
+ * If a second signal with SA_ONSTACK set arrives while working on a sigstack,
+ * SA_ONSTACK is ignored. This behaviour avoids lots of trouble with nested
+ * signal handlers!
+ */
+
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/signal.h>
+#include <linux/errno.h>
+#include <linux/wait.h>
+#include <linux/ptrace.h>
+#include <linux/unistd.h>
+#include <linux/stddef.h>
+#include <linux/highuid.h>
+#include <linux/personality.h>
+#include <linux/tty.h>
+#include <linux/binfmts.h>
+
+#include <asm/setup.h>
+#include <asm/uaccess.h>
+#include <asm/pgtable.h>
+#include <asm/traps.h>
+#include <asm/ucontext.h>
+
+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+
+asmlinkage long sys_wait4(pid_t pid, unsigned int * stat_addr, int options,
+			struct rusage * ru);
+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
+
+/*
+ * Atomically swap in the new signal mask, and wait for a signal.
+ */
+asmlinkage int do_sigsuspend(struct pt_regs *regs)
+{
+	old_sigset_t mask = regs->er3;
+	sigset_t saveset;
+
+	mask &= _BLOCKABLE;
+	spin_lock_irq(&current->sighand->siglock);
+	saveset = current->blocked;
+	siginitset(&current->blocked, mask);
+	recalc_sigpending();
+	spin_unlock_irq(&current->sighand->siglock);
+
+	regs->er0 = -EINTR;
+	while (1) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule();
+		if (do_signal(&saveset, regs))
+			return -EINTR;
+	}
+}
+
+asmlinkage int
+do_rt_sigsuspend(struct pt_regs *regs)
+{
+	sigset_t *unewset = (sigset_t *)regs->er1;
+	size_t sigsetsize = (size_t)regs->er2;
+	sigset_t saveset, newset;
+
+	/* 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);
+	saveset = current->blocked;
+	current->blocked = newset;
+	recalc_sigpending();
+	spin_unlock_irq(&current->sighand->siglock);
+
+	regs->er0 = -EINTR;
+	while (1) {
+		current->state = TASK_INTERRUPTIBLE;
+		schedule();
+		if (do_signal(&saveset, regs))
+			return -EINTR;
+	}
+}
+
+asmlinkage int 
+sys_sigaction(int sig, const struct old_sigaction *act,
+	      struct old_sigaction *oact)
+{
+	struct k_sigaction new_ka, old_ka;
+	int ret;
+
+	if (act) {
+		old_sigset_t mask;
+		if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
+		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
+		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
+			return -EFAULT;
+		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
+		__get_user(mask, &act->sa_mask);
+		siginitset(&new_ka.sa.sa_mask, mask);
+	}
+
+	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+
+	if (!ret && oact) {
+		if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
+		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
+		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
+			return -EFAULT;
+		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
+	}
+
+	return ret;
+}
+
+asmlinkage int
+sys_sigaltstack(const stack_t *uss, stack_t *uoss)
+{
+	return do_sigaltstack(uss, uoss, rdusp());
+}
+
+
+/*
+ * Do a signal return; undo the signal stack.
+ *
+ * Keep the return code on the stack quadword aligned!
+ * That makes the cache flush below easier.
+ */
+
+struct sigframe
+{
+	char *pretcode;
+	int sig;
+	int code;
+	struct sigcontext *psc;
+	char retcode[6];
+	unsigned long extramask[_NSIG_WORDS-1];
+	struct sigcontext sc;
+};
+
+struct rt_sigframe
+{
+	char *pretcode;
+	int sig;
+	struct siginfo *pinfo;
+	void *puc;
+	char retcode[6];
+	struct siginfo info;
+	struct ucontext uc;
+};
+
+
+static inline int
+restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, void *fp,
+		   int *pd0)
+{
+	struct sigcontext context;
+	int err = 0;
+
+	/* get previous context */
+	if (copy_from_user(&context, usc, sizeof(context)))
+		goto badframe;
+	
+	/* restore passed registers */
+	regs->er1 = context.sc_er1;
+	regs->er2 = context.sc_er2;
+	regs->er3 = context.sc_er3;
+	regs->ccr = (regs->ccr & 0x10)|(context.sc_ccr & 0xef);
+	regs->pc = context.sc_pc;
+	regs->orig_er0 = -1;		/* disable syscall checks */
+	wrusp(context.sc_usp);
+
+	*pd0 = context.sc_er0;
+	return err;
+
+badframe:
+	return 1;
+}
+
+static inline int
+rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
+		    struct ucontext *uc, int *pd0)
+{
+	int temp;
+	greg_t *gregs = uc->uc_mcontext.gregs;
+	unsigned long usp;
+	int err;
+
+	err = __get_user(temp, &uc->uc_mcontext.version);
+	if (temp != MCONTEXT_VERSION)
+		goto badframe;
+	/* restore passed registers */
+	err |= __get_user(regs->er0, &gregs[0]);
+	err |= __get_user(regs->er1, &gregs[1]);
+	err |= __get_user(regs->er2, &gregs[2]);
+	err |= __get_user(regs->er3, &gregs[3]);
+	err |= __get_user(sw->er4, &gregs[4]);
+	err |= __get_user(sw->er5, &gregs[5]);
+	err |= __get_user(sw->er6, &gregs[6]);
+	err |= __get_user(usp, &gregs[7]);
+	wrusp(usp);
+	err |= __get_user(regs->pc, &gregs[8]);
+	err |= __get_user(temp, &gregs[9]);
+	regs->ccr = (regs->ccr & 0x10) | (temp & 0xef);
+	regs->orig_er0 = -1;		/* disable syscall checks */
+
+	if (do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT)
+		goto badframe;
+
+	*pd0 = regs->er0;
+	return err;
+
+badframe:
+	return 1;
+}
+
+asmlinkage int do_sigreturn(unsigned long __unused,...)
+{
+	struct switch_stack *sw = (struct switch_stack *) &__unused;
+	struct pt_regs *regs = (struct pt_regs *) (sw + 1);
+	unsigned long usp = rdusp();
+	struct sigframe *frame = (struct sigframe *)(usp - 4);
+	sigset_t set;
+	int er0;
+
+	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+		goto badframe;
+	if (__get_user(set.sig[0], &frame->sc.sc_mask) ||
+	    (_NSIG_WORDS > 1 &&
+	     __copy_from_user(&set.sig[1], &frame->extramask,
+			      sizeof(frame->extramask))))
+		goto badframe;
+
+	sigdelsetmask(&set, ~_BLOCKABLE);
+	spin_lock_irq(&current->sighand->siglock);
+	current->blocked = set;
+	recalc_sigpending();
+	spin_unlock_irq(&current->sighand->siglock);
+	
+	if (restore_sigcontext(regs, &frame->sc, frame + 1, &er0))
+		goto badframe;
+	return er0;
+
+badframe:
+	force_sig(SIGSEGV, current);
+	return 0;
+}
+
+asmlinkage int do_rt_sigreturn(unsigned long __unused,...)
+{
+	struct switch_stack *sw = (struct switch_stack *) &__unused;
+	struct pt_regs *regs = (struct pt_regs *) (sw + 1);
+	unsigned long usp = rdusp();
+	struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4);
+	sigset_t set;
+	int er0;
+
+	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+		goto badframe;
+	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
+		goto badframe;
+
+	sigdelsetmask(&set, ~_BLOCKABLE);
+	spin_unlock_irq(&current->sighand->siglock);
+	current->blocked = set;
+	recalc_sigpending();
+	spin_lock_irq(&current->sighand->siglock);
+	
+	if (rt_restore_ucontext(regs, sw, &frame->uc, &er0))
+		goto badframe;
+	return er0;
+
+badframe:
+	force_sig(SIGSEGV, current);
+	return 0;
+}
+
+static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
+			     unsigned long mask)
+{
+	sc->sc_mask = mask;
+	sc->sc_usp = rdusp();
+	sc->sc_er0 = regs->er0;
+	sc->sc_er1 = regs->er1;
+	sc->sc_er2 = regs->er2;
+	sc->sc_er3 = regs->er3;
+	sc->sc_ccr = regs->ccr;
+	sc->sc_pc = regs->pc;
+}
+
+static inline int rt_setup_ucontext(struct ucontext *uc, struct pt_regs *regs)
+{
+	struct switch_stack *sw = (struct switch_stack *)regs - 1;
+	greg_t *gregs = uc->uc_mcontext.gregs;
+	int err = 0;
+
+	err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
+	err |= __put_user(regs->er0, &gregs[0]);
+	err |= __put_user(regs->er1, &gregs[1]);
+	err |= __put_user(regs->er2, &gregs[2]);
+	err |= __put_user(regs->er3, &gregs[3]);
+	err |= __put_user(sw->er4, &gregs[4]);
+	err |= __put_user(sw->er5, &gregs[5]);
+	err |= __put_user(sw->er6, &gregs[6]);
+	err |= __put_user(rdusp(), &gregs[7]);
+	err |= __put_user(regs->pc, &gregs[8]);
+	err |= __put_user(regs->ccr, &gregs[9]);
+	return err;
+}
+
+static inline void *
+get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
+{
+	unsigned long usp;
+
+	/* Default to using normal stack.  */
+	usp = rdusp();
+
+	/* This is the X/Open sanctioned signal stack switching.  */
+	if (ka->sa.sa_flags & SA_ONSTACK) {
+		if (!on_sig_stack(usp))
+			usp = current->sas_ss_sp + current->sas_ss_size;
+	}
+	return (void *)((usp - frame_size) & -8UL);
+}
+
+static void setup_frame (int sig, struct k_sigaction *ka,
+			 sigset_t *set, struct pt_regs *regs)
+{
+	struct sigframe *frame;
+	struct sigcontext context;
+	int err = 0;
+
+	frame = get_sigframe(ka, regs, sizeof(*frame));
+
+	err |= __put_user((current_thread_info()->exec_domain
+			   && current_thread_info()->exec_domain->signal_invmap
+			   && sig < 32
+			   ? current_thread_info()->exec_domain->signal_invmap[sig]
+			   : sig),
+			  &frame->sig);
+
+	err |= __put_user(&frame->sc, &frame->psc);
+
+	if (_NSIG_WORDS > 1)
+		err |= copy_to_user(frame->extramask, &set->sig[1],
+				    sizeof(frame->extramask));
+
+	setup_sigcontext(&context, regs, set->sig[0]);
+	err |= copy_to_user (&frame->sc, &context, sizeof(context));
+
+	/* Set up to return from userspace.  */
+	err |= __put_user(frame->retcode, &frame->pretcode);
+
+	/* sub.l er0,er0; mov.b #__NR_sigreturn,r0l; trapa #0 */
+	err != __put_user(0x1a80f800 + (__NR_sigreturn & 0xff),
+			(long *)(frame->retcode + 0));
+	err |= __put_user(0x5700, (short *)(frame->retcode + 4));
+
+
+	if (err)
+		goto give_sigsegv;
+
+	/* Set up registers for signal handler */
+	wrusp ((unsigned long) frame);
+	regs->pc = (unsigned long) ka->sa.sa_handler;
+
+	return;
+
+give_sigsegv:
+	if (sig == SIGSEGV)
+		ka->sa.sa_handler = SIG_DFL;
+	force_sig(SIGSEGV, current);
+}
+
+static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
+			    sigset_t *set, struct pt_regs *regs)
+{
+	struct rt_sigframe *frame;
+	int err = 0;
+
+	frame = get_sigframe(ka, regs, sizeof(*frame));
+
+	err |= __put_user((current_thread_info()->exec_domain
+			   && current_thread_info()->exec_domain->signal_invmap
+			   && sig < 32
+			   ? current_thread_info()->exec_domain->signal_invmap[sig]
+			   : sig),
+			  &frame->sig);
+	err |= __put_user(&frame->info, &frame->pinfo);
+	err |= __put_user(&frame->uc, &frame->puc);
+	err |= copy_siginfo_to_user(&frame->info, info);
+
+	/* Create the ucontext.  */
+	err |= __put_user(0, &frame->uc.uc_flags);
+	err |= __put_user(0, &frame->uc.uc_link);
+	err |= __put_user((void *)current->sas_ss_sp,
+			  &frame->uc.uc_stack.ss_sp);
+	err |= __put_user(sas_ss_flags(rdusp()),
+			  &frame->uc.uc_stack.ss_flags);
+	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+	err |= rt_setup_ucontext(&frame->uc, regs);
+	err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set));
+
+	/* Set up to return from userspace.  */
+	err |= __put_user(frame->retcode, &frame->pretcode);
+
+	/* moveq #,d0; notb d0; movea.l #,a5; trap #0 */
+	/* sub.l er0,er0; mov.b #__NR_rt_sigreturn,r0l; trapa #0 */
+	err != __put_user(0x1a80f800 + (__NR_rt_sigreturn & 0xff),
+			(long *)(frame->retcode + 0));
+	err |= __put_user(0x5700, (short *)(frame->retcode + 4));
+
+	if (err)
+		goto give_sigsegv;
+
+	/* Set up registers for signal handler */
+	wrusp ((unsigned long) frame);
+	regs->pc = (unsigned long) ka->sa.sa_handler;
+
+	return;
+
+give_sigsegv:
+	if (sig == SIGSEGV)
+		ka->sa.sa_handler = SIG_DFL;
+	force_sig(SIGSEGV, current);
+}
+
+static inline void
+handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
+{
+	switch (regs->er0) {
+	case -ERESTARTNOHAND:
+		if (!has_handler)
+			goto do_restart;
+		regs->er0 = -EINTR;
+		break;
+
+	case -ERESTARTSYS:
+		if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
+			regs->er0 = -EINTR;
+			break;
+		}
+	/* fallthrough */
+	case -ERESTARTNOINTR:
+	do_restart:
+		regs->er0 = regs->orig_er0;
+		regs->pc -= 2;
+		break;
+	}
+}
+
+/*
+ * OK, we're invoking a handler
+ */
+static void
+handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
+	      sigset_t *oldset, struct pt_regs *regs)
+{
+	/* are we from a system call? */
+	if (regs->orig_er0 >= 0)
+		/* If so, check system call restarting.. */
+		handle_restart(regs, ka, 1);
+
+	/* set up the stack frame */
+	if (ka->sa.sa_flags & SA_SIGINFO)
+		setup_rt_frame(sig, ka, info, oldset, regs);
+	else
+		setup_frame(sig, ka, oldset, regs);
+
+	if (ka->sa.sa_flags & SA_ONESHOT)
+		ka->sa.sa_handler = SIG_DFL;
+
+	if (!(ka->sa.sa_flags & SA_NODEFER)) {
+		spin_lock_irq(&current->sighand->siglock);
+		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+		sigaddset(&current->blocked,sig);
+		recalc_sigpending();
+		spin_unlock_irq(&current->sighand->siglock);
+	}
+}
+
+/*
+ * Note that 'init' is a special process: it doesn't get signals it doesn't
+ * want to handle. Thus you cannot kill init even with a SIGKILL even by
+ * mistake.
+ *
+ * Note that we go through the signals twice: once to check the signals
+ * that the kernel can handle, and then we build all the user-level signal
+ * handling stack-frames in one go after that.
+ */
+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
+{
+	siginfo_t info;
+	struct k_sigaction *ka;
+
+	current->thread.esp0 = (unsigned long) regs;
+
+	if (!oldset)
+		oldset = &current->blocked;
+
+	for (;;) {
+		int signr;
+
+		signr = get_signal_to_deliver(&info, regs, NULL);
+
+		if (!signr)
+			break;
+
+		if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
+			current->exit_code = signr;
+			current->state = TASK_STOPPED;
+
+			/* Did we come from a system call? */
+			if (regs->orig_er0 >= 0) {
+				/* Restart the system call the same way as
+				   if the process were not traced.  */
+				struct k_sigaction *ka =
+					&current->sighand->action[signr-1];
+				int has_handler =
+					(ka->sa.sa_handler != SIG_IGN &&
+					 ka->sa.sa_handler != SIG_DFL);
+				handle_restart(regs, ka, has_handler);
+			}
+			notify_parent(current, SIGCHLD);
+			schedule();
+
+			/* We're back.  Did the debugger cancel the sig?  */
+			if (!(signr = current->exit_code)) {
+			discard_frame:
+			    continue;
+			}
+			current->exit_code = 0;
+
+			/* The debugger continued.  Ignore SIGSTOP.  */
+			if (signr == SIGSTOP)
+				goto discard_frame;
+
+			/* Update the siginfo structure.  Is this good?  */
+			if (signr != info.si_signo) {
+				info.si_signo = signr;
+				info.si_errno = 0;
+				info.si_code = SI_USER;
+				info.si_pid = current->parent->pid;
+				info.si_uid = current->parent->uid;
+			}
+
+			/* If the (new) signal is now blocked, requeue it.  */
+			if (sigismember(&current->blocked, signr)) {
+				send_sig_info(signr, &info, current);
+				continue;
+			}
+		}
+
+		ka = &current->sighand->action[signr-1];
+		if (ka->sa.sa_handler == SIG_IGN) {
+			if (signr != SIGCHLD)
+				continue;
+			/* Check for SIGCHLD: it's special.  */
+			while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
+				/* nothing */;
+			continue;
+		}
+
+		if (ka->sa.sa_handler == SIG_DFL) {
+			int exit_code = signr;
+
+			if (current->pid == 1)
+				continue;
+
+			switch (signr) {
+			case SIGCONT: case SIGCHLD:
+			case SIGWINCH: case SIGURG:
+				continue;
+
+			case SIGTSTP: case SIGTTIN: case SIGTTOU:
+				if (is_orphaned_pgrp(current->pgrp))
+					continue;
+				/* FALLTHRU */
+
+			case SIGSTOP: {
+				struct sighand_struct *sig;
+				current->state = TASK_STOPPED;
+				current->exit_code = signr;
+                                sig = current->parent->sighand;
+                                if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags 
+& SA_NOCLDSTOP))
+                                        notify_parent(current, SIGCHLD);
+				schedule();
+				continue;
+			}
+
+			case SIGQUIT: case SIGILL: case SIGTRAP:
+			case SIGIOT: case SIGFPE: case SIGSEGV:
+			case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
+				if (do_coredump(signr, exit_code, regs))
+					exit_code |= 0x80;
+				/* FALLTHRU */
+
+			default:
+				sigaddset(&current->pending.signal, signr);
+				recalc_sigpending();
+				current->flags |= PF_SIGNALED;
+				do_exit(exit_code);
+				/* NOTREACHED */
+			}
+		}
+
+		/* Whee!  Actually deliver the signal.  */
+		handle_signal(signr, ka, &info, oldset, regs);
+		return 1;
+	}
+
+	/* Did we come from a system call? */
+	if (regs->orig_er0 >= 0)
+		/* Restart the system call - no handlers present */
+		handle_restart(regs, NULL, 0);
+
+	return 0;
+}
diff -Nru a/arch/h8300/kernel/sys_h8300.c b/arch/h8300/kernel/sys_h8300.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/sys_h8300.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,289 @@
+/*
+ * linux/arch/h8300/kernel/sys_h8300.c
+ *
+ * This file contains various random system calls that
+ * have a non-standard calling sequence on the H8/300
+ * platform.
+ */
+
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/sem.h>
+#include <linux/msg.h>
+#include <linux/shm.h>
+#include <linux/stat.h>
+#include <linux/mman.h>
+#include <linux/file.h>
+#include <linux/utsname.h>
+
+#include <asm/setup.h>
+#include <asm/uaccess.h>
+#include <asm/cachectl.h>
+#include <asm/traps.h>
+#include <asm/ipc.h>
+
+/*
+ * sys_pipe() is the normal C calling standard for creating
+ * a pipe. It's not the way unix traditionally does this, though.
+ */
+asmlinkage int sys_pipe(unsigned long * fildes)
+{
+	int fd[2];
+	int error;
+
+	error = do_pipe(fd);
+	if (!error) {
+		if (copy_to_user(fildes, fd, 2*sizeof(int)))
+			error = -EFAULT;
+	}
+	return error;
+}
+
+/* common code for old and new mmaps */
+static inline long do_mmap2(
+	unsigned long addr, unsigned long len,
+	unsigned long prot, unsigned long flags,
+	unsigned long fd, unsigned long pgoff)
+{
+	int error = -EBADF;
+	struct file * file = NULL;
+
+	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
+	if (!(flags & MAP_ANONYMOUS)) {
+		file = fget(fd);
+		if (!file)
+			goto out;
+	}
+
+	down_write(&current->mm->mmap_sem);
+	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
+	up_write(&current->mm->mmap_sem);
+
+	if (file)
+		fput(file);
+out:
+	return error;
+}
+
+asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
+	unsigned long prot, unsigned long flags,
+	unsigned long fd, unsigned long pgoff)
+{
+	return do_mmap2(addr, len, prot, flags, fd, pgoff);
+}
+
+/*
+ * Perform the select(nd, in, out, ex, tv) and mmap() system
+ * calls. Linux/m68k cloned Linux/i386, which didn't use to be able to
+ * handle more than 4 system call parameters, so these system calls
+ * used a memory block for parameter passing..
+ */
+
+struct mmap_arg_struct {
+	unsigned long addr;
+	unsigned long len;
+	unsigned long prot;
+	unsigned long flags;
+	unsigned long fd;
+	unsigned long offset;
+};
+
+asmlinkage int old_mmap(struct mmap_arg_struct *arg)
+{
+	struct mmap_arg_struct a;
+	int error = -EFAULT;
+
+	if (copy_from_user(&a, arg, sizeof(a)))
+		goto out;
+
+	error = -EINVAL;
+	if (a.offset & ~PAGE_MASK)
+		goto out;
+
+	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
+
+	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
+out:
+	return error;
+}
+
+#if 0 /* DAVIDM - do we want this */
+struct mmap_arg_struct64 {
+	__u32 addr;
+	__u32 len;
+	__u32 prot;
+	__u32 flags;
+	__u64 offset; /* 64 bits */
+	__u32 fd;
+};
+
+asmlinkage long sys_mmap64(struct mmap_arg_struct64 *arg)
+{
+	int error = -EFAULT;
+	struct file * file = NULL;
+	struct mmap_arg_struct64 a;
+	unsigned long pgoff;
+
+	if (copy_from_user(&a, arg, sizeof(a)))
+		return -EFAULT;
+
+	if ((long)a.offset & ~PAGE_MASK)
+		return -EINVAL;
+
+	pgoff = a.offset >> PAGE_SHIFT;
+	if ((a.offset >> PAGE_SHIFT) != pgoff)
+		return -EINVAL;
+
+	if (!(a.flags & MAP_ANONYMOUS)) {
+		error = -EBADF;
+		file = fget(a.fd);
+		if (!file)
+			goto out;
+	}
+	a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
+
+	down_write(&current->mm->mmap_sem);
+	error = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, pgoff);
+	up_write(&current->mm->mmap_sem);
+	if (file)
+		fput(file);
+out:
+	return error;
+}
+#endif
+
+extern asmlinkage int sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
+
+struct sel_arg_struct {
+	unsigned long n;
+	fd_set *inp, *outp, *exp;
+	struct timeval *tvp;
+};
+
+asmlinkage int old_select(struct sel_arg_struct *arg)
+{
+	struct sel_arg_struct a;
+
+	if (copy_from_user(&a, arg, sizeof(a)))
+		return -EFAULT;
+	/* sys_select() does the appropriate kernel locking */
+	return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp);
+}
+
+/*
+ * sys_ipc() is the de-multiplexer for the SysV IPC calls..
+ *
+ * This is really horribly ugly.
+ */
+asmlinkage int sys_ipc (uint call, int first, int second,
+			int third, void *ptr, long fifth)
+{
+	int version, ret;
+
+	version = call >> 16; /* hack for backward compatibility */
+	call &= 0xffff;
+
+	if (call <= SEMCTL)
+		switch (call) {
+		case SEMOP:
+			return sys_semop (first, (struct sembuf *)ptr, second);
+		case SEMGET:
+			return sys_semget (first, second, third);
+		case SEMCTL: {
+			union semun fourth;
+			if (!ptr)
+				return -EINVAL;
+			if (get_user(fourth.__pad, (void **) ptr))
+				return -EFAULT;
+			return sys_semctl (first, second, third, fourth);
+			}
+		default:
+			return -EINVAL;
+		}
+	if (call <= MSGCTL) 
+		switch (call) {
+		case MSGSND:
+			return sys_msgsnd (first, (struct msgbuf *) ptr, 
+					  second, third);
+		case MSGRCV:
+			switch (version) {
+			case 0: {
+				struct ipc_kludge tmp;
+				if (!ptr)
+					return -EINVAL;
+				if (copy_from_user (&tmp,
+						    (struct ipc_kludge *)ptr,
+						    sizeof (tmp)))
+					return -EFAULT;
+				return sys_msgrcv (first, tmp.msgp, second,
+						   tmp.msgtyp, third);
+				}
+			default:
+				return sys_msgrcv (first,
+						   (struct msgbuf *) ptr,
+						   second, fifth, third);
+			}
+		case MSGGET:
+			return sys_msgget ((key_t) first, second);
+		case MSGCTL:
+			return sys_msgctl (first, second,
+					   (struct msqid_ds *) ptr);
+		default:
+			return -EINVAL;
+		}
+	if (call <= SHMCTL) 
+		switch (call) {
+		case SHMAT:
+			switch (version) {
+			default: {
+				ulong raddr;
+				ret = sys_shmat (first, (char *) ptr,
+						 second, &raddr);
+				if (ret)
+					return ret;
+				return put_user (raddr, (ulong *) third);
+			}
+			}
+		case SHMDT: 
+			return sys_shmdt ((char *)ptr);
+		case SHMGET:
+			return sys_shmget (first, second, third);
+		case SHMCTL:
+			return sys_shmctl (first, second,
+					   (struct shmid_ds *) ptr);
+		default:
+			return -EINVAL;
+		}
+
+	return -EINVAL;
+}
+
+asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on)
+{
+  return -ENOSYS;
+}
+
+/* sys_cacheflush -- no support.  */
+asmlinkage int
+sys_cacheflush (unsigned long addr, int scope, int cache, unsigned long len)
+{
+	return -EINVAL;
+}
+
+asmlinkage int sys_getpagesize(void)
+{
+	return PAGE_SIZE;
+}
+
+#if defined(CONFIG_SYSCALL_PRINT)
+asmlinkage void syscall_print(void *dummy,...)
+{
+	struct pt_regs *regs = (struct pt_regs *) ((unsigned char *)&dummy);
+	unsigned long *usp=rdusp()+8;
+	printk("call %06x:%d 1:%08x,2:%08x,3:%08x,ret:%08x\n",
+               ((*usp) & 0xffffff)-2,regs->orig_er0,regs->er1,regs->er2,regs->er3,regs->er0);
+}
+#endif
diff -Nru a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/syscalls.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,314 @@
+/* Systemcall Entry Table */
+#include <linux/config.h>
+#include <linux/sys.h>
+#include <asm/linkage.h>
+#include <asm/unistd.h>
+	
+.globl SYMBOL_NAME(sys_call_table)
+
+#if defined(CONFIG_CPU_H8300H)
+	.h8300h
+#endif
+#if defined(CONFIG_CPU_H8S)
+	.h8300s
+#endif
+	.section .text
+	.align	2
+SYMBOL_NAME_LABEL(sys_call_table)	
+	.long SYMBOL_NAME(sys_ni_syscall)	/* 0  -  old "setup()" system call*/
+	.long SYMBOL_NAME(sys_exit)
+	.long SYMBOL_NAME(sys_fork)
+	.long SYMBOL_NAME(sys_read)
+	.long SYMBOL_NAME(sys_write)
+	.long SYMBOL_NAME(sys_open)		/* 5 */
+	.long SYMBOL_NAME(sys_close)
+	.long SYMBOL_NAME(sys_waitpid)
+	.long SYMBOL_NAME(sys_creat)
+	.long SYMBOL_NAME(sys_link)
+	.long SYMBOL_NAME(sys_unlink)		/* 10 */
+	.long SYMBOL_NAME(sys_execve)
+	.long SYMBOL_NAME(sys_chdir)
+	.long SYMBOL_NAME(sys_time)
+	.long SYMBOL_NAME(sys_mknod)
+	.long SYMBOL_NAME(sys_chmod)		/* 15 */
+	.long SYMBOL_NAME(sys_chown16)
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old break syscall holder */
+	.long SYMBOL_NAME(sys_stat)
+	.long SYMBOL_NAME(sys_lseek)
+	.long SYMBOL_NAME(sys_getpid)		/* 20 */
+	.long SYMBOL_NAME(sys_mount)
+	.long SYMBOL_NAME(sys_oldumount)
+	.long SYMBOL_NAME(sys_setuid16)
+	.long SYMBOL_NAME(sys_getuid16)
+	.long SYMBOL_NAME(sys_stime)		/* 25 */
+	.long SYMBOL_NAME(sys_ptrace)
+	.long SYMBOL_NAME(sys_alarm)
+	.long SYMBOL_NAME(sys_fstat)
+	.long SYMBOL_NAME(sys_pause)
+	.long SYMBOL_NAME(sys_utime)		/* 30 */
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old stty syscall holder */
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old gtty syscall holder */
+	.long SYMBOL_NAME(sys_access)
+	.long SYMBOL_NAME(sys_nice)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* 35 */		/* old ftime syscall holder */
+	.long SYMBOL_NAME(sys_sync)
+	.long SYMBOL_NAME(sys_kill)
+	.long SYMBOL_NAME(sys_rename)
+	.long SYMBOL_NAME(sys_mkdir)
+	.long SYMBOL_NAME(sys_rmdir)		/* 40 */
+	.long SYMBOL_NAME(sys_dup)
+	.long SYMBOL_NAME(sys_pipe)
+	.long SYMBOL_NAME(sys_times)
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old prof syscall holder */
+	.long SYMBOL_NAME(sys_brk)		/* 45 */
+	.long SYMBOL_NAME(sys_setgid16)
+	.long SYMBOL_NAME(sys_getgid16)
+	.long SYMBOL_NAME(sys_signal)
+	.long SYMBOL_NAME(sys_geteuid16)
+	.long SYMBOL_NAME(sys_getegid16)	/* 50 */
+	.long SYMBOL_NAME(sys_acct)
+	.long SYMBOL_NAME(sys_umount)					/* recycled never used phys() */
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old lock syscall holder */
+	.long SYMBOL_NAME(sys_ioctl)
+	.long SYMBOL_NAME(sys_fcntl)		/* 55 */
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old mpx syscall holder */
+	.long SYMBOL_NAME(sys_setpgid)
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old ulimit syscall holder */
+	.long SYMBOL_NAME(sys_ni_syscall)
+	.long SYMBOL_NAME(sys_umask)		/* 60 */
+	.long SYMBOL_NAME(sys_chroot)
+	.long SYMBOL_NAME(sys_ustat)
+	.long SYMBOL_NAME(sys_dup2)
+	.long SYMBOL_NAME(sys_getppid)
+	.long SYMBOL_NAME(sys_getpgrp)		/* 65 */
+	.long SYMBOL_NAME(sys_setsid)
+	.long SYMBOL_NAME(sys_sigaction)
+	.long SYMBOL_NAME(sys_sgetmask)
+	.long SYMBOL_NAME(sys_ssetmask)
+	.long SYMBOL_NAME(sys_setreuid16)	/* 70 */
+	.long SYMBOL_NAME(sys_setregid16)
+	.long SYMBOL_NAME(sys_sigsuspend)
+	.long SYMBOL_NAME(sys_sigpending)
+	.long SYMBOL_NAME(sys_sethostname)
+	.long SYMBOL_NAME(sys_setrlimit)	/* 75 */
+	.long SYMBOL_NAME(sys_old_getrlimit)
+	.long SYMBOL_NAME(sys_getrusage)
+	.long SYMBOL_NAME(sys_gettimeofday)
+	.long SYMBOL_NAME(sys_settimeofday)
+	.long SYMBOL_NAME(sys_getgroups16)	/* 80 */
+	.long SYMBOL_NAME(sys_setgroups16)
+	.long SYMBOL_NAME(old_select)
+	.long SYMBOL_NAME(sys_symlink)
+	.long SYMBOL_NAME(sys_lstat)
+	.long SYMBOL_NAME(sys_readlink)		/* 85 */
+	.long SYMBOL_NAME(sys_uselib)
+	.long SYMBOL_NAME(sys_swapon)
+	.long SYMBOL_NAME(sys_reboot)
+	.long SYMBOL_NAME(old_readdir)
+	.long SYMBOL_NAME(old_mmap)		/* 90 */
+	.long SYMBOL_NAME(sys_munmap)
+	.long SYMBOL_NAME(sys_truncate)
+	.long SYMBOL_NAME(sys_ftruncate)
+	.long SYMBOL_NAME(sys_fchmod)
+	.long SYMBOL_NAME(sys_fchown16)		/* 95 */
+	.long SYMBOL_NAME(sys_getpriority)
+	.long SYMBOL_NAME(sys_setpriority)
+	.long SYMBOL_NAME(sys_ni_syscall)				/* old profil syscall holder */
+	.long SYMBOL_NAME(sys_statfs)
+	.long SYMBOL_NAME(sys_fstatfs)		/* 100 */
+	.long SYMBOL_NAME(sys_ioperm)
+	.long SYMBOL_NAME(sys_socketcall)
+	.long SYMBOL_NAME(sys_syslog)
+	.long SYMBOL_NAME(sys_setitimer)
+	.long SYMBOL_NAME(sys_getitimer)	/* 105 */
+	.long SYMBOL_NAME(sys_newstat)
+	.long SYMBOL_NAME(sys_newlstat)
+	.long SYMBOL_NAME(sys_newfstat)
+	.long SYMBOL_NAME(sys_ni_syscall)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* iopl for i386 */ /* 110 */
+	.long SYMBOL_NAME(sys_vhangup)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* obsolete idle() syscall */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* vm86old for i386 */
+	.long SYMBOL_NAME(sys_wait4)
+	.long SYMBOL_NAME(sys_swapoff)		/* 115 */
+	.long SYMBOL_NAME(sys_sysinfo)
+	.long SYMBOL_NAME(sys_ipc)
+	.long SYMBOL_NAME(sys_fsync)
+	.long SYMBOL_NAME(sys_sigreturn)
+	.long SYMBOL_NAME(sys_clone)		/* 120 */
+	.long SYMBOL_NAME(sys_setdomainname)
+	.long SYMBOL_NAME(sys_newuname)
+	.long SYMBOL_NAME(sys_cacheflush)	/* modify_ldt for i386 */
+	.long SYMBOL_NAME(sys_adjtimex)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* 125 sys_mprotect */
+	.long SYMBOL_NAME(sys_sigprocmask)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_create_module */
+	.long SYMBOL_NAME(sys_init_module)
+	.long SYMBOL_NAME(sys_delete_module)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* 130 sys_get_kernel_syms */
+	.long SYMBOL_NAME(sys_quotactl)
+	.long SYMBOL_NAME(sys_getpgid)
+	.long SYMBOL_NAME(sys_fchdir)
+	.long SYMBOL_NAME(sys_bdflush)
+	.long SYMBOL_NAME(sys_sysfs)		/* 135 */
+	.long SYMBOL_NAME(sys_personality)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* for afs_syscall */
+	.long SYMBOL_NAME(sys_setfsuid16)
+	.long SYMBOL_NAME(sys_setfsgid16)
+	.long SYMBOL_NAME(sys_llseek)		/* 140 */
+	.long SYMBOL_NAME(sys_getdents)
+	.long SYMBOL_NAME(sys_select)
+	.long SYMBOL_NAME(sys_flock)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_msync */
+	.long SYMBOL_NAME(sys_readv)		/* 145 */
+	.long SYMBOL_NAME(sys_writev)
+	.long SYMBOL_NAME(sys_getsid)
+	.long SYMBOL_NAME(sys_fdatasync)
+	.long SYMBOL_NAME(sys_sysctl)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* 150 sys_mlock */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_munlock */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_mlockall */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_munlockall */
+	.long SYMBOL_NAME(sys_sched_setparam)
+	.long SYMBOL_NAME(sys_sched_getparam)   /* 155 */
+	.long SYMBOL_NAME(sys_sched_setscheduler)
+	.long SYMBOL_NAME(sys_sched_getscheduler)
+	.long SYMBOL_NAME(sys_sched_yield)
+	.long SYMBOL_NAME(sys_sched_get_priority_max)
+	.long SYMBOL_NAME(sys_sched_get_priority_min)  /* 160 */
+	.long SYMBOL_NAME(sys_sched_rr_get_interval)
+	.long SYMBOL_NAME(sys_nanosleep)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_mremap */
+	.long SYMBOL_NAME(sys_setresuid16)
+	.long SYMBOL_NAME(sys_getresuid16)	/* 165 */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* for vm86 */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_query_module */
+	.long SYMBOL_NAME(sys_poll)
+	.long SYMBOL_NAME(sys_nfsservctl)
+	.long SYMBOL_NAME(sys_setresgid16)	/* 170 */
+	.long SYMBOL_NAME(sys_getresgid16)
+	.long SYMBOL_NAME(sys_prctl)
+	.long SYMBOL_NAME(sys_rt_sigreturn)
+	.long SYMBOL_NAME(sys_rt_sigaction)
+	.long SYMBOL_NAME(sys_rt_sigprocmask)	/* 175 */
+	.long SYMBOL_NAME(sys_rt_sigpending)
+	.long SYMBOL_NAME(sys_rt_sigtimedwait)
+	.long SYMBOL_NAME(sys_rt_sigqueueinfo)
+	.long SYMBOL_NAME(sys_rt_sigsuspend)
+	.long SYMBOL_NAME(sys_pread64)		/* 180 */
+	.long SYMBOL_NAME(sys_pwrite64)
+	.long SYMBOL_NAME(sys_lchown16);
+	.long SYMBOL_NAME(sys_getcwd)
+	.long SYMBOL_NAME(sys_capget)
+	.long SYMBOL_NAME(sys_capset)           /* 185 */
+	.long SYMBOL_NAME(sys_sigaltstack)
+	.long SYMBOL_NAME(sys_sendfile)
+	.long SYMBOL_NAME(sys_ni_syscall)		/* streams1 */
+	.long SYMBOL_NAME(sys_ni_syscall)		/* streams2 */
+	.long SYMBOL_NAME(sys_vfork)            /* 190 */
+	.long SYMBOL_NAME(sys_getrlimit)
+	.long SYMBOL_NAME(sys_mmap2)
+	.long SYMBOL_NAME(sys_truncate64)
+	.long SYMBOL_NAME(sys_ftruncate64)
+	.long SYMBOL_NAME(sys_stat64)		/* 195 */
+	.long SYMBOL_NAME(sys_lstat64)
+	.long SYMBOL_NAME(sys_fstat64)
+	.long SYMBOL_NAME(sys_chown)
+	.long SYMBOL_NAME(sys_getuid)
+	.long SYMBOL_NAME(sys_getgid)		/* 200 */
+	.long SYMBOL_NAME(sys_geteuid)
+	.long SYMBOL_NAME(sys_getegid)
+	.long SYMBOL_NAME(sys_setreuid)
+	.long SYMBOL_NAME(sys_setregid)
+	.long SYMBOL_NAME(sys_getgroups)	/* 205 */
+	.long SYMBOL_NAME(sys_setgroups)
+	.long SYMBOL_NAME(sys_fchown)
+	.long SYMBOL_NAME(sys_setresuid)
+	.long SYMBOL_NAME(sys_getresuid)
+	.long SYMBOL_NAME(sys_setresgid)	/* 210 */
+	.long SYMBOL_NAME(sys_getresgid)
+	.long SYMBOL_NAME(sys_lchown)
+	.long SYMBOL_NAME(sys_setuid)
+	.long SYMBOL_NAME(sys_setgid)
+	.long SYMBOL_NAME(sys_setfsuid)		/* 215 */
+	.long SYMBOL_NAME(sys_setfsgid)
+	.long SYMBOL_NAME(sys_pivot_root)
+	.long SYMBOL_NAME(sys_ni_syscall)
+	.long SYMBOL_NAME(sys_ni_syscall)
+	.long SYMBOL_NAME(sys_getdents64)	/* 220 */
+	.long SYMBOL_NAME(sys_fcntl64)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* reserved for TUX */
+	.long SYMBOL_NAME(sys_ni_syscall)
+	.long SYMBOL_NAME(sys_gettid)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* 225 */ /* sys_readahead */
+	.long SYMBOL_NAME(sys_setxattr)
+	.long SYMBOL_NAME(sys_lsetxattr)
+	.long SYMBOL_NAME(sys_fsetxattr)
+	.long SYMBOL_NAME(sys_getxattr)
+	.long SYMBOL_NAME(sys_lgetxattr)	/* 230 */
+	.long SYMBOL_NAME(sys_fgetxattr)
+	.long SYMBOL_NAME(sys_listxattr)
+	.long SYMBOL_NAME(sys_llistxattr)
+	.long SYMBOL_NAME(sys_flistxattr)
+	.long SYMBOL_NAME(sys_removexattr)	/* 235 */
+	.long SYMBOL_NAME(sys_lremovexattr)
+	.long SYMBOL_NAME(sys_fremovexattr)
+	.long SYMBOL_NAME(sys_tkill)
+	.long SYMBOL_NAME(sys_sendfile64)
+	.long SYMBOL_NAME(sys_futex)		/* 240 */
+	.long SYMBOL_NAME(sys_sched_setaffinity)
+	.long SYMBOL_NAME(sys_sched_getaffinity)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_set_thread_area */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_get_thread_area */
+	.long SYMBOL_NAME(sys_io_setup)		/* 245 */
+	.long SYMBOL_NAME(sys_io_destroy)
+	.long SYMBOL_NAME(sys_io_getevents)
+	.long SYMBOL_NAME(sys_io_submit)
+	.long SYMBOL_NAME(sys_io_cancel)
+	.long SYMBOL_NAME(sys_ni_syscall)	/* 250 */ /* sys_alloc_hugepages */
+	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_freec_hugepages */
+	.long SYMBOL_NAME(sys_exit_group)
+	.long SYMBOL_NAME(sys_lookup_dcookie)
+	.long SYMBOL_NAME(sys_epoll_create)
+	.long SYMBOL_NAME(sys_epoll_ctl)	/* 255 */
+	.long SYMBOL_NAME(sys_epoll_wait)
+ 	.long SYMBOL_NAME(sys_ni_syscall)	/* sys_remap_file_pages */
+ 	.long SYMBOL_NAME(sys_set_tid_address)
+ 	.long SYMBOL_NAME(sys_timer_create)
+ 	.long SYMBOL_NAME(sys_timer_settime)		/* 260 */
+ 	.long SYMBOL_NAME(sys_timer_gettime)
+ 	.long SYMBOL_NAME(sys_timer_getoverrun)
+ 	.long SYMBOL_NAME(sys_timer_delete)
+ 	.long SYMBOL_NAME(sys_clock_settime)
+ 	.long SYMBOL_NAME(sys_clock_gettime)		/* 265 */
+ 	.long SYMBOL_NAME(sys_clock_getres)
+ 	.long SYMBOL_NAME(sys_clock_nanosleep)
+
+	.rept NR_syscalls-(.-SYMBOL_NAME(sys_call_table))/4
+		.long SYMBOL_NAME(sys_ni_syscall)
+	.endr
+
+SYMBOL_NAME_LABEL(sys_clone)	
+	mov.l	#SYMBOL_NAME(h8300_clone),er0
+	jmp	@SYMBOL_NAME(syscall_trampoline)
+	
+SYMBOL_NAME_LABEL(sys_sigsuspend)
+	mov.l	#SYMBOL_NAME(do_sigsuspend),er0
+	jmp	@SYMBOL_NAME(syscall_trampoline)
+
+SYMBOL_NAME_LABEL(sys_rt_sigsuspend)
+	mov.l	#SYMBOL_NAME(do_rt_sigsuspend),er0
+	jmp	@SYMBOL_NAME(syscall_trampoline)
+
+SYMBOL_NAME_LABEL(sys_sigreturn)
+	mov.l	#SYMBOL_NAME(do_sigreturn),er0
+	jmp	@SYMBOL_NAME(syscall_trampoline)
+
+SYMBOL_NAME_LABEL(sys_rt_sigreturn)
+	mov.l	#SYMBOL_NAME(do_rt_sigreturn),er0
+	jmp	@SYMBOL_NAME(syscall_trampoline)
+
+SYMBOL_NAME_LABEL(sys_fork)
+	mov.l	#SYMBOL_NAME(h8300_fork),er0
+	jmp	@SYMBOL_NAME(syscall_trampoline)
+
diff -Nru a/arch/h8300/kernel/time.c b/arch/h8300/kernel/time.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/time.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,134 @@
+/*
+ *  linux/arch/h8300/kernel/time.c
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Copied/hacked from:
+ *
+ *  linux/arch/m68k/kernel/time.c
+ *
+ *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
+ *
+ * This file contains the m68k-specific time handling details.
+ * Most of the stuff is located in the machine specific files.
+ *
+ * 1997-09-10	Updated NTP code according to technical memorandum Jan '96
+ *		"A Kernel Model for Precision Timekeeping" by Dave Mills
+ */
+
+#include <linux/config.h> /* CONFIG_HEARTBEAT */
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/timex.h>
+#include <linux/profile.h>
+
+#include <asm/io.h>
+#include <asm/target_time.h>
+
+#define	TICK_SIZE (tick_nsec / 1000)
+
+u64 jiffies_64;
+
+static inline void do_profile (unsigned long pc)
+{
+	if (prof_buffer && current->pid) {
+		extern int _stext;
+		pc -= (unsigned long) &_stext;
+		pc >>= prof_shift;
+		if (pc < prof_len)
+			++prof_buffer[pc];
+		else
+		/*
+		 * Don't ignore out-of-bounds PC values silently,
+		 * put them into the last histogram slot, so if
+		 * present, they will show up as a sharp peak.
+		 */
+			++prof_buffer[prof_len-1];
+	}
+}
+
+/*
+ * timer_interrupt() needs to keep up the real-time clock,
+ * as well as call the "do_timer()" routine every clocktick
+ */
+static void timer_interrupt(int irq, void *dummy, struct pt_regs * regs)
+{
+	/* may need to kick the hardware timer */
+	platform_timer_eoi();
+
+	do_timer(regs);
+
+	if (!user_mode(regs))
+		do_profile(regs->pc);
+
+}
+
+void time_init(void)
+{
+	unsigned int year, mon, day, hour, min, sec;
+
+	/* FIX by dqg : Set to zero for platforms that don't have tod */
+	/* without this time is undefined and can overflow time_t, causing  */
+	/* very stange errors */
+	year = 1980;
+	mon = day = 1;
+	hour = min = sec = 0;
+	platform_gettod (&year, &mon, &day, &hour, &min, &sec);
+
+	if ((year += 1900) < 1970)
+		year += 100;
+	xtime.tv_sec = mktime(year, mon, day, hour, min, sec);
+	xtime.tv_nsec = 0;
+
+	platform_timer_setup(timer_interrupt);
+}
+
+/*
+ * This version of gettimeofday has near microsecond resolution.
+ */
+void do_gettimeofday(struct timeval *tv)
+{
+	unsigned long flags;
+	unsigned long usec, sec;
+
+	read_lock_irqsave(&xtime_lock, flags);
+	usec = 0;
+	sec = xtime.tv_sec;
+	usec += (xtime.tv_nsec / 1000);
+	read_unlock_irqrestore(&xtime_lock, flags);
+
+	while (usec >= 1000000) {
+		usec -= 1000000;
+		sec++;
+	}
+
+	tv->tv_sec = sec;
+	tv->tv_usec = usec;
+}
+
+void do_settimeofday(struct timeval *tv)
+{
+	write_lock_irq(&xtime_lock);
+	/* This is revolting. We need to set the xtime.tv_usec
+	 * correctly. However, the value in this location is
+	 * is value at the last tick.
+	 * Discover what correction gettimeofday
+	 * would have done, and then undo it!
+	 */
+	while (tv->tv_usec < 0) {
+		tv->tv_usec += 1000000;
+		tv->tv_sec--;
+	}
+
+	xtime.tv_sec = tv->tv_sec;
+	xtime.tv_nsec = (tv->tv_usec * 1000);
+	time_adjust = 0;		/* stop active adjtime() */
+	time_status |= STA_UNSYNC;
+	time_maxerror = NTP_PHASE_LIMIT;
+	time_esterror = NTP_PHASE_LIMIT;
+	write_unlock_irq(&xtime_lock);
+}
diff -Nru a/arch/h8300/kernel/traps.c b/arch/h8300/kernel/traps.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/kernel/traps.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,124 @@
+/*
+ * linux/arch/h8300/boot/traps.c -- general exception handling code
+ * H8/300 support Yoshinori Sato <ysato@users.sourceforge.jp>
+ * 
+ * Cloned from Linux/m68k.
+ *
+ * No original Copyright holder listed,
+ * Probabily original (C) Roman Zippel (assigned DJD, 1999)
+ *
+ * Copyright 1999-2000 D. Jeff Dionne, <jeff@rt-control.com>
+ *
+ * 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.
+ */
+
+#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/kernel_stat.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/traps.h>
+#include <asm/page.h>
+#include <asm/gpio.h>
+
+/*
+ * this must be called very early as the kernel might
+ * use some instruction that are emulated on the 060
+ */
+
+void __init base_trap_init(void)
+{
+}
+
+void __init trap_init (void)
+{
+}
+
+asmlinkage void set_esp0 (unsigned long ssp)
+{
+  current->thread.esp0 = ssp;
+}
+
+/*
+ *	Generic dumping code. Used for panic and debug.
+ */
+
+static void dump(struct pt_regs *fp)
+{
+	unsigned long	*sp;
+	unsigned char	*tp;
+	int		i;
+
+	printk("\nCURRENT PROCESS:\n\n");
+#if 0
+{
+	extern int	swt_lastjiffies, swt_reference;
+	printk("WATCHDOG: jiffies=%d lastjiffies=%d [%d] reference=%d\n",
+		jiffies, swt_lastjiffies, (swt_lastjiffies - jiffies),
+		swt_reference);
+}
+#endif
+	printk("COMM=%s PID=%d\n", current->comm, current->pid);
+	if (current->mm) {
+		printk("TEXT=%08x-%08x DATA=%08x-%08x BSS=%08x-%08x\n",
+			(int) current->mm->start_code,
+			(int) current->mm->end_code,
+			(int) current->mm->start_data,
+			(int) current->mm->end_data,
+			(int) current->mm->end_data,
+			(int) current->mm->brk);
+		printk("USER-STACK=%08x  KERNEL-STACK=%08x\n\n",
+			(int) current->mm->start_stack,
+			(int) PAGE_SIZE+(unsigned long)current);
+	}
+
+	printk("PC: %08lx\n", (long)fp->pc);
+	printk("CCR: %08lx   SP: %08lx\n", fp->ccr, (long) fp);
+	printk("ER0: %08lx  ER1: %08lx   ER2: %08lx   ER3: %08lx\n",
+		fp->er0, fp->er1, fp->er2, fp->er3);
+	printk("\nCODE:");
+	tp = ((unsigned char *) fp->pc) - 0x20;
+	for (sp = (unsigned long *) tp, i = 0; (i < 0x40);  i += 4) {
+		if ((i % 0x10) == 0)
+			printk("\n%08x: ", (int) (tp + i));
+		printk("%08x ", (int) *sp++);
+	}
+	printk("\n");
+
+	printk("\nKERNEL STACK:");
+	tp = ((unsigned char *) fp) - 0x40;
+	for (sp = (unsigned long *) tp, i = 0; (i < 0xc0); i += 4) {
+		if ((i % 0x10) == 0)
+			printk("\n%08x: ", (int) (tp + i));
+		printk("%08x ", (int) *sp++);
+	}
+	printk("\n");
+	if (STACK_MAGIC != *(unsigned long *)((unsigned long)current+PAGE_SIZE))
+                printk("(Possibly corrupted stack page??)\n");
+
+	printk("\n\n");
+}
+
+void show_trace_task(struct task_struct *tsk)
+{
+	/* DAVIDM: we can do better, need a proper stack dump */
+	printk("STACK ksp=0x%lx, usp=0x%lx\n", tsk->thread.ksp, tsk->thread.usp);
+}
+
+void die_if_kernel (char *str, struct pt_regs *fp, int nr)
+{
+	extern int console_loglevel;
+
+	if (!(fp->ccr & PS_S))
+		return;
+
+	console_loglevel = 15;
+	dump(fp);
+
+	do_exit(SIGSEGV);
+}
diff -Nru a/arch/h8300/lib/Makefile b/arch/h8300/lib/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/lib/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,9 @@
+#
+# Makefile for H8/300-specific library files..
+#
+
+.S.o:
+	$(CC) $(AFLAGS) -D__ASSEMBLY__ -c $< -o $@
+
+L_TARGET = lib.a
+obj-y  = ashrdi3.o checksum.o memcpy.o memset.o abs.o
diff -Nru a/arch/h8300/lib/abs.S b/arch/h8300/lib/abs.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/lib/abs.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,21 @@
+;;; memcpy.S
+
+#include <asm/linkage.h>
+
+#if defined(__H8300H__) 
+	.h8300h
+#endif
+#if defined(__H8300S__) 
+	.h8300s
+#endif
+	.text
+.global SYMBOL_NAME(abs)
+
+;;; int abs(int n)
+SYMBOL_NAME_LABEL(abs)
+	mov.l	er0,er0
+	bpl	1f
+	neg.l	er0
+1:
+	rts
+	
diff -Nru a/arch/h8300/lib/ashrdi3.c b/arch/h8300/lib/ashrdi3.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/lib/ashrdi3.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,63 @@
+/* ashrdi3.c extracted from gcc-2.7.2/libgcc2.c which is: */
+/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC 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 GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+#define BITS_PER_UNIT 8
+
+typedef 	 int SItype	__attribute__ ((mode (SI)));
+typedef unsigned int USItype	__attribute__ ((mode (SI)));
+typedef		 int DItype	__attribute__ ((mode (DI)));
+typedef int word_type __attribute__ ((mode (__word__)));
+
+struct DIstruct {SItype high, low;};
+
+typedef union
+{
+  struct DIstruct s;
+  DItype ll;
+} DIunion;
+
+DItype
+__ashrdi3 (DItype u, word_type b)
+{
+  DIunion w;
+  word_type bm;
+  DIunion uu;
+
+  if (b == 0)
+    return u;
+
+  uu.ll = u;
+
+  bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
+  if (bm <= 0)
+    {
+      /* w.s.high = 1..1 or 0..0 */
+      w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
+      w.s.low = uu.s.high >> -bm;
+    }
+  else
+    {
+      USItype carries = (USItype)uu.s.high << bm;
+      w.s.high = uu.s.high >> b;
+      w.s.low = ((USItype)uu.s.low >> b) | carries;
+    }
+
+  return w.ll;
+}
diff -Nru a/arch/h8300/lib/checksum.c b/arch/h8300/lib/checksum.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/lib/checksum.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,156 @@
+/*
+ * INET		An implementation of the TCP/IP protocol suite for the LINUX
+ *		operating system.  INET is implemented using the  BSD Socket
+ *		interface as the means of communication with the user level.
+ *
+ *		IP/TCP/UDP checksumming routines
+ *
+ * Authors:	Jorge Cwik, <jorge@laser.satlink.net>
+ *		Arnt Gulbrandsen, <agulbra@nvg.unit.no>
+ *		Tom May, <ftom@netcom.com>
+ *		Andreas Schwab, <schwab@issan.informatik.uni-dortmund.de>
+ *		Lots of code moved from tcp.c and ip.c; see those files
+ *		for more names.
+ *
+ * 03/02/96	Jes Sorensen, Andreas Schwab, Roman Hodek:
+ *		Fixed some nasty bugs, causing some horrible crashes.
+ *		A: At some points, the sum (%0) was used as
+ *		length-counter instead of the length counter
+ *		(%1). Thanks to Roman Hodek for pointing this out.
+ *		B: GCC seems to mess up if one uses too many
+ *		data-registers to hold input values and one tries to
+ *		specify d0 and d1 as scratch registers. Letting gcc choose these
+ *      registers itself solves the problem.
+ *
+ *		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.
+ */
+ 
+/* Revised by Kenneth Albanowski for m68knommu. Basic problem: unaligned access kills, so most
+   of the assembly has to go. */
+
+#include <net/checksum.h>
+
+static inline unsigned short from32to16(unsigned long x)
+{
+	/* add up 16-bit and 16-bit for 16+c bit */
+	x = (x & 0xffff) + (x >> 16);
+	/* add up carry.. */
+	x = (x & 0xffff) + (x >> 16);
+	return x;
+}
+
+static unsigned long do_csum(const unsigned char * buff, int len)
+{
+	int odd, count;
+	unsigned long result = 0;
+
+	if (len <= 0)
+		goto out;
+	odd = 1 & (unsigned long) buff;
+	if (odd) {
+		result = *buff;
+		len--;
+		buff++;
+	}
+	count = len >> 1;		/* nr of 16-bit words.. */
+	if (count) {
+		if (2 & (unsigned long) buff) {
+			result += *(unsigned short *) buff;
+			count--;
+			len -= 2;
+			buff += 2;
+		}
+		count >>= 1;		/* nr of 32-bit words.. */
+		if (count) {
+		        unsigned long carry = 0;
+			do {
+				unsigned long w = *(unsigned long *) buff;
+				count--;
+				buff += 4;
+				result += carry;
+				result += w;
+				carry = (w > result);
+			} while (count);
+			result += carry;
+			result = (result & 0xffff) + (result >> 16);
+		}
+		if (len & 2) {
+			result += *(unsigned short *) buff;
+			buff += 2;
+		}
+	}
+	if (len & 1)
+		result += (*buff << 8);
+	result = from32to16(result);
+	if (odd)
+		result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
+out:
+	return result;
+}
+
+/*
+ *	This is a version of ip_compute_csum() optimized for IP headers,
+ *	which always checksum on 4 octet boundaries.
+ */
+unsigned short ip_fast_csum(unsigned char * iph, unsigned int ihl)
+{
+	return ~do_csum(iph,ihl*4);
+}
+
+/*
+ * computes the checksum of a memory block at buff, length len,
+ * and adds in "sum" (32-bit)
+ *
+ * returns a 32-bit number suitable for feeding into itself
+ * or csum_tcpudp_magic
+ *
+ * this function must be called with even lengths, except
+ * for the last fragment, which may be odd
+ *
+ * it's best to have buff aligned on a 32-bit boundary
+ */
+unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum)
+{
+	unsigned int result = do_csum(buff, len);
+
+	/* add in old sum, and carry.. */
+	result += sum;
+	/* 16+c bits -> 16 bits */
+	result = (result & 0xffff) + (result >> 16);
+	return result;
+}
+
+/*
+ * this routine is used for miscellaneous IP-like checksums, mainly
+ * in icmp.c
+ */
+unsigned short ip_compute_csum(const unsigned char * buff, int len)
+{
+	return ~do_csum(buff,len);
+}
+
+/*
+ * copy from fs while checksumming, otherwise like csum_partial
+ */
+
+unsigned int
+csum_partial_copy_from_user(const char *src, char *dst, int len, int sum, int *csum_err)
+{
+	if (csum_err) *csum_err = 0;
+	memcpy(dst, src, len);
+	return csum_partial(dst, len, sum);
+}
+
+/*
+ * copy from ds while checksumming, otherwise like csum_partial
+ */
+
+unsigned int
+csum_partial_copy(const char *src, char *dst, int len, int sum)
+{
+	memcpy(dst, src, len);
+	return csum_partial(dst, len, sum);
+}
diff -Nru a/arch/h8300/lib/memcpy.S b/arch/h8300/lib/memcpy.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/lib/memcpy.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,84 @@
+;;; memcpy.S
+
+#include <asm/linkage.h>
+
+#if defined(__H8300H__) 
+	.h8300h
+#endif
+#if defined(__H8300S__) 
+	.h8300s
+#endif
+
+	.text
+.global SYMBOL_NAME(memcpy)
+
+;;; void *memcpy(void *to, void *from, size_t n)
+SYMBOL_NAME_LABEL(memcpy)
+	mov.l	er2,er2
+	bne	1f
+	rts	
+1:	
+	;; address check
+	bld	#0,r0l
+	bxor	#0,r1l
+	bcs	4f
+	mov.l	er4,@-sp
+	mov.l	er0,@-sp
+	btst	#0,r0l
+	beq	1f
+	;; (aligned even) odd address
+	mov.b	@er1,r3l
+	mov.b	r3l,@er0
+	adds	#1,er1
+	adds	#1,er0
+	dec.l	#1,er2
+	beq	3f
+1:	
+	;; n < sizeof(unsigned long) check
+	sub.l	er4,er4
+	adds	#4,er4		; loop count check value
+	cmp.l	er4,er2
+	blo	2f
+	;; unsigned long copy
+1:	
+	mov.l	@er1,er3
+	mov.l	er3,@er0
+	adds	#4,er0
+	adds	#4,er1
+	subs	#4,er2
+	cmp.l	er4,er2
+	bcc	1b	
+	;; rest
+2:	
+	mov.l	er2,er2
+	beq	3f
+1:	
+	mov.b	@er1,r3l
+	mov.b	r3l,@er0
+	adds	#1,er1
+	adds	#1,er0
+	dec.l	#1,er2
+	bne	1b
+3:
+	mov.l	@sp+,er0
+	mov.l	@sp+,er4
+	rts
+
+	;; odd <- even / even <- odd
+4:	
+	mov.l	er4,er3
+	mov.l	er2,er4
+	mov.l	er5,er2
+	mov.l	er1,er5
+	mov.l	er6,er1
+	mov.l	er0,er6
+1:
+	eepmov.w
+	mov.w	r4,r4
+	bne	1b
+	dec.w	#1,e4
+	bpl	1b
+	mov.l	er1,er6
+	mov.l	er2,er5
+	mov.l	er3,er4
+	rts
diff -Nru a/arch/h8300/lib/memset.S b/arch/h8300/lib/memset.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/lib/memset.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,61 @@
+/* memset.S */
+
+#include <asm/linkage.h>
+
+#if defined(__H8300H__) 
+	.h8300h
+#endif
+#if defined(__H8300S__) 
+	.h8300s
+#endif
+	.text
+
+.global	SYMBOL_NAME(memset)
+
+;;void *memset(*ptr, int c, size_t count)
+;; ptr = er0
+;; c   = er1(r1l)
+;; count = er2
+SYMBOL_NAME_LABEL(memset)
+	mov.l	er2,er2
+	beq	7f
+	mov.l	er0,@-sp
+	btst	#0,r0l
+	beq	2f
+
+	;; odd address
+1:
+	mov.b	r1l,@er0
+	adds	#1,er0
+	dec.l	#1,er2
+	beq	6f
+
+	;; even address
+2:
+	mov.l	er2,er3
+	cmp.l	#4,er2
+	blo	4f
+	;; count>=4 -> count/4
+	shlr.l	er2
+	shlr.l	er2
+	;; byte -> long
+	mov.b	r1l,r1h
+	mov.w	r1,e1
+3:
+	mov.l	er1,@er0
+	adds	#4,er0
+	dec.l	#1,er2
+	bne	3b
+4:
+	;; count % 4
+	and.b	#3,r3l
+	beq	6f
+5:
+	mov.b	r1l,@er0
+	adds	#1,er0
+	dec.b	r3l
+	bne	5b
+6:
+	mov.l	@sp+,er0
+7:
+	rts
\ No newline at end of file
diff -Nru a/arch/h8300/mm/Makefile b/arch/h8300/mm/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/mm/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,10 @@
+#
+# Makefile for the linux m68k-specific parts of the memory manager.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+# Note 2! The CFLAGS definition is now in the main makefile...
+
+obj-y	 := init.o fault.o memory.o kmap.o extable.o
diff -Nru a/arch/h8300/mm/extable.c b/arch/h8300/mm/extable.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/mm/extable.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,30 @@
+/*
+ * linux/arch/h8300/mm/extable.c
+ */
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <asm/uaccess.h>
+
+/* Simple binary search */
+const struct exception_table_entry *
+search_extable(const struct exception_table_entry *first,
+	       const struct exception_table_entry *last,
+	       unsigned long value)
+{
+        while (first <= last) {
+		const struct exception_table_entry *mid;
+		long diff;
+
+		mid = (last - first) / 2 + first;
+		diff = mid->insn - value;
+                if (diff == 0)
+                        return mid;
+                else if (diff < 0)
+                        first = mid+1;
+                else
+                        last = mid-1;
+        }
+        return NULL;
+}
diff -Nru a/arch/h8300/mm/fault.c b/arch/h8300/mm/fault.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/mm/fault.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,58 @@
+/*
+ *  linux/arch/h8300/mm/fault.c
+ *
+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
+ *  Copyright (C) 2000  Lineo, Inc.  (www.lineo.com) 
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/mm/fault.c
+ *  linux/arch/m68k/mm/fault.c
+ *
+ *  Copyright (C) 1995  Hamish Macdonald
+ */
+
+#include <linux/mman.h>
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/ptrace.h>
+
+#include <asm/system.h>
+#include <asm/pgtable.h>
+
+extern void die_if_kernel(char *, struct pt_regs *, long);
+
+/*
+ * This routine handles page faults.  It determines the problem, and
+ * then passes it off to one of the appropriate routines.
+ *
+ * error_code:
+ *	bit 0 == 0 means no page found, 1 means protection fault
+ *	bit 1 == 0 means read, 1 means write
+ *
+ * If this routine detects a bad access, it returns 1, otherwise it
+ * returns 0.
+ */
+asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
+			      unsigned long error_code)
+{
+#ifdef DEBUG
+	printk ("regs->sr=%#x, regs->pc=%#lx, address=%#lx, %ld\n",
+		regs->sr, regs->pc, address, error_code);
+#endif
+
+/*
+ * Oops. The kernel tried to access some bad page. We'll have to
+ * terminate things with extreme prejudice.
+ */
+	if ((unsigned long) address < PAGE_SIZE) {
+		printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
+	} else
+		printk(KERN_ALERT "Unable to handle kernel access");
+	printk(" at virtual address %08lx\n",address);
+	die_if_kernel("Oops", regs, error_code);
+	do_exit(SIGKILL);
+
+	return 1;
+}
+
diff -Nru a/arch/h8300/mm/init.c b/arch/h8300/mm/init.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/mm/init.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,235 @@
+/*
+ *  linux/arch/h8300/mm/init.c
+ *
+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
+ *                      Kenneth Albanowski <kjahds@kjahds.com>,
+ *  Copyright (C) 2000  Lineo, Inc.  (www.lineo.com) 
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/mm/init.c
+ *  linux/arch/m68k/mm/init.c
+ *
+ *  Copyright (C) 1995  Hamish Macdonald
+ *
+ *  JAN/1999 -- hacked to support ColdFire (gerg@snapgear.com)
+ *  DEC/2000 -- linux 2.4 support <davidm@snapgear.com>
+ */
+
+#include <linux/config.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#ifdef CONFIG_BLK_DEV_RAM
+#include <linux/blk.h>
+#endif
+#include <linux/ptrace.h>
+#include <linux/mman.h>
+#include <linux/mm.h>
+#include <linux/swap.h>
+#include <linux/init.h>
+#include <linux/highmem.h>
+#include <linux/pagemap.h>
+#include <linux/bootmem.h>
+#include <linux/slab.h>
+
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/system.h>
+
+#undef DEBUG
+
+extern void die_if_kernel(char *,struct pt_regs *,long);
+extern void free_initmem(void);
+
+/*
+ * BAD_PAGE is the page that is used for page faults when linux
+ * is out-of-memory. Older versions of linux just did a
+ * do_exit(), but using this instead means there is less risk
+ * for a process dying in kernel mode, possibly leaving a inode
+ * unused etc..
+ *
+ * BAD_PAGETABLE is the accompanying page-table: it is initialized
+ * to point to BAD_PAGE entries.
+ *
+ * ZERO_PAGE is a special page that is used for zero-initialized
+ * data and COW.
+ */
+static unsigned long empty_bad_page_table;
+
+static unsigned long empty_bad_page;
+
+unsigned long empty_zero_page;
+
+extern unsigned long rom_length;
+
+void show_mem(void)
+{
+    unsigned long i;
+    int free = 0, total = 0, reserved = 0, shared = 0;
+    int cached = 0;
+
+    printk("\nMem-info:\n");
+    show_free_areas();
+    i = max_mapnr;
+    while (i-- > 0) {
+	total++;
+	if (PageReserved(mem_map+i))
+	    reserved++;
+	else if (PageSwapCache(mem_map+i))
+	    cached++;
+	else if (!page_count(mem_map+i))
+	    free++;
+	else
+	    shared += page_count(mem_map+i) - 1;
+    }
+    printk("%d pages of RAM\n",total);
+    printk("%d free pages\n",free);
+    printk("%d reserved pages\n",reserved);
+    printk("%d pages shared\n",shared);
+    printk("%d pages swap cached\n",cached);
+}
+
+extern unsigned long memory_start;
+extern unsigned long memory_end;
+
+/*
+ * paging_init() continues the virtual memory environment setup which
+ * was begun by the code in arch/head.S.
+ * The parameters are pointers to where to stick the starting and ending
+ * addresses of available kernel virtual memory.
+ */
+void paging_init(void)
+{
+	/*
+	 * Make sure start_mem is page aligned,  otherwise bootmem and
+	 * page_alloc get different views og the world.
+	 */
+#ifdef DEBUG
+	unsigned long start_mem = PAGE_ALIGN(memory_start);
+#endif
+	unsigned long end_mem   = memory_end & PAGE_MASK;
+
+#ifdef DEBUG
+	printk ("start_mem is %#lx\nvirtual_end is %#lx\n",
+		start_mem, end_mem);
+#endif
+
+	/*
+	 * Initialize the bad page table and bad page to point
+	 * to a couple of allocated pages.
+	 */
+	empty_bad_page_table = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
+	empty_bad_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
+	empty_zero_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
+	memset((void *)empty_zero_page, 0, PAGE_SIZE);
+
+	/*
+	 * Set up SFC/DFC registers (user data space).
+	 */
+	set_fs (USER_DS);
+
+#ifdef DEBUG
+	printk ("before free_area_init\n");
+
+	printk ("free_area_init -> start_mem is %#lx\nvirtual_end is %#lx\n",
+		start_mem, end_mem);
+#endif
+
+	{
+		unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
+
+		zones_size[ZONE_DMA]     = 0 >> PAGE_SHIFT;
+		zones_size[ZONE_NORMAL]  = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
+#ifdef CONFIG_HIGHMEM
+		zones_size[ZONE_HIGHMEM] = 0;
+#endif
+		free_area_init(zones_size);
+	}
+}
+
+void mem_init(void)
+{
+	int codek = 0, datak = 0, initk = 0;
+	/* DAVIDM look at setup memory map generically with reserved area */
+	unsigned long tmp;
+	extern char _etext, _stext, _sdata, _ebss, __init_begin, __init_end;
+	extern unsigned char _ramend, _ramstart;
+	unsigned long len = &_ramend - &_ramstart;
+	unsigned long start_mem = memory_start; /* DAVIDM - these must start at end of kernel */
+	unsigned long end_mem   = memory_end; /* DAVIDM - this must not include kernel stack at top */
+
+#ifdef DEBUG
+	printk("Mem_init: start=%lx, end=%lx\n", start_mem, end_mem);
+#endif
+
+	end_mem &= PAGE_MASK;
+	high_memory = (void *) end_mem;
+
+	start_mem = PAGE_ALIGN(start_mem);
+	max_mapnr = num_physpages = MAP_NR(high_memory);
+
+	/* this will put all memory onto the freelists */
+	totalram_pages = free_all_bootmem();
+
+	codek = (&_etext - &_stext) >> 10;
+	datak = (&_ebss - &_sdata) >> 10;
+	initk = (&__init_begin - &__init_end) >> 10;
+
+	tmp = nr_free_pages() << PAGE_SHIFT;
+	printk("Memory available: %luk/%luk RAM, %luk/%luk ROM (%dk kernel code, %dk data)\n",
+	       tmp >> 10,
+	       len >> 10,
+	       (rom_length > 0) ? ((rom_length >> 10) - codek) : 0,
+	       rom_length >> 10,
+	       codek,
+	       datak
+	       );
+}
+
+
+#ifdef CONFIG_BLK_DEV_INITRD
+void free_initrd_mem(unsigned long start, unsigned long end)
+{
+	int pages = 0;
+	for (; start < end; start += PAGE_SIZE) {
+		ClearPageReserved(virt_to_page(start));
+		set_page_count(virt_to_page(start), 1);
+		free_page(start);
+		totalram_pages++;
+		pages++;
+	}
+	printk ("Freeing initrd memory: %dk freed\n", pages);
+}
+#endif
+
+void
+free_initmem()
+{
+#ifdef CONFIG_RAMKERNEL
+	unsigned long addr;
+	extern char __init_begin, __init_end;
+/*
+ *	the following code should be cool even if these sections
+ *	are not page aligned.
+ */
+	addr = PAGE_ALIGN((unsigned long)(&__init_begin));
+	/* next to check that the page we free is not a partial page */
+	for (; addr + PAGE_SIZE < (unsigned long)(&__init_end); addr +=PAGE_SIZE) {
+		ClearPageReserved(virt_to_page(addr));
+		set_page_count(virt_to_page(addr), 1);
+		free_page(addr);
+		totalram_pages++;
+	}
+	printk("Freeing unused kernel memory: %ldk freed (0x%x - 0x%x)\n",
+			(addr - PAGE_ALIGN((long) &__init_begin)) >> 10,
+			(int)(PAGE_ALIGN((unsigned long)(&__init_begin))),
+			(int)(addr - PAGE_SIZE));
+#endif
+}
+
diff -Nru a/arch/h8300/mm/kmap.c b/arch/h8300/mm/kmap.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/mm/kmap.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,59 @@
+/*
+ *  linux/arch/h8300/mm/kmap.c
+ *  
+ *  Based on
+ *  linux/arch/m68knommu/mm/kmap.c
+ *
+ *  Copyright (C) 2000 Lineo, <davidm@snapgear.com>
+ *  Copyright (C) 2000-2002 David McCullough <davidm@snapgear.com>
+ */
+
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/page.h>
+#include <asm/pgalloc.h>
+#include <asm/io.h>
+#include <asm/system.h>
+
+#undef DEBUG
+
+/*
+ * Map some physical address range into the kernel address space.
+ */
+void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag)
+{
+	return (void *)physaddr;
+}
+
+/*
+ * Unmap a ioremap()ed region again.
+ */
+void iounmap(void *addr)
+{
+}
+
+/*
+ * __iounmap unmaps nearly everything, so be careful
+ * it doesn't free currently pointer/page tables anymore but it
+ * wans't used anyway and might be added later.
+ */
+void __iounmap(void *addr, unsigned long size)
+{
+}
+
+/*
+ * Set new cache mode for some kernel address space.
+ * The caller must push data for that range itself, if such data may already
+ * be in the cache.
+ */
+void kernel_set_cachemode(void *addr, unsigned long size, int cmode)
+{
+}
diff -Nru a/arch/h8300/mm/memory.c b/arch/h8300/mm/memory.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/mm/memory.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,70 @@
+/*
+ *  linux/arch/h8300/mm/memory.c
+ *
+ *  Copyright (C) 2002  Yoshinori Sato <ysato@users.sourceforge.jp>,
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68knommu/mm/memory.c
+ *
+ *  Copyright (C) 1998  Kenneth Albanowski <kjahds@kjahds.com>,
+ *  Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
+ *
+ *  Based on:
+ *
+ *  linux/arch/m68k/mm/memory.c
+ *
+ *  Copyright (C) 1995  Hamish Macdonald
+ */
+
+#include <linux/config.h>
+#include <linux/mm.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/slab.h>
+
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/system.h>
+#include <asm/traps.h>
+#include <asm/io.h>
+
+void cache_clear (unsigned long paddr, int len)
+{
+}
+
+
+void cache_push (unsigned long paddr, int len)
+{
+}
+
+void cache_push_v (unsigned long vaddr, int len)
+{
+}
+
+/* Map some physical address range into the kernel address space. The
+ * code is copied and adapted from map_chunk().
+ */
+
+unsigned long kernel_map(unsigned long paddr, unsigned long size,
+			 int nocacheflag, unsigned long *memavailp )
+{
+	return paddr;
+}
+
+#ifdef MAGIC_ROM_PTR
+
+int is_in_rom(unsigned long addr)
+{
+	/* Anything not in operational RAM is returned as in rom! */
+	if (addr < _ramstart || addr >= _ramend)
+ 		return 1;
+	else
+		return 0;
+}
+
+#endif
+
diff -Nru a/arch/h8300/platform/h8300h/Makefile b/arch/h8300/platform/h8300h/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,22 @@
+#
+# Makefile for the linux kernel.
+#
+# Reuse any files we can from the H8/300H
+#
+
+#VPATH := $(VPATH):$(BOARD)
+
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+.S.o:
+	$(CC) -D__ASSEMBLY__ $(AFLAGS) -I. -c $< -o $*.o
+
+obj-y := entry.o ints.o
+
+$(BOARD)/crt0_$(MODEL).o: $(BOARD)/crt0_$(MODEL).S
+
+entry.o: entry.S
+
+ints.o: ints.c
diff -Nru a/arch/h8300/platform/h8300h/Rules.make b/arch/h8300/platform/h8300h/Rules.make
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/Rules.make	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,51 @@
+#
+# h8300h/Makefile
+#
+# This file is included by the global makefile so that you can add your own
+# platform-specific flags and dependencies.
+#
+# 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) 2001		Lineo, Inc, <www.lineo.com>
+# Copyright (c) 2000,2001	D. Jeff Dionne <jeff@lineo.ca>
+# Copyright (c) 1998,1999	D. Jeff Dionne <jeff@uclinux.org>
+# Copyright (C) 1998		Kenneth Albanowski <kjahds@kjahds.com>
+# Copyright (C) 1994 		Hamish Macdonald
+#
+# 68VZ328 Fixes By		Evan Stawnyczy <e@lineo.ca>
+# H8/300H Modify By             Yoshinori Sato <ysato@users.sourceforge.jp>
+
+CROSS_COMPILE = h8300-elf-
+
+GCC_DIR = $(shell $(CC) -v 2>&1 | grep specs | sed -e 's/.* \(.*\)specs/\1\./')
+
+INCGCC = $(GCC_DIR)/include
+LIBGCC = $(GCC_DIR)/h8300h/int32/libgcc.a
+
+CFLAGS := -fno-builtin -DNO_CACHE $(CFLAGS) -pipe -DNO_MM -DNO_FPU -DNO_CACHE -mh -mint32 -malign-300 -D__ELF__  -DNO_FORGET -DUTS_SYSNAME=\"uClinux\" -D__linux__ -DTARGET=$(BOARD)
+AFLAGS := $(AFLAGS) -pipe -DNO_MM -DNO_FPU -DNO_CACHE -mh -D__ELF__ -DUTS_SYSNAME=\"uClinux\"
+
+LINKFLAGS = -T arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/$(MODEL).ld
+LDFLAGS := $(LDFLAGS) -mh8300helf
+
+HEAD := arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/crt0_$(MODEL).o
+
+SUBDIRS := arch/$(ARCH)/kernel arch/$(ARCH)/mm arch/$(ARCH)/lib \
+           arch/$(ARCH)/platform/$(PLATFORM) \
+  	   arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD) \
+           $(SUBDIRS)
+
+CORE_FILES := arch/$(ARCH)/kernel/kernel.o arch/$(ARCH)/mm/mm.o \
+              arch/$(ARCH)/platform/$(PLATFORM)/platform.o \
+              arch/$(ARCH)/platform/$(PLATFORM)/$(BOARD)/$(BOARD).o \
+	      $(CORE_FILES)
+
+LIBS += arch/$(ARCH)/lib/lib.a $(LIBGCC)
+
+linux.bin: linux
+	$(OBJCOPY) -O binary linux linux.bin
+	
+archclean:
+	rm -f linux
diff -Nru a/arch/h8300/platform/h8300h/aki3068net/Makefile b/arch/h8300/platform/h8300h/aki3068net/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/aki3068net/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,16 @@
+#
+# Makefile for the linux kernel.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+
+all: $(BOARD).o
+O_TARGET := $(BOARD).o
+obj-y := timer.o
+
+timer.o: timer.c
+
+clean:
+	rm -f *.[oa]
diff -Nru a/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S b/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,109 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/aki3068net/crt0_ram.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup for uClinux-2.4.x
+ *  Target Archtecture:	AE-3068 (aka. aki3068net)
+ *  Memory Layout     :	RAM
+ */
+
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <asm/linkage.h>
+	
+	.global SYMBOL_NAME(_start)
+	.global SYMBOL_NAME(command_line)
+	.global SYMBOL_NAME(_platform_gpio_table)
+	.global SYMBOL_NAME(_target_name)
+	
+	.h8300h
+
+	.section .text
+	.file	"crt0_ram.S"
+
+	/* CPU Reset entry */
+SYMBOL_NAME_LABEL(_start)
+	mov.l	#__ramend,sp
+	ldc	#0x80,ccr
+
+	/* Peripheral Setup */
+	
+	/* .bss clear */
+	mov.l	#__sbss,er5
+	mov.l	er5,er6
+	inc.l	#1,er6
+	mov.l	#__ebss,er4
+	sub.l	er5,er4
+	sub.w	r0,r0
+	mov.b	r0l,@er5
+1:	
+	eepmov.w
+	dec.w	#1,e4
+	bpl	1b
+
+	/* copy kernel commandline */
+	mov.l	#COMMAND_START,er5
+	mov.l	#SYMBOL_NAME(command_line),er6
+	mov.w	#512,r4
+	eepmov.w
+
+	/* RAM Interrupt Vector Table Setup */
+#if defined(CONFIG_GDB_DEBUG)
+	mov.l	@SYMBOL_NAME(interrupt_redirect_table)+11*4,er0
+#endif
+	mov.l	#SYMBOL_NAME(_vector_lma),er5
+	mov.l	#SYMBOL_NAME(interrupt_redirect_table),er6
+	mov.w	#0x100,r4
+	eepmov.w
+#if defined(CONFIG_GDB_DEBUG)
+	mov.l	er0,@SYMBOL_NAME(interrupt_redirect_table)+11*4
+#endif
+
+	/* uClinux kernel start */
+	ldc	#0x90,ccr	/* running kernel */
+	mov.l	#SYMBOL_NAME(init_task_union),sp
+	mov.l	sp,@SYMBOL_NAME(_current_task)
+	add.l	#0x2000,sp
+	jsr	@_start_kernel
+_exit:
+
+	jmp	_exit
+
+	rts
+
+	/* I/O port assign information */
+__platform_gpio_table:	
+	mov.l	#gpio_table,er0
+	rts
+
+gpio_table:
+	;; P1DDR
+	.byte	0xff,0xff
+	;; P2DDR
+	.byte	0xff,0xff
+	;; P3DDR
+	.byte	0xff,0x00
+	;; P4DDR
+	.byte	0x00,0x00
+	;; P5DDR
+	.byte	0x01,0x01
+	;; P6DDR
+	.byte	0x00,0x00
+	;; dummy
+	.byte	0x00,0x00
+	;; P8DDR
+	.byte	0x0c,0x0c
+	;; P9DDR
+	.byte	0x00,0x00
+	;; PADDR
+	.byte	0x00,0x00
+	;; PBDDR
+	.byte	0x30,0x30
+
+__target_name:	
+	.asciz	"AE-3068"
+	
+	.section .bootvec,"ax"
+	jmp	@SYMBOL_NAME(_start)
diff -Nru a/arch/h8300/platform/h8300h/aki3068net/ram.ld b/arch/h8300/platform/h8300h/aki3068net/ram.ld
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/aki3068net/ram.ld	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,90 @@
+/* AE-3068 (aka. aki3068net) RAM */
+
+OUTPUT_ARCH(h8300h)
+ENTRY("__start")
+
+MEMORY 
+	{
+	ram    : ORIGIN = 0x400000, LENGTH = 0x600000-0x400000-0x80000
+	disk   : ORIGIN = 0x600000-0x80000, LENGTH = 0x60000
+	eram   : ORIGIN = 0x600000, LENGTH = 0
+        iram   : ORIGIN = 0xffbf20, LENGTH = 0x4000
+	}
+
+SECTIONS
+{
+	.bootvec :
+	{
+	*(.bootvec)
+	} > ram
+        .text :
+	{
+	__stext = . ;
+        	*(.text)
+	. = ALIGN(0x4) ;
+		*(.text.*)
+	. = ALIGN(0x4) ;
+		*(.kstrtab)
+	. = ALIGN(0x4) ;
+		*(.rodata*)
+	. = ALIGN(16);          /* Exception table              */
+	___start___ex_table = .;
+		*(__ex_table)
+	___stop___ex_table = .;
+
+        ___start___ksymtab = .;  /* Kernel symbol table          */
+		 *(__ksymtab)
+	___stop___ksymtab = .;
+
+	. = ALIGN(0x4) ;
+	__etext = . ;
+        } > ram
+	.data : 
+	{
+	__sdata = . ;
+	___data_start = . ;
+		*(.data)
+		*(.data.*)	
+		*(.exitcall.exit)
+
+	. = ALIGN(0x2000) ;
+		*(.data.init_task)
+	. = ALIGN(0x2000) ;
+        ___init_begin = .;
+        *(.text.init)
+        *(.data.init)
+        . = ALIGN(16);
+        ___setup_start = .;
+        *(.setup.init)
+        ___setup_end = .;
+        ___initcall_start = .;
+        *(.initcall.init)
+        . = ALIGN(4) ;
+        ___initcall_end = .;
+        ___init_end = .;
+	__edata = . ;
+	. = ALIGN(0x4) ;
+	__sbss = . ;
+		*(.bss)
+	. = ALIGN(0x4) ;
+		*(COMMON)
+	. = ALIGN(0x4) ;
+	__ebss = . ;
+	__end = . ;
+	__ramstart = .;
+	} > ram
+	.blkimg :
+	{
+	__ramend = . ;
+	__blkimg = . ;
+	} > disk
+	.ram_vec : AT(ADDR(.data) + SIZEOF(.data))
+	{
+		*(.int_redirect)
+	} > iram 
+	__vector_lma = LOADADDR(.ram_vec);
+        .dummy2 :
+        {
+        COMMAND_START = . - 0x200 ;
+	} > eram
+}
diff -Nru a/arch/h8300/platform/h8300h/aki3068net/timer.c b/arch/h8300/platform/h8300h/aki3068net/timer.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/aki3068net/timer.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,46 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/aki3068net/timer.c
+ *
+ *  Yoshinori Sato <ysato@users.sourcefoge.jp>
+ *
+ *  Platform depend Timer Handler
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+
+#include <asm/segment.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+
+#include <linux/timex.h>
+
+#define TMR8CMA2 0x00ffff94
+#define TMR8TCSR2 0x00ffff92
+#define TMR8TCNT2 0x00ffff90
+#define CMFA 6
+
+int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *))
+{
+	outb(CONFIG_CLK_FREQ*10/8192,TMR8CMA2);
+	outb(0x00,TMR8TCSR2);
+	request_irq(40,timer_int,0,"timer",0);
+	outb(0x40|0x08|0x03,TMR8TCNT2);
+}
+
+void platform_timer_eoi(void)
+{
+	*(unsigned char *)TMR8TCSR2 &= ~(1 << CMFA);
+}
+
+void platform_gettod(int *year, int *mon, int *day, int *hour,
+		 int *min, int *sec)
+{
+	*year = *mon = *day = *hour = *min = *sec = 0;
+}
diff -Nru a/arch/h8300/platform/h8300h/entry.S b/arch/h8300/platform/h8300h/entry.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/entry.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,357 @@
+/* -*- mode: asm -*-
+ *
+ *  linux/arch/h8300/platform/h8300h/entry.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ */
+
+/*
+ *  entry.S
+ *  include exception/interrupt gateway
+ *          system call entry
+ */
+
+#include <linux/sys.h>
+#include <linux/config.h>
+#include <asm/unistd.h>
+#include <asm/setup.h>
+#include <asm/segment.h>
+#include <asm/linkage.h>
+#include <asm/asm-offsets.h>
+#include <asm/thread_info.h>
+			
+ENOSYS = 38
+
+LSIGTRAP = 5
+
+SOFTIRQ_PENDING = 0
+		
+/* the following macro is used when enabling interrupts */
+
+LER3	=	0
+LER2	=	4
+LER1	=	8
+LORIG	=	12
+LCCR	=	16
+LER0	=	18
+LVEC	=	22
+LRET	=	24
+
+	.h8300h
+
+/* CPU context save/restore macros. */
+	
+	.macro	SAVE_ALL
+	mov.l	er0,@-sp
+	stc	ccr,r0l
+	orc	#0x10,ccr
+	btst	#4,r0l
+	bne	1f
+	mov.l	sp,@SYMBOL_NAME(sw_usp)
+	mov.l	@sp,er0
+	mov.l	@SYMBOL_NAME(sw_ksp),sp
+	mov.l	er0,@-sp
+	stc	ccr,r0l
+	and	#0xef,r0l
+	mov.w	r0,@-sp
+	mov.l	@(2:16,sp),er0
+	bra	2f
+1:
+	mov.l	@sp,er0
+	stc	ccr,@-sp
+2:	
+	mov.l	er0,@-sp
+	mov.l	er1,@-sp
+	mov.l	er2,@-sp
+	mov.l	er3,@-sp
+	.endm
+
+	.macro RESTORE_REGS
+	mov.w	@(LCCR:16,sp),r0
+	btst	#4,r0l
+	bne	1f
+	mov.l	@SYMBOL_NAME(sw_usp),er0
+	mov.l	@(LER0:16,sp),er1
+	mov.l	er1,@er0
+	mov.l	@sp+,er3
+	mov.l	@sp+,er2
+	mov.l	@sp+,er1
+	add.l	#10,sp
+	mov.l	sp,@SYMBOL_NAME(sw_ksp)
+	mov.l	er0,sp
+	bra	2f
+1:
+	mov.l	@sp+,er3
+	mov.l	@sp+,er2
+	mov.l	@sp+,er1
+	adds	#4,sp
+	adds	#2,sp
+2:
+	mov.l	@sp+,er0
+	adds	#4,sp
+	.endm
+	
+	.macro	RESTORE_ALL
+	RESTORE_REGS
+	rte
+	.endm
+
+#define SWITCH_STACK_SIZE (3*4+12)	/* includes return address */
+
+	.macro	SAVE_SWITCH_STACK
+	mov.l	er4,@-sp
+	mov.l	er5,@-sp
+	mov.l	er6,@-sp
+	.endm
+
+	.macro	RESTORE_SWITCH_STACK
+	mov.l	@sp+,er6
+	mov.l	@sp+,er5
+	mov.l	@sp+,er4
+	.endm
+
+.globl SYMBOL_NAME(system_call)
+.globl SYMBOL_NAME(ret_from_exception)
+.globl SYMBOL_NAME(ret_from_signal)
+.globl SYMBOL_NAME(ret_from_interrupt), SYMBOL_NAME(bad_interrupt)
+.globl SYMBOL_NAME(interrupt_redirect_table)
+.globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
+.globl SYMBOL_NAME(resume)
+.globl SYMBOL_NAME(sys_vfork)
+.globl SYMBOL_NAME(syscall_trampoline)
+	
+	.section .int_redirect,"ax"
+SYMBOL_NAME_LABEL(interrupt_redirect_table)
+	.rept	7
+	.long	0
+	.endr
+	jsr	@interrupt_entry		/* NMI */
+	jmp	@SYMBOL_NAME(system_call)	/* TRAPA #0 (System call) */
+	.long	0
+	.long	0
+	jmp	@SYMBOL_NAME(trace_break)	/* TRAPA #3 (breakpoint) */
+	.rept	64-12
+	jsr	@interrupt_entry
+	.endr
+
+	.section .text
+	.align	2
+interrupt_entry:
+	SAVE_ALL
+	mov.w	@(LCCR,sp),r0
+	btst	#4,r0l
+	bne	1f
+	mov.l	@SYMBOL_NAME(sw_usp),er0
+	mov.l	@(4:16,er0),er0
+	bra	2f
+1:
+	mov.l	@(LVEC,sp),er0
+2:
+	sub.l	#SYMBOL_NAME(interrupt_redirect_table),er0
+	shlr.l	er0
+	shlr.l	er0
+	dec.l	#1,er0
+	mov.l	sp,er1
+	jsr	@SYMBOL_NAME(process_int)
+	mov.l	@SYMBOL_NAME(irq_stat)+SOFTIRQ_PENDING,er0
+	beq	1f
+	jsr	@SYMBOL_NAME(do_softirq)
+1:
+	jmp	@SYMBOL_NAME(ret_from_exception)
+
+SYMBOL_NAME_LABEL(system_call)
+	subs	#4,sp
+	SAVE_ALL
+	mov.l	er0,er3
+	mov.l	#-ENOSYS,er0
+	mov.l	er0,@(LER0:16,sp)
+
+	/* save top of frame */
+	mov.l	sp,er0
+	mov.l	er3,@-sp
+	jsr	@SYMBOL_NAME(set_esp0)
+	mov.l	@sp+,er3
+	cmp.l	#NR_syscalls,er3
+	bcc	SYMBOL_NAME(ret_from_exception):16
+	shll.l	er3
+	shll.l	er3
+	mov.l	#SYMBOL_NAME(sys_call_table),er0
+	add.l	er3,er0
+	mov.l	@er0,er0
+	mov.l	er0,er3
+	beq	SYMBOL_NAME(ret_from_exception):16	
+	mov.l	@SYMBOL_NAME(_current_task),er2
+	mov.b	@((TASK_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
+	btst	#(TIF_SYSCALL_TRACE & 7),r2l
+	bne	1f
+	mov.l	@(LER1:16,sp),er0
+	mov.l	@(LER2:16,sp),er1
+	mov.l	@(LER3:16,sp),er2
+	mov.l	er5,@-sp
+	mov.l	er4,@-sp
+	jsr	@er3
+	adds	#4,sp
+	adds	#4,sp
+	mov.l	er0,@(LER0,sp)		/* save the return value */
+#if defined(CONFIG_SYSCALL_PRINT)
+	jsr	@SYMBOL_NAME(syscall_print)
+#endif
+	jmp	@SYMBOL_NAME(ret_from_exception)
+1:
+	SAVE_SWITCH_STACK
+	mov.l	er3,er5			/* save syscall entry */
+	jsr	SYMBOL_NAME(syscall_trace)
+	mov.l	er5,er3
+	RESTORE_SWITCH_STACK
+	mov.l	@(LER1:16,sp),er0
+	mov.l	@(LER2:16,sp),er1
+	mov.l	@(LER3:16,sp),er2
+	mov.l	er5,@-sp
+	mov.l	er4,@-sp
+	jsr	@er3
+	adds	#4,sp
+	adds	#4,sp
+	mov.l	er0,@(LER0:16,sp)		/* save the return value */
+	SAVE_SWITCH_STACK
+	jsr	SYMBOL_NAME(syscall_trace)
+
+SYMBOL_NAME_LABEL(ret_from_signal)
+	RESTORE_SWITCH_STACK
+
+SYMBOL_NAME_LABEL(ret_from_exception)
+	mov.b	@(LCCR+1:16,sp),r0l
+	btst	#4,r0l			/* check if returning to kernel */
+	bne	3f			/* if so, skip resched, signals */
+	andc	#0x7f,ccr
+	mov.l	@SYMBOL_NAME(_current_task),er0
+	mov.l	@(TI_FLAGS:16,er2),er1
+	and.l	#_TIF_WORK_MASK,er1
+	bne	1f
+	mov.l	@((TASK_THREAD+THREAD_VFORK):16,er0),er1 
+	bne	Lvfork_return
+3:	 
+	RESTORE_ALL			/* Does RTE */
+1:
+	mov.l	@(TI_FLAGS:16,er2),er1
+	btst	#TIF_NEED_RESCHED,r1l
+	bne	@SYMBOL_NAME(reschedule):16
+
+Lsignal_return:
+	SAVE_SWITCH_STACK
+	mov.l	sp,er1
+	add	#12,er1
+	mov.l	er2,er0
+	jsr	@SYMBOL_NAME(do_signal)
+	RESTORE_SWITCH_STACK
+	mov.l	@SYMBOL_NAME(_current_task),er0
+	mov.l	@((TASK_THREAD+THREAD_VFORK):16,er0),er1 
+	bne	Lvfork_return
+	RESTORE_ALL
+
+Lvfork_return:
+	sub.l	er2,er2
+	mov.l	er2,@((TASK_THREAD+THREAD_VFORK):16,er0)
+	mov.l	@SYMBOL_NAME(sw_usp),er0
+	mov.l	er1,@(8:16,er0)
+	RESTORE_ALL
+	
+SYMBOL_NAME_LABEL(reschedule)
+	/* save top of frame */
+	mov.l	sp,er0
+	jsr	@SYMBOL_NAME(set_esp0)
+
+	mov.l	#SYMBOL_NAME(ret_from_exception),er0
+	mov.l	er0,@-sp
+	jmp	@SYMBOL_NAME(schedule)
+
+SYMBOL_NAME_LABEL(resume)
+	/*
+	 * Beware - when entering resume, offset of tss is in d1,
+	 * prev (the current task) is in a0, next (the new task)
+	 * is in a1 and d2.b is non-zero if the mm structure is
+	 * shared between the tasks, so don't change these
+	 * registers until their contents are no longer needed.
+	 */
+
+	/* save sr */
+	sub.w	r3,r3
+	stc	ccr,r3l
+	mov.w	r3,@(THREAD_CCR:16,er0)
+	SAVE_SWITCH_STACK
+
+	/* disable interrupts */
+	orc	#0x80,ccr
+	mov.l	@SYMBOL_NAME(sw_usp),er3
+	mov.l	er3,@(THREAD_USP:16,er0)
+	mov.l	sp,@(THREAD_KSP:16,er0)
+	
+	/* get pointer to tss struct (a1 contains new task) */
+	mov.l	er1,@SYMBOL_NAME(_current_task)
+
+	/* Skip address space switching if they are the same. */
+	/* FIXME: what did we hack out of here, this does nothing! */
+
+	mov.l	@(THREAD_USP:16,er1),er0
+	mov.l	er0,@SYMBOL_NAME(sw_usp)
+	mov.l	@(THREAD_KSP:16,er1),sp
+	RESTORE_SWITCH_STACK
+			
+	/* restore status register */
+	mov.w	@(THREAD_CCR:16,er1),r3
+
+	ldc	r3l,ccr
+
+	rts
+	
+/* Handler for uninitialized and spurious interrupts */
+
+SYMBOL_NAME_LABEL(bad_interrupt)
+	mov.l	@SYMBOL_NAME(num_spurious),er0
+	inc.l	#1,er0
+	mov.l	er0,@SYMBOL_NAME(num_spurious)
+	rts
+
+SYMBOL_NAME_LABEL(trace_break)
+	subs	#4,sp
+	SAVE_ALL
+	sub.l	er1,er1
+	dec.l	#1,er1
+	mov.l	er1,@(LORIG,sp)	
+	mov.l	sp,er0
+	jsr	@SYMBOL_NAME(set_esp0)
+	mov.l	@SYMBOL_NAME(sw_usp),er0
+	mov.l	@er0,er1
+	subs	#2,er1
+	mov.l	er1,@er0	
+	and.w	#0xff,e1
+	mov.l	er1,er0
+	jsr	@SYMBOL_NAME(trace_trap)
+	jmp	@SYMBOL_NAME(ret_from_exception)	
+
+SYMBOL_NAME_LABEL(sys_vfork)
+	SAVE_SWITCH_STACK
+	mov.l	@SYMBOL_NAME(sw_usp),er6
+	mov.l	@(8:16,er6),er6
+	mov.l	sp,er0
+	add.l	#SWITCH_STACK_SIZE,er0
+	jsr	@SYMBOL_NAME(h8300_vfork)
+	mov.l	@SYMBOL_NAME(_current_task),er5
+	mov.l	er6,@((TASK_THREAD+THREAD_VFORK):16,er5)
+	RESTORE_SWITCH_STACK
+	rts
+
+SYMBOL_NAME_LABEL(syscall_trampoline)
+	SAVE_SWITCH_STACK
+	mov.l	er0,er6
+	mov.l	sp,er0
+	add.l	#SWITCH_STACK_SIZE,er0
+	jsr	@er6
+	RESTORE_SWITCH_STACK
+	rts
+
+	.section	.bss
+SYMBOL_NAME_LABEL(sw_ksp)
+	.space	4	
+SYMBOL_NAME_LABEL(sw_usp)
+	.space	4	
diff -Nru a/arch/h8300/platform/h8300h/generic/Makefile b/arch/h8300/platform/h8300h/generic/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/generic/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,12 @@
+#
+# Makefile for the linux kernel.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+
+obj-y := timer.o crt0_$(MODEL).o
+
+clean:
+	rm -f *.[oa]
diff -Nru a/arch/h8300/platform/h8300h/generic/crt0_rom.S b/arch/h8300/platform/h8300h/generic/crt0_rom.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/generic/crt0_rom.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,118 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/generic/crt0_rom.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup for uClinux-2.4.x
+ *  Target Archtecture:	generic
+ *  Memory Layout     :	ROM
+ */
+
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <asm/linkage.h>
+	
+	.global SYMBOL_NAME(_start)
+	.global SYMBOL_NAME(_command_line)
+	.global SYMBOL_NAME(_platform_gpio_table)
+	.global SYMBOL_NAME(_target_name)
+	
+	.h8300h
+	.section .text
+	.file	"crt0_rom.S"
+
+	/* CPU Reset entry */
+SYMBOL_NAME_LABEL(_start)
+	mov.l	#__ramend,sp
+	ldc	#0x80,ccr
+
+	/* Peripheral Setup */
+	
+	/* .bss clear */
+	mov.l	#__sbss,er5
+	mov.l	er5,er6
+	inc.l	#1,er6
+	mov.l	#__ebss,er4
+	sub.l	er5,er4
+	sub.w	r0,r0
+	mov.b	r0l,@er5
+1:	
+	eepmov.w
+	dec.w	#1,e4
+	bpl	1b
+
+	/* copy .data */
+#if !defined(CONFIG_H8300H_SIM)
+	mov.l	#__begin_data,er5
+	mov.l	#__sdata,er6
+	mov.l	#__edata,er4
+	sub.l	er6,er4		
+1:	
+	eepmov.w	
+	dec.w	#1,e4
+	bpl	1b	
+#endif
+
+	/* copy kernel commandline */
+	mov.l	#COMMAND_START,er5
+	mov.l	#SYMBOL_NAME(_command_line),er6
+	mov.w	#512,r4
+	eepmov.w
+
+	/* uClinux kernel start */
+	ldc	#0x90,ccr	/* running kernel */
+	mov.l	#SYMBOL_NAME(init_thread_union),sp
+	mov.l	sp,@SYMBOL_NAME(_current_task)
+	add.l	#0x2000,sp
+	jsr	@_start_kernel
+_exit:
+
+	jmp	_exit
+
+	rts
+
+	/* I/O port assign information */
+__platform_gpio_table:	
+	mov.l	#gpio_table,er0
+	rts
+
+gpio_table:
+	;; P1DDR
+	.byte	0x00,0x00
+	;; P2DDR
+	.byte	0x00,0x00
+	;; P3DDR
+	.byte	0x00,0x00
+	;; P4DDR
+	.byte	0x00,0x00
+	;; P5DDR
+	.byte	0x00,0x00
+	;; P6DDR
+	.byte	0x00,0x00
+	;; dummy
+	.byte	0x00,0x00
+	;; P8DDR
+	.byte	0x00,0x00
+	;; P9DDR
+	.byte	0x00,0x00
+	;; PADDR
+	.byte	0x00,0x00
+	;; PBDDR
+	.byte	0x00,0x00
+
+__target_name:	
+	.asciz	"generic"
+	
+	.section .bss
+__command_line:	
+	.space	512
+
+	/* interrupt vector */
+	.section .vectors,"ax"
+	.long	__start
+vector	=	1
+	.rept	64-1
+	.long	_interrupt_redirect_table+vector*4
+vector	=	vector + 1
+	.endr
diff -Nru a/arch/h8300/platform/h8300h/generic/ram.ld b/arch/h8300/platform/h8300h/generic/ram.ld
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/generic/ram.ld	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,76 @@
+/* AKI3068NET RAM */
+
+OUTPUT_ARCH(h8300h)
+ENTRY("__start")
+
+MEMORY 
+	{
+	ram    : ORIGIN = 0x400000, LENGTH = 0xA0000
+/*	rdisk  : ORIGIN = 0x4A0000, LENGTH = 0x70000 */
+/*	uram   : ORIGIN = 0x510000, LENGTH = 0xF0000 */
+	uram   : ORIGIN = 0x4A0000, LENGTH = 0x160000
+	eram   : ORIGIN = 0x600000, LENGTH = 0
+        iram   : ORIGIN = 0xffbf20, LENGTH = 0x4000
+	}
+
+SECTIONS
+{
+	.bootvec :
+	{
+	*(.bootvec)
+	} > ram
+        .text :
+	{
+	__stext = . ;
+        *(.text)
+	__etext = . ;
+        } > ram
+	.rodata :
+	{
+	___data_rom_start = ALIGN ( 4 ) ;
+	} > ram
+	.erom :
+	{
+	__erom = . ;
+	} > ram
+	.data : 
+	{
+	__ramstart = . ;
+	__sdata = . ;
+	___data_start = . ;
+        *(.data)
+	__edata = . ;
+	edata = ALIGN( 0x10 ) ;
+	___data_end = ALIGN( 0x10 ) ;
+	} > ram
+        .bss :
+        {
+	__sbss = . ;
+	___bss_start = . ;
+	*(.bss)
+	*(COMMON)
+	__ebss = . ;
+	___bss_end = . ;
+	} > ram
+/*
+	.rootimg :
+	{
+	__rootimage = . ;
+	} > rdisk
+*/
+	.dummy1 :
+	{
+	end = ALIGN( 0x10 ) ;
+	__end = ALIGN( 0x10 ) ;
+	} > uram
+	.ram_vec : AT(___bss_end)
+	{
+	__ram_vector       = . ;
+	} > iram 
+	__ram_vector_image = LOADADDR(.ram_vec) ;
+        .dummy2 :
+        {
+        _COMMAND_START = . - 0x200 ;
+	__ramend = . ;
+	} > eram
+}
diff -Nru a/arch/h8300/platform/h8300h/generic/rom.ld b/arch/h8300/platform/h8300h/generic/rom.ld
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/generic/rom.ld	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,122 @@
+OUTPUT_ARCH(h8300h)
+ENTRY("__start")
+
+/*INPUT(rootimage.o)*/
+
+_jiffies = _jiffies_64 + 4;
+
+MEMORY 
+	{
+	vector : ORIGIN = 0x000000, LENGTH = 0x000100
+	rom    : ORIGIN = 0x000100, LENGTH = 0x200000-0x000100
+	erom   : ORIGIN = 0x200000, LENGTH = 1
+	ram    : ORIGIN = 0x200000, LENGTH = 0x100000
+	eram   : ORIGIN = 0x2fa000, LENGTH = 1
+	}
+
+SECTIONS
+{
+	.vectors :
+	{
+	__vector = . ;
+		*(.vectors*)
+	} > vector
+        .text :
+	{
+		*(.int_redirect)
+	__stext = . ;
+        	*(.text)
+	. = ALIGN(0x4) ;
+		*(.exit.text)
+		*(.text.*)
+	. = ALIGN(0x4) ;
+		*(.exitcall.exit)
+	. = ALIGN(0x4) ;
+		*(.kstrtab)
+	. = ALIGN(0x4) ;
+		*(.rodata*)
+	. = ALIGN(16);          /* Exception table              */
+	___start___ex_table = .;
+		*(__ex_table)
+	___stop___ex_table = .;
+
+        ___start___ksymtab = .;  /* Kernel symbol table          */
+		 *(__ksymtab)
+	___stop___ksymtab = .;
+
+	. = ALIGN(0x4) ;
+	__etext = . ;
+	} > rom
+	.data : AT( ADDR(.text)+SIZEOF(.text))
+	{
+	__sdata = . ;
+	___data_start = . ;
+
+	. = ALIGN(0x2000) ;
+		*(.data.init_task)
+	. = ALIGN(0x4) ;
+		*(.data)
+	. = ALIGN(0x4) ;
+		*(.data.*)	
+
+	. = ALIGN(0x4) ;
+	___init_begin = .;
+		*(.init.text)
+		*(.init.data)
+	. = ALIGN(0x4) ;
+	___setup_start = .;
+		*(.init.setup)
+	. = ALIGN(0x4) ;
+	___setup_end = .;
+	___start___param = .;
+		*(__param)
+	___stop___param = .;
+	___initcall_start = .;
+		*(.initcall1.init)
+		*(.initcall2.init)
+		*(.initcall3.init)
+		*(.initcall4.init)
+		*(.initcall5.init)
+		*(.initcall6.init)
+		*(.initcall7.init)
+	___initcall_end = .;
+	___con_initcall_start = .;
+		*(.con_initcall.init)
+	___con_initcall_end = .;
+		. = ALIGN(4);
+	___initramfs_start = .;
+  		*(.init.ramfs)
+  	___initramfs_end = .;
+	. = ALIGN(0x4) ;
+	___init_end = .;
+
+	__edata = . ;
+	} > ram
+	__begin_data = LOADADDR(.data) ;
+	.blkimg : AT( LOADADDR(.data) + SIZEOF(.data))
+	{
+	__blkimg = . ;
+		*(.rootimg*)
+	} > rom
+	.erom :
+	{
+	__erom = . ;
+	} > erom
+        .bss :
+        {
+	. = ALIGN(0x4) ;
+	__sbss = . ;
+		*(.bss)
+	. = ALIGN(0x4) ;
+		*(COMMON)
+	. = ALIGN(0x4) ;
+	__ebss = . ;
+	__end = . ;
+	__ramstart = .;
+	} > ram
+        .dummy :
+        {
+        COMMAND_START = . - 0x200 ;
+	__ramend = . ;
+	} > eram
+}
diff -Nru a/arch/h8300/platform/h8300h/generic/timer.c b/arch/h8300/platform/h8300h/generic/timer.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/generic/timer.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,84 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/generic/timer.c
+ *
+ *  Yoshinori Sato <qzb04471@nifty.ne.jp>
+ *
+ *  Platform depend Timer Handler
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/interrupt.h>
+
+#include <asm/segment.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+
+#include <linux/timex.h>
+
+#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
+#define TMR8CMA2 0x00ffff94
+#define TMR8TCSR2 0x00ffff92
+#define TMR8TCNT2 0x00ffff90
+
+int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *))
+{
+	outb(H8300_TIMER_COUNT_DATA,TMR8CMA2);
+	outb(0x00,TMR8TCSR2);
+	request_irq(40,timer_int,0,"timer",0);
+	outb(0x40|0x08|0x03,TMR8TCNT2);
+	return 0;
+}
+
+void platform_timer_eoi(void)
+{
+        __asm__("bclr #6,@0xffff92:8");
+}
+#endif
+
+#if defined(H8_3002) || defined(CONFIG_H83048)
+#define TSTR 0x00ffff60
+#define TSNC 0x00ffff61
+#define TMDR 0x00ffff62
+#define TFCR 0x00ffff63
+#define TOER 0x00ffff90
+#define TOCR 0x00ffff91
+#define TCR  0x00ffff64
+#define TIOR 0x00ffff65
+#define TIER 0x00ffff66
+#define TSR  0x00ffff67
+#define TCNT 0x00ffff68
+#define GRA  0x00ffff6a
+#define GRB  0x00ffff6c
+
+int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *))
+{
+	*(unsigned short *)GRA= H8300_TIMER_COUNT_DATA;
+	*(unsigned short *)TCNT=0;
+	outb(0x23,TCR);
+	outb(0x00,TIOR);
+	request_irq(26,timer_int,0,"timer",0);
+	outb(inb(TIER) | 0x01,TIER);
+	outb(inb(TSNC) & ~0x01,TSNC);
+	outb(inb(TMDR) & ~0x01,TMDR);
+	outb(inb(TSTR) | 0x01,TSTR);
+	return 0;
+}
+
+void platform_timer_eoi(void)
+{
+	outb(inb(TSR) & ~0x01,TSR);
+}
+#endif
+
+void platform_gettod(int *year, int *mon, int *day, int *hour,
+		 int *min, int *sec)
+{
+	*year = *mon = *day = *hour = *min = *sec = 0;
+}
diff -Nru a/arch/h8300/platform/h8300h/h8max/Makefile b/arch/h8300/platform/h8300h/h8max/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/h8max/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,16 @@
+#
+# Makefile for the linux kernel.
+#
+# Note! Dependencies are done automagically by 'make dep', which also
+# removes any old dependencies. DON'T put your own dependencies here
+# unless it's something special (ie not a .c file).
+#
+
+all: $(BOARD).o
+O_TARGET := $(BOARD).o
+obj-y := timer.o
+
+timer.o: timer.c
+
+clean:
+	rm -f *.[oa]
diff -Nru a/arch/h8300/platform/h8300h/h8max/crt0_ram.S b/arch/h8300/platform/h8300h/h8max/crt0_ram.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/h8max/crt0_ram.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,109 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/h8max/crt0_ram.S
+ *
+ *  Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ *  Platform depend startup for uClinux-2.4.x
+ *  Target Archtecture:	H8MAX
+ *  Memory Layout     :	RAM
+ */
+
+#define ASSEMBLY
+
+#include <linux/config.h>
+#include <asm/linkage.h>
+	
+	.global SYMBOL_NAME(_start)
+	.global SYMBOL_NAME(command_line)
+	.global SYMBOL_NAME(_platform_gpio_table)
+	.global SYMBOL_NAME(_target_name)
+	
+	.h8300h
+
+	.section .text
+	.file	"crt0_ram.S"
+
+	/* CPU Reset entry */
+SYMBOL_NAME_LABEL(_start)
+	mov.l	#__ramend,sp
+	ldc	#0x80,ccr
+
+	/* Peripheral Setup */
+	
+	/* .bss clear */
+	mov.l	#__sbss,er5
+	mov.l	er5,er6
+	inc.l	#1,er6
+	mov.l	#__ebss,er4
+	sub.l	er5,er4
+	sub.w	r0,r0
+	mov.b	r0l,@er5
+1:	
+	eepmov.w
+	dec.w	#1,e4
+	bpl	1b
+
+	/* copy kernel commandline */
+	mov.l	#COMMAND_START,er5
+	mov.l	#SYMBOL_NAME(command_line),er6
+	mov.w	#512,r4
+	eepmov.w
+
+	/* RAM Interrupt Vector Table Setup */
+#if defined(CONFIG_GDB_DEBUG)
+	mov.l	@SYMBOL_NAME(interrupt_redirect_table)+11*4,er0
+#endif
+	mov.l	#SYMBOL_NAME(_vector_lma),er5
+	mov.l	#SYMBOL_NAME(interrupt_redirect_table),er6
+	mov.w	#0x100,r4
+	eepmov.w
+#if defined(CONFIG_GDB_DEBUG)
+	mov.l	er0,@SYMBOL_NAME(interrupt_redirect_table)+11*4
+#endif
+
+	/* uClinux kernel start */
+	ldc	#0x90,ccr	/* running kernel */
+	mov.l	#SYMBOL_NAME(init_task_union),sp
+	mov.l	sp,@SYMBOL_NAME(_current_task)
+	add.l	#0x2000,sp
+	jsr	@_start_kernel
+_exit:
+
+	jmp	_exit
+
+	rts
+
+	/* I/O port assign information */
+__platform_gpio_table:	
+	mov.l	#gpio_table,er0
+	rts
+
+gpio_table:
+	;; P1DDR
+	.byte	0xff,0xff
+	;; P2DDR
+	.byte	0xff,0xff
+	;; P3DDR
+	.byte	0x00,0x00
+	;; P4DDR
+	.byte	0x00,0x00
+	;; P5DDR
+	.byte	0x01,0x01
+	;; P6DDR
+	.byte	0xf6,0xf6
+	;; dummy
+	.byte	0x00,0x00
+	;; P8DDR
+	.byte	0xee,0xee
+	;; P9DDR
+	.byte	0x00,0x00
+	;; PADDR
+	.byte	0x00,0x00
+	;; PBDDR
+	.byte	0x30,0x30
+
+__target_name:	
+	.asciz	"H8MAX"
+	
+	.section .bootvec,"ax"
+	jmp	@SYMBOL_NAME(_start)
diff -Nru a/arch/h8300/platform/h8300h/h8max/ram.ld b/arch/h8300/platform/h8300h/h8max/ram.ld
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/h8max/ram.ld	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,90 @@
+/* H8MAX RAM */
+
+OUTPUT_ARCH(h8300h)
+ENTRY("__start")
+
+MEMORY 
+	{
+	ram    : ORIGIN = 0x400000, LENGTH = 0x600000-0x400000-0xc000
+	disk   : ORIGIN = 0x600000-0xc000, LENGTH = 0xc000
+	eram   : ORIGIN = 0x600000, LENGTH = 0
+        iram   : ORIGIN = 0xfffd20, LENGTH = 0x100
+	}
+
+SECTIONS
+{
+	.bootvec :
+	{
+	*(.bootvec)
+	} > ram
+        .text :
+	{
+	__stext = . ;
+        	*(.text)
+	. = ALIGN(0x4) ;
+		*(.text.*)
+	. = ALIGN(0x4) ;
+		*(.kstrtab)
+	. = ALIGN(0x4) ;
+		*(.rodata*)
+	. = ALIGN(16);          /* Exception table              */
+	___start___ex_table = .;
+		*(__ex_table)
+	___stop___ex_table = .;
+
+        ___start___ksymtab = .;  /* Kernel symbol table          */
+		 *(__ksymtab)
+	___stop___ksymtab = .;
+
+	. = ALIGN(0x4) ;
+	__etext = . ;
+        } > ram
+	.data : 
+	{
+	__sdata = . ;
+	___data_start = . ;
+		*(.data)
+		*(.data.*)	
+		*(.exitcall.exit)
+
+	. = ALIGN(0x2000) ;
+		*(.data.init_task)
+	. = ALIGN(0x2000) ;
+        ___init_begin = .;
+        *(.text.init)
+        *(.data.init)
+        . = ALIGN(16);
+        ___setup_start = .;
+        *(.setup.init)
+        ___setup_end = .;
+        ___initcall_start = .;
+        *(.initcall.init)
+        . = ALIGN(4) ;
+        ___initcall_end = .;
+        ___init_end = .;
+	__edata = . ;
+	. = ALIGN(0x4) ;
+	__sbss = . ;
+		*(.bss)
+	. = ALIGN(0x4) ;
+		*(COMMON)
+	. = ALIGN(0x4) ;
+	__ebss = . ;
+	__end = . ;
+	__ramstart = .;
+	} > ram
+	.blkimg :
+	{
+	__ramend = . ;
+	__blkimg = . ;
+	} > disk
+	.ram_vec : AT(ADDR(.data) + SIZEOF(.data))
+	{
+		*(.int_redirect)
+	} > iram 
+	__vector_lma = LOADADDR(.ram_vec);
+        .dummy2 :
+        {
+        COMMAND_START = . - 0x200 ;
+	} > eram
+}
diff -Nru a/arch/h8300/platform/h8300h/h8max/timer.c b/arch/h8300/platform/h8300h/h8max/timer.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/h8max/timer.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,46 @@
+/*
+ *  linux/arch/h8300/platform/h8300h/h8max/timer.c
+ *
+ *  Yoshinori Sato <ysato@users.sourcefoge.jp>
+ *
+ *  Platform depend Timer Handler
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/errno.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/param.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+
+#include <asm/segment.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+
+#include <linux/timex.h>
+
+#define TMR8CMA2 0x00ffff94
+#define TMR8TCSR2 0x00ffff92
+#define TMR8TCNT2 0x00ffff90
+#define CMFA 6
+
+int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *))
+{
+	outb(CONFIG_CLK_FREQ*10/8192,TMR8CMA2);
+	outb(0x00,TMR8TCSR2);
+	request_irq(40,timer_int,0,"timer",0);
+	outb(0x40|0x08|0x03,TMR8TCNT2);
+}
+
+void platform_timer_eoi(void)
+{
+	*(unsigned char *)TMR8TCSR2 &= ~(1 << CMFA);
+}
+
+void platform_gettod(int *year, int *mon, int *day, int *hour,
+		 int *min, int *sec)
+{
+	*year = *mon = *day = *hour = *min = *sec = 0;
+}
diff -Nru a/arch/h8300/platform/h8300h/ints.c b/arch/h8300/platform/h8300h/ints.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/platform/h8300h/ints.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,252 @@
+/*
+ * linux/arch/h8300/platform/h8300h/ints.c
+ *
+ * Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * Based on linux/arch/$(ARCH)/platform/$(PLATFORM)/ints.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 1996 Roman Zippel
+ * Copyright 1999 D. Jeff Dionne <jeff@rt-control.com>
+ */
+
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/kernel_stat.h>
+#include <linux/seq_file.h>
+
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/traps.h>
+#include <asm/io.h>
+#include <asm/setup.h>
+#include <asm/gpio.h>
+#include <asm/hardirq.h>
+#include <asm/regs306x.h>
+
+#define INTERNAL_IRQS (64)
+
+#define EXT_IRQ0 12
+#define EXT_IRQ1 13
+#define EXT_IRQ2 14
+#define EXT_IRQ3 15
+#define EXT_IRQ4 16
+#define EXT_IRQ5 17
+#define EXT_IRQ6 18
+#define EXT_IRQ7 19
+
+#define WDT_IRQ 20
+
+/* table for system interrupt handlers */
+static irq_handler_t irq_list[SYS_IRQS];
+
+/* The number of spurious interrupts */
+volatile unsigned int num_spurious;
+
+/* assembler routines */
+asmlinkage void system_call(void);
+asmlinkage void bad_interrupt(void);
+
+/* irq node variables for the 32 (potential) on chip sources */
+/*static irq_node_t *int_irq_list[INTERNAL_IRQS];*/
+static int int_irq_count[INTERNAL_IRQS];
+
+#if 0
+static void int_badint(int irq, void *dev_id, struct pt_regs *fp)
+{
+	num_spurious += 1;
+}
+#endif
+
+void init_IRQ(void)
+{
+	int i;
+
+	for (i = 0; i < SYS_IRQS; i++) {
+		irq_list[i].handler = NULL;
+		irq_list[i].flags   = 0;
+		irq_list[i].devname = NULL;
+		irq_list[i].dev_id  = NULL;
+	}
+
+}
+
+int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),
+                unsigned long flags, const char *devname, void *dev_id)
+{
+	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ3) {
+		if (H8300_GPIO_RESERVE(H8300_GPIO_P8, 1 << (irq - EXT_IRQ0)) == 0)
+			return 1;
+		H8300_GPIO_DDR(H8300_GPIO_P8, (irq - EXT_IRQ0), 0);
+	}
+	if (irq >= EXT_IRQ4 && irq <= EXT_IRQ5) {
+		if (H8300_GPIO_RESERVE(H8300_GPIO_P9, 1 << (irq - EXT_IRQ0)) == 0)
+			return 1;
+		H8300_GPIO_DDR(H8300_GPIO_P9, (irq - EXT_IRQ0), 0);
+	}
+	irq_list[irq].handler = handler;
+	irq_list[irq].flags   = flags;
+	irq_list[irq].devname = devname;
+	irq_list[irq].dev_id  = dev_id;
+	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ5)
+		*(volatile unsigned char *)IER |= 1 << (irq - EXT_IRQ0);
+	return 0;
+}
+
+void free_irq(unsigned int irq, void *dev_id)
+{
+	if (irq_list[irq].dev_id != dev_id)
+		printk("%s: Removing probably wrong IRQ %d from %s\n",
+		       __FUNCTION__, irq, irq_list[irq].devname);
+	if (irq >= EXT_IRQ0 && irq <= EXT_IRQ5)
+		*(volatile unsigned char *)IER &= ~(1 << (irq - EXT_IRQ0));
+	irq_list[irq].handler = NULL;
+	irq_list[irq].flags   = 0;
+	irq_list[irq].dev_id  = NULL;
+	irq_list[irq].devname = NULL;
+}
+
+/*
+ * Do we need these probe functions on the m68k?
+ */
+unsigned long probe_irq_on (void)
+{
+	return 0;
+}
+
+int probe_irq_off (unsigned long irqs)
+{
+	return 0;
+}
+
+struct int_regs {
+	unsigned long ier;
+	unsigned long isr;
+	unsigned char mask;
+};
+
+#define REGS_DEF(ier,isr,mask) {ier,isr,mask}
+
+const struct int_regs interrupt_registers[]= {
+	REGS_DEF(IER,ISR,0x01),
+	REGS_DEF(IER,ISR,0x02),
+	REGS_DEF(IER,ISR,0x04),
+	REGS_DEF(IER,ISR,0x08),
+	REGS_DEF(IER,ISR,0x10),
+	REGS_DEF(IER,ISR,0x20),
+	REGS_DEF(IER,ISR,0x40),
+	REGS_DEF(IER,ISR,0x80),
+	REGS_DEF(TCSR,TCSR,0x20),
+	REGS_DEF(RTMCSR,RTMCSR,0x40),
+	REGS_DEF(0,0,0),
+	REGS_DEF(ADCSR,ADCSR,0x40),
+	REGS_DEF(TISRA,TISRA,0x10),
+	REGS_DEF(TISRB,TISRB,0x10),
+	REGS_DEF(TISRC,TISRC,0x10),
+	REGS_DEF(0,0,0),
+	REGS_DEF(TISRA,TISRA,0x20),
+	REGS_DEF(TISRB,TISRB,0x20),
+	REGS_DEF(TISRC,TISRC,0x20),
+	REGS_DEF(0,0,0),
+	REGS_DEF(TISRA,TISRA,0x40),
+	REGS_DEF(TISRB,TISRB,0x40),
+	REGS_DEF(TISRC,TISRC,0x40),
+	REGS_DEF(0,0,0),
+	REGS_DEF(_8TCR0,_8TCSR0,0x40),
+	REGS_DEF(_8TCR0,_8TCSR0,0x80),
+	REGS_DEF(_8TCR1,_8TCSR1,0xC0),
+	REGS_DEF(_8TCR0,_8TCSR0,0x20),
+	REGS_DEF(_8TCR2,_8TCSR2,0x40),
+	REGS_DEF(_8TCR2,_8TCSR2,0x80),
+	REGS_DEF(_8TCR3,_8TCSR3,0xC0),
+	REGS_DEF(_8TCR2,_8TCSR2,0x20),
+	REGS_DEF(DTCR0A,DTCR0A,0x0),
+	REGS_DEF(DTCR0B,DTCR0B,0x0),
+	REGS_DEF(DTCR1A,DTCR1A,0x0),
+	REGS_DEF(DTCR1B,DTCR1B,0x0),
+	REGS_DEF(0,0,0),
+	REGS_DEF(0,0,0),
+	REGS_DEF(0,0,0),
+	REGS_DEF(0,0,0),
+	REGS_DEF(SCR0,SSR0,0x40),
+	REGS_DEF(SCR0,SSR0,0x40),
+	REGS_DEF(SCR0,SSR0,0x80),
+	REGS_DEF(SCR0,SSR0,0x04),
+	REGS_DEF(SCR1,SSR1,0x40),
+	REGS_DEF(SCR1,SSR1,0x40),
+	REGS_DEF(SCR1,SSR1,0x80),
+	REGS_DEF(SCR1,SSR1,0x04),
+	REGS_DEF(SCR2,SSR2,0x40),
+	REGS_DEF(SCR2,SSR2,0x40),
+	REGS_DEF(SCR2,SSR2,0x80),
+	REGS_DEF(SCR2,SSR2,0x04)
+};
+
+void enable_irq(unsigned int irq)
+{
+	unsigned char ier;
+	const struct int_regs *regs=&interrupt_registers[irq - 12];
+	if (irq == WDT_IRQ) {
+		ier = ctrl_inb(TCSR);
+		ier |= 0x20;
+		ctrl_outb((0xa500 | ier),TCSR);
+	} else {
+		if ((irq > 12) && regs->ier) {
+			ier = ctrl_inb(regs->ier);
+			ier |= regs->mask;
+			ctrl_outb(ier, regs->ier);
+		} else
+			panic("Unknown interrupt vector");
+	}
+}
+
+void disable_irq(unsigned int irq)
+{
+	unsigned char ier;
+	const struct int_regs *regs=&interrupt_registers[irq - 12];
+	if (irq == WDT_IRQ) {
+		ier = ctrl_inb(TCSR);
+		ier &= ~0x20;
+		ctrl_outb((0xa500 | ier),TCSR);
+	} else {
+		if ((irq > 12) && regs->ier) {
+			ier = ctrl_inb(regs->ier);
+			ier &= ~(regs->mask);
+			ctrl_outb(ier, regs->ier);
+		} else
+			panic("Unknown interrupt vector");
+	}
+}
+
+asmlinkage void process_int(unsigned long vec, struct pt_regs *fp)
+{
+	irq_enter();
+	if (irq_list[vec].handler) {
+		irq_list[vec].handler(vec, irq_list[vec].dev_id, fp);
+		int_irq_count[vec]++;
+	} else
+		panic("No interrupt handler for %ld\n", vec);
+	if (vec >= EXT_IRQ0 && vec <= EXT_IRQ5)
+		*(volatile unsigned char *)ISR &= ~(1 << (vec - EXT_IRQ0));
+	irq_exit();
+}
+
+int show_interrupts(struct seq_file *p, void *v)
+{
+	int i;
+
+	for (i = 0; i < NR_IRQS; i++) {
+		seq_printf(p, "%3d: %10u ",i,int_irq_count[i]);
+		seq_printf(p, "%s\n", irq_list[i].devname);
+	}
+
+	return 0;
+}
+
+void init_irq_proc(void)
+{
+}
diff -Nru a/arch/h8300/vmlinux.lds.S b/arch/h8300/vmlinux.lds.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/h8300/vmlinux.lds.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,38 @@
+#include <linux/config.h>
+
+#ifdef CONFIG_H8300H_GENERIC
+#ifdef CONFIG_ROMKERNEL
+#include "platform/h8300h/generic/rom.ld"
+#endif
+#ifdef CONFIG_RAMKERNEL
+#include "platform/h8300h/generic/ram.ld"
+#endif
+#endif
+
+#ifdef CONFIG_H8300H_AKI3068NET
+#ifdef CONFIG_ROMKERNEL
+#include "platform/h8300h/aki3068net/rom.ld"
+#endif
+#ifdef CONFIG_RAMKERNEL
+#include "platform/h8300h/aki3068net/ram.ld"
+#endif
+#endif
+
+#ifdef CONFIG_H8300H_H8MAX
+#ifdef CONFIG_ROMKERNEL
+#include "platform/h8300h/h8max/rom.ld"
+#endif
+#ifdef CONFIG_RAMKERNEL
+#include "platform/h8300h/h8max/ram.ld"
+#endif
+#endif
+
+#ifdef CONFIG_H8300H_SIM
+#ifdef CONFIG_ROMKERNEL
+#include "platform/h8300h/generic/rom.ld"
+#endif
+#ifdef CONFIG_RAMKERNEL
+#include "platform/h8300h/generic/ram.ld"
+#endif
+#endif
+
diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig
--- a/arch/i386/Kconfig	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/Kconfig	Sat Apr 19 19:51:28 2003
@@ -142,7 +142,7 @@
 config M486
 	bool "486"
 	help
-	  Select this for a x486 processor, ether Intel or one of the
+	  Select this for a 486 series processor, either Intel or one of the
 	  compatible processors from AMD, Cyrix, IBM, or Intel.  Includes DX,
 	  DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or
 	  U5S.
@@ -150,8 +150,8 @@
 config M586
 	bool "586/K5/5x86/6x86/6x86MX"
 	help
-	  Select this for an x586 or x686 processor such as the AMD K5, the
-	  Intel 5x86 or 6x86, or the Intel 6x86MX.  This choice does not
+	  Select this for an 586 or 686 series processor such as the AMD K5,
+	  the Intel 5x86 or 6x86, or the Intel 6x86MX.  This choice does not
 	  assume the RDTSC (Read Time Stamp Counter) instruction.
 
 config M586TSC
@@ -226,28 +226,28 @@
 config MCRUSOE
 	bool "Crusoe"
 	help
-	  Select this for Transmeta Crusoe processor.  Treats the processor
+	  Select this for a Transmeta Crusoe processor.  Treats the processor
 	  like a 586 with TSC, and sets some GCC optimization flags (like a
 	  Pentium Pro with no alignment requirements).
 
 config MWINCHIPC6
 	bool "Winchip-C6"
 	help
-	  Select this for a IDT Winchip C6 chip.  Linux and GCC
+	  Select this for an IDT Winchip C6 chip.  Linux and GCC
 	  treat this chip as a 586TSC with some extended instructions
 	  and alignment requirements.
 
 config MWINCHIP2
 	bool "Winchip-2"
 	help
-	  Select this for a IDT Winchip-2.  Linux and GCC
+	  Select this for an IDT Winchip-2.  Linux and GCC
 	  treat this chip as a 586TSC with some extended instructions
 	  and alignment requirements.
 
 config MWINCHIP3D
 	bool "Winchip-2A/Winchip-3"
 	help
-	  Select this for a IDT Winchip-2A or 3.  Linux and GCC
+	  Select this for an IDT Winchip-2A or 3.  Linux and GCC
 	  treat this chip as a 586TSC with some extended instructions
 	  and alignment reqirements.  Development kernels also enable
 	  out of order memory stores for this CPU, which can increase
@@ -260,15 +260,15 @@
 	  treat this chip as a generic 586. Whilst the CPU is 686 class,
 	  it lacks the cmov extension which gcc assumes is present when
 	  generating 686 code.
-	  Note, that Nehemiah (Model 9) and above will not boot with this
-	  kernel due to them lacking the 3dnow instructions used in earlier
+	  Note that Nehemiah (Model 9) and above will not boot with this
+	  kernel due to them lacking the 3DNow! instructions used in earlier
 	  incarnations of the CPU.
 
 config MVIAC3_2
 	bool "VIA C3-2 (Nehemiah)"
 	help
-	  Select this for a VIA C3 "Nehemiah". Selecting this enables usage of SSE
-	  and tells gcc to treat the CPU as a 686.
+	  Select this for a VIA C3 "Nehemiah". Selecting this enables usage
+	  of SSE and tells gcc to treat the CPU as a 686.
 	  Note, this kernel will not boot on older (pre model 9) C3s.
 
 endchoice
@@ -435,7 +435,8 @@
 	  enable and use it. If you say Y here even though your machine doesn't
 	  have a local APIC, then the kernel will still run with no slowdown at
 	  all. The local APIC supports CPU-generated self-interrupts (timer,
-	  performance counters), and the NMI watchdog which detects hard lockups.
+	  performance counters), and the NMI watchdog which detects hard
+	  lockups.
 
 	  If you have a system with several CPUs, you do not need to say Y
 	  here: the local APIC will be used automatically.
@@ -522,7 +523,7 @@
 	---help---
 	  This adds a driver to safely access the System Management Mode of
 	  the CPU on Toshiba portables with a genuine Toshiba BIOS. It does
-	  not work on models with a Pheonix BIOS. The System Management Mode
+	  not work on models with a Phoenix BIOS. The System Management Mode
 	  is used to set the BIOS and power saving options on Toshiba portables.
 
 	  For information on utilities to make use of this driver see the
diff -Nru a/arch/i386/boot/compressed/misc.c b/arch/i386/boot/compressed/misc.c
--- a/arch/i386/boot/compressed/misc.c	Sat Apr 19 19:51:48 2003
+++ b/arch/i386/boot/compressed/misc.c	Sat Apr 19 19:51:48 2003
@@ -12,6 +12,7 @@
 #include <linux/linkage.h>
 #include <linux/vmalloc.h>
 #include <linux/tty.h>
+#include <video/edid.h>
 #include <asm/io.h>
 
 /*
@@ -91,6 +92,7 @@
 #define ALT_MEM_K   (*(unsigned long *)(real_mode + 0x1e0))
 #endif
 #define SCREEN_INFO (*(struct screen_info *)(real_mode+0))
+#define EDID_INFO   (*(struct edid_info *)(real_mode+0x440))
 
 extern char input_data[];
 extern int input_len;
diff -Nru a/arch/i386/boot/setup.S b/arch/i386/boot/setup.S
--- a/arch/i386/boot/setup.S	Sat Apr 19 19:51:48 2003
+++ b/arch/i386/boot/setup.S	Sat Apr 19 19:51:48 2003
@@ -213,7 +213,7 @@
 # Part of above routine, this one just prints ascii al
 prtchr:	pushw	%ax
 	pushw	%cx
-	xorb	%bh, %bh
+	movw	$7,%bx
 	movw	$0x01, %cx
 	movb	$0x0e, %ah
 	int	$0x10
diff -Nru a/arch/i386/boot/video.S b/arch/i386/boot/video.S
--- a/arch/i386/boot/video.S	Sat Apr 19 19:51:29 2003
+++ b/arch/i386/boot/video.S	Sat Apr 19 19:51:29 2003
@@ -133,6 +133,7 @@
 #ifdef CONFIG_VIDEO_RETAIN
 	call	restore_screen			# Restore screen contents
 #endif /* CONFIG_VIDEO_RETAIN */
+	call	store_edid
 #endif /* CONFIG_VIDEO_SELECT */
 	call	mode_params			# Store mode parameters
 	popw	%ds				# Restore original DS
@@ -1885,6 +1886,39 @@
 	call	prtchr	
 	popw	%cx
 	popw	%ax
+	ret
+
+store_edid:
+	pushw	%es				# just save all registers 
+	pushw	%ax				
+	pushw	%bx
+	pushw   %cx
+	pushw	%dx
+	pushw   %di
+
+	pushw	%fs                             
+	popw    %es
+
+	movl	$0x13131313, %eax		# memset block with 0x13
+	movw    $32, %cx
+	movw	$0x440, %di
+	cld
+	rep 
+	stosl  
+
+	movw	$0x4f15, %ax                    # do VBE/DDC 
+	movw	$0x01, %bx
+	movw	$0x00, %cx
+	movw    $0x01, %dx
+	movw	$0x440, %di
+	int	$0x10	
+
+	popw	%di				# restore all registers        
+	popw	%dx
+	popw	%cx
+	popw	%bx
+	popw	%ax
+	popw	%es	
 	ret
 
 # VIDEO_SELECT-only variables
diff -Nru a/arch/i386/kernel/apic.c b/arch/i386/kernel/apic.c
--- a/arch/i386/kernel/apic.c	Sat Apr 19 19:51:51 2003
+++ b/arch/i386/kernel/apic.c	Sat Apr 19 19:51:51 2003
@@ -36,6 +36,8 @@
 
 #include <mach_apic.h>
 
+#include "io_ports.h"
+
 void __init apic_intr_init(void)
 {
 #ifdef CONFIG_SMP
@@ -739,9 +741,9 @@
 
 	spin_lock_irqsave(&i8253_lock, flags);
 
-	outb_p(0x00, 0x43);
-	count = inb_p(0x40);
-	count |= inb_p(0x40) << 8;
+	outb_p(0x00, PIT_MODE);
+	count = inb_p(PIT_CH0);
+	count |= inb_p(PIT_CH0) << 8;
 
 	spin_unlock_irqrestore(&i8253_lock, flags);
 
diff -Nru a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c
--- a/arch/i386/kernel/apm.c	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/kernel/apm.c	Sat Apr 19 19:51:28 2003
@@ -227,6 +227,8 @@
 #include <asm/uaccess.h>
 #include <asm/desc.h>
 
+#include "io_ports.h"
+
 extern spinlock_t i8253_lock;
 extern unsigned long get_cmos_time(void);
 extern void machine_real_restart(unsigned char *, int);
@@ -295,6 +297,8 @@
  */
 #define APM_ZERO_SEGS
 
+#include "apm.h"
+
 /*
  * Define to make all _set_limit calls use 64k limits.  The APM 1.1 BIOS is
  * supposed to provide limit information that it recognizes.  Many machines
@@ -556,24 +560,11 @@
 		unsigned int saved_fs; unsigned int saved_gs;
 #	define APM_DO_SAVE_SEGS \
 		savesegment(fs, saved_fs); savesegment(gs, saved_gs)
-#	define APM_DO_ZERO_SEGS \
-		"pushl %%ds\n\t" \
-		"pushl %%es\n\t" \
-		"xorl %%edx, %%edx\n\t" \
-		"mov %%dx, %%ds\n\t" \
-		"mov %%dx, %%es\n\t" \
-		"mov %%dx, %%fs\n\t" \
-		"mov %%dx, %%gs\n\t"
-#	define APM_DO_POP_SEGS \
-		"popl %%es\n\t" \
-		"popl %%ds\n\t"
 #	define APM_DO_RESTORE_SEGS \
 		loadsegment(fs, saved_fs); loadsegment(gs, saved_gs)
 #else
 #	define APM_DECL_SEGS
 #	define APM_DO_SAVE_SEGS
-#	define APM_DO_ZERO_SEGS
-#	define APM_DO_POP_SEGS
 #	define APM_DO_RESTORE_SEGS
 #endif
 
@@ -615,22 +606,7 @@
 	local_save_flags(flags);
 	APM_DO_CLI;
 	APM_DO_SAVE_SEGS;
-	/*
-	 * N.B. We do NOT need a cld after the BIOS call
-	 * because we always save and restore the flags.
-	 */
-	__asm__ __volatile__(APM_DO_ZERO_SEGS
-		"pushl %%edi\n\t"
-		"pushl %%ebp\n\t"
-		"lcall *%%cs:apm_bios_entry\n\t"
-		"setc %%al\n\t"
-		"popl %%ebp\n\t"
-		"popl %%edi\n\t"
-		APM_DO_POP_SEGS
-		: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx),
-		  "=S" (*esi)
-		: "a" (func), "b" (ebx_in), "c" (ecx_in)
-		: "memory", "cc");
+	apm_bios_call_asm(func, ebx_in, ecx_in, eax, ebx, ecx, edx, esi);
 	APM_DO_RESTORE_SEGS;
 	local_irq_restore(flags);
 	cpu_gdt_table[cpu][0x40 / 8] = save_desc_40;
@@ -673,26 +649,7 @@
 	local_save_flags(flags);
 	APM_DO_CLI;
 	APM_DO_SAVE_SEGS;
-	{
-		int	cx, dx, si;
-
-		/*
-		 * N.B. We do NOT need a cld after the BIOS call
-		 * because we always save and restore the flags.
-		 */
-		__asm__ __volatile__(APM_DO_ZERO_SEGS
-			"pushl %%edi\n\t"
-			"pushl %%ebp\n\t"
-			"lcall *%%cs:apm_bios_entry\n\t"
-			"setc %%bl\n\t"
-			"popl %%ebp\n\t"
-			"popl %%edi\n\t"
-			APM_DO_POP_SEGS
-			: "=a" (*eax), "=b" (error), "=c" (cx), "=d" (dx),
-			  "=S" (si)
-			: "a" (func), "b" (ebx_in), "c" (ecx_in)
-			: "memory", "cc");
-	}
+	error = apm_bios_call_simple_asm(func, ebx_in, ecx_in, eax);
 	APM_DO_RESTORE_SEGS;
 	local_irq_restore(flags);
 	cpu_gdt_table[smp_processor_id()][0x40 / 8] = save_desc_40;
@@ -1212,11 +1169,11 @@
 {
 #ifdef INIT_TIMER_AFTER_SUSPEND
 	/* set the clock to 100 Hz */
-	outb_p(0x34,0x43);		/* binary, mode 2, LSB/MSB, ch 0 */
+	outb_p(0x34, PIT_MODE);		/* binary, mode 2, LSB/MSB, ch 0 */
 	udelay(10);
-	outb_p(LATCH & 0xff , 0x40);	/* LSB */
+	outb_p(LATCH & 0xff, PIT_CH0);	/* LSB */
 	udelay(10);
-	outb(LATCH >> 8 , 0x40);	/* MSB */
+	outb(LATCH >> 8, PIT_CH0);	/* MSB */
 	udelay(10);
 #endif
 }
diff -Nru a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c
--- a/arch/i386/kernel/cpu/common.c	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/kernel/cpu/common.c	Sat Apr 19 19:51:28 2003
@@ -217,6 +217,10 @@
 			c->x86_capability[4] = excap;
 			c->x86 = (tfms >> 8) & 15;
 			c->x86_model = (tfms >> 4) & 15;
+			if (c->x86 == 0xf) {
+				c->x86 += (tfms >> 20) & 0xff;
+				c->x86_model += ((tfms >> 16) & 0xF) << 4;
+			} 
 			c->x86_mask = tfms & 15;
 		} else {
 			/* Have CPUID level 0 only - unheard of */
diff -Nru a/arch/i386/kernel/cpu/mcheck/k7.c b/arch/i386/kernel/cpu/mcheck/k7.c
--- a/arch/i386/kernel/cpu/mcheck/k7.c	Sat Apr 19 19:51:48 2003
+++ b/arch/i386/kernel/cpu/mcheck/k7.c	Sat Apr 19 19:51:48 2003
@@ -92,8 +92,4 @@
 	set_in_cr4 (X86_CR4_MCE);
 	printk (KERN_INFO "Intel machine check reporting enabled on CPU#%d.\n",
 		smp_processor_id());
-
-#ifdef CONFIG_X86_MCE_NONFATAL
-	init_nonfatal_mce_checker();
-#endif
 }
diff -Nru a/arch/i386/kernel/cpu/mcheck/mce.h b/arch/i386/kernel/cpu/mcheck/mce.h
--- a/arch/i386/kernel/cpu/mcheck/mce.h	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/kernel/cpu/mcheck/mce.h	Sat Apr 19 19:51:28 2003
@@ -6,8 +6,6 @@
 void intel_p6_mcheck_init(struct cpuinfo_x86 *c);
 void winchip_mcheck_init(struct cpuinfo_x86 *c);
 
-void init_nonfatal_mce_checker(void);
-
 /* Call the installed machine check handler for this CPU setup. */
 extern void (*machine_check_vector)(struct pt_regs *, long error_code);
 
diff -Nru a/arch/i386/kernel/cpu/mcheck/non-fatal.c b/arch/i386/kernel/cpu/mcheck/non-fatal.c
--- a/arch/i386/kernel/cpu/mcheck/non-fatal.c	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/kernel/cpu/mcheck/non-fatal.c	Sat Apr 19 19:51:28 2003
@@ -11,6 +11,7 @@
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 #include <linux/smp.h>
+#include <linux/module.h>
 
 #include <asm/processor.h> 
 #include <asm/system.h>
@@ -65,7 +66,7 @@
 	add_timer (&mce_timer);
 }	
 
-void init_nonfatal_mce_checker()
+static int __init init_nonfatal_mce_checker(void)
 {
 	if (timerset == 0) {
 		/* Set the timer to check for non-fatal
@@ -78,4 +79,6 @@
 		timerset = 1;
 		printk(KERN_INFO "Machine check exception polling timer started.\n");
 	}
+	return 0;
 }
+module_init(init_nonfatal_mce_checker);
diff -Nru a/arch/i386/kernel/cpu/mcheck/p4.c b/arch/i386/kernel/cpu/mcheck/p4.c
--- a/arch/i386/kernel/cpu/mcheck/p4.c	Sat Apr 19 19:51:49 2003
+++ b/arch/i386/kernel/cpu/mcheck/p4.c	Sat Apr 19 19:51:49 2003
@@ -255,7 +255,4 @@
 		intel_init_thermal(c);
 #endif
 	}
-#ifdef CONFIG_X86_MCE_NONFATAL
-	init_nonfatal_mce_checker();
-#endif
 }
diff -Nru a/arch/i386/kernel/cpu/proc.c b/arch/i386/kernel/cpu/proc.c
--- a/arch/i386/kernel/cpu/proc.c	Sat Apr 19 19:51:50 2003
+++ b/arch/i386/kernel/cpu/proc.c	Sat Apr 19 19:51:50 2003
@@ -96,7 +96,7 @@
 #endif
 	
 	/* We use exception 16 if we have hardware math and we've either seen it or the CPU claims it is internal */
-	fpu_exception = c->hard_math && (ignore_irq13 || cpu_has_fpu);
+	fpu_exception = c->hard_math && (ignore_fpu_irq || cpu_has_fpu);
 	seq_printf(m, "fdiv_bug\t: %s\n"
 			"hlt_bug\t\t: %s\n"
 			"f00f_bug\t: %s\n"
diff -Nru a/arch/i386/kernel/dmi_scan.c b/arch/i386/kernel/dmi_scan.c
--- a/arch/i386/kernel/dmi_scan.c	Sat Apr 19 19:51:46 2003
+++ b/arch/i386/kernel/dmi_scan.c	Sat Apr 19 19:51:46 2003
@@ -600,6 +600,11 @@
 			MATCH(DMI_BIOS_VERSION, "MV85010A.86A.0016.P07.0201251536"),
 			NO_MATCH, NO_MATCH,
 			} },
+	{ apm_is_horked, "Intel D810EMO", { /* APM crashes */
+			MATCH(DMI_BIOS_VENDOR, "Intel Corp."),
+			MATCH(DMI_BIOS_VERSION, "MO81010A.86A.0008.P04.0004170800"),
+			NO_MATCH, NO_MATCH,
+			} },
 	{ apm_is_horked, "Dell XPS-Z", { /* APM crashes */
 			MATCH(DMI_BIOS_VENDOR, "Intel Corp."),
 			MATCH(DMI_BIOS_VERSION, "A11"),
diff -Nru a/arch/i386/kernel/edd.c b/arch/i386/kernel/edd.c
--- a/arch/i386/kernel/edd.c	Sat Apr 19 19:51:46 2003
+++ b/arch/i386/kernel/edd.c	Sat Apr 19 19:51:46 2003
@@ -598,7 +598,7 @@
 	.default_attrs	= def_attrs,
 };
 
-static decl_subsys(edd,&ktype_edd);
+static decl_subsys(edd,&ktype_edd,NULL);
 
 
 /**
diff -Nru a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c
--- a/arch/i386/kernel/i386_ksyms.c	Sat Apr 19 19:51:51 2003
+++ b/arch/i386/kernel/i386_ksyms.c	Sat Apr 19 19:51:51 2003
@@ -79,6 +79,7 @@
 EXPORT_SYMBOL(dump_thread);
 EXPORT_SYMBOL(dump_fpu);
 EXPORT_SYMBOL(dump_extended_fpu);
+EXPORT_SYMBOL_GPL(kernel_fpu_begin);
 EXPORT_SYMBOL(__ioremap);
 EXPORT_SYMBOL(ioremap_nocache);
 EXPORT_SYMBOL(iounmap);
diff -Nru a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c
--- a/arch/i386/kernel/i387.c	Sat Apr 19 19:51:51 2003
+++ b/arch/i386/kernel/i387.c	Sat Apr 19 19:51:51 2003
@@ -40,10 +40,10 @@
 			tsk->thread.i387.fxsave.mxcsr = 0x1f80;
 	} else {
 		memset(&tsk->thread.i387.fsave, 0, sizeof(struct i387_fsave_struct));
-		tsk->thread.i387.fsave.cwd = 0xffff037f;
-		tsk->thread.i387.fsave.swd = 0xffff0000;
-		tsk->thread.i387.fsave.twd = 0xffffffff;
-		tsk->thread.i387.fsave.fos = 0xffff0000;
+		tsk->thread.i387.fsave.cwd = 0xffff037fu;
+		tsk->thread.i387.fsave.swd = 0xffff0000u;
+		tsk->thread.i387.fsave.twd = 0xffffffffu;
+		tsk->thread.i387.fsave.fos = 0xffff0000u;
 	}
 	tsk->used_math = 1;
 }
@@ -98,7 +98,7 @@
 	struct _fpxreg *st = NULL;
 	unsigned long twd = (unsigned long) fxsave->twd;
 	unsigned long tag;
-	unsigned long ret = 0xffff0000;
+	unsigned long ret = 0xffff0000u;
 	int i;
 
 #define FPREG_ADDR(f, n)	((char *)&(f)->st_space + (n) * 16);
@@ -183,7 +183,7 @@
 	if ( cpu_has_fxsr ) {
 		tsk->thread.i387.fxsave.cwd = cwd;
 	} else {
-		tsk->thread.i387.fsave.cwd = ((long)cwd | 0xffff0000);
+		tsk->thread.i387.fsave.cwd = ((long)cwd | 0xffff0000u);
 	}
 }
 
@@ -192,7 +192,7 @@
 	if ( cpu_has_fxsr ) {
 		tsk->thread.i387.fxsave.swd = swd;
 	} else {
-		tsk->thread.i387.fsave.swd = ((long)swd | 0xffff0000);
+		tsk->thread.i387.fsave.swd = ((long)swd | 0xffff0000u);
 	}
 }
 
@@ -201,7 +201,7 @@
 	if ( cpu_has_fxsr ) {
 		tsk->thread.i387.fxsave.twd = twd_i387_to_fxsr(twd);
 	} else {
-		tsk->thread.i387.fsave.twd = ((long)twd | 0xffff0000);
+		tsk->thread.i387.fsave.twd = ((long)twd | 0xffff0000u);
 	}
 }
 
@@ -216,16 +216,16 @@
  * FXSR floating point environment conversions.
  */
 
-static int convert_fxsr_to_user( struct _fpstate *buf,
+static int convert_fxsr_to_user( struct _fpstate __user *buf,
 					struct i387_fxsave_struct *fxsave )
 {
 	unsigned long env[7];
-	struct _fpreg *to;
+	struct _fpreg __user *to;
 	struct _fpxreg *from;
 	int i;
 
-	env[0] = (unsigned long)fxsave->cwd | 0xffff0000;
-	env[1] = (unsigned long)fxsave->swd | 0xffff0000;
+	env[0] = (unsigned long)fxsave->cwd | 0xffff0000ul;
+	env[1] = (unsigned long)fxsave->swd | 0xffff0000ul;
 	env[2] = twd_fxsr_to_i387(fxsave);
 	env[3] = fxsave->fip;
 	env[4] = fxsave->fcs | ((unsigned long)fxsave->fop << 16);
@@ -250,11 +250,11 @@
 }
 
 static int convert_fxsr_from_user( struct i387_fxsave_struct *fxsave,
-					  struct _fpstate *buf )
+					  struct _fpstate __user *buf )
 {
 	unsigned long env[7];
 	struct _fpxreg *to;
-	struct _fpreg *from;
+	struct _fpreg __user *from;
 	int i;
 
 	if ( __copy_from_user( env, buf, 7 * sizeof(long) ) )
@@ -264,7 +264,7 @@
 	fxsave->swd = (unsigned short)(env[1] & 0xffff);
 	fxsave->twd = twd_i387_to_fxsr((unsigned short)(env[2] & 0xffff));
 	fxsave->fip = env[3];
-	fxsave->fop = (unsigned short)((env[4] & 0xffff0000) >> 16);
+	fxsave->fop = (unsigned short)((env[4] & 0xffff0000ul) >> 16);
 	fxsave->fcs = (env[4] & 0xffff);
 	fxsave->foo = env[5];
 	fxsave->fos = env[6];
@@ -275,9 +275,9 @@
 		unsigned long *t = (unsigned long *)to;
 		unsigned long *f = (unsigned long *)from;
 
-		if (__get_user(*f, t) ||
-				__get_user(*(f + 1), t + 1) ||
-				__get_user(from->exponent, &to->exponent))
+		if (__get_user(*t, f) ||
+				__get_user(*(t + 1), f + 1) ||
+				__get_user(to->exponent, &from->exponent))
 			return 1;
 	}
 	return 0;
@@ -287,7 +287,7 @@
  * Signal frame handlers.
  */
 
-static inline int save_i387_fsave( struct _fpstate *buf )
+static inline int save_i387_fsave( struct _fpstate __user *buf )
 {
 	struct task_struct *tsk = current;
 
@@ -299,7 +299,7 @@
 	return 1;
 }
 
-static int save_i387_fxsave( struct _fpstate *buf )
+static int save_i387_fxsave( struct _fpstate __user *buf )
 {
 	struct task_struct *tsk = current;
 	int err = 0;
@@ -320,7 +320,7 @@
 	return 1;
 }
 
-int save_i387( struct _fpstate *buf )
+int save_i387( struct _fpstate __user *buf )
 {
 	if ( !current->used_math )
 		return 0;
@@ -341,7 +341,7 @@
 	}
 }
 
-static inline int restore_i387_fsave( struct _fpstate *buf )
+static inline int restore_i387_fsave( struct _fpstate __user *buf )
 {
 	struct task_struct *tsk = current;
 	clear_fpu( tsk );
@@ -349,7 +349,7 @@
 				 sizeof(struct i387_fsave_struct) );
 }
 
-static int restore_i387_fxsave( struct _fpstate *buf )
+static int restore_i387_fxsave( struct _fpstate __user *buf )
 {
 	int err;
 	struct task_struct *tsk = current;
@@ -361,7 +361,7 @@
 	return err ? 1 : convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf );
 }
 
-int restore_i387( struct _fpstate *buf )
+int restore_i387( struct _fpstate __user *buf )
 {
 	int err;
 
@@ -382,21 +382,21 @@
  * ptrace request handlers.
  */
 
-static inline int get_fpregs_fsave( struct user_i387_struct *buf,
+static inline int get_fpregs_fsave( struct user_i387_struct __user *buf,
 				    struct task_struct *tsk )
 {
 	return __copy_to_user( buf, &tsk->thread.i387.fsave,
 			       sizeof(struct user_i387_struct) );
 }
 
-static inline int get_fpregs_fxsave( struct user_i387_struct *buf,
+static inline int get_fpregs_fxsave( struct user_i387_struct __user *buf,
 				     struct task_struct *tsk )
 {
-	return convert_fxsr_to_user( (struct _fpstate *)buf,
+	return convert_fxsr_to_user( (struct _fpstate __user *)buf,
 				     &tsk->thread.i387.fxsave );
 }
 
-int get_fpregs( struct user_i387_struct *buf, struct task_struct *tsk )
+int get_fpregs( struct user_i387_struct __user *buf, struct task_struct *tsk )
 {
 	if ( HAVE_HWFP ) {
 		if ( cpu_has_fxsr ) {
@@ -406,25 +406,25 @@
 		}
 	} else {
 		return save_i387_soft( &tsk->thread.i387.soft,
-				       (struct _fpstate *)buf );
+				       (struct _fpstate __user *)buf );
 	}
 }
 
 static inline int set_fpregs_fsave( struct task_struct *tsk,
-				    struct user_i387_struct *buf )
+				    struct user_i387_struct __user *buf )
 {
 	return __copy_from_user( &tsk->thread.i387.fsave, buf,
 				 sizeof(struct user_i387_struct) );
 }
 
 static inline int set_fpregs_fxsave( struct task_struct *tsk,
-				     struct user_i387_struct *buf )
+				     struct user_i387_struct __user *buf )
 {
 	return convert_fxsr_from_user( &tsk->thread.i387.fxsave,
-				       (struct _fpstate *)buf );
+				       (struct _fpstate __user *)buf );
 }
 
-int set_fpregs( struct task_struct *tsk, struct user_i387_struct *buf )
+int set_fpregs( struct task_struct *tsk, struct user_i387_struct __user *buf )
 {
 	if ( HAVE_HWFP ) {
 		if ( cpu_has_fxsr ) {
@@ -434,14 +434,14 @@
 		}
 	} else {
 		return restore_i387_soft( &tsk->thread.i387.soft,
-					  (struct _fpstate *)buf );
+					  (struct _fpstate __user *)buf );
 	}
 }
 
-int get_fpxregs( struct user_fxsr_struct *buf, struct task_struct *tsk )
+int get_fpxregs( struct user_fxsr_struct __user *buf, struct task_struct *tsk )
 {
 	if ( cpu_has_fxsr ) {
-		if (__copy_to_user( (void *)buf, &tsk->thread.i387.fxsave,
+		if (__copy_to_user( buf, &tsk->thread.i387.fxsave,
 				    sizeof(struct user_fxsr_struct) ))
 			return -EFAULT;
 		return 0;
@@ -450,10 +450,10 @@
 	}
 }
 
-int set_fpxregs( struct task_struct *tsk, struct user_fxsr_struct *buf )
+int set_fpxregs( struct task_struct *tsk, struct user_fxsr_struct __user *buf )
 {
 	if ( cpu_has_fxsr ) {
-		__copy_from_user( &tsk->thread.i387.fxsave, (void *)buf,
+		__copy_from_user( &tsk->thread.i387.fxsave, buf,
 				  sizeof(struct user_fxsr_struct) );
 		/* mxcsr bit 6 and 31-16 must be zero for security reasons */
 		tsk->thread.i387.fxsave.mxcsr &= 0xffbf;
diff -Nru a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c
--- a/arch/i386/kernel/i8259.c	Sat Apr 19 19:51:50 2003
+++ b/arch/i386/kernel/i8259.c	Sat Apr 19 19:51:50 2003
@@ -26,6 +26,8 @@
 
 #include <linux/irq.h>
 
+#include <io_ports.h>
+
 /*
  * This is the 'legacy' 8259A Programmable Interrupt Controller,
  * present in the majority of PC/AT boxes.
@@ -93,9 +95,9 @@
 	spin_lock_irqsave(&i8259A_lock, flags);
 	cached_irq_mask |= mask;
 	if (irq & 8)
-		outb(cached_A1,0xA1);
+		outb(cached_slave_mask, PIC_SLAVE_IMR);
 	else
-		outb(cached_21,0x21);
+		outb(cached_master_mask, PIC_MASTER_IMR);
 	spin_unlock_irqrestore(&i8259A_lock, flags);
 }
 
@@ -107,9 +109,9 @@
 	spin_lock_irqsave(&i8259A_lock, flags);
 	cached_irq_mask &= mask;
 	if (irq & 8)
-		outb(cached_A1,0xA1);
+		outb(cached_slave_mask, PIC_SLAVE_IMR);
 	else
-		outb(cached_21,0x21);
+		outb(cached_master_mask, PIC_MASTER_IMR);
 	spin_unlock_irqrestore(&i8259A_lock, flags);
 }
 
@@ -121,9 +123,9 @@
 
 	spin_lock_irqsave(&i8259A_lock, flags);
 	if (irq < 8)
-		ret = inb(0x20) & mask;
+		ret = inb(PIC_MASTER_CMD) & mask;
 	else
-		ret = inb(0xA0) & (mask >> 8);
+		ret = inb(PIC_SLAVE_CMD) & (mask >> 8);
 	spin_unlock_irqrestore(&i8259A_lock, flags);
 
 	return ret;
@@ -149,14 +151,14 @@
 	int irqmask = 1<<irq;
 
 	if (irq < 8) {
-		outb(0x0B,0x20);		/* ISR register */
-		value = inb(0x20) & irqmask;
-		outb(0x0A,0x20);		/* back to the IRR register */
+		outb(0x0B,PIC_MASTER_CMD);	/* ISR register */
+		value = inb(PIC_MASTER_CMD) & irqmask;
+		outb(0x0A,PIC_MASTER_CMD);	/* back to the IRR register */
 		return value;
 	}
-	outb(0x0B,0xA0);		/* ISR register */
-	value = inb(0xA0) & (irqmask >> 8);
-	outb(0x0A,0xA0);		/* back to the IRR register */
+	outb(0x0B,PIC_SLAVE_CMD);	/* ISR register */
+	value = inb(PIC_SLAVE_CMD) & (irqmask >> 8);
+	outb(0x0A,PIC_SLAVE_CMD);	/* back to the IRR register */
 	return value;
 }
 
@@ -193,14 +195,14 @@
 
 handle_real_irq:
 	if (irq & 8) {
-		inb(0xA1);		/* DUMMY - (do we need this?) */
-		outb(cached_A1,0xA1);
-		outb(0x60+(irq&7),0xA0);/* 'Specific EOI' to slave */
-		outb(0x62,0x20);	/* 'Specific EOI' to master-IRQ2 */
+		inb(PIC_SLAVE_IMR);	/* DUMMY - (do we need this?) */
+		outb(cached_slave_mask, PIC_SLAVE_IMR);
+		outb(0x60+(irq&7),PIC_SLAVE_CMD);/* 'Specific EOI' to slave */
+		outb(0x60+PIC_CASCADE_IR,PIC_MASTER_CMD); /* 'Specific EOI' to master-IRQ2 */
 	} else {
-		inb(0x21);		/* DUMMY - (do we need this?) */
-		outb(cached_21,0x21);
-		outb(0x60+irq,0x20);	/* 'Specific EOI' to master */
+		inb(PIC_MASTER_IMR);	/* DUMMY - (do we need this?) */
+		outb(cached_master_mask, PIC_MASTER_IMR);
+		outb(0x60+irq,PIC_MASTER_CMD);	/* 'Specific EOI to master */
 	}
 	spin_unlock_irqrestore(&i8259A_lock, flags);
 	return;
@@ -272,26 +274,24 @@
 
 	spin_lock_irqsave(&i8259A_lock, flags);
 
-	outb(0xff, 0x21);	/* mask all of 8259A-1 */
-	outb(0xff, 0xA1);	/* mask all of 8259A-2 */
+	outb(0xff, PIC_MASTER_IMR);	/* mask all of 8259A-1 */
+	outb(0xff, PIC_SLAVE_IMR);	/* mask all of 8259A-2 */
 
 	/*
 	 * outb_p - this has to work on a wide range of PC hardware.
 	 */
-	outb_p(0x11, 0x20);	/* ICW1: select 8259A-1 init */
-	outb_p(0x20 + 0, 0x21);	/* ICW2: 8259A-1 IR0-7 mapped to 0x20-0x27 */
-	outb_p(0x04, 0x21);	/* 8259A-1 (the master) has a slave on IR2 */
-	if (auto_eoi)
-		outb_p(0x03, 0x21);	/* master does Auto EOI */
-	else
-		outb_p(0x01, 0x21);	/* master expects normal EOI */
-
-	outb_p(0x11, 0xA0);	/* ICW1: select 8259A-2 init */
-	outb_p(0x20 + 8, 0xA1);	/* ICW2: 8259A-2 IR0-7 mapped to 0x28-0x2f */
-	outb_p(0x02, 0xA1);	/* 8259A-2 is a slave on master's IR2 */
-	outb_p(0x01, 0xA1);	/* (slave's support for AEOI in flat mode
-				    is to be investigated) */
-
+	outb_p(0x11, PIC_MASTER_CMD);	/* ICW1: select 8259A-1 init */
+	outb_p(0x20 + 0, PIC_MASTER_IMR);	/* ICW2: 8259A-1 IR0-7 mapped to 0x20-0x27 */
+	outb_p(1U << PIC_CASCADE_IR, PIC_MASTER_IMR);	/* 8259A-1 (the master) has a slave on IR2 */
+	if (auto_eoi)	/* master does Auto EOI */
+		outb_p(MASTER_ICW4_DEFAULT | PIC_ICW4_AEOI, PIC_MASTER_IMR);
+	else		/* master expects normal EOI */
+		outb_p(MASTER_ICW4_DEFAULT, PIC_MASTER_IMR);
+
+	outb_p(0x11, PIC_SLAVE_CMD);	/* ICW1: select 8259A-2 init */
+	outb_p(0x20 + 8, PIC_SLAVE_IMR);	/* ICW2: 8259A-2 IR0-7 mapped to 0x28-0x2f */
+	outb_p(PIC_CASCADE_IR, PIC_SLAVE_IMR);	/* 8259A-2 is a slave on master's IR2 */
+	outb_p(SLAVE_ICW4_DEFAULT, PIC_SLAVE_IMR); /* (slave's support for AEOI in flat mode is to be investigated) */
 	if (auto_eoi)
 		/*
 		 * in AEOI mode we just have to mask the interrupt
@@ -303,8 +303,8 @@
 
 	udelay(100);		/* wait for 8259A to initialize */
 
-	outb(cached_21, 0x21);	/* restore master IRQ mask */
-	outb(cached_A1, 0xA1);	/* restore slave IRQ mask */
+	outb(cached_master_mask, PIC_MASTER_IMR); /* restore master IRQ mask */
+	outb(cached_slave_mask, PIC_SLAVE_IMR);	  /* restore slave IRQ mask */
 
 	spin_unlock_irqrestore(&i8259A_lock, flags);
 }
@@ -321,11 +321,17 @@
  * be shot.
  */
  
+/*
+ * =PC9800NOTE= In NEC PC-9800, we use irq8 instead of irq13!
+ */
+
 static void math_error_irq(int cpl, void *dev_id, struct pt_regs *regs)
 {
 	extern void math_error(void *);
+#ifndef CONFIG_X86_PC9800
 	outb(0,0xF0);
-	if (ignore_irq13 || !boot_cpu_data.hard_math)
+#endif
+	if (ignore_fpu_irq || !boot_cpu_data.hard_math)
 		return;
 	math_error((void *)regs->eip);
 }
@@ -334,7 +340,7 @@
  * New motherboards sometimes make IRQ 13 be a PCI interrupt,
  * so allow interrupt sharing.
  */
-static struct irqaction irq13 = { math_error_irq, 0, 0, "fpu", NULL, NULL };
+static struct irqaction fpu_irq = { math_error_irq, 0, 0, "fpu", NULL, NULL };
 
 void __init init_ISA_irqs (void)
 {
@@ -366,11 +372,11 @@
 
 static void setup_timer(void)
 {
-	outb_p(0x34,0x43);		/* binary, mode 2, LSB/MSB, ch 0 */
+	outb_p(0x34,PIT_MODE);		/* binary, mode 2, LSB/MSB, ch 0 */
 	udelay(10);
-	outb_p(LATCH & 0xff , 0x40);	/* LSB */
+	outb_p(LATCH & 0xff , PIT_CH0);	/* LSB */
 	udelay(10);
-	outb(LATCH >> 8 , 0x40);	/* MSB */
+	outb(LATCH >> 8 , PIT_CH0);	/* MSB */
 }
 
 static int timer_resume(struct device *dev, u32 level)
@@ -437,5 +443,5 @@
 	 * original braindamaged IBM FERR coupling.
 	 */
 	if (boot_cpu_data.hard_math && !cpu_has_fpu)
-		setup_irq(13, &irq13);
+		setup_irq(FPU_IRQ, &fpu_irq);
 }
diff -Nru a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c
--- a/arch/i386/kernel/io_apic.c	Sat Apr 19 19:51:46 2003
+++ b/arch/i386/kernel/io_apic.c	Sat Apr 19 19:51:46 2003
@@ -38,6 +38,8 @@
 
 #include <mach_apic.h>
 
+#include "io_ports.h"
+
 #undef APIC_LOCKUP_DEBUG
 
 #define APIC_LOCKUP_DEBUG
@@ -1477,7 +1479,8 @@
 void /*__init*/ print_PIC(void)
 {
 	extern spinlock_t i8259A_lock;
-	unsigned int v, flags;
+	unsigned int v;
+	unsigned long flags;
 
 	printk(KERN_DEBUG "\nprinting PIC contents\n");
 
@@ -2135,7 +2138,7 @@
  * Additionally, something is definitely wrong with irq9
  * on PIIX4 boards.
  */
-#define PIC_IRQS	(1<<2)
+#define PIC_IRQS	(1 << PIC_CASCADE_IR)
 
 void __init setup_IO_APIC(void)
 {
diff -Nru a/arch/i386/kernel/microcode.c b/arch/i386/kernel/microcode.c
--- a/arch/i386/kernel/microcode.c	Sat Apr 19 19:51:29 2003
+++ b/arch/i386/kernel/microcode.c	Sat Apr 19 19:51:29 2003
@@ -107,7 +107,6 @@
 static char *mc_applied;            /* array of applied microcode blocks */
 static unsigned int mc_fsize;       /* file size of /dev/cpu/microcode */
 
-/* we share file_operations between misc and devfs mechanisms */
 static struct file_operations microcode_fops = {
 	.owner		= THIS_MODULE,
 	.read		= microcode_read,
@@ -122,41 +121,33 @@
 	.fops	= &microcode_fops,
 };
 
-static devfs_handle_t devfs_handle;
-
 static int __init microcode_init(void)
 {
 	int error;
 
 	error = misc_register(&microcode_dev);
 	if (error)
-		printk(KERN_WARNING 
-			"microcode: can't misc_register on minor=%d\n",
-			MICROCODE_MINOR);
-
-	devfs_handle = devfs_register(NULL, "cpu/microcode",
-			DEVFS_FL_DEFAULT, 0, 0, S_IFREG | S_IRUSR | S_IWUSR, 
-			&microcode_fops, NULL);
-	if (devfs_handle == NULL && error) {
-		printk(KERN_ERR "microcode: failed to devfs_register()\n");
-		misc_deregister(&microcode_dev);
-		goto out;
-	}
-	error = 0;
+		goto fail;
+	error = devfs_mk_symlink("cpu/microcode", "../misc/microcode");
+	if (error)
+		goto fail_deregister;
+
 	printk(KERN_INFO 
 		"IA-32 Microcode Update Driver: v%s <tigran@veritas.com>\n", 
 		MICROCODE_VERSION);
+	return 0;
 
-out:
+fail_deregister:
+	misc_deregister(&microcode_dev);
+fail:
 	return error;
 }
 
 static void __exit microcode_exit(void)
 {
 	misc_deregister(&microcode_dev);
-	devfs_unregister(devfs_handle);
-	if (mc_applied)
-		kfree(mc_applied);
+	devfs_remove("cpu/microcode");
+	kfree(mc_applied);
 	printk(KERN_INFO "IA-32 Microcode Update Driver v%s unregistered\n", 
 			MICROCODE_VERSION);
 }
diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c
--- a/arch/i386/kernel/mpparse.c	Sat Apr 19 19:51:30 2003
+++ b/arch/i386/kernel/mpparse.c	Sat Apr 19 19:51:30 2003
@@ -33,6 +33,7 @@
 
 #include <mach_apic.h>
 #include <mach_mpparse.h>
+#include <bios_ebda.h>
 
 /* Have we found an MP table */
 int smp_found_config;
@@ -708,8 +709,23 @@
 			printk(KERN_INFO "found SMP MP-table at %08lx\n",
 						virt_to_phys(mpf));
 			reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE);
-			if (mpf->mpf_physptr)
-				reserve_bootmem(mpf->mpf_physptr, PAGE_SIZE);
+			if (mpf->mpf_physptr) {
+				/*
+				 * We cannot access to MPC table to compute
+				 * table size yet, as only few megabytes from
+				 * the bottom is mapped now.
+				 * PC-9800's MPC table places on the very last
+				 * of physical memory; so that simply reserving
+				 * PAGE_SIZE from mpg->mpf_physptr yields BUG()
+				 * in reserve_bootmem.
+				 */
+				unsigned long size = PAGE_SIZE;
+				unsigned long end = max_low_pfn * PAGE_SIZE;
+				if (mpf->mpf_physptr + size > end)
+					size = end - mpf->mpf_physptr;
+				reserve_bootmem(mpf->mpf_physptr, size);
+			}
+
 			mpf_found = mpf;
 			return 1;
 		}
@@ -752,9 +768,9 @@
 	 * MP1.4 SPEC states to only scan first 1K of 4K EBDA.
 	 */
 
-	address = *(unsigned short *)phys_to_virt(0x40E);
-	address <<= 4;
-	smp_scan_config(address, 0x400);
+	address = get_bios_ebda();
+	if (address)
+		smp_scan_config(address, 0x400);
 }
 
 
diff -Nru a/arch/i386/kernel/nmi.c b/arch/i386/kernel/nmi.c
--- a/arch/i386/kernel/nmi.c	Sat Apr 19 19:51:48 2003
+++ b/arch/i386/kernel/nmi.c	Sat Apr 19 19:51:48 2003
@@ -181,11 +181,13 @@
 #ifdef CONFIG_PM
 
 #include <linux/device.h>
+static int nmi_pm_active; /* nmi_active before suspend */
 
 static int lapic_nmi_suspend(struct device *dev, u32 state, u32 level)
 {
 	if (level != SUSPEND_POWER_DOWN)
 		return 0;
+	nmi_pm_active = nmi_active;
 	disable_lapic_nmi_watchdog();
 	return 0;
 }
@@ -194,7 +196,8 @@
 {
 	if (level != RESUME_POWER_ON)
 		return 0;
-	enable_lapic_nmi_watchdog();
+	if (nmi_pm_active > 0)
+		enable_lapic_nmi_watchdog();
 	return 0;
 }
 
diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c
--- a/arch/i386/kernel/process.c	Sat Apr 19 19:51:27 2003
+++ b/arch/i386/kernel/process.c	Sat Apr 19 19:51:27 2003
@@ -324,7 +324,7 @@
 		int idx;
 
 		err = -EFAULT;
-		if (copy_from_user(&info, (void *)childregs->esi, sizeof(info)))
+		if (copy_from_user(&info, (void __user *)childregs->esi, sizeof(info)))
 			goto out;
 		err = -EINVAL;
 		if (LDT_empty(&info))
@@ -567,11 +567,14 @@
 	int error;
 	char * filename;
 
-	filename = getname((char *) regs.ebx);
+	filename = getname((char __user *) regs.ebx);
 	error = PTR_ERR(filename);
 	if (IS_ERR(filename))
 		goto out;
-	error = do_execve(filename, (char **) regs.ecx, (char **) regs.edx, &regs);
+	error = do_execve(filename,
+			(char __user * __user *) regs.ecx,
+			(char __user * __user *) regs.edx,
+			&regs);
 	if (error == 0) {
 		current->ptrace &= ~PT_DTRACE;
 		/* Make sure we don't return using sysenter.. */
@@ -633,7 +636,7 @@
 /*
  * Set a given TLS descriptor:
  */
-asmlinkage int sys_set_thread_area(struct user_desc *u_info)
+asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
 {
 	struct thread_struct *t = &current->thread;
 	struct user_desc info;
@@ -700,7 +703,7 @@
 #define GET_PRESENT(desc)	(((desc)->b >> 15) & 1)
 #define GET_USEABLE(desc)	(((desc)->b >> 20) & 1)
 
-asmlinkage int sys_get_thread_area(struct user_desc *u_info)
+asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
 {
 	struct user_desc info;
 	struct desc_struct *desc;
diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
--- a/arch/i386/kernel/setup.c	Sat Apr 19 19:51:47 2003
+++ b/arch/i386/kernel/setup.c	Sat Apr 19 19:51:47 2003
@@ -37,12 +37,14 @@
 #include <linux/console.h>
 #include <linux/root_dev.h>
 #include <linux/highmem.h>
+#include <video/edid.h>
 #include <asm/e820.h>
 #include <asm/mpspec.h>
 #include <asm/edd.h>
 #include <asm/setup.h>
 #include <asm/arch_hooks.h>
 #include "setup_arch_pre.h"
+#include "mach_resources.h"
 
 int disable_pse __initdata = 0;
 
@@ -52,7 +54,6 @@
  * Machine setup..
  */
 
-char ignore_irq13;		/* set if exception 16 works */
 /* 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 */
@@ -85,7 +86,7 @@
 	unsigned short length;
 	unsigned char table[0];
 };
-
+struct edid_info edid_info;
 struct e820map e820;
 
 unsigned char aux_device_present;
@@ -105,97 +106,20 @@
 static char command_line[COMMAND_LINE_SIZE];
        char saved_command_line[COMMAND_LINE_SIZE];
 
-struct resource standard_io_resources[] = {
-	{ "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
-	{ "pic1", 0x20, 0x3f, IORESOURCE_BUSY },
-	{ "timer", 0x40, 0x5f, IORESOURCE_BUSY },
-	{ "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
-	{ "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
-	{ "pic2", 0xa0, 0xbf, IORESOURCE_BUSY },
-	{ "dma2", 0xc0, 0xdf, IORESOURCE_BUSY },
-	{ "fpu", 0xf0, 0xff, IORESOURCE_BUSY }
-};
-#ifdef CONFIG_MELAN
-standard_io_resources[1] = { "pic1", 0x20, 0x21, IORESOURCE_BUSY };
-standard_io_resources[5] = { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY };
-#endif
-
-#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
-
 static struct resource code_resource = { "Kernel code", 0x100000, 0 };
 static struct resource data_resource = { "Kernel data", 0, 0 };
-static struct resource vram_resource = { "Video RAM area", 0xa0000, 0xbffff, IORESOURCE_BUSY };
-
-/* System ROM resources */
-#define MAXROMS 6
-static struct resource rom_resources[MAXROMS] = {
-	{ "System ROM", 0xF0000, 0xFFFFF, IORESOURCE_BUSY },
-	{ "Video ROM", 0xc0000, 0xc7fff, IORESOURCE_BUSY }
-};
-
-#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
 
 static void __init probe_roms(void)
 {
 	int roms = 1;
-	unsigned long base;
-	unsigned char *romstart;
 
 	request_resource(&iomem_resource, rom_resources+0);
 
 	/* Video ROM is standard at C000:0000 - C7FF:0000, check signature */
-	for (base = 0xC0000; base < 0xE0000; base += 2048) {
-		romstart = isa_bus_to_virt(base);
-		if (!romsignature(romstart))
-			continue;
-		request_resource(&iomem_resource, rom_resources + roms);
-		roms++;
-		break;
-	}
+	probe_video_rom(roms);
 
-	/* Extension roms at C800:0000 - DFFF:0000 */
-	for (base = 0xC8000; base < 0xE0000; base += 2048) {
-		unsigned long length;
-
-		romstart = isa_bus_to_virt(base);
-		if (!romsignature(romstart))
-			continue;
-		length = romstart[2] * 512;
-		if (length) {
-			unsigned int i;
-			unsigned char chksum;
-
-			chksum = 0;
-			for (i = 0; i < length; i++)
-				chksum += romstart[i];
-
-			/* Good checksum? */
-			if (!chksum) {
-				rom_resources[roms].start = base;
-				rom_resources[roms].end = base + length - 1;
-				rom_resources[roms].name = "Extension ROM";
-				rom_resources[roms].flags = IORESOURCE_BUSY;
-
-				request_resource(&iomem_resource, rom_resources + roms);
-				roms++;
-				if (roms >= MAXROMS)
-					return;
-			}
-		}
-	}
-
-	/* Final check for motherboard extension rom at E000:0000 */
-	base = 0xE0000;
-	romstart = isa_bus_to_virt(base);
-
-	if (romsignature(romstart)) {
-		rom_resources[roms].start = base;
-		rom_resources[roms].end = base + 65535;
-		rom_resources[roms].name = "Extension ROM";
-		rom_resources[roms].flags = IORESOURCE_BUSY;
-
-		request_resource(&iomem_resource, rom_resources + roms);
-	}
+	/* Extension roms */
+	probe_extension_roms(roms);
 }
 
 static void __init limit_regions (unsigned long long size)
@@ -860,7 +784,8 @@
 			request_resource(res, &data_resource);
 		}
 	}
-	request_resource(&iomem_resource, &vram_resource);
+
+	request_graphics_resource();
 
 	/* request I/O space for devices used on all i[345]86 PCs */
 	for (i = 0; i < STANDARD_IO_RESOURCES; i++)
@@ -883,6 +808,7 @@
  	ROOT_DEV = ORIG_ROOT_DEV;
  	drive_info = DRIVE_INFO;
  	screen_info = SCREEN_INFO;
+	edid_info = EDID_INFO;
 	apm_info.bios = APM_BIOS_INFO;
 	saved_videomode = VIDEO_MODE;
 	printk("Video mode to be used for restore is %lx\n", saved_videomode);
diff -Nru a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c
--- a/arch/i386/kernel/signal.c	Sat Apr 19 19:51:47 2003
+++ b/arch/i386/kernel/signal.c	Sat Apr 19 19:51:47 2003
@@ -53,7 +53,7 @@
 }
 
 asmlinkage int
-sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize)
+sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize)
 {
 	struct pt_regs * regs = (struct pt_regs *) &unewset;
 	sigset_t saveset, newset;
@@ -82,8 +82,8 @@
 }
 
 asmlinkage int 
-sys_sigaction(int sig, const struct old_sigaction *act,
-	      struct old_sigaction *oact)
+sys_sigaction(int sig, const struct old_sigaction __user *act,
+	      struct old_sigaction __user *oact)
 {
 	struct k_sigaction new_ka, old_ka;
 	int ret;
@@ -148,7 +148,7 @@
 };
 
 static int
-restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc, int *peax)
+restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax)
 {
 	unsigned int err = 0;
 
@@ -192,7 +192,7 @@
 	}
 
 	{
-		struct _fpstate * buf;
+		struct _fpstate __user * buf;
 		err |= __get_user(buf, &sc->fpstate);
 		if (buf) {
 			if (verify_area(VERIFY_READ, buf, sizeof(*buf)))
@@ -211,7 +211,7 @@
 asmlinkage int sys_sigreturn(unsigned long __unused)
 {
 	struct pt_regs *regs = (struct pt_regs *) &__unused;
-	struct sigframe *frame = (struct sigframe *)(regs->esp - 8);
+	struct sigframe __user *frame = (struct sigframe __user *)(regs->esp - 8);
 	sigset_t set;
 	int eax;
 
@@ -241,7 +241,7 @@
 asmlinkage int sys_rt_sigreturn(unsigned long __unused)
 {
 	struct pt_regs *regs = (struct pt_regs *) &__unused;
-	struct rt_sigframe *frame = (struct rt_sigframe *)(regs->esp - 4);
+	struct rt_sigframe __user *frame = (struct rt_sigframe __user *)(regs->esp - 4);
 	sigset_t set;
 	stack_t st;
 	int eax;
@@ -278,7 +278,7 @@
  */
 
 static int
-setup_sigcontext(struct sigcontext *sc, struct _fpstate *fpstate,
+setup_sigcontext(struct sigcontext __user *sc, struct _fpstate __user *fpstate,
 		 struct pt_regs *regs, unsigned long mask)
 {
 	int tmp, err = 0;
@@ -323,7 +323,7 @@
 /*
  * Determine which stack to use..
  */
-static inline void *
+static inline void __user *
 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
 {
 	unsigned long esp;
@@ -344,14 +344,14 @@
 		esp = (unsigned long) ka->sa.sa_restorer;
 	}
 
-	return (void *)((esp - frame_size) & -8ul);
+	return (void __user *)((esp - frame_size) & -8ul);
 }
 
 static void setup_frame(int sig, struct k_sigaction *ka,
 			sigset_t *set, struct pt_regs * regs)
 {
 	void *restorer;
-	struct sigframe *frame;
+	struct sigframe __user *frame;
 	int err = 0;
 
 	frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -373,7 +373,7 @@
 		goto give_sigsegv;
 
 	if (_NSIG_WORDS > 1) {
-		err |= __copy_to_user(frame->extramask, &set->sig[1],
+		err |= __copy_to_user(&frame->extramask, &set->sig[1],
 				      sizeof(frame->extramask));
 	}
 	if (err)
@@ -428,7 +428,7 @@
 			   sigset_t *set, struct pt_regs * regs)
 {
 	void *restorer;
-	struct rt_sigframe *frame;
+	struct rt_sigframe __user *frame;
 	int err = 0;
 
 	frame = get_sigframe(ka, regs, sizeof(*frame));
diff -Nru a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c
--- a/arch/i386/kernel/smpboot.c	Sat Apr 19 19:51:47 2003
+++ b/arch/i386/kernel/smpboot.c	Sat Apr 19 19:51:47 2003
@@ -49,10 +49,10 @@
 #include <asm/tlbflush.h>
 #include <asm/desc.h>
 #include <asm/arch_hooks.h>
-#include "smpboot_hooks.h"
 
 #include <mach_apic.h>
 #include <mach_wakecpu.h>
+#include <smpboot_hooks.h>
 
 /* Set if we find a B stepping CPU */
 static int __initdata smp_b_stepping;
@@ -823,13 +823,7 @@
 
 	store_NMI_vector(&nmi_high, &nmi_low);
 
-	CMOS_WRITE(0xa, 0xf);
-	local_flush_tlb();
-	Dprintk("1.\n");
-	*((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4;
-	Dprintk("2.\n");
-	*((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf;
-	Dprintk("3.\n");
+	smpboot_setup_warm_reset_vector(start_eip);
 
 	/*
 	 * Starting actual IPI sequence...
@@ -1045,7 +1039,7 @@
 	/*
 	 * Cleanup possible dangling ends...
 	 */
-	smpboot_setup_warm_reset_vector();
+	smpboot_restore_warm_reset_vector();
 
 	/*
 	 * Allow the user to impress friends.
diff -Nru a/arch/i386/kernel/suspend.c b/arch/i386/kernel/suspend.c
--- a/arch/i386/kernel/suspend.c	Sat Apr 19 19:51:50 2003
+++ b/arch/i386/kernel/suspend.c	Sat Apr 19 19:51:50 2003
@@ -16,7 +16,6 @@
 #include <linux/poll.h>
 #include <linux/delay.h>
 #include <linux/sysrq.h>
-#include <linux/compatmac.h>
 #include <linux/proc_fs.h>
 #include <linux/irq.h>
 #include <linux/pm.h>
diff -Nru a/arch/i386/kernel/sysenter.c b/arch/i386/kernel/sysenter.c
--- a/arch/i386/kernel/sysenter.c	Sat Apr 19 19:51:51 2003
+++ b/arch/i386/kernel/sysenter.c	Sat Apr 19 19:51:51 2003
@@ -12,6 +12,7 @@
 #include <linux/sched.h>
 #include <linux/gfp.h>
 #include <linux/string.h>
+#include <linux/elf.h>
 
 #include <asm/cpufeature.h>
 #include <asm/msr.h>
@@ -52,11 +53,47 @@
 
 static int __init sysenter_setup(void)
 {
-	static const char int80[] = {
+	static const char __initdata int80[] = {
 		0xcd, 0x80,		/* int $0x80 */
 		0xc3			/* ret */
 	};
-	static const char sysent[] = {
+	/* Unwind information for the int80 code.  Keep track of
+	   where the return address is stored.  */
+	static const char __initdata int80_eh_frame[] = {
+	/* First the Common Information Entry (CIE):  */
+		0x14, 0x00, 0x00, 0x00,	/* Length of the CIE */
+		0x00, 0x00, 0x00, 0x00,	/* CIE Identifier Tag */
+		0x01,			/* CIE Version */
+		'z', 'R', 0x00,		/* CIE Augmentation */
+		0x01,			/* CIE Code Alignment Factor */
+		0x7c,			/* CIE Data Alignment Factor */
+		0x08,			/* CIE RA Column */
+		0x01,			/* Augmentation size */
+		0x1b,			/* FDE Encoding (pcrel sdata4) */
+		0x0c,			/* DW_CFA_def_cfa */
+		0x04,
+		0x04,
+		0x88,			/* DW_CFA_offset, column 0x8 */
+		0x01,
+		0x00,			/* padding */
+		0x00,
+	/* Now the FDE which contains the instructions for the frame.  */
+		0x0a, 0x00, 0x00, 0x00,	/* FDE Length */
+		0x1c, 0x00, 0x00, 0x00,	/* FDE CIE offset */
+	/* The PC-relative offset to the beginning of the code this
+	   FDE covers.  The computation below assumes that the offset
+	   can be represented in one byte.  Change if this is not true
+	   anymore.  The offset from the beginning of the .eh_frame
+	   is represented by EH_FRAME_OFFSET.  The word with the offset
+	   starts at byte 0x20 of the .eh_frame.  */
+		0x100 - (EH_FRAME_OFFSET + 0x20),
+		0xff, 0xff, 0xff,	/* FDE initial location */
+		3,			/* FDE address range */
+		0x00			/* Augmentation size */
+	/* The code does not change the stack pointer.  We need not
+	   record any operations.  */
+	};
+	static const char __initdata sysent[] = {
 		0x51,			/* push %ecx */
 		0x52,			/* push %edx */
 		0x55,			/* push %ebp */
@@ -76,13 +113,71 @@
 		0x59,			/* pop %ecx */
 		0xc3			/* ret */
 	};
-	static const char sigreturn[] = {
+	/* Unwind information for the sysenter code.  Keep track of
+	   where the return address is stored.  */
+	static const char __initdata sysent_eh_frame[] = {
+	/* First the Common Information Entry (CIE):  */
+		0x14, 0x00, 0x00, 0x00,	/* Length of the CIE */
+		0x00, 0x00, 0x00, 0x00,	/* CIE Identifier Tag */
+		0x01,			/* CIE Version */
+		'z', 'R', 0x00,		/* CIE Augmentation */
+		0x01,			/* CIE Code Alignment Factor */
+		0x7c,			/* CIE Data Alignment Factor */
+		0x08,			/* CIE RA Column */
+		0x01,			/* Augmentation size */
+		0x1b,			/* FDE Encoding (pcrel sdata4) */
+		0x0c,			/* DW_CFA_def_cfa */
+		0x04,
+		0x04,
+		0x88,			/* DW_CFA_offset, column 0x8 */
+		0x01,
+		0x00,			/* padding */
+		0x00,
+	/* Now the FDE which contains the instructions for the frame.  */
+		0x22, 0x00, 0x00, 0x00,	/* FDE Length */
+		0x1c, 0x00, 0x00, 0x00,	/* FDE CIE offset */
+	/* The PC-relative offset to the beginning of the code this
+	   FDE covers.  The computation below assumes that the offset
+	   can be represented in one byte.  Change if this is not true
+	   anymore.  The offset from the beginning of the .eh_frame
+	   is represented by EH_FRAME_OFFSET.  The word with the offset
+	   starts at byte 0x20 of the .eh_frame.  */
+		0x100 - (EH_FRAME_OFFSET + 0x20),
+		0xff, 0xff, 0xff,	/* FDE initial location */
+		0x14, 0x00, 0x00, 0x00,	/* FDE address range */
+		0x00,			/* Augmentation size */
+	/* What follows are the instructions for the table generation.
+	   We have to record all changes of the stack pointer and
+	   callee-saved registers.  */
+		0x41,			/* DW_CFA_advance_loc+1, push %ecx */
+		0x0e,			/* DW_CFA_def_cfa_offset */
+		0x08,			/* RA at offset 8 now */
+		0x41,			/* DW_CFA_advance_loc+1, push %edx */
+		0x0e,			/* DW_CFA_def_cfa_offset */
+		0x0c,			/* RA at offset 12 now */
+		0x41,			/* DW_CFA_advance_loc+1, push %ebp */
+		0x0e,			/* DW_CFA_def_cfa_offset */
+		0x10,			/* RA at offset 16 now */
+		0x85, 0x04,		/* DW_CFA_offset %ebp -16 */
+	/* Finally the epilogue.  */
+		0x4e,			/* DW_CFA_advance_loc+14, pop %ebx */
+		0x0e,			/* DW_CFA_def_cfa_offset */
+		0x12,			/* RA at offset 12 now */
+		0xc5,			/* DW_CFA_restore %ebp */
+		0x41,			/* DW_CFA_advance_loc+1, pop %edx */
+		0x0e,			/* DW_CFA_def_cfa_offset */
+		0x08,			/* RA at offset 8 now */
+		0x41,			/* DW_CFA_advance_loc+1, pop %ecx */
+		0x0e,			/* DW_CFA_def_cfa_offset */
+		0x04			/* RA at offset 4 now */
+	};
+	static const char __initdata sigreturn[] = {
 	/* 32: sigreturn point */
 		0x58,				/* popl %eax */
 		0xb8, __NR_sigreturn, 0, 0, 0,	/* movl $__NR_sigreturn, %eax */
 		0xcd, 0x80,			/* int $0x80 */
 	};
-	static const char rt_sigreturn[] = {
+	static const char __initdata rt_sigreturn[] = {
 	/* 64: rt_sigreturn point */
 		0xb8, __NR_rt_sigreturn, 0, 0, 0,	/* movl $__NR_rt_sigreturn, %eax */
 		0xcd, 0x80,			/* int $0x80 */
@@ -93,10 +188,14 @@
 	memcpy((void *) page, int80, sizeof(int80));
 	memcpy((void *)(page + 32), sigreturn, sizeof(sigreturn));
 	memcpy((void *)(page + 64), rt_sigreturn, sizeof(rt_sigreturn));
+	memcpy((void *)(page + EH_FRAME_OFFSET), int80_eh_frame,
+	       sizeof(int80_eh_frame));
 	if (!boot_cpu_has(X86_FEATURE_SEP))
 		return 0;
 
 	memcpy((void *) page, sysent, sizeof(sysent));
+	memcpy((void *)(page + EH_FRAME_OFFSET), sysent_eh_frame,
+	       sizeof(sysent_eh_frame));
 	on_each_cpu(enable_sep_cpu, NULL, 1, 1);
 	return 0;
 }
diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c
--- a/arch/i386/kernel/time.c	Sat Apr 19 19:51:47 2003
+++ b/arch/i386/kernel/time.c	Sat Apr 19 19:51:47 2003
@@ -55,12 +55,15 @@
 #include <asm/processor.h>
 #include <asm/timer.h>
 
-#include <linux/mc146818rtc.h>
+#include "mach_time.h"
+
 #include <linux/timex.h>
 #include <linux/config.h>
 
 #include <asm/arch_hooks.h>
 
+#include "io_ports.h"
+
 extern spinlock_t i8259A_lock;
 int pit_latch_buggy;              /* extern */
 
@@ -138,80 +141,13 @@
 	clock_was_set();
 }
 
-/* monotonic_clock(): returns # of nanoseconds passed since time_init()
- *		Note: This function is required to return accurate
- *		time even in the absence of multiple timer ticks.
- */
-unsigned long long monotonic_clock(void)
-{
-	return timer->monotonic_clock();
-}
-EXPORT_SYMBOL(monotonic_clock);
-
-
-/*
- * In order to set the CMOS clock precisely, set_rtc_mmss has to be
- * called 500 ms after the second nowtime has started, because when
- * nowtime is written into the registers of the CMOS clock, it will
- * jump to the next second precisely 500 ms later. Check the Motorola
- * MC146818A or Dallas DS12887 data sheet for details.
- *
- * BUG: This routine does not handle hour overflow properly; it just
- *      sets the minutes. Usually you'll only notice that after reboot!
- */
 static int set_rtc_mmss(unsigned long nowtime)
 {
-	int retval = 0;
-	int real_seconds, real_minutes, cmos_minutes;
-	unsigned char save_control, save_freq_select;
+	int retval;
 
 	/* gets recalled with irq locally disabled */
 	spin_lock(&rtc_lock);
-	save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
-	CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
-
-	save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */
-	CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
-
-	cmos_minutes = CMOS_READ(RTC_MINUTES);
-	if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
-		BCD_TO_BIN(cmos_minutes);
-
-	/*
-	 * since we're only adjusting minutes and seconds,
-	 * don't interfere with hour overflow. This avoids
-	 * messing with unknown time zones but requires your
-	 * RTC not to be off by more than 15 minutes
-	 */
-	real_seconds = nowtime % 60;
-	real_minutes = nowtime / 60;
-	if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
-		real_minutes += 30;		/* correct for half hour time zone */
-	real_minutes %= 60;
-
-	if (abs(real_minutes - cmos_minutes) < 30) {
-		if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
-			BIN_TO_BCD(real_seconds);
-			BIN_TO_BCD(real_minutes);
-		}
-		CMOS_WRITE(real_seconds,RTC_SECONDS);
-		CMOS_WRITE(real_minutes,RTC_MINUTES);
-	} else {
-		printk(KERN_WARNING
-		       "set_rtc_mmss: can't update from %d to %d\n",
-		       cmos_minutes, real_minutes);
-		retval = -1;
-	}
-
-	/* The following flags have to be released exactly in this order,
-	 * otherwise the DS12887 (popular MC146818A clone with integrated
-	 * battery and quartz) will not reset the oscillator and will not
-	 * update precisely 500 ms later. You won't find this mentioned in
-	 * the Dallas Semiconductor data sheets, but who believes data
-	 * sheets anyway ...                           -- Markus Kuhn
-	 */
-	CMOS_WRITE(save_control, RTC_CONTROL);
-	CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
+	retval = mach_set_rtc_mmss(nowtime);
 	spin_unlock(&rtc_lock);
 
 	return retval;
@@ -222,6 +158,17 @@
 
 int timer_ack;
 
+/* monotonic_clock(): returns # of nanoseconds passed since time_init()
+ *		Note: This function is required to return accurate
+ *		time even in the absence of multiple timer ticks.
+ */
+unsigned long long monotonic_clock(void)
+{
+	return timer->monotonic_clock();
+}
+EXPORT_SYMBOL(monotonic_clock);
+
+
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
@@ -237,9 +184,9 @@
 		 * on an 82489DX-based system.
 		 */
 		spin_lock(&i8259A_lock);
-		outb(0x0c, 0x20);
+		outb(0x0c, PIC_MASTER_OCW3);
 		/* Ack the IRQ; AEOI will end it automatically. */
-		inb(0x20);
+		inb(PIC_MASTER_POLL);
 		spin_unlock(&i8259A_lock);
 	}
 #endif
@@ -253,14 +200,16 @@
 	 */
 	if ((time_status & STA_UNSYNC) == 0 &&
 	    xtime.tv_sec > last_rtc_update + 660 &&
-	    (xtime.tv_nsec / 1000) >= 500000 - ((unsigned) TICK_SIZE) / 2 &&
-	    (xtime.tv_nsec / 1000) <= 500000 + ((unsigned) TICK_SIZE) / 2) {
+	    (xtime.tv_nsec / 1000)
+			>= USEC_AFTER - ((unsigned) TICK_SIZE) / 2 &&
+	    (xtime.tv_nsec / 1000)
+			<= USEC_BEFORE + ((unsigned) TICK_SIZE) / 2) {
 		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 */
 	}
-	    
+
 #ifdef CONFIG_MCA
 	if( MCA_bus ) {
 		/* The PS/2 uses level-triggered interrupts.  You can't
@@ -341,43 +290,15 @@
 /* not static: needed by APM */
 unsigned long get_cmos_time(void)
 {
-	unsigned int year, mon, day, hour, min, sec;
-	int i;
+	unsigned long retval;
 
 	spin_lock(&rtc_lock);
-	/* The Linux interpretation of the CMOS clock register contents:
-	 * When the Update-In-Progress (UIP) flag goes from 1 to 0, the
-	 * RTC registers show the second which has precisely just started.
-	 * Let's hope other operating systems interpret the RTC the same way.
-	 */
-	/* read RTC exactly on falling edge of update flag */
-	for (i = 0 ; i < 1000000 ; i++)	/* may take up to 1 second... */
-		if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)
-			break;
-	for (i = 0 ; i < 1000000 ; i++)	/* must try at least 2.228 ms */
-		if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
-			break;
-	do { /* Isn't this overkill ? UIP above should guarantee consistency */
-		sec = CMOS_READ(RTC_SECONDS);
-		min = CMOS_READ(RTC_MINUTES);
-		hour = CMOS_READ(RTC_HOURS);
-		day = CMOS_READ(RTC_DAY_OF_MONTH);
-		mon = CMOS_READ(RTC_MONTH);
-		year = CMOS_READ(RTC_YEAR);
-	} while (sec != CMOS_READ(RTC_SECONDS));
-	if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
-	  {
-	    BCD_TO_BIN(sec);
-	    BCD_TO_BIN(min);
-	    BCD_TO_BIN(hour);
-	    BCD_TO_BIN(day);
-	    BCD_TO_BIN(mon);
-	    BCD_TO_BIN(year);
-	  }
+
+	retval = mach_get_cmos_time();
+
 	spin_unlock(&rtc_lock);
-	if ((year += 1900) < 1970)
-		year += 100;
-	return mktime(year, mon, day, hour, min, sec);
+
+	return retval;
 }
 
 /* XXX this driverfs stuff should probably go elsewhere later -john */
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	Sat Apr 19 19:51:50 2003
+++ b/arch/i386/kernel/timers/timer_pit.c	Sat Apr 19 19:51:50 2003
@@ -16,13 +16,17 @@
 extern spinlock_t i8259A_lock;
 extern spinlock_t i8253_lock;
 #include "do_timer.h"
+#include "io_ports.h"
+
+static int count_p; /* counter in get_offset_pit() */
 
 static int __init init_pit(char* override)
 {
-	/* check clock override */
-	if (override[0] && strncmp(override,"pit",3))
-		printk(KERN_ERR "Warning: clock= override failed. Defaulting to PIT\n");
-
+ 	/* check clock override */
+ 	if (override[0] && strncmp(override,"pit",3))
+ 		printk(KERN_ERR "Warning: clock= override failed. Defaulting to PIT\n");
+ 
+	count_p = LATCH;
 	return 0;
 }
 
@@ -86,7 +90,6 @@
 {
 	int count;
 	unsigned long flags;
-	static int count_p = LATCH;    /* for the first call after boot */
 	static unsigned long jiffies_p = 0;
 
 	/*
@@ -96,9 +99,9 @@
 
 	spin_lock_irqsave(&i8253_lock, flags);
 	/* timer count may underflow right here */
-	outb_p(0x00, 0x43);	/* latch the count ASAP */
+	outb_p(0x00, PIT_MODE);	/* latch the count ASAP */
 
-	count = inb_p(0x40);	/* read the latched count */
+	count = inb_p(PIT_CH0);	/* read the latched count */
 
 	/*
 	 * We do this guaranteed double memory access instead of a _p 
@@ -106,13 +109,13 @@
 	 */
  	jiffies_t = jiffies;
 
-	count |= inb_p(0x40) << 8;
+	count |= inb_p(PIT_CH0) << 8;
 	
         /* VIA686a test code... reset the latch if count > max + 1 */
         if (count > LATCH) {
-                outb_p(0x34, 0x43);
-                outb_p(LATCH & 0xff, 0x40);
-                outb(LATCH >> 8, 0x40);
+                outb_p(0x34, PIT_MODE);
+                outb_p(LATCH & 0xff, PIT_CH0);
+                outb(LATCH >> 8, PIT_CH0);
                 count = LATCH - 1;
         }
 	
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	Sat Apr 19 19:51:49 2003
+++ b/arch/i386/kernel/timers/timer_tsc.c	Sat Apr 19 19:51:49 2003
@@ -15,6 +15,9 @@
 /* processor.h for distable_tsc flag */
 #include <asm/processor.h>
 
+#include "io_ports.h"
+#include "mach_timer.h"
+
 int tsc_disable __initdata = 0;
 
 extern spinlock_t i8253_lock;
@@ -57,6 +60,8 @@
 }
 
 
+static int count2; /* counter for mark_offset_tsc() */
+
 /* Cached *multiplier* to convert TSC counts to microseconds.
  * (see the equation below).
  * Equal to 2^32 * (1 / (clocks per usec) ).
@@ -114,7 +119,7 @@
 {
 	int count;
 	int countmp;
-	static int count1=0, count2=LATCH;
+	static int count1 = 0;
 	unsigned long long this_offset, last_offset;
 	
 	write_lock(&monotonic_lock);
@@ -136,10 +141,10 @@
 	rdtsc(last_tsc_low, last_tsc_high);
 
 	spin_lock(&i8253_lock);
-	outb_p(0x00, 0x43);     /* latch the count ASAP */
+	outb_p(0x00, PIT_MODE);     /* latch the count ASAP */
 
-	count = inb_p(0x40);    /* read the latched count */
-	count |= inb(0x40) << 8;
+	count = inb_p(PIT_CH0);    /* read the latched count */
+	count |= inb(PIT_CH0) << 8;
 	spin_unlock(&i8253_lock);
 
 	if (pit_latch_buggy) {
@@ -187,26 +192,11 @@
  * device.
  */
 
-#define CALIBRATE_LATCH	(5 * LATCH)
 #define CALIBRATE_TIME	(5 * 1000020/HZ)
 
 unsigned long __init calibrate_tsc(void)
 {
-       /* Set the Gate high, disable speaker */
-	outb((inb(0x61) & ~0x02) | 0x01, 0x61);
-
-	/*
-	 * Now let's take care of CTC channel 2
-	 *
-	 * Set the Gate high, program CTC channel 2 for mode 0,
-	 * (interrupt on terminal count mode), binary count,
-	 * load 5 * LATCH count, (LSB and MSB) to begin countdown.
-	 *
-	 * Some devices need a delay here.
-	 */
-	outb(0xb0, 0x43);			/* binary, mode 0, LSB/MSB, Ch 2 */
-	outb_p(CALIBRATE_LATCH & 0xff, 0x42);	/* LSB of count */
-	outb_p(CALIBRATE_LATCH >> 8, 0x42);       /* MSB of count */
+	mach_prepare_counter();
 
 	{
 		unsigned long startlow, starthigh;
@@ -214,10 +204,7 @@
 		unsigned long count;
 
 		rdtsc(startlow,starthigh);
-		count = 0;
-		do {
-			count++;
-		} while ((inb(0x61) & 0x20) == 0);
+		mach_countup(&count);
 		rdtsc(endlow,endhigh);
 
 		last_tsc_low = endlow;
@@ -339,6 +326,8 @@
 #ifdef CONFIG_CPU_FREQ
 	cpufreq_register_notifier(&time_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
 #endif
+
+	count2 = LATCH; /* initialize counter for mark_offset_tsc() */
 
 	if (cpu_has_tsc) {
 		unsigned long tsc_quotient = calibrate_tsc();
diff -Nru a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c
--- a/arch/i386/kernel/traps.c	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/kernel/traps.c	Sat Apr 19 19:51:28 2003
@@ -51,6 +51,8 @@
 #include <linux/irq.h>
 #include <linux/module.h>
 
+#include "mach_traps.h"
+
 asmlinkage int system_call(void);
 asmlinkage void lcall7(void);
 asmlinkage void lcall27(void);
@@ -58,6 +60,9 @@
 struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 },
 		{ 0, 0 }, { 0, 0 } };
 
+/* Do we ignore FPU interrupts ? */
+char ignore_fpu_irq = 0;
+
 /*
  * The IDT has to be page-aligned to simplify the Pentium
  * F0 0F bug workaround.. We have a special link segment
@@ -257,6 +262,15 @@
 	show_registers(regs);
 	bust_spinlocks(0);
 	spin_unlock_irq(&die_lock);
+	if (in_interrupt())
+		panic("Fatal exception in interrupt");
+
+	if (panic_on_oops) {
+		printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(5 * HZ);
+		panic("Fatal exception");
+	}
 	do_exit(SIGSEGV);
 }
 
@@ -384,8 +398,7 @@
 	printk("You probably have a hardware problem with your RAM chips\n");
 
 	/* Clear and disable the memory parity error line. */
-	reason = (reason & 0xf) | 4;
-	outb(reason, 0x61);
+	clear_mem_error(reason);
 }
 
 static void io_check_error(unsigned char reason, struct pt_regs * regs)
@@ -422,7 +435,7 @@
 
 static void default_do_nmi(struct pt_regs * regs)
 {
-	unsigned char reason = inb(0x61);
+	unsigned char reason = get_nmi_reason();
  
 	if (!(reason & 0xc0)) {
 #if CONFIG_X86_LOCAL_APIC
@@ -446,10 +459,7 @@
 	 * Reassert NMI in case it became active meanwhile
 	 * as it's edge-triggered.
 	 */
-	outb(0x8f, 0x70);
-	inb(0x71);		/* dummy */
-	outb(0x0f, 0x70);
-	inb(0x71);		/* dummy */
+	reassert_nmi();
 }
 
 static int dummy_nmi_callback(struct pt_regs * regs, int cpu)
@@ -643,7 +653,7 @@
 
 asmlinkage void do_coprocessor_error(struct pt_regs * regs, long error_code)
 {
-	ignore_irq13 = 1;
+	ignore_fpu_irq = 1;
 	math_error((void *)regs->eip);
 }
 
@@ -700,7 +710,7 @@
 {
 	if (cpu_has_xmm) {
 		/* Handle SIMD FPU exceptions on PIII+ processors. */
-		ignore_irq13 = 1;
+		ignore_fpu_irq = 1;
 		simd_math_error((void *)regs->eip);
 	} else {
 		/*
diff -Nru a/arch/i386/kernel/vm86.c b/arch/i386/kernel/vm86.c
--- a/arch/i386/kernel/vm86.c	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/kernel/vm86.c	Sat Apr 19 19:51:28 2003
@@ -30,6 +30,7 @@
  *
  */
 
+#include <linux/config.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
 #include <linux/sched.h>
@@ -725,7 +726,7 @@
 void release_x86_irqs(struct task_struct *task)
 {
 	int i;
-	for (i=3; i<16; i++)
+	for (i = FIRST_VM86_IRQ ; i <= LAST_VM86_IRQ; i++)
 	    if (vm86_irqs[i].tsk == task)
 		free_vm86_irq(i);
 }
@@ -735,7 +736,7 @@
 	int bit;
 	unsigned long flags;
 	
-	if ( (irqnumber<3) || (irqnumber>15) ) return 0;
+	if (invalid_vm86_irq(irqnumber)) return 0;
 	if (vm86_irqs[irqnumber].tsk != current) return 0;
 	spin_lock_irqsave(&irqbits_lock, flags);	
 	bit = irqbits & (1 << irqnumber);
@@ -760,7 +761,7 @@
 			int irq = irqnumber & 255;
 			if (!capable(CAP_SYS_ADMIN)) return -EPERM;
 			if (!((1 << sig) & ALLOWED_SIGS)) return -EPERM;
-			if ( (irq<3) || (irq>15) ) return -EPERM;
+			if (invalid_vm86_irq(irq)) return -EPERM;
 			if (vm86_irqs[irq].tsk) return -EPERM;
 			ret = request_irq(irq, &irq_handler, 0, VM86_IRQNAME, 0);
 			if (ret) return ret;
@@ -769,7 +770,7 @@
 			return irq;
 		}
 		case  VM86_FREE_IRQ: {
-			if ( (irqnumber<3) || (irqnumber>15) ) return -EPERM;
+			if (invalid_vm86_irq(irqnumber)) return -EPERM;
 			if (!vm86_irqs[irqnumber].tsk) return 0;
 			if (vm86_irqs[irqnumber].tsk != current) return -EPERM;
 			free_vm86_irq(irqnumber);
diff -Nru a/arch/i386/mach-visws/visws_apic.c b/arch/i386/mach-visws/visws_apic.c
--- a/arch/i386/mach-visws/visws_apic.c	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/mach-visws/visws_apic.c	Sat Apr 19 19:51:28 2003
@@ -230,12 +230,12 @@
 	cached_irq_mask |= 1 << realirq;
 	if (unlikely(realirq > 7)) {
 		inb(0xa1);
-		outb(cached_A1, 0xa1);
+		outb(cached_slave_mask, 0xa1);
 		outb(0x60 + (realirq & 7), 0xa0);
 		outb(0x60 + 2, 0x20);
 	} else {
 		inb(0x21);
-		outb(cached_21, 0x21);
+		outb(cached_master_mask, 0x21);
 		outb(0x60 + realirq, 0x20);
 	}
 
diff -Nru a/arch/i386/oprofile/op_model_p4.c b/arch/i386/oprofile/op_model_p4.c
--- a/arch/i386/oprofile/op_model_p4.c	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/oprofile/op_model_p4.c	Sat Apr 19 19:51:28 2003
@@ -31,7 +31,6 @@
 #define NUM_CONTROLS_HT2 (NUM_ESCRS_HT2 + NUM_CCCRS_HT2)
 
 static unsigned int num_counters = NUM_COUNTERS_NON_HT;
-static unsigned int num_cccrs = NUM_CCCRS_NON_HT;
 
 
 /* this has to be checked dynamically since the
@@ -40,10 +39,17 @@
 static inline void setup_num_counters(void)
 {
 #ifdef CONFIG_SMP
-	if (smp_num_siblings == 2) {		
+	if (smp_num_siblings == 2)
 		num_counters = NUM_COUNTERS_HT2;
-		num_cccrs = NUM_CCCRS_HT2;
-	}
+#endif
+}
+
+static int inline addr_increment(void)
+{
+#ifdef CONFIG_SMP
+	return smp_num_siblings == 2 ? 2 : 1;
+#else
+	return 1;
 #endif
 }
 
@@ -65,7 +71,7 @@
 };
 
 /* nb: these CTR_* defines are a duplicate of defines in
-   libop/op_events.c. */
+   event/i386.p4*events. */
 
 
 #define CTR_BPU_0      (1 << 0)
@@ -88,6 +94,17 @@
 	{ CTR_IQ_5,    MSR_P4_IQ_PERFCTR5,    MSR_P4_IQ_CCCR5 }
 };
 
+#define NUM_UNUSED_CCCRS	NUM_CCCRS_NON_HT - NUM_COUNTERS_NON_HT
+
+/* All cccr we don't use. */
+static int p4_unused_cccr[NUM_UNUSED_CCCRS] = {
+	MSR_P4_BPU_CCCR1,	MSR_P4_BPU_CCCR3,
+	MSR_P4_MS_CCCR1,	MSR_P4_MS_CCCR3,
+	MSR_P4_FLAME_CCCR1,	MSR_P4_FLAME_CCCR3,
+	MSR_P4_IQ_CCCR0,	MSR_P4_IQ_CCCR1,
+	MSR_P4_IQ_CCCR2,	MSR_P4_IQ_CCCR3
+};
+
 /* p4 event codes in libop/op_event.h are indices into this table. */
 
 static struct p4_event_binding p4_events[NUM_EVENTS] = {
@@ -167,13 +184,13 @@
 	{ /* IOQ_ALLOCATION */
 		0x06, 0x03, 
 		{ { CTR_BPU_0, MSR_P4_FSB_ESCR0},
-		  {-1,-1} }
+		  { 0, 0 } }
 	},
 
 	{ /* IOQ_ACTIVE_ENTRIES */
 		0x06, 0x1a, 
 		{ { CTR_BPU_2, MSR_P4_FSB_ESCR1},
-		  {-1,-1} }
+		  { 0, 0 } }
 	},
 
 	{ /* FSB_DATA_ACTIVITY */
@@ -185,13 +202,13 @@
 	{ /* BSQ_ALLOCATION */
 		0x07, 0x05, 
 		{ { CTR_BPU_0, MSR_P4_BSU_ESCR0},
-		  {-1,-1} }
+		  { 0, 0 } }
 	},
 
 	{ /* BSQ_ACTIVE_ENTRIES */
 		0x07, 0x06,
 		{ { CTR_BPU_2, MSR_P4_BSU_ESCR1 /* guess */},  
-		  {-1,-1} }
+		  { 0, 0 } }
 	},
 
 	{ /* X87_ASSIST */
@@ -336,7 +353,7 @@
 #define ESCR_SET_OS_0(escr, os) ((escr) |= (((os) & 1) << 3))
 #define ESCR_SET_USR_1(escr, usr) ((escr) |= (((usr) & 1)))
 #define ESCR_SET_OS_1(escr, os) ((escr) |= (((os) & 1) << 1))
-#define ESCR_SET_EVENT_SELECT(escr, sel) ((escr) |= (((sel) & 0x1f) << 25))
+#define ESCR_SET_EVENT_SELECT(escr, sel) ((escr) |= (((sel) & 0x3f) << 25))
 #define ESCR_SET_EVENT_MASK(escr, mask) ((escr) |= (((mask) & 0xffff) << 9))
 #define ESCR_READ(escr,high,ev,i) do {rdmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0);
 #define ESCR_WRITE(escr,high,ev,i) do {wrmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0);
@@ -358,15 +375,11 @@
 #define CTR_WRITE(l,i) do {wrmsr(p4_counters[(i)].counter_address, -(u32)(l), -1);} while (0);
 #define CTR_OVERFLOW_P(ctr) (!((ctr) & 0x80000000))
 
-/* these access the underlying cccrs 1-18, not the subset of 8 bound to "virtual counters" */
-#define RAW_CCCR_READ(low, high, i) do {rdmsr (MSR_P4_BPU_CCCR0 + (i), (low), (high));} while (0);
-#define RAW_CCCR_WRITE(low, high, i) do {wrmsr (MSR_P4_BPU_CCCR0 + (i), (low), (high));} while (0);
-
 
 /* this assigns a "stagger" to the current CPU, which is used throughout
    the code in this module as an extra array offset, to select the "even"
    or "odd" part of all the divided resources. */
-static inline unsigned int get_stagger(void)
+static unsigned int get_stagger(void)
 {
 #ifdef CONFIG_SMP
 	int cpu;
@@ -395,29 +408,33 @@
 	setup_num_counters();
 	stag = get_stagger();
 
-	/* the 8 counter registers we pay attention to */
-	for (i = 0; i < num_counters; ++i)
+	/* the counter registers we pay attention to */
+	for (i = 0; i < num_counters; ++i) {
 		msrs->counters.addrs[i] = 
 			p4_counters[VIRT_CTR(stag, i)].counter_address;
+	}
+
+	/* FIXME: bad feeling, we don't save the 10 counters we don't use. */
 
 	/* 18 CCCR registers */
-	for (i=stag, addr = MSR_P4_BPU_CCCR0;
-	     addr <= MSR_P4_IQ_CCCR5; ++i, addr += (1 + stag)) 
+	for (i = 0, addr = MSR_P4_BPU_CCCR0 + stag;
+	     addr <= MSR_P4_IQ_CCCR5; ++i, addr += addr_increment()) {
 		msrs->controls.addrs[i] = addr;
+	}
 	
-	/* 43 ESCR registers */
-	for (addr = MSR_P4_BSU_ESCR0;
-	     addr <= MSR_P4_SSU_ESCR0; ++i, addr += (1 + stag)){ 
+	/* 43 ESCR registers in three discontiguous group */
+	for (addr = MSR_P4_BSU_ESCR0 + stag;
+	     addr <= MSR_P4_SSU_ESCR0; ++i, addr += addr_increment()) { 
 		msrs->controls.addrs[i] = addr;
 	}
 	
-	for (addr = MSR_P4_MS_ESCR0;
-	     addr <= MSR_P4_TC_ESCR1; ++i, addr += (1 + stag)){ 
+	for (addr = MSR_P4_MS_ESCR0 + stag;
+	     addr <= MSR_P4_TC_ESCR1; ++i, addr += addr_increment()) { 
 		msrs->controls.addrs[i] = addr;
 	}
 	
-	for (addr = MSR_P4_IX_ESCR0;
-	     addr <= MSR_P4_CRU_ESCR3; ++i, addr += (1 + stag)){ 
+	for (addr = MSR_P4_IX_ESCR0 + stag;
+	     addr <= MSR_P4_CRU_ESCR3; ++i, addr += addr_increment()) { 
 		msrs->controls.addrs[i] = addr;
 	}
 
@@ -435,7 +452,7 @@
 
 	} else {
 		/* and two copies of the second to the odd thread,
-		   for the 31st and 32nd control registers */
+		   for the 22st and 23nd control registers */
 		msrs->controls.addrs[i++] = MSR_P4_CRU_ESCR5;
 		msrs->controls.addrs[i++] = MSR_P4_CRU_ESCR5;
 	}
@@ -456,7 +473,7 @@
 	stag = get_stagger();
 	
 	/* convert from counter *number* to counter *bit* */
-	counter_bit = 1 << ctr;
+	counter_bit = 1 << VIRT_CTR(stag, ctr);
 	
 	/* find our event binding structure. */
 	if (counter_config[ctr].event <= 0 || counter_config[ctr].event > NUM_EVENTS) {
@@ -470,7 +487,7 @@
 	
 	for (i = 0; i < maxbind; i++) {
 		if (ev->bindings[i].virt_counter & counter_bit) {
-			
+
 			/* modify ESCR */
 			ESCR_READ(escr, high, ev, i);
 			ESCR_CLEAR(escr);
@@ -499,6 +516,10 @@
 			return;
 		}
 	}
+
+	printk(KERN_ERR 
+	       "oprofile: P4 event code 0x%lx no binding, stag %d ctr %d\n",
+	       counter_config[ctr].event, stag, ctr);
 }
 
 
@@ -517,27 +538,35 @@
 		return;
 	}
 
-	/* clear all cccrs (including those outside our concern) */
-	for (i = stag ; i < num_cccrs ; i += (1 + stag)) {
-		RAW_CCCR_READ(low, high, i);
+	/* clear the cccrs we will use */
+	for (i = 0 ; i < num_counters ; i++) {
+		rdmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high);
+		CCCR_CLEAR(low);
+		CCCR_SET_REQUIRED_BITS(low);
+		wrmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high);
+	}
+
+	/* clear cccrs outside our concern */
+	for (i = stag ; i < NUM_UNUSED_CCCRS ; i += addr_increment()) {
+		rdmsr(p4_unused_cccr[i], low, high);
 		CCCR_CLEAR(low);
 		CCCR_SET_REQUIRED_BITS(low);
-		RAW_CCCR_WRITE(low, high, i);
+		wrmsr(p4_unused_cccr[i], low, high);
 	}
 
-	/* clear all escrs (including those outside out concern) */
+	/* clear all escrs (including those outside our concern) */
 	for (addr = MSR_P4_BSU_ESCR0 + stag;
-	     addr <= MSR_P4_SSU_ESCR0; addr += (1 + stag)){ 
+	     addr <= MSR_P4_SSU_ESCR0; addr += addr_increment()) { 
 		wrmsr(addr, 0, 0);
 	}
 	
 	for (addr = MSR_P4_MS_ESCR0 + stag;
-	     addr <= MSR_P4_TC_ESCR1; addr += (1 + stag)){ 
+	     addr <= MSR_P4_TC_ESCR1; addr += addr_increment()){ 
 		wrmsr(addr, 0, 0);
 	}
 	
 	for (addr = MSR_P4_IX_ESCR0 + stag;
-	     addr <= MSR_P4_CRU_ESCR3; addr += (1 + stag)){ 
+	     addr <= MSR_P4_CRU_ESCR3; addr += addr_increment()){ 
 		wrmsr(addr, 0, 0);
 	}
 
@@ -576,7 +605,7 @@
 
 	for (i = 0; i < num_counters; ++i) {
 		
-		if (!counter_config[i].event) 
+		if (!reset_value[i]) 
 			continue;
 
 		/* 
@@ -606,8 +635,6 @@
 			CCCR_CLEAR_OVF(low);
 			CCCR_WRITE(low, high, real);
  			CTR_WRITE(reset_value[i], real);
-			/* P4 quirk: you have to re-unmask the apic vector */
-			apic_write(APIC_LVTPC, apic_read(APIC_LVTPC) & ~APIC_LVT_MASKED);
 		}
 	}
 
diff -Nru a/arch/i386/vmlinux.lds.S b/arch/i386/vmlinux.lds.S
--- a/arch/i386/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
+++ b/arch/i386/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
@@ -54,7 +54,11 @@
   /* will be freed after init */
   . = ALIGN(4096);		/* Init code and data */
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
   . = ALIGN(16);
   __setup_start = .;
diff -Nru a/arch/ia64/Kconfig b/arch/ia64/Kconfig
--- a/arch/ia64/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/Kconfig	Sat Apr 19 19:51:50 2003
@@ -401,6 +401,15 @@
 
 endchoice
 
+config IA64_PAL_IDLE
+	bool "Use PAL_HALT_LIGHT in idle loop"
+	---help---
+	  Say Y here to enable use of PAL_HALT_LIGHT in the cpu_idle loop.
+	  This allows the CPU to enter a low power state when idle.  You
+	  can enable CONFIG_IA64_PALINFO and check /proc/pal/cpu0/power_info
+	  to see the power consumption and latency for this state.  If you're
+	  unsure your firmware supports it, answer N.
+
 config SMP
 	bool "SMP support"
 	---help---
diff -Nru a/arch/ia64/Makefile b/arch/ia64/Makefile
--- a/arch/ia64/Makefile	Sat Apr 19 19:51:28 2003
+++ b/arch/ia64/Makefile	Sat Apr 19 19:51:28 2003
@@ -14,6 +14,7 @@
 
 OBJCOPYFLAGS	:= --strip-all
 LDFLAGS_vmlinux	:= -static
+LDFLAGS_MODULE	+= -T arch/ia64/module.lds
 AFLAGS_KERNEL	:= -mconstant-gp
 EXTRA		:=
 
@@ -23,7 +24,7 @@
 
 GCC_VERSION=$(shell $(CC) -v 2>&1 | fgrep 'gcc version' | cut -f3 -d' ' | cut -f1 -d'.')
 
-GAS_STATUS=$(shell arch/ia64/scripts/check-gas $(CC))
+GAS_STATUS=$(shell arch/ia64/scripts/check-gas $(CC) $(OBJDUMP))
 
 ifeq ($(GAS_STATUS),buggy)
 $(error Sorry, you need a newer version of the assember, one that is built from	\
@@ -50,11 +51,8 @@
 core-$(CONFIG_IA64_GENERIC) 	+= arch/ia64/dig/ arch/ia64/hp/common/ arch/ia64/hp/zx1/ \
 				   arch/ia64/hp/sim/
 core-$(CONFIG_IA64_HP_ZX1)	+= arch/ia64/dig/
-core-$(CONFIG_IA64_SGI_SN)	+= arch/ia64/sn/kernel/ \
-				   arch/ia64/sn/io/ \
-				   arch/ia64/sn/io/sn2/ \
-				   arch/ia64/sn/io/sn2/pcibr/ \
-				   arch/ia64/sn/kernel/sn2/
+core-$(CONFIG_IA64_SGI_SN)	+= arch/ia64/sn/
+
 drivers-$(CONFIG_PCI)		+= arch/ia64/pci/
 drivers-$(CONFIG_IA64_HP_SIM)	+= arch/ia64/hp/sim/
 drivers-$(CONFIG_IA64_HP_ZX1)	+= arch/ia64/hp/common/ arch/ia64/hp/zx1/
diff -Nru a/arch/ia64/boot/Makefile b/arch/ia64/boot/Makefile
--- a/arch/ia64/boot/Makefile	Sat Apr 19 19:51:48 2003
+++ b/arch/ia64/boot/Makefile	Sat Apr 19 19:51:48 2003
@@ -9,7 +9,6 @@
 #
 
 targets-$(CONFIG_IA64_HP_SIM)  += bootloader
-targets-$(CONFIG_IA64_GENERIC) += bootloader
 targets := vmlinux.bin vmlinux.gz $(targets-y)
 
 quiet_cmd_cptotop = LN      $@
diff -Nru a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c
--- a/arch/ia64/hp/common/sba_iommu.c	Sat Apr 19 19:51:28 2003
+++ b/arch/ia64/hp/common/sba_iommu.c	Sat Apr 19 19:51:28 2003
@@ -1497,7 +1497,7 @@
 		ioc = &sba_dev->ioc[0];	/* FIXME: Multi-IOC support! */
 		total_pages = (int) (ioc->res_size << 3); /* 8 bits per byte */
 
-		sprintf(buf, "%s rev %d.%d\n", "Hewlett Packard zx1 SBA",
+		sprintf(buf, "%s rev %d.%d\n", "Hewlett-Packard zx1 SBA",
 			((sba_dev->hw_rev >> 4) & 0xF), (sba_dev->hw_rev & 0xF));
 		sprintf(buf, "%sIO PDIR size    : %d bytes (%d entries)\n", buf,
 			(int) ((ioc->res_size << 3) * sizeof(u64)), /* 8 bits/byte */ total_pages);
diff -Nru a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S
--- a/arch/ia64/ia32/ia32_entry.S	Sat Apr 19 19:51:48 2003
+++ b/arch/ia64/ia32/ia32_entry.S	Sat Apr 19 19:51:48 2003
@@ -253,7 +253,7 @@
 	data8 sys_umount	  /* recycled never used phys( */
 	data8 sys32_ni_syscall	  /* old lock syscall holder */
 	data8 sys32_ioctl
-	data8 sys32_fcntl	  /* 55 */
+	data8 compat_sys_fcntl	  /* 55 */
 	data8 sys32_ni_syscall	  /* old mpx syscall holder */
 	data8 sys_setpgid
 	data8 sys32_ni_syscall	  /* old ulimit syscall holder */
@@ -419,7 +419,7 @@
 	data8 sys_mincore
 	data8 sys_madvise
 	data8 sys_getdents64	  /* 220 */
-	data8 sys32_fcntl64
+	data8 compat_sys_fcntl64
 	data8 sys_ni_syscall		/* reserved for TUX */
 	data8 sys_ni_syscall		/* reserved for Security */
 	data8 sys_gettid
@@ -439,8 +439,8 @@
 	data8 sys_ni_syscall
 	data8 sys_ni_syscall
 	data8 compat_sys_futex	/* 240 */
-	data8 sys_ni_syscall
-	data8 sys_ni_syscall
+	data8 compat_sys_setaffinity
+	data8 compat_sys_getaffinity
 	data8 sys_ni_syscall
 	data8 sys_ni_syscall
 	data8 sys_ni_syscall	/* 245 */
diff -Nru a/arch/ia64/ia32/ia32_signal.c b/arch/ia64/ia32/ia32_signal.c
--- a/arch/ia64/ia32/ia32_signal.c	Sat Apr 19 19:51:28 2003
+++ b/arch/ia64/ia32/ia32_signal.c	Sat Apr 19 19:51:28 2003
@@ -114,6 +114,7 @@
 int
 copy_siginfo_to_user32 (siginfo_t32 *to, siginfo_t *from)
 {
+	unsigned int addr;
 	int err;
 
 	if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t32)))
@@ -147,6 +148,12 @@
 		case __SI_POLL >> 16:
 			err |= __put_user(from->si_band, &to->si_band);
 			err |= __put_user(from->si_fd, &to->si_fd);
+			break;
+		case __SI_TIMER >> 16:
+			err |= __put_user(from->si_tid, &to->si_tid);
+			err |= __put_user(from->si_overrun, &to->si_overrun);
+			addr = (unsigned long) from->si_ptr;
+			err |= __put_user(addr, &to->si_ptr);
 			break;
 		/* case __SI_RT: This is not generated by the kernel as of now.  */
 		}
diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c
--- a/arch/ia64/ia32/sys_ia32.c	Sat Apr 19 19:51:49 2003
+++ b/arch/ia64/ia32/sys_ia32.c	Sat Apr 19 19:51:49 2003
@@ -119,10 +119,8 @@
 
 asmlinkage long
 sys32_execve (char *filename, unsigned int argv, unsigned int envp,
-	      int dummy3, int dummy4, int dummy5, int dummy6, int dummy7,
-	      int stack)
+	      struct pt_regs *regs)
 {
-	struct pt_regs *regs = (struct pt_regs *)&stack;
 	unsigned long old_map_base, old_task_size, tssd;
 	char **av, **ae;
 	int na, ne, len;
@@ -1701,7 +1699,7 @@
 		return shmctl32(first, second, (void *)AA(ptr));
 
 	      default:
-		return -EINVAL;
+		return -ENOSYS;
 	}
 	return -EINVAL;
 }
@@ -2156,26 +2154,23 @@
 	ret = -ESRCH;
 	read_lock(&tasklist_lock);
 	child = find_task_by_pid(pid);
+	if (child)
+		get_task_struct(child);
 	read_unlock(&tasklist_lock);
 	if (!child)
 		goto out;
 	ret = -EPERM;
 	if (pid == 1)		/* no messing around with init! */
-		goto out;
+		goto out_tsk;
 
 	if (request == PTRACE_ATTACH) {
 		ret = sys_ptrace(request, pid, addr, data, arg4, arg5, arg6, arg7, stack);
-		goto out;
-	}
-	ret = -ESRCH;
-	if (!(child->ptrace & PT_PTRACED))
-		goto out;
-	if (child->state != TASK_STOPPED) {
-		if (request != PTRACE_KILL)
-			goto out;
+		goto out_tsk;
 	}
-	if (child->parent != current)
-		goto out;
+
+	ret = ptrace_check_attach(child, request == PTRACE_KILL);
+	if (ret < 0)
+		goto out_tsk;
 
 	switch (request) {
 	      case PTRACE_PEEKTEXT:
@@ -2185,12 +2180,12 @@
 			ret = put_user(value, (unsigned int *) A(data));
 		else
 			ret = -EIO;
-		goto out;
+		goto out_tsk;
 
 	      case PTRACE_POKETEXT:
 	      case PTRACE_POKEDATA:	/* write the word at location addr */
 		ret = ia32_poke(regs, child, addr, data);
-		goto out;
+		goto out_tsk;
 
 	      case PTRACE_PEEKUSR:	/* read word at addr in USER area */
 		ret = -EIO;
@@ -2265,43 +2260,13 @@
 		break;
 
 	}
+  out_tsk:
+	put_task_struct(child);
   out:
 	unlock_kernel();
 	return ret;
 }
 
-extern asmlinkage long sys_fcntl (unsigned int fd, unsigned int cmd, unsigned long arg);
-
-asmlinkage long
-sys32_fcntl (unsigned int fd, unsigned int cmd, unsigned int arg)
-{
-	mm_segment_t old_fs;
-	struct flock f;
-	long ret;
-
-	switch (cmd) {
-	      case F_GETLK:
-	      case F_SETLK:
-	      case F_SETLKW:
-		if (get_compat_flock(&f, (struct compat_flock *) A(arg)))
-			return -EFAULT;
-		old_fs = get_fs();
-		set_fs(KERNEL_DS);
-		ret = sys_fcntl(fd, cmd, (unsigned long) &f);
-		set_fs(old_fs);
-		if (cmd == F_GETLK && put_compat_flock(&f, (struct compat_flock *) A(arg)))
-			return -EFAULT;
-		return ret;
-
-	      default:
-		/*
-		 *  `sys_fcntl' lies about arg, for the F_SETOWN
-		 *  sub-function arg can have a negative value.
-		 */
-		return sys_fcntl(fd, cmd, arg);
-	}
-}
-
 asmlinkage long sys_ni_syscall(void);
 
 asmlinkage long
@@ -2593,66 +2558,6 @@
 	set_fs(KERNEL_DS);
 	ret = sys_setgroups(gidsetsize, gl);
 	set_fs(old_fs);
-	return ret;
-}
-
-/*
- * Unfortunately, the x86 compiler aligns variables of type "long long" to a 4 byte boundary
- * only, which means that the x86 version of "struct flock64" doesn't match the ia64 version
- * of struct flock.
- */
-
-static inline long
-ia32_put_flock (struct flock *l, unsigned long addr)
-{
-	return (put_user(l->l_type, (short *) addr)
-		| put_user(l->l_whence, (short *) (addr + 2))
-		| put_user(l->l_start, (long *) (addr + 4))
-		| put_user(l->l_len, (long *) (addr + 12))
-		| put_user(l->l_pid, (int *) (addr + 20)));
-}
-
-static inline long
-ia32_get_flock (struct flock *l, unsigned long addr)
-{
-	unsigned int start_lo, start_hi, len_lo, len_hi;
-	int err = (get_user(l->l_type, (short *) addr)
-		   | get_user(l->l_whence, (short *) (addr + 2))
-		   | get_user(start_lo, (int *) (addr + 4))
-		   | get_user(start_hi, (int *) (addr + 8))
-		   | get_user(len_lo, (int *) (addr + 12))
-		   | get_user(len_hi, (int *) (addr + 16))
-		   | get_user(l->l_pid, (int *) (addr + 20)));
-	l->l_start = ((unsigned long) start_hi << 32) | start_lo;
-	l->l_len = ((unsigned long) len_hi << 32) | len_lo;
-	return err;
-}
-
-asmlinkage long
-sys32_fcntl64 (unsigned int fd, unsigned int cmd, unsigned int arg)
-{
-	mm_segment_t old_fs;
-	struct flock f;
-	long ret;
-
-	switch (cmd) {
-	      case F_GETLK64:
-	      case F_SETLK64:
-	      case F_SETLKW64:
-		if (ia32_get_flock(&f, arg))
-			return -EFAULT;
-		old_fs = get_fs();
-		set_fs(KERNEL_DS);
-		ret = sys_fcntl(fd, cmd, (unsigned long) &f);
-		set_fs(old_fs);
-		if (cmd == F_GETLK && ia32_put_flock(&f, arg))
-			return -EFAULT;
-		break;
-
-	      default:
-		ret = sys32_fcntl(fd, cmd, arg);
-		break;
-	}
 	return ret;
 }
 
diff -Nru a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
--- a/arch/ia64/kernel/Makefile	Sat Apr 19 19:51:51 2003
+++ b/arch/ia64/kernel/Makefile	Sat Apr 19 19:51:51 2003
@@ -4,16 +4,15 @@
 
 extra-y	:= head.o init_task.o
 
-obj-y := acpi.o entry.o gate.o efi.o efi_stub.o ia64_ksyms.o \
-	 irq.o irq_ia64.o irq_lsapic.o ivt.o \
-	 machvec.o pal.o process.o perfmon.o ptrace.o sal.o \
-	 semaphore.o setup.o	\
-	 signal.o sys_ia64.o traps.o time.o unaligned.o unwind.o
+obj-y := acpi.o entry.o efi.o efi_stub.o gate.o ia64_ksyms.o irq.o irq_ia64.o irq_lsapic.o	\
+	 ivt.o machvec.o pal.o perfmon.o process.o ptrace.o sal.o semaphore.o setup.o signal.o	\
+	 sys_ia64.o time.o traps.o unaligned.o unwind.o
 
-obj-$(CONFIG_FSYS) += fsys.o
-obj-$(CONFIG_IOSAPIC) += iosapic.o
-obj-$(CONFIG_IA64_PALINFO) += palinfo.o
-obj-$(CONFIG_EFI_VARS) += efivars.o
-obj-$(CONFIG_SMP) += smp.o smpboot.o
-obj-$(CONFIG_IA64_MCA) += mca.o mca_asm.o
-obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o
+obj-$(CONFIG_EFI_VARS)		+= efivars.o
+obj-$(CONFIG_FSYS)		+= fsys.o
+obj-$(CONFIG_IA64_BRL_EMU)	+= brl_emu.o
+obj-$(CONFIG_IA64_MCA)		+= mca.o mca_asm.o
+obj-$(CONFIG_IA64_PALINFO)	+= palinfo.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-ext.c b/arch/ia64/kernel/acpi-ext.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/kernel/acpi-ext.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,71 @@
+/*
+ * arch/ia64/kernel/acpi-ext.c
+ *
+ * Copyright (C) 2003 Hewlett-Packard
+ * Copyright (C) Alex Williamson
+ *
+ * Vendor specific extensions to ACPI.  These are used by both
+ * HP and NEC.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/acpi.h>
+#include <linux/efi.h>
+
+#include <asm/acpi-ext.h>
+
+/*
+ * Note: Strictly speaking, this is only needed for HP and NEC machines.
+ *	 However, NEC machines identify themselves as DIG-compliant, so there is
+ *	 no easy way to #ifdef this out.
+ */
+acpi_status
+hp_acpi_csr_space (acpi_handle obj, u64 *csr_base, u64 *csr_length)
+{
+	int i, offset = 0;
+	acpi_status status;
+	struct acpi_buffer buf;
+	struct acpi_resource_vendor *res;
+	struct acpi_hp_vendor_long *hp_res;
+	efi_guid_t vendor_guid;
+
+	*csr_base = 0;
+	*csr_length = 0;
+
+	status = acpi_get_crs(obj, &buf);
+	if (ACPI_FAILURE(status)) {
+		printk(KERN_ERR PREFIX "Unable to get _CRS data on object\n");
+		return status;
+	}
+
+	res = (struct acpi_resource_vendor *)acpi_get_crs_type(&buf, &offset, ACPI_RSTYPE_VENDOR);
+	if (!res) {
+		printk(KERN_ERR PREFIX "Failed to find config space for device\n");
+		acpi_dispose_crs(&buf);
+		return AE_NOT_FOUND;
+	}
+
+	hp_res = (struct acpi_hp_vendor_long *)(res->reserved);
+
+	if (res->length != HP_CCSR_LENGTH || hp_res->guid_id != HP_CCSR_TYPE) {
+		printk(KERN_ERR PREFIX "Unknown Vendor data\n");
+		acpi_dispose_crs(&buf);
+		return AE_TYPE; /* Revisit error? */
+	}
+
+	memcpy(&vendor_guid, hp_res->guid, sizeof(efi_guid_t));
+	if (efi_guidcmp(vendor_guid, HP_CCSR_GUID) != 0) {
+		printk(KERN_ERR PREFIX "Vendor GUID does not match\n");
+		acpi_dispose_crs(&buf);
+		return AE_TYPE; /* Revisit error? */
+	}
+
+	for (i = 0 ; i < 8 ; i++) {
+		*csr_base |= ((u64)(hp_res->csr_base[i]) << (i * 8));
+		*csr_length |= ((u64)(hp_res->csr_length[i]) << (i * 8));
+	}
+
+	acpi_dispose_crs(&buf);
+	return AE_OK;
+}
diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
--- a/arch/ia64/kernel/acpi.c	Sat Apr 19 19:51:47 2003
+++ b/arch/ia64/kernel/acpi.c	Sat Apr 19 19:51:47 2003
@@ -9,7 +9,7 @@
  *  Copyright (C) 2000,2001 J.I. Lee <jung-ik.lee@intel.com>
  *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
  *  Copyright (C) 2001 Jenna Hall <jenna.s.hall@intel.com>
- *  Copyright (C) 2001 Takayoshi Kochi <t-kouchi@cq.jp.nec.com>
+ *  Copyright (C) 2001 Takayoshi Kochi <t-kochi@bq.jp.nec.com>
  *  Copyright (C) 2002 Erich Focht <efocht@ess.nec.de>
  *
  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -109,8 +109,6 @@
 	return "sn2";
 # elif defined (CONFIG_IA64_DIG)
 	return "dig";
-# elif defined (CONFIG_IA64_HP_ZX1)
-	return "hpzx1";
 # else
 #	error Unknown platform.  Fix acpi.c.
 # endif
@@ -176,6 +174,73 @@
 	kfree(buf->pointer);
 }
 
+void
+acpi_get_crs_addr (struct acpi_buffer *buf, int type, u64 *base, u64 *size, u64 *tra)
+{
+	int offset = 0;
+	struct acpi_resource_address16 *addr16;
+	struct acpi_resource_address32 *addr32;
+	struct acpi_resource_address64 *addr64;
+
+	for (;;) {
+		struct acpi_resource *res = acpi_get_crs_next(buf, &offset);
+		if (!res)
+			return;
+		switch (res->id) {
+			case ACPI_RSTYPE_ADDRESS16:
+				addr16 = (struct acpi_resource_address16 *) &res->data;
+
+				if (type == addr16->resource_type) {
+					*base = addr16->min_address_range;
+					*size = addr16->address_length;
+					*tra = addr16->address_translation_offset;
+					return;
+				}
+				break;
+			case ACPI_RSTYPE_ADDRESS32:
+				addr32 = (struct acpi_resource_address32 *) &res->data;
+				if (type == addr32->resource_type) {
+					*base = addr32->min_address_range;
+					*size = addr32->address_length;
+					*tra = addr32->address_translation_offset;
+					return;
+				}
+				break;
+			case ACPI_RSTYPE_ADDRESS64:
+				addr64 = (struct acpi_resource_address64 *) &res->data;
+				if (type == addr64->resource_type) {
+					*base = addr64->min_address_range;
+					*size = addr64->address_length;
+					*tra = addr64->address_translation_offset;
+					return;
+				}
+				break;
+		}
+	}
+}
+
+int
+acpi_get_addr_space(void *obj, u8 type, u64 *base, u64 *length, u64 *tra)
+{
+	acpi_status status;
+	struct acpi_buffer buf;
+
+	*base = 0;
+	*length = 0;
+	*tra = 0;
+
+	status = acpi_get_crs((acpi_handle)obj, &buf);
+	if (ACPI_FAILURE(status)) {
+		printk(KERN_ERR PREFIX "Unable to get _CRS data on object\n");
+		return status;
+	}
+
+	acpi_get_crs_addr(&buf, type, base, length, tra);
+
+	acpi_dispose_crs(&buf);
+
+	return AE_OK;
+}
 #endif /* CONFIG_ACPI */
 
 #ifdef CONFIG_ACPI_BOOT
@@ -808,6 +873,7 @@
 
 	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;
diff -Nru a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
--- a/arch/ia64/kernel/entry.S	Sat Apr 19 19:51:29 2003
+++ b/arch/ia64/kernel/entry.S	Sat Apr 19 19:51:29 2003
@@ -91,7 +91,7 @@
 END(ia64_execve)
 
 /*
- * sys_clone2(u64 flags, u64 ustack_base, u64 ustack_size, u64 child_tidptr, u64 parent_tidptr,
+ * sys_clone2(u64 flags, u64 ustack_base, u64 ustack_size, u64 parent_tidptr, u64 child_tidptr,
  *	      u64 tls)
  */
 GLOBAL_ENTRY(sys_clone2)
@@ -105,10 +105,10 @@
 	mov out1=in1
 	mov out3=in2
 	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT
-	mov out4=in3	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID
+	mov out4=in3	// parent_tidptr: valid only w/CLONE_PARENT_SETTID
 	;;
 (p6)	st8 [r2]=in5				// store TLS in r16 for copy_thread()
-	mov out5=in4	// parent_tidptr: valid only w/CLONE_PARENT_SETTID
+	mov out5=in4	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID
 	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
 	dep out0=0,in0,CLONE_IDLETASK_BIT,1	// out0 = clone_flags & ~CLONE_IDLETASK
 	br.call.sptk.many rp=do_fork
@@ -126,12 +126,12 @@
 END(sys_clone2)
 
 /*
- * sys_clone(u64 flags, u64 ustack_base, u64 user_tid, u64 tls)
+ * sys_clone(u64 flags, u64 ustack_base, u64 parent_tidptr, u64 child_tidptr, u64 tls)
  *	Deprecated.  Use sys_clone2() instead.
  */
 GLOBAL_ENTRY(sys_clone)
 	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(2)
-	alloc r16=ar.pfs,4,2,5,0
+	alloc r16=ar.pfs,5,2,6,0
 	DO_SAVE_SWITCH_STACK
 	adds r2=PT(R16)+IA64_SWITCH_STACK_SIZE+16,sp
 	mov loc0=rp
@@ -140,9 +140,10 @@
 	mov out1=in1
 	mov out3=16				// stacksize (compensates for 16-byte scratch area)
 	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT
-	mov out4=in2				// out4 = user_tid (optional)
+	mov out4=in2	// parent_tidptr: valid only w/CLONE_PARENT_SETTID
 	;;
-(p6)	st8 [r2]=in3				// store TLS in r13 (tp)
+(p6)	st8 [r2]=in4				// store TLS in r13 (tp)
+	mov out5=in3	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID
 	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = &regs
 	dep out0=0,in0,CLONE_IDLETASK_BIT,1	// out0 = clone_flags & ~CLONE_IDLETASK
 	br.call.sptk.many rp=do_fork
diff -Nru a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S
--- a/arch/ia64/kernel/fsys.S	Sat Apr 19 19:51:27 2003
+++ b/arch/ia64/kernel/fsys.S	Sat Apr 19 19:51:27 2003
@@ -533,15 +533,15 @@
 	data8 fsys_fallback_syscall	// epoll_wait		// 1245
 	data8 fsys_fallback_syscall	// restart_syscall
 	data8 fsys_fallback_syscall	// semtimedop
-	data8 fsys_fallback_syscall
-	data8 fsys_fallback_syscall
-	data8 fsys_fallback_syscall				// 1250
-	data8 fsys_fallback_syscall
-	data8 fsys_fallback_syscall
-	data8 fsys_fallback_syscall
-	data8 fsys_fallback_syscall
-	data8 fsys_fallback_syscall				// 1255
-	data8 fsys_fallback_syscall
+	data8 fsys_fallback_syscall	// timer_create
+	data8 fsys_fallback_syscall	// timer_settime
+	data8 fsys_fallback_syscall	// timer_gettime 	// 1250
+	data8 fsys_fallback_syscall	// timer_getoverrun
+	data8 fsys_fallback_syscall	// timer_delete
+	data8 fsys_fallback_syscall	// clock_settime
+	data8 fsys_fallback_syscall	// clock_gettime
+	data8 fsys_fallback_syscall	// clock_getres		// 1255
+	data8 fsys_fallback_syscall	// clock_nanosleep
 	data8 fsys_fallback_syscall
 	data8 fsys_fallback_syscall
 	data8 fsys_fallback_syscall
diff -Nru a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S
--- a/arch/ia64/kernel/head.S	Sat Apr 19 19:51:49 2003
+++ b/arch/ia64/kernel/head.S	Sat Apr 19 19:51:49 2003
@@ -733,73 +733,3 @@
 SET_REG(b5);
 
 #endif /* CONFIG_IA64_BRL_EMU */
-
-#ifdef CONFIG_SMP
-
-	/*
-	 * This routine handles spinlock contention.  It uses a simple exponential backoff
-	 * algorithm to reduce unnecessary bus traffic.  The initial delay is selected from
-	 * the low-order bits of the cycle counter (a cheap "randomizer").  I'm sure this
-	 * could use additional tuning, especially on systems with a large number of CPUs.
-	 * Also, I think the maximum delay should be made a function of the number of CPUs in
-	 * the system. --davidm 00/08/05
-	 *
-	 * WARNING: This is not a normal procedure.  It gets called from C code without
-	 * the compiler knowing about it.  Thus, we must not use any scratch registers
-	 * beyond those that were declared "clobbered" at the call-site (see spin_lock()
-	 * macro).  We may not even use the stacked registers, because that could overwrite
-	 * output registers.  Similarly, we can't use the scratch stack area as it may be
-	 * in use, too.
-	 *
-	 * Inputs:
-	 *	ar.ccv = 0 (and available for use)
-	 *	r28 = available for use
-	 *	r29 = available for use
-	 *	r30 = non-zero (and available for use)
-	 *	r31 = address of lock we're trying to acquire
-	 *	p15 = available for use
-	 */
-
-#	define delay	r28
-#	define timeout	r29
-#	define tmp	r30
-
-GLOBAL_ENTRY(ia64_spinlock_contention)
-	mov tmp=ar.itc
-	;;
-	and delay=0x3f,tmp
-	;;
-
-.retry:	add timeout=tmp,delay
-	shl delay=delay,1
-	;;
-	dep delay=delay,r0,0,13	// limit delay to 8192 cycles
-	;;
-	// delay a little...
-.wait:	sub tmp=tmp,timeout
-	or delay=0xf,delay	// make sure delay is non-zero (otherwise we get stuck with 0)
-	;;
-	cmp.lt p15,p0=tmp,r0
-	mov tmp=ar.itc
-(p15)	br.cond.sptk .wait
-	;;
-	ld4 tmp=[r31]
-	;;
-	cmp.ne p15,p0=tmp,r0
-	mov tmp=ar.itc
-(p15)	br.cond.sptk .retry	// lock is still busy
-	;;
-	// try acquiring lock (we know ar.ccv is still zero!):
-	mov tmp=1
-	;;
-	cmpxchg4.acq tmp=[r31],tmp,ar.ccv
-	;;
-	cmp.eq p15,p0=tmp,r0
-
-	mov tmp=ar.itc
-(p15)	br.ret.sptk.many b7	// got lock -> return
-	br .retry		// still no luck, retry
-
-END(ia64_spinlock_contention)
-
-#endif
diff -Nru a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c
--- a/arch/ia64/kernel/ia64_ksyms.c	Sat Apr 19 19:51:47 2003
+++ b/arch/ia64/kernel/ia64_ksyms.c	Sat Apr 19 19:51:47 2003
@@ -57,9 +57,7 @@
 EXPORT_SYMBOL(clear_page);
 
 #include <asm/processor.h>
-# ifndef CONFIG_NUMA
 EXPORT_SYMBOL(cpu_info__per_cpu);
-# endif
 EXPORT_SYMBOL(kernel_thread);
 
 #include <asm/system.h>
@@ -147,3 +145,19 @@
 EXPORT_SYMBOL(pfm_install_alternate_syswide_subsystem);
 EXPORT_SYMBOL(pfm_remove_alternate_syswide_subsystem);
 #endif
+
+#ifdef CONFIG_NUMA
+#include <asm/numa.h>
+EXPORT_SYMBOL(cpu_to_node_map);
+#endif
+
+#include <asm/unwind.h>
+EXPORT_SYMBOL(unw_init_from_blocked_task);
+EXPORT_SYMBOL(unw_init_running);
+EXPORT_SYMBOL(unw_unwind);
+EXPORT_SYMBOL(unw_unwind_to_user);
+EXPORT_SYMBOL(unw_access_gr);
+EXPORT_SYMBOL(unw_access_br);
+EXPORT_SYMBOL(unw_access_fr);
+EXPORT_SYMBOL(unw_access_ar);
+EXPORT_SYMBOL(unw_access_pr);
diff -Nru a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c
--- a/arch/ia64/kernel/mca.c	Sat Apr 19 19:51:47 2003
+++ b/arch/ia64/kernel/mca.c	Sat Apr 19 19:51:47 2003
@@ -42,6 +42,10 @@
 #include <linux/smp_lock.h>
 #include <linux/bootmem.h>
 #include <linux/acpi.h>
+#include <linux/timer.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/smp.h>
 
 #include <asm/machvec.h>
 #include <asm/page.h>
@@ -67,7 +71,7 @@
 u64				ia64_mca_stack[1024] __attribute__((aligned(16)));
 u64				ia64_mca_stackframe[32];
 u64				ia64_mca_bspstore[1024];
-u64				ia64_init_stack[KERNEL_STACK_SIZE] __attribute__((aligned(16)));
+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;
@@ -105,6 +109,19 @@
 	.name =		"cpe_hndlr"
 };
 
+#define MAX_CPE_POLL_INTERVAL (15*60*HZ) /* 15 minutes */
+#define MIN_CPE_POLL_INTERVAL (2*60*HZ)  /* 2 minutes */
+#define CMC_POLL_INTERVAL     (1*60*HZ)  /* 1 minute */
+#define CMC_HISTORY_LENGTH    5
+
+static struct timer_list cpe_poll_timer;
+static struct timer_list cmc_poll_timer;
+/*
+ * Start with this in the wrong state so we won't play w/ timers
+ * before the system is ready.
+ */
+static int cmc_polling_enabled = 1;
+
 /*
  *  ia64_mca_log_sal_error_record
  *
@@ -152,7 +169,8 @@
 void
 ia64_mca_cpe_int_handler (int cpe_irq, void *arg, struct pt_regs *ptregs)
 {
-	IA64_MCA_DEBUG("ia64_mca_cpe_int_handler: received interrupt. vector = %#x\n", cpe_irq);
+	IA64_MCA_DEBUG("ia64_mca_cpe_int_handler: received interrupt. CPU:%d vector = %#x\n",
+		       smp_processor_id(), cpe_irq);
 
 	/* Get the CMC error record and log it */
 	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE, 0);
@@ -295,6 +313,60 @@
 		       smp_processor_id(), ia64_get_cmcv());
 }
 
+/*
+ * ia64_mca_cmc_vector_disable
+ *
+ *  Mask the corrected machine check vector register in the processor.
+ *  This function is invoked on a per-processor basis.
+ *
+ * Inputs
+ *      dummy(unused)
+ *
+ * Outputs
+ *	None
+ */
+void
+ia64_mca_cmc_vector_disable (void *dummy)
+{
+	cmcv_reg_t	cmcv;
+	
+	cmcv = (cmcv_reg_t)ia64_get_cmcv();
+
+	cmcv.cmcv_mask = 1; /* Mask/disable interrupt */
+	ia64_set_cmcv(cmcv.cmcv_regval);
+
+	IA64_MCA_DEBUG("ia64_mca_cmc_vector_disable: CPU %d corrected "
+		       "machine check vector %#x disabled.\n",
+		       smp_processor_id(), cmcv.cmcv_vector);
+}
+
+/*
+ * ia64_mca_cmc_vector_enable
+ *
+ *  Unmask the corrected machine check vector register in the processor.
+ *  This function is invoked on a per-processor basis.
+ *
+ * Inputs
+ *      dummy(unused)
+ *
+ * Outputs
+ *	None
+ */
+void
+ia64_mca_cmc_vector_enable (void *dummy)
+{
+	cmcv_reg_t	cmcv;
+	
+	cmcv = (cmcv_reg_t)ia64_get_cmcv();
+
+	cmcv.cmcv_mask = 0; /* Unmask/enable interrupt */
+	ia64_set_cmcv(cmcv.cmcv_regval);
+
+	IA64_MCA_DEBUG("ia64_mca_cmc_vector_enable: CPU %d corrected "
+		       "machine check vector %#x enabled.\n",
+		       smp_processor_id(), cmcv.cmcv_vector);
+}
+
 
 #if defined(MCA_TEST)
 
@@ -396,7 +468,7 @@
 					 SAL_MC_PARAM_MECHANISM_INT,
 					 IA64_MCA_RENDEZ_VECTOR,
 					 IA64_MCA_RENDEZ_TIMEOUT,
-					 0)))
+					 SAL_MC_PARAM_RZ_ALWAYS)))
 	{
 		printk(KERN_ERR "ia64_mca_init: Failed to register rendezvous interrupt "
 		       "with SAL.  rc = %ld\n", rc);
@@ -494,9 +566,7 @@
 					setup_irq(irq, &mca_cpe_irqaction);
 				}
 			ia64_mca_register_cpev(cpev);
-		} else
-			printk(KERN_ERR
-			       "ia64_mca_init: Failed to get routed CPEI vector from ACPI.\n");
+		}
 	}
 
 	/* Initialize the areas set aside by the OS to buffer the
@@ -610,14 +680,11 @@
 ia64_mca_rendez_int_handler(int rendez_irq, void *arg, struct pt_regs *ptregs)
 {
 	unsigned long flags;
-	int cpu = 0;
+	int cpu = smp_processor_id();
 
 	/* Mask all interrupts */
 	local_irq_save(flags);
 
-#ifdef CONFIG_SMP
-	cpu = cpu_logical_id(hard_smp_processor_id());
-#endif
 	ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE;
 	/* Register with the SAL monarch that the slave has
 	 * reached SAL
@@ -751,11 +818,68 @@
 void
 ia64_mca_cmc_int_handler(int cmc_irq, void *arg, struct pt_regs *ptregs)
 {
+	static unsigned long	cmc_history[CMC_HISTORY_LENGTH];
+	static int		index;
+	static spinlock_t	cmc_history_lock = SPIN_LOCK_UNLOCKED;
+
 	IA64_MCA_DEBUG("ia64_mca_cmc_int_handler: received interrupt vector = %#x on CPU %d\n",
 		       cmc_irq, smp_processor_id());
 
 	/* Get the CMC error record and log it */
 	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CMC, 0);
+
+	spin_lock(&cmc_history_lock);
+	if (!cmc_polling_enabled) {
+		int i, count = 1; /* we know 1 happened now */
+		unsigned long now = jiffies;
+		
+		for (i = 0; i < CMC_HISTORY_LENGTH; i++) {
+			if (now - cmc_history[i] <= HZ)
+				count++;
+		}
+
+		IA64_MCA_DEBUG(KERN_INFO "CMC threshold %d/%d\n", count, CMC_HISTORY_LENGTH);
+		if (count >= CMC_HISTORY_LENGTH) {
+			/*
+			 * CMC threshold exceeded, clear the history
+			 * so we have a fresh start when we return
+			 */
+			for (index = 0 ; index < CMC_HISTORY_LENGTH; index++)
+				cmc_history[index] = 0;
+			index = 0;
+
+			/* Switch to polling mode */
+			cmc_polling_enabled = 1;
+
+			/*
+			 * Unlock & enable interrupts  before
+			 * smp_call_function or risk deadlock
+			 */
+			spin_unlock(&cmc_history_lock);
+			ia64_mca_cmc_vector_disable(NULL);
+
+			local_irq_enable();
+			smp_call_function(ia64_mca_cmc_vector_disable, NULL, 1, 1);
+
+			/*
+			 * Corrected errors will still be corrected, but
+			 * make sure there's a log somewhere that indicates
+			 * something is generating more than we can handle.
+			 */
+			printk(KERN_WARNING "ia64_mca_cmc_int_handler: WARNING: Switching to polling CMC handler, error records may be lost\n");
+			
+
+			mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL);
+
+			/* lock already released, get out now */
+			return;
+		} else {
+			cmc_history[index++] = now;
+			if (index == CMC_HISTORY_LENGTH)
+				index = 0;
+		}
+	}
+	spin_unlock(&cmc_history_lock);
 }
 
 /*
@@ -768,6 +892,7 @@
 {
 	spinlock_t	isl_lock;
 	int		isl_index;
+	unsigned long	isl_count;
 	ia64_err_rec_t  *isl_log[IA64_MAX_LOGS]; /* need space to store header + error log */
 } ia64_state_log_t;
 
@@ -784,11 +909,145 @@
 #define IA64_LOG_NEXT_INDEX(it)    ia64_state_log[it].isl_index
 #define IA64_LOG_CURR_INDEX(it)    1 - ia64_state_log[it].isl_index
 #define IA64_LOG_INDEX_INC(it) \
-    ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index
+    {ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index; \
+    ia64_state_log[it].isl_count++;}
 #define IA64_LOG_INDEX_DEC(it) \
     ia64_state_log[it].isl_index = 1 - ia64_state_log[it].isl_index
 #define IA64_LOG_NEXT_BUFFER(it)   (void *)((ia64_state_log[it].isl_log[IA64_LOG_NEXT_INDEX(it)]))
 #define IA64_LOG_CURR_BUFFER(it)   (void *)((ia64_state_log[it].isl_log[IA64_LOG_CURR_INDEX(it)]))
+#define IA64_LOG_COUNT(it)         ia64_state_log[it].isl_count
+
+/*
+ *  ia64_mca_cmc_int_caller
+ *
+ * 	Call CMC interrupt handler, only purpose is to have a
+ * 	smp_call_function callable entry.
+ *
+ * Inputs   :	dummy(unused)
+ * Outputs  :	None
+ * */
+static void
+ia64_mca_cmc_int_caller(void *dummy)
+{
+	ia64_mca_cmc_int_handler(0, NULL, NULL);
+}
+
+/*
+ *  ia64_mca_cmc_poll
+ *
+ *	Poll for Corrected Machine Checks (CMCs)
+ *
+ * Inputs   :   dummy(unused)
+ * Outputs  :   None
+ *
+ */
+static void
+ia64_mca_cmc_poll (unsigned long dummy)
+{
+	int start_count;
+
+	start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CMC);
+
+	/* Call the interrupt handler */
+	smp_call_function(ia64_mca_cmc_int_caller, NULL, 1, 1);
+	local_irq_disable();
+	ia64_mca_cmc_int_caller(NULL);
+	local_irq_enable();
+
+	/*
+	 * If no log recored, switch out of polling mode.
+	 */
+	if (start_count == IA64_LOG_COUNT(SAL_INFO_TYPE_CMC)) {
+		printk(KERN_WARNING "ia64_mca_cmc_poll: Returning to interrupt driven CMC handler\n");
+		cmc_polling_enabled = 0;
+		smp_call_function(ia64_mca_cmc_vector_enable, NULL, 1, 1);
+		ia64_mca_cmc_vector_enable(NULL);
+	} else {
+		mod_timer(&cmc_poll_timer, jiffies + CMC_POLL_INTERVAL);
+	}
+}
+
+/*
+ *  ia64_mca_cpe_int_caller
+ *
+ * 	Call CPE interrupt handler, only purpose is to have a
+ * 	smp_call_function callable entry.
+ *
+ * Inputs   :	dummy(unused)
+ * Outputs  :	None
+ * */
+static void
+ia64_mca_cpe_int_caller(void *dummy)
+{
+	ia64_mca_cpe_int_handler(0, NULL, NULL);
+}
+
+/*
+ *  ia64_mca_cpe_poll
+ *
+ *	Poll for Corrected Platform Errors (CPEs), dynamically adjust
+ *	polling interval based on occurance of an event.
+ *
+ * Inputs   :   dummy(unused)
+ * Outputs  :   None
+ *
+ */
+static void
+ia64_mca_cpe_poll (unsigned long dummy)
+{
+	int start_count;
+	static int poll_time = MAX_CPE_POLL_INTERVAL;
+
+	start_count = IA64_LOG_COUNT(SAL_INFO_TYPE_CPE);
+
+	/* Call the interrupt handler */
+	smp_call_function(ia64_mca_cpe_int_caller, NULL, 1, 1);
+	local_irq_disable();
+	ia64_mca_cpe_int_caller(NULL);
+	local_irq_enable();
+
+	/*
+	 * If a log was recorded, increase our polling frequency,
+	 * otherwise, backoff.
+	 */
+	if (start_count != IA64_LOG_COUNT(SAL_INFO_TYPE_CPE)) {
+		poll_time = max(MIN_CPE_POLL_INTERVAL, poll_time/2);
+	} else {
+		poll_time = min(MAX_CPE_POLL_INTERVAL, poll_time * 2);
+	}
+	mod_timer(&cpe_poll_timer, jiffies + poll_time);
+}
+
+/*
+ * ia64_mca_late_init
+ *
+ *	Opportunity to setup things that require initialization later
+ *	than ia64_mca_init.  Setup a timer to poll for CPEs if the
+ *	platform doesn't support an interrupt driven mechanism.
+ *
+ *  Inputs  :   None
+ *  Outputs :   Status
+ */
+static int __init
+ia64_mca_late_init(void)
+{
+	init_timer(&cmc_poll_timer);
+	cmc_poll_timer.function = ia64_mca_cmc_poll;
+
+	/* Reset to the correct state */
+	cmc_polling_enabled = 0;
+
+	init_timer(&cpe_poll_timer);
+	cpe_poll_timer.function = ia64_mca_cpe_poll;
+
+	/* If platform doesn't support CPEI, get the timer going. */
+	if (acpi_request_vector(ACPI_INTERRUPT_CPEI) < 0)
+		ia64_mca_cpe_poll(0UL);
+
+	return 0;
+}
+
+device_initcall(ia64_mca_late_init);
 
 /*
  * C portion of the OS INIT handler
@@ -949,7 +1208,6 @@
 		return total_len;
 	} else {
 		IA64_LOG_UNLOCK(sal_info_type);
-		prfunc("ia64_log_get: No SAL error record available for type %d\n", sal_info_type);
 		return 0;
 	}
 }
diff -Nru a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/kernel/module.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,889 @@
+/*
+ * IA-64-specific support for kernel module loader.
+ *
+ * Copyright (C) 2003 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *
+ * Loosely based on patch by Rusty Russell.
+ */
+
+/* relocs tested so far:
+
+   DIR64LSB
+   FPTR64LSB
+   GPREL22
+   LDXMOV
+   LDXMOV
+   LTOFF22
+   LTOFF22X
+   LTOFF22X
+   LTOFF_FPTR22
+   PCREL21B
+   PCREL64LSB
+   SECREL32LSB
+   SEGREL64LSB
+ */
+
+#include <linux/config.h>
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/elf.h>
+#include <linux/moduleloader.h>
+#include <linux/string.h>
+#include <linux/vmalloc.h>
+
+#include <asm/unaligned.h>
+
+#define ARCH_MODULE_DEBUG 0
+
+#if ARCH_MODULE_DEBUG
+# define DEBUGP printk
+# define inline
+#else
+# define DEBUGP(fmt , a...)
+#endif
+
+#ifdef CONFIG_ITANIUM
+# define USE_BRL	0
+#else
+# define USE_BRL	1
+#endif
+
+#define MAX_LTOFF	((uint64_t) (1 << 22))	/* max. allowable linkage-table offset */
+
+/* Define some relocation helper macros/types: */
+
+#define FORMAT_SHIFT	0
+#define FORMAT_BITS	3
+#define FORMAT_MASK	((1 << FORMAT_BITS) - 1)
+#define VALUE_SHIFT	3
+#define VALUE_BITS	5
+#define VALUE_MASK	((1 << VALUE_BITS) - 1)
+
+enum reloc_target_format {
+	/* direct encoded formats: */
+	RF_NONE = 0,
+	RF_INSN14 = 1,
+	RF_INSN22 = 2,
+	RF_INSN64 = 3,
+	RF_32MSB = 4,
+	RF_32LSB = 5,
+	RF_64MSB = 6,
+	RF_64LSB = 7,
+
+	/* formats that cannot be directly decoded: */
+	RF_INSN60,
+	RF_INSN21B,	/* imm21 form 1 */
+	RF_INSN21M,	/* imm21 form 2 */
+	RF_INSN21F	/* imm21 form 3 */
+};
+
+enum reloc_value_formula {
+	RV_DIRECT = 4,		/* S + A */
+	RV_GPREL = 5,		/* @gprel(S + A) */
+	RV_LTREL = 6,		/* @ltoff(S + A) */
+	RV_PLTREL = 7,		/* @pltoff(S + A) */
+	RV_FPTR = 8,		/* @fptr(S + A) */
+	RV_PCREL = 9,		/* S + A - P */
+	RV_LTREL_FPTR = 10,	/* @ltoff(@fptr(S + A)) */
+	RV_SEGREL = 11,		/* @segrel(S + A) */
+	RV_SECREL = 12,		/* @secrel(S + A) */
+	RV_BDREL = 13,		/* BD + A */
+	RV_LTV = 14,		/* S + A (like RV_DIRECT, except frozen at static link-time) */
+	RV_PCREL2 = 15,		/* S + A - P */
+	RV_SPECIAL = 16,	/* various (see below) */
+	RV_RSVD17 = 17,
+	RV_TPREL = 18,		/* @tprel(S + A) */
+	RV_LTREL_TPREL = 19,	/* @ltoff(@tprel(S + A)) */
+	RV_DTPMOD = 20,		/* @dtpmod(S + A) */
+	RV_LTREL_DTPMOD = 21,	/* @ltoff(@dtpmod(S + A)) */
+	RV_DTPREL = 22,		/* @dtprel(S + A) */
+	RV_LTREL_DTPREL = 23,	/* @ltoff(@dtprel(S + A)) */
+	RV_RSVD24 = 24,
+	RV_RSVD25 = 25,
+	RV_RSVD26 = 26,
+	RV_RSVD27 = 27
+	/* 28-31 reserved for implementation-specific purposes.  */
+};
+
+#define N(reloc)	[R_IA64_##reloc] = #reloc
+
+static const char *reloc_name[256] = {
+	N(NONE),		N(IMM14),		N(IMM22),		N(IMM64),
+	N(DIR32MSB),		N(DIR32LSB),		N(DIR64MSB),		N(DIR64LSB),
+	N(GPREL22),		N(GPREL64I),		N(GPREL32MSB),		N(GPREL32LSB),
+	N(GPREL64MSB),		N(GPREL64LSB),		N(LTOFF22),		N(LTOFF64I),
+	N(PLTOFF22),		N(PLTOFF64I),		N(PLTOFF64MSB),		N(PLTOFF64LSB),
+	N(FPTR64I),		N(FPTR32MSB),		N(FPTR32LSB),		N(FPTR64MSB),
+	N(FPTR64LSB),		N(PCREL60B),		N(PCREL21B),		N(PCREL21M),
+	N(PCREL21F),		N(PCREL32MSB),		N(PCREL32LSB),		N(PCREL64MSB),
+	N(PCREL64LSB),		N(LTOFF_FPTR22),	N(LTOFF_FPTR64I),	N(LTOFF_FPTR32MSB),
+	N(LTOFF_FPTR32LSB),	N(LTOFF_FPTR64MSB),	N(LTOFF_FPTR64LSB),	N(SEGREL32MSB),
+	N(SEGREL32LSB),		N(SEGREL64MSB),		N(SEGREL64LSB),		N(SECREL32MSB),
+	N(SECREL32LSB),		N(SECREL64MSB),		N(SECREL64LSB),		N(REL32MSB),
+	N(REL32LSB),		N(REL64MSB),		N(REL64LSB),		N(LTV32MSB),
+	N(LTV32LSB),		N(LTV64MSB),		N(LTV64LSB),		N(PCREL21BI),
+	N(PCREL22),		N(PCREL64I),		N(IPLTMSB),		N(IPLTLSB),
+	N(COPY),		N(LTOFF22X),		N(LDXMOV),		N(TPREL14),
+	N(TPREL22),		N(TPREL64I),		N(TPREL64MSB),		N(TPREL64LSB),
+	N(LTOFF_TPREL22),	N(DTPMOD64MSB),		N(DTPMOD64LSB),		N(LTOFF_DTPMOD22),
+	N(DTPREL14),		N(DTPREL22),		N(DTPREL64I),		N(DTPREL32MSB),
+	N(DTPREL32LSB),		N(DTPREL64MSB),		N(DTPREL64LSB),		N(LTOFF_DTPREL22)
+};
+
+#undef N
+
+struct got_entry {
+	uint64_t val;
+};
+
+struct fdesc {
+	uint64_t ip;
+	uint64_t gp;
+};
+
+/* Opaque struct for insns, to protect against derefs. */
+struct insn;
+
+static inline uint64_t
+bundle (const struct insn *insn)
+{
+	return (uint64_t) insn & ~0xfUL;
+}
+
+static inline int
+slot (const struct insn *insn)
+{
+	return (uint64_t) insn & 0x3;
+}
+
+/* Patch instruction with "val" where "mask" has 1 bits. */
+static void
+apply (struct insn *insn, uint64_t mask, uint64_t val)
+{
+	uint64_t m0, m1, v0, v1, b0, b1, *b = (uint64_t *) bundle(insn);
+#	define insn_mask ((1UL << 41) - 1)
+	unsigned long shift;
+
+	b0 = b[0]; b1 = b[1];
+	shift = 5 + 41 * slot(insn); /* 5 bits of template, then 3 x 41-bit instructions */
+	if (shift >= 64) {
+		m1 = mask << (shift - 64);
+		v1 = val << (shift - 64);
+	} else {
+		m0 = mask << shift; m1 = mask >> (64 - shift);
+		v0 = val  << shift; v1 = val >> (64 - shift);
+		b[0] = (b0 & ~m0) | (v0 & m0);
+	}
+	b[1] = (b1 & ~m1) | (v1 & m1);
+}
+
+static int
+apply_imm64 (struct module *mod, struct insn *insn, uint64_t val)
+{
+	if (slot(insn) != 2) {
+		printk(KERN_ERR "%s: illegal slot number %d for IMM64\n",
+		       mod->name, slot(insn));
+		return 0;
+	}
+	apply(insn, 0x01fffefe000, (  ((val & 0x8000000000000000) >> 27) /* bit 63 -> 36 */
+				    | ((val & 0x0000000000200000) <<  0) /* bit 21 -> 21 */
+				    | ((val & 0x00000000001f0000) <<  6) /* bit 16 -> 22 */
+				    | ((val & 0x000000000000ff80) << 20) /* bit  7 -> 27 */
+				    | ((val & 0x000000000000007f) << 13) /* bit  0 -> 13 */));
+	apply((void *) insn - 1, 0x1ffffffffff, val >> 22);
+	return 1;
+}
+
+static int
+apply_imm60 (struct module *mod, struct insn *insn, uint64_t val)
+{
+	if (slot(insn) != 2) {
+		printk(KERN_ERR "%s: illegal slot number %d for IMM60\n",
+		       mod->name, slot(insn));
+		return 0;
+	}
+	if (val + ((uint64_t) 1 << 59) >= (1UL << 60)) {
+		printk(KERN_ERR "%s: value %ld out of IMM60 range\n", mod->name, (int64_t) val);
+		return 0;
+	}
+	apply(insn, 0x011ffffe000, (  ((val & 0x1000000000000000) >> 24) /* bit 60 -> 36 */
+				    | ((val & 0x00000000000fffff) << 13) /* bit  0 -> 13 */));
+	apply((void *) insn - 1, 0x1fffffffffc, val >> 18);
+	return 1;
+}
+
+static int
+apply_imm22 (struct module *mod, struct insn *insn, uint64_t val)
+{
+	if (val + (1 << 21) >= (1 << 22)) {
+		printk(KERN_ERR "%s: value %li out of IMM22 range\n", mod->name, (int64_t)val);
+		return 0;
+	}
+	apply(insn, 0x01fffcfe000, (  ((val & 0x200000) << 15) /* bit 21 -> 36 */
+				    | ((val & 0x1f0000)	<<  6) /* bit 16 -> 22 */
+				    | ((val & 0x00ff80) << 20) /* bit  7 -> 27 */
+				    | ((val & 0x00007f)	<< 13) /* bit  0 -> 13 */));
+	return 1;
+}
+
+static int
+apply_imm21b (struct module *mod, struct insn *insn, uint64_t val)
+{
+	if (val + (1 << 20) >= (1 << 21)) {
+		printk(KERN_ERR "%s: value %li out of IMM21b range\n", mod->name, (int64_t)val);
+		return 0;
+	}
+	apply(insn, 0x11ffffe000, (  ((val & 0x100000) << 16) /* bit 20 -> 36 */
+				   | ((val & 0x0fffff) << 13) /* bit  0 -> 13 */));
+	return 1;
+}
+
+#if USE_BRL
+
+struct plt_entry {
+	/* Three instruction bundles in PLT. */
+ 	unsigned char bundle[2][16];
+};
+
+static const struct plt_entry ia64_plt_template = {
+	{
+		{
+			0x04, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /*	     movl gp=TARGET_GP */
+			0x00, 0x00, 0x00, 0x60
+		},
+		{
+			0x05, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*	     brl.many gp=TARGET_GP */
+			0x08, 0x00, 0x00, 0xc0
+		}
+	}
+};
+
+static int
+patch_plt (struct module *mod, struct plt_entry *plt, long target_ip, unsigned long target_gp)
+{
+	if (apply_imm64(mod, (struct insn *) (plt->bundle[0] + 2), target_gp)
+	    && apply_imm60(mod, (struct insn *) (plt->bundle[1] + 2),
+			   (target_ip - (int64_t) plt->bundle[1]) / 16))
+		return 1;
+	return 0;
+}
+
+unsigned long
+plt_target (struct plt_entry *plt)
+{
+	uint64_t b0, b1, *b = (uint64_t *) plt->bundle[1];
+	long off;
+
+	b0 = b[0]; b1 = b[1];
+	off = (  ((b1 & 0x00fffff000000000) >> 36)		/* imm20b -> bit 0 */
+	       | ((b0 >> 48) << 20) | ((b1 & 0x7fffff) << 36)	/* imm39 -> bit 20 */
+	       | ((b1 & 0x0800000000000000) << 1));		/* i -> bit 60 */
+	return (long) plt->bundle[1] + 16*off;
+}
+
+#else /* !USE_BRL */
+
+struct plt_entry {
+	/* Three instruction bundles in PLT. */
+ 	unsigned char bundle[3][16];
+};
+
+static const struct plt_entry ia64_plt_template = {
+	{
+		{
+			0x05, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*	     movl r16=TARGET_IP */
+			0x02, 0x00, 0x00, 0x60
+		},
+		{
+			0x04, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
+			0x00, 0x00, 0x00, 0x00, 0x00, 0x20, /*	     movl gp=TARGET_GP */
+			0x00, 0x00, 0x00, 0x60
+		},
+		{
+			0x11, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MIB] nop.m 0 */
+			0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /*	     mov b6=r16 */
+			0x60, 0x00, 0x80, 0x00		    /*	     br.few b6 */
+		}
+	}
+};
+
+static int
+patch_plt (struct module *mod, struct plt_entry *plt, long target_ip, unsigned long target_gp)
+{
+	if (apply_imm64(mod, (struct insn *) (plt->bundle[0] + 2), target_ip)
+	    && apply_imm64(mod, (struct insn *) (plt->bundle[1] + 2), target_gp))
+		return 1;
+	return 0;
+}
+
+unsigned long
+plt_target (struct plt_entry *plt)
+{
+	uint64_t b0, b1, *b = (uint64_t *) plt->bundle[0];
+
+	b0 = b[0]; b1 = b[1];
+	return (  ((b1 & 0x000007f000000000) >> 36)		/* imm7b -> bit 0 */
+		| ((b1 & 0x07fc000000000000) >> 43)		/* imm9d -> bit 7 */
+		| ((b1 & 0x0003e00000000000) >> 29)		/* imm5c -> bit 16 */
+		| ((b1 & 0x0000100000000000) >> 23)		/* ic -> bit 21 */
+		| ((b0 >> 46) << 22) | ((b1 & 0x7fffff) << 40)	/* imm41 -> bit 22 */
+		| ((b1 & 0x0800000000000000) <<  4));		/* i -> bit 63 */
+}
+
+#endif /* !USE_BRL */
+
+void *
+module_alloc (unsigned long size)
+{
+	if (!size)
+		return NULL;
+	return vmalloc(size);
+}
+
+void
+module_free (struct module *mod, void *module_region)
+{
+	vfree(module_region);
+}
+
+/* Have we already seen one of these relocations? */
+/* FIXME: we could look in other sections, too --RR */
+static int
+duplicate_reloc (const Elf64_Rela *rela, unsigned int num)
+{
+	unsigned int i;
+
+	for (i = 0; i < num; i++) {
+		if (rela[i].r_info == rela[num].r_info && rela[i].r_addend == rela[num].r_addend)
+			return 1;
+	}
+	return 0;
+}
+
+/* Count how many GOT entries we may need */
+static unsigned int
+count_gots (const Elf64_Rela *rela, unsigned int num)
+{
+	unsigned int i, ret = 0;
+
+	/* Sure, this is order(n^2), but it's usually short, and not
+           time critical */
+	for (i = 0; i < num; i++) {
+		switch (ELF64_R_TYPE(rela[i].r_info)) {
+		      case R_IA64_LTOFF22:
+		      case R_IA64_LTOFF22X:
+		      case R_IA64_LTOFF64I:
+		      case R_IA64_LTOFF_FPTR22:
+		      case R_IA64_LTOFF_FPTR64I:
+		      case R_IA64_LTOFF_FPTR32MSB:
+		      case R_IA64_LTOFF_FPTR32LSB:
+		      case R_IA64_LTOFF_FPTR64MSB:
+		      case R_IA64_LTOFF_FPTR64LSB:
+			if (!duplicate_reloc(rela, i))
+				ret++;
+			break;
+		}
+	}
+	return ret;
+}
+
+/* Count how many PLT entries we may need */
+static unsigned int
+count_plts (const Elf64_Rela *rela, unsigned int num)
+{
+	unsigned int i, ret = 0;
+
+	/* Sure, this is order(n^2), but it's usually short, and not
+           time critical */
+	for (i = 0; i < num; i++) {
+		switch (ELF64_R_TYPE(rela[i].r_info)) {
+		      case R_IA64_PCREL21B:
+		      case R_IA64_PLTOFF22:
+		      case R_IA64_PLTOFF64I:
+		      case R_IA64_PLTOFF64MSB:
+		      case R_IA64_PLTOFF64LSB:
+		      case R_IA64_IPLTMSB:
+		      case R_IA64_IPLTLSB:
+			if (!duplicate_reloc(rela, i))
+				ret++;
+			break;
+		}
+	}
+	return ret;
+}
+
+/* We need to create an function-descriptors for any internal function
+   which is referenced. */
+static unsigned int
+count_fdescs (const Elf64_Rela *rela, unsigned int num)
+{
+	unsigned int i, ret = 0;
+
+	/* Sure, this is order(n^2), but it's usually short, and not time critical.  */
+	for (i = 0; i < num; i++) {
+		switch (ELF64_R_TYPE(rela[i].r_info)) {
+		      case R_IA64_FPTR64I:
+		      case R_IA64_FPTR32LSB:
+		      case R_IA64_FPTR32MSB:
+		      case R_IA64_FPTR64LSB:
+		      case R_IA64_FPTR64MSB:
+		      case R_IA64_LTOFF_FPTR22:
+		      case R_IA64_LTOFF_FPTR32LSB:
+		      case R_IA64_LTOFF_FPTR32MSB:
+		      case R_IA64_LTOFF_FPTR64I:
+		      case R_IA64_LTOFF_FPTR64LSB:
+		      case R_IA64_LTOFF_FPTR64MSB:
+		      case R_IA64_IPLTMSB:
+		      case R_IA64_IPLTLSB:
+			/*
+			 * Jumps to static functions sometimes go straight to their
+			 * offset.  Of course, that may not be possible if the jump is
+			 * from init -> core or vice. versa, so we need to generate an
+			 * FDESC (and PLT etc) for that.
+			 */
+		      case R_IA64_PCREL21B:
+			if (!duplicate_reloc(rela, i))
+				ret++;
+			break;
+		}
+	}
+	return ret;
+}
+
+int
+module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings,
+			   struct module *mod)
+{
+	unsigned long core_plts = 0, init_plts = 0, gots = 0, fdescs = 0;
+	Elf64_Shdr *s, *sechdrs_end = sechdrs + ehdr->e_shnum;
+
+	/*
+	 * To store the PLTs and function-descriptors, we expand the .text section for
+	 * core module-code and the .init.text section for initialization code.
+	 */
+	for (s = sechdrs; s < sechdrs_end; ++s)
+		if (strcmp(".core.plt", secstrings + s->sh_name) == 0)
+			mod->arch.core_plt = s;
+		else if (strcmp(".init.plt", secstrings + s->sh_name) == 0)
+			mod->arch.init_plt = s;
+		else if (strcmp(".got", secstrings + s->sh_name) == 0)
+			mod->arch.got = s;
+		else if (strcmp(".opd", secstrings + s->sh_name) == 0)
+			mod->arch.opd = s;
+		else if (strcmp(".IA_64.unwind", secstrings + s->sh_name) == 0)
+			mod->arch.unwind = s;
+
+	if (!mod->arch.core_plt || !mod->arch.init_plt || !mod->arch.got || !mod->arch.opd) {
+		printk(KERN_ERR "%s: sections missing\n", mod->name);
+		return -ENOEXEC;
+	}
+
+	/* GOT and PLTs can occur in any relocated section... */
+	for (s = sechdrs + 1; s < sechdrs_end; ++s) {
+		const Elf64_Rela *rels = (void *)ehdr + s->sh_offset;
+		unsigned long numrels = s->sh_size/sizeof(Elf64_Rela);
+
+		if (s->sh_type != SHT_RELA)
+			continue;
+
+		gots += count_gots(rels, numrels);
+		fdescs += count_fdescs(rels, numrels);
+		if (strstr(secstrings + s->sh_name, ".init"))
+			init_plts += count_plts(rels, numrels);
+		else
+			core_plts += count_plts(rels, numrels);
+	}
+
+	mod->arch.core_plt->sh_type = SHT_NOBITS;
+	mod->arch.core_plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
+	mod->arch.core_plt->sh_addralign = 16;
+	mod->arch.core_plt->sh_size = core_plts * sizeof(struct plt_entry);
+	mod->arch.init_plt->sh_type = SHT_NOBITS;
+	mod->arch.init_plt->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
+	mod->arch.init_plt->sh_addralign = 16;
+	mod->arch.init_plt->sh_size = init_plts * sizeof(struct plt_entry);
+	mod->arch.got->sh_type = SHT_NOBITS;
+	mod->arch.got->sh_flags = ARCH_SHF_SMALL | SHF_ALLOC;
+	mod->arch.got->sh_addralign = 8;
+	mod->arch.got->sh_size = gots * sizeof(struct got_entry);
+	mod->arch.opd->sh_type = SHT_NOBITS;
+	mod->arch.opd->sh_flags = SHF_ALLOC;
+	mod->arch.opd->sh_addralign = 8;
+	mod->arch.opd->sh_size = fdescs * sizeof(struct fdesc);
+	DEBUGP("%s: core.plt=%lx, init.plt=%lx, got=%lx, fdesc=%lx\n",
+	       __FUNCTION__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size,
+	       mod->arch.got->sh_size, mod->arch.opd->sh_size);
+	return 0;
+}
+
+static inline int
+in_init (const struct module *mod, uint64_t addr)
+{
+	return addr - (uint64_t) mod->module_init < mod->init_size;
+}
+
+static inline int
+in_core (const struct module *mod, uint64_t addr)
+{
+	return addr - (uint64_t) mod->module_core < mod->core_size;
+}
+
+static inline int
+is_internal (const struct module *mod, uint64_t value)
+{
+	return in_init(mod, value) || in_core(mod, value);
+}
+
+/*
+ * Get gp-relative offset for the linkage-table entry of VALUE.
+ */
+static uint64_t
+get_ltoff (struct module *mod, uint64_t value, int *okp)
+{
+	struct got_entry *got, *e;
+
+	if (!*okp)
+		return 0;
+
+	got = (void *) mod->arch.got->sh_addr;
+	for (e = got; e < got + mod->arch.next_got_entry; ++e)
+		if (e->val == value)
+			goto found;
+
+	/* Not enough GOT entries? */
+	if (e >= (struct got_entry *) (mod->arch.got->sh_addr + mod->arch.got->sh_size))
+		BUG();
+
+	e->val = value;
+	++mod->arch.next_got_entry;
+  found:
+	return (uint64_t) e - mod->arch.gp;
+}
+
+static inline int
+gp_addressable (struct module *mod, uint64_t value)
+{
+	return value - mod->arch.gp + MAX_LTOFF/2 < MAX_LTOFF;
+}
+
+/* Get PC-relative PLT entry for this value.  Returns 0 on failure. */
+static uint64_t
+get_plt (struct module *mod, const struct insn *insn, uint64_t value, int *okp)
+{
+	struct plt_entry *plt, *plt_end;
+	uint64_t target_ip, target_gp;
+
+	if (!*okp)
+		return 0;
+
+	if (in_init(mod, (uint64_t) insn)) {
+		plt = (void *) mod->arch.init_plt->sh_addr;
+		plt_end = (void *) plt + mod->arch.init_plt->sh_size;
+	} else {
+		plt = (void *) mod->arch.core_plt->sh_addr;
+		plt_end = (void *) plt + mod->arch.core_plt->sh_size;
+	}
+
+	/* "value" is a pointer to a function-descriptor; fetch the target ip/gp from it: */
+	target_ip = ((uint64_t *) value)[0];
+	target_gp = ((uint64_t *) value)[1];
+
+	/* Look for existing PLT entry. */
+	while (plt->bundle[0][0]) {
+		if (plt_target(plt) == target_ip)
+			goto found;
+		if (++plt >= plt_end)
+			BUG();
+	}
+	*plt = ia64_plt_template;
+	if (!patch_plt(mod, plt, target_ip, target_gp)) {
+		*okp = 0;
+		return 0;
+	}
+#if ARCH_MODULE_DEBUG
+	if (plt_target(plt) != target_ip) {
+		printk("%s: mistargeted PLT: wanted %lx, got %lx\n",
+		       __FUNCTION__, target_ip, plt_target(plt));
+		*okp = 0;
+		return 0;
+	}
+#endif
+  found:
+	return (uint64_t) plt;
+}
+
+/* Get function descriptor for VALUE. */
+static uint64_t
+get_fdesc (struct module *mod, uint64_t value, int *okp)
+{
+	struct fdesc *fdesc = (void *) mod->arch.opd->sh_addr;
+
+	if (!*okp)
+		return 0;
+
+	if (!value) {
+		printk(KERN_ERR "%s: fdesc for zero requested!\n", mod->name);
+		return 0;
+	}
+
+	if (!is_internal(mod, value))
+		/*
+		 * If it's not a module-local entry-point, "value" already points to a
+		 * function-descriptor.
+		 */
+		return value;
+
+	/* Look for existing function descriptor. */
+	while (fdesc->ip) {
+		if (fdesc->ip == value)
+			return (uint64_t)fdesc;
+		if ((uint64_t) ++fdesc >= mod->arch.opd->sh_addr + mod->arch.opd->sh_size)
+			BUG();
+	}
+
+	/* Create new one */
+	fdesc->ip = value;
+	fdesc->gp = mod->arch.gp;
+	return (uint64_t) fdesc;
+}
+
+static inline int
+do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
+	  Elf64_Shdr *sec, void *location)
+{
+	enum reloc_target_format format = (r_type >> FORMAT_SHIFT) & FORMAT_MASK;
+	enum reloc_value_formula formula = (r_type >> VALUE_SHIFT) & VALUE_MASK;
+	uint64_t val;
+	int ok = 1;
+
+	val = sym->st_value + addend;
+
+	switch (formula) {
+	      case RV_SEGREL:	/* segment base is arbitrarily chosen to be 0 for kernel modules */
+	      case RV_DIRECT:
+		break;
+
+	      case RV_GPREL:	  val -= mod->arch.gp; break;
+	      case RV_LTREL:	  val = get_ltoff(mod, val, &ok); break;
+	      case RV_PLTREL:	  val = get_plt(mod, location, val, &ok); break;
+	      case RV_FPTR:	  val = get_fdesc(mod, val, &ok); break;
+	      case RV_SECREL:	  val -= sec->sh_addr; break;
+	      case RV_LTREL_FPTR: val = get_ltoff(mod, get_fdesc(mod, val, &ok), &ok); break;
+
+	      case RV_PCREL:
+		switch (r_type) {
+		      case R_IA64_PCREL21B:
+			/* special because it can cross into other module/kernel-core.  */
+			if (!is_internal(mod, val))
+				val = get_plt(mod, location, val, &ok);
+			/* FALL THROUGH */
+		      default:
+			val -= bundle(location);
+			break;
+
+		      case R_IA64_PCREL32MSB:
+		      case R_IA64_PCREL32LSB:
+		      case R_IA64_PCREL64MSB:
+		      case R_IA64_PCREL64LSB:
+			val -= (uint64_t) location;
+			break;
+
+		}
+		switch (r_type) {
+		      case R_IA64_PCREL60B: format = RF_INSN60; break;
+		      case R_IA64_PCREL21B: format = RF_INSN21B; break;
+		      case R_IA64_PCREL21M: format = RF_INSN21M; break;
+		      case R_IA64_PCREL21F: format = RF_INSN21F; break;
+		      default: break;
+		}
+		break;
+
+	      case RV_BDREL:
+		val -= (uint64_t) (in_init(mod, val) ? mod->module_init : mod->module_core);
+		break;
+
+	      case RV_LTV:
+		/* can link-time value relocs happen here?  */
+		BUG();
+		break;
+
+	      case RV_PCREL2:
+		if (r_type == R_IA64_PCREL21BI) {
+			if (!is_internal(mod, val)) {
+				printk(KERN_ERR "%s: %s reloc against non-local symbol (%lx)\n",
+				       __FUNCTION__, reloc_name[r_type], val);
+				return -ENOEXEC;
+			}
+			format = RF_INSN21B;
+		}
+		val -= bundle(location);
+		break;
+
+	      case RV_SPECIAL:
+		switch (r_type) {
+		      case R_IA64_IPLTMSB:
+		      case R_IA64_IPLTLSB:
+			val = get_fdesc(mod, get_plt(mod, location, val, &ok), &ok);
+			format = RF_64LSB;
+			if (r_type == R_IA64_IPLTMSB)
+				format = RF_64MSB;
+			break;
+
+		      case R_IA64_SUB:
+			val = addend - sym->st_value;
+			format = RF_INSN64;
+			break;
+
+		      case R_IA64_LTOFF22X:
+			if (gp_addressable(mod, val))
+				val -= mod->arch.gp;
+			else
+				val = get_ltoff(mod, val, &ok);
+			format = RF_INSN22;
+			break;
+
+		      case R_IA64_LDXMOV:
+			if (gp_addressable(mod, val)) {
+				/* turn "ld8" into "mov": */
+				DEBUGP("%s: patching ld8 at %p to mov\n", __FUNCTION__, location);
+				apply(location, 0x1fff80fe000, 0x10000000000);
+			}
+			return 0;
+
+		      default:
+			if (reloc_name[r_type])
+				printk(KERN_ERR "%s: special reloc %s not supported",
+				       mod->name, reloc_name[r_type]);
+			else
+				printk(KERN_ERR "%s: unknown special reloc %x\n",
+				       mod->name, r_type);
+			return -ENOEXEC;
+		}
+		break;
+
+	      case RV_TPREL:
+	      case RV_LTREL_TPREL:
+	      case RV_DTPMOD:
+	      case RV_LTREL_DTPMOD:
+	      case RV_DTPREL:
+	      case RV_LTREL_DTPREL:
+		printk(KERN_ERR "%s: %s reloc not supported\n",
+		       mod->name, reloc_name[r_type] ? reloc_name[r_type] : "?");
+		return -ENOEXEC;
+
+	      default:
+		printk(KERN_ERR "%s: unknown reloc %x\n", mod->name, r_type);
+		return -ENOEXEC;
+	}
+
+	if (!ok)
+		return -ENOEXEC;
+
+	DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __FUNCTION__, location, val,
+	       reloc_name[r_type] ? reloc_name[r_type] : "?", sym->st_value + addend);
+
+	switch (format) {
+	      case RF_INSN21B:	ok = apply_imm21b(mod, location, (int64_t) val / 16); break;
+	      case RF_INSN22:	ok = apply_imm22(mod, location, val); break;
+	      case RF_INSN64:	ok = apply_imm64(mod, location, val); break;
+	      case RF_INSN60:	ok = apply_imm60(mod, location, (int64_t) val / 16); break;
+	      case RF_32LSB:	put_unaligned(val, (uint32_t *) location); break;
+	      case RF_64LSB:	put_unaligned(val, (uint64_t *) location); break;
+	      case RF_32MSB:	/* ia64 Linux is little-endian... */
+	      case RF_64MSB:	/* ia64 Linux is little-endian... */
+	      case RF_INSN14:	/* must be within-module, i.e., resolved by "ld -r" */
+	      case RF_INSN21M:	/* must be within-module, i.e., resolved by "ld -r" */
+	      case RF_INSN21F:	/* must be within-module, i.e., resolved by "ld -r" */
+		printk(KERN_ERR "%s: format %u needed by %s reloc is not supported\n",
+		       mod->name, format, reloc_name[r_type] ? reloc_name[r_type] : "?");
+		return -ENOEXEC;
+
+	      default:
+		printk(KERN_ERR "%s: relocation %s resulted in unknown format %u\n",
+		       mod->name, reloc_name[r_type] ? reloc_name[r_type] : "?", format);
+		return -ENOEXEC;
+	}
+	return ok ? 0 : -ENOEXEC;
+}
+
+int
+apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
+		    unsigned int relsec, struct module *mod)
+{
+	unsigned int i, n = sechdrs[relsec].sh_size / sizeof(Elf64_Rela);
+	Elf64_Rela *rela = (void *) sechdrs[relsec].sh_addr;
+	Elf64_Shdr *target_sec;
+	int ret;
+
+	DEBUGP("%s: applying section %u (%u relocs) to %u\n", __FUNCTION__,
+	       relsec, n, sechdrs[relsec].sh_info);
+
+	target_sec = sechdrs + sechdrs[relsec].sh_info;
+
+	if (target_sec->sh_entsize == ~0UL)
+		/*
+		 * If target section wasn't allocated, we don't need to relocate it.
+		 * Happens, e.g., for debug sections.
+		 */
+		return 0;
+
+	if (!mod->arch.gp) {
+		/*
+		 * XXX Should have an arch-hook for running this after final section
+		 *     addresses have been selected...
+		 */
+		/* See if gp can cover the entire core module:  */
+		uint64_t gp = (uint64_t) mod->module_core + MAX_LTOFF / 2;
+		if (mod->core_size >= MAX_LTOFF)
+			/*
+			 * This takes advantage of fact that SHF_ARCH_SMALL gets allocated
+			 * at the end of the module.
+			 */
+			gp = (uint64_t) mod->module_core + mod->core_size - MAX_LTOFF / 2;
+		mod->arch.gp = gp;
+		DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp);
+	}
+
+	for (i = 0; i < n; i++) {
+		ret = do_reloc(mod, ELF64_R_TYPE(rela[i].r_info),
+			       ((Elf64_Sym *) sechdrs[symindex].sh_addr
+				+ ELF64_R_SYM(rela[i].r_info)),
+			       rela[i].r_addend, target_sec,
+			       (void *) target_sec->sh_addr + rela[i].r_offset);
+		if (ret < 0)
+			return ret;
+	}
+	return 0;
+}
+
+int
+apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex,
+		unsigned int relsec, struct module *mod)
+{
+	printk(KERN_ERR "module %s: REL relocs in section %u unsupported\n", mod->name, relsec);
+	return -ENOEXEC;
+}
+
+int
+module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod)
+{
+	DEBUGP("%s: init: entry=%p\n", __FUNCTION__, mod->init);
+	if (mod->arch.unwind)
+		mod->arch.unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
+							   (void *) mod->arch.unwind->sh_addr,
+							   ((void *) mod->arch.unwind->sh_addr
+							    + mod->arch.unwind->sh_size));
+	return 0;
+}
+
+void
+module_arch_cleanup (struct module *mod)
+{
+	if (mod->arch.unwind)
+		unw_remove_unwind_table(mod->arch.unw_table);
+}
diff -Nru a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c
--- a/arch/ia64/kernel/palinfo.c	Sat Apr 19 19:51:27 2003
+++ b/arch/ia64/kernel/palinfo.c	Sat Apr 19 19:51:27 2003
@@ -27,9 +27,7 @@
 #include <asm/sal.h>
 #include <asm/page.h>
 #include <asm/processor.h>
-#ifdef CONFIG_SMP
 #include <linux/smp.h>
-#endif
 
 MODULE_AUTHOR("Stephane Eranian <eranian@hpl.hp.com>");
 MODULE_DESCRIPTION("/proc interface to IA-64 PAL");
@@ -37,12 +35,6 @@
 
 #define PALINFO_VERSION "0.5"
 
-#ifdef CONFIG_SMP
-#define cpu_is_online(i) (cpu_online_map & (1UL << i))
-#else
-#define cpu_is_online(i)	1
-#endif
-
 typedef int (*palinfo_func_t)(char*);
 
 typedef struct {
@@ -933,7 +925,7 @@
 	 */
 	for (i=0; i < NR_CPUS; i++) {
 
-		if (!cpu_is_online(i)) continue;
+		if (!cpu_online(i)) continue;
 
 		sprintf(cpustr,CPUSTR, i);
 
diff -Nru a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c
--- a/arch/ia64/kernel/perfmon.c	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/kernel/perfmon.c	Sat Apr 19 19:51:50 2003
@@ -24,6 +24,7 @@
 #include <linux/wrapper.h>
 #include <linux/mm.h>
 #include <linux/sysctl.h>
+#include <linux/smp.h>
 
 #include <asm/bitops.h>
 #include <asm/errno.h>
@@ -134,12 +135,6 @@
 #define PFM_CPUINFO_CLEAR(v)	__get_cpu_var(pfm_syst_info) &= ~(v)
 #define PFM_CPUINFO_SET(v)	__get_cpu_var(pfm_syst_info) |= (v)
 
-#ifdef CONFIG_SMP
-#define cpu_is_online(i) (cpu_online_map & (1UL << i))
-#else
-#define cpu_is_online(i)        (i==0)
-#endif
-
 /*
  * debugging
  */
@@ -1082,7 +1077,7 @@
 		 * and it must be a valid CPU
 		 */
 		cpu = ffz(~pfx->ctx_cpu_mask);
-		if (cpu_is_online(cpu) == 0) {
+		if (cpu_online(cpu) == 0) {
 			DBprintk(("CPU%d is not online\n", cpu));
 			return -EINVAL;
 		}
@@ -3153,7 +3148,7 @@
 	p += sprintf(p, "ovfl_mask              : 0x%lx\n", pmu_conf.ovfl_val);
 
 	for(i=0; i < NR_CPUS; i++) {
-		if (cpu_is_online(i) == 0) continue;
+		if (cpu_online(i) == 0) continue;
 		p += sprintf(p, "CPU%-2d overflow intrs   : %lu\n", i, pfm_stats[i].pfm_ovfl_intr_count);
 		p += sprintf(p, "CPU%-2d spurious intrs   : %lu\n", i, pfm_stats[i].pfm_spurious_ovfl_intr_count);
 		p += sprintf(p, "CPU%-2d recorded samples : %lu\n", i, pfm_stats[i].pfm_recorded_samples_count);
diff -Nru a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
--- a/arch/ia64/kernel/process.c	Sat Apr 19 19:51:47 2003
+++ b/arch/ia64/kernel/process.c	Sat Apr 19 19:51:47 2003
@@ -66,10 +66,7 @@
 void
 show_trace_task (struct task_struct *task)
 {
-	struct unw_frame_info info;
-
-	unw_init_from_blocked_task(&info, task);
-	do_show_stack(&info, 0);
+	show_stack(task);
 }
 
 void
@@ -169,7 +166,10 @@
 void
 default_idle (void)
 {
-	/* may want to do PAL_LIGHT_HALT here... */
+#ifdef CONFIG_IA64_PAL_IDLE
+	if (!need_resched())
+		safe_halt();
+#endif
 }
 
 void __attribute__((noreturn))
@@ -177,6 +177,10 @@
 {
 	/* endless idle loop with no priority at all */
 	while (1) {
+		void (*idle)(void) = pm_idle;
+		if (!idle)
+			idle = default_idle;
+
 #ifdef CONFIG_SMP
 		if (!need_resched())
 			min_xtp();
@@ -186,10 +190,7 @@
 #ifdef CONFIG_IA64_SGI_SN
 			snidle();
 #endif
-			if (pm_idle)
-				(*pm_idle)();
-			else
-				default_idle();
+			(*idle)();
 		}
 
 #ifdef CONFIG_IA64_SGI_SN
@@ -581,6 +582,15 @@
 
 	tid = clone(flags | CLONE_VM | CLONE_UNTRACED, 0);
 	if (parent != current) {
+#ifdef CONFIG_IA32_SUPPORT
+		if (IS_IA32_PROCESS(ia64_task_regs(current))) {
+			/* A kernel thread is always a 64-bit process. */
+			current->thread.map_base  = DEFAULT_MAP_BASE;
+			current->thread.task_size = DEFAULT_TASK_SIZE;
+			ia64_set_kr(IA64_KR_IO_BASE, current->thread.old_iob);
+			ia64_set_kr(IA64_KR_TSSD, current->thread.old_k1);
+		}
+#endif
 		result = (*fn)(arg);
 		_exit(result);
 	}
@@ -751,7 +761,7 @@
 }
 
 void
-__put_task_struct (struct task_struct *tsk)
+free_task_struct (struct task_struct *tsk)
 {
 	free_pages((unsigned long) tsk, KERNEL_STACK_SIZE_ORDER);
 }
diff -Nru a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
--- a/arch/ia64/kernel/signal.c	Sat Apr 19 19:51:48 2003
+++ b/arch/ia64/kernel/signal.c	Sat Apr 19 19:51:48 2003
@@ -191,6 +191,10 @@
 				err |= __put_user(from->si_pfm_ovfl[2], &to->si_pfm_ovfl[2]);
 				err |= __put_user(from->si_pfm_ovfl[3], &to->si_pfm_ovfl[3]);
 			}
+		      case __SI_TIMER >> 16:
+			err |= __put_user(from->si_tid, &to->si_tid);
+			err |= __put_user(from->si_overrun, &to->si_overrun);
+			err |= __put_user(from->si_value, &to->si_value);
 			break;
 		      default:
 			err |= __put_user(from->si_uid, &to->si_uid);
diff -Nru a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c
--- a/arch/ia64/kernel/smpboot.c	Sat Apr 19 19:51:29 2003
+++ b/arch/ia64/kernel/smpboot.c	Sat Apr 19 19:51:29 2003
@@ -279,12 +279,15 @@
 
 	smp_setup_percpu_timer();
 
-	/*
-	 * Synchronize the ITC with the BP
-	 */
-	Dprintk("Going to syncup ITC with BP.\n");
+	if (!(sal_platform_features & IA64_SAL_PLATFORM_FEATURE_ITC_DRIFT)) {
+		/*
+		 * Synchronize the ITC with the BP
+		 */
+		Dprintk("Going to syncup ITC with BP.\n");
+
+		ia64_sync_itc(0);
+	}
 
-	ia64_sync_itc(0);
 	/*
 	 * Get our bogomips.
 	 */
diff -Nru a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c
--- a/arch/ia64/kernel/time.c	Sat Apr 19 19:51:29 2003
+++ b/arch/ia64/kernel/time.c	Sat Apr 19 19:51:29 2003
@@ -60,7 +60,7 @@
 }
 
 /*
- * Return the number of micro-seconds that elapsed since the last update to jiffy.  The
+ * Return the number of nano-seconds that elapsed since the last update to jiffy.  The
  * xtime_lock must be at least read-locked when calling this routine.
  */
 static inline unsigned long
@@ -86,6 +86,9 @@
 void
 do_settimeofday (struct timeval *tv)
 {
+	time_t sec = tv->tv_sec;
+	long nsec = tv->tv_usec * 1000;
+
 	write_seqlock_irq(&xtime_lock);
 	{
 		/*
@@ -94,22 +97,22 @@
 		 * Discover what correction gettimeofday would have done, and then undo
 		 * it!
 		 */
-		tv->tv_usec -= gettimeoffset();
-		tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
+		nsec -= gettimeoffset();
 
-		while (tv->tv_usec < 0) {
-			tv->tv_usec += 1000000;
-			tv->tv_sec--;
+		while (nsec < 0) {
+			nsec += 1000000000;
+			sec--;
 		}
 
-		xtime.tv_sec = tv->tv_sec;
-		xtime.tv_nsec = 1000 * tv->tv_usec;
+		xtime.tv_sec = sec;
+		xtime.tv_nsec = nsec;
 		time_adjust = 0;		/* stop active adjtime() */
 		time_status |= STA_UNSYNC;
 		time_maxerror = NTP_PHASE_LIMIT;
 		time_esterror = NTP_PHASE_LIMIT;
 	}
 	write_sequnlock_irq(&xtime_lock);
+	clock_was_set();
 }
 
 void
diff -Nru a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c
--- a/arch/ia64/kernel/traps.c	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/kernel/traps.c	Sat Apr 19 19:51:50 2003
@@ -338,8 +338,8 @@
 		fpu_swa_count = 0;
 	if ((++fpu_swa_count < 5) && !(current->thread.flags & IA64_THREAD_FPEMU_NOPRINT)) {
 		last_time = jiffies;
-		printk(KERN_WARNING "%s(%d): floating-point assist fault at ip %016lx\n",
-		       current->comm, current->pid, regs->cr_iip + ia64_psr(regs)->ri);
+		printk(KERN_WARNING "%s(%d): floating-point assist fault at ip %016lx, isr %016lx\n",
+		       current->comm, current->pid, regs->cr_iip + ia64_psr(regs)->ri, isr);
 	}
 
 	exception = fp_emulate(fp_fault, bundle, &regs->cr_ipsr, &regs->ar_fpsr, &isr, &regs->pr,
diff -Nru a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c
--- a/arch/ia64/kernel/unwind.c	Sat Apr 19 19:51:51 2003
+++ b/arch/ia64/kernel/unwind.c	Sat Apr 19 19:51:51 2003
@@ -253,6 +253,11 @@
 	struct pt_regs *pt;
 
 	if ((unsigned) regnum - 1 >= 127) {
+		if (regnum == 0 && !write) {
+			*val = 0;	/* read r0 always returns 0 */
+			*nat = 0;
+			return 0;
+		}
 		UNW_DPRINT(0, "unwind.%s: trying to access non-existent r%u\n",
 			   __FUNCTION__, regnum);
 		return -1;
@@ -318,13 +323,8 @@
 			}
 		} else {
 			/* access a scratch register */
-			if (!info->pt) {
-				UNW_DPRINT(0, "unwind.%s: no pt-regs; cannot access r%d\n",
-					   __FUNCTION__, regnum);
-				return -1;
-			}
 			pt = get_scratch_regs(info);
-			addr = (unsigned long *) (pt + pt_regs_off(regnum));
+			addr = (unsigned long *) ((unsigned long)pt + pt_regs_off(regnum));
 			if (info->pri_unat_loc)
 				nat_addr = info->pri_unat_loc;
 			else
diff -Nru a/arch/ia64/lib/io.c b/arch/ia64/lib/io.c
--- a/arch/ia64/lib/io.c	Sat Apr 19 19:51:27 2003
+++ b/arch/ia64/lib/io.c	Sat Apr 19 19:51:27 2003
@@ -87,12 +87,31 @@
 	__ia64_outl(val, port);
 }
 
-void
-ia64_mmiob (void)
+unsigned char
+ia64_readb (void *addr)
 {
-	__ia64_mmiob();
+	return __ia64_readb (addr);
 }
 
+unsigned short
+ia64_readw (void *addr)
+{
+	return __ia64_readw (addr);
+}
+
+unsigned int
+ia64_readl (void *addr)
+{
+	return __ia64_readl (addr);
+}
+
+unsigned long
+ia64_readq (void *addr)
+{
+	return __ia64_readq (addr)
+}
+
+
 /* define aliases: */
 
 asm (".global __ia64_inb, __ia64_inw, __ia64_inl");
@@ -105,7 +124,11 @@
 asm ("__ia64_outw = ia64_outw");
 asm ("__ia64_outl = ia64_outl");
 
-asm (".global __ia64_mmiob");
-asm ("__ia64_mmiob = ia64_mmiob");
+asm (".global __ia64_readb, __ia64_readw, __ia64_readl, __ia64_readq");
+asm ("__ia64_readb = ia64_readb");
+asm ("__ia64_readw = ia64_readw");
+asm ("__ia64_readl = ia64_readl");
+asm ("__ia64_readq = ia64_readq");
+
 
 #endif /* CONFIG_IA64_GENERIC */
diff -Nru a/arch/ia64/lib/swiotlb.c b/arch/ia64/lib/swiotlb.c
--- a/arch/ia64/lib/swiotlb.c	Sat Apr 19 19:51:49 2003
+++ b/arch/ia64/lib/swiotlb.c	Sat Apr 19 19:51:49 2003
@@ -473,12 +473,6 @@
 			sync_single(hwdev, (void *) sg->dma_address, sg->dma_length, direction);
 }
 
-unsigned long
-swiotlb_dma_address (struct scatterlist *sg)
-{
-	return sg->dma_address;
-}
-
 /*
  * Return whether the given PCI device DMA address mask can be supported properly.  For
  * example, if your device can only drive the low 24-bits during PCI bus mastering, then
@@ -497,7 +491,6 @@
 EXPORT_SYMBOL(swiotlb_unmap_sg);
 EXPORT_SYMBOL(swiotlb_sync_single);
 EXPORT_SYMBOL(swiotlb_sync_sg);
-EXPORT_SYMBOL(swiotlb_dma_address);
 EXPORT_SYMBOL(swiotlb_alloc_consistent);
 EXPORT_SYMBOL(swiotlb_free_consistent);
 EXPORT_SYMBOL(swiotlb_pci_dma_supported);
diff -Nru a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
--- a/arch/ia64/mm/fault.c	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/mm/fault.c	Sat Apr 19 19:51:50 2003
@@ -194,6 +194,7 @@
 	up_read(&mm->mmap_sem);
 	if (current->pid == 1) {
 		yield();
+		down_read(&mm->mmap_sem);
 		goto survive;
 	}
 	printk(KERN_CRIT "VM: killing process %s\n", current->comm);
diff -Nru a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c
--- a/arch/ia64/mm/init.c	Sat Apr 19 19:51:47 2003
+++ b/arch/ia64/mm/init.c	Sat Apr 19 19:51:47 2003
@@ -251,7 +251,6 @@
 			pte_unmap(pte);
 			goto out;
 		}
-		flush_page_to_ram(page);
 		set_pte(pte, mk_pte(page, PAGE_GATE));
 		pte_unmap(pte);
 	}
diff -Nru a/arch/ia64/module.lds b/arch/ia64/module.lds
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/module.lds	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+SECTIONS {
+	/* Group unwind sections into a single section: */
+	.IA_64.unwind_info : { *(.IA_64.unwind_info*) }
+	.IA_64.unwind : { *(.IA_64.unwind*) }
+	/*
+	 * Create place-holder sections to hold the PLTs, GOT, and
+	 * official procedure-descriptors (.opd).
+	 */
+	.core.plt : { BYTE(0) }
+	.init.plt : { BYTE(0) }
+	.got : { BYTE(0) }
+	.opd : { BYTE(0) }
+}
diff -Nru a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
--- a/arch/ia64/pci/pci.c	Sat Apr 19 19:51:47 2003
+++ b/arch/ia64/pci/pci.c	Sat Apr 19 19:51:47 2003
@@ -49,11 +49,13 @@
 /*
  * Low-level SAL-based PCI configuration access functions. Note that SAL
  * calls are already serialized (via sal_lock), so we don't need another
- * synchronization mechanism here.  Not using segment number (yet).
+ * synchronization mechanism here.
  */
 
-#define PCI_SAL_ADDRESS(bus, dev, fn, reg) \
-	((u64)(bus << 16) | (u64)(dev << 11) | (u64)(fn << 8) | (u64)(reg))
+#define PCI_SAL_ADDRESS(seg, bus, dev, fn, reg) \
+	((u64)(seg << 24) | (u64)(bus << 16) | \
+	 (u64)(dev << 11) | (u64)(fn << 8) | (u64)(reg))
+
 
 static int
 __pci_sal_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value)
@@ -61,10 +63,10 @@
 	int result = 0;
 	u64 data = 0;
 
-	if (!value || (bus > 255) || (dev > 31) || (fn > 7) || (reg > 255))
+	if (!value || (seg > 255) || (bus > 255) || (dev > 31) || (fn > 7) || (reg > 255))
 		return -EINVAL;
 
-	result = ia64_sal_pci_config_read(PCI_SAL_ADDRESS(bus, dev, fn, reg), len, &data);
+	result = ia64_sal_pci_config_read(PCI_SAL_ADDRESS(seg, bus, dev, fn, reg), len, &data);
 
 	*value = (u32) data;
 
@@ -74,24 +76,24 @@
 static int
 __pci_sal_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value)
 {
-	if ((bus > 255) || (dev > 31) || (fn > 7) || (reg > 255))
+	if ((seg > 255) || (bus > 255) || (dev > 31) || (fn > 7) || (reg > 255))
 		return -EINVAL;
 
-	return ia64_sal_pci_config_write(PCI_SAL_ADDRESS(bus, dev, fn, reg), len, value);
+	return ia64_sal_pci_config_write(PCI_SAL_ADDRESS(seg, bus, dev, fn, reg), len, value);
 }
 
 
 static int
 pci_sal_read (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
 {
-	return __pci_sal_read(0, bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn),
+	return __pci_sal_read(PCI_SEGMENT(bus), bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn),
 			      where, size, value);
 }
 
 static int
 pci_sal_write (struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value)
 {
-	return __pci_sal_write(0, bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn),
+	return __pci_sal_write(PCI_SEGMENT(bus), bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn),
 			       where, size, value);
 }
 
@@ -114,24 +116,91 @@
 
 subsys_initcall(pci_acpi_init);
 
+static void __init
+pcibios_fixup_resource(struct resource *res, u64 offset)
+{
+	res->start += offset;
+	res->end += offset;
+}
+
+void __init
+pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus)
+{
+	int i;
+
+	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
+		if (!dev->resource[i].start)
+			continue;
+		if (dev->resource[i].flags & IORESOURCE_MEM)
+			pcibios_fixup_resource(&dev->resource[i],
+			                       PCI_CONTROLLER(dev)->mem_offset);
+	}
+}
+
 /* Called by ACPI when it finds a new root bus.  */
+
+static struct pci_controller *
+alloc_pci_controller(int seg)
+{
+	struct pci_controller *controller;
+
+	controller = kmalloc(sizeof(*controller), GFP_KERNEL);
+	if (!controller)
+		return NULL;
+
+	memset(controller, 0, sizeof(*controller));
+	controller->segment = seg;
+	return controller;
+}
+
 struct pci_bus *
-pcibios_scan_root (int bus)
+scan_root_bus(int bus, struct pci_ops *ops, void *sysdata)
 {
-	struct list_head *list;
-	struct pci_bus *pci_bus;
+	struct pci_bus *b;
 
-	list_for_each(list, &pci_root_buses) {
-		pci_bus = pci_bus_b(list);
-		if (pci_bus->number == bus) {
-			/* Already scanned */
-			printk("PCI: Bus (%02x) already probed\n", bus);
-			return pci_bus;
-		}
-	}
+	/*
+	 * We know this is a new root bus we haven't seen before, so
+	 * scan it, even if we've seen the same bus number in a different
+	 * segment.
+	 */
+	b = kmalloc(sizeof(*b), GFP_KERNEL);
+	if (!b)
+		return NULL;
+
+	memset(b, 0, sizeof(*b));
+	INIT_LIST_HEAD(&b->children);
+	INIT_LIST_HEAD(&b->devices);
+
+	list_add_tail(&b->node, &pci_root_buses);
+
+	b->number = b->secondary = bus;
+	b->resource[0] = &ioport_resource;
+	b->resource[1] = &iomem_resource;
+
+	b->sysdata = sysdata;
+	b->ops = ops;
+	b->subordinate = pci_do_scan_bus(b);
+
+	return b;
+}
+
+struct pci_bus *
+pcibios_scan_root(void *handle, int seg, int bus)
+{
+	struct pci_controller *controller;
+	u64 base, size, offset;
+
+	printk("PCI: Probing PCI hardware on bus (%02x:%02x)\n", seg, bus);
+	controller = alloc_pci_controller(seg);
+	if (!controller)
+		return NULL;
+
+	controller->acpi_handle = handle;
 
-	printk("PCI: Probing PCI hardware on bus (%02x)\n", bus);
-	return pci_scan_bus(bus, pci_root_ops, NULL);
+	acpi_get_addr_space(handle, ACPI_MEMORY_RANGE, &base, &size, &offset);
+	controller->mem_offset = offset;
+
+	return scan_root_bus(bus, pci_root_ops, controller);
 }
 
 /*
@@ -140,6 +209,11 @@
 void __devinit
 pcibios_fixup_bus (struct pci_bus *b)
 {
+	struct list_head *ln;
+
+	for (ln = b->devices.next; ln != &b->devices; ln = ln->next)
+		pcibios_fixup_device_resources(pci_dev_b(ln), b);
+
 	return;
 }
 
diff -Nru a/arch/ia64/scripts/check-gas b/arch/ia64/scripts/check-gas
--- a/arch/ia64/scripts/check-gas	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/scripts/check-gas	Sat Apr 19 19:51:50 2003
@@ -1,8 +1,9 @@
 #!/bin/sh
 dir=$(dirname $0)
 CC=$1
+OBJDUMP=$2
 $CC -c $dir/check-gas-asm.S
-res=$(objdump -r --section .data check-gas-asm.o | fgrep 00004 | tr -s ' ' |cut -f3 -d' ')
+res=$($OBJDUMP -r --section .data check-gas-asm.o | fgrep 00004 | tr -s ' ' |cut -f3 -d' ')
 if [ $res != ".text" ]; then
 	echo buggy
 else
diff -Nru a/arch/ia64/sn/Makefile b/arch/ia64/sn/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/sn/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,14 @@
+# arch/ia64/sn/Makefile
+#
+# 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.
+#
+# Makefile for the sn ia64 subplatform
+#
+
+EXTRA_CFLAGS := -DLITTLE_ENDIAN
+
+obj-y += kernel/ # io/
diff -Nru a/arch/ia64/sn/fakeprom/Makefile b/arch/ia64/sn/fakeprom/Makefile
--- a/arch/ia64/sn/fakeprom/Makefile	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/sn/fakeprom/Makefile	Sat Apr 19 19:51:50 2003
@@ -1,20 +1,29 @@
+# arch/ia64/sn/fakeprom/Makefile
 #
 # 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) 2000-2001 Silicon Graphics, Inc.  All rights reserved.
+#  Copyright (c) 2000-2003 Silicon Graphics, Inc.  All rights reserved.
 #
+# Medusa fake PROM support
+#
+
+EXTRA_TARGETS := fpromasm.o main.o fw-emu.o fpmem.o klgraph_init.o \
+		 fprom vmlinux.sym
+
+OBJS := $(obj)/fpromasm.o $(obj)/main.o $(obj)/fw-emu.o $(obj)/fpmem.o \
+	$(obj)/klgraph_init.o
+
+LDFLAGS_fprom = -static -T
 
-obj-y=fpromasm.o main.o fw-emu.o fpmem.o klgraph_init.o
+.PHONY: fprom
 
-fprom: $(OBJ)
-	$(LD) -static -Tfprom.lds -o fprom $(OBJ) $(LIB)
+fprom: $(obj)/fprom
 
-.S.o:
-	$(CC)  -D__ASSEMBLY__ $(AFLAGS) $(AFLAGS_KERNEL) -c -o $*.o $<
-.c.o:
-	$(CC)  $(CFLAGS) $(CFLAGS_KERNEL) -c -o $*.o $<
+$(obj)/fprom: $(src)/fprom.lds $(OBJS) arch/ia64/lib/lib.a FORCE
+	$(call if_changed,ld)
 
-clean:
-	rm -f *.o fprom
+$(obj)/vmlinux.sym: $(src)/make_textsym System.map
+	$(src)/make_textsym vmlinux > vmlinux.sym
+	$(call cmd,cptotop)
diff -Nru a/arch/ia64/sn/fakeprom/README b/arch/ia64/sn/fakeprom/README
--- a/arch/ia64/sn/fakeprom/README	Sat Apr 19 19:51:51 2003
+++ b/arch/ia64/sn/fakeprom/README	Sat Apr 19 19:51:51 2003
@@ -1,3 +1,35 @@
+/*
+ * Copyright (c) 2002-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. 
+ * 
+ * Further, this software is distributed without any warranty that it is 
+ * free of the rightful claim of any third person regarding infringement 
+ * or the like.  Any license provided herein, whether implied or 
+ * otherwise, applies only to this software file.  Patent licenses, if 
+ * any, provided herein do not apply to combinations of this program with 
+ * other software, or any other product whatsoever.
+ * 
+ * You should have received a copy of the GNU General Public 
+ * License along with this program; if not, write the Free Software 
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ * 
+ * Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 
+ * Mountain View, CA  94043, or:
+ * 
+ * http://www.sgi.com 
+ * 
+ * For further information regarding this notice, see: 
+ * 
+ * http://oss.sgi.com/projects/GenInfo/NoticeExplan
+ */
+
 This directory contains the files required to build
 the fake PROM image that is currently being used to
 boot IA64 kernels running under the SGI Medusa kernel.
diff -Nru a/arch/ia64/sn/fakeprom/fpmem.c b/arch/ia64/sn/fakeprom/fpmem.c
--- a/arch/ia64/sn/fakeprom/fpmem.c	Sat Apr 19 19:51:46 2003
+++ b/arch/ia64/sn/fakeprom/fpmem.c	Sat Apr 19 19:51:46 2003
@@ -4,7 +4,7 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 2000-2002 Silicon Graphics, Inc.  All rights reserved.
+ * Copyright (C) 2000-2003 Silicon Graphics, Inc.  All rights reserved.
  */
 
 
@@ -168,13 +168,13 @@
 #endif
 
 void
-build_mem_desc(efi_memory_desc_t *md, int type, long paddr, long numbytes)
+build_mem_desc(efi_memory_desc_t *md, int type, long paddr, long numbytes, long attr)
 {
         md->type = type;
         md->phys_addr = paddr;
         md->virt_addr = 0;
         md->num_pages = numbytes >> 12;
-        md->attribute = EFI_MEMORY_WB;
+        md->attribute = attr;
 }
 
 int
@@ -236,28 +236,40 @@
                                  */
                                 if (bank == 0) {
 					if (cnode == 0) {
+						hole = 2*1024*1024;
+						build_mem_desc(md, EFI_PAL_CODE, paddr, hole, EFI_MEMORY_WB|EFI_MEMORY_WB);
+						numbytes -= hole;
+                                        	paddr += hole;
+			        		count++ ;
+                                        	md += mdsize;
 						hole = 1*1024*1024;
-						build_mem_desc(md, EFI_PAL_CODE, paddr, hole);
+						build_mem_desc(md, EFI_CONVENTIONAL_MEMORY, paddr, hole, EFI_MEMORY_UC);
 						numbytes -= hole;
                                         	paddr += hole;
 			        		count++ ;
                                         	md += mdsize;
-						hole = 3*1024*1024;
-						build_mem_desc(md, EFI_RUNTIME_SERVICES_DATA, paddr, hole);
+						hole = 1*1024*1024;
+						build_mem_desc(md, EFI_RUNTIME_SERVICES_DATA, paddr, hole, EFI_MEMORY_WB|EFI_MEMORY_WB);
 						numbytes -= hole;
                                         	paddr += hole;
 			        		count++ ;
                                         	md += mdsize;
 					} else {
-						hole = PROMRESERVED_SIZE;
-                                        	build_mem_desc(md, EFI_RUNTIME_SERVICES_DATA, paddr, hole);
+						hole = 2*1024*1024;
+                                        	build_mem_desc(md, EFI_RUNTIME_SERVICES_DATA, paddr, hole, EFI_MEMORY_WB|EFI_MEMORY_WB);
+						numbytes -= hole;
+                                        	paddr += hole;
+			        		count++ ;
+                                        	md += mdsize;
+						hole = 2*1024*1024;
+                                        	build_mem_desc(md, EFI_RUNTIME_SERVICES_DATA, paddr, hole, EFI_MEMORY_UC);
 						numbytes -= hole;
                                         	paddr += hole;
 			        		count++ ;
                                         	md += mdsize;
 					}
                                 }
-                                build_mem_desc(md, EFI_CONVENTIONAL_MEMORY, paddr, numbytes);
+                                build_mem_desc(md, EFI_CONVENTIONAL_MEMORY, paddr, numbytes, EFI_MEMORY_WB|EFI_MEMORY_WB);
 
 			        md += mdsize ;
 			        count++ ;
diff -Nru a/arch/ia64/sn/fakeprom/fprom.lds b/arch/ia64/sn/fakeprom/fprom.lds
--- a/arch/ia64/sn/fakeprom/fprom.lds	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/sn/fakeprom/fprom.lds	Sat Apr 19 19:51:50 2003
@@ -1,3 +1,34 @@
+/*
+ * Copyright (c) 2002-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. 
+ * 
+ * Further, this software is distributed without any warranty that it is 
+ * free of the rightful claim of any third person regarding infringement 
+ * or the like.  Any license provided herein, whether implied or 
+ * otherwise, applies only to this software file.  Patent licenses, if 
+ * any, provided herein do not apply to combinations of this program with 
+ * other software, or any other product whatsoever.
+ * 
+ * You should have received a copy of the GNU General Public 
+ * License along with this program; if not, write the Free Software 
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ * 
+ * Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 
+ * Mountain View, CA  94043, or:
+ * 
+ * http://www.sgi.com 
+ * 
+ * For further information regarding this notice, see: 
+ * 
+ * http://oss.sgi.com/projects/GenInfo/NoticeExplan
+ */
 
 OUTPUT_FORMAT("elf64-ia64-little")
 OUTPUT_ARCH(ia64)
diff -Nru a/arch/ia64/sn/fakeprom/make_textsym b/arch/ia64/sn/fakeprom/make_textsym
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/sn/fakeprom/make_textsym	Sat Apr 19 19:51:27 2003
@@ -0,0 +1,171 @@
+#!/bin/sh
+#
+# Build a textsym file for use in the Arium ITP probe.
+#
+#
+# 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) 2001-2002 Silicon Graphics, Inc.  All rights reserved.
+#
+
+help() {
+cat <<END
+Build a WinDD "symtxt" file for use with the Arium ECM-30 probe.
+
+	Usage: $0 [<vmlinux file> [<output file>]]
+		If no input file is specified, it defaults to vmlinux.
+		If no output file name is specified, it defaults to "textsym".
+END
+exit 1
+}
+
+err () {
+	echo "ERROR - $*" >&2
+	exit 1
+}
+
+
+OPTS="H"
+while getopts "$OPTS" c ; do
+	case $c in
+		H)  help;;
+		\?) help;;
+	esac
+
+done
+shift `expr $OPTIND - 1`
+
+LINUX=${1:-vmlinux}
+TEXTSYM=${2:-${LINUX}.sym}
+TMPSYM=${2:-${LINUX}.sym.tmp}
+trap "/bin/rm -f $TMPSYM" 0
+
+[ -f $VMLINUX ] || help
+
+$OBJDUMP -t $LINUX | egrep -v '__ks' | sort > $TMPSYM
+SN1=`egrep "dig_setup|Synergy_da_indr" $TMPSYM|wc -l`
+
+# Dataprefix and textprefix correspond to the VGLOBAL_BASE and VPERNODE_BASE.
+# Eventually, these values should be:
+#	dataprefix	ffffffff
+#	textprefix	fffffffe
+# but right now they're still changing, so make them dynamic.
+dataprefix=`awk ' / \.data	/ { print substr($1, 0, 8) ; exit ; }' $TMPSYM`
+textprefix=`awk ' / \.text	/ { print substr($1, 0, 8) ; exit ; }' $TMPSYM`
+
+# pipe everything thru sort
+echo "TEXTSYM V1.0"
+(cat <<END 
+GLOBAL | ${textprefix}00000000 | CODE | VEC_VHPT_Translation_0000
+GLOBAL | ${textprefix}00000400 | CODE | VEC_ITLB_0400
+GLOBAL | ${textprefix}00000800 | CODE | VEC_DTLB_0800
+GLOBAL | ${textprefix}00000c00 | CODE | VEC_Alt_ITLB_0c00
+GLOBAL | ${textprefix}00001000 | CODE | VEC_Alt_DTLB_1000
+GLOBAL | ${textprefix}00001400 | CODE | VEC_Data_nested_TLB_1400
+GLOBAL | ${textprefix}00001800 | CODE | VEC_Instruction_Key_Miss_1800
+GLOBAL | ${textprefix}00001c00 | CODE | VEC_Data_Key_Miss_1c00
+GLOBAL | ${textprefix}00002000 | CODE | VEC_Dirty-bit_2000
+GLOBAL | ${textprefix}00002400 | CODE | VEC_Instruction_Access-bit_2400
+GLOBAL | ${textprefix}00002800 | CODE | VEC_Data_Access-bit_2800
+GLOBAL | ${textprefix}00002c00 | CODE | VEC_Break_instruction_2c00
+GLOBAL | ${textprefix}00003000 | CODE | VEC_External_Interrupt_3000
+GLOBAL | ${textprefix}00003400 | CODE | VEC_Reserved_3400
+GLOBAL | ${textprefix}00003800 | CODE | VEC_Reserved_3800
+GLOBAL | ${textprefix}00003c00 | CODE | VEC_Reserved_3c00
+GLOBAL | ${textprefix}00004000 | CODE | VEC_Reserved_4000
+GLOBAL | ${textprefix}00004400 | CODE | VEC_Reserved_4400
+GLOBAL | ${textprefix}00004800 | CODE | VEC_Reserved_4800
+GLOBAL | ${textprefix}00004c00 | CODE | VEC_Reserved_4c00
+GLOBAL | ${textprefix}00005000 | CODE | VEC_Page_Not_Present_5000
+GLOBAL | ${textprefix}00005100 | CODE | VEC_Key_Permission_5100
+GLOBAL | ${textprefix}00005200 | CODE | VEC_Instruction_Access_Rights_5200
+GLOBAL | ${textprefix}00005300 | CODE | VEC_Data_Access_Rights_5300
+GLOBAL | ${textprefix}00005400 | CODE | VEC_General_Exception_5400
+GLOBAL | ${textprefix}00005500 | CODE | VEC_Disabled_FP-Register_5500
+GLOBAL | ${textprefix}00005600 | CODE | VEC_Nat_Consumption_5600
+GLOBAL | ${textprefix}00005700 | CODE | VEC_Speculation_5700
+GLOBAL | ${textprefix}00005800 | CODE | VEC_Reserved_5800
+GLOBAL | ${textprefix}00005900 | CODE | VEC_Debug_5900
+GLOBAL | ${textprefix}00005a00 | CODE | VEC_Unaligned_Reference_5a00
+GLOBAL | ${textprefix}00005b00 | CODE | VEC_Unsupported_Data_Reference_5b00
+GLOBAL | ${textprefix}00005c00 | CODE | VEC_Floating-Point_Fault_5c00
+GLOBAL | ${textprefix}00005d00 | CODE | VEC_Floating_Point_Trap_5d00
+GLOBAL | ${textprefix}00005e00 | CODE | VEC_Lower_Privilege_Tranfer_Trap_5e00
+GLOBAL | ${textprefix}00005f00 | CODE | VEC_Taken_Branch_Trap_5f00
+GLOBAL | ${textprefix}00006000 | CODE | VEC_Single_Step_Trap_6000
+GLOBAL | ${textprefix}00006100 | CODE | VEC_Reserved_6100
+GLOBAL | ${textprefix}00006200 | CODE | VEC_Reserved_6200
+GLOBAL | ${textprefix}00006300 | CODE | VEC_Reserved_6300
+GLOBAL | ${textprefix}00006400 | CODE | VEC_Reserved_6400
+GLOBAL | ${textprefix}00006500 | CODE | VEC_Reserved_6500
+GLOBAL | ${textprefix}00006600 | CODE | VEC_Reserved_6600
+GLOBAL | ${textprefix}00006700 | CODE | VEC_Reserved_6700
+GLOBAL | ${textprefix}00006800 | CODE | VEC_Reserved_6800
+GLOBAL | ${textprefix}00006900 | CODE | VEC_IA-32_Exeception_6900
+GLOBAL | ${textprefix}00006a00 | CODE | VEC_IA-32_Intercept_6a00
+GLOBAL | ${textprefix}00006b00 | CODE | VEC_IA-32_Interrupt_6b00
+GLOBAL | ${textprefix}00006c00 | CODE | VEC_Reserved_6c00
+GLOBAL | ${textprefix}00006d00 | CODE | VEC_Reserved_6d00
+GLOBAL | ${textprefix}00006e00 | CODE | VEC_Reserved_6e00
+GLOBAL | ${textprefix}00006f00 | CODE | VEC_Reserved_6f00
+GLOBAL | ${textprefix}00007000 | CODE | VEC_Reserved_7000
+GLOBAL | ${textprefix}00007100 | CODE | VEC_Reserved_7100
+GLOBAL | ${textprefix}00007200 | CODE | VEC_Reserved_7200
+GLOBAL | ${textprefix}00007300 | CODE | VEC_Reserved_7300
+GLOBAL | ${textprefix}00007400 | CODE | VEC_Reserved_7400
+GLOBAL | ${textprefix}00007500 | CODE | VEC_Reserved_7500
+GLOBAL | ${textprefix}00007600 | CODE | VEC_Reserved_7600
+GLOBAL | ${textprefix}00007700 | CODE | VEC_Reserved_7700
+GLOBAL | ${textprefix}00007800 | CODE | VEC_Reserved_7800
+GLOBAL | ${textprefix}00007900 | CODE | VEC_Reserved_7900
+GLOBAL | ${textprefix}00007a00 | CODE | VEC_Reserved_7a00
+GLOBAL | ${textprefix}00007b00 | CODE | VEC_Reserved_7b00
+GLOBAL | ${textprefix}00007c00 | CODE | VEC_Reserved_7c00
+GLOBAL | ${textprefix}00007d00 | CODE | VEC_Reserved_7d00
+GLOBAL | ${textprefix}00007e00 | CODE | VEC_Reserved_7e00
+GLOBAL | ${textprefix}00007f00 | CODE | VEC_Reserved_7f00
+END
+
+
+awk '
+/__start_gate_section/ {start=1}
+/^'${dataprefix}\|${textprefix}'/ {
+	if ($4 == ".kdb")
+		next
+	if (start && substr($NF,1,1) != "0") {
+		type = substr($0,26,5)
+		if (type == ".text")
+			printf "GLOBAL | %s | CODE | %s\n", $1, $NF
+		else {
+			n = 0
+			s = $(NF-1)
+			while (length(s) > 0) {
+				n = n*16 + substr(s,1,1)
+				s = substr(s,2)
+			}
+			printf "GLOBAL | %s | DATA | %s | %d\n", $1, $NF, n
+		}
+	}
+	if($NF == "_end") 
+		exit
+
+}
+' $TMPSYM ) | egrep -v " __device| __vendor" | awk -v sn1="$SN1" '
+/GLOBAL/ {
+	print $0
+	if (sn1 != 0) {
+		/* 32 bits of sn1 physical addrs, */
+		print substr($0,1,9) "04" substr($0,20,16) "Phy_" substr($0,36)
+	} else {
+		/* 38 bits of sn2 physical addrs, need addr space bits */
+		print substr($0,1,9) "3004" substr($0,20,16) "Phy_" substr($0,36)
+	}
+
+} ' | sort -k3
+
+N=`wc -l $TEXTSYM|awk '{print $1}'`
+echo "Generated TEXTSYM file" >&2
+echo "  $LINUX --> $TEXTSYM" >&2
+echo "  Found $N symbols" >&2
diff -Nru a/arch/ia64/sn/io/Makefile b/arch/ia64/sn/io/Makefile
--- a/arch/ia64/sn/io/Makefile	Sat Apr 19 19:51:29 2003
+++ b/arch/ia64/sn/io/Makefile	Sat Apr 19 19:51:29 2003
@@ -1,3 +1,4 @@
+# arch/ia64/sn/io/Makefile
 #
 # 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
@@ -5,7 +6,8 @@
 #
 # Copyright (C) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
 #
-# Makefile for the sn kernel routines.
+# Makefile for the sn io routines.
+#
 
 EXTRA_CFLAGS    := -DLITTLE_ENDIAN
 
@@ -19,4 +21,6 @@
 		alenlist.o pci.o pci_dma.o ate_utils.o \
 		ifconfig_net.o io.o ioconfig_bus.o
 
-obj-$(CONFIG_PCIBA)		+= pciba.o
+obj-$(CONFIG_IA64_SGI_SN2) += sn2/
+
+obj-$(CONFIG_PCIBA) += pciba.o
diff -Nru a/arch/ia64/sn/io/sn2/Makefile b/arch/ia64/sn/io/sn2/Makefile
--- a/arch/ia64/sn/io/sn2/Makefile	Sat Apr 19 19:51:51 2003
+++ b/arch/ia64/sn/io/sn2/Makefile	Sat Apr 19 19:51:51 2003
@@ -1,3 +1,4 @@
+# arch/ia64/sn/io/sn2/Makefile
 #
 # 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
@@ -6,14 +7,14 @@
 # Copyright (C) 2002-2003 Silicon Graphics, Inc.  All Rights Reserved.
 #
 # Makefile for the sn2 specific io routines.
+#
 
-EXTRA_CFLAGS    := -DLITTLE_ENDIAN
+EXTRA_CFLAGS := -DLITTLE_ENDIAN
 
-obj-y += bte_error.o geo_op.o klconflib.o klgraph.o l1.o \
+obj-y += pcibr/ bte_error.o geo_op.o klconflib.o klgraph.o l1.o \
 	 l1_command.o ml_iograph.o ml_SN_init.o ml_SN_intr.o module.o \
 	 pci_bus_cvlink.o pciio.o pic.o sgi_io_init.o shub.o shuberror.o \
 	 shub_intr.o shubio.o xbow.o xtalk.o
 
 obj-$(CONFIG_KDB) += kdba_io.o 
-
 obj-$(CONFIG_SHUB_1_0_SPECIFIC) += efi-rtc.o
diff -Nru a/arch/ia64/sn/io/sn2/l1_command.c b/arch/ia64/sn/io/sn2/l1_command.c
--- a/arch/ia64/sn/io/sn2/l1_command.c	Sat Apr 19 19:51:46 2003
+++ b/arch/ia64/sn/io/sn2/l1_command.c	Sat Apr 19 19:51:46 2003
@@ -154,7 +154,7 @@
 
     return ret;
 }
-
+#ifdef CONFIG_PCI
 /*
  * iobrick_module_get_nasid() returns a module_id which has the brick
  * type encoded in bits 15-12, but this is not the true brick type...
@@ -185,7 +185,7 @@
 
     return -1;    /* unknown brick */
 }
-
+#endif
 int iobrick_module_get_nasid(nasid_t nasid)
 {
     int io_moduleid;
diff -Nru a/arch/ia64/sn/io/sn2/pcibr/Makefile b/arch/ia64/sn/io/sn2/pcibr/Makefile
--- a/arch/ia64/sn/io/sn2/pcibr/Makefile	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/sn/io/sn2/pcibr/Makefile	Sat Apr 19 19:51:50 2003
@@ -1,3 +1,4 @@
+# arch/ia64/sn/io/sn2/pcibr/Makefile
 #
 # 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
@@ -6,6 +7,7 @@
 # Copyright (C) 2002-2003 Silicon Graphics, Inc.  All Rights Reserved.
 #
 # Makefile for the sn2 specific pci bridge routines.
+#
 
 EXTRA_CFLAGS    := -DLITTLE_ENDIAN
 
diff -Nru a/arch/ia64/sn/kernel/Makefile b/arch/ia64/sn/kernel/Makefile
--- a/arch/ia64/sn/kernel/Makefile	Sat Apr 19 19:51:28 2003
+++ b/arch/ia64/sn/kernel/Makefile	Sat Apr 19 19:51:28 2003
@@ -1,46 +1,18 @@
 # arch/ia64/sn/kernel/Makefile
 #
-# Copyright (C) 1999,2001-2002 Silicon Graphics, Inc.  All Rights Reserved.
+# This file is subject to the terms and conditions of the GNU General Public
+# License.  See the file "COPYING" in the main directory of this archive
+# for more details.
 #
-# This program is free software; you can redistribute it and/or modify it 
-# under the terms of version 2 of the GNU General Public License 
-# as published by the Free Software Foundation.
-# 
-# This program is distributed in the hope that it would be useful, but 
-# WITHOUT ANY WARRANTY; without even the implied warranty of 
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
-# 
-# Further, this software is distributed without any warranty that it is 
-# free of the rightful claim of any third person regarding infringement 
-# or the like.  Any license provided herein, whether implied or 
-# otherwise, applies only to this software file.  Patent licenses, if 
-# any, provided herein do not apply to combinations of this program with 
-# other software, or any other product whatsoever.
-# 
-# You should have received a copy of the GNU General Public 
-# License along with this program; if not, write the Free Software 
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
-# 
-# Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 
-# Mountain View, CA  94043, or:
-# 
-# http://www.sgi.com 
-# 
-# For further information regarding this notice, see: 
-# 
-# http://oss.sgi.com/projects/GenInfo/NoticeExplan
+# Copyright (C) 1999,2001-2003 Silicon Graphics, Inc.  All Rights Reserved.
 #
 
-EXTRA_CFLAGS    := -DLITTLE_ENDIAN
+EXTRA_CFLAGS := -DLITTLE_ENDIAN
 
-.S.s:
-	$(CPP) $(AFLAGS) $(AFLAGS_KERNEL) -o $*.s $<
-.S.o:
-	$(CC) $(AFLAGS) $(AFLAGS_KERNEL) -c -o $*.o $<
+obj-y				:= probe.o setup.o sn_asm.o sv.o bte.o iomv.o \
+				   irq.o mca.o
 
-obj-y		= probe.o setup.o sn_asm.o sv.o bte.o iomv.o
-obj-$(CONFIG_IA64_SGI_SN1)      += irq.o mca.o
-obj-$(CONFIG_IA64_SGI_SN2)      += irq.o mca.o
+obj-$(CONFIG_IA64_SGI_SN2)      += sn2/
 obj-$(CONFIG_IA64_SGI_AUTOTEST) += llsc4.o misctest.o
 obj-$(CONFIG_IA64_GENERIC)      += machvec.o
 obj-$(CONFIG_MODULES)           += sn_ksyms.o
diff -Nru a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c
--- a/arch/ia64/sn/kernel/setup.c	Sat Apr 19 19:51:29 2003
+++ b/arch/ia64/sn/kernel/setup.c	Sat Apr 19 19:51:29 2003
@@ -237,7 +237,7 @@
 		       "%x.%02x\n", SN_SAL_MIN_MAJOR, SN_SAL_MIN_MINOR);
 		panic("PROM version too old\n");
 	}
-
+#ifdef CONFIG_PCI
 #ifdef CONFIG_IA64_SGI_SN2
 	{
 		extern void io_sh_swapper(int, int);
@@ -253,7 +253,7 @@
 		(void)get_master_baseio_nasid();
 	}
 #endif
-
+#endif /* CONFIG_PCI */
 	status = ia64_sal_freq_base(SAL_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec, &drift);
 	if (status != 0 || ticks_per_sec < 100000) {
 		printk(KERN_WARNING "unable to determine platform RTC clock frequency, guessing.\n");
@@ -349,7 +349,7 @@
         for (cnode=0; cnode < numnodes; cnode++)
 		memcpy(nodepdaindr[cnode]->pernode_pdaindr, nodepdaindr, sizeof(nodepdaindr));
 
-
+#ifdef CONFIG_PCI
 	/*
 	 * Set up IO related platform-dependent nodepda fields.
 	 * The following routine actually sets up the hubinfo struct
@@ -359,6 +359,7 @@
 		init_platform_nodepda(nodepdaindr[cnode], cnode);
 		bte_init_node (nodepdaindr[cnode], cnode);
 	}
+#endif
 }
 
 /**
diff -Nru a/arch/ia64/sn/kernel/sn2/Makefile b/arch/ia64/sn/kernel/sn2/Makefile
--- a/arch/ia64/sn/kernel/sn2/Makefile	Sat Apr 19 19:51:51 2003
+++ b/arch/ia64/sn/kernel/sn2/Makefile	Sat Apr 19 19:51:51 2003
@@ -1,38 +1,14 @@
-#
 # arch/ia64/sn/kernel/sn2/Makefile
 #
+# 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) 1999,2001-2002 Silicon Graphics, Inc. All rights reserved.
 #
-# This program is free software; you can redistribute it and/or modify it 
-# under the terms of version 2 of the GNU General Public License 
-# as published by the Free Software Foundation.
-# 
-# This program is distributed in the hope that it would be useful, but 
-# WITHOUT ANY WARRANTY; without even the implied warranty of 
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
-# 
-# Further, this software is distributed without any warranty that it is 
-# free of the rightful claim of any third person regarding infringement 
-# or the like.  Any license provided herein, whether implied or 
-# otherwise, applies only to this software file.  Patent licenses, if 
-# any, provided herein do not apply to combinations of this program with 
-# other software, or any other product whatsoever.
-# 
-# You should have received a copy of the GNU General Public 
-# License along with this program; if not, write the Free Software 
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
-# 
-# Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, 
-# Mountain View, CA  94043, or:
-# 
-# http://www.sgi.com 
-# 
-# For further information regarding this notice, see: 
-# 
-# http://oss.sgi.com/projects/GenInfo/NoticeExplan
+# sn2 specific kernel files
 #
 
-EXTRA_CFLAGS    := -DLITTLE_ENDIAN
+EXTRA_CFLAGS := -DLITTLE_ENDIAN
 
-obj-y += cache.o iomv.o ptc_deadlock.o sn2_smp.o \
-         sn_proc_fs.o
+obj-y += cache.o iomv.o ptc_deadlock.o sn2_smp.o sn_proc_fs.o
diff -Nru a/arch/ia64/sn/kernel/sn2/io.c b/arch/ia64/sn/kernel/sn2/io.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/ia64/sn/kernel/sn2/io.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,98 @@
+/* 
+ * 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.
+ *
+ * The generic kernel requires function pointers to these routines, so
+ * we wrap the inlines from asm/ia64/sn/sn2/io.h here.
+ */
+
+#include <linux/config.h>
+#include <linux/types.h>
+
+#include <asm/sn/sn2/io.h>
+
+#ifdef CONFIG_IA64_GENERIC
+
+unsigned int
+sn_inb (unsigned long port)
+{
+	return __sn_inb(port);
+}
+
+unsigned int
+sn_inw (unsigned long port)
+{
+	return __sn_inw(port);
+}
+
+unsigned int
+sn_inl (unsigned long port)
+{
+	return __sn_inl(port);
+}
+
+void
+sn_outb (unsigned char val, unsigned long port)
+{
+	__sn_outb(val, port);
+}
+
+void
+sn_outw (unsigned short val, unsigned long port)
+{
+	__sn_outw(val, port);
+}
+
+void
+sn_outl (unsigned int val, unsigned long port)
+{
+	__sn_outl(val, port);
+}
+
+unsigned char
+sn_readb (void *addr)
+{
+	return __sn_readb (addr);
+}
+
+unsigned short
+sn_readw (void *addr)
+{
+	return __sn_readw (addr);
+}
+
+unsigned int
+sn_readl (void *addr)
+{
+	return __sn_readl (addr);
+}
+
+unsigned long
+sn_readq (void *addr)
+{
+	return __sn_readq (addr)
+}
+
+
+/* define aliases: */
+
+asm (".global __sn_inb, __sn_inw, __sn_inl");
+asm ("__sn_inb = sn_inb");
+asm ("__sn_inw = sn_inw");
+asm ("__sn_inl = sn_inl");
+
+asm (".global __sn_outb, __sn_outw, __sn_outl");
+asm ("__sn_outb = sn_outb");
+asm ("__sn_outw = sn_outw");
+asm ("__sn_outl = sn_outl");
+
+asm (".global __sn_readb, __sn_readw, __sn_readl, __sn_readq");
+asm ("__sn_readb = sn_readb");
+asm ("__sn_readw = sn_readw");
+asm ("__sn_readl = sn_readl");
+asm ("__sn_readq = sn_readq");
+
+#endif /* CONFIG_IA64_GENERIC */
diff -Nru a/arch/ia64/sn/kernel/sn2/iomv.c b/arch/ia64/sn/kernel/sn2/iomv.c
--- a/arch/ia64/sn/kernel/sn2/iomv.c	Sat Apr 19 19:51:49 2003
+++ b/arch/ia64/sn/kernel/sn2/iomv.c	Sat Apr 19 19:51:49 2003
@@ -3,10 +3,11 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 2000-2002 Silicon Graphics, Inc. All rights reserved.
+ * Copyright (C) 2000-2003 Silicon Graphics, Inc. All rights reserved.
  */
 
 #include <linux/pci.h>
+#include <linux/module.h>
 #include <asm/io.h>
 #include <asm/delay.h>
 #include <asm/sn/simulator.h>
@@ -46,8 +47,10 @@
 	}
 }
 
+EXPORT_SYMBOL(sn_io_addr);
+
 /**
- * sn2_mmiob - I/O space memory barrier
+ * sn_mmiob - I/O space memory barrier
  *
  * Acts as a memory mapped I/O barrier for platforms that queue writes to 
  * I/O space.  This ensures that subsequent writes to I/O space arrive after
@@ -60,9 +63,9 @@
  *
  */
 void
-sn2_mmiob (void)
+sn_mmiob (void)
 {
-	while ((((volatile unsigned long) (*pda->pio_write_status_addr)) & SH_PIO_WRITE_STATUS_0_PENDING_WRITE_COUNT_MASK) != 
+	while ((((volatile unsigned long) (*pda.pio_write_status_addr)) & SH_PIO_WRITE_STATUS_0_PENDING_WRITE_COUNT_MASK) != 
 				SH_PIO_WRITE_STATUS_0_PENDING_WRITE_COUNT_MASK)
 		udelay(1);
 }
diff -Nru a/arch/ia64/sn/tools/make_textsym b/arch/ia64/sn/tools/make_textsym
--- a/arch/ia64/sn/tools/make_textsym	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,171 +0,0 @@
-#!/bin/sh
-#
-# Build a textsym file for use in the Arium ITP probe.
-#
-#
-# 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) 2001-2002 Silicon Graphics, Inc.  All rights reserved.
-#
-
-help() {
-cat <<END
-Build a WinDD "symtxt" file for use with the Arium ECM-30 probe.
-
-	Usage: $0 [<vmlinux file> [<output file>]]
-		If no input file is specified, it defaults to vmlinux.
-		If no output file name is specified, it defaults to "textsym".
-END
-exit 1
-}
-
-err () {
-	echo "ERROR - $*" >&2
-	exit 1
-}
-
-
-OPTS="H"
-while getopts "$OPTS" c ; do
-	case $c in
-		H)  help;;
-		\?) help;;
-	esac
-
-done
-shift `expr $OPTIND - 1`
-
-LINUX=${1:-vmlinux}
-TEXTSYM=${2:-${LINUX}.sym}
-TMPSYM=${2:-${LINUX}.sym.tmp}
-trap "/bin/rm -f $TMPSYM" 0
-
-[ -f $VMLINUX ] || help
-
-$OBJDUMP -t $LINUX | egrep -v '__ks' | sort > $TMPSYM
-SN1=`egrep "dig_setup|Synergy_da_indr" $TMPSYM|wc -l`
-
-# Dataprefix and textprefix correspond to the VGLOBAL_BASE and VPERNODE_BASE.
-# Eventually, these values should be:
-#	dataprefix	ffffffff
-#	textprefix	fffffffe
-# but right now they're still changing, so make them dynamic.
-dataprefix=`awk ' / \.data	/ { print substr($1, 0, 8) ; exit ; }' $TMPSYM`
-textprefix=`awk ' / \.text	/ { print substr($1, 0, 8) ; exit ; }' $TMPSYM`
-
-# pipe everything thru sort
-echo "TEXTSYM V1.0"
-(cat <<END 
-GLOBAL | ${textprefix}00000000 | CODE | VEC_VHPT_Translation_0000
-GLOBAL | ${textprefix}00000400 | CODE | VEC_ITLB_0400
-GLOBAL | ${textprefix}00000800 | CODE | VEC_DTLB_0800
-GLOBAL | ${textprefix}00000c00 | CODE | VEC_Alt_ITLB_0c00
-GLOBAL | ${textprefix}00001000 | CODE | VEC_Alt_DTLB_1000
-GLOBAL | ${textprefix}00001400 | CODE | VEC_Data_nested_TLB_1400
-GLOBAL | ${textprefix}00001800 | CODE | VEC_Instruction_Key_Miss_1800
-GLOBAL | ${textprefix}00001c00 | CODE | VEC_Data_Key_Miss_1c00
-GLOBAL | ${textprefix}00002000 | CODE | VEC_Dirty-bit_2000
-GLOBAL | ${textprefix}00002400 | CODE | VEC_Instruction_Access-bit_2400
-GLOBAL | ${textprefix}00002800 | CODE | VEC_Data_Access-bit_2800
-GLOBAL | ${textprefix}00002c00 | CODE | VEC_Break_instruction_2c00
-GLOBAL | ${textprefix}00003000 | CODE | VEC_External_Interrupt_3000
-GLOBAL | ${textprefix}00003400 | CODE | VEC_Reserved_3400
-GLOBAL | ${textprefix}00003800 | CODE | VEC_Reserved_3800
-GLOBAL | ${textprefix}00003c00 | CODE | VEC_Reserved_3c00
-GLOBAL | ${textprefix}00004000 | CODE | VEC_Reserved_4000
-GLOBAL | ${textprefix}00004400 | CODE | VEC_Reserved_4400
-GLOBAL | ${textprefix}00004800 | CODE | VEC_Reserved_4800
-GLOBAL | ${textprefix}00004c00 | CODE | VEC_Reserved_4c00
-GLOBAL | ${textprefix}00005000 | CODE | VEC_Page_Not_Present_5000
-GLOBAL | ${textprefix}00005100 | CODE | VEC_Key_Permission_5100
-GLOBAL | ${textprefix}00005200 | CODE | VEC_Instruction_Access_Rights_5200
-GLOBAL | ${textprefix}00005300 | CODE | VEC_Data_Access_Rights_5300
-GLOBAL | ${textprefix}00005400 | CODE | VEC_General_Exception_5400
-GLOBAL | ${textprefix}00005500 | CODE | VEC_Disabled_FP-Register_5500
-GLOBAL | ${textprefix}00005600 | CODE | VEC_Nat_Consumption_5600
-GLOBAL | ${textprefix}00005700 | CODE | VEC_Speculation_5700
-GLOBAL | ${textprefix}00005800 | CODE | VEC_Reserved_5800
-GLOBAL | ${textprefix}00005900 | CODE | VEC_Debug_5900
-GLOBAL | ${textprefix}00005a00 | CODE | VEC_Unaligned_Reference_5a00
-GLOBAL | ${textprefix}00005b00 | CODE | VEC_Unsupported_Data_Reference_5b00
-GLOBAL | ${textprefix}00005c00 | CODE | VEC_Floating-Point_Fault_5c00
-GLOBAL | ${textprefix}00005d00 | CODE | VEC_Floating_Point_Trap_5d00
-GLOBAL | ${textprefix}00005e00 | CODE | VEC_Lower_Privilege_Tranfer_Trap_5e00
-GLOBAL | ${textprefix}00005f00 | CODE | VEC_Taken_Branch_Trap_5f00
-GLOBAL | ${textprefix}00006000 | CODE | VEC_Single_Step_Trap_6000
-GLOBAL | ${textprefix}00006100 | CODE | VEC_Reserved_6100
-GLOBAL | ${textprefix}00006200 | CODE | VEC_Reserved_6200
-GLOBAL | ${textprefix}00006300 | CODE | VEC_Reserved_6300
-GLOBAL | ${textprefix}00006400 | CODE | VEC_Reserved_6400
-GLOBAL | ${textprefix}00006500 | CODE | VEC_Reserved_6500
-GLOBAL | ${textprefix}00006600 | CODE | VEC_Reserved_6600
-GLOBAL | ${textprefix}00006700 | CODE | VEC_Reserved_6700
-GLOBAL | ${textprefix}00006800 | CODE | VEC_Reserved_6800
-GLOBAL | ${textprefix}00006900 | CODE | VEC_IA-32_Exeception_6900
-GLOBAL | ${textprefix}00006a00 | CODE | VEC_IA-32_Intercept_6a00
-GLOBAL | ${textprefix}00006b00 | CODE | VEC_IA-32_Interrupt_6b00
-GLOBAL | ${textprefix}00006c00 | CODE | VEC_Reserved_6c00
-GLOBAL | ${textprefix}00006d00 | CODE | VEC_Reserved_6d00
-GLOBAL | ${textprefix}00006e00 | CODE | VEC_Reserved_6e00
-GLOBAL | ${textprefix}00006f00 | CODE | VEC_Reserved_6f00
-GLOBAL | ${textprefix}00007000 | CODE | VEC_Reserved_7000
-GLOBAL | ${textprefix}00007100 | CODE | VEC_Reserved_7100
-GLOBAL | ${textprefix}00007200 | CODE | VEC_Reserved_7200
-GLOBAL | ${textprefix}00007300 | CODE | VEC_Reserved_7300
-GLOBAL | ${textprefix}00007400 | CODE | VEC_Reserved_7400
-GLOBAL | ${textprefix}00007500 | CODE | VEC_Reserved_7500
-GLOBAL | ${textprefix}00007600 | CODE | VEC_Reserved_7600
-GLOBAL | ${textprefix}00007700 | CODE | VEC_Reserved_7700
-GLOBAL | ${textprefix}00007800 | CODE | VEC_Reserved_7800
-GLOBAL | ${textprefix}00007900 | CODE | VEC_Reserved_7900
-GLOBAL | ${textprefix}00007a00 | CODE | VEC_Reserved_7a00
-GLOBAL | ${textprefix}00007b00 | CODE | VEC_Reserved_7b00
-GLOBAL | ${textprefix}00007c00 | CODE | VEC_Reserved_7c00
-GLOBAL | ${textprefix}00007d00 | CODE | VEC_Reserved_7d00
-GLOBAL | ${textprefix}00007e00 | CODE | VEC_Reserved_7e00
-GLOBAL | ${textprefix}00007f00 | CODE | VEC_Reserved_7f00
-END
-
-
-awk '
-/__start_gate_section/ {start=1}
-/^'${dataprefix}\|${textprefix}'/ {
-	if ($4 == ".kdb")
-		next
-	if (start && substr($NF,1,1) != "0") {
-		type = substr($0,26,5)
-		if (type == ".text")
-			printf "GLOBAL | %s | CODE | %s\n", $1, $NF
-		else {
-			n = 0
-			s = $(NF-1)
-			while (length(s) > 0) {
-				n = n*16 + substr(s,1,1)
-				s = substr(s,2)
-			}
-			printf "GLOBAL | %s | DATA | %s | %d\n", $1, $NF, n
-		}
-	}
-	if($NF == "_end") 
-		exit
-
-}
-' $TMPSYM ) | egrep -v " __device| __vendor" | awk -v sn1="$SN1" '
-/GLOBAL/ {
-	print $0
-	if (sn1 != 0) {
-		/* 32 bits of sn1 physical addrs, */
-		print substr($0,1,9) "04" substr($0,20,16) "Phy_" substr($0,36)
-	} else {
-		/* 38 bits of sn2 physical addrs, need addr space bits */
-		print substr($0,1,9) "3004" substr($0,20,16) "Phy_" substr($0,36)
-	}
-
-} ' | sort -k3
-
-N=`wc -l $TEXTSYM|awk '{print $1}'`
-echo "Generated TEXTSYM file" >&2
-echo "  $LINUX --> $TEXTSYM" >&2
-echo "  Found $N symbols" >&2
diff -Nru a/arch/ia64/vmlinux.lds.S b/arch/ia64/vmlinux.lds.S
--- a/arch/ia64/vmlinux.lds.S	Sat Apr 19 19:51:50 2003
+++ b/arch/ia64/vmlinux.lds.S	Sat Apr 19 19:51:50 2003
@@ -96,7 +96,11 @@
   . = ALIGN(PAGE_SIZE);
   __init_begin = .;
   .init.text : AT(ADDR(.init.text) - PAGE_OFFSET)
-	{ *(.init.text) }
+	{
+	  _sinittext = .;
+	  *(.init.text)
+	  _einittext = .;
+	}
 
   .init.data : AT(ADDR(.init.data) - PAGE_OFFSET)
 	{ *(.init.data) }
diff -Nru a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
--- a/arch/m68k/kernel/Makefile	Sat Apr 19 19:51:50 2003
+++ b/arch/m68k/kernel/Makefile	Sat Apr 19 19:51:50 2003
@@ -12,6 +12,7 @@
 			sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o
 
 obj-$(CONFIG_PCI)	+= bios32.o
+obj-$(CONFIG_MODULES)	+= module.o
 
 EXTRA_AFLAGS := -traditional
 
diff -Nru a/arch/m68k/kernel/module.c b/arch/m68k/kernel/module.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/m68k/kernel/module.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,95 @@
+#include <linux/moduleloader.h>
+#include <linux/elf.h>
+#include <linux/vmalloc.h>
+#include <linux/fs.h>
+#include <linux/string.h>
+#include <linux/kernel.h>
+
+#if 0
+#define DEBUGP printk
+#else
+#define DEBUGP(fmt...)
+#endif
+
+void *module_alloc(unsigned long size)
+{
+	if (size == 0)
+		return NULL;
+	return vmalloc(size);
+}
+
+
+/* Free memory returned from module_alloc */
+void module_free(struct module *mod, void *module_region)
+{
+	vfree(module_region);
+	/* FIXME: If module_region == mod->init_region, trim exception
+           table entries. */
+}
+
+/* We don't need anything special. */
+int module_frob_arch_sections(Elf_Ehdr *hdr,
+			      Elf_Shdr *sechdrs,
+			      char *secstrings,
+			      struct module *mod)
+{
+	return 0;
+}
+
+int apply_relocate(Elf32_Shdr *sechdrs,
+		   const char *strtab,
+		   unsigned int symindex,
+		   unsigned int relsec,
+		   struct module *me)
+{
+	unsigned int i;
+	Elf32_Rel *rel = (void *)sechdrs[relsec].sh_addr;
+	Elf32_Sym *sym;
+	uint32_t *location;
+
+	DEBUGP("Applying relocate section %u to %u\n", relsec,
+	       sechdrs[relsec].sh_info);
+	for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) {
+		/* This is where to make the change */
+		location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr
+			+ rel[i].r_offset;
+		/* This is the symbol it is referring to.  Note that all
+		   undefined symbols have been resolved.  */
+		sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+			+ ELF32_R_SYM(rel[i].r_info);
+
+		switch (ELF32_R_TYPE(rel[i].r_info)) {
+		case R_68K_32:
+			/* We add the value into the location given */
+			*location += sym->st_value;
+			break;
+		case R_68K_PC32:
+			/* Add the value, subtract its postition */
+			*location += sym->st_value - (uint32_t)location;
+			break;
+		default:
+			printk(KERN_ERR "module %s: Unknown relocation: %u\n",
+			       me->name, ELF32_R_TYPE(rel[i].r_info));
+			return -ENOEXEC;
+		}
+	}
+	return 0;
+}
+
+int apply_relocate_add(Elf32_Shdr *sechdrs,
+		       const char *strtab,
+		       unsigned int symindex,
+		       unsigned int relsec,
+		       struct module *me)
+{
+	printk(KERN_ERR "module %s: ADD RELOCATION unsupported\n",
+	       me->name);
+	return -ENOEXEC;
+}
+
+int module_finalize(const Elf_Ehdr *hdr,
+		    const Elf_Shdr *sechdrs,
+		    struct module *me)
+{
+	return 0;
+}
diff -Nru a/arch/m68k/vmlinux-std.lds b/arch/m68k/vmlinux-std.lds
--- a/arch/m68k/vmlinux-std.lds	Sat Apr 19 19:51:50 2003
+++ b/arch/m68k/vmlinux-std.lds	Sat Apr 19 19:51:50 2003
@@ -40,7 +40,11 @@
   /* will be freed after init */
   . = ALIGN(4096);		/* Init code and data */
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
   . = ALIGN(16);
   __setup_start = .;
diff -Nru a/arch/m68k/vmlinux-sun3.lds b/arch/m68k/vmlinux-sun3.lds
--- a/arch/m68k/vmlinux-sun3.lds	Sat Apr 19 19:51:27 2003
+++ b/arch/m68k/vmlinux-sun3.lds	Sat Apr 19 19:51:27 2003
@@ -34,7 +34,11 @@
   /* will be freed after init */
   . = ALIGN(8192);	/* Init code and data */
 __init_begin = .;
-  	.init.text : { *(.init.text) }
+	.init.text : { 
+		_sinittext = .;
+		*(.init.text)
+		_einittext = .;
+	}
   	.init.data : { *(.init.data) }
 	. = ALIGN(16);
 	__setup_start = .;
diff -Nru a/arch/m68knommu/vmlinux.lds.S b/arch/m68knommu/vmlinux.lds.S
--- a/arch/m68knommu/vmlinux.lds.S	Sat Apr 19 19:51:46 2003
+++ b/arch/m68knommu/vmlinux.lds.S	Sat Apr 19 19:51:46 2003
@@ -282,7 +282,9 @@
 	.init : {
 		. = ALIGN(4096);
 		__init_begin = .;
+		_sinittext = .;
 		*(.init.text)
+		_einittext = .;
 		*(.init.data)
 		. = ALIGN(16);
 		__setup_start = .;
diff -Nru a/arch/mips/kernel/irixioctl.c b/arch/mips/kernel/irixioctl.c
--- a/arch/mips/kernel/irixioctl.c	Sat Apr 19 19:51:49 2003
+++ b/arch/mips/kernel/irixioctl.c	Sat Apr 19 19:51:49 2003
@@ -34,7 +34,7 @@
 	struct file *filp;
 	struct tty_struct *ttyp = NULL;
 
-	read_lock(&current->files->file_lock);
+	spin_lock(&current->files->file_lock);
 	filp = fcheck(fd);
 	if(filp && filp->private_data) {
 		ttyp = (struct tty_struct *) filp->private_data;
@@ -42,7 +42,7 @@
 		if(ttyp->magic != TTY_MAGIC)
 			ttyp =NULL;
 	}
-	read_unlock(&current->files->file_lock);
+	spin_unlock(&current->files->file_lock);
 	return ttyp;
 }
 
diff -Nru a/arch/mips64/kernel/linux32.c b/arch/mips64/kernel/linux32.c
--- a/arch/mips64/kernel/linux32.c	Sat Apr 19 19:51:49 2003
+++ b/arch/mips64/kernel/linux32.c	Sat Apr 19 19:51:49 2003
@@ -195,7 +195,7 @@
 			}
 			err = copy_from_user(kaddr + offset, (char *)A(str),
 			                     bytes_to_copy);
-			flush_page_to_ram(page);
+			flush_dcache_page(page);
 			kunmap(page);
 
 			if (err)
diff -Nru a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c
--- a/arch/parisc/kernel/sys_parisc32.c	Sat Apr 19 19:51:46 2003
+++ b/arch/parisc/kernel/sys_parisc32.c	Sat Apr 19 19:51:46 2003
@@ -183,7 +183,6 @@
 			}
 			err = copy_from_user(kaddr + offset, (char *)A(str), bytes_to_copy);
 			flush_dcache_page(page);
-			flush_page_to_ram(page);
 			kunmap(page);
 
 			if (err)
@@ -476,81 +475,6 @@
     return do_sys_settimeofday(tv ? &ktv : NULL, tz ? &ktz : NULL);
 }
 
-struct rusage32 {
-        struct compat_timeval ru_utime;
-        struct compat_timeval ru_stime;
-        int    ru_maxrss;
-        int    ru_ixrss;
-        int    ru_idrss;
-        int    ru_isrss;
-        int    ru_minflt;
-        int    ru_majflt;
-        int    ru_nswap;
-        int    ru_inblock;
-        int    ru_oublock;
-        int    ru_msgsnd; 
-        int    ru_msgrcv; 
-        int    ru_nsignals;
-        int    ru_nvcsw;
-        int    ru_nivcsw;
-};
-
-static int
-put_rusage32(struct rusage32 *ru32p, struct rusage *r)
-{
-	struct rusage32 r32;
-#undef CP
-#define CP(t) r32.t = r->t;
-	CP(ru_utime.tv_sec); CP(ru_utime.tv_usec);
-	CP(ru_stime.tv_sec); CP(ru_stime.tv_usec);
-	CP(ru_maxrss);
-	CP(ru_ixrss);
-	CP(ru_idrss);
-	CP(ru_isrss);
-	CP(ru_minflt);
-	CP(ru_majflt);
-	CP(ru_nswap);
-	CP(ru_inblock);
-	CP(ru_oublock);
-	CP(ru_msgsnd);
-	CP(ru_msgrcv);
-	CP(ru_nsignals);
-	CP(ru_nvcsw);
-	CP(ru_nivcsw);
-	return copy_to_user(ru32p, &r32, sizeof r32);
-}
-
-asmlinkage int
-sys32_getrusage(int who, struct rusage32 *ru)
-{
-	struct rusage r;
-	int ret;
-	extern asmlinkage int sys_getrusage(int who, struct rusage *ru);
-		
-	KERNEL_SYSCALL(ret, sys_getrusage, who, &r);
-	if (put_rusage32(ru, &r)) return -EFAULT;
-	return ret;
-}
-
-asmlinkage int
-sys32_wait4(compat_pid_t pid, unsigned int * stat_addr, int options,
-	    struct rusage32 * ru)
-{
-	if (!ru)
-		return sys_wait4(pid, stat_addr, options, NULL);
-	else {
-		struct rusage r;
-		int ret;
-		unsigned int status;
-	
-		KERNEL_SYSCALL(ret, sys_wait4, pid, stat_addr ? &status : NULL, options, &r);
-		if (put_rusage32(ru, &r)) return -EFAULT;
-		if (stat_addr && put_user(status, stat_addr))
-			return -EFAULT;
-		return ret;
-	}
-}
-
 int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf)
 {
 	int err;
@@ -722,74 +646,6 @@
 	return error;
 }
 
-struct rlimit32 {
-	__u32	rlim_cur;
-	__u32	rlim_max;
-};
-
-#define RLIM32_INFINITY 0xffffffff
-
-asmlinkage long sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit32 rlim32;
-	struct rlimit *rlimip;
-
-	if (resource >= RLIM_NLIMITS)
-		return -EINVAL;
-	rlimip = current->rlim + resource;
-	if (rlimip->rlim_cur >= RLIM32_INFINITY) {
-		rlim32.rlim_cur = RLIM32_INFINITY;
-	} else {
-		rlim32.rlim_cur = rlimip->rlim_cur;
-	}
-	if (rlimip->rlim_max >= RLIM32_INFINITY) {
-		rlim32.rlim_max = RLIM32_INFINITY;
-	} else {
-		rlim32.rlim_max = rlimip->rlim_max;
-	}
-	return copy_to_user(rlim, &rlim32, sizeof (struct rlimit32));
-}
-
-asmlinkage long sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit32 rlim32;
-	struct rlimit new_rlim, *old_rlim;
-
-	if (resource >= RLIM_NLIMITS)
-		return -EINVAL;
-	if (copy_from_user(&rlim32, rlim, sizeof(rlim)))
-		return -EFAULT;
-	if (rlim32.rlim_cur == RLIM32_INFINITY) {
-		new_rlim.rlim_cur = RLIM_INFINITY;
-	} else {
-		new_rlim.rlim_cur = rlim32.rlim_cur;
-	}
-	if (rlim32.rlim_max == RLIM32_INFINITY) {
-		new_rlim.rlim_max = RLIM_INFINITY;
-	} else {
-		new_rlim.rlim_max = rlim32.rlim_max;
-	}
-
-	old_rlim = current->rlim + resource;
-	if (((new_rlim.rlim_cur > old_rlim->rlim_max) ||
-	     (new_rlim.rlim_max > old_rlim->rlim_max)) &&
-	    !capable(CAP_SYS_RESOURCE))
-		return -EPERM;
-	if (resource == RLIMIT_NOFILE) {
-		if (new_rlim.rlim_cur > NR_OPEN || new_rlim.rlim_max > NR_OPEN)
-			return -EPERM;
-	}
-	if (resource == RLIMIT_STACK) {
-		if (new_rlim.rlim_max > 1024 * 1024 * 1024) {
-			new_rlim.rlim_max = 1024 * 1024 * 1024;
-		}
-		new_rlim.rlim_max = PAGE_ALIGN(new_rlim.rlim_max);
-	}
-	
-	*old_rlim = new_rlim;
-	return 0;
-}
-
 static int copy_mount_stuff_to_kernel(const void *user, unsigned long *kernel)
 {
 	int i;
@@ -1592,7 +1448,7 @@
 	return sys_semctl (semid, semnum, cmd, arg);
 }
 
-extern int sys_lookup_dcookie(u64 cookie64, char *buf, size_t len);
+extern long sys_lookup_dcookie(u64 cookie64, char *buf, size_t len);
 
 long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char *buf,
 			  size_t len)
diff -Nru a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S
--- a/arch/parisc/kernel/syscall.S	Sat Apr 19 19:51:51 2003
+++ b/arch/parisc/kernel/syscall.S	Sat Apr 19 19:51:51 2003
@@ -431,9 +431,9 @@
 	ENTRY_COMP(sigpending)
 	ENTRY_SAME(sethostname)
 	/* Following 3 have linux-common-code structs containing longs -( */
-	ENTRY_DIFF(setrlimit)		/* 75 */
-	ENTRY_DIFF(getrlimit)
-	ENTRY_DIFF(getrusage)
+	ENTRY_COMP(setrlimit)		/* 75 */
+	ENTRY_COMP(getrlimit)
+	ENTRY_COMP(getrusage)
 	/* struct timeval and timezone are maybe?? consistent wide and narrow */
 	ENTRY_DIFF(gettimeofday)
 	ENTRY_DIFF(settimeofday)
@@ -476,7 +476,7 @@
 	ENTRY_SAME(fstat64)
 	ENTRY_SAME(vfork_wrapper)
 	/* struct rusage contains longs... */
-	ENTRY_DIFF(wait4)
+	ENTRY_COMP(wait4)
 	ENTRY_SAME(swapoff)		/* 115 */
 	ENTRY_DIFF(sysinfo)
 	ENTRY_SAME(shutdown)
@@ -598,8 +598,8 @@
 
 	ENTRY_SAME(sendfile64)
 	ENTRY_COMP(futex)		/* 210 */
-	ENTRY_SAME(sched_setaffinity)
-	ENTRY_SAME(sched_getaffinity)
+	ENTRY_COMP(sched_setaffinity)
+	ENTRY_COMP(sched_getaffinity)
 	ENTRY_SAME(ni_syscall)
 	ENTRY_SAME(ni_syscall)
 	ENTRY_SAME(io_setup)		/* 215 */
diff -Nru a/arch/parisc/vmlinux.lds.S b/arch/parisc/vmlinux.lds.S
--- a/arch/parisc/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
+++ b/arch/parisc/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
@@ -53,7 +53,11 @@
 
   . = ALIGN(16384);
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
   . = ALIGN(16);
   __setup_start = .;
diff -Nru a/arch/ppc/vmlinux.lds.S b/arch/ppc/vmlinux.lds.S
--- a/arch/ppc/vmlinux.lds.S	Sat Apr 19 19:51:51 2003
+++ b/arch/ppc/vmlinux.lds.S	Sat Apr 19 19:51:51 2003
@@ -78,7 +78,11 @@
 
   . = ALIGN(4096);
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { 
     *(.init.data);
     __vtop_table_begin = .;
diff -Nru a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S
--- a/arch/ppc64/kernel/misc.S	Sat Apr 19 19:51:50 2003
+++ b/arch/ppc64/kernel/misc.S	Sat Apr 19 19:51:50 2003
@@ -577,9 +577,9 @@
 	.llong .sys_sigsuspend
 	.llong .compat_sys_sigpending
 	.llong .sys32_sethostname
-	.llong .sys32_setrlimit	        /* 75 */
-	.llong .sys32_old_getrlimit
-	.llong .sys32_getrusage
+	.llong .compat_sys_setrlimit	        /* 75 */
+	.llong .compat_sys_old_getrlimit
+	.llong .compat_sys_getrusage
 	.llong .sys32_gettimeofday
 	.llong .sys32_settimeofday
 	.llong .sys32_getgroups	        /* 80 */
@@ -616,7 +616,7 @@
 	.llong .sys_vhangup
 	.llong .sys_ni_syscall		/* old idle syscall */
 	.llong .sys_ni_syscall		/* old vm86 syscall */
-	.llong .sys32_wait4
+	.llong .compat_sys_wait4
 	.llong .sys_swapoff		/* 115 */
 	.llong .sys32_sysinfo
 	.llong .sys32_ipc
@@ -692,7 +692,7 @@
 	.llong .sys_ni_syscall		/* reserved for streams1 */
 	.llong .sys_ni_syscall		/* reserved for streams2 */
 	.llong .sys_vfork
-	.llong .sys32_getrlimit	        /* 190 */
+	.llong .compat_sys_getrlimit	        /* 190 */
 	.llong .sys32_readahead
 	.llong .sys32_mmap2
 	.llong .sys32_truncate64
@@ -724,8 +724,8 @@
 	.llong .sys_lremovexattr
 	.llong .sys_fremovexattr	/* 220 */
 	.llong .compat_sys_futex
-	.llong .sys32_sched_setaffinity
-	.llong .sys32_sched_getaffinity
+	.llong .compat_sys_sched_setaffinity
+	.llong .compat_sys_sched_getaffinity
 	.llong .sys_ni_syscall
 	.llong .sys_ni_syscall		/* 225 - reserved for tux */
 	.llong .sys32_sendfile64
diff -Nru a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c
--- a/arch/ppc64/kernel/sys_ppc32.c	Sat Apr 19 19:51:49 2003
+++ b/arch/ppc64/kernel/sys_ppc32.c	Sat Apr 19 19:51:49 2003
@@ -1125,152 +1125,6 @@
 		 __put_user(i->tv_usec, &o->tv_usec)));
 }
 
-
-
-
-#define RLIM_INFINITY32	0xffffffff
-#define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)
-
-struct rlimit32 {
-	u32	rlim_cur;
-	u32	rlim_max;
-};
-
-extern asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit *rlim);
-asmlinkage long sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_getrlimit(resource, &r);
-	set_fs(old_fs);
-	if (!ret) {
-		ret = put_user(RESOURCE32(r.rlim_cur), &rlim->rlim_cur);
-		ret |= __put_user(RESOURCE32(r.rlim_max), &rlim->rlim_max);
-	}
-	
-	return ret;
-}
-
-/* Back compatibility for getrlimit. Needed for some apps. */
-asmlinkage long sys32_old_getrlimit(unsigned int resource, struct rlimit32* rlim)
-{
-	struct rlimit   x;    // 64-bit version of the resource limits.
-	struct rlimit32 x32;  // 32-bit version of the resource limits.
-
-	if (resource >= RLIM_NLIMITS)
-		return -EINVAL;
-
-	memcpy(&x, current->rlim+resource, sizeof(struct rlimit));
-
-	if (x.rlim_cur > RLIM_INFINITY32)
-		x32.rlim_cur = RLIM_INFINITY32;
-	else
-		x32.rlim_cur = x.rlim_cur;
-
-	if (x.rlim_max > RLIM_INFINITY32)
-		x32.rlim_max = RLIM_INFINITY32;
-	else
-		x32.rlim_max = x.rlim_max;
-
-	return (copy_to_user(rlim, &x32, sizeof(x32))) ? (-EFAULT) : 0;
-}
-
-extern asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit *rlim);
-asmlinkage long sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	long ret;
-	mm_segment_t old_fs = get_fs ();
-	
-	if (resource >= RLIM_NLIMITS) return -EINVAL;	
-	if (get_user (r.rlim_cur, &rlim->rlim_cur) ||
-	    __get_user (r.rlim_max, &rlim->rlim_max))
-		return -EFAULT;
-	if (r.rlim_cur >= RLIM_INFINITY32)
-		r.rlim_cur = RLIM_INFINITY;
-	if (r.rlim_max >= RLIM_INFINITY32)
-		r.rlim_max = RLIM_INFINITY;
-	set_fs (KERNEL_DS);
-	ret = sys_setrlimit(resource, &r);
-	set_fs (old_fs);
-	
-	return ret;
-}
-
-
-struct rusage32 {
-        struct compat_timeval ru_utime;
-        struct compat_timeval ru_stime;
-        s32    ru_maxrss;
-        s32    ru_ixrss;
-        s32    ru_idrss;
-        s32    ru_isrss;
-        s32    ru_minflt;
-        s32    ru_majflt;
-        s32    ru_nswap;
-        s32    ru_inblock;
-        s32    ru_oublock;
-        s32    ru_msgsnd; 
-        s32    ru_msgrcv; 
-        s32    ru_nsignals;
-        s32    ru_nvcsw;
-        s32    ru_nivcsw;
-};
-
-static int put_rusage (struct rusage32 *ru, struct rusage *r)
-{
-	int err;
-	
-	err = put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);
-	err |= __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec);
-	err |= __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec);
-	err |= __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec);
-	err |= __put_user (r->ru_maxrss, &ru->ru_maxrss);
-	err |= __put_user (r->ru_ixrss, &ru->ru_ixrss);
-	err |= __put_user (r->ru_idrss, &ru->ru_idrss);
-	err |= __put_user (r->ru_isrss, &ru->ru_isrss);
-	err |= __put_user (r->ru_minflt, &ru->ru_minflt);
-	err |= __put_user (r->ru_majflt, &ru->ru_majflt);
-	err |= __put_user (r->ru_nswap, &ru->ru_nswap);
-	err |= __put_user (r->ru_inblock, &ru->ru_inblock);
-	err |= __put_user (r->ru_oublock, &ru->ru_oublock);
-	err |= __put_user (r->ru_msgsnd, &ru->ru_msgsnd);
-	err |= __put_user (r->ru_msgrcv, &ru->ru_msgrcv);
-	err |= __put_user (r->ru_nsignals, &ru->ru_nsignals);
-	err |= __put_user (r->ru_nvcsw, &ru->ru_nvcsw);
-	err |= __put_user (r->ru_nivcsw, &ru->ru_nivcsw);
-	return err;
-}
-
-
-extern asmlinkage long sys_getrusage(int who, struct rusage *ru);
-
-/* Note: it is necessary to treat who as an unsigned int, 
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long sys32_getrusage(u32 who, struct rusage32 *ru)
-{
-	struct rusage r;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_getrusage((int)who, &r);
-	set_fs (old_fs);
-	if (put_rusage (ru, &r)) 
-		return -EFAULT;
-
-	return ret;
-}
-
-
-
-
 struct sysinfo32 {
         s32 uptime;
         u32 loads[3];
@@ -2077,7 +1931,6 @@
 
 			err = copy_from_user(kaddr + offset, (char *)A(str),
 					     bytes_to_copy);
-			flush_page_to_ram(page);
 			kunmap((unsigned long)kaddr);
 
 			if (err)
@@ -2341,35 +2194,6 @@
 }
 
 
-extern asmlinkage long sys_wait4(pid_t pid, unsigned int * stat_addr, int options, struct rusage * ru);
-
-/* Note: it is necessary to treat pid and options as unsigned ints,
- * with the corresponding cast to a signed int to insure that the 
- * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode)
- * and the register representation of a signed int (msr in 64-bit mode) is performed.
- */
-asmlinkage long sys32_wait4(u32 pid, unsigned int * stat_addr, u32 options, struct rusage * ru)
-{
-	if (!ru)
-		return sys_wait4((int)pid, stat_addr, options, NULL);
-	else {
-		struct rusage r;
-		int ret;
-		unsigned int status;
-		mm_segment_t old_fs = get_fs();
-		
-		set_fs (KERNEL_DS);
-		ret = sys_wait4((int)pid, stat_addr ? &status : NULL, options, &r);
-		set_fs (old_fs);
-		if (put_rusage ((struct rusage32 *)ru, &r)) return -EFAULT;
-		if (stat_addr && put_user (status, stat_addr))
-			return -EFAULT;
-		return ret;
-	}
-	
-}
-
-
 extern asmlinkage long sys_waitpid(pid_t pid, unsigned int * stat_addr, int options);
 
 /* Note: it is necessary to treat pid and options as unsigned ints,
@@ -2781,56 +2605,6 @@
 	return secs;
 }
 
-extern asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len,
-					    unsigned long *user_mask_ptr);
-
-asmlinkage int sys32_sched_setaffinity(compat_pid_t pid, unsigned int len,
-				       u32 *user_mask_ptr)
-{
-	unsigned long kernel_mask;
-	mm_segment_t old_fs;
-	int ret;
-
-	if (get_user(kernel_mask, user_mask_ptr))
-		return -EFAULT;
-
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_sched_setaffinity(pid,
-				    /* XXX Nice api... */
-				    sizeof(kernel_mask),
-				    &kernel_mask);
-	set_fs(old_fs);
-
-	return ret;
-}
-
-extern asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len,
-					    unsigned long *user_mask_ptr);
-
-asmlinkage int sys32_sched_getaffinity(compat_pid_t pid, unsigned int len,
-				       u32 *user_mask_ptr)
-{
-	unsigned long kernel_mask;
-	mm_segment_t old_fs;
-	int ret;
-
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_sched_getaffinity(pid,
-				    /* XXX Nice api... */
-				    sizeof(kernel_mask),
-				    &kernel_mask);
-	set_fs(old_fs);
-
-	if (ret > 0) {
-		if (put_user(kernel_mask, user_mask_ptr))
-			ret = -EFAULT;
-	}
-
-	return ret;
-}
-
 int sys32_olduname(struct oldold_utsname * name)
 {
 	int error;
@@ -2914,7 +2688,7 @@
 	return sys_ftruncate(fd, (high << 32) | low);
 }
 
-extern int sys_lookup_dcookie(u64 cookie64, char *buf, size_t len);
+extern long sys_lookup_dcookie(u64 cookie64, char *buf, size_t len);
 
 long ppc32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char *buf,
 			  size_t len)
diff -Nru a/arch/ppc64/vmlinux.lds.S b/arch/ppc64/vmlinux.lds.S
--- a/arch/ppc64/vmlinux.lds.S	Sat Apr 19 19:51:49 2003
+++ b/arch/ppc64/vmlinux.lds.S	Sat Apr 19 19:51:49 2003
@@ -77,7 +77,11 @@
   /* will be freed after init */
   . = ALIGN(4096);
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
   . = ALIGN(16);
   __setup_start = .;
diff -Nru a/arch/s390/Kconfig b/arch/s390/Kconfig
--- a/arch/s390/Kconfig	Sat Apr 19 19:51:46 2003
+++ b/arch/s390/Kconfig	Sat Apr 19 19:51:46 2003
@@ -7,10 +7,6 @@
 	bool
 	default y
 
-config UID16
-	bool
-	default y
-
 config RWSEM_GENERIC_SPINLOCK
 	bool
 
@@ -26,18 +22,29 @@
 config ARCH_S390
 	bool
 	default y
-	help
-	  Select this option, if you want to run the Kernel on one of IBM's
-	  mainframes of the S/390 generation. You should have installed the
-	  s390-compiler released by IBM (based on gcc-2.95.1) before.
 
-source "init/Kconfig"
+config UID16
+	bool
+	default y
+	depends on ARCH_S390X = 'n'
 
+source "init/Kconfig"
 
 menu "Base setup"
 
 comment "Processor type and features"
 
+config ARCH_S390X
+	bool "64 bit kernel"
+	help
+	  Select this option if you have a 64 bit IBM zSeries machine
+	  and want to use the 64 bit addressing mode.
+
+config ARCH_S390_31
+	bool
+	depends on ARCH_S390X = 'n'
+	default y
+
 config SMP
 	bool "Symmetric multi-processing support"
 	---help---
@@ -51,32 +58,15 @@
 	  singleprocessor machines. On a singleprocessor machine, the kernel
 	  will run faster if you say N here.
 
-	  Note that if you say Y here and choose architecture "586" or
-	  "Pentium" under "Processor family", the kernel will not work on 486
-	  architectures. Similarly, multiprocessor kernels for the "PPro"
-	  architecture may not work on all Pentium based boards.
-
-	  People using multiprocessor machines who say Y here should also say
-	  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
-	  Management" code will be disabled if you say Y here.
-
 	  See also the <file:Documentation/smp.tex>,
-	  <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>,
-	  <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
+	  <file:Documentation/smp.txt> and the SMP-HOWTO available at
 	  <http://www.linuxdoc.org/docs.html#howto>.
 
-	  If you don't know what to do here, say N.
-
-config MATHEMU
-	bool "IEEE FPU emulation"
-	help
-	  This option is required for IEEE compliant floating point arithmetic
-	  on the Alpha. The only time you would ever not say Y is to say M in
-	  order to debug the code. Say Y unless you know what you are doing.
+	  Even if you don't know what to do here, say Y.
 
 config NR_CPUS
 	int "Maximum number of CPUs (2-32)"
-	depends on SMP
+	depends on SMP && ARCH_S390X = 'n'
 	default "32"
 	help
 	  This allows you to specify the maximum number of CPUs which this
@@ -85,13 +75,54 @@
 
 	  This is purely to save memory - each supported CPU adds
 	  approximately eight kilobytes to the kernel image.
+	
+config NR_CPUS
+	int "Maximum number of CPUs (2-64)"
+	depends on SMP && ARCH_S390X
+	default "64"
+	help
+	  This allows you to specify the maximum number of CPUs which this
+	  kernel will support.  The maximum supported value is 64 and the
+	  minimum value which makes sense is 2.
+
+	  This is purely to save memory - each supported CPU adds
+	  approximately sixteen kilobytes to the kernel image.
+
+config MATHEMU
+	bool "IEEE FPU emulation"
+	depends on ARCH_S390X = n
+	help
+	  This option is required for IEEE compliant floating point arithmetic
+	  on older S/390 machines. Say Y unless you know your machine doesn't 
+	  need this.
+
+config S390_SUPPORT
+	bool "Kernel support for 31 bit emulation"
+	depends on ARCH_S390X
+	help
+	  Select this option if you want to enable your system kernel to
+	  handle system-calls from ELF binaries for 31 bit ESA.  This option
+	  (and some other stuff like libraries and such) is needed for
+	  executing 31 bit applications.  It is safe to say "Y".
+
+config COMPAT
+	bool
+	depends on S390_SUPPORT
+	default y
+
+config BINFMT_ELF32
+	tristate "Kernel support for 31 bit ELF binaries"
+	depends on S390_SUPPORT
+	help
+	  This allows you to run 32-bit Linux/ELF binaries on your zSeries
+	  in 64 bit mode. Everybody wants this; say Y.
 
 comment "I/O subsystem configuration"
 
 config MACHCHK_WARNING
 	bool "Process warning machine checks"
 	help
-	  Select this option if you want the machine check handler on IBM S/390 or 
+	  Select this option if you want the machine check handler on IBM S/390 or
 	  zSeries to process warning machine checks (e.g. on power failures). 
 	  If unsure, say "Y".
 
@@ -144,14 +175,14 @@
 	prompt "IPL method generated into head.S"
 	depends on IPL
 	default IPL_TAPE
-
-config IPL_TAPE
-	bool "tape"
 	help
 	  Select "tape" if you want to IPL the image from a Tape.
 
 	  Select "vm_reader" if you are running under VM/ESA and want
 	  to IPL the image from the emulated card reader.
+
+config IPL_TAPE
+	bool "tape"
 
 config IPL_VM
 	bool "vm_reader"
diff -Nru a/arch/s390/Makefile b/arch/s390/Makefile
--- a/arch/s390/Makefile	Sat Apr 19 19:51:28 2003
+++ b/arch/s390/Makefile	Sat Apr 19 19:51:28 2003
@@ -13,14 +13,28 @@
 # Copyright (C) 1994 by Linus Torvalds
 #
 
+ifdef CONFIG_ARCH_S390_31
 LDFLAGS		:= -m elf_s390
-OBJCOPYFLAGS	:= -O binary
-LDFLAGS_vmlinux := -e start
 LDFLAGS_BLOB	:= --format binary --oformat elf32-s390
+CFLAGS		+= -m31
+UTS_MACHINE	:= s390
+endif
+
+ifdef CONFIG_ARCH_S390X
+LDFLAGS		:= -m elf64_s390
+MODFLAGS	+= -fpic -D__PIC__
+LDFLAGS_BLOB	:= --format binary --oformat elf64-s390
+CFLAGS		+= -m64
+UTS_MACHINE	:= s390x
+endif
 
-CFLAGS += -pipe -fno-strength-reduce -finline-limit=10000 -Wno-sign-compare
+OBJCOPYFLAGS	:= -O binary
+LDFLAGS_vmlinux := -e start
+CFLAGS 		+= -pipe -fno-strength-reduce -finline-limit-10000 -Wno-sign-compare 
 
-head-y := arch/$(ARCH)/kernel/head.o arch/$(ARCH)/kernel/init_task.o
+head-$(CONFIG_ARCH_S390_31)	+= arch/$(ARCH)/kernel/head.o
+head-$(CONFIG_ARCH_S390X)	+= arch/$(ARCH)/kernel/head64.o
+head-y				+= arch/$(ARCH)/kernel/init_task.o
 
 core-y		+= arch/$(ARCH)/mm/ arch/$(ARCH)/kernel/
 libs-y		+= arch/$(ARCH)/lib/
diff -Nru a/arch/s390/boot/Makefile b/arch/s390/boot/Makefile
--- a/arch/s390/boot/Makefile	Sat Apr 19 19:51:51 2003
+++ b/arch/s390/boot/Makefile	Sat Apr 19 19:51:51 2003
@@ -2,18 +2,17 @@
 # Makefile for the linux s390-specific parts of the memory manager.
 #
 
-targets		:= image listing
-EXTRA_AFLAGS	:= -traditional
-quiet_cmd_listing = OBJDUMP $@
-      cmd_listing = $(OBJDUMP) --disassemble --disassemble-all \
-			       --disassemble-zeroes --reloc vmlinux > $@
+COMPILE_VERSION := __linux_compile_version_id__`hostname |  \
+			tr -c '[0-9A-Za-z]' '_'`__`date | \
+			tr -c '[0-9A-Za-z]' '_'`_t
 
-$(obj)/image: vmlinux FORCE
-	$(call if_changed,objcopy)
+EXTRA_CFLAGS  := -DCOMPILE_VERSION=$(COMPILE_VERSION) -gstabs -I .
+EXTRA_AFLAGS  := -traditional
 
-$(obj)/listing: vmlinux FORCE
-	$(call if_changed,listing)
+targets := image
 
+$(obj)/image: vmlinux FORCE
+	$(call if_changed,objcopy)
 
 install: $(CONFIGURE) $(obj)/image
 	sh -x $(obj)/install.sh $(KERNELRELEASE) $(obj)/image \
diff -Nru a/arch/s390/defconfig b/arch/s390/defconfig
--- a/arch/s390/defconfig	Sat Apr 19 19:51:50 2003
+++ b/arch/s390/defconfig	Sat Apr 19 19:51:50 2003
@@ -2,10 +2,9 @@
 # Automatically generated make config: don't edit
 #
 CONFIG_MMU=y
-CONFIG_SWAP=y
-CONFIG_UID16=y
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 CONFIG_ARCH_S390=y
+CONFIG_UID16=y
 
 #
 # Code maturity level options
@@ -15,6 +14,7 @@
 #
 # General setup
 #
+CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 # CONFIG_BSD_PROCESS_ACCT is not set
 CONFIG_SYSCTL=y
@@ -36,9 +36,11 @@
 #
 # Processor type and features
 #
+# CONFIG_ARCH_S390X is not set
+CONFIG_ARCH_S390_31=y
 CONFIG_SMP=y
-CONFIG_MATHEMU=y
 CONFIG_NR_CPUS=32
+CONFIG_MATHEMU=y
 
 #
 # I/O subsystem configuration
@@ -141,7 +143,6 @@
 # CONFIG_PACKET_MMAP is not set
 # CONFIG_NETLINK_DEV is not set
 # CONFIG_NETFILTER is not set
-# CONFIG_FILTER is not set
 CONFIG_UNIX=y
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
@@ -156,8 +157,12 @@
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
-# CONFIG_XFRM_USER is not set
+# CONFIG_INET_IPCOMP is not set
 CONFIG_IPV6=m
+# CONFIG_IPV6_PRIVACY is not set
+# CONFIG_INET6_AH is not set
+# CONFIG_INET6_ESP is not set
+# CONFIG_XFRM_USER is not set
 
 #
 # SCTP Configuration (EXPERIMENTAL)
@@ -252,48 +257,63 @@
 #
 # File systems
 #
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# 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
-# CONFIG_REISERFS_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS 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_TMPFS is not set
+CONFIG_RAMFS=y
+
+#
+# Miscellaneous filesystems
+#
 # CONFIG_ADFS_FS is not set
 # CONFIG_AFFS_FS is not set
 # CONFIG_HFS_FS is not set
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
-CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL 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 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
@@ -301,16 +321,17 @@
 CONFIG_NFSD_V3=y
 # CONFIG_NFSD_V4 is not set
 # CONFIG_NFSD_TCP is not set
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_EXPORTFS=y
-# CONFIG_CIFS is not set
+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
-CONFIG_FS_MBCACHE=y
 
 #
 # Partition Types
@@ -324,6 +345,7 @@
 # CONFIG_MAC_PARTITION is not set
 # CONFIG_MSDOS_PARTITION 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
@@ -359,6 +381,7 @@
 # CONFIG_CRYPTO_TWOFISH is not set
 # CONFIG_CRYPTO_SERPENT is not set
 # CONFIG_CRYPTO_AES is not set
+# CONFIG_CRYPTO_DEFLATE is not set
 # CONFIG_CRYPTO_TEST is not set
 
 #
diff -Nru a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile
--- a/arch/s390/kernel/Makefile	Sat Apr 19 19:51:50 2003
+++ b/arch/s390/kernel/Makefile	Sat Apr 19 19:51:50 2003
@@ -2,17 +2,33 @@
 # Makefile for the linux kernel.
 #
 
-extra-y		:= head.o init_task.o
 EXTRA_AFLAGS	:= -traditional
 
-obj-y	:= entry.o bitmap.o traps.o time.o process.o \
+obj-y	:=  bitmap.o traps.o time.o process.o \
             setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
-            semaphore.o reipl.o s390_ext.o debug.o
+            semaphore.o s390_ext.o debug.o
+
+extra-$(CONFIG_ARCH_S390_31)	+= head.o 
+extra-$(CONFIG_ARCH_S390X)	+= head64.o 
+extra-y				+= init_task.o
 
 obj-$(CONFIG_MODULES)		+= s390_ksyms.o module.o
 obj-$(CONFIG_SMP)		+= smp.o
 
+obj-$(CONFIG_S390_SUPPORT)	+= compat_linux.o compat_signal.o \
+					compat_ioctl.o compat_wrapper.o \
+					compat_exec.o compat_exec_domain.o
+obj-$(CONFIG_BINFMT_ELF32)	+= binfmt_elf32.o
+
+obj-$(CONFIG_ARCH_S390_31)	+= entry.o reipl.o
+obj-$(CONFIG_ARCH_S390X)	+= entry64.o reipl64.o
+
+ifdef CONFIG_ARCH_S390X
+$(obj)%.o: $(patsubst arch/s390/%,arch/s390x/%,$(src))%.c
+	$(call if_changed_dep,cc_o_c)
+endif
+
 #
-# Kernel debugging
+# This is just to get the dependencies...
 #
-obj-$(CONFIG_REMOTE_DEBUG)	+= gdb-stub.o #gdb-low.o 
+binfmt_elf32.o:	$(TOPDIR)/fs/binfmt_elf.c
diff -Nru a/arch/s390/kernel/binfmt_elf32.c b/arch/s390/kernel/binfmt_elf32.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/binfmt_elf32.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,214 @@
+/*
+ * Support for 32-bit Linux for S390 ELF binaries.
+ *
+ * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ * Author(s): Gerhard Tonn (ton@de.ibm.com)
+ *
+ * Heavily inspired by the 32-bit Sparc compat code which is
+ * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (davem@redhat.com)
+ * Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek   (jj@ultra.linux.cz)
+ */
+
+#define __ASMS390_ELF_H
+
+#include <linux/time.h>
+
+/*
+ * These are used to set parameters in the core dumps.
+ */
+#define ELF_CLASS	ELFCLASS32
+#define ELF_DATA	ELFDATA2MSB
+#define ELF_ARCH	EM_S390
+
+/*
+ * This is used to ensure we don't load something for the wrong architecture.
+ */
+#define elf_check_arch(x) \
+	(((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \
+         && (x)->e_ident[EI_CLASS] == ELF_CLASS)
+
+/* ELF register definitions */
+#define NUM_GPRS      16
+#define NUM_FPRS      16
+#define NUM_ACRS      16    
+
+#define TASK31_SIZE		(0x80000000UL)
+
+/* For SVR4/S390 the function pointer to be registered with `atexit` is
+   passed in R14. */
+#define ELF_PLAT_INIT(_r, load_addr) \
+	do { \
+	_r->gprs[14] = 0; \
+	set_thread_flag(TIF_31BIT); \
+	} while(0)
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE       4096
+
+/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
+   use of this is to invoke "./ld.so someprog" to test out a new version of
+   the loader.  We need to make sure that it is out of the way of the program
+   that it will "exec", and that there is sufficient room for the brk.  */
+
+#define ELF_ET_DYN_BASE         (TASK31_SIZE / 3 * 2)
+
+/* Wow, the "main" arch needs arch dependent functions too.. :) */
+
+/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is
+   now struct_user_regs, they are different) */
+
+#define ELF_CORE_COPY_REGS(pr_reg, regs)        \
+	{ \
+	int i; \
+	memcpy(&pr_reg.psw.mask, &regs->psw.mask, 4); \
+	memcpy(&pr_reg.psw.addr, ((char*)&regs->psw.addr)+4, 4); \
+	for(i=0; i<NUM_GPRS; i++) \
+		pr_reg.gprs[i] = regs->gprs[i]; \
+	for(i=0; i<NUM_ACRS; i++) \
+		pr_reg.acrs[i] = regs->acrs[i]; \
+	pr_reg.orig_gpr2 = regs->orig_gpr2; \
+	}
+
+
+
+/* This yields a mask that user programs can use to figure out what
+   instruction set this CPU supports. */
+
+#define ELF_HWCAP (0)
+
+/* This yields a string that ld.so will use to load implementation
+   specific libraries for optimization.  This is more specific in
+   intent than poking at uname or /proc/cpuinfo.
+
+   For the moment, we have only optimizations for the Intel generations,
+   but that could change... */
+
+#define ELF_PLATFORM (NULL)
+
+#define SET_PERSONALITY(ex, ibcs2)			\
+do {							\
+	if (ibcs2)                                      \
+		set_personality(PER_SVR4);              \
+	else if (current->personality != PER_LINUX32)   \
+		set_personality(PER_LINUX);             \
+} while (0)
+
+#include "compat_linux.h"
+
+typedef _s390_fp_regs32 elf_fpregset_t;
+
+typedef struct
+{
+	
+	_psw_t32	psw;
+	__u32		gprs[__NUM_GPRS]; 
+	__u32		acrs[__NUM_ACRS]; 
+	__u32		orig_gpr2;
+} s390_regs32;
+typedef s390_regs32 elf_gregset_t;
+
+#include <asm/processor.h>
+#include <linux/module.h>
+#include <linux/config.h>
+#include <linux/elfcore.h>
+#include <linux/binfmts.h>
+#include <linux/compat.h>
+
+int setup_arg_pages32(struct linux_binprm *bprm);
+
+#define elf_prstatus elf_prstatus32
+struct elf_prstatus32
+{
+	struct elf_siginfo pr_info;	/* Info associated with signal */
+	short	pr_cursig;		/* Current signal */
+	u32	pr_sigpend;	/* Set of pending signals */
+	u32	pr_sighold;	/* Set of held signals */
+	pid_t	pr_pid;
+	pid_t	pr_ppid;
+	pid_t	pr_pgrp;
+	pid_t	pr_sid;
+	struct compat_timeval pr_utime;	/* User time */
+	struct compat_timeval pr_stime;	/* System time */
+	struct compat_timeval pr_cutime;	/* Cumulative user time */
+	struct compat_timeval pr_cstime;	/* Cumulative system time */
+	elf_gregset_t pr_reg;	/* GP registers */
+	int pr_fpvalid;		/* True if math co-processor being used.  */
+};
+
+#define elf_prpsinfo elf_prpsinfo32
+struct elf_prpsinfo32
+{
+	char	pr_state;	/* numeric process state */
+	char	pr_sname;	/* char for pr_state */
+	char	pr_zomb;	/* zombie */
+	char	pr_nice;	/* nice val */
+	u32	pr_flag;	/* flags */
+	u16	pr_uid;
+	u16	pr_gid;
+	pid_t	pr_pid, pr_ppid, pr_pgrp, pr_sid;
+	/* Lots missing */
+	char	pr_fname[16];	/* filename of executable */
+	char	pr_psargs[ELF_PRARGSZ];	/* initial part of arg list */
+};
+
+#include <linux/highuid.h>
+
+#undef NEW_TO_OLD_UID
+#undef NEW_TO_OLD_GID
+#define NEW_TO_OLD_UID(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid)
+#define NEW_TO_OLD_GID(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid) 
+
+#define elf_addr_t	u32
+/*
+#define init_elf_binfmt init_elf32_binfmt
+*/
+#undef CONFIG_BINFMT_ELF
+#ifdef CONFIG_BINFMT_ELF32
+#define CONFIG_BINFMT_ELF CONFIG_BINFMT_ELF32
+#endif
+#undef CONFIG_BINFMT_ELF_MODULE
+#ifdef CONFIG_BINFMT_ELF32_MODULE
+#define CONFIG_BINFMT_ELF_MODULE CONFIG_BINFMT_ELF32_MODULE
+#endif
+
+#undef start_thread
+#define start_thread                    start_thread31 
+#define setup_arg_pages(bprm)           setup_arg_pages32(bprm)
+#define elf_map				elf_map32
+
+MODULE_DESCRIPTION("Binary format loader for compatibility with 32bit Linux for S390 binaries,"
+                   " Copyright 2000 IBM Corporation"); 
+MODULE_AUTHOR("Gerhard Tonn <ton@de.ibm.com>");
+
+#undef MODULE_DESCRIPTION
+#undef MODULE_AUTHOR
+
+#define jiffies_to_timeval jiffies_to_compat_timeval
+static __inline__ void
+jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
+{
+	value->tv_usec = (jiffies % HZ) * (1000000L / HZ);
+	value->tv_sec = jiffies / HZ;
+}
+
+#include "../../../fs/binfmt_elf.c"
+
+static unsigned long
+elf_map32 (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type)
+{
+	unsigned long map_addr;
+
+	if (!addr) 
+		addr = 0x40000000; 
+
+	if (prot & PROT_READ) 
+		prot |= PROT_EXEC; 
+
+	down_write(&current->mm->mmap_sem);
+	map_addr = do_mmap(filep, ELF_PAGESTART(addr),
+			   eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr),
+			   prot, type,
+			   eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr));
+	up_write(&current->mm->mmap_sem);
+	return(map_addr);
+}
diff -Nru a/arch/s390/kernel/compat_exec.c b/arch/s390/kernel/compat_exec.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_exec.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,93 @@
+/*
+ * Support for 32-bit Linux for S390 ELF binaries.
+ *
+ * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ * Author(s): Gerhard Tonn (ton@de.ibm.com)
+ *
+ * Separated from binfmt_elf32.c to reduce exports for module enablement.
+ *
+ */
+
+#include <linux/config.h>
+#include <linux/slab.h>
+#include <linux/file.h>
+#include <linux/mman.h>
+#include <linux/a.out.h>
+#include <linux/stat.h>
+#include <linux/fcntl.h>
+#include <linux/smp_lock.h>
+#include <linux/init.h>
+#include <linux/pagemap.h>
+#include <linux/highmem.h>
+#include <linux/spinlock.h>
+#include <linux/binfmts.h>
+#include <linux/module.h>
+
+#include <asm/uaccess.h>
+#include <asm/pgalloc.h>
+#include <asm/mmu_context.h>
+
+#ifdef CONFIG_KMOD
+#include <linux/kmod.h>
+#endif
+
+
+extern void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long address);
+
+#undef STACK_TOP
+#define STACK_TOP TASK31_SIZE
+
+int setup_arg_pages32(struct linux_binprm *bprm)
+{
+	unsigned long stack_base;
+	struct vm_area_struct *mpnt;
+	struct mm_struct *mm = current->mm;
+	int i;
+
+	stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
+	mm->arg_start = bprm->p + stack_base;
+
+	bprm->p += stack_base;
+	if (bprm->loader)
+		bprm->loader += stack_base;
+	bprm->exec += stack_base;
+
+	mpnt = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
+	if (!mpnt) 
+		return -ENOMEM; 
+	
+	if (!vm_enough_memory((STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p))>>PAGE_SHIFT)) {
+		kmem_cache_free(vm_area_cachep, mpnt);
+		return -ENOMEM;
+	}
+
+	down_write(&mm->mmap_sem);
+	{
+		mpnt->vm_mm = mm;
+		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
+		mpnt->vm_end = STACK_TOP;
+		mpnt->vm_page_prot = PAGE_COPY;
+		mpnt->vm_flags = VM_STACK_FLAGS;
+		mpnt->vm_ops = NULL;
+		mpnt->vm_pgoff = 0;
+		mpnt->vm_file = NULL;
+		INIT_LIST_HEAD(&mpnt->shared);
+		mpnt->vm_private_data = (void *) 0;
+		insert_vm_struct(mm, mpnt);
+		mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
+	} 
+
+	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
+		struct page *page = bprm->page[i];
+		if (page) {
+			bprm->page[i] = NULL;
+			put_dirty_page(current,page,stack_base);
+		}
+		stack_base += PAGE_SIZE;
+	}
+	up_write(&mm->mmap_sem);
+	
+	return 0;
+}
+
+EXPORT_SYMBOL(setup_arg_pages32);
diff -Nru a/arch/s390/kernel/compat_exec_domain.c b/arch/s390/kernel/compat_exec_domain.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_exec_domain.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,30 @@
+/*
+ * Support for 32-bit Linux for S390 personality.
+ *
+ * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ * Author(s): Gerhard Tonn (ton@de.ibm.com)
+ *
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/personality.h>
+#include <linux/sched.h>
+
+struct exec_domain s390_exec_domain;
+
+static int __init
+s390_init (void)
+{
+	s390_exec_domain.name = "Linux/s390";
+	s390_exec_domain.handler = NULL;
+	s390_exec_domain.pers_low = PER_LINUX32;
+	s390_exec_domain.pers_high = PER_LINUX32;
+	s390_exec_domain.signal_map = default_exec_domain.signal_map;
+	s390_exec_domain.signal_invmap = default_exec_domain.signal_invmap;
+	register_exec_domain(&s390_exec_domain);
+	return 0;
+}
+
+__initcall(s390_init);
diff -Nru a/arch/s390/kernel/compat_ioctl.c b/arch/s390/kernel/compat_ioctl.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_ioctl.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,1084 @@
+/*
+ * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
+ *
+ *  S390 version
+ *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Gerhard Tonn (ton@de.ibm.com)
+ *
+ * Heavily inspired by the 32-bit Sparc compat code which is  
+ * Copyright (C) 2000 Silicon Graphics, Inc.
+ * Written by Ulf Carlsson (ulfc@engr.sgi.com) 
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/compat.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/file.h>
+#include <linux/vt.h>
+#include <linux/kd.h>
+#include <linux/netdevice.h>
+#include <linux/route.h>
+#include <linux/ext2_fs.h>
+#include <linux/hdreg.h>
+#include <linux/if_bonding.h>
+#include <linux/blkpg.h>
+#include <linux/blk.h>
+#include <linux/dm-ioctl.h>
+#include <linux/loop.h>
+#include <linux/elevator.h>
+#include <asm/types.h>
+#include <asm/uaccess.h>
+#include <asm/dasd.h>
+#include <asm/tape390.h>
+#include <asm/sockios.h>
+#include <asm/ioctls.h>
+
+#include "compat_linux.h"
+
+long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
+
+struct hd_geometry32 {
+	unsigned char	heads;
+	unsigned char	sectors;
+	unsigned short	cylinders;
+	__u32		start;
+};  
+
+static inline int hd_geometry_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct hd_geometry32 *hg32 = (struct hd_geometry32 *) A(arg);
+	struct hd_geometry hg;
+	int ret;
+	mm_segment_t old_fs = get_fs();
+	
+	set_fs (KERNEL_DS);
+	ret = sys_ioctl (fd, cmd, (long)&hg);
+	set_fs (old_fs);
+
+	if (ret)
+		return ret;
+
+	ret = put_user (hg.heads, &(hg32->heads));
+	ret |= __put_user (hg.sectors, &(hg32->sectors));
+	ret |= __put_user (hg.cylinders, &(hg32->cylinders));
+	ret |= __put_user (hg.start, &(hg32->start));
+
+	return ret;
+}
+
+#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)
+
+struct ifmap32 {
+	unsigned int mem_start;
+	unsigned int 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];
+                __u32	ifru_data;
+        } ifr_ifru;
+};
+
+struct ifconf32 {
+        int     ifc_len;                        /* size of buffer       */
+        __u32	ifcbuf;
+};
+
+static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	struct ireq32 *uir32 = (struct ireq32 *) A(arg);
+	struct net_device *dev;
+	struct ifreq32 ifr32;
+
+	if (copy_from_user(&ifr32, uir32, sizeof(struct ifreq32)))
+		return -EFAULT;
+
+	read_lock(&dev_base_lock);
+	dev = __dev_get_by_index(ifr32.ifr_ifindex);
+	if (!dev) {
+		read_unlock(&dev_base_lock);
+		return -ENODEV;
+	}
+
+	strcpy(ifr32.ifr_name, dev->name);
+	read_unlock(&dev_base_lock);
+
+	if (copy_to_user(uir32, &ifr32, sizeof(struct ifreq32)))
+	    return -EFAULT;
+
+	return 0;
+}
+
+static inline int dev_ifconf(unsigned int fd, unsigned int cmd,
+			     unsigned long arg)
+{
+	struct ioconf32 *uifc32 = (struct ioconf32 *) A(arg);
+	struct ifconf32 ifc32;
+	struct ifconf ifc;
+	struct ifreq32 *ifr32;
+	struct ifreq *ifr;
+	mm_segment_t old_fs;
+	int len;
+	int err;
+
+	if (copy_from_user(&ifc32, uifc32, 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))) *
+			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);
+	len = ifc32.ifc_len / sizeof (struct ifreq32);
+	while (len--) {
+		if (copy_from_user(ifr++, ifr32++, sizeof (struct ifreq32))) {
+			err = -EFAULT;
+			goto out;
+		}
+	}
+
+	old_fs = get_fs();
+	set_fs (KERNEL_DS);
+	err = sys_ioctl (fd, SIOCGIFCONF, (unsigned long)&ifc);	
+	set_fs (old_fs);
+	if (err)
+		goto out;
+
+	ifr = ifc.ifc_req;
+	ifr32 = (struct ifreq32 *) A(ifc32.ifcbuf);
+	len = ifc.ifc_len / sizeof (struct ifreq);
+	ifc32.ifc_len = len * sizeof (struct ifreq32);
+
+	while (len--) {
+		if (copy_to_user(ifr32++, ifr++, sizeof (struct ifreq32))) {
+			err = -EFAULT;
+			goto out;
+		}
+	}
+
+	if (copy_to_user(uifc32, &ifc32, sizeof(struct ifconf32))) {
+		err = -EFAULT;
+		goto out;
+	}
+out:
+	if(ifc.ifc_buf != NULL)
+		kfree (ifc.ifc_buf);
+	return err;
+}
+
+static int bond_ioctl(unsigned long fd, unsigned int cmd, unsigned long arg)
+{
+	struct ifreq ifr;
+	mm_segment_t old_fs;
+	int err, len;
+	u32 data;
+	
+	if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
+		return -EFAULT;
+	ifr.ifr_data = (__kernel_caddr_t)get_zeroed_page(GFP_KERNEL);
+	if (!ifr.ifr_data)
+		return -EAGAIN;
+
+	switch (cmd) {
+	case SIOCBONDENSLAVE:
+	case SIOCBONDRELEASE:
+	case SIOCBONDSETHWADDR:
+	case SIOCBONDCHANGEACTIVE:
+		len = IFNAMSIZ * sizeof(char);
+		break;
+	case SIOCBONDSLAVEINFOQUERY:
+		len = sizeof(struct ifslave);
+		break;
+	case SIOCBONDINFOQUERY:
+		len = sizeof(struct ifbond);
+		break;
+	default:
+		err = -EINVAL;
+		goto out;
+	};
+
+	__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
+	if (copy_from_user(ifr.ifr_data, (char *)A(data), len)) {
+		err = -EFAULT;
+		goto out;
+	}
+
+	old_fs = get_fs();
+	set_fs (KERNEL_DS);
+	err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
+	set_fs (old_fs);
+	if (!err) {
+		len = copy_to_user((char *)A(data), ifr.ifr_data, len);
+		if (len)
+			err = -EFAULT;
+	}
+
+out:
+	free_page((unsigned long)ifr.ifr_data);
+	return err;
+}
+
+static inline int dev_ifsioc(unsigned int fd, unsigned int cmd,
+			     unsigned long arg)
+{
+	struct ifreq32 *uifr = (struct ifreq32 *) A(arg);
+	struct ifreq ifr;
+	mm_segment_t old_fs;
+	int err;
+	
+	switch (cmd) {
+	case SIOCSIFMAP:
+		err = copy_from_user(&ifr, uifr, sizeof(ifr.ifr_name));
+		err |= __get_user(ifr.ifr_map.mem_start, &(uifr->ifr_ifru.ifru_map.mem_start));
+		err |= __get_user(ifr.ifr_map.mem_end, &(uifr->ifr_ifru.ifru_map.mem_end));
+		err |= __get_user(ifr.ifr_map.base_addr, &(uifr->ifr_ifru.ifru_map.base_addr));
+		err |= __get_user(ifr.ifr_map.irq, &(uifr->ifr_ifru.ifru_map.irq));
+		err |= __get_user(ifr.ifr_map.dma, &(uifr->ifr_ifru.ifru_map.dma));
+		err |= __get_user(ifr.ifr_map.port, &(uifr->ifr_ifru.ifru_map.port));
+		if (err)
+			return -EFAULT;
+		break;
+	default:
+		if (copy_from_user(&ifr, uifr, 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(uifr, &ifr, sizeof(struct ifreq32)))
+				return -EFAULT;
+			break;
+		case SIOCGIFMAP:
+			err = copy_to_user(uifr, &ifr, sizeof(ifr.ifr_name));
+			err |= __put_user(ifr.ifr_map.mem_start, &(uifr->ifr_ifru.ifru_map.mem_start));
+			err |= __put_user(ifr.ifr_map.mem_end, &(uifr->ifr_ifru.ifru_map.mem_end));
+			err |= __put_user(ifr.ifr_map.base_addr, &(uifr->ifr_ifru.ifru_map.base_addr));
+			err |= __put_user(ifr.ifr_map.irq, &(uifr->ifr_ifru.ifru_map.irq));
+			err |= __put_user(ifr.ifr_map.dma, &(uifr->ifr_ifru.ifru_map.dma));
+			err |= __put_user(ifr.ifr_map.port, &(uifr->ifr_ifru.ifru_map.port));
+			if (err)
+				err = -EFAULT;
+			break;
+		}
+	}
+	return err;
+}
+
+struct rtentry32
+{
+	unsigned int	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;
+	unsigned int	rt_pad3;
+	unsigned int	rt_pad4;
+	short		rt_metric;	/* +1 for binary compatibility!	*/
+	unsigned int	rt_dev;		/* forcing the device at add	*/
+	unsigned int	rt_mtu;		/* per route MTU/Window 	*/
+#ifndef __KERNEL__
+#define rt_mss	rt_mtu			/* Compatibility :-(            */
+#endif
+	unsigned int	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 rtentry32 *ur = (struct rtentry32 *) A(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, &(ur->rt_dst), 3 * sizeof(struct sockaddr));
+	ret |= __get_user (r.rt_flags, &(ur->rt_flags));
+	ret |= __get_user (r.rt_metric, &(ur->rt_metric));
+	ret |= __get_user (r.rt_mtu, &(ur->rt_mtu));
+	ret |= __get_user (r.rt_window, &(ur->rt_window));
+	ret |= __get_user (r.rt_irtt, &(ur->rt_irtt));
+	ret |= __get_user (rtdev, &(ur->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;
+}
+
+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);
+}
+
+
+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("%s: Unknown loop ioctl cmd, fd(%d) "
+			       "cmd(%08x) arg(%08lx)\n",
+			       __FUNCTION__, fd, cmd, arg);
+	}
+	}
+	return err;
+}
+
+
+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;
+}
+
+
+typedef struct ica_z90_status_t {
+  int totalcount;
+  int leedslitecount;
+  int leeds2count;
+  int requestqWaitCount;
+  int pendingqWaitCount;
+  int totalOpenCount;
+  int cryptoDomain;
+  unsigned char status[64];
+  unsigned char qdepth[64];
+} ica_z90_status;
+
+typedef struct _ica_rsa_modexpo {
+  char         *inputdata;
+  unsigned int  inputdatalength;
+  char         *outputdata;
+  unsigned int  outputdatalength;
+  char         *b_key;
+  char         *n_modulus;
+} ica_rsa_modexpo_t;
+
+typedef struct _ica_rsa_modexpo_32 {
+  u32          inputdata;
+  u32          inputdatalength;
+  u32          outputdata;
+  u32          outputdatalength;
+  u32          b_key;
+  u32          n_modulus;
+} ica_rsa_modexpo_32_t;
+
+typedef struct _ica_rsa_modexpo_crt {
+  char         *inputdata;
+  unsigned int  inputdatalength;
+  char         *outputdata;
+  unsigned int  outputdatalength;
+  char         *bp_key;
+  char         *bq_key;
+  char         *np_prime;
+  char         *nq_prime;
+  char         *u_mult_inv;
+} ica_rsa_modexpo_crt_t;
+
+typedef struct _ica_rsa_modexpo_crt_32 {
+  u32          inputdata;
+  u32          inputdatalength;
+  u32          outputdata;
+  u32          outputdatalength;
+  u32          bp_key;
+  u32          bq_key;
+  u32          np_prime;
+  u32          nq_prime;
+  u32          u_mult_inv;
+} ica_rsa_modexpo_crt_32_t;
+
+#define ICA_IOCTL_MAGIC 'z'
+#define ICARSAMODEXPO   _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x05, 0)
+#define ICARSACRT       _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x06, 0) 
+#define ICARSAMODMULT   _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x07, 0)
+#define ICAZ90STATUS    _IOC(_IOC_READ, ICA_IOCTL_MAGIC, 0x10, sizeof(ica_z90_status))
+#define ICAZ90QUIESCE   _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x11, 0)
+#define ICAZ90HARDRESET _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x12, 0)
+#define ICAZ90HARDERROR _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x13, 0)
+
+static int do_rsa_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	mm_segment_t old_fs = get_fs();
+	int err = 0;
+	ica_rsa_modexpo_t rsa;
+	ica_rsa_modexpo_32_t *rsa32 = (ica_rsa_modexpo_32_t *)arg;
+	u32 inputdata, outputdata, b_key, n_modulus;
+
+	memset (&rsa, 0, sizeof(rsa));
+
+	err |= __get_user (inputdata, &rsa32->inputdata);
+	err |= __get_user (rsa.inputdatalength, &rsa32->inputdatalength);
+	err |= __get_user (outputdata, &rsa32->outputdata);
+	err |= __get_user (rsa.outputdatalength, &rsa32->outputdatalength);
+	err |= __get_user (b_key, &rsa32->b_key);
+	err |= __get_user (n_modulus, &rsa32->n_modulus);
+	if (err)
+		return -EFAULT;
+
+	rsa.inputdata = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
+	if (!rsa.inputdata) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.inputdata, (char *)(u64)(inputdata & 0x7fffffff), 
+			   rsa.inputdatalength)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	rsa.outputdata = (char *)kmalloc(rsa.outputdatalength, GFP_KERNEL);
+	if (!rsa.outputdata) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+
+	rsa.b_key = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
+	if (!rsa.b_key) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.b_key, (char *)(u64)(b_key & 0x7fffffff), 
+			   rsa.inputdatalength)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	rsa.n_modulus = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
+	if (!rsa.n_modulus) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.n_modulus, (char *)(u64)(n_modulus & 0x7fffffff), 
+			   rsa.inputdatalength)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	set_fs(KERNEL_DS);
+	err = sys_ioctl(fd, cmd, (unsigned long)&rsa);
+	set_fs(old_fs);
+	if (err < 0)
+		goto cleanup;
+
+	if (copy_to_user((char *)(u64)(outputdata & 0x7fffffff), rsa.outputdata,
+			 rsa.outputdatalength))
+		err = -EFAULT;
+
+cleanup:
+	if (rsa.inputdata)
+		kfree(rsa.inputdata);
+	if (rsa.outputdata)
+		kfree(rsa.outputdata);
+	if (rsa.b_key)
+		kfree(rsa.b_key);
+	if (rsa.n_modulus)
+		kfree(rsa.n_modulus);
+	
+	return err;
+}
+
+static int do_rsa_crt_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	mm_segment_t old_fs = get_fs();
+	int err = 0;
+	ica_rsa_modexpo_crt_t rsa;
+	ica_rsa_modexpo_crt_32_t *rsa32 = (ica_rsa_modexpo_crt_32_t *)arg;
+	u32 inputdata, outputdata, bp_key, bq_key, np_prime, nq_prime, u_mult_inv;
+
+	memset (&rsa, 0, sizeof(rsa));
+
+	err |= __get_user (inputdata, &rsa32->inputdata);
+	err |= __get_user (rsa.inputdatalength, &rsa32->inputdatalength);
+	err |= __get_user (outputdata, &rsa32->outputdata);
+	err |= __get_user (rsa.outputdatalength, &rsa32->outputdatalength);
+	err |= __get_user (bp_key, &rsa32->bp_key);
+	err |= __get_user (bq_key, &rsa32->bq_key);
+	err |= __get_user (np_prime, &rsa32->np_prime);
+	err |= __get_user (nq_prime, &rsa32->nq_prime);
+	err |= __get_user (u_mult_inv, &rsa32->u_mult_inv);
+	if (err)
+		return -EFAULT;
+
+	rsa.inputdata = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
+	if (!rsa.inputdata) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.inputdata, (char *)(u64)(inputdata & 0x7fffffff), 
+			   rsa.inputdatalength)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	rsa.outputdata = (char *)kmalloc(rsa.outputdatalength, GFP_KERNEL);
+	if (!rsa.outputdata) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+
+	rsa.bp_key = (char *)kmalloc(rsa.inputdatalength/2 + 8, GFP_KERNEL);
+	if (!rsa.bp_key) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.bp_key, (char *)(u64)(bp_key & 0x7fffffff), 
+			   rsa.inputdatalength/2 + 8)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	rsa.bq_key = (char *)kmalloc(rsa.inputdatalength/2, GFP_KERNEL);
+	if (!rsa.bq_key) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.bq_key, (char *)(u64)(bq_key & 0x7fffffff), 
+			   rsa.inputdatalength/2)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	rsa.np_prime = (char *)kmalloc(rsa.inputdatalength/2 + 8, GFP_KERNEL);
+	if (!rsa.np_prime) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.np_prime, (char *)(u64)(np_prime & 0x7fffffff), 
+			   rsa.inputdatalength/2 + 8)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	rsa.nq_prime = (char *)kmalloc(rsa.inputdatalength/2, GFP_KERNEL);
+	if (!rsa.nq_prime) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.nq_prime, (char *)(u64)(nq_prime & 0x7fffffff), 
+			   rsa.inputdatalength/2)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	rsa.u_mult_inv = (char *)kmalloc(rsa.inputdatalength/2 + 8, GFP_KERNEL);
+	if (!rsa.u_mult_inv) {
+		err = -ENOMEM;
+		goto cleanup;
+	}
+	if (copy_from_user(rsa.u_mult_inv, (char *)(u64)(u_mult_inv & 0x7fffffff), 
+			   rsa.inputdatalength/2 + 8)) {
+		err = -EFAULT;
+		goto cleanup;
+	}
+
+	set_fs(KERNEL_DS);
+	err = sys_ioctl(fd, cmd, (unsigned long)&rsa);
+	set_fs(old_fs);
+	if (err < 0)
+		goto cleanup;
+
+	if (copy_to_user((char *)(u64)(outputdata & 0x7fffffff), rsa.outputdata,
+			 rsa.outputdatalength))
+		err = -EFAULT;
+
+cleanup:
+	if (rsa.inputdata)
+		kfree(rsa.inputdata);
+	if (rsa.outputdata)
+		kfree(rsa.outputdata);
+	if (rsa.bp_key)
+		kfree(rsa.bp_key);
+	if (rsa.bq_key)
+		kfree(rsa.bq_key);
+	if (rsa.np_prime)
+		kfree(rsa.np_prime);
+	if (rsa.nq_prime)
+		kfree(rsa.nq_prime);
+	if (rsa.u_mult_inv)
+		kfree(rsa.u_mult_inv);
+	
+	return err;
+}
+
+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((unsigned int) val, (u32 *)arg))
+		return -EFAULT;
+	return err;
+}
+
+struct ioctl32_handler {
+	unsigned int cmd;
+	int (*function)(unsigned int, unsigned int, unsigned long);
+};
+
+struct ioctl32_list {
+	struct ioctl32_handler handler;
+	struct ioctl32_list *next;
+};
+
+#define IOCTL32_DEFAULT(cmd)		{ { cmd, (void *) sys_ioctl }, 0 }
+#define IOCTL32_HANDLER(cmd, handler)	{ { cmd, (void *) handler }, 0 }
+
+static struct ioctl32_list ioctl32_handler_table[] = {
+	IOCTL32_DEFAULT(FIBMAP),
+	IOCTL32_DEFAULT(FIGETBSZ),
+
+	IOCTL32_DEFAULT(DASDAPIVER),
+	IOCTL32_DEFAULT(BIODASDDISABLE),
+	IOCTL32_DEFAULT(BIODASDENABLE),
+	IOCTL32_DEFAULT(BIODASDRSRV),
+	IOCTL32_DEFAULT(BIODASDRLSE),
+	IOCTL32_DEFAULT(BIODASDSLCK),
+	IOCTL32_DEFAULT(BIODASDINFO),
+	IOCTL32_DEFAULT(BIODASDFMT),
+
+	IOCTL32_DEFAULT(TAPE390_DISPLAY),
+
+	IOCTL32_DEFAULT(BLKROSET),
+	IOCTL32_DEFAULT(BLKROGET),
+	IOCTL32_DEFAULT(BLKRRPART),
+	IOCTL32_DEFAULT(BLKFLSBUF),
+	IOCTL32_DEFAULT(BLKRASET),
+	IOCTL32_DEFAULT(BLKFRASET),
+	IOCTL32_DEFAULT(BLKSECTSET),
+	IOCTL32_DEFAULT(BLKSSZGET),
+	IOCTL32_DEFAULT(BLKBSZGET),
+	IOCTL32_DEFAULT(BLKGETSIZE64),
+
+	IOCTL32_HANDLER(HDIO_GETGEO, hd_geometry_ioctl),
+
+	IOCTL32_DEFAULT(TCGETA),
+	IOCTL32_DEFAULT(TCSETA),
+	IOCTL32_DEFAULT(TCSETAW),
+	IOCTL32_DEFAULT(TCSETAF),
+	IOCTL32_DEFAULT(TCSBRK),
+	IOCTL32_DEFAULT(TCSBRKP),
+	IOCTL32_DEFAULT(TCXONC),
+	IOCTL32_DEFAULT(TCFLSH),
+	IOCTL32_DEFAULT(TCGETS),
+	IOCTL32_DEFAULT(TCSETS),
+	IOCTL32_DEFAULT(TCSETSW),
+	IOCTL32_DEFAULT(TCSETSF),
+	IOCTL32_DEFAULT(TIOCLINUX),
+
+	IOCTL32_DEFAULT(TIOCGETD),
+	IOCTL32_DEFAULT(TIOCSETD),
+	IOCTL32_DEFAULT(TIOCEXCL),
+	IOCTL32_DEFAULT(TIOCNXCL),
+	IOCTL32_DEFAULT(TIOCCONS),
+	IOCTL32_DEFAULT(TIOCGSOFTCAR),
+	IOCTL32_DEFAULT(TIOCSSOFTCAR),
+	IOCTL32_DEFAULT(TIOCSWINSZ),
+	IOCTL32_DEFAULT(TIOCGWINSZ),
+	IOCTL32_DEFAULT(TIOCMGET),
+	IOCTL32_DEFAULT(TIOCMBIC),
+	IOCTL32_DEFAULT(TIOCMBIS),
+	IOCTL32_DEFAULT(TIOCMSET),
+	IOCTL32_DEFAULT(TIOCPKT),
+	IOCTL32_DEFAULT(TIOCNOTTY),
+	IOCTL32_DEFAULT(TIOCSTI),
+	IOCTL32_DEFAULT(TIOCOUTQ),
+	IOCTL32_DEFAULT(TIOCSPGRP),
+	IOCTL32_DEFAULT(TIOCGPGRP),
+	IOCTL32_DEFAULT(TIOCSCTTY),
+	IOCTL32_DEFAULT(TIOCGPTN),
+	IOCTL32_DEFAULT(TIOCSPTLCK),
+	IOCTL32_DEFAULT(TIOCGSERIAL),
+	IOCTL32_DEFAULT(TIOCSSERIAL),
+	IOCTL32_DEFAULT(TIOCSERGETLSR),
+
+	IOCTL32_DEFAULT(FIOCLEX),
+	IOCTL32_DEFAULT(FIONCLEX),
+	IOCTL32_DEFAULT(FIOASYNC),
+	IOCTL32_DEFAULT(FIONBIO),
+	IOCTL32_DEFAULT(FIONREAD),
+
+	IOCTL32_DEFAULT(PIO_FONT),
+	IOCTL32_DEFAULT(GIO_FONT),
+	IOCTL32_DEFAULT(KDSIGACCEPT),
+	IOCTL32_DEFAULT(KDGETKEYCODE),
+	IOCTL32_DEFAULT(KDSETKEYCODE),
+	IOCTL32_DEFAULT(KIOCSOUND),
+	IOCTL32_DEFAULT(KDMKTONE),
+	IOCTL32_DEFAULT(KDGKBTYPE),
+	IOCTL32_DEFAULT(KDSETMODE),
+	IOCTL32_DEFAULT(KDGETMODE),
+	IOCTL32_DEFAULT(KDSKBMODE),
+	IOCTL32_DEFAULT(KDGKBMODE),
+	IOCTL32_DEFAULT(KDSKBMETA),
+	IOCTL32_DEFAULT(KDGKBMETA),
+	IOCTL32_DEFAULT(KDGKBENT),
+	IOCTL32_DEFAULT(KDSKBENT),
+	IOCTL32_DEFAULT(KDGKBSENT),
+	IOCTL32_DEFAULT(KDSKBSENT),
+	IOCTL32_DEFAULT(KDGKBDIACR),
+	IOCTL32_DEFAULT(KDSKBDIACR),
+	IOCTL32_DEFAULT(KDGKBLED),
+	IOCTL32_DEFAULT(KDSKBLED),
+	IOCTL32_DEFAULT(KDGETLED),
+	IOCTL32_DEFAULT(KDSETLED),
+	IOCTL32_DEFAULT(GIO_SCRNMAP),
+	IOCTL32_DEFAULT(PIO_SCRNMAP),
+	IOCTL32_DEFAULT(GIO_UNISCRNMAP),
+	IOCTL32_DEFAULT(PIO_UNISCRNMAP),
+	IOCTL32_DEFAULT(PIO_FONTRESET),
+	IOCTL32_DEFAULT(PIO_UNIMAPCLR),
+
+	IOCTL32_DEFAULT(VT_SETMODE),
+	IOCTL32_DEFAULT(VT_GETMODE),
+	IOCTL32_DEFAULT(VT_GETSTATE),
+	IOCTL32_DEFAULT(VT_OPENQRY),
+	IOCTL32_DEFAULT(VT_ACTIVATE),
+	IOCTL32_DEFAULT(VT_WAITACTIVE),
+	IOCTL32_DEFAULT(VT_RELDISP),
+	IOCTL32_DEFAULT(VT_DISALLOCATE),
+	IOCTL32_DEFAULT(VT_RESIZE),
+	IOCTL32_DEFAULT(VT_RESIZEX),
+	IOCTL32_DEFAULT(VT_LOCKSWITCH),
+	IOCTL32_DEFAULT(VT_UNLOCKSWITCH),
+
+	IOCTL32_DEFAULT(SIOCGSTAMP),
+
+	IOCTL32_DEFAULT(DM_VERSION),
+	IOCTL32_DEFAULT(DM_REMOVE_ALL),
+	IOCTL32_DEFAULT(DM_DEV_CREATE),
+	IOCTL32_DEFAULT(DM_DEV_REMOVE),
+	IOCTL32_DEFAULT(DM_DEV_RELOAD),
+	IOCTL32_DEFAULT(DM_DEV_SUSPEND),
+	IOCTL32_DEFAULT(DM_DEV_RENAME),
+	IOCTL32_DEFAULT(DM_DEV_DEPS),
+	IOCTL32_DEFAULT(DM_DEV_STATUS),
+	IOCTL32_DEFAULT(DM_TARGET_STATUS),
+	IOCTL32_DEFAULT(DM_TARGET_WAIT),
+
+	IOCTL32_DEFAULT(LOOP_SET_FD),
+	IOCTL32_DEFAULT(LOOP_CLR_FD),
+
+	IOCTL32_HANDLER(SIOCGIFNAME, dev_ifname32),
+	IOCTL32_HANDLER(SIOCGIFCONF, dev_ifconf),
+	IOCTL32_HANDLER(SIOCGIFFLAGS, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFFLAGS, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFMETRIC, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFMETRIC, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFMTU, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFMTU, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFMEM, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFMEM, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFHWADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFHWADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCADDMULTI, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCDELMULTI, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFINDEX, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFMAP, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFMAP, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFBRDADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFBRDADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFDSTADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFDSTADDR, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFNETMASK, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFNETMASK, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFPFLAGS, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFPFLAGS, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCGIFTXQLEN, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCSIFTXQLEN, dev_ifsioc),
+	IOCTL32_HANDLER(SIOCADDRT, routing_ioctl),
+	IOCTL32_HANDLER(SIOCDELRT, routing_ioctl),
+
+	IOCTL32_HANDLER(SIOCBONDENSLAVE, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDRELEASE, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDSETHWADDR, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDSLAVEINFOQUERY, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDINFOQUERY, bond_ioctl),
+	IOCTL32_HANDLER(SIOCBONDCHANGEACTIVE, bond_ioctl),
+
+	IOCTL32_HANDLER(EXT2_IOC32_GETFLAGS, do_ext2_ioctl),
+	IOCTL32_HANDLER(EXT2_IOC32_SETFLAGS, do_ext2_ioctl),
+	IOCTL32_HANDLER(EXT2_IOC32_GETVERSION, do_ext2_ioctl),
+	IOCTL32_HANDLER(EXT2_IOC32_SETVERSION, do_ext2_ioctl),
+
+	IOCTL32_HANDLER(LOOP_SET_STATUS, loop_status),
+	IOCTL32_HANDLER(LOOP_GET_STATUS, loop_status),
+
+	IOCTL32_HANDLER(ICARSAMODEXPO, do_rsa_ioctl),
+	IOCTL32_HANDLER(ICARSACRT, do_rsa_crt_ioctl),
+	IOCTL32_HANDLER(ICARSAMODMULT, do_rsa_ioctl),
+	IOCTL32_DEFAULT(ICAZ90STATUS),
+	IOCTL32_DEFAULT(ICAZ90QUIESCE),
+	IOCTL32_DEFAULT(ICAZ90HARDRESET),
+	IOCTL32_DEFAULT(ICAZ90HARDERROR),
+
+	IOCTL32_HANDLER(BLKRAGET, w_long),
+	IOCTL32_HANDLER(BLKGETSIZE, w_long),
+	IOCTL32_HANDLER(BLKFRAGET, w_long),
+	IOCTL32_HANDLER(BLKSECTGET, w_long),
+	IOCTL32_HANDLER(BLKPG, blkpg_ioctl_trans)
+
+};
+
+#define NR_IOCTL32_HANDLERS	(sizeof(ioctl32_handler_table) /	\
+				 sizeof(ioctl32_handler_table[0]))
+
+static struct ioctl32_list *ioctl32_hash_table[1024];
+
+static inline int ioctl32_hash(unsigned int cmd)
+{
+	return ((cmd >> 6) ^ (cmd >> 4) ^ cmd) & 0x3ff;
+}
+
+int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+	int (*handler)(unsigned int, unsigned int, unsigned long, struct file * filp);
+	struct file *filp;
+	struct ioctl32_list *l;
+	int error;
+
+	l = ioctl32_hash_table[ioctl32_hash(cmd)];
+
+	error = -EBADF;
+
+	filp = fget(fd);
+	if (!filp)
+		return error;
+
+	if (!filp->f_op || !filp->f_op->ioctl) {
+		error = sys_ioctl (fd, cmd, arg);
+		goto out;
+	}
+
+	while (l && l->handler.cmd != cmd)
+		l = l->next;
+
+	if (l) {
+		handler = (void *)l->handler.function;
+		error = handler(fd, cmd, arg, filp);
+	} else {
+		error = -EINVAL;
+		printk("unknown ioctl: %08x\n", cmd);
+	}
+out:
+	fput(filp);
+	return error;
+}
+
+static void ioctl32_insert(struct ioctl32_list *entry)
+{
+	int hash = ioctl32_hash(entry->handler.cmd);
+
+	entry->next = 0;
+	if (!ioctl32_hash_table[hash])
+		ioctl32_hash_table[hash] = entry;
+	else {
+		struct ioctl32_list *l;
+		l = ioctl32_hash_table[hash];
+		while (l->next)
+			l = l->next;
+		l->next = entry;
+	}
+}
+
+int register_ioctl32_conversion(unsigned int cmd,
+				int (*handler)(unsigned int, unsigned int,
+					       unsigned long, struct file *))
+{
+	struct ioctl32_list *l, *new;
+	int hash;
+
+	hash = ioctl32_hash(cmd);
+	for (l = ioctl32_hash_table[hash]; l != NULL; l = l->next)
+		if (l->handler.cmd == cmd)
+			return -EBUSY;
+	new = kmalloc(sizeof(struct ioctl32_list), GFP_KERNEL);
+	if (new == NULL)
+		return -ENOMEM;
+	new->handler.cmd = cmd;
+	new->handler.function = (void *) handler;
+	ioctl32_insert(new);
+	return 0;
+}
+
+int unregister_ioctl32_conversion(unsigned int cmd)
+{
+	struct ioctl32_list *p, *l;
+	int hash;
+
+	hash = ioctl32_hash(cmd);
+	p = NULL;
+	for (l = ioctl32_hash_table[hash]; l != NULL; l = l->next) {
+		if (l->handler.cmd == cmd)
+			break;
+		p = l;
+	}
+	if (l == NULL)
+		return -ENOENT;
+	if (p == NULL)
+		ioctl32_hash_table[hash] = l->next;
+	else
+		p->next = l->next;
+	kfree(l);
+	return 0;
+}
+
+static int __init init_ioctl32(void)
+{
+	int i;
+	for (i = 0; i < NR_IOCTL32_HANDLERS; i++)
+		ioctl32_insert(&ioctl32_handler_table[i]);
+	return 0;
+}
+
+__initcall(init_ioctl32);
diff -Nru a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_linux.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,2762 @@
+/*
+ *  arch/s390x/kernel/linux32.c
+ *
+ *  S390 version
+ *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
+ *               Gerhard Tonn (ton@de.ibm.com)   
+ *
+ *  Conversion between 31bit and 64bit native syscalls.
+ *
+ * Heavily inspired by the 32-bit Sparc compat code which is 
+ * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
+ * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
+ *
+ */
+
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/fs.h> 
+#include <linux/mm.h> 
+#include <linux/file.h> 
+#include <linux/signal.h>
+#include <linux/resource.h>
+#include <linux/times.h>
+#include <linux/utsname.h>
+#include <linux/timex.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/sem.h>
+#include <linux/msg.h>
+#include <linux/shm.h>
+#include <linux/slab.h>
+#include <linux/uio.h>
+#include <linux/nfs_fs.h>
+#include <linux/smb_fs.h>
+#include <linux/smb_mount.h>
+#include <linux/ncp_fs.h>
+#include <linux/quota.h>
+#include <linux/module.h>
+#include <linux/sunrpc/svc.h>
+#include <linux/nfsd/nfsd.h>
+#include <linux/nfsd/cache.h>
+#include <linux/nfsd/xdr.h>
+#include <linux/nfsd/syscall.h>
+#include <linux/poll.h>
+#include <linux/personality.h>
+#include <linux/stat.h>
+#include <linux/filter.h>
+#include <linux/highmem.h>
+#include <linux/highuid.h>
+#include <linux/mman.h>
+#include <linux/ipv6.h>
+#include <linux/in.h>
+#include <linux/icmpv6.h>
+#include <linux/sysctl.h>
+#include <linux/binfmts.h>
+#include <linux/compat.h>
+#include <linux/vfs.h>
+#include <linux/ptrace.h>
+
+#include <asm/types.h>
+#include <asm/ipc.h>
+#include <asm/uaccess.h>
+#include <asm/semaphore.h>
+
+#include <net/scm.h>
+#include <net/sock.h>
+
+#include "compat_linux.h"
+
+extern asmlinkage long sys_chown(const char *, uid_t,gid_t);
+extern asmlinkage long sys_lchown(const char *, uid_t,gid_t);
+extern asmlinkage long sys_fchown(unsigned int, uid_t,gid_t);
+extern asmlinkage long sys_setregid(gid_t, gid_t);
+extern asmlinkage long sys_setgid(gid_t);
+extern asmlinkage long sys_setreuid(uid_t, uid_t);
+extern asmlinkage long sys_setuid(uid_t);
+extern asmlinkage long sys_setresuid(uid_t, uid_t, uid_t);
+extern asmlinkage long sys_setresgid(gid_t, gid_t, gid_t);
+extern asmlinkage long sys_setfsuid(uid_t);
+extern asmlinkage long sys_setfsgid(gid_t);
+ 
+/* For this source file, we want overflow handling. */
+
+#undef high2lowuid
+#undef high2lowgid
+#undef low2highuid
+#undef low2highgid
+#undef SET_UID16
+#undef SET_GID16
+#undef NEW_TO_OLD_UID
+#undef NEW_TO_OLD_GID
+#undef SET_OLDSTAT_UID
+#undef SET_OLDSTAT_GID
+#undef SET_STAT_UID
+#undef SET_STAT_GID
+
+#define high2lowuid(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid)
+#define high2lowgid(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid)
+#define low2highuid(uid) ((uid) == (u16)-1) ? (uid_t)-1 : (uid_t)(uid)
+#define low2highgid(gid) ((gid) == (u16)-1) ? (gid_t)-1 : (gid_t)(gid)
+#define SET_UID16(var, uid)	var = high2lowuid(uid)
+#define SET_GID16(var, gid)	var = high2lowgid(gid)
+#define NEW_TO_OLD_UID(uid)	high2lowuid(uid)
+#define NEW_TO_OLD_GID(gid)	high2lowgid(gid)
+#define SET_OLDSTAT_UID(stat, uid)	(stat).st_uid = high2lowuid(uid)
+#define SET_OLDSTAT_GID(stat, gid)	(stat).st_gid = high2lowgid(gid)
+#define SET_STAT_UID(stat, uid)		(stat).st_uid = high2lowuid(uid)
+#define SET_STAT_GID(stat, gid)		(stat).st_gid = high2lowgid(gid)
+
+asmlinkage long sys32_chown16(const char * filename, u16 user, u16 group)
+{
+	return sys_chown(filename, low2highuid(user), low2highgid(group));
+}
+
+asmlinkage long sys32_lchown16(const char * filename, u16 user, u16 group)
+{
+	return sys_lchown(filename, low2highuid(user), low2highgid(group));
+}
+
+asmlinkage long sys32_fchown16(unsigned int fd, u16 user, u16 group)
+{
+	return sys_fchown(fd, low2highuid(user), low2highgid(group));
+}
+
+asmlinkage long sys32_setregid16(u16 rgid, u16 egid)
+{
+	return sys_setregid(low2highgid(rgid), low2highgid(egid));
+}
+
+asmlinkage long sys32_setgid16(u16 gid)
+{
+	return sys_setgid((gid_t)gid);
+}
+
+asmlinkage long sys32_setreuid16(u16 ruid, u16 euid)
+{
+	return sys_setreuid(low2highuid(ruid), low2highuid(euid));
+}
+
+asmlinkage long sys32_setuid16(u16 uid)
+{
+	return sys_setuid((uid_t)uid);
+}
+
+asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid)
+{
+	return sys_setresuid(low2highuid(ruid), low2highuid(euid),
+		low2highuid(suid));
+}
+
+asmlinkage long sys32_getresuid16(u16 *ruid, u16 *euid, u16 *suid)
+{
+	int retval;
+
+	if (!(retval = put_user(high2lowuid(current->uid), ruid)) &&
+	    !(retval = put_user(high2lowuid(current->euid), euid)))
+		retval = put_user(high2lowuid(current->suid), suid);
+
+	return retval;
+}
+
+asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid)
+{
+	return sys_setresgid(low2highgid(rgid), low2highgid(egid),
+		low2highgid(sgid));
+}
+
+asmlinkage long sys32_getresgid16(u16 *rgid, u16 *egid, u16 *sgid)
+{
+	int retval;
+
+	if (!(retval = put_user(high2lowgid(current->gid), rgid)) &&
+	    !(retval = put_user(high2lowgid(current->egid), egid)))
+		retval = put_user(high2lowgid(current->sgid), sgid);
+
+	return retval;
+}
+
+asmlinkage long sys32_setfsuid16(u16 uid)
+{
+	return sys_setfsuid((uid_t)uid);
+}
+
+asmlinkage long sys32_setfsgid16(u16 gid)
+{
+	return sys_setfsgid((gid_t)gid);
+}
+
+asmlinkage long sys32_getgroups16(int gidsetsize, u16 *grouplist)
+{
+	u16 groups[NGROUPS];
+	int i,j;
+
+	if (gidsetsize < 0)
+		return -EINVAL;
+	i = current->ngroups;
+	if (gidsetsize) {
+		if (i > gidsetsize)
+			return -EINVAL;
+		for(j=0;j<i;j++)
+			groups[j] = current->groups[j];
+		if (copy_to_user(grouplist, groups, sizeof(u16)*i))
+			return -EFAULT;
+	}
+	return i;
+}
+
+asmlinkage long sys32_setgroups16(int gidsetsize, u16 *grouplist)
+{
+	u16 groups[NGROUPS];
+	int i;
+
+	if (!capable(CAP_SETGID))
+		return -EPERM;
+	if ((unsigned) gidsetsize > NGROUPS)
+		return -EINVAL;
+	if (copy_from_user(groups, grouplist, gidsetsize * sizeof(u16)))
+		return -EFAULT;
+	for (i = 0 ; i < gidsetsize ; i++)
+		current->groups[i] = (gid_t)groups[i];
+	current->ngroups = gidsetsize;
+	return 0;
+}
+
+asmlinkage long sys32_getuid16(void)
+{
+	return high2lowuid(current->uid);
+}
+
+asmlinkage long sys32_geteuid16(void)
+{
+	return high2lowuid(current->euid);
+}
+
+asmlinkage long sys32_getgid16(void)
+{
+	return high2lowgid(current->gid);
+}
+
+asmlinkage long sys32_getegid16(void)
+{
+	return high2lowgid(current->egid);
+}
+
+/* 32-bit timeval and related flotsam.  */
+
+static inline long get_tv32(struct timeval *o, struct compat_timeval *i)
+{
+	return (!access_ok(VERIFY_READ, tv32, sizeof(*tv32)) ||
+		(__get_user(o->tv_sec, &i->tv_sec) |
+		 __get_user(o->tv_usec, &i->tv_usec)));
+}
+
+static inline long put_tv32(struct compat_timeval *o, struct timeval *i)
+{
+	return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
+		(__put_user(i->tv_sec, &o->tv_sec) |
+		 __put_user(i->tv_usec, &o->tv_usec)));
+}
+
+struct msgbuf32 { s32 mtype; char mtext[1]; };
+
+struct ipc64_perm_ds32
+{
+        __kernel_key_t          key;
+        __kernel_uid32_t        uid;
+        __kernel_gid32_t        gid;
+        __kernel_uid32_t        cuid;
+        __kernel_gid32_t        cgid;
+        compat_mode_t       mode;
+        unsigned short          __pad1;
+        unsigned short          seq;
+        unsigned short          __pad2;
+        unsigned int            __unused1;
+        unsigned int            __unused2;
+};
+
+struct ipc_perm32
+{
+	key_t    	  key;
+        compat_uid_t  uid;
+        compat_gid_t  gid;
+        compat_uid_t  cuid;
+        compat_gid_t  cgid;
+        compat_mode_t mode;
+        unsigned short  seq;
+};
+
+struct semid_ds32 {
+        struct ipc_perm32 sem_perm;               /* permissions .. see ipc.h */
+        compat_time_t   sem_otime;              /* last semop time */
+        compat_time_t   sem_ctime;              /* last change time */
+        u32 sem_base;              /* ptr to first semaphore in array */
+        u32 sem_pending;          /* pending operations to be processed */
+        u32 sem_pending_last;    /* last pending operation */
+        u32 undo;                  /* undo requests on this array */
+        unsigned short  sem_nsems;              /* no. of semaphores in array */
+};
+
+struct semid64_ds32 {
+	struct ipc64_perm_ds32 sem_perm;
+	unsigned int	  __pad1;
+	compat_time_t   sem_otime;
+	unsigned int	  __pad2;
+	compat_time_t   sem_ctime;
+	u32 sem_nsems;
+	u32 __unused1;
+	u32 __unused2;
+};
+
+struct msqid_ds32
+{
+        struct ipc_perm32 msg_perm;
+        u32 msg_first;
+        u32 msg_last;
+        compat_time_t   msg_stime;
+        compat_time_t   msg_rtime;
+        compat_time_t   msg_ctime;
+        u32 wwait;
+        u32 rwait;
+        unsigned short msg_cbytes;
+        unsigned short msg_qnum;  
+        unsigned short msg_qbytes;
+        compat_ipc_pid_t msg_lspid;
+        compat_ipc_pid_t msg_lrpid;
+};
+
+struct msqid64_ds32 {
+	struct ipc64_perm_ds32 msg_perm;
+	unsigned int   __pad1;
+	compat_time_t msg_stime;
+	unsigned int   __pad2;
+	compat_time_t msg_rtime;
+	unsigned int   __pad3;
+	compat_time_t msg_ctime;
+	unsigned int  msg_cbytes;
+	unsigned int  msg_qnum;
+	unsigned int  msg_qbytes;
+	compat_pid_t msg_lspid;
+	compat_pid_t msg_lrpid;
+	unsigned int  __unused1;
+	unsigned int  __unused2;
+};
+
+
+struct shmid_ds32 {
+	struct ipc_perm32       shm_perm;
+	int                     shm_segsz;
+	compat_time_t         shm_atime;
+	compat_time_t         shm_dtime;
+	compat_time_t         shm_ctime;
+	compat_ipc_pid_t    shm_cpid; 
+	compat_ipc_pid_t    shm_lpid; 
+	unsigned short          shm_nattch;
+};
+
+struct shmid64_ds32 {
+	struct ipc64_perm_ds32	shm_perm;
+	compat_size_t	shm_segsz;
+	compat_time_t  	shm_atime;
+	unsigned int		__unused1;
+	compat_time_t  	shm_dtime;
+	unsigned int		__unused2;
+	compat_time_t  	shm_ctime;
+	unsigned int		__unused3;
+	compat_pid_t	shm_cpid;
+	compat_pid_t	shm_lpid;
+	unsigned int		shm_nattch;
+	unsigned int		__unused4;
+	unsigned int		__unused5;
+};
+
+                                                        
+/*
+ * sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation..
+ *
+ * This is really horribly ugly.
+ */
+#define IPCOP_MASK(__x)	(1UL << (__x))
+static int do_sys32_semctl(int first, int second, int third, void *uptr)
+{
+	union semun fourth;
+	u32 pad;
+	int err = -EINVAL;
+
+	if (!uptr)
+		goto out;
+	err = -EFAULT;
+	if (get_user (pad, (u32 *)uptr))
+		goto out;
+	if(third == SETVAL)
+		fourth.val = (int)pad;
+	else
+		fourth.__pad = (void *)A(pad);
+	if (IPCOP_MASK (third) &
+	    (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (SEM_INFO) | IPCOP_MASK (GETVAL) |
+	     IPCOP_MASK (GETPID) | IPCOP_MASK (GETNCNT) | IPCOP_MASK (GETZCNT) |
+	     IPCOP_MASK (GETALL) | IPCOP_MASK (SETALL) | IPCOP_MASK (IPC_RMID))) {
+		err = sys_semctl (first, second, third, fourth);
+	} else if (third & IPC_64) {
+		struct semid64_ds s;
+		struct semid64_ds32 *usp = (struct semid64_ds32 *)A(pad);
+		mm_segment_t old_fs;
+		int need_back_translation;
+
+		if (third == (IPC_SET|IPC_64)) {
+			err = get_user (s.sem_perm.uid, &usp->sem_perm.uid);
+			err |= __get_user (s.sem_perm.gid, &usp->sem_perm.gid);
+			err |= __get_user (s.sem_perm.mode, &usp->sem_perm.mode);
+			if (err)
+				goto out;
+			fourth.__pad = &s;
+		}
+		need_back_translation =
+			(IPCOP_MASK (third) &
+			 (IPCOP_MASK (SEM_STAT) | IPCOP_MASK (IPC_STAT))) != 0;
+		if (need_back_translation)
+			fourth.__pad = &s;
+		old_fs = get_fs ();
+		set_fs (KERNEL_DS);
+		err = sys_semctl (first, second, third, fourth);
+		set_fs (old_fs);
+		if (need_back_translation) {
+			int err2 = put_user (s.sem_perm.key, &usp->sem_perm.key);
+			err2 |= __put_user (high2lowuid(s.sem_perm.uid), &usp->sem_perm.uid);
+			err2 |= __put_user (high2lowgid(s.sem_perm.gid), &usp->sem_perm.gid);
+			err2 |= __put_user (high2lowuid(s.sem_perm.cuid), &usp->sem_perm.cuid);
+			err2 |= __put_user (high2lowgid(s.sem_perm.cgid), &usp->sem_perm.cgid);
+			err2 |= __put_user (s.sem_perm.mode, &usp->sem_perm.mode);
+			err2 |= __put_user (s.sem_perm.seq, &usp->sem_perm.seq);
+			err2 |= __put_user (s.sem_otime, &usp->sem_otime);
+			err2 |= __put_user (s.sem_ctime, &usp->sem_ctime);
+			err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
+			if (err2) err = -EFAULT;
+		}
+	} else {
+		struct semid_ds s;
+		struct semid_ds32 *usp = (struct semid_ds32 *)A(pad);
+		mm_segment_t old_fs;
+		int need_back_translation;
+
+		if (third == IPC_SET) {
+			err = get_user (s.sem_perm.uid, &usp->sem_perm.uid);
+			err |= __get_user (s.sem_perm.gid, &usp->sem_perm.gid);
+			err |= __get_user (s.sem_perm.mode, &usp->sem_perm.mode);
+			if (err)
+				goto out;
+			fourth.__pad = &s;
+		}
+		need_back_translation =
+			(IPCOP_MASK (third) &
+			 (IPCOP_MASK (SEM_STAT) | IPCOP_MASK (IPC_STAT))) != 0;
+		if (need_back_translation)
+			fourth.__pad = &s;
+		old_fs = get_fs ();
+		set_fs (KERNEL_DS);
+		err = sys_semctl (first, second, third, fourth);
+		set_fs (old_fs);
+		if (need_back_translation) {
+			int err2 = put_user (s.sem_perm.key, &usp->sem_perm.key);
+			err2 |= __put_user (high2lowuid(s.sem_perm.uid), &usp->sem_perm.uid);
+			err2 |= __put_user (high2lowgid(s.sem_perm.gid), &usp->sem_perm.gid);
+			err2 |= __put_user (high2lowuid(s.sem_perm.cuid), &usp->sem_perm.cuid);
+			err2 |= __put_user (high2lowgid(s.sem_perm.cgid), &usp->sem_perm.cgid);
+			err2 |= __put_user (s.sem_perm.mode, &usp->sem_perm.mode);
+			err2 |= __put_user (s.sem_perm.seq, &usp->sem_perm.seq);
+			err2 |= __put_user (s.sem_otime, &usp->sem_otime);
+			err2 |= __put_user (s.sem_ctime, &usp->sem_ctime);
+			err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
+			if (err2) err = -EFAULT;
+		}
+	}
+out:
+	return err;
+}
+
+static int do_sys32_msgsnd (int first, int second, int third, void *uptr)
+{
+	struct msgbuf *p = kmalloc (second + sizeof (struct msgbuf), GFP_USER);
+	struct msgbuf32 *up = (struct msgbuf32 *)uptr;
+	mm_segment_t old_fs;
+	int err;
+
+	if (!p)
+		return -ENOMEM;
+
+	err = -EINVAL;
+	if (second > MSGMAX || first < 0 || second < 0)
+		goto out;
+
+	err = -EFAULT;
+	if (!uptr)
+		goto out;
+        if (get_user (p->mtype, &up->mtype) ||
+	    __copy_from_user (p->mtext, &up->mtext, second))
+		goto out;
+	old_fs = get_fs ();
+	set_fs (KERNEL_DS);
+	err = sys_msgsnd (first, p, second, third);
+	set_fs (old_fs);
+out:
+	kfree (p);
+	return err;
+}
+
+static int do_sys32_msgrcv (int first, int second, int msgtyp, int third,
+			    int version, void *uptr)
+{
+	struct msgbuf32 *up;
+	struct msgbuf *p;
+	mm_segment_t old_fs;
+	int err;
+
+	if (first < 0 || second < 0)
+		return -EINVAL;
+
+	if (!version) {
+		struct ipc_kludge_32 *uipck = (struct ipc_kludge_32 *)uptr;
+		struct ipc_kludge_32 ipck;
+
+		err = -EINVAL;
+		if (!uptr)
+			goto out;
+		err = -EFAULT;
+		if (copy_from_user (&ipck, uipck, sizeof (struct ipc_kludge_32)))
+			goto out;
+		uptr = (void *)A(ipck.msgp);
+		msgtyp = ipck.msgtyp;
+	}
+	err = -ENOMEM;
+	p = kmalloc (second + sizeof (struct msgbuf), GFP_USER);
+	if (!p)
+		goto out;
+	old_fs = get_fs ();
+	set_fs (KERNEL_DS);
+	err = sys_msgrcv (first, p, second, msgtyp, third);
+	set_fs (old_fs);
+	if (err < 0)
+		goto free_then_out;
+	up = (struct msgbuf32 *)uptr;
+	if (put_user (p->mtype, &up->mtype) ||
+	    __copy_to_user (&up->mtext, p->mtext, err))
+		err = -EFAULT;
+free_then_out:
+	kfree (p);
+out:
+	return err;
+}
+
+static int do_sys32_msgctl (int first, int second, void *uptr)
+{
+	int err;
+
+	if (IPCOP_MASK (second) &
+	    (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (MSG_INFO) |
+	     IPCOP_MASK (IPC_RMID))) {
+		err = sys_msgctl (first, second, (struct msqid_ds *)uptr);
+	} else if (second & IPC_64) {
+		struct msqid64_ds m;
+		struct msqid64_ds32 *up = (struct msqid64_ds32 *)uptr;
+		mm_segment_t old_fs;
+
+		if (second == (IPC_SET|IPC_64)) {
+			err = get_user (m.msg_perm.uid, &up->msg_perm.uid);
+			err |= __get_user (m.msg_perm.gid, &up->msg_perm.gid);
+			err |= __get_user (m.msg_perm.mode, &up->msg_perm.mode);
+			err |= __get_user (m.msg_qbytes, &up->msg_qbytes);
+			if (err)
+				goto out;
+		}
+		old_fs = get_fs ();
+		set_fs (KERNEL_DS);
+		err = sys_msgctl (first, second, (struct msqid_ds *)&m);
+		set_fs (old_fs);
+		if (IPCOP_MASK (second) &
+		    (IPCOP_MASK (MSG_STAT) | IPCOP_MASK (IPC_STAT))) {
+			int err2 = put_user (m.msg_perm.key, &up->msg_perm.key);
+			err2 |= __put_user (high2lowuid(m.msg_perm.uid), &up->msg_perm.uid);
+			err2 |= __put_user (high2lowgid(m.msg_perm.gid), &up->msg_perm.gid);
+			err2 |= __put_user (high2lowuid(m.msg_perm.cuid), &up->msg_perm.cuid);
+			err2 |= __put_user (high2lowgid(m.msg_perm.cgid), &up->msg_perm.cgid);
+			err2 |= __put_user (m.msg_perm.mode, &up->msg_perm.mode);
+			err2 |= __put_user (m.msg_perm.seq, &up->msg_perm.seq);
+			err2 |= __put_user (m.msg_stime, &up->msg_stime);
+			err2 |= __put_user (m.msg_rtime, &up->msg_rtime);
+			err2 |= __put_user (m.msg_ctime, &up->msg_ctime);
+			err2 |= __put_user (m.msg_cbytes, &up->msg_cbytes);
+			err2 |= __put_user (m.msg_qnum, &up->msg_qnum);
+			err2 |= __put_user (m.msg_qbytes, &up->msg_qbytes);
+			err2 |= __put_user (m.msg_lspid, &up->msg_lspid);
+			err2 |= __put_user (m.msg_lrpid, &up->msg_lrpid);
+			if (err2)
+				err = -EFAULT;
+		}
+	} else {
+		struct msqid_ds m;
+		struct msqid_ds32 *up = (struct msqid_ds32 *)uptr;
+		mm_segment_t old_fs;
+
+		if (second == IPC_SET) {
+			err = get_user (m.msg_perm.uid, &up->msg_perm.uid);
+			err |= __get_user (m.msg_perm.gid, &up->msg_perm.gid);
+			err |= __get_user (m.msg_perm.mode, &up->msg_perm.mode);
+			err |= __get_user (m.msg_qbytes, &up->msg_qbytes);
+			if (err)
+				goto out;
+		}
+		old_fs = get_fs ();
+		set_fs (KERNEL_DS);
+		err = sys_msgctl (first, second, &m);
+		set_fs (old_fs);
+		if (IPCOP_MASK (second) &
+		    (IPCOP_MASK (MSG_STAT) | IPCOP_MASK (IPC_STAT))) {
+			int err2 = put_user (m.msg_perm.key, &up->msg_perm.key);
+			err2 |= __put_user (high2lowuid(m.msg_perm.uid), &up->msg_perm.uid);
+			err2 |= __put_user (high2lowgid(m.msg_perm.gid), &up->msg_perm.gid);
+			err2 |= __put_user (high2lowuid(m.msg_perm.cuid), &up->msg_perm.cuid);
+			err2 |= __put_user (high2lowgid(m.msg_perm.cgid), &up->msg_perm.cgid);
+			err2 |= __put_user (m.msg_perm.mode, &up->msg_perm.mode);
+			err2 |= __put_user (m.msg_perm.seq, &up->msg_perm.seq);
+			err2 |= __put_user (m.msg_stime, &up->msg_stime);
+			err2 |= __put_user (m.msg_rtime, &up->msg_rtime);
+			err2 |= __put_user (m.msg_ctime, &up->msg_ctime);
+			err2 |= __put_user (m.msg_cbytes, &up->msg_cbytes);
+			err2 |= __put_user (m.msg_qnum, &up->msg_qnum);
+			err2 |= __put_user (m.msg_qbytes, &up->msg_qbytes);
+			err2 |= __put_user (m.msg_lspid, &up->msg_lspid);
+			err2 |= __put_user (m.msg_lrpid, &up->msg_lrpid);
+			if (err2)
+				err = -EFAULT;
+		}
+	}
+
+out:
+	return err;
+}
+
+static int do_sys32_shmat (int first, int second, int third, int version, void *uptr)
+{
+	unsigned long raddr;
+	u32 *uaddr = (u32 *)A((u32)third);
+	int err = -EINVAL;
+
+	if (version == 1)
+		goto out;
+	err = sys_shmat (first, uptr, second, &raddr);
+	if (err)
+		goto out;
+	err = put_user (raddr, uaddr);
+out:
+	return err;
+}
+
+static int do_sys32_shmctl (int first, int second, void *uptr)
+{
+	int err;
+
+	if (IPCOP_MASK (second) &
+	    (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (SHM_LOCK) | IPCOP_MASK (SHM_UNLOCK) |
+	     IPCOP_MASK (IPC_RMID))) {
+		if (second == (IPC_INFO|IPC_64))
+			second = IPC_INFO; /* So that we don't have to translate it */
+		err = sys_shmctl (first, second, (struct shmid_ds *)uptr);
+	} else if ((second & IPC_64) && second != (SHM_INFO|IPC_64)) {
+		struct shmid64_ds s;
+		struct shmid64_ds32 *up = (struct shmid64_ds32 *)uptr;
+		mm_segment_t old_fs;
+
+		if (second == (IPC_SET|IPC_64)) {
+			err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
+			err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
+			err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
+			if (err)
+				goto out;
+		}
+		old_fs = get_fs ();
+		set_fs (KERNEL_DS);
+		err = sys_shmctl (first, second, (struct shmid_ds *)&s);
+		set_fs (old_fs);
+		if (err < 0)
+			goto out;
+
+		/* Mask it even in this case so it becomes a CSE. */
+		if (IPCOP_MASK (second) &
+		    (IPCOP_MASK (SHM_STAT) | IPCOP_MASK (IPC_STAT))) {
+			int err2 = put_user (s.shm_perm.key, &up->shm_perm.key);
+			err2 |= __put_user (high2lowuid(s.shm_perm.uid), &up->shm_perm.uid);
+			err2 |= __put_user (high2lowgid(s.shm_perm.gid), &up->shm_perm.gid);
+			err2 |= __put_user (high2lowuid(s.shm_perm.cuid), &up->shm_perm.cuid);
+			err2 |= __put_user (high2lowgid(s.shm_perm.cgid), &up->shm_perm.cgid);
+			err2 |= __put_user (s.shm_perm.mode, &up->shm_perm.mode);
+			err2 |= __put_user (s.shm_perm.seq, &up->shm_perm.seq);
+			err2 |= __put_user (s.shm_atime, &up->shm_atime);
+			err2 |= __put_user (s.shm_dtime, &up->shm_dtime);
+			err2 |= __put_user (s.shm_ctime, &up->shm_ctime);
+			err2 |= __put_user (s.shm_segsz, &up->shm_segsz);
+			err2 |= __put_user (s.shm_nattch, &up->shm_nattch);
+			err2 |= __put_user (s.shm_cpid, &up->shm_cpid);
+			err2 |= __put_user (s.shm_lpid, &up->shm_lpid);
+			if (err2)
+				err = -EFAULT;
+		}
+	} else {
+		struct shmid_ds s;
+		struct shmid_ds32 *up = (struct shmid_ds32 *)uptr;
+		mm_segment_t old_fs;
+
+		second &= ~IPC_64;
+		if (second == IPC_SET) {
+			err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
+			err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
+			err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
+			if (err)
+				goto out;
+		}
+		old_fs = get_fs ();
+		set_fs (KERNEL_DS);
+		err = sys_shmctl (first, second, &s);
+		set_fs (old_fs);
+		if (err < 0)
+			goto out;
+
+		/* Mask it even in this case so it becomes a CSE. */
+		if (second == SHM_INFO) {
+			struct shm_info32 {
+				int used_ids;
+				u32 shm_tot, shm_rss, shm_swp;
+				u32 swap_attempts, swap_successes;
+			} *uip = (struct shm_info32 *)uptr;
+			struct shm_info *kp = (struct shm_info *)&s;
+			int err2 = put_user (kp->used_ids, &uip->used_ids);
+			err2 |= __put_user (kp->shm_tot, &uip->shm_tot);
+			err2 |= __put_user (kp->shm_rss, &uip->shm_rss);
+			err2 |= __put_user (kp->shm_swp, &uip->shm_swp);
+			err2 |= __put_user (kp->swap_attempts, &uip->swap_attempts);
+			err2 |= __put_user (kp->swap_successes, &uip->swap_successes);
+			if (err2)
+				err = -EFAULT;
+		} else if (IPCOP_MASK (second) &
+			   (IPCOP_MASK (SHM_STAT) | IPCOP_MASK (IPC_STAT))) {
+			int err2 = put_user (s.shm_perm.key, &up->shm_perm.key);
+			err2 |= __put_user (high2lowuid(s.shm_perm.uid), &up->shm_perm.uid);
+			err2 |= __put_user (high2lowgid(s.shm_perm.gid), &up->shm_perm.gid);
+			err2 |= __put_user (high2lowuid(s.shm_perm.cuid), &up->shm_perm.cuid);
+			err2 |= __put_user (high2lowgid(s.shm_perm.cgid), &up->shm_perm.cgid);
+			err2 |= __put_user (s.shm_perm.mode, &up->shm_perm.mode);
+			err2 |= __put_user (s.shm_perm.seq, &up->shm_perm.seq);
+			err2 |= __put_user (s.shm_atime, &up->shm_atime);
+			err2 |= __put_user (s.shm_dtime, &up->shm_dtime);
+			err2 |= __put_user (s.shm_ctime, &up->shm_ctime);
+			err2 |= __put_user (s.shm_segsz, &up->shm_segsz);
+			err2 |= __put_user (s.shm_nattch, &up->shm_nattch);
+			err2 |= __put_user (s.shm_cpid, &up->shm_cpid);
+			err2 |= __put_user (s.shm_lpid, &up->shm_lpid);
+			if (err2)
+				err = -EFAULT;
+		}
+	}
+out:
+	return err;
+}
+
+asmlinkage int sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
+{
+	int version, err;
+
+	version = call >> 16; /* hack for backward compatibility */
+	call &= 0xffff;
+
+	if(version)
+		return -EINVAL;
+
+	if (call <= SEMCTL)
+		switch (call) {
+		case SEMOP:
+			/* struct sembuf is the same on 32 and 64bit :)) */
+			err = sys_semop (first, (struct sembuf *)AA(ptr), second);
+			goto out;
+		case SEMGET:
+			err = sys_semget (first, second, third);
+			goto out;
+		case SEMCTL:
+			err = do_sys32_semctl (first, second, third, (void *)AA(ptr));
+			goto out;
+		default:
+			err = -EINVAL;
+			goto out;
+		};
+	if (call <= MSGCTL) 
+		switch (call) {
+		case MSGSND:
+			err = do_sys32_msgsnd (first, second, third, (void *)AA(ptr));
+			goto out;
+		case MSGRCV:
+			err = do_sys32_msgrcv (first, second, 0, third,
+					       version, (void *)AA(ptr));
+			goto out;
+		case MSGGET:
+			err = sys_msgget ((key_t) first, second);
+			goto out;
+		case MSGCTL:
+			err = do_sys32_msgctl (first, second, (void *)AA(ptr));
+			goto out;
+		default:
+			err = -EINVAL;
+			goto out;
+		}
+	if (call <= SHMCTL) 
+		switch (call) {
+		case SHMAT:
+			err = do_sys32_shmat (first, second, third,
+					      version, (void *)AA(ptr));
+			goto out;
+		case SHMDT: 
+			err = sys_shmdt ((char *)AA(ptr));
+			goto out;
+		case SHMGET:
+			err = sys_shmget (first, second, third);
+			goto out;
+		case SHMCTL:
+			err = do_sys32_shmctl (first, second, (void *)AA(ptr));
+			goto out;
+		default:
+			err = -EINVAL;
+			goto out;
+		}
+
+	err = -EINVAL;
+
+out:
+	return err;
+}
+
+extern asmlinkage long sys_truncate(const char * path, unsigned long length);
+extern asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length);
+
+asmlinkage int sys32_truncate64(const char * path, unsigned long high, unsigned long low)
+{
+	if ((int)high < 0)
+		return -EINVAL;
+	else
+		return sys_truncate(path, (high << 32) | low);
+}
+
+asmlinkage int sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low)
+{
+	if ((int)high < 0)
+		return -EINVAL;
+	else
+		return sys_ftruncate(fd, (high << 32) | low);
+}
+
+typedef ssize_t (*io_fn_t)(struct file *, char *, size_t, loff_t *);
+typedef ssize_t (*iov_fn_t)(struct file *, const struct iovec *, unsigned long, loff_t *);
+
+static long do_readv_writev32(int type, struct file *file,
+			      const struct compat_iovec *vector, u32 count)
+{
+	unsigned long tot_len;
+	struct iovec iovstack[UIO_FASTIOV];
+	struct iovec *iov=iovstack, *ivp;
+	struct inode *inode;
+	long retval, i;
+	io_fn_t fn;
+	iov_fn_t fnv;
+
+	/* First get the "struct iovec" from user memory and
+	 * verify all the pointers
+	 */
+	if (!count)
+		return 0;
+	if (verify_area(VERIFY_READ, vector, sizeof(struct compat_iovec)*count))
+		return -EFAULT;
+	if (count > UIO_MAXIOV)
+		return -EINVAL;
+	if (count > UIO_FASTIOV) {
+		iov = kmalloc(count*sizeof(struct iovec), GFP_KERNEL);
+		if (!iov)
+			return -ENOMEM;
+	}
+
+	tot_len = 0;
+	i = count;
+	ivp = iov;
+	while(i > 0) {
+		u32 len;
+		u32 buf;
+
+		__get_user(len, &vector->iov_len);
+		__get_user(buf, &vector->iov_base);
+		tot_len += len;
+		ivp->iov_base = (void *)A(buf);
+		ivp->iov_len = (__kernel_size_t) len;
+		vector++;
+		ivp++;
+		i--;
+	}
+
+	inode = file->f_dentry->d_inode;
+	/* VERIFY_WRITE actually means a read, as we write to user space */
+	retval = locks_verify_area((type == VERIFY_WRITE
+				    ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
+				   inode, file, file->f_pos, tot_len);
+	if (retval)
+		goto out;
+
+	/* VERIFY_WRITE actually means a read, as we write to user space */
+	fnv = (type == VERIFY_WRITE ? file->f_op->readv : file->f_op->writev);
+	if (fnv) {
+		retval = fnv(file, iov, count, &file->f_pos);
+		goto out;
+	}
+
+	fn = (type == VERIFY_WRITE ? file->f_op->read :
+	      (io_fn_t) file->f_op->write);
+
+	ivp = iov;
+	while (count > 0) {
+		void * base;
+		int len, nr;
+
+		base = ivp->iov_base;
+		len = ivp->iov_len;
+		ivp++;
+		count--;
+		nr = fn(file, base, len, &file->f_pos);
+		if (nr < 0) {
+			if (!retval)
+				retval = nr;
+			break;
+		}
+		retval += nr;
+		if (nr != len)
+			break;
+	}
+out:
+	if (iov != iovstack)
+		kfree(iov);
+
+	return retval;
+}
+
+asmlinkage long sys32_readv(int fd, struct compat_iovec *vector, u32 count)
+{
+	struct file *file;
+	long ret = -EBADF;
+
+	file = fget(fd);
+	if(!file)
+		goto bad_file;
+
+	if (file->f_op && (file->f_mode & FMODE_READ) &&
+	    (file->f_op->readv || file->f_op->read))
+		ret = do_readv_writev32(VERIFY_WRITE, file, vector, count);
+	fput(file);
+
+bad_file:
+	return ret;
+}
+
+asmlinkage long sys32_writev(int fd, struct compat_iovec *vector, u32 count)
+{
+	struct file *file;
+	int ret = -EBADF;
+
+	file = fget(fd);
+	if(!file)
+		goto bad_file;
+	if (file->f_op && (file->f_mode & FMODE_WRITE) &&
+	    (file->f_op->writev || file->f_op->write))
+		ret = do_readv_writev32(VERIFY_READ, file, vector, count);
+	fput(file);
+
+bad_file:
+	return ret;
+}
+
+/* readdir & getdents */
+
+#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
+#define ROUND_UP(x) (((x)+sizeof(u32)-1) & ~(sizeof(u32)-1))
+
+struct old_linux_dirent32 {
+	u32		d_ino;
+	u32		d_offset;
+	unsigned short	d_namlen;
+	char		d_name[1];
+};
+
+struct readdir_callback32 {
+	struct old_linux_dirent32 * dirent;
+	int count;
+};
+
+static int fillonedir(void * __buf, const char * name, int namlen,
+		      loff_t offset, ino_t ino, unsigned int d_type)
+{
+	struct readdir_callback32 * buf = (struct readdir_callback32 *) __buf;
+	struct old_linux_dirent32 * dirent;
+
+	if (buf->count)
+		return -EINVAL;
+	buf->count++;
+	dirent = buf->dirent;
+	put_user(ino, &dirent->d_ino);
+	put_user(offset, &dirent->d_offset);
+	put_user(namlen, &dirent->d_namlen);
+	copy_to_user(dirent->d_name, name, namlen);
+	put_user(0, dirent->d_name + namlen);
+	return 0;
+}
+
+asmlinkage int old32_readdir(unsigned int fd, struct old_linux_dirent32 *dirent, unsigned int count)
+{
+	int error = -EBADF;
+	struct file * file;
+	struct readdir_callback32 buf;
+
+	file = fget(fd);
+	if (!file)
+		goto out;
+
+	buf.count = 0;
+	buf.dirent = dirent;
+
+	error = vfs_readdir(file, fillonedir, &buf);
+	if (error < 0)
+		goto out_putf;
+	error = buf.count;
+
+out_putf:
+	fput(file);
+out:
+	return error;
+}
+
+struct linux_dirent32 {
+	u32		d_ino;
+	u32		d_off;
+	unsigned short	d_reclen;
+	char		d_name[1];
+};
+
+struct getdents_callback32 {
+	struct linux_dirent32 * current_dir;
+	struct linux_dirent32 * previous;
+	int count;
+	int error;
+};
+
+static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
+		   unsigned int d_type)
+{
+	struct linux_dirent32 * dirent;
+	struct getdents_callback32 * buf = (struct getdents_callback32 *) __buf;
+	int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
+
+	buf->error = -EINVAL;	/* only used if we fail.. */
+	if (reclen > buf->count)
+		return -EINVAL;
+	dirent = buf->previous;
+	if (dirent)
+		put_user(offset, &dirent->d_off);
+	dirent = buf->current_dir;
+	buf->previous = dirent;
+	put_user(ino, &dirent->d_ino);
+	put_user(reclen, &dirent->d_reclen);
+	copy_to_user(dirent->d_name, name, namlen);
+	put_user(0, dirent->d_name + namlen);
+	((char *) dirent) += reclen;
+	buf->current_dir = dirent;
+	buf->count -= reclen;
+	return 0;
+}
+
+asmlinkage int sys32_getdents(unsigned int fd, struct linux_dirent32 *dirent, unsigned int count)
+{
+	struct file * file;
+	struct linux_dirent32 * lastdirent;
+	struct getdents_callback32 buf;
+	int error = -EBADF;
+
+	file = fget(fd);
+	if (!file)
+		goto out;
+
+	buf.current_dir = dirent;
+	buf.previous = NULL;
+	buf.count = count;
+	buf.error = 0;
+
+	error = vfs_readdir(file, filldir, &buf);
+	if (error < 0)
+		goto out_putf;
+	lastdirent = buf.previous;
+	error = buf.error;
+	if(lastdirent) {
+		put_user(file->f_pos, &lastdirent->d_off);
+		error = count - buf.count;
+	}
+out_putf:
+	fput(file);
+out:
+	return error;
+}
+
+/* end of readdir & getdents */
+
+/*
+ * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
+ * 64-bit unsigned longs.
+ */
+
+static inline int
+get_fd_set32(unsigned long n, unsigned long *fdset, u32 *ufdset)
+{
+	if (ufdset) {
+		unsigned long odd;
+
+		if (verify_area(VERIFY_WRITE, ufdset, n*sizeof(u32)))
+			return -EFAULT;
+
+		odd = n & 1UL;
+		n &= ~1UL;
+		while (n) {
+			unsigned long h, l;
+			__get_user(l, ufdset);
+			__get_user(h, ufdset+1);
+			ufdset += 2;
+			*fdset++ = h << 32 | l;
+			n -= 2;
+		}
+		if (odd)
+			__get_user(*fdset, ufdset);
+	} else {
+		/* Tricky, must clear full unsigned long in the
+		 * kernel fdset at the end, this makes sure that
+		 * actually happens.
+		 */
+		memset(fdset, 0, ((n + 1) & ~1)*sizeof(u32));
+	}
+	return 0;
+}
+
+static inline void
+set_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset)
+{
+	unsigned long odd;
+
+	if (!ufdset)
+		return;
+
+	odd = n & 1UL;
+	n &= ~1UL;
+	while (n) {
+		unsigned long h, l;
+		l = *fdset++;
+		h = l >> 32;
+		__put_user(l, ufdset);
+		__put_user(h, ufdset+1);
+		ufdset += 2;
+		n -= 2;
+	}
+	if (odd)
+		__put_user(*fdset, ufdset);
+}
+
+#define MAX_SELECT_SECONDS \
+	((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
+
+asmlinkage int sys32_select(int n, u32 *inp, u32 *outp, u32 *exp, u32 tvp_x)
+{
+	fd_set_bits fds;
+	struct compat_timeval *tvp = (struct compat_timeval *)AA(tvp_x);
+	char *bits;
+	unsigned long nn;
+	long timeout;
+	int ret, size;
+
+	timeout = MAX_SCHEDULE_TIMEOUT;
+	if (tvp) {
+		int sec, usec;
+
+		if ((ret = verify_area(VERIFY_READ, tvp, sizeof(*tvp)))
+		    || (ret = __get_user(sec, &tvp->tv_sec))
+		    || (ret = __get_user(usec, &tvp->tv_usec)))
+			goto out_nofds;
+
+		ret = -EINVAL;
+		if(sec < 0 || usec < 0)
+			goto out_nofds;
+
+		if ((unsigned long) sec < MAX_SELECT_SECONDS) {
+			timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
+			timeout += sec * (unsigned long) HZ;
+		}
+	}
+
+	ret = -EINVAL;
+	if (n < 0)
+		goto out_nofds;
+	if (n > current->files->max_fdset)
+		n = current->files->max_fdset;
+
+	/*
+	 * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
+	 * since we used fdset we need to allocate memory in units of
+	 * long-words. 
+	 */
+	ret = -ENOMEM;
+	size = FDS_BYTES(n);
+	bits = kmalloc(6 * size, GFP_KERNEL);
+	if (!bits)
+		goto out_nofds;
+	fds.in      = (unsigned long *)  bits;
+	fds.out     = (unsigned long *) (bits +   size);
+	fds.ex      = (unsigned long *) (bits + 2*size);
+	fds.res_in  = (unsigned long *) (bits + 3*size);
+	fds.res_out = (unsigned long *) (bits + 4*size);
+	fds.res_ex  = (unsigned long *) (bits + 5*size);
+
+	nn = (n + 8*sizeof(u32) - 1) / (8*sizeof(u32));
+	if ((ret = get_fd_set32(nn, fds.in, inp)) ||
+	    (ret = get_fd_set32(nn, fds.out, outp)) ||
+	    (ret = get_fd_set32(nn, fds.ex, exp)))
+		goto out;
+	zero_fd_set(n, fds.res_in);
+	zero_fd_set(n, fds.res_out);
+	zero_fd_set(n, fds.res_ex);
+
+	ret = do_select(n, &fds, &timeout);
+
+	if (tvp && !(current->personality & STICKY_TIMEOUTS)) {
+		int sec = 0, usec = 0;
+		if (timeout) {
+			sec = timeout / HZ;
+			usec = timeout % HZ;
+			usec *= (1000000/HZ);
+		}
+		put_user(sec, &tvp->tv_sec);
+		put_user(usec, &tvp->tv_usec);
+	}
+
+	if (ret < 0)
+		goto out;
+	if (!ret) {
+		ret = -ERESTARTNOHAND;
+		if (signal_pending(current))
+			goto out;
+		ret = 0;
+	}
+
+	set_fd_set32(nn, inp, fds.res_in);
+	set_fd_set32(nn, outp, fds.res_out);
+	set_fd_set32(nn, exp, fds.res_ex);
+
+out:
+	kfree(bits);
+out_nofds:
+	return ret;
+}
+
+int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf)
+{
+	int err;
+
+	err = put_user(stat->dev, &statbuf->st_dev);
+	err |= put_user(stat->ino, &statbuf->st_ino);
+	err |= put_user(stat->mode, &statbuf->st_mode);
+	err |= put_user(stat->nlink, &statbuf->st_nlink);
+	err |= put_user(high2lowuid(stat->uid), &statbuf->st_uid);
+	err |= put_user(high2lowgid(stat->gid), &statbuf->st_gid);
+	err |= put_user(stat->rdev, &statbuf->st_rdev);
+	err |= put_user(stat->size, &statbuf->st_size);
+	err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
+	err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec);
+	err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime);
+	err |= put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec);
+	err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime);
+	err |= put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec);
+	err |= put_user(stat->blksize, &statbuf->st_blksize);
+	err |= put_user(stat->blocks, &statbuf->st_blocks);
+/* fixme
+	err |= put_user(0, &statbuf->__unused4[0]);
+	err |= put_user(0, &statbuf->__unused4[1]);
+*/
+	return err;
+}
+
+extern asmlinkage int sys_sysfs(int option, unsigned long arg1, unsigned long arg2);
+
+asmlinkage int sys32_sysfs(int option, u32 arg1, u32 arg2)
+{
+	return sys_sysfs(option, arg1, arg2);
+}
+
+struct ncp_mount_data32 {
+        int version;
+        unsigned int ncp_fd;
+        compat_uid_t mounted_uid;
+        compat_pid_t wdog_pid;
+        unsigned char mounted_vol[NCP_VOLNAME_LEN + 1];
+        unsigned int time_out;
+        unsigned int retry_count;
+        unsigned int flags;
+        compat_uid_t uid;
+        compat_gid_t gid;
+        compat_mode_t file_mode;
+        compat_mode_t dir_mode;
+};
+
+static void *do_ncp_super_data_conv(void *raw_data)
+{
+	struct ncp_mount_data *n = (struct ncp_mount_data *)raw_data;
+	struct ncp_mount_data32 *n32 = (struct ncp_mount_data32 *)raw_data;
+
+	n->dir_mode = n32->dir_mode;
+	n->file_mode = n32->file_mode;
+	n->gid = low2highgid(n32->gid);
+	n->uid = low2highuid(n32->uid);
+	memmove (n->mounted_vol, n32->mounted_vol, (sizeof (n32->mounted_vol) + 3 * sizeof (unsigned int)));
+	n->wdog_pid = n32->wdog_pid;
+	n->mounted_uid = low2highuid(n32->mounted_uid);
+	return raw_data;
+}
+
+struct smb_mount_data32 {
+        int version;
+        compat_uid_t mounted_uid;
+        compat_uid_t uid;
+        compat_gid_t gid;
+        compat_mode_t file_mode;
+        compat_mode_t dir_mode;
+};
+
+static void *do_smb_super_data_conv(void *raw_data)
+{
+	struct smb_mount_data *s = (struct smb_mount_data *)raw_data;
+	struct smb_mount_data32 *s32 = (struct smb_mount_data32 *)raw_data;
+
+	if (s32->version != SMB_MOUNT_OLDVERSION)
+		goto out;
+	s->version = s32->version;
+	s->mounted_uid = low2highuid(s32->mounted_uid);
+	s->uid = low2highuid(s32->uid);
+	s->gid = low2highgid(s32->gid);
+	s->file_mode = s32->file_mode;
+	s->dir_mode = s32->dir_mode;
+out:
+	return raw_data;
+}
+
+static int copy_mount_stuff_to_kernel(const void *user, unsigned long *kernel)
+{
+	int i;
+	unsigned long page;
+	struct vm_area_struct *vma;
+
+	*kernel = 0;
+	if(!user)
+		return 0;
+	vma = find_vma(current->mm, (unsigned long)user);
+	if(!vma || (unsigned long)user < vma->vm_start)
+		return -EFAULT;
+	if(!(vma->vm_flags & VM_READ))
+		return -EFAULT;
+	i = vma->vm_end - (unsigned long) user;
+	if(PAGE_SIZE <= (unsigned long) i)
+		i = PAGE_SIZE - 1;
+	if(!(page = __get_free_page(GFP_KERNEL)))
+		return -ENOMEM;
+	if(copy_from_user((void *) page, user, i)) {
+		free_page(page);
+		return -EFAULT;
+	}
+	*kernel = page;
+	return 0;
+}
+
+#define SMBFS_NAME	"smbfs"
+#define NCPFS_NAME	"ncpfs"
+
+asmlinkage int sys32_mount(char *dev_name, char *dir_name, char *type, unsigned long new_flags, u32 data)
+{
+	unsigned long type_page = 0;
+	unsigned long data_page = 0;
+	unsigned long dev_page = 0;
+	unsigned long dir_page = 0;
+	int err, is_smb, is_ncp;
+
+	is_smb = is_ncp = 0;
+
+	err = copy_mount_stuff_to_kernel((const void *)type, &type_page);
+	if (err)
+		goto out;
+
+	if (!type_page) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	is_smb = !strcmp((char *)type_page, SMBFS_NAME);
+	is_ncp = !strcmp((char *)type_page, NCPFS_NAME);
+
+	err = copy_mount_stuff_to_kernel((const void *)AA(data), &data_page);
+	if (err)
+		goto type_out;
+
+	err = copy_mount_stuff_to_kernel(dev_name, &dev_page);
+	if (err)
+		goto data_out;
+
+	err = copy_mount_stuff_to_kernel(dir_name, &dir_page);
+	if (err)
+		goto dev_out;
+
+	if (!is_smb && !is_ncp) {
+		lock_kernel();
+		err = do_mount((char*)dev_page, (char*)dir_page,
+				(char*)type_page, new_flags, (char*)data_page);
+		unlock_kernel();
+	} else {
+		if (is_ncp)
+			do_ncp_super_data_conv((void *)data_page);
+		else
+			do_smb_super_data_conv((void *)data_page);
+
+		lock_kernel();
+		err = do_mount((char*)dev_page, (char*)dir_page,
+				(char*)type_page, new_flags, (char*)data_page);
+		unlock_kernel();
+	}
+	free_page(dir_page);
+
+dev_out:
+	free_page(dev_page);
+
+data_out:
+	free_page(data_page);
+
+type_out:
+	free_page(type_page);
+
+out:
+	return err;
+}
+
+struct rusage32 {
+        struct compat_timeval ru_utime;
+        struct compat_timeval ru_stime;
+        s32    ru_maxrss;
+        s32    ru_ixrss;
+        s32    ru_idrss;
+        s32    ru_isrss;
+        s32    ru_minflt;
+        s32    ru_majflt;
+        s32    ru_nswap;
+        s32    ru_inblock;
+        s32    ru_oublock;
+        s32    ru_msgsnd; 
+        s32    ru_msgrcv; 
+        s32    ru_nsignals;
+        s32    ru_nvcsw;
+        s32    ru_nivcsw;
+};
+
+static int put_rusage (struct rusage32 *ru, struct rusage *r)
+{
+	int err;
+	
+	err = put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);
+	err |= __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec);
+	err |= __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec);
+	err |= __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec);
+	err |= __put_user (r->ru_maxrss, &ru->ru_maxrss);
+	err |= __put_user (r->ru_ixrss, &ru->ru_ixrss);
+	err |= __put_user (r->ru_idrss, &ru->ru_idrss);
+	err |= __put_user (r->ru_isrss, &ru->ru_isrss);
+	err |= __put_user (r->ru_minflt, &ru->ru_minflt);
+	err |= __put_user (r->ru_majflt, &ru->ru_majflt);
+	err |= __put_user (r->ru_nswap, &ru->ru_nswap);
+	err |= __put_user (r->ru_inblock, &ru->ru_inblock);
+	err |= __put_user (r->ru_oublock, &ru->ru_oublock);
+	err |= __put_user (r->ru_msgsnd, &ru->ru_msgsnd);
+	err |= __put_user (r->ru_msgrcv, &ru->ru_msgrcv);
+	err |= __put_user (r->ru_nsignals, &ru->ru_nsignals);
+	err |= __put_user (r->ru_nvcsw, &ru->ru_nvcsw);
+	err |= __put_user (r->ru_nivcsw, &ru->ru_nivcsw);
+	return err;
+}
+
+struct sysinfo32 {
+        s32 uptime;
+        u32 loads[3];
+        u32 totalram;
+        u32 freeram;
+        u32 sharedram;
+        u32 bufferram;
+        u32 totalswap;
+        u32 freeswap;
+        unsigned short procs;
+        char _f[22];
+};
+
+extern asmlinkage int sys_sysinfo(struct sysinfo *info);
+
+asmlinkage int sys32_sysinfo(struct sysinfo32 *info)
+{
+	struct sysinfo s;
+	int ret, err;
+	mm_segment_t old_fs = get_fs ();
+	
+	set_fs (KERNEL_DS);
+	ret = sys_sysinfo(&s);
+	set_fs (old_fs);
+	err = put_user (s.uptime, &info->uptime);
+	err |= __put_user (s.loads[0], &info->loads[0]);
+	err |= __put_user (s.loads[1], &info->loads[1]);
+	err |= __put_user (s.loads[2], &info->loads[2]);
+	err |= __put_user (s.totalram, &info->totalram);
+	err |= __put_user (s.freeram, &info->freeram);
+	err |= __put_user (s.sharedram, &info->sharedram);
+	err |= __put_user (s.bufferram, &info->bufferram);
+	err |= __put_user (s.totalswap, &info->totalswap);
+	err |= __put_user (s.freeswap, &info->freeswap);
+	err |= __put_user (s.procs, &info->procs);
+	if (err)
+		return -EFAULT;
+	return ret;
+}
+
+extern asmlinkage int sys_sched_rr_get_interval(pid_t pid, struct timespec *interval);
+
+asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
+		struct compat_timespec *interval)
+{
+	struct timespec t;
+	int ret;
+	mm_segment_t old_fs = get_fs ();
+	
+	set_fs (KERNEL_DS);
+	ret = sys_sched_rr_get_interval(pid, &t);
+	set_fs (old_fs);
+	if (put_compat_timespec(&t, interval))
+		return -EFAULT;
+	return ret;
+}
+
+extern asmlinkage int sys_rt_sigprocmask(int how, sigset_t *set, sigset_t *oset, size_t sigsetsize);
+
+asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, compat_sigset_t *oset, compat_size_t sigsetsize)
+{
+	sigset_t s;
+	compat_sigset_t s32;
+	int ret;
+	mm_segment_t old_fs = get_fs();
+	
+	if (set) {
+		if (copy_from_user (&s32, set, sizeof(compat_sigset_t)))
+			return -EFAULT;
+		switch (_NSIG_WORDS) {
+		case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
+		case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
+		case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
+		case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
+		}
+	}
+	set_fs (KERNEL_DS);
+	ret = sys_rt_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL, sigsetsize);
+	set_fs (old_fs);
+	if (ret) return ret;
+	if (oset) {
+		switch (_NSIG_WORDS) {
+		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
+		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
+		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
+		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
+		}
+		if (copy_to_user (oset, &s32, sizeof(compat_sigset_t)))
+			return -EFAULT;
+	}
+	return 0;
+}
+
+extern asmlinkage int sys_rt_sigpending(sigset_t *set, size_t sigsetsize);
+
+asmlinkage int sys32_rt_sigpending(compat_sigset_t *set, compat_size_t sigsetsize)
+{
+	sigset_t s;
+	compat_sigset_t s32;
+	int ret;
+	mm_segment_t old_fs = get_fs();
+		
+	set_fs (KERNEL_DS);
+	ret = sys_rt_sigpending(&s, sigsetsize);
+	set_fs (old_fs);
+	if (!ret) {
+		switch (_NSIG_WORDS) {
+		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
+		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
+		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
+		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
+		}
+		if (copy_to_user (set, &s32, sizeof(compat_sigset_t)))
+			return -EFAULT;
+	}
+	return ret;
+}
+
+extern int
+copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from);
+
+asmlinkage int
+sys32_rt_sigtimedwait(compat_sigset_t *uthese, siginfo_t32 *uinfo,
+		      struct compat_timespec *uts, compat_size_t sigsetsize)
+{
+	int ret, sig;
+	sigset_t these;
+	compat_sigset_t these32;
+	struct timespec ts;
+	siginfo_t info;
+	long timeout = 0;
+
+	/* XXX: Don't preclude handling different sized sigset_t's.  */
+	if (sigsetsize != sizeof(sigset_t))
+		return -EINVAL;
+
+	if (copy_from_user (&these32, uthese, sizeof(compat_sigset_t)))
+		return -EFAULT;
+
+	switch (_NSIG_WORDS) {
+	case 4: these.sig[3] = these32.sig[6] | (((long)these32.sig[7]) << 32);
+	case 3: these.sig[2] = these32.sig[4] | (((long)these32.sig[5]) << 32);
+	case 2: these.sig[1] = these32.sig[2] | (((long)these32.sig[3]) << 32);
+	case 1: these.sig[0] = these32.sig[0] | (((long)these32.sig[1]) << 32);
+	}
+		
+	/*
+	 * Invert the set of allowed signals to get those we
+	 * want to block.
+	 */
+	sigdelsetmask(&these, sigmask(SIGKILL)|sigmask(SIGSTOP));
+	signotset(&these);
+
+	if (uts) {
+		if (get_compat_timespec(&ts, uts))
+			return -EINVAL;
+		if (ts.tv_nsec >= 1000000000L || ts.tv_nsec < 0
+		    || ts.tv_sec < 0)
+			return -EINVAL;
+	}
+
+	spin_lock_irq(&current->sighand->siglock);
+	sig = dequeue_signal(current, &these, &info);
+	if (!sig) {
+		/* None ready -- temporarily unblock those we're interested
+		   in so that we'll be awakened when they arrive.  */
+		current->real_blocked = current->blocked;
+		sigandsets(&current->blocked, &current->blocked, &these);
+		recalc_sigpending();
+		spin_unlock_irq(&current->sighand->siglock);
+
+		timeout = MAX_SCHEDULE_TIMEOUT;
+		if (uts)
+			timeout = (timespec_to_jiffies(&ts)
+				   + (ts.tv_sec || ts.tv_nsec));
+
+		current->state = TASK_INTERRUPTIBLE;
+		timeout = schedule_timeout(timeout);
+
+		spin_lock_irq(&current->sighand->siglock);
+		sig = dequeue_signal(current, &these, &info);
+		current->blocked = current->real_blocked;
+		siginitset(&current->real_blocked, 0);
+		recalc_sigpending();
+	}
+	spin_unlock_irq(&current->sighand->siglock);
+
+	if (sig) {
+		ret = sig;
+		if (uinfo) {
+			if (copy_siginfo_to_user32(uinfo, &info))
+				ret = -EFAULT;
+		}
+	} else {
+		ret = -EAGAIN;
+		if (timeout)
+			ret = -EINTR;
+	}
+
+	return ret;
+}
+
+extern asmlinkage int
+sys_rt_sigqueueinfo(int pid, int sig, siginfo_t *uinfo);
+
+asmlinkage int
+sys32_rt_sigqueueinfo(int pid, int sig, siginfo_t32 *uinfo)
+{
+	siginfo_t info;
+	int ret;
+	mm_segment_t old_fs = get_fs();
+	
+	if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
+	    copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
+		return -EFAULT;
+	set_fs (KERNEL_DS);
+	ret = sys_rt_sigqueueinfo(pid, sig, &info);
+	set_fs (old_fs);
+	return ret;
+}
+
+extern void check_pending(int signum);
+
+/*
+ * count32() counts the number of arguments/envelopes
+ */
+static int count32(u32 * argv)
+{
+	int i = 0;
+
+	if (argv != NULL) {
+		for (;;) {
+			u32 p; int error;
+
+			error = get_user(p,argv);
+			if (error) return error;
+			if (!p) break;
+			argv++; i++;
+		}
+	}
+	return i;
+}
+
+/*
+ * 'copy_string32()' copies argument/envelope strings from user
+ * memory to free pages in kernel mem. These are in a format ready
+ * to be put directly into the top of new user memory.
+ */
+static int copy_strings32(int argc, u32 * argv, struct linux_binprm *bprm)
+{
+	while (argc-- > 0) {
+		u32 str;
+		int len;
+		unsigned long pos;
+
+		if (get_user(str, argv + argc) ||
+		    !str ||
+		    !(len = strnlen_user((char *)A(str), bprm->p)))
+			return -EFAULT;
+
+		if (bprm->p < len)
+			return -E2BIG;
+
+		bprm->p -= len;
+
+		pos = bprm->p;
+		while (len) {
+			char *kaddr;
+			struct page *page;
+			int offset, bytes_to_copy, new, err;
+
+			offset = pos % PAGE_SIZE;
+			page = bprm->page[pos / PAGE_SIZE];
+			new = 0;
+			if (!page) {
+				page = alloc_page(GFP_USER);
+				bprm->page[pos / PAGE_SIZE] = page;
+				if (!page)
+					return -ENOMEM;
+				new = 1;
+			}
+			kaddr = (char *)kmap(page);
+
+			if (new && offset)
+				memset(kaddr, 0, offset);
+			bytes_to_copy = PAGE_SIZE - offset;
+			if (bytes_to_copy > len) {
+				bytes_to_copy = len;
+				if (new)
+					memset(kaddr+offset+len, 0,
+					       PAGE_SIZE-offset-len);
+			}
+
+			err = copy_from_user(kaddr + offset, (char *)A(str),
+					     bytes_to_copy);
+			kunmap(page);
+
+			if (err)
+				return -EFAULT;
+
+			pos += bytes_to_copy;
+			str += bytes_to_copy;
+			len -= bytes_to_copy;
+		}
+	}
+	return 0;
+}
+
+/*
+ * sys32_execve() executes a new program.
+ */
+static inline int 
+do_execve32(char * filename, u32 * argv, u32 * envp, struct pt_regs * regs)
+{
+	struct linux_binprm bprm;
+	struct file * file;
+	int retval;
+	int i;
+
+	sched_balance_exec();
+
+	file = open_exec(filename);
+
+	retval = PTR_ERR(file);
+	if (IS_ERR(file))
+		return retval;
+
+	bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
+	memset(bprm.page, 0, MAX_ARG_PAGES * sizeof(bprm.page[0]));
+
+	bprm.file = file;
+	bprm.filename = filename;
+	bprm.sh_bang = 0;
+	bprm.loader = 0;
+	bprm.exec = 0;
+	bprm.mm = mm_alloc();
+	retval = -ENOMEM;
+	if (!bprm.mm)
+		goto out_file;
+
+	/* init_new_context is empty for s390x. */
+
+	bprm.argc = count32(argv);
+	if ((retval = bprm.argc) < 0)
+		goto out_mm;
+
+	bprm.envc = count32(envp);
+	if ((retval = bprm.envc) < 0)
+		goto out_mm;
+
+	retval = security_bprm_alloc(&bprm);
+	if (retval)
+		goto out;
+
+	retval = prepare_binprm(&bprm);
+	if (retval < 0)
+		goto out;
+	
+	retval = copy_strings_kernel(1, &bprm.filename, &bprm);
+	if (retval < 0)
+		goto out;
+
+	bprm.exec = bprm.p;
+	retval = copy_strings32(bprm.envc, envp, &bprm);
+	if (retval < 0)
+		goto out;
+
+	retval = copy_strings32(bprm.argc, argv, &bprm);
+	if (retval < 0)
+		goto out;
+
+	retval = search_binary_handler(&bprm, regs);
+	if (retval >= 0) {
+		/* execve success */
+		security_bprm_free(&bprm);
+		return retval;
+	}
+
+out:
+	/* Something went wrong, return the inode and free the argument pages*/
+	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);
+
+out_mm:
+	mmdrop(bprm.mm);
+
+out_file:
+	if (bprm.file) {
+		allow_write_access(bprm.file);
+		fput(bprm.file);
+	}
+
+	return retval;
+}
+
+/*
+ * sys32_execve() executes a new program after the asm stub has set
+ * things up for us.  This should basically do what I want it to.
+ */
+asmlinkage int
+sys32_execve(struct pt_regs regs)
+{
+        int error;
+        char * filename;
+
+        filename = getname((char *)A(regs.orig_gpr2));
+        error = PTR_ERR(filename);
+        if (IS_ERR(filename))
+                goto out;
+        error = do_execve32(filename, (u32 *)A(regs.gprs[3]), (u32 *)A(regs.gprs[4]), &regs);
+	if (error == 0)
+	{
+		current->ptrace &= ~PT_DTRACE;
+		current->thread.fp_regs.fpc=0;
+		__asm__ __volatile__
+		        ("sr  0,0\n\t"
+		         "sfpc 0,0\n\t"
+			 : : :"0");
+	}
+        putname(filename);
+out:
+        return error;
+}
+
+
+#ifdef CONFIG_MODULES
+
+extern asmlinkage int sys_init_module(const char *name_user, struct module *mod_user);
+
+/* Hey, when you're trying to init module, take time and prepare us a nice 64bit
+ * module structure, even if from 32bit modutils... Why to pollute kernel... :))
+ */
+asmlinkage int sys32_init_module(const char *name_user, struct module *mod_user)
+{
+	return sys_init_module(name_user, mod_user);
+}
+
+extern asmlinkage int sys_delete_module(const char *name_user);
+
+asmlinkage int sys32_delete_module(const char *name_user)
+{
+	return sys_delete_module(name_user);
+}
+
+struct module_info32 {
+	u32 addr;
+	u32 size;
+	u32 flags;
+	s32 usecount;
+};
+
+#else /* CONFIG_MODULES */
+
+asmlinkage int
+sys32_init_module(const char *name_user, struct module *mod_user)
+{
+	return -ENOSYS;
+}
+
+asmlinkage int
+sys32_delete_module(const char *name_user)
+{
+	return -ENOSYS;
+}
+
+#endif  /* CONFIG_MODULES */
+
+/* Stuff for NFS server syscalls... */
+struct nfsctl_svc32 {
+	u16			svc32_port;
+	s32			svc32_nthreads;
+};
+
+struct nfsctl_client32 {
+	s8			cl32_ident[NFSCLNT_IDMAX+1];
+	s32			cl32_naddr;
+	struct in_addr		cl32_addrlist[NFSCLNT_ADDRMAX];
+	s32			cl32_fhkeytype;
+	s32			cl32_fhkeylen;
+	u8			cl32_fhkey[NFSCLNT_KEYMAX];
+};
+
+struct nfsctl_export32 {
+	s8			ex32_client[NFSCLNT_IDMAX+1];
+	s8			ex32_path[NFS_MAXPATHLEN+1];
+	compat_dev_t	ex32_dev;
+	compat_ino_t	ex32_ino;
+	s32			ex32_flags;
+	compat_uid_t	ex32_anon_uid;
+	compat_gid_t	ex32_anon_gid;
+};
+
+struct nfsctl_fdparm32 {
+	struct sockaddr		gd32_addr;
+	s8			gd32_path[NFS_MAXPATHLEN+1];
+	s32			gd32_version;
+};
+
+struct nfsctl_fsparm32 {
+	struct sockaddr		gd32_addr;
+	s8			gd32_path[NFS_MAXPATHLEN+1];
+	s32			gd32_maxlen;
+};
+
+struct nfsctl_arg32 {
+	s32			ca32_version;	/* safeguard */
+	union {
+		struct nfsctl_svc32	u32_svc;
+		struct nfsctl_client32	u32_client;
+		struct nfsctl_export32	u32_export;
+		struct nfsctl_fdparm32	u32_getfd;
+		struct nfsctl_fsparm32	u32_getfs;
+	} u;
+#define ca32_svc	u.u32_svc
+#define ca32_client	u.u32_client
+#define ca32_export	u.u32_export
+#define ca32_getfd	u.u32_getfd
+#define ca32_getfs	u.u32_getfs
+#define ca32_authd	u.u32_authd
+};
+
+union nfsctl_res32 {
+	__u8			cr32_getfh[NFS_FHSIZE];
+	struct knfsd_fh		cr32_getfs;
+};
+
+static int nfs_svc32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
+{
+	int err;
+	
+	err = __get_user(karg->ca_version, &arg32->ca32_version);
+	err |= __get_user(karg->ca_svc.svc_port, &arg32->ca32_svc.svc32_port);
+	err |= __get_user(karg->ca_svc.svc_nthreads, &arg32->ca32_svc.svc32_nthreads);
+	return err;
+}
+
+static int nfs_clnt32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
+{
+	int err;
+	
+	err = __get_user(karg->ca_version, &arg32->ca32_version);
+	err |= copy_from_user(&karg->ca_client.cl_ident[0],
+			  &arg32->ca32_client.cl32_ident[0],
+			  NFSCLNT_IDMAX);
+	err |= __get_user(karg->ca_client.cl_naddr, &arg32->ca32_client.cl32_naddr);
+	err |= copy_from_user(&karg->ca_client.cl_addrlist[0],
+			  &arg32->ca32_client.cl32_addrlist[0],
+			  (sizeof(struct in_addr) * NFSCLNT_ADDRMAX));
+	err |= __get_user(karg->ca_client.cl_fhkeytype,
+		      &arg32->ca32_client.cl32_fhkeytype);
+	err |= __get_user(karg->ca_client.cl_fhkeylen,
+		      &arg32->ca32_client.cl32_fhkeylen);
+	err |= copy_from_user(&karg->ca_client.cl_fhkey[0],
+			  &arg32->ca32_client.cl32_fhkey[0],
+			  NFSCLNT_KEYMAX);
+	return err;
+}
+
+static int nfs_exp32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
+{
+	int err;
+	
+	err = __get_user(karg->ca_version, &arg32->ca32_version);
+	err |= copy_from_user(&karg->ca_export.ex_client[0],
+			  &arg32->ca32_export.ex32_client[0],
+			  NFSCLNT_IDMAX);
+	err |= copy_from_user(&karg->ca_export.ex_path[0],
+			  &arg32->ca32_export.ex32_path[0],
+			  NFS_MAXPATHLEN);
+	err |= __get_user(karg->ca_export.ex_dev,
+		      &arg32->ca32_export.ex32_dev);
+	err |= __get_user(karg->ca_export.ex_ino,
+		      &arg32->ca32_export.ex32_ino);
+	err |= __get_user(karg->ca_export.ex_flags,
+		      &arg32->ca32_export.ex32_flags);
+	err |= __get_user(karg->ca_export.ex_anon_uid,
+		      &arg32->ca32_export.ex32_anon_uid);
+	err |= __get_user(karg->ca_export.ex_anon_gid,
+		      &arg32->ca32_export.ex32_anon_gid);
+	karg->ca_export.ex_anon_uid = high2lowuid(karg->ca_export.ex_anon_uid);
+	karg->ca_export.ex_anon_gid = high2lowgid(karg->ca_export.ex_anon_gid);
+	return err;
+}
+
+static int nfs_getfd32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
+{
+	int err;
+	
+	err = __get_user(karg->ca_version, &arg32->ca32_version);
+	err |= copy_from_user(&karg->ca_getfd.gd_addr,
+			  &arg32->ca32_getfd.gd32_addr,
+			  (sizeof(struct sockaddr)));
+	err |= copy_from_user(&karg->ca_getfd.gd_path,
+			  &arg32->ca32_getfd.gd32_path,
+			  (NFS_MAXPATHLEN+1));
+	err |= __get_user(karg->ca_getfd.gd_version,
+		      &arg32->ca32_getfd.gd32_version);
+	return err;
+}
+
+static int nfs_getfs32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
+{
+	int err;
+	
+	err = __get_user(karg->ca_version, &arg32->ca32_version);
+	err |= copy_from_user(&karg->ca_getfs.gd_addr,
+			  &arg32->ca32_getfs.gd32_addr,
+			  (sizeof(struct sockaddr)));
+	err |= copy_from_user(&karg->ca_getfs.gd_path,
+			  &arg32->ca32_getfs.gd32_path,
+			  (NFS_MAXPATHLEN+1));
+	err |= __get_user(karg->ca_getfs.gd_maxlen,
+		      &arg32->ca32_getfs.gd32_maxlen);
+	return err;
+}
+
+/* This really doesn't need translations, we are only passing
+ * back a union which contains opaque nfs file handle data.
+ */
+static int nfs_getfh32_res_trans(union nfsctl_res *kres, union nfsctl_res32 *res32)
+{
+	return copy_to_user(res32, kres, sizeof(*res32)) ? -EFAULT : 0;
+}
+
+/*
+asmlinkage long sys_ni_syscall(void); 
+*/
+
+int asmlinkage sys32_nfsservctl(int cmd, struct nfsctl_arg32 *arg32, union nfsctl_res32 *res32)
+{
+	struct nfsctl_arg *karg = NULL;
+	union nfsctl_res *kres = NULL;
+	mm_segment_t oldfs;
+	int err;
+
+	karg = kmalloc(sizeof(*karg), GFP_USER);
+	if(!karg)
+		return -ENOMEM;
+	if(res32) {
+		kres = kmalloc(sizeof(*kres), GFP_USER);
+		if(!kres) {
+			kfree(karg);
+			return -ENOMEM;
+		}
+	}
+	switch(cmd) {
+	case NFSCTL_SVC:
+		err = nfs_svc32_trans(karg, arg32);
+		break;
+	case NFSCTL_ADDCLIENT:
+		err = nfs_clnt32_trans(karg, arg32);
+		break;
+	case NFSCTL_DELCLIENT:
+		err = nfs_clnt32_trans(karg, arg32);
+		break;
+	case NFSCTL_EXPORT:
+	case NFSCTL_UNEXPORT:
+		err = nfs_exp32_trans(karg, arg32);
+		break;
+	case NFSCTL_GETFD:
+		err = nfs_getfd32_trans(karg, arg32);
+		break;
+	case NFSCTL_GETFS:
+		err = nfs_getfs32_trans(karg, arg32);
+		break;
+	default:
+		err = -EINVAL;
+		break;
+	}
+	if(err)
+		goto done;
+	oldfs = get_fs();
+	set_fs(KERNEL_DS);
+	err = sys_nfsservctl(cmd, karg, kres);
+	set_fs(oldfs);
+
+	if (err)
+		goto done;
+
+	if((cmd == NFSCTL_GETFD) ||
+	   (cmd == NFSCTL_GETFS))
+		err = nfs_getfh32_res_trans(kres, res32);
+
+done:
+	if(karg)
+		kfree(karg);
+	if(kres)
+		kfree(kres);
+	return err;
+}
+
+/* Translations due to time_t size differences.  Which affects all
+   sorts of things, like timeval and itimerval.  */
+
+extern struct timezone sys_tz;
+extern int do_sys_settimeofday(struct timeval *tv, struct timezone *tz);
+
+asmlinkage int sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz)
+{
+	if (tv) {
+		struct timeval ktv;
+		do_gettimeofday(&ktv);
+		if (put_tv32(tv, &ktv))
+			return -EFAULT;
+	}
+	if (tz) {
+		if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
+			return -EFAULT;
+	}
+	return 0;
+}
+
+asmlinkage int sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz)
+{
+	struct timeval ktv;
+	struct timezone ktz;
+
+ 	if (tv) {
+		if (get_tv32(&ktv, tv))
+			return -EFAULT;
+	}
+	if (tz) {
+		if (copy_from_user(&ktz, tz, sizeof(ktz)))
+			return -EFAULT;
+	}
+
+	return do_sys_settimeofday(tv ? &ktv : NULL, tz ? &ktz : NULL);
+}
+
+asmlinkage int sys_utimes(char *, struct timeval *);
+
+asmlinkage int sys32_utimes(char *filename, struct compat_timeval *tvs)
+{
+	char *kfilename;
+	struct timeval ktvs[2];
+	mm_segment_t old_fs;
+	int ret;
+
+	kfilename = getname(filename);
+	ret = PTR_ERR(kfilename);
+	if (!IS_ERR(kfilename)) {
+		if (tvs) {
+			if (get_tv32(&ktvs[0], tvs) ||
+			    get_tv32(&ktvs[1], 1+tvs))
+				return -EFAULT;
+		}
+
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+		ret = sys_utimes(kfilename, &ktvs[0]);
+		set_fs(old_fs);
+
+		putname(kfilename);
+	}
+	return ret;
+}
+
+/* These are here just in case some old sparc32 binary calls it. */
+asmlinkage int sys32_pause(void)
+{
+	current->state = TASK_INTERRUPTIBLE;
+	schedule();
+	return -ERESTARTNOHAND;
+}
+
+extern asmlinkage int sys_prctl(int option, unsigned long arg2, unsigned long arg3,
+				unsigned long arg4, unsigned long arg5);
+
+asmlinkage int sys32_prctl(int option, u32 arg2, u32 arg3, u32 arg4, u32 arg5)
+{
+	return sys_prctl(option,
+			 (unsigned long) arg2,
+			 (unsigned long) arg3,
+			 (unsigned long) arg4,
+			 (unsigned long) arg5);
+}
+
+
+extern asmlinkage ssize_t sys_pread64(unsigned int fd, char * buf,
+				    size_t count, loff_t pos);
+
+extern asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char * buf,
+				     size_t count, loff_t pos);
+
+asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, char *ubuf,
+				 compat_size_t count, u32 poshi, u32 poslo)
+{
+	if ((compat_ssize_t) count < 0)
+		return -EINVAL;
+	return sys_pread64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo));
+}
+
+asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd, char *ubuf,
+				  compat_size_t count, u32 poshi, u32 poslo)
+{
+	if ((compat_ssize_t) count < 0)
+		return -EINVAL;
+	return sys_pwrite64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo));
+}
+
+extern asmlinkage ssize_t sys_readahead(int fd, loff_t offset, size_t count);
+
+asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count)
+{
+	return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count);
+}
+
+extern asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
+
+asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, s32 count)
+{
+	mm_segment_t old_fs = get_fs();
+	int ret;
+	off_t of;
+	
+	if (offset && get_user(of, offset))
+		return -EFAULT;
+		
+	set_fs(KERNEL_DS);
+	ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count);
+	set_fs(old_fs);
+	
+	if (!ret && offset && put_user(of, offset))
+		return -EFAULT;
+		
+	return ret;
+}
+
+extern asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, 
+					 loff_t *offset, size_t count);
+
+asmlinkage int sys32_sendfile64(int out_fd, int in_fd, 
+				compat_loff_t *offset, s32 count)
+{
+	mm_segment_t old_fs = get_fs();
+	int ret;
+	loff_t lof;
+	
+	if (offset && get_user(lof, offset))
+		return -EFAULT;
+		
+	set_fs(KERNEL_DS);
+	ret = sys_sendfile64(out_fd, in_fd, offset ? &lof : NULL, count);
+	set_fs(old_fs);
+	
+	if (offset && put_user(lof, offset))
+		return -EFAULT;
+		
+	return ret;
+}
+
+/* Handle adjtimex compatibility. */
+
+struct timex32 {
+	u32 modes;
+	s32 offset, freq, maxerror, esterror;
+	s32 status, constant, precision, tolerance;
+	struct compat_timeval time;
+	s32 tick;
+	s32 ppsfreq, jitter, shift, stabil;
+	s32 jitcnt, calcnt, errcnt, stbcnt;
+	s32  :32; s32  :32; s32  :32; s32  :32;
+	s32  :32; s32  :32; s32  :32; s32  :32;
+	s32  :32; s32  :32; s32  :32; s32  :32;
+};
+
+extern int do_adjtimex(struct timex *);
+
+asmlinkage int sys32_adjtimex(struct timex32 *utp)
+{
+	struct timex txc;
+	int ret;
+
+	memset(&txc, 0, sizeof(struct timex));
+
+	if(get_user(txc.modes, &utp->modes) ||
+	   __get_user(txc.offset, &utp->offset) ||
+	   __get_user(txc.freq, &utp->freq) ||
+	   __get_user(txc.maxerror, &utp->maxerror) ||
+	   __get_user(txc.esterror, &utp->esterror) ||
+	   __get_user(txc.status, &utp->status) ||
+	   __get_user(txc.constant, &utp->constant) ||
+	   __get_user(txc.precision, &utp->precision) ||
+	   __get_user(txc.tolerance, &utp->tolerance) ||
+	   __get_user(txc.time.tv_sec, &utp->time.tv_sec) ||
+	   __get_user(txc.time.tv_usec, &utp->time.tv_usec) ||
+	   __get_user(txc.tick, &utp->tick) ||
+	   __get_user(txc.ppsfreq, &utp->ppsfreq) ||
+	   __get_user(txc.jitter, &utp->jitter) ||
+	   __get_user(txc.shift, &utp->shift) ||
+	   __get_user(txc.stabil, &utp->stabil) ||
+	   __get_user(txc.jitcnt, &utp->jitcnt) ||
+	   __get_user(txc.calcnt, &utp->calcnt) ||
+	   __get_user(txc.errcnt, &utp->errcnt) ||
+	   __get_user(txc.stbcnt, &utp->stbcnt))
+		return -EFAULT;
+
+	ret = do_adjtimex(&txc);
+
+	if(put_user(txc.modes, &utp->modes) ||
+	   __put_user(txc.offset, &utp->offset) ||
+	   __put_user(txc.freq, &utp->freq) ||
+	   __put_user(txc.maxerror, &utp->maxerror) ||
+	   __put_user(txc.esterror, &utp->esterror) ||
+	   __put_user(txc.status, &utp->status) ||
+	   __put_user(txc.constant, &utp->constant) ||
+	   __put_user(txc.precision, &utp->precision) ||
+	   __put_user(txc.tolerance, &utp->tolerance) ||
+	   __put_user(txc.time.tv_sec, &utp->time.tv_sec) ||
+	   __put_user(txc.time.tv_usec, &utp->time.tv_usec) ||
+	   __put_user(txc.tick, &utp->tick) ||
+	   __put_user(txc.ppsfreq, &utp->ppsfreq) ||
+	   __put_user(txc.jitter, &utp->jitter) ||
+	   __put_user(txc.shift, &utp->shift) ||
+	   __put_user(txc.stabil, &utp->stabil) ||
+	   __put_user(txc.jitcnt, &utp->jitcnt) ||
+	   __put_user(txc.calcnt, &utp->calcnt) ||
+	   __put_user(txc.errcnt, &utp->errcnt) ||
+	   __put_user(txc.stbcnt, &utp->stbcnt))
+		ret = -EFAULT;
+
+	return ret;
+}
+
+extern asmlinkage long sys_setpriority(int which, int who, int niceval);
+
+asmlinkage int sys_setpriority32(u32 which, u32 who, u32 niceval)
+{
+	return sys_setpriority((int) which,
+			       (int) who,
+			       (int) niceval);
+}
+
+struct __sysctl_args32 {
+	u32 name;
+	int nlen;
+	u32 oldval;
+	u32 oldlenp;
+	u32 newval;
+	u32 newlen;
+	u32 __unused[4];
+};
+
+extern asmlinkage long sys32_sysctl(struct __sysctl_args32 *args)
+{
+	struct __sysctl_args32 tmp;
+	int error;
+	size_t oldlen, *oldlenp = NULL;
+	unsigned long addr = (((long)&args->__unused[0]) + 7) & ~7;
+
+	if (copy_from_user(&tmp, args, sizeof(tmp)))
+		return -EFAULT;
+
+	if (tmp.oldval && tmp.oldlenp) {
+		/* Duh, this is ugly and might not work if sysctl_args
+		   is in read-only memory, but do_sysctl does indirectly
+		   a lot of uaccess in both directions and we'd have to
+		   basically copy the whole sysctl.c here, and
+		   glibc's __sysctl uses rw memory for the structure
+		   anyway.  */
+		if (get_user(oldlen, (u32 *)A(tmp.oldlenp)) ||
+		    put_user(oldlen, (size_t *)addr))
+			return -EFAULT;
+		oldlenp = (size_t *)addr;
+	}
+
+	lock_kernel();
+	error = do_sysctl((int *)A(tmp.name), tmp.nlen, (void *)A(tmp.oldval),
+			  oldlenp, (void *)A(tmp.newval), tmp.newlen);
+	unlock_kernel();
+	if (oldlenp) {
+		if (!error) {
+			if (get_user(oldlen, (size_t *)addr) ||
+			    put_user(oldlen, (u32 *)A(tmp.oldlenp)))
+				error = -EFAULT;
+		}
+		copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused));
+	}
+	return error;
+}
+
+struct stat64_emu31 {
+	unsigned char   __pad0[6];
+	unsigned short  st_dev;
+	unsigned int    __pad1;
+#define STAT64_HAS_BROKEN_ST_INO        1
+	u32             __st_ino;
+	unsigned int    st_mode;
+	unsigned int    st_nlink;
+	u32             st_uid;
+	u32             st_gid;
+	unsigned char   __pad2[6];
+	unsigned short  st_rdev;
+	unsigned int    __pad3;
+	long            st_size;
+	u32             st_blksize;
+	unsigned char   __pad4[4];
+	u32             __pad5;     /* future possible st_blocks high bits */
+	u32             st_blocks;  /* Number 512-byte blocks allocated. */
+	u32             st_atime;
+	u32             __pad6;
+	u32             st_mtime;
+	u32             __pad7;
+	u32             st_ctime;
+	u32             __pad8;     /* will be high 32 bits of ctime someday */
+	unsigned long   st_ino;
+};	
+
+static inline int
+putstat64 (struct stat64_emu31 *ubuf, struct stat *kbuf)
+{
+    struct stat64_emu31 tmp;
+   
+    memset(&tmp, 0, sizeof(tmp));
+
+    tmp.st_dev = (unsigned short)kbuf->st_dev;
+    tmp.st_ino = kbuf->st_ino;
+    tmp.__st_ino = (u32)kbuf->st_ino;
+    tmp.st_mode = kbuf->st_mode;
+    tmp.st_nlink = (unsigned int)kbuf->st_nlink;
+    tmp.st_uid = kbuf->st_uid;
+    tmp.st_gid = kbuf->st_gid;
+    tmp.st_rdev = (unsigned short)kbuf->st_rdev;
+    tmp.st_size = kbuf->st_size;
+    tmp.st_blksize = (u32)kbuf->st_blksize;
+    tmp.st_blocks = (u32)kbuf->st_blocks;
+    tmp.st_atime = (u32)kbuf->st_atime;
+    tmp.st_mtime = (u32)kbuf->st_mtime;
+    tmp.st_ctime = (u32)kbuf->st_ctime;
+
+    return copy_to_user(ubuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; 
+}
+
+extern asmlinkage long sys_newstat(char * filename, struct stat * statbuf);
+
+asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf, long flags)
+{
+    int ret;
+    struct stat s;
+    char * tmp;
+    int err;
+    mm_segment_t old_fs = get_fs();
+    
+    tmp = getname(filename);
+    err = PTR_ERR(tmp);
+    if (IS_ERR(tmp))   
+	    return err;
+
+    set_fs (KERNEL_DS);
+    ret = sys_newstat(tmp, &s);
+    set_fs (old_fs);
+    putname(tmp);
+    if (putstat64 (statbuf, &s)) 
+	    return -EFAULT;
+    return ret;
+}
+
+extern asmlinkage long sys_newlstat(char * filename, struct stat * statbuf);
+
+asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf, long flags)
+{
+    int ret;
+    struct stat s;
+    char * tmp;
+    int err;
+    mm_segment_t old_fs = get_fs();
+    
+    tmp = getname(filename);
+    err = PTR_ERR(tmp);
+    if (IS_ERR(tmp))   
+	    return err;
+
+    set_fs (KERNEL_DS);
+    ret = sys_newlstat(tmp, &s);
+    set_fs (old_fs);
+    putname(tmp);
+    if (putstat64 (statbuf, &s)) 
+	    return -EFAULT;
+    return ret;
+}
+
+extern asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf);
+
+asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 * statbuf, long flags)
+{
+    int ret;
+    struct stat s;
+    mm_segment_t old_fs = get_fs();
+    
+    set_fs (KERNEL_DS);
+    ret = sys_newfstat(fd, &s);
+    set_fs (old_fs);
+    if (putstat64 (statbuf, &s))
+	    return -EFAULT;
+    return ret;
+}
+
+/*
+ * Linux/i386 didn't use to be able to handle more than
+ * 4 system call parameters, so these system calls used a memory
+ * block for parameter passing..
+ */
+
+struct mmap_arg_struct_emu31 {
+	u32	addr;
+	u32	len;
+	u32	prot;
+	u32	flags;
+	u32	fd;
+	u32	offset;
+};
+
+/* common code for old and new mmaps */
+static inline long do_mmap2(
+	unsigned long addr, unsigned long len,
+	unsigned long prot, unsigned long flags,
+	unsigned long fd, unsigned long pgoff)
+{
+	struct file * file = NULL;
+	unsigned long error = -EBADF;
+
+	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
+	if (!(flags & MAP_ANONYMOUS)) {
+		file = fget(fd);
+		if (!file)
+			goto out;
+	}
+
+	down_write(&current->mm->mmap_sem);
+	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
+	if (!IS_ERR((void *) error) && error + len >= 0x80000000ULL) {
+		/* Result is out of bounds.  */
+		do_munmap(current->mm, addr, len);
+		error = -ENOMEM;
+	}
+	up_write(&current->mm->mmap_sem);
+
+	if (file)
+		fput(file);
+out:    
+	return error;
+}
+
+
+asmlinkage unsigned long
+old32_mmap(struct mmap_arg_struct_emu31 *arg)
+{
+	struct mmap_arg_struct_emu31 a;
+	int error = -EFAULT;
+
+	if (copy_from_user(&a, arg, sizeof(a)))
+		goto out;
+
+	error = -EINVAL;
+	if (a.offset & ~PAGE_MASK)
+		goto out;
+
+	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); 
+out:
+	return error;
+}
+
+asmlinkage long 
+sys32_mmap2(struct mmap_arg_struct_emu31 *arg)
+{
+	struct mmap_arg_struct_emu31 a;
+	int error = -EFAULT;
+
+	if (copy_from_user(&a, arg, sizeof(a)))
+		goto out;
+	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
+out:
+	return error;
+}
+
+extern asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len,
+					    unsigned long *user_mask_ptr);
+
+asmlinkage int sys32_sched_setaffinity(compat_pid_t pid, unsigned int len,
+				       u32 *user_mask_ptr)
+{
+	unsigned long kernel_mask;
+	mm_segment_t old_fs;
+	int ret;
+
+	if (get_user(kernel_mask, user_mask_ptr))
+		return -EFAULT;
+
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	ret = sys_sched_setaffinity(pid,
+				    /* XXX Nice api... */
+				    sizeof(kernel_mask),
+				    &kernel_mask);
+	set_fs(old_fs);
+
+	return ret;
+}
+
+extern asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len,
+					    unsigned long *user_mask_ptr);
+
+asmlinkage int sys32_sched_getaffinity(compat_pid_t pid, unsigned int len,
+				       u32 *user_mask_ptr)
+{
+	unsigned long kernel_mask;
+	mm_segment_t old_fs;
+	int ret;
+
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	ret = sys_sched_getaffinity(pid,
+				    /* XXX Nice api... */
+				    sizeof(kernel_mask),
+				    &kernel_mask);
+	set_fs(old_fs);
+
+	if (ret == 0) {
+		if (put_user(kernel_mask, user_mask_ptr))
+			ret = -EFAULT;
+	}
+
+	return ret;
+}
+
+asmlinkage ssize_t sys_read(unsigned int fd, char * buf, size_t count);
+
+asmlinkage compat_ssize_t sys32_read(unsigned int fd, char * buf, size_t count)
+{
+	if ((compat_ssize_t) count < 0)
+		return -EINVAL; 
+
+	return sys_read(fd, buf, count);
+}
+
+asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count);
+
+asmlinkage compat_ssize_t sys32_write(unsigned int fd, char * buf, size_t count)
+{
+	if ((compat_ssize_t) count < 0)
+		return -EINVAL; 
+
+	return sys_write(fd, buf, count);
+}
+
+asmlinkage int sys32_clone(struct pt_regs regs)
+{
+        unsigned long clone_flags;
+        unsigned long newsp;
+	struct task_struct *p;
+	int *parent_tidptr, *child_tidptr;
+
+        clone_flags = regs.gprs[3] & 0xffffffffUL;
+        newsp = regs.orig_gpr2 & 0x7fffffffUL;
+	parent_tidptr = (int *) (regs.gprs[4] & 0x7fffffffUL);
+	child_tidptr = (int *) (regs.gprs[5] & 0x7fffffffUL);
+        if (!newsp)
+                newsp = regs.gprs[15];
+        p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, &regs, 0,
+		    parent_tidptr, child_tidptr);
+	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+}
diff -Nru a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_linux.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,193 @@
+#ifndef _ASM_S390X_S390_H
+#define _ASM_S390X_S390_H
+
+#include <linux/config.h>
+#include <linux/compat.h>
+#include <linux/socket.h>
+#include <linux/nfs_fs.h>
+#include <linux/sunrpc/svc.h>
+#include <linux/nfsd/nfsd.h>
+#include <linux/nfsd/export.h>
+
+/* Macro that masks the high order bit of an 32 bit pointer and converts it*/
+/*       to a 64 bit pointer */
+#define A(__x) ((unsigned long)((__x) & 0x7FFFFFFFUL))
+#define AA(__x)				\
+	((unsigned long)(__x))
+
+/* Now 32bit compatibility types */
+struct ipc_kludge_32 {
+        __u32   msgp;                           /* pointer              */
+        __s32   msgtyp;
+};
+
+struct old_sigaction32 {
+       __u32			sa_handler;	/* Really a pointer, but need to deal with 32 bits */
+       compat_old_sigset_t	sa_mask;	/* A 32 bit mask */
+       __u32			sa_flags;
+       __u32			sa_restorer;	/* Another 32 bit pointer */
+};
+ 
+typedef union sigval32 {
+        int     sival_int;
+        __u32   sival_ptr;
+} sigval_t32;
+                 
+typedef struct siginfo32 {
+	int	si_signo;
+	int	si_errno;
+	int	si_code;
+
+	union {
+		int _pad[((128/sizeof(int)) - 3)];
+
+		/* kill() */
+		struct {
+			pid_t	_pid;	/* sender's pid */
+			uid_t	_uid;	/* sender's uid */
+		} _kill;
+
+		/* POSIX.1b timers */
+		struct {
+			unsigned int	_timer1;
+			unsigned int	_timer2;
+                
+		} _timer;
+
+		/* POSIX.1b signals */
+		struct {
+			pid_t			_pid;	/* sender's pid */
+			uid_t			_uid;	/* sender's uid */
+			sigval_t32		_sigval;
+		} _rt;
+
+		/* SIGCHLD */
+		struct {
+			pid_t			_pid;	/* which child */
+			uid_t			_uid;	/* sender's uid */
+			int			_status;/* exit code */
+			compat_clock_t		_utime;
+			compat_clock_t		_stime;
+		} _sigchld;
+
+		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
+		struct {
+			__u32	_addr;	/* faulting insn/memory ref. - pointer */
+		} _sigfault;
+                          
+		/* SIGPOLL */
+		struct {
+			int	_band;	/* POLL_IN, POLL_OUT, POLL_MSG */
+			int	_fd;
+		} _sigpoll;
+	} _sifields;
+} siginfo_t32;  
+
+/*
+ * How these fields are to be accessed.
+ */
+#define si_pid		_sifields._kill._pid
+#define si_uid		_sifields._kill._uid
+#define si_status	_sifields._sigchld._status
+#define si_utime	_sifields._sigchld._utime
+#define si_stime	_sifields._sigchld._stime
+#define si_value	_sifields._rt._sigval
+#define si_int		_sifields._rt._sigval.sival_int
+#define si_ptr		_sifields._rt._sigval.sival_ptr
+#define si_addr		_sifields._sigfault._addr
+#define si_band		_sifields._sigpoll._band
+#define si_fd		_sifields._sigpoll._fd    
+
+/* asm/sigcontext.h */
+typedef union
+{
+	__u64   d;
+	__u32   f; 
+} freg_t32;
+
+typedef struct
+{
+	unsigned int	fpc;
+	freg_t32	fprs[__NUM_FPRS];              
+} _s390_fp_regs32;
+
+typedef struct 
+{
+        __u32   mask;
+        __u32	addr;
+} _psw_t32 __attribute__ ((aligned(8)));
+
+#define PSW32_MASK_PER		0x40000000UL
+#define PSW32_MASK_DAT		0x04000000UL
+#define PSW32_MASK_IO		0x02000000UL
+#define PSW32_MASK_EXT		0x01000000UL
+#define PSW32_MASK_KEY		0x00F00000UL
+#define PSW32_MASK_MCHECK	0x00040000UL
+#define PSW32_MASK_WAIT		0x00020000UL
+#define PSW32_MASK_PSTATE	0x00010000UL
+#define PSW32_MASK_ASC		0x0000C000UL
+#define PSW32_MASK_CC		0x00003000UL
+#define PSW32_MASK_PM		0x00000f00UL
+
+#define PSW32_ADDR_AMODE31	0x80000000UL
+#define PSW32_ADDR_INSN		0x7FFFFFFFUL
+
+#define PSW32_BASE_BITS		0x00080000UL
+
+#define PSW32_ASC_PRIMARY	0x00000000UL
+#define PSW32_ASC_ACCREG	0x00004000UL
+#define PSW32_ASC_SECONDARY	0x00008000UL
+#define PSW32_ASC_HOME		0x0000C000UL
+
+#define PSW32_USER_BITS	(PSW32_BASE_BITS | PSW32_MASK_DAT | PSW32_ASC_HOME | \
+			 PSW32_MASK_IO | PSW32_MASK_EXT | PSW32_MASK_MCHECK | \
+			 PSW32_MASK_PSTATE)
+
+typedef struct
+{
+	_psw_t32	psw;
+	__u32		gprs[__NUM_GPRS];
+	__u32		acrs[__NUM_ACRS];
+} _s390_regs_common32;
+
+typedef struct
+{
+	_s390_regs_common32 regs;
+	_s390_fp_regs32     fpregs;
+} _sigregs32;
+
+#define _SIGCONTEXT_NSIG32	64
+#define _SIGCONTEXT_NSIG_BPW32	32
+#define __SIGNAL_FRAMESIZE32	96
+#define _SIGMASK_COPY_SIZE32	(sizeof(u32)*2)
+
+struct sigcontext32
+{
+	__u32	oldmask[_COMPAT_NSIG_WORDS];
+	__u32	sregs;				/* pointer */
+};
+
+/* asm/signal.h */
+struct sigaction32 {
+	__u32		sa_handler;		/* pointer */
+	__u32		sa_flags;
+        __u32		sa_restorer;		/* pointer */
+	compat_sigset_t	sa_mask;        /* mask last for extensibility */
+};
+
+typedef struct {
+	__u32			ss_sp;		/* pointer */
+	int			ss_flags;
+	compat_size_t		ss_size;
+} stack_t32;
+
+/* asm/ucontext.h */
+struct ucontext32 {
+	__u32			uc_flags;
+	__u32			uc_link;	/* pointer */	
+	stack_t32		uc_stack;
+	_sigregs32		uc_mcontext;
+	compat_sigset_t		uc_sigmask;	/* mask last for extensibility */
+};
+
+#endif /* _ASM_S390X_S390_H */
diff -Nru a/arch/s390/kernel/compat_ptrace.h b/arch/s390/kernel/compat_ptrace.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_ptrace.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,86 @@
+#ifndef _PTRACE32_H
+#define _PTRACE32_H
+
+#include "compat_linux.h"  /* needed for _psw_t32 */
+
+typedef struct
+{
+	__u32 cr[3];
+} per_cr_words32  __attribute__((packed));
+
+typedef struct
+{
+	__u16          perc_atmid;          /* 0x096 */
+	__u32          address;             /* 0x098 */
+	__u8           access_id;           /* 0x0a1 */
+} per_lowcore_words32  __attribute__((packed));
+
+typedef struct
+{
+	union {
+		per_cr_words32   words;
+	} control_regs  __attribute__((packed));
+	/*
+	 * Use these flags instead of setting em_instruction_fetch
+	 * directly they are used so that single stepping can be
+	 * switched on & off while not affecting other tracing
+	 */
+	unsigned  single_step       : 1;
+	unsigned  instruction_fetch : 1;
+	unsigned                    : 30;
+	/*
+	 * These addresses are copied into cr10 & cr11 if single
+	 * stepping is switched off
+	 */
+	__u32     starting_addr;
+	__u32     ending_addr;
+	union {
+		per_lowcore_words32 words;
+	} lowcore; 
+} per_struct32 __attribute__((packed));
+
+struct user_regs_struct32
+{
+	_psw_t32 psw;
+	u32 gprs[NUM_GPRS];
+	u32 acrs[NUM_ACRS];
+	u32 orig_gpr2;
+	s390_fp_regs fp_regs;
+	/*
+	 * These per registers are in here so that gdb can modify them
+	 * itself as there is no "official" ptrace interface for hardware
+	 * watchpoints. This is the way intel does it.
+	 */
+	per_struct32 per_info;
+	u32  ieee_instruction_pointer; 
+	/* Used to give failing instruction back to user for ieee exceptions */
+};
+
+struct user32 {
+	/* We start with the registers, to mimic the way that "memory"
+	   is returned from the ptrace(3,...) function.  */
+	struct user_regs_struct32 regs; /* Where the registers are actually stored */
+	/* The rest of this junk is to help gdb figure out what goes where */
+	u32 u_tsize;		/* Text segment size (pages). */
+	u32 u_dsize;	        /* Data segment size (pages). */
+	u32 u_ssize;	        /* Stack segment size (pages). */
+	u32 start_code;         /* Starting virtual address of text. */
+	u32 start_stack;	/* Starting virtual address of stack area.
+				   This is actually the bottom of the stack,
+				   the top of the stack is always found in the
+				   esp register.  */
+	s32 signal;     	 /* Signal that caused the core dump. */
+	u32 u_ar0;               /* Used by gdb to help find the values for */
+	                         /* the registers. */
+	u32 magic;		 /* To uniquely identify a core file */
+	char u_comm[32];	 /* User command that was responsible */
+};
+
+typedef struct
+{
+	__u32   len;
+	__u32   kernel_addr;
+	__u32   process_addr;
+} ptrace_area_emu31;
+
+#endif /* _PTRACE32_H */
diff -Nru a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_signal.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,644 @@
+/*
+ *  arch/s390/kernel/signal32.c
+ *
+ *  S390 version
+ *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
+ *               Gerhard Tonn (ton@de.ibm.com)                  
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *
+ *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
+ */
+
+#include <linux/config.h>
+#include <linux/compat.h>
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <linux/smp.h>
+#include <linux/smp_lock.h>
+#include <linux/kernel.h>
+#include <linux/signal.h>
+#include <linux/errno.h>
+#include <linux/wait.h>
+#include <linux/ptrace.h>
+#include <linux/unistd.h>
+#include <linux/stddef.h>
+#include <linux/tty.h>
+#include <linux/personality.h>
+#include <linux/binfmts.h>
+#include <asm/ucontext.h>
+#include <asm/uaccess.h>
+#include <asm/lowcore.h>
+#include "compat_linux.h"
+#include "compat_ptrace.h"
+
+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+
+typedef struct 
+{
+	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
+	struct sigcontext32 sc;
+	_sigregs32 sregs;
+	__u8 retcode[S390_SYSCALL_SIZE];
+} sigframe32;
+
+typedef struct 
+{
+	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
+	__u8 retcode[S390_SYSCALL_SIZE];
+	struct siginfo32 info;
+	struct ucontext32 uc;
+} rt_sigframe32;
+
+asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
+
+int do_signal32(struct pt_regs *regs, sigset_t *oldset);
+
+int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from)
+{
+	int err;
+
+	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
+		return -EFAULT;
+
+	/* 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.  
+	   This routine must convert siginfo from 64bit to 32bit as well
+	   at the same time.  */
+	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);
+	if (from->si_code < 0)
+		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
+	else {
+		switch (from->si_code >> 16) {
+		case __SI_KILL >> 16:
+			err |= __put_user(from->si_pid, &to->si_pid);
+			err |= __put_user(from->si_uid, &to->si_uid);
+			break;
+		case __SI_CHLD >> 16:
+			err |= __put_user(from->si_pid, &to->si_pid);
+			err |= __put_user(from->si_uid, &to->si_uid);
+			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);
+			break;
+		case __SI_FAULT >> 16:
+			err |= __put_user((unsigned long) from->si_addr,
+					  &to->si_addr);
+			break;
+		case __SI_POLL >> 16:
+		case __SI_TIMER >> 16:
+			err |= __put_user(from->si_band, &to->si_band);
+			err |= __put_user(from->si_fd, &to->si_fd);
+			break;
+		default:
+			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.
+ */
+asmlinkage int
+sys32_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask)
+{
+	sigset_t saveset;
+
+	mask &= _BLOCKABLE;
+	spin_lock_irq(&current->sighand->siglock);
+	saveset = current->blocked;
+	siginitset(&current->blocked, mask);
+	recalc_sigpending();
+	spin_unlock_irq(&current->sighand->siglock);
+	regs->gprs[2] = -EINTR;
+
+	while (1) {
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule();
+		if (do_signal32(regs, &saveset))
+			return -EINTR;
+	}
+}
+
+asmlinkage int
+sys32_rt_sigsuspend(struct pt_regs * regs,compat_sigset_t *unewset, size_t sigsetsize)
+{
+	sigset_t saveset, newset;
+	compat_sigset_t set32;
+
+	/* XXX: Don't preclude handling different sized sigset_t's.  */
+	if (sigsetsize != sizeof(sigset_t))
+		return -EINVAL;
+
+	if (copy_from_user(&set32, unewset, sizeof(set32)))
+		return -EFAULT;
+	switch (_NSIG_WORDS) {
+	case 4: newset.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
+	case 3: newset.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
+	case 2: newset.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
+	case 1: newset.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
+	}
+        sigdelsetmask(&newset, ~_BLOCKABLE);
+
+        spin_lock_irq(&current->sighand->siglock);
+        saveset = current->blocked;
+        current->blocked = newset;
+        recalc_sigpending();
+        spin_unlock_irq(&current->sighand->siglock);
+        regs->gprs[2] = -EINTR;
+
+        while (1) {
+                set_current_state(TASK_INTERRUPTIBLE);
+                schedule();
+                if (do_signal32(regs, &saveset))
+                        return -EINTR;
+        }
+}                                                         
+
+asmlinkage int
+sys32_sigaction(int sig, const struct old_sigaction32 *act,
+		 struct old_sigaction32 *oact)
+{
+        struct k_sigaction new_ka, old_ka;
+        int ret;
+
+        if (act) {
+		compat_old_sigset_t mask;
+		if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
+		    __get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler) ||
+		    __get_user((unsigned long)new_ka.sa.sa_restorer, &act->sa_restorer))
+			return -EFAULT;
+		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
+		__get_user(mask, &act->sa_mask);
+		siginitset(&new_ka.sa.sa_mask, mask);
+        }
+
+        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+
+	if (!ret && oact) {
+		if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
+		    __put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler) ||
+		    __put_user((unsigned long)old_ka.sa.sa_restorer, &oact->sa_restorer))
+			return -EFAULT;
+		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
+        }
+
+	return ret;
+}
+
+int
+do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact);
+
+asmlinkage long 
+sys32_rt_sigaction(int sig, const struct sigaction32 *act,
+	   struct sigaction32 *oact,  size_t sigsetsize)
+{
+	struct k_sigaction new_ka, old_ka;
+	int ret;
+	compat_sigset_t set32;
+
+	/* XXX: Don't preclude handling different sized sigset_t's.  */
+	if (sigsetsize != sizeof(compat_sigset_t))
+		return -EINVAL;
+
+	if (act) {
+		ret = get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler);
+		ret |= __copy_from_user(&set32, &act->sa_mask,
+					sizeof(compat_sigset_t));
+		switch (_NSIG_WORDS) {
+		case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
+				| (((long)set32.sig[7]) << 32);
+		case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
+				| (((long)set32.sig[5]) << 32);
+		case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
+				| (((long)set32.sig[3]) << 32);
+		case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
+				| (((long)set32.sig[1]) << 32);
+		}
+		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
+		
+		if (ret)
+			return -EFAULT;
+	}
+
+	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
+
+	if (!ret && oact) {
+		switch (_NSIG_WORDS) {
+		case 4:
+			set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
+			set32.sig[6] = old_ka.sa.sa_mask.sig[3];
+		case 3:
+			set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
+			set32.sig[4] = old_ka.sa.sa_mask.sig[2];
+		case 2:
+			set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
+			set32.sig[2] = old_ka.sa.sa_mask.sig[1];
+		case 1:
+			set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
+			set32.sig[0] = old_ka.sa.sa_mask.sig[0];
+		}
+		ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
+		ret |= __copy_to_user(&oact->sa_mask, &set32,
+				      sizeof(compat_sigset_t));
+		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
+	}
+
+	return ret;
+}
+
+asmlinkage int
+sys32_sigaltstack(const stack_t32 *uss, stack_t32 *uoss, struct pt_regs *regs)
+{
+	stack_t kss, koss;
+	int ret, err = 0;
+	mm_segment_t old_fs = get_fs();
+
+	if (uss) {
+		if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
+			return -EFAULT;
+		err |= __get_user((unsigned long) kss.ss_sp, &uss->ss_sp);
+		err |= __get_user(kss.ss_size, &uss->ss_size);
+		err |= __get_user(kss.ss_flags, &uss->ss_flags);
+		if (err)
+			return -EFAULT;
+	}
+
+	set_fs (KERNEL_DS);
+	ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, regs->gprs[15]);
+	set_fs (old_fs);
+
+	if (!ret && uoss) {
+		if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
+			return -EFAULT;
+		err |= __put_user((unsigned long) koss.ss_sp, &uoss->ss_sp);
+		err |= __put_user(koss.ss_size, &uoss->ss_size);
+		err |= __put_user(koss.ss_flags, &uoss->ss_flags);
+		if (err)
+			return -EFAULT;
+	}
+	return ret;
+}
+
+static int save_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
+{
+	_s390_regs_common32 regs32;
+	int err, i;
+
+	regs32.psw.mask = PSW32_USER_BITS |
+		((__u32)(regs->psw.mask >> 32) & PSW32_MASK_CC);
+	regs32.psw.addr = PSW32_ADDR_AMODE31 | (__u32) regs->psw.addr;
+	for (i = 0; i < NUM_GPRS; i++)
+		regs32.gprs[i] = (__u32) regs->gprs[i];
+	memcpy(regs32.acrs, regs->acrs, sizeof(regs32.acrs));
+	err = __copy_to_user(&sregs->regs, &regs32, sizeof(regs32));
+	if (err)
+		return err;
+	save_fp_regs(&current->thread.fp_regs);
+	/* s390_fp_regs and _s390_fp_regs32 are the same ! */
+	return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs,
+			      sizeof(_s390_fp_regs32));
+}
+
+static int restore_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
+{
+	_s390_regs_common32 regs32;
+	int err, i;
+
+	err = __copy_from_user(&regs32, &sregs->regs, sizeof(regs32));
+	if (err)
+		return err;
+	regs->psw.mask = PSW_USER32_BITS |
+		(__u64)(regs32.psw.mask & PSW32_MASK_CC) << 32;
+	regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
+	for (i = 0; i < NUM_GPRS; i++)
+		regs->gprs[i] = (__u64) regs32.gprs[i];
+	memcpy(regs->acrs, regs32.acrs, sizeof(regs32.acrs));
+
+	err = __copy_from_user(&current->thread.fp_regs, &sregs->fpregs,
+			       sizeof(_s390_fp_regs32));
+	current->thread.fp_regs.fpc &= FPC_VALID_MASK;
+	if (err)
+		return err;
+
+	restore_fp_regs(&current->thread.fp_regs);
+	regs->trap = -1;	/* disable syscall checks */
+	return 0;
+}
+
+asmlinkage long sys32_sigreturn(struct pt_regs *regs)
+{
+	sigframe32 *frame = (sigframe32 *)regs->gprs[15];
+	sigset_t set;
+
+	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+		goto badframe;
+	if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
+		goto badframe;
+
+	sigdelsetmask(&set, ~_BLOCKABLE);
+	spin_lock_irq(&current->sighand->siglock);
+	current->blocked = set;
+	recalc_sigpending();
+	spin_unlock_irq(&current->sighand->siglock);
+
+	if (restore_sigregs32(regs, &frame->sregs))
+		goto badframe;
+
+	return regs->gprs[2];
+
+badframe:
+	force_sig(SIGSEGV, current);
+	return 0;
+}	
+
+asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
+{
+	rt_sigframe32 *frame = (rt_sigframe32 *)regs->gprs[15];
+	sigset_t set;
+	stack_t st;
+	__u32 ss_sp;
+	int err;
+	mm_segment_t old_fs = get_fs();
+
+	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
+		goto badframe;
+	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
+		goto badframe;
+
+	sigdelsetmask(&set, ~_BLOCKABLE);
+	spin_lock_irq(&current->sighand->siglock);
+	current->blocked = set;
+	recalc_sigpending();
+	spin_unlock_irq(&current->sighand->siglock);
+
+	if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
+		goto badframe;
+
+	err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
+	st.ss_sp = (void *) A((unsigned long)ss_sp);
+	err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
+	err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
+	if (err)
+		goto badframe; 
+
+	/* It is more difficult to avoid calling this function than to
+	   call it and ignore errors.  */
+	set_fs (KERNEL_DS);   
+	do_sigaltstack(&st, NULL, regs->gprs[15]);
+	set_fs (old_fs);
+
+	return regs->gprs[2];
+
+badframe:
+        force_sig(SIGSEGV, current);
+        return 0;
+}	
+
+/*
+ * Set up a signal frame.
+ */
+
+
+/*
+ * Determine which stack to use..
+ */
+static inline void *
+get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
+{
+	unsigned long sp;
+
+	/* Default to using normal stack */
+	sp = (unsigned long) A(regs->gprs[15]);
+
+	/* This is the X/Open sanctioned signal stack switching.  */
+	if (ka->sa.sa_flags & SA_ONSTACK) {
+		if (! on_sig_stack(sp))
+			sp = current->sas_ss_sp + current->sas_ss_size;
+	}
+
+	/* This is the legacy signal stack switching. */
+	else if (!user_mode(regs) &&
+		 !(ka->sa.sa_flags & SA_RESTORER) &&
+		 ka->sa.sa_restorer) {
+		sp = (unsigned long) ka->sa.sa_restorer;
+	}
+
+	return (void *)((sp - frame_size) & -8ul);
+}
+
+static inline int map_signal(int sig)
+{
+	if (current_thread_info()->exec_domain
+	    && current_thread_info()->exec_domain->signal_invmap
+	    && sig < 32)
+		return current_thread_info()->exec_domain->signal_invmap[sig];
+        else
+		return sig;
+}
+
+static void setup_frame32(int sig, struct k_sigaction *ka,
+			sigset_t *set, struct pt_regs * regs)
+{
+	sigframe32 *frame = get_sigframe(ka, regs, sizeof(sigframe32));
+	if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
+		goto give_sigsegv;
+
+	if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
+		goto give_sigsegv;
+
+	if (save_sigregs32(regs, &frame->sregs))
+		goto give_sigsegv;
+	if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
+		goto give_sigsegv;
+
+	/* Set up to return from userspace.  If provided, use a stub
+	   already in userspace.  */
+	if (ka->sa.sa_flags & SA_RESTORER) {
+		regs->gprs[14] = (__u64) ka->sa.sa_restorer;
+	} else {
+		regs->gprs[14] = (__u64) frame->retcode;
+		if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
+		               (u16 *)(frame->retcode)))
+			goto give_sigsegv;
+        }
+
+	/* Set up backchain. */
+	if (__put_user(regs->gprs[15], (unsigned int *) frame))
+		goto give_sigsegv;
+
+	/* Set up registers for signal handler */
+	regs->gprs[15] = (__u64) frame;
+	regs->psw.addr = (__u64) ka->sa.sa_handler;
+	regs->psw.mask = PSW_USER32_BITS;
+
+	regs->gprs[2] = map_signal(sig);
+	regs->gprs[3] = (__u64) &frame->sc;
+
+	/* We forgot to include these in the sigcontext.
+	   To avoid breaking binary compatibility, they are passed as args. */
+	regs->gprs[4] = current->thread.trap_no;
+	regs->gprs[5] = current->thread.prot_addr;
+	return;
+
+give_sigsegv:
+	if (sig == SIGSEGV)
+		ka->sa.sa_handler = SIG_DFL;
+	force_sig(SIGSEGV, current);
+}
+
+static void setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
+			   sigset_t *set, struct pt_regs * regs)
+{
+	int err = 0;
+	rt_sigframe32 *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
+	if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
+		goto give_sigsegv;
+
+	if (copy_siginfo_to_user32(&frame->info, info))
+		goto give_sigsegv;
+
+	/* Create the ucontext.  */
+	err |= __put_user(0, &frame->uc.uc_flags);
+	err |= __put_user(0, &frame->uc.uc_link);
+	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
+	err |= __put_user(sas_ss_flags(regs->gprs[15]),
+	                  &frame->uc.uc_stack.ss_flags);
+	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+	err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
+	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.  */
+	if (ka->sa.sa_flags & SA_RESTORER) {
+		regs->gprs[14] = (__u64) ka->sa.sa_restorer;
+	} else {
+		regs->gprs[14] = (__u64) frame->retcode;
+		err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
+		                  (u16 *)(frame->retcode));
+	}
+
+	/* Set up backchain. */
+	if (__put_user(regs->gprs[15], (unsigned int *) frame))
+		goto give_sigsegv;
+
+	/* Set up registers for signal handler */
+	regs->gprs[15] = (__u64) frame;
+	regs->psw.addr = (__u64) ka->sa.sa_handler;
+	regs->psw.mask = PSW_USER32_BITS;
+
+	regs->gprs[2] = map_signal(sig);
+	regs->gprs[3] = (__u64) &frame->info;
+	regs->gprs[4] = (__u64) &frame->uc;
+	return;
+
+give_sigsegv:
+	if (sig == SIGSEGV)
+		ka->sa.sa_handler = SIG_DFL;
+	force_sig(SIGSEGV, current);
+}
+
+/*
+ * OK, we're invoking a handler
+ */	
+
+static void
+handle_signal32(unsigned long sig, siginfo_t *info, sigset_t *oldset,
+	struct pt_regs * regs)
+{
+	struct k_sigaction *ka = &current->sighand->action[sig-1];
+
+	/* Are we from a system call? */
+	if (regs->trap == __LC_SVC_OLD_PSW) {
+		/* If so, check system call restarting.. */
+		switch (regs->gprs[2]) {
+			case -ERESTARTNOHAND:
+				regs->gprs[2] = -EINTR;
+				break;
+
+			case -ERESTARTSYS:
+				if (!(ka->sa.sa_flags & SA_RESTART)) {
+					regs->gprs[2] = -EINTR;
+					break;
+				}
+			/* fallthrough */
+			case -ERESTARTNOINTR:
+				regs->gprs[2] = regs->orig_gpr2;
+				regs->psw.addr -= 2;
+		}
+	}
+
+	/* Set up the stack frame */
+	if (ka->sa.sa_flags & SA_SIGINFO)
+		setup_rt_frame32(sig, ka, info, oldset, regs);
+	else
+		setup_frame32(sig, ka, oldset, regs);
+
+	if (ka->sa.sa_flags & SA_ONESHOT)
+		ka->sa.sa_handler = SIG_DFL;
+
+	if (!(ka->sa.sa_flags & SA_NODEFER)) {
+		spin_lock_irq(&current->sighand->siglock);
+		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
+		sigaddset(&current->blocked,sig);
+		recalc_sigpending();
+		spin_unlock_irq(&current->sighand->siglock);
+	}
+}
+
+/*
+ * Note that 'init' is a special process: it doesn't get signals it doesn't
+ * want to handle. Thus you cannot kill init even with a SIGKILL even by
+ * mistake.
+ *
+ * Note that we go through the signals twice: once to check the signals that
+ * the kernel can handle, and then we build all the user-level signal handling
+ * stack-frames in one go after that.
+ */
+int do_signal32(struct pt_regs *regs, sigset_t *oldset)
+{
+	siginfo_t info;
+	int signr;
+
+	/*
+	 * We want the common case to go fast, which
+	 * is why we may in certain cases get here from
+	 * kernel mode. Just return without doing anything
+	 * if so.
+	 */
+	if (!user_mode(regs))
+		return 1;
+
+	if (!oldset)
+		oldset = &current->blocked;
+
+	signr = get_signal_to_deliver(&info, regs, NULL);
+	if (signr > 0) {
+		/* Whee!  Actually deliver the signal.  */
+		handle_signal32(signr, &info, oldset, regs);
+		return 1;
+	}
+
+	/* Did we come from a system call? */
+	if ( regs->trap == __LC_SVC_OLD_PSW /* System Call! */ ) {
+		/* Restart the system call - no handlers present */
+		if (regs->gprs[2] == -ERESTARTNOHAND ||
+		    regs->gprs[2] == -ERESTARTSYS ||
+		    regs->gprs[2] == -ERESTARTNOINTR) {
+			regs->gprs[2] = regs->orig_gpr2;
+			regs->psw.addr -= 2;
+		}
+	}
+	return 0;
+}
diff -Nru a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/compat_wrapper.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,1211 @@
+/*
+*  arch/s390/kernel/sys_wrapper31.S
+*    wrapper for 31 bit compatible system calls.
+*
+*  S390 version
+*    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+*    Author(s): Gerhard Tonn (ton@de.ibm.com),
+*/ 
+
+	.globl  sys32_exit_wrapper 
+sys32_exit_wrapper:
+	lgfr	%r2,%r2			# int
+	jg	sys_exit		# branch to sys_exit
+    
+	.globl  sys32_read_wrapper 
+sys32_read_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# char *
+	llgfr	%r4,%r4			# size_t
+	jg	sys32_read		# branch to sys_read
+
+	.globl  sys32_write_wrapper 
+sys32_write_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# const char *
+	llgfr	%r4,%r4			# size_t
+	jg	sys32_write		# branch to system call
+
+	.globl  sys32_open_wrapper 
+sys32_open_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# int
+	lgfr	%r4,%r4			# int
+	jg	sys_open		# branch to system call
+
+	.globl  sys32_close_wrapper 
+sys32_close_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	jg	sys_close		# branch to system call
+
+	.globl  sys32_creat_wrapper 
+sys32_creat_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# int
+	jg	sys_creat		# branch to system call
+
+	.globl  sys32_link_wrapper 
+sys32_link_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgtr	%r3,%r3			# const char *
+	jg	sys_link		# branch to system call
+
+	.globl  sys32_unlink_wrapper 
+sys32_unlink_wrapper:
+	llgtr	%r2,%r2			# const char *
+	jg	sys_unlink		# branch to system call
+
+	.globl  sys32_chdir_wrapper 
+sys32_chdir_wrapper:
+	llgtr	%r2,%r2			# const char *
+	jg	sys_chdir		# branch to system call
+
+	.globl  sys32_time_wrapper 
+sys32_time_wrapper:
+	llgtr	%r2,%r2			# int *
+	jg	sys_time		# branch to system call
+
+	.globl  sys32_mknod_wrapper 
+sys32_mknod_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# int 
+	llgfr	%r4,%r4			# dev
+	jg	sys_mknod		# branch to system call
+
+	.globl  sys32_chmod_wrapper 
+sys32_chmod_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgfr	%r3,%r3			# mode_t
+	jg	sys_chmod		# branch to system call
+
+	.globl  sys32_lchown16_wrapper 
+sys32_lchown16_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
+	llgfr	%r4,%r4			# __kernel_old_uid_emu31_t 
+	jg	sys32_lchown16		# branch to system call
+
+	.globl  sys32_lseek_wrapper 
+sys32_lseek_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	lgfr	%r3,%r3			# off_t
+	llgfr	%r4,%r4			# unsigned int
+	jg	sys_lseek		# branch to system call
+
+#sys32_getpid_wrapper				# void 
+
+	.globl  sys32_mount_wrapper 
+sys32_mount_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	llgtr	%r4,%r4			# char *
+	llgfr	%r5,%r5			# unsigned long
+	llgtr	%r6,%r6			# void *
+	jg	sys32_mount		# branch to system call
+
+	.globl  sys32_oldumount_wrapper 
+sys32_oldumount_wrapper:
+	llgtr	%r2,%r2			# char *
+	jg	sys_oldumount		# branch to system call
+
+	.globl  sys32_setuid16_wrapper 
+sys32_setuid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
+	jg	sys32_setuid16		# branch to system call
+
+#sys32_getuid16_wrapper			# void 
+
+	.globl  sys32_ptrace_wrapper 
+sys32_ptrace_wrapper:
+	lgfr	%r2,%r2			# long
+	lgfr	%r3,%r3			# long
+	llgtr	%r4,%r4			# long
+	llgfr	%r5,%r5			# long
+	jg	sys_ptrace		# branch to system call
+
+	.globl  sys32_alarm_wrapper 
+sys32_alarm_wrapper:
+	llgtr	%r2,%r2			# unsigned int
+	jg	sys_alarm		# branch to system call
+
+#sys32_pause_wrapper			# void 
+
+	.globl  compat_sys_utime_wrapper 
+compat_sys_utime_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# struct compat_utimbuf *
+	jg	compat_sys_utime		# branch to system call
+
+	.globl  sys32_access_wrapper 
+sys32_access_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# int
+	jg	sys_access		# branch to system call
+
+	.globl  sys32_nice_wrapper 
+sys32_nice_wrapper:
+	lgfr	%r2,%r2			# int
+	jg	sys_nice		# branch to system call
+
+#sys32_sync_wrapper			# void 
+
+	.globl  sys32_kill_wrapper 
+sys32_kill_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# int
+	jg	sys_kill		# branch to system call
+
+	.globl  sys32_rename_wrapper 
+sys32_rename_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgtr	%r3,%r3			# const char *
+	jg	sys_rename		# branch to system call
+
+	.globl  sys32_mkdir_wrapper 
+sys32_mkdir_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# int
+	jg	sys_mkdir		# branch to system call
+
+	.globl  sys32_rmdir_wrapper 
+sys32_rmdir_wrapper:
+	llgtr	%r2,%r2			# const char *
+	jg	sys_rmdir		# branch to system call
+
+	.globl  sys32_dup_wrapper 
+sys32_dup_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	jg	sys_dup			# branch to system call
+
+	.globl  sys32_pipe_wrapper 
+sys32_pipe_wrapper:
+	llgtr	%r2,%r2			# u32 *
+	jg	sys_pipe		# branch to system call
+
+	.globl  compat_sys_times_wrapper 
+compat_sys_times_wrapper:
+	llgtr	%r2,%r2			# struct compat_tms *
+	jg	compat_sys_times	# branch to system call
+
+	.globl  sys32_brk_wrapper 
+sys32_brk_wrapper:
+	llgtr	%r2,%r2			# unsigned long
+	jg	sys_brk			# branch to system call
+
+	.globl  sys32_setgid16_wrapper 
+sys32_setgid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
+	jg	sys32_setgid16		# branch to system call
+
+#sys32_getgid16_wrapper			# void 
+
+	.globl sys32_signal_wrapper
+sys32_signal_wrapper:
+	lgfr	%r2,%r2			# int 
+	llgfr	%r3,%r3			# __sighandler_t 
+	jg	sys_signal
+
+#sys32_geteuid16_wrapper		# void 
+
+#sys32_getegid16_wrapper		# void 
+
+	.globl  sys32_acct_wrapper 
+sys32_acct_wrapper:
+	llgtr	%r2,%r2			# char *
+	jg	sys_acct		# branch to system call
+
+	.globl  sys32_umount_wrapper 
+sys32_umount_wrapper:
+	llgtr	%r2,%r2			# char *
+	lgfr	%r3,%r3			# int
+	jg	sys_umount		# branch to system call
+
+	.globl  sys32_ioctl_wrapper 
+sys32_ioctl_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# unsigned int
+	llgfr	%r4,%r4			# unsigned int
+	jg	sys32_ioctl		# branch to system call
+
+	.globl  compat_sys_fcntl_wrapper 
+compat_sys_fcntl_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# unsigned int 
+	llgfr	%r4,%r4			# unsigned long
+	jg	compat_sys_fcntl	# branch to system call
+
+	.globl  sys32_setpgid_wrapper 
+sys32_setpgid_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	lgfr	%r3,%r3			# pid_t
+	jg	sys_setpgid		# branch to system call
+
+	.globl  sys32_umask_wrapper 
+sys32_umask_wrapper:
+	lgfr	%r3,%r3			# int
+	jg	sys_umask		# branch to system call
+
+	.globl  sys32_chroot_wrapper 
+sys32_chroot_wrapper:
+	llgtr	%r2,%r2			# char *
+	jg	sys_chroot		# branch to system call
+
+	.globl sys32_ustat_wrapper
+sys32_ustat_wrapper:
+	llgfr	%r2,%r2			# dev_t 
+	llgtr	%r3,%r3			# struct ustat *
+	jg	sys_ustat
+
+	.globl  sys32_dup2_wrapper 
+sys32_dup2_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# unsigned int
+	jg	sys_dup2		# branch to system call
+
+#sys32_getppid_wrapper			# void 
+
+#sys32_getpgrp_wrapper			# void 
+
+#sys32_setsid_wrapper			# void 
+
+	.globl  sys32_sigaction_wrapper
+sys32_sigaction_wrapper:
+	lgfr	%r2,%r2			# int 
+	llgtr	%r3,%r3			# const struct old_sigaction *
+	jg	sys32_sigaction		# branch to system call
+
+	.globl  sys32_setreuid16_wrapper 
+sys32_setreuid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
+	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
+	jg	sys32_setreuid16	# branch to system call
+
+	.globl  sys32_setregid16_wrapper 
+sys32_setregid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
+	llgfr	%r3,%r3			# __kernel_old_gid_emu31_t 
+	jg	sys32_setregid16	# branch to system call
+
+#sys32_sigsuspend_wrapper		# done in sigsuspend_glue 
+
+	.globl  compat_sys_sigpending_wrapper 
+compat_sys_sigpending_wrapper:
+	llgtr	%r2,%r2			# compat_old_sigset_t *
+	jg	compat_sys_sigpending	# branch to system call
+
+	.globl  sys32_sethostname_wrapper 
+sys32_sethostname_wrapper:
+	llgtr	%r2,%r2			# char *
+	lgfr	%r3,%r3			# int
+	jg	sys_sethostname		# branch to system call
+
+	.globl  compat_sys_setrlimit_wrapper 
+compat_sys_setrlimit_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# struct rlimit_emu31 *
+	jg	compat_sys_setrlimit	# branch to system call
+
+	.globl  compat_sys_old_getrlimit_wrapper 
+compat_sys_old_getrlimit_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# struct rlimit_emu31 *
+	jg	compat_sys_old_getrlimit # branch to system call
+
+	.globl  compat_sys_getrlimit_wrapper 
+compat_sys_getrlimit_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# struct rlimit_emu31 *
+	jg	compat_sys_getrlimit	# branch to system call
+
+	.globl  sys32_mmap2_wrapper 
+sys32_mmap2_wrapper:
+	llgtr	%r2,%r2			# struct mmap_arg_struct_emu31 *
+	jg	sys32_mmap2			# branch to system call
+
+	.globl  compat_sys_getrusage_wrapper 
+compat_sys_getrusage_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# struct rusage_emu31 *
+	jg	compat_sys_getrusage	# branch to system call
+
+	.globl  sys32_gettimeofday_wrapper 
+sys32_gettimeofday_wrapper:
+	llgtr	%r2,%r2			# struct timeval_emu31 *
+	llgtr	%r3,%r3			# struct timezone *
+	jg	sys32_gettimeofday	# branch to system call
+
+	.globl  sys32_settimeofday_wrapper 
+sys32_settimeofday_wrapper:
+	llgtr	%r2,%r2			# struct timeval_emu31 *
+	llgtr	%r3,%r3			# struct timezone *
+	jg	sys32_settimeofday	# branch to system call
+
+	.globl  sys32_getgroups16_wrapper 
+sys32_getgroups16_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# __kernel_old_gid_emu31_t *
+	jg	sys32_getgroups16	# branch to system call
+
+	.globl  sys32_setgroups16_wrapper 
+sys32_setgroups16_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# __kernel_old_gid_emu31_t *
+	jg	sys32_setgroups16	# branch to system call
+
+	.globl  sys32_symlink_wrapper 
+sys32_symlink_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgtr	%r3,%r3			# const char *
+	jg	sys_symlink		# branch to system call
+
+	.globl  sys32_readlink_wrapper 
+sys32_readlink_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgtr	%r3,%r3			# char *
+	lgfr	%r4,%r4			# int
+	jg	sys_readlink		# branch to system call
+
+	.globl  sys32_uselib_wrapper 
+sys32_uselib_wrapper:
+	llgtr	%r2,%r2			# const char *
+	jg	sys_uselib		# branch to system call
+
+	.globl  sys32_swapon_wrapper 
+sys32_swapon_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# int
+	jg	sys_swapon		# branch to system call
+
+	.globl  sys32_reboot_wrapper 
+sys32_reboot_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# int
+	llgfr	%r4,%r4			# unsigned int
+	llgtr	%r5,%r5			# void *
+	jg	sys_reboot		# branch to system call
+
+	.globl  old32_readdir_wrapper 
+old32_readdir_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# void *
+	llgfr	%r4,%r4			# unsigned int
+	jg	old32_readdir		# branch to system call
+
+	.globl  old32_mmap_wrapper 
+old32_mmap_wrapper:
+	llgtr	%r2,%r2			# struct mmap_arg_struct_emu31 *
+	jg	old32_mmap		# branch to system call
+
+	.globl  sys32_munmap_wrapper 
+sys32_munmap_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# size_t 
+	jg	sys_munmap		# branch to system call
+
+	.globl  sys32_truncate_wrapper 
+sys32_truncate_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgfr	%r3,%r3			# unsigned long
+	jg	sys_truncate		# branch to system call
+
+	.globl  sys32_ftruncate_wrapper 
+sys32_ftruncate_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# unsigned long
+	jg	sys_ftruncate		# branch to system call
+
+	.globl  sys32_fchmod_wrapper 
+sys32_fchmod_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# mode_t
+	jg	sys_fchmod		# branch to system call
+
+	.globl  sys32_fchown16_wrapper 
+sys32_fchown16_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# __kernel_old_uid_emu31_t *
+	llgtr	%r4,%r4			# __kernel_old_gid_emu31_t *
+	jg	sys32_fchown16		# branch to system call
+
+	.globl  sys32_getpriority_wrapper 
+sys32_getpriority_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# int
+	jg	sys_getpriority		# branch to system call
+
+	.globl  sys32_setpriority_wrapper 
+sys32_setpriority_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# int
+	lgfr	%r4,%r4			# int
+	jg	sys_setpriority		# branch to system call
+
+	.globl  compat_sys_statfs_wrapper 
+compat_sys_statfs_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# struct compat_statfs *
+	jg	compat_sys_statfs	# branch to system call
+
+	.globl  compat_sys_fstatfs_wrapper 
+compat_sys_fstatfs_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# struct compat_statfs *
+	jg	compat_sys_fstatfs	# branch to system call
+
+	.globl  compat_sys_socketcall_wrapper 
+compat_sys_socketcall_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# u32 *
+	jg	compat_sys_socketcall	# branch to system call
+
+	.globl  sys32_syslog_wrapper 
+sys32_syslog_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# char *
+	lgfr	%r4,%r4			# int
+	jg	sys_syslog		# branch to system call
+
+	.globl  compat_sys_setitimer_wrapper 
+compat_sys_setitimer_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# struct itimerval_emu31 *
+	llgtr	%r4,%r4			# struct itimerval_emu31 *
+	jg	compat_sys_setitimer	# branch to system call
+
+	.globl  compat_sys_getitimer_wrapper 
+compat_sys_getitimer_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# struct itimerval_emu31 *
+	jg	compat_sys_getitimer	# branch to system call
+
+	.globl  compat_sys_newstat_wrapper 
+compat_sys_newstat_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# struct stat_emu31 *
+	jg	compat_sys_newstat	# branch to system call
+
+	.globl  compat_sys_newlstat_wrapper 
+compat_sys_newlstat_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# struct stat_emu31 *
+	jg	compat_sys_newlstat	# branch to system call
+
+	.globl  compat_sys_newfstat_wrapper 
+compat_sys_newfstat_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# struct stat_emu31 *
+	jg	compat_sys_newfstat	# branch to system call
+
+#sys32_vhangup_wrapper			# void 
+
+	.globl  compat_sys_wait4_wrapper 
+compat_sys_wait4_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	llgtr	%r3,%r3			# unsigned int *
+	lgfr	%r4,%r4			# int
+	llgtr	%r5,%r5			# struct rusage *
+	jg	compat_sys_wait4	# branch to system call
+
+	.globl  sys32_swapoff_wrapper 
+sys32_swapoff_wrapper:
+	llgtr	%r2,%r2			# const char *
+	jg	sys_swapoff		# branch to system call
+
+	.globl  sys32_sysinfo_wrapper 
+sys32_sysinfo_wrapper:
+	llgtr	%r2,%r2			# struct sysinfo_emu31 *
+	jg	sys32_sysinfo		# branch to system call
+
+	.globl  sys32_ipc_wrapper 
+sys32_ipc_wrapper:
+	llgfr	%r2,%r2			# uint
+	lgfr	%r3,%r3			# int
+	lgfr	%r4,%r4			# int
+	lgfr	%r5,%r5			# int
+	llgtr	%r6,%r6			# void *
+	jg	sys32_ipc		# branch to system call
+
+	.globl  sys32_fsync_wrapper 
+sys32_fsync_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	jg	sys_fsync		# branch to system call
+
+#sys32_sigreturn_wrapper		# done in sigreturn_glue 
+
+#sys32_clone_wrapper			# done in clone_glue 
+
+	.globl  sys32_setdomainname_wrapper 
+sys32_setdomainname_wrapper:
+	llgtr	%r2,%r2			# char *
+	lgfr	%r3,%r3			# int
+	jg	sys_setdomainname	# branch to system call
+
+	.globl  sys32_newuname_wrapper 
+sys32_newuname_wrapper:
+	llgtr	%r2,%r2			# struct new_utsname *
+	jg	s390x_newuname		# branch to system call
+
+	.globl  sys32_adjtimex_wrapper 
+sys32_adjtimex_wrapper:
+	llgtr	%r2,%r2			# struct timex_emu31 *
+	jg	sys32_adjtimex		# branch to system call
+
+	.globl  sys32_mprotect_wrapper 
+sys32_mprotect_wrapper:
+	llgtr	%r2,%r2			# unsigned long (actually pointer
+	llgfr	%r3,%r3			# size_t
+	llgfr	%r4,%r4			# unsigned long
+	jg	sys_mprotect		# branch to system call
+
+	.globl  compat_sys_sigprocmask_wrapper 
+compat_sys_sigprocmask_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# compat_old_sigset_t *
+	llgtr	%r4,%r4			# compat_old_sigset_t *
+	jg	compat_sys_sigprocmask		# branch to system call
+
+	.globl  sys32_init_module_wrapper 
+sys32_init_module_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgtr	%r3,%r3			# struct module *
+	jg	sys32_init_module	# branch to system call
+
+	.globl  sys32_delete_module_wrapper 
+sys32_delete_module_wrapper:
+	llgtr	%r2,%r2			# const char *
+	jg	sys32_delete_module	# branch to system call
+
+	.globl  sys32_quotactl_wrapper 
+sys32_quotactl_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# const char *
+	lgfr	%r4,%r4			# int
+	llgtr	%r5,%r5			# caddr_t
+	jg	sys_quotactl		# branch to system call
+
+	.globl  sys32_getpgid_wrapper 
+sys32_getpgid_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	jg	sys_getpgid		# branch to system call
+
+	.globl  sys32_fchdir_wrapper 
+sys32_fchdir_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	jg	sys_fchdir		# branch to system call
+
+	.globl  sys32_bdflush_wrapper 
+sys32_bdflush_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# long
+	jg	sys_bdflush		# branch to system call
+
+	.globl  sys32_sysfs_wrapper 
+sys32_sysfs_wrapper:
+	lgfr	%r2,%r2			# int
+	llgfr	%r3,%r3			# unsigned long
+	llgfr	%r4,%r4			# unsigned long
+	jg	sys_sysfs		# branch to system call
+
+	.globl  sys32_personality_wrapper 
+sys32_personality_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	jg	s390x_personality	# branch to system call
+
+	.globl  sys32_setfsuid16_wrapper 
+sys32_setfsuid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
+	jg	sys32_setfsuid16	# branch to system call
+
+	.globl  sys32_setfsgid16_wrapper 
+sys32_setfsgid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
+	jg	sys32_setfsgid16	# branch to system call
+
+	.globl  sys32_llseek_wrapper 
+sys32_llseek_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# unsigned long
+	llgfr	%r4,%r4			# unsigned long
+	llgtr	%r5,%r5			# loff_t *
+	llgfr	%r6,%r6			# unsigned int
+	jg	sys_llseek		# branch to system call
+
+	.globl  sys32_getdents_wrapper 
+sys32_getdents_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# void *
+	llgfr	%r4,%r4			# unsigned int
+	jg	sys32_getdents		# branch to system call
+
+	.globl  sys32_select_wrapper 
+sys32_select_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# fd_set *
+	llgtr	%r4,%r4			# fd_set *
+	llgtr	%r5,%r5			# fd_set *
+	llgtr	%r6,%r6			# struct timeval_emu31 *
+	jg	sys32_select		# branch to system call
+
+	.globl  sys32_flock_wrapper 
+sys32_flock_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# unsigned int
+	jg	sys_flock		# branch to system call
+
+	.globl  sys32_msync_wrapper 
+sys32_msync_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# size_t
+	lgfr	%r4,%r4			# int
+	jg	sys_msync		# branch to system call
+
+	.globl  sys32_readv_wrapper 
+sys32_readv_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgtr	%r3,%r3			# const struct iovec_emu31 *
+	llgfr	%r4,%r4			# unsigned long
+	jg	sys32_readv		# branch to system call
+
+	.globl  sys32_writev_wrapper 
+sys32_writev_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgtr	%r3,%r3			# const struct iovec_emu31 *
+	llgfr	%r4,%r4			# unsigned long
+	jg	sys32_writev		# branch to system call
+
+	.globl  sys32_getsid_wrapper 
+sys32_getsid_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	jg	sys_getsid		# branch to system call
+
+	.globl  sys32_fdatasync_wrapper 
+sys32_fdatasync_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	jg	sys_fdatasync		# branch to system call
+
+#sys32_sysctl_wrapper			# tbd 
+
+	.globl  sys32_mlock_wrapper 
+sys32_mlock_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# size_t
+	jg	sys_mlock		# branch to system call
+
+	.globl  sys32_munlock_wrapper 
+sys32_munlock_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# size_t
+	jg	sys_munlock		# branch to system call
+
+	.globl  sys32_mlockall_wrapper 
+sys32_mlockall_wrapper:
+	lgfr	%r2,%r2			# int
+	jg	sys_mlockall		# branch to system call
+
+#sys32_munlockall_wrapper		# void 
+
+	.globl  sys32_sched_setparam_wrapper 
+sys32_sched_setparam_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	llgtr	%r3,%r3			# struct sched_param *
+	jg	sys_sched_setparam	# branch to system call
+
+	.globl  sys32_sched_getparam_wrapper 
+sys32_sched_getparam_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	llgtr	%r3,%r3			# struct sched_param *
+	jg	sys_sched_getparam	# branch to system call
+
+	.globl  sys32_sched_setscheduler_wrapper 
+sys32_sched_setscheduler_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	lgfr	%r3,%r3			# int
+	llgtr	%r4,%r4			# struct sched_param *
+	jg	sys_sched_setscheduler	# branch to system call
+
+	.globl  sys32_sched_getscheduler_wrapper 
+sys32_sched_getscheduler_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	jg	sys_sched_getscheduler	# branch to system call
+
+#sys32_sched_yield_wrapper		# void 
+
+	.globl  sys32_sched_get_priority_max_wrapper 
+sys32_sched_get_priority_max_wrapper:
+	lgfr	%r2,%r2			# int
+	jg	sys_sched_get_priority_max	# branch to system call
+
+	.globl  sys32_sched_get_priority_min_wrapper 
+sys32_sched_get_priority_min_wrapper:
+	lgfr	%r2,%r2			# int
+	jg	sys_sched_get_priority_min	# branch to system call
+
+	.globl  sys32_sched_rr_get_interval_wrapper 
+sys32_sched_rr_get_interval_wrapper:
+	lgfr	%r2,%r2			# pid_t
+	llgtr	%r3,%r3			# struct compat_timespec *
+	jg	sys32_sched_rr_get_interval	# branch to system call
+
+	.globl  compat_sys_nanosleep_wrapper 
+compat_sys_nanosleep_wrapper:
+	llgtr	%r2,%r2			# struct compat_timespec *
+	llgtr	%r3,%r3			# struct compat_timespec *
+	jg	compat_sys_nanosleep		# branch to system call
+
+	.globl  sys32_mremap_wrapper 
+sys32_mremap_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# unsigned long
+	llgfr	%r4,%r4			# unsigned long
+	llgfr	%r5,%r5			# unsigned long
+	llgfr	%r6,%r6			# unsigned long
+	jg	sys_mremap		# branch to system call
+
+	.globl  sys32_setresuid16_wrapper 
+sys32_setresuid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
+	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
+	llgfr	%r4,%r4			# __kernel_old_uid_emu31_t 
+	jg	sys32_setresuid16	# branch to system call
+
+	.globl  sys32_getresuid16_wrapper 
+sys32_getresuid16_wrapper:
+	llgtr	%r2,%r2			# __kernel_old_uid_emu31_t *
+	llgtr	%r3,%r3			# __kernel_old_uid_emu31_t *
+	llgtr	%r4,%r4			# __kernel_old_uid_emu31_t *
+	jg	sys32_getresuid16	# branch to system call
+
+	.globl  sys32_poll_wrapper 
+sys32_poll_wrapper:
+	llgtr	%r2,%r2			# struct pollfd * 
+	llgfr	%r3,%r3			# unsigned int 
+	lgfr	%r4,%r4			# long 
+	jg	sys_poll		# branch to system call
+
+	.globl  sys32_nfsservctl_wrapper 
+sys32_nfsservctl_wrapper:
+	lgfr	%r2,%r2			# int 
+	llgtr	%r3,%r3			# struct nfsctl_arg_emu31 * 
+	llgtr	%r4,%r4			# union nfsctl_res_emu31 * 
+	jg	sys32_nfsservctl	# branch to system call
+
+	.globl  sys32_setresgid16_wrapper 
+sys32_setresgid16_wrapper:
+	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
+	llgfr	%r3,%r3			# __kernel_old_gid_emu31_t 
+	llgfr	%r4,%r4			# __kernel_old_gid_emu31_t 
+	jg	sys32_setresgid16	# branch to system call
+
+	.globl  sys32_getresgid16_wrapper 
+sys32_getresgid16_wrapper:
+	llgtr	%r2,%r2			# __kernel_old_gid_emu31_t *
+	llgtr	%r3,%r3			# __kernel_old_gid_emu31_t *
+	llgtr	%r4,%r4			# __kernel_old_gid_emu31_t *
+	jg	sys32_getresgid16	# branch to system call
+
+	.globl  sys32_prctl_wrapper 
+sys32_prctl_wrapper:
+	lgfr	%r2,%r2			# int
+	llgfr	%r3,%r3			# unsigned long
+	llgfr	%r4,%r4			# unsigned long
+	llgfr	%r5,%r5			# unsigned long
+	llgfr	%r6,%r6			# unsigned long
+	jg	sys_prctl		# branch to system call
+
+#sys32_rt_sigreturn_wrapper		# done in rt_sigreturn_glue 
+
+	.globl  sys32_rt_sigaction_wrapper 
+sys32_rt_sigaction_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# const struct sigaction_emu31 *
+	llgtr	%r4,%r4			# const struct sigaction_emu31 *
+	llgfr	%r5,%r5			# size_t
+	jg	sys32_rt_sigaction	# branch to system call
+
+	.globl  sys32_rt_sigprocmask_wrapper 
+sys32_rt_sigprocmask_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# old_sigset_emu31 *
+	llgtr	%r4,%r4			# old_sigset_emu31 *
+	jg	sys32_rt_sigprocmask	# branch to system call
+
+	.globl  sys32_rt_sigpending_wrapper 
+sys32_rt_sigpending_wrapper:
+	llgtr	%r2,%r2			# sigset_emu31 *
+	llgfr	%r3,%r3			# size_t
+	jg	sys32_rt_sigpending	# branch to system call
+
+	.globl  sys32_rt_sigtimedwait_wrapper 
+sys32_rt_sigtimedwait_wrapper:
+	llgtr	%r2,%r2			# const sigset_emu31_t *
+	llgtr	%r3,%r3			# siginfo_emu31_t *
+	llgtr	%r4,%r4			# const struct compat_timespec *
+	llgfr	%r5,%r5			# size_t
+	jg	sys32_rt_sigtimedwait	# branch to system call
+
+	.globl  sys32_rt_sigqueueinfo_wrapper 
+sys32_rt_sigqueueinfo_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# int
+	llgtr	%r4,%r4			# siginfo_emu31_t *
+	jg	sys32_rt_sigqueueinfo	# branch to system call
+
+#sys32_rt_sigsuspend_wrapper		# done in rt_sigsuspend_glue 
+
+	.globl  sys32_pread64_wrapper 
+sys32_pread64_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# char *
+	llgfr	%r4,%r4			# size_t
+	llgfr	%r5,%r5			# u32
+	llgfr	%r6,%r6			# u32
+	jg	sys32_pread64		# branch to system call
+
+	.globl  sys32_pwrite64_wrapper 
+sys32_pwrite64_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# const char *
+	llgfr	%r4,%r4			# size_t
+	llgfr	%r5,%r5			# u32
+	llgfr	%r6,%r6			# u32
+	jg	sys32_pwrite64		# branch to system call
+
+	.globl  sys32_chown16_wrapper 
+sys32_chown16_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
+	llgfr	%r4,%r4			# __kernel_old_gid_emu31_t 
+	jg	sys32_chown16		# branch to system call
+
+	.globl  sys32_getcwd_wrapper 
+sys32_getcwd_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgfr	%r3,%r3			# unsigned long
+	jg	sys_getcwd		# branch to system call
+
+	.globl  sys32_capget_wrapper 
+sys32_capget_wrapper:
+	llgtr	%r2,%r2			# cap_user_header_t
+	llgtr	%r3,%r3			# cap_user_data_t
+	jg	sys_capget		# branch to system call
+
+	.globl  sys32_capset_wrapper 
+sys32_capset_wrapper:
+	llgtr	%r2,%r2			# cap_user_header_t
+	llgtr	%r3,%r3			# const cap_user_data_t
+	jg	sys_capset		# branch to system call
+
+	.globl sys32_sigaltstack_wrapper
+sys32_sigaltstack_wrapper:
+	llgtr	%r2,%r2			# const stack_emu31_t * 
+	llgtr	%r3,%r3			# stack_emu31_t * 
+	jg	sys32_sigaltstack
+
+	.globl  sys32_sendfile_wrapper 
+sys32_sendfile_wrapper:
+	lgfr	%r2,%r2			# int
+	lgfr	%r3,%r3			# int
+	llgtr	%r4,%r4			# __kernel_off_emu31_t *
+	llgfr	%r5,%r5			# size_t
+	jg	sys32_sendfile		# branch to system call
+
+#sys32_vfork_wrapper			# done in vfork_glue 
+
+	.globl  sys32_truncate64_wrapper 
+sys32_truncate64_wrapper:
+	llgtr	%r2,%r2			# const char *
+	lgfr	%r3,%r3			# s32 
+	llgfr	%r4,%r4			# u32 
+	jg	sys32_truncate64	# branch to system call
+
+	.globl  sys32_ftruncate64_wrapper 
+sys32_ftruncate64_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	lgfr	%r3,%r3			# s32 
+	llgfr	%r4,%r4			# u32 
+	jg	sys32_ftruncate64	# branch to system call
+
+	.globl sys32_lchown_wrapper	
+sys32_lchown_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgfr	%r3,%r3			# uid_t
+	llgfr	%r4,%r4			# gid_t
+	jg	sys_lchown		# branch to system call
+
+#sys32_getuid_wrapper			# void			 
+#sys32_getgid_wrapper			# void 
+#sys32_geteuid_wrapper			# void 
+#sys32_getegid_wrapper			# void 
+
+	.globl sys32_setreuid_wrapper
+sys32_setreuid_wrapper:
+	llgfr	%r2,%r2			# uid_t
+	llgfr	%r3,%r3			# uid_t
+	jg	sys_setreuid		# branch to system call
+
+	.globl sys32_setregid_wrapper
+sys32_setregid_wrapper:
+	llgfr	%r2,%r2			# gid_t
+	llgfr	%r3,%r3			# gid_t
+	jg	sys_setregid		# branch to system call
+
+	.globl  sys32_getgroups_wrapper 
+sys32_getgroups_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# gid_t *
+	jg	sys_getgroups		# branch to system call
+
+	.globl  sys32_setgroups_wrapper 
+sys32_setgroups_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# gid_t *
+	jg	sys_setgroups		# branch to system call
+
+	.globl sys32_fchown_wrapper	
+sys32_fchown_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# uid_t
+	llgfr	%r4,%r4			# gid_t
+	jg	sys_fchown		# branch to system call
+
+	.globl sys32_setresuid_wrapper	
+sys32_setresuid_wrapper:
+	llgfr	%r2,%r2			# uid_t
+	llgfr	%r3,%r3			# uid_t
+	llgfr	%r4,%r4			# uid_t
+	jg	sys_setresuid		# branch to system call
+
+	.globl sys32_getresuid_wrapper	
+sys32_getresuid_wrapper:
+	llgtr	%r2,%r2			# uid_t *
+	llgtr	%r3,%r3			# uid_t *
+	llgtr	%r4,%r4			# uid_t *
+	jg	sys_getresuid		# branch to system call
+
+	.globl sys32_setresgid_wrapper	
+sys32_setresgid_wrapper:
+	llgfr	%r2,%r2			# gid_t
+	llgfr	%r3,%r3			# gid_t
+	llgfr	%r4,%r4			# gid_t
+	jg	sys_setresgid		# branch to system call
+
+	.globl sys32_getresgid_wrapper	
+sys32_getresgid_wrapper:
+	llgtr	%r2,%r2			# gid_t *
+	llgtr	%r3,%r3			# gid_t *
+	llgtr	%r4,%r4			# gid_t *
+	jg	sys_getresgid		# branch to system call
+
+	.globl sys32_chown_wrapper	
+sys32_chown_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgfr	%r3,%r3			# uid_t
+	llgfr	%r4,%r4			# gid_t
+	jg	sys_chown		# branch to system call
+
+	.globl sys32_setuid_wrapper	
+sys32_setuid_wrapper:
+	llgfr	%r2,%r2			# uid_t
+	jg	sys_setuid		# branch to system call
+
+	.globl sys32_setgid_wrapper	
+sys32_setgid_wrapper:
+	llgfr	%r2,%r2			# gid_t
+	jg	sys_setgid		# branch to system call
+
+	.globl sys32_setfsuid_wrapper	
+sys32_setfsuid_wrapper:
+	llgfr	%r2,%r2			# uid_t
+	jg	sys_setfsuid		# branch to system call
+
+	.globl sys32_setfsgid_wrapper	
+sys32_setfsgid_wrapper:
+	llgfr	%r2,%r2			# gid_t
+	jg	sys_setfsgid		# branch to system call
+
+	.globl  sys32_pivot_root_wrapper 
+sys32_pivot_root_wrapper:
+	llgtr	%r2,%r2			# const char *
+	llgtr	%r3,%r3			# const char *
+	jg	sys_pivot_root		# branch to system call
+
+	.globl  sys32_mincore_wrapper 
+sys32_mincore_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# size_t
+	llgtr	%r4,%r4			# unsigned char *
+	jg	sys_mincore		# branch to system call
+
+	.globl  sys32_madvise_wrapper 
+sys32_madvise_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# size_t
+	lgfr	%r4,%r4			# int
+	jg	sys_madvise		# branch to system call
+
+	.globl  sys32_getdents64_wrapper 
+sys32_getdents64_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgtr	%r3,%r3			# void *
+	llgfr	%r4,%r4			# unsigned int
+	jg	sys_getdents64		# branch to system call
+
+	.globl  compat_sys_fcntl64_wrapper 
+compat_sys_fcntl64_wrapper:
+	llgfr	%r2,%r2			# unsigned int
+	llgfr	%r3,%r3			# unsigned int 
+	llgfr	%r4,%r4			# unsigned long
+	jg	compat_sys_fcntl64	# branch to system call
+
+	.globl	sys32_stat64_wrapper
+sys32_stat64_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# struct stat64 *
+	llgfr	%r4,%r4			# long
+	jg	sys32_stat64		# branch to system call
+
+	.globl	sys32_lstat64_wrapper
+sys32_lstat64_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# struct stat64 *
+	llgfr	%r4,%r4			# long
+	jg	sys32_lstat64		# branch to system call
+
+	.globl	sys32_stime_wrapper
+sys32_stime_wrapper:
+	llgtr	%r2,%r2			# int *
+	jg	sys_stime		# branch to system call
+
+	.globl  sys32_sysctl_wrapper
+sys32_sysctl_wrapper:
+	llgtr   %r2,%r2                 # struct __sysctl_args32 *
+	jg      sys32_sysctl
+
+	.globl	sys32_fstat64_wrapper
+sys32_fstat64_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgtr	%r3,%r3			# struct stat64 *
+	llgfr	%r4,%r4			# long
+	jg	sys32_fstat64		# branch to system call
+
+	.globl  compat_sys_futex_wrapper 
+compat_sys_futex_wrapper:
+	llgtr	%r2,%r2			# u32 *
+	lgfr	%r3,%r3			# int
+	lgfr	%r4,%r4			# int
+	llgtr	%r5,%r5			# struct compat_timespec *
+	jg	compat_sys_futex	# branch to system call
+
+	.globl	sys32_setxattr_wrapper
+sys32_setxattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	llgtr	%r4,%r4			# void *
+	llgfr	%r5,%r5			# size_t
+	lgfr	%r6,%r6			# int
+	jg	sys_setxattr
+
+	.globl	sys32_lsetxattr_wrapper
+sys32_lsetxattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	llgtr	%r4,%r4			# void *
+	llgfr	%r5,%r5			# size_t
+	lgfr	%r6,%r6			# int
+	jg	sys_lsetxattr
+
+	.globl	sys32_fsetxattr_wrapper
+sys32_fsetxattr_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# char *
+	llgtr	%r4,%r4			# void *
+	llgfr	%r5,%r5			# size_t
+	lgfr	%r6,%r6			# int
+	jg	sys_fsetxattr
+
+	.globl	sys32_getxattr_wrapper
+sys32_getxattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	llgtr	%r4,%r4			# void *
+	llgfr	%r5,%r5			# size_t
+	jg	sys_getxattr
+
+	.globl	sys32_lgetxattr_wrapper
+sys32_lgetxattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	llgtr	%r4,%r4			# void *
+	llgfr	%r5,%r5			# size_t
+	jg	sys_lgetxattr
+
+	.globl	sys32_fgetxattr_wrapper
+sys32_fgetxattr_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# char *
+	llgtr	%r4,%r4			# void *
+	llgfr	%r5,%r5			# size_t
+	jg	sys_fgetxattr
+
+	.globl	sys32_listxattr_wrapper
+sys32_listxattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	llgfr	%r4,%r4			# size_t
+	jg	sys_listxattr
+
+	.globl	sys32_llistxattr_wrapper
+sys32_llistxattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	llgfr	%r4,%r4			# size_t
+	jg	sys_llistxattr
+
+	.globl	sys32_flistxattr_wrapper
+sys32_flistxattr_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# char *
+	llgfr	%r4,%r4			# size_t
+	jg	sys_flistxattr
+
+	.globl	sys32_removexattr_wrapper
+sys32_removexattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	jg	sys_removexattr
+
+	.globl	sys32_lremovexattr_wrapper
+sys32_lremovexattr_wrapper:
+	llgtr	%r2,%r2			# char *
+	llgtr	%r3,%r3			# char *
+	jg	sys_lremovexattr
+
+	.globl	sys32_fremovexattr_wrapper
+sys32_fremovexattr_wrapper:
+	lgfr	%r2,%r2			# int
+	llgtr	%r3,%r3			# char *
+	jg	sys_fremovexattr
+
+	.globl	sys32_sched_setaffinity_wrapper
+sys32_sched_setaffinity_wrapper:
+	lgfr	%r2,%r2			# int
+	llgfr	%r3,%r3			# unsigned int
+	llgtr	%r4,%r4			# unsigned long *
+	jg	sys32_sched_setaffinity
+
+	.globl	sys32_sched_getaffinity_wrapper
+sys32_sched_getaffinity_wrapper:
+	lgfr	%r2,%r2			# int
+	llgfr	%r3,%r3			# unsigned int
+	llgtr	%r4,%r4			# unsigned long *
+	jg	sys32_sched_getaffinity
+
+	.globl  sys32_exit_group_wrapper
+sys32_exit_group_wrapper:
+	lgfr	%r2,%r2			# int
+	jg	sys_exit_group		# branch to system call
+
+	.globl  sys32_set_tid_address_wrapper
+sys32_set_tid_address_wrapper:
+	llgtr	%r2,%r2			# int *
+	jg	sys_set_tid_address	# branch to system call
diff -Nru a/arch/s390/kernel/cpcmd.c b/arch/s390/kernel/cpcmd.c
--- a/arch/s390/kernel/cpcmd.c	Sat Apr 19 19:51:47 2003
+++ b/arch/s390/kernel/cpcmd.c	Sat Apr 19 19:51:47 2003
@@ -10,19 +10,26 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <asm/ebcdic.h>
+#include <linux/spinlock.h>
 #include <asm/cpcmd.h>
+#include <asm/system.h>
+
+static spinlock_t cpcmd_lock = SPIN_LOCK_UNLOCKED;
+static char cpcmd_buf[128];
 
 void cpcmd(char *cmd, char *response, int rlen)
 {
         const int mask = 0x40000000L;
-        char obuffer[128];
-        int olen;
+	unsigned long flags;
+        int cmdlen;
 
-        olen = strlen(cmd);
-        strcpy(obuffer, cmd);
-        ASCEBC(obuffer,olen);
+	spin_lock_irqsave(&cpcmd_lock, flags);
+        cmdlen = strlen(cmd);
+        strcpy(cpcmd_buf, cmd);
+        ASCEBC(cpcmd_buf, cmdlen);
 
         if (response != NULL && rlen > 0) {
+#ifndef CONFIG_ARCH_S390X
                 asm volatile ("LRA   2,0(%0)\n\t"
                               "LR    4,%1\n\t"
                               "O     4,%4\n\t"
@@ -30,17 +37,43 @@
                               "LR    5,%3\n\t"
                               ".long 0x83240008 # Diagnose 83\n\t"
                               : /* no output */
-                              : "a" (obuffer), "d" (olen),
+                              : "a" (cpcmd_buf), "d" (cmdlen),
+                                "a" (response), "d" (rlen), "m" (mask)
+                              : "2", "3", "4", "5" );
+#else /* CONFIG_ARCH_S390X */
+                asm volatile ("   lrag  2,0(%0)\n"
+                              "   lgr   4,%1\n"
+                              "   o     4,%4\n"
+                              "   lrag  3,0(%2)\n"
+                              "   lgr   5,%3\n"
+                              "   sam31\n"
+                              "   .long 0x83240008 # Diagnose 83\n"
+                              "   sam64"
+                              : /* no output */
+                              : "a" (cpcmd_buf), "d" (cmdlen),
                                 "a" (response), "d" (rlen), "m" (mask)
                               : "2", "3", "4", "5" );
+#endif /* CONFIG_ARCH_S390X */
                 EBCASC(response, rlen);
         } else {
+#ifndef CONFIG_ARCH_S390X
                 asm volatile ("LRA   2,0(%0)\n\t"
                               "LR    3,%1\n\t"
                               ".long 0x83230008 # Diagnose 83\n\t"
                               : /* no output */
-                              : "a" (obuffer), "d" (olen)
+                              : "a" (cpcmd_buf), "d" (cmdlen)
+                              : "2", "3"  );
+#else /* CONFIG_ARCH_S390X */
+                asm volatile ("   lrag  2,0(%0)\n"
+                              "   lgr   3,%1\n"
+                              "   sam31\n"
+                              "   .long 0x83230008 # Diagnose 83\n"
+                              "   sam64"
+                              : /* no output */
+                              : "a" (cpcmd_buf), "d" (cmdlen)
                               : "2", "3"  );
+#endif /* CONFIG_ARCH_S390X */
         }
+	spin_unlock_irqrestore(&cpcmd_lock, flags);
 }
 
diff -Nru a/arch/s390/kernel/debug.c b/arch/s390/kernel/debug.c
--- a/arch/s390/kernel/debug.c	Sat Apr 19 19:51:28 2003
+++ b/arch/s390/kernel/debug.c	Sat Apr 19 19:51:28 2003
@@ -16,7 +16,6 @@
 #include <linux/errno.h>
 #include <linux/slab.h>
 #include <linux/ctype.h>
-#include <linux/version.h>
 #include <asm/uaccess.h>
 #include <asm/semaphore.h>
 
@@ -1111,17 +1110,10 @@
 		except_str = "*";
 	else
 		except_str = "-";
-	caller = (unsigned long) entry->caller;
-#if defined(CONFIG_ARCH_S390X)
-	rc += sprintf(out_buf, "%02i %011lu:%06lu %1u %1s %02i %016lx  ",
+	caller = ((unsigned long) entry->caller) & PSW_ADDR_INSN;
+	rc += sprintf(out_buf, "%02i %011lu:%06lu %1u %1s %02i %p  ",
 		      area, time_val.tv_sec, time_val.tv_usec, level,
-		      except_str, entry->id.fields.cpuid, caller);
-#else
-	caller &= 0x7fffffff;
-	rc += sprintf(out_buf, "%02i %011lu:%06lu %1u %1s %02i %08lx  ",
-		      area, time_val.tv_sec, time_val.tv_usec, level,
-		      except_str, entry->id.fields.cpuid, caller);
-#endif
+		      except_str, entry->id.fields.cpuid, (void *) caller);
 	return rc;
 }
 
diff -Nru a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
--- a/arch/s390/kernel/entry.S	Sat Apr 19 19:51:28 2003
+++ b/arch/s390/kernel/entry.S	Sat Apr 19 19:51:28 2003
@@ -18,6 +18,7 @@
 #include <asm/ptrace.h>
 #include <asm/thread_info.h>
 #include <asm/offsets.h>
+#include <asm/unistd.h>
 
 /*
  * Stack layout for the system_call stack entry.
@@ -97,8 +98,7 @@
         stam    %a0,%a15,SP_AREGS(%r15)   # store access registers to kst.
         mvc     SP_AREGS+8(12,%r15),__LC_SAVE_AREA+12 # store ac. regs
         mvc     SP_PSW(8,%r15),\psworg    # move user PSW to stack
-        la      %r0,\psworg               # store trap indication
-        st      %r0,SP_TRAP(%r15)
+	mvc	SP_TRAP(4,%r15),BASED(.L\psworg) # store trap indication
         xc      0(4,%r15),0(%r15)         # clear back chain
         .endm
 
@@ -179,12 +179,18 @@
 	SAVE_ALL_BASE
         SAVE_ALL __LC_SVC_OLD_PSW,1
 	lh	%r7,0x8a	  # get svc number from lowcore
-        GET_THREAD_INFO           # load pointer to task_struct to R9
-	sll	%r7,2
         stosm   24(%r15),0x03     # reenable interrupts
+        GET_THREAD_INFO           # load pointer to task_struct to R9
+	sla	%r7,2             # *4 and test for svc 0
+	bnz	BASED(sysc_do_restart)  # svc number > 0
+	# svc 0: system call number in %r1
+	cl	%r1,BASED(.Lnr_syscalls)
+	bnl	BASED(sysc_do_restart)
+	lr	%r7,%r1           # copy svc number to %r7
+	sla	%r7,2             # *4
 sysc_do_restart:
-        l       %r8,sys_call_table-entry_base(%r7,%r13) # get system call addr.
 	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
+        l       %r8,sys_call_table-entry_base(%r7,%r13) # get system call addr.
         bo      BASED(sysc_tracesys)
         basr    %r14,%r8          # call sys_xxxx
         st      %r2,SP_R2(%r15)   # store return value (change R2 on stack)
@@ -247,7 +253,7 @@
 	ni	__TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
 	stosm	24(%r15),0x03          # reenable interrupts
 	l	%r7,SP_R2(%r15)        # load new svc number
-	sll	%r7,2
+	sla	%r2,2
 	mvc	SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument
 	lm	%r2,%r6,SP_R2(%r15)    # load svc arguments
 	b	BASED(sysc_do_restart) # restart svc
@@ -260,9 +266,10 @@
 	srl	%r7,2
 	st	%r7,SP_R2(%r15)
 	basr	%r14,%r1
+	clc	SP_R2(4,%r15),BASED(.Lnr_syscalls)
+	bl	BASED(sysc_tracego)
 	l	%r7,SP_R2(%r15)        # strace might have changed the 
-	n	%r7,BASED(.Lc256)      #  system call
-	sll	%r7,2
+	sll	%r7,2                  #  system call
 	l	%r8,sys_call_table-entry_base(%r7,%r13)
 sysc_tracego:
 	lm	%r3,%r6,SP_R3(%r15)
@@ -283,13 +290,9 @@
         basr    %r13,0
         l       %r13,.Lentry_base-.(%r13)  # setup base pointer to &entry_base
         GET_THREAD_INFO           # load pointer to task_struct to R9
-#if CONFIG_SMP || CONFIG_PREEMPT
         l       %r1,BASED(.Lschedtail)
 	la      %r14,BASED(sysc_return)
         br      %r1               # call schedule_tail, return to sysc_return
-#else
-	b	BASED(sysc_return)
-#endif
 
 #
 # clone, fork, vfork, exec and sigreturn need glue,
@@ -361,265 +364,12 @@
         l       %r1,BASED(.Lsigaltstack)
         br      %r1                   # branch to sys_sigreturn
 
-	.globl  sys_call_table	
+
+#define SYSCALL(esa,esame,emu)	.long esa
+	.globl  sys_call_table
 sys_call_table:
-        .long  sys_ni_syscall            /* 0 */
-        .long  sys_exit
-        .long  sys_fork_glue
-        .long  sys_read
-        .long  sys_write
-        .long  sys_open                  /* 5 */
-        .long  sys_close
-        .long  sys_restart_syscall
-        .long  sys_creat
-        .long  sys_link
-        .long  sys_unlink                /* 10 */
-        .long  sys_execve_glue
-        .long  sys_chdir
-        .long  sys_time
-        .long  sys_mknod
-        .long  sys_chmod                /* 15 */
-        .long  sys_lchown16
-        .long  sys_ni_syscall           /* old break syscall holder */
-        .long  sys_ni_syscall           /* old stat syscall holder */
-        .long  sys_lseek
-        .long  sys_getpid               /* 20 */
-        .long  sys_mount
-        .long  sys_oldumount
-        .long  sys_setuid16
-        .long  sys_getuid16
-        .long  sys_stime                /* 25 */
-        .long  sys_ptrace
-        .long  sys_alarm
-        .long  sys_ni_syscall           /* old fstat syscall holder */
-        .long  sys_pause
-        .long  sys_utime                /* 30 */
-        .long  sys_ni_syscall           /* old stty syscall holder */
-        .long  sys_ni_syscall           /* old gtty syscall holder */
-        .long  sys_access
-        .long  sys_nice
-        .long  sys_ni_syscall           /* 35 */  /* old ftime syscall holder */
-        .long  sys_sync
-        .long  sys_kill
-        .long  sys_rename
-        .long  sys_mkdir
-        .long  sys_rmdir                /* 40 */
-        .long  sys_dup
-        .long  sys_pipe
-        .long  sys_times
-        .long  sys_ni_syscall           /* old prof syscall holder */
-        .long  sys_brk                  /* 45 */
-        .long  sys_setgid16
-        .long  sys_getgid16
-        .long  sys_signal
-        .long  sys_geteuid16
-        .long  sys_getegid16            /* 50 */
-        .long  sys_acct
-        .long  sys_umount
-        .long  sys_ni_syscall           /* old lock syscall holder */
-        .long  sys_ioctl
-        .long  sys_fcntl                /* 55 */
-        .long  sys_ni_syscall           /* old mpx syscall holder */
-        .long  sys_setpgid
-        .long  sys_ni_syscall           /* old ulimit syscall holder */
-        .long  sys_ni_syscall           /* old uname syscall holder */
-        .long  sys_umask                /* 60 */
-        .long  sys_chroot
-        .long  sys_ustat
-        .long  sys_dup2
-        .long  sys_getppid
-        .long  sys_getpgrp              /* 65 */
-        .long  sys_setsid
-        .long  sys_sigaction
-        .long  sys_ni_syscall           /* old sgetmask syscall holder */
-        .long  sys_ni_syscall           /* old ssetmask syscall holder */
-        .long  sys_setreuid16           /* 70 */
-        .long  sys_setregid16
-        .long  sys_sigsuspend_glue
-        .long  sys_sigpending
-        .long  sys_sethostname
-        .long  sys_setrlimit            /* 75 */
-        .long  sys_old_getrlimit
-        .long  sys_getrusage
-        .long  sys_gettimeofday
-        .long  sys_settimeofday
-        .long  sys_getgroups16          /* 80 */
-        .long  sys_setgroups16
-        .long  sys_ni_syscall           /* old select syscall holder */
-        .long  sys_symlink
-        .long  sys_ni_syscall           /* old lstat syscall holder */
-        .long  sys_readlink             /* 85 */
-        .long  sys_uselib
-        .long  sys_swapon
-        .long  sys_reboot
-        .long  sys_ni_syscall           /* old readdir syscall holder */
-        .long  old_mmap                 /* 90 */
-        .long  sys_munmap
-        .long  sys_truncate
-        .long  sys_ftruncate
-        .long  sys_fchmod
-        .long  sys_fchown16              /* 95 */
-        .long  sys_getpriority
-        .long  sys_setpriority
-        .long  sys_ni_syscall            /* old profil syscall holder */
-        .long  sys_statfs
-        .long  sys_fstatfs               /* 100 */
-        .long  sys_ioperm
-        .long  sys_socketcall
-        .long  sys_syslog
-        .long  sys_setitimer
-        .long  sys_getitimer             /* 105 */
-        .long  sys_newstat
-        .long  sys_newlstat
-        .long  sys_newfstat
-        .long  sys_ni_syscall            /* old uname syscall holder */
-        .long  sys_ni_syscall            /* 110 */ /* iopl for i386 */
-        .long  sys_vhangup
-        .long  sys_ni_syscall            /* old "idle" system call */
-        .long  sys_ni_syscall            /* vm86old for i386 */
-        .long  sys_wait4
-        .long  sys_swapoff               /* 115 */
-        .long  sys_sysinfo
-        .long  sys_ipc
-        .long  sys_fsync
-        .long  sys_sigreturn_glue
-        .long  sys_clone_glue            /* 120 */
-        .long  sys_setdomainname
-        .long  sys_newuname
-        .long  sys_ni_syscall            /* modify_ldt for i386 */
-        .long  sys_adjtimex
-        .long  sys_mprotect              /* 125 */
-        .long  sys_sigprocmask
-        .long  sys_ni_syscall		 /* old "create module" */
-        .long  sys_init_module
-        .long  sys_delete_module
-        .long  sys_ni_syscall		 /* 130: old get_kernel_syms */
-        .long  sys_quotactl
-        .long  sys_getpgid
-        .long  sys_fchdir
-        .long  sys_bdflush
-        .long  sys_sysfs                 /* 135 */
-        .long  sys_personality
-        .long  sys_ni_syscall            /* for afs_syscall */
-        .long  sys_setfsuid16
-        .long  sys_setfsgid16
-        .long  sys_llseek                /* 140 */
-        .long  sys_getdents
-        .long  sys_select
-        .long  sys_flock
-        .long  sys_msync
-        .long  sys_readv                 /* 145 */
-        .long  sys_writev
-        .long  sys_getsid
-        .long  sys_fdatasync
-        .long  sys_sysctl
-        .long  sys_mlock                 /* 150 */
-        .long  sys_munlock
-        .long  sys_mlockall
-        .long  sys_munlockall
-        .long  sys_sched_setparam
-        .long  sys_sched_getparam        /* 155 */
-        .long  sys_sched_setscheduler
-        .long  sys_sched_getscheduler
-        .long  sys_sched_yield
-        .long  sys_sched_get_priority_max
-        .long  sys_sched_get_priority_min  /* 160 */
-        .long  sys_sched_rr_get_interval
-        .long  sys_nanosleep
-        .long  sys_mremap
-        .long  sys_setresuid16
-        .long  sys_getresuid16           /* 165 */
-        .long  sys_ni_syscall            /* for vm86 */
-        .long  sys_ni_syscall		 /* old sys_query_module */
-        .long  sys_poll
-        .long  sys_nfsservctl
-        .long  sys_setresgid16           /* 170 */
-        .long  sys_getresgid16
-        .long  sys_prctl
-        .long  sys_rt_sigreturn_glue
-        .long  sys_rt_sigaction
-        .long  sys_rt_sigprocmask        /* 175 */
-        .long  sys_rt_sigpending
-        .long  sys_rt_sigtimedwait
-        .long  sys_rt_sigqueueinfo
-        .long  sys_rt_sigsuspend_glue
-        .long  sys_pread64               /* 180 */
-        .long  sys_pwrite64
-        .long  sys_chown16
-        .long  sys_getcwd
-        .long  sys_capget
-        .long  sys_capset                /* 185 */
-        .long  sys_sigaltstack_glue
-        .long  sys_sendfile
-        .long  sys_ni_syscall            /* streams1 */
-        .long  sys_ni_syscall            /* streams2 */
-        .long  sys_vfork_glue            /* 190 */
-        .long  sys_getrlimit
-	.long  sys_mmap2
-        .long  sys_truncate64
-        .long  sys_ftruncate64
-        .long  sys_stat64                /* 195 */
-        .long  sys_lstat64
-        .long  sys_fstat64
-	.long  sys_lchown
-	.long  sys_getuid
-	.long  sys_getgid		 /* 200 */
-	.long  sys_geteuid
-	.long  sys_getegid
-	.long  sys_setreuid
-	.long  sys_setregid
-	.long  sys_getgroups             /* 205 */
-	.long  sys_setgroups
-	.long  sys_fchown
-	.long  sys_setresuid
-	.long  sys_getresuid
-	.long  sys_setresgid             /* 210 */
-	.long  sys_getresgid
-	.long  sys_chown
-	.long  sys_setuid
-	.long  sys_setgid
-	.long  sys_setfsuid              /* 215 */
-	.long  sys_setfsgid
-        .long  sys_pivot_root
-        .long  sys_mincore
-        .long  sys_madvise
-	.long  sys_getdents64		 /* 220 */
-        .long  sys_fcntl64 
-	.long  sys_readahead
-	.long  sys_sendfile64
-	.long  sys_setxattr
-	.long  sys_lsetxattr		 /* 225 */
-	.long  sys_fsetxattr
-	.long  sys_getxattr
-	.long  sys_lgetxattr
-	.long  sys_fgetxattr
-	.long  sys_listxattr		 /* 230 */
-	.long  sys_llistxattr
-	.long  sys_flistxattr
-	.long  sys_removexattr
-	.long  sys_lremovexattr
-	.long  sys_fremovexattr		 /* 235 */
-	.long  sys_gettid
-	.long  sys_tkill
-	.long  sys_futex
-	.long  sys_sched_setaffinity
-	.long  sys_sched_getaffinity	 /* 240 */
-	.long  sys_ni_syscall
-	.long  sys_ni_syscall		 /* reserved for TUX */
-	.long  sys_io_setup
-	.long  sys_io_destroy
-	.long  sys_io_getevents		 /* 245 */
-	.long  sys_io_submit
-	.long  sys_io_cancel
-	.long  sys_exit_group
-	.long  sys_epoll_create
-	.long  sys_epoll_ctl		 /* 250 */
-	.long  sys_epoll_wait
-	.long  sys_set_tid_address
-	.long  sys_fadvise64
-	.rept  255-253
-	.long  sys_ni_syscall
-	.endr
+#include "syscalls.S"
+#undef SYSCALL
 
 /*
  * Program check handler routine
@@ -644,13 +394,12 @@
         tm      __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception
         bnz     BASED(pgm_per)           # got per exception -> special case
 	SAVE_ALL __LC_PGM_OLD_PSW,1
-	la	%r8,0x7f
         l       %r3,__LC_PGM_ILC         # load program interruption code
+	la	%r8,0x7f
         l       %r7,BASED(.Ljump_table)
 	nr	%r8,%r3
         sll     %r8,2
 	GET_THREAD_INFO
-        stosm   24(%r15),0x03            # reenable interrupts
         l       %r7,0(%r8,%r7)		 # load address of handler routine
         la      %r2,SP_PTREGS(%r15)	 # address of register-save area
 	la      %r14,BASED(sysc_return)
@@ -677,7 +426,6 @@
 	GET_THREAD_INFO
 	la	%r4,0x7f
 	l	%r3,__LC_PGM_ILC	 # load program interruption code
-        stosm   24(%r15),0x03            # reenable interrupts
         nr      %r4,%r3                  # clear per-event-bit and ilc
         be      BASED(pgm_per_only)      # only per or per+check ?
         l       %r1,BASED(.Ljump_table)
@@ -696,12 +444,19 @@
 #
 pgm_svcper:
 	SAVE_ALL __LC_SVC_OLD_PSW,1
-        GET_THREAD_INFO           # load pointer to task_struct to R9
+	lh	%r7,0x8a	  # get svc number from lowcore
         stosm   24(%r15),0x03     # reenable interrupts
-	lh	%r8,0x8a	  # get svc number from lowcore
-        sll     %r8,2
-        l       %r8,sys_call_table-entry_base(%r8,%r13) # get system call addr.
+        GET_THREAD_INFO           # load pointer to task_struct to R9
+        sla     %r7,2             # *4 and test for svc 0
+	bnz	BASED(pgm_svcstd) # svc number > 0 ?
+	# svc 0: system call number in %r1
+	cl	%r1,BASED(.Lnr_syscalls)
+	bnl	BASED(pgm_svcstd)
+	lr	%r7,%r1           # copy svc number to %r7
+	sla	%r7,2             # *4
+pgm_svcstd:
 	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
+        l       %r8,sys_call_table-entry_base(%r7,%r13) # get system call addr.
         bo      BASED(pgm_tracesys)
         basr    %r14,%r8          # call sys_xxxx
         st      %r2,SP_R2(%r15)   # store return value (change R2 on stack)
@@ -727,13 +482,14 @@
 #
 pgm_tracesys:
         l       %r1,BASED(.Ltrace)
-	mvc	SP_R2(%r15),BASED(.Lc_ENOSYS)
+	srl	%r7,2
+	st	%r7,SP_R2(%r15)
         basr    %r14,%r1
-	clc	SP_R2(4,%r15),BASED(.Lc256)
-	bnl	BASED(pgm_svc_go)
-	l	%r8,SP_R2(%r15)   # strace changed the syscall
-	sll     %r8,2
-	l	%r8,sys_call_table-entry_base(%r8,%r13)
+	clc	SP_R2(4,%r15),BASED(.Lnr_syscalls)
+	bl	BASED(pgm_svc_go)
+	l	%r7,SP_R2(%r15)   # strace changed the syscall
+	sll     %r7,2
+	l	%r8,sys_call_table-entry_base(%r7,%r13)
 pgm_svc_go:
 	lm      %r3,%r6,SP_R3(%r15)
 	l       %r2,SP_ORIG_R2(%r15)
@@ -924,7 +680,12 @@
 .Lc_ENOSYS:    .long  -ENOSYS
 .Lc_pactive:   .long  PREEMPT_ACTIVE
 .Lc0xff:       .long  0xff
-.Lc256:        .long  256
+.Lnr_syscalls: .long  NR_syscalls
+.L0x018:       .long  0x018
+.L0x020:       .long  0x020
+.L0x028:       .long  0x028
+.L0x030:       .long  0x030
+.L0x038:       .long  0x038
 
 /*
  * Symbol constants
@@ -949,8 +710,6 @@
 .Lsigaltstack: .long  sys_sigaltstack
 .Ltrace:       .long  syscall_trace
 .Lvfork:       .long  sys_vfork
-#if CONFIG_SMP || CONFIG_PREEMPT
 .Lschedtail:   .long  schedule_tail
-#endif
 
 
diff -Nru a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/entry64.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,710 @@
+/*
+ *  arch/s390/kernel/entry.S
+ *    S390 low-level entry points.
+ *
+ *  S390 version
+ *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
+ *               Hartmut Penner (hp@de.ibm.com),
+ *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
+ */
+
+#include <linux/sys.h>
+#include <linux/linkage.h>
+#include <linux/config.h>
+#include <asm/cache.h>
+#include <asm/lowcore.h>
+#include <asm/errno.h>
+#include <asm/ptrace.h>
+#include <asm/thread_info.h>
+#include <asm/offsets.h>
+#include <asm/unistd.h>
+
+/*
+ * Stack layout for the system_call stack entry.
+ * The first few entries are identical to the user_regs_struct.
+ */
+SP_PTREGS    =  STACK_FRAME_OVERHEAD 
+SP_PSW       =  STACK_FRAME_OVERHEAD + PT_PSWMASK
+SP_R0        =  STACK_FRAME_OVERHEAD + PT_GPR0
+SP_R1        =  STACK_FRAME_OVERHEAD + PT_GPR1
+SP_R2        =  STACK_FRAME_OVERHEAD + PT_GPR2
+SP_R3        =  STACK_FRAME_OVERHEAD + PT_GPR3
+SP_R4        =  STACK_FRAME_OVERHEAD + PT_GPR4
+SP_R5        =  STACK_FRAME_OVERHEAD + PT_GPR5
+SP_R6        =  STACK_FRAME_OVERHEAD + PT_GPR6
+SP_R7        =  STACK_FRAME_OVERHEAD + PT_GPR7
+SP_R8        =  STACK_FRAME_OVERHEAD + PT_GPR8
+SP_R9        =  STACK_FRAME_OVERHEAD + PT_GPR9
+SP_R10       =  STACK_FRAME_OVERHEAD + PT_GPR10
+SP_R11       =  STACK_FRAME_OVERHEAD + PT_GPR11
+SP_R12       =  STACK_FRAME_OVERHEAD + PT_GPR12
+SP_R13       =  STACK_FRAME_OVERHEAD + PT_GPR13
+SP_R14       =  STACK_FRAME_OVERHEAD + PT_GPR14
+SP_R15       =  STACK_FRAME_OVERHEAD + PT_GPR15
+SP_AREGS     =  STACK_FRAME_OVERHEAD + PT_ACR0
+SP_ORIG_R2   =  STACK_FRAME_OVERHEAD + PT_ORIGGPR2
+/* Now the additional entries */
+SP_TRAP      =  (SP_ORIG_R2+GPR_SIZE)
+SP_SIZE      =  (SP_TRAP+4)
+
+_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_RESTART_SVC)
+_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NEED_RESCHED)
+
+/*
+ * Register usage in interrupt handlers:
+ *    R9  - pointer to current task structure
+ *    R13 - pointer to literal pool
+ *    R14 - return register for function calls
+ *    R15 - kernel stack pointer
+ */
+
+        .macro  SAVE_ALL psworg,sync     # system entry macro
+        stmg    %r14,%r15,__LC_SAVE_AREA
+	stam    %a2,%a4,__LC_SAVE_AREA+16
+	larl	%r14,.Lconst
+        tm      \psworg+1,0x01           # test problem state bit
+	.if	\sync
+        jz      1f                       # skip stack setup save
+	.else
+	jnz	0f			 # from user -> load kernel stack
+	lg	%r14,__LC_ASYNC_STACK	 # are we already on the async. stack ?
+	slgr	%r14,%r15
+	srag	%r14,%r14,14
+	larl	%r14,.Lconst
+	jz	1f
+	lg	%r15,__LC_ASYNC_STACK	 # load async. stack
+	j	1f
+	.endif
+0:	lg      %r15,__LC_KERNEL_STACK   # problem state -> load ksp
+	lam	%a2,%a4,.Lc_ac-.Lconst(%r14)
+1:      aghi    %r15,-SP_SIZE            # make room for registers & psw
+        nill    %r15,0xfff8              # align stack pointer to 8
+        stmg    %r0,%r13,SP_R0(%r15)     # store gprs 0-13 to kernel stack
+        stg     %r2,SP_ORIG_R2(%r15)     # store original content of gpr 2
+        mvc     SP_R14(16,%r15),__LC_SAVE_AREA # move r14 and r15 to stack
+        stam    %a0,%a15,SP_AREGS(%r15)  # store access registers to kst.
+        mvc     SP_AREGS+8(12,%r15),__LC_SAVE_AREA+16 # store ac. regs
+        mvc     SP_PSW(16,%r15),\psworg  # move user PSW to stack
+	mvc	SP_TRAP(4,%r15),.L\psworg-.Lconst(%r14) # store trap ind.
+        xc      0(8,%r15),0(%r15)        # clear back chain
+        .endm
+
+        .macro  RESTORE_ALL sync         # system exit macro
+        mvc     __LC_RETURN_PSW(16),SP_PSW(%r15) # move user PSW to lowcore
+        lam     %a0,%a15,SP_AREGS(%r15)  # load the access registers
+        lmg     %r0,%r15,SP_R0(%r15)     # load gprs 0-15 of user
+        ni      __LC_RETURN_PSW+1,0xfd   # clear wait state bit
+        lpswe   __LC_RETURN_PSW          # back to caller
+        .endm
+
+        .macro  GET_THREAD_INFO
+	lg	%r9,__LC_KERNEL_STACK    # load pointer to task_struct to %r9
+	aghi	%r9,-16384
+        .endm
+
+
+/*
+ * Scheduler resume function, called by switch_to
+ *  gpr2 = (task_struct *) prev
+ *  gpr3 = (task_struct *) next
+ * Returns:
+ *  gpr2 = prev
+ */
+        .globl  resume
+resume:
+	tm	__THREAD_per+4(%r3),0xe8 # is the new process using per ?
+	jz	resume_noper		# if not we're fine
+        stctg   %c9,%c11,48(%r15)       # We are using per stuff
+        clc     __THREAD_per(24,%r3),48(%r15)
+        je      resume_noper            # we got away without bashing TLB's
+        lctlg   %c9,%c11,__THREAD_per(%r3)	# Nope we didn't
+resume_noper:
+        stmg    %r6,%r15,48(%r15)       # store resume registers of prev task
+	stg	%r15,__THREAD_ksp(%r2)	# store kernel stack to prev->tss.ksp
+	lg	%r15,__THREAD_ksp(%r3)	# load kernel stack from next->tss.ksp
+        stam    %a2,%a2,__THREAD_ar2(%r2)	# store kernel access reg. 2
+        stam    %a4,%a4,__THREAD_ar4(%r2)	# store kernel access reg. 4
+        lam     %a2,%a2,__THREAD_ar2(%r3)	# load kernel access reg. 2
+        lam     %a4,%a4,__THREAD_ar4(%r3)	# load kernel access reg. 4
+        lmg     %r6,%r15,48(%r15)       # load resume registers of next task
+	lg	%r3,__THREAD_info(%r3)  # load thread_info from task struct
+	aghi	%r3,16384
+	stg	%r3,__LC_KERNEL_STACK	# __LC_KERNEL_STACK = new kernel stack
+	br	%r14
+
+/*
+ * do_softirq calling function. We want to run the softirq functions on the
+ * asynchronous interrupt stack.
+ */
+	.global do_call_softirq
+do_call_softirq:
+	stmg	%r12,%r15,48(%r15)
+	lgr	%r12,%r15
+	lg	%r0,__LC_ASYNC_STACK
+	slgr    %r0,%r15
+	srag	%r0,%r0,14
+	je	0f
+	lg	%r15,__LC_ASYNC_STACK
+0:	aghi	%r15,-STACK_FRAME_OVERHEAD
+	stg	%r12,0(%r15)		# store back chain
+	brasl	%r14,do_softirq
+	lmg	%r12,%r15,48(%r12)
+	br	%r14
+	
+/*
+ * SVC interrupt handler routine. System calls are synchronous events and
+ * are executed with interrupts enabled.
+ */
+
+	.globl  system_call
+system_call:
+        SAVE_ALL __LC_SVC_OLD_PSW,1
+	llgh    %r7,__LC_SVC_INT_CODE # get svc number from lowcore
+	stosm   48(%r15),0x03     # reenable interrupts
+        GET_THREAD_INFO           # load pointer to task_struct to R9
+        slag    %r7,%r7,2         # *4 and test for svc 0
+	jnz	sysc_do_restart
+	# svc 0: system call number in %r1
+	clg	%r1,.Lnr_syscalls-.Lconst(%r14)
+	jnl	sysc_do_restart
+	slag    %r7,%r1,2         # svc 0: system call number in %r1
+sysc_do_restart:
+	larl    %r10,sys_call_table
+#ifdef CONFIG_S390_SUPPORT
+        tm      SP_PSW+3(%r15),0x01  # are we running in 31 bit mode ?
+        jo      sysc_noemu
+	larl    %r10,sys_call_table_emu  # use 31 bit emulation system calls
+sysc_noemu:
+#endif
+	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
+        lgf     %r8,0(%r7,%r10)   # load address of system call routine
+        jo      sysc_tracesys
+        basr    %r14,%r8          # call sys_xxxx
+        stg     %r2,SP_R2(%r15)   # store return value (change R2 on stack)
+                                  # ATTENTION: check sys_execve_glue before
+                                  # changing anything here !!
+
+sysc_return:
+	stnsm   48(%r15),0xfc     # disable I/O and ext. interrupts
+	tm	__TI_flags+7(%r9),_TIF_WORK_SVC
+	jnz	sysc_work         # there is work to do (signals etc.)
+sysc_leave:
+        RESTORE_ALL 1
+
+#
+# recheck if there is more work to do
+#
+sysc_work_loop:
+	stnsm   48(%r15),0xfc     # disable I/O and ext. interrupts
+        GET_THREAD_INFO           # load pointer to task_struct to R9
+	tm	__TI_flags+7(%r9),_TIF_WORK_SVC
+	jz	sysc_leave        # there is no work to do
+#
+# One of the work bits is on. Find out which one.
+# Checked are: _TIF_SIGPENDING and _TIF_NEED_RESCHED
+#
+sysc_work:
+	tm	__TI_flags+7(%r9),_TIF_NEED_RESCHED
+	jo	sysc_reschedule
+	tm	__TI_flags+7(%r9),_TIF_SIGPENDING
+	jo	sysc_sigpending
+	tm	__TI_flags+7(%r9),_TIF_RESTART_SVC
+	jo	sysc_restart
+	j	sysc_leave
+
+#
+# _TIF_NEED_RESCHED is set, call schedule
+#	
+sysc_reschedule:        
+	stosm   48(%r15),0x03     # reenable interrupts
+	larl    %r14,sysc_work_loop
+        jg      schedule            # return point is sysc_return
+
+#
+# _TIF_SIGPENDING is set, call do_signal
+#
+sysc_sigpending:     
+	stosm   48(%r15),0x03     # reenable interrupts
+        la      %r2,SP_PTREGS(%r15) # load pt_regs
+        sgr     %r3,%r3           # clear *oldset
+	brasl	%r14,do_signal    # call do_signal
+	stnsm   48(%r15),0xfc     # disable I/O and ext. interrupts
+	j	sysc_leave        # out of here, do NOT recheck
+
+#
+# _TIF_RESTART_SVC is set, set up registers and restart svc
+#
+sysc_restart:
+	ni	__TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
+	stosm	48(%r15),0x03          # reenable interrupts
+	lg	%r7,SP_R2(%r15)        # load new svc number
+        slag    %r7,%r7,3              # *8
+	mvc	SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument
+	lmg	%r2,%r6,SP_R2(%r15)    # load svc arguments
+	j	sysc_do_restart        # restart svc
+
+#
+# call syscall_trace before and after system call
+# special linkage: %r12 contains the return address for trace_svc
+#
+sysc_tracesys:
+	srl	%r7,3
+	stg     %r7,SP_R2(%r15)
+        brasl   %r14,syscall_trace
+	larl	%r1,.Lnr_syscalls
+	clc	SP_R2(8,%r15),0(%r1)
+	jl	sysc_tracego
+	lg	%r7,SP_R2(%r15)   # strace might have changed the
+	sll     %r7,3             #  system call
+	lgf	%r8,0(%r7,%r10)
+sysc_tracego:
+	lmg     %r3,%r6,SP_R3(%r15)
+	lg      %r2,SP_ORIG_R2(%r15)
+        basr    %r14,%r8            # call sys_xxx
+        stg     %r2,SP_R2(%r15)     # store return value
+	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
+        jno     sysc_return
+	larl	%r14,sysc_return    # return point is sysc_return
+	jg	syscall_trace
+
+#
+# a new process exits the kernel with ret_from_fork
+#
+        .globl  ret_from_fork
+ret_from_fork:  
+        GET_THREAD_INFO           # load pointer to task_struct to R9
+	larl    %r14,sysc_return
+        jg      schedule_tail     # return to sysc_return
+
+#
+# clone, fork, vfork, exec and sigreturn need glue,
+# because they all expect pt_regs as parameter,
+# but are called with different parameter.
+# return-address is set up above
+#
+sys_clone_glue: 
+        la      %r2,SP_PTREGS(%r15)    # load pt_regs
+        jg      sys_clone              # branch to sys_clone
+
+#ifdef CONFIG_S390_SUPPORT
+sys32_clone_glue: 
+        la      %r2,SP_PTREGS(%r15)    # load pt_regs
+        jg      sys32_clone            # branch to sys32_clone
+#endif
+
+sys_fork_glue:  
+        la      %r2,SP_PTREGS(%r15)    # load pt_regs
+        jg      sys_fork               # branch to sys_fork
+
+sys_vfork_glue: 
+        la      %r2,SP_PTREGS(%r15)    # load pt_regs
+        jg      sys_vfork              # branch to sys_vfork
+
+sys_execve_glue:        
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs
+	lgr     %r12,%r14             # save return address
+        brasl   %r14,sys_execve       # call sys_execve
+        ltgr    %r2,%r2               # check if execve failed
+        bnz     0(%r12)               # it did fail -> store result in gpr2
+        b       6(%r12)               # SKIP STG 2,SP_R2(15) in
+                                      # system_call/sysc_tracesys
+#ifdef CONFIG_S390_SUPPORT
+sys32_execve_glue:        
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs
+	lgr     %r12,%r14             # save return address
+        brasl   %r14,sys32_execve     # call sys32_execve
+        ltgr    %r2,%r2               # check if execve failed
+        bnz     0(%r12)               # it did fail -> store result in gpr2
+        b       6(%r12)               # SKIP STG 2,SP_R2(15) in
+                                      # system_call/sysc_tracesys
+#endif
+
+sys_sigreturn_glue:     
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
+        jg      sys_sigreturn         # branch to sys_sigreturn
+
+#ifdef CONFIG_S390_SUPPORT
+sys32_sigreturn_glue:     
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
+        jg      sys32_sigreturn       # branch to sys32_sigreturn
+#endif
+
+sys_rt_sigreturn_glue:     
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
+        jg      sys_rt_sigreturn      # branch to sys_sigreturn
+
+#ifdef CONFIG_S390_SUPPORT
+sys32_rt_sigreturn_glue:     
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
+        jg      sys32_rt_sigreturn    # branch to sys32_sigreturn
+#endif
+
+#
+# sigsuspend and rt_sigsuspend need pt_regs as an additional
+# parameter and they have to skip the store of %r2 into the
+# user register %r2 because the return value was set in 
+# sigsuspend and rt_sigsuspend already and must not be overwritten!
+#
+
+sys_sigsuspend_glue:    
+        lgr     %r5,%r4               # move mask back
+        lgr     %r4,%r3               # move history1 parameter
+        lgr     %r3,%r2               # move history0 parameter
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
+	la      %r14,6(%r14)          # skip store of return value
+        jg      sys_sigsuspend        # branch to sys_sigsuspend
+
+#ifdef CONFIG_S390_SUPPORT
+sys32_sigsuspend_glue:    
+	llgfr	%r4,%r4               # unsigned long			
+        lgr     %r5,%r4               # move mask back
+	lgfr	%r3,%r3               # int			
+        lgr     %r4,%r3               # move history1 parameter
+	lgfr	%r2,%r2               # int			
+        lgr     %r3,%r2               # move history0 parameter
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
+	la      %r14,6(%r14)          # skip store of return value
+        jg      sys32_sigsuspend      # branch to sys32_sigsuspend
+#endif
+
+sys_rt_sigsuspend_glue: 
+        lgr     %r4,%r3               # move sigsetsize parameter
+        lgr     %r3,%r2               # move unewset parameter
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
+	la      %r14,6(%r14)          # skip store of return value
+        jg      sys_rt_sigsuspend     # branch to sys_rt_sigsuspend
+
+#ifdef CONFIG_S390_SUPPORT
+sys32_rt_sigsuspend_glue: 
+	llgfr	%r3,%r3               # size_t			
+        lgr     %r4,%r3               # move sigsetsize parameter
+	llgtr	%r2,%r2               # sigset_emu31_t *
+        lgr     %r3,%r2               # move unewset parameter
+        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
+	la      %r14,6(%r14)          # skip store of return value
+        jg      sys32_rt_sigsuspend   # branch to sys32_rt_sigsuspend
+#endif
+
+sys_sigaltstack_glue:
+        la      %r4,SP_PTREGS(%r15)   # load pt_regs as parameter
+        jg      sys_sigaltstack       # branch to sys_sigreturn
+
+#ifdef CONFIG_S390_SUPPORT
+sys32_sigaltstack_glue:
+        la      %r4,SP_PTREGS(%r15)   # load pt_regs as parameter
+        jg      sys32_sigaltstack_wrapper # branch to sys_sigreturn
+#endif
+
+#define SYSCALL(esa,esame,emu)	.long esame
+	.globl  sys_call_table	
+sys_call_table:
+#include "syscalls.S"
+#undef SYSCALL
+
+#ifdef CONFIG_S390_SUPPORT
+
+#define SYSCALL(esa,esame,emu)	.long emu
+	.globl  sys_call_table_emu
+sys_call_table_emu:
+#include "syscalls.S"
+#undef SYSCALL
+#endif
+
+/*
+ * Program check handler routine
+ */
+
+        .globl  pgm_check_handler
+pgm_check_handler:
+/*
+ * First we need to check for a special case:
+ * Single stepping an instruction that disables the PER event mask will
+ * cause a PER event AFTER the mask has been set. Example: SVC or LPSW.
+ * For a single stepped SVC the program check handler gets control after
+ * the SVC new PSW has been loaded. But we want to execute the SVC first and
+ * then handle the PER event. Therefore we update the SVC old PSW to point
+ * to the pgm_check_handler and branch to the SVC handler after we checked
+ * if we have to load the kernel stack register.
+ * For every other possible cause for PER event without the PER mask set
+ * we just ignore the PER event (FIXME: is there anything we have to do
+ * for LPSW?).
+ */
+        tm      __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception
+        jnz     pgm_per                  # got per exception -> special case
+	SAVE_ALL __LC_PGM_OLD_PSW,1
+	lgf     %r3,__LC_PGM_ILC	 # load program interruption code
+	lghi	%r8,0x7f
+	ngr	%r8,%r3
+        sll     %r8,3
+	GET_THREAD_INFO
+        larl    %r1,pgm_check_table
+        lg      %r1,0(%r8,%r1)		 # load address of handler routine
+        la      %r2,SP_PTREGS(%r15)	 # address of register-save area
+	larl	%r14,sysc_return
+        br      %r1			 # branch to interrupt-handler
+
+#
+# handle per exception
+#
+pgm_per:
+        tm      __LC_PGM_OLD_PSW,0x40    # test if per event recording is on
+        jnz     pgm_per_std              # ok, normal per event from user space
+# ok its one of the special cases, now we need to find out which one
+        clc     __LC_PGM_OLD_PSW(16),__LC_SVC_NEW_PSW
+        je      pgm_svcper
+# no interesting special case, ignore PER event
+	lpswe   __LC_PGM_OLD_PSW
+
+#
+# Normal per exception
+#
+pgm_per_std:
+	SAVE_ALL __LC_PGM_OLD_PSW,1
+	GET_THREAD_INFO
+	lghi    %r4,0x7f
+	lgf     %r3,__LC_PGM_ILC	 # load program interruption code
+        nr      %r4,%r3			 # clear per-event-bit and ilc
+        je      pgm_per_only		 # only per of per+check ?
+        sll     %r4,3
+        larl    %r1,pgm_check_table
+        lg      %r1,0(%r4,%r1)		 # load address of handler routine
+        la      %r2,SP_PTREGS(%r15)	 # address of register-save area
+        basr    %r14,%r1		 # branch to interrupt-handler
+pgm_per_only:
+        la      %r2,SP_PTREGS(15)	 # address of register-save area
+        larl    %r14,sysc_return	 # load adr. of system return
+        jg      handle_per_exception
+
+#
+# it was a single stepped SVC that is causing all the trouble
+#
+pgm_svcper:
+	SAVE_ALL __LC_SVC_OLD_PSW,1
+	llgh    %r8,__LC_SVC_INT_CODE # get svc number from lowcore
+	stosm   48(%r15),0x03     # reenable interrupts
+        GET_THREAD_INFO           # load pointer to task_struct to R9
+	slag	%r7,%r7,2         # *4 and test for svc 0
+	jnz	pgm_svcstd
+	# svc 0: system call number in %r1
+	clg	%r1,.Lnr_syscalls-.Lconst(%r14)
+	slag	%r7,%r1,2
+pgm_svcstd:
+	larl    %r7,sys_call_table
+#ifdef CONFIG_S390_SUPPORT
+        tm      SP_PSW+3(%r15),0x01  # are we running in 31 bit mode ?
+        jo      pgm_svcper_noemu
+	larl    %r7,sys_call_table_emu # use 31 bit emulation system calls
+pgm_svcper_noemu:
+#endif
+	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
+        lgf     %r8,0(%r8,%r7)    # load address of system call routine
+        jo      pgm_tracesys
+        basr    %r14,%r8          # call sys_xxxx
+        stg     %r2,SP_R2(%r15)   # store return value (change R2 on stack)
+                                  # ATTENTION: check sys_execve_glue before
+                                  # changing anything here !!
+
+pgm_svcret:
+	tm	__TI_flags+3(%r9),_TIF_SIGPENDING
+	jo	pgm_svcper_nosig
+        la      %r2,SP_PTREGS(%r15) # load pt_regs
+        sgr     %r3,%r3             # clear *oldset
+	brasl	%r14,do_signal
+	
+pgm_svcper_nosig:
+	lhi     %r0,__LC_PGM_OLD_PSW     # set trap indication back to pgm_chk
+	st      %r0,SP_TRAP(%r15)
+        la      %r2,SP_PTREGS(15) # address of register-save area
+        larl    %r14,sysc_return  # load adr. of system return
+        jg      handle_per_exception
+#
+# call trace before and after sys_call
+#
+pgm_tracesys:
+	lgfr	%r7,%r7
+	stg	%r7,SP_R2(%r15)
+        brasl   %r14,syscall_trace
+	clc	SP_R2(8,%r15),.Lnr_syscalls
+	jnl     pgm_svc_go
+	lg      %r2,SP_R2(%r15)
+	sllg    %r2,%r2,3           # strace wants to change the syscall
+	lgf	%r8,0(%r2,%r7)
+pgm_svc_go:
+	lmg     %r3,%r6,SP_R3(%r15)
+	lg      %r2,SP_ORIG_R2(%r15)
+        basr    %r14,%r8            # call sys_xxx
+        stg     %r2,SP_R2(%r15)     # store return value
+	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
+        jno     pgm_svcret
+	larl	%r14,pgm_svcret     # return point is sysc_return
+	jg	syscall_trace
+
+/*
+ * IO interrupt handler routine
+ */
+        .globl io_int_handler
+io_int_handler:
+        SAVE_ALL __LC_IO_OLD_PSW,0
+        GET_THREAD_INFO                # load pointer to task_struct to R9
+        la      %r2,SP_PTREGS(%r15)    # address of register-save area
+	llgh    %r3,__LC_SUBCHANNEL_NR # load subchannel number
+        llgf    %r4,__LC_IO_INT_PARM   # load interruption parm
+        llgf    %r5,__LC_IO_INT_WORD   # load interruption word
+	brasl   %r14,do_IRQ            # call standard irq handler
+
+io_return:
+        tm      SP_PSW+1(%r15),0x01    # returning to user ?
+#ifdef CONFIG_PREEMPT
+	jno     io_preempt             # no -> check for preemptive scheduling
+#else
+        jno     io_leave               # no-> skip resched & signal
+#endif
+	tm	__TI_flags+7(%r9),_TIF_WORK_INT
+	jnz	io_work                # there is work to do (signals etc.)
+io_leave:
+        RESTORE_ALL 0
+
+#ifdef CONFIG_PREEMPT
+io_preempt:
+	icm	%r0,15,__TI_precount(%r9)	
+	jnz     io_leave
+io_resume_loop:
+	tm	__TI_flags+7(%r9),_TIF_NEED_RESCHED
+	jno	io_leave
+	larl    %r1,.Lc_pactive
+	mvc     __TI_precount(4,%r9),0(%r1)
+	# hmpf, we are on the async. stack but to call schedule
+	# we have to move the interrupt frame to the process stack
+	lg	%r1,SP_R15(%r15)
+	aghi	%r1,-SP_SIZE
+	nill	%r1,0xfff8
+	mvc	SP_PTREGS(SP_SIZE-SP_PTREGS,%r1),SP_PTREGS(%r15)
+        xc      0(8,%r1),0(%r1)        # clear back chain
+	lgr	%r15,%r1
+        stosm   48(%r15),0x03          # reenable interrupts
+	brasl   %r14,schedule          # call schedule
+        stnsm   48(%r15),0xfc          # disable I/O and ext. interrupts
+        GET_THREAD_INFO                # load pointer to task_struct to R9
+	xc      __TI_precount(4,%r9),__TI_precount(%r9)
+	j	io_resume_loop
+#endif
+
+#
+# recheck if there is more work to do
+#
+io_work_loop:
+        stnsm   48(%r15),0xfc          # disable I/O and ext. interrupts
+        GET_THREAD_INFO                # load pointer to task_struct to R9
+	tm	__TI_flags+7(%r9),_TIF_WORK_INT
+	jz	io_leave               # there is no work to do
+#
+# One of the work bits is on. Find out which one.
+# Checked are: _TIF_SIGPENDING and _TIF_NEED_RESCHED
+#
+io_work:
+	tm	__TI_flags+7(%r9),_TIF_NEED_RESCHED
+	jo	io_reschedule
+	tm	__TI_flags+7(%r9),_TIF_SIGPENDING
+	jo	io_sigpending
+	j	io_leave
+
+#
+# _TIF_NEED_RESCHED is set, call schedule
+#	
+io_reschedule:        
+        stosm   48(%r15),0x03       # reenable interrupts
+	larl    %r14,io_work_loop
+        jg      schedule            # call scheduler
+
+#
+# _TIF_SIGPENDING is set, call do_signal
+#
+io_sigpending:     
+        stosm   48(%r15),0x03       # reenable interrupts
+        la      %r2,SP_PTREGS(%r15) # load pt_regs
+        slgr    %r3,%r3             # clear *oldset
+	brasl	%r14,do_signal      # call do_signal
+        stnsm   48(%r15),0xfc       # disable I/O and ext. interrupts
+	j	sysc_leave          # out of here, do NOT recheck
+
+/*
+ * External interrupt handler routine
+ */
+        .globl  ext_int_handler
+ext_int_handler:
+        SAVE_ALL __LC_EXT_OLD_PSW,0
+        GET_THREAD_INFO                # load pointer to task_struct to R9
+	llgh	%r6,__LC_EXT_INT_CODE  # get interruption code
+	lgr	%r1,%r6		       # calculate index = code & 0xff
+	nill	%r1,0xff
+	sll	%r1,3
+	larl	%r7,ext_int_hash
+	lg	%r7,0(%r1,%r7)	       # get first list entry for hash value
+	ltgr	%r7,%r7		       # == NULL ?
+	jz	io_return	       # yes, nothing to do, exit
+ext_int_loop:
+	ch	%r6,16(%r7)	       # compare external interrupt code
+	jne	ext_int_next
+	lg	%r1,8(%r7)	       # get handler address
+	la	%r2,SP_PTREGS(%r15)    # address of register-save area
+	lgr	%r3,%r6		       # interruption code
+	basr	%r14,%r1	       # call handler
+ext_int_next:
+	lg	%r7,0(%r7)	       # next list entry
+	ltgr	%r7,%r7
+	jnz	ext_int_loop
+	j	io_return
+
+/*
+ * Machine check handler routines
+ */
+        .globl mcck_int_handler
+mcck_int_handler:
+        SAVE_ALL __LC_MCK_OLD_PSW,0
+	brasl   %r14,s390_do_machine_check
+mcck_return:
+        RESTORE_ALL 0
+
+#ifdef CONFIG_SMP
+/*
+ * Restart interruption handler, kick starter for additional CPUs
+ */
+        .globl restart_int_handler
+restart_int_handler:
+        lg      %r15,__LC_SAVE_AREA+120 # load ksp
+        lghi    %r10,__LC_CREGS_SAVE_AREA
+        lctlg   %c0,%c15,0(%r10) # get new ctl regs
+        lghi    %r10,__LC_AREGS_SAVE_AREA
+        lam     %a0,%a15,0(%r10)
+        stosm   0(%r15),0x04           # now we can turn dat on
+        lmg     %r6,%r15,48(%r15)      # load registers from clone
+	jg      start_secondary
+#else
+/*
+ * If we do not run with SMP enabled, let the new CPU crash ...
+ */
+        .globl restart_int_handler
+restart_int_handler:
+        basr    %r1,0
+restart_base:
+        lpswe   restart_crash-restart_base(%r1)
+        .align 8
+restart_crash:
+        .long  0x000a0000,0x00000000,0x00000000,0x00000000
+restart_go:
+#endif
+
+/*
+ * Integer constants
+ */
+               .align 4
+.Lconst:
+.Lc_ac:        .long  0,0,1
+.Lc_pactive:   .long  PREEMPT_ACTIVE
+.L0x0130:      .long  0x0130
+.L0x0140:      .long  0x0140
+.L0x0150:      .long  0x0150
+.L0x0160:      .long  0x0160
+.L0x0170:      .long  0x0170
+.Lnr_syscalls: .long  NR_syscalls
diff -Nru a/arch/s390/kernel/gdb-stub.c b/arch/s390/kernel/gdb-stub.c
--- a/arch/s390/kernel/gdb-stub.c	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,581 +0,0 @@
-/*
- *  arch/s390/kernel/gdb-stub.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *
- *  Originally written by Glenn Engel, Lake Stevens Instrument Division
- *
- *  Contributed by HP Systems
- *
- *  Modified for SPARC by Stu Grossman, Cygnus Support.
- *
- *  Modified for Linux/MIPS (and MIPS in general) by Andreas Busse
- *  Send complaints, suggestions etc. to <andy@waldorf-gmbh.de>
- *
- *  Copyright (C) 1995 Andreas Busse
- */
-
-/*
- *  To enable debugger support, two things need to happen.  One, a
- *  call to set_debug_traps() is necessary in order to allow any breakpoints
- *  or error conditions to be properly intercepted and reported to gdb.
- *  Two, a breakpoint needs to be generated to begin communication.  This
- *  is most easily accomplished by a call to breakpoint().  Breakpoint()
- *  simulates a breakpoint by executing a BREAK instruction.
- *
- *
- *    The following gdb commands are supported:
- *
- * command          function                               Return value
- *
- *    g             return the value of the CPU registers  hex data or ENN
- *    G             set the value of the CPU registers     OK or ENN
- *
- *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
- *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
- *
- *    c             Resume at current address              SNN   ( signal NN)
- *    cAA..AA       Continue at address AA..AA             SNN
- *
- *    s             Step one instruction                   SNN
- *    sAA..AA       Step one instruction from AA..AA       SNN
- *
- *    k             kill
- *
- *    ?             What was the last sigval ?             SNN   (signal NN)
- *
- *
- * All commands and responses are sent with a packet which includes a
- * checksum.  A packet consists of
- *
- * $<packet info>#<checksum>.
- *
- * where
- * <packet info> :: <characters representing the command or response>
- * <checksum>    :: < two hex digits computed as modulo 256 sum of <packetinfo>>
- *
- * When a packet is received, it is first acknowledged with either '+' or '-'.
- * '+' indicates a successful transfer.  '-' indicates a failed transfer.
- *
- * Example:
- *
- * Host:                  Reply:
- * $m0,10#2a               +$00010203040506070809101112131415#42
- *
- */
-#define TRUE 1
-#define FALSE 0
-#include <asm/gdb-stub.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-#include <linux/stddef.h>
-
-#define S390_REGS_COMMON_SIZE offsetof(struct gdb_pt_regs,orig_gpr2)
-
-/*
- * external low-level support routines
- */
-
-
-extern void fltr_set_mem_err(void);
-extern void trap_low(void);
-
-/*
- * breakpoint and test functions
- */
-extern void breakpoint(void);
-extern void breakinst(void);
-
-/*
- * local prototypes
- */
-
-static void getpacket(char *buffer);
-static void putpacket(char *buffer);
-static int hex(unsigned char ch);
-static int hexToInt(char **ptr, int *intValue);
-static unsigned char *mem2hex(char *mem, char *buf, int count, int may_fault);
-
-
-/*
- * BUFMAX defines the maximum number of characters in inbound/outbound buffers
- * at least NUMREGBYTES*2 are needed for register packets
- */
-#define BUFMAX 2048
-
-static char input_buffer[BUFMAX];
-static char output_buffer[BUFMAX];
-int gdb_stub_initialised = FALSE;	
-static const char hexchars[]="0123456789abcdef";
-
-
-/*
- * Convert ch from a hex digit to an int
- */
-static int hex(unsigned char ch)
-{
-	if (ch >= 'a' && ch <= 'f')
-		return ch-'a'+10;
-	if (ch >= '0' && ch <= '9')
-		return ch-'0';
-	if (ch >= 'A' && ch <= 'F')
-		return ch-'A'+10;
-	return -1;
-}
-
-/*
- * scan for the sequence $<data>#<checksum>
- */
-static void getpacket(char *buffer)
-{
-	unsigned char checksum;
-	unsigned char xmitcsum;
-	int i;
-	int count;
-	unsigned char ch;
-
-	do {
-		/*
-		 * wait around for the start character,
-		 * ignore all other characters
-		 */
-		while ((ch = (getDebugChar() & 0x7f)) != '$') ;
-
-		checksum = 0;
-		xmitcsum = -1;
-		count = 0;
-	
-		/*
-		 * now, read until a # or end of buffer is found
-		 */
-		while (count < BUFMAX) {
-			ch = getDebugChar() & 0x7f;
-			if (ch == '#')
-				break;
-			checksum = checksum + ch;
-			buffer[count] = ch;
-			count = count + 1;
-		}
-
-		if (count >= BUFMAX)
-			continue;
-
-		buffer[count] = 0;
-
-		if (ch == '#') {
-			xmitcsum = hex(getDebugChar() & 0x7f) << 4;
-			xmitcsum |= hex(getDebugChar() & 0x7f);
-
-			if (checksum != xmitcsum)
-				putDebugChar('-');	/* failed checksum */
-			else {
-				putDebugChar('+'); /* successful transfer */
-
-				/*
-				 * if a sequence char is present,
-				 * reply the sequence ID
-				 */
-				if (buffer[2] == ':') {
-					putDebugChar(buffer[0]);
-					putDebugChar(buffer[1]);
-
-					/*
-					 * remove sequence chars from buffer
-					 */
-					count = strlen(buffer);
-					for (i=3; i <= count; i++)
-						buffer[i-3] = buffer[i];
-				}
-			}
-		}
-	}
-	while (checksum != xmitcsum);
-}
-
-/*
- * send the packet in buffer.
- */
-static void putpacket(char *buffer)
-{
-	unsigned char checksum;
-	int count;
-	unsigned char ch;
-
-	/*
-	 * $<packet info>#<checksum>.
-	 */
-
-	do {
-		putDebugChar('$');
-		checksum = 0;
-		count = 0;
-
-		while ((ch = buffer[count]) != 0) {
-			if (!(putDebugChar(ch)))
-				return;
-			checksum += ch;
-			count += 1;
-		}
-
-		putDebugChar('#');
-		putDebugChar(hexchars[checksum >> 4]);
-		putDebugChar(hexchars[checksum & 0xf]);
-
-	}
-	while ((getDebugChar() & 0x7f) != '+');
-}
-
-
-
-/*
- * Convert the memory pointed to by mem into hex, placing result in buf.
- * Return a pointer to the last char put in buf (null), in case of mem fault,
- * return 0.
- * If MAY_FAULT is non-zero, then we will handle memory faults by returning
- * a 0, else treat a fault like any other fault in the stub.
- */
-static unsigned char *mem2hex(char *mem, char *buf, int count, int may_fault)
-{
-	unsigned char ch;
-
-/*	set_mem_fault_trap(may_fault); */
-
-	while (count-- > 0) {
-		ch = *(mem++);
-#if 0
-		if (mem_err)
-			return 0;
-#endif
-		*buf++ = hexchars[ch >> 4];
-		*buf++ = hexchars[ch & 0xf];
-	}
-
-	*buf = 0;
-
-/*	set_mem_fault_trap(0); */
-
-	return buf;
-}
-
-/*
- * convert the hex array pointed to by buf into binary to be placed in mem
- * return a pointer to the character AFTER the last byte written
- */
-static char *hex2mem(char *buf, char *mem, int count, int may_fault)
-{
-	int i;
-	unsigned char ch;
-
-/*	set_mem_fault_trap(may_fault); */
-
-	for (i=0; i<count; i++)
-	{
-		ch = hex(*buf++) << 4;
-		ch |= hex(*buf++);
-		*(mem++) = ch;
-#if 0
-		if (mem_err)
-			return 0;
-#endif
-	}
-
-/*	set_mem_fault_trap(0); */
-
-	return mem;
-}
-
-
-
-/*
- * Set up exception handlers for tracing and breakpoints
- */
-void set_debug_traps(void)
-{
-//	unsigned long flags;
-	unsigned char c;
-
-//	save_and_cli(flags);
-	/*
-	 * In case GDB is started before us, ack any packets
-	 * (presumably "$?#xx") sitting there.
-	 */
-	while((c = getDebugChar()) != '$');
-	while((c = getDebugChar()) != '#');
-	c = getDebugChar(); /* eat first csum byte */
-	c = getDebugChar(); /* eat second csum byte */
-	putDebugChar('+'); /* ack it */
-
-	gdb_stub_initialised = TRUE;
-//	restore_flags(flags);
-}
-
-
-/*
- * Trap handler for memory errors.  This just sets mem_err to be non-zero.  It
- * assumes that %l1 is non-zero.  This should be safe, as it is doubtful that
- * 0 would ever contain code that could mem fault.  This routine will skip
- * past the faulting instruction after setting mem_err.
- */
-extern void fltr_set_mem_err(void)
-{
-  /* FIXME: Needs to be written... */
-}
-
-
-/*
- * While we find nice hex chars, build an int.
- * Return number of chars processed.
- */
-static int hexToInt(char **ptr, int *intValue)
-{
-	int numChars = 0;
-	int hexValue;
-
-	*intValue = 0;
-
-	while (**ptr)
-	{
-		hexValue = hex(**ptr);
-		if (hexValue < 0)
-			break;
-
-		*intValue = (*intValue << 4) | hexValue;
-		numChars ++;
-
-		(*ptr)++;
-	}
-
-	return (numChars);
-}
-
-void gdb_stub_get_non_pt_regs(struct gdb_pt_regs *regs)
-{
-	s390_fp_regs *fpregs=&regs->fp_regs;
-	int has_ieee=save_fp_regs1(fpregs);
-
-	if(!has_ieee)
-	{
-		fpregs->fpc=0;
-		fpregs->fprs[1].d=
-		fpregs->fprs[3].d=
-		fpregs->fprs[5].d=
-		fpregs->fprs[7].d=0;
-		memset(&fpregs->fprs[8].d,0,sizeof(freg_t)*8);
-	}
-}
-
-void gdb_stub_set_non_pt_regs(struct gdb_pt_regs *regs)
-{
-	restore_fp_regs1(&regs->fp_regs);
-}
-
-void gdb_stub_send_signal(int sigval)
-{
-	char *ptr;
-	ptr = output_buffer;
-
-	/*
-	 * Send trap type (converted to signal)
-	 */
-	*ptr++ = 'S';
-	*ptr++ = hexchars[sigval >> 4];
-	*ptr++ = hexchars[sigval & 0xf];
-	*ptr++ = 0;
-	putpacket(output_buffer);	/* send it off... */
-}
-
-/*
- * This function does all command processing for interfacing to gdb.  It
- * returns 1 if you should skip the instruction at the trap address, 0
- * otherwise.
- */
-void gdb_stub_handle_exception(struct gdb_pt_regs *regs,int sigval)
-{
-	int trap;			/* Trap type */
-	int addr;
-	int length;
-	char *ptr;
-	unsigned long *stack;
-
-	
-	/*
-	 * reply to host that an exception has occurred
-	 */
-#if 0
-	send_signal(sigval);
-#endif
-	/*
-	 * Wait for input from remote GDB
-	 */
-	while (1) 
-	{
-		output_buffer[0] = 0;
-		getpacket(input_buffer);
-
-		switch (input_buffer[0])
-		{
-		case '?':
-#if 0
-			send_signal(sigval);
-#endif
-			continue;
-
-		case 'd':
-			/* toggle debug flag */
-			break;
-
-		/*
-		 * Return the value of the CPU registers
-		 */
-		case 'g':
-			gdb_stub_get_non_pt_regs(regs);
-			ptr = output_buffer;
-			ptr=  mem2hex((char *)regs,ptr,S390_REGS_COMMON_SIZE,FALSE);
-			ptr=  mem2hex((char *)&regs->crs[0],ptr,NUM_CRS*CR_SIZE,FALSE);
-			ptr = mem2hex((char *)&regs->fp_regs, ptr,sizeof(s390_fp_regs),FALSE);
-			break;
-	  
-		/*
-		 * set the value of the CPU registers - return OK
-		 * FIXME: Needs to be written
-		 */
-		case 'G':
-			ptr=input_buffer;
-			hex2mem (ptr, (char *)regs,S390_REGS_COMMON_SIZE, FALSE);
-			ptr+=S390_REGS_COMMON_SIZE*2;
-			hex2mem (ptr, (char *)regs->crs[0],NUM_CRS*CR_SIZE, FALSE);
-			ptr+=NUM_CRS*CR_SIZE*2;
-			hex2mem (ptr, (char *)&regs->fp_regs,sizeof(s390_fp_regs), FALSE);
-			gdb_stub_set_non_pt_regs(regs);
-			strcpy(output_buffer,"OK");
-		break;
-
-		/*
-		 * mAA..AA,LLLL  Read LLLL bytes at address AA..AA
-		 */
-		case 'm':
-			ptr = &input_buffer[1];
-
-			if (hexToInt(&ptr, &addr)
-				&& *ptr++ == ','
-				&& hexToInt(&ptr, &length)) {
-				if (mem2hex((char *)addr, output_buffer, length, 1))
-					break;
-				strcpy (output_buffer, "E03");
-			} else
-				strcpy(output_buffer,"E01");
-			break;
-
-		/*
-		 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK
-		 */
-		case 'M': 
-			ptr = &input_buffer[1];
-
-			if (hexToInt(&ptr, &addr)
-				&& *ptr++ == ','
-				&& hexToInt(&ptr, &length)
-				&& *ptr++ == ':') 
-			{
-				if (hex2mem(ptr, (char *)addr, length, 1))
-					strcpy(output_buffer, "OK");
-				else
-					strcpy(output_buffer, "E03");
-			}
-			else
-				strcpy(output_buffer, "E02");
-			break;
-
-		/*
-		 * cAA..AA    Continue at address AA..AA(optional)
-		 */
-		case 'c':    
-			/* try to read optional parameter, pc unchanged if no parm */
-
-			ptr = &input_buffer[1];
-			if (hexToInt(&ptr, &addr))
-				regs->psw.addr = addr;
-			/*
-			 * Need to flush the instruction cache here, as we may
-			 * have deposited a breakpoint, and the icache probably
-			 * has no way of knowing that a data ref to some location
-			 * may have changed something that is in the instruction
-			 * cache.
-			 * NB: We flush both caches, just to be sure...
-			 */
-
-			flush_cache_all();
-			return;
-			/* NOTREACHED */
-			break;
-
-
-		/*
-		 * kill the program
-		 */
-		case 'k' :
-			break;		/* do nothing */
-
-
-		/*
-		 * Reset the whole machine (FIXME: system dependent)
-		 */
-		case 'r':
-			break;
-
-
-		/*
-		 * Step to next instruction
-		 */
-		case 's':
-			/*
-			 * There is no single step insn in the MIPS ISA, so we
-			 * use breakpoints and continue, instead.
-			 */
-#if 0
-			single_step(regs);
-#endif
-			flush_cache_all();
-			return;
-			/* NOTREACHED */
-			break;
-
-		}      /* switch */
-
-	/*
-	 * reply to the request
-	 */
-	
-		putpacket(output_buffer);
-	
-	} /* while */
-}
-
-/*
- * This function will generate a breakpoint exception.  It is used at the
- * beginning of a program to sync up with a debugger and can be used
- * otherwise as a quick means to stop program execution and "break" into
- * the debugger.
- */
-void breakpoint(void)
-{
-	if (!gdb_stub_initialised)
-		return;
-	asm volatile (".globl	breakinst\n"
-		"breakinst:\t.word   %0"
-		: : "i" (S390_BREAKPOINT_U16) );
-}
-
-
-
-
-
-
-
diff -Nru a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/head64.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,664 @@
+/*
+ *  arch/s390/kernel/head.S
+ *
+ *  S390 version
+ *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Hartmut Penner (hp@de.ibm.com),
+ *               Martin Schwidefsky (schwidefsky@de.ibm.com),
+ *               Rob van der Heij (rvdhei@iae.nl)
+ *
+ * There are 5 different IPL methods
+ *  1) load the image directly into ram at address 0 and do an PSW restart
+ *  2) linload will load the image from address 0x10000 to memory 0x10000
+ *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
+ *  3) generate the tape ipl header, store the generated image on a tape
+ *     and ipl from it
+ *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
+ *  4) generate the vm reader ipl header, move the generated image to the
+ *     VM reader (use option NOH!) and do a ipl from reader (VM only)
+ *  5) direct call of start by the SALIPL loader
+ *  We use the cpuid to distinguish between VM and native ipl
+ *  params for kernel are pushed to 0x10400 (see setup.h)
+
+    Changes: 
+    Okt 25 2000 <rvdheij@iae.nl>
+	added code to skip HDR and EOF to allow SL tape IPL (5 retries)
+	changed first CCW from rewind to backspace block
+
+ */
+
+#include <linux/config.h>
+#include <asm/setup.h>
+#include <asm/lowcore.h>
+
+#ifndef CONFIG_IPL
+        .org   0
+        .long  0x00080000,0x80000000+startup   # Just a restart PSW
+#else
+#ifdef CONFIG_IPL_TAPE
+#define IPL_BS 1024
+        .org   0
+        .long  0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
+        .long  0x27000000,0x60000001           # by ipl to addresses 0-23.
+        .long  0x02000000,0x20000000+IPL_BS    # (a PSW and two CCWs).
+        .long  0x00000000,0x00000000           # external old psw
+        .long  0x00000000,0x00000000           # svc old psw
+        .long  0x00000000,0x00000000           # program check old psw
+        .long  0x00000000,0x00000000           # machine check old psw
+        .long  0x00000000,0x00000000           # io old psw
+        .long  0x00000000,0x00000000
+        .long  0x00000000,0x00000000
+        .long  0x00000000,0x00000000
+        .long  0x000a0000,0x00000058           # external new psw
+        .long  0x000a0000,0x00000060           # svc new psw
+        .long  0x000a0000,0x00000068           # program check new psw
+        .long  0x000a0000,0x00000070           # machine check new psw
+        .long  0x00080000,0x80000000+.Lioint   # io new psw
+
+        .org   0x100
+#
+# subroutine for loading from tape
+# Paramters:	
+#  R1 = device number
+#  R2 = load address
+.Lloader:	
+        st    %r14,.Lldret
+        la    %r3,.Lorbread                    # r3 = address of orb 
+	la    %r5,.Lirb                        # r5 = address of irb
+        st    %r2,.Lccwread+4                  # initialize CCW data addresses
+        lctl  %c6,%c6,.Lcr6               
+        slr   %r2,%r2
+.Lldlp:
+        la    %r6,3                            # 3 retries
+.Lssch:
+        ssch  0(%r3)                           # load chunk of IPL_BS bytes
+        bnz   .Llderr
+.Lw4end:
+        bas   %r14,.Lwait4io
+        tm    8(%r5),0x82                      # do we have a problem ?
+        bnz   .Lrecov
+        slr   %r7,%r7
+        icm   %r7,3,10(%r5)                    # get residual count
+        lcr   %r7,%r7
+        la    %r7,IPL_BS(%r7)                  # IPL_BS-residual=#bytes read
+        ar    %r2,%r7                          # add to total size
+        tm    8(%r5),0x01                      # found a tape mark ?
+        bnz   .Ldone
+        l     %r0,.Lccwread+4                  # update CCW data addresses
+        ar    %r0,%r7
+        st    %r0,.Lccwread+4                
+        b     .Lldlp
+.Ldone:
+        l     %r14,.Lldret
+        br    %r14                             # r2 contains the total size
+.Lrecov:
+        bas   %r14,.Lsense                     # do the sensing
+        bct   %r6,.Lssch                       # dec. retry count & branch
+        b     .Llderr
+#
+# Sense subroutine
+#
+.Lsense:
+        st    %r14,.Lsnsret
+        la    %r7,.Lorbsense              
+        ssch  0(%r7)                           # start sense command
+        bnz   .Llderr
+        bas   %r14,.Lwait4io
+        l     %r14,.Lsnsret
+        tm    8(%r5),0x82                      # do we have a problem ?
+        bnz   .Llderr
+        br    %r14
+#
+# Wait for interrupt subroutine
+#
+.Lwait4io:
+        lpsw  .Lwaitpsw                 
+.Lioint:
+        c     %r1,0xb8                         # compare subchannel number
+        bne   .Lwait4io
+        tsch  0(%r5)
+        slr   %r0,%r0
+        tm    8(%r5),0x82                      # do we have a problem ?
+        bnz   .Lwtexit
+        tm    8(%r5),0x04                      # got device end ?
+        bz    .Lwait4io
+.Lwtexit:
+        br    %r14
+.Llderr:
+        lpsw  .Lcrash              
+
+        .align 8
+.Lorbread:
+	.long  0x00000000,0x0080ff00,.Lccwread
+        .align 8
+.Lorbsense:
+        .long  0x00000000,0x0080ff00,.Lccwsense
+        .align 8
+.Lccwread:
+        .long  0x02200000+IPL_BS,0x00000000
+.Lccwsense:
+        .long  0x04200001,0x00000000
+.Lwaitpsw:
+	.long  0x020a0000,0x80000000+.Lioint
+
+.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+.Lcr6:  .long  0xff000000
+        .align 8
+.Lcrash:.long  0x000a0000,0x00000000
+.Lldret:.long  0
+.Lsnsret: .long 0
+#endif  /* CONFIG_IPL_TAPE */
+
+#ifdef CONFIG_IPL_VM
+#define IPL_BS 0x730
+        .org   0
+        .long  0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
+        .long  0x02000018,0x60000050           # by ipl to addresses 0-23.
+        .long  0x02000068,0x60000050           # (a PSW and two CCWs).
+        .fill  80-24,1,0x40                    # bytes 24-79 are discarded !!
+        .long  0x020000f0,0x60000050           # The next 160 byte are loaded
+        .long  0x02000140,0x60000050           # to addresses 0x18-0xb7
+        .long  0x02000190,0x60000050           # They form the continuation
+        .long  0x020001e0,0x60000050           # of the CCW program started
+        .long  0x02000230,0x60000050           # by ipl and load the range
+        .long  0x02000280,0x60000050           # 0x0f0-0x730 from the image
+        .long  0x020002d0,0x60000050           # to the range 0x0f0-0x730
+        .long  0x02000320,0x60000050           # in memory. At the end of
+        .long  0x02000370,0x60000050           # the channel program the PSW
+        .long  0x020003c0,0x60000050           # at location 0 is loaded.
+        .long  0x02000410,0x60000050           # Initial processing starts
+        .long  0x02000460,0x60000050           # at 0xf0 = iplstart.
+        .long  0x020004b0,0x60000050
+        .long  0x02000500,0x60000050
+        .long  0x02000550,0x60000050
+        .long  0x020005a0,0x60000050
+        .long  0x020005f0,0x60000050
+        .long  0x02000640,0x60000050
+        .long  0x02000690,0x60000050
+        .long  0x020006e0,0x20000050
+
+        .org   0xf0
+#
+# subroutine for loading cards from the reader
+#
+.Lloader:	
+	la    %r3,.Lorb                        # r2 = address of orb into r2
+	la    %r5,.Lirb                        # r4 = address of irb
+        la    %r6,.Lccws              
+        la    %r7,20
+.Linit:
+        st    %r2,4(%r6)                       # initialize CCW data addresses
+        la    %r2,0x50(%r2)
+        la    %r6,8(%r6)
+        bct   7,.Linit
+
+        lctl  %c6,%c6,.Lcr6                    # set IO subclass mask
+	slr   %r2,%r2
+.Lldlp:
+        ssch  0(%r3)                           # load chunk of 1600 bytes
+        bnz   .Llderr
+.Lwait4irq:
+        mvc   0x78(8),.Lnewpsw                 # set up IO interrupt psw
+        lpsw  .Lwaitpsw              
+.Lioint:
+        c     %r1,0xb8                         # compare subchannel number
+	bne   .Lwait4irq
+	tsch  0(%r5)
+
+	slr   %r0,%r0
+	ic    %r0,8(%r5)                       # get device status
+	chi   %r0,8                            # channel end ?
+	be    .Lcont
+	chi   %r0,12                           # channel end + device end ?
+	be    .Lcont
+
+        l     %r0,4(%r5)
+        s     %r0,8(%r3)                       # r0/8 = number of ccws executed
+        mhi   %r0,10                           # *10 = number of bytes in ccws
+        lh    %r3,10(%r5)                      # get residual count
+        sr    %r0,%r3                          # #ccws*80-residual=#bytes read
+	ar    %r2,%r0
+	
+        br    %r14                             # r2 contains the total size
+
+.Lcont:
+	ahi   %r2,0x640                        # add 0x640 to total size
+        la    %r6,.Lccws             
+        la    %r7,20
+.Lincr:
+        l     %r0,4(%r6)                       # update CCW data addresses
+        ahi   %r0,0x640
+        st    %r0,4(%r6)
+        ahi   %r6,8
+        bct   7,.Lincr
+
+        b     .Lldlp
+.Llderr:
+        lpsw  .Lcrash              
+
+        .align 8
+.Lorb:	.long  0x00000000,0x0080ff00,.Lccws
+.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+.Lcr6:  .long  0xff000000
+.Lloadp:.long  0,0
+        .align 8
+.Lcrash:.long  0x000a0000,0x00000000
+.Lnewpsw:
+        .long  0x00080000,0x80000000+.Lioint
+.Lwaitpsw:
+        .long  0x020a0000,0x80000000+.Lioint
+
+        .align 8
+.Lccws: .rept  19
+        .long  0x02600050,0x00000000
+        .endr
+        .long  0x02200050,0x00000000
+#endif  /* CONFIG_IPL_VM */
+
+iplstart:
+        lh    %r1,0xb8                         # test if subchannel number
+        bct   %r1,.Lnoload                     #  is valid
+	l     %r1,0xb8                         # load ipl subchannel number
+        la    %r2,IPL_BS                       # load start address
+        bas   %r14,.Lloader                    # load rest of ipl image
+        larl  %r12,_pstart                     # pointer to parameter area
+        st    %r1,IPL_DEVICE+4-PARMAREA(%r12)  # store ipl device number
+
+#
+# load parameter file from ipl device
+#
+.Lagain1:
+ 	l     %r2,INITRD_START+4-PARMAREA(%r12)# use ramdisk location as temp
+        bas   %r14,.Lloader                    # load parameter file
+        ltr   %r2,%r2                          # got anything ?
+        bz    .Lnopf
+	chi   %r2,895
+	bnh   .Lnotrunc
+	la    %r2,895
+.Lnotrunc:
+	l     %r4,INITRD_START+4-PARMAREA(%r12)
+ 	clc   0(3,%r4),.L_hdr		       # if it is HDRx
+ 	bz    .Lagain1			       # skip dataset header
+ 	clc   0(3,%r4),.L_eof		       # if it is EOFx
+ 	bz    .Lagain1			       # skip dateset trailer
+        la    %r5,0(%r4,%r2)
+        lr    %r3,%r2
+.Lidebc:
+        tm    0(%r5),0x80                      # high order bit set ?
+        bo    .Ldocv                           #  yes -> convert from EBCDIC
+        ahi   %r5,-1
+        bct   %r3,.Lidebc
+        b     .Lnocv
+.Ldocv:
+        l     %r3,.Lcvtab
+        tr    0(256,%r4),0(%r3)                # convert parameters to ascii
+        tr    256(256,%r4),0(%r3)
+        tr    512(256,%r4),0(%r3)
+        tr    768(122,%r4),0(%r3)
+.Lnocv: la    %r3,COMMAND_LINE-PARMAREA(%r12)  # load adr. of command line
+	mvc   0(256,%r3),0(%r4)
+	mvc   256(256,%r3),256(%r4)
+	mvc   512(256,%r3),512(%r4)
+	mvc   768(122,%r3),768(%r4)
+        slr   %r0,%r0
+        b     .Lcntlp
+.Ldelspc:
+        ic    %r0,0(%r2,%r3)
+        chi   %r0,0x20                         # is it a space ?
+        be    .Lcntlp
+        ahi   %r2,1
+        b     .Leolp
+.Lcntlp:
+        brct  %r2,.Ldelspc
+.Leolp:
+        slr   %r0,%r0
+        stc   %r0,0(%r2,%r3)                   # terminate buffer
+.Lnopf:
+
+#
+# load ramdisk from ipl device
+#
+.Lagain2:
+ 	l     %r2,INITRD_START+4-PARMAREA(%r12)# load adr. of ramdisk
+        bas   %r14,.Lloader                    # load ramdisk
+ 	st    %r2,INITRD_SIZE+4-PARMAREA(%r12) # store size of ramdisk
+        ltr   %r2,%r2
+        bnz   .Lrdcont
+        st    %r2,INITRD_START+4-PARMAREA(%r12)# no ramdisk found, null it
+.Lrdcont:
+	l     %r2,INITRD_START+4-PARMAREA(%r12)
+	clc   0(3,%r2),.L_hdr		       # skip HDRx and EOFx 
+	bz    .Lagain2
+	clc   0(3,%r2),.L_eof
+	bz    .Lagain2
+
+#ifdef CONFIG_IPL_VM
+#
+# reset files in VM reader
+#
+        stidp __LC_CPUID                       # store cpuid
+	tm    __LC_CPUID,0xff                  # running VM ?
+	bno   .Lnoreset
+        la    %r2,.Lreset              
+        lhi   %r3,26
+        .long 0x83230008
+.Lnoreset:
+#endif
+	
+#
+# everything loaded, go for it
+#
+.Lnoload:
+        l     %r1,.Lstartup
+        br    %r1
+
+.Lstartup: .long startup
+.Lcvtab:.long  _ebcasc                         # ebcdic to ascii table
+.Lreset:.byte  0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
+        .byte  0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
+        .byte  0xc8,0xd6,0xd3,0xc4             # "change rdr all keep nohold"
+.L_eof: .long  0xc5d6c600       /* C'EOF' */
+.L_hdr: .long  0xc8c4d900       /* C'HDR' */
+#endif  /* CONFIG_IPL */
+
+#
+# SALIPL loader support. Based on a patch by Rob van der Heij.
+# This entry point is called directly from the SALIPL loader and
+# doesn't need a builtin ipl record.
+#
+        .org  0x800
+	.globl start
+start:
+	stm   %r0,%r15,0x07b0		# store registers
+	basr  %r12,%r0
+.base:
+	l     %r11,.parm
+	l     %r8,.cmd			# pointer to command buffer
+
+	ltr   %r9,%r9			# do we have SALIPL parameters?
+	bp    .sk8x8
+
+	mvc   0(64,%r8),0x00b0		# copy saved registers
+	xc    64(240-64,%r8),0(%r8)	# remainder of buffer
+	tr    0(64,%r8),.lowcase	
+	b     .gotr
+.sk8x8:
+	mvc   0(240,%r8),0(%r9)		# copy iplparms into buffer
+.gotr:
+	l     %r10,.tbl			# EBCDIC to ASCII table
+	tr    0(240,%r8),0(%r10)
+	stidp __LC_CPUID		# Are we running on VM maybe
+	cli   __LC_CPUID,0xff
+	bnz   .test
+	.long 0x83300060		# diag 3,0,x'0060' - storage size
+	b     .done
+.test:
+	mvc   0x68(8),.pgmnw		# set up pgm check handler
+	l     %r2,.fourmeg
+	lr    %r3,%r2
+	bctr  %r3,%r0			# 4M-1
+.loop:  iske  %r0,%r3
+	ar    %r3,%r2
+.pgmx:
+	sr    %r3,%r2
+	la    %r3,1(%r3)
+.done:
+	l     %r1,.memsize
+	st    %r3,4(%r1)
+	slr   %r0,%r0
+	st    %r0,INITRD_SIZE+4-PARMAREA(%r11)
+	st    %r0,INITRD_START+4-PARMAREA(%r11)
+	j     startup                   # continue with startup
+.tbl:	.long _ebcasc			# translate table
+.cmd:	.long COMMAND_LINE		# address of command line buffer
+.parm:	.long PARMAREA
+.fourmeg: .long 0x00400000      	# 4M
+.pgmnw:	.long 0x00080000,.pgmx
+.memsize: .long memory_size
+.lowcase:
+	.byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 
+	.byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
+	.byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 
+	.byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
+	.byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 
+	.byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
+	.byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37 
+	.byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
+	.byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47 
+	.byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
+	.byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57 
+	.byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
+	.byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67 
+	.byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
+	.byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77 
+	.byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
+
+	.byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87 
+	.byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
+	.byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97 
+	.byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
+	.byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7 
+	.byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
+	.byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7 
+	.byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
+	.byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87	# .abcdefg 
+	.byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf	# hi
+	.byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97 	# .jklmnop
+	.byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf	# qr
+	.byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7	# ..stuvwx
+	.byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef	# yz
+	.byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7 
+	.byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
+
+#
+# startup-code at 0x10000, running in real mode
+# this is called either by the ipl loader or directly by PSW restart
+# or linload or SALIPL
+#
+        .org  0x10000
+startup:basr  %r13,0                     # get base
+.LPG1:  sll   %r13,1                     # remove high order bit
+        srl   %r13,1
+        lhi   %r1,1                      # mode 1 = esame
+        slr   %r0,%r0                    # set cpuid to zero
+        sigp  %r1,%r0,0x12               # switch to esame mode
+	sam64				 # switch to 64 bit mode
+	lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
+	larl  %r12,_pstart               # pointer to parameter area
+					 # move IPL device to lowcore
+        mvc   __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)
+
+#
+# clear bss memory
+#
+	larl  %r2,__bss_start           # start of bss segment
+        larl  %r3,_end                  # end of bss segment
+        sgr   %r3,%r2                   # length of bss
+        sgr   %r4,%r4                   #
+        sgr   %r5,%r5                   # set src,length and pad to zero
+        mvcle %r2,%r4,0                 # clear mem
+        jo    .-4                       # branch back, if not finish
+
+					 # set program check new psw mask
+	mvc   __LC_PGM_NEW_PSW(8),.Lpcmsk-.LPG1(%r13)
+
+#
+# find memory chunks.
+#
+	larl  %r1,.Lchkmem               # set program check address
+	stg   %r1,__LC_PGM_NEW_PSW+8
+	la    %r1,1                      # test in increments of 128KB
+	sllg  %r1,%r1,17
+	larl  %r3,memory_chunk
+	slgr  %r4,%r4                    # set start of chunk to zero
+	slgr  %r5,%r5                    # set end of chunk to zero
+	slr  %r6,%r6			 # set access code to zero
+.Lloop:
+	tprot 0(%r5),0			 # test protection of first byte
+	ipm   %r7
+	srl   %r7,28
+	clr   %r6,%r7			 # compare cc with last access code
+	je    .Lsame
+	clgr  %r4,%r5			 # chunk size > 0?
+	je    .Lsize0
+	stg   %r4,0(%r3)		 # store start address of chunk
+	lgr   %r0,%r5
+	slgr  %r0,%r4
+	stg   %r0,8(%r3)		 # store size of chunk
+	st    %r6,20(%r3)		 # store type of chunk
+	la    %r3,24(%r3)
+	lgr   %r4,%r5			 # set start to end
+	larl  %r8,memory_size
+	stg   %r5,0(%r8)                 # store memory size
+.Lsize0:
+	lr    %r6,%r7			 # set access code to last cc
+.Lsame:
+	algr  %r5,%r1			 # add 128KB to end of chunk
+	brc   12,.Lloop
+.Lchkmem:				 # > 16EB or tprot got a program check
+	clgr  %r4,%r5			 # chunk size > 0?
+	je    .Ldonemem
+	stg   %r4,0(%r3)		 # store start address of chunk
+	lgr   %r0,%r5
+	slgr  %r0,%r4
+	stg   %r0,8(%r3)		 # store size of chunk
+	st    %r6,20(%r3)		 # store type of chunk
+	la    %r3,24(%r3)
+	lgr   %r4,%r5
+	larl  %r8,memory_size
+	stg   %r5,0(%r8)                 # store memory size
+#
+# Running native the HSA is located at 2GB and we will get an
+# addressing exception trying to access it. We have to restart
+# the scan at 2GB to find out if the machine has more than 2GB.
+#
+	lghi  %r4,1
+	sllg  %r4,%r4,31
+	clgr  %r5,%r4
+	jhe   .Ldonemem
+	lgr   %r5,%r4
+	j     .Lloop
+.Ldonemem:		
+
+	larl  %r12,machine_flags
+#
+# find out if we are running under VM
+#
+        stidp  __LC_CPUID               # store cpuid
+	tm     __LC_CPUID,0xff          # running under VM ?
+	bno    0f-.LPG1(%r13)
+        oi     7(%r12),1                # set VM flag
+0:      lh     %r0,__LC_CPUID+4         # get cpu version
+        chi    %r0,0x7490               # running on a P/390 ?
+        bne    1f-.LPG1(%r13)
+        oi     7(%r12),4                # set P/390 flag
+1:
+
+#
+# find out if we have the MVPG instruction
+#
+	la     %r1,0f-.LPG1(%r13)       # set program check address
+	stg    %r1,__LC_PGM_NEW_PSW+8
+	sgr    %r0,%r0
+	lghi   %r1,0
+	lghi   %r2,0
+	mvpg   %r1,%r2                  # test MVPG instruction
+	oi     7(%r12),16               # set MVPG flag
+0:
+
+#
+# find out if the diag 0x44 works in 64 bit mode
+#
+	la     %r1,0f-.LPG1(%r13)	# set program check address
+	stg    %r1,__LC_PGM_NEW_PSW+8
+	mvc    __LC_DIAG44_OPCODE(8),.Lnop-.LPG1(%r13)
+	diag   0,0,0x44			# test diag 0x44
+	oi     7(%r12),32		# set diag44 flag
+	mvc    __LC_DIAG44_OPCODE(8),.Ldiag44-.LPG1(%r13)
+0:	
+
+        lpswe .Lentry-.LPG1(13)         # jump to _stext in primary-space,
+                                        # virtual and never return ...
+        .align 16
+.Lentry:.quad  0x0000000180000000,_stext
+.Lctl:  .quad  0x04b50002               # cr0: various things
+        .quad  0                        # cr1: primary space segment table
+        .quad  .Lduct                   # cr2: dispatchable unit control table
+        .quad  0                        # cr3: instruction authorization
+        .quad  0                        # cr4: instruction authorization
+        .quad  0                        # cr5:  various things
+        .quad  0                        # cr6:  I/O interrupts
+        .quad  0                        # cr7:  secondary space segment table
+        .quad  0                        # cr8:  access registers translation
+        .quad  0                        # cr9:  tracing off
+        .quad  0                        # cr10: tracing off
+        .quad  0                        # cr11: tracing off
+        .quad  0                        # cr12: tracing off
+        .quad  0                        # cr13: home space segment table
+        .quad  0xc0000000               # cr14: machine check handling off
+        .quad  0                        # cr15: linkage stack operations
+.Lpcmsk:.quad  0x0000000180000000
+.L4malign:.quad 0xffffffffffc00000
+.Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8
+.Lnop:	.long  0x07000700
+.Ldiag44:.long 0x83000044
+
+	.org PARMAREA-64
+.Lduct:	.long 0,0,0,0,0,0,0,0
+	.long 0,0,0,0,0,0,0,0
+
+#
+# params at 10400 (setup.h)
+#
+	.org   PARMAREA
+	.global _pstart
+_pstart:
+	.quad  0                        # IPL_DEVICE
+        .quad  RAMDISK_ORIGIN           # INITRD_START
+        .quad  RAMDISK_SIZE             # INITRD_SIZE
+
+        .org   COMMAND_LINE
+    	.byte  "root=/dev/ram0 ro"
+        .byte  0
+	.org   0x11000
+	.global _pend
+_pend:	
+
+#ifdef CONFIG_SHARED_KERNEL
+	.org   0x100000
+#endif
+	
+#
+# startup-code, running in virtual mode
+#
+        .globl _stext
+_stext:	basr  %r13,0                    # get base
+.LPG2:
+#
+# Setup stack
+#
+	larl  %r15,init_thread_union
+        aghi  %r15,16384                # init_task_union + 16384
+        stg   %r15,__LC_KERNEL_STACK    # set end of kernel stack
+        aghi  %r15,-160
+        xc    0(8,%r15),0(%r15)         # set backchain to zero
+
+# check control registers
+        stctg  %c0,%c15,0(%r15)
+	oi     6(%r15),0x20             # enable sigp external interrupts
+	oi     4(%r15),0x10             # switch on low address proctection
+        lctlg  %c0,%c15,0(%r15)
+
+#
+        lam    0,15,.Laregs-.LPG2(%r13) # load access regs needed by uaccess
+        brasl  %r14,start_kernel        # go to C code
+#
+# We returned from start_kernel ?!? PANIK
+#
+        basr  %r13,0
+	lpswe .Ldw-.(%r13)           # load disabled wait psw
+#
+            .align 8
+.Ldw:       .quad  0x0002000180000000,0x0000000000000000
+.Laregs:    .long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
diff -Nru a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c
--- a/arch/s390/kernel/module.c	Sat Apr 19 19:51:50 2003
+++ b/arch/s390/kernel/module.c	Sat Apr 19 19:51:50 2003
@@ -37,8 +37,11 @@
 #define DEBUGP(fmt , ...)
 #endif
 
-#define GOT_ENTRY_SIZE 4
+#ifndef CONFIG_ARCH_S390X
 #define PLT_ENTRY_SIZE 12
+#else /* CONFIG_ARCH_S390X */
+#define PLT_ENTRY_SIZE 20
+#endif /* CONFIG_ARCH_S390X */
 
 void *module_alloc(unsigned long size)
 {
@@ -56,30 +59,34 @@
 }
 
 static inline void
-check_rela(Elf32_Rela *rela, struct module *me)
+check_rela(Elf_Rela *rela, struct module *me)
 {
 	struct mod_arch_syminfo *info;
 
-	info = me->arch.syminfo + ELF32_R_SYM (rela->r_info);
-	switch (ELF32_R_TYPE (rela->r_info)) {
+	info = me->arch.syminfo + ELF_R_SYM (rela->r_info);
+	switch (ELF_R_TYPE (rela->r_info)) {
 	case R_390_GOT12:	/* 12 bit GOT offset.  */
 	case R_390_GOT16:	/* 16 bit GOT offset.  */
 	case R_390_GOT32:	/* 32 bit GOT offset.  */
+	case R_390_GOT64:	/* 64 bit GOT offset.  */
 	case R_390_GOTENT:	/* 32 bit PC rel. to GOT entry shifted by 1. */
 	case R_390_GOTPLT12:	/* 12 bit offset to jump slot.	*/
 	case R_390_GOTPLT16:	/* 16 bit offset to jump slot. */
 	case R_390_GOTPLT32:	/* 32 bit offset to jump slot. */
+	case R_390_GOTPLT64:	/* 64 bit offset to jump slot.	*/
 	case R_390_GOTPLTENT:	/* 32 bit rel. offset to jump slot >> 1. */
 		if (info->got_offset == -1UL) {
 			info->got_offset = me->arch.got_size;
-			me->arch.got_size += GOT_ENTRY_SIZE;
+			me->arch.got_size += sizeof(void*);
 		}
 		break;
 	case R_390_PLT16DBL:	/* 16 bit PC rel. PLT shifted by 1.  */
 	case R_390_PLT32DBL:	/* 32 bit PC rel. PLT shifted by 1.  */
 	case R_390_PLT32:	/* 32 bit PC relative PLT address.  */
+	case R_390_PLT64:	/* 64 bit PC relative PLT address.  */
 	case R_390_PLTOFF16:	/* 16 bit offset from GOT to PLT. */
 	case R_390_PLTOFF32:	/* 32 bit offset from GOT to PLT. */
+	case R_390_PLTOFF64:	/* 16 bit offset from GOT to PLT. */
 		if (info->plt_offset == -1UL) {
 			info->plt_offset = me->arch.plt_size;
 			me->arch.plt_size += PLT_ENTRY_SIZE;
@@ -100,12 +107,12 @@
  * got and plt but we can increase the core module size.
  */
 int
-module_frob_arch_sections(Elf32_Ehdr *hdr, Elf32_Shdr *sechdrs,
+module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs,
 			  char *secstrings, struct module *me)
 {
-	Elf32_Shdr *symtab;
-	Elf32_Sym *symbols;
-	Elf32_Rela *rela;
+	Elf_Shdr *symtab;
+	Elf_Sym *symbols;
+	Elf_Rela *rela;
 	char *strings;
 	int nrela, i, j;
 
@@ -123,7 +130,7 @@
 	}
 
 	/* Allocate one syminfo structure per symbol. */
-	me->arch.nsyms = symtab->sh_size / sizeof(Elf32_Sym);
+	me->arch.nsyms = symtab->sh_size / sizeof(Elf_Sym);
 	me->arch.syminfo = kmalloc(me->arch.nsyms *
 				   sizeof(struct mod_arch_syminfo),
 				   GFP_KERNEL);
@@ -148,7 +155,7 @@
 	for (i = 0; i < hdr->e_shnum; i++) {
 		if (sechdrs[i].sh_type != SHT_RELA)
 			continue;
-		nrela = sechdrs[i].sh_size / sizeof(Elf32_Rela);
+		nrela = sechdrs[i].sh_size / sizeof(Elf_Rela);
 		rela = (void *) hdr + sechdrs[i].sh_offset;
 		for (j = 0; j < nrela; j++)
 			check_rela(rela + j, me);
@@ -174,19 +181,19 @@
 }
 
 static inline int
-apply_rela(Elf32_Rela *rela, Elf32_Addr base, Elf32_Sym *symtab, 
+apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab, 
 	   struct module *me)
 {
 	struct mod_arch_syminfo *info;
-	Elf32_Addr loc, val;
+	Elf_Addr loc, val;
 	int r_type, r_sym;
 
 	/* This is where to make the change */
 	loc = base + rela->r_offset;
 	/* This is the symbol it is referring to.  Note that all
 	   undefined symbols have been resolved.  */
-	r_sym = ELF32_R_SYM(rela->r_info);
-	r_type = ELF32_R_TYPE(rela->r_info);
+	r_sym = ELF_R_SYM(rela->r_info);
+	r_type = ELF_R_TYPE(rela->r_info);
 	info = me->arch.syminfo + r_sym;
 	val = symtab[r_sym].st_value;
 
@@ -195,6 +202,7 @@
 	case R_390_12:		/* Direct 12 bit.  */
 	case R_390_16:		/* Direct 16 bit.  */
 	case R_390_32:		/* Direct 32 bit.  */
+	case R_390_64:		/* Direct 64 bit.  */
 		val += rela->r_addend;
 		if (r_type == R_390_8)
 			*(unsigned char *) loc = val;
@@ -205,11 +213,14 @@
 			*(unsigned short *) loc = val;
 		else if (r_type == R_390_32)
 			*(unsigned int *) loc = val;
+		else if (r_type == R_390_64)
+			*(unsigned long *) loc = val;
 		break;
 	case R_390_PC16:	/* PC relative 16 bit.  */
 	case R_390_PC16DBL:	/* PC relative 16 bit shifted by 1.  */
 	case R_390_PC32DBL:	/* PC relative 32 bit shifted by 1.  */
 	case R_390_PC32:	/* PC relative 32 bit.  */
+	case R_390_PC64:	/* PC relative 64 bit.	*/
 		val += rela->r_addend - loc;
 		if (r_type == R_390_PC16)
 			*(unsigned short *) loc = val;
@@ -219,17 +230,22 @@
 			*(unsigned int *) loc = val >> 1;
 		else if (r_type == R_390_PC32)
 			*(unsigned int *) loc = val;
+		else if (r_type == R_390_PC64)
+			*(unsigned long *) loc = val;
 		break;
 	case R_390_GOT12:	/* 12 bit GOT offset.  */
 	case R_390_GOT16:	/* 16 bit GOT offset.  */
 	case R_390_GOT32:	/* 32 bit GOT offset.  */
+	case R_390_GOT64:	/* 64 bit GOT offset.  */
 	case R_390_GOTENT:	/* 32 bit PC rel. to GOT entry shifted by 1. */
 	case R_390_GOTPLT12:	/* 12 bit offset to jump slot.	*/
 	case R_390_GOTPLT16:	/* 16 bit offset to jump slot. */
 	case R_390_GOTPLT32:	/* 32 bit offset to jump slot. */
+	case R_390_GOTPLT64:	/* 64 bit offset to jump slot.	*/
 	case R_390_GOTPLTENT:	/* 32 bit rel. offset to jump slot >> 1. */
 		if (info->got_initialized == 0) {
-			Elf32_Addr *gotent;
+			Elf_Addr *gotent;
+
 			gotent = me->module_core + me->arch.got_offset +
 				info->got_offset;
 			*gotent = val;
@@ -249,27 +265,42 @@
 		else if (r_type == R_390_GOTENT ||
 			 r_type == R_390_GOTPLTENT)
 			*(unsigned int *) loc = val >> 1;
+		else if (r_type == R_390_GOT64 ||
+			 r_type == R_390_GOTPLT64)
+			*(unsigned long *) loc = val;
 		break;
 	case R_390_PLT16DBL:	/* 16 bit PC rel. PLT shifted by 1.  */
 	case R_390_PLT32DBL:	/* 32 bit PC rel. PLT shifted by 1.  */
 	case R_390_PLT32:	/* 32 bit PC relative PLT address.  */
+	case R_390_PLT64:	/* 64 bit PC relative PLT address.  */
 	case R_390_PLTOFF16:	/* 16 bit offset from GOT to PLT. */
 	case R_390_PLTOFF32:	/* 32 bit offset from GOT to PLT. */
+	case R_390_PLTOFF64:	/* 16 bit offset from GOT to PLT. */
 		if (info->plt_initialized == 0) {
 			unsigned int *ip;
 			ip = me->module_core + me->arch.plt_offset +
 				info->plt_offset;
+#ifndef CONFIG_ARCH_S390X
 			ip[0] = 0x0d105810; /* basr 1,0; l 1,6(1); br 1 */
 			ip[1] = 0x100607f1;
 			ip[2] = val;
+#else /* CONFIG_ARCH_S390X */
+			ip[0] = 0x0d10e310; /* basr 1,0; lg 1,10(1); br 1 */
+			ip[1] = 0x100a0004;
+			ip[2] = 0x07f10000;
+			ip[3] = (unsigned int) (val >> 32);
+			ip[4] = (unsigned int) val;
+#endif /* CONFIG_ARCH_S390X */
 			info->plt_initialized = 1;
 		}
 		if (r_type == R_390_PLTOFF16 ||
-		    r_type == R_390_PLTOFF32)
+		    r_type == R_390_PLTOFF32
+		    || r_type == R_390_PLTOFF64
+			)
 			val = me->arch.plt_offset - me->arch.got_offset +
 				info->plt_offset + rela->r_addend;
 		else
-			val =  (Elf32_Addr) me->module_core +
+			val =  (Elf_Addr) me->module_core +
 				me->arch.plt_offset + info->plt_offset + 
 				rela->r_addend - loc;
 		if (r_type == R_390_PLT16DBL)
@@ -281,19 +312,25 @@
 		else if (r_type == R_390_PLT32 ||
 			 r_type == R_390_PLTOFF32)
 			*(unsigned int *) loc = val;
+		else if (r_type == R_390_PLT64 ||
+			 r_type == R_390_PLTOFF64)
+			*(unsigned long *) loc = val;
 		break;
 	case R_390_GOTOFF16:	/* 16 bit offset to GOT.  */
 	case R_390_GOTOFF32:	/* 32 bit offset to GOT.  */
+	case R_390_GOTOFF64:	/* 64 bit offset to GOT. */
 		val = val + rela->r_addend -
-			((Elf32_Addr) me->module_core + me->arch.got_offset);
+			((Elf_Addr) me->module_core + me->arch.got_offset);
 		if (r_type == R_390_GOTOFF16)
 			*(unsigned short *) loc = val;
 		else if (r_type == R_390_GOTOFF32)
 			*(unsigned int *) loc = val;
+		else if (r_type == R_390_GOTOFF64)
+			*(unsigned long *) loc = val;
 		break;
 	case R_390_GOTPC:	/* 32 bit PC relative offset to GOT. */
 	case R_390_GOTPCDBL:	/* 32 bit PC rel. off. to GOT shifted by 1. */
-		val = (Elf32_Addr) me->module_core + me->arch.got_offset +
+		val = (Elf_Addr) me->module_core + me->arch.got_offset +
 			rela->r_addend - loc;
 		if (r_type == R_390_GOTPC)
 			*(unsigned int *) loc = val;
@@ -316,22 +353,23 @@
 }
 
 int
-apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,
+apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
 		   unsigned int symindex, unsigned int relsec,
 		   struct module *me)
 {
-	Elf32_Addr base;
-	Elf32_Sym *symtab;
-	Elf32_Rela *rela;
+	Elf_Addr base;
+	Elf_Sym *symtab;
+	Elf_Rela *rela;
 	unsigned long i, n;
 	int rc;
 
 	DEBUGP("Applying relocate section %u to %u\n",
 	       relsec, sechdrs[relsec].sh_info);
 	base = sechdrs[sechdrs[relsec].sh_info].sh_addr;
-	symtab = (Elf32_Sym *) sechdrs[symindex].sh_addr;
-	rela = (Elf32_Rela *) sechdrs[relsec].sh_addr;
-	n = sechdrs[relsec].sh_size / sizeof(Elf32_Rela);
+	symtab = (Elf_Sym *) sechdrs[symindex].sh_addr;
+	rela = (Elf_Rela *) sechdrs[relsec].sh_addr;
+	n = sechdrs[relsec].sh_size / sizeof(Elf_Rela);
+
 	for (i = 0; i < n; i++, rela++) {
 		rc = apply_rela(rela, base, symtab, me);
 		if (rc)
diff -Nru a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
--- a/arch/s390/kernel/process.c	Sat Apr 19 19:51:50 2003
+++ b/arch/s390/kernel/process.c	Sat Apr 19 19:51:50 2003
@@ -56,7 +56,11 @@
 	unsigned long bc;
 
 	bc = *((unsigned long *) tsk->thread.ksp);
+#ifndef CONFIG_ARCH_S390X
 	return *((unsigned long *) (bc+56));
+#else
+	return *((unsigned long *) (bc+112));
+#endif
 }
 
 /*
@@ -79,6 +83,7 @@
 	 */
 	wait_psw.mask = PSW_KERNEL_BITS | PSW_MASK_MCHECK | PSW_MASK_WAIT |
 		PSW_MASK_IO | PSW_MASK_EXT;
+#ifndef CONFIG_ARCH_S390X
 	asm volatile (
 		"    basr %0,0\n"
 		"0:  la   %0,1f-0b(%0)\n"
@@ -92,6 +97,18 @@
 		"    lpsw 0(%1)\n"
 		"2:"
 		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
+#else /* CONFIG_ARCH_S390X */
+	asm volatile (
+		"    larl  %0,0f\n"
+		"    stg   %0,8(%1)\n"
+		"    lpswe 0(%1)\n"
+		"0:  larl  %0,1f\n"
+		"    stg   %0,8(%1)\n"
+		"    ni    1(%1),0xf9\n"
+		"    lpswe 0(%1)\n"
+		"1:"
+		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
+#endif /* CONFIG_ARCH_S390X */
 }
 
 int cpu_idle(void)
@@ -109,9 +126,9 @@
 	struct task_struct *tsk = current;
 
         printk("CPU:    %d    %s\n", tsk->thread_info->cpu, print_tainted());
-        printk("Process %s (pid: %d, task: %08lx, ksp: %08x)\n",
-	       current->comm, current->pid, (unsigned long) tsk,
-	       tsk->thread.ksp);
+        printk("Process %s (pid: %d, task: %p, ksp: %p)\n",
+	       current->comm, current->pid, (void *) tsk,
+	       (void *) tsk->thread.ksp);
 
 	show_registers(regs);
 	/* Show stack backtrace if pt_regs is from kernel mode */
@@ -120,6 +137,9 @@
 }
 
 extern void kernel_thread_starter(void);
+
+#ifndef CONFIG_ARCH_S390X
+
 __asm__(".align 4\n"
 	"kernel_thread_starter:\n"
 	"    l     15,0(8)\n"
@@ -130,6 +150,20 @@
 	"    sr    2,2\n"
 	"    br    11\n");
 
+#else /* CONFIG_ARCH_S390X */
+
+__asm__(".align 4\n"
+	"kernel_thread_starter:\n"
+	"    lg    15,0(8)\n"
+	"    sgr   15,7\n"
+	"    stosm 48(15),3\n"
+	"    lgr   2,10\n"
+	"    basr  14,9\n"
+	"    sgr   2,2\n"
+	"    br    11\n");
+
+#endif /* CONFIG_ARCH_S390X */
+
 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 {
 	struct task_struct *p;
@@ -137,7 +171,7 @@
 
 	memset(&regs, 0, sizeof(regs));
 	regs.psw.mask = PSW_KERNEL_BITS;
-	regs.psw.addr = (__u32) kernel_thread_starter | PSW_ADDR_AMODE31;
+	regs.psw.addr = (unsigned long) kernel_thread_starter | PSW_ADDR_AMODE;
 	regs.gprs[7] = STACK_FRAME_OVERHEAD;
 	regs.gprs[8] = __LC_KERNEL_STACK;
 	regs.gprs[9] = (unsigned long) fn;
@@ -180,8 +214,8 @@
             unsigned long glue2;
             unsigned long scratch[2];
             unsigned long gprs[10];    /* gprs 6 -15                       */
-            unsigned long fprs[4];     /* fpr 4 and 6                      */
-            unsigned long empty[4];
+            unsigned int  fprs[4];     /* fpr 4 and 6                      */
+            unsigned int  empty[4];
             struct pt_regs childregs;
           } *frame;
 
@@ -198,7 +232,8 @@
         frame->gprs[8] = (unsigned long) ret_from_fork;
 
         /* fake return stack for resume(), don't go back to schedule */
-        frame->gprs[9]  = (unsigned long) frame;
+        frame->gprs[9] = (unsigned long) frame;
+#ifndef CONFIG_ARCH_S390X
         /*
 	 * save fprs to current->thread.fp_regs to merge them with
 	 * the emulated registers and then copy the result to the child.
@@ -207,14 +242,31 @@
 	memcpy(&p->thread.fp_regs, &current->thread.fp_regs,
 	       sizeof(s390_fp_regs));
         p->thread.user_seg = __pa((unsigned long) p->mm->pgd) | _SEGMENT_TABLE;
-	/* start process with ar4 pointing to the correct address space */
+	/* Set a new TLS ?  */
+	if (clone_flags & CLONE_SETTLS)
+		frame->childregs.acrs[0] = regs->gprs[6];
+#else /* CONFIG_ARCH_S390X */
+	/* Save the fpu registers to new thread structure. */
+	save_fp_regs(&p->thread.fp_regs);
+        p->thread.user_seg = __pa((unsigned long) p->mm->pgd) | _REGION_TABLE;
+	/* Set a new TLS ?  */
+	if (clone_flags & CLONE_SETTLS) {
+		if (test_thread_flag(TIF_31BIT)) {
+			frame->childregs.acrs[0] =
+				(unsigned int) regs->gprs[6];
+		} else {
+			frame->childregs.acrs[0] =
+				(unsigned int)(regs->gprs[6] >> 32);
+			frame->childregs.acrs[1] =
+				(unsigned int) regs->gprs[6];
+		}
+	}
+#endif /* CONFIG_ARCH_S390X */
+	/* start new process with ar4 pointing to the correct address space */
 	p->thread.ar4 = get_fs().ar4;
         /* Don't copy debug registers */
         memset(&p->thread.per_info,0,sizeof(p->thread.per_info));
 
-	/* Set a new TLS ?  */
-	if (clone_flags & CLONE_SETTLS)
-		frame->childregs.acrs[0] = regs->gprs[6];
         return 0;
 }
 
@@ -292,12 +344,16 @@
  */
 int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs)
 {
+#ifndef CONFIG_ARCH_S390X
         /*
 	 * save fprs to current->thread.fp_regs to merge them with
 	 * the emulated registers and then copy the result to the dump.
 	 */
 	save_fp_regs(&current->thread.fp_regs);
 	memcpy(fpregs, &current->thread.fp_regs, sizeof(s390_fp_regs));
+#else /* CONFIG_ARCH_S390X */
+	save_fp_regs(fpregs);
+#endif /* CONFIG_ARCH_S390X */
 	return 1;
 }
 
@@ -339,16 +395,22 @@
 		return 0;
 	stack_page = (unsigned long) p->thread_info;
 	r15 = p->thread.ksp;
-        if (!stack_page || r15 < stack_page || r15 >= 8188+stack_page)
-                return 0;
-        bc = (*(unsigned long *) r15) & 0x7fffffff;
+	if (!stack_page || r15 < stack_page ||
+	    r15 >= THREAD_SIZE - sizeof(unsigned long) + stack_page)
+		return 0;
+	bc = (*(unsigned long *) r15) & PSW_ADDR_INSN;
 	do {
-                if (bc < stack_page || bc >= 8188+stack_page)
-                        return 0;
-		r14 = (*(unsigned long *) (bc+56)) & 0x7fffffff;
+		if (bc < stack_page ||
+		    bc >= THREAD_SIZE - sizeof(unsigned long) + stack_page)
+			return 0;
+#ifndef CONFIG_ARCH_S390X
+		r14 = (*(unsigned long *) (bc+56)) & PSW_ADDR_INSN;
+#else
+		r14 = *(unsigned long *) (bc+112);
+#endif
 		if (r14 < first_sched || r14 >= last_sched)
 			return r14;
-		bc = (*(unsigned long *) bc) & 0x7fffffff;
+		bc = (*(unsigned long *) bc) & PSW_ADDR_INSN;
 	} while (count++ < 16);
 	return 0;
 }
diff -Nru a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
--- a/arch/s390/kernel/ptrace.c	Sat Apr 19 19:51:50 2003
+++ b/arch/s390/kernel/ptrace.c	Sat Apr 19 19:51:50 2003
@@ -39,8 +39,12 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 
+#ifdef CONFIG_S390_SUPPORT
+#include "compat_ptrace.h"
+#endif
 
-static void FixPerRegisters(struct task_struct *task)
+static void
+FixPerRegisters(struct task_struct *task)
 {
 	struct pt_regs *regs;
 	per_struct *per_info;
@@ -52,7 +56,12 @@
 	
 	if (per_info->single_step) {
 		per_info->control_regs.bits.starting_addr = 0;
-		per_info->control_regs.bits.ending_addr = 0x7fffffffUL;
+#ifdef CONFIG_S390_SUPPORT
+		if (test_thread_flag(TIF_31BIT))
+			per_info->control_regs.bits.ending_addr = 0x7fffffffUL;
+		else
+#endif
+			per_info->control_regs.bits.ending_addr = PSW_ADDR_INSN;
 	} else {
 		per_info->control_regs.bits.starting_addr =
 			per_info->starting_addr;
@@ -74,13 +83,15 @@
 		per_info->control_regs.bits.storage_alt_space_ctl = 0;
 }
 
-void set_single_step(struct task_struct *task)
+void
+set_single_step(struct task_struct *task)
 {
 	task->thread.per_info.single_step = 1;
 	FixPerRegisters(task);
 }
 
-void clear_single_step(struct task_struct *task)
+void
+clear_single_step(struct task_struct *task)
 {
 	task->thread.per_info.single_step = 0;
 	FixPerRegisters(task);
@@ -91,12 +102,19 @@
  *
  * Make sure single step bits etc are not set.
  */
-void ptrace_disable(struct task_struct *child)
+void
+ptrace_disable(struct task_struct *child)
 {
 	/* make sure the single step bit is not set. */
 	clear_single_step(child);
 }
 
+#ifndef CONFIG_ARCH_S390X
+# define __ADDR_MASK 3
+#else
+# define __ADDR_MASK 7
+#endif
+
 /*
  * Read the word at offset addr from the user area of a process. The
  * trouble here is that the information is littered over different
@@ -106,20 +124,20 @@
  * struct user contain pad bytes that should be read as zeroes.
  * Lovely...
  */
-static int peek_user(struct task_struct *child, addr_t addr, addr_t data)
+static int
+peek_user(struct task_struct *child, addr_t addr, addr_t data)
 {
 	struct user *dummy = NULL;
-	addr_t offset;
-	__u32 tmp;
+	addr_t offset, tmp;
 
-	if ((addr & 3) || addr > sizeof(struct user) - 3)
+	if ((addr & __ADDR_MASK) || addr > sizeof(struct user) - __ADDR_MASK)
 		return -EIO;
 
 	if (addr <= (addr_t) &dummy->regs.orig_gpr2) {
 		/*
 		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
 		 */
-		tmp = *(__u32 *)((addr_t) __KSTK_PTREGS(child) + addr);
+		tmp = *(addr_t *)((addr_t) __KSTK_PTREGS(child) + addr);
 
 	} else if (addr >= (addr_t) &dummy->regs.fp_regs &&
 		   addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
@@ -127,7 +145,7 @@
 		 * floating point regs. are stored in the thread structure
 		 */
 		offset = addr - (addr_t) &dummy->regs.fp_regs;
-		tmp = *(__u32 *)((addr_t) &child->thread.fp_regs + offset);
+		tmp = *(addr_t *)((addr_t) &child->thread.fp_regs + offset);
 
 	} else if (addr >= (addr_t) &dummy->regs.per_info &&
 		   addr < (addr_t) (&dummy->regs.per_info + 1)) {
@@ -135,12 +153,12 @@
 		 * per_info is found in the thread structure
 		 */
 		offset = addr - (addr_t) &dummy->regs.per_info;
-		tmp = *(__u32 *)((addr_t) &child->thread.per_info + offset);
+		tmp = *(addr_t *)((addr_t) &child->thread.per_info + offset);
 
 	} else
 		tmp = 0;
 
-	return put_user(tmp, (__u32 *) data);
+	return put_user(tmp, (addr_t *) data);
 }
 
 /*
@@ -149,12 +167,13 @@
  * Stores to the program status word and on the floating point
  * control register needs to get checked for validity.
  */
-static int poke_user(struct task_struct *child, addr_t addr, addr_t data)
+static int
+poke_user(struct task_struct *child, addr_t addr, addr_t data)
 {
 	struct user *dummy = NULL;
 	addr_t offset;
 
-	if ((addr & 3) || addr > sizeof(struct user) - 3)
+	if ((addr & __ADDR_MASK) || addr > sizeof(struct user) - __ADDR_MASK)
 		return -EIO;
 
 	if (addr <= (addr_t) &dummy->regs.orig_gpr2) {
@@ -162,14 +181,19 @@
 		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
 		 */
 		if (addr == (addr_t) &dummy->regs.psw.mask &&
+#ifdef CONFIG_S390_SUPPORT
+		    (data & ~PSW_MASK_CC) != PSW_USER32_BITS &&
+#endif
 		    (data & ~PSW_MASK_CC) != PSW_USER_BITS)
 			/* Invalid psw mask. */
 			return -EINVAL;
+#ifndef CONFIG_ARCH_S390X
 		if (addr == (addr_t) &dummy->regs.psw.addr)
 			/* I'd like to reject addresses without the
 			   high order bit but older gdb's rely on it */
-			data |= PSW_ADDR_AMODE31;
-		*(__u32 *)((addr_t) __KSTK_PTREGS(child) + addr) = data;
+			data |= PSW_ADDR_AMODE;
+#endif
+		*(addr_t *)((addr_t) __KSTK_PTREGS(child) + addr) = data;
 
 	} else if (addr >= (addr_t) &dummy->regs.fp_regs &&
 		   addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
@@ -180,7 +204,7 @@
 		    (data & ~FPC_VALID_MASK) != 0)
 			return -EINVAL;
 		offset = addr - (addr_t) &dummy->regs.fp_regs;
-		*(__u32 *)((addr_t) &child->thread.fp_regs + offset) = data;
+		*(addr_t *)((addr_t) &child->thread.fp_regs + offset) = data;
 
 	} else if (addr >= (addr_t) &dummy->regs.per_info &&
 		   addr < (addr_t) (&dummy->regs.per_info + 1)) {
@@ -188,7 +212,7 @@
 		 * per_info is found in the thread structure 
 		 */
 		offset = addr - (addr_t) &dummy->regs.per_info;
-		*(__u32 *)((addr_t) &child->thread.per_info + offset) = data;
+		*(addr_t *)((addr_t) &child->thread.per_info + offset) = data;
 
 	}
 
@@ -197,31 +221,17 @@
 }
 
 static int
-do_ptrace(struct task_struct *child, long request, long addr, long data)
+do_ptrace_normal(struct task_struct *child, long request, long addr, long data)
 {
 	unsigned long tmp;
 	ptrace_area parea; 
 	int copied, ret;
 
-	if (request == PTRACE_ATTACH)
-		return ptrace_attach(child);
-
-	/*
-	 * I added child != current line so we can get the
-	 * ieee_instruction_pointer from the user structure DJB
-	 */
-	if (child != current) {
-		ret = ptrace_check_attach(child, request == PTRACE_KILL);
-		if (ret < 0)
-			return ret;
-	}
-
-	/* Remove high order bit from address. */
-	addr &= PSW_ADDR_INSN;
-
 	switch (request) {
 	case PTRACE_PEEKTEXT:
 	case PTRACE_PEEKDATA:
+		/* Remove high order bit from address (only for 31 bit). */
+		addr &= PSW_ADDR_INSN;
 		/* read word at location addr. */
 		copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);
 		if (copied != sizeof(tmp))
@@ -234,6 +244,8 @@
 
 	case PTRACE_POKETEXT:
 	case PTRACE_POKEDATA:
+		/* Remove high order bit from address (only for 31 bit). */
+		addr &= PSW_ADDR_INSN;
 		/* write the word at location addr. */
 		copied = access_process_vm(child, addr, &data, sizeof(data),1);
 		if (copied != sizeof(data))
@@ -244,6 +256,272 @@
 		/* write the word at location addr in the USER area */
 		return poke_user(child, addr, data);
 
+	case PTRACE_PEEKUSR_AREA:
+	case PTRACE_POKEUSR_AREA:
+		if (!copy_from_user(&parea, (void *) addr, sizeof(parea)))
+			return -EFAULT;
+		addr = parea.kernel_addr;
+		data = parea.process_addr;
+		copied = 0;
+		while (copied < parea.len) {
+			if (request == PTRACE_PEEKUSR_AREA)
+				ret = peek_user(child, addr, data);
+			else
+				ret = poke_user(child, addr, data);
+			if (ret)
+				return ret;
+			addr += sizeof(unsigned long);
+			data += sizeof(unsigned long);
+			copied += sizeof(unsigned long);
+		}
+		return 0;
+	}
+	return ptrace_request(child, request, addr, data);
+}
+
+#ifdef CONFIG_S390_SUPPORT
+/*
+ * Now the fun part starts... a 31 bit program running in the
+ * 31 bit emulation tracing another program. PTRACE_PEEKTEXT,
+ * PTRACE_PEEKDATA, PTRACE_POKETEXT and PTRACE_POKEDATA are easy
+ * to handle, the difference to the 64 bit versions of the requests
+ * is that the access is done in multiples of 4 byte instead of
+ * 8 bytes (sizeof(unsigned long) on 31/64 bit).
+ * The ugly part are PTRACE_PEEKUSR, PTRACE_PEEKUSR_AREA,
+ * PTRACE_POKEUSR and PTRACE_POKEUSR_AREA. If the traced program
+ * is a 31 bit program too, the content of struct user can be
+ * emulated. A 31 bit program peeking into the struct user of
+ * a 64 bit program is a no-no.
+ */
+
+/*
+ * Same as peek_user but for a 31 bit program.
+ */
+static int
+peek_user_emu31(struct task_struct *child, addr_t addr, addr_t data)
+{
+	struct user32 *dummy32 = NULL;
+	per_struct32 *dummy_per32 = NULL;
+	addr_t offset;
+	__u32 tmp;
+
+	if (!test_thread_flag(TIF_31BIT) ||
+	    (addr & 3) || addr > sizeof(struct user) - 3)
+		return -EIO;
+
+	if (addr <= (addr_t) &dummy32->regs.orig_gpr2) {
+		/*
+		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
+		 */
+		if (addr == (addr_t) &dummy32->regs.psw.mask) {
+			/* Fake a 31 bit psw mask. */
+			tmp = (__u32)(__KSTK_PTREGS(child)->psw.mask >> 32);
+			tmp = (tmp & PSW32_MASK_CC) | PSW32_USER_BITS;
+		} else if (addr == (addr_t) &dummy32->regs.psw.addr) {
+			/* Fake a 31 bit psw address. */
+			tmp = (__u32) __KSTK_PTREGS(child)->psw.addr |
+				PSW32_ADDR_AMODE31;
+		} else
+			tmp = *(__u32 *)((addr_t) __KSTK_PTREGS(child) + 
+					 addr*2 + 4);
+	} else if (addr >= (addr_t) &dummy32->regs.fp_regs &&
+		   addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
+		/*
+		 * floating point regs. are stored in the thread structure 
+		 */
+	        offset = addr - (addr_t) &dummy32->regs.fp_regs;
+		tmp = *(__u32 *)((addr_t) &child->thread.fp_regs + offset);
+
+	} else if (addr >= (addr_t) &dummy32->regs.per_info &&
+		   addr < (addr_t) (&dummy32->regs.per_info + 1)) {
+		/*
+		 * per_info is found in the thread structure
+		 */
+		offset = addr - (addr_t) &dummy32->regs.per_info;
+		/* This is magic. See per_struct and per_struct32. */
+		if ((offset >= (addr_t) &dummy_per32->control_regs &&
+		     offset < (addr_t) (&dummy_per32->control_regs + 1)) ||
+		    (offset >= (addr_t) &dummy_per32->starting_addr &&
+		     offset <= (addr_t) &dummy_per32->ending_addr) ||
+		    offset == (addr_t) &dummy_per32->lowcore.words.address)
+			offset = offset*2 + 4;
+		else
+			offset = offset*2;
+		tmp = *(__u32 *)((addr_t) &child->thread.per_info + offset);
+
+	} else
+		tmp = 0;
+
+	return put_user(tmp, (__u32 *) data);
+}
+
+/*
+ * Same as poke_user but for a 31 bit program.
+ */
+static int
+poke_user_emu31(struct task_struct *child, addr_t addr, addr_t data)
+{
+	struct user32 *dummy32 = NULL;
+	per_struct32 *dummy_per32 = NULL;
+	addr_t offset;
+	__u32 tmp;
+
+	if (!test_thread_flag(TIF_31BIT) ||
+	    (addr & 3) || addr > sizeof(struct user32) - 3)
+		return -EIO;
+
+	tmp = (__u32) data;
+
+	if (addr <= (addr_t) &dummy32->regs.orig_gpr2) {
+		/*
+		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
+		 */
+		if (addr == (addr_t) &dummy32->regs.psw.mask) {
+			/* Build a 64 bit psw mask from 31 bit mask. */
+			if ((tmp & ~PSW32_MASK_CC) != PSW32_USER_BITS)
+				/* Invalid psw mask. */
+				return -EINVAL;
+			__KSTK_PTREGS(child)->psw.mask = PSW_USER_BITS |
+				((tmp & PSW32_MASK_CC) << 32);
+		} else if (addr == (addr_t) &dummy32->regs.psw.addr) {
+			/* Build a 64 bit psw address from 31 bit address. */
+			__KSTK_PTREGS(child)->psw.addr = 
+				(__u64) tmp & PSW32_ADDR_INSN;
+		} else
+			*(__u32*)((addr_t) __KSTK_PTREGS(child) + addr*2 + 4) =
+				tmp;
+	} else if (addr >= (addr_t) &dummy32->regs.fp_regs &&
+		   addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
+		/*
+		 * floating point regs. are stored in the thread structure 
+		 */
+		if (addr == (addr_t) &dummy32->regs.fp_regs.fpc &&
+		    (tmp & ~FPC_VALID_MASK) != 0)
+			/* Invalid floating point control. */
+			return -EINVAL;
+	        offset = addr - (addr_t) &dummy32->regs.fp_regs;
+		*(__u32 *)((addr_t) &child->thread.fp_regs + offset) = tmp;
+
+	} else if (addr >= (addr_t) &dummy32->regs.per_info &&
+		   addr < (addr_t) (&dummy32->regs.per_info + 1)) {
+		/*
+		 * per_info is found in the thread structure.
+		 */
+		offset = addr - (addr_t) &dummy32->regs.per_info;
+		/*
+		 * This is magic. See per_struct and per_struct32.
+		 * By incident the offsets in per_struct are exactly
+		 * twice the offsets in per_struct32 for all fields.
+		 * The 8 byte fields need special handling though,
+		 * because the second half (bytes 4-7) is needed and
+		 * not the first half.
+		 */
+		if ((offset >= (addr_t) &dummy_per32->control_regs &&
+		     offset < (addr_t) (&dummy_per32->control_regs + 1)) ||
+		    (offset >= (addr_t) &dummy_per32->starting_addr &&
+		     offset <= (addr_t) &dummy_per32->ending_addr) ||
+		    offset == (addr_t) &dummy_per32->lowcore.words.address)
+			offset = offset*2 + 4;
+		else
+			offset = offset*2;
+		*(__u32 *)((addr_t) &child->thread.per_info + offset) = tmp;
+
+	}
+
+	FixPerRegisters(child);
+	return 0;
+}
+
+static int
+do_ptrace_emu31(struct task_struct *child, long request, long addr, long data)
+{
+	unsigned int tmp;  /* 4 bytes !! */
+	ptrace_area_emu31 parea; 
+	int copied, ret;
+
+	switch (request) {
+	case PTRACE_PEEKTEXT:
+	case PTRACE_PEEKDATA:
+		/* read word at location addr. */
+		copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);
+		if (copied != sizeof(tmp))
+			return -EIO;
+		return put_user(tmp, (unsigned int *) data);
+
+	case PTRACE_PEEKUSR:
+		/* read the word at location addr in the USER area. */
+		return peek_user_emu31(child, addr, data);
+
+	case PTRACE_POKETEXT:
+	case PTRACE_POKEDATA:
+		/* write the word at location addr. */
+		tmp = data;
+		copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 1);
+		if (copied != sizeof(tmp))
+			return -EIO;
+		return 0;
+
+	case PTRACE_POKEUSR:
+		/* write the word at location addr in the USER area */
+		return poke_user_emu31(child, addr, data);
+
+	case PTRACE_PEEKUSR_AREA:
+	case PTRACE_POKEUSR_AREA:
+		if (!copy_from_user(&parea, (void *) addr, sizeof(parea)))
+			return -EFAULT;
+		addr = parea.kernel_addr;
+		data = parea.process_addr;
+		copied = 0;
+		while (copied < parea.len) {
+			if (request == PTRACE_PEEKUSR_AREA)
+				ret = peek_user_emu31(child, addr, data);
+			else
+				ret = poke_user_emu31(child, addr, data);
+			if (ret)
+				return ret;
+			addr += sizeof(unsigned int);
+			data += sizeof(unsigned int);
+			copied += sizeof(unsigned int);
+		}
+		return 0;
+	}
+	return ptrace_request(child, request, addr, data);
+}
+#endif
+
+#define PT32_IEEE_IP 0x13c
+
+static int
+do_ptrace(struct task_struct *child, long request, long addr, long data)
+{
+	int ret;
+
+	if (request == PTRACE_ATTACH)
+		return ptrace_attach(child);
+
+	/*
+	 * Special cases to get/store the ieee instructions pointer.
+	 */
+	if (child == current) {
+		if (request == PTRACE_PEEKUSR && addr == PT_IEEE_IP)
+			return peek_user(child, addr, data);
+		if (request == PTRACE_POKEUSR && addr == PT_IEEE_IP)
+			return poke_user(child, addr, data);
+#ifdef CONFIG_S390_SUPPORT
+		if (request == PTRACE_PEEKUSR &&
+		    addr == PT32_IEEE_IP && test_thread_flag(TIF_31BIT))
+			return peek_user_emu31(child, addr, data);
+		if (request == PTRACE_POKEUSR &&
+		    addr == PT32_IEEE_IP && test_thread_flag(TIF_31BIT))
+			return poke_user_emu31(child, addr, data);
+#endif
+	}
+
+	ret = ptrace_check_attach(child, request == PTRACE_KILL);
+	if (ret < 0)
+		return ret;
+
+	switch (request) {
 	case PTRACE_SYSCALL:
 		/* continue and stop at next (return from) syscall */
 	case PTRACE_CONT:
@@ -289,30 +567,21 @@
 		/* detach a process that was attached. */
 		return ptrace_detach(child, data);
 
-	case PTRACE_PEEKUSR_AREA:
-	case PTRACE_POKEUSR_AREA:
-		if (!copy_from_user(&parea, (void *) addr, sizeof(parea)))
-			return -EFAULT;
-		addr = parea.kernel_addr;
-		data = parea.process_addr;
-		copied = 0;
-		while (copied < parea.len) {
-			if (request == PTRACE_PEEKUSR_AREA)
-				ret = peek_user(child, addr, data);
-			else
-				ret = poke_user(child, addr, data);
-			if (ret)
-				return ret;
-			addr += sizeof(unsigned long);
-			data += sizeof(unsigned long);
-			copied += sizeof(unsigned long);
-		}
-		return 0;
+
+	/* Do requests that differ for 31/64 bit */
+	default:
+#ifdef CONFIG_S390_SUPPORT
+		if (test_thread_flag(TIF_31BIT))
+			return do_ptrace_emu31(child, request, addr, data);
+#endif
+		return do_ptrace_normal(child, request, addr, data);
 	}
-	return ptrace_request(child, request, addr, data);
+	/* Not reached.  */
+	return -EIO;
 }
 
-asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
+asmlinkage int
+sys_ptrace(long request, long pid, long addr, long data)
 {
 	struct task_struct *child;
 	int ret;
@@ -353,7 +622,8 @@
 	return ret;
 }
 
-asmlinkage void syscall_trace(void)
+asmlinkage void
+syscall_trace(void)
 {
 	if (!test_thread_flag(TIF_SYSCALL_TRACE))
 		return;
diff -Nru a/arch/s390/kernel/reipl64.S b/arch/s390/kernel/reipl64.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/reipl64.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,96 @@
+/*
+ *  arch/s390/kernel/reipl.S
+ *
+ *  S390 version
+ *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com)
+	         Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
+ */
+
+#include <asm/lowcore.h>
+		.globl	do_reipl
+do_reipl:	basr	%r13,0
+.Lpg0:		lpswe   .Lnewpsw-.Lpg0(%r13)
+.Lpg1:		lctlg	%c6,%c6,.Lall-.Lpg0(%r13)
+                stctg   %c0,%c0,.Lctlsave-.Lpg0(%r13)
+                ni      .Lctlsave+4-.Lpg0(%r13),0xef
+                lctlg   %c0,%c0,.Lctlsave-.Lpg0(%r13)
+                lgr     %r1,%r2
+        	mvc     __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13)
+                stsch   .Lschib-.Lpg0(%r13)                                    
+	        oi      .Lschib+5-.Lpg0(%r13),0x84 
+.Lecs:  	xi      .Lschib+27-.Lpg0(%r13),0x01 
+        	msch    .Lschib-.Lpg0(%r13) 
+	        lghi    %r0,5
+.Lssch:		ssch	.Liplorb-.Lpg0(%r13)           
+		jz	.L001
+		brct    %r0,.Lssch   
+		bas	%r14,.Ldisab-.Lpg0(%r13)
+.L001:		mvc	__LC_IO_NEW_PSW(16),.Lionew-.Lpg0(%r13)	
+.Ltpi:		lpswe	.Lwaitpsw-.Lpg0(%r13)          
+.Lcont:		c	%r1,__LC_SUBCHANNEL_ID
+		jnz	.Ltpi
+		clc	__LC_IO_INT_PARM(4),.Liplorb-.Lpg0(%r13)
+		jnz	.Ltpi
+		tsch	.Liplirb-.Lpg0(%r13)           
+		tm	.Liplirb+9-.Lpg0(%r13),0xbf
+                jz      .L002
+                bas     %r14,.Ldisab-.Lpg0(%r13)    
+.L002:		tm	.Liplirb+8-.Lpg0(%r13),0xf3    
+                jz      .L003
+                bas     %r14,.Ldisab-.Lpg0(%r13)	
+.L003:		spx	.Lnull-.Lpg0(%r13)
+		st 	%r1,__LC_SUBCHANNEL_ID
+                lhi     %r1,0            # mode 0 = esa
+                slr     %r0,%r0          # set cpuid to zero
+                sigp    %r1,%r0,0x12     # switch to esa mode
+                lpsw 	0
+.Ldisab:	sll    %r14,1
+		srl    %r14,1            # need to kill hi bit to avoid specification exceptions.
+		st     %r14,.Ldispsw+12-.Lpg0(%r13)
+		lpswe	.Ldispsw-.Lpg0(%r13)
+                .align 	8
+.Lall:		.quad	0x00000000ff000000
+.Lctlsave:      .quad   0x0000000000000000
+.Lnull:		.long   0x0000000000000000
+                .align 	16
+/*
+ * These addresses have to be 31 bit otherwise
+ * the sigp will throw a specifcation exception
+ * when switching to ESA mode as bit 31 be set
+ * in the ESA psw.
+ * Bit 31 of the addresses has to be 0 for the
+ * 31bit lpswe instruction a fact they appear to have
+ * ommited from the pop.
+ */
+.Lnewpsw:	.quad   0x0000000080000000
+		.quad   .Lpg1
+.Lpcnew:	.quad   0x0000000080000000
+	  	.quad   .Lecs
+.Lionew:	.quad   0x0000000080000000
+		.quad   .Lcont
+.Lwaitpsw:	.quad	0x0202000080000000
+		.quad   .Ltpi
+.Ldispsw:	.quad   0x0002000080000000
+		.quad   0x0000000000000000
+.Liplccws:	.long   0x02000000,0x60000018
+		.long   0x08000008,0x20000001
+.Liplorb:	.long	0x0049504c,0x0040ff80
+		.long	0x00000000+.Liplccws
+.Lschib:        .long   0x00000000,0x00000000
+		.long   0x00000000,0x00000000
+		.long   0x00000000,0x00000000
+		.long   0x00000000,0x00000000
+		.long   0x00000000,0x00000000
+		.long   0x00000000,0x00000000
+.Liplirb:	.long	0x00000000,0x00000000
+		.long	0x00000000,0x00000000
+		.long	0x00000000,0x00000000
+		.long	0x00000000,0x00000000
+		.long	0x00000000,0x00000000
+		.long	0x00000000,0x00000000
+		.long	0x00000000,0x00000000
+		.long	0x00000000,0x00000000
+	
+
+	
diff -Nru a/arch/s390/kernel/s390_ksyms.c b/arch/s390/kernel/s390_ksyms.c
--- a/arch/s390/kernel/s390_ksyms.c	Sat Apr 19 19:51:49 2003
+++ b/arch/s390/kernel/s390_ksyms.c	Sat Apr 19 19:51:49 2003
@@ -4,11 +4,14 @@
  *  S390 version
  */
 #include <linux/config.h>
+#include <linux/highuid.h>
 #include <linux/module.h>
+#include <linux/mm.h>
 #include <linux/smp.h>
 #include <linux/interrupt.h>
 #include <asm/checksum.h>
 #include <asm/delay.h>
+#include <asm/pgalloc.h>
 #include <asm/setup.h>
 #if CONFIG_IP_MULTICAST
 #include <net/arp.h>
@@ -48,6 +51,28 @@
 EXPORT_SYMBOL_NOVERS(strrchr);
 EXPORT_SYMBOL_NOVERS(strstr);
 EXPORT_SYMBOL_NOVERS(strpbrk);
+
+/*
+ * binfmt_elf loader 
+ */
+extern int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs);
+EXPORT_SYMBOL(dump_fpu);
+EXPORT_SYMBOL(overflowuid);
+EXPORT_SYMBOL(overflowgid);
+
+#ifdef CONFIG_S390_SUPPORT
+/*
+ * Dynamically add/remove 31 bit ioctl conversion functions.
+ */
+extern int register_ioctl32_conversion(unsigned int cmd,
+				       int (*handler)(unsigned int, 
+						      unsigned int,
+						      unsigned long,
+						      struct file *));
+int unregister_ioctl32_conversion(unsigned int cmd);
+EXPORT_SYMBOL(register_ioctl32_conversion);
+EXPORT_SYMBOL(unregister_ioctl32_conversion);
+#endif
 
 /*
  * misc.
diff -Nru a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
--- a/arch/s390/kernel/setup.c	Sat Apr 19 19:51:28 2003
+++ b/arch/s390/kernel/setup.c	Sat Apr 19 19:51:28 2003
@@ -41,6 +41,7 @@
 #include <asm/smp.h>
 #include <asm/mmu_context.h>
 #include <asm/cpcmd.h>
+#include <asm/lowcore.h>
 
 /*
  * Machine setup..
@@ -323,15 +324,22 @@
         /*
          * print what head.S has found out about the machine 
          */
+#ifndef CONFIG_ARCH_S390X
 	printk((MACHINE_IS_VM) ?
 	       "We are running under VM (31 bit mode)\n" :
 	       "We are running native (31 bit mode)\n");
 	printk((MACHINE_HAS_IEEE) ?
 	       "This machine has an IEEE fpu\n" :
 	       "This machine has no IEEE fpu\n");
+#else /* CONFIG_ARCH_S390X */
+	printk((MACHINE_IS_VM) ?
+	       "We are running under VM (64 bit mode)\n" :
+	       "We are running native (64 bit mode)\n");
+#endif /* CONFIG_ARCH_S390X */
 
         ROOT_DEV = Root_RAM0;
         memory_start = (unsigned long) &_end;    /* fixit if use $CODELO etc*/
+#ifndef CONFIG_ARCH_S390X
 	memory_end = memory_size & ~0x400000UL;  /* align memory end to 4MB */
         /*
          * We need some free virtual space to be able to do vmalloc.
@@ -340,6 +348,9 @@
          */
         if (memory_end > 1920*1024*1024)
                 memory_end = 1920*1024*1024;
+#else /* CONFIG_ARCH_S390X */
+	memory_end = memory_size & ~0x200000UL;  /* detected in head.s */
+#endif /* CONFIG_ARCH_S390X */
         init_mm.start_code = PAGE_OFFSET;
         init_mm.end_code = (unsigned long) &_etext;
         init_mm.end_data = (unsigned long) &_edata;
@@ -460,26 +471,46 @@
         /*
          * Setup lowcore for boot cpu
          */
+#ifndef CONFIG_ARCH_S390X
 	lc = (struct _lowcore *) __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0);
 	memset(lc, 0, PAGE_SIZE);
+#else /* CONFIG_ARCH_S390X */
+	lc = (struct _lowcore *) __alloc_bootmem(2*PAGE_SIZE, 2*PAGE_SIZE, 0);
+	memset(lc, 0, 2*PAGE_SIZE);
+#endif /* CONFIG_ARCH_S390X */
 	lc->restart_psw.mask = PSW_BASE_BITS;
-	lc->restart_psw.addr = PSW_ADDR_AMODE31 + (__u32) restart_int_handler;
+	lc->restart_psw.addr =
+		PSW_ADDR_AMODE + (unsigned long) restart_int_handler;
 	lc->external_new_psw.mask = PSW_KERNEL_BITS;
-	lc->external_new_psw.addr = PSW_ADDR_AMODE31 + (__u32) ext_int_handler;
+	lc->external_new_psw.addr =
+		PSW_ADDR_AMODE + (unsigned long) ext_int_handler;
 	lc->svc_new_psw.mask = PSW_KERNEL_BITS;
-	lc->svc_new_psw.addr = PSW_ADDR_AMODE31 + (__u32) system_call;
+	lc->svc_new_psw.addr = PSW_ADDR_AMODE + (unsigned long) system_call;
 	lc->program_new_psw.mask = PSW_KERNEL_BITS;
-	lc->program_new_psw.addr = PSW_ADDR_AMODE31 + (__u32)pgm_check_handler;
-        lc->mcck_new_psw.mask = PSW_KERNEL_BITS;
-	lc->mcck_new_psw.addr = PSW_ADDR_AMODE31 + (__u32) mcck_int_handler;
+	lc->program_new_psw.addr =
+		PSW_ADDR_AMODE + (unsigned long)pgm_check_handler;
+	lc->mcck_new_psw.mask = PSW_KERNEL_BITS;
+	lc->mcck_new_psw.addr =
+		PSW_ADDR_AMODE + (unsigned long) mcck_int_handler;
 	lc->io_new_psw.mask = PSW_KERNEL_BITS;
-	lc->io_new_psw.addr = PSW_ADDR_AMODE31 + (__u32) io_int_handler;
+	lc->io_new_psw.addr = PSW_ADDR_AMODE + (unsigned long) io_int_handler;
 	lc->ipl_device = S390_lowcore.ipl_device;
+	lc->jiffy_timer = -1LL;
+#ifndef CONFIG_ARCH_S390X
 	lc->kernel_stack = ((__u32) &init_thread_union) + 8192;
 	lc->async_stack = (__u32)
 		__alloc_bootmem(2*PAGE_SIZE, 2*PAGE_SIZE, 0) + 8192;
-	lc->jiffy_timer = -1LL;
 	set_prefix((__u32) lc);
+#else /* CONFIG_ARCH_S390X */
+	lc->kernel_stack = ((__u64) &init_thread_union) + 16384;
+	lc->async_stack = (__u64)
+		__alloc_bootmem(4*PAGE_SIZE, 4*PAGE_SIZE, 0) + 16384;
+	if (MACHINE_HAS_DIAG44)
+		lc->diag44_opcode = 0x83000044;
+	else
+		lc->diag44_opcode = 0x07000700;
+	set_prefix((__u32)(__u64) lc);
+#endif /* CONFIG_ARCH_S390X */
         cpu_init();
         __cpu_logical_map[0] = S390_lowcore.cpu_data.cpu_addr;
 
@@ -534,10 +565,14 @@
 			       (loops_per_jiffy/(5000/HZ))%100);
 	}
 	if (cpu_online_map & (1 << n)) {
+#ifdef CONFIG_SMP
 		if (smp_processor_id() == n)
 			cpuinfo = &S390_lowcore.cpu_data;
 		else
 			cpuinfo = &lowcore_ptr[n]->cpu_data;
+#else
+		cpuinfo = &S390_lowcore.cpu_data;
+#endif
 		seq_printf(m, "processor %li: "
 			       "version = %02X,  "
 			       "identification = %06X,  "
diff -Nru a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c
--- a/arch/s390/kernel/signal.c	Sat Apr 19 19:51:50 2003
+++ b/arch/s390/kernel/signal.c	Sat Apr 19 19:51:50 2003
@@ -29,6 +29,7 @@
 #include <linux/binfmts.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
+#include <asm/lowcore.h>
 
 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
@@ -145,7 +146,7 @@
 
 
 /* Returns non-zero on fault. */
-static int save_sigregs(struct pt_regs *regs,_sigregs *sregs)
+static int save_sigregs(struct pt_regs *regs, _sigregs *sregs)
 {
 	int err;
   
@@ -157,18 +158,18 @@
 	 * to merge them with the emulated registers.
 	 */
 	save_fp_regs(&current->thread.fp_regs);
-	return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs, 
+	return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs,
 			      sizeof(s390_fp_regs));
 }
 
 /* Returns positive number on error */
-static int restore_sigregs(struct pt_regs *regs,_sigregs *sregs)
+static int restore_sigregs(struct pt_regs *regs, _sigregs *sregs)
 {
 	int err;
 
 	err = __copy_from_user(regs, &sregs->regs, sizeof(_s390_regs_common));
 	regs->psw.mask = PSW_USER_BITS | (regs->psw.mask & PSW_MASK_CC);
-	regs->psw.addr |= PSW_ADDR_AMODE31;
+	regs->psw.addr |= PSW_ADDR_AMODE;
 	if (err)
 		return err;
 
@@ -298,9 +299,11 @@
 	/* Set up to return from userspace.  If provided, use a stub
 	   already in userspace.  */
 	if (ka->sa.sa_flags & SA_RESTORER) {
-                regs->gprs[14] = (__u32) ka->sa.sa_restorer | PSW_ADDR_AMODE31;
+                regs->gprs[14] = (unsigned long)
+			ka->sa.sa_restorer | PSW_ADDR_AMODE;
 	} else {
-                regs->gprs[14] = (__u32) frame->retcode | PSW_ADDR_AMODE31;
+                regs->gprs[14] = (unsigned long)
+			frame->retcode | PSW_ADDR_AMODE;
 		if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, 
 	                       (u16 *)(frame->retcode)))
 			goto give_sigsegv;
@@ -311,12 +314,12 @@
 		goto give_sigsegv;
 
 	/* Set up registers for signal handler */
-	regs->gprs[15] = (__u32) frame;
-	regs->psw.addr = (__u32) ka->sa.sa_handler | PSW_ADDR_AMODE31;
+	regs->gprs[15] = (unsigned long) frame;
+	regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE;
 	regs->psw.mask = PSW_USER_BITS;
 
 	regs->gprs[2] = map_signal(sig);
-	regs->gprs[3] = (__u32) &frame->sc;
+	regs->gprs[3] = (unsigned long) &frame->sc;
 
 	/* We forgot to include these in the sigcontext.
 	   To avoid breaking binary compatibility, they are passed as args. */
@@ -356,9 +359,11 @@
 	/* Set up to return from userspace.  If provided, use a stub
 	   already in userspace.  */
 	if (ka->sa.sa_flags & SA_RESTORER) {
-                regs->gprs[14] = (__u32) ka->sa.sa_restorer | PSW_ADDR_AMODE31;
+                regs->gprs[14] = (unsigned long)
+			ka->sa.sa_restorer | PSW_ADDR_AMODE;
 	} else {
-                regs->gprs[14] = (__u32) frame->retcode | PSW_ADDR_AMODE31;
+                regs->gprs[14] = (unsigned long)
+			frame->retcode | PSW_ADDR_AMODE;
 		err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, 
 	                          (u16 *)(frame->retcode));
 	}
@@ -368,13 +373,13 @@
 		goto give_sigsegv;
 
 	/* Set up registers for signal handler */
-	regs->gprs[15] = (__u32) frame;
-	regs->psw.addr = (__u32) ka->sa.sa_handler | PSW_ADDR_AMODE31;
+	regs->gprs[15] = (unsigned long) frame;
+	regs->psw.addr = (unsigned long) ka->sa.sa_handler | PSW_ADDR_AMODE;
 	regs->psw.mask = PSW_USER_BITS;
 
 	regs->gprs[2] = map_signal(sig);
-	regs->gprs[3] = (__u32) &frame->info;
-	regs->gprs[4] = (__u32) &frame->uc;
+	regs->gprs[3] = (unsigned long) &frame->info;
+	regs->gprs[4] = (unsigned long) &frame->uc;
 	return;
 
 give_sigsegv:
@@ -460,6 +465,13 @@
 
 	if (!oldset)
 		oldset = &current->blocked;
+#ifdef CONFIG_S390_SUPPORT 
+	if (test_thread_flag(TIF_31BIT)) {
+		extern asmlinkage int do_signal32(struct pt_regs *regs,
+						  sigset_t *oldset); 
+		return do_signal32(regs, oldset);
+        }
+#endif 
 
 	signr = get_signal_to_deliver(&info, regs, NULL);
 	if (signr > 0) {
diff -Nru a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
--- a/arch/s390/kernel/smp.c	Sat Apr 19 19:51:27 2003
+++ b/arch/s390/kernel/smp.c	Sat Apr 19 19:51:27 2003
@@ -171,7 +171,7 @@
 
         /* store status of all processors in their lowcores (real 0) */
         for (i =  0; i < NR_CPUS; i++) {
-                if (!cpu_online(i) || smp_processor_id() == i)
+                if (!cpu_online(i) || smp_processor_id() == i) 
 			continue;
 		low_core_addr = (unsigned long) lowcore_ptr[i];
 		do {
@@ -310,13 +310,11 @@
  */
 static void smp_ext_bitcall_others(ec_bit_sig sig)
 {
-        struct _lowcore *lowcore;
         int i;
 
         for (i = 0; i < NR_CPUS; i++) {
                 if (!cpu_online(i) || smp_processor_id() == i)
                         continue;
-                lowcore = lowcore_ptr[i];
                 /*
                  * Set signaling bit in lowcore of target cpu and kick it
                  */
@@ -326,6 +324,7 @@
         }
 }
 
+#ifndef CONFIG_ARCH_S390X
 /*
  * this function sends a 'purge tlb' signal to another CPU.
  */
@@ -338,6 +337,7 @@
 {
         on_each_cpu(smp_ptlb_callback, NULL, 0, 1);
 }
+#endif /* ! CONFIG_ARCH_S390X */
 
 /*
  * this function sends a 'reschedule' IPI to another CPU.
@@ -356,8 +356,8 @@
 {
 	__u16 start_ctl;
 	__u16 end_ctl;
-	__u32 orvals[16];
-	__u32 andvals[16];
+	unsigned long orvals[16];
+	unsigned long andvals[16];
 } ec_creg_mask_parms;
 
 /*
@@ -365,25 +365,14 @@
  */
 void smp_ctl_bit_callback(void *info) {
 	ec_creg_mask_parms *pp;
-	u32 cregs[16];
+	unsigned long cregs[16];
 	int i;
 	
 	pp = (ec_creg_mask_parms *) info;
-	asm volatile ("   bras  1,0f\n"
-		      "   stctl 0,0,0(%0)\n"
-		      "0: ex    %1,0(1)\n"
-		      : : "a" (cregs+pp->start_ctl),
-		          "a" ((pp->start_ctl<<4) + pp->end_ctl)
-		      : "memory", "1" );
+	__ctl_store(cregs[pp->start_ctl], pp->start_ctl, pp->end_ctl);
 	for (i = pp->start_ctl; i <= pp->end_ctl; i++)
 		cregs[i] = (cregs[i] & pp->andvals[i]) | pp->orvals[i];
-	asm volatile ("   bras  1,0f\n"
-		      "   lctl 0,0,0(%0)\n"
-		      "0: ex    %1,0(1)\n"
-		      : : "a" (cregs+pp->start_ctl),
-		          "a" ((pp->start_ctl<<4) + pp->end_ctl)
-		      : "memory", "1" );
-	return;
+	__ctl_load(cregs[pp->start_ctl], pp->start_ctl, pp->end_ctl);
 }
 
 /*
@@ -395,7 +384,7 @@
 	parms.start_ctl = cr;
 	parms.end_ctl = cr;
 	parms.orvals[cr] = 1 << bit;
-	parms.andvals[cr] = 0xFFFFFFFF;
+	parms.andvals[cr] = -1L;
 	preempt_disable();
 	smp_call_function(smp_ctl_bit_callback, &parms, 0, 1);
         __ctl_set_bit(cr, bit);
@@ -410,8 +399,8 @@
 
 	parms.start_ctl = cr;
 	parms.end_ctl = cr;
-	parms.orvals[cr] = 0x00000000;
-	parms.andvals[cr] = ~(1 << bit);
+	parms.orvals[cr] = 0;
+	parms.andvals[cr] = ~(1L << bit);
 	preempt_disable();
 	smp_call_function(smp_ctl_bit_callback, &parms, 0, 1);
         __ctl_clear_bit(cr, bit);
@@ -493,7 +482,7 @@
 	 *  Set prefix page for new cpu
 	 */
 
-	ccode = signal_processor_p((u32)(lowcore_ptr[cpu]),
+	ccode = signal_processor_p((unsigned long)(lowcore_ptr[cpu]),
 				   cpu, sigp_set_prefix);
 	if (ccode){
 		printk("sigp_set_prefix failed for cpu %d "
@@ -502,7 +491,6 @@
 		return -EIO;
 	}
 
-
         /* We can't use kernel_thread since we must _avoid_ to reschedule
            the child. */
         idle = fork_by_hand();
@@ -521,15 +509,13 @@
 
         cpu_lowcore = lowcore_ptr[cpu];
 	cpu_lowcore->save_area[15] = idle->thread.ksp;
-	cpu_lowcore->kernel_stack = (__u32) idle->thread_info + (2*PAGE_SIZE);
-        __asm__ __volatile__("la    1,%0\n\t"
-			     "stctl 0,15,0(1)\n\t"
-			     "la    1,%1\n\t"
-                             "stam  0,15,0(1)"
-                             : "=m" (cpu_lowcore->cregs_save_area[0]),
-                               "=m" (cpu_lowcore->access_regs_save_area[0])
-                             : : "1", "memory");
-
+	cpu_lowcore->kernel_stack = (unsigned long)
+		idle->thread_info + (THREAD_SIZE);
+	__ctl_store(cpu_lowcore->cregs_save_area[0], 0, 15);
+	__asm__ __volatile__("la    1,%0\n\t"
+			     "stam  0,15,0(1)"
+			     : "=m" (cpu_lowcore->access_regs_save_area[0])
+			     : : "1", "memory");
         eieio();
         signal_processor(cpu,sigp_restart);
 
@@ -551,7 +537,6 @@
                 panic("Couldn't request external interrupt 0x1202");
         smp_check_cpus(max_cpus);
         memset(lowcore_ptr,0,sizeof(lowcore_ptr));  
-
         /*
          *  Initialize prefix pages and stacks for all possible cpus
          */
@@ -561,15 +546,16 @@
 		if (!cpu_possible(i))
 			continue;
 		lowcore_ptr[i] = (struct _lowcore *)
-			__get_free_page(GFP_KERNEL|GFP_DMA);
-		async_stack = __get_free_pages(GFP_KERNEL,1);
-		if (lowcore_ptr[i] == NULL || async_stack == 0UL)
+			__get_free_pages(GFP_KERNEL|GFP_DMA, 
+					sizeof(void*) == 8 ? 1 : 0);
+		async_stack = __get_free_pages(GFP_KERNEL,ASYNC_ORDER);
+		if (lowcore_ptr[i] == NULL || async_stack == 0ULL)
 			panic("smp_boot_cpus failed to allocate memory\n");
 
                 memcpy(lowcore_ptr[i], &S390_lowcore, sizeof(struct _lowcore));
-		lowcore_ptr[i]->async_stack = async_stack + (2 * PAGE_SIZE);
+		lowcore_ptr[i]->async_stack = async_stack + (ASYNC_SIZE);
 	}
-	set_prefix((u32) lowcore_ptr[smp_processor_id()]);
+	set_prefix((u32)(unsigned long) lowcore_ptr[smp_processor_id()]);
 }
 
 void __devinit smp_prepare_boot_cpu(void)
diff -Nru a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c
--- a/arch/s390/kernel/sys_s390.c	Sat Apr 19 19:51:46 2003
+++ b/arch/s390/kernel/sys_s390.c	Sat Apr 19 19:51:46 2003
@@ -24,15 +24,24 @@
 #include <linux/mman.h>
 #include <linux/file.h>
 #include <linux/utsname.h>
+#ifdef CONFIG_ARCH_S390X
+#include <linux/personality.h>
+#endif /* CONFIG_ARCH_S390X */
 
 #include <asm/uaccess.h>
 #include <asm/ipc.h>
 
+#ifndef CONFIG_ARCH_S390X
+#define __SYS_RETTYPE int
+#else
+#define __SYS_RETTYPE long
+#endif /* CONFIG_ARCH_S390X */
+
 /*
  * sys_pipe() is the normal C calling standard for creating
  * a pipe. It's not the way Unix traditionally does this, though.
  */
-asmlinkage int sys_pipe(unsigned long * fildes)
+asmlinkage __SYS_RETTYPE sys_pipe(unsigned long * fildes)
 {
 	int fd[2];
 	int error;
@@ -51,7 +60,7 @@
 	unsigned long prot, unsigned long flags,
 	unsigned long fd, unsigned long pgoff)
 {
-	int error = -EBADF;
+	__SYS_RETTYPE error = -EBADF;
 	struct file * file = NULL;
 
 	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
@@ -99,10 +108,10 @@
 	return error;
 }
 
-asmlinkage int old_mmap(struct mmap_arg_struct *arg)
+asmlinkage __SYS_RETTYPE old_mmap(struct mmap_arg_struct *arg)
 {
 	struct mmap_arg_struct a;
-	int error = -EFAULT;
+	__SYS_RETTYPE error = -EFAULT;
 
 	if (copy_from_user(&a, arg, sizeof(a)))
 		goto out;
@@ -118,6 +127,7 @@
 
 extern asmlinkage int sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
 
+#ifndef CONFIG_ARCH_S390X
 struct sel_arg_struct {
 	unsigned long n;
 	fd_set *inp, *outp, *exp;
@@ -132,22 +142,61 @@
 		return -EFAULT;
 	/* sys_select() does the appropriate kernel locking */
 	return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp);
+
 }
+#else /* CONFIG_ARCH_S390X */
+unsigned long
+arch_get_unmapped_area(struct file *filp, unsigned long addr,
+		       unsigned long len, unsigned long pgoff,
+		       unsigned long flags)
+{
+	struct vm_area_struct *vma;
+	unsigned long end;
+
+	if (test_thread_flag(TIF_31BIT)) { 
+		if (!addr) 
+			addr = 0x40000000; 
+		end = 0x80000000;		
+	} else { 
+		if (!addr) 
+			addr = TASK_SIZE / 2;
+		end = TASK_SIZE; 
+	}
+
+	if (len > end)
+		return -ENOMEM;
+	addr = PAGE_ALIGN(addr);
+
+	for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
+		/* At this point:  (!vma || addr < vma->vm_end). */
+		if (end - len < addr)
+			return -ENOMEM;
+		if (!vma || addr + len <= vma->vm_start)
+			return addr;
+		addr = vma->vm_end;
+	}
+}
+#endif /* CONFIG_ARCH_S390X */
 
 /*
  * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  *
  * This is really horribly ugly.
  */
-asmlinkage int sys_ipc (uint call, int first, int second, 
-                        int third, void *ptr)
+asmlinkage __SYS_RETTYPE sys_ipc (uint call, int first, int second, 
+				  unsigned long third, void *ptr,
+				  unsigned long fifth)
 {
         struct ipc_kludge tmp;
 	int ret;
 
         switch (call) {
         case SEMOP:
-                return sys_semop (first, (struct sembuf *)ptr, second);
+		return sys_semtimedop (first, (struct sembuf *) ptr, second,
+				       NULL);
+	case SEMTIMEDOP:
+		return sys_semtimedop(first, (struct sembuf *) ptr, second,
+				      (const struct timespec *) fifth);
         case SEMGET:
                 return sys_semget (first, second, third);
         case SEMCTL: {
@@ -191,7 +240,7 @@
 		return sys_shmctl (first, second,
                                    (struct shmid_ds *) ptr);
 	default:
-		return -EINVAL;
+		return -ENOSYS;
 
 	}
         
@@ -212,6 +261,7 @@
 	return err?-EFAULT:0;
 }
 
+#ifndef CONFIG_ARCH_S390X
 asmlinkage int sys_olduname(struct oldold_utsname * name)
 {
 	int error;
@@ -243,6 +293,36 @@
 
 asmlinkage int sys_ioperm(unsigned long from, unsigned long num, int on)
 {
-  return -ENOSYS;
+	return -ENOSYS;
+}
+
+#else /* CONFIG_ARCH_S390X */
+
+extern asmlinkage int sys_newuname(struct new_utsname * name);
+
+asmlinkage int s390x_newuname(struct new_utsname * name)
+{
+	int ret = sys_newuname(name);
+
+	if (current->personality == PER_LINUX32 && !ret) {
+		ret = copy_to_user(name->machine, "s390\0\0\0\0", 8);
+		if (ret) ret = -EFAULT;
+	}
+	return ret;
 }
 
+extern asmlinkage long sys_personality(unsigned long);
+
+asmlinkage int s390x_personality(unsigned long personality)
+{
+	int ret;
+
+	if (current->personality == PER_LINUX32 && personality == PER_LINUX)
+		personality = PER_LINUX32;
+	ret = sys_personality(personality);
+	if (ret == PER_LINUX32)
+		ret = PER_LINUX;
+
+	return ret;
+}
+#endif /* CONFIG_ARCH_S390X */
diff -Nru a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/kernel/syscalls.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,273 @@
+/*
+ * definitions for sys_call_table, each line represents an
+ * entry in the table in the form 
+ * SYSCALL(31 bit syscall, 64 bit syscall, 31 bit emulated syscall)
+ *
+ * this file is meant to be included from entry.S and entry64.S
+ */
+
+#define NI_SYSCALL SYSCALL(sys_ni_syscall,sys_ni_syscall,sys_ni_syscall)
+
+NI_SYSCALL							/* 0 */
+SYSCALL(sys_exit,sys_exit,sys32_exit_wrapper)
+SYSCALL(sys_fork_glue,sys_fork_glue,sys_fork_glue)
+SYSCALL(sys_read,sys_read,sys32_read_wrapper)
+SYSCALL(sys_write,sys_write,sys32_write_wrapper)
+SYSCALL(sys_open,sys_open,sys32_open_wrapper)			/* 5 */
+SYSCALL(sys_close,sys_close,sys32_close_wrapper)
+SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_ni_syscall)
+SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper)
+SYSCALL(sys_link,sys_link,sys32_link_wrapper)
+SYSCALL(sys_unlink,sys_unlink,sys32_unlink_wrapper)		/* 10 */
+SYSCALL(sys_execve_glue,sys_execve_glue,sys32_execve_glue)
+SYSCALL(sys_chdir,sys_chdir,sys32_chdir_wrapper)
+SYSCALL(sys_time,sys_ni_syscall,sys32_time_wrapper)		/* old time syscall */
+SYSCALL(sys_mknod,sys_mknod,sys32_mknod_wrapper)
+SYSCALL(sys_chmod,sys_chmod,sys32_chmod_wrapper)		/* 15 */
+SYSCALL(sys_lchown16,sys_ni_syscall,sys32_lchown16_wrapper)	/* old lchown16 syscall*/
+NI_SYSCALL							/* old break syscall holder */
+NI_SYSCALL							/* old stat syscall holder */
+SYSCALL(sys_lseek,sys_lseek,sys32_lseek_wrapper)
+SYSCALL(sys_getpid,sys_getpid,sys_getpid)			/* 20 */
+SYSCALL(sys_mount,sys_mount,sys32_mount_wrapper)
+SYSCALL(sys_oldumount,sys_oldumount,sys32_oldumount_wrapper)
+SYSCALL(sys_setuid16,sys_ni_syscall,sys32_setuid16_wrapper)	/* old setuid16 syscall*/
+SYSCALL(sys_getuid16,sys_ni_syscall,sys32_getuid16)		/* old getuid16 syscall*/
+SYSCALL(sys_stime,sys_ni_syscall,sys32_stime_wrapper)		/* 25 old stime syscall */
+SYSCALL(sys_ptrace,sys_ptrace,sys32_ptrace_wrapper)
+SYSCALL(sys_alarm,sys_alarm,sys32_alarm_wrapper)
+NI_SYSCALL							/* old fstat syscall */
+SYSCALL(sys_pause,sys_pause,sys32_pause)
+SYSCALL(sys_utime,sys_utime,compat_sys_utime_wrapper)		/* 30 */
+NI_SYSCALL							/* old stty syscall */
+NI_SYSCALL							/* old gtty syscall */
+SYSCALL(sys_access,sys_access,sys32_access_wrapper)
+SYSCALL(sys_nice,sys_nice,sys32_nice_wrapper)
+NI_SYSCALL							/* 35 old ftime syscall */
+SYSCALL(sys_sync,sys_sync,sys_sync)
+SYSCALL(sys_kill,sys_kill,sys32_kill_wrapper)
+SYSCALL(sys_rename,sys_rename,sys32_rename_wrapper)
+SYSCALL(sys_mkdir,sys_mkdir,sys32_mkdir_wrapper)
+SYSCALL(sys_rmdir,sys_rmdir,sys32_rmdir_wrapper)		/* 40 */
+SYSCALL(sys_dup,sys_dup,sys32_dup_wrapper)
+SYSCALL(sys_pipe,sys_pipe,sys32_pipe_wrapper)
+SYSCALL(sys_times,sys_times,compat_sys_times_wrapper)
+NI_SYSCALL							/* old prof syscall */
+SYSCALL(sys_brk,sys_brk,sys32_brk_wrapper)			/* 45 */
+SYSCALL(sys_setgid16,sys_ni_syscall,sys32_setgid16)		/* old setgid16 syscall*/
+SYSCALL(sys_getgid16,sys_ni_syscall,sys32_getgid16)		/* old getgid16 syscall*/
+SYSCALL(sys_signal,sys_signal,sys32_signal_wrapper)
+SYSCALL(sys_geteuid16,sys_ni_syscall,sys32_geteuid16)		/* old geteuid16 syscall */
+SYSCALL(sys_getegid16,sys_ni_syscall,sys32_getegid16)		/* 50 old getegid16 syscall */
+SYSCALL(sys_acct,sys_acct,sys32_acct_wrapper)
+SYSCALL(sys_umount,sys_umount,sys32_umount_wrapper)
+NI_SYSCALL							/* old lock syscall */
+SYSCALL(sys_ioctl,sys_ioctl,sys32_ioctl_wrapper)
+SYSCALL(sys_fcntl,sys_fcntl,compat_sys_fcntl_wrapper)		/* 55 */
+NI_SYSCALL							/* intel mpx syscall */
+SYSCALL(sys_setpgid,sys_setpgid,sys32_setpgid_wrapper)
+NI_SYSCALL							/* old ulimit syscall */
+NI_SYSCALL							/* old uname syscall */
+SYSCALL(sys_umask,sys_umask,sys32_umask_wrapper)		/* 60 */
+SYSCALL(sys_chroot,sys_chroot,sys32_chroot_wrapper)
+SYSCALL(sys_ustat,sys_ustat,sys32_ustat_wrapper)
+SYSCALL(sys_dup2,sys_dup2,sys32_dup2_wrapper)
+SYSCALL(sys_getppid,sys_getppid,sys_getppid)
+SYSCALL(sys_getpgrp,sys_getpgrp,sys_getpgrp)			/* 65 */
+SYSCALL(sys_setsid,sys_setsid,sys_setsid)
+SYSCALL(sys_sigaction,sys_sigaction,sys32_sigaction_wrapper)
+NI_SYSCALL							/* old sgetmask syscall*/
+NI_SYSCALL							/* old ssetmask syscall*/
+SYSCALL(sys_setreuid16,sys_ni_syscall,sys32_setreuid16_wrapper)	/* old setreuid16 syscall */
+SYSCALL(sys_setregid16,sys_ni_syscall,sys32_setregid16_wrapper)	/* old setregid16 syscall */
+SYSCALL(sys_sigsuspend_glue,sys_sigsuspend_glue,sys32_sigsuspend_glue)
+SYSCALL(sys_sigpending,sys_sigpending,compat_sys_sigpending_wrapper)
+SYSCALL(sys_sethostname,sys_sethostname,sys32_sethostname_wrapper)
+SYSCALL(sys_setrlimit,sys_setrlimit,sys32_setrlimit_wrapper)	/* 75 */
+SYSCALL(sys_old_getrlimit,sys_getrlimit,sys32_old_getrlimit_wrapper)
+SYSCALL(sys_getrusage,sys_getrusage,sys32_getrusage_wrapper)
+SYSCALL(sys_gettimeofday,sys_gettimeofday,sys32_gettimeofday_wrapper)
+SYSCALL(sys_settimeofday,sys_settimeofday,sys32_settimeofday_wrapper)
+SYSCALL(sys_getgroups16,sys_ni_syscall,sys32_getgroups16_wrapper)	/* 80 old getgroups16 syscall */
+SYSCALL(sys_setgroups16,sys_ni_syscall,sys32_setgroups16_wrapper)	/* old setgroups16 syscall */
+NI_SYSCALL							/* old select syscall */
+SYSCALL(sys_symlink,sys_symlink,sys32_symlink_wrapper)
+NI_SYSCALL							/* old lstat syscall */
+SYSCALL(sys_readlink,sys_readlink,sys32_readlink_wrapper)	/* 85 */
+SYSCALL(sys_uselib,sys_uselib,sys32_uselib_wrapper)
+SYSCALL(sys_swapon,sys_swapon,sys32_swapon_wrapper)
+SYSCALL(sys_reboot,sys_reboot,sys32_reboot_wrapper)
+SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper)	/* old readdir syscall */
+SYSCALL(old_mmap,old_mmap,old32_mmap_wrapper)			/* 90 */
+SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper)
+SYSCALL(sys_truncate,sys_truncate,sys32_truncate_wrapper)
+SYSCALL(sys_ftruncate,sys_ftruncate,sys32_ftruncate_wrapper)
+SYSCALL(sys_fchmod,sys_fchmod,sys32_fchmod_wrapper)
+SYSCALL(sys_fchown16,sys_ni_syscall,sys32_fchown16_wrapper)	/* 95 old fchown16 syscall*/
+SYSCALL(sys_getpriority,sys_getpriority,sys32_getpriority_wrapper)
+SYSCALL(sys_setpriority,sys_setpriority,sys32_setpriority_wrapper)
+NI_SYSCALL							/* old profil syscall */
+SYSCALL(sys_statfs,sys_statfs,compat_sys_statfs_wrapper)
+SYSCALL(sys_fstatfs,sys_fstatfs,compat_sys_fstatfs_wrapper)	/* 100 */
+SYSCALL(sys_ioperm,sys_ni_syscall,sys_ni_syscall)
+SYSCALL(sys_socketcall,sys_socketcall,compat_sys_socketcall_wrapper)
+SYSCALL(sys_syslog,sys_syslog,sys32_syslog_wrapper)
+SYSCALL(sys_setitimer,sys_setitimer,compat_sys_setitimer_wrapper)
+SYSCALL(sys_getitimer,sys_getitimer,compat_sys_getitimer_wrapper)	/* 105 */
+SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper)
+SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper)
+SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper)
+NI_SYSCALL							/* old uname syscall */
+NI_SYSCALL							/* 110 iopl for i386 */
+SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup)
+NI_SYSCALL							/* old "idle" system call */
+NI_SYSCALL							/* vm86old for i386 */
+SYSCALL(sys_wait4,sys_wait4,sys32_wait4_wrapper)
+SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper)		/* 115 */
+SYSCALL(sys_sysinfo,sys_sysinfo,sys32_sysinfo_wrapper)
+SYSCALL(sys_ipc,sys_ipc,sys32_ipc_wrapper)
+SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)
+SYSCALL(sys_sigreturn_glue,sys_sigreturn_glue,sys32_sigreturn_glue)
+SYSCALL(sys_clone_glue,sys_clone_glue,sys32_clone_glue)		/* 120 */
+SYSCALL(sys_setdomainname,sys_setdomainname,sys32_setdomainname_wrapper)
+SYSCALL(sys_newuname,s390x_newuname,sys32_newuname_wrapper)
+NI_SYSCALL							/* modify_ldt for i386 */
+SYSCALL(sys_adjtimex,sys_adjtimex,sys32_adjtimex_wrapper)
+SYSCALL(sys_mprotect,sys_mprotect,sys32_mprotect_wrapper)	/* 125 */
+SYSCALL(sys_sigprocmask,sys_sigprocmask,compat_sys_sigprocmask_wrapper)
+NI_SYSCALL							/* old "create module" */
+SYSCALL(sys_init_module,sys_init_module,sys32_init_module_wrapper)
+SYSCALL(sys_delete_module,sys_delete_module,sys32_delete_module_wrapper)
+NI_SYSCALL							/* 130: old get_kernel_syms */
+SYSCALL(sys_quotactl,sys_quotactl,sys32_quotactl_wrapper)
+SYSCALL(sys_getpgid,sys_getpgid,sys32_getpgid_wrapper)
+SYSCALL(sys_fchdir,sys_fchdir,sys32_fchdir_wrapper)
+SYSCALL(sys_bdflush,sys_bdflush,sys32_bdflush_wrapper)
+SYSCALL(sys_sysfs,sys_sysfs,sys32_sysfs_wrapper)		/* 135 */
+SYSCALL(sys_personality,s390x_personality,sys32_personality_wrapper)
+NI_SYSCALL							/* for afs_syscall */
+SYSCALL(sys_setfsuid16,sys_ni_syscall,sys32_setfsuid16_wrapper)	/* old setfsuid16 syscall */
+SYSCALL(sys_setfsgid16,sys_ni_syscall,sys32_setfsgid16_wrapper)	/* old setfsgid16 syscall */
+SYSCALL(sys_llseek,sys_llseek,sys32_llseek_wrapper)		/* 140 */
+SYSCALL(sys_getdents,sys_getdents,sys32_getdents_wrapper)
+SYSCALL(sys_select,sys_select,sys32_select_wrapper)
+SYSCALL(sys_flock,sys_flock,sys32_flock_wrapper)
+SYSCALL(sys_msync,sys_msync,sys32_msync_wrapper)
+SYSCALL(sys_readv,sys_readv,sys32_readv_wrapper)		/* 145 */
+SYSCALL(sys_writev,sys_writev,sys32_writev_wrapper)
+SYSCALL(sys_getsid,sys_getsid,sys32_getsid_wrapper)
+SYSCALL(sys_fdatasync,sys_fdatasync,sys32_fdatasync_wrapper)
+SYSCALL(sys_sysctl,sys_sysctl,sys32_sysctl_wrapper)
+SYSCALL(sys_mlock,sys_mlock,sys32_mlock_wrapper)		/* 150 */
+SYSCALL(sys_munlock,sys_munlock,sys32_munlock_wrapper)
+SYSCALL(sys_mlockall,sys_mlockall,sys32_mlockall_wrapper)
+SYSCALL(sys_munlockall,sys_munlockall,sys_munlockall)
+SYSCALL(sys_sched_setparam,sys_sched_setparam,sys32_sched_setparam_wrapper)
+SYSCALL(sys_sched_getparam,sys_sched_getparam,sys32_sched_getparam_wrapper)	/* 155 */
+SYSCALL(sys_sched_setscheduler,sys_sched_setscheduler,sys32_sched_setscheduler_wrapper)
+SYSCALL(sys_sched_getscheduler,sys_sched_getscheduler,sys32_sched_getscheduler_wrapper)
+SYSCALL(sys_sched_yield,sys_sched_yield,sys_sched_yield)
+SYSCALL(sys_sched_get_priority_max,sys_sched_get_priority_max,sys32_sched_get_priority_max_wrapper)
+SYSCALL(sys_sched_get_priority_min,sys_sched_get_priority_min,sys32_sched_get_priority_min_wrapper)	/* 160 */
+SYSCALL(sys_sched_rr_get_interval,sys_sched_rr_get_interval,sys32_sched_rr_get_interval_wrapper)
+SYSCALL(sys_nanosleep,sys_nanosleep,compat_sys_nanosleep_wrapper)
+SYSCALL(sys_mremap,sys_mremap,sys32_mremap_wrapper)
+SYSCALL(sys_setresuid16,sys_ni_syscall,sys32_setresuid16_wrapper)	/* old setresuid16 syscall */
+SYSCALL(sys_getresuid16,sys_ni_syscall,sys32_getresuid16_wrapper)	/* 165 old getresuid16 syscall */
+NI_SYSCALL							/* for vm86 */
+NI_SYSCALL							/* old sys_query_module */
+SYSCALL(sys_poll,sys_poll,sys32_poll_wrapper)
+SYSCALL(sys_nfsservctl,sys_nfsservctl,sys32_nfsservctl_wrapper)
+SYSCALL(sys_setresgid16,sys_ni_syscall,sys32_setresgid16_wrapper)	/* 170 old setresgid16 syscall */
+SYSCALL(sys_getresgid16,sys_ni_syscall,sys32_getresgid16_wrapper)	/* old getresgid16 syscall */
+SYSCALL(sys_prctl,sys_prctl,sys32_prctl_wrapper)
+SYSCALL(sys_rt_sigreturn_glue,sys_rt_sigreturn_glue,sys32_rt_sigreturn_glue)
+SYSCALL(sys_rt_sigaction,sys_rt_sigaction,sys32_rt_sigaction_wrapper)
+SYSCALL(sys_rt_sigprocmask,sys_rt_sigprocmask,sys32_rt_sigprocmask_wrapper)	/* 175 */
+SYSCALL(sys_rt_sigpending,sys_rt_sigpending,sys32_rt_sigpending_wrapper)
+SYSCALL(sys_rt_sigtimedwait,sys_rt_sigtimedwait,sys32_rt_sigtimedwait_wrapper)
+SYSCALL(sys_rt_sigqueueinfo,sys_rt_sigqueueinfo,sys32_rt_sigqueueinfo_wrapper)
+SYSCALL(sys_rt_sigsuspend_glue,sys_rt_sigsuspend_glue,sys32_rt_sigsuspend_glue)
+SYSCALL(sys_pread64,sys_pread64,sys32_pread64_wrapper)		/* 180 */
+SYSCALL(sys_pwrite64,sys_pwrite64,sys32_pwrite64_wrapper)
+SYSCALL(sys_chown16,sys_ni_syscall,sys32_chown16_wrapper)	/* old chown16 syscall */
+SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper)
+SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper)
+SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper)		/* 185 */
+SYSCALL(sys_sigaltstack_glue,sys_sigaltstack_glue,sys32_sigaltstack_glue)
+SYSCALL(sys_sendfile,sys_sendfile,sys32_sendfile_wrapper)
+NI_SYSCALL							/* streams1 */
+NI_SYSCALL							/* streams2 */
+SYSCALL(sys_vfork_glue,sys_vfork_glue,sys_vfork_glue)		/* 190 */
+SYSCALL(sys_getrlimit,sys_getrlimit,sys32_getrlimit_wrapper)
+SYSCALL(sys_mmap2,sys_mmap2,sys32_mmap2_wrapper)
+SYSCALL(sys_truncate64,sys_ni_syscall,sys32_truncate64_wrapper)
+SYSCALL(sys_ftruncate64,sys_ni_syscall,sys32_ftruncate64_wrapper)
+SYSCALL(sys_stat64,sys_ni_syscall,sys32_stat64_wrapper)		/* 195 */
+SYSCALL(sys_lstat64,sys_ni_syscall,sys32_lstat64_wrapper)
+SYSCALL(sys_fstat64,sys_ni_syscall,sys32_fstat64_wrapper)
+SYSCALL(sys_lchown,sys_lchown,sys32_lchown_wrapper)
+SYSCALL(sys_getuid,sys_getuid,sys_getuid)
+SYSCALL(sys_getgid,sys_getgid,sys_getgid)			/* 200 */
+SYSCALL(sys_geteuid,sys_geteuid,sys_geteuid)
+SYSCALL(sys_getegid,sys_getegid,sys_getegid)
+SYSCALL(sys_setreuid,sys_setreuid,sys32_setreuid_wrapper)
+SYSCALL(sys_setregid,sys_setregid,sys32_setregid_wrapper)
+SYSCALL(sys_getgroups,sys_getgroups,sys32_getgroups_wrapper)	/* 205 */
+SYSCALL(sys_setgroups,sys_setgroups,sys32_setgroups_wrapper)
+SYSCALL(sys_fchown,sys_fchown,sys32_fchown_wrapper)
+SYSCALL(sys_setresuid,sys_setresuid,sys32_setresuid_wrapper)
+SYSCALL(sys_getresuid,sys_getresuid,sys32_getresuid_wrapper)
+SYSCALL(sys_setresgid,sys_setresgid,sys32_setresgid_wrapper)	/* 210 */
+SYSCALL(sys_getresgid,sys_getresgid,sys32_getresgid_wrapper)
+SYSCALL(sys_chown,sys_chown,sys32_chown_wrapper)
+SYSCALL(sys_setuid,sys_setuid,sys32_setuid_wrapper)
+SYSCALL(sys_setgid,sys_setgid,sys32_setgid_wrapper)
+SYSCALL(sys_setfsuid,sys_setfsuid,sys32_setfsuid_wrapper)	/* 215 */
+SYSCALL(sys_setfsgid,sys_setfsgid,sys32_setfsgid_wrapper)
+SYSCALL(sys_pivot_root,sys_pivot_root,sys32_pivot_root_wrapper)
+SYSCALL(sys_mincore,sys_mincore,sys32_mincore_wrapper)
+SYSCALL(sys_madvise,sys_madvise,sys32_madvise_wrapper)
+SYSCALL(sys_getdents64,sys_getdents64,sys32_getdents64_wrapper)	/* 220 */
+SYSCALL(sys_fcntl64,sys_ni_syscall,compat_sys_fcntl64_wrapper)
+SYSCALL(sys_readahead,sys_readahead,sys32_readahead)
+SYSCALL(sys_sendfile64,sys_ni_syscall,sys32_sendfile64)
+SYSCALL(sys_setxattr,sys_setxattr,sys32_setxattr_wrapper)
+SYSCALL(sys_lsetxattr,sys_lsetxattr,sys32_lsetxattr_wrapper)	/* 225 */
+SYSCALL(sys_fsetxattr,sys_fsetxattr,sys32_fsetxattr_wrapper)
+SYSCALL(sys_getxattr,sys_getxattr,sys32_getxattr_wrapper)
+SYSCALL(sys_lgetxattr,sys_lgetxattr,sys32_lgetxattr_wrapper)
+SYSCALL(sys_fgetxattr,sys_fgetxattr,sys32_fgetxattr_wrapper)
+SYSCALL(sys_listxattr,sys_listxattr,sys32_listxattr_wrapper)	/* 230 */
+SYSCALL(sys_llistxattr,sys_llistxattr,sys32_llistxattr_wrapper)
+SYSCALL(sys_flistxattr,sys_flistxattr,sys32_flistxattr_wrapper)
+SYSCALL(sys_removexattr,sys_removexattr,sys32_removexattr_wrapper)
+SYSCALL(sys_lremovexattr,sys_lremovexattr,sys32_lremovexattr_wrapper)
+SYSCALL(sys_fremovexattr,sys_fremovexattr,sys32_fremovexattr_wrapper)	/* 235 */
+SYSCALL(sys_gettid,sys_gettid,sys_gettid)
+SYSCALL(sys_tkill,sys_tkill,sys_tkill)
+SYSCALL(sys_futex,sys_futex,compat_sys_futex_wrapper)
+SYSCALL(sys_sched_setaffinity,sys_sched_setaffinity,sys32_sched_setaffinity_wrapper)
+SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper)	/* 240 */
+NI_SYSCALL					
+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_exit_group,sys_exit_group,sys32_exit_group_wrapper)
+SYSCALL(sys_epoll_create,sys_epoll_create,sys_ni_syscall)
+SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_ni_syscall)		/* 250 */
+SYSCALL(sys_epoll_wait,sys_epoll_wait,sys_ni_syscall)
+SYSCALL(sys_set_tid_address,sys_set_tid_address,sys32_set_tid_address_wrapper)
+SYSCALL(sys_fadvise64,sys_fadvise64,sys_ni_syscall)
+SYSCALL(sys_timer_create,sys_timer_create,sys_ni_syscall)
+SYSCALL(sys_timer_settime,sys_timer_settime,sys_ni_syscall)	/* 255 */
+SYSCALL(sys_timer_gettime,sys_timer_gettime,sys_ni_syscall)
+SYSCALL(sys_timer_getoverrun,sys_timer_getoverrun,sys_ni_syscall)
+SYSCALL(sys_timer_delete,sys_timer_delete,sys_ni_syscall)
+SYSCALL(sys_clock_settime,sys_clock_settime,sys_ni_syscall)
+SYSCALL(sys_clock_gettime,sys_clock_gettime,sys_ni_syscall)
+SYSCALL(sys_clock_getres,sys_clock_getres,sys_ni_syscall)
+SYSCALL(sys_clock_nanosleep,sys_clock_nanosleep,sys_ni_syscall)
diff -Nru a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
--- a/arch/s390/kernel/time.c	Sat Apr 19 19:51:27 2003
+++ b/arch/s390/kernel/time.c	Sat Apr 19 19:51:27 2003
@@ -49,8 +49,9 @@
 u64 jiffies_64 = INITIAL_JIFFIES;
 
 static ext_int_info_t ext_int_info_timer;
-static uint64_t xtime_cc;
-static uint64_t init_timer_cc;
+static u64 init_timer_cc;
+static u64 jiffies_timer_cc;
+static u64 xtime_cc;
 
 extern unsigned long wall_jiffies;
 
@@ -70,7 +71,7 @@
 	__u64 now;
 
 	asm volatile ("STCK 0(%0)" : : "a" (&now) : "memory", "cc");
-        now = (now - init_timer_cc) >> 12;
+        now = (now - jiffies_timer_cc) >> 12;
 	/* We require the offset from the latest update of xtime */
 	now -= (__u64) wall_jiffies*USECS_PER_JIFFY;
 	return (unsigned long) now;
@@ -127,15 +128,28 @@
 	write_sequnlock_irq(&xtime_lock);
 }
 
-static inline __u32 div64_32(__u64 dividend, __u32 divisor)
+#ifndef CONFIG_ARCH_S390X
+
+static inline __u32
+__calculate_ticks(__u64 elapsed)
 {
 	register_pair rp;
 
-	rp.pair = dividend;
-	asm ("dr %0,%1" : "+d" (rp) : "d" (divisor));
+	rp.pair = elapsed >> 1;
+	asm ("dr %0,%1" : "+d" (rp) : "d" (CLK_TICKS_PER_JIFFY >> 1));
 	return rp.subreg.odd;
 }
 
+#else /* CONFIG_ARCH_S390X */
+
+static inline __u32
+__calculate_ticks(__u64 elapsed)
+{
+	return elapsed / CLK_TICKS_PER_JIFFY;
+}
+
+#endif /* CONFIG_ARCH_S390X */
+
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
@@ -149,7 +163,7 @@
 	asm volatile ("STCK 0(%0)" : : "a" (&tmp) : "memory", "cc");
 	tmp = tmp - S390_lowcore.jiffy_timer;
 	if (tmp >= 2*CLK_TICKS_PER_JIFFY) {  /* more than one tick ? */
-		ticks = div64_32(tmp >> 1, CLK_TICKS_PER_JIFFY >> 1);
+		ticks = __calculate_ticks(tmp);
 		S390_lowcore.jiffy_timer +=
 			CLK_TICKS_PER_JIFFY * (__u64) ticks;
 	} else {
@@ -174,7 +188,7 @@
 
 		tmp = S390_lowcore.jiffy_timer - xtime_cc;
 		if (tmp >= 2*CLK_TICKS_PER_JIFFY) {
-			xticks = div64_32(tmp >> 1, CLK_TICKS_PER_JIFFY >> 1);
+			xticks = __calculate_ticks(tmp);
 			xtime_cc += (__u64) xticks * CLK_TICKS_PER_JIFFY;
 		} else {
 			xticks = 1;
@@ -202,14 +216,14 @@
 	unsigned long cr0;
 	__u64 timer;
 
-        /* allow clock comparator timer interrupt */
-        asm volatile ("STCTL 0,0,%0" : "=m" (cr0) : : "memory");
-        cr0 |= 0x800;
-        asm volatile ("LCTL 0,0,%0" : : "m" (cr0) : "memory");
-	timer = init_timer_cc + jiffies_64 * CLK_TICKS_PER_JIFFY;
+	timer = jiffies_timer_cc + jiffies_64 * CLK_TICKS_PER_JIFFY;
 	S390_lowcore.jiffy_timer = timer;
 	timer += CLK_TICKS_PER_JIFFY + CPU_DEVIATION;
 	asm volatile ("SCKC %0" : : "m" (timer));
+        /* allow clock comparator timer interrupt */
+	__ctl_store(cr0, 0, 0);
+        cr0 |= 0x800;
+	__ctl_load(cr0, 0, 0);
 }
 
 /*
@@ -239,6 +253,7 @@
                 printk("time_init: TOD clock stopped/non-operational\n");
                 break;
         }
+	jiffies_timer_cc = init_timer_cc - jiffies_64 * CLK_TICKS_PER_JIFFY;
 
 	/* set xtime */
 	xtime_cc = init_timer_cc;
diff -Nru a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c
--- a/arch/s390/kernel/traps.c	Sat Apr 19 19:51:46 2003
+++ b/arch/s390/kernel/traps.c	Sat Apr 19 19:51:46 2003
@@ -27,6 +27,7 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/module.h>
+#include <linux/kallsyms.h>
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
@@ -35,6 +36,7 @@
 #include <asm/mathemu.h>
 #include <asm/cpcmd.h>
 #include <asm/s390_ext.h>
+#include <asm/lowcore.h>
 
 /* Called from entry.S only */
 extern void handle_per_exception(struct pt_regs *regs);
@@ -52,6 +54,7 @@
 
 extern pgm_check_handler_t do_protection_exception;
 extern pgm_check_handler_t do_segment_exception;
+extern pgm_check_handler_t do_region_exception;
 extern pgm_check_handler_t do_page_exception;
 extern pgm_check_handler_t do_pseudo_page_fault;
 #ifdef CONFIG_PFAULT
@@ -61,31 +64,37 @@
 static ext_int_info_t ext_int_pfault;
 #endif
 
+#define stack_pointer ({ void **sp; asm("la %0,0(15)" : "=&d" (sp)); sp; })
+
+#ifndef CONFIG_ARCH_S390X
+#define RET_ADDR 56
+#define FOURLONG "%08lx %08lx %08lx %08lx\n"
 static int kstack_depth_to_print = 12;
 
+#else /* CONFIG_ARCH_S390X */
+#define RET_ADDR 112
+#define FOURLONG "%016lx %016lx %016lx %016lx\n"
+static int kstack_depth_to_print = 20;
+
+#endif /* CONFIG_ARCH_S390X */
+
 void show_trace(unsigned long * stack)
 {
 	unsigned long backchain, low_addr, high_addr, ret_addr;
-	int i;
 
 	if (!stack)
-		stack = (unsigned long*)&stack;
+		stack = *stack_pointer;
 
-	printk("Call Trace: ");
+	printk("Call Trace:\n");
 	low_addr = ((unsigned long) stack) & PSW_ADDR_INSN;
 	high_addr = (low_addr & (-THREAD_SIZE)) + THREAD_SIZE;
 	/* Skip the first frame (biased stack) */
 	backchain = *((unsigned long *) low_addr) & PSW_ADDR_INSN;
 	/* Print up to 8 lines */
-	for (i = 0; i < 8; i++) {
-		if (backchain < low_addr || backchain >= high_addr)
-			break;
-		ret_addr = *((unsigned long *) (backchain+56)) & PSW_ADDR_INSN;
-		if (!kernel_text_address(ret_addr))
-			break;
-		if (i && ((i % 6) == 0))
-			printk("\n   ");
-		printk("[<%08lx>] ", ret_addr);
+	while  (backchain > low_addr && backchain <= high_addr) {
+		ret_addr = *((unsigned long *) (backchain+RET_ADDR)) & PSW_ADDR_INSN;
+		printk(" [<%016lx>] ", ret_addr);
+		print_symbol("%s\n", ret_addr);
 		low_addr = backchain;
 		backchain = *((unsigned long *) backchain) & PSW_ADDR_INSN;
 	}
@@ -112,15 +121,15 @@
 	// back trace for this cpu.
 
 	if(sp == NULL)
-		sp = (unsigned long*) &sp;
+		sp = *stack_pointer;
 
 	stack = sp;
 	for (i = 0; i < kstack_depth_to_print; i++) {
 		if (((addr_t) stack & (THREAD_SIZE-1)) == 0)
 			break;
-		if (i && ((i % 8) == 0))
+		if (i && ((i * sizeof (long) % 32) == 0))
 			printk("\n       ");
-		printk("%08lx ", *stack++);
+		printk("%p ", (void *)*stack++);
 	}
 	printk("\n");
 	show_trace(sp);
@@ -141,17 +150,18 @@
 	int i;
 
 	mode = (regs->psw.mask & PSW_MASK_PSTATE) ? "User" : "Krnl";
-	printk("%s PSW : %08lx %08lx\n",
-	       mode, (unsigned long) regs->psw.mask,
-	       (unsigned long) regs->psw.addr);
-	printk("%s GPRS: %08x %08x %08x %08x\n", mode,
+	printk("%s PSW : %p %p\n",
+	       mode, (void *) regs->psw.mask,
+	       (void *) regs->psw.addr);
+	printk("%s GPRS: " FOURLONG, mode,
 	       regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]);
-	printk("           %08x %08x %08x %08x\n",
+	printk("           " FOURLONG,
 	       regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]);
-	printk("           %08x %08x %08x %08x\n",
+	printk("           " FOURLONG,
 	       regs->gprs[8], regs->gprs[9], regs->gprs[10], regs->gprs[11]);
-	printk("           %08x %08x %08x %08x\n",
+	printk("           " FOURLONG,
 	       regs->gprs[12], regs->gprs[13], regs->gprs[14], regs->gprs[15]);
+
 	printk("%s ACRS: %08x %08x %08x %08x\n", mode,
 	       regs->acrs[0], regs->acrs[1], regs->acrs[2], regs->acrs[3]);
 	printk("           %08x %08x %08x %08x\n",
@@ -190,21 +200,21 @@
 	struct pt_regs *regs;
 
 	regs = __KSTK_PTREGS(task);
-	buffer += sprintf(buffer, "task: %08lx, ksp: %08x\n",
-			  (unsigned long) task, task->thread.ksp);
-	buffer += sprintf(buffer, "User PSW : %08lx %08lx\n",
-			  (unsigned long) regs->psw.mask, 
-			  (unsigned long) regs->psw.addr);
-	buffer += sprintf(buffer, "User GPRS: %08x %08x %08x %08x\n",
+	buffer += sprintf(buffer, "task: %p, ksp: %p\n",
+		       task, (void *)task->thread.ksp);
+	buffer += sprintf(buffer, "User PSW : %p %p\n",
+		       (void *) regs->psw.mask, (void *)regs->psw.addr);
+
+	buffer += sprintf(buffer, "User GPRS: " FOURLONG,
 			  regs->gprs[0], regs->gprs[1],
 			  regs->gprs[2], regs->gprs[3]);
-	buffer += sprintf(buffer, "           %08x %08x %08x %08x\n",
+	buffer += sprintf(buffer, "           " FOURLONG,
 			  regs->gprs[4], regs->gprs[5],
 			  regs->gprs[6], regs->gprs[7]);
-	buffer += sprintf(buffer, "           %08x %08x %08x %08x\n",
+	buffer += sprintf(buffer, "           " FOURLONG,
 			  regs->gprs[8], regs->gprs[9],
 			  regs->gprs[10], regs->gprs[11]);
-	buffer += sprintf(buffer, "           %08x %08x %08x %08x\n",
+	buffer += sprintf(buffer, "           " FOURLONG,
 			  regs->gprs[12], regs->gprs[13],
 			  regs->gprs[14], regs->gprs[15]);
 	buffer += sprintf(buffer, "User ACRS: %08x %08x %08x %08x\n",
@@ -270,9 +280,9 @@
 #endif
         } else {
                 const struct exception_table_entry *fixup;
-                fixup = search_exception_tables(regs->psw.addr & 0x7fffffff);
+                fixup = search_exception_tables(regs->psw.addr & PSW_ADDR_INSN);
                 if (fixup)
-                        regs->psw.addr = fixup->fixup | PSW_ADDR_AMODE31;
+                        regs->psw.addr = fixup->fixup | ~PSW_ADDR_INSN;
                 else
                         die(str, regs, interruption_code);
         }
@@ -375,7 +385,7 @@
 	__u16 *location;
 	int signal = 0;
 
-	location = (__u16 *)(regs->psw.addr-S390_lowcore.pgm_ilc);
+	location = (__u16 *) get_check_address(regs);
 
 	/*
 	 * We got all needed information from the lowcore and can
@@ -427,7 +437,6 @@
 }
 
 
-
 #ifdef CONFIG_MATHEMU
 asmlinkage void 
 specification_exception(struct pt_regs * regs, long interruption_code)
@@ -605,33 +614,40 @@
         pgm_check_table[9] = &divide_exception;
         pgm_check_table[0x10] = &do_segment_exception;
         pgm_check_table[0x11] = &do_page_exception;
+        pgm_check_table[0x10] = &do_segment_exception;
+        pgm_check_table[0x11] = &do_page_exception;
         pgm_check_table[0x12] = &translation_exception;
         pgm_check_table[0x13] = &special_op_exception;
+#ifndef CONFIG_ARCH_S390X
  	pgm_check_table[0x14] = &do_pseudo_page_fault;
+#else /* CONFIG_ARCH_S390X */
+        pgm_check_table[0x38] = &addressing_exception;
+        pgm_check_table[0x3B] = &do_region_exception;
+#endif /* CONFIG_ARCH_S390X */
         pgm_check_table[0x15] = &operand_exception;
         pgm_check_table[0x1C] = &privileged_op;
-#ifdef CONFIG_PFAULT
 	if (MACHINE_IS_VM) {
-		/* request the 0x2603 external interrupt */
-		if (register_early_external_interrupt(0x2603, pfault_interrupt,
-						      &ext_int_pfault) != 0)
-			panic("Couldn't request external interrupt 0x2603");
 		/*
 		 * First try to get pfault pseudo page faults going.
 		 * If this isn't available turn on pagex page faults.
 		 */
-		if (pfault_init() != 0) {
-			/* Tough luck, no pfault. */
-			unregister_early_external_interrupt(0x2603,
-							    pfault_interrupt,
-							    &ext_int_pfault);
-			cpcmd("SET PAGEX ON", NULL, 0);
-		}
-	}
-#else
-	if (MACHINE_IS_VM)
+#ifdef CONFIG_PFAULT
+		/* request the 0x2603 external interrupt */
+		if (register_early_external_interrupt(0x2603, pfault_interrupt,
+						      &ext_int_pfault) != 0)
+			panic("Couldn't request external interrupt 0x2603");
+
+		if (pfault_init() == 0) 
+			return;
+		
+		/* Tough luck, no pfault. */
+		unregister_early_external_interrupt(0x2603, pfault_interrupt,
+						    &ext_int_pfault);
+#endif
+#ifndef CONFIG_ARCH_S390X
 		cpcmd("SET PAGEX ON", NULL, 0);
 #endif
+	}
 }
 
 
diff -Nru a/arch/s390/lib/Makefile b/arch/s390/lib/Makefile
--- a/arch/s390/lib/Makefile	Sat Apr 19 19:51:28 2003
+++ b/arch/s390/lib/Makefile	Sat Apr 19 19:51:28 2003
@@ -6,4 +6,6 @@
 
 EXTRA_AFLAGS := -traditional
 
-obj-y = delay.o memset.o strcmp.o strncpy.o uaccess.o
+obj-y += delay.o 
+obj-$(CONFIG_ARCH_S390_31) += memset.o strcmp.o strncpy.o uaccess.o
+obj-$(CONFIG_ARCH_S390X) += memset64.o strcmp64.o strncpy64.o uaccess64.o
diff -Nru a/arch/s390/lib/memset64.S b/arch/s390/lib/memset64.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/lib/memset64.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,30 @@
+/*
+ *  arch/s390/lib/memset.S
+ *    S390 fast memset routine
+ *
+ *  S390 version
+ *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
+ */
+
+/*
+ * R2 = address to memory area
+ * R3 = byte to fill memory with
+ * R4 = number of bytes to fill
+ */
+        .globl  memset
+memset:
+        LTGR    4,4
+        JZ      memset_end
+        LGR     0,2                    # save pointer to memory area
+        LGR     1,3                    # move pad byte to R1
+        LGR     3,4
+        SGR     4,4                    # no source for MVCLE, only a pad byte
+        SGR     5,5
+        MVCLE   2,4,0(1)               # thats it, MVCLE is your friend
+        JO      .-4
+        LGR     2,0                    # return pointer to mem.
+memset_end:
+        BR      14
+        
+
diff -Nru a/arch/s390/lib/strcmp64.S b/arch/s390/lib/strcmp64.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/lib/strcmp64.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,27 @@
+/*
+ *  arch/s390/lib/strcmp.S
+ *    S390 strcmp routine
+ *
+ *  S390 version
+ *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
+ */
+
+/*
+ * R2 = address of compare string
+ * R3 = address of test string
+ */
+        .globl   strcmp
+strcmp:
+        SGR     0,0
+        SGR     1,1
+        CLST    2,3
+        JO      .-4
+        JE      strcmp_equal
+        IC      0,0(3)
+        IC      1,0(2)
+        SGR     1,0
+strcmp_equal:
+        LGR     2,1
+        BR      14
+        
diff -Nru a/arch/s390/lib/strncpy64.S b/arch/s390/lib/strncpy64.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/lib/strncpy64.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,30 @@
+/*
+ *  arch/s390/kernel/strncpy.S
+ *    S390 strncpy routine
+ *
+ *  S390 version
+ *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
+ */
+
+/*
+ * R2 = address of destination
+ * R3 = address of source string
+ * R4 = max number of bytes to copy
+ */
+        .globl   strncpy
+strncpy:
+        LGR     1,2            # don't touch address in R2
+	LTR     4,4
+        JZ      strncpy_exit   # 0 bytes -> nothing to do
+	SGR     0,0
+strncpy_loop:
+        ICM     0,1,0(3)       # ICM sets the cc, IC does not
+	LA      3,1(3)
+        STC     0,0(1)
+	LA      1,1(1)
+        JZ      strncpy_exit   # ICM inserted a 0x00
+        BRCTG   4,strncpy_loop # R4 -= 1, jump to strncpy_loop if > 0
+strncpy_exit:
+        BR      14
+
diff -Nru a/arch/s390/lib/uaccess64.S b/arch/s390/lib/uaccess64.S
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/s390/lib/uaccess64.S	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,107 @@
+/*
+ *  arch/s390x/lib/uaccess.S
+ *    __copy_{from|to}_user functions.
+ *
+ *  s390
+ *    Copyright (C) 2000,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
+ *    Authors(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
+ *
+ *  These functions have standard call interface
+ */
+
+#include <asm/lowcore.h>
+
+        .text
+        .align 4
+        .globl __copy_from_user_asm
+__copy_from_user_asm:
+	lgr	%r5,%r3
+	sacf	512
+0:	mvcle	%r2,%r4,0
+	jo	0b
+1:	sacf	0
+	lgr	%r2,%r5
+	br	%r14
+2:	lghi	%r1,-4096
+	lgr	%r3,%r4
+	slgr	%r3,%r1      # %r3 = %r4 + 4096
+	ngr	%r3,%r1      # %r3 = (%r4 + 4096) & -4096
+	slgr	%r3,%r4      # %r3 = #bytes to next user page boundary
+	clgr	%r5,%r3      # copy crosses next page boundary ?
+	jnh	1b           # no, this page fauled
+	# The page after the current user page might have faulted.
+	# We cant't find out which page because the program check handler
+	# might have callled schedule, destroying all lowcore information.
+	# We retry with the shortened length.
+3:	mvcle	%r2,%r4,0
+	jo	3b
+	j	1b
+        .section __ex_table,"a"
+	.quad	0b,2b
+	.quad	3b,1b
+        .previous
+
+        .align 4
+        .text
+        .globl __copy_to_user_asm
+__copy_to_user_asm:
+	lgr	%r5,%r3
+	sacf	512
+0:	mvcle	%r4,%r2,0
+	jo	0b
+1:	sacf	0
+	lgr	%r2,%r3
+	br	%r14
+2:	lghi	%r1,-4096
+	lgr	%r5,%r4
+	slgr	%r5,%r1      # %r5 = %r4 + 4096
+	ngr	%r5,%r1      # %r5 = (%r4 + 4096) & -4096
+	slgr	%r5,%r4      # %r5 = #bytes to next user page boundary
+	clgr	%r3,%r5      # copy crosses next page boundary ?
+	jnh	1b           # no, the current page fauled
+	# The page after the current user page might have faulted.
+	# We cant't find out which page because the program check handler
+	# might have callled schedule, destroying all lowcore information.
+	# We retry with the shortened length.
+3:	mvcle	%r4,%r2,0
+	jo	3b
+	j	1b
+        .section __ex_table,"a"
+	.quad	0b,2b
+	.quad	3b,1b
+        .previous
+
+        .align 4
+        .text
+        .globl __clear_user_asm
+__clear_user_asm:
+	lgr	%r4,%r2
+	lgr	%r5,%r3
+	sgr	%r2,%r2
+	sgr	%r3,%r3
+	sacf	512
+0:	mvcle	%r4,%r2,0
+	jo	0b
+1:	sacf	0
+	br	%r14
+2:	lgr	%r2,%r5
+	lghi	%r1,-4096
+	slgr	%r5,%r1      # %r5 = %r4 + 4096
+	ngr	%r5,%r1      # %r5 = (%r4 + 4096) & -4096
+	slgr	%r5,%r4      # %r5 = #bytes to next user page boundary
+	clgr	%r2,%r5      # copy crosses next page boundary ?
+	jnh	1b           # no, the current page fauled
+	# The page after the current user page might have faulted.
+	# We cant't find out which page because the program check handler
+	# might have callled schedule, destroying all lowcore information.
+	# We retry with the shortened length.
+	slgr	%r2,%r5
+3:	mvcle	%r4,%r2,0
+	jo	3b
+	j	1b
+4:	algr	%r2,%r5
+	j	1b
+        .section __ex_table,"a"
+	.quad	0b,2b
+        .quad	3b,4b
+        .previous
diff -Nru a/arch/s390/math-emu/math.c b/arch/s390/math-emu/math.c
--- a/arch/s390/math-emu/math.c	Sat Apr 19 19:51:46 2003
+++ b/arch/s390/math-emu/math.c	Sat Apr 19 19:51:46 2003
@@ -14,6 +14,7 @@
 #include <linux/sched.h>
 #include <linux/mm.h>
 #include <asm/uaccess.h>
+#include <asm/lowcore.h>
 
 #include "sfp-util.h"
 #include <math-emu/soft-fp.h>
diff -Nru a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
--- a/arch/s390/mm/fault.c	Sat Apr 19 19:51:50 2003
+++ b/arch/s390/mm/fault.c	Sat Apr 19 19:51:50 2003
@@ -22,7 +22,6 @@
 #include <linux/mm.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
-#include <linux/compatmac.h>
 #include <linux/init.h>
 #include <linux/console.h>
 #include <linux/module.h>
@@ -32,6 +31,18 @@
 #include <asm/pgtable.h>
 #include <asm/hardirq.h>
 
+#ifndef CONFIG_ARCH_S390X
+#define __FAIL_ADDR_MASK 0x7ffff000
+#define __FIXUP_MASK 0x7fffffff
+#define __SUBCODE_MASK 0x0200
+#define __PF_RES_FIELD 0ULL
+#else /* CONFIG_ARCH_S390X */
+#define __FAIL_ADDR_MASK -4096L
+#define __FIXUP_MASK ~0L
+#define __SUBCODE_MASK 0x0600
+#define __PF_RES_FIELD 0x8000000000000000ULL
+#endif /* CONFIG_ARCH_S390X */
+
 #ifdef CONFIG_SYSCTL
 extern int sysctl_userprocess_debug;
 #endif
@@ -144,6 +155,7 @@
  *   04       Protection           ->  Write-Protection  (suprression)
  *   10       Segment translation  ->  Not present       (nullification)
  *   11       Page translation     ->  Not present       (nullification)
+ *   3b       Region third trans.  ->  Not present       (nullification)
  */
 extern inline void do_exception(struct pt_regs *regs, unsigned long error_code)
 {
@@ -183,7 +195,7 @@
          * more specific the segment and page table portion of 
          * the address 
          */
-        address = S390_lowcore.trans_exc_code&0x7ffff000;
+        address = S390_lowcore.trans_exc_code & __FAIL_ADDR_MASK;
 	user_address = check_user_space(regs, error_code);
 
 	/*
@@ -268,9 +280,9 @@
 
 no_context:
         /* Are we prepared to handle this kernel fault?  */
-	fixup = search_exception_tables(regs->psw.addr & 0x7fffffff);
+	fixup = search_exception_tables(regs->psw.addr & __FIXUP_MASK);
 	if (fixup) {
-		regs->psw.addr = fixup->fixup | PSW_ADDR_AMODE31;
+		regs->psw.addr = fixup->fixup | PSW_ADDR_AMODE;
                 return;
         }
 
@@ -280,10 +292,10 @@
  */
         if (user_address == 0)
                 printk(KERN_ALERT "Unable to handle kernel pointer dereference"
-        	       " at virtual kernel address %08lx\n", address);
+        	       " at virtual kernel address %p\n", (void *)address);
         else
                 printk(KERN_ALERT "Unable to handle kernel paging request"
-		       " at virtual user address %08lx\n", address);
+		       " at virtual user address %p\n", (void *)address);
 
         die("Oops", regs, error_code);
         do_exit(SIGKILL);
@@ -336,6 +348,16 @@
 	do_exception(regs, 0x11);
 }
 
+#ifdef CONFIG_ARCH_S390X
+
+void
+do_region_exception(struct pt_regs *regs, unsigned long error_code)
+{
+	do_exception(regs, 0x3b);
+}
+
+#else /* CONFIG_ARCH_S390X */
+
 typedef struct _pseudo_wait_t {
        struct _pseudo_wait_t *next;
        wait_queue_head_t queue;
@@ -436,6 +458,7 @@
                 wait_event(wait_struct.queue, wait_struct.resolved);
         }
 }
+#endif /* CONFIG_ARCH_S390X */
 
 #ifdef CONFIG_PFAULT 
 /*
@@ -465,7 +488,8 @@
 int pfault_init(void)
 {
 	pfault_refbk_t refbk =
-	{ 0x258, 0, 5, 2, __LC_KERNEL_STACK, 1ULL << 48, 1ULL << 48, 0ULL };
+		{ 0x258, 0, 5, 2, __LC_KERNEL_STACK, 1ULL << 48, 1ULL << 48,
+		  __PF_RES_FIELD };
         int rc;
 
 	if (pfault_disable)
@@ -477,7 +501,11 @@
 		"2:\n"
 		".section __ex_table,\"a\"\n"
 		"   .align 4\n"
+#ifndef CONFIG_ARCH_S390X
 		"   .long  0b,1b\n"
+#else /* CONFIG_ARCH_S390X */
+		"   .quad  0b,1b\n"
+#endif /* CONFIG_ARCH_S390X */
 		".previous"
                 : "=d" (rc) : "a" (&refbk) : "cc" );
         __ctl_set_bit(0, 9);
@@ -497,7 +525,11 @@
 		"0:\n"
 		".section __ex_table,\"a\"\n"
 		"   .align 4\n"
+#ifndef CONFIG_ARCH_S390X
 		"   .long  0b,0b\n"
+#else /* CONFIG_ARCH_S390X */
+		"   .quad  0b,0b\n"
+#endif /* CONFIG_ARCH_S390X */
 		".previous"
 		: : "a" (&refbk) : "cc" );
 }
@@ -517,7 +549,7 @@
          * external interrupt. 
 	 */
 	subcode = S390_lowcore.cpu_addr;
-	if ((subcode & 0xff00) != 0x0200)
+	if ((subcode & 0xff00) != __SUBCODE_MASK)
 		return;
 
 	/*
@@ -525,7 +557,7 @@
 	 */
 	tsk = (struct task_struct *)
 		(*((unsigned long *) __LC_PFAULT_INTPARM) - THREAD_SIZE);
-	
+
 	/*
 	 * We got all needed information from the lowcore and can
 	 * now safely switch on interrupts.
diff -Nru a/arch/s390/mm/init.c b/arch/s390/mm/init.c
--- a/arch/s390/mm/init.c	Sat Apr 19 19:51:49 2003
+++ b/arch/s390/mm/init.c	Sat Apr 19 19:51:49 2003
@@ -79,13 +79,12 @@
 extern unsigned long __init_end;
 
 /*
- * paging_init() sets up the page tables - note that the first 4MB are
- * already mapped by head.S.
- * paging_init will erase this initial mapping
+ * paging_init() sets up the page tables
  */
 
 unsigned long last_valid_pfn;
 
+#ifndef CONFIG_ARCH_S390X
 void __init paging_init(void)
 {
         pgd_t * pg_dir;
@@ -98,12 +97,12 @@
         static const int ssm_mask = 0x04000000L;
 
 	/* unmap whole virtual address space */
-
+	
         pg_dir = swapper_pg_dir;
 
 	for (i=0;i<KERNEL_PGD_PTRS;i++) 
 	        pmd_clear((pmd_t*)pg_dir++);
-
+		
 	/*
 	 * map whole physical memory to virtual memory (identity mapping) 
 	 */
@@ -146,13 +145,92 @@
 		zones_size[ZONE_DMA] = max_low_pfn;
 		free_area_init(zones_size);
 	}
+        return;
+}
+
+#else /* CONFIG_ARCH_S390X */
+void __init paging_init(void)
+{
+        pgd_t * pg_dir;
+	pmd_t * pm_dir;
+        pte_t * pt_dir;
+        pte_t   pte;
+	int     i,j,k;
+        unsigned long pfn = 0;
+        unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) |
+          _KERN_REGION_TABLE;
+	static const int ssm_mask = 0x04000000L;
+
+	unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
+	unsigned long dma_pfn, high_pfn;
+
+	dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT;
+	high_pfn = max_low_pfn;
+
+	if (dma_pfn > high_pfn)
+		zones_size[ZONE_DMA] = high_pfn;
+	else {
+		zones_size[ZONE_DMA] = dma_pfn;
+		zones_size[ZONE_NORMAL] = high_pfn - dma_pfn;
+	}
+
+	/* Initialize mem_map[].  */
+	free_area_init(zones_size);
+
+
+	/*
+	 * map whole physical memory to virtual memory (identity mapping) 
+	 */
+
+        pg_dir = swapper_pg_dir;
+	
+        for (i = 0 ; i < PTRS_PER_PGD ; i++,pg_dir++) {
+	
+                if (pfn >= max_low_pfn) {
+                        pgd_clear(pg_dir);
+                        continue;
+                }          
+        
+	        pm_dir = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE*4);
+                pgd_populate(&init_mm, pg_dir, pm_dir);
+
+                for (j = 0 ; j < PTRS_PER_PMD ; j++,pm_dir++) {
+                        if (pfn >= max_low_pfn) {
+                                pmd_clear(pm_dir);
+                                continue; 
+                        }          
+                        
+                        pt_dir = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+                        pmd_populate_kernel(&init_mm, pm_dir, pt_dir);
+	
+                        for (k = 0 ; k < PTRS_PER_PTE ; k++,pt_dir++) {
+                                pte = pfn_pte(pfn, PAGE_KERNEL);
+                                if (pfn >= max_low_pfn) {
+                                        pte_clear(&pte); 
+                                        continue;
+                                }
+                                set_pte(pt_dir, pte);
+                                pfn++;
+                        }
+                }
+        }
+
+        /* enable virtual mapping in kernel mode */
+        __asm__ __volatile__("lctlg 1,1,%0\n\t"
+                             "lctlg 7,7,%0\n\t"
+                             "lctlg 13,13,%0\n\t"
+                             "ssm   %1"
+			     : :"m" (pgdir_k), "m" (ssm_mask));
+
+        local_flush_tlb();
 
         return;
 }
+#endif /* CONFIG_ARCH_S390X */
 
 void __init mem_init(void)
 {
-	int codesize, reservedpages, datasize, initsize;
+	unsigned long codesize, reservedpages, datasize, initsize;
 
         max_mapnr = num_physpages = max_low_pfn;
         high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
@@ -168,7 +246,7 @@
 	codesize =  (unsigned long) &_etext - (unsigned long) &_text;
 	datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
 	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
-        printk("Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init)\n",
+        printk("Memory: %luk/%luk available (%ldk kernel code, %ldk reserved, %ldk data, %ldk init)\n",
                 (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
                 max_mapnr << (PAGE_SHIFT-10),
                 codesize >> 10,
diff -Nru a/arch/s390/mm/ioremap.c b/arch/s390/mm/ioremap.c
--- a/arch/s390/mm/ioremap.c	Sat Apr 19 19:51:28 2003
+++ b/arch/s390/mm/ioremap.c	Sat Apr 19 19:51:28 2003
@@ -38,7 +38,7 @@
                         printk("remap_area_pte: page already exists\n");
 			BUG();
 		}
-                set_pte(pte, pfn_pte(pfn, __pgprot(_PAGE_PRESENT | flags)));
+                set_pte(pte, pfn_pte(pfn, __pgprot(flags)));
                 address += PAGE_SIZE;
                 pfn++;
                 pte++;
diff -Nru a/arch/s390/vmlinux.lds.S b/arch/s390/vmlinux.lds.S
--- a/arch/s390/vmlinux.lds.S	Sat Apr 19 19:51:46 2003
+++ b/arch/s390/vmlinux.lds.S	Sat Apr 19 19:51:46 2003
@@ -3,11 +3,20 @@
  */
 
 #include <asm-generic/vmlinux.lds.h>
+#include <linux/config.h>
 
+#ifndef CONFIG_ARCH_S390X
 OUTPUT_FORMAT("elf32-s390", "elf32-s390", "elf32-s390")
 OUTPUT_ARCH(s390)
 ENTRY(_start)
 jiffies = jiffies_64 + 4;
+#else
+OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
+OUTPUT_ARCH(s390)
+ENTRY(_start)
+jiffies = jiffies_64;
+#endif
+
 SECTIONS
 {
   . = 0x00000000;
@@ -58,7 +67,11 @@
   /* will be freed after init */
   . = ALIGN(4096);		/* Init code and data */
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
   . = ALIGN(256);
   __setup_start = .;
diff -Nru a/arch/s390x/Kconfig b/arch/s390x/Kconfig
--- a/arch/s390x/Kconfig	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,352 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see Documentation/kbuild/kconfig-language.txt.
-#
-
-config MMU
-	bool
-	default y
-
-config RWSEM_GENERIC_SPINLOCK
-	bool
-
-config RWSEM_XCHGADD_ALGORITHM
-	bool
-	default y
-
-config GENERIC_BUST_SPINLOCK
-	bool
-
-
-mainmenu "Linux Kernel Configuration"
-
-config ARCH_S390
-	bool
-	default y
-	help
-	  Select this option, if you want to run the Kernel on one of IBM's
-	  mainframes of the S/390 generation. You should have installed the
-	  s390-compiler released by IBM (based on gcc-2.95.1) before.
-
-config ARCH_S390X
-	bool
-	default y
-
-source "init/Kconfig"
-
-
-menu "Base setup"
-
-comment "Processor type and features"
-
-config SMP
-	bool "Symmetric multi-processing support"
-	---help---
-	  This enables support for systems with more than one CPU. If you have
-	  a system with only one CPU, like most personal computers, say N. If
-	  you have a system with more than one CPU, say Y.
-
-	  If you say N here, the kernel will run on single and multiprocessor
-	  machines, but will use only one CPU of a multiprocessor machine. If
-	  you say Y here, the kernel will run on many, but not all,
-	  singleprocessor machines. On a singleprocessor machine, the kernel
-	  will run faster if you say N here.
-
-	  Note that if you say Y here and choose architecture "586" or
-	  "Pentium" under "Processor family", the kernel will not work on 486
-	  architectures. Similarly, multiprocessor kernels for the "PPro"
-	  architecture may not work on all Pentium based boards.
-
-	  People using multiprocessor machines who say Y here should also say
-	  Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
-	  Management" code will be disabled if you say Y here.
-
-	  See also the <file:Documentation/smp.tex>,
-	  <file:Documentation/smp.txt>, <file:Documentation/i386/IO-APIC.txt>,
-	  <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
-	  <http://www.linuxdoc.org/docs.html#howto>.
-
-	  If you don't know what to do here, say N.
-
-config NR_CPUS
-	int "Maximum number of CPUs (2-64)"
-	depends on SMP
-	default "64"
-	help
-	  This allows you to specify the maximum number of CPUs which this
-	  kernel will support.  The maximum supported value is 64 and the
-	  minimum value which makes sense is 2.
-
-	  This is purely to save memory - each supported CPU adds
-	  approximately sixteen kilobytes to the kernel image.
-
-config S390_SUPPORT
-	bool "Kernel support for 31 bit emulation"
-	help
-	  Select this option if you want to enable your system kernel to
-	  handle system-calls from ELF binaries for 31 bit ESA.  This option
-	  (and some other stuff like libraries and such) is needed for
-	  executing 31 bit applications.  It is safe to say "Y".
-
-config COMPAT
-	bool
-	depends on S390_SUPPORT
-	default y
-
-config BINFMT_ELF32
-	tristate "Kernel support for 31 bit ELF binaries"
-	depends on S390_SUPPORT
-	help
-	  This allows you to run 32-bit Linux/ELF binaries on your Ultra.
-	  Everybody wants this; say Y.
-
-comment "I/O subsystem configuration"
-
-config MACHCHK_WARNING
-	bool "Process warning machine checks"
-	help
-	  Select this option if you want the machine check handler on IBM S/390 or
-	  zSeries to process warning machine checks (e.g. on power failures). 
-	  If unsure, say "Y".
-
-config QDIO
-	tristate "QDIO support"
-	---help---
-	  This driver provides the Queued Direct I/O base support for the
-	  IBM S/390 (G5 and G6) and eServer zSeries (z800 and z900).
-
-	  For details please refer to the documentation provided by IBM at
-	  <http://www10.software.ibm.com/developerworks/opensource/linux390>
-
-	  This driver is also available as a module ( = code which can be
-	  inserted in and removed from the running kernel whenever you want).
-	  The module will be called qdio. If you want to compile it as a
-	  module, say M here and read <file:Documentation/modules.txt>.
-
-	  If unsure, say Y.
-
-config QDIO_PERF_STATS
-	bool "Performance statistics in /proc"
-	depends on QDIO
-	help
-	  Say Y here to get performance statistics in /proc/qdio_perf
-
-	  If unsure, say N.
-
-comment "Misc"
-
-config PREEMPT
-	bool "Preemptible Kernel"
-	help
-	  This option reduces the latency of the kernel when reacting to
-	  real-time or interactive events by allowing a low priority process to
-	  be preempted even if it is in kernel mode executing a system call.
-	  This allows applications to run more reliably even when the system is
-	  under load.
-
-	  Say N if you are unsure.
-
-config IPL
-	bool "Builtin IPL record support"
-	help
-	  If you want to use the produced kernel to IPL directly from a
-	  device, you have to merge a bootsector specific to the device
-	  into the first bytes of the kernel. You will have to select the
-	  IPL device.
-
-choice
-	prompt "IPL method generated into head.S"
-	depends on IPL
-	default IPL_TAPE
-
-config IPL_TAPE
-	bool "tape"
-	help
-	  Select "tape" if you want to IPL the image from a Tape.
-
-	  Select "vm_reader" if you are running under VM/ESA and want
-	  to IPL the image from the emulated card reader.
-
-config IPL_VM
-	bool "vm_reader"
-
-endchoice
-
-config KCORE_ELF
-	bool
-	default y
-	---help---
-	  If you enabled support for /proc file system then the file
-	  /proc/kcore will contain the kernel core image. This can be used
-	  in gdb:
-
-	  $ cd /usr/src/linux ; gdb vmlinux /proc/kcore
-
-	  You have two choices here: ELF and A.OUT. Selecting ELF will make
-	  /proc/kcore appear in ELF core format as defined by the Executable
-	  and Linking Format specification. Selecting A.OUT will choose the
-	  old "a.out" format which may be necessary for some old versions
-	  of binutils or on some architectures.
-
-	  This is especially useful if you have compiled the kernel with the
-	  "-g" option to preserve debugging information. It is mainly used
-	  for examining kernel data structures on the live kernel so if you
-	  don't understand what this means or are not a kernel hacker, just
-	  leave it at its default value ELF.
-
-config BINFMT_ELF
-	tristate "Kernel support for ELF binaries"
-	---help---
-	  ELF (Executable and Linkable Format) is a format for libraries and
-	  executables used across different architectures and operating
-	  systems. Saying Y here will enable your kernel to run ELF binaries
-	  and enlarge it by about 13 KB. ELF support under Linux has now all
-	  but replaced the traditional Linux a.out formats (QMAGIC and ZMAGIC)
-	  because it is portable (this does *not* mean that you will be able
-	  to run executables from different architectures or operating systems
-	  however) and makes building run-time libraries very easy. Many new
-	  executables are distributed solely in ELF format. You definitely
-	  want to say Y here.
-
-	  Information about ELF is contained in the ELF HOWTO available from
-	  <http://www.linuxdoc.org/docs.html#howto>.
-
-	  If you find that after upgrading from Linux kernel 1.2 and saying Y
-	  here, you still can't run any ELF binaries (they just crash), then
-	  you'll have to install the newest ELF runtime libraries, including
-	  ld.so (check the file <file:Documentation/Changes> for location and
-	  latest version).
-
-	  If you want to compile this as a module ( = code which can be
-	  inserted in and removed from the running kernel whenever you want),
-	  say M here and read <file:Documentation/modules.txt>.  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_MISC
-	tristate "Kernel support for MISC binaries"
-	---help---
-	  If you say Y here, it will be possible to plug wrapper-driven binary
-	  formats into the kernel. You will like this especially when you use
-	  programs that need an interpreter to run like Java, Python or
-	  Emacs-Lisp. It's also useful if you often run DOS executables under
-	  the Linux DOS emulator DOSEMU (read the DOSEMU-HOWTO, available from
-	  <http://www.linuxdoc.org/docs.html#howto>). Once you have
-	  registered such a binary class with the kernel, you can start one of
-	  those programs simply by typing in its name at a shell prompt; Linux
-	  will automatically feed it to the correct interpreter.
-
-	  You can do other nice things, too. Read the file
-	  <file:Documentation/binfmt_misc.txt> to learn how to use this
-	  feature, and <file:Documentation/java.txt> for information about how
-	  to include Java support.
-
-	  You must say Y to "/proc file system support" (CONFIG_PROC_FS) to
-	  use this part of the kernel.
-
-	  You may say M here for module support and later load the module when
-	  you have use for it; the module is called binfmt_misc. If you
-	  don't know what to answer at this point, say Y.
-
-config PROCESS_DEBUG
-	bool "Show crashed user process info"
-	help
-	  Say Y to print all process fault locations to the console.  This is
-	  a debugging option; you probably do not want to set it unless you
-	  are an S390 port maintainer.
-
-config PFAULT
-	bool "Pseudo page fault support"
-	help
-	  Select this option, if you want to use PFAULT pseudo page fault
-	  handling under VM. If running native or in LPAR, this option
-	  has no effect. If your VM does not support PFAULT, PAGEEX
-	  pseudo page fault handling will be used.
-	  Note that VM 4.2 supports PFAULT but has a bug in its
-	  implementation that causes some problems.
-	  Everybody who wants to run Linux under VM != VM4.2 should select
-	  this option.
-
-config SHARED_KERNEL
-	bool "VM shared kernel support"
-	help
-	  Select this option, if you want to share the text segment of the
-	  Linux kernel between different VM guests. This reduces memory
-	  usage with lots of guests but greatly increases kernel size.
-	  You should only select this option if you know what you are
-	  doing and want to exploit this feature.
-
-endmenu
-
-config PCMCIA
-	bool
-	default n
-
-menu "SCSI support"
-
-config SCSI
-	tristate "SCSI support"
-
-source "drivers/scsi/Kconfig"
-
-endmenu
-
-source "drivers/s390/Kconfig"
-
-source "net/Kconfig"
-
-source "fs/Kconfig"
-
-
-menu "Kernel hacking"
-
-config DEBUG_KERNEL
-	bool "Kernel debugging"
-	help
-	  Say Y here if you are developing drivers or trying to debug and
-	  identify kernel problems.
-
-config MAGIC_SYSRQ
-	bool "Magic SysRq key"
-	depends on DEBUG_KERNEL
-	help
-	  If you say Y here, you will have some control over the system even
-	  if the system crashes for example during kernel debugging (e.g., you
-	  will be able to flush the buffer cache to disk, reboot the system
-	  immediately or dump some status information). This is accomplished
-	  by pressing various keys while holding SysRq (Alt+PrintScreen). It
-	  also works on a serial console (on PC hardware at least), if you
-	  send a BREAK and then within 5 seconds a command keypress. The
-	  keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
-	  unless you really know what this hack does.
-
-config DEBUG_SLAB
-	bool "Debug memory allocations"
-	depends on DEBUG_KERNEL
-	help
-	  Say Y here to have the kernel do limited verification on memory
-	  allocation as well as poisoning memory on free to catch use of freed
-	  memory.
-
-config KALLSYMS
-	bool "Load all symbols for debugging/kksymoops"
-	depends on DEBUG_KERNEL
-	help
-	  Say Y here to let the kernel print out symbolic crash information and
-	  symbolic stack backtraces. This increases the size of the kernel
-	  somewhat, as all symbols have to be loaded into the kernel image.
-
-config DEBUG_SPINLOCK_SLEEP
-	bool "Sleep-inside-spinlock checking"
-	help
-	  If you say Y here, various routines which may sleep will become very
-	  noisy if they are called with a spinlock held.	
-
-endmenu
-
-source "security/Kconfig"
-
-source "crypto/Kconfig"
-
-source "lib/Kconfig"
-
diff -Nru a/arch/s390x/Makefile b/arch/s390x/Makefile
--- a/arch/s390x/Makefile	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,53 +0,0 @@
-
-# s390x/Makefile
-#
-# This file is included by the global makefile so that you can add your own
-# architecture-specific flags and dependencies. Remember to do have actions
-# for "archclean" and "archdep" for cleaning up and making dependencies for
-# this architecture
-#
-# 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) 1994 by Linus Torvalds
-#
-
-LDFLAGS		:= -m elf64_s390
-OBJCOPYFLAGS	:= -O binary
-LDFLAGS_vmlinux := -e start
-MODFLAGS += -fpic -D__PIC__
-LDFLAGS_BLOB	:= --format binary --oformat elf64-s390
-
-CFLAGS += -pipe -fno-strength-reduce -finline-limit=10000 -Wno-sign-compare
-
-head-y := arch/$(ARCH)/kernel/head.o arch/$(ARCH)/kernel/init_task.o
-
-core-y		+= arch/$(ARCH)/mm/ arch/$(ARCH)/kernel/
-libs-y		+= arch/$(ARCH)/lib/
-drivers-y	+= drivers/s390/
-
-
-makeboot =$(Q)$(MAKE) -f scripts/Makefile.build obj=arch/$(ARCH)/boot $(1)
-
-all: image listing
-
-listing image: vmlinux
-	$(call makeboot,arch/$(ARCH)/boot/$@)
-
-install: vmlinux
-	$(call makeboot, $@)
-
-archclean:
-	$(Q)$(MAKE) -f scripts/Makefile.clean obj=arch/$(ARCH)/boot
-
-
-prepare: include/asm-$(ARCH)/offsets.h
-
-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \
-				   include/config/MARKER
-
-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s
-	$(call filechk,gen-asm-offsets)
-
-CLEAN_FILES += include/asm-$(ARCH)/offsets.h
diff -Nru a/arch/s390x/boot/Makefile b/arch/s390x/boot/Makefile
--- a/arch/s390x/boot/Makefile	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,21 +0,0 @@
-#
-# Makefile for the linux s390-specific parts of the memory manager.
-#
-
-targets		:= image listing
-EXTRA_AFLAGS	:= -traditional
-
-quiet_cmd_listing = OBJDUMP $@
-      cmd_listing = $(OBJDUMP) --disassemble --disassemble-all \
-			       --disassemble-zeroes --reloc vmlinux > $@
-
-$(obj)/image: vmlinux FORCE
-	$(call if_changed,objcopy)
-
-$(obj)/listing: vmlinux FORCE
-	$(call if_changed,listing)
-
-
-install: $(CONFIGURE) $(obj)/image
-	sh -x $(obj)/install.sh $(KERNELRELEASE) $(obj)/image \
-	      System.map Kerntypes "$(INSTALL_PATH)"
diff -Nru a/arch/s390x/boot/install.sh b/arch/s390x/boot/install.sh
--- a/arch/s390x/boot/install.sh	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,38 +0,0 @@
-#!/bin/sh
-#
-# arch/s390x/boot/install.sh
-#
-# 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) 1995 by Linus Torvalds
-#
-# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
-#
-# "make install" script for s390 architecture
-#
-# Arguments:
-#   $1 - kernel version
-#   $2 - kernel image file
-#   $3 - kernel map file
-#   $4 - default install path (blank if root directory)
-#
-
-# 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
-
-if [ -f $4/vmlinuz ]; then
-	mv $4/vmlinuz $4/vmlinuz.old
-fi
-
-if [ -f $4/System.map ]; then
-	mv $4/System.map $4/System.old
-fi
-
-cat $2 > $4/vmlinuz
-cp $3 $4/System.map
diff -Nru a/arch/s390x/boot/ipldump.S b/arch/s390x/boot/ipldump.S
--- a/arch/s390x/boot/ipldump.S	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,178 +0,0 @@
-/*
- *  arch/s390/boot/ipldump.S
- *
- *  S390 version
- *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *
- *  Tape dump ipl record. Put it on a tape and ipl from it and it will
- *  write a dump of the real storage after the ipl record on that tape.
- */
-
-#include <asm/setup.h>
-#include <asm/lowcore.h>
-
-#define IPL_BS 1024
-        .org   0
-        .long  0x00080000,0x80000000+_start    # The first 24 bytes are loaded
-        .long  0x07000000,0x60000001           # by ipl to addresses 0-23.
-        .long  0x02000000,0x20000000+IPL_BS    # (a PSW and two CCWs).
-        .long  0x00000000,0x00000000
-        .long  0x00000000,0x00000000           # svc old psw
-        .long  0x00000000,0x00000000           # program check old psw
-        .long  0x00000000,0x00000000           # machine check old psw
-        .long  0x00000000,0x00000000           # io old psw
-        .long  0x00000000,0x00000000
-        .long  0x00000000,0x00000000
-        .long  0x00000000,0x00000000
-        .long  0x000a0000,0x00000058           # external new psw
-        .long  0x000a0000,0x00000060           # svc new psw
-        .long  0x000a0000,0x00000068           # program check new psw
-        .long  0x000a0000,0x00000070           # machine check new psw
-        .long  0x00080000,0x80000000+.Lioint   # io new psw
-
-        .org   0x100
-        .globl _start
-_start:
-	l     %r1,0xb8                         # load ipl subchannel number
-#
-# find out memory size
-#
-        mvc   104(8),.Lpcmem0            # setup program check handler
-        slr   %r3,%r3
-        lhi   %r2,1
-        sll   %r2,20
-.Lloop0:
-        l     %r0,0(%r3)                 # test page
-        ar    %r3,%r2                    # add 1M
-        jnm   .Lloop0                    # r1 < 0x80000000 -> loop
-.Lchkmem0:
-        n     %r3,.L4malign0             # align to multiples of 4M
-        st    %r3,.Lmemsize              # store memory size
-.Lmemok:
-
-#
-# first write a tape mark
-#
-        bras  %r14,.Ltapemark
-#
-# write real storage to tape
-#	
- 	slr   %r2,%r2                          # start at address 0
-        bras  %r14,.Lwriter                    # load ramdisk
-#
-# write another tape mark
-#
-        bras  %r14,.Ltapemark
-#
-# everything written, stop processor
-#
-        lpsw  .Lstopped
-#
-# subroutine for writing to tape
-# Paramters:	
-#  R1 = device number
-#  R2 = start address
-#  R3 = length
-.Lwriter:	
-        st    %r14,.Lldret
-        la    %r12,.Lorbread                   # r12 = address of orb 
-	la    %r5,.Lirb                        # r5 = address of irb
-        st    %r2,.Lccwwrite+4                 # initialize CCW data addresses
-        lctl  %c6,%c6,.Lcr6               
-        slr   %r2,%r2
-.Lldlp:
-        lhi   %r6,3                            # 3 retries
-.Lssch:
-        ssch  0(%r12)                          # write chunk of IPL_BS bytes
-        jnz   .Llderr
-.Lw4end:
-        bras  %r14,.Lwait4io
-        tm    8(%r5),0x82                      # do we have a problem ?
-        jnz   .Lrecov
-        l     %r0,.Lccwwrite+4                 # update CCW data addresses
-        ahi   %r0,IPL_BS
-        st    %r0,.Lccwwrite+4
-        clr   %r0,%r3                          # enough ?
-        jl    .Lldlp
-.Ldone:
-        l     %r14,.Lldret
-        br    %r14                             # r2 contains the total size
-.Lrecov:
-        bras  %r14,.Lsense                     # do the sensing
-        brct  %r6,.Lssch                       # dec. retry count & branch
-        j     .Llderr
-.Ltapemark:
-        st    %r14,.Lldret
-        la    %r12,.Lorbmark                   # r12 = address of orb
-        la    %r5,.Lirb                        # r5 = address of irb
-        lctl  %c6,%c6,.Lcr6
-        ssch  0(%r12)                          # write a tape mark
-        jnz   .Llderr
-        bras  %r14,.Lwait4io
-        l     %r14,.Lldret
-        br    %r14
-#
-# Sense subroutine
-#
-.Lsense:
-        st    %r14,.Lsnsret
-        la    %r7,.Lorbsense              
-        ssch  0(%r7)                           # start sense command
-        jnz   .Llderr
-        bras  %r14,.Lwait4io
-        l     %r14,.Lsnsret
-        tm    8(%r5),0x82                      # do we have a problem ?
-        jnz   .Llderr
-        br    %r14
-#
-# Wait for interrupt subroutine
-#
-.Lwait4io:
-        lpsw  .Lwaitpsw                 
-.Lioint:
-        c     %r1,0xb8                         # compare subchannel number
-        jne   .Lwait4io
-        tsch  0(%r5)
-        slr   %r0,%r0
-        tm    8(%r5),0x82                      # do we have a problem ?
-        jnz   .Lwtexit
-        tm    8(%r5),0x04                      # got device end ?
-        jz    .Lwait4io
-.Lwtexit:
-        br    %r14
-.Llderr:
-        lpsw  .Lcrash              
-
-        .align 8
-.Lorbread:
-	.long  0x00000000,0x0080ff00,.Lccwwrite
-        .align 8
-.Lorbsense:
-        .long  0x00000000,0x0080ff00,.Lccwsense
-        .align 8
-.Lorbmark:
-        .long  0x00000000,0x0080ff00,.Lccwmark
-        .align 8
-.Lccwwrite:
-        .long  0x01200000+IPL_BS,0x00000000
-.Lccwsense:
-        .long  0x04200001,0x00000000
-.Lccwmark:
-        .long  0x1f200001,0x00000000
-.Lwaitpsw:
-	.long  0x020a0000,0x80000000+.Lioint
-
-.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-.Lcr6:  .long  0xff000000
-        .align 8
-.Lcrash:.long  0x000a0000,0x00000000
-.Lstopped: .long 0x000a0000,0x00001234
-.Lpcmem0:.long  0x00080000,0x80000000 + .Lchkmem0
-.L4malign0:.long 0xffc00000
-.Lmemsize:.long 0
-.Lldret:.long  0
-.Lsnsret: .long 0
-
-         .org IPL_BS
-
diff -Nru a/arch/s390x/boot/ipleckd.S b/arch/s390x/boot/ipleckd.S
--- a/arch/s390x/boot/ipleckd.S	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,303 +0,0 @@
-#
-#  arch/s390/boot/ipleckd.S
-#    IPL record for 3380/3390 DASD
-#
-#  S390 version
-#    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
-#    Author(s): Holger Smolinski <Holger.Smolinski@de.ibm.com>
-#
-#
-# FIXME:	 should use the countarea to determine the blocksize
-# FIXME:	 should insert zeroes into memory when filling holes
-# FIXME:	 calculate blkpertrack from rdc data and blksize
-
-# change 09/20/00       removed obsolete store of ipldevice to textesegment
-
-# Usage of registers
-# r1:	ipl subchannel ( general use, dont overload without save/restore !)
-# r10:
-# r13:	base register 	index to 0x0000
-# r14:	callers address
-# r15:	temporary save register (we have no stack!)
-
-# storage layout:
-
-#include <asm/lowcore.h>
-	
-	.org 0
-.psw:	.long 0x00080000,0x80000000+_start
-.ccw1:	.long 0x06000000,0x00001000     # Re-Read enough of bootsector to start
-.ccw2:	.long 0x00000000,0x00000000	# read countarea of record 1 to s/w.
-
-	.org 0x58
-.Lextn:	.long	0x000a0000,0x00000000+.Lextn
-.Lsvcn:	.long	0x000a0000,0x00000000+.Lsvcn
-.Lprgn:	.long	0x00080000,0x00000000+.Lecs
-.Lmcn:	.long	0x000a0000,0x00000000+.Lmcn
-.Lion:	.long   0x00080000,0x80000000+.Lionewaddr
-
-	.org 0xe0
-.Llstad:.long 	0x00000000,0x00000000	# sectorno + ct of bootlist
-
-	.org 0xf0			# Lets start now...
-_start: .globl _start
-	l  	%r1,__LC_SUBCHANNEL_ID	# get IPL-subchannel from lowcore
-	st	%r1,__LC_IPLDEV         # keep it for reipl
-	stsch	.Lrdcdata
-	oi      .Lrdcdata+5,0x84        # enable ssch and multipath mode
-.Lecs:  xi	.Lrdcdata+27,0x01	# enable concurrent sense
-	msch	.Lrdcdata	
-        xi      .Lprgn,6                # restore Wait and d/a bit in PCnew PSW
-	l	%r2,.Lparm
-	mvc     0x0(8,%r2),.Lnull       # set parmarea to null
-	lctl	%c6,%c6,.Lc6     	# enable all interrupts
-.Lrdc:					# read device characteristics
-	la	%r6,.Lrdcccw     
-	st      %r6,.Lorb+8		# store cp-address to orb
-	bras    %r15,.Lssch		# start I/O
-	oi	.Llodata+1,0x80
-	lh	%r5,.Lcountarea+6	# init r5 from countarea
-	stcm	%r5,3,.Lrdccw+2		# and store into rd template *FIXME*
-	stcm	%r5,3,.Llodata+14	# and store into lodata *FIXME*
-.Lbootlist:	
-	l	%r2,.Llstad	
-	l	%r3,.Lblklst     
-	lhi	%r4,1
-	bras	%r14,.Lreadblks
-.Lloader:	
-	l	%r10,.Lblklst     	# r10 is index to bootlist
-	lhi	%r5,4			# r5:	skip 4 blocks = firstpage....
-.Lkloop:
-	clc	.Lnull(8),0(%r10)	# test blocklist	
-	jz	.Lchkparm		# end of list?
-	l	%r2,0(%r10)		# get startblock to r2
-	slr	%r4,%r4			# erase r4
-	icm	%r4,1,7(%r10)		# get blockcount
-	slr	%r3,%r3			# get address to r3
-	icm 	%r3,0xe,4(%r10)
-	chi	%r5,0			# still blocks to skip?
-	jz	.Ldoread		# no: start reading
-	cr	%r5,%r4			# #skipblocks >= blockct?
-	jm	.L007			# no: skip the blocks one by one
-.L006:	
-	sr	%r5,%r4			# decrease number of blocks to skip
-	j	.Lkcont			# advance to next entry
-.L007:	
-	ahi	%r2,1			# skip 1 block...
-	bctr    %r4,0                   # update blockct
-	ah	%r3,.Lcountarea+6       # increment address
-	bct	%r5,.L007		# 4 blocks skipped?
-.Ldoread:
-	ltr	%r2,%r2			# test startblock
-	jz	.Lzeroes		# startblocks is zero (hole)
-.Ldiskread:	
-	bras	%r14,.Lreadblks
-	j	.Lkcont
-.Lzeroes:
-	lr	%r2,%r3
-.L001:	slr	%r3,%r3
-	icm	%r3,3,.Lcountarea+6     # get blocksize
-	slr	%r5,%r5			# no bytes to move
-.L008:	mvcle	%r2,%r4,0   		# fill zeroes to storage
-	jo	.L008			# until block is filled
-	brct	%r4,.L001   		# skip to next block
-.Lkcont:	
-	ahi	%r10,8
-	j	.Lkloop
-.Lchkparm:
-	lm	%r3,%r4,.Lstart         # load .Lstart and .Lparm
-	clc	0x0(4,%r4),.Lnull     
-	je	.Lrunkern
-	mvc	0x480(128,%r3),0(%r4)	# move 1k-0x80 to parmarea
-	mvc	0x500(256,%r3),0x80(%r4)
-	mvc	0x600(256,%r3),0x180(%r4)
-	mvc	0x700(256,%r3),0x280(%r4)
-.Lrunkern:
-#	lhi	%r2,17
-#	sll	%r2,12
-#	st	%r1,0xc6c(%r2)		# store iplsubchannel to lowcore
-#	st	%r1,0xc6c		# store iplsubchannel to lowcore
-	br	%r3
-# This function does the start IO
-# r2:	number of first block to read ( input by caller )
-# r3:	address to read data to ( input by caller )
-# r4:	number of blocks to read ( input by caller )
-# r5:	destroyed
-# r6:	blocks per track ( input by caller )
-# r7:	number of heads 
-# r8:	
-# r9:	
-# r10:	
-# r11:	temporary register
-# r12:	local use for base address
-# r13:	base address for module
-# r14:	address of caller for subroutine
-# r15:	temporary save register (since we have no stack)
-.Lreadblks:
-	la	%r12,.Ldeccw     
-	st	%r12,8+.Lorb		# store cpaddr to orb
-	ahi	%r12,0x10		# increment r12 to point to rdccw
-	oi	1(%r12),0x40		# set CC in rd template
-	# first setup the read CCWs
-	lr	%r15,%r4		# save number or blocks
-	slr	%r7,%r7
-	icm	%r7,3,.Lrdcdata+14      # load heads to r7
-	lhi     %r6,9
-	clc     .Lrdcdata+3(2),.L9345
-	je	.L011
-	lhi	%r6,10
-	clc	.Lrdcdata+3(2),.L3380
-	je	.L011
-	lhi	%r6,12
-	clc	.Lrdcdata+3(2),.L3390     
-	je	.L011			
-        bras 	%r14,.Ldisab
-.L011:	
-	# loop for nbl times
-.Lrdloop:	
-	mvc	0(8,%r12),.Lrdccw     	# copy template to this ccw
-	st	%r3,4(%r12)		# store target address to this ccw
-	bct	%r4,.L005		# decrement no of blks still to do
-	ni	1(%r12),0x3f		# delete CC from last ccw
-	lr	%r4,%r15		# restore number of blocks
-	# read CCWs are setup now		
-	stcm	%r4,3,.Llodata+2     	# store blockno to lodata clears r4
-	ar	%r4,%r2			# r4 (clear): ebl = blk + nbl
-	bctr    %r4,0			# decrement r4 ( last blk touched 
-	srda	%r2,32			# trk = blk / bpt, bot = blk % bpt 
-	dr	%r2,%r6			# r3: trk, r2: bot
-	ahi	%r2,1			# bot++ ( we start counting at 1 )
-	stcm	%r2,1,.Llodata+12     	# store bot to lodata
-	xr 	%r2,%r2			# cy  = trk / heads, hd  = trk % heads
-	dr	%r2,%r7			# r3: cy, r2: hd
-	sll	%r3,16			# combine to CCHH in r3
-	or	%r3,%r2
-	st	%r3,.Ldedata+8     	# store cchh to dedata	
-	st	%r3,.Llodata+4     	# store cchh to lodata	
-	st	%r3,.Llodata+8     	# store cchh to lodata	
-	lr	%r15,%r5		# save r5
-	srda	%r4,32			# tr2 = ebl / bpt
-	dr	%r4,%r6			# r5: tr2, r4: bot2
-	xr 	%r4,%r4			# cy2 = tr2 / heads, hd2 = hd2 % heads
-	dr	%r4,%r7			# r5: cy2, r4: hd2 
-	stcm	%r5,3,.Ldedata+12     	# store cy2,hd2 to dedata
-	stcm	%r4,3,.Ldedata+14     	# store cy2,hd2 to dedata
-	lr	%r5,%r15		# restore r5
-	# CCWs are setup now, arent they?
-	bras	%r15,.Lssch		# start I/O
-	br	%r14			# return to caller
-.L005:	
-	ah 	%r3,.Lcountarea+6     	# add blocksize to target address
-	ahi	%r12,8			# add sizeof(ccw) to base address
-	j	.Lrdloop
-# end of function
-# This function does the start IO
-# r1:	Subchannel number
-# r8:	ORB address
-# r9:	IRB address
-.Lssch:
-	lhi     %r13,10			# initialize retries
-.L012:	
-	ssch	.Lorb			# start I/O
-	jz	.Ltpi			# ok?
-	bras	%r14,.Ldisab		# error
-.Ltpi:	
-	lpsw	.Lwaitpsw     		# load wait-PSW
-.Lionewaddr:	
-	c	%r1,0xb8     		# compare to ipl subhchannel
-	jnz	.Ltpi			# not equal: loop
-	clc	0xbc(4),.Lorb 		# cross check the intparm
-	jnz	.Ltpi               	# not equal:	loop 
-	tsch    .Lirb			# get status
-	tm	.Lirb+9,0xff		# channel status ?
-	jz	.L003			# CS == 0x00
-	bras	%r14,.Ldisab		# error
-.L003:
-	tm	.Lirb+8,0xf3		# DS different from CE/DE
-	jz	.L004			# ok ?
-	bct	%r13,.L012		# retries <= 5 ?
-	bras	%r14,.Ldisab		# error
-.L004:
-	tm	.Lirb+8,0x04		# DE set?
-	jz	.Ltpi			# DE not set, loop
-.Lsschend:
-	br	%r15			# return to caller
-# end of function
-# In case of error goto disabled wait with %r14 containing the caller
-.Ldisab:
-	st	%r14,.Ldisabpsw+4     
-	lpsw	.Ldisabpsw     
-
-# FIXME pre-initialized data should be listed first
-# NULLed storage can be taken from anywhere ;) 
-.Lblklst:	
-	.long   0x00002000     
-	.align 8
-.Ldisabpsw: 
-	.long 0x000a0000,0x00000000
-.Lwaitpsw:
-	.long 0x020a0000,0x00000000+.Ltpi
-.Lorb:	
-	.long 0x0049504c,0x0080ff00	# intparm is " IPL"
-.Lc6:	.long 0xff000000
-.Lstart:
-	.long	0x00010000              # do not separate .Lstart and .Lparm
-.Lparm:	
-	.long	0x00008000              # they are loaded with a LM
-.L3390:
-	.word 	0x3390
-.L9345:
-	.word	0x9345
-.L3380:
-	.word	0x3380
-.Lnull:	
-	.long 0x00000000,0x00000000
-	.align 4
-.Lrdcdata:
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-.Lirb:
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-	.long 0x00000000,0x00000000
-.Lcountarea:	
-	.word 0x0000			# cyl;
-	.word 0x0000			# head;
-	.byte 0x00			# record;
-	.byte 0x00			# key length;
-	.word 0x0000			# data length == blocksize;
-.Ldedata:
-	.long 0x40c00000,0x00000000
-	.long 0x00000000,0x00000000
-.Llodata:
-	.long 0x06000001,0x00000000
-	.long 0x00000000,0x01000000
-	.long 0x12345678
-	.org 0x7c8
-.Lrdcccw:				# CCW read device characteristics
-	.long 0x64400040,0x00000000+.Lrdcdata
-	.long 0x63400010,0x00000000+.Ldedata
-	.long 0x47400010,0x00000000+.Llodata
-	.long 0x12000008,0x00000000+.Lcountarea
-.Ldeccw:
-	.long 0x63400010,0x00000000+.Ldedata
-.Lloccw:
-	.long 0x47400010,0x00000000+.Llodata
-.Lrdccw:	
-	.long 0x86400000,0x00000000
-	.org 0x800
-# end of pre initialized data is here CCWarea follows
-# from here we load 1k blocklist 
-# end of function
-
diff -Nru a/arch/s390x/boot/iplfba.S b/arch/s390x/boot/iplfba.S
--- a/arch/s390x/boot/iplfba.S	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,131 +0,0 @@
-#
-#  Ipl block for fba devices
-#    Copyright (C) 1998 IBM Corporation
-#    Author(s): Martin Schwidefsky
-#
-#  startup for ipl at address 0
-#  start with restart
-
-# The first 24 byes are loaded by ipl to addresses 0-23 (a PSW and two CCWs).
-# The CCWs on 8-23 are used as a continuation of the implicit ipl channel
-# program. The fba ipl loader only uses the CCW on 8-15 to load the first 512
-# byte block to location 0-511 (the reading starts again at block 0, byte 0).
-# The second CCW is used to store the location of the load list.
-        .org   0
-        .long  0x00080000,0x80000000+_start    # The first 24 byte are loaded
-        .long  0x02000000,0x20000200           # by ipl to addresses 0-23.
-        .long  0x00000001,0x00000001           # (PSW, one CCW & loadlist info).
-
-        .globl _start
-_start:
-	basr  %r13,0
-.LPG0:	
-	l     %r1,0xb8                         # load ipl subchannel number
-        lhi   %r2,0x200                        # location for the loadlist
-        lm    %r3,%r4,0x10                     # blocknr and length of loadlist
-        bras  %r14,.Lloader                    # load loadlist
-
-        lhi   %r11,0x400
-        lhi   %r12,0x200                       # load address of loadlist
-        l     %r3,0(%r12)                      # get first block number
-        l     %r4,4(%r12)                      # get first block count
-        la    %r12,8(%r12)
-        j     .Llistloop
-        .org  0x50
-.Llistloop:
-        lr    %r2,%r11                         # load address
-        lr    %r5,%r4                          # block count
-        mhi   %r5,512
-        la    %r11,0(%r5,%r11)                 # update load address
-        bras  %r14,.Lloader                    # load chunk of the image
-        l     %r3,0(%r12)                      # get next block number
-        icm   %r4,15,4(%r12)                   # get next block count
-        la    %r12,8(%r12)
-        jnz   .Llistloop
-
-#
-# everything loaded, go for it
-#
-        l     %r1,.Lstart-.LPG0(%r13)
-	br    %r1
-
-#
-# subroutine for loading a sequence of block from fba
-# %r2: load address (24 bit address)
-# %r3: number of first block (unsigned long)
-# %r4: number of blocks to load (unsigned short)
-#
-        .org  0xC0
-.Lloader:
-        la    %r5,.Llo-.LPG0(%r13)
-        sth   %r4,2(%r5)                       # initialize block count
-        st    %r3,4(%r5)                       # initialize block number
-        la    %r5,.Lccws-.LPG0(%r13)
-        mhi   %r4,512
-        sth   %r4,22(%r5)                      # initialize byte count
-	icm   %r2,8,16(%r5)
-        st    %r2,16(%r5)                      # initialize CCW data address
-
-        slr   %r2,%r2
-        la    %r3,.Lorb-.LPG0(%r13)            # r2 = address of orb into r2
-        la    %r4,.Ltinfo-.LPG0(%r13)          # r3 = address of tpi info block
-        la    %r5,.Lirb-.LPG0(%r13)            # r4 = address of irb
-
-        lctl  %c6,%c6,.Lc6-.LPG0(%r13)
-.Lldlp:
-        ssch  0(%r3)                           # read blocks
-.Ltpi:
-        tpi   0(%r4)                           # test pending interrupt
-        jz    .Ltpi
-        c     %r1,0(%r4)                       # compare subchannel number
-        jne   .Ltpi
-        tsch  0(%r5)
-        slr   %r0,%r0
-        tm    8(%r5),0x82                      # do we have a problem ?
-        jnz   .Ldwpsw
-        tm    8(%r5),0x04                      # got device end ?
-        jz    .Ltpi
-.Lexit:
-        br    %r14
-
-        .align 8
-.Ldwpsw:.long  0x000a0000,0x00000000
-.Lorb:	.long  0x00000000,0x0000ff00,.Lccws
-.Ltinfo:.long  0
-.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-.Lc6:   .long  0xff000000
-.Lloadp:.long  0,0
-.Lparm:	.long  0x10400
-.Lstart:.long  0x10000
-        .align 8
-.Lccws: .long  0x63000000+.Lde,0x60000010      # define extent
-        .long  0x43000000+.Llo,0x60000008      # locate
-# offset 1 in read CCW: data address (24 bit)
-# offset 6 in read CCW: number of bytes (16 bit)
-        .long  0x42000000,0x20000000           # read
-.Lde:   .long  0x40000200,0x00000000
-        .long  0x00000000,0x00001000
-# offset 2 in .Llo: block count (unsigned short)
-# offset 4 in .Llo: block number (unsigned long)
-.Llo:   .long  0x06000000,0x00000000
-
-        .org   0x200
-        .long  0x00000002,0x0000007f
-        .long  0x00000081,0x0000007f
-        .long  0x00000100,0x0000007f
-        .long  0x0000017f,0x0000007f
-        .long  0x000001fe,0x0000007f
-        .long  0x0000027d,0x0000007f
-        .long  0x000002fc,0x0000007f
-        .long  0x0000037b,0x0000007f
-        .long  0x000003fa,0x0000007f
-        .long  0x00000479,0x0000007f
-        .long  0x000004f8,0x0000007f
-        .long  0x00000577,0x0000007f
-        .long  0x000005f6,0x0000007f
-        .long  0x00000675,0x0000007f
-        .long  0x000006f4,0x0000007f
-        .long  0x00000773,0x0000003f
-        .long  0x00000000,0x00000000
-        .org   0x400
-
diff -Nru a/arch/s390x/defconfig b/arch/s390x/defconfig
--- a/arch/s390x/defconfig	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,370 +0,0 @@
-#
-# Automatically generated make config: don't edit
-#
-CONFIG_MMU=y
-CONFIG_SWAP=y
-CONFIG_RWSEM_XCHGADD_ALGORITHM=y
-CONFIG_ARCH_S390=y
-CONFIG_ARCH_S390X=y
-
-#
-# Code maturity level options
-#
-CONFIG_EXPERIMENTAL=y
-
-#
-# General setup
-#
-CONFIG_SYSVIPC=y
-# CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
-CONFIG_LOG_BUF_SHIFT=17
-
-#
-# Loadable module support
-#
-CONFIG_MODULES=y
-# CONFIG_MODULE_UNLOAD is not set
-CONFIG_OBSOLETE_MODPARM=y
-# CONFIG_MODVERSIONS is not set
-CONFIG_KMOD=y
-
-#
-# Base setup
-#
-
-#
-# Processor type and features
-#
-CONFIG_SMP=y
-CONFIG_NR_CPUS=64
-# CONFIG_S390_SUPPORT is not set
-
-#
-# I/O subsystem configuration
-#
-CONFIG_MACHCHK_WARNING=y
-CONFIG_QDIO=y
-# CONFIG_QDIO_PERF_STATS is not set
-
-#
-# Misc
-#
-# CONFIG_PREEMPT is not set
-CONFIG_IPL=y
-# CONFIG_IPL_TAPE is not set
-CONFIG_IPL_VM=y
-CONFIG_KCORE_ELF=y
-CONFIG_BINFMT_ELF=y
-CONFIG_BINFMT_MISC=m
-# CONFIG_PROCESS_DEBUG is not set
-CONFIG_PFAULT=y
-# CONFIG_SHARED_KERNEL is not set
-# CONFIG_PCMCIA is not set
-
-#
-# SCSI support
-#
-# CONFIG_SCSI is not set
-CONFIG_CCW=y
-
-#
-# Block device drivers
-#
-CONFIG_BLK_DEV_LOOP=m
-CONFIG_BLK_DEV_NBD=m
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_BLK_DEV_XPRAM=m
-
-#
-# S/390 block device drivers
-#
-CONFIG_DASD=y
-# CONFIG_DASD_PROFILE is not set
-CONFIG_DASD_ECKD=y
-CONFIG_DASD_FBA=y
-# CONFIG_DASD_DIAG is not set
-
-#
-# Multi-device support (RAID and LVM)
-#
-CONFIG_MD=y
-CONFIG_BLK_DEV_MD=y
-CONFIG_MD_LINEAR=m
-CONFIG_MD_RAID0=m
-CONFIG_MD_RAID1=m
-CONFIG_MD_RAID5=m
-CONFIG_MD_MULTIPATH=m
-# CONFIG_BLK_DEV_DM is not set
-
-#
-# Character device drivers
-#
-CONFIG_UNIX98_PTYS=y
-CONFIG_UNIX98_PTY_COUNT=2048
-
-#
-# S/390 character device drivers
-#
-# CONFIG_TN3270 is not set
-CONFIG_TN3215=y
-CONFIG_TN3215_CONSOLE=y
-CONFIG_CCW_CONSOLE=y
-CONFIG_SCLP=y
-CONFIG_SCLP_TTY=y
-CONFIG_SCLP_CONSOLE=y
-CONFIG_SCLP_CPI=m
-CONFIG_S390_TAPE=m
-
-#
-# S/390 tape interface support
-#
-CONFIG_S390_TAPE_BLOCK=y
-
-#
-# S/390 tape hardware support
-#
-CONFIG_S390_TAPE_34XX=m
-CONFIG_HOTPLUG=y
-
-#
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-# CONFIG_NETLINK_DEV is not set
-# CONFIG_NETFILTER is not set
-# CONFIG_FILTER is not set
-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 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_XFRM_USER is not set
-CONFIG_IPV6=m
-
-#
-# SCTP Configuration (EXPERIMENTAL)
-#
-CONFIG_IPV6_SCTP__=m
-# 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_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=y
-CONFIG_NET_SCH_CBQ=m
-# CONFIG_NET_SCH_HTB is not set
-CONFIG_NET_SCH_CSZ=m
-CONFIG_NET_SCH_PRIO=m
-CONFIG_NET_SCH_RED=m
-CONFIG_NET_SCH_SFQ=m
-CONFIG_NET_SCH_TEQL=m
-CONFIG_NET_SCH_TBF=m
-CONFIG_NET_SCH_GRED=m
-CONFIG_NET_SCH_DSMARK=m
-CONFIG_NET_QOS=y
-CONFIG_NET_ESTIMATOR=y
-CONFIG_NET_CLS=y
-CONFIG_NET_CLS_TCINDEX=m
-CONFIG_NET_CLS_ROUTE4=m
-CONFIG_NET_CLS_ROUTE=y
-CONFIG_NET_CLS_FW=m
-CONFIG_NET_CLS_U32=m
-CONFIG_NET_CLS_RSVP=m
-CONFIG_NET_CLS_RSVP6=m
-CONFIG_NET_CLS_POLICE=y
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-CONFIG_EQUALIZER=m
-CONFIG_TUN=m
-# CONFIG_ETHERTAP is not set
-
-#
-# Ethernet (10 or 100Mbit)
-#
-CONFIG_NET_ETHERNET=y
-# CONFIG_MII is not set
-
-#
-# Ethernet (1000 Mbit)
-#
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
-
-#
-# Wireless LAN (non-hamradio)
-#
-# CONFIG_NET_RADIO is not set
-
-#
-# Token Ring devices (depends on LLC=y)
-#
-# CONFIG_SHAPER is not set
-
-#
-# Wan interfaces
-#
-# CONFIG_WAN is not set
-
-#
-# S/390 network device drivers
-#
-CONFIG_LCS=m
-CONFIG_CTC=m
-CONFIG_IUCV=m
-CONFIG_CCWGROUP=m
-
-#
-# File systems
-#
-CONFIG_QUOTA=y
-# CONFIG_QFMT_V1 is not set
-# CONFIG_QFMT_V2 is not set
-CONFIG_QUOTACTL=y
-# 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=y
-# CONFIG_EXT3_FS_POSIX_ACL 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 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_NFSD=y
-CONFIG_NFSD_V3=y
-# CONFIG_NFSD_V4 is not set
-# CONFIG_NFSD_TCP is not set
-CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_GSS is not set
-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
-CONFIG_FS_MBCACHE=y
-
-#
-# 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_IBM_PARTITION=y
-# CONFIG_MAC_PARTITION is not set
-# CONFIG_MSDOS_PARTITION is not set
-# CONFIG_LDM_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
-
-#
-# Kernel hacking
-#
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_KALLSYMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-
-#
-# Security options
-#
-# CONFIG_SECURITY 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_TEST is not set
-
-#
-# Library routines
-#
-# CONFIG_CRC32 is not set
diff -Nru a/arch/s390x/kernel/Makefile b/arch/s390x/kernel/Makefile
--- a/arch/s390x/kernel/Makefile	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,27 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-extra-y		:= head.o init_task.o
-EXTRA_AFLAGS	:= -traditional
-
-obj-y		:= entry.o bitmap.o traps.o time.o process.o \
-		   setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \
-		   semaphore.o reipl.o s390_ext.o debug.o
-
-obj-$(CONFIG_MODULES)		+= s390_ksyms.o module.o
-obj-$(CONFIG_SMP)		+= smp.o
-
-#
-# Kernel debugging
-#
-obj-$(CONFIG_REMOTE_DEBUG)	+= gdb-stub.o #gdb-low.o 
-
-obj-$(CONFIG_S390_SUPPORT)	+= linux32.o signal32.o ioctl32.o wrapper32.o \
-					 exec32.o exec_domain32.o
-obj-$(CONFIG_BINFMT_ELF32)	+= binfmt_elf32.o
-
-#
-# This is just to get the dependencies...
-#
-binfmt_elf32.o:	$(TOPDIR)/fs/binfmt_elf.c
diff -Nru a/arch/s390x/kernel/asm-offsets.c b/arch/s390x/kernel/asm-offsets.c
--- a/arch/s390x/kernel/asm-offsets.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,31 +0,0 @@
-/*
- * Generate definitions needed by assembly language modules.
- * This code generates raw asm output which is post-processed to extract
- * and format the required data.
- */
-
-#include <linux/config.h>
-#include <linux/sched.h>
-
-/* Use marker if you need to separate the values later */
-
-#define DEFINE(sym, val, marker) \
-	asm volatile("\n->" #sym " %0 " #val " " #marker : : "i" (val))
-
-#define BLANK() asm volatile("\n->" : : )
-
-int main(void)
-{
-	DEFINE(__THREAD_info, offsetof(struct task_struct, thread_info),);
-	DEFINE(__THREAD_ar2, offsetof(struct task_struct, thread.ar2),);
-	DEFINE(__THREAD_ar4, offsetof(struct task_struct, thread.ar4),);
-	DEFINE(__THREAD_ksp, offsetof(struct task_struct, thread.ksp),);
-	DEFINE(__THREAD_per, offsetof(struct task_struct, thread.per_info),);
-	BLANK();
-	DEFINE(__TI_task, offsetof(struct thread_info, task),);
-	DEFINE(__TI_domain, offsetof(struct thread_info, exec_domain),);
-	DEFINE(__TI_flags, offsetof(struct thread_info, flags),);
-	DEFINE(__TI_cpu, offsetof(struct thread_info, cpu),);
-	DEFINE(__TI_precount, offsetof(struct thread_info, preempt_count),);
-	return 0;
-}
diff -Nru a/arch/s390x/kernel/binfmt_elf32.c b/arch/s390x/kernel/binfmt_elf32.c
--- a/arch/s390x/kernel/binfmt_elf32.c	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,214 +0,0 @@
-/*
- * Support for 32-bit Linux for S390 ELF binaries.
- *
- * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- * Author(s): Gerhard Tonn (ton@de.ibm.com)
- *
- * Heavily inspired by the 32-bit Sparc compat code which is
- * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (davem@redhat.com)
- * Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek   (jj@ultra.linux.cz)
- */
-
-#define __ASMS390_ELF_H
-
-#include <linux/time.h>
-
-/*
- * These are used to set parameters in the core dumps.
- */
-#define ELF_CLASS	ELFCLASS32
-#define ELF_DATA	ELFDATA2MSB
-#define ELF_ARCH	EM_S390
-
-/*
- * This is used to ensure we don't load something for the wrong architecture.
- */
-#define elf_check_arch(x) \
-	(((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \
-         && (x)->e_ident[EI_CLASS] == ELF_CLASS)
-
-/* ELF register definitions */
-#define NUM_GPRS      16
-#define NUM_FPRS      16
-#define NUM_ACRS      16    
-
-#define TASK31_SIZE		(0x80000000UL)
-
-/* For SVR4/S390 the function pointer to be registered with `atexit` is
-   passed in R14. */
-#define ELF_PLAT_INIT(_r, load_addr) \
-	do { \
-	_r->gprs[14] = 0; \
-	set_thread_flag(TIF_31BIT); \
-	} while(0)
-
-#define USE_ELF_CORE_DUMP
-#define ELF_EXEC_PAGESIZE       4096
-
-/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
-   use of this is to invoke "./ld.so someprog" to test out a new version of
-   the loader.  We need to make sure that it is out of the way of the program
-   that it will "exec", and that there is sufficient room for the brk.  */
-
-#define ELF_ET_DYN_BASE         (TASK31_SIZE / 3 * 2)
-
-/* Wow, the "main" arch needs arch dependent functions too.. :) */
-
-/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is
-   now struct_user_regs, they are different) */
-
-#define ELF_CORE_COPY_REGS(pr_reg, regs)        \
-	{ \
-	int i; \
-	memcpy(&pr_reg.psw.mask, &regs->psw.mask, 4); \
-	memcpy(&pr_reg.psw.addr, ((char*)&regs->psw.addr)+4, 4); \
-	for(i=0; i<NUM_GPRS; i++) \
-		pr_reg.gprs[i] = regs->gprs[i]; \
-	for(i=0; i<NUM_ACRS; i++) \
-		pr_reg.acrs[i] = regs->acrs[i]; \
-	pr_reg.orig_gpr2 = regs->orig_gpr2; \
-	}
-
-
-
-/* This yields a mask that user programs can use to figure out what
-   instruction set this CPU supports. */
-
-#define ELF_HWCAP (0)
-
-/* This yields a string that ld.so will use to load implementation
-   specific libraries for optimization.  This is more specific in
-   intent than poking at uname or /proc/cpuinfo.
-
-   For the moment, we have only optimizations for the Intel generations,
-   but that could change... */
-
-#define ELF_PLATFORM (NULL)
-
-#define SET_PERSONALITY(ex, ibcs2)			\
-do {							\
-	if (ibcs2)                                      \
-		set_personality(PER_SVR4);              \
-	else if (current->personality != PER_LINUX32)   \
-		set_personality(PER_LINUX);             \
-} while (0)
-
-#include "linux32.h"
-
-typedef _s390_fp_regs32 elf_fpregset_t;
-
-typedef struct
-{
-	
-	_psw_t32	psw;
-	__u32		gprs[__NUM_GPRS]; 
-	__u32		acrs[__NUM_ACRS]; 
-	__u32		orig_gpr2;
-} s390_regs32;
-typedef s390_regs32 elf_gregset_t;
-
-#include <asm/processor.h>
-#include <linux/module.h>
-#include <linux/config.h>
-#include <linux/elfcore.h>
-#include <linux/binfmts.h>
-#include <linux/compat.h>
-
-int setup_arg_pages32(struct linux_binprm *bprm);
-
-#define elf_prstatus elf_prstatus32
-struct elf_prstatus32
-{
-	struct elf_siginfo pr_info;	/* Info associated with signal */
-	short	pr_cursig;		/* Current signal */
-	u32	pr_sigpend;	/* Set of pending signals */
-	u32	pr_sighold;	/* Set of held signals */
-	pid_t	pr_pid;
-	pid_t	pr_ppid;
-	pid_t	pr_pgrp;
-	pid_t	pr_sid;
-	struct compat_timeval pr_utime;	/* User time */
-	struct compat_timeval pr_stime;	/* System time */
-	struct compat_timeval pr_cutime;	/* Cumulative user time */
-	struct compat_timeval pr_cstime;	/* Cumulative system time */
-	elf_gregset_t pr_reg;	/* GP registers */
-	int pr_fpvalid;		/* True if math co-processor being used.  */
-};
-
-#define elf_prpsinfo elf_prpsinfo32
-struct elf_prpsinfo32
-{
-	char	pr_state;	/* numeric process state */
-	char	pr_sname;	/* char for pr_state */
-	char	pr_zomb;	/* zombie */
-	char	pr_nice;	/* nice val */
-	u32	pr_flag;	/* flags */
-	u16	pr_uid;
-	u16	pr_gid;
-	pid_t	pr_pid, pr_ppid, pr_pgrp, pr_sid;
-	/* Lots missing */
-	char	pr_fname[16];	/* filename of executable */
-	char	pr_psargs[ELF_PRARGSZ];	/* initial part of arg list */
-};
-
-#include <linux/highuid.h>
-
-#undef NEW_TO_OLD_UID
-#undef NEW_TO_OLD_GID
-#define NEW_TO_OLD_UID(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid)
-#define NEW_TO_OLD_GID(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid) 
-
-#define elf_addr_t	u32
-/*
-#define init_elf_binfmt init_elf32_binfmt
-*/
-#undef CONFIG_BINFMT_ELF
-#ifdef CONFIG_BINFMT_ELF32
-#define CONFIG_BINFMT_ELF CONFIG_BINFMT_ELF32
-#endif
-#undef CONFIG_BINFMT_ELF_MODULE
-#ifdef CONFIG_BINFMT_ELF32_MODULE
-#define CONFIG_BINFMT_ELF_MODULE CONFIG_BINFMT_ELF32_MODULE
-#endif
-
-#undef start_thread
-#define start_thread                    start_thread31 
-#define setup_arg_pages(bprm)           setup_arg_pages32(bprm)
-#define elf_map				elf_map32
-
-MODULE_DESCRIPTION("Binary format loader for compatibility with 32bit Linux for S390 binaries,"
-                   " Copyright 2000 IBM Corporation"); 
-MODULE_AUTHOR("Gerhard Tonn <ton@de.ibm.com>");
-
-#undef MODULE_DESCRIPTION
-#undef MODULE_AUTHOR
-
-#define jiffies_to_timeval jiffies_to_compat_timeval
-static __inline__ void
-jiffies_to_compat_timeval(unsigned long jiffies, struct compat_timeval *value)
-{
-	value->tv_usec = (jiffies % HZ) * (1000000L / HZ);
-	value->tv_sec = jiffies / HZ;
-}
-
-#include "../../../fs/binfmt_elf.c"
-
-static unsigned long
-elf_map32 (struct file *filep, unsigned long addr, struct elf_phdr *eppnt, int prot, int type)
-{
-	unsigned long map_addr;
-
-	if (!addr) 
-		addr = 0x40000000; 
-
-	if (prot & PROT_READ) 
-		prot |= PROT_EXEC; 
-
-	down_write(&current->mm->mmap_sem);
-	map_addr = do_mmap(filep, ELF_PAGESTART(addr),
-			   eppnt->p_filesz + ELF_PAGEOFFSET(eppnt->p_vaddr),
-			   prot, type,
-			   eppnt->p_offset - ELF_PAGEOFFSET(eppnt->p_vaddr));
-	up_write(&current->mm->mmap_sem);
-	return(map_addr);
-}
diff -Nru a/arch/s390x/kernel/bitmap.S b/arch/s390x/kernel/bitmap.S
--- a/arch/s390x/kernel/bitmap.S	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,56 +0,0 @@
-/*
- *  arch/s390/kernel/bitmap.S
- *    Bitmaps for set_bit, clear_bit, test_and_set_bit, ...
- *    See include/asm-s390/{bitops.h|posix_types.h} for details
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-         .globl _oi_bitmap
-_oi_bitmap:
-         .byte  0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
-
-         .globl _ni_bitmap
-_ni_bitmap:
-         .byte  0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F
-
-         .globl _zb_findmap
-_zb_findmap:
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4 
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4
-         .byte  0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,8
-
-         .globl _sb_findmap
-_sb_findmap:
-         .byte  8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-         .byte  4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
-
diff -Nru a/arch/s390x/kernel/cpcmd.c b/arch/s390x/kernel/cpcmd.c
--- a/arch/s390x/kernel/cpcmd.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,55 +0,0 @@
-/*
- *  arch/s390/kernel/cpcmd.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-#include <linux/string.h>
-#include <linux/spinlock.h>
-#include <asm/cpcmd.h>
-#include <asm/ebcdic.h>
-#include <asm/system.h>
-
-static spinlock_t cpcmd_lock = SPIN_LOCK_UNLOCKED;
-static char cpcmd_buf[128];
-
-void cpcmd(char *cmd, char *response, int rlen)
-{
-        const int mask = 0x40000000L;
-	unsigned long flags;
-        int cmdlen;
-
-	spin_lock_irqsave(&cpcmd_lock, flags);
-        cmdlen = strlen(cmd);
-        strcpy(cpcmd_buf, cmd);
-        ASCEBC(cpcmd_buf, cmdlen);
-
-        if (response != NULL && rlen > 0) {
-                asm volatile ("   lrag  2,0(%0)\n"
-                              "   lgr   4,%1\n"
-                              "   o     4,%4\n"
-                              "   lrag  3,0(%2)\n"
-                              "   lgr   5,%3\n"
-                              "   sam31\n"
-                              "   .long 0x83240008 # Diagnose 83\n"
-                              "   sam64"
-                              : /* no output */
-                              : "a" (cpcmd_buf), "d" (cmdlen),
-                                "a" (response), "d" (rlen), "m" (mask)
-                              : "2", "3", "4", "5" );
-                EBCASC(response, rlen);
-        } else {
-                asm volatile ("   lrag  2,0(%0)\n"
-                              "   lgr   3,%1\n"
-                              "   sam31\n"
-                              "   .long 0x83230008 # Diagnose 83\n"
-                              "   sam64"
-                              : /* no output */
-                              : "a" (cpcmd_buf), "d" (cmdlen)
-                              : "2", "3"  );
-        }
-	spin_unlock_irqrestore(&cpcmd_lock, flags);
-}
-
diff -Nru a/arch/s390x/kernel/debug.c b/arch/s390x/kernel/debug.c
--- a/arch/s390x/kernel/debug.c	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1206 +0,0 @@
-/*
- *  arch/s390/kernel/debug.c
- *   S/390 debug facility
- *
- *    Copyright (C) 1999, 2000 IBM Deutschland Entwicklung GmbH,
- *                             IBM Corporation
- *    Author(s): Michael Holzheu (holzheu@de.ibm.com),
- *               Holger Smolinski (Holger.Smolinski@de.ibm.com)
- *
- *    Bugreports to: <Linux390@de.ibm.com>
- */
-
-#include <linux/config.h>
-#include <linux/stddef.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/slab.h>
-#include <linux/ctype.h>
-#include <linux/version.h>
-#include <asm/uaccess.h>
-#include <asm/semaphore.h>
-
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include <asm/debug.h>
-
-#define MIN(a,b) (((a)<(b))?(a):(b))
-#define DEBUG_PROLOG_ENTRY -1
-
-/* typedefs */
-
-typedef struct file_private_info {
-	loff_t offset;			/* offset of last read in file */
-	int    act_area;                /* number of last formated area */
-	int    act_entry;               /* last formated entry (offset */
-                                        /* relative to beginning of last */
-                                        /* formated area) */ 
-	size_t act_entry_offset;        /* up to this offset we copied */
-					/* in last read the last formated */
-					/* entry to userland */
-	char   temp_buf[2048];		/* buffer for output */
-	debug_info_t *debug_info_org;   /* original debug information */
-	debug_info_t *debug_info_snap;	/* snapshot of debug information */
-	struct debug_view *view;	/* used view of debug info */
-} file_private_info_t;
-
-typedef struct
-{
-	char *string;
-	/* 
-	 * This assumes that all args are converted into longs 
-	 * on L/390 this is the case for all types of parameter 
-	 * except of floats, and long long (32 bit) 
-         *
-         */
-	long args[0];
-} debug_sprintf_entry;
-
-
-extern void tod_to_timeval(uint64_t todval, struct timeval *xtime);
-
-/* internal function prototyes */
-
-static int debug_init(void);
-static ssize_t debug_output(struct file *file, char *user_buf,
-			    size_t user_len, loff_t * offset);
-static ssize_t debug_input(struct file *file, const char *user_buf,
-			   size_t user_len, loff_t * offset);
-static int debug_open(struct inode *inode, struct file *file);
-static int debug_close(struct inode *inode, struct file *file);
-static debug_info_t*  debug_info_create(char *name, int page_order, int nr_areas, int buf_size);
-static void debug_info_get(debug_info_t *);
-static void debug_info_put(debug_info_t *);
-static int debug_prolog_level_fn(debug_info_t * id,
-				 struct debug_view *view, char *out_buf);
-static int debug_input_level_fn(debug_info_t * id, struct debug_view *view,
-				struct file *file, const char *user_buf,
-				size_t user_buf_size, loff_t * offset);
-static int debug_input_flush_fn(debug_info_t * id, struct debug_view *view,
-                                struct file *file, const char *user_buf,
-                                size_t user_buf_size, loff_t * offset);
-static int debug_hex_ascii_format_fn(debug_info_t * id, struct debug_view *view,
-                                char *out_buf, const char *in_buf);
-static int debug_raw_format_fn(debug_info_t * id,
-				 struct debug_view *view, char *out_buf,
-				 const char *in_buf);
-static int debug_raw_header_fn(debug_info_t * id, struct debug_view *view,
-                         int area, debug_entry_t * entry, char *out_buf);
-
-static int debug_sprintf_format_fn(debug_info_t * id, struct debug_view *view,
-				   char *out_buf, debug_sprintf_entry *curr_event);
-
-/* globals */
-
-struct debug_view debug_raw_view = {
-	"raw",
-	NULL,
-	&debug_raw_header_fn,
-	&debug_raw_format_fn,
-	NULL,
-	NULL
-};
-
-struct debug_view debug_hex_ascii_view = {
-	"hex_ascii",
-	NULL,
-	&debug_dflt_header_fn,
-	&debug_hex_ascii_format_fn,
-	NULL,
-	NULL
-};
-
-struct debug_view debug_level_view = {
-	"level",
-	&debug_prolog_level_fn,
-	NULL,
-	NULL,
-	&debug_input_level_fn,
-	NULL
-};
-
-struct debug_view debug_flush_view = {
-        "flush",
-        NULL,
-        NULL,
-        NULL,
-        &debug_input_flush_fn,
-        NULL
-};
-
-struct debug_view debug_sprintf_view = {
-	"sprintf",
-	NULL,
-	&debug_dflt_header_fn,
-	(debug_format_proc_t*)&debug_sprintf_format_fn,
-	NULL,
-	NULL
-};
-
-
-unsigned int debug_feature_version = __DEBUG_FEATURE_VERSION;
-
-/* static globals */
-
-static debug_info_t *debug_area_first = NULL;
-static debug_info_t *debug_area_last = NULL;
-DECLARE_MUTEX(debug_lock);
-
-static int initialized;
-
-static struct file_operations debug_file_ops = {
-	.owner	 = THIS_MODULE,
-	.read    = debug_output,
-	.write   = debug_input,	
-	.open    = debug_open,
-	.release = debug_close,
-};
-
-static struct proc_dir_entry *debug_proc_root_entry;
-
-/* functions */
-
-/*
- * debug_info_alloc
- * - alloc new debug-info
- */
-
-static debug_info_t*  debug_info_alloc(char *name, int page_order,
-                                        int nr_areas, int buf_size)
-{
-	debug_info_t* rc;
-	int i;
-
-	/* alloc everything */
-
-	rc = (debug_info_t*) kmalloc(sizeof(debug_info_t), GFP_ATOMIC);
-	if(!rc)
-		goto fail_malloc_rc;
-	rc->active_entry = (int*)kmalloc(nr_areas * sizeof(int), GFP_ATOMIC);
-	if(!rc->active_entry)
-		goto fail_malloc_active_entry;
-	memset(rc->active_entry, 0, nr_areas * sizeof(int));
-	rc->areas = (debug_entry_t **) kmalloc(nr_areas *
-						sizeof(debug_entry_t *),
-						GFP_ATOMIC);
-	if (!rc->areas)
-		goto fail_malloc_areas;
-	for (i = 0; i < nr_areas; i++) {
-		rc->areas[i] = (debug_entry_t *) __get_free_pages(GFP_ATOMIC,
-								page_order);
-		if (!rc->areas[i]) {
-			for (i--; i >= 0; i--) {
-				free_pages((unsigned long) rc->areas[i],
-						page_order);
-			}
-			goto fail_malloc_areas2;
-		} else {
-			memset(rc->areas[i], 0, PAGE_SIZE << page_order);
-		}
-	}
-
-	/* initialize members */
-
-	spin_lock_init(&rc->lock);
-	rc->page_order  = page_order;
-	rc->nr_areas    = nr_areas;
-	rc->active_area = 0;
-	rc->level       = DEBUG_DEFAULT_LEVEL;
-	rc->buf_size    = buf_size;
-	rc->entry_size  = sizeof(debug_entry_t) + buf_size;
-	strncpy(rc->name, name, MIN(strlen(name), (DEBUG_MAX_PROCF_LEN - 1)));
-	rc->name[MIN(strlen(name), (DEBUG_MAX_PROCF_LEN - 1))] = 0;
-	memset(rc->views, 0, DEBUG_MAX_VIEWS * sizeof(struct debug_view *));
-#ifdef CONFIG_PROC_FS
-	memset(rc->proc_entries, 0 ,DEBUG_MAX_VIEWS *
-		sizeof(struct proc_dir_entry*));
-#endif /* CONFIG_PROC_FS */
-	atomic_set(&(rc->ref_count), 0);
-
-	return rc;
-
-fail_malloc_areas2:
-	kfree(rc->areas);
-fail_malloc_areas:
-	kfree(rc->active_entry);
-fail_malloc_active_entry:
-	kfree(rc);
-fail_malloc_rc:
-	return NULL;
-}
-
-/*
- * debug_info_free
- * - free memory debug-info
- */
-
-static void debug_info_free(debug_info_t* db_info){
-	int i;
-	for (i = 0; i < db_info->nr_areas; i++) {
-		free_pages((unsigned long) db_info->areas[i],
-		db_info->page_order);
-	}
-	kfree(db_info->areas);
-	kfree(db_info->active_entry);
-	kfree(db_info);
-}
-
-/*
- * debug_info_create
- * - create new debug-info
- */
-
-static debug_info_t*  debug_info_create(char *name, int page_order, 
-                                        int nr_areas, int buf_size)
-{
-	debug_info_t* rc;
-
-        rc = debug_info_alloc(name, page_order, nr_areas, buf_size);
-        if(!rc) 
-		goto out;
-
-
-	/* create proc rood directory */
-        rc->proc_root_entry = proc_mkdir(rc->name, debug_proc_root_entry);
-
-	/* append new element to linked list */
-        if (debug_area_first == NULL) {
-                /* first element in list */
-                debug_area_first = rc;
-                rc->prev = NULL;
-        } else {
-                /* append element to end of list */
-                debug_area_last->next = rc;
-                rc->prev = debug_area_last;
-        }
-        debug_area_last = rc;
-        rc->next = NULL;
-
-	debug_info_get(rc);
-out:
-	return rc;
-}
-
-/*
- * debug_info_copy
- * - copy debug-info
- */
-
-static debug_info_t* debug_info_copy(debug_info_t* in)
-{
-        int i;
-        debug_info_t* rc;
-        rc = debug_info_alloc(in->name, in->page_order, 
-                                in->nr_areas, in->buf_size);
-        if(!rc)
-                goto out;
-
-        for(i = 0; i < in->nr_areas; i++){
-                memcpy(rc->areas[i],in->areas[i], PAGE_SIZE << in->page_order);
-        }
-out:
-        return rc;
-}
-
-/*
- * debug_info_get
- * - increments reference count for debug-info
- */
-
-static void debug_info_get(debug_info_t * db_info)
-{
-	if (db_info)
-		atomic_inc(&db_info->ref_count);
-}
-
-/*
- * debug_info_put:
- * - decreases reference count for debug-info and frees it if necessary
- */
-
-static void debug_info_put(debug_info_t *db_info)
-{
-	int i;
-
-	if (!db_info)
-		return;
-	if (atomic_dec_and_test(&db_info->ref_count)) {
-#ifdef DEBUG
-		printk(KERN_INFO "debug: freeing debug area %p (%s)\n",
-		       db_info, db_info->name);
-#endif
-		for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
-			if (db_info->views[i] == NULL)
-				continue;
-#ifdef CONFIG_PROC_FS
-			remove_proc_entry(db_info->proc_entries[i]->name,
-					  db_info->proc_root_entry);
-#endif
-		}
-#ifdef CONFIG_PROC_FS
-		remove_proc_entry(db_info->proc_root_entry->name,
-				  debug_proc_root_entry);
-#endif
-		if(db_info == debug_area_first)
-			debug_area_first = db_info->next;
-		if(db_info == debug_area_last)
-			debug_area_last = db_info->prev;
-		if(db_info->prev) db_info->prev->next = db_info->next;
-		if(db_info->next) db_info->next->prev = db_info->prev;
-		debug_info_free(db_info);
-	}
-}
-
-/*
- * debug_format_entry:
- * - format one debug entry and return size of formated data
- */
-
-static int debug_format_entry(file_private_info_t *p_info)
-{
-	debug_info_t *id_org    = p_info->debug_info_org;
-	debug_info_t *id_snap   = p_info->debug_info_snap;
-	struct debug_view *view = p_info->view;
-	debug_entry_t *act_entry;
-	size_t len = 0;
-	if(p_info->act_entry == DEBUG_PROLOG_ENTRY){
-		/* print prolog */
-        	if (view->prolog_proc)
-                	len += view->prolog_proc(id_org, view,p_info->temp_buf);
-		goto out;
-	}
-
-	act_entry = (debug_entry_t *) ((char*)id_snap->areas[p_info->act_area] +
-					p_info->act_entry);
-                        
-	if (act_entry->id.stck == 0LL)
-			goto out;  /* empty entry */
-	if (view->header_proc)
-		len += view->header_proc(id_org, view, p_info->act_area, 
-					act_entry, p_info->temp_buf + len);
-	if (view->format_proc)
-		len += view->format_proc(id_org, view, p_info->temp_buf + len,
-						DEBUG_DATA(act_entry));
-      out:
-        return len;
-}
-
-/*
- * debug_next_entry:
- * - goto next entry in p_info
- */
-
-extern inline int debug_next_entry(file_private_info_t *p_info)
-{
-	debug_info_t *id = p_info->debug_info_snap;
-	if(p_info->act_entry == DEBUG_PROLOG_ENTRY){
-		p_info->act_entry = 0;
-		goto out;
-	}
-	if ((p_info->act_entry += id->entry_size)
-		> ((PAGE_SIZE << (id->page_order)) 
-		- id->entry_size)){
-
-		/* next area */
-		p_info->act_entry = 0;
-        	p_info->act_area++;
-        	if(p_info->act_area >= id->nr_areas)
-			return 1;
-	}
-out:
-	return 0;	
-}
-
-/*
- * debug_output:
- * - called for user read()
- * - copies formated debug entries to the user buffer
- */
-
-static ssize_t debug_output(struct file *file,	/* file descriptor */
-			    char *user_buf,	/* user buffer */
-			    size_t  len,	/* length of buffer */
-			    loff_t *offset	/* offset in the file */ )
-{
-	size_t count = 0;
-	size_t entry_offset, size = 0;
-	file_private_info_t *p_info;
-
-	p_info = ((file_private_info_t *) file->private_data);
-	if (*offset != p_info->offset) 
-		return -EPIPE;
-	if(p_info->act_area >= p_info->debug_info_snap->nr_areas)
-		return 0;
-
-	entry_offset = p_info->act_entry_offset;
-
-	while(count < len){
-		size = debug_format_entry(p_info);
-		size = MIN((len - count), (size - entry_offset));
-
-		if(size){
-			if (copy_to_user(user_buf + count, 
-					p_info->temp_buf + entry_offset, size))
-			return -EFAULT;
-		}
-		count += size;
-		entry_offset = 0;
-		if(count != len)
-			if(debug_next_entry(p_info)) 
-				goto out;
-	}
-out:
-	p_info->offset           = *offset + count;
-	p_info->act_entry_offset = size;	
-	*offset = p_info->offset;
-	return count;
-}
-
-/*
- * debug_input:
- * - called for user write()
- * - calls input function of view
- */
-
-static ssize_t debug_input(struct file *file,
-			   const char *user_buf, size_t length,
-			   loff_t *offset)
-{
-	int rc = 0;
-	file_private_info_t *p_info;
-
-	down(&debug_lock);
-	p_info = ((file_private_info_t *) file->private_data);
-	if (p_info->view->input_proc)
-		rc = p_info->view->input_proc(p_info->debug_info_org,
-					      p_info->view, file, user_buf,
-					      length, offset);
-	else
-		rc = -EPERM;
-	up(&debug_lock);
-	return rc;		/* number of input characters */
-}
-
-/*
- * debug_open:
- * - called for user open()
- * - copies formated output to private_data area of the file
- *   handle
- */
-
-static int debug_open(struct inode *inode, struct file *file)
-{
-	int i = 0, rc = 0;
-	file_private_info_t *p_info;
-	debug_info_t *debug_info, *debug_info_snapshot;
-
-#ifdef DEBUG
-	printk("debug_open\n");
-#endif
-	down(&debug_lock);
-
-	/* find debug log and view */
-
-	debug_info = debug_area_first;
-	while(debug_info != NULL){
-		for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
-			if (debug_info->views[i] == NULL)
-				continue;
-			else if (debug_info->proc_entries[i] ==
-				 PDE(file->f_dentry->d_inode)) {
-				goto found;	/* found view ! */
-			}
-		}
-		debug_info = debug_info->next;
-	}
-	/* no entry found */
-	rc = -EINVAL;
-	goto out;
-
-      found:
-
-	/* make snapshot of current debug areas to get it consistent */
-
-	debug_info_snapshot = debug_info_copy(debug_info);
-
-	if(!debug_info_snapshot){
-#ifdef DEBUG
-		printk(KERN_ERR "debug_open: debug_info_copy failed (out of mem)\n");
-#endif
-		rc = -ENOMEM;
-		goto out;
-	}
-
-	if ((file->private_data =
-	     kmalloc(sizeof(file_private_info_t), GFP_ATOMIC)) == 0) {
-#ifdef DEBUG
-		printk(KERN_ERR "debug_open: kmalloc failed\n");
-#endif
-		debug_info_free(debug_info_snapshot);	
-		rc = -ENOMEM;
-		goto out;
-	}
-	p_info = (file_private_info_t *) file->private_data;
-	p_info->offset = 0;
-	p_info->debug_info_snap = debug_info_snapshot;
-	p_info->debug_info_org  = debug_info;
-	p_info->view = debug_info->views[i];
-	p_info->act_area = 0;
-	p_info->act_entry = DEBUG_PROLOG_ENTRY;
-	p_info->act_entry_offset = 0;
-
-	debug_info_get(debug_info);
-
-      out:
-	up(&debug_lock);
-	return rc;
-}
-
-/*
- * debug_close:
- * - called for user close()
- * - deletes  private_data area of the file handle
- */
-
-static int debug_close(struct inode *inode, struct file *file)
-{
-	file_private_info_t *p_info;
-#ifdef DEBUG
-	printk("debug_close\n");
-#endif
-	p_info = (file_private_info_t *) file->private_data;
-	debug_info_free(p_info->debug_info_snap);
-	debug_info_put(p_info->debug_info_org);
-	kfree(file->private_data);
-	return 0;		/* success */
-}
-
-/*
- * debug_register:
- * - creates and initializes debug area for the caller
- * - returns handle for debug area
- */
-
-debug_info_t *debug_register
-    (char *name, int page_order, int nr_areas, int buf_size) 
-{
-	debug_info_t *rc = NULL;
-
-	MOD_INC_USE_COUNT;
-	if (!initialized)
-		BUG();
-	down(&debug_lock);
-
-        /* create new debug_info */
-
-	rc = debug_info_create(name, page_order, nr_areas, buf_size);
-	if(!rc) 
-		goto out;
-	debug_register_view(rc, &debug_level_view);
-        debug_register_view(rc, &debug_flush_view);
-#ifdef DEBUG
-	printk(KERN_INFO
-	       "debug: reserved %d areas of %d pages for debugging %s\n",
-	       nr_areas, 1 << page_order, rc->name);
-#endif
-      out:
-        if (rc == NULL){
-		printk(KERN_ERR "debug: debug_register failed for %s\n",name);
-		MOD_DEC_USE_COUNT;
-        }
-	up(&debug_lock);
-	return rc;
-}
-
-/*
- * debug_unregister:
- * - give back debug area
- */
-
-void debug_unregister(debug_info_t * id)
-{
-	if (!id)
-		goto out;
-	down(&debug_lock);
-#ifdef DEBUG
-	printk(KERN_INFO "debug: unregistering %s\n", id->name);
-#endif
-	debug_info_put(id);
-	up(&debug_lock);
-
-	MOD_DEC_USE_COUNT;
-      out:
-	return;
-}
-
-/*
- * debug_set_level:
- * - set actual debug level
- */
-
-void debug_set_level(debug_info_t* id, int new_level)
-{
-	unsigned long flags;
-	if(!id)
-		return;	
-	spin_lock_irqsave(&id->lock,flags);
-        if(new_level == DEBUG_OFF_LEVEL){
-                id->level = DEBUG_OFF_LEVEL;
-                printk(KERN_INFO "debug: %s: switched off\n",id->name);
-        } else if ((new_level > DEBUG_MAX_LEVEL) || (new_level < 0)) {
-                printk(KERN_INFO
-                        "debug: %s: level %i is out of range (%i - %i)\n",
-                        id->name, new_level, 0, DEBUG_MAX_LEVEL);
-        } else {
-                id->level = new_level;
-#ifdef DEBUG
-                printk(KERN_INFO 
-			"debug: %s: new level %i\n",id->name,id->level);
-#endif
-        }
-	spin_unlock_irqrestore(&id->lock,flags);
-}
-
-
-/*
- * proceed_active_entry:
- * - set active entry to next in the ring buffer
- */
-
-extern inline void proceed_active_entry(debug_info_t * id)
-{
-	if ((id->active_entry[id->active_area] += id->entry_size)
-	    > ((PAGE_SIZE << (id->page_order)) - id->entry_size))
-		id->active_entry[id->active_area] = 0;
-}
-
-/*
- * proceed_active_area:
- * - set active area to next in the ring buffer
- */
-
-extern inline void proceed_active_area(debug_info_t * id)
-{
-	id->active_area++;
-	id->active_area = id->active_area % id->nr_areas;
-}
-
-/*
- * get_active_entry:
- */
-
-extern inline debug_entry_t *get_active_entry(debug_info_t * id)
-{
-	return (debug_entry_t *) ((char *) id->areas[id->active_area] +
-				  id->active_entry[id->active_area]);
-}
-
-/*
- * debug_common:
- * - set timestamp, caller address, cpu number etc.
- */
-
-extern inline debug_entry_t *debug_common(debug_info_t * id, int level, 
-                                    const void *buf, int len, int exception)
-{
-	unsigned long flags;
-	debug_entry_t *active;
-
-	spin_lock_irqsave(&id->lock, flags);
-	active = get_active_entry(id);
-	STCK(active->id.stck);
-	active->id.fields.cpuid = smp_processor_id();
-	active->caller = __builtin_return_address(0);
-	active->id.fields.exception = exception;
-	active->id.fields.level     = level;
-	memset(DEBUG_DATA(active), 0, id->buf_size);
-	memcpy(DEBUG_DATA(active), buf, MIN(len, id->buf_size));
-	proceed_active_entry(id);
-	if(exception)
-		proceed_active_area(id);
-	spin_unlock_irqrestore(&id->lock, flags);
-
-	return active;
-}
-
-/*
- * debug_event_common:
- * - write debug entry with given size
- */
-
-debug_entry_t *debug_event_common(debug_info_t * id, int level, const void *buf,
-			          int len)
-{
-	return debug_common(id, level, buf, len, 0);
-}
-
-/*
- * debug_exception_common:
- * - write debug entry with given size and switch to next debug area
- */
-
-debug_entry_t *debug_exception_common(debug_info_t * id, int level, 
-                                      const void *buf, int len)
-{
-	return debug_common(id, level, buf, len, 1);
-}
-
-/*
- * counts arguments in format string for sprintf view
- */
-
-extern inline int debug_count_numargs(char *string)
-{
-	int numargs=0;
-
-	while(*string) {
-		if(*string++=='%')
-			numargs++;
-	}
-	return(numargs);
-}
-
-/*
- * debug_sprintf_event:
- */
-
-debug_entry_t *debug_sprintf_event(debug_info_t* id,
-                                   int level,char *string,...)
-{
-	va_list   ap;
-	int numargs,alloc_size,idx;
-	debug_sprintf_entry *curr_event;
-	debug_entry_t *retval = NULL;
-
-	if((!id) || (level > id->level))
-		return NULL;
-	else {
-		numargs=debug_count_numargs(string);
-		alloc_size=offsetof(debug_sprintf_entry,args[numargs]);
-		curr_event=alloca(alloc_size);
-
-		if(curr_event){
-			va_start(ap,string);
-			curr_event->string=string;
-			for(idx=0;idx<numargs;idx++)
-				curr_event->args[idx]=va_arg(ap,long);
-			retval=debug_common(id,level, curr_event,alloc_size,0);
-			va_end(ap);
-		}
-		return retval;
-	}
-}
-
-/*
- * debug_sprintf_exception:
- */
-
-debug_entry_t *debug_sprintf_exception(debug_info_t* id,
-                                       int level,char *string,...)
-{
-	va_list   ap;
-	int numargs,alloc_size,idx;
-	debug_sprintf_entry *curr_event;
-	debug_entry_t *retval = NULL;
-
-	if((!id) || (level > id->level))
-		return NULL;
-	else {
-		numargs=debug_count_numargs(string);
-		alloc_size=offsetof(debug_sprintf_entry,args[numargs]);
-		curr_event=alloca(alloc_size);
-
-		if(curr_event){
-			va_start(ap,string);
-			curr_event->string=string;
-			for(idx=0;idx<numargs;idx++)
-				curr_event->args[idx]=va_arg(ap,long);
-			retval=debug_common(id,level, curr_event,alloc_size,1);
-			va_end(ap);
-		}
-		return retval;
-	}
-}
-
-/*
- * debug_init:
- * - is called exactly once to initialize the debug feature
- */
-
-static int __init debug_init(void)
-{
-	int rc = 0;
-
-	down(&debug_lock);
-#ifdef CONFIG_PROC_FS
-	debug_proc_root_entry = proc_mkdir(DEBUG_DIR_ROOT, NULL);
-#endif /* CONFIG_PROC_FS */
-	printk(KERN_INFO "debug: Initialization complete\n");
-	initialized = 1;
-	up(&debug_lock);
-
-	return rc;
-}
-
-/*
- * debug_register_view:
- */
-
-int debug_register_view(debug_info_t * id, struct debug_view *view)
-{
-	int rc = 0;
-	int i;
-	unsigned long flags;
-	mode_t mode = S_IFREG;
-
-	if (!id)
-		goto out;
-	spin_lock_irqsave(&id->lock, flags);
-	for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
-		if (id->views[i] == NULL)
-			break;
-	}
-	if (i == DEBUG_MAX_VIEWS) {
-		printk(KERN_WARNING "debug: cannot register view %s/%s\n",
-			id->name,view->name);
-		printk(KERN_WARNING 
-			"debug: maximum number of views reached (%i)!\n", i);
-		rc = -1;
-	}
-	else {
-		id->views[i] = view;
-		if (view->prolog_proc || view->format_proc || view->header_proc)
-			mode |= S_IRUSR;
-		if (view->input_proc)
-			mode |= S_IWUSR;
-		id->proc_entries[i] = create_proc_entry(view->name, mode,
-							id->proc_root_entry);
-		if (id->proc_entries[i] != NULL)
-			id->proc_entries[i]->proc_fops = &debug_file_ops;
-		rc = 0;
-	}
-	spin_unlock_irqrestore(&id->lock, flags);
-      out:
-	return rc;
-}
-
-/*
- * debug_unregister_view:
- */
-
-int debug_unregister_view(debug_info_t * id, struct debug_view *view)
-{
-	int rc = 0;
-	int i;
-	unsigned long flags;
-
-	if (!id)
-		goto out;
-	spin_lock_irqsave(&id->lock, flags);
-	for (i = 0; i < DEBUG_MAX_VIEWS; i++) {
-		if (id->views[i] == view)
-			break;
-	}
-	if (i == DEBUG_MAX_VIEWS)
-		rc = -1;
-	else {
-#ifdef CONFIG_PROC_FS
-		remove_proc_entry(id->proc_entries[i]->name,
-				  id->proc_root_entry);
-#endif
-		id->views[i] = NULL;
-		rc = 0;
-	}
-	spin_unlock_irqrestore(&id->lock, flags);
-      out:
-	return rc;
-}
-
-/*
- * functions for debug-views
- ***********************************
-*/
-
-/*
- * prints out actual debug level
- */
-
-static int debug_prolog_level_fn(debug_info_t * id,
-				 struct debug_view *view, char *out_buf)
-{
-	int rc = 0;
-
-	if(id->level == -1) rc = sprintf(out_buf,"-\n");
-	else rc = sprintf(out_buf, "%i\n", id->level);
-	return rc;
-}
-
-/*
- * reads new debug level
- */
-
-static int debug_input_level_fn(debug_info_t * id, struct debug_view *view,
-				struct file *file, const char *user_buf,
-				size_t in_buf_size, loff_t * offset)
-{
-	char input_buf[1];
-	int rc = in_buf_size;
-
-	if (*offset != 0)
-		goto out;
-	if (copy_from_user(input_buf, user_buf, 1)){
-		rc = -EFAULT;
-		goto out;
-	}
-	if (isdigit(input_buf[0])) {
-		int new_level = ((int) input_buf[0] - (int) '0');
-		debug_set_level(id, new_level);
-	} else if(input_buf[0] == '-') {
-		debug_set_level(id, DEBUG_OFF_LEVEL);
-	} else {
-		printk(KERN_INFO "debug: level `%c` is not valid\n",
-		       input_buf[0]);
-	}
-      out:
-	*offset += in_buf_size;
-	return rc;		/* number of input characters */
-}
-
-
-/*
- * flushes debug areas
- */
- 
-void debug_flush(debug_info_t* id, int area)
-{
-        unsigned long flags;
-        int i;
-
-        if(!id)
-                return;
-        spin_lock_irqsave(&id->lock,flags);
-        if(area == DEBUG_FLUSH_ALL){
-                id->active_area = 0;
-                memset(id->active_entry, 0, id->nr_areas * sizeof(int));
-                for (i = 0; i < id->nr_areas; i++) 
-                        memset(id->areas[i], 0, PAGE_SIZE << id->page_order);
-                printk(KERN_INFO "debug: %s: all areas flushed\n",id->name);
-        } else if(area >= 0 && area < id->nr_areas) {
-                id->active_entry[area] = 0;
-                memset(id->areas[area], 0, PAGE_SIZE << id->page_order);
-                printk(KERN_INFO
-                        "debug: %s: area %i has been flushed\n",
-                        id->name, area);
-        } else {
-                printk(KERN_INFO
-                        "debug: %s: area %i cannot be flushed (range: %i - %i)\n",
-                        id->name, area, 0, id->nr_areas-1);
-        }
-        spin_unlock_irqrestore(&id->lock,flags);
-}
-
-/*
- * view function: flushes debug areas 
- */
- 
-static int debug_input_flush_fn(debug_info_t * id, struct debug_view *view,
-                                struct file *file, const char *user_buf,
-                                size_t in_buf_size, loff_t * offset)
-{
-        char input_buf[1];
-        int rc = in_buf_size;
- 
-        if (*offset != 0)
-                goto out;
-        if (copy_from_user(input_buf, user_buf, 1)){
-                rc = -EFAULT;
-                goto out;
-        }
-        if(input_buf[0] == '-') { 
-                debug_flush(id, DEBUG_FLUSH_ALL);
-                goto out;
-        }
-        if (isdigit(input_buf[0])) {
-                int area = ((int) input_buf[0] - (int) '0');
-                debug_flush(id, area);
-                goto out;
-        }
-
-        printk(KERN_INFO "debug: area `%c` is not valid\n", input_buf[0]);
-
-      out:
-        *offset += in_buf_size;
-        return rc;              /* number of input characters */
-}
-
-/*
- * prints debug header in raw format
- */
-
-int debug_raw_header_fn(debug_info_t * id, struct debug_view *view,
-                         int area, debug_entry_t * entry, char *out_buf)
-{
-        int rc;
-
-	rc = sizeof(debug_entry_t);
-	memcpy(out_buf,entry,sizeof(debug_entry_t));
-        return rc;
-}
-
-/*
- * prints debug data in raw format
- */
-
-static int debug_raw_format_fn(debug_info_t * id, struct debug_view *view,
-			       char *out_buf, const char *in_buf)
-{
-	int rc;
-
-	rc = id->buf_size;
-	memcpy(out_buf, in_buf, id->buf_size);
-	return rc;
-}
-
-/*
- * prints debug data in hex/ascii format
- */
-
-static int debug_hex_ascii_format_fn(debug_info_t * id, struct debug_view *view,
-		    		  char *out_buf, const char *in_buf)
-{
-	int i, rc = 0;
-
-	for (i = 0; i < id->buf_size; i++) {
-                rc += sprintf(out_buf + rc, "%02x ",
-                              ((unsigned char *) in_buf)[i]);
-        }
-	rc += sprintf(out_buf + rc, "| ");
-	for (i = 0; i < id->buf_size; i++) {
-		unsigned char c = in_buf[i];
-		if (!isprint(c))
-			rc += sprintf(out_buf + rc, ".");
-		else
-			rc += sprintf(out_buf + rc, "%c", c);
-	}
-	rc += sprintf(out_buf + rc, "\n");
-	return rc;
-}
-
-/*
- * prints header for debug entry
- */
-
-int debug_dflt_header_fn(debug_info_t * id, struct debug_view *view,
-			 int area, debug_entry_t * entry, char *out_buf)
-{
-	struct timeval time_val;
-	unsigned long long time;
-	char *except_str;
-	unsigned long caller;
-	int rc = 0;
-	unsigned int level;
-
-	level = entry->id.fields.level;
-	time = entry->id.stck;
-	/* adjust todclock to 1970 */
-	time -= 0x8126d60e46000000LL - (0x3c26700LL * 1000000 * 4096);
-	tod_to_timeval(time, &time_val);
-
-	if (entry->id.fields.exception)
-		except_str = "*";
-	else
-		except_str = "-";
-	caller = (unsigned long) entry->caller;
-#if defined(CONFIG_ARCH_S390X)
-	rc += sprintf(out_buf, "%02i %011lu:%06lu %1u %1s %02i %016lx  ",
-		      area, time_val.tv_sec, time_val.tv_usec, level,
-		      except_str, entry->id.fields.cpuid, caller);
-#else
-	caller &= 0x7fffffff;
-	rc += sprintf(out_buf, "%02i %011lu:%06lu %1u %1s %02i %08lx  ",
-		      area, time_val.tv_sec, time_val.tv_usec, level,
-		      except_str, entry->id.fields.cpuid, caller);
-#endif
-	return rc;
-}
-
-/*
- * prints debug data sprintf-formated:
- * debug_sprinf_event/exception calls must be used together with this view
- */
-
-#define DEBUG_SPRINTF_MAX_ARGS 10
-
-int debug_sprintf_format_fn(debug_info_t * id, struct debug_view *view,
-                            char *out_buf, debug_sprintf_entry *curr_event)
-{
-	int num_longs, num_used_args = 0,i, rc = 0;
-	int index[DEBUG_SPRINTF_MAX_ARGS];
-
-	/* count of longs fit into one entry */
-	num_longs = id->buf_size /  sizeof(long); 
-
-	if(num_longs < 1)
-		goto out; /* bufsize of entry too small */
-	if(num_longs == 1) {
-		/* no args, we use only the string */
-		strcpy(out_buf, curr_event->string);
-		rc = strlen(curr_event->string);
-		goto out;
-	}
-
-	/* number of arguments used for sprintf (without the format string) */
-	num_used_args   = MIN(DEBUG_SPRINTF_MAX_ARGS, (num_longs - 1));
-
-	memset(index,0, DEBUG_SPRINTF_MAX_ARGS * sizeof(int));
-
-	for(i = 0; i < num_used_args; i++)
-		index[i] = i;
-
-	rc =  sprintf(out_buf, curr_event->string, curr_event->args[index[0]],
-		curr_event->args[index[1]], curr_event->args[index[2]],
-		curr_event->args[index[3]], curr_event->args[index[4]],
-		curr_event->args[index[5]], curr_event->args[index[6]],
-		curr_event->args[index[7]], curr_event->args[index[8]],
-		curr_event->args[index[9]]);
-
-out:
-
-	return rc;
-}
-
-/*
- * clean up module
- */
-void __exit debug_exit(void)
-{
-#ifdef DEBUG
-	printk("debug_cleanup_module: \n");
-#endif
-#ifdef CONFIG_PROC_FS
-	remove_proc_entry(debug_proc_root_entry->name, NULL);
-#endif /* CONFIG_PROC_FS */
-	return;
-}
-
-/*
- * module definitions
- */
-core_initcall(debug_init);
-module_exit(debug_exit);
-MODULE_LICENSE("GPL");
-
-EXPORT_SYMBOL(debug_register);
-EXPORT_SYMBOL(debug_unregister); 
-EXPORT_SYMBOL(debug_set_level);
-EXPORT_SYMBOL(debug_register_view);
-EXPORT_SYMBOL(debug_unregister_view);
-EXPORT_SYMBOL(debug_event_common);
-EXPORT_SYMBOL(debug_exception_common);
-EXPORT_SYMBOL(debug_hex_ascii_view);
-EXPORT_SYMBOL(debug_raw_view);
-EXPORT_SYMBOL(debug_dflt_header_fn);
-EXPORT_SYMBOL(debug_sprintf_view);
-EXPORT_SYMBOL(debug_sprintf_exception);
-EXPORT_SYMBOL(debug_sprintf_event);
diff -Nru a/arch/s390x/kernel/ebcdic.c b/arch/s390x/kernel/ebcdic.c
--- a/arch/s390x/kernel/ebcdic.c	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,400 +0,0 @@
-/*
- *  arch/s390/kernel/ebcdic.c
- *    ECBDIC -> ASCII, ASCII -> ECBDIC,
- *    upper to lower case (EBCDIC) conversion tables.
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
- *               Martin Peschke <peschke@fh-brandenburg.de>
- */
-
-#include <linux/module.h>
-#include <asm/types.h>
-
-/*
- * ASCII (IBM PC 437)  -> EBCDIC 037
- */
-__u8 _ascebc[256] =
-{
- /*00 NUL   SOH   STX   ETX   EOT   ENQ   ACK   BEL */
-     0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
- /*08  BS    HT    LF    VT    FF    CR    SO    SI */
- /*              ->NL                               */
-     0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- /*10 DLE   DC1   DC2   DC3   DC4   NAK   SYN   ETB */
-     0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
- /*18 CAN    EM   SUB   ESC    FS    GS    RS    US */
- /*                               ->IGS ->IRS ->IUS */
-     0x18, 0x19, 0x3F, 0x27, 0x22, 0x1D, 0x1E, 0x1F,
- /*20  SP     !     "     #     $     %     &     ' */
-     0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
- /*28   (     )     *     +     ,     -    .      / */
-     0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
- /*30   0     1     2     3     4     5     6     7 */
-     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
- /*38   8     9     :     ;     <     =     >     ? */
-     0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
- /*40   @     A     B     C     D     E     F     G */
-     0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
- /*48   H     I     J     K     L     M     N     O */
-     0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
- /*50   P     Q     R     S     T     U     V     W */
-     0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
- /*58   X     Y     Z     [     \     ]     ^     _ */
-     0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D,
- /*60   `     a     b     c     d     e     f     g */
-     0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
- /*68   h     i     j     k     l     m     n     o */
-     0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
- /*70   p     q     r     s     t     u     v     w */
-     0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
- /*78   x     y     z     {     |     }     ~    DL */
-     0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07,
- /*80*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*88*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*90*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*98*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*A0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*A8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*B0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*B8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*C0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*C8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*D0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*D8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*E0        sz						*/
-     0x3F, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*E8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*F0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*F8*/
-     0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x3F, 0xFF
-};
-
-/*
- * EBCDIC 037 -> ASCII (IBM PC 437)
- */
-__u8 _ebcasc[256] =
-{
- /* 0x00   NUL   SOH   STX   ETX  *SEL    HT  *RNL   DEL */
-          0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F,
- /* 0x08   -GE  -SPS  -RPT    VT    FF    CR    SO    SI */
-          0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- /* 0x10   DLE   DC1   DC2   DC3  -RES   -NL    BS  -POC
-                                  -ENP  ->LF             */
-          0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07,
- /* 0x18   CAN    EM  -UBS  -CU1  -IFS  -IGS  -IRS  -ITB
-                                                    -IUS */
-          0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
- /* 0x20   -DS  -SOS    FS  -WUS  -BYP    LF   ETB   ESC
-                                  -INP                   */
-          0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B,
- /* 0x28   -SA  -SFE   -SM  -CSP  -MFA   ENQ   ACK   BEL
-                       -SW                               */ 
-          0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07,
- /* 0x30  ----  ----   SYN   -IR   -PP  -TRN  -NBS   EOT */
-          0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04,
- /* 0x38  -SBS   -IT  -RFF  -CU3   DC4   NAK  ----   SUB */
-          0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A,
- /* 0x40    SP   RSP           �ä              ----       */
-          0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86,
- /* 0x48                       .     <     (     +     | */
-          0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
- /* 0x50     &                                      ---- */
-          0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07,
- /* 0x58           �ß     !     $     *     )     ;       */
-          0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA,
- /* 0x60     -     /  ----     �Ä  ----  ----  ----       */
-          0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F,
- /* 0x68              ----     ,     %     _     >     ? */ 
-          0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
- /* 0x70  ----        ----  ----  ----  ----  ----  ---- */
-          0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
- /* 0x78     *     `     :     #     @     '     =     " */
-          0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
- /* 0x80     *     a     b     c     d     e     f     g */
-          0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
- /* 0x88     h     i              ----  ----  ----       */
-          0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1,
- /* 0x90     �°     j     k     l     m     n     o     p */
-          0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
- /* 0x98     q     r                    ----        ---- */
-          0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07,
- /* 0xA0           ~     s     t     u     v     w     x */
-          0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
- /* 0xA8     y     z              ----  ----  ----  ---- */
-          0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07,
- /* 0xB0     ^                    ----     �§  ----       */
-          0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC,
- /* 0xB8        ----     [     ]  ----  ----  ----  ---- */
-          0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07,
- /* 0xC0     {     A     B     C     D     E     F     G */
-          0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
- /* 0xC8     H     I  ----           �ö              ---- */
-          0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07,
- /* 0xD0     }     J     K     L     M     N     O     P */
-          0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
- /* 0xD8     Q     R  ----           �ü                   */
-          0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98,
- /* 0xE0     \           S     T     U     V     W     X */
-          0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
- /* 0xE8     Y     Z        ----     �Ö  ----  ----  ---- */
-          0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07,
- /* 0xF0     0     1     2     3     4     5     6     7 */
-          0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
- /* 0xF8     8     9  ----  ----     �Ü  ----  ----  ---- */
-          0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07
-};
-
-
-/*
- * ASCII (IBM PC 437)  -> EBCDIC 500
- */
-__u8 _ascebc_500[256] =
-{
- /*00 NUL   SOH   STX   ETX   EOT   ENQ   ACK   BEL */
-     0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F,
- /*08  BS    HT    LF    VT    FF    CR    SO    SI */
- /*              ->NL                               */
-     0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- /*10 DLE   DC1   DC2   DC3   DC4   NAK   SYN   ETB */
-     0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26,
- /*18 CAN    EM   SUB   ESC    FS    GS    RS    US */
- /*                               ->IGS ->IRS ->IUS */
-     0x18, 0x19, 0x3F, 0x27, 0x22, 0x1D, 0x1E, 0x1F,
- /*20  SP     !     "     #     $     %     &     ' */
-     0x40, 0x4F, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D,
- /*28   (     )     *     +     ,     -    .      / */
-     0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
- /*30   0     1     2     3     4     5     6     7 */
-     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
- /*38   8     9     :     ;     <     =     >     ? */
-     0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
- /*40   @     A     B     C     D     E     F     G */
-     0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
- /*48   H     I     J     K     L     M     N     O */
-     0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
- /*50   P     Q     R     S     T     U     V     W */
-     0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6,
- /*58   X     Y     Z     [     \     ]     ^     _ */
-     0xE7, 0xE8, 0xE9, 0x4A, 0xE0, 0x5A, 0x5F, 0x6D,
- /*60   `     a     b     c     d     e     f     g */
-     0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
- /*68   h     i     j     k     l     m     n     o */
-     0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
- /*70   p     q     r     s     t     u     v     w */
-     0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
- /*78   x     y     z     {     |     }     ~    DL */
-     0xA7, 0xA8, 0xA9, 0xC0, 0xBB, 0xD0, 0xA1, 0x07,
- /*80*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*88*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*90*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*98*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*A0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*A8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*B0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*B8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*C0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*C8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*D0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*D8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*E0        sz						*/
-     0x3F, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*E8*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*F0*/
-     0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
- /*F8*/
-     0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x3F, 0xFF
-};
-
-/*
- * EBCDIC 500 -> ASCII (IBM PC 437)
- */
-__u8 _ebcasc_500[256] =
-{
- /* 0x00   NUL   SOH   STX   ETX  *SEL    HT  *RNL   DEL */
-          0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F,
- /* 0x08   -GE  -SPS  -RPT    VT    FF    CR    SO    SI */
-          0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
- /* 0x10   DLE   DC1   DC2   DC3  -RES   -NL    BS  -POC
-                                  -ENP  ->LF             */
-          0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07,
- /* 0x18   CAN    EM  -UBS  -CU1  -IFS  -IGS  -IRS  -ITB
-                                                    -IUS */
-          0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
- /* 0x20   -DS  -SOS    FS  -WUS  -BYP    LF   ETB   ESC
-                                  -INP                   */
-          0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B,
- /* 0x28   -SA  -SFE   -SM  -CSP  -MFA   ENQ   ACK   BEL
-                       -SW                               */ 
-          0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07,
- /* 0x30  ----  ----   SYN   -IR   -PP  -TRN  -NBS   EOT */
-          0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04,
- /* 0x38  -SBS   -IT  -RFF  -CU3   DC4   NAK  ----   SUB */
-          0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A,
- /* 0x40    SP   RSP           �ä              ----       */
-          0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86,
- /* 0x48                 [     .     <     (     +     ! */
-          0x87, 0xA4, 0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21,
- /* 0x50     &                                      ---- */
-          0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07,
- /* 0x58           �ß     ]     $     *     )     ;     ^ */
-          0x8D, 0xE1, 0x5D, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
- /* 0x60     -     /  ----     �Ä  ----  ----  ----       */
-          0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F,
- /* 0x68              ----     ,     %     _     >     ? */ 
-          0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
- /* 0x70  ----        ----  ----  ----  ----  ----  ---- */
-          0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
- /* 0x78     *     `     :     #     @     '     =     " */
-          0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
- /* 0x80     *     a     b     c     d     e     f     g */
-          0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
- /* 0x88     h     i              ----  ----  ----       */
-          0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1,
- /* 0x90     �°     j     k     l     m     n     o     p */
-          0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
- /* 0x98     q     r                    ----        ---- */
-          0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07,
- /* 0xA0           ~     s     t     u     v     w     x */
-          0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
- /* 0xA8     y     z              ----  ----  ----  ---- */
-          0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07,
- /* 0xB0                          ----     �§  ----       */
-          0x9B, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC,
- /* 0xB8        ----           |  ----  ----  ----  ---- */
-          0xAB, 0x07, 0xAA, 0x7C, 0x07, 0x07, 0x07, 0x07,
- /* 0xC0     {     A     B     C     D     E     F     G */
-          0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
- /* 0xC8     H     I  ----           �ö              ---- */
-          0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07,
- /* 0xD0     }     J     K     L     M     N     O     P */
-          0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
- /* 0xD8     Q     R  ----           �ü                   */
-          0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98,
- /* 0xE0     \           S     T     U     V     W     X */
-          0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
- /* 0xE8     Y     Z        ----     �Ö  ----  ----  ---- */
-          0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07,
- /* 0xF0     0     1     2     3     4     5     6     7 */
-          0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
- /* 0xF8     8     9  ----  ----     �Ü  ----  ----  ---- */
-          0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07
-};
-
-
-/*
- * EBCDIC 037/500 conversion table:
- * from upper to lower case
- */
-__u8 _ebc_tolower[256] =
-{
-	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,
-	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-	0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
-	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-	0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
-	0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-	0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
-	0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-	0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
-	0x60, 0x61, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-	0x48, 0x49, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-	0x70, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
-	0x58, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
-	0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-	0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
-	0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-	0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9C, 0x9F,
-	0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
-	0xA8, 0xA9, 0xAA, 0xAB, 0x8C, 0x8D, 0x8E, 0xAF,
-	0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
-	0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
-	0xC0, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
-	0x88, 0x89, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-	0xD0, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
-	0x98, 0x99, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
-	0xE0, 0xE1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
-	0xA8, 0xA9, 0xEA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
-	0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-	0xF8, 0xF9, 0xFA, 0xDB, 0xDC, 0xDD, 0xDE, 0xFF
-};
-
-
-/*
- * EBCDIC 037/500 conversion table:
- * from lower to upper case
- */
-__u8 _ebc_toupper[256] =
-{
-	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,
-	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
-	0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
-	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-	0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
-	0x40, 0x41, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-	0x68, 0x69, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
-	0x50, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-	0x78, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
-	0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-	0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,
-	0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
-	0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
-	0x80, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-	0xC8, 0xC9, 0x8A, 0x8B, 0xAC, 0xAD, 0xAE, 0x8F,
-	0x90, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-	0xD8, 0xD9, 0x9A, 0x9B, 0x9E, 0x9D, 0x9E, 0x9F,
-	0xA0, 0xA1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-	0xE8, 0xE9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
-	0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
-	0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
-	0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
-	0xC8, 0xC9, 0xCA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-	0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
-	0xD8, 0xD9, 0xDA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF,
-	0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
-	0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
-	0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
-	0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF
-};
-
-EXPORT_SYMBOL_NOVERS(_ascebc_500);
-EXPORT_SYMBOL_NOVERS(_ebcasc_500);
-EXPORT_SYMBOL_NOVERS(_ascebc);
-EXPORT_SYMBOL_NOVERS(_ebcasc);
-EXPORT_SYMBOL_NOVERS(_ebc_tolower);
-EXPORT_SYMBOL_NOVERS(_ebc_toupper);
-
diff -Nru a/arch/s390x/kernel/entry.S b/arch/s390x/kernel/entry.S
--- a/arch/s390x/kernel/entry.S	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,943 +0,0 @@
-/*
- *  arch/s390/kernel/entry.S
- *    S390 low-level entry points.
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Hartmut Penner (hp@de.ibm.com),
- *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- */
-
-#include <linux/sys.h>
-#include <linux/linkage.h>
-#include <linux/config.h>
-#include <asm/cache.h>
-#include <asm/lowcore.h>
-#include <asm/errno.h>
-#include <asm/ptrace.h>
-#include <asm/thread_info.h>
-#include <asm/offsets.h>
-
-/*
- * Stack layout for the system_call stack entry.
- * The first few entries are identical to the user_regs_struct.
- */
-SP_PTREGS    =  STACK_FRAME_OVERHEAD 
-SP_PSW       =  STACK_FRAME_OVERHEAD + PT_PSWMASK
-SP_R0        =  STACK_FRAME_OVERHEAD + PT_GPR0
-SP_R1        =  STACK_FRAME_OVERHEAD + PT_GPR1
-SP_R2        =  STACK_FRAME_OVERHEAD + PT_GPR2
-SP_R3        =  STACK_FRAME_OVERHEAD + PT_GPR3
-SP_R4        =  STACK_FRAME_OVERHEAD + PT_GPR4
-SP_R5        =  STACK_FRAME_OVERHEAD + PT_GPR5
-SP_R6        =  STACK_FRAME_OVERHEAD + PT_GPR6
-SP_R7        =  STACK_FRAME_OVERHEAD + PT_GPR7
-SP_R8        =  STACK_FRAME_OVERHEAD + PT_GPR8
-SP_R9        =  STACK_FRAME_OVERHEAD + PT_GPR9
-SP_R10       =  STACK_FRAME_OVERHEAD + PT_GPR10
-SP_R11       =  STACK_FRAME_OVERHEAD + PT_GPR11
-SP_R12       =  STACK_FRAME_OVERHEAD + PT_GPR12
-SP_R13       =  STACK_FRAME_OVERHEAD + PT_GPR13
-SP_R14       =  STACK_FRAME_OVERHEAD + PT_GPR14
-SP_R15       =  STACK_FRAME_OVERHEAD + PT_GPR15
-SP_AREGS     =  STACK_FRAME_OVERHEAD + PT_ACR0
-SP_ORIG_R2   =  STACK_FRAME_OVERHEAD + PT_ORIGGPR2
-/* Now the additional entries */
-SP_TRAP      =  (SP_ORIG_R2+GPR_SIZE)
-SP_SIZE      =  (SP_TRAP+4)
-
-_TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_RESTART_SVC)
-_TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_NEED_RESCHED)
-
-/*
- * Register usage in interrupt handlers:
- *    R9  - pointer to current task structure
- *    R13 - pointer to literal pool
- *    R14 - return register for function calls
- *    R15 - kernel stack pointer
- */
-
-        .macro  SAVE_ALL psworg,sync     # system entry macro
-        stmg    %r14,%r15,__LC_SAVE_AREA
-        tm      \psworg+1,0x01           # test problem state bit
-	stam    %a2,%a4,__LC_SAVE_AREA+16
-	.if	\sync
-        jz      1f                       # skip stack setup save
-	.else
-	jnz	0f			 # from user -> load kernel stack
-	lg	%r14,__LC_ASYNC_STACK	 # are we already on the async. stack ?
-	slgr	%r14,%r15
-	srag	%r14,%r14,14
-	jz	1f
-	lg	%r15,__LC_ASYNC_STACK	 # load async. stack
-	j	1f
-	.endif
-0:	lg      %r15,__LC_KERNEL_STACK   # problem state -> load ksp
-	larl	%r14,.Lc_ac
-	lam	%a2,%a4,0(%r14)
-1:      aghi    %r15,-SP_SIZE            # make room for registers & psw
-        nill    %r15,0xfff8              # align stack pointer to 8
-        stmg    %r0,%r14,SP_R0(%r15)     # store gprs 0-14 to kernel stack
-        stg     %r2,SP_ORIG_R2(%r15)     # store original content of gpr 2
-        mvc     SP_R14(16,%r15),__LC_SAVE_AREA # move R15 to stack
-        stam    %a0,%a15,SP_AREGS(%r15)  # store access registers to kst.
-        mvc     SP_AREGS+8(12,%r15),__LC_SAVE_AREA+16 # store ac. regs
-        mvc     SP_PSW(16,%r15),\psworg  # move user PSW to stack
-        lhi     %r0,\psworg              # store trap indication
-        st      %r0,SP_TRAP(%r15)
-        xc      0(8,%r15),0(%r15)        # clear back chain
-        .endm
-
-        .macro  RESTORE_ALL sync         # system exit macro
-        mvc     __LC_RETURN_PSW(16),SP_PSW(%r15) # move user PSW to lowcore
-        lam     %a0,%a15,SP_AREGS(%r15)  # load the access registers
-        lmg     %r0,%r15,SP_R0(%r15)     # load gprs 0-15 of user
-        ni      __LC_RETURN_PSW+1,0xfd   # clear wait state bit
-        lpswe   __LC_RETURN_PSW          # back to caller
-        .endm
-
-        .macro  GET_THREAD_INFO
-	lg	%r9,__LC_KERNEL_STACK    # load pointer to task_struct to %r9
-	aghi	%r9,-16384
-        .endm
-
-
-/*
- * Scheduler resume function, called by switch_to
- *  gpr2 = (task_struct *) prev
- *  gpr3 = (task_struct *) next
- * Returns:
- *  gpr2 = prev
- */
-        .globl  resume
-resume:
-	tm	__THREAD_per+4(%r3),0xe8 # is the new process using per ?
-	jz	resume_noper		# if not we're fine
-        stctg   %c9,%c11,48(%r15)       # We are using per stuff
-        clc     __THREAD_per(24,%r3),48(%r15)
-        je      resume_noper            # we got away without bashing TLB's
-        lctlg   %c9,%c11,__THREAD_per(%r3)	# Nope we didn't
-resume_noper:
-        stmg    %r6,%r15,48(%r15)       # store resume registers of prev task
-	stg	%r15,__THREAD_ksp(%r2)	# store kernel stack to prev->tss.ksp
-	lg	%r15,__THREAD_ksp(%r3)	# load kernel stack from next->tss.ksp
-        stam    %a2,%a2,__THREAD_ar2(%r2)	# store kernel access reg. 2
-        stam    %a4,%a4,__THREAD_ar4(%r2)	# store kernel access reg. 4
-        lam     %a2,%a2,__THREAD_ar2(%r3)	# load kernel access reg. 2
-        lam     %a4,%a4,__THREAD_ar4(%r3)	# load kernel access reg. 4
-        lmg     %r6,%r15,48(%r15)       # load resume registers of next task
-	lg	%r3,__THREAD_info(%r3)  # load thread_info from task struct
-	aghi	%r3,16384
-	stg	%r3,__LC_KERNEL_STACK	# __LC_KERNEL_STACK = new kernel stack
-	br	%r14
-
-/*
- * do_softirq calling function. We want to run the softirq functions on the
- * asynchronous interrupt stack.
- */
-	.global do_call_softirq
-do_call_softirq:
-	stmg	%r12,%r15,48(%r15)
-	lgr	%r12,%r15
-	lg	%r0,__LC_ASYNC_STACK
-	slgr    %r0,%r15
-	srag	%r0,%r0,14
-	je	0f
-	lg	%r15,__LC_ASYNC_STACK
-0:	aghi	%r15,-STACK_FRAME_OVERHEAD
-	stg	%r12,0(%r15)		# store back chain
-	brasl	%r14,do_softirq
-	lmg	%r12,%r15,48(%r12)
-	br	%r14
-	
-/*
- * SVC interrupt handler routine. System calls are synchronous events and
- * are executed with interrupts enabled.
- */
-
-	.globl  system_call
-system_call:
-        SAVE_ALL __LC_SVC_OLD_PSW,1
-	llgh    %r7,__LC_SVC_INT_CODE # get svc number from lowcore
-        GET_THREAD_INFO           # load pointer to task_struct to R9
-	stosm   48(%r15),0x03     # reenable interrupts
-sysc_do_restart:
-	larl    %r10,sys_call_table
-        sll     %r7,3
-        tm      SP_PSW+3(%r15),0x01  # are we running in 31 bit mode ?
-        jo      sysc_noemu
-	la      %r10,4(%r10)      # use 31 bit emulation system calls
-sysc_noemu:
-        lgf     %r8,0(%r7,%r10)   # load address of system call routine
-	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
-        jo      sysc_tracesys
-        basr    %r14,%r8          # call sys_xxxx
-        stg     %r2,SP_R2(%r15)   # store return value (change R2 on stack)
-                                  # ATTENTION: check sys_execve_glue before
-                                  # changing anything here !!
-
-sysc_return:
-	stnsm   48(%r15),0xfc     # disable I/O and ext. interrupts
-	tm	__TI_flags+7(%r9),_TIF_WORK_SVC
-	jnz	sysc_work         # there is work to do (signals etc.)
-sysc_leave:
-        RESTORE_ALL 1
-
-#
-# recheck if there is more work to do
-#
-sysc_work_loop:
-	stnsm   48(%r15),0xfc     # disable I/O and ext. interrupts
-        GET_THREAD_INFO           # load pointer to task_struct to R9
-	tm	__TI_flags+7(%r9),_TIF_WORK_SVC
-	jz	sysc_leave        # there is no work to do
-#
-# One of the work bits is on. Find out which one.
-# Checked are: _TIF_SIGPENDING and _TIF_NEED_RESCHED
-#
-sysc_work:
-	tm	__TI_flags+7(%r9),_TIF_NEED_RESCHED
-	jo	sysc_reschedule
-	tm	__TI_flags+7(%r9),_TIF_SIGPENDING
-	jo	sysc_sigpending
-	tm	__TI_flags+7(%r9),_TIF_RESTART_SVC
-	jo	sysc_restart
-	j	sysc_leave
-
-#
-# _TIF_NEED_RESCHED is set, call schedule
-#	
-sysc_reschedule:        
-	stosm   48(%r15),0x03     # reenable interrupts
-	larl    %r14,sysc_work_loop
-        jg      schedule            # return point is sysc_return
-
-#
-# _TIF_SIGPENDING is set, call do_signal
-#
-sysc_sigpending:     
-	stosm   48(%r15),0x03     # reenable interrupts
-        la      %r2,SP_PTREGS(%r15) # load pt_regs
-        sgr     %r3,%r3           # clear *oldset
-	brasl	%r14,do_signal    # call do_signal
-	stnsm   48(%r15),0xfc     # disable I/O and ext. interrupts
-	j	sysc_leave        # out of here, do NOT recheck
-
-#
-# _TIF_RESTART_SVC is set, set up registers and restart svc
-#
-sysc_restart:
-	ni	__TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
-	stosm	48(%r15),0x03          # reenable interrupts
-	lg	%r7,SP_R2(%r15)        # load new svc number
-	mvc	SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument
-	lmg	%r2,%r6,SP_R2(%r15)    # load svc arguments
-	j	sysc_do_restart        # restart svc
-
-#
-# call syscall_trace before and after system call
-# special linkage: %r12 contains the return address for trace_svc
-#
-sysc_tracesys:
-	srl	%r7,3
-	stg     %r7,SP_R2(%r15)
-        brasl   %r14,syscall_trace
-	lghi	%r7,255           # strace might have changed the
-	ng	%r7,SP_R2(%r15)   #  the system call
-	sll     %r7,3
-	lgf	%r8,0(%r7,%r10)
-sysc_tracego:
-	lmg     %r3,%r6,SP_R3(%r15)
-	lg      %r2,SP_ORIG_R2(%r15)
-        basr    %r14,%r8            # call sys_xxx
-        stg     %r2,SP_R2(%r15)     # store return value
-	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
-        jno     sysc_return
-	larl	%r14,sysc_return    # return point is sysc_return
-	jg	syscall_trace
-
-#
-# a new process exits the kernel with ret_from_fork
-#
-        .globl  ret_from_fork
-ret_from_fork:  
-        GET_THREAD_INFO           # load pointer to task_struct to R9
-#if CONFIG_SMP || CONFIG_PREEMPT
-	larl    %r14,sysc_return
-        jg      schedule_tail     # return to sysc_return
-#else
-	j	sysc_return
-#endif
-
-#
-# clone, fork, vfork, exec and sigreturn need glue,
-# because they all expect pt_regs as parameter,
-# but are called with different parameter.
-# return-address is set up above
-#
-sys_clone_glue: 
-        la      %r2,SP_PTREGS(%r15)    # load pt_regs
-        jg      sys_clone              # branch to sys_clone
-
-#ifdef CONFIG_S390_SUPPORT
-sys32_clone_glue: 
-        la      %r2,SP_PTREGS(%r15)    # load pt_regs
-        jg      sys32_clone            # branch to sys32_clone
-#endif
-
-sys_fork_glue:  
-        la      %r2,SP_PTREGS(%r15)    # load pt_regs
-        jg      sys_fork               # branch to sys_fork
-
-sys_vfork_glue: 
-        la      %r2,SP_PTREGS(%r15)    # load pt_regs
-        jg      sys_vfork              # branch to sys_vfork
-
-sys_execve_glue:        
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs
-	lgr     %r12,%r14             # save return address
-        brasl   %r14,sys_execve       # call sys_execve
-        ltgr    %r2,%r2               # check if execve failed
-        bnz     0(%r12)               # it did fail -> store result in gpr2
-        b       6(%r12)               # SKIP STG 2,SP_R2(15) in
-                                      # system_call/sysc_tracesys
-#ifdef CONFIG_S390_SUPPORT
-sys32_execve_glue:        
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs
-	lgr     %r12,%r14             # save return address
-        brasl   %r14,sys32_execve     # call sys32_execve
-        ltgr    %r2,%r2               # check if execve failed
-        bnz     0(%r12)               # it did fail -> store result in gpr2
-        b       6(%r12)               # SKIP STG 2,SP_R2(15) in
-                                      # system_call/sysc_tracesys
-#endif
-
-sys_sigreturn_glue:     
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
-        jg      sys_sigreturn         # branch to sys_sigreturn
-
-#ifdef CONFIG_S390_SUPPORT
-sys32_sigreturn_glue:     
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
-        jg      sys32_sigreturn       # branch to sys32_sigreturn
-#endif
-
-sys_rt_sigreturn_glue:     
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
-        jg      sys_rt_sigreturn      # branch to sys_sigreturn
-
-#ifdef CONFIG_S390_SUPPORT
-sys32_rt_sigreturn_glue:     
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as parameter
-        jg      sys32_rt_sigreturn    # branch to sys32_sigreturn
-#endif
-
-#
-# sigsuspend and rt_sigsuspend need pt_regs as an additional
-# parameter and they have to skip the store of %r2 into the
-# user register %r2 because the return value was set in 
-# sigsuspend and rt_sigsuspend already and must not be overwritten!
-#
-
-sys_sigsuspend_glue:    
-        lgr     %r5,%r4               # move mask back
-        lgr     %r4,%r3               # move history1 parameter
-        lgr     %r3,%r2               # move history0 parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-	la      %r14,6(%r14)          # skip store of return value
-        jg      sys_sigsuspend        # branch to sys_sigsuspend
-
-#ifdef CONFIG_S390_SUPPORT
-sys32_sigsuspend_glue:    
-	llgfr	%r4,%r4               # unsigned long			
-        lgr     %r5,%r4               # move mask back
-	lgfr	%r3,%r3               # int			
-        lgr     %r4,%r3               # move history1 parameter
-	lgfr	%r2,%r2               # int			
-        lgr     %r3,%r2               # move history0 parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-	la      %r14,6(%r14)          # skip store of return value
-        jg      sys32_sigsuspend      # branch to sys32_sigsuspend
-#endif
-
-sys_rt_sigsuspend_glue: 
-        lgr     %r4,%r3               # move sigsetsize parameter
-        lgr     %r3,%r2               # move unewset parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-	la      %r14,6(%r14)          # skip store of return value
-        jg      sys_rt_sigsuspend     # branch to sys_rt_sigsuspend
-
-#ifdef CONFIG_S390_SUPPORT
-sys32_rt_sigsuspend_glue: 
-	llgfr	%r3,%r3               # size_t			
-        lgr     %r4,%r3               # move sigsetsize parameter
-	llgtr	%r2,%r2               # sigset_emu31_t *
-        lgr     %r3,%r2               # move unewset parameter
-        la      %r2,SP_PTREGS(%r15)   # load pt_regs as first parameter
-	la      %r14,6(%r14)          # skip store of return value
-        jg      sys32_rt_sigsuspend   # branch to sys32_rt_sigsuspend
-#endif
-
-sys_sigaltstack_glue:
-        la      %r4,SP_PTREGS(%r15)   # load pt_regs as parameter
-        jg      sys_sigaltstack       # branch to sys_sigreturn
-
-#ifdef CONFIG_S390_SUPPORT
-sys32_sigaltstack_glue:
-        la      %r4,SP_PTREGS(%r15)   # load pt_regs as parameter
-        jg      sys32_sigaltstack_wrapper # branch to sys_sigreturn
-#endif
-
-#ifdef CONFIG_S390_SUPPORT
-#define SYSCALL(esame,esa) esame,esa
-#else
-#define SYSCALL(esame,esa) esame,sys_ni_syscall
-#endif
-
-	.globl  sys_call_table	
-sys_call_table:
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 0 */
-        .long  SYSCALL(sys_exit,sys32_exit_wrapper)
-        .long  SYSCALL(sys_fork_glue,sys_fork_glue)
-        .long  SYSCALL(sys_read,sys32_read_wrapper)
-        .long  SYSCALL(sys_write,sys32_write_wrapper)
-        .long  SYSCALL(sys_open,sys32_open_wrapper)             /* 5 */
-        .long  SYSCALL(sys_close,sys32_close_wrapper)
-        .long  SYSCALL(sys_restart_syscall,sys_ni_syscall)
-        .long  SYSCALL(sys_creat,sys32_creat_wrapper)
-        .long  SYSCALL(sys_link,sys32_link_wrapper)
-        .long  SYSCALL(sys_unlink,sys32_unlink_wrapper)         /* 10 */
-        .long  SYSCALL(sys_execve_glue,sys32_execve_glue)
-        .long  SYSCALL(sys_chdir,sys32_chdir_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_time_wrapper) /* old time syscall */
-        .long  SYSCALL(sys_mknod,sys32_mknod_wrapper)
-        .long  SYSCALL(sys_chmod,sys32_chmod_wrapper)           /* 15 */
-        .long  SYSCALL(sys_ni_syscall,sys32_lchown16_wrapper)   /* old lchown16 syscall*/
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old break syscall */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old stat syscall */
-        .long  SYSCALL(sys_lseek,sys32_lseek_wrapper)
-        .long  SYSCALL(sys_getpid,sys_getpid) /* 20 */
-        .long  SYSCALL(sys_mount,sys32_mount_wrapper)
-        .long  SYSCALL(sys_oldumount,sys32_oldumount_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_setuid16_wrapper)   /* old setuid16 syscall*/
-        .long  SYSCALL(sys_ni_syscall,sys32_getuid16)   /* old getuid16 syscall*/
-        .long  SYSCALL(sys_ni_syscall,sys32_stime_wrapper) /* 25 old stime syscall */
-        .long  SYSCALL(sys_ptrace,sys32_ptrace_wrapper)
-        .long  SYSCALL(sys_alarm,sys32_alarm_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old fstat syscall */
-        .long  SYSCALL(sys_pause,sys32_pause)
-        .long  SYSCALL(sys_utime,compat_sys_utime_wrapper)           /* 30 */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old stty syscall */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old gtty syscall */
-        .long  SYSCALL(sys_access,sys32_access_wrapper)
-        .long  SYSCALL(sys_nice,sys32_nice_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old ftime syscall */
-        .long  SYSCALL(sys_sync,sys_sync)
-        .long  SYSCALL(sys_kill,sys32_kill_wrapper)
-        .long  SYSCALL(sys_rename,sys32_rename_wrapper)
-        .long  SYSCALL(sys_mkdir,sys32_mkdir_wrapper)
-        .long  SYSCALL(sys_rmdir,sys32_rmdir_wrapper)           /* 40 */
-        .long  SYSCALL(sys_dup,sys32_dup_wrapper)
-        .long  SYSCALL(sys_pipe,sys32_pipe_wrapper)
-        .long  SYSCALL(sys_times,compat_sys_times_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old prof syscall */
-        .long  SYSCALL(sys_brk,sys32_brk_wrapper)               /* 45 */
-        .long  SYSCALL(sys_ni_syscall,sys32_setgid16)   /* old setgid16 syscall*/
-        .long  SYSCALL(sys_ni_syscall,sys32_getgid16)   /* old getgid16 syscall*/
-        .long  SYSCALL(sys_signal,sys32_signal_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_geteuid16)  /* old geteuid16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys32_getegid16)  /* old getegid16 syscall */
-        .long  SYSCALL(sys_acct,sys32_acct_wrapper)
-        .long  SYSCALL(sys_umount,sys32_umount_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old lock syscall */
-        .long  SYSCALL(sys_ioctl,sys32_ioctl_wrapper)
-        .long  SYSCALL(sys_fcntl,compat_sys_fcntl_wrapper)   /* 55 */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* intel mpx syscall */
-        .long  SYSCALL(sys_setpgid,sys32_setpgid_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old ulimit syscall */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old uname syscall */
-        .long  SYSCALL(sys_umask,sys32_umask_wrapper)           /* 60 */
-        .long  SYSCALL(sys_chroot,sys32_chroot_wrapper)
-        .long  SYSCALL(sys_ustat,sys32_ustat_wrapper)
-        .long  SYSCALL(sys_dup2,sys32_dup2_wrapper)
-        .long  SYSCALL(sys_getppid,sys_getppid)
-        .long  SYSCALL(sys_getpgrp,sys_getpgrp)       /* 65 */
-        .long  SYSCALL(sys_setsid,sys_setsid)
-        .long  SYSCALL(sys_sigaction,sys32_sigaction_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old sgetmask syscall*/
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old ssetmask syscall*/
-        .long  SYSCALL(sys_ni_syscall,sys32_setreuid16_wrapper) /* old setreuid16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys32_setregid16_wrapper) /* old setregid16 syscall */
-        .long  SYSCALL(sys_sigsuspend_glue,sys32_sigsuspend_glue)
-        .long  SYSCALL(sys_sigpending,compat_sys_sigpending_wrapper)
-        .long  SYSCALL(sys_sethostname,sys32_sethostname_wrapper)
-        .long  SYSCALL(sys_setrlimit,sys32_setrlimit_wrapper)   /* 75 */
-        .long  SYSCALL(sys_getrlimit,sys32_old_getrlimit_wrapper) 
-        .long  SYSCALL(sys_getrusage,sys32_getrusage_wrapper)
-        .long  SYSCALL(sys_gettimeofday,sys32_gettimeofday_wrapper)
-        .long  SYSCALL(sys_settimeofday,sys32_settimeofday_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_getgroups16_wrapper) /* old getgroups16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys32_setgroups16_wrapper) /* old setgroups16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old select syscall */
-        .long  SYSCALL(sys_symlink,sys32_symlink_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old lstat syscall */
-        .long  SYSCALL(sys_readlink,sys32_readlink_wrapper)     /* 85 */
-        .long  SYSCALL(sys_uselib,sys32_uselib_wrapper)
-        .long  SYSCALL(sys_swapon,sys32_swapon_wrapper)
-        .long  SYSCALL(sys_reboot,sys32_reboot_wrapper)
-        .long  SYSCALL(sys_ni_syscall,old32_readdir_wrapper) /* old readdir syscall */
-        .long  SYSCALL(old_mmap,old32_mmap_wrapper)       /* 90 */
-        .long  SYSCALL(sys_munmap,sys32_munmap_wrapper)
-        .long  SYSCALL(sys_truncate,sys32_truncate_wrapper)
-        .long  SYSCALL(sys_ftruncate,sys32_ftruncate_wrapper)
-        .long  SYSCALL(sys_fchmod,sys32_fchmod_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_fchown16_wrapper)   /* old fchown16 syscall*/
-        .long  SYSCALL(sys_getpriority,sys32_getpriority_wrapper)
-        .long  SYSCALL(sys_setpriority,sys32_setpriority_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old profil syscall */
-        .long  SYSCALL(sys_statfs,compat_sys_statfs_wrapper)
-        .long  SYSCALL(sys_fstatfs,compat_sys_fstatfs_wrapper)   /* 100 */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall)
-        .long  SYSCALL(sys_socketcall,compat_sys_socketcall_wrapper)
-        .long  SYSCALL(sys_syslog,sys32_syslog_wrapper)
-        .long  SYSCALL(sys_setitimer,compat_sys_setitimer_wrapper)
-        .long  SYSCALL(sys_getitimer,compat_sys_getitimer_wrapper)   /* 105 */
-        .long  SYSCALL(sys_newstat,compat_sys_newstat_wrapper)
-        .long  SYSCALL(sys_newlstat,compat_sys_newlstat_wrapper)
-        .long  SYSCALL(sys_newfstat,compat_sys_newfstat_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old uname syscall */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* iopl for i386 */
-        .long  SYSCALL(sys_vhangup,sys_vhangup)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old "idle" system call */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* vm86old for i386 */
-        .long  SYSCALL(sys_wait4,sys32_wait4_wrapper)
-        .long  SYSCALL(sys_swapoff,sys32_swapoff_wrapper)       /* 115 */
-        .long  SYSCALL(sys_sysinfo,sys32_sysinfo_wrapper)
-        .long  SYSCALL(sys_ipc,sys32_ipc_wrapper)
-        .long  SYSCALL(sys_fsync,sys32_fsync_wrapper)
-        .long  SYSCALL(sys_sigreturn_glue,sys32_sigreturn_glue)
-        .long  SYSCALL(sys_clone_glue,sys32_clone_glue) /* 120 */
-        .long  SYSCALL(sys_setdomainname,sys32_setdomainname_wrapper)
-        .long  SYSCALL(s390x_newuname,sys32_newuname_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* modify_ldt for i386 */
-        .long  SYSCALL(sys_adjtimex,sys32_adjtimex_wrapper)
-        .long  SYSCALL(sys_mprotect,sys32_mprotect_wrapper) /* 125 */
-        .long  SYSCALL(sys_sigprocmask,compat_sys_sigprocmask_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old "create module" */
-        .long  SYSCALL(sys_init_module,sys32_init_module_wrapper)
-        .long  SYSCALL(sys_delete_module,sys32_delete_module_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 130: old get_kernel_syms */
-        .long  SYSCALL(sys_quotactl,sys32_quotactl_wrapper)
-        .long  SYSCALL(sys_getpgid,sys32_getpgid_wrapper)
-        .long  SYSCALL(sys_fchdir,sys32_fchdir_wrapper)
-        .long  SYSCALL(sys_bdflush,sys32_bdflush_wrapper)
-        .long  SYSCALL(sys_sysfs,sys32_sysfs_wrapper)           /* 135 */
-        .long  SYSCALL(s390x_personality,sys32_personality_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* for afs_syscall */
-        .long  SYSCALL(sys_ni_syscall,sys32_setfsuid16_wrapper) /* old setfsuid16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys32_setfsgid16_wrapper) /* old setfsgid16 syscall */
-        .long  SYSCALL(sys_llseek,sys32_llseek_wrapper)         /* 140 */
-        .long  SYSCALL(sys_getdents,sys32_getdents_wrapper)
-        .long  SYSCALL(sys_select,sys32_select_wrapper)
-        .long  SYSCALL(sys_flock,sys32_flock_wrapper)
-        .long  SYSCALL(sys_msync,sys32_msync_wrapper)
-        .long  SYSCALL(sys_readv,sys32_readv_wrapper)           /* 145 */
-        .long  SYSCALL(sys_writev,sys32_writev_wrapper)
-        .long  SYSCALL(sys_getsid,sys32_getsid_wrapper)
-        .long  SYSCALL(sys_fdatasync,sys32_fdatasync_wrapper)
-        .long  SYSCALL(sys_sysctl,sys32_sysctl_wrapper)
-        .long  SYSCALL(sys_mlock,sys32_mlock_wrapper)           /* 150 */
-        .long  SYSCALL(sys_munlock,sys32_munlock_wrapper)
-        .long  SYSCALL(sys_mlockall,sys32_mlockall_wrapper)
-        .long  SYSCALL(sys_munlockall,sys_munlockall)
-        .long  SYSCALL(sys_sched_setparam,sys32_sched_setparam_wrapper)
-        .long  SYSCALL(sys_sched_getparam,sys32_sched_getparam_wrapper) /* 155 */
-        .long  SYSCALL(sys_sched_setscheduler,sys32_sched_setscheduler_wrapper)
-        .long  SYSCALL(sys_sched_getscheduler,sys32_sched_getscheduler_wrapper)
-        .long  SYSCALL(sys_sched_yield,sys_sched_yield)
-        .long  SYSCALL(sys_sched_get_priority_max,sys32_sched_get_priority_max_wrapper)
-        .long  SYSCALL(sys_sched_get_priority_min,sys32_sched_get_priority_min_wrapper)
-        .long  SYSCALL(sys_sched_rr_get_interval,sys32_sched_rr_get_interval_wrapper)
-        .long  SYSCALL(sys_nanosleep,compat_sys_nanosleep_wrapper)
-        .long  SYSCALL(sys_mremap,sys32_mremap_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_setresuid16_wrapper) /* old setresuid16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys32_getresuid16_wrapper) /* old getresuid16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* for vm86 */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* old sys_query_module */
-        .long  SYSCALL(sys_poll,sys32_poll_wrapper)
-        .long  SYSCALL(sys_nfsservctl,sys32_nfsservctl_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_setresgid16_wrapper) /* old setresgid16 syscall */
-        .long  SYSCALL(sys_ni_syscall,sys32_getresgid16_wrapper) /* old getresgid16 syscall */
-        .long  SYSCALL(sys_prctl,sys32_prctl_wrapper)
-        .long  SYSCALL(sys_rt_sigreturn_glue,sys32_rt_sigreturn_glue)
-        .long  SYSCALL(sys_rt_sigaction,sys32_rt_sigaction_wrapper)
-        .long  SYSCALL(sys_rt_sigprocmask,sys32_rt_sigprocmask_wrapper) /* 175 */
-        .long  SYSCALL(sys_rt_sigpending,sys32_rt_sigpending_wrapper)
-        .long  SYSCALL(sys_rt_sigtimedwait,sys32_rt_sigtimedwait_wrapper)
-        .long  SYSCALL(sys_rt_sigqueueinfo,sys32_rt_sigqueueinfo_wrapper)
-        .long  SYSCALL(sys_rt_sigsuspend_glue,sys32_rt_sigsuspend_glue)
-        .long  SYSCALL(sys_pread64,sys32_pread64_wrapper)           /* 180 */
-        .long  SYSCALL(sys_pwrite64,sys32_pwrite64_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_chown16_wrapper)    /* old chown16 syscall */
-        .long  SYSCALL(sys_getcwd,sys32_getcwd_wrapper)
-        .long  SYSCALL(sys_capget,sys32_capget_wrapper)
-        .long  SYSCALL(sys_capset,sys32_capset_wrapper)         /* 185 */
-        .long  SYSCALL(sys_sigaltstack_glue,sys32_sigaltstack_glue)
-        .long  SYSCALL(sys_sendfile,sys32_sendfile_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* streams1 */
-        .long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* streams2 */
-        .long  SYSCALL(sys_vfork_glue,sys_vfork_glue) /* 190 */
-        .long  SYSCALL(sys_getrlimit,sys32_getrlimit_wrapper)
-	.long  SYSCALL(sys_mmap2,sys32_mmap2_wrapper)
-	.long  SYSCALL(sys_ni_syscall,sys32_truncate64_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_ftruncate64_wrapper)
-        .long  SYSCALL(sys_ni_syscall,sys32_stat64_wrapper)     /* 195 */
-        .long  SYSCALL(sys_ni_syscall,sys32_lstat64_wrapper)   
-        .long  SYSCALL(sys_ni_syscall,sys32_fstat64_wrapper)    
-	.long  SYSCALL(sys_lchown,sys32_lchown_wrapper)
-	.long  SYSCALL(sys_getuid,sys_getuid)
-	.long  SYSCALL(sys_getgid,sys_getgid)         /* 200 */
-	.long  SYSCALL(sys_geteuid,sys_geteuid)
-	.long  SYSCALL(sys_getegid,sys_getegid)
-	.long  SYSCALL(sys_setreuid,sys32_setreuid_wrapper)
-	.long  SYSCALL(sys_setregid,sys32_setregid_wrapper)
-	.long  SYSCALL(sys_getgroups,sys32_getgroups_wrapper)  /* 205 */
-	.long  SYSCALL(sys_setgroups,sys32_setgroups_wrapper)
-	.long  SYSCALL(sys_fchown,sys32_fchown_wrapper)
-	.long  SYSCALL(sys_setresuid,sys32_setresuid_wrapper)
-	.long  SYSCALL(sys_getresuid,sys32_getresuid_wrapper)
-	.long  SYSCALL(sys_setresgid,sys32_setresgid_wrapper)  /* 210 */
-	.long  SYSCALL(sys_getresgid,sys32_getresgid_wrapper)
-	.long  SYSCALL(sys_chown,sys32_chown_wrapper)
-	.long  SYSCALL(sys_setuid,sys32_setuid_wrapper)
-	.long  SYSCALL(sys_setgid,sys32_setgid_wrapper)
-	.long  SYSCALL(sys_setfsuid,sys32_setfsuid_wrapper)   /* 215 */
-	.long  SYSCALL(sys_setfsgid,sys32_setfsgid_wrapper)
-        .long  SYSCALL(sys_pivot_root,sys32_pivot_root_wrapper)
-        .long  SYSCALL(sys_mincore,sys32_mincore_wrapper)
-        .long  SYSCALL(sys_madvise,sys32_madvise_wrapper)
-	.long  SYSCALL(sys_getdents64,sys32_getdents64_wrapper)/* 220 */
-	.long  SYSCALL(sys_ni_syscall,compat_sys_fcntl64_wrapper)
-	.long  SYSCALL(sys_readahead,sys32_readahead)
-	.long  SYSCALL(sys_ni_syscall,sys32_sendfile64)
-	.long  SYSCALL(sys_setxattr,sys32_setxattr_wrapper)
-	.long  SYSCALL(sys_lsetxattr,sys32_lsetxattr_wrapper)	/* 225 */
-	.long  SYSCALL(sys_fsetxattr,sys32_fsetxattr_wrapper)
-	.long  SYSCALL(sys_getxattr,sys32_getxattr_wrapper)
-	.long  SYSCALL(sys_lgetxattr,sys32_lgetxattr_wrapper)
-	.long  SYSCALL(sys_fgetxattr,sys32_fgetxattr_wrapper)
-	.long  SYSCALL(sys_listxattr,sys32_listxattr_wrapper)	/* 230 */
-	.long  SYSCALL(sys_llistxattr,sys32_llistxattr_wrapper)
-	.long  SYSCALL(sys_flistxattr,sys32_flistxattr_wrapper)
-	.long  SYSCALL(sys_removexattr,sys32_removexattr_wrapper)
-	.long  SYSCALL(sys_lremovexattr,sys32_lremovexattr_wrapper)
-	.long  SYSCALL(sys_fremovexattr,sys32_fremovexattr_wrapper) /* 235 */
-	.long  SYSCALL(sys_gettid,sys_gettid)
-	.long  SYSCALL(sys_tkill,sys_tkill)
-	.long  SYSCALL(sys_futex,compat_sys_futex_wrapper)
-	.long  SYSCALL(sys_sched_setaffinity,sys32_sched_setaffinity_wrapper)
-	.long  SYSCALL(sys_sched_getaffinity,sys32_sched_getaffinity_wrapper) /* 240 */
-	.long  SYSCALL(sys_ni_syscall,sys_ni_syscall)
-	.long  SYSCALL(sys_ni_syscall,sys_ni_syscall) /* reserved for TUX */
-	.long  SYSCALL(sys_io_setup,sys_ni_syscall)
-	.long  SYSCALL(sys_io_destroy,sys_ni_syscall)
-	.long  SYSCALL(sys_io_getevents,sys_ni_syscall)       /* 245 */
-	.long  SYSCALL(sys_io_submit,sys_ni_syscall)
-	.long  SYSCALL(sys_io_cancel,sys_ni_syscall)
-	.long  SYSCALL(sys_exit_group,sys32_exit_group_wrapper)
-	.long  SYSCALL(sys_epoll_create,sys_ni_syscall)
-	.long  SYSCALL(sys_epoll_ctl,sys_ni_syscall)
-	.long  SYSCALL(sys_epoll_wait,sys_ni_syscall)
-	.long  SYSCALL(sys_set_tid_address,sys32_set_tid_address_wrapper)
-	.long  SYSCALL(sys_fadvise64,sys_ni_syscall)
-        .rept  255-253
-	.long  SYSCALL(sys_ni_syscall,sys_ni_syscall)
-	.endr
-
-/*
- * Program check handler routine
- */
-
-        .globl  pgm_check_handler
-pgm_check_handler:
-/*
- * First we need to check for a special case:
- * Single stepping an instruction that disables the PER event mask will
- * cause a PER event AFTER the mask has been set. Example: SVC or LPSW.
- * For a single stepped SVC the program check handler gets control after
- * the SVC new PSW has been loaded. But we want to execute the SVC first and
- * then handle the PER event. Therefore we update the SVC old PSW to point
- * to the pgm_check_handler and branch to the SVC handler after we checked
- * if we have to load the kernel stack register.
- * For every other possible cause for PER event without the PER mask set
- * we just ignore the PER event (FIXME: is there anything we have to do
- * for LPSW?).
- */
-        tm      __LC_PGM_INT_CODE+1,0x80 # check whether we got a per exception
-        jnz     pgm_per                  # got per exception -> special case
-	SAVE_ALL __LC_PGM_OLD_PSW,1
-	lghi	%r8,0x7f
-	lgf     %r3,__LC_PGM_ILC	 # load program interruption code
-	ngr	%r8,%r3
-        sll     %r8,3
-	GET_THREAD_INFO
-	stosm   48(%r15),0x03            # reenable interrupts
-        larl    %r1,pgm_check_table
-        lg      %r1,0(%r8,%r1)		 # load address of handler routine
-        la      %r2,SP_PTREGS(%r15)	 # address of register-save area
-	larl	%r14,sysc_return
-        br      %r1			 # branch to interrupt-handler
-
-#
-# handle per exception
-#
-pgm_per:
-        tm      __LC_PGM_OLD_PSW,0x40    # test if per event recording is on
-        jnz     pgm_per_std              # ok, normal per event from user space
-# ok its one of the special cases, now we need to find out which one
-        clc     __LC_PGM_OLD_PSW(16),__LC_SVC_NEW_PSW
-        je      pgm_svcper
-# no interesting special case, ignore PER event
-	lpswe   __LC_PGM_OLD_PSW
-
-#
-# Normal per exception
-#
-pgm_per_std:
-	SAVE_ALL __LC_PGM_OLD_PSW,1
-	GET_THREAD_INFO
-	lghi    %r4,0x7f
-	lgf     %r3,__LC_PGM_ILC	 # load program interruption code
-	stosm   48(%r15),0x03            # reenable interrupts
-        nr      %r4,%r3			 # clear per-event-bit and ilc
-        je      pgm_per_only		 # only per of per+check ?
-        sll     %r4,3
-        larl    %r1,pgm_check_table
-        lg      %r1,0(%r4,%r1)		 # load address of handler routine
-        la      %r2,SP_PTREGS(%r15)	 # address of register-save area
-        basr    %r14,%r1		 # branch to interrupt-handler
-pgm_per_only:
-        la      %r2,SP_PTREGS(15)	 # address of register-save area
-        larl    %r14,sysc_return	 # load adr. of system return
-        jg      handle_per_exception
-
-#
-# it was a single stepped SVC that is causing all the trouble
-#
-pgm_svcper:
-	SAVE_ALL __LC_SVC_OLD_PSW,1
-	llgh    %r8,__LC_SVC_INT_CODE # get svc number from lowcore
-        GET_THREAD_INFO           # load pointer to task_struct to R9
-	stosm   48(%r15),0x03     # reenable interrupts
-	larl    %r7,sys_call_table
-        sll     %r8,3
-        tm      SP_PSW+3(%r15),0x01  # are we running in 31 bit mode ?
-        jo      pgm_svcper_noemu
-	la      %r7,4(%r8)        # use 31 bit emulation system calls
-pgm_svcper_noemu:
-        lgf     %r8,0(%r8,%r7)    # load address of system call routine
-	tm	__TI_flags+3(%r9),_TIF_SYSCALL_TRACE
-        jo      pgm_tracesys
-        basr    %r14,%r8          # call sys_xxxx
-        stg     %r2,SP_R2(%r15)   # store return value (change R2 on stack)
-                                  # ATTENTION: check sys_execve_glue before
-                                  # changing anything here !!
-
-pgm_svcret:
-	tm	__TI_flags+3(%r9),_TIF_SIGPENDING
-	jo	pgm_svcper_nosig
-        la      %r2,SP_PTREGS(%r15) # load pt_regs
-        sgr     %r3,%r3             # clear *oldset
-	brasl	%r14,do_signal
-	
-pgm_svcper_nosig:
-	lhi     %r0,__LC_PGM_OLD_PSW     # set trap indication back to pgm_chk
-	st      %r0,SP_TRAP(%r15)
-        la      %r2,SP_PTREGS(15) # address of register-save area
-        larl    %r14,sysc_return  # load adr. of system return
-        jg      handle_per_exception
-#
-# call trace before and after sys_call
-#
-pgm_tracesys:
-	lghi    %r0,-ENOSYS
-	stg     %r0,SP_R2(%r15)     # give sysc_trace an -ENOSYS retval
-        brasl   %r14,syscall_trace
-	lg      %r2,SP_R2(%r15)
-	cghi	%r2,256
-	jnl     pgm_svc_go
-	sllg    %r2,%r2,3           # strace wants to change the syscall
-	lgf	%r8,0(%r2,%r7)
-pgm_svc_go:
-	lmg     %r3,%r6,SP_R3(%r15)
-	lg      %r2,SP_ORIG_R2(%r15)
-        basr    %r14,%r8            # call sys_xxx
-        stg     %r2,SP_R2(%r15)     # store return value
-	tm	__TI_flags+7(%r9),_TIF_SYSCALL_TRACE
-        jno     pgm_svcret
-	larl	%r14,pgm_svcret     # return point is sysc_return
-	jg	syscall_trace
-
-/*
- * IO interrupt handler routine
- */
-        .globl io_int_handler
-io_int_handler:
-        SAVE_ALL __LC_IO_OLD_PSW,0
-        GET_THREAD_INFO                # load pointer to task_struct to R9
-        la      %r2,SP_PTREGS(%r15)    # address of register-save area
-	llgh    %r3,__LC_SUBCHANNEL_NR # load subchannel number
-        llgf    %r4,__LC_IO_INT_PARM   # load interruption parm
-        llgf    %r5,__LC_IO_INT_WORD   # load interruption word
-	brasl   %r14,do_IRQ            # call standard irq handler
-
-io_return:
-        tm      SP_PSW+1(%r15),0x01    # returning to user ?
-#ifdef CONFIG_PREEMPT
-	jno     io_preempt             # no -> check for preemptive scheduling
-#else
-        jno     io_leave               # no-> skip resched & signal
-#endif
-	tm	__TI_flags+7(%r9),_TIF_WORK_INT
-	jnz	io_work                # there is work to do (signals etc.)
-io_leave:
-        RESTORE_ALL 0
-
-#ifdef CONFIG_PREEMPT
-io_preempt:
-	icm	%r0,15,__TI_precount(%r9)	
-	jnz     io_leave
-io_resume_loop:
-	tm	__TI_flags+7(%r9),_TIF_NEED_RESCHED
-	jno	io_leave
-	larl    %r1,.Lc_pactive
-	mvc     __TI_precount(4,%r9),0(%r1)
-	# hmpf, we are on the async. stack but to call schedule
-	# we have to move the interrupt frame to the process stack
-	lg	%r1,SP_R15(%r15)
-	aghi	%r1,-SP_SIZE
-	nill	%r1,0xfff8
-	mvc	SP_PTREGS(SP_SIZE-SP_PTREGS,%r1),SP_PTREGS(%r15)
-        xc      0(8,%r1),0(%r1)        # clear back chain
-	lgr	%r15,%r1
-        stosm   48(%r15),0x03          # reenable interrupts
-	brasl   %r14,schedule          # call schedule
-        stnsm   48(%r15),0xfc          # disable I/O and ext. interrupts
-        GET_THREAD_INFO                # load pointer to task_struct to R9
-	xc      __TI_precount(4,%r9),__TI_precount(%r9)
-	j	io_resume_loop
-#endif
-
-#
-# recheck if there is more work to do
-#
-io_work_loop:
-        stnsm   48(%r15),0xfc          # disable I/O and ext. interrupts
-        GET_THREAD_INFO                # load pointer to task_struct to R9
-	tm	__TI_flags+7(%r9),_TIF_WORK_INT
-	jz	io_leave               # there is no work to do
-#
-# One of the work bits is on. Find out which one.
-# Checked are: _TIF_SIGPENDING and _TIF_NEED_RESCHED
-#
-io_work:
-	tm	__TI_flags+7(%r9),_TIF_NEED_RESCHED
-	jo	io_reschedule
-	tm	__TI_flags+7(%r9),_TIF_SIGPENDING
-	jo	io_sigpending
-	j	io_leave
-
-#
-# _TIF_NEED_RESCHED is set, call schedule
-#	
-io_reschedule:        
-        stosm   48(%r15),0x03       # reenable interrupts
-	larl    %r14,io_work_loop
-        jg      schedule            # call scheduler
-
-#
-# _TIF_SIGPENDING is set, call do_signal
-#
-io_sigpending:     
-        stosm   48(%r15),0x03       # reenable interrupts
-        la      %r2,SP_PTREGS(%r15) # load pt_regs
-        slgr    %r3,%r3             # clear *oldset
-	brasl	%r14,do_signal      # call do_signal
-        stnsm   48(%r15),0xfc       # disable I/O and ext. interrupts
-	j	sysc_leave          # out of here, do NOT recheck
-
-/*
- * External interrupt handler routine
- */
-        .globl  ext_int_handler
-ext_int_handler:
-        SAVE_ALL __LC_EXT_OLD_PSW,0
-        GET_THREAD_INFO                # load pointer to task_struct to R9
-	llgh	%r6,__LC_EXT_INT_CODE  # get interruption code
-	lgr	%r1,%r6		       # calculate index = code & 0xff
-	nill	%r1,0xff
-	sll	%r1,3
-	larl	%r7,ext_int_hash
-	lg	%r7,0(%r1,%r7)	       # get first list entry for hash value
-	ltgr	%r7,%r7		       # == NULL ?
-	jz	io_return	       # yes, nothing to do, exit
-ext_int_loop:
-	ch	%r6,16(%r7)	       # compare external interrupt code
-	jne	ext_int_next
-	lg	%r1,8(%r7)	       # get handler address
-	la	%r2,SP_PTREGS(%r15)    # address of register-save area
-	lgr	%r3,%r6		       # interruption code
-	basr	%r14,%r1	       # call handler
-ext_int_next:
-	lg	%r7,0(%r7)	       # next list entry
-	ltgr	%r7,%r7
-	jnz	ext_int_loop
-	j	io_return
-
-/*
- * Machine check handler routines
- */
-        .globl mcck_int_handler
-mcck_int_handler:
-        SAVE_ALL __LC_MCK_OLD_PSW,0
-	brasl   %r14,s390_do_machine_check
-mcck_return:
-        RESTORE_ALL 0
-
-#ifdef CONFIG_SMP
-/*
- * Restart interruption handler, kick starter for additional CPUs
- */
-        .globl restart_int_handler
-restart_int_handler:
-        lg      %r15,__LC_SAVE_AREA+120 # load ksp
-        lghi    %r10,__LC_CREGS_SAVE_AREA
-        lctlg   %c0,%c15,0(%r10) # get new ctl regs
-        lghi    %r10,__LC_AREGS_SAVE_AREA
-        lam     %a0,%a15,0(%r10)
-        stosm   0(%r15),0x04           # now we can turn dat on
-        lmg     %r6,%r15,48(%r15)      # load registers from clone
-	jg      start_secondary
-#else
-/*
- * If we do not run with SMP enabled, let the new CPU crash ...
- */
-        .globl restart_int_handler
-restart_int_handler:
-        basr    %r1,0
-restart_base:
-        lpswe   restart_crash-restart_base(%r1)
-        .align 8
-restart_crash:
-        .long  0x000a0000,0x00000000,0x00000000,0x00000000
-restart_go:
-#endif
-
-/*
- * Integer constants
- */
-               .align 4
-.Lc_ac:        .long  0,0,1
-.Lc_pactive:   .long  PREEMPT_ACTIVE
-.Lc256:        .quad  256
diff -Nru a/arch/s390x/kernel/exec32.c b/arch/s390x/kernel/exec32.c
--- a/arch/s390x/kernel/exec32.c	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,93 +0,0 @@
-/*
- * Support for 32-bit Linux for S390 ELF binaries.
- *
- * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- * Author(s): Gerhard Tonn (ton@de.ibm.com)
- *
- * Separated from binfmt_elf32.c to reduce exports for module enablement.
- *
- */
-
-#include <linux/config.h>
-#include <linux/slab.h>
-#include <linux/file.h>
-#include <linux/mman.h>
-#include <linux/a.out.h>
-#include <linux/stat.h>
-#include <linux/fcntl.h>
-#include <linux/smp_lock.h>
-#include <linux/init.h>
-#include <linux/pagemap.h>
-#include <linux/highmem.h>
-#include <linux/spinlock.h>
-#include <linux/binfmts.h>
-#include <linux/module.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
-#include <asm/mmu_context.h>
-
-#ifdef CONFIG_KMOD
-#include <linux/kmod.h>
-#endif
-
-
-extern void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long address);
-
-#undef STACK_TOP
-#define STACK_TOP TASK31_SIZE
-
-int setup_arg_pages32(struct linux_binprm *bprm)
-{
-	unsigned long stack_base;
-	struct vm_area_struct *mpnt;
-	struct mm_struct *mm = current->mm;
-	int i;
-
-	stack_base = STACK_TOP - MAX_ARG_PAGES*PAGE_SIZE;
-	mm->arg_start = bprm->p + stack_base;
-
-	bprm->p += stack_base;
-	if (bprm->loader)
-		bprm->loader += stack_base;
-	bprm->exec += stack_base;
-
-	mpnt = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
-	if (!mpnt) 
-		return -ENOMEM; 
-	
-	if (!vm_enough_memory((STACK_TOP - (PAGE_MASK & (unsigned long) bprm->p))>>PAGE_SHIFT)) {
-		kmem_cache_free(vm_area_cachep, mpnt);
-		return -ENOMEM;
-	}
-
-	down_write(&mm->mmap_sem);
-	{
-		mpnt->vm_mm = mm;
-		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
-		mpnt->vm_end = STACK_TOP;
-		mpnt->vm_page_prot = PAGE_COPY;
-		mpnt->vm_flags = VM_STACK_FLAGS;
-		mpnt->vm_ops = NULL;
-		mpnt->vm_pgoff = 0;
-		mpnt->vm_file = NULL;
-		INIT_LIST_HEAD(&mpnt->shared);
-		mpnt->vm_private_data = (void *) 0;
-		insert_vm_struct(mm, mpnt);
-		mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
-	} 
-
-	for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
-		struct page *page = bprm->page[i];
-		if (page) {
-			bprm->page[i] = NULL;
-			put_dirty_page(current,page,stack_base);
-		}
-		stack_base += PAGE_SIZE;
-	}
-	up_write(&mm->mmap_sem);
-	
-	return 0;
-}
-
-EXPORT_SYMBOL(setup_arg_pages32);
diff -Nru a/arch/s390x/kernel/exec_domain32.c b/arch/s390x/kernel/exec_domain32.c
--- a/arch/s390x/kernel/exec_domain32.c	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,30 +0,0 @@
-/*
- * Support for 32-bit Linux for S390 personality.
- *
- * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- * Author(s): Gerhard Tonn (ton@de.ibm.com)
- *
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/personality.h>
-#include <linux/sched.h>
-
-struct exec_domain s390_exec_domain;
-
-static int __init
-s390_init (void)
-{
-	s390_exec_domain.name = "Linux/s390";
-	s390_exec_domain.handler = NULL;
-	s390_exec_domain.pers_low = PER_LINUX32;
-	s390_exec_domain.pers_high = PER_LINUX32;
-	s390_exec_domain.signal_map = default_exec_domain.signal_map;
-	s390_exec_domain.signal_invmap = default_exec_domain.signal_invmap;
-	register_exec_domain(&s390_exec_domain);
-	return 0;
-}
-
-__initcall(s390_init);
diff -Nru a/arch/s390x/kernel/gdb-stub.c b/arch/s390x/kernel/gdb-stub.c
--- a/arch/s390x/kernel/gdb-stub.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,575 +0,0 @@
-/*
- *  arch/s390/kernel/gdb-stub.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *
- *  Originally written by Glenn Engel, Lake Stevens Instrument Division
- *
- *  Contributed by HP Systems
- *
- *  Modified for SPARC by Stu Grossman, Cygnus Support.
- *
- *  Modified for Linux/MIPS (and MIPS in general) by Andreas Busse
- *  Send complaints, suggestions etc. to <andy@waldorf-gmbh.de>
- *
- *  Copyright (C) 1995 Andreas Busse
- */
-
-/*
- *  To enable debugger support, two things need to happen.  One, a
- *  call to set_debug_traps() is necessary in order to allow any breakpoints
- *  or error conditions to be properly intercepted and reported to gdb.
- *  Two, a breakpoint needs to be generated to begin communication.  This
- *  is most easily accomplished by a call to breakpoint().  Breakpoint()
- *  simulates a breakpoint by executing a BREAK instruction.
- *
- *
- *    The following gdb commands are supported:
- *
- * command          function                               Return value
- *
- *    g             return the value of the CPU registers  hex data or ENN
- *    G             set the value of the CPU registers     OK or ENN
- *
- *    mAA..AA,LLLL  Read LLLL bytes at address AA..AA      hex data or ENN
- *    MAA..AA,LLLL: Write LLLL bytes at address AA.AA      OK or ENN
- *
- *    c             Resume at current address              SNN   ( signal NN)
- *    cAA..AA       Continue at address AA..AA             SNN
- *
- *    s             Step one instruction                   SNN
- *    sAA..AA       Step one instruction from AA..AA       SNN
- *
- *    k             kill
- *
- *    ?             What was the last sigval ?             SNN   (signal NN)
- *
- *
- * All commands and responses are sent with a packet which includes a
- * checksum.  A packet consists of
- *
- * $<packet info>#<checksum>.
- *
- * where
- * <packet info> :: <characters representing the command or response>
- * <checksum>    :: < two hex digits computed as modulo 256 sum of <packetinfo>>
- *
- * When a packet is received, it is first acknowledged with either '+' or '-'.
- * '+' indicates a successful transfer.  '-' indicates a failed transfer.
- *
- * Example:
- *
- * Host:                  Reply:
- * $m0,10#2a               +$00010203040506070809101112131415#42
- *
- */
-
-#include <asm/gdb-stub.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-
-
-/*
- * external low-level support routines
- */
-
-extern int putDebugChar(char c);    /* write a single character      */
-extern char getDebugChar(void);     /* read and return a single char */
-extern void fltr_set_mem_err(void);
-extern void trap_low(void);
-
-/*
- * breakpoint and test functions
- */
-extern void breakpoint(void);
-extern void breakinst(void);
-
-/*
- * local prototypes
- */
-
-static void getpacket(char *buffer);
-static void putpacket(char *buffer);
-static int hex(unsigned char ch);
-static int hexToInt(char **ptr, int *intValue);
-static unsigned char *mem2hex(char *mem, char *buf, int count, int may_fault);
-
-
-/*
- * BUFMAX defines the maximum number of characters in inbound/outbound buffers
- * at least NUMREGBYTES*2 are needed for register packets
- */
-#define BUFMAX 2048
-
-static char input_buffer[BUFMAX];
-static char output_buffer[BUFMAX];
-int gdb_stub_initialised = FALSE;	
-static const char hexchars[]="0123456789abcdef";
-
-
-/*
- * Convert ch from a hex digit to an int
- */
-static int hex(unsigned char ch)
-{
-	if (ch >= 'a' && ch <= 'f')
-		return ch-'a'+10;
-	if (ch >= '0' && ch <= '9')
-		return ch-'0';
-	if (ch >= 'A' && ch <= 'F')
-		return ch-'A'+10;
-	return -1;
-}
-
-/*
- * scan for the sequence $<data>#<checksum>
- */
-static void getpacket(char *buffer)
-{
-	unsigned char checksum;
-	unsigned char xmitcsum;
-	int i;
-	int count;
-	unsigned char ch;
-
-	do {
-		/*
-		 * wait around for the start character,
-		 * ignore all other characters
-		 */
-		while ((ch = (getDebugChar() & 0x7f)) != '$') ;
-
-		checksum = 0;
-		xmitcsum = -1;
-		count = 0;
-	
-		/*
-		 * now, read until a # or end of buffer is found
-		 */
-		while (count < BUFMAX) {
-			ch = getDebugChar() & 0x7f;
-			if (ch == '#')
-				break;
-			checksum = checksum + ch;
-			buffer[count] = ch;
-			count = count + 1;
-		}
-
-		if (count >= BUFMAX)
-			continue;
-
-		buffer[count] = 0;
-
-		if (ch == '#') {
-			xmitcsum = hex(getDebugChar() & 0x7f) << 4;
-			xmitcsum |= hex(getDebugChar() & 0x7f);
-
-			if (checksum != xmitcsum)
-				putDebugChar('-');	/* failed checksum */
-			else {
-				putDebugChar('+'); /* successful transfer */
-
-				/*
-				 * if a sequence char is present,
-				 * reply the sequence ID
-				 */
-				if (buffer[2] == ':') {
-					putDebugChar(buffer[0]);
-					putDebugChar(buffer[1]);
-
-					/*
-					 * remove sequence chars from buffer
-					 */
-					count = strlen(buffer);
-					for (i=3; i <= count; i++)
-						buffer[i-3] = buffer[i];
-				}
-			}
-		}
-	}
-	while (checksum != xmitcsum);
-}
-
-/*
- * send the packet in buffer.
- */
-static void putpacket(char *buffer)
-{
-	unsigned char checksum;
-	int count;
-	unsigned char ch;
-
-	/*
-	 * $<packet info>#<checksum>.
-	 */
-
-	do {
-		putDebugChar('$');
-		checksum = 0;
-		count = 0;
-
-		while ((ch = buffer[count]) != 0) {
-			if (!(putDebugChar(ch)))
-				return;
-			checksum += ch;
-			count += 1;
-		}
-
-		putDebugChar('#');
-		putDebugChar(hexchars[checksum >> 4]);
-		putDebugChar(hexchars[checksum & 0xf]);
-
-	}
-	while ((getDebugChar() & 0x7f) != '+');
-}
-
-
-
-/*
- * Convert the memory pointed to by mem into hex, placing result in buf.
- * Return a pointer to the last char put in buf (null), in case of mem fault,
- * return 0.
- * If MAY_FAULT is non-zero, then we will handle memory faults by returning
- * a 0, else treat a fault like any other fault in the stub.
- */
-static unsigned char *mem2hex(char *mem, char *buf, int count, int may_fault)
-{
-	unsigned char ch;
-
-/*	set_mem_fault_trap(may_fault); */
-
-	while (count-- > 0) {
-		ch = *(mem++);
-		if (mem_err)
-			return 0;
-		*buf++ = hexchars[ch >> 4];
-		*buf++ = hexchars[ch & 0xf];
-	}
-
-	*buf = 0;
-
-/*	set_mem_fault_trap(0); */
-
-	return buf;
-}
-
-/*
- * convert the hex array pointed to by buf into binary to be placed in mem
- * return a pointer to the character AFTER the last byte written
- */
-static char *hex2mem(char *buf, char *mem, int count, int may_fault)
-{
-	int i;
-	unsigned char ch;
-
-/*	set_mem_fault_trap(may_fault); */
-
-	for (i=0; i<count; i++)
-	{
-		ch = hex(*buf++) << 4;
-		ch |= hex(*buf++);
-		*(mem++) = ch;
-		if (mem_err)
-			return 0;
-	}
-
-/*	set_mem_fault_trap(0); */
-
-	return mem;
-}
-
-
-
-/*
- * Set up exception handlers for tracing and breakpoints
- */
-void set_debug_traps(void)
-{
-//	unsigned long flags;
-	unsigned char c;
-
-//	save_and_cli(flags);
-	/*
-	 * In case GDB is started before us, ack any packets
-	 * (presumably "$?#xx") sitting there.
-	 */
-	while((c = getDebugChar()) != '$');
-	while((c = getDebugChar()) != '#');
-	c = getDebugChar(); /* eat first csum byte */
-	c = getDebugChar(); /* eat second csum byte */
-	putDebugChar('+'); /* ack it */
-
-	gdb_stub_initialised = TRUE;
-//	restore_flags(flags);
-}
-
-
-/*
- * Trap handler for memory errors.  This just sets mem_err to be non-zero.  It
- * assumes that %l1 is non-zero.  This should be safe, as it is doubtful that
- * 0 would ever contain code that could mem fault.  This routine will skip
- * past the faulting instruction after setting mem_err.
- */
-extern void fltr_set_mem_err(void)
-{
-  /* FIXME: Needs to be written... */
-}
-
-
-/*
- * While we find nice hex chars, build an int.
- * Return number of chars processed.
- */
-static int hexToInt(char **ptr, int *intValue)
-{
-	int numChars = 0;
-	int hexValue;
-
-	*intValue = 0;
-
-	while (**ptr)
-	{
-		hexValue = hex(**ptr);
-		if (hexValue < 0)
-			break;
-
-		*intValue = (*intValue << 4) | hexValue;
-		numChars ++;
-
-		(*ptr)++;
-	}
-
-	return (numChars);
-}
-
-void gdb_stub_get_non_pt_regs(gdb_pt_regs *regs)
-{
-	s390_fp_regs *fpregs=&regs->fp_regs;
-	int has_ieee=save_fp_regs1(fpregs);
-
-	if(!has_ieee)
-	{
-		fpregs->fpc=0;
-		fpregs->fprs[1].d=
-		fpregs->fprs[3].d=
-		fpregs->fprs[5].d=
-		fpregs->fprs[7].d=0;
-		memset(&fpregs->fprs[8].d,0,sizeof(freg_t)*8);
-	}
-}
-
-void gdb_stub_set_non_pt_regs(gdb_pt_regs *regs)
-{
-	restore_fp_regs1(&regs->fp_regs);
-}
-
-void gdb_stub_send_signal(int sigval)
-{
-	char *ptr;
-	ptr = output_buffer;
-
-	/*
-	 * Send trap type (converted to signal)
-	 */
-	*ptr++ = 'S';
-	*ptr++ = hexchars[sigval >> 4];
-	*ptr++ = hexchars[sigval & 0xf];
-	*ptr++ = 0;
-	putpacket(output_buffer);	/* send it off... */
-}
-
-/*
- * This function does all command processing for interfacing to gdb.  It
- * returns 1 if you should skip the instruction at the trap address, 0
- * otherwise.
- */
-void gdb_stub_handle_exception(gdb_pt_regs *regs,int sigval)
-{
-	int trap;			/* Trap type */
-	int addr;
-	int length;
-	char *ptr;
-	unsigned long *stack;
-
-	
-	/*
-	 * reply to host that an exception has occurred
-	 */
-	send_signal(sigval);
-
-	/*
-	 * Wait for input from remote GDB
-	 */
-	while (1) {
-		output_buffer[0] = 0;
-		getpacket(input_buffer);
-
-		switch (input_buffer[0])
-		{
-		case '?':
-			send_signal(sigval);
-			continue;
-
-		case 'd':
-			/* toggle debug flag */
-			break;
-
-		/*
-		 * Return the value of the CPU registers
-		 */
-		case 'g':
-			gdb_stub_get_non_pt_regs(regs);
-			ptr = output_buffer;
-			ptr=  mem2hex((char *)regs,ptr,sizeof(s390_regs_common),FALSE);
-			ptr=  mem2hex((char *)&regs->crs[0],ptr,NUM_CRS*CR_SIZE,FALSE);
-			ptr = mem2hex((char *)&regs->fp_regs, ptr,sizeof(s390_fp_regs));
-			break;
-	  
-		/*
-		 * set the value of the CPU registers - return OK
-		 * FIXME: Needs to be written
-		 */
-		case 'G':
-			ptr=input_buffer;
-			hex2mem (ptr, (char *)regs,sizeof(s390_regs_common), FALSE);
-			ptr+=sizeof(s390_regs_common)*2;
-			hex2mem (ptr, (char *)regs->crs[0],NUM_CRS*CR_SIZE, FALSE);
-			ptr+=NUM_CRS*CR_SIZE*2;
-			hex2mem (ptr, (char *)regs->fp_regs,sizeof(s390_fp_regs), FALSE);
-			gdb_stub_set_non_pt_regs(regs);
-			strcpy(output_buffer,"OK");
-		break;
-
-		/*
-		 * mAA..AA,LLLL  Read LLLL bytes at address AA..AA
-		 */
-		case 'm':
-			ptr = &input_buffer[1];
-
-			if (hexToInt(&ptr, &addr)
-				&& *ptr++ == ','
-				&& hexToInt(&ptr, &length)) {
-				if (mem2hex((char *)addr, output_buffer, length, 1))
-					break;
-				strcpy (output_buffer, "E03");
-			} else
-				strcpy(output_buffer,"E01");
-			break;
-
-		/*
-		 * MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK
-		 */
-		case 'M': 
-			ptr = &input_buffer[1];
-
-			if (hexToInt(&ptr, &addr)
-				&& *ptr++ == ','
-				&& hexToInt(&ptr, &length)
-				&& *ptr++ == ':') {
-				if (hex2mem(ptr, (char *)addr, length, 1))
-					strcpy(output_buffer, "OK");
-				else
-					strcpy(output_buffer, "E03");
-			}
-			else
-				strcpy(output_buffer, "E02");
-			break;
-
-		/*
-		 * cAA..AA    Continue at address AA..AA(optional)
-		 */
-		case 'c':    
-			/* try to read optional parameter, pc unchanged if no parm */
-
-			ptr = &input_buffer[1];
-			if (hexToInt(&ptr, &addr))
-				regs->cp0_epc = addr;
-	  
-			/*
-			 * Need to flush the instruction cache here, as we may
-			 * have deposited a breakpoint, and the icache probably
-			 * has no way of knowing that a data ref to some location
-			 * may have changed something that is in the instruction
-			 * cache.
-			 * NB: We flush both caches, just to be sure...
-			 */
-
-			flush_cache_all();
-			return;
-			/* NOTREACHED */
-			break;
-
-
-		/*
-		 * kill the program
-		 */
-		case 'k' :
-			break;		/* do nothing */
-
-
-		/*
-		 * Reset the whole machine (FIXME: system dependent)
-		 */
-		case 'r':
-			break;
-
-
-		/*
-		 * Step to next instruction
-		 */
-		case 's':
-			/*
-			 * There is no single step insn in the MIPS ISA, so we
-			 * use breakpoints and continue, instead.
-			 */
-			single_step(regs);
-			flush_cache_all();
-			return;
-			/* NOTREACHED */
-
-		}
-		break;
-
-		}			/* switch */
-
-		/*
-		 * reply to the request
-		 */
-
-		putpacket(output_buffer);
-
-	} /* while */
-}
-
-/*
- * This function will generate a breakpoint exception.  It is used at the
- * beginning of a program to sync up with a debugger and can be used
- * otherwise as a quick means to stop program execution and "break" into
- * the debugger.
- */
-void breakpoint(void)
-{
-	if (!gdb_stub_initialised)
-		return;
-	__asm__ __volatile__(
-			".globl	breakinst\n"
-			"breakinst:\t.word   %0\n\t"
-			:
-			: "i" (S390_BREAKPOINT_U16)
-				:
-				);
-}
-
-
-
-
-
-
-
diff -Nru a/arch/s390x/kernel/head.S b/arch/s390x/kernel/head.S
--- a/arch/s390x/kernel/head.S	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,664 +0,0 @@
-/*
- *  arch/s390/kernel/head.S
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Rob van der Heij (rvdhei@iae.nl)
- *
- * There are 5 different IPL methods
- *  1) load the image directly into ram at address 0 and do an PSW restart
- *  2) linload will load the image from address 0x10000 to memory 0x10000
- *     and start the code thru LPSW 0x0008000080010000 (VM only, deprecated)
- *  3) generate the tape ipl header, store the generated image on a tape
- *     and ipl from it
- *     In case of SL tape you need to IPL 5 times to get past VOL1 etc
- *  4) generate the vm reader ipl header, move the generated image to the
- *     VM reader (use option NOH!) and do a ipl from reader (VM only)
- *  5) direct call of start by the SALIPL loader
- *  We use the cpuid to distinguish between VM and native ipl
- *  params for kernel are pushed to 0x10400 (see setup.h)
-
-    Changes: 
-    Okt 25 2000 <rvdheij@iae.nl>
-	added code to skip HDR and EOF to allow SL tape IPL (5 retries)
-	changed first CCW from rewind to backspace block
-
- */
-
-#include <linux/config.h>
-#include <asm/setup.h>
-#include <asm/lowcore.h>
-
-#ifndef CONFIG_IPL
-        .org   0
-        .long  0x00080000,0x80000000+startup   # Just a restart PSW
-#else
-#ifdef CONFIG_IPL_TAPE
-#define IPL_BS 1024
-        .org   0
-        .long  0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
-        .long  0x27000000,0x60000001           # by ipl to addresses 0-23.
-        .long  0x02000000,0x20000000+IPL_BS    # (a PSW and two CCWs).
-        .long  0x00000000,0x00000000           # external old psw
-        .long  0x00000000,0x00000000           # svc old psw
-        .long  0x00000000,0x00000000           # program check old psw
-        .long  0x00000000,0x00000000           # machine check old psw
-        .long  0x00000000,0x00000000           # io old psw
-        .long  0x00000000,0x00000000
-        .long  0x00000000,0x00000000
-        .long  0x00000000,0x00000000
-        .long  0x000a0000,0x00000058           # external new psw
-        .long  0x000a0000,0x00000060           # svc new psw
-        .long  0x000a0000,0x00000068           # program check new psw
-        .long  0x000a0000,0x00000070           # machine check new psw
-        .long  0x00080000,0x80000000+.Lioint   # io new psw
-
-        .org   0x100
-#
-# subroutine for loading from tape
-# Paramters:	
-#  R1 = device number
-#  R2 = load address
-.Lloader:	
-        st    %r14,.Lldret
-        la    %r3,.Lorbread                    # r3 = address of orb 
-	la    %r5,.Lirb                        # r5 = address of irb
-        st    %r2,.Lccwread+4                  # initialize CCW data addresses
-        lctl  %c6,%c6,.Lcr6               
-        slr   %r2,%r2
-.Lldlp:
-        la    %r6,3                            # 3 retries
-.Lssch:
-        ssch  0(%r3)                           # load chunk of IPL_BS bytes
-        bnz   .Llderr
-.Lw4end:
-        bas   %r14,.Lwait4io
-        tm    8(%r5),0x82                      # do we have a problem ?
-        bnz   .Lrecov
-        slr   %r7,%r7
-        icm   %r7,3,10(%r5)                    # get residual count
-        lcr   %r7,%r7
-        la    %r7,IPL_BS(%r7)                  # IPL_BS-residual=#bytes read
-        ar    %r2,%r7                          # add to total size
-        tm    8(%r5),0x01                      # found a tape mark ?
-        bnz   .Ldone
-        l     %r0,.Lccwread+4                  # update CCW data addresses
-        ar    %r0,%r7
-        st    %r0,.Lccwread+4                
-        b     .Lldlp
-.Ldone:
-        l     %r14,.Lldret
-        br    %r14                             # r2 contains the total size
-.Lrecov:
-        bas   %r14,.Lsense                     # do the sensing
-        bct   %r6,.Lssch                       # dec. retry count & branch
-        b     .Llderr
-#
-# Sense subroutine
-#
-.Lsense:
-        st    %r14,.Lsnsret
-        la    %r7,.Lorbsense              
-        ssch  0(%r7)                           # start sense command
-        bnz   .Llderr
-        bas   %r14,.Lwait4io
-        l     %r14,.Lsnsret
-        tm    8(%r5),0x82                      # do we have a problem ?
-        bnz   .Llderr
-        br    %r14
-#
-# Wait for interrupt subroutine
-#
-.Lwait4io:
-        lpsw  .Lwaitpsw                 
-.Lioint:
-        c     %r1,0xb8                         # compare subchannel number
-        bne   .Lwait4io
-        tsch  0(%r5)
-        slr   %r0,%r0
-        tm    8(%r5),0x82                      # do we have a problem ?
-        bnz   .Lwtexit
-        tm    8(%r5),0x04                      # got device end ?
-        bz    .Lwait4io
-.Lwtexit:
-        br    %r14
-.Llderr:
-        lpsw  .Lcrash              
-
-        .align 8
-.Lorbread:
-	.long  0x00000000,0x0080ff00,.Lccwread
-        .align 8
-.Lorbsense:
-        .long  0x00000000,0x0080ff00,.Lccwsense
-        .align 8
-.Lccwread:
-        .long  0x02200000+IPL_BS,0x00000000
-.Lccwsense:
-        .long  0x04200001,0x00000000
-.Lwaitpsw:
-	.long  0x020a0000,0x80000000+.Lioint
-
-.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-.Lcr6:  .long  0xff000000
-        .align 8
-.Lcrash:.long  0x000a0000,0x00000000
-.Lldret:.long  0
-.Lsnsret: .long 0
-#endif  /* CONFIG_IPL_TAPE */
-
-#ifdef CONFIG_IPL_VM
-#define IPL_BS 0x730
-        .org   0
-        .long  0x00080000,0x80000000+iplstart  # The first 24 bytes are loaded
-        .long  0x02000018,0x60000050           # by ipl to addresses 0-23.
-        .long  0x02000068,0x60000050           # (a PSW and two CCWs).
-        .fill  80-24,1,0x40                    # bytes 24-79 are discarded !!
-        .long  0x020000f0,0x60000050           # The next 160 byte are loaded
-        .long  0x02000140,0x60000050           # to addresses 0x18-0xb7
-        .long  0x02000190,0x60000050           # They form the continuation
-        .long  0x020001e0,0x60000050           # of the CCW program started
-        .long  0x02000230,0x60000050           # by ipl and load the range
-        .long  0x02000280,0x60000050           # 0x0f0-0x730 from the image
-        .long  0x020002d0,0x60000050           # to the range 0x0f0-0x730
-        .long  0x02000320,0x60000050           # in memory. At the end of
-        .long  0x02000370,0x60000050           # the channel program the PSW
-        .long  0x020003c0,0x60000050           # at location 0 is loaded.
-        .long  0x02000410,0x60000050           # Initial processing starts
-        .long  0x02000460,0x60000050           # at 0xf0 = iplstart.
-        .long  0x020004b0,0x60000050
-        .long  0x02000500,0x60000050
-        .long  0x02000550,0x60000050
-        .long  0x020005a0,0x60000050
-        .long  0x020005f0,0x60000050
-        .long  0x02000640,0x60000050
-        .long  0x02000690,0x60000050
-        .long  0x020006e0,0x20000050
-
-        .org   0xf0
-#
-# subroutine for loading cards from the reader
-#
-.Lloader:	
-	la    %r3,.Lorb                        # r2 = address of orb into r2
-	la    %r5,.Lirb                        # r4 = address of irb
-        la    %r6,.Lccws              
-        la    %r7,20
-.Linit:
-        st    %r2,4(%r6)                       # initialize CCW data addresses
-        la    %r2,0x50(%r2)
-        la    %r6,8(%r6)
-        bct   7,.Linit
-
-        lctl  %c6,%c6,.Lcr6                    # set IO subclass mask
-	slr   %r2,%r2
-.Lldlp:
-        ssch  0(%r3)                           # load chunk of 1600 bytes
-        bnz   .Llderr
-.Lwait4irq:
-        mvc   0x78(8),.Lnewpsw                 # set up IO interrupt psw
-        lpsw  .Lwaitpsw              
-.Lioint:
-        c     %r1,0xb8                         # compare subchannel number
-	bne   .Lwait4irq
-	tsch  0(%r5)
-
-	slr   %r0,%r0
-	ic    %r0,8(%r5)                       # get device status
-	chi   %r0,8                            # channel end ?
-	be    .Lcont
-	chi   %r0,12                           # channel end + device end ?
-	be    .Lcont
-
-        l     %r0,4(%r5)
-        s     %r0,8(%r3)                       # r0/8 = number of ccws executed
-        mhi   %r0,10                           # *10 = number of bytes in ccws
-        lh    %r3,10(%r5)                      # get residual count
-        sr    %r0,%r3                          # #ccws*80-residual=#bytes read
-	ar    %r2,%r0
-	
-        br    %r14                             # r2 contains the total size
-
-.Lcont:
-	ahi   %r2,0x640                        # add 0x640 to total size
-        la    %r6,.Lccws             
-        la    %r7,20
-.Lincr:
-        l     %r0,4(%r6)                       # update CCW data addresses
-        ahi   %r0,0x640
-        st    %r0,4(%r6)
-        ahi   %r6,8
-        bct   7,.Lincr
-
-        b     .Lldlp
-.Llderr:
-        lpsw  .Lcrash              
-
-        .align 8
-.Lorb:	.long  0x00000000,0x0080ff00,.Lccws
-.Lirb:	.long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-.Lcr6:  .long  0xff000000
-.Lloadp:.long  0,0
-        .align 8
-.Lcrash:.long  0x000a0000,0x00000000
-.Lnewpsw:
-        .long  0x00080000,0x80000000+.Lioint
-.Lwaitpsw:
-        .long  0x020a0000,0x80000000+.Lioint
-
-        .align 8
-.Lccws: .rept  19
-        .long  0x02600050,0x00000000
-        .endr
-        .long  0x02200050,0x00000000
-#endif  /* CONFIG_IPL_VM */
-
-iplstart:
-        lh    %r1,0xb8                         # test if subchannel number
-        bct   %r1,.Lnoload                     #  is valid
-	l     %r1,0xb8                         # load ipl subchannel number
-        la    %r2,IPL_BS                       # load start address
-        bas   %r14,.Lloader                    # load rest of ipl image
-        larl  %r12,_pstart                     # pointer to parameter area
-        st    %r1,IPL_DEVICE+4-PARMAREA(%r12)  # store ipl device number
-
-#
-# load parameter file from ipl device
-#
-.Lagain1:
- 	l     %r2,INITRD_START+4-PARMAREA(%r12)# use ramdisk location as temp
-        bas   %r14,.Lloader                    # load parameter file
-        ltr   %r2,%r2                          # got anything ?
-        bz    .Lnopf
-	chi   %r2,895
-	bnh   .Lnotrunc
-	la    %r2,895
-.Lnotrunc:
-	l     %r4,INITRD_START+4-PARMAREA(%r12)
- 	clc   0(3,%r4),.L_hdr		       # if it is HDRx
- 	bz    .Lagain1			       # skip dataset header
- 	clc   0(3,%r4),.L_eof		       # if it is EOFx
- 	bz    .Lagain1			       # skip dateset trailer
-        la    %r5,0(%r4,%r2)
-        lr    %r3,%r2
-.Lidebc:
-        tm    0(%r5),0x80                      # high order bit set ?
-        bo    .Ldocv                           #  yes -> convert from EBCDIC
-        ahi   %r5,-1
-        bct   %r3,.Lidebc
-        b     .Lnocv
-.Ldocv:
-        l     %r3,.Lcvtab
-        tr    0(256,%r4),0(%r3)                # convert parameters to ascii
-        tr    256(256,%r4),0(%r3)
-        tr    512(256,%r4),0(%r3)
-        tr    768(122,%r4),0(%r3)
-.Lnocv: la    %r3,COMMAND_LINE-PARMAREA(%r12)  # load adr. of command line
-	mvc   0(256,%r3),0(%r4)
-	mvc   256(256,%r3),256(%r4)
-	mvc   512(256,%r3),512(%r4)
-	mvc   768(122,%r3),768(%r4)
-        slr   %r0,%r0
-        b     .Lcntlp
-.Ldelspc:
-        ic    %r0,0(%r2,%r3)
-        chi   %r0,0x20                         # is it a space ?
-        be    .Lcntlp
-        ahi   %r2,1
-        b     .Leolp
-.Lcntlp:
-        brct  %r2,.Ldelspc
-.Leolp:
-        slr   %r0,%r0
-        stc   %r0,0(%r2,%r3)                   # terminate buffer
-.Lnopf:
-
-#
-# load ramdisk from ipl device
-#
-.Lagain2:
- 	l     %r2,INITRD_START+4-PARMAREA(%r12)# load adr. of ramdisk
-        bas   %r14,.Lloader                    # load ramdisk
- 	st    %r2,INITRD_SIZE+4-PARMAREA(%r12) # store size of ramdisk
-        ltr   %r2,%r2
-        bnz   .Lrdcont
-        st    %r2,INITRD_START+4-PARMAREA(%r12)# no ramdisk found, null it
-.Lrdcont:
-	l     %r2,INITRD_START+4-PARMAREA(%r12)
-	clc   0(3,%r2),.L_hdr		       # skip HDRx and EOFx 
-	bz    .Lagain2
-	clc   0(3,%r2),.L_eof
-	bz    .Lagain2
-
-#ifdef CONFIG_IPL_VM
-#
-# reset files in VM reader
-#
-        stidp __LC_CPUID                       # store cpuid
-	tm    __LC_CPUID,0xff                  # running VM ?
-	bno   .Lnoreset
-        la    %r2,.Lreset              
-        lhi   %r3,26
-        .long 0x83230008
-.Lnoreset:
-#endif
-	
-#
-# everything loaded, go for it
-#
-.Lnoload:
-        l     %r1,.Lstartup
-        br    %r1
-
-.Lstartup: .long startup
-.Lcvtab:.long  _ebcasc                         # ebcdic to ascii table
-.Lreset:.byte  0xc3,0xc8,0xc1,0xd5,0xc7,0xc5,0x40,0xd9,0xc4,0xd9,0x40
-        .byte  0xc1,0xd3,0xd3,0x40,0xd2,0xc5,0xc5,0xd7,0x40,0xd5,0xd6
-        .byte  0xc8,0xd6,0xd3,0xc4             # "change rdr all keep nohold"
-.L_eof: .long  0xc5d6c600       /* C'EOF' */
-.L_hdr: .long  0xc8c4d900       /* C'HDR' */
-#endif  /* CONFIG_IPL */
-
-#
-# SALIPL loader support. Based on a patch by Rob van der Heij.
-# This entry point is called directly from the SALIPL loader and
-# doesn't need a builtin ipl record.
-#
-        .org  0x800
-	.globl start
-start:
-	stm   %r0,%r15,0x07b0		# store registers
-	basr  %r12,%r0
-.base:
-	l     %r11,.parm
-	l     %r8,.cmd			# pointer to command buffer
-
-	ltr   %r9,%r9			# do we have SALIPL parameters?
-	bp    .sk8x8
-
-	mvc   0(64,%r8),0x00b0		# copy saved registers
-	xc    64(240-64,%r8),0(%r8)	# remainder of buffer
-	tr    0(64,%r8),.lowcase	
-	b     .gotr
-.sk8x8:
-	mvc   0(240,%r8),0(%r9)		# copy iplparms into buffer
-.gotr:
-	l     %r10,.tbl			# EBCDIC to ASCII table
-	tr    0(240,%r8),0(%r10)
-	stidp __LC_CPUID		# Are we running on VM maybe
-	cli   __LC_CPUID,0xff
-	bnz   .test
-	.long 0x83300060		# diag 3,0,x'0060' - storage size
-	b     .done
-.test:
-	mvc   0x68(8),.pgmnw		# set up pgm check handler
-	l     %r2,.fourmeg
-	lr    %r3,%r2
-	bctr  %r3,%r0			# 4M-1
-.loop:  iske  %r0,%r3
-	ar    %r3,%r2
-.pgmx:
-	sr    %r3,%r2
-	la    %r3,1(%r3)
-.done:
-	l     %r1,.memsize
-	st    %r3,4(%r1)
-	slr   %r0,%r0
-	st    %r0,INITRD_SIZE+4-PARMAREA(%r11)
-	st    %r0,INITRD_START+4-PARMAREA(%r11)
-	j     startup                   # continue with startup
-.tbl:	.long _ebcasc			# translate table
-.cmd:	.long COMMAND_LINE		# address of command line buffer
-.parm:	.long PARMAREA
-.fourmeg: .long 0x00400000      	# 4M
-.pgmnw:	.long 0x00080000,.pgmx
-.memsize: .long memory_size
-.lowcase:
-	.byte 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 
-	.byte 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f
-	.byte 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17 
-	.byte 0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f
-	.byte 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27 
-	.byte 0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f
-	.byte 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37 
-	.byte 0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f
-	.byte 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47 
-	.byte 0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f
-	.byte 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57 
-	.byte 0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f
-	.byte 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67 
-	.byte 0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f
-	.byte 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77 
-	.byte 0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f
-
-	.byte 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87 
-	.byte 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f
-	.byte 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97 
-	.byte 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f
-	.byte 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7 
-	.byte 0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf
-	.byte 0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7 
-	.byte 0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf
-	.byte 0xc0,0x81,0x82,0x83,0x84,0x85,0x86,0x87	# .abcdefg 
-	.byte 0x88,0x89,0xca,0xcb,0xcc,0xcd,0xce,0xcf	# hi
-	.byte 0xd0,0x91,0x92,0x93,0x94,0x95,0x96,0x97 	# .jklmnop
-	.byte 0x98,0x99,0xda,0xdb,0xdc,0xdd,0xde,0xdf	# qr
-	.byte 0xe0,0xe1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7	# ..stuvwx
-	.byte 0xa8,0xa9,0xea,0xeb,0xec,0xed,0xee,0xef	# yz
-	.byte 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7 
-	.byte 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
-
-#
-# startup-code at 0x10000, running in real mode
-# this is called either by the ipl loader or directly by PSW restart
-# or linload or SALIPL
-#
-        .org  0x10000
-startup:basr  %r13,0                     # get base
-.LPG1:  sll   %r13,1                     # remove high order bit
-        srl   %r13,1
-        lhi   %r1,1                      # mode 1 = esame
-        slr   %r0,%r0                    # set cpuid to zero
-        sigp  %r1,%r0,0x12               # switch to esame mode
-	sam64				 # switch to 64 bit mode
-	lctlg %c0,%c15,.Lctl-.LPG1(%r13) # load control registers
-	larl  %r12,_pstart               # pointer to parameter area
-					 # move IPL device to lowcore
-        mvc   __LC_IPLDEV(4),IPL_DEVICE+4-PARMAREA(%r12)
-
-#
-# clear bss memory
-#
-	larl  %r2,__bss_start           # start of bss segment
-        larl  %r3,_end                  # end of bss segment
-        sgr   %r3,%r2                   # length of bss
-        sgr   %r4,%r4                   #
-        sgr   %r5,%r5                   # set src,length and pad to zero
-        mvcle %r2,%r4,0                 # clear mem
-        jo    .-4                       # branch back, if not finish
-
-					 # set program check new psw mask
-	mvc   __LC_PGM_NEW_PSW(8),.Lpcmsk-.LPG1(%r13)
-
-#
-# find memory chunks.
-#
-	larl  %r1,.Lchkmem               # set program check address
-	stg   %r1,__LC_PGM_NEW_PSW+8
-	la    %r1,1                      # test in increments of 128KB
-	sllg  %r1,%r1,17
-	larl  %r3,memory_chunk
-	slgr  %r4,%r4                    # set start of chunk to zero
-	slgr  %r5,%r5                    # set end of chunk to zero
-	slr  %r6,%r6			 # set access code to zero
-.Lloop:
-	tprot 0(%r5),0			 # test protection of first byte
-	ipm   %r7
-	srl   %r7,28
-	clr   %r6,%r7			 # compare cc with last access code
-	je    .Lsame
-	clgr  %r4,%r5			 # chunk size > 0?
-	je    .Lsize0
-	stg   %r4,0(%r3)		 # store start address of chunk
-	lgr   %r0,%r5
-	slgr  %r0,%r4
-	stg   %r0,8(%r3)		 # store size of chunk
-	st    %r6,20(%r3)		 # store type of chunk
-	la    %r3,24(%r3)
-	lgr   %r4,%r5			 # set start to end
-	larl  %r8,memory_size
-	stg   %r5,0(%r8)                 # store memory size
-.Lsize0:
-	lr    %r6,%r7			 # set access code to last cc
-.Lsame:
-	algr  %r5,%r1			 # add 128KB to end of chunk
-	brc   12,.Lloop
-.Lchkmem:				 # > 16EB or tprot got a program check
-	clgr  %r4,%r5			 # chunk size > 0?
-	je    .Ldonemem
-	stg   %r4,0(%r3)		 # store start address of chunk
-	lgr   %r0,%r5
-	slgr  %r0,%r4
-	stg   %r0,8(%r3)		 # store size of chunk
-	st    %r6,20(%r3)		 # store type of chunk
-	la    %r3,24(%r3)
-	lgr   %r4,%r5
-	larl  %r8,memory_size
-	stg   %r5,0(%r8)                 # store memory size
-#
-# Running native the HSA is located at 2GB and we will get an
-# addressing exception trying to access it. We have to restart
-# the scan at 2GB to find out if the machine has more than 2GB.
-#
-	lghi  %r4,1
-	sllg  %r4,%r4,31
-	clgr  %r5,%r4
-	jhe   .Ldonemem
-	lgr   %r5,%r4
-	j     .Lloop
-.Ldonemem:		
-
-	larl  %r12,machine_flags
-#
-# find out if we are running under VM
-#
-        stidp  __LC_CPUID               # store cpuid
-	tm     __LC_CPUID,0xff          # running under VM ?
-	bno    0f-.LPG1(%r13)
-        oi     7(%r12),1                # set VM flag
-0:      lh     %r0,__LC_CPUID+4         # get cpu version
-        chi    %r0,0x7490               # running on a P/390 ?
-        bne    1f-.LPG1(%r13)
-        oi     7(%r12),4                # set P/390 flag
-1:
-
-#
-# find out if we have the MVPG instruction
-#
-	la     %r1,0f-.LPG1(%r13)       # set program check address
-	stg    %r1,__LC_PGM_NEW_PSW+8
-	sgr    %r0,%r0
-	lghi   %r1,0
-	lghi   %r2,0
-	mvpg   %r1,%r2                  # test MVPG instruction
-	oi     7(%r12),16               # set MVPG flag
-0:
-
-#
-# find out if the diag 0x44 works in 64 bit mode
-#
-	la     %r1,0f-.LPG1(%r13)	# set program check address
-	stg    %r1,__LC_PGM_NEW_PSW+8
-	mvc    __LC_DIAG44_OPCODE(8),.Lnop-.LPG1(%r13)
-	diag   0,0,0x44			# test diag 0x44
-	oi     7(%r12),32		# set diag44 flag
-	mvc    __LC_DIAG44_OPCODE(8),.Ldiag44-.LPG1(%r13)
-0:	
-
-        lpswe .Lentry-.LPG1(13)         # jump to _stext in primary-space,
-                                        # virtual and never return ...
-        .align 16
-.Lentry:.quad  0x0000000180000000,_stext
-.Lctl:  .quad  0x04b50002               # cr0: various things
-        .quad  0                        # cr1: primary space segment table
-        .quad  .Lduct                   # cr2: dispatchable unit control table
-        .quad  0                        # cr3: instruction authorization
-        .quad  0                        # cr4: instruction authorization
-        .quad  0                        # cr5:  various things
-        .quad  0                        # cr6:  I/O interrupts
-        .quad  0                        # cr7:  secondary space segment table
-        .quad  0                        # cr8:  access registers translation
-        .quad  0                        # cr9:  tracing off
-        .quad  0                        # cr10: tracing off
-        .quad  0                        # cr11: tracing off
-        .quad  0                        # cr12: tracing off
-        .quad  0                        # cr13: home space segment table
-        .quad  0xc0000000               # cr14: machine check handling off
-        .quad  0                        # cr15: linkage stack operations
-.Lpcmsk:.quad  0x0000000180000000
-.L4malign:.quad 0xffffffffffc00000
-.Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8
-.Lnop:	.long  0x07000700
-.Ldiag44:.long 0x83000044
-
-	.org PARMAREA-64
-.Lduct:	.long 0,0,0,0,0,0,0,0
-	.long 0,0,0,0,0,0,0,0
-
-#
-# params at 10400 (setup.h)
-#
-	.org   PARMAREA
-	.global _pstart
-_pstart:
-	.quad  0                        # IPL_DEVICE
-        .quad  RAMDISK_ORIGIN           # INITRD_START
-        .quad  RAMDISK_SIZE             # INITRD_SIZE
-
-        .org   COMMAND_LINE
-    	.byte  "root=/dev/ram0 ro"
-        .byte  0
-	.org   0x11000
-	.global _pend
-_pend:	
-
-#ifdef CONFIG_SHARED_KERNEL
-	.org   0x100000
-#endif
-	
-#
-# startup-code, running in virtual mode
-#
-        .globl _stext
-_stext:	basr  %r13,0                    # get base
-.LPG2:
-#
-# Setup stack
-#
-	larl  %r15,init_thread_union
-        aghi  %r15,16384                # init_task_union + 16384
-        stg   %r15,__LC_KERNEL_STACK    # set end of kernel stack
-        aghi  %r15,-160
-        xc    0(8,%r15),0(%r15)         # set backchain to zero
-
-# check control registers
-        stctg  %c0,%c15,0(%r15)
-	oi     6(%r15),0x20             # enable sigp external interrupts
-	oi     4(%r15),0x10             # switch on low address proctection
-        lctlg  %c0,%c15,0(%r15)
-
-#
-        lam    0,15,.Laregs-.LPG2(%r13) # load access regs needed by uaccess
-        brasl  %r14,start_kernel        # go to C code
-#
-# We returned from start_kernel ?!? PANIK
-#
-        basr  %r13,0
-	lpswe .Ldw-.(%r13)           # load disabled wait psw
-#
-            .align 8
-.Ldw:       .quad  0x0002000180000000,0x0000000000000000
-.Laregs:    .long  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
diff -Nru a/arch/s390x/kernel/ieee.h b/arch/s390x/kernel/ieee.h
--- a/arch/s390x/kernel/ieee.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,90 +0,0 @@
-/*
- *  arch/s390/kernel/ieee.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-#include <linux/sched.h>
-
-static    inline void _adddf(int R1,int R2)
-{
-  current->tss.fprs[R1].fd = current->tss.fprs[R1].fd +
-                             current->tss.fprs[R2].fd;
-}
-
-static    inline void _subdf(int R1,int R2)
-{
-  current->tss.fprs[R1].fd = current->tss.fprs[R1].fd -
-                             current->tss.fprs[R2].fd;
-}
-
-static    inline void _muldf(int R1,int R2)
-{
-  current->tss.fprs[R1].fd = current->tss.fprs[R1].fd *
-                             current->tss.fprs[R2].fd;
-}
-
-static    inline void _divdf(int R1,int R2)
-{
-  current->tss.fprs[R1].fd = current->tss.fprs[R1].fd /
-                             current->tss.fprs[R2].fd;
-}
-
-static    inline void _negdf(int R1,int R2)
-{
-  current->tss.fprs[R1].fd = -current->tss.fprs[R1].fd;
-}
-
-static    inline void _fixdfsi(int R1,int R2)
-{
-  current->tss.regs->gprs[R1] = (__u32) current->tss.fprs[R2].fd;
-}
-
-static    inline void _extendsidf(int R1,int R2)
-{
-  current->tss.fprs[R1].fd = (double) current->tss.regs->gprs[R2];
-}
-
-
-static    inline  void _addsf(int R1,int R2)
-{
-  current->tss.fprs[R1].ff = current->tss.fprs[R1].ff +
-                             current->tss.fprs[R2].ff;
-}
-
-static    inline  void _subsf(int R1,int R2)
-{
-  current->tss.fprs[R1].ff = current->tss.fprs[R1].ff -
-                             current->tss.fprs[R2].ff;
-}
-
-static    inline void _mulsf(int R1,int R2)
-{
-  current->tss.fprs[R1].ff = current->tss.fprs[R1].ff *
-                             current->tss.fprs[R2].ff;
-}
-
-static    inline void _divsf(int R1,int R2)
-{
-  current->tss.fprs[R1].ff = current->tss.fprs[R1].ff /
-                             current->tss.fprs[R2].ff;
-}
-
-static    inline void _negsf(int R1,int R2)
-{
-  current->tss.fprs[R1].ff = -current->tss.fprs[R1].ff;
-}
-
-static    inline void _fixsfsi(int R1,int R2)
-{
-  current->tss.regs->gprs[R1] = (__u32) current->tss.fprs[R2].ff;
-}
-
-static    inline void _extendsisf(int R1,int R2)
-{
-  current->tss.fprs[R1].ff = (double) current->tss.regs->gprs[R2];
-}
-
-
diff -Nru a/arch/s390x/kernel/init_task.c b/arch/s390x/kernel/init_task.c
--- a/arch/s390x/kernel/init_task.c	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,39 +0,0 @@
-/*
- *  arch/s390/kernel/init_task.c
- *
- *  S390 version
- *
- *  Derived from "arch/i386/kernel/init_task.c"
- */
-
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/init_task.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-
-static struct fs_struct init_fs = INIT_FS;
-static struct files_struct init_files = INIT_FILES;
-static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
-static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-struct mm_struct init_mm = INIT_MM(init_mm);
-
-/*
- * Initial thread structure.
- *
- * We need to make sure that this is 8192-byte aligned due to the
- * way process stacks are handled. This is done by having a special
- * "init_task" linker map entry..
- */
-union thread_union init_thread_union 
-	__attribute__((__section__(".data.init_task"))) =
-		{ INIT_THREAD_INFO(init_task) };
-
-/*
- * Initial task structure.
- *
- * All other task structs will be allocated on slabs in fork.c
- */
-struct task_struct init_task = INIT_TASK(init_task);
-
diff -Nru a/arch/s390x/kernel/ioctl32.c b/arch/s390x/kernel/ioctl32.c
--- a/arch/s390x/kernel/ioctl32.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1083 +0,0 @@
-/*
- * ioctl32.c: Conversion between 32bit and 64bit native ioctls.
- *
- *  S390 version
- *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Gerhard Tonn (ton@de.ibm.com)
- *
- * Heavily inspired by the 32-bit Sparc compat code which is  
- * Copyright (C) 2000 Silicon Graphics, Inc.
- * Written by Ulf Carlsson (ulfc@engr.sgi.com) 
- *
- */
-
-#include <linux/types.h>
-#include <linux/compat.h>
-#include <linux/kernel.h>
-#include <linux/fs.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/file.h>
-#include <linux/vt.h>
-#include <linux/kd.h>
-#include <linux/netdevice.h>
-#include <linux/route.h>
-#include <linux/ext2_fs.h>
-#include <linux/hdreg.h>
-#include <linux/if_bonding.h>
-#include <linux/blkpg.h>
-#include <linux/blk.h>
-#include <linux/dm-ioctl.h>
-#include <linux/loop.h>
-#include <linux/elevator.h>
-#include <asm/types.h>
-#include <asm/uaccess.h>
-#include <asm/dasd.h>
-#include <asm/tape390.h>
-#include <asm/sockios.h>
-#include <asm/ioctls.h>
-
-#include "linux32.h"
-
-long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
-
-struct hd_geometry32 {
-	unsigned char	heads;
-	unsigned char	sectors;
-	unsigned short	cylinders;
-	__u32		start;
-};  
-
-static inline int hd_geometry_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct hd_geometry32 *hg32 = (struct hd_geometry32 *) A(arg);
-	struct hd_geometry hg;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_ioctl (fd, cmd, (long)&hg);
-	set_fs (old_fs);
-
-	if (ret)
-		return ret;
-
-	ret = put_user (hg.heads, &(hg32->heads));
-	ret |= __put_user (hg.sectors, &(hg32->sectors));
-	ret |= __put_user (hg.cylinders, &(hg32->cylinders));
-	ret |= __put_user (hg.start, &(hg32->start));
-
-	return ret;
-}
-
-#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)
-
-struct ifmap32 {
-	unsigned int mem_start;
-	unsigned int 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];
-                __u32	ifru_data;
-        } ifr_ifru;
-};
-
-struct ifconf32 {
-        int     ifc_len;                        /* size of buffer       */
-        __u32	ifcbuf;
-};
-
-static int dev_ifname32(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	struct ireq32 *uir32 = (struct ireq32 *) A(arg);
-	struct net_device *dev;
-	struct ifreq32 ifr32;
-
-	if (copy_from_user(&ifr32, uir32, sizeof(struct ifreq32)))
-		return -EFAULT;
-
-	read_lock(&dev_base_lock);
-	dev = __dev_get_by_index(ifr32.ifr_ifindex);
-	if (!dev) {
-		read_unlock(&dev_base_lock);
-		return -ENODEV;
-	}
-
-	strcpy(ifr32.ifr_name, dev->name);
-	read_unlock(&dev_base_lock);
-
-	if (copy_to_user(uir32, &ifr32, sizeof(struct ifreq32)))
-	    return -EFAULT;
-
-	return 0;
-}
-
-static inline int dev_ifconf(unsigned int fd, unsigned int cmd,
-			     unsigned long arg)
-{
-	struct ioconf32 *uifc32 = (struct ioconf32 *) A(arg);
-	struct ifconf32 ifc32;
-	struct ifconf ifc;
-	struct ifreq32 *ifr32;
-	struct ifreq *ifr;
-	mm_segment_t old_fs;
-	int len;
-	int err;
-
-	if (copy_from_user(&ifc32, uifc32, 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))) *
-			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);
-	len = ifc32.ifc_len / sizeof (struct ifreq32);
-	while (len--) {
-		if (copy_from_user(ifr++, ifr32++, sizeof (struct ifreq32))) {
-			err = -EFAULT;
-			goto out;
-		}
-	}
-
-	old_fs = get_fs();
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, SIOCGIFCONF, (unsigned long)&ifc);	
-	set_fs (old_fs);
-	if (err)
-		goto out;
-
-	ifr = ifc.ifc_req;
-	ifr32 = (struct ifreq32 *) A(ifc32.ifcbuf);
-	len = ifc.ifc_len / sizeof (struct ifreq);
-	ifc32.ifc_len = len * sizeof (struct ifreq32);
-
-	while (len--) {
-		if (copy_to_user(ifr32++, ifr++, sizeof (struct ifreq32))) {
-			err = -EFAULT;
-			goto out;
-		}
-	}
-
-	if (copy_to_user(uifc32, &ifc32, sizeof(struct ifconf32))) {
-		err = -EFAULT;
-		goto out;
-	}
-out:
-	if(ifc.ifc_buf != NULL)
-		kfree (ifc.ifc_buf);
-	return err;
-}
-
-static int bond_ioctl(unsigned long fd, unsigned int cmd, unsigned long arg)
-{
-	struct ifreq ifr;
-	mm_segment_t old_fs;
-	int err, len;
-	u32 data;
-	
-	if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32)))
-		return -EFAULT;
-	ifr.ifr_data = (__kernel_caddr_t)get_zeroed_page(GFP_KERNEL);
-	if (!ifr.ifr_data)
-		return -EAGAIN;
-
-	switch (cmd) {
-	case SIOCBONDENSLAVE:
-	case SIOCBONDRELEASE:
-	case SIOCBONDSETHWADDR:
-	case SIOCBONDCHANGEACTIVE:
-		len = IFNAMSIZ * sizeof(char);
-		break;
-	case SIOCBONDSLAVEINFOQUERY:
-		len = sizeof(struct ifslave);
-		break;
-	case SIOCBONDINFOQUERY:
-		len = sizeof(struct ifbond);
-		break;
-	default:
-		err = -EINVAL;
-		goto out;
-	};
-
-	__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
-	if (copy_from_user(ifr.ifr_data, (char *)A(data), len)) {
-		err = -EFAULT;
-		goto out;
-	}
-
-	old_fs = get_fs();
-	set_fs (KERNEL_DS);
-	err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
-	set_fs (old_fs);
-	if (!err) {
-		len = copy_to_user((char *)A(data), ifr.ifr_data, len);
-		if (len)
-			err = -EFAULT;
-	}
-
-out:
-	free_page((unsigned long)ifr.ifr_data);
-	return err;
-}
-
-static inline int dev_ifsioc(unsigned int fd, unsigned int cmd,
-			     unsigned long arg)
-{
-	struct ifreq32 *uifr = (struct ifreq32 *) A(arg);
-	struct ifreq ifr;
-	mm_segment_t old_fs;
-	int err;
-	
-	switch (cmd) {
-	case SIOCSIFMAP:
-		err = copy_from_user(&ifr, uifr, sizeof(ifr.ifr_name));
-		err |= __get_user(ifr.ifr_map.mem_start, &(uifr->ifr_ifru.ifru_map.mem_start));
-		err |= __get_user(ifr.ifr_map.mem_end, &(uifr->ifr_ifru.ifru_map.mem_end));
-		err |= __get_user(ifr.ifr_map.base_addr, &(uifr->ifr_ifru.ifru_map.base_addr));
-		err |= __get_user(ifr.ifr_map.irq, &(uifr->ifr_ifru.ifru_map.irq));
-		err |= __get_user(ifr.ifr_map.dma, &(uifr->ifr_ifru.ifru_map.dma));
-		err |= __get_user(ifr.ifr_map.port, &(uifr->ifr_ifru.ifru_map.port));
-		if (err)
-			return -EFAULT;
-		break;
-	default:
-		if (copy_from_user(&ifr, uifr, 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(uifr, &ifr, sizeof(struct ifreq32)))
-				return -EFAULT;
-			break;
-		case SIOCGIFMAP:
-			err = copy_to_user(uifr, &ifr, sizeof(ifr.ifr_name));
-			err |= __put_user(ifr.ifr_map.mem_start, &(uifr->ifr_ifru.ifru_map.mem_start));
-			err |= __put_user(ifr.ifr_map.mem_end, &(uifr->ifr_ifru.ifru_map.mem_end));
-			err |= __put_user(ifr.ifr_map.base_addr, &(uifr->ifr_ifru.ifru_map.base_addr));
-			err |= __put_user(ifr.ifr_map.irq, &(uifr->ifr_ifru.ifru_map.irq));
-			err |= __put_user(ifr.ifr_map.dma, &(uifr->ifr_ifru.ifru_map.dma));
-			err |= __put_user(ifr.ifr_map.port, &(uifr->ifr_ifru.ifru_map.port));
-			if (err)
-				err = -EFAULT;
-			break;
-		}
-	}
-	return err;
-}
-
-struct rtentry32
-{
-	unsigned int	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;
-	unsigned int	rt_pad3;
-	unsigned int	rt_pad4;
-	short		rt_metric;	/* +1 for binary compatibility!	*/
-	unsigned int	rt_dev;		/* forcing the device at add	*/
-	unsigned int	rt_mtu;		/* per route MTU/Window 	*/
-#ifndef __KERNEL__
-#define rt_mss	rt_mtu			/* Compatibility :-(            */
-#endif
-	unsigned int	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 rtentry32 *ur = (struct rtentry32 *) A(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, &(ur->rt_dst), 3 * sizeof(struct sockaddr));
-	ret |= __get_user (r.rt_flags, &(ur->rt_flags));
-	ret |= __get_user (r.rt_metric, &(ur->rt_metric));
-	ret |= __get_user (r.rt_mtu, &(ur->rt_mtu));
-	ret |= __get_user (r.rt_window, &(ur->rt_window));
-	ret |= __get_user (r.rt_irtt, &(ur->rt_irtt));
-	ret |= __get_user (rtdev, &(ur->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;
-}
-
-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);
-}
-
-
-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("%s: Unknown loop ioctl cmd, fd(%d) "
-			       "cmd(%08x) arg(%08lx)\n",
-			       __FUNCTION__, fd, cmd, arg);
-	}
-	}
-	return err;
-}
-
-
-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;
-}
-
-
-typedef struct ica_z90_status_t {
-  int totalcount;
-  int leedslitecount;
-  int leeds2count;
-  int requestqWaitCount;
-  int pendingqWaitCount;
-  int totalOpenCount;
-  int cryptoDomain;
-  unsigned char status[64];
-  unsigned char qdepth[64];
-} ica_z90_status;
-
-typedef struct _ica_rsa_modexpo {
-  char         *inputdata;
-  unsigned int  inputdatalength;
-  char         *outputdata;
-  unsigned int  outputdatalength;
-  char         *b_key;
-  char         *n_modulus;
-} ica_rsa_modexpo_t;
-
-typedef struct _ica_rsa_modexpo_32 {
-  u32          inputdata;
-  u32          inputdatalength;
-  u32          outputdata;
-  u32          outputdatalength;
-  u32          b_key;
-  u32          n_modulus;
-} ica_rsa_modexpo_32_t;
-
-typedef struct _ica_rsa_modexpo_crt {
-  char         *inputdata;
-  unsigned int  inputdatalength;
-  char         *outputdata;
-  unsigned int  outputdatalength;
-  char         *bp_key;
-  char         *bq_key;
-  char         *np_prime;
-  char         *nq_prime;
-  char         *u_mult_inv;
-} ica_rsa_modexpo_crt_t;
-
-typedef struct _ica_rsa_modexpo_crt_32 {
-  u32          inputdata;
-  u32          inputdatalength;
-  u32          outputdata;
-  u32          outputdatalength;
-  u32          bp_key;
-  u32          bq_key;
-  u32          np_prime;
-  u32          nq_prime;
-  u32          u_mult_inv;
-} ica_rsa_modexpo_crt_32_t;
-
-#define ICA_IOCTL_MAGIC 'z'
-#define ICARSAMODEXPO   _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x05, 0)
-#define ICARSACRT       _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x06, 0) 
-#define ICARSAMODMULT   _IOC(_IOC_READ|_IOC_WRITE, ICA_IOCTL_MAGIC, 0x07, 0)
-#define ICAZ90STATUS    _IOC(_IOC_READ, ICA_IOCTL_MAGIC, 0x10, sizeof(ica_z90_status))
-#define ICAZ90QUIESCE   _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x11, 0)
-#define ICAZ90HARDRESET _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x12, 0)
-#define ICAZ90HARDERROR _IOC(_IOC_NONE, ICA_IOCTL_MAGIC, 0x13, 0)
-
-static int do_rsa_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	int err = 0;
-	ica_rsa_modexpo_t rsa;
-	ica_rsa_modexpo_32_t *rsa32 = (ica_rsa_modexpo_32_t *)arg;
-	u32 inputdata, outputdata, b_key, n_modulus;
-
-	memset (&rsa, 0, sizeof(rsa));
-
-	err |= __get_user (inputdata, &rsa32->inputdata);
-	err |= __get_user (rsa.inputdatalength, &rsa32->inputdatalength);
-	err |= __get_user (outputdata, &rsa32->outputdata);
-	err |= __get_user (rsa.outputdatalength, &rsa32->outputdatalength);
-	err |= __get_user (b_key, &rsa32->b_key);
-	err |= __get_user (n_modulus, &rsa32->n_modulus);
-	if (err)
-		return -EFAULT;
-
-	rsa.inputdata = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
-	if (!rsa.inputdata) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.inputdata, (char *)(u64)(inputdata & 0x7fffffff), 
-			   rsa.inputdatalength)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	rsa.outputdata = (char *)kmalloc(rsa.outputdatalength, GFP_KERNEL);
-	if (!rsa.outputdata) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-
-	rsa.b_key = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
-	if (!rsa.b_key) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.b_key, (char *)(u64)(b_key & 0x7fffffff), 
-			   rsa.inputdatalength)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	rsa.n_modulus = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
-	if (!rsa.n_modulus) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.n_modulus, (char *)(u64)(n_modulus & 0x7fffffff), 
-			   rsa.inputdatalength)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&rsa);
-	set_fs(old_fs);
-	if (err < 0)
-		goto cleanup;
-
-	if (copy_to_user((char *)(u64)(outputdata & 0x7fffffff), rsa.outputdata,
-			 rsa.outputdatalength))
-		err = -EFAULT;
-
-cleanup:
-	if (rsa.inputdata)
-		kfree(rsa.inputdata);
-	if (rsa.outputdata)
-		kfree(rsa.outputdata);
-	if (rsa.b_key)
-		kfree(rsa.b_key);
-	if (rsa.n_modulus)
-		kfree(rsa.n_modulus);
-	
-	return err;
-}
-
-static int do_rsa_crt_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	mm_segment_t old_fs = get_fs();
-	int err = 0;
-	ica_rsa_modexpo_crt_t rsa;
-	ica_rsa_modexpo_crt_32_t *rsa32 = (ica_rsa_modexpo_crt_32_t *)arg;
-	u32 inputdata, outputdata, bp_key, bq_key, np_prime, nq_prime, u_mult_inv;
-
-	memset (&rsa, 0, sizeof(rsa));
-
-	err |= __get_user (inputdata, &rsa32->inputdata);
-	err |= __get_user (rsa.inputdatalength, &rsa32->inputdatalength);
-	err |= __get_user (outputdata, &rsa32->outputdata);
-	err |= __get_user (rsa.outputdatalength, &rsa32->outputdatalength);
-	err |= __get_user (bp_key, &rsa32->bp_key);
-	err |= __get_user (bq_key, &rsa32->bq_key);
-	err |= __get_user (np_prime, &rsa32->np_prime);
-	err |= __get_user (nq_prime, &rsa32->nq_prime);
-	err |= __get_user (u_mult_inv, &rsa32->u_mult_inv);
-	if (err)
-		return -EFAULT;
-
-	rsa.inputdata = (char *)kmalloc(rsa.inputdatalength, GFP_KERNEL);
-	if (!rsa.inputdata) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.inputdata, (char *)(u64)(inputdata & 0x7fffffff), 
-			   rsa.inputdatalength)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	rsa.outputdata = (char *)kmalloc(rsa.outputdatalength, GFP_KERNEL);
-	if (!rsa.outputdata) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-
-	rsa.bp_key = (char *)kmalloc(rsa.inputdatalength/2 + 8, GFP_KERNEL);
-	if (!rsa.bp_key) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.bp_key, (char *)(u64)(bp_key & 0x7fffffff), 
-			   rsa.inputdatalength/2 + 8)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	rsa.bq_key = (char *)kmalloc(rsa.inputdatalength/2, GFP_KERNEL);
-	if (!rsa.bq_key) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.bq_key, (char *)(u64)(bq_key & 0x7fffffff), 
-			   rsa.inputdatalength/2)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	rsa.np_prime = (char *)kmalloc(rsa.inputdatalength/2 + 8, GFP_KERNEL);
-	if (!rsa.np_prime) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.np_prime, (char *)(u64)(np_prime & 0x7fffffff), 
-			   rsa.inputdatalength/2 + 8)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	rsa.nq_prime = (char *)kmalloc(rsa.inputdatalength/2, GFP_KERNEL);
-	if (!rsa.nq_prime) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.nq_prime, (char *)(u64)(nq_prime & 0x7fffffff), 
-			   rsa.inputdatalength/2)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	rsa.u_mult_inv = (char *)kmalloc(rsa.inputdatalength/2 + 8, GFP_KERNEL);
-	if (!rsa.u_mult_inv) {
-		err = -ENOMEM;
-		goto cleanup;
-	}
-	if (copy_from_user(rsa.u_mult_inv, (char *)(u64)(u_mult_inv & 0x7fffffff), 
-			   rsa.inputdatalength/2 + 8)) {
-		err = -EFAULT;
-		goto cleanup;
-	}
-
-	set_fs(KERNEL_DS);
-	err = sys_ioctl(fd, cmd, (unsigned long)&rsa);
-	set_fs(old_fs);
-	if (err < 0)
-		goto cleanup;
-
-	if (copy_to_user((char *)(u64)(outputdata & 0x7fffffff), rsa.outputdata,
-			 rsa.outputdatalength))
-		err = -EFAULT;
-
-cleanup:
-	if (rsa.inputdata)
-		kfree(rsa.inputdata);
-	if (rsa.outputdata)
-		kfree(rsa.outputdata);
-	if (rsa.bp_key)
-		kfree(rsa.bp_key);
-	if (rsa.bq_key)
-		kfree(rsa.bq_key);
-	if (rsa.np_prime)
-		kfree(rsa.np_prime);
-	if (rsa.nq_prime)
-		kfree(rsa.nq_prime);
-	if (rsa.u_mult_inv)
-		kfree(rsa.u_mult_inv);
-	
-	return err;
-}
-
-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((unsigned int) val, (u32 *)arg))
-		return -EFAULT;
-	return err;
-}
-
-struct ioctl32_handler {
-	unsigned int cmd;
-	int (*function)(unsigned int, unsigned int, unsigned long);
-};
-
-struct ioctl32_list {
-	struct ioctl32_handler handler;
-	struct ioctl32_list *next;
-};
-
-#define IOCTL32_DEFAULT(cmd)		{ { cmd, (void *) sys_ioctl }, 0 }
-#define IOCTL32_HANDLER(cmd, handler)	{ { cmd, (void *) handler }, 0 }
-
-static struct ioctl32_list ioctl32_handler_table[] = {
-	IOCTL32_DEFAULT(FIBMAP),
-	IOCTL32_DEFAULT(FIGETBSZ),
-
-	IOCTL32_DEFAULT(DASDAPIVER),
-	IOCTL32_DEFAULT(BIODASDDISABLE),
-	IOCTL32_DEFAULT(BIODASDENABLE),
-	IOCTL32_DEFAULT(BIODASDRSRV),
-	IOCTL32_DEFAULT(BIODASDRLSE),
-	IOCTL32_DEFAULT(BIODASDSLCK),
-	IOCTL32_DEFAULT(BIODASDINFO),
-	IOCTL32_DEFAULT(BIODASDFMT),
-
-	IOCTL32_DEFAULT(TAPE390_DISPLAY),
-
-	IOCTL32_DEFAULT(BLKROSET),
-	IOCTL32_DEFAULT(BLKROGET),
-	IOCTL32_DEFAULT(BLKRRPART),
-	IOCTL32_DEFAULT(BLKFLSBUF),
-	IOCTL32_DEFAULT(BLKRASET),
-	IOCTL32_DEFAULT(BLKFRASET),
-	IOCTL32_DEFAULT(BLKSECTSET),
-	IOCTL32_DEFAULT(BLKSSZGET),
-	IOCTL32_DEFAULT(BLKBSZGET),
-	IOCTL32_DEFAULT(BLKGETSIZE64),
-
-	IOCTL32_HANDLER(HDIO_GETGEO, hd_geometry_ioctl),
-
-	IOCTL32_DEFAULT(TCGETA),
-	IOCTL32_DEFAULT(TCSETA),
-	IOCTL32_DEFAULT(TCSETAW),
-	IOCTL32_DEFAULT(TCSETAF),
-	IOCTL32_DEFAULT(TCSBRK),
-	IOCTL32_DEFAULT(TCXONC),
-	IOCTL32_DEFAULT(TCFLSH),
-	IOCTL32_DEFAULT(TCGETS),
-	IOCTL32_DEFAULT(TCSETS),
-	IOCTL32_DEFAULT(TCSETSW),
-	IOCTL32_DEFAULT(TCSETSF),
-	IOCTL32_DEFAULT(TIOCLINUX),
-
-	IOCTL32_DEFAULT(TIOCGETD),
-	IOCTL32_DEFAULT(TIOCSETD),
-	IOCTL32_DEFAULT(TIOCEXCL),
-	IOCTL32_DEFAULT(TIOCNXCL),
-	IOCTL32_DEFAULT(TIOCCONS),
-	IOCTL32_DEFAULT(TIOCGSOFTCAR),
-	IOCTL32_DEFAULT(TIOCSSOFTCAR),
-	IOCTL32_DEFAULT(TIOCSWINSZ),
-	IOCTL32_DEFAULT(TIOCGWINSZ),
-	IOCTL32_DEFAULT(TIOCMGET),
-	IOCTL32_DEFAULT(TIOCMBIC),
-	IOCTL32_DEFAULT(TIOCMBIS),
-	IOCTL32_DEFAULT(TIOCMSET),
-	IOCTL32_DEFAULT(TIOCPKT),
-	IOCTL32_DEFAULT(TIOCNOTTY),
-	IOCTL32_DEFAULT(TIOCSTI),
-	IOCTL32_DEFAULT(TIOCOUTQ),
-	IOCTL32_DEFAULT(TIOCSPGRP),
-	IOCTL32_DEFAULT(TIOCGPGRP),
-	IOCTL32_DEFAULT(TIOCSCTTY),
-	IOCTL32_DEFAULT(TIOCGPTN),
-	IOCTL32_DEFAULT(TIOCSPTLCK),
-	IOCTL32_DEFAULT(TIOCGSERIAL),
-	IOCTL32_DEFAULT(TIOCSSERIAL),
-	IOCTL32_DEFAULT(TIOCSERGETLSR),
-
-	IOCTL32_DEFAULT(FIOCLEX),
-	IOCTL32_DEFAULT(FIONCLEX),
-	IOCTL32_DEFAULT(FIOASYNC),
-	IOCTL32_DEFAULT(FIONBIO),
-	IOCTL32_DEFAULT(FIONREAD),
-
-	IOCTL32_DEFAULT(PIO_FONT),
-	IOCTL32_DEFAULT(GIO_FONT),
-	IOCTL32_DEFAULT(KDSIGACCEPT),
-	IOCTL32_DEFAULT(KDGETKEYCODE),
-	IOCTL32_DEFAULT(KDSETKEYCODE),
-	IOCTL32_DEFAULT(KIOCSOUND),
-	IOCTL32_DEFAULT(KDMKTONE),
-	IOCTL32_DEFAULT(KDGKBTYPE),
-	IOCTL32_DEFAULT(KDSETMODE),
-	IOCTL32_DEFAULT(KDGETMODE),
-	IOCTL32_DEFAULT(KDSKBMODE),
-	IOCTL32_DEFAULT(KDGKBMODE),
-	IOCTL32_DEFAULT(KDSKBMETA),
-	IOCTL32_DEFAULT(KDGKBMETA),
-	IOCTL32_DEFAULT(KDGKBENT),
-	IOCTL32_DEFAULT(KDSKBENT),
-	IOCTL32_DEFAULT(KDGKBSENT),
-	IOCTL32_DEFAULT(KDSKBSENT),
-	IOCTL32_DEFAULT(KDGKBDIACR),
-	IOCTL32_DEFAULT(KDSKBDIACR),
-	IOCTL32_DEFAULT(KDGKBLED),
-	IOCTL32_DEFAULT(KDSKBLED),
-	IOCTL32_DEFAULT(KDGETLED),
-	IOCTL32_DEFAULT(KDSETLED),
-	IOCTL32_DEFAULT(GIO_SCRNMAP),
-	IOCTL32_DEFAULT(PIO_SCRNMAP),
-	IOCTL32_DEFAULT(GIO_UNISCRNMAP),
-	IOCTL32_DEFAULT(PIO_UNISCRNMAP),
-	IOCTL32_DEFAULT(PIO_FONTRESET),
-	IOCTL32_DEFAULT(PIO_UNIMAPCLR),
-
-	IOCTL32_DEFAULT(VT_SETMODE),
-	IOCTL32_DEFAULT(VT_GETMODE),
-	IOCTL32_DEFAULT(VT_GETSTATE),
-	IOCTL32_DEFAULT(VT_OPENQRY),
-	IOCTL32_DEFAULT(VT_ACTIVATE),
-	IOCTL32_DEFAULT(VT_WAITACTIVE),
-	IOCTL32_DEFAULT(VT_RELDISP),
-	IOCTL32_DEFAULT(VT_DISALLOCATE),
-	IOCTL32_DEFAULT(VT_RESIZE),
-	IOCTL32_DEFAULT(VT_RESIZEX),
-	IOCTL32_DEFAULT(VT_LOCKSWITCH),
-	IOCTL32_DEFAULT(VT_UNLOCKSWITCH),
-
-	IOCTL32_DEFAULT(SIOCGSTAMP),
-
-	IOCTL32_DEFAULT(DM_VERSION),
-	IOCTL32_DEFAULT(DM_REMOVE_ALL),
-	IOCTL32_DEFAULT(DM_DEV_CREATE),
-	IOCTL32_DEFAULT(DM_DEV_REMOVE),
-	IOCTL32_DEFAULT(DM_DEV_RELOAD),
-	IOCTL32_DEFAULT(DM_DEV_SUSPEND),
-	IOCTL32_DEFAULT(DM_DEV_RENAME),
-	IOCTL32_DEFAULT(DM_DEV_DEPS),
-	IOCTL32_DEFAULT(DM_DEV_STATUS),
-	IOCTL32_DEFAULT(DM_TARGET_STATUS),
-	IOCTL32_DEFAULT(DM_TARGET_WAIT),
-
-	IOCTL32_DEFAULT(LOOP_SET_FD),
-	IOCTL32_DEFAULT(LOOP_CLR_FD),
-
-	IOCTL32_HANDLER(SIOCGIFNAME, dev_ifname32),
-	IOCTL32_HANDLER(SIOCGIFCONF, dev_ifconf),
-	IOCTL32_HANDLER(SIOCGIFFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMETRIC, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMETRIC, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMTU, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMTU, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMEM, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMEM, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFHWADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFHWADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCADDMULTI, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCDELMULTI, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFINDEX, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFMAP, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFMAP, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFBRDADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFBRDADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFDSTADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFDSTADDR, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFNETMASK, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFNETMASK, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFPFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFPFLAGS, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCGIFTXQLEN, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCSIFTXQLEN, dev_ifsioc),
-	IOCTL32_HANDLER(SIOCADDRT, routing_ioctl),
-	IOCTL32_HANDLER(SIOCDELRT, routing_ioctl),
-
-	IOCTL32_HANDLER(SIOCBONDENSLAVE, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDRELEASE, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDSETHWADDR, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDSLAVEINFOQUERY, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDINFOQUERY, bond_ioctl),
-	IOCTL32_HANDLER(SIOCBONDCHANGEACTIVE, bond_ioctl),
-
-	IOCTL32_HANDLER(EXT2_IOC32_GETFLAGS, do_ext2_ioctl),
-	IOCTL32_HANDLER(EXT2_IOC32_SETFLAGS, do_ext2_ioctl),
-	IOCTL32_HANDLER(EXT2_IOC32_GETVERSION, do_ext2_ioctl),
-	IOCTL32_HANDLER(EXT2_IOC32_SETVERSION, do_ext2_ioctl),
-
-	IOCTL32_HANDLER(LOOP_SET_STATUS, loop_status),
-	IOCTL32_HANDLER(LOOP_GET_STATUS, loop_status),
-
-	IOCTL32_HANDLER(ICARSAMODEXPO, do_rsa_ioctl),
-	IOCTL32_HANDLER(ICARSACRT, do_rsa_crt_ioctl),
-	IOCTL32_HANDLER(ICARSAMODMULT, do_rsa_ioctl),
-	IOCTL32_DEFAULT(ICAZ90STATUS),
-	IOCTL32_DEFAULT(ICAZ90QUIESCE),
-	IOCTL32_DEFAULT(ICAZ90HARDRESET),
-	IOCTL32_DEFAULT(ICAZ90HARDERROR),
-
-	IOCTL32_HANDLER(BLKRAGET, w_long),
-	IOCTL32_HANDLER(BLKGETSIZE, w_long),
-	IOCTL32_HANDLER(BLKFRAGET, w_long),
-	IOCTL32_HANDLER(BLKSECTGET, w_long),
-	IOCTL32_HANDLER(BLKPG, blkpg_ioctl_trans)
-
-};
-
-#define NR_IOCTL32_HANDLERS	(sizeof(ioctl32_handler_table) /	\
-				 sizeof(ioctl32_handler_table[0]))
-
-static struct ioctl32_list *ioctl32_hash_table[1024];
-
-static inline int ioctl32_hash(unsigned int cmd)
-{
-	return ((cmd >> 6) ^ (cmd >> 4) ^ cmd) & 0x3ff;
-}
-
-int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	int (*handler)(unsigned int, unsigned int, unsigned long, struct file * filp);
-	struct file *filp;
-	struct ioctl32_list *l;
-	int error;
-
-	l = ioctl32_hash_table[ioctl32_hash(cmd)];
-
-	error = -EBADF;
-
-	filp = fget(fd);
-	if (!filp)
-		return error;
-
-	if (!filp->f_op || !filp->f_op->ioctl) {
-		error = sys_ioctl (fd, cmd, arg);
-		goto out;
-	}
-
-	while (l && l->handler.cmd != cmd)
-		l = l->next;
-
-	if (l) {
-		handler = (void *)l->handler.function;
-		error = handler(fd, cmd, arg, filp);
-	} else {
-		error = -EINVAL;
-		printk("unknown ioctl: %08x\n", cmd);
-	}
-out:
-	fput(filp);
-	return error;
-}
-
-static void ioctl32_insert(struct ioctl32_list *entry)
-{
-	int hash = ioctl32_hash(entry->handler.cmd);
-
-	entry->next = 0;
-	if (!ioctl32_hash_table[hash])
-		ioctl32_hash_table[hash] = entry;
-	else {
-		struct ioctl32_list *l;
-		l = ioctl32_hash_table[hash];
-		while (l->next)
-			l = l->next;
-		l->next = entry;
-	}
-}
-
-int register_ioctl32_conversion(unsigned int cmd,
-				int (*handler)(unsigned int, unsigned int,
-					       unsigned long, struct file *))
-{
-	struct ioctl32_list *l, *new;
-	int hash;
-
-	hash = ioctl32_hash(cmd);
-	for (l = ioctl32_hash_table[hash]; l != NULL; l = l->next)
-		if (l->handler.cmd == cmd)
-			return -EBUSY;
-	new = kmalloc(sizeof(struct ioctl32_list), GFP_KERNEL);
-	if (new == NULL)
-		return -ENOMEM;
-	new->handler.cmd = cmd;
-	new->handler.function = (void *) handler;
-	ioctl32_insert(new);
-	return 0;
-}
-
-int unregister_ioctl32_conversion(unsigned int cmd)
-{
-	struct ioctl32_list *p, *l;
-	int hash;
-
-	hash = ioctl32_hash(cmd);
-	p = NULL;
-	for (l = ioctl32_hash_table[hash]; l != NULL; l = l->next) {
-		if (l->handler.cmd == cmd)
-			break;
-		p = l;
-	}
-	if (l == NULL)
-		return -ENOENT;
-	if (p == NULL)
-		ioctl32_hash_table[hash] = l->next;
-	else
-		p->next = l->next;
-	kfree(l);
-	return 0;
-}
-
-static int __init init_ioctl32(void)
-{
-	int i;
-	for (i = 0; i < NR_IOCTL32_HANDLERS; i++)
-		ioctl32_insert(&ioctl32_handler_table[i]);
-	return 0;
-}
-
-__initcall(init_ioctl32);
diff -Nru a/arch/s390x/kernel/linux32.c b/arch/s390x/kernel/linux32.c
--- a/arch/s390x/kernel/linux32.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,2864 +0,0 @@
-/*
- *  arch/s390x/kernel/linux32.c
- *
- *  S390 version
- *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Gerhard Tonn (ton@de.ibm.com)   
- *
- *  Conversion between 31bit and 64bit native syscalls.
- *
- * Heavily inspired by the 32-bit Sparc compat code which is 
- * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
- *
- */
-
-
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/fs.h> 
-#include <linux/mm.h> 
-#include <linux/file.h> 
-#include <linux/signal.h>
-#include <linux/resource.h>
-#include <linux/times.h>
-#include <linux/utsname.h>
-#include <linux/timex.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/sem.h>
-#include <linux/msg.h>
-#include <linux/shm.h>
-#include <linux/slab.h>
-#include <linux/uio.h>
-#include <linux/nfs_fs.h>
-#include <linux/smb_fs.h>
-#include <linux/smb_mount.h>
-#include <linux/ncp_fs.h>
-#include <linux/quota.h>
-#include <linux/module.h>
-#include <linux/sunrpc/svc.h>
-#include <linux/nfsd/nfsd.h>
-#include <linux/nfsd/cache.h>
-#include <linux/nfsd/xdr.h>
-#include <linux/nfsd/syscall.h>
-#include <linux/poll.h>
-#include <linux/personality.h>
-#include <linux/stat.h>
-#include <linux/filter.h>
-#include <linux/highmem.h>
-#include <linux/highuid.h>
-#include <linux/mman.h>
-#include <linux/ipv6.h>
-#include <linux/in.h>
-#include <linux/icmpv6.h>
-#include <linux/sysctl.h>
-#include <linux/binfmts.h>
-#include <linux/compat.h>
-#include <linux/vfs.h>
-#include <linux/ptrace.h>
-
-#include <asm/types.h>
-#include <asm/ipc.h>
-#include <asm/uaccess.h>
-#include <asm/semaphore.h>
-
-#include <net/scm.h>
-#include <net/sock.h>
-
-#include "linux32.h"
-
-extern asmlinkage long sys_chown(const char *, uid_t,gid_t);
-extern asmlinkage long sys_lchown(const char *, uid_t,gid_t);
-extern asmlinkage long sys_fchown(unsigned int, uid_t,gid_t);
-extern asmlinkage long sys_setregid(gid_t, gid_t);
-extern asmlinkage long sys_setgid(gid_t);
-extern asmlinkage long sys_setreuid(uid_t, uid_t);
-extern asmlinkage long sys_setuid(uid_t);
-extern asmlinkage long sys_setresuid(uid_t, uid_t, uid_t);
-extern asmlinkage long sys_setresgid(gid_t, gid_t, gid_t);
-extern asmlinkage long sys_setfsuid(uid_t);
-extern asmlinkage long sys_setfsgid(gid_t);
- 
-/* For this source file, we want overflow handling. */
-
-#undef high2lowuid
-#undef high2lowgid
-#undef low2highuid
-#undef low2highgid
-#undef SET_UID16
-#undef SET_GID16
-#undef NEW_TO_OLD_UID
-#undef NEW_TO_OLD_GID
-#undef SET_OLDSTAT_UID
-#undef SET_OLDSTAT_GID
-#undef SET_STAT_UID
-#undef SET_STAT_GID
-
-#define high2lowuid(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid)
-#define high2lowgid(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid)
-#define low2highuid(uid) ((uid) == (u16)-1) ? (uid_t)-1 : (uid_t)(uid)
-#define low2highgid(gid) ((gid) == (u16)-1) ? (gid_t)-1 : (gid_t)(gid)
-#define SET_UID16(var, uid)	var = high2lowuid(uid)
-#define SET_GID16(var, gid)	var = high2lowgid(gid)
-#define NEW_TO_OLD_UID(uid)	high2lowuid(uid)
-#define NEW_TO_OLD_GID(gid)	high2lowgid(gid)
-#define SET_OLDSTAT_UID(stat, uid)	(stat).st_uid = high2lowuid(uid)
-#define SET_OLDSTAT_GID(stat, gid)	(stat).st_gid = high2lowgid(gid)
-#define SET_STAT_UID(stat, uid)		(stat).st_uid = high2lowuid(uid)
-#define SET_STAT_GID(stat, gid)		(stat).st_gid = high2lowgid(gid)
-
-asmlinkage long sys32_chown16(const char * filename, u16 user, u16 group)
-{
-	return sys_chown(filename, low2highuid(user), low2highgid(group));
-}
-
-asmlinkage long sys32_lchown16(const char * filename, u16 user, u16 group)
-{
-	return sys_lchown(filename, low2highuid(user), low2highgid(group));
-}
-
-asmlinkage long sys32_fchown16(unsigned int fd, u16 user, u16 group)
-{
-	return sys_fchown(fd, low2highuid(user), low2highgid(group));
-}
-
-asmlinkage long sys32_setregid16(u16 rgid, u16 egid)
-{
-	return sys_setregid(low2highgid(rgid), low2highgid(egid));
-}
-
-asmlinkage long sys32_setgid16(u16 gid)
-{
-	return sys_setgid((gid_t)gid);
-}
-
-asmlinkage long sys32_setreuid16(u16 ruid, u16 euid)
-{
-	return sys_setreuid(low2highuid(ruid), low2highuid(euid));
-}
-
-asmlinkage long sys32_setuid16(u16 uid)
-{
-	return sys_setuid((uid_t)uid);
-}
-
-asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid)
-{
-	return sys_setresuid(low2highuid(ruid), low2highuid(euid),
-		low2highuid(suid));
-}
-
-asmlinkage long sys32_getresuid16(u16 *ruid, u16 *euid, u16 *suid)
-{
-	int retval;
-
-	if (!(retval = put_user(high2lowuid(current->uid), ruid)) &&
-	    !(retval = put_user(high2lowuid(current->euid), euid)))
-		retval = put_user(high2lowuid(current->suid), suid);
-
-	return retval;
-}
-
-asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid)
-{
-	return sys_setresgid(low2highgid(rgid), low2highgid(egid),
-		low2highgid(sgid));
-}
-
-asmlinkage long sys32_getresgid16(u16 *rgid, u16 *egid, u16 *sgid)
-{
-	int retval;
-
-	if (!(retval = put_user(high2lowgid(current->gid), rgid)) &&
-	    !(retval = put_user(high2lowgid(current->egid), egid)))
-		retval = put_user(high2lowgid(current->sgid), sgid);
-
-	return retval;
-}
-
-asmlinkage long sys32_setfsuid16(u16 uid)
-{
-	return sys_setfsuid((uid_t)uid);
-}
-
-asmlinkage long sys32_setfsgid16(u16 gid)
-{
-	return sys_setfsgid((gid_t)gid);
-}
-
-asmlinkage long sys32_getgroups16(int gidsetsize, u16 *grouplist)
-{
-	u16 groups[NGROUPS];
-	int i,j;
-
-	if (gidsetsize < 0)
-		return -EINVAL;
-	i = current->ngroups;
-	if (gidsetsize) {
-		if (i > gidsetsize)
-			return -EINVAL;
-		for(j=0;j<i;j++)
-			groups[j] = current->groups[j];
-		if (copy_to_user(grouplist, groups, sizeof(u16)*i))
-			return -EFAULT;
-	}
-	return i;
-}
-
-asmlinkage long sys32_setgroups16(int gidsetsize, u16 *grouplist)
-{
-	u16 groups[NGROUPS];
-	int i;
-
-	if (!capable(CAP_SETGID))
-		return -EPERM;
-	if ((unsigned) gidsetsize > NGROUPS)
-		return -EINVAL;
-	if (copy_from_user(groups, grouplist, gidsetsize * sizeof(u16)))
-		return -EFAULT;
-	for (i = 0 ; i < gidsetsize ; i++)
-		current->groups[i] = (gid_t)groups[i];
-	current->ngroups = gidsetsize;
-	return 0;
-}
-
-asmlinkage long sys32_getuid16(void)
-{
-	return high2lowuid(current->uid);
-}
-
-asmlinkage long sys32_geteuid16(void)
-{
-	return high2lowuid(current->euid);
-}
-
-asmlinkage long sys32_getgid16(void)
-{
-	return high2lowgid(current->gid);
-}
-
-asmlinkage long sys32_getegid16(void)
-{
-	return high2lowgid(current->egid);
-}
-
-/* 32-bit timeval and related flotsam.  */
-
-static inline long get_tv32(struct timeval *o, struct compat_timeval *i)
-{
-	return (!access_ok(VERIFY_READ, tv32, sizeof(*tv32)) ||
-		(__get_user(o->tv_sec, &i->tv_sec) |
-		 __get_user(o->tv_usec, &i->tv_usec)));
-}
-
-static inline long put_tv32(struct compat_timeval *o, struct timeval *i)
-{
-	return (!access_ok(VERIFY_WRITE, o, sizeof(*o)) ||
-		(__put_user(i->tv_sec, &o->tv_sec) |
-		 __put_user(i->tv_usec, &o->tv_usec)));
-}
-
-struct msgbuf32 { s32 mtype; char mtext[1]; };
-
-struct ipc64_perm_ds32
-{
-        __kernel_key_t          key;
-        __kernel_uid32_t        uid;
-        __kernel_gid32_t        gid;
-        __kernel_uid32_t        cuid;
-        __kernel_gid32_t        cgid;
-        compat_mode_t       mode;
-        unsigned short          __pad1;
-        unsigned short          seq;
-        unsigned short          __pad2;
-        unsigned int            __unused1;
-        unsigned int            __unused2;
-};
-
-struct ipc_perm32
-{
-	key_t    	  key;
-        compat_uid_t  uid;
-        compat_gid_t  gid;
-        compat_uid_t  cuid;
-        compat_gid_t  cgid;
-        compat_mode_t mode;
-        unsigned short  seq;
-};
-
-struct semid_ds32 {
-        struct ipc_perm32 sem_perm;               /* permissions .. see ipc.h */
-        compat_time_t   sem_otime;              /* last semop time */
-        compat_time_t   sem_ctime;              /* last change time */
-        u32 sem_base;              /* ptr to first semaphore in array */
-        u32 sem_pending;          /* pending operations to be processed */
-        u32 sem_pending_last;    /* last pending operation */
-        u32 undo;                  /* undo requests on this array */
-        unsigned short  sem_nsems;              /* no. of semaphores in array */
-};
-
-struct semid64_ds32 {
-	struct ipc64_perm_ds32 sem_perm;
-	unsigned int	  __pad1;
-	compat_time_t   sem_otime;
-	unsigned int	  __pad2;
-	compat_time_t   sem_ctime;
-	u32 sem_nsems;
-	u32 __unused1;
-	u32 __unused2;
-};
-
-struct msqid_ds32
-{
-        struct ipc_perm32 msg_perm;
-        u32 msg_first;
-        u32 msg_last;
-        compat_time_t   msg_stime;
-        compat_time_t   msg_rtime;
-        compat_time_t   msg_ctime;
-        u32 wwait;
-        u32 rwait;
-        unsigned short msg_cbytes;
-        unsigned short msg_qnum;  
-        unsigned short msg_qbytes;
-        compat_ipc_pid_t msg_lspid;
-        compat_ipc_pid_t msg_lrpid;
-};
-
-struct msqid64_ds32 {
-	struct ipc64_perm_ds32 msg_perm;
-	unsigned int   __pad1;
-	compat_time_t msg_stime;
-	unsigned int   __pad2;
-	compat_time_t msg_rtime;
-	unsigned int   __pad3;
-	compat_time_t msg_ctime;
-	unsigned int  msg_cbytes;
-	unsigned int  msg_qnum;
-	unsigned int  msg_qbytes;
-	compat_pid_t msg_lspid;
-	compat_pid_t msg_lrpid;
-	unsigned int  __unused1;
-	unsigned int  __unused2;
-};
-
-
-struct shmid_ds32 {
-	struct ipc_perm32       shm_perm;
-	int                     shm_segsz;
-	compat_time_t         shm_atime;
-	compat_time_t         shm_dtime;
-	compat_time_t         shm_ctime;
-	compat_ipc_pid_t    shm_cpid; 
-	compat_ipc_pid_t    shm_lpid; 
-	unsigned short          shm_nattch;
-};
-
-struct shmid64_ds32 {
-	struct ipc64_perm_ds32	shm_perm;
-	compat_size_t	shm_segsz;
-	compat_time_t  	shm_atime;
-	unsigned int		__unused1;
-	compat_time_t  	shm_dtime;
-	unsigned int		__unused2;
-	compat_time_t  	shm_ctime;
-	unsigned int		__unused3;
-	compat_pid_t	shm_cpid;
-	compat_pid_t	shm_lpid;
-	unsigned int		shm_nattch;
-	unsigned int		__unused4;
-	unsigned int		__unused5;
-};
-
-                                                        
-/*
- * sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation..
- *
- * This is really horribly ugly.
- */
-#define IPCOP_MASK(__x)	(1UL << (__x))
-static int do_sys32_semctl(int first, int second, int third, void *uptr)
-{
-	union semun fourth;
-	u32 pad;
-	int err = -EINVAL;
-
-	if (!uptr)
-		goto out;
-	err = -EFAULT;
-	if (get_user (pad, (u32 *)uptr))
-		goto out;
-	if(third == SETVAL)
-		fourth.val = (int)pad;
-	else
-		fourth.__pad = (void *)A(pad);
-	if (IPCOP_MASK (third) &
-	    (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (SEM_INFO) | IPCOP_MASK (GETVAL) |
-	     IPCOP_MASK (GETPID) | IPCOP_MASK (GETNCNT) | IPCOP_MASK (GETZCNT) |
-	     IPCOP_MASK (GETALL) | IPCOP_MASK (SETALL) | IPCOP_MASK (IPC_RMID))) {
-		err = sys_semctl (first, second, third, fourth);
-	} else if (third & IPC_64) {
-		struct semid64_ds s;
-		struct semid64_ds32 *usp = (struct semid64_ds32 *)A(pad);
-		mm_segment_t old_fs;
-		int need_back_translation;
-
-		if (third == (IPC_SET|IPC_64)) {
-			err = get_user (s.sem_perm.uid, &usp->sem_perm.uid);
-			err |= __get_user (s.sem_perm.gid, &usp->sem_perm.gid);
-			err |= __get_user (s.sem_perm.mode, &usp->sem_perm.mode);
-			if (err)
-				goto out;
-			fourth.__pad = &s;
-		}
-		need_back_translation =
-			(IPCOP_MASK (third) &
-			 (IPCOP_MASK (SEM_STAT) | IPCOP_MASK (IPC_STAT))) != 0;
-		if (need_back_translation)
-			fourth.__pad = &s;
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_semctl (first, second, third, fourth);
-		set_fs (old_fs);
-		if (need_back_translation) {
-			int err2 = put_user (s.sem_perm.key, &usp->sem_perm.key);
-			err2 |= __put_user (high2lowuid(s.sem_perm.uid), &usp->sem_perm.uid);
-			err2 |= __put_user (high2lowgid(s.sem_perm.gid), &usp->sem_perm.gid);
-			err2 |= __put_user (high2lowuid(s.sem_perm.cuid), &usp->sem_perm.cuid);
-			err2 |= __put_user (high2lowgid(s.sem_perm.cgid), &usp->sem_perm.cgid);
-			err2 |= __put_user (s.sem_perm.mode, &usp->sem_perm.mode);
-			err2 |= __put_user (s.sem_perm.seq, &usp->sem_perm.seq);
-			err2 |= __put_user (s.sem_otime, &usp->sem_otime);
-			err2 |= __put_user (s.sem_ctime, &usp->sem_ctime);
-			err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
-			if (err2) err = -EFAULT;
-		}
-	} else {
-		struct semid_ds s;
-		struct semid_ds32 *usp = (struct semid_ds32 *)A(pad);
-		mm_segment_t old_fs;
-		int need_back_translation;
-
-		if (third == IPC_SET) {
-			err = get_user (s.sem_perm.uid, &usp->sem_perm.uid);
-			err |= __get_user (s.sem_perm.gid, &usp->sem_perm.gid);
-			err |= __get_user (s.sem_perm.mode, &usp->sem_perm.mode);
-			if (err)
-				goto out;
-			fourth.__pad = &s;
-		}
-		need_back_translation =
-			(IPCOP_MASK (third) &
-			 (IPCOP_MASK (SEM_STAT) | IPCOP_MASK (IPC_STAT))) != 0;
-		if (need_back_translation)
-			fourth.__pad = &s;
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_semctl (first, second, third, fourth);
-		set_fs (old_fs);
-		if (need_back_translation) {
-			int err2 = put_user (s.sem_perm.key, &usp->sem_perm.key);
-			err2 |= __put_user (high2lowuid(s.sem_perm.uid), &usp->sem_perm.uid);
-			err2 |= __put_user (high2lowgid(s.sem_perm.gid), &usp->sem_perm.gid);
-			err2 |= __put_user (high2lowuid(s.sem_perm.cuid), &usp->sem_perm.cuid);
-			err2 |= __put_user (high2lowgid(s.sem_perm.cgid), &usp->sem_perm.cgid);
-			err2 |= __put_user (s.sem_perm.mode, &usp->sem_perm.mode);
-			err2 |= __put_user (s.sem_perm.seq, &usp->sem_perm.seq);
-			err2 |= __put_user (s.sem_otime, &usp->sem_otime);
-			err2 |= __put_user (s.sem_ctime, &usp->sem_ctime);
-			err2 |= __put_user (s.sem_nsems, &usp->sem_nsems);
-			if (err2) err = -EFAULT;
-		}
-	}
-out:
-	return err;
-}
-
-static int do_sys32_msgsnd (int first, int second, int third, void *uptr)
-{
-	struct msgbuf *p = kmalloc (second + sizeof (struct msgbuf), GFP_USER);
-	struct msgbuf32 *up = (struct msgbuf32 *)uptr;
-	mm_segment_t old_fs;
-	int err;
-
-	if (!p)
-		return -ENOMEM;
-
-	err = -EINVAL;
-	if (second > MSGMAX || first < 0 || second < 0)
-		goto out;
-
-	err = -EFAULT;
-	if (!uptr)
-		goto out;
-        if (get_user (p->mtype, &up->mtype) ||
-	    __copy_from_user (p->mtext, &up->mtext, second))
-		goto out;
-	old_fs = get_fs ();
-	set_fs (KERNEL_DS);
-	err = sys_msgsnd (first, p, second, third);
-	set_fs (old_fs);
-out:
-	kfree (p);
-	return err;
-}
-
-static int do_sys32_msgrcv (int first, int second, int msgtyp, int third,
-			    int version, void *uptr)
-{
-	struct msgbuf32 *up;
-	struct msgbuf *p;
-	mm_segment_t old_fs;
-	int err;
-
-	if (first < 0 || second < 0)
-		return -EINVAL;
-
-	if (!version) {
-		struct ipc_kludge_32 *uipck = (struct ipc_kludge_32 *)uptr;
-		struct ipc_kludge_32 ipck;
-
-		err = -EINVAL;
-		if (!uptr)
-			goto out;
-		err = -EFAULT;
-		if (copy_from_user (&ipck, uipck, sizeof (struct ipc_kludge_32)))
-			goto out;
-		uptr = (void *)A(ipck.msgp);
-		msgtyp = ipck.msgtyp;
-	}
-	err = -ENOMEM;
-	p = kmalloc (second + sizeof (struct msgbuf), GFP_USER);
-	if (!p)
-		goto out;
-	old_fs = get_fs ();
-	set_fs (KERNEL_DS);
-	err = sys_msgrcv (first, p, second, msgtyp, third);
-	set_fs (old_fs);
-	if (err < 0)
-		goto free_then_out;
-	up = (struct msgbuf32 *)uptr;
-	if (put_user (p->mtype, &up->mtype) ||
-	    __copy_to_user (&up->mtext, p->mtext, err))
-		err = -EFAULT;
-free_then_out:
-	kfree (p);
-out:
-	return err;
-}
-
-static int do_sys32_msgctl (int first, int second, void *uptr)
-{
-	int err;
-
-	if (IPCOP_MASK (second) &
-	    (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (MSG_INFO) |
-	     IPCOP_MASK (IPC_RMID))) {
-		err = sys_msgctl (first, second, (struct msqid_ds *)uptr);
-	} else if (second & IPC_64) {
-		struct msqid64_ds m;
-		struct msqid64_ds32 *up = (struct msqid64_ds32 *)uptr;
-		mm_segment_t old_fs;
-
-		if (second == (IPC_SET|IPC_64)) {
-			err = get_user (m.msg_perm.uid, &up->msg_perm.uid);
-			err |= __get_user (m.msg_perm.gid, &up->msg_perm.gid);
-			err |= __get_user (m.msg_perm.mode, &up->msg_perm.mode);
-			err |= __get_user (m.msg_qbytes, &up->msg_qbytes);
-			if (err)
-				goto out;
-		}
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_msgctl (first, second, (struct msqid_ds *)&m);
-		set_fs (old_fs);
-		if (IPCOP_MASK (second) &
-		    (IPCOP_MASK (MSG_STAT) | IPCOP_MASK (IPC_STAT))) {
-			int err2 = put_user (m.msg_perm.key, &up->msg_perm.key);
-			err2 |= __put_user (high2lowuid(m.msg_perm.uid), &up->msg_perm.uid);
-			err2 |= __put_user (high2lowgid(m.msg_perm.gid), &up->msg_perm.gid);
-			err2 |= __put_user (high2lowuid(m.msg_perm.cuid), &up->msg_perm.cuid);
-			err2 |= __put_user (high2lowgid(m.msg_perm.cgid), &up->msg_perm.cgid);
-			err2 |= __put_user (m.msg_perm.mode, &up->msg_perm.mode);
-			err2 |= __put_user (m.msg_perm.seq, &up->msg_perm.seq);
-			err2 |= __put_user (m.msg_stime, &up->msg_stime);
-			err2 |= __put_user (m.msg_rtime, &up->msg_rtime);
-			err2 |= __put_user (m.msg_ctime, &up->msg_ctime);
-			err2 |= __put_user (m.msg_cbytes, &up->msg_cbytes);
-			err2 |= __put_user (m.msg_qnum, &up->msg_qnum);
-			err2 |= __put_user (m.msg_qbytes, &up->msg_qbytes);
-			err2 |= __put_user (m.msg_lspid, &up->msg_lspid);
-			err2 |= __put_user (m.msg_lrpid, &up->msg_lrpid);
-			if (err2)
-				err = -EFAULT;
-		}
-	} else {
-		struct msqid_ds m;
-		struct msqid_ds32 *up = (struct msqid_ds32 *)uptr;
-		mm_segment_t old_fs;
-
-		if (second == IPC_SET) {
-			err = get_user (m.msg_perm.uid, &up->msg_perm.uid);
-			err |= __get_user (m.msg_perm.gid, &up->msg_perm.gid);
-			err |= __get_user (m.msg_perm.mode, &up->msg_perm.mode);
-			err |= __get_user (m.msg_qbytes, &up->msg_qbytes);
-			if (err)
-				goto out;
-		}
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_msgctl (first, second, &m);
-		set_fs (old_fs);
-		if (IPCOP_MASK (second) &
-		    (IPCOP_MASK (MSG_STAT) | IPCOP_MASK (IPC_STAT))) {
-			int err2 = put_user (m.msg_perm.key, &up->msg_perm.key);
-			err2 |= __put_user (high2lowuid(m.msg_perm.uid), &up->msg_perm.uid);
-			err2 |= __put_user (high2lowgid(m.msg_perm.gid), &up->msg_perm.gid);
-			err2 |= __put_user (high2lowuid(m.msg_perm.cuid), &up->msg_perm.cuid);
-			err2 |= __put_user (high2lowgid(m.msg_perm.cgid), &up->msg_perm.cgid);
-			err2 |= __put_user (m.msg_perm.mode, &up->msg_perm.mode);
-			err2 |= __put_user (m.msg_perm.seq, &up->msg_perm.seq);
-			err2 |= __put_user (m.msg_stime, &up->msg_stime);
-			err2 |= __put_user (m.msg_rtime, &up->msg_rtime);
-			err2 |= __put_user (m.msg_ctime, &up->msg_ctime);
-			err2 |= __put_user (m.msg_cbytes, &up->msg_cbytes);
-			err2 |= __put_user (m.msg_qnum, &up->msg_qnum);
-			err2 |= __put_user (m.msg_qbytes, &up->msg_qbytes);
-			err2 |= __put_user (m.msg_lspid, &up->msg_lspid);
-			err2 |= __put_user (m.msg_lrpid, &up->msg_lrpid);
-			if (err2)
-				err = -EFAULT;
-		}
-	}
-
-out:
-	return err;
-}
-
-static int do_sys32_shmat (int first, int second, int third, int version, void *uptr)
-{
-	unsigned long raddr;
-	u32 *uaddr = (u32 *)A((u32)third);
-	int err = -EINVAL;
-
-	if (version == 1)
-		goto out;
-	err = sys_shmat (first, uptr, second, &raddr);
-	if (err)
-		goto out;
-	err = put_user (raddr, uaddr);
-out:
-	return err;
-}
-
-static int do_sys32_shmctl (int first, int second, void *uptr)
-{
-	int err;
-
-	if (IPCOP_MASK (second) &
-	    (IPCOP_MASK (IPC_INFO) | IPCOP_MASK (SHM_LOCK) | IPCOP_MASK (SHM_UNLOCK) |
-	     IPCOP_MASK (IPC_RMID))) {
-		if (second == (IPC_INFO|IPC_64))
-			second = IPC_INFO; /* So that we don't have to translate it */
-		err = sys_shmctl (first, second, (struct shmid_ds *)uptr);
-	} else if ((second & IPC_64) && second != (SHM_INFO|IPC_64)) {
-		struct shmid64_ds s;
-		struct shmid64_ds32 *up = (struct shmid64_ds32 *)uptr;
-		mm_segment_t old_fs;
-
-		if (second == (IPC_SET|IPC_64)) {
-			err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
-			err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
-			err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
-			if (err)
-				goto out;
-		}
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_shmctl (first, second, (struct shmid_ds *)&s);
-		set_fs (old_fs);
-		if (err < 0)
-			goto out;
-
-		/* Mask it even in this case so it becomes a CSE. */
-		if (IPCOP_MASK (second) &
-		    (IPCOP_MASK (SHM_STAT) | IPCOP_MASK (IPC_STAT))) {
-			int err2 = put_user (s.shm_perm.key, &up->shm_perm.key);
-			err2 |= __put_user (high2lowuid(s.shm_perm.uid), &up->shm_perm.uid);
-			err2 |= __put_user (high2lowgid(s.shm_perm.gid), &up->shm_perm.gid);
-			err2 |= __put_user (high2lowuid(s.shm_perm.cuid), &up->shm_perm.cuid);
-			err2 |= __put_user (high2lowgid(s.shm_perm.cgid), &up->shm_perm.cgid);
-			err2 |= __put_user (s.shm_perm.mode, &up->shm_perm.mode);
-			err2 |= __put_user (s.shm_perm.seq, &up->shm_perm.seq);
-			err2 |= __put_user (s.shm_atime, &up->shm_atime);
-			err2 |= __put_user (s.shm_dtime, &up->shm_dtime);
-			err2 |= __put_user (s.shm_ctime, &up->shm_ctime);
-			err2 |= __put_user (s.shm_segsz, &up->shm_segsz);
-			err2 |= __put_user (s.shm_nattch, &up->shm_nattch);
-			err2 |= __put_user (s.shm_cpid, &up->shm_cpid);
-			err2 |= __put_user (s.shm_lpid, &up->shm_lpid);
-			if (err2)
-				err = -EFAULT;
-		}
-	} else {
-		struct shmid_ds s;
-		struct shmid_ds32 *up = (struct shmid_ds32 *)uptr;
-		mm_segment_t old_fs;
-
-		second &= ~IPC_64;
-		if (second == IPC_SET) {
-			err = get_user (s.shm_perm.uid, &up->shm_perm.uid);
-			err |= __get_user (s.shm_perm.gid, &up->shm_perm.gid);
-			err |= __get_user (s.shm_perm.mode, &up->shm_perm.mode);
-			if (err)
-				goto out;
-		}
-		old_fs = get_fs ();
-		set_fs (KERNEL_DS);
-		err = sys_shmctl (first, second, &s);
-		set_fs (old_fs);
-		if (err < 0)
-			goto out;
-
-		/* Mask it even in this case so it becomes a CSE. */
-		if (second == SHM_INFO) {
-			struct shm_info32 {
-				int used_ids;
-				u32 shm_tot, shm_rss, shm_swp;
-				u32 swap_attempts, swap_successes;
-			} *uip = (struct shm_info32 *)uptr;
-			struct shm_info *kp = (struct shm_info *)&s;
-			int err2 = put_user (kp->used_ids, &uip->used_ids);
-			err2 |= __put_user (kp->shm_tot, &uip->shm_tot);
-			err2 |= __put_user (kp->shm_rss, &uip->shm_rss);
-			err2 |= __put_user (kp->shm_swp, &uip->shm_swp);
-			err2 |= __put_user (kp->swap_attempts, &uip->swap_attempts);
-			err2 |= __put_user (kp->swap_successes, &uip->swap_successes);
-			if (err2)
-				err = -EFAULT;
-		} else if (IPCOP_MASK (second) &
-			   (IPCOP_MASK (SHM_STAT) | IPCOP_MASK (IPC_STAT))) {
-			int err2 = put_user (s.shm_perm.key, &up->shm_perm.key);
-			err2 |= __put_user (high2lowuid(s.shm_perm.uid), &up->shm_perm.uid);
-			err2 |= __put_user (high2lowgid(s.shm_perm.gid), &up->shm_perm.gid);
-			err2 |= __put_user (high2lowuid(s.shm_perm.cuid), &up->shm_perm.cuid);
-			err2 |= __put_user (high2lowgid(s.shm_perm.cgid), &up->shm_perm.cgid);
-			err2 |= __put_user (s.shm_perm.mode, &up->shm_perm.mode);
-			err2 |= __put_user (s.shm_perm.seq, &up->shm_perm.seq);
-			err2 |= __put_user (s.shm_atime, &up->shm_atime);
-			err2 |= __put_user (s.shm_dtime, &up->shm_dtime);
-			err2 |= __put_user (s.shm_ctime, &up->shm_ctime);
-			err2 |= __put_user (s.shm_segsz, &up->shm_segsz);
-			err2 |= __put_user (s.shm_nattch, &up->shm_nattch);
-			err2 |= __put_user (s.shm_cpid, &up->shm_cpid);
-			err2 |= __put_user (s.shm_lpid, &up->shm_lpid);
-			if (err2)
-				err = -EFAULT;
-		}
-	}
-out:
-	return err;
-}
-
-asmlinkage int sys32_ipc (u32 call, int first, int second, int third, u32 ptr, u32 fifth)
-{
-	int version, err;
-
-	version = call >> 16; /* hack for backward compatibility */
-	call &= 0xffff;
-
-	if(version)
-		return -EINVAL;
-
-	if (call <= SEMCTL)
-		switch (call) {
-		case SEMOP:
-			/* struct sembuf is the same on 32 and 64bit :)) */
-			err = sys_semop (first, (struct sembuf *)AA(ptr), second);
-			goto out;
-		case SEMGET:
-			err = sys_semget (first, second, third);
-			goto out;
-		case SEMCTL:
-			err = do_sys32_semctl (first, second, third, (void *)AA(ptr));
-			goto out;
-		default:
-			err = -EINVAL;
-			goto out;
-		};
-	if (call <= MSGCTL) 
-		switch (call) {
-		case MSGSND:
-			err = do_sys32_msgsnd (first, second, third, (void *)AA(ptr));
-			goto out;
-		case MSGRCV:
-			err = do_sys32_msgrcv (first, second, 0, third,
-					       version, (void *)AA(ptr));
-			goto out;
-		case MSGGET:
-			err = sys_msgget ((key_t) first, second);
-			goto out;
-		case MSGCTL:
-			err = do_sys32_msgctl (first, second, (void *)AA(ptr));
-			goto out;
-		default:
-			err = -EINVAL;
-			goto out;
-		}
-	if (call <= SHMCTL) 
-		switch (call) {
-		case SHMAT:
-			err = do_sys32_shmat (first, second, third,
-					      version, (void *)AA(ptr));
-			goto out;
-		case SHMDT: 
-			err = sys_shmdt ((char *)AA(ptr));
-			goto out;
-		case SHMGET:
-			err = sys_shmget (first, second, third);
-			goto out;
-		case SHMCTL:
-			err = do_sys32_shmctl (first, second, (void *)AA(ptr));
-			goto out;
-		default:
-			err = -EINVAL;
-			goto out;
-		}
-
-	err = -EINVAL;
-
-out:
-	return err;
-}
-
-extern asmlinkage long sys_truncate(const char * path, unsigned long length);
-extern asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length);
-
-asmlinkage int sys32_truncate64(const char * path, unsigned long high, unsigned long low)
-{
-	if ((int)high < 0)
-		return -EINVAL;
-	else
-		return sys_truncate(path, (high << 32) | low);
-}
-
-asmlinkage int sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low)
-{
-	if ((int)high < 0)
-		return -EINVAL;
-	else
-		return sys_ftruncate(fd, (high << 32) | low);
-}
-
-typedef ssize_t (*io_fn_t)(struct file *, char *, size_t, loff_t *);
-typedef ssize_t (*iov_fn_t)(struct file *, const struct iovec *, unsigned long, loff_t *);
-
-static long do_readv_writev32(int type, struct file *file,
-			      const struct compat_iovec *vector, u32 count)
-{
-	unsigned long tot_len;
-	struct iovec iovstack[UIO_FASTIOV];
-	struct iovec *iov=iovstack, *ivp;
-	struct inode *inode;
-	long retval, i;
-	io_fn_t fn;
-	iov_fn_t fnv;
-
-	/* First get the "struct iovec" from user memory and
-	 * verify all the pointers
-	 */
-	if (!count)
-		return 0;
-	if (verify_area(VERIFY_READ, vector, sizeof(struct compat_iovec)*count))
-		return -EFAULT;
-	if (count > UIO_MAXIOV)
-		return -EINVAL;
-	if (count > UIO_FASTIOV) {
-		iov = kmalloc(count*sizeof(struct iovec), GFP_KERNEL);
-		if (!iov)
-			return -ENOMEM;
-	}
-
-	tot_len = 0;
-	i = count;
-	ivp = iov;
-	while(i > 0) {
-		u32 len;
-		u32 buf;
-
-		__get_user(len, &vector->iov_len);
-		__get_user(buf, &vector->iov_base);
-		tot_len += len;
-		ivp->iov_base = (void *)A(buf);
-		ivp->iov_len = (__kernel_size_t) len;
-		vector++;
-		ivp++;
-		i--;
-	}
-
-	inode = file->f_dentry->d_inode;
-	/* VERIFY_WRITE actually means a read, as we write to user space */
-	retval = locks_verify_area((type == VERIFY_WRITE
-				    ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE),
-				   inode, file, file->f_pos, tot_len);
-	if (retval)
-		goto out;
-
-	/* VERIFY_WRITE actually means a read, as we write to user space */
-	fnv = (type == VERIFY_WRITE ? file->f_op->readv : file->f_op->writev);
-	if (fnv) {
-		retval = fnv(file, iov, count, &file->f_pos);
-		goto out;
-	}
-
-	fn = (type == VERIFY_WRITE ? file->f_op->read :
-	      (io_fn_t) file->f_op->write);
-
-	ivp = iov;
-	while (count > 0) {
-		void * base;
-		int len, nr;
-
-		base = ivp->iov_base;
-		len = ivp->iov_len;
-		ivp++;
-		count--;
-		nr = fn(file, base, len, &file->f_pos);
-		if (nr < 0) {
-			if (!retval)
-				retval = nr;
-			break;
-		}
-		retval += nr;
-		if (nr != len)
-			break;
-	}
-out:
-	if (iov != iovstack)
-		kfree(iov);
-
-	return retval;
-}
-
-asmlinkage long sys32_readv(int fd, struct compat_iovec *vector, u32 count)
-{
-	struct file *file;
-	long ret = -EBADF;
-
-	file = fget(fd);
-	if(!file)
-		goto bad_file;
-
-	if (file->f_op && (file->f_mode & FMODE_READ) &&
-	    (file->f_op->readv || file->f_op->read))
-		ret = do_readv_writev32(VERIFY_WRITE, file, vector, count);
-	fput(file);
-
-bad_file:
-	return ret;
-}
-
-asmlinkage long sys32_writev(int fd, struct compat_iovec *vector, u32 count)
-{
-	struct file *file;
-	int ret = -EBADF;
-
-	file = fget(fd);
-	if(!file)
-		goto bad_file;
-	if (file->f_op && (file->f_mode & FMODE_WRITE) &&
-	    (file->f_op->writev || file->f_op->write))
-		ret = do_readv_writev32(VERIFY_READ, file, vector, count);
-	fput(file);
-
-bad_file:
-	return ret;
-}
-
-/* readdir & getdents */
-
-#define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de)))
-#define ROUND_UP(x) (((x)+sizeof(u32)-1) & ~(sizeof(u32)-1))
-
-struct old_linux_dirent32 {
-	u32		d_ino;
-	u32		d_offset;
-	unsigned short	d_namlen;
-	char		d_name[1];
-};
-
-struct readdir_callback32 {
-	struct old_linux_dirent32 * dirent;
-	int count;
-};
-
-static int fillonedir(void * __buf, const char * name, int namlen,
-		      loff_t offset, ino_t ino, unsigned int d_type)
-{
-	struct readdir_callback32 * buf = (struct readdir_callback32 *) __buf;
-	struct old_linux_dirent32 * dirent;
-
-	if (buf->count)
-		return -EINVAL;
-	buf->count++;
-	dirent = buf->dirent;
-	put_user(ino, &dirent->d_ino);
-	put_user(offset, &dirent->d_offset);
-	put_user(namlen, &dirent->d_namlen);
-	copy_to_user(dirent->d_name, name, namlen);
-	put_user(0, dirent->d_name + namlen);
-	return 0;
-}
-
-asmlinkage int old32_readdir(unsigned int fd, struct old_linux_dirent32 *dirent, unsigned int count)
-{
-	int error = -EBADF;
-	struct file * file;
-	struct readdir_callback32 buf;
-
-	file = fget(fd);
-	if (!file)
-		goto out;
-
-	buf.count = 0;
-	buf.dirent = dirent;
-
-	error = vfs_readdir(file, fillonedir, &buf);
-	if (error < 0)
-		goto out_putf;
-	error = buf.count;
-
-out_putf:
-	fput(file);
-out:
-	return error;
-}
-
-struct linux_dirent32 {
-	u32		d_ino;
-	u32		d_off;
-	unsigned short	d_reclen;
-	char		d_name[1];
-};
-
-struct getdents_callback32 {
-	struct linux_dirent32 * current_dir;
-	struct linux_dirent32 * previous;
-	int count;
-	int error;
-};
-
-static int filldir(void * __buf, const char * name, int namlen, loff_t offset, ino_t ino,
-		   unsigned int d_type)
-{
-	struct linux_dirent32 * dirent;
-	struct getdents_callback32 * buf = (struct getdents_callback32 *) __buf;
-	int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
-
-	buf->error = -EINVAL;	/* only used if we fail.. */
-	if (reclen > buf->count)
-		return -EINVAL;
-	dirent = buf->previous;
-	if (dirent)
-		put_user(offset, &dirent->d_off);
-	dirent = buf->current_dir;
-	buf->previous = dirent;
-	put_user(ino, &dirent->d_ino);
-	put_user(reclen, &dirent->d_reclen);
-	copy_to_user(dirent->d_name, name, namlen);
-	put_user(0, dirent->d_name + namlen);
-	((char *) dirent) += reclen;
-	buf->current_dir = dirent;
-	buf->count -= reclen;
-	return 0;
-}
-
-asmlinkage int sys32_getdents(unsigned int fd, struct linux_dirent32 *dirent, unsigned int count)
-{
-	struct file * file;
-	struct linux_dirent32 * lastdirent;
-	struct getdents_callback32 buf;
-	int error = -EBADF;
-
-	file = fget(fd);
-	if (!file)
-		goto out;
-
-	buf.current_dir = dirent;
-	buf.previous = NULL;
-	buf.count = count;
-	buf.error = 0;
-
-	error = vfs_readdir(file, filldir, &buf);
-	if (error < 0)
-		goto out_putf;
-	lastdirent = buf.previous;
-	error = buf.error;
-	if(lastdirent) {
-		put_user(file->f_pos, &lastdirent->d_off);
-		error = count - buf.count;
-	}
-out_putf:
-	fput(file);
-out:
-	return error;
-}
-
-/* end of readdir & getdents */
-
-/*
- * Ooo, nasty.  We need here to frob 32-bit unsigned longs to
- * 64-bit unsigned longs.
- */
-
-static inline int
-get_fd_set32(unsigned long n, unsigned long *fdset, u32 *ufdset)
-{
-	if (ufdset) {
-		unsigned long odd;
-
-		if (verify_area(VERIFY_WRITE, ufdset, n*sizeof(u32)))
-			return -EFAULT;
-
-		odd = n & 1UL;
-		n &= ~1UL;
-		while (n) {
-			unsigned long h, l;
-			__get_user(l, ufdset);
-			__get_user(h, ufdset+1);
-			ufdset += 2;
-			*fdset++ = h << 32 | l;
-			n -= 2;
-		}
-		if (odd)
-			__get_user(*fdset, ufdset);
-	} else {
-		/* Tricky, must clear full unsigned long in the
-		 * kernel fdset at the end, this makes sure that
-		 * actually happens.
-		 */
-		memset(fdset, 0, ((n + 1) & ~1)*sizeof(u32));
-	}
-	return 0;
-}
-
-static inline void
-set_fd_set32(unsigned long n, u32 *ufdset, unsigned long *fdset)
-{
-	unsigned long odd;
-
-	if (!ufdset)
-		return;
-
-	odd = n & 1UL;
-	n &= ~1UL;
-	while (n) {
-		unsigned long h, l;
-		l = *fdset++;
-		h = l >> 32;
-		__put_user(l, ufdset);
-		__put_user(h, ufdset+1);
-		ufdset += 2;
-		n -= 2;
-	}
-	if (odd)
-		__put_user(*fdset, ufdset);
-}
-
-#define MAX_SELECT_SECONDS \
-	((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
-
-asmlinkage int sys32_select(int n, u32 *inp, u32 *outp, u32 *exp, u32 tvp_x)
-{
-	fd_set_bits fds;
-	struct compat_timeval *tvp = (struct compat_timeval *)AA(tvp_x);
-	char *bits;
-	unsigned long nn;
-	long timeout;
-	int ret, size;
-
-	timeout = MAX_SCHEDULE_TIMEOUT;
-	if (tvp) {
-		int sec, usec;
-
-		if ((ret = verify_area(VERIFY_READ, tvp, sizeof(*tvp)))
-		    || (ret = __get_user(sec, &tvp->tv_sec))
-		    || (ret = __get_user(usec, &tvp->tv_usec)))
-			goto out_nofds;
-
-		ret = -EINVAL;
-		if(sec < 0 || usec < 0)
-			goto out_nofds;
-
-		if ((unsigned long) sec < MAX_SELECT_SECONDS) {
-			timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
-			timeout += sec * (unsigned long) HZ;
-		}
-	}
-
-	ret = -EINVAL;
-	if (n < 0)
-		goto out_nofds;
-	if (n > current->files->max_fdset)
-		n = current->files->max_fdset;
-
-	/*
-	 * We need 6 bitmaps (in/out/ex for both incoming and outgoing),
-	 * since we used fdset we need to allocate memory in units of
-	 * long-words. 
-	 */
-	ret = -ENOMEM;
-	size = FDS_BYTES(n);
-	bits = kmalloc(6 * size, GFP_KERNEL);
-	if (!bits)
-		goto out_nofds;
-	fds.in      = (unsigned long *)  bits;
-	fds.out     = (unsigned long *) (bits +   size);
-	fds.ex      = (unsigned long *) (bits + 2*size);
-	fds.res_in  = (unsigned long *) (bits + 3*size);
-	fds.res_out = (unsigned long *) (bits + 4*size);
-	fds.res_ex  = (unsigned long *) (bits + 5*size);
-
-	nn = (n + 8*sizeof(u32) - 1) / (8*sizeof(u32));
-	if ((ret = get_fd_set32(nn, fds.in, inp)) ||
-	    (ret = get_fd_set32(nn, fds.out, outp)) ||
-	    (ret = get_fd_set32(nn, fds.ex, exp)))
-		goto out;
-	zero_fd_set(n, fds.res_in);
-	zero_fd_set(n, fds.res_out);
-	zero_fd_set(n, fds.res_ex);
-
-	ret = do_select(n, &fds, &timeout);
-
-	if (tvp && !(current->personality & STICKY_TIMEOUTS)) {
-		int sec = 0, usec = 0;
-		if (timeout) {
-			sec = timeout / HZ;
-			usec = timeout % HZ;
-			usec *= (1000000/HZ);
-		}
-		put_user(sec, &tvp->tv_sec);
-		put_user(usec, &tvp->tv_usec);
-	}
-
-	if (ret < 0)
-		goto out;
-	if (!ret) {
-		ret = -ERESTARTNOHAND;
-		if (signal_pending(current))
-			goto out;
-		ret = 0;
-	}
-
-	set_fd_set32(nn, inp, fds.res_in);
-	set_fd_set32(nn, outp, fds.res_out);
-	set_fd_set32(nn, exp, fds.res_ex);
-
-out:
-	kfree(bits);
-out_nofds:
-	return ret;
-}
-
-int cp_compat_stat(struct kstat *stat, struct compat_stat *statbuf)
-{
-	int err;
-
-	err = put_user(stat->dev, &statbuf->st_dev);
-	err |= put_user(stat->ino, &statbuf->st_ino);
-	err |= put_user(stat->mode, &statbuf->st_mode);
-	err |= put_user(stat->nlink, &statbuf->st_nlink);
-	err |= put_user(high2lowuid(stat->uid), &statbuf->st_uid);
-	err |= put_user(high2lowgid(stat->gid), &statbuf->st_gid);
-	err |= put_user(stat->rdev, &statbuf->st_rdev);
-	err |= put_user(stat->size, &statbuf->st_size);
-	err |= put_user(stat->atime.tv_sec, &statbuf->st_atime);
-	err |= put_user(stat->atime.tv_nsec, &statbuf->st_atime_nsec);
-	err |= put_user(stat->mtime.tv_sec, &statbuf->st_mtime);
-	err |= put_user(stat->mtime.tv_nsec, &statbuf->st_mtime_nsec);
-	err |= put_user(stat->ctime.tv_sec, &statbuf->st_ctime);
-	err |= put_user(stat->ctime.tv_nsec, &statbuf->st_ctime_nsec);
-	err |= put_user(stat->blksize, &statbuf->st_blksize);
-	err |= put_user(stat->blocks, &statbuf->st_blocks);
-/* fixme
-	err |= put_user(0, &statbuf->__unused4[0]);
-	err |= put_user(0, &statbuf->__unused4[1]);
-*/
-	return err;
-}
-
-extern asmlinkage int sys_sysfs(int option, unsigned long arg1, unsigned long arg2);
-
-asmlinkage int sys32_sysfs(int option, u32 arg1, u32 arg2)
-{
-	return sys_sysfs(option, arg1, arg2);
-}
-
-struct ncp_mount_data32 {
-        int version;
-        unsigned int ncp_fd;
-        compat_uid_t mounted_uid;
-        compat_pid_t wdog_pid;
-        unsigned char mounted_vol[NCP_VOLNAME_LEN + 1];
-        unsigned int time_out;
-        unsigned int retry_count;
-        unsigned int flags;
-        compat_uid_t uid;
-        compat_gid_t gid;
-        compat_mode_t file_mode;
-        compat_mode_t dir_mode;
-};
-
-static void *do_ncp_super_data_conv(void *raw_data)
-{
-	struct ncp_mount_data *n = (struct ncp_mount_data *)raw_data;
-	struct ncp_mount_data32 *n32 = (struct ncp_mount_data32 *)raw_data;
-
-	n->dir_mode = n32->dir_mode;
-	n->file_mode = n32->file_mode;
-	n->gid = low2highgid(n32->gid);
-	n->uid = low2highuid(n32->uid);
-	memmove (n->mounted_vol, n32->mounted_vol, (sizeof (n32->mounted_vol) + 3 * sizeof (unsigned int)));
-	n->wdog_pid = n32->wdog_pid;
-	n->mounted_uid = low2highuid(n32->mounted_uid);
-	return raw_data;
-}
-
-struct smb_mount_data32 {
-        int version;
-        compat_uid_t mounted_uid;
-        compat_uid_t uid;
-        compat_gid_t gid;
-        compat_mode_t file_mode;
-        compat_mode_t dir_mode;
-};
-
-static void *do_smb_super_data_conv(void *raw_data)
-{
-	struct smb_mount_data *s = (struct smb_mount_data *)raw_data;
-	struct smb_mount_data32 *s32 = (struct smb_mount_data32 *)raw_data;
-
-	if (s32->version != SMB_MOUNT_OLDVERSION)
-		goto out;
-	s->version = s32->version;
-	s->mounted_uid = low2highuid(s32->mounted_uid);
-	s->uid = low2highuid(s32->uid);
-	s->gid = low2highgid(s32->gid);
-	s->file_mode = s32->file_mode;
-	s->dir_mode = s32->dir_mode;
-out:
-	return raw_data;
-}
-
-static int copy_mount_stuff_to_kernel(const void *user, unsigned long *kernel)
-{
-	int i;
-	unsigned long page;
-	struct vm_area_struct *vma;
-
-	*kernel = 0;
-	if(!user)
-		return 0;
-	vma = find_vma(current->mm, (unsigned long)user);
-	if(!vma || (unsigned long)user < vma->vm_start)
-		return -EFAULT;
-	if(!(vma->vm_flags & VM_READ))
-		return -EFAULT;
-	i = vma->vm_end - (unsigned long) user;
-	if(PAGE_SIZE <= (unsigned long) i)
-		i = PAGE_SIZE - 1;
-	if(!(page = __get_free_page(GFP_KERNEL)))
-		return -ENOMEM;
-	if(copy_from_user((void *) page, user, i)) {
-		free_page(page);
-		return -EFAULT;
-	}
-	*kernel = page;
-	return 0;
-}
-
-#define SMBFS_NAME	"smbfs"
-#define NCPFS_NAME	"ncpfs"
-
-asmlinkage int sys32_mount(char *dev_name, char *dir_name, char *type, unsigned long new_flags, u32 data)
-{
-	unsigned long type_page = 0;
-	unsigned long data_page = 0;
-	unsigned long dev_page = 0;
-	unsigned long dir_page = 0;
-	int err, is_smb, is_ncp;
-
-	is_smb = is_ncp = 0;
-
-	err = copy_mount_stuff_to_kernel((const void *)type, &type_page);
-	if (err)
-		goto out;
-
-	if (!type_page) {
-		err = -EINVAL;
-		goto out;
-	}
-
-	is_smb = !strcmp((char *)type_page, SMBFS_NAME);
-	is_ncp = !strcmp((char *)type_page, NCPFS_NAME);
-
-	err = copy_mount_stuff_to_kernel((const void *)AA(data), &data_page);
-	if (err)
-		goto type_out;
-
-	err = copy_mount_stuff_to_kernel(dev_name, &dev_page);
-	if (err)
-		goto data_out;
-
-	err = copy_mount_stuff_to_kernel(dir_name, &dir_page);
-	if (err)
-		goto dev_out;
-
-	if (!is_smb && !is_ncp) {
-		lock_kernel();
-		err = do_mount((char*)dev_page, (char*)dir_page,
-				(char*)type_page, new_flags, (char*)data_page);
-		unlock_kernel();
-	} else {
-		if (is_ncp)
-			do_ncp_super_data_conv((void *)data_page);
-		else
-			do_smb_super_data_conv((void *)data_page);
-
-		lock_kernel();
-		err = do_mount((char*)dev_page, (char*)dir_page,
-				(char*)type_page, new_flags, (char*)data_page);
-		unlock_kernel();
-	}
-	free_page(dir_page);
-
-dev_out:
-	free_page(dev_page);
-
-data_out:
-	free_page(data_page);
-
-type_out:
-	free_page(type_page);
-
-out:
-	return err;
-}
-
-struct rusage32 {
-        struct compat_timeval ru_utime;
-        struct compat_timeval ru_stime;
-        s32    ru_maxrss;
-        s32    ru_ixrss;
-        s32    ru_idrss;
-        s32    ru_isrss;
-        s32    ru_minflt;
-        s32    ru_majflt;
-        s32    ru_nswap;
-        s32    ru_inblock;
-        s32    ru_oublock;
-        s32    ru_msgsnd; 
-        s32    ru_msgrcv; 
-        s32    ru_nsignals;
-        s32    ru_nvcsw;
-        s32    ru_nivcsw;
-};
-
-static int put_rusage (struct rusage32 *ru, struct rusage *r)
-{
-	int err;
-	
-	err = put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);
-	err |= __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec);
-	err |= __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec);
-	err |= __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec);
-	err |= __put_user (r->ru_maxrss, &ru->ru_maxrss);
-	err |= __put_user (r->ru_ixrss, &ru->ru_ixrss);
-	err |= __put_user (r->ru_idrss, &ru->ru_idrss);
-	err |= __put_user (r->ru_isrss, &ru->ru_isrss);
-	err |= __put_user (r->ru_minflt, &ru->ru_minflt);
-	err |= __put_user (r->ru_majflt, &ru->ru_majflt);
-	err |= __put_user (r->ru_nswap, &ru->ru_nswap);
-	err |= __put_user (r->ru_inblock, &ru->ru_inblock);
-	err |= __put_user (r->ru_oublock, &ru->ru_oublock);
-	err |= __put_user (r->ru_msgsnd, &ru->ru_msgsnd);
-	err |= __put_user (r->ru_msgrcv, &ru->ru_msgrcv);
-	err |= __put_user (r->ru_nsignals, &ru->ru_nsignals);
-	err |= __put_user (r->ru_nvcsw, &ru->ru_nvcsw);
-	err |= __put_user (r->ru_nivcsw, &ru->ru_nivcsw);
-	return err;
-}
-
-asmlinkage int sys32_wait4(compat_pid_t pid, unsigned int *stat_addr, int options, struct rusage32 *ru)
-{
-	if (!ru)
-		return sys_wait4(pid, stat_addr, options, NULL);
-	else {
-		struct rusage r;
-		int ret;
-		unsigned int status;
-		mm_segment_t old_fs = get_fs();
-		
-		set_fs (KERNEL_DS);
-		ret = sys_wait4(pid, stat_addr ? &status : NULL, options, &r);
-		set_fs (old_fs);
-		if (put_rusage (ru, &r)) return -EFAULT;
-		if (stat_addr && put_user (status, stat_addr))
-			return -EFAULT;
-		return ret;
-	}
-}
-
-struct sysinfo32 {
-        s32 uptime;
-        u32 loads[3];
-        u32 totalram;
-        u32 freeram;
-        u32 sharedram;
-        u32 bufferram;
-        u32 totalswap;
-        u32 freeswap;
-        unsigned short procs;
-        char _f[22];
-};
-
-extern asmlinkage int sys_sysinfo(struct sysinfo *info);
-
-asmlinkage int sys32_sysinfo(struct sysinfo32 *info)
-{
-	struct sysinfo s;
-	int ret, err;
-	mm_segment_t old_fs = get_fs ();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_sysinfo(&s);
-	set_fs (old_fs);
-	err = put_user (s.uptime, &info->uptime);
-	err |= __put_user (s.loads[0], &info->loads[0]);
-	err |= __put_user (s.loads[1], &info->loads[1]);
-	err |= __put_user (s.loads[2], &info->loads[2]);
-	err |= __put_user (s.totalram, &info->totalram);
-	err |= __put_user (s.freeram, &info->freeram);
-	err |= __put_user (s.sharedram, &info->sharedram);
-	err |= __put_user (s.bufferram, &info->bufferram);
-	err |= __put_user (s.totalswap, &info->totalswap);
-	err |= __put_user (s.freeswap, &info->freeswap);
-	err |= __put_user (s.procs, &info->procs);
-	if (err)
-		return -EFAULT;
-	return ret;
-}
-
-extern asmlinkage int sys_sched_rr_get_interval(pid_t pid, struct timespec *interval);
-
-asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
-		struct compat_timespec *interval)
-{
-	struct timespec t;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_sched_rr_get_interval(pid, &t);
-	set_fs (old_fs);
-	if (put_compat_timespec(&t, interval))
-		return -EFAULT;
-	return ret;
-}
-
-extern asmlinkage int sys_rt_sigprocmask(int how, sigset_t *set, sigset_t *oset, size_t sigsetsize);
-
-asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t *set, compat_sigset_t *oset, compat_size_t sigsetsize)
-{
-	sigset_t s;
-	compat_sigset_t s32;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-	
-	if (set) {
-		if (copy_from_user (&s32, set, sizeof(compat_sigset_t)))
-			return -EFAULT;
-		switch (_NSIG_WORDS) {
-		case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
-		case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
-		case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
-		case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
-		}
-	}
-	set_fs (KERNEL_DS);
-	ret = sys_rt_sigprocmask(how, set ? &s : NULL, oset ? &s : NULL, sigsetsize);
-	set_fs (old_fs);
-	if (ret) return ret;
-	if (oset) {
-		switch (_NSIG_WORDS) {
-		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
-		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
-		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
-		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
-		}
-		if (copy_to_user (oset, &s32, sizeof(compat_sigset_t)))
-			return -EFAULT;
-	}
-	return 0;
-}
-
-extern asmlinkage int sys_rt_sigpending(sigset_t *set, size_t sigsetsize);
-
-asmlinkage int sys32_rt_sigpending(compat_sigset_t *set, compat_size_t sigsetsize)
-{
-	sigset_t s;
-	compat_sigset_t s32;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-		
-	set_fs (KERNEL_DS);
-	ret = sys_rt_sigpending(&s, sigsetsize);
-	set_fs (old_fs);
-	if (!ret) {
-		switch (_NSIG_WORDS) {
-		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3];
-		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2];
-		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1];
-		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0];
-		}
-		if (copy_to_user (set, &s32, sizeof(compat_sigset_t)))
-			return -EFAULT;
-	}
-	return ret;
-}
-
-extern int
-copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from);
-
-asmlinkage int
-sys32_rt_sigtimedwait(compat_sigset_t *uthese, siginfo_t32 *uinfo,
-		      struct compat_timespec *uts, compat_size_t sigsetsize)
-{
-	int ret, sig;
-	sigset_t these;
-	compat_sigset_t these32;
-	struct timespec ts;
-	siginfo_t info;
-	long timeout = 0;
-
-	/* XXX: Don't preclude handling different sized sigset_t's.  */
-	if (sigsetsize != sizeof(sigset_t))
-		return -EINVAL;
-
-	if (copy_from_user (&these32, uthese, sizeof(compat_sigset_t)))
-		return -EFAULT;
-
-	switch (_NSIG_WORDS) {
-	case 4: these.sig[3] = these32.sig[6] | (((long)these32.sig[7]) << 32);
-	case 3: these.sig[2] = these32.sig[4] | (((long)these32.sig[5]) << 32);
-	case 2: these.sig[1] = these32.sig[2] | (((long)these32.sig[3]) << 32);
-	case 1: these.sig[0] = these32.sig[0] | (((long)these32.sig[1]) << 32);
-	}
-		
-	/*
-	 * Invert the set of allowed signals to get those we
-	 * want to block.
-	 */
-	sigdelsetmask(&these, sigmask(SIGKILL)|sigmask(SIGSTOP));
-	signotset(&these);
-
-	if (uts) {
-		if (get_compat_timespec(&ts, uts))
-			return -EINVAL;
-		if (ts.tv_nsec >= 1000000000L || ts.tv_nsec < 0
-		    || ts.tv_sec < 0)
-			return -EINVAL;
-	}
-
-	spin_lock_irq(&current->sighand->siglock);
-	sig = dequeue_signal(current, &these, &info);
-	if (!sig) {
-		/* None ready -- temporarily unblock those we're interested
-		   in so that we'll be awakened when they arrive.  */
-		current->real_blocked = current->blocked;
-		sigandsets(&current->blocked, &current->blocked, &these);
-		recalc_sigpending();
-		spin_unlock_irq(&current->sighand->siglock);
-
-		timeout = MAX_SCHEDULE_TIMEOUT;
-		if (uts)
-			timeout = (timespec_to_jiffies(&ts)
-				   + (ts.tv_sec || ts.tv_nsec));
-
-		current->state = TASK_INTERRUPTIBLE;
-		timeout = schedule_timeout(timeout);
-
-		spin_lock_irq(&current->sighand->siglock);
-		sig = dequeue_signal(current, &these, &info);
-		current->blocked = current->real_blocked;
-		siginitset(&current->real_blocked, 0);
-		recalc_sigpending();
-	}
-	spin_unlock_irq(&current->sighand->siglock);
-
-	if (sig) {
-		ret = sig;
-		if (uinfo) {
-			if (copy_siginfo_to_user32(uinfo, &info))
-				ret = -EFAULT;
-		}
-	} else {
-		ret = -EAGAIN;
-		if (timeout)
-			ret = -EINTR;
-	}
-
-	return ret;
-}
-
-extern asmlinkage int
-sys_rt_sigqueueinfo(int pid, int sig, siginfo_t *uinfo);
-
-asmlinkage int
-sys32_rt_sigqueueinfo(int pid, int sig, siginfo_t32 *uinfo)
-{
-	siginfo_t info;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-	
-	if (copy_from_user (&info, uinfo, 3*sizeof(int)) ||
-	    copy_from_user (info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE))
-		return -EFAULT;
-	set_fs (KERNEL_DS);
-	ret = sys_rt_sigqueueinfo(pid, sig, &info);
-	set_fs (old_fs);
-	return ret;
-}
-
-#define RLIM_OLD_INFINITY32	0x7fffffff
-#define RLIM_INFINITY32		0xffffffff
-#define RESOURCE32_OLD(x)	((x > RLIM_OLD_INFINITY32) ? RLIM_OLD_INFINITY32 : x)
-#define RESOURCE32(x) 		((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)
-
-struct rlimit32 {
-	u32	rlim_cur;
-	u32	rlim_max;
-};
-
-extern asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit *rlim);
-
-asmlinkage int sys32_old_getrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_getrlimit(resource, &r);
-	set_fs (old_fs);
-	if (!ret) {
-		ret = put_user (RESOURCE32_OLD(r.rlim_cur), &rlim->rlim_cur);
-		ret |= __put_user (RESOURCE32_OLD(r.rlim_max), &rlim->rlim_max);
-	}
-	return ret;
-}
-
-asmlinkage int sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_getrlimit(resource, &r);
-	set_fs (old_fs);
-	if (!ret) {
-		ret = put_user (RESOURCE32(r.rlim_cur), &rlim->rlim_cur);
-		ret |= __put_user (RESOURCE32(r.rlim_max), &rlim->rlim_max);
-	}
-	return ret;
-}
-
-extern asmlinkage int sys_setrlimit(unsigned int resource, struct rlimit *rlim);
-
-asmlinkage int sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-
-	if (resource >= RLIM_NLIMITS) return -EINVAL;	
-	if (get_user (r.rlim_cur, &rlim->rlim_cur) ||
-	    __get_user (r.rlim_max, &rlim->rlim_max))
-		return -EFAULT;
-	if (r.rlim_cur == RLIM_INFINITY32)
-		r.rlim_cur = RLIM_INFINITY;
-	if (r.rlim_max == RLIM_INFINITY32)
-		r.rlim_max = RLIM_INFINITY;
-	set_fs (KERNEL_DS);
-	ret = sys_setrlimit(resource, &r);
-	set_fs (old_fs);
-	return ret;
-}
-
-extern asmlinkage int sys_getrusage(int who, struct rusage *ru);
-
-asmlinkage int sys32_getrusage(int who, struct rusage32 *ru)
-{
-	struct rusage r;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-		
-	set_fs (KERNEL_DS);
-	ret = sys_getrusage(who, &r);
-	set_fs (old_fs);
-	if (put_rusage (ru, &r)) return -EFAULT;
-	return ret;
-}
-
-extern void check_pending(int signum);
-
-/*
- * count32() counts the number of arguments/envelopes
- */
-static int count32(u32 * argv)
-{
-	int i = 0;
-
-	if (argv != NULL) {
-		for (;;) {
-			u32 p; int error;
-
-			error = get_user(p,argv);
-			if (error) return error;
-			if (!p) break;
-			argv++; i++;
-		}
-	}
-	return i;
-}
-
-/*
- * 'copy_string32()' copies argument/envelope strings from user
- * memory to free pages in kernel mem. These are in a format ready
- * to be put directly into the top of new user memory.
- */
-static int copy_strings32(int argc, u32 * argv, struct linux_binprm *bprm)
-{
-	while (argc-- > 0) {
-		u32 str;
-		int len;
-		unsigned long pos;
-
-		if (get_user(str, argv + argc) ||
-		    !str ||
-		    !(len = strnlen_user((char *)A(str), bprm->p)))
-			return -EFAULT;
-
-		if (bprm->p < len)
-			return -E2BIG;
-
-		bprm->p -= len;
-
-		pos = bprm->p;
-		while (len) {
-			char *kaddr;
-			struct page *page;
-			int offset, bytes_to_copy, new, err;
-
-			offset = pos % PAGE_SIZE;
-			page = bprm->page[pos / PAGE_SIZE];
-			new = 0;
-			if (!page) {
-				page = alloc_page(GFP_USER);
-				bprm->page[pos / PAGE_SIZE] = page;
-				if (!page)
-					return -ENOMEM;
-				new = 1;
-			}
-			kaddr = (char *)kmap(page);
-
-			if (new && offset)
-				memset(kaddr, 0, offset);
-			bytes_to_copy = PAGE_SIZE - offset;
-			if (bytes_to_copy > len) {
-				bytes_to_copy = len;
-				if (new)
-					memset(kaddr+offset+len, 0,
-					       PAGE_SIZE-offset-len);
-			}
-
-			err = copy_from_user(kaddr + offset, (char *)A(str),
-					     bytes_to_copy);
-			flush_page_to_ram(page);
-			kunmap(page);
-
-			if (err)
-				return -EFAULT;
-
-			pos += bytes_to_copy;
-			str += bytes_to_copy;
-			len -= bytes_to_copy;
-		}
-	}
-	return 0;
-}
-
-/*
- * sys32_execve() executes a new program.
- */
-static inline int 
-do_execve32(char * filename, u32 * argv, u32 * envp, struct pt_regs * regs)
-{
-	struct linux_binprm bprm;
-	struct file * file;
-	int retval;
-	int i;
-
-	sched_balance_exec();
-
-	file = open_exec(filename);
-
-	retval = PTR_ERR(file);
-	if (IS_ERR(file))
-		return retval;
-
-	bprm.p = PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *);
-	memset(bprm.page, 0, MAX_ARG_PAGES * sizeof(bprm.page[0]));
-
-	bprm.file = file;
-	bprm.filename = filename;
-	bprm.sh_bang = 0;
-	bprm.loader = 0;
-	bprm.exec = 0;
-	bprm.mm = mm_alloc();
-	retval = -ENOMEM;
-	if (!bprm.mm)
-		goto out_file;
-
-	/* init_new_context is empty for s390x. */
-
-	bprm.argc = count32(argv);
-	if ((retval = bprm.argc) < 0)
-		goto out_mm;
-
-	bprm.envc = count32(envp);
-	if ((retval = bprm.envc) < 0)
-		goto out_mm;
-
-	retval = security_bprm_alloc(&bprm);
-	if (retval)
-		goto out;
-
-	retval = prepare_binprm(&bprm);
-	if (retval < 0)
-		goto out;
-	
-	retval = copy_strings_kernel(1, &bprm.filename, &bprm);
-	if (retval < 0)
-		goto out;
-
-	bprm.exec = bprm.p;
-	retval = copy_strings32(bprm.envc, envp, &bprm);
-	if (retval < 0)
-		goto out;
-
-	retval = copy_strings32(bprm.argc, argv, &bprm);
-	if (retval < 0)
-		goto out;
-
-	retval = search_binary_handler(&bprm, regs);
-	if (retval >= 0) {
-		/* execve success */
-		security_bprm_free(&bprm);
-		return retval;
-	}
-
-out:
-	/* Something went wrong, return the inode and free the argument pages*/
-	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);
-
-out_mm:
-	mmdrop(bprm.mm);
-
-out_file:
-	if (bprm.file) {
-		allow_write_access(bprm.file);
-		fput(bprm.file);
-	}
-
-	return retval;
-}
-
-/*
- * sys32_execve() executes a new program after the asm stub has set
- * things up for us.  This should basically do what I want it to.
- */
-asmlinkage int
-sys32_execve(struct pt_regs regs)
-{
-        int error;
-        char * filename;
-
-        filename = getname((char *)A(regs.orig_gpr2));
-        error = PTR_ERR(filename);
-        if (IS_ERR(filename))
-                goto out;
-        error = do_execve32(filename, (u32 *)A(regs.gprs[3]), (u32 *)A(regs.gprs[4]), &regs);
-	if (error == 0)
-	{
-		current->ptrace &= ~PT_DTRACE;
-		current->thread.fp_regs.fpc=0;
-		__asm__ __volatile__
-		        ("sr  0,0\n\t"
-		         "sfpc 0,0\n\t"
-			 : : :"0");
-	}
-        putname(filename);
-out:
-        return error;
-}
-
-
-#ifdef CONFIG_MODULES
-
-extern asmlinkage int sys_init_module(const char *name_user, struct module *mod_user);
-
-/* Hey, when you're trying to init module, take time and prepare us a nice 64bit
- * module structure, even if from 32bit modutils... Why to pollute kernel... :))
- */
-asmlinkage int sys32_init_module(const char *name_user, struct module *mod_user)
-{
-	return sys_init_module(name_user, mod_user);
-}
-
-extern asmlinkage int sys_delete_module(const char *name_user);
-
-asmlinkage int sys32_delete_module(const char *name_user)
-{
-	return sys_delete_module(name_user);
-}
-
-struct module_info32 {
-	u32 addr;
-	u32 size;
-	u32 flags;
-	s32 usecount;
-};
-
-#else /* CONFIG_MODULES */
-
-asmlinkage int
-sys32_init_module(const char *name_user, struct module *mod_user)
-{
-	return -ENOSYS;
-}
-
-asmlinkage int
-sys32_delete_module(const char *name_user)
-{
-	return -ENOSYS;
-}
-
-#endif  /* CONFIG_MODULES */
-
-/* Stuff for NFS server syscalls... */
-struct nfsctl_svc32 {
-	u16			svc32_port;
-	s32			svc32_nthreads;
-};
-
-struct nfsctl_client32 {
-	s8			cl32_ident[NFSCLNT_IDMAX+1];
-	s32			cl32_naddr;
-	struct in_addr		cl32_addrlist[NFSCLNT_ADDRMAX];
-	s32			cl32_fhkeytype;
-	s32			cl32_fhkeylen;
-	u8			cl32_fhkey[NFSCLNT_KEYMAX];
-};
-
-struct nfsctl_export32 {
-	s8			ex32_client[NFSCLNT_IDMAX+1];
-	s8			ex32_path[NFS_MAXPATHLEN+1];
-	compat_dev_t	ex32_dev;
-	compat_ino_t	ex32_ino;
-	s32			ex32_flags;
-	compat_uid_t	ex32_anon_uid;
-	compat_gid_t	ex32_anon_gid;
-};
-
-struct nfsctl_fdparm32 {
-	struct sockaddr		gd32_addr;
-	s8			gd32_path[NFS_MAXPATHLEN+1];
-	s32			gd32_version;
-};
-
-struct nfsctl_fsparm32 {
-	struct sockaddr		gd32_addr;
-	s8			gd32_path[NFS_MAXPATHLEN+1];
-	s32			gd32_maxlen;
-};
-
-struct nfsctl_arg32 {
-	s32			ca32_version;	/* safeguard */
-	union {
-		struct nfsctl_svc32	u32_svc;
-		struct nfsctl_client32	u32_client;
-		struct nfsctl_export32	u32_export;
-		struct nfsctl_fdparm32	u32_getfd;
-		struct nfsctl_fsparm32	u32_getfs;
-	} u;
-#define ca32_svc	u.u32_svc
-#define ca32_client	u.u32_client
-#define ca32_export	u.u32_export
-#define ca32_getfd	u.u32_getfd
-#define ca32_getfs	u.u32_getfs
-#define ca32_authd	u.u32_authd
-};
-
-union nfsctl_res32 {
-	__u8			cr32_getfh[NFS_FHSIZE];
-	struct knfsd_fh		cr32_getfs;
-};
-
-static int nfs_svc32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
-{
-	int err;
-	
-	err = __get_user(karg->ca_version, &arg32->ca32_version);
-	err |= __get_user(karg->ca_svc.svc_port, &arg32->ca32_svc.svc32_port);
-	err |= __get_user(karg->ca_svc.svc_nthreads, &arg32->ca32_svc.svc32_nthreads);
-	return err;
-}
-
-static int nfs_clnt32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
-{
-	int err;
-	
-	err = __get_user(karg->ca_version, &arg32->ca32_version);
-	err |= copy_from_user(&karg->ca_client.cl_ident[0],
-			  &arg32->ca32_client.cl32_ident[0],
-			  NFSCLNT_IDMAX);
-	err |= __get_user(karg->ca_client.cl_naddr, &arg32->ca32_client.cl32_naddr);
-	err |= copy_from_user(&karg->ca_client.cl_addrlist[0],
-			  &arg32->ca32_client.cl32_addrlist[0],
-			  (sizeof(struct in_addr) * NFSCLNT_ADDRMAX));
-	err |= __get_user(karg->ca_client.cl_fhkeytype,
-		      &arg32->ca32_client.cl32_fhkeytype);
-	err |= __get_user(karg->ca_client.cl_fhkeylen,
-		      &arg32->ca32_client.cl32_fhkeylen);
-	err |= copy_from_user(&karg->ca_client.cl_fhkey[0],
-			  &arg32->ca32_client.cl32_fhkey[0],
-			  NFSCLNT_KEYMAX);
-	return err;
-}
-
-static int nfs_exp32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
-{
-	int err;
-	
-	err = __get_user(karg->ca_version, &arg32->ca32_version);
-	err |= copy_from_user(&karg->ca_export.ex_client[0],
-			  &arg32->ca32_export.ex32_client[0],
-			  NFSCLNT_IDMAX);
-	err |= copy_from_user(&karg->ca_export.ex_path[0],
-			  &arg32->ca32_export.ex32_path[0],
-			  NFS_MAXPATHLEN);
-	err |= __get_user(karg->ca_export.ex_dev,
-		      &arg32->ca32_export.ex32_dev);
-	err |= __get_user(karg->ca_export.ex_ino,
-		      &arg32->ca32_export.ex32_ino);
-	err |= __get_user(karg->ca_export.ex_flags,
-		      &arg32->ca32_export.ex32_flags);
-	err |= __get_user(karg->ca_export.ex_anon_uid,
-		      &arg32->ca32_export.ex32_anon_uid);
-	err |= __get_user(karg->ca_export.ex_anon_gid,
-		      &arg32->ca32_export.ex32_anon_gid);
-	karg->ca_export.ex_anon_uid = high2lowuid(karg->ca_export.ex_anon_uid);
-	karg->ca_export.ex_anon_gid = high2lowgid(karg->ca_export.ex_anon_gid);
-	return err;
-}
-
-static int nfs_getfd32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
-{
-	int err;
-	
-	err = __get_user(karg->ca_version, &arg32->ca32_version);
-	err |= copy_from_user(&karg->ca_getfd.gd_addr,
-			  &arg32->ca32_getfd.gd32_addr,
-			  (sizeof(struct sockaddr)));
-	err |= copy_from_user(&karg->ca_getfd.gd_path,
-			  &arg32->ca32_getfd.gd32_path,
-			  (NFS_MAXPATHLEN+1));
-	err |= __get_user(karg->ca_getfd.gd_version,
-		      &arg32->ca32_getfd.gd32_version);
-	return err;
-}
-
-static int nfs_getfs32_trans(struct nfsctl_arg *karg, struct nfsctl_arg32 *arg32)
-{
-	int err;
-	
-	err = __get_user(karg->ca_version, &arg32->ca32_version);
-	err |= copy_from_user(&karg->ca_getfs.gd_addr,
-			  &arg32->ca32_getfs.gd32_addr,
-			  (sizeof(struct sockaddr)));
-	err |= copy_from_user(&karg->ca_getfs.gd_path,
-			  &arg32->ca32_getfs.gd32_path,
-			  (NFS_MAXPATHLEN+1));
-	err |= __get_user(karg->ca_getfs.gd_maxlen,
-		      &arg32->ca32_getfs.gd32_maxlen);
-	return err;
-}
-
-/* This really doesn't need translations, we are only passing
- * back a union which contains opaque nfs file handle data.
- */
-static int nfs_getfh32_res_trans(union nfsctl_res *kres, union nfsctl_res32 *res32)
-{
-	return copy_to_user(res32, kres, sizeof(*res32)) ? -EFAULT : 0;
-}
-
-/*
-asmlinkage long sys_ni_syscall(void); 
-*/
-
-int asmlinkage sys32_nfsservctl(int cmd, struct nfsctl_arg32 *arg32, union nfsctl_res32 *res32)
-{
-	struct nfsctl_arg *karg = NULL;
-	union nfsctl_res *kres = NULL;
-	mm_segment_t oldfs;
-	int err;
-
-	karg = kmalloc(sizeof(*karg), GFP_USER);
-	if(!karg)
-		return -ENOMEM;
-	if(res32) {
-		kres = kmalloc(sizeof(*kres), GFP_USER);
-		if(!kres) {
-			kfree(karg);
-			return -ENOMEM;
-		}
-	}
-	switch(cmd) {
-	case NFSCTL_SVC:
-		err = nfs_svc32_trans(karg, arg32);
-		break;
-	case NFSCTL_ADDCLIENT:
-		err = nfs_clnt32_trans(karg, arg32);
-		break;
-	case NFSCTL_DELCLIENT:
-		err = nfs_clnt32_trans(karg, arg32);
-		break;
-	case NFSCTL_EXPORT:
-	case NFSCTL_UNEXPORT:
-		err = nfs_exp32_trans(karg, arg32);
-		break;
-	case NFSCTL_GETFD:
-		err = nfs_getfd32_trans(karg, arg32);
-		break;
-	case NFSCTL_GETFS:
-		err = nfs_getfs32_trans(karg, arg32);
-		break;
-	default:
-		err = -EINVAL;
-		break;
-	}
-	if(err)
-		goto done;
-	oldfs = get_fs();
-	set_fs(KERNEL_DS);
-	err = sys_nfsservctl(cmd, karg, kres);
-	set_fs(oldfs);
-
-	if (err)
-		goto done;
-
-	if((cmd == NFSCTL_GETFD) ||
-	   (cmd == NFSCTL_GETFS))
-		err = nfs_getfh32_res_trans(kres, res32);
-
-done:
-	if(karg)
-		kfree(karg);
-	if(kres)
-		kfree(kres);
-	return err;
-}
-
-/* Translations due to time_t size differences.  Which affects all
-   sorts of things, like timeval and itimerval.  */
-
-extern struct timezone sys_tz;
-extern int do_sys_settimeofday(struct timeval *tv, struct timezone *tz);
-
-asmlinkage int sys32_gettimeofday(struct compat_timeval *tv, struct timezone *tz)
-{
-	if (tv) {
-		struct timeval ktv;
-		do_gettimeofday(&ktv);
-		if (put_tv32(tv, &ktv))
-			return -EFAULT;
-	}
-	if (tz) {
-		if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
-			return -EFAULT;
-	}
-	return 0;
-}
-
-asmlinkage int sys32_settimeofday(struct compat_timeval *tv, struct timezone *tz)
-{
-	struct timeval ktv;
-	struct timezone ktz;
-
- 	if (tv) {
-		if (get_tv32(&ktv, tv))
-			return -EFAULT;
-	}
-	if (tz) {
-		if (copy_from_user(&ktz, tz, sizeof(ktz)))
-			return -EFAULT;
-	}
-
-	return do_sys_settimeofday(tv ? &ktv : NULL, tz ? &ktz : NULL);
-}
-
-asmlinkage int sys_utimes(char *, struct timeval *);
-
-asmlinkage int sys32_utimes(char *filename, struct compat_timeval *tvs)
-{
-	char *kfilename;
-	struct timeval ktvs[2];
-	mm_segment_t old_fs;
-	int ret;
-
-	kfilename = getname(filename);
-	ret = PTR_ERR(kfilename);
-	if (!IS_ERR(kfilename)) {
-		if (tvs) {
-			if (get_tv32(&ktvs[0], tvs) ||
-			    get_tv32(&ktvs[1], 1+tvs))
-				return -EFAULT;
-		}
-
-		old_fs = get_fs();
-		set_fs(KERNEL_DS);
-		ret = sys_utimes(kfilename, &ktvs[0]);
-		set_fs(old_fs);
-
-		putname(kfilename);
-	}
-	return ret;
-}
-
-/* These are here just in case some old sparc32 binary calls it. */
-asmlinkage int sys32_pause(void)
-{
-	current->state = TASK_INTERRUPTIBLE;
-	schedule();
-	return -ERESTARTNOHAND;
-}
-
-extern asmlinkage int sys_prctl(int option, unsigned long arg2, unsigned long arg3,
-				unsigned long arg4, unsigned long arg5);
-
-asmlinkage int sys32_prctl(int option, u32 arg2, u32 arg3, u32 arg4, u32 arg5)
-{
-	return sys_prctl(option,
-			 (unsigned long) arg2,
-			 (unsigned long) arg3,
-			 (unsigned long) arg4,
-			 (unsigned long) arg5);
-}
-
-
-extern asmlinkage ssize_t sys_pread64(unsigned int fd, char * buf,
-				    size_t count, loff_t pos);
-
-extern asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char * buf,
-				     size_t count, loff_t pos);
-
-asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, char *ubuf,
-				 compat_size_t count, u32 poshi, u32 poslo)
-{
-	if ((compat_ssize_t) count < 0)
-		return -EINVAL;
-	return sys_pread64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo));
-}
-
-asmlinkage compat_ssize_t sys32_pwrite64(unsigned int fd, char *ubuf,
-				  compat_size_t count, u32 poshi, u32 poslo)
-{
-	if ((compat_ssize_t) count < 0)
-		return -EINVAL;
-	return sys_pwrite64(fd, ubuf, count, ((loff_t)AA(poshi) << 32) | AA(poslo));
-}
-
-extern asmlinkage ssize_t sys_readahead(int fd, loff_t offset, size_t count);
-
-asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 count)
-{
-	return sys_readahead(fd, ((loff_t)AA(offhi) << 32) | AA(offlo), count);
-}
-
-extern asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
-
-asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, s32 count)
-{
-	mm_segment_t old_fs = get_fs();
-	int ret;
-	off_t of;
-	
-	if (offset && get_user(of, offset))
-		return -EFAULT;
-		
-	set_fs(KERNEL_DS);
-	ret = sys_sendfile(out_fd, in_fd, offset ? &of : NULL, count);
-	set_fs(old_fs);
-	
-	if (!ret && offset && put_user(of, offset))
-		return -EFAULT;
-		
-	return ret;
-}
-
-extern asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, 
-					 loff_t *offset, size_t count);
-
-asmlinkage int sys32_sendfile64(int out_fd, int in_fd, 
-				compat_loff_t *offset, s32 count)
-{
-	mm_segment_t old_fs = get_fs();
-	int ret;
-	loff_t lof;
-	
-	if (offset && get_user(lof, offset))
-		return -EFAULT;
-		
-	set_fs(KERNEL_DS);
-	ret = sys_sendfile64(out_fd, in_fd, offset ? &lof : NULL, count);
-	set_fs(old_fs);
-	
-	if (offset && put_user(lof, offset))
-		return -EFAULT;
-		
-	return ret;
-}
-
-/* Handle adjtimex compatibility. */
-
-struct timex32 {
-	u32 modes;
-	s32 offset, freq, maxerror, esterror;
-	s32 status, constant, precision, tolerance;
-	struct compat_timeval time;
-	s32 tick;
-	s32 ppsfreq, jitter, shift, stabil;
-	s32 jitcnt, calcnt, errcnt, stbcnt;
-	s32  :32; s32  :32; s32  :32; s32  :32;
-	s32  :32; s32  :32; s32  :32; s32  :32;
-	s32  :32; s32  :32; s32  :32; s32  :32;
-};
-
-extern int do_adjtimex(struct timex *);
-
-asmlinkage int sys32_adjtimex(struct timex32 *utp)
-{
-	struct timex txc;
-	int ret;
-
-	memset(&txc, 0, sizeof(struct timex));
-
-	if(get_user(txc.modes, &utp->modes) ||
-	   __get_user(txc.offset, &utp->offset) ||
-	   __get_user(txc.freq, &utp->freq) ||
-	   __get_user(txc.maxerror, &utp->maxerror) ||
-	   __get_user(txc.esterror, &utp->esterror) ||
-	   __get_user(txc.status, &utp->status) ||
-	   __get_user(txc.constant, &utp->constant) ||
-	   __get_user(txc.precision, &utp->precision) ||
-	   __get_user(txc.tolerance, &utp->tolerance) ||
-	   __get_user(txc.time.tv_sec, &utp->time.tv_sec) ||
-	   __get_user(txc.time.tv_usec, &utp->time.tv_usec) ||
-	   __get_user(txc.tick, &utp->tick) ||
-	   __get_user(txc.ppsfreq, &utp->ppsfreq) ||
-	   __get_user(txc.jitter, &utp->jitter) ||
-	   __get_user(txc.shift, &utp->shift) ||
-	   __get_user(txc.stabil, &utp->stabil) ||
-	   __get_user(txc.jitcnt, &utp->jitcnt) ||
-	   __get_user(txc.calcnt, &utp->calcnt) ||
-	   __get_user(txc.errcnt, &utp->errcnt) ||
-	   __get_user(txc.stbcnt, &utp->stbcnt))
-		return -EFAULT;
-
-	ret = do_adjtimex(&txc);
-
-	if(put_user(txc.modes, &utp->modes) ||
-	   __put_user(txc.offset, &utp->offset) ||
-	   __put_user(txc.freq, &utp->freq) ||
-	   __put_user(txc.maxerror, &utp->maxerror) ||
-	   __put_user(txc.esterror, &utp->esterror) ||
-	   __put_user(txc.status, &utp->status) ||
-	   __put_user(txc.constant, &utp->constant) ||
-	   __put_user(txc.precision, &utp->precision) ||
-	   __put_user(txc.tolerance, &utp->tolerance) ||
-	   __put_user(txc.time.tv_sec, &utp->time.tv_sec) ||
-	   __put_user(txc.time.tv_usec, &utp->time.tv_usec) ||
-	   __put_user(txc.tick, &utp->tick) ||
-	   __put_user(txc.ppsfreq, &utp->ppsfreq) ||
-	   __put_user(txc.jitter, &utp->jitter) ||
-	   __put_user(txc.shift, &utp->shift) ||
-	   __put_user(txc.stabil, &utp->stabil) ||
-	   __put_user(txc.jitcnt, &utp->jitcnt) ||
-	   __put_user(txc.calcnt, &utp->calcnt) ||
-	   __put_user(txc.errcnt, &utp->errcnt) ||
-	   __put_user(txc.stbcnt, &utp->stbcnt))
-		ret = -EFAULT;
-
-	return ret;
-}
-
-extern asmlinkage long sys_setpriority(int which, int who, int niceval);
-
-asmlinkage int sys_setpriority32(u32 which, u32 who, u32 niceval)
-{
-	return sys_setpriority((int) which,
-			       (int) who,
-			       (int) niceval);
-}
-
-struct __sysctl_args32 {
-	u32 name;
-	int nlen;
-	u32 oldval;
-	u32 oldlenp;
-	u32 newval;
-	u32 newlen;
-	u32 __unused[4];
-};
-
-extern asmlinkage long sys32_sysctl(struct __sysctl_args32 *args)
-{
-	struct __sysctl_args32 tmp;
-	int error;
-	size_t oldlen, *oldlenp = NULL;
-	unsigned long addr = (((long)&args->__unused[0]) + 7) & ~7;
-
-	if (copy_from_user(&tmp, args, sizeof(tmp)))
-		return -EFAULT;
-
-	if (tmp.oldval && tmp.oldlenp) {
-		/* Duh, this is ugly and might not work if sysctl_args
-		   is in read-only memory, but do_sysctl does indirectly
-		   a lot of uaccess in both directions and we'd have to
-		   basically copy the whole sysctl.c here, and
-		   glibc's __sysctl uses rw memory for the structure
-		   anyway.  */
-		if (get_user(oldlen, (u32 *)A(tmp.oldlenp)) ||
-		    put_user(oldlen, (size_t *)addr))
-			return -EFAULT;
-		oldlenp = (size_t *)addr;
-	}
-
-	lock_kernel();
-	error = do_sysctl((int *)A(tmp.name), tmp.nlen, (void *)A(tmp.oldval),
-			  oldlenp, (void *)A(tmp.newval), tmp.newlen);
-	unlock_kernel();
-	if (oldlenp) {
-		if (!error) {
-			if (get_user(oldlen, (size_t *)addr) ||
-			    put_user(oldlen, (u32 *)A(tmp.oldlenp)))
-				error = -EFAULT;
-		}
-		copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused));
-	}
-	return error;
-}
-
-struct stat64_emu31 {
-	unsigned char   __pad0[6];
-	unsigned short  st_dev;
-	unsigned int    __pad1;
-#define STAT64_HAS_BROKEN_ST_INO        1
-	u32             __st_ino;
-	unsigned int    st_mode;
-	unsigned int    st_nlink;
-	u32             st_uid;
-	u32             st_gid;
-	unsigned char   __pad2[6];
-	unsigned short  st_rdev;
-	unsigned int    __pad3;
-	long            st_size;
-	u32             st_blksize;
-	unsigned char   __pad4[4];
-	u32             __pad5;     /* future possible st_blocks high bits */
-	u32             st_blocks;  /* Number 512-byte blocks allocated. */
-	u32             st_atime;
-	u32             __pad6;
-	u32             st_mtime;
-	u32             __pad7;
-	u32             st_ctime;
-	u32             __pad8;     /* will be high 32 bits of ctime someday */
-	unsigned long   st_ino;
-};	
-
-static inline int
-putstat64 (struct stat64_emu31 *ubuf, struct stat *kbuf)
-{
-    struct stat64_emu31 tmp;
-   
-    memset(&tmp, 0, sizeof(tmp));
-
-    tmp.st_dev = (unsigned short)kbuf->st_dev;
-    tmp.st_ino = kbuf->st_ino;
-    tmp.__st_ino = (u32)kbuf->st_ino;
-    tmp.st_mode = kbuf->st_mode;
-    tmp.st_nlink = (unsigned int)kbuf->st_nlink;
-    tmp.st_uid = kbuf->st_uid;
-    tmp.st_gid = kbuf->st_gid;
-    tmp.st_rdev = (unsigned short)kbuf->st_rdev;
-    tmp.st_size = kbuf->st_size;
-    tmp.st_blksize = (u32)kbuf->st_blksize;
-    tmp.st_blocks = (u32)kbuf->st_blocks;
-    tmp.st_atime = (u32)kbuf->st_atime;
-    tmp.st_mtime = (u32)kbuf->st_mtime;
-    tmp.st_ctime = (u32)kbuf->st_ctime;
-
-    return copy_to_user(ubuf,&tmp,sizeof(tmp)) ? -EFAULT : 0; 
-}
-
-extern asmlinkage long sys_newstat(char * filename, struct stat * statbuf);
-
-asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf, long flags)
-{
-    int ret;
-    struct stat s;
-    char * tmp;
-    int err;
-    mm_segment_t old_fs = get_fs();
-    
-    tmp = getname(filename);
-    err = PTR_ERR(tmp);
-    if (IS_ERR(tmp))   
-	    return err;
-
-    set_fs (KERNEL_DS);
-    ret = sys_newstat(tmp, &s);
-    set_fs (old_fs);
-    putname(tmp);
-    if (putstat64 (statbuf, &s)) 
-	    return -EFAULT;
-    return ret;
-}
-
-extern asmlinkage long sys_newlstat(char * filename, struct stat * statbuf);
-
-asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf, long flags)
-{
-    int ret;
-    struct stat s;
-    char * tmp;
-    int err;
-    mm_segment_t old_fs = get_fs();
-    
-    tmp = getname(filename);
-    err = PTR_ERR(tmp);
-    if (IS_ERR(tmp))   
-	    return err;
-
-    set_fs (KERNEL_DS);
-    ret = sys_newlstat(tmp, &s);
-    set_fs (old_fs);
-    putname(tmp);
-    if (putstat64 (statbuf, &s)) 
-	    return -EFAULT;
-    return ret;
-}
-
-extern asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf);
-
-asmlinkage long sys32_fstat64(unsigned long fd, struct stat64_emu31 * statbuf, long flags)
-{
-    int ret;
-    struct stat s;
-    mm_segment_t old_fs = get_fs();
-    
-    set_fs (KERNEL_DS);
-    ret = sys_newfstat(fd, &s);
-    set_fs (old_fs);
-    if (putstat64 (statbuf, &s))
-	    return -EFAULT;
-    return ret;
-}
-
-/*
- * Linux/i386 didn't use to be able to handle more than
- * 4 system call parameters, so these system calls used a memory
- * block for parameter passing..
- */
-
-struct mmap_arg_struct_emu31 {
-	u32	addr;
-	u32	len;
-	u32	prot;
-	u32	flags;
-	u32	fd;
-	u32	offset;
-};
-
-/* common code for old and new mmaps */
-static inline long do_mmap2(
-	unsigned long addr, unsigned long len,
-	unsigned long prot, unsigned long flags,
-	unsigned long fd, unsigned long pgoff)
-{
-	struct file * file = NULL;
-	unsigned long error = -EBADF;
-
-	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-	if (!(flags & MAP_ANONYMOUS)) {
-		file = fget(fd);
-		if (!file)
-			goto out;
-	}
-
-	down_write(&current->mm->mmap_sem);
-	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
-	if (!IS_ERR((void *) error) && error + len >= 0x80000000ULL) {
-		/* Result is out of bounds.  */
-		do_munmap(current->mm, addr, len);
-		error = -ENOMEM;
-	}
-	up_write(&current->mm->mmap_sem);
-
-	if (file)
-		fput(file);
-out:    
-	return error;
-}
-
-
-asmlinkage unsigned long
-old32_mmap(struct mmap_arg_struct_emu31 *arg)
-{
-	struct mmap_arg_struct_emu31 a;
-	int error = -EFAULT;
-
-	if (copy_from_user(&a, arg, sizeof(a)))
-		goto out;
-
-	error = -EINVAL;
-	if (a.offset & ~PAGE_MASK)
-		goto out;
-
-	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT); 
-out:
-	return error;
-}
-
-asmlinkage long 
-sys32_mmap2(struct mmap_arg_struct_emu31 *arg)
-{
-	struct mmap_arg_struct_emu31 a;
-	int error = -EFAULT;
-
-	if (copy_from_user(&a, arg, sizeof(a)))
-		goto out;
-	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
-out:
-	return error;
-}
-
-extern asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len,
-					    unsigned long *user_mask_ptr);
-
-asmlinkage int sys32_sched_setaffinity(compat_pid_t pid, unsigned int len,
-				       u32 *user_mask_ptr)
-{
-	unsigned long kernel_mask;
-	mm_segment_t old_fs;
-	int ret;
-
-	if (get_user(kernel_mask, user_mask_ptr))
-		return -EFAULT;
-
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_sched_setaffinity(pid,
-				    /* XXX Nice api... */
-				    sizeof(kernel_mask),
-				    &kernel_mask);
-	set_fs(old_fs);
-
-	return ret;
-}
-
-extern asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len,
-					    unsigned long *user_mask_ptr);
-
-asmlinkage int sys32_sched_getaffinity(compat_pid_t pid, unsigned int len,
-				       u32 *user_mask_ptr)
-{
-	unsigned long kernel_mask;
-	mm_segment_t old_fs;
-	int ret;
-
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_sched_getaffinity(pid,
-				    /* XXX Nice api... */
-				    sizeof(kernel_mask),
-				    &kernel_mask);
-	set_fs(old_fs);
-
-	if (ret == 0) {
-		if (put_user(kernel_mask, user_mask_ptr))
-			ret = -EFAULT;
-	}
-
-	return ret;
-}
-
-asmlinkage ssize_t sys_read(unsigned int fd, char * buf, size_t count);
-
-asmlinkage compat_ssize_t sys32_read(unsigned int fd, char * buf, size_t count)
-{
-	if ((compat_ssize_t) count < 0)
-		return -EINVAL; 
-
-	return sys_read(fd, buf, count);
-}
-
-asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count);
-
-asmlinkage compat_ssize_t sys32_write(unsigned int fd, char * buf, size_t count)
-{
-	if ((compat_ssize_t) count < 0)
-		return -EINVAL; 
-
-	return sys_write(fd, buf, count);
-}
-
-asmlinkage int sys32_clone(struct pt_regs regs)
-{
-        unsigned long clone_flags;
-        unsigned long newsp;
-	struct task_struct *p;
-	int *parent_tidptr, *child_tidptr;
-
-        clone_flags = regs.gprs[3] & 0xffffffffUL;
-        newsp = regs.orig_gpr2 & 0x7fffffffUL;
-	parent_tidptr = (int *) (regs.gprs[4] & 0x7fffffffUL);
-	child_tidptr = (int *) (regs.gprs[5] & 0x7fffffffUL);
-        if (!newsp)
-                newsp = regs.gprs[15];
-        p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, &regs, 0,
-		    parent_tidptr, child_tidptr);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
-}
diff -Nru a/arch/s390x/kernel/linux32.h b/arch/s390x/kernel/linux32.h
--- a/arch/s390x/kernel/linux32.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,193 +0,0 @@
-#ifndef _ASM_S390X_S390_H
-#define _ASM_S390X_S390_H
-
-#include <linux/config.h>
-#include <linux/compat.h>
-#include <linux/socket.h>
-#include <linux/nfs_fs.h>
-#include <linux/sunrpc/svc.h>
-#include <linux/nfsd/nfsd.h>
-#include <linux/nfsd/export.h>
-
-/* Macro that masks the high order bit of an 32 bit pointer and converts it*/
-/*       to a 64 bit pointer */
-#define A(__x) ((unsigned long)((__x) & 0x7FFFFFFFUL))
-#define AA(__x)				\
-	((unsigned long)(__x))
-
-/* Now 32bit compatibility types */
-struct ipc_kludge_32 {
-        __u32   msgp;                           /* pointer              */
-        __s32   msgtyp;
-};
-
-struct old_sigaction32 {
-       __u32			sa_handler;	/* Really a pointer, but need to deal with 32 bits */
-       compat_old_sigset_t	sa_mask;	/* A 32 bit mask */
-       __u32			sa_flags;
-       __u32			sa_restorer;	/* Another 32 bit pointer */
-};
- 
-typedef union sigval32 {
-        int     sival_int;
-        __u32   sival_ptr;
-} sigval_t32;
-                 
-typedef struct siginfo32 {
-	int	si_signo;
-	int	si_errno;
-	int	si_code;
-
-	union {
-		int _pad[((128/sizeof(int)) - 3)];
-
-		/* kill() */
-		struct {
-			pid_t	_pid;	/* sender's pid */
-			uid_t	_uid;	/* sender's uid */
-		} _kill;
-
-		/* POSIX.1b timers */
-		struct {
-			unsigned int	_timer1;
-			unsigned int	_timer2;
-                
-		} _timer;
-
-		/* POSIX.1b signals */
-		struct {
-			pid_t			_pid;	/* sender's pid */
-			uid_t			_uid;	/* sender's uid */
-			sigval_t32		_sigval;
-		} _rt;
-
-		/* SIGCHLD */
-		struct {
-			pid_t			_pid;	/* which child */
-			uid_t			_uid;	/* sender's uid */
-			int			_status;/* exit code */
-			compat_clock_t		_utime;
-			compat_clock_t		_stime;
-		} _sigchld;
-
-		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
-		struct {
-			__u32	_addr;	/* faulting insn/memory ref. - pointer */
-		} _sigfault;
-                          
-		/* SIGPOLL */
-		struct {
-			int	_band;	/* POLL_IN, POLL_OUT, POLL_MSG */
-			int	_fd;
-		} _sigpoll;
-	} _sifields;
-} siginfo_t32;  
-
-/*
- * How these fields are to be accessed.
- */
-#define si_pid		_sifields._kill._pid
-#define si_uid		_sifields._kill._uid
-#define si_status	_sifields._sigchld._status
-#define si_utime	_sifields._sigchld._utime
-#define si_stime	_sifields._sigchld._stime
-#define si_value	_sifields._rt._sigval
-#define si_int		_sifields._rt._sigval.sival_int
-#define si_ptr		_sifields._rt._sigval.sival_ptr
-#define si_addr		_sifields._sigfault._addr
-#define si_band		_sifields._sigpoll._band
-#define si_fd		_sifields._sigpoll._fd    
-
-/* asm/sigcontext.h */
-typedef union
-{
-	__u64   d;
-	__u32   f; 
-} freg_t32;
-
-typedef struct
-{
-	unsigned int	fpc;
-	freg_t32	fprs[__NUM_FPRS];              
-} _s390_fp_regs32;
-
-typedef struct 
-{
-        __u32   mask;
-        __u32	addr;
-} _psw_t32 __attribute__ ((aligned(8)));
-
-#define PSW32_MASK_PER		0x40000000UL
-#define PSW32_MASK_DAT		0x04000000UL
-#define PSW32_MASK_IO		0x02000000UL
-#define PSW32_MASK_EXT		0x01000000UL
-#define PSW32_MASK_KEY		0x00F00000UL
-#define PSW32_MASK_MCHECK	0x00040000UL
-#define PSW32_MASK_WAIT		0x00020000UL
-#define PSW32_MASK_PSTATE	0x00010000UL
-#define PSW32_MASK_ASC		0x0000C000UL
-#define PSW32_MASK_CC		0x00003000UL
-#define PSW32_MASK_PM		0x00000f00UL
-
-#define PSW32_ADDR_AMODE31	0x80000000UL
-#define PSW32_ADDR_INSN		0x7FFFFFFFUL
-
-#define PSW32_BASE_BITS		0x00080000UL
-
-#define PSW32_ASC_PRIMARY	0x00000000UL
-#define PSW32_ASC_ACCREG	0x00004000UL
-#define PSW32_ASC_SECONDARY	0x00008000UL
-#define PSW32_ASC_HOME		0x0000C000UL
-
-#define PSW32_USER_BITS	(PSW32_BASE_BITS | PSW32_MASK_DAT | PSW32_ASC_HOME | \
-			 PSW32_MASK_IO | PSW32_MASK_EXT | PSW32_MASK_MCHECK | \
-			 PSW32_MASK_PSTATE)
-
-typedef struct
-{
-	_psw_t32	psw;
-	__u32		gprs[__NUM_GPRS];
-	__u32		acrs[__NUM_ACRS];
-} _s390_regs_common32;
-
-typedef struct
-{
-	_s390_regs_common32 regs;
-	_s390_fp_regs32     fpregs;
-} _sigregs32;
-
-#define _SIGCONTEXT_NSIG32	64
-#define _SIGCONTEXT_NSIG_BPW32	32
-#define __SIGNAL_FRAMESIZE32	96
-#define _SIGMASK_COPY_SIZE32	(sizeof(u32)*2)
-
-struct sigcontext32
-{
-	__u32	oldmask[_COMPAT_NSIG_WORDS];
-	__u32	sregs;				/* pointer */
-};
-
-/* asm/signal.h */
-struct sigaction32 {
-	__u32		sa_handler;		/* pointer */
-	__u32		sa_flags;
-        __u32		sa_restorer;		/* pointer */
-	compat_sigset_t	sa_mask;        /* mask last for extensibility */
-};
-
-typedef struct {
-	__u32			ss_sp;		/* pointer */
-	int			ss_flags;
-	compat_size_t		ss_size;
-} stack_t32;
-
-/* asm/ucontext.h */
-struct ucontext32 {
-	__u32			uc_flags;
-	__u32			uc_link;	/* pointer */	
-	stack_t32		uc_stack;
-	_sigregs32		uc_mcontext;
-	compat_sigset_t		uc_sigmask;	/* mask last for extensibility */
-};
-
-#endif /* _ASM_S390X_S390_H */
diff -Nru a/arch/s390x/kernel/module.c b/arch/s390x/kernel/module.c
--- a/arch/s390x/kernel/module.c	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,376 +0,0 @@
-/*
- *  arch/s390x/kernel/module.c - Kernel module help for s390x.
- *
- *  S390 version
- *    Copyright (C) 2002, 2003 IBM Deutschland Entwicklung GmbH,
- *			       IBM Corporation
- *    Author(s): Arnd Bergmann (arndb@de.ibm.com)
- *		 Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  based on i386 version
- *    Copyright (C) 2001 Rusty Russell.
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#include <linux/module.h>
-#include <linux/elf.h>
-#include <linux/vmalloc.h>
-#include <linux/fs.h>
-#include <linux/string.h>
-#include <linux/kernel.h>
-
-#if 0
-#define DEBUGP printk
-#else
-#define DEBUGP(fmt , ...)
-#endif
-
-#define GOT_ENTRY_SIZE 8
-#define PLT_ENTRY_SIZE 20
-
-void *module_alloc(unsigned long size)
-{
-	if (size == 0)
-		return NULL;
-	return vmalloc(size);
-}
-
-/* Free memory returned from module_alloc */
-void module_free(struct module *mod, void *module_region)
-{
-	vfree(module_region);
-	/* FIXME: If module_region == mod->init_region, trim exception
-           table entries. */
-}
-
-static inline void
-check_rela(Elf64_Rela *rela, struct module *me)
-{
-	struct mod_arch_syminfo *info;
-
-	info = me->arch.syminfo + ELF64_R_SYM (rela->r_info);
-	switch (ELF64_R_TYPE (rela->r_info)) {
-	case R_390_GOT12:	/* 12 bit GOT offset.  */
-	case R_390_GOT16:	/* 16 bit GOT offset.  */
-	case R_390_GOT32:	/* 32 bit GOT offset.  */
-	case R_390_GOT64:	/* 64 bit GOT offset.  */
-	case R_390_GOTENT:	/* 32 bit PC rel. to GOT entry shifted by 1. */
-	case R_390_GOTPLT12:	/* 12 bit offset to jump slot.	*/
-	case R_390_GOTPLT16:	/* 16 bit offset to jump slot. */
-	case R_390_GOTPLT32:	/* 32 bit offset to jump slot. */
-	case R_390_GOTPLT64:	/* 64 bit offset to jump slot.	*/
-	case R_390_GOTPLTENT:	/* 32 bit rel. offset to jump slot >> 1. */
-		if (info->got_offset == -1UL) {
-			info->got_offset = me->arch.got_size;
-			me->arch.got_size += GOT_ENTRY_SIZE;
-		}
-		break;
-	case R_390_PLT16DBL:	/* 16 bit PC rel. PLT shifted by 1.  */
-	case R_390_PLT32DBL:	/* 32 bit PC rel. PLT shifted by 1.  */
-	case R_390_PLT32:	/* 32 bit PC relative PLT address.  */
-	case R_390_PLT64:	/* 64 bit PC relative PLT address.  */
-	case R_390_PLTOFF16:	/* 16 bit offset from GOT to PLT. */
-	case R_390_PLTOFF32:	/* 32 bit offset from GOT to PLT. */
-	case R_390_PLTOFF64:	/* 16 bit offset from GOT to PLT. */
-		if (info->plt_offset == -1UL) {
-			info->plt_offset = me->arch.plt_size;
-			me->arch.plt_size += PLT_ENTRY_SIZE;
-		}
-		break;
-	case R_390_COPY:
-	case R_390_GLOB_DAT:
-	case R_390_JMP_SLOT:
-	case R_390_RELATIVE:
-		/* Only needed if we want to support loading of 
-		   modules linked with -shared. */
-		break;
-	}
-}
-
-/*
- * Account for GOT and PLT relocations. We can't add sections for
- * got and plt but we can increase the core module size.
- */
-int
-module_frob_arch_sections(Elf64_Ehdr *hdr, Elf64_Shdr *sechdrs,
-			  char *secstrings, struct module *me)
-{
-	Elf64_Shdr *symtab;
-	Elf64_Sym *symbols;
-	Elf64_Rela *rela;
-	char *strings;
-	int nrela, i, j;
-
-	/* Find symbol table and string table. */
-	symtab = 0;
-	for (i = 0; i < hdr->e_shnum; i++)
-		switch (sechdrs[i].sh_type) {
-		case SHT_SYMTAB:
-			symtab = sechdrs + i;
-			break;
-		}
-	if (!symtab) {
-		printk(KERN_ERR "module %s: no symbol table\n", me->name);
-		return -ENOEXEC;
-	}
-
-	/* Allocate one syminfo structure per symbol. */
-	me->arch.nsyms = symtab->sh_size / sizeof(Elf64_Sym);
-	me->arch.syminfo = kmalloc(me->arch.nsyms *
-				   sizeof(struct mod_arch_syminfo),
-				   GFP_KERNEL);
-	if (!me->arch.syminfo)
-		return -ENOMEM;
-	symbols = (void *) hdr + symtab->sh_offset;
-	strings = (void *) hdr + sechdrs[symtab->sh_link].sh_offset;
-	for (i = 0; i < me->arch.nsyms; i++) {
-		if (symbols[i].st_shndx == SHN_UNDEF &&
-		    strcmp(strings + symbols[i].st_name,
-			   "_GLOBAL_OFFSET_TABLE_") == 0)
-			/* "Define" it as absolute. */
-			symbols[i].st_shndx = SHN_ABS;
-		me->arch.syminfo[i].got_offset = -1UL;
-		me->arch.syminfo[i].plt_offset = -1UL;
-		me->arch.syminfo[i].got_initialized = 0;
-		me->arch.syminfo[i].plt_initialized = 0;
-	}
-
-	/* Search for got/plt relocations. */
-	me->arch.got_size = me->arch.plt_size = 0;
-	for (i = 0; i < hdr->e_shnum; i++) {
-		if (sechdrs[i].sh_type != SHT_RELA)
-			continue;
-		nrela = sechdrs[i].sh_size / sizeof(Elf64_Rela);
-		rela = (void *) hdr + sechdrs[i].sh_offset;
-		for (j = 0; j < nrela; j++)
-			check_rela(rela + j, me);
-	}
-
-	/* Increase core size by size of got & plt and set start
-	   offsets for got and plt. */
-	me->core_size = ALIGN(me->core_size, 4);
-	me->arch.got_offset = me->core_size;
-	me->core_size += me->arch.got_size;
-	me->arch.plt_offset = me->core_size;
-	me->core_size += me->arch.plt_size;
-	return 0;
-}
-
-int
-apply_relocate(Elf_Shdr *sechdrs, const char *strtab, unsigned int symindex,
-	       unsigned int relsec, struct module *me)
-{
-	printk(KERN_ERR "module %s: RELOCATION unsupported\n",
-	       me->name);
-	return -ENOEXEC;
-}
-
-static inline int
-apply_rela(Elf64_Rela *rela, Elf64_Addr base, Elf64_Sym *symtab, 
-	   struct module *me)
-{
-	struct mod_arch_syminfo *info;
-	Elf64_Addr loc, val;
-	int r_type, r_sym;
-
-	/* This is where to make the change */
-	loc = base + rela->r_offset;
-	/* This is the symbol it is referring to.  Note that all
-	   undefined symbols have been resolved.  */
-	r_sym = ELF64_R_SYM(rela->r_info);
-	r_type = ELF64_R_TYPE(rela->r_info);
-	info = me->arch.syminfo + r_sym;
-	val = symtab[r_sym].st_value;
-
-	switch (r_type) {
-	case R_390_8:		/* Direct 8 bit.   */
-	case R_390_12:		/* Direct 12 bit.  */
-	case R_390_16:		/* Direct 16 bit.  */
-	case R_390_32:		/* Direct 32 bit.  */
-	case R_390_64:		/* Direct 64 bit.  */
-		val += rela->r_addend;
-		if (r_type == R_390_8)
-			*(unsigned char *) loc = val;
-		else if (r_type == R_390_12)
-			*(unsigned short *) loc = (val & 0xfff) |
-				(*(unsigned short *) loc & 0xf000);
-		else if (r_type == R_390_16)
-			*(unsigned short *) loc = val;
-		else if (r_type == R_390_32)
-			*(unsigned int *) loc = val;
-		else if (r_type == R_390_64)
-			*(unsigned long *) loc = val;
-		break;
-	case R_390_PC16:	/* PC relative 16 bit.  */
-	case R_390_PC16DBL:	/* PC relative 16 bit shifted by 1.  */
-	case R_390_PC32DBL:	/* PC relative 32 bit shifted by 1.  */
-	case R_390_PC32:	/* PC relative 32 bit.  */
-	case R_390_PC64:	/* PC relative 64 bit.	*/
-		val += rela->r_addend - loc;
-		if (r_type == R_390_PC16)
-			*(unsigned short *) loc = val;
-		else if (r_type == R_390_PC16DBL)
-			*(unsigned short *) loc = val >> 1;
-		else if (r_type == R_390_PC32DBL)
-			*(unsigned int *) loc = val >> 1;
-		else if (r_type == R_390_PC32)
-			*(unsigned int *) loc = val;
-		else if (r_type == R_390_PC64)
-			*(unsigned long *) loc = val;
-		break;
-	case R_390_GOT12:	/* 12 bit GOT offset.  */
-	case R_390_GOT16:	/* 16 bit GOT offset.  */
-	case R_390_GOT32:	/* 32 bit GOT offset.  */
-	case R_390_GOT64:	/* 64 bit GOT offset.  */
-	case R_390_GOTENT:	/* 32 bit PC rel. to GOT entry shifted by 1. */
-	case R_390_GOTPLT12:	/* 12 bit offset to jump slot.	*/
-	case R_390_GOTPLT16:	/* 16 bit offset to jump slot. */
-	case R_390_GOTPLT32:	/* 32 bit offset to jump slot. */
-	case R_390_GOTPLT64:	/* 64 bit offset to jump slot.	*/
-	case R_390_GOTPLTENT:	/* 32 bit rel. offset to jump slot >> 1. */
-		if (info->got_initialized == 0) {
-			Elf64_Addr *gotent;
-			gotent = me->module_core + me->arch.got_offset +
-				info->got_offset;
-			*gotent = val;
-			info->got_initialized = 1;
-		}
-		val = info->got_offset + rela->r_addend;
-		if (r_type == R_390_GOT12 ||
-		    r_type == R_390_GOTPLT12)
-			*(unsigned short *) loc = (val & 0xfff) |
-				(*(unsigned short *) loc & 0xf000);
-		else if (r_type == R_390_GOT16 ||
-			 r_type == R_390_GOTPLT16)
-			*(unsigned short *) loc = val;
-		else if (r_type == R_390_GOT32 ||
-			 r_type == R_390_GOTPLT32)
-			*(unsigned int *) loc = val;
-		else if (r_type == R_390_GOTENT ||
-			 r_type == R_390_GOTPLTENT)
-			*(unsigned int *) loc = val >> 1;
-		else if (r_type == R_390_GOT64 ||
-			 r_type == R_390_GOTPLT64)
-			*(unsigned long *) loc = val;
-		break;
-	case R_390_PLT16DBL:	/* 16 bit PC rel. PLT shifted by 1.  */
-	case R_390_PLT32DBL:	/* 32 bit PC rel. PLT shifted by 1.  */
-	case R_390_PLT32:	/* 32 bit PC relative PLT address.  */
-	case R_390_PLT64:	/* 64 bit PC relative PLT address.  */
-	case R_390_PLTOFF16:	/* 16 bit offset from GOT to PLT. */
-	case R_390_PLTOFF32:	/* 32 bit offset from GOT to PLT. */
-	case R_390_PLTOFF64:	/* 16 bit offset from GOT to PLT. */
-		if (info->plt_initialized == 0) {
-			unsigned int *ip;
-			ip = me->module_core + me->arch.plt_offset +
-				info->plt_offset;
-			ip[0] = 0x0d10e310; /* basr 1,0; lg 1,10(1); br 1 */
-			ip[1] = 0x100a0004;
-			ip[2] = 0x07f10000;
-			ip[3] = (unsigned int) (val >> 32);
-			ip[4] = (unsigned int) val;
-			info->plt_initialized = 1;
-		}
-		if (r_type == R_390_PLTOFF16 ||
-		    r_type == R_390_PLTOFF32 ||
-		    r_type == R_390_PLTOFF64)
-			val = me->arch.plt_offset - me->arch.got_offset +
-				info->plt_offset + rela->r_addend;
-		else
-			val =  (Elf64_Addr) me->module_core +
-				me->arch.plt_offset + info->plt_offset + 
-				rela->r_addend - loc;
-		if (r_type == R_390_PLT16DBL)
-			*(unsigned short *) loc = val >> 1;
-		else if (r_type == R_390_PLTOFF16)
-			*(unsigned short *) loc = val;
-		else if (r_type == R_390_PLT32DBL)
-			*(unsigned int *) loc = val >> 1;
-		else if (r_type == R_390_PLT32 ||
-			 r_type == R_390_PLTOFF32)
-			*(unsigned int *) loc = val;
-		else if (r_type == R_390_PLT64 ||
-			 r_type == R_390_PLTOFF64)
-			*(unsigned long *) loc = val;
-		break;
-	case R_390_GOTOFF16:	/* 16 bit offset to GOT.  */
-	case R_390_GOTOFF32:	/* 32 bit offset to GOT.  */
-	case R_390_GOTOFF64:	/* 64 bit offset to GOT. */
-		val = val + rela->r_addend -
-			((Elf64_Addr) me->module_core + me->arch.got_offset);
-		if (r_type == R_390_GOTOFF16)
-			*(unsigned short *) loc = val;
-		else if (r_type == R_390_GOTOFF32)
-			*(unsigned int *) loc = val;
-		else if (r_type == R_390_GOTOFF64)
-			*(unsigned long *) loc = val;
-		break;
-	case R_390_GOTPC:	/* 32 bit PC relative offset to GOT. */
-	case R_390_GOTPCDBL:	/* 32 bit PC rel. off. to GOT shifted by 1. */
-		val = (Elf64_Addr) me->module_core + me->arch.got_offset +
-			rela->r_addend - loc;
-		if (r_type == R_390_GOTPC)
-			*(unsigned int *) loc = val;
-		else if (r_type == R_390_GOTPCDBL)
-			*(unsigned int *) loc = val >> 1;
-		break;
-	case R_390_COPY:
-	case R_390_GLOB_DAT:	/* Create GOT entry.  */
-	case R_390_JMP_SLOT:	/* Create PLT entry.  */
-	case R_390_RELATIVE:	/* Adjust by program base.  */
-		/* Only needed if we want to support loading of 
-		   modules linked with -shared. */
-		break;
-	default:
-		printk(KERN_ERR "module %s: Unknown relocation: %u\n",
-		       me->name, r_type);
-		return -ENOEXEC;
-	}
-	return 0;
-}
-
-int
-apply_relocate_add(Elf64_Shdr *sechdrs, const char *strtab,
-		   unsigned int symindex, unsigned int relsec,
-		   struct module *me)
-{
-	Elf64_Addr base;
-	Elf64_Sym *symtab;
-	Elf64_Rela *rela;
-	unsigned long i, n;
-	int rc;
-
-	DEBUGP("Applying relocate section %u to %u\n",
-	       relsec, sechdrs[relsec].sh_info);
-	base = sechdrs[sechdrs[relsec].sh_info].sh_addr;
-	symtab = (Elf64_Sym *) sechdrs[symindex].sh_addr;
-	rela = (Elf64_Rela *) sechdrs[relsec].sh_addr;
-	n = sechdrs[relsec].sh_size / sizeof(Elf64_Rela);
-	for (i = 0; i < n; i++, rela++) {
-		rc = apply_rela(rela, base, symtab, me);
-		if (rc)
-			return rc;
-	}
-	return 0;
-}
-
-int module_finalize(const Elf_Ehdr *hdr,
-		    const Elf_Shdr *sechdrs,
-		    struct module *me)
-{
-	if (me->arch.syminfo)
-		kfree(me->arch.syminfo);
-	return 0;
-}
diff -Nru a/arch/s390x/kernel/process.c b/arch/s390x/kernel/process.c
--- a/arch/s390x/kernel/process.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,352 +0,0 @@
-/*
- *  arch/s390/kernel/process.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Hartmut Penner (hp@de.ibm.com),
- *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *
- *  Derived from "arch/i386/kernel/process.c"
- *    Copyright (C) 1995, Linus Torvalds
- */
-
-/*
- * This file handles the architecture-dependent parts of process handling..
- */
-
-#include <linux/config.h>
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-#include <linux/reboot.h>
-#include <linux/init.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/system.h>
-#include <asm/io.h>
-#include <asm/processor.h>
-#include <asm/irq.h>
-
-asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
-
-/*
- * Return saved PC of a blocked thread. used in kernel/sched
- * resume in entry.S does not create a new stack frame, it
- * just stores the registers %r6-%r15 to the frame given by
- * schedule. We want to return the address of the caller of
- * schedule, so we have to walk the backchain one time to
- * find the frame schedule() store its return address.
- */
-unsigned long thread_saved_pc(struct task_struct *tsk)
-{
-	unsigned long bc;
-
-	bc = *((unsigned long *) tsk->thread.ksp);
-	return *((unsigned long *) (bc+112));
-}
-
-/*
- * The idle loop on a S390...
- */
-
-void default_idle(void)
-{
-	psw_t wait_psw;
-	unsigned long reg;
-
-        if (need_resched()) {
-                schedule();
-                return;
-        }
-
-	/* 
-	 * Wait for external, I/O or machine check interrupt and
-	 * switch off machine check bit after the wait has ended.
-	 */
-	wait_psw.mask = PSW_KERNEL_BITS | PSW_MASK_MCHECK | PSW_MASK_WAIT |
-		PSW_MASK_IO | PSW_MASK_EXT;
-	asm volatile (
-		"    larl  %0,0f\n"
-		"    stg   %0,8(%1)\n"
-		"    lpswe 0(%1)\n"
-		"0:  larl  %0,1f\n"
-		"    stg   %0,8(%1)\n"
-		"    ni    1(%1),0xf9\n"
-		"    lpswe 0(%1)\n"
-		"1:"
-		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
-}
-
-int cpu_idle(void)
-{
-	for (;;)
-		default_idle();
-	return 0;
-}
-
-extern void show_registers(struct pt_regs *regs);
-extern void show_trace(unsigned long *sp);
-
-void show_regs(struct pt_regs *regs)
-{
-	struct task_struct *tsk = current;
-
-        printk("CPU:    %d    %s\n", tsk->thread_info->cpu, print_tainted());
-        printk("Process %s (pid: %d, task: %016lx, ksp: %016lx)\n",
-	       current->comm, current->pid, (unsigned long) tsk,
-	       tsk->thread.ksp);
-
-	show_registers(regs);
-	/* Show stack backtrace if pt_regs is from kernel mode */
-	if (!(regs->psw.mask & PSW_MASK_PSTATE))
-		show_trace((unsigned long *) regs->gprs[15]);
-}
-
-extern void kernel_thread_starter(void);
-__asm__(".align 4\n"
-	"kernel_thread_starter:\n"
-	"    lg    15,0(8)\n"
-	"    sgr   15,7\n"
-	"    stosm 48(15),3\n"
-	"    lgr   2,10\n"
-	"    basr  14,9\n"
-	"    sgr   2,2\n"
-	"    br    11\n");
-
-int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-{
-	struct task_struct *p;
-	struct pt_regs regs;
-
-	memset(&regs, 0, sizeof(regs));
-	regs.psw.mask = PSW_KERNEL_BITS;
-	regs.psw.addr = (__u64) kernel_thread_starter;
-	regs.gprs[7] = STACK_FRAME_OVERHEAD;
-	regs.gprs[8] = __LC_KERNEL_STACK;
-	regs.gprs[9] = (unsigned long) fn;
-	regs.gprs[10] = (unsigned long) arg;
-	regs.gprs[11] = (unsigned long) do_exit;
-	regs.orig_gpr2 = -1;
-
-	/* Ok, create the new process.. */
-	p = do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
-}
-
-/*
- * Free current thread data structures etc..
- */
-void exit_thread(void)
-{
-}
-
-void flush_thread(void)
-{
-
-        current->used_math = 0;
-	clear_tsk_thread_flag(current, TIF_USEDFPU);
-}
-
-void release_thread(struct task_struct *dead_task)
-{
-}
-
-int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
-	unsigned long unused,
-        struct task_struct * p, struct pt_regs * regs)
-{
-        struct stack_frame
-          {
-            unsigned long back_chain;
-            unsigned long eos;
-            unsigned long glue1;
-            unsigned long glue2;
-            unsigned long scratch[2];
-            unsigned long gprs[10];    /* gprs 6 -15                       */
-            unsigned long fprs[2];     /* fpr 4 and 6                      */
-            unsigned long empty[2];
-            struct pt_regs childregs;
-          } *frame;
-
-        frame = ((struct stack_frame *)
-		 (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
-        p->thread.ksp = (unsigned long) frame;
-	p->set_child_tid = p->clear_child_tid = NULL;
-        frame->childregs = *regs;
-	frame->childregs.gprs[2] = 0;	/* child returns 0 on fork. */
-        frame->childregs.gprs[15] = new_stackp;
-        frame->back_chain = frame->eos = 0;
-
-        /* new return point is ret_from_fork */
-        frame->gprs[8] = (unsigned long) ret_from_fork;
-
-        /* fake return stack for resume(), don't go back to schedule */
-        frame->gprs[9] = (unsigned long) frame;
-        /* save fprs */
-	save_fp_regs(&p->thread.fp_regs);
-        p->thread.user_seg = __pa((unsigned long) p->mm->pgd) | _REGION_TABLE;
-	/* start new process with ar4 pointing to the correct address space */
-	p->thread.ar4 = get_fs().ar4;
-        /* Don't copy debug registers */
-        memset(&p->thread.per_info,0,sizeof(p->thread.per_info));
-
-	/* Set a new TLS ?  */
-	if (clone_flags & CLONE_SETTLS) {
-		if (test_thread_flag(TIF_31BIT)) {
-			frame->childregs.acrs[0] =
-				(unsigned int) regs->gprs[6];
-		} else {
-			frame->childregs.acrs[0] =
-				(unsigned int)(regs->gprs[6] >> 32);
-			frame->childregs.acrs[1] =
-				(unsigned int) regs->gprs[6];
-		}
-	}
-        return 0;
-}
-
-asmlinkage int sys_fork(struct pt_regs regs)
-{
-	struct task_struct *p;
-        p = do_fork(SIGCHLD, regs.gprs[15], &regs, 0, NULL, NULL);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
-}
-
-asmlinkage int sys_clone(struct pt_regs regs)
-{
-        unsigned long clone_flags;
-        unsigned long newsp;
-	struct task_struct *p;
-	int *parent_tidptr, *child_tidptr;
-
-        clone_flags = regs.gprs[3];
-        newsp = regs.orig_gpr2;
-	parent_tidptr = (int *) regs.gprs[4];
-	child_tidptr = (int *) regs.gprs[5];
-        if (!newsp)
-                newsp = regs.gprs[15];
-        p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, &regs, 0,
-		    parent_tidptr, child_tidptr);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
-}
-
-/*
- * This is trivial, and on the face of it looks like it
- * could equally well be done in user mode.
- *
- * Not so, for quite unobvious reasons - register pressure.
- * In user mode vfork() cannot have a stack frame, and if
- * done by calling the "clone()" system call directly, you
- * do not have enough call-clobbered registers to hold all
- * the information you need.
- */
-asmlinkage int sys_vfork(struct pt_regs regs)
-{
-	struct task_struct *p;
-	p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
-		    regs.gprs[15], &regs, 0, NULL, NULL);
-	return IS_ERR(p) ? PTR_ERR(p) : p->pid;
-}
-
-/*
- * sys_execve() executes a new program.
- */
-asmlinkage int sys_execve(struct pt_regs regs)
-{
-        int error;
-        char * filename;
-
-        filename = getname((char *) regs.orig_gpr2);
-        error = PTR_ERR(filename);
-        if (IS_ERR(filename))
-                goto out;
-        error = do_execve(filename, (char **) regs.gprs[3],
-			  (char **) regs.gprs[4], &regs);
-	if (error == 0) {
-		current->ptrace &= ~PT_DTRACE;
-		current->thread.fp_regs.fpc = 0;
-		asm volatile("sfpc %0,%0" : : "d" (0));
-	}
-        putname(filename);
-out:
-        return error;
-}
-
-
-/*
- * fill in the FPU structure for a core dump.
- */
-int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs)
-{
-	save_fp_regs(fpregs);
-	return 1;
-}
-
-/*
- * fill in the user structure for a core dump..
- */
-void dump_thread(struct pt_regs * regs, struct user * dump)
-{
-
-/* changed the size calculations - should hopefully work better. lbt */
-	dump->magic = CMAGIC;
-	dump->start_code = 0;
-	dump->start_stack = regs->gprs[15] & ~(PAGE_SIZE - 1);
-	dump->u_tsize = current->mm->end_code >> PAGE_SHIFT;
-	dump->u_dsize = (current->mm->brk + PAGE_SIZE - 1) >> PAGE_SHIFT;
-	dump->u_dsize -= dump->u_tsize;
-	dump->u_ssize = 0;
-	if (dump->start_stack < TASK_SIZE)
-		dump->u_ssize = (TASK_SIZE - dump->start_stack) >> PAGE_SHIFT;
-	memcpy(&dump->regs, regs, sizeof(s390_regs));
-	dump_fpu (regs, &dump->regs.fp_regs);
-	dump->regs.per_info = current->thread.per_info;
-}
-
-/*
- * These bracket the sleeping functions..
- */
-extern void scheduling_functions_start_here(void);
-extern void scheduling_functions_end_here(void);
-#define first_sched	((unsigned long) scheduling_functions_start_here)
-#define last_sched	((unsigned long) scheduling_functions_end_here)
-
-unsigned long get_wchan(struct task_struct *p)
-{
-        unsigned long r14, r15, bc;
-        unsigned long stack_page;
-        int count = 0;
-        if (!p || p == current || p->state == TASK_RUNNING)
-                return 0;
-	stack_page = (unsigned long) p->thread_info;
-        r15 = p->thread.ksp;
-        if (!stack_page || r15 < stack_page || r15 >= 16380+stack_page)
-                return 0;
-        bc = *(unsigned long *) r15;
-        do {
-                if (bc < stack_page || bc >= 16380+stack_page)
-                        return 0;
-                r14 = *(unsigned long *) (bc+112);
-                if (r14 < first_sched || r14 >= last_sched)
-                        return r14;
-                bc = *(unsigned long *) bc;
-        } while (count++ < 16);
-        return 0;
-}
-#undef last_sched
-#undef first_sched
-
diff -Nru a/arch/s390x/kernel/ptrace.c b/arch/s390x/kernel/ptrace.c
--- a/arch/s390x/kernel/ptrace.c	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,612 +0,0 @@
-/*
- *  arch/s390/kernel/ptrace.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Based on PowerPC version 
- *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
- *
- *  Derived from "arch/m68k/kernel/ptrace.c"
- *  Copyright (C) 1994 by Hamish Macdonald
- *  Taken from linux/kernel/ptrace.c and modified for M680x0.
- *  linux/kernel/ptrace.c is by Ross Biro 1/23/92, edited by Linus Torvalds
- *
- * Modified by Cort Dougan (cort@cs.nmt.edu) 
- *
- *
- * This file is subject to the terms and conditions of the GNU General
- * Public License.  See the file README.legal in the main directory of
- * this archive for more details.
- */
-
-#include <stddef.h>
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/errno.h>
-#include <linux/ptrace.h>
-#include <linux/user.h>
-#include <linux/security.h>
-
-#include <asm/segment.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-
-#ifdef CONFIG_S390_SUPPORT
-#include "ptrace32.h"
-#endif
-
-static void FixPerRegisters(struct task_struct *task)
-{
-	struct pt_regs *regs;
-	per_struct *per_info;
-
-	regs = __KSTK_PTREGS(task);
-	per_info = (per_struct *) &task->thread.per_info;
-	per_info->control_regs.bits.em_instruction_fetch =
-		per_info->single_step | per_info->instruction_fetch;
-	
-	if (per_info->single_step) {
-		per_info->control_regs.bits.starting_addr = 0;
-#ifdef CONFIG_S390_SUPPORT
-		if (test_thread_flag(TIF_31BIT))
-			per_info->control_regs.bits.ending_addr = 0x7fffffffUL;
-		else
-#endif
-			per_info->control_regs.bits.ending_addr = -1;
-	} else {
-		per_info->control_regs.bits.starting_addr =
-			per_info->starting_addr;
-		per_info->control_regs.bits.ending_addr =
-			per_info->ending_addr;
-	}
-	/*
-	 * if any of the control reg tracing bits are on 
-	 * we switch on per in the psw
-	 */
-	if (per_info->control_regs.words.cr[0] & PER_EM_MASK)
-		regs->psw.mask |= PSW_MASK_PER;
-	else
-		regs->psw.mask &= ~PSW_MASK_PER;
-
-	if (per_info->control_regs.bits.em_storage_alteration)
-		per_info->control_regs.bits.storage_alt_space_ctl = 1;
-	else
-		per_info->control_regs.bits.storage_alt_space_ctl = 0;
-}
-
-void set_single_step(struct task_struct *task)
-{
-	per_struct *per_info= (per_struct *) &task->thread.per_info;	
-	
-	per_info->single_step = 1;  /* Single step */
-	FixPerRegisters (task);
-}
-
-void clear_single_step(struct task_struct *task)
-{
-	per_struct *per_info= (per_struct *) &task->thread.per_info;
-
-	per_info->single_step = 0;
-	FixPerRegisters (task);
-}
-
-/*
- * Called by kernel/ptrace.c when detaching..
- *
- * Make sure single step bits etc are not set.
- */
-void ptrace_disable(struct task_struct *child)
-{
-	/* make sure the single step bit is not set. */
-	clear_single_step(child);
-}
-
-/*
- * Read the word at offset addr from the user area of a process. The
- * trouble here is that the information is littered over different
- * locations. The process registers are found on the kernel stack,
- * the floating point stuff and the trace settings are stored in
- * the task structure. In addition the different structures in
- * struct user contain pad bytes that should be read as zeroes.
- * Lovely...
- */
-static int peek_user(struct task_struct *child, addr_t addr, addr_t data)
-{
-	struct user *dummy = NULL;
-	addr_t offset;
-	__u64 tmp;
-
-	if ((addr & 7) || addr > sizeof(struct user) - 7)
-		return -EIO;
-
-	if (addr <= (addr_t) &dummy->regs.orig_gpr2) {
-		/*
-		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
-		 */
-		tmp = *(__u64 *)((addr_t) __KSTK_PTREGS(child) + addr);
-
-	} else if (addr >= (addr_t) &dummy->regs.fp_regs &&
-		   addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
-		/*
-		 * floating point regs. are stored in the thread structure
-		 */
-		offset = addr - (addr_t) &dummy->regs.fp_regs;
-		tmp = *(__u64 *)((addr_t) &child->thread.fp_regs + offset);
-
-	} else if (addr >= (addr_t) &dummy->regs.per_info &&
-		   addr < (addr_t) (&dummy->regs.per_info + 1)) {
-		/*
-		 * per_info is found in the thread structure
-		 */
-		offset = addr - (addr_t) &dummy->regs.per_info;
-		tmp = *(__u64 *)((addr_t) &child->thread.per_info + offset);
-
-	} else
-		tmp = 0;
-
-	return put_user(tmp, (__u64 *) data);
-}
-
-/*
- * Write a word to the user area of a process at location addr. This
- * operation does have an additional problem compared to peek_user.
- * Stores to the program status word and on the floating point
- * control register needs to get checked for validity.
- */
-static int poke_user(struct task_struct *child, addr_t addr, addr_t data)
-{
-	struct user *dummy = NULL;
-	addr_t offset;
-
-	if ((addr & 7) || addr > sizeof(struct user) - 7)
-		return -EIO;
-
-	if (addr <= (addr_t) &dummy->regs.orig_gpr2) {
-		/*
-		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
-		 */
-		if (addr == (addr_t) &dummy->regs.psw.mask &&
-#ifdef CONFIG_S390_SUPPORT
-		    (data & ~PSW_MASK_CC) != PSW_USER32_BITS &&
-#endif
-		    (data & ~PSW_MASK_CC) != PSW_USER_BITS)
-			/* Invalid psw mask. */
-			return -EINVAL;
-		*(__u64 *)((addr_t) __KSTK_PTREGS(child) + addr) = data;
-
-	} else if (addr >= (addr_t) &dummy->regs.fp_regs &&
-		   addr < (addr_t) (&dummy->regs.fp_regs + 1)) {
-		/*
-		 * floating point regs. are stored in the thread structure
-		 */
-		if (addr == (addr_t) &dummy->regs.fp_regs.fpc &&
-		    ((data >> 32) & ~FPC_VALID_MASK) != 0)
-			/* Invalid floating pointer control. */
-			return -EINVAL;
-		offset = addr - (addr_t) &dummy->regs.fp_regs;
-		*(__u64 *)((addr_t) &child->thread.fp_regs + offset) = data;
-
-	} else if (addr >= (addr_t) &dummy->regs.per_info &&
-		   addr < (addr_t) (&dummy->regs.per_info + 1)) {
-		/*
-		 * per_info is found in the thread structure
-		 */
-		offset = addr - (addr_t) &dummy->regs.per_info;
-		*(__u64 *)((addr_t) &child->thread.per_info + offset) = data;
-
-	}
-
-	FixPerRegisters(child);
-	return 0;
-}
-
-static int
-do_ptrace_normal(struct task_struct *child, long request, long addr, long data)
-{
-	unsigned long tmp;
-	ptrace_area parea; 
-	int copied, ret;
-
-	switch (request) {
-	case PTRACE_PEEKTEXT:
-	case PTRACE_PEEKDATA:
-		/* read word at location addr. */
-		copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);
-		if (copied != sizeof(tmp))
-			return -EIO;
-		return put_user(tmp, (unsigned long *) data);
-
-	case PTRACE_PEEKUSR:
-		/* read the word at location addr in the USER area. */
-		return peek_user(child, addr, data);
-
-	case PTRACE_POKETEXT:
-	case PTRACE_POKEDATA:
-		/* write the word at location addr. */
-		copied = access_process_vm(child, addr, &data, sizeof(data),1);
-		if (copied != sizeof(data))
-			return -EIO;
-		return 0;
-
-	case PTRACE_POKEUSR:
-		/* write the word at location addr in the USER area */
-		return poke_user(child, addr, data);
-
-	case PTRACE_PEEKUSR_AREA:
-	case PTRACE_POKEUSR_AREA:
-		if (!copy_from_user(&parea, (void *) addr, sizeof(parea)))
-			return -EFAULT;
-		addr = parea.kernel_addr;
-		data = parea.process_addr;
-		copied = 0;
-		while (copied < parea.len) {
-			if (request == PTRACE_PEEKUSR_AREA)
-				ret = peek_user(child, addr, data);
-			else
-				ret = poke_user(child, addr, data);
-			if (ret)
-				return ret;
-			addr += sizeof(unsigned long);
-			data += sizeof(unsigned long);
-			copied += sizeof(unsigned long);
-		}
-		return 0;
-	}
-	return ptrace_request(child, request, addr, data);
-}
-
-#ifdef CONFIG_S390_SUPPORT
-/*
- * Now the fun part starts... a 31 bit program running in the
- * 31 bit emulation tracing another program. PTRACE_PEEKTEXT,
- * PTRACE_PEEKDATA, PTRACE_POKETEXT and PTRACE_POKEDATA are easy
- * to handle, the difference to the 64 bit versions of the requests
- * is that the access is done in multiples of 4 byte instead of
- * 8 bytes (sizeof(unsigned long) on 31/64 bit).
- * The ugly part are PTRACE_PEEKUSR, PTRACE_PEEKUSR_AREA,
- * PTRACE_POKEUSR and PTRACE_POKEUSR_AREA. If the traced program
- * is a 31 bit program too, the content of struct user can be
- * emulated. A 31 bit program peeking into the struct user of
- * a 64 bit program is a no-no.
- */
-
-/*
- * Same as peek_user but for a 31 bit program.
- */
-static int peek_user_emu31(struct task_struct *child, addr_t addr, addr_t data)
-{
-	struct user32 *dummy32 = NULL;
-	per_struct32 *dummy_per32 = NULL;
-	addr_t offset;
-	__u32 tmp;
-
-	if (!test_thread_flag(TIF_31BIT) ||
-	    (addr & 3) || addr > sizeof(struct user) - 3)
-		return -EIO;
-
-	if (addr <= (addr_t) &dummy32->regs.orig_gpr2) {
-		/*
-		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
-		 */
-		if (addr == (addr_t) &dummy32->regs.psw.mask) {
-			/* Fake a 31 bit psw mask. */
-			tmp = (__u32)(__KSTK_PTREGS(child)->psw.mask >> 32);
-			tmp = (tmp & PSW32_MASK_CC) | PSW32_USER_BITS;
-		} else if (addr == (addr_t) &dummy32->regs.psw.addr) {
-			/* Fake a 31 bit psw address. */
-			tmp = (__u32) __KSTK_PTREGS(child)->psw.addr |
-				PSW32_ADDR_AMODE31;
-		} else
-			tmp = *(__u32 *)((addr_t) __KSTK_PTREGS(child) + 
-					 addr*2 + 4);
-	} else if (addr >= (addr_t) &dummy32->regs.fp_regs &&
-		   addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
-		/*
-		 * floating point regs. are stored in the thread structure 
-		 */
-	        offset = addr - (addr_t) &dummy32->regs.fp_regs;
-		tmp = *(__u32 *)((addr_t) &child->thread.fp_regs + offset);
-
-	} else if (addr >= (addr_t) &dummy32->regs.per_info &&
-		   addr < (addr_t) (&dummy32->regs.per_info + 1)) {
-		/*
-		 * per_info is found in the thread structure
-		 */
-		offset = addr - (addr_t) &dummy32->regs.per_info;
-		/* This is magic. See per_struct and per_struct32. */
-		if ((offset >= (addr_t) &dummy_per32->control_regs &&
-		     offset < (addr_t) (&dummy_per32->control_regs + 1)) ||
-		    (offset >= (addr_t) &dummy_per32->starting_addr &&
-		     offset <= (addr_t) &dummy_per32->ending_addr) ||
-		    offset == (addr_t) &dummy_per32->lowcore.words.address)
-			offset = offset*2 + 4;
-		else
-			offset = offset*2;
-		tmp = *(__u32 *)((addr_t) &child->thread.per_info + offset);
-
-	} else
-		tmp = 0;
-
-	return put_user(tmp, (__u32 *) data);
-}
-
-/*
- * Same as poke_user but for a 31 bit program.
- */
-static int poke_user_emu31(struct task_struct *child, addr_t addr, addr_t data)
-{
-	struct user32 *dummy32 = NULL;
-	per_struct32 *dummy_per32 = NULL;
-	addr_t offset;
-	__u32 tmp;
-
-	if (!test_thread_flag(TIF_31BIT) ||
-	    (addr & 3) || addr > sizeof(struct user32) - 3)
-		return -EIO;
-
-	tmp = (__u32) data;
-
-	if (addr <= (addr_t) &dummy32->regs.orig_gpr2) {
-		/*
-		 * psw, gprs, acrs and orig_gpr2 are stored on the stack
-		 */
-		if (addr == (addr_t) &dummy32->regs.psw.mask) {
-			/* Build a 64 bit psw mask from 31 bit mask. */
-			if ((tmp & ~PSW32_MASK_CC) != PSW32_USER_BITS)
-				/* Invalid psw mask. */
-				return -EINVAL;
-			__KSTK_PTREGS(child)->psw.mask = PSW_USER_BITS |
-				((tmp & PSW32_MASK_CC) << 32);
-		} else if (addr == (addr_t) &dummy32->regs.psw.addr) {
-			/* Build a 64 bit psw address from 31 bit address. */
-			__KSTK_PTREGS(child)->psw.addr = 
-				(__u64) tmp & PSW32_ADDR_INSN;
-		} else
-			*(__u32*)((addr_t) __KSTK_PTREGS(child) + addr*2 + 4) =
-				tmp;
-	} else if (addr >= (addr_t) &dummy32->regs.fp_regs &&
-		   addr < (addr_t) (&dummy32->regs.fp_regs + 1)) {
-		/*
-		 * floating point regs. are stored in the thread structure 
-		 */
-		if (addr == (addr_t) &dummy32->regs.fp_regs.fpc &&
-		    (tmp & ~FPC_VALID_MASK) != 0)
-			/* Invalid floating point control. */
-			return -EINVAL;
-	        offset = addr - (addr_t) &dummy32->regs.fp_regs;
-		*(__u32 *)((addr_t) &child->thread.fp_regs + offset) = tmp;
-
-	} else if (addr >= (addr_t) &dummy32->regs.per_info &&
-		   addr < (addr_t) (&dummy32->regs.per_info + 1)) {
-		/*
-		 * per_info is found in the thread structure.
-		 */
-		offset = addr - (addr_t) &dummy32->regs.per_info;
-		/*
-		 * This is magic. See per_struct and per_struct32.
-		 * By incident the offsets in per_struct are exactly
-		 * twice the offsets in per_struct32 for all fields.
-		 * The 8 byte fields need special handling though,
-		 * because the second half (bytes 4-7) is needed and
-		 * not the first half.
-		 */
-		if ((offset >= (addr_t) &dummy_per32->control_regs &&
-		     offset < (addr_t) (&dummy_per32->control_regs + 1)) ||
-		    (offset >= (addr_t) &dummy_per32->starting_addr &&
-		     offset <= (addr_t) &dummy_per32->ending_addr) ||
-		    offset == (addr_t) &dummy_per32->lowcore.words.address)
-			offset = offset*2 + 4;
-		else
-			offset = offset*2;
-		*(__u32 *)((addr_t) &child->thread.per_info + offset) = tmp;
-
-	}
-
-	FixPerRegisters(child);
-	return 0;
-}
-
-static int
-do_ptrace_emu31(struct task_struct *child, long request, long addr, long data)
-{
-	unsigned int tmp;  /* 4 bytes !! */
-	ptrace_area_emu31 parea; 
-	int copied, ret;
-
-	switch (request) {
-	case PTRACE_PEEKTEXT:
-	case PTRACE_PEEKDATA:
-		/* read word at location addr. */
-		copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);
-		if (copied != sizeof(tmp))
-			return -EIO;
-		return put_user(tmp, (unsigned int *) data);
-
-	case PTRACE_PEEKUSR:
-		/* read the word at location addr in the USER area. */
-		return peek_user_emu31(child, addr, data);
-
-	case PTRACE_POKETEXT:
-	case PTRACE_POKEDATA:
-		/* write the word at location addr. */
-		tmp = data;
-		copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 1);
-		if (copied != sizeof(tmp))
-			return -EIO;
-		return 0;
-
-	case PTRACE_POKEUSR:
-		/* write the word at location addr in the USER area */
-		return poke_user_emu31(child, addr, data);
-
-	case PTRACE_PEEKUSR_AREA:
-	case PTRACE_POKEUSR_AREA:
-		if (!copy_from_user(&parea, (void *) addr, sizeof(parea)))
-			return -EFAULT;
-		addr = parea.kernel_addr;
-		data = parea.process_addr;
-		copied = 0;
-		while (copied < parea.len) {
-			if (request == PTRACE_PEEKUSR_AREA)
-				ret = peek_user_emu31(child, addr, data);
-			else
-				ret = poke_user_emu31(child, addr, data);
-			if (ret)
-				return ret;
-			addr += sizeof(unsigned int);
-			data += sizeof(unsigned int);
-			copied += sizeof(unsigned int);
-		}
-		return 0;
-	}
-	return ptrace_request(child, request, addr, data);
-}
-#endif
-
-static int
-do_ptrace(struct task_struct *child, long request, long addr, long data)
-{
-	int ret;
-
-	if (request == PTRACE_ATTACH)
-		return ptrace_attach(child);
-
-	/*
-	 * I added child != current line so we can get the
-	 * ieee_instruction_pointer from the user structure DJB
-	 */
-	if (child != current) {
-		ret = ptrace_check_attach(child, request == PTRACE_KILL);
-		if (ret < 0)
-			return ret;
-	}
-
-	switch (request) {
-	/* First the common request for 31/64 bit */
-	case PTRACE_SYSCALL:
-		/* continue and stop at next (return from) syscall */
-	case PTRACE_CONT:
-		/* restart after signal. */
-		if ((unsigned long) data >= _NSIG)
-			return -EIO;
-		if (request == PTRACE_SYSCALL)
-			set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-		else
-			clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-		child->exit_code = data;
-		/* make sure the single step bit is not set. */
-		clear_single_step(child);
-		wake_up_process(child);
-		return 0;
-
-	case PTRACE_KILL:
-		/*
-		 * make the child exit.  Best I can do is send it a sigkill. 
-		 * perhaps it should be put in the status that it wants to 
-		 * exit.
-		 */
-		if (child->state == TASK_ZOMBIE) /* already dead */
-			return 0;
-		child->exit_code = SIGKILL;
-		/* make sure the single step bit is not set. */
-		clear_single_step(child);
-		wake_up_process(child);
-		return 0;
-
-	case PTRACE_SINGLESTEP:
-		/* set the trap flag. */
-		if ((unsigned long) data >= _NSIG)
-			return -EIO;
-		clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-		child->exit_code = data;
-		set_single_step(child);
-		/* give it a chance to run. */
-		wake_up_process(child);
-		return 0;
-
-	case PTRACE_DETACH:
-		/* detach a process that was attached. */
-		return ptrace_detach(child, data);
-
-	/* Do requests that differ for 31/64 bit */
-	default:
-#ifdef CONFIG_S390_SUPPORT
-		if (test_thread_flag(TIF_31BIT))
-			return do_ptrace_emu31(child, request, addr, data);
-#endif
-		return do_ptrace_normal(child, request, addr, data);
-	}
-	/* Not reached.  */
-	return -EIO;
-}
-
-asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
-{
-	struct task_struct *child;
-	int ret;
-
-	lock_kernel();
-
-	if (request == PTRACE_TRACEME) {
-		/* are we already being traced? */
-		ret = -EPERM;
-		if (current->ptrace & PT_PTRACED)
-			goto out;
-		ret = security_ptrace(current->parent, current);
-		if (ret)
-			goto out;
-		/* set the ptrace bit in the process flags. */
-		current->ptrace |= PT_PTRACED;
-		goto out;
-	}
-
-	ret = -EPERM;
-	if (pid == 1)		/* you may not mess with init */
-		goto out;
-
-	ret = -ESRCH;
-	read_lock(&tasklist_lock);
-	child = find_task_by_pid(pid);
-	if (child)
-		get_task_struct(child);
-	read_unlock(&tasklist_lock);
-	if (!child)
-		goto out;
-
-	ret = do_ptrace(child, request, addr, data);
-
-	put_task_struct(child);
-out:
-	unlock_kernel();
-	return ret;
-}
-
-asmlinkage void syscall_trace(void)
-{
-	if (!test_thread_flag(TIF_SYSCALL_TRACE))
-		return;
-	if (!(current->ptrace & PT_PTRACED))
-		return;
-	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
-				 ? 0x80 : 0));
-
-	/*
-	 * this isn't the same as continuing with a signal, but it will do
-	 * for normal use.  strace only continues with a signal if the
-	 * stopping signal is not SIGTRAP.  -brl
-	 */
-	if (current->exit_code) {
-		send_sig(current->exit_code, current, 1);
-		current->exit_code = 0;
-	}
-}
diff -Nru a/arch/s390x/kernel/ptrace32.h b/arch/s390x/kernel/ptrace32.h
--- a/arch/s390x/kernel/ptrace32.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,86 +0,0 @@
-#ifndef _PTRACE32_H
-#define _PTRACE32_H
-
-#include "linux32.h"  /* needed for _psw_t32 */
-
-typedef struct
-{
-	__u32 cr[3];
-} per_cr_words32  __attribute__((packed));
-
-typedef struct
-{
-	__u16          perc_atmid;          /* 0x096 */
-	__u32          address;             /* 0x098 */
-	__u8           access_id;           /* 0x0a1 */
-} per_lowcore_words32  __attribute__((packed));
-
-typedef struct
-{
-	union {
-		per_cr_words32   words;
-	} control_regs  __attribute__((packed));
-	/*
-	 * Use these flags instead of setting em_instruction_fetch
-	 * directly they are used so that single stepping can be
-	 * switched on & off while not affecting other tracing
-	 */
-	unsigned  single_step       : 1;
-	unsigned  instruction_fetch : 1;
-	unsigned                    : 30;
-	/*
-	 * These addresses are copied into cr10 & cr11 if single
-	 * stepping is switched off
-	 */
-	__u32     starting_addr;
-	__u32     ending_addr;
-	union {
-		per_lowcore_words32 words;
-	} lowcore; 
-} per_struct32 __attribute__((packed));
-
-struct user_regs_struct32
-{
-	_psw_t32 psw;
-	u32 gprs[NUM_GPRS];
-	u32 acrs[NUM_ACRS];
-	u32 orig_gpr2;
-	s390_fp_regs fp_regs;
-	/*
-	 * These per registers are in here so that gdb can modify them
-	 * itself as there is no "official" ptrace interface for hardware
-	 * watchpoints. This is the way intel does it.
-	 */
-	per_struct32 per_info;
-	u32  ieee_instruction_pointer; 
-	/* Used to give failing instruction back to user for ieee exceptions */
-};
-
-struct user32 {
-	/* We start with the registers, to mimic the way that "memory"
-	   is returned from the ptrace(3,...) function.  */
-	struct user_regs_struct32 regs; /* Where the registers are actually stored */
-	/* The rest of this junk is to help gdb figure out what goes where */
-	u32 u_tsize;		/* Text segment size (pages). */
-	u32 u_dsize;	        /* Data segment size (pages). */
-	u32 u_ssize;	        /* Stack segment size (pages). */
-	u32 start_code;         /* Starting virtual address of text. */
-	u32 start_stack;	/* Starting virtual address of stack area.
-				   This is actually the bottom of the stack,
-				   the top of the stack is always found in the
-				   esp register.  */
-	s32 signal;     	 /* Signal that caused the core dump. */
-	u32 u_ar0;               /* Used by gdb to help find the values for */
-	                         /* the registers. */
-	u32 magic;		 /* To uniquely identify a core file */
-	char u_comm[32];	 /* User command that was responsible */
-};
-
-typedef struct
-{
-	__u32   len;
-	__u32   kernel_addr;
-	__u32   process_addr;
-} ptrace_area_emu31;
-
-#endif /* _PTRACE32_H */
diff -Nru a/arch/s390x/kernel/reipl.S b/arch/s390x/kernel/reipl.S
--- a/arch/s390x/kernel/reipl.S	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,96 +0,0 @@
-/*
- *  arch/s390/kernel/reipl.S
- *
- *  S390 version
- *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com)
-	         Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- */
-
-#include <asm/lowcore.h>
-		.globl	do_reipl
-do_reipl:	basr	%r13,0
-.Lpg0:		lpswe   .Lnewpsw-.Lpg0(%r13)
-.Lpg1:		lctlg	%c6,%c6,.Lall-.Lpg0(%r13)
-                stctg   %c0,%c0,.Lctlsave-.Lpg0(%r13)
-                ni      .Lctlsave+4-.Lpg0(%r13),0xef
-                lctlg   %c0,%c0,.Lctlsave-.Lpg0(%r13)
-                lgr     %r1,%r2
-        	mvc     __LC_PGM_NEW_PSW(16),.Lpcnew-.Lpg0(%r13)
-                stsch   .Lschib-.Lpg0(%r13)                                    
-	        oi      .Lschib+5-.Lpg0(%r13),0x84 
-.Lecs:  	xi      .Lschib+27-.Lpg0(%r13),0x01 
-        	msch    .Lschib-.Lpg0(%r13) 
-	        lghi    %r0,5
-.Lssch:		ssch	.Liplorb-.Lpg0(%r13)           
-		jz	.L001
-		brct    %r0,.Lssch   
-		bas	%r14,.Ldisab-.Lpg0(%r13)
-.L001:		mvc	__LC_IO_NEW_PSW(16),.Lionew-.Lpg0(%r13)	
-.Ltpi:		lpswe	.Lwaitpsw-.Lpg0(%r13)          
-.Lcont:		c	%r1,__LC_SUBCHANNEL_ID
-		jnz	.Ltpi
-		clc	__LC_IO_INT_PARM(4),.Liplorb-.Lpg0(%r13)
-		jnz	.Ltpi
-		tsch	.Liplirb-.Lpg0(%r13)           
-		tm	.Liplirb+9-.Lpg0(%r13),0xbf
-                jz      .L002
-                bas     %r14,.Ldisab-.Lpg0(%r13)    
-.L002:		tm	.Liplirb+8-.Lpg0(%r13),0xf3    
-                jz      .L003
-                bas     %r14,.Ldisab-.Lpg0(%r13)	
-.L003:		spx	.Lnull-.Lpg0(%r13)
-		st 	%r1,__LC_SUBCHANNEL_ID
-                lhi     %r1,0            # mode 0 = esa
-                slr     %r0,%r0          # set cpuid to zero
-                sigp    %r1,%r0,0x12     # switch to esa mode
-                lpsw 	0
-.Ldisab:	sll    %r14,1
-		srl    %r14,1            # need to kill hi bit to avoid specification exceptions.
-		st     %r14,.Ldispsw+12-.Lpg0(%r13)
-		lpswe	.Ldispsw-.Lpg0(%r13)
-                .align 	8
-.Lall:		.quad	0x00000000ff000000
-.Lctlsave:      .quad   0x0000000000000000
-.Lnull:		.long   0x0000000000000000
-                .align 	16
-/*
- * These addresses have to be 31 bit otherwise
- * the sigp will throw a specifcation exception
- * when switching to ESA mode as bit 31 be set
- * in the ESA psw.
- * Bit 31 of the addresses has to be 0 for the
- * 31bit lpswe instruction a fact they appear to have
- * ommited from the pop.
- */
-.Lnewpsw:	.quad   0x0000000080000000
-		.quad   .Lpg1
-.Lpcnew:	.quad   0x0000000080000000
-	  	.quad   .Lecs
-.Lionew:	.quad   0x0000000080000000
-		.quad   .Lcont
-.Lwaitpsw:	.quad	0x0202000080000000
-		.quad   .Ltpi
-.Ldispsw:	.quad   0x0002000080000000
-		.quad   0x0000000000000000
-.Liplccws:	.long   0x02000000,0x60000018
-		.long   0x08000008,0x20000001
-.Liplorb:	.long	0x0049504c,0x0040ff80
-		.long	0x00000000+.Liplccws
-.Lschib:        .long   0x00000000,0x00000000
-		.long   0x00000000,0x00000000
-		.long   0x00000000,0x00000000
-		.long   0x00000000,0x00000000
-		.long   0x00000000,0x00000000
-		.long   0x00000000,0x00000000
-.Liplirb:	.long	0x00000000,0x00000000
-		.long	0x00000000,0x00000000
-		.long	0x00000000,0x00000000
-		.long	0x00000000,0x00000000
-		.long	0x00000000,0x00000000
-		.long	0x00000000,0x00000000
-		.long	0x00000000,0x00000000
-		.long	0x00000000,0x00000000
-	
-
-	
diff -Nru a/arch/s390x/kernel/s390_ext.c b/arch/s390x/kernel/s390_ext.c
--- a/arch/s390x/kernel/s390_ext.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,103 +0,0 @@
-/*
- *  arch/s390/kernel/s390_ext.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/errno.h>
-#include <asm/lowcore.h>
-#include <asm/s390_ext.h>
-
-/*
- * Simple hash strategy: index = code & 0xff;
- * ext_int_hash[index] is the start of the list for all external interrupts
- * that hash to this index. With the current set of external interrupts 
- * (0x1202 external call, 0x1004 cpu timer, 0x2401 hwc console, 0x4000
- * iucv and 0x2603 pfault) this is always the first element. 
- */
-ext_int_info_t *ext_int_hash[256] = { 0, };
-
-int register_external_interrupt(__u16 code, ext_int_handler_t handler) {
-        ext_int_info_t *p;
-        int index;
-
-	p = (ext_int_info_t *) kmalloc(sizeof(ext_int_info_t), GFP_ATOMIC);
-        if (p == NULL)
-                return -ENOMEM;
-        p->code = code;
-        p->handler = handler;
-        index = code & 0xff;
-        p->next = ext_int_hash[index];
-        ext_int_hash[index] = p;
-        return 0;
-}
-
-int register_early_external_interrupt(__u16 code, ext_int_handler_t handler,
-				      ext_int_info_t *p) {
-        int index;
-
-        if (p == NULL)
-                return -EINVAL;
-        p->code = code;
-        p->handler = handler;
-        index = code & 0xff;
-        p->next = ext_int_hash[index];
-        ext_int_hash[index] = p;
-        return 0;
-}
-
-int unregister_external_interrupt(__u16 code, ext_int_handler_t handler) {
-        ext_int_info_t *p, *q;
-        int index;
-
-        index = code & 0xff;
-        q = NULL;
-        p = ext_int_hash[index];
-        while (p != NULL) {
-                if (p->code == code && p->handler == handler)
-                        break;
-                q = p;
-                p = p->next;
-        }
-        if (p == NULL)
-                return -ENOENT;
-        if (q != NULL)
-                q->next = p->next;
-        else
-                ext_int_hash[index] = p->next;
-	kfree(p);
-        return 0;
-}
-
-int unregister_early_external_interrupt(__u16 code, ext_int_handler_t handler,
-					ext_int_info_t *p) {
-	ext_int_info_t *q;
-	int index;
-
-	if (p == NULL || p->code != code || p->handler != handler)
-		return -EINVAL;
-	index = code & 0xff;
-	q = ext_int_hash[index];
-	if (p != q) {
-		while (q != NULL) {
-			if (q->next == p)
-				break;
-			q = q->next;
-		}
-		if (q == NULL)
-			return -ENOENT;
-		q->next = p->next;
-	} else
-		ext_int_hash[index] = p->next;
-	return 0;
-}
-
-EXPORT_SYMBOL(register_external_interrupt);
-EXPORT_SYMBOL(unregister_external_interrupt);
-
diff -Nru a/arch/s390x/kernel/s390_ksyms.c b/arch/s390x/kernel/s390_ksyms.c
--- a/arch/s390x/kernel/s390_ksyms.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,86 +0,0 @@
-/*
- *  arch/s390/kernel/s390_ksyms.c
- *
- *  S390 version
- */
-#include <linux/config.h>
-#include <linux/highuid.h>
-#include <linux/module.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/interrupt.h>
-#include <asm/checksum.h>
-#include <asm/delay.h>
-#include <asm/pgalloc.h>
-#include <asm/setup.h>
-#if CONFIG_IP_MULTICAST
-#include <net/arp.h>
-#endif
-
-/*
- * memory management
- */
-EXPORT_SYMBOL_NOVERS(_oi_bitmap);
-EXPORT_SYMBOL_NOVERS(_ni_bitmap);
-EXPORT_SYMBOL_NOVERS(_zb_findmap);
-EXPORT_SYMBOL_NOVERS(__copy_from_user_asm);
-EXPORT_SYMBOL_NOVERS(__copy_to_user_asm);
-EXPORT_SYMBOL_NOVERS(__clear_user_asm);
-
-/*
- * semaphore ops
- */
-EXPORT_SYMBOL(__up);
-EXPORT_SYMBOL(__down);
-EXPORT_SYMBOL(__down_interruptible);
-
-/*
- * string functions
- */
-EXPORT_SYMBOL_NOVERS(memcmp);
-EXPORT_SYMBOL_NOVERS(memset);
-EXPORT_SYMBOL_NOVERS(memmove);
-EXPORT_SYMBOL_NOVERS(memscan);
-EXPORT_SYMBOL_NOVERS(strlen);
-EXPORT_SYMBOL_NOVERS(strchr);
-EXPORT_SYMBOL_NOVERS(strcmp);
-EXPORT_SYMBOL_NOVERS(strncat);
-EXPORT_SYMBOL_NOVERS(strncmp);
-EXPORT_SYMBOL_NOVERS(strncpy);
-EXPORT_SYMBOL_NOVERS(strnlen);
-EXPORT_SYMBOL_NOVERS(strrchr);
-EXPORT_SYMBOL_NOVERS(strstr);
-EXPORT_SYMBOL_NOVERS(strpbrk);
-
-/*
- * binfmt_elf loader 
- */
-extern int dump_fpu (struct pt_regs * regs, s390_fp_regs *fpregs);
-EXPORT_SYMBOL(dump_fpu);
-EXPORT_SYMBOL(overflowuid);
-EXPORT_SYMBOL(overflowgid);
-
-#ifdef CONFIG_S390_SUPPORT
-/*
- * Dynamically add/remove 31 bit ioctl conversion functions.
- */
-extern int register_ioctl32_conversion(unsigned int cmd,
-				       int (*handler)(unsigned int, 
-						      unsigned int,
-						      unsigned long,
-						      struct file *));
-int unregister_ioctl32_conversion(unsigned int cmd);
-EXPORT_SYMBOL(register_ioctl32_conversion);
-EXPORT_SYMBOL(unregister_ioctl32_conversion);
-#endif
-
-/*
- * misc.
- */
-EXPORT_SYMBOL(machine_flags);
-EXPORT_SYMBOL(__udelay);
-EXPORT_SYMBOL(kernel_thread);
-EXPORT_SYMBOL(console_mode);
-EXPORT_SYMBOL(console_device);
-EXPORT_SYMBOL_NOVERS(do_call_softirq);
-EXPORT_SYMBOL(sys_wait4);
diff -Nru a/arch/s390x/kernel/semaphore.c b/arch/s390x/kernel/semaphore.c
--- a/arch/s390x/kernel/semaphore.c	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,106 +0,0 @@
-/*
- *  linux/arch/s390x/kernel/semaphore.c
- *
- *  S390 version
- *    Copyright (C) 1998-2000 IBM Corporation
- *    Author(s): Martin Schwidefsky
- *
- *  Derived from "linux/arch/i386/kernel/semaphore.c
- *    Copyright (C) 1999, Linus Torvalds
- *
- */
-#include <linux/sched.h>
-#include <linux/errno.h>
-
-#include <asm/semaphore.h>
-
-/*
- * Atomically update sem->count. Equivalent to:
- *   old_val = sem->count.counter;
- *   new_val = ((old_val >= 0) ? old_val : 0) + incr;
- *   sem->count.counter = new_val;
- *   return old_val;
- */
-static inline int __sem_update_count(struct semaphore *sem, int incr)
-{
-	int old_val, new_val;
-
-        __asm__ __volatile__("   l     %0,0(%3)\n"
-                             "0: ltr   %1,%0\n"
-			     "   jhe   1f\n"
-			     "   lhi   %1,0\n"
-			     "1: ar    %1,%4\n"
-                             "   cs    %0,%1,0(%3)\n"
-                             "   jl    0b\n"
-                             : "=&d" (old_val), "=&d" (new_val),
-			       "+m" (sem->count)
-			     : "a" (&sem->count), "d" (incr) : "cc" );
-	return old_val;
-}
-
-/*
- * The inline function up() incremented count but the result
- * was <= 0. This indicates that some process is waiting on
- * the semaphore. The semaphore is free and we'll wake the
- * first sleeping process, so we set count to 1 unless some
- * other cpu has called up in the meantime in which case
- * we just increment count by 1.
- */
-void __up(struct semaphore *sem)
-{
-	__sem_update_count(sem, 1);
-	wake_up(&sem->wait);
-}
-
-/*
- * The inline function down() decremented count and the result
- * was < 0. The wait loop will atomically test and update the
- * semaphore counter following the rules:
- *   count > 0: decrement count, wake up queue and exit.
- *   count <= 0: set count to -1, go to sleep.
- */
-void __down(struct semaphore * sem)
-{
-	struct task_struct *tsk = current;
-	DECLARE_WAITQUEUE(wait, tsk);
-
-	tsk->state = TASK_UNINTERRUPTIBLE;
-	add_wait_queue_exclusive(&sem->wait, &wait);
-	while (__sem_update_count(sem, -1) <= 0) {
-		schedule();
-		tsk->state = TASK_UNINTERRUPTIBLE;
-	}
-	remove_wait_queue(&sem->wait, &wait);
-	tsk->state = TASK_RUNNING;
-	wake_up(&sem->wait);
-}
-
-/*
- * Same as __down() with an additional test for signals.
- * If a signal is pending the count is updated as follows:
- *   count > 0: wake up queue and exit.
- *   count <= 0: set count to 0, wake up queue and exit.
- */
-int __down_interruptible(struct semaphore * sem)
-{
-	int retval = 0;
-	struct task_struct *tsk = current;
-	DECLARE_WAITQUEUE(wait, tsk);
-
-	tsk->state = TASK_INTERRUPTIBLE;
-	add_wait_queue_exclusive(&sem->wait, &wait);
-	while (__sem_update_count(sem, -1) <= 0) {
-		if (signal_pending(current)) {
-			__sem_update_count(sem, 0);
-			retval = -EINTR;
-			break;
-		}
-		schedule();
-		tsk->state = TASK_INTERRUPTIBLE;
-	}
-	remove_wait_queue(&sem->wait, &wait);
-	tsk->state = TASK_RUNNING;
-	wake_up(&sem->wait);
-	return retval;
-}
-
diff -Nru a/arch/s390x/kernel/setup.c b/arch/s390x/kernel/setup.c
--- a/arch/s390x/kernel/setup.c	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,563 +0,0 @@
-/*
- *  arch/s390/kernel/setup.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "arch/i386/kernel/setup.c"
- *    Copyright (C) 1995, Linus Torvalds
- */
-
-/*
- * This file handles the architecture-dependent parts of initialization
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/stddef.h>
-#include <linux/unistd.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/user.h>
-#include <linux/a.out.h>
-#include <linux/tty.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/config.h>
-#include <linux/init.h>
-#ifdef CONFIG_BLK_DEV_RAM
-#include <linux/blk.h>
-#endif
-#include <linux/bootmem.h>
-#include <linux/root_dev.h>
-#include <linux/console.h>
-#include <linux/seq_file.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/smp.h>
-#include <asm/mmu_context.h>
-#include <asm/cpcmd.h>
-
-/*
- * Machine setup..
- */
-unsigned int console_mode = 0;
-unsigned int console_device = -1;
-unsigned int console_irq = -1;
-unsigned long memory_size = 0;
-unsigned long machine_flags = 0;
-struct { unsigned long addr, size, type; } memory_chunk[16] = { { 0 } };
-#define CHUNK_READ_WRITE 0
-#define CHUNK_READ_ONLY 1
-int cpus_initialized = 0;
-unsigned long cpu_initialized = 0;
-volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
-
-/*
- * Setup options
- */
-extern int _text,_etext, _edata, _end;
-
-/*
- * This is set up by the setup-routine at boot-time
- * for S390 need to find out, what we have to setup
- * using address 0x10400 ...
- */
-
-#include <asm/setup.h>
-
-static char command_line[COMMAND_LINE_SIZE] = { 0, };
-       char saved_command_line[COMMAND_LINE_SIZE];
-
-static struct resource code_resource = { "Kernel code", 0x100000, 0 };
-static struct resource data_resource = { "Kernel data", 0, 0 };
-
-/*
- * cpu_init() initializes state that is per-CPU.
- */
-void __devinit cpu_init (void)
-{
-        int nr = smp_processor_id();
-        int addr = hard_smp_processor_id();
-
-        if (test_and_set_bit(nr,&cpu_initialized)) {
-                printk("CPU#%d ALREADY INITIALIZED!!!!!!!!!\n", nr);
-                for (;;) local_irq_enable();
-        }
-        cpus_initialized++;
-
-        /*
-         * Store processor id in lowcore (used e.g. in timer_interrupt)
-         */
-        asm volatile ("stidp %0": "=m" (S390_lowcore.cpu_data.cpu_id));
-        S390_lowcore.cpu_data.cpu_addr = addr;
-        S390_lowcore.cpu_data.cpu_nr = nr;
-
-        /*
-         * Force FPU initialization:
-         */
-        clear_thread_flag(TIF_USEDFPU);
-        current->used_math = 0;
-
-        /* Setup active_mm for idle_task  */
-        atomic_inc(&init_mm.mm_count);
-        current->active_mm = &init_mm;
-        if (current->mm)
-                BUG();
-        enter_lazy_tlb(&init_mm, current, nr);
-}
-
-/*
- * VM halt and poweroff setup routines
- */
-char vmhalt_cmd[128] = "";
-char vmpoff_cmd[128] = "";
-
-static inline void strncpy_skip_quote(char *dst, char *src, int n)
-{
-        int sx, dx;
-
-        dx = 0;
-        for (sx = 0; src[sx] != 0; sx++) {
-                if (src[sx] == '"') continue;
-                dst[dx++] = src[sx];
-                if (dx >= n) break;
-        }
-}
-
-static int __init vmhalt_setup(char *str)
-{
-        strncpy_skip_quote(vmhalt_cmd, str, 127);
-        vmhalt_cmd[127] = 0;
-        return 1;
-}
-
-__setup("vmhalt=", vmhalt_setup);
-
-static int __init vmpoff_setup(char *str)
-{
-        strncpy_skip_quote(vmpoff_cmd, str, 127);
-        vmpoff_cmd[127] = 0;
-        return 1;
-}
-
-__setup("vmpoff=", vmpoff_setup);
-
-/*
- * condev= and conmode= setup parameter.
- */
-
-static int __init condev_setup(char *str)
-{
-	int vdev;
-
-	vdev = simple_strtoul(str, &str, 0);
-	if (vdev >= 0 && vdev < 65536)
-		console_device = vdev;
-	return 1;
-}
-
-__setup("condev=", condev_setup);
-
-static int __init conmode_setup(char *str)
-{
-#if defined(CONFIG_SCLP_CONSOLE)
-	if (strncmp(str, "hwc", 4) == 0 || strncmp(str, "sclp", 5) == 0)
-                SET_CONSOLE_SCLP;
-#endif
-#if defined(CONFIG_TN3215_CONSOLE)
-	if (strncmp(str, "3215", 5) == 0)
-		SET_CONSOLE_3215;
-#endif
-#if defined(CONFIG_TN3270_CONSOLE)
-	if (strncmp(str, "3270", 5) == 0)
-		SET_CONSOLE_3270;
-#endif
-        return 1;
-}
-
-__setup("conmode=", conmode_setup);
-
-static void __init conmode_default(void)
-{
-	char query_buffer[1024];
-	char *ptr;
-
-        if (MACHINE_IS_VM) {
-		cpcmd("QUERY CONSOLE", query_buffer, 1024);
-		console_device = simple_strtoul(query_buffer + 5, NULL, 16);
-		ptr = strstr(query_buffer, "SUBCHANNEL =");
-		console_irq = simple_strtoul(ptr + 13, NULL, 16);
-		cpcmd("QUERY TERM", query_buffer, 1024);
-		ptr = strstr(query_buffer, "CONMODE");
-		/*
-		 * Set the conmode to 3215 so that the device recognition 
-		 * will set the cu_type of the console to 3215. If the
-		 * conmode is 3270 and we don't set it back then both
-		 * 3215 and the 3270 driver will try to access the console
-		 * device (3215 as console and 3270 as normal tty).
-		 */
-		cpcmd("TERM CONMODE 3215", NULL, 0);
-		if (ptr == NULL) {
-#if defined(CONFIG_SCLP_CONSOLE)
-			SET_CONSOLE_SCLP;
-#endif
-			return;
-		}
-		if (strncmp(ptr + 8, "3270", 4) == 0) {
-#if defined(CONFIG_TN3270_CONSOLE)
-			SET_CONSOLE_3270;
-#elif defined(CONFIG_TN3215_CONSOLE)
-			SET_CONSOLE_3215;
-#elif defined(CONFIG_SCLP_CONSOLE)
-			SET_CONSOLE_SCLP;
-#endif
-		} else if (strncmp(ptr + 8, "3215", 4) == 0) {
-#if defined(CONFIG_TN3215_CONSOLE)
-			SET_CONSOLE_3215;
-#elif defined(CONFIG_TN3270_CONSOLE)
-			SET_CONSOLE_3270;
-#elif defined(CONFIG_SCLP_CONSOLE)
-			SET_CONSOLE_SCLP;
-#endif
-		}
-        } else if (MACHINE_IS_P390) {
-#if defined(CONFIG_TN3215_CONSOLE)
-		SET_CONSOLE_3215;
-#elif defined(CONFIG_TN3270_CONSOLE)
-		SET_CONSOLE_3270;
-#endif
-	} else {
-#if defined(CONFIG_SCLP_CONSOLE)
-		SET_CONSOLE_SCLP;
-#endif
-	}
-}
-
-#ifdef CONFIG_SMP
-extern void machine_restart_smp(char *);
-extern void machine_halt_smp(void);
-extern void machine_power_off_smp(void);
-
-void (*_machine_restart)(char *command) = machine_restart_smp;
-void (*_machine_halt)(void) = machine_halt_smp;
-void (*_machine_power_off)(void) = machine_power_off_smp;
-#else
-/*
- * Reboot, halt and power_off routines for non SMP.
- */
-extern void do_reipl(unsigned long devno);
-static void do_machine_restart_nonsmp(char * __unused)
-{
-	if (MACHINE_IS_VM)
-		cpcmd ("IPL", NULL, 0);
-	else
-		do_reipl (0x10000 | S390_lowcore.ipl_device);
-}
-
-static void do_machine_halt_nonsmp(void)
-{
-        if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0)
-                cpcmd(vmhalt_cmd, NULL, 0);
-        signal_processor(smp_processor_id(), sigp_stop_and_store_status);
-}
-
-static void do_machine_power_off_nonsmp(void)
-{
-        if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0)
-                cpcmd(vmpoff_cmd, NULL, 0);
-        signal_processor(smp_processor_id(), sigp_stop_and_store_status);
-}
-
-void (*_machine_restart)(char *command) = do_machine_restart_nonsmp;
-void (*_machine_halt)(void) = do_machine_halt_nonsmp;
-void (*_machine_power_off)(void) = do_machine_power_off_nonsmp;
-#endif
-
-/*
- * Reboot, halt and power_off stubs. They just call _machine_restart,
- * _machine_halt or _machine_power_off. 
- */
-
-void machine_restart(char *command)
-{
-	_machine_restart(command);
-}
-
-void machine_halt(void)
-{
-	_machine_halt();
-}
-
-void machine_power_off(void)
-{
-	_machine_power_off();
-}
-
-/*
- * Setup function called from init/main.c just after the banner
- * was printed.
- */
-extern char _pstart, _pend, _stext;
-
-void __init setup_arch(char **cmdline_p)
-{
-        unsigned long bootmap_size;
-        unsigned long memory_start, memory_end;
-        char c = ' ', cn, *to = command_line, *from = COMMAND_LINE;
-	struct resource *res;
-	unsigned long start_pfn, end_pfn;
-        static unsigned int smptrap=0;
-        unsigned long delay = 0;
-	struct _lowcore *lc;
-	int i;
-
-        if (smptrap)
-                return;
-        smptrap=1;
-
-        /*
-         * print what head.S has found out about the machine 
-         */
-	printk((MACHINE_IS_VM) ?
-	       "We are running under VM (64 bit mode)\n" :
-	       "We are running native (64 bit mode)\n");
-
-        ROOT_DEV = Root_RAM0;
-        memory_start = (unsigned long) &_end;    /* fixit if use $CODELO etc*/
-	memory_end = memory_size & ~0x200000UL;  /* detected in head.s */
-        init_mm.start_code = PAGE_OFFSET;
-        init_mm.end_code = (unsigned long) &_etext;
-        init_mm.end_data = (unsigned long) &_edata;
-        init_mm.brk = (unsigned long) &_end;
-
-	code_resource.start = (unsigned long) &_text;
-	code_resource.end = (unsigned long) &_etext - 1;
-	data_resource.start = (unsigned long) &_etext;
-	data_resource.end = (unsigned long) &_edata - 1;
-
-        /* Save unparsed command line copy for /proc/cmdline */
-        memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
-        saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
-
-        for (;;) {
-                /*
-                 * "mem=XXX[kKmM]" sets memsize 
-                 */
-                if (c == ' ' && strncmp(from, "mem=", 4) == 0) {
-                        memory_end = simple_strtoul(from+4, &from, 0);
-                        if ( *from == 'K' || *from == 'k' ) {
-                                memory_end = memory_end << 10;
-                                from++;
-                        } else if ( *from == 'M' || *from == 'm' ) {
-                                memory_end = memory_end << 20;
-                                from++;
-                        }
-                }
-                /*
-                 * "ipldelay=XXX[sm]" sets ipl delay in seconds or minutes
-                 */
-                if (c == ' ' && strncmp(from, "ipldelay=", 9) == 0) {
-                        delay = simple_strtoul(from+9, &from, 0);
-			if (*from == 's' || *from == 'S') {
-				delay = delay*1000000;
-				from++;
-			} else if (*from == 'm' || *from == 'M') {
-				delay = delay*60*1000000;
-				from++;
-			}
-			/* now wait for the requested amount of time */
-			udelay(delay);
-                }
-                cn = *(from++);
-                if (!cn)
-                        break;
-                if (cn == '\n')
-                        cn = ' ';  /* replace newlines with space */
-		if (cn == 0x0d)
-			cn = ' ';  /* replace 0x0d with space */
-                if (cn == ' ' && c == ' ')
-                        continue;  /* remove additional spaces */
-                c = cn;
-                if (to - command_line >= COMMAND_LINE_SIZE)
-                        break;
-                *(to++) = c;
-        }
-        if (c == ' ' && to > command_line) to--;
-        *to = '\0';
-        *cmdline_p = command_line;
-
-	/*
-	 * partially used pages are not usable - thus
-	 * we are rounding upwards:
-	 */
-	start_pfn = (__pa(&_end) + PAGE_SIZE - 1) >> PAGE_SHIFT;
-	end_pfn = memory_end >> PAGE_SHIFT;
-
-	/*
-	 * Initialize the boot-time allocator
-	 */
-	bootmap_size = init_bootmem(start_pfn, end_pfn);
-
-	/*
-	 * Register RAM areas with the bootmem allocator.
-	 */
-	for (i = 0; i < 16 && memory_chunk[i].size > 0; i++) {
-		unsigned long start_chunk, end_chunk;
-
-		if (memory_chunk[i].type != CHUNK_READ_WRITE)
-			continue;
-		start_chunk = (memory_chunk[i].addr + PAGE_SIZE - 1);
-		start_chunk >>= PAGE_SHIFT;
-		end_chunk = (memory_chunk[i].addr + memory_chunk[i].size);
-		end_chunk >>= PAGE_SHIFT;
-		if (start_chunk < start_pfn)
-			start_chunk = start_pfn;
-		if (end_chunk > end_pfn)
-			end_chunk = end_pfn;
-		if (start_chunk < end_chunk)
-			free_bootmem(start_chunk << PAGE_SHIFT,
-				     (end_chunk - start_chunk) << PAGE_SHIFT);
-	}
-	
-        /*
-         * Reserve the bootmem bitmap itself as well. We do this in two
-         * steps (first step was init_bootmem()) because this catches
-         * the (very unlikely) case of us accidentally initializing the
-         * bootmem allocator with an invalid RAM area.
-         */
-        reserve_bootmem(start_pfn << PAGE_SHIFT, bootmap_size);
-
-#ifdef CONFIG_BLK_DEV_INITRD
-        if (INITRD_START) {
-		if (INITRD_START + INITRD_SIZE <= memory_end) {
-			reserve_bootmem(INITRD_START, INITRD_SIZE);
-			initrd_start = INITRD_START;
-			initrd_end = initrd_start + INITRD_SIZE;
-		} else {
-                        printk("initrd extends beyond end of memory "
-                               "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-                               initrd_start + INITRD_SIZE, memory_end);
-                        initrd_start = initrd_end = 0;
-		}
-        }
-#endif
-
-        /*
-         * Setup lowcore for boot cpu
-         */
-	lc = (struct _lowcore *) __alloc_bootmem(2*PAGE_SIZE, 2*PAGE_SIZE, 0);
-	memset(lc, 0, 2*PAGE_SIZE);
-	lc->restart_psw.mask = PSW_BASE_BITS;
-	lc->restart_psw.addr = (addr_t) &restart_int_handler;
-	lc->external_new_psw.mask = PSW_KERNEL_BITS;
-	lc->external_new_psw.addr = (addr_t) &ext_int_handler;
-	lc->svc_new_psw.mask = PSW_KERNEL_BITS;
-	lc->svc_new_psw.addr = (addr_t) &system_call;
-	lc->program_new_psw.mask = PSW_KERNEL_BITS;
-	lc->program_new_psw.addr = (addr_t) &pgm_check_handler;
-	lc->mcck_new_psw.mask = PSW_KERNEL_BITS;
-	lc->mcck_new_psw.addr = (addr_t) &mcck_int_handler;
-	lc->io_new_psw.mask = PSW_KERNEL_BITS;
-	lc->io_new_psw.addr = (addr_t) &io_int_handler;
-	lc->ipl_device = S390_lowcore.ipl_device;
-	lc->kernel_stack = ((__u64) &init_thread_union) + 16384;
-	lc->async_stack = (__u64)
-		__alloc_bootmem(4*PAGE_SIZE, 4*PAGE_SIZE, 0) + 16384;
-	lc->jiffy_timer = -1LL;
-	if (MACHINE_HAS_DIAG44)
-		lc->diag44_opcode = 0x83000044;
-	else
-		lc->diag44_opcode = 0x07000700;
-	set_prefix((__u32)(__u64) lc);
-        cpu_init();
-        __cpu_logical_map[0] = S390_lowcore.cpu_data.cpu_addr;
-
-	/*
-	 * Create kernel page tables and switch to virtual addressing.
-	 */
-        paging_init();
-
-	res = alloc_bootmem_low(sizeof(struct resource));
-	res->start = 0;
-	res->end = memory_end;
-	res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-	request_resource(&iomem_resource, res);
-	request_resource(res, &code_resource);
-	request_resource(res, &data_resource);
-
-        /* Setup default console */
-	conmode_default();
-}
-
-void print_cpu_info(struct cpuinfo_S390 *cpuinfo)
-{
-   printk("cpu %d "
-#ifdef CONFIG_SMP
-           "phys_idx=%d "
-#endif
-           "vers=%02X ident=%06X machine=%04X unused=%04X\n",
-           cpuinfo->cpu_nr,
-#ifdef CONFIG_SMP
-           cpuinfo->cpu_addr,
-#endif
-           cpuinfo->cpu_id.version,
-           cpuinfo->cpu_id.ident,
-           cpuinfo->cpu_id.machine,
-           cpuinfo->cpu_id.unused);
-}
-
-/*
- * show_cpuinfo - Get information on one CPU for use by procfs.
- */
-
-static int show_cpuinfo(struct seq_file *m, void *v)
-{
-        struct cpuinfo_S390 *cpuinfo;
-	unsigned long n = (unsigned long) v - 1;
-
-	if (!n) {
-		seq_printf(m, "vendor_id       : IBM/S390\n"
-				"# processors    : %i\n"
-				"bogomips per cpu: %lu.%02lu\n",
-				num_online_cpus(), loops_per_jiffy/(500000/HZ),
-				(loops_per_jiffy/(5000/HZ))%100);
-	}
-	if (cpu_online_map & (1 << n)) {
-		if (smp_processor_id() == n)
-			cpuinfo = &S390_lowcore.cpu_data;
-		else
-			cpuinfo = &lowcore_ptr[n]->cpu_data;
-		seq_printf(m, "processor %li: "
-				"version = %02X,  "
-				"identification = %06X,  "
-				"machine = %04X\n",
-				n, cpuinfo->cpu_id.version,
-				cpuinfo->cpu_id.ident,
-				cpuinfo->cpu_id.machine);
-	}
-        return 0;
-}
-
-static void *c_start(struct seq_file *m, loff_t *pos)
-{
-	return *pos < NR_CPUS ? (void *)((unsigned long) *pos + 1) : NULL;
-}
-static void *c_next(struct seq_file *m, void *v, loff_t *pos)
-{
-	++*pos;
-	return c_start(m, pos);
-}
-static void c_stop(struct seq_file *m, void *v)
-{
-}
-struct seq_operations cpuinfo_op = {
-	.start	= c_start,
-	.next	= c_next,
-	.stop	= c_stop,
-	.show	= show_cpuinfo,
-};
diff -Nru a/arch/s390x/kernel/signal.c b/arch/s390x/kernel/signal.c
--- a/arch/s390x/kernel/signal.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,487 +0,0 @@
-/*
- *  arch/s390/kernel/signal.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- *
- *    Based on Intel version
- * 
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
- */
-
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/errno.h>
-#include <linux/wait.h>
-#include <linux/ptrace.h>
-#include <linux/unistd.h>
-#include <linux/stddef.h>
-#include <linux/tty.h>
-#include <linux/personality.h>
-#include <linux/binfmts.h>
-#include <asm/ucontext.h>
-#include <asm/uaccess.h>
-
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-
-
-typedef struct 
-{
-	__u8 callee_used_stack[__SIGNAL_FRAMESIZE];
-	struct sigcontext sc;
-	_sigregs sregs;
-	__u8 retcode[S390_SYSCALL_SIZE];
-} sigframe;
-
-typedef struct 
-{
-	__u8 callee_used_stack[__SIGNAL_FRAMESIZE];
-	__u8 retcode[S390_SYSCALL_SIZE];
-	struct siginfo info;
-	struct ucontext uc;
-} rt_sigframe;
-
-asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
-
-/*
- * Atomically swap in the new signal mask, and wait for a signal.
- */
-asmlinkage int
-sys_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask)
-{
-	sigset_t saveset;
-
-	mask &= _BLOCKABLE;
-	spin_lock_irq(&current->sighand->siglock);
-	saveset = current->blocked;
-	siginitset(&current->blocked, mask);
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-	regs->gprs[2] = -EINTR;
-
-	while (1) {
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule();
-		if (do_signal(regs, &saveset))
-			return -EINTR;
-	}
-}
-
-asmlinkage int
-sys_rt_sigsuspend(struct pt_regs * regs,sigset_t *unewset, size_t sigsetsize)
-{
-	sigset_t saveset, newset;
-
-	/* 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);
-	saveset = current->blocked;
-	current->blocked = newset;
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-	regs->gprs[2] = -EINTR;
-
-	while (1) {
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule();
-		if (do_signal(regs, &saveset))
-			return -EINTR;
-	}
-}
-
-asmlinkage int 
-sys_sigaction(int sig, const struct old_sigaction *act,
-	      struct old_sigaction *oact)
-{
-	struct k_sigaction new_ka, old_ka;
-	int ret;
-
-	if (act) {
-		old_sigset_t mask;
-		if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
-		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
-		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
-			return -EFAULT;
-		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
-		__get_user(mask, &act->sa_mask);
-		siginitset(&new_ka.sa.sa_mask, mask);
-	}
-
-	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-	if (!ret && oact) {
-		if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
-		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
-		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
-			return -EFAULT;
-		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-	}
-
-	return ret;
-}
-
-asmlinkage int
-sys_sigaltstack(const stack_t *uss, stack_t *uoss, struct pt_regs *regs)
-{
-	return do_sigaltstack(uss, uoss, regs->gprs[15]);
-}
-
-
-
-/* Returns non-zero on fault */
-static int save_sigregs(struct pt_regs *regs, _sigregs *sregs)
-{
-	int err;
-  
-	err = __copy_to_user(&sregs->regs, regs, sizeof(_s390_regs_common));
-	if (err != 0)
-		return err;
-	save_fp_regs(&current->thread.fp_regs);
-	return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs,
-			      sizeof(s390_fp_regs));
-}
-
-/* Returns positive number on error */
-static int restore_sigregs(struct pt_regs *regs, _sigregs *sregs)
-{
-	int err;
-
-	err = __copy_from_user(regs, &sregs->regs, sizeof(_s390_regs_common));
-	regs->psw.mask = PSW_USER_BITS | (regs->psw.mask & PSW_MASK_CC);
-	if (err)
-		return err;
-
-	err = __copy_from_user(&current->thread.fp_regs, &sregs->fpregs,
-			       sizeof(s390_fp_regs));
-	current->thread.fp_regs.fpc &= FPC_VALID_MASK;
-	if (err)
-		return err;
-
-	restore_fp_regs(&current->thread.fp_regs);
-	regs->trap = -1;	/* disable syscall checks */
-	return 0;
-}
-
-asmlinkage long sys_sigreturn(struct pt_regs *regs)
-{
-	sigframe *frame = (sigframe *)regs->gprs[15];
-	sigset_t set;
-
-	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-		goto badframe;
-	if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE))
-		goto badframe;
-
-	sigdelsetmask(&set, ~_BLOCKABLE);
-	spin_lock_irq(&current->sighand->siglock);
-	current->blocked = set;
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-
-	if (restore_sigregs(regs, &frame->sregs))
-		goto badframe;
-
-	return regs->gprs[2];
-
-badframe:
-	force_sig(SIGSEGV, current);
-	return 0;
-}
-
-asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)
-{
-	rt_sigframe *frame = (rt_sigframe *)regs->gprs[15];
-	sigset_t set;
-
-	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-		goto badframe;
-	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
-		goto badframe;
-
-	sigdelsetmask(&set, ~_BLOCKABLE);
-	spin_lock_irq(&current->sighand->siglock);
-	current->blocked = set;
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-
-	if (restore_sigregs(regs, &frame->uc.uc_mcontext))
-		goto badframe;
-
-	/* It is more difficult to avoid calling this function than to
-	   call it and ignore errors.  */
-	do_sigaltstack(&frame->uc.uc_stack, NULL, regs->gprs[15]);
-	return regs->gprs[2];
-
-badframe:
-	force_sig(SIGSEGV, current);
-	return 0;
-}
-
-/*
- * Set up a signal frame.
- */
-
-
-/*
- * Determine which stack to use..
- */
-static inline void *
-get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
-{
-	unsigned long sp;
-
-	/* Default to using normal stack */
-	sp = regs->gprs[15];
-
-	/* This is the X/Open sanctioned signal stack switching.  */
-	if (ka->sa.sa_flags & SA_ONSTACK) {
-		if (! on_sig_stack(sp))
-			sp = current->sas_ss_sp + current->sas_ss_size;
-	}
-
-	/* This is the legacy signal stack switching. */
-	else if (!user_mode(regs) &&
-		 !(ka->sa.sa_flags & SA_RESTORER) &&
-		 ka->sa.sa_restorer) {
-		sp = (unsigned long) ka->sa.sa_restorer;
-	}
-
-	return (void *)((sp - frame_size) & -8ul);
-}
-
-static inline int map_signal(int sig)
-{
-	if (current_thread_info()->exec_domain
-	    && current_thread_info()->exec_domain->signal_invmap
-	    && sig < 32)
-		return current_thread_info()->exec_domain->signal_invmap[sig];
-	else
-		return sig;
-}
-
-static void setup_frame(int sig, struct k_sigaction *ka,
-			sigset_t *set, struct pt_regs * regs)
-{
-	sigframe *frame = get_sigframe(ka, regs, sizeof(sigframe));
-	if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe)))
-		goto give_sigsegv;
-
-	if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE))
-		goto give_sigsegv;
-
-	if (save_sigregs(regs, &frame->sregs))
-		goto give_sigsegv;
-	if (__put_user(&frame->sregs, &frame->sc.sregs))
-		goto give_sigsegv;
-
-	/* Set up to return from userspace.  If provided, use a stub
-	   already in userspace.  */
-	if (ka->sa.sa_flags & SA_RESTORER) {
-                regs->gprs[14] = (__u64) ka->sa.sa_restorer;
-	} else {
-                regs->gprs[14] = (__u64) frame->retcode;
-		if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, 
-	                       (u16 *)(frame->retcode)))
-			goto give_sigsegv;
-	}
-
-	/* Set up backchain. */
-	if (__put_user(regs->gprs[15], (addr_t *) frame))
-		goto give_sigsegv;
-
-	/* Set up registers for signal handler */
-	regs->gprs[15] = (__u64) frame;
-	regs->psw.addr = (__u64) ka->sa.sa_handler;
-	regs->psw.mask = PSW_USER_BITS;
-
-	regs->gprs[2] = map_signal(sig);
-	regs->gprs[3] = (__u64) &frame->sc;
-
-	/* We forgot to include these in the sigcontext.
-	   To avoid breaking binary compatibility, they are passed as args. */
-	regs->gprs[4] = current->thread.trap_no;
-	regs->gprs[5] = current->thread.prot_addr;
-	return;
-
-give_sigsegv:
-	if (sig == SIGSEGV)
-		ka->sa.sa_handler = SIG_DFL;
-	force_sig(SIGSEGV, current);
-}
-
-static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-			   sigset_t *set, struct pt_regs * regs)
-{
-	int err = 0;
-	rt_sigframe *frame = get_sigframe(ka, regs, sizeof(rt_sigframe));
-	if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe)))
-		goto give_sigsegv;
-
-	if (copy_siginfo_to_user(&frame->info, info))
-		goto give_sigsegv;
-
-	/* Create the ucontext.  */
-	err |= __put_user(0, &frame->uc.uc_flags);
-	err |= __put_user(0, &frame->uc.uc_link);
-	err |= __put_user((void*)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-	err |= __put_user(sas_ss_flags(regs->gprs[15]),
-			  &frame->uc.uc_stack.ss_flags);
-	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-	err |= save_sigregs(regs, &frame->uc.uc_mcontext);
-	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.  */
-	if (ka->sa.sa_flags & SA_RESTORER) {
-                regs->gprs[14] = (__u64) ka->sa.sa_restorer;
-	} else {
-                regs->gprs[14] = (__u64) frame->retcode;
-		err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, 
-	                          (u16 *)(frame->retcode));
-	}
-
-	/* Set up backchain. */
-	if (__put_user(regs->gprs[15], (addr_t *) frame))
-		goto give_sigsegv;
-
-	/* Set up registers for signal handler */
-	regs->gprs[15] = (__u64) frame;
-	regs->psw.addr = (__u64) ka->sa.sa_handler;
-	regs->psw.mask = PSW_USER_BITS;
-
-	regs->gprs[2] = map_signal(sig);
-	regs->gprs[3] = (__u64) &frame->info;
-	regs->gprs[4] = (__u64) &frame->uc;
-	return;
-
-give_sigsegv:
-	if (sig == SIGSEGV)
-		ka->sa.sa_handler = SIG_DFL;
-	force_sig(SIGSEGV, current);
-}
-
-/*
- * OK, we're invoking a handler
- */	
-
-static void
-handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset,
-	struct pt_regs * regs)
-{
-	struct k_sigaction *ka = &current->sighand->action[sig-1];
-
-	/* Are we from a system call? */
-	if (regs->trap == __LC_SVC_OLD_PSW) {
-		/* If so, check system call restarting.. */
-		switch (regs->gprs[2]) {
-			case -ERESTART_RESTARTBLOCK:
-				current_thread_info()->restart_block.fn =
-					do_no_restart_syscall;
-				clear_thread_flag(TIF_RESTART_SVC);
-			case -ERESTARTNOHAND:
-				regs->gprs[2] = -EINTR;
-				break;
-
-			case -ERESTARTSYS:
-				if (!(ka->sa.sa_flags & SA_RESTART)) {
-					regs->gprs[2] = -EINTR;
-					break;
-				}
-			/* fallthrough */
-			case -ERESTARTNOINTR:
-				regs->gprs[2] = regs->orig_gpr2;
-				regs->psw.addr -= 2;
-		}
-	}
-
-	/* Set up the stack frame */
-	if (ka->sa.sa_flags & SA_SIGINFO)
-		setup_rt_frame(sig, ka, info, oldset, regs);
-	else
-		setup_frame(sig, ka, oldset, regs);
-
-	if (ka->sa.sa_flags & SA_ONESHOT)
-		ka->sa.sa_handler = SIG_DFL;
-
-	if (!(ka->sa.sa_flags & SA_NODEFER)) {
-		spin_lock_irq(&current->sighand->siglock);
-		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-		sigaddset(&current->blocked,sig);
-		recalc_sigpending();
-		spin_unlock_irq(&current->sighand->siglock);
-	}
-}
-
-/*
- * Note that 'init' is a special process: it doesn't get signals it doesn't
- * want to handle. Thus you cannot kill init even with a SIGKILL even by
- * mistake.
- *
- * Note that we go through the signals twice: once to check the signals that
- * the kernel can handle, and then we build all the user-level signal handling
- * stack-frames in one go after that.
- */
-int do_signal(struct pt_regs *regs, sigset_t *oldset)
-{
-	siginfo_t info;
-	int signr;
-
-	/*
-	 * We want the common case to go fast, which
-	 * is why we may in certain cases get here from
-	 * kernel mode. Just return without doing anything
-	 * if so.
-	 */
-	if (!user_mode(regs))
-		return 1;
-
-	if (!oldset)
-		oldset = &current->blocked;
-#ifdef CONFIG_S390_SUPPORT 
-	if (test_thread_flag(TIF_31BIT)) {
-		extern asmlinkage int do_signal32(struct pt_regs *regs, sigset_t *oldset); 
-		return do_signal32(regs, oldset);
-        }
-#endif 
-
-	signr = get_signal_to_deliver(&info, regs, NULL);
-	if (signr > 0) {
-		/* Whee!  Actually deliver the signal.  */
-		handle_signal(signr, &info, oldset, regs);
-		return 1;
-	}
-
-	/* Did we come from a system call? */
-	if ( regs->trap == __LC_SVC_OLD_PSW /* System Call! */ ) {
-		/* Restart the system call - no handlers present */
-		if (regs->gprs[2] == -ERESTARTNOHAND ||
-		    regs->gprs[2] == -ERESTARTSYS ||
-		    regs->gprs[2] == -ERESTARTNOINTR) {
-			regs->gprs[2] = regs->orig_gpr2;
-			regs->psw.addr -= 2;
-		}
-		/* Restart the system call with a new system call number */
-		if (regs->gprs[2] == -ERESTART_RESTARTBLOCK) {
-			regs->gprs[2] = __NR_restart_syscall;
-			set_thread_flag(TIF_RESTART_SVC);
-		}
-	}
-	return 0;
-}
diff -Nru a/arch/s390x/kernel/signal32.c b/arch/s390x/kernel/signal32.c
--- a/arch/s390x/kernel/signal32.c	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,643 +0,0 @@
-/*
- *  arch/s390/kernel/signal32.c
- *
- *  S390 version
- *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- *               Gerhard Tonn (ton@de.ibm.com)                  
- *
- *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- *  1997-11-28  Modified for POSIX.1b signals by Richard Henderson
- */
-
-#include <linux/config.h>
-#include <linux/compat.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/kernel.h>
-#include <linux/signal.h>
-#include <linux/errno.h>
-#include <linux/wait.h>
-#include <linux/ptrace.h>
-#include <linux/unistd.h>
-#include <linux/stddef.h>
-#include <linux/tty.h>
-#include <linux/personality.h>
-#include <linux/binfmts.h>
-#include <asm/ucontext.h>
-#include <asm/uaccess.h>
-#include "linux32.h"
-#include "ptrace32.h"
-
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-
-typedef struct 
-{
-	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
-	struct sigcontext32 sc;
-	_sigregs32 sregs;
-	__u8 retcode[S390_SYSCALL_SIZE];
-} sigframe32;
-
-typedef struct 
-{
-	__u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
-	__u8 retcode[S390_SYSCALL_SIZE];
-	struct siginfo32 info;
-	struct ucontext32 uc;
-} rt_sigframe32;
-
-asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
-
-int do_signal32(struct pt_regs *regs, sigset_t *oldset);
-
-int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from)
-{
-	int err;
-
-	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
-		return -EFAULT;
-
-	/* 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.  
-	   This routine must convert siginfo from 64bit to 32bit as well
-	   at the same time.  */
-	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);
-	if (from->si_code < 0)
-		err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
-	else {
-		switch (from->si_code >> 16) {
-		case __SI_KILL >> 16:
-			err |= __put_user(from->si_pid, &to->si_pid);
-			err |= __put_user(from->si_uid, &to->si_uid);
-			break;
-		case __SI_CHLD >> 16:
-			err |= __put_user(from->si_pid, &to->si_pid);
-			err |= __put_user(from->si_uid, &to->si_uid);
-			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);
-			break;
-		case __SI_FAULT >> 16:
-			err |= __put_user((unsigned long) from->si_addr,
-					  &to->si_addr);
-			break;
-		case __SI_POLL >> 16:
-		case __SI_TIMER >> 16:
-			err |= __put_user(from->si_band, &to->si_band);
-			err |= __put_user(from->si_fd, &to->si_fd);
-			break;
-		default:
-			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.
- */
-asmlinkage int
-sys32_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask)
-{
-	sigset_t saveset;
-
-	mask &= _BLOCKABLE;
-	spin_lock_irq(&current->sighand->siglock);
-	saveset = current->blocked;
-	siginitset(&current->blocked, mask);
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-	regs->gprs[2] = -EINTR;
-
-	while (1) {
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule();
-		if (do_signal32(regs, &saveset))
-			return -EINTR;
-	}
-}
-
-asmlinkage int
-sys32_rt_sigsuspend(struct pt_regs * regs,compat_sigset_t *unewset, size_t sigsetsize)
-{
-	sigset_t saveset, newset;
-	compat_sigset_t set32;
-
-	/* XXX: Don't preclude handling different sized sigset_t's.  */
-	if (sigsetsize != sizeof(sigset_t))
-		return -EINVAL;
-
-	if (copy_from_user(&set32, unewset, sizeof(set32)))
-		return -EFAULT;
-	switch (_NSIG_WORDS) {
-	case 4: newset.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
-	case 3: newset.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
-	case 2: newset.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
-	case 1: newset.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
-	}
-        sigdelsetmask(&newset, ~_BLOCKABLE);
-
-        spin_lock_irq(&current->sighand->siglock);
-        saveset = current->blocked;
-        current->blocked = newset;
-        recalc_sigpending();
-        spin_unlock_irq(&current->sighand->siglock);
-        regs->gprs[2] = -EINTR;
-
-        while (1) {
-                set_current_state(TASK_INTERRUPTIBLE);
-                schedule();
-                if (do_signal32(regs, &saveset))
-                        return -EINTR;
-        }
-}                                                         
-
-asmlinkage int
-sys32_sigaction(int sig, const struct old_sigaction32 *act,
-		 struct old_sigaction32 *oact)
-{
-        struct k_sigaction new_ka, old_ka;
-        int ret;
-
-        if (act) {
-		compat_old_sigset_t mask;
-		if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
-		    __get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler) ||
-		    __get_user((unsigned long)new_ka.sa.sa_restorer, &act->sa_restorer))
-			return -EFAULT;
-		__get_user(new_ka.sa.sa_flags, &act->sa_flags);
-		__get_user(mask, &act->sa_mask);
-		siginitset(&new_ka.sa.sa_mask, mask);
-        }
-
-        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-	if (!ret && oact) {
-		if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
-		    __put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler) ||
-		    __put_user((unsigned long)old_ka.sa.sa_restorer, &oact->sa_restorer))
-			return -EFAULT;
-		__put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-		__put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-        }
-
-	return ret;
-}
-
-int
-do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact);
-
-asmlinkage long 
-sys32_rt_sigaction(int sig, const struct sigaction32 *act,
-	   struct sigaction32 *oact,  size_t sigsetsize)
-{
-	struct k_sigaction new_ka, old_ka;
-	int ret;
-	compat_sigset_t set32;
-
-	/* XXX: Don't preclude handling different sized sigset_t's.  */
-	if (sigsetsize != sizeof(compat_sigset_t))
-		return -EINVAL;
-
-	if (act) {
-		ret = get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler);
-		ret |= __copy_from_user(&set32, &act->sa_mask,
-					sizeof(compat_sigset_t));
-		switch (_NSIG_WORDS) {
-		case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
-				| (((long)set32.sig[7]) << 32);
-		case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
-				| (((long)set32.sig[5]) << 32);
-		case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
-				| (((long)set32.sig[3]) << 32);
-		case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
-				| (((long)set32.sig[1]) << 32);
-		}
-		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-		
-		if (ret)
-			return -EFAULT;
-	}
-
-	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-
-	if (!ret && oact) {
-		switch (_NSIG_WORDS) {
-		case 4:
-			set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
-			set32.sig[6] = old_ka.sa.sa_mask.sig[3];
-		case 3:
-			set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
-			set32.sig[4] = old_ka.sa.sa_mask.sig[2];
-		case 2:
-			set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
-			set32.sig[2] = old_ka.sa.sa_mask.sig[1];
-		case 1:
-			set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
-			set32.sig[0] = old_ka.sa.sa_mask.sig[0];
-		}
-		ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
-		ret |= __copy_to_user(&oact->sa_mask, &set32,
-				      sizeof(compat_sigset_t));
-		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-	}
-
-	return ret;
-}
-
-asmlinkage int
-sys32_sigaltstack(const stack_t32 *uss, stack_t32 *uoss, struct pt_regs *regs)
-{
-	stack_t kss, koss;
-	int ret, err = 0;
-	mm_segment_t old_fs = get_fs();
-
-	if (uss) {
-		if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
-			return -EFAULT;
-		err |= __get_user((unsigned long) kss.ss_sp, &uss->ss_sp);
-		err |= __get_user(kss.ss_size, &uss->ss_size);
-		err |= __get_user(kss.ss_flags, &uss->ss_flags);
-		if (err)
-			return -EFAULT;
-	}
-
-	set_fs (KERNEL_DS);
-	ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, regs->gprs[15]);
-	set_fs (old_fs);
-
-	if (!ret && uoss) {
-		if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
-			return -EFAULT;
-		err |= __put_user((unsigned long) koss.ss_sp, &uoss->ss_sp);
-		err |= __put_user(koss.ss_size, &uoss->ss_size);
-		err |= __put_user(koss.ss_flags, &uoss->ss_flags);
-		if (err)
-			return -EFAULT;
-	}
-	return ret;
-}
-
-static int save_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
-{
-	_s390_regs_common32 regs32;
-	int err, i;
-
-	regs32.psw.mask = PSW32_USER_BITS |
-		((__u32)(regs->psw.mask >> 32) & PSW32_MASK_CC);
-	regs32.psw.addr = PSW32_ADDR_AMODE31 | (__u32) regs->psw.addr;
-	for (i = 0; i < NUM_GPRS; i++)
-		regs32.gprs[i] = (__u32) regs->gprs[i];
-	memcpy(regs32.acrs, regs->acrs, sizeof(regs32.acrs));
-	err = __copy_to_user(&sregs->regs, &regs32, sizeof(regs32));
-	if (err)
-		return err;
-	save_fp_regs(&current->thread.fp_regs);
-	/* s390_fp_regs and _s390_fp_regs32 are the same ! */
-	return __copy_to_user(&sregs->fpregs, &current->thread.fp_regs,
-			      sizeof(_s390_fp_regs32));
-}
-
-static int restore_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
-{
-	_s390_regs_common32 regs32;
-	int err, i;
-
-	err = __copy_from_user(&regs32, &sregs->regs, sizeof(regs32));
-	if (err)
-		return err;
-	regs->psw.mask = PSW_USER32_BITS |
-		(__u64)(regs32.psw.mask & PSW32_MASK_CC) << 32;
-	regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
-	for (i = 0; i < NUM_GPRS; i++)
-		regs->gprs[i] = (__u64) regs32.gprs[i];
-	memcpy(regs->acrs, regs32.acrs, sizeof(regs32.acrs));
-
-	err = __copy_from_user(&current->thread.fp_regs, &sregs->fpregs,
-			       sizeof(_s390_fp_regs32));
-	current->thread.fp_regs.fpc &= FPC_VALID_MASK;
-	if (err)
-		return err;
-
-	restore_fp_regs(&current->thread.fp_regs);
-	regs->trap = -1;	/* disable syscall checks */
-	return 0;
-}
-
-asmlinkage long sys32_sigreturn(struct pt_regs *regs)
-{
-	sigframe32 *frame = (sigframe32 *)regs->gprs[15];
-	sigset_t set;
-
-	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-		goto badframe;
-	if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
-		goto badframe;
-
-	sigdelsetmask(&set, ~_BLOCKABLE);
-	spin_lock_irq(&current->sighand->siglock);
-	current->blocked = set;
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-
-	if (restore_sigregs32(regs, &frame->sregs))
-		goto badframe;
-
-	return regs->gprs[2];
-
-badframe:
-	force_sig(SIGSEGV, current);
-	return 0;
-}	
-
-asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
-{
-	rt_sigframe32 *frame = (rt_sigframe32 *)regs->gprs[15];
-	sigset_t set;
-	stack_t st;
-	__u32 ss_sp;
-	int err;
-	mm_segment_t old_fs = get_fs();
-
-	if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
-		goto badframe;
-	if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
-		goto badframe;
-
-	sigdelsetmask(&set, ~_BLOCKABLE);
-	spin_lock_irq(&current->sighand->siglock);
-	current->blocked = set;
-	recalc_sigpending();
-	spin_unlock_irq(&current->sighand->siglock);
-
-	if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
-		goto badframe;
-
-	err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
-	st.ss_sp = (void *) A((unsigned long)ss_sp);
-	err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
-	err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
-	if (err)
-		goto badframe; 
-
-	/* It is more difficult to avoid calling this function than to
-	   call it and ignore errors.  */
-	set_fs (KERNEL_DS);   
-	do_sigaltstack(&st, NULL, regs->gprs[15]);
-	set_fs (old_fs);
-
-	return regs->gprs[2];
-
-badframe:
-        force_sig(SIGSEGV, current);
-        return 0;
-}	
-
-/*
- * Set up a signal frame.
- */
-
-
-/*
- * Determine which stack to use..
- */
-static inline void *
-get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
-{
-	unsigned long sp;
-
-	/* Default to using normal stack */
-	sp = (unsigned long) A(regs->gprs[15]);
-
-	/* This is the X/Open sanctioned signal stack switching.  */
-	if (ka->sa.sa_flags & SA_ONSTACK) {
-		if (! on_sig_stack(sp))
-			sp = current->sas_ss_sp + current->sas_ss_size;
-	}
-
-	/* This is the legacy signal stack switching. */
-	else if (!user_mode(regs) &&
-		 !(ka->sa.sa_flags & SA_RESTORER) &&
-		 ka->sa.sa_restorer) {
-		sp = (unsigned long) ka->sa.sa_restorer;
-	}
-
-	return (void *)((sp - frame_size) & -8ul);
-}
-
-static inline int map_signal(int sig)
-{
-	if (current_thread_info()->exec_domain
-	    && current_thread_info()->exec_domain->signal_invmap
-	    && sig < 32)
-		return current_thread_info()->exec_domain->signal_invmap[sig];
-        else
-		return sig;
-}
-
-static void setup_frame32(int sig, struct k_sigaction *ka,
-			sigset_t *set, struct pt_regs * regs)
-{
-	sigframe32 *frame = get_sigframe(ka, regs, sizeof(sigframe32));
-	if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
-		goto give_sigsegv;
-
-	if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
-		goto give_sigsegv;
-
-	if (save_sigregs32(regs, &frame->sregs))
-		goto give_sigsegv;
-	if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
-		goto give_sigsegv;
-
-	/* Set up to return from userspace.  If provided, use a stub
-	   already in userspace.  */
-	if (ka->sa.sa_flags & SA_RESTORER) {
-		regs->gprs[14] = (__u64) ka->sa.sa_restorer;
-	} else {
-		regs->gprs[14] = (__u64) frame->retcode;
-		if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
-		               (u16 *)(frame->retcode)))
-			goto give_sigsegv;
-        }
-
-	/* Set up backchain. */
-	if (__put_user(regs->gprs[15], (unsigned int *) frame))
-		goto give_sigsegv;
-
-	/* Set up registers for signal handler */
-	regs->gprs[15] = (__u64) frame;
-	regs->psw.addr = (__u64) ka->sa.sa_handler;
-	regs->psw.mask = PSW_USER32_BITS;
-
-	regs->gprs[2] = map_signal(sig);
-	regs->gprs[3] = (__u64) &frame->sc;
-
-	/* We forgot to include these in the sigcontext.
-	   To avoid breaking binary compatibility, they are passed as args. */
-	regs->gprs[4] = current->thread.trap_no;
-	regs->gprs[5] = current->thread.prot_addr;
-	return;
-
-give_sigsegv:
-	if (sig == SIGSEGV)
-		ka->sa.sa_handler = SIG_DFL;
-	force_sig(SIGSEGV, current);
-}
-
-static void setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
-			   sigset_t *set, struct pt_regs * regs)
-{
-	int err = 0;
-	rt_sigframe32 *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
-	if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
-		goto give_sigsegv;
-
-	if (copy_siginfo_to_user32(&frame->info, info))
-		goto give_sigsegv;
-
-	/* Create the ucontext.  */
-	err |= __put_user(0, &frame->uc.uc_flags);
-	err |= __put_user(0, &frame->uc.uc_link);
-	err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
-	err |= __put_user(sas_ss_flags(regs->gprs[15]),
-	                  &frame->uc.uc_stack.ss_flags);
-	err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-	err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
-	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.  */
-	if (ka->sa.sa_flags & SA_RESTORER) {
-		regs->gprs[14] = (__u64) ka->sa.sa_restorer;
-	} else {
-		regs->gprs[14] = (__u64) frame->retcode;
-		err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
-		                  (u16 *)(frame->retcode));
-	}
-
-	/* Set up backchain. */
-	if (__put_user(regs->gprs[15], (unsigned int *) frame))
-		goto give_sigsegv;
-
-	/* Set up registers for signal handler */
-	regs->gprs[15] = (__u64) frame;
-	regs->psw.addr = (__u64) ka->sa.sa_handler;
-	regs->psw.mask = PSW_USER32_BITS;
-
-	regs->gprs[2] = map_signal(sig);
-	regs->gprs[3] = (__u64) &frame->info;
-	regs->gprs[4] = (__u64) &frame->uc;
-	return;
-
-give_sigsegv:
-	if (sig == SIGSEGV)
-		ka->sa.sa_handler = SIG_DFL;
-	force_sig(SIGSEGV, current);
-}
-
-/*
- * OK, we're invoking a handler
- */	
-
-static void
-handle_signal32(unsigned long sig, siginfo_t *info, sigset_t *oldset,
-	struct pt_regs * regs)
-{
-	struct k_sigaction *ka = &current->sighand->action[sig-1];
-
-	/* Are we from a system call? */
-	if (regs->trap == __LC_SVC_OLD_PSW) {
-		/* If so, check system call restarting.. */
-		switch (regs->gprs[2]) {
-			case -ERESTARTNOHAND:
-				regs->gprs[2] = -EINTR;
-				break;
-
-			case -ERESTARTSYS:
-				if (!(ka->sa.sa_flags & SA_RESTART)) {
-					regs->gprs[2] = -EINTR;
-					break;
-				}
-			/* fallthrough */
-			case -ERESTARTNOINTR:
-				regs->gprs[2] = regs->orig_gpr2;
-				regs->psw.addr -= 2;
-		}
-	}
-
-	/* Set up the stack frame */
-	if (ka->sa.sa_flags & SA_SIGINFO)
-		setup_rt_frame32(sig, ka, info, oldset, regs);
-	else
-		setup_frame32(sig, ka, oldset, regs);
-
-	if (ka->sa.sa_flags & SA_ONESHOT)
-		ka->sa.sa_handler = SIG_DFL;
-
-	if (!(ka->sa.sa_flags & SA_NODEFER)) {
-		spin_lock_irq(&current->sighand->siglock);
-		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
-		sigaddset(&current->blocked,sig);
-		recalc_sigpending();
-		spin_unlock_irq(&current->sighand->siglock);
-	}
-}
-
-/*
- * Note that 'init' is a special process: it doesn't get signals it doesn't
- * want to handle. Thus you cannot kill init even with a SIGKILL even by
- * mistake.
- *
- * Note that we go through the signals twice: once to check the signals that
- * the kernel can handle, and then we build all the user-level signal handling
- * stack-frames in one go after that.
- */
-int do_signal32(struct pt_regs *regs, sigset_t *oldset)
-{
-	siginfo_t info;
-	int signr;
-
-	/*
-	 * We want the common case to go fast, which
-	 * is why we may in certain cases get here from
-	 * kernel mode. Just return without doing anything
-	 * if so.
-	 */
-	if (!user_mode(regs))
-		return 1;
-
-	if (!oldset)
-		oldset = &current->blocked;
-
-	signr = get_signal_to_deliver(&info, regs, NULL);
-	if (signr > 0) {
-		/* Whee!  Actually deliver the signal.  */
-		handle_signal32(signr, &info, oldset, regs);
-		return 1;
-	}
-
-	/* Did we come from a system call? */
-	if ( regs->trap == __LC_SVC_OLD_PSW /* System Call! */ ) {
-		/* Restart the system call - no handlers present */
-		if (regs->gprs[2] == -ERESTARTNOHAND ||
-		    regs->gprs[2] == -ERESTARTSYS ||
-		    regs->gprs[2] == -ERESTARTNOINTR) {
-			regs->gprs[2] = regs->orig_gpr2;
-			regs->psw.addr -= 2;
-		}
-	}
-	return 0;
-}
diff -Nru a/arch/s390x/kernel/smp.c b/arch/s390x/kernel/smp.c
--- a/arch/s390x/kernel/smp.c	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,582 +0,0 @@
-/*
- *  arch/s390/kernel/smp.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  based on other smp stuff by 
- *    (c) 1995 Alan Cox, CymruNET Ltd  <alan@cymru.net>
- *    (c) 1998 Ingo Molnar
- *
- * We work with logical cpu numbering everywhere we can. The only
- * functions using the real cpu address (got from STAP) are the sigp
- * functions. For all other functions we use the identity mapping.
- * That means that cpu_number_map[i] == i for every cpu. cpu_number_map is
- * used e.g. to find the idle task belonging to a logical cpu. Every array
- * in the kernel is sorted by the logical cpu number and not by the physical
- * one which is causing all the confusion with __cpu_logical_map and
- * cpu_number_map in other architectures.
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include <linux/mm.h>
-#include <linux/spinlock.h>
-#include <linux/kernel_stat.h>
-#include <linux/smp_lock.h>
-
-#include <linux/delay.h>
-#include <linux/cache.h>
-
-#include <asm/sigp.h>
-#include <asm/pgalloc.h>
-#include <asm/irq.h>
-#include <asm/s390_ext.h>
-#include <asm/cpcmd.h>
-
-/* prototypes */
-extern int cpu_idle(void * unused);
-
-extern volatile int __cpu_logical_map[];
-
-/*
- * An array with a pointer the lowcore of every CPU.
- */
-
-struct _lowcore *lowcore_ptr[NR_CPUS];
-cycles_t         cacheflush_time=0;
-int              smp_threads_ready=0;      /* Set when the idlers are all forked. */
-
-volatile unsigned long cpu_online_map;
-volatile unsigned long cpu_possible_map;
-unsigned long    cache_decay_ticks = 0;
-
-/*
- * Reboot, halt and power_off routines for SMP.
- */
-extern char vmhalt_cmd[];
-extern char vmpoff_cmd[];
-
-extern void do_reipl(unsigned long devno);
-
-static sigp_ccode smp_ext_bitcall(int, ec_bit_sig);
-static void smp_ext_bitcall_others(ec_bit_sig);
-
-/*
- * Structure and data for smp_call_function(). This is designed to minimise
- * static memory requirements. It also looks cleaner.
- */
-static spinlock_t call_lock = SPIN_LOCK_UNLOCKED;
-
-struct call_data_struct {
-	void (*func) (void *info);
-	void *info;
-	atomic_t started;
-	atomic_t finished;
-	int wait;
-};
-
-static struct call_data_struct * call_data;
-
-/*
- * 'Call function' interrupt callback
- */
-static void do_call_function(void)
-{
-	void (*func) (void *info) = call_data->func;
-	void *info = call_data->info;
-	int wait = call_data->wait;
-
-	atomic_inc(&call_data->started);
-	(*func)(info);
-	if (wait)
-		atomic_inc(&call_data->finished);
-}
-
-/*
- * this function sends a 'generic call function' IPI to all other CPUs
- * in the system.
- */
-
-int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
-			int wait)
-/*
- * [SUMMARY] Run a function on all other CPUs.
- * <func> The function to run. This must be fast and non-blocking.
- * <info> An arbitrary pointer to pass to the function.
- * <nonatomic> currently unused.
- * <wait> If true, wait (atomically) until function has completed on other CPUs.
- * [RETURNS] 0 on success, else a negative status code. Does not return until
- * remote CPUs are nearly ready to execute <<func>> or are or have executed.
- *
- * You must not call this function with disabled interrupts or from a
- * hardware interrupt handler or from a bottom half handler.
- */
-{
-	struct call_data_struct data;
-	int cpus = num_online_cpus()-1;
-
-	/* FIXME: get cpu lock -hc */
-	if (cpus <= 0)
-		return 0;
-
-	data.func = func;
-	data.info = info;
-	atomic_set(&data.started, 0);
-	data.wait = wait;
-	if (wait)
-		atomic_set(&data.finished, 0);
-
-	spin_lock(&call_lock);
-	call_data = &data;
-	/* Send a message to all other CPUs and wait for them to respond */
-        smp_ext_bitcall_others(ec_call_function);
-
-	/* Wait for response */
-	while (atomic_read(&data.started) != cpus)
-		barrier();
-
-	if (wait)
-		while (atomic_read(&data.finished) != cpus)
-			barrier();
-	spin_unlock(&call_lock);
-
-	return 0;
-}
-
-static inline void do_send_stop(void)
-{
-        u32 dummy;
-        int i, rc;
-
-        /* stop all processors */
-        for (i =  0; i < NR_CPUS; i++) {
-                if (!cpu_online(i) || smp_processor_id() == i)
-			continue;
-		do {
-			rc = signal_processor_ps(&dummy, 0, i, sigp_stop);
-		} while (rc == sigp_busy);
-        }
-}
-
-static inline void do_store_status(void)
-{
-        unsigned long low_core_addr;
-        u32 dummy;
-        int i, rc;
-
-        /* store status of all processors in their lowcores (real 0) */
-        for (i =  0; i < NR_CPUS; i++) {
-                if (!cpu_online(i) || smp_processor_id() == i) 
-			continue;
-		low_core_addr = (unsigned long) lowcore_ptr[i];
-		do {
-			rc = signal_processor_ps(&dummy, low_core_addr, i,
-						 sigp_store_status_at_address);
-		} while(rc == sigp_busy);
-	}
-}
-
-/*
- * this function sends a 'stop' sigp to all other CPUs in the system.
- * it goes straight through.
- */
-void smp_send_stop(void)
-{
-	/* write magic number to zero page (absolute 0) */
-	lowcore_ptr[smp_processor_id()]->panic_magic = __PANIC_MAGIC;
-
-	/* stop other processors. */
-	do_send_stop();
-
-	/* store status of other processors. */
-	do_store_status();
-}
-
-/*
- * Reboot, halt and power_off routines for SMP.
- */
-static volatile unsigned long cpu_restart_map;
-
-static void do_machine_restart(void * __unused)
-{
-	clear_bit(smp_processor_id(), &cpu_restart_map);
-	if (smp_processor_id() == 0) {
-		/* Wait for all other cpus to enter do_machine_restart. */
-		while (cpu_restart_map != 0);
-		/* Store status of other cpus. */
-		do_store_status();
-		/*
-		 * Finally call reipl. Because we waited for all other
-		 * cpus to enter this function we know that they do
-		 * not hold any s390irq-locks (the cpus have been
-		 * interrupted by an external interrupt and s390irq
-		 * locks are always held disabled).
-		 */
-		if (MACHINE_IS_VM)
-			cpcmd ("IPL", NULL, 0);
-		else
-			do_reipl (0x10000 | S390_lowcore.ipl_device);
-	}
-	signal_processor(smp_processor_id(), sigp_stop);
-}
-
-void machine_restart_smp(char * __unused) 
-{
-	cpu_restart_map = cpu_online_map;
-        on_each_cpu(do_machine_restart, NULL, 0, 0);
-}
-
-static void do_machine_halt(void * __unused)
-{
-	if (smp_processor_id() == 0) {
-		smp_send_stop();
-		if (MACHINE_IS_VM && strlen(vmhalt_cmd) > 0)
-			cpcmd(vmhalt_cmd, NULL, 0);
-		signal_processor(smp_processor_id(),
-				 sigp_stop_and_store_status);
-	}
-	for (;;)
-		enabled_wait();
-}
-
-void machine_halt_smp(void)
-{
-        on_each_cpu(do_machine_halt, NULL, 0, 0);
-}
-
-static void do_machine_power_off(void * __unused)
-{
-	if (smp_processor_id() == 0) {
-		smp_send_stop();
-		if (MACHINE_IS_VM && strlen(vmpoff_cmd) > 0)
-			cpcmd(vmpoff_cmd, NULL, 0);
-		signal_processor(smp_processor_id(),
-				 sigp_stop_and_store_status);
-	}
-	for (;;)
-		enabled_wait();
-}
-
-void machine_power_off_smp(void)
-{
-        on_each_cpu(do_machine_power_off, NULL, 0, 0);
-}
-
-/*
- * This is the main routine where commands issued by other
- * cpus are handled.
- */
-
-void do_ext_call_interrupt(struct pt_regs *regs, __u16 code)
-{
-        unsigned long bits;
-
-        /*
-         * handle bit signal external calls
-         *
-         * For the ec_schedule signal we have to do nothing. All the work
-         * is done automatically when we return from the interrupt.
-         */
-	bits = xchg(&S390_lowcore.ext_call_fast, 0);
-
-        if (test_bit(ec_call_function, &bits))
-		do_call_function();
-}
-
-/*
- * Send an external call sigp to another cpu and return without waiting
- * for its completion.
- */
-static sigp_ccode smp_ext_bitcall(int cpu, ec_bit_sig sig)
-{
-        sigp_ccode ccode;
-
-        /*
-         * Set signaling bit in lowcore of target cpu and kick it
-         */
-	set_bit(sig, &lowcore_ptr[cpu]->ext_call_fast);
-        ccode = signal_processor(cpu, sigp_external_call);
-        return ccode;
-}
-
-/*
- * Send an external call sigp to every other cpu in the system and
- * return without waiting for its completion.
- */
-static void smp_ext_bitcall_others(ec_bit_sig sig)
-{
-        int i;
-
-        for (i = 0; i < NR_CPUS; i++) {
-                if (!cpu_online(i) || smp_processor_id() == i)
-                        continue;
-                /*
-                 * Set signaling bit in lowcore of target cpu and kick it
-                 */
-		set_bit(sig, &lowcore_ptr[i]->ext_call_fast);
-                while (signal_processor(i, sigp_external_call) == sigp_busy)
-			udelay(10);
-        }
-}
-
-/*
- * this function sends a 'reschedule' IPI to another CPU.
- * it goes straight through and wastes no time serializing
- * anything. Worst case is that we lose a reschedule ...
- */
-
-void smp_send_reschedule(int cpu)
-{
-        smp_ext_bitcall(cpu, ec_schedule);
-}
-
-/*
- * parameter area for the set/clear control bit callbacks
- */
-typedef struct
-{
-	__u16 start_ctl;
-	__u16 end_ctl;
-	__u64 orvals[16];
-	__u64 andvals[16];
-} ec_creg_mask_parms;
-
-/*
- * callback for setting/clearing control bits
- */
-void smp_ctl_bit_callback(void *info) {
-	ec_creg_mask_parms *pp;
-	u64 cregs[16];
-	int i;
-	
-	pp = (ec_creg_mask_parms *) info;
-	asm volatile ("   bras  1,0f\n"
-		      "   stctg 0,0,0(%0)\n"
-		      "0: ex    %1,0(1)\n"
-		      : : "a" (cregs+pp->start_ctl),
-		          "a" ((pp->start_ctl<<4) + pp->end_ctl)
-		      : "memory", "1" );
-	for (i = pp->start_ctl; i <= pp->end_ctl; i++)
-		cregs[i] = (cregs[i] & pp->andvals[i]) | pp->orvals[i];
-	asm volatile ("   bras  1,0f\n"
-		      "   lctlg 0,0,0(%0)\n"
-		      "0: ex    %1,0(1)\n"
-		      : : "a" (cregs+pp->start_ctl),
-		          "a" ((pp->start_ctl<<4) + pp->end_ctl)
-		      : "memory", "1" );
-}
-
-/*
- * Set a bit in a control register of all cpus
- */
-void smp_ctl_set_bit(int cr, int bit) {
-        ec_creg_mask_parms parms;
-
-	parms.start_ctl = cr;
-	parms.end_ctl = cr;
-	parms.orvals[cr] = 1 << bit;
-	parms.andvals[cr] = -1L;
-	preempt_disable();
-	smp_call_function(smp_ctl_bit_callback, &parms, 0, 1);
-        __ctl_set_bit(cr, bit);
-	preempt_enable();
-}
-
-/*
- * Clear a bit in a control register of all cpus
- */
-void smp_ctl_clear_bit(int cr, int bit) {
-        ec_creg_mask_parms parms;
-
-	parms.start_ctl = cr;
-	parms.end_ctl = cr;
-	parms.orvals[cr] = 0;
-	parms.andvals[cr] = ~(1L << bit);
-	preempt_disable();
-	smp_call_function(smp_ctl_bit_callback, &parms, 0, 1);
-        __ctl_clear_bit(cr, bit);
-	preempt_enable();
-}
-
-
-/*
- * Lets check how many CPUs we have.
- */
-
-void __init smp_check_cpus(unsigned int max_cpus)
-{
-        int curr_cpu, num_cpus;
-	__u16 boot_cpu_addr;
-
-	boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr;
-        current_thread_info()->cpu = 0;
-        num_cpus = 1;
-	cpu_possible_map = 1;
-        cpu_online_map = 1;
-        for (curr_cpu = 0;
-             curr_cpu <= 65535 && num_cpus < max_cpus; curr_cpu++) {
-                if ((__u16) curr_cpu == boot_cpu_addr)
-                        continue;
-                __cpu_logical_map[num_cpus] = (__u16) curr_cpu;
-                if (signal_processor(num_cpus, sigp_sense) ==
-                    sigp_not_operational)
-                        continue;
-		set_bit(num_cpus, &cpu_possible_map);
-                num_cpus++;
-        }
-        printk("Detected %d CPU's\n",(int) num_cpus);
-        printk("Boot cpu address %2X\n", boot_cpu_addr);
-}
-
-
-/*
- *      Activate a secondary processor.
- */
-extern void init_cpu_timer(void);
-extern int pfault_init(void);
-
-int __devinit start_secondary(void *cpuvoid)
-{
-        /* Setup the cpu */
-        cpu_init();
-        /* init per CPU timer */
-        init_cpu_timer();
-#ifdef CONFIG_PFAULT
-	/* Enable pfault pseudo page faults on this cpu. */
-	pfault_init();
-#endif
-	/* Mark this cpu as online. */
-	set_bit(smp_processor_id(), &cpu_online_map);
-	/* Switch on interrupts */
-	local_irq_enable();
-        /* Print info about this processor */
-        print_cpu_info(&S390_lowcore.cpu_data);
-        /* cpu_idle will call schedule for us */
-        return cpu_idle(NULL);
-}
-
-static struct task_struct * __devinit fork_by_hand(void)
-{
-       struct pt_regs regs;
-       /* don't care about the psw and regs settings since we'll never
-          reschedule the forked task. */
-       memset(&regs,0,sizeof(struct pt_regs));
-       return do_fork(CLONE_VM|CLONE_IDLETASK, 0, &regs, 0, NULL, NULL);
-}
-
-int __cpu_up(unsigned int cpu)
-{
-        struct task_struct *idle;
-        struct _lowcore    *cpu_lowcore;
-	sigp_ccode          ccode;
-
-	/*
-	 * Set prefix page for new cpu
-	 */
-
-	ccode = signal_processor_p((u64) lowcore_ptr[cpu],
-				   cpu, sigp_set_prefix);
-	if(ccode){
-		printk("sigp_set_prefix failed for cpu %d "
-		       "with condition code %d\n",
-		       (int) cpu, (int) ccode);
-		return -EIO;
-	}
-
-        /* We can't use kernel_thread since we must _avoid_ to reschedule
-           the child. */
-        idle = fork_by_hand();
-	if (IS_ERR(idle)){
-                printk("failed fork for CPU %d", cpu);
-		return -EIO;
-	}
-
-        /*
-         * We remove it from the pidhash and the runqueue
-         * once we got the process:
-         */
-	init_idle(idle, cpu);
-
-        unhash_process(idle);
-
-        cpu_lowcore = lowcore_ptr[cpu];
-	cpu_lowcore->save_area[15] = idle->thread.ksp;
-	cpu_lowcore->kernel_stack = (__u64) idle->thread_info + (4*PAGE_SIZE);
-        __asm__ __volatile__("la    1,%0\n\t"
-			     "stctg 0,15,0(1)\n\t"
-			     "la    1,%1\n\t"
-                             "stam  0,15,0(1)"
-                             : "=m" (cpu_lowcore->cregs_save_area[0]),
-                               "=m" (cpu_lowcore->access_regs_save_area[0])
-                             : : "1", "memory");
-
-        eieio();
-        signal_processor(cpu,sigp_restart);
-
-	while (!cpu_online(cpu));
-	return 0;
-}
-
-/*
- *	Cycle through the processors and setup structures.
- */
-
-void __init smp_prepare_cpus(unsigned int max_cpus)
-{
-	unsigned long async_stack;
-        int i;
-
-        /* request the 0x1202 external interrupt */
-        if (register_external_interrupt(0x1202, do_ext_call_interrupt) != 0)
-                panic("Couldn't request external interrupt 0x1202");
-        smp_check_cpus(max_cpus);
-        memset(lowcore_ptr,0,sizeof(lowcore_ptr));  
-        
-        /*
-         *  Initialize prefix pages and stacks for all possible cpus
-         */
-        print_cpu_info(&S390_lowcore.cpu_data);
-
-        for(i = 0; i < NR_CPUS; i++) {
-		if (!cpu_possible(i))
-			continue;
-		lowcore_ptr[i] = (struct _lowcore *)
-			__get_free_pages(GFP_KERNEL|GFP_DMA, 1);
-		async_stack = __get_free_pages(GFP_KERNEL,2);
-		if (lowcore_ptr[i] == NULL || async_stack == 0ULL)
-			panic("smp_boot_cpus failed to allocate memory\n");
-                memcpy(lowcore_ptr[i], &S390_lowcore, sizeof(struct _lowcore));
-		lowcore_ptr[i]->async_stack = async_stack + (4 * PAGE_SIZE);
-	}
-	set_prefix((u32)(u64) lowcore_ptr[smp_processor_id()]);
-}
-
-void __devinit smp_prepare_boot_cpu(void)
-{
-	set_bit(smp_processor_id(), &cpu_online_map);
-	set_bit(smp_processor_id(), &cpu_possible_map);
-}
-
-void smp_cpus_done(unsigned int max_cpis)
-{
-}
-
-/*
- * the frequency of the profiling timer can be changed
- * by writing a multiplier value into /proc/profile.
- *
- * usually you want to run this on all CPUs ;)
- */
-int setup_profiling_timer(unsigned int multiplier)
-{
-        return 0;
-}
-
-EXPORT_SYMBOL(lowcore_ptr);
-EXPORT_SYMBOL(smp_ctl_set_bit);
-EXPORT_SYMBOL(smp_ctl_clear_bit);
-EXPORT_SYMBOL(smp_call_function);
diff -Nru a/arch/s390x/kernel/sys_s390.c b/arch/s390x/kernel/sys_s390.c
--- a/arch/s390x/kernel/sys_s390.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,258 +0,0 @@
-/*
- *  arch/s390/kernel/sys_s390.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *
- *  Derived from "arch/i386/kernel/sys_i386.c"
- *
- *  This file contains various random system calls that
- *  have a non-standard calling sequence on the Linux/s390
- *  platform.
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/sem.h>
-#include <linux/msg.h>
-#include <linux/shm.h>
-#include <linux/stat.h>
-#include <linux/mman.h>
-#include <linux/file.h>
-#include <linux/utsname.h>
-#include <linux/personality.h>
-
-#include <asm/uaccess.h>
-#include <asm/ipc.h>
-
-/*
- * sys_pipe() is the normal C calling standard for creating
- * a pipe. It's not the way Unix traditionally does this, though.
- */
-asmlinkage long sys_pipe(unsigned long * fildes)
-{
-	int fd[2];
-	int error;
-
-	error = do_pipe(fd);
-	if (!error) {
-		if (copy_to_user(fildes, fd, 2*sizeof(int)))
-			error = -EFAULT;
-	}
-	return error;
-}
-
-/* common code for old and new mmaps */
-static inline long do_mmap2(
-	unsigned long addr, unsigned long len,
-	unsigned long prot, unsigned long flags,
-	unsigned long fd, unsigned long pgoff)
-{
-	long error = -EBADF;
-	struct file * file = NULL;
-
-	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
-	if (!(flags & MAP_ANONYMOUS)) {
-		file = fget(fd);
-		if (!file)
-			goto out;
-	}
-
-	down_write(&current->mm->mmap_sem);
-	error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
-	up_write(&current->mm->mmap_sem);
-
-	if (file)
-		fput(file);
-out:
-	return error;
-}
-
-/*
- * Perform the select(nd, in, out, ex, tv) and mmap() system
- * calls. Linux/i386 didn't use to be able to handle more than
- * 4 system call parameters, so these system calls used a memory
- * block for parameter passing..
- */
-
-struct mmap_arg_struct {
-	unsigned long addr;
-	unsigned long len;
-	unsigned long prot;
-	unsigned long flags;
-	unsigned long fd;
-	unsigned long offset;
-};
-
-asmlinkage long sys_mmap2(struct mmap_arg_struct *arg)
-{
-	struct mmap_arg_struct a;
-	int error = -EFAULT;
-
-	if (copy_from_user(&a, arg, sizeof(a)))
-		goto out;
-	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset);
-out:
-	return error;
-}
-
-asmlinkage long old_mmap(struct mmap_arg_struct *arg)
-{
-	struct mmap_arg_struct a;
-	long error = -EFAULT;
-
-	if (copy_from_user(&a, arg, sizeof(a)))
-		goto out;
-
-	error = -EINVAL;
-	if (a.offset & ~PAGE_MASK)
-		goto out;
-
-	error = do_mmap2(a.addr, a.len, a.prot, a.flags, a.fd, a.offset >> PAGE_SHIFT);
-out:
-	return error;
-}
-
-unsigned long
-arch_get_unmapped_area(struct file *filp, unsigned long addr,
-		       unsigned long len, unsigned long pgoff,
-		       unsigned long flags)
-{
-	struct vm_area_struct *vma;
-	unsigned long end;
-
-	if (test_thread_flag(TIF_31BIT)) { 
-		if (!addr) 
-			addr = 0x40000000; 
-		end = 0x80000000;		
-	} else { 
-		if (!addr) 
-			addr = TASK_SIZE / 2;
-		end = TASK_SIZE; 
-	}
-
-	if (len > end)
-		return -ENOMEM;
-	addr = PAGE_ALIGN(addr);
-
-	for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
-		/* At this point:  (!vma || addr < vma->vm_end). */
-		if (end - len < addr)
-			return -ENOMEM;
-		if (!vma || addr + len <= vma->vm_start)
-			return addr;
-		addr = vma->vm_end;
-	}
-}
-
-extern asmlinkage int sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
-
-/*
- * sys_ipc() is the de-multiplexer for the SysV IPC calls..
- *
- * This is really horribly ugly.
- */
-asmlinkage int sys_ipc (uint call, int first, long second, 
-                        unsigned long third, void *ptr)
-{
-        struct ipc_kludge tmp;
-	int ret;
-
-        switch (call) {
-        case SEMOP:
-                return sys_semop (first, (struct sembuf *)ptr, second);
-        case SEMGET:
-                return sys_semget (first, second, third);
-        case SEMCTL: {
-                union semun fourth;
-                if (!ptr)
-                        return -EINVAL;
-                if (get_user(fourth.__pad, (void **) ptr))
-                        return -EFAULT;
-                return sys_semctl (first, second, third, fourth);
-        } 
-        case MSGSND:
-		return sys_msgsnd (first, (struct msgbuf *) ptr, 
-                                   second, third);
-		break;
-        case MSGRCV:
-                if (!ptr)
-                        return -EINVAL;
-                if (copy_from_user (&tmp, (struct ipc_kludge *) ptr,
-                                    sizeof (struct ipc_kludge)))
-                        return -EFAULT;
-                return sys_msgrcv (first, tmp.msgp,
-                                   second, tmp.msgtyp, third);
-        case MSGGET:
-                return sys_msgget ((key_t) first, second);
-        case MSGCTL:
-                return sys_msgctl (first, second, (struct msqid_ds *) ptr);
-                
-	case SHMAT: {
-		ulong raddr;
-		ret = sys_shmat (first, (char *) ptr, second, &raddr);
-		if (ret)
-			return ret;
-		return put_user (raddr, (ulong *) third);
-		break;
-        }
-	case SHMDT: 
-		return sys_shmdt ((char *)ptr);
-	case SHMGET:
-		return sys_shmget (first, second, third);
-	case SHMCTL:
-		return sys_shmctl (first, second,
-                                   (struct shmid_ds *) ptr);
-	default:
-		return -EINVAL;
-
-	}
-        
-	return -EINVAL;
-}
-
-/*
- * Old cruft
- */
-asmlinkage int sys_uname(struct old_utsname * name)
-{
-	int err;
-	if (!name)
-		return -EFAULT;
-	down_read(&uts_sem);
-	err=copy_to_user(name, &system_utsname, sizeof (*name));
-	up_read(&uts_sem);
-	return err?-EFAULT:0;
-}
-
-extern asmlinkage int sys_newuname(struct new_utsname * name);
-
-asmlinkage int s390x_newuname(struct new_utsname * name)
-{
-	int ret = sys_newuname(name);
-
-	if (current->personality == PER_LINUX32 && !ret) {
-		ret = copy_to_user(name->machine, "s390\0\0\0\0", 8);
-		if (ret) ret = -EFAULT;
-	}
-	return ret;
-}
-
-extern asmlinkage long sys_personality(unsigned long);
-
-asmlinkage int s390x_personality(unsigned long personality)
-{
-	int ret;
-
-	if (current->personality == PER_LINUX32 && personality == PER_LINUX)
-		personality = PER_LINUX32;
-	ret = sys_personality(personality);
-	if (ret == PER_LINUX32)
-		ret = PER_LINUX;
-
-	return ret;
-}
diff -Nru a/arch/s390x/kernel/time.c b/arch/s390x/kernel/time.c
--- a/arch/s390x/kernel/time.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,241 +0,0 @@
-/*
- *  arch/s390/kernel/time.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- *
- *  Derived from "arch/i386/kernel/time.c"
- *    Copyright (C) 1991, 1992, 1995  Linus Torvalds
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/interrupt.h>
-#include <linux/time.h>
-#include <linux/delay.h>
-#include <linux/init.h>
-#include <linux/smp.h>
-#include <linux/types.h>
-
-#include <asm/uaccess.h>
-#include <asm/delay.h>
-
-#include <linux/timex.h>
-#include <linux/config.h>
-
-#include <asm/irq.h>
-#include <asm/s390_ext.h>
-
-/* change this if you have some constant time drift */
-#define USECS_PER_JIFFY     ((unsigned long) 1000000/HZ)
-#define CLK_TICKS_PER_JIFFY ((unsigned long) USECS_PER_JIFFY << 12)
-
-/*
- * Create a small time difference between the timer interrupts
- * on the different cpus to avoid lock contention.
- */
-#define CPU_DEVIATION       (smp_processor_id() << 12)
-
-#define TICK_SIZE tick
-
-u64 jiffies_64 = INITIAL_JIFFIES;
-
-static ext_int_info_t ext_int_info_timer;
-static uint64_t xtime_cc;
-static uint64_t init_timer_cc;
-
-extern unsigned long wall_jiffies;
-
-void tod_to_timeval(__u64 todval, struct timespec *xtime)
-{
-        xtime->tv_sec = (todval >> 12) / 1000000;
-	todval -= (xtime->tv_sec * 1000000) << 12;
-	xtime->tv_nsec = ((todval * 1000) >> 12);
-}
-
-static inline unsigned long do_gettimeoffset(void) 
-{
-	__u64 now;
-
-	asm volatile ("STCK 0(%0)" : : "a" (&now) : "memory", "cc");
-        now = (now - init_timer_cc) >> 12;
-	/* We require the offset from the latest update of xtime */
-	now -= (__u64) wall_jiffies*USECS_PER_JIFFY;
-	return (unsigned long) now;
-}
-
-/*
- * This version of gettimeofday has microsecond resolution.
- */
-void do_gettimeofday(struct timeval *tv)
-{
-	unsigned long flags;
-	unsigned long seq;
-	unsigned long usec, sec;
-
-	do {
-		seq = read_seqbegin_irqsave(&xtime_lock, flags);
-		sec = xtime.tv_sec;
-		usec = xtime.tv_nsec + do_gettimeoffset();
-	} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
-
-	while (usec >= 1000000) {
-		usec -= 1000000;
-		sec++;
-	}
-
-	tv->tv_sec = sec;
-	tv->tv_usec = usec;
-}
-
-void do_settimeofday(struct timeval *tv)
-{
-
-	write_seqlock_irq(&xtime_lock);
-	/* This is revolting. We need to set the xtime.tv_usec
-	 * correctly. However, the value in this location is
-	 * is value at the last tick.
-	 * Discover what correction gettimeofday
-	 * would have done, and then undo it!
-	 */
-	tv->tv_usec -= do_gettimeoffset();
-
-	while (tv->tv_usec < 0) {
-		tv->tv_usec += 1000000;
-		tv->tv_sec--;
-	}
-
-	xtime.tv_sec = tv->tv_sec;
-	xtime.tv_nsec = tv->tv_usec * 1000;
-	time_adjust = 0;		/* stop active adjtime() */
-	time_status |= STA_UNSYNC;
-	time_maxerror = NTP_PHASE_LIMIT;
-	time_esterror = NTP_PHASE_LIMIT;
-	write_sequnlock_irq(&xtime_lock);
-}
-
-/*
- * timer_interrupt() needs to keep up the real-time clock,
- * as well as call the "do_timer()" routine every clocktick
- */
-static void do_comparator_interrupt(struct pt_regs *regs, __u16 error_code)
-{
-	__u64 tmp;
-	__u32 ticks;
-
-	/* Calculate how many ticks have passed. */
-	asm volatile ("STCK 0(%0)" : : "a" (&tmp) : "memory", "cc");
-	tmp = tmp - S390_lowcore.jiffy_timer;
-	if (tmp >= 2*CLK_TICKS_PER_JIFFY) {  /* more than one tick ? */
-		ticks = tmp / CLK_TICKS_PER_JIFFY;
-		S390_lowcore.jiffy_timer +=
-			CLK_TICKS_PER_JIFFY * (__u64) ticks;
-	} else {
-		ticks = 1;
-		S390_lowcore.jiffy_timer += CLK_TICKS_PER_JIFFY;
-	}
-
-	/* set clock comparator for next tick */
-	tmp = S390_lowcore.jiffy_timer + CLK_TICKS_PER_JIFFY + CPU_DEVIATION;
-        asm volatile ("SCKC %0" : : "m" (tmp));
-
-	irq_enter();
-
-#ifdef CONFIG_SMP
-	/*
-	 * Do not rely on the boot cpu to do the calls to do_timer.
-	 * Spread it over all cpus instead.
-	 */
-	write_seqlock(&xtime_lock);
-	if (S390_lowcore.jiffy_timer > xtime_cc) {
-		__u32 xticks;
-
-		tmp = S390_lowcore.jiffy_timer - xtime_cc;
-		if (tmp >= 2*CLK_TICKS_PER_JIFFY) {
-			xticks = tmp / CLK_TICKS_PER_JIFFY;
-			xtime_cc += (__u64) xticks * CLK_TICKS_PER_JIFFY;
-		} else {
-			xticks = 1;
-			xtime_cc += CLK_TICKS_PER_JIFFY;
-		}
-		while (xticks--)
-			do_timer(regs);
-	}
-	write_sequnlock(&xtime_lock);
-	while (ticks--)
-		update_process_times(user_mode(regs));
-#else
-	while (ticks--)
-		do_timer(regs);
-#endif
-
-	irq_exit();
-}
-
-/*
- * Start the clock comparator on the current CPU.
- */
-void init_cpu_timer(void)
-{
-	unsigned long cr0;
-	__u64 timer;
-
-        /* allow clock comparator timer interrupt */
-        asm volatile ("STCTG 0,0,%0" : "=m" (cr0) : : "memory");
-        cr0 |= 0x800;
-        asm volatile ("LCTLG 0,0,%0" : : "m" (cr0) : "memory");
-	timer = init_timer_cc + jiffies_64 * CLK_TICKS_PER_JIFFY;
-	S390_lowcore.jiffy_timer = timer;
-	timer += CLK_TICKS_PER_JIFFY + CPU_DEVIATION;
-	asm volatile ("SCKC %0" : : "m" (timer));
-}
-
-/*
- * Initialize the TOD clock and the CPU timer of
- * the boot cpu.
- */
-void __init time_init(void)
-{
-	__u64 set_time_cc;
-	int cc;
-
-        /* kick the TOD clock */
-        asm volatile ("STCK 0(%1)\n\t"
-                      "IPM  %0\n\t"
-                      "SRL  %0,28" : "=r" (cc) : "a" (&init_timer_cc) 
-				   : "memory", "cc");
-        switch (cc) {
-        case 0: /* clock in set state: all is fine */
-                break;
-        case 1: /* clock in non-set state: FIXME */
-                printk("time_init: TOD clock in non-set state\n");
-                break;
-        case 2: /* clock in error state: FIXME */
-                printk("time_init: TOD clock in error state\n");
-                break;
-        case 3: /* clock in stopped or not-operational state: FIXME */
-                printk("time_init: TOD clock stopped/non-operational\n");
-                break;
-        }
-
-	/* set xtime */
-	xtime_cc = init_timer_cc;
-	set_time_cc = init_timer_cc - 0x8126d60e46000000LL +
-		(0x3c26700LL*1000000*4096);
-        tod_to_timeval(set_time_cc, &xtime);
-
-        /* request the 0x1004 external interrupt */
-        if (register_early_external_interrupt(0x1004, do_comparator_interrupt,
-					      &ext_int_info_timer) != 0)
-                panic("Couldn't request external interrupt 0x1004");
-
-        /* init CPU timer */
-        init_cpu_timer();
-}
diff -Nru a/arch/s390x/kernel/traps.c b/arch/s390x/kernel/traps.c
--- a/arch/s390x/kernel/traps.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,503 +0,0 @@
-/*
- *  arch/s390/kernel/traps.c
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *
- *  Derived from "arch/i386/kernel/traps.c"
- *    Copyright (C) 1991, 1992 Linus Torvalds
- */
-
-/*
- * 'Traps.c' handles hardware traps and faults after we have saved some
- * state in 'asm.s'.
- */
-#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/init.h>
-#include <linux/delay.h>
-#include <linux/module.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/io.h>
-#include <asm/atomic.h>
-#if CONFIG_REMOTE_DEBUG
-#include <asm/gdb-stub.h>
-#endif
-#include <asm/cpcmd.h>
-#include <asm/s390_ext.h>
-
-/* Called from entry.S only */
-extern void handle_per_exception(struct pt_regs *regs);
-
-typedef void pgm_check_handler_t(struct pt_regs *, long);
-pgm_check_handler_t *pgm_check_table[128];
-
-#ifdef CONFIG_SYSCTL
-#ifdef CONFIG_PROCESS_DEBUG
-int sysctl_userprocess_debug = 1;
-#else
-int sysctl_userprocess_debug = 0;
-#endif
-#endif
-
-extern pgm_check_handler_t do_protection_exception;
-extern pgm_check_handler_t do_segment_exception;
-extern pgm_check_handler_t do_region_exception;
-extern pgm_check_handler_t do_page_exception;
-#ifdef CONFIG_PFAULT
-extern int pfault_init(void);
-extern void pfault_fini(void);
-extern void pfault_interrupt(struct pt_regs *regs, __u16 error_code);
-static ext_int_info_t ext_int_pfault;
-#endif
-
-static int kstack_depth_to_print = 20;
-
-void show_trace(unsigned long * stack)
-{
-	unsigned long backchain, low_addr, high_addr, ret_addr;
-	int i;
-
-	if (!stack)
-		stack = (unsigned long*)&stack;
-
-	printk("Call Trace: ");
-	low_addr = (unsigned long) stack;
-	high_addr = (low_addr & (-THREAD_SIZE)) + THREAD_SIZE;
-	/* Skip the first frame (biased stack) */
-	backchain = *(unsigned long *) low_addr;
-	/* Print up to 8 lines */
-	for (i = 0; i < 8; i++) {
-		if (backchain < low_addr || backchain >= high_addr)
-			break;
-		ret_addr = *(unsigned long *) (backchain+112);
-		if (!kernel_text_address(ret_addr))
-			break;
-		if (i && ((i % 3) == 0))
-			printk("\n   ");
-		printk("[<%016lx>] ", ret_addr);
-		low_addr = backchain;
-		backchain = *(unsigned long *) backchain;
-	}
-	printk("\n");
-}
-
-void show_trace_task(struct task_struct *tsk)
-{
-	/*
-	 * We can't print the backtrace of a running process. It is
-	 * unreliable at best and can cause kernel oopses.
-	 */
-	if (tsk->state == TASK_RUNNING)
-		return;
-	show_trace((unsigned long *) tsk->thread.ksp);
-}
-
-void show_stack(unsigned long *sp)
-{
-	unsigned long *stack;
-	int i;
-
-	// debugging aid: "show_stack(NULL);" prints the
-	// back trace for this cpu.
-
-	if (sp == NULL)
-		sp = (unsigned long*) &sp;
-
-	stack = sp;
-	for (i = 0; i < kstack_depth_to_print; i++) {
-		if (((addr_t) stack & (THREAD_SIZE-1)) == 0)
-			break;
-		if (i && ((i % 4) == 0))
-			printk("\n       ");
-		printk("%016lx ", *stack++);
-	}
-	printk("\n");
-	show_trace(sp);
-}
-
-/*
- * The architecture-independent dump_stack generator
- */
-void dump_stack(void)
-{
-	show_stack(0);
-}
-
-void show_registers(struct pt_regs *regs)
-{
-	mm_segment_t old_fs;
-	char *mode;
-	int i;
-
-	mode = (regs->psw.mask & PSW_MASK_PSTATE) ? "User" : "Krnl";
-	printk("%s PSW : %016lx %016lx\n",
-	       mode, (unsigned long) regs->psw.mask,
-	       (unsigned long) regs->psw.addr);
-	printk("%s GPRS: %016lx %016lx %016lx %016lx\n", mode,
-	       regs->gprs[0], regs->gprs[1], regs->gprs[2], regs->gprs[3]);
-	printk("           %016lx %016lx %016lx %016lx\n",
-	       regs->gprs[4], regs->gprs[5], regs->gprs[6], regs->gprs[7]);
-	printk("           %016lx %016lx %016lx %016lx\n",
-	       regs->gprs[8], regs->gprs[9], regs->gprs[10], regs->gprs[11]);
-	printk("           %016lx %016lx %016lx %016lx\n",
-	       regs->gprs[12], regs->gprs[13], regs->gprs[14], regs->gprs[15]);
-	printk("%s ACRS: %08x %08x %08x %08x\n", mode,
-	       regs->acrs[0], regs->acrs[1], regs->acrs[2], regs->acrs[3]);
-	printk("           %08x %08x %08x %08x\n",
-	       regs->acrs[4], regs->acrs[5], regs->acrs[6], regs->acrs[7]);
-	printk("           %08x %08x %08x %08x\n",
-	       regs->acrs[8], regs->acrs[9], regs->acrs[10], regs->acrs[11]);
-	printk("           %08x %08x %08x %08x\n",
-	       regs->acrs[12], regs->acrs[13], regs->acrs[14], regs->acrs[15]);
-
-	/*
-	 * Print the first 20 byte of the instruction stream at the
-	 * time of the fault.
-	 */
-	old_fs = get_fs();
-	if (regs->psw.mask & PSW_MASK_PSTATE)
-		set_fs(USER_DS);
-	else
-		set_fs(KERNEL_DS);
-	printk("%s Code: ", mode);
-	for (i = 0; i < 20; i++) {
-		unsigned char c;
-		if (__get_user(c, (char *)(regs->psw.addr + i))) {
-			printk(" Bad PSW.");
-			break;
-		}
-		printk("%02x ", c);
-	}
-	set_fs(old_fs);
-
-	printk("\n");
-}	
-
-/* This is called from fs/proc/array.c */
-char *task_show_regs(struct task_struct *task, char *buf)
-{
-	struct pt_regs *regs;
-
-	regs = __KSTK_PTREGS(task);
-	buf += sprintf(buf, "task: %016lx, ksp: %016lx\n",
-		       (unsigned long) task, task->thread.ksp);
-	buf += sprintf(buf, "User PSW : %016lx %016lx\n",
-		       (unsigned long) regs->psw.mask, 
-		       (unsigned long) regs->psw.addr);
-	buf += sprintf(buf, "User GPRS: %016lx %016lx %016lx %016lx\n",
-		       regs->gprs[0], regs->gprs[1],
-		       regs->gprs[2], regs->gprs[3]);
-	buf += sprintf(buf, "           %016lx %016lx %016lx %016lx\n",
-		       regs->gprs[4], regs->gprs[5], 
-		       regs->gprs[6], regs->gprs[7]);
-	buf += sprintf(buf, "           %016lx %016lx %016lx %016lx\n",
-		       regs->gprs[8], regs->gprs[9],
-		       regs->gprs[10], regs->gprs[11]);
-	buf += sprintf(buf, "           %016lx %016lx %016lx %016lx\n",
-		       regs->gprs[12], regs->gprs[13],
-		       regs->gprs[14], regs->gprs[15]);
-	buf += sprintf(buf, "User ACRS: %08x %08x %08x %08x\n",
-		       regs->acrs[0], regs->acrs[1],
-		       regs->acrs[2], regs->acrs[3]);
-	buf += sprintf(buf, "           %08x %08x %08x %08x\n",
-		       regs->acrs[4], regs->acrs[5],
-		       regs->acrs[6], regs->acrs[7]);
-	buf += sprintf(buf, "           %08x %08x %08x %08x\n",
-		       regs->acrs[8], regs->acrs[9],
-		       regs->acrs[10], regs->acrs[11]);
-	buf += sprintf(buf, "           %08x %08x %08x %08x\n",
-		       regs->acrs[12], regs->acrs[13],
-		       regs->acrs[14], regs->acrs[15]);
-	return buf;
-}
-
-spinlock_t die_lock = SPIN_LOCK_UNLOCKED;
-
-void die(const char * str, struct pt_regs * regs, long err)
-{
-	static int die_counter;
-        console_verbose();
-        spin_lock_irq(&die_lock);
-	bust_spinlocks(1);
-	printk("%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
-        show_regs(regs);
-	bust_spinlocks(0);
-        spin_unlock_irq(&die_lock);
-        do_exit(SIGSEGV);
-}
-
-static void inline do_trap(long interruption_code, int signr, char *str,
-                           struct pt_regs *regs, siginfo_t *info)
-{
-	/*
-	 * We got all needed information from the lowcore and can
-	 * now safely switch on interrupts.
-	 */
-	if (regs->psw.mask & PSW_MASK_PSTATE)
-		local_irq_enable();
-
-        if (regs->psw.mask & PSW_MASK_PSTATE) {
-                struct task_struct *tsk = current;
-                tsk->thread.trap_no = interruption_code & 0xffff;
-		if (info)
-			force_sig_info(signr, info, tsk);
-		else
-                	force_sig(signr, tsk);
-#ifndef CONFIG_SYSCTL
-#ifdef CONFIG_PROCESS_DEBUG
-                printk("User process fault: interruption code 0x%lX\n",
-                       interruption_code);
-                show_regs(regs);
-#endif
-#else
-		if (sysctl_userprocess_debug) {
-			printk("User process fault: interruption code 0x%lX\n",
-			       interruption_code);
-			show_regs(regs);
-		}
-#endif
-        } else {
-                const struct exception_table_entry *fixup;
-                fixup = search_exception_tables(regs->psw.addr);
-                if (fixup)
-                        regs->psw.addr = fixup->fixup;
-                else
-                        die(str, regs, interruption_code);
-        }
-}
-
-static inline void *get_check_address(struct pt_regs *regs)
-{
-	return (void *)(regs->psw.addr - S390_lowcore.pgm_ilc);
-}
-
-int do_debugger_trap(struct pt_regs *regs,int signal)
-{
-	if(regs->psw.mask&PSW_MASK_PSTATE)
-	{
-		if(current->ptrace & PT_PTRACED)
-			force_sig(signal,current);
-		else
-			return 1;
-	}
-	else
-	{
-#if CONFIG_REMOTE_DEBUG
-		if(gdb_stub_initialised)
-		{
-			gdb_stub_handle_exception(regs, signal);
-			return 0;
-		}
-#endif
-		return 1;
-	}
-	return 0;
-}
-
-#define DO_ERROR(signr, str, name) \
-asmlinkage void name(struct pt_regs * regs, long interruption_code) \
-{ \
-	do_trap(interruption_code, signr, str, regs, NULL); \
-}
-
-#define DO_ERROR_INFO(signr, str, name, sicode, siaddr) \
-asmlinkage void name(struct pt_regs * regs, long interruption_code) \
-{ \
-        siginfo_t info; \
-        info.si_signo = signr; \
-        info.si_errno = 0; \
-        info.si_code = sicode; \
-        info.si_addr = (void *)siaddr; \
-        do_trap(interruption_code, signr, str, regs, &info); \
-}
-
-DO_ERROR(SIGSEGV, "Unknown program exception", default_trap_handler)
-
-DO_ERROR_INFO(SIGBUS, "addressing exception", addressing_exception,
-	      BUS_ADRERR, get_check_address(regs))
-DO_ERROR_INFO(SIGILL,  "execute exception", execute_exception,
-	      ILL_ILLOPN, get_check_address(regs))
-DO_ERROR_INFO(SIGFPE,  "fixpoint divide exception", divide_exception,
-	      FPE_INTDIV, get_check_address(regs))
-DO_ERROR_INFO(SIGILL,  "operand exception", operand_exception,
-	      ILL_ILLOPN, get_check_address(regs))
-DO_ERROR_INFO(SIGILL,  "privileged operation", privileged_op,
-	      ILL_PRVOPC, get_check_address(regs))
-DO_ERROR_INFO(SIGILL,  "special operation exception", special_op_exception,
-	      ILL_ILLOPN, get_check_address(regs))
-DO_ERROR_INFO(SIGILL,  "specification exception", specification_exception,
-	      ILL_ILLOPN, get_check_address(regs))
-DO_ERROR_INFO(SIGILL,  "translation exception", translation_exception,
-	      ILL_ILLOPN, get_check_address(regs))
-
-static inline void
-do_fp_trap(struct pt_regs *regs, void *location,
-           int fpc, long interruption_code)
-{
-	siginfo_t si;
-
-	si.si_signo = SIGFPE;
-	si.si_errno = 0;
-	si.si_addr = location;
-	si.si_code = 0;
-	/* FPC[2] is Data Exception Code */
-	if ((fpc & 0x00000300) == 0) {
-		/* bits 6 and 7 of DXC are 0 iff IEEE exception */
-		if (fpc & 0x8000) /* invalid fp operation */
-			si.si_code = FPE_FLTINV;
-		else if (fpc & 0x4000) /* div by 0 */
-			si.si_code = FPE_FLTDIV;
-		else if (fpc & 0x2000) /* overflow */
-			si.si_code = FPE_FLTOVF;
-		else if (fpc & 0x1000) /* underflow */
-			si.si_code = FPE_FLTUND;
-		else if (fpc & 0x0800) /* inexact */
-			si.si_code = FPE_FLTRES;
-	}
-	current->thread.ieee_instruction_pointer = (addr_t) location;
-	do_trap(interruption_code, SIGFPE,
-		"floating point exception", regs, &si);
-}
-
-asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code)
-{
-        __u8 opcode[6];
-	__u16 *location;
-	int do_sig = 0;
-
-	location = (__u16 *) get_check_address(regs);
-
-	/*
-	 * We got all needed information from the lowcore and can
-	 * now safely switch on interrupts.
-	 */
-	if (regs->psw.mask & PSW_MASK_PSTATE)
-		local_irq_enable();
-
-	/* WARNING don't change this check back to */
-	/* int problem_state=(regs->psw.mask & PSW_MASK_PSTATE); */
-	/* & then doing if(problem_state) an int is too small for this */
-	/* check on 64 bit. */
-	if(regs->psw.mask & PSW_MASK_PSTATE)
-		get_user(*((__u16 *) opcode), location);
-	else
-		*((__u16 *)opcode)=*((__u16 *)location);
-	if(*((__u16 *)opcode)==S390_BREAKPOINT_U16)
-        {
-		if(do_debugger_trap(regs,SIGTRAP))
-			do_sig=1;
-	}
-	else
-		do_sig = 1;
-	if (do_sig)
-		do_trap(interruption_code, SIGILL,
-			"illegal operation", regs, NULL);
-}
-
-asmlinkage void data_exception(struct pt_regs * regs, long interruption_code)
-{
-	__u16 *location;
-
-	location = (__u16 *) get_check_address(regs);
-
-	/*
-	 * We got all needed information from the lowcore and can
-	 * now safely switch on interrupts.
-	 */
-	if (regs->psw.mask & PSW_MASK_PSTATE)
-		local_irq_enable();
-
-	__asm__ volatile ("stfpc %0\n\t" 
-			  : "=m" (current->thread.fp_regs.fpc));
-
-	if (current->thread.fp_regs.fpc & FPC_DXC_MASK)
-		do_fp_trap(regs, location,
-                           current->thread.fp_regs.fpc, interruption_code);
-        else {
-		siginfo_t info;
-		info.si_signo = SIGILL;
-		info.si_errno = 0;
-		info.si_code = ILL_ILLOPN;
-		info.si_addr = location;
-		do_trap(interruption_code, SIGILL, 
-			"data exception", regs, &info);
-	}
-}
-
-
-
-/* init is done in lowcore.S and head.S */
-
-void __init trap_init(void)
-{
-        int i;
-
-        for (i = 0; i < 128; i++)
-          pgm_check_table[i] = &default_trap_handler;
-        pgm_check_table[1] = &illegal_op;
-        pgm_check_table[2] = &privileged_op;
-        pgm_check_table[3] = &execute_exception;
-        pgm_check_table[4] = &do_protection_exception;
-        pgm_check_table[5] = &addressing_exception;
-        pgm_check_table[6] = &specification_exception;
-        pgm_check_table[7] = &data_exception;
-        pgm_check_table[9] = &divide_exception;
-        pgm_check_table[0x12] = &translation_exception;
-        pgm_check_table[0x13] = &special_op_exception;
-        pgm_check_table[0x15] = &operand_exception;
-        pgm_check_table[0x10] = &do_segment_exception;
-        pgm_check_table[0x11] = &do_page_exception;
-        pgm_check_table[0x1C] = &privileged_op;
-        pgm_check_table[0x38] = &addressing_exception;
-        pgm_check_table[0x3B] = &do_region_exception;
-#ifdef CONFIG_PFAULT
-	if (MACHINE_IS_VM) {
-		/* request the 0x2603 external interrupt */
-		if (register_early_external_interrupt(0x2603, pfault_interrupt,
-						      &ext_int_pfault) != 0)
-			panic("Couldn't request external interrupt 0x2603");
-		/*
-		 * Try to get pfault pseudo page faults going.
-		 */
-		if (pfault_init() != 0) {
-			/* Tough luck, no pfault. */
-			unregister_early_external_interrupt(0x2603,
-							    pfault_interrupt,
-							    &ext_int_pfault);
-		}
-	}
-#endif
-}
-
-
-void handle_per_exception(struct pt_regs *regs)
-{
-	if (regs->psw.mask&PSW_MASK_PSTATE) {
-		per_struct *per_info=&current->thread.per_info;
-		per_info->lowcore.words.perc_atmid=S390_lowcore.per_perc_atmid;
-		per_info->lowcore.words.address=S390_lowcore.per_address;
-		per_info->lowcore.words.access_id=S390_lowcore.per_access_id;
-	}
-	if (do_debugger_trap(regs,SIGTRAP)) {
-		/* I've seen this possibly a task structure being reused ? */
-		printk("Spurious per exception detected\n");
-		printk("switching off per tracing for this task.\n");
-		show_regs(regs);
-		/* Hopefully switching off per tracing will help us survive */
-		regs->psw.mask &= ~PSW_MASK_PER;
-	}
-}
-
diff -Nru a/arch/s390x/kernel/wrapper32.S b/arch/s390x/kernel/wrapper32.S
--- a/arch/s390x/kernel/wrapper32.S	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1211 +0,0 @@
-/*
-*  arch/s390/kernel/sys_wrapper31.S
-*    wrapper for 31 bit compatible system calls.
-*
-*  S390 version
-*    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
-*    Author(s): Gerhard Tonn (ton@de.ibm.com),
-*/ 
-
-	.globl  sys32_exit_wrapper 
-sys32_exit_wrapper:
-	lgfr	%r2,%r2			# int
-	jg	sys_exit		# branch to sys_exit
-    
-	.globl  sys32_read_wrapper 
-sys32_read_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# char *
-	llgfr	%r4,%r4			# size_t
-	jg	sys32_read		# branch to sys_read
-
-	.globl  sys32_write_wrapper 
-sys32_write_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# const char *
-	llgfr	%r4,%r4			# size_t
-	jg	sys32_write		# branch to system call
-
-	.globl  sys32_open_wrapper 
-sys32_open_wrapper:
-	llgtr	%r2,%r2			# const char *
-	lgfr	%r3,%r3			# int
-	lgfr	%r4,%r4			# int
-	jg	sys_open		# branch to system call
-
-	.globl  sys32_close_wrapper 
-sys32_close_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	jg	sys_close		# branch to system call
-
-	.globl  sys32_creat_wrapper 
-sys32_creat_wrapper:
-	llgtr	%r2,%r2			# const char *
-	lgfr	%r3,%r3			# int
-	jg	sys_creat		# branch to system call
-
-	.globl  sys32_link_wrapper 
-sys32_link_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgtr	%r3,%r3			# const char *
-	jg	sys_link		# branch to system call
-
-	.globl  sys32_unlink_wrapper 
-sys32_unlink_wrapper:
-	llgtr	%r2,%r2			# const char *
-	jg	sys_unlink		# branch to system call
-
-	.globl  sys32_chdir_wrapper 
-sys32_chdir_wrapper:
-	llgtr	%r2,%r2			# const char *
-	jg	sys_chdir		# branch to system call
-
-	.globl  sys32_time_wrapper 
-sys32_time_wrapper:
-	llgtr	%r2,%r2			# int *
-	jg	sys_time		# branch to system call
-
-	.globl  sys32_mknod_wrapper 
-sys32_mknod_wrapper:
-	llgtr	%r2,%r2			# const char *
-	lgfr	%r3,%r3			# int 
-	llgfr	%r4,%r4			# dev
-	jg	sys_mknod		# branch to system call
-
-	.globl  sys32_chmod_wrapper 
-sys32_chmod_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgfr	%r3,%r3			# mode_t
-	jg	sys_chmod		# branch to system call
-
-	.globl  sys32_lchown16_wrapper 
-sys32_lchown16_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
-	llgfr	%r4,%r4			# __kernel_old_uid_emu31_t 
-	jg	sys32_lchown16		# branch to system call
-
-	.globl  sys32_lseek_wrapper 
-sys32_lseek_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	lgfr	%r3,%r3			# off_t
-	llgfr	%r4,%r4			# unsigned int
-	jg	sys_lseek		# branch to system call
-
-#sys32_getpid_wrapper				# void 
-
-	.globl  sys32_mount_wrapper 
-sys32_mount_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	llgtr	%r4,%r4			# char *
-	llgfr	%r5,%r5			# unsigned long
-	llgtr	%r6,%r6			# void *
-	jg	sys32_mount		# branch to system call
-
-	.globl  sys32_oldumount_wrapper 
-sys32_oldumount_wrapper:
-	llgtr	%r2,%r2			# char *
-	jg	sys_oldumount		# branch to system call
-
-	.globl  sys32_setuid16_wrapper 
-sys32_setuid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
-	jg	sys32_setuid16		# branch to system call
-
-#sys32_getuid16_wrapper			# void 
-
-	.globl  sys32_ptrace_wrapper 
-sys32_ptrace_wrapper:
-	lgfr	%r2,%r2			# long
-	lgfr	%r3,%r3			# long
-	llgtr	%r4,%r4			# long
-	llgfr	%r5,%r5			# long
-	jg	sys_ptrace		# branch to system call
-
-	.globl  sys32_alarm_wrapper 
-sys32_alarm_wrapper:
-	llgtr	%r2,%r2			# unsigned int
-	jg	sys_alarm		# branch to system call
-
-#sys32_pause_wrapper			# void 
-
-	.globl  compat_sys_utime_wrapper 
-compat_sys_utime_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# struct compat_utimbuf *
-	jg	compat_sys_utime		# branch to system call
-
-	.globl  sys32_access_wrapper 
-sys32_access_wrapper:
-	llgtr	%r2,%r2			# const char *
-	lgfr	%r3,%r3			# int
-	jg	sys_access		# branch to system call
-
-	.globl  sys32_nice_wrapper 
-sys32_nice_wrapper:
-	lgfr	%r2,%r2			# int
-	jg	sys_nice		# branch to system call
-
-#sys32_sync_wrapper			# void 
-
-	.globl  sys32_kill_wrapper 
-sys32_kill_wrapper:
-	lgfr	%r2,%r2			# int
-	lgfr	%r3,%r3			# int
-	jg	sys_kill		# branch to system call
-
-	.globl  sys32_rename_wrapper 
-sys32_rename_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgtr	%r3,%r3			# const char *
-	jg	sys_rename		# branch to system call
-
-	.globl  sys32_mkdir_wrapper 
-sys32_mkdir_wrapper:
-	llgtr	%r2,%r2			# const char *
-	lgfr	%r3,%r3			# int
-	jg	sys_mkdir		# branch to system call
-
-	.globl  sys32_rmdir_wrapper 
-sys32_rmdir_wrapper:
-	llgtr	%r2,%r2			# const char *
-	jg	sys_rmdir		# branch to system call
-
-	.globl  sys32_dup_wrapper 
-sys32_dup_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	jg	sys_dup			# branch to system call
-
-	.globl  sys32_pipe_wrapper 
-sys32_pipe_wrapper:
-	llgtr	%r2,%r2			# u32 *
-	jg	sys_pipe		# branch to system call
-
-	.globl  compat_sys_times_wrapper 
-compat_sys_times_wrapper:
-	llgtr	%r2,%r2			# struct compat_tms *
-	jg	compat_sys_times	# branch to system call
-
-	.globl  sys32_brk_wrapper 
-sys32_brk_wrapper:
-	llgtr	%r2,%r2			# unsigned long
-	jg	sys_brk			# branch to system call
-
-	.globl  sys32_setgid16_wrapper 
-sys32_setgid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
-	jg	sys32_setgid16		# branch to system call
-
-#sys32_getgid16_wrapper			# void 
-
-	.globl sys32_signal_wrapper
-sys32_signal_wrapper:
-	lgfr	%r2,%r2			# int 
-	llgfr	%r3,%r3			# __sighandler_t 
-	jg	sys_signal
-
-#sys32_geteuid16_wrapper		# void 
-
-#sys32_getegid16_wrapper		# void 
-
-	.globl  sys32_acct_wrapper 
-sys32_acct_wrapper:
-	llgtr	%r2,%r2			# char *
-	jg	sys_acct		# branch to system call
-
-	.globl  sys32_umount_wrapper 
-sys32_umount_wrapper:
-	llgtr	%r2,%r2			# char *
-	lgfr	%r3,%r3			# int
-	jg	sys_umount		# branch to system call
-
-	.globl  sys32_ioctl_wrapper 
-sys32_ioctl_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# unsigned int
-	llgfr	%r4,%r4			# unsigned int
-	jg	sys32_ioctl		# branch to system call
-
-	.globl  compat_sys_fcntl_wrapper 
-compat_sys_fcntl_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# unsigned int 
-	llgfr	%r4,%r4			# unsigned long
-	jg	compat_sys_fcntl	# branch to system call
-
-	.globl  sys32_setpgid_wrapper 
-sys32_setpgid_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	lgfr	%r3,%r3			# pid_t
-	jg	sys_setpgid		# branch to system call
-
-	.globl  sys32_umask_wrapper 
-sys32_umask_wrapper:
-	lgfr	%r3,%r3			# int
-	jg	sys_umask		# branch to system call
-
-	.globl  sys32_chroot_wrapper 
-sys32_chroot_wrapper:
-	llgtr	%r2,%r2			# char *
-	jg	sys_chroot		# branch to system call
-
-	.globl sys32_ustat_wrapper
-sys32_ustat_wrapper:
-	llgfr	%r2,%r2			# dev_t 
-	llgtr	%r3,%r3			# struct ustat *
-	jg	sys_ustat
-
-	.globl  sys32_dup2_wrapper 
-sys32_dup2_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# unsigned int
-	jg	sys_dup2		# branch to system call
-
-#sys32_getppid_wrapper			# void 
-
-#sys32_getpgrp_wrapper			# void 
-
-#sys32_setsid_wrapper			# void 
-
-	.globl  sys32_sigaction_wrapper
-sys32_sigaction_wrapper:
-	lgfr	%r2,%r2			# int 
-	llgtr	%r3,%r3			# const struct old_sigaction *
-	jg	sys32_sigaction		# branch to system call
-
-	.globl  sys32_setreuid16_wrapper 
-sys32_setreuid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
-	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
-	jg	sys32_setreuid16	# branch to system call
-
-	.globl  sys32_setregid16_wrapper 
-sys32_setregid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
-	llgfr	%r3,%r3			# __kernel_old_gid_emu31_t 
-	jg	sys32_setregid16	# branch to system call
-
-#sys32_sigsuspend_wrapper		# done in sigsuspend_glue 
-
-	.globl  compat_sys_sigpending_wrapper 
-compat_sys_sigpending_wrapper:
-	llgtr	%r2,%r2			# compat_old_sigset_t *
-	jg	compat_sys_sigpending	# branch to system call
-
-	.globl  sys32_sethostname_wrapper 
-sys32_sethostname_wrapper:
-	llgtr	%r2,%r2			# char *
-	lgfr	%r3,%r3			# int
-	jg	sys_sethostname		# branch to system call
-
-	.globl  sys32_setrlimit_wrapper 
-sys32_setrlimit_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# struct rlimit_emu31 *
-	jg	sys32_setrlimit		# branch to system call
-
-	.globl  sys32_old_getrlimit_wrapper 
-sys32_old_getrlimit_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# struct rlimit_emu31 *
-	jg	sys32_old_getrlimit	# branch to system call
-
-	.globl  sys32_getrlimit_wrapper 
-sys32_getrlimit_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# struct rlimit_emu31 *
-	jg	sys32_getrlimit		# branch to system call
-
-	.globl  sys32_mmap2_wrapper 
-sys32_mmap2_wrapper:
-	llgtr	%r2,%r2			# struct mmap_arg_struct_emu31 *
-	jg	sys32_mmap2			# branch to system call
-
-	.globl  sys32_getrusage_wrapper 
-sys32_getrusage_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# struct rusage_emu31 *
-	jg	sys32_getrusage		# branch to system call
-
-	.globl  sys32_gettimeofday_wrapper 
-sys32_gettimeofday_wrapper:
-	llgtr	%r2,%r2			# struct timeval_emu31 *
-	llgtr	%r3,%r3			# struct timezone *
-	jg	sys32_gettimeofday	# branch to system call
-
-	.globl  sys32_settimeofday_wrapper 
-sys32_settimeofday_wrapper:
-	llgtr	%r2,%r2			# struct timeval_emu31 *
-	llgtr	%r3,%r3			# struct timezone *
-	jg	sys32_settimeofday	# branch to system call
-
-	.globl  sys32_getgroups16_wrapper 
-sys32_getgroups16_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# __kernel_old_gid_emu31_t *
-	jg	sys32_getgroups16	# branch to system call
-
-	.globl  sys32_setgroups16_wrapper 
-sys32_setgroups16_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# __kernel_old_gid_emu31_t *
-	jg	sys32_setgroups16	# branch to system call
-
-	.globl  sys32_symlink_wrapper 
-sys32_symlink_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgtr	%r3,%r3			# const char *
-	jg	sys_symlink		# branch to system call
-
-	.globl  sys32_readlink_wrapper 
-sys32_readlink_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgtr	%r3,%r3			# char *
-	lgfr	%r4,%r4			# int
-	jg	sys_readlink		# branch to system call
-
-	.globl  sys32_uselib_wrapper 
-sys32_uselib_wrapper:
-	llgtr	%r2,%r2			# const char *
-	jg	sys_uselib		# branch to system call
-
-	.globl  sys32_swapon_wrapper 
-sys32_swapon_wrapper:
-	llgtr	%r2,%r2			# const char *
-	lgfr	%r3,%r3			# int
-	jg	sys_swapon		# branch to system call
-
-	.globl  sys32_reboot_wrapper 
-sys32_reboot_wrapper:
-	lgfr	%r2,%r2			# int
-	lgfr	%r3,%r3			# int
-	llgfr	%r4,%r4			# unsigned int
-	llgtr	%r5,%r5			# void *
-	jg	sys_reboot		# branch to system call
-
-	.globl  old32_readdir_wrapper 
-old32_readdir_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# void *
-	llgfr	%r4,%r4			# unsigned int
-	jg	old32_readdir		# branch to system call
-
-	.globl  old32_mmap_wrapper 
-old32_mmap_wrapper:
-	llgtr	%r2,%r2			# struct mmap_arg_struct_emu31 *
-	jg	old32_mmap		# branch to system call
-
-	.globl  sys32_munmap_wrapper 
-sys32_munmap_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgfr	%r3,%r3			# size_t 
-	jg	sys_munmap		# branch to system call
-
-	.globl  sys32_truncate_wrapper 
-sys32_truncate_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgfr	%r3,%r3			# unsigned long
-	jg	sys_truncate		# branch to system call
-
-	.globl  sys32_ftruncate_wrapper 
-sys32_ftruncate_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# unsigned long
-	jg	sys_ftruncate		# branch to system call
-
-	.globl  sys32_fchmod_wrapper 
-sys32_fchmod_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# mode_t
-	jg	sys_fchmod		# branch to system call
-
-	.globl  sys32_fchown16_wrapper 
-sys32_fchown16_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# __kernel_old_uid_emu31_t *
-	llgtr	%r4,%r4			# __kernel_old_gid_emu31_t *
-	jg	sys32_fchown16		# branch to system call
-
-	.globl  sys32_getpriority_wrapper 
-sys32_getpriority_wrapper:
-	lgfr	%r2,%r2			# int
-	lgfr	%r3,%r3			# int
-	jg	sys_getpriority		# branch to system call
-
-	.globl  sys32_setpriority_wrapper 
-sys32_setpriority_wrapper:
-	lgfr	%r2,%r2			# int
-	lgfr	%r3,%r3			# int
-	lgfr	%r4,%r4			# int
-	jg	sys_setpriority		# branch to system call
-
-	.globl  compat_sys_statfs_wrapper 
-compat_sys_statfs_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# struct compat_statfs *
-	jg	compat_sys_statfs	# branch to system call
-
-	.globl  compat_sys_fstatfs_wrapper 
-compat_sys_fstatfs_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# struct compat_statfs *
-	jg	compat_sys_fstatfs	# branch to system call
-
-	.globl  compat_sys_socketcall_wrapper 
-compat_sys_socketcall_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# u32 *
-	jg	compat_sys_socketcall	# branch to system call
-
-	.globl  sys32_syslog_wrapper 
-sys32_syslog_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# char *
-	lgfr	%r4,%r4			# int
-	jg	sys_syslog		# branch to system call
-
-	.globl  compat_sys_setitimer_wrapper 
-compat_sys_setitimer_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# struct itimerval_emu31 *
-	llgtr	%r4,%r4			# struct itimerval_emu31 *
-	jg	compat_sys_setitimer	# branch to system call
-
-	.globl  compat_sys_getitimer_wrapper 
-compat_sys_getitimer_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# struct itimerval_emu31 *
-	jg	compat_sys_getitimer	# branch to system call
-
-	.globl  compat_sys_newstat_wrapper 
-compat_sys_newstat_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# struct stat_emu31 *
-	jg	compat_sys_newstat	# branch to system call
-
-	.globl  compat_sys_newlstat_wrapper 
-compat_sys_newlstat_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# struct stat_emu31 *
-	jg	compat_sys_newlstat	# branch to system call
-
-	.globl  compat_sys_newfstat_wrapper 
-compat_sys_newfstat_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# struct stat_emu31 *
-	jg	compat_sys_newfstat	# branch to system call
-
-#sys32_vhangup_wrapper			# void 
-
-	.globl  sys32_wait4_wrapper 
-sys32_wait4_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	llgtr	%r3,%r3			# unsigned int *
-	lgfr	%r4,%r4			# int
-	llgtr	%r5,%r5			# struct rusage *
-	jg	sys32_wait4		# branch to system call
-
-	.globl  sys32_swapoff_wrapper 
-sys32_swapoff_wrapper:
-	llgtr	%r2,%r2			# const char *
-	jg	sys_swapoff		# branch to system call
-
-	.globl  sys32_sysinfo_wrapper 
-sys32_sysinfo_wrapper:
-	llgtr	%r2,%r2			# struct sysinfo_emu31 *
-	jg	sys32_sysinfo		# branch to system call
-
-	.globl  sys32_ipc_wrapper 
-sys32_ipc_wrapper:
-	llgfr	%r2,%r2			# uint
-	lgfr	%r3,%r3			# int
-	lgfr	%r4,%r4			# int
-	lgfr	%r5,%r5			# int
-	llgtr	%r6,%r6			# void *
-	jg	sys32_ipc		# branch to system call
-
-	.globl  sys32_fsync_wrapper 
-sys32_fsync_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	jg	sys_fsync		# branch to system call
-
-#sys32_sigreturn_wrapper		# done in sigreturn_glue 
-
-#sys32_clone_wrapper			# done in clone_glue 
-
-	.globl  sys32_setdomainname_wrapper 
-sys32_setdomainname_wrapper:
-	llgtr	%r2,%r2			# char *
-	lgfr	%r3,%r3			# int
-	jg	sys_setdomainname	# branch to system call
-
-	.globl  sys32_newuname_wrapper 
-sys32_newuname_wrapper:
-	llgtr	%r2,%r2			# struct new_utsname *
-	jg	s390x_newuname		# branch to system call
-
-	.globl  sys32_adjtimex_wrapper 
-sys32_adjtimex_wrapper:
-	llgtr	%r2,%r2			# struct timex_emu31 *
-	jg	sys32_adjtimex		# branch to system call
-
-	.globl  sys32_mprotect_wrapper 
-sys32_mprotect_wrapper:
-	llgtr	%r2,%r2			# unsigned long (actually pointer
-	llgfr	%r3,%r3			# size_t
-	llgfr	%r4,%r4			# unsigned long
-	jg	sys_mprotect		# branch to system call
-
-	.globl  compat_sys_sigprocmask_wrapper 
-compat_sys_sigprocmask_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# compat_old_sigset_t *
-	llgtr	%r4,%r4			# compat_old_sigset_t *
-	jg	compat_sys_sigprocmask		# branch to system call
-
-	.globl  sys32_init_module_wrapper 
-sys32_init_module_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgtr	%r3,%r3			# struct module *
-	jg	sys32_init_module	# branch to system call
-
-	.globl  sys32_delete_module_wrapper 
-sys32_delete_module_wrapper:
-	llgtr	%r2,%r2			# const char *
-	jg	sys32_delete_module	# branch to system call
-
-	.globl  sys32_quotactl_wrapper 
-sys32_quotactl_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# const char *
-	lgfr	%r4,%r4			# int
-	llgtr	%r5,%r5			# caddr_t
-	jg	sys_quotactl		# branch to system call
-
-	.globl  sys32_getpgid_wrapper 
-sys32_getpgid_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	jg	sys_getpgid		# branch to system call
-
-	.globl  sys32_fchdir_wrapper 
-sys32_fchdir_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	jg	sys_fchdir		# branch to system call
-
-	.globl  sys32_bdflush_wrapper 
-sys32_bdflush_wrapper:
-	lgfr	%r2,%r2			# int
-	lgfr	%r3,%r3			# long
-	jg	sys_bdflush		# branch to system call
-
-	.globl  sys32_sysfs_wrapper 
-sys32_sysfs_wrapper:
-	lgfr	%r2,%r2			# int
-	llgfr	%r3,%r3			# unsigned long
-	llgfr	%r4,%r4			# unsigned long
-	jg	sys_sysfs		# branch to system call
-
-	.globl  sys32_personality_wrapper 
-sys32_personality_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	jg	s390x_personality	# branch to system call
-
-	.globl  sys32_setfsuid16_wrapper 
-sys32_setfsuid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
-	jg	sys32_setfsuid16	# branch to system call
-
-	.globl  sys32_setfsgid16_wrapper 
-sys32_setfsgid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
-	jg	sys32_setfsgid16	# branch to system call
-
-	.globl  sys32_llseek_wrapper 
-sys32_llseek_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# unsigned long
-	llgfr	%r4,%r4			# unsigned long
-	llgtr	%r5,%r5			# loff_t *
-	llgfr	%r6,%r6			# unsigned int
-	jg	sys_llseek		# branch to system call
-
-	.globl  sys32_getdents_wrapper 
-sys32_getdents_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# void *
-	llgfr	%r4,%r4			# unsigned int
-	jg	sys32_getdents		# branch to system call
-
-	.globl  sys32_select_wrapper 
-sys32_select_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# fd_set *
-	llgtr	%r4,%r4			# fd_set *
-	llgtr	%r5,%r5			# fd_set *
-	llgtr	%r6,%r6			# struct timeval_emu31 *
-	jg	sys32_select		# branch to system call
-
-	.globl  sys32_flock_wrapper 
-sys32_flock_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# unsigned int
-	jg	sys_flock		# branch to system call
-
-	.globl  sys32_msync_wrapper 
-sys32_msync_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgfr	%r3,%r3			# size_t
-	lgfr	%r4,%r4			# int
-	jg	sys_msync		# branch to system call
-
-	.globl  sys32_readv_wrapper 
-sys32_readv_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgtr	%r3,%r3			# const struct iovec_emu31 *
-	llgfr	%r4,%r4			# unsigned long
-	jg	sys32_readv		# branch to system call
-
-	.globl  sys32_writev_wrapper 
-sys32_writev_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgtr	%r3,%r3			# const struct iovec_emu31 *
-	llgfr	%r4,%r4			# unsigned long
-	jg	sys32_writev		# branch to system call
-
-	.globl  sys32_getsid_wrapper 
-sys32_getsid_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	jg	sys_getsid		# branch to system call
-
-	.globl  sys32_fdatasync_wrapper 
-sys32_fdatasync_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	jg	sys_fdatasync		# branch to system call
-
-#sys32_sysctl_wrapper			# tbd 
-
-	.globl  sys32_mlock_wrapper 
-sys32_mlock_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgfr	%r3,%r3			# size_t
-	jg	sys_mlock		# branch to system call
-
-	.globl  sys32_munlock_wrapper 
-sys32_munlock_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgfr	%r3,%r3			# size_t
-	jg	sys_munlock		# branch to system call
-
-	.globl  sys32_mlockall_wrapper 
-sys32_mlockall_wrapper:
-	lgfr	%r2,%r2			# int
-	jg	sys_mlockall		# branch to system call
-
-#sys32_munlockall_wrapper		# void 
-
-	.globl  sys32_sched_setparam_wrapper 
-sys32_sched_setparam_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	llgtr	%r3,%r3			# struct sched_param *
-	jg	sys_sched_setparam	# branch to system call
-
-	.globl  sys32_sched_getparam_wrapper 
-sys32_sched_getparam_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	llgtr	%r3,%r3			# struct sched_param *
-	jg	sys_sched_getparam	# branch to system call
-
-	.globl  sys32_sched_setscheduler_wrapper 
-sys32_sched_setscheduler_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	lgfr	%r3,%r3			# int
-	llgtr	%r4,%r4			# struct sched_param *
-	jg	sys_sched_setscheduler	# branch to system call
-
-	.globl  sys32_sched_getscheduler_wrapper 
-sys32_sched_getscheduler_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	jg	sys_sched_getscheduler	# branch to system call
-
-#sys32_sched_yield_wrapper		# void 
-
-	.globl  sys32_sched_get_priority_max_wrapper 
-sys32_sched_get_priority_max_wrapper:
-	lgfr	%r2,%r2			# int
-	jg	sys_sched_get_priority_max	# branch to system call
-
-	.globl  sys32_sched_get_priority_min_wrapper 
-sys32_sched_get_priority_min_wrapper:
-	lgfr	%r2,%r2			# int
-	jg	sys_sched_get_priority_min	# branch to system call
-
-	.globl  sys32_sched_rr_get_interval_wrapper 
-sys32_sched_rr_get_interval_wrapper:
-	lgfr	%r2,%r2			# pid_t
-	llgtr	%r3,%r3			# struct compat_timespec *
-	jg	sys32_sched_rr_get_interval	# branch to system call
-
-	.globl  compat_sys_nanosleep_wrapper 
-compat_sys_nanosleep_wrapper:
-	llgtr	%r2,%r2			# struct compat_timespec *
-	llgtr	%r3,%r3			# struct compat_timespec *
-	jg	compat_sys_nanosleep		# branch to system call
-
-	.globl  sys32_mremap_wrapper 
-sys32_mremap_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgfr	%r3,%r3			# unsigned long
-	llgfr	%r4,%r4			# unsigned long
-	llgfr	%r5,%r5			# unsigned long
-	llgfr	%r6,%r6			# unsigned long
-	jg	sys_mremap		# branch to system call
-
-	.globl  sys32_setresuid16_wrapper 
-sys32_setresuid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_uid_emu31_t 
-	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
-	llgfr	%r4,%r4			# __kernel_old_uid_emu31_t 
-	jg	sys32_setresuid16	# branch to system call
-
-	.globl  sys32_getresuid16_wrapper 
-sys32_getresuid16_wrapper:
-	llgtr	%r2,%r2			# __kernel_old_uid_emu31_t *
-	llgtr	%r3,%r3			# __kernel_old_uid_emu31_t *
-	llgtr	%r4,%r4			# __kernel_old_uid_emu31_t *
-	jg	sys32_getresuid16	# branch to system call
-
-	.globl  sys32_poll_wrapper 
-sys32_poll_wrapper:
-	llgtr	%r2,%r2			# struct pollfd * 
-	llgfr	%r3,%r3			# unsigned int 
-	lgfr	%r4,%r4			# long 
-	jg	sys_poll		# branch to system call
-
-	.globl  sys32_nfsservctl_wrapper 
-sys32_nfsservctl_wrapper:
-	lgfr	%r2,%r2			# int 
-	llgtr	%r3,%r3			# struct nfsctl_arg_emu31 * 
-	llgtr	%r4,%r4			# union nfsctl_res_emu31 * 
-	jg	sys32_nfsservctl	# branch to system call
-
-	.globl  sys32_setresgid16_wrapper 
-sys32_setresgid16_wrapper:
-	llgfr	%r2,%r2			# __kernel_old_gid_emu31_t 
-	llgfr	%r3,%r3			# __kernel_old_gid_emu31_t 
-	llgfr	%r4,%r4			# __kernel_old_gid_emu31_t 
-	jg	sys32_setresgid16	# branch to system call
-
-	.globl  sys32_getresgid16_wrapper 
-sys32_getresgid16_wrapper:
-	llgtr	%r2,%r2			# __kernel_old_gid_emu31_t *
-	llgtr	%r3,%r3			# __kernel_old_gid_emu31_t *
-	llgtr	%r4,%r4			# __kernel_old_gid_emu31_t *
-	jg	sys32_getresgid16	# branch to system call
-
-	.globl  sys32_prctl_wrapper 
-sys32_prctl_wrapper:
-	lgfr	%r2,%r2			# int
-	llgfr	%r3,%r3			# unsigned long
-	llgfr	%r4,%r4			# unsigned long
-	llgfr	%r5,%r5			# unsigned long
-	llgfr	%r6,%r6			# unsigned long
-	jg	sys_prctl		# branch to system call
-
-#sys32_rt_sigreturn_wrapper		# done in rt_sigreturn_glue 
-
-	.globl  sys32_rt_sigaction_wrapper 
-sys32_rt_sigaction_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# const struct sigaction_emu31 *
-	llgtr	%r4,%r4			# const struct sigaction_emu31 *
-	llgfr	%r5,%r5			# size_t
-	jg	sys32_rt_sigaction	# branch to system call
-
-	.globl  sys32_rt_sigprocmask_wrapper 
-sys32_rt_sigprocmask_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# old_sigset_emu31 *
-	llgtr	%r4,%r4			# old_sigset_emu31 *
-	jg	sys32_rt_sigprocmask	# branch to system call
-
-	.globl  sys32_rt_sigpending_wrapper 
-sys32_rt_sigpending_wrapper:
-	llgtr	%r2,%r2			# sigset_emu31 *
-	llgfr	%r3,%r3			# size_t
-	jg	sys32_rt_sigpending	# branch to system call
-
-	.globl  sys32_rt_sigtimedwait_wrapper 
-sys32_rt_sigtimedwait_wrapper:
-	llgtr	%r2,%r2			# const sigset_emu31_t *
-	llgtr	%r3,%r3			# siginfo_emu31_t *
-	llgtr	%r4,%r4			# const struct compat_timespec *
-	llgfr	%r5,%r5			# size_t
-	jg	sys32_rt_sigtimedwait	# branch to system call
-
-	.globl  sys32_rt_sigqueueinfo_wrapper 
-sys32_rt_sigqueueinfo_wrapper:
-	lgfr	%r2,%r2			# int
-	lgfr	%r3,%r3			# int
-	llgtr	%r4,%r4			# siginfo_emu31_t *
-	jg	sys32_rt_sigqueueinfo	# branch to system call
-
-#sys32_rt_sigsuspend_wrapper		# done in rt_sigsuspend_glue 
-
-	.globl  sys32_pread64_wrapper 
-sys32_pread64_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# char *
-	llgfr	%r4,%r4			# size_t
-	llgfr	%r5,%r5			# u32
-	llgfr	%r6,%r6			# u32
-	jg	sys32_pread64		# branch to system call
-
-	.globl  sys32_pwrite64_wrapper 
-sys32_pwrite64_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# const char *
-	llgfr	%r4,%r4			# size_t
-	llgfr	%r5,%r5			# u32
-	llgfr	%r6,%r6			# u32
-	jg	sys32_pwrite64		# branch to system call
-
-	.globl  sys32_chown16_wrapper 
-sys32_chown16_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgfr	%r3,%r3			# __kernel_old_uid_emu31_t 
-	llgfr	%r4,%r4			# __kernel_old_gid_emu31_t 
-	jg	sys32_chown16		# branch to system call
-
-	.globl  sys32_getcwd_wrapper 
-sys32_getcwd_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgfr	%r3,%r3			# unsigned long
-	jg	sys_getcwd		# branch to system call
-
-	.globl  sys32_capget_wrapper 
-sys32_capget_wrapper:
-	llgtr	%r2,%r2			# cap_user_header_t
-	llgtr	%r3,%r3			# cap_user_data_t
-	jg	sys_capget		# branch to system call
-
-	.globl  sys32_capset_wrapper 
-sys32_capset_wrapper:
-	llgtr	%r2,%r2			# cap_user_header_t
-	llgtr	%r3,%r3			# const cap_user_data_t
-	jg	sys_capset		# branch to system call
-
-	.globl sys32_sigaltstack_wrapper
-sys32_sigaltstack_wrapper:
-	llgtr	%r2,%r2			# const stack_emu31_t * 
-	llgtr	%r3,%r3			# stack_emu31_t * 
-	jg	sys32_sigaltstack
-
-	.globl  sys32_sendfile_wrapper 
-sys32_sendfile_wrapper:
-	lgfr	%r2,%r2			# int
-	lgfr	%r3,%r3			# int
-	llgtr	%r4,%r4			# __kernel_off_emu31_t *
-	llgfr	%r5,%r5			# size_t
-	jg	sys32_sendfile		# branch to system call
-
-#sys32_vfork_wrapper			# done in vfork_glue 
-
-	.globl  sys32_truncate64_wrapper 
-sys32_truncate64_wrapper:
-	llgtr	%r2,%r2			# const char *
-	lgfr	%r3,%r3			# s32 
-	llgfr	%r4,%r4			# u32 
-	jg	sys32_truncate64	# branch to system call
-
-	.globl  sys32_ftruncate64_wrapper 
-sys32_ftruncate64_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	lgfr	%r3,%r3			# s32 
-	llgfr	%r4,%r4			# u32 
-	jg	sys32_ftruncate64	# branch to system call
-
-	.globl sys32_lchown_wrapper	
-sys32_lchown_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgfr	%r3,%r3			# uid_t
-	llgfr	%r4,%r4			# gid_t
-	jg	sys_lchown		# branch to system call
-
-#sys32_getuid_wrapper			# void			 
-#sys32_getgid_wrapper			# void 
-#sys32_geteuid_wrapper			# void 
-#sys32_getegid_wrapper			# void 
-
-	.globl sys32_setreuid_wrapper
-sys32_setreuid_wrapper:
-	llgfr	%r2,%r2			# uid_t
-	llgfr	%r3,%r3			# uid_t
-	jg	sys_setreuid		# branch to system call
-
-	.globl sys32_setregid_wrapper
-sys32_setregid_wrapper:
-	llgfr	%r2,%r2			# gid_t
-	llgfr	%r3,%r3			# gid_t
-	jg	sys_setregid		# branch to system call
-
-	.globl  sys32_getgroups_wrapper 
-sys32_getgroups_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# gid_t *
-	jg	sys_getgroups		# branch to system call
-
-	.globl  sys32_setgroups_wrapper 
-sys32_setgroups_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# gid_t *
-	jg	sys_setgroups		# branch to system call
-
-	.globl sys32_fchown_wrapper	
-sys32_fchown_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# uid_t
-	llgfr	%r4,%r4			# gid_t
-	jg	sys_fchown		# branch to system call
-
-	.globl sys32_setresuid_wrapper	
-sys32_setresuid_wrapper:
-	llgfr	%r2,%r2			# uid_t
-	llgfr	%r3,%r3			# uid_t
-	llgfr	%r4,%r4			# uid_t
-	jg	sys_setresuid		# branch to system call
-
-	.globl sys32_getresuid_wrapper	
-sys32_getresuid_wrapper:
-	llgtr	%r2,%r2			# uid_t *
-	llgtr	%r3,%r3			# uid_t *
-	llgtr	%r4,%r4			# uid_t *
-	jg	sys_getresuid		# branch to system call
-
-	.globl sys32_setresgid_wrapper	
-sys32_setresgid_wrapper:
-	llgfr	%r2,%r2			# gid_t
-	llgfr	%r3,%r3			# gid_t
-	llgfr	%r4,%r4			# gid_t
-	jg	sys_setresgid		# branch to system call
-
-	.globl sys32_getresgid_wrapper	
-sys32_getresgid_wrapper:
-	llgtr	%r2,%r2			# gid_t *
-	llgtr	%r3,%r3			# gid_t *
-	llgtr	%r4,%r4			# gid_t *
-	jg	sys_getresgid		# branch to system call
-
-	.globl sys32_chown_wrapper	
-sys32_chown_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgfr	%r3,%r3			# uid_t
-	llgfr	%r4,%r4			# gid_t
-	jg	sys_chown		# branch to system call
-
-	.globl sys32_setuid_wrapper	
-sys32_setuid_wrapper:
-	llgfr	%r2,%r2			# uid_t
-	jg	sys_setuid		# branch to system call
-
-	.globl sys32_setgid_wrapper	
-sys32_setgid_wrapper:
-	llgfr	%r2,%r2			# gid_t
-	jg	sys_setgid		# branch to system call
-
-	.globl sys32_setfsuid_wrapper	
-sys32_setfsuid_wrapper:
-	llgfr	%r2,%r2			# uid_t
-	jg	sys_setfsuid		# branch to system call
-
-	.globl sys32_setfsgid_wrapper	
-sys32_setfsgid_wrapper:
-	llgfr	%r2,%r2			# gid_t
-	jg	sys_setfsgid		# branch to system call
-
-	.globl  sys32_pivot_root_wrapper 
-sys32_pivot_root_wrapper:
-	llgtr	%r2,%r2			# const char *
-	llgtr	%r3,%r3			# const char *
-	jg	sys_pivot_root		# branch to system call
-
-	.globl  sys32_mincore_wrapper 
-sys32_mincore_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgfr	%r3,%r3			# size_t
-	llgtr	%r4,%r4			# unsigned char *
-	jg	sys_mincore		# branch to system call
-
-	.globl  sys32_madvise_wrapper 
-sys32_madvise_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgfr	%r3,%r3			# size_t
-	lgfr	%r4,%r4			# int
-	jg	sys_madvise		# branch to system call
-
-	.globl  sys32_getdents64_wrapper 
-sys32_getdents64_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgtr	%r3,%r3			# void *
-	llgfr	%r4,%r4			# unsigned int
-	jg	sys_getdents64		# branch to system call
-
-	.globl  compat_sys_fcntl64_wrapper 
-compat_sys_fcntl64_wrapper:
-	llgfr	%r2,%r2			# unsigned int
-	llgfr	%r3,%r3			# unsigned int 
-	llgfr	%r4,%r4			# unsigned long
-	jg	compat_sys_fcntl64	# branch to system call
-
-	.globl	sys32_stat64_wrapper
-sys32_stat64_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# struct stat64 *
-	llgfr	%r4,%r4			# long
-	jg	sys32_stat64		# branch to system call
-
-	.globl	sys32_lstat64_wrapper
-sys32_lstat64_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# struct stat64 *
-	llgfr	%r4,%r4			# long
-	jg	sys32_lstat64		# branch to system call
-
-	.globl	sys32_stime_wrapper
-sys32_stime_wrapper:
-	llgtr	%r2,%r2			# int *
-	jg	sys_stime		# branch to system call
-
-	.globl  sys32_sysctl_wrapper
-sys32_sysctl_wrapper:
-	llgtr   %r2,%r2                 # struct __sysctl_args32 *
-	jg      sys32_sysctl
-
-	.globl	sys32_fstat64_wrapper
-sys32_fstat64_wrapper:
-	llgfr	%r2,%r2			# unsigned long
-	llgtr	%r3,%r3			# struct stat64 *
-	llgfr	%r4,%r4			# long
-	jg	sys32_fstat64		# branch to system call
-
-	.globl  compat_sys_futex_wrapper 
-compat_sys_futex_wrapper:
-	llgtr	%r2,%r2			# u32 *
-	lgfr	%r3,%r3			# int
-	lgfr	%r4,%r4			# int
-	llgtr	%r5,%r5			# struct compat_timespec *
-	jg	compat_sys_futex	# branch to system call
-
-	.globl	sys32_setxattr_wrapper
-sys32_setxattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	llgtr	%r4,%r4			# void *
-	llgfr	%r5,%r5			# size_t
-	lgfr	%r6,%r6			# int
-	jg	sys_setxattr
-
-	.globl	sys32_lsetxattr_wrapper
-sys32_lsetxattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	llgtr	%r4,%r4			# void *
-	llgfr	%r5,%r5			# size_t
-	lgfr	%r6,%r6			# int
-	jg	sys_lsetxattr
-
-	.globl	sys32_fsetxattr_wrapper
-sys32_fsetxattr_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# char *
-	llgtr	%r4,%r4			# void *
-	llgfr	%r5,%r5			# size_t
-	lgfr	%r6,%r6			# int
-	jg	sys_fsetxattr
-
-	.globl	sys32_getxattr_wrapper
-sys32_getxattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	llgtr	%r4,%r4			# void *
-	llgfr	%r5,%r5			# size_t
-	jg	sys_getxattr
-
-	.globl	sys32_lgetxattr_wrapper
-sys32_lgetxattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	llgtr	%r4,%r4			# void *
-	llgfr	%r5,%r5			# size_t
-	jg	sys_lgetxattr
-
-	.globl	sys32_fgetxattr_wrapper
-sys32_fgetxattr_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# char *
-	llgtr	%r4,%r4			# void *
-	llgfr	%r5,%r5			# size_t
-	jg	sys_fgetxattr
-
-	.globl	sys32_listxattr_wrapper
-sys32_listxattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	llgfr	%r4,%r4			# size_t
-	jg	sys_listxattr
-
-	.globl	sys32_llistxattr_wrapper
-sys32_llistxattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	llgfr	%r4,%r4			# size_t
-	jg	sys_llistxattr
-
-	.globl	sys32_flistxattr_wrapper
-sys32_flistxattr_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# char *
-	llgfr	%r4,%r4			# size_t
-	jg	sys_flistxattr
-
-	.globl	sys32_removexattr_wrapper
-sys32_removexattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	jg	sys_removexattr
-
-	.globl	sys32_lremovexattr_wrapper
-sys32_lremovexattr_wrapper:
-	llgtr	%r2,%r2			# char *
-	llgtr	%r3,%r3			# char *
-	jg	sys_lremovexattr
-
-	.globl	sys32_fremovexattr_wrapper
-sys32_fremovexattr_wrapper:
-	lgfr	%r2,%r2			# int
-	llgtr	%r3,%r3			# char *
-	jg	sys_fremovexattr
-
-	.globl	sys32_sched_setaffinity_wrapper
-sys32_sched_setaffinity_wrapper:
-	lgfr	%r2,%r2			# int
-	llgfr	%r3,%r3			# unsigned int
-	llgtr	%r4,%r4			# unsigned long *
-	jg	sys32_sched_setaffinity
-
-	.globl	sys32_sched_getaffinity_wrapper
-sys32_sched_getaffinity_wrapper:
-	lgfr	%r2,%r2			# int
-	llgfr	%r3,%r3			# unsigned int
-	llgtr	%r4,%r4			# unsigned long *
-	jg	sys32_sched_getaffinity
-
-	.globl  sys32_exit_group_wrapper
-sys32_exit_group_wrapper:
-	lgfr	%r2,%r2			# int
-	jg	sys_exit_group		# branch to system call
-
-	.globl  sys32_set_tid_address_wrapper
-sys32_set_tid_address_wrapper:
-	llgtr	%r2,%r2			# int *
-	jg	sys_set_tid_address	# branch to system call
diff -Nru a/arch/s390x/lib/Makefile b/arch/s390x/lib/Makefile
--- a/arch/s390x/lib/Makefile	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,9 +0,0 @@
-#
-# Makefile for s390-specific library files..
-#
-
-L_TARGET = lib.a
-
-EXTRA_AFLAGS := -traditional
-
-obj-y = delay.o memset.o strcmp.o strncpy.o uaccess.o
diff -Nru a/arch/s390x/lib/delay.c b/arch/s390x/lib/delay.c
--- a/arch/s390x/lib/delay.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,50 +0,0 @@
-/*
- *  arch/s390x/kernel/delay.c
- *    Precise Delay Loops for S390
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *
- *  Derived from "arch/i386/lib/delay.c"
- *    Copyright (C) 1993 Linus Torvalds
- *    Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
- */
-
-#include <linux/config.h>
-#include <linux/sched.h>
-#include <linux/delay.h>
-
-#ifdef CONFIG_SMP
-#include <asm/smp.h>
-#endif
-
-void __delay(unsigned long loops)
-{
-        /*
-         * To end the bloody studid and useless discussion about the
-         * BogoMips number I took the liberty to define the __delay
-         * function in a way that that resulting BogoMips number will
-         * yield the megahertz number of the cpu. The important function
-         * is udelay and that is done using the tod clock. -- martin.
-         */
-        __asm__ __volatile__(
-                "0: brct %0,0b"
-                : /* no outputs */ : "r" (loops/2) );
-}
-
-/*
- * Waits for 'usecs' microseconds using the tod clock
- */
-void __udelay(unsigned long usecs)
-{
-        uint64_t start_cc, end_cc;
-
-        if (usecs == 0)
-                return;
-        asm volatile ("STCK %0" : "=m" (start_cc));
-        do {
-                asm volatile ("STCK %0" : "=m" (end_cc));
-        } while (((end_cc - start_cc)/4096) < usecs);
-}
-
diff -Nru a/arch/s390x/lib/memset.S b/arch/s390x/lib/memset.S
--- a/arch/s390x/lib/memset.S	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,30 +0,0 @@
-/*
- *  arch/s390/lib/memset.S
- *    S390 fast memset routine
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-/*
- * R2 = address to memory area
- * R3 = byte to fill memory with
- * R4 = number of bytes to fill
- */
-        .globl  memset
-memset:
-        LTGR    4,4
-        JZ      memset_end
-        LGR     0,2                    # save pointer to memory area
-        LGR     1,3                    # move pad byte to R1
-        LGR     3,4
-        SGR     4,4                    # no source for MVCLE, only a pad byte
-        SGR     5,5
-        MVCLE   2,4,0(1)               # thats it, MVCLE is your friend
-        JO      .-4
-        LGR     2,0                    # return pointer to mem.
-memset_end:
-        BR      14
-        
-
diff -Nru a/arch/s390x/lib/strcmp.S b/arch/s390x/lib/strcmp.S
--- a/arch/s390x/lib/strcmp.S	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,27 +0,0 @@
-/*
- *  arch/s390/lib/strcmp.S
- *    S390 strcmp routine
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-/*
- * R2 = address of compare string
- * R3 = address of test string
- */
-        .globl   strcmp
-strcmp:
-        SGR     0,0
-        SGR     1,1
-        CLST    2,3
-        JO      .-4
-        JE      strcmp_equal
-        IC      0,0(3)
-        IC      1,0(2)
-        SGR     1,0
-strcmp_equal:
-        LGR     2,1
-        BR      14
-        
diff -Nru a/arch/s390x/lib/strncpy.S b/arch/s390x/lib/strncpy.S
--- a/arch/s390x/lib/strncpy.S	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,30 +0,0 @@
-/*
- *  arch/s390/kernel/strncpy.S
- *    S390 strncpy routine
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-/*
- * R2 = address of destination
- * R3 = address of source string
- * R4 = max number of bytes to copy
- */
-        .globl   strncpy
-strncpy:
-        LGR     1,2            # don't touch address in R2
-	LTR     4,4
-        JZ      strncpy_exit   # 0 bytes -> nothing to do
-	SGR     0,0
-strncpy_loop:
-        ICM     0,1,0(3)       # ICM sets the cc, IC does not
-	LA      3,1(3)
-        STC     0,0(1)
-	LA      1,1(1)
-        JZ      strncpy_exit   # ICM inserted a 0x00
-        BRCTG   4,strncpy_loop # R4 -= 1, jump to strncpy_loop if > 0
-strncpy_exit:
-        BR      14
-
diff -Nru a/arch/s390x/lib/uaccess.S b/arch/s390x/lib/uaccess.S
--- a/arch/s390x/lib/uaccess.S	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,107 +0,0 @@
-/*
- *  arch/s390x/lib/uaccess.S
- *    __copy_{from|to}_user functions.
- *
- *  s390
- *    Copyright (C) 2000,2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Authors(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  These functions have standard call interface
- */
-
-#include <asm/lowcore.h>
-
-        .text
-        .align 4
-        .globl __copy_from_user_asm
-__copy_from_user_asm:
-	lgr	%r5,%r3
-	sacf	512
-0:	mvcle	%r2,%r4,0
-	jo	0b
-1:	sacf	0
-	lgr	%r2,%r5
-	br	%r14
-2:	lghi	%r1,-4096
-	lgr	%r3,%r4
-	slgr	%r3,%r1      # %r3 = %r4 + 4096
-	ngr	%r3,%r1      # %r3 = (%r4 + 4096) & -4096
-	slgr	%r3,%r4      # %r3 = #bytes to next user page boundary
-	clgr	%r5,%r3      # copy crosses next page boundary ?
-	jnh	1b           # no, this page fauled
-	# The page after the current user page might have faulted.
-	# We cant't find out which page because the program check handler
-	# might have callled schedule, destroying all lowcore information.
-	# We retry with the shortened length.
-3:	mvcle	%r2,%r4,0
-	jo	3b
-	j	1b
-        .section __ex_table,"a"
-	.quad	0b,2b
-	.quad	3b,1b
-        .previous
-
-        .align 4
-        .text
-        .globl __copy_to_user_asm
-__copy_to_user_asm:
-	lgr	%r5,%r3
-	sacf	512
-0:	mvcle	%r4,%r2,0
-	jo	0b
-1:	sacf	0
-	lgr	%r2,%r3
-	br	%r14
-2:	lghi	%r1,-4096
-	lgr	%r5,%r4
-	slgr	%r5,%r1      # %r5 = %r4 + 4096
-	ngr	%r5,%r1      # %r5 = (%r4 + 4096) & -4096
-	slgr	%r5,%r4      # %r5 = #bytes to next user page boundary
-	clgr	%r3,%r5      # copy crosses next page boundary ?
-	jnh	1b           # no, the current page fauled
-	# The page after the current user page might have faulted.
-	# We cant't find out which page because the program check handler
-	# might have callled schedule, destroying all lowcore information.
-	# We retry with the shortened length.
-3:	mvcle	%r4,%r2,0
-	jo	3b
-	j	1b
-        .section __ex_table,"a"
-	.quad	0b,2b
-	.quad	3b,1b
-        .previous
-
-        .align 4
-        .text
-        .globl __clear_user_asm
-__clear_user_asm:
-	lgr	%r4,%r2
-	lgr	%r5,%r3
-	sgr	%r2,%r2
-	sgr	%r3,%r3
-	sacf	512
-0:	mvcle	%r4,%r2,0
-	jo	0b
-1:	sacf	0
-	br	%r14
-2:	lgr	%r2,%r5
-	lghi	%r1,-4096
-	slgr	%r5,%r1      # %r5 = %r4 + 4096
-	ngr	%r5,%r1      # %r5 = (%r4 + 4096) & -4096
-	slgr	%r5,%r4      # %r5 = #bytes to next user page boundary
-	clgr	%r2,%r5      # copy crosses next page boundary ?
-	jnh	1b           # no, the current page fauled
-	# The page after the current user page might have faulted.
-	# We cant't find out which page because the program check handler
-	# might have callled schedule, destroying all lowcore information.
-	# We retry with the shortened length.
-	slgr	%r2,%r5
-3:	mvcle	%r4,%r2,0
-	jo	3b
-	j	1b
-4:	algr	%r2,%r5
-	j	1b
-        .section __ex_table,"a"
-	.quad	0b,2b
-        .quad	3b,4b
-        .previous
diff -Nru a/arch/s390x/mm/Makefile b/arch/s390x/mm/Makefile
--- a/arch/s390x/mm/Makefile	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,5 +0,0 @@
-#
-# Makefile for the linux s390-specific parts of the memory manager.
-#
-
-obj-y	 := init.o fault.o ioremap.o extable.o
diff -Nru a/arch/s390x/mm/extable.c b/arch/s390x/mm/extable.c
--- a/arch/s390x/mm/extable.c	Sat Apr 19 19:51:30 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,34 +0,0 @@
-/*
- *  arch/s390/mm/extable.c
- *
- *  S390 version
- *
- *  identical to arch/i386/mm/extable.c
- */
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/spinlock.h>
-#include <asm/uaccess.h>
-
-/* Simple binary search */
-const struct exception_table_entry *
-search_extable(const struct exception_table_entry *first,
-	       const struct exception_table_entry *last,
-	       unsigned long value)
-{
-	while (first <= last) {
-		const struct exception_table_entry *mid;
-		long diff;
-
-		mid = (last - first) / 2 + first;
-		diff = mid->insn - value;
-		if (diff == 0)
-			return mid;
-		else if (diff < 0)
-			first = mid+1;
-		else
-			last = mid-1;
-	}
-	return NULL;
-}
diff -Nru a/arch/s390x/mm/fault.c b/arch/s390x/mm/fault.c
--- a/arch/s390x/mm/fault.c	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,480 +0,0 @@
-/*
- *  arch/s390/mm/fault.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com)
- *               Ulrich Weigand (uweigand@de.ibm.com)
- *
- *  Derived from "arch/i386/mm/fault.c"
- *    Copyright (C) 1995  Linus Torvalds
- */
-
-#include <linux/config.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/init.h>
-#include <linux/console.h>
-#include <linux/module.h>
-
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/hardirq.h>
-
-#ifdef CONFIG_SYSCTL
-extern int sysctl_userprocess_debug;
-#endif
-
-extern void die(const char *,struct pt_regs *,long);
-
-extern spinlock_t timerlist_lock;
-
-/*
- * Unlock any spinlocks which will prevent us from getting the
- * message out (timerlist_lock is acquired through the
- * console unblank code)
- */
-void bust_spinlocks(int yes)
-{
-	if (yes) {
-		oops_in_progress = 1;
-	} else {
-		int loglevel_save = console_loglevel;
-		oops_in_progress = 0;
-		console_unblank();
-		/*
-		 * OK, the message is on the console.  Now we call printk()
-		 * without oops_in_progress set so that printk will give klogd
-		 * a poke.  Hold onto your hats...
-		 */
-		console_loglevel = 15;
-		printk(" ");
-		console_loglevel = loglevel_save;
-	}
-}
-
-/*
- * Check which address space is addressed by the access
- * register in S390_lowcore.exc_access_id.
- * Returns 1 for user space and 0 for kernel space.
- */
-static int __check_access_register(struct pt_regs *regs, int error_code)
-{
-	int areg = S390_lowcore.exc_access_id;
-
-	if (areg == 0)
-		/* Access via access register 0 -> kernel address */
-		return 0;
-	if (regs && areg < NUM_ACRS && regs->acrs[areg] <= 1)
-		/*
-		 * access register contains 0 -> kernel address,
-		 * access register contains 1 -> user space address
-		 */
-		return regs->acrs[areg];
-
-	/* Something unhealthy was done with the access registers... */
-	die("page fault via unknown access register", regs, error_code);
-	do_exit(SIGKILL);
-	return 0;
-}
-
-/*
- * Check which address space the address belongs to.
- * Returns 1 for user space and 0 for kernel space.
- */
-static inline int check_user_space(struct pt_regs *regs, int error_code)
-{
-	/*
-	 * The lowest two bits of S390_lowcore.trans_exc_code indicate
-	 * which paging table was used:
-	 *   0: Primary Segment Table Descriptor
-	 *   1: STD determined via access register
-	 *   2: Secondary Segment Table Descriptor
-	 *   3: Home Segment Table Descriptor
-	 */
-	int descriptor = S390_lowcore.trans_exc_code & 3;
-	if (descriptor == 1)
-		return __check_access_register(regs, error_code);
-	return descriptor >> 1;
-}
-		
-/*
- * Send SIGSEGV to task.  This is an external routine
- * to keep the stack usage of do_page_fault small.
- */
-static void force_sigsegv(struct pt_regs *regs, unsigned long error_code,
-			  int si_code, unsigned long address)
-{
-	struct siginfo si;
-
-#if defined(CONFIG_SYSCTL) || defined(CONFIG_PROCESS_DEBUG)
-#if defined(CONFIG_SYSCTL)
-	if (sysctl_userprocess_debug)
-#endif
-	{
-		printk("User process fault: interruption code 0x%lX\n",
-		       error_code);
-		printk("failing address: %lX\n", address);
-		show_regs(regs);
-	}
-#endif
-	si.si_signo = SIGSEGV;
-	si.si_code = si_code;
-	si.si_addr = (void *) address;
-	force_sig_info(SIGSEGV, &si, current);
-}
-
-/*
- * This routine handles page faults.  It determines the address,
- * and the problem, and then passes it off to one of the appropriate
- * routines.
- *
- * error_code:
- *   04       Protection           ->  Write-Protection  (suprression)
- *   10       Segment translation  ->  Not present       (nullification)
- *   11       Page translation     ->  Not present       (nullification)
- *   3b       Region third trans.  ->  Not present       (nullification)
- */
-extern inline void do_exception(struct pt_regs *regs, unsigned long error_code)
-{
-        struct task_struct *tsk;
-        struct mm_struct *mm;
-        struct vm_area_struct * vma;
-        unsigned long address;
-	int user_address;
-	const struct exception_table_entry *fixup;
-	int si_code = SEGV_MAPERR;
-
-        tsk = current;
-        mm = tsk->mm;
-	
-	/* 
-         * Check for low-address protection.  This needs to be treated
-	 * as a special case because the translation exception code 
-	 * field is not guaranteed to contain valid data in this case.
-	 */
-	if (error_code == 4 && !(S390_lowcore.trans_exc_code & 4)) {
-
-		/* Low-address protection hit in kernel mode means 
-		   NULL pointer write access in kernel mode.  */
- 		if (!(regs->psw.mask & PSW_MASK_PSTATE)) {
-			address = 0;
-			user_address = 0;
-			goto no_context;
-		}
-
-		/* Low-address protection hit in user mode 'cannot happen'.  */
-		die ("Low-address protection", regs, error_code);
-        	do_exit(SIGKILL);
-	}
-
-        /* 
-         * get the failing address 
-         * more specific the segment and page table portion of 
-         * the address 
-         */
-        address = S390_lowcore.trans_exc_code & -4096L;
-	user_address = check_user_space(regs, error_code);
-
-	/*
-	 * Verify that the fault happened in user space, that
-	 * we are not in an interrupt and that there is a 
-	 * user context.
-	 */
-        if (user_address == 0 || in_interrupt() || !mm)
-                goto no_context;
-
-	/*
-	 * When we get here, the fault happened in the current
-	 * task's user address space, so we can switch on the
-	 * interrupts again and then search the VMAs
-	 */
-	local_irq_enable();
-
-        down_read(&mm->mmap_sem);
-
-        vma = find_vma(mm, address);
-        if (!vma)
-                goto bad_area;
-        if (vma->vm_start <= address) 
-                goto good_area;
-        if (!(vma->vm_flags & VM_GROWSDOWN))
-                goto bad_area;
-        if (expand_stack(vma, address))
-                goto bad_area;
-/*
- * Ok, we have a good vm_area for this memory access, so
- * we can handle it..
- */
-good_area:
-	si_code = SEGV_ACCERR;
-	if (error_code != 4) {
-		/* page not present, check vm flags */
-		if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE)))
-			goto bad_area;
-	} else {
-		if (!(vma->vm_flags & VM_WRITE))
-			goto bad_area;
-	}
-
-survive:
-	/*
-	 * If for any reason at all we couldn't handle the fault,
-	 * make sure we exit gracefully rather than endlessly redo
-	 * the fault.
-	 */
-	switch (handle_mm_fault(mm, vma, address, error_code == 4)) {
-	case VM_FAULT_MINOR:
-		tsk->min_flt++;
-		break;
-	case VM_FAULT_MAJOR:
-		tsk->maj_flt++;
-		break;
-	case VM_FAULT_SIGBUS:
-		goto do_sigbus;
-	case VM_FAULT_OOM:
-		goto out_of_memory;
-	default:
-		BUG();
-	}
-
-        up_read(&mm->mmap_sem);
-        return;
-
-/*
- * Something tried to access memory that isn't in our memory map..
- * Fix it, but check if it's kernel or user first..
- */
-bad_area:
-        up_read(&mm->mmap_sem);
-
-        /* User mode accesses just cause a SIGSEGV */
-        if (regs->psw.mask & PSW_MASK_PSTATE) {
-                tsk->thread.prot_addr = address;
-                tsk->thread.trap_no = error_code;
-		force_sigsegv(regs, error_code, si_code, address);
-                return;
-	}
-
-no_context:
-        /* Are we prepared to handle this kernel fault?  */
-	fixup = search_exception_tables(regs->psw.addr);
-	if (fixup) {
-		regs->psw.addr = fixup->fixup;
-                return;
-        }
-
-/*
- * Oops. The kernel tried to access some bad page. We'll have to
- * terminate things with extreme prejudice.
- */
-        if (user_address == 0)
-                printk(KERN_ALERT "Unable to handle kernel pointer dereference"
-        	       " at virtual kernel address %016lx\n", address);
-        else
-                printk(KERN_ALERT "Unable to handle kernel paging request"
-		       " at virtual user address %016lx\n", address);
-
-        die("Oops", regs, error_code);
-        do_exit(SIGKILL);
-
-
-/*
- * We ran out of memory, or some other thing happened to us that made
- * us unable to handle the page fault gracefully.
-*/
-out_of_memory:
-	up_read(&mm->mmap_sem);
-	if (tsk->pid == 1) {
-		yield();
-		goto survive;
-	}
-	printk("VM: killing process %s\n", tsk->comm);
-	if (regs->psw.mask & PSW_MASK_PSTATE)
-		do_exit(SIGKILL);
-	goto no_context;
-
-do_sigbus:
-	up_read(&mm->mmap_sem);
-
-	/*
-	 * Send a sigbus, regardless of whether we were in kernel
-	 * or user mode.
-	 */
-        tsk->thread.prot_addr = address;
-        tsk->thread.trap_no = error_code;
-	force_sig(SIGBUS, tsk);
-
-	/* Kernel mode? Handle exceptions or die */
-	if (!(regs->psw.mask & PSW_MASK_PSTATE))
-		goto no_context;
-}
-
-void do_protection_exception(struct pt_regs *regs, unsigned long error_code)
-{
-	regs->psw.addr -= (error_code >> 16);
-	do_exception(regs, 4);
-}
-
-void do_segment_exception(struct pt_regs *regs, unsigned long error_code)
-{
-	do_exception(regs, 0x10);
-}
-
-void do_page_exception(struct pt_regs *regs, unsigned long error_code)
-{
-	do_exception(regs, 0x11);
-}
-
-void do_region_exception(struct pt_regs *regs, unsigned long error_code)
-{
-	do_exception(regs, 0x3b);
-}
-
-#ifdef CONFIG_PFAULT
-/*
- * 'pfault' pseudo page faults routines.
- */
-static int pfault_disable = 0;
-
-static int __init nopfault(char *str)
-{
-	pfault_disable = 1;
-	return 1;
-}
-
-__setup("nopfault", nopfault);
-
-typedef struct {
-	__u16 refdiagc;
-	__u16 reffcode;
-	__u16 refdwlen;
-	__u16 refversn;
-	__u64 refgaddr;
-	__u64 refselmk;
-	__u64 refcmpmk;
-	__u64 reserved;
-} __attribute__ ((packed)) pfault_refbk_t;
-
-typedef struct _pseudo_wait_t {
-       struct _pseudo_wait_t *next;
-       wait_queue_head_t queue;
-       unsigned long address;
-       int resolved;
-} pseudo_wait_t;
-
-int pfault_init(void)
-{
-	pfault_refbk_t refbk =
-	{ 0x258, 0, 5, 2, __LC_KERNEL_STACK, 1ULL << 48, 1ULL << 48,
-          0x8000000000000000ULL };
-        int rc;
-
-	if (pfault_disable)
-		return -1;
-        __asm__ __volatile__(
-                "    diag  %1,%0,0x258\n"
-		"0:  j     2f\n"
-		"1:  la    %0,8\n"
-		"2:\n"
-		".section __ex_table,\"a\"\n"
-		"   .align 4\n"
-		"   .quad  0b,1b\n"
-		".previous"
-                : "=d" (rc) : "a" (&refbk) : "cc" );
-	__ctl_set_bit(0, 9);
-        return rc;
-}
-
-void pfault_fini(void)
-{
-	pfault_refbk_t refbk =
-	{ 0x258, 1, 5, 2, 0ULL, 0ULL, 0ULL, 0ULL };
-
-	if (pfault_disable)
-		return;
-	__ctl_clear_bit(0, 9);
-        __asm__ __volatile__(
-                "    diag  %0,0,0x258\n"
-		"0:\n"
-		".section __ex_table,\"a\"\n"
-		"   .align 4\n"
-		"   .quad  0b,0b\n"
-		".previous"
-		: : "a" (&refbk) : "cc" );
-}
-
-asmlinkage void
-pfault_interrupt(struct pt_regs *regs, __u16 error_code)
-{
-	struct task_struct *tsk;
-	wait_queue_head_t queue;
-	wait_queue_head_t *qp;
-	__u16 subcode;
-
-	/*
-	 * Get the external interruption subcode & pfault
-	 * initial/completion signal bit. VM stores this 
-	 * in the 'cpu address' field associated with the
-         * external interrupt. 
-	 */
-	subcode = S390_lowcore.cpu_addr;
-	if ((subcode & 0xff00) != 0x0600)
-		return;
-
-	/*
-	 * Get the token (= address of kernel stack of affected task).
-	 */
-	tsk = (struct task_struct *)
-		(*((unsigned long *) __LC_PFAULT_INTPARM) - THREAD_SIZE);
-
-	/*
-	 * We got all needed information from the lowcore and can
-	 * now safely switch on interrupts.
-	 */
-	if (regs->psw.mask & PSW_MASK_PSTATE)
-		local_irq_enable();
-
-	if (subcode & 0x0080) {
-		/* signal bit is set -> a page has been swapped in by VM */
-		qp = (wait_queue_head_t *)
-			xchg(&tsk->thread.pfault_wait, -1);
-		if (qp != NULL) {
-			/* Initial interrupt was faster than the completion
-			 * interrupt. pfault_wait is valid. Set pfault_wait
-			 * back to zero and wake up the process. This can
-			 * safely be done because the task is still sleeping
-			 * and can't procude new pfaults. */
-			tsk->thread.pfault_wait = 0ULL;
-			wake_up(qp);
-		}
-	} else {
-		/* signal bit not set -> a real page is missing. */
-                init_waitqueue_head (&queue);
-		qp = (wait_queue_head_t *)
-			xchg(&tsk->thread.pfault_wait, (addr_t) &queue);
-		if (qp != NULL) {
-			/* Completion interrupt was faster than the initial
-			 * interrupt (swapped in a -1 for pfault_wait). Set
-			 * pfault_wait back to zero and exit. This can be
-			 * done safely because tsk is running in kernel 
-			 * mode and can't produce new pfaults. */
-			tsk->thread.pfault_wait = 0ULL;
-		}
-
-                /* go to sleep */
-                wait_event(queue, tsk->thread.pfault_wait == 0ULL);
-	}
-}
-#endif
-
diff -Nru a/arch/s390x/mm/init.c b/arch/s390x/mm/init.c
--- a/arch/s390x/mm/init.c	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,238 +0,0 @@
-/*
- *  arch/s390/mm/init.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hpenner@de.ibm.com)
- *
- *  Derived from "arch/i386/mm/init.c"
- *    Copyright (C) 1995  Linus Torvalds
- */
-
-#include <linux/config.h>
-#include <linux/signal.h>
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/types.h>
-#include <linux/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/swap.h>
-#include <linux/smp.h>
-#include <linux/init.h>
-#ifdef CONFIG_BLK_DEV_INITRD
-#include <linux/blk.h>
-#endif
-#include <linux/pagemap.h>
-#include <linux/bootmem.h>
-
-#include <asm/processor.h>
-#include <asm/system.h>
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>
-#include <asm/pgalloc.h>
-#include <asm/dma.h>
-#include <asm/lowcore.h>
-#include <asm/tlb.h>
-#include <asm/tlbflush.h>
-
-struct mmu_gather mmu_gathers[NR_CPUS];
-
-pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__((__aligned__(PAGE_SIZE)));
-char  empty_zero_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
-
-void show_mem(void)
-{
-        int i, total = 0,reserved = 0;
-        int shared = 0, cached = 0;
-
-        printk("Mem-info:\n");
-        show_free_areas();
-        printk("Free swap:       %6dkB\n",nr_swap_pages<<(PAGE_SHIFT-10));
-        i = max_mapnr;
-        while (i-- > 0) {
-                total++;
-                if (PageReserved(mem_map+i))
-                        reserved++;
-                else if (PageSwapCache(mem_map+i))
-                        cached++;
-                else if (page_count(mem_map+i))
-                        shared += atomic_read(&mem_map[i].count) - 1;
-        }
-        printk("%d pages of RAM\n",total);
-        printk("%d reserved pages\n",reserved);
-        printk("%d pages shared\n",shared);
-        printk("%d pages swap cached\n",cached);
-}
-
-/* References to section boundaries */
-
-extern unsigned long _text;
-extern unsigned long _etext;
-extern unsigned long _edata;
-extern unsigned long __bss_start;
-extern unsigned long _end;
-
-extern unsigned long __init_begin;
-extern unsigned long __init_end;
-
-/*
- * paging_init() sets up the page tables
- */
-
-unsigned long last_valid_pfn;
-
-void __init paging_init(void)
-{
-        pgd_t * pg_dir;
-	pmd_t * pm_dir;
-        pte_t * pt_dir;
-        pte_t   pte;
-	int     i,j,k;
-        unsigned long pfn = 0;
-        unsigned long pgdir_k = (__pa(swapper_pg_dir) & PAGE_MASK) |
-          _KERN_REGION_TABLE;
-	static const int ssm_mask = 0x04000000L;
-
-	unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
-	unsigned long dma_pfn, high_pfn;
-
-	dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT;
-	high_pfn = max_low_pfn;
-
-	if (dma_pfn > high_pfn)
-		zones_size[ZONE_DMA] = high_pfn;
-	else {
-		zones_size[ZONE_DMA] = dma_pfn;
-		zones_size[ZONE_NORMAL] = high_pfn - dma_pfn;
-	}
-
-	/* Initialize mem_map[].  */
-	free_area_init(zones_size);
-
-
-	/*
-	 * map whole physical memory to virtual memory (identity mapping) 
-	 */
-
-        pg_dir = swapper_pg_dir;
-	
-        for (i = 0 ; i < PTRS_PER_PGD ; i++,pg_dir++) {
-
-                if (pfn >= max_low_pfn) {
-                        pgd_clear(pg_dir);
-                        continue;
-                }          
-        
-	        pm_dir = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE*4);
-                pgd_populate(&init_mm, pg_dir, pm_dir);
-
-                for (j = 0 ; j < PTRS_PER_PMD ; j++,pm_dir++) {
-                        if (pfn >= max_low_pfn) {
-                                pmd_clear(pm_dir);
-                                continue; 
-                        }          
-                        
-                        pt_dir = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-                        pmd_populate_kernel(&init_mm, pm_dir, pt_dir);
-	
-                        for (k = 0 ; k < PTRS_PER_PTE ; k++,pt_dir++) {
-                                pte = pfn_pte(pfn, PAGE_KERNEL);
-                                if (pfn >= max_low_pfn) {
-                                        pte_clear(&pte); 
-                                        continue;
-                                }
-                                set_pte(pt_dir, pte);
-                                pfn++;
-                        }
-                }
-        }
-        
-        /* enable virtual mapping in kernel mode */
-        __asm__ __volatile__("lctlg 1,1,%0\n\t"
-                             "lctlg 7,7,%0\n\t"
-                             "lctlg 13,13,%0\n\t"
-                             "ssm   %1"
-			     : :"m" (pgdir_k), "m" (ssm_mask));
-
-        local_flush_tlb();
-
-        return;
-}
-
-void __init mem_init(void)
-{
-	unsigned long codesize, reservedpages, datasize, initsize;
-
-        max_mapnr = num_physpages = max_low_pfn;
-        high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
-
-        /* clear the zero-page */
-        memset(empty_zero_page, 0, PAGE_SIZE);
-
-	/* this will put all low memory onto the freelists */
-	totalram_pages += free_all_bootmem();
-
-	reservedpages = 0;
-
-	codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-	datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-	initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
-        printk("Memory: %luk/%luk available (%ldk kernel code, %ldk reserved, %ldk data, %ldk init)\n",
-                (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-                max_mapnr << (PAGE_SHIFT-10),
-                codesize >> 10,
-                reservedpages << (PAGE_SHIFT-10),
-                datasize >>10,
-                initsize >> 10);
-}
-
-void free_initmem(void)
-{
-        unsigned long addr;
-
-        addr = (unsigned long)(&__init_begin);
-        for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
-		ClearPageReserved(virt_to_page(addr));
-		set_page_count(virt_to_page(addr), 1);
-		free_page(addr);
-		totalram_pages++;
-        }
-        printk ("Freeing unused kernel memory: %ldk freed\n",
-		((unsigned long)&__init_end - (unsigned long)&__init_begin) >> 10);
-}
-
-#ifdef CONFIG_BLK_DEV_INITRD
-void free_initrd_mem(unsigned long start, unsigned long end)
-{
-        if (start < end)
-                printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
-	for (; start < end; start += PAGE_SIZE) {
-                ClearPageReserved(virt_to_page(start));
-                set_page_count(virt_to_page(start), 1);
-		free_page(start);
-		totalram_pages++;
-	}
-}
-#endif
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-indent-level: 4 
- * c-brace-imaginary-offset: 0
- * c-brace-offset: -4
- * c-argdecl-indent: 4
- * c-label-offset: -4
- * c-continued-statement-offset: 4
- * c-continued-brace-offset: 0
- * indent-tabs-mode: nil
- * tab-width: 8
- * End:
- */
diff -Nru a/arch/s390x/mm/ioremap.c b/arch/s390x/mm/ioremap.c
--- a/arch/s390x/mm/ioremap.c	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,138 +0,0 @@
-/*
- *  arch/s390/mm/ioremap.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com)
- *
- *  Derived from "arch/i386/mm/extable.c"
- *    (C) Copyright 1995 1996 Linus Torvalds
- *
- * Re-map IO memory to kernel address space so that we can access it.
- * This is needed for high PCI addresses that aren't mapped in the
- * 640k-1MB IO memory area on PC's
- */
-
-#include <linux/vmalloc.h>
-#include <linux/mm.h>
-#include <asm/io.h>
-#include <asm/pgalloc.h>
-#include <asm/cacheflush.h>
-#include <asm/tlbflush.h>
-
-static inline void remap_area_pte(pte_t * pte, unsigned long address, unsigned long size,
-        unsigned long phys_addr, unsigned long flags)
-{
-        unsigned long end;
-        unsigned long pfn;
-
-        address &= ~PMD_MASK;
-        end = address + size;
-        if (end > PMD_SIZE)
-                end = PMD_SIZE;
-	if (address >= end)
-		BUG();
-        pfn = phys_addr >> PAGE_SHIFT;
-        do {
-                if (!pte_none(*pte)) {
-                        printk("remap_area_pte: page already exists\n");
-			BUG();
-		}
-                set_pte(pte, pfn_pte(pfn, __pgprot(_PAGE_PRESENT | flags)));
-                address += PAGE_SIZE;
-                pfn++;
-                pte++;
-        } while (address && (address < end));
-}
-
-static inline int remap_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size,
-        unsigned long phys_addr, unsigned long flags)
-{
-	unsigned long end;
-
-	address &= ~PGDIR_MASK;
-	end = address + size;
-	if (end > PGDIR_SIZE)
-		end = PGDIR_SIZE;
-	phys_addr -= address;
-	if (address >= end)
-		BUG();
-	do {
-		pte_t * pte = pte_alloc_kernel(&init_mm, pmd, address);
-		if (!pte)
-			return -ENOMEM;
-		remap_area_pte(pte, address, end - address, address + phys_addr, flags);
-		address = (address + PMD_SIZE) & PMD_MASK;
-		pmd++;
-	} while (address && (address < end));
-	return 0;
-}
-
-static int remap_area_pages(unsigned long address, unsigned long phys_addr,
-				 unsigned long size, unsigned long flags)
-{
-	int error;
-	pgd_t * dir;
-	unsigned long end = address + size;
-
-	phys_addr -= address;
-	dir = pgd_offset(&init_mm, address);
-	flush_cache_all();
-	if (address >= end)
-		BUG();
-	spin_lock(&init_mm.page_table_lock);
-	do {
-		pmd_t *pmd;
-		pmd = pmd_alloc(&init_mm, dir, address);
-		error = -ENOMEM;
-		if (!pmd)
-			break;
-		if (remap_area_pmd(pmd, address, end - address,
-					 phys_addr + address, flags))
-			break;
-		error = 0;
-		address = (address + PGDIR_SIZE) & PGDIR_MASK;
-		dir++;
-	} while (address && (address < end));
-	spin_unlock(&init_mm.page_table_lock);
-	flush_tlb_all();
-	return 0;
-}
-
-/*
- * Generic mapping function (not visible outside):
- */
-
-/*
- * Remap an arbitrary physical address space into the kernel virtual
- * address space. Needed when the kernel wants to access high addresses
- * directly.
- */
-void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
-{
-	void * addr;
-	struct vm_struct * area;
-
-	if (phys_addr < virt_to_phys(high_memory))
-		return phys_to_virt(phys_addr);
-	if (phys_addr & ~PAGE_MASK)
-		return NULL;
-	size = PAGE_ALIGN(size);
-	if (!size || size > phys_addr + size)
-		return NULL;
-	area = get_vm_area(size, VM_IOREMAP);
-	if (!area)
-		return NULL;
-	addr = area->addr;
-	if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) {
-		vfree(addr);
-		return NULL;
-	}
-	return addr;
-}
-
-void iounmap(void *addr)
-{
-	if (addr > high_memory)
-		return vfree(addr);
-}
diff -Nru a/arch/s390x/vmlinux.lds.S b/arch/s390x/vmlinux.lds.S
--- a/arch/s390x/vmlinux.lds.S	Sat Apr 19 19:51:30 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,118 +0,0 @@
-/*	
- * Written by Martin Schwidefsky (schwidefsky@de.ibm.com)
- */
-
-#include <asm-generic/vmlinux.lds.h>
-
-OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390")
-OUTPUT_ARCH(s390:64-bit)
-ENTRY(_start)
-jiffies = jiffies_64;
-SECTIONS
-{
-  . = 0x00000000;
-  _text = .;			/* Text and read-only data */
-  .text : {
-	*(.text)
-	*(.fixup)
-	*(.gnu.warning)
-	} = 0x0700
-
-  _etext = .;			/* End of text section */
-
-  . = ALIGN(16);		/* Exception table */
-  __start___ex_table = .;
-  __ex_table : { *(__ex_table) }
-  __stop___ex_table = .;
-
-  RODATA
-	
-#ifdef CONFIG_SHARED_KERNEL
-  . = ALIGN(1048576);		/* VM shared segments are 1MB aligned */
-
-  _eshared = .;			/* End of shareable data */
-#endif
-
-  .data : {			/* Data */
-	*(.data)
-	CONSTRUCTORS
-	}
-
-  . = ALIGN(4096);
-  __nosave_begin = .;
-  .data_nosave : { *(.data.nosave) }
-  . = ALIGN(4096);
-  __nosave_end = .;
-
-  . = ALIGN(4096);
-  .data.page_aligned : { *(.data.idt) }
-
-  . = ALIGN(32);
-  .data.cacheline_aligned : { *(.data.cacheline_aligned) }
-
-  _edata = .;			/* End of data section */
-
-  . = ALIGN(8192);		/* init_task */
-  .data.init_task : { *(.data.init_task) }
-
-  /* will be freed after init */
-  . = ALIGN(4096);		/* Init code and data */
-  __init_begin = .;
-  .init.text : { *(.init.text) }
-  .init.data : { *(.init.data) }
-  . = ALIGN(256);
-  __setup_start = .;
-  .init.setup : { *(.init.setup) }
-  __setup_end = .;
-  __start___param = .;
-  __param : { *(__param) }
-  __stop___param = .;
-  __initcall_start = .;
-  .initcall.init : {
-	*(.initcall1.init) 
-	*(.initcall2.init) 
-	*(.initcall3.init) 
-	*(.initcall4.init) 
-	*(.initcall5.init) 
-	*(.initcall6.init) 
-	*(.initcall7.init)
-  }
-  __initcall_end = .;
-  __con_initcall_start = .;
-  .con_initcall.init : { *(.con_initcall.init) }
-  __con_initcall_end = .;
-  . = ALIGN(256);
-  __initramfs_start = .;
-  .init.ramfs : { *(.init.initramfs) }
-  __initramfs_end = .;
-  . = ALIGN(256);
-  __per_cpu_start = .;
-  .data.percpu  : { *(.data.percpu) }
-  __per_cpu_end = .;
-  . = ALIGN(4096);
-  __init_end = .;
-  /* freed after init ends here */
-
-  __bss_start = .;		/* BSS */
-  .bss : { *(.bss) }
-  __bss_stop = .;
-
-  _end = . ;
-
-  /* Sections to be discarded */
-  /DISCARD/ : {
-	*(.exit.text)
-	*(.exit.data)
-	*(.exitcall.exit)
-	*(.eh_frame)
-	}
-
-  /* Stabs debugging sections.  */
-  .stab 0 : { *(.stab) }
-  .stabstr 0 : { *(.stabstr) }
-  .stab.excl 0 : { *(.stab.excl) }
-  .stab.exclstr 0 : { *(.stab.exclstr) }
-  .stab.index 0 : { *(.stab.index) }
-  .stab.indexstr 0 : { *(.stab.indexstr) }
-  .comment 0 : { *(.comment) }
-}
diff -Nru a/arch/sparc/Makefile b/arch/sparc/Makefile
--- a/arch/sparc/Makefile	Sat Apr 19 19:51:28 2003
+++ b/arch/sparc/Makefile	Sat Apr 19 19:51:28 2003
@@ -30,6 +30,7 @@
 CFLAGS := $(CFLAGS) -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
 else
 CFLAGS := $(CFLAGS) -m32 -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
+AFLAGS := $(AFLAGS) -m32
 endif
 
 #LDFLAGS_vmlinux = -N -Ttext 0xf0004000
diff -Nru a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c
--- a/arch/sparc/kernel/process.c	Sat Apr 19 19:51:28 2003
+++ b/arch/sparc/kernel/process.c	Sat Apr 19 19:51:28 2003
@@ -523,9 +523,16 @@
 	new_stack = (((struct reg_window *) childregs) - 1);
 	copy_regwin(new_stack, (((struct reg_window *) regs) - 1));
 
+	/*
+	 * A new process must start with interrupts closed in 2.5,
+	 * because this is how Mingo's scheduler works (see schedule_tail
+	 * and finish_arch_switch). If we do not do it, a timer interrupt hits
+	 * before we unlock, attempts to re-take the rq->lock, and then we die.
+	 * Thus, kpsr|=PSR_PIL.
+	 */
 	ti->ksp = (unsigned long) new_stack;
 	ti->kpc = (((unsigned long) ret_from_fork) - 0x8);
-	ti->kpsr = current->thread.fork_kpsr;
+	ti->kpsr = current->thread.fork_kpsr | PSR_PIL;
 	ti->kwim = current->thread.fork_kwim;
 
 	/* This is used for sun4c only */
diff -Nru a/arch/sparc/kernel/signal.c b/arch/sparc/kernel/signal.c
--- a/arch/sparc/kernel/signal.c	Sat Apr 19 19:51:49 2003
+++ b/arch/sparc/kernel/signal.c	Sat Apr 19 19:51:49 2003
@@ -56,7 +56,7 @@
 	struct reg_window	sig_window;
 	int			sig_num;
 	int			sig_code;
-	struct sigcontext	*sig_scptr;
+	struct sigcontext __user *sig_scptr;
 	int			sig_address;
 	struct sigcontext	sig_context;
 	unsigned int		extramask[_NSIG_WORDS - 1];
@@ -71,8 +71,8 @@
 struct new_signal_frame {
 	struct sparc_stackf	ss;
 	__siginfo_t		info;
-	__siginfo_fpu_t		*fpu_save;
-	unsigned long		insns [2] __attribute__ ((aligned (8)));
+	__siginfo_fpu_t __user	*fpu_save;
+	unsigned long		insns[2] __attribute__ ((aligned (8)));
 	unsigned int		extramask[_NSIG_WORDS - 1];
 	unsigned int		extra_size; /* Should be 0 */
 	__siginfo_fpu_t		fpu_state;
@@ -83,8 +83,8 @@
 	siginfo_t		info;
 	struct pt_regs		regs;
 	sigset_t		mask;
-	__siginfo_fpu_t		*fpu_save;
-	unsigned int		insns [2];
+	__siginfo_fpu_t __user	*fpu_save;
+	unsigned int		insns[2];
 	stack_t			stack;
 	unsigned int		extra_size; /* Should be 0 */
 	__siginfo_fpu_t		fpu_state;
@@ -142,7 +142,7 @@
 	_sigpause_common(regs->u_regs[UREG_I0], regs);
 }
 
-asmlinkage void do_rt_sigsuspend(sigset_t *uset, size_t sigsetsize,
+asmlinkage void do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize,
 				 struct pt_regs *regs)
 {
 	sigset_t oldset, set;
@@ -190,7 +190,7 @@
 }
 
 static inline int
-restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
+restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
 {
 	int err;
 #ifdef CONFIG_SMP
@@ -205,7 +205,7 @@
 	current->used_math = 1;
 	clear_tsk_thread_flag(current, TIF_USEDFPU);
 
-	if (verify_area (VERIFY_READ, fpu, sizeof(*fpu)))
+	if (verify_area(VERIFY_READ, fpu, sizeof(*fpu)))
 		return -EFAULT;
 
 	err = __copy_from_user(&current->thread.float_regs[0], &fpu->si_float_regs[0],
@@ -222,16 +222,16 @@
 
 static inline void do_new_sigreturn (struct pt_regs *regs)
 {
-	struct new_signal_frame *sf;
+	struct new_signal_frame __user *sf;
 	unsigned long up_psr, pc, npc;
 	sigset_t set;
-	__siginfo_fpu_t *fpu_save;
+	__siginfo_fpu_t __user *fpu_save;
 	int err;
 
-	sf = (struct new_signal_frame *) regs->u_regs [UREG_FP];
+	sf = (struct new_signal_frame __user *) regs->u_regs[UREG_FP];
 
 	/* 1. Make sure we are not getting garbage from the user */
-	if (verify_area (VERIFY_READ, sf, sizeof (*sf)))
+	if (verify_area(VERIFY_READ, sf, sizeof(*sf)))
 		goto segv_and_exit;
 
 	if (((uint) sf) & 3)
@@ -245,7 +245,7 @@
 
 	/* 2. Restore the state */
 	up_psr = regs->psr;
-	err |= __copy_from_user(regs, &sf->info.si_regs, sizeof (struct pt_regs));
+	err |= __copy_from_user(regs, &sf->info.si_regs, sizeof(struct pt_regs));
 
 	/* User can only change condition codes and FPU enabling in %psr. */
 	regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
@@ -279,7 +279,7 @@
 
 asmlinkage void do_sigreturn(struct pt_regs *regs)
 {
-	struct sigcontext *scptr;
+	struct sigcontext __user *scptr;
 	unsigned long pc, npc, psr;
 	sigset_t set;
 	int err;
@@ -287,19 +287,19 @@
 	synchronize_user_stack();
 
 	if (current->thread.new_signal)
-		return do_new_sigreturn (regs);
+		return do_new_sigreturn(regs);
 
-	scptr = (struct sigcontext *) regs->u_regs[UREG_I0];
+	scptr = (struct sigcontext __user *) regs->u_regs[UREG_I0];
 
 	/* Check sanity of the user arg. */
-	if(verify_area(VERIFY_READ, scptr, sizeof(struct sigcontext)) ||
-	   (((unsigned long) scptr) & 3))
+	if (verify_area(VERIFY_READ, scptr, sizeof(struct sigcontext)) ||
+	    (((unsigned long) scptr) & 3))
 		goto segv_and_exit;
 
 	err = __get_user(pc, &scptr->sigc_pc);
 	err |= __get_user(npc, &scptr->sigc_npc);
 
-	if((pc | npc) & 3)
+	if ((pc | npc) & 3)
 		goto segv_and_exit;
 
 	/* This is pretty much atomic, no amount locking would prevent
@@ -341,17 +341,17 @@
 
 asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
 {
-	struct rt_signal_frame *sf;
+	struct rt_signal_frame __user *sf;
 	unsigned int psr, pc, npc;
-	__siginfo_fpu_t *fpu_save;
+	__siginfo_fpu_t __user *fpu_save;
 	sigset_t set;
 	stack_t st;
 	int err;
 
 	synchronize_user_stack();
-	sf = (struct rt_signal_frame *) regs->u_regs[UREG_FP];
-	if(verify_area(VERIFY_READ, sf, sizeof(*sf)) ||
-	   (((unsigned long) sf) & 0x03))
+	sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
+	if (verify_area(VERIFY_READ, sf, sizeof(*sf)) ||
+	    (((unsigned long) sf) & 0x03))
 		goto segv;
 
 	err = __get_user(pc, &sf->regs.pc);
@@ -361,13 +361,14 @@
 	err |= __get_user(regs->y, &sf->regs.y);
 	err |= __get_user(psr, &sf->regs.psr);
 
-	err |= __copy_from_user(&regs->u_regs[UREG_G1], &sf->regs.u_regs[UREG_G1], 15*sizeof(u32));
+	err |= __copy_from_user(&regs->u_regs[UREG_G1],
+				&sf->regs.u_regs[UREG_G1], 15 * sizeof(u32));
 
 	regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
 
 	err |= __get_user(fpu_save, &sf->fpu_save);
 
-	if(fpu_save)
+	if (fpu_save)
 		err |= restore_fpu_state(regs, fpu_save);
 	err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
 	
@@ -380,7 +381,8 @@
 	regs->npc = npc;
 	
 	/* It is more difficult to avoid calling this function than to
-	   call it and ignore errors.  */
+	 * call it and ignore errors.
+	 */
 	do_sigaltstack(&st, NULL, (unsigned long)sf);
 
 	sigdelsetmask(&set, ~_BLOCKABLE);
@@ -394,7 +396,7 @@
 }
 
 /* Checks if the fp is valid */
-static inline int invalid_frame_pointer (void *fp, int fplen)
+static inline int invalid_frame_pointer(void __user *fp, int fplen)
 {
 	if ((((unsigned long) fp) & 7) ||
 	    !__access_ok((unsigned long)fp, fplen) ||
@@ -405,7 +407,7 @@
 	return 0;
 }
 
-static inline void *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
+static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
 {
 	unsigned long sp;
 
@@ -416,14 +418,14 @@
 		if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
 			sp = current->sas_ss_sp + current->sas_ss_size;
 	}
-	return (void *)(sp - framesize);
+	return (void __user *)(sp - framesize);
 }
 
 static inline void
 setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
 {
-	struct signal_sframe *sframep;
-	struct sigcontext *sc;
+	struct signal_sframe __user *sframep;
+	struct sigcontext __user *sc;
 	int window = 0, err;
 	unsigned long pc = regs->pc;
 	unsigned long npc = regs->npc;
@@ -431,8 +433,9 @@
 	int sig_code;
 
 	synchronize_user_stack();
-	sframep = (struct signal_sframe *)get_sigframe(sa, regs, SF_ALIGNEDSZ);
-	if (invalid_frame_pointer (sframep, sizeof(*sframep))){
+	sframep = (struct signal_sframe __user *)
+		get_sigframe(sa, regs, SF_ALIGNEDSZ);
+	if (invalid_frame_pointer(sframep, sizeof(*sframep))){
 		/* Don't change signal code and address, so that
 		 * post mortem debuggers can have a look.
 		 */
@@ -454,16 +457,16 @@
 	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++) {
-			sc->sigc_spbuf[window] =
-				(char *)current->thread.rwbuf_stkptrs[window];
+	if (current->thread.w_saved)
+		for (window = 0; window < current->thread.w_saved; window++) {
+			put_user((char *)current->thread.rwbuf_stkptrs[window],
+				 &sc->sigc_spbuf[window]);
 			err |= __copy_to_user(&sc->sigc_wbuf[window],
 					      &current->thread.reg_window[window],
 					      sizeof(struct reg_window));
 		}
 	else
-		err |= __copy_to_user(sframep, (char *)regs->u_regs[UREG_FP],
+		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. */
@@ -484,7 +487,7 @@
 			switch (info->si_code) {
 			case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
 			case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
-			case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP (info->si_trapno); break;
+			case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP(info->si_trapno); break;
 			default: sig_code = SUBSIG_STACK; break;
 			}
 			break;
@@ -541,7 +544,7 @@
 
 
 static inline int
-save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
+save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
 {
 	int err = 0;
 #ifdef CONFIG_SMP
@@ -561,12 +564,14 @@
 		regs->psr &= ~(PSR_EF);
 	}
 #endif
-	err |= __copy_to_user(&fpu->si_float_regs[0], &current->thread.float_regs[0],
+	err |= __copy_to_user(&fpu->si_float_regs[0],
+			      &current->thread.float_regs[0],
 			      (sizeof(unsigned long) * 32));
 	err |= __put_user(current->thread.fsr, &fpu->si_fsr);
 	err |= __put_user(current->thread.fpqdepth, &fpu->si_fpqdepth);
 	if (current->thread.fpqdepth != 0)
-		err |= __copy_to_user(&fpu->si_fpqueue[0], &current->thread.fpqueue[0],
+		err |= __copy_to_user(&fpu->si_fpqueue[0],
+				      &current->thread.fpqueue[0],
 				      ((sizeof(unsigned long) +
 				      (sizeof(unsigned long *)))*16));
 	current->used_math = 0;
@@ -577,7 +582,7 @@
 new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
 		int signo, sigset_t *oldset)
 {
-	struct new_signal_frame *sf;
+	struct new_signal_frame __user *sf;
 	int sigframe_size, err;
 
 	/* 1. Make sure everything is clean */
@@ -587,16 +592,17 @@
 	if (!current->used_math)
 		sigframe_size -= sizeof(__siginfo_fpu_t);
 
-	sf = (struct new_signal_frame *)get_sigframe(&ka->sa, regs, sigframe_size);
+	sf = (struct new_signal_frame __user *)
+		get_sigframe(&ka->sa, regs, sigframe_size);
 
-	if (invalid_frame_pointer (sf, sigframe_size))
+	if (invalid_frame_pointer(sf, sigframe_size))
 		goto sigill_and_return;
 
 	if (current->thread.w_saved != 0)
 		goto sigill_and_return;
 
 	/* 2. Save the current process state */
-	err = __copy_to_user(&sf->info.si_regs, regs, sizeof (struct pt_regs));
+	err = __copy_to_user(&sf->info.si_regs, regs, sizeof(struct pt_regs));
 	
 	err |= __put_user(0, &sf->extra_size);
 
@@ -610,8 +616,8 @@
 	err |= __put_user(oldset->sig[0], &sf->info.si_mask);
 	err |= __copy_to_user(sf->extramask, &oldset->sig[1],
 			      (_NSIG_WORDS - 1) * sizeof(unsigned int));
-	err |= __copy_to_user(sf, (char *) regs->u_regs [UREG_FP],
-			      sizeof (struct reg_window));
+	err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
+			      sizeof(struct reg_window));
 	if (err)
 		goto sigsegv;
 	
@@ -653,32 +659,33 @@
 new_setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
 		   int signo, sigset_t *oldset, siginfo_t *info)
 {
-	struct rt_signal_frame *sf;
+	struct rt_signal_frame __user *sf;
 	int sigframe_size;
 	unsigned int psr;
 	int err;
 
 	synchronize_user_stack();
 	sigframe_size = RT_ALIGNEDSZ;
-	if(!current->used_math)
+	if (!current->used_math)
 		sigframe_size -= sizeof(__siginfo_fpu_t);
-	sf = (struct rt_signal_frame *)get_sigframe(&ka->sa, regs, sigframe_size);
-	if(invalid_frame_pointer(sf, sigframe_size))
+	sf = (struct rt_signal_frame __user *)
+		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.w_saved != 0)
 		goto sigill;
 
 	err  = __put_user(regs->pc, &sf->regs.pc);
 	err |= __put_user(regs->npc, &sf->regs.npc);
 	err |= __put_user(regs->y, &sf->regs.y);
 	psr = regs->psr;
-	if(current->used_math)
+	if (current->used_math)
 		psr |= PSR_EF;
 	err |= __put_user(psr, &sf->regs.psr);
 	err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs));
 	err |= __put_user(0, &sf->extra_size);
 
-	if(psr & PSR_EF) {
+	if (psr & PSR_EF) {
 		err |= save_fpu_state(regs, &sf->fpu_state);
 		err |= __put_user(&sf->fpu_state, &sf->fpu_save);
 	} else {
@@ -691,8 +698,8 @@
 	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
 	err |= __put_user(current->sas_ss_size, &sf->stack.ss_size);
 	
-	err |= __copy_to_user(sf, (char *) regs->u_regs [UREG_FP],
-			      sizeof (struct reg_window));	
+	err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
+			      sizeof(struct reg_window));	
 
 	err |= copy_siginfo_to_user(&sf->info, info);
 
@@ -706,7 +713,7 @@
 	regs->pc = (unsigned long) ka->sa.sa_handler;
 	regs->npc = (regs->pc + 4);
 
-	if(ka->ka_restorer)
+	if (ka->ka_restorer)
 		regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer;
 	else {
 		regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
@@ -735,23 +742,24 @@
 setup_svr4_frame(struct sigaction *sa, unsigned long pc, unsigned long npc,
 		 struct pt_regs *regs, int signr, sigset_t *oldset)
 {
-	svr4_signal_frame_t *sfp;
-	svr4_gregset_t  *gr;
-	svr4_siginfo_t  *si;
-	svr4_mcontext_t *mc;
-	svr4_gwindows_t *gw;
-	svr4_ucontext_t *uc;
+	svr4_signal_frame_t __user *sfp;
+	svr4_gregset_t  __user *gr;
+	svr4_siginfo_t  __user *si;
+	svr4_mcontext_t __user *mc;
+	svr4_gwindows_t __user *gw;
+	svr4_ucontext_t __user *uc;
 	svr4_sigset_t	setv;
 	int window = 0, err;
 
 	synchronize_user_stack();
-	sfp = (svr4_signal_frame_t *) get_sigframe(sa, regs, SVR4_SF_ALIGNED + REGWIN_SZ);
+	sfp = (svr4_signal_frame_t __user *)
+		get_sigframe(sa, regs, SVR4_SF_ALIGNED + REGWIN_SZ);
 
-	if (invalid_frame_pointer (sfp, sizeof (*sfp)))
+	if (invalid_frame_pointer(sfp, sizeof(*sfp)))
 		goto sigill_and_return;
 
 	/* Start with a clean frame pointer and fill it */
-	err = __clear_user(sfp, sizeof (*sfp));
+	err = __clear_user(sfp, sizeof(*sfp));
 
 	/* Setup convenience variables */
 	si = &sfp->si;
@@ -771,17 +779,20 @@
 		setv.sigbits[3] = oldset->sig[3];
 		err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
 	} else
-		err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned int));
+		err |= __copy_to_user(&uc->sigmask, &setv,
+				      2 * sizeof(unsigned int));
 
 	/* Store registers */
-	err |= __put_user(regs->pc, &((*gr) [SVR4_PC]));
-	err |= __put_user(regs->npc, &((*gr) [SVR4_NPC]));
-	err |= __put_user(regs->psr, &((*gr) [SVR4_PSR]));
-	err |= __put_user(regs->y, &((*gr) [SVR4_Y]));
+	err |= __put_user(regs->pc, &((*gr)[SVR4_PC]));
+	err |= __put_user(regs->npc, &((*gr)[SVR4_NPC]));
+	err |= __put_user(regs->psr, &((*gr)[SVR4_PSR]));
+	err |= __put_user(regs->y, &((*gr)[SVR4_Y]));
 	
-	/* Copy g [1..7] and o [0..7] registers */
-	err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs [UREG_G1], sizeof (long) * 7);
-	err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs [UREG_I0], sizeof (long) * 8);
+	/* Copy g[1..7] and o[0..7] registers */
+	err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs[UREG_G1],
+			      sizeof(long) * 7);
+	err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs[UREG_I0],
+			      sizeof(long) * 8);
 
 	/* Setup sigaltstack */
 	err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
@@ -793,7 +804,7 @@
 	/* 1. Link sfp->uc->gwins to our windows */
 	err |= __put_user(gw, &mc->gwin);
 	    
-	/* 2. Number of windows to restore at setcontext (): */
+	/* 2. Number of windows to restore at setcontext(): */
 	err |= __put_user(current->thread.w_saved, &gw->count);
 
 	/* 3. Save each valid window
@@ -807,12 +818,12 @@
 	 *    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++) {
-		err |= __put_user((int *) &(gw->win [window]), &gw->winptr [window]);
-		err |= __copy_to_user(&gw->win [window],
-				      &current->thread.reg_window [window],
-				      sizeof (svr4_rwindow_t));
-		err |= __put_user(0, gw->winptr [window]);
+	for (window = 0; window < current->thread.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],
+				      sizeof(svr4_rwindow_t));
+		err |= __put_user(0, gw->winptr[window]);
 	}
 
 	/* 4. We just pay attention to the gw->count field on setcontext */
@@ -832,13 +843,14 @@
 	regs->npc = (regs->pc + 4);
 
 	/* Arguments passed to signal handler */
-	if (regs->u_regs [14]){
-		struct reg_window *rw = (struct reg_window *) regs->u_regs [14];
-
-		err |= __put_user(signr, &rw->ins [0]);
-		err |= __put_user(si, &rw->ins [1]);
-		err |= __put_user(uc, &rw->ins [2]);
-		err |= __put_user(sfp, &rw->ins [6]);	/* frame pointer */
+	if (regs->u_regs[14]){
+		struct reg_window *rw = (struct reg_window __user *)
+			regs->u_regs[14];
+
+		err |= __put_user(signr, &rw->ins[0]);
+		err |= __put_user(si, &rw->ins[1]);
+		err |= __put_user(uc, &rw->ins[2]);
+		err |= __put_user(sfp, &rw->ins[6]);	/* frame pointer */
 		if (err)
 			goto sigsegv;
 
@@ -854,10 +866,10 @@
 	do_exit(SIGSEGV);
 }
 
-asmlinkage int svr4_getcontext (svr4_ucontext_t *uc, struct pt_regs *regs)
+asmlinkage int svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
 {
-	svr4_gregset_t  *gr;
-	svr4_mcontext_t *mc;
+	svr4_gregset_t  __user *gr;
+	svr4_mcontext_t __user *mc;
 	svr4_sigset_t	setv;
 	int err = 0;
 
@@ -866,7 +878,7 @@
 	if (current->thread.w_saved)
 		goto sigsegv_and_return;
 
-	err = clear_user(uc, sizeof (*uc));
+	err = clear_user(uc, sizeof(*uc));
 	if (err)
 		return -EFAULT;
 
@@ -881,17 +893,20 @@
 		setv.sigbits[3] = current->blocked.sig[3];
 		err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
 	} else
-		err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned int));
+		err |= __copy_to_user(&uc->sigmask, &setv,
+				      2 * sizeof(unsigned int));
 
 	/* Store registers */
-	err |= __put_user(regs->pc, &uc->mcontext.greg [SVR4_PC]);
-	err |= __put_user(regs->npc, &uc->mcontext.greg [SVR4_NPC]);
-	err |= __put_user(regs->psr, &uc->mcontext.greg [SVR4_PSR]);
-	err |= __put_user(regs->y, &uc->mcontext.greg [SVR4_Y]);
+	err |= __put_user(regs->pc, &uc->mcontext.greg[SVR4_PC]);
+	err |= __put_user(regs->npc, &uc->mcontext.greg[SVR4_NPC]);
+	err |= __put_user(regs->psr, &uc->mcontext.greg[SVR4_PSR]);
+	err |= __put_user(regs->y, &uc->mcontext.greg[SVR4_Y]);
 	
-	/* Copy g [1..7] and o [0..7] registers */
-	err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs [UREG_G1], sizeof (uint) * 7);
-	err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs [UREG_I0], sizeof (uint) * 8);
+	/* Copy g[1..7] and o[0..7] registers */
+	err |= __copy_to_user(&(*gr)[SVR4_G1], &regs->u_regs[UREG_G1],
+			      sizeof(uint) * 7);
+	err |= __copy_to_user(&(*gr)[SVR4_O0], &regs->u_regs[UREG_I0],
+			      sizeof(uint) * 8);
 
 	/* Setup sigaltstack */
 	err |= __put_user(current->sas_ss_sp, &uc->stack.sp);
@@ -908,10 +923,10 @@
 }
 
 /* Set the context for a svr4 application, this is Solaris way to sigreturn */
-asmlinkage int svr4_setcontext (svr4_ucontext_t *c, struct pt_regs *regs)
+asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
 {
 	struct thread_struct *tp = &current->thread;
-	svr4_gregset_t  *gr;
+	svr4_gregset_t  __user *gr;
 	unsigned long pc, npc, psr;
 	sigset_t set;
 	svr4_sigset_t setv;
@@ -929,7 +944,7 @@
 	if (((uint) c) & 3)
 		goto sigsegv_and_return;
 
-	if(!__access_ok((unsigned long)c, sizeof(*c)))
+	if (!__access_ok((unsigned long)c, sizeof(*c)))
 		goto sigsegv_and_return;
 
 	/* Check for valid PC and nPC */
@@ -937,7 +952,7 @@
 	err = __get_user(pc, &((*gr)[SVR4_PC]));
 	err |= __get_user(npc, &((*gr)[SVR4_NPC]));
 
-	if((pc | npc) & 3)
+	if ((pc | npc) & 3)
 		goto sigsegv_and_return;
 
 	/* Retrieve information from passed ucontext */
@@ -973,16 +988,16 @@
 	spin_unlock_irq(&current->sighand->siglock);
 	regs->pc = pc;
 	regs->npc = npc | 1;
-	err |= __get_user(regs->y, &((*gr) [SVR4_Y]));
-	err |= __get_user(psr, &((*gr) [SVR4_PSR]));
+	err |= __get_user(regs->y, &((*gr)[SVR4_Y]));
+	err |= __get_user(psr, &((*gr)[SVR4_PSR]));
 	regs->psr &= ~(PSR_ICC);
 	regs->psr |= (psr & PSR_ICC);
 
 	/* Restore g[1..7] and o[0..7] registers */
-	err |= __copy_from_user(&regs->u_regs [UREG_G1], &(*gr)[SVR4_G1],
-			      sizeof (long) * 7);
-	err |= __copy_from_user(&regs->u_regs [UREG_I0], &(*gr)[SVR4_O0],
-			      sizeof (long) * 8);
+	err |= __copy_from_user(&regs->u_regs[UREG_G1], &(*gr)[SVR4_G1],
+			      sizeof(long) * 7);
+	err |= __copy_from_user(&regs->u_regs[UREG_I0], &(*gr)[SVR4_O0],
+			      sizeof(long) * 8);
 	return (err ? -EFAULT : 0);
 
 sigsegv_and_return:
@@ -1000,13 +1015,13 @@
 		if (ka->sa.sa_flags & SA_SIGINFO)
 			new_setup_rt_frame(ka, regs, signr, oldset, info);
 		else if (current->thread.new_signal)
-			new_setup_frame (ka, regs, signr, oldset);
+			new_setup_frame(ka, regs, signr, oldset);
 		else
 			setup_frame(&ka->sa, regs, signr, oldset, info);
 	}
-	if(ka->sa.sa_flags & SA_ONESHOT)
+	if (ka->sa.sa_flags & SA_ONESHOT)
 		ka->sa.sa_handler = SIG_DFL;
-	if(!(ka->sa.sa_flags & SA_NOMASK)) {
+	if (!(ka->sa.sa_flags & SA_NOMASK)) {
 		spin_lock_irq(&current->sighand->siglock);
 		sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
 		sigaddset(&current->blocked, signr);
@@ -1028,7 +1043,7 @@
 		regs->psr |= PSR_C;
 		break;
 	case ERESTARTSYS:
-		if(!(sa->sa_flags & SA_RESTART))
+		if (!(sa->sa_flags & SA_RESTART))
 			goto no_system_call_restart;
 		/* fallthrough */
 	case ERESTARTNOINTR:
@@ -1095,13 +1110,15 @@
 }
 
 asmlinkage int
-do_sys_sigstack(struct sigstack *ssptr, struct sigstack *ossptr, unsigned long sp)
+do_sys_sigstack(struct sigstack __user *ssptr, struct sigstack __user *ossptr,
+		unsigned long sp)
 {
 	int ret = -EFAULT;
 
 	/* First see if old state is wanted. */
 	if (ossptr) {
-		if (put_user(current->sas_ss_sp + current->sas_ss_size, &ossptr->the_stack) ||
+		if (put_user(current->sas_ss_sp + current->sas_ss_size,
+			     &ossptr->the_stack) ||
 		    __put_user(on_sig_stack(sp), &ossptr->cur_status))
 			goto out;
 	}
diff -Nru a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c
--- a/arch/sparc/kernel/sparc_ksyms.c	Sat Apr 19 19:51:28 2003
+++ b/arch/sparc/kernel/sparc_ksyms.c	Sat Apr 19 19:51:28 2003
@@ -127,6 +127,7 @@
 EXPORT_SYMBOL(__down_interruptible);
 
 EXPORT_SYMBOL(sparc_valid_addr_bitmap);
+EXPORT_SYMBOL(phys_base);
 
 /* Atomic operations. */
 EXPORT_SYMBOL_PRIVATE(_atomic_add);
diff -Nru a/arch/sparc/kernel/sys_sparc.c b/arch/sparc/kernel/sys_sparc.c
--- a/arch/sparc/kernel/sys_sparc.c	Sat Apr 19 19:51:46 2003
+++ b/arch/sparc/kernel/sys_sparc.c	Sat Apr 19 19:51:46 2003
@@ -113,7 +113,7 @@
  * This is really horribly ugly.
  */
 
-asmlinkage int sys_ipc (uint call, int first, int second, int third, void *ptr, long fifth)
+asmlinkage int sys_ipc (uint call, int first, int second, int third, void __user *ptr, long fifth)
 {
 	int version, err;
 
@@ -123,7 +123,7 @@
 	if (call <= SEMCTL)
 		switch (call) {
 		case SEMOP:
-			err = sys_semop (first, (struct sembuf *)ptr, second);
+			err = sys_semop (first, (struct sembuf __user *)ptr, second);
 			goto out;
 		case SEMGET:
 			err = sys_semget (first, second, third);
@@ -134,19 +134,19 @@
 			if (!ptr)
 				goto out;
 			err = -EFAULT;
-			if(get_user(fourth.__pad, (void **)ptr))
+			if(get_user(fourth.__pad, (void __user **)ptr))
 				goto out;
 			err = sys_semctl (first, second, third, fourth);
 			goto out;
 			}
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 	if (call <= MSGCTL) 
 		switch (call) {
 		case MSGSND:
-			err = sys_msgsnd (first, (struct msgbuf *) ptr, 
+			err = sys_msgsnd (first, (struct msgbuf __user *) ptr, 
 					  second, third);
 			goto out;
 		case MSGRCV:
@@ -157,7 +157,7 @@
 				if (!ptr)
 					goto out;
 				err = -EFAULT;
-				if(copy_from_user(&tmp,(struct ipc_kludge *) ptr, sizeof (tmp)))
+				if (copy_from_user(&tmp, (struct ipc_kludge __user *) ptr, sizeof (tmp)))
 					goto out;
 				err = sys_msgrcv (first, tmp.msgp, second, tmp.msgtyp, third);
 				goto out;
@@ -170,10 +170,10 @@
 			err = sys_msgget ((key_t) first, second);
 			goto out;
 		case MSGCTL:
-			err = sys_msgctl (first, second, (struct msqid_ds *) ptr);
+			err = sys_msgctl (first, second, (struct msqid_ds __user *) ptr);
 			goto out;
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 	if (call <= SHMCTL) 
@@ -182,34 +182,34 @@
 			switch (version) {
 			case 0: default: {
 				ulong raddr;
-				err = sys_shmat (first, (char *) ptr, second, &raddr);
+				err = sys_shmat (first, (char __user *) ptr, second, &raddr);
 				if (err)
 					goto out;
 				err = -EFAULT;
-				if(put_user (raddr, (ulong *) third))
+				if (put_user (raddr, (ulong __user *) third))
 					goto out;
 				err = 0;
 				goto out;
 				}
 			case 1:	/* iBCS2 emulator entry point */
-				err = sys_shmat (first, (char *) ptr, second, (ulong *) third);
+				err = sys_shmat (first, (char __user *) ptr, second, (ulong __user *) third);
 				goto out;
 			}
 		case SHMDT: 
-			err = sys_shmdt ((char *)ptr);
+			err = sys_shmdt ((char __user *)ptr);
 			goto out;
 		case SHMGET:
 			err = sys_shmget (first, second, third);
 			goto out;
 		case SHMCTL:
-			err = sys_shmctl (first, second, (struct shmid_ds *) ptr);
+			err = sys_shmctl (first, second, (struct shmid_ds __user *) ptr);
 			goto out;
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 	else
-		err = -EINVAL;
+		err = -ENOSYS;
 out:
 	return err;
 }
@@ -344,9 +344,11 @@
 c_sys_nis_syscall (struct pt_regs *regs)
 {
 	static int count = 0;
-	
-	if (count++ > 5) return -ENOSYS;
-	printk ("%s[%d]: Unimplemented SPARC system call %d\n", current->comm, current->pid, (int)regs->u_regs[1]);
+
+	if (count++ > 5)
+		return -ENOSYS;
+	printk ("%s[%d]: Unimplemented SPARC system call %d\n",
+		current->comm, current->pid, (int)regs->u_regs[1]);
 #ifdef DEBUG_UNIMP_SYSCALL	
 	show_regs (regs);
 #endif
@@ -378,8 +380,8 @@
 }
 
 asmlinkage int
-sparc_sigaction (int sig, const struct old_sigaction *act,
-		 struct old_sigaction *oact)
+sparc_sigaction (int sig, const struct old_sigaction __user *act,
+		 struct old_sigaction __user *oact)
 {
 	struct k_sigaction new_ka, old_ka;
 	int ret;
@@ -422,8 +424,11 @@
 }
 
 asmlinkage int
-sys_rt_sigaction(int sig, const struct sigaction *act, struct sigaction *oact,
-		 void *restorer, size_t sigsetsize)
+sys_rt_sigaction(int sig,
+		 const struct sigaction __user *act,
+		 struct sigaction __user *oact,
+		 void __user *restorer,
+		 size_t sigsetsize)
 {
 	struct k_sigaction new_ka, old_ka;
 	int ret;
@@ -453,7 +458,7 @@
 	return ret;
 }
 
-asmlinkage int sys_getdomainname(char *name, int len)
+asmlinkage int sys_getdomainname(char __user *name, int len)
 {
  	int nlen;
  	int err = -EFAULT;
@@ -464,9 +469,9 @@
 
 	if (nlen < len)
 		len = nlen;
-	if(len > __NEW_UTS_LEN)
+	if (len > __NEW_UTS_LEN)
 		goto done;
-	if(copy_to_user(name, system_utsname.domainname, len))
+	if (copy_to_user(name, system_utsname.domainname, len))
 		goto done;
 	err = 0;
 done:
diff -Nru a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c
--- a/arch/sparc/kernel/traps.c	Sat Apr 19 19:51:47 2003
+++ b/arch/sparc/kernel/traps.c	Sat Apr 19 19:51:47 2003
@@ -153,6 +153,7 @@
 void do_illegal_instruction(struct pt_regs *regs, unsigned long pc, unsigned long npc,
 			    unsigned long psr)
 {
+	extern int do_user_muldiv (struct pt_regs *, unsigned long);
 	siginfo_t info;
 
 	if(psr & PSR_PS)
@@ -161,11 +162,9 @@
 	printk("Ill instr. at pc=%08lx instruction is %08lx\n",
 	       regs->pc, *(unsigned long *)regs->pc);
 #endif
-	if (sparc_cpu_model == sun4c || sparc_cpu_model == sun4) {
-		extern int do_user_muldiv (struct pt_regs *, unsigned long);
-		if (!do_user_muldiv (regs, pc))
-			return;
-	}
+	if (!do_user_muldiv (regs, pc))
+		return;
+
 	info.si_signo = SIGILL;
 	info.si_errno = 0;
 	info.si_code = ILL_ILLOPC;
diff -Nru a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c
--- a/arch/sparc/mm/srmmu.c	Sat Apr 19 19:51:48 2003
+++ b/arch/sparc/mm/srmmu.c	Sat Apr 19 19:51:48 2003
@@ -108,7 +108,7 @@
 ctxd_t *srmmu_context_table;
 
 int viking_mxcc_present;
-spinlock_t srmmu_context_spinlock = SPIN_LOCK_UNLOCKED;
+static spinlock_t srmmu_context_spinlock = SPIN_LOCK_UNLOCKED;
 
 int is_hypersparc;
 
@@ -152,7 +152,7 @@
 void *srmmu_nocache_bitmap;
 int srmmu_nocache_low;
 int srmmu_nocache_used;
-spinlock_t srmmu_nocache_spinlock;
+static spinlock_t srmmu_nocache_spinlock = SPIN_LOCK_UNLOCKED;
 
 /* This makes sense. Honest it does - Anton */
 #define __nocache_pa(VADDR) (((unsigned long)VADDR) - SRMMU_NOCACHE_VADDR + __pa((unsigned long)srmmu_nocache_pool))
@@ -2162,6 +2162,16 @@
 
 #endif
 
+static pte_t srmmu_pgoff_to_pte(unsigned long pgoff)
+{
+	return __pte((pgoff << SRMMU_PTE_FILE_SHIFT) | SRMMU_FILE);
+}
+
+static unsigned long srmmu_pte_to_pgoff(pte_t pte)
+{
+	return pte_val(pte) >> SRMMU_PTE_FILE_SHIFT;
+}
+
 /* Load up routines and constants for sun4m and sun4d mmu */
 void __init ld_mmu_srmmu(void)
 {
@@ -2188,7 +2198,7 @@
 	BTFIXUPSET_INT(page_kernel, pgprot_val(SRMMU_PAGE_KERNEL));
 	page_kernel = pgprot_val(SRMMU_PAGE_KERNEL);
 	pg_iobits = SRMMU_VALID | SRMMU_WRITE | SRMMU_REF;
-	
+
 	/* Functions */
 #ifndef CONFIG_SMP	
 	BTFIXUPSET_CALL(___xchg32, ___xchg32_sun4md, BTFIXUPCALL_SWAPG1G2);
@@ -2239,6 +2249,7 @@
 	BTFIXUPSET_HALF(pte_writei, SRMMU_WRITE);
 	BTFIXUPSET_HALF(pte_dirtyi, SRMMU_DIRTY);
 	BTFIXUPSET_HALF(pte_youngi, SRMMU_REF);
+	BTFIXUPSET_HALF(pte_filei, SRMMU_FILE);
 	BTFIXUPSET_HALF(pte_wrprotecti, SRMMU_WRITE);
 	BTFIXUPSET_HALF(pte_mkcleani, SRMMU_DIRTY);
 	BTFIXUPSET_HALF(pte_mkoldi, SRMMU_REF);
@@ -2252,6 +2263,9 @@
 
 	BTFIXUPSET_CALL(alloc_thread_info, srmmu_alloc_thread_info, BTFIXUPCALL_NORM);
 	BTFIXUPSET_CALL(free_thread_info, srmmu_free_thread_info, BTFIXUPCALL_NORM);
+
+	BTFIXUPSET_CALL(pte_to_pgoff, srmmu_pte_to_pgoff, BTFIXUPCALL_NORM);
+	BTFIXUPSET_CALL(pgoff_to_pte, srmmu_pgoff_to_pte, BTFIXUPCALL_NORM);
 
 	get_srmmu_type();
 	patch_window_trap_handlers();
diff -Nru a/arch/sparc/mm/sun4c.c b/arch/sparc/mm/sun4c.c
--- a/arch/sparc/mm/sun4c.c	Sat Apr 19 19:51:49 2003
+++ b/arch/sparc/mm/sun4c.c	Sat Apr 19 19:51:49 2003
@@ -1798,9 +1798,20 @@
 
 static unsigned long sun4c_pte_pfn(pte_t pte)
 {
-	return (unsigned long)(pte_val(pte) & SUN4C_PFN_MASK);
+	return pte_val(pte) & SUN4C_PFN_MASK;
 }
 
+static pte_t sun4c_pgoff_to_pte(unsigned long pgoff)
+{
+	return __pte(pgoff | _SUN4C_PAGE_FILE);
+}
+
+static unsigned long sun4c_pte_to_pgoff(pte_t pte)
+{
+	return pte_val(pte) & ((1UL << PTE_FILE_MAX_BITS) - 1);
+}
+
+
 static __inline__ unsigned long sun4c_pmd_page_v(pmd_t pmd)
 {
 	return (pmd_val(pmd) & PAGE_MASK);
@@ -2115,7 +2126,7 @@
 	page_kernel = pgprot_val(SUN4C_PAGE_KERNEL);
 	pg_iobits = _SUN4C_PAGE_PRESENT | _SUN4C_READABLE | _SUN4C_WRITEABLE |
 		    _SUN4C_PAGE_IO | _SUN4C_PAGE_NOCACHE;
-	
+
 	/* Functions */
 	BTFIXUPSET_CALL(___xchg32, ___xchg32_sun4c, BTFIXUPCALL_NORM);
 	BTFIXUPSET_CALL(do_check_pgt_cache, sun4c_check_pgt_cache, BTFIXUPCALL_NORM);
@@ -2190,6 +2201,7 @@
 	BTFIXUPSET_HALF(pte_writei, _SUN4C_PAGE_WRITE);
 	BTFIXUPSET_HALF(pte_dirtyi, _SUN4C_PAGE_MODIFIED);
 	BTFIXUPSET_HALF(pte_youngi, _SUN4C_PAGE_ACCESSED);
+	BTFIXUPSET_HALF(pte_filei, _SUN4C_PAGE_FILE);
 	BTFIXUPSET_HALF(pte_wrprotecti, _SUN4C_PAGE_WRITE|_SUN4C_PAGE_SILENT_WRITE);
 	BTFIXUPSET_HALF(pte_mkcleani, _SUN4C_PAGE_MODIFIED|_SUN4C_PAGE_SILENT_WRITE);
 	BTFIXUPSET_HALF(pte_mkoldi, _SUN4C_PAGE_ACCESSED|_SUN4C_PAGE_SILENT_READ);
@@ -2197,6 +2209,9 @@
 	BTFIXUPSET_CALL(pte_mkdirty, sun4c_pte_mkdirty, BTFIXUPCALL_NORM);
 	BTFIXUPSET_CALL(pte_mkyoung, sun4c_pte_mkyoung, BTFIXUPCALL_NORM);
 	BTFIXUPSET_CALL(update_mmu_cache, sun4c_update_mmu_cache, BTFIXUPCALL_NORM);
+
+	BTFIXUPSET_CALL(pte_to_pgoff, sun4c_pte_to_pgoff, BTFIXUPCALL_NORM);
+	BTFIXUPSET_CALL(pgoff_to_pte, sun4c_pgoff_to_pte, BTFIXUPCALL_NORM);
 
 	BTFIXUPSET_CALL(mmu_lockarea, sun4c_lockarea, BTFIXUPCALL_NORM);
 	BTFIXUPSET_CALL(mmu_unlockarea, sun4c_unlockarea, BTFIXUPCALL_NORM);
diff -Nru a/arch/sparc/vmlinux.lds.S b/arch/sparc/vmlinux.lds.S
--- a/arch/sparc/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
+++ b/arch/sparc/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
@@ -34,7 +34,11 @@
 
   . = ALIGN(4096);
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   __init_text_end = .;
   .init.data : { *(.init.data) }
   . = ALIGN(16);
diff -Nru a/arch/sparc64/defconfig b/arch/sparc64/defconfig
--- a/arch/sparc64/defconfig	Sat Apr 19 19:51:46 2003
+++ b/arch/sparc64/defconfig	Sat Apr 19 19:51:46 2003
@@ -361,6 +361,7 @@
 # CONFIG_SYN_COOKIES is not set
 CONFIG_INET_AH=y
 CONFIG_INET_ESP=y
+CONFIG_INET_IPCOMP=y
 CONFIG_IPV6=m
 CONFIG_IPV6_PRIVACY=y
 CONFIG_INET6_AH=m
diff -Nru a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c
--- a/arch/sparc64/kernel/ioctl32.c	Sat Apr 19 19:51:50 2003
+++ b/arch/sparc64/kernel/ioctl32.c	Sat Apr 19 19:51:50 2003
@@ -54,9 +54,6 @@
 #include <linux/elevator.h>
 #include <linux/rtc.h>
 #include <linux/pci.h>
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-#include <linux/lvm.h>
-#endif /* LVM */
 #include <linux/dm-ioctl.h>
 
 #include <scsi/scsi.h>
@@ -107,15 +104,9 @@
 #include <linux/filter.h>
 
 /* Use this to get at 32-bit user passed pointers. 
-   See sys_sparc32.c for description about these. */
-#define A(__x) ((unsigned long)(__x))
-#define AA(__x)				\
-({	unsigned long __ret;		\
-	__asm__ ("srl	%0, 0, %0"	\
-		 : "=r" (__ret)		\
-		 : "0" (__x));		\
-	__ret;				\
-})
+ * See sys_sparc32.c for description about it.
+ */
+#define A(__x) ((void __user *)(unsigned long)(__x))
 
 /* Aiee. Someone does not find a difference between int and long */
 #define EXT2_IOC32_GETFLAGS               _IOR('f', 1, int)
@@ -261,7 +252,7 @@
 
 static int get_video_window32(struct video_window *kp, struct video_window32 *up)
 {
-	struct video_clip32 *ucp;
+	struct video_clip32 __user *ucp;
 	struct video_clip *kcp;
 	int nclips, err, i;
 	u32 tmp;
@@ -275,7 +266,7 @@
 	__get_user(kp->flags, &up->flags);
 	__get_user(kp->clipcount, &up->clipcount);
 	__get_user(tmp, &up->clips);
-	ucp = (struct video_clip32 *)A(tmp);
+	ucp = A(tmp);
 	kp->clips = NULL;
 
 	nclips = kp->clipcount;
@@ -487,7 +478,7 @@
 {
 	struct ifconf32 ifc32;
 	struct ifconf ifc;
-	struct ifreq32 *ifr32;
+	struct ifreq32 __user *ifr32;
 	struct ifreq *ifr;
 	mm_segment_t old_fs;
 	unsigned int i, j;
@@ -508,7 +499,7 @@
 			return -ENOMEM;
 	}
 	ifr = ifc.ifc_req;
-	ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
+	ifr32 = 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);
@@ -520,7 +511,7 @@
 	set_fs (old_fs);
 	if (!err) {
 		ifr = ifc.ifc_req;
-		ifr32 = (struct ifreq32 *)A(ifc32.ifcbuf);
+		ifr32 = 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))) {
@@ -566,7 +557,7 @@
 
 	__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
 
-	if (get_user(ethcmd, (u32 *)A(data))) {
+	if (get_user(ethcmd, (u32 __user *) A(data))) {
 		err = -EFAULT;
 		goto out;
 	}
@@ -577,7 +568,7 @@
 	case ETHTOOL_GLINK:
 	case ETHTOOL_NWAY_RST:	len = sizeof(struct ethtool_value); break;
 	case ETHTOOL_GREGS: {
-		struct ethtool_regs *regaddr = (struct ethtool_regs *)A(data);
+		struct ethtool_regs __user *regaddr = A(data);
 		/* darned variable size arguments */
 		if (get_user(len, (u32 *)&regaddr->len)) {
 			err = -EFAULT;
@@ -593,7 +584,7 @@
 		goto out;
 	}
 
-	if (copy_from_user(ifr.ifr_data, (char *)A(data), len)) {
+	if (copy_from_user(ifr.ifr_data, A(data), len)) {
 		err = -EFAULT;
 		goto out;
 	}
@@ -606,7 +597,7 @@
 		u32 data;
 
 		__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
-		len = copy_to_user((char *)A(data), ifr.ifr_data, len);
+		len = copy_to_user(A(data), ifr.ifr_data, len);
 		if (len)
 			err = -EFAULT;
 	}
@@ -648,7 +639,7 @@
 	};
 
 	__get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data));
-	if (copy_from_user(ifr.ifr_data, (char *)A(data), len)) {
+	if (copy_from_user(ifr.ifr_data, A(data), len)) {
 		err = -EFAULT;
 		goto out;
 	}
@@ -658,7 +649,7 @@
 	err = sys_ioctl (fd, cmd, (unsigned long)&ifr);
 	set_fs (old_fs);
 	if (!err) {
-		len = copy_to_user((char *)A(data), ifr.ifr_data, len);
+		len = copy_to_user(A(data), ifr.ifr_data, len);
 		if (len)
 			err = -EFAULT;
 	}
@@ -684,7 +675,7 @@
 	struct ifreq *u_ifreq64;
 	struct ifreq32 *u_ifreq32 = (struct ifreq32 *) arg;
 	char tmp_buf[IFNAMSIZ];
-	void *data64;
+	void __user *data64;
 	u32 data32;
 
 	if (copy_from_user(&tmp_buf[0], &(u_ifreq32->ifr_ifrn.ifrn_name[0]),
@@ -692,7 +683,7 @@
 		return -EFAULT;
 	if (__get_user(data32, &u_ifreq32->ifr_ifru.ifru_data))
 		return -EFAULT;
-	data64 = (void *) A(data32);
+	data64 = A(data32);
 
 	u_ifreq64 = alloc_user_space(sizeof(*u_ifreq64));
 
@@ -829,7 +820,7 @@
 		ret |= __get_user (r4.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);
+			ret |= copy_from_user (devname, A(rtdev), 15);
 			r4.rt_dev = devname; devname[15] = 0;
 		} else
 			r4.rt_dev = 0;
@@ -932,9 +923,9 @@
 	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);
+		ret = copy_from_user (red, A(r), f.count);
+		ret |= copy_from_user (green, A(g), f.count);
+		ret |= copy_from_user (blue, A(b), f.count);
 		if (ret)
 			return -EFAULT;
 	}
@@ -943,9 +934,9 @@
 	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);
+		ret = copy_to_user (A(r), red, f.count);
+		ret |= copy_to_user (A(g), green, f.count);
+		ret |= copy_to_user (A(b), blue, f.count);
 	}
 	return ret ? -EFAULT : 0;
 }
@@ -989,16 +980,16 @@
 	if (f.set & FB_CUR_SETCMAP) {
 		if ((uint) f.size.y > 32)
 			return -EINVAL;
-		ret = copy_from_user (mask, (char *)A(m), f.size.y * 4);
-		ret |= copy_from_user (image, (char *)A(i), f.size.y * 4);
+		ret = copy_from_user (mask, A(m), f.size.y * 4);
+		ret |= copy_from_user (image, A(i), f.size.y * 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);
+		ret = copy_from_user (red, A(r), 2);
+		ret |= copy_from_user (green, A(g), 2);
+		ret |= copy_from_user (blue, A(b), 2);
 		if (ret)
 			return -EFAULT;
 		f.cmap.red = red; f.cmap.green = green; f.cmap.blue = blue;
@@ -1081,10 +1072,10 @@
 		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));
+		err = __copy_from_user(cmap.red, A(red), cmap.len * sizeof(__u16));
+		err |= __copy_from_user(cmap.green, A(green), cmap.len * sizeof(__u16));
+		err |= __copy_from_user(cmap.blue, A(blue), cmap.len * sizeof(__u16));
+		if (cmap.transp) err |= __copy_from_user(cmap.transp, A(transp), cmap.len * sizeof(__u16));
 		if (err) {
 			err = -EFAULT;
 			goto out;
@@ -1123,11 +1114,11 @@
 		err |= __copy_to_user((char *)((struct fb_fix_screeninfo32 *)arg)->reserved, (char *)fix.reserved, sizeof(fix.reserved));
 		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));
+		err = __copy_to_user(A(red), cmap.red, cmap.len * sizeof(__u16));
+		err |= __copy_to_user(A(green), cmap.blue, cmap.len * sizeof(__u16));
+		err |= __copy_to_user(A(blue), cmap.blue, cmap.len * sizeof(__u16));
 		if (cmap.transp)
-			err |= __copy_to_user((char *)A(transp), cmap.transp, cmap.len * sizeof(__u16));
+			err |= __copy_to_user(A(transp), cmap.transp, cmap.len * sizeof(__u16));
 		break;
 	case FBIOPUTCMAP:
 		break;
@@ -1504,7 +1495,7 @@
 
 static int alloc_sg_iovec(sg_io_hdr_t *sgp, u32 uptr32)
 {
-	sg_iovec32_t *uiov = (sg_iovec32_t *) A(uptr32);
+	sg_iovec32_t __user *uiov = A(uptr32);
 	sg_iovec_t *kiov;
 	int i;
 
@@ -1526,7 +1517,7 @@
 		if (!kiov->iov_base)
 			return -ENOMEM;
 		if (copy_from_user(kiov->iov_base,
-				   (void *) A(iov_base32),
+				   A(iov_base32),
 				   kiov->iov_len))
 			return -EFAULT;
 
@@ -1539,7 +1530,7 @@
 
 static int copy_back_sg_iovec(sg_io_hdr_t *sgp, u32 uptr32)
 {
-	sg_iovec32_t *uiov = (sg_iovec32_t *) A(uptr32);
+	sg_iovec32_t __user *uiov = A(uptr32);
 	sg_iovec_t *kiov = (sg_iovec_t *) sgp->dxferp;
 	int i;
 
@@ -1549,7 +1540,7 @@
 		if (__get_user(iov_base32, &uiov->iov_base))
 			return -EFAULT;
 
-		if (copy_to_user((void *) A(iov_base32),
+		if (copy_to_user(A(iov_base32),
 				 kiov->iov_base,
 				 kiov->iov_len))
 			return -EFAULT;
@@ -1607,7 +1598,7 @@
 		goto out;
 	}
 	if (copy_from_user(sg_io64.cmdp,
-			   (void *) A(cmdp32),
+			   A(cmdp32),
 			   sg_io64.cmd_len)) {
 		err = -EFAULT;
 		goto out;
@@ -1620,7 +1611,7 @@
 		goto out;
 	}
 	if (copy_from_user(sg_io64.sbp,
-			   (void *) A(sbp32),
+			   A(sbp32),
 			   sg_io64.mx_sb_len)) {
 		err = -EFAULT;
 		goto out;
@@ -1641,7 +1632,7 @@
 			goto out;
 		}
 		if (copy_from_user(sg_io64.dxferp,
-				   (void *) A(dxferp32),
+				   A(dxferp32),
 				   sg_io64.dxfer_len)) {
 			err = -EFAULT;
 			goto out;
@@ -1672,12 +1663,12 @@
 	err |= __put_user(sg_io64.resid, &sg_io32->resid);
 	err |= __put_user(sg_io64.duration, &sg_io32->duration);
 	err |= __put_user(sg_io64.info, &sg_io32->info);
-	err |= copy_to_user((void *)A(sbp32), sg_io64.sbp, sg_io64.mx_sb_len);
+	err |= copy_to_user(A(sbp32), sg_io64.sbp, sg_io64.mx_sb_len);
 	if (sg_io64.dxferp) {
 		if (sg_io64.iovec_count)
 			err |= copy_back_sg_iovec(&sg_io64, dxferp32);
 		else
-			err |= copy_to_user((void *)A(dxferp32),
+			err |= copy_to_user(A(dxferp32),
 					    sg_io64.dxferp,
 					    sg_io64.dxfer_len);
 	}
@@ -1711,7 +1702,7 @@
 {
 	struct sock_fprog32 *u_fprog32 = (struct sock_fprog32 *) arg;
 	struct sock_fprog *u_fprog64 = alloc_user_space(sizeof(struct sock_fprog));
-	void *fptr64;
+	void __user *fptr64;
 	u32 fptr32;
 	u16 flen;
 
@@ -1719,7 +1710,7 @@
 	    get_user(fptr32, &u_fprog32->filter))
 		return -EFAULT;
 
-	fptr64 = (void *) A(fptr32);
+	fptr64 = A(fptr32);
 
 	if (put_user(flen, &u_fprog64->len) ||
 	    put_user(fptr64, &u_fprog64->filter))
@@ -1768,7 +1759,7 @@
 		data.ptr = kmalloc (data32.length, GFP_KERNEL);
 		if (!data.ptr)
 			return -ENOMEM;
-		if (copy_from_user(data.ptr, (__u8 *)A(data32.ptr), data32.length)) {
+		if (copy_from_user(data.ptr, A(data32.ptr), data32.length)) {
 			kfree(data.ptr);
 			return -EFAULT;
 		}
@@ -2025,13 +2016,13 @@
 	case CDROMREADMODE1:
 	case CDROMREADRAW:
 	case CDROMREADCOOKED:
-		err = copy_to_user((char *)A(addr), data, cdread.cdread_buflen);
+		err = copy_to_user(A(addr), data, cdread.cdread_buflen);
 		break;
 	case CDROMREADAUDIO:
-		err = copy_to_user((char *)A(addr), data, cdreadaudio.nframes * 2352);
+		err = copy_to_user(A(addr), data, cdreadaudio.nframes * 2352);
 		break;
 	case CDROM_SEND_PACKET:
-		err = copy_to_user((char *)A(addr), data, cgc.buflen);
+		err = copy_to_user(A(addr), data, cgc.buflen);
 		break;
 	default:
 		break;
@@ -2148,7 +2139,7 @@
 	if (copy_from_user(&cfdarg, user_cfd, sizeof(struct consolefontdesc32)))
 		return -EFAULT;
 	
-	cfdarg.chardata = (unsigned char *)A(((struct consolefontdesc32 *)&cfdarg)->chardata);
+	cfdarg.chardata = A(((struct consolefontdesc32 *)&cfdarg)->chardata);
  	
 	switch (cmd) {
 	case PIO_FONTX:
@@ -2203,7 +2194,7 @@
 		return -EFAULT;
 	if (!perm && op.op != KD_FONT_OP_GET)
 		return -EPERM;
-	op.data = (unsigned char *)A(((struct console_font_op32 *)&op)->data);
+	op.data = 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);
@@ -2230,9 +2221,9 @@
 	switch (cmd) {
 	case PIO_UNIMAP:
 		if (!perm) return -EPERM;
-		return con_set_unimap(fg_console, tmp.entry_ct, (struct unipair *)A(tmp.entries));
+		return con_set_unimap(fg_console, tmp.entry_ct, 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 con_get_unimap(fg_console, tmp.entry_ct, &(user_ud->entry_ct), A(tmp.entries));
 	}
 	return 0;
 }
@@ -2772,443 +2763,6 @@
         return -EINVAL;
 }
 
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-/* Ugh, LVM. Pitty it was not cleaned up before accepted :((. */
-typedef struct {
-	uint8_t vg_name[NAME_LEN];
-	uint32_t vg_number;
-	uint32_t vg_access;
-	uint32_t vg_status;
-	uint32_t lv_max;
-	uint32_t lv_cur;
-	uint32_t lv_open;
-	uint32_t pv_max;
-	uint32_t pv_cur;
-	uint32_t pv_act;
-	uint32_t dummy;
-	uint32_t vgda;
-	uint32_t pe_size;
-	uint32_t pe_total;
-	uint32_t pe_allocated;
-	uint32_t pvg_total;
-	u32 proc;
-	u32 pv[ABS_MAX_PV + 1];
-	u32 lv[ABS_MAX_LV + 1];
-    	uint8_t vg_uuid[UUID_LEN+1];	/* volume group UUID */
-	uint8_t dummy1[200];
-} vg32_t;
-
-typedef struct {
-	uint8_t id[2];
-	uint16_t version;
-	lvm_disk_data_t pv_on_disk;
-	lvm_disk_data_t vg_on_disk;
-	lvm_disk_data_t pv_namelist_on_disk;
-	lvm_disk_data_t lv_on_disk;
-	lvm_disk_data_t pe_on_disk;
-	uint8_t pv_name[NAME_LEN];
-	uint8_t vg_name[NAME_LEN];
-	uint8_t system_id[NAME_LEN];
-	kdev_t pv_dev;
-	uint32_t pv_number;
-	uint32_t pv_status;
-	uint32_t pv_allocatable;
-	uint32_t pv_size;
-	uint32_t lv_cur;
-	uint32_t pe_size;
-	uint32_t pe_total;
-	uint32_t pe_allocated;
-	uint32_t pe_stale;
-	u32 pe;
-	u32 inode;
-	uint8_t pv_uuid[UUID_LEN+1];
-} pv32_t;
-
-typedef struct {
-	char lv_name[NAME_LEN];
-	u32 lv;
-} lv_req32_t;
-
-typedef struct {
-	u32 lv_index;
-	u32 lv;
-	/* Transfer size because user space and kernel space differ */
-	uint16_t size;
-} lv_status_byindex_req32_t;
-
-typedef struct {
-	compat_dev_t dev;
-	u32   lv;
-} lv_status_bydev_req32_t;
-
-typedef struct {
-	uint8_t lv_name[NAME_LEN];
-	kdev_t old_dev;
-	kdev_t new_dev;
-	u32 old_pe;
-	u32 new_pe;
-} le_remap_req32_t;
-
-typedef struct {
-	char pv_name[NAME_LEN];
-	u32 pv;
-} pv_status_req32_t;
-
-typedef struct {
-	uint8_t lv_name[NAME_LEN];
-	uint8_t vg_name[NAME_LEN];
-	uint32_t lv_access;
-	uint32_t lv_status;
-	uint32_t lv_open;
-	kdev_t lv_dev;
-	uint32_t lv_number;
-	uint32_t lv_mirror_copies;
-	uint32_t lv_recovery;
-	uint32_t lv_schedule;
-	uint32_t lv_size;
-	u32 lv_current_pe;
-	uint32_t lv_current_le;
-	uint32_t lv_allocated_le;
-	uint32_t lv_stripes;
-	uint32_t lv_stripesize;
-	uint32_t lv_badblock;
-	uint32_t lv_allocation;
-	uint32_t lv_io_timeout;
-	uint32_t lv_read_ahead;
-	/* delta to version 1 starts here */
-	u32 lv_snapshot_org;
-	u32 lv_snapshot_prev;
-	u32 lv_snapshot_next;
-	u32 lv_block_exception;
-	uint32_t lv_remap_ptr;
-	uint32_t lv_remap_end;
-	uint32_t lv_chunk_size;
-	uint32_t lv_snapshot_minor;
-	char dummy[200];
-} lv32_t;
-
-typedef struct {
-	u32 hash[2];
-	u32 rsector_org;
-	kdev_t rdev_org;
-	u32 rsector_new;
-	kdev_t rdev_new;
-} lv_block_exception32_t;
-
-static void put_lv_t(lv_t *l)
-{
-	if (l->lv_current_pe) vfree(l->lv_current_pe);
-	if (l->lv_block_exception) vfree(l->lv_block_exception);
-	kfree(l);
-}
-
-static lv_t *get_lv_t(u32 p, int *errp)
-{
-	int err, i;
-	u32 ptr1, ptr2;
-	size_t size;
-	lv_block_exception32_t *lbe32;
-	lv_block_exception_t *lbe;
-	lv32_t *ul = (lv32_t *)A(p);
-	lv_t *l = (lv_t *) kmalloc(sizeof(lv_t), GFP_KERNEL);
-
-	if (!l) {
-		*errp = -ENOMEM;
-		return NULL;
-	}
-	memset(l, 0, sizeof(lv_t));
-	err = copy_from_user(l, ul, (long)&((lv32_t *)0)->lv_current_pe);
-	err |= __copy_from_user(&l->lv_current_le, &ul->lv_current_le,
-				((long)&ul->lv_snapshot_org) - ((long)&ul->lv_current_le));
-	err |= __copy_from_user(&l->lv_remap_ptr, &ul->lv_remap_ptr,
-				((long)&ul->dummy[0]) - ((long)&ul->lv_remap_ptr));
-	err |= __get_user(ptr1, &ul->lv_current_pe);
-	err |= __get_user(ptr2, &ul->lv_block_exception);
-	if (err) {
-		kfree(l);
-		*errp = -EFAULT;
-		return NULL;
-	}
-	if (ptr1) {
-		size = l->lv_allocated_le * sizeof(pe_t);
-		l->lv_current_pe = vmalloc(size);
-		if (l->lv_current_pe)
-			err = copy_from_user(l->lv_current_pe, (void *)A(ptr1), size);
-	}
-	if (!err && ptr2) {
-		size = l->lv_remap_end * sizeof(lv_block_exception_t);
-		l->lv_block_exception = lbe = vmalloc(size);
-		if (l->lv_block_exception) {
-			lbe32 = (lv_block_exception32_t *)A(ptr2);
-			memset(lbe, 0, size);
-			for (i = 0; i < l->lv_remap_end; i++, lbe++, lbe32++) {
-				err |= get_user(lbe->rsector_org, &lbe32->rsector_org);
-				err |= __get_user(lbe->rdev_org, &lbe32->rdev_org);
-				err |= __get_user(lbe->rsector_new, &lbe32->rsector_new);
-				err |= __get_user(lbe->rdev_new, &lbe32->rdev_new);
-			}
-		}
-	}
-	if (err || (ptr1 && !l->lv_current_pe) || (ptr2 && !l->lv_block_exception)) {
-		if (!err)
-			*errp = -ENOMEM;
-		else
-			*errp = -EFAULT;
-		put_lv_t(l);
-		return NULL;
-	}
-	return l;
-}
-
-static int copy_lv_t(u32 ptr, lv_t *l)
-{
-	int err;
-	lv32_t *ul = (lv32_t *)A(ptr);
-	u32 ptr1;
-	size_t size;
-
-	err = get_user(ptr1, &ul->lv_current_pe);
-	if (err)
-		return -EFAULT;
-	err = copy_to_user(ul, l, (long)&((lv32_t *)0)->lv_current_pe);
-	err |= __copy_to_user(&ul->lv_current_le, &l->lv_current_le,
-				((long)&ul->lv_snapshot_org) - ((long)&ul->lv_current_le));
-	err |= __copy_to_user(&ul->lv_remap_ptr, &l->lv_remap_ptr,
-				((long)&ul->dummy[0]) - ((long)&ul->lv_remap_ptr));
-	size = l->lv_allocated_le * sizeof(pe_t);
-	if (ptr1)
-		err |= __copy_to_user((void *)A(ptr1), l->lv_current_pe, size);
-	return err ? -EFAULT : 0;
-}
-
-static int do_lvm_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
-{
-	vg_t *v = NULL;
-	union {
-		lv_req_t lv_req;
-		le_remap_req_t le_remap;
-		lv_status_byindex_req_t lv_byindex;
-	        lv_status_bydev_req_t lv_bydev;
-		pv_status_req_t pv_status;
-	} u;
-	pv_t p;
-	int err;
-	u32 ptr = 0;
-	int i;
-	mm_segment_t old_fs;
-	void *karg = &u;
-
-	switch (cmd) {
-	case VG_STATUS:
-		v = kmalloc(sizeof(vg_t), GFP_KERNEL);
-		if (!v)
-			return -ENOMEM;
-		karg = v;
-		break;
-
-	case VG_CREATE_OLD:
-	case VG_CREATE:
-		v = kmalloc(sizeof(vg_t), GFP_KERNEL);
-		if (!v)
-			return -ENOMEM;
-		if (copy_from_user(v, (void *)arg, (long)&((vg32_t *)0)->proc)) {
-			kfree(v);
-			return -EFAULT;
-		}
-		/* 'proc' field is unused, just NULL it out. */
-		v->proc = NULL;
-		if (copy_from_user(v->vg_uuid, ((vg32_t *)arg)->vg_uuid, UUID_LEN+1)) {
-			kfree(v);
-			return -EFAULT;
-		}
-		    
-		karg = v;
-		memset(v->pv, 0, sizeof(v->pv) + sizeof(v->lv));
-		if (v->pv_max > ABS_MAX_PV || v->lv_max > ABS_MAX_LV)
-			return -EPERM;
-		for (i = 0; i < v->pv_max; i++) {
-			err = __get_user(ptr, &((vg32_t *)arg)->pv[i]);
-			if (err)
-				break;
-			if (ptr) {
-				v->pv[i] = kmalloc(sizeof(pv_t), GFP_KERNEL);
-				if (!v->pv[i]) {
-					err = -ENOMEM;
-					break;
-				}
-				err = copy_from_user(v->pv[i], (void *)A(ptr),
-						     sizeof(pv32_t) - 8 - UUID_LEN+1);
-				if (err) {
-					err = -EFAULT;
-					break;
-				}
-				err = copy_from_user(v->pv[i]->pv_uuid,
-						     ((pv32_t *)A(ptr))->pv_uuid,
-						     UUID_LEN+1);
-				if (err) {
-				        err = -EFAULT;
-					break;
-				}
-
-				v->pv[i]->pe = NULL;
-				v->pv[i]->bd = NULL;
-			}
-		}
-		if (!err) {
-			for (i = 0; i < v->lv_max; i++) {
-				err = __get_user(ptr, &((vg32_t *)arg)->lv[i]);
-				if (err)
-					break;
-				if (ptr) {
-					v->lv[i] = get_lv_t(ptr, &err);
-					if (err)
-						break;
-				}
-			}
-		}
-		break;
-
-	case LV_CREATE:
-	case LV_EXTEND:
-	case LV_REDUCE:
-	case LV_REMOVE:
-	case LV_RENAME:
-	case LV_STATUS_BYNAME:
-	        err = copy_from_user(&u.pv_status, arg, sizeof(u.pv_status.pv_name));
-		if (err)
-			return -EFAULT;
-		if (cmd != LV_REMOVE) {
-			err = __get_user(ptr, &((lv_req32_t *)arg)->lv);
-			if (err)
-				return err;
-			u.lv_req.lv = get_lv_t(ptr, &err);
-		} else
-			u.lv_req.lv = NULL;
-		break;
-
-	case LV_STATUS_BYINDEX:
-		err = get_user(u.lv_byindex.lv_index,
-			       &((lv_status_byindex_req32_t *)arg)->lv_index);
-		err |= __get_user(ptr, &((lv_status_byindex_req32_t *)arg)->lv);
-		if (err)
-			return err;
-		u.lv_byindex.lv = get_lv_t(ptr, &err);
-		break;
-
-	case LV_STATUS_BYDEV:
-	        err = get_user(u.lv_bydev.dev, &((lv_status_bydev_req32_t *)arg)->dev);
-		err |= __get_user(ptr, &((lv_status_bydev_req32_t *)arg)->lv);
-		if (err)
-			return err;
-		u.lv_bydev.lv = get_lv_t(ptr, &err);
-		break;
-
-	case VG_EXTEND:
-		err = copy_from_user(&p, (void *)arg, sizeof(pv32_t) - 8 - UUID_LEN+1);
-		if (err)
-			return -EFAULT;
-		err = copy_from_user(p.pv_uuid, ((pv32_t *)arg)->pv_uuid, UUID_LEN+1);
-		if (err)
-			return -EFAULT;
-		p.pe = NULL;
-		p.bd = NULL;
-		karg = &p;
-		break;
-
-	case PV_CHANGE:
-	case PV_STATUS:
-		err = copy_from_user(&u.pv_status, arg, sizeof(u.lv_req.lv_name));
-		if (err)
-			return -EFAULT;
-		err = __get_user(ptr, &((pv_status_req32_t *)arg)->pv);
-		if (err)
-			return err;
-		u.pv_status.pv = &p;
-		if (cmd == PV_CHANGE) {
-			err = copy_from_user(&p, (void *)A(ptr),
-					     sizeof(pv32_t) - 8 - UUID_LEN+1);
-			if (err)
-				return -EFAULT;
-			p.pe = NULL;
-			p.bd = NULL;
-		}
-		break;
-	};
-
-        old_fs = get_fs(); set_fs (KERNEL_DS);
-        err = sys_ioctl (fd, cmd, (unsigned long)karg);
-        set_fs (old_fs);
-
-	switch (cmd) {
-	case VG_STATUS:
-		if (!err) {
-			if (copy_to_user((void *)arg, v, (long)&((vg32_t *)0)->proc) ||
-			    clear_user(&((vg32_t *)arg)->proc, sizeof(vg32_t) - (long)&((vg32_t *)0)->proc))
-				err = -EFAULT;
-		}
-		if (copy_to_user(((vg32_t *)arg)->vg_uuid, v->vg_uuid, UUID_LEN+1)) {
-		        err = -EFAULT;
-		}
-		kfree(v);
-		break;
-
-	case VG_CREATE_OLD:
-	case VG_CREATE:
-		for (i = 0; i < v->pv_max; i++) {
-			if (v->pv[i])
-				kfree(v->pv[i]);
-		}
-		for (i = 0; i < v->lv_max; i++) {
-			if (v->lv[i])
-				put_lv_t(v->lv[i]);
-		}
-		kfree(v);
-		break;
-
-	case LV_STATUS_BYNAME:
-		if (!err && u.lv_req.lv)
-			err = copy_lv_t(ptr, u.lv_req.lv);
-		/* Fall through */
-
-        case LV_CREATE:
-	case LV_EXTEND:
-	case LV_REDUCE:
-		if (u.lv_req.lv)
-			put_lv_t(u.lv_req.lv);
-		break;
-
-	case LV_STATUS_BYINDEX:
-		if (u.lv_byindex.lv) {
-			if (!err)
-				err = copy_lv_t(ptr, u.lv_byindex.lv);
-			put_lv_t(u.lv_byindex.lv);
-		}
-		break;
-
-	case LV_STATUS_BYDEV:
-	        if (u.lv_bydev.lv) {
-			if (!err)
-				err = copy_lv_t(ptr, u.lv_bydev.lv);
-			put_lv_t(u.lv_byindex.lv);
-	        }
-	        break;
-
-	case PV_STATUS:
-		if (!err) {
-			err = copy_to_user((void *)A(ptr), &p, sizeof(pv32_t) - 8 - UUID_LEN+1);
-			if (err)
-				return -EFAULT;
-			err = copy_to_user(((pv_t *)A(ptr))->pv_uuid, p.pv_uuid, UUID_LEN + 1);
-			if (err)
-				return -EFAULT;
-		}
-		break;
-	};
-
-	return err;
-}
-#endif
-
 #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
 /* This really belongs in include/linux/drm.h -DaveM */
 #include "../../../drivers/char/drm/drm.h"
@@ -3229,7 +2783,7 @@
 static int drm32_version(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	drm32_version_t *uversion = (drm32_version_t *)arg;
-	char *name_ptr, *date_ptr, *desc_ptr;
+	char __user *name_ptr, *date_ptr, *desc_ptr;
 	u32 tmp1, tmp2, tmp3;
 	drm_version_t kversion;
 	mm_segment_t old_fs;
@@ -3244,9 +2798,9 @@
 	    get_user(tmp3, &uversion->desc))
 		return -EFAULT;
 
-	name_ptr = (char *) A(tmp1);
-	date_ptr = (char *) A(tmp2);
-	desc_ptr = (char *) A(tmp3);
+	name_ptr = A(tmp1);
+	date_ptr = A(tmp2);
+	desc_ptr = A(tmp3);
 
 	ret = -ENOMEM;
 	if (kversion.name_len && name_ptr) {
@@ -3309,7 +2863,7 @@
 	drm32_unique_t *uarg = (drm32_unique_t *)arg;
 	drm_unique_t karg;
 	mm_segment_t old_fs;
-	char *uptr;
+	char __user *uptr;
 	u32 tmp;
 	int ret;
 
@@ -3320,7 +2874,7 @@
 	if (get_user(tmp, &uarg->unique))
 		return -EFAULT;
 
-	uptr = (char *) A(tmp);
+	uptr = A(tmp);
 
 	if (uptr) {
 		karg.unique = kmalloc(karg.unique_len, GFP_KERNEL);
@@ -3385,7 +2939,7 @@
 	if (ret)
 		return -EFAULT;
 
-	karg.handle = (void *) A(tmp);
+	karg.handle = A(tmp);
 
 	old_fs = get_fs();
 	set_fs(KERNEL_DS);
@@ -3416,7 +2970,7 @@
 static int drm32_info_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	drm32_buf_info_t *uarg = (drm32_buf_info_t *)arg;
-	drm_buf_desc_t *ulist;
+	drm_buf_desc_t __user *ulist;
 	drm_buf_info_t karg;
 	mm_segment_t old_fs;
 	int orig_count, ret;
@@ -3426,7 +2980,7 @@
 	    get_user(tmp, &uarg->list))
 		return -EFAULT;
 
-	ulist = (drm_buf_desc_t *) A(tmp);
+	ulist = A(tmp);
 
 	orig_count = karg.count;
 
@@ -3464,7 +3018,7 @@
 	drm32_buf_free_t *uarg = (drm32_buf_free_t *)arg;
 	drm_buf_free_t karg;
 	mm_segment_t old_fs;
-	int *ulist;
+	int __user *ulist;
 	int ret;
 	u32 tmp;
 
@@ -3472,7 +3026,7 @@
 	    get_user(tmp, &uarg->list))
 		return -EFAULT;
 
-	ulist = (int *) A(tmp);
+	ulist = A(tmp);
 
 	karg.list = kmalloc(karg.count * sizeof(int), GFP_KERNEL);
 	if (!karg.list)
@@ -3510,7 +3064,7 @@
 static int drm32_map_bufs(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	drm32_buf_map_t *uarg = (drm32_buf_map_t *)arg;
-	drm32_buf_pub_t *ulist;
+	drm32_buf_pub_t __user *ulist;
 	drm_buf_map_t karg;
 	mm_segment_t old_fs;
 	int orig_count, ret, i;
@@ -3521,8 +3075,8 @@
 	    get_user(tmp2, &uarg->list))
 		return -EFAULT;
 
-	karg.virtual = (void *) A(tmp1);
-	ulist = (drm32_buf_pub_t *) A(tmp2);
+	karg.virtual = A(tmp1);
+	ulist = A(tmp2);
 
 	orig_count = karg.count;
 
@@ -3538,7 +3092,7 @@
 		    get_user(tmp1, &ulist[i].address))
 			goto out;
 
-		karg.list[i].address = (void *) A(tmp1);
+		karg.list[i].address = A(tmp1);
 	}
 
 	old_fs = get_fs();
@@ -3589,7 +3143,7 @@
 static int drm32_dma(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	drm32_dma_t *uarg = (drm32_dma_t *) arg;
-	int *u_si, *u_ss, *u_ri, *u_rs;
+	int __user *u_si, *u_ss, *u_ri, *u_rs;
 	drm_dma_t karg;
 	mm_segment_t old_fs;
 	int ret;
@@ -3610,10 +3164,10 @@
 	    get_user(karg.granted_count, &uarg->granted_count))
 		return -EFAULT;
 
-	u_si = (int *) A(tmp1);
-	u_ss = (int *) A(tmp2);
-	u_ri = (int *) A(tmp3);
-	u_rs = (int *) A(tmp4);
+	u_si = A(tmp1);
+	u_ss = A(tmp2);
+	u_ri = A(tmp3);
+	u_rs = A(tmp4);
 
 	if (karg.send_count) {
 		karg.send_indices = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL);
@@ -3699,7 +3253,7 @@
 static int drm32_res_ctx(unsigned int fd, unsigned int cmd, unsigned long arg)
 {
 	drm32_ctx_res_t *uarg = (drm32_ctx_res_t *) arg;
-	drm_ctx_t *ulist;
+	drm_ctx_t __user *ulist;
 	drm_ctx_res_t karg;
 	mm_segment_t old_fs;
 	int orig_count, ret;
@@ -3710,7 +3264,7 @@
 	    get_user(tmp, &uarg->contexts))
 		return -EFAULT;
 
-	ulist = (drm_ctx_t *) A(tmp);
+	ulist = A(tmp);
 
 	orig_count = karg.count;
 	if (karg.count && ulist) {
@@ -3817,7 +3371,8 @@
 	struct usbdevfs_ctrltransfer32 *uctrl;
 	mm_segment_t old_fs;
 	__u32 udata;
-	void *uptr, *kptr;
+	void __user *uptr;
+	void *kptr;
 	int err;
 
 	uctrl = (struct usbdevfs_ctrltransfer32 *) arg;
@@ -3829,7 +3384,7 @@
 
 	if (get_user(udata, &uctrl->data))
 		return -EFAULT;
-	uptr = (void *) A(udata);
+	uptr = A(udata);
 
 	/* In usbdevice_fs, it limits the control buffer to a page,
 	 * for simplicity so do we.
@@ -3878,7 +3433,8 @@
 	struct usbdevfs_bulktransfer32 *ubulk;
 	mm_segment_t old_fs;
 	__u32 udata;
-	void *uptr, *kptr;
+	void __user *uptr;
+	void *kptr;
 	int err;
 
 	ubulk = (struct usbdevfs_bulktransfer32 *) arg;
@@ -3889,7 +3445,7 @@
 	    get_user(udata, &ubulk->data))
 		return -EFAULT;
 
-	uptr = (void *) A(udata);
+	uptr = A(udata);
 
 	/* In usbdevice_fs, it limits the control buffer to a page,
 	 * for simplicity so do we.
@@ -4072,7 +3628,8 @@
 	struct usbdevfs_urb32 *uurb;
 	mm_segment_t old_fs;
 	__u32 udata;
-	void *uptr, *kptr;
+	void __user *uptr;
+	void *kptr;
 	unsigned int buflen;
 	int err;
 
@@ -4096,7 +3653,7 @@
 	err = -EFAULT;
 	if (__get_user(udata, &uurb->buffer))
 		goto out;
-	uptr = (void *) A(udata);
+	uptr = A(udata);
 
 	err = -ENOMEM;
 	buflen = kurb->buffer_length;
@@ -4153,7 +3710,7 @@
 	set_fs(old_fs);
 
 	if (err >= 0 &&
-	    put_user(((u32)(long)kptr), (u32 *) A(arg)))
+	    put_user(((u32)(long)kptr), (u32 __user *) A(arg)))
 		err = -EFAULT;
 
 	return err;
@@ -4205,7 +3762,7 @@
 	struct mtd_oob_buf32	*uarg 	= (struct mtd_oob_buf32 *)arg;
 	struct mtd_oob_buf		karg;
 	u32 tmp;
-	char *ptr;
+	char __user *ptr;
 	int ret;
 
 	if (get_user(karg.start, &uarg->start) 		||
@@ -4213,7 +3770,7 @@
 	    get_user(tmp, &uarg->ptr))
 		return -EFAULT;
 
-	ptr = (char *)A(tmp);
+	ptr = A(tmp);
 	if (0 >= karg.length) 
 		return -EINVAL;
 
@@ -4890,28 +4447,6 @@
 COMPATIBLE_IOCTL(ATMTCP_REMOVE)
 COMPATIBLE_IOCTL(ATMMPC_CTRL)
 COMPATIBLE_IOCTL(ATMMPC_DATA)
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-/* 0xfe - lvm */
-COMPATIBLE_IOCTL(VG_SET_EXTENDABLE)
-COMPATIBLE_IOCTL(VG_STATUS_GET_COUNT)
-COMPATIBLE_IOCTL(VG_STATUS_GET_NAMELIST)
-COMPATIBLE_IOCTL(VG_REMOVE)
-COMPATIBLE_IOCTL(VG_RENAME)
-COMPATIBLE_IOCTL(VG_REDUCE)
-COMPATIBLE_IOCTL(PE_LOCK_UNLOCK)
-COMPATIBLE_IOCTL(PV_FLUSH)
-COMPATIBLE_IOCTL(LVM_LOCK_LVM)
-COMPATIBLE_IOCTL(LVM_GET_IOP_VERSION)
-#ifdef LVM_TOTAL_RESET
-COMPATIBLE_IOCTL(LVM_RESET)
-#endif
-COMPATIBLE_IOCTL(LV_SET_ACCESS)
-COMPATIBLE_IOCTL(LV_SET_STATUS)
-COMPATIBLE_IOCTL(LV_SET_ALLOCATION)
-COMPATIBLE_IOCTL(LE_REMAP)
-COMPATIBLE_IOCTL(LV_BMAP)
-COMPATIBLE_IOCTL(LV_SNAPSHOT_USE_RATE)
-#endif /* LVM */
 #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
 COMPATIBLE_IOCTL(DRM_IOCTL_GET_MAGIC)
 COMPATIBLE_IOCTL(DRM_IOCTL_IRQ_BUSID)
@@ -5175,22 +4710,6 @@
 HANDLE_IOCTL(SONET_SETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRAMING, do_atm_ioctl)
 HANDLE_IOCTL(SONET_GETFRSENSE, do_atm_ioctl)
-#if defined(CONFIG_BLK_DEV_LVM) || defined(CONFIG_BLK_DEV_LVM_MODULE)
-HANDLE_IOCTL(VG_STATUS, do_lvm_ioctl)
-HANDLE_IOCTL(VG_CREATE_OLD, do_lvm_ioctl)
-HANDLE_IOCTL(VG_CREATE, do_lvm_ioctl)
-HANDLE_IOCTL(VG_EXTEND, do_lvm_ioctl)
-HANDLE_IOCTL(LV_CREATE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_REMOVE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_EXTEND, do_lvm_ioctl)
-HANDLE_IOCTL(LV_REDUCE, do_lvm_ioctl)
-HANDLE_IOCTL(LV_RENAME, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYNAME, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYINDEX, do_lvm_ioctl)
-HANDLE_IOCTL(LV_STATUS_BYDEV, do_lvm_ioctl)
-HANDLE_IOCTL(PV_CHANGE, do_lvm_ioctl)
-HANDLE_IOCTL(PV_STATUS, do_lvm_ioctl)
-#endif /* LVM */
 #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/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
--- a/arch/sparc64/kernel/process.c	Sat Apr 19 19:51:47 2003
+++ b/arch/sparc64/kernel/process.c	Sat Apr 19 19:51:47 2003
@@ -473,7 +473,7 @@
 
 	distance = fp - psp;
 	rval = (csp - distance);
-	if (copy_in_user(rval, psp, distance))
+	if (copy_in_user((void __user *) rval, (void __user *) psp, distance))
 		rval = 0;
 	else if (test_thread_flag(TIF_32BIT)) {
 		if (put_user(((u32)csp), &(((struct reg_window32 *)rval)->ins[6])))
diff -Nru a/arch/sparc64/kernel/signal.c b/arch/sparc64/kernel/signal.c
--- a/arch/sparc64/kernel/signal.c	Sat Apr 19 19:51:48 2003
+++ b/arch/sparc64/kernel/signal.c	Sat Apr 19 19:51:48 2003
@@ -42,8 +42,8 @@
 /* {set, get}context() needed for 64-bit SparcLinux userland. */
 asmlinkage void sparc64_set_context(struct pt_regs *regs)
 {
-	struct ucontext *ucp = (struct ucontext *) regs->u_regs[UREG_I0];
-	mc_gregset_t *grp;
+	struct ucontext *ucp = (struct ucontext __user *) regs->u_regs[UREG_I0];
+	mc_gregset_t __user *grp;
 	unsigned long pc, npc, tstate;
 	unsigned long fp, i7;
 	unsigned char fenab;
@@ -104,9 +104,9 @@
 	err |= __get_user(fp, &(ucp->uc_mcontext.mc_fp));
 	err |= __get_user(i7, &(ucp->uc_mcontext.mc_i7));
 	err |= __put_user(fp,
-	      (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6])));
+	      (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6])));
 	err |= __put_user(i7,
-	      (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7])));
+	      (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7])));
 
 	err |= __get_user(fenab, &(ucp->uc_mcontext.mc_fpregs.mcfpu_enab));
 	if (fenab) {
@@ -121,7 +121,7 @@
 					      (sizeof(unsigned int) * 32));
 		if (fprs & FPRS_DU)
 			err |= copy_from_user(fpregs+16,
-			 ((unsigned long *)&(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs))+16,
+			 ((unsigned long __user *)&(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs))+16,
 			 (sizeof(unsigned int) * 32));
 		err |= __get_user(current_thread_info()->xfsr[0],
 				  &(ucp->uc_mcontext.mc_fpregs.mcfpu_fsr));
@@ -139,9 +139,9 @@
 
 asmlinkage void sparc64_get_context(struct pt_regs *regs)
 {
-	struct ucontext *ucp = (struct ucontext *) regs->u_regs[UREG_I0];
-	mc_gregset_t *grp;
-	mcontext_t *mcp;
+	struct ucontext *ucp = (struct ucontext __user *) regs->u_regs[UREG_I0];
+	mc_gregset_t __user *grp;
+	mcontext_t __user *mcp;
 	unsigned long fp, i7;
 	unsigned char fenab;
 	int err;
@@ -170,7 +170,7 @@
 	err = 0;
 	if (_NSIG_WORDS == 1)
 		err |= __put_user(current->blocked.sig[0],
-				  (unsigned long *)&ucp->uc_sigmask);
+				  (unsigned long __user *)&ucp->uc_sigmask);
 	else
 		err |= __copy_to_user(&ucp->uc_sigmask, &current->blocked,
 				      sizeof(sigset_t));
@@ -196,9 +196,9 @@
 	err |= __put_user(regs->u_regs[UREG_I7], &((*grp)[MC_O7]));
 
 	err |= __get_user(fp,
-		 (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6])));
+		 (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6])));
 	err |= __get_user(i7,
-		 (&(((struct reg_window *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7])));
+		 (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7])));
 	err |= __put_user(fp, &(mcp->mc_fp));
 	err |= __put_user(i7, &(mcp->mc_i7));
 
@@ -213,7 +213,7 @@
 					    (sizeof(unsigned int) * 32));
 		if (fprs & FPRS_DU)
 			err |= copy_to_user(
-                          ((unsigned long *)&(mcp->mc_fpregs.mcfpu_fregs))+16, fpregs+16,
+                          ((unsigned long __user *)&(mcp->mc_fpregs.mcfpu_fregs))+16, fpregs+16,
 			  (sizeof(unsigned int) * 32));
 		err |= __put_user(current_thread_info()->xfsr[0], &(mcp->mc_fpregs.mcfpu_fsr));
 		err |= __put_user(current_thread_info()->gsr[0], &(mcp->mc_fpregs.mcfpu_gsr));
@@ -231,7 +231,7 @@
 	struct sparc_stackf	ss;
 	siginfo_t		info;
 	struct pt_regs		regs;
-	__siginfo_fpu_t *	fpu_save;
+	__siginfo_fpu_t __user	*fpu_save;
 	stack_t			stack;
 	sigset_t		mask;
 	__siginfo_fpu_t		fpu_state;
@@ -300,7 +300,7 @@
 	_sigpause_common(regs->u_regs[UREG_I0], regs);
 }
 
-asmlinkage void do_rt_sigsuspend(sigset_t *uset, size_t sigsetsize, struct pt_regs *regs)
+asmlinkage void do_rt_sigsuspend(sigset_t __user *uset, size_t sigsetsize, struct pt_regs *regs)
 {
 	sigset_t oldset, set;
         
@@ -351,7 +351,7 @@
 }
 
 static inline int
-restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
+restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
 {
 	unsigned long *fpregs = current_thread_info()->fpregs;
 	unsigned long fprs;
@@ -374,16 +374,16 @@
 
 void do_rt_sigreturn(struct pt_regs *regs)
 {
-	struct rt_signal_frame *sf;
+	struct rt_signal_frame __user *sf;
 	unsigned long tpc, tnpc, tstate;
-	__siginfo_fpu_t *fpu_save;
+	__siginfo_fpu_t __user *fpu_save;
 	mm_segment_t old_fs;
 	sigset_t set;
 	stack_t st;
 	int err;
 
 	synchronize_user_stack ();
-	sf = (struct rt_signal_frame *)
+	sf = (struct rt_signal_frame __user *)
 		(regs->u_regs [UREG_FP] + STACK_BIAS);
 
 	/* 1. Make sure we are not getting garbage from the user */
@@ -438,7 +438,7 @@
 }
 
 /* Checks if the fp is valid */
-static int invalid_frame_pointer(void *fp, int fplen)
+static int invalid_frame_pointer(void __user *fp, int fplen)
 {
 	if (((unsigned long) fp) & 7)
 		return 1;
@@ -446,7 +446,7 @@
 }
 
 static inline int
-save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t *fpu)
+save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
 {
 	unsigned long *fpregs = (unsigned long *)(regs+1);
 	unsigned long fprs;
@@ -466,7 +466,7 @@
 	return err;
 }
 
-static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize)
+static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize)
 {
 	unsigned long sp;
 
@@ -478,14 +478,14 @@
 		    !((current->sas_ss_sp + current->sas_ss_size) & 7))
 			sp = current->sas_ss_sp + current->sas_ss_size;
 	}
-	return (void *)(sp - framesize);
+	return (void __user *)(sp - framesize);
 }
 
 static inline void
 setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
 	       int signo, sigset_t *oldset, siginfo_t *info)
 {
-	struct rt_signal_frame *sf;
+	struct rt_signal_frame __user *sf;
 	int sigframe_size, err;
 
 	/* 1. Make sure everything is clean */
@@ -496,7 +496,8 @@
 	if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
 		sigframe_size -= sizeof(__siginfo_fpu_t);
 
-	sf = (struct rt_signal_frame *)get_sigframe(ka, regs, sigframe_size);
+	sf = (struct rt_signal_frame __user *)
+		get_sigframe(ka, regs, sigframe_size);
 	
 	if (invalid_frame_pointer (sf, sigframe_size))
 		goto sigill;
@@ -521,8 +522,8 @@
 
 	err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t));
 
-	err |= copy_in_user((u64 *)sf,
-			    (u64 *)(regs->u_regs[UREG_FP]+STACK_BIAS),
+	err |= copy_in_user((u64 __user *)sf,
+			    (u64 __user *)(regs->u_regs[UREG_FP]+STACK_BIAS),
 			    sizeof(struct reg_window));
 
 	if (info)
@@ -560,7 +561,8 @@
 				 siginfo_t *info,
 				 sigset_t *oldset, struct pt_regs *regs)
 {
-	setup_rt_frame(ka, regs, signr, oldset, (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
+	setup_rt_frame(ka, regs, signr, oldset,
+		       (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL);
 	if (ka->sa.sa_flags & SA_ONESHOT)
 		ka->sa.sa_handler = SIG_DFL;
 	if (!(ka->sa.sa_flags & SA_NOMASK)) {
diff -Nru a/arch/sparc64/kernel/signal32.c b/arch/sparc64/kernel/signal32.c
--- a/arch/sparc64/kernel/signal32.c	Sat Apr 19 19:51:27 2003
+++ b/arch/sparc64/kernel/signal32.c	Sat Apr 19 19:51:27 2003
@@ -56,7 +56,7 @@
 	/* struct sigcontext32 * */ u32 sig_scptr;
 	int sig_address;
 	struct sigcontext32 sig_context;
-	unsigned extramask[_COMPAT_NSIG_WORDS - 1];
+	unsigned int extramask[_COMPAT_NSIG_WORDS - 1];
 };
 
 /* 
@@ -68,9 +68,9 @@
 	struct sparc_stackf32	ss;
 	__siginfo32_t		info;
 	/* __siginfo_fpu32_t * */ u32 fpu_save;
-	unsigned int		insns [2];
-	unsigned		extramask[_COMPAT_NSIG_WORDS - 1];
-	unsigned		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
+	unsigned int		insns[2];
+	unsigned int		extramask[_COMPAT_NSIG_WORDS - 1];
+	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
 	/* Only valid if (info.si_regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
 	siginfo_extra_v8plus_t	v8plus;
 	__siginfo_fpu_t		fpu_state;
@@ -82,9 +82,9 @@
 	struct pt_regs32	regs;
 	compat_sigset_t		mask;
 	/* __siginfo_fpu32_t * */ u32 fpu_save;
-	unsigned int		insns [2];
+	unsigned int		insns[2];
 	stack_t32		stack;
-	unsigned		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
+	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */
 	/* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */
 	siginfo_extra_v8plus_t	v8plus;
 	__siginfo_fpu_t		fpu_state;
@@ -95,11 +95,11 @@
 #define NF_ALIGNEDSZ  (((sizeof(struct new_signal_frame32) + 7) & (~7)))
 #define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame32) + 7) & (~7)))
 
-int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from)
+int copy_siginfo_to_user32(siginfo_t32 __user *to, siginfo_t *from)
 {
 	int err;
 
-	if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
+	if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t32)))
 		return -EFAULT;
 
 	/* If you change siginfo_t structure, please be sure
@@ -187,7 +187,7 @@
 		regs->u_regs[UREG_I0] = EINVAL;
 		return;
 	}
-	if (copy_from_user(&set32, (void *)(long)uset, sizeof(set32))) {
+	if (copy_from_user(&set32, (void __user *)(long)uset, sizeof(set32))) {
 		regs->tstate |= TSTATE_ICARRY;
 		regs->u_regs[UREG_I0] = EFAULT;
 		return;
@@ -231,7 +231,7 @@
 	}
 }
 
-static int restore_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t *fpu)
+static int restore_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
 {
 	unsigned long *fpregs = current_thread_info()->fpregs;
 	unsigned long fprs;
@@ -252,7 +252,7 @@
 
 void do_new_sigreturn32(struct pt_regs *regs)
 {
-	struct new_signal_frame32 *sf;
+	struct new_signal_frame32 __user *sf;
 	unsigned int psr;
 	unsigned pc, npc, fpu_save;
 	sigset_t set;
@@ -260,10 +260,10 @@
 	int err, i;
 	
 	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
-	sf = (struct new_signal_frame32 *) regs->u_regs [UREG_FP];
+	sf = (struct new_signal_frame32 __user *) regs->u_regs[UREG_FP];
 
 	/* 1. Make sure we are not getting garbage from the user */
-	if (verify_area (VERIFY_READ, sf, sizeof (*sf))	||
+	if (verify_area(VERIFY_READ, sf, sizeof(*sf))	||
 	    (((unsigned long) sf) & 3))
 		goto segv;
 
@@ -302,7 +302,8 @@
 	if (fpu_save)
 		err |= restore_fpu_state32(regs, &sf->fpu_state);
 	err |= __get_user(seta[0], &sf->info.si_mask);
-	err |= copy_from_user(seta+1, &sf->extramask, (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned));
+	err |= copy_from_user(seta+1, &sf->extramask,
+			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
 	if (err)
 	    	goto segv;
 	switch (_NSIG_WORDS) {
@@ -324,17 +325,17 @@
 
 asmlinkage void do_sigreturn32(struct pt_regs *regs)
 {
-	struct sigcontext32 *scptr;
-	unsigned pc, npc, psr;
+	struct sigcontext32 __user *scptr;
+	unsigned int pc, npc, psr;
 	sigset_t set;
-	unsigned seta[_COMPAT_NSIG_WORDS];
+	unsigned int seta[_COMPAT_NSIG_WORDS];
 	int err;
 
 	synchronize_user_stack();
 	if (test_thread_flag(TIF_NEWSIGNALS))
 		return do_new_sigreturn32(regs);
 
-	scptr = (struct sigcontext32 *)
+	scptr = (struct sigcontext32 __user *)
 		(regs->u_regs[UREG_I0] & 0x00000000ffffffffUL);
 	/* Check sanity of the user arg. */
 	if (verify_area(VERIFY_READ, scptr, sizeof(struct sigcontext32)) ||
@@ -349,7 +350,8 @@
 
 	err |= __get_user(seta[0], &scptr->sigc_mask);
 	/* Note that scptr + 1 points to extramask */
-	err |= copy_from_user(seta+1, scptr + 1, (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned));
+	err |= copy_from_user(seta+1, scptr + 1,
+			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
 	if (err)
 	    	goto segv;
 	switch (_NSIG_WORDS) {
@@ -388,9 +390,8 @@
 
 asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
 {
-	struct rt_signal_frame32 *sf;
-	unsigned int psr;
-	unsigned pc, npc, fpu_save;
+	struct rt_signal_frame32 __user *sf;
+	unsigned int psr, pc, npc, fpu_save;
 	mm_segment_t old_fs;
 	sigset_t set;
 	compat_sigset_t seta;
@@ -399,10 +400,10 @@
 	
 	synchronize_user_stack();
 	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
-	sf = (struct rt_signal_frame32 *) regs->u_regs [UREG_FP];
+	sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP];
 
 	/* 1. Make sure we are not getting garbage from the user */
-	if (verify_area (VERIFY_READ, sf, sizeof (*sf))	||
+	if (verify_area(VERIFY_READ, sf, sizeof(*sf))	||
 	    (((unsigned long) sf) & 3))
 		goto segv;
 
@@ -471,14 +472,14 @@
 }
 
 /* Checks if the fp is valid */
-static int invalid_frame_pointer(void *fp, int fplen)
+static int invalid_frame_pointer(void __user *fp, int fplen)
 {
 	if ((((unsigned long) fp) & 7) || ((unsigned long)fp) > 0x100000000ULL - fplen)
 		return 1;
 	return 0;
 }
 
-static void *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
+static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize)
 {
 	unsigned long sp;
 	
@@ -490,25 +491,21 @@
 		if (!on_sig_stack(sp) && !((current->sas_ss_sp + current->sas_ss_size) & 7))
 			sp = current->sas_ss_sp + current->sas_ss_size;
 	}
-	return (void *)(sp - framesize);
+	return (void __user *)(sp - framesize);
 }
 
 static void
 setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
 {
-	struct signal_sframe32 *sframep;
-	struct sigcontext32 *sc;
-	unsigned seta[_COMPAT_NSIG_WORDS];
+	struct signal_sframe32 __user *sframep;
+	struct sigcontext32 __user *sc;
+	unsigned int seta[_COMPAT_NSIG_WORDS];
 	int err = 0;
 	void *sig_address;
 	int sig_code;
 	unsigned long pc = regs->tpc;
 	unsigned long npc = regs->tnpc;
-	
-#if 0	
-	int window = 0;
-#endif	
-	unsigned psr;
+	unsigned int psr;
 
 	if (test_thread_flag(TIF_32BIT)) {
 		pc &= 0xffffffff;
@@ -518,8 +515,9 @@
 	synchronize_user_stack();
 	save_and_clear_fpu();
 
-	sframep = (struct signal_sframe32 *)get_sigframe(sa, regs, SF_ALIGNEDSZ);
-	if (invalid_frame_pointer (sframep, sizeof(*sframep))){
+	sframep = (struct signal_sframe32 __user *)
+		get_sigframe(sa, regs, SF_ALIGNEDSZ);
+	if (invalid_frame_pointer(sframep, sizeof(*sframep))){
 		/* Don't change signal code and address, so that
 		 * post mortem debuggers can have a look.
 		 */
@@ -544,32 +542,21 @@
 	}
 	err |= __put_user(seta[0], &sc->sigc_mask);
 	err |= __copy_to_user(sframep->extramask, seta + 1,
-			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned));
+			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
 	err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
 	err |= __put_user(pc, &sc->sigc_pc);
 	err |= __put_user(npc, &sc->sigc_npc);
-	psr = tstate_to_psr (regs->tstate);
+	psr = tstate_to_psr(regs->tstate);
 	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
 		psr |= PSR_EF;
 	err |= __put_user(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(get_thread_wsaved(), &sc->sigc_oswins);
-#if 0
-/* w_saved is not currently used... */
-	if (get_thread_wsaved())
-		for (window = 0; window < get_thread_wsaved(); window++) {
-			sc->sigc_spbuf[window] =
-				(char *) current_thread_info()->rwbuf_stkptrs[window];
-			err |= copy_to_user(&sc->sigc_wbuf[window],
-					    &current_thread_info()->reg_window[window],
-					    sizeof(struct reg_window));
-		}
-	else
-#endif	
-		err |= copy_in_user((u32 *)sframep,
-				    (u32 *)(regs->u_regs[UREG_FP]),
-				    sizeof(struct reg_window32));
+
+	err |= copy_in_user((u32 __user *)sframep,
+			    (u32 __user *)(regs->u_regs[UREG_FP]),
+			    sizeof(struct reg_window32));
 		       
 	set_thread_wsaved(0); /* So process is allowed to execute. */
 	err |= __put_user(signr, &sframep->sig_num);
@@ -588,7 +575,7 @@
 			switch (info->si_code) {
 			case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
 			case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
-			case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP (info->si_trapno); break;
+			case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP(info->si_trapno); break;
 			default: sig_code = SUBSIG_STACK; break;
 			}
 			break;
@@ -646,7 +633,7 @@
 }
 
 
-static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t *fpu)
+static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
 {
 	unsigned long *fpregs = current_thread_info()->fpregs;
 	unsigned long fprs;
@@ -669,11 +656,11 @@
 static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
 			      int signo, sigset_t *oldset)
 {
-	struct new_signal_frame32 *sf;
+	struct new_signal_frame32 __user *sf;
 	int sigframe_size;
 	u32 psr;
 	int i, err;
-	unsigned seta[_COMPAT_NSIG_WORDS];
+	unsigned int seta[_COMPAT_NSIG_WORDS];
 
 	/* 1. Make sure everything is clean */
 	synchronize_user_stack();
@@ -683,9 +670,10 @@
 	if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
 		sigframe_size -= sizeof(__siginfo_fpu_t);
 
-	sf = (struct new_signal_frame32 *)get_sigframe(&ka->sa, regs, sigframe_size);
+	sf = (struct new_signal_frame32 __user *)
+		get_sigframe(&ka->sa, regs, sigframe_size);
 	
-	if (invalid_frame_pointer (sf, sigframe_size))
+	if (invalid_frame_pointer(sf, sigframe_size))
 		goto sigill;
 
 	if (get_thread_wsaved() != 0)
@@ -699,7 +687,7 @@
 	err  = put_user(regs->tpc, &sf->info.si_regs.pc);
 	err |= __put_user(regs->tnpc, &sf->info.si_regs.npc);
 	err |= __put_user(regs->y, &sf->info.si_regs.y);
-	psr = tstate_to_psr (regs->tstate);
+	psr = tstate_to_psr(regs->tstate);
 	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
 		psr |= PSR_EF;
 	err |= __put_user(psr, &sf->info.si_regs.psr);
@@ -729,10 +717,10 @@
 	}
 	err |= __put_user(seta[0], &sf->info.si_mask);
 	err |= __copy_to_user(sf->extramask, seta + 1,
-			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned));
+			      (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
 
-	err |= copy_in_user((u32 *)sf,
-			    (u32 *)(regs->u_regs[UREG_FP]),
+	err |= copy_in_user((u32 __user *)sf,
+			    (u32 __user *)(regs->u_regs[UREG_FP]),
 			    sizeof(struct reg_window32));
 	
 	if (err)
@@ -771,7 +759,8 @@
 		preempt_disable();
 		ptep = pte_offset_map(pmdp, address);
 		if (pte_present(*ptep)) {
-			unsigned long page = (unsigned long) page_address(pte_page(*ptep));
+			unsigned long page = (unsigned long)
+				page_address(pte_page(*ptep));
 
 			__asm__ __volatile__(
 			"	membar	#StoreStore\n"
@@ -795,30 +784,29 @@
 setup_svr4_frame32(struct sigaction *sa, unsigned long pc, unsigned long npc,
 		   struct pt_regs *regs, int signr, sigset_t *oldset)
 {
-	svr4_signal_frame_t *sfp;
-	svr4_gregset_t  *gr;
-	svr4_siginfo_t  *si;
-	svr4_mcontext_t *mc;
-	svr4_gwindows_t *gw;
-	svr4_ucontext_t *uc;
+	svr4_signal_frame_t __user *sfp;
+	svr4_gregset_t  __user *gr;
+	svr4_siginfo_t  __user *si;
+	svr4_mcontext_t __user *mc;
+	svr4_gwindows_t __user *gw;
+	svr4_ucontext_t __user *uc;
 	svr4_sigset_t setv;
-#if 0	
-	int window = 0;
-#endif	
-	unsigned psr;
+	unsigned int psr;
 	int i, err;
 
 	synchronize_user_stack();
 	save_and_clear_fpu();
 	
 	regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
-	sfp = (svr4_signal_frame_t *) get_sigframe(sa, regs, sizeof(struct reg_window32) + SVR4_SF_ALIGNED);
+	sfp = (svr4_signal_frame_t __user *)
+		get_sigframe(sa, regs,
+			     sizeof(struct reg_window32) + SVR4_SF_ALIGNED);
 
-	if (invalid_frame_pointer (sfp, sizeof (*sfp)))
+	if (invalid_frame_pointer(sfp, sizeof(*sfp)))
 		do_exit(SIGILL);
 
 	/* Start with a clean frame pointer and fill it */
-	err = clear_user(sfp, sizeof (*sfp));
+	err = clear_user(sfp, sizeof(*sfp));
 
 	/* Setup convenience variables */
 	si = &sfp->si;
@@ -838,22 +826,23 @@
 		setv.sigbits[3] = (oldset->sig[1] >> 32);
 		err |= __copy_to_user(&uc->sigmask, &setv, sizeof(svr4_sigset_t));
 	} else
-		err |= __copy_to_user(&uc->sigmask, &setv, 2 * sizeof(unsigned));
+		err |= __copy_to_user(&uc->sigmask, &setv,
+				      2 * sizeof(unsigned int));
 	
 	/* Store registers */
 	if (test_thread_flag(TIF_32BIT)) {
 		regs->tpc &= 0xffffffff;
 		regs->tnpc &= 0xffffffff;
 	}
-	err |= __put_user(regs->tpc, &((*gr) [SVR4_PC]));
-	err |= __put_user(regs->tnpc, &((*gr) [SVR4_NPC]));
-	psr = tstate_to_psr (regs->tstate);
+	err |= __put_user(regs->tpc, &((*gr)[SVR4_PC]));
+	err |= __put_user(regs->tnpc, &((*gr)[SVR4_NPC]));
+	psr = tstate_to_psr(regs->tstate);
 	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
 		psr |= PSR_EF;
-	err |= __put_user(psr, &((*gr) [SVR4_PSR]));
-	err |= __put_user(regs->y, &((*gr) [SVR4_Y]));
+	err |= __put_user(psr, &((*gr)[SVR4_PSR]));
+	err |= __put_user(regs->y, &((*gr)[SVR4_Y]));
 	
-	/* Copy g [1..7] and o [0..7] registers */
+	/* Copy g[1..7] and o[0..7] registers */
 	for (i = 0; i < 7; i++)
 		err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
 	for (i = 0; i < 8; i++)
@@ -872,29 +861,7 @@
 	/* 2. Number of windows to restore at setcontext (): */
 	err |= __put_user(get_thread_wsaved(), &gw->count);
 
-	/* 3. Save each valid window
-	 *    Currently, it makes a copy of the windows from the kernel copy.
-	 *    David's code for SunOS, makes the copy but keeps the pointer to
-	 *    the kernel.  My version makes the pointer point to a userland 
-	 *    copy of those.  Mhm, I wonder if I shouldn't just ignore those
-	 *    on setcontext and use those that are on the kernel, the signal
-	 *    handler should not be modyfing those, mhm.
-	 *
-	 *    These windows are just used in case synchronize_user_stack failed
-	 *    to flush the user windows.
-	 */
-#if 0	 
-	for (window = 0; window < get_thread_wsaved(); window++) {
-		err |= __put_user((int *) &(gw->win[window]),
-				  (int **) gw->winptr + window);
-		err |= copy_to_user(&gw->win[window],
-				    &current_thread_info()->reg_window[window],
-				    sizeof (svr4_rwindow_t));
-		err |= __put_user(0, (int *) gw->winptr + window);
-	}
-#endif	
-
-	/* 4. We just pay attention to the gw->count field on setcontext */
+	/* 3. We just pay attention to the gw->count field on setcontext */
 	set_thread_wsaved(0); /* So process is allowed to execute. */
 
 	/* Setup the signal information.  Solaris expects a bunch of
@@ -915,14 +882,14 @@
 	}
 
 	/* Arguments passed to signal handler */
-	if (regs->u_regs [14]){
-		struct reg_window32 *rw = (struct reg_window32 *)
-			(regs->u_regs [14] & 0x00000000ffffffffUL);
-
-		err |= __put_user(signr, &rw->ins [0]);
-		err |= __put_user((u64)si, &rw->ins [1]);
-		err |= __put_user((u64)uc, &rw->ins [2]);
-		err |= __put_user((u64)sfp, &rw->ins [6]);	/* frame pointer */
+	if (regs->u_regs[14]){
+		struct reg_window32 __user *rw = (struct reg_window32 __user *)
+			(regs->u_regs[14] & 0x00000000ffffffffUL);
+
+		err |= __put_user(signr, &rw->ins[0]);
+		err |= __put_user((u64)si, &rw->ins[1]);
+		err |= __put_user((u64)uc, &rw->ins[2]);
+		err |= __put_user((u64)sfp, &rw->ins[6]);	/* frame pointer */
 		if (err)
 			goto sigsegv;
 
@@ -937,20 +904,21 @@
 }
 
 asmlinkage int
-svr4_getcontext(svr4_ucontext_t *uc, struct pt_regs *regs)
+svr4_getcontext(svr4_ucontext_t __user *uc, struct pt_regs *regs)
 {
-	svr4_gregset_t  *gr;
-	svr4_mcontext_t *mc;
+	svr4_gregset_t  __user *gr;
+	svr4_mcontext_t __user *mc;
 	svr4_sigset_t setv;
 	int i, err;
+	u32 psr;
 
 	synchronize_user_stack();
 	save_and_clear_fpu();
 	
 	if (get_thread_wsaved())
-		do_exit (SIGSEGV);
+		do_exit(SIGSEGV);
 
-	err = clear_user(uc, sizeof (*uc));
+	err = clear_user(uc, sizeof(*uc));
 
 	/* Setup convenience variables */
 	mc = &uc->mcontext;
@@ -970,19 +938,17 @@
 		regs->tpc &= 0xffffffff;
 		regs->tnpc &= 0xffffffff;
 	}
-	err |= __put_user(regs->tpc, &uc->mcontext.greg [SVR4_PC]);
-	err |= __put_user(regs->tnpc, &uc->mcontext.greg [SVR4_NPC]);
-#if 1
-	err |= __put_user(0, &uc->mcontext.greg [SVR4_PSR]);
-#else
-	i = tstate_to_psr(regs->tstate) & ~PSR_EF;		   
+	err |= __put_user(regs->tpc, &uc->mcontext.greg[SVR4_PC]);
+	err |= __put_user(regs->tnpc, &uc->mcontext.greg[SVR4_NPC]);
+
+	psr = tstate_to_psr(regs->tstate) & ~PSR_EF;		   
 	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
-		i |= PSR_EF;
-	err |= __put_user(i, &uc->mcontext.greg [SVR4_PSR]);
-#endif
-	err |= __put_user(regs->y, &uc->mcontext.greg [SVR4_Y]);
+		psr |= PSR_EF;
+	err |= __put_user(psr, &uc->mcontext.greg[SVR4_PSR]);
+
+	err |= __put_user(regs->y, &uc->mcontext.greg[SVR4_Y]);
 	
-	/* Copy g [1..7] and o [0..7] registers */
+	/* Copy g[1..7] and o[0..7] registers */
 	for (i = 0; i < 7; i++)
 		err |= __put_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
 	for (i = 0; i < 8; i++)
@@ -1001,9 +967,9 @@
 
 
 /* Set the context for a svr4 application, this is Solaris way to sigreturn */
-asmlinkage int svr4_setcontext(svr4_ucontext_t *c, struct pt_regs *regs)
+asmlinkage int svr4_setcontext(svr4_ucontext_t __user *c, struct pt_regs *regs)
 {
-	svr4_gregset_t  *gr;
+	svr4_gregset_t  __user *gr;
 	mm_segment_t old_fs;
 	u32 pc, npc, psr;
 	sigset_t set;
@@ -1020,7 +986,7 @@
 		goto sigsegv;
 
 	if (((unsigned long) c) & 3){
-		printk ("Unaligned structure passed\n");
+		printk("Unaligned structure passed\n");
 		goto sigsegv;
 	}
 
@@ -1040,7 +1006,7 @@
 	/* note that nPC is ored a 1, this is used to inform entry.S */
 	/* that we don't want it to mess with our PC and nPC */
 	
-	err |= copy_from_user (&setv, &c->sigmask, sizeof(svr4_sigset_t));
+	err |= copy_from_user(&setv, &c->sigmask, sizeof(svr4_sigset_t));
 	set.sig[0] = setv.sigbits[0] | (((long)setv.sigbits[1]) << 32);
 	if (_NSIG_WORDS >= 2)
 		set.sig[1] = setv.sigbits[2] | (((long)setv.sigbits[3]) << 32);
@@ -1069,14 +1035,11 @@
 		regs->tpc &= 0xffffffff;
 		regs->tnpc &= 0xffffffff;
 	}
-	err |= __get_user(regs->y, &((*gr) [SVR4_Y]));
-	err |= __get_user(psr, &((*gr) [SVR4_PSR]));
+	err |= __get_user(regs->y, &((*gr)[SVR4_Y]));
+	err |= __get_user(psr, &((*gr)[SVR4_PSR]));
 	regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
 	regs->tstate |= psr_to_tstate_icc(psr);
-#if 0	
-	if (psr & PSR_EF)
-		regs->tstate |= TSTATE_PEF;
-#endif
+
 	/* Restore g[1..7] and o[0..7] registers */
 	for (i = 0; i < 7; i++)
 		err |= __get_user(regs->u_regs[UREG_G1+i], (&(*gr)[SVR4_G1])+i);
@@ -1094,7 +1057,7 @@
 			     unsigned long signr, sigset_t *oldset,
 			     siginfo_t *info)
 {
-	struct rt_signal_frame32 *sf;
+	struct rt_signal_frame32 __user *sf;
 	int sigframe_size;
 	u32 psr;
 	int i, err;
@@ -1108,9 +1071,10 @@
 	if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
 		sigframe_size -= sizeof(__siginfo_fpu_t);
 
-	sf = (struct rt_signal_frame32 *)get_sigframe(&ka->sa, regs, sigframe_size);
+	sf = (struct rt_signal_frame32 __user *)
+		get_sigframe(&ka->sa, regs, sigframe_size);
 	
-	if (invalid_frame_pointer (sf, sigframe_size))
+	if (invalid_frame_pointer(sf, sigframe_size))
 		goto sigill;
 
 	if (get_thread_wsaved() != 0)
@@ -1124,7 +1088,7 @@
 	err  = put_user(regs->tpc, &sf->regs.pc);
 	err |= __put_user(regs->tnpc, &sf->regs.npc);
 	err |= __put_user(regs->y, &sf->regs.y);
-	psr = tstate_to_psr (regs->tstate);
+	psr = tstate_to_psr(regs->tstate);
 	if (current_thread_info()->fpsaved[0] & FPRS_FEF)
 		psr |= PSR_EF;
 	err |= __put_user(psr, &sf->regs.psr);
@@ -1133,7 +1097,8 @@
 	err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size);
 	err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]);
 	for (i = 1; i < 16; i++)
-		err |= __put_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]);
+		err |= __put_user(((u32 *)regs->u_regs)[2*i],
+				  &sf->v8plus.g_upper[i]);
 
 	if (psr & PSR_EF) {
 		err |= save_fpu_state32(regs, &sf->fpu_state);
@@ -1162,8 +1127,8 @@
 	}
 	err |= __copy_to_user(&sf->mask, &seta, sizeof(compat_sigset_t));
 
-	err |= copy_in_user((u32 *)sf,
-			    (u32 *)(regs->u_regs[UREG_FP]),
+	err |= copy_in_user((u32 __user *)sf,
+			    (u32 __user *)(regs->u_regs[UREG_FP]),
 			    sizeof(struct reg_window32));
 	if (err)
 		goto sigsegv;
@@ -1204,7 +1169,8 @@
 		preempt_disable();
 		ptep = pte_offset_map(pmdp, address);
 		if (pte_present(*ptep)) {
-			unsigned long page = (unsigned long) page_address(pte_page(*ptep));
+			unsigned long page = (unsigned long)
+				page_address(pte_page(*ptep));
 
 			__asm__ __volatile__(
 			"	membar	#StoreStore\n"
@@ -1229,7 +1195,8 @@
 				   int svr4_signal)
 {
 	if (svr4_signal)
-		setup_svr4_frame32(&ka->sa, regs->tpc, regs->tnpc, regs, signr, oldset);
+		setup_svr4_frame32(&ka->sa, regs->tpc, regs->tnpc,
+				   regs, signr, oldset);
 	else {
 		if (ka->sa.sa_flags & SA_SIGINFO)
 			setup_rt_frame32(ka, regs, signr, oldset, info);
@@ -1322,13 +1289,16 @@
 
 asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)
 {
-	struct sigstack32 *ssptr = (struct sigstack32 *)((unsigned long)(u_ssptr));
-	struct sigstack32 *ossptr = (struct sigstack32 *)((unsigned long)(u_ossptr));
+	struct sigstack32 __user *ssptr =
+		(struct sigstack32 __user *)((unsigned long)(u_ssptr));
+	struct sigstack32 __user *ossptr =
+		(struct sigstack32 __user *)((unsigned long)(u_ossptr));
 	int ret = -EFAULT;
 
 	/* First see if old state is wanted. */
 	if (ossptr) {
-		if (put_user(current->sas_ss_sp + current->sas_ss_size, &ossptr->the_stack) ||
+		if (put_user(current->sas_ss_sp + current->sas_ss_size,
+			     &ossptr->the_stack) ||
 		    __put_user(on_sig_stack(sp), &ossptr->cur_status))
 			goto out;
 	}
@@ -1339,15 +1309,18 @@
 
 		if (get_user((long)ss_sp, &ssptr->the_stack))
 			goto out;
+
 		/* If the current stack was set with sigaltstack, don't
-		   swap stacks while we are on it.  */
+		 * swap stacks while we are on it.
+		 */
 		ret = -EPERM;
 		if (current->sas_ss_sp && on_sig_stack(sp))
 			goto out;
 			
 		/* Since we don't know the extent of the stack, and we don't
-		   track onstack-ness, but rather calculate it, we must
-		   presume a size.  Ho hum this interface is lossy.  */
+		 * track onstack-ness, but rather calculate it, we must
+		 * presume a size.  Ho hum this interface is lossy.
+		 */
 		current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
 		current->sas_ss_size = SIGSTKSZ;
 	}
@@ -1363,17 +1336,17 @@
 	int ret;
 	mm_segment_t old_fs;
 	
-	if (ussa && (get_user((long)uss.ss_sp, &((stack_t32 *)(long)ussa)->ss_sp) ||
-		    __get_user(uss.ss_flags, &((stack_t32 *)(long)ussa)->ss_flags) ||
-		    __get_user(uss.ss_size, &((stack_t32 *)(long)ussa)->ss_size)))
+	if (ussa && (get_user((long)uss.ss_sp, &((stack_t32 __user *)(long)ussa)->ss_sp) ||
+		    __get_user(uss.ss_flags, &((stack_t32 __user *)(long)ussa)->ss_flags) ||
+		    __get_user(uss.ss_size, &((stack_t32 __user *)(long)ussa)->ss_size)))
 		return -EFAULT;
 	old_fs = get_fs();
 	set_fs(KERNEL_DS);
 	ret = do_sigaltstack(ussa ? &uss : NULL, uossa ? &uoss : NULL, sp);
 	set_fs(old_fs);
-	if (!ret && uossa && (put_user((long)uoss.ss_sp, &((stack_t32 *)(long)uossa)->ss_sp) ||
-		    __put_user(uoss.ss_flags, &((stack_t32 *)(long)uossa)->ss_flags) ||
-		    __put_user(uoss.ss_size, &((stack_t32 *)(long)uossa)->ss_size)))
+	if (!ret && uossa && (put_user((long)uoss.ss_sp, &((stack_t32 __user *)(long)uossa)->ss_sp) ||
+		    __put_user(uoss.ss_flags, &((stack_t32 __user *)(long)uossa)->ss_flags) ||
+		    __put_user(uoss.ss_size, &((stack_t32 __user *)(long)uossa)->ss_size)))
 		return -EFAULT;
 	return ret;
 }
diff -Nru a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c
--- a/arch/sparc64/kernel/sys_sparc.c	Sat Apr 19 19:51:48 2003
+++ b/arch/sparc64/kernel/sys_sparc.c	Sat Apr 19 19:51:48 2003
@@ -199,7 +199,7 @@
 			goto out;
 			}
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 	if (call <= MSGCTL) 
@@ -218,7 +218,7 @@
 			err = sys_msgctl (first, second | IPC_64, (struct msqid_ds *) ptr);
 			goto out;
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 	if (call <= SHMCTL) 
@@ -236,18 +236,18 @@
 			err = sys_shmctl (first, second | IPC_64, (struct shmid_ds *) ptr);
 			goto out;
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 	else
-		err = -EINVAL;
+		err = -ENOSYS;
 out:
 	return err;
 }
 
-extern asmlinkage int sys_newuname(struct new_utsname * name);
+extern asmlinkage int sys_newuname(struct new_utsname __user *name);
 
-asmlinkage int sparc64_newuname(struct new_utsname * name)
+asmlinkage int sparc64_newuname(struct new_utsname __user *name)
 {
 	int ret = sys_newuname(name);
 	
@@ -421,7 +421,7 @@
 
 extern void check_pending(int signum);
 
-asmlinkage int sys_getdomainname(char *name, int len)
+asmlinkage int sys_getdomainname(char __user *name, int len)
 {
         int nlen;
 	int err = -EFAULT;
@@ -432,9 +432,9 @@
 
         if (nlen < len)
                 len = nlen;
-	if(len > __NEW_UTS_LEN)
+	if (len > __NEW_UTS_LEN)
 		goto done;
-	if(copy_to_user(name, system_utsname.domainname, len))
+	if (copy_to_user(name, system_utsname.domainname, len))
 		goto done;
 	err = 0;
 done:
@@ -458,7 +458,7 @@
 		regs->tpc &= 0xffffffff;
 		regs->tnpc &= 0xffffffff;
 	}
-	if(++count <= 5) {
+	if (++count <= 5) {
 		printk ("For Solaris binary emulation you need solaris module loaded\n");
 		show_regs (regs);
 	}
@@ -478,7 +478,7 @@
 		regs->tpc &= 0xffffffff;
 		regs->tnpc &= 0xffffffff;
 	}
-	if(++count <= 20)
+	if (++count <= 20)
 		printk ("SunOS binary emulation not compiled in\n");
 	force_sig(SIGSEGV, current);
 
@@ -486,9 +486,11 @@
 }
 #endif
 
-asmlinkage int sys_utrap_install(utrap_entry_t type, utrap_handler_t new_p,
+asmlinkage int sys_utrap_install(utrap_entry_t type,
+				 utrap_handler_t new_p,
 				 utrap_handler_t new_d,
-				 utrap_handler_t *old_p, utrap_handler_t *old_d)
+				 utrap_handler_t __user *old_p,
+				 utrap_handler_t __user *old_d)
 {
 	if (type < UT_INSTRUCTION_EXCEPTION || type > UT_TRAP_INSTRUCTION_31)
 		return -EINVAL;
@@ -511,9 +513,11 @@
 	if (!current_thread_info()->utraps) {
 		current_thread_info()->utraps =
 			kmalloc((UT_TRAP_INSTRUCTION_31+1)*sizeof(long), GFP_KERNEL);
-		if (!current_thread_info()->utraps) return -ENOMEM;
+		if (!current_thread_info()->utraps)
+			return -ENOMEM;
 		current_thread_info()->utraps[0] = 1;
-		memset(current_thread_info()->utraps+1, 0, UT_TRAP_INSTRUCTION_31*sizeof(long));
+		memset(current_thread_info()->utraps+1, 0,
+		       UT_TRAP_INSTRUCTION_31*sizeof(long));
 	} else {
 		if ((utrap_handler_t)current_thread_info()->utraps[type] != new_p &&
 		    current_thread_info()->utraps[0] > 1) {
diff -Nru a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c
--- a/arch/sparc64/kernel/sys_sparc32.c	Sat Apr 19 19:51:49 2003
+++ b/arch/sparc64/kernel/sys_sparc32.c	Sat Apr 19 19:51:49 2003
@@ -756,7 +756,7 @@
 			err = do_sys32_semctl (first, second, third, (void *)AA(ptr));
 			goto out;
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		};
 	if (call <= MSGCTL) 
@@ -775,7 +775,7 @@
 			err = do_sys32_msgctl (first, second, (void *)AA(ptr));
 			goto out;
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 	if (call <= SHMCTL) 
@@ -794,11 +794,11 @@
 			err = do_sys32_shmctl (first, second, (void *)AA(ptr));
 			goto out;
 		default:
-			err = -EINVAL;
+			err = -ENOSYS;
 			goto out;
 		}
 
-	err = -EINVAL;
+	err = -ENOSYS;
 
 out:
 	return err;
@@ -1521,70 +1521,6 @@
 	return err;
 }
 
-struct rusage32 {
-        struct compat_timeval ru_utime;
-        struct compat_timeval ru_stime;
-        s32    ru_maxrss;
-        s32    ru_ixrss;
-        s32    ru_idrss;
-        s32    ru_isrss;
-        s32    ru_minflt;
-        s32    ru_majflt;
-        s32    ru_nswap;
-        s32    ru_inblock;
-        s32    ru_oublock;
-        s32    ru_msgsnd; 
-        s32    ru_msgrcv; 
-        s32    ru_nsignals;
-        s32    ru_nvcsw;
-        s32    ru_nivcsw;
-};
-
-static int put_rusage (struct rusage32 *ru, struct rusage *r)
-{
-	int err;
-	
-	err = put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec);
-	err |= __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec);
-	err |= __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec);
-	err |= __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec);
-	err |= __put_user (r->ru_maxrss, &ru->ru_maxrss);
-	err |= __put_user (r->ru_ixrss, &ru->ru_ixrss);
-	err |= __put_user (r->ru_idrss, &ru->ru_idrss);
-	err |= __put_user (r->ru_isrss, &ru->ru_isrss);
-	err |= __put_user (r->ru_minflt, &ru->ru_minflt);
-	err |= __put_user (r->ru_majflt, &ru->ru_majflt);
-	err |= __put_user (r->ru_nswap, &ru->ru_nswap);
-	err |= __put_user (r->ru_inblock, &ru->ru_inblock);
-	err |= __put_user (r->ru_oublock, &ru->ru_oublock);
-	err |= __put_user (r->ru_msgsnd, &ru->ru_msgsnd);
-	err |= __put_user (r->ru_msgrcv, &ru->ru_msgrcv);
-	err |= __put_user (r->ru_nsignals, &ru->ru_nsignals);
-	err |= __put_user (r->ru_nvcsw, &ru->ru_nvcsw);
-	err |= __put_user (r->ru_nivcsw, &ru->ru_nivcsw);
-	return err;
-}
-
-asmlinkage int sys32_wait4(compat_pid_t pid, unsigned int *stat_addr, int options, struct rusage32 *ru)
-{
-	if (!ru)
-		return sys_wait4(pid, stat_addr, options, NULL);
-	else {
-		struct rusage r;
-		int ret;
-		unsigned int status;
-		mm_segment_t old_fs = get_fs();
-		
-		set_fs (KERNEL_DS);
-		ret = sys_wait4(pid, stat_addr ? &status : NULL, options, &r);
-		set_fs (old_fs);
-		if (put_rusage (ru, &r)) return -EFAULT;
-		if (stat_addr && put_user (status, stat_addr))
-			return -EFAULT;
-		return ret;
-	}
-}
-
 struct sysinfo32 {
         s32 uptime;
         u32 loads[3];
@@ -1805,69 +1741,6 @@
 	return ret;
 }
 
-#define RLIM_INFINITY32	0x7fffffff
-#define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)
-
-struct rlimit32 {
-	u32	rlim_cur;
-	u32	rlim_max;
-};
-
-extern asmlinkage int sys_getrlimit(unsigned int resource, struct rlimit *rlim);
-
-asmlinkage int sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-	
-	set_fs (KERNEL_DS);
-	ret = sys_getrlimit(resource, &r);
-	set_fs (old_fs);
-	if (!ret) {
-		ret = put_user (RESOURCE32(r.rlim_cur), &rlim->rlim_cur);
-		ret |= __put_user (RESOURCE32(r.rlim_max), &rlim->rlim_max);
-	}
-	return ret;
-}
-
-extern asmlinkage int sys_setrlimit(unsigned int resource, struct rlimit *rlim);
-
-asmlinkage int sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-
-	if (resource >= RLIM_NLIMITS) return -EINVAL;	
-	if (get_user (r.rlim_cur, &rlim->rlim_cur) ||
-	    __get_user (r.rlim_max, &rlim->rlim_max))
-		return -EFAULT;
-	if (r.rlim_cur == RLIM_INFINITY32)
-		r.rlim_cur = RLIM_INFINITY;
-	if (r.rlim_max == RLIM_INFINITY32)
-		r.rlim_max = RLIM_INFINITY;
-	set_fs (KERNEL_DS);
-	ret = sys_setrlimit(resource, &r);
-	set_fs (old_fs);
-	return ret;
-}
-
-extern asmlinkage int sys_getrusage(int who, struct rusage *ru);
-
-asmlinkage int sys32_getrusage(int who, struct rusage32 *ru)
-{
-	struct rusage r;
-	int ret;
-	mm_segment_t old_fs = get_fs();
-		
-	set_fs (KERNEL_DS);
-	ret = sys_getrusage(who, &r);
-	set_fs (old_fs);
-	if (put_rusage (ru, &r)) return -EFAULT;
-	return ret;
-}
-
 extern void check_pending(int signum);
 
 asmlinkage int sys32_sigaction (int sig, struct old_sigaction32 *act, struct old_sigaction32 *oact)
@@ -2831,59 +2704,9 @@
 	return error;
 }
 
-extern asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len,
-					    unsigned long *user_mask_ptr);
-
-asmlinkage int sys32_sched_setaffinity(compat_pid_t pid, unsigned int len,
-				       u32 *user_mask_ptr)
-{
-	unsigned long kernel_mask;
-	mm_segment_t old_fs;
-	int ret;
-
-	if (get_user(kernel_mask, user_mask_ptr))
-		return -EFAULT;
-
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_sched_setaffinity(pid,
-				    /* XXX Nice api... */
-				    sizeof(kernel_mask),
-				    &kernel_mask);
-	set_fs(old_fs);
-
-	return ret;
-}
-
-extern asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len,
-					    unsigned long *user_mask_ptr);
-
-asmlinkage int sys32_sched_getaffinity(compat_pid_t pid, unsigned int len,
-				       u32 *user_mask_ptr)
-{
-	unsigned long kernel_mask;
-	mm_segment_t old_fs;
-	int ret;
-
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_sched_getaffinity(pid,
-				    /* XXX Nice api... */
-				    sizeof(kernel_mask),
-				    &kernel_mask);
-	set_fs(old_fs);
-
-	if (ret > 0) {
-		if (put_user(kernel_mask, user_mask_ptr))
-			ret = -EFAULT;
-	}
-
-	return ret;
-}
-
-extern int sys_lookup_dcookie(u64 cookie64, char *buf, size_t len);
+extern long sys_lookup_dcookie(u64 cookie64, char *buf, size_t len);
 
-int sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char *buf, size_t len)
+long sys32_lookup_dcookie(u32 cookie_high, u32 cookie_low, char *buf, size_t len)
 {
 	return sys_lookup_dcookie((u64)cookie_high << 32 | cookie_low,
 				  buf, len);
diff -Nru a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c
--- a/arch/sparc64/kernel/sys_sunos32.c	Sat Apr 19 19:51:49 2003
+++ b/arch/sparc64/kernel/sys_sunos32.c	Sat Apr 19 19:51:49 2003
@@ -800,15 +800,16 @@
 }
 
 /* So stupid... */
-extern asmlinkage int sys32_wait4(compat_pid_t pid,
-				  u32 stat_addr, int options, u32 ru);
+extern long compat_sys_wait4(compat_pid_t, compat_uint_t *, int,
+			     struct compat_rusage *);
 
 asmlinkage int sunos_wait4(compat_pid_t pid, u32 stat_addr, int options, u32 ru)
 {
 	int ret;
 
-	ret = sys32_wait4((pid ? pid : ((compat_pid_t)-1)),
-			  stat_addr, options, ru);
+	ret = compat_sys_wait4((pid ? pid : ((compat_pid_t)-1)),
+			       (compat_uint_t *)A(stat_addr), options,
+			       (struct compat_rusage *)A(ru));
 	return ret;
 }
 
diff -Nru a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S
--- a/arch/sparc64/kernel/systbls.S	Sat Apr 19 19:51:47 2003
+++ b/arch/sparc64/kernel/systbls.S	Sat Apr 19 19:51:47 2003
@@ -20,7 +20,7 @@
 	.globl sys_call_table32
 sys_call_table32:
 /*0*/	.word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write
-/*5*/	.word sparc32_open, sys_close, sys32_wait4, sys_creat, sys_link
+/*5*/	.word sparc32_open, sys_close, compat_sys_wait4, sys_creat, sys_link
 /*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys32_chown16, sys32_mknod
 /*15*/	.word sys32_chmod, sys32_lchown16, sparc_brk, sys_perfctr, sys32_lseek
 /*20*/	.word sys_getpid, sys_capget, sys_capset, sys32_setuid16, sys32_getuid16
@@ -42,16 +42,16 @@
 /*100*/ .word sys_getpriority, sys32_rt_sigreturn, sys32_rt_sigaction, sys32_rt_sigprocmask, sys32_rt_sigpending
 	.word sys32_rt_sigtimedwait, sys32_rt_sigqueueinfo, sys32_rt_sigsuspend, sys_setresuid, sys_getresuid
 /*110*/	.word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
-	.word sys_getgroups, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
+	.word sys_getgroups, sys32_gettimeofday, compat_sys_getrusage, sys_nis_syscall, sys_getcwd
 /*120*/	.word sys32_readv, sys32_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod
 	.word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate
 /*130*/	.word sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall
 	.word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_stat64
-/*140*/	.word sys32_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, sys32_getrlimit
-	.word sys32_setrlimit, sys_pivot_root, sys32_prctl, sys32_pciconfig_read, sys32_pciconfig_write
+/*140*/	.word sys32_sendfile64, sys_nis_syscall, compat_sys_futex, sys_gettid, compat_sys_getrlimit
+	.word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys32_pciconfig_read, sys32_pciconfig_write
 /*150*/	.word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64
 	.word compat_sys_fcntl64, sys_ni_syscall, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount
-/*160*/	.word sys32_sched_setaffinity, sys32_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall
+/*160*/	.word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall
 	.word sys_quotactl, sys_set_tid_address, sys32_mount, sys_ustat, sys_setxattr
 /*170*/	.word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys32_getdents
 	.word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
@@ -180,7 +180,7 @@
 	.word sys_listen, sunos_nosys, sunos_sigaction
 	.word sunos_sigblock, sunos_sigsetmask, sys_sigpause
 	.word sys32_sigstack, compat_sys_recvmsg, compat_sys_sendmsg
-	.word sunos_nosys, sys32_gettimeofday, sys32_getrusage
+	.word sunos_nosys, sys32_gettimeofday, compat_sys_getrusage
 	.word sunos_getsockopt, sunos_nosys, sunos_readv
 	.word sunos_writev, sys32_settimeofday, sys32_fchown16
 	.word sys_fchmod, sys32_recvfrom, sys32_setreuid16
@@ -189,8 +189,8 @@
 	.word sys32_sendto, sys_shutdown, sys_socketpair
 	.word sys_mkdir, sys_rmdir, sys32_utimes
 	.word sys32_sigreturn, sunos_nosys, sys_getpeername
-	.word sunos_gethostid, sunos_nosys, sys32_getrlimit
-	.word sys32_setrlimit, sunos_killpg, sunos_nosys
+	.word sunos_gethostid, sunos_nosys, compat_sys_getrlimit
+	.word compat_sys_setrlimit, sunos_killpg, sunos_nosys
 	.word sunos_nosys, sunos_nosys
 /*150*/	.word sys_getsockname, sunos_nosys, sunos_nosys
 	.word sys_poll, sunos_nosys, sunos_nosys
diff -Nru a/arch/sparc64/solaris/ioctl.c b/arch/sparc64/solaris/ioctl.c
--- a/arch/sparc64/solaris/ioctl.c	Sat Apr 19 19:51:48 2003
+++ b/arch/sparc64/solaris/ioctl.c	Sat Apr 19 19:51:48 2003
@@ -291,15 +291,15 @@
 {
 	struct inode *ino;
 	/* I wonder which of these tests are superfluous... --patrik */
-	read_lock(&current->files->file_lock);
+	spin_lock(&current->files->file_lock);
 	if (! current->files->fd[fd] ||
 	    ! current->files->fd[fd]->f_dentry ||
 	    ! (ino = current->files->fd[fd]->f_dentry->d_inode) ||
 	    ! ino->i_sock) {
-		read_unlock(&current->files->file_lock);
+		spin_unlock(&current->files->file_lock);
 		return TBADF;
 	}
-	read_unlock(&current->files->file_lock);
+	spin_unlock(&current->files->file_lock);
 	
 	switch (cmd & 0xff) {
 	case 109: /* SI_SOCKPARAMS */
diff -Nru a/arch/sparc64/vmlinux.lds.S b/arch/sparc64/vmlinux.lds.S
--- a/arch/sparc64/vmlinux.lds.S	Sat Apr 19 19:51:50 2003
+++ b/arch/sparc64/vmlinux.lds.S	Sat Apr 19 19:51:50 2003
@@ -41,7 +41,11 @@
 
   . = ALIGN(8192);
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
   . = ALIGN(16);
   __setup_start = .;
diff -Nru a/arch/v850/Kconfig b/arch/v850/Kconfig
--- a/arch/v850/Kconfig	Sat Apr 19 19:51:47 2003
+++ b/arch/v850/Kconfig	Sat Apr 19 19:51:47 2003
@@ -124,9 +124,11 @@
 	  depends RTE_CB_MA1 || RTE_CB_NB85E
 	  default y
 
-   # Currently, we only support RTE-CB boards using the Multi debugger
    config RTE_CB_MULTI
    	  bool
+	  # RTE_CB_NB85E can either have multi ROM support or not, but
+	  # other platforms (currently only RTE_CB_MA1) require it.
+	  prompt "Multi monitor ROM support" if RTE_CB_NB85E
 	  depends RTE_CB
 	  default y
 
diff -Nru a/arch/v850/kernel/Makefile b/arch/v850/kernel/Makefile
--- a/arch/v850/kernel/Makefile	Sat Apr 19 19:51:51 2003
+++ b/arch/v850/kernel/Makefile	Sat Apr 19 19:51:51 2003
@@ -1,8 +1,8 @@
 #
 # arch/v850/kernel/Makefile
 #
-#  Copyright (C) 2001,02  NEC Corporation
-#  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+#  Copyright (C) 2001,02,03  NEC Electronics Corporation
+#  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
 #
 # 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
@@ -15,10 +15,14 @@
 	 signal.o irq.o mach.o ptrace.o bug.o
 obj-$(CONFIG_MODULES)		+= module.o v850_ksyms.o
 # chip-specific code
-obj-$(CONFIG_V850E_MA1)		+= ma.o	nb85e_utils.o nb85e_timer_d.o
 obj-$(CONFIG_V850E_NB85E)	+= nb85e_intc.o
-obj-$(CONFIG_V850E2_ANNA)	+= anna.o nb85e_intc.o nb85e_utils.o nb85e_timer_d.o
-obj-$(CONFIG_V850E_AS85EP1)	+= as85ep1.o nb85e_intc.o nb85e_utils.o nb85e_timer_d.o
+obj-$(CONFIG_V850E_MA1)		+= ma.o nb85e_utils.o nb85e_timer_d.o
+obj-$(CONFIG_V850E_TEG)		+= teg.o nb85e_utils.o nb85e_cache.o \
+				   nb85e_timer_d.o
+obj-$(CONFIG_V850E2_ANNA)	+= anna.o nb85e_intc.o nb85e_utils.o \
+				   nb85e_timer_d.o
+obj-$(CONFIG_V850E_AS85EP1)	+= as85ep1.o nb85e_intc.o nb85e_utils.o \
+				   nb85e_timer_d.o
 # platform-specific code
 obj-$(CONFIG_V850E_SIM)		+= sim.o simcons.o
 obj-$(CONFIG_V850E2_SIM85E2C)	+= sim85e2c.o nb85e_intc.o memcons.o
diff -Nru a/arch/v850/kernel/entry.S b/arch/v850/kernel/entry.S
--- a/arch/v850/kernel/entry.S	Sat Apr 19 19:51:50 2003
+++ b/arch/v850/kernel/entry.S	Sat Apr 19 19:51:50 2003
@@ -231,7 +231,7 @@
 	st.b	r19, KM;						      \
 	GET_CURRENT_TASK(CURRENT_TASK);	/* Fetch the current task pointer. */ \
 	/* Save away the syscall number.  */				      \
-	sst.w	syscall_num, PTO+PT_SYSCALL[ep]
+	sst.w	syscall_num, PTO+PT_CUR_SYSCALL[ep]
 
 
 /* Save register state not normally saved by PUSH_STATE for TYPE.  */
@@ -438,11 +438,11 @@
    LP register should point to the location where the called function
    should return.  [note that MAKE_SYS_CALL uses label 1]  */
 #define MAKE_SYS_CALL							      \
-	/* See if the system call number is valid.  */			      \
-	addi	-NR_syscalls, r12, r0;					      \
-	bnh	1f;							      \
 	/* Figure out which function to use for this system call.  */	      \
 	shl	2, r12;							      \
+	/* See if the system call number is valid.  */			      \
+	addi	lo(CSYM(sys_call_table) - sys_call_table_end), r12, r0;	      \
+	bnh	1f;							      \
 	mov	hilo(CSYM(sys_call_table)), r19;			      \
 	add	r19, r12;						      \
 	ld.w	0[r12], r12;						      \
@@ -511,10 +511,8 @@
    (copy_thread makes ret_from_fork the return address in each new thread's
    saved context).  */
 C_ENTRY(ret_from_fork):
-#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT)
 	mov	r10, r6			// switch_thread returns the prev task.
 	jarl	CSYM(schedule_tail), lp	// ...which is schedule_tail's arg
-#endif
 	mov	r0, r10			// Child's fork call should return 0.
 	br	ret_from_trap		// Do normal trap return.
 C_END(ret_from_fork)
@@ -982,8 +980,5 @@
 	.long CSYM(sys_pivot_root)	// 200
 	.long CSYM(sys_gettid)
 	.long CSYM(sys_tkill)
-	.long CSYM(sys_ni_syscall)	// sys_mincore
-	.long CSYM(sys_ni_syscall)	// sys_madvise
-
-	.space (NR_syscalls-205)*4
+sys_call_table_end:
 C_END(sys_call_table)
diff -Nru a/arch/v850/kernel/gbus_int.c b/arch/v850/kernel/gbus_int.c
--- a/arch/v850/kernel/gbus_int.c	Sat Apr 19 19:51:51 2003
+++ b/arch/v850/kernel/gbus_int.c	Sat Apr 19 19:51:51 2003
@@ -26,7 +26,9 @@
 /* For each GINT interrupt, how many GBUS interrupts are using it.  */
 static unsigned gint_num_active_irqs[NUM_GINTS] = { 0 };
 
-/* A table of GINTn interrupts we actually use.  */
+/* A table of GINTn interrupts we actually use.
+   Note that we don't use GINT0 because all the boards we support treat it
+   specially.  */
 struct used_gint {
 	unsigned gint;
 	unsigned priority;
diff -Nru a/arch/v850/kernel/nb85e_cache.c b/arch/v850/kernel/nb85e_cache.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/v850/kernel/nb85e_cache.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,178 @@
+/*
+ * arch/v850/kernel/nb85e_cache.c -- Cache control for NB85E_CACHE212 and
+ * 	NB85E_CACHE213 cache memories
+ *
+ *  Copyright (C) 2003  NEC Electronics Corporation
+ *  Copyright (C) 2003  Miles Bader <miles@gnu.org>
+ *
+ * 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.
+ *
+ * Written by Miles Bader <miles@gnu.org>
+ */
+
+#include <asm/entry.h>
+#include <asm/nb85e_cache.h>
+
+#define WAIT_UNTIL_CLEAR(value) while (value) {}
+
+/* Set caching params via the BHC and DCC registers.  */
+void nb85e_cache_enable (u16 bhc, u16 dcc)
+{
+	unsigned long *r0_ram = (unsigned long *)R0_RAM_ADDR;
+	register u16 bhc_val asm ("r6") = bhc;
+
+	/* Configure data-cache.  */
+	NB85E_CACHE_DCC = dcc;
+
+	/* Configure caching for various memory regions by writing the BHC
+	   register.  The documentation says that an instruction _cannot_
+	   enable/disable caching for the memory region in which the
+	   instruction itself exists; to work around this, we store
+	   appropriate instructions into the on-chip RAM area (which is never
+	   cached), and briefly jump there to do the work.  */
+	r0_ram[0] = 0xf0720760;	/* st.h r0, 0xfffff072[r0] */
+	r0_ram[1] = 0xf06a3760;	/* st.h r6, 0xfffff06a[r0] */
+	r0_ram[2] = 0x5640006b;	/* jmp [r11] */
+	asm ("mov hilo(1f), r11; jmp [%1]; 1:;"
+	     :: "r" (bhc_val), "r" (R0_RAM_ADDR) : "r11");
+}
+
+static void clear_icache (void)
+{
+	/* 1. Read the instruction cache control register (ICC) and confirm
+	      that bits 0 and 1 (TCLR0, TCLR1) are all cleared.  */
+	WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x3);
+
+	/* 2. Read the ICC register and confirm that bit 12 (LOCK0) is
+  	      cleared.  Bit 13 of the ICC register is always cleared.  */
+	WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x1000);
+
+	/* 3. Set the TCLR0 and TCLR1 bits of the ICC register as follows,
+	      when clearing way 0 and way 1 at the same time:
+	        (a) Set the TCLR0 and TCLR1 bits.
+		(b) Read the TCLR0 and TCLR1 bits to confirm that these bits
+		    are cleared.
+		(c) Perform (a) and (b) above again.  */
+	NB85E_CACHE_ICC |= 0x3;
+	WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x3);
+	/* Do it again.  */
+	NB85E_CACHE_ICC |= 0x3;
+	WAIT_UNTIL_CLEAR (NB85E_CACHE_ICC & 0x3);
+}
+
+/* Flush or clear (or both) the data cache, depending on the value of FLAGS;
+   the procedure is the same for both, just the control bits used differ (and
+   both may be performed simultaneously).  */
+static void dcache_op (unsigned short flags)
+{
+	/* 1. Read the data cache control register (DCC) and confirm that bits
+	      0, 1, 4, and 5 (DC00, DC01, DC04, DC05) are all cleared.  */
+	WAIT_UNTIL_CLEAR (NB85E_CACHE_DCC & 0x33);
+
+	/* 2. Clear DCC register bit 12 (DC12), bit 13 (DC13), or both
+	      depending on the way for which tags are to be cleared.  */
+	NB85E_CACHE_DCC &= ~0xC000;
+
+	/* 3. Set DCC register bit 0 (DC00), bit 1 (DC01) or both depending on
+	      the way for which tags are to be cleared.
+	      ...
+	      Set DCC register bit 4 (DC04), bit 5 (DC05), or both depending
+	      on the way to be data flushed.  */
+	NB85E_CACHE_DCC |= flags;
+
+	/* 4. Read DCC register bit DC00, DC01 [DC04, DC05], or both depending
+	      on the way for which tags were cleared [flushed] and confirm
+	      that that bit is cleared.  */
+	WAIT_UNTIL_CLEAR (NB85E_CACHE_DCC & flags);
+}
+
+/* Flushes the contents of the dcache to memory.  */
+static inline void flush_dcache (void)
+{
+	/* We only need to do something if in write-back mode.  */
+	if (NB85E_CACHE_DCC & 0x0400)
+		dcache_op (0x30);
+}
+
+/* Flushes the contents of the dcache to memory, and then clears it.  */
+static inline void clear_dcache (void)
+{
+	/* We only need to do something if the dcache is enabled.  */
+	if (NB85E_CACHE_DCC & 0x0C00)
+		dcache_op (0x33);
+}
+
+/* Clears the dcache without flushing to memory first.  */
+static inline void clear_dcache_no_flush (void)
+{
+	/* We only need to do something if the dcache is enabled.  */
+	if (NB85E_CACHE_DCC & 0x0C00)
+		dcache_op (0x3);
+}
+
+static inline void cache_exec_after_store (void)
+{
+	flush_dcache ();
+	clear_icache ();
+}
+
+
+/* Exported functions.  */
+
+void inline nb85e_cache_flush_all (void)
+{
+	clear_icache ();
+	clear_dcache ();
+}
+
+void nb85e_cache_flush_mm (struct mm_struct *mm)
+{
+	/* nothing */
+}
+
+void nb85e_cache_flush_range (struct mm_struct *mm,
+			      unsigned long start, unsigned long end)
+{
+	/* nothing */
+}
+
+void nb85e_cache_flush_page (struct vm_area_struct *vma,
+			     unsigned long page_addr)
+{
+	/* nothing */
+}
+
+void nb85e_cache_flush_dcache_page (struct page *page)
+{
+	/* nothing */
+}
+
+void nb85e_cache_flush_icache (void)
+{
+	cache_exec_after_store ();
+}
+
+void nb85e_cache_flush_icache_range (unsigned long start, unsigned long end)
+{
+	cache_exec_after_store ();
+}
+
+void nb85e_cache_flush_icache_page (struct vm_area_struct *vma,
+				    struct page *page)
+{
+	cache_exec_after_store ();
+}
+
+void nb85e_cache_flush_icache_user_range (struct vm_area_struct *vma,
+					  struct page *page,
+					  unsigned long adr, int len)
+{
+	cache_exec_after_store ();
+}
+
+void nb85e_cache_flush_sigtramp (unsigned long addr)
+{
+	cache_exec_after_store ();
+}
diff -Nru a/arch/v850/kernel/nb85e_intc.c b/arch/v850/kernel/nb85e_intc.c
--- a/arch/v850/kernel/nb85e_intc.c	Sat Apr 19 19:51:30 2003
+++ b/arch/v850/kernel/nb85e_intc.c	Sat Apr 19 19:51:30 2003
@@ -1,8 +1,8 @@
 /*
  * arch/v850/kernel/nb85e_intc.c -- NB85E cpu core interrupt controller (INTC)
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -26,6 +26,42 @@
 	return 0;
 }
 
+static void nb85e_intc_end_irq (unsigned irq)
+{
+	unsigned long psw, temp;
+
+	/* Clear the highest-level bit in the In-service priority register
+	   (ISPR), to allow this interrupt (or another of the same or
+	   lesser priority) to happen again.
+
+	   The `reti' instruction normally does this automatically when the
+	   PSW bits EP and NP are zero, but we can't always rely on reti
+	   being used consistently to return after an interrupt (another
+	   process can be scheduled, for instance, which can delay the
+	   associated reti for a long time, or this process may be being
+	   single-stepped, which uses the `dbret' instruction to return
+	   from the kernel).
+
+	   We also set the PSW EP bit, which prevents reti from also
+	   trying to modify the ISPR itself.  */
+
+	/* Get PSW and disable interrupts.  */
+	asm volatile ("stsr psw, %0; di" : "=r" (psw));
+	/* We don't want to do anything for NMIs (they don't use the ISPR).  */
+	if (! (psw & 0xC0)) {
+		/* Transition to `trap' state, so that an eventual real
+		   reti instruction won't modify the ISPR.  */
+		psw |= 0x40;
+		/* Fake an interrupt return, which automatically clears the
+		   appropriate bit in the ISPR.  */
+		asm volatile ("mov hilo(1f), %0;"
+			      "ldsr %0, eipc; ldsr %1, eipsw;"
+			      "reti;"
+			      "1:"
+			      : "=&r" (temp) : "r" (psw));
+	}
+}
+
 /* Initialize HW_IRQ_TYPES for INTC-controlled irqs described in array
    INITS (which is terminated by an entry with the name field == 0).  */
 void __init nb85e_intc_init_irq_types (struct nb85e_intc_irq_init *inits,
@@ -43,7 +79,7 @@
 		hwit->enable   = nb85e_intc_enable_irq;
 		hwit->disable  = nb85e_intc_disable_irq;
 		hwit->ack      = irq_nop;
-		hwit->end      = irq_nop;
+		hwit->end      = nb85e_intc_end_irq;
 		
 		/* Initialize kernel IRQ infrastructure for this interrupt.  */
 		init_irq_handlers(init->base, init->num, init->interval, hwit);
diff -Nru a/arch/v850/kernel/process.c b/arch/v850/kernel/process.c
--- a/arch/v850/kernel/process.c	Sat Apr 19 19:51:28 2003
+++ b/arch/v850/kernel/process.c	Sat Apr 19 19:51:28 2003
@@ -226,7 +226,7 @@
 	if (!p || p == current || p->state == TASK_RUNNING)
 		return 0;
 
-	pc = thread_saved_pc (&p->thread);
+	pc = thread_saved_pc (p);
 
 	/* This quite disgusting function walks up the stack, following
 	   saved return address, until it something that's out of bounds
diff -Nru a/arch/v850/kernel/rte_cb.c b/arch/v850/kernel/rte_cb.c
--- a/arch/v850/kernel/rte_cb.c	Sat Apr 19 19:51:28 2003
+++ b/arch/v850/kernel/rte_cb.c	Sat Apr 19 19:51:28 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/rte_cb.c -- Midas lab RTE-CB series of evaluation boards
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -32,28 +32,11 @@
 #endif
 
 
-#ifdef CONFIG_ROM_KERNEL
-/* Initialization for kernel in ROM.  */
-static inline rom_kernel_init (void)
-{
-	/* If the kernel is in ROM, we have to copy any initialized data
-	   from ROM into RAM.  */
-	extern unsigned long _data_load_start, _sdata, _edata;
-	register unsigned long *src = &_data_load_start;
-	register unsigned long *dst = &_sdata, *end = &_edata;
-
-	while (dst != end)
-		*dst++ = *src++;
-}
-#endif /* CONFIG_ROM_KERNEL */
-
-void __init mach_early_init (void)
+void __init rte_cb_early_init (void)
 {
 	nb85e_intc_disable_irqs ();
 
-#if defined (CONFIG_ROM_KERNEL)
-	rom_kernel_init ();
-#elif defined (CONFIG_RTE_CB_MULTI)
+#ifdef CONFIG_RTE_CB_MULTI
 	multi_init ();
 #endif
 }
diff -Nru a/arch/v850/kernel/rte_cb_multi.c b/arch/v850/kernel/rte_cb_multi.c
--- a/arch/v850/kernel/rte_cb_multi.c	Sat Apr 19 19:51:30 2003
+++ b/arch/v850/kernel/rte_cb_multi.c	Sat Apr 19 19:51:30 2003
@@ -16,22 +16,55 @@
 
 #include <asm/machdep.h>
 
+#define IRQ_ADDR(irq) (0x80 + (irq) * 0x10)
+
 /* A table of which interrupt vectors to install, since blindly
    installing all of them makes the debugger stop working.  This is a
    list of offsets in the interrupt vector area; each entry means to
    copy that particular 16-byte vector.  An entry less than zero ends
    the table.  */
 static long multi_intv_install_table[] = {
-	0x40, 0x50,		/* trap vectors */
+	/* Trap vectors */
+	0x40, 0x50,		
+
 #ifdef CONFIG_RTE_CB_MULTI_DBTRAP
-	0x60,			/* illegal insn / dbtrap */
+	/* Illegal insn / dbtrap.  These are used by multi, so only handle
+	   them if configured to do so.  */
+	0x60,
 #endif
-	/* Note -- illegal insn trap is used by the debugger.  */
-	0xD0, 0xE0, 0xF0,	/* GINT1 - GINT3 */
-	0x240, 0x250, 0x260, 0x270, /* timer D interrupts */
-	0x2D0, 0x2E0, 0x2F0,	/* UART channel 0 */
-	0x310, 0x320, 0x330,	/* UART channel 1 */
-	0x350, 0x360, 0x370,	/* UART channel 2 */
+
+	/* GINT1 - GINT3 (note, not GINT0!) */
+	IRQ_ADDR (IRQ_GINT(1)),
+	IRQ_ADDR (IRQ_GINT(2)),
+	IRQ_ADDR (IRQ_GINT(3)),
+
+	/* Timer D interrupts (up to 4 timers) */
+	IRQ_ADDR (IRQ_INTCMD(0)),
+#if IRQ_INTCMD_NUM > 1
+	IRQ_ADDR (IRQ_INTCMD(1)),
+#if IRQ_INTCMD_NUM > 2
+	IRQ_ADDR (IRQ_INTCMD(2)),
+#if IRQ_INTCMD_NUM > 3
+	IRQ_ADDR (IRQ_INTCMD(3)),
+#endif
+#endif
+#endif
+	
+	/* UART interrupts (up to 3 channels) */
+	IRQ_ADDR (IRQ_INTSER (0)), /* err */
+	IRQ_ADDR (IRQ_INTSR  (0)), /* rx */
+	IRQ_ADDR (IRQ_INTST  (0)), /* tx */
+#if IRQ_INTSR_NUM > 1
+	IRQ_ADDR (IRQ_INTSER (1)), /* err */
+	IRQ_ADDR (IRQ_INTSR  (1)), /* rx */
+	IRQ_ADDR (IRQ_INTST  (1)), /* tx */
+#if IRQ_INTSR_NUM > 2
+	IRQ_ADDR (IRQ_INTSER (2)), /* err */
+	IRQ_ADDR (IRQ_INTSR  (2)), /* rx */
+	IRQ_ADDR (IRQ_INTST  (2)), /* tx */
+#endif
+#endif
+
 	-1
 };
 
diff -Nru a/arch/v850/kernel/rte_ma1_cb.c b/arch/v850/kernel/rte_ma1_cb.c
--- a/arch/v850/kernel/rte_ma1_cb.c	Sat Apr 19 19:51:50 2003
+++ b/arch/v850/kernel/rte_ma1_cb.c	Sat Apr 19 19:51:50 2003
@@ -1,8 +1,8 @@
 /*
  * arch/v850/kernel/rte_ma1_cb.c -- Midas labs RTE-V850E/MA1-CB board
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -31,6 +31,11 @@
 #define RAM_END		(SDRAM_ADDR + SDRAM_SIZE)
 
 
+void __init mach_early_init (void)
+{
+	rte_cb_early_init ();
+}
+
 void __init mach_get_physical_ram (unsigned long *ram_start,
 				   unsigned long *ram_len)
 {
@@ -67,7 +72,7 @@
 	if (chan == 0) {
 		/* Put P42 & P43 in I/O port mode.  */
 		MA_PORT4_PMC &= ~0xC;
-		/* Make P42 and output, and P43 an input.  */
+		/* Make P42 an output, and P43 an input.  */
 		MA_PORT4_PM = (MA_PORT4_PM & ~0xC) | 0x8;
 	}
 
diff -Nru a/arch/v850/kernel/rte_mb_a_pci.c b/arch/v850/kernel/rte_mb_a_pci.c
--- a/arch/v850/kernel/rte_mb_a_pci.c	Sat Apr 19 19:51:29 2003
+++ b/arch/v850/kernel/rte_mb_a_pci.c	Sat Apr 19 19:51:29 2003
@@ -1,8 +1,8 @@
 /*
  * arch/v850/kernel/mb_a_pci.c -- PCI support for Midas lab RTE-MOTHER-A board
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -165,7 +165,6 @@
 			"PCI: PLX Technology PCI9080 HOST/PCI bridge\n");
 
 		MB_A_PCI_PCICR = 0x147;
-		MB_A_PCI_DMLBAM = 0x0;
 
 		MB_A_PCI_PCIBAR0 = 0x007FFF00;
 		MB_A_PCI_PCIBAR1 = 0x0000FF00;
@@ -179,11 +178,28 @@
 
 		/* Reprogram the motherboard's IO/config address space,
 		   as we don't support the GCS7 address space that the
-		   default uses.  Note that we have to give the address
-		   from the motherboard's point of view, which is
-		   different than the CPU's.  */
-		MB_A_PCI_DMLBAI = MB_A_PCI_IO_ADDR - GCS5_ADDR;
+		   default uses.  */
+
+		/* Significant address bits used for decoding PCI GCS5 space
+		   accessess.  */
 		MB_A_PCI_DMRR = ~(MB_A_PCI_MEM_SIZE - 1);
+
+		/* I don't understand this, but the SolutionGear example code
+		   uses such an offset, and it doesn't work without it.  XXX */
+#if GCS5_SIZE == 0x00800000
+#define GCS5_CFG_OFFS 0x00800000
+#else
+#define GCS5_CFG_OFFS 0
+#endif
+
+		/* Address bit values for matching.  Note that we have to give
+		   the address from the motherboard's point of view, which is
+		   different than the CPU's.  */
+		/* PCI memory space.  */
+		MB_A_PCI_DMLBAM = GCS5_CFG_OFFS + 0x0;
+		/* PCI I/O space.  */
+		MB_A_PCI_DMLBAI =
+			GCS5_CFG_OFFS + (MB_A_PCI_IO_ADDR - GCS5_ADDR);
 
 		mb_pci_bus = pci_scan_bus (0, &mb_pci_config_ops, 0);
 
diff -Nru a/arch/v850/kernel/rte_nb85e_cb.c b/arch/v850/kernel/rte_nb85e_cb.c
--- a/arch/v850/kernel/rte_nb85e_cb.c	Sat Apr 19 19:51:50 2003
+++ b/arch/v850/kernel/rte_nb85e_cb.c	Sat Apr 19 19:51:50 2003
@@ -1,8 +1,8 @@
 /*
  * arch/v850/kernel/rte_nb85e_cb.c -- Midas labs RTE-V850E/NB85E-CB board
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -26,10 +26,30 @@
 
 #include "mach.h"
 
+void __init mach_early_init (void)
+{
+	/* Configure caching; some possible settings:
+
+	     BHC = 0x0000, DCC = 0x0000	 -- all caching disabled
+	     BHC = 0x0040, DCC = 0x0000	 -- SDRAM: icache only
+	     BHC = 0x0080, DCC = 0x0C00	 -- SDRAM: write-back dcache only
+	     BHC = 0x00C0, DCC = 0x0C00	 -- SDRAM: icache + write-back dcache
+	     BHC = 0x00C0, DCC = 0x0800	 -- SDRAM: icache + write-thru dcache
+
+	   We can only cache SDRAM (we can't use cache SRAM because it's in
+	   the same memory region as the on-chip RAM and I/O space).
+
+	   Unfortunately, the dcache seems to be buggy, so we only use the
+	   icache for now.  */
+	nb85e_cache_enable (0x0040 /* BHC */, 0x0000 /* DCC */);
+
+	rte_cb_early_init ();
+}
+
 void __init mach_get_physical_ram (unsigned long *ram_start,
 				   unsigned long *ram_len)
 {
-	/* We just use SDRAM here; the kernel itself is in SRAM.  */
+	/* We just use SDRAM here.  */
 	*ram_start = SDRAM_ADDR;
 	*ram_len = SDRAM_SIZE;
 }
@@ -41,8 +61,10 @@
 	u32 root_fs_image_end = (u32)&_root_fs_image_end;
 
 	/* Reserve the memory used by the root filesystem image if it's
-	   in RAM.  */
-	if (root_fs_image_start >= RAM_START && root_fs_image_start < RAM_END)
+	   in SDRAM.  */
+	if (root_fs_image_end > root_fs_image_start
+	    && root_fs_image_start >= SDRAM_ADDR
+	    && root_fs_image_start < (SDRAM_ADDR + SDRAM_SIZE))
 		reserve_bootmem (root_fs_image_start,
 				 root_fs_image_end - root_fs_image_start);
 }
@@ -51,4 +73,25 @@
 {
 	tv->tv_sec = 0;
 	tv->tv_nsec = 0;
+}
+
+/* Called before configuring an on-chip UART.  */
+void rte_nb85e_cb_uart_pre_configure (unsigned chan,
+				    unsigned cflags, unsigned baud)
+{
+	/* The RTE-NB85E-CB connects some general-purpose I/O pins on the
+	   CPU to the RTS/CTS lines the UART's serial connection, as follows:
+	   P00 = CTS (in), P01 = DSR (in), P02 = RTS (out), P03 = DTR (out). */
+
+	TEG_PORT0_PM = 0x03;	/* P00 and P01 inputs, P02 and P03 outputs */
+	TEG_PORT0_IO = 0x03;	/* Accept input */
+
+	/* Do pre-configuration for the actual UART.  */
+	teg_uart_pre_configure (chan, cflags, baud);
+}
+
+void __init mach_init_irqs (void)
+{
+	teg_init_irqs ();
+	rte_cb_init_irqs ();
 }
diff -Nru a/arch/v850/kernel/simcons.c b/arch/v850/kernel/simcons.c
--- a/arch/v850/kernel/simcons.c	Sat Apr 19 19:51:50 2003
+++ b/arch/v850/kernel/simcons.c	Sat Apr 19 19:51:50 2003
@@ -1,8 +1,8 @@
 /*
  * arch/v850/kernel/simcons.c -- Console I/O for GDB v850e simulator
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -19,6 +19,7 @@
 #include <linux/init.h>
 
 #include <asm/poll.h>
+#include <asm/string.h>
 #include <asm/simsyscall.h>
 
 
diff -Nru a/arch/v850/kernel/teg.c b/arch/v850/kernel/teg.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/v850/kernel/teg.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,63 @@
+/*
+ * arch/v850/kernel/teg.c -- NB85E-TEG cpu chip
+ *
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
+ *
+ * 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.
+ *
+ * Written by Miles Bader <miles@gnu.org>
+ */
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/swap.h>
+#include <linux/bootmem.h>
+#include <linux/irq.h>
+
+#include <asm/atomic.h>
+#include <asm/page.h>
+#include <asm/machdep.h>
+#include <asm/nb85e_timer_d.h>
+
+#include "mach.h"
+
+void __init mach_sched_init (struct irqaction *timer_action)
+{
+	/* Select timer interrupt instead of external pin.  */
+	TEG_ISS |= 0x1;
+	/* Start hardware timer.  */
+	nb85e_timer_d_configure (0, HZ);
+	/* Install timer interrupt handler.  */
+	setup_irq (IRQ_INTCMD(0), timer_action);
+}
+
+static struct nb85e_intc_irq_init irq_inits[] = {
+	{ "IRQ", 0,		NUM_CPU_IRQS,	1, 7 },
+	{ "CMD", IRQ_INTCMD(0),	IRQ_INTCMD_NUM,	1, 5 },
+	{ "SER", IRQ_INTSER(0),	IRQ_INTSER_NUM,	1, 3 },
+	{ "SR",	 IRQ_INTSR(0),	IRQ_INTSR_NUM,	1, 4 },
+	{ "ST",	 IRQ_INTST(0),	IRQ_INTST_NUM,	1, 5 },
+	{ 0 }
+};
+#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
+
+static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
+
+/* Initialize MA chip interrupts.  */
+void __init teg_init_irqs (void)
+{
+	nb85e_intc_init_irq_types (irq_inits, hw_itypes);
+}
+
+/* Called before configuring an on-chip UART.  */
+void teg_uart_pre_configure (unsigned chan, unsigned cflags, unsigned baud)
+{
+	/* Enable UART I/O pins instead of external interrupt pins, and
+	   UART interrupts instead of external pin interrupts.  */
+	TEG_ISS |= 0x4E;
+}
diff -Nru a/arch/v850/rte_nb85e_cb-multi.ld b/arch/v850/rte_nb85e_cb-multi.ld
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/v850/rte_nb85e_cb-multi.ld	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,57 @@
+/* Linker script for the Midas labs RTE-NB85E-CB evaluation board
+   (CONFIG_RTE_CB_NB85E), with the Multi debugger ROM monitor .  */
+
+MEMORY {
+	/* 1MB of SRAM; we can't use the last 96KB, because it's used by
+	   the monitor scratch-RAM.  This memory is mirrored 4 times.  */
+	SRAM  : ORIGIN = 0x03C00000, LENGTH = 0x000E8000
+	/* Monitor scratch RAM; only the interrupt vectors should go here.  */
+	MRAM  : ORIGIN = 0x03CE8000, LENGTH = 0x00018000
+	/* 16MB of SDRAM.  */
+	SDRAM : ORIGIN = 0x01000000, LENGTH = 0x01000000
+}
+
+#ifdef CONFIG_RTE_CB_NB85E_KSRAM
+# define KRAM SRAM
+#else
+# define KRAM SDRAM
+#endif
+
+SECTIONS {
+	/* We can't use RAMK_KRAM_CONTENTS because that puts the whole
+	   kernel in a single ELF segment, and the Multi debugger (which
+	   we use to load the kernel) appears to have bizarre problems
+	   dealing with it.  */
+
+	.text : {
+		__kram_start = . ;
+		TEXT_CONTENTS
+	} > KRAM
+
+	.data : {
+		DATA_CONTENTS
+		BSS_CONTENTS
+		RAMK_INIT_CONTENTS
+		__kram_end = . ;
+		BOOTMAP_CONTENTS
+
+		/* The address at which the interrupt vectors are initially
+		   loaded by the loader.  We can't load the interrupt vectors
+		   directly into their target location, because the monitor
+		   ROM for the GHS Multi debugger barfs if we try.
+		   Unfortunately, Multi also doesn't deal correctly with ELF
+		   sections where the LMA and VMA differ (it just ignores the
+		   LMA), so we can't use that feature to work around the
+		   problem!  What we do instead is just put the interrupt
+		   vectors into a normal section, and have the
+		   `mach_early_init' function for Midas boards do the
+		   necessary copying and relocation at runtime (this section
+		   basically only contains `jr' instructions, so it's not
+		   that hard).  */
+		. = ALIGN (0x10) ;
+		__intv_load_start = . ;
+		INTV_CONTENTS
+	} > KRAM
+
+	.root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM
+}
diff -Nru a/arch/v850/rte_nb85e_cb.ld b/arch/v850/rte_nb85e_cb.ld
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/arch/v850/rte_nb85e_cb.ld	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,25 @@
+/* Linker script for the Midas labs RTE-NB85E-CB evaluation board
+   (CONFIG_RTE_CB_NB85E).  */
+
+MEMORY {
+	LOW   : ORIGIN = 0x0,	     LENGTH = 0x00100000
+	/* 1MB of SRAM; we can't use the last 96KB, because it's used by
+	   the monitor scratch-RAM.  This memory is mirrored 4 times.  */
+	SRAM  : ORIGIN = 0x03C00000, LENGTH = 0x000E8000
+	/* Monitor scratch RAM; only the interrupt vectors should go here.  */
+	MRAM  : ORIGIN = 0x03CE8000, LENGTH = 0x00018000
+	/* 16MB of SDRAM.  */
+	SDRAM : ORIGIN = 0x01000000, LENGTH = 0x01000000
+}
+
+#ifdef CONFIG_RTE_CB_NB85E_KSRAM
+# define KRAM SRAM
+#else
+# define KRAM SDRAM
+#endif
+
+SECTIONS {
+	.intv : { INTV_CONTENTS } > LOW
+	.sram : { RAMK_KRAM_CONTENTS } > KRAM
+	.root : { ROOT_FS_CONTENTS } > SDRAM
+}
diff -Nru a/arch/v850/vmlinux.lds.S b/arch/v850/vmlinux.lds.S
--- a/arch/v850/vmlinux.lds.S	Sat Apr 19 19:51:49 2003
+++ b/arch/v850/vmlinux.lds.S	Sat Apr 19 19:51:49 2003
@@ -105,7 +105,9 @@
 #define RAMK_INIT_CONTENTS_NO_END					      \
 		. = ALIGN (4096) ;					      \
 		__init_start = . ;					      \
+			_sinittext = .;					      \
 			*(.init.text)	/* 2.5 convention */		      \
+			_einittext = .;					      \
 			*(.init.data)					      \
 			*(.text.init)	/* 2.4 convention */		      \
 			*(.data.init)					      \
@@ -125,7 +127,9 @@
 /* The contents of `init' section for a ROM-resident kernel which
    should go into ROM.  */	
 #define ROMK_INIT_ROM_CONTENTS						      \
+			_sinittext = .;					      \
 			*(.init.text)	/* 2.5 convention */		      \
+			_einittext = .;					      \
 			*(.text.init)	/* 2.4 convention */		      \
 		INITCALL_CONTENTS					      \
 		INITRAMFS_CONTENTS
diff -Nru a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S
--- a/arch/x86_64/ia32/ia32entry.S	Sat Apr 19 19:51:47 2003
+++ b/arch/x86_64/ia32/ia32entry.S	Sat Apr 19 19:51:47 2003
@@ -279,9 +279,9 @@
 	.quad stub32_sigsuspend
 	.quad compat_sys_sigpending
 	.quad sys_sethostname
-	.quad sys32_setrlimit	/* 75 */
-	.quad sys32_old_getrlimit	/* old_getrlimit */
-	.quad sys32_getrusage
+	.quad compat_sys_setrlimit	/* 75 */
+	.quad compat_sys_old_getrlimit	/* old_getrlimit */
+	.quad compat_sys_getrusage
 	.quad sys32_gettimeofday
 	.quad sys32_settimeofday
 	.quad sys_getgroups16	/* 80 */
@@ -318,7 +318,7 @@
 	.quad sys_vhangup
 	.quad ni_syscall	/* old "idle" system call */
 	.quad sys32_vm86_warning	/* vm86old */ 
-	.quad sys32_wait4
+	.quad compat_sys_wait4
 	.quad sys_swapoff		/* 115 */
 	.quad sys32_sysinfo
 	.quad sys32_ipc
@@ -395,7 +395,7 @@
 	.quad ni_syscall		/* streams1 */
 	.quad ni_syscall		/* streams2 */
 	.quad stub32_vfork            /* 190 */
-	.quad sys32_getrlimit
+	.quad compat_sys_getrlimit
 	.quad sys32_mmap2
 	.quad sys_truncate
 	.quad sys_ftruncate
@@ -445,8 +445,8 @@
 	.quad sys_tkill		/* 238 */ 
 	.quad sys_sendfile64 
 	.quad compat_sys_futex		/* 240 */
-        .quad sys32_sched_setaffinity
-        .quad sys32_sched_getaffinity
+        .quad compat_sys_sched_setaffinity
+        .quad compat_sys_sched_getaffinity
 	.quad sys32_set_thread_area
 	.quad sys32_get_thread_area
 	.quad sys32_io_setup
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	Sat Apr 19 19:51:47 2003
+++ b/arch/x86_64/ia32/sys_ia32.c	Sat Apr 19 19:51:47 2003
@@ -836,82 +836,6 @@
 	return ret;
 }
 
-#define RLIM_INFINITY32	0xffffffff
-#define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)
-
-struct rlimit32 {
-	int	rlim_cur;
-	int	rlim_max;
-};
-
-extern asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit *rlim);
-
-asmlinkage long
-sys32_getrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs;
-
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_getrlimit(resource, &r);
-	set_fs(old_fs);
-	if (!ret) {
-		if (verify_area(VERIFY_WRITE, rlim, sizeof(struct rlimit32)) ||
-		    __put_user(RESOURCE32(r.rlim_cur), &rlim->rlim_cur) ||
-		    __put_user(RESOURCE32(r.rlim_max), &rlim->rlim_max))
-			ret = -EFAULT;
-	}
-	return ret;
-}
-
-extern asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit *rlim);
-
-asmlinkage long
-sys32_old_getrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs;
-	
-	old_fs = get_fs();
-	set_fs(KERNEL_DS);
-	ret = sys_old_getrlimit(resource, &r);
-	set_fs(old_fs);
-	if (!ret) {
-		if (verify_area(VERIFY_WRITE, rlim, sizeof(struct rlimit32)) ||
-		    __put_user(r.rlim_cur, &rlim->rlim_cur) ||
-		    __put_user(r.rlim_max, &rlim->rlim_max))
-			ret = -EFAULT;
-	}
-	return ret;
-}
-
-extern asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit *rlim);
-
-asmlinkage long
-sys32_setrlimit(unsigned int resource, struct rlimit32 *rlim)
-{
-	struct rlimit r;
-	int ret;
-	mm_segment_t old_fs = get_fs ();
-
-	if (resource >= RLIM_NLIMITS) return -EINVAL;	
-	if (verify_area(VERIFY_READ, rlim, sizeof(struct rlimit32)) ||
-	    __get_user (r.rlim_cur, &rlim->rlim_cur) ||
-	    __get_user (r.rlim_max, &rlim->rlim_max))
-		return -EFAULT;
-	if (r.rlim_cur == RLIM_INFINITY32)
-		r.rlim_cur = RLIM_INFINITY;
-	if (r.rlim_max == RLIM_INFINITY32)
-		r.rlim_max = RLIM_INFINITY;
-	set_fs (KERNEL_DS);
-	ret = sys_setrlimit(resource, &r);
-	set_fs (old_fs);
-	return ret;
-}
-
 /*
  * sys_time() can be implemented in user-level using
  * sys_gettimeofday().  x86-64 did this but i386 Linux did not
@@ -931,80 +855,10 @@
 	return i;
 }
 
-struct rusage32 {
-        struct compat_timeval ru_utime;
-        struct compat_timeval ru_stime;
-        int    ru_maxrss;
-        int    ru_ixrss;
-        int    ru_idrss;
-        int    ru_isrss;
-        int    ru_minflt;
-        int    ru_majflt;
-        int    ru_nswap;
-        int    ru_inblock;
-        int    ru_oublock;
-        int    ru_msgsnd; 
-        int    ru_msgrcv; 
-        int    ru_nsignals;
-        int    ru_nvcsw;
-        int    ru_nivcsw;
-};
-
-static int
-put_rusage (struct rusage32 *ru, struct rusage *r)
-{
-	if (verify_area(VERIFY_WRITE, ru, sizeof(struct rusage32)) ||
-	    __put_user (r->ru_utime.tv_sec, &ru->ru_utime.tv_sec) ||
-	    __put_user (r->ru_utime.tv_usec, &ru->ru_utime.tv_usec) ||
-	    __put_user (r->ru_stime.tv_sec, &ru->ru_stime.tv_sec) ||
-	    __put_user (r->ru_stime.tv_usec, &ru->ru_stime.tv_usec) ||
-	    __put_user (r->ru_maxrss, &ru->ru_maxrss) ||
-	    __put_user (r->ru_ixrss, &ru->ru_ixrss) ||
-	    __put_user (r->ru_idrss, &ru->ru_idrss) ||
-	    __put_user (r->ru_isrss, &ru->ru_isrss) ||
-	    __put_user (r->ru_minflt, &ru->ru_minflt) ||
-	    __put_user (r->ru_majflt, &ru->ru_majflt) ||
-	    __put_user (r->ru_nswap, &ru->ru_nswap) ||
-	    __put_user (r->ru_inblock, &ru->ru_inblock) ||
-	    __put_user (r->ru_oublock, &ru->ru_oublock) ||
-	    __put_user (r->ru_msgsnd, &ru->ru_msgsnd) ||
-	    __put_user (r->ru_msgrcv, &ru->ru_msgrcv) ||
-	    __put_user (r->ru_nsignals, &ru->ru_nsignals) ||
-	    __put_user (r->ru_nvcsw, &ru->ru_nvcsw) ||
-	    __put_user (r->ru_nivcsw, &ru->ru_nivcsw))
-		return -EFAULT;
-	return 0;
-}
-
-extern asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr,
-				int options, struct rusage * ru);
-
-asmlinkage long
-sys32_wait4(compat_pid_t pid, unsigned int *stat_addr, int options,
-	    struct rusage32 *ru)
-{
-	if (!ru)
-		return sys_wait4(pid, stat_addr, options, NULL);
-	else {
-		struct rusage r;
-		int ret;
-		unsigned int status;
-		mm_segment_t old_fs = get_fs();
-		
-		set_fs (KERNEL_DS);
-		ret = sys_wait4(pid, stat_addr ? &status : NULL, options, &r);
-		set_fs (old_fs);
-		if (put_rusage (ru, &r)) return -EFAULT;
-		if (stat_addr && put_user (status, stat_addr))
-			return -EFAULT;
-		return ret;
-	}
-}
-
 asmlinkage long
 sys32_waitpid(compat_pid_t pid, unsigned int *stat_addr, int options)
 {
-	return sys32_wait4(pid, stat_addr, options, NULL);
+	return compat_sys_wait4(pid, stat_addr, options, NULL);
 }
 
 
@@ -2037,41 +1891,6 @@
 		       current->comm);
 	return -ENOSYS ;
 } 
-
-long sys_sched_getaffinity(pid_t pid, unsigned int len, unsigned long *new_mask_ptr); 
-long sys_sched_setaffinity(pid_t pid, unsigned int len, unsigned long *new_mask_ptr); 
-
-/* only works on LE */
-long sys32_sched_setaffinity(pid_t pid, unsigned int len,
-			    unsigned int *new_mask_ptr)
-{
-	mm_segment_t oldfs = get_fs(); 
-	unsigned long mask; 
-	int err;
-	if (get_user(mask, new_mask_ptr)) 
-		return -EFAULT;	
-	set_fs(KERNEL_DS); 
-	err = sys_sched_setaffinity(pid,sizeof(mask),&mask); 	
-	set_fs(oldfs); 
-	return err;
-}
-
-/* only works on LE */ 
-long sys32_sched_getaffinity(pid_t pid, unsigned int len,
-			    unsigned int *new_mask_ptr)
-{
-	mm_segment_t oldfs = get_fs(); 
-	unsigned long mask; 
-	int err;
-	mask = 0; 
-	set_fs(KERNEL_DS); 
-	err = sys_sched_getaffinity(pid,sizeof(mask),&mask); 	
-	set_fs(oldfs); 
-	if (err > 0) 
-		err = put_user((u32)mask, new_mask_ptr); 
-	return err;
-}
-
 
 extern long sys_io_setup(unsigned nr_reqs, aio_context_t *ctx);
 
diff -Nru a/arch/x86_64/kernel/suspend.c b/arch/x86_64/kernel/suspend.c
--- a/arch/x86_64/kernel/suspend.c	Sat Apr 19 19:51:47 2003
+++ b/arch/x86_64/kernel/suspend.c	Sat Apr 19 19:51:47 2003
@@ -16,7 +16,6 @@
 #include <linux/poll.h>
 #include <linux/delay.h>
 #include <linux/sysrq.h>
-#include <linux/compatmac.h>
 #include <linux/proc_fs.h>
 #include <linux/irq.h>
 #include <linux/pm.h>
diff -Nru a/arch/x86_64/vmlinux.lds.S b/arch/x86_64/vmlinux.lds.S
--- a/arch/x86_64/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
+++ b/arch/x86_64/vmlinux.lds.S	Sat Apr 19 19:51:28 2003
@@ -78,7 +78,11 @@
 
   . = ALIGN(4096);		/* Init code and data */
   __init_begin = .;
-  .init.text : { *(.init.text) }
+  .init.text : { 
+	_sinittext = .;
+	*(.init.text)
+	_einittext = .;
+  }
   .init.data : { *(.init.data) }
   . = ALIGN(16);
   __setup_start = .;
diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c
--- a/drivers/acpi/bus.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/acpi/bus.c	Sat Apr 19 19:51:49 2003
@@ -281,7 +281,7 @@
 	int			data)
 {
 	struct acpi_bus_event	*event = NULL;
-	u32			flags = 0;
+	unsigned long		flags = 0;
 
 	ACPI_FUNCTION_TRACE("acpi_bus_generate_event");
 
@@ -314,7 +314,7 @@
 acpi_bus_receive_event (
 	struct acpi_bus_event	*event)
 {
-	u32			flags = 0;
+	unsigned long		flags = 0;
 	struct acpi_bus_event	*entry = NULL;
 
 	DECLARE_WAITQUEUE(wait, current);
@@ -676,7 +676,7 @@
 	return_VALUE(-ENODEV);
 }
 
-decl_subsys(acpi,NULL);
+decl_subsys(acpi,NULL,NULL);
 
 static int __init acpi_init (void)
 {
diff -Nru a/drivers/acpi/processor.c b/drivers/acpi/processor.c
--- a/drivers/acpi/processor.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/acpi/processor.c	Sat Apr 19 19:51:49 2003
@@ -36,13 +36,13 @@
 #include <linux/pci.h>
 #include <linux/pm.h>
 #include <linux/cpufreq.h>
-#include <linux/compatmac.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 
 #include <asm/io.h>
 #include <asm/system.h>
 #include <asm/delay.h>
+#include <asm/uaccess.h>
 
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
diff -Nru a/drivers/base/base.h b/drivers/base/base.h
--- a/drivers/base/base.h	Sat Apr 19 19:51:46 2003
+++ b/drivers/base/base.h	Sat Apr 19 19:51:46 2003
@@ -18,13 +18,8 @@
 
 
 #ifdef CONFIG_HOTPLUG
-extern int dev_hotplug(struct device *dev, const char *action);
 extern int class_hotplug(struct device *dev, const char *action);
 #else
-static inline int dev_hotplug(struct device *dev, const char *action)
-{
-	return 0;
-}
 static inline int class_hotplug(struct device *dev, const char *action)
 {
 	return 0;
diff -Nru a/drivers/base/bus.c b/drivers/base/bus.c
--- a/drivers/base/bus.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/base/bus.c	Sat Apr 19 19:51:29 2003
@@ -132,7 +132,7 @@
 
 };
 
-decl_subsys(bus,&ktype_bus);
+decl_subsys(bus,&ktype_bus,NULL);
 
 /**
  *	bus_for_each_dev - device iterator.
diff -Nru a/drivers/base/class.c b/drivers/base/class.c
--- a/drivers/base/class.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/base/class.c	Sat Apr 19 19:51:51 2003
@@ -49,7 +49,9 @@
 	.sysfs_ops	= &class_sysfs_ops,
 };
 
-static decl_subsys(class,&ktype_devclass);
+/* Classes can't use the kobject hotplug logic, as
+ * they do not add new kobjects to the system */
+static decl_subsys(class,&ktype_devclass,NULL);
 
 
 static int devclass_dev_link(struct device_class * cls, struct device * dev)
diff -Nru a/drivers/base/core.c b/drivers/base/core.c
--- a/drivers/base/core.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/base/core.c	Sat Apr 19 19:51:28 2003
@@ -23,13 +23,12 @@
 
 DECLARE_MUTEX(device_sem);
 
-#define to_dev(obj) container_of(obj,struct device,kobj)
-
 
 /*
  * sysfs bindings for devices.
  */
 
+#define to_dev(obj) container_of(obj,struct device,kobj)
 #define to_dev_attr(_attr) container_of(_attr,struct device_attribute,attr)
 
 extern struct attribute * dev_default_attrs[];
@@ -86,11 +85,55 @@
 	.default_attrs	= dev_default_attrs,
 };
 
+
+static int dev_hotplug_filter(struct kset *kset, struct kobject *kobj)
+{
+	struct kobj_type *ktype = get_ktype(kobj);
+
+	if (ktype == &ktype_device) {
+		struct device *dev = to_dev(kobj);
+		if (dev->bus)
+			return 1;
+	}
+	return 0;
+}
+
+static char *dev_hotplug_name(struct kset *kset, struct kobject *kobj)
+{
+	struct device *dev = to_dev(kobj);
+
+	return dev->bus->name;
+}
+
+static int dev_hotplug(struct kset *kset, struct kobject *kobj, char **envp,
+			int num_envp, char *buffer, int buffer_size)
+{
+	struct device *dev = to_dev(kobj);
+	int retval = 0;
+
+	if (dev->bus->hotplug) {
+		/* have the bus specific function add its stuff */
+		retval = dev->bus->hotplug (dev, envp, num_envp, buffer, buffer_size);
+			if (retval) {
+			pr_debug ("%s - hotplug() returned %d\n",
+				  __FUNCTION__, retval);
+		}
+	}
+
+	return retval;
+}
+
+static struct kset_hotplug_ops device_hotplug_ops = {
+	.filter =	dev_hotplug_filter,
+	.name =		dev_hotplug_name,
+	.hotplug =	dev_hotplug,
+};
+
 /**
  *	device_subsys - structure to be registered with kobject core.
  */
 
-decl_subsys(devices,&ktype_device);
+decl_subsys(devices, &ktype_device, &device_hotplug_ops);
 
 
 /**
@@ -192,9 +235,6 @@
 	if (platform_notify)
 		platform_notify(dev);
 
-	/* notify userspace of device entry */
-	dev_hotplug(dev, "add");
-
 	devclass_add_device(dev);
  register_done:
 	if (error && parent)
@@ -277,9 +317,6 @@
 	 */
 	if (platform_notify_remove)
 		platform_notify_remove(dev);
-
-	/* notify userspace that this device is about to disappear */
-	dev_hotplug (dev, "remove");
 
 	bus_remove_device(dev);
 
diff -Nru a/drivers/base/firmware.c b/drivers/base/firmware.c
--- a/drivers/base/firmware.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/base/firmware.c	Sat Apr 19 19:51:48 2003
@@ -6,7 +6,7 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-static decl_subsys(firmware,NULL);
+static decl_subsys(firmware,NULL,NULL);
 
 int firmware_register(struct subsystem * s)
 {
diff -Nru a/drivers/base/hotplug.c b/drivers/base/hotplug.c
--- a/drivers/base/hotplug.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/base/hotplug.c	Sat Apr 19 19:51:27 2003
@@ -2,8 +2,8 @@
  * drivers/base/hotplug.c - hotplug call code
  * 
  * Copyright (c) 2000-2001 David Brownell
- * Copyright (c) 2002 Greg Kroah-Hartman
- * Copyright (c) 2002 IBM Corp.
+ * Copyright (c) 2002-2003 Greg Kroah-Hartman
+ * Copyright (c) 2002-2003 IBM Corp.
  *
  * Based off of drivers/usb/core/usb.c:call_agent(), which was 
  * written by David Brownell.
@@ -53,17 +53,6 @@
 	if (!hotplug_path [0])
 		return -ENODEV;
 
-	if (in_interrupt ()) {
-		pr_debug ("%s - in_interrupt, not allowed!", __FUNCTION__);
-		return -EIO;
-	}
-
-	if (!current->fs->root) {
-		/* don't try to do anything unless we have a root partition */
-		pr_debug ("%s - %s -- no FS yet\n", __FUNCTION__, action);
-		return -EIO;
-	}
-
 	envp = (char **) kmalloc (NUM_ENVP * sizeof (char *), GFP_KERNEL);
 	if (!envp)
 		return -ENOMEM;
@@ -127,23 +116,6 @@
 	kfree (envp);
 	return retval;
 }
-
-
-/*
- * dev_hotplug - called when any device is added or removed from a bus
- */
-int dev_hotplug (struct device *dev, const char *action)
-{
-	pr_debug ("%s\n", __FUNCTION__);
-	if (!dev)
-		return -ENODEV;
-
-	if (!dev->bus)
-		return -ENODEV;
-
-	return do_hotplug (dev, dev->bus->name, action, dev->bus->hotplug);
-}
-
 
 /*
  * class_hotplug - called when a class is added or removed from a device
diff -Nru a/drivers/block/Kconfig b/drivers/block/Kconfig
--- a/drivers/block/Kconfig	Sat Apr 19 19:51:29 2003
+++ b/drivers/block/Kconfig	Sat Apr 19 19:51:29 2003
@@ -28,6 +28,13 @@
 	tristate "Atari floppy support"
 	depends on ATARI
 
+config BLK_DEV_FD98
+	tristate "NEC PC-9800 floppy disk support"
+	depends on X86_PC9800
+	---help---
+	  If you want to use the floppy disk drive(s) of NEC PC-9801/PC-9821,
+	  say Y.
+
 config BLK_DEV_SWIM_IOP
 	bool "Macintosh IIfx/Quadra 900/Quadra 950 floppy support (EXPERIMENTAL)"
 	depends on MAC && EXPERIMENTAL
diff -Nru a/drivers/block/Makefile b/drivers/block/Makefile
--- a/drivers/block/Makefile	Sat Apr 19 19:51:50 2003
+++ b/drivers/block/Makefile	Sat Apr 19 19:51:50 2003
@@ -12,6 +12,7 @@
 
 obj-$(CONFIG_MAC_FLOPPY)	+= swim3.o
 obj-$(CONFIG_BLK_DEV_FD)	+= floppy.o
+obj-$(CONFIG_BLK_DEV_FD98)	+= floppy98.o
 obj-$(CONFIG_AMIGA_FLOPPY)	+= amiflop.o
 obj-$(CONFIG_ATARI_FLOPPY)	+= ataflop.o
 obj-$(CONFIG_BLK_DEV_SWIM_IOP)	+= swim_iop.o
diff -Nru a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
--- a/drivers/block/cpqarray.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/block/cpqarray.c	Sat Apr 19 19:51:28 2003
@@ -400,7 +400,6 @@
 			sprintf(disk->disk_name, "ida/c%dd%d", i, j);
 			disk->major = COMPAQ_SMART2_MAJOR + i;
 			disk->first_minor = j<<NWD_SHIFT;
-			disk->flags = GENHD_FL_DEVFS;
 			disk->fops = &ida_fops; 
 			if (!drv->nr_blks)
 				continue;
@@ -1678,10 +1677,9 @@
                 			return;
 
 				}
-				if (!disk->de) {
-					disk->de = devfs_mk_dir("ida/c%dd%d",
-							ctlr, log_unit);
-				}
+
+				sprintf(disk->devfs_name, "ida/c%dd%d", ctlr, log_unit);
+
 				info_p->phys_drives =
 				    sense_config_buf->ctlr_phys_drv;
 				info_p->drv_assign_map
diff -Nru a/drivers/block/floppy.c b/drivers/block/floppy.c
--- a/drivers/block/floppy.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/block/floppy.c	Sat Apr 19 19:51:28 2003
@@ -4396,11 +4396,9 @@
 		return 0;
 	}
 	spin_unlock_irqrestore(&floppy_usage_lock, flags);
-	MOD_INC_USE_COUNT;
 	if (fd_request_irq()) {
 		DPRINT("Unable to grab IRQ%d for the floppy driver\n",
 			FLOPPY_IRQ);
-		MOD_DEC_USE_COUNT;
 		spin_lock_irqsave(&floppy_usage_lock, flags);
 		usage_count--;
 		spin_unlock_irqrestore(&floppy_usage_lock, flags);
@@ -4410,7 +4408,6 @@
 		DPRINT("Unable to grab DMA%d for the floppy driver\n",
 			FLOPPY_DMA);
 		fd_free_irq();
-		MOD_DEC_USE_COUNT;
 		spin_lock_irqsave(&floppy_usage_lock, flags);
 		usage_count--;
 		spin_unlock_irqrestore(&floppy_usage_lock, flags);
@@ -4459,7 +4456,6 @@
 		release_region(FDCS->address + 2, 4);
 		release_region(FDCS->address + 7, 1);
 	}
-	MOD_DEC_USE_COUNT;
 	spin_lock_irqsave(&floppy_usage_lock, flags);
 	usage_count--;
 	spin_unlock_irqrestore(&floppy_usage_lock, flags);
@@ -4527,7 +4523,6 @@
 			release_region(FDCS->address+7, 1);
 		}
 	fdc = old_fdc;
-	MOD_DEC_USE_COUNT;
 }
 
 
diff -Nru a/drivers/block/floppy98.c b/drivers/block/floppy98.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/block/floppy98.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,4669 @@
+/*
+ *  linux/drivers/block/floppy.c
+ *
+ *  Copyright (C) 1991, 1992  Linus Torvalds
+ *  Copyright (C) 1993, 1994  Alain Knaff
+ *  Copyright (C) 1998 Alan Cox
+ */
+/*
+ * 02.12.91 - Changed to static variables to indicate need for reset
+ * and recalibrate. This makes some things easier (output_byte reset
+ * checking etc), and means less interrupt jumping in case of errors,
+ * so the code is hopefully easier to understand.
+ */
+
+/*
+ * This file is certainly a mess. I've tried my best to get it working,
+ * but I don't like programming floppies, and I have only one anyway.
+ * Urgel. I should check for more errors, and do more graceful error
+ * recovery. Seems there are problems with several drives. I've tried to
+ * correct them. No promises.
+ */
+
+/*
+ * As with hd.c, all routines within this file can (and will) be called
+ * by interrupts, so extreme caution is needed. A hardware interrupt
+ * handler may not sleep, or a kernel panic will happen. Thus I cannot
+ * call "floppy-on" directly, but have to set a special timer interrupt
+ * etc.
+ */
+
+/*
+ * 28.02.92 - made track-buffering routines, based on the routines written
+ * by entropy@wintermute.wpi.edu (Lawrence Foard). Linus.
+ */
+
+/*
+ * Automatic floppy-detection and formatting written by Werner Almesberger
+ * (almesber@nessie.cs.id.ethz.ch), who also corrected some problems with
+ * the floppy-change signal detection.
+ */
+
+/*
+ * 1992/7/22 -- Hennus Bergman: Added better error reporting, fixed
+ * FDC data overrun bug, added some preliminary stuff for vertical
+ * recording support.
+ *
+ * 1992/9/17: Added DMA allocation & DMA functions. -- hhb.
+ *
+ * TODO: Errors are still not counted properly.
+ */
+
+/* 1992/9/20
+ * Modifications for ``Sector Shifting'' by Rob Hooft (hooft@chem.ruu.nl)
+ * modeled after the freeware MS-DOS program fdformat/88 V1.8 by
+ * Christoph H. Hochst\"atter.
+ * I have fixed the shift values to the ones I always use. Maybe a new
+ * ioctl() should be created to be able to modify them.
+ * There is a bug in the driver that makes it impossible to format a
+ * floppy as the first thing after bootup.
+ */
+
+/*
+ * 1993/4/29 -- Linus -- cleaned up the timer handling in the kernel, and
+ * this helped the floppy driver as well. Much cleaner, and still seems to
+ * work.
+ */
+
+/* 1994/6/24 --bbroad-- added the floppy table entries and made
+ * minor modifications to allow 2.88 floppies to be run.
+ */
+
+/* 1994/7/13 -- Paul Vojta -- modified the probing code to allow three or more
+ * disk types.
+ */
+
+/*
+ * 1994/8/8 -- Alain Knaff -- Switched to fdpatch driver: Support for bigger
+ * format bug fixes, but unfortunately some new bugs too...
+ */
+
+/* 1994/9/17 -- Koen Holtman -- added logging of physical floppy write
+ * errors to allow safe writing by specialized programs.
+ */
+
+/* 1995/4/24 -- Dan Fandrich -- added support for Commodore 1581 3.5" disks
+ * by defining bit 1 of the "stretch" parameter to mean put sectors on the
+ * opposite side of the disk, leaving the sector IDs alone (i.e. Commodore's
+ * drives are "upside-down").
+ */
+
+/*
+ * 1995/8/26 -- Andreas Busse -- added Mips support.
+ */
+
+/*
+ * 1995/10/18 -- Ralf Baechle -- Portability cleanup; move machine dependent
+ * features to asm/floppy.h.
+ */
+
+/*
+ * 1998/05/07 -- Russell King -- More portability cleanups; moved definition of
+ * interrupt and dma channel to asm/floppy.h. Cleaned up some formatting &
+ * use of '0' for NULL.
+ */
+ 
+/*
+ * 1998/06/07 -- Alan Cox -- Merged the 2.0.34 fixes for resource allocation
+ * failures.
+ */
+
+/*
+ * 1998/09/20 -- David Weinehall -- Added slow-down code for buggy PS/2-drives.
+ */
+
+/*
+ * 1999/01/19 -- N.Fujita & Linux/98 Project -- Added code for NEC PC-9800
+ * series.
+ */
+
+/*
+ * 1999/08/13 -- Paul Slootman -- floppy stopped working on Alpha after 24
+ * days, 6 hours, 32 minutes and 32 seconds (i.e. MAXINT jiffies; ints were
+ * being used to store jiffies, which are unsigned longs).
+ */
+
+/*
+ * 2000/08/28 -- Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+ * - get rid of check_region
+ * - s/suser/capable/
+ */
+
+/*
+ * 2001/08/26 -- Paul Gortmaker - fix insmod oops on machines with no
+ * floppy controller (lingering task on list after module is gone... boom.)
+ */
+
+/*
+ * 2002/02/07 -- Anton Altaparmakov - Fix io ports reservation to correct range
+ * (0x3f2-0x3f5, 0x3f7). This fix is a bit of a hack but the proper fix
+ * requires many non-obvious changes in arch dependent code.
+ */
+
+/*
+ * 2002/10/12 -- Osamu Tomita <tomita@cinet.co.jp>
+ * split code from floppy.c
+ * support NEC PC-9800 only
+ */
+
+#define FLOPPY_SANITY_CHECK
+#undef  FLOPPY_SILENT_DCL_CLEAR
+
+/*
+#define PC9800_DEBUG_FLOPPY
+#define PC9800_DEBUG_FLOPPY2
+*/
+
+#define REALLY_SLOW_IO
+
+#define DEBUGT 2
+#define DCL_DEBUG /* debug disk change line */
+
+/* do print messages for unexpected interrupts */
+static int print_unex=1;
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/fs.h>
+#include <linux/kernel.h>
+#include <linux/timer.h>
+#include <linux/workqueue.h>
+#include <linux/version.h>
+#define FDPATCHES
+#include <linux/fdreg.h>
+
+/*
+ * 1998/1/21 -- Richard Gooch <rgooch@atnf.csiro.au> -- devfs support
+ */
+
+
+#include <linux/fd.h>
+#define FLOPPY98_MOTOR_MASK 0x08
+
+#define FDPATCHES
+#include <linux/hdreg.h>
+#define FD98_STATUS	(0 + FD_IOPORT )
+#define FD98_DATA	(2 + FD_IOPORT )
+#define FD_MODE		(4 + FD_IOPORT )
+#define FD_MODE_CHANGE	0xbe
+#define FD_EMODE_CHANGE	0x4be
+
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/bio.h>
+#include <linux/string.h>
+#include <linux/fcntl.h>
+#include <linux/delay.h>
+#include <linux/mc146818rtc.h> /* CMOS defines */
+#include <linux/ioport.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/devfs_fs_kernel.h>
+#include <linux/device.h>
+#include <linux/buffer_head.h>		/* for invalidate_buffers() */
+
+/*
+ * PS/2 floppies have much slower step rates than regular floppies.
+ * It's been recommended that take about 1/4 of the default speed
+ * in some more extreme cases.
+ */
+static int slow_floppy;
+
+#include <asm/dma.h>
+#include <asm/irq.h>
+#include <asm/system.h>
+#include <asm/io.h>
+#include <asm/uaccess.h>
+
+#ifndef DEFAULT_FLOPPY_IRQ
+# define DEFAULT_FLOPPY_IRQ	11
+#endif
+#ifndef DEFAULT_FLOPPY_DMA
+# define DEFAULT_FLOPPY_DMA	2
+#endif
+
+static int FLOPPY_IRQ=DEFAULT_FLOPPY_IRQ;
+static int FLOPPY_DMA=DEFAULT_FLOPPY_DMA;
+static int can_use_virtual_dma=2;
+static int auto_detect_mode = 0;
+static int retry_auto_detect = 0;
+#define FD_AFTER_RESET_DELAY 1000
+
+/* =======
+ * can use virtual DMA:
+ * 0 = use of virtual DMA disallowed by config
+ * 1 = use of virtual DMA prescribed by config
+ * 2 = no virtual DMA preference configured.  By default try hard DMA,
+ * but fall back on virtual DMA when not enough memory available
+ */
+
+static int use_virtual_dma;
+/* =======
+ * use virtual DMA
+ * 0 using hard DMA
+ * 1 using virtual DMA
+ * This variable is set to virtual when a DMA mem problem arises, and
+ * reset back in floppy_grab_irq_and_dma.
+ * It is not safe to reset it in other circumstances, because the floppy
+ * driver may have several buffers in use at once, and we do currently not
+ * record each buffers capabilities
+ */
+
+static spinlock_t floppy_lock = SPIN_LOCK_UNLOCKED;
+
+static unsigned short virtual_dma_port=0x3f0;
+void floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs);
+static int set_mode(char mask, char data);
+static void register_devfs_entries (int drive) __init;
+
+#define K_64	0x10000		/* 64KB */
+
+/* the following is the mask of allowed drives. By default units 2 and
+ * 3 of both floppy controllers are disabled, because switching on the
+ * motor of these drives causes system hangs on some PCI computers. drive
+ * 0 is the low bit (0x1), and drive 7 is the high bit (0x80). Bits are on if
+ * a drive is allowed.
+ *
+ * NOTE: This must come before we include the arch floppy header because
+ *       some ports reference this variable from there. -DaveM
+ */
+
+static int allowed_drive_mask = 0x0f;
+
+#include <asm/floppy.h>
+
+static int irqdma_allocated;
+
+#define LOCAL_END_REQUEST
+#define DEVICE_NAME "floppy"
+
+#include <linux/blk.h>
+#include <linux/blkpg.h>
+#include <linux/cdrom.h> /* for the compatibility eject ioctl */
+#include <linux/completion.h>
+
+static struct request *current_req;
+static struct request_queue floppy_queue;
+
+#ifndef fd_get_dma_residue
+#define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
+#endif
+
+/* Dma Memory related stuff */
+
+#ifndef fd_dma_mem_free
+#define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
+#endif
+
+#ifndef fd_dma_mem_alloc
+#define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL,get_order(size))
+#endif
+
+static inline void fallback_on_nodma_alloc(char **addr, size_t l)
+{
+#ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
+	if (*addr)
+		return; /* we have the memory */
+	if (can_use_virtual_dma != 2)
+		return; /* no fallback allowed */
+	printk("DMA memory shortage. Temporarily falling back on virtual DMA\n");
+	*addr = (char *) nodma_mem_alloc(l);
+#else
+	return;
+#endif
+}
+
+/* End dma memory related stuff */
+
+static unsigned long fake_change;
+static int initialising=1;
+
+static inline int TYPE(kdev_t x) {
+	return  (minor(x)>>2) & 0x1f;
+}
+static inline int DRIVE(kdev_t x) {
+	return (minor(x)&0x03) | ((minor(x)&0x80) >> 5);
+}
+#define ITYPE(x) (((x)>>2) & 0x1f)
+#define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
+#define UNIT(x) ((x) & 0x03)		/* drive on fdc */
+#define FDC(x) (((x) & 0x04) >> 2)  /* fdc of drive */
+#define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
+				/* reverse mapping from unit and fdc to drive */
+#define DP (&drive_params[current_drive])
+#define DRS (&drive_state[current_drive])
+#define DRWE (&write_errors[current_drive])
+#define FDCS (&fdc_state[fdc])
+#define CLEARF(x) (clear_bit(x##_BIT, &DRS->flags))
+#define SETF(x) (set_bit(x##_BIT, &DRS->flags))
+#define TESTF(x) (test_bit(x##_BIT, &DRS->flags))
+
+#define UDP (&drive_params[drive])
+#define UDRS (&drive_state[drive])
+#define UDRWE (&write_errors[drive])
+#define UFDCS (&fdc_state[FDC(drive)])
+#define UCLEARF(x) (clear_bit(x##_BIT, &UDRS->flags))
+#define USETF(x) (set_bit(x##_BIT, &UDRS->flags))
+#define UTESTF(x) (test_bit(x##_BIT, &UDRS->flags))
+
+#define DPRINT(format, args...) printk(DEVICE_NAME "%d: " format, current_drive , ## args)
+
+#define PH_HEAD(floppy,head) (((((floppy)->stretch & 2) >>1) ^ head) << 2)
+#define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
+
+#define CLEARSTRUCT(x) memset((x), 0, sizeof(*(x)))
+
+/* read/write */
+#define COMMAND raw_cmd->cmd[0]
+#define DR_SELECT raw_cmd->cmd[1]
+#define TRACK raw_cmd->cmd[2]
+#define HEAD raw_cmd->cmd[3]
+#define SECTOR raw_cmd->cmd[4]
+#define SIZECODE raw_cmd->cmd[5]
+#define SECT_PER_TRACK raw_cmd->cmd[6]
+#define GAP raw_cmd->cmd[7]
+#define SIZECODE2 raw_cmd->cmd[8]
+#define NR_RW 9
+
+/* format */
+#define F_SIZECODE raw_cmd->cmd[2]
+#define F_SECT_PER_TRACK raw_cmd->cmd[3]
+#define F_GAP raw_cmd->cmd[4]
+#define F_FILL raw_cmd->cmd[5]
+#define NR_F 6
+
+/*
+ * Maximum disk size (in kilobytes). This default is used whenever the
+ * current disk size is unknown.
+ * [Now it is rather a minimum]
+ */
+#define MAX_DISK_SIZE 4 /* 3984*/
+
+
+/*
+ * globals used by 'result()'
+ */
+#define MAX_REPLIES 16
+static unsigned char reply_buffer[MAX_REPLIES];
+static int inr; /* size of reply buffer, when called from interrupt */
+#define ST0 (reply_buffer[0])
+#define ST1 (reply_buffer[1])
+#define ST2 (reply_buffer[2])
+#define ST3 (reply_buffer[0]) /* result of GETSTATUS */
+#define R_TRACK (reply_buffer[3])
+#define R_HEAD (reply_buffer[4])
+#define R_SECTOR (reply_buffer[5])
+#define R_SIZECODE (reply_buffer[6])
+
+#define SEL_DLY (2*HZ/100)
+
+/*
+ * this struct defines the different floppy drive types.
+ */
+static struct {
+	struct floppy_drive_params params;
+	const char *name; /* name printed while booting */
+} default_drive_params[]= {
+/* NOTE: the time values in jiffies should be in msec!
+ CMOS drive type
+  |     Maximum data rate supported by drive type
+  |     |   Head load time, msec
+  |     |   |   Head unload time, msec (not used)
+  |     |   |   |     Step rate interval, usec
+  |     |   |   |     |       Time needed for spinup time (jiffies)
+  |     |   |   |     |       |      Timeout for spinning down (jiffies)
+  |     |   |   |     |       |      |   Spindown offset (where disk stops)
+  |     |   |   |     |       |      |   |     Select delay
+  |     |   |   |     |       |      |   |     |     RPS
+  |     |   |   |     |       |      |   |     |     |    Max number of tracks
+  |     |   |   |     |       |      |   |     |     |    |     Interrupt timeout
+  |     |   |   |     |       |      |   |     |     |    |     |   Max nonintlv. sectors
+  |     |   |   |     |       |      |   |     |     |    |     |   | -Max Errors- flags */
+{{0,  500, 16, 16, 8000,    1*HZ, 3*HZ,  0, SEL_DLY, 5,  80, 3*HZ, 20, {3,1,2,0,2}, 0,
+      0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
+
+{{1,  300, 16, 16, 8000,    1*HZ, 3*HZ,  0, SEL_DLY, 5,  40, 3*HZ, 17, {3,1,2,0,2}, 0,
+      0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" }, /*5 1/4 360 KB PC*/
+
+{{2,  500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6,  83, 3*HZ, 17, {3,1,2,0,2}, 0,
+      0, { 2, 6, 4, 0, 0, 0, 0, 0}, 3*HZ/2, 2 }, "1.2M" }, /*5 1/4 HD AT*/
+
+{{3,  250, 16, 16, 3000,    1*HZ, 3*HZ,  0, SEL_DLY, 5,  83, 3*HZ, 20, {3,1,2,0,2}, 0,
+      0, { 4, 6, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 4 }, "720k" }, /*3 1/2 DD*/
+
+{{4,  500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5,  83, 3*HZ, 20, {3,1,2,0,2}, 0,
+      0, { 7,10, 2, 4, 6, 0, 0, 0}, 3*HZ/2, 7 }, "1.44M" }, /*3 1/2 HD*/
+
+{{5, 1000, 15,  8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5,  83, 3*HZ, 40, {3,1,2,0,2}, 0,
+      0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" }, /*3 1/2 ED*/
+
+{{6, 1000, 15,  8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5,  83, 3*HZ, 40, {3,1,2,0,2}, 0,
+      0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" } /*3 1/2 ED*/
+/*    |  --autodetected formats---    |      |      |
+ *    read_track                      |      |    Name printed when booting
+ *				      |     Native format
+ *	            Frequency of disk change checks */
+};
+
+static struct floppy_drive_params drive_params[N_DRIVE];
+static struct floppy_drive_struct drive_state[N_DRIVE];
+static struct floppy_write_errors write_errors[N_DRIVE];
+static struct timer_list motor_off_timer[N_DRIVE];
+static struct gendisk *disks[N_DRIVE];
+static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
+
+/*
+ * This struct defines the different floppy types.
+ *
+ * Bit 0 of 'stretch' tells if the tracks need to be doubled for some
+ * types (e.g. 360kB diskette in 1.2MB drive, etc.).  Bit 1 of 'stretch'
+ * tells if the disk is in Commodore 1581 format, which means side 0 sectors
+ * are located on side 1 of the disk but with a side 0 ID, and vice-versa.
+ * This is the same as the Sharp MZ-80 5.25" CP/M disk format, except that the
+ * 1581's logical side 0 is on physical side 1, whereas the Sharp's logical
+ * side 0 is on physical side 0 (but with the misnamed sector IDs).
+ * 'stretch' should probably be renamed to something more general, like
+ * 'options'.  Other parameters should be self-explanatory (see also
+ * setfdprm(8)).
+ */
+/*
+	    Size
+	     |  Sectors per track
+	     |  | Head
+	     |  | |  Tracks
+	     |  | |  | Stretch
+	     |  | |  | |  Gap 1 size
+	     |  | |  | |    |  Data rate, | 0x40 for perp
+	     |  | |  | |    |    |  Spec1 (stepping rate, head unload
+	     |  | |  | |    |    |    |    /fmt gap (gap2) */
+static struct floppy_struct floppy_type[32] = {
+	{    0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL    },	/*  0 no testing    */
+#if 0
+	{  720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360"  }, /*  1 360KB PC      */
+#else
+	{ 2464,16,2,77,0,0x35,0x48,0xDF,0x74,"d360"  }, /*  1 1.25MB 98     */
+#endif
+	{ 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" },	/*  2 1.2MB AT      */
+	{  720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360"  },	/*  3 360KB SS 3.5" */
+	{ 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720"  },	/*  4 720KB 3.5"    */
+	{  720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360"  },	/*  5 360KB AT      */
+	{ 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720"  },	/*  6 720KB AT      */
+	{ 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" },	/*  7 1.44MB 3.5"   */
+	{ 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" },	/*  8 2.88MB 3.5"   */
+	{ 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" },	/*  9 3.12MB 3.5"   */
+
+	{ 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" }, /* 10 1.44MB 5.25"  */
+	{ 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" }, /* 11 1.68MB 3.5"   */
+	{  820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410"  },	/* 12 410KB 5.25"   */
+	{ 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820"  },	/* 13 820KB 3.5"    */
+	{ 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" },	/* 14 1.48MB 5.25"  */
+	{ 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" },	/* 15 1.72MB 3.5"   */
+	{  840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420"  },	/* 16 420KB 5.25"   */
+	{ 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830"  },	/* 17 830KB 3.5"    */
+	{ 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" },	/* 18 1.49MB 5.25"  */
+	{ 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" }, /* 19 1.74 MB 3.5"  */
+
+	{ 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880"  }, /* 20 880KB 5.25"   */
+	{ 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" }, /* 21 1.04MB 3.5"   */
+	{ 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" }, /* 22 1.12MB 3.5"   */
+	{ 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" }, /* 23 1.6MB 5.25"   */
+	{ 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" }, /* 24 1.76MB 3.5"   */
+	{ 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" }, /* 25 1.92MB 3.5"   */
+	{ 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" }, /* 26 3.20MB 3.5"   */
+	{ 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" }, /* 27 3.52MB 3.5"   */
+	{ 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" }, /* 28 3.84MB 3.5"   */
+
+	{ 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" }, /* 29 1.84MB 3.5"   */
+	{ 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800"  },	/* 30 800KB 3.5"    */
+	{ 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" }, /* 31 1.6MB 3.5"    */
+};
+
+#define	NUMBER(x)	(sizeof(x) / sizeof(*(x)))
+#define SECTSIZE (_FD_SECTSIZE(*floppy))
+
+/* Auto-detection: Disk type used until the next media change occurs. */
+static struct floppy_struct *current_type[N_DRIVE];
+
+/*
+ * User-provided type information. current_type points to
+ * the respective entry of this array.
+ */
+static struct floppy_struct user_params[N_DRIVE];
+
+static sector_t floppy_sizes[256];
+
+/*
+ * The driver is trying to determine the correct media format
+ * while probing is set. rw_interrupt() clears it after a
+ * successful access.
+ */
+static int probing;
+
+/* Synchronization of FDC access. */
+#define FD_COMMAND_NONE -1
+#define FD_COMMAND_ERROR 2
+#define FD_COMMAND_OKAY 3
+
+static volatile int command_status = FD_COMMAND_NONE;
+static unsigned long fdc_busy;
+static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
+static DECLARE_WAIT_QUEUE_HEAD(command_done);
+
+#define NO_SIGNAL (!interruptible || !signal_pending(current))
+#define CALL(x) if ((x) == -EINTR) return -EINTR
+#define ECALL(x) if ((ret = (x))) return ret;
+#define _WAIT(x,i) CALL(ret=wait_til_done((x),i))
+#define WAIT(x) _WAIT((x),interruptible)
+#define IWAIT(x) _WAIT((x),1)
+
+/* Errors during formatting are counted here. */
+static int format_errors;
+
+/* Format request descriptor. */
+static struct format_descr format_req;
+
+/*
+ * Rate is 0 for 500kb/s, 1 for 300kbps, 2 for 250kbps
+ * Spec1 is 0xSH, where S is stepping rate (F=1ms, E=2ms, D=3ms etc),
+ * H is head unload time (1=16ms, 2=32ms, etc)
+ */
+
+/*
+ * Track buffer
+ * Because these are written to by the DMA controller, they must
+ * not contain a 64k byte boundary crossing, or data will be
+ * corrupted/lost.
+ */
+static char *floppy_track_buffer;
+static int max_buffer_sectors;
+
+static int *errors;
+typedef void (*done_f)(int);
+static struct cont_t {
+	void (*interrupt)(void); /* this is called after the interrupt of the
+				  * main command */
+	void (*redo)(void); /* this is called to retry the operation */
+	void (*error)(void); /* this is called to tally an error */
+	done_f done; /* this is called to say if the operation has 
+		      * succeeded/failed */
+} *cont;
+
+static void floppy_ready(void);
+static void floppy_start(void);
+static void process_fd_request(void);
+static void recalibrate_floppy(void);
+static void floppy_shutdown(unsigned long);
+
+static int floppy_grab_irq_and_dma(void);
+static void floppy_release_irq_and_dma(void);
+
+/*
+ * The "reset" variable should be tested whenever an interrupt is scheduled,
+ * after the commands have been sent. This is to ensure that the driver doesn't
+ * get wedged when the interrupt doesn't come because of a failed command.
+ * reset doesn't need to be tested before sending commands, because
+ * output_byte is automatically disabled when reset is set.
+ */
+#define CHECK_RESET { if (FDCS->reset){ reset_fdc(); return; } }
+static void reset_fdc(void);
+
+/*
+ * These are global variables, as that's the easiest way to give
+ * information to interrupts. They are the data used for the current
+ * request.
+ */
+#define NO_TRACK -1
+#define NEED_1_RECAL -2
+#define NEED_2_RECAL -3
+
+static int usage_count;
+
+/* buffer related variables */
+static int buffer_track = -1;
+static int buffer_drive = -1;
+static int buffer_min = -1;
+static int buffer_max = -1;
+
+/* fdc related variables, should end up in a struct */
+static struct floppy_fdc_state fdc_state[N_FDC];
+static int fdc; /* current fdc */
+
+static struct floppy_struct *_floppy = floppy_type;
+static unsigned char current_drive;
+static long current_count_sectors;
+static unsigned char fsector_t; /* sector in track */
+static unsigned char in_sector_offset;	/* offset within physical sector,
+					 * expressed in units of 512 bytes */
+
+#ifndef fd_eject
+static inline int fd_eject(int drive)
+{
+	return -EINVAL;
+}
+#endif
+
+#ifdef DEBUGT
+static long unsigned debugtimer;
+#endif
+
+/*
+ * Debugging
+ * =========
+ */
+static inline void set_debugt(void)
+{
+#ifdef DEBUGT
+	debugtimer = jiffies;
+#endif
+}
+
+static inline void debugt(const char *message)
+{
+#ifdef DEBUGT
+	if (DP->flags & DEBUGT)
+		printk("%s dtime=%lu\n", message, jiffies-debugtimer);
+#endif
+}
+
+typedef void (*timeout_fn)(unsigned long);
+static struct timer_list fd_timeout = TIMER_INITIALIZER(floppy_shutdown, 0, 0);
+
+static const char *timeout_message;
+
+#ifdef FLOPPY_SANITY_CHECK
+static void is_alive(const char *message)
+{
+	/* this routine checks whether the floppy driver is "alive" */
+	if (fdc_busy && command_status < 2 && !timer_pending(&fd_timeout)){
+		DPRINT("timeout handler died: %s\n",message);
+	}
+}
+#endif
+
+static void (*do_floppy)(void) = NULL;
+
+#ifdef FLOPPY_SANITY_CHECK
+
+#define OLOGSIZE 20
+
+static void (*lasthandler)(void);
+static unsigned long interruptjiffies;
+static unsigned long resultjiffies;
+static int resultsize;
+static unsigned long lastredo;
+
+static struct output_log {
+	unsigned char data;
+	unsigned char status;
+	unsigned long jiffies;
+} output_log[OLOGSIZE];
+
+static int output_log_pos;
+#endif
+
+#define current_reqD -1
+#define MAXTIMEOUT -2
+
+static void reschedule_timeout(int drive, const char *message, int marg)
+{
+	if (drive == current_reqD)
+		drive = current_drive;
+	del_timer(&fd_timeout);
+	if (drive < 0 || drive > N_DRIVE) {
+		fd_timeout.expires = jiffies + 20UL*HZ;
+		drive=0;
+	} else
+		fd_timeout.expires = jiffies + UDP->timeout;
+	add_timer(&fd_timeout);
+	if (UDP->flags & FD_DEBUG){
+		DPRINT("reschedule timeout ");
+		printk(message, marg);
+		printk("\n");
+	}
+	timeout_message = message;
+}
+
+static int maximum(int a, int b)
+{
+	if (a > b)
+		return a;
+	else
+		return b;
+}
+#define INFBOUND(a,b) (a)=maximum((a),(b));
+
+static int minimum(int a, int b)
+{
+	if (a < b)
+		return a;
+	else
+		return b;
+}
+#define SUPBOUND(a,b) (a)=minimum((a),(b));
+
+
+/*
+ * Bottom half floppy driver.
+ * ==========================
+ *
+ * This part of the file contains the code talking directly to the hardware,
+ * and also the main service loop (seek-configure-spinup-command)
+ */
+
+/*
+ * disk change.
+ * This routine is responsible for maintaining the FD_DISK_CHANGE flag,
+ * and the last_checked date.
+ *
+ * last_checked is the date of the last check which showed 'no disk change'
+ * FD_DISK_CHANGE is set under two conditions:
+ * 1. The floppy has been changed after some i/o to that floppy already
+ *    took place.
+ * 2. No floppy disk is in the drive. This is done in order to ensure that
+ *    requests are quickly flushed in case there is no disk in the drive. It
+ *    follows that FD_DISK_CHANGE can only be cleared if there is a disk in
+ *    the drive.
+ *
+ * For 1., maxblock is observed. Maxblock is 0 if no i/o has taken place yet.
+ * For 2., FD_DISK_NEWCHANGE is watched. FD_DISK_NEWCHANGE is cleared on
+ *  each seek. If a disk is present, the disk change line should also be
+ *  cleared on each seek. Thus, if FD_DISK_NEWCHANGE is clear, but the disk
+ *  change line is set, this means either that no disk is in the drive, or
+ *  that it has been removed since the last seek.
+ *
+ * This means that we really have a third possibility too:
+ *  The floppy has been changed after the last seek.
+ */
+
+static int disk_change(int drive)
+{
+	return UTESTF(FD_DISK_CHANGED);
+}
+
+static int set_mode(char mask, char data)
+{
+	register unsigned char newdor, olddor;
+
+	olddor = FDCS->dor;
+	newdor = (olddor & mask) | data;
+	if (newdor != olddor) {
+		FDCS->dor = newdor;
+		fd_outb(newdor, FD_MODE);
+	}
+
+	if (newdor & FLOPPY98_MOTOR_MASK)
+		floppy_grab_irq_and_dma();
+
+	if (olddor & FLOPPY98_MOTOR_MASK)
+		floppy_release_irq_and_dma();
+
+	return olddor;
+}
+
+static void twaddle(void)
+{
+	if (DP->select_delay)
+		return;
+
+	fd_outb(FDCS->dor & 0xf7, FD_MODE);
+	fd_outb(FDCS->dor, FD_MODE);
+	DRS->select_date = jiffies;
+}
+
+/* reset all driver information about the current fdc. This is needed after
+ * a reset, and after a raw command. */
+static void reset_fdc_info(int mode)
+{
+	int drive;
+
+	FDCS->spec1 = FDCS->spec2 = -1;
+	FDCS->need_configure = 1;
+	FDCS->perp_mode = 1;
+	FDCS->rawcmd = 0;
+	for (drive = 0; drive < N_DRIVE; drive++)
+		if (FDC(drive) == fdc &&
+		    (mode || UDRS->track != NEED_1_RECAL))
+			UDRS->track = NEED_2_RECAL;
+}
+
+/* selects the fdc and drive, and enables the fdc's input/dma. */
+static void set_fdc(int drive)
+{
+	fdc = 0;
+	current_drive = drive;
+	set_mode(~0, 0x10);
+	if (FDCS->rawcmd == 2)
+		reset_fdc_info(1);
+
+	if (fd_inb(FD98_STATUS) != STATUS_READY)
+		FDCS->reset = 1;
+}
+
+/* locks the driver */
+static int _lock_fdc(int drive, int interruptible, int line)
+{
+	if (!usage_count){
+		printk(KERN_ERR "Trying to lock fdc while usage count=0 at line %d\n", line);
+		return -1;
+	}
+	if(floppy_grab_irq_and_dma()==-1)
+		return -EBUSY;
+
+	if (test_and_set_bit(0, &fdc_busy)) {
+		DECLARE_WAITQUEUE(wait, current);
+		add_wait_queue(&fdc_wait, &wait);
+
+		for (;;) {
+			set_current_state(TASK_INTERRUPTIBLE);
+
+			if (!test_and_set_bit(0, &fdc_busy))
+				break;
+
+			schedule();
+
+			if (!NO_SIGNAL) {
+				remove_wait_queue(&fdc_wait, &wait);
+				return -EINTR;
+			}
+		}
+
+		set_current_state(TASK_RUNNING);
+		remove_wait_queue(&fdc_wait, &wait);
+	}
+	command_status = FD_COMMAND_NONE;
+
+	reschedule_timeout(drive, "lock fdc", 0);
+	set_fdc(drive);
+	return 0;
+}
+
+#define lock_fdc(drive,interruptible) _lock_fdc(drive,interruptible, __LINE__)
+
+#define LOCK_FDC(drive,interruptible) \
+if (lock_fdc(drive,interruptible)) return -EINTR;
+
+
+/* unlocks the driver */
+static inline void unlock_fdc(void)
+{
+	raw_cmd = 0;
+	if (!fdc_busy)
+		DPRINT("FDC access conflict!\n");
+
+	if (do_floppy)
+		DPRINT("device interrupt still active at FDC release: %p!\n",
+			do_floppy);
+	command_status = FD_COMMAND_NONE;
+	del_timer(&fd_timeout);
+	cont = NULL;
+	clear_bit(0, &fdc_busy);
+	floppy_release_irq_and_dma();
+	wake_up(&fdc_wait);
+}
+
+#ifndef CONFIG_PC9800_MOTOR_OFF /* tomita */
+
+/* switches the motor off after a given timeout */
+static void motor_off_callback(unsigned long nr)
+{
+	printk(KERN_DEBUG "fdc%lu: turn off motor\n", nr);
+}
+
+/* schedules motor off */
+static void floppy_off(unsigned int drive)
+{
+}
+
+#else /* CONFIG_PC9800_MOTOR_OFF */
+
+/* switches the motor off after a given timeout */
+static void motor_off_callback(unsigned long fdc)
+{
+	printk(KERN_DEBUG "fdc%u: turn off motor\n", (unsigned int) fdc);
+
+	fd_outb(0, FD_MODE);	/* MTON = 0 */
+}
+
+static struct timer_list motor_off_timer[N_FDC] = {
+	{ data: 0, function: motor_off_callback },
+#if N_FDC > 1
+	{ data: 1, function: motor_off_callback },
+#endif
+#if N_FDC > 2
+# error "N_FDC > 2; please fix initializer for motor_off_timer[]"
+#endif
+};
+
+/* schedules motor off */
+static void floppy_off(unsigned int drive)
+{
+	unsigned long volatile delta;
+	register int fdc = FDC(drive);
+
+	if (!(FDCS->dor & (0x10 << UNIT(drive))))
+		return;
+
+	del_timer(motor_off_timer + fdc);
+
+#if 0
+	/* make spindle stop in a position which minimizes spinup time
+	 * next time */
+	if (UDP->rps){
+		delta = jiffies - UDRS->first_read_date + HZ -
+			UDP->spindown_offset;
+		delta = ((delta * UDP->rps) % HZ) / UDP->rps;
+		motor_off_timer[drive].expires = jiffies + UDP->spindown - delta;
+	}
+#else
+	if (UDP->rps)
+		motor_off_timer[drive].expires = jiffies + UDP->spindown;
+#endif
+
+	add_timer(motor_off_timer + fdc);
+}
+
+#endif /* CONFIG_PC9800_MOTOR_OFF */
+
+/*
+ * cycle through all N_DRIVE floppy drives, for disk change testing.
+ * stopping at current drive. This is done before any long operation, to
+ * be sure to have up to date disk change information.
+ */
+static void scandrives(void)
+{
+	int i, drive, saved_drive;
+
+	if (DP->select_delay)
+		return;
+
+	saved_drive = current_drive;
+	for (i=0; i < N_DRIVE; i++){
+		drive = (saved_drive + i + 1) % N_DRIVE;
+		if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
+			continue; /* skip closed drives */
+		set_fdc(drive);
+	}
+	set_fdc(saved_drive);
+}
+
+static void empty(void)
+{
+}
+
+static DECLARE_WORK(floppy_work, NULL, NULL);
+
+static void schedule_bh( void (*handler)(void*) )
+{
+	PREPARE_WORK(&floppy_work, handler, NULL);
+	schedule_work(&floppy_work);
+}
+
+static struct timer_list fd_timer = TIMER_INITIALIZER(NULL, 0, 0);
+
+static void cancel_activity(void)
+{
+	do_floppy = NULL;
+	PREPARE_WORK(&floppy_work, (void*)(void*)empty, NULL);
+	del_timer(&fd_timer);
+}
+
+/* this function makes sure that the disk stays in the drive during the
+ * transfer */
+static void fd_watchdog(void)
+{
+#ifdef DCL_DEBUG
+	if (DP->flags & FD_DEBUG){
+		DPRINT("calling disk change from watchdog\n");
+	}
+#endif
+
+	if (disk_change(current_drive)){
+		DPRINT("disk removed during i/o\n");
+		cancel_activity();
+		cont->done(0);
+		reset_fdc();
+	} else {
+		del_timer(&fd_timer);
+		fd_timer.function = (timeout_fn) fd_watchdog;
+		fd_timer.expires = jiffies + HZ / 10;
+		add_timer(&fd_timer);
+	}
+}
+
+static void main_command_interrupt(void)
+{
+	del_timer(&fd_timer);
+	cont->interrupt();
+}
+
+/* waits for a delay (spinup or select) to pass */
+static int fd_wait_for_completion(unsigned long delay, timeout_fn function)
+{
+	if (FDCS->reset){
+		reset_fdc(); /* do the reset during sleep to win time
+			      * if we don't need to sleep, it's a good
+			      * occasion anyways */
+		return 1;
+	}
+
+	if ((signed) (jiffies - delay) < 0){
+		del_timer(&fd_timer);
+		fd_timer.function = function;
+		fd_timer.expires = delay;
+		add_timer(&fd_timer);
+		return 1;
+	}
+	return 0;
+}
+
+static spinlock_t floppy_hlt_lock = SPIN_LOCK_UNLOCKED;
+static int hlt_disabled;
+static void floppy_disable_hlt(void)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&floppy_hlt_lock, flags);
+	if (!hlt_disabled) {
+		hlt_disabled=1;
+#ifdef HAVE_DISABLE_HLT
+		disable_hlt();
+#endif
+	}
+	spin_unlock_irqrestore(&floppy_hlt_lock, flags);
+}
+
+static void floppy_enable_hlt(void)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&floppy_hlt_lock, flags);
+	if (hlt_disabled){
+		hlt_disabled=0;
+#ifdef HAVE_DISABLE_HLT
+		enable_hlt();
+#endif
+	}
+	spin_unlock_irqrestore(&floppy_hlt_lock, flags);
+}
+
+
+static void setup_DMA(void)
+{
+	unsigned long f;
+
+#ifdef FLOPPY_SANITY_CHECK
+	if (raw_cmd->length == 0){
+		int i;
+
+		printk("zero dma transfer size:");
+		for (i=0; i < raw_cmd->cmd_count; i++)
+			printk("%x,", raw_cmd->cmd[i]);
+		printk("\n");
+		cont->done(0);
+		FDCS->reset = 1;
+		return;
+	}
+	if (((unsigned long) raw_cmd->kernel_data) % 512){
+		printk("non aligned address: %p\n", raw_cmd->kernel_data);
+		cont->done(0);
+		FDCS->reset=1;
+		return;
+	}
+#endif
+	f=claim_dma_lock();
+	fd_disable_dma();
+#ifdef fd_dma_setup
+	if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length, 
+			(raw_cmd->flags & FD_RAW_READ)?
+			DMA_MODE_READ : DMA_MODE_WRITE,
+			FDCS->address) < 0) {
+		release_dma_lock(f);
+		cont->done(0);
+		FDCS->reset=1;
+		return;
+	}
+	release_dma_lock(f);
+#else	
+	fd_clear_dma_ff();
+	fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
+	fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ)?
+			DMA_MODE_READ : DMA_MODE_WRITE);
+	fd_set_dma_addr(raw_cmd->kernel_data);
+	fd_set_dma_count(raw_cmd->length);
+	virtual_dma_port = FDCS->address;
+	fd_enable_dma();
+	release_dma_lock(f);
+#endif
+	floppy_disable_hlt();
+}
+
+static void show_floppy(void);
+
+/* waits until the fdc becomes ready */
+
+#ifdef PC9800_DEBUG_FLOPPY
+#define READY_DELAY 10000000
+#else
+#define READY_DELAY 100000
+#endif
+
+static int wait_til_ready(void)
+{
+	int counter, status;
+	if (FDCS->reset)
+		return -1;
+	for (counter = 0; counter < READY_DELAY; counter++) {
+		status = fd_inb(FD98_STATUS);		
+		if (status & STATUS_READY)
+			return status;
+	}
+	if (!initialising) {
+		DPRINT("Getstatus times out (%x) on fdc %d\n",
+			status, fdc);
+		show_floppy();
+	}
+	FDCS->reset = 1;
+	return -1;
+}
+
+/* sends a command byte to the fdc */
+static int output_byte(char byte)
+{
+	int status;
+
+	if ((status = wait_til_ready()) < 0)
+		return -1;
+	if ((status & (STATUS_READY|STATUS_DIR|STATUS_DMA)) == STATUS_READY){
+		fd_outb(byte,FD98_DATA);
+#ifdef FLOPPY_SANITY_CHECK
+		output_log[output_log_pos].data = byte;
+		output_log[output_log_pos].status = status;
+		output_log[output_log_pos].jiffies = jiffies;
+		output_log_pos = (output_log_pos + 1) % OLOGSIZE;
+#endif
+		return 0;
+	}
+	FDCS->reset = 1;
+	if (!initialising) {
+		DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
+		       byte, fdc, status);
+		show_floppy();
+	}
+	return -1;
+}
+#define LAST_OUT(x) if (output_byte(x)<0){ reset_fdc();return;}
+
+/* gets the response from the fdc */
+static int result(void)
+{
+	int i, status=0;
+
+	for(i=0; i < MAX_REPLIES; i++) {
+		if ((status = wait_til_ready()) < 0)
+			break;
+		status &= STATUS_DIR|STATUS_READY|STATUS_BUSY|STATUS_DMA;
+		if ((status & ~STATUS_BUSY) == STATUS_READY){
+#ifdef FLOPPY_SANITY_CHECK
+			resultjiffies = jiffies;
+			resultsize = i;
+#endif
+			return i;
+		}
+		if (status == (STATUS_DIR|STATUS_READY|STATUS_BUSY))
+			reply_buffer[i] = fd_inb(FD98_DATA);
+		else
+			break;
+	}
+	if (!initialising) {
+		DPRINT("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
+		       fdc, status, i);
+		show_floppy();
+	}
+	FDCS->reset = 1;
+	return -1;
+}
+
+static int fifo_depth = 0xa;
+static int no_fifo;
+
+#define NOMINAL_DTR 500
+
+/* Issue a "SPECIFY" command to set the step rate time, head unload time,
+ * head load time, and DMA disable flag to values needed by floppy.
+ *
+ * The value "dtr" is the data transfer rate in Kbps.  It is needed
+ * to account for the data rate-based scaling done by the 82072 and 82077
+ * FDC types.  This parameter is ignored for other types of FDCs (i.e.
+ * 8272a).
+ *
+ * Note that changing the data transfer rate has a (probably deleterious)
+ * effect on the parameters subject to scaling for 82072/82077 FDCs, so
+ * fdc_specify is called again after each data transfer rate
+ * change.
+ *
+ * srt: 1000 to 16000 in microseconds
+ * hut: 16 to 240 milliseconds
+ * hlt: 2 to 254 milliseconds
+ *
+ * These values are rounded up to the next highest available delay time.
+ */
+static void fdc_specify(void)
+{
+	output_byte(FD_SPECIFY);
+	output_byte(FDCS->spec1 = 0xdf);
+	output_byte(FDCS->spec2 = 0x24);
+}
+
+static void tell_sector(void)
+{
+	printk(": track %d, head %d, sector %d, size %d",
+	       R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
+} /* tell_sector */
+
+static int auto_detect_mode_pc9800(void)
+{
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("auto_detect_mode_pc9800: retry_auto_detect=%d\n",
+		retry_auto_detect);
+#endif
+	if (retry_auto_detect > 4) {
+		retry_auto_detect = 0;	   
+		return 1;
+	}
+
+	switch ((int)(_floppy - floppy_type)) {
+		case 2:
+			_floppy = floppy_type + 4;
+			break;
+
+		case 4:
+		case 6:
+			_floppy = floppy_type + 7;
+			break;
+
+		case 7:
+		case 10:
+			_floppy = floppy_type + 2;
+			break;
+
+		default:
+			_floppy = floppy_type + 7;
+	}
+
+	retry_auto_detect++;
+	return 0;
+}
+
+static void access_mode_change_pc9800(void);
+
+/*
+ * OK, this error interpreting routine is called after a
+ * DMA read/write has succeeded
+ * or failed, so we check the results, and copy any buffers.
+ * hhb: Added better error reporting.
+ * ak: Made this into a separate routine.
+ */
+static int interpret_errors(void)
+{
+	char bad;
+
+	if (inr!=7) {
+		DPRINT("-- FDC reply error");
+		FDCS->reset = 1;
+		return 1;
+	}
+
+	/* check IC to find cause of interrupt */
+	switch (ST0 & ST0_INTR) {
+		case 0x40:	/* error occurred during command execution */
+			if (ST1 & ST1_EOC)
+				return 0; /* occurs with pseudo-DMA */
+			bad = 1;
+			if (ST1 & ST1_WP) {
+				DPRINT("Drive is write protected\n");
+				CLEARF(FD_DISK_WRITABLE);
+				cont->done(0);
+				bad = 2;
+			} else if (ST1 & ST1_ND) {
+				SETF(FD_NEED_TWADDLE);
+			} else if (ST1 & ST1_OR) {
+				if (DP->flags & FTD_MSG)
+					DPRINT("Over/Underrun - retrying\n");
+				bad = 0;
+			}else if (*errors >= DP->max_errors.reporting){
+				if (ST0 & ST0_ECE) {
+					printk("Recalibrate failed!");
+				} else if (ST2 & ST2_CRC) {
+					printk("data CRC error");
+					tell_sector();
+				} else if (ST1 & ST1_CRC) {
+					printk("CRC error");
+					tell_sector();
+				} else if ((ST1 & (ST1_MAM|ST1_ND)) || (ST2 & ST2_MAM)) {
+					if (auto_detect_mode) {
+						bad = (char)auto_detect_mode_pc9800();
+						access_mode_change_pc9800();
+					}
+
+					if (bad) {
+						printk("floppy error: MA: _floppy - floppy_type=%d\n", (int)(_floppy - floppy_type));
+						printk("bad=%d\n", (int)bad);
+						if (!probing) {
+							printk("sector not found");
+							tell_sector();
+						} else
+							printk("probe failed...");
+					}
+				} else if (ST2 & ST2_WC) {	/* seek error */
+					printk("wrong cylinder");
+				} else if (ST2 & ST2_BC) {	/* cylinder marked as bad */
+					printk("bad cylinder");
+				} else {
+					printk("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x", ST0, ST1, ST2);
+					tell_sector();
+				}
+				printk("\n");
+
+			}
+			if (ST2 & ST2_WC || ST2 & ST2_BC)
+				/* wrong cylinder => recal */
+				DRS->track = NEED_2_RECAL;
+			return bad;
+		case 0x80: /* invalid command given */
+			DPRINT("Invalid FDC command given!\n");
+			cont->done(0);
+			return 2;
+		case 0xc0:
+			SETF(FD_DISK_CHANGED);
+			SETF(FD_DISK_WRITABLE);
+			DPRINT("Abnormal termination caused by polling\n");
+			cont->error();
+			return 2;
+		default: /* (0) Normal command termination */
+			auto_detect_mode = 0;
+			return 0;
+	}
+}
+
+/*
+ * This routine is called when everything should be correctly set up
+ * for the transfer (i.e. floppy motor is on, the correct floppy is
+ * selected, and the head is sitting on the right track).
+ */
+static void setup_rw_floppy(void)
+{
+	int i,r, flags,dflags;
+	unsigned long ready_date;
+	timeout_fn function;
+
+	access_mode_change_pc9800();
+	flags = raw_cmd->flags;
+	if (flags & (FD_RAW_READ | FD_RAW_WRITE))
+		flags |= FD_RAW_INTR;
+
+	if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)){
+		ready_date = DRS->spinup_date + DP->spinup;
+		/* If spinup will take a long time, rerun scandrives
+		 * again just before spinup completion. Beware that
+		 * after scandrives, we must again wait for selection.
+		 */
+		if ((signed) (ready_date - jiffies) > DP->select_delay){
+			ready_date -= DP->select_delay;
+			function = (timeout_fn) floppy_start;
+		} else
+			function = (timeout_fn) setup_rw_floppy;
+
+		/* wait until the floppy is spinning fast enough */
+		if (fd_wait_for_completion(ready_date,function))
+			return;
+	}
+	dflags = DRS->flags;
+
+	if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
+		setup_DMA();
+
+	if (flags & FD_RAW_INTR)
+		do_floppy = main_command_interrupt;
+
+	r=0;
+	for (i=0; i< raw_cmd->cmd_count; i++)
+		r|=output_byte(raw_cmd->cmd[i]);
+
+#ifdef DEBUGT
+	debugt("rw_command: ");
+#endif
+	if (r){
+		cont->error();
+		reset_fdc();
+		return;
+	}
+
+	if (!(flags & FD_RAW_INTR)){
+		inr = result();
+		cont->interrupt();
+	} else if (flags & FD_RAW_NEED_DISK)
+		fd_watchdog();
+}
+
+static int blind_seek;
+
+/*
+ * This is the routine called after every seek (or recalibrate) interrupt
+ * from the floppy controller.
+ */
+static void seek_interrupt(void)
+{
+#ifdef DEBUGT
+	debugt("seek interrupt:");
+#endif
+	if (inr != 2 || (ST0 & 0xF8) != 0x20) {
+		DRS->track = NEED_2_RECAL;
+		cont->error();
+		cont->redo();
+		return;
+	}
+	if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek){
+#ifdef DCL_DEBUG
+		if (DP->flags & FD_DEBUG){
+			DPRINT("clearing NEWCHANGE flag because of effective seek\n");
+			DPRINT("jiffies=%lu\n", jiffies);
+		}
+#endif
+		CLEARF(FD_DISK_NEWCHANGE); /* effective seek */
+		CLEARF(FD_DISK_CHANGED); /* effective seek */
+		DRS->select_date = jiffies;
+	}
+	DRS->track = ST1;
+	floppy_ready();
+}
+
+static void check_wp(void)
+{
+	if (TESTF(FD_VERIFY)) {
+		/* check write protection */
+		output_byte(FD_GETSTATUS);
+		output_byte(UNIT(current_drive));
+		if (result() != 1){
+			FDCS->reset = 1;
+			return;
+		}
+		CLEARF(FD_VERIFY);
+		CLEARF(FD_NEED_TWADDLE);
+#ifdef DCL_DEBUG
+		if (DP->flags & FD_DEBUG){
+			DPRINT("checking whether disk is write protected\n");
+			DPRINT("wp=%x\n",ST3 & 0x40);
+		}
+#endif
+		if (!(ST3  & 0x40))
+			SETF(FD_DISK_WRITABLE);
+		else
+			CLEARF(FD_DISK_WRITABLE);
+	}
+}
+
+static void seek_floppy(void)
+{
+	int track;
+
+	blind_seek=0;
+
+#ifdef DCL_DEBUG
+	if (DP->flags & FD_DEBUG){
+		DPRINT("calling disk change from seek\n");
+	}
+#endif
+
+	if (!TESTF(FD_DISK_NEWCHANGE) &&
+	    disk_change(current_drive) &&
+	    (raw_cmd->flags & FD_RAW_NEED_DISK)){
+		/* the media changed flag should be cleared after the seek.
+		 * If it isn't, this means that there is really no disk in
+		 * the drive.
+		 */
+		SETF(FD_DISK_CHANGED);
+		cont->done(0);
+		cont->redo();
+		return;
+	}
+	if (DRS->track <= NEED_1_RECAL){
+		recalibrate_floppy();
+		return;
+	} else if (TESTF(FD_DISK_NEWCHANGE) &&
+		   (raw_cmd->flags & FD_RAW_NEED_DISK) &&
+		   (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
+		/* we seek to clear the media-changed condition. Does anybody
+		 * know a more elegant way, which works on all drives? */
+		if (raw_cmd->track)
+			track = raw_cmd->track - 1;
+		else {
+			if (DP->flags & FD_SILENT_DCL_CLEAR){
+				blind_seek = 1;
+				raw_cmd->flags |= FD_RAW_NEED_SEEK;
+			}
+			track = 1;
+		}
+	} else {
+		check_wp();
+		if (raw_cmd->track != DRS->track &&
+		    (raw_cmd->flags & FD_RAW_NEED_SEEK))
+			track = raw_cmd->track;
+		else {
+			setup_rw_floppy();
+			return;
+		}
+	}
+
+	do_floppy = seek_interrupt;
+	output_byte(FD_SEEK);
+	output_byte(UNIT(current_drive));
+	LAST_OUT(track);
+#ifdef DEBUGT
+	debugt("seek command:");
+#endif
+}
+
+static void recal_interrupt(void)
+{
+#ifdef DEBUGT
+	debugt("recal interrupt:");
+#endif
+	if (inr !=2)
+		FDCS->reset = 1;
+	else if (ST0 & ST0_ECE) {
+	       	switch(DRS->track){
+			case NEED_1_RECAL:
+#ifdef DEBUGT
+				debugt("recal interrupt need 1 recal:");
+#endif
+				/* after a second recalibrate, we still haven't
+				 * reached track 0. Probably no drive. Raise an
+				 * error, as failing immediately might upset
+				 * computers possessed by the Devil :-) */
+				cont->error();
+				cont->redo();
+				return;
+			case NEED_2_RECAL:
+#ifdef DEBUGT
+				debugt("recal interrupt need 2 recal:");
+#endif
+				/* If we already did a recalibrate,
+				 * and we are not at track 0, this
+				 * means we have moved. (The only way
+				 * not to move at recalibration is to
+				 * be already at track 0.) Clear the
+				 * new change flag */
+#ifdef DCL_DEBUG
+				if (DP->flags & FD_DEBUG){
+					DPRINT("clearing NEWCHANGE flag because of second recalibrate\n");
+				}
+#endif
+
+				CLEARF(FD_DISK_NEWCHANGE);
+				DRS->select_date = jiffies;
+				/* fall through */
+			default:
+#ifdef DEBUGT
+				debugt("recal interrupt default:");
+#endif
+				/* Recalibrate moves the head by at
+				 * most 80 steps. If after one
+				 * recalibrate we don't have reached
+				 * track 0, this might mean that we
+				 * started beyond track 80.  Try
+				 * again.  */
+				DRS->track = NEED_1_RECAL;
+				break;
+		}
+	} else
+		DRS->track = ST1;
+	floppy_ready();
+}
+
+static void print_result(char *message, int inr)
+{
+	int i;
+
+	DPRINT("%s ", message);
+	if (inr >= 0)
+		for (i=0; i<inr; i++)
+			printk("repl[%d]=%x ", i, reply_buffer[i]);
+	printk("\n");
+}
+
+/* interrupt handler. Note that this can be called externally on the Sparc */
+void floppy_interrupt(int irq, void *dev_id, struct pt_regs * regs)
+{
+	void (*handler)(void) = do_floppy;
+	int do_print;
+	unsigned long f;
+
+	lasthandler = handler;
+	interruptjiffies = jiffies;
+
+	f=claim_dma_lock();
+	fd_disable_dma();
+	release_dma_lock(f);
+
+	floppy_enable_hlt();
+	do_floppy = NULL;
+	if (fdc >= N_FDC || FDCS->address == -1){
+		/* we don't even know which FDC is the culprit */
+		printk("DOR0=%x\n", fdc_state[0].dor);
+		printk("floppy interrupt on bizarre fdc %d\n",fdc);
+		printk("handler=%p\n", handler);
+		is_alive("bizarre fdc");
+		return;
+	}
+
+	FDCS->reset = 0;
+	/* We have to clear the reset flag here, because apparently on boxes
+	 * with level triggered interrupts (PS/2, Sparc, ...), it is needed to
+	 * emit SENSEI's to clear the interrupt line. And FDCS->reset blocks the
+	 * emission of the SENSEI's.
+	 * It is OK to emit floppy commands because we are in an interrupt
+	 * handler here, and thus we have to fear no interference of other
+	 * activity.
+	 */
+
+	do_print = !handler && !initialising;
+
+	inr = result();
+	if (inr && do_print)
+		print_result("unexpected interrupt", inr);
+	if (inr == 0){
+		do {
+			output_byte(FD_SENSEI);
+			inr = result();
+			if ((ST0 & ST0_INTR) == 0xC0) {
+				int drive = ST0 & ST0_DS;
+
+				/* Attention Interrupt. */
+				if (ST0 & ST0_NR) {
+#ifdef PC9800_DEBUG_FLOPPY
+					if (do_print)
+						printk(KERN_DEBUG
+							"floppy debug: floppy ejected (drive %d)\n",
+							drive);
+#endif
+					USETF(FD_DISK_CHANGED);
+					USETF(FD_VERIFY);
+				} else {
+#ifdef PC9800_DEBUG_FLOPPY
+					if (do_print)
+						printk(KERN_DEBUG
+							"floppy debug: floppy inserted (drive %d)\n",
+							drive);
+#endif
+				}
+			} /* Attention Interrupt */
+#ifdef PC9800_DEBUG_FLOPPY
+			else {
+				printk(KERN_DEBUG
+					"floppy debug : unknown interrupt\n");
+			}
+#endif
+		} while ((ST0 & 0x83) != UNIT(current_drive) && inr == 2);
+	}
+	if (handler) {
+		schedule_bh( (void *)(void *) handler);
+	} else {
+#if 0
+		FDCS->reset = 1;
+#endif
+	}
+	is_alive("normal interrupt end");
+}
+
+static void recalibrate_floppy(void)
+{
+#ifdef DEBUGT
+	debugt("recalibrate floppy:");
+#endif
+	do_floppy = recal_interrupt;
+	output_byte(FD_RECALIBRATE);
+	LAST_OUT(UNIT(current_drive));
+}
+
+/*
+ * Must do 4 FD_SENSEIs after reset because of ``drive polling''.
+ */
+static void reset_interrupt(void)
+{
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("floppy debug: reset interrupt\n");
+#endif
+#ifdef DEBUGT
+	debugt("reset interrupt:");
+#endif
+	result();		/* get the status ready for set_fdc */
+	if (FDCS->reset) {
+		printk("reset set in interrupt, calling %p\n", cont->error);
+		cont->error(); /* a reset just after a reset. BAD! */
+	}
+	cont->redo();
+}
+
+/*
+ * reset is done by pulling bit 2 of DOR low for a while (old FDCs),
+ * or by setting the self clearing bit 7 of STATUS (newer FDCs)
+ */
+static void reset_fdc(void)
+{
+	unsigned long flags;
+
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("floppy debug: reset_fdc\n");
+#endif
+
+	do_floppy = reset_interrupt;
+	FDCS->reset = 0;
+	reset_fdc_info(0);
+
+	/* Pseudo-DMA may intercept 'reset finished' interrupt.  */
+	/* Irrelevant for systems with true DMA (i386).          */
+
+	flags=claim_dma_lock();
+	fd_disable_dma();
+	release_dma_lock(flags);
+
+	fd_outb(FDCS->dor | 0x80, FD_MODE);
+	udelay(FD_RESET_DELAY);
+	fd_outb(FDCS->dor, FD_MODE);
+	udelay(FD_AFTER_RESET_DELAY);
+}
+
+static void show_floppy(void)
+{
+	int i;
+
+	printk("\n");
+	printk("floppy driver state\n");
+	printk("-------------------\n");
+	printk("now=%lu last interrupt=%lu diff=%lu last called handler=%p\n",
+	       jiffies, interruptjiffies, jiffies-interruptjiffies, lasthandler);
+
+
+#ifdef FLOPPY_SANITY_CHECK
+	printk("timeout_message=%s\n", timeout_message);
+	printk("last output bytes:\n");
+	for (i=0; i < OLOGSIZE; i++)
+		printk("%2x %2x %lu\n",
+		       output_log[(i+output_log_pos) % OLOGSIZE].data,
+		       output_log[(i+output_log_pos) % OLOGSIZE].status,
+		       output_log[(i+output_log_pos) % OLOGSIZE].jiffies);
+	printk("last result at %lu\n", resultjiffies);
+	printk("last redo_fd_request at %lu\n", lastredo);
+	for (i=0; i<resultsize; i++){
+		printk("%2x ", reply_buffer[i]);
+	}
+	printk("\n");
+#endif
+
+	printk("status=%x\n", fd_inb(FD98_STATUS));
+	printk("fdc_busy=%lu\n", fdc_busy);
+	if (do_floppy)
+		printk("do_floppy=%p\n", do_floppy);
+	if (floppy_work.pending)
+		printk("floppy_work.func=%p\n", floppy_work.func);
+	if (timer_pending(&fd_timer))
+		printk("fd_timer.function=%p\n", fd_timer.function);
+	if (timer_pending(&fd_timeout)){
+		printk("timer_function=%p\n",fd_timeout.function);
+		printk("expires=%lu\n",fd_timeout.expires-jiffies);
+		printk("now=%lu\n",jiffies);
+	}
+	printk("cont=%p\n", cont);
+	printk("current_req=%p\n", current_req);
+	printk("command_status=%d\n", command_status);
+	printk("\n");
+}
+
+static void floppy_shutdown(unsigned long data)
+{
+	unsigned long flags;
+	
+	if (!initialising)
+		show_floppy();
+	cancel_activity();
+
+	floppy_enable_hlt();
+	
+	flags=claim_dma_lock();
+	fd_disable_dma();
+	release_dma_lock(flags);
+	
+	/* avoid dma going to a random drive after shutdown */
+
+	if (!initialising)
+		DPRINT("floppy timeout called\n");
+	FDCS->reset = 1;
+	if (cont){
+		cont->done(0);
+		cont->redo(); /* this will recall reset when needed */
+	} else {
+		printk("no cont in shutdown!\n");
+		process_fd_request();
+	}
+	is_alive("floppy shutdown");
+}
+/*typedef void (*timeout_fn)(unsigned long);*/
+
+static void access_mode_change_pc9800(void)
+{
+	static int access_mode, mode_change_now, old_mode, new_set = 1;
+#ifdef PC9800_DEBUG_FLOPPY2
+	printk("enter access_mode_change\n");
+#endif
+	access_mode = mode_change_now = 0;
+	if (DP->cmos==4) {
+		switch ((int)(_floppy - &floppy_type[0])) {
+		case 1:
+		case 2:
+			new_set = 1;
+			access_mode = 2;
+			break;
+
+		case 4:
+		case 6:
+			new_set = 1;
+			access_mode = 3;
+			break;
+
+		case 7:
+		case 10:
+			new_set = 1;
+			access_mode = 1;
+			break;
+
+		default:
+			access_mode = 1;
+			break;
+		}
+
+		old_mode = fd_inb(FD_MODE_CHANGE) & 3;
+
+		switch (access_mode) {
+		case 1:
+			if ((old_mode & 2) == 0) {
+				fd_outb(old_mode | 2, FD_MODE_CHANGE);
+				mode_change_now = 1;
+			} else {
+				fd_outb(current_drive << 5, FD_EMODE_CHANGE);
+				if (fd_inb(FD_EMODE_CHANGE) == 0xff)
+					return;
+			}
+
+			fd_outb((current_drive << 5) | 0x11, FD_EMODE_CHANGE);
+			mode_change_now = 1;
+			break;
+
+		case 2:
+			if ((old_mode & 2) == 0) {
+				fd_outb(old_mode | 2, FD_MODE_CHANGE);
+				mode_change_now = 1;
+			} else {
+				fd_outb(current_drive << 5, FD_EMODE_CHANGE);
+				if ((fd_inb(FD_EMODE_CHANGE) & 1) == 0)
+					return;
+				fd_outb((current_drive << 5) | 0x10, FD_EMODE_CHANGE);
+				mode_change_now = 1;
+			}
+
+			break;
+
+		case 3:
+			if ((old_mode & 2) == 0)
+				return;
+			fd_outb(current_drive << 5, FD_EMODE_CHANGE);
+			if (fd_inb(FD_EMODE_CHANGE) & 1)
+				fd_outb((current_drive << 5) | 0x10, FD_EMODE_CHANGE);
+			fd_outb(old_mode & 0xfd, FD_MODE_CHANGE);
+			mode_change_now = 1;
+			break;
+
+		default:
+			break;
+		}
+	} else {
+		switch ((int)(_floppy - &floppy_type[0])) {
+		case 1:
+		case 2:
+			new_set = 1;
+			access_mode = 2;
+			break;
+
+		case 4:
+		case 6:
+			new_set = 1;
+			access_mode = 3;
+			break;
+
+		default:
+			switch (DP->cmos) {
+			case 2:
+				access_mode = 2;
+				break;
+
+			case 3:
+				access_mode = 3;
+				break;
+
+			default:
+				break;
+			}
+
+			break;
+		}
+
+		old_mode = fd_inb(FD_MODE_CHANGE) & 3;
+
+		switch (access_mode) {
+		case 2:
+			if ((old_mode & 2) == 0) {
+				fd_outb(old_mode | 2, FD_MODE_CHANGE);
+				mode_change_now = 1;
+			}
+
+			break;
+
+		case 3:
+			if (old_mode & 2) {
+				fd_outb(old_mode & 0xfd, FD_MODE_CHANGE);
+				mode_change_now = 1;
+			}
+
+			break;
+
+		default:
+			break;
+		}
+	}
+#ifdef PC9800_DEBUG_FLOPPY2
+	printk("floppy debug: DP->cmos=%d\n", DP->cmos);
+	printk("floppy debug: mode_change_now=%d\n", mode_change_now);
+	printk("floppy debug: access_mode=%d\n", access_mode);
+	printk("floppy debug: old_mode=%d\n", old_mode);
+	printk("floppy debug: _floppy - &floppy_type[0]=%d\n", (int)(_floppy - &floppy_type[0]));
+#endif /* PC9800_DEBUG_FLOPPY2 */
+	if(mode_change_now)
+		reset_fdc();
+}
+
+/* start motor, check media-changed condition and write protection */
+static int start_motor(void (*function)(void) )
+{
+	access_mode_change_pc9800();
+	set_mode(~0, 0x8);
+
+	/* wait_for_completion also schedules reset if needed. */
+	return(fd_wait_for_completion(DRS->select_date+DP->select_delay,
+				   (timeout_fn) function));
+}
+
+static void floppy_ready(void)
+{
+	CHECK_RESET;
+	if (start_motor(floppy_ready)) return;
+
+#ifdef DCL_DEBUG
+	if (DP->flags & FD_DEBUG){
+		DPRINT("calling disk change from floppy_ready\n");
+	}
+#endif
+	if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
+	   disk_change(current_drive) &&
+	   !DP->select_delay)
+		twaddle(); /* this clears the dcl on certain drive/controller
+			    * combinations */
+
+#ifdef fd_chose_dma_mode
+	if ((raw_cmd->flags & FD_RAW_READ) || 
+	    (raw_cmd->flags & FD_RAW_WRITE))
+	{
+		unsigned long flags = claim_dma_lock();
+		fd_chose_dma_mode(raw_cmd->kernel_data,
+				  raw_cmd->length);
+		release_dma_lock(flags);
+	}
+#endif
+
+#if 0
+	access_mode_change_pc9800();
+#endif
+	if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)){
+		fdc_specify(); /* must be done here because of hut, hlt ... */
+		seek_floppy();
+	} else {
+		if ((raw_cmd->flags & FD_RAW_READ) || 
+		    (raw_cmd->flags & FD_RAW_WRITE))
+			fdc_specify();
+		setup_rw_floppy();
+	}
+}
+
+static void floppy_start(void)
+{
+	reschedule_timeout(current_reqD, "floppy start", 0);
+
+	scandrives();
+#ifdef DCL_DEBUG
+	if (DP->flags & FD_DEBUG){
+		DPRINT("setting NEWCHANGE in floppy_start\n");
+	}
+#endif
+	SETF(FD_DISK_NEWCHANGE);
+	floppy_ready();
+}
+
+/*
+ * ========================================================================
+ * here ends the bottom half. Exported routines are:
+ * floppy_start, floppy_off, floppy_ready, lock_fdc, unlock_fdc, set_fdc,
+ * start_motor, reset_fdc, reset_fdc_info, interpret_errors.
+ * Initialization also uses output_byte, result, set_dor, floppy_interrupt
+ * and set_dor.
+ * ========================================================================
+ */
+/*
+ * General purpose continuations.
+ * ==============================
+ */
+
+static void do_wakeup(void)
+{
+	reschedule_timeout(MAXTIMEOUT, "do wakeup", 0);
+	cont = 0;
+	command_status += 2;
+	wake_up(&command_done);
+}
+
+static struct cont_t wakeup_cont={
+	empty,
+	do_wakeup,
+	empty,
+	(done_f)empty
+};
+
+
+static struct cont_t intr_cont={
+	empty,
+	process_fd_request,
+	empty,
+	(done_f) empty
+};
+
+static int wait_til_done(void (*handler)(void), int interruptible)
+{
+	int ret;
+
+	schedule_bh((void *)(void *)handler);
+
+	if (command_status < 2 && NO_SIGNAL) {
+		DECLARE_WAITQUEUE(wait, current);
+
+		add_wait_queue(&command_done, &wait);
+		for (;;) {
+			set_current_state(interruptible?
+					  TASK_INTERRUPTIBLE:
+					  TASK_UNINTERRUPTIBLE);
+
+			if (command_status >= 2 || !NO_SIGNAL)
+				break;
+
+			is_alive("wait_til_done");
+
+			schedule();
+		}
+
+		set_current_state(TASK_RUNNING);
+		remove_wait_queue(&command_done, &wait);
+	}
+
+	if (command_status < 2){
+		cancel_activity();
+		cont = &intr_cont;
+		reset_fdc();
+		return -EINTR;
+	}
+
+#ifdef PC9800_DEBUG_FLOPPY
+	if (command_status != FD_COMMAND_OKAY)
+		printk("floppy check: wait_til_done out:%d\n", command_status);
+#endif
+	if (FDCS->reset)
+		command_status = FD_COMMAND_ERROR;
+	if (command_status == FD_COMMAND_OKAY)
+		ret=0;
+	else
+		ret=-EIO;
+	command_status = FD_COMMAND_NONE;
+	return ret;
+}
+
+static void generic_done(int result)
+{
+	command_status = result;
+	cont = &wakeup_cont;
+}
+
+static void generic_success(void)
+{
+	cont->done(1);
+}
+
+static void generic_failure(void)
+{
+	cont->done(0);
+}
+
+static void success_and_wakeup(void)
+{
+	generic_success();
+	cont->redo();
+}
+
+
+/*
+ * formatting and rw support.
+ * ==========================
+ */
+
+static int next_valid_format(void)
+{
+	int probed_format;
+
+	probed_format = DRS->probed_format;
+	while(1){
+		if (probed_format >= 8 ||
+		     !DP->autodetect[probed_format]){
+			DRS->probed_format = 0;
+			return 1;
+		}
+		if (floppy_type[DP->autodetect[probed_format]].sect){
+			DRS->probed_format = probed_format;
+			return 0;
+		}
+		probed_format++;
+	}
+}
+
+static void bad_flp_intr(void)
+{
+	if (probing){
+		DRS->probed_format++;
+		if (!next_valid_format())
+			return;
+	}
+	(*errors)++;
+	INFBOUND(DRWE->badness, *errors);
+	if (*errors > DP->max_errors.abort)
+		cont->done(0);
+	if (*errors > DP->max_errors.reset)
+		FDCS->reset = 1;
+	else if (*errors > DP->max_errors.recal)
+		DRS->track = NEED_2_RECAL;
+}
+
+static void set_floppy(int drive)
+{
+	int type = ITYPE(UDRS->fd_device);
+	if (type) {
+		auto_detect_mode = 0;
+		_floppy = floppy_type + type;
+	} else if (auto_detect_mode == 0) {
+		auto_detect_mode = 1;
+		retry_auto_detect = 0;
+		_floppy = current_type[drive];
+	}
+#ifdef PC9800_DEBUG_FLOPPY2
+	printk("set_floppy: set floppy type=%d\n", (int)(_floppy - floppy_type));
+#endif
+}
+
+/*
+ * formatting support.
+ * ===================
+ */
+static void format_interrupt(void)
+{
+	switch (interpret_errors()){
+		case 1:
+			cont->error();
+		case 2:
+			break;
+		case 0:
+			cont->done(1);
+	}
+	cont->redo();
+}
+
+#define CODE2SIZE (ssize = ((1 << SIZECODE) + 3) >> 2)
+#define FM_MODE(x,y) ((y) & ~(((x)->rate & 0x80) >>1))
+#define CT(x) ((x) | 0xc0)
+static void setup_format_params(int track)
+{
+	struct fparm {
+		unsigned char track,head,sect,size;
+	} *here = (struct fparm *)floppy_track_buffer;
+	int il,n;
+	int count,head_shift,track_shift;
+
+	raw_cmd = &default_raw_cmd;
+	raw_cmd->track = track;
+
+	raw_cmd->flags = FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
+		FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
+	raw_cmd->rate = _floppy->rate & 0x43;
+	raw_cmd->cmd_count = NR_F;
+	COMMAND = FM_MODE(_floppy,FD_FORMAT);
+	DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy,format_req.head);
+	F_SIZECODE = FD_SIZECODE(_floppy);
+	F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
+	F_GAP = _floppy->fmt_gap;
+	F_FILL = FD_FILL_BYTE;
+
+	raw_cmd->kernel_data = floppy_track_buffer;
+	raw_cmd->length = 4 * F_SECT_PER_TRACK;
+
+	/* allow for about 30ms for data transport per track */
+	head_shift  = (F_SECT_PER_TRACK + 5) / 6;
+
+	/* a ``cylinder'' is two tracks plus a little stepping time */
+	track_shift = 2 * head_shift + 3;
+
+	/* position of logical sector 1 on this track */
+	n = (track_shift * format_req.track + head_shift * format_req.head)
+		% F_SECT_PER_TRACK;
+
+	/* determine interleave */
+	il = 1;
+	if (_floppy->fmt_gap < 0x22)
+		il++;
+
+	/* initialize field */
+	for (count = 0; count < F_SECT_PER_TRACK; ++count) {
+		here[count].track = format_req.track;
+		here[count].head = format_req.head;
+		here[count].sect = 0;
+		here[count].size = F_SIZECODE;
+	}
+	/* place logical sectors */
+	for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
+		here[n].sect = count;
+		n = (n+il) % F_SECT_PER_TRACK;
+		if (here[n].sect) { /* sector busy, find next free sector */
+			++n;
+			if (n>= F_SECT_PER_TRACK) {
+				n-=F_SECT_PER_TRACK;
+				while (here[n].sect) ++n;
+			}
+		}
+	}
+}
+
+static void redo_format(void)
+{
+	buffer_track = -1;
+	setup_format_params(format_req.track << STRETCH(_floppy));
+	floppy_start();
+#ifdef DEBUGT
+	debugt("queue format request");
+#endif
+}
+
+static struct cont_t format_cont={
+	format_interrupt,
+	redo_format,
+	bad_flp_intr,
+	generic_done };
+
+static int do_format(kdev_t device, struct format_descr *tmp_format_req)
+{
+	int ret;
+	int drive=DRIVE(device);
+
+	LOCK_FDC(drive,1);
+	set_floppy(drive);
+	if (!_floppy ||
+	    _floppy->track > DP->tracks ||
+	    tmp_format_req->track >= _floppy->track ||
+	    tmp_format_req->head >= _floppy->head ||
+	    (_floppy->sect << 2) % (1 <<  FD_SIZECODE(_floppy)) ||
+	    !_floppy->fmt_gap) {
+		process_fd_request();
+		return -EINVAL;
+	}
+	format_req = *tmp_format_req;
+	format_errors = 0;
+	cont = &format_cont;
+	errors = &format_errors;
+	IWAIT(redo_format);
+	process_fd_request();
+	return ret;
+}
+
+/*
+ * Buffer read/write and support
+ * =============================
+ */
+
+static inline void end_request(struct request *req, int uptodate)
+{
+	if (end_that_request_first(req, uptodate, current_count_sectors))
+		return;
+	add_disk_randomness(req->rq_disk);
+	floppy_off((long)req->rq_disk->private_data);
+	blkdev_dequeue_request(req);
+	end_that_request_last(req);
+
+	/* We're done with the request */
+	current_req = NULL;
+}
+
+
+/* new request_done. Can handle physical sectors which are smaller than a
+ * logical buffer */
+static void request_done(int uptodate)
+{
+	struct request_queue *q = &floppy_queue;
+	struct request *req = current_req;
+	unsigned long flags;
+	int block;
+
+	probing = 0;
+	reschedule_timeout(MAXTIMEOUT, "request done %d", uptodate);
+
+	if (!req) {
+		printk("floppy.c: no request in request_done\n");
+		return;
+	}
+
+	if (uptodate){
+		/* maintain values for invalidation on geometry
+		 * change */
+		block = current_count_sectors + req->sector;
+		INFBOUND(DRS->maxblock, block);
+		if (block > _floppy->sect)
+			DRS->maxtrack = 1;
+
+		/* unlock chained buffers */
+		spin_lock_irqsave(q->queue_lock, flags);
+		end_request(req, 1);
+		spin_unlock_irqrestore(q->queue_lock, flags);
+	} else {
+		if (rq_data_dir(req) == WRITE) {
+			/* record write error information */
+			DRWE->write_errors++;
+			if (DRWE->write_errors == 1) {
+				DRWE->first_error_sector = req->sector;
+				DRWE->first_error_generation = DRS->generation;
+			}
+			DRWE->last_error_sector = req->sector;
+			DRWE->last_error_generation = DRS->generation;
+		}
+		spin_lock_irqsave(q->queue_lock, flags);
+		end_request(req, 0);
+		spin_unlock_irqrestore(q->queue_lock, flags);
+	}
+}
+
+/* Interrupt handler evaluating the result of the r/w operation */
+static void rw_interrupt(void)
+{
+	int nr_sectors, ssize, eoc, heads;
+
+	if (R_HEAD >= 2) {
+	    /* some Toshiba floppy controllers occasionnally seem to
+	     * return bogus interrupts after read/write operations, which
+	     * can be recognized by a bad head number (>= 2) */
+	     return;
+	}  
+
+	if (!DRS->first_read_date)
+		DRS->first_read_date = jiffies;
+
+	nr_sectors = 0;
+	CODE2SIZE;
+
+	if (ST1 & ST1_EOC)
+		eoc = 1;
+	else
+		eoc = 0;
+
+	if (COMMAND & 0x80)
+		heads = 2;
+	else
+		heads = 1;
+
+	nr_sectors = (((R_TRACK-TRACK) * heads +
+				   R_HEAD-HEAD) * SECT_PER_TRACK +
+				   R_SECTOR-SECTOR + eoc) << SIZECODE >> 2;
+
+#ifdef FLOPPY_SANITY_CHECK
+	if (nr_sectors / ssize > 
+		(in_sector_offset + current_count_sectors + ssize - 1) / ssize) {
+		DPRINT("long rw: %x instead of %lx\n",
+			nr_sectors, current_count_sectors);
+		printk("rs=%d s=%d\n", R_SECTOR, SECTOR);
+		printk("rh=%d h=%d\n", R_HEAD, HEAD);
+		printk("rt=%d t=%d\n", R_TRACK, TRACK);
+		printk("heads=%d eoc=%d\n", heads, eoc);
+		printk("spt=%d st=%d ss=%d\n", SECT_PER_TRACK,
+		       fsector_t, ssize);
+		printk("in_sector_offset=%d\n", in_sector_offset);
+	}
+#endif
+
+	nr_sectors -= in_sector_offset;
+	INFBOUND(nr_sectors,0);
+	SUPBOUND(current_count_sectors, nr_sectors);
+
+	switch (interpret_errors()){
+		case 2:
+			cont->redo();
+			return;
+		case 1:
+			if (!current_count_sectors){
+				cont->error();
+				cont->redo();
+				return;
+			}
+			break;
+		case 0:
+			if (!current_count_sectors){
+				cont->redo();
+				return;
+			}
+			current_type[current_drive] = _floppy;
+			floppy_sizes[TOMINOR(current_drive) ]= _floppy->size;
+			break;
+	}
+
+	if (probing) {
+		if (DP->flags & FTD_MSG)
+			DPRINT("Auto-detected floppy type %s in fd%d\n",
+				_floppy->name,current_drive);
+		current_type[current_drive] = _floppy;
+		floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
+		probing = 0;
+	}
+
+	if (CT(COMMAND) != FD_READ || 
+	     raw_cmd->kernel_data == current_req->buffer){
+		/* transfer directly from buffer */
+		cont->done(1);
+	} else if (CT(COMMAND) == FD_READ){
+		buffer_track = raw_cmd->track;
+		buffer_drive = current_drive;
+		INFBOUND(buffer_max, nr_sectors + fsector_t);
+	}
+	cont->redo();
+}
+
+/* Compute maximal contiguous buffer size. */
+static int buffer_chain_size(void)
+{
+	struct bio *bio;
+	struct bio_vec *bv;
+	int size, i;
+	char *base;
+
+	base = bio_data(current_req->bio);
+	size = 0;
+
+	rq_for_each_bio(bio, current_req) {
+		bio_for_each_segment(bv, bio, i) {
+			if (page_address(bv->bv_page) + bv->bv_offset != base + size)
+				break;
+
+			size += bv->bv_len;
+		}
+	}
+
+	return size >> 9;
+}
+
+/* Compute the maximal transfer size */
+static int transfer_size(int ssize, int max_sector, int max_size)
+{
+	SUPBOUND(max_sector, fsector_t + max_size);
+
+	/* alignment */
+	max_sector -= (max_sector % _floppy->sect) % ssize;
+
+	/* transfer size, beginning not aligned */
+	current_count_sectors = max_sector - fsector_t ;
+
+	return max_sector;
+}
+
+/*
+ * Move data from/to the track buffer to/from the buffer cache.
+ */
+static void copy_buffer(int ssize, int max_sector, int max_sector_2)
+{
+	int remaining; /* number of transferred 512-byte sectors */
+	struct bio_vec *bv;
+	struct bio *bio;
+	char *buffer, *dma_buffer;
+	int size, i;
+
+	max_sector = transfer_size(ssize,
+				   minimum(max_sector, max_sector_2),
+				   current_req->nr_sectors);
+
+	if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
+	    buffer_max > fsector_t + current_req->nr_sectors)
+		current_count_sectors = minimum(buffer_max - fsector_t,
+						current_req->nr_sectors);
+
+	remaining = current_count_sectors << 9;
+#ifdef FLOPPY_SANITY_CHECK
+	if ((remaining >> 9) > current_req->nr_sectors  &&
+	    CT(COMMAND) == FD_WRITE){
+		DPRINT("in copy buffer\n");
+		printk("current_count_sectors=%ld\n", current_count_sectors);
+		printk("remaining=%d\n", remaining >> 9);
+		printk("current_req->nr_sectors=%ld\n",current_req->nr_sectors);
+		printk("current_req->current_nr_sectors=%u\n",
+		       current_req->current_nr_sectors);
+		printk("max_sector=%d\n", max_sector);
+		printk("ssize=%d\n", ssize);
+	}
+#endif
+
+	buffer_max = maximum(max_sector, buffer_max);
+
+	dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
+
+	size = current_req->current_nr_sectors << 9;
+
+	rq_for_each_bio(bio, current_req) {
+		bio_for_each_segment(bv, bio, i) {
+			if (!remaining)
+				break;
+
+			size = bv->bv_len;
+			SUPBOUND(size, remaining);
+
+			buffer = page_address(bv->bv_page) + bv->bv_offset;
+#ifdef FLOPPY_SANITY_CHECK
+		if (dma_buffer + size >
+		    floppy_track_buffer + (max_buffer_sectors << 10) ||
+		    dma_buffer < floppy_track_buffer){
+			DPRINT("buffer overrun in copy buffer %d\n",
+				(int) ((floppy_track_buffer - dma_buffer) >>9));
+			printk("fsector_t=%d buffer_min=%d\n",
+			       fsector_t, buffer_min);
+			printk("current_count_sectors=%ld\n",
+			       current_count_sectors);
+			if (CT(COMMAND) == FD_READ)
+				printk("read\n");
+			if (CT(COMMAND) == FD_READ)
+				printk("write\n");
+			break;
+		}
+		if (((unsigned long)buffer) % 512)
+			DPRINT("%p buffer not aligned\n", buffer);
+#endif
+			if (CT(COMMAND) == FD_READ)
+				memcpy(buffer, dma_buffer, size);
+			else
+				memcpy(dma_buffer, buffer, size);
+
+			remaining -= size;
+			dma_buffer += size;
+		}
+	}
+#ifdef FLOPPY_SANITY_CHECK
+	if (remaining){
+		if (remaining > 0)
+			max_sector -= remaining >> 9;
+		DPRINT("weirdness: remaining %d\n", remaining>>9);
+	}
+#endif
+}
+
+#if 0
+static inline int check_dma_crossing(char *start, 
+				     unsigned long length, char *message)
+{
+	if (CROSS_64KB(start, length)) {
+		printk("DMA xfer crosses 64KB boundary in %s %p-%p\n", 
+		       message, start, start+length);
+		return 1;
+	} else
+		return 0;
+}
+#endif
+
+/* work around a bug in pseudo DMA
+ * (on some FDCs) pseudo DMA does not stop when the CPU stops
+ * sending data.  Hence we need a different way to signal the
+ * transfer length:  We use SECT_PER_TRACK.  Unfortunately, this
+ * does not work with MT, hence we can only transfer one head at
+ * a time
+ */
+static void virtualdmabug_workaround(void)
+{
+	int hard_sectors, end_sector;
+
+	if(CT(COMMAND) == FD_WRITE) {
+		COMMAND &= ~0x80; /* switch off multiple track mode */
+
+		hard_sectors = raw_cmd->length >> (7 + SIZECODE);
+		end_sector = SECTOR + hard_sectors - 1;
+#ifdef FLOPPY_SANITY_CHECK
+		if(end_sector > SECT_PER_TRACK) {
+			printk("too many sectors %d > %d\n",
+			       end_sector, SECT_PER_TRACK);
+			return;
+		}
+#endif
+		SECT_PER_TRACK = end_sector; /* make sure SECT_PER_TRACK points
+					      * to end of transfer */
+	}
+}
+
+/*
+ * Formulate a read/write request.
+ * this routine decides where to load the data (directly to buffer, or to
+ * tmp floppy area), how much data to load (the size of the buffer, the whole
+ * track, or a single sector)
+ * All floppy_track_buffer handling goes in here. If we ever add track buffer
+ * allocation on the fly, it should be done here. No other part should need
+ * modification.
+ */
+
+static int make_raw_rw_request(void)
+{
+	int aligned_sector_t;
+	int max_sector, max_size, tracksize, ssize;
+
+	if(max_buffer_sectors == 0) {
+		printk("VFS: Block I/O scheduled on unopened device\n");
+		return 0;
+	}
+
+	set_fdc((long)current_req->rq_disk->private_data);
+
+	raw_cmd = &default_raw_cmd;
+	raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_DISK |
+		FD_RAW_NEED_SEEK;
+	raw_cmd->cmd_count = NR_RW;
+	if (rq_data_dir(current_req) == READ) {
+		raw_cmd->flags |= FD_RAW_READ;
+		COMMAND = FM_MODE(_floppy,FD_READ);
+	} else if (rq_data_dir(current_req) == WRITE){
+		raw_cmd->flags |= FD_RAW_WRITE;
+		COMMAND = FM_MODE(_floppy,FD_WRITE);
+	} else {
+		DPRINT("make_raw_rw_request: unknown command\n");
+		return 0;
+	}
+
+	max_sector = _floppy->sect * _floppy->head;
+
+	TRACK = (int)current_req->sector / max_sector;
+	fsector_t = (int)current_req->sector % max_sector;
+	if (_floppy->track && TRACK >= _floppy->track) {
+		if (current_req->current_nr_sectors & 1) {
+			current_count_sectors = 1;
+			return 1;
+		} else
+			return 0;
+	}
+	HEAD = fsector_t / _floppy->sect;
+
+	if (((_floppy->stretch & FD_SWAPSIDES) || TESTF(FD_NEED_TWADDLE)) &&
+	    fsector_t < _floppy->sect)
+		max_sector = _floppy->sect;
+
+	/* 2M disks have phantom sectors on the first track */
+	if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)){
+		max_sector = 2 * _floppy->sect / 3;
+		if (fsector_t >= max_sector){
+			current_count_sectors = minimum(_floppy->sect - fsector_t,
+							current_req->nr_sectors);
+			return 1;
+		}
+		SIZECODE = 2;
+	} else
+		SIZECODE = FD_SIZECODE(_floppy);
+	raw_cmd->rate = _floppy->rate & 0x43;
+	if ((_floppy->rate & FD_2M) &&
+	    (TRACK || HEAD) &&
+	    raw_cmd->rate == 2)
+		raw_cmd->rate = 1;
+
+	if (SIZECODE)
+		SIZECODE2 = 0xff;
+	else
+		SIZECODE2 = 0x80;
+	raw_cmd->track = TRACK << STRETCH(_floppy);
+	DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy,HEAD);
+	GAP = _floppy->gap;
+	CODE2SIZE;
+	SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
+	SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) + 1;
+
+	/* tracksize describes the size which can be filled up with sectors
+	 * of size ssize.
+	 */
+	tracksize = _floppy->sect - _floppy->sect % ssize;
+	if (tracksize < _floppy->sect){
+		SECT_PER_TRACK ++;
+		if (tracksize <= fsector_t % _floppy->sect)
+			SECTOR--;
+
+		/* if we are beyond tracksize, fill up using smaller sectors */
+		while (tracksize <= fsector_t % _floppy->sect){
+			while(tracksize + ssize > _floppy->sect){
+				SIZECODE--;
+				ssize >>= 1;
+			}
+			SECTOR++; SECT_PER_TRACK ++;
+			tracksize += ssize;
+		}
+		max_sector = HEAD * _floppy->sect + tracksize;
+	} else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
+		max_sector = _floppy->sect;
+	} else if (!HEAD && CT(COMMAND) == FD_WRITE) {
+		/* for virtual DMA bug workaround */
+		max_sector = _floppy->sect;
+	}
+
+	in_sector_offset = (fsector_t % _floppy->sect) % ssize;
+	aligned_sector_t = fsector_t - in_sector_offset;
+	max_size = current_req->nr_sectors;
+	if ((raw_cmd->track == buffer_track) && 
+	    (current_drive == buffer_drive) &&
+	    (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
+		/* data already in track buffer */
+		if (CT(COMMAND) == FD_READ) {
+			copy_buffer(1, max_sector, buffer_max);
+			return 1;
+		}
+	} else if (in_sector_offset || current_req->nr_sectors < ssize){
+		if (CT(COMMAND) == FD_WRITE){
+			if (fsector_t + current_req->nr_sectors > ssize &&
+			    fsector_t + current_req->nr_sectors < ssize + ssize)
+				max_size = ssize + ssize;
+			else
+				max_size = ssize;
+		}
+		raw_cmd->flags &= ~FD_RAW_WRITE;
+		raw_cmd->flags |= FD_RAW_READ;
+		COMMAND = FM_MODE(_floppy,FD_READ);
+	} else if ((unsigned long)current_req->buffer < MAX_DMA_ADDRESS) {
+		unsigned long dma_limit;
+		int direct, indirect;
+
+		indirect= transfer_size(ssize,max_sector,max_buffer_sectors*2) -
+			fsector_t;
+
+		/*
+		 * Do NOT use minimum() here---MAX_DMA_ADDRESS is 64 bits wide
+		 * on a 64 bit machine!
+		 */
+		max_size = buffer_chain_size();
+		dma_limit = (MAX_DMA_ADDRESS - ((unsigned long) current_req->buffer)) >> 9;
+		if ((unsigned long) max_size > dma_limit) {
+			max_size = dma_limit;
+		}
+		/* 64 kb boundaries */
+		if (CROSS_64KB(current_req->buffer, max_size << 9))
+			max_size = (K_64 - 
+				    ((unsigned long)current_req->buffer) % K_64)>>9;
+		direct = transfer_size(ssize,max_sector,max_size) - fsector_t;
+		/*
+		 * We try to read tracks, but if we get too many errors, we
+		 * go back to reading just one sector at a time.
+		 *
+		 * This means we should be able to read a sector even if there
+		 * are other bad sectors on this track.
+		 */
+		if (!direct ||
+		    (indirect * 2 > direct * 3 &&
+		     *errors < DP->max_errors.read_track &&
+		     /*!TESTF(FD_NEED_TWADDLE) &&*/
+		     ((!probing || (DP->read_track&(1<<DRS->probed_format)))))){
+			max_size = current_req->nr_sectors;
+		} else {
+			raw_cmd->kernel_data = current_req->buffer;
+			raw_cmd->length = current_count_sectors << 9;
+			if (raw_cmd->length == 0){
+				DPRINT("zero dma transfer attempted from make_raw_request\n");
+				DPRINT("indirect=%d direct=%d fsector_t=%d",
+					indirect, direct, fsector_t);
+				return 0;
+			}
+/*			check_dma_crossing(raw_cmd->kernel_data, 
+					   raw_cmd->length, 
+					   "end of make_raw_request [1]");*/
+
+			virtualdmabug_workaround();
+			return 2;
+		}
+	}
+
+	if (CT(COMMAND) == FD_READ)
+		max_size = max_sector; /* unbounded */
+
+	/* claim buffer track if needed */
+	if (buffer_track != raw_cmd->track ||  /* bad track */
+	    buffer_drive !=current_drive || /* bad drive */
+	    fsector_t > buffer_max ||
+	    fsector_t < buffer_min ||
+	    ((CT(COMMAND) == FD_READ ||
+	      (!in_sector_offset && current_req->nr_sectors >= ssize))&&
+	     max_sector > 2 * max_buffer_sectors + buffer_min &&
+	     max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)
+	    /* not enough space */){
+		buffer_track = -1;
+		buffer_drive = current_drive;
+		buffer_max = buffer_min = aligned_sector_t;
+	}
+	raw_cmd->kernel_data = floppy_track_buffer + 
+		((aligned_sector_t-buffer_min)<<9);
+
+	if (CT(COMMAND) == FD_WRITE){
+		/* copy write buffer to track buffer.
+		 * if we get here, we know that the write
+		 * is either aligned or the data already in the buffer
+		 * (buffer will be overwritten) */
+#ifdef FLOPPY_SANITY_CHECK
+		if (in_sector_offset && buffer_track == -1)
+			DPRINT("internal error offset !=0 on write\n");
+#endif
+		buffer_track = raw_cmd->track;
+		buffer_drive = current_drive;
+		copy_buffer(ssize, max_sector, 2*max_buffer_sectors+buffer_min);
+	} else
+		transfer_size(ssize, max_sector,
+			      2*max_buffer_sectors+buffer_min-aligned_sector_t);
+
+	/* round up current_count_sectors to get dma xfer size */
+	raw_cmd->length = in_sector_offset+current_count_sectors;
+	raw_cmd->length = ((raw_cmd->length -1)|(ssize-1))+1;
+	raw_cmd->length <<= 9;
+#ifdef FLOPPY_SANITY_CHECK
+	/*check_dma_crossing(raw_cmd->kernel_data, raw_cmd->length, 
+	  "end of make_raw_request");*/
+	if ((raw_cmd->length < current_count_sectors << 9) ||
+	    (raw_cmd->kernel_data != current_req->buffer &&
+	     CT(COMMAND) == FD_WRITE &&
+	     (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
+	      aligned_sector_t < buffer_min)) ||
+	    raw_cmd->length % (128 << SIZECODE) ||
+	    raw_cmd->length <= 0 || current_count_sectors <= 0){
+		DPRINT("fractionary current count b=%lx s=%lx\n",
+			raw_cmd->length, current_count_sectors);
+		if (raw_cmd->kernel_data != current_req->buffer)
+			printk("addr=%d, length=%ld\n",
+			       (int) ((raw_cmd->kernel_data - 
+				       floppy_track_buffer) >> 9),
+			       current_count_sectors);
+		printk("st=%d ast=%d mse=%d msi=%d\n",
+		       fsector_t, aligned_sector_t, max_sector, max_size);
+		printk("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
+		printk("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
+		       COMMAND, SECTOR, HEAD, TRACK);
+		printk("buffer drive=%d\n", buffer_drive);
+		printk("buffer track=%d\n", buffer_track);
+		printk("buffer_min=%d\n", buffer_min);
+		printk("buffer_max=%d\n", buffer_max);
+		return 0;
+	}
+
+	if (raw_cmd->kernel_data != current_req->buffer){
+		if (raw_cmd->kernel_data < floppy_track_buffer ||
+		    current_count_sectors < 0 ||
+		    raw_cmd->length < 0 ||
+		    raw_cmd->kernel_data + raw_cmd->length >
+		    floppy_track_buffer + (max_buffer_sectors  << 10)){
+			DPRINT("buffer overrun in schedule dma\n");
+			printk("fsector_t=%d buffer_min=%d current_count=%ld\n",
+			       fsector_t, buffer_min,
+			       raw_cmd->length >> 9);
+			printk("current_count_sectors=%ld\n",
+			       current_count_sectors);
+			if (CT(COMMAND) == FD_READ)
+				printk("read\n");
+			if (CT(COMMAND) == FD_READ)
+				printk("write\n");
+			return 0;
+		}
+	} else if (raw_cmd->length > current_req->nr_sectors << 9 ||
+		   current_count_sectors > current_req->nr_sectors){
+		DPRINT("buffer overrun in direct transfer\n");
+		return 0;
+	} else if (raw_cmd->length < current_count_sectors << 9){
+		DPRINT("more sectors than bytes\n");
+		printk("bytes=%ld\n", raw_cmd->length >> 9);
+		printk("sectors=%ld\n", current_count_sectors);
+	}
+	if (raw_cmd->length == 0){
+		DPRINT("zero dma transfer attempted from make_raw_request\n");
+		return 0;
+	}
+#endif
+
+	virtualdmabug_workaround();
+	return 2;
+}
+
+static void redo_fd_request(void)
+{
+#define REPEAT {request_done(0); continue; }
+	int drive;
+	int tmp;
+
+	lastredo = jiffies;
+	if (current_drive < N_DRIVE)
+		floppy_off(current_drive);
+
+	for (;;) {
+		if (!current_req) {
+			struct request *req;
+
+			spin_lock_irq(floppy_queue.queue_lock);
+			req = elv_next_request(&floppy_queue);
+			spin_unlock_irq(floppy_queue.queue_lock);
+			if (!req) {
+				do_floppy = NULL;
+				unlock_fdc();
+				return;
+			}
+			current_req = req;
+		}
+		drive = (long)current_req->rq_disk->private_data;
+		set_fdc(drive);
+		reschedule_timeout(current_reqD, "redo fd request", 0);
+
+		set_floppy(drive);
+		raw_cmd = & default_raw_cmd;
+		raw_cmd->flags = 0;
+		if (start_motor(redo_fd_request)) return;
+		disk_change(current_drive);
+		if (test_bit(current_drive, &fake_change) ||
+		   TESTF(FD_DISK_CHANGED)){
+			DPRINT("disk absent or changed during operation\n");
+			REPEAT;
+		}
+		if (!_floppy) { /* Autodetection */
+			if (!probing){
+				DRS->probed_format = 0;
+				if (next_valid_format()){
+					DPRINT("no autodetectable formats\n");
+					_floppy = NULL;
+					REPEAT;
+				}
+			}
+			probing = 1;
+			_floppy = floppy_type+DP->autodetect[DRS->probed_format];
+		} else
+			probing = 0;
+		errors = & (current_req->errors);
+		tmp = make_raw_rw_request();
+		if (tmp < 2){
+			request_done(tmp);
+			continue;
+		}
+
+		if (TESTF(FD_NEED_TWADDLE))
+			twaddle();
+		schedule_bh( (void *)(void *) floppy_start);
+#ifdef DEBUGT
+		debugt("queue fd request");
+#endif
+		return;
+	}
+#undef REPEAT
+}
+
+static struct cont_t rw_cont={
+	rw_interrupt,
+	redo_fd_request,
+	bad_flp_intr,
+	request_done };
+
+static void process_fd_request(void)
+{
+	cont = &rw_cont;
+	schedule_bh( (void *)(void *) redo_fd_request);
+}
+
+static void do_fd_request(request_queue_t * q)
+{
+	if(max_buffer_sectors == 0) {
+		printk("VFS: do_fd_request called on non-open device\n");
+		return;
+	}
+
+	if (usage_count == 0) {
+		printk("warning: usage count=0, current_req=%p exiting\n", current_req);
+		printk("sect=%ld flags=%lx\n", (long)current_req->sector, current_req->flags);
+		return;
+	}
+	if (fdc_busy){
+		/* fdc busy, this new request will be treated when the
+		   current one is done */
+		is_alive("do fd request, old request running");
+		return;
+	}
+	lock_fdc(MAXTIMEOUT,0);
+	process_fd_request();
+	is_alive("do fd request");
+}
+
+static struct cont_t poll_cont={
+	success_and_wakeup,
+	floppy_ready,
+	generic_failure,
+	generic_done };
+
+static int poll_drive(int interruptible, int flag)
+{
+	int ret;
+	/* no auto-sense, just clear dcl */
+	raw_cmd = &default_raw_cmd;
+	raw_cmd->flags= flag;
+	raw_cmd->track=0;
+	raw_cmd->cmd_count=0;
+	cont = &poll_cont;
+#ifdef DCL_DEBUG
+	if (DP->flags & FD_DEBUG){
+		DPRINT("setting NEWCHANGE in poll_drive\n");
+	}
+#endif
+	SETF(FD_DISK_NEWCHANGE);
+	WAIT(floppy_ready);
+	return ret;
+}
+
+/*
+ * User triggered reset
+ * ====================
+ */
+
+static void reset_intr(void)
+{
+	printk("weird, reset interrupt called\n");
+}
+
+static struct cont_t reset_cont={
+	reset_intr,
+	success_and_wakeup,
+	generic_failure,
+	generic_done };
+
+static int user_reset_fdc(int drive, int arg, int interruptible)
+{
+	int ret;
+
+	ret=0;
+	LOCK_FDC(drive,interruptible);
+	if (arg == FD_RESET_ALWAYS)
+		FDCS->reset=1;
+	if (FDCS->reset){
+		cont = &reset_cont;
+		WAIT(reset_fdc);
+	}
+	process_fd_request();
+	return ret;
+}
+
+/*
+ * Misc Ioctl's and support
+ * ========================
+ */
+static inline int fd_copyout(void *param, const void *address, unsigned long size)
+{
+	return copy_to_user(param,address, size) ? -EFAULT : 0;
+}
+
+static inline int fd_copyin(void *param, void *address, unsigned long size)
+{
+	return copy_from_user(address, param, size) ? -EFAULT : 0;
+}
+
+#define _COPYOUT(x) (copy_to_user((void *)param, &(x), sizeof(x)) ? -EFAULT : 0)
+#define _COPYIN(x) (copy_from_user(&(x), (void *)param, sizeof(x)) ? -EFAULT : 0)
+
+#define COPYOUT(x) ECALL(_COPYOUT(x))
+#define COPYIN(x) ECALL(_COPYIN(x))
+
+static inline const char *drive_name(int type, int drive)
+{
+	struct floppy_struct *floppy;
+
+	if (type)
+		floppy = floppy_type + type;
+	else {
+		if (UDP->native_format)
+			floppy = floppy_type + UDP->native_format;
+		else
+			return "(null)";
+	}
+	if (floppy->name)
+		return floppy->name;
+	else
+		return "(null)";
+}
+
+
+/* raw commands */
+static void raw_cmd_done(int flag)
+{
+	int i;
+
+	if (!flag) {
+		raw_cmd->flags |= FD_RAW_FAILURE;
+		raw_cmd->flags |= FD_RAW_HARDFAILURE;
+	} else {
+		raw_cmd->reply_count = inr;
+		if (raw_cmd->reply_count > MAX_REPLIES)
+			raw_cmd->reply_count=0;
+		for (i=0; i< raw_cmd->reply_count; i++)
+			raw_cmd->reply[i] = reply_buffer[i];
+
+		if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE))
+		{
+			unsigned long flags;
+			flags=claim_dma_lock();
+			raw_cmd->length = fd_get_dma_residue();
+			release_dma_lock(flags);
+		}
+		
+		if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
+		    (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
+			raw_cmd->flags |= FD_RAW_FAILURE;
+
+		if (disk_change(current_drive))
+			raw_cmd->flags |= FD_RAW_DISK_CHANGE;
+		else
+			raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
+		if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
+			motor_off_callback(current_drive);
+
+		if (raw_cmd->next &&
+		   (!(raw_cmd->flags & FD_RAW_FAILURE) ||
+		    !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
+		   ((raw_cmd->flags & FD_RAW_FAILURE) ||
+		    !(raw_cmd->flags &FD_RAW_STOP_IF_SUCCESS))) {
+			raw_cmd = raw_cmd->next;
+			return;
+		}
+	}
+	generic_done(flag);
+}
+
+
+static struct cont_t raw_cmd_cont={
+	success_and_wakeup,
+	floppy_start,
+	generic_failure,
+	raw_cmd_done
+};
+
+static inline int raw_cmd_copyout(int cmd, char *param,
+				  struct floppy_raw_cmd *ptr)
+{
+	int ret;
+
+	while(ptr) {
+		COPYOUT(*ptr);
+		param += sizeof(struct floppy_raw_cmd);
+		if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length){
+			if (ptr->length>=0 && ptr->length<=ptr->buffer_length)
+				ECALL(fd_copyout(ptr->data, 
+						 ptr->kernel_data, 
+						 ptr->buffer_length - 
+						 ptr->length));
+		}
+		ptr = ptr->next;
+	}
+	return 0;
+}
+
+
+static void raw_cmd_free(struct floppy_raw_cmd **ptr)
+{
+	struct floppy_raw_cmd *next,*this;
+
+	this = *ptr;
+	*ptr = 0;
+	while(this) {
+		if (this->buffer_length) {
+			fd_dma_mem_free((unsigned long)this->kernel_data,
+					this->buffer_length);
+			this->buffer_length = 0;
+		}
+		next = this->next;
+		kfree(this);
+		this = next;
+	}
+}
+
+
+static inline int raw_cmd_copyin(int cmd, char *param,
+				 struct floppy_raw_cmd **rcmd)
+{
+	struct floppy_raw_cmd *ptr;
+	int ret;
+	int i;
+	
+	*rcmd = 0;
+	while(1) {
+		ptr = (struct floppy_raw_cmd *) 
+			kmalloc(sizeof(struct floppy_raw_cmd), GFP_USER);
+		if (!ptr)
+			return -ENOMEM;
+		*rcmd = ptr;
+		COPYIN(*ptr);
+		ptr->next = 0;
+		ptr->buffer_length = 0;
+		param += sizeof(struct floppy_raw_cmd);
+		if (ptr->cmd_count > 33)
+			/* the command may now also take up the space
+			 * initially intended for the reply & the
+			 * reply count. Needed for long 82078 commands
+			 * such as RESTORE, which takes ... 17 command
+			 * bytes. Murphy's law #137: When you reserve
+			 * 16 bytes for a structure, you'll one day
+			 * discover that you really need 17...
+			 */
+			return -EINVAL;
+
+		for (i=0; i< 16; i++)
+			ptr->reply[i] = 0;
+		ptr->resultcode = 0;
+		ptr->kernel_data = 0;
+
+		if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
+			if (ptr->length <= 0)
+				return -EINVAL;
+			ptr->kernel_data =(char*)fd_dma_mem_alloc(ptr->length);
+			fallback_on_nodma_alloc(&ptr->kernel_data,
+						ptr->length);
+			if (!ptr->kernel_data)
+				return -ENOMEM;
+			ptr->buffer_length = ptr->length;
+		}
+		if (ptr->flags & FD_RAW_WRITE)
+			ECALL(fd_copyin(ptr->data, ptr->kernel_data, 
+					ptr->length));
+		rcmd = & (ptr->next);
+		if (!(ptr->flags & FD_RAW_MORE))
+			return 0;
+		ptr->rate &= 0x43;
+	}
+}
+
+
+static int raw_cmd_ioctl(int cmd, void *param)
+{
+	int drive, ret, ret2;
+	struct floppy_raw_cmd *my_raw_cmd;
+
+	if (FDCS->rawcmd <= 1)
+		FDCS->rawcmd = 1;
+	for (drive= 0; drive < N_DRIVE; drive++){
+		if (FDC(drive) != fdc)
+			continue;
+		if (drive == current_drive){
+			if (UDRS->fd_ref > 1){
+				FDCS->rawcmd = 2;
+				break;
+			}
+		} else if (UDRS->fd_ref){
+			FDCS->rawcmd = 2;
+			break;
+		}
+	}
+
+	if (FDCS->reset)
+		return -EIO;
+
+	ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
+	if (ret) {
+		raw_cmd_free(&my_raw_cmd);
+		return ret;
+	}
+
+	raw_cmd = my_raw_cmd;
+	cont = &raw_cmd_cont;
+	ret=wait_til_done(floppy_start,1);
+#ifdef DCL_DEBUG
+	if (DP->flags & FD_DEBUG){
+		DPRINT("calling disk change from raw_cmd ioctl\n");
+	}
+#endif
+
+	if (ret != -EINTR && FDCS->reset)
+		ret = -EIO;
+
+	DRS->track = NO_TRACK;
+
+	ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
+	if (!ret)
+		ret = ret2;
+	raw_cmd_free(&my_raw_cmd);
+	return ret;
+}
+
+static int invalidate_drive(struct block_device *bdev)
+{
+	/* invalidate the buffer track to force a reread */
+	set_bit((long)bdev->bd_disk->private_data, &fake_change);
+	process_fd_request();
+	check_disk_change(bdev);
+	return 0;
+}
+
+
+static inline void clear_write_error(int drive)
+{
+	CLEARSTRUCT(UDRWE);
+}
+
+static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
+			       int drive, int type, struct block_device *bdev)
+{
+	int cnt;
+
+	/* sanity checking for parameters.*/
+	if (g->sect <= 0 ||
+	    g->head <= 0 ||
+	    g->track <= 0 ||
+	    g->track > UDP->tracks>>STRETCH(g) ||
+	    /* check if reserved bits are set */
+	    (g->stretch&~(FD_STRETCH|FD_SWAPSIDES)) != 0)
+		return -EINVAL;
+	if (type){
+		if (!capable(CAP_SYS_ADMIN))
+			return -EPERM;
+		LOCK_FDC(drive,1);
+		for (cnt = 0; cnt < N_DRIVE; cnt++){
+			if (ITYPE(drive_state[cnt].fd_device) == type &&
+			    drive_state[cnt].fd_ref)
+				set_bit(drive, &fake_change);
+		}
+		floppy_type[type] = *g;
+		floppy_type[type].name="user format";
+		for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
+			floppy_sizes[cnt]= floppy_sizes[cnt+0x80]=
+				floppy_type[type].size+1;
+		process_fd_request();
+		for (cnt = 0; cnt < N_DRIVE; cnt++){
+			if (ITYPE(drive_state[cnt].fd_device) == type &&
+			    drive_state[cnt].fd_ref)
+				__check_disk_change(
+					MKDEV(FLOPPY_MAJOR,
+					      drive_state[cnt].fd_device));
+		}
+	} else {
+		LOCK_FDC(drive,1);
+		if (cmd != FDDEFPRM)
+			/* notice a disk change immediately, else
+			 * we lose our settings immediately*/
+			CALL(poll_drive(1, FD_RAW_NEED_DISK));
+		user_params[drive] = *g;
+		if (buffer_drive == drive)
+			SUPBOUND(buffer_max, user_params[drive].sect);
+		current_type[drive] = &user_params[drive];
+		floppy_sizes[drive] = user_params[drive].size;
+		if (cmd == FDDEFPRM)
+			DRS->keep_data = -1;
+		else
+			DRS->keep_data = 1;
+		/* invalidation. Invalidate only when needed, i.e.
+		 * when there are already sectors in the buffer cache
+		 * whose number will change. This is useful, because
+		 * mtools often changes the geometry of the disk after
+		 * looking at the boot block */
+		if (DRS->maxblock > user_params[drive].sect || DRS->maxtrack)
+			invalidate_drive(bdev);
+		else
+			process_fd_request();
+	}
+	return 0;
+}
+
+/* handle obsolete ioctl's */
+static int ioctl_table[]= {
+	FDCLRPRM,
+	FDSETPRM,
+	FDDEFPRM,
+	FDGETPRM,
+	FDMSGON,
+	FDMSGOFF,
+	FDFMTBEG,
+	FDFMTTRK,
+	FDFMTEND,
+	FDSETEMSGTRESH,
+	FDFLUSH,
+	FDSETMAXERRS,
+	FDGETMAXERRS,
+	FDGETDRVTYP,
+	FDSETDRVPRM,
+	FDGETDRVPRM,
+	FDGETDRVSTAT,
+	FDPOLLDRVSTAT,
+	FDRESET,
+	FDGETFDCSTAT,
+	FDWERRORCLR,
+	FDWERRORGET,
+	FDRAWCMD,
+	FDEJECT,
+	FDTWADDLE
+};
+
+static inline int normalize_ioctl(int *cmd, int *size)
+{
+	int i;
+
+	for (i=0; i < ARRAY_SIZE(ioctl_table); i++) {
+		if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)){
+			*size = _IOC_SIZE(*cmd);
+			*cmd = ioctl_table[i];
+			if (*size > _IOC_SIZE(*cmd)) {
+				printk("ioctl not yet supported\n");
+				return -EFAULT;
+			}
+			return 0;
+		}
+	}
+	return -EINVAL;
+}
+
+static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
+{
+	if (type)
+		*g = &floppy_type[type];
+	else {
+		LOCK_FDC(drive,0);
+		CALL(poll_drive(0,0));
+		process_fd_request();		
+		*g = current_type[drive];
+	}
+	if (!*g)
+		return -ENODEV;
+	return 0;
+}
+
+static int fd_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
+		    unsigned long param)
+{
+#define FD_IOCTL_ALLOWED ((filp) && (filp)->private_data)
+#define OUT(c,x) case c: outparam = (const char *) (x); break
+#define IN(c,x,tag) case c: *(x) = inparam. tag ; return 0
+
+	int i,drive,type;
+	kdev_t device;
+	int ret;
+	int size;
+	union inparam {
+		struct floppy_struct g; /* geometry */
+		struct format_descr f;
+		struct floppy_max_errors max_errors;
+		struct floppy_drive_params dp;
+	} inparam; /* parameters coming from user space */
+	const char *outparam; /* parameters passed back to user space */
+
+	device = inode->i_rdev;
+	type = TYPE(device);
+	drive = DRIVE(device);
+
+	/* convert compatibility eject ioctls into floppy eject ioctl.
+	 * We do this in order to provide a means to eject floppy disks before
+	 * installing the new fdutils package */
+	if (cmd == CDROMEJECT || /* CD-ROM eject */
+	    cmd == 0x6470 /* SunOS floppy eject */) {
+		DPRINT("obsolete eject ioctl\n");
+		DPRINT("please use floppycontrol --eject\n");
+		cmd = FDEJECT;
+	}
+
+	/* generic block device ioctls */
+	switch(cmd) {
+		/* the following have been inspired by the corresponding
+		 * code for other block devices. */
+		struct floppy_struct *g;
+		case HDIO_GETGEO:
+		{
+			struct hd_geometry loc;
+			ECALL(get_floppy_geometry(drive, type, &g));
+			loc.heads = g->head;
+			loc.sectors = g->sect;
+			loc.cylinders = g->track;
+			loc.start = 0;
+			return _COPYOUT(loc);
+		}
+	}
+
+	/* convert the old style command into a new style command */
+	if ((cmd & 0xff00) == 0x0200) {
+		ECALL(normalize_ioctl(&cmd, &size));
+	} else
+		return -EINVAL;
+
+	/* permission checks */
+	if (((cmd & 0x40) && !FD_IOCTL_ALLOWED) ||
+	    ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
+		return -EPERM;
+
+	/* copyin */
+	CLEARSTRUCT(&inparam);
+	if (_IOC_DIR(cmd) & _IOC_WRITE)
+		ECALL(fd_copyin((void *)param, &inparam, size))
+
+	switch (cmd) {
+		case FDEJECT:
+			if (UDRS->fd_ref != 1)
+				/* somebody else has this drive open */
+				return -EBUSY;
+			LOCK_FDC(drive,1);
+
+			/* do the actual eject. Fails on
+			 * non-Sparc architectures */
+			ret=fd_eject(UNIT(drive));
+
+			USETF(FD_DISK_CHANGED);
+			USETF(FD_VERIFY);
+			process_fd_request();
+			return ret;			
+		case FDCLRPRM:
+			LOCK_FDC(drive,1);
+			current_type[drive] = NULL;
+			floppy_sizes[drive] = MAX_DISK_SIZE << 1;
+			UDRS->keep_data = 0;
+			return invalidate_drive(inode->i_bdev);
+		case FDSETPRM:
+		case FDDEFPRM:
+			return set_geometry(cmd, & inparam.g,
+					    drive, type, inode->i_bdev);
+		case FDGETPRM:
+			ECALL(get_floppy_geometry(drive, type, 
+						  (struct floppy_struct**)
+						  &outparam));
+			break;
+
+		case FDMSGON:
+			UDP->flags |= FTD_MSG;
+			return 0;
+		case FDMSGOFF:
+			UDP->flags &= ~FTD_MSG;
+			return 0;
+
+		case FDFMTBEG:
+			LOCK_FDC(drive,1);
+			CALL(poll_drive(1, FD_RAW_NEED_DISK));
+			ret = UDRS->flags;
+			if (ret & FD_VERIFY) {
+				CALL(poll_drive(1, FD_RAW_NEED_DISK));
+				ret = UDRS->flags;
+			}
+
+			if (ret & FD_VERIFY) {
+				CALL(poll_drive(1, FD_RAW_NEED_DISK));
+				ret = UDRS->flags;
+			}
+
+			if (ret & FD_VERIFY) {
+				CALL(poll_drive(1, FD_RAW_NEED_DISK));
+				ret = UDRS->flags;
+			}
+
+			if (ret & FD_VERIFY) {
+				CALL(poll_drive(1, FD_RAW_NEED_DISK));
+				ret = UDRS->flags;
+			}
+
+			if(ret & FD_VERIFY){
+				CALL(poll_drive(1, FD_RAW_NEED_DISK));
+				ret = UDRS->flags;
+			}
+			process_fd_request();
+			if (ret & FD_VERIFY)
+				return -ENODEV;
+			if (!(ret & FD_DISK_WRITABLE))
+				return -EROFS;
+			return 0;
+		case FDFMTTRK:
+			if (UDRS->fd_ref != 1)
+				return -EBUSY;
+			return do_format(device, &inparam.f);
+		case FDFMTEND:
+		case FDFLUSH:
+			LOCK_FDC(drive,1);
+			return invalidate_drive(inode->i_bdev);
+
+		case FDSETEMSGTRESH:
+			UDP->max_errors.reporting =
+				(unsigned short) (param & 0x0f);
+			return 0;
+		OUT(FDGETMAXERRS, &UDP->max_errors);
+		IN(FDSETMAXERRS, &UDP->max_errors, max_errors);
+
+		case FDGETDRVTYP:
+			outparam = drive_name(type,drive);
+			SUPBOUND(size,strlen(outparam)+1);
+			break;
+
+		IN(FDSETDRVPRM, UDP, dp);
+		OUT(FDGETDRVPRM, UDP);
+
+		case FDPOLLDRVSTAT:
+			LOCK_FDC(drive,1);
+			CALL(poll_drive(1, FD_RAW_NEED_DISK));
+			process_fd_request();
+			/* fall through */
+	       	OUT(FDGETDRVSTAT, UDRS);
+
+		case FDRESET:
+			return user_reset_fdc(drive, (int)param, 1);
+
+		OUT(FDGETFDCSTAT,UFDCS);
+
+		case FDWERRORCLR:
+			CLEARSTRUCT(UDRWE);
+			return 0;
+		OUT(FDWERRORGET,UDRWE);
+
+		case FDRAWCMD:
+			if (type)
+				return -EINVAL;
+			LOCK_FDC(drive,1);
+			set_floppy(drive);
+			CALL(i = raw_cmd_ioctl(cmd,(void *) param));
+			process_fd_request();
+			return i;
+
+		case FDTWADDLE:
+			LOCK_FDC(drive,1);
+			twaddle();
+			process_fd_request();
+			return 0;
+
+		default:
+			return -EINVAL;
+	}
+
+	if (_IOC_DIR(cmd) & _IOC_READ)
+		return fd_copyout((void *)param, outparam, size);
+	else
+		return 0;
+#undef OUT
+#undef IN
+}
+
+static void __init config_types(void)
+{
+	int first=1;
+	int drive;
+	extern struct fd_info {
+		unsigned char dummy[4 * 6];
+		unsigned char fd_types[8];
+	} drive_info;
+
+	for (drive = 0; drive < 4; drive++)
+		UDP->cmos = drive_info.fd_types[drive];
+
+	/* XXX */
+	/* additional physical CMOS drive detection should go here */
+
+	for (drive=0; drive < N_DRIVE; drive++){
+		unsigned int type = UDP->cmos;
+		struct floppy_drive_params *params;
+		const char *name = NULL;
+		static char temparea[32];
+
+		if (type < NUMBER(default_drive_params)) {
+			params = &default_drive_params[type].params;
+			if (type) {
+				name = default_drive_params[type].name;
+				allowed_drive_mask |= 1 << drive;
+			}
+			else
+				allowed_drive_mask &= ~(1 << drive);
+		} else {
+			params = &default_drive_params[0].params;
+			sprintf(temparea, "unknown type %d (usb?)", type);
+			name = temparea;
+		}
+		if (name) {
+			const char * prepend = ",";
+			if (first) {
+				prepend = KERN_INFO "Floppy drive(s):";
+				first = 0;
+			}
+			printk("%s fd%d is %s", prepend, drive, name);
+			register_devfs_entries (drive);
+		}
+		*UDP = *params;
+	}
+	if (!first)
+		printk("\n");
+}
+
+static int floppy_release(struct inode * inode, struct file * filp)
+{
+	int drive = DRIVE(inode->i_rdev);
+
+	if (UDRS->fd_ref < 0)
+		UDRS->fd_ref=0;
+	else if (!UDRS->fd_ref--) {
+		DPRINT("floppy_release with fd_ref == 0");
+		UDRS->fd_ref = 0;
+	}
+	floppy_release_irq_and_dma();
+	return 0;
+}
+
+/*
+ * floppy_open check for aliasing (/dev/fd0 can be the same as
+ * /dev/PS0 etc), and disallows simultaneous access to the same
+ * drive with different device numbers.
+ */
+#define RETERR(x) do{floppy_release(inode,filp); return -(x);}while(0)
+
+static int floppy_open(struct inode * inode, struct file * filp)
+{
+	int drive;
+	int old_dev;
+	int try;
+	char *tmp;
+
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("floppy open: start\n");
+#endif
+	filp->private_data = (void*) 0;
+
+	drive = DRIVE(inode->i_rdev);
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("floppy open: drive=%d, current_drive=%d, UDP->cmos=%d\n"
+		   "floppy open: FDCS={spec1=%d, spec2=%d, dtr=%d, version=%d, dor=%d, address=%lu}\n",
+		   drive, current_drive, UDP->cmos, FDCS->spec1, FDCS->spec2,
+		   FDCS->dtr, FDCS->version, FDCS->dor, FDCS->address);
+	if (_floppy) {
+		printk("floppy open: _floppy={size=%d, sect=%d, head=%d, track=%d, spec1=%d}\n",
+			   _floppy->size, _floppy->sect, _floppy->head,
+			   _floppy->track, _floppy->spec1);
+	} else {
+		printk("floppy open: _floppy=NULL\n");
+	}
+#endif /* PC9800_DEBUG_FLOPPY */
+
+	if (drive >= N_DRIVE ||
+	    !(allowed_drive_mask & (1 << drive)) ||
+	    fdc_state[FDC(drive)].version == FDC_NONE)
+		return -ENXIO;
+
+	if (TYPE(inode->i_rdev) >= NUMBER(floppy_type))
+		return -ENXIO;
+	old_dev = UDRS->fd_device;
+	if (UDRS->fd_ref && old_dev != minor(inode->i_rdev))
+		return -EBUSY;
+
+	if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)){
+		USETF(FD_DISK_CHANGED);
+		USETF(FD_VERIFY);
+	}
+
+	if (UDRS->fd_ref == -1 ||
+	   (UDRS->fd_ref && (filp->f_flags & O_EXCL)))
+		return -EBUSY;
+
+	if (floppy_grab_irq_and_dma())
+		return -EBUSY;
+
+	if (filp->f_flags & O_EXCL)
+		UDRS->fd_ref = -1;
+	else
+		UDRS->fd_ref++;
+
+	if (!floppy_track_buffer){
+		/* if opening an ED drive, reserve a big buffer,
+		 * else reserve a small one */
+		if ((UDP->cmos == 6) || (UDP->cmos == 5))
+			try = 64; /* Only 48 actually useful */
+		else
+			try = 32; /* Only 24 actually useful */
+
+		tmp=(char *)fd_dma_mem_alloc(1024 * try);
+		if (!tmp && !floppy_track_buffer) {
+			try >>= 1; /* buffer only one side */
+			INFBOUND(try, 16);
+			tmp= (char *)fd_dma_mem_alloc(1024*try);
+		}
+		if (!tmp && !floppy_track_buffer) {
+			fallback_on_nodma_alloc(&tmp, 2048 * try);
+		}
+		if (!tmp && !floppy_track_buffer) {
+			DPRINT("Unable to allocate DMA memory\n");
+			RETERR(ENXIO);
+		}
+		if (floppy_track_buffer) {
+			if (tmp)
+				fd_dma_mem_free((unsigned long)tmp,try*1024);
+		} else {
+			buffer_min = buffer_max = -1;
+			floppy_track_buffer = tmp;
+			max_buffer_sectors = try;
+		}
+	}
+
+	UDRS->fd_device = minor(inode->i_rdev);
+	set_capacity(disks[drive], floppy_sizes[minor(inode->i_rdev)]);
+	if (old_dev != -1 && old_dev != minor(inode->i_rdev)) {
+		if (buffer_drive == drive)
+			buffer_track = -1;
+		/* umm, invalidate_buffers() in ->open??  --hch */
+		invalidate_buffers(mk_kdev(FLOPPY_MAJOR,old_dev));
+	}
+
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("floppy open: floppy.c:%d passed\n", __LINE__);
+#endif
+
+
+	/* Allow ioctls if we have write-permissions even if read-only open.
+	 * Needed so that programs such as fdrawcmd still can work on write
+	 * protected disks */
+	if ((filp->f_mode & 2) || 
+	    (inode->i_sb && (permission(inode,2) == 0)))
+	    filp->private_data = (void*) 8;
+
+	if (UFDCS->rawcmd == 1)
+		UFDCS->rawcmd = 2;
+
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("floppy open: floppy.c:%d passed\n", __LINE__);
+#endif
+
+	if (filp->f_flags & O_NDELAY)
+		return 0;
+	if (filp->f_mode & 3) {
+		UDRS->last_checked = 0;
+		check_disk_change(inode->i_bdev);
+		if (UTESTF(FD_DISK_CHANGED))
+			RETERR(ENXIO);
+	}
+	if ((filp->f_mode & 2) && !(UTESTF(FD_DISK_WRITABLE)))
+		RETERR(EROFS);
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("floppy open: end normally\n");
+#endif
+
+	return 0;
+#undef RETERR
+}
+
+/*
+ * Check if the disk has been changed or if a change has been faked.
+ */
+static int check_floppy_change(struct gendisk *disk)
+{
+	int drive = (long)disk->private_data;
+
+#ifdef PC9800_DEBUG_FLOPPY
+	printk("check_floppy_change: MINOR=%d\n", minor(dev));
+#endif
+
+	if (UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY))
+		return 1;
+
+	if (UDP->checkfreq < (int)(jiffies - UDRS->last_checked)) {
+		if(floppy_grab_irq_and_dma()) {
+			return 1;
+		}
+
+		lock_fdc(drive,0);
+		poll_drive(0,0);
+		process_fd_request();
+		floppy_release_irq_and_dma();
+	}
+
+	if (UTESTF(FD_DISK_CHANGED) ||
+	   UTESTF(FD_VERIFY) ||
+	   test_bit(drive, &fake_change) ||
+	   (!ITYPE(UDRS->fd_device) && !current_type[drive]))
+		return 1;
+	return 0;
+}
+
+/*
+ * This implements "read block 0" for floppy_revalidate().
+ * Needed for format autodetection, checking whether there is
+ * a disk in the drive, and whether that disk is writable.
+ */
+
+static int floppy_rb0_complete(struct bio *bio, unsigned int bytes_done, int err)
+{
+	if (bio->bi_size)
+		return 1;
+
+	complete((struct completion*)bio->bi_private);
+	return 0;
+}
+
+static int __floppy_read_block_0(struct block_device *bdev)
+{
+	struct bio bio;
+	struct bio_vec bio_vec;
+	struct completion complete;
+	struct page *page;
+	size_t size;
+
+	page = alloc_page(GFP_NOIO);
+	if (!page) {
+		process_fd_request();
+		return -ENOMEM;
+	}
+
+	size = bdev->bd_block_size;
+	if (!size)
+		size = 1024;
+
+	bio_init(&bio);
+	bio.bi_io_vec = &bio_vec;
+	bio_vec.bv_page = page;
+	bio_vec.bv_len = size;
+	bio_vec.bv_offset = 0;
+	bio.bi_vcnt = 1;
+	bio.bi_idx = 0;
+	bio.bi_size = size;
+	bio.bi_bdev = bdev;
+	bio.bi_sector = 0;
+	init_completion(&complete);
+	bio.bi_private = &complete;
+	bio.bi_end_io = floppy_rb0_complete;
+
+	submit_bio(READ, &bio);
+	generic_unplug_device(bdev_get_queue(bdev));
+	process_fd_request();
+	wait_for_completion(&complete);
+
+	__free_page(page);
+
+	return 0;
+}
+
+static int floppy_read_block_0(struct gendisk *disk)
+{
+	struct block_device *bdev;
+	int ret;
+
+	bdev = bdget(MKDEV(disk->major, disk->first_minor));
+	if (!bdev) {
+		printk("No block device for %s\n", disk->disk_name);
+		BUG();
+	}
+	bdev->bd_disk = disk;	/* ewww */
+	ret = __floppy_read_block_0(bdev);
+	atomic_dec(&bdev->bd_count);
+	return ret;
+}
+
+/* revalidate the floppy disk, i.e. trigger format autodetection by reading
+ * the bootblock (block 0). "Autodetection" is also needed to check whether
+ * there is a disk in the drive at all... Thus we also do it for fixed
+ * geometry formats */
+static int floppy_revalidate(struct gendisk *disk)
+{
+	int drive=(long)disk->private_data;
+#define NO_GEOM (!current_type[drive] && !ITYPE(UDRS->fd_device))
+	int cf;
+	int res = 0;
+
+	if (UTESTF(FD_DISK_CHANGED) ||
+	    UTESTF(FD_VERIFY) ||
+	    test_bit(drive, &fake_change) ||
+	    NO_GEOM){
+		if(usage_count == 0) {
+			printk("VFS: revalidate called on non-open device.\n");
+			return -EFAULT;
+		}
+		lock_fdc(drive,0);
+		cf = UTESTF(FD_DISK_CHANGED) || UTESTF(FD_VERIFY);
+		if (!(cf || test_bit(drive, &fake_change) || NO_GEOM)){
+			process_fd_request(); /*already done by another thread*/
+			return 0;
+		}
+		UDRS->maxblock = 0;
+		UDRS->maxtrack = 0;
+		if (buffer_drive == drive)
+			buffer_track = -1;
+		clear_bit(drive, &fake_change);
+		UCLEARF(FD_DISK_CHANGED);
+		if (cf)
+			UDRS->generation++;
+		if (NO_GEOM){
+			/* auto-sensing */
+			res = floppy_read_block_0(disk);
+		} else {
+			if (cf)
+				poll_drive(0, FD_RAW_NEED_DISK);
+			process_fd_request();
+		}
+	}
+	set_capacity(disk, floppy_sizes[UDRS->fd_device]);
+	return res;
+}
+
+static struct block_device_operations floppy_fops = {
+	.owner		= THIS_MODULE,
+	.open		= floppy_open,
+	.release	= floppy_release,
+	.ioctl		= fd_ioctl,
+	.media_changed	= check_floppy_change,
+	.revalidate_disk= floppy_revalidate,
+};
+
+static char *table[] =
+{"",
+#if 0
+"d360", 
+#else
+"h1232",
+#endif
+"h1200", "u360", "u720", "h360", "h720",
+"u1440", "u2880", "CompaQ", "h1440", "u1680", "h410",
+"u820", "h1476", "u1722", "h420", "u830", "h1494", "u1743",
+"h880", "u1040", "u1120", "h1600", "u1760", "u1920",
+"u3200", "u3520", "u3840", "u1840", "u800", "u1600",
+NULL
+};
+static int t360[] = {1,0}, t1200[] = {2,5,6,10,12,14,16,18,20,23,0},
+t3in[] = {8,9,26,27,28, 7,11,15,19,24,25,29,31, 3,4,13,17,21,22,30,0};
+static int *table_sup[] = 
+{NULL, t360, t1200, t3in+5+8, t3in+5, t3in, t3in};
+
+static void __init register_devfs_entries (int drive)
+{
+    int base_minor, i;
+
+    base_minor = (drive < 4) ? drive : (124 + drive);
+    if (UDP->cmos < NUMBER(default_drive_params)) {
+	i = 0;
+	do {
+	    char name[16];
+
+	    sprintf(name, "floppy/%d%s", drive, table[table_sup[UDP->cmos][i]]);
+	    devfs_register(NULL, name, DEVFS_FL_DEFAULT, FLOPPY_MAJOR,
+			    base_minor + (table_sup[UDP->cmos][i] << 2),
+			    S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP,
+			    &floppy_fops, NULL);
+	} while (table_sup[UDP->cmos][i++]);
+    }
+}
+
+/*
+ * Floppy Driver initialization
+ * =============================
+ */
+
+static inline char __init get_fdc_version(void)
+{
+	return FDC_8272A;
+}
+
+/* lilo configuration */
+
+static void __init floppy_set_flags(int *ints,int param, int param2)
+{
+	int i;
+
+	for (i=0; i < ARRAY_SIZE(default_drive_params); i++){
+		if (param)
+			default_drive_params[i].params.flags |= param2;
+		else
+			default_drive_params[i].params.flags &= ~param2;
+	}
+	DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
+}
+
+static void __init daring(int *ints,int param, int param2)
+{
+	int i;
+
+	for (i=0; i < ARRAY_SIZE(default_drive_params); i++){
+		if (param){
+			default_drive_params[i].params.select_delay = 0;
+			default_drive_params[i].params.flags |= FD_SILENT_DCL_CLEAR;
+		} else {
+			default_drive_params[i].params.select_delay = 2*HZ/100;
+			default_drive_params[i].params.flags &= ~FD_SILENT_DCL_CLEAR;
+		}
+	}
+	DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
+}
+
+static void __init set_cmos(int *ints, int dummy, int dummy2)
+{
+	int current_drive=0;
+
+	if (ints[0] != 2){
+		DPRINT("wrong number of parameters for CMOS\n");
+		return;
+	}
+	current_drive = ints[1];
+	if (current_drive < 0 || current_drive >= 8){
+		DPRINT("bad drive for set_cmos\n");
+		return;
+	}
+#if N_FDC > 1
+	if (current_drive >= 4 && !FDC2)
+		FDC2 = 0x370;
+#endif
+	DP->cmos = ints[2];
+	DPRINT("setting CMOS code to %d\n", ints[2]);
+}
+
+static struct param_table {
+	const char *name;
+	void (*fn)(int *ints, int param, int param2);
+	int *var;
+	int def_param;
+	int param2;
+} config_params[]={
+	{ "allowed_drive_mask", 0, &allowed_drive_mask, 0xff, 0}, /* obsolete */
+	{ "all_drives", 0, &allowed_drive_mask, 0xff, 0 }, /* obsolete */
+	{ "irq", 0, &FLOPPY_IRQ, DEFAULT_FLOPPY_IRQ, 0 },
+	{ "dma", 0, &FLOPPY_DMA, DEFAULT_FLOPPY_DMA, 0 },
+
+	{ "daring", daring, 0, 1, 0},
+#if N_FDC > 1
+	{ "two_fdc",  0, &FDC2, 0x370, 0 },
+	{ "one_fdc", 0, &FDC2, 0, 0 },
+#endif
+	{ "broken_dcl", floppy_set_flags, 0, 1, FD_BROKEN_DCL },
+	{ "messages", floppy_set_flags, 0, 1, FTD_MSG },
+	{ "silent_dcl_clear", floppy_set_flags, 0, 1, FD_SILENT_DCL_CLEAR },
+	{ "debug", floppy_set_flags, 0, 1, FD_DEBUG },
+
+	{ "nodma", 0, &can_use_virtual_dma, 1, 0 },
+	{ "yesdma", 0, &can_use_virtual_dma, 0, 0 },
+
+	{ "fifo_depth", 0, &fifo_depth, 0xa, 0 },
+	{ "nofifo", 0, &no_fifo, 0x20, 0 },
+	{ "usefifo", 0, &no_fifo, 0, 0 },
+
+	{ "cmos", set_cmos, 0, 0, 0 },
+	{ "slow", 0, &slow_floppy, 1, 0 },
+
+	{ "unexpected_interrupts", 0, &print_unex, 1, 0 },
+	{ "no_unexpected_interrupts", 0, &print_unex, 0, 0 },
+
+	EXTRA_FLOPPY_PARAMS
+};
+
+static int __init floppy_setup(char *str)
+{
+	int i;
+	int param;
+	int ints[11];
+
+	str = get_options(str,ARRAY_SIZE(ints),ints);
+	if (str) {
+		for (i=0; i< ARRAY_SIZE(config_params); i++){
+			if (strcmp(str,config_params[i].name) == 0){
+				if (ints[0])
+					param = ints[1];
+				else
+					param = config_params[i].def_param;
+				if (config_params[i].fn)
+					config_params[i].
+						fn(ints,param,
+						   config_params[i].param2);
+				if (config_params[i].var) {
+					DPRINT("%s=%d\n", str, param);
+					*config_params[i].var = param;
+				}
+				return 1;
+			}
+		}
+	}
+	if (str) {
+		DPRINT("unknown floppy option [%s]\n", str);
+		
+		DPRINT("allowed options are:");
+		for (i=0; i< ARRAY_SIZE(config_params); i++)
+			printk(" %s",config_params[i].name);
+		printk("\n");
+	} else
+		DPRINT("botched floppy option\n");
+	DPRINT("Read linux/Documentation/floppy.txt\n");
+	return 0;
+}
+
+static int have_no_fdc= -ENODEV;
+
+static struct platform_device floppy_device = {
+	.name		= "floppy",
+	.id		= 0,
+	.dev		= {
+		.name	= "Floppy Drive",
+	},
+};
+
+static struct gendisk *floppy_find(dev_t dev, int *part, void *data)
+{
+	int drive = (*part&3) | ((*part&0x80) >> 5);
+	if (drive >= N_DRIVE ||
+	    !(allowed_drive_mask & (1 << drive)) ||
+	    fdc_state[FDC(drive)].version == FDC_NONE)
+		return NULL;
+	return get_disk(disks[drive]);
+}
+
+int __init floppy_init(void)
+{
+	int i,unit,drive;
+	int err;
+
+	raw_cmd = NULL;
+	FDC1 = 0x90;
+
+	for (i=0; i<N_DRIVE; i++) {
+		disks[i] = alloc_disk(1);
+		if (!disks[i])
+			goto Enomem;
+	}
+
+	devfs_mk_dir (NULL, "floppy", NULL);
+	if (register_blkdev(FLOPPY_MAJOR,"fd")) {
+		err = -EBUSY;
+		goto out;
+	}
+
+	for (i=0; i<N_DRIVE; i++) {
+		disks[i]->major = FLOPPY_MAJOR;
+		disks[i]->first_minor = TOMINOR(i);
+		disks[i]->fops = &floppy_fops;
+		sprintf(disks[i]->disk_name, "fd%d", i);
+	}
+
+	blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
+				floppy_find, NULL, NULL);
+
+	for (i=0; i<256; i++)
+		if (ITYPE(i))
+			floppy_sizes[i] = floppy_type[ITYPE(i)].size;
+		else
+			floppy_sizes[i] = MAX_DISK_SIZE << 1;
+
+	blk_init_queue(&floppy_queue, do_fd_request, &floppy_lock);
+	reschedule_timeout(MAXTIMEOUT, "floppy init", MAXTIMEOUT);
+	config_types();
+
+	for (i = 0; i < N_FDC; i++) {
+		fdc = i;
+		CLEARSTRUCT(FDCS);
+		FDCS->dtr = -1;
+		FDCS->dor = 0;
+	}
+
+	if ((fd_inb(FD_MODE_CHANGE) & 1) == 0)
+		FDC1 = 0xc8;
+
+	use_virtual_dma = can_use_virtual_dma & 1;
+	fdc_state[0].address = FDC1;
+	if (fdc_state[0].address == -1) {
+		err = -ENODEV;
+		goto out1;
+	}
+#if N_FDC > 1
+	fdc_state[1].address = FDC2;
+#endif
+
+	fdc = 0; /* reset fdc in case of unexpected interrupt */
+	if (floppy_grab_irq_and_dma()){
+		err = -EBUSY;
+		goto out1;
+	}
+
+	/* initialise drive state */
+	for (drive = 0; drive < N_DRIVE; drive++) {
+		CLEARSTRUCT(UDRS);
+		CLEARSTRUCT(UDRWE);
+		USETF(FD_DISK_NEWCHANGE);
+		USETF(FD_DISK_CHANGED);
+		USETF(FD_VERIFY);
+		UDRS->fd_device = -1;
+		floppy_track_buffer = NULL;
+		max_buffer_sectors = 0;
+	}
+
+	for (i = 0; i < N_FDC; i++) {
+		fdc = i;
+		FDCS->driver_version = FD_DRIVER_VERSION;
+		for (unit=0; unit<4; unit++)
+			FDCS->track[unit] = 0;
+		if (FDCS->address == -1)
+			continue;
+		FDCS->rawcmd = 2;
+		user_reset_fdc(-1, FD_RESET_ALWAYS, 0);
+
+		/* Try to determine the floppy controller type */
+		FDCS->version = get_fdc_version();
+		if (FDCS->version == FDC_NONE){
+ 			/* free ioports reserved by floppy_grab_irq_and_dma() */
+			release_region(FDCS->address, 1);
+			release_region(FDCS->address + 2, 1);
+			release_region(FDCS->address + 4, 1);
+			release_region(0xbe, 1);
+			release_region(0x4be, 1);
+			FDCS->address = -1;
+			continue;
+		}
+		if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
+			can_use_virtual_dma = 0;
+
+		have_no_fdc = 0;
+		/* Not all FDCs seem to be able to handle the version command
+		 * properly, so force a reset for the standard FDC clones,
+		 * to avoid interrupt garbage.
+		 */
+		user_reset_fdc(-1,FD_RESET_ALWAYS,0);
+	}
+	fdc=0;
+	del_timer(&fd_timeout);
+	current_drive = 0;
+	floppy_release_irq_and_dma();
+#if 0  /* no message */
+	initialising=0;
+#endif
+	if (have_no_fdc) {
+		DPRINT("no floppy controllers found\n");
+		flush_scheduled_work();
+		if (usage_count)
+			floppy_release_irq_and_dma();
+		err = have_no_fdc;
+		goto out2;
+	}
+	
+	for (drive = 0; drive < N_DRIVE; drive++) {
+		init_timer(&motor_off_timer[drive]);
+		motor_off_timer[drive].data = drive;
+		motor_off_timer[drive].function = motor_off_callback;
+		if (!(allowed_drive_mask & (1 << drive)))
+			continue;
+		if (fdc_state[FDC(drive)].version == FDC_NONE)
+			continue;
+		/* to be cleaned up... */
+		disks[drive]->private_data = (void*)(long)drive;
+		disks[drive]->queue = &floppy_queue;
+		add_disk(disks[drive]);
+	}
+
+	platform_device_register(&floppy_device);
+	return 0;
+
+out1:
+	del_timer(&fd_timeout);
+out2:
+	blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
+	unregister_blkdev(FLOPPY_MAJOR,"fd");
+	blk_cleanup_queue(&floppy_queue);
+out:
+	for (i=0; i<N_DRIVE; i++)
+		put_disk(disks[i]);
+	return err;
+
+Enomem:
+	while (i--)
+		put_disk(disks[i]);
+	return -ENOMEM;
+}
+
+static spinlock_t floppy_usage_lock = SPIN_LOCK_UNLOCKED;
+
+static int floppy_grab_irq_and_dma(void)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&floppy_usage_lock, flags);
+	if (usage_count++){
+		spin_unlock_irqrestore(&floppy_usage_lock, flags);
+		return 0;
+	}
+	spin_unlock_irqrestore(&floppy_usage_lock, flags);
+	MOD_INC_USE_COUNT;
+	if (fd_request_irq()) {
+		DPRINT("Unable to grab IRQ%d for the floppy driver\n",
+			FLOPPY_IRQ);
+		MOD_DEC_USE_COUNT;
+		spin_lock_irqsave(&floppy_usage_lock, flags);
+		usage_count--;
+		spin_unlock_irqrestore(&floppy_usage_lock, flags);
+		return -1;
+	}
+	if (fd_request_dma()) {
+		DPRINT("Unable to grab DMA%d for the floppy driver\n",
+			FLOPPY_DMA);
+		fd_free_irq();
+		MOD_DEC_USE_COUNT;
+		spin_lock_irqsave(&floppy_usage_lock, flags);
+		usage_count--;
+		spin_unlock_irqrestore(&floppy_usage_lock, flags);
+		return -1;
+	}
+
+	for (fdc=0; fdc< N_FDC; fdc++){
+		if (FDCS->address != -1){
+			static char floppy[] = "floppy";
+			if (!request_region(FDCS->address, 1, floppy))
+				goto cleanup0;
+
+			if (!request_region(FDCS->address + 2, 1, floppy)) {
+				release_region(FDCS->address, 1);
+				goto cleanup0;
+			}
+
+			if (!request_region(FDCS->address + 4, 1, floppy)) {
+				release_region(FDCS->address, 1);
+				release_region(FDCS->address + 2, 1);
+				goto cleanup0;
+			}
+
+			if (fdc == 0) {  /* internal FDC */
+				if (request_region(0xbe, 1, "floppy mode change")) {
+					if (request_region(0x4be, 1, "floppy ex. mode change"))
+						continue;
+					else
+						DPRINT("Floppy io-port 0x4be in use\n");
+
+					release_region(0xbe, 1);
+				} else
+					DPRINT("Floppy io-port 0xbe in use\n");
+
+				release_region(FDCS->address, 1);
+				release_region(FDCS->address + 2, 1);
+				release_region(FDCS->address + 4, 1);
+			}
+
+			goto cleanup1;
+		}
+	}
+	for (fdc=0; fdc< N_FDC; fdc++){
+		if (FDCS->address != -1){
+			reset_fdc_info(1);
+			fd_outb(FDCS->dor, FD_MODE);
+		}
+	}
+	fdc = 0;
+	fd_outb((FDCS->dor & 8), FD_MODE);
+
+	for (fdc = 0; fdc < N_FDC; fdc++)
+		if (FDCS->address != -1)
+			fd_outb(FDCS->dor, FD_MODE);
+	/*
+	 *	The driver will try and free resources and relies on us
+	 *	to know if they were allocated or not.
+	 */
+	fdc = 0;
+	irqdma_allocated = 1;
+	return 0;
+
+cleanup0:
+	DPRINT("Floppy io-port 0x%04lx in use\n", FDCS->address);
+cleanup1:
+	fd_free_irq();
+	fd_free_dma();
+	while(--fdc >= 0) {
+		release_region(FDCS->address, 1);
+		release_region(FDCS->address + 2, 1);
+		release_region(FDCS->address + 4, 1);
+		if (fdc == 0) {
+			release_region(0x00be, 1);
+			release_region(0x04be, 1);
+		}
+	}
+	MOD_DEC_USE_COUNT;
+	spin_lock_irqsave(&floppy_usage_lock, flags);
+	usage_count--;
+	spin_unlock_irqrestore(&floppy_usage_lock, flags);
+	return -1;
+}
+
+static void floppy_release_irq_and_dma(void)
+{
+	int old_fdc;
+#ifdef FLOPPY_SANITY_CHECK
+	int drive;
+#endif
+	long tmpsize;
+	unsigned long tmpaddr;
+	unsigned long flags;
+
+	spin_lock_irqsave(&floppy_usage_lock, flags);
+	if (--usage_count){
+		spin_unlock_irqrestore(&floppy_usage_lock, flags);
+		return;
+	}
+	spin_unlock_irqrestore(&floppy_usage_lock, flags);
+	if(irqdma_allocated)
+	{
+		fd_disable_dma();
+		fd_free_dma();
+		fd_free_irq();
+		irqdma_allocated=0;
+	}
+	fd_outb(0, FD_MODE);
+	floppy_enable_hlt();
+
+	if (floppy_track_buffer && max_buffer_sectors) {
+		tmpsize = max_buffer_sectors*1024;
+		tmpaddr = (unsigned long)floppy_track_buffer;
+		floppy_track_buffer = NULL;
+		max_buffer_sectors = 0;
+		buffer_min = buffer_max = -1;
+		fd_dma_mem_free(tmpaddr, tmpsize);
+	}
+
+#ifdef FLOPPY_SANITY_CHECK
+	for (drive=0; drive < N_FDC * 4; drive++)
+		if (timer_pending(motor_off_timer + drive))
+			printk("motor off timer %d still active\n", drive);
+
+	if (timer_pending(&fd_timeout))
+		printk("floppy timer still active:%s\n", timeout_message);
+	if (timer_pending(&fd_timer))
+		printk("auxiliary floppy timer still active\n");
+	if (floppy_work.pending)
+		printk("work still pending\n");
+#endif
+	old_fdc = fdc;
+	for (fdc = 0; fdc < N_FDC; fdc++)
+		if (FDCS->address != -1) {
+			release_region(FDCS->address, 1);
+			release_region(FDCS->address + 2, 1);
+			release_region(FDCS->address + 4, 1);
+			if (fdc == 0) {
+				release_region(0xbe, 1);
+				release_region(0x4be, 1);
+			}
+		}
+	fdc = old_fdc;
+	MOD_DEC_USE_COUNT;
+}
+
+
+#ifdef MODULE
+
+char *floppy;
+
+static void unregister_devfs_entries (int drive)
+{
+    int i;
+
+    if (UDP->cmos < NUMBER(default_drive_params)) {
+	i = 0;
+	do {
+	    devfs_remove("floppy/%d%s", drive, table[table_sup[UDP->cmos][i]]);
+	} while (table_sup[UDP->cmos][i++]);
+    }
+}
+
+static void __init parse_floppy_cfg_string(char *cfg)
+{
+	char *ptr;
+
+	while(*cfg) {
+		for(ptr = cfg;*cfg && *cfg != ' ' && *cfg != '\t'; cfg++);
+		if (*cfg) {
+			*cfg = '\0';
+			cfg++;
+		}
+		if (*ptr)
+			floppy_setup(ptr);
+	}
+}
+
+int init_module(void)
+{
+	printk(KERN_INFO "inserting floppy driver for " UTS_RELEASE "\n");
+		
+	if (floppy)
+		parse_floppy_cfg_string(floppy);
+	return floppy_init();
+}
+
+void cleanup_module(void)
+{
+	int drive;
+		
+	platform_device_unregister(&floppy_device);
+	blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
+	unregister_blkdev(FLOPPY_MAJOR, "fd");
+	for (drive = 0; drive < N_DRIVE; drive++) {
+		if ((allowed_drive_mask & (1 << drive)) &&
+		    fdc_state[FDC(drive)].version != FDC_NONE) {
+			del_gendisk(disks[drive]);
+			unregister_devfs_entries(drive);
+		}
+		put_disk(disks[drive]);
+	}
+	devfs_remove("floppy");
+
+	blk_cleanup_queue(&floppy_queue);
+	/* eject disk, if any */
+	fd_eject(0);
+}
+
+MODULE_PARM(floppy,"s");
+MODULE_PARM(FLOPPY_IRQ,"i");
+MODULE_PARM(FLOPPY_DMA,"i");
+MODULE_AUTHOR("Osamu Tomita");
+MODULE_SUPPORTED_DEVICE("fd");
+MODULE_LICENSE("GPL");
+
+#else
+
+__setup ("floppy=", floppy_setup);
+module_init(floppy_init)
+#endif
diff -Nru a/drivers/block/genhd.c b/drivers/block/genhd.c
--- a/drivers/block/genhd.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/block/genhd.c	Sat Apr 19 19:51:47 2003
@@ -525,9 +525,21 @@
 	.default_attrs	= default_attrs,
 };
 
+extern struct kobj_type ktype_part;
+
+static int block_hotplug_filter(struct kset *kset, struct kobject *kobj)
+{
+	struct kobj_type *ktype = get_ktype(kobj);
+
+	return ((ktype == &ktype_block) || (ktype == &ktype_part));
+}
+
+static struct kset_hotplug_ops block_hotplug_ops = {
+	.filter	= block_hotplug_filter,
+};
 
 /* declare block_subsys. */
-static decl_subsys(block,&ktype_block);
+static decl_subsys(block, &ktype_block, &block_hotplug_ops);
 
 
 struct gendisk *alloc_disk(int minors)
diff -Nru a/drivers/block/loop.c b/drivers/block/loop.c
--- a/drivers/block/loop.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/block/loop.c	Sat Apr 19 19:51:48 2003
@@ -120,13 +120,13 @@
 	return 0;
 }
 
-static int none_status(struct loop_device *lo, struct loop_info *info)
+static int none_status(struct loop_device *lo, const struct loop_info64 *info)
 {
 	lo->lo_flags |= LO_FLAGS_BH_REMAP;
 	return 0;
 }
 
-static int xor_status(struct loop_device *lo, struct loop_info *info)
+static int xor_status(struct loop_device *lo, const struct loop_info64 *info)
 {
 	if (info->lo_encrypt_key_size <= 0)
 		return -EINVAL;
@@ -215,7 +215,8 @@
 			 * The transfer failed, but we still write the data to
 			 * keep prepare/commit calls balanced.
 			 */
-			printk(KERN_ERR "loop: transfer error block %llu\n", (unsigned long long)index);
+			printk(KERN_ERR "loop: transfer error block %llu\n",
+			       (unsigned long long)index);
 			memset(kaddr + offset, 0, size);
 		}
 		flush_dcache_page(page);
@@ -270,7 +271,9 @@
 	int bsize;
 };
 
-static int lo_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size)
+static int
+lo_read_actor(read_descriptor_t *desc, struct page *page,
+	      unsigned long offset, unsigned long size)
 {
 	char *kaddr;
 	unsigned long count = desc->count;
@@ -284,7 +287,8 @@
 	kaddr = kmap(page);
 	if (lo_do_transfer(lo, READ, kaddr + offset, p->data, size, IV)) {
 		size = 0;
-		printk(KERN_ERR "loop: transfer error block %ld\n",page->index);
+		printk(KERN_ERR "loop: transfer error block %ld\n",
+		       page->index);
 		desc->error = -EINVAL;
 	}
 	kunmap(page);
@@ -297,7 +301,7 @@
 
 static int
 do_lo_receive(struct loop_device *lo,
-		struct bio_vec *bvec, int bsize, loff_t pos)
+	      struct bio_vec *bvec, int bsize, loff_t pos)
 {
 	struct lo_read_data cookie;
 	struct file *file;
@@ -330,8 +334,8 @@
 	return ret;
 }
 
-static inline unsigned long loop_get_iv(struct loop_device *lo,
-					unsigned long sector)
+static inline unsigned long
+loop_get_iv(struct loop_device *lo, unsigned long sector)
 {
 	int bs = lo->lo_blocksize;
 	unsigned long offset, IV;
@@ -358,6 +362,7 @@
 }
 
 static int loop_end_io_transfer(struct bio *, unsigned int, int);
+
 static void loop_put_buffer(struct bio *bio)
 {
 	/*
@@ -764,7 +769,8 @@
 	return err;
 }
 
-static int loop_init_xfer(struct loop_device *lo, int type,struct loop_info *i)
+static int
+loop_init_xfer(struct loop_device *lo, int type, const struct loop_info64 *i)
 {
 	int err = 0; 
 	if (type) {
@@ -822,9 +828,9 @@
 	return 0;
 }
 
-static int loop_set_status(struct loop_device *lo, struct loop_info *arg)
+static int
+loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
 {
-	struct loop_info info; 
 	int err;
 	unsigned int type;
 	loff_t offset;
@@ -834,23 +840,21 @@
 		return -EPERM;
 	if (lo->lo_state != Lo_bound)
 		return -ENXIO;
-	if (copy_from_user(&info, arg, sizeof (struct loop_info)))
-		return -EFAULT; 
-	if ((unsigned int) info.lo_encrypt_key_size > LO_KEY_SIZE)
+	if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE)
 		return -EINVAL;
-	type = info.lo_encrypt_type; 
+	type = info->lo_encrypt_type; 
 	if (type >= MAX_LO_CRYPT || xfer_funcs[type] == NULL)
 		return -EINVAL;
-	if (type == LO_CRYPT_XOR && info.lo_encrypt_key_size == 0)
+	if (type == LO_CRYPT_XOR && info->lo_encrypt_key_size == 0)
 		return -EINVAL;
 
 	err = loop_release_xfer(lo);
 	if (!err) 
-		err = loop_init_xfer(lo, type, &info);
+		err = loop_init_xfer(lo, type, info);
 
 	offset = lo->lo_offset;
-	if (offset != info.lo_offset) {
-		lo->lo_offset = info.lo_offset;
+	if (offset != info->lo_offset) {
+		lo->lo_offset = info->lo_offset;
 		if (figure_loop_size(lo)){
 			err = -EFBIG;
 			lo->lo_offset = offset;
@@ -860,51 +864,147 @@
 	if (err)
 		return err;	
 
-	strncpy(lo->lo_name, info.lo_name, LO_NAME_SIZE);
+	strncpy(lo->lo_name, info->lo_name, LO_NAME_SIZE);
 
 	lo->transfer = xfer_funcs[type]->transfer;
 	lo->ioctl = xfer_funcs[type]->ioctl;
-	lo->lo_encrypt_key_size = info.lo_encrypt_key_size;
-	lo->lo_init[0] = info.lo_init[0];
-	lo->lo_init[1] = info.lo_init[1];
-	if (info.lo_encrypt_key_size) {
-		memcpy(lo->lo_encrypt_key, info.lo_encrypt_key, 
-		       info.lo_encrypt_key_size);
+	lo->lo_encrypt_key_size = info->lo_encrypt_key_size;
+	lo->lo_init[0] = info->lo_init[0];
+	lo->lo_init[1] = info->lo_init[1];
+	if (info->lo_encrypt_key_size) {
+		memcpy(lo->lo_encrypt_key, info->lo_encrypt_key, 
+		       info->lo_encrypt_key_size);
 		lo->lo_key_owner = current->uid; 
 	}	
 
 	return 0;
 }
 
-static int loop_get_status(struct loop_device *lo, struct loop_info *arg)
+static int
+loop_get_status(struct loop_device *lo, struct loop_info64 *info)
 {
 	struct file *file = lo->lo_backing_file;
-	struct loop_info info;
 	struct kstat stat;
 	int error;
 
 	if (lo->lo_state != Lo_bound)
 		return -ENXIO;
-	if (!arg)
-		return -EINVAL;
 	error = vfs_getattr(file->f_vfsmnt, file->f_dentry, &stat);
 	if (error)
 		return error;
-	memset(&info, 0, sizeof(info));
-	info.lo_number = lo->lo_number;
-	info.lo_device = stat.dev;
-	info.lo_inode = stat.ino;
-	info.lo_rdevice = lo->lo_device ? stat.rdev : stat.dev;
-	info.lo_offset = lo->lo_offset;
-	info.lo_flags = lo->lo_flags;
-	strncpy(info.lo_name, lo->lo_name, LO_NAME_SIZE);
-	info.lo_encrypt_type = lo->lo_encrypt_type;
+	memset(info, 0, sizeof(*info));
+	info->lo_number = lo->lo_number;
+	info->lo_device = stat.dev;
+	info->lo_inode = stat.ino;
+	info->lo_rdevice = lo->lo_device ? stat.rdev : stat.dev;
+	info->lo_offset = lo->lo_offset;
+	info->lo_flags = lo->lo_flags;
+	strncpy(info->lo_name, lo->lo_name, LO_NAME_SIZE);
+	info->lo_encrypt_type = lo->lo_encrypt_type;
 	if (lo->lo_encrypt_key_size && capable(CAP_SYS_ADMIN)) {
-		info.lo_encrypt_key_size = lo->lo_encrypt_key_size;
-		memcpy(info.lo_encrypt_key, lo->lo_encrypt_key,
+		info->lo_encrypt_key_size = lo->lo_encrypt_key_size;
+		memcpy(info->lo_encrypt_key, lo->lo_encrypt_key,
 		       lo->lo_encrypt_key_size);
 	}
-	return copy_to_user(arg, &info, sizeof(info)) ? -EFAULT : 0;
+	return 0;
+}
+
+static void
+loop_info64_from_old(const struct loop_info *info, struct loop_info64 *info64)
+{
+	info64->lo_number = info->lo_number;
+	info64->lo_device = info->lo_device;
+	info64->lo_inode = info->lo_inode;
+	info64->lo_rdevice = info->lo_rdevice;
+	info64->lo_offset = info->lo_offset;
+	info64->lo_encrypt_type = info->lo_encrypt_type;
+	info64->lo_encrypt_key_size = info->lo_encrypt_key_size;
+	info64->lo_flags = info->lo_flags;
+	info64->lo_init[0] = info->lo_init[0];
+	info64->lo_init[1] = info->lo_init[1];
+	memcpy(info64->lo_name, info->lo_name, LO_NAME_SIZE);
+	memcpy(info64->lo_encrypt_key, info->lo_encrypt_key, LO_KEY_SIZE);
+}
+
+static int
+loop_info64_to_old(const struct loop_info64 *info64, struct loop_info *info)
+{
+	info->lo_number = info64->lo_number;
+	info->lo_device = info64->lo_device;
+	info->lo_inode = info64->lo_inode;
+	info->lo_rdevice = info64->lo_rdevice;
+	info->lo_offset = info64->lo_offset;
+	info->lo_encrypt_type = info64->lo_encrypt_type;
+	info->lo_encrypt_key_size = info64->lo_encrypt_key_size;
+	info->lo_flags = info64->lo_flags;
+	info->lo_init[0] = info64->lo_init[0];
+	info->lo_init[1] = info64->lo_init[1];
+	memcpy(info->lo_name, info64->lo_name, LO_NAME_SIZE);
+	memcpy(info->lo_encrypt_key,info64->lo_encrypt_key,LO_KEY_SIZE);
+
+	/* error in case values were truncated */
+	if (info->lo_device != info64->lo_device ||
+	    info->lo_rdevice != info64->lo_rdevice ||
+	    info->lo_inode != info64->lo_inode ||
+	    info->lo_offset != info64->lo_offset)
+		return -EOVERFLOW;
+
+	return 0;
+}
+
+static int
+loop_set_status_old(struct loop_device *lo, const struct loop_info *arg)
+{
+	struct loop_info info;
+	struct loop_info64 info64;
+
+	if (copy_from_user(&info, arg, sizeof (struct loop_info)))
+		return -EFAULT;
+	loop_info64_from_old(&info, &info64);
+	return loop_set_status(lo, &info64);
+}
+
+static int
+loop_set_status64(struct loop_device *lo, const struct loop_info64 *arg)
+{
+	struct loop_info64 info64;
+
+	if (copy_from_user(&info64, arg, sizeof (struct loop_info64)))
+		return -EFAULT;
+	return loop_set_status(lo, &info64);
+}
+
+static int
+loop_get_status_old(struct loop_device *lo, struct loop_info *arg) {
+	struct loop_info info;
+	struct loop_info64 info64;
+	int err = 0;
+
+	if (!arg)
+		err = -EINVAL;
+	if (!err)
+		err = loop_get_status(lo, &info64);
+	if (!err)
+		err = loop_info64_to_old(&info64, &info);
+	if (!err && copy_to_user(arg, &info, sizeof(info)))
+		err = -EFAULT;
+
+	return err;
+}
+
+static int
+loop_get_status64(struct loop_device *lo, struct loop_info64 *arg) {
+	struct loop_info64 info64;
+	int err = 0;
+
+	if (!arg)
+		err = -EINVAL;
+	if (!err)
+		err = loop_get_status(lo, &info64);
+	if (!err && copy_to_user(arg, &info64, sizeof(info64)))
+		err = -EFAULT;
+
+	return err;
 }
 
 static int lo_ioctl(struct inode * inode, struct file * file,
@@ -922,10 +1022,16 @@
 		err = loop_clr_fd(lo, inode->i_bdev);
 		break;
 	case LOOP_SET_STATUS:
-		err = loop_set_status(lo, (struct loop_info *) arg);
+		err = loop_set_status_old(lo, (struct loop_info *) arg);
 		break;
 	case LOOP_GET_STATUS:
-		err = loop_get_status(lo, (struct loop_info *) arg);
+		err = loop_get_status_old(lo, (struct loop_info *) arg);
+		break;
+	case LOOP_SET_STATUS64:
+		err = loop_set_status64(lo, (struct loop_info64 *) arg);
+		break;
+	case LOOP_GET_STATUS64:
+		err = loop_get_status64(lo, (struct loop_info64 *) arg);
 		break;
 	default:
 		err = lo->ioctl ? lo->ioctl(lo, cmd, arg) : -EINVAL;
diff -Nru a/drivers/block/paride/pf.c b/drivers/block/paride/pf.c
--- a/drivers/block/paride/pf.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/block/paride/pf.c	Sat Apr 19 19:51:49 2003
@@ -780,10 +780,10 @@
 	if (pf_busy)
 		return;
 repeat:
-	if (elv_queue_empty(q))
+	pf_req = elv_next_request(q);
+	if (!pf_req)
 		return;
 
-	pf_req = elv_next_request(q);
 	pf_current = pf_req->rq_disk->private_data;
 	pf_block = pf_req->sector;
 	pf_run = pf_req->nr_sectors;
diff -Nru a/drivers/block/paride/pg.c b/drivers/block/paride/pg.c
--- a/drivers/block/paride/pg.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/block/paride/pg.c	Sat Apr 19 19:51:50 2003
@@ -233,14 +233,14 @@
 	int busy;        	  /* write done, read expected */
 	int start;		  /* jiffies at command start */
 	int dlen;		  /* transfer size requested */
-	int timeout;		  /* timeout requested */
+	unsigned long timeout;	  /* timeout requested */
 	int status;		  /* last sense key */
 	int drive;		  /* drive */
 	unsigned long access;     /* count of active opens ... */
 	int present;		  /* device present ? */
 	char *bufptr;
 	char name[PG_NAMELEN];	  /* pg0, pg1, ... */
-	};
+};
 
 struct pg_unit pg[PG_UNITS];
 
@@ -292,43 +292,47 @@
 	schedule_timeout(cs);
 }
 
-static int pg_wait( int unit, int go, int stop, int tmo, char * msg )
-
-{       int j, r, e, s, p;
+static int pg_wait(int unit, int go, int stop, unsigned long tmo, char *msg)
+{
+	int j, r, e, s, p, to;
 
 	PG.status = 0;
 
 	j = 0;
-	while ((((r=RR(1,6))&go)||(stop&&(!(r&stop))))&&(time_before(jiffies,tmo))) {
-		if (j++ < PG_SPIN) udelay(PG_SPIN_DEL);
-		else pg_sleep(1);
-	}
-
-	if ((r&(STAT_ERR&stop))||time_after_eq(jiffies, tmo)) {
-	   s = RR(0,7);
-	   e = RR(0,1);
-	   p = RR(0,2);
-	   if (verbose > 1)
-	     printk("%s: %s: stat=0x%x err=0x%x phase=%d%s\n",
-		   PG.name,msg,s,e,p,time_after_eq(jiffies, tmo)?" timeout":"");
-
-
-	   if (time_after_eq(jiffies, tmo)) e |= 0x100;
-	   PG.status = (e >> 4) & 0xff;
-	   return -1;
+	while ((((r=RR(1,6))&go) || (stop&&(!(r&stop))))
+	       && time_before(jiffies,tmo)) {
+		if (j++ < PG_SPIN)
+			udelay(PG_SPIN_DEL);
+		else
+			pg_sleep(1);
+	}
+
+	to = time_after_eq(jiffies, tmo);
+
+	if ((r&(STAT_ERR&stop)) || to) {
+		s = RR(0,7);
+		e = RR(0,1);
+		p = RR(0,2);
+		if (verbose > 1)
+			printk("%s: %s: stat=0x%x err=0x%x phase=%d%s\n",
+			       PG.name, msg, s, e, p, to ? " timeout" : "");
+		if (to)
+			e |= 0x100;
+		PG.status = (e >> 4) & 0xff;
+		return -1;
 	}
 	return 0;
 }
 
-static int pg_command( int unit, char * cmd, int dlen, int tmo )
-
-{       int k;
+static int pg_command(int unit, char *cmd, int dlen, unsigned long tmo)
+{
+	int k;
 
 	pi_connect(PI);
 
 	WR(0,6,DRIVE);
 
-	if (pg_wait(unit,STAT_BUSY|STAT_DRQ,0,tmo,"before command")) {
+	if (pg_wait(unit, STAT_BUSY|STAT_DRQ, 0, tmo, "before command")) {
 		pi_disconnect(PI);
 		return -1;
 	}
@@ -337,15 +341,15 @@
 	WR(0,5,dlen / 256);
 	WR(0,7,0xa0);          /* ATAPI packet command */
 
-	if (pg_wait(unit,STAT_BUSY,STAT_DRQ,tmo,"command DRQ")) {
+	if (pg_wait(unit, STAT_BUSY, STAT_DRQ, tmo, "command DRQ")) {
 		pi_disconnect(PI);
 		return -1;
 	}
 
 	if (RR(0,2) != 1) {
-	   printk("%s: command phase error\n",PG.name);
-	   pi_disconnect(PI);
-	   return -1;
+		printk("%s: command phase error\n",PG.name);
+		pi_disconnect(PI);
+		return -1;
 	}
 
 	pi_write_block(PI,cmd,12);
@@ -358,27 +362,30 @@
 	return 0;
 }
 
-static int pg_completion( int unit, char * buf, int tmo)
-
-{       int r, d, n, p;
+static int pg_completion(int unit, char *buf, unsigned long tmo)
+{
+	int r, d, n, p;
 
-	r = pg_wait(unit,STAT_BUSY,STAT_DRQ|STAT_READY|STAT_ERR,
-			tmo,"completion");
+	r = pg_wait(unit, STAT_BUSY, STAT_DRQ|STAT_READY|STAT_ERR,
+		    tmo, "completion");
 
 	PG.dlen = 0;
 
 	while (RR(0,7)&STAT_DRQ) {
-	   d = (RR(0,4)+256*RR(0,5));
-	   n = ((d+3)&0xfffc);
-	   p = RR(0,2)&3;
-	   if (p == 0) pi_write_block(PI,buf,n);
-	   if (p == 2) pi_read_block(PI,buf,n);
-	   if (verbose > 1) printk("%s: %s %d bytes\n",PG.name,
-				    p?"Read":"Write",n);
-	   PG.dlen += (1-p)*d;
-	   buf += d;
-	   r = pg_wait(unit,STAT_BUSY,STAT_DRQ|STAT_READY|STAT_ERR,
-			tmo,"completion");
+		d = (RR(0,4)+256*RR(0,5));
+		n = ((d+3)&0xfffc);
+		p = RR(0,2)&3;
+		if (p == 0)
+			pi_write_block(PI,buf,n);
+		if (p == 2)
+			pi_read_block(PI,buf,n);
+		if (verbose > 1)
+			printk("%s: %s %d bytes\n", PG.name,
+			       p?"Read":"Write", n);
+		PG.dlen += (1-p)*d;
+		buf += d;
+		r = pg_wait(unit, STAT_BUSY, STAT_DRQ|STAT_READY|STAT_ERR,
+			    tmo, "completion");
 	}
 
 	pi_disconnect(PI); 
diff -Nru a/drivers/block/paride/pseudo.h b/drivers/block/paride/pseudo.h
--- a/drivers/block/paride/pseudo.h	Sat Apr 19 19:51:30 2003
+++ b/drivers/block/paride/pseudo.h	Sat Apr 19 19:51:30 2003
@@ -39,7 +39,7 @@
 
 static void (* ps_continuation)(void);
 static int (* ps_ready)(void);
-static int ps_timeout;
+static unsigned long ps_timeout;
 static int ps_tq_active = 0;
 static int ps_nice = 0;
 
@@ -70,7 +70,7 @@
 	spin_unlock_irqrestore(&ps_spinlock,flags);
 }
 
-static void ps_tq_int( void *data )
+static void ps_tq_int(void *data)
 {
 	void (*con)(void);
 	unsigned long flags;
diff -Nru a/drivers/block/z2ram.c b/drivers/block/z2ram.c
--- a/drivers/block/z2ram.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/block/z2ram.c	Sat Apr 19 19:51:49 2003
@@ -74,7 +74,7 @@
 static void do_z2_request(request_queue_t *q)
 {
 	struct request *req;
-	while ((req = elv_next_request) != NULL) {
+	while ((req = elv_next_request(q)) != NULL) {
 		unsigned long start = req->sector << 9;
 		unsigned long len  = req->current_nr_sectors << 9;
 
diff -Nru a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c
--- a/drivers/bluetooth/btuart_cs.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/bluetooth/btuart_cs.c	Sat Apr 19 19:51:51 2003
@@ -294,7 +294,7 @@
 
 		}
 
-		/* Make sure we don't stay here to long */
+		/* Make sure we don't stay here too long */
 		if (boguscount++ > 16)
 			break;
 
@@ -343,7 +343,7 @@
 			break;
 		}
 
-		/* Make sure we don't stay here to long */
+		/* Make sure we don't stay here too long */
 		if (boguscount++ > 100)
 			break;
 
diff -Nru a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c
--- a/drivers/bluetooth/dtl1_cs.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/bluetooth/dtl1_cs.c	Sat Apr 19 19:51:46 2003
@@ -297,7 +297,7 @@
 
 		}
 
-		/* Make sure we don't stay here to long */
+		/* Make sure we don't stay here too long */
 		if (boguscount++ > 32)
 			break;
 
@@ -347,7 +347,7 @@
 			break;
 		}
 
-		/* Make sure we don't stay here to long */
+		/* Make sure we don't stay here too long */
 		if (boguscount++ > 100)
 			break;
 
diff -Nru a/drivers/cdrom/sbpcd.c b/drivers/cdrom/sbpcd.c
--- a/drivers/cdrom/sbpcd.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/cdrom/sbpcd.c	Sat Apr 19 19:51:28 2003
@@ -5645,7 +5645,6 @@
 int __init sbpcd_init(void)
 #endif
 {
-	char nbuff[16];
 	int i=0, j=0;
 	int addr[2]={1, CDROM_PORT};
 	int port_index;
@@ -5869,8 +5868,7 @@
 		disk->fops = &sbpcd_bdops;
 		strcpy(disk->disk_name, sbpcd_infop->name);
 		disk->flags = GENHD_FL_CD;
-		sprintf(nbuff, "sbp/c0t%d", p->drv_id);
-		disk->de = devfs_mk_dir(NULL, nbuff, NULL);
+		sprintf(disk->devfs_name, "sbp/c0t%d", p->drv_id);
 		p->disk = disk;
 		if (register_cdrom(sbpcd_infop))
 		{
diff -Nru a/drivers/char/Kconfig b/drivers/char/Kconfig
--- a/drivers/char/Kconfig	Sat Apr 19 19:51:28 2003
+++ b/drivers/char/Kconfig	Sat Apr 19 19:51:28 2003
@@ -575,6 +575,17 @@
 	  console. This driver allows each pSeries partition to have a console
 	  which is accessed via the HMC.
 
+config PC9800_OLDLP
+	tristate "NEC PC-9800 old-style printer port support"
+	depends on X86_PC9800 && !PARPORT
+	---help---
+	  If you intend to attach a printer to the parallel port of NEC PC-9801
+	  /PC-9821 with OLD compatibility mode, Say Y.
+
+config PC9800_OLDLP_CONSOLE
+	bool "Support for console on line printer"
+	depends on PC9800_OLDLP
+
 source "drivers/i2c/Kconfig"
 
 
@@ -755,7 +766,7 @@
 
 config RTC
 	tristate "Enhanced Real Time Clock Support"
-	depends on !PPC32 && !PARISC && !IA64
+	depends on !PPC32 && !PARISC && !IA64 && !X86_PC9800
 	---help---
 	  If you say Y here and create a character special file /dev/rtc with
 	  major number 10 and minor number 135 using mknod ("man mknod"), you
@@ -813,6 +824,15 @@
 config EFI_RTC
 	bool "EFI Real Time Clock Services"
 	depends on IA64
+
+config RTC98
+	tristate "NEC PC-9800 Real Time Clock Support"
+	depends on X86_PC9800
+	default y
+	---help---
+	  If you say Y here and create a character special file /dev/rtc with
+	  major number 10 and minor number 135 using mknod ("man mknod"), you
+	  will get access to the real time clock (or hardware clock) built
 
 config H8
 	bool "Tadpole ANA H8 Support (OBSOLETE)"
diff -Nru a/drivers/char/agp/Kconfig b/drivers/char/agp/Kconfig
--- a/drivers/char/agp/Kconfig	Sat Apr 19 19:51:48 2003
+++ b/drivers/char/agp/Kconfig	Sat Apr 19 19:51:48 2003
@@ -29,17 +29,13 @@
 	bool "/dev/agpgart (AGP Support)"
 	depends on GART_IOMMU
 
-config AGP3
-	bool "AGP 3.0 compliance (EXPERIMENTAL)"
-	depends on AGP
-
 config AGP_INTEL
-	tristate "Intel 440LX/BX/GX and I815/I820/830M/I830MP/I840/I845/845G/I850/852GM/855GM/I860/865G support"
-	depends on AGP
+	tristate "Intel 440LX/BX/GX, I8xx and E7x05 support"
+	depends on AGP && !X86_64
 	help
 	  This option gives you AGP support for the GLX component of the
-	  XFree86 4.x on Intel 440LX/BX/GX, 815, 820, 830, 840, 845, 850
-	  and 860 chipsets and full support for the 810, 815, 830M, 845G,
+	  XFree86 4.x on Intel 440LX/BX/GX, 815, 820, 830, 840, 845, 850, 860
+	  E7205 and E7505 chipsets and full support for the 810, 815, 830M, 845G,
 	  852GM, 855GM and 865G integrated graphics chipsets.
 
 	  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
@@ -48,7 +44,7 @@
 
 #config AGP_I810
 #	tristate "Intel I810/I815/I830M (on-board) support"
-#	depends on AGP
+#	depends on AGP && !X86_64
 #	help
 #	  This option gives you AGP support for the Xserver on the Intel 810
 #	  815 and 830m chipset boards for their on-board integrated graphics. This
@@ -56,7 +52,7 @@
 
 config AGP_VIA
 	tristate "VIA chipset support"
-	depends on AGP
+	depends on AGP && !X86_64
 	help
 	  This option gives you AGP support for the GLX component of the
 	  XFree86 4.x on VIA MPV3/Apollo Pro chipsets.
@@ -66,7 +62,7 @@
 
 config AGP_AMD
 	tristate "AMD Irongate, 761, and 762 support"
-	depends on AGP
+	depends on AGP && !X86_64
 	help
 	  This option gives you AGP support for the GLX component of the
 	  XFree86 4.x on AMD Irongate, 761, and 762 chipsets.
@@ -76,7 +72,7 @@
 
 config AGP_SIS
 	tristate "Generic SiS support"
-	depends on AGP
+	depends on AGP && !X86_64
 	help
 	  This option gives you AGP support for the GLX component of the "soon
 	  to be released" XFree86 4.x on Silicon Integrated Systems [SiS]
@@ -89,7 +85,7 @@
 
 config AGP_ALI
 	tristate "ALI chipset support"
-	depends on AGP
+	depends on AGP && !X86_64
 	---help---
 	  This option gives you AGP support for the GLX component of the
 	  XFree86 4.x on the following ALi chipsets.  The supported chipsets
@@ -107,7 +103,7 @@
 
 config AGP_SWORKS
 	tristate "Serverworks LE/HE support"
-	depends on AGP
+	depends on AGP && !X86_64
 	help
 	  Say Y here to support the Serverworks AGP card.  See 
 	  <http://www.serverworks.com/> for product descriptions and images.
@@ -138,16 +134,4 @@
 	tristate
 	depends on AGP && (ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL)
 	default AGP
-
-# Put AGP 3.0 entries below here.
-
-config AGP_I7505
-	tristate "Intel 7205/7505 support (AGP 3.0)"
-	depends on AGP3
-	help
-	  This option gives you AGP support for the GLX component of the
-	  XFree86 4.x on Intel I7505 chipsets.
-
-	  You should say Y here if you use XFree86 3.3.6 or 4.x and want to
-	  use GLX or DRI.  If unsure, say N
 
diff -Nru a/drivers/char/agp/Makefile b/drivers/char/agp/Makefile
--- a/drivers/char/agp/Makefile	Sat Apr 19 19:51:30 2003
+++ b/drivers/char/agp/Makefile	Sat Apr 19 19:51:30 2003
@@ -3,8 +3,7 @@
 # space ioctl interface to use agp memory.  It also adds a kernel interface
 # that other drivers could use to manipulate agp memory.
 
-agpgart-y := backend.o frontend.o generic.o
-agpgart-$(CONFIG_AGP3) += generic-3.0.o
+agpgart-y := backend.o frontend.o generic.o generic-3.0.o
 agpgart-objs := $(agpgart-y)
 obj-$(CONFIG_AGP) += agpgart.o
 
@@ -19,5 +18,4 @@
 obj-$(CONFIG_AGP_AMD_8151)	+= amd-k8-agp.o
 obj-$(CONFIG_AGP_ALPHA_CORE)	+= alpha-agp.o
 
-obj-$(CONFIG_AGP_I7x05)		+= i7x05-agp.o
 
diff -Nru a/drivers/char/agp/agp.h b/drivers/char/agp/agp.h
--- a/drivers/char/agp/agp.h	Sat Apr 19 19:51:47 2003
+++ b/drivers/char/agp/agp.h	Sat Apr 19 19:51:47 2003
@@ -1,6 +1,6 @@
 /*
  * AGPGART
- * Copyright (C) 2002 Dave Jones
+ * Copyright (C) 2002-2003 Dave Jones
  * Copyright (C) 1999 Jeff Hartmann
  * Copyright (C) 1999 Precision Insight, Inc.
  * Copyright (C) 1999 Xi Graphics, Inc.
@@ -46,7 +46,7 @@
 		panic(PFX "timed out waiting for the other CPUs!\n");
 }
 #else
-static inline void global_cache_flush(void)
+static void global_cache_flush(void)
 {
 	flush_agp_cache();
 }
@@ -281,6 +281,7 @@
 #define INTEL_I7505_ATTBASE	0x78
 #define INTEL_I7505_ERRSTS	0x42
 #define INTEL_I7505_AGPCTRL	0x70
+#define INTEL_I7505_MCHCFG	0x50
 
 /* VIA register */
 #define VIA_APBASE	0x10
@@ -380,8 +381,7 @@
 
 
 /* Generic routines. */
-void agp_generic_agp_enable(u32 mode);
-void agp_generic_agp_3_0_enable(u32 mode);
+void agp_generic_enable(u32 mode);
 int agp_generic_create_gatt_table(void);
 int agp_generic_free_gatt_table(void);
 agp_memory *agp_create_memory(int scratch_pages);
@@ -399,5 +399,6 @@
 int agp_unregister_driver(struct agp_driver *drv);
 u32 agp_collect_device_status(u32 mode, u32 command);
 void agp_device_command(u32 command, int agp_v3);
+int agp_3_0_node_enable(u32 mode, u32 minor);
 
 #endif				/* _AGP_BACKEND_PRIV_H */
diff -Nru a/drivers/char/agp/ali-agp.c b/drivers/char/agp/ali-agp.c
--- a/drivers/char/agp/ali-agp.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/char/agp/ali-agp.c	Sat Apr 19 19:51:49 2003
@@ -208,7 +208,7 @@
 	agp_bridge->cleanup = ali_cleanup;
 	agp_bridge->tlb_flush = ali_tlbflush;
 	agp_bridge->mask_memory = ali_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = ali_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
diff -Nru a/drivers/char/agp/amd-k7-agp.c b/drivers/char/agp/amd-k7-agp.c
--- a/drivers/char/agp/amd-k7-agp.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/char/agp/amd-k7-agp.c	Sat Apr 19 19:51:51 2003
@@ -368,7 +368,7 @@
 	agp_bridge->cleanup = amd_irongate_cleanup;
 	agp_bridge->tlb_flush = amd_irongate_tlbflush;
 	agp_bridge->mask_memory = amd_irongate_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = amd_create_gatt_table;
 	agp_bridge->free_gatt_table = amd_free_gatt_table;
diff -Nru a/drivers/char/agp/amd-k8-agp.c b/drivers/char/agp/amd-k8-agp.c
--- a/drivers/char/agp/amd-k8-agp.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/char/agp/amd-k8-agp.c	Sat Apr 19 19:51:49 2003
@@ -1,12 +1,12 @@
 /* 
- * Copyright 2001,2002 SuSE Labs
+ * Copyright 2001-2003 SuSE Labs.
  * Distributed under the GNU public license, v2.
  * 
- * This is a GART driver for the AMD K8 northbridge and the AMD 8151 
- * AGP bridge. The main work is done in the northbridge. The configuration
- * is only mirrored in the 8151 for compatibility (could be likely
- * removed now).
- */ 
+ * This is a GART driver for the AMD Opteron/Athlon64 on-CPU northbridge.
+ * It also includes support for the AMD 8151 AGP bridge,
+ * although it doesn't actually do much, as all the real
+ * work is done in the northbridge(s).
+ */
 
 /*
  * On x86-64 the AGP driver needs to be initialized early by the IOMMU 
@@ -224,7 +224,7 @@
 
 static struct gatt_mask amd_8151_masks[] =
 {
-	{0x00000001, 0}
+	{.mask = 0x00000001, .type = 0}
 };
 
 
@@ -265,7 +265,7 @@
 	/* If not enough, go to AGP v2 setup */
 	if (v3_devs<2) {
 		printk (KERN_INFO "AGP: Only %d devices found, not enough, trying AGPv2\n", v3_devs);
-		return agp_generic_agp_enable(mode);
+		return agp_generic_enable(mode);
 	} else {
 		printk (KERN_INFO "AGP: Enough AGPv3 devices found, setting up...\n");
 	}
@@ -339,6 +339,8 @@
 	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
 	if (cap_ptr == 0)
 		return -ENODEV;
+
+	printk (KERN_INFO PFX "Detected Opteron/Athlon64 on-CPU GART\n");
 
 	agp_bridge->dev = dev;
 	agp_bridge->capndx = cap_ptr;
diff -Nru a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c
--- a/drivers/char/agp/backend.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/char/agp/backend.c	Sat Apr 19 19:51:49 2003
@@ -1,6 +1,6 @@
 /*
  * AGPGART driver backend routines.
- * Copyright (C) 2002 Dave Jones.
+ * Copyright (C) 2002-2003 Dave Jones.
  * Copyright (C) 1999 Jeff Hartmann.
  * Copyright (C) 1999 Precision Insight, Inc.
  * Copyright (C) 1999 Xi Graphics, Inc.
diff -Nru a/drivers/char/agp/frontend.c b/drivers/char/agp/frontend.c
--- a/drivers/char/agp/frontend.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/char/agp/frontend.c	Sat Apr 19 19:51:28 2003
@@ -1,6 +1,6 @@
 /*
  * AGPGART driver frontend
- * Copyright (C) 2002 Dave Jones
+ * Copyright (C) 2002-2003 Dave Jones
  * Copyright (C) 1999 Jeff Hartmann
  * Copyright (C) 1999 Precision Insight, Inc.
  * Copyright (C) 1999 Xi Graphics, Inc.
diff -Nru a/drivers/char/agp/generic-3.0.c b/drivers/char/agp/generic-3.0.c
--- a/drivers/char/agp/generic-3.0.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/char/agp/generic-3.0.c	Sat Apr 19 19:51:28 2003
@@ -319,10 +319,10 @@
  * Fully configure and enable an AGP 3.0 host bridge and all the devices
  * lying behind it.
  */
-static int agp_3_0_node_enable(u32 mode, u32 minor)
+int agp_3_0_node_enable(u32 mode, u32 minor)
 {
 	struct pci_dev *td = agp_bridge->dev, *dev;
-	u8 bus_num, mcapndx;
+	u8 mcapndx;
 	u32 isoch, arqsz, cal_cycle, tmp, rate;
 	u32 tstatus, tcmd, mcmd, mstatus, ncapid;
 	u32 mmajor, mminor;
@@ -343,23 +343,30 @@
 	head = &dev_list->list;
 	INIT_LIST_HEAD(head);
 
-	/* 
-	 * Find all the devices on this bridge's secondary bus and add them
-	 * to dev_list. 
-	 */
-	pci_read_config_byte(td, PCI_SECONDARY_BUS, &bus_num);
-	pci_for_each_dev(dev) {
-		if(dev->bus->number == bus_num) {
-			if((cur = kmalloc(sizeof(*cur), GFP_KERNEL)) == NULL) {
-				ret = -ENOMEM;
-				goto free_and_exit;
-			}
-			
-			cur->dev = dev;
+	/* Find all AGP devices, and add them to dev_list. */
+	pci_for_each_dev(dev) { 
+		switch ((dev->class >>8) & 0xff00) {
+			case 0x0001:    /* Unclassified device */
+			case 0x0300:    /* Display controller */
+			case 0x0400:    /* Multimedia controller */
+			case 0x0600:    /* Bridge */
+				mcapndx = pci_find_capability(dev, PCI_CAP_ID_AGP);
+				if (mcapndx == 0)
+					continue;
+
+				if((cur = kmalloc(sizeof(*cur), GFP_KERNEL)) == NULL) {
+					ret = -ENOMEM;
+					goto free_and_exit;
+				}
+				cur->dev = dev;
+
+				pos = &cur->list;
+				list_add(pos, head);
+				ndevs++;
+				continue;
 
-			pos = &cur->list;
-			list_add(pos, head);
-			ndevs++;
+			default:
+				continue;
 		}
 	}
 
@@ -518,33 +525,5 @@
 	return ret;
 }
 
-/* 
- * Entry point to AGP 3.0 host bridge init.  Check to see if we 
- * have an AGP 3.0 device operating in 3.0 mode.  Call 
- * agp_3_0_node_enable or agp_generic_agp_enable if we don't 
- * (AGP 3.0 devices are required to operate as AGP 2.0 devices 
- * when not using 3.0 electricals.
- */
-void agp_generic_agp_3_0_enable(u32 mode)
-{
-	u32 ncapid, major, minor, agp_3_0;
-
-	pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx, &ncapid);
-
-	major = (ncapid >> 20) & 0xf;
-	minor = (ncapid >> 16) & 0xf;
-
-	printk(KERN_INFO PFX "Found an AGP %d.%d compliant device.\n",major, minor);
-
-	if(major >= 3) {
-		pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx + 0x4, &agp_3_0);
-		/* 
-		 * Check to see if we are operating in 3.0 mode 
-		 */
-		if((agp_3_0 >> 3) & 0x1)
-			agp_3_0_node_enable(mode, minor);
-	}
-}
-
-EXPORT_SYMBOL(agp_generic_agp_3_0_enable);
+EXPORT_SYMBOL_GPL(agp_3_0_node_enable);
 
diff -Nru a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
--- a/drivers/char/agp/generic.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/char/agp/generic.c	Sat Apr 19 19:51:46 2003
@@ -34,6 +34,7 @@
 #include <linux/miscdevice.h>
 #include <linux/pm.h>
 #include <linux/agp_backend.h>
+#include <linux/vmalloc.h>
 #include "agp.h"
 
 __u32 *agp_gatt_table; 
@@ -392,21 +393,37 @@
 	}
 }
 
-void agp_generic_agp_enable(u32 mode)
+void agp_generic_enable(u32 mode)
 {
-	u32 command;
+	u32 command, ncapid, major, minor;
 
+	pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx, &ncapid);
+	major = (ncapid >> 20) & 0xf;
+	minor = (ncapid >> 16) & 0xf;
+	printk(KERN_INFO PFX "Found an AGP %d.%d compliant device.\n",major, minor);
+
+	if(major >= 3) {
+		u32 agp_3_0;
+
+		pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx + 0x4, &agp_3_0);
+		/* Check to see if we are operating in 3.0 mode */
+		if((agp_3_0 >> 3) & 0x1) {
+			agp_3_0_node_enable(mode, minor);
+			return;
+		} else {
+			printk (KERN_INFO PFX "not in AGP 3.0 mode, falling back to 2.x\n");
+		}
+	}
+
+	/* AGP v<3 */
 	pci_read_config_dword(agp_bridge->dev,
-			      agp_bridge->capndx + PCI_AGP_STATUS,
-			      &command);
+		      agp_bridge->capndx + PCI_AGP_STATUS, &command);
 
 	command = agp_collect_device_status(mode, command);
 	command |= 0x100;
 
 	pci_write_config_dword(agp_bridge->dev,
-			       agp_bridge->capndx + PCI_AGP_COMMAND,
-			       command);
-
+		       agp_bridge->capndx + PCI_AGP_COMMAND, command);
 	agp_device_command(command, 0);
 }
 
@@ -745,7 +762,7 @@
 EXPORT_SYMBOL(agp_generic_destroy_page);
 EXPORT_SYMBOL(agp_generic_suspend);
 EXPORT_SYMBOL(agp_generic_resume);
-EXPORT_SYMBOL(agp_generic_agp_enable);
+EXPORT_SYMBOL(agp_generic_enable);
 EXPORT_SYMBOL(agp_generic_create_gatt_table);
 EXPORT_SYMBOL(agp_generic_free_gatt_table);
 EXPORT_SYMBOL(agp_generic_insert_memory);
diff -Nru a/drivers/char/agp/hp-agp.c b/drivers/char/agp/hp-agp.c
--- a/drivers/char/agp/hp-agp.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/agp/hp-agp.c	Sat Apr 19 19:51:50 2003
@@ -339,7 +339,7 @@
 	agp_bridge->cleanup = hp_zx1_cleanup;
 	agp_bridge->tlb_flush = hp_zx1_tlbflush;
 	agp_bridge->mask_memory = hp_zx1_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = hp_zx1_create_gatt_table;
 	agp_bridge->free_gatt_table = hp_zx1_free_gatt_table;
@@ -369,7 +369,7 @@
 }
 
 static struct agp_driver hp_agp_driver = {
-	.owner = THIS_MODULE;
+	.owner = THIS_MODULE,
 };
 
 static int __init agp_hp_probe (struct pci_dev *dev, const struct pci_device_id *ent)
@@ -394,7 +394,7 @@
 	{ }
 };
 
-MODULE_DEVICE_TABLE(pci, agp_pci_table);
+MODULE_DEVICE_TABLE(pci, agp_hp_pci_table);
 
 static struct __initdata pci_driver agp_hp_pci_driver = {
 	.name		= "agpgart-hp",
diff -Nru a/drivers/char/agp/i460-agp.c b/drivers/char/agp/i460-agp.c
--- a/drivers/char/agp/i460-agp.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/char/agp/i460-agp.c	Sat Apr 19 19:51:48 2003
@@ -536,7 +536,7 @@
 	agp_bridge->cleanup = i460_cleanup;
 	agp_bridge->tlb_flush = i460_tlb_flush;
 	agp_bridge->mask_memory = i460_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = i460_create_gatt_table;
 	agp_bridge->free_gatt_table = i460_free_gatt_table;
@@ -560,7 +560,7 @@
 }
 
 static struct agp_driver i460_agp_driver = {
-	.owner = THIS_MODULE;
+	.owner = THIS_MODULE,
 };
 
 static int __init agp_intel_i460_probe (struct pci_dev *dev, const struct pci_device_id *ent)
diff -Nru a/drivers/char/agp/i7x05-agp.c b/drivers/char/agp/i7x05-agp.c
--- a/drivers/char/agp/i7x05-agp.c	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,234 +0,0 @@
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/init.h>
-#include <linux/agp_backend.h>
-#include "agp.h"
-
-static int intel_7505_fetch_size(void)
-{
-	int i;
-	u16 tmp;
-	aper_size_info_16 *values;
-
-	/* 
-	 * For AGP 3.0 APSIZE is now 16 bits
-	 */
-	pci_read_config_word (agp_bridge->dev, INTEL_I7505_APSIZE, &tmp);
-	tmp = (tmp & 0xfff);
-	
-	values = A_SIZE_16(agp_bridge->aperture_sizes);
-
-	for (i=0; i < agp_bridge->num_aperture_sizes; i++) {
-		if (tmp == values[i].size_value) {
-			agp_bridge->previous_size = agp_bridge->current_size =
-					(void *)(values + i);
-			agp_bridge->aperture_size_idx = i;
-			return values[i].size;
-		}
-	}
-	return 0;
-}
-
-
-static void intel_7505_tlbflush(agp_memory *mem)
-{
-	u32 temp;
-	pci_read_config_dword(agp_bridge->dev, INTEL_I7505_AGPCTRL, &temp);
-	pci_write_config_dword(agp_bridge->dev, INTEL_I7505_AGPCTRL, temp & ~(1 << 7));
-	pci_read_config_dword(agp_bridge->dev, INTEL_I7505_AGPCTRL, &temp);
-	pci_write_config_dword(agp_bridge->dev, INTEL_I7505_AGPCTRL, temp | (1 << 7));
-}
-
-static void intel_7505_cleanup(void)
-{
-	aper_size_info_16 *previous_size;
-
-	previous_size = A_SIZE_16(agp_bridge->previous_size);
-	pci_write_config_byte(agp_bridge->dev, INTEL_I7505_APSIZE,
-			      previous_size->size_value);
-}
-
-
-static int intel_7505_configure(void)
-{
-	u32 temp;
-	aper_size_info_16 *current_size;
-	
-	current_size = A_SIZE_16(agp_bridge->current_size);
-
-	/* aperture size */
-	pci_write_config_word(agp_bridge->dev, INTEL_I7505_APSIZE,
-			      current_size->size_value);
-
-	/* address to map to */
-	pci_read_config_dword(agp_bridge->dev, INTEL_I7505_NAPBASELO, &temp);
-	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
-
-	/* attbase */ 
-	pci_write_config_dword(agp_bridge->dev, INTEL_I7505_ATTBASE,
-			       agp_bridge->gatt_bus_addr);
-
-	/* agpctrl */
-	pci_write_config_dword(agp_bridge->dev, INTEL_I7505_AGPCTRL, 0x0000);
-
-	/* clear error registers */
-	pci_write_config_byte(agp_bridge->dev, INTEL_I7505_ERRSTS, 0xff);
-	return 0;
-}
-
-static aper_size_info_16 intel_7505_sizes[7] =
-{
-	{256, 65536, 6, 0xf00},
-	{128, 32768, 5, 0xf20},
-	{64, 16384, 4, 0xf30},
-	{32, 8192, 3, 0xf38},
-	{16, 4096, 2, 0xf3c},
-	{8, 2048, 1, 0xf3e},
-	{4, 1024, 0, 0xf3f}
-};
-
-static void i7505_setup (u32 mode)
-{
-	if ((agp_generic_agp_3_0_enable)==FALSE)
-		agp_generic_agp_enable(mode);
-}
-
-static int __init intel_7505_setup (struct pci_dev *pdev)
-{
-	agp_bridge->masks = intel_generic_masks;
-	agp_bridge->aperture_sizes = (void *) intel_7505_sizes;
-	agp_bridge->size_type = U16_APER_SIZE;
-	agp_bridge->num_aperture_sizes = 7;
-	agp_bridge->dev_private_data = NULL;
-	agp_bridge->needs_scratch_page = FALSE;
-	agp_bridge->configure = intel_7505_configure;
-	agp_bridge->fetch_size = intel_7505_fetch_size;
-	agp_bridge->cleanup = intel_7505_cleanup;
-	agp_bridge->tlb_flush = intel_7505_tlbflush;
-	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = i7505_enable;
-	agp_bridge->cache_flush = global_cache_flush;
-	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
-	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
-	agp_bridge->insert_memory = agp_generic_insert_memory;
-	agp_bridge->remove_memory = agp_generic_remove_memory;
-	agp_bridge->alloc_by_type = agp_generic_alloc_by_type;
-	agp_bridge->free_by_type = agp_generic_free_by_type;
-	agp_bridge->agp_alloc_page = agp_generic_alloc_page;
-	agp_bridge->agp_destroy_page = agp_generic_destroy_page;
-	agp_bridge->suspend = agp_generic_suspend;
-	agp_bridge->resume = agp_generic_resume;
-	agp_bridge->cant_use_aperture = 0;
-	return 0;
-}
-
-struct agp_device_ids i7x05_agp_device_ids[] __initdata =
-{
-	{
-		.device_id	= PCI_DEVICE_ID_INTEL_7505_0,
-		.chipset	= INTEL_I7505,
-		.chipset_name	= "i7505",
-	},
-	{
-		.device_id	= PCI_DEVICE_ID_INTEL_7205_0,
-		.chipset	= INTEL_I7505,
-		.chipset_name	= "i7205",
-	},
-	{ }, /* dummy final entry, always present */
-};
-
-/* scan table above for supported devices */
-static int __init agp_lookup_host_bridge (struct pci_dev *pdev)
-{
-	int j=0;
-	struct agp_device_ids *devs;
-	
-	devs = i7x05_agp_device_ids;
-
-	while (devs[j].chipset_name != NULL) {
-		if (pdev->device == devs[j].device_id) {
-			printk (KERN_INFO PFX "Detected Intel %s chipset\n",
-				devs[j].chipset_name);
-			agp_bridge->type = devs[j].chipset;
-
-			if (devs[j].chipset_setup != NULL)
-				return devs[j].chipset_setup(pdev);
-			else
-				return intel_7505_setup(pdev);
-		}
-		j++;
-	}
-
-	printk(KERN_ERR PFX "Unsupported Intel chipset (device id: %04x),",
-		pdev->device);
-	return -ENODEV;
-}
-
-static struct agp_driver i7x05_agp_driver = {
-	.owner = THIS_MODULE;
-};
-
-static int __init agp_i7x05_probe (struct pci_dev *dev, const struct pci_device_id *ent)
-{
-	u8 cap_ptr = 0;
-
-	cap_ptr = pci_find_capability(dev, PCI_CAP_ID_AGP);
-	if (cap_ptr == 0)
-		return -ENODEV;
-
-	if (agp_lookup_host_bridge(dev) != -ENODEV) {
-		agp_bridge->dev = dev;
-		agp_bridge->capndx = cap_ptr;
-		/* Fill in the mode register */
-		pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx+PCI_AGP_STATUS, &agp_bridge->mode)
-		i7x05_agp_driver.dev = dev;
-		agp_register_driver(&i7x05_agp_driver);
-		return 0;
-	}
-	return -ENODEV;
-}
-
-
-static struct pci_device_id agp_i7x05_pci_table[] __initdata = {
-	{
-	.class		= (PCI_CLASS_BRIDGE_HOST << 8),
-	.class_mask	= ~0,
-	.vendor		= PCI_VENDOR_ID_INTEL,
-	.device		= PCI_ANY_ID,
-	.subvendor	= PCI_ANY_ID,
-	.subdevice	= PCI_ANY_ID,
-	},
-	{ }
-};
-
-MODULE_DEVICE_TABLE(pci, agp_i7x05_pci_table);
-
-static struct __initdata pci_driver agp_i7x05_pci_driver = {
-	.name		= "agpgart-i7x05",
-	.id_table	= agp_i7x05_pci_table,
-	.probe		= agp_i7x05_probe,
-};
-
-int __init agp_i7x05_init(void)
-{
-	int ret_val;
-
-	ret_val = pci_module_init(&agp_i7x05_pci_driver);
-	if (ret_val)
-		agp_bridge->type = NOT_SUPPORTED;
-
-	return ret_val;
-}
-
-static void __exit agp_i7x05_cleanup(void)
-{
-	agp_unregister_driver(&i7x05_agp_driver);
-	pci_unregister_driver(&agp_i7x05_pci_driver);
-}
-
-module_init(agp_i7x05_init);
-module_exit(agp_i7x05_cleanup);
-
-MODULE_AUTHOR("Matthew E Tolentino <matthew.e.tolentino@intel.com>");
-MODULE_LICENSE("GPL and additional rights");
-
diff -Nru a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
--- a/drivers/char/agp/intel-agp.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/char/agp/intel-agp.c	Sat Apr 19 19:51:47 2003
@@ -960,6 +960,34 @@
 	return 0;
 }
 
+static int intel_7505_configure(void)
+{
+	u32 temp;
+	u16 temp2;
+	struct aper_size_info_8 *current_size;
+
+	current_size = A_SIZE_8(agp_bridge->current_size);
+
+	/* aperture size */
+	pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
+
+	/* address to map to */
+	pci_read_config_dword(agp_bridge->dev, INTEL_APBASE, &temp);
+	agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
+
+	/* attbase - aperture base */
+	pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
+
+	/* agpctrl */
+	pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
+
+	/* mchcfg */
+	pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
+	pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
+	
+	return 0;
+}
+
 static unsigned long intel_mask_memory(unsigned long addr, int type)
 {
 	/* Memory type is ignored */
@@ -1026,7 +1054,7 @@
 	agp_bridge->cleanup = intel_cleanup;
 	agp_bridge->tlb_flush = intel_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1055,7 +1083,7 @@
 	agp_bridge->cleanup = intel_8xx_cleanup;
 	agp_bridge->tlb_flush = intel_8xx_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1085,7 +1113,7 @@
 	agp_bridge->cleanup = intel_820_cleanup;
 	agp_bridge->tlb_flush = intel_820_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1114,7 +1142,7 @@
 	agp_bridge->cleanup = intel_8xx_cleanup;
 	agp_bridge->tlb_flush = intel_8xx_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1143,7 +1171,7 @@
 	agp_bridge->cleanup = intel_8xx_cleanup;
 	agp_bridge->tlb_flush = intel_8xx_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1172,7 +1200,7 @@
 	agp_bridge->cleanup = intel_8xx_cleanup;
 	agp_bridge->tlb_flush = intel_8xx_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1201,7 +1229,7 @@
 	agp_bridge->cleanup = intel_8xx_cleanup;
 	agp_bridge->tlb_flush = intel_8xx_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1230,7 +1258,7 @@
 	agp_bridge->cleanup = intel_8xx_cleanup;
 	agp_bridge->tlb_flush = intel_8xx_tlbflush;
 	agp_bridge->mask_memory = intel_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -1246,6 +1274,34 @@
 	return 0;
 }
 
+static int __init intel_7505_setup (struct pci_dev *pdev)
+{
+	agp_bridge->masks = intel_generic_masks;
+	agp_bridge->aperture_sizes = (void *) intel_8xx_sizes;
+	agp_bridge->size_type = U8_APER_SIZE;
+	agp_bridge->num_aperture_sizes = 7;
+	agp_bridge->dev_private_data = NULL;
+	agp_bridge->needs_scratch_page = FALSE;
+	agp_bridge->configure = intel_7505_configure;
+	agp_bridge->fetch_size = intel_8xx_fetch_size;
+	agp_bridge->cleanup = intel_8xx_cleanup;
+	agp_bridge->tlb_flush = intel_8xx_tlbflush;
+	agp_bridge->mask_memory = intel_mask_memory;
+	agp_bridge->agp_enable = agp_generic_enable;
+	agp_bridge->cache_flush = global_cache_flush;
+	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
+	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
+	agp_bridge->insert_memory = agp_generic_insert_memory;
+	agp_bridge->remove_memory = agp_generic_remove_memory;
+	agp_bridge->alloc_by_type = agp_generic_alloc_by_type;
+	agp_bridge->free_by_type = agp_generic_free_by_type;
+	agp_bridge->agp_alloc_page = agp_generic_alloc_page;
+	agp_bridge->agp_destroy_page = agp_generic_destroy_page;
+	agp_bridge->suspend = agp_generic_suspend;
+	agp_bridge->resume = agp_generic_resume;
+	agp_bridge->cant_use_aperture = 0;
+	return 0;
+}
 struct agp_device_ids intel_agp_device_ids[] __initdata =
 {
 	{
@@ -1328,6 +1384,18 @@
 		.chipset	= INTEL_I865_G,
 		.chipset_name	= "865G",
 		.chipset_setup	= intel_845_setup
+	},
+	{
+		.device_id	= PCI_DEVICE_ID_INTEL_7505_0,
+		.chipset	= INTEL_E7505,
+		.chipset_name	= "E7505",
+		.chipset_setup	= intel_7505_setup
+	},
+	{
+		.device_id	= PCI_DEVICE_ID_INTEL_7205_0,
+		.chipset	= INTEL_E7505,
+		.chipset_name	= "E7205",
+		.chipset_setup	= intel_7505_setup
 	},
 	{ }, /* dummy final entry, always present */
 };
diff -Nru a/drivers/char/agp/sis-agp.c b/drivers/char/agp/sis-agp.c
--- a/drivers/char/agp/sis-agp.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/char/agp/sis-agp.c	Sat Apr 19 19:51:28 2003
@@ -99,7 +99,7 @@
 	agp_bridge->cleanup = sis_cleanup;
 	agp_bridge->tlb_flush = sis_tlbflush;
 	agp_bridge->mask_memory = sis_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
diff -Nru a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c
--- a/drivers/char/agp/via-agp.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/agp/via-agp.c	Sat Apr 19 19:51:50 2003
@@ -101,7 +101,6 @@
 };
 
 
-#ifdef CONFIG_AGP3
 static int via_fetch_size_agp3(void)
 {
 	int i;
@@ -186,7 +185,7 @@
 	agp_bridge->num_aperture_sizes = 10;
 	agp_bridge->dev_private_data = NULL;
 	agp_bridge->needs_scratch_page = FALSE;
-	agp_bridge->agp_enable = agp_generic_agp_3_0_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->configure = via_configure_agp3;
 	agp_bridge->fetch_size = via_fetch_size_agp3;
 	agp_bridge->cleanup = via_cleanup_agp3;
@@ -206,18 +205,10 @@
 	agp_bridge->cant_use_aperture = 0;
 	return 0;
 }
-#else
-static int __init via_generic_agp3_setup (struct pci_dev *pdev)
-{
-	printk (KERN_INFO PFX "Bridge in AGP3 mode, but CONFIG_AGP3=n\n");
-	return -ENODEV;
-}
-#endif	/* CONFIG_AGP3 */
 
 
 static int __init via_generic_setup (struct pci_dev *pdev)
 {
-#ifdef CONFIG_AGP3
 	/* Garg, there are KT400s with KT266 IDs. */
 	if (pdev->device == PCI_DEVICE_ID_VIA_8367_0) {
 
@@ -235,7 +226,6 @@
 			/* Its in 2.0 mode, drop through. */
 		}
 	}
-#endif
 
 	agp_bridge->masks = via_generic_masks;
 	agp_bridge->aperture_sizes = (void *) via_generic_sizes;
@@ -248,7 +238,7 @@
 	agp_bridge->cleanup = via_cleanup;
 	agp_bridge->tlb_flush = via_tlbflush;
 	agp_bridge->mask_memory = via_mask_memory;
-	agp_bridge->agp_enable = agp_generic_agp_enable;
+	agp_bridge->agp_enable = agp_generic_enable;
 	agp_bridge->cache_flush = global_cache_flush;
 	agp_bridge->create_gatt_table = agp_generic_create_gatt_table;
 	agp_bridge->free_gatt_table = agp_generic_free_gatt_table;
@@ -319,10 +309,10 @@
 	},
 
 	/* VT8361 */
-/*	{
+	{
 		.device_id	= PCI_DEVICE_ID_VIA_8361,	// 0x3112
 		.chipset_name	= "Apollo KLE133",
-	}, */
+	},
 
 	/* VT8365 / VT8362 */
 	{
@@ -331,10 +321,10 @@
 	},
 
 	/* VT8753A */
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_8753_0,	// 0x3128
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_8753_0,
 		.chipset_name	= "P4X266",
-	},	*/	
+	},
 
 	/* VT8366 */
 	{
@@ -349,16 +339,16 @@
 	},
 
 	/* KM266 / PM266 */
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_KM266,	// 0x3116
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_KM266,
 		.chipset_name	= "KM266/PM266",
-	},	*/
+	},
 
 	/* CLE266 */
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_CLE266,	// 0x3123
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_CLE266,
 		.chipset_name	= "CLE266",
-	},	*/
+	},
 
 	{
 		.device_id	= PCI_DEVICE_ID_VIA_8377_0,
@@ -374,16 +364,16 @@
 	},
 
 	/* VT8752*/
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_8752,	// 0x3148
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_8752,
 		.chipset_name	= "ProSavage DDR P4M266",
-	},	*/
+	},
 
 	/* KN266/PN266 */
-/*	{
-		.device_id	= PCI_DEVICE_ID_KN266,	// 0x3156
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_KN266,
 		.chipset_name	= "KN266/PN266",
-	},	*/
+	},
 
 	/* VT8754 */
 	{
@@ -392,28 +382,28 @@
 	},
 
 	/* P4N333 */
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_P4N333,	// 0x3178
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_P4N333,
 		.chipset_name	= "P4N333",
-	}, */
+	},
 
 	/* P4X600 */
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_P4X600,	// 0x0198
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_P4X600,
 		.chipset_name	= "P4X600",
-	},	*/
+	},
 
 	/* KM400 */
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_KM400,	// 0x3205
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_KM400,
 		.chipset_name	= "KM400",
-	},	*/
+	},
 
 	/* P4M400 */
-/*	{
-		.device_id	= PCI_DEVICE_ID_VIA_P4M400,	// 0x3209
+	{
+		.device_id	= PCI_DEVICE_ID_VIA_P4M400,
 		.chipset_name	= "PM400",
-	},	*/
+	},
 
 	{ }, /* dummy final entry, always present */
 };
diff -Nru a/drivers/char/applicom.c b/drivers/char/applicom.c
--- a/drivers/char/applicom.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/applicom.c	Sat Apr 19 19:51:50 2003
@@ -29,22 +29,12 @@
 #include <linux/pci.h>
 #include <linux/wait.h>
 #include <linux/init.h>
-#include <linux/compatmac.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
 
 #include "applicom.h"
 
-#if LINUX_VERSION_CODE < 0x20300 
-/* These probably want adding to <linux/compatmac.h> */
-#define init_waitqueue_head(x) do { *(x) = NULL; } while (0)
-#define PCI_BASE_ADDRESS(dev) (dev->base_address[0])
-#define DECLARE_WAIT_QUEUE_HEAD(x) struct wait_queue *x
-#define __setup(x,y) /* */
-#else
-#define PCI_BASE_ADDRESS(dev) (dev->resource[0].start)
-#endif
 
 /* NOTE: We use for loops with {write,read}b() instead of 
    memcpy_{from,to}io throughout this driver. This is because
@@ -220,18 +210,18 @@
 		if (pci_enable_device(dev))
 			return -EIO;
 
-		RamIO = ioremap(PCI_BASE_ADDRESS(dev), LEN_RAM_IO);
+		RamIO = ioremap(dev->resource[0].start, LEN_RAM_IO);
 
 		if (!RamIO) {
-			printk(KERN_INFO "ac.o: Failed to ioremap PCI memory space at 0x%lx\n", PCI_BASE_ADDRESS(dev));
+			printk(KERN_INFO "ac.o: Failed to ioremap PCI memory space at 0x%lx\n", dev->resource[0].start);
 			return -EIO;
 		}
 
 		printk(KERN_INFO "Applicom %s found at mem 0x%lx, irq %d\n",
-		       applicom_pci_devnames[dev->device-1], PCI_BASE_ADDRESS(dev), 
+		       applicom_pci_devnames[dev->device-1], dev->resource[0].start, 
 		       dev->irq);
 
-		if (!(boardno = ac_register_board(PCI_BASE_ADDRESS(dev),
+		if (!(boardno = ac_register_board(dev->resource[0].start,
 						  (unsigned long)RamIO,0))) {
 			printk(KERN_INFO "ac.o: PCI Applicom device doesn't have correct signature.\n");
 			iounmap(RamIO);
diff -Nru a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h
--- a/drivers/char/drm/drmP.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/char/drm/drmP.h	Sat Apr 19 19:51:49 2003
@@ -242,17 +242,17 @@
 			DRM(ioremapfree)( (map)->handle, (map)->size );	\
 	} while (0)
 
-#define DRM_FIND_MAP(_map, _o)						\
-do {									\
-	struct list_head *_list;					\
-	list_for_each( _list, &dev->maplist->head ) {			\
-		drm_map_list_t *_entry = (drm_map_list_t *)_list;	\
-		if ( _entry->map &&					\
-		     _entry->map->offset == (_o) ) {			\
-			(_map) = _entry->map;				\
-			break;						\
- 		}							\
-	}								\
+#define DRM_FIND_MAP(_map, _o)								\
+do {											\
+	struct list_head *_list;							\
+	list_for_each( _list, &dev->maplist->head ) {					\
+		drm_map_list_t *_entry = list_entry( _list, drm_map_list_t, head );	\
+		if ( _entry->map &&							\
+		     _entry->map->offset == (_o) ) {					\
+			(_map) = _entry->map;						\
+			break;								\
+ 		}									\
+	}										\
 } while(0)
 #define DRM_DROP_MAP(_map)
 
diff -Nru a/drivers/char/drm/drm_agpsupport.h b/drivers/char/drm/drm_agpsupport.h
--- a/drivers/char/drm/drm_agpsupport.h	Sat Apr 19 19:51:27 2003
+++ b/drivers/char/drm/drm_agpsupport.h	Sat Apr 19 19:51:27 2003
@@ -266,12 +266,6 @@
 		head->cant_use_aperture = head->agp_info.cant_use_aperture;
 		head->page_mask = head->agp_info.page_mask;
 #endif
-
-		DRM_INFO("AGP %d.%d aperture @ 0x%08lx %ZuMB\n",
-			 head->agp_info.version.major,
-			 head->agp_info.version.minor,
-			 head->agp_info.aper_base,
-			 head->agp_info.aper_size);
 	}
 	return head;
 }
diff -Nru a/drivers/char/drm/drm_bufs.h b/drivers/char/drm/drm_bufs.h
--- a/drivers/char/drm/drm_bufs.h	Sat Apr 19 19:51:29 2003
+++ b/drivers/char/drm/drm_bufs.h	Sat Apr 19 19:51:29 2003
@@ -106,7 +106,7 @@
 	switch ( map->type ) {
 	case _DRM_REGISTERS:
 	case _DRM_FRAME_BUFFER:
-#if !defined(__sparc__) && !defined(__alpha__)
+#if !defined(__sparc__) && !defined(__alpha__) && !defined(__ia64__)
 		if ( map->offset + map->size < map->offset ||
 		     map->offset < virt_to_phys(high_memory) ) {
 			DRM(free)( map, sizeof(*map), DRM_MEM_MAPS );
@@ -210,7 +210,7 @@
 	down(&dev->struct_sem);
 	list = &dev->maplist->head;
 	list_for_each(list, &dev->maplist->head) {
-		r_list = (drm_map_list_t *) list;
+		r_list = list_entry(list, drm_map_list_t, head);
 
 		if(r_list->map &&
 		   r_list->map->handle == request.handle &&
diff -Nru a/drivers/char/drm/drm_context.h b/drivers/char/drm/drm_context.h
--- a/drivers/char/drm/drm_context.h	Sat Apr 19 19:51:27 2003
+++ b/drivers/char/drm/drm_context.h	Sat Apr 19 19:51:27 2003
@@ -194,7 +194,7 @@
 
 	down(&dev->struct_sem);
 	list_for_each(list, &dev->maplist->head) {
-		r_list = (drm_map_list_t *)list;
+		r_list = list_entry(list, drm_map_list_t, head);
 		if(r_list->map &&
 		   r_list->map->handle == request.handle)
 			goto found;
diff -Nru a/drivers/char/drm/drm_dma.h b/drivers/char/drm/drm_dma.h
--- a/drivers/char/drm/drm_dma.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/char/drm/drm_dma.h	Sat Apr 19 19:51:49 2003
@@ -444,7 +444,7 @@
 					d->flags & _DRM_DMA_WAIT);
 		if (!buf) break;
 		if (buf->pending || buf->waiting) {
-			DRM_ERROR("Free buffer %d in use by %x (w%d, p%d)\n",
+			DRM_ERROR("Free buffer %d in use: filp %p (w%d, p%d)\n",
 				  buf->idx,
 				  buf->filp,
 				  buf->waiting,
@@ -651,7 +651,7 @@
 		 * for the same vblank sequence number; nothing to be done in
 		 * that case
 		 */
-		list_for_each( ( (struct list_head *) vbl_sig ), &dev->vbl_sigs.head ) {
+		list_for_each_entry( vbl_sig, &dev->vbl_sigs.head, head ) {
 			if (vbl_sig->sequence == vblwait.request.sequence
 			    && vbl_sig->info.si_signo == vblwait.request.signal
 			    && vbl_sig->task == current)
@@ -702,19 +702,20 @@
 
 void DRM(vbl_send_signals)( drm_device_t *dev )
 {
-	struct list_head *tmp;
+	struct list_head *list, *tmp;
 	drm_vbl_sig_t *vbl_sig;
 	unsigned int vbl_seq = atomic_read( &dev->vbl_received );
 	unsigned long flags;
 
 	spin_lock_irqsave( &dev->vbl_lock, flags );
 
-	list_for_each_safe( ( (struct list_head *) vbl_sig ), tmp, &dev->vbl_sigs.head ) {
+	list_for_each_safe( list, tmp, &dev->vbl_sigs.head ) {
+		vbl_sig = list_entry( list, drm_vbl_sig_t, head );
 		if ( ( vbl_seq - vbl_sig->sequence ) <= (1<<23) ) {
 			vbl_sig->info.si_code = vbl_seq;
 			send_sig_info( vbl_sig->info.si_signo, &vbl_sig->info, vbl_sig->task );
 
-			list_del( (struct list_head *) vbl_sig );
+			list_del( list );
 
 			DRM_FREE( vbl_sig, sizeof(*vbl_sig) );
 
diff -Nru a/drivers/char/drm/drm_ioctl.h b/drivers/char/drm/drm_ioctl.h
--- a/drivers/char/drm/drm_ioctl.h	Sat Apr 19 19:51:29 2003
+++ b/drivers/char/drm/drm_ioctl.h	Sat Apr 19 19:51:29 2003
@@ -204,7 +204,7 @@
 	i = 0;
 	list_for_each(list, &dev->maplist->head) {
 		if(i == idx) {
-			r_list = (drm_map_list_t *)list;
+			r_list = list_entry(list, drm_map_list_t, head);
 			break;
 		}
 		i++;
diff -Nru a/drivers/char/drm/drm_os_linux.h b/drivers/char/drm/drm_os_linux.h
--- a/drivers/char/drm/drm_os_linux.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/drm/drm_os_linux.h	Sat Apr 19 19:51:50 2003
@@ -46,9 +46,8 @@
 
 #define DRM_GETSAREA()							 \
 do { 									 \
-	struct list_head *list;						 \
-	list_for_each( list, &dev->maplist->head ) {			 \
-		drm_map_list_t *entry = (drm_map_list_t *)list;		 \
+	drm_map_list_t *entry;						 \
+	list_for_each_entry( entry, &dev->maplist->head, head ) {	 \
 		if ( entry->map &&					 \
 		     entry->map->type == _DRM_SHM &&			 \
 		     (entry->map->flags & _DRM_CONTAINS_LOCK) ) {	 \
@@ -60,28 +59,28 @@
 
 #define DRM_HZ HZ
 
-#define DRM_WAIT_ON( ret, queue, timeout, condition )	\
-do {							\
-	DECLARE_WAITQUEUE(entry, current);		\
-	unsigned long end = jiffies + (timeout);	\
-	add_wait_queue(&(queue), &entry);		\
-							\
-	for (;;) {					\
-		current->state = TASK_INTERRUPTIBLE;	\
-		if (condition) 				\
-			break;				\
-		if((signed)(end - jiffies) <= 0) {	\
-			ret = -EBUSY;			\
-			break;				\
-		}					\
+#define DRM_WAIT_ON( ret, queue, timeout, condition )		\
+do {								\
+	DECLARE_WAITQUEUE(entry, current);			\
+	unsigned long end = jiffies + (timeout);		\
+	add_wait_queue(&(queue), &entry);			\
+								\
+	for (;;) {						\
+		current->state = TASK_INTERRUPTIBLE;		\
+		if (condition)					\
+			break;					\
+		if (time_after_eq(jiffies, end)) {		\
+			ret = -EBUSY;				\
+			break;					\
+		}						\
 		schedule_timeout((HZ/100 > 1) ? HZ/100 : 1);	\
-		if (signal_pending(current)) {		\
-			ret = -EINTR;			\
-			break;				\
-		}					\
-	}						\
-	current->state = TASK_RUNNING;			\
-	remove_wait_queue(&(queue), &entry);		\
+		if (signal_pending(current)) {			\
+			ret = -EINTR;				\
+			break;					\
+		}						\
+	}							\
+	current->state = TASK_RUNNING;				\
+	remove_wait_queue(&(queue), &entry);			\
 } while (0)
 
 
diff -Nru a/drivers/char/drm/drm_proc.h b/drivers/char/drm/drm_proc.h
--- a/drivers/char/drm/drm_proc.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/char/drm/drm_proc.h	Sat Apr 19 19:51:28 2003
@@ -168,9 +168,9 @@
 	struct list_head *list;
 
 				/* Hardcoded from _DRM_FRAME_BUFFER,
-                                   _DRM_REGISTERS, _DRM_SHM, and
-                                   _DRM_AGP. */
-	const char   *types[] = { "FB", "REG", "SHM", "AGP" };
+                                   _DRM_REGISTERS, _DRM_SHM, _DRM_AGP, and
+                                   _DRM_SCATTER_GATHER. */
+	const char   *types[] = { "FB", "REG", "SHM", "AGP", "SG" };
 	const char   *type;
 	int	     i;
 
@@ -186,10 +186,10 @@
 		       "address mtrr\n\n");
 	i = 0;
 	if (dev->maplist != NULL) list_for_each(list, &dev->maplist->head) {
-		r_list = (drm_map_list_t *)list;
+		r_list = list_entry(list, drm_map_list_t, head);
 		map = r_list->map;
 		if(!map) continue;
-		if (map->type < 0 || map->type > 3) type = "??";
+		if (map->type < 0 || map->type > 4) type = "??";
 		else				    type = types[map->type];
 		DRM_PROC_PRINT("%4d 0x%08lx 0x%08lx %4.4s  0x%02x 0x%08lx ",
 			       i,
diff -Nru a/drivers/char/drm/drm_vm.h b/drivers/char/drm/drm_vm.h
--- a/drivers/char/drm/drm_vm.h	Sat Apr 19 19:51:51 2003
+++ b/drivers/char/drm/drm_vm.h	Sat Apr 19 19:51:51 2003
@@ -73,7 +73,7 @@
 	if(!dev->agp || !dev->agp->cant_use_aperture) goto vm_nopage_error;
 
 	list_for_each(list, &dev->maplist->head) {
-		r_list = (drm_map_list_t *)list;
+		r_list = list_entry(list, drm_map_list_t, head);
 		map = r_list->map;
 		if (!map) continue;
 		if (map->offset == VM_OFFSET(vma)) break;
@@ -189,7 +189,7 @@
 		found_maps = 0;
 		list = &dev->maplist->head;
 		list_for_each(list, &dev->maplist->head) {
-			r_list = (drm_map_list_t *) list;
+			r_list = list_entry(list, drm_map_list_t, head);
 			if (r_list->map == map) found_maps++;
 		}
 
@@ -392,7 +392,7 @@
 	list_for_each(list, &dev->maplist->head) {
 		unsigned long off;
 
-		r_list = (drm_map_list_t *)list;
+		r_list = list_entry(list, drm_map_list_t, head);
 		map = r_list->map;
 		if (!map) continue;
 		off = DRIVER_GET_MAP_OFS();
diff -Nru a/drivers/char/drm/gamma_dma.c b/drivers/char/drm/gamma_dma.c
--- a/drivers/char/drm/gamma_dma.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/drm/gamma_dma.c	Sat Apr 19 19:51:50 2003
@@ -605,7 +605,7 @@
 	memset( dev_priv, 0, sizeof(drm_gamma_private_t) );
 
 	list_for_each(list, &dev->maplist->head) {
-		drm_map_list_t *r_list = (drm_map_list_t *)list;
+		drm_map_list_t *r_list = list_entry(list, drm_map_list_t, head);
 		if( r_list->map &&
 		    r_list->map->type == _DRM_SHM &&
 		    r_list->map->flags & _DRM_CONTAINS_LOCK ) {
@@ -809,7 +809,7 @@
 	down(&dev->struct_sem);
 	r_list = NULL;
 	list_for_each(list, &dev->maplist->head) {
-		r_list = (drm_map_list_t *)list;
+		r_list = list_entry(list, drm_map_list_t, head);
 		if(r_list->map &&
 		   r_list->map->handle == request.handle) break;
 	}
diff -Nru a/drivers/char/drm/i810_dma.c b/drivers/char/drm/i810_dma.c
--- a/drivers/char/drm/i810_dma.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/char/drm/i810_dma.c	Sat Apr 19 19:51:46 2003
@@ -340,7 +340,7 @@
    	memset(dev_priv, 0, sizeof(drm_i810_private_t));
 
 	list_for_each(list, &dev->maplist->head) {
-		drm_map_list_t *r_list = (drm_map_list_t *)list;
+		drm_map_list_t *r_list = list_entry(list, drm_map_list_t, head);
 		if( r_list->map &&
 		    r_list->map->type == _DRM_SHM &&
 		    r_list->map->flags & _DRM_CONTAINS_LOCK ) {
diff -Nru a/drivers/char/drm/i830_dma.c b/drivers/char/drm/i830_dma.c
--- a/drivers/char/drm/i830_dma.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/char/drm/i830_dma.c	Sat Apr 19 19:51:28 2003
@@ -363,7 +363,7 @@
    	memset(dev_priv, 0, sizeof(drm_i830_private_t));
 
 	list_for_each(list, &dev->maplist->head) {
-		drm_map_list_t *r_list = (drm_map_list_t *)list;
+		drm_map_list_t *r_list = list_entry(list, drm_map_list_t, head);
 		if( r_list->map &&
 		    r_list->map->type == _DRM_SHM &&
 		    r_list->map->flags & _DRM_CONTAINS_LOCK ) {
diff -Nru a/drivers/char/epca.c b/drivers/char/epca.c
--- a/drivers/char/epca.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/char/epca.c	Sat Apr 19 19:51:48 2003
@@ -481,9 +481,7 @@
 	-------------------------------------------------------------------------*/
 
 	ch->event |= 1 << event;
-	MOD_INC_USE_COUNT;
-	if (schedule_work(&ch->tqueue) == 0)
-		MOD_DEC_USE_COUNT;
+	schedule_work(&ch->tqueue);
 
 
 } /* End pc_sched_event */
@@ -604,7 +602,6 @@
 		                      ASYNC_CALLOUT_ACTIVE | ASYNC_CLOSING);
 		wake_up_interruptible(&ch->close_wait);
 
-		MOD_DEC_USE_COUNT;
 
 		restore_flags(flags);
 
@@ -692,10 +689,6 @@
 
 		shutdown(ch);
 
-		if (ch->count)
-			MOD_DEC_USE_COUNT;
-		
-
 		ch->tty   = NULL;
 		ch->event = 0;
 		ch->count = 0;
@@ -1389,8 +1382,6 @@
 	}
 
 
-	MOD_INC_USE_COUNT;
-
 	ch = &digi_channels[line];
 	boardnum = ch->boardnum;
 
@@ -1714,6 +1705,7 @@
 	memset(&pc_info, 0, sizeof(struct tty_driver));
 
 	pc_driver.magic = TTY_DRIVER_MAGIC;
+	pc_driver.owner = THIS_MODULE;
 	pc_driver.name = "ttyD"; 
 	pc_driver.major = DIGI_MAJOR; 
 	pc_driver.minor_start = 0;
diff -Nru a/drivers/char/genrtc.c b/drivers/char/genrtc.c
--- a/drivers/char/genrtc.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/genrtc.c	Sat Apr 19 19:51:50 2003
@@ -88,7 +88,7 @@
 
 static unsigned int oldsecs;
 static int lostint;
-static int tt_exp;
+static unsigned long tt_exp;
 
 static void gen_rtc_timer(unsigned long data);
 
diff -Nru a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c
--- a/drivers/char/ipmi/ipmi_devintf.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/ipmi/ipmi_devintf.c	Sat Apr 19 19:51:50 2003
@@ -81,9 +81,9 @@
 	unsigned int             mask = 0;
 	unsigned long            flags;
 
-	spin_lock_irqsave(&priv->recv_msg_lock, flags);
-
 	poll_wait(file, &priv->wait, wait);
+
+	spin_lock_irqsave(&priv->recv_msg_lock, flags);
 
 	if (! list_empty(&(priv->recv_msgs)))
 		mask |= (POLLIN | POLLRDNORM);
diff -Nru a/drivers/char/ipmi/ipmi_kcs_intf.c b/drivers/char/ipmi/ipmi_kcs_intf.c
--- a/drivers/char/ipmi/ipmi_kcs_intf.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/char/ipmi/ipmi_kcs_intf.c	Sat Apr 19 19:51:27 2003
@@ -629,6 +629,18 @@
 	atomic_set(&kcs_info->req_events, 1);
 }
 
+static int new_user(void *send_info)
+{
+	if (!try_module_get(THIS_MODULE))
+		return -EBUSY;
+	return 0;
+}
+
+static void user_left(void *send_info)
+{
+	module_put(THIS_MODULE);
+}
+
 static int initialized = 0;
 
 /* Must be called with interrupts off and with the kcs_lock held. */
diff -Nru a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
--- a/drivers/char/ipmi/ipmi_msghandler.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/char/ipmi/ipmi_msghandler.c	Sat Apr 19 19:51:48 2003
@@ -345,7 +345,7 @@
 	unsigned int i;
 
 	for (i=intf->curr_seq;
-	     i!=(intf->curr_seq-1);
+	     (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq;
 	     i=(i+1)%IPMI_IPMB_NUM_SEQ)
 	{
 		if (! intf->seq_table[i].inuse)
@@ -907,8 +907,6 @@
 				   probably, so abort. */
 				spin_unlock_irqrestore(&(intf->seq_lock),
 						       flags);
-				ipmi_free_recv_msg(recv_msg);
-				ipmi_free_smi_msg(smi_msg);
 				goto out_err;
 			}
 
diff -Nru a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c
--- a/drivers/char/ipmi/ipmi_watchdog.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/ipmi/ipmi_watchdog.c	Sat Apr 19 19:51:50 2003
@@ -751,7 +751,7 @@
 {
 	int rv = -EBUSY;
 
-	down_read(&register_sem);
+	down_write(&register_sem);
 	if (watchdog_user)
 		goto out;
 
@@ -917,7 +917,7 @@
 	} else if (strcmp(preaction, "pre_int") == 0) {
 		preaction_val = WDOG_PRETIMEOUT_MSG_INT;
 	} else {
-		action_val = WDOG_PRETIMEOUT_NONE;
+		preaction_val = WDOG_PRETIMEOUT_NONE;
 		printk("ipmi_watchdog: Unknown preaction '%s', defaulting to"
 		       " none\n", preaction);
 	}
@@ -929,7 +929,7 @@
 	} else if (strcmp(preop, "preop_give_data") == 0) {
 		preop_val = WDOG_PREOP_GIVE_DATA;
 	} else {
-		action_val = WDOG_PREOP_NONE;
+		preop_val = WDOG_PREOP_NONE;
 		printk("ipmi_watchdog: Unknown preop '%s', defaulting to"
 		       " none\n", preop);
 	}
diff -Nru a/drivers/char/misc.c b/drivers/char/misc.c
--- a/drivers/char/misc.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/char/misc.c	Sat Apr 19 19:51:50 2003
@@ -166,8 +166,8 @@
  
 int misc_register(struct miscdevice * misc)
 {
-	static devfs_handle_t devfs_handle, dir;
 	struct miscdevice *c;
+	char buf[256];
 	
 	if (misc->next || misc->prev)
 		return -EBUSY;
@@ -195,14 +195,16 @@
 	}
 	if (misc->minor < DYNAMIC_MINORS)
 		misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
-	if (!devfs_handle)
-		devfs_handle = devfs_mk_dir("misc");
-	dir = strchr (misc->name, '/') ? NULL : devfs_handle;
-	misc->devfs_handle =
-		devfs_register (dir, misc->name, DEVFS_FL_NONE,
-				MISC_MAJOR, misc->minor,
-				S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
-				misc->fops, NULL);
+
+
+	/* yuck, yet another stupid special-casing.  We should rather
+	   add ->devfs_name to avoid this mess. */
+	snprintf(buf, sizeof(buf), strchr(misc->name, '/') ?
+			"%s" : "misc/%s", misc->name);
+	misc->devfs_handle = devfs_register(NULL, buf, 0,
+			MISC_MAJOR, misc->minor,
+			S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
+			misc->fops, NULL);
 
 	/*
 	 * Add it to the front, so that later devices can "override"
diff -Nru a/drivers/char/pty.c b/drivers/char/pty.c
--- a/drivers/char/pty.c	Sat Apr 19 19:51:30 2003
+++ b/drivers/char/pty.c	Sat Apr 19 19:51:30 2003
@@ -305,7 +305,6 @@
 	}
 }
 
-extern void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned minor);
 static int pty_open(struct tty_struct *tty, struct file * filp)
 {
 	int	retval;
@@ -333,13 +332,6 @@
 	wake_up_interruptible(&pty->open_wait);
 	set_bit(TTY_THROTTLED, &tty->flags);
 	set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
-
-	/*  Register a slave for the master  */
-	if (tty->driver.major == PTY_MASTER_MAJOR)
-		tty_register_devfs(&tty->link->driver,
-				   DEVFS_FL_CURRENT_OWNER | DEVFS_FL_WAIT,
-				   tty->link->driver.minor_start +
-				   minor(tty->device)-tty->driver.minor_start);
 	retval = 0;
 out:
 	return retval;
diff -Nru a/drivers/char/rio/rio_linux.c b/drivers/char/rio/rio_linux.c
--- a/drivers/char/rio/rio_linux.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/char/rio/rio_linux.c	Sat Apr 19 19:51:49 2003
@@ -60,6 +60,7 @@
 #include <linux/init.h>
 
 #include <linux/generic_serial.h>
+#include <asm/uaccess.h>
 
 #if BITS_PER_LONG != 32
 #  error FIXME: this driver only works on 32-bit platforms
diff -Nru a/drivers/char/sx.c b/drivers/char/sx.c
--- a/drivers/char/sx.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/char/sx.c	Sat Apr 19 19:51:46 2003
@@ -207,7 +207,6 @@
 #include <linux/module.h>
 #include <linux/config.h> 
 #include <linux/kdev_t.h>
-#include <asm/io.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/ioport.h>
@@ -227,6 +226,9 @@
 #include <linux/miscdevice.h>
 #include <linux/bitops.h>
 
+#include <asm/io.h>
+#include <asm/uaccess.h>
+
 /* The 3.0.0 version of sxboards/sxwindow.h  uses BYTE and WORD.... */
 #define BYTE u8
 #define WORD u16
@@ -238,8 +240,8 @@
 #include "sxboards.h"
 #include "sxwindow.h"
 
-#include <linux/compatmac.h>
 #include <linux/generic_serial.h>
+#include <asm/uaccess.h>
 #include "sx.h"
 
 
@@ -1726,9 +1728,9 @@
 
 		tmp = kmalloc (SX_CHUNK_SIZE, GFP_USER);
 		if (!tmp) return -ENOMEM;
-		Get_user (nbytes, descr++);
-		Get_user (offset, descr++); 
-		Get_user (data,	 descr++);
+		get_user (nbytes, descr++);
+		get_user (offset, descr++); 
+		get_user (data,	 descr++);
 		while (nbytes && data) {
 			for (i=0;i<nbytes;i += SX_CHUNK_SIZE) {
 				if (copy_from_user(tmp, (char *)data + i, 
@@ -1740,9 +1742,9 @@
 				                (i+SX_CHUNK_SIZE>nbytes)?nbytes-i:SX_CHUNK_SIZE);
 			}
 
-			Get_user (nbytes, descr++);
-			Get_user (offset, descr++); 
-			Get_user (data,   descr++);
+			get_user (nbytes, descr++);
+			get_user (offset, descr++); 
+			get_user (data,   descr++);
 		}
 		kfree (tmp);
 		sx_nports += sx_init_board (board);
@@ -1816,13 +1818,13 @@
 	rc = 0;
 	switch (cmd) {
 	case TIOCGSOFTCAR:
-		rc = Put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0),
+		rc = put_user(((tty->termios->c_cflag & CLOCAL) ? 1 : 0),
 		              (unsigned int *) arg);
 		break;
 	case TIOCSSOFTCAR:
 		if ((rc = verify_area(VERIFY_READ, (void *) arg,
 		                      sizeof(int))) == 0) {
-			Get_user(ival, (unsigned int *) arg);
+			get_user(ival, (unsigned int *) arg);
 			tty->termios->c_cflag =
 				(tty->termios->c_cflag & ~CLOCAL) |
 				(ival ? CLOCAL : 0);
@@ -1848,7 +1850,7 @@
 	case TIOCMBIS:
 		if ((rc = verify_area(VERIFY_READ, (void *) arg,
 		                      sizeof(unsigned int))) == 0) {
-			Get_user(ival, (unsigned int *) arg);
+			get_user(ival, (unsigned int *) arg);
 			sx_setsignals(port, ((ival & TIOCM_DTR) ? 1 : -1),
 			                     ((ival & TIOCM_RTS) ? 1 : -1));
 			sx_reconfigure_port(port);
@@ -1857,7 +1859,7 @@
 	case TIOCMBIC:
 		if ((rc = verify_area(VERIFY_READ, (void *) arg,
 		                      sizeof(unsigned int))) == 0) {
-			Get_user(ival, (unsigned int *) arg);
+			get_user(ival, (unsigned int *) arg);
 			sx_setsignals(port, ((ival & TIOCM_DTR) ? 0 : -1),
 			                     ((ival & TIOCM_RTS) ? 0 : -1));
 			sx_reconfigure_port(port);
@@ -1866,7 +1868,7 @@
 	case TIOCMSET:
 		if ((rc = verify_area(VERIFY_READ, (void *) arg,
 		                      sizeof(unsigned int))) == 0) {
-			Get_user(ival, (unsigned int *) arg);
+			get_user(ival, (unsigned int *) arg);
 			sx_setsignals(port, ((ival & TIOCM_DTR) ? 1 : 0),
 			                     ((ival & TIOCM_RTS) ? 1 : 0));
 			sx_reconfigure_port(port);
@@ -2484,7 +2486,7 @@
 		printk (KERN_DEBUG "sx: performing cntrl reg fix: %08x -> %08x\n", t, CNTRL_REG_GOODVALUE); 
 		writel (CNTRL_REG_GOODVALUE, rebase + CNTRL_REG_OFFSET);
 	}
-	my_iounmap (hwbase, rebase);
+	iounmap ((char *) rebase);
 }
 #endif
 
@@ -2574,7 +2576,7 @@
 			   0x18000 ....  */
 			if (IS_CF_BOARD (board)) board->base += 0x18000;
 
-			board->irq = get_irq (pdev);
+			board->irq = pdev->irq;
 
 			sx_dprintk (SX_DEBUG_PROBE, "Got a specialix card: %x/%lx(%d) %x.\n", 
 			            tint, boards[found].base, board->irq, board->flags);
@@ -2583,7 +2585,7 @@
 				found++;
 				fix_sx_pci (pdev, board);
 			} else 
-				my_iounmap (board->hw_base, board->base);
+				iounmap ((char *) (board->base));
 		}
 	}
 #endif
@@ -2600,7 +2602,7 @@
 		if (probe_sx (board)) {
 			found++;
 		} else {
-			my_iounmap (board->hw_base, board->base);
+			iounmap ((char *) (board->base));
 		}
 	}
 
@@ -2616,7 +2618,7 @@
 		if (probe_si (board)) {
 			found++;
 		} else {
-			my_iounmap (board->hw_base, board->base);
+			iounmap ((char *) (board->base));
 		}
 	}
 	for (i=0;i<NR_SI1_ADDRS;i++) {
@@ -2631,7 +2633,7 @@
 		if (probe_si (board)) {
 			found++;
 		} else {
-			my_iounmap (board->hw_base, board->base);
+			iounmap ((char *) (board->base));
 		}
 	}
 
@@ -2692,7 +2694,7 @@
 
 			/* It is safe/allowed to del_timer a non-active timer */
 			del_timer (& board->timer);
-			my_iounmap (board->hw_base, board->base);
+			iounmap ((char *) (board->base));
 		}
 	}
 	if (misc_deregister(&sx_fw_device) < 0) {
diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c
--- a/drivers/char/tty_io.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/char/tty_io.c	Sat Apr 19 19:51:48 2003
@@ -136,7 +136,7 @@
  * redirect is the pseudo-tty that console output
  * is redirected to if asked by TIOCCONS.
  */
-struct tty_struct * redirect;
+static struct tty_struct *redirect;
 
 static void initialize_tty_struct(struct tty_struct *tty);
 
@@ -151,7 +151,7 @@
 extern int vme_scc_init (void);
 extern int serial167_init(void);
 extern int rs_8xx_init(void);
-extern void hwc_tty_init(void);
+extern void sclp_tty_init(void);
 extern void tty3215_init(void);
 extern void tub3270_init(void);
 extern void rs_360_init(void);
@@ -1286,7 +1286,14 @@
 	}
 	
 	/*
-	 * Make sure that the tty's task queue isn't activated. 
+	 * Prevent flush_to_ldisc() from rescheduling the work for later.  Then
+	 * kill any delayed work.
+	 */
+	clear_bit(TTY_DONT_FLIP, &tty->flags);
+	cancel_delayed_work(&tty->flip.work);
+
+	/*
+	 * Wait for ->hangup_work and ->flip.work handlers to terminate
 	 */
 	flush_scheduled_work();
 
@@ -1348,46 +1355,38 @@
 
 	if (IS_PTMX_DEV(device)) {
 #ifdef CONFIG_UNIX98_PTYS
-
 		/* find a free pty. */
 		int major, minor;
 		struct tty_driver *driver;
 
 		/* find a device that is not in use. */
 		retval = -1;
-		for ( major = 0 ; major < UNIX98_NR_MAJORS ; major++ ) {
+		for (major = 0 ; major < UNIX98_NR_MAJORS ; major++) {
 			driver = &ptm_driver[major];
-			for (minor = driver->minor_start ;
-			     minor < driver->minor_start + driver->num ;
+			for (minor = driver->minor_start;
+			     minor < driver->minor_start + driver->num;
 			     minor++) {
 				device = mk_kdev(driver->major, minor);
-				if (!init_dev(device, &tty)) goto ptmx_found; /* ok! */
+				if (!init_dev(device, &tty))
+					goto ptmx_found; /* ok! */
 			}
 		}
 		return -EIO; /* no free ptys */
+
 	ptmx_found:
 		set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
 		minor -= driver->minor_start;
 		devpts_pty_new(driver->other->name_base + minor, MKDEV(driver->other->major, minor + driver->other->minor_start));
-		tty_register_device(&pts_driver[major],
-				   pts_driver[major].minor_start + minor);
 		noctty = 1;
-		goto init_dev_done;
-
-#else   /* CONFIG_UNIX_98_PTYS */
-
+#else
 		return -ENODEV;
-
 #endif  /* CONFIG_UNIX_98_PTYS */
+	} else {
+		retval = init_dev(device, &tty);
+		if (retval)
+			return retval;
 	}
 
-	retval = init_dev(device, &tty);
-	if (retval)
-		return retval;
-
-#ifdef CONFIG_UNIX98_PTYS
-init_dev_done:
-#endif
 	filp->private_data = tty;
 	file_move(filp, &tty->tty_files);
 	check_tty_count(tty, "tty_open");
@@ -1684,6 +1683,55 @@
 	return 0;
 }
 
+static int
+tty_tiocmget(struct tty_struct *tty, struct file *file, unsigned long arg)
+{
+	int retval = -EINVAL;
+
+	if (tty->driver.tiocmget) {
+		retval = tty->driver.tiocmget(tty, file);
+
+		if (retval >= 0)
+			retval = put_user(retval, (int *)arg);
+	}
+	return retval;
+}
+
+static int
+tty_tiocmset(struct tty_struct *tty, struct file *file, unsigned int cmd,
+	     unsigned long arg)
+{
+	int retval = -EINVAL;
+
+	if (tty->driver.tiocmset) {
+		unsigned int set, clear, val;
+
+		retval = get_user(val, (unsigned int *)arg);
+		if (retval)
+			return retval;
+
+		set = clear = 0;
+		switch (cmd) {
+		case TIOCMBIS:
+			set = val;
+			break;
+		case TIOCMBIC:
+			clear = val;
+			break;
+		case TIOCMSET:
+			set = val;
+			clear = ~val;
+			break;
+		}
+
+		set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2;
+		clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2;
+
+		retval = tty->driver.tiocmset(tty, file, set, clear);
+	}
+	return retval;
+}
+
 /*
  * Split this up, as gcc can choke on it otherwise..
  */
@@ -1809,6 +1857,14 @@
 			return 0;
 		case TCSBRKP:	/* support for POSIX tcsendbreak() */	
 			return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
+
+		case TIOCMGET:
+			return tty_tiocmget(tty, file, arg);
+
+		case TIOCMSET:
+		case TIOCMBIC:
+		case TIOCMBIS:
+			return tty_tiocmset(tty, file, cmd, arg);
 	}
 	if (tty->driver.ioctl) {
 		int retval = (tty->driver.ioctl)(tty, file, cmd, arg);
@@ -1874,7 +1930,7 @@
 		}
 		task_lock(p);
 		if (p->files) {
-			read_lock(&p->files->file_lock);
+			spin_lock(&p->files->file_lock);
 			for (i=0; i < p->files->max_fds; i++) {
 				filp = fcheck_files(p->files, i);
 				if (filp && (filp->f_op == &tty_fops) &&
@@ -1886,7 +1942,7 @@
 					break;
 				}
 			}
-			read_unlock(&p->files->file_lock);
+			spin_unlock(&p->files->file_lock);
 		}
 		task_unlock(p);
 	}
@@ -2045,51 +2101,48 @@
 	tty->driver.write(tty, 0, &ch, 1);
 }
 
-void tty_register_devfs (struct tty_driver *driver, unsigned int flags, unsigned minor)
-{
 #ifdef CONFIG_DEVFS_FS
+static void tty_register_devfs(struct tty_driver *driver, unsigned minor)
+{
 	umode_t mode = S_IFCHR | S_IRUSR | S_IWUSR;
-	kdev_t device = mk_kdev(driver->major, minor);
+	kdev_t dev = mk_kdev(driver->major, minor);
 	int idx = minor - driver->minor_start;
 	char buf[32];
 
-	if (IS_TTY_DEV(device) || IS_PTMX_DEV(device)) 
-		mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-	else {
-		if (driver->major == PTY_MASTER_MAJOR)
-			mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
-	}
-	if ( (minor <  driver->minor_start) || 
-	     (minor >= driver->minor_start + driver->num) ) {
+	if ((minor < driver->minor_start) || 
+	    (minor >= driver->minor_start + driver->num)) {
 		printk(KERN_ERR "Attempt to register invalid minor number "
 		       "with devfs (%d:%d).\n", (int)driver->major,(int)minor);
 		return;
 	}
-#  ifdef CONFIG_UNIX98_PTYS
-	if ( (driver->major >= UNIX98_PTY_SLAVE_MAJOR) &&
-	     (driver->major < UNIX98_PTY_SLAVE_MAJOR + UNIX98_NR_MAJORS) )
-		flags |= DEVFS_FL_CURRENT_OWNER;
-#  endif
+
+	if (IS_TTY_DEV(dev) || IS_PTMX_DEV(dev)) 
+		mode |= S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+
 	sprintf(buf, driver->name, idx + driver->name_base);
-	devfs_register (NULL, buf, flags | DEVFS_FL_DEFAULT,
-			driver->major, minor, mode, &tty_fops, NULL);
-#endif /* CONFIG_DEVFS_FS */
+	devfs_register(NULL, buf, 0, driver->major, minor, mode,
+		       &tty_fops, NULL);
 }
 
-void tty_unregister_devfs (struct tty_driver *driver, unsigned minor)
+static void tty_unregister_devfs(struct tty_driver *driver, unsigned minor)
 {
-	devfs_remove(driver->name, minor-driver->minor_start+driver->name_base);
+	devfs_remove(driver->name,
+		     minor - driver->minor_start + driver->name_base);
 }
+#else
+# define tty_register_devfs(driver, minor)	do { } while (0)
+# define tty_unregister_devfs(driver, minor)	do { } while (0)
+#endif /* CONFIG_DEVFS_FS */
 
 /*
  * Register a tty device described by <driver>, with minor number <minor>.
  */
-void tty_register_device (struct tty_driver *driver, unsigned minor)
+void tty_register_device(struct tty_driver *driver, unsigned minor)
 {
-	tty_register_devfs(driver, 0, minor);
+	tty_register_devfs(driver, minor);
 }
 
-void tty_unregister_device (struct tty_driver *driver, unsigned minor)
+void tty_unregister_device(struct tty_driver *driver, unsigned minor)
 {
 	tty_unregister_devfs(driver, minor);
 }
diff -Nru a/drivers/char/upd4990a.c b/drivers/char/upd4990a.c
--- a/drivers/char/upd4990a.c	Sat Apr 19 19:51:30 2003
+++ b/drivers/char/upd4990a.c	Sat Apr 19 19:51:30 2003
@@ -343,19 +343,28 @@
 
 static int __init rtc_init(void)
 {
+	int err = 0;
+
 	if (!request_region(UPD4990A_IO, 1, "rtc")) {
 		printk(KERN_ERR "upd4990a: could not acquire I/O port %#x\n",
 			UPD4990A_IO);
 		return -EBUSY;
 	}
 
+	err = misc_register(&rtc_dev);
+	if (err) {
+		printk(KERN_ERR "upd4990a: can't misc_register() on minor=%d\n",
+			RTC_MINOR);
+		release_region(UPD4990A_IO, 1);
+		return err;
+	}
+		
 #if 0
 	printk(KERN_INFO "\xB6\xDA\xDD\xC0\xDE \xC4\xDE\xB9\xB2 Driver\n");  /* Calender Clock Driver */
 #else
 	printk(KERN_INFO
 	       "Real Time Clock driver for NEC PC-9800 v" RTC98_VERSION "\n");
 #endif
-	misc_register(&rtc_dev);
 	create_proc_read_entry("driver/rtc", 0, NULL, rtc_read_proc, NULL);
 
 	init_timer(&rtc_uie_timer);
diff -Nru a/drivers/hotplug/pci_hotplug_core.c b/drivers/hotplug/pci_hotplug_core.c
--- a/drivers/hotplug/pci_hotplug_core.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/hotplug/pci_hotplug_core.c	Sat Apr 19 19:51:50 2003
@@ -100,7 +100,7 @@
 	.sysfs_ops = &hotplug_slot_sysfs_ops
 };
 
-static decl_subsys(hotplug_slots, &hotplug_slot_ktype);
+static decl_subsys(hotplug_slots, &hotplug_slot_ktype, NULL);
 
 
 /* these strings match up with the values in pci_bus_speed */
diff -Nru a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
--- a/drivers/i2c/Kconfig	Sat Apr 19 19:51:29 2003
+++ b/drivers/i2c/Kconfig	Sat Apr 19 19:51:29 2003
@@ -142,6 +142,17 @@
 	  <file:Documentation/modules.txt>.
 	  The module will be called i2c-elektor.
 
+config I2C_KEYWEST
+	tristate "Powermac Keywest I2C interface"
+	depends on I2C && ALL_PPC
+	help
+	  This supports the use of the I2C interface in the combo-I/O
+	  chip on recent Apple machines.  Say Y if you have such a machine.
+
+	  This driver is also available as a module.  If you want to compile
+	  it as a module, say M here and read Documentation/modules.txt.
+	  The module will be called i2c-keywest.
+
 config ITE_I2C_ALGO
 	tristate "ITE I2C Algorithm"
 	depends on MIPS_ITE8172 && I2C
diff -Nru a/drivers/i2c/Makefile b/drivers/i2c/Makefile
--- a/drivers/i2c/Makefile	Sat Apr 19 19:51:27 2003
+++ b/drivers/i2c/Makefile	Sat Apr 19 19:51:27 2003
@@ -10,6 +10,7 @@
 obj-$(CONFIG_I2C_VELLEMAN)	+= i2c-velleman.o
 obj-$(CONFIG_I2C_ALGOPCF)	+= i2c-algo-pcf.o
 obj-$(CONFIG_I2C_ELEKTOR)	+= i2c-elektor.o
+obj-$(CONFIG_I2C_KEYWEST)	+= i2c-keywest.o
 obj-$(CONFIG_ITE_I2C_ALGO)	+= i2c-algo-ite.o
 obj-$(CONFIG_ITE_I2C_ADAP)	+= i2c-adap-ite.o
 obj-$(CONFIG_SCx200_I2C)	+= scx200_i2c.o
diff -Nru a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig
--- a/drivers/i2c/busses/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/drivers/i2c/busses/Kconfig	Sat Apr 19 19:51:50 2003
@@ -116,5 +116,31 @@
 	  in the lm_sensors package, which you can download at 
 	  http://www.lm-sensors.nu
 
+
+config I2C_VIAPRO
+	tristate "  VIA 82C596/82C686/823x"
+	depends on I2C && PCI && EXPERIMENTAL
+	help
+
+	  If you say yes to this option, support will be included for the VIA
+	  82C596/82C686/823x I2C interfaces.  Specifically, the following 
+	  chipsets are supported:
+	  82C596A/B
+	  82C686A/B
+	  8231
+	  8233
+	  8233A
+	  8235
+
+	  This can also be built as a module which can be inserted and removed
+	  while the kernel is running.  If you want to compile it as a module,
+	  say M here and read <file:Documentation/modules.txt>.
+
+	  The module will be called i2c-viapro.
+
+	  You will also need the latest user-space utilties: you can find them
+	  in the lm_sensors package, which you can download at
+	  http://www.lm-sensors.nu
+
 endmenu
 
diff -Nru a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile
--- a/drivers/i2c/busses/Makefile	Sat Apr 19 19:51:28 2003
+++ b/drivers/i2c/busses/Makefile	Sat Apr 19 19:51:28 2003
@@ -8,3 +8,4 @@
 obj-$(CONFIG_I2C_I801)		+= i2c-i801.o
 obj-$(CONFIG_I2C_ISA)		+= i2c-isa.o
 obj-$(CONFIG_I2C_PIIX4)		+= i2c-piix4.o
+obj-$(CONFIG_I2C_VIAPRO)	+= i2c-viapro.o
diff -Nru a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/busses/i2c-viapro.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,504 @@
+/*
+    i2c-viapro.c - Part of lm_sensors, Linux kernel modules for hardware
+              monitoring
+    Copyright (c) 1998 - 2002  Frodo Looijaard <frodol@dds.nl>, 
+    Philip Edelbrock <phil@netroedge.com>, Kyösti Mälkki <kmalkki@cc.hut.fi>,
+    Mark D. Studebaker <mdsxyz123@yahoo.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.
+*/
+
+/*
+   Supports Via devices:
+	82C596A/B (0x3050)
+	82C596B (0x3051)
+	82C686A/B
+	8231
+	8233
+	8233A (0x3147 and 0x3177)
+	8235
+   Note: we assume there can only be one device, with one SMBus interface.
+*/
+
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/kernel.h>
+#include <linux/stddef.h>
+#include <linux/sched.h>
+#include <linux/ioport.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <asm/io.h>
+
+#define SMBBA1	    0x90
+#define SMBBA2      0x80
+#define SMBBA3      0xD0
+
+/* SMBus address offsets */
+#define SMBHSTSTS (0 + vt596_smba)
+#define SMBHSLVSTS (1 + vt596_smba)
+#define SMBHSTCNT (2 + vt596_smba)
+#define SMBHSTCMD (3 + vt596_smba)
+#define SMBHSTADD (4 + vt596_smba)
+#define SMBHSTDAT0 (5 + vt596_smba)
+#define SMBHSTDAT1 (6 + vt596_smba)
+#define SMBBLKDAT (7 + vt596_smba)
+#define SMBSLVCNT (8 + vt596_smba)
+#define SMBSHDWCMD (9 + vt596_smba)
+#define SMBSLVEVT (0xA + vt596_smba)
+#define SMBSLVDAT (0xC + vt596_smba)
+
+/* PCI Address Constants */
+
+/* SMBus data in configuration space can be found in two places,
+   We try to select the better one*/
+
+static unsigned short smb_cf_hstcfg = 0xD2;
+
+#define SMBHSTCFG   (smb_cf_hstcfg)
+#define SMBSLVC     (SMBHSTCFG+1)
+#define SMBSHDW1    (SMBHSTCFG+2)
+#define SMBSHDW2    (SMBHSTCFG+3)
+#define SMBREV      (SMBHSTCFG+4)
+
+/* Other settings */
+#define MAX_TIMEOUT 500
+#define  ENABLE_INT9 0
+
+/* VT82C596 constants */
+#define VT596_QUICK      0x00
+#define VT596_BYTE       0x04
+#define VT596_BYTE_DATA  0x08
+#define VT596_WORD_DATA  0x0C
+#define VT596_BLOCK_DATA 0x14
+
+/* insmod parameters */
+
+/* If force is set to anything different from 0, we forcibly enable the
+   VT596. DANGEROUS! */
+static int force = 0;
+MODULE_PARM(force, "i");
+MODULE_PARM_DESC(force, "Forcibly enable the SMBus. DANGEROUS!");
+
+/* If force_addr is set to anything different from 0, we forcibly enable
+   the VT596 at the given address. VERY DANGEROUS! */
+static int force_addr = 0;
+MODULE_PARM(force_addr, "i");
+MODULE_PARM_DESC(force_addr,
+		 "Forcibly enable the SMBus at the given address. "
+		 "EXTREMELY DANGEROUS!");
+
+static void vt596_do_pause(unsigned int amount);
+static int vt596_transaction(void);
+s32 vt596_access(struct i2c_adapter * adap, u16 addr, unsigned short flags, 
+	char read_write, u8 command, int size, union i2c_smbus_data * data);
+u32 vt596_func(struct i2c_adapter *adapter);
+
+static struct i2c_algorithm smbus_algorithm = {
+	.name		= "Non-I2C SMBus adapter",
+	.id		= I2C_ALGO_SMBUS,
+	.smbus_xfer	= vt596_access,
+	.functionality	= vt596_func,
+};
+
+static struct i2c_adapter vt596_adapter = {
+	.owner		= THIS_MODULE,
+	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_VIA2,
+	.algo		= &smbus_algorithm,
+	.dev		= {
+		.name	= "unset",
+	},
+};
+
+
+
+
+static unsigned short vt596_smba = 0;
+
+
+/* Detect whether a compatible device can be found, and initialize it. */
+int vt596_setup(struct pci_dev *VT596_dev, struct pci_device_id const *id)
+{
+	unsigned char temp;
+	
+	dev_info(&VT596_dev->dev, "Found Via %s device\n", VT596_dev->dev.name);
+
+	/* Determine the address of the SMBus areas */
+	if (force_addr) {
+		vt596_smba = force_addr & 0xfff0;
+		force = 0;
+	} else {
+		if ((pci_read_config_word(VT596_dev, id->driver_data, &vt596_smba))
+		    || !(vt596_smba & 0x1)) {
+			/* try 2nd address and config reg. for 596 */
+			if((id->device == PCI_DEVICE_ID_VIA_82C596_3) &&
+			   (!pci_read_config_word(VT596_dev, SMBBA2, &vt596_smba)) &&
+			   (vt596_smba & 0x1)) {
+				smb_cf_hstcfg = 0x84;
+			} else {
+			        /* no matches at all */
+			        dev_err(&VT596_dev->dev, "Cannot configure "
+					"SMBus I/O Base address\n");
+			        return(-ENODEV);
+			}
+		}
+		vt596_smba &= 0xfff0;
+		if(vt596_smba == 0) {
+			dev_err(&VT596_dev->dev, "SMBus base address "
+				"uninitialized - upgrade BIOS or use "
+				"force_addr=0xaddr\n");
+			return -ENODEV;
+		}
+	}
+
+	if (!request_region(vt596_smba, 8, "viapro-smbus")) {
+		dev_err(&VT596_dev->dev, "SMBus region 0x%x already in use!\n",
+		        vt596_smba);
+		return(-ENODEV);
+	}
+
+	pci_read_config_byte(VT596_dev, SMBHSTCFG, &temp);
+	/* If force_addr is set, we program the new address here. Just to make
+	   sure, we disable the VT596 first. */
+	if (force_addr) {
+		pci_write_config_byte(VT596_dev, SMBHSTCFG, temp & 0xfe);
+		pci_write_config_word(VT596_dev, id->driver_data, vt596_smba);
+		pci_write_config_byte(VT596_dev, SMBHSTCFG, temp | 0x01);
+		dev_warn(&VT596_dev->dev, "WARNING: SMBus interface set to new "
+		     "address 0x%04x!\n", vt596_smba);
+	} else if ((temp & 1) == 0) {
+		if (force) {
+			/* NOTE: This assumes I/O space and other allocations 
+			 * WERE done by the Bios!  Don't complain if your 
+			 * hardware does weird things after enabling this. 
+			 * :') Check for Bios updates before resorting to 
+			 * this.
+			 */
+			pci_write_config_byte(VT596_dev, SMBHSTCFG,
+					      temp | 1);
+			dev_info(&VT596_dev->dev, "Enabling SMBus device\n");
+		} else {
+			dev_err(&VT596_dev->dev, "SMBUS: Error: Host SMBus "
+				"controller not enabled! - upgrade BIOS or "
+				"use force=1\n");
+			return(-ENODEV);
+		}
+	}
+
+	if ((temp & 0x0E) == 8)
+		dev_dbg(&VT596_dev->dev, "using Interrupt 9 for SMBus.\n");
+	else if ((temp & 0x0E) == 0)
+		dev_dbg(&VT596_dev->dev, "using Interrupt SMI# for SMBus.\n");
+	else
+		dev_dbg(&VT596_dev->dev, "Illegal Interrupt configuration "
+			"(or code out of date)!\n");
+
+	pci_read_config_byte(VT596_dev, SMBREV, &temp);
+	dev_dbg(&VT596_dev->dev, "SMBREV = 0x%X\n", temp);
+	dev_dbg(&VT596_dev->dev, "VT596_smba = 0x%X\n", vt596_smba);
+
+	return(0);
+}
+
+
+/* Internally used pause function */
+void vt596_do_pause(unsigned int amount)
+{
+	current->state = TASK_INTERRUPTIBLE;
+	schedule_timeout(amount);
+}
+
+/* Another internally used function */
+int vt596_transaction(void)
+{
+	int temp;
+	int result = 0;
+	int timeout = 0;
+
+	dev_dbg(&vt596_adapter.dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
+		"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT), 
+		inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0), 
+		inb_p(SMBHSTDAT1));
+
+	/* Make sure the SMBus host is ready to start transmitting */
+	if ((temp = inb_p(SMBHSTSTS)) != 0x00) {
+		dev_dbg(&vt596_adapter.dev, "SMBus busy (0x%02x). "
+				"Resetting...\n", temp);
+		
+		outb_p(temp, SMBHSTSTS);
+		if ((temp = inb_p(SMBHSTSTS)) != 0x00) {
+			dev_dbg(&vt596_adapter.dev, "Failed! (0x%02x)\n", temp);
+			
+			return -1;
+		} else {
+			dev_dbg(&vt596_adapter.dev, "Successfull!\n");
+		}
+	}
+
+	/* start the transaction by setting bit 6 */
+	outb_p(inb(SMBHSTCNT) | 0x040, SMBHSTCNT);
+
+	/* We will always wait for a fraction of a second! 
+	   I don't know if VIA needs this, Intel did  */
+	do {
+		vt596_do_pause(1);
+		temp = inb_p(SMBHSTSTS);
+	} while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
+
+	/* If the SMBus is still busy, we give up */
+	if (timeout >= MAX_TIMEOUT) {
+		result = -1;
+		dev_dbg(&vt596_adapter.dev, "SMBus Timeout!\n");
+	}
+
+	if (temp & 0x10) {
+		result = -1;
+		dev_dbg(&vt596_adapter.dev, "Error: Failed bus transaction\n");
+	}
+
+	if (temp & 0x08) {
+		result = -1;
+		dev_info(&vt596_adapter.dev, "Bus collision! SMBus may be "
+			"locked until next hard\nreset. (sorry!)\n");
+		/* Clock stops and slave is stuck in mid-transmission */
+	}
+
+	if (temp & 0x04) {
+		result = -1;
+		dev_dbg(&vt596_adapter.dev, "Error: no response!\n");
+	}
+
+	if (inb_p(SMBHSTSTS) != 0x00)
+		outb_p(inb(SMBHSTSTS), SMBHSTSTS);
+
+	if ((temp = inb_p(SMBHSTSTS)) != 0x00) {
+		dev_dbg(&vt596_adapter.dev, "Failed reset at end of "
+			"transaction (%02x)\n", temp);
+	}
+	dev_dbg(&vt596_adapter.dev, "Transaction (post): CNT=%02x, CMD=%02x, "
+		"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
+		inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0), 
+		inb_p(SMBHSTDAT1));
+	
+	return result;
+}
+
+/* Return -1 on error. */
+s32 vt596_access(struct i2c_adapter *adap, u16 addr, unsigned short flags, 
+		char read_write, u8 command, int size, 
+		union i2c_smbus_data * data)
+{
+	int i, len;
+
+	switch (size) {
+	case I2C_SMBUS_PROC_CALL:
+		dev_info(&vt596_adapter.dev, "I2C_SMBUS_PROC_CALL not supported!\n");
+		return -1;
+	case I2C_SMBUS_QUICK:
+		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
+		       SMBHSTADD);
+		size = VT596_QUICK;
+		break;
+	case I2C_SMBUS_BYTE:
+		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
+		       SMBHSTADD);
+		if (read_write == I2C_SMBUS_WRITE)
+			outb_p(command, SMBHSTCMD);
+		size = VT596_BYTE;
+		break;
+	case I2C_SMBUS_BYTE_DATA:
+		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
+		       SMBHSTADD);
+		outb_p(command, SMBHSTCMD);
+		if (read_write == I2C_SMBUS_WRITE)
+			outb_p(data->byte, SMBHSTDAT0);
+		size = VT596_BYTE_DATA;
+		break;
+	case I2C_SMBUS_WORD_DATA:
+		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
+		       SMBHSTADD);
+		outb_p(command, SMBHSTCMD);
+		if (read_write == I2C_SMBUS_WRITE) {
+			outb_p(data->word & 0xff, SMBHSTDAT0);
+			outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
+		}
+		size = VT596_WORD_DATA;
+		break;
+	case I2C_SMBUS_BLOCK_DATA:
+		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
+		       SMBHSTADD);
+		outb_p(command, SMBHSTCMD);
+		if (read_write == I2C_SMBUS_WRITE) {
+			len = data->block[0];
+			if (len < 0)
+				len = 0;
+			if (len > 32)
+				len = 32;
+			outb_p(len, SMBHSTDAT0);
+			i = inb_p(SMBHSTCNT);	/* Reset SMBBLKDAT */
+			for (i = 1; i <= len; i++)
+				outb_p(data->block[i], SMBBLKDAT);
+		}
+		size = VT596_BLOCK_DATA;
+		break;
+	}
+
+	outb_p((size & 0x1C) + (ENABLE_INT9 & 1), SMBHSTCNT);
+
+	if (vt596_transaction()) /* Error in transaction */
+		return -1;
+
+	if ((read_write == I2C_SMBUS_WRITE) || (size == VT596_QUICK))
+		return 0;
+
+
+	switch (size) {
+	case VT596_BYTE:
+		/* Where is the result put? I assume here it is in
+		 * SMBHSTDAT0 but it might just as well be in the
+		 * SMBHSTCMD. No clue in the docs 
+		 */
+		data->byte = inb_p(SMBHSTDAT0);
+		break;
+	case VT596_BYTE_DATA:
+		data->byte = inb_p(SMBHSTDAT0);
+		break;
+	case VT596_WORD_DATA:
+		data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
+		break;
+	case VT596_BLOCK_DATA:
+		data->block[0] = inb_p(SMBHSTDAT0);
+		i = inb_p(SMBHSTCNT);	/* Reset SMBBLKDAT */
+		for (i = 1; i <= data->block[0]; i++)
+			data->block[i] = inb_p(SMBBLKDAT);
+		break;
+	}
+	return 0;
+}
+
+
+u32 vt596_func(struct i2c_adapter *adapter)
+{
+	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
+	    I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
+	    I2C_FUNC_SMBUS_BLOCK_DATA;
+}
+
+
+
+static struct pci_device_id vt596_ids[] __devinitdata = {
+	{
+		.vendor		= PCI_VENDOR_ID_VIA,
+		.device 	= PCI_DEVICE_ID_VIA_82C596_3,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= SMBBA1,
+	},
+	{
+		.vendor		= PCI_VENDOR_ID_VIA,
+		.device		= PCI_DEVICE_ID_VIA_82C596B_3,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= SMBBA1,
+	},
+	{
+		.vendor		= PCI_VENDOR_ID_VIA,
+		.device 	= PCI_DEVICE_ID_VIA_82C686_4,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= SMBBA1,
+	},
+	{
+		.vendor		= PCI_VENDOR_ID_VIA,
+		.device 	= PCI_DEVICE_ID_VIA_8233_0,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= SMBBA3
+	},
+	{
+		.vendor		= PCI_VENDOR_ID_VIA,
+		.device 	= PCI_DEVICE_ID_VIA_8233A,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= SMBBA3,
+	},
+	{
+		.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_8231_4,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
+		.driver_data	= SMBBA1,
+	},
+	{ 0, }
+};
+
+static int __devinit vt596_probe(struct pci_dev *dev, const struct pci_device_id *id)
+{
+	int retval;
+
+	retval = vt596_setup(dev, id);
+	if (retval)
+		return retval;
+
+	vt596_adapter.dev.parent = &dev->dev;
+
+	snprintf(vt596_adapter.dev.name, DEVICE_NAME_SIZE,
+			"SMBus Via Pro adapter at %04x", vt596_smba);
+	
+	retval = i2c_add_adapter(&vt596_adapter);
+
+	return retval;
+}
+
+static void __devexit vt596_remove(struct pci_dev *dev)
+{
+	i2c_del_adapter(&vt596_adapter);
+}
+
+static struct pci_driver vt596_driver = {
+	.name		= "vt596 smbus",
+	.id_table	= vt596_ids,
+	.probe		= vt596_probe,
+	.remove		= __devexit_p(vt596_remove),
+};
+
+static int __init i2c_vt596_init(void)
+{
+	return pci_module_init(&vt596_driver);
+}
+
+
+static void __exit i2c_vt596_exit(void)
+{
+	pci_unregister_driver(&vt596_driver);
+	release_region(vt596_smba, 8);
+}
+
+
+
+MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl> and Philip Edelbrock <phil@netroedge.com>");
+MODULE_DESCRIPTION("vt82c596 SMBus driver");
+
+MODULE_LICENSE("GPL");
+
+module_init(i2c_vt596_init);
+module_exit(i2c_vt596_exit);
diff -Nru a/drivers/i2c/chips/Kconfig b/drivers/i2c/chips/Kconfig
--- a/drivers/i2c/chips/Kconfig	Sat Apr 19 19:51:48 2003
+++ b/drivers/i2c/chips/Kconfig	Sat Apr 19 19:51:48 2003
@@ -66,7 +66,8 @@
 
 config I2C_SENSOR
 	tristate
-	depends on SENSORS_ADM1021 || SENSORS_LM75 || SENSORS_VIA686A || SENSORS_W83781D
-	default m
+	default y if SENSORS_ADM1021=y || SENSORS_LM75=y || SENSORS_VIA686A=y || SENSORS_W83781D=y
+	default m if SENSORS_ADM1021=m || SENSORS_LM75=m || SENSORS_VIA686A=m || SENSORS_W83781D=m
+	default n
 
 endmenu
diff -Nru a/drivers/i2c/chips/via686a.c b/drivers/i2c/chips/via686a.c
--- a/drivers/i2c/chips/via686a.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/i2c/chips/via686a.c	Sat Apr 19 19:51:28 2003
@@ -87,9 +87,9 @@
 static const u8 reghyst[] = { 0x3a, 0x3e, 0x1e };
 
 /* temps numbered 1-3 */
-#define VIA686A_REG_TEMP(nr)		(regtemp[(nr) - 1])
-#define VIA686A_REG_TEMP_OVER(nr)	(regover[(nr) - 1])
-#define VIA686A_REG_TEMP_HYST(nr)	(reghyst[(nr) - 1])
+#define VIA686A_REG_TEMP(nr)		(regtemp[nr])
+#define VIA686A_REG_TEMP_OVER(nr)	(regover[nr])
+#define VIA686A_REG_TEMP_HYST(nr)	(reghyst[nr])
 #define VIA686A_REG_TEMP_LOW1	0x4b	// bits 7-6
 #define VIA686A_REG_TEMP_LOW23	0x49	// 2 = bits 5-4, 3 = bits 7-6
 
@@ -369,6 +369,8 @@
    dynamically allocated, at the same time when a new via686a client is
    allocated. */
 struct via686a_data {
+	int sysctl_id;
+
 	struct semaphore update_lock;
 	char valid;		/* !=0 if following fields are valid */
 	unsigned long last_updated;	/* In jiffies */
@@ -391,13 +393,258 @@
 static int via686a_detect(struct i2c_adapter *adapter, int address, int kind);
 static int via686a_detach_client(struct i2c_client *client);
 
-static int via686a_read_value(struct i2c_client *client, u8 register);
-static void via686a_write_value(struct i2c_client *client, u8 register,
-				u8 value);
+static inline int via686a_read_value(struct i2c_client *client, u8 reg)
+{
+	return (inb_p(client->addr + reg));
+}
+
+static inline void via686a_write_value(struct i2c_client *client, u8 reg,
+				       u8 value)
+{
+	outb_p(value, client->addr + reg);
+}
+
 static void via686a_update_client(struct i2c_client *client);
 static void via686a_init_client(struct i2c_client *client);
 
-static int via686a_id = 0;
+/* following are the sysfs callback functions */
+
+/* 7 voltage sensors */
+static ssize_t show_in(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", IN_FROM_REG(data->in[nr], nr)*10 );
+}
+
+static ssize_t show_in_min(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", IN_FROM_REG(data->in_min[nr], nr)*10 );
+}
+
+static ssize_t show_in_max(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", IN_FROM_REG(data->in_max[nr], nr)*10 );
+}
+
+static ssize_t set_in_min(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);
+	unsigned long val = simple_strtoul(buf, NULL, 10)/10;
+	data->in_min[nr] = IN_TO_REG(val,nr);
+	via686a_write_value(client, VIA686A_REG_IN_MIN(nr), 
+			data->in_min[nr]);
+	return count;
+}
+static ssize_t set_in_max(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);
+	unsigned long val = simple_strtoul(buf, NULL, 10)/10;
+	data->in_max[nr] = IN_TO_REG(val,nr);
+	via686a_write_value(client, VIA686A_REG_IN_MAX(nr), 
+			data->in_max[nr]);
+	return count;
+}
+#define show_in_offset(offset)					\
+static ssize_t 							\
+	show_in##offset (struct device *dev, char *buf)		\
+{								\
+	return show_in(dev, buf, 0x##offset);			\
+}								\
+static ssize_t 							\
+	show_in##offset##_min (struct device *dev, char *buf)	\
+{								\
+	return show_in_min(dev, buf, 0x##offset);		\
+}								\
+static ssize_t 							\
+	show_in##offset##_max (struct device *dev, char *buf)	\
+{								\
+	return show_in_max(dev, buf, 0x##offset);		\
+}								\
+static ssize_t set_in##offset##_min (struct device *dev, 	\
+		const char *buf, size_t count) 			\
+{								\
+	return set_in_min(dev, buf, count, 0x##offset);		\
+}								\
+static ssize_t set_in##offset##_max (struct device *dev,	\
+			const char *buf, size_t count)		\
+{								\
+	return set_in_max(dev, buf, count, 0x##offset);		\
+}								\
+static DEVICE_ATTR(in_input##offset, S_IRUGO, show_in##offset, NULL) 	\
+static DEVICE_ATTR(in_min##offset, S_IRUGO | S_IWUSR, 		\
+		show_in##offset##_min, set_in##offset##_min)	\
+static DEVICE_ATTR(in_max##offset, S_IRUGO | S_IWUSR, 		\
+		show_in##offset##_max, set_in##offset##_max)
+
+show_in_offset(0);
+show_in_offset(1);
+show_in_offset(2);
+show_in_offset(3);
+show_in_offset(4);
+
+/* 3 temperatures */
+static ssize_t show_temp(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_REG10(data->temp[nr])*10 );
+}
+/* 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);
+	struct via686a_data *data = i2c_get_clientdata(client);
+	via686a_update_client(client);
+	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_over[nr])*10);
+}
+/* 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);
+	struct via686a_data *data = i2c_get_clientdata(client);
+	via686a_update_client(client);
+	return sprintf(buf, "%ld\n", TEMP_FROM_REG(data->temp_hyst[nr])*10);
+}
+static ssize_t set_temp_max(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);
+	int val = simple_strtol(buf, NULL, 10)/10;
+	data->temp_over[nr] = TEMP_TO_REG(val);
+	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, 
+		size_t count, int nr) {
+	struct i2c_client *client = to_i2c_client(dev);
+	struct via686a_data *data = i2c_get_clientdata(client);
+	int val = simple_strtol(buf, NULL, 10)/10;
+	data->temp_hyst[nr] = TEMP_TO_REG(val);
+	via686a_write_value(client, VIA686A_REG_TEMP_HYST(nr), data->temp_hyst[nr]);
+	return count;
+}
+#define show_temp_offset(offset)					\
+static ssize_t show_temp_##offset (struct device *dev, char *buf)	\
+{									\
+	return show_temp(dev, buf, 0x##offset - 1);			\
+}									\
+static ssize_t								\
+show_temp_##offset##_max (struct device *dev, char *buf)		\
+{									\
+	return show_temp_max(dev, buf, 0x##offset - 1);			\
+}									\
+static ssize_t								\
+show_temp_##offset##_min (struct device *dev, char *buf)		\
+{									\
+	return show_temp_min(dev, buf, 0x##offset - 1);			\
+}									\
+static ssize_t set_temp_##offset##_max (struct device *dev, 		\
+		const char *buf, size_t count) 				\
+{									\
+	return set_temp_max(dev, buf, count, 0x##offset - 1);		\
+}									\
+static ssize_t set_temp_##offset##_min (struct device *dev, 		\
+		const char *buf, size_t count) 				\
+{									\
+	return set_temp_min(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(1);
+show_temp_offset(2);
+show_temp_offset(3);
+
+/* 2 Fans */
+static ssize_t show_fan(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,"%d\n", FAN_FROM_REG(data->fan[nr], 
+				DIV_FROM_REG(data->fan_div[nr])) );
+}
+static ssize_t show_fan_min(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,"%d\n",
+		FAN_FROM_REG(data->fan_min[nr], DIV_FROM_REG(data->fan_div[nr])) );
+}
+static ssize_t show_fan_div(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,"%d\n", DIV_FROM_REG(data->fan_div[nr]) );
+}
+static ssize_t set_fan_min(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);
+	int val = simple_strtol(buf, NULL, 10);
+	data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
+	via686a_write_value(client, VIA686A_REG_FAN_MIN(nr+1), data->fan_min[nr]);
+	return count;
+}
+static ssize_t set_fan_div(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);
+	int val = simple_strtol(buf, NULL, 10);
+	int old = via686a_read_value(client, VIA686A_REG_FANDIV);
+	data->fan_div[nr] = DIV_TO_REG(val);
+	old = (old & 0x0f) | (data->fan_div[1] << 6) | (data->fan_div[0] << 4);
+	via686a_write_value(client, VIA686A_REG_FANDIV, old);
+	return count;
+}
+
+#define show_fan_offset(offset)						\
+static ssize_t show_fan_##offset (struct device *dev, char *buf)	\
+{									\
+	return show_fan(dev, buf, 0x##offset - 1);			\
+}									\
+static ssize_t show_fan_##offset##_min (struct device *dev, char *buf)	\
+{									\
+	return show_fan_min(dev, buf, 0x##offset - 1);			\
+}									\
+static ssize_t show_fan_##offset##_div (struct device *dev, char *buf)	\
+{									\
+	return show_fan_div(dev, buf, 0x##offset - 1);			\
+}									\
+static ssize_t set_fan_##offset##_min (struct device *dev, 		\
+	const char *buf, size_t count) 					\
+{									\
+	return set_fan_min(dev, buf, count, 0x##offset - 1);		\
+}									\
+static ssize_t set_fan_##offset##_div (struct device *dev, 		\
+		const char *buf, size_t count) 				\
+{									\
+	return set_fan_div(dev, buf, count, 0x##offset - 1);		\
+}									\
+static DEVICE_ATTR(fan_input##offset, S_IRUGO, show_fan_##offset, NULL) \
+static DEVICE_ATTR(fan_min##offset, S_IRUGO | S_IWUSR, 			\
+		show_fan_##offset##_min, set_fan_##offset##_min) 	\
+static DEVICE_ATTR(fan_div##offset, S_IRUGO | S_IWUSR, 			\
+		show_fan_##offset##_div, set_fan_##offset##_div)
+
+show_fan_offset(1);
+show_fan_offset(2);
+
+/* Alarm */
+static ssize_t show_alarm(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);
 
 /* 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 */
@@ -411,83 +658,6 @@
 };
 
 
-
-/* The /proc/sys entries */
-
-/* -- SENSORS SYSCTL START -- */
-#define VIA686A_SYSCTL_IN0 1000
-#define VIA686A_SYSCTL_IN1 1001
-#define VIA686A_SYSCTL_IN2 1002
-#define VIA686A_SYSCTL_IN3 1003
-#define VIA686A_SYSCTL_IN4 1004
-#define VIA686A_SYSCTL_FAN1 1101
-#define VIA686A_SYSCTL_FAN2 1102
-#define VIA686A_SYSCTL_TEMP 1200
-#define VIA686A_SYSCTL_TEMP2 1201
-#define VIA686A_SYSCTL_TEMP3 1202
-#define VIA686A_SYSCTL_FAN_DIV 2000
-#define VIA686A_SYSCTL_ALARMS 2001
-
-#define VIA686A_ALARM_IN0 0x01
-#define VIA686A_ALARM_IN1 0x02
-#define VIA686A_ALARM_IN2 0x04
-#define VIA686A_ALARM_IN3 0x08
-#define VIA686A_ALARM_TEMP 0x10
-#define VIA686A_ALARM_FAN1 0x40
-#define VIA686A_ALARM_FAN2 0x80
-#define VIA686A_ALARM_IN4 0x100
-#define VIA686A_ALARM_TEMP2 0x800
-#define VIA686A_ALARM_CHAS 0x1000
-#define VIA686A_ALARM_TEMP3 0x8000
-
-/* -- SENSORS SYSCTL END -- */
-
-#if 0
-/* These files are created for each detected VIA686A. This is just a template;
-   though at first sight, you might think we could use a statically
-   allocated list, we need some way to get back to the parent - which
-   is done through one of the 'extra' fields which are initialized 
-   when a new copy is allocated. */
-static ctl_table via686a_dir_table_template[] = {
-	{VIA686A_SYSCTL_IN0, "in0", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_in},
-	{VIA686A_SYSCTL_IN1, "in1", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_in},
-	{VIA686A_SYSCTL_IN2, "in2", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_in},
-	{VIA686A_SYSCTL_IN3, "in3", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_in},
-	{VIA686A_SYSCTL_IN4, "in4", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_in},
-	{VIA686A_SYSCTL_FAN1, "fan1", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_fan},
-	{VIA686A_SYSCTL_FAN2, "fan2", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_fan},
-	{VIA686A_SYSCTL_TEMP, "temp1", NULL, 0, 0644, NULL, &i2c_proc_real,
-	 &i2c_sysctl_real, NULL, &via686a_temp},
-	{VIA686A_SYSCTL_TEMP2, "temp2", NULL, 0, 0644, NULL,
-	 &i2c_proc_real, &i2c_sysctl_real, NULL, &via686a_temp},
-	{VIA686A_SYSCTL_TEMP3, "temp3", NULL, 0, 0644, NULL,
-	 &i2c_proc_real, &i2c_sysctl_real, NULL, &via686a_temp},
-	{VIA686A_SYSCTL_FAN_DIV, "fan_div", NULL, 0, 0644, NULL,
-	 &i2c_proc_real, &i2c_sysctl_real, NULL, &via686a_fan_div},
-	{VIA686A_SYSCTL_ALARMS, "alarms", NULL, 0, 0444, NULL,
-	 &i2c_proc_real, &i2c_sysctl_real, NULL, &via686a_alarms},
-	{0}
-};
-#endif
-
-static inline int via686a_read_value(struct i2c_client *client, u8 reg)
-{
-	return (inb_p(client->addr + reg));
-}
-
-static inline void via686a_write_value(struct i2c_client *client, u8 reg,
-				       u8 value)
-{
-	outb_p(value, client->addr + reg);
-}
-
 /* This is called when the module is loaded */
 static int via686a_attach_adapter(struct i2c_adapter *adapter)
 {
@@ -499,7 +669,7 @@
 	struct i2c_client *new_client;
 	struct via686a_data *data;
 	int err = 0;
-	const char *name = "via686a";
+	const char client_name[] = "via686a chip";
 	u16 val;
 
 	/* Make sure we are probing the ISA bus!!  */
@@ -552,16 +722,49 @@
 	new_client->adapter = adapter;
 	new_client->driver = &via686a_driver;
 	new_client->flags = 0;
+	new_client->dev.parent = &adapter->dev;
 
 	/* Fill in the remaining client fields and put into the global list */
-	snprintf(new_client->dev.name, DEVICE_NAME_SIZE, name);
+	snprintf(new_client->dev.name, DEVICE_NAME_SIZE, client_name);
 
-	new_client->id = via686a_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 ERROR3;
+	
+	/* register sysfs hooks */
+	device_create_file(&new_client->dev, &dev_attr_in_input0);
+	device_create_file(&new_client->dev, &dev_attr_in_input1);
+	device_create_file(&new_client->dev, &dev_attr_in_input2);
+	device_create_file(&new_client->dev, &dev_attr_in_input3);
+	device_create_file(&new_client->dev, &dev_attr_in_input4);
+	device_create_file(&new_client->dev, &dev_attr_in_min0);
+	device_create_file(&new_client->dev, &dev_attr_in_min1);
+	device_create_file(&new_client->dev, &dev_attr_in_min2);
+	device_create_file(&new_client->dev, &dev_attr_in_min3);
+	device_create_file(&new_client->dev, &dev_attr_in_min4);
+	device_create_file(&new_client->dev, &dev_attr_in_max0);
+	device_create_file(&new_client->dev, &dev_attr_in_max1);
+	device_create_file(&new_client->dev, &dev_attr_in_max2);
+	device_create_file(&new_client->dev, &dev_attr_in_max3);
+	device_create_file(&new_client->dev, &dev_attr_in_max4);
+	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_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_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);
 
 	/* Initialize the VIA686A chip */
 	via686a_init_client(new_client);
@@ -629,7 +832,7 @@
 			    FAN_TO_REG(VIA686A_INIT_FAN_MIN, 2));
 	via686a_write_value(client, VIA686A_REG_FAN_MIN(2),
 			    FAN_TO_REG(VIA686A_INIT_FAN_MIN, 2));
-	for (i = 1; i <= 3; i++) {
+	for (i = 0; i <= 2; i++) {
 		via686a_write_value(client, VIA686A_REG_TEMP_OVER(i),
 				    TEMP_TO_REG(VIA686A_INIT_TEMP_OVER));
 		via686a_write_value(client, VIA686A_REG_TEMP_HYST(i),
@@ -670,13 +873,13 @@
 			data->fan_min[i - 1] = via686a_read_value(client,
 						     VIA686A_REG_FAN_MIN(i));
 		}
-		for (i = 1; i <= 3; i++) {
-			data->temp[i - 1] = via686a_read_value(client,
+		for (i = 0; i <= 2; i++) {
+			data->temp[i] = via686a_read_value(client,
 						 VIA686A_REG_TEMP(i)) << 2;
-			data->temp_over[i - 1] =
+			data->temp_over[i] =
 			    via686a_read_value(client,
 					       VIA686A_REG_TEMP_OVER(i));
-			data->temp_hyst[i - 1] =
+			data->temp_hyst[i] =
 			    via686a_read_value(client,
 					       VIA686A_REG_TEMP_HYST(i));
 		}
@@ -709,164 +912,12 @@
 	up(&data->update_lock);
 }
 
-
-/* The next few functions are the call-back functions of the /proc/sys and
-   sysctl files. Which function is used is defined in the ctl_table in
-   the extra1 field.
-   Each function must return the magnitude (power of 10 to divide the date
-   with) if it is called with operation==SENSORS_PROC_REAL_INFO. It must
-   put a maximum of *nrels elements in results reflecting the data of this
-   file, and set *nrels to the number it actually put in it, if operation==
-   SENSORS_PROC_REAL_READ. Finally, it must get upto *nrels elements from
-   results and write them to the chip, if operations==SENSORS_PROC_REAL_WRITE.
-   Note that on SENSORS_PROC_REAL_READ, I do not check whether results is
-   large enough (by checking the incoming value of *nrels). This is not very
-   good practice, but as long as you put less than about 5 values in results,
-   you can assume it is large enough. */
-/* FIXME, remove these functions, they are here to verify the sysfs conversion
- * is correct, or not */
-__attribute__((unused))
-static void via686a_in(struct i2c_client *client, int operation, int ctl_name,
-               int *nrels_mag, long *results)
-{
-	struct via686a_data *data = i2c_get_clientdata(client);
-	int nr = ctl_name - VIA686A_SYSCTL_IN0;
-
-	if (operation == SENSORS_PROC_REAL_INFO)
-		*nrels_mag = 2;
-	else if (operation == SENSORS_PROC_REAL_READ) {
-		via686a_update_client(client);
-		results[0] = IN_FROM_REG(data->in_min[nr], nr);
-		results[1] = IN_FROM_REG(data->in_max[nr], nr);
-		results[2] = IN_FROM_REG(data->in[nr], nr);
-		*nrels_mag = 3;
-	} else if (operation == SENSORS_PROC_REAL_WRITE) {
-		if (*nrels_mag >= 1) {
-			data->in_min[nr] = IN_TO_REG(results[0], nr);
-			via686a_write_value(client, VIA686A_REG_IN_MIN(nr),
-					    data->in_min[nr]);
-		}
-		if (*nrels_mag >= 2) {
-			data->in_max[nr] = IN_TO_REG(results[1], nr);
-			via686a_write_value(client, VIA686A_REG_IN_MAX(nr),
-					    data->in_max[nr]);
-		}
-	}
-}
-
-__attribute__((unused))
-static void via686a_fan(struct i2c_client *client, int operation, int ctl_name,
-		 int *nrels_mag, long *results)
-{
-	struct via686a_data *data = i2c_get_clientdata(client);
-	int nr = ctl_name - VIA686A_SYSCTL_FAN1 + 1;
-
-	if (operation == SENSORS_PROC_REAL_INFO)
-		*nrels_mag = 0;
-	else if (operation == SENSORS_PROC_REAL_READ) {
-		via686a_update_client(client);
-		results[0] = FAN_FROM_REG(data->fan_min[nr - 1],
-					  DIV_FROM_REG(data->fan_div
-						       [nr - 1]));
-		results[1] = FAN_FROM_REG(data->fan[nr - 1],
-				 DIV_FROM_REG(data->fan_div[nr - 1]));
-		*nrels_mag = 2;
-	} else if (operation == SENSORS_PROC_REAL_WRITE) {
-		if (*nrels_mag >= 1) {
-			data->fan_min[nr - 1] = FAN_TO_REG(results[0], 
-							   DIV_FROM_REG(data->
-							      fan_div[nr -1]));
-			via686a_write_value(client,
-					    VIA686A_REG_FAN_MIN(nr),
-					    data->fan_min[nr - 1]);
-		}
-	}
-}
-
-__attribute__((unused))
-static void via686a_temp(struct i2c_client *client, int operation, int ctl_name,
-		  int *nrels_mag, long *results)
-{
-	struct via686a_data *data = i2c_get_clientdata(client);
-	int nr = ctl_name - VIA686A_SYSCTL_TEMP;
-
-	if (operation == SENSORS_PROC_REAL_INFO)
-		*nrels_mag = 1;
-	else if (operation == SENSORS_PROC_REAL_READ) {
-		via686a_update_client(client);
-		results[0] = TEMP_FROM_REG(data->temp_over[nr]);
-		results[1] = TEMP_FROM_REG(data->temp_hyst[nr]);
-		results[2] = TEMP_FROM_REG10(data->temp[nr]);
-		*nrels_mag = 3;
-	} else if (operation == SENSORS_PROC_REAL_WRITE) {
-		if (*nrels_mag >= 1) {
-			data->temp_over[nr] = TEMP_TO_REG(results[0]);
-			via686a_write_value(client,
-					    VIA686A_REG_TEMP_OVER(nr + 1),
-					    data->temp_over[nr]);
-		}
-		if (*nrels_mag >= 2) {
-			data->temp_hyst[nr] = TEMP_TO_REG(results[1]);
-			via686a_write_value(client,
-					    VIA686A_REG_TEMP_HYST(nr + 1),
-					    data->temp_hyst[nr]);
-		}
-	}
-}
-
-__attribute__((unused))
-static void via686a_alarms(struct i2c_client *client, int operation, int ctl_name,
-		    int *nrels_mag, long *results)
-{
-	struct via686a_data *data = i2c_get_clientdata(client);
-	if (operation == SENSORS_PROC_REAL_INFO)
-		*nrels_mag = 0;
-	else if (operation == SENSORS_PROC_REAL_READ) {
-		via686a_update_client(client);
-		results[0] = ALARMS_FROM_REG(data->alarms);
-		*nrels_mag = 1;
-	}
-}
-
-__attribute__((unused))
-static void via686a_fan_div(struct i2c_client *client, int operation,
-		     int ctl_name, int *nrels_mag, long *results)
-{
-	struct via686a_data *data = i2c_get_clientdata(client);
-	int old;
-
-	if (operation == SENSORS_PROC_REAL_INFO)
-		*nrels_mag = 0;
-	else if (operation == SENSORS_PROC_REAL_READ) {
-		via686a_update_client(client);
-		results[0] = DIV_FROM_REG(data->fan_div[0]);
-		results[1] = DIV_FROM_REG(data->fan_div[1]);
-		*nrels_mag = 2;
-	} else if (operation == SENSORS_PROC_REAL_WRITE) {
-		old = via686a_read_value(client, VIA686A_REG_FANDIV);
-		if (*nrels_mag >= 2) {
-			data->fan_div[1] = DIV_TO_REG(results[1]);
-			old = (old & 0x3f) | (data->fan_div[1] << 6);
-		}
-		if (*nrels_mag >= 1) {
-			data->fan_div[0] = DIV_TO_REG(results[0]);
-			old = (old & 0xcf) | (data->fan_div[0] << 4);
-			via686a_write_value(client, VIA686A_REG_FANDIV,
-					    old);
-		}
-	}
-}
-
-
 static struct pci_device_id via686a_pci_ids[] __devinitdata = {
        {
 	       .vendor 		= PCI_VENDOR_ID_VIA, 
 	       .device 		= PCI_DEVICE_ID_VIA_82C686_4, 
 	       .subvendor	= PCI_ANY_ID, 
 	       .subdevice	= PCI_ANY_ID, 
-	       .class		= 0, 
-	       .class_mask	= 0, 
-	       .driver_data	= 0, 
        },
        { 0, }
 };
diff -Nru a/drivers/i2c/chips/w83781d.c b/drivers/i2c/chips/w83781d.c
--- a/drivers/i2c/chips/w83781d.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/i2c/chips/w83781d.c	Sat Apr 19 19:51:27 2003
@@ -364,7 +364,7 @@
 	 \
 	w83781d_update_client(client); \
 	 \
-	return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr])); \
+	return sprintf(buf,"%ld\n", (long)IN_FROM_REG(data->reg[nr] * 10)); \
 }
 show_in_reg(in);
 show_in_reg(in_min);
@@ -378,7 +378,7 @@
 	u32 val; \
 	 \
 	val = simple_strtoul(buf, NULL, 10); \
-	data->in_##reg[nr] = IN_TO_REG(val); \
+	data->in_##reg[nr] = (IN_TO_REG(val) / 10); \
 	w83781d_write_value(client, W83781D_REG_IN_##REG(nr), data->in_##reg[nr]); \
 	 \
 	return count; \
@@ -712,7 +712,7 @@
 {
 	struct i2c_client *client = to_i2c_client(dev);
 	struct w83781d_data *data = i2c_get_clientdata(client);
-	u32 val, old, old2, old3;
+	u32 val, old, old2, old3 = 0;
 
 	val = simple_strtoul(buf, NULL, 10);
 	old = w83781d_read_value(client, W83781D_REG_VID_FANDIV);
diff -Nru a/drivers/i2c/i2c-adap-ite.c b/drivers/i2c/i2c-adap-ite.c
--- a/drivers/i2c/i2c-adap-ite.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/i2c/i2c-adap-ite.c	Sat Apr 19 19:51:29 2003
@@ -196,9 +196,11 @@
 
 static struct i2c_adapter iic_ite_ops = {
 	.owner		= THIS_MODULE,
-	.name		= "ITE IIC adapter",
 	.id		= I2C_HW_I_IIC,
 	.algo_data	= &iic_ite_data,
+	.dev		= {
+		.name	= "ITE IIC adapter",
+	},
 };
 
 /* Called when the module is loaded.  This function starts the
diff -Nru a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c
--- a/drivers/i2c/i2c-dev.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/i2c/i2c-dev.c	Sat Apr 19 19:51:50 2003
@@ -77,7 +77,7 @@
 
 static struct i2c_driver i2cdev_driver = {
 	.owner		= THIS_MODULE,
-	.name		= "i2c-dev dummy driver",
+	.name		= "dev driver",
 	.id		= I2C_DRIVERID_I2CDEV,
 	.flags		= I2C_DF_DUMMY,
 	.attach_adapter	= i2cdev_attach_adapter,
@@ -100,10 +100,6 @@
 	char *tmp;
 	int ret;
 
-#ifdef DEBUG
-	struct inode *inode = file->f_dentry->d_inode;
-#endif /* DEBUG */
-
 	struct i2c_client *client = (struct i2c_client *)file->private_data;
 
 	if (count > 8192)
@@ -114,10 +110,8 @@
 	if (tmp==NULL)
 		return -ENOMEM;
 
-#ifdef DEBUG
-	printk(KERN_DEBUG "i2c-dev.o: i2c-%d reading %d bytes.\n",minor(inode->i_rdev),
-	       count);
-#endif
+	pr_debug("i2c-dev.o: i2c-%d reading %d bytes.\n",
+		minor(file->f_dentry->d_inode->i_rdev), count);
 
 	ret = i2c_master_recv(client,tmp,count);
 	if (ret >= 0)
@@ -133,10 +127,6 @@
 	char *tmp;
 	struct i2c_client *client = (struct i2c_client *)file->private_data;
 
-#ifdef DEBUG
-	struct inode *inode = file->f_dentry->d_inode;
-#endif /* DEBUG */
-
 	if (count > 8192)
 		count = 8192;
 
@@ -149,10 +139,9 @@
 		return -EFAULT;
 	}
 
-#ifdef DEBUG
-	printk(KERN_DEBUG "i2c-dev.o: i2c-%d writing %d bytes.\n",minor(inode->i_rdev),
-	       count);
-#endif
+	pr_debug("i2c-dev.o: i2c-%d writing %d bytes.\n",
+		minor(file->f_dentry->d_inode->i_rdev), count);
+
 	ret = i2c_master_send(client,tmp,count);
 	kfree(tmp);
 	return ret;
@@ -169,10 +158,8 @@
 	int i,datasize,res;
 	unsigned long funcs;
 
-#ifdef DEBUG
-	printk(KERN_DEBUG "i2c-dev.o: i2c-%d ioctl, cmd: 0x%x, arg: %lx.\n", 
-	       minor(inode->i_rdev),cmd, arg);
-#endif /* DEBUG */
+	pr_debug("i2c-dev.o: i2c-%d ioctl, cmd: 0x%x, arg: %lx.\n",
+		minor(inode->i_rdev),cmd, arg);
 
 	switch ( cmd ) {
 	case I2C_SLAVE:
@@ -207,6 +194,11 @@
 				   sizeof(rdwr_arg)))
 			return -EFAULT;
 
+		/* Put an arbritrary limit on the number of messages that can
+		 * be sent at once */
+		if (rdwr_arg.nmsgs > 42)
+			return -EINVAL;
+		
 		rdwr_pa = (struct i2c_msg *)
 			kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg), 
 			GFP_KERNEL);
@@ -214,38 +206,43 @@
 		if (rdwr_pa == NULL) return -ENOMEM;
 
 		res = 0;
-		for( i=0; i<rdwr_arg.nmsgs; i++ )
-		{
+		for( i=0; i<rdwr_arg.nmsgs; i++ ) {
 		    	if(copy_from_user(&(rdwr_pa[i]),
 					&(rdwr_arg.msgs[i]),
-					sizeof(rdwr_pa[i])))
-			{
+					sizeof(rdwr_pa[i]))) {
 			        res = -EFAULT;
 				break;
 			}
+			/* Limit the size of the message to a sane amount */
+			if (rdwr_pa[i].len > 8192) {
+				res = -EINVAL;
+				break;
+			}
 			rdwr_pa[i].buf = kmalloc(rdwr_pa[i].len, GFP_KERNEL);
-			if(rdwr_pa[i].buf == NULL)
-			{
+			if(rdwr_pa[i].buf == NULL) {
 				res = -ENOMEM;
 				break;
 			}
 			if(copy_from_user(rdwr_pa[i].buf,
 				rdwr_arg.msgs[i].buf,
-				rdwr_pa[i].len))
-			{
-			    	kfree(rdwr_pa[i].buf);
+				rdwr_pa[i].len)) {
 			    	res = -EFAULT;
 				break;
 			}
 		}
-		if (!res) 
-		{
+		if (res < 0) {
+			int j;
+			for (j = 0; j < i; ++j)
+				kfree(rdwr_pa[j].buf);
+			kfree(rdwr_pa);
+			return res;
+		}
+		if (!res) {
 			res = i2c_transfer(client->adapter,
 				rdwr_pa,
 				rdwr_arg.nmsgs);
 		}
-		while(i-- > 0)
-		{
+		while(i-- > 0) {
 			if( res>=0 && (rdwr_pa[i].flags & I2C_M_RD))
 			{
 				if(copy_to_user(
@@ -274,20 +271,18 @@
 		    (data_arg.size != I2C_SMBUS_BLOCK_DATA) &&
 		    (data_arg.size != I2C_SMBUS_I2C_BLOCK_DATA) &&
 		    (data_arg.size != I2C_SMBUS_BLOCK_PROC_CALL)) {
-#ifdef DEBUG
-			printk(KERN_DEBUG "i2c-dev.o: size out of range (%x) in ioctl I2C_SMBUS.\n",
-			       data_arg.size);
-#endif
+			dev_dbg(&client->dev,
+				"size out of range (%x) in ioctl I2C_SMBUS.\n",
+				data_arg.size);
 			return -EINVAL;
 		}
 		/* Note that I2C_SMBUS_READ and I2C_SMBUS_WRITE are 0 and 1, 
 		   so the check is valid if size==I2C_SMBUS_QUICK too. */
 		if ((data_arg.read_write != I2C_SMBUS_READ) && 
 		    (data_arg.read_write != I2C_SMBUS_WRITE)) {
-#ifdef DEBUG
-			printk(KERN_DEBUG "i2c-dev.o: read_write out of range (%x) in ioctl I2C_SMBUS.\n",
-			       data_arg.read_write);
-#endif
+			dev_dbg(&client->dev, 
+				"read_write out of range (%x) in ioctl I2C_SMBUS.\n",
+				data_arg.read_write);
 			return -EINVAL;
 		}
 
@@ -298,15 +293,14 @@
 		    (data_arg.read_write == I2C_SMBUS_WRITE)))
 			/* These are special: we do not use data */
 			return i2c_smbus_xfer(client->adapter, client->addr,
-			                      client->flags,
-			                      data_arg.read_write,
-			                      data_arg.command,
-			                      data_arg.size, NULL);
+					      client->flags,
+					      data_arg.read_write,
+					      data_arg.command,
+					      data_arg.size, NULL);
 
 		if (data_arg.data == NULL) {
-#ifdef DEBUG
-			printk(KERN_DEBUG "i2c-dev.o: data is NULL pointer in ioctl I2C_SMBUS.\n");
-#endif
+			dev_dbg(&client->dev,
+				"data is NULL pointer in ioctl I2C_SMBUS.\n");
 			return -EINVAL;
 		}
 
@@ -365,7 +359,7 @@
 
 	return 0;
 
- out_kfree:
+out_kfree:
 	kfree(client);
 	return -ENODEV;
 }
@@ -428,7 +422,8 @@
 {
 	int res;
 
-	printk(KERN_INFO "i2c-dev.o: i2c /dev entries driver module version %s (%s)\n", I2C_VERSION, I2C_DATE);
+	printk(KERN_INFO "i2c /dev entries driver module version %s (%s)\n",
+		I2C_VERSION, I2C_DATE);
 
 	if (register_chrdev(I2C_MAJOR,"i2c",&i2cdev_fops)) {
 		printk(KERN_ERR "i2c-dev.o: unable to get major %d for i2c bus\n",
diff -Nru a/drivers/i2c/i2c-frodo.c b/drivers/i2c/i2c-frodo.c
--- a/drivers/i2c/i2c-frodo.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/i2c/i2c-frodo.c	Sat Apr 19 19:51:27 2003
@@ -59,9 +59,11 @@
 
 static struct i2c_adapter frodo_ops = {
 	.owner			= THIS_MODULE,
-	.name			= "Frodo adapter driver",
 	.id			= I2C_HW_B_FRODO,
 	.algo_data		= &bit_frodo_data,
+	.dev			= {
+		.name		= "Frodo adapter driver",
+	},
 };
 
 static int __init i2c_frodo_init (void)
diff -Nru a/drivers/i2c/i2c-keywest.c b/drivers/i2c/i2c-keywest.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/i2c-keywest.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,666 @@
+/*
+    i2c Support for Apple Keywest I2C Bus Controller
+
+    Copyright (c) 2001 Benjamin Herrenschmidt <benh@kernel.crashing.org>
+
+    Original work by
+    
+    Copyright (c) 2000 Philip Edelbrock <phil@stimpy.netroedge.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.
+
+    Changes:
+
+    2001/12/13 BenH	New implementation
+    2001/12/15 BenH	Add support for "byte" and "quick"
+                        transfers. Add i2c_xfer routine.
+
+    My understanding of the various modes supported by keywest are:
+
+     - Dumb mode : not implemented, probably direct tweaking of lines
+     - Standard mode : simple i2c transaction of type
+         S Addr R/W A Data A Data ... T
+     - Standard sub mode : combined 8 bit subaddr write with data read
+         S Addr R/W A SubAddr A Data A Data ... T
+     - Combined mode : Subaddress and Data sequences appended with no stop
+         S Addr R/W A SubAddr S Addr R/W A Data A Data ... T
+
+    Currently, this driver uses only Standard mode for i2c xfer, and
+    smbus byte & quick transfers ; and uses StandardSub mode for
+    other smbus transfers instead of combined as we need that for the
+    sound driver to be happy
+*/
+
+#include <linux/module.h>
+#include <linux/config.h>
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/pci.h>
+#include <linux/types.h>
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/timer.h>
+#include <linux/spinlock.h>
+#include <linux/completion.h>
+#include <linux/interrupt.h>
+
+#include <asm/io.h>
+#include <asm/prom.h>
+#include <asm/machdep.h>
+#include <asm/pmac_feature.h>
+
+#include "i2c-keywest.h"
+
+#undef POLLED_MODE
+
+#define DBG(x...) do {\
+	if (debug > 0) \
+		printk(KERN_DEBUG "KW:" x); \
+	} while(0)
+
+
+MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
+MODULE_DESCRIPTION("I2C driver for Apple's Keywest");
+MODULE_LICENSE("GPL");
+MODULE_PARM(probe, "i");
+MODULE_PARM(debug, "i");
+
+int probe = 0;
+int debug = 0;
+
+static struct keywest_iface *ifaces = NULL;
+
+#ifdef POLLED_MODE
+/* This isn't fast, but will go once I implement interrupt with
+ * proper timeout
+ */
+static u8
+wait_interrupt(struct keywest_iface* iface)
+{
+	int i;
+	u8 isr;
+	
+	for (i = 0; i < POLL_TIMEOUT; i++) {
+		isr = read_reg(reg_isr) & KW_I2C_IRQ_MASK;
+		if (isr != 0)
+			return isr;
+		current->state = TASK_UNINTERRUPTIBLE;
+		schedule_timeout(1);
+	}
+	return isr;
+}
+#endif /* POLLED_MODE */
+
+
+static void
+do_stop(struct keywest_iface* iface, int result)
+{
+	write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_STOP);
+	iface->state = state_stop;
+	iface->result = result;
+}
+
+/* Main state machine for standard & standard sub mode */
+static void
+handle_interrupt(struct keywest_iface *iface, u8 isr)
+{
+	int ack;
+	
+	DBG("handle_interrupt(), got: %x, status: %x, state: %d\n",
+		isr, read_reg(reg_status), iface->state);
+	if (isr == 0 && iface->state != state_stop) {
+		do_stop(iface, -1);
+		return;
+	}
+	if (isr & KW_I2C_IRQ_STOP && iface->state != state_stop) {
+		iface->result = -1;
+		iface->state = state_stop;
+	}
+	switch(iface->state) {
+	case state_addr:
+		if (!(isr & KW_I2C_IRQ_ADDR)) {
+			do_stop(iface, -1);
+			break;
+		}
+		ack = read_reg(reg_status);
+		DBG("ack on set address: %x\n", ack);
+		if ((ack & KW_I2C_STAT_LAST_AAK) == 0) {
+			do_stop(iface, -1);
+			break;
+		}
+		/* Handle rw "quick" mode */
+		if (iface->datalen == 0)
+			do_stop(iface, 0);
+		else if (iface->read_write == I2C_SMBUS_READ) {
+			iface->state = state_read;
+			if (iface->datalen > 1)
+				write_reg(reg_control, read_reg(reg_control)
+					| KW_I2C_CTL_AAK);
+		} else {
+			iface->state = state_write;
+			DBG("write byte: %x\n", *(iface->data));
+			write_reg(reg_data, *(iface->data++));
+			iface->datalen--;
+		}
+		
+		break;
+	case state_read:
+		if (!(isr & KW_I2C_IRQ_DATA)) {
+			do_stop(iface, -1);
+			break;
+		}
+		*(iface->data++) = read_reg(reg_data);
+		DBG("read byte: %x\n", *(iface->data-1));
+		iface->datalen--;
+		if (iface->datalen == 0)
+			iface->state = state_stop;
+		else
+			write_reg(reg_control, 0);
+		break;
+	case state_write:
+		if (!(isr & KW_I2C_IRQ_DATA)) {
+			do_stop(iface, -1);
+			break;
+		}
+		/* Check ack status */
+		ack = read_reg(reg_status);
+		DBG("ack on data write: %x\n", ack);
+		if ((ack & KW_I2C_STAT_LAST_AAK) == 0) {
+			do_stop(iface, -1);
+			break;
+		}
+		if (iface->datalen) {
+			DBG("write byte: %x\n", *(iface->data));
+			write_reg(reg_data, *(iface->data++));
+			iface->datalen--;
+		} else
+			do_stop(iface, 0);
+		break;
+		
+	case state_stop:
+		if (!(isr & KW_I2C_IRQ_STOP) && (++iface->stopretry) < 10)
+			do_stop(iface, -1);
+		else {
+			iface->state = state_idle;
+			write_reg(reg_control, 0x00);
+			write_reg(reg_ier, 0x00);
+#ifndef POLLED_MODE
+			complete(&iface->complete);
+#endif /* POLLED_MODE */			
+		}
+		break;
+	}
+	
+	write_reg(reg_isr, isr);
+}
+
+#ifndef POLLED_MODE
+
+/* Interrupt handler */
+static void
+keywest_irq(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct keywest_iface *iface = (struct keywest_iface *)dev_id;
+
+	spin_lock(&iface->lock);
+	del_timer(&iface->timeout_timer);
+	handle_interrupt(iface, read_reg(reg_isr));
+	if (iface->state != state_idle) {
+		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
+		add_timer(&iface->timeout_timer);
+	}
+	spin_unlock(&iface->lock);
+}
+
+static void
+keywest_timeout(unsigned long data)
+{
+	struct keywest_iface *iface = (struct keywest_iface *)data;
+
+	DBG("timeout !\n");
+	spin_lock_irq(&iface->lock);
+	handle_interrupt(iface, read_reg(reg_isr));
+	if (iface->state != state_idle) {
+		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
+		add_timer(&iface->timeout_timer);
+	}
+	spin_unlock(&iface->lock);
+}
+
+#endif /* POLLED_MODE */
+
+/*
+ * SMBUS-type transfer entrypoint
+ */
+static s32
+keywest_smbus_xfer(	struct i2c_adapter*	adap,
+			u16			addr,
+			unsigned short		flags,
+			char			read_write,
+			u8			command,
+			int			size,
+			union i2c_smbus_data*	data)
+{
+	struct keywest_chan* chan = i2c_get_adapdata(adap);
+	struct keywest_iface* iface = chan->iface;
+	int len;
+	u8* buffer;
+	u16 cur_word;
+	int rc = 0;
+
+	if (iface->state == state_dead)
+		return -1;
+		
+	/* Prepare datas & select mode */
+	iface->cur_mode &= ~KW_I2C_MODE_MODE_MASK;
+	switch (size) {
+	    case I2C_SMBUS_QUICK:
+	    	len = 0;
+	    	buffer = NULL;
+	    	iface->cur_mode |= KW_I2C_MODE_STANDARD;
+	    	break;
+	    case I2C_SMBUS_BYTE:
+	    	len = 1;
+	    	buffer = &data->byte;
+	    	iface->cur_mode |= KW_I2C_MODE_STANDARD;
+	    	break;
+	    case I2C_SMBUS_BYTE_DATA:
+	    	len = 1;
+	    	buffer = &data->byte;
+	    	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;
+	    	break;
+	    case I2C_SMBUS_WORD_DATA:
+	    	len = 2;
+	    	cur_word = cpu_to_le16(data->word);
+	    	buffer = (u8 *)&cur_word;
+	    	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;
+		break;
+	    case I2C_SMBUS_BLOCK_DATA:
+	    	len = data->block[0];
+	    	buffer = &data->block[1];
+	    	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;
+		break;
+	    default:
+	    	return -1;
+	}
+
+	/* Original driver had this limitation */
+	if (len > 32)
+		len = 32;
+
+	down(&iface->sem);
+
+	DBG("chan: %d, addr: 0x%x, transfer len: %d, read: %d\n",
+		chan->chan_no, addr, len, read_write == I2C_SMBUS_READ);
+
+	iface->data = buffer;
+	iface->datalen = len;
+	iface->state = state_addr;
+	iface->result = 0;
+	iface->stopretry = 0;
+	iface->read_write = read_write;
+	
+	/* Setup channel & clear pending irqs */
+	write_reg(reg_mode, iface->cur_mode | (chan->chan_no << 4));
+	write_reg(reg_isr, read_reg(reg_isr));
+	write_reg(reg_status, 0);
+
+	/* Set up address and r/w bit */
+	write_reg(reg_addr,
+		(addr << 1) | ((read_write == I2C_SMBUS_READ) ? 0x01 : 0x00));
+
+	/* Set up the sub address */
+	if ((iface->cur_mode & KW_I2C_MODE_MODE_MASK) == KW_I2C_MODE_STANDARDSUB
+	    || (iface->cur_mode & KW_I2C_MODE_MODE_MASK) == KW_I2C_MODE_COMBINED)
+		write_reg(reg_subaddr, command);
+
+	/* Arm timeout */
+	iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
+	add_timer(&iface->timeout_timer);
+
+	/* Start sending address & enable interrupt*/
+	write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_XADDR);
+	write_reg(reg_ier, KW_I2C_IRQ_MASK);
+
+#ifdef POLLED_MODE
+	DBG("using polled mode...\n");
+	/* State machine, to turn into an interrupt handler */
+	while(iface->state != state_idle) {
+		u8 isr = wait_interrupt(iface);
+		handle_interrupt(iface, isr);
+	}
+#else /* POLLED_MODE */
+	DBG("using interrupt mode...\n");
+	wait_for_completion(&iface->complete);	
+#endif /* POLLED_MODE */	
+
+	rc = iface->result;	
+	DBG("transfer done, result: %d\n", rc);
+
+	if (rc == 0 && size == I2C_SMBUS_WORD_DATA && read_write == I2C_SMBUS_READ)
+	    	data->word = le16_to_cpu(cur_word);
+	
+	/* Release sem */
+	up(&iface->sem);
+	
+	return rc;
+}
+
+/*
+ * Generic i2c master transfer entrypoint
+ */
+static int
+keywest_xfer(	struct i2c_adapter *adap,
+		struct i2c_msg msgs[], 
+		int num)
+{
+	struct keywest_chan* chan = i2c_get_adapdata(adap);
+	struct keywest_iface* iface = chan->iface;
+	struct i2c_msg *pmsg;
+	int i, completed;
+	int rc = 0;
+
+	down(&iface->sem);
+
+	/* Set adapter to standard mode */
+	iface->cur_mode &= ~KW_I2C_MODE_MODE_MASK;
+	iface->cur_mode |= KW_I2C_MODE_STANDARD;
+
+	completed = 0;
+	for (i = 0; rc >= 0 && i < num;) {
+		u8 addr;
+		
+		pmsg = &msgs[i++];
+		addr = pmsg->addr;
+		if (pmsg->flags & I2C_M_TEN) {
+			printk(KERN_ERR "i2c-keywest: 10 bits addr not supported !\n");
+			rc = -EINVAL;
+			break;
+		}
+		DBG("xfer: chan: %d, doing %s %d bytes to 0x%02x - %d of %d messages\n",
+		     chan->chan_no,
+		     pmsg->flags & I2C_M_RD ? "read" : "write",
+                     pmsg->len, addr, i, num);
+    
+		/* Setup channel & clear pending irqs */
+		write_reg(reg_mode, iface->cur_mode | (chan->chan_no << 4));
+		write_reg(reg_isr, read_reg(reg_isr));
+		write_reg(reg_status, 0);
+		
+		iface->data = pmsg->buf;
+		iface->datalen = pmsg->len;
+		iface->state = state_addr;
+		iface->result = 0;
+		iface->stopretry = 0;
+		if (pmsg->flags & I2C_M_RD)
+			iface->read_write = I2C_SMBUS_READ;
+		else
+			iface->read_write = I2C_SMBUS_WRITE;
+
+		/* Set up address and r/w bit */
+		if (pmsg->flags & I2C_M_REV_DIR_ADDR)
+			addr ^= 1;		
+		write_reg(reg_addr,
+			(addr << 1) |
+			((iface->read_write == I2C_SMBUS_READ) ? 0x01 : 0x00));
+
+		/* Arm timeout */
+		iface->timeout_timer.expires = jiffies + POLL_TIMEOUT;
+		add_timer(&iface->timeout_timer);
+
+		/* Start sending address & enable interrupt*/
+		write_reg(reg_control, read_reg(reg_control) | KW_I2C_CTL_XADDR);
+		write_reg(reg_ier, KW_I2C_IRQ_MASK);
+
+#ifdef POLLED_MODE
+		DBG("using polled mode...\n");
+		/* State machine, to turn into an interrupt handler */
+		while(iface->state != state_idle) {
+			u8 isr = wait_interrupt(iface);
+			handle_interrupt(iface, isr);
+		}
+#else /* POLLED_MODE */
+		DBG("using interrupt mode...\n");
+		wait_for_completion(&iface->complete);	
+#endif /* POLLED_MODE */	
+
+		rc = iface->result;
+		if (rc == 0)
+			completed++;
+		DBG("transfer done, result: %d\n", rc);
+	}
+
+	/* Release sem */
+	up(&iface->sem);
+
+	return completed;
+}
+
+static u32
+keywest_func(struct i2c_adapter * adapter)
+{
+	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
+	       I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
+	       I2C_FUNC_SMBUS_BLOCK_DATA;
+}
+
+/* For now, we only handle combined mode (smbus) */
+static struct i2c_algorithm keywest_algorithm = {
+	name:		"Keywest i2c",
+	id:		I2C_ALGO_SMBUS,
+	smbus_xfer:	keywest_smbus_xfer,
+	master_xfer:	keywest_xfer,
+	functionality:	keywest_func,
+};
+
+
+static int
+create_iface(struct device_node* np)
+{
+	unsigned long steps, *psteps, *prate;
+	unsigned bsteps, tsize, i, nchan, addroffset;
+	struct keywest_iface* iface;
+	int rc;
+
+	psteps = (unsigned long *)get_property(np, "AAPL,address-step", NULL);
+	steps = psteps ? (*psteps) : 0x10;
+
+	/* Hrm... maybe we can be smarter here */
+	for (bsteps = 0; (steps & 0x01) == 0; bsteps++)
+		steps >>= 1;
+
+	if (!strcmp(np->parent->name, "uni-n")) {
+		nchan = 2;
+		addroffset = 3;
+	} else {
+		addroffset = 0;
+		nchan = 1;
+	}
+
+	tsize = sizeof(struct keywest_iface) +
+		(sizeof(struct keywest_chan) + 4) * nchan;
+	iface = (struct keywest_iface *) kmalloc(tsize, GFP_KERNEL);
+	if (iface == NULL) {
+		printk(KERN_ERR "i2c-keywest: can't allocate inteface !\n");
+		return -ENOMEM;
+	}
+	memset(iface, 0, tsize);
+	init_MUTEX(&iface->sem);
+	spin_lock_init(&iface->lock);
+	init_completion(&iface->complete);
+	iface->bsteps = bsteps;
+	iface->chan_count = nchan;
+	iface->state = state_idle;
+	iface->irq = np->intrs[0].line;
+	iface->channels = (struct keywest_chan *)
+		(((unsigned long)(iface + 1) + 3UL) & ~3UL);
+	iface->base = (unsigned long)ioremap(np->addrs[0].address + addroffset,
+						np->addrs[0].size);
+	if (iface->base == 0) {
+		printk(KERN_ERR "i2c-keywest: can't map inteface !\n");
+		kfree(iface);
+		return -ENOMEM;
+	}
+
+	init_timer(&iface->timeout_timer);
+	iface->timeout_timer.function = keywest_timeout;
+	iface->timeout_timer.data = (unsigned long)iface;
+
+	/* Select interface rate */
+	iface->cur_mode = KW_I2C_MODE_100KHZ;
+	prate = (unsigned long *)get_property(np, "AAPL,i2c-rate", NULL);
+	if (prate) switch(*prate) {
+	case 100:
+		iface->cur_mode = KW_I2C_MODE_100KHZ;
+		break;
+	case 50:
+		iface->cur_mode = KW_I2C_MODE_50KHZ;
+		break;
+	case 25:
+		iface->cur_mode = KW_I2C_MODE_25KHZ;
+		break;
+	default:
+		printk(KERN_WARNING "i2c-keywest: unknown rate %ldKhz, using 100KHz\n",
+			*prate);
+	}
+	
+	/* Select standard sub mode */
+	iface->cur_mode |= KW_I2C_MODE_STANDARDSUB;
+	
+	/* Write mode */
+	write_reg(reg_mode, iface->cur_mode);
+	
+	/* Switch interrupts off & clear them*/
+	write_reg(reg_ier, 0x00);
+	write_reg(reg_isr, KW_I2C_IRQ_MASK);
+
+#ifndef POLLED_MODE
+	/* Request chip interrupt */	
+	rc = request_irq(iface->irq, keywest_irq, 0, "keywest i2c", iface);
+	if (rc) {
+		printk(KERN_ERR "i2c-keywest: can't get IRQ %d !\n", iface->irq);
+		iounmap((void *)iface->base);
+		kfree(iface);
+		return -ENODEV;
+	}
+#endif /* POLLED_MODE */
+
+	for (i=0; i<nchan; i++) {
+		struct keywest_chan* chan = &iface->channels[i];
+		u8 addr;
+		
+		sprintf(chan->adapter.dev.name, "%s %d", np->parent->name, i);
+		chan->iface = iface;
+		chan->chan_no = i;
+		chan->adapter.id = I2C_ALGO_SMBUS;
+		chan->adapter.algo = &keywest_algorithm;
+		chan->adapter.algo_data = NULL;
+		chan->adapter.client_register = NULL;
+		chan->adapter.client_unregister = NULL;
+		i2c_set_adapdata(&chan->adapter, chan);
+
+		rc = i2c_add_adapter(&chan->adapter);
+		if (rc) {
+			printk("i2c-keywest.c: Adapter %s registration failed\n",
+				chan->adapter.dev.name);
+			i2c_set_adapdata(&chan->adapter, NULL);
+		}
+		if (probe) {
+			printk("Probe: ");
+			for (addr = 0x00; addr <= 0x7f; addr++) {
+				if (i2c_smbus_xfer(&chan->adapter,addr,
+				    0,0,0,I2C_SMBUS_QUICK,NULL) >= 0)
+					printk("%02x ", addr);
+			}
+			printk("\n");
+		}
+	}
+
+	printk(KERN_INFO "Found KeyWest i2c on \"%s\", %d channel%s, stepping: %d bits\n",
+		np->parent->name, nchan, nchan > 1 ? "s" : "", bsteps);
+		
+	iface->next = ifaces;
+	ifaces = iface;
+	return 0;
+}
+
+static void
+dispose_iface(struct keywest_iface *iface)
+{
+	int i, rc;
+	
+	ifaces = iface->next;
+
+	/* Make sure we stop all activity */
+	down(&iface->sem);
+#ifndef POLLED_MODE
+	spin_lock_irq(&iface->lock);
+	while (iface->state != state_idle) {
+		spin_unlock_irq(&iface->lock);
+		schedule();
+		spin_lock_irq(&iface->lock);
+	}
+#endif /* POLLED_MODE */
+	iface->state = state_dead;
+#ifndef POLLED_MODE
+	spin_unlock_irq(&iface->lock);
+	free_irq(iface->irq, iface);
+#endif /* POLLED_MODE */
+	up(&iface->sem);
+
+	/* Release all channels */
+	for (i=0; i<iface->chan_count; i++) {
+		struct keywest_chan* chan = &iface->channels[i];
+		if (i2c_get_adapdata(&chan->adapter) == NULL)
+			continue;
+		rc = i2c_del_adapter(&chan->adapter);
+		i2c_set_adapdata(&chan->adapter, NULL);
+		/* We aren't that prepared to deal with this... */
+		if (rc)
+			printk("i2c-keywest.c: i2c_del_adapter failed, that's bad !\n");
+	}
+	iounmap((void *)iface->base);
+	kfree(iface);
+}
+
+static int __init
+i2c_keywest_init(void)
+{
+	struct device_node *np;
+	int rc = -ENODEV;
+	
+	np = find_compatible_devices("i2c", "keywest");
+	while (np != 0) {
+		if (np->n_addrs >= 1 && np->n_intrs >= 1)
+			rc = create_iface(np);
+		np = np->next;
+	}
+	if (ifaces)
+		rc = 0;
+	return rc;
+}
+
+static void __exit
+i2c_keywest_cleanup(void)
+{
+	while(ifaces)
+		dispose_iface(ifaces);
+}
+
+module_init(i2c_keywest_init);
+module_exit(i2c_keywest_cleanup);
diff -Nru a/drivers/i2c/i2c-keywest.h b/drivers/i2c/i2c-keywest.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/i2c/i2c-keywest.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,111 @@
+#ifndef __I2C_KEYWEST_H__
+#define __I2C_KEYWEST_H__
+
+/* The Tumbler audio equalizer can be really slow sometimes */
+#define POLL_TIMEOUT		(2*HZ)
+
+/* Register indices */
+typedef enum {
+	reg_mode = 0,
+	reg_control,
+	reg_status,
+	reg_isr,
+	reg_ier,
+	reg_addr,
+	reg_subaddr,
+	reg_data
+} reg_t;
+
+
+/* Mode register */
+#define KW_I2C_MODE_100KHZ	0x00
+#define KW_I2C_MODE_50KHZ	0x01
+#define KW_I2C_MODE_25KHZ	0x02
+#define KW_I2C_MODE_DUMB	0x00
+#define KW_I2C_MODE_STANDARD	0x04
+#define KW_I2C_MODE_STANDARDSUB	0x08
+#define KW_I2C_MODE_COMBINED	0x0C
+#define KW_I2C_MODE_MODE_MASK	0x0C
+#define KW_I2C_MODE_CHAN_MASK	0xF0
+
+/* Control register */
+#define KW_I2C_CTL_AAK		0x01
+#define KW_I2C_CTL_XADDR	0x02
+#define KW_I2C_CTL_STOP		0x04
+#define KW_I2C_CTL_START	0x08
+
+/* Status register */
+#define KW_I2C_STAT_BUSY	0x01
+#define KW_I2C_STAT_LAST_AAK	0x02
+#define KW_I2C_STAT_LAST_RW	0x04
+#define KW_I2C_STAT_SDA		0x08
+#define KW_I2C_STAT_SCL		0x10
+
+/* IER & ISR registers */
+#define KW_I2C_IRQ_DATA		0x01
+#define KW_I2C_IRQ_ADDR		0x02
+#define KW_I2C_IRQ_STOP		0x04
+#define KW_I2C_IRQ_START	0x08
+#define KW_I2C_IRQ_MASK		0x0F
+
+/* Physical interface */
+struct keywest_iface
+{
+	unsigned long		base;
+	unsigned		bsteps;
+	int			irq;
+	struct semaphore	sem;
+	spinlock_t		lock;
+	struct keywest_chan*	channels;
+	unsigned		chan_count;
+	u8			cur_mode;
+	char			read_write;
+	u8*			data;
+	unsigned		datalen;
+	int			state;
+	int			result;
+	int			stopretry;
+	struct timer_list	timeout_timer;
+	struct completion	complete;
+	struct keywest_iface*	next;
+};
+
+enum {
+	state_idle,
+	state_addr,
+	state_read,
+	state_write,
+	state_stop,
+	state_dead
+};
+
+/* Channel on an interface */
+struct keywest_chan
+{
+	struct i2c_adapter	adapter;
+	struct keywest_iface*	iface;
+	unsigned		chan_no;
+};
+
+/* Register access */
+
+static inline u8 __read_reg(struct keywest_iface *iface, reg_t reg)
+{
+	return in_8(((volatile u8 *)iface->base)
+		+ (((unsigned)reg) << iface->bsteps));
+}
+
+static inline void __write_reg(struct keywest_iface *iface, reg_t reg, u8 val)
+{
+	out_8(((volatile u8 *)iface->base)
+		+ (((unsigned)reg) << iface->bsteps), val);
+	(void)__read_reg(iface, reg);
+	udelay(10);
+}
+
+#define write_reg(reg, val)	__write_reg(iface, reg, val) 
+#define read_reg(reg)		__read_reg(iface, reg) 
+
+
+
+#endif /* __I2C_KEYWEST_H__ */
diff -Nru a/drivers/i2c/scx200_i2c.c b/drivers/i2c/scx200_i2c.c
--- a/drivers/i2c/scx200_i2c.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/i2c/scx200_i2c.c	Sat Apr 19 19:51:47 2003
@@ -82,9 +82,11 @@
 
 static struct i2c_adapter scx200_i2c_ops = {
 	.owner		   = THIS_MODULE,
-	.name              = "NatSemi SCx200 I2C",
 	.id		   = I2C_HW_B_VELLE,
 	.algo_data	   = &scx200_i2c_data,
+	.dev		= {
+		.name	= "NatSemi SCx200 I2C",
+	},
 };
 
 int scx200_i2c_init(void)
@@ -110,7 +112,7 @@
 
 	if (i2c_bit_add_bus(&scx200_i2c_ops) < 0) {
 		printk(KERN_ERR NAME ": adapter %s registration failed\n", 
-		       scx200_i2c_ops.name);
+		       scx200_i2c_ops.dev.name);
 		return -ENODEV;
 	}
 	
diff -Nru a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
--- a/drivers/ide/ide-cd.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/ide/ide-cd.c	Sat Apr 19 19:51:47 2003
@@ -3366,7 +3366,7 @@
 	DRIVER(drive)->busy++;
 	g->minors = 1;
 	g->minor_shift = 0;
-	g->de = drive->de;
+	strcpy(g->devfs_name, drive->devfs_name);
 	g->driverfs_dev = &drive->gendev;
 	g->flags = GENHD_FL_CD;
 	if (ide_cdrom_setup(drive)) {
diff -Nru a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
--- a/drivers/ide/ide-disk.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/ide/ide-disk.c	Sat Apr 19 19:51:46 2003
@@ -1816,10 +1816,9 @@
 	DRIVER(drive)->busy--;
 	g->minors = 1 << PARTN_BITS;
 	g->minor_shift = PARTN_BITS;
-	g->de = drive->de;
+	strcpy(g->devfs_name, drive->devfs_name);
 	g->driverfs_dev = &drive->gendev;
 	g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0;
-	g->flags |= GENHD_FL_DEVFS;
 	set_capacity(g, current_capacity(drive));
 	g->fops = &idedisk_ops;
 	add_disk(g);
diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c
--- a/drivers/ide/ide-floppy.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/ide/ide-floppy.c	Sat Apr 19 19:51:47 2003
@@ -2059,9 +2059,8 @@
 	g->minors = 1 << PARTN_BITS;
 	g->minor_shift = PARTN_BITS;
 	g->driverfs_dev = &drive->gendev;
-	g->de = drive->de;
+	strcpy(g->devfs_name, drive->devfs_name);
 	g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0;
-	g->flags |= GENHD_FL_DEVFS;
 	g->fops = &idefloppy_ops;
 	add_disk(g);
 	return 0;
diff -Nru a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
--- a/drivers/ide/ide-io.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/ide/ide-io.c	Sat Apr 19 19:51:50 2003
@@ -41,7 +41,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/ide.h>
-#include <linux/devfs_fs_kernel.h>
 #include <linux/completion.h>
 #include <linux/reboot.h>
 #include <linux/cdrom.h>
diff -Nru a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
--- a/drivers/ide/ide-probe.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/ide/ide-probe.c	Sat Apr 19 19:51:48 2003
@@ -1008,8 +1008,8 @@
 	 *	do not.
 	 */
 	 
-	q->queuedata = HWGROUP(drive);
 	blk_init_queue(q, do_ide_request, &ide_lock);
+	q->queuedata = HWGROUP(drive);
 	drive->queue_setup = 1;
 	blk_queue_segment_boundary(q, 0xffff);
 
@@ -1183,7 +1183,7 @@
 		hwif->io_ports[IDE_DATA_OFFSET]+7,
 		hwif->io_ports[IDE_CONTROL_OFFSET], __irq_itoa(hwif->irq));
 #else
-	printk("%s at %x on irq 0x%08x", hwif->name,
+	printk("%s at 0x%08lx on irq %d", hwif->name,
 		hwif->io_ports[IDE_DATA_OFFSET], hwif->irq);
 #endif /* __mc68000__ && CONFIG_APUS */
 	if (match)
@@ -1289,7 +1289,6 @@
 
 	for (unit = 0; unit < MAX_DRIVES; ++unit) {
 		ide_drive_t * drive = &hwif->drives[unit];
-		char name[64];
 		ide_add_generic_settings(drive);
 		snprintf(drive->gendev.bus_id,BUS_ID_SIZE,"%u.%u",
 			 hwif->index,unit);
@@ -1298,13 +1297,12 @@
 		drive->gendev.parent = &hwif->gendev;
 		drive->gendev.bus = &ide_bus_type;
 		drive->gendev.driver_data = drive;
-		sprintf (name, "ide/host%d/bus%d/target%d/lun%d",
-			(hwif->channel && hwif->mate) ?
-			hwif->mate->index : hwif->index,
-			hwif->channel, unit, drive->lun);
 		if (drive->present) {
 			device_register(&drive->gendev);
-			drive->de = devfs_mk_dir(name);
+			sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun%d",
+				(hwif->channel && hwif->mate) ?
+				hwif->mate->index : hwif->index,
+				hwif->channel, unit, drive->lun);
 		}
 	}
 	blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
diff -Nru a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
--- a/drivers/ide/ide-tape.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/ide/ide-tape.c	Sat Apr 19 19:51:46 2003
@@ -866,8 +866,6 @@
  */
 typedef struct {
 	ide_drive_t *drive;
-	devfs_handle_t de_r, de_n;
-
 	/*
 	 *	Since a typical character device operation requires more
 	 *	than one packet command, we provide here enough memory
@@ -6170,8 +6168,8 @@
 	DRIVER(drive)->busy = 0;
 	(void) ide_unregister_subdriver(drive);
 	drive->driver_data = NULL;
-	devfs_unregister(tape->de_r);
-	devfs_unregister(tape->de_n);
+	devfs_remove("%s/mt");
+	devfs_remove("%s/mtn");
 	devfs_unregister_tape(drive->disk->number);
 	kfree (tape);
 	drive->disk->fops = ide_fops;
@@ -6272,6 +6270,7 @@
 static int idetape_attach (ide_drive_t *drive)
 {
 	idetape_tape_t *tape;
+	char devfs_name[64];
 	int minor;
 
 	if (!strstr("ide-tape", drive->driver_req))
@@ -6306,17 +6305,20 @@
 		;
 	idetape_setup(drive, tape, minor);
 	idetape_chrdevs[minor].drive = drive;
-	tape->de_r =
-	    devfs_register (drive->de, "mt", DEVFS_FL_DEFAULT,
-			    HWIF(drive)->major, minor,
-			    S_IFCHR | S_IRUGO | S_IWUGO,
-			    &idetape_fops, NULL);
-	tape->de_n =
-	    devfs_register (drive->de, "mtn", DEVFS_FL_DEFAULT,
-			    HWIF(drive)->major, minor + 128,
-			    S_IFCHR | S_IRUGO | S_IWUGO,
-			    &idetape_fops, NULL);
-	drive->disk->number = devfs_register_tape(drive->de);
+
+	sprintf(devfs_name, "%s/mt", drive->devfs_name);
+	tape->de_r = devfs_register (NULL, devfs_name, 0,
+			HWIF(drive)->major, minor,
+			S_IFCHR | S_IRUGO | S_IWUGO,
+			&idetape_fops, NULL);
+
+	sprintf(devfs_name, "%s/mtn", drive->devfs_name);
+	tape->de_n = devfs_register (NULL, devfs_name, 0,
+			HWIF(drive)->major, minor + 128,
+			S_IFCHR | S_IRUGO | S_IWUGO,
+			&idetape_fops, NULL);
+
+	drive->disk->number = devfs_register_tape(drive->devfs_name);
 	drive->disk->fops = &idetape_block_ops;
 	return 0;
 failed:
diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c
--- a/drivers/ide/ide.c	Sat Apr 19 19:51:30 2003
+++ b/drivers/ide/ide.c	Sat Apr 19 19:51:30 2003
@@ -650,9 +650,9 @@
 	 */
 	for (i = 0; i < MAX_DRIVES; ++i) {
 		drive = &hwif->drives[i];
-		if (drive->de) {
-			devfs_unregister(drive->de);
-			drive->de = NULL;
+		if (drive->devfs_name[0] != '\0') {
+			devfs_remove(drive->devfs_name);
+			drive->devfs_name[0] = '\0';
 		}
 		if (!drive->present)
 			continue;
diff -Nru a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c
--- a/drivers/ide/legacy/gayle.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/ide/legacy/gayle.c	Sat Apr 19 19:51:50 2003
@@ -125,6 +125,7 @@
 	unsigned long base, ctrlport, irqport;
 	ide_ack_intr_t *ack_intr;
 	hw_regs_t hw;
+	ide_hwif_t *hwif;
 	int index;
 	unsigned long phys_base, res_start, res_n;
 
@@ -154,11 +155,12 @@
 
 	ide_setup_ports(&hw, base, gayle_offsets,
 			ctrlport, irqport, ack_intr,
-//			gaule_iops,
+//			&gayle_iops,
 			IRQ_AMIGA_PORTS);
 
-	index = ide_register_hw(&hw, NULL);
+	index = ide_register_hw(&hw, &hwif);
 	if (index != -1) {
+	    hwif->mmio = 2;
 	    switch (i) {
 		case 0:
 		    printk("ide%d: Gayle IDE interface (A%d style)\n", index,
diff -Nru a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c
--- a/drivers/ide/pci/hpt366.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/ide/pci/hpt366.c	Sat Apr 19 19:51:48 2003
@@ -1106,13 +1106,10 @@
 		    ((findev->devfn - dev->devfn) == 1) &&
 		    (PCI_FUNC(findev->devfn) & 1)) {
 			u8 irq = 0, irq2 = 0;
-			pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
-			pci_read_config_byte(findev, PCI_INTERRUPT_LINE, &irq2);
-			if (irq != irq2) {
-				pci_write_config_byte(findev,
-						PCI_INTERRUPT_LINE, irq);
+			if (findev->irq != dev->irq) {
+				/* FIXME: we need a core pci_set_interrupt() */
 				findev->irq = dev->irq;
-				printk("%s: pci-config space interrupt "
+				printk(KERN_WARNING "%s: pci-config space interrupt "
 					"fixed.\n", d->name);
 			}
 			ide_setup_pci_devices(dev, findev, d);
diff -Nru a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c
--- a/drivers/ide/pci/pdc202xx_new.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/ide/pci/pdc202xx_new.c	Sat Apr 19 19:51:49 2003
@@ -592,15 +592,8 @@
 			if ((findev->vendor == dev->vendor) &&
 			    (findev->device == dev->device) &&
 			    (PCI_SLOT(findev->devfn) & 2)) {
-				u8 irq = 0, irq2 = 0;
-				pci_read_config_byte(dev,
-					PCI_INTERRUPT_LINE, &irq);
-				pci_read_config_byte(findev,
-					PCI_INTERRUPT_LINE, &irq2);
-				if (irq != irq2) {
+				if (findev->irq != dev->irq) {
 					findev->irq = dev->irq;
-					pci_write_config_byte(findev,
-						PCI_INTERRUPT_LINE, irq);
 				}
 				ide_setup_pci_devices(dev, findev, d);
 				return;
diff -Nru a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c
--- a/drivers/ide/pci/serverworks.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/ide/pci/serverworks.c	Sat Apr 19 19:51:28 2003
@@ -419,7 +419,13 @@
 
 static void svwks_tune_drive (ide_drive_t *drive, u8 pio)
 {
-	(void) svwks_tune_chipset(drive, (XFER_PIO_0 + pio));
+	/* Tune to desired value or to "best". We must not adjust
+	   "best" when we adjust from pio numbers to rate values! */
+	   
+	if(pio != 255)
+		(void) svwks_tune_chipset(drive, (XFER_PIO_0 + pio));
+	else
+		(void) svwks_tune_chipset(drive, 255);
 }
 
 static int config_chipset_for_dma (ide_drive_t *drive)
diff -Nru a/drivers/ieee1394/amdtp.c b/drivers/ieee1394/amdtp.c
--- a/drivers/ieee1394/amdtp.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/ieee1394/amdtp.c	Sat Apr 19 19:51:49 2003
@@ -266,12 +266,10 @@
 	struct ti_ohci *ohci;
 	struct list_head stream_list;
 	spinlock_t stream_list_lock;
-	struct list_head link;
 };
 
 static struct hpsb_highlevel *amdtp_highlevel;
-static LIST_HEAD(host_list);
-static spinlock_t host_list_lock = SPIN_LOCK_UNLOCKED;
+
 
 /* FIXME: This doesn't belong here... */
 
@@ -347,7 +345,7 @@
 {
 	u32 syt_cycle, cycle_count, start_cycle;
 
-	cycle_count = reg_read(s->host->host->hostdata,
+	cycle_count = reg_read(s->host->ohci,
 			       OHCI1394_IsochronousCycleTimer) >> 12;
 	syt_cycle = (pl->last_cycle_count - PACKET_LIST_SIZE + 1) & 0x0f;
 
@@ -1169,15 +1167,9 @@
 static int amdtp_open(struct inode *inode, struct file *file)
 {
 	struct amdtp_host *host;
+	int i = ieee1394_file_to_instance(file);
 
-	/* FIXME: We just grab the first registered host */
-	spin_lock(&host_list_lock);
-	if (!list_empty(&host_list))
-		host = list_entry(host_list.next, struct amdtp_host, link);
-	else
-		host = NULL;
-	spin_unlock(&host_list_lock);
-
+	host = hpsb_get_hostinfo_bykey(amdtp_highlevel, i);
 	if (host == NULL)
 		return -ENODEV;
 
@@ -1209,44 +1201,45 @@
 
 /* IEEE1394 Subsystem functions */
 
-static void amdtp_add_host(struct hpsb_host *host)
+static void amdtp_add_host(struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
 	struct amdtp_host *ah;
+	int minor;
+	char name[16];
 
 	if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME) != 0)
 		return;
 
-	ah = kmalloc(sizeof *ah, in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
+	ah = hpsb_create_hostinfo(hl, host, sizeof(*ah));
+	if (!ah) {
+		HPSB_ERR("amdtp: Unable able to alloc hostinfo");
+		return;
+	}
+
 	ah->host = host;
 	ah->ohci = host->hostdata;
+
+	hpsb_set_hostinfo_key(hl, host, ah->ohci->id);
+
+	minor = IEEE1394_MINOR_BLOCK_AMDTP * 16 + ah->ohci->id;
+
+	sprintf(name, "amdtp/%d", ah->ohci->id);
+
 	INIT_LIST_HEAD(&ah->stream_list);
 	spin_lock_init(&ah->stream_list_lock);
 
-	spin_lock_irq(&host_list_lock);
-	list_add_tail(&ah->link, &host_list);
-	spin_unlock_irq(&host_list_lock);
+	devfs_register(NULL, name, 0, IEEE1394_MAJOR, minor,
+		       S_IFCHR | S_IRUSR | S_IWUSR, &amdtp_fops, NULL);
 }
 
 static void amdtp_remove_host(struct hpsb_host *host)
 {
-	struct list_head *lh;
-	struct amdtp_host *ah;
+	struct amdtp_host *ah = hpsb_get_hostinfo(amdtp_highlevel, host);
 
-	spin_lock_irq(&host_list_lock);
-	list_for_each(lh, &host_list) {
-		if (list_entry(lh, struct amdtp_host, link)->host == host) {
-			list_del(lh);
-			break;
-		}
-	}
-	spin_unlock_irq(&host_list_lock);
-	
-	if (lh != &host_list) {
-		ah = list_entry(lh, struct amdtp_host, link);
-		kfree(ah);
-	}
-	else
-		HPSB_ERR("remove_host: bogus ohci host: %p", host);
+	if (ah)
+		devfs_remove("amdtp/%d", ah->ohci->id);
+
+	return;
 }
 
 static struct hpsb_highlevel_ops amdtp_highlevel_ops = {
@@ -1273,10 +1266,13 @@
  		return -EIO;
  	}
 
+	devfs_mk_dir("amdtp");
+
 	amdtp_highlevel = hpsb_register_highlevel ("amdtp",
 						   &amdtp_highlevel_ops);
 	if (amdtp_highlevel == NULL) {
 		HPSB_ERR("amdtp: unable to register highlevel ops");
+		devfs_remove("amdtp");
 		ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_AMDTP);
 		return -EIO;
 	}
@@ -1309,6 +1305,7 @@
 #endif
 
         hpsb_unregister_highlevel(amdtp_highlevel);
+	devfs_remove("amdtp");
         ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_AMDTP);
 
 	HPSB_INFO("Unloaded AMDTP driver");
diff -Nru a/drivers/ieee1394/cmp.c b/drivers/ieee1394/cmp.c
--- a/drivers/ieee1394/cmp.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/ieee1394/cmp.c	Sat Apr 19 19:51:49 2003
@@ -65,8 +65,6 @@
 		quadlet_t impr_quadlet;
 	} v;
 	struct plug ipcr[2];
-
-	struct list_head link;
 };
 
 enum {
@@ -79,31 +77,6 @@
 
 static struct hpsb_highlevel *cmp_highlevel;
 
-static LIST_HEAD(host_list);
-static spinlock_t host_list_lock = SPIN_LOCK_UNLOCKED;
-
-static struct cmp_host *
-lookup_cmp_host(struct hpsb_host *host)
-{
-	struct cmp_host *ch;
-	struct list_head *lh;
-	unsigned long flags;
-
-	ch = NULL;
-	spin_lock_irqsave(&host_list_lock, flags);
-	list_for_each(lh, &host_list) {
-		ch = list_entry(lh, struct cmp_host, link);
-		if (ch->host == host)
-			break;
-	}
-	spin_unlock_irqrestore(&host_list_lock, flags);
-
-	if (lh == &host_list)
-		return NULL;
-	else
-		return ch;
-}
-
 struct cmp_pcr *
 cmp_register_opcr(struct hpsb_host *host, int opcr_number, int payload,
 		  void (*update)(struct cmp_pcr *pcr, void *data),
@@ -112,7 +85,7 @@
 	struct cmp_host *ch;
 	struct plug *plug;
 
-	ch = lookup_cmp_host(host);
+	ch = hpsb_get_hostinfo(cmp_highlevel, host);
 
 	if (opcr_number >= ch->u.ompr.nplugs ||
 	    ch->opcr[opcr_number].update != NULL)
@@ -135,7 +108,7 @@
 	struct cmp_host *ch;
 	struct plug *plug;
 
-	ch = lookup_cmp_host(host);
+	ch = hpsb_get_hostinfo(cmp_highlevel, host);
 	plug = (struct plug *)opcr;
 	if (plug - ch->opcr >= ch->u.ompr.nplugs) BUG();
 
@@ -155,48 +128,34 @@
 	}
 }
 
-static void cmp_add_host(struct hpsb_host *host)
+static void cmp_add_host(struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
-	struct cmp_host *ch;
+	struct cmp_host *ch = hpsb_create_hostinfo(hl, host, sizeof (*ch));
 
-	ch = kmalloc(sizeof *ch, in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
 	if (ch == NULL) {
 		HPSB_ERR("Failed to allocate cmp_host");
 		return;
 	}
-	memset(ch, 0, sizeof *ch);
+
 	ch->host = host;
 	ch->u.ompr.rate = SPEED_100;
 	ch->u.ompr.bcast_channel_base = 63;
 	ch->u.ompr.nplugs = 2;
-	reset_plugs(ch);
-
-	spin_lock_irq(&host_list_lock);
-	list_add_tail(&ch->link, &host_list);
-	spin_unlock_irq(&host_list_lock);
-}
-
-static void cmp_host_reset(struct hpsb_host *host)
-{
-	struct cmp_host *ch;
 
-	ch = lookup_cmp_host(host);
-	if (ch == NULL) BUG();
 	reset_plugs(ch);
 }
 
-static void cmp_remove_host(struct hpsb_host *host)
+static void cmp_host_reset(struct hpsb_host *host)
 {
 	struct cmp_host *ch;
 
-	ch = lookup_cmp_host(host);
-	if (ch == NULL) BUG();
-
-	spin_lock_irq(&host_list_lock);
-	list_del(&ch->link);
-	spin_unlock_irq(&host_list_lock);
+	ch = hpsb_get_hostinfo(cmp_highlevel, host);
+	if (ch == NULL) {
+		HPSB_ERR("cmp: Tried to reset unknown host");
+		return;
+	}
 
-	kfree(ch);
+	reset_plugs(ch);
 }
 
 static int pcr_read(struct hpsb_host *host, int nodeid, quadlet_t *buf,
@@ -209,7 +168,7 @@
 	if (length != 4)
 		return RCODE_TYPE_ERROR;
 
-	ch = lookup_cmp_host(host);
+	ch = hpsb_get_hostinfo(cmp_highlevel, host);
 	if (csraddr == 0x900) {
 		*buf = cpu_to_be32(ch->u.ompr_quadlet);
 		return RCODE_COMPLETE;   
@@ -242,7 +201,7 @@
 	int plug;
 	struct cmp_host *ch;
 
-	ch = lookup_cmp_host(host);
+	ch = hpsb_get_hostinfo(cmp_highlevel, host);
 	
 	if (extcode != EXTCODE_COMPARE_SWAP) 
 		return RCODE_TYPE_ERROR;
@@ -301,7 +260,6 @@
 
 static struct hpsb_highlevel_ops cmp_highlevel_ops = {
 	.add_host =	cmp_add_host,
-	.remove_host =	cmp_remove_host,
         .host_reset =	cmp_host_reset,
 };
 
diff -Nru a/drivers/ieee1394/csr.c b/drivers/ieee1394/csr.c
--- a/drivers/ieee1394/csr.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/ieee1394/csr.c	Sat Apr 19 19:51:29 2003
@@ -18,7 +18,8 @@
  */
 
 #include <linux/string.h>
-#include <linux/module.h> /* needed for MODULE_PARM */
+#include <linux/module.h>
+#include <linux/moduleparam.h>
 
 #include "ieee1394_types.h"
 #include "hosts.h"
@@ -27,9 +28,10 @@
 
 /* Module Parameters */
 /* this module parameter can be used to disable mapping of the FCP registers */
-MODULE_PARM(fcp,"i");
-MODULE_PARM_DESC(fcp, "Map FCP registers (default = 1, disable = 0).");
+
 static int fcp = 1;
+module_param(fcp, int, 0444);
+MODULE_PARM_DESC(fcp, "Map FCP registers (default = 1, disable = 0).");
 
 static u16 csr_crc16(unsigned *data, int length)
 {
@@ -88,7 +90,7 @@
 }
 
 
-static void add_host(struct hpsb_host *host)
+static void add_host(struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
         host->csr.lock = SPIN_LOCK_UNLOCKED;
 
@@ -116,7 +118,9 @@
 int hpsb_update_config_rom(struct hpsb_host *host, const quadlet_t *new_rom, 
 	size_t size, unsigned char rom_version)
 {
-        int ret,flags;
+	unsigned long flags;
+	int ret;
+
         spin_lock_irqsave(&host->csr.lock, flags); 
         if (rom_version != host->csr.rom_version)
                  ret = -1;
@@ -135,7 +139,9 @@
 int hpsb_get_config_rom(struct hpsb_host *host, quadlet_t *buffer, 
 	size_t buffersize, size_t *rom_size, unsigned char *rom_version)
 {
-        int ret,flags;
+	unsigned long flags;
+	int ret;
+
         spin_lock_irqsave(&host->csr.lock, flags); 
         *rom_version=host->csr.rom_version;
         *rom_size=host->csr.rom_size;
@@ -154,9 +160,9 @@
 static int read_maps(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
                      u64 addr, unsigned int length, u16 fl)
 {
+	unsigned long flags;
         int csraddr = addr - CSR_REGISTER_BASE;
         const char *src;
-        int flags;
 
         spin_lock_irqsave(&host->csr.lock, flags); 
 
diff -Nru a/drivers/ieee1394/dv1394-private.h b/drivers/ieee1394/dv1394-private.h
--- a/drivers/ieee1394/dv1394-private.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/ieee1394/dv1394-private.h	Sat Apr 19 19:51:49 2003
@@ -403,9 +403,6 @@
 	/* entry in dv1394_cards */
 	struct list_head list;
 
-	/* handle to /dev/ieee1394/dv/N, NULL if devfs not in use */
-	devfs_handle_t devfs_handle;
-
 	/* OHCI card IT DMA context number, -1 if not in use */
 	int ohci_it_ctx;
 	struct ohci1394_iso_tasklet it_tasklet;
diff -Nru a/drivers/ieee1394/dv1394.c b/drivers/ieee1394/dv1394.c
--- a/drivers/ieee1394/dv1394.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/ieee1394/dv1394.c	Sat Apr 19 19:51:49 2003
@@ -116,6 +116,7 @@
 
 #include "ieee1394.h"
 #include "ieee1394_types.h"
+#include "ieee1394_hotplug.h"
 #include "hosts.h"
 #include "ieee1394_core.h"
 #include "highlevel.h"	
@@ -140,7 +141,7 @@
        (will cause undeflows if your machine is too slow!)
 */
 
-#define DV1394_DEBUG_LEVEL 1
+#define DV1394_DEBUG_LEVEL 0
 
 /* for debugging use ONLY: allow more than one open() of the device */
 /* #define DV1394_ALLOW_MORE_THAN_ONE_OPEN 1 */
@@ -2457,18 +2458,39 @@
 		(video->pal_or_ntsc == DV1394_NTSC ? "NTSC" : "PAL"),
 		(video->mode == MODE_RECEIVE ? "in" : "out"));
 
-	video->devfs_handle = devfs_register(NULL, buf, 0, IEEE1394_MAJOR,
-					     IEEE1394_MINOR_BLOCK_DV1394*16 + video->id,
-					     S_IFCHR | S_IRUGO | S_IWUGO,
-					     &dv1394_fops, video);
-	if (video->devfs_handle == NULL) {
-		printk(KERN_ERR "dv1394: unable to create /dev/%s\n", buf);
-		return -ENOMEM;
-	}
+	devfs_register(NULL, buf, 0, IEEE1394_MAJOR,
+			IEEE1394_MINOR_BLOCK_DV1394*16 + video->id,
+			S_IFCHR | S_IRUGO | S_IWUGO, &dv1394_fops, video);
 	return 0;
 }
 #endif /* CONFIG_DEVFS_FS */
 
+
+/*** HOTPLUG STUFF **********************************************************/
+/*
+ * Export information about protocols/devices supported by this driver.
+ */
+static struct ieee1394_device_id dv1394_id_table[] = {
+	{
+		.match_flags	= IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION,
+		.specifier_id	= AVC_UNIT_SPEC_ID_ENTRY & 0xffffff,
+		.version	= AVC_SW_VERSION_ENTRY & 0xffffff
+	},
+	{ }
+};
+
+MODULE_DEVICE_TABLE(ieee1394, dv1394_id_table);
+
+static struct hpsb_protocol_driver dv1394_driver = {
+	.name		= "DV/1394 Driver",
+	.id_table	= dv1394_id_table,
+	.driver         = {
+		.name	= "dv1394",
+		.bus	= &ieee1394_bus_type,
+	},
+};
+
+
 /*** IEEE1394 HPSB CALLBACKS ***********************************************/
 
 static int dv1394_init(struct ti_ohci *ohci, enum pal_or_ntsc format, enum modes mode)
@@ -2623,7 +2645,7 @@
 #endif	
 }
 
-static void dv1394_add_host (struct hpsb_host *host)
+static void dv1394_add_host (struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
 	struct ti_ohci *ohci;
 	char buf[16];
@@ -2897,6 +2919,8 @@
 		printk(KERN_ERR "dv1394: Error unregistering ioctl32 translations\n");
 #endif
 
+	hpsb_unregister_protocol(&dv1394_driver);
+
 	hpsb_unregister_highlevel (hl_handle);
 	ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_DV1394);
 #ifdef CONFIG_DEVFS_FS
@@ -2919,11 +2943,7 @@
 	}
 
 #ifdef CONFIG_DEVFS_FS
-	if (!devfs_mk_dir("ieee1394/dv")) {
-		printk(KERN_ERR "dv1394: unable to create /dev/ieee1394/dv\n");
-		ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_DV1394);
-		return -ENOMEM;
-	}
+	devfs_mk_dir("ieee1394/dv");
 #endif
 
 #ifdef CONFIG_PROC_FS
@@ -2950,6 +2970,8 @@
 #endif
 		return -ENOMEM;
 	}
+
+	hpsb_register_protocol(&dv1394_driver);
 
 #ifdef CONFIG_COMPAT
 	/* First compatible ones */
diff -Nru a/drivers/ieee1394/eth1394.c b/drivers/ieee1394/eth1394.c
--- a/drivers/ieee1394/eth1394.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/ieee1394/eth1394.c	Sat Apr 19 19:51:49 2003
@@ -78,7 +78,7 @@
 	printk(KERN_ERR fmt, ## args)
 
 static char version[] __devinitdata =
-	"$Rev: 806 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 886 $ Ben Collins <bcollins@debian.org>";
 
 /* Our ieee1394 highlevel driver */
 #define ETHER1394_DRIVER_NAME "ether1394"
@@ -86,9 +86,6 @@
 static kmem_cache_t *packet_task_cache;
 static struct hpsb_highlevel *hl_handle = NULL;
 
-/* Card handling */
-static LIST_HEAD (host_info_list);
-static spinlock_t host_info_lock = SPIN_LOCK_UNLOCKED;
 
 /* Use common.lf to determine header len */
 static int hdr_type_len[] = {
@@ -105,40 +102,6 @@
 static void ether1394_iso(struct hpsb_iso *iso);
 
 
-/* Find our host_info struct for a given host pointer. Must be called
- * under spinlock.  */
-static inline struct host_info *find_host_info (struct hpsb_host *host)
-{
-	struct list_head *lh;
-	struct host_info *hi;
-
-	lh = host_info_list.next;
-	while (lh != &host_info_list) {
-		hi = list_entry (lh, struct host_info, list);
-
-		if (hi->host == host)
-			return hi;
-
-		lh = lh->next;
-	}
-	return NULL;
-}
-
-/* Find the network device for our host */
-static inline struct net_device *ether1394_find_dev (struct hpsb_host *host)
-{
-	struct host_info *hi;
-
-	spin_lock_irq (&host_info_lock);
-	hi = find_host_info (host);
-	spin_unlock_irq (&host_info_lock);
-
-	if (hi == NULL)
-		return NULL;
-
-	return hi->dev;
-}
-
 /* This is called after an "ifup" */
 static int ether1394_open (struct net_device *dev)
 {
@@ -355,7 +318,7 @@
  * when the module is installed. This is where we add all of our ethernet
  * devices. One for each host.
  */
-static void ether1394_add_host (struct hpsb_host *host)
+static void ether1394_add_host (struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
 	struct host_info *hi = NULL;
 	struct net_device *dev = NULL;
@@ -378,30 +341,22 @@
 
 	priv->host = host;
 
-	hi = (struct host_info *)kmalloc (sizeof (struct host_info),
-					  in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
+	hi = hpsb_create_hostinfo(hl, host, sizeof(*hi));
 
 	if (hi == NULL)
 		goto out;
 
 	if (register_netdev (dev)) {
 		ETH1394_PRINT (KERN_ERR, dev->name, "Error registering network driver\n");
-		kfree (dev);
-		kfree (hi);
-		return;
+		goto out;
 	}
 
 	ETH1394_PRINT (KERN_ERR, dev->name, "IEEE-1394 IPv4 over 1394 Ethernet (%s)\n",
 		       host->driver->name);
 
-	INIT_LIST_HEAD (&hi->list);
 	hi->host = host;
 	hi->dev = dev;
 
-	spin_lock_irq (&host_info_lock);
-	list_add_tail (&hi->list, &host_info_list);
-	spin_unlock_irq (&host_info_lock);
-
 	/* Ignore validity in hopes that it will be set in the future.  It'll
 	 * check it on transmit. */
 	priv->broadcast_channel = host->csr.broadcast_channel & 0x3f;
@@ -416,6 +371,9 @@
 out:
 	if (dev != NULL)
 		kfree (dev);
+	if (hi)
+		hpsb_destroy_hostinfo(hl, host);
+
 	ETH1394_PRINT_G (KERN_ERR, "Out of memory\n");
 
 	return;
@@ -424,20 +382,17 @@
 /* Remove a card from our list */
 static void ether1394_remove_host (struct hpsb_host *host)
 {
-	struct eth1394_priv *priv;
-	struct host_info *hi;
+	struct host_info *hi = hpsb_get_hostinfo(hl_handle, host);
 
-	spin_lock_irq (&host_info_lock);
-	hi = find_host_info (host);
 	if (hi != NULL) {
-		priv = (struct eth1394_priv *)hi->dev->priv;
+		struct eth1394_priv *priv = (struct eth1394_priv *)hi->dev->priv;
+
 		priv->bc_state = ETHER1394_BC_CLOSED;
 		unregister_netdev (hi->dev);
+		hpsb_iso_shutdown(priv->iso);
+
 		kfree (hi->dev);
-		list_del (&hi->list);
-		kfree (hi);
 	}
-	spin_unlock_irq (&host_info_lock);
 
 	return;
 }
@@ -445,12 +400,15 @@
 /* A reset has just arisen */
 static void ether1394_host_reset (struct hpsb_host *host)
 {
-	struct net_device *dev = ether1394_find_dev(host);
+	struct host_info *hi = hpsb_get_hostinfo(hl_handle, host);
+	struct net_device *dev;
 
 	/* This can happen for hosts that we don't use */
-	if (dev == NULL)
+	if (hi == NULL)
 		return;
 
+	dev = hi->dev;
+
 	/* Reset our private host data, but not our mtu */
 	netif_stop_queue (dev);
 	ether1394_reset_priv (dev, 0);
@@ -559,15 +517,18 @@
 	struct sk_buff *skb;
 	char *buf = (char *)data;
 	unsigned long flags;
-	struct net_device *dev = ether1394_find_dev (host);
+	struct host_info *hi = hpsb_get_hostinfo(hl_handle, host);
+	struct net_device *dev;
 	struct eth1394_priv *priv;
 
-	if (dev == NULL) {
+	if (hi == NULL) {
 		ETH1394_PRINT_G (KERN_ERR, "Could not find net device for host %p\n",
 				 host);
 		return RCODE_ADDRESS_ERROR;
 	}
 
+	dev = hi->dev;
+
 	priv = (struct eth1394_priv *)dev->priv;
 
 	/* A packet has been received by the ieee1394 bus. Build an skbuff
@@ -627,8 +588,9 @@
 	struct sk_buff *skb;
 	quadlet_t *data;
 	char *buf;
-	int flags;
-	struct net_device *dev = ether1394_find_dev(iso->host);
+	unsigned long flags;
+	struct host_info *hi = hpsb_get_hostinfo(hl_handle, iso->host);
+	struct net_device *dev;
 	struct eth1394_priv *priv;
 	unsigned int len;
 	u32 specifier_id;
@@ -636,12 +598,14 @@
 	int i;
 	int nready;
 
-	if (dev == NULL) {
+	if (hi == NULL) {
 		ETH1394_PRINT_G (KERN_ERR, "Could not find net device for host %s\n",
 				 iso->host->driver->name);
 		return;
 	}
 
+	dev = hi->dev;
+
 	nready = hpsb_iso_n_ready(iso);
 	for(i = 0; i < nready; i++) {
 		struct hpsb_iso_packet_info *info = &iso->infos[iso->first_packet + i];
@@ -941,19 +905,6 @@
 
 static void __exit ether1394_exit_module (void)
 {
-	struct list_head *lh;
-	struct host_info *hi;
-	struct eth1394_priv *priv;
-
-	lh = host_info_list.next;
-	while (lh != &host_info_list) {
-		hi = list_entry (lh, struct host_info, list);
-		priv = (struct eth1394_priv*)hi->dev->priv;
-		if (priv->bc_state != ETHER1394_BC_CLOSED) {
-			hpsb_iso_shutdown(priv->iso);
-		}
-		lh = lh->next;
-	}
 	hpsb_unregister_highlevel (hl_handle);
 	kmem_cache_destroy(packet_task_cache);
 }
diff -Nru a/drivers/ieee1394/eth1394.h b/drivers/ieee1394/eth1394.h
--- a/drivers/ieee1394/eth1394.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/ieee1394/eth1394.h	Sat Apr 19 19:51:50 2003
@@ -56,7 +56,6 @@
 };
 
 struct host_info {
-	struct list_head list;
 	struct hpsb_host *host;
 	struct net_device *dev;
 };
diff -Nru a/drivers/ieee1394/highlevel.c b/drivers/ieee1394/highlevel.c
--- a/drivers/ieee1394/highlevel.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/ieee1394/highlevel.c	Sat Apr 19 19:51:50 2003
@@ -19,6 +19,7 @@
 
 #include <linux/config.h>
 #include <linux/slab.h>
+#include <linux/list.h>
 
 #include "ieee1394.h"
 #include "ieee1394_types.h"
@@ -27,20 +28,192 @@
 #include "highlevel.h"
 
 
-LIST_HEAD(hl_drivers);
+struct hl_host_info {
+	struct list_head list;
+	struct hpsb_host *host;
+	size_t size;
+	unsigned long key;
+	void *data;
+};
+
+
+static LIST_HEAD(hl_drivers);
 static DECLARE_MUTEX(hl_drivers_lock);
 
-LIST_HEAD(addr_space);
-rwlock_t addr_space_lock = RW_LOCK_UNLOCKED;
+static LIST_HEAD(addr_space);
+static rwlock_t addr_space_lock = RW_LOCK_UNLOCKED;
 
 /* addr_space list will have zero and max already included as bounds */
 static struct hpsb_address_ops dummy_ops = { NULL, NULL, NULL, NULL };
 static struct hpsb_address_serve dummy_zero_addr, dummy_max_addr;
 
+
+/* Internal usage. Must be called with hl_drivers_lock held */
+static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl,
+					      struct hpsb_host *host)
+{
+	struct hl_host_info *hi;
+	struct list_head *lh;
+
+	list_for_each (lh, &hl->host_info_list) {
+		hi = list_entry(lh, struct hl_host_info, list);
+		if (hi->host == host)
+			return hi;
+	}
+
+	return NULL;
+}
+
+
+/* Returns a per host/driver data structure that was previously stored by
+ * hpsb_create_hostinfo. */
+void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host)
+{
+	struct hl_host_info *hi;
+	void *data = NULL;
+
+	read_lock(&hl_drivers_lock);
+	hi = hl_get_hostinfo(hl, host);
+	if (hi)
+		data = hi->data;
+	read_unlock(&hl_drivers_lock);
+
+	return data;
+}
+
+
+/* If size is zero, then the return here is only valid for error checking */
+void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host,
+			   size_t data_size)
+{
+	struct hl_host_info *hi;
+	void *data;
+
+	read_lock(&hl_drivers_lock);
+	hi = hl_get_hostinfo(hl, host);
+	read_unlock(&hl_drivers_lock);
+	if (hi) {
+		HPSB_ERR("%s called hpsb_create_hostinfo when hostinfo already exists",
+			 hl->name);
+		return NULL;
+	}
+
+	hi = kmalloc(sizeof(*hi) + data_size, GFP_KERNEL);
+	if (!hi)
+		return NULL;
+
+	memset(hi, 0, sizeof(*hi) + data_size);
+
+	if (data_size) {
+		data = hi->data = hi + 1;
+		hi->size = data_size;
+	} else
+		data = hi;
+
+	hi->host = host;
+
+	write_lock_irq(&hl_drivers_lock);
+	list_add_tail(&hi->list, &hl->host_info_list);
+	write_unlock_irq(&hl_drivers_lock);
+
+	return data;
+}
+
+
+int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host,
+		      void *data)
+{
+	struct hl_host_info *hi;
+	int ret = -EINVAL;
+
+	write_lock_irq(&hl_drivers_lock);
+	hi = hl_get_hostinfo(hl, host);
+	if (hi) {
+		if (!hi->size && !hi->data) {
+			hi->data = data;
+			ret = 0;
+		} else
+			HPSB_ERR("%s called hpsb_set_hostinfo when hostinfo already has data",
+				 hl->name);
+	} else
+		HPSB_ERR("%s called hpsb_set_hostinfo when no hostinfo exists",
+			 hl->name);
+	write_unlock_irq(&hl_drivers_lock);
+
+	return ret;
+}
+
+
+void hpsb_destroy_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host)
+{
+	struct hl_host_info *hi;
+
+	write_lock_irq(&hl_drivers_lock);
+	hi = hl_get_hostinfo(hl, host);
+	if (hi) {
+		list_del(&hi->list);
+		kfree(hi);
+	}
+	write_unlock_irq(&hl_drivers_lock);
+
+	return;
+}
+
+
+void hpsb_set_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned long key)
+{
+	struct hl_host_info *hi;
+
+	write_lock(&hl_drivers_lock);
+	hi = hl_get_hostinfo(hl, host);
+	if (hi)
+		hi->key = key;
+	write_unlock(&hl_drivers_lock);
+
+	return;
+}
+
+
+unsigned long hpsb_get_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host)
+{
+	struct hl_host_info *hi;
+	unsigned long key = 0;
+
+	read_lock(&hl_drivers_lock);
+	hi = hl_get_hostinfo(hl, host);
+	if (hi)
+		key = hi->key;
+	read_unlock(&hl_drivers_lock);
+
+	return key;
+}
+
+
+void *hpsb_get_hostinfo_bykey(struct hpsb_highlevel *hl, unsigned long key)
+{
+	struct list_head *lh;
+	struct hl_host_info *hi;
+	void *data = NULL;
+
+	read_lock(&hl_drivers_lock);
+	list_for_each (lh, &hl->host_info_list) {
+		hi = list_entry(lh, struct hl_host_info, list);
+		if (hi->key == key) {
+			data = hi->data;
+			break;
+		}
+	}
+	read_unlock(&hl_drivers_lock);
+
+	return data;
+}
+
+
 struct hpsb_highlevel *hpsb_register_highlevel(const char *name,
                                                struct hpsb_highlevel_ops *ops)
 {
         struct hpsb_highlevel *hl;
+	struct list_head *lh;
 
         hl = (struct hpsb_highlevel *)kmalloc(sizeof(struct hpsb_highlevel),
                                               GFP_KERNEL);
@@ -50,6 +223,8 @@
 
         INIT_LIST_HEAD(&hl->hl_list);
         INIT_LIST_HEAD(&hl->addr_list);
+	INIT_LIST_HEAD(&hl->host_info_list);
+
         hl->name = name;
         hl->op = ops;
 
@@ -57,14 +232,21 @@
         list_add_tail(&hl->hl_list, &hl_drivers);
 	up(&hl_drivers_lock);
 
-	hl_all_hosts(hl->op->add_host);
+	if (hl->op->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->op->add_host(host, hl);
+		}
+		up(&hpsb_hosts_lock);
+	}
 
         return hl;
 }
 
 void hpsb_unregister_highlevel(struct hpsb_highlevel *hl)
 {
-        struct list_head *entry;
+        struct list_head *lh, *next;
         struct hpsb_address_serve *as;
 
         if (hl == NULL) {
@@ -72,12 +254,9 @@
         }
 
         write_lock_irq(&addr_space_lock);
-        entry = hl->addr_list.next;
-
-        while (entry != &hl->addr_list) {
-                as = list_entry(entry, struct hpsb_address_serve, addr_list);
+	list_for_each_safe (lh, next, &hl->addr_list) {
+                as = list_entry(lh, struct hpsb_address_serve, addr_list);
                 list_del(&as->as_list);
-                entry = entry->next;
                 kfree(as);
         }
         write_unlock_irq(&addr_space_lock);
@@ -86,8 +265,16 @@
         list_del(&hl->hl_list);
 	up(&hl_drivers_lock);
 
-        if (hl->op->remove_host)
-		hl_all_hosts(hl->op->remove_host);
+        if (hl->op->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->op->remove_host(host);
+			hpsb_destroy_hostinfo(hl, host);
+		}
+		up(&hpsb_hosts_lock);
+	}
 
         kfree(hl);
 }
@@ -98,6 +285,7 @@
         struct hpsb_address_serve *as;
         struct list_head *entry;
         int retval = 0;
+        unsigned long flags;
 
         if (((start|end) & 3) || (start >= end) || (end > 0x1000000000000ULL)) {
                 HPSB_ERR("%s called with invalid addresses", __FUNCTION__);
@@ -116,7 +304,7 @@
         as->start = start;
         as->end = end;
 
-        write_lock_irq(&addr_space_lock);
+        write_lock_irqsave(&addr_space_lock, flags);
         entry = addr_space.next;
 
         while (list_entry(entry, struct hpsb_address_serve, as_list)->end <= start) {
@@ -128,7 +316,7 @@
                 }
                 entry = entry->next;
         }
-        write_unlock_irq(&addr_space_lock);
+        write_unlock_irqrestore(&addr_space_lock, flags);
 
         if (retval == 0) {
                 kfree(as);
@@ -142,8 +330,9 @@
         int retval = 0;
         struct hpsb_address_serve *as;
         struct list_head *entry;
+        unsigned long flags;
 
-        write_lock_irq(&addr_space_lock);
+        write_lock_irqsave(&addr_space_lock, flags);
 
         entry = hl->addr_list.next;
 
@@ -159,7 +348,7 @@
                 }
         }
 
-        write_unlock_irq(&addr_space_lock);
+        write_unlock_irqrestore(&addr_space_lock, flags);
 
         return retval;
 }
@@ -202,7 +391,8 @@
         list_for_each(entry, &hl_drivers) {
                 hl = list_entry(entry, struct hpsb_highlevel, hl_list);
 
-		hl->op->add_host(host);
+		if (hl->op->add_host)
+			hl->op->add_host(host, hl);
         }
         up(&hl_drivers_lock);
 }
@@ -216,8 +406,10 @@
 	list_for_each(entry, &hl_drivers) {
                 hl = list_entry(entry, struct hpsb_highlevel, hl_list);
 
-		if (hl->op->remove_host)
+		if (hl->op->remove_host) {
 			hl->op->remove_host(host);
+			hpsb_destroy_hostinfo(hl, host);
+		}
         }
         up(&hl_drivers_lock);
 }
@@ -237,48 +429,40 @@
 	up(&hl_drivers_lock);
 }
 
-void highlevel_iso_receive(struct hpsb_host *host, quadlet_t *data,
+void highlevel_iso_receive(struct hpsb_host *host, void *data,
                            unsigned int length)
 {
         struct list_head *entry;
         struct hpsb_highlevel *hl;
-        int channel = (data[0] >> 8) & 0x3f;
+        int channel = (((quadlet_t *)data)[0] >> 8) & 0x3f;
 
         down(&hl_drivers_lock);
-        entry = hl_drivers.next;
-
-        while (entry != &hl_drivers) {
+	list_for_each(entry, &hl_drivers) {
                 hl = list_entry(entry, struct hpsb_highlevel, hl_list);
-                if (hl->op->iso_receive) {
+
+                if (hl->op->iso_receive)
                         hl->op->iso_receive(host, channel, data, length);
-                }
-                entry = entry->next;
         }
         up(&hl_drivers_lock);
 }
 
 void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction,
-                           u8 *data, unsigned int length)
+                           void *data, unsigned int length)
 {
         struct list_head *entry;
         struct hpsb_highlevel *hl;
-        int cts = data[0] >> 4;
+        int cts = ((quadlet_t *)data)[0] >> 4;
 
         down(&hl_drivers_lock);
-        entry = hl_drivers.next;
-
-        while (entry != &hl_drivers) {
+	list_for_each(entry, &hl_drivers) {
                 hl = list_entry(entry, struct hpsb_highlevel, hl_list);
-                if (hl->op->fcp_request) {
-                        hl->op->fcp_request(host, nodeid, direction, cts, data,
-                                            length);
-                }
-                entry = entry->next;
+                if (hl->op->fcp_request)
+                        hl->op->fcp_request(host, nodeid, direction, cts, data, length);
         }
         up(&hl_drivers_lock);
 }
 
-int highlevel_read(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
+int highlevel_read(struct hpsb_host *host, int nodeid, void *data,
                    u64 addr, unsigned int length, u16 flags)
 {
         struct hpsb_address_serve *as;
@@ -295,13 +479,14 @@
                 if (as->end > addr) {
                         partlength = min(as->end - addr, (u64) length);
 
-                        if (as->op->read != NULL) {
-                                rcode = as->op->read(host, nodeid, buffer,
+                        if (as->op->read) {
+                                rcode = as->op->read(host, nodeid, data,
 						     addr, partlength, flags);
                         } else {
                                 rcode = RCODE_TYPE_ERROR;
                         }
 
+			(u8 *)data += partlength;
                         length -= partlength;
                         addr += partlength;
 
@@ -324,7 +509,7 @@
 }
 
 int highlevel_write(struct hpsb_host *host, int nodeid, int destid,
-		    quadlet_t *data, u64 addr, unsigned int length, u16 flags)
+		    void *data, u64 addr, unsigned int length, u16 flags)
 {
         struct hpsb_address_serve *as;
         struct list_head *entry;
@@ -340,13 +525,14 @@
                 if (as->end > addr) {
                         partlength = min(as->end - addr, (u64) length);
 
-                        if (as->op->write != NULL) {
+                        if (as->op->write) {
                                 rcode = as->op->write(host, nodeid, destid,
 						      data, addr, partlength, flags);
                         } else {
                                 rcode = RCODE_TYPE_ERROR;
                         }
 
+			(u8 *)data += partlength;
                         length -= partlength;
                         addr += partlength;
 
@@ -383,7 +569,7 @@
 
         while (as->start <= addr) {
                 if (as->end > addr) {
-                        if (as->op->lock != NULL) {
+                        if (as->op->lock) {
                                 rcode = as->op->lock(host, nodeid, store, addr,
                                                      data, arg, ext_tcode, flags);
                         } else {
@@ -416,7 +602,7 @@
 
         while (as->start <= addr) {
                 if (as->end > addr) {
-                        if (as->op->lock64 != NULL) {
+                        if (as->op->lock64) {
                                 rcode = as->op->lock64(host, nodeid, store,
                                                        addr, data, arg,
                                                        ext_tcode, flags);
diff -Nru a/drivers/ieee1394/highlevel.h b/drivers/ieee1394/highlevel.h
--- a/drivers/ieee1394/highlevel.h	Sat Apr 19 19:51:46 2003
+++ b/drivers/ieee1394/highlevel.h	Sat Apr 19 19:51:46 2003
@@ -11,6 +11,9 @@
 
         const char *name;
         struct hpsb_highlevel_ops *op;
+
+	/* Used by the highlevel drivers to store data per host */
+	struct list_head host_info_list;
 };
 
 
@@ -38,7 +41,7 @@
 
         /* New host initialized.  Will also be called during
          * hpsb_register_highlevel for all hosts already installed. */
-        void (*add_host) (struct hpsb_host *host);
+        void (*add_host) (struct hpsb_host *host, struct hpsb_highlevel *hl);
 
         /* Host about to be removed.  Will also be called during
          * hpsb_unregister_highlevel once for each host. */
@@ -108,19 +111,19 @@
    later case, no response will be sent and the driver, that handled the request
    will send the response itself.
 */
-int highlevel_read(struct hpsb_host *host, int nodeid, quadlet_t *buffer,
+int highlevel_read(struct hpsb_host *host, int nodeid, void *data,
                    u64 addr, unsigned int length, u16 flags);
 int highlevel_write(struct hpsb_host *host, int nodeid, int destid,
-		    quadlet_t *data, u64 addr, unsigned int length, u16 flags);
+		    void *data, u64 addr, unsigned int length, u16 flags);
 int highlevel_lock(struct hpsb_host *host, int nodeid, quadlet_t *store,
                    u64 addr, quadlet_t data, quadlet_t arg, int ext_tcode, u16 flags);
 int highlevel_lock64(struct hpsb_host *host, int nodeid, octlet_t *store,
                      u64 addr, octlet_t data, octlet_t arg, int ext_tcode, u16 flags);
 
-void highlevel_iso_receive(struct hpsb_host *host, quadlet_t *data,
+void highlevel_iso_receive(struct hpsb_host *host, void *data,
                            unsigned int length);
 void highlevel_fcp_request(struct hpsb_host *host, int nodeid, int direction,
-                           u8 *data, unsigned int length);
+                           void *data, unsigned int length);
 
 
 /*
@@ -154,5 +157,24 @@
 			unsigned int channel);
 void hpsb_unlisten_channel(struct hpsb_highlevel *hl, struct hpsb_host *host,
                            unsigned int channel);
+
+
+/* Retrieve a hostinfo pointer bound to this driver/host */
+void *hpsb_get_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host);
+/* Allocate a hostinfo pointer of data_size bound to this driver/host */
+void *hpsb_create_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host,
+			   size_t data_size);
+/* Free and remove the hostinfo pointer bound to this driver/host */
+void hpsb_destroy_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host);
+/* Set an alternate lookup key for the hostinfo bound to this driver/host */
+void hpsb_set_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host, unsigned long key);
+/* Retrieve the alternate lookup key for the hostinfo bound to this driver/host */
+unsigned long hpsb_get_hostinfo_key(struct hpsb_highlevel *hl, struct hpsb_host *host);
+/* Retrive a hostinfo pointer bound to this driver using its alternate key */
+void *hpsb_get_hostinfo_bykey(struct hpsb_highlevel *hl, unsigned long key);
+/* Set the hostinfo pointer to something useful. Usually follows a call to
+ * hpsb_create_hostinfo, where the size is 0. */
+int hpsb_set_hostinfo(struct hpsb_highlevel *hl, struct hpsb_host *host, void *data);
+
 
 #endif /* IEEE1394_HIGHLEVEL_H */
diff -Nru a/drivers/ieee1394/hosts.c b/drivers/ieee1394/hosts.c
--- a/drivers/ieee1394/hosts.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/ieee1394/hosts.c	Sat Apr 19 19:51:46 2003
@@ -22,12 +22,8 @@
 #include "ieee1394_core.h"
 #include "highlevel.h"
 
-static struct list_head hosts = LIST_HEAD_INIT(hosts);
-static struct list_head host_drivers = LIST_HEAD_INIT(host_drivers);
-
-spinlock_t hosts_lock = SPIN_LOCK_UNLOCKED;
-spinlock_t host_drivers_lock = SPIN_LOCK_UNLOCKED;
-
+LIST_HEAD(hpsb_hosts);
+DECLARE_MUTEX(hpsb_hosts_lock);
 
 static int dummy_transmit_packet(struct hpsb_host *h, struct hpsb_packet *p)
 {
@@ -64,11 +60,10 @@
 int hpsb_ref_host(struct hpsb_host *host)
 {
         struct list_head *lh;
-	unsigned long flags;
         int retval = 0;
 
-        spin_lock_irqsave(&hosts_lock, flags);
-        list_for_each(lh, &hosts) {
+	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)) {
 				host->refcount++;
@@ -77,7 +72,7 @@
 			break;
         	}
         }
-        spin_unlock_irqrestore(&hosts_lock, flags);
+	up(&hpsb_hosts_lock);
 
         return retval;
 }
@@ -93,16 +88,14 @@
 
 void hpsb_unref_host(struct hpsb_host *host)
 {
-        unsigned long flags;
-
 	module_put(host->driver->owner);
 
-        spin_lock_irqsave(&hosts_lock, flags);
+	down(&hpsb_hosts_lock);
         host->refcount--;
 
         if (!host->refcount && host->is_shutdown)
                 kfree(host);
-        spin_unlock_irqrestore(&hosts_lock, flags);
+	up(&hpsb_hosts_lock);
 }
 
 /**
@@ -157,41 +150,21 @@
 
 void hpsb_add_host(struct hpsb_host *host)
 {
-        unsigned long flags;
-
-        spin_lock_irqsave(&hosts_lock, flags);
-        list_add_tail(&host->host_list, &hosts);
-        spin_unlock_irqrestore(&hosts_lock, flags);
+	down(&hpsb_hosts_lock);
+        list_add_tail(&host->host_list, &hpsb_hosts);
+	up(&hpsb_hosts_lock);
 
         highlevel_add_host(host);
-        host->driver->devctl(host, RESET_BUS, 0);
+        host->driver->devctl(host, RESET_BUS, LONG_RESET);
 }
 
 void hpsb_remove_host(struct hpsb_host *host)
 {
-        unsigned long flags;
-
+	down(&hpsb_hosts_lock);
         host->is_shutdown = 1;
         host->driver = &dummy_driver;
-        highlevel_remove_host(host);
+	list_del(&host->host_list);
+	up(&hpsb_hosts_lock);
 
-        spin_lock_irqsave(&hosts_lock, flags);
-        list_del(&host->host_list);
-        spin_unlock_irqrestore(&hosts_lock, flags);
-}
-
-/*
- * This function calls the given function for every host currently registered.
- */
-void hl_all_hosts(void (*function)(struct hpsb_host*))
-{
-        struct list_head *lh;
-        struct hpsb_host *host;
-
-        spin_lock_irq(&hosts_lock);
-        list_for_each (lh, &hosts) {
-                host = list_entry(lh, struct hpsb_host, host_list);
-                function(host);
-	}
-        spin_unlock_irq(&hosts_lock);
+        highlevel_remove_host(host);
 }
diff -Nru a/drivers/ieee1394/hosts.h b/drivers/ieee1394/hosts.h
--- a/drivers/ieee1394/hosts.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/ieee1394/hosts.h	Sat Apr 19 19:51:28 2003
@@ -1,6 +1,7 @@
 #ifndef _IEEE1394_HOSTS_H
 #define _IEEE1394_HOSTS_H
 
+#include <linux/device.h>
 #include <linux/wait.h>
 #include <linux/list.h>
 #include <asm/semaphore.h>
@@ -64,6 +65,8 @@
         struct hpsb_host_driver *driver;
 
 	struct pci_dev *pdev;
+
+	struct device device;
 };
 
 
@@ -185,9 +188,9 @@
                                  quadlet_t data, quadlet_t compare);
 };
 
-/* high level internal use */
-struct hpsb_highlevel;
-void hl_all_hosts(void (*function)(struct hpsb_host*));
+
+extern struct list_head hpsb_hosts;
+extern struct semaphore hpsb_hosts_lock;
 
 
 /*
diff -Nru a/drivers/ieee1394/ieee1394.h b/drivers/ieee1394/ieee1394.h
--- a/drivers/ieee1394/ieee1394.h	Sat Apr 19 19:51:30 2003
+++ b/drivers/ieee1394/ieee1394.h	Sat Apr 19 19:51:30 2003
@@ -46,9 +46,13 @@
 #define ACKX_TIMEOUT             (-4)
 
 
-#define SPEED_100                0x0
-#define SPEED_200                0x1
-#define SPEED_400                0x2
+#define SPEED_100		0x00
+#define SPEED_200		0x01
+#define SPEED_400		0x02
+#define SPEED_800		0x03
+#define SPEED_1600		0x04
+#define SPEED_3200		0x05
+
 
 /* Maps speed values above to a string representation */
 extern const char *hpsb_speedto_str[];
diff -Nru a/drivers/ieee1394/ieee1394_core.c b/drivers/ieee1394/ieee1394_core.c
--- a/drivers/ieee1394/ieee1394_core.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/ieee1394/ieee1394_core.c	Sat Apr 19 19:51:29 2003
@@ -28,6 +28,7 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/proc_fs.h>
 #include <linux/bitops.h>
 #include <asm/byteorder.h>
@@ -48,13 +49,9 @@
 /*
  * Disable the nodemgr detection and config rom reading functionality.
  */
-MODULE_PARM(disable_nodemgr, "i");
-MODULE_PARM_DESC(disable_nodemgr, "Disable nodemgr functionality.");
 static int disable_nodemgr = 0;
-
-MODULE_PARM(disable_hotplug, "i");
-MODULE_PARM_DESC(disable_hotplug, "Disable hotplug for detected nodes.");
-static int disable_hotplug = 0;
+module_param(disable_nodemgr, int, 0444);
+MODULE_PARM_DESC(disable_nodemgr, "Disable nodemgr functionality.");
 
 /* We are GPL, so treat us special */
 MODULE_LICENSE("GPL");
@@ -62,7 +59,7 @@
 static kmem_cache_t *hpsb_packet_cache;
 
 /* Some globals used */
-const char *hpsb_speedto_str[] = { "S100", "S200", "S400" };
+const char *hpsb_speedto_str[] = { "S100", "S200", "S400", "S800", "S1600", "S3200" };
 
 static void dump_packet(const char *text, quadlet_t *data, int size)
 {
@@ -130,9 +127,8 @@
 {
         struct hpsb_packet *packet = NULL;
         void *data = NULL;
-        int kmflags = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
 
-        packet = kmem_cache_alloc(hpsb_packet_cache, kmflags);
+        packet = kmem_cache_alloc(hpsb_packet_cache, GFP_ATOMIC);
         if (packet == NULL)
                 return NULL;
 
@@ -140,7 +136,7 @@
         packet->header = packet->embedded_header;
 
         if (data_size) {
-                data = kmalloc(data_size + 8, kmflags);
+                data = kmalloc(data_size + 8, GFP_ATOMIC);
                 if (data == NULL) {
 			kmem_cache_free(hpsb_packet_cache, packet);
                         return NULL;
@@ -408,29 +404,6 @@
 	atomic_inc(&host->generation);
 	host->in_bus_reset = 0;
         highlevel_host_reset(host);
-
-        /* check for common cycle master error */
-        hpsb_check_cycle_master(host);
-}
-
-
-void hpsb_check_cycle_master(struct hpsb_host *host)
-{
-	/* check if host is IRM and not ROOT */
-	if (host->is_irm && !host->is_root) {
-		HPSB_NOTICE("Host is IRM but not root, resetting");
-		if (host->reset_retries++ < 4) {
-			/* selfid stage did not yield valid cycle master */
-			hpsb_reset_bus(host, LONG_RESET_FORCE_ROOT);
-		} else {
-			host->reset_retries = 0;
-			HPSB_NOTICE("Stopping out-of-control reset loop");
-			HPSB_NOTICE("Warning - Cycle Master not set correctly");
-		}
-		return;
-	}
-
-	host->reset_retries = 0;
 }
 
 
@@ -467,6 +440,63 @@
 }
 
 /**
+ * hpsb_send_phy_config - transmit a PHY configuration packet on the bus
+ * @host: host that PHY config packet gets sent through
+ * @rootid: root whose force_root bit should get set (-1 = don't set force_root)
+ * @gapcnt: gap count value to set (-1 = don't set gap count)
+ *
+ * This function sends a PHY config packet on the bus through the specified host.
+ *
+ * Return value: 0 for success or error number otherwise.
+ */
+int hpsb_send_phy_config(struct hpsb_host *host, int rootid, int gapcnt)
+{
+	struct hpsb_packet *packet;
+	int retval = 0;
+
+	if(rootid >= ALL_NODES || rootid < -1 || gapcnt > 0x3f || gapcnt < -1 ||
+	   (rootid == -1 && gapcnt == -1)) {
+		HPSB_DEBUG("Invalid Parameter: rootid = %d   gapcnt = %d",
+			   rootid, gapcnt);
+		return -EINVAL;
+	}
+
+	packet = alloc_hpsb_packet(0);
+	if (!packet)
+		return -ENOMEM;
+
+	packet->host = host;
+	packet->header_size = 16;
+	packet->data_size = 0;
+	packet->expect_response = 0;
+	packet->no_waiter = 0;
+	packet->type = hpsb_raw;
+	packet->header[0] = 0;
+	if(rootid != -1)
+		packet->header[0] |= rootid << 24 | 1 << 23;
+	if(gapcnt != -1)
+		packet->header[0] |= gapcnt << 16 | 1 << 22;
+
+	packet->header[1] = ~packet->header[0];
+
+	packet->generation = get_hpsb_generation(host);
+
+	HPSB_DEBUG("Sending PHY configuration packet (I hope)...");
+	if (!hpsb_send_packet(packet)) {
+		retval = -EINVAL;
+		goto fail;
+	}
+
+	down(&packet->state_change);
+	down(&packet->state_change);
+
+fail:
+	free_hpsb_packet(packet);
+
+	return retval;
+}
+
+/**
  * hpsb_send_packet - transmit a packet on the bus
  * @packet: packet to send
  *
@@ -496,8 +526,7 @@
                 quadlet_t *data;
                 size_t size=packet->data_size+packet->header_size;
 
-                int kmflags = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
-                data = kmalloc(packet->header_size + packet->data_size, kmflags);
+                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;
@@ -988,9 +1017,6 @@
 	.open =	ieee1394_dispatch_open,
 };
 
-devfs_handle_t ieee1394_devfs_handle;
-
-
 /* claim a block of minor numbers */
 int ieee1394_register_chardev(int blocknum,
 			      struct module *module,
@@ -1120,7 +1146,7 @@
 	/* follow through with the open() */
 	retval = file_ops->open(inode, file);
 
-	if(retval == 0) {
+	if (retval == 0) {
 		
 		/* If the open() succeeded, then ieee1394 will be left
 		 * with an extra module reference, so we discard it here.
@@ -1155,22 +1181,22 @@
 	hpsb_packet_cache = kmem_cache_create("hpsb_packet", sizeof(struct hpsb_packet),
 					      0, 0, NULL, NULL);
 
-	ieee1394_devfs_handle = devfs_mk_dir("ieee1394");
+	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_unregister(ieee1394_devfs_handle);
+		devfs_remove("ieee1394");
 		return -ENODEV;
 	}
 
 #ifdef CONFIG_PROC_FS
 	/* Must be done before we start everything else, since the drivers
 	 * may use it.  */
-	ieee1394_procfs_entry = proc_mkdir( "ieee1394", proc_bus);
+	ieee1394_procfs_entry = proc_mkdir("ieee1394", proc_bus);
 	if (ieee1394_procfs_entry == NULL) {
 		HPSB_ERR("unable to create /proc/bus/ieee1394\n");
 		unregister_chrdev(IEEE1394_MAJOR, "ieee1394");
-		devfs_unregister(ieee1394_devfs_handle);
+		devfs_remove("ieee1394");
 		return -ENOMEM;
 	}
 	ieee1394_procfs_entry->owner = THIS_MODULE;
@@ -1179,7 +1205,7 @@
 	init_hpsb_highlevel();
 	init_csr();
 	if (!disable_nodemgr)
-		init_ieee1394_nodemgr(disable_hotplug);
+		init_ieee1394_nodemgr();
 	else
 		HPSB_INFO("nodemgr functionality disabled");
 
@@ -1195,10 +1221,7 @@
 	kmem_cache_destroy(hpsb_packet_cache);
 
 	unregister_chrdev(IEEE1394_MAJOR, "ieee1394");
-
-	/* it's ok to pass a NULL devfs_handle to devfs_unregister */
-	devfs_unregister(ieee1394_devfs_handle);
-
+	devfs_remove("ieee1394");
 	remove_proc_entry("ieee1394", proc_bus);
 }
 
@@ -1219,17 +1242,16 @@
 EXPORT_SYMBOL(hpsb_set_packet_complete_task);
 EXPORT_SYMBOL(alloc_hpsb_packet);
 EXPORT_SYMBOL(free_hpsb_packet);
+EXPORT_SYMBOL(hpsb_send_phy_config);
 EXPORT_SYMBOL(hpsb_send_packet);
 EXPORT_SYMBOL(hpsb_reset_bus);
 EXPORT_SYMBOL(hpsb_bus_reset);
 EXPORT_SYMBOL(hpsb_selfid_received);
 EXPORT_SYMBOL(hpsb_selfid_complete);
-EXPORT_SYMBOL(hpsb_check_cycle_master);
 EXPORT_SYMBOL(hpsb_packet_sent);
 EXPORT_SYMBOL(hpsb_packet_received);
 EXPORT_SYMBOL(ieee1394_register_chardev);
 EXPORT_SYMBOL(ieee1394_unregister_chardev);
-EXPORT_SYMBOL(ieee1394_devfs_handle);
 EXPORT_SYMBOL(ieee1394_procfs_entry);
 
 /** ieee1394_transactions.c **/
@@ -1255,6 +1277,13 @@
 EXPORT_SYMBOL(hpsb_unregister_addrspace);
 EXPORT_SYMBOL(hpsb_listen_channel);
 EXPORT_SYMBOL(hpsb_unlisten_channel);
+EXPORT_SYMBOL(hpsb_get_hostinfo);
+EXPORT_SYMBOL(hpsb_create_hostinfo);
+EXPORT_SYMBOL(hpsb_destroy_hostinfo);
+EXPORT_SYMBOL(hpsb_set_hostinfo_key);
+EXPORT_SYMBOL(hpsb_get_hostinfo_key);
+EXPORT_SYMBOL(hpsb_get_hostinfo_bykey);
+EXPORT_SYMBOL(hpsb_set_hostinfo);
 EXPORT_SYMBOL(highlevel_read);
 EXPORT_SYMBOL(highlevel_write);
 EXPORT_SYMBOL(highlevel_lock);
@@ -1273,7 +1302,7 @@
 EXPORT_SYMBOL(hpsb_node_lock);
 EXPORT_SYMBOL(hpsb_register_protocol);
 EXPORT_SYMBOL(hpsb_unregister_protocol);
-EXPORT_SYMBOL(hpsb_release_unit_directory);
+EXPORT_SYMBOL(ieee1394_bus_type);
 
 /** csr.c **/
 EXPORT_SYMBOL(hpsb_update_config_rom);
@@ -1307,4 +1336,3 @@
 EXPORT_SYMBOL(hpsb_iso_packet_sent);
 EXPORT_SYMBOL(hpsb_iso_packet_received);
 EXPORT_SYMBOL(hpsb_iso_wake);
-
diff -Nru a/drivers/ieee1394/ieee1394_core.h b/drivers/ieee1394/ieee1394_core.h
--- a/drivers/ieee1394/ieee1394_core.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/ieee1394/ieee1394_core.h	Sat Apr 19 19:51:28 2003
@@ -109,6 +109,11 @@
 }
 
 /*
+ * Send a PHY configuration packet.
+ */
+int hpsb_send_phy_config(struct hpsb_host *host, int rootid, int gapcnt);
+
+/*
  * Queue packet for transmitting, return 0 for failure.
  */
 int hpsb_send_packet(struct hpsb_packet *packet);
@@ -140,12 +145,6 @@
  */
 void hpsb_selfid_complete(struct hpsb_host *host, int phyid, int isroot);
 
-/* 
- * Check bus reset results to find cycle master
- */
-void hpsb_check_cycle_master(struct hpsb_host *host);
-
-
 /*
  * Notify core of sending a packet.  Ackcode is the ack code returned for async
  * transmits or ACKX_SEND_ERROR if the transmission failed completely; ACKX_NONE
@@ -225,10 +224,10 @@
 /* release a block of minor numbers */
 void ieee1394_unregister_chardev(int blocknum);
 
-/* the devfs handle for /dev/ieee1394; NULL if devfs is not in use */
-extern devfs_handle_t ieee1394_devfs_handle;
-
 /* the proc_fs entry for /proc/ieee1394 */
 extern struct proc_dir_entry *ieee1394_procfs_entry;
+
+/* Our sysfs bus entry */
+extern struct bus_type ieee1394_bus_type;
 
 #endif /* _IEEE1394_CORE_H */
diff -Nru a/drivers/ieee1394/ieee1394_hotplug.h b/drivers/ieee1394/ieee1394_hotplug.h
--- a/drivers/ieee1394/ieee1394_hotplug.h	Sat Apr 19 19:51:51 2003
+++ b/drivers/ieee1394/ieee1394_hotplug.h	Sat Apr 19 19:51:51 2003
@@ -1,6 +1,8 @@
 #ifndef _IEEE1394_HOTPLUG_H
 #define _IEEE1394_HOTPLUG_H
 
+#include <linux/device.h>
+
 #include "ieee1394_core.h"
 #include "nodemgr.h"
 
@@ -9,6 +11,14 @@
 #define IEEE1394_MATCH_SPECIFIER_ID	0x0004
 #define IEEE1394_MATCH_VERSION		0x0008
 
+/*
+ * Unit spec id and sw version entry for some protocols
+ */
+#define AVC_UNIT_SPEC_ID_ENTRY					0x0000A02D
+#define AVC_SW_VERSION_ENTRY					0x00010001
+#define CAMERA_UNIT_SPEC_ID_ENTRY				0x0000A02D
+#define CAMERA_SW_VERSION_ENTRY					0x00000100
+
 struct ieee1394_device_id {
 	u32 match_flags;
 	u32 vendor_id;
@@ -32,26 +42,6 @@
 	struct ieee1394_device_id *id_table;
 
 	/* 
-	 * The probe function is called when a device is added to the
-	 * bus and the nodemgr finds a matching entry in the drivers
-	 * device id table or when registering this driver and a
-	 * previously unhandled device can be handled.  The driver may
-	 * decline to handle the device based on further investigation
-	 * of the device (or whatever reason) in which case a negative
-	 * error code should be returned, otherwise 0 should be
-	 * returned. The driver may use the driver_data field in the
-	 * unit directory to store per device driver specific data.
-	 */
-	int (*probe)(struct unit_directory *ud);
-
-	/* 
-	 * The disconnect function is called when a device is removed
-	 * from the bus or if it wasn't possible to read the guid
-	 * after the last bus reset.
-	 */
-	void (*disconnect)(struct unit_directory *ud);
-
-	/* 
 	 * The update function is called when the node has just
 	 * survived a bus reset, i.e. it is still present on the bus.
 	 * However, it may be necessary to reestablish the connection
@@ -59,18 +49,12 @@
 	 */
 	void (*update)(struct unit_directory *ud);
 
-	/* Driver in list of all registered drivers */
-	struct list_head list;
 
-	/* The list of unit directories managed by this driver */
-	struct list_head unit_directories;
+	/* Our LDM structure */
+	struct device_driver driver;
 };
 
 int hpsb_register_protocol(struct hpsb_protocol_driver *driver);
 void hpsb_unregister_protocol(struct hpsb_protocol_driver *driver);
-
-int hpsb_claim_unit_directory(struct unit_directory *ud,
-			      struct hpsb_protocol_driver *driver);
-void hpsb_release_unit_directory(struct unit_directory *ud);
 
 #endif /* _IEEE1394_HOTPLUG_H */
diff -Nru a/drivers/ieee1394/ieee1394_transactions.c b/drivers/ieee1394/ieee1394_transactions.c
--- a/drivers/ieee1394/ieee1394_transactions.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/ieee1394/ieee1394_transactions.c	Sat Apr 19 19:51:46 2003
@@ -146,10 +146,10 @@
 
 	spin_lock_irqsave(&tp->lock, flags);
 	
-	packet->tlabel = find_next_zero_bit(&tp->pool, 64, tp->next);
+	packet->tlabel = find_next_zero_bit(tp->pool, 64, tp->next);
 	tp->next = (packet->tlabel + 1) % 64;
 	/* Should _never_ happen */
-	BUG_ON(test_and_set_bit(packet->tlabel, &tp->pool));
+	BUG_ON(test_and_set_bit(packet->tlabel, tp->pool));
 	tp->allocations++;
 	spin_unlock_irqrestore(&tp->lock, flags);
 
@@ -177,7 +177,7 @@
 	BUG_ON(packet->tlabel > 63 || packet->tlabel < 0);
 
         spin_lock_irqsave(&tp->lock, flags);
-	BUG_ON(!test_and_clear_bit(packet->tlabel, &tp->pool));
+	BUG_ON(!test_and_clear_bit(packet->tlabel, tp->pool));
         spin_unlock_irqrestore(&tp->lock, flags);
 
 	up(&tp->count);
diff -Nru a/drivers/ieee1394/ieee1394_types.h b/drivers/ieee1394/ieee1394_types.h
--- a/drivers/ieee1394/ieee1394_types.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/ieee1394/ieee1394_types.h	Sat Apr 19 19:51:49 2003
@@ -72,19 +72,20 @@
 
 /* Transaction Label handling */
 struct hpsb_tlabel_pool {
-	u64 pool;
+	DECLARE_BITMAP(pool, 64);
 	spinlock_t lock;
 	u8 next;
 	u32 allocations;
 	struct semaphore count;
 };
 
-#define HPSB_TPOOL_INIT(_tp)            \
-do {                                    \
-	sema_init(&(_tp)->count, 63);   \
-	spin_lock_init(&(_tp)->lock);   \
-	(_tp)->next = 0;                \
-	(_tp)->pool = 0;                \
+#define HPSB_TPOOL_INIT(_tp)            	\
+do {                                    	\
+	CLEAR_BITMAP((_tp)->pool, 64);		\
+	spin_lock_init(&(_tp)->lock);   	\
+	(_tp)->next = 0;                	\
+	(_tp)->allocations = 0;			\
+	sema_init(&(_tp)->count, 63);   	\
 } while(0)
 
 
diff -Nru a/drivers/ieee1394/iso.c b/drivers/ieee1394/iso.c
--- a/drivers/ieee1394/iso.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/ieee1394/iso.c	Sat Apr 19 19:51:50 2003
@@ -14,7 +14,7 @@
 
 void hpsb_iso_stop(struct hpsb_iso *iso)
 {
-	if(!iso->flags & HPSB_ISO_DRIVER_STARTED)
+	if (!(iso->flags & HPSB_ISO_DRIVER_STARTED))
 		return;
 
 	iso->host->driver->isoctl(iso, iso->type == HPSB_ISO_XMIT ?
diff -Nru a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
--- a/drivers/ieee1394/nodemgr.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/ieee1394/nodemgr.c	Sat Apr 19 19:51:49 2003
@@ -1,8 +1,8 @@
 /*
  * Node information (ConfigROM) collection and management.
  *
- * Copyright (C) 2000 Andreas E. Bombe
- *               2001 Ben Collins <bcollins@debian.net>
+ * Copyright (C) 2000		Andreas E. Bombe
+ *               2001-2003	Ben Collins <bcollins@debian.net>
  *
  * This code is licensed under the GPL.  See the file COPYING in the root
  * directory of the kernel sources for details.
@@ -17,9 +17,7 @@
 #include <linux/kmod.h>
 #include <linux/completion.h>
 #include <linux/delay.h>
-#ifdef CONFIG_PROC_FS
-#include <linux/proc_fs.h>
-#endif
+#include <linux/pci.h>
 #include <asm/atomic.h>
 #include <asm/byteorder.h>
 
@@ -32,24 +30,23 @@
 #include "csr.h"
 #include "nodemgr.h"
 
-#ifdef CONFIG_IEEE1394_OUI_DB
-struct oui_list_struct {
-	int oui;
-	char *name;
-};
 
-extern struct oui_list_struct oui_list[];
 
-static char *nodemgr_find_oui_name(int oui) {
+static char *nodemgr_find_oui_name(int oui)
+{
+#ifdef CONFIG_IEEE1394_OUI_DB
+	extern struct oui_list_struct {
+		int oui;
+		char *name;
+	} oui_list[];
 	int i;
 
 	for (i = 0; oui_list[i].name; i++)
 		if (oui_list[i].oui == oui)
 			return oui_list[i].name;
-
+#endif
 	return NULL;
 }
-#endif
 
 /* 
  * Basically what we do here is start off retrieving the bus_info block.
@@ -60,32 +57,20 @@
  * complete directory entry (be it a leaf or a directory). We then process
  * it and add the info to our structure for that particular node.
  *
- * We verify CRC's along the way for each directory/block/leaf. The
- * entire node structure is generic, and simply stores the information in
- * a way that's easy to parse by the protocol interface.
+ * We verify CRC's along the way for each directory/block/leaf. The entire
+ * node structure is generic, and simply stores the information in a way
+ * that's easy to parse by the protocol interface.
  */
 
-/* The nodemgr maintains a number of data structures: the node list,
- * the driver list, unit directory list and the host info list.  The
- * first three lists are accessed from process context only: /proc
- * readers, insmod and rmmod, and the nodemgr thread.  Access to these
- * lists are serialized by means of the nodemgr_serialize mutex, which
- * must be taken before accessing the structures and released
- * afterwards.  The host info list is only accessed during insmod,
- * rmmod and from interrupt and allways only for a short period of
- * time, so a spinlock is used to protect this list.
+/* 
+ * The nodemgr relies heavily on the Drive Model for device callbacks and
+ * driver/device mappings. The old nodemgr used to handle all this itself,
+ * but now we are much simpler because of the LDM.
  */
 
 static DECLARE_MUTEX(nodemgr_serialize);
-static LIST_HEAD(node_list);
-static LIST_HEAD(driver_list);
-static LIST_HEAD(unit_directory_list);
 
-static LIST_HEAD(host_info_list);
-static spinlock_t host_info_lock = SPIN_LOCK_UNLOCKED;
-
-/* Disables use of the hotplug calls.  */
-static int nodemgr_disable_hotplug = 0;
+static struct hpsb_highlevel *nodemgr_hl;
 
 struct host_info {
 	struct hpsb_host *host;
@@ -93,130 +78,447 @@
 	struct completion exited;
 	struct semaphore reset_sem;
 	int pid;
+	int id;
+	char daemon_name[15];
+};
+
+
+#define fw_attr(class, class_type, field, type, format_string)		\
+static ssize_t fw_show_##class##_##field (struct device *dev, char *buf)\
+{									\
+	class_type *class;						\
+	class = container_of(dev, class_type, device);			\
+	return sprintf(buf, format_string, (type)class->field);		\
+}									\
+static struct device_attribute dev_attr_##class##_##field = {		\
+	.attr = {.name = __stringify(field), .mode = S_IRUGO },		\
+	.show   = fw_show_##class##_##field,				\
+};
+
+
+#define fw_drv_attr(field, type, format_string)			\
+static ssize_t fw_drv_show_##field (struct device_driver *drv, char *buf) \
+{								\
+	struct hpsb_protocol_driver *driver;			\
+	driver = container_of(drv, struct hpsb_protocol_driver, driver); \
+	return sprintf(buf, format_string, (type)driver->field);\
+}								\
+static struct driver_attribute driver_attr_drv_##field = {	\
+        .attr = {.name = __stringify(field), .mode = S_IRUGO },	\
+        .show   = fw_drv_show_##field,				\
 };
 
-#ifdef CONFIG_PROC_FS
 
-#define PUTF(fmt, args...) out += sprintf(out, fmt, ## args)
+static ssize_t fw_show_ne_bus_options(struct device *dev, char *buf)
+{
+	struct node_entry *ne = container_of(dev, struct node_entry, device);
 
-static int raw1394_read_proc(char *page, char **start, off_t off,
-			     int count, int *eof, void *data)
+	return sprintf(buf, "IRMC(%d) CMC(%d) ISC(%d) BMC(%d) PMC(%d) GEN(%d) "
+			"LSPD(%d) MAX_REC(%d) CYC_CLK_ACC(%d)\n", ne->busopt.irmc,
+			ne->busopt.cmc, ne->busopt.isc, ne->busopt.bmc,
+			ne->busopt.pmc, ne->busopt.generation, ne->busopt.lnkspd,
+			ne->busopt.max_rec, ne->busopt.cyc_clk_acc);
+}
+static DEVICE_ATTR(bus_options,S_IRUGO,fw_show_ne_bus_options,NULL);
+
+
+static ssize_t fw_show_ne_tlabels_free(struct device *dev, char *buf)
 {
-	struct list_head *lh;
-	struct node_entry *ne;
-	int len;
-	char *out = page;
-	unsigned long flags;
-
-	if (down_interruptible(&nodemgr_serialize))
-		return -EINTR;
-
-	list_for_each(lh, &node_list) {
-		struct list_head *l;
-		int ud_count = 0;
+	struct node_entry *ne = container_of(dev, struct node_entry, device);
+	return sprintf(buf, "%d\n", atomic_read(&ne->tpool->count.count) + 1);
+}
+static DEVICE_ATTR(tlabels_free,S_IRUGO,fw_show_ne_tlabels_free,NULL);
 
-		ne = list_entry(lh, struct node_entry, list);
-		if (!ne)
-			continue;
 
-		PUTF("Node[" NODE_BUS_FMT "]  GUID[%016Lx]:\n",
-		     NODE_BUS_ARGS(ne->nodeid), (unsigned long long)ne->guid);
+static ssize_t fw_show_ne_tlabels_allocations(struct device *dev, char *buf)
+{
+	struct node_entry *ne = container_of(dev, struct node_entry, device);
+	return sprintf(buf, "%u\n", ne->tpool->allocations);
+}
+static DEVICE_ATTR(tlabels_allocations,S_IRUGO,fw_show_ne_tlabels_allocations,NULL);
+
 
-		/* Generic Node information */
-		PUTF("  Vendor ID   : `%s' [0x%06x]\n", ne->oui_name, ne->vendor_id);
-		if (ne->vendor_name)
-			PUTF("  Vendor text : `%s'\n", ne->vendor_name);
-		PUTF("  Capabilities: 0x%06x\n", ne->capabilities);
-		PUTF("  Tlabel stats:\n");
-		spin_lock_irqsave(&ne->tpool->lock, flags);
-		PUTF("    Free  : %d\n", atomic_read(&ne->tpool->count.count) + 1);
-		PUTF("    Total : %u\n", ne->tpool->allocations);
-		PUTF("    Mask  : %016Lx\n", (unsigned long long)ne->tpool->pool);
-		spin_unlock_irqrestore(&ne->tpool->lock, flags);
-		PUTF("  Bus Options :\n");
-		PUTF("    IRMC(%d) CMC(%d) ISC(%d) BMC(%d) PMC(%d) GEN(%d)\n"
-		     "    LSPD(%d) MAX_REC(%d) CYC_CLK_ACC(%d)\n",
-		     ne->busopt.irmc, ne->busopt.cmc, ne->busopt.isc, ne->busopt.bmc,
-		     ne->busopt.pmc, ne->busopt.generation, ne->busopt.lnkspd,
-		     ne->busopt.max_rec, ne->busopt.cyc_clk_acc);
-
-		/* If this is the host entry, output some info about it aswell */
-		if (ne->host != NULL && ne->host->node_id == ne->nodeid) {
-			PUTF("  Host Node Status:\n");
-			PUTF("    Host Driver     : %s\n", ne->host->driver->name);
-			PUTF("    Nodes connected : %d\n", ne->host->node_count);
-			PUTF("    Nodes active    : %d\n", ne->host->nodes_active);
-			PUTF("    SelfIDs received: %d\n", ne->host->selfid_count);
-			PUTF("    Irm ID          : [" NODE_BUS_FMT "]\n",
-			     NODE_BUS_ARGS(ne->host->irm_id));
-			PUTF("    BusMgr ID       : [" NODE_BUS_FMT "]\n",
-			     NODE_BUS_ARGS(ne->host->busmgr_id));
-			PUTF("    In Bus Reset    : %s\n", ne->host->in_bus_reset ? "yes" : "no");
-			PUTF("    Root            : %s\n", ne->host->is_root ? "yes" : "no");
-			PUTF("    Cycle Master    : %s\n", ne->host->is_cycmst ? "yes" : "no");
-			PUTF("    IRM             : %s\n", ne->host->is_irm ? "yes" : "no");
-			PUTF("    Bus Manager     : %s\n", ne->host->is_busmgr ? "yes" : "no");
+static ssize_t fw_show_ne_tlabels_mask(struct device *dev, char *buf)
+{
+	struct node_entry *ne = container_of(dev, struct node_entry, device);
+#if (BITS_PER_LONG <= 32)
+	return sprintf(buf, "0x%08lx%08lx\n", ne->tpool->pool[0], ne->tpool->pool[1]);
+#else
+	return sprintf(buf, "0x%016lx\n", ne->tpool->pool[0]);
+#endif
+}
+static DEVICE_ATTR(tlabels_mask,S_IRUGO,fw_show_ne_tlabels_mask,NULL);
+
+
+fw_attr(ne, struct node_entry, capabilities, unsigned int, "0x%06x\n")
+fw_attr(ne, struct node_entry, nodeid, unsigned int, "0x%04x\n")
+
+fw_attr(ne, struct node_entry, vendor_id, unsigned int, "0x%06x\n")
+fw_attr(ne, struct node_entry, vendor_name, const char *, "%s\n")
+fw_attr(ne, struct node_entry, vendor_oui, const char *, "%s\n")
+
+fw_attr(ne, struct node_entry, guid, unsigned long long, "0x%016Lx\n")
+fw_attr(ne, struct node_entry, guid_vendor_id, unsigned int, "0x%06x\n")
+fw_attr(ne, struct node_entry, guid_vendor_oui, const char *, "%s\n")
+
+static struct device_attribute *const fw_ne_attrs[] = {
+	&dev_attr_ne_guid,
+	&dev_attr_ne_guid_vendor_id,
+	&dev_attr_ne_capabilities,
+	&dev_attr_ne_vendor_id,
+	&dev_attr_ne_nodeid,
+	&dev_attr_bus_options,
+	&dev_attr_tlabels_free,
+	&dev_attr_tlabels_allocations,
+	&dev_attr_tlabels_mask,
+};
+
+
+
+fw_attr(ud, struct unit_directory, address, unsigned long long, "0x%016Lx\n")
+fw_attr(ud, struct unit_directory, length, int, "%d\n")
+/* These are all dependent on the value being provided */
+fw_attr(ud, struct unit_directory, vendor_id, unsigned int, "0x%06x\n")
+fw_attr(ud, struct unit_directory, model_id, unsigned int, "0x%06x\n")
+fw_attr(ud, struct unit_directory, specifier_id, unsigned int, "0x%06x\n")
+fw_attr(ud, struct unit_directory, version, unsigned int, "0x%06x\n")
+fw_attr(ud, struct unit_directory, vendor_name, const char *, "%s\n")
+fw_attr(ud, struct unit_directory, vendor_oui, const char *, "%s\n")
+fw_attr(ud, struct unit_directory, model_name, const char *, "%s\n")
+
+static struct device_attribute *const fw_ud_attrs[] = {
+	&dev_attr_ud_address,
+	&dev_attr_ud_length,
+};
+
+
+fw_attr(host, struct hpsb_host, node_count, int, "%d\n")
+fw_attr(host, struct hpsb_host, selfid_count, int, "%d\n")
+fw_attr(host, struct hpsb_host, nodes_active, int, "%d\n")
+fw_attr(host, struct hpsb_host, in_bus_reset, int, "%d\n")
+fw_attr(host, struct hpsb_host, is_root, int, "%d\n")
+fw_attr(host, struct hpsb_host, is_cycmst, int, "%d\n")
+fw_attr(host, struct hpsb_host, is_irm, int, "%d\n")
+fw_attr(host, struct hpsb_host, is_busmgr, int, "%d\n")
+
+static struct device_attribute *const fw_host_attrs[] = {
+	&dev_attr_host_node_count,
+	&dev_attr_host_selfid_count,
+	&dev_attr_host_nodes_active,
+	&dev_attr_host_in_bus_reset,
+	&dev_attr_host_is_root,
+	&dev_attr_host_is_cycmst,
+	&dev_attr_host_is_irm,
+	&dev_attr_host_is_busmgr,
+};
+
+
+static ssize_t fw_show_drv_device_ids(struct device_driver *drv, char *buf)
+{
+	struct hpsb_protocol_driver *driver;
+	struct ieee1394_device_id *id;
+	int length = 0;
+	char *scratch = buf;
+
+        driver = container_of(drv, struct hpsb_protocol_driver, driver);
+
+	for (id = driver->id_table; id->match_flags != 0; id++) {
+		int need_coma = 0;
+
+		if (id->match_flags & IEEE1394_MATCH_VENDOR_ID) {
+			length += sprintf(scratch, "vendor_id=0x%06x", id->vendor_id);
+			scratch = buf + length;
+			need_coma++;
 		}
 
-		/* Now the unit directories */
-		list_for_each (l, &ne->unit_directories) {
-			struct unit_directory *ud = list_entry (l, struct unit_directory, node_list);
-			int printed = 0; // small hack
-
-			PUTF("  Unit Directory %d:\n", ud_count++);
-
-			if (ud->flags & UNIT_DIRECTORY_VENDOR_ID ||
-			    ud->flags & UNIT_DIRECTORY_MODEL_ID) {
-				PUTF("    Vendor/Model ID  : ");
-			}
-			if (ud->flags & UNIT_DIRECTORY_VENDOR_ID) {
-				PUTF("%s [%06x]", ud->vendor_name ?: "Unknown",
-				     ud->vendor_id);
-				printed = 1;
-			}
-			if (ud->flags & UNIT_DIRECTORY_MODEL_ID) {
-				if (!printed) {
-					PUTF("%s [%06x]", ne->vendor_name ?: "Unknown",
-					     ne->vendor_id);
-				}
-				PUTF(" / %s [%06x]", ud->model_name ?: "Unknown", ud->model_id);
-				printed = 1;
-			}
-			if (printed)
-				PUTF("\n");
+		if (id->match_flags & IEEE1394_MATCH_MODEL_ID) {
+			length += sprintf(scratch, "%smodel_id=0x%06x",
+					  need_coma++ ? "," : "",
+					  id->model_id);
+			scratch = buf + length;
+		}
+
+		if (id->match_flags & IEEE1394_MATCH_SPECIFIER_ID) {
+			length += sprintf(scratch, "%sspecifier_id=0x%06x",
+					  need_coma++ ? "," : "",
+					  id->specifier_id);
+			scratch = buf + length;
+		}
 
-			if (ud->flags & UNIT_DIRECTORY_SPECIFIER_ID)
-				PUTF("    Software Spec ID : %06x\n", ud->specifier_id);
-			if (ud->flags & UNIT_DIRECTORY_VERSION)
-				PUTF("    Software Version : %06x\n", ud->version);
-			if (ud->driver)
-				PUTF("    Driver           : %s\n", ud->driver->name);
-			PUTF("    Length (in quads): %d\n", ud->count);
+		if (id->match_flags & IEEE1394_MATCH_VERSION) {
+			length += sprintf(scratch, "%sversion=0x%06x",
+					  need_coma++ ? "," : "",
+					  id->version);
+			scratch = buf + length;
 		}
 
+		if (need_coma) {
+			*scratch++ = '\n';
+			length++;
+		}
 	}
 
-	up(&nodemgr_serialize);
+	return length;
+}
+static DRIVER_ATTR(device_ids,S_IRUGO,fw_show_drv_device_ids,NULL);
 
-	len = out - page;
-	len -= off;
-	if (len < count) {
-		*eof = 1;
-		if (len <= 0)
-			return 0;
-	} else
-		len = count;
 
-        *start = page + off;
+fw_drv_attr(name, const char *, "%s\n")
+
+static struct driver_attribute *const fw_drv_attrs[] = {
+	&driver_attr_drv_name,
+	&driver_attr_device_ids,
+};
+
+
+static void nodemgr_create_drv_files(struct hpsb_protocol_driver *driver)
+{
+	struct device_driver *drv = &driver->driver;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(fw_drv_attrs); i++)
+		driver_create_file(drv, fw_drv_attrs[i]);
+}
+
+
+static void nodemgr_remove_drv_files(struct hpsb_protocol_driver *driver)
+{
+	struct device_driver *drv = &driver->driver;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(fw_drv_attrs); i++)
+		driver_remove_file(drv, fw_drv_attrs[i]);
+}
+
+
+static void nodemgr_create_ne_dev_files(struct node_entry *ne)
+{
+	struct device *dev = &ne->device;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(fw_ne_attrs); i++)
+		device_create_file(dev, fw_ne_attrs[i]);
+}
+
+
+static void nodemgr_create_host_dev_files(struct hpsb_host *host)
+{
+	struct device *dev = &host->device;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(fw_host_attrs); i++)
+		device_create_file(dev, fw_host_attrs[i]);
+}
+
+
+static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, nodeid_t nodeid);
+
+static void nodemgr_update_host_dev_links(struct hpsb_host *host)
+{
+	struct device *dev = &host->device;
+	struct node_entry *ne;
+
+	sysfs_remove_link(&dev->kobj, "irm_id");
+	sysfs_remove_link(&dev->kobj, "busmgr_id");
+	sysfs_remove_link(&dev->kobj, "host_id");
+
+	if ((ne = find_entry_by_nodeid(host, host->irm_id)))
+		sysfs_create_link(&dev->kobj, &ne->device.kobj, "irm_id");
+	if ((ne = find_entry_by_nodeid(host, host->busmgr_id)))
+		sysfs_create_link(&dev->kobj, &ne->device.kobj, "busmgr_id");
+	if ((ne = find_entry_by_nodeid(host, host->node_id)))
+		sysfs_create_link(&dev->kobj, &ne->device.kobj, "host_id");
+}
+
+static void nodemgr_create_ud_dev_files(struct unit_directory *ud)
+{
+	struct device *dev = &ud->device;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(fw_ud_attrs); i++)
+		device_create_file(dev, fw_ud_attrs[i]);
+
+	if (ud->flags & UNIT_DIRECTORY_SPECIFIER_ID)
+		device_create_file(dev, &dev_attr_ud_specifier_id);
+
+	if (ud->flags & UNIT_DIRECTORY_VERSION)
+		device_create_file(dev, &dev_attr_ud_version);
+
+	if (ud->flags & UNIT_DIRECTORY_VENDOR_ID) {
+		device_create_file(dev, &dev_attr_ud_vendor_id);
+		if (ud->flags & UNIT_DIRECTORY_VENDOR_TEXT)
+			device_create_file(dev, &dev_attr_ud_vendor_name);
+	}
+
+	if (ud->flags & UNIT_DIRECTORY_MODEL_ID) {
+		device_create_file(dev, &dev_attr_ud_model_id);
+		if (ud->flags & UNIT_DIRECTORY_MODEL_TEXT)
+			device_create_file(dev, &dev_attr_ud_model_name);
+	}
+}
+
+
+static int nodemgr_bus_match(struct device * dev, struct device_driver * drv)
+{
+        struct hpsb_protocol_driver *driver;
+        struct unit_directory *ud;
+	struct ieee1394_device_id *id;
+
+	if (dev->class_num != DEV_CLASS_UNIT_DIRECTORY)
+		return 0;
+
+	ud = container_of(dev, struct unit_directory, device);
+	driver = container_of(drv, struct hpsb_protocol_driver, driver);
+
+        for (id = driver->id_table; id->match_flags != 0; id++) {
+                if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) &&
+                    id->vendor_id != ud->vendor_id)
+                        continue;
+
+                if ((id->match_flags & IEEE1394_MATCH_MODEL_ID) &&
+                    id->model_id != ud->model_id)
+                        continue;
+
+                if ((id->match_flags & IEEE1394_MATCH_SPECIFIER_ID) &&
+                    id->specifier_id != ud->specifier_id)
+                        continue;
+
+                if ((id->match_flags & IEEE1394_MATCH_VERSION) &&
+                    id->version != ud->version)
+                        continue;
+
+		return 1;
+        }
+
+	return 0;
+}
+
+
+static void nodemgr_release_ud(struct device *dev)
+{
+	kfree(container_of(dev, struct unit_directory, device));
+}
+
+
+static void nodemgr_release_ne(struct device *dev)
+{
+	kfree(container_of(dev, struct node_entry, device));
+}
+
+
+static void nodemgr_remove_ud(struct unit_directory *ud)
+{
+	struct device *dev = &ud->device;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(fw_ud_attrs); i++)
+		device_remove_file(dev, fw_ud_attrs[i]);
+
+	device_remove_file(dev, &dev_attr_ud_specifier_id);
+	device_remove_file(dev, &dev_attr_ud_version);
+	device_remove_file(dev, &dev_attr_ud_vendor_id);
+	device_remove_file(dev, &dev_attr_ud_vendor_name);
+	device_remove_file(dev, &dev_attr_ud_vendor_oui);
+	device_remove_file(dev, &dev_attr_ud_model_id);
+	device_remove_file(dev, &dev_attr_ud_model_name);
+
+	device_unregister(dev);
+}
+
+
+static void nodemgr_remove_node_uds(struct node_entry *ne)
+{
+	struct list_head *lh, *next;
+
+	list_for_each_safe(lh, next, &ne->device.children) {
+		struct unit_directory *ud;
+		ud = container_of(list_to_dev(lh), struct unit_directory, device);
+		nodemgr_remove_ud(ud);
+	}
+}
+
+
+static void nodemgr_update_ud_names(struct host_info *hi, struct node_entry *ne)
+{
+	struct list_head *lh;
+
+	list_for_each(lh, &ne->device.children) {
+		struct unit_directory *ud;
+		ud = container_of(list_to_dev(lh), struct unit_directory, device);
+
+		snprintf(ud->device.name, DEVICE_NAME_SIZE,
+			 "IEEE-1394 unit directory %d-" NODE_BUS_FMT "-%u",
+			 hi->id, NODE_BUS_ARGS(ne->nodeid), ud->id);
+	}
+}
+
+
+static void nodemgr_remove_ne(struct node_entry *ne)
+{
+	struct device *dev = &ne->device;
+	int i;
+
+	nodemgr_remove_node_uds(ne);
+
+	for (i = 0; i < ARRAY_SIZE(fw_ne_attrs); i++)
+		device_remove_file(dev, fw_ne_attrs[i]);
+
+	device_remove_file(dev, &dev_attr_ne_guid_vendor_oui);
+	device_remove_file(dev, &dev_attr_ne_vendor_name);
+	device_remove_file(dev, &dev_attr_ne_vendor_oui);
+
+	device_unregister(dev);
+}
+
+
+static void nodemgr_remove_host_dev(struct device *dev)
+{
+	int i;
+	struct list_head *lh, *next;
+
+	list_for_each_safe(lh, next, &dev->children) {
+		struct node_entry *ne;
+		ne = container_of(list_to_dev(lh), struct node_entry, device);
+		nodemgr_remove_ne(ne);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(fw_host_attrs); i++)
+		device_remove_file(dev, fw_host_attrs[i]);
 
-	return len;
+	sysfs_remove_link(&dev->kobj, "irm_id");
+	sysfs_remove_link(&dev->kobj, "busmgr_id");
+	sysfs_remove_link(&dev->kobj, "host_id");
 }
 
-#undef PUTF
-#endif /* CONFIG_PROC_FS */
 
-static void nodemgr_process_config_rom(struct node_entry *ne, 
-				       quadlet_t busoptions);
+static struct device nodemgr_dev_template_ud = {
+	.bus		= &ieee1394_bus_type,
+	.release	= nodemgr_release_ud,
+	.class_num	= DEV_CLASS_UNIT_DIRECTORY,
+};
+
+static struct device nodemgr_dev_template_ne = {
+	.bus		= &ieee1394_bus_type,
+	.release	= nodemgr_release_ne,
+	.class_num	= DEV_CLASS_NODE,
+};
+
+static struct device nodemgr_dev_template_host = {
+	.bus		= &ieee1394_bus_type,
+	.class_num	= DEV_CLASS_HOST,
+};
+
+
+static int nodemgr_hotplug(struct device *dev, char **envp, int num_envp,
+                           char *buffer, int buffer_size);
+
+
+struct bus_type ieee1394_bus_type = {
+	.name		= "ieee1394",
+	.match		= nodemgr_bus_match,
+	.hotplug	= nodemgr_hotplug,
+};
+
 
 static int nodemgr_read_quadlet(struct hpsb_host *host,
 				nodeid_t nodeid, unsigned int generation,
@@ -292,7 +594,8 @@
 	ret = -ENXIO;
 	for (; size > 0; size--, address += 4, quadp++) {
 		for (i = 0; i < 3; i++) {
-			ret = hpsb_read(ne->host, ne->nodeid, ne->generation, address, quadp, 4);
+			
+			ret = hpsb_node_read(ne, address, quadp, 4);
 			if (ret != -EAGAIN)
 				break;
 		}
@@ -316,6 +619,10 @@
 	
 	if (nodemgr_read_quadlet(host, nodeid, generation, address, &quad))
 		return NULL;
+
+	if (CONFIG_ROM_BUS_INFO_LENGTH(quad) == 1)  /* minimal config rom */
+		return NULL;
+
 	address += 4 + CONFIG_ROM_BUS_INFO_LENGTH(quad) * 4;
 
 	if (nodemgr_read_quadlet(host, nodeid, generation, address, &quad))
@@ -349,9 +656,10 @@
 	if (!ne)
 		return NULL;
 
+	memset(ne, 0, total_size);
+
 	if (size != 0) {
-		ne->vendor_name
-			= (const char *) &(ne->quadlets[2]);
+		ne->vendor_name = (const char *) &(ne->quadlets[2]);
 		ne->quadlets[size] = 0;
 	} else {
 		ne->vendor_name = NULL;
@@ -360,62 +668,129 @@
 	return ne; 
 }
 
+
+static void nodemgr_process_config_rom(struct host_info *hi,
+		struct node_entry *ne, quadlet_t busoptions);
+
 static struct node_entry *nodemgr_create_node(octlet_t guid, quadlet_t busoptions,
-					      struct hpsb_host *host,
-					      nodeid_t nodeid, unsigned int generation)
+					      struct host_info *hi, nodeid_t nodeid,
+					      unsigned int generation)
 {
+	struct hpsb_host *host = hi->host;
         struct node_entry *ne;
 
 	ne = nodemgr_scan_root_directory (host, nodeid, generation);
         if (!ne) return NULL;
 
-        INIT_LIST_HEAD(&ne->list);
-	INIT_LIST_HEAD(&ne->unit_directories);
-
 	ne->tpool = &host->tpool[nodeid & NODE_MASK];
 
         ne->host = host;
         ne->nodeid = nodeid;
-        ne->guid = guid;
 	ne->generation = generation;
 
-        list_add_tail(&ne->list, &node_list);
+        ne->guid = guid;
+	ne->guid_vendor_id = (guid >> 40) & 0xffffff;
+	ne->guid_vendor_oui = nodemgr_find_oui_name(ne->guid_vendor_id);
+
+	memcpy(&ne->device, &nodemgr_dev_template_ne,
+	       sizeof(ne->device));
+	ne->device.parent = &host->device;
+	snprintf(ne->device.bus_id, BUS_ID_SIZE, "%016Lx",
+		 (unsigned long long)(ne->guid));
+	snprintf(ne->device.name, DEVICE_NAME_SIZE,
+		 "IEEE-1394 device %d-" NODE_BUS_FMT, hi->id,
+		 NODE_BUS_ARGS(ne->nodeid));
+
+	device_register(&ne->device);
+
+	if (ne->guid_vendor_oui)
+		device_create_file(&ne->device, &dev_attr_ne_guid_vendor_oui);
+	nodemgr_create_ne_dev_files(ne);
+
+	nodemgr_process_config_rom (hi, ne, busoptions);
 
-	nodemgr_process_config_rom (ne, busoptions);
+	nodemgr_update_ud_names(hi, ne);
 
-	HPSB_DEBUG("%s added: ID:BUS[" NODE_BUS_FMT "]  GUID[%016Lx]  [%s] (%s)",
+	HPSB_DEBUG("%s added: ID:BUS[%d-" NODE_BUS_FMT "]  GUID[%016Lx]",
 		   (host->node_id == nodeid) ? "Host" : "Node",
-		   NODE_BUS_ARGS(nodeid), (unsigned long long)guid,
-		   ne->oui_name,
-		   ne->vendor_name ?: "Unknown");
+		   hi->id, NODE_BUS_ARGS(nodeid), (unsigned long long)guid);
 
         return ne;
 }
 
-static struct node_entry *find_entry_by_guid(u64 guid)
+
+struct guid_search_baton {
+	u64 guid;
+	struct node_entry *ne;
+};
+
+static int nodemgr_guid_search_cb(struct device *dev, void *__data)
 {
-        struct list_head *lh;
+        struct guid_search_baton *search = __data;
         struct node_entry *ne;
-        
-        list_for_each(lh, &node_list) {
-                ne = list_entry(lh, struct node_entry, list);
-                if (ne->guid == guid) return ne;
-        }
 
-        return NULL;
+        if (dev->class_num != DEV_CLASS_NODE)
+                return 0;
+
+        ne = container_of(dev, struct node_entry, device);
+
+        if (ne->guid == search->guid) {
+		search->ne = ne;
+		return 1;
+	}
+
+	return 0;
 }
 
-static struct node_entry *find_entry_by_nodeid(nodeid_t nodeid)
+static struct node_entry *find_entry_by_guid(u64 guid)
 {
-	struct list_head *lh;
+	struct guid_search_baton search;
+
+	search.guid = guid;
+	search.ne = NULL;
+
+	bus_for_each_dev(&ieee1394_bus_type, NULL, &search, nodemgr_guid_search_cb);
+
+        return search.ne;
+}
+
+
+struct nodeid_search_baton {
+	nodeid_t nodeid;
 	struct node_entry *ne;
+	struct hpsb_host *host;
+};
+
+static int nodemgr_nodeid_search_cb(struct device *dev, void *__data)
+{
+	struct nodeid_search_baton *search = __data;
+	struct node_entry *ne;
+
+	if (dev->class_num != DEV_CLASS_NODE)
+		return 0;
+
+	ne = container_of(dev, struct node_entry, device);
 
-	list_for_each(lh, &node_list) {
-		ne = list_entry(lh, struct node_entry, list);
-		if (ne->nodeid == nodeid) return ne;
+	if (ne->host == search->host && ne->nodeid == search->nodeid) {
+		search->ne = ne;
+		/* Returning 1 stops the iteration */
+		return 1;
 	}
 
-	return NULL;
+	return 0;
+}
+
+static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, nodeid_t nodeid)
+{
+	struct nodeid_search_baton search;
+
+	search.nodeid = nodeid;
+	search.ne = NULL;
+	search.host = host;
+
+	bus_for_each_dev(&ieee1394_bus_type, NULL, &search, nodemgr_nodeid_search_cb);
+
+	return search.ne;
 }
 
 static struct unit_directory *nodemgr_scan_unit_directory
@@ -500,28 +875,27 @@
 				return NULL;
 		}
 	}
+
 	total_size += count * sizeof (quadlet_t);
 	ud = kmalloc (total_size, GFP_KERNEL);
+
 	if (ud != NULL) {
-		memset (ud, 0, sizeof *ud);
+		memset (ud, 0, total_size);
 		ud->flags = flags;
-		ud->count = count;
+		ud->length = count;
 		ud->vendor_name_size = vendor_name_size;
 		ud->model_name_size = model_name_size;
-		/* If there is no vendor name in the unit directory,
-		   use the one in the root directory.  */
-		ud->vendor_name = ne->vendor_name;
 	}
+
 	return ud;
 }
 
+
 /* This implementation currently only scans the config rom and its
  * immediate unit directories looking for software_id and
- * software_version entries, in order to get driver autoloading working.
- */
-
-static void nodemgr_process_unit_directory(struct node_entry *ne, 
-					   octlet_t address)
+ * software_version entries, in order to get driver autoloading working. */
+static void nodemgr_process_unit_directory(struct host_info *hi, struct node_entry *ne, 
+					   octlet_t address, unsigned int id)
 {
 	struct unit_directory *ud;
 	quadlet_t quad;
@@ -533,6 +907,7 @@
 
 	ud->ne = ne;
 	ud->address = address;
+	ud->id = id;
 
 	if (nodemgr_read_quadlet(ne->host, ne->nodeid, ne->generation,
 				 address, &quad))
@@ -541,7 +916,7 @@
 	address += 4;
 
 	infop = (quadlet_t *) ud->quadlets;
-	for (; length > 0; length--, address += 4, infop++) {
+	for (; length > 0; length--, address += 4) {
 		int code;
 		quadlet_t value;
 		quadlet_t *quadp;
@@ -556,14 +931,16 @@
 		case CONFIG_ROM_VENDOR_ID:
 			ud->vendor_id = value;
 			ud->flags |= UNIT_DIRECTORY_VENDOR_ID;
+
+			if (ud->vendor_id)
+				ud->vendor_oui = nodemgr_find_oui_name(ud->vendor_id);
+
 			if ((ud->flags & UNIT_DIRECTORY_VENDOR_TEXT) != 0) {
 				length--;
 				address += 4;
-				quadp = &(ud->quadlets[ud->count]);
-				if (nodemgr_read_text_leaf(ne, address,
-							   quadp) == 0
-				    && quadp[0] == 0
-				    && quadp[1] == 0) {
+				quadp = &(ud->quadlets[ud->length]);
+				if (nodemgr_read_text_leaf(ne, address, quadp) == 0
+				    && quadp[0] == 0 && quadp[1] == 0) {
 				    	/* We only support minimal
 					   ASCII and English. */
 					quadp[ud->vendor_name_size] = 0;
@@ -579,11 +956,9 @@
 			if ((ud->flags & UNIT_DIRECTORY_MODEL_TEXT) != 0) {
 				length--;
 				address += 4;
-				quadp = &(ud->quadlets[ud->count + ud->vendor_name_size + 1]);
-				if (nodemgr_read_text_leaf(ne, address,
-							   quadp) == 0
-				    && quadp[0] == 0
-				    && quadp[1] == 0) {
+				quadp = &(ud->quadlets[ud->length + ud->vendor_name_size + 1]);
+				if (nodemgr_read_text_leaf(ne, address, quadp) == 0
+				    && quadp[0] == 0 && quadp[1] == 0) {
 				    	/* We only support minimal
 					   ASCII and English. */
 					quadp[ud->model_name_size] = 0;
@@ -614,13 +989,22 @@
 			   CSR offsets for now.  */
 			code &= CONFIG_ROM_KEY_TYPE_MASK;
 			if ((code & 0x80) == 0)
-				*infop = quad;
+				*infop++ = quad;
 			break;
 		}
 	}
 
-	list_add_tail(&ud->node_list, &ne->unit_directories);
-	list_add_tail(&ud->driver_list, &unit_directory_list);
+	memcpy(&ud->device, &nodemgr_dev_template_ud,
+	       sizeof(ud->device));
+	ud->device.parent = &ne->device;
+	snprintf(ud->device.bus_id, BUS_ID_SIZE, "%s-%u",
+		 ne->device.bus_id, ud->id);
+
+	device_register(&ud->device);
+
+	if (ud->vendor_oui)
+		device_create_file(&ud->device, &dev_attr_ud_vendor_oui);
+	nodemgr_create_ud_dev_files(ud);
 
 	return;
 
@@ -629,39 +1013,13 @@
 		kfree(ud);
 }
 
-static void dump_directories (struct node_entry *ne)
-{
-#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
-	struct list_head *l;
-
-	HPSB_DEBUG("vendor_id=0x%06x [%s], capabilities=0x%06x",
-		   ne->vendor_id, ne->vendor_name ?: "Unknown",
-		   ne->capabilities);
-	list_for_each (l, &ne->unit_directories) {
-		struct unit_directory *ud = list_entry (l, struct unit_directory, node_list);
-		HPSB_DEBUG("unit directory:");
-		if (ud->flags & UNIT_DIRECTORY_VENDOR_ID)
-			HPSB_DEBUG("  vendor_id=0x%06x [%s]",
-				   ud->vendor_id,
-				   ud->vendor_name ?: "Unknown");
-		if (ud->flags & UNIT_DIRECTORY_MODEL_ID)
-			HPSB_DEBUG("  model_id=0x%06x [%s]",
-				   ud->model_id,
-				   ud->model_name ?: "Unknown");
-		if (ud->flags & UNIT_DIRECTORY_SPECIFIER_ID)
-			HPSB_DEBUG("  sw_specifier_id=0x%06x ", ud->specifier_id);
-		if (ud->flags & UNIT_DIRECTORY_VERSION)
-			HPSB_DEBUG("  sw_version=0x%06x ", ud->version);
-	}
-#endif
-	return;
-}
 
-static void nodemgr_process_root_directory(struct node_entry *ne)
+static void nodemgr_process_root_directory(struct host_info *hi, struct node_entry *ne)
 {
 	octlet_t address;
 	quadlet_t quad;
 	int length;
+	unsigned int ud_id = 0;
 
 	address = CSR_REGISTER_BASE + CSR_CONFIG_ROM;
 	
@@ -688,24 +1046,23 @@
 		switch (code) {
 		case CONFIG_ROM_VENDOR_ID:
 			ne->vendor_id = value;
-#ifdef CONFIG_IEEE1394_OUI_DB
-			ne->oui_name = nodemgr_find_oui_name(value);
-#else
-			ne->oui_name = "Unknown";
-#endif
+
+			if (ne->vendor_id)
+				ne->vendor_oui = nodemgr_find_oui_name(ne->vendor_id);
+
 			/* Now check if there is a vendor name text
 			   string.  */
 			if (ne->vendor_name != NULL) {
 				length--;
 				address += 4;
-				if (nodemgr_read_text_leaf(ne, address,
-							   ne->quadlets)
-				    != 0
-				    || ne->quadlets [0] != 0
-				    || ne->quadlets [1] != 0)
+				if (nodemgr_read_text_leaf(ne, address, ne->quadlets) != 0
+				    || ne->quadlets[0] != 0 || ne->quadlets[1] != 0)
 				    	/* We only support minimal
 					   ASCII and English. */
 					ne->vendor_name = NULL;
+				else
+					device_create_file(&ne->device,
+						&dev_attr_ne_vendor_name);
 			}
 			break;
 
@@ -714,7 +1071,7 @@
 			break;
 
 		case CONFIG_ROM_UNIT_DIRECTORY:
-			nodemgr_process_unit_directory(ne, address + value * 4);
+			nodemgr_process_unit_directory(hi, ne, address + value * 4, ud_id++);
 			break;			
 
 		case CONFIG_ROM_DESCRIPTOR_LEAF:
@@ -723,214 +1080,78 @@
 			break;
 		}
 	}
-
-	dump_directories(ne);
 }
 
 #ifdef CONFIG_HOTPLUG
 
-static void nodemgr_call_policy(char *verb, struct unit_directory *ud)
+static int nodemgr_hotplug(struct device *dev, char **envp, int num_envp,
+			   char *buffer, int buffer_size)
 {
-	char *argv [3], **envp, *buf, *scratch;
-	int i = 0, value;
-
-	/* User requested to disable hotplug when module was loaded. */
-	if (nodemgr_disable_hotplug)
-		return;
-
-	if (!hotplug_path [0])
-		return;
-	if (!current->fs->root)
-		return;
-	if (!(envp = (char **) kmalloc(20 * sizeof (char *), GFP_KERNEL))) {
-		HPSB_DEBUG ("ENOMEM");
-		return;
-	}
-	if (!(buf = kmalloc(256, GFP_KERNEL))) {
-		kfree(envp);
-		HPSB_DEBUG("ENOMEM2");
-		return;
-	}
+	struct unit_directory *ud;
+	char *scratch;
+	int i = 0;
+	int length = 0;
+
+	if (!dev)
+		return -ENODEV;
+
+	if (dev->class_num != DEV_CLASS_UNIT_DIRECTORY)
+		return -ENODEV;
+
+	ud = container_of(dev, struct unit_directory, device);
+
+	scratch = buffer;
+
+#define PUT_ENVP(fmt,val) 					\
+do {								\
+	envp[i++] = scratch;					\
+	length += snprintf(scratch, buffer_size - length,	\
+			   fmt, val);				\
+	if ((buffer_size - length <= 0) || (i >= num_envp))	\
+		return -ENOMEM;					\
+	++length;						\
+	scratch = buffer + length;				\
+} while(0)
+
+	PUT_ENVP("VENDOR_ID=%06x", ud->vendor_id);
+	PUT_ENVP("MODEL_ID=%06x", ud->model_id);
+	PUT_ENVP("GUID=%016Lx", (unsigned long long)ud->ne->guid);
+	PUT_ENVP("SPECIFIER_ID=%06x", ud->specifier_id);
+	PUT_ENVP("VERSION=%06x", ud->version);
 
-	/* only one standardized param to hotplug command: type */
-	argv[0] = hotplug_path;
-	argv[1] = "ieee1394";
-	argv[2] = 0;
-
-	/* minimal command environment */
-	envp[i++] = "HOME=/";
-	envp[i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
+#undef PUT_ENVP
 
-#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
-	/* hint that policy agent should enter no-stdout debug mode */
-	envp[i++] = "DEBUG=kernel";
-#endif
-	/* extensible set of named bus-specific parameters,
-	 * supporting multiple driver selection algorithms.
-	 */
-	scratch = buf;
+	envp[i] = 0;
 
-	envp[i++] = scratch;
-	scratch += sprintf(scratch, "ACTION=%s", verb) + 1;
-	envp[i++] = scratch;
-	scratch += sprintf(scratch, "VENDOR_ID=%06x", ud->ne->vendor_id) + 1;
-	envp[i++] = scratch;
-	scratch += sprintf(scratch, "GUID=%016Lx", (long long unsigned)ud->ne->guid) + 1;
-	envp[i++] = scratch;
-	scratch += sprintf(scratch, "SPECIFIER_ID=%06x", ud->specifier_id) + 1;
-	envp[i++] = scratch;
-	scratch += sprintf(scratch, "VERSION=%06x", ud->version) + 1;
-	envp[i++] = 0;
-
-	/* NOTE: user mode daemons can call the agents too */
-#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
-	HPSB_DEBUG("NodeMgr: %s %s %016Lx", argv[0], verb, (long long unsigned)ud->ne->guid);
-#endif
-	value = call_usermodehelper(argv[0], argv, envp, 0);
-	kfree(buf);
-	kfree(envp);
-	if (value != 0)
-		HPSB_DEBUG("NodeMgr: hotplug policy returned %d", value);
+	return 0;
 }
 
 #else
 
-static inline void
-nodemgr_call_policy(char *verb, struct unit_directory *ud)
+static int nodemgr_hotplug(struct device *dev, char **envp, int num_envp,
+			   char *buffer, int buffer_size)
 {
-#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
-	HPSB_DEBUG("NodeMgr: nodemgr_call_policy(): hotplug not enabled");
-#endif
-	return;
+	return -ENODEV;
 } 
 
 #endif /* CONFIG_HOTPLUG */
 
-static void nodemgr_claim_unit_directory(struct unit_directory *ud,
-					 struct hpsb_protocol_driver *driver)
-{
-	ud->driver = driver;
-	list_del(&ud->driver_list);
-	list_add_tail(&ud->driver_list, &driver->unit_directories);
-}
-
-static void nodemgr_release_unit_directory(struct unit_directory *ud)
-{
-	ud->driver = NULL;
-	list_del(&ud->driver_list);
-	list_add_tail(&ud->driver_list, &unit_directory_list);
-}
 
-void hpsb_release_unit_directory(struct unit_directory *ud)
+static int nodemgr_alloc_host_num(void)
 {
-	down(&nodemgr_serialize);
-	nodemgr_release_unit_directory(ud);
-	up(&nodemgr_serialize);
-}
+	int hostnum;
 
-static void nodemgr_free_unit_directories(struct node_entry *ne)
-{
-	struct list_head *lh;
-	struct unit_directory *ud;
+	for (hostnum = 0; hpsb_get_hostinfo_bykey(nodemgr_hl, hostnum); hostnum++)
+		/* Do nothing */;
 
-	lh = ne->unit_directories.next;
-	while (lh != &ne->unit_directories) {
-		ud = list_entry(lh, struct unit_directory, node_list);
-		lh = lh->next;
-		if (ud->driver && ud->driver->disconnect)
-			ud->driver->disconnect(ud);
-		nodemgr_release_unit_directory(ud);
-		nodemgr_call_policy("remove", ud);
-		list_del(&ud->driver_list);
-		kfree(ud);
-	}
+	return hostnum;
 }
 
-static struct ieee1394_device_id *
-nodemgr_match_driver(struct hpsb_protocol_driver *driver, 
-		     struct unit_directory *ud)
-{
-	struct ieee1394_device_id *id;
-
-	for (id = driver->id_table; id->match_flags != 0; id++) {
-		if ((id->match_flags & IEEE1394_MATCH_VENDOR_ID) &&
-		    id->vendor_id != ud->vendor_id)
-			continue;
-
-		if ((id->match_flags & IEEE1394_MATCH_MODEL_ID) &&
-		    id->model_id != ud->model_id)
-			continue;
-
-		if ((id->match_flags & IEEE1394_MATCH_SPECIFIER_ID) &&
-		    id->specifier_id != ud->specifier_id)
-			continue;
-
-		if ((id->match_flags & IEEE1394_MATCH_VERSION) &&
-		    id->version != ud->version)
-			continue;
-
-		return id;
-	}
-
-	return NULL;
-}
-
-static struct hpsb_protocol_driver *
-nodemgr_find_driver(struct unit_directory *ud)
-{
-	struct list_head *l;
-	struct hpsb_protocol_driver *match, *driver;
-	struct ieee1394_device_id *device_id;
-
-	match = NULL;
-	list_for_each(l, &driver_list) {
-		driver = list_entry(l, struct hpsb_protocol_driver, list);
-		device_id = nodemgr_match_driver(driver, ud);
-
-		if (device_id != NULL) {
-			match = driver;
-			break;
-		}
-	}
-
-	return match;
-}
-
-static void nodemgr_bind_drivers (struct node_entry *ne)
-{
-	struct list_head *lh;
-	struct hpsb_protocol_driver *driver;
-	struct unit_directory *ud;
-
-	list_for_each(lh, &ne->unit_directories) {
-		ud = list_entry(lh, struct unit_directory, node_list);
-		driver = nodemgr_find_driver(ud);
-		if (driver != NULL && driver->probe(ud) == 0)
-			nodemgr_claim_unit_directory(ud, driver);
-		nodemgr_call_policy("add", ud);
-	}
-}
 
 int hpsb_register_protocol(struct hpsb_protocol_driver *driver)
 {
-	struct unit_directory *ud;
-	struct list_head *lh;
-
-	if (down_interruptible(&nodemgr_serialize))
-		return -EINTR;
-
-	list_add_tail(&driver->list, &driver_list);
-
-	INIT_LIST_HEAD(&driver->unit_directories);
-	lh = unit_directory_list.next;
-	while (lh != &unit_directory_list) {
-		ud = list_entry(lh, struct unit_directory, driver_list);
-		lh = lh->next;
-		if (nodemgr_match_driver(driver, ud) && driver->probe(ud) == 0)
-			nodemgr_claim_unit_directory(ud, driver);
-	}
-
-	up(&nodemgr_serialize);
+	driver_register(&driver->driver);
+	nodemgr_create_drv_files(driver);
 
 	/*
 	 * Right now registration always succeeds, but maybe we should
@@ -942,26 +1163,14 @@
 
 void hpsb_unregister_protocol(struct hpsb_protocol_driver *driver)
 {
-	struct list_head *lh;
-	struct unit_directory *ud;
-
-	down(&nodemgr_serialize);
-
-	list_del(&driver->list);
-	lh = driver->unit_directories.next;
-	while (lh != &driver->unit_directories) {
-		ud = list_entry(lh, struct unit_directory, driver_list);
-		lh = lh->next;
-		if (ud->driver && ud->driver->disconnect)
-			ud->driver->disconnect(ud);
-		nodemgr_release_unit_directory(ud);
-	}
-
-	up(&nodemgr_serialize);
+	nodemgr_remove_drv_files(driver);
+	/* This will subsequently disconnect all devices that our driver
+	 * is attached to. */
+	driver_unregister(&driver->driver);
 }
 
-static void nodemgr_process_config_rom(struct node_entry *ne, 
-				       quadlet_t busoptions)
+static void nodemgr_process_config_rom(struct host_info *hi,
+		struct node_entry *ne, quadlet_t busoptions)
 {
 	ne->busopt.irmc		= (busoptions >> 31) & 1;
 	ne->busopt.cmc		= (busoptions >> 30) & 1;
@@ -981,16 +1190,42 @@
 		   ne->busopt.cyc_clk_acc, ne->busopt.max_rec,
 		   ne->busopt.generation, ne->busopt.lnkspd);
 #endif
+	device_remove_file(&ne->device, &dev_attr_ne_vendor_oui);
 
-	/*
-	 * When the config rom changes we disconnect all drivers and
-	 * free the cached unit directories and reread the whole
-	 * thing.  If this was a new device, the call to
-	 * nodemgr_disconnect_drivers is a no-op and all is well.
-	 */
-	nodemgr_free_unit_directories(ne);
-	nodemgr_process_root_directory(ne);
-	nodemgr_bind_drivers(ne);
+	nodemgr_process_root_directory(hi, ne);
+
+	if (ne->vendor_oui)
+		device_create_file(&ne->device, &dev_attr_ne_vendor_oui);
+}
+
+
+/* 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->class_num != DEV_CLASS_UNIT_DIRECTORY)
+		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;
 }
 
 /*
@@ -1001,29 +1236,42 @@
  * the to take whatever actions required.
  */
 static void nodemgr_update_node(struct node_entry *ne, quadlet_t busoptions,
-                               struct hpsb_host *host,
-				nodeid_t nodeid, unsigned int generation)
+				struct host_info *hi, nodeid_t nodeid,
+				unsigned int generation)
 {
-	struct list_head *lh;
-	struct unit_directory *ud;
+	int update_ud_names = 0;
 
 	if (ne->nodeid != nodeid) {
+		snprintf(ne->device.name, DEVICE_NAME_SIZE,
+			 "IEEE-1394 device %d-" NODE_BUS_FMT,
+			 hi->id, NODE_BUS_ARGS(ne->nodeid));
 		HPSB_DEBUG("Node " NODE_BUS_FMT " changed to " NODE_BUS_FMT,
 			   NODE_BUS_ARGS(ne->nodeid), NODE_BUS_ARGS(nodeid));
 		ne->nodeid = nodeid;
+
+		update_ud_names++;
 	}
 
-	if (ne->busopt.generation != ((busoptions >> 4) & 0xf))
-		nodemgr_process_config_rom (ne, busoptions);
+	if (ne->busopt.generation != ((busoptions >> 4) & 0xf)) {
+		/* If the node's configrom generation has changed, we
+		 * unregister all the unit directories. */
+		nodemgr_remove_node_uds(ne);
+
+		/* This will re-register our unitdir's */
+		nodemgr_process_config_rom (hi, ne, busoptions);
+
+		update_ud_names++;
+	}
+
+	if (update_ud_names)
+		nodemgr_update_ud_names(hi, ne);
 
 	/* Since that's done, we can declare this record current */
 	ne->generation = generation;
 
-	list_for_each (lh, &ne->unit_directories) {
-		ud = list_entry (lh, struct unit_directory, node_list);
-		if (ud->driver != NULL && ud->driver->update != NULL)
-			ud->driver->update(ud);
-	}
+	/* Update unit_dirs with attached drivers */
+	bus_for_each_dev(&ieee1394_bus_type, NULL, ne,
+			 nodemgr_driver_search_cb);
 }
 
 static int read_businfo_block(struct hpsb_host *host, nodeid_t nodeid, unsigned int generation,
@@ -1067,6 +1315,13 @@
 	header_size = buffer[0] >> 24;
 	addr += 4;
 
+	if (header_size == 1) {
+		HPSB_INFO("Node " NODE_BUS_FMT " has a minimal ROM.  "
+			  "Vendor is %08x",
+			  NODE_BUS_ARGS(nodeid), buffer[0] & 0x00ffffff);
+		return -1;
+	}
+
 	if (header_size < 4) {
 		HPSB_INFO("Node " NODE_BUS_FMT " has non-standard ROM "
 			  "format (%d quads), cannot parse",
@@ -1087,24 +1342,13 @@
 	return 0;
 }		
 
-static void nodemgr_remove_node(struct node_entry *ne)
-{
-	HPSB_DEBUG("Device removed: Node[" NODE_BUS_FMT "]  GUID[%016Lx]  [%s]",
-		   NODE_BUS_ARGS(ne->nodeid), (unsigned long long)ne->guid,
-		   ne->vendor_name ?: "Unknown");
-
-	nodemgr_free_unit_directories(ne);
-	list_del(&ne->list);
-	kfree(ne);
-
-	return;
-}
 
 /* This is where we probe the nodes for their information and provided
  * features.  */
-static void nodemgr_node_probe_one(struct hpsb_host *host,
+static void nodemgr_node_probe_one(struct host_info *hi,
 				   nodeid_t nodeid, int generation)
 {
+	struct hpsb_host *host = hi->host;
 	struct node_entry *ne;
 	quadlet_t buffer[5];
 	octlet_t guid;
@@ -1132,58 +1376,48 @@
 	ne = find_entry_by_guid(guid);
 
 	if (!ne)
-		nodemgr_create_node(guid, buffer[2], host, nodeid, generation);
+		nodemgr_create_node(guid, buffer[2], hi, nodeid, generation);
 	else
-		nodemgr_update_node(ne, buffer[2], host, nodeid, generation);
+		nodemgr_update_node(ne, buffer[2], hi, nodeid, generation);
 
 	return;
 }
 
-static void nodemgr_node_probe_cleanup(struct hpsb_host *host, unsigned int generation)
+
+struct cleanup_baton {
+	unsigned int generation;
+	struct hpsb_host *host;
+	struct node_entry *ne;
+};
+
+static int nodemgr_remove_node(struct device *dev, void *__data)
 {
-	struct list_head *lh, *next;
+	struct cleanup_baton *cleanup = __data;
 	struct node_entry *ne;
 
-	/* Now check to see if we have any nodes that aren't referenced
-	 * any longer.  */
-	list_for_each_safe(lh, next, &node_list) {
-		ne = list_entry(lh, struct node_entry, list);
+	if (dev->class_num != DEV_CLASS_NODE)
+		return 0;
 
-		/* Only checking this host */
-		if (ne->host != host)
-			continue;
+	ne = container_of(dev, struct node_entry, device);
+
+	if (ne->host != cleanup->host)
+		return 0;
 
-		/* If the generation didn't get updated, then either the
-		 * node was removed, or it failed the above probe. Either
-		 * way, we remove references to it, since they are
-		 * invalid.  */
-		if (ne->generation != generation)
-			nodemgr_remove_node(ne);
+	if (ne->generation != cleanup->generation) {
+		cleanup->ne = ne;
+		return 1;
 	}
 
-	return;
+	return 0;
 }
 
-static void nodemgr_node_probe(struct hpsb_host *host)
+
+static void nodemgr_node_probe(struct host_info *hi, int generation)
 {
 	int count;
+	struct hpsb_host *host = hi->host;
 	struct selfid *sid = (struct selfid *)host->topology_map;
 	nodeid_t nodeid = LOCAL_BUS;
-	unsigned int generation;
-
-	/* Pause for 1/4 second, to make sure things settle down. If
-	 * schedule_timeout returns non-zero, it means we caught a signal
-	 * and need to return. */
-	set_current_state(TASK_INTERRUPTIBLE);
-	if (schedule_timeout (HZ/4))
-		return;
-
-	/* Now get the generation in which the node ID's we collect
-	 * are valid.  During the bus scan we will use this generation
-	 * for the read transactions, so that if another reset occurs
-	 * during the scan the transactions will fail instead of
-	 * returning bogus data. */
-	generation = get_hpsb_generation(host);
 
 	/* Scan each node on the bus */
 	for (count = host->selfid_count; count; count--, sid++) {
@@ -1194,8 +1428,7 @@
 			nodeid++;
 			continue;
 		}
-
-		nodemgr_node_probe_one(host, nodeid++, generation);
+		nodemgr_node_probe_one(hi, nodeid++, generation);
 	}
 
 	/* If we had a bus reset while we were scanning the bus, it is
@@ -1204,15 +1437,40 @@
 	 * were still on the bus.  The bus reset increased
 	 * hi->reset_sem, so there's a bus scan pending which will do
 	 * the clean up eventually. */
-	if (generation == get_hpsb_generation(host))
-		nodemgr_node_probe_cleanup(host, generation);
+	if (generation == get_hpsb_generation(host)) {
+		struct cleanup_baton cleanup;
+
+		cleanup.generation = generation;
+		cleanup.host = host;
+
+		/* This will iterate until all devices that do not match
+		 * the generation are removed. */
+		while (bus_for_each_dev(&ieee1394_bus_type, NULL, &cleanup,
+					nodemgr_remove_node)) {
+			struct node_entry *ne = cleanup.ne;
+
+			HPSB_DEBUG("Device removed: ID:BUS[" NODE_BUS_FMT "]  GUID[%016Lx]",
+				   NODE_BUS_ARGS(ne->nodeid), (unsigned long long)ne->guid);
+
+			nodemgr_remove_ne(ne);
+		}
+
+		/* Now let's tell the bus to rescan our devices. This may
+		 * seem like overhead, but the driver-model core will only
+		 * scan a device for a driver when either the device is
+		 * added, or when a new driver is added. A bus reset is a
+		 * good reason to rescan devices that were there before.
+		 * For example, an sbp2 device may become available for
+		 * login, if the host that held it was just removed. */
+		bus_rescan_devices(&ieee1394_bus_type);
+	}
 
 	return;
 }
 
 /* Because we are a 1394a-2000 compliant IRM, we need to inform all the other
  * nodes of the broadcast channel.  (Really we're only setting the validity
- * bit). */
+ * bit).  Other IRM responsibilities go in here as well. */
 static void nodemgr_do_irm_duties(struct hpsb_host *host)
 {
 	quadlet_t bc;
@@ -1226,14 +1484,31 @@
 
 	hpsb_write(host, LOCAL_BUS | ALL_NODES, get_hpsb_generation(host),
 		   (CSR_REGISTER_BASE | CSR_BROADCAST_CHANNEL),
-		   &bc,
-		   sizeof(quadlet_t));
+		   &bc, sizeof(quadlet_t));
+
+	/* If there is no bus manager then we should set the root node's
+	 * force_root bit to promote bus stability per the 1394
+	 * spec. (8.4.2.6) */
+	if(host->busmgr_id == 0x3f && host->node_count > 1)
+        {
+		u16 root_node = host->node_count - 1;
+		struct node_entry *ne = hpsb_nodeid_get_entry(host, root_node);
+		
+		if(ne->busopt.cmc)
+			hpsb_send_phy_config(host, root_node, -1);
+		else {
+			HPSB_DEBUG("The root node is not cycle master capable; "
+				   "selecting a new root node and resetting...");
+			hpsb_send_phy_config(host, host->node_id, -1);
+			hpsb_reset_bus(host, LONG_RESET_FORCE_ROOT);
+		}
+	}
 }
 
 /* We need to ensure that if we are not the IRM, that the IRM node is capable of
  * everything we can do, otherwise issue a bus reset and try to become the IRM
  * ourselves. */
-static int nodemgr_check_root_capability(struct hpsb_host *host)
+static int nodemgr_check_irm_capability(struct hpsb_host *host)
 {
 	quadlet_t bc;
 	int status;
@@ -1247,9 +1522,10 @@
 			   &bc, sizeof(quadlet_t));
 
 	if (status < 0 || !(be32_to_cpu(bc) & 0x80000000)) {
-		/* The root node does not have a valid BROADCAST_CHANNEL
+		/* The current irm node does not have a valid BROADCAST_CHANNEL
 		 * register and we do, so reset the bus with force_root set */
-		HPSB_INFO("Remote root is not IRM capable, resetting...");
+		HPSB_DEBUG("Current remote IRM is not 1394a-2000 compliant, resetting...");
+		hpsb_send_phy_config(host, host->node_id, -1);
 		hpsb_reset_bus(host, LONG_RESET_FORCE_ROOT);
 		return 0;
 	}
@@ -1259,27 +1535,58 @@
 static int nodemgr_host_thread(void *__hi)
 {
 	struct host_info *hi = (struct host_info *)__hi;
+	struct hpsb_host *host = hi->host;
 
 	/* No userlevel access needed */
-	daemonize("knodemgrd");
+	daemonize(hi->daemon_name);
 	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
 	 * happens when we get a bus reset. */
 	while (!down_interruptible(&hi->reset_sem) &&
 	       !down_interruptible(&nodemgr_serialize)) {
+		unsigned int generation;
+		int i;
+
+		/* Pause for 1/4 second, to make sure things settle down. */
+		for (i = HZ/4; i > 0; i-= HZ/16) {
+			set_current_state(TASK_INTERRUPTIBLE);
+			if (schedule_timeout(HZ/16))
+				goto caught_signal;
+
+			/* Now get the generation in which the node ID's we collect
+			 * are valid.  During the bus scan we will use this generation
+			 * for the read transactions, so that if another reset occurs
+			 * during the scan the transactions will fail instead of
+			 * returning bogus data. */
+			generation = get_hpsb_generation(host);
+
+			/* If we get a reset before we are done waiting, then
+			 * start the the waiting over again */
+			while (!down_trylock(&hi->reset_sem))
+				i = HZ/4;
+		}
 
-		if (!nodemgr_check_root_capability(hi->host)) {
+		if (!nodemgr_check_irm_capability(host)) {
 			/* Do nothing, we are resetting */
 			up(&nodemgr_serialize);
 			continue;
 		}
 
-		nodemgr_node_probe(hi->host);
-		nodemgr_do_irm_duties(hi->host);
+		nodemgr_node_probe(hi, generation);
+		nodemgr_do_irm_duties(host);
+
+		/* Update some of our sysfs symlinks */
+		nodemgr_update_host_dev_links(host);
 
 		up(&nodemgr_serialize);
 	}
+
+caught_signal:
 #ifdef CONFIG_IEEE1394_VERBOSEDEBUG
 	HPSB_DEBUG ("NodeMgr: Exiting thread for %s", hi->host->driver->name);
 #endif
@@ -1298,24 +1605,24 @@
         return ne;
 }
 
-struct node_entry *hpsb_nodeid_get_entry(nodeid_t nodeid)
+struct node_entry *hpsb_nodeid_get_entry(struct hpsb_host *host, nodeid_t nodeid)
 {
 	struct node_entry *ne;
 
 	down(&nodemgr_serialize);
-	ne = find_entry_by_nodeid(nodeid);
+	ne = find_entry_by_nodeid(host, nodeid);
 	up(&nodemgr_serialize);
 
 	return ne;
 }
 
-struct node_entry *hpsb_check_nodeid(nodeid_t nodeid)
+struct node_entry *hpsb_check_nodeid(struct hpsb_host *host, nodeid_t nodeid)
 {
 	struct node_entry *ne;
 
 	if (down_trylock(&nodemgr_serialize))
 		return NULL;
-	ne = find_entry_by_nodeid(nodeid);
+	ne = find_entry_by_nodeid(host, nodeid);
 	up(&nodemgr_serialize);
 
 	return ne;
@@ -1374,12 +1681,11 @@
 			 addr, extcode, data, arg);
 }
 
-static void nodemgr_add_host(struct hpsb_host *host)
+static void nodemgr_add_host(struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
 	struct host_info *hi;
-	unsigned long flags;
 
-	hi = kmalloc(sizeof (struct host_info), in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
+	hi = hpsb_create_hostinfo(hl, host, sizeof(*hi));
 
 	if (!hi) {
 		HPSB_ERR ("NodeMgr: out of memory in add host");
@@ -1390,41 +1696,38 @@
 	 * thread blocks on the reset semaphore until a bus reset
 	 * happens. */
 	hi->host = host;
-	INIT_LIST_HEAD(&hi->list);
 	init_completion(&hi->exited);
         sema_init(&hi->reset_sem, 0);
 
+	hi->id = nodemgr_alloc_host_num();
+
+	hpsb_set_hostinfo_key(hl, host, hi->id);
+
+	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", hi->id);
+	snprintf(host->device.name, DEVICE_NAME_SIZE, "IEEE-1394 Host %s-%d",
+		 host->driver->name, hi->id);
+
+	sprintf(hi->daemon_name, "knodemgrd_%d", hi->id);
+
 	hi->pid = kernel_thread(nodemgr_host_thread, hi,
 				CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
-	
+
 	if (hi->pid < 0) {
-		HPSB_ERR ("NodeMgr: failed to start NodeMgr thread for %s",
-			  host->driver->name);
-		kfree(hi);
+		HPSB_ERR ("NodeMgr: failed to start %s thread for %s",
+			  hi->daemon_name, host->driver->name);
+		hpsb_destroy_hostinfo(hl, host);
 		return;
 	}
 
-	spin_lock_irqsave (&host_info_lock, flags);
-	list_add_tail (&hi->list, &host_info_list);
-	spin_unlock_irqrestore (&host_info_lock, flags);
-
 	return;
 }
 
 static void nodemgr_host_reset(struct hpsb_host *host)
 {
-	struct list_head *lh;
-	struct host_info *hi = NULL;
-	unsigned long flags;
-
-	spin_lock_irqsave (&host_info_lock, flags);
-	list_for_each(lh, &host_info_list) {
-		struct host_info *myhi = list_entry(lh, struct host_info, list);
-		if (myhi->host == host) {
-			hi = myhi;
-			break;
-		}
-	}
+	struct host_info *hi = hpsb_get_hostinfo(nodemgr_hl, host);
 
 	if (hi != NULL) {
 #ifdef CONFIG_IEEE1394_VERBOSEDEBUG
@@ -1432,55 +1735,26 @@
 #endif
 		up(&hi->reset_sem);
 	} else
-		HPSB_ERR ("NodeMgr: could not process reset of non-existent host");
-
-	spin_unlock_irqrestore (&host_info_lock, flags);
+		HPSB_ERR ("NodeMgr: could not process reset of unused host");
 
 	return;
 }
 
 static void nodemgr_remove_host(struct hpsb_host *host)
 {
-	struct list_head *lh, *next;
-	struct node_entry *ne;
-	unsigned long flags;
-	struct host_info *hi = NULL;
-
-	spin_lock_irqsave (&host_info_lock, flags);
-	list_for_each_safe(lh, next, &host_info_list) {
-		struct host_info *myhi = list_entry(lh, struct host_info, list);
-		if (myhi->host == host) {
-			list_del(&myhi->list);
-			hi = myhi;
-			break;
-		}
-	}
-	spin_unlock_irqrestore (&host_info_lock, flags);
+	struct host_info *hi = hpsb_get_hostinfo(nodemgr_hl, host);
 
 	if (hi) {
 		if (hi->pid >= 0) {
 			kill_proc(hi->pid, SIGTERM, 1);
 			wait_for_completion(&hi->exited);
+			nodemgr_remove_host_dev(&host->device);
+			device_unregister(&host->device);
 		}
-		kfree(hi);
-	}
-	else
+	} else
 		HPSB_ERR("NodeMgr: host %s does not exist, cannot remove",
 			 host->driver->name);
 
-	down(&nodemgr_serialize);
-
-	/* Even if we fail the host_info part, remove all the node
-	 * entries.  */
-	list_for_each_safe(lh, next, &node_list) {
-		ne = list_entry(lh, struct node_entry, list);
-
-		if (ne->host == host)
-			nodemgr_remove_node(ne);
-	}
-
-	up(&nodemgr_serialize);
-
 	return;
 }
 
@@ -1490,27 +1764,19 @@
 	.remove_host =	nodemgr_remove_host,
 };
 
-static struct hpsb_highlevel *hl;
-
-#define PROC_ENTRY "devices"
-
-void init_ieee1394_nodemgr(int disable_hotplug)
+void init_ieee1394_nodemgr(void)
 {
-	nodemgr_disable_hotplug = disable_hotplug;
-#ifdef CONFIG_PROC_FS
-	if (!create_proc_read_entry(PROC_ENTRY, 0444, ieee1394_procfs_entry, raw1394_read_proc, NULL))
-		HPSB_ERR("Can't create devices procfs entry");
-#endif
-        hl = hpsb_register_highlevel("Node manager", &nodemgr_ops);
-        if (!hl) {
+	bus_register(&ieee1394_bus_type);
+
+        nodemgr_hl = hpsb_register_highlevel("Node manager", &nodemgr_ops);
+        if (!nodemgr_hl) {
 		HPSB_ERR("NodeMgr: out of memory during ieee1394 initialization");
         }
 }
 
 void cleanup_ieee1394_nodemgr(void)
 {
-        hpsb_unregister_highlevel(hl);
-#ifdef CONFIG_PROC_FS
-	remove_proc_entry(PROC_ENTRY, ieee1394_procfs_entry);
-#endif
+        hpsb_unregister_highlevel(nodemgr_hl);
+
+	bus_unregister(&ieee1394_bus_type);
 }
diff -Nru a/drivers/ieee1394/nodemgr.h b/drivers/ieee1394/nodemgr.h
--- a/drivers/ieee1394/nodemgr.h	Sat Apr 19 19:51:48 2003
+++ b/drivers/ieee1394/nodemgr.h	Sat Apr 19 19:51:48 2003
@@ -20,6 +20,8 @@
 #ifndef _IEEE1394_NODEMGR_H
 #define _IEEE1394_NODEMGR_H
 
+#include <linux/device.h>
+
 #define CONFIG_ROM_BUS_INFO_LENGTH(q)		((q) >> 24)
 #define CONFIG_ROM_BUS_CRC_LENGTH(q)		(((q) >> 16) & 0xff)
 #define CONFIG_ROM_BUS_CRC(q)			((q) & 0xffff)
@@ -76,6 +78,12 @@
 	u16	max_rec;	/* Maximum packet size node can receive */
 };
 
+enum {
+	DEV_CLASS_NODE,
+	DEV_CLASS_UNIT_DIRECTORY,
+	DEV_CLASS_HOST,
+};
+
 #define UNIT_DIRECTORY_VENDOR_ID	0x01
 #define UNIT_DIRECTORY_MODEL_ID		0x02
 #define UNIT_DIRECTORY_SPECIFIER_ID	0x04
@@ -87,18 +95,16 @@
  * A unit directory corresponds to a protocol supported by the
  * node. If a node supports eg. IP/1394 and AV/C, its config rom has a
  * unit directory for each of these protocols.
- * 
- * Unit directories appear on two types of lists: for each node we
- * maintain a list of the unit directories found in its config rom and
- * for each driver we maintain a list of the unit directories
- * (ie. devices) the driver manages.
  */
 struct unit_directory {
 	struct node_entry *ne;  /* The node which this directory belongs to */
 	octlet_t address;	/* Address of the unit directory on the node */
 	u8 flags;		/* Indicates which entries were read */
+
 	quadlet_t vendor_id;
 	const char *vendor_name;
+	const char *vendor_oui;
+
 	int vendor_name_size;
 	quadlet_t model_id;
 	const char *model_name;
@@ -106,22 +112,21 @@
 	quadlet_t specifier_id;
 	quadlet_t version;
 
-	struct hpsb_protocol_driver *driver;
-	void *driver_data;
+	unsigned int id;
 
-	/* For linking the nodes managed by the driver, or unmanaged nodes */
-	struct list_head driver_list;
+	int length;		/* Number of quadlets */
 
-	/* For linking directories belonging to a node */
-	struct list_head node_list;
+	struct device device;
 
-	int count;		/* Number of quadlets */
+	/* XXX Must be last in the struct! */
 	quadlet_t quadlets[0];
 };
 
 struct node_entry {
-	struct list_head list;
 	u64 guid;			/* GUID of this node */
+	u32 guid_vendor_id;		/* Top 24bits of guid */
+	const char *guid_vendor_oui;	/* OUI name of guid vendor id */
+
 	struct hpsb_host *host;		/* Host this node is attached to */
 	nodeid_t nodeid;		/* NodeID */
 	struct bus_options busopt;	/* Bus Options */
@@ -129,14 +134,16 @@
 
 	/* The following is read from the config rom */
 	u32 vendor_id;
+	const char *vendor_name;
+	const char *vendor_oui;
+
 	u32 capabilities;	
-	struct list_head unit_directories;
 
 	struct hpsb_tlabel_pool *tpool;
 
-	const char *vendor_name;
-	char *oui_name;
+	struct device device;
 
+	/* XXX Must be last in the struct! */
 	quadlet_t quadlets[0];
 };
 
@@ -154,11 +161,11 @@
 
 /* Same as above, but use the nodeid to get an node entry. This is not
  * fool-proof by itself, since the nodeid can change.  */
-struct node_entry *hpsb_nodeid_get_entry(nodeid_t nodeid);
+struct node_entry *hpsb_nodeid_get_entry(struct hpsb_host *host, nodeid_t nodeid);
 
 /* Same as above except that it will not block waiting for the nodemgr
  * serialize semaphore.  */
-struct node_entry *hpsb_check_nodeid(nodeid_t nodeid);
+struct node_entry *hpsb_check_nodeid(struct hpsb_host *host, nodeid_t nodeid);
 
 /*
  * If the entry refers to a local host, this function will return the pointer
@@ -188,7 +195,7 @@
 		   int extcode, quadlet_t *data, quadlet_t arg);
 
 
-void init_ieee1394_nodemgr(int disable_hotplug);
+void init_ieee1394_nodemgr(void);
 void cleanup_ieee1394_nodemgr(void);
 
 #endif /* _IEEE1394_NODEMGR_H */
diff -Nru a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
--- a/drivers/ieee1394/ohci1394.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/ieee1394/ohci1394.c	Sat Apr 19 19:51:50 2003
@@ -80,6 +80,10 @@
  * Manfred Weihs <weihs@ict.tuwien.ac.at>
  *  . Reworked code for initiating bus resets
  *    (long, short, with or without hold-off)
+ *
+ * Nandu Santhi <contactnandu@users.sourceforge.net>
+ *  . Added support for nVidia nForce2 onboard Firewire chipset
+ *
  */
 
 #include <linux/config.h>
@@ -90,6 +94,7 @@
 #include <linux/wait.h>
 #include <linux/errno.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/pci.h>
 #include <linux/fs.h>
 #include <linux/poll.h>
@@ -145,7 +150,7 @@
 #define OHCI_DMA_FREE(fmt, args...) \
 	HPSB_ERR("%s(%s)free(%d): "fmt, OHCI1394_DRIVER_NAME, __FUNCTION__, \
 		--global_outstanding_dmas, ## args)
-u32 global_outstanding_dmas = 0;
+static int global_outstanding_dmas = 0;
 #else
 #define OHCI_DMA_ALLOC(fmt, args...)
 #define OHCI_DMA_FREE(fmt, args...)
@@ -160,12 +165,12 @@
 printk(level "%s_%d: " fmt "\n" , OHCI1394_DRIVER_NAME, card , ## args)
 
 static char version[] __devinitdata =
-	"$Rev: 801 $ Ben Collins <bcollins@debian.org>";
+	"$Rev: 866 $ Ben Collins <bcollins@debian.org>";
 
 /* Module Parameters */
-MODULE_PARM(phys_dma,"i");
-MODULE_PARM_DESC(phys_dma, "Enable physical dma (default = 1).");
 static int phys_dma = 1;
+module_param(phys_dma, int, 0644);
+MODULE_PARM_DESC(phys_dma, "Enable physical dma (default = 1).");
 
 static void dma_trm_tasklet(unsigned long data);
 static void dma_trm_reset(struct dma_trm_ctx *d);
@@ -354,10 +359,10 @@
 static void ohci_soft_reset(struct ti_ohci *ohci) {
 	int i;
 
-	reg_write(ohci, OHCI1394_HCControlSet, 0x00010000);
+	reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_softReset);
   
 	for (i = 0; i < OHCI_LOOP_COUNT; i++) {
-		if (reg_read(ohci, OHCI1394_HCControlSet) & 0x00010000)
+		if (!reg_read(ohci, OHCI1394_HCControlSet) & OHCI1394_HCControl_softReset)
 			break;
 		mdelay(1);
 	}
@@ -514,7 +519,7 @@
 	reg_write(ohci, OHCI1394_NodeID, 0x0000ffc0);
 
 	/* Enable posted writes */
-	reg_write(ohci, OHCI1394_HCControlSet, 0x00040000);
+	reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_postedWriteEnable);
 
 	/* Clear link control register */
 	reg_write(ohci, OHCI1394_LinkControlClear, 0xffffffff);
@@ -577,7 +582,7 @@
 		  (OHCI1394_MAX_PHYS_RESP_RETRIES<<8));
 
 	/* We don't want hardware swapping */
-	reg_write(ohci, OHCI1394_HCControlClear, 0x40000000);
+	reg_write(ohci, OHCI1394_HCControlClear, OHCI1394_HCControl_noByteSwap);
 
 	/* Enable interrupts */
 	reg_write(ohci, OHCI1394_IntMaskSet,
@@ -594,7 +599,7 @@
 		  OHCI1394_cycleInconsistent);
 
 	/* Enable link */
-	reg_write(ohci, OHCI1394_HCControlSet, 0x00020000);
+	reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_linkEnable);
 
 	buf = reg_read(ohci, OHCI1394_Version);
 	PRINT(KERN_INFO, ohci->id, "OHCI-1394 %d.%d (PCI): IRQ=[%d]  "
@@ -990,8 +995,24 @@
 			return -EFAULT;
 		}
 
+		/* activate the legacy IR context */
+		if (ohci->ir_legacy_context.ohci == NULL) {
+			if (alloc_dma_rcv_ctx(ohci, &ohci->ir_legacy_context,
+					      DMA_CTX_ISO, 0, IR_NUM_DESC,
+					      IR_BUF_SIZE, IR_SPLIT_BUF_SIZE,
+					      OHCI1394_IsoRcvContextBase) < 0) {
+				PRINT(KERN_ERR, ohci->id, "%s: failed to allocate an IR context",
+				      __FUNCTION__);
+				return -ENOMEM;
+			}
+			ohci->ir_legacy_channels = 0;
+			initialize_dma_rcv_ctx(&ohci->ir_legacy_context, 1);
+
+			DBGMSG(ohci->id, "ISO receive legacy context activated");
+		}
+
 		mask = (u64)0x1<<arg;
-		
+
                 spin_lock_irqsave(&ohci->IR_channel_lock, flags);
 
 		if (ohci->ISO_channel_usage & mask) {
@@ -1002,23 +1023,6 @@
 			return -EFAULT;
 		}
 
-		/* activate the legacy IR context */
-		if(ohci->ir_legacy_context.ohci == NULL) {
-			if(alloc_dma_rcv_ctx(ohci, &ohci->ir_legacy_context,
-					     DMA_CTX_ISO, 0, IR_NUM_DESC,
-					     IR_BUF_SIZE, IR_SPLIT_BUF_SIZE,
-					     OHCI1394_IsoRcvContextBase) < 0) {
-				PRINT(KERN_ERR, ohci->id,
-				      "%s: failed to allocate an IR context", 
-				      __FUNCTION__);
-				return -ENOMEM;
-			}
-			ohci->ir_legacy_channels = 0;
-			initialize_dma_rcv_ctx(&ohci->ir_legacy_context, 1);
-
-			DBGMSG(ohci->id, "ISO receive legacy context activated");
-		}
-
 		ohci->ISO_channel_usage |= mask;
 		ohci->ir_legacy_channels |= mask;
 
@@ -1190,10 +1194,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(recv->block_irq_interval*4 > recv->nblocks)
+			recv->block_irq_interval = recv->nblocks/4;
 		if(recv->block_irq_interval < 1)
 			recv->block_irq_interval = 1;
-		else if(recv->block_irq_interval*4 > recv->nblocks)
-			recv->block_irq_interval = recv->nblocks/4;
+
 	} else {
 		int max_packet_size;
 
@@ -2291,17 +2296,35 @@
 		 * selfID phase, so we disable busReset interrupts, to
 		 * avoid burying the cpu in interrupt requests. */
 		spin_lock_irqsave(&ohci->event_lock, flags);
-  		reg_write(ohci, OHCI1394_IntMaskClear, OHCI1394_busReset);
-		if (ohci->dev->vendor == PCI_VENDOR_ID_APPLE && 
-		    ohci->dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW) {
-  			udelay(10);
-  			while(reg_read(ohci, OHCI1394_IntEventSet) & OHCI1394_busReset) {
-  				reg_write(ohci, OHCI1394_IntEventClear, OHCI1394_busReset);
+		reg_write(ohci, OHCI1394_IntMaskClear, OHCI1394_busReset);
+
+		if (ohci->check_busreset) {
+			int loop_count = 0;
+
+			udelay(10);
+
+			while (reg_read(ohci, OHCI1394_IntEventSet) & OHCI1394_busReset) {
+				reg_write(ohci, OHCI1394_IntEventClear, OHCI1394_busReset);
+
 				spin_unlock_irqrestore(&ohci->event_lock, flags);
-	  			udelay(10);
+				udelay(10);
 				spin_lock_irqsave(&ohci->event_lock, flags);
-  			}
-  		}
+
+				/* The loop counter check is to prevent the driver
+				 * from remaining in this state forever. For the
+				 * initial bus reset, the loop continues for ever
+				 * and the system hangs, until some device is plugged-in
+				 * or out manually into a port! The forced reset seems
+				 * to solve this problem. This mainly effects nForce2. */
+				if (loop_count > 10000) {
+					ohci_devctl(host, RESET_BUS, LONG_RESET);
+					DBGMSG(ohci->id, "Detected bus-reset loop. Forced a bus reset!");
+					loop_count = 0;
+				}
+
+				loop_count++;
+			}
+		}
 		spin_unlock_irqrestore(&ohci->event_lock, flags);
 		if (!host->in_bus_reset) {
 			DBGMSG(ohci->id, "irq_handler: Bus reset requested");
@@ -2438,6 +2461,8 @@
 	if (event)
 		PRINT(KERN_ERR, ohci->id, "Unhandled interrupt(s) 0x%08x",
 		      event);
+
+	return;
 }
 
 /* Put the buffer back into the dma context */
@@ -3277,6 +3302,18 @@
 		ohci->selfid_swap = 1;
 #endif
 
+#ifndef PCI_DEVICE_ID_NVIDIA_NFORCE2_FW
+#define PCI_DEVICE_ID_NVIDIA_NFORCE2_FW 0x006e
+#endif
+
+	/* These chipsets require a bit of extra care when checking after
+	 * a busreset.  */
+	if ((dev->vendor == PCI_VENDOR_ID_APPLE &&
+	     dev->device == PCI_DEVICE_ID_APPLE_UNI_N_FW) ||
+	    (dev->vendor ==  PCI_VENDOR_ID_NVIDIA &&
+	     dev->device == PCI_DEVICE_ID_NVIDIA_NFORCE2_FW))
+		ohci->check_busreset = 1;
+
 	/* We hardwire the MMIO length, since some CardBus adaptors
 	 * fail to report the right length.  Anyway, the ohci spec
 	 * clearly says it's 2kb, so this shouldn't be a problem. */ 
@@ -3363,7 +3400,7 @@
 	 * accessing registers in the SClk domain without LPS enabled
 	 * will lock up the machine.  Wait 50msec to make sure we have
 	 * full link enabled.  */
-	reg_write(ohci, OHCI1394_HCControlSet, 0x00080000);
+	reg_write(ohci, OHCI1394_HCControlSet, OHCI1394_HCControl_LPS);
 	mdelay(50);
 
 	/* Determine the number of available IR and IT contexts. */
@@ -3489,7 +3526,7 @@
 static struct pci_device_id ohci1394_pci_tbl[] __devinitdata = {
 	{
 		.class = 	PCI_CLASS_FIREWIRE_OHCI,
-		.class_mask = 	~0,
+		.class_mask = 	PCI_ANY_ID,
 		.vendor =	PCI_ANY_ID,
 		.device =	PCI_ANY_ID,
 		.subvendor =	PCI_ANY_ID,
diff -Nru a/drivers/ieee1394/ohci1394.h b/drivers/ieee1394/ohci1394.h
--- a/drivers/ieee1394/ohci1394.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/ieee1394/ohci1394.h	Sat Apr 19 19:51:28 2003
@@ -233,6 +233,9 @@
 	unsigned int selfid_swap:1;
 	/* Some Apple chipset seem to swap incoming headers for us */
 	unsigned int no_swap_incoming:1;
+
+	/* Force extra paranoia checking on bus-reset handling */
+	unsigned int check_busreset:1;
 };
 
 static inline int cross_bound(unsigned long addr, unsigned int size)
@@ -288,6 +291,13 @@
 #define OHCI1394_VendorID                     0x040
 #define OHCI1394_HCControlSet                 0x050
 #define OHCI1394_HCControlClear               0x054
+#define  OHCI1394_HCControl_noByteSwap		0x40000000
+#define  OHCI1394_HCControl_programPhyEnable	0x00800000
+#define  OHCI1394_HCControl_aPhyEnhanceEnable	0x00400000
+#define  OHCI1394_HCControl_LPS			0x00080000
+#define  OHCI1394_HCControl_postedWriteEnable	0x00040000
+#define  OHCI1394_HCControl_linkEnable		0x00020000
+#define  OHCI1394_HCControl_softReset		0x00010000
 #define OHCI1394_SelfIDBuffer                 0x064
 #define OHCI1394_SelfIDCount                  0x068
 #define OHCI1394_IRMultiChanMaskHiSet         0x070
diff -Nru a/drivers/ieee1394/pcilynx.c b/drivers/ieee1394/pcilynx.c
--- a/drivers/ieee1394/pcilynx.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/ieee1394/pcilynx.c	Sat Apr 19 19:51:46 2003
@@ -37,6 +37,7 @@
 #include <linux/wait.h>
 #include <linux/errno.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/fs.h>
@@ -71,9 +72,9 @@
 
 
 /* Module Parameters */
-MODULE_PARM(skip_eeprom,"i");
-MODULE_PARM_DESC(skip_eeprom, "Do not try to read bus info block from serial eeprom, but user generic one (default = 0).");
 static int skip_eeprom = 0;
+module_param(skip_eeprom, int, 0444);
+MODULE_PARM_DESC(skip_eeprom, "Use generic bus info block instead of serial eeprom (default = 0).");
 
 
 static struct hpsb_host_driver lynx_driver;
@@ -983,8 +984,9 @@
  * on performance - the value 2400 was found by experiment and may not work
  * everywhere as good as here - use mem_mindma option for modules to change 
  */
-short mem_mindma = 2400;
-MODULE_PARM(mem_mindma, "h");
+static short mem_mindma = 2400;
+module_param(mem_mindma, short, 0444);
+MODULE_PARM_DESC(mem_mindma, "Minimum amount of data required to use DMA");
 
 static ssize_t mem_dmaread(struct memdata *md, u32 physbuf, ssize_t count,
                            int offset)
diff -Nru a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c
--- a/drivers/ieee1394/raw1394.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/ieee1394/raw1394.c	Sat Apr 19 19:51:27 2003
@@ -49,6 +49,7 @@
 #include "highlevel.h"
 #include "iso.h"
 #include "ieee1394_transactions.h"
+#include "ieee1394_hotplug.h"
 #include "raw1394.h"
 #include "raw1394-private.h"
 
@@ -71,8 +72,6 @@
 #define DBGMSG(fmt, args...)
 #endif
 
-static devfs_handle_t devfs_handle;
-
 static LIST_HEAD(host_info_list);
 static int host_count;
 static spinlock_t host_info_lock = SPIN_LOCK_UNLOCKED;
@@ -189,13 +188,13 @@
 }
 
 
-static void add_host(struct hpsb_host *host)
+static void add_host(struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
         struct host_info *hi;
         unsigned long flags;
 
-        hi = (struct host_info *)kmalloc(sizeof(struct host_info),
-		in_interrupt() ? SLAB_ATOMIC : SLAB_KERNEL);
+        hi = (struct host_info *)kmalloc(sizeof(struct host_info), GFP_KERNEL);
+
         if (hi != NULL) {
                 INIT_LIST_HEAD(&hi->list);
                 hi->host = host;
@@ -2474,6 +2473,40 @@
         return 0;
 }
 
+
+/*** HOTPLUG STUFF **********************************************************/
+/*
+ * Export information about protocols/devices supported by this driver.
+ */
+static struct ieee1394_device_id raw1394_id_table[] = {
+	{
+		.match_flags	= IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION,
+		.specifier_id	= AVC_UNIT_SPEC_ID_ENTRY & 0xffffff,
+		.version	= AVC_SW_VERSION_ENTRY & 0xffffff
+	},
+	{
+		.match_flags	= IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION,
+		.specifier_id	= CAMERA_UNIT_SPEC_ID_ENTRY & 0xffffff,
+		.version	= CAMERA_SW_VERSION_ENTRY & 0xffffff
+	},
+	{ }
+};
+
+MODULE_DEVICE_TABLE(ieee1394, raw1394_id_table);
+
+static struct hpsb_protocol_driver raw1394_driver = {
+	.name		= "raw1394 Driver",
+	.id_table	= raw1394_id_table,
+	.driver		= {
+		.name	= "raw1394",
+		.bus	= &ieee1394_bus_type,
+	},
+};
+
+
+/******************************************************************************/
+
+
 static struct hpsb_highlevel_ops hl_ops = {
         .add_host =    add_host,
         .remove_host = remove_host,
@@ -2501,28 +2534,30 @@
                 return -ENOMEM;
         }
 
-        devfs_handle = devfs_register(NULL,
-                                      RAW1394_DEVICE_NAME, DEVFS_FL_NONE,
-                                      IEEE1394_MAJOR,
-                                      IEEE1394_MINOR_BLOCK_RAW1394 * 16,
-                                      S_IFCHR | S_IRUSR | S_IWUSR, &file_ops,
-                                      NULL);
+        devfs_register(NULL, RAW1394_DEVICE_NAME, 0,
+			IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16,
+			S_IFCHR | S_IRUSR | S_IWUSR, &file_ops, NULL);
 
         if (ieee1394_register_chardev(IEEE1394_MINOR_BLOCK_RAW1394,
                                       THIS_MODULE, &file_ops)) {
                 HPSB_ERR("raw1394 failed to register minor device block");
-                devfs_unregister(devfs_handle);
+                devfs_remove(RAW1394_DEVICE_NAME);
                 hpsb_unregister_highlevel(hl_handle);
                 return -EBUSY;
         }
+
         printk(KERN_INFO "raw1394: /dev/%s device initialized\n", RAW1394_DEVICE_NAME);
+
+	hpsb_register_protocol(&raw1394_driver);
+
         return 0;
 }
 
 static void __exit cleanup_raw1394(void)
 {
+	hpsb_unregister_protocol(&raw1394_driver);
         ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_RAW1394);
-        devfs_unregister(devfs_handle);
+        devfs_remove(RAW1394_DEVICE_NAME);
         hpsb_unregister_highlevel(hl_handle);
 }
 
diff -Nru a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
--- a/drivers/ieee1394/sbp2.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/ieee1394/sbp2.c	Sat Apr 19 19:51:28 2003
@@ -27,44 +27,22 @@
  * driver. It also registers as a SCSI lower-level driver in order to accept
  * SCSI commands for transport using SBP-2.
  *
- * The easiest way to add/detect new SBP-2 devices is to run the shell script
- * rescan-scsi-bus.sh (or re-load the SBP-2 driver). This script may be 
- * found at:
- * http://www.garloff.de/kurt/linux/rescan-scsi-bus.sh
- *
- * As an alternative, you may manually add/remove SBP-2 devices via the procfs with
- * add-single-device <h> <b> <t> <l> or remove-single-device <h> <b> <t> <l>, where:
- *	<h> = host (starting at zero for first SCSI adapter)
- *	<b> = bus (normally zero)
- *	<t> = target (starting at zero for first SBP-2 device)
- *	<l> = lun (normally zero)
- *
- * e.g. To manually add/detect a new SBP-2 device
- *	echo "scsi add-single-device 0 0 0 0" > /proc/scsi/scsi
- *
- * e.g. To manually remove a SBP-2 device after it's been unplugged
- *	echo "scsi remove-single-device 0 0 0 0" > /proc/scsi/scsi
- *
- * e.g. To check to see which SBP-2/SCSI devices are currently registered
- * 	cat /proc/scsi/scsi
- *
- * After scanning for new SCSI devices (above), you may access any attached 
- * SBP-2 storage devices as if they were SCSI devices (e.g. mount /dev/sda1, 
- * fdisk, mkfs, etc.).
+ * You may access any attached SBP-2 storage devices as if they were SCSI
+ * devices (e.g. mount /dev/sda1,  fdisk, mkfs, etc.).
  *
  *
  * Module Load Options:
  *
- * sbp2_max_speed 		- Force max speed allowed 
- *				  (2 = 400mb, 1 = 200mb, 0 = 100mb. default = 2)
- * sbp2_serialize_io		- Serialize all I/O coming down from the scsi drivers
- *				  (0 = deserialized, 1 = serialized, default = 0)
- * sbp2_max_sectors, 		- Change max sectors per I/O supported (default = 255)
- * sbp2_exclusive_login		- Set to zero if you'd like to allow multiple hosts the ability
- *				  to log in at the same time. Sbp2 device must support this,
- *				  and you must know what you're doing (default = 1)
+ * max_speed 		- Force max speed allowed 
+ *			  (2 = 400mb, 1 = 200mb, 0 = 100mb. default = 2)
+ * serialize_io		- Serialize all I/O coming down from the scsi drivers
+ *			  (0 = deserialized, 1 = serialized, default = 0)
+ * max_sectors, 	- Change max sectors per I/O supported (default = 255)
+ * exclusive_login	- Set to zero if you'd like to allow multiple hosts the ability
+ *			  to log in at the same time. Sbp2 device must support this,
+ *			  and you must know what you're doing (default = 1)
  *
- * (e.g. insmod sbp2 sbp2_serialize_io = 1)
+ * (e.g. insmod sbp2 sbp2.serialize_io = 1)
  *
  *
  * Current Support:
@@ -258,7 +236,7 @@
  *		   * New packet dump debug define (CONFIG_IEEE1394_SBP2_PACKET_DUMP) which allows
  *		     dumping of all sbp2 related packets sent and received. Especially effective
  *		     when phys dma is disabled on ohci controller (e.g. insmod ohci1394 phys_dma=0).
- *		   * Added new sbp2 module load option (sbp2_exclusive_login) for allowing
+ *		   * Added new sbp2 module load option (exclusive_login) for allowing
  *		     non-exclusive login to sbp2 device, for special multi-host applications.
  *	04/23/02 - Fix for Sony CD-ROM drives. Only send fetch agent reset to sbp2 device if it
  *		   returns the dead bit in status. Thanks to Chandan (chandan@toad.net) for this one.
@@ -285,6 +263,7 @@
 #include <linux/fs.h>
 #include <linux/poll.h>
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/types.h>
 #include <linux/delay.h>
 #include <linux/sched.h>
@@ -319,14 +298,14 @@
 #include "sbp2.h"
 
 static char version[] __devinitdata =
-	"$Rev: 797 $ James Goodwin <jamesg@filanet.com>";
+	"$Rev: 884 $ James Goodwin <jamesg@filanet.com>";
 
 /*
  * Module load parameter definitions
  */
 
 /*
- * Change sbp2_max_speed on module load if you have a bad IEEE-1394
+ * Change max_speed on module load if you have a bad IEEE-1394
  * controller that has trouble running 2KB packets at 400mb.
  *
  * NOTE: On certain OHCI parts I have seen short packets on async transmit
@@ -334,34 +313,34 @@
  * bump down the speed if you are running into problems.
  *
  * Valid values:
- * sbp2_max_speed = 2 (default: max speed 400mb)
- * sbp2_max_speed = 1 (max speed 200mb)
- * sbp2_max_speed = 0 (max speed 100mb)
+ * max_speed = 2 (default: max speed 400mb)
+ * max_speed = 1 (max speed 200mb)
+ * max_speed = 0 (max speed 100mb)
  */
-MODULE_PARM(sbp2_max_speed,"i");
-MODULE_PARM_DESC(sbp2_max_speed, "Force max speed (2 = 400mb default, 1 = 200mb, 0 = 100mb)");
-static int sbp2_max_speed = SPEED_400;
+static int max_speed = SPEED_400;
+module_param(max_speed, int, 0644);
+MODULE_PARM_DESC(max_speed, "Force max speed (2 = 400mb default, 1 = 200mb, 0 = 100mb)");
 
 /*
- * Set sbp2_serialize_io to 1 if you'd like only one scsi command sent
+ * Set serialize_io to 1 if you'd like only one scsi command sent
  * down to us at a time (debugging). This might be necessary for very
  * badly behaved sbp2 devices.
  */
-MODULE_PARM(sbp2_serialize_io,"i");
-MODULE_PARM_DESC(sbp2_serialize_io, "Serialize all I/O coming down from the scsi drivers (default = 0)");
-static int sbp2_serialize_io = 0;	/* serialize I/O - available for debugging purposes */
+static int serialize_io = 0;
+module_param(serialize_io, int, 0444);
+MODULE_PARM_DESC(serialize_io, "Serialize all I/O coming down from the scsi drivers (default = 0)");
 
 /*
- * Bump up sbp2_max_sectors if you'd like to support very large sized
+ * Bump up max_sectors if you'd like to support very large sized
  * transfers. Please note that some older sbp2 bridge chips are broken for
  * transfers greater or equal to 128KB.  Default is a value of 255
  * sectors, or just under 128KB (at 512 byte sector size). I can note that
  * the Oxsemi sbp2 chipsets have no problems supporting very large
  * transfer sizes.
  */
-MODULE_PARM(sbp2_max_sectors,"i");
-MODULE_PARM_DESC(sbp2_max_sectors, "Change max sectors per I/O supported (default = 255)");
-static int sbp2_max_sectors = SBP2_MAX_SECTORS;
+static int max_sectors = SBP2_MAX_SECTORS;
+module_param(max_sectors, int, 0444);
+MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported (default = 255)");
 
 /*
  * Exclusive login to sbp2 device? In most cases, the sbp2 driver should
@@ -370,13 +349,13 @@
  * etc.). If you're running an sbp2 device that supports multiple logins,
  * and you're either running read-only filesystems or some sort of special
  * filesystem supporting multiple hosts (one such filesystem is OpenGFS,
- * see opengfs.sourceforge.net for more info), then set sbp2_exclusive_login
+ * see opengfs.sourceforge.net for more info), then set exclusive_login
  * to zero. Note: The Oxsemi OXFW911 sbp2 chipset supports up to four
  * concurrent logins.
  */
-MODULE_PARM(sbp2_exclusive_login,"i");
-MODULE_PARM_DESC(sbp2_exclusive_login, "Exclusive login to sbp2 device (default = 1)");
-static int sbp2_exclusive_login = 1;
+static int exclusive_login = 1;
+module_param(exclusive_login, int, 0644);
+MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device (default = 1)");
 
 /*
  * SCSI inquiry hack for really badly behaved sbp2 devices. Turn this on
@@ -384,13 +363,13 @@
  * This hack makes the inquiry look more like a typical MS Windows
  * inquiry.
  * 
- * If sbp2_force_inquiry_hack=1 is required for your device to work,
+ * If force_inquiry_hack=1 is required for your device to work,
  * please submit the logged sbp2_firmware_revision value of this device to
  * the linux1394-devel mailing list.
  */
-MODULE_PARM(sbp2_force_inquiry_hack,"i");
-MODULE_PARM_DESC(sbp2_force_inquiry_hack, "Force SCSI inquiry hack (default = 0)");
-static int sbp2_force_inquiry_hack = 0;
+static int force_inquiry_hack = 0;
+module_param(force_inquiry_hack, int, 0444);
+MODULE_PARM_DESC(force_inquiry_hack, "Force SCSI inquiry hack (default = 0)");
 
 
 /*
@@ -466,12 +445,10 @@
  * Globals
  */
 
-static void sbp2scsi_complete_all_commands(struct sbp2scsi_host_info *hi,
-					   struct scsi_id_instance_data *scsi_id,
+static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id,
 					   u32 status);
 
-static void sbp2scsi_complete_command(struct sbp2scsi_host_info *hi,
-				      struct scsi_id_instance_data *scsi_id,
+static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
 				      u32 scsi_status, Scsi_Cmnd *SCpnt,
 				      void (*done)(Scsi_Cmnd *));
 	
@@ -479,14 +456,9 @@
 
 static u8 sbp2_speedto_maxrec[] = { 0x7, 0x8, 0x9 };
 
-static LIST_HEAD(sbp2_host_info_list);
-
-static spinlock_t sbp2_host_info_lock = SPIN_LOCK_UNLOCKED;
-
 static struct hpsb_highlevel *sbp2_hl_handle = NULL;
 
 static struct hpsb_highlevel_ops sbp2_hl_ops = {
-	.add_host =	sbp2_add_host,
 	.remove_host =	sbp2_remove_host,
 };
 
@@ -502,13 +474,18 @@
 #endif
 
 static struct hpsb_protocol_driver sbp2_driver = {
-	.name =		"SBP2 Driver",
-	.id_table = 	sbp2_id_table,
-	.probe = 	sbp2_probe,
-	.disconnect = 	sbp2_disconnect,
-	.update = 	sbp2_update
+	.name		= "SBP2 Driver",
+	.id_table	= sbp2_id_table,
+	.update		= sbp2_update,
+	.driver		= {
+		.name		= SBP2_DEVICE_NAME,
+		.bus		= &ieee1394_bus_type,
+		.probe		= sbp2_probe,
+		.remove		= sbp2_remove,
+	},
 };
 
+
 /* List of device firmware's that require a forced 36 byte inquiry.  */
 static u32 sbp2_broken_inquiry_list[] = {
 	0x00002800,	/* Stefan Richter <richtest@bauwesen.tu-cottbus.de> */
@@ -648,19 +625,19 @@
  * This function is called to create a pool of command orbs used for
  * command processing. It is called when a new sbp2 device is detected.
  */
-static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id,
-					    struct sbp2scsi_host_info *hi)
+static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id)
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	int i;
 	unsigned long flags, orbs;
 	struct sbp2_command_info *command;
 
-	orbs = sbp2_serialize_io ? 2 : SBP2_MAX_COMMAND_ORBS;
+	orbs = serialize_io ? 2 : SBP2_MAX_COMMAND_ORBS;
         
 	spin_lock_irqsave(&scsi_id->sbp2_command_orb_lock, flags);
 	for (i = 0; i < orbs; i++) {
 		command = (struct sbp2_command_info *)
-		    kmalloc(sizeof(struct sbp2_command_info), GFP_KERNEL);
+		    kmalloc(sizeof(struct sbp2_command_info), GFP_ATOMIC);
 		if (!command) {
 			spin_unlock_irqrestore(&scsi_id->sbp2_command_orb_lock, flags);
 			return(-ENOMEM);
@@ -686,9 +663,9 @@
 /*
  * This function is called to delete a pool of command orbs.
  */
-static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id,
-					     struct sbp2scsi_host_info *hi)
+static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id)
 {
+	struct hpsb_host *host = scsi_id->hi->host;
 	struct list_head *lh, *next;
 	struct sbp2_command_info *command;
 	unsigned long flags;
@@ -699,11 +676,11 @@
 			command = list_entry(lh, struct sbp2_command_info, list);
 
 			/* Release our generic DMA's */
-			pci_unmap_single(hi->host->pdev, command->command_orb_dma,
+			pci_unmap_single(host->pdev, command->command_orb_dma,
 					 sizeof(struct sbp2_command_orb),
 					 PCI_DMA_BIDIRECTIONAL);
 			SBP2_DMA_FREE("single command orb DMA");
-			pci_unmap_single(hi->host->pdev, command->sge_dma,
+			pci_unmap_single(host->pdev, command->sge_dma,
 					 sizeof(command->scatter_gather_element),
 					 PCI_DMA_BIDIRECTIONAL);
 			SBP2_DMA_FREE("scatter_gather_element");
@@ -773,8 +750,7 @@
 static struct sbp2_command_info *sbp2util_allocate_command_orb(
 		struct scsi_id_instance_data *scsi_id, 
 		Scsi_Cmnd *Current_SCpnt, 
-		void (*Current_done)(Scsi_Cmnd *),
-		struct sbp2scsi_host_info *hi)
+		void (*Current_done)(Scsi_Cmnd *))
 {
 	struct list_head *lh;
 	struct sbp2_command_info *command = NULL;
@@ -799,10 +775,9 @@
 static void sbp2util_free_command_dma(struct sbp2_command_info *command)
 {
 	struct sbp2scsi_host_info *hi;
-	
-	hi = (struct sbp2scsi_host_info *)&command->Current_SCpnt->device->host->hostdata;
 
-	if (hi == NULL) {
+	hi = hpsb_get_hostinfo_bykey(sbp2_hl_handle, (unsigned long)command->Current_SCpnt->device->host);
+	if (!hi) {
 		printk(KERN_ERR "%s: hi == NULL\n", __FUNCTION__);
 		return;
 	}
@@ -849,158 +824,129 @@
  * IEEE-1394 core driver stack related section
  *********************************************/
 
-static int sbp2_probe(struct unit_directory *ud)
+static int sbp2_probe(struct device *dev)
 {
+	struct unit_directory *ud;
 	struct sbp2scsi_host_info *hi;
 
-	SBP2_DEBUG("sbp2_probe");
-	hi = sbp2_find_host_info(ud->ne->host);
+	SBP2_DEBUG(__FUNCTION__);
+
+	ud = container_of(dev, struct unit_directory, device);
+
+	/* This will only add it if it doesn't exist */
+	hi = sbp2_add_host(ud->ne->host);
+
+	if (!hi)
+		return -ENODEV;
 
 	return sbp2_start_device(hi, ud);
 }
 
-static void sbp2_disconnect(struct unit_directory *ud)
+static int sbp2_remove(struct device *dev)
 {
-	struct sbp2scsi_host_info *hi;
-	struct scsi_id_instance_data *scsi_id = ud->driver_data;
+	struct unit_directory *ud;
+	struct scsi_id_instance_data *scsi_id;
+
+	SBP2_DEBUG(__FUNCTION__);
 
-	SBP2_DEBUG("sbp2_disconnect");
-	hi = sbp2_find_host_info(ud->ne->host);
+	ud = container_of(dev, struct unit_directory, device);
+	scsi_id = ud->device.driver_data;
+	ud->device.driver_data = NULL;
 
-	if (hi != NULL) {
-		sbp2_logout_device(hi, scsi_id);
- 		sbp2_remove_device(hi, scsi_id);
+	if (scsi_id != NULL) {
+		sbp2_logout_device(scsi_id);
+ 		sbp2_remove_device(scsi_id);
 	}
+
+	return 0;
 }
 
 static void sbp2_update(struct unit_directory *ud)
 {
-	struct sbp2scsi_host_info *hi;
-	struct scsi_id_instance_data *scsi_id = ud->driver_data;
+	struct scsi_id_instance_data *scsi_id = ud->device.driver_data;
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	unsigned long flags;
 
 	SBP2_DEBUG("sbp2_update");
-	hi = sbp2_find_host_info(ud->ne->host);
 
-	if (sbp2_reconnect_device(hi, scsi_id)) {
+	if (sbp2_reconnect_device(scsi_id)) {
 		
 		/* 
 		 * Ok, reconnect has failed. Perhaps we didn't
 		 * reconnect fast enough. Try doing a regular login.
 		 */
-		if (sbp2_login_device(hi, scsi_id)) {
-
+		if (sbp2_login_device(scsi_id)) {
 			/* Login failed too, just remove the device. */
 			SBP2_ERR("sbp2_reconnect_device failed!");
-			sbp2_remove_device(hi, scsi_id);
-			hpsb_release_unit_directory(ud);
+			sbp2_remove_device(scsi_id);
 			return;
 		}
 	}
 
 	/* Set max retries to something large on the device. */
-	sbp2_set_busy_timeout(hi, scsi_id);
+	sbp2_set_busy_timeout(scsi_id);
 
 	/* Do a SBP-2 fetch agent reset. */
-	sbp2_agent_reset(hi, scsi_id, 1);
+	sbp2_agent_reset(scsi_id, 1);
 	
 	/* Get the max speed and packet size that we can use. */
-	sbp2_max_speed_and_size(hi, scsi_id);
+	sbp2_max_speed_and_size(scsi_id);
 
 	/* Complete any pending commands with busy (so they get
 	 * retried) and remove them from our queue
 	 */
 	spin_lock_irqsave(&hi->sbp2_command_lock, flags);
-	sbp2scsi_complete_all_commands(hi, scsi_id, DID_BUS_BUSY);
+	sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY);
 	spin_unlock_irqrestore(&hi->sbp2_command_lock, flags);
 }
 
-/*
- * This function is called after registering our operations in sbp2_init.
- * We go ahead and allocate some memory for our host info structure, and
- * init some structures.
- */
-static void sbp2_add_host(struct hpsb_host *host)
+/* This functions is called by the sbp2_probe, for each new device. If the
+ * host_info already exists, it will return it. If not, it allocated a new
+ * host_info entry and a corresponding scsi_host. */
+static struct sbp2scsi_host_info *sbp2_add_host(struct hpsb_host *host)
 {
 	struct sbp2scsi_host_info *hi;
-	unsigned long flags;
 	struct Scsi_Host *scsi_host;
 
 	SBP2_DEBUG("sbp2_add_host");
 
+	hi = hpsb_get_hostinfo(sbp2_hl_handle, host);
+	if (hi)
+		return hi;
+
 	/* Register our host with the SCSI stack. */
-	scsi_host = scsi_register (&scsi_driver_template, sizeof(struct sbp2scsi_host_info));
+	scsi_host = scsi_register (&scsi_driver_template, 0);
 	if (!scsi_host) {
 		SBP2_ERR("failed to register scsi host");
-		return;
+		return NULL;
+	}
+
+	hi = hpsb_create_hostinfo(sbp2_hl_handle, host, sizeof(*hi));
+	if (!hi) {
+		SBP2_ERR("failed to allocate hostinfo");
+		scsi_unregister(hi->scsi_host);
 	}
 
-	hi = (struct sbp2scsi_host_info *)&scsi_host->hostdata;
-	memset(hi, 0, sizeof(struct sbp2scsi_host_info));
+	hpsb_set_hostinfo_key(sbp2_hl_handle, host, (unsigned long)scsi_host);
 
 	hi->scsi_host = scsi_host;
-	INIT_LIST_HEAD(&hi->list);
 	hi->host = host;
 	hi->sbp2_command_lock = SPIN_LOCK_UNLOCKED;
 	hi->scsi_host->max_id = SBP2SCSI_MAX_SCSI_IDS;
 
-	spin_lock_irqsave(&sbp2_host_info_lock, flags);
-	list_add_tail(&hi->list, &sbp2_host_info_list);
-	spin_unlock_irqrestore(&sbp2_host_info_lock, flags);
-
-	/*
-	 * XXX(hch): Hopefully the ieee1394 code will be converted
-	 * to the driver model at some point.  Until that happens
-	 * we'll have to pass in NULL here.
-	 */
+	/* XXX We need a device to pass here as the scsi-host class. Can't
+	 * use the PCI device, since it is already bound to the ieee1394
+	 * host. Can't use the fw-host device since it is multi-class
+	 * enabled (scsi-host uses classdata member of the device). */
 	if (scsi_add_host(hi->scsi_host, NULL)) {
 		SBP2_ERR("failed to add scsi host");
-
-		spin_lock_irqsave(&sbp2_host_info_lock, flags);
-		list_del(&hi->list);
-		spin_unlock_irqrestore(&sbp2_host_info_lock, flags);
-
 		scsi_unregister(hi->scsi_host);
+		hpsb_destroy_hostinfo(sbp2_hl_handle, host);
 	}
 
-	return;
+	return hi;
 }
 
-/*
- * This fuction returns a host info structure from the host structure, in
- * case we have multiple hosts.
- */
-static struct sbp2scsi_host_info *sbp2_find_host_info(struct hpsb_host *host)
-{
-	struct list_head *lh;
-	struct sbp2scsi_host_info *hi;
-
-	list_for_each (lh, &sbp2_host_info_list) {
-		hi = list_entry(lh, struct sbp2scsi_host_info, list);
-		if (hi->host == host)
-			return hi;
-	}
-
-	return NULL;
-}
-
-/*
- * This function returns a host info structure for a given Scsi_Host
- * struct.
- */
-static struct sbp2scsi_host_info *sbp2_find_host_info_scsi(struct Scsi_Host *host)
-{
-	struct list_head *lh;
-	struct sbp2scsi_host_info *hi;
-
-	list_for_each (lh, &sbp2_host_info_list) {
-		hi = list_entry(lh, struct sbp2scsi_host_info, list);
-		if (hi->scsi_host == host)
-			return hi;
-	}
-
-	return NULL;
-}
 
 /*
  * This function is called when a host is removed.
@@ -1008,20 +954,16 @@
 static void sbp2_remove_host(struct hpsb_host *host)
 {
 	struct sbp2scsi_host_info *hi;
-	unsigned long flags;
 
 	SBP2_DEBUG("sbp2_remove_host");
 
-	spin_lock_irqsave(&sbp2_host_info_lock, flags);
-	hi = sbp2_find_host_info(host);
-	if (hi)
-		list_del(&hi->list);
-	spin_unlock_irqrestore(&sbp2_host_info_lock, flags);
+	hi = hpsb_get_hostinfo(sbp2_hl_handle, host);
 
 	if (hi) {
 		scsi_remove_host(hi->scsi_host);
 		scsi_unregister(hi->scsi_host);
-	}
+	} else
+		SBP2_ERR("attempt to remove unknown host %p", host);
 }
 
 /*
@@ -1048,6 +990,8 @@
 		goto alloc_fail_first;
 	memset(scsi_id, 0, sizeof(struct scsi_id_instance_data));
 
+	scsi_id->hi = hi;
+
 	/* Login FIFO DMA */
 	scsi_id->login_response =
 		pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_login_response),
@@ -1056,6 +1000,22 @@
 		goto alloc_fail;
 	SBP2_DMA_ALLOC("consistent DMA region for login FIFO");
 
+	/* Query logins ORB DMA */
+	scsi_id->query_logins_orb =
+		pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_orb),
+				     &scsi_id->query_logins_orb_dma);
+	if (!scsi_id->query_logins_orb)
+		goto alloc_fail;
+	SBP2_DMA_ALLOC("consistent DMA region for query logins ORB");
+
+	/* Query logins response DMA */
+	scsi_id->query_logins_response =
+		pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_query_logins_response),
+				     &scsi_id->query_logins_response_dma);
+	if (!scsi_id->query_logins_response)
+		goto alloc_fail;
+	SBP2_DMA_ALLOC("consistent DMA region for query logins response");
+
 	/* Reconnect ORB DMA */
 	scsi_id->reconnect_orb =
 		pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_reconnect_orb),
@@ -1076,8 +1036,24 @@
 	scsi_id->login_orb =
 		pci_alloc_consistent(hi->host->pdev, sizeof(struct sbp2_login_orb),
 				     &scsi_id->login_orb_dma);
-	if (scsi_id->login_orb == NULL) {
+	if (!scsi_id->login_orb) {
 alloc_fail:
+		if (scsi_id->query_logins_response) {
+			pci_free_consistent(hi->host->pdev,
+					    sizeof(struct sbp2_query_logins_response),
+					    scsi_id->query_logins_response,
+					    scsi_id->query_logins_response_dma);
+			SBP2_DMA_FREE("query logins response DMA");
+		}
+
+		if (scsi_id->query_logins_orb) {
+			pci_free_consistent(hi->host->pdev,
+					    sizeof(struct sbp2_query_logins_orb),
+					    scsi_id->query_logins_orb,
+					    scsi_id->query_logins_orb_dma);
+			SBP2_DMA_FREE("query logins ORB DMA");
+		}
+	
 		if (scsi_id->logout_orb) {
 			pci_free_consistent(hi->host->pdev,
 					sizeof(struct sbp2_logout_orb),
@@ -1105,7 +1081,8 @@
 		kfree(scsi_id);
 alloc_fail_first:
 		SBP2_ERR ("Could not allocate memory for scsi_id");
-		return(-ENOMEM);
+
+		return -ENOMEM;
 	}
 	SBP2_DMA_ALLOC("consistent DMA region for login ORB");
 
@@ -1116,7 +1093,7 @@
 	scsi_id->ud = ud;
 	scsi_id->speed_code = SPEED_100;
 	scsi_id->max_payload_size = sbp2_speedto_maxrec[SPEED_100];
-	ud->driver_data = scsi_id;
+	ud->device.driver_data = scsi_id;
 
 	atomic_set(&scsi_id->sbp2_login_complete, 0);
 
@@ -1149,9 +1126,9 @@
 	/*
 	 * Create our command orb pool
 	 */
-	if (sbp2util_create_command_orb_pool(scsi_id, hi)) {
+	if (sbp2util_create_command_orb_pool(scsi_id)) {
 		SBP2_ERR("sbp2util_create_command_orb_pool failed!");
-		sbp2_remove_device(hi, scsi_id);
+		sbp2_remove_device(scsi_id);
 		return -ENOMEM;
 	}
 
@@ -1160,35 +1137,33 @@
 	 */
 	if (i == hi->scsi_host->max_id) {
 		SBP2_ERR("No slots left for SBP-2 device");
-		sbp2_remove_device(hi, scsi_id);
+		sbp2_remove_device(scsi_id);
 		return -EBUSY;
 	}
 
 	/*
 	 * Login to the sbp-2 device
 	 */
-	if (sbp2_login_device(hi, scsi_id)) {
-
+	if (sbp2_login_device(scsi_id)) {
 		/* Login failed, just remove the device. */
-		SBP2_ERR("sbp2_login_device failed");
-		sbp2_remove_device(hi, scsi_id);
+		sbp2_remove_device(scsi_id);
 		return -EBUSY;
 	}
 
 	/*
 	 * Set max retries to something large on the device
 	 */
-	sbp2_set_busy_timeout(hi, scsi_id);
+	sbp2_set_busy_timeout(scsi_id);
 	
 	/*
 	 * Do a SBP-2 fetch agent reset
 	 */
-	sbp2_agent_reset(hi, scsi_id, 1);
+	sbp2_agent_reset(scsi_id, 1);
 	
 	/*
 	 * Get the max speed and packet size that we can use
 	 */
-	sbp2_max_speed_and_size(hi, scsi_id);
+	sbp2_max_speed_and_size(scsi_id);
 
 	/* Add this device to the scsi layer now */
 	sdev = scsi_add_device(hi->scsi_host, 0, scsi_id->id, 0);
@@ -1203,21 +1178,21 @@
 /*
  * This function removes an sbp2 device from the sbp2scsi_host_info struct.
  */
-static void sbp2_remove_device(struct sbp2scsi_host_info *hi, 
-			       struct scsi_id_instance_data *scsi_id)
+static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id)
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	struct scsi_device *sdev = scsi_find_device(hi->scsi_host, 0, scsi_id->id, 0);
 
 	SBP2_DEBUG("sbp2_remove_device");
 
 	/* Complete any pending commands with selection timeout */
-	sbp2scsi_complete_all_commands(hi, scsi_id, DID_NO_CONNECT);
+	sbp2scsi_complete_all_commands(scsi_id, DID_NO_CONNECT);
 
 	/* Remove it from the scsi layer now */
-	if (scsi_remove_device(sdev))
+	if (sdev && scsi_remove_device(sdev))
 		SBP2_ERR("scsi_remove_device failed");
 
-	sbp2util_remove_command_orb_pool(scsi_id, hi);
+	sbp2util_remove_command_orb_pool(scsi_id);
 
 	hi->scsi_id[scsi_id->id] = NULL;
 
@@ -1249,10 +1224,26 @@
 		pci_free_consistent(hi->host->pdev,
 				    sizeof(struct sbp2_logout_orb),
 				    scsi_id->logout_orb,
-				    scsi_id->reconnect_orb_dma);
+				    scsi_id->logout_orb_dma);
 		SBP2_DMA_FREE("single logout orb");
 	}
 
+	if (scsi_id->query_logins_orb) {
+		pci_free_consistent(hi->host->pdev,
+				    sizeof(struct sbp2_query_logins_orb),
+				    scsi_id->query_logins_orb,
+				    scsi_id->query_logins_orb_dma);
+		SBP2_DMA_FREE("single query logins orb");
+	}
+
+	if (scsi_id->query_logins_response) {
+		pci_free_consistent(hi->host->pdev,
+				    sizeof(struct sbp2_query_logins_response),
+				    scsi_id->query_logins_response,
+				    scsi_id->query_logins_response_dma);
+		SBP2_DMA_FREE("single query logins data");
+	}
+
 	SBP2_DEBUG("SBP-2 device removed, SCSI ID = %d", scsi_id->id);
 
 	kfree(scsi_id);
@@ -1308,11 +1299,109 @@
 }
 
 /*
+ * This function queries the device for the maximum concurrent logins it
+ * supports.
+ */
+static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id)
+{
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
+	quadlet_t data[2];
+	int max_logins;
+	int active_logins;
+
+	SBP2_DEBUG("sbp2_query_logins");
+
+	scsi_id->query_logins_orb->reserved1 = 0x0;
+	scsi_id->query_logins_orb->reserved2 = 0x0;
+
+	scsi_id->query_logins_orb->query_response_lo = scsi_id->query_logins_response_dma;
+	scsi_id->query_logins_orb->query_response_hi = ORB_SET_NODE_ID(hi->host->node_id);
+	SBP2_DEBUG("sbp2_query_logins: query_response_hi/lo initialized");
+
+	scsi_id->query_logins_orb->lun_misc = ORB_SET_FUNCTION(QUERY_LOGINS_REQUEST);
+	scsi_id->query_logins_orb->lun_misc |= ORB_SET_NOTIFY(1);
+	if (scsi_id->sbp2_device_type_and_lun != SBP2_DEVICE_TYPE_LUN_UNINITIALIZED) {
+		scsi_id->query_logins_orb->lun_misc |= ORB_SET_LUN(scsi_id->sbp2_device_type_and_lun);
+	}
+	SBP2_DEBUG("sbp2_query_logins: lun_misc initialized");
+
+	scsi_id->query_logins_orb->reserved_resp_length =
+		ORB_SET_QUERY_LOGINS_RESP_LENGTH(sizeof(struct sbp2_query_logins_response));
+	SBP2_DEBUG("sbp2_query_logins: reserved_resp_length initialized");
+
+	scsi_id->query_logins_orb->status_FIFO_lo = SBP2_STATUS_FIFO_ADDRESS_LO +
+						    SBP2_STATUS_FIFO_ENTRY_TO_OFFSET(scsi_id->id);
+	scsi_id->query_logins_orb->status_FIFO_hi = (ORB_SET_NODE_ID(hi->host->node_id) |
+						     SBP2_STATUS_FIFO_ADDRESS_HI);
+	SBP2_DEBUG("sbp2_query_logins: status FIFO initialized");
+
+	sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_orb, sizeof(struct sbp2_query_logins_orb));
+
+	SBP2_DEBUG("sbp2_query_logins: orb byte-swapped");
+
+	sbp2util_packet_dump(scsi_id->query_logins_orb, sizeof(stuct sbp2_query_logins_orb),
+			     "sbp2 query logins orb", scsi_id->query_logins_orb_dma);
+
+	memset(scsi_id->query_logins_response, 0, sizeof(struct sbp2_query_logins_response));
+	memset(&scsi_id->status_block, 0, sizeof(struct sbp2_status_block));
+
+	SBP2_DEBUG("sbp2_query_logins: query_logins_response/status FIFO memset");
+
+	data[0] = ORB_SET_NODE_ID(hi->host->node_id);
+	data[1] = scsi_id->query_logins_orb_dma;
+	sbp2util_cpu_to_be32_buffer(data, 8);
+
+	atomic_set(&scsi_id->sbp2_login_complete, 0);
+
+	SBP2_DEBUG("sbp2_query_logins: prepared to write");
+	hpsb_node_write(scsi_id->ne, scsi_id->sbp2_management_agent_addr, data, 8);
+	SBP2_DEBUG("sbp2_query_logins: written");
+
+	if (sbp2util_down_timeout(&scsi_id->sbp2_login_complete, 2*HZ)) {
+		SBP2_ERR("Error querying logins to SBP-2 device - timed out");
+		return(-EIO);
+	}
+
+	if (scsi_id->status_block.ORB_offset_lo != scsi_id->query_logins_orb_dma) {
+		SBP2_ERR("Error querying logins to SBP-2 device - timed out");
+		return(-EIO);
+	}
+
+	if (STATUS_GET_RESP(scsi_id->status_block.ORB_offset_hi_misc) ||
+	    STATUS_GET_DEAD_BIT(scsi_id->status_block.ORB_offset_hi_misc) ||
+	    STATUS_GET_SBP_STATUS(scsi_id->status_block.ORB_offset_hi_misc)) {
+
+		SBP2_ERR("Error querying logins to SBP-2 device - timed out");
+		return(-EIO);
+	}
+
+	sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_response, sizeof(struct sbp2_query_logins_response));
+
+	SBP2_DEBUG("length_max_logins = %x",
+		   (unsigned int)scsi_id->query_logins_response->length_max_logins);
+
+	SBP2_INFO("Query logins to SBP-2 device successful");
+
+	max_logins = RESPONSE_GET_MAX_LOGINS(scsi_id->query_logins_response->length_max_logins);
+	SBP2_INFO("Maximum concurrent logins supported: %d", max_logins);
+                                                                                
+	active_logins = RESPONSE_GET_ACTIVE_LOGINS(scsi_id->query_logins_response->length_max_logins);
+	SBP2_INFO("Number of active logins: %d", active_logins);
+                                                                                
+	if (active_logins >= max_logins) {
+		return(-EIO);
+	}
+                                                                                
+	return 0;
+}
+
+/*
  * This function is called in order to login to a particular SBP-2 device,
  * after a bus reset.
  */
-static int sbp2_login_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id) 
+static int sbp2_login_device(struct scsi_id_instance_data *scsi_id) 
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	quadlet_t data[2];
 
 	SBP2_DEBUG("sbp2_login_device");
@@ -1322,6 +1411,13 @@
 		return(-EIO);
 	}
 
+	if (!exclusive_login) {
+		if (sbp2_query_logins(scsi_id)) {
+			SBP2_ERR("Device does not support any more concurrent logins");
+			return(-EIO);
+		}
+	}
+
 	/* Set-up login ORB, assume no password */
 	scsi_id->login_orb->password_hi = 0; 
 	scsi_id->login_orb->password_lo = 0;
@@ -1333,7 +1429,7 @@
 
 	scsi_id->login_orb->lun_misc = ORB_SET_FUNCTION(LOGIN_REQUEST);
 	scsi_id->login_orb->lun_misc |= ORB_SET_RECONNECT(0);	/* One second reconnect time */
-	scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(sbp2_exclusive_login);	/* Exclusive access to device */
+	scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(exclusive_login);	/* Exclusive access to device */
 	scsi_id->login_orb->lun_misc |= ORB_SET_NOTIFY(1);	/* Notify us of login complete */
 	/* Set the lun if we were able to pull it from the device's unit directory */
 	if (scsi_id->sbp2_device_type_and_lun != SBP2_DEVICE_TYPE_LUN_UNINITIALIZED) {
@@ -1438,8 +1534,9 @@
  * This function is called in order to logout from a particular SBP-2
  * device, usually called during driver unload.
  */
-static int sbp2_logout_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id) 
+static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id) 
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	quadlet_t data[2];
 
 	SBP2_DEBUG("sbp2_logout_device");
@@ -1496,8 +1593,9 @@
  * This function is called in order to reconnect to a particular SBP-2
  * device, after a bus reset.
  */
-static int sbp2_reconnect_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id) 
+static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id) 
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	quadlet_t data[2];
 
 	SBP2_DEBUG("sbp2_reconnect_device");
@@ -1584,8 +1682,8 @@
  * This function is called in order to set the busy timeout (number of
  * retries to attempt) on the sbp2 device. 
  */
-static int sbp2_set_busy_timeout(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id)
-{      
+static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id)
+{
 	quadlet_t data;
 
 	SBP2_DEBUG("sbp2_set_busy_timeout");
@@ -1625,7 +1723,7 @@
 	ud = scsi_id->ud;
 
 	/* Handle different fields in the unit directory, based on keys */
-	for (i = 0; i < ud->count; i++) {
+	for (i = 0; i < ud->length; i++) {
 		switch (CONFIG_ROM_KEY(ud->quadlets[i])) {
 		case SBP2_CSR_OFFSET_KEY:
 			/* Save off the management agent address */
@@ -1679,7 +1777,7 @@
 			/* Firmware revision */
 			scsi_id->sbp2_firmware_revision
 				= CONFIG_ROM_VALUE(ud->quadlets[i]);
-			if (sbp2_force_inquiry_hack)
+			if (force_inquiry_hack)
 				SBP2_INFO("sbp2_firmware_revision = %x",
 				   (unsigned int) scsi_id->sbp2_firmware_revision);
 			else	SBP2_DEBUG("sbp2_firmware_revision = %x",
@@ -1697,20 +1795,20 @@
 
 	/* If the vendor id is 0xa0b8 (Symbios vendor id), then we have a
 	 * bridge with 128KB max transfer size limitation. For sanity, we
-	 * only voice this when the current sbp2_max_sectors setting
+	 * only voice this when the current max_sectors setting
 	 * exceeds the 128k limit. By default, that is not the case.
 	 *
 	 * It would be really nice if we could detect this before the scsi
 	 * host gets initialized. That way we can down-force the
-	 * sbp2_max_sectors to account for it. That is not currently
+	 * max_sectors to account for it. That is not currently
 	 * possible.  */
 	if ((scsi_id->sbp2_firmware_revision & 0xffff00) ==
 			SBP2_128KB_BROKEN_FIRMWARE &&
-			(sbp2_max_sectors * 512) > (128*1024)) {
+			(max_sectors * 512) > (128*1024)) {
 		SBP2_WARN("Node " NODE_BUS_FMT ": Bridge only supports 128KB max transfer size.",
 				NODE_BUS_ARGS(scsi_id->ne->nodeid));
-		SBP2_WARN("WARNING: Current sbp2_max_sectors setting is larger than 128KB (%d sectors)!",
-				sbp2_max_sectors);
+		SBP2_WARN("WARNING: Current max_sectors setting is larger than 128KB (%d sectors)!",
+				max_sectors);
 		scsi_id->workarounds |= SBP2_BREAKAGE_128K_MAX_TRANSFER;
 	}
 
@@ -1737,8 +1835,10 @@
  * the speed that it needs to use, and the max_rec the host supports, and
  * it takes care of the rest.
  */
-static int sbp2_max_speed_and_size(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id)
+static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id)
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
+
 	SBP2_DEBUG("sbp2_max_speed_and_size");
 
 	/* Initial setting comes from the hosts speed map */
@@ -1746,8 +1846,8 @@
 						  + NODEID_TO_NODE(scsi_id->ne->nodeid)];
 
 	/* Bump down our speed if the user requested it */
-	if (scsi_id->speed_code > sbp2_max_speed) {
-		scsi_id->speed_code = sbp2_max_speed;
+	if (scsi_id->speed_code > max_speed) {
+		scsi_id->speed_code = max_speed;
 		SBP2_ERR("Forcing SBP-2 max speed down to %s",
 			 hpsb_speedto_str[scsi_id->speed_code]);
 	}
@@ -1767,8 +1867,9 @@
 /*
  * This function is called in order to perform a SBP-2 agent reset. 
  */
-static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, int wait) 
+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;
 	
@@ -1811,8 +1912,7 @@
  * This function is called to create the actual command orb and s/g list
  * out of the scsi command itself.
  */
-static int sbp2_create_command_orb(struct sbp2scsi_host_info *hi, 
-				   struct scsi_id_instance_data *scsi_id,
+static int sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id,
 				   struct sbp2_command_info *command,
 				   unchar *scsi_cmd,
 				   unsigned int scsi_use_sg,
@@ -1820,6 +1920,7 @@
 				   void *scsi_request_buffer, 
 				   unsigned char scsi_dir)
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	struct scatterlist *sgpnt = (struct scatterlist *) scsi_request_buffer;
 	struct sbp2_command_orb *command_orb = &command->command_orb;
 	struct sbp2_unrestricted_page_table *scatter_gather_element =
@@ -2062,9 +2163,10 @@
 /*
  * This function is called in order to begin a regular SBP-2 command. 
  */
-static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
+static int sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id,
 				 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;
 
@@ -2166,7 +2268,7 @@
 /*
  * This function is called in order to begin a regular SBP-2 command. 
  */
-static int sbp2_send_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
+static int sbp2_send_command(struct scsi_id_instance_data *scsi_id,
 			     Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
 {
 	unchar *cmd = (unchar *) SCpnt->cmnd;
@@ -2184,7 +2286,7 @@
 	/*
 	 * Allocate a command orb and s/g structure
 	 */
-	command = sbp2util_allocate_command_orb(scsi_id, SCpnt, done, hi);
+	command = sbp2util_allocate_command_orb(scsi_id, SCpnt, done);
 	if (!command) {
 		return(-EIO);
 	}
@@ -2195,7 +2297,7 @@
 	 * reject this inquiry command. Fix the request_bufflen. 
 	 */
 	if (*cmd == INQUIRY) {
-		if (sbp2_force_inquiry_hack || scsi_id->workarounds & SBP2_BREAKAGE_INQUIRY_HACK)
+		if (force_inquiry_hack || scsi_id->workarounds & SBP2_BREAKAGE_INQUIRY_HACK)
 			request_bufflen = cmd[4] = 0x24;
 		else
 			request_bufflen = cmd[4];
@@ -2204,7 +2306,7 @@
 	/*
 	 * Now actually fill in the comamnd orb and sbp2 s/g list
 	 */
-	sbp2_create_command_orb(hi, scsi_id, command, cmd, SCpnt->use_sg,
+	sbp2_create_command_orb(scsi_id, command, cmd, SCpnt->use_sg,
 				request_bufflen, SCpnt->request_buffer,
 				SCpnt->sc_data_direction); 
 	/*
@@ -2224,7 +2326,7 @@
 	/*
 	 * Link up the orb, and ring the doorbell if needed
 	 */
-	sbp2_link_orb_command(hi, scsi_id, command);
+	sbp2_link_orb_command(scsi_id, command);
 	
 	return(0);
 }
@@ -2463,9 +2565,7 @@
 		return(RCODE_ADDRESS_ERROR);
 	}
 
-	spin_lock_irqsave(&sbp2_host_info_lock, flags);
-	hi = sbp2_find_host_info(host);
-	spin_unlock_irqrestore(&sbp2_host_info_lock, flags);
+	hi = hpsb_get_hostinfo(sbp2_hl_handle, host);
 
 	if (!hi) {
 		SBP2_ERR("host info is NULL - this is bad!");
@@ -2543,7 +2643,7 @@
 				 * Initiate a fetch agent reset. 
 				 */
 				SBP2_DEBUG("Dead bit set - initiating fetch agent reset");
-                                sbp2_agent_reset(hi, scsi_id, 0);
+                                sbp2_agent_reset(scsi_id, 0);
 			}
 
 			SBP2_ORB_DEBUG("completing command orb %p", &command->command_orb);
@@ -2564,6 +2664,7 @@
 		 * It's probably a login/logout/reconnect status.
 		 */
 		if ((scsi_id->login_orb_dma == scsi_id->status_block.ORB_offset_lo) ||
+		    (scsi_id->query_logins_orb_dma == scsi_id->status_block.ORB_offset_lo) ||
 		    (scsi_id->reconnect_orb_dma == scsi_id->status_block.ORB_offset_lo) ||
 		    (scsi_id->logout_orb_dma == scsi_id->status_block.ORB_offset_lo)) {
 			atomic_set(&scsi_id->sbp2_login_complete, 1);
@@ -2583,7 +2684,8 @@
 		 * io_request_lock (in sbp2scsi_queuecommand).
 		 */
 		SBP2_DEBUG("Completing SCSI command");
-		sbp2scsi_complete_command(hi, scsi_id, scsi_status, SCpnt, command->Current_done);
+		sbp2scsi_complete_command(scsi_id, scsi_status, SCpnt,
+					  command->Current_done);
 		SBP2_ORB_DEBUG("command orb completed");
 	}
 
@@ -2610,7 +2712,7 @@
 	/*
 	 * Pull our host info and scsi id instance data from the scsi command
 	 */
-	hi = (struct sbp2scsi_host_info *) &SCpnt->device->host->hostdata;
+	hi = hpsb_get_hostinfo_bykey(sbp2_hl_handle, (unsigned long)SCpnt->device->host);
 
 	if (!hi) {
 		SBP2_ERR("sbp2scsi_host_info is NULL - this is bad!");
@@ -2649,7 +2751,7 @@
 		SBP2_DEBUG("REQUEST_SENSE");
 		memcpy(SCpnt->request_buffer, SCpnt->sense_buffer, SCpnt->request_bufflen);
 		memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer));
-		sbp2scsi_complete_command(hi, scsi_id, SBP2_SCSI_STATUS_GOOD, SCpnt, done);
+		sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_GOOD, SCpnt, done);
 		return(0);
 	}
 
@@ -2667,9 +2769,10 @@
 	 * Try and send our SCSI command
 	 */
 	spin_lock_irqsave(&hi->sbp2_command_lock, flags);
-	if (sbp2_send_command(hi, scsi_id, SCpnt, done)) {
+	if (sbp2_send_command(scsi_id, SCpnt, done)) {
 		SBP2_ERR("Error sending SCSI command");
-		sbp2scsi_complete_command(hi, scsi_id, SBP2_SCSI_STATUS_SELECTION_TIMEOUT, SCpnt, done);
+		sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_SELECTION_TIMEOUT,
+					  SCpnt, done);
 	}
 	spin_unlock_irqrestore(&hi->sbp2_command_lock, flags);
 
@@ -2680,10 +2783,10 @@
  * This function is called in order to complete all outstanding SBP-2
  * commands (in case of resets, etc.).
  */
-static void sbp2scsi_complete_all_commands(struct sbp2scsi_host_info *hi,
-					   struct scsi_id_instance_data *scsi_id, 
+static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id, 
 					   u32 status)
 {
+	struct sbp2scsi_host_info *hi = scsi_id->hi;
 	struct list_head *lh;
 	struct sbp2_command_info *command;
 
@@ -2715,8 +2818,7 @@
  *
  * This can be called in interrupt context.
  */
-static void sbp2scsi_complete_command(struct sbp2scsi_host_info *hi,
-				      struct scsi_id_instance_data *scsi_id,
+static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
 				      u32 scsi_status, Scsi_Cmnd *SCpnt,
 				      void (*done)(Scsi_Cmnd *))
 {
@@ -2825,9 +2927,9 @@
 	done (SCpnt);
 	spin_unlock_irqrestore(&io_request_lock,flags);
 #else
-	spin_lock_irqsave(hi->scsi_host->host_lock,flags);
+	spin_lock_irqsave(scsi_id->hi->scsi_host->host_lock,flags);
 	done (SCpnt);
-	spin_unlock_irqrestore(hi->scsi_host->host_lock,flags);
+	spin_unlock_irqrestore(scsi_id->hi->scsi_host->host_lock,flags);
 #endif
 
 	return;
@@ -2839,7 +2941,8 @@
  */
 static int sbp2scsi_abort (Scsi_Cmnd *SCpnt) 
 {
-	struct sbp2scsi_host_info *hi = (struct sbp2scsi_host_info *)&SCpnt->device->host->hostdata;
+	struct sbp2scsi_host_info *hi = hpsb_get_hostinfo_bykey(sbp2_hl_handle,
+								(unsigned long)SCpnt->device->host);
 	struct scsi_id_instance_data *scsi_id = hi->scsi_id[SCpnt->device->id];
 	struct sbp2_command_info *command;
 	unsigned long flags;
@@ -2876,8 +2979,8 @@
 		/*
 		 * Initiate a fetch agent reset. 
 		 */
-		sbp2_agent_reset(hi, scsi_id, 0);
-		sbp2scsi_complete_all_commands(hi, scsi_id, DID_BUS_BUSY);		
+		sbp2_agent_reset(scsi_id, 0);
+		sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY);		
 		spin_unlock_irqrestore(&hi->sbp2_command_lock, flags);
 	}
 
@@ -2889,14 +2992,15 @@
  */
 static int sbp2scsi_reset (Scsi_Cmnd *SCpnt) 
 {
-	struct sbp2scsi_host_info *hi = (struct sbp2scsi_host_info *)&SCpnt->device->host->hostdata;
+	struct sbp2scsi_host_info *hi = hpsb_get_hostinfo_bykey(sbp2_hl_handle,
+								(unsigned long)SCpnt->device->host);
 	struct scsi_id_instance_data *scsi_id = hi->scsi_id[SCpnt->device->id];
 
 	SBP2_ERR("reset requested");
 
 	if (scsi_id) {
 		SBP2_ERR("Generating sbp2 fetch agent reset");
-		sbp2_agent_reset(hi, scsi_id, 0);
+		sbp2_agent_reset(scsi_id, 0);
 	}
 
 	return(SUCCESS);
@@ -2904,7 +3008,7 @@
 
 static const char *sbp2scsi_info (struct Scsi_Host *host)
 {
-        return "SCSI emulation for for IEEE-1394 Storage Devices";
+        return "SCSI emulation for IEEE-1394 SBP-2 Devices";
 }
 
 /* Called for contents of procfs */
@@ -2927,7 +3031,7 @@
 	if (!host)  /* if we couldn't find it, we return an error */
 		return -ESRCH;
 
-	hi = sbp2_find_host_info_scsi(host);
+	hi = hpsb_get_hostinfo_bykey(sbp2_hl_handle, (unsigned long)host);
 	if (!hi) /* shouldn't happen, but... */
 		return -ESRCH;
 
@@ -2936,10 +3040,10 @@
 	SPRINTF("Driver version         : %s\n", version);
 
 	SPRINTF("\nModule options         :\n");
-	SPRINTF("  sbp2_max_speed       : %s\n", hpsb_speedto_str[sbp2_max_speed]);
-	SPRINTF("  sbp2_max_sectors     : %d\n", sbp2_max_sectors);
-	SPRINTF("  sbp2_serialize_io    : %s\n", sbp2_serialize_io ? "yes" : "no");
-	SPRINTF("  sbp2_exclusive_login : %s\n", sbp2_exclusive_login ? "yes" : "no");
+	SPRINTF("  max_speed       : %s\n", hpsb_speedto_str[max_speed]);
+	SPRINTF("  max_sectors     : %d\n", max_sectors);
+	SPRINTF("  serialize_io    : %s\n", serialize_io ? "yes" : "no");
+	SPRINTF("  exclusive_login : %s\n", exclusive_login ? "yes" : "no");
 
 	SPRINTF("\nAttached devices       : %s\n", !list_empty(&host->my_devices) ?
 		"" : "none");
@@ -3010,7 +3114,7 @@
 
 	/* Module load debug option to force one command at a time
 	 * (serializing I/O) */
-	if (sbp2_serialize_io) {
+	if (serialize_io) {
 		SBP2_ERR("Driver forced to serialize I/O (serialize_io = 1)");
 		scsi_driver_template.can_queue = 1;
 		scsi_driver_template.cmd_per_lun = 1;
@@ -3019,7 +3123,7 @@
 	/* 
 	 * Set max sectors (module load option). Default is 255 sectors. 
 	 */
-	scsi_driver_template.max_sectors = sbp2_max_sectors;
+	scsi_driver_template.max_sectors = max_sectors;
 
 
 	/*
diff -Nru a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
--- a/drivers/ieee1394/sbp2.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/ieee1394/sbp2.h	Sat Apr 19 19:51:28 2003
@@ -93,6 +93,29 @@
 
 #define ORB_SET_LOGIN_ID(value)                 (value & 0xffff)
 
+#define ORB_SET_QUERY_LOGINS_RESP_LENGTH(value) (value & 0xffff)
+
+struct sbp2_query_logins_orb {
+	u32 reserved1;
+	u32 reserved2;
+	u32 query_response_hi;
+	u32 query_response_lo;
+	u32 lun_misc;
+	u32 reserved_resp_length;
+	u32 status_FIFO_hi;
+	u32 status_FIFO_lo;
+};
+
+#define RESPONSE_GET_MAX_LOGINS(value)          (value & 0xffff)
+#define RESPONSE_GET_ACTIVE_LOGINS(value)       ((RESPONSE_GET_LENGTH(value) - 4) / 12)
+
+struct sbp2_query_logins_response {
+	u32 length_max_logins;
+	u32 misc_IDs;
+	u32 initiator_misc_hi;
+	u32 initiator_misc_lo;
+};
+
 struct sbp2_reconnect_orb {
 	u32 reserved1;
 	u32 reserved2;
@@ -238,7 +261,7 @@
  */
 
 #define SBP2_MAX_SG_ELEMENT_LENGTH	0xf000
-#define SBP2SCSI_MAX_SCSI_IDS		16	/* Max sbp2 device instances supported */
+#define SBP2SCSI_MAX_SCSI_IDS		32	/* Max sbp2 device instances supported */
 #define SBP2_MAX_SECTORS		255	/* Max sectors supported */
 
 #ifndef TYPE_SDAD
@@ -320,6 +343,10 @@
 #define SBP2_BREAKAGE_128K_MAX_TRANSFER		0x1
 #define SBP2_BREAKAGE_INQUIRY_HACK		0x2
 
+
+struct sbp2scsi_host_info;
+
+
 /*
  * Information needed on a per scsi id basis (one for each sbp2 device)
  */
@@ -336,6 +363,10 @@
 	dma_addr_t login_orb_dma;
 	struct sbp2_login_response *login_response;
 	dma_addr_t login_response_dma;
+	struct sbp2_query_logins_orb *query_logins_orb;
+	dma_addr_t query_logins_orb_dma;
+	struct sbp2_query_logins_response *query_logins_response;
+	dma_addr_t query_logins_response_dma;
 	struct sbp2_reconnect_orb *reconnect_orb;
 	dma_addr_t reconnect_orb_dma;
 	struct sbp2_logout_orb *logout_orb;
@@ -361,7 +392,7 @@
 	u32 sbp2_firmware_revision;
 
 	/* 
-	 * Variable used for logins, reconnects, logouts 
+	 * Variable used for logins, reconnects, logouts, query logins
 	 */
 	atomic_t sbp2_login_complete;
 
@@ -375,6 +406,9 @@
 	/* Node entry, as retrieved from NodeMgr entries */
 	struct node_entry *ne;
 
+	/* A backlink to our host_info */
+	struct sbp2scsi_host_info *hi;
+
 	/* Device specific workarounds/brokeness */
 	u32 workarounds;
 };
@@ -383,11 +417,6 @@
  * Sbp2 host data structure (one per sbp2 host)
  */
 struct sbp2scsi_host_info {
-
-	/*
-	 * For use in keeping track of hosts
-	 */
-	struct list_head list;
 	struct hpsb_host *host;
 
 	/*
@@ -406,7 +435,6 @@
 	 * SCSI ID instance data (one for each sbp2 device instance possible)
 	 */
 	struct scsi_id_instance_data *scsi_id[SBP2SCSI_MAX_SCSI_IDS];
-
 };
 
 /*
@@ -416,30 +444,29 @@
 /*
  * Various utility prototypes
  */
-static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
-static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id, struct sbp2scsi_host_info *hi);
+static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id);
+static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id);
 static struct sbp2_command_info *sbp2util_find_command_for_orb(struct scsi_id_instance_data *scsi_id, dma_addr_t orb);
 static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(struct scsi_id_instance_data *scsi_id, void *SCpnt);
 static struct sbp2_command_info *sbp2util_allocate_command_orb(struct scsi_id_instance_data *scsi_id, 
 							  Scsi_Cmnd *Current_SCpnt, 
-							  void (*Current_done)(Scsi_Cmnd *),
-							  struct sbp2scsi_host_info *hi);
+							  void (*Current_done)(Scsi_Cmnd *));
 static void sbp2util_mark_command_completed(struct scsi_id_instance_data *scsi_id,
 		struct sbp2_command_info *command);
 
 /*
  * IEEE-1394 core driver related prototypes
  */
-static void sbp2_add_host(struct hpsb_host *host);
-static struct sbp2scsi_host_info *sbp2_find_host_info(struct hpsb_host *host);
+static struct sbp2scsi_host_info *sbp2_add_host(struct hpsb_host *host);
 static void sbp2_remove_host(struct hpsb_host *host);
-static int sbp2_probe(struct unit_directory *ud);
-static void sbp2_disconnect(struct unit_directory *ud);
+
+static int sbp2_probe(struct device *dev);
+static int sbp2_remove(struct device *dev);
 static void sbp2_update(struct unit_directory *ud);
+
 static int sbp2_start_device(struct sbp2scsi_host_info *hi, 
 			     struct unit_directory *ud);
-static void sbp2_remove_device(struct sbp2scsi_host_info *hi, 
-			       struct scsi_id_instance_data *scsi_id);
+static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id);
 
 #ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
 static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid, int destid, quadlet_t *data,
@@ -451,29 +478,29 @@
 /*
  * SBP-2 protocol related prototypes
  */
-static int sbp2_login_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
-static int sbp2_reconnect_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id); 
-static int sbp2_logout_device(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id); 
+static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id);
+static int sbp2_login_device(struct scsi_id_instance_data *scsi_id);
+static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id); 
+static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id); 
 static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid, int destid,
 				    quadlet_t *data, u64 addr, unsigned int length, u16 flags);
-static int sbp2_agent_reset(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id, int wait);
-static int sbp2_create_command_orb(struct sbp2scsi_host_info *hi, 
-				   struct scsi_id_instance_data *scsi_id,
+static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait);
+static int sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id,
 				   struct sbp2_command_info *command,
 				   unchar *scsi_cmd,
 				   unsigned int scsi_use_sg,
 				   unsigned int scsi_request_bufflen,
 				   void *scsi_request_buffer, 
 				   unsigned char scsi_dir);
-static int sbp2_link_orb_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
+static int sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id,
 				 struct sbp2_command_info *command);
-static int sbp2_send_command(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id,
+static int sbp2_send_command(struct scsi_id_instance_data *scsi_id,
 			     Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
 static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data);
 static void sbp2_check_sbp2_command(struct scsi_id_instance_data *scsi_id, unchar *cmd);
 static void sbp2_check_sbp2_response(struct scsi_id_instance_data *scsi_id, Scsi_Cmnd *SCpnt);
 static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id);
-static int sbp2_set_busy_timeout(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
-static int sbp2_max_speed_and_size(struct sbp2scsi_host_info *hi, struct scsi_id_instance_data *scsi_id);
+static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id);
+static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id);
 
 #endif /* SBP2_H */
diff -Nru a/drivers/ieee1394/video1394.c b/drivers/ieee1394/video1394.c
--- a/drivers/ieee1394/video1394.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/ieee1394/video1394.c	Sat Apr 19 19:51:28 2003
@@ -48,6 +48,7 @@
 
 #include "ieee1394.h"
 #include "ieee1394_types.h"
+#include "ieee1394_hotplug.h"
 #include "hosts.h"
 #include "ieee1394_core.h"
 #include "highlevel.h"
@@ -121,16 +122,9 @@
 	struct list_head link;
 };
 
-struct video_card {
-	struct ti_ohci *ohci;
-	struct list_head list;
-	int id;
-	devfs_handle_t devfs;
-};
-
 
 struct file_ctx {
-	struct video_card *video;
+	struct ti_ohci *ohci;
 	struct list_head context_list;
 	struct dma_iso_ctx *current_ctx;
 };
@@ -161,10 +155,6 @@
 void wakeup_dma_ir_ctx(unsigned long l);
 void wakeup_dma_it_ctx(unsigned long l);
 
-static LIST_HEAD(video1394_cards);
-static spinlock_t video1394_cards_lock = SPIN_LOCK_UNLOCKED;
-
-static devfs_handle_t devfs_handle;
 static struct hpsb_highlevel *hl_handle = NULL;
 
 
@@ -715,8 +705,7 @@
 			   unsigned int cmd, unsigned long arg)
 {
 	struct file_ctx *ctx = (struct file_ctx *)file->private_data;
-	struct video_card *video = ctx->video;
-	struct ti_ohci *ohci = video->ohci;
+	struct ti_ohci *ohci = ctx->ohci;
 	unsigned long flags;
 
 	switch(cmd)
@@ -1161,7 +1150,7 @@
 
 	lock_kernel();
 	if (ctx->current_ctx == NULL) {
-		PRINT(KERN_ERR, ctx->video->ohci->id, "Current iso context not set");
+		PRINT(KERN_ERR, ctx->ohci->id, "Current iso context not set");
 	} else
 		res = dma_region_mmap(&ctx->current_ctx->dma, file, vma);
 	unlock_kernel();
@@ -1172,32 +1161,21 @@
 static int video1394_open(struct inode *inode, struct file *file)
 {
 	int i = ieee1394_file_to_instance(file);
-	unsigned long flags;
-	struct video_card *video = NULL;
-	struct list_head *lh;
+	struct ti_ohci *ohci;
 	struct file_ctx *ctx;
 
-	spin_lock_irqsave(&video1394_cards_lock, flags);
-	list_for_each(lh, &video1394_cards) {
-		struct video_card *p = list_entry(lh, struct video_card, list);
-		if (p->id == i) {
-			video = p;
-			break;
-		}
-	}
-	spin_unlock_irqrestore(&video1394_cards_lock, flags);
-
-        if (video == NULL)
+	ohci = hpsb_get_hostinfo_bykey(hl_handle, i);
+        if (ohci == NULL)
                 return -EIO;
 
 	ctx = kmalloc(sizeof(struct file_ctx), GFP_KERNEL);
 	if (ctx == NULL)  {
-		PRINT(KERN_ERR, video->ohci->id, "Cannot malloc file_ctx");
+		PRINT(KERN_ERR, ohci->id, "Cannot malloc file_ctx");
 		return -ENOMEM;
 	}
 
 	memset(ctx, 0, sizeof(struct file_ctx));
-	ctx->video = video;
+	ctx->ohci = ohci;
 	INIT_LIST_HEAD(&ctx->context_list);
 	ctx->current_ctx = NULL;
 	file->private_data = ctx;
@@ -1208,8 +1186,7 @@
 static int video1394_release(struct inode *inode, struct file *file)
 {
 	struct file_ctx *ctx = (struct file_ctx *)file->private_data;
-	struct video_card *video = ctx->video;
-	struct ti_ohci *ohci = video->ohci;
+	struct ti_ohci *ohci = ctx->ohci;
 	struct list_head *lh, *next;
 	u64 mask;
 
@@ -1247,54 +1224,36 @@
 	.release =	video1394_release
 };
 
-static int video1394_init(struct ti_ohci *ohci)
-{
-	struct video_card *video;
-	unsigned long flags;
-	char name[24];
-	int minor;
-
-	video = kmalloc(sizeof(struct video_card), GFP_KERNEL);
-	if (video == NULL) {
-		PRINT(KERN_ERR, ohci->id, "Cannot allocate video_card");
-		return -1;
-	}
-
-	memset(video, 0, sizeof(struct video_card));
-
-	spin_lock_irqsave(&video1394_cards_lock, flags);
-	INIT_LIST_HEAD(&video->list);
-	list_add_tail(&video->list, &video1394_cards);
-	spin_unlock_irqrestore(&video1394_cards_lock, flags);
-
-	video->id = ohci->id;
-	video->ohci = ohci;
-
-	sprintf(name, "%s/%d", VIDEO1394_DRIVER_NAME, video->id);
-	minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + video->id;
-	video->devfs = devfs_register(NULL, name, DEVFS_FL_DEFAULT,
-				      IEEE1394_MAJOR, minor,
-				      S_IFCHR | S_IRUSR | S_IWUSR,
-				      &video1394_fops, NULL);
+/*** HOTPLUG STUFF **********************************************************/
+/*
+ * Export information about protocols/devices supported by this driver.
+ */
+static struct ieee1394_device_id video1394_id_table[] = {
+	{
+		.match_flags	= IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION,
+		.specifier_id	= CAMERA_UNIT_SPEC_ID_ENTRY & 0xffffff,
+		.version	= CAMERA_SW_VERSION_ENTRY & 0xffffff
+	},
+	{ }
+};
 
-	return 0;
-}
+MODULE_DEVICE_TABLE(ieee1394, video1394_id_table);
 
-/* Must be called under spinlock */
-static void remove_card(struct video_card *video)
-{
-	devfs_unregister(video->devfs);
-	list_del(&video->list);
+static struct hpsb_protocol_driver video1394_driver = {
+	.name		= "1394 Digital Camera Driver",
+	.id_table	= video1394_id_table,
+	.driver		= {
+		.name	= VIDEO1394_DRIVER_NAME,
+		.bus	= &ieee1394_bus_type,
+	},
+};
 
-	kfree(video);
-}
 
-static void video1394_remove_host (struct hpsb_host *host)
+static void video1394_add_host (struct hpsb_host *host, struct hpsb_highlevel *hl)
 {
 	struct ti_ohci *ohci;
-	unsigned long flags;
-	struct list_head *lh, *next;
-	struct video_card *p;
+	char name[16];
+	int minor;
 
 	/* We only work with the OHCI-1394 driver */
 	if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
@@ -1302,34 +1261,34 @@
 
 	ohci = (struct ti_ohci *)host->hostdata;
 
-        spin_lock_irqsave(&video1394_cards_lock, flags);
-	list_for_each_safe(lh, next, &video1394_cards) {
-		p = list_entry(lh, struct video_card, list);
-		if (p->ohci == ohci) {
-			remove_card(p);
-			break;
-		}
+	if (!hpsb_create_hostinfo(hl, host, 0)) {
+		PRINT(KERN_ERR, ohci->id, "Cannot allocate hostinfo");
+		return;
 	}
-	spin_unlock_irqrestore(&video1394_cards_lock, flags);
+
+	hpsb_set_hostinfo(hl, host, ohci);
+	hpsb_set_hostinfo_key(hl, host, ohci->id);
+
+	sprintf(name, "%s/%d", VIDEO1394_DRIVER_NAME, ohci->id);
+	minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + ohci->id;
+	devfs_register(NULL, name, 0, IEEE1394_MAJOR, minor,
+		       S_IFCHR | S_IRUSR | S_IWUSR, &video1394_fops, NULL);
 
 	return;
 }
 
-static void video1394_add_host (struct hpsb_host *host)
-{
-	struct ti_ohci *ohci;
 
-	/* We only work with the OHCI-1394 driver */
-	if (strcmp(host->driver->name, OHCI1394_DRIVER_NAME))
-		return;
+static void video1394_remove_host (struct hpsb_host *host)
+{
+	struct ti_ohci *ohci = hpsb_get_hostinfo(hl_handle, host);
 
-	ohci = (struct ti_ohci *)host->hostdata;
+	if (ohci)
+		devfs_remove("%s/%d", VIDEO1394_DRIVER_NAME, ohci->id);
 
-	video1394_init(ohci);
-	
 	return;
 }
 
+
 static struct hpsb_highlevel_ops hl_ops = {
 	.add_host =	video1394_add_host,
 	.remove_host =	video1394_remove_host,
@@ -1467,9 +1426,11 @@
 		PRINT_G(KERN_INFO, "Error unregistering ioctl32 translations");
 #endif
 
+	hpsb_unregister_protocol(&video1394_driver);
+
 	hpsb_unregister_highlevel (hl_handle);
 
-	devfs_unregister(devfs_handle);
+	devfs_remove(VIDEO1394_DRIVER_NAME);
 	ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_VIDEO1394);
 
 	PRINT_G(KERN_INFO, "Removed " VIDEO1394_DRIVER_NAME " module");
@@ -1486,15 +1447,17 @@
 		return -EIO;
         }
 
-	devfs_handle = devfs_mk_dir(VIDEO1394_DRIVER_NAME);
+	devfs_mk_dir(VIDEO1394_DRIVER_NAME);
 
 	hl_handle = hpsb_register_highlevel (VIDEO1394_DRIVER_NAME, &hl_ops);
 	if (hl_handle == NULL) {
 		PRINT_G(KERN_ERR, "No more memory for driver\n");
-		devfs_unregister(devfs_handle);
+		devfs_remove(VIDEO1394_DRIVER_NAME);
 		ieee1394_unregister_chardev(IEEE1394_MINOR_BLOCK_VIDEO1394);
 		return -ENOMEM;
 	}
+
+	hpsb_register_protocol(&video1394_driver);
 
 #ifdef CONFIG_COMPAT
 	/* First the compatible ones */
diff -Nru a/drivers/input/input.c b/drivers/input/input.c
--- a/drivers/input/input.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/input/input.c	Sat Apr 19 19:51:48 2003
@@ -717,5 +717,5 @@
 	devclass_unregister(&input_devclass);
 }
 
-module_init(input_init);
+subsys_initcall(input_init);
 module_exit(input_exit);
diff -Nru a/drivers/input/keyboard/98kbd.c b/drivers/input/keyboard/98kbd.c
--- a/drivers/input/keyboard/98kbd.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/input/keyboard/98kbd.c	Sat Apr 19 19:51:46 2003
@@ -189,6 +189,13 @@
 			input_sync(&kbd98->dev);
 			return;
 
+		case KEY_CAPSLOCK:
+			input_report_key(&kbd98->dev, keycode, 1);
+			input_sync(&kbd98->dev);
+			input_report_key(&kbd98->dev, keycode, 0);
+			input_sync(&kbd98->dev);
+			return;
+
 		case KBD98_KEY_NULL:
 			return;
 
diff -Nru a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c
--- a/drivers/input/keyboard/amikbd.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/input/keyboard/amikbd.c	Sat Apr 19 19:51:50 2003
@@ -51,8 +51,8 @@
 	 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,  0,  0, 75, 76, 77,
 	  0, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,  0, 83, 71, 72, 73,
 	 57, 14, 15, 96, 28,  1,111,  0,  0,  0, 74,  0,103,108,106,105,
-	 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 98, 55, 78, 87,
-	 42, 54, 58, 29, 56,100
+	 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,179,180, 98, 55, 78,138,
+	 42, 54, 58, 29, 56,100,125,126
 };
 
 static const char *amikbd_messages[8] = {
diff -Nru a/drivers/input/mouse/psmouse.c b/drivers/input/mouse/psmouse.c
--- a/drivers/input/mouse/psmouse.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/input/mouse/psmouse.c	Sat Apr 19 19:51:29 2003
@@ -599,7 +599,7 @@
 }
 
 /*
- * psmouse_connect() is a callback form the serio module when
+ * psmouse_connect() is a callback from the serio module when
  * an unhandled serio port is found.
  */
 
diff -Nru a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
--- a/drivers/input/serio/i8042.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/input/serio/i8042.c	Sat Apr 19 19:51:28 2003
@@ -222,7 +222,7 @@
 
 /*
  * i8042_open() is called when a port is open by the higher layer.
- * It allocates the interrupt and enables in in the chip.
+ * It allocates the interrupt and enables it in the chip.
  */
 
 static int i8042_open(struct serio *port)
diff -Nru a/drivers/isdn/hisax/amd7930_fn.c b/drivers/isdn/hisax/amd7930_fn.c
--- a/drivers/isdn/hisax/amd7930_fn.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/isdn/hisax/amd7930_fn.c	Sat Apr 19 19:51:49 2003
@@ -330,7 +330,7 @@
 				sched_d_event(cs, D_RCVBUFREADY);
 			}
                 }
-		/* Packet to long, overflow */
+		/* Packet too long, overflow */
 		if(cs->rcvidx >= MAX_DFRAME_LEN_L1) {
 			if (cs->debug & L1_DEB_WARN)
 			        debugl1(cs, "AMD7930: empty_Dfifo L2-Framelength overrun");
diff -Nru a/drivers/isdn/hisax/hfc_sx.c b/drivers/isdn/hisax/hfc_sx.c
--- a/drivers/isdn/hisax/hfc_sx.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/isdn/hisax/hfc_sx.c	Sat Apr 19 19:51:28 2003
@@ -147,7 +147,7 @@
 	    count += fifo_size; /* free bytes */
 	  if (count < skb->len+1) return(0); /* no room */
 	  count = fifo_size - count; /* bytes still not send */
-	  if (count > 2 * trans_max) return(0); /* delay to long */
+	  if (count > 2 * trans_max) return(0); /* delay too long */
 	  count = skb->len;
 	  src = skb->data;
 	  while (count--)
diff -Nru a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
--- a/drivers/md/dm-ioctl.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/md/dm-ioctl.c	Sat Apr 19 19:51:29 2003
@@ -180,8 +180,7 @@
 	}
 
 	sprintf(name, DM_DIR "/%s", hc->name);
-	devfs_register(NULL, name, DEVFS_FL_CURRENT_OWNER,
-		       disk->major, disk->first_minor,
+	devfs_register(NULL, name, 0, disk->major, disk->first_minor,
 		       S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP,
 		       &dm_blk_dops, NULL);
 	kfree(name);
diff -Nru a/drivers/md/raid1.c b/drivers/md/raid1.c
--- a/drivers/md/raid1.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/md/raid1.c	Sat Apr 19 19:51:48 2003
@@ -238,11 +238,12 @@
  * operation and are ready to return a success/failure code to the buffer
  * cache layer.
  */
-static void raid_end_bio_io(r1bio_t *r1_bio, int uptodate)
+static void raid_end_bio_io(r1bio_t *r1_bio)
 {
 	struct bio *bio = r1_bio->master_bio;
 
-	bio_endio(bio, bio->bi_size, uptodate ? 0 : -EIO);
+	bio_endio(bio, bio->bi_size,
+		test_bit(R1BIO_Uptodate, &r1_bio->state) ? 0 : -EIO);
 	free_r1bio(r1_bio);
 }
 
@@ -299,7 +300,7 @@
 		 * we have only one bio on the read side
 		 */
 		if (uptodate)
-			raid_end_bio_io(r1_bio, uptodate);
+			raid_end_bio_io(r1_bio);
 		else {
 			/*
 			 * oops, read error:
@@ -320,7 +321,7 @@
 		 */
 		if (atomic_dec_and_test(&r1_bio->remaining)) {
 			md_write_end(r1_bio->mddev);
-			raid_end_bio_io(r1_bio, uptodate);
+			raid_end_bio_io(r1_bio);
 		}	
 	}
 	atomic_dec(&conf->mirrors[mirror].rdev->nr_pending);
@@ -542,10 +543,10 @@
 		 * then return an IO error:
 		 */
 		md_write_end(mddev);
-		raid_end_bio_io(r1_bio, 0);
+		raid_end_bio_io(r1_bio);
 		return 0;
 	}
-	atomic_set(&r1_bio->remaining, sum_bios);
+	atomic_set(&r1_bio->remaining, sum_bios+1);
 
 	/*
 	 * We have to be a bit careful about the semaphore above, thats
@@ -567,6 +568,12 @@
 
 		generic_make_request(mbio);
 	}
+
+	if (atomic_dec_and_test(&r1_bio->remaining)) {
+		md_write_end(mddev);
+		raid_end_bio_io(r1_bio);
+	}
+
 	return 0;
 }
 
@@ -917,7 +924,7 @@
 				" read error for block %llu\n",
 				bdev_partition_name(bio->bi_bdev), 
 				(unsigned long long)r1_bio->sector);
-				raid_end_bio_io(r1_bio, 0);
+				raid_end_bio_io(r1_bio);
 				break;
 			}
 			printk(KERN_ERR "raid1: %s: redirecting sector %llu to"
diff -Nru a/drivers/media/Kconfig b/drivers/media/Kconfig
--- a/drivers/media/Kconfig	Sat Apr 19 19:51:29 2003
+++ b/drivers/media/Kconfig	Sat Apr 19 19:51:29 2003
@@ -32,5 +32,24 @@
 
 source "drivers/media/dvb/Kconfig"
 
+source "drivers/media/common/Kconfig"
+
+config VIDEO_TUNER
+	tristate
+	default y if VIDEO_BT848=y || VIDEO_SAA7134=y || VIDEO_MXB=y
+	default m if VIDEO_BT848=m || VIDEO_SAA7134=m || VIDEO_MXB=m
+	depends on VIDEO_DEV
+
+config VIDEO_BUF
+	tristate
+	default y if VIDEO_BT848=y || VIDEO_SAA7134=y || VIDEO_SAA7146=y
+	default m if VIDEO_BT848=m || VIDEO_SAA7134=m || VIDEO_SAA7146=m
+	depends on VIDEO_DEV
+
+config VIDEO_BTCX
+	tristate
+	default VIDEO_BT848
+	depends on VIDEO_DEV
+
 endmenu
 
diff -Nru a/drivers/media/Makefile b/drivers/media/Makefile
--- a/drivers/media/Makefile	Sat Apr 19 19:51:50 2003
+++ b/drivers/media/Makefile	Sat Apr 19 19:51:50 2003
@@ -2,4 +2,4 @@
 # Makefile for the kernel multimedia device drivers.
 #
 
-obj-y        := video/ radio/ dvb/
+obj-y        := video/ radio/ dvb/ common/
diff -Nru a/drivers/media/common/Kconfig b/drivers/media/common/Kconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/Kconfig	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,11 @@
+config VIDEO_SAA7146
+        tristate
+        default y if DVB_AV7110=y || DVB_BUDGET=y || DVB_BUDGET_AV=y || VIDEO_MXB=y || VIDEO_DPC=y
+        default m if DVB_AV7110=m || DVB_BUDGET=m || DVB_BUDGET_AV=m || VIDEO_MXB=m || VIDEO_DPC=m
+        depends on VIDEO_DEV && PCI
+
+config VIDEO_VIDEOBUF
+        tristate
+        default y if VIDEO_SAA7134=y || VIDEO_BT848=y || VIDEO_SAA7146=y
+        default m if VIDEO_SAA7134=m || VIDEO_BT848=m || VIDEO_SAA7146=m
+        depends on VIDEO_DEV
diff -Nru a/drivers/media/common/Makefile b/drivers/media/common/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,5 @@
+saa7146-objs    := saa7146_i2c.o saa7146_core.o 
+saa7146_vv-objs := saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o  
+
+obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o saa7146_vv.o
+
diff -Nru a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/saa7146_core.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,524 @@
+/*
+    saa7146.o - driver for generic saa7146-based hardware
+
+    Copyright (C) 1998-2003 Michael Hunold <michael@mihu.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 <media/saa7146.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME saa7146
+#endif
+
+/* global variables */
+struct list_head saa7146_devices;
+struct semaphore saa7146_devices_lock;
+
+static int initialized = 0;
+int saa7146_num = 0;
+
+unsigned int saa7146_debug = 0;
+
+MODULE_PARM(saa7146_debug,"i");
+MODULE_PARM_DESC(saa7146_debug, "debug level (default: 0)");
+
+#if 0
+static void dump_registers(struct saa7146_dev* dev)
+{
+	int i = 0;
+
+	INFO((" @ %li jiffies:\n",jiffies));
+	for(i = 0; i <= 0x148; i+=4) {
+		printk("0x%03x: 0x%08x\n",i,saa7146_read(dev,i));
+	}
+}
+#endif
+
+/****************************************************************************
+ * general helper functions
+ ****************************************************************************/
+
+/* this is videobuf_vmalloc_to_sg() from video-buf.c */
+static
+struct scatterlist* vmalloc_to_sg(unsigned char *virt, int nr_pages)
+{
+	struct scatterlist *sglist;
+	struct page *pg;
+	int i;
+
+	sglist = kmalloc(sizeof(struct scatterlist)*nr_pages, GFP_KERNEL);
+	if (NULL == sglist)
+		return NULL;
+	memset(sglist,0,sizeof(struct scatterlist)*nr_pages);
+	for (i = 0; i < nr_pages; i++, virt += PAGE_SIZE) {
+		pg = vmalloc_to_page(virt);
+		if (NULL == pg)
+			goto err;
+		if (PageHighMem(pg))
+			BUG();
+		sglist[i].page   = pg;
+		sglist[i].length = PAGE_SIZE;
+	}
+	return sglist;
+	
+ err:
+	kfree(sglist);
+	return NULL;
+}
+
+/********************************************************************************/
+/* common page table functions */
+
+#define SAA7146_PGTABLE_SIZE 4096
+
+char *saa7146_vmalloc_build_pgtable(struct pci_dev *pci, long length, struct saa7146_pgtable *pt)
+{
+	struct scatterlist *slist = NULL;
+	int pages = (length+PAGE_SIZE-1)/PAGE_SIZE;
+	char *mem = vmalloc(length);
+	int slen = 0;
+
+	if (NULL == mem) {
+		return NULL;
+	}
+
+	if (!(slist = vmalloc_to_sg(mem, pages))) {
+		vfree(mem);
+		return NULL;
+	}
+
+	if (saa7146_pgtable_alloc(pci, pt)) {
+		kfree(slist);
+		vfree(mem);
+		return NULL;
+	}
+	
+	slen = pci_map_sg(pci,slist,pages,PCI_DMA_FROMDEVICE);
+	saa7146_pgtable_build_single(pci, pt, slist, slen);
+
+	/* fixme: here's a memory leak: slist never gets freed by any other
+	   function ...*/
+	return mem;
+}
+
+void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt)
+{
+//fm	DEB_EE(("pci:%p, pt:%p\n",pci,pt));
+
+	if (NULL == pt->cpu)
+		return;
+	pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
+	pt->cpu = NULL;
+}
+
+int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
+{
+        u32          *cpu;
+        dma_addr_t   dma_addr;
+
+//fm	DEB_EE(("pci:%p, pt:%p\n",pci,pt));
+
+	cpu = pci_alloc_consistent(pci, SAA7146_PGTABLE_SIZE, &dma_addr);
+	if (NULL == cpu) {
+//fm		ERR(("pci_alloc_consistent() failed."));
+		return -ENOMEM;
+	}
+	pt->size = SAA7146_PGTABLE_SIZE;
+	pt->cpu  = cpu;
+	pt->dma  = dma_addr;
+
+	return 0;
+}
+
+void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length )
+{
+	u32   *ptr, fill;
+	int   i,p;
+
+//fm	DEB_EE(("pci:%p, pt:%p, sl:%p, len:%d\n",pci,pt,list,length));
+
+	/* if we have a user buffer, the first page may not be
+	   aligned to a page boundary. */
+	pt->offset = list->offset;
+
+	ptr = pt->cpu;
+	for (i = 0; i < length; i++, list++) {
+		for (p = 0; p * 4096 < list->length; p++, ptr++) {
+			*ptr = sg_dma_address(list) - list->offset;
+		}
+	}
+
+
+	/* safety; fill the page table up with the last valid page */
+	fill = *(ptr-1);
+	for(;i<1024;i++) {
+		*ptr++ = fill;
+	}
+/*
+	ptr = pt->cpu;
+	for(j=0;j<60;j++) {
+		printk("ptr1 %d: 0x%08x\n",j,ptr[j]);
+	}
+*/
+}
+
+/********************************************************************************/
+/* gpio functions */
+
+void saa7146_setgpio(struct saa7146_dev *dev, int port, u32 data)
+{
+	u32 val = 0;
+
+        val=saa7146_read(dev,GPIO_CTRL);
+        val&=~(0xff << (8*(port)));
+        val|=(data)<<(8*(port));
+        saa7146_write(dev, GPIO_CTRL, val);
+}
+
+/********************************************************************************/
+/* interrupt handler */
+
+static void interrupt_hw(int irq, void *dev_id, struct pt_regs *regs)
+{
+	struct saa7146_dev *dev = (struct saa7146_dev*)dev_id;
+	u32 isr = 0;
+
+	/* read out the interrupt status register */
+	isr = saa7146_read(dev, ISR);
+
+	/* is this our interrupt? */
+	if ( 0 == isr ) {
+		/* nope, some other device */
+		return;
+	}
+
+	saa7146_write(dev, ISR, isr);
+//	DEB_INT(("0x%08x\n",isr));
+
+	if( 0 != (dev->ext)) {
+		if( 0 != (dev->ext->irq_mask & isr )) {
+			if( 0 != dev->ext->irq_func ) {
+				dev->ext->irq_func(dev, &isr);
+			}
+			isr &= ~dev->ext->irq_mask;
+		}
+	}
+	if (0 != (isr & (MASK_27))) {
+		DEB_INT(("irq: RPS0 (0x%08x).\n",isr));
+		if( 0 != dev->vv_data && 0 != dev->vv_callback) {
+			dev->vv_callback(dev,isr);
+		}
+		isr &= ~MASK_27;
+	}
+	if (0 != (isr & (MASK_28))) {
+		if( 0 != dev->vv_data && 0 != dev->vv_callback) {
+			dev->vv_callback(dev,isr);
+		}
+		isr &= ~MASK_28;
+	}
+	if (0 != (isr & (MASK_16|MASK_17))) {
+		u32 status = saa7146_read(dev, I2C_STATUS);
+		if( (0x3 == (status & 0x3)) || (0 == (status & 0x1)) ) {
+			IER_DISABLE(dev, MASK_16|MASK_17);
+			/* only wake up if we expect something */
+			if( 0 != dev->i2c_op ) {
+				u32 psr = (saa7146_read(dev, PSR) >> 16) & 0x2;
+				u32 ssr = (saa7146_read(dev, SSR) >> 17) & 0x1f;
+				DEB_I2C(("irq: i2c, status: 0x%08x, psr:0x%02x, ssr:0x%02x).\n",status,psr,ssr));
+				dev->i2c_op = 0;
+				wake_up(&dev->i2c_wq);
+			} else {
+				DEB_I2C(("unexpected irq: i2c, status: 0x%08x, isr %#x\n",status, isr));
+			}
+		} else {
+			DEB_I2C(("unhandled irq: i2c, status: 0x%08x, isr %#x\n",status, isr));
+		}
+		isr &= ~(MASK_16|MASK_17);
+	}
+	if( 0 != isr ) {
+		ERR(("warning: interrupt enabled, but not handled properly.(0x%08x)\n",isr));
+		ERR(("disabling interrupt source(s)!\n"));
+		IER_DISABLE(dev,isr);
+	}
+}
+
+/*********************************************************************************/
+/* configuration-functions                                                       */
+
+static
+int saa7146_init_one(struct pci_dev *pci, const struct pci_device_id *ent)
+{
+	unsigned long adr = 0, len = 0;
+	struct saa7146_dev* dev = kmalloc (sizeof(struct saa7146_dev),GFP_KERNEL);
+	
+	struct saa7146_pci_extension_data *pci_ext = (struct saa7146_pci_extension_data *)ent->driver_data;
+	struct saa7146_extension* ext = pci_ext->ext;
+	int err = 0;
+	
+	if (!(dev = kmalloc (sizeof(struct saa7146_dev),GFP_KERNEL))) {
+		ERR(("out of memory.\n"));
+		return -ENOMEM;
+	}
+
+	/* clear out mem for sure */
+	memset(dev, 0x0, sizeof(struct saa7146_dev));
+
+	DEB_EE(("pci:%p\n",pci));
+
+	if (pci_enable_device(pci)) {
+		ERR(("pci_enable_device() failed.\n"));
+		err = -EIO;
+		goto pci_error;
+	}
+
+	/* enable bus-mastering */
+	pci_set_master(pci);
+
+	dev->pci = pci;
+	/* get chip-revision; this is needed to enable bug-fixes */
+	if( 0 > pci_read_config_dword(dev->pci, PCI_CLASS_REVISION, &dev->revision)) {
+		ERR(("pci_read_config_dword() failed.\n"));
+		err = -ENODEV;
+		goto pci_error;
+	}
+	dev->revision &= 0xf;
+
+	/* remap the memory from virtual to physical adress */
+	adr = pci_resource_start(pci,0);
+	len = pci_resource_len(pci,0);
+
+	if (!request_mem_region(pci_resource_start(pci,0), pci_resource_len(pci,0), "saa7146")) {
+		ERR(("request_mem_region() failed.\n"));
+		err = -ENODEV;
+		goto pci_error;
+	}
+
+	if (!(dev->mem = ioremap(adr,len))) {
+		ERR(("ioremap() failed.\n"));
+		err = -ENODEV;
+		goto ioremap_error;
+	}
+
+	/* we don't do a master reset here anymore, it screws up
+	   some boards that don't have an i2c-eeprom for configuration
+	   values */
+/*
+	saa7146_write(dev, MC1, MASK_31);
+*/
+
+	/* disable alle irqs */
+	saa7146_write(dev, IER, 0);
+
+	/* shut down all dma transfers */
+	saa7146_write(dev, MC1, 0x00ff0000);
+
+	/* clear out any rps-signals pending */
+	saa7146_write(dev, MC2, 0xf8000000);
+
+	/* request an interrupt for the saa7146 */
+	if (request_irq(dev->pci->irq, interrupt_hw, SA_SHIRQ | SA_INTERRUPT,
+			dev->name, dev))
+	{
+		ERR(("request_irq() failed.\n"));
+		err = -ENODEV;
+		goto irq_error;
+	}
+
+	/* get memory for various stuff */
+	dev->rps0 = (u32*)kmalloc(SAA7146_RPS_MEM, GFP_KERNEL);
+	if( NULL == dev->rps0 ) {
+		err = -ENOMEM;
+		goto kmalloc_error_1;
+	}
+	memset(dev->rps0, 0x0, SAA7146_RPS_MEM);
+
+	dev->rps1 = (u32*)kmalloc(SAA7146_RPS_MEM, GFP_KERNEL);
+	if( NULL == dev->rps1 ) {
+		err = -ENOMEM;
+		goto kmalloc_error_2;
+	}
+	memset(dev->rps1, 0x0, SAA7146_RPS_MEM);
+
+	dev->i2c_mem = (u32*)kmalloc(SAA7146_I2C_MEM, GFP_KERNEL);
+	if( NULL == dev->i2c_mem ) {
+		err = -ENOMEM;
+		goto kmalloc_error_3;
+	}
+	memset(dev->i2c_mem, 0x00, SAA7146_I2C_MEM);
+
+	/* the rest + print status message */
+
+	/* create a nice device name */
+	sprintf(&dev->name[0], "saa7146 (%d)",saa7146_num);
+
+	INFO(("found saa7146 @ mem 0x%08x (revision %d, irq %d) (0x%04x,0x%04x).\n", (unsigned int)dev->mem, dev->revision,dev->pci->irq,dev->pci->subsystem_vendor,dev->pci->subsystem_device));
+	dev->ext = ext;
+
+	pci_set_drvdata(pci,dev);
+
+        init_MUTEX(&dev->lock);
+	dev->int_slock = SPIN_LOCK_UNLOCKED;
+	dev->slock = SPIN_LOCK_UNLOCKED;
+
+	init_MUTEX(&dev->i2c_lock);
+
+	dev->module = THIS_MODULE;
+	init_waitqueue_head(&dev->i2c_wq);
+
+	if( 0 != ext->probe) {
+		if( 0 != ext->probe(dev) ) {
+			DEB_D(("ext->probe() failed for %p. skipping device.\n",dev));
+			err = -ENODEV;
+			goto probe_error;
+		}
+	}
+
+	if( 0 != ext->attach(dev,pci_ext) ) {
+		DEB_D(("ext->attach() failed for %p. skipping device.\n",dev));
+			err = -ENODEV;
+			goto attach_error;
+	}
+
+	INIT_LIST_HEAD(&dev->item);
+	list_add_tail(&dev->item,&saa7146_devices);
+	saa7146_num++;
+
+	/* set some default values */
+	saa7146_write(dev, BCS_CTRL, 0x80400040);
+
+	err = 0;
+	goto out;
+attach_error:
+probe_error:
+	pci_set_drvdata(pci,NULL);
+	kfree( dev->i2c_mem );
+kmalloc_error_3:
+	kfree( dev->rps1 );
+kmalloc_error_2:
+	kfree( dev->rps0 );
+kmalloc_error_1:
+	free_irq(dev->pci->irq, (void *)dev);
+irq_error:
+	iounmap(dev->mem);
+ioremap_error:
+        release_mem_region(adr,len);
+pci_error:
+	kfree(dev);
+out:
+	return err;
+}
+
+static
+void saa7146_remove_one(struct pci_dev *pdev)
+{
+	struct saa7146_dev* dev = (struct saa7146_dev*) pci_get_drvdata(pdev);
+	DEB_EE(("dev:%p\n",dev));
+
+	dev->ext->detach(dev);
+
+	/* shut down all video dma transfers */
+	saa7146_write(dev, MC1, 0x00ff0000);
+
+	/* disable all irqs, release irq-routine */
+	saa7146_write(dev, IER, 0);
+
+	free_irq(dev->pci->irq, (void *)dev);
+
+	/* free kernel memory */
+	kfree(dev->rps0 );
+	kfree(dev->rps1 );
+	kfree(dev->i2c_mem);
+
+	iounmap(dev->mem);
+	release_mem_region(pci_resource_start(dev->pci,0), pci_resource_len(dev->pci,0));
+
+	list_del(&dev->item);
+	kfree(dev);
+
+	saa7146_num--;
+}
+
+/*********************************************************************************/
+/* extension handling functions                                                  */
+
+int saa7146_register_extension(struct saa7146_extension* ext)
+{
+	DEB_EE(("ext:%p\n",ext));
+
+	if( 0 == initialized ) {
+		INIT_LIST_HEAD(&saa7146_devices);
+		init_MUTEX(&saa7146_devices_lock);
+		initialized = 1;
+	}
+
+	ext->driver.name = ext->name;
+	ext->driver.id_table = ext->pci_tbl;
+	ext->driver.probe = saa7146_init_one;
+	ext->driver.remove = saa7146_remove_one;
+
+	printk("saa7146: register extension '%s'.\n",ext->name);
+	return pci_module_init(&ext->driver);
+}
+
+int saa7146_unregister_extension(struct saa7146_extension* ext)
+{
+	DEB_EE(("ext:%p\n",ext));
+	printk("saa7146: unregister extension '%s'.\n",ext->name);
+	pci_unregister_driver(&ext->driver);
+	return 0;
+}
+
+static
+int __init saa7146_init_module(void)
+{
+	if( 0 == initialized ) {
+		INIT_LIST_HEAD(&saa7146_devices);
+		init_MUTEX(&saa7146_devices_lock);
+		initialized = 1;
+	}
+	return 0;
+}
+
+static
+void __exit saa7146_cleanup_module(void)
+{
+}
+
+module_init(saa7146_init_module);
+module_exit(saa7146_cleanup_module);
+
+EXPORT_SYMBOL_GPL(saa7146_register_extension);
+EXPORT_SYMBOL_GPL(saa7146_unregister_extension);
+
+/* misc functions used by extension modules */
+EXPORT_SYMBOL_GPL(saa7146_pgtable_alloc);
+EXPORT_SYMBOL_GPL(saa7146_pgtable_free);
+EXPORT_SYMBOL_GPL(saa7146_pgtable_build_single);
+EXPORT_SYMBOL_GPL(saa7146_vmalloc_build_pgtable);
+
+EXPORT_SYMBOL_GPL(saa7146_setgpio);
+
+EXPORT_SYMBOL_GPL(saa7146_i2c_transfer);
+EXPORT_SYMBOL_GPL(saa7146_i2c_adapter_prepare);
+
+EXPORT_SYMBOL_GPL(saa7146_debug);
+EXPORT_SYMBOL_GPL(saa7146_devices);
+EXPORT_SYMBOL_GPL(saa7146_devices_lock);
+
+MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+MODULE_DESCRIPTION("driver for generic saa7146-based hardware");
+MODULE_LICENSE("GPL");
diff -Nru a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/saa7146_fops.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,493 @@
+#include <media/saa7146_vv.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME saa7146
+#endif
+
+#define BOARD_CAN_DO_VBI(dev)   (dev->revision != 0 && dev->vv_data->vbi_minor != -1) 
+
+/********************************************************************************/
+/* common dma functions */
+
+void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf)
+{
+	DEB_EE(("dev:%p, buf:%p\n",dev,buf));
+
+	if (in_interrupt())
+		BUG();
+
+	videobuf_waiton(&buf->vb,0,0);
+	videobuf_dma_pci_unmap(dev->pci, &buf->vb.dma);
+	videobuf_dma_free(&buf->vb.dma);
+	buf->vb.state = STATE_NEEDS_INIT;
+}
+
+
+/********************************************************************************/
+/* common buffer functions */
+
+int saa7146_buffer_queue(struct saa7146_dev *dev,
+			 struct saa7146_dmaqueue *q,
+			 struct saa7146_buf *buf)
+{
+#if DEBUG_SPINLOCKS
+	BUG_ON(!spin_is_locked(&dev->slock));
+#endif
+	DEB_EE(("dev:%p, dmaq:%p, buf:%p\n", dev, q, buf));
+
+	if( NULL == q ) {
+		ERR(("internal error: fatal NULL pointer for q.\n"));
+		return 0;
+	}
+
+	if (NULL == q->curr) {
+		q->curr = buf;
+		DEB_D(("immediately activating buffer %p\n", buf));
+		buf->activate(dev,buf,NULL);
+	} else {
+		list_add_tail(&buf->vb.queue,&q->queue);
+		buf->vb.state = STATE_QUEUED;
+		DEB_D(("adding buffer %p to queue. (active buffer present)\n", buf));
+	}
+	return 0;
+}
+
+void saa7146_buffer_finish(struct saa7146_dev *dev,
+			   struct saa7146_dmaqueue *q,
+			   int state)
+{
+#if DEBUG_SPINLOCKS
+	BUG_ON(!spin_is_locked(&dev->slock));
+#endif
+	if( NULL == q->curr ) {
+		ERR(("internal error: fatal NULL pointer for q->curr.\n"));
+		return;
+	}
+
+	DEB_EE(("dev:%p, dmaq:%p, state:%d\n", dev, q, state));
+
+	/* finish current buffer */
+	q->curr->vb.state = state;
+	do_gettimeofday(&q->curr->vb.ts);
+	wake_up(&q->curr->vb.done);
+
+	q->curr = NULL;
+}
+
+void saa7146_buffer_next(struct saa7146_dev *dev,
+			 struct saa7146_dmaqueue *q, int vbi)
+{
+	struct saa7146_buf *buf,*next = NULL;
+
+	if( NULL == q ) {
+		ERR(("internal error: fatal NULL pointer for q.\n"));
+		return;
+	}
+
+	DEB_EE(("dev:%p, dmaq:%p, vbi:%d\n", dev, q, vbi));
+
+#if DEBUG_SPINLOCKS
+	BUG_ON(!spin_is_locked(&dev->slock));
+#endif
+	if (!list_empty(&q->queue)) {
+		/* activate next one from queue */
+		buf = list_entry(q->queue.next,struct saa7146_buf,vb.queue);
+		list_del(&buf->vb.queue);
+		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));
+		buf->activate(dev,buf,next);
+	} else {
+		DEB_D(("no next buffer. stopping.\n"));
+		if( 0 != vbi ) {
+			/* turn off video-dma3 */
+			saa7146_write(dev,MC1, MASK_20);
+		} else {
+			/* nothing to do -- just prevent next video-dma1 transfer
+			   by lowering the protection address */
+
+			// fixme: fix this for vflip != 0
+
+			saa7146_write(dev, PROT_ADDR1, 0);
+			/* write the address of the rps-program */
+			saa7146_write(dev, RPS_ADDR0, virt_to_bus(&dev->rps0[ 0]));
+			/* turn on rps */
+			saa7146_write(dev, MC1, (MASK_12 | MASK_28));
+		}
+		del_timer(&q->timeout);
+	}
+}
+
+void saa7146_buffer_timeout(unsigned long data)
+{
+	struct saa7146_dmaqueue *q = (struct saa7146_dmaqueue*)data;
+	struct saa7146_dev *dev = q->dev;
+	unsigned long flags;
+
+	DEB_EE(("dev:%p, dmaq:%p\n", dev, q));
+
+	spin_lock_irqsave(&dev->slock,flags);
+	if (q->curr) {
+		DEB_D(("timeout on %p\n", q->curr));
+		saa7146_buffer_finish(dev,q,STATE_ERROR);
+	}
+
+	/* we don't restart the transfer here like other drivers do. when
+	   a streaming capture is disabled, the timeout function will be
+	   called for the current buffer. if we activate the next buffer now,
+	   we mess up our capture logic. if a timeout occurs on another buffer,
+	   then something is seriously broken before, so no need to buffer the
+	   next capture IMHO... */
+/*
+	saa7146_buffer_next(dev,q);
+*/
+	spin_unlock_irqrestore(&dev->slock,flags);
+}
+
+/********************************************************************************/
+/* file operations */
+
+static
+int fops_open(struct inode *inode, struct file *file)
+{
+	unsigned int minor = minor(inode->i_rdev);
+	struct saa7146_dev *h = NULL, *dev = NULL;
+	struct list_head *list;
+	struct saa7146_fh *fh = NULL;
+	int result = 0;
+
+	enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+
+	DEB_EE(("inode:%p, file:%p, minor:%d\n",inode,file,minor));
+
+	if (down_interruptible(&saa7146_devices_lock))
+		return -ERESTARTSYS;
+
+	list_for_each(list,&saa7146_devices) {
+		h = list_entry(list, struct saa7146_dev, item);
+		if( NULL == h->vv_data ) {
+			DEB_D(("device %p has not registered video devices.\n",h));
+			continue;
+		}
+		DEB_D(("trying: %p @ major %d,%d\n",h,h->vv_data->video_minor,h->vv_data->vbi_minor));
+
+		if (h->vv_data->video_minor == minor) {
+			dev = h;
+		}
+		if (h->vv_data->vbi_minor == minor) {
+			type = V4L2_BUF_TYPE_VBI_CAPTURE;
+			dev = h;
+		}
+	}
+	if (NULL == dev) {
+		DEB_S(("no such video device.\n"));
+		result = -ENODEV;
+		goto out;
+	}
+
+	DEB_D(("using: %p\n",dev));
+
+	/* check if an extension is registered */
+	if( NULL == dev->ext ) {
+		DEB_S(("no extension registered for this device.\n"));
+		result = -ENODEV;
+		goto out;
+	}
+
+	/* allocate per open data */
+	fh = kmalloc(sizeof(*fh),GFP_KERNEL);
+	if (NULL == fh) {
+		DEB_S(("cannot allocate memory for per open data.\n"));
+		result = -ENOMEM;
+		goto out;
+	}
+	memset(fh,0,sizeof(*fh));
+	
+	// FIXME: do we need to increase *our* usage count?
+
+	if( 0 == try_module_get(dev->ext->module)) {
+		result = -EINVAL;
+		goto out;
+	}
+
+	file->private_data = fh;
+	fh->dev = dev;
+	fh->type = type;
+
+	saa7146_video_uops.open(dev,fh);
+	if( 0 != BOARD_CAN_DO_VBI(dev) ) {
+		saa7146_vbi_uops.open(dev,fh);
+	}
+
+	result = 0;
+out:
+	if( fh != 0 && result != 0 ) {
+		kfree(fh);
+	}
+	up(&saa7146_devices_lock);
+        return result;
+}
+
+static int fops_release(struct inode *inode, struct file *file)
+{
+	struct saa7146_fh  *fh  = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+
+	DEB_EE(("inode:%p, file:%p\n",inode,file));
+
+	if (down_interruptible(&saa7146_devices_lock))
+		return -ERESTARTSYS;
+
+	saa7146_video_uops.release(dev,fh,file);
+	if( 0 != BOARD_CAN_DO_VBI(dev) ) {
+		saa7146_vbi_uops.release(dev,fh,file);
+	}
+
+	module_put(dev->ext->module);
+	file->private_data = NULL;
+	kfree(fh);
+
+	up(&saa7146_devices_lock);
+
+	return 0;
+}
+
+int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg);
+static int fops_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+{
+/*
+	DEB_EE(("inode:%p, file:%p, cmd:%d, arg:%li\n",inode, file, cmd, arg));
+*/
+	return video_usercopy(inode, file, cmd, arg, saa7146_video_do_ioctl);
+}
+
+static int fops_mmap(struct file *file, struct vm_area_struct * vma)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct videobuf_queue *q;
+
+	switch (fh->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
+		DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: file:%p, vma:%p\n",file, vma));
+		q = &fh->video_q;
+		break;
+		}
+	case V4L2_BUF_TYPE_VBI_CAPTURE: {
+		DEB_EE(("V4L2_BUF_TYPE_VBI_CAPTURE: file:%p, vma:%p\n",file, vma));
+		q = &fh->vbi_q;
+		break;
+		}
+	default:
+		BUG();
+		return 0;
+	}
+	return videobuf_mmap_mapper(vma,q);
+}
+
+static unsigned int fops_poll(struct file *file, struct poll_table_struct *wait)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct videobuf_buffer *buf = NULL;
+	struct videobuf_queue *q;
+
+	DEB_EE(("file:%p, poll:%p\n",file, wait));
+
+	if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) {
+		if( 0 == fh->vbi_q.streaming )
+			return videobuf_poll_stream(file, &fh->vbi_q, wait);
+		q = &fh->vbi_q;
+	} else {
+		q = &fh->video_q;
+	}
+
+	if (!list_empty(&q->stream))
+		buf = list_entry(q->stream.next, struct videobuf_buffer, stream);
+
+	if (!buf) {
+		return POLLERR;
+	}
+
+	poll_wait(file, &buf->done, wait);
+	if (buf->state == STATE_DONE || buf->state == STATE_ERROR) {
+		return POLLIN|POLLRDNORM;
+	}
+
+	return 0;
+}
+
+static ssize_t fops_read(struct file *file, char *data, size_t count, loff_t *ppos)
+{
+	struct saa7146_fh *fh = file->private_data;
+
+	switch (fh->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
+		DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: file:%p, data:%p, count:%d\n",file, data, count));
+		return saa7146_video_uops.read(file,data,count,ppos);
+		}
+	case V4L2_BUF_TYPE_VBI_CAPTURE: {
+		DEB_EE(("V4L2_BUF_TYPE_VBI_CAPTURE: file:%p, data:%p, count:%d\n",file, data, count));
+		return saa7146_vbi_uops.read(file,data,count,ppos);
+		}
+		break;
+	default:
+		BUG();
+		return 0;
+	}
+}
+
+static struct file_operations video_fops =
+{
+	.owner		= THIS_MODULE,
+	.open		= fops_open,
+	.release	= fops_release,
+	.read		= fops_read,
+	.poll		= fops_poll,
+	.mmap		= fops_mmap,
+	.ioctl		= fops_ioctl,
+	.llseek		= no_llseek,
+};
+
+void vv_callback(struct saa7146_dev *dev, unsigned long status)
+{
+	u32 isr = status;
+	
+	DEB_EE(("dev:%p, isr:0x%08x\n",dev,(u32)status));
+
+	if (0 != (isr & (MASK_27))) {
+		DEB_INT(("irq: RPS0 (0x%08x).\n",isr));
+		saa7146_video_uops.irq_done(dev,isr);
+	}
+
+	if (0 != (isr & (MASK_28))) {
+		u32 mc2 = saa7146_read(dev, MC2);
+		if( 0 != (mc2 & MASK_15)) {
+			DEB_INT(("irq: RPS1 vbi workaround (0x%08x).\n",isr));
+			wake_up(&dev->vv_data->vbi_wq);
+			saa7146_write(dev,MC2, MASK_31);
+			return;
+		}
+		DEB_INT(("irq: RPS1 (0x%08x).\n",isr));
+		saa7146_vbi_uops.irq_done(dev,isr);
+	}
+}
+
+static struct video_device device_template =
+{
+	.hardware	= VID_HARDWARE_SAA7146,
+	.fops		= &video_fops,
+	.minor		= -1,
+};
+
+int saa7146_vv_init(struct saa7146_dev* dev)
+{
+	struct saa7146_vv *vv = kmalloc (sizeof(struct saa7146_vv),GFP_KERNEL);
+	if( NULL == vv ) {
+		ERR(("out of memory. aborting.\n"));
+		return -1;
+	}
+	memset(vv, 0x0, sizeof(*vv));
+
+	DEB_EE(("dev:%p\n",dev));
+	
+	vv->video_minor = -1;
+	vv->vbi_minor = -1;
+
+	vv->clipping = (u32*)kmalloc(SAA7146_CLIPPING_MEM, GFP_KERNEL);
+	if( NULL == vv->clipping ) {
+		ERR(("out of memory. aborting.\n"));
+		kfree(vv);
+		return -1;
+	}
+	memset(vv->clipping, 0x0, SAA7146_CLIPPING_MEM);
+
+	saa7146_video_uops.init(dev,vv);
+	saa7146_vbi_uops.init(dev,vv);
+	
+	dev->vv_data = vv;
+	dev->vv_callback = &vv_callback;
+
+	return 0;
+}
+
+int saa7146_vv_release(struct saa7146_dev* dev)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+
+	DEB_EE(("dev:%p\n",dev));
+ 
+ 	kfree(vv);
+	dev->vv_data = NULL;
+	dev->vv_callback = NULL;
+	
+	return 0;
+}
+
+int saa7146_register_device(struct video_device *vid, struct saa7146_dev* dev, char *name, int type)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+
+	DEB_EE(("dev:%p, name:'%s'\n",dev,name));
+ 
+ 	*vid = device_template;
+	strncpy(vid->name, name, 32);
+	vid->priv = dev;
+
+	// fixme: -1 should be an insmod parameter *for the extension* (like "video_nr");
+	if (video_register_device(vid,type,-1) < 0) {
+		ERR(("cannot register vbi v4l2 device. skipping.\n"));
+		return -1;
+	}
+
+	if( VFL_TYPE_GRABBER == type ) {
+		vv->video_minor = vid->minor;
+		INFO(("%s: registered device video%d [v4l2]\n", dev->name,vid->minor & 0x1f));
+	} else {
+		vv->vbi_minor = vid->minor;
+		INFO(("%s: registered device vbi%d [v4l2]\n", dev->name,vid->minor & 0x1f));
+	}
+
+	return 0;
+}
+
+int saa7146_unregister_device(struct video_device *vid, struct saa7146_dev* dev)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	
+	DEB_EE(("dev:%p\n",dev));
+
+	if( VFL_TYPE_GRABBER == vid->type ) {
+		vv->video_minor = -1;
+	} else {
+		vv->vbi_minor = -1;
+	}
+	video_unregister_device(vid);
+
+	return 0;
+}
+
+static
+int __init saa7146_vv_init_module(void)
+{
+	return 0;
+}
+
+
+static
+void __exit saa7146_vv_cleanup_module(void)
+{
+}
+
+module_init(saa7146_vv_init_module);
+module_exit(saa7146_vv_cleanup_module);
+
+EXPORT_SYMBOL_GPL(saa7146_set_hps_source_and_sync);
+EXPORT_SYMBOL_GPL(saa7146_register_device);
+EXPORT_SYMBOL_GPL(saa7146_unregister_device);
+
+EXPORT_SYMBOL_GPL(saa7146_vv_init);
+EXPORT_SYMBOL_GPL(saa7146_vv_release);
+
+MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+MODULE_DESCRIPTION("video4linux driver for saa7146-based hardware");
+MODULE_LICENSE("GPL");
diff -Nru a/drivers/media/common/saa7146_hlp.c b/drivers/media/common/saa7146_hlp.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/saa7146_hlp.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,1043 @@
+#include <media/saa7146_vv.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME saa7146
+#endif
+
+#define my_min(type,x,y) \
+	({ type __x = (x), __y = (y); __x < __y ? __x: __y; })
+#define my_max(type,x,y) \
+	({ type __x = (x), __y = (y); __x > __y ? __x: __y; })
+
+static
+void calculate_output_format_register(struct saa7146_dev* saa, u32 palette, u32* clip_format)
+{
+	/* clear out the necessary bits */
+	*clip_format &= 0x0000ffff;	
+	/* set these bits new */
+	*clip_format |=  (( ((palette&0xf00)>>8) << 30) | ((palette&0x00f) << 24) | (((palette&0x0f0)>>4) << 16));
+}
+
+static
+void calculate_bcs_ctrl_register(struct saa7146_dev *dev, int brightness, int contrast, int colour, u32 *bcs_ctrl)
+{
+	*bcs_ctrl = ((brightness << 24) | (contrast << 16) | (colour <<  0));
+}
+
+static
+void calculate_hps_source_and_sync(struct saa7146_dev *dev, int source, int sync, u32* hps_ctrl)
+{
+	*hps_ctrl &= ~(MASK_30 | MASK_31 | MASK_28);
+	*hps_ctrl |= (source << 30) | (sync << 28);
+}
+
+static
+void calculate_hxo_and_hyo(struct saa7146_vv *vv, u32* hps_h_scale, u32* hps_ctrl)
+{
+	int hyo = 0, hxo = 0;
+
+	hyo = vv->standard->v_offset;
+	hxo = vv->standard->h_offset;
+				
+	*hps_h_scale	&= ~(MASK_B0 | 0xf00);
+	*hps_h_scale	|= (hxo <<  0);
+
+	*hps_ctrl	&= ~(MASK_W0 | MASK_B2);
+	*hps_ctrl	|= (hyo << 12);
+}
+
+/* helper functions for the calculation of the horizontal- and vertical
+   scaling registers, clip-format-register etc ...
+   these functions take pointers to the (most-likely read-out
+   original-values) and manipulate them according to the requested
+   changes.
+*/
+
+/* hps_coeff used for CXY and CXUV; scale 1/1 -> scale 1/64 */
+static struct {
+	u16 hps_coeff;
+	u16 weight_sum;
+} hps_h_coeff_tab [] = { 
+	{0x00,   2}, {0x02,   4}, {0x00,   4}, {0x06,   8}, {0x02,   8},
+	{0x08,   8}, {0x00,   8}, {0x1E,  16}, {0x0E,   8}, {0x26,   8},
+	{0x06,   8}, {0x42,   8}, {0x02,   8}, {0x80,   8}, {0x00,   8},
+	{0xFE,  16}, {0xFE,   8}, {0x7E,   8}, {0x7E,   8}, {0x3E,   8},
+	{0x3E,   8}, {0x1E,   8}, {0x1E,   8}, {0x0E,   8}, {0x0E,   8},
+	{0x06,   8}, {0x06,   8}, {0x02,   8}, {0x02,   8}, {0x00,   8},
+	{0x00,   8}, {0xFE,  16}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8},
+	{0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8},
+	{0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8},
+	{0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0x7E,   8},
+	{0x7E,   8}, {0x3E,   8}, {0x3E,   8}, {0x1E,   8}, {0x1E,   8},
+	{0x0E,   8}, {0x0E,   8}, {0x06,   8}, {0x06,   8}, {0x02,   8},
+	{0x02,   8}, {0x00,   8}, {0x00,   8}, {0xFE,  16}
+};
+
+/* table of attenuation values for horizontal scaling */
+u8 h_attenuation[] = { 1, 2, 4, 8, 2, 4, 8, 16, 0};
+
+/* calculate horizontal scale registers */
+static
+int calculate_h_scale_registers(struct saa7146_dev *dev,
+	int in_x, int out_x, int flip_lr,
+	u32* hps_ctrl, u32* hps_v_gain, u32* hps_h_prescale, u32* hps_h_scale)
+{
+	/* horizontal prescaler */
+	u32 dcgx = 0, xpsc = 0, xacm = 0, cxy = 0, cxuv = 0;	
+	/* horizontal scaler */
+	u32 xim = 0, xp = 0, xsci =0;				
+	/* vertical scale & gain */
+	u32 pfuv = 0;						
+
+	/* helper variables */
+	u32 h_atten = 0, i = 0;
+
+	if ( 0 == out_x ) {
+		return -EINVAL;
+	}
+	
+	/* mask out vanity-bit */
+	*hps_ctrl &= ~MASK_29;
+		
+	/* calculate prescale-(xspc)-value:	[n   .. 1/2) : 1
+				    		[1/2 .. 1/3) : 2
+				    		[1/3 .. 1/4) : 3
+						... 		*/
+	if (in_x > out_x) {
+		xpsc = in_x / out_x;
+	}
+	else {
+		/* zooming */
+		xpsc = 1;						
+	}
+	
+	/* if flip_lr-bit is set, number of pixels after
+	   horizontal prescaling must be < 384 */
+	if ( 0 != flip_lr ) {
+	
+		/* set vanity bit */
+		*hps_ctrl |= MASK_29;
+	
+		while (in_x / xpsc >= 384 )
+			xpsc++;
+	}
+	/* if zooming is wanted, number of pixels after
+	   horizontal prescaling must be < 768 */
+	else {
+		while ( in_x / xpsc >= 768 )
+			xpsc++;
+	}
+	
+	/* maximum prescale is 64 (p.69) */
+	if ( xpsc > 64 )
+		xpsc = 64;
+
+	/* keep xacm clear*/
+	xacm = 0;
+	
+	/* set horizontal filter parameters (CXY = CXUV) */
+	cxy = hps_h_coeff_tab[( (xpsc - 1) < 63 ? (xpsc - 1) : 63 )].hps_coeff;
+	cxuv = cxy;
+	
+	/* calculate and set horizontal fine scale (xsci) */
+	
+	/* bypass the horizontal scaler ? */
+	if ( (in_x == out_x) && ( 1 == xpsc ) )
+		xsci = 0x400;
+	else	
+		xsci = ( (1024 * in_x) / (out_x * xpsc) ) + xpsc;
+
+	/* set start phase for horizontal fine scale (xp) to 0 */	
+	xp = 0;
+	
+	/* set xim, if we bypass the horizontal scaler */
+	if ( 0x400 == xsci )
+		xim = 1;
+	else
+		xim = 0;
+		
+	/* if the prescaler is bypassed, enable horizontal
+	   accumulation mode (xacm) and clear dcgx */
+	if( 1 == xpsc ) {
+		xacm = 1;
+		dcgx = 0;
+	}
+	else {
+		xacm = 0;
+		/* get best match in the table of attenuations
+		   for horizontal scaling */
+		h_atten = hps_h_coeff_tab[( (xpsc - 1) < 63 ? (xpsc - 1) : 63 )].weight_sum;
+	
+		for (i = 0; h_attenuation[i] != 0; i++) {
+			if (h_attenuation[i] >= h_atten)
+				break;
+		}
+	
+		dcgx = i;
+	}
+
+	/* the horizontal scaling increment controls the UV filter
+	   to reduce the bandwith to improve the display quality,
+	   so set it ... */
+	if ( xsci == 0x400)
+		pfuv = 0x00;
+	else if ( xsci < 0x600)
+		pfuv = 0x01;
+	else if ( xsci < 0x680)
+		pfuv = 0x11;
+	else if ( xsci < 0x700)
+		pfuv = 0x22;
+	else
+		pfuv = 0x33;
+
+	
+	*hps_v_gain  &= MASK_W0|MASK_B2;
+	*hps_v_gain  |= (pfuv << 24);	
+
+	*hps_h_scale 	&= ~(MASK_W1 | 0xf000);
+	*hps_h_scale	|= (xim << 31) | (xp << 24) | (xsci << 12);
+
+	*hps_h_prescale	|= (dcgx << 27) | ((xpsc-1) << 18) | (xacm << 17) | (cxy << 8) | (cxuv << 0);
+
+	return 0;
+}
+
+static struct {
+	u16 hps_coeff;
+	u16 weight_sum;
+} hps_v_coeff_tab [] = { 
+ {0x0100,   2},  {0x0102,   4},  {0x0300,   4},  {0x0106,   8},  {0x0502,   8},
+ {0x0708,   8},  {0x0F00,   8},  {0x011E,  16},  {0x110E,  16},  {0x1926,  16},
+ {0x3906,  16},  {0x3D42,  16},  {0x7D02,  16},  {0x7F80,  16},  {0xFF00,  16},
+ {0x01FE,  32},  {0x01FE,  32},  {0x817E,  32},  {0x817E,  32},  {0xC13E,  32},
+ {0xC13E,  32},  {0xE11E,  32},  {0xE11E,  32},  {0xF10E,  32},  {0xF10E,  32},
+ {0xF906,  32},  {0xF906,  32},  {0xFD02,  32},  {0xFD02,  32},  {0xFF00,  32},
+ {0xFF00,  32},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},
+ {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},
+ {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},
+ {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x817E,  64},
+ {0x817E,  64},  {0xC13E,  64},  {0xC13E,  64},  {0xE11E,  64},  {0xE11E,  64},
+ {0xF10E,  64},  {0xF10E,  64},  {0xF906,  64},  {0xF906,  64},  {0xFD02,  64},
+ {0xFD02,  64},  {0xFF00,  64},  {0xFF00,  64},  {0x01FE, 128}
+};
+
+/* table of attenuation values for vertical scaling */
+u16 v_attenuation[] = { 2, 4, 8, 16, 32, 64, 128, 256, 0};
+
+/* calculate vertical scale registers */
+static
+int calculate_v_scale_registers(struct saa7146_dev *dev, enum v4l2_field field,
+	int in_y, int out_y, u32* hps_v_scale, u32* hps_v_gain)
+{
+	int lpi = 0;
+	
+	/* vertical scaling */
+	u32 yacm = 0, ysci = 0, yacl = 0, ypo = 0, ype = 0;
+	/* vertical scale & gain */
+	u32 dcgy = 0, cya_cyb = 0;
+				
+	/* helper variables */
+	u32 v_atten = 0, i = 0;	
+
+	/* error, if vertical zooming */
+	if ( in_y < out_y ) {
+		return -EINVAL;
+	}
+
+	/* linear phase interpolation may be used
+	   if scaling is between 1 and 1/2 (both fields used)
+	   or scaling is between 1/2 and 1/4 (if only one field is used) */
+
+	if (V4L2_FIELD_HAS_BOTH(field)) {
+		if( 2*out_y >= in_y) {
+			lpi = 1;
+		}
+	} else if (field == V4L2_FIELD_TOP || field == V4L2_FIELD_BOTTOM) {
+		if( 4*out_y >= in_y ) {
+			lpi = 1;
+		}
+		out_y *= 2;
+	}
+	if( 0 != lpi ) {
+
+		yacm = 0;
+		yacl = 0;
+		cya_cyb = 0x00ff;
+		
+		/* calculate scaling increment */
+		if ( in_y > out_y )
+			ysci = ((1024 * in_y) / (out_y + 1)) - 1024;
+		else
+			ysci = 0;
+
+		dcgy = 0;
+
+		/* calculate ype and ypo */
+		ype = ysci / 16;
+		ypo = ype + (ysci / 64);
+		
+	}
+	else {
+		yacm = 1;	
+
+		/* calculate scaling increment */
+		ysci = (((10 * 1024 * (in_y - out_y - 1)) / in_y) + 9) / 10;
+
+		/* calculate ype and ypo */
+		ypo = ype = ((ysci + 15) / 16);
+
+		/* the sequence length interval (yacl) has to be set according
+		   to the prescale value, e.g.	[n   .. 1/2) : 0
+		   				[1/2 .. 1/3) : 1
+						[1/3 .. 1/4) : 2
+						... */
+		if ( ysci < 512) {
+			yacl = 0;
+		}
+		else {
+			yacl = ( ysci / (1024 - ysci) );
+		}
+
+		/* get filter coefficients for cya, cyb from table hps_v_coeff_tab */	
+		cya_cyb = hps_v_coeff_tab[ (yacl < 63 ? yacl : 63 ) ].hps_coeff;
+
+		/* get best match in the table of attenuations for vertical scaling */
+		v_atten = hps_v_coeff_tab[ (yacl < 63 ? yacl : 63 ) ].weight_sum;
+
+		for (i = 0; v_attenuation[i] != 0; i++) {
+			if (v_attenuation[i] >= v_atten)
+				break;
+		}
+	
+		dcgy = i;
+	}
+
+	/* ypo and ype swapped in spec ? */
+	*hps_v_scale	|= (yacm << 31) | (ysci << 21) | (yacl << 15) | (ypo << 8 ) | (ype << 1);
+
+	*hps_v_gain	&= ~(MASK_W0|MASK_B2);
+	*hps_v_gain	|= (dcgy << 16) | (cya_cyb << 0);
+
+	return 0;
+}
+
+/* simple bubble-sort algorithm with duplicate elimination */
+static
+int sort_and_eliminate(u32* values, int* count)
+{
+	int low = 0, high = 0, top = 0, temp = 0;
+	int cur = 0, next = 0;
+	
+	/* sanity checks */
+	if( (0 > *count) || (NULL == values) ) {
+		return -EINVAL;
+	}
+	
+	/* bubble sort the first ´count´ items of the array ´values´ */
+	for( top = *count; top > 0; top--) {
+		for( low = 0, high = 1; high < top; low++, high++) {
+			if( values[low] > values[high] ) {
+				temp = values[low];
+				values[low] = values[high];
+				values[high] = temp;
+			}
+		}
+	}
+
+	/* remove duplicate items */
+	for( cur = 0, next = 1; next < *count; next++) {
+		if( values[cur] != values[next])
+			values[++cur] = values[next];
+	}
+	
+	*count = cur + 1;
+	 
+	return 0;
+}
+
+static
+void calculate_clipping_registers_rect(struct saa7146_dev *dev, struct saa7146_fh *fh,
+	struct saa7146_video_dma *vdma2, u32* clip_format, u32* arbtr_ctrl, enum v4l2_field field)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	u32 *clipping = vv->clipping;
+
+	int width = fh->ov.win.w.width;
+	int height =  fh->ov.win.w.height;
+	int clipcount = fh->ov.nclips;
+	
+	u32 line_list[32];			
+	u32 pixel_list[32];
+	int numdwords = 0;
+
+	int i = 0, j = 0;
+	int cnt_line = 0, cnt_pixel = 0;
+
+	int x[32], y[32], w[32], h[32];
+
+	/* clear out memory */
+	memset(&line_list[0],  0x00, sizeof(u32)*32);
+	memset(&pixel_list[0], 0x00, sizeof(u32)*32);
+	memset(clipping,  0x00, SAA7146_CLIPPING_MEM);
+
+	/* fill the line and pixel-lists */
+	for(i = 0; i < clipcount; i++) {
+		int l = 0, r = 0, t = 0, b = 0;
+		
+		x[i] = fh->ov.clips[i].c.left;
+		y[i] = fh->ov.clips[i].c.top;
+		w[i] = fh->ov.clips[i].c.width;
+		h[i] = fh->ov.clips[i].c.height;
+		
+		if( w[i] < 0) {
+			x[i] += w[i]; w[i] = -w[i];
+		}
+		if( h[i] < 0) {
+			y[i] += h[i]; h[i] = -h[i];
+		}
+		if( x[i] < 0) {
+			w[i] += x[i]; x[i] = 0;
+		}
+		if( y[i] < 0) {
+			h[i] += y[i]; y[i] = 0;
+		}	
+		if( 0 != vv->vflip ) {
+			y[i] = height - y[i] - h[i];
+		}
+
+		l = x[i];
+		r = x[i]+w[i];
+		t = y[i];
+		b = y[i]+h[i];
+		
+		/* insert left/right coordinates */
+		pixel_list[ 2*i   ] = my_min(int, l, width);
+		pixel_list[(2*i)+1] = my_min(int, r, width);
+		/* insert top/bottom coordinates */
+		line_list[ 2*i   ] = my_min(int, t, height);
+		line_list[(2*i)+1] = my_min(int, b, height);
+	}
+
+	/* sort and eliminate lists */
+	cnt_line = cnt_pixel = 2*clipcount;
+	sort_and_eliminate( &pixel_list[0], &cnt_pixel );
+	sort_and_eliminate( &line_list[0], &cnt_line );
+
+	/* calculate the number of used u32s */
+	numdwords = my_max(int, (cnt_line+1), (cnt_pixel+1))*2; 
+	numdwords = my_max(int, 4, numdwords);
+	numdwords = my_min(int, 64, numdwords);
+
+	/* fill up cliptable */
+	for(i = 0; i < cnt_pixel; i++) {
+		clipping[2*i] |= (pixel_list[i] << 16);
+	}
+	for(i = 0; i < cnt_line; i++) {
+		clipping[(2*i)+1] |= (line_list[i] << 16);
+	}
+
+	/* fill up cliptable with the display infos */
+	for(j = 0; j < clipcount; j++) {
+
+		for(i = 0; i < cnt_pixel; i++) {
+
+			if( x[j] < 0)
+				x[j] = 0;
+
+			if( pixel_list[i] < (x[j] + w[j])) {
+			
+				if ( pixel_list[i] >= x[j] ) {
+					clipping[2*i] |= (1 << j);			
+				}
+			}
+		}
+		for(i = 0; i < cnt_line; i++) {
+
+			if( y[j] < 0)
+				y[j] = 0;
+
+			if( line_list[i] < (y[j] + h[j]) ) {
+
+				if( line_list[i] >= y[j] ) {
+					clipping[(2*i)+1] |= (1 << j);			
+				}
+			}
+		}
+	}
+
+	/* adjust arbitration control register */
+	*arbtr_ctrl &= 0xffff00ff;
+	*arbtr_ctrl |= 0x00001c00;	
+	
+	vdma2->base_even	= virt_to_bus(clipping);
+	vdma2->base_odd		= virt_to_bus(clipping);
+	vdma2->prot_addr	= virt_to_bus(clipping)+((sizeof(u32))*(numdwords));
+	vdma2->base_page	= 0x04;
+	vdma2->pitch		= 0x00;
+	vdma2->num_line_byte	= (0 << 16 | (sizeof(u32))*(numdwords-1) );
+
+	/* set clipping-mode. this depends on the field(s) used */
+	*clip_format &= 0xfffffff7;
+	if (V4L2_FIELD_HAS_BOTH(field)) {
+		*clip_format |= 0x00000008;
+	} else if (field == V4L2_FIELD_TOP) {
+		*clip_format |= 0x00000000;
+	} else if (field == V4L2_FIELD_BOTTOM) {
+		*clip_format |= 0x00000000;
+	}
+}
+
+/* disable clipping */
+static
+void saa7146_disable_clipping(struct saa7146_dev *dev)
+{
+	u32 clip_format	= saa7146_read(dev, CLIP_FORMAT_CTRL);
+
+	/* mask out relevant bits (=lower word)*/
+	clip_format &= MASK_W1;
+
+	/* upload clipping-registers*/
+	saa7146_write(dev, CLIP_FORMAT_CTRL,clip_format);
+ 	saa7146_write(dev, MC2, (MASK_05 | MASK_21));
+ 
+ 	/* disable video dma2 */
+	saa7146_write(dev, MC1, (MASK_21));
+}
+
+static
+void saa7146_set_clipping_rect(struct saa7146_dev *dev, struct saa7146_fh *fh)
+{
+	enum v4l2_field field = fh->ov.win.field;
+	int clipcount = fh->ov.nclips;
+	
+	struct	saa7146_video_dma vdma2;
+
+	u32 clip_format	= saa7146_read(dev, CLIP_FORMAT_CTRL);
+	u32 arbtr_ctrl	= saa7146_read(dev, PCI_BT_V1);
+
+	// fixme: is this used at all? SAA7146_CLIPPING_RECT_INVERTED;
+	u32 type = SAA7146_CLIPPING_RECT;
+
+	/* check clipcount, disable clipping if clipcount == 0*/
+	if( clipcount == 0 ) {
+		saa7146_disable_clipping(dev);
+		return;
+	}
+
+	calculate_clipping_registers_rect(dev, fh, &vdma2, &clip_format, &arbtr_ctrl, field);
+
+	/* set clipping format */
+	clip_format &= 0xffff0008;
+	clip_format |= (type << 4);
+
+	/* prepare video dma2 */
+	saa7146_write(dev, BASE_EVEN2,		vdma2.base_even);
+	saa7146_write(dev, BASE_ODD2,		vdma2.base_odd);
+	saa7146_write(dev, PROT_ADDR2,		vdma2.prot_addr);
+	saa7146_write(dev, BASE_PAGE2,		vdma2.base_page);
+	saa7146_write(dev, PITCH2,		vdma2.pitch);
+	saa7146_write(dev, NUM_LINE_BYTE2,	vdma2.num_line_byte);
+	
+	/* prepare the rest */
+	saa7146_write(dev, CLIP_FORMAT_CTRL,clip_format);
+	saa7146_write(dev, PCI_BT_V1, arbtr_ctrl);	
+
+	/* upload clip_control-register, clipping-registers, enable video dma2 */
+	saa7146_write(dev, MC2, (MASK_05 | MASK_21 | MASK_03 | MASK_19));
+	saa7146_write(dev, MC1, (MASK_05 | MASK_21));
+}
+
+static
+void saa7146_set_window(struct saa7146_dev *dev, int width, int height, enum v4l2_field field)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+
+	int source = vv->current_hps_source;
+	int sync = vv->current_hps_sync;
+
+	u32 hps_v_scale = 0, hps_v_gain  = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0;
+
+	/* set vertical scale */
+	hps_v_scale = 0; /* all bits get set by the function-call */
+	hps_v_gain  = 0; /* fixme: saa7146_read(dev, HPS_V_GAIN);*/ 
+	calculate_v_scale_registers(dev, field, vv->standard->v_calc, height, &hps_v_scale, &hps_v_gain);
+
+	/* set horizontal scale */
+	hps_ctrl 	= 0;
+	hps_h_prescale	= 0; /* all bits get set in the function */
+	hps_h_scale	= 0;
+	calculate_h_scale_registers(dev, vv->standard->h_calc, width, vv->hflip, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale);
+
+	/* set hyo and hxo */
+	calculate_hxo_and_hyo(vv, &hps_h_scale, &hps_ctrl);
+	calculate_hps_source_and_sync(dev, source, sync, &hps_ctrl);
+	
+	/* write out new register contents */
+	saa7146_write(dev, HPS_V_SCALE,	hps_v_scale);
+	saa7146_write(dev, HPS_V_GAIN,	hps_v_gain);
+	saa7146_write(dev, HPS_CTRL,	hps_ctrl);
+	saa7146_write(dev, HPS_H_PRESCALE,hps_h_prescale);
+	saa7146_write(dev, HPS_H_SCALE,	hps_h_scale);
+	
+	/* upload shadow-ram registers */
+      	saa7146_write(dev, MC2, (MASK_05 | MASK_06 | MASK_21 | MASK_22) );
+}
+
+/* calculate the new memory offsets for a desired position */
+static
+void saa7146_set_position(struct saa7146_dev *dev, int w_x, int w_y, int w_height, enum v4l2_field field)
+{	
+	struct saa7146_vv *vv = dev->vv_data;
+
+	int b_depth = vv->ov_fmt->depth;
+	int b_bpl = vv->ov_fb.fmt.bytesperline;
+	u32 base = (u32)vv->ov_fb.base;
+	
+	struct	saa7146_video_dma vdma1;
+
+	/* calculate memory offsets for picture, look if we shall top-down-flip */
+	vdma1.pitch	= 2*b_bpl;
+	if ( 0 == vv->vflip ) {
+		vdma1.base_even = (u32)base + (w_y * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); 
+		vdma1.base_odd  = vdma1.base_even + (vdma1.pitch / 2);
+		vdma1.prot_addr = vdma1.base_even + (w_height * (vdma1.pitch / 2));
+	}
+	else {
+		vdma1.base_even = (u32)base + ((w_y+w_height) * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); 
+		vdma1.base_odd  = vdma1.base_even - (vdma1.pitch / 2);
+		vdma1.prot_addr = vdma1.base_odd - (w_height * (vdma1.pitch / 2));
+	}
+	
+	if (V4L2_FIELD_HAS_BOTH(field)) {
+	} else if (field == V4L2_FIELD_TOP) {
+		vdma1.base_odd = vdma1.prot_addr;
+		vdma1.pitch /= 2;
+	} else if (field == V4L2_FIELD_BOTTOM) {
+		vdma1.base_odd = vdma1.base_even;
+		vdma1.base_even = vdma1.prot_addr;
+		vdma1.pitch /= 2;
+	}
+
+	if ( 0 != vv->vflip ) {
+		vdma1.pitch *= -1;
+	}
+		
+	vdma1.base_page = 0;
+	vdma1.num_line_byte = (vv->standard->v_field<<16)+vv->standard->h_pixels;
+
+	saa7146_write_out_dma(dev, 1, &vdma1);
+}
+
+static
+void saa7146_set_output_format(struct saa7146_dev *dev, unsigned long palette)
+{
+	u32 clip_format = saa7146_read(dev, CLIP_FORMAT_CTRL);
+	
+	/* call helper function */
+	calculate_output_format_register(dev,palette,&clip_format);
+
+	/* update the hps registers */
+	saa7146_write(dev, CLIP_FORMAT_CTRL, clip_format);
+      	saa7146_write(dev, MC2, (MASK_05 | MASK_21));
+}
+
+void saa7146_set_picture_prop(struct saa7146_dev *dev, int brightness, int contrast, int colour)
+{
+	u32	bcs_ctrl = 0;
+	
+	calculate_bcs_ctrl_register(dev, brightness, contrast, colour, &bcs_ctrl);
+	saa7146_write(dev, BCS_CTRL, bcs_ctrl);
+	
+	/* update the bcs register */
+      	saa7146_write(dev, MC2, (MASK_06 | MASK_22));
+}
+
+
+/* select input-source */
+void saa7146_set_hps_source_and_sync(struct saa7146_dev *dev, int source, int sync)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	u32 hps_ctrl = 0;
+
+	/* read old state */
+	hps_ctrl = saa7146_read(dev, HPS_CTRL);
+
+	hps_ctrl &= ~( MASK_31 | MASK_30 | MASK_28 );
+	hps_ctrl |= (source << 30) | (sync << 28);
+
+	/* write back & upload register */
+	saa7146_write(dev, HPS_CTRL, hps_ctrl);
+	saa7146_write(dev, MC2, (MASK_05 | MASK_21));
+	
+	vv->current_hps_source = source;
+	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)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+
+	/* enable ? */
+	if( 0 == v) {
+		/* disable video dma1 */
+      		saa7146_write(dev, MC1, MASK_22);
+		return;
+	}
+
+	saa7146_set_window(dev, fh->ov.win.w.width, fh->ov.win.w.height, fh->ov.win.field);
+	saa7146_set_position(dev, fh->ov.win.w.left, fh->ov.win.w.top, fh->ov.win.w.height, fh->ov.win.field);
+	saa7146_set_output_format(dev, vv->ov_fmt->trans);
+	saa7146_set_clipping_rect(dev, fh);
+
+	/* enable video dma1 */
+	saa7146_write(dev, MC1, (MASK_06 | MASK_22));
+}		
+
+void saa7146_write_out_dma(struct saa7146_dev* dev, int which, struct saa7146_video_dma* vdma) 
+{
+	int where = 0;
+	
+	if( which < 1 || which > 3) {
+		return;
+	}
+	
+	/* calculate starting address */
+	where  = (which-1)*0x18;
+
+	if( 0 != (dev->ext->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);
+	saa7146_write(dev, where+0x14,	vdma->num_line_byte);
+	
+	/* upload */
+	saa7146_write(dev, MC2, (MASK_02<<(which-1))|(MASK_18<<(which-1)));		
+/*		
+	printk("vdma%d.base_even:     0x%08x\n", which,vdma->base_even);
+	printk("vdma%d.base_odd:      0x%08x\n", which,vdma->base_odd);
+	printk("vdma%d.prot_addr:     0x%08x\n", which,vdma->prot_addr);
+	printk("vdma%d.base_page:     0x%08x\n", which,vdma->base_page);
+	printk("vdma%d.pitch:         0x%08x\n", which,vdma->pitch);
+	printk("vdma%d.num_line_byte: 0x%08x\n", which,vdma->num_line_byte);
+*/
+}
+static
+int calculate_video_dma_grab_packed(struct saa7146_dev* dev, struct saa7146_buf *buf)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	struct saa7146_video_dma vdma1;
+
+	struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
+
+	int width = buf->fmt->width;
+	int height = buf->fmt->height;
+	enum v4l2_field field = buf->fmt->field;
+
+	int depth = sfmt->depth;
+
+	DEB_CAP(("[size=%dx%d,fields=%s]\n",
+		width,height,v4l2_field_names[field]));
+
+	vdma1.pitch		= (width*depth*2)/8;
+	vdma1.num_line_byte	= ((vv->standard->v_field<<16) + vv->standard->h_pixels);
+	vdma1.base_page		= buf->pt[0].dma | ME1;
+	
+	if( 0 != vv->vflip ) {
+		vdma1.prot_addr	= buf->pt[0].offset;
+		vdma1.base_even	= buf->pt[0].offset+(vdma1.pitch/2)*height;
+		vdma1.base_odd	= vdma1.base_even - (vdma1.pitch/2);
+	} else {
+		vdma1.base_even	= buf->pt[0].offset;
+		vdma1.base_odd	= vdma1.base_even + (vdma1.pitch/2);
+		vdma1.prot_addr	= buf->pt[0].offset+(vdma1.pitch/2)*height;
+	}
+
+	if (V4L2_FIELD_HAS_BOTH(field)) {
+	} else if (field == V4L2_FIELD_TOP) {
+		vdma1.base_odd	= vdma1.prot_addr;
+		vdma1.pitch /= 2;
+	} else if (field == V4L2_FIELD_BOTTOM) {
+		vdma1.base_odd	= vdma1.base_even;
+		vdma1.base_even = vdma1.prot_addr;
+		vdma1.pitch /= 2;
+	}
+
+	if( 0 != vv->vflip ) {
+		vdma1.pitch *= -1;
+	}	
+
+	saa7146_write_out_dma(dev, 1, &vdma1);
+	return 0;
+}
+
+static
+int calc_planar_422(struct saa7146_vv *vv, struct saa7146_buf *buf, struct saa7146_video_dma *vdma2, struct saa7146_video_dma *vdma3)
+{
+	int height = buf->fmt->height;
+	int width = buf->fmt->width;
+
+	vdma2->pitch	= width;
+	vdma3->pitch	= width;
+
+	if( 0 != vv->vflip ) {
+		vdma2->prot_addr	= buf->pt[1].offset;
+		vdma2->base_even	= ((vdma2->pitch/2)*height)+buf->pt[1].offset;
+		vdma2->base_odd		= vdma2->base_even - (vdma2->pitch/2);
+
+		vdma3->prot_addr	= buf->pt[2].offset;
+		vdma3->base_even	= ((vdma3->pitch/2)*height)+buf->pt[2].offset;
+		vdma3->base_odd		= vdma3->base_even - (vdma3->pitch/2);
+
+	} else {
+		vdma3->base_even	= buf->pt[2].offset;
+		vdma3->base_odd		= vdma3->base_even + (vdma3->pitch/2);
+		vdma3->prot_addr	= (vdma3->pitch/2)*height+buf->pt[2].offset;
+		
+		vdma2->base_even	= buf->pt[1].offset;
+		vdma2->base_odd		= vdma2->base_even + (vdma2->pitch/2);
+		vdma2->prot_addr	= (vdma2->pitch/2)*height+buf->pt[1].offset;
+	}
+
+	return 0;
+}
+
+static
+int calc_planar_420(struct saa7146_vv *vv, struct saa7146_buf *buf, struct saa7146_video_dma *vdma2, struct saa7146_video_dma *vdma3)
+{
+	int height = buf->fmt->height;
+	int width = buf->fmt->width;
+
+	vdma2->pitch	= width/2;
+	vdma3->pitch	= width/2;
+
+	if( 0 != vv->vflip ) {
+		vdma2->prot_addr	= buf->pt[2].offset;
+		vdma2->base_even	= ((vdma2->pitch/2)*height)+buf->pt[2].offset;
+		vdma2->base_odd		= vdma2->base_even - (vdma2->pitch/2);
+
+		vdma3->prot_addr	= buf->pt[1].offset;
+		vdma3->base_even	= ((vdma3->pitch/2)*height)+buf->pt[1].offset;
+		vdma3->base_odd		= vdma3->base_even - (vdma3->pitch/2);
+
+	} else {
+		vdma3->base_even	= buf->pt[2].offset;
+		vdma3->base_odd		= vdma3->base_even + (vdma3->pitch);
+		vdma3->prot_addr	= (vdma3->pitch/2)*height+buf->pt[2].offset;
+
+		vdma2->base_even	= buf->pt[1].offset;
+		vdma2->base_odd		= vdma2->base_even + (vdma2->pitch);
+		vdma2->prot_addr	= (vdma2->pitch/2)*height+buf->pt[1].offset;
+	}
+	return 0;
+}
+
+
+static
+int calculate_video_dma_grab_planar(struct saa7146_dev* dev, struct saa7146_buf *buf)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	struct saa7146_video_dma vdma1;
+	struct saa7146_video_dma vdma2;
+	struct saa7146_video_dma vdma3;
+
+	struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
+
+	int width = buf->fmt->width;
+	int height = buf->fmt->height;
+	enum v4l2_field field = buf->fmt->field;
+
+	BUG_ON(0 == buf->pt[0].dma);
+	BUG_ON(0 == buf->pt[1].dma);
+	BUG_ON(0 == buf->pt[2].dma);
+
+	DEB_CAP(("[size=%dx%d,fields=%s]\n",
+		width,height,v4l2_field_names[field]));
+
+	/* fixme: what happens for user space buffers here?. The offsets are
+	   most likely wrong, this version here only works for page-aligned
+	   buffers, modifications to the pagetable-functions are necessary...*/
+
+	vdma1.pitch		= width*2;
+	vdma1.num_line_byte	= ((vv->standard->v_field<<16) + vv->standard->h_pixels);
+	vdma1.base_page		= buf->pt[0].dma | ME1;
+
+	if( 0 != vv->vflip ) {
+		vdma1.prot_addr	= buf->pt[0].offset;
+		vdma1.base_even	= ((vdma1.pitch/2)*height)+buf->pt[0].offset;
+		vdma1.base_odd	= vdma1.base_even - (vdma1.pitch/2);
+	} else {
+		vdma1.base_even	= buf->pt[0].offset;
+		vdma1.base_odd	= vdma1.base_even + (vdma1.pitch/2);
+		vdma1.prot_addr	= (vdma1.pitch/2)*height+buf->pt[0].offset;
+	}
+
+	vdma2.num_line_byte	= 0; /* unused */
+	vdma2.base_page		= buf->pt[1].dma | ME1;
+
+	vdma3.num_line_byte	= 0; /* unused */
+	vdma3.base_page		= buf->pt[2].dma | ME1;
+
+	switch( sfmt->depth ) {
+		case 12: {
+			calc_planar_420(vv,buf,&vdma2,&vdma3);
+			break;
+		}
+		case 16: {
+			calc_planar_422(vv,buf,&vdma2,&vdma3);
+			break;
+		}
+		default: {
+			return -1;
+		}
+	}
+
+	if (V4L2_FIELD_HAS_BOTH(field)) {
+	} else if (field == V4L2_FIELD_TOP) {
+		vdma1.base_odd	= vdma1.prot_addr;
+		vdma1.pitch /= 2;
+		vdma2.base_odd	= vdma2.prot_addr;
+		vdma2.pitch /= 2;
+		vdma3.base_odd	= vdma3.prot_addr;
+		vdma3.pitch /= 2;
+	} else if (field == V4L2_FIELD_BOTTOM) {
+		vdma1.base_odd	= vdma1.base_even;
+		vdma1.base_even = vdma1.prot_addr;
+		vdma1.pitch /= 2;
+		vdma2.base_odd	= vdma2.base_even;
+		vdma2.base_even = vdma2.prot_addr;
+		vdma2.pitch /= 2;
+		vdma3.base_odd	= vdma3.base_even;
+		vdma3.base_even = vdma3.prot_addr;
+		vdma3.pitch /= 2;
+	}
+
+	if( 0 != vv->vflip ) {
+		vdma1.pitch *= -1;
+		vdma2.pitch *= -1;
+		vdma3.pitch *= -1;
+	}	
+
+	saa7146_write_out_dma(dev, 1, &vdma1);
+	if( sfmt->swap != 0 ) {
+		saa7146_write_out_dma(dev, 3, &vdma2);
+		saa7146_write_out_dma(dev, 2, &vdma3);
+	} else {
+		saa7146_write_out_dma(dev, 2, &vdma2);
+		saa7146_write_out_dma(dev, 3, &vdma3);
+	}
+	return 0;
+}
+
+static
+void program_capture_engine(struct saa7146_dev *dev, int planar)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	int count = 0;
+
+	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;
+
+	/* write beginning of rps-program */
+	count = 0;
+
+	/* wait for o_fid_a/b / e_fid_a/b toggle only if bit 0 is not set*/
+	dev->rps0[ count++ ] = CMD_PAUSE | CMD_OAN | CMD_SIG0 | e_wait;
+	dev->rps0[ count++ ] = CMD_PAUSE | CMD_OAN | CMD_SIG0 | o_wait;
+
+	/* set bit 0 */
+	dev->rps0[ count++ ] = CMD_WR_REG | (1 << 8) | (MC2/4); 	
+	dev->rps0[ count++ ] = MASK_27 | MASK_11;
+	
+	/* turn on video-dma1 */
+	dev->rps0[ count++ ] = CMD_WR_REG_MASK | (MC1/4);		
+	dev->rps0[ count++ ] = MASK_06 | MASK_22;	    		/* => mask */
+	dev->rps0[ count++ ] = MASK_06 | MASK_22;			/* => values */
+	if( 0 != planar ) {
+		/* turn on video-dma2 */
+		dev->rps0[ count++ ] = CMD_WR_REG_MASK | (MC1/4);		
+		dev->rps0[ count++ ] = MASK_05 | MASK_21;	    		/* => mask */
+		dev->rps0[ count++ ] = MASK_05 | MASK_21;			/* => values */
+
+		/* turn on video-dma3 */
+		dev->rps0[ count++ ] = CMD_WR_REG_MASK | (MC1/4);		
+		dev->rps0[ count++ ] = MASK_04 | MASK_20;	    		/* => mask */
+		dev->rps0[ count++ ] = MASK_04 | MASK_20;			/* => values */
+	}
+	
+	/* wait for o_fid_a/b / e_fid_a/b toggle */
+	dev->rps0[ count++ ] = CMD_PAUSE | e_wait;
+	dev->rps0[ count++ ] = CMD_PAUSE | o_wait;
+
+	/* turn off video-dma1 */
+	dev->rps0[ count++ ] = CMD_WR_REG_MASK | (MC1/4);
+	dev->rps0[ count++ ] = MASK_22 | MASK_06;	    		/* => mask */
+	dev->rps0[ count++ ] = MASK_22;					/* => values */
+	if( 0 != planar ) {
+		/* turn off video-dma2 */
+		dev->rps0[ count++ ] = CMD_WR_REG_MASK | (MC1/4);		
+		dev->rps0[ count++ ] = MASK_05 | MASK_21;	    		/* => mask */
+		dev->rps0[ count++ ] = MASK_21;					/* => values */
+
+		/* turn off video-dma3 */
+		dev->rps0[ count++ ] = CMD_WR_REG_MASK | (MC1/4);		
+		dev->rps0[ count++ ] = MASK_04 | MASK_20;	    		/* => mask */
+		dev->rps0[ count++ ] = MASK_20;					/* => values */
+	}
+
+	/* generate interrupt */
+	dev->rps0[ count++ ] = CMD_INTERRUPT;					
+
+	/* stop */
+	dev->rps0[ count++ ] = CMD_STOP;					
+}
+
+void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next)
+{
+	struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
+
+	DEB_CAP(("buf:%p, next:%p\n",buf,next));
+
+	saa7146_set_window(dev, buf->fmt->width, buf->fmt->height, buf->fmt->field);
+	saa7146_set_output_format(dev, sfmt->trans);
+	saa7146_disable_clipping(dev);
+
+	if( 0 != IS_PLANAR(sfmt->trans)) {
+		calculate_video_dma_grab_planar(dev, buf);
+		program_capture_engine(dev,1);
+	} else {
+		calculate_video_dma_grab_packed(dev, buf);
+		program_capture_engine(dev,0);
+	}
+
+	/* write the address of the rps-program */
+	saa7146_write(dev, RPS_ADDR0, virt_to_bus(&dev->rps0[ 0]));
+
+	/* turn on rps */
+	saa7146_write(dev, MC1, (MASK_12 | MASK_28));	
+}
+
diff -Nru a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/saa7146_i2c.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,424 @@
+#include <media/saa7146_vv.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME saa7146
+#endif
+
+/* helper function */
+static
+void my_wait(struct saa7146_dev *dev, long ms)
+{
+	set_current_state(TASK_INTERRUPTIBLE);
+	schedule_timeout((((ms+10)/10)*HZ)/1000);
+}
+
+u32 saa7146_i2c_func(struct i2c_adapter *adapter)
+{
+//fm	DEB_I2C(("'%s'.\n", adapter->name));
+
+	return	  I2C_FUNC_I2C
+		| I2C_FUNC_SMBUS_QUICK
+		| I2C_FUNC_SMBUS_READ_BYTE	| I2C_FUNC_SMBUS_WRITE_BYTE
+		| I2C_FUNC_SMBUS_READ_BYTE_DATA | I2C_FUNC_SMBUS_WRITE_BYTE_DATA;
+}
+
+/* this function returns the status-register of our i2c-device */
+static inline
+u32 saa7146_i2c_status(struct saa7146_dev *dev) 
+{
+	u32 iicsta = saa7146_read(dev, I2C_STATUS);
+/*
+	DEB_I2C(("status: 0x%08x\n",iicsta));
+*/
+	return iicsta;
+}
+
+/* this function runs through the i2c-messages and prepares the data to be
+   sent through the saa7146. have a look at the specifications p. 122 ff 
+   to understand this. it returns the number of u32s to send, or -1
+   in case of an error. */
+static
+int saa7146_i2c_msg_prepare(const struct i2c_msg m[], int num, u32 *op)
+{
+	int h1, h2;
+	int i, j, addr;
+	int mem = 0, op_count = 0;
+
+	/* first determine size of needed memory */
+	for(i = 0; i < num; i++) {
+		mem += m[i].len + 1;
+	}
+
+	/* worst case: we need one u32 for three bytes to be send
+	   plus one extra byte to address the device */
+	mem = 1 + ((mem-1) / 3);
+
+	/* we assume that op points to a memory of at least SAA7146_I2C_MEM bytes
+	   size. if we exceed this limit... */
+	if ( (4*mem) > SAA7146_I2C_MEM ) {
+//fm		DEB_I2C(("cannot prepare i2c-message.\n"));
+		return -ENOMEM;
+	}
+
+	/* be careful: clear out the i2c-mem first */
+	memset(op,0,sizeof(u32)*mem);
+
+	/* loop through all messages */
+	for(i = 0; i < num; i++) {
+
+		/* insert the address of the i2c-slave.
+		   note: we get 7 bit i2c-addresses,
+		   so we have to perform a translation */
+		addr = (m[i].addr*2) + ( (0 != (m[i].flags & I2C_M_RD)) ? 1 : 0); 
+		h1 = op_count/3; h2 = op_count%3;
+		op[h1] |= (	    (u8)addr << ((3-h2)*8));
+		op[h1] |= (SAA7146_I2C_START << ((3-h2)*2));
+		op_count++;
+
+		/* loop through all bytes of message i */
+		for(j = 0; j < m[i].len; j++) {
+			/* insert the data bytes */
+			h1 = op_count/3; h2 = op_count%3;
+			op[h1] |= ( (u32)((u8)m[i].buf[j]) << ((3-h2)*8));
+			op[h1] |= (       SAA7146_I2C_CONT << ((3-h2)*2));
+			op_count++;
+		}
+		
+	}			
+
+	/* have a look at the last byte inserted:
+	  if it was: ...CONT change it to ...STOP */
+	h1 = (op_count-1)/3; h2 = (op_count-1)%3;
+	if ( SAA7146_I2C_CONT == (0x3 & (op[h1] >> ((3-h2)*2))) ) {
+		op[h1] &= ~(0x2 << ((3-h2)*2));
+		op[h1] |= (SAA7146_I2C_STOP << ((3-h2)*2));
+	}
+
+	/* return the number of u32s to send */	
+	return mem;
+}
+
+/* this functions loops through all i2c-messages. normally, it should determine
+   which bytes were read through the adapter and write them back to the corresponding
+   i2c-message. but instead, we simply write back all bytes.
+   fixme: this could be improved. */
+static
+int saa7146_i2c_msg_cleanup(const struct i2c_msg m[], int num, u32 *op)
+{
+	int i, j;
+	int op_count = 0;
+
+	/* loop through all messages */
+	for(i = 0; i < num; i++) {
+
+		op_count++;
+
+		/* loop throgh all bytes of message i */
+		for(j = 0; j < m[i].len; j++) {
+			/* write back all bytes that could have been read */
+			m[i].buf[j] = (op[op_count/3] >> ((3-(op_count%3))*8));
+			op_count++;
+		}
+	}
+	
+	return 0;
+}
+
+/* this functions resets the i2c-device and returns 0 if everything was fine, otherwise -1 */
+static
+int saa7146_i2c_reset(struct saa7146_dev *dev) 
+{
+	/* get current status */
+	u32 status = saa7146_i2c_status(dev);
+	
+	/* clear registers for sure */
+	saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
+	saa7146_write(dev, I2C_TRANSFER, 0);
+
+	/* check if any operation is still in progress */
+	if ( 0 != ( status & SAA7146_I2C_BUSY) ) {
+
+		/* yes, kill ongoing operation */
+		DEB_I2C(("busy_state detected.\n"));
+
+		/* set "ABORT-OPERATION"-bit (bit 7)*/
+		saa7146_write(dev, I2C_STATUS, (dev->i2c_bitrate | MASK_07));
+		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
+		my_wait(dev,SAA7146_I2C_DELAY);
+
+		/* clear all error-bits pending; this is needed because p.123, note 1 */
+		saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
+		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
+		my_wait(dev,SAA7146_I2C_DELAY);
+ 	}
+
+	/* check if any error is (still) present. (this can be necessary because p.123, note 1) */
+	status = saa7146_i2c_status(dev);
+
+	if ( dev->i2c_bitrate != status ) {
+
+		DEB_I2C(("error_state detected. status:0x%08x\n",status));
+
+		/* Repeat the abort operation. This seems to be necessary
+		   after serious protocol errors caused by e.g. the SAA7740 */
+		saa7146_write(dev, I2C_STATUS, (dev->i2c_bitrate | MASK_07));
+		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
+		my_wait(dev,SAA7146_I2C_DELAY);
+
+		/* clear all error-bits pending */
+		saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
+		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
+		my_wait(dev,SAA7146_I2C_DELAY);
+
+		/* the data sheet says it might be necessary to clear the status
+		   twice after an abort */
+		saa7146_write(dev, I2C_STATUS, dev->i2c_bitrate);
+		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
+		my_wait(dev,SAA7146_I2C_DELAY);
+     	}
+
+	/* if any error is still present, a fatal error has occured ... */
+	status = saa7146_i2c_status(dev);
+	if ( dev->i2c_bitrate != status ) {
+		DEB_I2C(("fatal error. status:0x%08x\n",status));
+		return -1;
+	}
+
+	return 0;
+}
+
+/* this functions writes out the data-byte 'dword' to the i2c-device.
+   it returns 0 if ok, -1 if the transfer failed, -2 if the transfer
+   failed badly (e.g. address error) */
+static
+int saa7146_i2c_writeout(struct saa7146_dev *dev, u32* dword)
+{
+	u32 status = 0, mc2 = 0;
+	int timeout;
+
+	/* write out i2c-command */
+	DEB_I2C(("before: 0x%08x (status: 0x%08x), %d\n",*dword,saa7146_read(dev, I2C_STATUS), dev->i2c_op));
+
+	if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
+
+		saa7146_write(dev, I2C_STATUS,	 dev->i2c_bitrate);
+		saa7146_write(dev, I2C_TRANSFER, *dword);
+
+		dev->i2c_op = 1;
+		IER_ENABLE(dev, MASK_16|MASK_17);
+		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
+
+		wait_event_interruptible(dev->i2c_wq, dev->i2c_op == 0);
+		if (signal_pending (current)) {
+			/* a signal arrived */
+			return -ERESTARTSYS;
+		}
+		status = saa7146_read(dev, I2C_STATUS);
+	} else {
+		saa7146_write(dev, I2C_STATUS,	 dev->i2c_bitrate);
+		saa7146_write(dev, I2C_TRANSFER, *dword);
+		saa7146_write(dev, MC2, (MASK_00 | MASK_16));
+
+		/* do not poll for i2c-status before upload is complete */
+		timeout = jiffies + HZ/100 + 1; /* 10ms */
+		while(1) {
+			mc2 = (saa7146_read(dev, MC2) & 0x1);
+			if( 0 != mc2 ) {
+				break;
+			}
+			if (jiffies > timeout) {
+				printk(KERN_WARNING "saa7146_i2c_writeout: timed out waiting for MC2\n");
+				return -EIO;
+			}
+		}
+		/* wait until we get a transfer done or error */
+		timeout = jiffies + HZ/100 + 1; /* 10ms */
+		while(1) {
+			status = saa7146_i2c_status(dev);
+			if( (0x3 == (status & 0x3)) || (0 == (status & 0x1)) ) {
+				break;
+			}
+			if (jiffies > timeout) {
+				/* this is normal when probing the bus
+				 * (no answer from nonexisistant device...)
+				 */
+				DEB_I2C(("saa7146_i2c_writeout: timed out waiting for end of xfer\n"));
+				return -EIO;
+			}
+			my_wait(dev,1);
+		}
+	}
+
+	/* give a detailed status report */
+	if ( 0 != (status & SAA7146_I2C_ERR)) {
+
+		if( 0 != (status & SAA7146_I2C_SPERR) ) {
+			DEB_I2C(("error due to invalid start/stop condition.\n"));
+		}
+		if( 0 != (status & SAA7146_I2C_DTERR) ) {
+			DEB_I2C(("error in data transmission.\n"));
+		}
+		if( 0 != (status & SAA7146_I2C_DRERR) ) {
+			DEB_I2C(("error when receiving data.\n"));
+		}
+		if( 0 != (status & SAA7146_I2C_AL) ) {
+			DEB_I2C(("error because arbitration lost.\n"));
+		}
+
+		/* we handle address-errors here */
+		if( 0 != (status & SAA7146_I2C_APERR) ) {
+			DEB_I2C(("error in address phase.\n"));
+			return -EREMOTEIO;
+		}
+
+		return -EIO;
+	}
+
+	/* read back data, just in case we were reading ... */
+	*dword = saa7146_read(dev, I2C_TRANSFER);
+
+	DEB_I2C(("after: 0x%08x\n",*dword));
+	return 0;
+}
+
+int saa7146_i2c_transfer(struct saa7146_dev *dev, const struct i2c_msg msgs[], int num, int retries)
+{
+	int i = 0, count = 0;
+	u32* buffer = dev->i2c_mem;
+	int err = 0;
+        int address_err = 0;
+	
+	if (down_interruptible (&dev->i2c_lock))
+		return -ERESTARTSYS;
+
+	for(i=0;i<num;i++) {
+		DEB_I2C(("msg:%d/%d\n",i+1,num));
+	}
+	
+	/* prepare the message(s), get number of u32s to transfer */
+	count = saa7146_i2c_msg_prepare(msgs, num, buffer);
+	if ( 0 > count ) {
+		err = -1;
+		goto out;
+	}
+
+	do {
+		/* reset the i2c-device if necessary */
+		err = saa7146_i2c_reset(dev);
+		if ( 0 > err ) {
+			DEB_I2C(("could not reset i2c-device.\n"));
+			goto out;
+		}	
+
+		/* write out the u32s one after another */
+		for(i = 0; i < count; i++) {
+			err = saa7146_i2c_writeout(dev, &buffer[i] );
+			if ( 0 != err) {
+				/* this one is unsatisfying: some i2c slaves on some
+				   dvb cards don't acknowledge correctly, so the saa7146
+				   thinks that an address error occured. in that case, the
+				   transaction should be retrying, even if an address error
+				   occured. analog saa7146 based cards extensively rely on
+				   i2c address probing, however, and address errors indicate that a 
+				   device is really *not* there. retrying in that case
+				   increases the time the device needs to probe greatly, so
+				   it should be avoided. because of the fact, that only 
+				   analog based cards use irq based i2c transactions (for dvb
+				   cards, this screwes up other interrupt sources), we bail out
+				   completely for analog cards after an address error and trust
+				   the saa7146 address error detection. */
+				if ( -EREMOTEIO == err ) {
+					if( 0 != (SAA7146_USE_I2C_IRQ & dev->ext->flags)) {
+						goto out;
+					}
+				        address_err++;
+				}
+				DEB_I2C(("error while sending message(s). starting again.\n"));
+				break;
+			}
+		}
+		if( 0 == err ) {
+			err = num;
+			break;
+		}
+	        
+	        /* delay a bit before retrying */
+	        my_wait(dev, 10);
+		
+	} while (err != num && retries--);
+
+        /* if every retry had an address error, exit right away */
+        if (address_err == retries) {
+	        goto out;
+	}
+      
+	/* if any things had to be read, get the results */
+	if ( 0 != saa7146_i2c_msg_cleanup(msgs, num, buffer)) {
+		DEB_I2C(("could not cleanup i2c-message.\n"));
+		err = -1;
+		goto out;
+	}
+
+	/* return the number of delivered messages */
+	DEB_I2C(("transmission successful. (msg:%d).\n",err));
+out:
+	/* another bug in revision 0: the i2c-registers get uploaded randomly by other
+	   uploads, so we better clear them out before continueing */	
+	if( 0 == dev->revision ) {
+		u32 zero = 0;
+		saa7146_i2c_reset(dev);
+		if( 0 != saa7146_i2c_writeout(dev, &zero)) {
+			INFO(("revision 0 error. this should never happen.\n"));
+		}
+	}
+
+	up(&dev->i2c_lock);
+	return err;	
+}
+
+/* utility functions */
+static
+int saa7146_i2c_xfer(struct i2c_adapter* adapter, struct i2c_msg msg[], int num)
+{
+	struct saa7146_dev* dev = i2c_get_adapdata(adapter);
+	
+	DEB_I2C(("adapter: '%s'.\n", adapter->dev.name));
+	
+	/* use helper function to transfer data */
+	return saa7146_i2c_transfer(dev, msg, num, adapter->retries);
+}
+
+
+/*****************************************************************************/
+/* i2c-adapter helper functions                                              */
+#include <linux/i2c-id.h>
+
+/* exported algorithm data */
+static
+struct i2c_algorithm saa7146_algo = {
+	.name		= "saa7146 i2c algorithm",
+	.id		= I2C_ALGO_SAA7146,
+	.master_xfer	= saa7146_i2c_xfer,
+	.functionality	= saa7146_i2c_func,
+};
+
+int saa7146_i2c_adapter_prepare(struct saa7146_dev *dev, struct i2c_adapter *i2c_adapter, u32 bitrate)
+{
+	DEB_EE(("bitrate: 0x%08x\n",bitrate));
+	
+	dev->i2c_bitrate = bitrate;
+	saa7146_i2c_reset(dev);
+
+	if( NULL != i2c_adapter ) {
+		memset(i2c_adapter,0,sizeof(struct i2c_adapter));
+		strcpy(i2c_adapter->dev.name, dev->name);	
+		i2c_set_adapdata(i2c_adapter,dev);
+		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;
+	}
+	
+	return 0;
+}
diff -Nru a/drivers/media/common/saa7146_vbi.c b/drivers/media/common/saa7146_vbi.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/saa7146_vbi.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,468 @@
+#include <media/saa7146_vv.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME saa7146
+#endif
+
+static int vbi_pixel_to_capture = 720 * 2;
+
+static
+int vbi_workaround(struct saa7146_dev *dev)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+
+        u32          *cpu;
+        dma_addr_t   dma_addr;
+	
+	int i, index;
+
+	DECLARE_WAITQUEUE(wait, current);
+	
+	DEB_VBI(("dev:%p\n",dev));
+	
+	/* once again, a bug in the saa7146: the brs acquisition
+	   is buggy and especially the BXO-counter does not work
+	   as specified. there is this workaround, but please
+	   don't let me explain it. ;-) */
+
+	cpu = pci_alloc_consistent(dev->pci, 4096, &dma_addr);
+	if (NULL == cpu)
+		return -ENOMEM;
+
+	/* setup some basic programming, just for the workaround */
+	saa7146_write(dev, BASE_EVEN3,	dma_addr);
+	saa7146_write(dev, BASE_ODD3,	dma_addr+vbi_pixel_to_capture);
+	saa7146_write(dev, PROT_ADDR3,	dma_addr+4096);
+	saa7146_write(dev, PITCH3, 	vbi_pixel_to_capture);
+	saa7146_write(dev, BASE_PAGE3,	0x0);
+	saa7146_write(dev, NUM_LINE_BYTE3, (2<<16)|((vbi_pixel_to_capture)<<0));
+	saa7146_write(dev, MC2, MASK_04|MASK_20);
+
+
+	/* we have to do the workaround two times to be sure that
+	   everything is ok */
+	for(i = 0; i < 2; i++) {
+
+		/* indicate to the irq handler that we do the workaround */
+		saa7146_write(dev, MC2, MASK_31|MASK_15);
+
+		saa7146_write(dev, NUM_LINE_BYTE3, (1<<16)|(2<<0));
+		saa7146_write(dev, MC2, MASK_04|MASK_20);
+	
+		index = 0;
+
+		/* load brs-control register */
+		dev->rps1[index++] = CMD_WR_REG | (1 << 8) | (BRS_CTRL/4);
+		/* BXO = 1h, BRS to outbound */
+		dev->rps1[index++]=0xc000008c;   
+		/* wait for vbi_a */
+		dev->rps1[index++] = CMD_PAUSE | MASK_10;
+		/* upload brs */
+		dev->rps1[index++] = CMD_UPLOAD | MASK_08;
+		/* load brs-control register */
+		dev->rps1[index++] = CMD_WR_REG | (1 << 8) | (BRS_CTRL/4);
+		/* BYO = 1, BXO = NQBIL (=1728 for PAL, for NTSC this is 858*2) - NumByte3 (=1440) = 288 */
+		dev->rps1[index++] = ((1728-(vbi_pixel_to_capture)) << 7) | MASK_19;
+		/* wait for brs_done */
+		dev->rps1[index++] = CMD_PAUSE | MASK_08;
+		/* upload brs */
+		dev->rps1[index++] = CMD_UPLOAD | MASK_08;
+		/* load video-dma3 NumLines3 and NumBytes3 */
+		dev->rps1[index++] = CMD_WR_REG | (1 << 8) | (NUM_LINE_BYTE3/4);
+		/* dev->vbi_count*2 lines, 720 pixel (= 1440 Bytes) */
+		dev->rps1[index++]= (2 << 16) | (vbi_pixel_to_capture);
+		/* load brs-control register */
+		dev->rps1[index++] = CMD_WR_REG | (1 << 8) | (BRS_CTRL/4);
+		/* Set BRS right: note: this is an experimental value for BXO (=> PAL!) */
+		dev->rps1[index++] = (540 << 7) | (5 << 19);  // 5 == vbi_start  
+		/* wait for brs_done */
+		dev->rps1[index++] = CMD_PAUSE | MASK_08;
+		/* upload brs and video-dma3*/
+		dev->rps1[index++] = CMD_UPLOAD | MASK_08 | MASK_04;
+		/* load mc2 register: enable dma3 */
+		dev->rps1[index++] = CMD_WR_REG | (1 << 8) | (MC1/4);
+		dev->rps1[index++] = MASK_20 | MASK_04;
+		/* generate interrupt */
+		dev->rps1[index++] = CMD_INTERRUPT;
+		/* stop rps1 */
+		dev->rps1[index++] = CMD_STOP;
+	
+		/* enable rps1 irqs */
+		IER_ENABLE(dev,MASK_28);
+
+		/* prepare to wait to be woken up by the irq-handler */
+		add_wait_queue(&vv->vbi_wq, &wait);
+		current->state = TASK_INTERRUPTIBLE;
+
+		/* start rps1 to enable workaround */
+		saa7146_write(dev, RPS_ADDR1, virt_to_bus(&dev->rps1[ 0]));
+		saa7146_write(dev, MC1, (MASK_13 | MASK_29));	
+		
+		schedule();
+
+		DEB_VBI(("brs bug workaround %d/1.\n",i));
+	
+		remove_wait_queue(&vv->vbi_wq, &wait);
+		current->state = TASK_RUNNING;
+
+		/* disable rps1 irqs */
+		IER_DISABLE(dev,MASK_28);
+
+		/* stop video-dma3 */
+		saa7146_write(dev, MC1, MASK_20);
+
+		if(signal_pending(current)) {
+		
+			DEB_VBI(("aborted.\n"));
+
+			/* stop rps1 for sure */
+			saa7146_write(dev, MC1, MASK_29);
+
+			pci_free_consistent(dev->pci, 4096, cpu, dma_addr);
+			return -EINTR;
+		}
+	}
+
+	pci_free_consistent(dev->pci, 4096, cpu, dma_addr);
+	return 0;
+}
+
+void saa7146_set_vbi_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+
+	struct saa7146_video_dma vdma3;
+
+	int count = 0;
+	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;
+
+/*
+	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_page	= 0;
+	vdma3.num_line_byte = (64<<16)|((vbi_pixel_to_capture)<<0); // set above!
+*/
+	vdma3.base_even	= buf->pt[2].offset;
+	vdma3.base_odd	= buf->pt[2].offset + 16 * vbi_pixel_to_capture;
+	vdma3.prot_addr	= buf->pt[2].offset + 16 * 2 * vbi_pixel_to_capture;
+	vdma3.pitch	= vbi_pixel_to_capture;
+	vdma3.base_page	= buf->pt[2].dma | ME1;
+	vdma3.num_line_byte = (16 << 16) | vbi_pixel_to_capture;
+	saa7146_write_out_dma(dev, 3, &vdma3);
+
+	/* write beginning of rps-program */
+	count = 0;
+
+	/* wait for o_fid_a/b / e_fid_a/b toggle only if bit 1 is not set */
+
+	/* we don't wait here for the first field anymore. this is different from the video
+	   capture and might cause that the first buffer is only half filled (with only
+	   one field). but since this is some sort of streaming data, this is not that negative.
+	   but by doing this, we can use the whole engine from video-buf.c... */
+	
+/*
+	dev->rps1[ count++ ] = CMD_PAUSE | CMD_OAN | CMD_SIG1 | e_wait;
+	dev->rps1[ count++ ] = CMD_PAUSE | CMD_OAN | CMD_SIG1 | o_wait;
+*/
+	/* set bit 1 */
+	dev->rps1[ count++ ] = CMD_WR_REG | (1 << 8) | (MC2/4); 	
+	dev->rps1[ count++ ] = MASK_28 | MASK_12;
+	
+	/* turn on video-dma3 */
+	dev->rps1[ count++ ] = CMD_WR_REG_MASK | (MC1/4);		
+	dev->rps1[ count++ ] = MASK_04 | MASK_20;	    		/* => mask */
+	dev->rps1[ count++ ] = MASK_04 | MASK_20;			/* => values */
+	
+	/* wait for o_fid_a/b / e_fid_a/b toggle */
+	dev->rps1[ count++ ] = CMD_PAUSE | o_wait;
+	dev->rps1[ count++ ] = CMD_PAUSE | e_wait;
+
+	/* generate interrupt */
+	dev->rps1[ count++ ] = CMD_INTERRUPT;					
+
+	/* stop */
+	dev->rps1[ count++ ] = CMD_STOP;					
+
+	/* enable rps1 irqs */
+	IER_ENABLE(dev, MASK_28);
+
+	/* write the address of the rps-program */
+	saa7146_write(dev, RPS_ADDR1, virt_to_bus(&dev->rps1[ 0]));
+
+	/* turn on rps */
+	saa7146_write(dev, MC1, (MASK_13 | MASK_29));	
+}
+
+static
+int buffer_activate(struct saa7146_dev *dev,
+			   struct saa7146_buf *buf,
+			   struct saa7146_buf *next)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	buf->vb.state = STATE_ACTIVE;
+
+	DEB_VBI(("dev:%p, buf:%p, next:%p\n",dev,buf,next));
+	saa7146_set_vbi_capture(dev,buf,next);
+
+	mod_timer(&vv->vbi_q.timeout, jiffies+BUFFER_TIMEOUT);
+	return 0;
+}
+
+static
+int buffer_prepare(struct file *file, struct videobuf_buffer *vb,enum v4l2_field field)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_buf *buf = (struct saa7146_buf *)vb;
+
+	int err = 0;
+	int lines, llength, size;
+
+	lines   = 16 * 2 ; /* 2 fields */
+	llength = vbi_pixel_to_capture;
+	size = lines * llength;
+
+	DEB_VBI(("vb:%p\n",vb));
+	
+	if (0 != buf->vb.baddr  &&  buf->vb.bsize < size) {
+		DEB_VBI(("size mismatch.\n"));
+		return -EINVAL;
+	}
+	
+	if (buf->vb.size != size)
+		saa7146_dma_free(dev,buf);
+
+	if (STATE_NEEDS_INIT == buf->vb.state) {
+		buf->vb.width  = llength;
+		buf->vb.height = lines;
+		buf->vb.size   = size;
+		buf->vb.field  = field;	// FIXME: check this
+
+		saa7146_pgtable_free(dev->pci, &buf->pt[2]);
+		saa7146_pgtable_alloc(dev->pci, &buf->pt[2]);
+
+		err = videobuf_iolock(dev->pci,&buf->vb);
+		if (err)
+			goto oops;
+		saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
+	}
+	buf->vb.state = STATE_PREPARED;
+	buf->activate = buffer_activate;
+
+	return 0;
+
+ oops:
+	DEB_VBI(("error out.\n"));
+	saa7146_dma_free(dev,buf);
+
+	return err;
+}
+
+static int
+buffer_setup(struct file *file, unsigned int *count, unsigned int *size)
+{
+	int llength,lines;
+	
+	lines   = 16 * 2 ; /* 2 fields */
+	llength = vbi_pixel_to_capture;
+
+	*size = lines * llength;
+	*count = 2;
+
+	DEB_VBI(("count:%d, size:%d\n",*count,*size));
+
+	return 0;
+}
+
+static
+void buffer_queue(struct file *file, struct videobuf_buffer *vb)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	struct saa7146_buf *buf = (struct saa7146_buf *)vb;
+	
+	DEB_VBI(("vb:%p\n",vb));
+	saa7146_buffer_queue(dev,&vv->vbi_q,buf);
+}
+
+static
+void buffer_release(struct file *file, struct videobuf_buffer *vb)
+{
+	struct saa7146_fh *fh   = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_buf *buf = (struct saa7146_buf *)vb;
+	
+	DEB_VBI(("vb:%p\n",vb));
+	saa7146_dma_free(dev,buf);
+}
+
+static
+struct videobuf_queue_ops vbi_qops = {
+	.buf_setup    = buffer_setup,
+	.buf_prepare  = buffer_prepare,
+	.buf_queue    = buffer_queue,
+	.buf_release  = buffer_release,
+};
+
+/* ------------------------------------------------------------------ */
+
+static
+void vbi_stop(struct saa7146_fh *fh)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	unsigned long flags;
+	DEB_VBI(("dev:%p, fh:%p\n",dev, fh));
+	
+	spin_lock_irqsave(&dev->slock,flags);
+
+	/* disable rps1  */
+	saa7146_write(dev, MC1, MASK_29);
+
+	/* disable rps1 irqs */
+	IER_DISABLE(dev, MASK_28);
+
+	/* shut down dma 3 transfers */
+	saa7146_write(dev, MC1, MASK_20);
+
+	vv->vbi_streaming = NULL;
+	spin_unlock_irqrestore(&dev->slock, flags);
+}
+
+static
+void vbi_read_timeout(unsigned long data)
+{
+	struct saa7146_fh *fh = (struct saa7146_fh *)data;
+	struct saa7146_dev *dev = fh->dev;
+	
+	DEB_VBI(("dev:%p, fh:%p\n",dev, fh));
+
+	vbi_stop(fh);
+}
+
+static
+void vbi_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
+{
+	DEB_VBI(("dev:%p\n",dev));
+
+	INIT_LIST_HEAD(&vv->vbi_q.queue);
+
+	init_timer(&vv->vbi_q.timeout);
+	vv->vbi_q.timeout.function = saa7146_buffer_timeout;
+	vv->vbi_q.timeout.data     = (unsigned long)(&vv->vbi_q);
+	vv->vbi_q.dev              = dev;
+
+	init_waitqueue_head(&vv->vbi_wq);
+}
+
+static
+void vbi_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
+{
+	DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
+
+	memset(&fh->vbi_fmt,0,sizeof(fh->vbi_fmt));
+
+	fh->vbi_fmt.sampling_rate	= 27000000;
+	fh->vbi_fmt.offset		= 248; /* todo */ 
+	fh->vbi_fmt.samples_per_line	= vbi_pixel_to_capture;
+	fh->vbi_fmt.sample_format	= V4L2_PIX_FMT_GREY;
+
+	/* fixme: this only works for PAL */
+	fh->vbi_fmt.start[0] = 5;
+	fh->vbi_fmt.count[0] = 16;
+	fh->vbi_fmt.start[1] = 312;
+	fh->vbi_fmt.count[1] = 16;
+
+	videobuf_queue_init(&fh->vbi_q, &vbi_qops,
+			    dev->pci, &dev->slock,
+			    V4L2_BUF_TYPE_VBI_CAPTURE,
+			    V4L2_FIELD_SEQ_TB, // FIXME: does this really work?
+			    sizeof(struct saa7146_buf));
+	init_MUTEX(&fh->vbi_q.lock);
+
+	init_timer(&fh->vbi_read_timeout);
+	fh->vbi_read_timeout.function = vbi_read_timeout;
+	fh->vbi_read_timeout.data = (unsigned long)fh;
+
+	vbi_workaround(dev);
+}
+
+static
+void vbi_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
+
+	if( fh == vv->vbi_streaming ) {
+		vbi_stop(fh);
+	}
+}
+
+static
+void vbi_irq_done(struct saa7146_dev *dev, unsigned long status)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	spin_lock(&dev->slock);
+
+	if (vv->vbi_q.curr) {
+		DEB_VBI(("dev:%p, curr:%p\n",dev,vv->vbi_q.curr));
+		/* this must be += 2, one count for each field */
+		vv->vbi_fieldcount+=2;
+		vv->vbi_q.curr->vb.field_count = vv->vbi_fieldcount;
+		saa7146_buffer_finish(dev,&vv->vbi_q,STATE_DONE);
+	} else {
+		DEB_VBI(("dev:%p\n",dev));
+	}
+	saa7146_buffer_next(dev,&vv->vbi_q,1);
+
+	spin_unlock(&dev->slock);
+}
+
+static
+ssize_t vbi_read(struct file *file, char *data, size_t count, loff_t *ppos)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	ssize_t ret = 0;
+
+	DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
+	
+	if( NULL == vv->vbi_streaming ) {
+		// fixme: check if dma3 is available
+		// fixme: activate vbi engine here if necessary. (really?)
+		vv->vbi_streaming = fh;
+	}
+
+	if( fh != vv->vbi_streaming ) {
+		DEB_VBI(("open %p is already using vbi capture.",vv->vbi_streaming));
+		return -EBUSY;
+	}
+
+	mod_timer(&fh->vbi_read_timeout, jiffies+BUFFER_TIMEOUT);
+	ret = videobuf_read_stream(file, &fh->vbi_q, data, count, ppos, 1);
+/*
+	printk("BASE_ODD3:      0x%08x\n", saa7146_read(dev, BASE_ODD3));
+	printk("BASE_EVEN3:     0x%08x\n", saa7146_read(dev, BASE_EVEN3));
+	printk("PROT_ADDR3:     0x%08x\n", saa7146_read(dev, PROT_ADDR3));
+	printk("PITCH3:         0x%08x\n", saa7146_read(dev, PITCH3));
+	printk("BASE_PAGE3:     0x%08x\n", saa7146_read(dev, BASE_PAGE3));
+	printk("NUM_LINE_BYTE3: 0x%08x\n", saa7146_read(dev, NUM_LINE_BYTE3));
+	printk("BRS_CTRL:       0x%08x\n", saa7146_read(dev, BRS_CTRL));
+*/
+	return ret;
+}
+
+struct saa7146_use_ops saa7146_vbi_uops = {
+	.init 		= vbi_init,
+	.open 		= vbi_open,
+	.release	= vbi_close,
+	.irq_done	= vbi_irq_done,
+	.read 		= vbi_read,
+};
+
+EXPORT_SYMBOL_GPL(saa7146_vbi_uops);
diff -Nru a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/common/saa7146_video.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,1387 @@
+#include <media/saa7146_vv.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME saa7146
+#endif
+
+static
+int memory = 32;
+
+MODULE_PARM(memory,"i");
+MODULE_PARM_DESC(memory, "maximum memory usage for capture buffers (default: 32Mb)");
+
+/* format descriptions for capture and preview */
+static
+struct saa7146_format formats[] = {
+	{
+		.name 		= "RGB-8 (3-3-2)",
+		.pixelformat	= V4L2_PIX_FMT_RGB332,
+		.trans 		= RGB08_COMPOSED,
+		.depth		= 8,
+	}, {
+		.name 		= "RGB-16 (5/B-6/G-5/R)", 	/* really? */
+		.pixelformat	= V4L2_PIX_FMT_RGB565,
+		.trans 		= RGB16_COMPOSED,
+		.depth		= 16,
+	}, {
+		.name 		= "RGB-24 (B-G-R)",
+		.pixelformat	= V4L2_PIX_FMT_BGR24,
+		.trans 		= RGB24_COMPOSED,
+		.depth		= 24,
+	}, {
+		.name 		= "RGB-32 (B-G-R)",
+		.pixelformat	= V4L2_PIX_FMT_BGR32,
+		.trans 		= RGB32_COMPOSED,
+		.depth		= 32,
+	}, {
+		.name 		= "Greyscale-8",
+		.pixelformat	= V4L2_PIX_FMT_GREY,
+		.trans 		= Y8,
+		.depth		= 8,
+	}, {
+		.name 		= "YUV 4:2:2 planar (Y-Cb-Cr)",
+		.pixelformat	= V4L2_PIX_FMT_YUV422P,
+		.trans 		= YUV422_DECOMPOSED,
+		.depth		= 16,
+		.swap		= 1,
+	}, {
+		.name 		= "YVU 4:2:0 planar (Y-Cb-Cr)",
+		.pixelformat	= V4L2_PIX_FMT_YVU420,
+		.trans 		= YUV420_DECOMPOSED,
+		.depth		= 12,
+		.swap		= 1,
+	}, {
+		.name 		= "YUV 4:2:0 planar (Y-Cb-Cr)",
+		.pixelformat	= V4L2_PIX_FMT_YUV420,
+		.trans 		= YUV420_DECOMPOSED,
+		.depth		= 12,
+	}, {
+		.name 		= "YUV 4:2:2 (U-Y-V-Y)",
+		.pixelformat	= V4L2_PIX_FMT_UYVY,
+		.trans 		= YUV422_COMPOSED,
+		.depth		= 16,
+	}
+};
+
+/* unfortunately, the saa7146 contains a bug which prevents it from doing on-the-fly byte swaps.
+   due to this, it's impossible to provide additional *packed* formats, which are simply byte swapped
+   (like V4L2_PIX_FMT_YUYV) ... 8-( */
+   
+static
+int NUM_FORMATS = sizeof(formats)/sizeof(struct saa7146_format);
+
+struct saa7146_format* format_by_fourcc(struct saa7146_dev *dev, int fourcc)
+{
+	int i, j = NUM_FORMATS;
+	
+	for (i = 0; i < j; i++) {
+		if (formats[i].pixelformat == fourcc) {
+			return formats+i;
+		}
+	}
+	
+	DEB_D(("unknown pixelformat:'%4.4s'\n",(char *)&fourcc));
+	return NULL;
+}
+
+static
+int g_fmt(struct saa7146_fh *fh, struct v4l2_format *f)
+{
+	struct saa7146_dev *dev = fh->dev;
+	DEB_EE(("dev:%p, fh:%p\n",dev,fh));
+
+	switch (f->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+		f->fmt.pix = fh->video_fmt;
+		return 0;
+	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
+		f->fmt.win = fh->ov.win;
+		return 0;
+	case V4L2_BUF_TYPE_VBI_CAPTURE:
+	{
+		f->fmt.vbi = fh->vbi_fmt;
+		return 0;
+	}
+	default:
+		DEB_D(("invalid format type '%d'.\n",f->type));
+		return -EINVAL;
+	}
+}
+
+static
+int try_win(struct saa7146_dev *dev, struct v4l2_window *win)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	enum v4l2_field field;
+	int maxw, maxh;
+
+	DEB_EE(("dev:%p\n",dev));
+
+	if (NULL == vv->ov_fb.base) {
+		DEB_D(("no fb base set.\n"));
+		return -EINVAL;
+	}
+	if (NULL == vv->ov_fmt) {
+		DEB_D(("no fb fmt set.\n"));
+		return -EINVAL;
+	}
+	if (win->w.width < 64 || win->w.height <  64) {
+		DEB_D(("min width/height. (%d,%d)\n",win->w.width,win->w.height));
+		return -EINVAL;
+	}
+	if (win->clipcount > 16) {
+		DEB_D(("clipcount too big.\n"));
+		return -EINVAL;
+	}
+
+	field = win->field;
+	maxw  = vv->standard->h_max_out;
+	maxh  = vv->standard->v_max_out;
+
+	if (V4L2_FIELD_ANY == field) {
+                field = (win->w.height > maxh/2)
+                        ? V4L2_FIELD_INTERLACED
+                        : V4L2_FIELD_TOP;
+	        }
+        switch (field) {
+        case V4L2_FIELD_TOP:
+        case V4L2_FIELD_BOTTOM:
+                maxh = maxh / 2;
+                break;
+        case V4L2_FIELD_INTERLACED:
+                break;
+        default: {
+		DEB_D(("no known field mode '%d'.\n",field));
+                return -EINVAL;
+	}
+        }
+
+	win->field = field;
+	if (win->w.width > maxw)
+		win->w.width = maxw;
+	if (win->w.height > maxh)
+		win->w.height = maxh;
+
+	return 0;
+}
+
+static
+int try_fmt(struct saa7146_fh *fh, struct v4l2_format *f)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	int err;
+	
+	switch (f->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+	{
+		struct saa7146_format *fmt;
+		enum v4l2_field field;
+		int maxw, maxh;
+
+		DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: dev:%p, fh:%p\n",dev,fh));
+
+		fmt = format_by_fourcc(dev,f->fmt.pix.pixelformat);
+		if (NULL == fmt) {
+			return -EINVAL;
+		}
+
+		field = f->fmt.pix.field;
+		maxw  = vv->standard->h_max_out;
+		maxh  = vv->standard->v_max_out;
+		
+		if (V4L2_FIELD_ANY == field) {
+			field = (f->fmt.pix.height > maxh/2)
+				? V4L2_FIELD_INTERLACED
+				: V4L2_FIELD_BOTTOM;
+		}
+		switch (field) {
+		case V4L2_FIELD_TOP:
+		case V4L2_FIELD_BOTTOM:
+			maxh = maxh / 2;
+			break;
+		case V4L2_FIELD_INTERLACED:
+			break;
+		default: {
+			DEB_D(("no known field mode '%d'.\n",field));
+			return -EINVAL;
+		}
+		}
+
+		f->fmt.pix.field = field;
+		if (f->fmt.pix.width > maxw)
+			f->fmt.pix.width = maxw;
+		if (f->fmt.pix.height > maxh)
+			f->fmt.pix.height = maxh;
+		f->fmt.pix.sizeimage =
+			(f->fmt.pix.width * f->fmt.pix.height * fmt->depth)/8;
+		return 0;
+	}
+	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
+		DEB_EE(("V4L2_BUF_TYPE_VIDEO_OVERLAY: dev:%p, fh:%p\n",dev,fh));
+		err = try_win(dev,&f->fmt.win);
+		if (0 != err) {
+			return err;
+		}
+		return 0;
+	default:
+		DEB_EE(("unknown format type '%d'\n",f->type));
+		return -EINVAL;
+	}
+}
+
+static
+int start_preview(struct saa7146_fh *fh)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	int err = 0;
+
+	DEB_EE(("dev:%p, fh:%p\n",dev,fh));
+
+	/* check if we have overlay informations */
+	if( NULL == fh->ov.fh ) {
+		DEB_D(("not overlay data available. try S_FMT first.\n"));
+		return -EAGAIN;
+	}
+
+	/* check if overlay is running */
+	if( 0 != vv->ov_data ) {
+		if( fh != vv->ov_data->fh ) {
+			DEB_D(("overlay is running in another open.\n"));
+			return -EAGAIN;
+		}
+		DEB_D(("overlay is already active.\n"));
+		return 0;
+	}
+	
+	if( 0 != vv->streaming ) {
+		DEB_D(("streaming capture is active.\n"));
+		return -EBUSY;
+	}	
+	
+	err = try_win(dev,&fh->ov.win);
+	if (0 != err) {
+		return err;
+	}
+	
+	vv->ov_data = &fh->ov;
+
+	DEB_D(("%dx%d+%d+%d %s field=%s\n",
+		fh->ov.win.w.width,fh->ov.win.w.height,
+		fh->ov.win.w.left,fh->ov.win.w.top,
+		vv->ov_fmt->name,v4l2_field_names[fh->ov.win.field]));
+	
+	saa7146_set_overlay(dev, fh, 1);
+
+	return 0;
+}
+
+static
+int stop_preview(struct saa7146_fh *fh)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+
+	DEB_EE(("saa7146.o: stop_preview()\n"));
+
+	/* check if overlay is running */
+	if( 0 == vv->ov_data ) {
+		DEB_D(("overlay is not active.\n"));
+		return 0;
+	}
+
+	if( fh != vv->ov_data->fh ) {
+		DEB_D(("overlay is active, but for another open.\n"));
+		return -EBUSY;
+	}
+
+	saa7146_set_overlay(dev, fh, 0);
+	vv->ov_data = NULL;
+	
+	return 0;
+}
+
+static
+int s_fmt(struct saa7146_fh *fh, struct v4l2_format *f)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+
+	unsigned long flags;
+	int err;
+	
+	switch (f->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+		DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: dev:%p, fh:%p\n",dev,fh));
+		if( fh == vv->streaming ) {
+			DEB_EE(("streaming capture is active"));
+			return -EAGAIN;
+		}
+		err = try_fmt(fh,f);
+		if (0 != err)
+			return err;
+		fh->video_fmt = f->fmt.pix;
+		DEB_EE(("set to pixelformat '%4.4s'\n",(char *)&fh->video_fmt.pixelformat));
+		return 0;
+	case V4L2_BUF_TYPE_VIDEO_OVERLAY:
+		DEB_EE(("V4L2_BUF_TYPE_VIDEO_OVERLAY: dev:%p, fh:%p\n",dev,fh));
+		err = try_win(dev,&f->fmt.win);
+		if (0 != err)
+			return err;
+		down(&dev->lock);
+		fh->ov.win    = f->fmt.win;
+		fh->ov.nclips = f->fmt.win.clipcount;
+		if (fh->ov.nclips > 16)
+			fh->ov.nclips = 16;
+		if (copy_from_user(fh->ov.clips,f->fmt.win.clips,sizeof(struct v4l2_clip)*fh->ov.nclips)) {
+			up(&dev->lock);
+			return -EFAULT;
+		}
+		
+		/* fh->ov.fh is used to indicate that we have valid overlay informations, too */
+		fh->ov.fh = fh;
+
+		/* check if we have an active overlay */
+		if( vv->ov_data != NULL ) {
+			if( fh == vv->ov_data->fh) {
+				spin_lock_irqsave(&dev->slock,flags);
+				stop_preview(fh);
+				start_preview(fh);
+				spin_unlock_irqrestore(&dev->slock,flags);
+			}
+		}
+		up(&dev->lock);
+		return 0;
+	default:
+		DEB_D(("unknown format type '%d'\n",f->type));
+		return -EINVAL;
+	}
+}
+
+/********************************************************************************/
+/* device controls */
+
+static
+struct v4l2_queryctrl controls[] = {
+	{
+		id:            V4L2_CID_BRIGHTNESS,
+		name:          "Brightness",
+		minimum:       0,
+		maximum:       255,
+		step:          1,
+		default_value: 128,
+		type:          V4L2_CTRL_TYPE_INTEGER,
+	},{
+		id:            V4L2_CID_CONTRAST,
+		name:          "Contrast",
+		minimum:       0,
+		maximum:       127,
+		step:          1,
+		default_value: 64,
+		type:          V4L2_CTRL_TYPE_INTEGER,
+	},{
+		id:            V4L2_CID_SATURATION,
+		name:          "Saturation",
+		minimum:       0,
+		maximum:       127,
+		step:          1,
+		default_value: 64,
+		type:          V4L2_CTRL_TYPE_INTEGER,
+	},{
+		id:            V4L2_CID_VFLIP,
+		name:          "Vertical flip",
+		minimum:       0,
+		maximum:       1,
+		type:          V4L2_CTRL_TYPE_BOOLEAN,
+	},{
+		id:            V4L2_CID_HFLIP,
+		name:          "Horizontal flip",
+		minimum:       0,
+		maximum:       1,
+		type:          V4L2_CTRL_TYPE_BOOLEAN,
+	},
+};
+static
+int NUM_CONTROLS = sizeof(controls)/sizeof(struct v4l2_queryctrl);
+
+#define V4L2_CID_PRIVATE_LASTP1      (V4L2_CID_PRIVATE_BASE + 0)
+
+static
+struct v4l2_queryctrl* ctrl_by_id(int id)
+{
+	int i;
+	
+	for (i = 0; i < NUM_CONTROLS; i++)
+		if (controls[i].id == id)
+			return controls+i;
+	return NULL;
+}
+
+static
+int get_control(struct saa7146_fh *fh, struct v4l2_control *c)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+
+	const struct v4l2_queryctrl* ctrl;
+	u32 value = 0;
+
+	ctrl = ctrl_by_id(c->id);
+	if (NULL == ctrl)
+		return -EINVAL;
+	switch (c->id) {
+	case V4L2_CID_BRIGHTNESS:
+		value = saa7146_read(dev, BCS_CTRL);
+		c->value = 0xff & (value >> 24);
+		break;
+	case V4L2_CID_CONTRAST:
+		value = saa7146_read(dev, BCS_CTRL);
+		c->value = 0x7f & (value >> 16);
+		break;
+	case V4L2_CID_SATURATION:
+		value = saa7146_read(dev, BCS_CTRL);
+		c->value = 0x7f & (value >> 0);
+		break;
+	case V4L2_CID_VFLIP:
+		c->value = vv->vflip;
+		break;
+	case V4L2_CID_HFLIP:
+		c->value = vv->hflip;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static
+int set_control(struct saa7146_fh *fh, struct v4l2_control *c)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+
+	const struct v4l2_queryctrl* ctrl;
+	unsigned long flags;
+	int restart_overlay = 0;
+
+	ctrl = ctrl_by_id(c->id);
+	if (NULL == ctrl) {
+		DEB_D(("unknown control %d\n",c->id));
+		return -EINVAL;
+	}
+	
+	switch (ctrl->type) {
+	case V4L2_CTRL_TYPE_BOOLEAN:
+	case V4L2_CTRL_TYPE_MENU:
+	case V4L2_CTRL_TYPE_INTEGER:
+		if (c->value < ctrl->minimum)
+			c->value = ctrl->minimum;
+		if (c->value > ctrl->maximum)
+			c->value = ctrl->maximum;
+		break;
+	default:
+		/* nothing */;
+	};
+
+	switch (c->id) {
+	case V4L2_CID_BRIGHTNESS: {
+		u32 value = saa7146_read(dev, BCS_CTRL);
+		value &= 0x00ffffff;
+		value |= (c->value << 24);
+		saa7146_write(dev, BCS_CTRL, value);
+		saa7146_write(dev, MC2, MASK_22 | MASK_06 );
+		break;
+	}
+	case V4L2_CID_CONTRAST: {
+		u32 value = saa7146_read(dev, BCS_CTRL);
+		value &= 0xff00ffff;
+		value |= (c->value << 16);
+		saa7146_write(dev, BCS_CTRL, value);
+		saa7146_write(dev, MC2, MASK_22 | MASK_06 );
+		break;
+	}
+	case V4L2_CID_SATURATION: {
+		u32 value = saa7146_read(dev, BCS_CTRL);
+		value &= 0xffffff00;
+		value |= (c->value << 0);
+		saa7146_write(dev, BCS_CTRL, value);
+		saa7146_write(dev, MC2, MASK_22 | MASK_06 );
+		break;
+	}
+	case V4L2_CID_HFLIP:
+		/* fixme: we can supfhrt changing VFLIP and HFLIP here... */
+		if( 0 != vv->streaming ) {
+			DEB_D(("V4L2_CID_HFLIP while active capture.\n"));
+			return -EINVAL;
+		}
+		vv->hflip = c->value;
+		restart_overlay = 1;
+		break;
+	case V4L2_CID_VFLIP:
+		if( 0 != vv->streaming ) {
+			DEB_D(("V4L2_CID_VFLIP while active capture.\n"));
+			return -EINVAL;
+		}
+		vv->vflip = c->value;
+		restart_overlay = 1;
+		break;
+	default: {
+		return -EINVAL;
+	}
+	}
+	if( 0 != restart_overlay ) {
+		if( 0 != vv->ov_data ) {
+			if( fh == vv->ov_data->fh ) {
+				spin_lock_irqsave(&dev->slock,flags);
+				stop_preview(fh);
+				start_preview(fh);
+				spin_unlock_irqrestore(&dev->slock,flags);
+			}
+		}
+	}
+	return 0;
+}
+
+/********************************************************************************/
+/* common pagetable functions */
+
+static
+int saa7146_pgtable_build(struct saa7146_dev *dev, struct saa7146_buf *buf)
+{
+	struct pci_dev *pci = dev->pci;
+	struct scatterlist *list = buf->vb.dma.sglist;
+	int length = buf->vb.dma.sglen;
+	struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
+
+	DEB_EE(("dev:%p, buf:%p\n",dev,buf));
+
+	if( 0 != IS_PLANAR(sfmt->trans)) {
+		struct saa7146_pgtable *pt1 = &buf->pt[0];
+		struct saa7146_pgtable *pt2 = &buf->pt[1];
+		struct saa7146_pgtable *pt3 = &buf->pt[2];
+		u32  *ptr1, *ptr2, *ptr3;
+		u32 fill;
+
+		int size = buf->fmt->width*buf->fmt->height;
+		int i,p,m1,m2,m3,o1,o2;
+
+		switch( sfmt->depth ) {
+			case 12: {
+				/* create some offsets inside the page table */
+				m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1;
+				m2 = ((size+(size/4)+PAGE_SIZE)/PAGE_SIZE)-1;
+				m3 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1;
+				o1 = size%PAGE_SIZE;
+				o2 = (size+(size/4))%PAGE_SIZE;
+				printk("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2);
+				break;
+			}
+			case 16: {
+				/* create some offsets inside the page table */
+				m1 = ((size+PAGE_SIZE)/PAGE_SIZE)-1;
+				m2 = ((size+(size/2)+PAGE_SIZE)/PAGE_SIZE)-1;
+				m3 = ((2*size+PAGE_SIZE)/PAGE_SIZE)-1;
+				o1 = size%PAGE_SIZE;
+				o2 = (size+(size/2))%PAGE_SIZE;
+				printk("size:%d, m1:%d, m2:%d, m3:%d, o1:%d, o2:%d\n",size,m1,m2,m3,o1,o2);
+				break;
+			}
+			default: {
+				return -1;
+			}
+		}
+		
+		ptr1 = pt1->cpu;
+		ptr2 = pt2->cpu;
+		ptr3 = pt3->cpu;
+
+		/* walk all pages, copy all page addresses to ptr1 */
+		for (i = 0; i < length; i++, list++) {
+			for (p = 0; p * 4096 < list->length; p++, ptr1++) {
+				*ptr1 = sg_dma_address(list) - list->offset;
+			}
+		}
+/*
+		ptr1 = pt1->cpu;
+		for(j=0;j<40;j++) {
+			printk("ptr1 %d: 0x%08x\n",j,ptr1[j]);
+		}
+*/		
+
+		/* if we have a user buffer, the first page may not be
+		   aligned to a page boundary. */
+		pt1->offset = buf->vb.dma.sglist->offset;
+		pt2->offset = pt1->offset+o1;
+		pt3->offset = pt1->offset+o2;
+		
+		/* create video-dma2 page table */
+		ptr1 = pt1->cpu;
+		for(i = m1; i <= m2 ; i++, ptr2++) {
+			*ptr2 = ptr1[i];
+		}
+		fill = *(ptr2-1);
+		for(;i<1024;i++,ptr2++) {
+			*ptr2 = fill;
+		}
+		/* create video-dma3 page table */
+		ptr1 = pt1->cpu;
+		for(i = m2; i <= m3; i++,ptr3++) {
+			*ptr3 = ptr1[i];
+		}
+		fill = *(ptr3-1);
+		for(;i<1024;i++,ptr3++) {
+			*ptr3 = fill;
+		}
+		/* finally: finish up video-dma1 page table */		
+		ptr1 = pt1->cpu+m1;
+		fill = pt1->cpu[m1];
+		for(i=m1;i<1024;i++,ptr1++) {
+			*ptr1 = fill;
+		}
+/*
+		ptr1 = pt1->cpu;
+		ptr2 = pt2->cpu;
+		ptr3 = pt3->cpu;
+		for(j=0;j<40;j++) {
+			printk("ptr1 %d: 0x%08x\n",j,ptr1[j]);
+		}
+		for(j=0;j<40;j++) {
+			printk("ptr2 %d: 0x%08x\n",j,ptr2[j]);
+		}
+		for(j=0;j<40;j++) {
+			printk("ptr3 %d: 0x%08x\n",j,ptr3[j]);
+		}
+*/				
+	} else {
+		struct saa7146_pgtable *pt = &buf->pt[0];
+		saa7146_pgtable_build_single(pci, pt, list, length);
+	}
+
+	return 0;
+}
+
+
+/********************************************************************************/
+/* file operations */
+
+static
+int video_begin(struct saa7146_fh *fh)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	unsigned long flags;
+
+	DEB_EE(("dev:%p, fh:%p\n",dev,fh));
+
+	if( fh == vv->streaming ) {
+		DEB_S(("already capturing.\n"));
+		return 0;
+	}
+	if( vv->streaming != 0 ) {
+		DEB_S(("already capturing, but in another open.\n"));
+		return -EBUSY;
+	}
+
+	/* fixme: check for planar formats here, if we will interfere with
+	   vbi capture for example */	
+
+	spin_lock_irqsave(&dev->slock,flags);
+
+	/* clear out beginning of streaming bit */
+	saa7146_write(dev, MC2, MASK_27 );
+
+	/* enable rps0 irqs */
+	IER_ENABLE(dev, MASK_27);
+
+	vv->streaming = fh;
+	spin_unlock_irqrestore(&dev->slock,flags);
+	return 0;
+}
+
+static
+int video_end(struct saa7146_fh *fh)
+{
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	unsigned long flags;
+	
+	DEB_EE(("dev:%p, fh:%p\n",dev,fh));
+
+	if( vv->streaming != fh ) {
+		DEB_S(("not capturing.\n"));
+		return -EINVAL;
+	}
+
+	spin_lock_irqsave(&dev->slock,flags);
+
+	/* disable rps0  */
+	saa7146_write(dev, MC1, MASK_28);
+
+	/* disable rps0 irqs */
+	IER_DISABLE(dev, MASK_27);
+
+	// fixme: only used formats here!
+	/* fixme: look at planar formats here, especially at the
+	   shutdown of planar formats! */
+
+	/* shut down all used video dma transfers */
+	/* fixme: what about the budget-dvb cards? they use
+	   video-dma3, but video_end should not get called anyway ...*/
+	saa7146_write(dev, MC1, 0x00700000);
+
+	vv->streaming = NULL;
+	spin_unlock_irqrestore(&dev->slock, flags);
+	
+	return 0;
+}
+
+/*
+ * This function is _not_ called directly, but from
+ * video_generic_ioctl (and maybe others).  userspace
+ * copying is done already, arg is a kernel fhinter.
+ */
+
+int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int cmd, void *arg)
+{
+	struct saa7146_fh *fh  = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+
+	unsigned long flags;
+	int err = 0, result = 0, ee = 0;
+
+	struct saa7146_use_ops *ops;
+	struct videobuf_queue *q;
+
+	/* check if extension handles the command */
+	for(ee = 0; dev->ext->ext_vv_data->ioctls[ee].flags != 0; ee++) {
+		if( cmd == dev->ext->ext_vv_data->ioctls[ee].cmd )
+			break;
+	}
+	
+	if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_EXCLUSIVE) ) {
+		DEB_D(("extension handles ioctl exclusive.\n"));
+		result = dev->ext->ext_vv_data->ioctl(dev, cmd, arg);
+		return result;
+	}
+	if( 0 != (dev->ext->ext_vv_data->ioctls[ee].flags & SAA7146_BEFORE) ) {
+		DEB_D(("extension handles ioctl before.\n"));
+		result = dev->ext->ext_vv_data->ioctl(dev, cmd, arg);
+		if( -EAGAIN != result ) {
+			return result;
+		}
+	}
+	
+	/* fixme: add handle "after" case (is it still needed?) */
+
+	switch (fh->type) {
+	case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
+		ops = &saa7146_video_uops;
+		q = &fh->video_q;
+		break;
+		}
+	case V4L2_BUF_TYPE_VBI_CAPTURE: {
+		ops = &saa7146_vbi_uops;
+		q = &fh->vbi_q;
+		break;
+		}
+	default:
+		BUG();
+		return 0;
+	}
+
+	switch (cmd) {
+ 	case VIDIOC_QUERYCAP:
+	{
+		struct v4l2_capability *cap = arg;
+		memset(cap,0,sizeof(*cap));
+
+		DEB_EE(("VIDIOC_QUERYCAP\n"));
+		
+                strcpy(cap->driver, "saa7146 v4l2");
+		strncpy(cap->card, dev->ext->name, sizeof(cap->card));
+		sprintf(cap->bus_info,"PCI:%s",dev->pci->slot_name);
+		cap->version = SAA7146_VERSION_CODE;
+		cap->capabilities =
+			V4L2_CAP_VIDEO_CAPTURE |
+			V4L2_CAP_VIDEO_OVERLAY |
+			V4L2_CAP_READWRITE | 
+			V4L2_CAP_STREAMING;
+		cap->capabilities |= dev->ext->ext_vv_data->capabilities;
+		return 0;
+	}
+	case VIDIOC_G_FBUF:
+	{
+		struct v4l2_framebuffer *fb = arg;
+
+		DEB_EE(("VIDIOC_G_FBUF\n"));
+
+		*fb = vv->ov_fb;
+		fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
+		return 0;
+	}
+	case VIDIOC_S_FBUF:
+	{
+		struct v4l2_framebuffer *fb = arg;
+		struct saa7146_format *fmt;
+
+		DEB_EE(("VIDIOC_S_FBUF\n"));
+
+/*
+		if(!capable(CAP_SYS_ADMIN)) { // && !capable(CAP_SYS_RAWIO)) {
+			DEB_D(("VIDIOC_S_FBUF: not CAP_SYS_ADMIN or CAP_SYS_RAWIO.\n"));
+			return -EPERM;
+		}
+*/
+		if( 0 != vv->ov_data ) {
+			DEB_D(("VIDIOC_S_FBUF: overlay is active.\n"));
+			return -EPERM;
+		}
+
+		/* check args */
+		fmt = format_by_fourcc(dev,fb->fmt.pixelformat);
+		if (NULL == fmt) {
+			return -EINVAL;
+		}
+		
+		/* ok, accept it */
+		vv->ov_fb = *fb;
+		vv->ov_fmt = fmt;
+		if (0 == vv->ov_fb.fmt.bytesperline)
+			vv->ov_fb.fmt.bytesperline =
+				vv->ov_fb.fmt.width*fmt->depth/8;
+		return 0;
+	}
+	case VIDIOC_ENUM_FMT:
+	{
+		struct v4l2_fmtdesc *f = arg;
+		int index;
+
+		switch (f->type) {
+		case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+		case V4L2_BUF_TYPE_VIDEO_OVERLAY: {
+			index = f->index;
+			if (index < 0 || index >= NUM_FORMATS) {
+				return -EINVAL;
+			}
+			memset(f,0,sizeof(*f));
+			f->index = index;
+			strncpy(f->description,formats[index].name,31);
+			f->pixelformat = formats[index].pixelformat;
+			break;
+		}
+		default:
+			return -EINVAL;	
+		}
+
+		DEB_EE(("VIDIOC_ENUMSTD: type:%d, index:%d\n",f->type,f->index));
+		return 0;
+	}
+	case VIDIOC_QUERYCTRL:
+	{
+		const struct v4l2_queryctrl *ctrl;
+		struct v4l2_queryctrl *c = arg;
+
+		if ((c->id <  V4L2_CID_BASE ||
+		     c->id >= V4L2_CID_LASTP1) &&
+		    (c->id <  V4L2_CID_PRIVATE_BASE ||
+		     c->id >= V4L2_CID_PRIVATE_LASTP1))
+			return -EINVAL;
+			
+		ctrl = ctrl_by_id(c->id);
+		if( NULL == ctrl ) {
+			c->flags = V4L2_CTRL_FLAG_DISABLED;	
+			return 0;
+		}
+
+		DEB_EE(("VIDIOC_QUERYCTRL: id:%d\n",c->id));
+		*c = *ctrl;
+		return 0;
+	}
+	case VIDIOC_G_CTRL: {
+		DEB_EE(("VIDIOC_G_CTRL\n"));
+		return get_control(fh,arg);
+	}
+	case VIDIOC_S_CTRL:
+	{
+		DEB_EE(("VIDIOC_S_CTRL\n"));
+		down(&dev->lock);
+		err = set_control(fh,arg);
+		up(&dev->lock);
+		return err;
+	}
+        case VIDIOC_G_PARM:
+        {
+                struct v4l2_streamparm *parm = arg;
+		if( parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ) {
+			return -EINVAL;
+		}
+                memset(&parm->parm.capture,0,sizeof(struct v4l2_captureparm));
+		parm->parm.capture.readbuffers = 1;
+		// fixme: only for PAL!
+		parm->parm.capture.timeperframe.numerator = 1;
+		parm->parm.capture.timeperframe.denominator = 25;
+                return 0;
+        }
+	case VIDIOC_G_FMT:
+	{
+		struct v4l2_format *f = arg;
+		DEB_EE(("VIDIOC_G_FMT\n"));
+		return g_fmt(fh,f);
+	}
+	case VIDIOC_S_FMT:
+	{
+		struct v4l2_format *f = arg;
+		DEB_EE(("VIDIOC_S_FMT\n"));
+		return s_fmt(fh,f);
+	}
+	case VIDIOC_TRY_FMT:
+	{
+		struct v4l2_format *f = arg;
+		DEB_EE(("VIDIOC_TRY_FMT\n"));
+		return try_fmt(fh,f);
+	}
+	case VIDIOC_G_STD:
+	{
+		v4l2_std_id *id = arg;
+		DEB_EE(("VIDIOC_G_STD\n"));
+		*id = vv->standard->id;
+		return 0;
+	}
+	/* the saa7146 supfhrts (used in conjunction with the saa7111a for example)
+	   PAL / NTSC / SECAM. if your hardware does not (or does more)
+	   -- override this function in your extension */
+	case VIDIOC_ENUMSTD:
+	{
+		struct v4l2_standard *e = arg;
+		if (e->index < 0 )
+			return -EINVAL;
+		if( e->index < dev->ext->ext_vv_data->num_stds ) {
+			DEB_EE(("VIDIOC_ENUMSTD: index:%d\n",e->index));
+			return v4l2_video_std_construct(e, dev->ext->ext_vv_data->stds[e->index].id, dev->ext->ext_vv_data->stds[e->index].name);
+		}
+		return -EINVAL;
+	}
+	case VIDIOC_S_STD:
+	{
+		v4l2_std_id *id = arg;
+		int i;
+		
+		int restart_overlay = 0;
+		int found = 0;
+		
+		struct saa7146_fh *ov_fh = NULL;
+						
+		if( 0 != vv->streaming ) {
+			return -EBUSY;
+		}
+
+		down(&dev->lock);
+
+		if( vv->ov_data != NULL ) {
+			ov_fh = vv->ov_data->fh;
+			stop_preview(ov_fh);
+			restart_overlay = 1;
+		}
+
+		for(i = 0; i < dev->ext->ext_vv_data->num_stds; i++)
+			if (*id & dev->ext->ext_vv_data->stds[i].id)
+				break;
+		if (i != dev->ext->ext_vv_data->num_stds) {
+			vv->standard = &dev->ext->ext_vv_data->stds[i];
+			if( NULL != dev->ext->ext_vv_data->std_callback )
+				dev->ext->ext_vv_data->std_callback(dev, vv->standard);
+			found = 1;
+		}
+
+		if( 0 != restart_overlay ) {
+			start_preview(ov_fh);
+		}
+		up(&dev->lock);
+
+		if( 0 == found ) {
+			DEB_EE(("VIDIOC_S_STD: standard not found.\n"));
+			return -EINVAL;
+		}
+
+		DEB_EE(("VIDIOC_S_STD: set to standard to '%s'\n",vv->standard->name));
+		return 0;
+	}
+	case VIDIOC_OVERLAY:
+	{
+		int on = *(int *)arg;
+		int err = 0;
+
+		if( NULL == vv->ov_fmt ) {
+			DEB_D(("VIDIOC_OVERLAY: no framebuffer informations. call S_FBUF first!\n"));
+			return -EAGAIN;
+		}
+
+		DEB_D(("VIDIOC_OVERLAY on:%d\n",on));
+		if( 0 != on ) {
+			if( vv->ov_data != NULL ) {
+				if( fh != vv->ov_data->fh) {
+					return -EAGAIN;
+				}
+			}
+			spin_lock_irqsave(&dev->slock,flags);
+			err = start_preview(fh);
+			spin_unlock_irqrestore(&dev->slock,flags);
+		} else {
+			if( vv->ov_data != NULL ) {
+				if( fh != vv->ov_data->fh) {
+					return -EAGAIN;
+				}
+			}
+			spin_lock_irqsave(&dev->slock,flags);
+			err = stop_preview(fh);
+			spin_unlock_irqrestore(&dev->slock,flags);
+		}
+		return err;
+	}
+	case VIDIOC_REQBUFS: {
+		DEB_D(("VIDIOC_REQBUFS \n"));
+		return videobuf_reqbufs(file,q,arg);
+	}
+	case VIDIOC_QUERYBUF: {
+		DEB_D(("VIDIOC_QUERYBUF \n"));
+		return videobuf_querybuf(q,arg);
+	}
+	case VIDIOC_QBUF: {
+		DEB_D(("VIDIOC_QBUF \n"));
+		return videobuf_qbuf(file,q,arg);
+	}
+	case VIDIOC_DQBUF: {
+		DEB_D(("VIDIOC_DQBUF \n"));
+		return videobuf_dqbuf(file,q,arg);
+	}
+	case VIDIOC_STREAMON: {
+		DEB_D(("VIDIOC_STREAMON \n"));
+		if( 0 != ops->capture_begin ) {
+			if( 0 != (err = ops->capture_begin(fh))) {
+				return err;
+			}
+		}
+		err = videobuf_streamon(file,q);
+		return err;
+	}
+	case VIDIOC_STREAMOFF: {
+		DEB_D(("VIDIOC_STREAMOFF \n"));
+		if( 0 != ops->capture_end ) {
+			ops->capture_end(fh);
+		}
+		err = videobuf_streamoff(file,q);
+		return 0;
+	}
+	case VIDIOCGMBUF:
+	{
+		struct video_mbuf *mbuf = arg;
+		struct videobuf_queue *q;
+		int i;
+
+		/* fixme: number of capture buffers and sizes for v4l apps */
+		int gbuffers = 2; 
+		int gbufsize = 768*576*4;
+		
+		DEB_D(("VIDIOCGMBUF \n"));
+
+		q = &fh->video_q;
+		down(&q->lock);
+		err = videobuf_mmap_setup(file,q,gbuffers,gbufsize);
+		if (err < 0) {
+			up(&q->lock);
+			return err;
+		}
+		memset(mbuf,0,sizeof(*mbuf));
+		mbuf->frames = gbuffers;
+		mbuf->size   = gbuffers * gbufsize;
+		for (i = 0; i < gbuffers; i++)
+			mbuf->offsets[i] = i * gbufsize;
+		up(&q->lock);
+		return 0;
+	}
+	default:
+		return v4l_compat_translate_ioctl(inode,file,cmd,arg,
+						  saa7146_video_do_ioctl);
+	}
+	return 0;
+}
+
+/*********************************************************************************/
+/* buffer handling functions                                                  */
+
+static 
+int buffer_activate (struct saa7146_dev *dev,
+		     struct saa7146_buf *buf,
+		     struct saa7146_buf *next)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+
+	buf->vb.state = STATE_ACTIVE;
+	saa7146_set_capture(dev,buf,next);
+	
+	mod_timer(&vv->video_q.timeout, jiffies+BUFFER_TIMEOUT);
+	return 0;
+}
+
+static
+int buffer_prepare(struct file *file, struct videobuf_buffer *vb, enum v4l2_field field)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	struct saa7146_buf *buf = (struct saa7146_buf *)vb;
+	int size,err = 0;
+
+	/* sanity checks */
+	if (fh->video_fmt.width  < 64 ||
+	    fh->video_fmt.height < 64 ||
+	    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));
+		return -EINVAL;
+	}
+
+	size = fh->video_fmt.sizeimage;
+	if (0 != buf->vb.baddr && buf->vb.bsize < size) {
+		DEB_D(("size mismatch.\n"));
+		return -EINVAL;
+	}
+	
+	DEB_CAP(("buffer_prepare [size=%dx%d,bytes=%d,fields=%s]\n",
+		fh->video_fmt.width,fh->video_fmt.height,size,v4l2_field_names[fh->video_fmt.field]));
+	if (buf->vb.width  != fh->video_fmt.width  ||
+	    buf->vb.height != fh->video_fmt.height ||
+	    buf->vb.size   != size ||
+	    buf->vb.field  != field      ||
+	    buf->vb.field  != fh->video_fmt.field  ||
+	    buf->fmt       != &fh->video_fmt) {
+		saa7146_dma_free(dev,buf);
+	}
+
+	if (STATE_NEEDS_INIT == buf->vb.state) {
+		struct saa7146_format *sfmt;
+		
+		buf->vb.width  = fh->video_fmt.width;
+		buf->vb.height = fh->video_fmt.height;
+		buf->vb.size   = size;
+		buf->vb.field  = field;
+		buf->fmt       = &fh->video_fmt;
+		buf->vb.field  = fh->video_fmt.field;
+		
+		sfmt = format_by_fourcc(dev,buf->fmt->pixelformat);
+			
+		if( 0 != IS_PLANAR(sfmt->trans)) {
+			saa7146_pgtable_free(dev->pci, &buf->pt[0]);
+			saa7146_pgtable_free(dev->pci, &buf->pt[1]);
+			saa7146_pgtable_free(dev->pci, &buf->pt[2]);
+
+			saa7146_pgtable_alloc(dev->pci, &buf->pt[0]);
+			saa7146_pgtable_alloc(dev->pci, &buf->pt[1]);
+			saa7146_pgtable_alloc(dev->pci, &buf->pt[2]);
+		} else {
+			saa7146_pgtable_free(dev->pci, &buf->pt[0]);
+			saa7146_pgtable_alloc(dev->pci, &buf->pt[0]);
+		}
+		
+		err = videobuf_iolock(dev->pci,&buf->vb);
+		if (err)
+			goto oops;
+		err = saa7146_pgtable_build(dev,buf);
+		if (err)
+			goto oops;
+	}
+	buf->vb.state = STATE_PREPARED;
+	buf->activate = buffer_activate;
+
+	return 0;
+
+ oops:
+	DEB_D(("error out.\n"));
+	saa7146_dma_free(dev,buf);
+
+	return err;
+}
+
+static 
+int buffer_setup(struct file *file, unsigned int *count, unsigned int *size)
+{
+	struct saa7146_fh *fh = file->private_data;
+
+	if (0 == *count || *count > MAX_SAA7146_CAPTURE_BUFFERS)
+		*count = MAX_SAA7146_CAPTURE_BUFFERS;
+
+	*size = fh->video_fmt.sizeimage;
+
+	/* check if we exceed the "memory" parameter */
+	if( (*count * *size) > (memory*1048576) ) {
+		*count = (memory*1048576) / *size;
+	}
+	
+	DEB_CAP(("%d buffers, %d bytes each.\n",*count,*size));
+
+	return 0;
+}
+
+static 
+void buffer_queue(struct file *file, struct videobuf_buffer *vb)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	struct saa7146_buf *buf = (struct saa7146_buf *)vb;
+	
+	DEB_CAP(("vbuf:%p\n",vb));
+	saa7146_buffer_queue(fh->dev,&vv->video_q,buf);
+}
+
+
+static 
+void buffer_release(struct file *file, struct videobuf_buffer *vb)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_buf *buf = (struct saa7146_buf *)vb;
+	
+	DEB_CAP(("vbuf:%p\n",vb));
+	saa7146_dma_free(dev,buf);
+}
+
+static
+struct videobuf_queue_ops video_qops = {
+	.buf_setup    = buffer_setup,
+	.buf_prepare  = buffer_prepare,
+	.buf_queue    = buffer_queue,
+	.buf_release  = buffer_release,
+};
+
+/********************************************************************************/
+/* file operations */
+
+static
+void video_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
+{
+        INIT_LIST_HEAD(&vv->video_q.queue);
+
+	init_timer(&vv->video_q.timeout);
+	vv->video_q.timeout.function = saa7146_buffer_timeout;
+	vv->video_q.timeout.data     = (unsigned long)(&vv->video_q);
+	vv->video_q.dev              = dev;
+
+	/* set some default values */
+	vv->standard = &dev->ext->ext_vv_data->stds[0];
+
+	/* FIXME: what's this? */
+	vv->current_hps_source = SAA7146_HPS_SOURCE_PORT_A;
+	vv->current_hps_sync = SAA7146_HPS_SYNC_PORT_A;
+}
+
+
+static
+void video_open(struct saa7146_dev *dev, struct saa7146_fh *fh)
+{
+	struct saa7146_format *sfmt;
+
+	fh->video_fmt.width = 384;
+	fh->video_fmt.height = 288;
+	fh->video_fmt.pixelformat = V4L2_PIX_FMT_BGR24;
+	fh->video_fmt.field = V4L2_FIELD_ANY;
+	sfmt = format_by_fourcc(dev,fh->video_fmt.pixelformat);
+	fh->video_fmt.sizeimage = (fh->video_fmt.width * fh->video_fmt.height * sfmt->depth)/8;
+
+	videobuf_queue_init(&fh->video_q, &video_qops,
+			    dev->pci, &dev->slock,
+			    V4L2_BUF_TYPE_VIDEO_CAPTURE,
+			    V4L2_FIELD_INTERLACED,
+			    sizeof(struct saa7146_buf));
+
+	init_MUTEX(&fh->video_q.lock);
+}
+
+
+static
+void video_close(struct saa7146_dev *dev, struct saa7146_fh *fh, struct file *file)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	unsigned long flags;
+	
+	if( 0 != vv->ov_data ) {
+		if( fh == vv->ov_data->fh ) {
+			spin_lock_irqsave(&dev->slock,flags);
+			stop_preview(fh);
+			spin_unlock_irqrestore(&dev->slock,flags);
+		}
+	}
+	
+	if( fh == vv->streaming ) {
+		video_end(fh);		
+	}
+
+	videobuf_queue_cancel(file,&fh->video_q);
+}
+
+
+static
+void video_irq_done(struct saa7146_dev *dev, unsigned long st)
+{
+	struct saa7146_vv *vv = dev->vv_data;
+	struct saa7146_dmaqueue *q = &vv->video_q;
+	
+	spin_lock(&dev->slock);
+	DEB_CAP(("called.\n"));
+
+	/* only finish the buffer if we have one... */
+	if( NULL != q->curr ) {
+		saa7146_buffer_finish(dev,q,STATE_DONE);
+	}
+	saa7146_buffer_next(dev,q,0);
+
+	spin_unlock(&dev->slock);
+}
+
+static
+ssize_t video_read(struct file *file, char *data, size_t count, loff_t *ppos)
+{
+	struct saa7146_fh *fh = file->private_data;
+	struct saa7146_dev *dev = fh->dev;
+	struct saa7146_vv *vv = dev->vv_data;
+	ssize_t ret = 0;
+
+	int restart_overlay = 0;
+	struct saa7146_fh *ov_fh = NULL;
+
+	DEB_EE(("called.\n"));
+
+	if( vv->ov_data != NULL ) {
+		ov_fh = vv->ov_data->fh;
+		stop_preview(ov_fh);
+		restart_overlay = 1;
+	}
+
+	if( 0 != video_begin(fh)) {
+		return -EAGAIN;
+	}
+	ret = videobuf_read_one(file,&fh->video_q , data, count, ppos);
+	video_end(fh);
+
+	/* restart overlay if it was active before */
+	if( 0 != restart_overlay ) {
+		start_preview(ov_fh);
+	}
+	
+	return ret;
+}
+
+struct saa7146_use_ops saa7146_video_uops = {
+	.init = video_init,
+	.open = video_open,
+	.release = video_close,
+	.irq_done = video_irq_done,
+	.read = video_read,
+	.capture_begin = video_begin,
+	.capture_end = video_end,
+};
+
+EXPORT_SYMBOL_GPL(saa7146_video_uops);
diff -Nru a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig
--- a/drivers/media/dvb/Kconfig	Sat Apr 19 19:51:30 2003
+++ b/drivers/media/dvb/Kconfig	Sat Apr 19 19:51:30 2003
@@ -3,7 +3,7 @@
 #
 
 menu "Digital Video Broadcasting Devices"
-	depends on VIDEO_DEV!=n
+	depends on NET && INET 
 
 config DVB
 	bool "DVB For Linux"
@@ -32,10 +32,10 @@
 
 source "drivers/media/dvb/frontends/Kconfig"
 
-comment "Supported DVB Adapters"
+comment "Supported SAA7146 based PCI Adapters"
 	depends on DVB
 
-source "drivers/media/dvb/av7110/Kconfig"
+source "drivers/media/dvb/ttpci/Kconfig"
 
 endmenu
 
diff -Nru a/drivers/media/dvb/Makefile b/drivers/media/dvb/Makefile
--- a/drivers/media/dvb/Makefile	Sat Apr 19 19:51:48 2003
+++ b/drivers/media/dvb/Makefile	Sat Apr 19 19:51:48 2003
@@ -2,4 +2,4 @@
 # Makefile for the kernel multimedia device drivers.
 #
 
-obj-y        := dvb-core/ frontends/ av7110/
+obj-y        := dvb-core/ frontends/ ttpci/ # ttusb-budget/
diff -Nru a/drivers/media/dvb/av7110/Kconfig b/drivers/media/dvb/av7110/Kconfig
--- a/drivers/media/dvb/av7110/Kconfig	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,26 +0,0 @@
-config DVB_AV7110
-	tristate "SAA7146 based AV7110 and Nova/budget cards"
-	depends on VIDEO_DEV && DVB_CORE
-	help
-	  Support for SAA7146 and AV7110 based DVB cards as produced 
-	  by Fujitsu-Siemens, Technotrend, Hauppauge and others.
-
-	  Simple cards like so called Budget- or Nova-PCI cards are 
-	  supported as well as fullfeatured cards with onboard MPEG2 
-	  decoder.
-
-	  Say Y if you own such a card and want to use it.
-
-config DVB_AV7110_OSD
-	bool "AV7110 OSD support"
-	depends on DVB_AV7110
-	help
-	  The AV7110 firmware provides some code to generate an OnScreenDisplay
-	  on the video output. This is kind of nonstandard and not guaranteed to
-	  be maintained.
-
-	  Anyway, some popular DVB software like VDR uses this OSD to render
-	  its menus, so say Y if you want to use this software.
-
-	  All other people say N.
-
diff -Nru a/drivers/media/dvb/av7110/Makefile b/drivers/media/dvb/av7110/Makefile
--- a/drivers/media/dvb/av7110/Makefile	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,9 +0,0 @@
-#
-# Makefile for the kernel AV7110 DVB device driver
-#
-
-dvb-ttpci-objs := saa7146_core.o saa7146_v4l.o av7110.o av7110_ir.o
-
-obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o
-
-EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
diff -Nru a/drivers/media/dvb/av7110/av7110.c b/drivers/media/dvb/av7110/av7110.c
--- a/drivers/media/dvb/av7110/av7110.c	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,4840 +0,0 @@
-/*
- * av7110.c: driver for the SAA7146 based AV110 cards (like the Fujitsu-Siemens DVB)
- *           and Nova/Budget DVB cards 
- *
- * Copyright (C) 1999-2002 Ralph  Metzler 
- *                       & Marcus Metzler for convergence integrated media GmbH
- *
- * originally based on code by:
- * 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., 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/
- */
-
-#define NEW_CI 1
-
-#define __KERNEL_SYSCALLS__
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/kmod.h>
-#include <linux/delay.h>
-#include <linux/fs.h>
-#include <linux/timer.h>
-#include <linux/unistd.h>
-#include <linux/byteorder/swabb.h>
-#include <linux/poll.h>
-#include <linux/slab.h>
-#include <linux/smp_lock.h>
-#include <stdarg.h>
-
-#include <linux/kernel.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-#include <linux/fcntl.h>
-#include <linux/interrupt.h>
-#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 <asm/system.h>
-#include <asm/bitops.h>
-#include <asm/io.h>
-#include <asm/dma.h>
-#include <asm/semaphore.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/dvb/frontend.h>
-
-#include "../dvb-core/dvb_i2c.h"
-#include "../dvb-core/dvb_frontend.h"
-#include "av7110.h"
-
-#include "saa7146_core.h"
-#include "saa7146_v4l.h"
-#include "saa7146_defs.h"
-
-
-static int AV_StartPlay(av7110_t *av7110, int av);
-static void restart_feeds(av7110_t *av7110);
-static int bootarm(av7110_t *av7110);
-static inline int i2c_writereg(av7110_t *av7110, u8 id, u8 reg, u8 val);
-static inline u8 i2c_readreg(av7110_t *av7110, u8 id, u8 reg);
-static int  outcom(av7110_t *av7110, int type, int com, int num, ...);
-static void SetMode(av7110_t *av7110, int mode);
-
-void pes_to_ts(u8 const *buf, long int length, u16 pid, p2t_t *p);
-void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, struct dvb_demux_feed *feed);
-
-static u32 vidmem	= 0;
-static u32 vidlow	= 0;
-
-static int av7110_debug = 0;
-#define dprintk	if (av7110_debug) printk
-
-static int vidmode=CVBS_RGB_OUT;
-static int init_vpid;
-static int init_apid;
-static int pids_off;
-static int adac=DVB_ADAC_TI;
-
-#define saacomm(x,y) av7110->saa->command(av7110->saa->i2c_bus, (x), (y))
-
-
-/****************************************************************************
- * General helper functions
- ****************************************************************************/
-
-static inline void ddelay(int i) 
-{
-        current->state=TASK_INTERRUPTIBLE;
-        schedule_timeout((HZ*i)/100);
-}
-
-
-/****************************************************************************
- * GPIO and DEBI functions
- ****************************************************************************/
-
-#define saaread(adr)            saa7146_read(saamem,(adr))
-#define saawrite(dat,adr) 	saa7146_write(saamem,(adr),(dat))
-
-inline static void 
-setgpio(av7110_t *av7110, int port, u32 data)
-{
-        void *saamem=av7110->saa_mem;
-        u32 val;
-
-        val=saaread(GPIO_CTRL);
-        val&=~(0xff << (8*(port)));
-        val|=(data)<<(8*(port));
-        saawrite(val, GPIO_CTRL);
-}
-
-/* This DEBI code is based on the Stradis driver 
-   by Nathan Laredo <laredo@gnu.org> */
-
-static
-int wait_for_debi_done(av7110_t *av7110)
-{
-        void *saamem=av7110->saa_mem;
-	int start;
-
-	/* wait for registers to be programmed */
-	start = jiffies;
-	while (1) {
-                if (saaread(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 (!(saaread(PSR) & SPCI_DEBI_S))
-			break;
-		saaread(MC2);
-		if (jiffies-start > HZ/4) {
-			printk ("%s: timed out while waiting for transfer "
-				"completion\n", __FUNCTION__);
-			return -ETIMEDOUT;
-		}
-	}
-
-	return 0;
-}
-
-static int debiwrite(av7110_t *av7110, u32 config, 
-                     int addr, u32 val, int count)
-{
-        void *saamem=av7110->saa_mem;
-	u32 cmd;
-
-	if (count <= 0 || count > 32764)
-		return -1;
-	if (wait_for_debi_done(av7110) < 0)
-		return -1;
-	saawrite(config, DEBI_CONFIG);
-	if (count <= 4)		/* immediate transfer */
-		saawrite(val, DEBI_AD);
-	else			/* block transfer */
-		saawrite(av7110->debi_bus, DEBI_AD);
-	saawrite((cmd = (count << 17) | (addr & 0xffff)), DEBI_COMMAND);
-	saawrite((2 << 16) | 2, MC2);
-	return 0;
-}
-
-static u32 debiread(av7110_t *av7110, u32 config, int addr, int count)
-{
-        void *saamem=av7110->saa_mem;
-	u32 result = 0;
-
-	if (count > 32764 || count <= 0)
-		return 0;
-	if (wait_for_debi_done(av7110) < 0)
-		return 0;
-	saawrite(av7110->debi_bus, DEBI_AD);
-	saawrite((count << 17) | 0x10000 | (addr & 0xffff),
-		 DEBI_COMMAND);
-
-	saawrite(config, DEBI_CONFIG);
-	saawrite((2 << 16) | 2, MC2);
-	if (count > 4)	
-		return count;
-	wait_for_debi_done(av7110);
-	result = saaread(DEBI_AD);
-        result &= (0xffffffffUL >> ((4-count)*8));
-	return result;
-}
-
-/* DEBI during interrupt */
-
-static inline void 
-iwdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
-{
-        if (count>4 && val)
-                memcpy(av7110->debi_virt, (char *) val, count);
-        debiwrite(av7110, config, addr, val, count);
-}
-
-static inline u32 
-irdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
-{
-        u32 res;
-
-        res=debiread(av7110, config, addr, count);
-        if (count<=4) 
-                memcpy(av7110->debi_virt, (char *) &res, count);
-        return res;
-}
-
-/* DEBI outside interrupts, only for count<=4! */
-
-static inline void 
-wdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&av7110->debilock, flags);
-        debiwrite(av7110, config, addr, val, count);
-        spin_unlock_irqrestore(&av7110->debilock, flags);
-}
-
-static inline u32 
-rdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
-{
-        unsigned long flags;
-        u32 res;
-
-        spin_lock_irqsave(&av7110->debilock, flags);
-        res=debiread(av7110, config, addr, count);
-        spin_unlock_irqrestore(&av7110->debilock, flags);
-        return res;
-}
-
-
-static inline char 
-chtrans(char c)
-{
-        if (c<32 || c>126)
-                c=0x20;
-        return c;
-}
-
-
-/* handle mailbox registers of the dual ported RAM */
-
-static inline void 
-ARM_ResetMailBox(av7110_t *av7110)
-{
-        unsigned long flags;
-
-        spin_lock_irqsave(&av7110->debilock, flags);
-        debiread(av7110, DEBINOSWAP, IRQ_RX, 2);
-        //printk("dvb: IRQ_RX=%d\n", debiread(av7110, DEBINOSWAP, IRQ_RX, 2));
-        debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
-        spin_unlock_irqrestore(&av7110->debilock, flags);
-}
-
-static inline void 
-ARM_ClearMailBox(av7110_t *av7110)
-{
-        iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
-}
-
-static inline void 
-ARM_ClearIrq(av7110_t *av7110)
-{
-	irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
-}
-
-static void 
-reset_arm(av7110_t *av7110)
-{
-        setgpio(av7110, RESET_LINE, GPIO_OUTLO);
-
-        /* Disable DEBI and GPIO irq */
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER) & ~(MASK_19 | MASK_03));
-        saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03));
-
-        mdelay(800);
-        setgpio(av7110, RESET_LINE, GPIO_OUTHI);
-        mdelay(800);
-
-        ARM_ResetMailBox(av7110); 
-
-        saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03));
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER) | MASK_03 );
-
-        av7110->arm_ready=1;
-        printk("av7110: ARM RESET\n");
-}
-
-static void 
-recover_arm(av7110_t *av7110)
-{
-        if (current->files)
-                bootarm(av7110);
-        else {
-                printk("OOPS, no current->files\n");
-                reset_arm(av7110);
-        }
-        ddelay(10); 
-        restart_feeds(av7110);
-}
-
-static void 
-arm_error(av7110_t *av7110)
-{
-        av7110->arm_errors++;
-        av7110->arm_ready=0;
-        recover_arm(av7110);
-}
-
-static int arm_thread(void *data)
-{
-	av7110_t *av7110 = data;
-        u16 newloops;
-    
-	lock_kernel();
-#if 0
-	daemonize("arm_mon");
-#else
-        exit_mm(current);
-        current->session=current->pgrp=1;
-	sigfillset(&current->blocked);
-	strcpy(current->comm, "arm_mon");
-#endif
-	av7110->arm_thread = current;
-	unlock_kernel();
-
-	while (!av7110->arm_rmmod && !signal_pending(current)) {
-                interruptible_sleep_on_timeout(&av7110->arm_wait, 5*HZ);
-
-                if (!av7110->arm_ready)
-                        continue;
-
-                if (down_interruptible(&av7110->dcomlock))
-                        break;
-
-                newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2);
-                up(&av7110->dcomlock);
-
-                if (newloops==av7110->arm_loops) {
-                        printk("av7110%d: ARM crashed!\n",
-				av7110->saa->dvb_adapter->num);
-
-			arm_error(av7110);
-
-                        if (down_interruptible(&av7110->dcomlock))
-                                break;
-
-                        newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1;
-                        up(&av7110->dcomlock);
-                }
-                av7110->arm_loops=newloops;
-	}
-
-	av7110->arm_thread = NULL;
-	return 0;
-}
-
-
-static int
-record_cb(dvb_filter_pes2ts_t *p2t, u8 *buf, size_t len)
-{
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) p2t->priv;
-
-        if (!(dvbdmxfeed->ts_type & TS_PACKET)) 
-                return 0;
-	if (buf[3]==0xe0)        // video PES do not have a length in TS
-                buf[4]=buf[5]=0;
-        if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) 
-                return dvbdmxfeed->cb.ts(buf, len, 0, 0, 
-                                         &dvbdmxfeed->feed.ts, DMX_OK); 
-        else
-                return dvb_filter_pes2ts(p2t, buf, len);
-}
-
-static int 
-dvb_filter_pes2ts_cb(void *priv, unsigned char *data)
-{
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) priv;
-        
-        dvbdmxfeed->cb.ts(data, 188, 0, 0,
-                          &dvbdmxfeed->feed.ts,
-                          DMX_OK); 
-        return 0;
-}
-
-static int 
-AV_StartRecord(av7110_t *av7110, int av,
-               struct dvb_demux_feed *dvbdmxfeed)
-{
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-  
-        if (av7110->playing||(av7110->rec_mode&av))
-                return -EBUSY;
-        outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-        dvbdmx->recording=1;
-        av7110->rec_mode|=av;
-
-        switch (av7110->rec_mode) {
-        case RP_AUDIO:
-                dvb_filter_pes2ts_init (&av7110->p2t[0],
-					dvbdmx->pesfilter[0]->pid,
-					dvb_filter_pes2ts_cb,
-					(void *)dvbdmx->pesfilter[0]);
-                outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
-                break;
-
-        case RP_VIDEO:
-                dvb_filter_pes2ts_init (&av7110->p2t[1],
-					dvbdmx->pesfilter[1]->pid,
-					dvb_filter_pes2ts_cb,
-					(void *)dvbdmx->pesfilter[1]);
-                outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
-                break;
-
-        case RP_AV:
-                dvb_filter_pes2ts_init (&av7110->p2t[0],
-					dvbdmx->pesfilter[0]->pid,
-					dvb_filter_pes2ts_cb,
-					(void *)dvbdmx->pesfilter[0]);
-                dvb_filter_pes2ts_init (&av7110->p2t[1],
-					dvbdmx->pesfilter[1]->pid,
-					dvb_filter_pes2ts_cb,
-					(void *)dvbdmx->pesfilter[1]);
-                outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0);
-                break;
-        }
-        return 0;
-}
-
-static int 
-AV_StartPlay(av7110_t *av7110, int av)
-{
-        if (av7110->rec_mode)
-                return -EBUSY;
-        if (av7110->playing&av)
-                return -EBUSY;
-
-        outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-
-        if (av7110->playing == RP_NONE) {
-                dvb_filter_ipack_reset(&av7110->ipack[0]);
-                dvb_filter_ipack_reset(&av7110->ipack[1]);
-        }
-
-        av7110->playing|=av;
-        switch (av7110->playing) {
-        case RP_AUDIO:
-                outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
-                break;
-        case RP_VIDEO:
-                outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
-                av7110->sinfo=0;
-                break;
-        case RP_AV:
-                av7110->sinfo=0;
-                outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0);
-                break;
-        }
-        return av7110->playing;
-}
-
-static void 
-AV_Stop(av7110_t *av7110, int av)
-{
-        if (!(av7110->playing&av) && !(av7110->rec_mode&av))
-                return;
-
-        outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-        if (av7110->playing) {
-                av7110->playing&=~av;
-                switch (av7110->playing) {
-                case RP_AUDIO:
-                        outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
-                        break;
-                case RP_VIDEO:
-                        outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
-                        break;
-                case RP_NONE:
-                        SetMode(av7110, av7110->vidmode);
-                        break;
-                }
-        } else {
-                av7110->rec_mode&=~av;
-                switch (av7110->rec_mode) {
-                case RP_AUDIO:
-                        outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
-                        break;
-                case RP_VIDEO:
-                        outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
-                        break;
-                case RP_NONE:
-                        break;
-                }
-        }
-}
-
-/****************************************************************************
- * Buffer handling
- ****************************************************************************/
-
-static inline void 
-ring_buffer_flush(ring_buffer_t *rbuf)
-{
-        spin_lock_irq(&rbuf->lock);
-        rbuf->pwrite=rbuf->pread;
-        spin_unlock_irq(&rbuf->lock);
-        wake_up(&rbuf->queue);
-}
-
-static inline void 
-ring_buffer_init(ring_buffer_t *rbuf, u8 *data, int len)
-{
-        rbuf->pread=rbuf->pwrite=0;
-        rbuf->data=data;
-        rbuf->size=len;
-        init_waitqueue_head(&rbuf->queue);
-        spin_lock_init(&(rbuf->lock));
-        rbuf->lock=SPIN_LOCK_UNLOCKED;
-        sema_init(&(rbuf->sema), 1);
-}
-
-static inline 
-int ring_buffer_empty(ring_buffer_t *rbuf)
-{
-        return (rbuf->pread==rbuf->pwrite);
-}
-
-static inline 
-int ring_buffer_free(ring_buffer_t *rbuf)
-{
-        int free;
-  
-        free=rbuf->pread - rbuf->pwrite;
-        if (free<=0)
-                free+=rbuf->size;
-        return free;
-}
-
-static inline 
-int ring_buffer_avail(ring_buffer_t *rbuf)
-{
-        int avail;
-  
-        avail=rbuf->pwrite - rbuf->pread;
-        if (avail<0)
-                avail+=rbuf->size;
-        return avail;
-}
-
-#if 0
-static void
-ring_buffer_block(ring_buffer_t *rbuf, unsigned long count)
-{
-        if (ring_buffer_free(rbuf)>=count)
-                return;
-        while (!wait_event_interruptible(rbuf->queue,
-                                         (ring_buffer_free(rbuf)>=count)));
-}
-#endif
-
-static long 
-ring_buffer_write(ring_buffer_t *rbuf, 
-              const char *buf, unsigned long count, 
-              int nonblock, int usermem)
-{
-        unsigned long todo = count;
-        int free, split;
-    
-        while (todo > 0) {
-                if (ring_buffer_free(rbuf)<=2048) {
-                        if (nonblock)
-                                return count-todo;
-                        if (wait_event_interruptible(rbuf->queue,
-                                                     (ring_buffer_free(rbuf)>2048)))
-                        	return count-todo;
-                }   
-                dprintk ("function: %s pread=%08x pwrite=%08x\n", __FUNCTION__,
-                        rbuf->pread, rbuf->pwrite);
-                //mdelay(2);
-                free = rbuf->pread - rbuf->pwrite;
-                split=rbuf->size;
-                if (free<=0) {
-                        free+=rbuf->size;
-                        split-=rbuf->pwrite;
-                }
-                if (free > todo)
-                        free = todo;
-                        
-                if (split < free) {
-                        if (!usermem) 
-                                memcpy(rbuf->data+rbuf->pwrite, buf, split);
-                        else
-                                if (copy_from_user(rbuf->data+rbuf->pwrite,
-                                                   buf, split)) 
-                                        return -EFAULT;
-                        buf += split;
-                        todo -= split;
-                        free -= split;
-                        rbuf->pwrite = 0;
-                }
-                if (!usermem) 
-                        memcpy(rbuf->data+rbuf->pwrite, buf, free);
-                else
-                        if (copy_from_user(rbuf->data+rbuf->pwrite, buf, free)) 
-                                return -EFAULT;
-                rbuf->pwrite = (rbuf->pwrite + free)%rbuf->size;
-                todo -= free;
-                buf += free;
-        }
-
-	return count-todo;
-}
-
-#if 0
-static void
-ring_buffer_put(ring_buffer_t *db, u8 *buf, int len)
-{
-        int split, fsize;
-
-        fsize=db->pread - db->pwrite;
-        if (fsize <= 0) {
-                fsize+=db->size;
-                split=db->size-db->pwrite;
-        } else 
-                split=0;
-        if (len>=fsize) {
-                dprintk("buffer overflow\n");
-                return;
-        }
-        if (split>=len)
-                split=0;
-        if (split) {
-                memcpy(db->data + db->pwrite, buf, split);
-                len-=split;
-                db->pwrite=0;
-        }
-        memcpy(db->data + db->pwrite, split + buf, len);
-        db->pwrite=(db->pwrite+len)%db->size;
-}
-#endif
-
-
-/****************************************************************************
- * TT budget / WinTV Nova
- ****************************************************************************/
-
-static int 
-TTBStop(av7110_t *av7110)
-{
-        if (--av7110->feeding)
-                return av7110->feeding;
-        saa7146_write(av7110->saa_mem, MC1, MASK_20); // DMA3 off
-        saa7146_write(av7110->saa_mem, MC1, MASK_28); // RPS0 off
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER) & ~MASK_10 );
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER)& ~MASK_07);
-        return 0;
-}
-
-#define TS_WIDTH  (4*188)
-#define TS_HEIGHT (1024/4)
-static int
-TTBStart(av7110_t *av7110)
-{
-        struct saa7146 *saa=av7110->saa;
-
-        //printk ("function : %s\n", __FUNCTION__);
-        if (av7110->feeding) 
-                return ++av7110->feeding;
-
-      	saa7146_write(saa->mem, MC1, MASK_20); // DMA3 off
-
-        memset(saa->grabbing, 0x00, TS_HEIGHT*TS_WIDTH);
-
-        saa7146_write(saa->mem, PCI_BT_V1, 0x001c0000);
-
-        av7110->tsf=0;
-        av7110->ttbp=0;
-        saa7146_write(saa->mem, DD1_INIT, 0x02000680);
-        saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-
-        saa7146_write(saa->mem, BRS_CTRL, 0x60000000);	
-      	saa7146_write(saa->mem, MC2, (MASK_08 | MASK_24));
-        mdelay(10);
-
-        saa7146_write(saa->mem, BASE_ODD3, 0);
-        saa7146_write(saa->mem, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2);
-        saa7146_write(saa->mem, PROT_ADDR3, TS_WIDTH*TS_HEIGHT);	
-        saa7146_write(saa->mem, BASE_PAGE3, virt_to_bus(saa->page_table[0])|ME1|0xb0);
-        saa7146_write(saa->mem, PITCH3, TS_WIDTH);	
-
-        saa7146_write(saa->mem, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH);
-      	saa7146_write(saa->mem, MC2, (MASK_04 | MASK_20));
-
-        // VPE
-        saa7146_write(saa->mem, IER, saa7146_read(saa->mem, IER)|MASK_10);
-
-     	saa7146_write(saa->mem, MC1, (MASK_04 | MASK_20)); // DMA3 on
-
-        // FIDB
-        saa7146_write(saa->mem, IER, saa7146_read(saa->mem, IER)|MASK_07);
-
-        return ++av7110->feeding;
-}
-
-/**
- *  Hack! we save the last av7110 ptr. This should be ok, since
- *  you rarely will use more then one IR control. 
- *
- *  If we want to support multiple controls we would have to do much more...
- */
-void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config)
-{
-	static av7110_t *last;
-
-	if (!av7110)
-		av7110 = last;
-	else
-		last = av7110;
-
-	outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config);
-}
-
-static void (*irc_handler)(u32);
-
-void av7110_register_irc_handler(void (*func)(u32)) 
-{
-        //dprintk("registering %08x\n",func);
-        irc_handler = func;
-}
-
-void av7110_unregister_irc_handler(void (*func)(u32)) 
-{
-        //dprintk("unregistering %08x\n",func);
-        irc_handler = NULL;
-}
-
-void run_handlers(unsigned long ircom) 
-{
-        if (irc_handler != NULL)
-                (*irc_handler)((u32) ircom);
-}
-
-DECLARE_TASKLET(irtask,run_handlers,0);
-
-void IR_handle(av7110_t *av7110, u32 ircom)
-{
-        dprintk("av7110: ircommand = %08x\n", ircom);
-        irtask.data = (unsigned long) ircom;
-        tasklet_schedule(&irtask);
-}
-
-/****************************************************************************
- * IRQ handling
- ****************************************************************************/
-
-void CI_handle(av7110_t *av7110, u8 *data, u16 len) 
-{
-        //CI_out(av7110, data, len);
-
-        if (len<3)
-                return;
-        switch (data[0]) {
-        case CI_MSG_CI_INFO:
-                if (data[2]!=1 && data[2]!=2)
-                        break;
-                switch (data[1]) {
-                case 0:
-                        av7110->ci_slot[data[2]-1].flags=0;
-                        break;
-                case 1:
-                        av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_PRESENT;
-                        break;
-                case 2:
-                        av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_READY;
-                        break;
-                }
-                break;
-        case CI_SWITCH_PRG_REPLY:
-                //av7110->ci_stat=data[1];
-                break;
-        default:
-                break;
-        }
-
-}
-
-static inline int
-DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len,
-                     u8 * buffer2, size_t buffer2_len,
-                     struct dvb_demux_filter *dvbdmxfilter,
-                     dmx_success_t success,
-                     av7110_t *av7110)
-{
-        if (!dvbdmxfilter->feed->demux->dmx.frontend)
-                return 0;
-        if (dvbdmxfilter->feed->demux->dmx.frontend->source==DMX_MEMORY_FE)
-                return 0;
-        
-        switch(dvbdmxfilter->type) {
-        case DMX_TYPE_SEC:
-                if ((((buffer1[1]<<8)|buffer1[2])&0xfff)+3!=buffer1_len)
-                        return 0;
-                if (dvbdmxfilter->doneq) {
-                        dmx_section_filter_t *filter=&dvbdmxfilter->filter;
-                        int i;
-                        u8 xor, neq=0;
-                        
-                        for (i=0; i<DVB_DEMUX_MASK_MAX; i++) {
-                                xor=filter->filter_value[i]^buffer1[i];
-                                neq|=dvbdmxfilter->maskandnotmode[i]&xor;
-                        }
-                        if (!neq)
-                                return 0;
-                }
-                return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len,
-						  buffer2, buffer2_len,
-						  &dvbdmxfilter->filter,
-						  DMX_OK); 
-        case DMX_TYPE_TS:
-                if (!(dvbdmxfilter->feed->ts_type & TS_PACKET)) 
-                        return 0;
-                if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY) 
-                        return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len,
-                                                         buffer2, buffer2_len,
-                                                         &dvbdmxfilter->feed->feed.ts,
-                                                         DMX_OK); 
-                else
-                        pes_to_ts(buffer1, buffer1_len, 
-                                  dvbdmxfilter->feed->pid, 
-                                  &av7110->p2t_filter[dvbdmxfilter->index]);
-	default:
-	        return 0;
-        }
-}
-
-
-u8 pshead[0x26] = {
-        0x00, 0x00, 0x01, 0xba, 0x5f, 0xff, 0xfe, 0xe6, 
-        0xc4, 0x01, 0x01, 0x89, 0xc3, 0xf8, 0x00, 0x00,
-        0x01, 0xbb, 0x00, 0x12, 0x80, 0xc4, 0xe1, 0x00,
-        0xe1, 0xff, 0xb9, 0xe0, 0xe8, 0xb8, 0xc0, 0x20,
-        0xbd, 0xe0, 0x44, 0xbf, 0xe0, 0x02,
-};								
-
-
-static void vpeirq (unsigned long data)
-{
-        //printk("vpeirq %08x\n", saa7146_read(av7110->saa_mem, PCI_VDP3));
-}
-
-#if 0
-static void fidbirq(struct saa7146* saa, void *data)
-{
-        av7110_t *av7110=(av7110_t *) data;
-        u8 *mem;
-  
-        mem=(av7110->tsf ? TS_HEIGHT*TS_WIDTH/2 :0)+(u8 *)av7110->saa->grabbing;
-        
-        // FIXME: think of something better without busy waiting
-        if (av7110->tsf) 
-                while (saa7146_read(av7110->saa_mem, PCI_VDP3)>0x20000);
-        else
-                while (saa7146_read(av7110->saa_mem, PCI_VDP3)<0x17800);
-
-        av7110->tsf^=1;
-        saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600|(av7110->tsf ? 0x40:0x80));
-        saa7146_write(av7110->saa_mem, MC2, 
-                      (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-
-        // FIXME: use bottom half or tasklet
-        if (av7110->feeding && mem[0]==0x47)
-                dvb_dmx_swfilter_packets(&av7110->demux, mem, 512);
-}
-#else
-static
-void fidbirq (unsigned long data)
-{
-	struct av7110_s *av7110 = (struct av7110_s*) data;
-        u8 *mem=(u8 *)(av7110->saa->grabbing);
-        int num;
-        u32 dmapos;
-
-        dmapos=saa7146_read(av7110->saa_mem, PCI_VDP3);
-        dmapos-=(dmapos%188);
-
-        if (av7110->tsf) {
-                mem+=av7110->ttbp;
-                if (dmapos<0x20000) {
-                        num=1024-av7110->ttbp/188;
-                        av7110->ttbp=0;
-                } else {
-                        num=(dmapos - av7110->ttbp)/188;
-                        av7110->ttbp=dmapos;
-                }
-        } else {
-                if (av7110->ttbp>1000*188 && av7110->ttbp<1024*188) {
-                        if (av7110->feeding)
-                                dvb_dmx_swfilter_packets(&av7110->demux, 
-                                                      mem+av7110->ttbp,
-                                                      1024- av7110->ttbp / 188);
-                }
-                num=dmapos/188;
-                av7110->ttbp=dmapos;
-        }
-
-        av7110->tsf^=1;
-        saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600|(av7110->tsf ? 0x40:0x80));
-        saa7146_write(av7110->saa_mem, MC2, 
-                      (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-
-        // FIXME: use bottom half or tasklet
-        if (av7110->feeding && mem[0]==0x47)
-                dvb_dmx_swfilter_packets(&av7110->demux, mem, num);
-}
-#endif
-
-//#define DEBUG_TIMING
-inline static void 
-print_time(char *s)
-{
-#ifdef DEBUG_TIMING
-        struct timeval tv;
-        do_gettimeofday(&tv);
-        printk("%s: %d.%d\n", s, (int)tv.tv_sec, (int)tv.tv_usec);
-#endif
-}
-
-static void 
-ci_get_data(ring_buffer_t *cibuf, u8 *data, int len)
-{
-        int free, split=0, pread=cibuf->pread;
-        
-        free=pread-cibuf->pwrite;
-        if (free<=0)  
-                free+=cibuf->size;
-        if (free<=len+2) 
-                return;
-        cibuf->data[cibuf->pwrite]=(len>>8);   
-        cibuf->data[(cibuf->pwrite+1)%cibuf->size]=(len&0xff); 
-        cibuf->pwrite=(cibuf->pwrite+2)%cibuf->size;
-
-        if (pread<=cibuf->pwrite)
-                split=cibuf->size-cibuf->pwrite;
-        if (split && split<len) {
-                memcpy(cibuf->data + cibuf->pwrite, data, split);
-                memcpy(cibuf->data, data+split, len-split);
-        } else 
-                memcpy(cibuf->data + cibuf->pwrite, data, len);
-        cibuf->pwrite=(cibuf->pwrite+len)%cibuf->size;
-        
-        wake_up_interruptible(&cibuf->queue);
-}
-
-static
-void debiirq (unsigned long data)
-{
-	struct av7110_s *av7110 = (struct av7110_s*) data;
-        int type=av7110->debitype;
-        int handle=(type>>8)&0x1f;
-        
-        print_time("debi");
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER) & ~MASK_19 );
-        saa7146_write(av7110->saa_mem, ISR, MASK_19 );
-
-        if (type==-1) {
-                printk("DEBI irq oops\n");
-                ARM_ClearMailBox(av7110);
-                ARM_ClearIrq(av7110);
-                return;
-        }
-        av7110->debitype=-1;
-
-        switch (type&0xff) {
-
-        case DATA_TS_RECORD:
-                dvb_dmx_swfilter_packets(&av7110->demux, 
-                                      (const u8 *)av7110->debi_virt, 
-                                      av7110->debilen/188);
-                spin_lock(&av7110->debilock);
-                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                ARM_ClearMailBox(av7110);
-                spin_unlock(&av7110->debilock);
-                break;
-
-        case DATA_PES_RECORD:
-                if (av7110->demux.recording) 
-                        record_cb(&av7110->p2t[handle], 
-                                  (u8 *)av7110->debi_virt,
-                                  av7110->debilen);
-                spin_lock(&av7110->debilock);
-                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                ARM_ClearMailBox(av7110);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_IPMPE:
-        case DATA_FSECTION:
-        case DATA_PIPING:
-                if (av7110->handle2filter[handle]) 
-                        DvbDmxFilterCallback((u8 *)av7110->debi_virt, 
-                                             av7110->debilen, 0, 0, 
-                                             av7110->handle2filter[handle], 
-                                             DMX_OK, av7110); 
-                spin_lock(&av7110->debilock);
-                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                ARM_ClearMailBox(av7110);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_CI_GET:
-        {
-                u8 *data=av7110->debi_virt;
-
-                if ((data[0]<2) && data[2]==0xff) {
-                        int flags=0;
-                        if (data[5]>0) 
-                                flags|=CA_CI_MODULE_PRESENT;
-                        if (data[5]>5) 
-                                flags|=CA_CI_MODULE_READY;
-                        av7110->ci_slot[data[0]].flags=flags;
-                } else
-                        ci_get_data(&av7110->ci_rbuffer, 
-                                    av7110->debi_virt, 
-                                    av7110->debilen);
-                spin_lock(&av7110->debilock);
-                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                ARM_ClearMailBox(av7110);
-                spin_unlock(&av7110->debilock);
-                return;
-        }
-
-        case DATA_COMMON_INTERFACE:
-                CI_handle(av7110, (u8 *)av7110->debi_virt, av7110->debilen);
-#if 0
-        {
-                int i;
-
-                printk("av7110%d: ", av7110->num);
-                printk("%02x ", *(u8 *)av7110->debi_virt);
-                printk("%02x ", *(1+(u8 *)av7110->debi_virt));
-                for (i=2; i<av7110->debilen; i++)
-                  printk("%02x ", (*(i+(unsigned char *)av7110->debi_virt)));
-                for (i=2; i<av7110->debilen; i++)
-                  printk("%c", chtrans(*(i+(unsigned char *)av7110->debi_virt)));
-
-                printk("\n");
-        }
-#endif
-                spin_lock(&av7110->debilock);
-                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                ARM_ClearMailBox(av7110);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_DEBUG_MESSAGE:
-                ((s8*)av7110->debi_virt)[Reserved_SIZE-1]=0;
-                printk("%s\n", (s8 *)av7110->debi_virt);
-                spin_lock(&av7110->debilock);
-                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                ARM_ClearMailBox(av7110);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_CI_PUT:
-        case DATA_MPEG_PLAY:
-        case DATA_BMP_LOAD:
-                spin_lock(&av7110->debilock);
-                iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-                ARM_ClearMailBox(av7110);
-                spin_unlock(&av7110->debilock);
-                return;
-        default:
-                break;
-        }
-        spin_lock(&av7110->debilock);
-        ARM_ClearMailBox(av7110);
-        spin_unlock(&av7110->debilock);
-}
-
-static int
-pes_play(void *dest, ring_buffer_t *buf, int dlen)
-{
-        int len, split=0;
-        u32 sync;
-        u16 blen;
-
-        dprintk ("function : %s\n", __FUNCTION__);
-        if (!dlen) {
-                wake_up(&buf->queue);
-                return -1;
-        }
-        while (1) {
-                if ((len=ring_buffer_avail(buf)) < 6)
-                        return -1;
-                sync=(buf->data[buf->pread])<<24;
-                sync|=(buf->data[(buf->pread+1)%buf->size]<<16);
-                sync|=(buf->data[(buf->pread+2)%buf->size]<<8);
-                sync|=buf->data[(buf->pread+3)%buf->size];
-                
-                if (((sync&~0x1f)==0x000001e0) ||
-                    ((sync&~0x1f)==0x000001c0) ||
-                    (sync==0x000001bd))
-                        break;
-                printk("resync\n");
-                buf->pread=(buf->pread+1)%buf->size;
-        }
-        blen=(buf->data[(buf->pread+4)%buf->size]<<8);
-        blen|=buf->data[(buf->pread+5)%buf->size];
-        blen+=6;
-        if (len<blen || blen > dlen) {
-                printk("buffer empty\n");
-                wake_up(&buf->queue);
-                return -1;
-        }
-/*        if (blen>2048) {
-                buf->pread=(buf->pread+blen)%buf->size;
-                printk("packet too large\n");
-                return -1;
-        }
-*/
-        len=blen;
-        if (buf->pread + len > buf->size)
-                split=buf->size-buf->pread;
-        if (split>0) {
-                memcpy(dest, buf->data+buf->pread, split);
-                buf->pread=0;
-                len-=split;
-        }
-        memcpy(split + dest, 
-               buf->data + buf->pread, len);
-        buf->pread = (buf->pread +len)%buf->size;
-        
-        dprintk ("function: %s pread=%08x pwrite=%08x\n", __FUNCTION__,
-                buf->pread, buf->pwrite);
-        wake_up(&buf->queue);
-        return blen;
-}
-
-static
-void gpioirq (unsigned long data)
-{
-	struct av7110_s *av7110 = (struct av7110_s*) data;
-        u32 rxbuf, txbuf;
-        int len;
-        
-        //printk("GPIO0 irq\n");        
-
-        if (av7110->debitype !=-1)
-                printk("GPIO0 irq oops\n");
-       
-        spin_lock(&av7110->debilock);
-
-	ARM_ClearIrq(av7110);
-
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER) & ~MASK_19 );
-        saa7146_write(av7110->saa_mem, ISR, MASK_19 );
-
-        av7110->debitype = irdebi(av7110, DEBINOSWAP, IRQ_STATE, 0, 2);
-        av7110->debilen  = irdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-        av7110->debibuf  = 0;
-        rxbuf=irdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-        txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-        len=(av7110->debilen+3)&(~3);
-
-        dprintk("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen);
-        print_time("gpio");
-
-        dprintk("GPIO0 irq %02x\n", av7110->debitype&0xff);        
-        switch (av7110->debitype&0xff) {
-
-        case DATA_TS_PLAY:
-        case DATA_PES_PLAY:
-                break;
-
-        case DATA_CI_PUT:
-        {
-                int avail, split=0, pwrite;
-                ring_buffer_t *cibuf=&av7110->ci_wbuffer;
-
-                pwrite=cibuf->pwrite;
-                avail=pwrite-cibuf->pread;
-                if (avail<0) 
-                        avail+=cibuf->size;
-                if (avail<=2) {
-                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-                        break;
-                } 
-                len=(cibuf->data[cibuf->pread]<<8);
-                len|=cibuf->data[(cibuf->pread+1)%cibuf->size];
-                if (avail<len+2) {
-                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-                        break;
-                } 
-                cibuf->pread=(cibuf->pread+2)%cibuf->size;
-                
-                if (pwrite<cibuf->pread)
-                        split=cibuf->size-cibuf->pread;
-                if (split && split<len) {
-                        int todo=len-split;
-                        memcpy(av7110->debi_virt, cibuf->data+cibuf->pread, split);
-                        memcpy(av7110->debi_virt+split, cibuf->data, todo);
-                } else
-                        memcpy(av7110->debi_virt, cibuf->data+cibuf->pread, len);
-                cibuf->pread=(cibuf->pread+len)%cibuf->size;
-                wake_up(&cibuf->queue);
-                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
-                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
-                wait_for_debi_done(av7110);
-                saa7146_write(av7110->saa_mem, IER, 
-                              saa7146_read(av7110->saa_mem, IER) | MASK_19 );
-                if (len<5) len=5; /* we want a real DEBI DMA */
-                iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
-                spin_unlock(&av7110->debilock);
-                return;
-        }
-
-        case DATA_MPEG_PLAY:
-                if (!av7110->playing) {
-                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-                        break;
-                }
-                len=0;
-                if (av7110->debitype&0x100) {
-                        spin_lock(&av7110->aout.lock);
-                        len=pes_play(av7110->debi_virt, &av7110->aout, 2048);
-                        spin_unlock(&av7110->aout.lock);
-                }
-                if (len<=0 && (av7110->debitype&0x200)
-                        &&av7110->videostate.play_state!=VIDEO_FREEZED) {
-                        spin_lock(&av7110->avout.lock);
-                        len=pes_play(av7110->debi_virt, &av7110->avout, 2048);
-                        spin_unlock(&av7110->avout.lock);
-                }
-                if (len<=0) {
-                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-                        break;
-                } 
-                dprintk("GPIO0 PES_PLAY len=%04x\n", len);        
-                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
-                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
-                wait_for_debi_done(av7110);
-                saa7146_write(av7110->saa_mem, IER, 
-                              saa7146_read(av7110->saa_mem, IER) | MASK_19 );
-
-                iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_BMP_LOAD:
-                len=av7110->debilen;
-                if (!len) {
-                        av7110->bmp_state=BMP_LOADED;
-                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
-                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
-                        wake_up(&av7110->bmpq);
-                        break;
-                }
-                if (len>av7110->bmplen)
-                        len=av7110->bmplen;
-                if (len>2*1024)
-                        len=2*1024;
-                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
-                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
-                memcpy(av7110->debi_virt, av7110->bmpbuf+av7110->bmpp, len);
-                av7110->bmpp+=len;
-                av7110->bmplen-=len;
-                wait_for_debi_done(av7110);
-                saa7146_write(av7110->saa_mem, IER, 
-                              saa7146_read(av7110->saa_mem, IER) | MASK_19 );
-                if (len<5) len=5; /* we want a real DEBI DMA */
-                iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_CI_GET:
-        case DATA_COMMON_INTERFACE:
-        case DATA_FSECTION:
-        case DATA_IPMPE:
-        case DATA_PIPING:
-                if (!len || len>4*1024) {
-                        iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                        break;
-                }                  /* yes, fall through */
-        case DATA_TS_RECORD:
-        case DATA_PES_RECORD:
-                saa7146_write(av7110->saa_mem, IER, 
-                              saa7146_read(av7110->saa_mem, IER) | MASK_19);
-                irdebi(av7110, DEBISWAB, DPRAM_BASE+rxbuf, 0, len);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_DEBUG_MESSAGE:
-                if (!len || len>0xff) {
-                        iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                        break;
-                }
-                saa7146_write(av7110->saa_mem, IER, 
-                              saa7146_read(av7110->saa_mem, IER) | MASK_19);
-                irdebi(av7110, DEBISWAB, Reserved, 0, len);
-                spin_unlock(&av7110->debilock);
-                return;
-
-        case DATA_IRCOMMAND: 
-                IR_handle(av7110, 
-                          swahw32(irdebi(av7110, DEBINOSWAP, Reserved, 0, 4)));
-                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
-                break;
-
-        default:
-                printk("gpioirq unknown type=%d len=%d\n", 
-                       av7110->debitype, av7110->debilen);
-                break;
-        }      
-        ARM_ClearMailBox(av7110);
-        av7110->debitype=-1;
-        spin_unlock(&av7110->debilock);
-        dprintk("GPIO0 irq exit 0\n");        
-}
-
-
-/****************************************************************************
- * DEBI command polling 
- ****************************************************************************/
-
-
-static int OutCommand(av7110_t *av7110, u16* buf, int length)
-{
-        int i;
-        u32	start;
-
-        if (!av7110->arm_ready)
-                return -1;
-
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) )
-        {
-                ddelay(1);
-                if ((jiffies - start) > ARM_WAIT_FREE) {
-                        printk("outcommand error 1\n");
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-
-#ifndef _NOHANDSHAKE
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) 
-        {
-                ddelay(1);
-                if ((jiffies - start) > ARM_WAIT_SHAKE) {
-                        printk("outcommand error 2\n");
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-#endif
-
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2) & OSDQFull )
-        {
-                ddelay(1);
-                if ((jiffies - start) > ARM_WAIT_OSD)
-                {
-                        printk("outcommand error 3\n");
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-        for (i=2; i<length; i++)
-                wdebi(av7110, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2);
-
-        if (length)
-                wdebi(av7110, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2);
-        else
-                wdebi(av7110, DEBINOSWAP, COMMAND + 2, 0, 2);
-
-        wdebi(av7110, DEBINOSWAP, COMMAND, (u32) buf[0], 2);
-
-        return 0;
-}
-
-inline static int 
-SOutCommand(av7110_t *av7110, u16* buf, int length)
-{
-        int ret;
-        
-        if (!av7110->arm_ready)
-                return -1;
-
-        if (down_interruptible(&av7110->dcomlock))
-		return -ERESTARTSYS;
-
-        ret=OutCommand(av7110, buf, length);
-        up(&av7110->dcomlock);
-        return ret;
-}
-
-
-static int outcom(av7110_t *av7110, int type, int com, int num, ...)
-{
-	va_list args;
-        u16 buf[num+2];
-        int i;
-
-        buf[0]=(( type << 8 ) | com);
-        buf[1]=num;
-
-        if (num) {
-                va_start(args, num);
-                for (i=0; i<num; i++)
-                        buf[i+2]=va_arg(args, u32);
-                va_end(args);
-        }
-
-        return SOutCommand(av7110, buf, num+2);
-}
-
-int SendCICommand(av7110_t *av7110, u8 subcom, u8 *Params, u8 ParamLen)
-{
-        int i;
-        u16 CommandBuffer[18] = { ((COMTYPE_COMMON_IF << 8) + subcom),
-                                  16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-        
-	for(i=0; (i<ParamLen)&&(i<32); i++)	
-	{
-		if(i%2 == 0)
-			CommandBuffer[(i/2)+2] = (u16)(Params[i]) << 8;
-		else
-			CommandBuffer[(i/2)+2] |= Params[i];
-	}
-
-        return SOutCommand(av7110, CommandBuffer, 18);
-}
-
-
-static int CommandRequest(av7110_t *av7110, u16 *Buff, int length, u16 *buf, int n)
-{
-	int err;
-        s16 i;
-        u32 start;
-       
-        if (!av7110->arm_ready)
-                return -1;
-
-        if (down_interruptible(&av7110->dcomlock))
-		return -ERESTARTSYS;
-
-        if ((err = OutCommand(av7110, Buff, length)) < 0) {
-		up(&av7110->dcomlock);
-		return err;
-	}
-        
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) ) 
-        {
-#ifdef _NOHANDSHAKE
-                ddelay(1);
-#endif
-                if ((jiffies - start) > ARM_WAIT_FREE) {
-                        printk("commandrequest error 1\n");
-                        up(&av7110->dcomlock);
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-        
-#ifndef _NOHANDSHAKE
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
-                ddelay(1);
-                if ((jiffies - start) > ARM_WAIT_SHAKE) {
-                        printk("commandrequest error 2\n");
-                        up(&av7110->dcomlock);
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-#endif
-
-        for (i=0; i<n; i++)
-                buf[i] = rdebi(av7110, DEBINOSWAP, COM_BUFF + 2*i, 0, 2);
-        
-	up(&av7110->dcomlock);
-        return 0;
-}
-
-
-static inline int 
-RequestParameter(av7110_t *av7110, u16 tag, u16* Buff, s16 length)
-{
-        return CommandRequest(av7110, &tag, 0, Buff, length);
-}
-
-
-/****************************************************************************
- * Firmware commands 
- ****************************************************************************/
-
-
-inline static int 
-SendDAC(av7110_t *av7110, u8 addr, u8 data)
-{
-        return outcom(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data);
-}
-
-static int
-SetVolume(av7110_t *av7110, int volleft, int volright)
-{
-        int err;
-        
-        switch (av7110->adac_type) {
-        case DVB_ADAC_TI:
-                volleft=(volleft*256)/946;
-                volright=(volright*256)/946;
-                if (volleft > 0x45)
-                        volleft=0x45;
-                if (volright > 0x45)
-                        volright=0x45;
-                err=SendDAC(av7110, 3, 0x80 + volleft);
-                if (err)
-                        return err;
-                return SendDAC(av7110, 4, volright);
-                
-        case DVB_ADAC_CRYSTAL:
-                volleft=127-volleft/2;
-                volright=127-volright/2;
-                i2c_writereg(av7110, 0x20, 0x03, volleft);
-                i2c_writereg(av7110, 0x20, 0x04, volright);
-                return 0;
-        }
-        return 0;
-}
-
-#ifdef CONFIG_DVB_AV7110_OSD
-
-inline static int ResetBlend(av7110_t *av7110, u8 windownr)
-{
-        return outcom(av7110, COMTYPE_OSD, SetNonBlend, 1, windownr);
-}
-
-inline static int SetColorBlend(av7110_t *av7110, u8 windownr)
-{
-        return outcom(av7110, COMTYPE_OSD, SetCBlend, 1, windownr); 
-}
-
-inline static int SetWindowBlend(av7110_t *av7110, u8 windownr, u8 blending)
-{
-        return outcom(av7110, COMTYPE_OSD, SetWBlend, 2, windownr, blending); 
-}
-
-inline static int SetBlend_(av7110_t *av7110, u8 windownr,
-                     OSDPALTYPE colordepth, u16 index, u8 blending)
-{
-        return outcom(av7110, COMTYPE_OSD, SetBlend, 4,
-                      windownr, colordepth, index, blending);
-} 
-
-inline static int SetColor_(av7110_t *av7110, u8 windownr,
-                     OSDPALTYPE colordepth, u16 index, u16 colorhi, u16 colorlo)
-{
-        return outcom(av7110, COMTYPE_OSD, SetColor, 5,
-                      windownr, colordepth, index, colorhi, colorlo);
-} 
-
-inline static int BringToTop(av7110_t *av7110, u8 windownr)
-{
-        return outcom(av7110, COMTYPE_OSD, WTop, 1, windownr);
-} 
-
-inline static int SetFont(av7110_t *av7110, u8 windownr, u8 fontsize,
-                   u16 colorfg, u16 colorbg)
-{
-        return outcom(av7110, COMTYPE_OSD, Set_Font, 4,
-                      windownr, fontsize, colorfg, colorbg);
-} 
-
-static int FlushText(av7110_t *av7110)
-{
-        u32 start;
-
-        if (down_interruptible(&av7110->dcomlock))
-		return -ERESTARTSYS;
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
-                ddelay(1); 
-                if ((jiffies - start) > ARM_WAIT_OSD) {
-                        printk("outtext error\n");
-                        up(&av7110->dcomlock);
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-        up(&av7110->dcomlock);
-        return 0;
-}
-
-static int WriteText(av7110_t *av7110, u8 win, u16 x, u16 y, u8* buf)
-{
-        int i, ret;
-        u32 start;
-        int length=strlen(buf)+1;
-        u16 cbuf[5] = { (COMTYPE_OSD<<8) + DText, 3, win, x, y };
-        
-        if (down_interruptible(&av7110->dcomlock))
-		return -ERESTARTSYS;
-
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
-                ddelay(1);
-                if ((jiffies - start) > ARM_WAIT_OSD) {
-                        printk("outtext error\n");
-                        up(&av7110->dcomlock);
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-#ifndef _NOHANDSHAKE
-        start = jiffies;
-        while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
-                ddelay(1);
-                if ((jiffies - start) > ARM_WAIT_SHAKE) {
-                        printk("outtext error\n");
-                        up(&av7110->dcomlock);
-                        //arm_error(av7110);
-                        return -1;
-                }
-        }
-#endif
-        for (i=0; i<length/2; i++)
-                wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2, 
-                      swab16(*(u16 *)(buf+2*i)), 2);
-        if (length&1)
-                wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2, 0, 2);
-        ret=OutCommand(av7110, cbuf, 5);
-        up(&av7110->dcomlock);
-        return ret;
-}
-
-inline static int DrawLine(av7110_t *av7110, u8 windownr, 
-                    u16 x, u16 y, u16 dx, u16 dy, u16 color)
-{
-        return outcom(av7110, COMTYPE_OSD, DLine, 6,
-                      windownr, x, y, dx, dy, color);
-} 
-
-inline static int DrawBlock(av7110_t *av7110, u8 windownr, 
-                    u16 x, u16 y, u16 dx, u16 dy, u16 color)
-{
-        return outcom(av7110, COMTYPE_OSD, DBox, 6,
-                      windownr, x, y, dx, dy, color);
-} 
-
-inline static int HideWindow(av7110_t *av7110, u8 windownr)
-{
-        return outcom(av7110, COMTYPE_OSD, WHide, 1, windownr);
-} 
-
-inline static int MoveWindowRel(av7110_t *av7110, u8 windownr, u16 x, u16 y)
-{
-        return outcom(av7110, COMTYPE_OSD, WMoveD, 3, windownr, x, y);
-} 
-
-inline static int MoveWindowAbs(av7110_t *av7110, u8 windownr, u16 x, u16 y)
-{
-        return outcom(av7110, COMTYPE_OSD, WMoveA, 3, windownr, x, y);
-} 
-
-inline static int DestroyOSDWindow(av7110_t *av7110, u8 windownr)
-{
-        return outcom(av7110, COMTYPE_OSD, WDestroy, 1, windownr);
-} 
-
-#if 0
-static void DestroyOSDWindows(av7110_t *av7110)
-{
-        int i;
-
-        for (i=1; i<7; i++)
-                outcom(av7110, COMTYPE_OSD, WDestroy, 1, i);
-} 
-#endif
-
-static inline int 
-CreateOSDWindow(av7110_t *av7110, u8 windownr,
-                           DISPTYPE disptype, u16 width, u16 height)
-{
-        return outcom(av7110, COMTYPE_OSD, WCreate, 4,
-                      windownr, disptype, width, height);
-} 
-
-
-static OSDPALTYPE bpp2pal[8]={Pal1Bit, Pal2Bit, 0, Pal4Bit, 0, 0, 0, Pal8Bit}; 
-static DISPTYPE   bpp2bit[8]={BITMAP1, BITMAP2, 0, BITMAP4, 0, 0, 0, BITMAP8}; 
-
-static inline int 
-LoadBitmap(av7110_t *av7110, u16 format, u16 dx, u16 dy, int inc, u8* data)
-{
-        int bpp;
-        int i;
-        int d, delta; 
-        u8 c;
-        DECLARE_WAITQUEUE(wait, current);
-        
-        if (av7110->bmp_state==BMP_LOADING) {
-                add_wait_queue(&av7110->bmpq, &wait);
-                while (1) {
-                        set_current_state(TASK_INTERRUPTIBLE);
-                        if (av7110->bmp_state!=BMP_LOADING
-                            || signal_pending(current))
-                                break;
-                        schedule();
-                }
-                current->state=TASK_RUNNING;
-                remove_wait_queue(&av7110->bmpq, &wait);
-        }
-        if (av7110->bmp_state==BMP_LOADING)
-                return -1;
-        av7110->bmp_state=BMP_LOADING;
-        if      (format==BITMAP8) { bpp=8; delta = 1; } 
-        else if (format==BITMAP4) { bpp=4; delta = 2; }
-        else if (format==BITMAP2) { bpp=2; delta = 4; }
-        else if (format==BITMAP1) { bpp=1; delta = 8; }
-        else {
-                av7110->bmp_state=BMP_NONE;
-                return -1;
-        }
-        av7110->bmplen= ((dx*dy*bpp+7)&~7)/8; 
-        av7110->bmpp=0;
-        if (av7110->bmplen>32768) {
-                av7110->bmp_state=BMP_NONE;
-                return -1;
-        }
-        for (i=0; i<dy; i++) {
-                if (copy_from_user(av7110->bmpbuf+1024+i*dx, data+i*inc, dx)) { 
-                        av7110->bmp_state=BMP_NONE;
-                        return -1;
-                }
-        }
-        if (format != BITMAP8) {
-                for (i=0; i<dx*dy/delta; i++) {
-                        c = ((u8 *)av7110->bmpbuf)[1024+i*delta+delta-1];
-                        for (d=delta-2; d>=0; d--) {
-                                c |= (((u8 *)av7110->bmpbuf)[1024+i*delta+d] 
-                                      << ((delta-d-1)*bpp));
-                                ((u8 *)av7110->bmpbuf)[1024+i] = c;
-                        }
-                }
-        }
-        av7110->bmplen+=1024;
-        return outcom(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy);
-} 
-
-static int 
-BlitBitmap(av7110_t *av7110, u16 win, u16 x, u16 y, u16 trans)
-{
-        DECLARE_WAITQUEUE(wait, current);
-        
-        if (av7110->bmp_state==BMP_NONE)
-                return -1;
-        if (av7110->bmp_state==BMP_LOADING) {
-                add_wait_queue(&av7110->bmpq, &wait);
-                while (1) {
-                        set_current_state(TASK_INTERRUPTIBLE);
-                        if (av7110->bmp_state!=BMP_LOADING
-                            || signal_pending(current))
-                                break;
-                        schedule();
-                }
-                current->state=TASK_RUNNING;
-                remove_wait_queue(&av7110->bmpq, &wait);
-        }
-        if (av7110->bmp_state==BMP_LOADED)
-                return outcom(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans);
-        return -1;
-} 
-
-static inline int 
-ReleaseBitmap(av7110_t *av7110)
-{
-        if (av7110->bmp_state!=BMP_LOADED)
-                return -1;
-        av7110->bmp_state=BMP_NONE;
-        return outcom(av7110, COMTYPE_OSD, ReleaseBmp, 0);
-} 
-
-static u32 RGB2YUV(u16 R, u16 G, u16 B)
-{
-        u16 y, u, v;
-        u16 Y, Cr, Cb;
-
-        y = R * 77 + G * 150 + B * 29;  // Luma=0.299R+0.587G+0.114B 0..65535
-        u = 2048+B * 8 -(y>>5);    // Cr 0..4095
-        v = 2048+R * 8 -(y>>5);    // Cb 0..4095
-
-        Y=y/256;
-        Cb=u/16;
-        Cr=v/16;
-
-        return Cr|(Cb<<16)|(Y<<8);
-}
-
-static void
-OSDSetColor(av7110_t *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend)
-{
-        u16 ch, cl;
-        u32 yuv;
-
-        yuv=blend ? RGB2YUV(r,g,b) : 0;
-        cl=(yuv&0xffff);
-        ch=((yuv>>16)&0xffff);
-        SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
-                  color, ch, cl);
-        SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
-                  color, ((blend>>4)&0x0f));
-}
-
-static int
-OSDSetBlock(av7110_t *av7110, int x0, int y0, int x1, int y1, int inc, u8 *data)
-{
-        uint w, h, bpp, bpl, size, lpb, bnum, brest;
-        int i;
-
-        w=x1-x0+1; h=y1-y0+1;
-        if (inc<=0)
-                inc=w; 
-        if (w<=0 || w>720 || h<=0 || h>576) 
-                return -1;
-        bpp=av7110->osdbpp[av7110->osdwin]+1; 
-        bpl=((w*bpp+7)&~7)/8; 
-        size=h*bpl;
-        lpb=(32*1024)/bpl; 
-        bnum=size/(lpb*bpl);
-        brest=size-bnum*lpb*bpl;
-
-        for (i=0; i<bnum; i++) {
-                LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, lpb, inc, data); 
-                BlitBitmap(av7110, av7110->osdwin, x0, y0+i*lpb, 0);
-                data+=lpb*inc; 
-        }
-        if (brest) {
-                LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, brest/bpl, inc, data); 
-                BlitBitmap(av7110, av7110->osdwin, x0, y0+bnum*lpb, 0);
-        }
-        ReleaseBitmap(av7110);
-        return 0;
-}
-
-static int 
-OSD_DrawCommand(av7110_t *av7110, osd_cmd_t *dc)
-{
-        switch (dc->cmd) {
-        case OSD_Close:
-                DestroyOSDWindow(av7110, av7110->osdwin);
-                return 0;
-        case OSD_Open:
-                av7110->osdbpp[av7110->osdwin]=(dc->color-1)&7;
-                CreateOSDWindow(av7110, av7110->osdwin, bpp2bit[av7110->osdbpp[av7110->osdwin]],
-                                dc->x1-dc->x0+1, dc->y1-dc->y0+1);
-                if (!dc->data) {
-                        MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
-                        SetColorBlend(av7110, av7110->osdwin);
-                }
-                return 0;
-        case OSD_Show:
-                MoveWindowRel(av7110, av7110->osdwin, 0, 0);
-                return 0;
-        case OSD_Hide:
-                HideWindow(av7110, av7110->osdwin);
-                return 0;
-        case OSD_Clear:
-                DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0);
-                return 0;
-        case OSD_Fill:
-                DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color);
-                return 0;
-        case OSD_SetColor:
-                OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1); 
-                return 0;
-        case OSD_SetPalette:
-        {      
-                int i, len=dc->x0-dc->color+1;
-                u8 *colors=(u8 *)dc->data;
-
-                for (i=0; i<len; i++)
-                        OSDSetColor(av7110, dc->color+i,
-                                    colors[i*4]  , colors[i*4+1],
-                                    colors[i*4+2], colors[i*4+3]);
-                return 0;
-        }
-        case OSD_SetTrans: 
-                return 0;
-        case OSD_SetPixel:
-                DrawLine(av7110, av7110->osdwin,
-                         dc->x0, dc->y0, 0, 0,
-                         dc->color);
-                return 0;
-        case OSD_GetPixel: 
-                return 0;
-
-        case OSD_SetRow:   
-                dc->y1=dc->y0;
-        case OSD_SetBlock:
-                OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data);
-                return 0;
-
-        case OSD_FillRow:
-                DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
-                          dc->x1-dc->x0+1, dc->y1,
-                          dc->color);
-                return 0;
-        case OSD_FillBlock:
-                DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
-                          dc->x1-dc->x0+1, dc->y1-dc->y0+1,
-                          dc->color);
-                return 0;
-        case OSD_Line:
-                DrawLine(av7110, av7110->osdwin,
-                         dc->x0, dc->y0, dc->x1-dc->x0, dc->y1-dc->y0,
-                         dc->color);
-                return 0;
-        case OSD_Query: 
-                return 0;
-        case OSD_Test:
-                return 0;
-        case OSD_Text:
-        {
-                char textbuf[240];
-                
-                if (strncpy_from_user(textbuf, dc->data, 240)<0)
-                        return -EFAULT;
-                textbuf[239]=0;
-                if (dc->x1>3) 
-                        dc->x1=3;
-                SetFont(av7110, av7110->osdwin, dc->x1,
-                        (u16) (dc->color&0xffff), (u16) (dc->color>>16));
-                FlushText(av7110);
-                WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf);
-                return 0;
-        }
-        case OSD_SetWindow:
-                if (dc->x0<1 || dc->x0>7)
-                        return -EINVAL;
-                av7110->osdwin=dc->x0;
-                return 0;
-        case OSD_MoveWindow:
-                MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
-                SetColorBlend(av7110, av7110->osdwin);
-                return 0;
-        default:
-                return -EINVAL;
-        }
-}
-#endif /* CONFIG_DVB_AV7110_OSD */
-
-
-/* get version of the firmware ROM, RTSL, video ucode and ARM application  */
-
-static void 
-firmversion(av7110_t *av7110)
-{
-        u16 buf[20];
-
-        u16 tag = ((COMTYPE_REQUEST << 8) + ReqVersion);
-        
-        RequestParameter(av7110, tag, buf, 16);
-        
-        av7110->arm_fw=(buf[0] << 16) + buf[1];
-        av7110->arm_rtsl=(buf[2] << 16) + buf[3];
-        av7110->arm_vid=(buf[4] << 16) + buf[5];
-        av7110->arm_app=(buf[6] << 16) + buf[7];
-        av7110->avtype=(buf[8] << 16) + buf[9];
-
-        printk ("DVB: AV711%d(%d) - firm %08x, rtsl %08x, vid %08x, app %08x\n",
-		av7110->avtype, av7110->saa->dvb_adapter->num, av7110->arm_fw, 
-                av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
-
-        return;
-}
-
-static int 
-waitdebi(av7110_t *av7110, int adr, int state)
-{
-        int k;
-        
-        for (k=0; k<100; k++, udelay(500)) {
-                if (irdebi(av7110, DEBINOSWAP, adr, 0, 2) == state) 
-                        return 0;
-        }
-        return -1;
-}
-
-
-static int 
-load_dram(av7110_t *av7110, u32 *data, int len)
-{
-        int i;
-        int blocks, rest;
-        u32 base, bootblock=BOOT_BLOCK;
-        
-        blocks=len/BOOT_MAX_SIZE;
-        rest=len % BOOT_MAX_SIZE;
-        base=DRAM_START_CODE;
-        
-        for (i=0; i<blocks; i++) {
-                if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
-                        return -1;
-                dprintk("Writing DRAM block %d\n",i);
-                iwdebi(av7110, DEBISWAB, bootblock,
-                       i*(BOOT_MAX_SIZE)+(u32)data,
-                       BOOT_MAX_SIZE);
-                bootblock^=0x1400;
-                iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
-                iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, BOOT_MAX_SIZE, 2);
-                iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-                base+=BOOT_MAX_SIZE;
-        }
-        
-        if (rest > 0) {
-                if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
-                        return -1;
-                if (rest>4)
-                        iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)+(u32)data, rest);
-                else
-                        iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)-4+(u32)data, rest+4);
-                
-                iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
-                iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2);
-                iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-        }
-        if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
-                return -1;
-        iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2);
-        iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-        if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0)
-                return -1;
-        return 0;
-}
-
-
-static u8 
-bootcode[] = {
-        0xea, 0x00, 0x00, 0x0e, 0xe1, 0xb0, 0xf0, 0x0e, /* 0x0000 */
-        0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04,
-        0xe2, 0x5e, 0xf0, 0x08, 0xe2, 0x5e, 0xf0, 0x04,
-        0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04,
-        0x2c, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c,
-        0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x34,
-        0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0x5a, 0x5a,
-        0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09,
-        0xe5, 0x9f, 0xd0, 0x5c, 0xe5, 0x9f, 0x40, 0x54, /* 0x0040 */
-        0xe3, 0xa0, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x00,
-        0xe5, 0x84, 0x00, 0x04, 0xe1, 0xd4, 0x10, 0xb0,
-        0xe3, 0x51, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xfc,
-        0xe1, 0xa0, 0x10, 0x0d, 0xe5, 0x94, 0x30, 0x04,
-        0xe1, 0xd4, 0x20, 0xb2, 0xe2, 0x82, 0x20, 0x3f,
-        0xe1, 0xb0, 0x23, 0x22, 0x03, 0xa0, 0x00, 0x02,
-        0xe1, 0xc4, 0x00, 0xb0, 0x0a, 0xff, 0xff, 0xf4,
-        0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, /* 0x0080 */
-        0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0,
-        0xe2, 0x52, 0x20, 0x01, 0x1a, 0xff, 0xff, 0xf9,
-        0xe2, 0x2d, 0xdb, 0x05, 0xea, 0xff, 0xff, 0xec,
-        0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00,
-};
-
-#include "av7110_firm.h"
-
-static int 
-bootarm(av7110_t *av7110)
-{
-        u32 ret;
-        int i;
-
-        setgpio(av7110, RESET_LINE, GPIO_OUTLO);
-
-        /* Disable DEBI and GPIO irq */
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER) & 
-                      ~(MASK_19 | MASK_03));
-        saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03));
-
-        /* enable DEBI */
-        saa7146_write(av7110->saa_mem, MC1, 0x08800880);
-        saa7146_write(av7110->saa_mem, DD1_STREAM_B, 0x00000000);
-        saa7146_write(av7110->saa_mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-        
-        /* test DEBI */
-        iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4);
-        if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4))!=0x10325476) {
-                printk("dvb: debi test in bootarm() failed: "
-                       "%08x != %08x\n", ret, 0x10325476);;
-                return -1;
-        }
-        for (i=0; i<8192; i+=4) 
-                iwdebi(av7110, DEBISWAP, DPRAM_BASE+i, 0x00, 4);
-        dprintk("bootarm: debi test OK\n");;
-
-        /* boot */
-        dprintk("bootarm: load boot code\n");
-
-        setgpio(av7110, ARM_IRQ_LINE, GPIO_IRQLO);
-        //setgpio(av7110, DEBI_DONE_LINE, GPIO_INPUT);
-        //setgpio(av7110, 3, GPIO_INPUT);
-
-        iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) bootcode, sizeof(bootcode));
-        iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
-        
-        wait_for_debi_done(av7110);
-        setgpio(av7110, RESET_LINE, GPIO_OUTHI);
-        current->state=TASK_INTERRUPTIBLE;
-        schedule_timeout(HZ);
-        
-        dprintk("bootarm: load dram code\n");
-
-	if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0)
-		return -1;
-
-	setgpio(av7110, RESET_LINE, GPIO_OUTLO);
-        mdelay(1);
-        
-        dprintk("bootarm: load dpram code\n");
-
-	iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) Dpram, sizeof(Dpram));
-
-	wait_for_debi_done(av7110);
-
-        setgpio(av7110, RESET_LINE, GPIO_OUTHI);
-        mdelay(800);
-
-        //ARM_ClearIrq(av7110); 
-        ARM_ResetMailBox(av7110); 
-        saa7146_write(av7110->saa_mem, ISR, (MASK_19 | MASK_03));
-        saa7146_write(av7110->saa_mem, IER, 
-                      saa7146_read(av7110->saa_mem, IER) | MASK_03 );
-
-        av7110->arm_errors=0;
-        av7110->arm_ready=1;
-        return 0;
-}
-
-static inline int
-SetPIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, 
-        u16 subpid, u16 pcrpid)
-{
-	if (vpid == 0x1fff || apid == 0x1fff ||
-	    ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff)
-		vpid = apid = ttpid = subpid = pcrpid = 0;
-
-        return outcom(av7110, COMTYPE_PIDFILTER, MultiPID, 5, 
-                      pcrpid, vpid, apid, ttpid, subpid);
-}
-
-static void
-ChangePIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, 
-        u16 subpid, u16 pcrpid)
-{
-        if (down_interruptible(&av7110->pid_mutex))
-		return;
-
-        if (!(vpid&0x8000))  av7110->pids[DMX_PES_VIDEO]=vpid;
-        if (!(apid&0x8000))  av7110->pids[DMX_PES_AUDIO]=apid;
-        if (!(ttpid&0x8000)) av7110->pids[DMX_PES_TELETEXT]=ttpid;
-        if (!(pcrpid&0x8000)) av7110->pids[DMX_PES_PCR]=pcrpid;
-
-        av7110->pids[DMX_PES_SUBTITLE]=0;
-
-        if (av7110->fe_synced) 
-                SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid);
-
-        up(&av7110->pid_mutex);
-}
-
-
-static void 
-SetMode(av7110_t *av7110, int mode)
-{
-        outcom(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode);
-        
-        if (!av7110->playing) {
-                ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], 
-                           av7110->pids[DMX_PES_AUDIO], 
-                           av7110->pids[DMX_PES_TELETEXT],  
-                           0, av7110->pids[DMX_PES_PCR]);
-                outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-        }
-}
-
-inline static void 
-TestMode(av7110_t *av7110, int mode)
-{
-        outcom(av7110, COMTYPE_ENCODER, SetTestMode, 1, mode);
-}
-
-inline static void 
-VidMode(av7110_t *av7110, int mode)
-{
-        outcom(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode);
-}
-           
-
-static inline int
-vidcom(av7110_t *av7110, u32 com, u32 arg)
-{
-        return outcom(av7110, 0x80, 0x02, 4, 
-                      (com>>16), (com&0xffff), 
-                      (arg>>16), (arg&0xffff));
-}
-
-static inline int
-audcom(av7110_t *av7110, u32 com)
-{
-        return outcom(av7110, 0x80, 0x03, 4, 
-                      (com>>16), (com&0xffff));
-}
-
-inline static void 
-Set22K(av7110_t *av7110, int state)
-{
-        if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS)
-                outcom(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0);
-        if (av7110->saa->card_type==DVB_CARD_TT_BUDGET)
-                setgpio(av7110, 3, (state ? GPIO_OUTHI : GPIO_OUTLO));
-}
-
-
-/* Diseqc functions only for TT Budget card */
-/* taken from the Skyvision DVB driver by 
-   Ralph Metzler <rjkm@metzlerbros.de> */
-
-
-inline static void 
-DiseqcSendBit(av7110_t *av7110, int data)
-{
-        setgpio(av7110, 3, GPIO_OUTHI);
-        udelay(data ? 500 : 1000);
-        setgpio(av7110, 3, GPIO_OUTLO);
-        udelay(data ? 1000 : 500);
-}
-
-static void 
-DiseqcSendByte(av7110_t *av7110, int data)
-{
-        int i, par=1, d;
-
-        for (i=7; i>=0; i--) 
-        {
-                d=(data>>i)&1;
-                par^=d;
-                DiseqcSendBit(av7110, d);
-        }
-        DiseqcSendBit(av7110, par);
-}
-
-inline static int
-SendDiSEqCMsg(av7110_t *av7110, int len, u8 *msg, int burst)
-{
-        int i;
-
-        switch (av7110->saa->card_type) {
-        case DVB_CARD_TT_SIEMENS:
-        {
-                u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) + SendDiSEqC),
-                                16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-                
-                if (len>10)
-                        len=10;
-                buf[1] = len+2;
-                buf[2] = len;
-                
-                if (burst!=-1)
-                  buf[3]=burst ? 0x01 : 0x00;
-
-                else
-                  buf[3]=0xffff;
-                
-                for (i=0; i<len; i++)
-                  buf[i+4]=msg[i];
-                
-                SOutCommand(av7110, buf, 18);
-                break;
-        }
-
-        case DVB_CARD_TT_BUDGET:
-                setgpio(av7110, 3, GPIO_OUTLO);
-                
-                mdelay(16);
-                
-                for (i=0; i<len; i++)
-                        DiseqcSendByte(av7110, msg[i]);
-
-                mdelay(16);
-                
-                if (burst!=-1) {
-                        if (burst) 
-                                DiseqcSendByte(av7110, 0xff);
-                        else {
-                                setgpio(av7110, 3, GPIO_OUTHI);
-                                udelay(12500);
-                                setgpio(av7110, 3, GPIO_OUTLO);
-                        }
-                        
-                        ddelay(2);
-                }
-
-                break;
-
-        default:
-                return -1;
-        }
-        return 0;
-}
-
-/****************************************************************************
- * I2C client commands
- ****************************************************************************/
-
-static inline int
-i2c_writereg(av7110_t *av7110, u8 id, u8 reg, u8 val)
-{
-        u8 msg[2]={ reg, val }; 
-        struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus;
-        struct i2c_msg msgs;
-
-        msgs.flags=0;
-        msgs.addr=id/2;
-        msgs.len=2;
-        msgs.buf=msg;
-        return i2c->xfer (i2c, &msgs, 1);
-}
-
-static inline int
-msp_writereg(av7110_t *av7110, u8 dev, u16 reg, u16 val)
-{
-        u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff }; 
-        struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus;
-        struct i2c_msg msgs;
-
-        msgs.flags=0;
-        msgs.addr=0x40;
-        msgs.len=5;
-        msgs.buf=msg;
-        return i2c->xfer(i2c, &msgs, 1);
-}
-
-static inline u8
-i2c_readreg(av7110_t *av7110, u8 id, u8 reg)
-{
-        struct dvb_i2c_bus *i2c = av7110->saa->i2c_bus;
-        u8 mm1[] = {0x00};
-        u8 mm2[] = {0x00};
-        struct i2c_msg msgs[2];
-
-        msgs[0].flags=0;
-        msgs[1].flags=I2C_M_RD;
-        msgs[0].addr=msgs[1].addr=id/2;
-        mm1[0]=reg;
-        msgs[0].len=1; msgs[1].len=1;
-        msgs[0].buf=mm1; msgs[1].buf=mm2;
-        i2c->xfer(i2c, msgs, 2);
-
-        return mm2[0];
-}
-
-
-/****************************************************************************
- * I/O buffer management and control
- ****************************************************************************/
-
-static int sw2mode[16] = {
-        VIDEO_MODE_PAL, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL,
-        VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, VIDEO_MODE_NTSC,
-        VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
-        VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
-};
-
-static void
-get_video_format(av7110_t *av7110, u8 *buf, int count)
-{
-        int i;
-	int hsize,vsize;
-        int sw;
-        u8 *p;
-
-        if (av7110->sinfo)
-                return;
-        for (i=7; i<count-10; i++) {
-                p=buf+i;
-                if (p[0] || p[1] || p[2]!=0x01 || p[3]!=0xb3)
-                        continue;
-                p+=4;
-                hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4);
-                vsize = ((p[1] &0x0F) << 8) | (p[2]);
-                sw = (p[3]&0x0F);
-                SetMode(av7110, sw2mode[sw]);
-                dprintk("dvb: playback %dx%d fr=%d\n", hsize, vsize, sw);
-                av7110->sinfo=1;
-                break;
-        }
-}
-
-static void
-play_video_cb(u8 *buf, int count, void *priv)
-{
-        av7110_t *av7110=(av7110_t *) priv;
-
-        if ((buf[3]&0xe0)==0xe0) {
-                get_video_format(av7110, buf, count);
-                ring_buffer_write(&av7110->avout, buf, count, 0, 0);
-        } else
-                ring_buffer_write(&av7110->aout, buf, count, 0, 0);
-}
-
-static void
-play_audio_cb(u8 *buf, int count, void *priv)
-{
-        av7110_t *av7110=(av7110_t *) priv;
-        
-        ring_buffer_write(&av7110->aout, buf, count, 0, 0);
-}
-
-#define FREE_COND (ring_buffer_free(&av7110->avout)>=20*1024 && ring_buffer_free(&av7110->aout)>=20*1024)
-
-static ssize_t 
-dvb_play(av7110_t *av7110, const u8 *buf,
-         unsigned long count, int nonblock, int type, int umem)
-{
-        unsigned long todo = count, n;
-
-        if (!av7110->kbuf[type])
-                return -ENOBUFS;
-
-	if (nonblock && !FREE_COND)
-                return -EWOULDBLOCK;
-                
-        while (todo>0) {
-                if (!FREE_COND) {
-                        if (nonblock)
-                                return count-todo;
-                        if (wait_event_interruptible(av7110->avout.queue,
-                                                     FREE_COND))
-                        	return count-todo;
-                } 
-		n=todo;
-                if (n>IPACKS*2)
-                        n=IPACKS*2;
-                if (umem) {
-                        if (copy_from_user(av7110->kbuf[type], buf, n)) 
-                                return -EFAULT;
-                        dvb_filter_instant_repack(av7110->kbuf[type], n,
-						  &av7110->ipack[type]);
-                } else {
-                        dvb_filter_instant_repack((u8 *)buf, n,
-						  &av7110->ipack[type]);
-		}
-                todo -= n;
-                buf += n;
-        }
-	return count-todo;
-}
-
-static ssize_t 
-dvb_aplay(av7110_t *av7110, const u8 *buf,
-         unsigned long count, int nonblock, int type)
-{
-        unsigned long todo = count, n;
-
-        if (!av7110->kbuf[type])
-                return -ENOBUFS;
-        if (nonblock && ring_buffer_free(&av7110->aout)<20*1024)
-                return -EWOULDBLOCK;
-                
-        while (todo>0) {
-                if (ring_buffer_free(&av7110->aout)<20*1024) {
-                        if (nonblock)
-                                return count-todo;
-                        if (wait_event_interruptible(av7110->aout.queue,
-                                                     (ring_buffer_free(&av7110->aout)>=
-                                                      20*1024)))
-                        	return count-todo;
-                } 
-		n=todo;
-                if (n>IPACKS*2)
-                        n=IPACKS*2;
-                if (copy_from_user(av7110->kbuf[type], buf, n)) 
-                        return -EFAULT;
-                dvb_filter_instant_repack(av7110->kbuf[type], n,
-					  &av7110->ipack[type]);
-//                        memcpy(dvb->kbuf[type], buf, n); 
-                todo -= n;
-                buf += n;
-        }
-	return count-todo;
-}
-
-void init_p2t(p2t_t *p, struct dvb_demux_feed *feed)
-{
-	memset(p->pes,0,TS_SIZE);
-	p->counter = 0;
-	p->pos = 0;
-	p->frags = 0;
-	if (feed) p->feed = feed;
-}
-
-void clear_p2t(p2t_t *p)
-{
-	memset(p->pes,0,TS_SIZE);
-//	p->counter = 0;
-	p->pos = 0;
-	p->frags = 0;
-}
-
-
-long int find_pes_header(u8 const *buf, long int length, int *frags)
-{
-	int c = 0;
-	int found = 0;
-
-	*frags = 0;
-
-	while (c < length-3 && !found) {
-		if (buf[c] == 0x00 && buf[c+1] == 0x00 && 
-		    buf[c+2] == 0x01) {
-			switch ( buf[c+3] ) {
-				
-			case PROG_STREAM_MAP:
-			case PRIVATE_STREAM2:
-			case PROG_STREAM_DIR:
-			case ECM_STREAM     :
-			case EMM_STREAM     :
-			case PADDING_STREAM :
-			case DSM_CC_STREAM  :
-			case ISO13522_STREAM:
-			case PRIVATE_STREAM1:
-			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
-			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-				found = 1;
-				break;
-				
-			default:
-				c++;
-				break;
-			}	
-		} else c++;
-	}
-	if (c == length-3 && !found){
-		if (buf[length-1] == 0x00) *frags = 1;
-		if (buf[length-2] == 0x00 &&
-		    buf[length-1] == 0x00) *frags = 2;
-		if (buf[length-3] == 0x00 &&
-		    buf[length-2] == 0x00 &&
-		    buf[length-1] == 0x01) *frags = 3;
-		return -1;
-	}
-
-	return c;
-}
-
-void pes_to_ts( u8 const *buf, long int length, u16 pid, p2t_t *p)
-{
-	int c,c2,l,add;
-	int check,rest;
-
-	c = 0;
-	c2 = 0;
-	if (p->frags){
-		check = 0;
-		switch(p->frags){
-		case 1:
-			if ( buf[c] == 0x00 && buf[c+1] == 0x01 ){
-				check = 1;
-				c += 2;
-			}
-			break;
-		case 2:
-			if ( buf[c] == 0x01 ){
-				check = 1;
-				c++;
-			}
-			break;
-		case 3:
-			check = 1;
-		}
-		if(check){
-			switch ( buf[c] ) {
-				
-			case PROG_STREAM_MAP:
-			case PRIVATE_STREAM2:
-			case PROG_STREAM_DIR:
-			case ECM_STREAM     :
-			case EMM_STREAM     :
-			case PADDING_STREAM :
-			case DSM_CC_STREAM  :
-			case ISO13522_STREAM:
-			case PRIVATE_STREAM1:
-			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
-			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-				p->pes[0] = 0x00;
-				p->pes[1] = 0x00;
-				p->pes[2] = 0x01;
-				p->pes[3] = buf[c];
-				p->pos=4;
-				memcpy(p->pes+p->pos,buf+c,(TS_SIZE-4)-p->pos);
-				c += (TS_SIZE-4)-p->pos;
-				p_to_t(p->pes,(TS_SIZE-4),pid,&p->counter,
-				       p->feed);
-				clear_p2t(p);
-				break;
-				
-			default:
-				c=0;
-				break;
-			}
-		}
-		p->frags = 0;
-	}
-		
-	if (p->pos){
-		c2 = find_pes_header(buf+c,length-c,&p->frags);
-		if (c2 >= 0 && c2 < (TS_SIZE-4)-p->pos){
-			l = c2+c;
-		} else l = (TS_SIZE-4)-p->pos;
-		memcpy(p->pes+p->pos,buf,l);
-		c += l;
-		p->pos += l;
-		p_to_t(p->pes,p->pos,pid,&p->counter, p->feed);
-		clear_p2t(p);
-	}
-			
-	add = 0;
-	while (c < length){
-		c2 = find_pes_header(buf+c+add,length-c-add,&p->frags);
-		if (c2 >= 0) {
-			c2 += c+add;
-			if (c2 > c){
-				p_to_t(buf+c,c2-c,pid,&p->counter,
-				       p->feed);
-				c = c2;
-				clear_p2t(p);
-				add = 0;
-			} else add = 1;
-		} else {
-			l = length-c;
-			rest = l % (TS_SIZE-4);
-			l -= rest;
-			p_to_t(buf+c,l,pid,&p->counter,
-			       p->feed);
-			memcpy(p->pes,buf+c+l,rest);
-			p->pos = rest;
-			c = length;
-		}
-	}
-}
-
-
-int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length)
-{
-	int i;
-	int c = 0;
-	int fill;
-	u8 tshead[4] = { 0x47, 0x00, 0x00, 0x10}; 
-        
-
-	fill = (TS_SIZE-4)-length;
-        if (pes_start) tshead[1] = 0x40;
-	if (fill) tshead[3] = 0x30;
-        tshead[1] |= (u8)((pid & 0x1F00) >> 8);
-        tshead[2] |= (u8)(pid & 0x00FF);
-        tshead[3] |= ((*counter)++ & 0x0F) ;
-        memcpy(buf,tshead,4);
-	c+=4;
-
-
-	if (fill){
-		buf[4] = fill-1;
-		c++;
-		if (fill >1){
-			buf[5] = 0x00;
-			c++;
-		}
-		for ( i = 6; i < fill+4; i++){
-			buf[i] = 0xFF;
-			c++;
-		}
-	}
-
-        return c;
-}
-
-
-void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, 
-            struct dvb_demux_feed *feed)
-{
-  
-	int l, pes_start;
-	u8 obuf[TS_SIZE];
-	long int c = 0;
-
-	pes_start = 0;
-	if ( length > 3 && 
-             buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01 )
-		switch (buf[3]){
-			case PROG_STREAM_MAP:
-			case PRIVATE_STREAM2:
-			case PROG_STREAM_DIR:
-			case ECM_STREAM     :
-			case EMM_STREAM     :
-			case PADDING_STREAM :
-			case DSM_CC_STREAM  :
-			case ISO13522_STREAM:
-			case PRIVATE_STREAM1:
-			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
-			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-				pes_start = 1;
-				break;
-				
-			default:
-				break;
-		}			
-
-	while ( c < length ){
-		memset(obuf,0,TS_SIZE);
-		if (length - c >= (TS_SIZE-4)){
-			l = write_ts_header2(pid, counter, pes_start
-					     , obuf, (TS_SIZE-4));
-			memcpy(obuf+l, buf+c, TS_SIZE-l);
-			c += TS_SIZE-l;
-		} else { 
-			l = write_ts_header2(pid, counter, pes_start
-					     , obuf, length-c);
-			memcpy(obuf+l, buf+c, TS_SIZE-l);
-			c = length;
-		}
-                feed->cb.ts(obuf, 188, 0, 0, &feed->feed.ts, DMX_OK); 
-		pes_start = 0;
-	}
-}
-
-
-/****************************************************************************
- * V4L SECTION
- ****************************************************************************/
-
-static int dvb_do_ioctl (struct inode *inode, struct file *file,
-			 unsigned int cmd, void *arg)
-{
-	struct video_device *dev = video_devdata (file);
-	av7110_t *av7110 = dev->priv;
-
-	switch (cmd) {
-        case VIDIOCGCAP:
-        {
-                struct video_capability *b = arg;
-                
-                dprintk(KERN_ERR "dvb: VIDIOCGCAP called\n");
-
-                strcpy(b->name, &dev->name[0]);
-			
-                b->type 	= av7110->video.type;
-						
-                b->channels	= 1;	
-                b->audios	= 2;
-                b->maxwidth	= 768;
-                b->maxheight	= 576;
-                b->minwidth	= 32;
-                b->minheight	= 32;
-
-		return 0;
-        }
-
-	case VIDIOCGCHAN:
-        {
-		static const
-		struct video_channel dvb_chan = { 0, "DVB", 1, 3, 1, 1 };
-                struct video_channel *v = arg;
-                
-                dprintk(KERN_ERR "dvb: VIDIOCGCHAN called\n");
-                
-                memcpy(v, &dvb_chan, sizeof(struct video_channel));
-                
-                return 0;
-                
-        }
-
-	case VIDIOCSCHAN:
-        {
-                struct video_channel *v = arg;
-
-		dprintk(KERN_ERR "dvb: VIDIOCSCHAN called\n");
-
-		if (v->channel>0)
-			return -EINVAL;
-
-		if (v->norm > 1)
-			return -EOPNOTSUPP;
-
-                av7110->vidmode = v->norm;
-                SetMode(av7110, v->norm);
-                av7110->saa->mode = v->norm;
-		return 0;
-        }
-
-	case VIDIOCGTUNER:
-        {
-                struct video_tuner *v = arg;
-                
-                dprintk(KERN_ERR "dvb: VIDIOCGTUNER called\n");
-                
-                /* only channel 0 has a tuner */	
-                if(!v->tuner)
-                        return -EINVAL;
-                
-                /* fill the structure */
-                strcpy(v->name, "DVB");
-                v->rangelow  = 0x00000000;
-                v->rangehigh = 0xffffffff;
-                
-                v->flags= VIDEO_TUNER_PAL | VIDEO_TUNER_NTSC;
-                v->mode = av7110->vidmode;
-		
-                /* fixme: fill in signal strength here */
-                v->signal = 0xffff;
-                
-                return 0;
-        }
-
-        case VIDIOCSTUNER:
-        {
-                struct video_tuner *v = arg;
-                
-                dprintk(KERN_ERR "dvb: VIDIOCSTUNER called\n");
-                
-                /* only channel 0 has a tuner */
-                if (!v->tuner)
-                        return -EINVAL;
-                
-                /* check if format is supported */
-                if(v->mode != VIDEO_MODE_PAL && v->mode != VIDEO_MODE_NTSC
-                    /* && v->mode != VIDEO_MODE_SECAM */ )
-                       return -EOPNOTSUPP;
-                
-                av7110->vidmode = v->mode;
-                SetMode(av7110, v->mode);
-                
-                return 0;
-        }
-
-        case VIDIOCGPICT:
-        {
-                struct video_picture *p = arg;
-                
-                dprintk(KERN_ERR "dvb: VIDIOCGPICT called\n");
-
-		saacomm(SAA7146_V4L_GPICT, p);
-                
-                dprintk("dvb: VIDIOCGPICT called: b:%d c:%d s:%d d:%d p:%d\n",
-			p->brightness, p->contrast, p->colour,
-			p->depth, p->palette);
-                
-                return 0;
-        }
-
-        case VIDIOCSPICT:
-        {
-                struct video_picture *p = arg;
-                
-                dprintk("dvb: VIDIOCSPICT called: b:%d c:%d s:%d d:%d p:%d\n",
-			p->brightness, p->contrast, p->colour,
-			p->depth, p->palette);
-
-		switch (p->palette) {
-		case VIDEO_PALETTE_RGB555:
-		case VIDEO_PALETTE_RGB565:
-		case VIDEO_PALETTE_RGB24:
-		case VIDEO_PALETTE_RGB32:
-		case VIDEO_PALETTE_UYVY:
-		case VIDEO_PALETTE_YUV422P:
-		case VIDEO_PALETTE_YUV420P:
-		case VIDEO_PALETTE_YUV411P:
-			break;
-		default:
-			return -EINVAL;
-		}
-
-                saacomm(SAA7146_V4L_SPICT, p);
-                
-                return 0;
-                
-        }
-
-        case VIDIOCSWIN:
-        {
-                struct video_window *w = arg;
-
-                dprintk("dvb: VIDIOCSWIN called: "
-			"clips: %d, x:%d, y:%d, h:%d, w:%d\n",
-			w->clipcount, w->x, w->y, w->height, w->width);
-                
-                saacomm(SAA7146_V4L_SWIN, w);
-                
-                return 0;
-        }
-
-        case VIDIOCGWIN:
-        {
-                dprintk(KERN_ERR "dvb: VIDIOCGWIN called\n");
-                return 0;
-        }
-
-        case VIDIOCCAPTURE:
-        {
-                int *v = arg;
-                
-                dprintk("dvb: VIDIOCCAPTURE called, mode:%d (0=disable)\n", *v);
-                
-                saacomm(SAA7146_V4L_CCAPTURE, v);
-
-                return 0;
-        }
-
-        case VIDIOCGFBUF:
-        {
-                struct video_buffer *b = arg;
-                
-                dprintk(KERN_ERR "dvb: VIDIOCGFBUF called\n");
-                
-                saacomm(SAA7146_V4L_GFBUF, b);
-                
-                return 0;
-                
-        }
-
-        case VIDIOCSFBUF:
-        {
-                struct video_buffer *b = arg;
-                u32 vid = (vidmem << 16) | vidlow;
-
-                /* see if vidmem-override is requested */
-                if (vidmem) {
-                        printk ("dvb: video-memory-override. (0x%08x)\n", vid);
-                        b->base = (void*) vid;
-                }
-                
-                saacomm(SAA7146_V4L_SFBUF, b);
-                
-                dprintk(KERN_ERR "dvb: VIDIOCSFBUF called\n");
-                
-                return 0;		
-        }
-
-	/* Video key event - to dev 255 is to all - 
-	 * cuts capture on all DMA windows with this key (0xFFFFFFFF == all)
-	 */
-	case VIDIOCKEY:
-        {
-                dprintk(KERN_ERR "dvb: VIDIOCKEY called\n");
-                return 0;
-        }
-
-	case VIDIOCGAUDIO:
-        {
-                struct video_audio *v = arg;
-                
-                v->flags = VIDEO_AUDIO_MUTABLE;
-                /* let's auto-detect */
-                return 0;
-        }
-
-	case VIDIOCSAUDIO:
-        {
-        	//struct video_audio *v;
-                return 0;
-        }
-
-        case VIDIOCSYNC:
-        {
-                int i = 0;
-		int *frame = (int*) arg;
-                
-                dprintk ("dvb: VIDIOCSYNC called - frame: %d\n", *frame);
-                
-                /* simply pass the requested frame-number to the corresponding
-                   saa7146-function ... */
-                i = saacomm(SAA7146_V4L_CSYNC, frame);
-
-		dprintk ("dvb: VIDIOCSYNC done - frame: %d\n", *frame);
-                
-                return i;
-        }
-
-        case VIDIOCMCAPTURE:
-        {
-                struct video_mmap *vm = arg;
-                int i = 0;
-
-                dprintk(KERN_ERR "dvb: VIDIOCMCAPTURE called: fr:%d,"
-                        "fmt:%d, w:%d, h:%d\n",
-                        vm->frame, vm->format, vm->width, vm->height);
-
-		switch (vm->format) {
-		case VIDEO_PALETTE_YUV422P:
-		case VIDEO_PALETTE_YUV420P:
-		case VIDEO_PALETTE_YUV411P:
-			return -EINVAL;
-		}
-
-                /* simply pass the structure for the requested frame-number
-                   to the corresponding saa7146-function ... */
-                i = saacomm(SAA7146_V4L_CMCAPTURE, vm);
-                
-                return i;
-        }
-
-        case VIDIOCGMBUF:
-        {
-                struct video_mbuf *mbuf = arg;
-                dprintk(KERN_ERR "dvb: VIDIOCGMBUF called\n");
-                saacomm(SAA7146_V4L_GMBUF, mbuf);
-                return 0;
-                
-        }
-
-        case VIDIOCGUNIT:
-        {
-                /*struct video_unit vu;*/
-                dprintk(KERN_ERR "dvb: VIDIOCGUNIT called\n");
-                return 0;
-        }
-		
-        case VIDIOCGCAPTURE:
-        {
-                dprintk(KERN_ERR "dvb: VIDIOCGCAPTURE called\n");
-                return 0;
-        }
-        case VIDIOCSCAPTURE:
-        {
-                dprintk(KERN_ERR "dvb: VIDIOCSCAPTURE called\n");
-                return 0;
-        }
-
-        default:
-                return -ENOIOCTLCMD;
-	}
-
-	return 0;
-}
-
-
-static int dvb_ioctl (struct inode *inode, struct file *file,
-		      unsigned int cmd, unsigned long arg)
-{
-	return video_usercopy(inode, file, cmd, arg, dvb_do_ioctl);
-}
-
-
-static int dvb_mmap(struct file* file, struct vm_area_struct *vma)
-{
-	struct video_device *dev = video_devdata (file);
-	av7110_t *av7110 = dev->priv;
-
-	dprintk(KERN_ERR "av7110: dvb_mmap called, adr:%08lx, size:0x%08lx\n",
-		vma->vm_start, vma->vm_end - vma->vm_start);
-
-	if (saacomm(SAA7146_DO_MMAP, vma)) {
-		printk(KERN_ERR "av7110: dvb_mmap failed!\n");
-		return -1;
-	}
-
-	return 0;
-}
-
-
-static unsigned int dvb_audio_poll(struct file *file, poll_table *wait)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        unsigned int mask=0;
-
-        if (av7110->playing) {
-                if (ring_buffer_free(&av7110->aout)>20*1024)
-                        return (POLLOUT | POLLWRNORM);
-
-                poll_wait(file, &av7110->aout.queue, wait);
-          
-                if (ring_buffer_free(&av7110->aout)>20*1024)
-                        mask |= (POLLOUT | POLLWRNORM);
-        } else /* if not playing: may play if asked for */
-                mask = (POLLOUT | POLLWRNORM);
-                
-        return mask;
-}
-
-
-static struct file_operations dvb_fops = {
-	.ioctl		= dvb_ioctl,
-	.mmap		= dvb_mmap,
-	.llseek		= no_llseek    
-};
-
-
-/* template for video_device-structure */
-static struct video_device dvb_template = {
-	.owner		= THIS_MODULE,
-	.name		= "DVB Board",
-	.type		= VID_TYPE_TUNER	|
-        	        VID_TYPE_CAPTURE	|
-	                VID_TYPE_OVERLAY	|
-        	        VID_TYPE_CLIPPING	|
-                	VID_TYPE_FRAMERAM	|
-	                VID_TYPE_SCALES,
-	.hardware	= VID_HARDWARE_SAA7146,
-	.fops		= &dvb_fops
-};
-
-
-static int vid_register(av7110_t *av7110)
-{
-        memcpy( &av7110->video, &dvb_template, sizeof(struct video_device));
-
-	av7110->video.priv = av7110;
-
-        if (video_register_device(&av7110->video, VFL_TYPE_GRABBER, -1)) {
-                printk(KERN_ERR "dvb: can't register videodevice\n");
-                return -1;
-        }
-
-        return 0;
-}
-
-static inline int vid_unregister(av7110_t *av7110)
-{
-        if (av7110->video.minor != -1)
-                video_unregister_device(&av7110->video);
-
-	return 0;
-}
-
-/****************************************************************************
- * END OF V4L SECTION
- ****************************************************************************/
-
-
-/****************************************************************************
- * DVB API SECTION
- ****************************************************************************/
-
-
-/******************************************************************************
- * hardware filter functions
- ******************************************************************************/
-
-static int 
-StartHWFilter(struct dvb_demux_filter *dvbdmxfilter)
-{
-        struct dvb_demux_feed *dvbdmxfeed=dvbdmxfilter->feed;
-        av7110_t *av7110=(av7110_t *) dvbdmxfeed->demux->priv;
-        u16 buf[20];
-        int ret, i;
-        u16 handle;
-//        u16 mode=0x0320;
-        u16 mode=0xb96a;
-        
-        if (dvbdmxfilter->type==DMX_TYPE_SEC) {
-                buf[4]=(dvbdmxfilter->filter.filter_value[0]<<8)|
-                        dvbdmxfilter->maskandmode[0];
-                for (i=3; i<18; i++)
-                        buf[i+4-2]=(dvbdmxfilter->filter.filter_value[i]<<8)|
-                                dvbdmxfilter->maskandmode[i];
-                mode=4;
-        } else
-        if ((dvbdmxfeed->ts_type & TS_PACKET) &&
-            !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)) 
-                init_p2t(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed);
-
-        buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter; 
-        buf[1] = 16;	
-        buf[2] = dvbdmxfeed->pid;
-        buf[3] = mode;
-
-        ret=CommandRequest(av7110, buf, 20, &handle, 1);          
-        if (ret<0)
-                return ret;
-
-        av7110->handle2filter[handle]=dvbdmxfilter;
-        dvbdmxfilter->hw_handle=handle;
-
-        return ret;
-}
-
-static int 
-StopHWFilter(struct dvb_demux_filter *dvbdmxfilter)
-{
-        av7110_t *av7110=(av7110_t *) dvbdmxfilter->feed->demux->priv;
-        u16 buf[3];
-        u16 answ[2];
-        int ret;
-        u16 handle;
-                
-        handle=dvbdmxfilter->hw_handle;
-        if (handle >= MAXFILT) {
-                dprintk("dvb: StopHWFilter tried to stop invalid filter %d.\n",
-                       handle);
-                dprintk("dvb: filter type = %d\n",  dvbdmxfilter->type);
-                return 0;
-        }
-
-        av7110->handle2filter[handle]=NULL;
-
-        buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter; 
-        buf[1] = 1;	
-        buf[2] = handle;
-        ret=CommandRequest(av7110, buf, 3, answ, 2);          
-
-        if (answ[1] != handle) {
-                dprintk("dvb: filter %d shutdown error :%d\n", handle, answ[1]);
-                ret=-1;
-        }
-        return ret;
-}
-
-
-static int 
-dvb_write_to_decoder(struct dvb_demux_feed *dvbdmxfeed, u8 *buf, size_t count)
-{
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-        av7110_t *av7110=(av7110_t *) dvbdmx->priv;
-        ipack *ipack=&av7110->ipack[dvbdmxfeed->pes_type];
-
-        switch (dvbdmxfeed->pes_type) {
-        case 0:
-                if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY) {
-                        return -EINVAL;
-                }
-                break;
-        case 1:
-                if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) {
-                        return -EINVAL;
-                }
-                break;
-        default:
-                return -1;
-        }
-
-        if (!(buf[3]&0x10)) { // no payload?
-                return -1;
-        }
-        if (buf[1]&0x40)
-                dvb_filter_ipack_flush(ipack);
-
-        if (buf[3]&0x20) {  // adaptation field?
-                count-=buf[4]+1;
-                buf+=buf[4]+1;
-                if (!count) {
-                        return 0;
-                }
-        }
-        
-        dvb_filter_instant_repack(buf+4, count-4,
-				  &av7110->ipack[dvbdmxfeed->pes_type]);
-        return 0;
-}
-
-static void
-dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed)
-{
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-        av7110_t *av7110=(av7110_t *) dvbdmx->priv;
-        u16 *pid=dvbdmx->pids, npids[5];
-        int i;
-        
-        npids[0]=npids[1]=npids[2]=npids[3]=0xffff;
-        npids[4]=0xffff;
-        i=dvbdmxfeed->pes_type;
-        npids[i]=(pid[i]&0x8000) ? 0 : pid[i];
-        if ((i==2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) {
-                npids[i]=0;
-                ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
-                StartHWFilter(dvbdmxfeed->filter); 
-                return;
-        }
-        if (dvbdmxfeed->pes_type<=2)
-                ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
-
-        if (dvbdmxfeed->pes_type<2 && npids[0])
-                if (av7110->fe_synced) 
-                        outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-
-        if ((dvbdmxfeed->ts_type & TS_PACKET)) { 
-                if (dvbdmxfeed->pes_type == 0 && 
-                    !(dvbdmx->pids[0]&0x8000))
-                        AV_StartRecord(av7110, RP_AUDIO, 
-                                       dvbdmxfeed);
-                if (dvbdmxfeed->pes_type == 1 && 
-                    !(dvbdmx->pids[1]&0x8000))
-                        AV_StartRecord(av7110, RP_VIDEO, 
-                                       dvbdmxfeed);
-        }
-}
-
-static void
-dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed)
-{
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-        av7110_t *av7110=(av7110_t *) dvbdmx->priv;
-        u16 *pid=dvbdmx->pids, npids[5];
-        int i;
-        
-        if (dvbdmxfeed->pes_type<=1) {
-                AV_Stop(av7110, dvbdmxfeed->pes_type ? 
-                        RP_VIDEO : RP_AUDIO);
-                if (!av7110->rec_mode)
-                        dvbdmx->recording=0;
-                if (!av7110->playing)
-                        dvbdmx->playing=0;
-        }
-        npids[0]=npids[1]=npids[2]=npids[3]=0xffff;
-        npids[4]=0xffff;
-        i=dvbdmxfeed->pes_type;
-        switch (i) {
-        case 2: //teletext
-                if (dvbdmxfeed->ts_type & TS_PACKET)
-                        StopHWFilter(dvbdmxfeed->filter); 
-                npids[2]=0;
-                break;
-        case 0:
-        case 1:
-        case 4:
-                if (!pids_off) 
-                        return;
-                npids[i]=(pid[i]&0x8000) ? 0 : pid[i];
-                break;
-        }
-        ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
-}
-
-static int 
-dvb_start_feed(struct dvb_demux_feed *dvbdmxfeed)
-{
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-        av7110_t *av7110=(av7110_t *) dvbdmx->priv;
-
-        if (!dvbdmx->dmx.frontend)
-                return -EINVAL;
-
-        if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET)
-                return TTBStart(av7110); 
-
-        if (dvbdmxfeed->pid>0x1fff) 
-                return -1;
-
-        if (dvbdmxfeed->type == DMX_TYPE_TS) {
-	        if ((dvbdmxfeed->ts_type & TS_DECODER) 
-		    && (dvbdmxfeed->pes_type<DMX_TS_PES_OTHER)) {
-
-		        switch (dvbdmx->dmx.frontend->source) {
-			case DMX_MEMORY_FE: 
-			        if (dvbdmxfeed->ts_type & TS_DECODER)
-				       if (dvbdmxfeed->pes_type<2 && 
-                                           !(dvbdmx->pids[0]&0x8000) &&
-					   !(dvbdmx->pids[1]&0x8000)) {
-                                               ring_buffer_flush(&av7110->avout);
-                                               ring_buffer_flush(&av7110->aout);
-                                               AV_StartPlay(av7110,RP_AV);
-                                               dvbdmx->playing=1;
-					}
-				break;
-			default:
-                                dvb_feed_start_pid(dvbdmxfeed);
-				break;
-			}
-		} else
-		        if ((dvbdmxfeed->ts_type & TS_PACKET) &&
-                            (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE))
-                                StartHWFilter(dvbdmxfeed->filter); 
-        }
-        
-        if (dvbdmxfeed->type == DMX_TYPE_SEC) {
-                int i;
-
-	        for (i=0; i<dvbdmx->filternum; i++) {
-		        if (dvbdmx->filter[i].state!=DMX_STATE_READY)
-			        continue;
-			if (dvbdmx->filter[i].type!=DMX_TYPE_SEC)
-			        continue;
-			if (dvbdmx->filter[i].filter.parent!=&dvbdmxfeed->feed.sec)
-			        continue;
-			dvbdmx->filter[i].state=DMX_STATE_GO;
-                        if (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE)
-                                StartHWFilter(&dvbdmx->filter[i]); 
-                }
-	}
-        return 0;
-}
-
-
-static int 
-dvb_stop_feed(struct dvb_demux_feed *dvbdmxfeed)
-{
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-        av7110_t *av7110=(av7110_t *) dvbdmx->priv;
-
-        if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) 
-                return TTBStop(av7110); 
-
-        if (dvbdmxfeed->type == DMX_TYPE_TS) {
-                if (dvbdmxfeed->ts_type & TS_DECODER) {
-                        if (dvbdmxfeed->pes_type>=DMX_TS_PES_OTHER ||
-                            !dvbdmx->pesfilter[dvbdmxfeed->pes_type]) 
-                                return -EINVAL;
-                        dvbdmx->pids[dvbdmxfeed->pes_type]|=0x8000;
-                        dvbdmx->pesfilter[dvbdmxfeed->pes_type]=0;
-                }
-                if (dvbdmxfeed->ts_type & TS_DECODER &&
-		    (dvbdmxfeed->pes_type<DMX_TS_PES_OTHER)) {
-                        dvb_feed_stop_pid(dvbdmxfeed);
-                } else 
-                        if ((dvbdmxfeed->ts_type & TS_PACKET) &&
-                            (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE))
-                                StopHWFilter(dvbdmxfeed->filter); 
-        }
-        
-        if (dvbdmxfeed->type == DMX_TYPE_SEC) {
-                int i;
-
-	        for (i=0; i<dvbdmx->filternum; i++)
-		        if (dvbdmx->filter[i].state==DMX_STATE_GO && 
-			    dvbdmx->filter[i].filter.parent==&dvbdmxfeed->feed.sec) {
-			        dvbdmx->filter[i].state=DMX_STATE_READY;
-                                if (dvbdmx->dmx.frontend->source!=DMX_MEMORY_FE)
-                                        StopHWFilter(&dvbdmx->filter[i]); 
-                }
-	}
-        return 0;
-}
-
-
-static void 
-restart_feeds(av7110_t *av7110)
-{
-        struct dvb_demux *dvbdmx=&av7110->demux;
-        struct dvb_demux_feed *feed;
-        int mode;
-        int i;
-
-        mode=av7110->playing;
-        av7110->playing=0;
-        av7110->rec_mode=0;
-
-        for (i=0; i<dvbdmx->filternum; i++) {
-                feed=&dvbdmx->feed[i];
-                if (feed->state==DMX_STATE_GO)
-                        dvb_start_feed(feed);
-        }
-
-        if (mode)
-                AV_StartPlay(av7110, mode);
-}
-
-/******************************************************************************
- * SEC device file operations
- ******************************************************************************/
-
-static
-int av7110_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
-{
-	av7110_t *av7110 = fe->before_after_data;
-
-	switch (cmd) {
-	case FE_SET_TONE:
-		switch ((fe_sec_tone_mode_t) arg) {
-		case SEC_TONE_ON:
-			Set22K (av7110, 1);
-			break;
-		case SEC_TONE_OFF:
-			Set22K (av7110, 0);
-			break;
-		default:
-			return -EINVAL;
-		};
-		break;
-
-	case FE_DISEQC_SEND_MASTER_CMD:
-	{
-		struct dvb_diseqc_master_cmd *cmd = arg;
-
-		SendDiSEqCMsg (av7110, cmd->msg_len, cmd->msg, 0);
-		break;
-	}
-
-	case FE_DISEQC_SEND_BURST:
-		SendDiSEqCMsg (av7110, 0, NULL, (int) arg);
-		break;
-
-	default:
-		return -EOPNOTSUPP;
-	};
-
-	return 0;
-}
-
-/******************************************************************************
- * CI link layer file ops (FIXME: move this to separate module later)
- ******************************************************************************/
-
-int ci_ll_init(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf, int size)
-{
-        ring_buffer_init(cirbuf, vmalloc(size), size);
-        ring_buffer_init(ciwbuf, vmalloc(size), size);
-        return 0;
-}
-
-void ci_ll_flush(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf)
-{
-        ring_buffer_flush(cirbuf);
-        ring_buffer_flush(ciwbuf);
-}
-
-void ci_ll_release(ring_buffer_t *cirbuf, ring_buffer_t *ciwbuf)
-{
-        vfree(cirbuf->data);
-        cirbuf->data=0;
-        vfree(ciwbuf->data);
-        ciwbuf->data=0;
-}
-
-
-int ci_ll_reset(ring_buffer_t *cibuf, struct file *file, 
-                int slots, ca_slot_info_t *slot)
-{
-	int i;
-
-        if (ring_buffer_free(cibuf)<8)
-                return -EBUSY;
-	for (i=0; i<2; i++) 
-		if (slots&(1<<i)) {
-                        cibuf->data[cibuf->pwrite]=0x00;   
-                        cibuf->data[(cibuf->pwrite+1)%cibuf->size]=0x06;
-                        cibuf->data[(cibuf->pwrite+2)%cibuf->size]=i;
-                        cibuf->data[(cibuf->pwrite+3)%cibuf->size]=0x00;
-                        cibuf->data[(cibuf->pwrite+4)%cibuf->size]=0xff;
-                        cibuf->data[(cibuf->pwrite+5)%cibuf->size]=0x02;
-                        cibuf->data[(cibuf->pwrite+6)%cibuf->size]=0x00;
-                        cibuf->data[(cibuf->pwrite+7)%cibuf->size]=0x00;
-                        cibuf->pwrite=(cibuf->pwrite+8)%cibuf->size;
-                        slot[i].flags=0;
-                }
-        return 0;
-}
-
-static ssize_t 
-ci_ll_write(ring_buffer_t *cibuf, struct file *file, const char *buf, size_t count, loff_t *ppos)
-{
-	int free, split;
-        int32_t pread;
-        int non_blocking=file->f_flags&O_NONBLOCK;
-	
-        if (count>2048)
-                return -EINVAL;
-	pread=cibuf->pread; 
-	free=pread-cibuf->pwrite;
-	if (free<=0) 
-                free+=cibuf->size;
-	if (count+2>=free) { 
-                if (non_blocking)
-                        return -EWOULDBLOCK;
-                if (wait_event_interruptible(cibuf->queue,
-                                             (ring_buffer_free(cibuf)>count+2)))
-                        return 0;
-        }
-        cibuf->data[cibuf->pwrite]=(count>>8);   
-	cibuf->data[(cibuf->pwrite+1)%cibuf->size]=(count&0xff); 
-        cibuf->pwrite=(cibuf->pwrite+2)%cibuf->size;
-
-	if (pread>cibuf->pwrite)
-		split=0;
-	else
-		split=cibuf->size-cibuf->pwrite;
-        if (split && split<count) {
-                if (copy_from_user(cibuf->data + cibuf->pwrite, buf, split))
-                        return -EFAULT;
-		if (copy_from_user(cibuf->data, buf+split, count-split))
-                        return -EFAULT;
-        } else 
-		if (copy_from_user(cibuf->data + cibuf->pwrite, buf, count))
-                        return -EFAULT;
-        cibuf->pwrite=(cibuf->pwrite+count)%cibuf->size;
-	return count;
-}
-
-static ssize_t 
-ci_ll_read(ring_buffer_t *cibuf, struct file *file, char *buf, size_t count, loff_t *ppos)
-{
-        int split=0, avail, pwrite;
-        int non_blocking=file->f_flags&O_NONBLOCK;
-	
-	if (!cibuf->data || !count)
-	        return 0;
-	if (non_blocking && (ring_buffer_empty(cibuf)))
-	        return -EWOULDBLOCK;
-	if (wait_event_interruptible(cibuf->queue,
-				     !ring_buffer_empty(cibuf)))
-		return 0;
-        pwrite=cibuf->pwrite;
-	avail=pwrite - cibuf->pread;
-	if (avail<0) 
-                avail+=cibuf->size;
-	if (avail<4) 
-                return 0;
-	count=(cibuf->data[cibuf->pread]<<8);  
-	count|=cibuf->data[(cibuf->pread+1)%cibuf->size];
-	if (avail<count+2) 
-                return -EINVAL;
-        cibuf->pread=(cibuf->pread+2)%cibuf->size;	
-
-        if (pwrite<cibuf->pread)
-                split=cibuf->size-cibuf->pread;
-	if (split && split<count) {
-		if (copy_to_user(buf, cibuf->data+cibuf->pread, split))
-			return -EFAULT;
-		if (copy_to_user(buf+split, cibuf->data, count-split))
-			return -EFAULT;
-	} else 
-		if (copy_to_user(buf, cibuf->data+cibuf->pread, count))
-			return -EFAULT;
-	cibuf->pread=(cibuf->pread + count)%cibuf->size;
-	return count;
-}
-
-static int 
-dvb_ca_open(struct inode *inode, struct file *file)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        int err=dvb_generic_open(inode, file);
-
-        if (err<0)
-                return err;
-        ci_ll_flush(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
-        return 0;
-}
-
-static unsigned 
-int dvb_ca_poll(struct file *file, poll_table *wait)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-
-        unsigned int mask=0;
-
-        ring_buffer_t *rbuf=&av7110->ci_rbuffer;
-        ring_buffer_t *wbuf=&av7110->ci_wbuffer;
-
-        if (!ring_buffer_empty(rbuf))
-                mask|=POLLIN;
-        if (ring_buffer_avail(wbuf)>1024)
-                mask|=POLLOUT;
-        if (mask)
-                return mask;
-        
-        poll_wait(file, &rbuf->queue, wait);
-        
-        if (!ring_buffer_empty(rbuf))
-                mask|=POLLIN;
-        if (ring_buffer_avail(wbuf)>1024)
-                mask|=POLLOUT;
-        
-        return mask;
-}
-
-static int 
-dvb_ca_ioctl(struct inode *inode, struct file *file, 
-             unsigned int cmd, void *parg)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        unsigned long arg=(unsigned long) parg;
-
-        switch (cmd) {
-        case CA_RESET:
-#ifdef NEW_CI
-                
-                return ci_ll_reset(&av7110->ci_wbuffer, file, arg, &av7110->ci_slot[0]);
-#endif                        
-                break;
-                
-        case CA_GET_CAP:
-        {
-                ca_caps_t cap;
-                
-                cap.slot_num=2;
-#ifdef NEW_CI
-                cap.slot_type=CA_CI_LINK;
-#else
-                cap.slot_type=CA_CI;
-#endif
-                cap.descr_num=16;
-                cap.descr_type=CA_ECD;
-                memcpy(parg, &cap, sizeof(cap));
-        }
-        break;
-
-        case CA_GET_SLOT_INFO:
-        {
-                ca_slot_info_t *info=(ca_slot_info_t *)parg;
-
-                if (info->num>1)
-                        return -EINVAL;
-#ifdef NEW_CI
-                av7110->ci_slot[info->num].type = CA_CI_LINK;
-#else
-                av7110->ci_slot[info->num].type = CA_CI;
-#endif
-                memcpy(info, &av7110->ci_slot[info->num], sizeof(ca_slot_info_t));
-        }
-        break;
-
-        case CA_GET_MSG:
-                break;
-
-        case CA_SEND_MSG:
-                break;
-                
-        case CA_GET_DESCR_INFO:
-        {
-                ca_descr_info_t info;
-
-                info.num=16;
-                info.type=CA_ECD;
-                memcpy (parg, &info, sizeof (info));
-        }
-        break;
-
-        case CA_SET_DESCR:
-        {
-                ca_descr_t *descr=(ca_descr_t*) parg;
-                
-                if (descr->index>=16)
-                        return -EINVAL;
-                if (descr->parity>1)
-                        return -EINVAL;
-                outcom(av7110, COMTYPE_PIDFILTER, SetDescr, 5, 
-                       (descr->index<<8)|descr->parity,
-                       (descr->cw[0]<<8)|descr->cw[1],
-                       (descr->cw[2]<<8)|descr->cw[3],
-                       (descr->cw[4]<<8)|descr->cw[5],
-                       (descr->cw[6]<<8)|descr->cw[7]);
-        }
-        break;
-
-        default:
-                return -EINVAL;
-        }
-        return 0;
-}
-
-static ssize_t 
-dvb_ca_write(struct file *file, const char *buf, 
-             size_t count, loff_t *ppos)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        
-        return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos);
-}
-
-static ssize_t 
-dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-
-        return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos);
-
-}
-
-
-
-/******************************************************************************
- * DVB device file operations
- ******************************************************************************/
-
-static unsigned int dvb_video_poll(struct file *file, poll_table *wait)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        unsigned int mask=0;
-
-        if (av7110->playing) {
-                if (FREE_COND)
-                        return (POLLOUT | POLLWRNORM);
-
-                poll_wait(file, &av7110->avout.queue, wait);
-          
-                if (FREE_COND)
-                        mask |= (POLLOUT | POLLWRNORM);
-        } else /* if not playing: may play if asked for */
-                mask = (POLLOUT | POLLWRNORM);
-                
-        return mask;
-}
-
-static ssize_t 
-dvb_video_write(struct file *file, const char *buf, 
-                size_t count, loff_t *ppos)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-
-        if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY) 
-                return -EPERM;
-
-	return dvb_play(av7110, buf, count, file->f_flags&O_NONBLOCK, 1, 1);
-}
-
-static ssize_t 
-dvb_audio_write(struct file *file, const char *buf, 
-                size_t count, loff_t *ppos)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-
-        if (av7110->audiostate.stream_source!=AUDIO_SOURCE_MEMORY) {
-                printk(KERN_ERR "not audio source memory\n");
-                return -EPERM;
-        }
-        return dvb_aplay(av7110, buf, count, file->f_flags&O_NONBLOCK, 0);
-}
-
-u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 };
-
-#define MIN_IFRAME 400000
-
-static void 
-play_iframe(av7110_t *av7110, u8 *buf, unsigned int len, int nonblock)
-{
-        int i, n=1;
-       
-        if (!(av7110->playing&RP_VIDEO)) {
-                AV_StartPlay(av7110, RP_VIDEO);
-                n=MIN_IFRAME/len+1;
-        }
-
-	dvb_play(av7110, iframe_header, sizeof(iframe_header), 0, 1, 0);
-
-	for (i=0; i<n; i++) 
-                dvb_play(av7110, buf, len, 0, 1, 1);
-
-	dvb_filter_ipack_flush(&av7110->ipack[1]);
-}
-
-
-static int 
-dvb_video_ioctl(struct inode *inode, struct file *file,
-            unsigned int cmd, void *parg)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        unsigned long arg=(unsigned long) parg;
-        int ret=0;
-        
-        if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
-            (cmd!=VIDEO_GET_STATUS))
-                return -EPERM;
-        
-        switch (cmd) {
-        case VIDEO_STOP:
-                av7110->videostate.play_state=VIDEO_STOPPED;
-                if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY)
-                        AV_Stop(av7110, RP_VIDEO);
-                else
-                        vidcom(av7110, 0x000e, 
-                               av7110->videostate.video_blank ? 0 : 1);
-                av7110->trickmode=TRICK_NONE;
-                break; 
-                
-        case VIDEO_PLAY:
-                av7110->trickmode=TRICK_NONE;
-                if (av7110->videostate.play_state==VIDEO_FREEZED) {
-                        av7110->videostate.play_state=VIDEO_PLAYING;
-                        vidcom(av7110, 0x000d, 0);
-                } 
-                
-                if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) {
-                        if (av7110->playing==RP_AV) {
-                                outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
-                                av7110->playing&=~RP_VIDEO;
-                        }
-                        AV_StartPlay(av7110,RP_VIDEO);
-                        vidcom(av7110, 0x000d, 0);
-                } else {
-                        //AV_Stop(av7110, RP_VIDEO);
-                        vidcom(av7110, 0x000d, 0);
-                }
-                av7110->videostate.play_state=VIDEO_PLAYING;
-                break;
-                
-        case VIDEO_FREEZE:
-                av7110->videostate.play_state=VIDEO_FREEZED;
-                if (av7110->playing&RP_VIDEO) 
-                        outcom(av7110, COMTYPE_REC_PLAY, __Pause, 0);
-                else
-                        vidcom(av7110, 0x0102, 1);
-                av7110->trickmode=TRICK_FREEZE;
-                break;
-                
-        case VIDEO_CONTINUE:
-                if (av7110->playing&RP_VIDEO) 
-                        outcom(av7110, COMTYPE_REC_PLAY, __Continue, 0);
-                vidcom(av7110, 0x000d, 0);
-                av7110->videostate.play_state=VIDEO_PLAYING;
-                av7110->trickmode=TRICK_NONE;
-                break;
-                
-        case VIDEO_SELECT_SOURCE:
-                av7110->videostate.stream_source=(video_stream_source_t) arg;
-                break;
-                
-        case VIDEO_SET_BLANK:
-                av7110->videostate.video_blank=(int) arg;
-		break;
-                
-        case VIDEO_GET_STATUS:
-                memcpy(parg, &av7110->videostate, sizeof(struct video_status));
-                break;
-                
-        case VIDEO_GET_EVENT:
-                //FIXME: write firmware support for this
-                ret=-EOPNOTSUPP;
-                
-        case VIDEO_SET_DISPLAY_FORMAT:
-        {
-                video_displayformat_t format=(video_displayformat_t) arg;
-                u16 val=0;
-                
-                switch(format) {
-                case VIDEO_PAN_SCAN:
-                        val=VID_PAN_SCAN_PREF;
-                        break;
-                        
-                case VIDEO_LETTER_BOX:
-                        val=VID_VC_AND_PS_PREF;
-                        break;
-                        
-                case VIDEO_CENTER_CUT_OUT:
-                        val=VID_CENTRE_CUT_PREF;
-                        break;
-                        
-                default:
-                        ret=-EINVAL;
-                        break;
-                }
-                if (ret<0)
-                        break;
-                av7110->videostate.video_format=format;
-                ret=outcom(av7110, COMTYPE_ENCODER, SetPanScanType, 
-                           1, (u16) val);
-                break;
-        }
-        
-        case VIDEO_SET_FORMAT:
-                if (arg>1) {
-                        ret=-EINVAL;
-                        break;
-                }
-                av7110->display_ar=arg;
-                ret=outcom(av7110, COMTYPE_ENCODER, SetMonitorType, 
-                           1, (u16) arg);
-                break;
-                
-        case VIDEO_STILLPICTURE:
-        { 
-                struct video_still_picture *pic=
-                        (struct video_still_picture *) parg;
-                ring_buffer_flush(&av7110->avout);
-                play_iframe(av7110, pic->iFrame, pic->size, 
-                            file->f_flags&O_NONBLOCK);
-                break;
-        }
-        
-        case VIDEO_FAST_FORWARD:
-                //note: arg is ignored by firmware
-                if (av7110->playing&RP_VIDEO) 
-                        outcom(av7110, COMTYPE_REC_PLAY, 
-                               __Scan_I, 2, AV_PES, 0);
-                else 
-                        vidcom(av7110, 0x16, arg); 
-                av7110->trickmode=TRICK_FAST;
-                av7110->videostate.play_state=VIDEO_PLAYING;
-                break;
-                
-        case VIDEO_SLOWMOTION:
-                if (av7110->playing&RP_VIDEO) {
-                        outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0);
-                        vidcom(av7110, 0x22, arg);
-                } else {
-                        vidcom(av7110, 0x0d, 0);
-                        vidcom(av7110, 0x0e, 0);
-                        vidcom(av7110, 0x22, arg);
-                }
-                av7110->trickmode=TRICK_SLOW;
-                av7110->videostate.play_state=VIDEO_PLAYING;
-                break;
-                
-        case VIDEO_GET_CAPABILITIES:
-                *(int *)parg=VIDEO_CAP_MPEG1|
-                        VIDEO_CAP_MPEG2|
-                        VIDEO_CAP_SYS|
-                        VIDEO_CAP_PROG;
-                break;
-        
-        case VIDEO_CLEAR_BUFFER:
-                ring_buffer_flush(&av7110->avout);
-                dvb_filter_ipack_reset(&av7110->ipack[1]);
-                
-                if (av7110->playing==RP_AV) {
-                        outcom(av7110, COMTYPE_REC_PLAY, 
-                               __Play, 2, AV_PES, 0);
-                        if (av7110->trickmode==TRICK_FAST)
-                                outcom(av7110, COMTYPE_REC_PLAY, 
-                                       __Scan_I, 2, AV_PES, 0);
-                        if (av7110->trickmode==TRICK_SLOW) {
-                                outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0);
-                                vidcom(av7110, 0x22, arg);
-                        }
-                        if (av7110->trickmode==TRICK_FREEZE)
-                                vidcom(av7110, 0x000e, 1);
-                }
-                break;
-                
-        case VIDEO_SET_STREAMTYPE:
-                
-                break;
-                
-        default:
-                ret=-ENOIOCTLCMD;
-                break;
-        }
-        return ret;
-}
-
-static int 
-dvb_audio_ioctl(struct inode *inode, struct file *file,
-            unsigned int cmd, void *parg)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        unsigned long arg=(unsigned long) parg;
-        int ret=0;
-
-        if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
-            (cmd!=AUDIO_GET_STATUS))
-                return -EPERM;
-        
-        switch (cmd) {
-        case AUDIO_STOP:
-                if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
-                        AV_Stop(av7110, RP_AUDIO);
-                else
-                        audcom(av7110, 1);
-                av7110->audiostate.play_state=AUDIO_STOPPED;
-                break;
-                
-        case AUDIO_PLAY:
-                if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
-                        AV_StartPlay(av7110, RP_AUDIO);
-                audcom(av7110, 2);
-                av7110->audiostate.play_state=AUDIO_PLAYING;
-                break;
-                
-        case AUDIO_PAUSE:
-                audcom(av7110, 1);
-                av7110->audiostate.play_state=AUDIO_PAUSED;
-                break;
-                
-        case AUDIO_CONTINUE:
-                if (av7110->audiostate.play_state==AUDIO_PAUSED) {
-                        av7110->audiostate.play_state=AUDIO_PLAYING;
-                        audcom(av7110, 0x12);
-                } 
-                break;
-                
-        case AUDIO_SELECT_SOURCE:
-                av7110->audiostate.stream_source=(audio_stream_source_t) arg;
-                break;
-                
-        case AUDIO_SET_MUTE:
-        {
-                audcom(av7110, arg ? 1 : 2);
-                av7110->audiostate.mute_state=(int) arg;
-                break;
-        }
-        
-        case AUDIO_SET_AV_SYNC:
-                av7110->audiostate.AV_sync_state=(int) arg;
-                audcom(av7110, arg ? 0x0f : 0x0e);
-                break;
-                
-        case AUDIO_SET_BYPASS_MODE:
-                ret=-EINVAL;
-                break;
-                
-        case AUDIO_CHANNEL_SELECT:
-                av7110->audiostate.channel_select=(audio_channel_select_t) arg;
-                
-                switch(av7110->audiostate.channel_select) {
-                case AUDIO_STEREO:
-                        audcom(av7110, 0x80);
-                        break;
-                        
-                case AUDIO_MONO_LEFT:
-                        audcom(av7110, 0x100);
-                        break;
-                        
-                case AUDIO_MONO_RIGHT:
-                        audcom(av7110, 0x200);
-                        break;
-                        
-                default:
-                        ret=-EINVAL;
-                        break;
-                }
-                break;
-                
-        case AUDIO_GET_STATUS:
-                memcpy(parg, &av7110->audiostate, sizeof(struct audio_status));
-                break;
-                
-        case AUDIO_GET_CAPABILITIES:
-                *(int *)parg=AUDIO_CAP_LPCM|
-                        AUDIO_CAP_MP1|
-                        AUDIO_CAP_MP2;
-                break;
-
-        case AUDIO_CLEAR_BUFFER:
-                ring_buffer_flush(&av7110->aout);
-                dvb_filter_ipack_reset(&av7110->ipack[0]);
-                if (av7110->playing==RP_AV)
-                        outcom(av7110, COMTYPE_REC_PLAY, 
-                               __Play, 2, AV_PES, 0);
-                break;
-        case AUDIO_SET_ID:
-                
-                break;
-        case AUDIO_SET_MIXER:
-        {
-                struct audio_mixer *amix=(struct audio_mixer *)parg;
-
-                SetVolume(av7110, amix->volume_left, amix->volume_right);
-                break;
-        }
-        case AUDIO_SET_STREAMTYPE:
-                break;
-        default:
-                ret=-ENOIOCTLCMD;
-                break;
-        }
-        return ret;
-}
-
-static int 
-dvb_osd_ioctl(struct inode *inode, struct file *file,
-            unsigned int cmd, void *parg)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-
-#ifdef CONFIG_DVB_AV7110_OSD
-        if (cmd==OSD_SEND_CMD)
-                return OSD_DrawCommand(av7110, (osd_cmd_t *)parg);
-#endif
-        return -EINVAL;
-}
-
-static int dvb_video_open(struct inode *inode, struct file *file)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        int err;
-
-        if ((err=dvb_generic_open(inode, file))<0)
-                return err;
-        ring_buffer_flush(&av7110->aout);
-        ring_buffer_flush(&av7110->avout);
-        av7110->video_blank=1;
-        av7110->audiostate.AV_sync_state=1;
-        av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX;
-        return 0;
-}
-
-static int dvb_video_release(struct inode *inode, struct file *file)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-
-        AV_Stop(av7110, RP_VIDEO);
-        return dvb_generic_release(inode, file);
-}
-
-static int dvb_audio_open(struct inode *inode, struct file *file)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        int err=dvb_generic_open(inode, file);
-
-        if (err<0)
-                return err;
-        ring_buffer_flush(&av7110->aout);
-        av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX;
-        return 0;
-}
-
-static int dvb_audio_release(struct inode *inode, struct file *file)
-{
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-        av7110_t *av7110=(av7110_t *) dvbdev->priv;
-        
-        AV_Stop(av7110, RP_AUDIO);
-        return dvb_generic_release(inode, file);
-}
-
-
-
-/******************************************************************************
- * driver registration 
- ******************************************************************************/
-
-static struct file_operations dvb_video_fops = {
-	.owner		= THIS_MODULE,
-	.write		= dvb_video_write,
-	.ioctl		= dvb_generic_ioctl,
-	.open		= dvb_video_open,
-	.release	= dvb_video_release,
-	.poll		= dvb_video_poll,
-};
-
-static struct dvb_device dvbdev_video = {
-	.priv		= 0,
-	.users		= 1,
-	.writers	= 1,
-	.fops		= &dvb_video_fops,
-	.kernel_ioctl	= dvb_video_ioctl,
-};
-
-static struct file_operations dvb_audio_fops = {
-	.owner		= THIS_MODULE,
-	.write		= dvb_audio_write,
-	.ioctl		= dvb_generic_ioctl,
-	.open		= dvb_audio_open,
-	.release	= dvb_audio_release,
-	.poll		= dvb_audio_poll,
-};
-
-static struct dvb_device dvbdev_audio = {
-	.priv		= 0,
-	.users		= 1,
-	.writers	= 1,
-	.fops		= &dvb_audio_fops,
-	.kernel_ioctl	= dvb_audio_ioctl,
-};
-
-static struct file_operations dvb_ca_fops = {
-	.owner		= THIS_MODULE,
-	.read		= dvb_ca_read,
-	.write		= dvb_ca_write,
-	.ioctl		= dvb_generic_ioctl,
-	.open		= dvb_ca_open,
-	.release	= dvb_generic_release,
-	.poll		= dvb_ca_poll,
-};
-
-static struct dvb_device dvbdev_ca = {
-	.priv		= 0,
-	.users		= 1,
-	.writers	= 1,
-	.fops		= &dvb_ca_fops,
-	.kernel_ioctl	= dvb_ca_ioctl,
-};
-
-static struct file_operations dvb_osd_fops = {
-	.owner		= THIS_MODULE,
-	.ioctl		= dvb_generic_ioctl,
-	.open		= dvb_generic_open,
-	.release	= dvb_generic_release,
-};
-
-static struct dvb_device dvbdev_osd = {
-	.priv		= 0,
-	.users		= 1,
-	.writers	= 1,
-	.fops		= &dvb_osd_fops,
-	.kernel_ioctl	= dvb_osd_ioctl,
-};
-
-
-static
-void av7110_before_after_tune (fe_status_t s, void *data)
-{
-	struct av7110_s *av7110 = data;
-
-        av7110->fe_synced = (s & FE_HAS_LOCK) ? 1 : 0;
-
-        if (av7110->playing)
-                return;
-
-        if (down_interruptible(&av7110->pid_mutex))
-                return;
-
-	if (av7110->fe_synced) {
-                SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO], 
-                        av7110->pids[DMX_PES_AUDIO], 
-                        av7110->pids[DMX_PES_TELETEXT], 0, 
-                        av7110->pids[DMX_PES_PCR]);
-        	outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
-	} else 
-		SetPIDs(av7110, 0, 0, 0, 0, 0);
-
-        up(&av7110->pid_mutex);
-}
-
-
-static int 
-dvb_register(av7110_t *av7110)
-{
-        int ret, i;
-        dmx_frontend_t *dvbfront=&av7110->hw_frontend;
-        struct dvb_demux *dvbdemux=&av7110->demux;
-
-        if (av7110->registered)
-                return -1;
-
-        av7110->registered=1;
-
-	av7110->dvb_adapter = av7110->saa->dvb_adapter;
-
-	if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) 
-                dvb_add_frontend_notifier (av7110->dvb_adapter,
-                                           av7110_before_after_tune, av7110);
-	/**
-	 *   init DiSEqC stuff
-	 */
-	if (av7110->saa->card_type==DVB_CARD_TT_BUDGET ||
-            av7110->saa->card_type==DVB_CARD_TT_SIEMENS) 
-		dvb_add_frontend_ioctls (av7110->dvb_adapter,
-					 av7110_diseqc_ioctl, NULL, av7110);
-
-	av7110->audiostate.AV_sync_state=0;
-	av7110->audiostate.mute_state=0;
-	av7110->audiostate.play_state=AUDIO_STOPPED;
-	av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX;
-	av7110->audiostate.channel_select=AUDIO_STEREO;
-	av7110->audiostate.bypass_mode=0;
-
-	av7110->videostate.video_blank=0;
-	av7110->videostate.play_state=VIDEO_STOPPED;
-	av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX;
-	av7110->videostate.video_format=VIDEO_FORMAT_4_3;
-	av7110->videostate.display_format=VIDEO_CENTER_CUT_OUT;
-        av7110->display_ar=VIDEO_FORMAT_4_3;
-
-        memcpy(av7110->demux_id, "demux0_0", 9);
-        av7110->demux_id[7]=av7110->saa->dvb_adapter->num+0x30;
-        dvbdemux->priv=(void *) av7110;
-
-        if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) {
-                for (i = 0; i < MAXFILT; i++)
-                        av7110->handle2filter[i]=NULL;
-
-                dvbdemux->filternum=32;
-                dvbdemux->feednum=32;
-                dvbdemux->start_feed=dvb_start_feed;
-                dvbdemux->stop_feed=dvb_stop_feed;
-                dvbdemux->write_to_decoder=dvb_write_to_decoder;
-                
-                dvbdemux->dmx.vendor="TI";
-                dvbdemux->dmx.model="AV7110";
-                dvbdemux->dmx.id=av7110->demux_id;
-                dvbdemux->dmx.capabilities=(DMX_TS_FILTERING|
-                                             DMX_SECTION_FILTERING|
-                                             DMX_MEMORY_BASED_FILTERING);
-
-                dvb_dmx_init(&av7110->demux);
-
-
-                dvbfront->id="hw_frontend";
-                dvbfront->vendor="VLSI";
-                dvbfront->model="DVB Frontend";
-                dvbfront->source=DMX_FRONTEND_0;
-
-                av7110->dmxdev.filternum=32;
-                av7110->dmxdev.demux=&dvbdemux->dmx;
-                av7110->dmxdev.capabilities=0;
-
-                dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
-        }
-
-        if (av7110->saa->card_type>=DVB_CARD_TT_BUDGET) {
-                dvbdemux->filternum=256;
-                dvbdemux->feednum=256;
-                dvbdemux->start_feed=dvb_start_feed;
-                dvbdemux->stop_feed=dvb_stop_feed;
-                dvbdemux->write_to_decoder=0;
-
-                dvbdemux->dmx.vendor="CIM";
-                dvbdemux->dmx.model="sw";
-                dvbdemux->dmx.id=av7110->demux_id;
-                dvbdemux->dmx.capabilities=(DMX_TS_FILTERING|
-                                             DMX_SECTION_FILTERING|
-                                             DMX_MEMORY_BASED_FILTERING);
-
-                dvb_dmx_init(&av7110->demux);
-
-                dvbfront->id="hw_frontend";
-                dvbfront->vendor="VLSI";
-                dvbfront->model="DVB Frontend";
-                dvbfront->source=DMX_FRONTEND_0;
-
-                av7110->dmxdev.filternum=256;
-                av7110->dmxdev.demux=&dvbdemux->dmx;
-                av7110->dmxdev.capabilities=0;
-
-                dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
-        }
-
-        ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, 
-                                        &av7110->hw_frontend);
-        if (ret<0)
-                return ret;
-        
-        av7110->mem_frontend.id="mem_frontend";
-        av7110->mem_frontend.vendor="memory";
-        av7110->mem_frontend.model="sw";
-        av7110->mem_frontend.source=DMX_MEMORY_FE;
-        ret=dvbdemux->dmx.add_frontend(&dvbdemux->dmx, 
-                                        &av7110->mem_frontend);
-        if (ret<0)
-                return ret;
-        
-        ret=dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, 
-                                            &av7110->hw_frontend);
-        if (ret<0)
-                return ret;
-
-        if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) {
-                dvb_register_device(av7110->dvb_adapter, &av7110->video_dev,
-                                    &dvbdev_video, av7110, DVB_DEVICE_VIDEO);
-                dvb_register_device(av7110->dvb_adapter, &av7110->audio_dev,
-                                    &dvbdev_audio, av7110, DVB_DEVICE_AUDIO);
-                dvb_register_device(av7110->dvb_adapter, &av7110->osd_dev,
-                                    &dvbdev_osd, av7110, DVB_DEVICE_OSD);
-                dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev,  
-                                    &dvbdev_ca, av7110, DVB_DEVICE_CA);
-                vid_register(av7110);
-#ifdef USE_DVB_DSP
-                dvb->dsp_dev = dvb_register_dsp(dvb_audio_open, 
-                                                dvb_audio_release, 
-                                                dvb_audio_ioctl, 
-                                                dvb_audio_write, 
-                                                av7110->audio_dev);
-#endif
-        }
-        
-        av7110->dvb_net.card_num=av7110->saa->dvb_adapter->num;
-        dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
-
-	return 0;
-}
-
-
-static void 
-dvb_unregister(av7110_t *av7110)
-{
-        struct dvb_demux *dvbdemux=&av7110->demux;
-
-        if (!av7110->registered)
-                return;
-
-	dvb_net_release(&av7110->dvb_net);
-
-	dvbdemux->dmx.close(&dvbdemux->dmx);
-        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
-        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
-
-        dvb_dmxdev_release(&av7110->dmxdev);
-        dvb_dmx_release(&av7110->demux);
-
-	if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) 
-                dvb_remove_frontend_notifier (av7110->dvb_adapter,
-                                              av7110_before_after_tune);
-
-	dvb_remove_frontend_ioctls (av7110->dvb_adapter,
-				    av7110_diseqc_ioctl, NULL);
-
-        if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) {
-                vid_unregister(av7110);
-                dvb_unregister_device(av7110->audio_dev);
-                dvb_unregister_device(av7110->video_dev);
-                dvb_unregister_device(av7110->osd_dev);
-                dvb_unregister_device(av7110->ca_dev);
-#ifdef USE_DVB_DSP
-                dvb_unregister_dsp(av7110->dsp_dev);
-#endif
-        }
-}
-
-/****************************************************************************
- * INITIALIZATION
- ****************************************************************************/
-
-static
-int av7110_attach (struct saa7146 *saa, void **av7110_ptr)
-{
-	struct av7110_s *av7110;
-
-	if (!(av7110 = kmalloc (sizeof (struct av7110_s), GFP_KERNEL))) {
-		printk ("%s: out of memory!\n", __FUNCTION__);
-		return -ENOMEM;
-	}
-
-	*av7110_ptr = av7110;
-
-        memset(av7110, 0, sizeof(av7110_t));
-
-	tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
-	tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
-	tasklet_init (&av7110->vpe_tasklet, vpeirq, (unsigned long) av7110);
-	tasklet_init (&av7110->fidb_tasklet, fidbirq, (unsigned long) av7110);
-
-        sema_init(&av7110->pid_mutex, 1);
-
-        /* locks for data transfers from/to AV7110 */
-        spin_lock_init (&av7110->debilock);
-        sema_init(&av7110->dcomlock, 1);
-        av7110->debilock=SPIN_LOCK_UNLOCKED;
-        av7110->debitype=-1;
-
-	av7110->saa=(struct saa7146 *) saa;
-        av7110->saa_mem=av7110->saa->mem;
-
-        /* default ADAC type */
-        av7110->adac_type = adac;
-
-        /* default OSD window */
-        av7110->osdwin=1;
-
-        /* ARM "watchdog" */
-	init_waitqueue_head(&av7110->arm_wait);
-        av7110->arm_thread=0;
-     
-        av7110->vidmode=VIDEO_MODE_PAL;
-
-        dvb_filter_ipack_init(&av7110->ipack[0], IPACKS, play_audio_cb);
-        av7110->ipack[0].data=(void *) av7110;
-        dvb_filter_ipack_init(&av7110->ipack[1], IPACKS, play_video_cb);
-        av7110->ipack[1].data=(void *) av7110;
-        
-
-        /* allocate and init buffers */
-
-        av7110->debi_virt=pci_alloc_consistent(av7110->saa->device, 8192,
-					       &av7110->debi_bus);
-        if (!av7110->debi_virt) 
-                return -1;
-
-        av7110->iobuf=vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS);
-        if (!av7110->iobuf) 
-                return -1;
-
-        ring_buffer_init(&av7110->avout, av7110->iobuf, AVOUTLEN);
-        ring_buffer_init(&av7110->aout, av7110->iobuf+AVOUTLEN, AOUTLEN);
-
-        /* init BMP buffer */
-        av7110->bmpbuf=av7110->iobuf+AVOUTLEN+AOUTLEN;
-        init_waitqueue_head(&av7110->bmpq);
-        
-        av7110->kbuf[0]=(u8 *)(av7110->iobuf+AVOUTLEN+AOUTLEN+BMPLEN);
-        av7110->kbuf[1]=av7110->kbuf[0]+2*IPACKS;
-
-        /* CI link layer buffers */
-        ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192);
-
-        /* handle different card types */
-
-        /* load firmware into AV7110 cards */
-        if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) {
-                bootarm(av7110);
-                firmversion(av7110);
-                if ((av7110->arm_app&0xffff)<0x2502) {
-                        printk("av7110: Warning, firmware version is too old. System might be unstable!!!\n");
-                }
-                kernel_thread(arm_thread, (void *) av7110, 0);
-        } else {
-                saa7146_write(av7110->saa_mem, DD1_INIT, 0x02000600);
-                saa7146_write(av7110->saa_mem, MC2, 
-                              (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-                setgpio(av7110, 2, GPIO_OUTHI); /* frontend power on */
-        }
-
-	SetVolume(av7110, 0xff, 0xff);
-
-        if (av7110->saa->card_type==DVB_CARD_TT_SIEMENS) {
-                VidMode(av7110, vidmode);
-
-	        /* remaining inits according to card and frontend type */
-
-                if (i2c_writereg(av7110, 0x20, 0x00, 0x00)==1) {
-                        dprintk("av7110%d: Crystal audio DAC detected\n",
-				av7110->saa->dvb_adapter->num);
-                        av7110->adac_type = DVB_ADAC_CRYSTAL;
-                        i2c_writereg(av7110, 0x20, 0x01, 0xd2);
-                        i2c_writereg(av7110, 0x20, 0x02, 0x49);
-                        i2c_writereg(av7110, 0x20, 0x03, 0x00);
-                        i2c_writereg(av7110, 0x20, 0x04, 0x00);
-                }
-                
-		/**
-		 * some special handling for the Siemens DVB-C card...
-		 */
-		if (av7110->saa->device->subsystem_vendor == 0x110a) {
-                        if (i2c_writereg(av7110, 0x80, 0x0, 0x80)==1) {
-                                i2c_writereg(av7110, 0x80, 0x0, 0);
-                                printk("av7110: DVB-C analog module detected, "
-                                       "initializing MSP3400\n");
-                                ddelay(10);
-                                msp_writereg(av7110, 0x12, 0x0013, 0x0c00);
-                                msp_writereg(av7110, 0x12, 0x0000, 0x7f00); // loudspeaker + headphone
-                                msp_writereg(av7110, 0x12, 0x0008, 0x0220); // loudspeaker source
-                                msp_writereg(av7110, 0x12, 0x0004, 0x7f00); // loudspeaker volume
-                                msp_writereg(av7110, 0x12, 0x000a, 0x0220); // SCART 1 source
-                                msp_writereg(av7110, 0x12, 0x0007, 0x7f00); // SCART 1 volume
-                                msp_writereg(av7110, 0x12, 0x000d, 0x4800); // prescale SCART
-                        }
-
-                        // switch DVB SCART on
-                        outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
-                        outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
-                        
-                        //setgpio(av7110, 1, GPIO_OUTHI); // RGB on, SCART pin 16
-                        //setgpio(av7110, 3, GPIO_OUTLO); // SCARTpin 8
-                        av7110->adac_type = DVB_ADAC_NONE;
-                }
-        }
-
-	if (init_vpid != 0 || init_apid != 0)
-		ChangePIDs(av7110, init_vpid, init_apid, 0, 0, 0);
-
-	av7110_setup_irc_config (av7110, 0);
-        dvb_register(av7110);
-
-        return 0;
-}
-
-
-static
-int av7110_detach (struct saa7146 *saa, void** av7110_ptr)
-{
-	struct av7110_s *av7110 = *av7110_ptr;
-
-	av7110->arm_rmmod=1;
-	wake_up_interruptible(&av7110->arm_wait);
-
-	while (av7110->arm_thread)
-		ddelay(1);
-
-	dvb_unregister(av7110);
-
-	saa7146_write (av7110->saa_mem, IER, 
-		     saa7146_read(av7110->saa_mem, IER) & ~(MASK_19 | MASK_03));
-	
-	saa7146_write(av7110->saa_mem, ISR,(MASK_19 | MASK_03));
-
-	ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
-	dvb_filter_ipack_free(&av7110->ipack[0]);
-	dvb_filter_ipack_free(&av7110->ipack[1]);
-	vfree(av7110->iobuf);
-	pci_free_consistent(av7110->saa->device, 8192, av7110->debi_virt,
-			    av7110->debi_bus);
-
-	kfree (av7110);
-	*av7110_ptr = NULL;
-
-	return 0;
-}
-
-
-static
-void av7110_irq(struct saa7146 *saa, u32 isr, void *data) 
-{
-	struct av7110_s *av7110 = (struct av7110_s*) data;
-
-	if (isr & MASK_19)
-		tasklet_schedule (&av7110->debi_tasklet);
-
-	if (isr & MASK_03)
-		tasklet_schedule (&av7110->gpio_tasklet);
-
-	if (isr & MASK_10)
-		tasklet_schedule (&av7110->vpe_tasklet);
-
-	if (isr & MASK_07)
-		tasklet_schedule (&av7110->fidb_tasklet);
-}
-
-
-static
-int av7110_command(struct saa7146 *saa, void *p, unsigned int cmd, void *arg)
-{
-        switch(cmd) {
-        case SAA7146_SUSPEND:
-                printk("dvb_suspend()\n");
-                break;
-        case SAA7146_RESUME:
-                printk("dvb_resume()\n");
-                break;
-        default:
-                return -ENOIOCTLCMD;
-        }
-        return 0;
-}
-
-
-static
-void av7110_inc_use(struct saa7146* adap)
-{
-	MOD_INC_USE_COUNT;
-}
-
-
-static
-void av7110_dec_use(struct saa7146* adap)
-{
-	MOD_DEC_USE_COUNT;
-}
-
-
-static struct saa7146_extension av7110_extension = {
-	"dvb extension\0",
-	MASK_07|MASK_10|MASK_19|MASK_03|MASK_27,
-	av7110_irq,
-	av7110_command,
-	av7110_attach,
-	av7110_detach,
-	av7110_inc_use,
-	av7110_dec_use
-};	
-
-
-int __init av7110_init(void) 
-{
-	int result = 0;
-
-	if ((result = saa7146_add_extension(&av7110_extension))) {
-		printk("%s: saa7146_add_extension() failed!\n",
-			__FUNCTION__);
-		return result;
-	}
-
-        return result;
-}
-
-
-void __exit av7110_exit(void)
-{
-	if (saa7146_del_extension(&av7110_extension)) 
-                printk(KERN_ERR "dvb: extension deregistration failed.\n");
-}
-
-//MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by "
-//		   "Siemens, Technotrend, Hauppauge");
-//MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
-//MODULE_LICENSE("GPL");
-
-MODULE_PARM(av7110_debug,"i");
-MODULE_PARM(vidmem,"l");
-MODULE_PARM(vidlow,"l");
-MODULE_PARM(vidmode,"i");
-MODULE_PARM(init_vpid,"i");
-MODULE_PARM(init_apid,"i");
-MODULE_PARM(pids_off,"i");
-MODULE_PARM(adac,"i");
-
-/*
- * Local variables:
- * c-indent-level: 8
- * c-brace-imaginary-offset: 0
- * c-brace-offset: -8
- * c-argdecl-indent: 8
- * c-label-offset: -8
- * c-continued-statement-offset: 8
- * c-continued-brace-offset: 0
- * indent-tabs-mode: nil
- * tab-width: 8
- * End:
- */
-
diff -Nru a/drivers/media/dvb/av7110/av7110.h b/drivers/media/dvb/av7110/av7110.h
--- a/drivers/media/dvb/av7110/av7110.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,743 +0,0 @@
-#ifndef _AV7110_H_
-#define _AV7110_H_
-
-#define DVB_FIRM_PATH "/lib/DVB/"
-
-#include <linux/interrupt.h>
-#include <linux/videodev.h>
-#include <linux/socket.h>
-#include <linux/netdevice.h>
-
-#ifdef CONFIG_DEVFS_FS
-#include <linux/devfs_fs_kernel.h>
-#endif
-
-/* DEBI transfer mode defs */
-
-#define DEBINOSWAP 0x000e0000
-#define DEBISWAB   0x001e0000
-#define DEBISWAP   0x002e0000
-
-#define ARM_WAIT_FREE  (HZ)
-#define ARM_WAIT_SHAKE (HZ/5)
-#define ARM_WAIT_OSD (HZ)
-
-#if LINUX_VERSION_CODE < 0x020300
-#define net_device device
-#define DECLARE_MUTEX(foo)         struct semaphore foo = MUTEX
-#define DECLARE_MUTEX_LOCKED(foo)  struct semaphore foo = MUTEX_LOCKED
-#define WAIT_QUEUE                 struct wait_queue*
-#define init_waitqueue_head(wq)    *(wq) = NULL;
-#define DECLARE_WAITQUEUE(wait, current) struct wait_queue wait = { current, NULL }
-#define set_current_state(state_value)                  \
-        do { current->state = state_value; } while (0)
-#define list_for_each(pos, head) \
-        for (pos = (head)->next; pos != (head); pos = pos->next)
-
-#else
-
-#define WAIT_QUEUE                 wait_queue_head_t
-
-#endif
-
-#include <linux/dvb/video.h>
-#include <linux/dvb/audio.h>
-#include <linux/dvb/dmx.h>
-#include <linux/dvb/ca.h>
-#include <linux/dvb/osd.h>
-#include <linux/dvb/net.h>
-
-#include "../dvb-core/dvbdev.h"
-#include "../dvb-core/demux.h"
-#include "../dvb-core/dvb_demux.h"
-#include "../dvb-core/dmxdev.h"
-#include "../dvb-core/dvb_filter.h"
-#include "../dvb-core/dvb_net.h"
-
-
-typedef enum BOOTSTATES
-{
-	BOOTSTATE_BUFFER_EMPTY	= 0,
-	BOOTSTATE_BUFFER_FULL	= 1,
-	BOOTSTATE_BOOT_COMPLETE	= 2
-} BOOTSTATES;
-
-typedef enum GPIO_MODE
-{
-	GPIO_INPUT = 0x00,
-	GPIO_IRQHI = 0x10,
-	GPIO_IRQLO = 0x20,
-	GPIO_IRQHL = 0x30,
-	GPIO_OUTLO = 0x40,
-	GPIO_OUTHI = 0x50
-} GPIO_MODE;
-
-typedef enum
-{	RP_None,
-	AudioPES,
-	AudioMp2,
-	AudioPCM,
-	VideoPES,
-	AV_PES
-} TYPE_REC_PLAY_FORMAT;
-
-typedef struct PARAMSTRUCT
-{
-	unsigned int	wCommand;
-        int             error;
-	unsigned long	pdwData[100];
-} PARAMSTRUCT, *PPARAMSTRUCT;
-
-typedef enum OSDPALTYPE
-{
-	NoPalet =  0,      /* No palette */
-	Pal1Bit =  2,      /* 2 colors for 1 Bit Palette    */
-	Pal2Bit =  4,      /* 4 colors for 2 bit palette    */
-	Pal4Bit =  16,     /* 16 colors for 4 bit palette   */
-	Pal8Bit =  256     /* 256 colors for 16 bit palette */
-} OSDPALTYPE, *POSDPALTYPE;
-
-typedef enum {
-   BITMAP1,           /* 1 bit bitmap */
-   BITMAP2,           /* 2 bit bitmap */
-   BITMAP4,           /* 4 bit bitmap */
-   BITMAP8,           /* 8 bit bitmap */
-   BITMAP1HR,         /* 1 Bit bitmap half resolution */
-   BITMAP2HR,         /* 2 bit bitmap half resolution */
-   BITMAP4HR,         /* 4 bit bitmap half resolution */
-   BITMAP8HR,         /* 8 bit bitmap half resolution */
-   YCRCB422,          /* 4:2:2 YCRCB Graphic Display */
-   YCRCB444,          /* 4:4:4 YCRCB Graphic Display */
-   YCRCB444HR,        /* 4:4:4 YCRCB graphic half resolution */
-   VIDEOTSIZE,        /* True Size Normal MPEG Video Display */
-   VIDEOHSIZE,        /* MPEG Video Display Half Resolution */
-   VIDEOQSIZE,        /* MPEG Video Display Quarter Resolution */
-   VIDEODSIZE,        /* MPEG Video Display Double Resolution */
-   VIDEOTHSIZE,       /* True Size MPEG Video Display Half Resolution */
-   VIDEOTQSIZE,       /* True Size MPEG Video Display Quarter Resolution*/
-   VIDEOTDSIZE,       /* True Size MPEG Video Display Double Resolution */
-   VIDEONSIZE,        /* Full Size MPEG Video Display */
-   CURSOR             /* Cursor */
-} DISPTYPE;           /* Window display type           */
-
-// switch defines
-#define SB_GPIO 3
-#define SB_OFF	GPIO_OUTLO  //SlowBlank aus (TV-Mode)
-#define SB_ON	GPIO_INPUT  //SlowBlank an  (AV-Mode)
-#define SB_WIDE GPIO_OUTHI  //SlowBlank 6V  (16/9-Mode) nicht realisiert
-
-#define FB_GPIO 1
-#define FB_OFF	GPIO_LO     //FastBlank aus (CVBS-Mode)
-#define FB_ON   GPIO_OUTHI  //FastBlank an  (RGB-Mode)
-#define FB_LOOP	GPIO_INPUT  //FastBlank der PC-Grafik durchschleifen
-
-typedef enum VIDEOOUTPUTMODE
-{
-        NO_OUT       = 0,		//disable analog Output
-	CVBS_RGB_OUT = 1,
-	CVBS_YC_OUT  = 2,
-	YC_OUT	     = 3
-} VIDEOOUTPUTMODE, *PVIDEOOUTPUTMODE;
-
-
-#define GPMQFull        0x0001                  //Main Message Queue Full
-#define GPMQOver        0x0002                  //Main Message Queue Overflow
-#define HPQFull         0x0004                  //High Priority Msg Queue Full
-#define HPQOver         0x0008
-#define OSDQFull        0x0010                  //OSD Queue Full
-#define OSDQOver        0x0020
-
-#define	SECTION_EIT	        0x01
-#define	SECTION_SINGLE	        0x00
-#define	SECTION_CYCLE		0x02
-#define	SECTION_CONTINUOS	0x04
-#define	SECTION_MODE		0x06
-#define SECTION_IPMPE		0x0C	// bis zu 4k groß
-#define SECTION_HIGH_SPEED	0x1C	// vergrößerter Puffer für High Speed Filter
-#define DATA_PIPING_FLAG	0x20	// für Data Piping Filter
-
-#define	PBUFSIZE_NONE 0x0000
-#define	PBUFSIZE_1P   0x0100
-#define	PBUFSIZE_2P   0x0200
-#define	PBUFSIZE_1K   0x0300
-#define	PBUFSIZE_2K   0x0400
-#define	PBUFSIZE_4K   0x0500
-#define	PBUFSIZE_8K   0x0600
-#define PBUFSIZE_16K  0x0700
-#define PBUFSIZE_32K  0x0800
-
-typedef enum {	
-        WCreate,
-	WDestroy,
-	WMoveD,
-	WMoveA,
-	WHide,
-	WTop,
-	DBox,
-	DLine,
-	DText,
-	Set_Font,
-	SetColor,
-	SetBlend,
-	SetWBlend,
-	SetCBlend,
-	SetNonBlend,
-	LoadBmp,
-	BlitBmp,
-	ReleaseBmp,
-	SetWTrans,
-	SetWNoTrans
-} OSDCOM;
-
-typedef enum { 
-	MultiPID,
-        VideoPID,
-	AudioPID,
-	InitFilt,
-	FiltError,
-	NewVersion,
-	CacheError,
-	AddPIDFilter,
-	DelPIDFilter,
-	Scan,
-	SetDescr,
-        SetIR
-} PIDCOM;
-			
-typedef enum {
-        SelAudChannels
-} MPEGCOM;
-
-typedef enum  { 
-        AudioDAC,
-	CabADAC,
-	ON22K,
-	OFF22K,
-	MainSwitch,
-	ADSwitch,
-	SendDiSEqC,
-	SetRegister
-} AUDCOM;
-
-typedef enum  {
-        AudioState,
-	AudioBuffState,
-	VideoState1,
-	VideoState2,
-	VideoState3,
-	CrashCounter,
-	ReqVersion,
-	ReqVCXO,
-	ReqRegister
-} REQCOM;
-
-typedef enum  {
-        SetVidMode,
-	SetTestMode,
-	LoadVidCode,
-	SetMonitorType,
-	SetPanScanType,
-	SetFreezeMode
-} ENC;
-
-typedef enum  { 
-        __Record,
-	__Stop,
-	__Play,
-	__Pause,
-	__Slow,
-	__FF_IP,
-	__Scan_I,
-	__Continue
-} REC_PLAY;
-
-typedef enum  { 
-        COMTYPE_NOCOM,
-	COMTYPE_PIDFILTER,
-	COMTYPE_MPEGDECODER,
-	COMTYPE_OSD,
-	COMTYPE_BMP,
-	COMTYPE_ENCODER,
-	COMTYPE_AUDIODAC,
-	COMTYPE_REQUEST,
-	COMTYPE_SYSTEM,
-	COMTYPE_REC_PLAY,
-	COMTYPE_COMMON_IF,
-	COMTYPE_PID_FILTER,
-        COMTYPE_PES,
-        COMTYPE_TS,
-	COMTYPE_VIDEO,
-	COMTYPE_AUDIO,
-	COMTYPE_CI_LL,
-} COMTYPE;
-
-typedef enum {
-	AV7110_VIDEO_FREEZE,
-	AV7110_VIDEO_CONTINUE
-} VIDEOCOM;
-
-typedef enum {
-	DVB_AUDIO_PAUSE,
-} AUDIOCOM;
-
-
-#define VID_NONE_PREF           0x00    /* No aspect ration processing preferred */
-#define VID_PAN_SCAN_PREF       0x01    /* Pan and Scan Display preferred */
-#define VID_VERT_COMP_PREF      0x02    /* Vertical compression display preferred */
-#define VID_VC_AND_PS_PREF      0x03    /* PanScan and vertical Compression if allowed */
-#define VID_CENTRE_CUT_PREF     0x05    /* PanScan with zero vector */
-
-#define DATA_NONE                0x00
-#define DATA_FSECTION            0x01
-#define DATA_IPMPE               0x02
-#define DATA_MPEG_RECORD         0x03
-#define DATA_DEBUG_MESSAGE       0x04
-#define DATA_COMMON_INTERFACE    0x05
-#define DATA_MPEG_PLAY           0x06
-#define DATA_BMP_LOAD            0x07
-#define DATA_IRCOMMAND           0x08
-#define DATA_PIPING              0x09
-#define DATA_STREAMING           0x0a
-#define DATA_CI_GET              0x0b
-#define DATA_CI_PUT              0x0c
-
-#define DATA_PES_RECORD          0x10
-#define DATA_PES_PLAY            0x11
-#define DATA_TS_RECORD           0x12
-#define DATA_TS_PLAY             0x13
-
-#define CI_CMD_ERROR             0x00
-#define CI_CMD_ACK               0x01
-#define CI_CMD_SYSTEM_READY      0x02
-#define CI_CMD_KEYPRESS          0x03
-#define CI_CMD_ON_TUNED          0x04
-#define CI_CMD_ON_SWITCH_PROGRAM 0x05
-#define CI_CMD_SECTION_ARRIVED   0x06
-#define CI_CMD_SECTION_TIMEOUT   0x07
-#define CI_CMD_TIME              0x08
-#define CI_CMD_ENTER_MENU        0x09
-#define CI_CMD_FAST_PSI          0x0a
-#define CI_CMD_GET_SLOT_INFO     0x0b
-
-#define CI_MSG_NONE              0x00
-#define CI_MSG_CI_INFO           0x01
-#define CI_MSG_MENU              0x02
-#define CI_MSG_LIST              0x03
-#define CI_MSG_TEXT              0x04
-#define CI_MSG_REQUEST_INPUT     0x05
-#define CI_MSG_INPUT_COMPLETE    0x06
-#define CI_MSG_LIST_MORE         0x07
-#define CI_MSG_MENU_MORE         0x08
-#define CI_MSG_CLOSE_MMI_IMM     0x09
-#define CI_MSG_SECTION_REQUEST   0x0a
-#define CI_MSG_CLOSE_FILTER      0x0b
-#define CI_PSI_COMPLETE          0x0c
-#define CI_MODULE_READY          0x0d
-#define CI_SWITCH_PRG_REPLY      0x0e
-#define CI_MSG_TEXT_MORE         0x0f
-
-#define CI_MSG_CA_PMT            0xe0
-#define CI_MSG_ERROR             0xf0
-
-typedef struct ring_buffer_s {
-        u8               *data;
-        int               size;
-        int               pread;
-        int               pwrite;
-
-        WAIT_QUEUE        queue;
-        spinlock_t        lock;
-        struct semaphore  sema;
-
-        int error;
-} ring_buffer_t;
-
-
-#define PROG_STREAM_MAP  0xBC
-#define PRIVATE_STREAM1  0xBD
-#define PADDING_STREAM   0xBE
-#define PRIVATE_STREAM2  0xBF
-#define AUDIO_STREAM_S   0xC0
-#define AUDIO_STREAM_E   0xDF
-#define VIDEO_STREAM_S   0xE0
-#define VIDEO_STREAM_E   0xEF
-#define ECM_STREAM       0xF0
-#define EMM_STREAM       0xF1
-#define DSM_CC_STREAM    0xF2
-#define ISO13522_STREAM  0xF3
-#define PROG_STREAM_DIR  0xFF
-
-#define PTS_DTS_FLAGS    0xC0
-
-//pts_dts flags
-#define PTS_ONLY         0x80
-#define PTS_DTS          0xC0
-#define TS_SIZE          188
-#define TRANS_ERROR      0x80
-#define PAY_START        0x40
-#define TRANS_PRIO       0x20
-#define PID_MASK_HI      0x1F
-//flags
-#define TRANS_SCRMBL1    0x80
-#define TRANS_SCRMBL2    0x40
-#define ADAPT_FIELD      0x20
-#define PAYLOAD          0x10
-#define COUNT_MASK       0x0F
-
-// adaptation flags
-#define DISCON_IND       0x80
-#define RAND_ACC_IND     0x40
-#define ES_PRI_IND       0x20
-#define PCR_FLAG         0x10
-#define OPCR_FLAG        0x08
-#define SPLICE_FLAG      0x04
-#define TRANS_PRIV       0x02
-#define ADAP_EXT_FLAG    0x01
-
-// adaptation extension flags
-#define LTW_FLAG         0x80
-#define PIECE_RATE       0x40
-#define SEAM_SPLICE      0x20
-
-#define MAX_PLENGTH      0xFFFF
-#define MAX_VID_PES      0x1FFF
-
-typedef struct section_s {
-        int               id;
-        int               length;
-        int               found;
-        u8                payload[4096+3];
-} section_t;
-
-
-#define MY_STATE_PES_START     1
-#define MY_STATE_PES_STARTED   2
-#define MY_STATE_FULL          4
-
-#define MASKL   DMX_MAX_FILTER_SIZE
-#define MAXFILT 32
-
-struct dvb_filter {
-        int               state;
-        int               flags;
-        int               type;
-        u8                ts_state;
-
-        u16               pid;
-        u8                value[MASKL];
-        u8                mask[MASKL];
-};
-
-
-enum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM};
-
-typedef struct ps_packet_s{
-        u8                scr[6];
-        u8                mux_rate[3];
-        u8                stuff_length;
-        u8                data[20];
-        u8                sheader_llength[2];
-        int               sheader_length;
-        u8                rate_bound[3];
-        u8                audio_bound;
-        u8                video_bound;
-        u8                reserved;
-        int               npes;
-        int               mpeg;
-} ps_packet_t;
-
-typedef struct a2p_s{
-        int               type;
-        int               found;
-        int               length;
-        int               headr;
-        u8                cid;
-        u8                flags;
-        u8                abuf[MAX_PLENGTH];
-        int               alength;
-        u8                vbuf[MAX_PLENGTH];
-        int               vlength;
-        int               plength;
-        u8                last_av_pts[4];
-        u8                av_pts[4];
-        u8                scr[4];
-        u16               count0;
-        u16               count1;
-        u16               pidv;
-        u16               pida;
-        u16               countv;
-        u16               counta;
-        void             *dataA;
-        void             *dataV;
-        void              (*write_cb)(u8 const *buf, long int count,
-                                      void     *data);
-} a2p_t;
-
-
-typedef struct p2t_s {
-        u8                pes[TS_SIZE];
-        u8                counter;
-        long int          pos;
-        int               frags;
-        struct dvb_demux_feed *feed;
-} p2t_t;
-
-
-/* place to store all the necessary device information */
-typedef struct av7110_s {
-
-        /* devices */
-
-        struct dvb_device       dvb_dev;
-        dvb_net_t               dvb_net;
-        struct video_device     video;
-
-        struct saa7146         *saa;
-
-	struct tasklet_struct   debi_tasklet;
-	struct tasklet_struct   gpio_tasklet;
-	struct tasklet_struct   vpe_tasklet;
-	struct tasklet_struct   fidb_tasklet;
-
-        int adac_type;         /* audio DAC type */
-#define DVB_ADAC_TI       0
-#define DVB_ADAC_CRYSTAL  1
-#define DVB_ADAC_NONE    -1
-
-
-        /* buffers */
-
-        void                   *iobuf;   /* memory for all buffers */
-        ring_buffer_t           avout;   /* buffer for video or A/V mux */
-#define AVOUTLEN (128*1024)
-        ring_buffer_t           aout;    /* buffer for audio */
-#define AOUTLEN (64*1024)
-        void                   *bmpbuf;
-#define BMPLEN (8*32768+1024)
-
-        /* bitmap buffers and states */
-
-        int                     bmpp;
-        int                     bmplen;
-        int                     bmp_win;
-        u16                     bmp_x, bmp_y;
-        int                     bmp_trans;
-        int                     bmp_state;
-#define BMP_NONE     0
-#define BMP_LOADING  1
-#define BMP_LOADINGS 2
-#define BMP_LOADED   3
-        WAIT_QUEUE              bmpq;
-
-
-        /* DEBI and polled command interface */
-
-        spinlock_t              debilock;
-        struct semaphore        dcomlock;
-        int                     debitype;
-        int                     debilen;
-        int                     debibuf;
-
-
-        /* Recording and playback flags */
-
-        int                     rec_mode;
-        int                     playing;
-#define RP_NONE  0
-#define RP_VIDEO 1
-#define RP_AUDIO 2
-#define RP_AV    3
-
-
-        /* OSD */
-
-        int                     osdwin;      /* currently active window */
-        u16                     osdbpp[8];
-
-
-        /* CA */
-
-        ca_slot_info_t          ci_slot[2];
-
-        int                     vidmode;
-        dmxdev_t                dmxdev;
-        struct dvb_demux             demux;
-        char                    demux_id[16];
-
-        dmx_frontend_t          hw_frontend;
-        dmx_frontend_t          mem_frontend;
-
-        int                     fe_synced; 
-        struct semaphore        pid_mutex;
-
-        int                     video_blank;
-        struct video_status     videostate;
-        int                     display_ar;
-        int                     trickmode;
-#define TRICK_NONE   0
-#define TRICK_FAST   1
-#define TRICK_SLOW   2
-#define TRICK_FREEZE 3
-        struct audio_status      audiostate;
-
-        struct dvb_demux_filter     *handle2filter[MAXFILT];
-        p2t_t                   p2t_filter[MAXFILT];
-        dvb_filter_pes2ts_t     p2t[2];
-        struct ipack_s          ipack[2];
-        u8                     *kbuf[2];
-
-        int sinfo;
-        int shsize;
-        int swsize;
-
-        int tsf;
-        u32 ttbp;
-        int feeding;
-
-        int arm_errors;
-        int registered;
-
-
-	/* AV711X */
-
-        u32                 arm_fw;
-        u32                 arm_rtsl;
-        u32                 arm_vid;
-        u32                 arm_app;
-        u32                 avtype;
-        int                 arm_ready;
-        struct task_struct *arm_thread;
-        WAIT_QUEUE          arm_wait;
-        u16                 arm_loops;
-        int                 arm_rmmod;
-
-        void               *saa_mem;
-        void               *debi_virt;
-        dma_addr_t          debi_bus;
-
-        u16                 pids[DMX_PES_OTHER];
-        
-        ring_buffer_t       ci_rbuffer;
-        ring_buffer_t       ci_wbuffer;
-
-
-        struct dvb_adapter       *dvb_adapter;
-        struct dvb_device        *video_dev;
-        struct dvb_device        *audio_dev;
-        struct dvb_device        *ca_dev;
-        struct dvb_device        *osd_dev;
-
-        int                 dsp_dev;
-} av7110_t;
-
-
-#define	DPRAM_BASE 0x4000
-
-#define BOOT_STATE	(DPRAM_BASE + 0x3F8)
-#define BOOT_SIZE	(DPRAM_BASE + 0x3FA)
-#define BOOT_BASE	(DPRAM_BASE + 0x3FC)
-#define BOOT_BLOCK	(DPRAM_BASE + 0x400)
-#define BOOT_MAX_SIZE	0xc00
-
-#define IRQ_STATE	(DPRAM_BASE + 0x0F4)
-#define IRQ_STATE_EXT	(DPRAM_BASE + 0x0F6)
-#define MSGSTATE	(DPRAM_BASE + 0x0F8)
-#define FILT_STATE	(DPRAM_BASE + 0x0FA)
-#define COMMAND		(DPRAM_BASE + 0x0FC)
-#define COM_BUFF	(DPRAM_BASE + 0x100)
-#define COM_BUFF_SIZE	0x20
-
-#define BUFF1_BASE	(DPRAM_BASE + 0x120)
-#define BUFF1_SIZE	0xE0
-
-#define DATA_BUFF_BASE	(DPRAM_BASE + 0x200)
-#define DATA_BUFF_SIZE	0x1C00
-
-/* new buffers */
-
-#define DATA_BUFF0_BASE	(DPRAM_BASE + 0x200)
-#define DATA_BUFF0_SIZE	0x0800
-
-#define DATA_BUFF1_BASE	(DATA_BUFF0_BASE+DATA_BUFF0_SIZE)
-#define DATA_BUFF1_SIZE	0x0800
-
-#define DATA_BUFF2_BASE	(DATA_BUFF1_BASE+DATA_BUFF1_SIZE)
-#define DATA_BUFF2_SIZE	0x0800
-
-#define Reserved	(DPRAM_BASE + 0x1E00)
-#define Reserved_SIZE	0x1C0
-
-#define DEBUG_WINDOW	(DPRAM_BASE + 0x1FC0)
-#define	DBG_LOOP_CNT	(DEBUG_WINDOW + 0x00)
-#define DBG_SEC_CNT	(DEBUG_WINDOW + 0x02)
-#define DBG_AVRP_BUFF	(DEBUG_WINDOW + 0x04)
-#define DBG_AVRP_PEAK	(DEBUG_WINDOW + 0x06)
-#define DBG_MSG_CNT	(DEBUG_WINDOW + 0x08)
-#define DBG_CODE_REG	(DEBUG_WINDOW + 0x0a)
-#define DBG_TTX_Q	(DEBUG_WINDOW + 0x0c)
-#define DBG_AUD_EN	(DEBUG_WINDOW + 0x0e)
-#define DBG_WRONG_COM	(DEBUG_WINDOW + 0x10)
-#define DBG_ARR_OVFL	(DEBUG_WINDOW + 0x12)
-#define DBG_BUFF_OVFL	(DEBUG_WINDOW + 0x14)
-#define DBG_OVFL_CNT	(DEBUG_WINDOW + 0x16)
-#define DBG_SEC_OVFL	(DEBUG_WINDOW + 0x18)
-
-#define STATUS_BASE	(DPRAM_BASE + 0x1FC0)
-#define STATUS_SCR      (STATUS_BASE + 0x00)
-#define STATUS_MODES    (STATUS_BASE + 0x04)
-#define STATUS_LOOPS    (STATUS_BASE + 0x08)
-
-#define RX_TYPE         (DPRAM_BASE + 0x1FE8)
-#define RX_LEN          (DPRAM_BASE + 0x1FEA)
-#define TX_TYPE         (DPRAM_BASE + 0x1FEC)
-#define TX_LEN          (DPRAM_BASE + 0x1FEE)
-
-#define RX_BUFF         (DPRAM_BASE + 0x1FF4)
-#define TX_BUFF 	(DPRAM_BASE + 0x1FF6)
-
-#define HANDSHAKE_REG	(DPRAM_BASE + 0x1FF8)
-#define COM_IF_LOCK	(DPRAM_BASE + 0x1FFA)
-
-#define IRQ_RX		(DPRAM_BASE + 0x1FFC)
-#define IRQ_TX		(DPRAM_BASE + 0x1FFE)
-
-#define DRAM_START_CODE		0x2e000404
-#define DRAM_MAX_CODE_SIZE	0x00100000
-
-#define RESET_LINE		2
-#define DEBI_DONE_LINE		1
-#define ARM_IRQ_LINE		0
-
-#define DAC_CS	0x8000
-#define DAC_CDS	0x0000
-
-
-extern unsigned char *av7110_dpram_addr, *av7110_root_addr;
-extern int av7110_dpram_len, av7110_root_len;
-
-extern void av7110_register_irc_handler(void (*func)(u32));
-extern void av7110_unregister_irc_handler(void (*func)(u32)); 
-extern void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config);
-
-extern int av7110_init (void);
-extern int av7110_ir_init (void);
-
-extern void av7110_exit (void);
-extern void av7110_ir_exit (void);
-
-
-#endif /* _AV7110_H_ */
-
-/*
- * Local variables:
- * c-indent-level: 8
- * c-brace-imaginary-offset: 0
- * c-brace-offset: -8
- * c-argdecl-indent: 8
- * c-label-offset: -8
- * c-continued-statement-offset: 8
- * c-continued-brace-offset: 0
- * indent-tabs-mode: nil
- * tab-width: 8
- * End:
- */
diff -Nru a/drivers/media/dvb/av7110/av7110_firm.h b/drivers/media/dvb/av7110/av7110_firm.h
--- a/drivers/media/dvb/av7110/av7110_firm.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,31852 +0,0 @@
-
-#include <asm/types.h>
-
-u8 Dpram [] __initdata = {
-	0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e, 
-	0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04, 
-	0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00, 
-	0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04, 
-	0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0xcb, 0x40, 
-	0x2e, 0x02, 0x39, 0xb4, 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, 0x3b, 0xa4, 0x66, 0x00, 0x00, 0x14, 
-	0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, 
-	0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0xcc, 0x48, 
-	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, 
-};
-
-
-u8 Root [] __initdata = {
-	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, 0x02, 0x36, 0x7c, 
-	0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x02, 0x37, 0x7c, 
-	0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x38, 0x9c, 
-	0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x38, 0xa0, 
-	0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x38, 0xa4, 
-	0x2e, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x38, 0xa8, 
-	0x2e, 0x02, 0x36, 0xe8, 0x2e, 0x02, 0x38, 0xac, 
-	0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x38, 0xb0, 
-	0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x38, 0xb4, 
-	0x2e, 0x02, 0x36, 0x7c, 0x2e, 0x02, 0x38, 0xb8, 
-	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, 0x1d, 0xfe, 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, 0x1d, 0xfe, 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, 0x1d, 
-	0xfe, 0x11, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48, 
-	0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfb, 0x98, 
-	0x48, 0x03, 0x89, 0x02, 0x8a, 0x01, 0x89, 0x80, 
-	0xf0, 0x05, 0xff, 0xc2, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x00, 0x00, 0xb5, 0xf0, 0x4f, 0x10, 
-	0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04, 
-	0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a, 
-	0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x14, 
-	0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07, 
-	0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a, 
-	0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x09, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0xf0, 0x9f, 0x05, 0x04, 0x04, 0x0c, 0x24, 
-	0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 
-	0x04, 0x18, 0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, 
-	0x04, 0x38, 0x0c, 0x00, 0xb0, 0x81, 0x49, 0xa9, 
-	0x4f, 0xa9, 0x42, 0x8d, 0xd1, 0x00, 0x89, 0xbd, 
-	0x42, 0x8e, 0xd1, 0x00, 0x8a, 0x3e, 0x4a, 0xa7, 
-	0x42, 0x95, 0xd1, 0x02, 0x89, 0xbd, 0x08, 0xd3, 
-	0x81, 0xbb, 0x4b, 0xa4, 0x42, 0x9e, 0xd1, 0x02, 
-	0x8a, 0x3e, 0x08, 0xdb, 0x82, 0x3b, 0x9a, 0x01, 
-	0x42, 0x8a, 0xd1, 0x01, 0x8a, 0xba, 0x92, 0x01, 
-	0xa0, 0x9f, 0x22, 0x2d, 0x21, 0x00, 0xf0, 0x06, 
-	0xf8, 0x69, 0xa0, 0x9f, 0x22, 0x37, 0x21, 0x00, 
-	0xf0, 0x06, 0xf8, 0x64, 0x22, 0x3c, 0x21, 0x00, 
-	0x1c, 0x28, 0xf0, 0x06, 0xf8, 0x97, 0xa0, 0x9c, 
-	0x22, 0x41, 0x21, 0x00, 0xf0, 0x06, 0xf8, 0x5a, 
-	0x22, 0x46, 0x21, 0x00, 0x1c, 0x30, 0xf0, 0x06, 
-	0xf8, 0x8d, 0xa0, 0x99, 0x22, 0x37, 0x21, 0x01, 
-	0xf0, 0x06, 0xf8, 0x50, 0x22, 0x3e, 0x21, 0x01, 
-	0x1c, 0x20, 0xf0, 0x06, 0xf8, 0x83, 0xa0, 0x96, 
-	0x22, 0x37, 0x21, 0x02, 0xf0, 0x06, 0xf8, 0x46, 
-	0x22, 0x3e, 0x21, 0x02, 0x98, 0x01, 0xf0, 0x06, 
-	0xf8, 0x79, 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, 0x0f, 
-	0xfe, 0x75, 0xb0, 0x03, 0x98, 0x01, 0x28, 0x00, 
-	0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 
-	0xb4, 0x07, 0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, 
-	0x68, 0x38, 0xf0, 0x0f, 0xfe, 0x67, 0xb0, 0x03, 
-	0x98, 0x01, 0x82, 0xb8, 0x4b, 0x80, 0x42, 0x9c, 
-	0xd0, 0x46, 0xdc, 0x37, 0x2c, 0x00, 0xd0, 0x3d, 
-	0x3b, 0x02, 0x42, 0x9c, 0xd0, 0x38, 0x4b, 0x7d, 
-	0x42, 0x9c, 0xd1, 0x00, 0x1c, 0x34, 0xa0, 0x7c, 
-	0x22, 0x42, 0x21, 0x01, 0xf0, 0x06, 0xf8, 0x0a, 
-	0x22, 0x43, 0x21, 0x01, 0x1c, 0x20, 0xf0, 0x06, 
-	0xf8, 0x3d, 0xa0, 0x78, 0x22, 0x47, 0x21, 0x01, 
-	0xf0, 0x06, 0xf8, 0x00, 0x22, 0x00, 0xb4, 0x04, 
-	0x23, 0x00, 0x49, 0x64, 0x20, 0x1c, 0xf0, 0x0f, 
-	0xff, 0xdf, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, 
-	0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44, 
-	0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x10, 0xfb, 0x18, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1f, 0xf0, 0x10, 0xf9, 0x90, 
-	0x2d, 0x00, 0xd0, 0x33, 0x2d, 0x01, 0xd1, 0x11, 
-	0x25, 0x00, 0xe0, 0x32, 0x4b, 0x57, 0x42, 0x9c, 
-	0xd0, 0x04, 0x33, 0x01, 0x42, 0x9c, 0xd1, 0xca, 
-	0x89, 0x3c, 0xe7, 0xc8, 0x2d, 0x00, 0xd0, 0x01, 
-	0x1c, 0x2c, 0xe7, 0xc4, 0x1c, 0x34, 0xe7, 0xc2, 
-	0x1c, 0x2c, 0xe7, 0xc0, 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, 0x0f, 0xff, 0xa6, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, 
-	0xf0, 0x10, 0xf9, 0x62, 0x21, 0x00, 0x20, 0x1f, 
-	0xf0, 0x10, 0xfe, 0x54, 0x20, 0x01, 0xf0, 0x13, 
-	0xfa, 0x43, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x13, 
-	0xfa, 0x3f, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, 
-	0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00, 
-	0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x13, 0xfb, 0x96, 
-	0x20, 0x1e, 0xf0, 0x10, 0xfb, 0x93, 0x23, 0x03, 
-	0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x10, 0xf9, 0x41, 0x82, 0x3e, 
-	0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02, 
-	0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00, 
-	0x90, 0x00, 0xf0, 0x23, 0xf8, 0x8d, 0x23, 0x01, 
-	0x04, 0x1b, 0x43, 0x18, 0xf0, 0x23, 0xf8, 0x8c, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x14, 0xf8, 0x74, 
-	0x20, 0xff, 0x49, 0x37, 0x68, 0x09, 0x70, 0x08, 
-	0x49, 0x36, 0x48, 0x37, 0x23, 0x1e, 0x22, 0x10, 
-	0xf0, 0x14, 0xf9, 0xa8, 0x48, 0x35, 0x68, 0x00, 
-	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
-	0xf0, 0x23, 0xf8, 0x72, 0x4b, 0x32, 0x40, 0x18, 
-	0xf0, 0x23, 0xf8, 0x72, 0x22, 0x00, 0xb4, 0x04, 
-	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 
-	0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31, 
-	0xf0, 0x0f, 0xff, 0x46, 0x23, 0x01, 0x02, 0x9b, 
-	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, 
-	0xf0, 0x10, 0xf9, 0x02, 0x21, 0x00, 0x20, 0x1e, 
-	0xf0, 0x10, 0xfd, 0xf4, 0x42, 0xac, 0xd0, 0x18, 
-	0x42, 0xb4, 0xd0, 0x16, 0x2c, 0x00, 0xd0, 0x14, 
-	0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 
-	0x20, 0x1c, 0xf0, 0x10, 0xf8, 0xf1, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c, 
-	0x1c, 0x21, 0xf0, 0x0f, 0xff, 0x25, 0xb0, 0x01, 
-	0xa0, 0x1a, 0x22, 0x47, 0x21, 0x01, 0xf0, 0x05, 
-	0xff, 0x39, 0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 
-	0x53, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, 0x00, 
-	0x56, 0x50, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, 
-	0x41, 0x50, 0x49, 0x44, 0x3a, 0x00, 0x00, 0x00, 
-	0x50, 0x43, 0x52, 0x50, 0x49, 0x44, 0x3a, 0x00, 
-	0x54, 0x58, 0x54, 0x50, 0x49, 0x44, 0x3a, 0x00, 
-	0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc, 
-	0x2f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x9b, 0x98, 0x2e, 0x08, 0x48, 0x10, 
-	0x2e, 0x08, 0x05, 0xb4, 0x2e, 0x08, 0x9b, 0xc4, 
-	0xff, 0xfe, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 
-	0xb5, 0x00, 0x22, 0x00, 0xb4, 0x04, 0x04, 0x01, 
-	0x0c, 0x09, 0x23, 0x00, 0x4a, 0x03, 0x1e, 0x50, 
-	0xf7, 0xff, 0xfe, 0x66, 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, 0x56, 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, 0x13, 0xfa, 0xcf, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x80, 0xf0, 0x13, 0xfa, 0xca, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0xff, 0x30, 0x01, 
-	0xf0, 0x13, 0xfa, 0xc4, 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, 0xf8, 0x9c, 
-	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, 0x3c, 0x20, 0x2e, 0x08, 0x49, 0xa8, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, 
-	0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x4b, 0x18, 
-	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, 0x3c, 0x20, 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, 0xfa, 0xf4, 
-	0x88, 0xa0, 0x23, 0x06, 0x40, 0x18, 0x28, 0x02, 
-	0xd1, 0x09, 0x88, 0xe0, 0x99, 0x00, 0x42, 0x88, 
-	0xd1, 0x05, 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0xe8, 
-	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, 0x48, 0x28, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x3c, 0x20, 0xb5, 0xf0, 0x26, 0xff, 
-	0xb0, 0x83, 0x49, 0x3b, 0x91, 0x01, 0x48, 0x3b, 
-	0x8e, 0x80, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x4f, 0x38, 
-	0xcf, 0x05, 0x3f, 0x08, 0x1a, 0x80, 0x60, 0xb8, 
-	0x1c, 0x01, 0xd5, 0x02, 0x1d, 0xc8, 0x30, 0xf9, 
-	0x60, 0xb8, 0x68, 0xb8, 0x28, 0x00, 0xd1, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0xd0, 0x49, 0x30, 0x5a, 0x0d, 0x18, 0x40, 
-	0x88, 0x44, 0x68, 0x40, 0x90, 0x00, 0x00, 0xa8, 
-	0x49, 0x2d, 0x58, 0x09, 0x91, 0x02, 0x29, 0x00, 
-	0xd0, 0x08, 0x49, 0x2c, 0x58, 0x0b, 0x99, 0x00, 
-	0x9e, 0x02, 0x1c, 0x28, 0x1c, 0x22, 0xf0, 0x1d, 
-	0xfa, 0xdb, 0x26, 0x00, 0x48, 0x28, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x09, 0x1c, 0x28, 0xf0, 0x0d, 
-	0xfa, 0xc3, 0x28, 0xff, 0xd1, 0x04, 0x98, 0x00, 
-	0x1c, 0x21, 0xf0, 0x0d, 0xfa, 0x3f, 0x26, 0x00, 
-	0x2e, 0x00, 0xd0, 0x29, 0x06, 0xed, 0x0e, 0xed, 
-	0x1c, 0xe0, 0x08, 0x82, 0x00, 0x92, 0x98, 0x00, 
-	0x99, 0x01, 0x6a, 0xfb, 0xf0, 0x1d, 0xfa, 0xba, 
-	0x00, 0x68, 0x19, 0x40, 0x00, 0x80, 0x49, 0x1b, 
-	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, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3c, 0x20, 
-	0x2e, 0x08, 0x4a, 0x98, 0x2e, 0x08, 0x4b, 0x18, 
-	0x2e, 0x08, 0x1a, 0x94, 0x2e, 0x08, 0x48, 0x28, 
-	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, 0x8f, 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, 0xb5, 0x90, 0x06, 0x04, 
-	0x0e, 0x24, 0x06, 0x0f, 0x0e, 0x3f, 0xb0, 0x88, 
-	0xf0, 0x04, 0xfa, 0x1e, 0x28, 0x00, 0xd0, 0x05, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x08, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xab, 0x00, 0x70, 0x1c, 
-	0x70, 0x5f, 0x46, 0x68, 0x21, 0x20, 0xf0, 0x0a, 
-	0xfa, 0x6f, 0xb0, 0x08, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb4, 0xf0, 0x04, 0x0a, 0x0c, 0x12, 
-	0x4b, 0x15, 0x8e, 0x9f, 0x2f, 0x00, 0xd0, 0x03, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 
-	0x07, 0xd7, 0x0f, 0xff, 0x04, 0x09, 0x0c, 0x09, 
-	0x08, 0x49, 0x2f, 0x00, 0xd0, 0x03, 0x31, 0x03, 
-	0x04, 0x09, 0x0c, 0x09, 0xe0, 0x02, 0x31, 0x02, 
-	0x04, 0x09, 0x0c, 0x09, 0x1c, 0x05, 0x4c, 0x0b, 
-	0x20, 0x00, 0x29, 0x00, 0xdd, 0x07, 0x00, 0x47, 
-	0x5b, 0xee, 0x53, 0xe6, 0x30, 0x01, 0x04, 0x00, 
-	0x0c, 0x00, 0x42, 0x88, 0xdb, 0xf7, 0x20, 0x05, 
-	0x85, 0x18, 0x85, 0x5a, 0x20, 0x01, 0x02, 0x40, 
-	0x86, 0x98, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x02, 0x00, 
-	0x04, 0x01, 0x0c, 0x09, 0x48, 0x0b, 0x6f, 0xc2, 
-	0x20, 0x00, 0x43, 0xc0, 0x2a, 0x00, 0xd1, 0x0f, 
-	0x4a, 0x09, 0x8e, 0xd3, 0x2b, 0x00, 0xd1, 0x0b, 
-	0x48, 0x08, 0x86, 0xc1, 0x23, 0x07, 0x86, 0x83, 
-	0x85, 0x93, 0x85, 0xd1, 0x20, 0x09, 0x02, 0x40, 
-	0x86, 0xd0, 0x20, 0x01, 0x87, 0x90, 0x20, 0x00, 
-	0x47, 0x70, 0x00, 0x00, 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, 0x1d, 0xf9, 0x98, 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, 0x1d, 
-	0xf9, 0x35, 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, 0xfd, 0xb6, 
-	0x6a, 0xb8, 0xf0, 0x04, 0xfd, 0xb3, 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, 0x0f, 0xfd, 0xc3, 0xb0, 0x02, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xc0, 
-	0x2e, 0x08, 0x03, 0xbc, 0x2e, 0x08, 0x45, 0x18, 
-	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, 0xfd, 0x91, 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, 0xcb, 0x04, 
-	0x2e, 0x02, 0xcb, 0x0c, 0x2e, 0x02, 0xcb, 0x08, 
-	0x2e, 0x02, 0xcb, 0x10, 0x2e, 0x02, 0xcb, 0x14, 
-	0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04, 
-	0xfd, 0x7d, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcb, 0x04, 
-	0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x33, 0x8e, 0x90, 
-	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x48, 0x30, 0x68, 0x01, 
-	0x4e, 0x30, 0x68, 0x30, 0x1a, 0x09, 0xd1, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x29, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, 
-	0x18, 0xc9, 0x23, 0x2f, 0x01, 0x1b, 0x42, 0x99, 
-	0xda, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x4a, 0x24, 0x8e, 0xd2, 0x2a, 0x00, 
-	0xd0, 0x06, 0x4b, 0x25, 0x42, 0x99, 0xda, 0x03, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1f, 0xcf, 0x3f, 0xff, 0x3f, 0x72, 0x4b, 0x21, 
-	0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 0x21, 0x2f, 
-	0x02, 0x89, 0x1a, 0x0c, 0x4d, 0x1e, 0x49, 0x1f, 
-	0x91, 0x01, 0x42, 0xa7, 0xdd, 0x14, 0x1b, 0x3a, 
-	0x92, 0x00, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, 
-	0x1c, 0x22, 0x49, 0x1b, 0x6b, 0x2b, 0xf0, 0x1d, 
-	0xf8, 0x45, 0x4b, 0x19, 0x18, 0xe1, 0x98, 0x01, 
-	0x9a, 0x00, 0x68, 0x00, 0x6b, 0x2b, 0xf0, 0x1d, 
-	0xf8, 0x3d, 0x9a, 0x00, 0x60, 0x32, 0xe0, 0x0e, 
-	0x99, 0x01, 0x68, 0x09, 0x18, 0x08, 0x1c, 0x3a, 
-	0x49, 0x11, 0x6b, 0x2b, 0xf0, 0x1d, 0xf8, 0x32, 
-	0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, 0x02, 0x80, 
-	0xf0, 0x1d, 0xf8, 0x36, 0x60, 0x31, 0x20, 0x12, 
-	0x4a, 0x04, 0x85, 0x10, 0x85, 0x57, 0x20, 0x01, 
-	0x02, 0x40, 0x86, 0x90, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x02, 0xcb, 0x0c, 0x2e, 0x02, 0xcb, 0x08, 
-	0x00, 0x00, 0x0a, 0x48, 0x00, 0x00, 0x0f, 0x6c, 
-	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x02, 0xcb, 0x04, 
-	0x2c, 0x00, 0x02, 0x00, 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, 0x1c, 0xff, 0xd0, 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, 0x1c, 0xff, 0xb8, 0x68, 0x36, 0xe0, 0x05, 
-	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, 
-	0xf0, 0x1c, 0xff, 0xb0, 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, 0x9b, 0xc8, 0x2e, 0x08, 0x00, 0x58, 
-	0x2e, 0x08, 0x9b, 0x30, 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, 0x9b, 0x30, 
-	0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00, 
-	0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, 
-	0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x44, 0x20, 0x48, 0x01, 0x68, 0x80, 
-	0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, 
-	0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00, 
-	0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x44, 0x20, 
-	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, 0x44, 0x20, 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, 0x22, 0xfa, 0x20, 
-	0x49, 0x25, 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0xe8, 
-	0xf0, 0x22, 0xf9, 0xde, 0x4b, 0x23, 0x40, 0x18, 
-	0xf0, 0x22, 0xf9, 0xde, 0xf0, 0x22, 0xfa, 0x4a, 
-	0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b, 
-	0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d, 
-	0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x14, 
-	0xfb, 0xa5, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, 
-	0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c, 
-	0x27, 0x00, 0x4d, 0x18, 0xf0, 0x14, 0xfc, 0x06, 
-	0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf, 
-	0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x14, 
-	0xfc, 0x07, 0xf0, 0x14, 0xfb, 0xfb, 0x28, 0x00, 
-	0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x14, 
-	0xfb, 0x89, 0xf0, 0x22, 0xf9, 0xe9, 0x21, 0x00, 
-	0x20, 0x0c, 0xf0, 0x22, 0xf9, 0xb1, 0xf0, 0x22, 
-	0xf9, 0xa7, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
-	0xf0, 0x22, 0xf9, 0xa6, 0xf0, 0x22, 0xfa, 0x12, 
-	0x46, 0x68, 0xf0, 0x14, 0xfb, 0xc3, 0x98, 0x04, 
-	0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x00, 0x15, 0xa5, 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, 0x22, 0xf9, 0xc4, 
-	0x49, 0x31, 0x20, 0x0c, 0xf0, 0x22, 0xf9, 0x8c, 
-	0xf0, 0x22, 0xf9, 0x82, 0x4b, 0x2f, 0x40, 0x18, 
-	0xf0, 0x22, 0xf9, 0x82, 0xf0, 0x22, 0xf9, 0xee, 
-	0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e, 
-	0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10, 
-	0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x14, 
-	0xfb, 0x49, 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, 0x14, 0xfb, 0xa2, 
-	0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac, 
-	0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, 
-	0xa9, 0x0a, 0xf0, 0x14, 0xfb, 0xa1, 0xe0, 0x03, 
-	0x20, 0x02, 0xa9, 0x07, 0xf0, 0x14, 0xfb, 0x9c, 
-	0xf0, 0x14, 0xfb, 0x90, 0x28, 0x00, 0xd1, 0xfb, 
-	0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x14, 
-	0xfb, 0x1d, 0xf0, 0x22, 0xf9, 0x7d, 0x21, 0x00, 
-	0x20, 0x0c, 0xf0, 0x22, 0xf9, 0x45, 0xf0, 0x22, 
-	0xf9, 0x3b, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
-	0xf0, 0x22, 0xf9, 0x3a, 0xf0, 0x22, 0xf9, 0xa6, 
-	0x46, 0x68, 0xf0, 0x14, 0xfb, 0x57, 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, 0xa5, 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, 0x03, 0xff, 0xca, 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, 0x44, 0x2c, 
-	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, 0x03, 0xff, 0x66, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x44, 0x2c, 
-	0x2e, 0x00, 0x17, 0x61, 0xb5, 0x80, 0x04, 0x01, 
-	0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88, 
-	0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01, 
-	0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, 
-	0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2, 
-	0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04, 
-	0xfa, 0x33, 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, 0x48, 0x28, 0xb5, 0x80, 0xb0, 0xb2, 
-	0x46, 0x68, 0xf0, 0x15, 0xf8, 0x99, 0xaf, 0x16, 
-	0xcf, 0x83, 0x9a, 0x19, 0xf0, 0x00, 0xf9, 0xd2, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfa, 0xed, 0xb0, 0x32, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, 
-	0xf0, 0x0f, 0xfd, 0x7a, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, 
-	0x0e, 0x09, 0x4b, 0x05, 0x68, 0x1b, 0x06, 0x1b, 
-	0x0e, 0x1b, 0x2b, 0x30, 0xd3, 0x01, 0xf0, 0x0f, 
-	0xfd, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xbc, 0xb5, 0xf0, 0x25, 0x00, 
-	0x4e, 0x1a, 0x4c, 0x1b, 0x4f, 0x1b, 0x68, 0x30, 
-	0x68, 0x00, 0x00, 0x40, 0x0a, 0x40, 0x02, 0x40, 
-	0x21, 0x19, 0x06, 0x89, 0x6a, 0x89, 0x4b, 0x18, 
-	0x40, 0x19, 0x0a, 0x49, 0x43, 0x08, 0x49, 0x17, 
-	0x64, 0x08, 0xf0, 0x01, 0xfc, 0x63, 0xf0, 0x02, 
-	0xf9, 0x3b, 0x68, 0x38, 0x30, 0x01, 0x60, 0x38, 
-	0x48, 0x13, 0x88, 0x01, 0x31, 0x01, 0x80, 0x01, 
-	0x20, 0x0c, 0x68, 0x21, 0xf0, 0x1c, 0xfc, 0x42, 
-	0x29, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xff, 0xae, 
-	0x20, 0x32, 0x68, 0x21, 0xf0, 0x1c, 0xfc, 0x3a, 
-	0x4b, 0x0c, 0x42, 0x98, 0xd9, 0x01, 0x49, 0x0c, 
-	0x60, 0xf9, 0x42, 0x85, 0xd0, 0xd3, 0x1c, 0x05, 
-	0xf0, 0x00, 0xfe, 0x40, 0x20, 0x00, 0x60, 0x38, 
-	0xe7, 0xcd, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xa4, 
-	0x2e, 0x08, 0x05, 0xbc, 0x2e, 0x08, 0x01, 0x88, 
-	0x00, 0x03, 0xfe, 0x00, 0x2c, 0x00, 0x1f, 0x80, 
-	0x2c, 0x00, 0x1f, 0xc8, 0x00, 0x00, 0x05, 0x46, 
-	0x2e, 0x00, 0x19, 0x65, 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, 0x0d, 0xfd, 0xda, 0x22, 0xff, 0x21, 0x64, 
-	0x20, 0x01, 0x32, 0xf5, 0xf0, 0x0d, 0xfe, 0x9c, 
-	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, 0x0e, 0xf8, 0xfa, 0x4e, 0x1e, 
-	0x4d, 0x1e, 0x4c, 0x1f, 0xf0, 0x03, 0xff, 0x6e, 
-	0xf0, 0x03, 0xff, 0x6c, 0x28, 0x28, 0xd9, 0x10, 
-	0x42, 0xb0, 0xd3, 0x0e, 0x69, 0xe9, 0x08, 0xc9, 
-	0xd3, 0x0b, 0x4b, 0x1a, 0x18, 0xc1, 0x20, 0x1e, 
-	0xf0, 0x1c, 0xfb, 0xe0, 0x21, 0x64, 0x1d, 0xc2, 
-	0x32, 0xff, 0x32, 0xee, 0x20, 0x01, 0xf0, 0x0d, 
-	0xfe, 0x6f, 0xf0, 0x01, 0xfb, 0xeb, 0xf0, 0x02, 
-	0xf8, 0xc3, 0xf0, 0x03, 0xff, 0x53, 0x1c, 0x01, 
-	0x20, 0x7d, 0x00, 0xc0, 0xf0, 0x1c, 0xfb, 0xce, 
-	0x1c, 0x01, 0x48, 0x0f, 0x88, 0x02, 0x32, 0x01, 
-	0x80, 0x02, 0x42, 0xb9, 0xd0, 0xd6, 0x2f, 0x04, 
-	0xd3, 0x06, 0x20, 0x01, 0xf0, 0x0d, 0xfd, 0x78, 
-	0xb0, 0x14, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0xcb, 0x20, 0x00, 
-	0x60, 0x20, 0xe7, 0xc7, 0x2e, 0x02, 0xcc, 0x74, 
-	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, 0x08, 0x81, 0x07, 0x48, 0x08, 0x49, 0x09, 
-	0x60, 0xc8, 0xf0, 0x03, 0xfd, 0x43, 0xf7, 0xff, 
-	0xff, 0x85, 0xf0, 0x00, 0xf8, 0xd3, 0xf7, 0xff, 
-	0xff, 0x39, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x00, 0x19, 0x53, 0x2e, 0x08, 0x01, 0x88, 
-	0x47, 0x70, 0xb5, 0xf0, 0x4d, 0x29, 0x68, 0x01, 
-	0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, 0x68, 0x41, 
-	0x10, 0x89, 0x68, 0x82, 0x10, 0x92, 0x00, 0x89, 
-	0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, 0x05, 0x89, 
-	0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, 0x49, 0x22, 
-	0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, 0x60, 0x0e, 
-	0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, 0xc8, 0x40, 
-	0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, 0xd3, 0xfa, 
-	0x23, 0x00, 0x49, 0x1c, 0x65, 0x8b, 0x20, 0x00, 
-	0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, 0x64, 0x8d, 
-	0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, 0x48, 0x18, 
-	0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, 0x60, 0x3b, 
-	0x22, 0x01, 0x64, 0xca, 0x21, 0x00, 0x4a, 0x15, 
-	0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, 0x33, 0x01, 
-	0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, 0x42, 0x91, 
-	0xdb, 0xf6, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, 
-	0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, 0x20, 0x33, 
-	0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, 0x65, 0x81, 
-	0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, 0x66, 0x41, 
-	0x21, 0x03, 0x67, 0x01, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x14, 0xfd, 0x62, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 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, 0x15, 0xf9, 0x9c, 0x48, 0x08, 0x21, 0x40, 
-	0xf0, 0x14, 0xfe, 0x6c, 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, 0x02, 0x3b, 0x04, 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, 0x15, 0xf9, 0xdb, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01, 
-	0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01, 
-	0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01, 
-	0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, 
-	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, 0x15, 0xf9, 0xb7, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3, 
-	0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x98, 0xb5, 0x80, 0x4b, 0x09, 
-	0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x15, 
-	0xfb, 0xeb, 0x20, 0x0b, 0xf0, 0x15, 0xfd, 0x0d, 
-	0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03, 
-	0xff, 0x2b, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc4, 
-	0x2e, 0x08, 0x01, 0xd4, 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, 0x0f, 0xff, 0xe4, 0x6a, 0xb8, 0x1c, 0x29, 
-	0xb0, 0x04, 0xf0, 0x11, 0xf9, 0x33, 0xe0, 0x04, 
-	0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x10, 
-	0xfa, 0xe9, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, 
-	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, 0x10, 0xfa, 0xcb, 0x71, 0x37, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x14, 0xfc, 0x5c, 
-	0x20, 0x00, 0xf0, 0x11, 0xff, 0x5d, 0x20, 0x1f, 
-	0xf0, 0x0e, 0xff, 0xf2, 0x26, 0x03, 0x02, 0x76, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, 
-	0x1c, 0x33, 0xf0, 0x0e, 0xfe, 0x69, 0x20, 0x1e, 
-	0xf0, 0x0f, 0xf8, 0xb0, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x0e, 
-	0xfe, 0x5f, 0x26, 0x1c, 0x1c, 0x39, 0x48, 0x3e, 
-	0x27, 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, 0x14, 0xfd, 0x5b, 0xab, 0x00, 
-	0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9e, 
-	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x15, 
-	0xf8, 0x7d, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, 
-	0xf0, 0x14, 0xfd, 0x4c, 0xab, 0x00, 0x70, 0x1c, 
-	0x70, 0x5c, 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x15, 0xf8, 0x6e, 
-	0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x14, 0xfd, 0x3e, 
-	0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58, 
-	0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x08, 0xf0, 0x15, 0xf8, 0x5f, 0xe0, 0x0d, 
-	0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x14, 0xfd, 0x2e, 
-	0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9f, 
-	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, 
-	0xf0, 0x15, 0xf8, 0x50, 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, 0x15, 0xf8, 0xa7, 0x48, 0x15, 
-	0xf0, 0x11, 0xfe, 0x68, 0x20, 0x00, 0xf0, 0x11, 
-	0xfe, 0xd9, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, 
-	0x20, 0x00, 0xf0, 0x03, 0xfb, 0x15, 0x20, 0x01, 
-	0xf0, 0x11, 0xfe, 0xde, 0x4a, 0x0e, 0xb4, 0x04, 
-	0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8, 
-	0xf7, 0xfe, 0xfb, 0xae, 0x21, 0x00, 0x20, 0x0d, 
-	0xb0, 0x01, 0xf0, 0x14, 0xfb, 0xcd, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xd4, 
-	0x2e, 0x02, 0x81, 0x70, 0x2e, 0x02, 0x3b, 0x04, 
-	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, 0x14, 0xfe, 0x9a, 0x69, 0x61, 0x1c, 0x28, 
-	0xb0, 0x01, 0xf0, 0x15, 0xff, 0x41, 0x62, 0x27, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, 
-	0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a, 
-	0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48, 
-	0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00, 
-	0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff, 
-	0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a, 
-	0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xe0, 
-	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, 0x14, 0xfe, 0x62, 0x69, 0x79, 0xb0, 0x01, 
-	0x48, 0x03, 0xf0, 0x15, 0xff, 0x09, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x98, 
-	0x2e, 0x08, 0x01, 0xb0, 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, 0x14, 0xfe, 0x48, 
-	0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x15, 
-	0xfe, 0xef, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, 
-	0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01, 
-	0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09, 
-	0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39, 
-	0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20, 
-	0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x44, 0x38, 
-	0x2e, 0x08, 0x44, 0xb8, 0x2e, 0x08, 0x44, 0xf8, 
-	0x2e, 0x08, 0x44, 0xd8, 0x06, 0x00, 0x0e, 0x00, 
-	0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05, 
-	0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00, 
-	0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03, 
-	0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe8, 
-	0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, 
-	0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38, 
-	0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x2a, 
-	0xfb, 0x93, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, 
-	0x31, 0x05, 0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x8c, 
-	0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09, 
-	0x20, 0x00, 0xf0, 0x2a, 0xfb, 0x85, 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, 0x16, 
-	0xfb, 0x01, 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, 0x9b, 0x78, 0x2e, 0x08, 0x01, 0xe8, 
-	0x2e, 0x08, 0x44, 0xd8, 0x2e, 0x08, 0x44, 0xf8, 
-	0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, 
-	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, 0x16, 
-	0xfa, 0x9d, 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, 0xe8, 0x2e, 0x08, 0x44, 0xd8, 
-	0x2e, 0x08, 0x44, 0xf8, 0x2e, 0x08, 0x9b, 0xc8, 
-	0x2e, 0x08, 0x44, 0x38, 0x2e, 0x08, 0x44, 0xb8, 
-	0xb4, 0xf0, 0x06, 0x02, 0x0e, 0x12, 0xb0, 0x82, 
-	0x92, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa0, 
-	0xb0, 0x81, 0x49, 0x31, 0x58, 0x09, 0x91, 0x00, 
-	0x29, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, 
-	0xbc, 0xf0, 0x47, 0x70, 0x49, 0x2d, 0x68, 0x09, 
-	0x18, 0x47, 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 
-	0x4a, 0x2b, 0x68, 0x12, 0x18, 0x89, 0x9a, 0x01, 
-	0x4d, 0x2a, 0x4b, 0x2b, 0x93, 0x02, 0x2a, 0x01, 
-	0xd0, 0x28, 0x2a, 0x02, 0xd1, 0x44, 0x4b, 0x29, 
-	0x58, 0x1a, 0x2a, 0x00, 0xd1, 0x03, 0x20, 0xff, 
-	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4a, 
-	0x22, 0x00, 0x50, 0x1a, 0x5c, 0xa8, 0x42, 0xa0, 
-	0xd1, 0x06, 0x00, 0x90, 0x9b, 0x02, 0x58, 0x18, 
-	0x78, 0x46, 0x23, 0x80, 0x43, 0x9e, 0x70, 0x46, 
-	0x1c, 0x50, 0x06, 0x02, 0x0e, 0x12, 0x2a, 0x20, 
-	0xdb, 0xf0, 0x88, 0x08, 0x4b, 0x1c, 0x40, 0x18, 
-	0x80, 0x08, 0x98, 0x00, 0x9a, 0x01, 0x70, 0xc2, 
-	0x68, 0x38, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
-	0x60, 0x38, 0xe0, 0x19, 0x68, 0x38, 0x4b, 0x17, 
-	0x40, 0x18, 0x60, 0x38, 0x98, 0x00, 0x9a, 0x01, 
-	0x70, 0xc2, 0x20, 0x00, 0x60, 0x88, 0x70, 0xc8, 
-	0x60, 0xc8, 0x5c, 0x29, 0x42, 0xa1, 0xd1, 0x06, 
-	0x00, 0x81, 0x9b, 0x02, 0x58, 0x59, 0x78, 0x4a, 
-	0x23, 0x80, 0x43, 0x1a, 0x70, 0x4a, 0x30, 0x01, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf0, 
-	0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 
-	0x20, 0xbc, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 
-	0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x38, 
-	0x2e, 0x08, 0x9b, 0x30, 0x2e, 0x08, 0x9d, 0x10, 
-	0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x44, 0x38, 
-	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, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, 
-	0x2e, 0x08, 0x44, 0x38, 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, 0x13, 0xfa, 0xb6, 0x28, 0x00, 0xd1, 0x00, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x38, 
-	0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x9b, 0x40, 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, 0x13, 
-	0xfa, 0xc0, 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, 0x9d, 0xfc, 0x9e, 0x00, 0x04, 0x90, 
-	0x2e, 0x08, 0xa6, 0xfc, 0x9e, 0x00, 0x04, 0x98, 
-	0x2e, 0x08, 0x9d, 0x30, 0x2e, 0x08, 0x9c, 0xd0, 
-	0x2e, 0x08, 0x9d, 0x10, 0x2e, 0x08, 0x9c, 0x50, 
-	0x2e, 0x08, 0x9b, 0xc8, 0xb5, 0x00, 0x20, 0xff, 
-	0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00, 
-	0xf0, 0x21, 0xf9, 0x74, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xe8, 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, 0x21, 0xf9, 0x70, 
-	0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30, 
-	0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x21, 
-	0xf9, 0x5a, 0xf0, 0x21, 0xf9, 0x5d, 0x43, 0xa8, 
-	0xf0, 0x21, 0xf9, 0x5e, 0xf0, 0x21, 0xf9, 0x58, 
-	0x43, 0xa0, 0xf0, 0x21, 0xf9, 0x59, 0x1c, 0x38, 
-	0xf0, 0x15, 0xfc, 0x02, 0x1c, 0x04, 0xd1, 0x07, 
-	0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a, 
-	0x1c, 0x33, 0xf0, 0x16, 0xfa, 0xb3, 0x1c, 0x04, 
-	0xf7, 0xff, 0xfc, 0x92, 0x1c, 0x20, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2c, 0x0b, 
-	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, 0x21, 
-	0xf8, 0xbf, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, 
-	0x90, 0x00, 0xf0, 0x21, 0xf8, 0xb9, 0x23, 0x01, 
-	0x05, 0x1b, 0x43, 0x18, 0xf0, 0x21, 0xf8, 0xb8, 
-	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, 0x15, 0xff, 0x60, 0x1c, 0x06, 0xe0, 0x0d, 
-	0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01, 
-	0x20, 0xc8, 0xf0, 0x15, 0xff, 0x57, 0x1c, 0x06, 
-	0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x15, 
-	0xff, 0x51, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, 
-	0xf9, 0x57, 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, 0x48, 
-	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, 0x15, 0xff, 0xaf, 0xb0, 0x01, 
-	0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b, 
-	0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20, 
-	0xf0, 0x0e, 0xf8, 0xf2, 0x22, 0x00, 0xb4, 0x04, 
-	0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20, 
-	0xf0, 0x0d, 0xff, 0x26, 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, 0x15, 0xfe, 0xff, 0x1c, 0x07, 
-	0x00, 0x80, 0xf0, 0x03, 0xf9, 0x05, 0x99, 0x07, 
-	0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05, 
-	0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x15, 0xff, 0x13, 
-	0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00, 
-	0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06, 
-	0x20, 0x5c, 0xf0, 0x03, 0xf8, 0xf1, 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, 0x12, 0xf9, 0x93, 0x1c, 0x07, 
-	0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29, 
-	0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0xf0, 0x20, 0xff, 0xf1, 0x4b, 0x0c, 
-	0x40, 0x18, 0xf0, 0x20, 0xff, 0xf1, 0x1c, 0x38, 
-	0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xf0, 
-	0x2e, 0x08, 0x01, 0xf4, 0x2e, 0x08, 0x02, 0x74, 
-	0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x44, 0xf8, 
-	0x2e, 0x08, 0x44, 0xd8, 0x2e, 0x08, 0x02, 0xf4, 
-	0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07, 
-	0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, 
-	0xf0, 0x20, 0xff, 0xce, 0x0d, 0x40, 0xd2, 0x09, 
-	0x20, 0xff, 0x90, 0x00, 0xf0, 0x20, 0xff, 0xc8, 
-	0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x20, 
-	0xff, 0xc7, 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, 0x12, 
-	0xf9, 0xad, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, 
-	0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0x96, 
-	0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01, 
-	0xf0, 0x03, 0xf8, 0x90, 0x59, 0xa8, 0xf0, 0x03, 
-	0xf8, 0x8d, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, 
-	0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00, 
-	0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x15, 0xfc, 0xd2, 
-	0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80, 
-	0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25, 
-	0xf0, 0x15, 0xfe, 0x6d, 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, 0x0d, 0xfe, 0x54, 
-	0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01, 
-	0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a, 
-	0x1c, 0x33, 0x48, 0x18, 0xf0, 0x15, 0xfe, 0xbe, 
-	0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6, 
-	0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfa, 0xc5, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, 
-	0xf8, 0x51, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, 
-	0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03, 
-	0xf8, 0x49, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, 
-	0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x05, 0xf0, 0x20, 0xff, 0x45, 0x4b, 0x0b, 
-	0x40, 0x18, 0xf0, 0x20, 0xff, 0x45, 0x1c, 0x20, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x01, 0xf4, 
-	0x2e, 0x08, 0x9b, 0xc8, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x44, 0xf8, 0x2e, 0x08, 0x44, 0xd8, 
-	0x2e, 0x08, 0x02, 0x74, 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, 0x12, 0xfd, 0x6f, 0xab, 0x00, 
-	0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68, 
-	0x21, 0x00, 0xf0, 0x12, 0xfd, 0x8e, 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, 0xd4, 
-	0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13, 
-	0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x12, 
-	0xfd, 0x70, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, 
-	0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x01, 0xf4, 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, 0x12, 
-	0xfb, 0xf5, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06, 
-	0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x12, 
-	0xff, 0xbc, 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, 0x16, 0xfa, 0x0b, 0x78, 0xb8, 
-	0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38, 
-	0xa9, 0x01, 0xf0, 0x16, 0xfa, 0x38, 0xe0, 0x08, 
-	0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x16, 
-	0xfa, 0x75, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, 
-	0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, 
-	0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0xf8, 
-	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39, 
-	0xf0, 0x12, 0xfe, 0x2e, 0x28, 0x00, 0xd1, 0x09, 
-	0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 
-	0xff, 0x47, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
-	0xff, 0x39, 0xe0, 0x01, 0xf7, 0xfd, 0xff, 0x36, 
-	0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06, 
-	0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x12, 
-	0xfc, 0x97, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x5c, 
-	0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08, 
-	0xf0, 0x12, 0xfb, 0x98, 0x22, 0x05, 0x21, 0x16, 
-	0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x6a, 0x2c, 0xb2, 
-	0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x12, 
-	0xfb, 0x47, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06, 
-	0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x12, 
-	0xff, 0x54, 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, 0x16, 0xf9, 0xa2, 
-	0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 
-	0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x16, 0xf9, 0xcf, 
-	0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 
-	0xf0, 0x16, 0xfa, 0x0c, 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, 0x16, 
-	0xfb, 0x69, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, 
-	0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80, 
-	0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x16, 0xfc, 0x70, 
-	0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfe, 0x7c, 
-	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39, 
-	0xf0, 0x12, 0xfd, 0xb2, 0x28, 0x00, 0xd1, 0x09, 
-	0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd, 
-	0xfe, 0xcb, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
-	0xfe, 0xbd, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0xba, 
-	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06, 
-	0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00, 
-	0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x12, 0xfc, 0x18, 
-	0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 
-	0xf0, 0x12, 0xfa, 0xda, 0xf7, 0xff, 0xf9, 0x5c, 
-	0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88, 
-	0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
-	0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89, 
-	0xf7, 0xff, 0xf9, 0xca, 0xb0, 0x2d, 0xbc, 0xf0, 
-	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, 0x20, 0xfd, 0xa3, 
-	0xf0, 0x20, 0xfd, 0xa6, 0x4b, 0x1b, 0x40, 0x18, 
-	0xf0, 0x20, 0xfd, 0xa6, 0x49, 0x1a, 0x20, 0x0a, 
-	0xf0, 0x20, 0xfd, 0xa6, 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, 0xbc, 
-	0x2e, 0x08, 0x4a, 0x60, 0x2e, 0x08, 0x4a, 0x20, 
-	0x2e, 0x08, 0x46, 0x98, 0xff, 0xff, 0xfb, 0xff, 
-	0x2e, 0x00, 0x30, 0x45, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x45, 0x18, 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, 0x03, 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, 0xc7, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, 
-	0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02, 
-	0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xde, 
-	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, 0x1b, 0xf9, 0x30, 0x1d, 0xfc, 0x34, 0x19, 
-	0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x0d, 
-	0xfd, 0x63, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, 
-	0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x0d, 
-	0xfb, 0x97, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, 
-	0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, 
-	0x6a, 0xbb, 0xf0, 0x0d, 0xfd, 0xdf, 0x1c, 0x30, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x45, 0x18, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x46, 0x98, 
-	0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x0e, 
-	0xfb, 0x73, 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, 0x45, 0x18, 0x2e, 0x08, 0x46, 0x98, 
-	0x2e, 0x08, 0x03, 0xbc, 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, 0x0d, 0xfd, 0xab, 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, 0xfc, 0xff, 0x6a, 0xb8, 
-	0xf0, 0x02, 0xfc, 0xfc, 0x4f, 0x12, 0x00, 0x68, 
-	0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12, 
-	0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11, 
-	0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x02, 0xff, 0xfa, 
-	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, 0x45, 0x18, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0xe0, 
-	0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x4a, 0x20, 
-	0x2e, 0x08, 0x03, 0xbc, 0xb5, 0x80, 0x1c, 0x07, 
-	0x30, 0x28, 0xf0, 0x02, 0xfc, 0xa5, 0x49, 0x07, 
-	0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0, 
-	0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f, 
-	0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, 
-	0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
-	0x30, 0x28, 0xf0, 0x02, 0xfc, 0x8d, 0x49, 0x06, 
-	0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0, 
-	0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc4, 0xb4, 0x80, 0x04, 0x09, 
-	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, 0x27, 
-	0x8f, 0x40, 0x28, 0x00, 0xd1, 0x47, 0x4f, 0x26, 
-	0x88, 0x38, 0x12, 0x00, 0x4a, 0x25, 0x28, 0x06, 
-	0xd0, 0x21, 0xdc, 0x08, 0x28, 0x06, 0xd2, 0x36, 
-	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x3a, 0x09, 0x09, 0x15, 0x32, 0x09, 0x28, 0x0a, 
-	0xd0, 0x1b, 0xdc, 0x08, 0x28, 0x07, 0xd0, 0x15, 
-	0x28, 0x09, 0xd1, 0x28, 0x88, 0x79, 0x88, 0x38, 
-	0xf0, 0x00, 0xf8, 0xd4, 0xe0, 0x27, 0x28, 0x0b, 
-	0xd0, 0x1c, 0x28, 0x80, 0xd1, 0x1f, 0xf0, 0x00, 
-	0xf9, 0x25, 0xe0, 0x20, 0x88, 0x79, 0x88, 0x38, 
-	0xf0, 0x00, 0xf8, 0x2c, 0xe0, 0x1b, 0xf0, 0x00, 
-	0xf9, 0x75, 0xe0, 0x18, 0xf0, 0x00, 0xf9, 0xe0, 
-	0xe0, 0x15, 0x88, 0x38, 0xb0, 0x84, 0xab, 0x00, 
-	0x80, 0x18, 0x88, 0x78, 0x70, 0x98, 0x92, 0x01, 
-	0x46, 0x69, 0x20, 0x75, 0xf0, 0x08, 0xf8, 0x04, 
-	0xb0, 0x04, 0xe0, 0x08, 0x88, 0x79, 0x88, 0x38, 
-	0xf0, 0x00, 0xfc, 0x50, 0xe0, 0x03, 0x48, 0x08, 
-	0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00, 
-	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x04, 0x04, 0xb5, 0xf0, 0x04, 0x04, 
-	0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, 
-	0xf0, 0x20, 0xfb, 0x5e, 0x2d, 0x10, 0xdd, 0x03, 
-	0x20, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01, 
-	0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02, 
-	0x48, 0x1b, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46, 
-	0x4b, 0x1a, 0x42, 0xb5, 0xdd, 0x08, 0x88, 0x19, 
-	0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01, 
-	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, 0x20, 0xfb, 0x53, 0x20, 0x00, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x03, 0xc4, 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, 0xc4, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb5, 0xb0, 0x04, 0x04, 
-	0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, 
-	0xf0, 0x20, 0xfa, 0xc2, 0x1c, 0x20, 0x1c, 0x29, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xa9, 0x1c, 0x07, 
-	0xf0, 0x20, 0xfa, 0xf0, 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, 0xc4, 
-	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, 0x10, 0xfd, 0x0f, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 0x88, 0x82, 
-	0x88, 0x41, 0x88, 0x00, 0xf0, 0x13, 0xfb, 0xee, 
-	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, 0x13, 0xf8, 0x92, 0x68, 0x38, 0x88, 0x41, 
-	0x29, 0x0e, 0xd1, 0x08, 0x88, 0x81, 0x04, 0x09, 
-	0x88, 0xc0, 0x43, 0x08, 0xf0, 0x10, 0xfb, 0x8c, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 
-	0xf0, 0x10, 0xfb, 0x86, 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, 0xb7, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2c, 0x00, 0x00, 0xfc, 0x2e, 0x08, 0x03, 0xc4, 
-	0x2e, 0x08, 0x04, 0xf8, 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, 0x8d, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x03, 0xf7, 0xfe, 
-	0xf8, 0x9f, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x02, 0xf7, 0xfe, 0xf8, 0x99, 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, 0x4c, 
-	0x68, 0x39, 0x88, 0x4a, 0x1d, 0x08, 0x88, 0x09, 
-	0xf7, 0xfe, 0xf9, 0x10, 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, 0xc4, 
-	0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, 
-	0xb5, 0x90, 0xb0, 0x84, 0x48, 0x73, 0x88, 0x00, 
-	0x06, 0x00, 0x0e, 0x00, 0x4c, 0x72, 0x4f, 0x73, 
-	0x28, 0x0a, 0xd2, 0x60, 0xa3, 0x01, 0x5c, 0x1b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x04, 0x0e, 0x16, 0x39, 
-	0x5d, 0x85, 0x8f, 0xb6, 0xbe, 0xcc, 0xf0, 0x10, 
-	0xfe, 0xc7, 0x90, 0x03, 0x14, 0x00, 0x68, 0x39, 
-	0x80, 0x08, 0x98, 0x03, 0x68, 0x39, 0x80, 0x48, 
-	0xe0, 0xc7, 0x20, 0x1e, 0xa9, 0x03, 0xf0, 0x10, 
-	0xfd, 0xc9, 0x98, 0x03, 0x68, 0x39, 0x80, 0x08, 
-	0xe0, 0xbf, 0x1c, 0x20, 0xf0, 0x13, 0xf9, 0xc0, 
-	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, 0x9c, 
-	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, 0x79, 0xe0, 0x73, 
-	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, 0x50, 
-	0x22, 0x00, 0x21, 0x00, 0x20, 0x01, 0x02, 0xc0, 
-	0xf7, 0xff, 0xfe, 0x48, 0x6f, 0xb8, 0x49, 0x2a, 
-	0x80, 0x08, 0xe0, 0x46, 0x46, 0x68, 0xf0, 0x15, 
-	0xff, 0xa7, 0x98, 0x00, 0x0c, 0x00, 0x68, 0x39, 
-	0x80, 0x08, 0x98, 0x00, 0x68, 0x39, 0x80, 0x48, 
-	0x98, 0x01, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x88, 
-	0x98, 0x01, 0x68, 0x39, 0x80, 0xc8, 0x98, 0x02, 
-	0x0c, 0x00, 0x68, 0x39, 0x81, 0x08, 0x98, 0x02, 
-	0x68, 0x39, 0x81, 0x48, 0x20, 0x01, 0x68, 0x39, 
-	0x81, 0x88, 0x48, 0x1c, 0x68, 0x39, 0x81, 0xc8, 
-	0x48, 0x1b, 0x68, 0x01, 0x14, 0x09, 0x68, 0x3a, 
-	0x82, 0x11, 0x68, 0x00, 0x68, 0x39, 0x82, 0x48, 
-	0xe0, 0x1f, 0x20, 0x19, 0x06, 0x80, 0x6b, 0x80, 
-	0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, 0x80, 0x08, 
-	0xe0, 0x17, 0x68, 0x38, 0x88, 0x01, 0x04, 0x09, 
-	0x88, 0x40, 0x18, 0x08, 0x68, 0x00, 0x90, 0x03, 
-	0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x03, 
-	0x68, 0x39, 0x80, 0x48, 0xe0, 0x09, 0x48, 0x0d, 
-	0x68, 0x00, 0x68, 0x39, 0x80, 0x08, 0xe0, 0x04, 
-	0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 
-	0x86, 0x81, 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, 
-	0x2e, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x03, 0xc4, 
-	0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x25, 0x02, 
-	0x2e, 0x08, 0x05, 0x74, 0x2e, 0x08, 0x00, 0x58, 
-	0xb5, 0x80, 0x4f, 0x53, 0x6d, 0x78, 0x6d, 0x39, 
-	0x42, 0x81, 0xd0, 0x59, 0x88, 0x81, 0x06, 0x09, 
-	0x0e, 0x09, 0x29, 0x12, 0xd2, 0x55, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x09, 0x10, 0x1a, 0x14, 0x20, 0x52, 0x24, 0x2f, 
-	0x3a, 0x45, 0x56, 0x60, 0x67, 0x6c, 0x70, 0x74, 
-	0x7a, 0x81, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, 
-	0x89, 0x00, 0xf0, 0x0b, 0xfe, 0x91, 0xe0, 0x72, 
-	0x89, 0x00, 0xf0, 0x0b, 0xfe, 0x75, 0xe0, 0x6e, 
-	0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0b, 
-	0xff, 0x4f, 0xe0, 0x68, 0x89, 0x82, 0x89, 0x41, 
-	0x89, 0x00, 0xf0, 0x0b, 0xfe, 0xf7, 0xe0, 0x62, 
-	0x89, 0x00, 0xf0, 0x0b, 0xff, 0x8d, 0xe0, 0x5e, 
-	0x8a, 0x42, 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, 
-	0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 
-	0xf8, 0x11, 0xb0, 0x02, 0xe0, 0x53, 0x8a, 0x42, 
-	0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, 0x89, 0x82, 
-	0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 0xf8, 0x58, 
-	0xb0, 0x02, 0xe0, 0x48, 0x89, 0x83, 0x89, 0x42, 
-	0x89, 0x00, 0x49, 0x2e, 0xf0, 0x0c, 0xf9, 0x99, 
-	0x21, 0x00, 0x48, 0x2c, 0xf7, 0xff, 0xfc, 0x7e, 
-	0xe0, 0x3d, 0x89, 0xc1, 0x04, 0x0b, 0x14, 0x1b, 
-	0x89, 0x81, 0x04, 0x0a, 0x14, 0x12, 0x89, 0x41, 
-	0x89, 0x00, 0xf0, 0x0c, 0xf9, 0xb9, 0xe0, 0x32, 
-	0xe0, 0x43, 0xe0, 0x30, 0x89, 0x00, 0xf0, 0x0b, 
-	0xff, 0x6b, 0xe0, 0x2c, 0x89, 0xc1, 0x04, 0x09, 
-	0x8a, 0x02, 0x18, 0x8b, 0x89, 0x82, 0x89, 0x41, 
-	0x89, 0x00, 0xf0, 0x0c, 0xf9, 0xf1, 0xe0, 0x22, 
-	0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 
-	0xf0, 0x0c, 0xfa, 0x1c, 0xe0, 0x1b, 0x89, 0x41, 
-	0x89, 0x00, 0xf0, 0x0b, 0xff, 0x8d, 0xe0, 0x16, 
-	0x89, 0x00, 0xf0, 0x0b, 0xff, 0xa7, 0xe0, 0x12, 
-	0x89, 0x00, 0xf0, 0x0b, 0xff, 0xb7, 0xe0, 0x0e, 
-	0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 
-	0xfa, 0x9b, 0xe0, 0x08, 0x89, 0xc3, 0x89, 0x82, 
-	0x89, 0x41, 0x89, 0x00, 0xf0, 0x0c, 0xfb, 0x34, 
-	0xe0, 0x01, 0xf0, 0x0c, 0xfb, 0xcb, 0x6d, 0x78, 
-	0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, 0x64, 0x38, 
-	0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x05, 
-	0x48, 0x07, 0x88, 0x01, 0x23, 0x10, 0x43, 0xdb, 
-	0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, 0x68, 0x00, 
-	0x65, 0x78, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x03, 0xc4, 0x2c, 0x00, 0x01, 0x20, 
-	0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, 
-	0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, 0x89, 0xd7, 
-	0x23, 0xc7, 0x40, 0x7b, 0x81, 0xd3, 0x4b, 0x06, 
-	0x6f, 0xdf, 0x37, 0x01, 0x67, 0xdf, 0x2f, 0x28, 
-	0xda, 0x03, 0x4b, 0x04, 0x68, 0x1b, 0xf0, 0x1a, 
-	0xfb, 0xf5, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x03, 0xc4, 0x2e, 0x08, 0x01, 0x94, 
-	0xb5, 0x90, 0x4f, 0x5d, 0x6e, 0xf8, 0x6e, 0xb9, 
-	0x42, 0x81, 0xd0, 0x5c, 0x88, 0x81, 0x0a, 0x0a, 
-	0x2a, 0x0a, 0xd2, 0x59, 0xa3, 0x01, 0x5c, 0x9b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x99, 0x04, 0x3e, 0x99, 
-	0x99, 0x44, 0x99, 0x99, 0x6c, 0x72, 0x06, 0x09, 
-	0x0e, 0x09, 0x24, 0x00, 0x29, 0x0c, 0xd2, 0x4b, 
-	0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x1e, 0x0a, 0x14, 0x2b, 0x8b, 0x8b, 0x8b, 0x8b, 
-	0x8b, 0x28, 0x8b, 0x05, 0x68, 0x38, 0x88, 0x00, 
-	0xf0, 0x03, 0xf8, 0xde, 0xe0, 0x80, 0x22, 0x00, 
-	0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23, 0x4a, 0x49, 
-	0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0xe9, 0xb0, 0x01, 
-	0xe0, 0x76, 0x22, 0x00, 0xb4, 0x04, 0x89, 0x02, 
-	0x1c, 0x23, 0x49, 0x44, 0x1e, 0x48, 0xf7, 0xfc, 
-	0xfd, 0xdf, 0xb0, 0x01, 0xe0, 0x6c, 0x8a, 0x02, 
-	0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, 
-	0x89, 0x00, 0xf7, 0xfc, 0xfd, 0xd5, 0xb0, 0x01, 
-	0xe0, 0x62, 0xf7, 0xfc, 0xfd, 0x9d, 0xe0, 0x5f, 
-	0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0xea, 
-	0xe0, 0x5a, 0x06, 0x09, 0xd1, 0x58, 0x89, 0x00, 
-	0xf7, 0xfc, 0xff, 0x76, 0xe0, 0x54, 0x06, 0x09, 
-	0x0e, 0x09, 0x29, 0x06, 0xd2, 0x0c, 0xa3, 0x02, 
-	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x03, 0x09, 0x0d, 0x11, 0x15, 0x19, 0x89, 0x00, 
-	0xf7, 0xfe, 0xf8, 0xaa, 0xe0, 0x44, 0xe0, 0x54, 
-	0xe0, 0x42, 0x89, 0x00, 0xf7, 0xfe, 0xf8, 0xca, 
-	0xe0, 0x3e, 0x89, 0x00, 0xf7, 0xfe, 0xf9, 0x58, 
-	0xe0, 0x3a, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x3c, 
-	0xe0, 0x36, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x6e, 
-	0xe0, 0x32, 0x89, 0x00, 0x06, 0x00, 0x0e, 0x00, 
-	0xf7, 0xfe, 0xfa, 0x4a, 0xe0, 0x2c, 0x06, 0x08, 
-	0xd1, 0x2a, 0x6f, 0xb8, 0x30, 0x01, 0x67, 0xb8, 
-	0xe0, 0x26, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, 
-	0xd2, 0x22, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x0c, 0x08, 0x0f, 
-	0x12, 0x16, 0x19, 0x1c, 0x89, 0x00, 0xf0, 0x01, 
-	0xf9, 0x93, 0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, 
-	0xf9, 0xbb, 0xe0, 0x11, 0xf0, 0x01, 0xfa, 0x06, 
-	0xe0, 0x0e, 0xf0, 0x01, 0xfa, 0x5d, 0xe0, 0x0b, 
-	0x89, 0x00, 0xf0, 0x01, 0xfa, 0xe1, 0xe0, 0x07, 
-	0xf0, 0x01, 0xfb, 0x1a, 0xe0, 0x04, 0xf0, 0x01, 
-	0xfb, 0x33, 0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x90, 
-	0x6e, 0xf8, 0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, 
-	0x65, 0xb8, 0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, 
-	0xdb, 0x04, 0x48, 0x07, 0x88, 0x01, 0x08, 0x49, 
-	0x00, 0x49, 0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, 
-	0x66, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x03, 0xc4, 0x00, 0x00, 0xff, 0xff, 
-	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, 0x5d, 0x80, 0x78, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x5e, 
-	0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a, 
-	0xf0, 0x02, 0xf8, 0xce, 0x49, 0x01, 0x68, 0x09, 
-	0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc4, 
-	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, 0x44, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, 
-	0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x91, 0xf7, 0xfd, 
-	0xf9, 0x53, 0xf7, 0xfc, 0xff, 0xd7, 0xf7, 0xfd, 
-	0xfa, 0x53, 0xf0, 0x03, 0xf8, 0xb1, 0xf7, 0xff, 
-	0xff, 0xcf, 0x48, 0x16, 0x8e, 0x80, 0x28, 0x00, 
-	0xd1, 0x21, 0x48, 0x15, 0x6f, 0xc0, 0x28, 0x00, 
-	0xd1, 0x13, 0x48, 0x14, 0x78, 0x00, 0x28, 0x00, 
-	0xd0, 0x0f, 0xb0, 0x82, 0x46, 0x69, 0xa8, 0x01, 
-	0xf0, 0x01, 0xfa, 0xd8, 0xa8, 0x01, 0x78, 0x00, 
-	0x28, 0x32, 0xda, 0x05, 0xa8, 0x00, 0x78, 0x00, 
-	0x28, 0x32, 0xda, 0x01, 0xf0, 0x07, 0xf9, 0xb0, 
-	0xb0, 0x02, 0x48, 0x0b, 0x69, 0xc0, 0x08, 0xc0, 
-	0xd3, 0x07, 0x48, 0x0a, 0x6c, 0x00, 0x28, 0x00, 
-	0xd0, 0x03, 0xf7, 0xff, 0xfd, 0xfd, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xff, 0xfe, 0xc1, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x1a, 0x94, 
-	0x72, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x03, 0xc4, 
-	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, 0x9b, 0xa4, 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, 0x9b, 0xa4, 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, 0x10, 
-	0xfd, 0x47, 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, 0x10, 
-	0xfd, 0x23, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc8, 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, 0x10, 0xf8, 0xc4, 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, 0x48, 
-	0x2e, 0x08, 0x04, 0xc8, 0x6c, 0x00, 0x00, 0x20, 
-	0xb5, 0x00, 0x20, 0x03, 0xf0, 0x10, 0xf8, 0xae, 
-	0x20, 0x1e, 0xf0, 0x0d, 0xf8, 0xab, 0x23, 0x03, 
-	0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x0c, 0xfe, 0x59, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x02, 0x22, 0x02, 0x49, 0x07, 
-	0x20, 0x1e, 0xf0, 0x0c, 0xfc, 0x8d, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 
-	0xb0, 0x01, 0xf0, 0x0c, 0xfe, 0x49, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0x00, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x12, 
-	0xfc, 0x23, 0x20, 0x1f, 0xf0, 0x0c, 0xff, 0xbc, 
-	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
-	0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0c, 0xfe, 0x34, 
-	0x20, 0x00, 0xf0, 0x0f, 0xff, 0x19, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x01, 0x22, 0x02, 0x49, 0x07, 
-	0x20, 0x1f, 0xf0, 0x0c, 0xfc, 0x65, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 
-	0xb0, 0x01, 0xf0, 0x0c, 0xfe, 0x21, 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, 0x42, 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, 0x48, 0x66, 0x00, 0x00, 0x80, 
-	0xb5, 0x80, 0x4f, 0x05, 0x69, 0x38, 0x28, 0x00, 
-	0xd0, 0x03, 0xf0, 0x01, 0xfe, 0x4b, 0x20, 0x00, 
-	0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0xc8, 0xb5, 0x00, 0x4a, 0x0d, 
-	0xb4, 0x04, 0x1f, 0x10, 0x1e, 0x51, 0x1c, 0x13, 
-	0xf7, 0xfc, 0xfb, 0xaa, 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, 0x48, 0xb5, 0x00, 0x4a, 0x10, 
-	0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0f, 
-	0x1e, 0xc8, 0xf7, 0xfc, 0xfb, 0x89, 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, 0x48, 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, 0xf6, 0x48, 0x0f, 0xf7, 0xfc, 
-	0xfc, 0xf3, 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, 0xb1, 0x61, 0x78, 
-	0x69, 0x78, 0x28, 0x00, 0xd0, 0x01, 0x76, 0x3e, 
-	0x70, 0x3d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0x00, 0x20, 0x00, 0xf7, 0xfd, 0xff, 0xdc, 
-	0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x06, 
-	0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfb, 0x28, 
-	0x21, 0x00, 0x20, 0x0d, 0xb0, 0x01, 0xf0, 0x12, 
-	0xfb, 0x47, 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, 0xfb, 0x14, 
-	0x22, 0x00, 0xb0, 0x01, 0xb4, 0x04, 0x1c, 0x3b, 
-	0x4a, 0x12, 0x49, 0x13, 0x20, 0x00, 0xf7, 0xfc, 
-	0xfb, 0x0b, 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, 0x12, 0xfb, 0x11, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x00, 0x1f, 0xfe, 0x2e, 0x08, 0x04, 0x48, 
-	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, 0x79, 0x22, 0x00, 
-	0xb4, 0x04, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00, 
-	0xf7, 0xfc, 0xfa, 0xc6, 0x22, 0x01, 0x21, 0x01, 
-	0x20, 0x00, 0xb0, 0x01, 0xf0, 0x10, 0xfb, 0x84, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x10, 0xfc, 0x44, 
-	0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x1d, 
-	0x20, 0x00, 0x1e, 0x51, 0xf7, 0xfc, 0xfa, 0xb4, 
-	0x20, 0x01, 0x63, 0x60, 0x69, 0x60, 0xb0, 0x01, 
-	0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, 
-	0xf0, 0x01, 0xfd, 0x1a, 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, 0x12, 0xfa, 0xb2, 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, 0x48, 0x00, 0x00, 0x1f, 0xff, 
-	0xb5, 0xb0, 0x4f, 0x44, 0x25, 0x00, 0x6d, 0x38, 
-	0x4c, 0x43, 0x28, 0x05, 0xd2, 0x14, 0xa3, 0x02, 
-	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x10, 0x03, 0x2e, 0x62, 0x70, 0x00, 0x4d, 0x3f, 
-	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, 0x6a, 
-	0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xf0, 0xf0, 0x00, 
-	0xf9, 0x27, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0xe9, 0x8e, 0xa0, 0x28, 0x00, 
-	0xd1, 0xe6, 0xf0, 0x00, 0xfa, 0x49, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 
-	0xd1, 0xde, 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x06, 0xd1, 0x12, 0x48, 0x26, 0x78, 0x00, 
-	0x28, 0x00, 0xd0, 0x06, 0x6d, 0x78, 0x28, 0x01, 
-	0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 
-	0xfc, 0xc3, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, 
-	0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0x2c, 
-	0x85, 0xa5, 0x8d, 0xa0, 0x28, 0x00, 0xd1, 0xc3, 
-	0x6d, 0x78, 0x28, 0x01, 0xd0, 0x08, 0x28, 0x04, 
-	0xd0, 0x0b, 0x28, 0x05, 0xd1, 0xbc, 0xf0, 0x00, 
-	0xfd, 0xdd, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x00, 0xfd, 0xb2, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0xf0, 0x00, 0xfd, 0x81, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 
-	0xd1, 0xaa, 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, 0x9c, 0x8d, 0xa0, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x06, 0xd1, 0x97, 
-	0x85, 0xa5, 0x65, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x04, 
-	0x2e, 0x08, 0x04, 0xc8, 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, 0x1f, 
-	0xfb, 0x53, 0x4b, 0x32, 0x40, 0x18, 0xf0, 0x1f, 
-	0xfb, 0x53, 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, 0x14, 
-	0xfc, 0x21, 0x22, 0x00, 0xb0, 0x02, 0x49, 0x28, 
-	0xb4, 0x06, 0x6b, 0xf8, 0x6c, 0x39, 0x1a, 0x42, 
-	0x69, 0x39, 0x1c, 0x2b, 0x48, 0x25, 0xf0, 0x14, 
-	0xfc, 0x15, 0xb0, 0x02, 0xf0, 0x1f, 0xfb, 0x30, 
-	0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x1f, 
-	0xfb, 0x2f, 0xe0, 0x1d, 0xf0, 0x1f, 0xfb, 0x28, 
-	0x4b, 0x1c, 0x40, 0x18, 0xf0, 0x1f, 0xfb, 0x28, 
-	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, 0x14, 0xfb, 0xf6, 
-	0xb0, 0x02, 0xf0, 0x1f, 0xfb, 0x11, 0x23, 0x01, 
-	0x04, 0x9b, 0x43, 0x18, 0xf0, 0x1f, 0xfb, 0x10, 
-	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, 0x48, 
-	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, 0x48, 
-	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, 0x19, 
-	0xfe, 0xe3, 0x61, 0xe1, 0x5c, 0x70, 0x04, 0x00, 
-	0x9a, 0x05, 0x18, 0x82, 0x65, 0x7a, 0x92, 0x03, 
-	0x98, 0x04, 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xd8, 
-	0x61, 0xe1, 0x5c, 0x70, 0x02, 0x00, 0x9a, 0x03, 
-	0x18, 0x80, 0x65, 0x78, 0x90, 0x02, 0x98, 0x04, 
-	0x31, 0x01, 0xf0, 0x19, 0xfe, 0xcd, 0x61, 0xe1, 
-	0x5c, 0x70, 0x9a, 0x02, 0x18, 0x80, 0x65, 0x78, 
-	0x98, 0x04, 0x31, 0x01, 0xf0, 0x19, 0xfe, 0xc4, 
-	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, 0x19, 0xfe, 0x9d, 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, 0x19, 
-	0xfe, 0x8f, 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, 0x19, 0xfe, 0x69, 0x61, 0xe1, 
-	0x98, 0x00, 0x38, 0x01, 0x63, 0xf8, 0xe7, 0xb2, 
-	0x48, 0x3c, 0x83, 0xa8, 0x8b, 0x28, 0x6b, 0xf9, 
-	0x42, 0x88, 0xda, 0x01, 0x63, 0xf8, 0xe0, 0x02, 
-	0x8b, 0xa8, 0x42, 0x81, 0xdb, 0x68, 0x8b, 0xa8, 
-	0x6b, 0xf9, 0x42, 0x81, 0xdd, 0x00, 0x63, 0xf8, 
-	0x48, 0x35, 0x21, 0x00, 0x66, 0x78, 0x80, 0x01, 
-	0x30, 0x02, 0x21, 0xff, 0x31, 0xc1, 0x66, 0x78, 
-	0x80, 0x01, 0x48, 0x32, 0x66, 0x78, 0x79, 0x39, 
-	0x29, 0x00, 0xd0, 0x21, 0x21, 0x00, 0x71, 0x39, 
-	0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, 
-	0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x2a, 
-	0xf0, 0x00, 0xfe, 0xec, 0x6b, 0xf8, 0x38, 0x06, 
-	0x6e, 0x79, 0x80, 0x08, 0x31, 0x02, 0x66, 0x79, 
-	0xb0, 0x01, 0x48, 0x25, 0xf7, 0xff, 0xff, 0x02, 
-	0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, 
-	0x69, 0xe0, 0x6b, 0xf9, 0x18, 0x41, 0x69, 0x20, 
-	0xf0, 0x19, 0xfe, 0x26, 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, 0xbe, 
-	0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, 
-	0x69, 0xe0, 0x6b, 0xfe, 0x19, 0x81, 0x69, 0x20, 
-	0xb0, 0x01, 0xf0, 0x19, 0xfe, 0x01, 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, 0x48, 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, 0xb6, 
-	0x6a, 0xf8, 0x6b, 0xe1, 0x18, 0x40, 0x22, 0x33, 
-	0x06, 0x52, 0x62, 0xf8, 0x6d, 0x92, 0xb0, 0x01, 
-	0x42, 0x90, 0xdb, 0x02, 0x6a, 0x79, 0x1a, 0x40, 
-	0x62, 0xf8, 0x21, 0xff, 0x31, 0x11, 0x48, 0x10, 
-	0x85, 0x01, 0x8b, 0xa9, 0x31, 0x06, 0x85, 0x41, 
-	0x21, 0x01, 0x02, 0x49, 0x86, 0x81, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x48, 0x00, 0x00, 0x0f, 0xee, 
-	0x2e, 0x08, 0x04, 0xa8, 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, 0x53, 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, 0x19, 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, 0xf4, 
-	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, 0x19, 0xfc, 0x91, 0x1c, 0x04, 
-	0xe7, 0xda, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc8, 
-	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, 0xe8, 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, 0xc0, 
-	0x20, 0x01, 0x61, 0xe0, 0x69, 0xe0, 0x28, 0x00, 
-	0xd0, 0x0b, 0x6b, 0x20, 0xf7, 0xff, 0xf9, 0xec, 
-	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, 0xc8, 
-	0xff, 0xff, 0xec, 0x78, 0x00, 0x02, 0xbf, 0x20, 
-	0x2e, 0x08, 0x05, 0x48, 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, 0x48, 
-	0xb5, 0xb0, 0xb0, 0x83, 0x48, 0x3f, 0x49, 0x40, 
-	0x8d, 0xc9, 0x4c, 0x40, 0x63, 0xe1, 0x29, 0x06, 
-	0xda, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0x01, 0x09, 0x49, 0x01, 0x49, 
-	0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, 0xd0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, 
-	0x49, 0x35, 0xf7, 0xff, 0xff, 0x6f, 0xb0, 0x01, 
-	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 0x99, 0x01, 
-	0x18, 0x40, 0x6b, 0xe1, 0x42, 0x88, 0xd0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x98, 0x00, 0x4f, 0x2c, 0x28, 0x00, 0xd0, 0x25, 
-	0x6e, 0x38, 0x6d, 0xb9, 0x18, 0x40, 0x23, 0x01, 
-	0x06, 0x1b, 0x66, 0x38, 0x42, 0x98, 0xdb, 0x04, 
-	0x43, 0xdb, 0x18, 0xc0, 0x66, 0x38, 0x1e, 0x48, 
-	0x65, 0xb8, 0x23, 0x0d, 0x06, 0x9b, 0x6d, 0xb8, 
-	0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x08, 0x6e, 0xe0, 
-	0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x48, 0x20, 0x00, 
-	0x65, 0xb8, 0x6c, 0xb8, 0x30, 0x08, 0x23, 0x05, 
-	0x02, 0x5b, 0x64, 0xb8, 0x42, 0x98, 0xd1, 0x02, 
-	0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x6c, 0xb8, 
-	0x49, 0x19, 0x61, 0x48, 0x24, 0x33, 0x06, 0x64, 
-	0x00, 0x63, 0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, 
-	0x6d, 0x60, 0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, 
-	0x98, 0x03, 0x4b, 0x0e, 0x18, 0xc0, 0x9a, 0x02, 
-	0x1c, 0x2b, 0xf0, 0x00, 0xfc, 0x53, 0xb0, 0x01, 
-	0x6d, 0xb8, 0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, 
-	0x48, 0x0e, 0x68, 0x02, 0x18, 0x51, 0x60, 0x01, 
-	0x6e, 0x60, 0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, 
-	0x48, 0x0a, 0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, 
-	0x60, 0x01, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, 
-	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x04, 0xc8, 
-	0x2e, 0x08, 0x05, 0x34, 0x2e, 0x08, 0x04, 0x48, 
-	0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x64, 
-	0xb5, 0xf0, 0xb0, 0x83, 0x4e, 0x65, 0x25, 0x00, 
-	0x4f, 0x65, 0x6a, 0xf8, 0xf7, 0xff, 0xf8, 0xcc, 
-	0x48, 0x64, 0x8d, 0xc0, 0x63, 0xf8, 0x28, 0x0a, 
-	0xda, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0x34, 0x09, 0x60, 0x01, 0x40, 
-	0x23, 0xff, 0x33, 0xc1, 0x42, 0x98, 0xd0, 0x07, 
-	0x23, 0xff, 0x33, 0xbe, 0x42, 0x9c, 0xd0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, 
-	0x49, 0x57, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xd6, 
-	0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 
-	0x99, 0x01, 0x18, 0x41, 0x6b, 0xfa, 0x42, 0x91, 
-	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, 0x0f, 
-	0xf9, 0x4f, 0x20, 0x00, 0xf7, 0xfb, 0xfe, 0xb8, 
-	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, 0x0f, 0xfc, 0x69, 0x98, 0x00, 0x28, 0x00, 
-	0xd0, 0x2b, 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x28, 
-	0x68, 0xf8, 0x28, 0x00, 0xd1, 0x25, 0x6f, 0x38, 
-	0xf7, 0xff, 0xfe, 0x08, 0xe0, 0x21, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x0f, 0xfc, 0x58, 0xe7, 0xed, 
-	0x21, 0x08, 0x20, 0x1e, 0xf0, 0x0f, 0xfc, 0x53, 
-	0xe7, 0xe8, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x08, 
-	0x20, 0x00, 0x63, 0x79, 0x21, 0x00, 0x60, 0xe0, 
-	0xf0, 0x0f, 0xf9, 0x1a, 0x20, 0x02, 0xf0, 0x0f, 
-	0xf9, 0x6d, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x08, 
-	0x6d, 0x60, 0x28, 0x05, 0xd1, 0x05, 0x68, 0xf8, 
-	0x28, 0x00, 0xd1, 0x02, 0x6f, 0x38, 0xf7, 0xff, 
-	0xfe, 0x2d, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, 
-	0x98, 0x02, 0x1d, 0xc5, 0x6b, 0xf8, 0x1b, 0x42, 
-	0x63, 0xfa, 0x7e, 0x39, 0x69, 0x78, 0x18, 0x41, 
-	0x4b, 0x16, 0x18, 0xe8, 0xf7, 0xfb, 0xfb, 0xfc, 
-	0x7e, 0x38, 0x6b, 0xf9, 0x18, 0x40, 0x07, 0x81, 
-	0x0f, 0x89, 0x76, 0x39, 0x1a, 0x44, 0x20, 0x01, 
-	0x06, 0x00, 0x49, 0x15, 0x60, 0x08, 0xf0, 0x1e, 
-	0xfe, 0x53, 0x4b, 0x14, 0x40, 0x18, 0xf0, 0x1e, 
-	0xfe, 0x53, 0x22, 0x04, 0x49, 0x10, 0xb4, 0x06, 
-	0x23, 0x12, 0x21, 0x1e, 0x69, 0x78, 0x1c, 0x22, 
-	0xf0, 0x13, 0xff, 0x28, 0xb0, 0x02, 0xf0, 0x1e, 
-	0xfe, 0x43, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 
-	0xf0, 0x1e, 0xfe, 0x42, 0x69, 0x78, 0x59, 0x01, 
-	0x60, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, 
-	0x2e, 0x08, 0x04, 0xc8, 0x2c, 0x00, 0x1f, 0xc0, 
-	0x2e, 0x08, 0x05, 0x38, 0x2e, 0x08, 0x04, 0x48, 
-	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, 0xc8, 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, 0xc8, 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, 0x48, 0x2e, 0x08, 0x04, 0xc8, 
-	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, 0x52, 
-	0xf7, 0xff, 0xf8, 0x06, 0x20, 0x00, 0x66, 0xf8, 
-	0x67, 0x38, 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 
-	0xff, 0xfb, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x3e, 
-	0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x48, 
-	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, 0xd1, 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, 0xc4, 
-	0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x42, 
-	0x20, 0x01, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x7a, 
-	0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, 
-	0xf0, 0x11, 0xfb, 0xb2, 0x21, 0x00, 0x20, 0x0d, 
-	0xf0, 0x11, 0xfb, 0xae, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x02, 0xf0, 0x0f, 0xf8, 0x0e, 
-	0x20, 0xff, 0x49, 0x03, 0x70, 0x08, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x48, 
-	0x2e, 0x08, 0x04, 0xc8, 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, 0x0e, 0xff, 0xee, 
-	0x20, 0x00, 0xf7, 0xfb, 0xfd, 0x01, 0xf7, 0xff, 
-	0xf8, 0x2b, 0x65, 0x3e, 0x20, 0x00, 0x65, 0x78, 
-	0xf7, 0xfe, 0xfe, 0xc2, 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, 0x8c, 
-	0xf7, 0xfe, 0xff, 0xe2, 0x65, 0x3c, 0x65, 0x7c, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 
-	0xff, 0x83, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xd4, 
-	0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x63, 0x6c, 0x20, 0x02, 0x60, 0xfc, 
-	0xf0, 0x0e, 0xff, 0xbc, 0x20, 0x00, 0xf7, 0xfb, 
-	0xfc, 0xcf, 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf4, 
-	0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x48, 
-	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, 0x54, 0x21, 0x00, 0x20, 0x0e, 
-	0xf0, 0x11, 0xfb, 0x2a, 0x20, 0x01, 0xf0, 0x0e, 
-	0xff, 0x8d, 0x20, 0x03, 0x60, 0xe0, 0x68, 0xf8, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x0e, 
-	0xff, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x01, 0xf0, 0x0e, 0xff, 0x7f, 0x20, 0x00, 
-	0x70, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x00, 0x20, 0x0b, 0xf0, 0x11, 0xfb, 0x10, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc8, 0x2e, 0x08, 0x05, 0x54, 
-	0x2e, 0x08, 0x05, 0x4c, 0x2e, 0x08, 0x05, 0x50, 
-	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, 0x0e, 0xff, 0x58, 0x25, 0x00, 0x68, 0xe0, 
-	0x28, 0x00, 0xd0, 0x04, 0x21, 0x00, 0x20, 0x00, 
-	0xf0, 0x0e, 0xfe, 0xfa, 0x60, 0xe5, 0x70, 0x3e, 
-	0x68, 0xf8, 0x28, 0x03, 0xd1, 0x14, 0x48, 0x13, 
-	0x22, 0x00, 0x68, 0x41, 0x20, 0x00, 0xf7, 0xfe, 
-	0xfd, 0xef, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x20, 
-	0xe0, 0x0f, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 
-	0xfa, 0xd3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x01, 0x61, 0xf8, 0x6b, 0x38, 0xf7, 0xfe, 
-	0xfe, 0x0f, 0x20, 0x02, 0x60, 0xfd, 0xf0, 0x0e, 
-	0xff, 0x2d, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 
-	0xfa, 0xc3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x05, 0x48, 
-	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, 0x11, 0xfa, 0xa4, 
-	0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 0xfa, 0xa0, 
-	0x20, 0x22, 0x1c, 0x39, 0xf0, 0x11, 0xfa, 0x9c, 
-	0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x11, 0xfa, 0x94, 
-	0x21, 0x00, 0x20, 0x0d, 0xf0, 0x11, 0xfa, 0x90, 
-	0x20, 0x22, 0x1c, 0x39, 0xf0, 0x11, 0xfa, 0x8c, 
-	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xcd, 0x60, 0xe5, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, 
-	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, 0x11, 0xfa, 0x72, 0x20, 0x00, 0xf7, 0xfe, 
-	0xfd, 0xb3, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, 
-	0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, 
-	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, 0x11, 0xfa, 0x56, 0x20, 0x00, 0xf7, 0xfe, 
-	0xfd, 0x97, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, 
-	0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x04, 0x48, 0x2e, 0x08, 0x04, 0xc8, 
-	0x48, 0x03, 0x6d, 0x00, 0x28, 0x00, 0xd1, 0x00, 
-	0x47, 0x70, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0x48, 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, 0x18, 0xff, 0xdd, 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, 0x18, 
-	0xff, 0xcf, 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, 0x18, 0xff, 0xc0, 
-	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, 0x18, 0xff, 0xae, 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, 0x18, 0xff, 0x92, 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, 0x18, 0xff, 0x84, 
-	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, 0x18, 0xff, 0x74, 
-	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, 0x18, 0xff, 0x62, 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, 0x48, 
-	0x66, 0x00, 0x00, 0x80, 0xb5, 0xf0, 0x1c, 0x17, 
-	0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x0d, 0x21, 0x00, 
-	0x1c, 0x1c, 0x42, 0xba, 0xda, 0x03, 0x1c, 0x08, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x42, 0xa0, 
-	0xd3, 0x01, 0x42, 0xb0, 0xd9, 0x03, 0x1c, 0x08, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x19, 0xc1, 
-	0x42, 0xb1, 0xd9, 0x0c, 0x1a, 0x32, 0x4e, 0x0a, 
-	0x64, 0x32, 0x1c, 0x29, 0xf7, 0xfb, 0xf8, 0x84, 
-	0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x29, 0x1c, 0x20, 
-	0xf7, 0xfb, 0xf8, 0x7e, 0xe0, 0x03, 0x1c, 0x29, 
-	0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x79, 0x1c, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc8, 0xb5, 0xf0, 0x1c, 0x17, 
-	0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x05, 0x20, 0x00, 
-	0x1c, 0x1c, 0x42, 0xba, 0xdb, 0x18, 0x42, 0xa1, 
-	0xd3, 0x16, 0x42, 0xb1, 0xd2, 0x14, 0x19, 0xc8, 
-	0x42, 0xb0, 0xd9, 0x0c, 0x1a, 0x72, 0x4e, 0x0a, 
-	0x64, 0x32, 0x1c, 0x28, 0xf7, 0xfb, 0xf8, 0x5c, 
-	0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x28, 0x1c, 0x21, 
-	0xf7, 0xfb, 0xf8, 0x56, 0xe0, 0x03, 0x1c, 0x28, 
-	0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x51, 0x1c, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x04, 0xc8, 0x47, 0x70, 0xb5, 0x00, 
-	0xb0, 0x82, 0x46, 0x6a, 0x49, 0x06, 0xa8, 0x01, 
-	0xf7, 0xfe, 0xfc, 0x58, 0x21, 0x00, 0x20, 0x0b, 
-	0xf0, 0x11, 0xf9, 0x2e, 0x20, 0x03, 0x49, 0x03, 
-	0x61, 0x88, 0xb0, 0x02, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0x64, 0x2e, 0x08, 0x05, 0x48, 
-	0xb5, 0x80, 0x4f, 0x0b, 0x22, 0x00, 0x20, 0x00, 
-	0x69, 0xf9, 0xf7, 0xfe, 0xfc, 0x2d, 0x21, 0x00, 
-	0x20, 0x0d, 0xf0, 0x11, 0xf9, 0x19, 0x21, 0x01, 
-	0x1f, 0xf8, 0x38, 0x79, 0x61, 0xc1, 0x6b, 0x00, 
-	0xf7, 0xfe, 0xfc, 0x56, 0x20, 0x00, 0x61, 0xb8, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0x48, 0xb5, 0x80, 0x4f, 0x06, 
-	0x68, 0x38, 0x1d, 0xc1, 0x31, 0xb5, 0x20, 0x2f, 
-	0x02, 0x80, 0xf0, 0x18, 0xfe, 0xbd, 0x60, 0x39, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x02, 0xcb, 0x10, 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, 0x68, 0x48, 0x03, 0x21, 0x00, 
-	0x60, 0x01, 0x48, 0x03, 0x69, 0x41, 0x31, 0x01, 
-	0x61, 0x41, 0x47, 0x70, 0x2e, 0x08, 0x48, 0x00, 
-	0x2e, 0x08, 0x05, 0x68, 0xb5, 0x00, 0xb0, 0x88, 
-	0x46, 0x68, 0xf0, 0x13, 0xfc, 0xbf, 0x48, 0x07, 
-	0x69, 0x81, 0x31, 0x01, 0x23, 0x01, 0x22, 0x06, 
-	0x61, 0x81, 0x21, 0x47, 0x02, 0x49, 0x05, 0x48, 
-	0xf0, 0x13, 0xfb, 0xac, 0xb0, 0x08, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x68, 
-	0xb5, 0x90, 0x1c, 0x07, 0x20, 0xff, 0x30, 0xa5, 
-	0xb0, 0x85, 0x90, 0x00, 0x20, 0x01, 0x02, 0x40, 
-	0x90, 0x02, 0x48, 0x12, 0x90, 0x04, 0x20, 0x0e, 
-	0xab, 0x03, 0x80, 0x18, 0x46, 0x68, 0xf0, 0x13, 
-	0xfc, 0xd1, 0x2f, 0x00, 0xd0, 0x16, 0x20, 0x33, 
-	0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, 
-	0x1a, 0xc7, 0x98, 0x02, 0x1e, 0x79, 0xf0, 0x00, 
-	0xfb, 0x31, 0x4c, 0x09, 0x68, 0x20, 0x28, 0x00, 
-	0xd1, 0x04, 0x20, 0xa5, 0x01, 0xc0, 0xf0, 0x00, 
-	0xfb, 0x37, 0x60, 0x20, 0x98, 0x02, 0x1a, 0x38, 
-	0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x1c, 0x00, 0x00, 
-	0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x68, 
-	0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 
-	0xf0, 0x0f, 0xf9, 0x2e, 0x48, 0x04, 0x68, 0x00, 
-	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
-	0xf0, 0x00, 0xf9, 0xea, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x9b, 0xc4, 0xb5, 0xf0, 0x48, 0x55, 
-	0x4e, 0x55, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x55, 
-	0x86, 0xe7, 0x86, 0xa7, 0x48, 0x54, 0x60, 0x07, 
-	0xf0, 0x0b, 0xf8, 0x2e, 0x48, 0x53, 0xf0, 0x14, 
-	0xf8, 0xdb, 0xf7, 0xfa, 0xff, 0x29, 0x21, 0xff, 
-	0x48, 0x51, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, 
-	0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, 
-	0x4a, 0x4e, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, 
-	0xfb, 0x17, 0x20, 0x01, 0xf7, 0xff, 0xff, 0x98, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfc, 0x6c, 
-	0xf0, 0x01, 0xfa, 0xbc, 0x48, 0x48, 0x60, 0x07, 
-	0x25, 0x02, 0x48, 0x48, 0x60, 0x05, 0x20, 0x03, 
-	0x49, 0x47, 0x60, 0x08, 0x49, 0x47, 0x60, 0x08, 
-	0x49, 0x47, 0x60, 0x0d, 0x49, 0x47, 0x60, 0x08, 
-	0x48, 0x47, 0x60, 0x07, 0x48, 0x47, 0x65, 0x87, 
-	0xf0, 0x00, 0xf9, 0x8a, 0xf0, 0x14, 0xf9, 0x48, 
-	0x20, 0x00, 0xf0, 0x11, 0xfe, 0x85, 0x28, 0x00, 
-	0xd1, 0x64, 0x48, 0x43, 0xf0, 0x0e, 0xfa, 0xbe, 
-	0x20, 0x00, 0xf0, 0x0e, 0xfb, 0x2f, 0x87, 0xe7, 
-	0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03, 
-	0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x11, 
-	0xfb, 0x2b, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, 
-	0xfc, 0x73, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xc7, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xdb, 0xf0, 0x09, 
-	0xff, 0x4f, 0xf0, 0x09, 0xff, 0x8d, 0xf7, 0xfb, 
-	0xf9, 0xbf, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfd, 
-	0xf8, 0x11, 0xf7, 0xfd, 0xfb, 0xbf, 0xf7, 0xfb, 
-	0xfd, 0x0d, 0x03, 0xe8, 0xf0, 0x00, 0xfa, 0x5c, 
-	0xf0, 0x05, 0xfc, 0x30, 0x49, 0x2b, 0x70, 0x08, 
-	0x05, 0xa8, 0xf0, 0x1e, 0xf9, 0x78, 0x49, 0x2a, 
-	0x20, 0x17, 0xf0, 0x1e, 0xf9, 0x81, 0x49, 0x29, 
-	0x20, 0x08, 0xf0, 0x1e, 0xf9, 0x7d, 0xf0, 0x1e, 
-	0xf9, 0x73, 0x4b, 0x27, 0x40, 0x18, 0xf0, 0x1e, 
-	0xf9, 0x73, 0x01, 0xe8, 0xf0, 0x1e, 0xf9, 0x67, 
-	0x48, 0x24, 0x23, 0x01, 0x22, 0x08, 0x21, 0x81, 
-	0x01, 0x09, 0x60, 0x07, 0xf0, 0x11, 0xfa, 0x38, 
-	0xf0, 0x01, 0xfa, 0xd6, 0x49, 0x20, 0x20, 0x04, 
-	0xf0, 0x1e, 0xf9, 0x66, 0xf0, 0x1e, 0xf9, 0x5c, 
-	0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x1e, 
-	0xf9, 0x5b, 0x20, 0x10, 0xf0, 0x1e, 0xf9, 0x4f, 
-	0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfd, 
-	0xfd, 0xa9, 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, 0x98, 0x07, 0x77, 0x77, 0x20, 
-	0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x68, 
-	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, 0x08, 0x1a, 0x94, 
-	0x2e, 0x00, 0x54, 0xa1, 0x2e, 0x00, 0x54, 0xc1, 
-	0xff, 0xff, 0xfe, 0xff, 0x2e, 0x08, 0x48, 0x00, 
-	0x2e, 0x00, 0x54, 0x81, 0xb5, 0x90, 0x1c, 0x0c, 
-	0x1c, 0x07, 0xf0, 0x1e, 0xf9, 0x55, 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, 0x1e, 0xf9, 0x0c, 
-	0xf0, 0x1e, 0xf9, 0x02, 0x23, 0x02, 0x43, 0xdb, 
-	0x40, 0x18, 0xf0, 0x1e, 0xf9, 0x01, 0xf0, 0x1e, 
-	0xf9, 0x6d, 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, 0x1e, 0xf9, 0x29, 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, 0x1e, 0xf8, 0xe0, 
-	0xf0, 0x1e, 0xf8, 0xd6, 0x23, 0x02, 0x43, 0xdb, 
-	0x40, 0x18, 0xf0, 0x1e, 0xf8, 0xd5, 0xf0, 0x1e, 
-	0xf9, 0x41, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x00, 0xfd, 0xe8, 0x6e, 0x00, 0x03, 0x00, 
-	0xb5, 0x00, 0xf0, 0x1e, 0xf9, 0x01, 0x20, 0x03, 
-	0x49, 0x05, 0x60, 0x08, 0xf0, 0x1e, 0xf8, 0xc0, 
-	0x23, 0x02, 0x43, 0x18, 0xf0, 0x1e, 0xf8, 0xc0, 
-	0xf0, 0x1e, 0xf9, 0x2c, 0xbc, 0x08, 0x47, 0x18, 
-	0x6e, 0x00, 0x03, 0x00, 0xb5, 0x90, 0x1c, 0x0c, 
-	0x1c, 0x07, 0xf0, 0x1e, 0xf8, 0xed, 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, 0x1e, 0xf8, 0xa4, 
-	0xf0, 0x1e, 0xf8, 0x9a, 0x23, 0x20, 0x43, 0xdb, 
-	0x40, 0x18, 0xf0, 0x1e, 0xf8, 0x99, 0xf0, 0x1e, 
-	0xf9, 0x05, 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, 0x1e, 0xf8, 0xc1, 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, 0x1e, 0xf8, 0x78, 
-	0xf0, 0x1e, 0xf8, 0x6e, 0x23, 0x20, 0x43, 0xdb, 
-	0x40, 0x18, 0xf0, 0x1e, 0xf8, 0x6d, 0xf0, 0x1e, 
-	0xf8, 0xd9, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x00, 0xfd, 0xe8, 0x6e, 0x00, 0x04, 0x00, 
-	0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0x99, 0x20, 0x03, 
-	0x49, 0x05, 0x60, 0x08, 0xf0, 0x1e, 0xf8, 0x58, 
-	0x23, 0x20, 0x43, 0x18, 0xf0, 0x1e, 0xf8, 0x58, 
-	0xf0, 0x1e, 0xf8, 0xc4, 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, 0x52, 0xbc, 0x08, 0x47, 0x18, 
-	0x48, 0x04, 0x21, 0x10, 0xf0, 0x0f, 0xf8, 0x34, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x08, 0x04, 0xfc, 0x2e, 0x08, 0x05, 0xb4, 
-	0xb5, 0x00, 0xf0, 0x1e, 0xf8, 0x69, 0x21, 0x00, 
-	0x48, 0x08, 0x60, 0x41, 0x60, 0x81, 0x49, 0x08, 
-	0x20, 0x07, 0xf0, 0x1e, 0xf8, 0x2d, 0xf0, 0x1e, 
-	0xf8, 0x23, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, 
-	0xf0, 0x1e, 0xf8, 0x22, 0xf0, 0x1e, 0xf8, 0x8e, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x00, 0x58, 0xe1, 0x48, 0x01, 0x68, 0x40, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb4, 
-	0xb5, 0x90, 0x49, 0x0d, 0x1c, 0x0f, 0x48, 0x0d, 
-	0x24, 0x1e, 0x22, 0x10, 0x1c, 0x23, 0xf0, 0x0f, 
-	0xf9, 0x35, 0x22, 0x02, 0x21, 0x10, 0x1c, 0x38, 
-	0x1c, 0x23, 0xf0, 0x0b, 0xfb, 0x9d, 0x49, 0x08, 
-	0x20, 0x10, 0xf0, 0x1e, 0xf8, 0x05, 0xf0, 0x1d, 
-	0xff, 0xfb, 0x4b, 0x06, 0x40, 0x18, 0xf0, 0x1d, 
-	0xff, 0xfb, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x48, 0x10, 0x2e, 0x08, 0x05, 0xb4, 
-	0x2e, 0x00, 0x59, 0xa5, 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, 0x0f, 0xf9, 0x3a, 
-	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, 0x48, 0x10, 0x2e, 0x08, 0x05, 0xb4, 
-	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, 0xd8, 
-	0xb5, 0x90, 0x1c, 0x07, 0xf0, 0x1d, 0xff, 0x24, 
-	0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, 0x43, 0x18, 
-	0xf0, 0x1d, 0xff, 0x22, 0x1c, 0x39, 0x48, 0x05, 
-	0xf7, 0xff, 0xff, 0x50, 0x1c, 0x07, 0x1c, 0x20, 
-	0xf0, 0x1d, 0xff, 0x1a, 0x1c, 0x38, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xd8, 
-	0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 
-	0xff, 0x41, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xd8, 0xb5, 0x90, 0x1c, 0x07, 
-	0xd0, 0x0e, 0xf0, 0x1d, 0xff, 0x01, 0x23, 0x11, 
-	0x05, 0x1b, 0x1c, 0x04, 0x43, 0x18, 0xf0, 0x1d, 
-	0xfe, 0xff, 0x1c, 0x39, 0x48, 0x04, 0xf7, 0xff, 
-	0xff, 0x61, 0x1c, 0x20, 0xf0, 0x1d, 0xfe, 0xf8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xd8, 0xb5, 0x00, 0x4a, 0x04, 
-	0xc2, 0x03, 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x03, 
-	0xf7, 0xff, 0xff, 0x97, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x05, 0xc0, 0x2e, 0x08, 0x05, 0xd0, 
-	0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 
-	0xff, 0x11, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xd0, 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, 0xc0, 0x2e, 0x08, 0x05, 0xd0, 
-	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, 0xc0, 0x2e, 0x08, 0x05, 0xe0, 
-	0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 
-	0xfe, 0xe1, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x05, 0xe0, 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, 0xc0, 0x2e, 0x08, 0x05, 0xe0, 
-	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, 0xfa, 0x06, 
-	0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x22, 0x02, 
-	0x99, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xfd, 0x5c, 
-	0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 
-	0x1c, 0x38, 0xb0, 0x01, 0xf0, 0x0a, 0xff, 0x18, 
-	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, 0xca, 0x84, 
-	0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x07, 0x68, 
-	0x2e, 0x02, 0xc8, 0x94, 0xa0, 0x00, 0x0d, 0x00, 
-	0xb5, 0xb0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0c, 
-	0x0e, 0x24, 0x00, 0xb9, 0x48, 0x1a, 0x58, 0x42, 
-	0x3a, 0x01, 0x50, 0x42, 0xd1, 0x20, 0x23, 0x01, 
-	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x02, 0x1c, 0x38, 
-	0xf0, 0x0a, 0xfe, 0xe6, 0x22, 0x00, 0xb4, 0x04, 
-	0x25, 0x00, 0x1c, 0x38, 0x1c, 0x2b, 0x49, 0x13, 
-	0xf0, 0x0a, 0xfd, 0x1a, 0x00, 0x61, 0xb0, 0x01, 
-	0x48, 0x11, 0x52, 0x45, 0x48, 0x0f, 0x4a, 0x11, 
-	0x52, 0x50, 0x00, 0x79, 0x4a, 0x10, 0x52, 0x50, 
-	0x00, 0x62, 0x19, 0x12, 0x00, 0x92, 0x49, 0x0f, 
-	0x18, 0x53, 0x81, 0x1d, 0x52, 0x88, 0x80, 0x58, 
-	0x48, 0x0d, 0x8a, 0x81, 0x39, 0x01, 0x82, 0x81, 
-	0x23, 0x14, 0x5e, 0xc0, 0x28, 0x00, 0xd1, 0x03, 
-	0x20, 0xd7, 0x00, 0xc0, 0x49, 0x09, 0x65, 0xc8, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x02, 0xca, 0x84, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x49, 0xe0, 
-	0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x48, 0x28, 
-	0x2e, 0x08, 0x07, 0x68, 0xa0, 0x00, 0x0d, 0x00, 
-	0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0c, 
-	0x0c, 0x24, 0x1c, 0x17, 0xb0, 0x8a, 0x46, 0x69, 
-	0x1c, 0x30, 0x1c, 0x22, 0xf0, 0x00, 0xf8, 0xb0, 
-	0x23, 0x01, 0x1c, 0x05, 0x42, 0xd8, 0xd1, 0x03, 
-	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x4b, 0x4e, 0x42, 0x9c, 0xd1, 0x06, 0xa8, 0x00, 
-	0x88, 0x00, 0x1c, 0x31, 0x1c, 0x2a, 0xf7, 0xff, 
-	0xff, 0x57, 0xe0, 0x7f, 0x20, 0x20, 0x40, 0x20, 
-	0x28, 0x20, 0xd1, 0x1f, 0x06, 0x2a, 0x0e, 0x12, 
-	0xa8, 0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
-	0x1c, 0x31, 0x1c, 0x23, 0xf7, 0xfd, 0xf8, 0x72, 
-	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, 0x4f, 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, 0x58, 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, 0x63, 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, 0xe0, 
-	0x2e, 0x08, 0x49, 0xa8, 0x2e, 0x08, 0x48, 0x28, 
-	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, 0xe0, 
-	0x2e, 0x08, 0x4a, 0x20, 0x2e, 0x08, 0x4a, 0x60, 
-	0x2e, 0x08, 0x49, 0xa8, 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, 0xe6, 
-	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x5b, 0x30, 0x28, 0x03, 0xd1, 0x03, 0x1c, 0x28, 
-	0x1c, 0x39, 0xf7, 0xff, 0xfd, 0xcd, 0x04, 0x38, 
-	0x14, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x49, 0xe0, 0x2e, 0x08, 0x49, 0xa8, 
-	0x2e, 0x08, 0x4a, 0x60, 0x2e, 0x08, 0x4a, 0x20, 
-	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, 0x48, 0x28, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x0f, 
-	0x0c, 0x3f, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x00, 
-	0x0e, 0x00, 0xf7, 0xfc, 0xfc, 0x1b, 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, 0x48, 0x28, 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, 0x0b, 0xf9, 0xa0, 
-	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, 0x80, 
-	0x2e, 0x08, 0x4b, 0x18, 0x2e, 0x08, 0x4a, 0x98, 
-	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, 0x4a, 0x98, 
-	0x2e, 0x08, 0x4b, 0x18, 0x2e, 0x08, 0x07, 0x80, 
-	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, 0x4a, 0x98, 0x2e, 0x08, 0x07, 0x80, 
-	0xb5, 0x00, 0xf7, 0xff, 0xff, 0xe5, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xff, 0x04, 0x00, 0x14, 0x00, 
-	0xb0, 0x83, 0x90, 0x00, 0x1c, 0x0f, 0x04, 0x11, 
-	0x0c, 0x09, 0x24, 0x00, 0x1c, 0x38, 0x1c, 0x0d, 
-	0xb0, 0x81, 0xf7, 0xff, 0xff, 0x59, 0x1c, 0x01, 
-	0x20, 0x00, 0x29, 0x00, 0xd0, 0x04, 0xb0, 0x04, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x78, 0xf9, 0x02, 0x09, 0x79, 0x3a, 0x43, 0x11, 
-	0x04, 0x09, 0x0c, 0x09, 0x9b, 0x07, 0x88, 0x1a, 
-	0x42, 0x91, 0xd0, 0x01, 0xb0, 0x04, 0xe7, 0xef, 
-	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, 0x2a, 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, 0x2c, 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, 0x17, 0xf7, 0xff, 
-	0xff, 0x63, 0x99, 0x00, 0x48, 0x0f, 0x80, 0x01, 
-	0x2f, 0x00, 0xd0, 0x0d, 0x20, 0x0a, 0xb0, 0x84, 
-	0xab, 0x00, 0x80, 0x18, 0x20, 0x02, 0x70, 0x98, 
-	0x9b, 0x0b, 0x93, 0x01, 0x46, 0x69, 0x20, 0x75, 
-	0xf0, 0x04, 0xff, 0x76, 0xb0, 0x04, 0xe0, 0x07, 
-	0xf7, 0xfa, 0xf8, 0xf4, 0xe0, 0x04, 0x98, 0x01, 
-	0xf7, 0xff, 0xff, 0x2a, 0xf0, 0x00, 0xf8, 0x22, 
-	0x20, 0x00, 0xb0, 0x04, 0xe7, 0x74, 0x00, 0x00, 
-	0x2e, 0x08, 0x07, 0x80, 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, 0x80, 0x2e, 0x08, 0x4b, 0x98, 
-	0x2e, 0x08, 0x4c, 0x98, 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, 0xaf, 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, 0x80, 
-	0x2e, 0x08, 0x4c, 0x98, 0x2e, 0x08, 0x4b, 0x98, 
-	0x2e, 0x00, 0x62, 0xef, 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, 0x6b, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x28, 
-	0xf7, 0xff, 0xfe, 0xc2, 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, 0xb4, 
-	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, 0x80, 
-	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, 0x8f, 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, 0x1c, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x80, 
-	0x2e, 0x00, 0x64, 0xc9, 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, 0x13, 0xfa, 0x22, 
-	0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x92, 0x7c, 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, 0x13, 0xfc, 0x8a, 0xb0, 0x02, 0x97, 0x00, 
-	0x20, 0xff, 0x30, 0xd1, 0x90, 0x01, 0x95, 0x02, 
-	0x96, 0x03, 0x97, 0x04, 0x69, 0xe0, 0x68, 0x80, 
-	0x46, 0x69, 0xf0, 0x13, 0xfb, 0xbb, 0xf7, 0xff, 
-	0xff, 0xc9, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, 
-	0xb5, 0x90, 0x20, 0x07, 0xb0, 0x85, 0xf0, 0x08, 
-	0xff, 0xaf, 0x24, 0xff, 0x34, 0xe1, 0x22, 0x05, 
-	0x01, 0xd2, 0x21, 0x00, 0x20, 0x07, 0x1c, 0x23, 
-	0xf0, 0x08, 0xff, 0xbe, 0x27, 0x00, 0x22, 0x00, 
-	0x21, 0x02, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x09, 
-	0xfb, 0x67, 0x22, 0x01, 0x21, 0x01, 0x20, 0x07, 
-	0x1c, 0x3b, 0xf0, 0x09, 0xfb, 0x19, 0x22, 0x32, 
-	0x21, 0x32, 0x20, 0x07, 0xf0, 0x09, 0xf8, 0x74, 
-	0x97, 0x00, 0x97, 0x01, 0x20, 0x05, 0x01, 0xc0, 
-	0x90, 0x02, 0x94, 0x03, 0x97, 0x04, 0x48, 0x06, 
-	0x69, 0xc0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x13, 
-	0xfb, 0x85, 0xf7, 0xff, 0xff, 0x93, 0xb0, 0x05, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x92, 0x7c, 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, 0xa4, 
-	0x2e, 0x08, 0x92, 0x7c, 0xb5, 0xb0, 0x23, 0x00, 
-	0x1c, 0x07, 0x56, 0xc0, 0x1c, 0x14, 0x1c, 0x0d, 
-	0x28, 0x00, 0xd0, 0x0f, 0x20, 0x50, 0x1c, 0x21, 
-	0xf0, 0x17, 0xfd, 0x3e, 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, 0xbc, 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, 0xbc, 
-	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, 0xbc, 
-	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, 0x17, 0xfc, 0xd2, 0xa3, 0x72, 0xcb, 0x0c, 
-	0xf0, 0x17, 0xfc, 0xde, 0xf0, 0x17, 0xfc, 0xe0, 
-	0x4d, 0x71, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x18, 
-	0x22, 0x38, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, 
-	0xfc, 0xc3, 0xa3, 0x6b, 0xcb, 0x0c, 0xf0, 0x17, 
-	0xfc, 0xcf, 0xf0, 0x17, 0xfc, 0xd1, 0x5c, 0x28, 
-	0xab, 0x02, 0x70, 0x58, 0x22, 0x34, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x17, 0xfc, 0xb5, 0xa3, 0x64, 
-	0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0xc1, 0xf0, 0x17, 
-	0xfc, 0xc3, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x98, 
-	0x22, 0x30, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, 
-	0xfc, 0xa7, 0xa3, 0x5d, 0xcb, 0x0c, 0xf0, 0x17, 
-	0xfc, 0xb3, 0xf0, 0x17, 0xfc, 0xb5, 0x5c, 0x28, 
-	0xab, 0x02, 0x70, 0xd8, 0x22, 0x2c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x99, 0xa3, 0x56, 
-	0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0xa5, 0xf0, 0x17, 
-	0xfc, 0xa7, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x18, 
-	0x22, 0x28, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, 
-	0xfc, 0x8b, 0xa3, 0x4f, 0xcb, 0x0c, 0xf0, 0x17, 
-	0xfc, 0x97, 0xf0, 0x17, 0xfc, 0x99, 0x5c, 0x28, 
-	0xab, 0x03, 0x70, 0x58, 0x22, 0x24, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x7d, 0xa3, 0x48, 
-	0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x89, 0xf0, 0x17, 
-	0xfc, 0x8b, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x98, 
-	0x22, 0x20, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, 
-	0xfc, 0x6f, 0xa3, 0x41, 0xcb, 0x0c, 0xf0, 0x17, 
-	0xfc, 0x7b, 0xf0, 0x17, 0xfc, 0x7d, 0x5c, 0x28, 
-	0xab, 0x03, 0x70, 0xd8, 0x22, 0x1c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x61, 0xa3, 0x3a, 
-	0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x6d, 0xf0, 0x17, 
-	0xfc, 0x6f, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x18, 
-	0x22, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, 
-	0xfc, 0x53, 0xa3, 0x33, 0xcb, 0x0c, 0xf0, 0x17, 
-	0xfc, 0x5f, 0xf0, 0x17, 0xfc, 0x61, 0x5c, 0x28, 
-	0xab, 0x00, 0x70, 0x58, 0x22, 0x14, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x45, 0xa3, 0x2c, 
-	0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x51, 0xf0, 0x17, 
-	0xfc, 0x53, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x98, 
-	0x22, 0x10, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, 
-	0xfc, 0x37, 0xa3, 0x25, 0xcb, 0x0c, 0xf0, 0x17, 
-	0xfc, 0x43, 0xf0, 0x17, 0xfc, 0x45, 0x5c, 0x28, 
-	0xab, 0x00, 0x70, 0xd8, 0x22, 0x0c, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x29, 0xa3, 0x1e, 
-	0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x35, 0xf0, 0x17, 
-	0xfc, 0x37, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x18, 
-	0x22, 0x08, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x17, 
-	0xfc, 0x1b, 0xa3, 0x17, 0xcb, 0x0c, 0xf0, 0x17, 
-	0xfc, 0x27, 0xf0, 0x17, 0xfc, 0x29, 0x5c, 0x28, 
-	0xab, 0x01, 0x70, 0x58, 0x22, 0x04, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf0, 0x17, 0xfc, 0x0d, 0xa3, 0x10, 
-	0xcb, 0x0c, 0xf0, 0x17, 0xfc, 0x19, 0xf0, 0x17, 
-	0xfc, 0x1b, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x98, 
-	0xa3, 0x0b, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf0, 0x17, 0xfc, 0x0e, 0xf0, 0x17, 0xfc, 0x10, 
-	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, 0xbc, 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, 0x1c, 0xfe, 0xcd, 0x23, 0x01, 
-	0x03, 0x5b, 0x43, 0x18, 0xf0, 0x1c, 0xfe, 0xcc, 
-	0xf0, 0x1c, 0xfe, 0xc6, 0x23, 0x01, 0x03, 0x9b, 
-	0x43, 0x18, 0xf0, 0x1c, 0xfe, 0xc5, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0xf0, 0x1c, 0xfe, 0xbc, 
-	0x4b, 0x05, 0x40, 0x18, 0xf0, 0x1c, 0xfe, 0xbc, 
-	0xf0, 0x1c, 0xfe, 0xb6, 0x4b, 0x03, 0x40, 0x18, 
-	0xf0, 0x1c, 0xfe, 0xb6, 0xbc, 0x08, 0x47, 0x18, 
-	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 
-	0xb5, 0x80, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xd8, 
-	0x07, 0xf8, 0x0f, 0x40, 0x49, 0x0a, 0x58, 0x08, 
-	0x0c, 0x39, 0xd3, 0x05, 0x23, 0x01, 0x02, 0x5b, 
-	0x68, 0x01, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x03, 
-	0x68, 0x01, 0x4b, 0x06, 0x40, 0x19, 0x60, 0x01, 
-	0xf0, 0x13, 0xff, 0x5e, 0xf7, 0xff, 0xff, 0xd5, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x44, 0xff, 0xff, 0xfd, 0xff, 
-	0xb5, 0x00, 0x4a, 0x09, 0x1f, 0x11, 0x20, 0x0e, 
-	0xf0, 0x13, 0xff, 0x08, 0x28, 0x00, 0xd1, 0x09, 
-	0x48, 0x06, 0xf0, 0x13, 0xff, 0x49, 0x49, 0x06, 
-	0x20, 0x0e, 0xf0, 0x1c, 0xfe, 0x85, 0xf7, 0xff, 
-	0xff, 0xbc, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xe0, 0x2e, 0x08, 0x1a, 0x38, 
-	0x2e, 0x00, 0x6c, 0xab, 0xb5, 0x00, 0xf7, 0xff, 
-	0xff, 0x9f, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x1c, 
-	0xfe, 0x73, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 
-	0xa0, 0x0d, 0x22, 0x00, 0x21, 0x0b, 0xf7, 0xff, 
-	0xfd, 0x61, 0x4f, 0x0d, 0x22, 0x0a, 0x21, 0x0b, 
-	0x68, 0x38, 0xf7, 0xff, 0xfd, 0xbd, 0x68, 0x38, 
-	0x30, 0x01, 0x60, 0x38, 0x48, 0x09, 0x7c, 0x01, 
-	0x29, 0x01, 0xd1, 0x05, 0x69, 0x41, 0x29, 0xff, 
-	0xd0, 0x02, 0x20, 0x01, 0xf0, 0x00, 0xf8, 0x0c, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x49, 0x52, 0x20, 0x49, 0x52, 0x51, 0x3a, 0x00, 
-	0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x17, 0xcc, 
-	0xb5, 0x90, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x07, 
-	0xf7, 0xff, 0xff, 0x6e, 0x48, 0x11, 0x68, 0x01, 
-	0x00, 0x49, 0x08, 0x49, 0x07, 0xfa, 0x43, 0x11, 
-	0x0a, 0x09, 0x02, 0x09, 0x43, 0x21, 0x60, 0x01, 
-	0x68, 0xc2, 0x2a, 0x00, 0xd1, 0x11, 0x68, 0x82, 
-	0x1c, 0x53, 0x68, 0x82, 0x60, 0x83, 0x00, 0x92, 
-	0x4b, 0x09, 0x50, 0x99, 0x68, 0x81, 0x29, 0x64, 
-	0xd1, 0x01, 0x21, 0x00, 0x60, 0x81, 0x68, 0x81, 
-	0x68, 0x42, 0x42, 0x91, 0xd1, 0x01, 0x21, 0x01, 
-	0x60, 0xc1, 0xf7, 0xff, 0xff, 0x5e, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xcc, 
-	0x2e, 0x08, 0x4d, 0x98, 0xb5, 0x90, 0x1c, 0x07, 
-	0xf7, 0xff, 0xff, 0x42, 0x48, 0x10, 0x68, 0xc1, 
-	0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x41, 
-	0x68, 0x82, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x41, 
-	0x1c, 0x4a, 0x68, 0x41, 0x60, 0x42, 0x00, 0x89, 
-	0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x41, 
-	0x29, 0x64, 0xd1, 0x00, 0x60, 0x44, 0x60, 0xc4, 
-	0xf7, 0xff, 0xff, 0x3b, 0x20, 0x01, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x35, 
-	0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x17, 0xcc, 0x2e, 0x08, 0x4d, 0x98, 
-	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, 
-	0xb5, 0x00, 0x49, 0x0b, 0xca, 0x08, 0xc1, 0x08, 
-	0xca, 0x08, 0xc1, 0x08, 0xca, 0x0c, 0xc1, 0x0c, 
-	0x78, 0x01, 0x48, 0x08, 0x70, 0x01, 0x78, 0x00, 
-	0x28, 0x01, 0xd1, 0x04, 0xf0, 0x00, 0xf8, 0x41, 
-	0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x4f, 0x28, 0x2e, 0x08, 0x1a, 0x50, 
-	0xb5, 0x90, 0x27, 0x00, 0x48, 0x13, 0x70, 0x07, 
-	0x20, 0x02, 0xf0, 0x04, 0xfb, 0x57, 0x28, 0x00, 
-	0xd1, 0x03, 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0x21, 0x01, 0x4a, 0x0e, 
-	0x00, 0x43, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x9c, 
-	0x70, 0xa1, 0x52, 0xd7, 0x30, 0x01, 0x28, 0x02, 
-	0xdb, 0xf6, 0x22, 0x00, 0x1c, 0x08, 0x4c, 0x09, 
-	0x00, 0x53, 0x18, 0x9b, 0x00, 0xdb, 0x19, 0x19, 
-	0x70, 0x88, 0x52, 0xe7, 0x70, 0xcf, 0x32, 0x01, 
-	0x2a, 0x08, 0xdb, 0xf5, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x50, 
-	0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x60, 
-	0xb5, 0x00, 0xf0, 0x04, 0xf9, 0xe7, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x80, 0x20, 0x00, 0x49, 0x17, 
-	0x78, 0x09, 0x29, 0x01, 0xd1, 0x26, 0x49, 0x16, 
-	0x78, 0x4a, 0x2a, 0x14, 0xd0, 0x18, 0xdc, 0x09, 
-	0x2a, 0x11, 0xd0, 0x12, 0x2a, 0x12, 0xd0, 0x16, 
-	0x2a, 0x13, 0xd1, 0x16, 0x68, 0x8f, 0xf0, 0x00, 
-	0xf8, 0x77, 0xe0, 0x12, 0x2a, 0x15, 0xd0, 0x05, 
-	0x2a, 0x23, 0xd1, 0x0e, 0x68, 0x8f, 0xf0, 0x00, 
-	0xf8, 0xaf, 0xe0, 0x0a, 0xf0, 0x00, 0xf8, 0x8a, 
-	0xe0, 0x07, 0xf0, 0x00, 0xf8, 0x13, 0xe0, 0x04, 
-	0xf0, 0x00, 0xf8, 0x4a, 0xe0, 0x01, 0xf0, 0x00, 
-	0xf8, 0x2d, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf0, 0x04, 0xfa, 0xe6, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x50, 
-	0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, 
-	0x4c, 0x0d, 0x79, 0xa0, 0x28, 0x01, 0xd1, 0x12, 
-	0xf0, 0x00, 0xf9, 0x1c, 0x1c, 0x07, 0xd5, 0x01, 
-	0x20, 0x00, 0xe0, 0x0d, 0x88, 0xa4, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x11, 0x1c, 0x38, 0xf0, 0x00, 
-	0xfa, 0x0d, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x00, 0xf9, 0x47, 0x20, 0x01, 
-	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, 
-	0x4c, 0x0a, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x96, 
-	0x1c, 0x07, 0xd4, 0x0a, 0x88, 0xa4, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x12, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf9, 0xf1, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, 
-	0xf9, 0x2d, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x28, 
-	0xb5, 0xb0, 0xb0, 0x81, 0x4c, 0x0b, 0x88, 0xa0, 
-	0xf0, 0x00, 0xf8, 0x7c, 0x1c, 0x07, 0xd4, 0x0c, 
-	0x88, 0xa5, 0x79, 0xa2, 0x46, 0x6b, 0x21, 0x14, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xd7, 0x28, 0x00, 
-	0xd0, 0x03, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, 
-	0xf9, 0x11, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x28, 
-	0xb5, 0x90, 0xb0, 0x81, 0x4c, 0x0c, 0x88, 0xa0, 
-	0xf0, 0x00, 0xf8, 0x60, 0x1c, 0x07, 0xd4, 0x0c, 
-	0x68, 0xa0, 0x78, 0x01, 0x88, 0xa0, 0xf0, 0x00, 
-	0xf8, 0x71, 0x1c, 0x02, 0xd4, 0x07, 0x46, 0x6b, 
-	0x21, 0x13, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xb6, 
-	0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, 
-	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x90, 0xb0, 0x81, 
-	0x4c, 0x0d, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x42, 
-	0x1c, 0x07, 0xd4, 0x0f, 0x00, 0x78, 0x19, 0xc0, 
-	0x00, 0x80, 0x49, 0x0a, 0x18, 0x40, 0x7a, 0x01, 
-	0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x4f, 0x1c, 0x02, 
-	0xd4, 0x04, 0x46, 0x6b, 0x21, 0x15, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x94, 0x20, 0x01, 0xb0, 0x01, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x4f, 0x28, 0x2e, 0x08, 0x4f, 0x48, 
-	0xb5, 0x90, 0xb0, 0x81, 0x4f, 0x10, 0x88, 0xb8, 
-	0xf0, 0x00, 0xf8, 0x20, 0x1c, 0x04, 0xd4, 0x14, 
-	0x79, 0xb9, 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0x32, 
-	0x1c, 0x02, 0xd5, 0x08, 0x79, 0xba, 0x88, 0xb9, 
-	0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x49, 0x1c, 0x02, 
-	0xd5, 0x01, 0x20, 0x00, 0xe0, 0x08, 0x46, 0x6b, 
-	0x21, 0x23, 0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x6e, 
-	0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, 
-	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x4f, 0x28, 0xb4, 0x80, 0x04, 0x02, 
-	0x0c, 0x12, 0x20, 0x00, 0x49, 0x08, 0x00, 0x43, 
-	0x18, 0x1b, 0x00, 0x9b, 0x18, 0x5f, 0x78, 0xbf, 
-	0x2f, 0x01, 0xd0, 0x02, 0x5a, 0xcb, 0x42, 0x93, 
-	0xd0, 0x04, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xf2, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 
-	0x2e, 0x08, 0x4f, 0x48, 0xb4, 0xb0, 0x04, 0x02, 
-	0x0c, 0x12, 0x06, 0x0f, 0x0e, 0x3f, 0x20, 0x00, 
-	0x49, 0x0a, 0x00, 0x44, 0x18, 0x24, 0x00, 0xe4, 
-	0x18, 0x63, 0x78, 0x9d, 0x2d, 0x01, 0xd0, 0x05, 
-	0x5b, 0x0c, 0x42, 0x94, 0xd1, 0x02, 0x78, 0xdb, 
-	0x42, 0xbb, 0xd0, 0x04, 0x30, 0x01, 0x28, 0x08, 
-	0xdb, 0xef, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x60, 
-	0xb5, 0xb0, 0x04, 0x09, 0x0c, 0x09, 0x06, 0x12, 
-	0x0e, 0x12, 0x24, 0x00, 0x1c, 0x07, 0x48, 0x13, 
-	0x00, 0x63, 0x19, 0x1b, 0x00, 0xdb, 0x18, 0x1b, 
-	0x78, 0x9b, 0x2b, 0x01, 0xd1, 0x16, 0x00, 0x63, 
-	0x19, 0x1b, 0x00, 0xdb, 0x18, 0x1d, 0x70, 0xea, 
-	0x52, 0xc1, 0x20, 0x03, 0x70, 0xa8, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x9a, 0x00, 0x78, 0x19, 0xc0, 
-	0x00, 0x80, 0x49, 0x09, 0x18, 0x40, 0x88, 0xc1, 
-	0x31, 0x01, 0x80, 0xc1, 0x1c, 0x20, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x34, 0x01, 0x2c, 0x08, 
-	0xdb, 0xde, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x60, 
-	0x2e, 0x08, 0x4f, 0x48, 0xb4, 0x90, 0x20, 0x00, 
-	0x4c, 0x19, 0x4f, 0x1a, 0x88, 0xba, 0x49, 0x1a, 
-	0x00, 0x43, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0x5b, 
-	0x78, 0x9b, 0x2b, 0x01, 0xd1, 0x17, 0x00, 0x43, 
-	0x18, 0x1b, 0x00, 0x9b, 0x52, 0xca, 0x22, 0x02, 
-	0x18, 0x59, 0x70, 0x8a, 0x22, 0x00, 0x80, 0xca, 
-	0x72, 0x4a, 0x89, 0x3a, 0x2a, 0x10, 0xdb, 0x03, 
-	0x23, 0xff, 0x33, 0x01, 0x42, 0x9a, 0xdd, 0x03, 
-	0x20, 0x02, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, 
-	0x80, 0x8a, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x43, 
-	0x18, 0x1b, 0x00, 0xdb, 0x5a, 0xe3, 0x42, 0x93, 
-	0xd1, 0x03, 0x20, 0x01, 0x43, 0xc0, 0xbc, 0x90, 
-	0x47, 0x70, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xd3, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, 
-	0x2e, 0x08, 0x4f, 0x60, 0x2e, 0x08, 0x4f, 0x28, 
-	0x2e, 0x08, 0x4f, 0x48, 0xb5, 0xf0, 0x04, 0x0e, 
-	0x0c, 0x36, 0x1c, 0x07, 0xd5, 0x06, 0x2f, 0x02, 
-	0xdb, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x00, 0x7b, 
-	0x19, 0xdb, 0x00, 0x9b, 0x49, 0x0e, 0x18, 0x5a, 
-	0x70, 0x90, 0x22, 0x00, 0x52, 0xca, 0x24, 0x00, 
-	0x4d, 0x0c, 0x00, 0x60, 0x19, 0x00, 0x00, 0xc0, 
-	0x5a, 0x29, 0x42, 0xb1, 0xd1, 0x08, 0x22, 0x00, 
-	0x19, 0x41, 0x70, 0xca, 0x52, 0x2a, 0x20, 0x01, 
-	0x70, 0x88, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x20, 
-	0x34, 0x01, 0x2c, 0x08, 0xdb, 0xed, 0x1c, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x60, 
-	0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x04, 
-	0xf8, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x4f, 0x28, 0xb5, 0x00, 0x49, 0x03, 
-	0x78, 0x08, 0xf0, 0x04, 0xf8, 0x61, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x38, 
-	0xb5, 0xf0, 0x01, 0x46, 0x18, 0x36, 0x00, 0xb6, 
-	0x1c, 0x07, 0xb0, 0x84, 0x48, 0x0c, 0x90, 0x03, 
-	0x18, 0x34, 0x68, 0xa0, 0x28, 0x00, 0xd0, 0x0a, 
-	0x46, 0x69, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x3e, 
-	0x1c, 0x05, 0xd0, 0x02, 0x98, 0x01, 0xf0, 0x04, 
-	0xf9, 0x23, 0x2d, 0x00, 0xd1, 0xf4, 0x20, 0x00, 
-	0x99, 0x03, 0x51, 0x88, 0x60, 0x60, 0x60, 0xa0, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x50, 0x20, 0xb4, 0xb0, 0x01, 0x43, 
-	0x18, 0x18, 0x00, 0x80, 0x4a, 0x12, 0x18, 0x82, 
-	0x20, 0x00, 0x68, 0x93, 0x2b, 0x0a, 0xda, 0x1d, 
-	0x33, 0x01, 0x60, 0x93, 0x78, 0x8c, 0x68, 0x55, 
-	0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xd3, 
-	0x73, 0x9c, 0x68, 0x4c, 0x68, 0x55, 0x00, 0x6b, 
-	0x19, 0x5b, 0x00, 0x9b, 0x18, 0xd3, 0x61, 0x1c, 
-	0x89, 0x0f, 0x68, 0x54, 0x00, 0x63, 0x19, 0x1b, 
-	0x00, 0x9b, 0x18, 0xd1, 0x82, 0x8f, 0x68, 0x51, 
-	0x31, 0x01, 0x60, 0x51, 0x29, 0x0a, 0xdb, 0x00, 
-	0x60, 0x50, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, 
-	0x2e, 0x08, 0x50, 0x20, 0xb4, 0xb0, 0x01, 0x47, 
-	0x18, 0x3f, 0x00, 0xbf, 0x4a, 0x12, 0x18, 0xbc, 
-	0x20, 0x00, 0x68, 0xa3, 0x2b, 0x00, 0xdd, 0x1d, 
-	0x3b, 0x01, 0x60, 0xa3, 0x59, 0xd5, 0x00, 0x6b, 
-	0x19, 0x5b, 0x00, 0x9b, 0x18, 0xe3, 0x7b, 0x9b, 
-	0x70, 0x8b, 0x59, 0xd5, 0x00, 0x6b, 0x19, 0x5b, 
-	0x00, 0x9b, 0x18, 0xe3, 0x69, 0x1b, 0x60, 0x4b, 
-	0x59, 0xd5, 0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, 
-	0x18, 0xe3, 0x8a, 0x9b, 0x81, 0x0b, 0x59, 0xd1, 
-	0x31, 0x01, 0x51, 0xd1, 0x29, 0x0a, 0xdb, 0x00, 
-	0x51, 0xd0, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, 
-	0x2e, 0x08, 0x50, 0x20, 0xb5, 0x90, 0x06, 0x09, 
-	0x0e, 0x09, 0x1c, 0x1f, 0x00, 0x43, 0x18, 0x1b, 
-	0x00, 0x9b, 0x4c, 0x0f, 0x19, 0x1b, 0x78, 0x9b, 
-	0x2b, 0x02, 0xd0, 0x0f, 0x2b, 0x03, 0xd0, 0x07, 
-	0x2b, 0x04, 0xd1, 0x11, 0x1c, 0x3b, 0xf0, 0x00, 
-	0xf9, 0x27, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x3b, 0xf0, 0x00, 0xf8, 0x37, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3a, 0xf0, 0x00, 
-	0xf8, 0x09, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x4f, 0x48, 0xb5, 0x90, 0x06, 0x09, 
-	0x0e, 0x09, 0x23, 0x01, 0x60, 0x13, 0x29, 0x11, 
-	0xd1, 0x17, 0x22, 0x23, 0x49, 0x0d, 0x70, 0x0a, 
-	0x22, 0x21, 0x70, 0x4a, 0x22, 0x04, 0x80, 0x4a, 
-	0x00, 0x44, 0x18, 0x24, 0x00, 0xa4, 0x4f, 0x0a, 
-	0x5b, 0x38, 0x80, 0x88, 0xf7, 0xff, 0xff, 0x34, 
-	0x28, 0x00, 0xd0, 0x06, 0x20, 0x03, 0x19, 0xe1, 
-	0x70, 0x88, 0x20, 0x01, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x4f, 0x28, 
-	0x2e, 0x08, 0x4f, 0x48, 0xb5, 0xff, 0x06, 0x09, 
-	0x0e, 0x09, 0x27, 0x00, 0x20, 0x00, 0xb0, 0x84, 
-	0x60, 0x18, 0x1c, 0x1e, 0x98, 0x04, 0x00, 0x43, 
-	0x18, 0x18, 0x00, 0x80, 0x90, 0x03, 0x4a, 0x6a, 
-	0x92, 0x02, 0x18, 0x84, 0x25, 0x02, 0x48, 0x69, 
-	0x29, 0x12, 0xd0, 0x71, 0x9a, 0x06, 0x00, 0x53, 
-	0x18, 0x9a, 0x00, 0xd2, 0x4b, 0x66, 0x18, 0xd2, 
-	0x92, 0x01, 0x29, 0x13, 0xd0, 0x17, 0x29, 0x14, 
-	0xd0, 0x67, 0x29, 0x23, 0xd1, 0x66, 0x89, 0x82, 
-	0x99, 0x06, 0xb4, 0x04, 0x68, 0x83, 0x9d, 0x02, 
-	0x78, 0xea, 0x98, 0x05, 0xf0, 0x00, 0xf9, 0x52, 
-	0xb0, 0x01, 0x1c, 0x07, 0xd0, 0x5b, 0x89, 0xa8, 
-	0x28, 0x00, 0xd0, 0x01, 0x20, 0x01, 0x60, 0x30, 
-	0x21, 0x04, 0x70, 0xa1, 0xe0, 0x97, 0x68, 0x81, 
-	0x78, 0x4a, 0x23, 0x80, 0x40, 0x1a, 0x88, 0xc0, 
-	0x1e, 0x83, 0x04, 0x1d, 0x0c, 0x2d, 0x31, 0x02, 
-	0x91, 0x00, 0x2a, 0x80, 0xd1, 0x28, 0x88, 0xa1, 
-	0x42, 0x81, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x87, 
-	0x9c, 0x01, 0x8a, 0xa1, 0x29, 0x00, 0xd1, 0x0c, 
-	0x1c, 0x28, 0xf0, 0x03, 0xff, 0xfb, 0x61, 0x20, 
-	0x28, 0x00, 0xd0, 0xf3, 0x82, 0xa5, 0x69, 0x20, 
-	0x99, 0x00, 0x1c, 0x2a, 0xf0, 0x16, 0xff, 0x12, 
-	0xe0, 0x75, 0x19, 0x48, 0x04, 0x02, 0x0c, 0x12, 
-	0x69, 0x20, 0xf0, 0x03, 0xff, 0xf0, 0x28, 0x00, 
-	0xd0, 0xe4, 0x61, 0x20, 0x8a, 0xa1, 0x18, 0x40, 
-	0x99, 0x00, 0x1c, 0x2a, 0xf0, 0x16, 0xff, 0x02, 
-	0x8a, 0xa0, 0x19, 0x40, 0x82, 0xa0, 0xe0, 0x62, 
-	0x9e, 0x01, 0x8a, 0xb1, 0x4c, 0x3d, 0x29, 0x00, 
-	0xd1, 0x1a, 0x1c, 0x28, 0xf0, 0x03, 0xff, 0xd6, 
-	0x60, 0xa0, 0x28, 0x00, 0xd0, 0xce, 0x21, 0x23, 
-	0x70, 0x21, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, 
-	0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 0x80, 0xa1, 
-	0x78, 0xf1, 0x71, 0xa1, 0x81, 0xa5, 0x99, 0x00, 
-	0x1c, 0x2a, 0xf0, 0x16, 0xfe, 0xe3, 0xe0, 0x24, 
-	0xe0, 0x4b, 0xe0, 0x2e, 0xe0, 0x43, 0xe0, 0x42, 
-	0x19, 0x48, 0x04, 0x02, 0x0c, 0x12, 0x69, 0x30, 
-	0xf0, 0x03, 0xff, 0xbd, 0x28, 0x00, 0xd0, 0xb1, 
-	0x61, 0x30, 0x8a, 0xb1, 0x18, 0x40, 0x99, 0x00, 
-	0x1c, 0x2a, 0xf0, 0x16, 0xfe, 0xcf, 0x8a, 0xb0, 
-	0x19, 0x40, 0x82, 0xb0, 0x21, 0x23, 0x70, 0x21, 
-	0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, 0x98, 0x03, 
-	0x9a, 0x02, 0x5a, 0x10, 0x80, 0xa0, 0x78, 0xf0, 
-	0x71, 0xa0, 0x8a, 0xb0, 0x81, 0xa0, 0x69, 0x30, 
-	0x60, 0xa0, 0xf7, 0xff, 0xfe, 0x7f, 0x28, 0x00, 
-	0xd1, 0x03, 0x68, 0xa0, 0xf0, 0x03, 0xff, 0xbc, 
-	0xe0, 0x19, 0x20, 0x00, 0x82, 0xb0, 0x61, 0x30, 
-	0xe0, 0x14, 0x9a, 0x06, 0x06, 0x11, 0x0e, 0x09, 
-	0x29, 0x02, 0xd1, 0x10, 0x21, 0x23, 0x70, 0x01, 
-	0x21, 0x22, 0x70, 0x41, 0x21, 0x04, 0x80, 0x41, 
-	0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 0x80, 0x81, 
-	0xf7, 0xff, 0xfe, 0x5a, 0x28, 0x00, 0xd1, 0x00, 
-	0xe7, 0x78, 0x70, 0xa5, 0x27, 0x01, 0x1c, 0x38, 
-	0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x21, 0x23, 0x70, 0x01, 0x21, 0x22, 
-	0x70, 0x41, 0x21, 0x04, 0x80, 0x41, 0x99, 0x03, 
-	0x9a, 0x02, 0x5a, 0x51, 0x80, 0x81, 0xf7, 0xff, 
-	0xfe, 0x43, 0x28, 0x00, 0xd1, 0xe9, 0xe7, 0x61, 
-	0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x28, 
-	0x2e, 0x08, 0x4f, 0x60, 0x2e, 0x08, 0x4f, 0x38, 
-	0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, 
-	0x20, 0x00, 0x60, 0x18, 0x1c, 0x1f, 0xb0, 0x84, 
-	0x29, 0x14, 0xd0, 0x04, 0xdc, 0x09, 0x29, 0x12, 
-	0xd0, 0x01, 0x29, 0x13, 0xd1, 0x65, 0x98, 0x04, 
-	0x1c, 0x3b, 0xf7, 0xff, 0xff, 0x03, 0x1c, 0x04, 
-	0xe0, 0x6e, 0x29, 0x15, 0xd0, 0x0a, 0x29, 0x23, 
-	0xd1, 0x5b, 0x49, 0x38, 0x1c, 0x10, 0xf7, 0xff, 
-	0xfe, 0x51, 0x1c, 0x04, 0xd0, 0x64, 0x20, 0x01, 
-	0x60, 0x38, 0xe0, 0x61, 0x1c, 0x17, 0x22, 0x00, 
-	0x98, 0x04, 0x00, 0x43, 0x18, 0x18, 0x00, 0x80, 
-	0x49, 0x31, 0x18, 0x43, 0x93, 0x03, 0x72, 0x5a, 
-	0x5a, 0x0a, 0x92, 0x00, 0x9b, 0x03, 0x88, 0xd8, 
-	0x28, 0x01, 0xd0, 0x03, 0x37, 0x01, 0x2f, 0x08, 
-	0xd1, 0x00, 0x27, 0x00, 0x26, 0x00, 0x48, 0x2b, 
-	0x90, 0x01, 0x1d, 0x01, 0x91, 0x02, 0x4d, 0x2a, 
-	0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, 0x5a, 0x29, 
-	0x9a, 0x00, 0x42, 0x91, 0xd1, 0x32, 0x19, 0x40, 
-	0x89, 0x80, 0x28, 0x00, 0xdd, 0x0e, 0x22, 0x00, 
-	0xb4, 0x04, 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, 
-	0x19, 0x40, 0x78, 0xc2, 0x23, 0x00, 0x98, 0x05, 
-	0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x3f, 0x1c, 0x04, 
-	0xb0, 0x01, 0xe0, 0x26, 0x99, 0x02, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x40, 0x1c, 0x04, 0xd0, 0x19, 
-	0x98, 0x01, 0x89, 0x82, 0xb4, 0x04, 0x98, 0x02, 
-	0x68, 0x84, 0x00, 0x78, 0x19, 0xc0, 0x00, 0xc0, 
-	0x19, 0x45, 0x78, 0xea, 0x98, 0x05, 0x1c, 0x39, 
-	0x1c, 0x23, 0x1c, 0x2e, 0xf0, 0x00, 0xf8, 0x26, 
-	0x1c, 0x04, 0x89, 0xa8, 0xb0, 0x01, 0x28, 0x00, 
-	0xd1, 0x0b, 0x68, 0x70, 0xf0, 0x03, 0xff, 0x10, 
-	0xe0, 0x07, 0xe0, 0x0d, 0x36, 0x01, 0x37, 0x01, 
-	0x2f, 0x08, 0xd1, 0x00, 0x27, 0x00, 0x2e, 0x08, 
-	0xdb, 0xbe, 0x9b, 0x03, 0x7a, 0x58, 0x28, 0x00, 
-	0xd1, 0x02, 0x20, 0x03, 0x9b, 0x03, 0x70, 0x98, 
-	0x1c, 0x20, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x2c, 
-	0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x38, 
-	0x2e, 0x08, 0x4f, 0x60, 0xb5, 0xff, 0x06, 0x16, 
-	0x0e, 0x36, 0x9f, 0x09, 0x04, 0x3c, 0x0c, 0x24, 
-	0x1c, 0x18, 0x00, 0x4b, 0x18, 0x59, 0x00, 0xc9, 
-	0xb0, 0x85, 0x4a, 0x30, 0x18, 0x8f, 0x28, 0x00, 
-	0xd1, 0x02, 0x89, 0xbc, 0x68, 0xbd, 0xe0, 0x03, 
-	0x60, 0x78, 0x60, 0xb8, 0x81, 0xbc, 0x1c, 0x05, 
-	0x99, 0x05, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0x9b, 
-	0x93, 0x04, 0x1c, 0xa2, 0x49, 0x28, 0x91, 0x03, 
-	0x18, 0x59, 0x91, 0x02, 0x88, 0x89, 0x42, 0x8a, 
-	0xdd, 0x0a, 0x20, 0x80, 0x90, 0x00, 0x1e, 0x88, 
-	0x04, 0x04, 0x0c, 0x24, 0x19, 0x28, 0x60, 0xb8, 
-	0x89, 0xb8, 0x1b, 0x00, 0x81, 0xb8, 0xe0, 0x09, 
-	0x21, 0x00, 0x91, 0x00, 0x81, 0xb9, 0x28, 0x00, 
-	0xd1, 0x04, 0x68, 0x78, 0xf0, 0x03, 0xfe, 0xbc, 
-	0x21, 0x00, 0x60, 0x79, 0x1c, 0xa0, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x01, 0xf0, 0x03, 0xfe, 0x8e, 
-	0x4f, 0x18, 0x60, 0xb8, 0x1c, 0x01, 0xd1, 0x01, 
-	0x20, 0x00, 0xe0, 0x22, 0x20, 0x21, 0x70, 0x38, 
-	0x20, 0x13, 0x70, 0x78, 0x20, 0x08, 0x80, 0x78, 
-	0x98, 0x04, 0x9a, 0x03, 0x5a, 0x10, 0x80, 0xb8, 
-	0x98, 0x01, 0x80, 0xf8, 0x70, 0x0e, 0x98, 0x00, 
-	0x68, 0xb9, 0x70, 0x48, 0x68, 0xb8, 0x30, 0x02, 
-	0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x16, 0xfd, 0x92, 
-	0xf7, 0xff, 0xfd, 0x54, 0x28, 0x00, 0xd1, 0x03, 
-	0x68, 0xb8, 0xf0, 0x03, 0xfe, 0x91, 0xe7, 0xdf, 
-	0x99, 0x02, 0x72, 0x0e, 0x20, 0x01, 0x99, 0x02, 
-	0x72, 0x48, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x4f, 0x60, 
-	0x2e, 0x08, 0x4f, 0x48, 0x2e, 0x08, 0x4f, 0x38, 
-	0xb5, 0xf0, 0x4d, 0x15, 0x69, 0x68, 0x28, 0x00, 
-	0xd1, 0x06, 0x20, 0xff, 0x30, 0x01, 0xf0, 0x03, 
-	0xfe, 0x51, 0x61, 0x68, 0x28, 0x00, 0xd0, 0x11, 
-	0x27, 0x00, 0x4c, 0x10, 0x21, 0x01, 0x01, 0x3e, 
-	0x19, 0x30, 0x81, 0x01, 0x21, 0x00, 0x60, 0xc1, 
-	0x20, 0x00, 0x1c, 0x39, 0xf0, 0x05, 0xf9, 0x90, 
-	0x04, 0x00, 0x0c, 0x00, 0x53, 0xa0, 0x04, 0x00, 
-	0x14, 0x00, 0xd5, 0x04, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x37, 0x01, 
-	0x2f, 0x02, 0xdb, 0xe7, 0x21, 0x00, 0x82, 0x29, 
-	0x20, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, 
-	0xb5, 0xf7, 0x04, 0x01, 0x0c, 0x09, 0x04, 0x16, 
-	0x0c, 0x36, 0x27, 0x00, 0x48, 0x12, 0x01, 0x3a, 
-	0x5a, 0x82, 0x42, 0x8a, 0xd0, 0x02, 0x37, 0x01, 
-	0x2f, 0x02, 0xdb, 0xf8, 0x2f, 0x02, 0xda, 0x17, 
-	0x24, 0x00, 0x99, 0x01, 0x1c, 0x38, 0x1c, 0x32, 
-	0xf0, 0x00, 0xf9, 0xd6, 0x1c, 0x05, 0x28, 0x02, 
-	0xd1, 0x05, 0x20, 0x14, 0xf0, 0x03, 0xfe, 0x3e, 
-	0x34, 0x01, 0x2c, 0x0a, 0xd0, 0x08, 0x2d, 0x02, 
-	0xd0, 0xef, 0x2d, 0x00, 0xd1, 0x04, 0x20, 0x00, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x43, 0xc0, 0xe7, 0xf8, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x4f, 0x14, 
-	0x26, 0x00, 0x69, 0x78, 0x28, 0x00, 0xd0, 0x02, 
-	0xf0, 0x03, 0xfe, 0x1a, 0x61, 0x7e, 0x24, 0x00, 
-	0x4d, 0x10, 0x01, 0x27, 0x5b, 0xe8, 0x28, 0x00, 
-	0xdd, 0x02, 0xf0, 0x05, 0xf9, 0xe7, 0x53, 0xee, 
-	0x19, 0x78, 0x68, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, 
-	0x68, 0x38, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x38, 
-	0x68, 0x3f, 0xf0, 0x03, 0xfe, 0x05, 0x68, 0x38, 
-	0x28, 0x00, 0xd1, 0xf8, 0x1c, 0x38, 0xf0, 0x03, 
-	0xfd, 0xff, 0x34, 0x01, 0x2c, 0x02, 0xdb, 0xe4, 
-	0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x20, 0x03, 0x1c, 0x0d, 
-	0x01, 0x39, 0x1c, 0x14, 0x4a, 0x12, 0x18, 0x8e, 
-	0x81, 0x30, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x22, 
-	0x28, 0x00, 0xd1, 0x10, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0x6d, 0x28, 0x00, 0xd0, 0x04, 0x28, 0x07, 
-	0xd1, 0x12, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x00, 
-	0xf8, 0xb3, 0x28, 0x00, 0xd0, 0x04, 0x20, 0x01, 
-	0x81, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x27, 0x01, 
-	0xb0, 0x81, 0xab, 0x00, 0x70, 0x1f, 0x01, 0x05, 
-	0x4c, 0x15, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x06, 
-	0xf0, 0x05, 0xf9, 0x56, 0x28, 0x00, 0xdd, 0x1d, 
-	0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0x19, 
-	0x27, 0x00, 0x20, 0x02, 0xab, 0x00, 0x70, 0x18, 
-	0x26, 0x06, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x06, 
-	0xf0, 0x05, 0xf9, 0x46, 0x28, 0x00, 0xdb, 0x05, 
-	0x20, 0x14, 0xf0, 0x03, 0xfd, 0xaf, 0x37, 0x01, 
-	0x2f, 0x0a, 0xd1, 0x01, 0x1c, 0x30, 0xe0, 0x06, 
-	0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0xec, 
-	0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x50, 0xb5, 0x80, 0x27, 0x01, 
-	0xb0, 0x81, 0xab, 0x00, 0x70, 0x1f, 0x01, 0x00, 
-	0x49, 0x09, 0x5a, 0x08, 0x46, 0x6a, 0x21, 0x06, 
-	0xf0, 0x05, 0xf9, 0x22, 0x28, 0x00, 0xdd, 0x05, 
-	0xa8, 0x00, 0x78, 0x40, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x01, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x27, 0x00, 
-	0x26, 0x06, 0x01, 0x05, 0xb0, 0xff, 0xb0, 0x87, 
-	0x4c, 0x24, 0x20, 0x00, 0xab, 0x00, 0x80, 0x18, 
-	0x20, 0x01, 0x02, 0x40, 0x80, 0x58, 0xa8, 0x05, 
-	0x90, 0x01, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x02, 
-	0xf0, 0x05, 0xf8, 0xfe, 0x28, 0x00, 0xda, 0x01, 
-	0x1c, 0x30, 0xe0, 0x2f, 0xa9, 0x02, 0x88, 0x09, 
-	0xa8, 0x05, 0xaa, 0x03, 0xab, 0x04, 0xf0, 0x00, 
-	0xfa, 0x73, 0x28, 0x00, 0xda, 0x2b, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0x20, 0xc8, 0xf0, 0x03, 
-	0xfd, 0x59, 0x2f, 0x0a, 0xdb, 0xdd, 0x2f, 0x0a, 
-	0xd0, 0xea, 0xa8, 0x03, 0x88, 0x00, 0xab, 0x00, 
-	0x80, 0x18, 0x27, 0x01, 0x80, 0x5f, 0xa8, 0x04, 
-	0x90, 0x01, 0x5b, 0x60, 0x46, 0x6a, 0x21, 0x03, 
-	0xf0, 0x05, 0xf8, 0xda, 0x28, 0x00, 0xdb, 0xdb, 
-	0xa8, 0x02, 0x88, 0x00, 0x28, 0x01, 0xd1, 0xd7, 
-	0xab, 0x85, 0x70, 0x5f, 0x27, 0x00, 0x70, 0x1f, 
-	0x5b, 0x60, 0x21, 0x07, 0xaa, 0x85, 0xf0, 0x05, 
-	0xf8, 0xcb, 0x1c, 0x38, 0xb0, 0x7f, 0xb0, 0x07, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x27, 0x00, 
-	0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, 
-	0xb5, 0xf7, 0x1c, 0x07, 0x20, 0x00, 0xb0, 0x84, 
-	0x4c, 0x5b, 0x70, 0x20, 0xab, 0x00, 0x70, 0x58, 
-	0x70, 0x18, 0x01, 0x38, 0x49, 0x59, 0x5a, 0x08, 
-	0x46, 0x6a, 0x21, 0x07, 0xf0, 0x05, 0xf8, 0xb0, 
-	0x28, 0x00, 0xdb, 0x2f, 0x1d, 0x22, 0x92, 0x03, 
-	0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x04, 
-	0x28, 0x01, 0xd0, 0x27, 0x78, 0x20, 0x23, 0x08, 
-	0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xd3, 0x28, 0x01, 
-	0xd0, 0x1c, 0x78, 0x20, 0x23, 0xf7, 0x40, 0x18, 
-	0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0xc8, 0x28, 0x01, 0xd0, 0x11, 
-	0x21, 0x01, 0x9a, 0x03, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf9, 0xe7, 0x28, 0x01, 0xd0, 0x0a, 0x78, 0x20, 
-	0x23, 0x04, 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 
-	0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0xb6, 
-	0x28, 0x01, 0xd1, 0x01, 0x20, 0x05, 0xe0, 0x71, 
-	0x25, 0x00, 0x23, 0x01, 0x1c, 0x38, 0xa9, 0x02, 
-	0xaa, 0x01, 0xf0, 0x00, 0xf9, 0x33, 0x1c, 0x06, 
-	0x28, 0x01, 0xd0, 0xf3, 0x20, 0x14, 0xf0, 0x03, 
-	0xfc, 0xdd, 0x35, 0x01, 0x2d, 0x0a, 0xd0, 0xed, 
-	0x2e, 0x03, 0xd0, 0xee, 0x2e, 0x02, 0xd0, 0xec, 
-	0xa8, 0x02, 0x78, 0x00, 0x02, 0x00, 0xa9, 0x02, 
-	0x78, 0x49, 0x18, 0x40, 0x9a, 0x06, 0x60, 0x10, 
-	0x99, 0x05, 0x42, 0x88, 0xd9, 0x08, 0x99, 0x05, 
-	0x0a, 0x08, 0xab, 0x02, 0x70, 0x18, 0x99, 0x05, 
-	0x70, 0x59, 0x99, 0x05, 0x9a, 0x06, 0x60, 0x11, 
-	0x78, 0x20, 0x23, 0xfb, 0x40, 0x18, 0x70, 0x20, 
-	0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf9, 0x81, 0x28, 0x01, 0xd0, 0x0a, 0x78, 0x20, 
-	0x23, 0x02, 0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 
-	0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x76, 
-	0x28, 0x01, 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x31, 
-	0x25, 0x00, 0x22, 0x02, 0x1c, 0x38, 0xa9, 0x02, 
-	0xf0, 0x00, 0xf8, 0x36, 0x1c, 0x06, 0x28, 0x01, 
-	0xd0, 0xb4, 0x20, 0x14, 0xf0, 0x03, 0xfc, 0x9e, 
-	0x35, 0x01, 0x2d, 0x0a, 0xd0, 0xae, 0x2e, 0x02, 
-	0xd0, 0xef, 0x78, 0x20, 0x23, 0xfd, 0x40, 0x18, 
-	0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x58, 0x28, 0x01, 0xd0, 0xe1, 
-	0x25, 0x00, 0x21, 0x01, 0x9a, 0x03, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x76, 0x28, 0x01, 0xd0, 0x99, 
-	0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, 
-	0x20, 0x14, 0xf0, 0x03, 0xfc, 0x7f, 0x35, 0x01, 
-	0x2d, 0x0a, 0xd0, 0x8f, 0x79, 0x20, 0x09, 0xc0, 
-	0xd3, 0xeb, 0x20, 0x00, 0xb0, 0x04, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x54, 0x2e, 0x08, 0x54, 0x50, 
-	0xb5, 0xf7, 0x04, 0x15, 0x0c, 0x2d, 0x1c, 0x07, 
-	0x01, 0x00, 0xb0, 0x82, 0x90, 0x01, 0x49, 0x3d, 
-	0x91, 0x00, 0x18, 0x40, 0x89, 0x00, 0x28, 0x01, 
-	0xd0, 0x07, 0x4a, 0x3b, 0x21, 0x01, 0x1c, 0x38, 
-	0x1c, 0x16, 0xf0, 0x00, 0xf9, 0x49, 0x28, 0x01, 
-	0xd1, 0x01, 0x20, 0x01, 0xe0, 0x64, 0x4c, 0x37, 
-	0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, 
-	0x79, 0x20, 0x0a, 0x00, 0xd3, 0x02, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x66, 0x21, 0x01, 0x1c, 0x38, 
-	0x1c, 0x32, 0xf0, 0x00, 0xf9, 0x35, 0x28, 0x01, 
-	0xd0, 0xeb, 0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 
-	0x71, 0x20, 0x79, 0x20, 0x09, 0xc0, 0xd2, 0x01, 
-	0x20, 0x02, 0xe0, 0x49, 0x78, 0x20, 0x23, 0x01, 
-	0x43, 0x18, 0x70, 0x20, 0x78, 0x22, 0x21, 0x01, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xfb, 0x28, 0x01, 
-	0xd0, 0xd7, 0x06, 0x2a, 0x0e, 0x12, 0x21, 0x02, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf3, 0x28, 0x01, 
-	0xd0, 0xcf, 0x0a, 0x2a, 0x21, 0x03, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xec, 0x28, 0x01, 0xd0, 0xc8, 
-	0x98, 0x01, 0x99, 0x00, 0x5a, 0x08, 0x9a, 0x03, 
-	0x1c, 0x29, 0xf0, 0x04, 0xff, 0x55, 0x42, 0xa8, 
-	0xd1, 0xbf, 0x21, 0x01, 0x1c, 0x38, 0x1c, 0x32, 
-	0xf0, 0x00, 0xf9, 0x02, 0x28, 0x01, 0xd0, 0xb8, 
-	0x79, 0x20, 0x23, 0xc3, 0x40, 0x18, 0x71, 0x20, 
-	0x79, 0x20, 0x08, 0x80, 0xd3, 0x0c, 0x78, 0x20, 
-	0x23, 0xfe, 0x40, 0x18, 0x70, 0x20, 0x78, 0x22, 
-	0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xca, 
-	0x28, 0x01, 0xd0, 0xa6, 0x20, 0x04, 0xe0, 0x0b, 
-	0x78, 0x20, 0x23, 0xfe, 0x40, 0x18, 0x70, 0x20, 
-	0x78, 0x22, 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0xbd, 0x28, 0x01, 0xd0, 0x99, 0x20, 0x00, 
-	0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, 
-	0x2e, 0x08, 0x1a, 0x58, 0x2e, 0x08, 0x1a, 0x54, 
-	0xb5, 0xf0, 0xb0, 0x81, 0x46, 0x6a, 0x1c, 0x07, 
-	0x4e, 0x16, 0x25, 0x00, 0x69, 0x71, 0x1c, 0x2b, 
-	0xf0, 0x00, 0xf8, 0x2c, 0x28, 0x00, 0xd1, 0x21, 
-	0xa8, 0x00, 0x88, 0x00, 0x30, 0x07, 0x04, 0x00, 
-	0x0c, 0x00, 0xf0, 0x03, 0xfb, 0xa3, 0x1c, 0x04, 
-	0xd0, 0x18, 0xa8, 0x00, 0x60, 0x25, 0x88, 0x00, 
-	0x80, 0xa0, 0xaa, 0x00, 0x88, 0x12, 0x69, 0x71, 
-	0x1d, 0xa0, 0xf0, 0x16, 0xfa, 0xb7, 0x01, 0x38, 
-	0x49, 0x09, 0x18, 0x40, 0x68, 0xc1, 0x29, 0x00, 
-	0xd1, 0x01, 0x60, 0xc4, 0xe0, 0x06, 0x68, 0x08, 
-	0x28, 0x00, 0xd0, 0x03, 0x68, 0x09, 0x68, 0x08, 
-	0x28, 0x00, 0xd1, 0xfb, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x54, 
-	0x2e, 0x08, 0x54, 0x50, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x01, 0x00, 0xb0, 0x83, 0x90, 0x02, 0x1c, 0x14, 
-	0x1c, 0x0d, 0x49, 0x32, 0x91, 0x01, 0x18, 0x46, 
-	0x89, 0x30, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x01, 
-	0xe0, 0x58, 0x2b, 0x00, 0xd0, 0x12, 0x68, 0xf0, 
-	0x28, 0x00, 0xd0, 0x0f, 0x88, 0x82, 0x1d, 0x81, 
-	0x1c, 0x28, 0xf0, 0x16, 0xfa, 0x87, 0x68, 0xf0, 
-	0x88, 0x80, 0x80, 0x20, 0x68, 0xf0, 0x1c, 0x01, 
-	0x68, 0x00, 0x60, 0xf0, 0x1c, 0x08, 0xf0, 0x03, 
-	0xfb, 0x83, 0xe0, 0x42, 0x4a, 0x24, 0x92, 0x00, 
-	0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x74, 
-	0x28, 0x01, 0xd0, 0xe0, 0x4e, 0x21, 0x79, 0x30, 
-	0x23, 0xc3, 0x40, 0x18, 0x71, 0x30, 0x79, 0x30, 
-	0x0a, 0x00, 0xd2, 0x01, 0x20, 0x03, 0xe0, 0x31, 
-	0x4a, 0x1d, 0x21, 0x02, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0x63, 0x28, 0x01, 0xd0, 0xcf, 0x4a, 0x1b, 
-	0x21, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x5c, 
-	0x28, 0x01, 0xd0, 0xc8, 0x7b, 0x30, 0x02, 0x00, 
-	0x7a, 0x31, 0x18, 0x40, 0x80, 0x20, 0x88, 0x20, 
-	0x4b, 0x15, 0x42, 0x98, 0xd0, 0xbf, 0x23, 0xff, 
-	0x33, 0x01, 0x42, 0x98, 0xdc, 0xbb, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfd, 0xc0, 0x28, 0x01, 0xd0, 0xb6, 
-	0x98, 0x02, 0x99, 0x01, 0x5a, 0x08, 0x88, 0x21, 
-	0x1c, 0x2a, 0xf0, 0x04, 0xfe, 0xb3, 0x88, 0x21, 
-	0x42, 0x88, 0xd1, 0xac, 0x21, 0x01, 0x9a, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x39, 0x28, 0x01, 
-	0xd0, 0xa5, 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x50, 
-	0x2e, 0x08, 0x1a, 0x58, 0x2e, 0x08, 0x1a, 0x54, 
-	0x2e, 0x08, 0x1a, 0x5c, 0x2e, 0x08, 0x1a, 0x60, 
-	0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0xb0, 0x81, 
-	0xab, 0x00, 0x70, 0x1a, 0x1c, 0x0c, 0x1c, 0x07, 
-	0xb0, 0x82, 0xf7, 0xff, 0xfd, 0x93, 0x25, 0x01, 
-	0x28, 0x01, 0xd1, 0x01, 0x1c, 0x28, 0xe0, 0x11, 
-	0xab, 0x00, 0x80, 0x1c, 0xa8, 0x02, 0x90, 0x01, 
-	0x01, 0x3c, 0x4f, 0x08, 0x5b, 0x38, 0x46, 0x6a, 
-	0x21, 0x05, 0xf0, 0x04, 0xfe, 0xb1, 0x28, 0x00, 
-	0xda, 0x03, 0x19, 0xe1, 0x81, 0x0d, 0x1c, 0x28, 
-	0xe0, 0x00, 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x50, 
-	0xb5, 0xf0, 0x1c, 0x14, 0x1c, 0x0d, 0x1c, 0x07, 
-	0xb0, 0x82, 0xf7, 0xff, 0xfd, 0x6f, 0x26, 0x01, 
-	0x28, 0x01, 0xd1, 0x01, 0x1c, 0x30, 0xe0, 0x10, 
-	0xab, 0x00, 0x80, 0x1d, 0x94, 0x01, 0x01, 0x3c, 
-	0x4f, 0x08, 0x5b, 0x38, 0x46, 0x6a, 0x21, 0x04, 
-	0xf0, 0x04, 0xfe, 0x8e, 0x28, 0x00, 0xda, 0x03, 
-	0x19, 0xe1, 0x81, 0x0e, 0x1c, 0x30, 0xe0, 0x00, 
-	0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x50, 
-	0xb5, 0xb0, 0xb0, 0x86, 0x90, 0x05, 0x91, 0x04, 
-	0x20, 0x00, 0x90, 0x01, 0x1c, 0x14, 0x46, 0x6a, 
-	0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 
-	0xb4, 0x04, 0x1c, 0x1f, 0x21, 0x1d, 0x20, 0x00, 
-	0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x82, 
-	0x25, 0x00, 0x43, 0xed, 0xb0, 0x04, 0x28, 0x00, 
-	0xdb, 0x3b, 0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, 
-	0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, 0x21, 0x1c, 
-	0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 
-	0xf8, 0x71, 0xb0, 0x04, 0x28, 0x00, 0xdb, 0x2c, 
-	0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 
-	0xaa, 0x06, 0xb4, 0x04, 0x21, 0x15, 0x20, 0x00, 
-	0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x62, 
-	0xb0, 0x04, 0x28, 0x00, 0xdb, 0x1d, 0x46, 0x6a, 
-	0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 
-	0xb4, 0x04, 0x21, 0x20, 0x20, 0x00, 0xaa, 0x09, 
-	0xab, 0x08, 0xf0, 0x00, 0xf8, 0x53, 0xb0, 0x04, 
-	0x28, 0x00, 0xdb, 0x0e, 0x46, 0x6a, 0xa8, 0x02, 
-	0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, 
-	0x21, 0x1a, 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, 
-	0xf0, 0x00, 0xf8, 0x44, 0xb0, 0x04, 0x28, 0x00, 
-	0xda, 0x01, 0x1c, 0x28, 0xe0, 0x3a, 0x98, 0x02, 
-	0x80, 0x20, 0x20, 0x01, 0x90, 0x03, 0x43, 0xc4, 
-	0x46, 0x6a, 0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 
-	0xaa, 0x06, 0xb4, 0x04, 0x21, 0x1b, 0x20, 0x00, 
-	0xaa, 0x09, 0xab, 0x08, 0xf0, 0x00, 0xf8, 0x2e, 
-	0xb0, 0x04, 0x28, 0x00, 0xd0, 0xf0, 0x42, 0xa0, 
-	0xd0, 0xee, 0x28, 0x00, 0xdb, 0xe5, 0x46, 0x6a, 
-	0xa8, 0x02, 0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 
-	0xb4, 0x04, 0x21, 0x14, 0x20, 0x00, 0xaa, 0x09, 
-	0xab, 0x08, 0xf0, 0x00, 0xf8, 0x1b, 0xb0, 0x04, 
-	0x28, 0x00, 0xdb, 0xd6, 0x46, 0x6a, 0xa8, 0x02, 
-	0xa9, 0x01, 0xb4, 0x07, 0xaa, 0x06, 0xb4, 0x04, 
-	0x21, 0xff, 0x20, 0x00, 0xaa, 0x09, 0xab, 0x08, 
-	0xf0, 0x00, 0xf8, 0x0c, 0xb0, 0x04, 0x28, 0x00, 
-	0xdb, 0xc7, 0x98, 0x01, 0x28, 0x0f, 0xd1, 0xc4, 
-	0x70, 0x38, 0x20, 0x01, 0xb0, 0x06, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x06, 0x08, 
-	0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x25, 0x00, 
-	0x24, 0x00, 0x26, 0x00, 0x1c, 0x17, 0x22, 0x00, 
-	0x21, 0x00, 0xb0, 0x87, 0x91, 0x04, 0x98, 0x07, 
-	0x28, 0xff, 0xd1, 0x0b, 0x68, 0x38, 0x78, 0x00, 
-	0x28, 0xff, 0xd1, 0x07, 0x9b, 0x0d, 0x68, 0x18, 
-	0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x9b, 0x0d, 
-	0x60, 0x18, 0xe1, 0x87, 0x68, 0x38, 0x78, 0x01, 
-	0x78, 0x43, 0x93, 0x05, 0x30, 0x02, 0x32, 0x02, 
-	0x60, 0x38, 0x92, 0x06, 0x9a, 0x07, 0x42, 0x8a, 
-	0xd1, 0x5b, 0x21, 0x01, 0x91, 0x04, 0x9a, 0x07, 
-	0x2a, 0x1b, 0xd0, 0x57, 0xdc, 0x0b, 0x2a, 0x14, 
-	0xd0, 0x5a, 0x2a, 0x15, 0xd0, 0x11, 0x2a, 0x1a, 
-	0xd1, 0x4f, 0x78, 0x02, 0x07, 0x91, 0x0f, 0x89, 
-	0x29, 0x01, 0xdd, 0x14, 0xe0, 0x10, 0x2a, 0xc0, 
-	0xd0, 0x73, 0x2a, 0xc1, 0xd1, 0x45, 0xa1, 0xb6, 
-	0xf0, 0x16, 0xf9, 0x4c, 0x28, 0x00, 0xd1, 0x07, 
-	0xe1, 0x47, 0x78, 0x01, 0x29, 0x05, 0xd1, 0x03, 
-	0x78, 0x40, 0x28, 0x00, 0xd1, 0x00, 0xe1, 0x40, 
-	0x20, 0x00, 0x43, 0xc0, 0xe1, 0x56, 0x23, 0x3c, 
-	0x40, 0x1a, 0x78, 0x40, 0x9b, 0x16, 0x60, 0x18, 
-	0x29, 0x00, 0xd1, 0x02, 0x68, 0x38, 0x78, 0x80, 
-	0xe0, 0x04, 0x68, 0x38, 0x78, 0x83, 0x78, 0xc0, 
-	0x02, 0x00, 0x18, 0x18, 0x9b, 0x14, 0x60, 0x18, 
-	0x98, 0x14, 0x68, 0x00, 0x4b, 0xa8, 0x42, 0x98, 
-	0xdc, 0xe6, 0x68, 0x38, 0x18, 0x43, 0x78, 0xdb, 
-	0x08, 0x5b, 0xd3, 0xe1, 0x18, 0x89, 0x31, 0x04, 
-	0x18, 0x40, 0x90, 0x02, 0x9b, 0x0d, 0x68, 0x18, 
-	0x9a, 0x06, 0x1a, 0x80, 0x9a, 0x05, 0x1a, 0x51, 
-	0x1a, 0x40, 0x90, 0x03, 0xaa, 0x14, 0xca, 0x07, 
-	0xb4, 0x07, 0x9a, 0x16, 0xb4, 0x04, 0x21, 0xc0, 
-	0x98, 0x0b, 0xaa, 0x06, 0xab, 0x07, 0xf7, 0xff, 
-	0xff, 0x81, 0xb0, 0x04, 0x28, 0x00, 0xdb, 0xc7, 
-	0xe1, 0x07, 0xe1, 0x06, 0x78, 0x00, 0x09, 0x81, 
-	0x07, 0x89, 0xd1, 0x02, 0x21, 0x01, 0xe0, 0x01, 
-	0xe0, 0xc1, 0x21, 0x00, 0x9a, 0x13, 0x68, 0x12, 
-	0x40, 0x11, 0xd1, 0xb9, 0x23, 0xc0, 0x43, 0xdb, 
-	0x40, 0x18, 0x90, 0x00, 0x28, 0x0f, 0xd1, 0x01, 
-	0x99, 0x15, 0x60, 0x08, 0x20, 0x00, 0x99, 0x13, 
-	0x60, 0x08, 0x68, 0x39, 0x78, 0x08, 0x0a, 0x00, 
-	0xd3, 0x73, 0x78, 0x48, 0x28, 0x04, 0xd1, 0x71, 
-	0x78, 0x8a, 0x92, 0x09, 0x20, 0x0b, 0x40, 0x10, 
-	0xd0, 0x6d, 0x78, 0xcb, 0x20, 0x00, 0x22, 0x00, 
-	0x08, 0x5e, 0xd3, 0x00, 0x30, 0x01, 0x10, 0x5b, 
-	0xe0, 0x00, 0xe0, 0xa1, 0x06, 0x1b, 0x0e, 0x1b, 
-	0x32, 0x01, 0x2a, 0x08, 0xdb, 0xf4, 0x22, 0x04, 
-	0x1c, 0xc3, 0x2b, 0x04, 0xdb, 0x07, 0x5c, 0x8e, 
-	0x0a, 0x33, 0xd3, 0x00, 0x30, 0x01, 0x32, 0x01, 
-	0x1c, 0xc3, 0x42, 0x93, 0xda, 0xf7, 0x9a, 0x09, 
-	0x30, 0x01, 0x08, 0xd2, 0xd3, 0x25, 0x18, 0x0b, 
-	0x78, 0xda, 0x92, 0x08, 0x07, 0x92, 0x0f, 0x92, 
-	0x1c, 0x1e, 0x2a, 0x03, 0xd0, 0x09, 0x22, 0x00, 
-	0x79, 0x35, 0x0a, 0x2b, 0xd3, 0x04, 0x32, 0x01, 
-	0x18, 0xb3, 0x79, 0x1d, 0x0a, 0x2b, 0xd2, 0xfa, 
-	0x1c, 0x55, 0x23, 0x1c, 0x9a, 0x08, 0x40, 0x1a, 
-	0x2a, 0x1c, 0xd0, 0x0b, 0x22, 0x00, 0x19, 0x73, 
-	0x79, 0x1c, 0x1c, 0x1e, 0x0a, 0x23, 0xd3, 0x04, 
-	0x32, 0x01, 0x18, 0xb3, 0x79, 0x1c, 0x0a, 0x23, 
-	0xd2, 0xfa, 0x1c, 0x54, 0x19, 0x40, 0x19, 0x00, 
-	0x30, 0x01, 0x9a, 0x09, 0x09, 0x12, 0xd3, 0x0e, 
-	0x18, 0x0a, 0x78, 0xd6, 0x0a, 0x33, 0xd3, 0x09, 
-	0x79, 0x12, 0x23, 0xc0, 0x40, 0x13, 0x09, 0x9d, 
-	0x23, 0x30, 0x40, 0x1a, 0x09, 0x14, 0x19, 0x40, 
-	0x19, 0x00, 0x30, 0x01, 0x30, 0x01, 0x9a, 0x09, 
-	0x09, 0x52, 0xd3, 0x05, 0x18, 0x0a, 0x78, 0xd2, 
-	0x09, 0x52, 0xd3, 0x00, 0x30, 0x02, 0x30, 0x01, 
-	0x9a, 0x09, 0x09, 0x52, 0x07, 0x92, 0xd0, 0x11, 
-	0x18, 0x0a, 0x78, 0xd2, 0x23, 0x18, 0x40, 0x13, 
-	0x08, 0xdd, 0x23, 0x60, 0x40, 0x13, 0x09, 0x5c, 
-	0xe0, 0x02, 0xe0, 0x2c, 0xe0, 0x2b, 0xe0, 0x2a, 
-	0x0a, 0x12, 0xd3, 0x00, 0x00, 0x64, 0x19, 0x40, 
-	0x19, 0x00, 0x30, 0x01, 0x30, 0x03, 0x18, 0x09, 
-	0x91, 0x02, 0x9b, 0x0d, 0x68, 0x19, 0x9a, 0x06, 
-	0x1a, 0x89, 0x1a, 0x08, 0x90, 0x03, 0xaa, 0x14, 
-	0xca, 0x07, 0xb4, 0x07, 0x9a, 0x16, 0xb4, 0x04, 
-	0x21, 0xc0, 0x98, 0x0b, 0xaa, 0x06, 0xab, 0x07, 
-	0xf7, 0xff, 0xfe, 0xd0, 0xb0, 0x04, 0x28, 0x00, 
-	0xdb, 0x0d, 0xaa, 0x14, 0xca, 0x07, 0xb4, 0x07, 
-	0x9a, 0x16, 0xb4, 0x04, 0x21, 0xc1, 0x98, 0x0b, 
-	0xaa, 0x06, 0xab, 0x07, 0xf7, 0xff, 0xfe, 0xc2, 
-	0xb0, 0x04, 0x28, 0x00, 0xda, 0x02, 0x26, 0x01, 
-	0x43, 0xf6, 0xe0, 0x46, 0x98, 0x00, 0x9a, 0x16, 
-	0x68, 0x11, 0x42, 0x88, 0xd1, 0x01, 0x26, 0x01, 
-	0xe0, 0x3f, 0x26, 0x00, 0xe0, 0x3d, 0x9a, 0x05, 
-	0x2a, 0x00, 0xd0, 0x00, 0xe6, 0xf8, 0xe0, 0x38, 
-	0x99, 0x0a, 0x29, 0x1b, 0xd1, 0x05, 0xa1, 0x2f, 
-	0xf0, 0x16, 0xf8, 0x34, 0x28, 0x00, 0xd1, 0xf5, 
-	0xe0, 0x2f, 0x9a, 0x05, 0x2a, 0x0e, 0xd1, 0xf1, 
-	0x78, 0x01, 0x29, 0x41, 0xd1, 0xee, 0x78, 0x40, 
-	0x28, 0x02, 0xd1, 0xeb, 0xa0, 0x2a, 0xf0, 0x16, 
-	0xf8, 0x51, 0x90, 0x01, 0x68, 0x38, 0x9a, 0x01, 
-	0x30, 0x02, 0xa1, 0x27, 0xf0, 0x16, 0xf8, 0x6c, 
-	0x28, 0x00, 0xd1, 0xdf, 0x68, 0x38, 0x9a, 0x01, 
-	0x18, 0x80, 0x78, 0x80, 0xf0, 0x00, 0xf8, 0x4a, 
-	0x28, 0x00, 0xd0, 0xd7, 0x68, 0x38, 0x9a, 0x01, 
-	0x18, 0x80, 0x78, 0xc1, 0x29, 0x2e, 0xd1, 0xd1, 
-	0x79, 0x00, 0xf0, 0x00, 0xf8, 0x3f, 0x28, 0x00, 
-	0xd0, 0xcc, 0x68, 0x38, 0x9a, 0x01, 0x18, 0x80, 
-	0x79, 0x40, 0xf0, 0x00, 0xf8, 0x37, 0x28, 0x00, 
-	0xd0, 0xc4, 0x9a, 0x06, 0x9b, 0x05, 0x18, 0xd2, 
-	0x9b, 0x0d, 0x68, 0x18, 0x42, 0x82, 0xda, 0xbd, 
-	0x68, 0x38, 0x9b, 0x05, 0x18, 0xc0, 0x60, 0x38, 
-	0x9b, 0x0d, 0x68, 0x18, 0x1a, 0x80, 0x60, 0x18, 
-	0x99, 0x04, 0x29, 0x00, 0xd1, 0x00, 0xe6, 0x6e, 
-	0x98, 0x07, 0x28, 0x1b, 0xd1, 0x01, 0x1c, 0x30, 
-	0xe0, 0x00, 0x20, 0x01, 0xb0, 0x0a, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x4d, 
-	0x4f, 0x44, 0x55, 0x4c, 0x45, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x0f, 0xfe, 0x44, 0x56, 0x42, 0x5f, 
-	0x48, 0x4f, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 
-	0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x56, 
-	0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x0e, 0x09, 
-	0x22, 0xf0, 0x40, 0x0a, 0x20, 0x00, 0x2a, 0x30, 
-	0xd1, 0x04, 0x07, 0x09, 0x0f, 0x09, 0x29, 0x09, 
-	0xdc, 0x00, 0x20, 0x01, 0x47, 0x70, 0xb5, 0xf3, 
-	0x26, 0x00, 0x1c, 0x07, 0xb0, 0x85, 0x48, 0x4f, 
-	0x90, 0x04, 0x23, 0x10, 0x5e, 0xc0, 0x22, 0x08, 
-	0x92, 0x01, 0x01, 0x01, 0x91, 0x03, 0x4a, 0x4c, 
-	0x92, 0x02, 0x18, 0x8d, 0x89, 0x29, 0x4c, 0x4b, 
-	0x29, 0x02, 0xd1, 0x47, 0x46, 0x6a, 0x23, 0x01, 
-	0x1d, 0xf9, 0x31, 0x01, 0xf7, 0xff, 0xfc, 0xc2, 
-	0x1c, 0x01, 0xd0, 0x16, 0x20, 0x04, 0x22, 0x03, 
-	0x29, 0x01, 0xd0, 0x2b, 0x29, 0x04, 0xd1, 0x6e, 
-	0x70, 0x22, 0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, 
-	0x5a, 0x50, 0x80, 0xa0, 0x21, 0x02, 0x71, 0xa1, 
-	0x22, 0x08, 0x99, 0x06, 0x80, 0x0a, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x15, 0xff, 0x4b, 0x26, 0x03, 
-	0xe0, 0x5d, 0x21, 0x02, 0x70, 0x21, 0xa8, 0x00, 
-	0x88, 0x00, 0x30, 0x07, 0x04, 0x00, 0x0c, 0x00, 
-	0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 
-	0x80, 0xa1, 0xa9, 0x00, 0x88, 0x09, 0x80, 0xe1, 
-	0x30, 0x04, 0x99, 0x06, 0x80, 0x08, 0x9a, 0x01, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x32, 
-	0x26, 0x02, 0xe0, 0x44, 0x81, 0x2a, 0x70, 0x20, 
-	0x80, 0x60, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x50, 
-	0x80, 0xa0, 0x22, 0x08, 0x99, 0x06, 0x80, 0x0a, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x22, 
-	0x26, 0x04, 0xe0, 0x34, 0x21, 0xff, 0x31, 0x01, 
-	0x1d, 0x2a, 0xf7, 0xff, 0xfa, 0x2d, 0x1c, 0x01, 
-	0x20, 0x0c, 0x29, 0x00, 0xd0, 0x16, 0x29, 0x07, 
-	0xd1, 0x29, 0x26, 0x01, 0x70, 0x26, 0x21, 0x08, 
-	0x80, 0x61, 0x99, 0x03, 0x9a, 0x02, 0x5a, 0x51, 
-	0x80, 0xa1, 0x21, 0x02, 0x71, 0xa1, 0x68, 0x69, 
-	0x81, 0x21, 0x99, 0x06, 0x80, 0x08, 0x1c, 0x02, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xff, 0x02, 
-	0x81, 0x2e, 0xe0, 0x13, 0x23, 0x01, 0x70, 0x23, 
-	0x21, 0x08, 0x80, 0x61, 0x99, 0x03, 0x9a, 0x02, 
-	0x5a, 0x51, 0x80, 0xa1, 0x71, 0xa3, 0x68, 0x69, 
-	0x81, 0x21, 0x99, 0x06, 0x80, 0x08, 0x1c, 0x02, 
-	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x15, 0xfe, 0xee, 
-	0x21, 0x02, 0x81, 0x29, 0x26, 0x01, 0x98, 0x04, 
-	0x8a, 0x00, 0x30, 0x01, 0x99, 0x04, 0x82, 0x08, 
-	0x23, 0x10, 0x98, 0x04, 0x5e, 0xc0, 0x28, 0x02, 
-	0xd1, 0x02, 0x20, 0x00, 0x99, 0x04, 0x82, 0x08, 
-	0x1c, 0x30, 0xb0, 0x05, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x54, 
-	0x2e, 0x08, 0x54, 0x50, 0x2e, 0x08, 0x54, 0x40, 
-	0xb5, 0x80, 0x27, 0x00, 0x78, 0x00, 0x49, 0x0d, 
-	0x72, 0x08, 0x7a, 0x0b, 0x48, 0x0c, 0x2b, 0x01, 
-	0xd1, 0x06, 0xca, 0x08, 0xc0, 0x08, 0xca, 0x08, 
-	0xc0, 0x08, 0xca, 0x0c, 0xc0, 0x0c, 0xe0, 0x07, 
-	0x68, 0xc9, 0x60, 0x01, 0x1c, 0x08, 0x49, 0x07, 
-	0xf7, 0xff, 0xff, 0x41, 0x1c, 0x07, 0xd0, 0x01, 
-	0xf0, 0x00, 0xf8, 0x50, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, 
-	0x2e, 0x08, 0x54, 0x70, 0x2e, 0x08, 0x1a, 0x7c, 
-	0xb5, 0xb0, 0x24, 0x00, 0x4f, 0x17, 0x72, 0x3c, 
-	0x20, 0x01, 0xf0, 0x02, 0xff, 0xc3, 0x28, 0x00, 
-	0xd1, 0x03, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xff, 0xf9, 0x25, 0x28, 0x00, 
-	0xdc, 0x04, 0x20, 0x01, 0x43, 0xc0, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x25, 0x01, 
-	0x49, 0x0d, 0x00, 0x82, 0x18, 0x53, 0x70, 0x9d, 
-	0x52, 0x8c, 0x30, 0x01, 0x28, 0x02, 0xdb, 0xf8, 
-	0x68, 0xf8, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, 
-	0x30, 0x0d, 0xf0, 0x02, 0xff, 0x67, 0x60, 0xf8, 
-	0x28, 0x00, 0xd1, 0x03, 0x38, 0x03, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x28, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, 
-	0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x80, 0x4f, 0x06, 
-	0x68, 0xf8, 0xf0, 0x02, 0xff, 0x79, 0x20, 0x00, 
-	0x60, 0xf8, 0xf7, 0xff, 0xf9, 0x53, 0xf0, 0x02, 
-	0xfe, 0x45, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x80, 0x21, 0x00, 
-	0x48, 0x18, 0x7a, 0x02, 0x48, 0x18, 0x2a, 0x01, 
-	0xd1, 0x0e, 0x78, 0x42, 0x2a, 0x13, 0xd1, 0x03, 
-	0x68, 0x87, 0xf0, 0x00, 0xf8, 0x2b, 0x1c, 0x01, 
-	0x29, 0x00, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x02, 
-	0xff, 0x5b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x68, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, 0x14, 
-	0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 0xd0, 0x0b, 
-	0x28, 0x04, 0xd1, 0xf2, 0xf0, 0x00, 0xf8, 0x8c, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 
-	0xf8, 0x6b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0xf0, 0x00, 0xf8, 0x4c, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0xf0, 0x00, 0xf8, 0x23, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x6c, 
-	0x2e, 0x08, 0x54, 0x70, 0xb5, 0x80, 0xb0, 0x83, 
-	0x4f, 0x0b, 0x88, 0xb8, 0xf0, 0x00, 0xf8, 0xae, 
-	0x28, 0x00, 0xdb, 0x0a, 0x88, 0xf9, 0xab, 0x02, 
-	0x80, 0x19, 0x68, 0xb9, 0x91, 0x01, 0x46, 0x6b, 
-	0x21, 0x13, 0xaa, 0x01, 0xf0, 0x00, 0xf8, 0xd6, 
-	0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, 
-	0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x70, 0xb5, 0xf0, 0xb0, 0x83, 
-	0x4e, 0x0f, 0x68, 0x30, 0x88, 0x84, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf8, 0x6e, 0x25, 0x01, 0x1c, 0x07, 
-	0xd4, 0x11, 0x68, 0x30, 0x79, 0x81, 0xab, 0x01, 
-	0x70, 0x19, 0x89, 0x00, 0x80, 0x58, 0x46, 0x6b, 
-	0x21, 0x01, 0x1c, 0x38, 0xaa, 0x01, 0xf0, 0x00, 
-	0xf8, 0xb5, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x91, 0x1c, 0x28, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x70, 0xb5, 0x90, 0xb0, 0x83, 
-	0x4c, 0x0a, 0x68, 0x20, 0x88, 0x80, 0xf0, 0x00, 
-	0xf8, 0x4b, 0x27, 0x01, 0x28, 0x00, 0xdb, 0x08, 
-	0x68, 0x21, 0x79, 0x89, 0xab, 0x01, 0x70, 0x19, 
-	0x46, 0x6b, 0x21, 0x03, 0xaa, 0x01, 0xf0, 0x00, 
-	0xf8, 0x95, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, 
-	0xb5, 0x90, 0xb0, 0x83, 0x4c, 0x0b, 0x68, 0x20, 
-	0x88, 0x80, 0xf0, 0x00, 0xf8, 0x53, 0x27, 0x01, 
-	0x28, 0x00, 0xdb, 0x0a, 0x68, 0x21, 0x88, 0xca, 
-	0xab, 0x02, 0x80, 0x1a, 0x31, 0x08, 0x91, 0x01, 
-	0x46, 0x6b, 0x21, 0x02, 0xaa, 0x01, 0xf0, 0x00, 
-	0xf8, 0x79, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, 
-	0xb5, 0xb0, 0xb0, 0x81, 0x48, 0x0b, 0x68, 0x00, 
-	0x88, 0x84, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x36, 
-	0x25, 0x01, 0x1c, 0x07, 0xd4, 0x09, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x04, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0x61, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, 
-	0xf8, 0x3f, 0x1c, 0x28, 0xb0, 0x01, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x70, 
-	0xb4, 0x80, 0x04, 0x03, 0x0c, 0x1b, 0x20, 0x00, 
-	0x49, 0x0d, 0x00, 0x82, 0x18, 0x57, 0x78, 0xbf, 
-	0x2f, 0x01, 0xd1, 0x06, 0x00, 0x87, 0x53, 0xcb, 
-	0x23, 0x02, 0x18, 0x51, 0x70, 0x8b, 0xbc, 0x80, 
-	0x47, 0x70, 0x5a, 0x8a, 0x42, 0x9a, 0xd1, 0x03, 
-	0x20, 0x01, 0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 
-	0x30, 0x01, 0x28, 0x02, 0xdb, 0xe9, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x6c, 0xb4, 0x80, 0x04, 0x02, 
-	0x0c, 0x12, 0x20, 0x00, 0x49, 0x07, 0x00, 0x83, 
-	0x18, 0x5f, 0x78, 0xbf, 0x2f, 0x01, 0xd0, 0x02, 
-	0x5a, 0xcb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, 
-	0x28, 0x02, 0xdb, 0xf4, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x6c, 
-	0xb4, 0x80, 0x28, 0x00, 0xda, 0x05, 0x28, 0x02, 
-	0xdb, 0x03, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 
-	0x47, 0x70, 0x23, 0x01, 0x00, 0x82, 0x49, 0x03, 
-	0x18, 0x57, 0x70, 0xbb, 0x23, 0x00, 0x52, 0x8b, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x6c, 
-	0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x02, 
-	0xfd, 0x77, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x70, 0xb5, 0x90, 0x06, 0x09, 
-	0x0e, 0x09, 0x00, 0x87, 0x4c, 0x0a, 0x19, 0x3f, 
-	0x78, 0xbf, 0x2f, 0x02, 0xd0, 0x06, 0x2f, 0x03, 
-	0xd1, 0x09, 0xf0, 0x00, 0xf8, 0x39, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 0xf8, 0x0a, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x6c, 0xb5, 0x90, 0x06, 0x09, 
-	0x0e, 0x09, 0x27, 0x01, 0x60, 0x1f, 0x29, 0x01, 
-	0xd1, 0x19, 0x23, 0x12, 0x49, 0x0e, 0x70, 0x0b, 
-	0x23, 0x11, 0x70, 0x4b, 0x23, 0x08, 0x80, 0x4b, 
-	0x00, 0x84, 0x4f, 0x0c, 0x5b, 0x38, 0x80, 0x88, 
-	0x78, 0x10, 0x71, 0x88, 0x88, 0x50, 0x81, 0x08, 
-	0xf7, 0xff, 0xff, 0xc2, 0x28, 0x00, 0xd0, 0x06, 
-	0x20, 0x03, 0x19, 0xe1, 0x70, 0x88, 0x20, 0x01, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x70, 0x2e, 0x08, 0x1a, 0x6c, 
-	0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x17, 
-	0x22, 0x01, 0xb0, 0x81, 0x9b, 0x04, 0x25, 0x01, 
-	0x00, 0x86, 0x60, 0x1a, 0x48, 0x38, 0x90, 0x00, 
-	0x4c, 0x38, 0x29, 0x02, 0xd0, 0x23, 0x29, 0x03, 
-	0xd0, 0x41, 0x29, 0x04, 0xd0, 0x4f, 0x29, 0x13, 
-	0xd1, 0x5e, 0x88, 0xba, 0x98, 0x00, 0x5b, 0x80, 
-	0x68, 0x39, 0xf7, 0xfe, 0xff, 0x9d, 0x1c, 0x05, 
-	0xd1, 0x11, 0x20, 0x12, 0x70, 0x20, 0x20, 0x15, 
-	0x70, 0x60, 0x20, 0x04, 0x80, 0x60, 0x98, 0x00, 
-	0x5b, 0x80, 0x80, 0xa0, 0xf7, 0xff, 0xff, 0x88, 
-	0x28, 0x00, 0xd0, 0x4b, 0x20, 0x00, 0x9b, 0x04, 
-	0x25, 0x01, 0x60, 0x18, 0xe0, 0x46, 0x20, 0x00, 
-	0x9b, 0x04, 0x60, 0x18, 0xe0, 0x41, 0x88, 0xb8, 
-	0xf0, 0x02, 0xfd, 0xac, 0x60, 0xa0, 0x1c, 0x01, 
-	0xd1, 0x01, 0x20, 0x00, 0xe0, 0x3b, 0x20, 0x12, 
-	0x70, 0x20, 0x20, 0x13, 0x70, 0x60, 0x20, 0x08, 
-	0x80, 0x60, 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, 
-	0x88, 0xb8, 0x80, 0xe0, 0x88, 0xba, 0x1c, 0x08, 
-	0x68, 0x39, 0xf0, 0x15, 0xfc, 0xb7, 0xf7, 0xff, 
-	0xff, 0x63, 0x28, 0x00, 0xd1, 0x26, 0x68, 0xa0, 
-	0xf0, 0x02, 0xfd, 0xb6, 0xe0, 0x21, 0x20, 0x12, 
-	0x70, 0x20, 0x20, 0x14, 0x70, 0x60, 0x20, 0x04, 
-	0x80, 0x60, 0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, 
-	0x78, 0x38, 0x80, 0xa0, 0xf7, 0xff, 0xff, 0x50, 
-	0x28, 0x00, 0xd1, 0x13, 0xe0, 0x11, 0x20, 0x12, 
-	0x70, 0x20, 0x70, 0x60, 0x20, 0x04, 0x80, 0x60, 
-	0x98, 0x00, 0x5b, 0x80, 0x80, 0xa0, 0xf7, 0xff, 
-	0xff, 0x43, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x02, 
-	0x99, 0x00, 0x18, 0x71, 0x70, 0x88, 0xe0, 0x01, 
-	0xe7, 0xff, 0x25, 0x00, 0x1c, 0x28, 0xb0, 0x01, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x6c, 0x2e, 0x08, 0x54, 0x70, 
-	0xb5, 0xf0, 0x1c, 0x17, 0x06, 0x02, 0x0e, 0x12, 
-	0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x59, 0x1c, 0x48, 
-	0x1c, 0x1d, 0x1c, 0x43, 0xb0, 0x81, 0x93, 0x00, 
-	0x1f, 0xd6, 0x3e, 0x89, 0x2e, 0x07, 0xd2, 0x51, 
-	0xa3, 0x01, 0x5d, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x03, 0x4d, 0x14, 0x3e, 0x4d, 0x27, 0x31, 0x00, 
-	0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x02, 0x70, 0x29, 
-	0x1c, 0x01, 0x1c, 0x05, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf8, 0xab, 0x88, 0xba, 0x68, 0x39, 0x1c, 0xa8, 
-	0xf0, 0x15, 0xfc, 0x5c, 0x88, 0xb8, 0x30, 0x04, 
-	0xe0, 0x3a, 0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x07, 
-	0x70, 0x29, 0x1c, 0x05, 0x79, 0x38, 0x70, 0x28, 
-	0x9d, 0x00, 0x22, 0x04, 0x1c, 0x28, 0x1c, 0x39, 
-	0xf0, 0x15, 0xfc, 0x4c, 0x1c, 0x20, 0x1d, 0x29, 
-	0xf0, 0x00, 0xf8, 0x92, 0x20, 0x09, 0xe0, 0x27, 
-	0x70, 0x2a, 0x1c, 0x0d, 0x21, 0x02, 0x70, 0x29, 
-	0x1c, 0x01, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x88, 
-	0x20, 0x04, 0xe0, 0x1d, 0x70, 0x2a, 0x1c, 0x0d, 
-	0x21, 0x03, 0x70, 0x29, 0x1c, 0x05, 0x78, 0xb8, 
-	0x70, 0x28, 0x99, 0x00, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf8, 0x7b, 0x20, 0x05, 0xe0, 0x10, 0x70, 0x2a, 
-	0x1c, 0x0d, 0x21, 0x06, 0x70, 0x29, 0x22, 0x04, 
-	0x1c, 0x39, 0x1c, 0x05, 0xf0, 0x15, 0xfc, 0x26, 
-	0x1c, 0x20, 0x1d, 0x29, 0xf0, 0x00, 0xf8, 0x6c, 
-	0x20, 0x08, 0xe0, 0x01, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x1c, 0x0f, 0x78, 0x01, 0x9d, 0x05, 
-	0x70, 0x11, 0x78, 0x41, 0x78, 0x12, 0x1c, 0x86, 
-	0x30, 0x03, 0x3a, 0x90, 0x1c, 0x1c, 0x2a, 0x07, 
-	0xd2, 0x51, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x11, 0x4d, 0x4d, 
-	0x1b, 0x2e, 0x39, 0x00, 0x29, 0x02, 0xd1, 0x3d, 
-	0x1c, 0x30, 0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x4e, 
-	0x1c, 0xb0, 0x60, 0x28, 0x1f, 0x38, 0x80, 0xa8, 
-	0x88, 0x20, 0x80, 0xe8, 0xe0, 0x37, 0x29, 0x04, 
-	0xd1, 0x30, 0x22, 0x04, 0x1c, 0x68, 0x1c, 0x31, 
-	0xf0, 0x15, 0xfb, 0xf0, 0x2f, 0x06, 0xd0, 0x2e, 
-	0xe0, 0x28, 0x29, 0x07, 0xd1, 0x26, 0x78, 0x31, 
-	0x71, 0x29, 0x1c, 0x01, 0x1c, 0x06, 0x22, 0x04, 
-	0x1c, 0x28, 0xf0, 0x15, 0xfb, 0xe3, 0x1d, 0x30, 
-	0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x2f, 0x88, 0x20, 
-	0x80, 0xe8, 0x2f, 0x09, 0xd0, 0x1b, 0xe0, 0x15, 
-	0x29, 0x02, 0xd1, 0x13, 0x1c, 0x30, 0x1c, 0x21, 
-	0xf0, 0x00, 0xf8, 0x24, 0x88, 0x20, 0x80, 0x28, 
-	0x2f, 0x04, 0xd0, 0x10, 0xe0, 0x0a, 0x29, 0x03, 
-	0xd1, 0x08, 0x78, 0x31, 0x70, 0xa9, 0x1c, 0x21, 
-	0xf0, 0x00, 0xf8, 0x18, 0x88, 0x20, 0x80, 0x28, 
-	0x2f, 0x05, 0xd0, 0x04, 0x20, 0x01, 0x43, 0xc0, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x06, 0x00, 0x0e, 0x00, 0x0a, 0x02, 0x70, 0x0a, 
-	0x70, 0x48, 0x47, 0x70, 0x78, 0x02, 0x02, 0x12, 
-	0x78, 0x40, 0x18, 0x10, 0x80, 0x08, 0x47, 0x70, 
-	0xb5, 0x00, 0x78, 0x01, 0x48, 0x0b, 0x71, 0x01, 
-	0x79, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x02, 
-	0xd1, 0x0b, 0x48, 0x09, 0xca, 0x08, 0xc0, 0x08, 
-	0xca, 0x08, 0xc0, 0x08, 0xca, 0x0c, 0xc0, 0x0c, 
-	0xf0, 0x00, 0xf8, 0x37, 0x20, 0x00, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, 
-	0x2e, 0x08, 0x54, 0x80, 0xb5, 0x80, 0x20, 0x04, 
-	0xf0, 0x02, 0xfc, 0xa4, 0x22, 0x00, 0x28, 0x00, 
-	0xda, 0x03, 0x1c, 0x10, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x48, 0x0a, 0x71, 0x02, 0x21, 0x00, 
-	0x20, 0x01, 0x4b, 0x09, 0x01, 0x0f, 0x55, 0xd8, 
-	0x31, 0x01, 0x29, 0x20, 0xdb, 0xfa, 0x21, 0x00, 
-	0x4b, 0x06, 0x00, 0x4f, 0x53, 0xda, 0x31, 0x01, 
-	0x29, 0x10, 0xdb, 0xfa, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, 
-	0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x56, 0xa0, 
-	0xb5, 0x00, 0xf0, 0x02, 0xfb, 0x3b, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x80, 0x20, 0x00, 0x49, 0x1e, 
-	0x79, 0x0a, 0x49, 0x1e, 0x2a, 0x01, 0xd1, 0x26, 
-	0x78, 0x4a, 0x2a, 0x43, 0xd0, 0x1d, 0xdc, 0x09, 
-	0x2a, 0x31, 0xd0, 0x14, 0x2a, 0x33, 0xd0, 0x15, 
-	0x2a, 0x34, 0xd1, 0x25, 0x68, 0x8f, 0xf0, 0x00, 
-	0xf8, 0x2f, 0xe0, 0x21, 0x2a, 0x45, 0xd0, 0x06, 
-	0x2a, 0x46, 0xd0, 0x11, 0x2a, 0x48, 0xd1, 0x1b, 
-	0xf0, 0x00, 0xf8, 0xcc, 0xe0, 0x18, 0x68, 0x8f, 
-	0xf0, 0x00, 0xf8, 0x6a, 0xe0, 0x14, 0xf0, 0x00, 
-	0xf8, 0x8b, 0xe0, 0x11, 0xf0, 0x00, 0xf8, 0x92, 
-	0xe0, 0x0e, 0xf0, 0x00, 0xf8, 0xc9, 0xe0, 0x0b, 
-	0xf0, 0x00, 0xf8, 0xf0, 0xe0, 0x08, 0x88, 0x08, 
-	0x28, 0x70, 0xdb, 0x04, 0x28, 0x80, 0xda, 0x02, 
-	0xf0, 0x00, 0xf9, 0x0c, 0xe0, 0x00, 0x20, 0x01, 
-	0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x02, 
-	0xfc, 0x2b, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x80, 0x2e, 0x08, 0x54, 0x80, 
-	0xb5, 0x90, 0xb0, 0x85, 0xaa, 0x01, 0xb4, 0x04, 
-	0x4f, 0x1f, 0x89, 0xb9, 0x68, 0xb8, 0xaa, 0x05, 
-	0xab, 0x04, 0xf7, 0xff, 0xfe, 0xf9, 0x24, 0x00, 
-	0xb0, 0x01, 0x28, 0x00, 0xda, 0x01, 0x1c, 0x20, 
-	0xe0, 0x2d, 0xa8, 0x04, 0x78, 0x00, 0x28, 0x91, 
-	0xd0, 0x06, 0xa8, 0x03, 0x88, 0x00, 0xf0, 0x00, 
-	0xf9, 0x4f, 0x1c, 0x07, 0xd4, 0xf3, 0xe0, 0x10, 
-	0x79, 0x38, 0xab, 0x01, 0x70, 0x18, 0xa8, 0x01, 
-	0x78, 0x00, 0xf0, 0x00, 0xf8, 0xff, 0x28, 0x00, 
-	0xda, 0x06, 0x20, 0xf1, 0xab, 0x02, 0x70, 0x58, 
-	0xa8, 0x01, 0xf0, 0x00, 0xfe, 0x77, 0xe0, 0x12, 
-	0x1c, 0x07, 0x46, 0x6b, 0xa9, 0x04, 0x78, 0x09, 
-	0x1c, 0x38, 0xaa, 0x01, 0xf0, 0x00, 0xf9, 0xe2, 
-	0x28, 0x00, 0xd0, 0xd8, 0x01, 0x38, 0x49, 0x07, 
-	0x5c, 0x08, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x0c, 0x98, 0x00, 0xb0, 0x05, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, 
-	0xb5, 0x90, 0xb0, 0x81, 0x4c, 0x0e, 0x88, 0xa0, 
-	0xf0, 0x00, 0xf9, 0x1a, 0x1c, 0x07, 0xd4, 0x07, 
-	0x78, 0x61, 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0xc0, 0x28, 0x00, 0xd1, 0x01, 
-	0x20, 0x00, 0x90, 0x00, 0x01, 0x38, 0x49, 0x07, 
-	0x5c, 0x08, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xe8, 0x98, 0x00, 0xb0, 0x01, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, 
-	0xb5, 0x00, 0x48, 0x03, 0x79, 0x00, 0xf0, 0x00, 
-	0xfd, 0xef, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0xb0, 0x83, 
-	0x4e, 0x14, 0x79, 0x30, 0xab, 0x00, 0x70, 0x18, 
-	0x27, 0x00, 0x4c, 0x13, 0x01, 0x3d, 0x5d, 0x60, 
-	0x28, 0x01, 0xd0, 0x13, 0x19, 0x29, 0x78, 0x4a, 
-	0x79, 0x30, 0x42, 0x82, 0xd0, 0x02, 0x79, 0x09, 
-	0x42, 0x81, 0xd1, 0x0b, 0x78, 0x71, 0x46, 0x6a, 
-	0x1c, 0x38, 0xab, 0x02, 0xf0, 0x00, 0xf9, 0x86, 
-	0x5d, 0x60, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xb4, 0x37, 0x01, 0x2f, 0x20, 
-	0xdb, 0xe4, 0xa8, 0x00, 0x78, 0x00, 0xf0, 0x00, 
-	0xfd, 0xd9, 0x98, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, 
-	0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x00, 0x48, 0x03, 
-	0x79, 0x00, 0xf0, 0x00, 0xfd, 0xe1, 0x20, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, 
-	0xb5, 0x90, 0xb0, 0x83, 0x4c, 0x11, 0x88, 0xa0, 
-	0xf0, 0x00, 0xf8, 0xb2, 0x1c, 0x07, 0xd5, 0x01, 
-	0x20, 0x01, 0xe0, 0x0c, 0x79, 0xa0, 0xab, 0x01, 
-	0x70, 0x18, 0x79, 0xe0, 0x70, 0x58, 0x78, 0x61, 
-	0x46, 0x6a, 0x1c, 0x38, 0x33, 0x04, 0xf0, 0x00, 
-	0xf9, 0x51, 0x28, 0x00, 0xd1, 0x00, 0x90, 0x02, 
-	0x01, 0x38, 0x49, 0x07, 0x5c, 0x08, 0x28, 0x02, 
-	0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x7a, 
-	0x98, 0x02, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x80, 
-	0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x90, 0xb0, 0x81, 
-	0x4c, 0x0e, 0x88, 0xa0, 0xf0, 0x00, 0xf8, 0x88, 
-	0x1c, 0x07, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x07, 
-	0x78, 0x61, 0x46, 0x6b, 0x22, 0x00, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x2c, 0x28, 0x00, 0xd1, 0x00, 
-	0x90, 0x00, 0x01, 0x38, 0x49, 0x06, 0x5c, 0x08, 
-	0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0x55, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, 
-	0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x80, 0xb0, 0x81, 
-	0x48, 0x0e, 0x88, 0x00, 0xf0, 0x00, 0xf8, 0x9e, 
-	0x1c, 0x07, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x11, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xd3, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x70, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf9, 0x05, 0x01, 0x38, 0x49, 0x06, 0x5c, 0x08, 
-	0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0x31, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, 
-	0x2e, 0x08, 0x54, 0xa0, 0xb4, 0xb0, 0x06, 0x02, 
-	0x0e, 0x12, 0x49, 0x10, 0x23, 0x00, 0x5e, 0xcc, 
-	0x43, 0xdf, 0x2c, 0x20, 0xda, 0x17, 0x20, 0x00, 
-	0x4b, 0x0d, 0x01, 0x05, 0x5d, 0x5d, 0x2d, 0x01, 
-	0xd1, 0x0e, 0x25, 0x02, 0x01, 0x07, 0x55, 0xdd, 
-	0x18, 0xfb, 0x70, 0x5a, 0x1c, 0x42, 0x80, 0x5a, 
-	0x22, 0x00, 0x71, 0x1a, 0x80, 0xda, 0x81, 0x1a, 
-	0x1c, 0x62, 0x80, 0x0a, 0xbc, 0xb0, 0x47, 0x70, 
-	0x30, 0x01, 0x28, 0x20, 0xdb, 0xe9, 0x1c, 0x38, 
-	0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x80, 
-	0x2e, 0x08, 0x54, 0xa0, 0xb5, 0x80, 0x1c, 0x07, 
-	0xd5, 0x06, 0x2f, 0x20, 0xdb, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x87, 0x21, 0x01, 
-	0x01, 0x38, 0x4a, 0x05, 0x54, 0x11, 0x48, 0x05, 
-	0x88, 0x01, 0x39, 0x01, 0x80, 0x01, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x1a, 0x80, 
-	0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 
-	0x49, 0x09, 0x01, 0x03, 0x5c, 0xcf, 0x2f, 0x01, 
-	0xd0, 0x06, 0x18, 0x5b, 0x88, 0x5f, 0x42, 0x97, 
-	0xd0, 0x07, 0x88, 0xdb, 0x42, 0x93, 0xd0, 0x04, 
-	0x30, 0x01, 0x28, 0x20, 0xdb, 0xf1, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0xa0, 0xb4, 0x90, 0x04, 0x02, 
-	0x0c, 0x12, 0x06, 0x0b, 0x0e, 0x1b, 0x20, 0x00, 
-	0x49, 0x0b, 0x01, 0x07, 0x5d, 0xcc, 0x2c, 0x01, 
-	0xd0, 0x0b, 0x18, 0x7f, 0x88, 0x7f, 0x42, 0x97, 
-	0xd1, 0x07, 0x01, 0x02, 0x18, 0x51, 0x71, 0x0b, 
-	0x1d, 0xc2, 0x32, 0x1a, 0x80, 0xca, 0xbc, 0x90, 
-	0x47, 0x70, 0x30, 0x01, 0x28, 0x20, 0xdb, 0xec, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, 
-	0x2e, 0x08, 0x54, 0xa0, 0xb4, 0x80, 0x04, 0x02, 
-	0x0c, 0x12, 0x20, 0x00, 0x49, 0x07, 0x01, 0x03, 
-	0x5c, 0xcf, 0x2f, 0x01, 0xd0, 0x03, 0x18, 0x5b, 
-	0x89, 0x1b, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, 
-	0x28, 0x20, 0xdb, 0xf4, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x54, 0xa0, 
-	0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x22, 0x00, 
-	0x20, 0x00, 0x4b, 0x0f, 0x00, 0x47, 0x5b, 0xdf, 
-	0x2f, 0x00, 0xd1, 0x06, 0x1d, 0xc2, 0x32, 0x69, 
-	0x04, 0x12, 0x0c, 0x12, 0x00, 0x40, 0x52, 0x1a, 
-	0xe0, 0x02, 0x30, 0x01, 0x28, 0x10, 0xdd, 0xf1, 
-	0x2a, 0x00, 0xd0, 0x09, 0x20, 0x01, 0x04, 0x80, 
-	0x43, 0x10, 0xf0, 0x02, 0xf9, 0xdf, 0x04, 0x00, 
-	0x0c, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xa0, 0xb5, 0x90, 0x1c, 0x07, 
-	0x01, 0x00, 0x49, 0x0e, 0x18, 0x44, 0x89, 0x20, 
-	0x28, 0x00, 0xd0, 0x13, 0xf0, 0x02, 0xfa, 0x02, 
-	0x20, 0x00, 0x49, 0x0b, 0x01, 0x3a, 0x4b, 0x09, 
-	0x18, 0xd2, 0x89, 0x13, 0x22, 0x00, 0x00, 0x47, 
-	0x5b, 0xcf, 0x42, 0x9f, 0xd1, 0x02, 0x00, 0x40, 
-	0x52, 0x0a, 0xe0, 0x02, 0x30, 0x01, 0x28, 0x10, 
-	0xdd, 0xf5, 0x81, 0x22, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0xa0, 
-	0x2e, 0x08, 0x56, 0xa0, 0xb5, 0x00, 0x49, 0x03, 
-	0x78, 0x08, 0xf0, 0x02, 0xf9, 0x41, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x54, 0x80, 
-	0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x02, 
-	0xf9, 0x37, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x90, 0xb5, 0x90, 0x06, 0x09, 
-	0x0e, 0x09, 0x1c, 0x1f, 0x01, 0x03, 0x4c, 0x1d, 
-	0x5c, 0xe3, 0x1e, 0x9c, 0x2c, 0x07, 0xd2, 0x31, 
-	0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x09, 0x15, 0x03, 0x0f, 0x1b, 0x21, 0x27, 0x00, 
-	0x1c, 0x3b, 0xf0, 0x00, 0xf9, 0x23, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, 
-	0xf8, 0x27, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x3b, 0xf0, 0x00, 0xf8, 0x5d, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, 
-	0xfa, 0x51, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0x65, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x3b, 0xf0, 0x00, 
-	0xfa, 0xf1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x3b, 0xf0, 0x00, 0xfb, 0x35, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, 
-	0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x1f, 
-	0x23, 0x01, 0x60, 0x3b, 0xb0, 0x81, 0x29, 0x91, 
-	0xd1, 0x23, 0x21, 0x45, 0x4b, 0x16, 0x70, 0x19, 
-	0x21, 0x42, 0x70, 0x59, 0x21, 0x08, 0x80, 0x59, 
-	0x01, 0x06, 0x4d, 0x14, 0x19, 0x74, 0x78, 0x60, 
-	0x71, 0x18, 0x88, 0x60, 0x80, 0xd8, 0x1c, 0x51, 
-	0x91, 0x00, 0x22, 0x04, 0x1d, 0xd8, 0x30, 0x01, 
-	0xf0, 0x15, 0xf8, 0xa8, 0xf7, 0xff, 0xff, 0x8a, 
-	0x28, 0x00, 0xd1, 0x01, 0x60, 0x38, 0xe0, 0x0f, 
-	0x22, 0x04, 0x99, 0x00, 0x1d, 0xe0, 0x30, 0x03, 
-	0xf0, 0x15, 0xf8, 0x9c, 0x20, 0x05, 0x55, 0xa8, 
-	0xe0, 0x03, 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, 
-	0xd1, 0x01, 0x20, 0x00, 0x60, 0x38, 0x20, 0x01, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, 
-	0xb5, 0xff, 0x1c, 0x04, 0x06, 0x08, 0x0e, 0x00, 
-	0x21, 0x01, 0xb0, 0x84, 0x9b, 0x07, 0x25, 0x01, 
-	0x60, 0x19, 0x4e, 0x55, 0x01, 0x21, 0x91, 0x03, 
-	0x28, 0x33, 0xd0, 0x5d, 0x28, 0x43, 0xd1, 0x5c, 
-	0x20, 0x09, 0xf0, 0x02, 0xf9, 0x57, 0x4f, 0x51, 
-	0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x01, 
-	0xe0, 0x94, 0x9a, 0x06, 0x79, 0x51, 0x01, 0x20, 
-	0x4a, 0x4b, 0x18, 0x84, 0x1d, 0xe0, 0x30, 0x03, 
-	0x90, 0x02, 0x29, 0x00, 0xd0, 0x4a, 0x88, 0x60, 
-	0xf7, 0xff, 0xfe, 0xc8, 0x28, 0x00, 0xda, 0x20, 
-	0x20, 0xf1, 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 
-	0x22, 0x04, 0x99, 0x02, 0xf0, 0x15, 0xf8, 0x5a, 
-	0x20, 0x43, 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 
-	0x20, 0x0c, 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 
-	0x88, 0x61, 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 
-	0xf7, 0xff, 0xfb, 0xca, 0x81, 0xb8, 0xf7, 0xff, 
-	0xff, 0x2d, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, 
-	0x9b, 0x07, 0x60, 0x18, 0xe0, 0x55, 0x20, 0x02, 
-	0xe0, 0x1e, 0x46, 0x68, 0x22, 0x04, 0x99, 0x02, 
-	0xf0, 0x15, 0xf8, 0x3c, 0x20, 0x43, 0x70, 0x38, 
-	0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, 
-	0x9a, 0x06, 0x79, 0x50, 0x71, 0x38, 0x88, 0xe1, 
-	0x46, 0x6a, 0x20, 0x93, 0x68, 0xbb, 0xf7, 0xff, 
-	0xfb, 0xab, 0x81, 0xb8, 0xf7, 0xff, 0xff, 0x0e, 
-	0x28, 0x00, 0xd0, 0xe0, 0x20, 0x7d, 0x00, 0xc0, 
-	0xf7, 0xff, 0xfe, 0xbe, 0x81, 0x20, 0x20, 0x03, 
-	0x99, 0x03, 0x54, 0x70, 0x25, 0x01, 0xe0, 0x40, 
-	0xe0, 0x34, 0xe0, 0x37, 0x9a, 0x06, 0x79, 0x10, 
-	0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, 
-	0x99, 0x02, 0xf0, 0x15, 0xf8, 0x13, 0x20, 0x43, 
-	0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, 
-	0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, 
-	0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, 
-	0xfb, 0x83, 0x81, 0xb8, 0xf7, 0xff, 0xfe, 0xe6, 
-	0x28, 0x00, 0xd0, 0xb8, 0x9a, 0x06, 0x79, 0x10, 
-	0x28, 0x00, 0xd1, 0x13, 0x21, 0x45, 0x48, 0x14, 
-	0x70, 0x01, 0x21, 0x44, 0x70, 0x41, 0x27, 0x04, 
-	0x80, 0x47, 0x78, 0x61, 0x71, 0x81, 0x88, 0x61, 
-	0x80, 0x81, 0xf7, 0xff, 0xfe, 0xdd, 0x28, 0x00, 
-	0xd1, 0x01, 0x25, 0x00, 0xe0, 0x0d, 0x99, 0x03, 
-	0x54, 0x77, 0xe0, 0x0a, 0x20, 0x02, 0x99, 0x03, 
-	0x54, 0x70, 0xe0, 0x06, 0x28, 0x7f, 0xdc, 0x01, 
-	0x28, 0x45, 0xd1, 0x02, 0x20, 0x00, 0x9b, 0x07, 
-	0x60, 0x18, 0x1c, 0x28, 0xb0, 0x04, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x54, 0x80, 
-	0x2e, 0x08, 0x54, 0x90, 0xb5, 0xff, 0x06, 0x09, 
-	0x0e, 0x09, 0x22, 0x01, 0xb0, 0x83, 0x9b, 0x06, 
-	0x01, 0x00, 0x60, 0x1a, 0x90, 0x02, 0x4e, 0x98, 
-	0x19, 0x84, 0x4f, 0x98, 0x4d, 0x98, 0x29, 0x46, 
-	0xd0, 0x5d, 0xdc, 0x0e, 0x29, 0x33, 0xd0, 0x5b, 
-	0x29, 0x45, 0xd1, 0x5a, 0x89, 0xb8, 0x30, 0x04, 
-	0x04, 0x00, 0x0c, 0x00, 0xf0, 0x02, 0xf8, 0x96, 
-	0x60, 0xa8, 0x28, 0x00, 0xd1, 0x33, 0x20, 0x00, 
-	0xe0, 0xcf, 0x29, 0x90, 0xd0, 0x52, 0x29, 0x95, 
-	0xd1, 0x4b, 0x88, 0xe0, 0x28, 0x00, 0xd1, 0x6c, 
-	0x22, 0x05, 0x21, 0x04, 0x68, 0xb8, 0xf0, 0x02, 
-	0xf8, 0x8a, 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xee, 
-	0x21, 0x00, 0xab, 0x00, 0x70, 0x99, 0x22, 0x43, 
-	0x70, 0x3a, 0x22, 0x34, 0x70, 0x7a, 0x21, 0x0c, 
-	0x80, 0x79, 0x78, 0x61, 0x71, 0x39, 0x88, 0x61, 
-	0x46, 0x6a, 0x1c, 0x03, 0x20, 0x96, 0xf7, 0xff, 
-	0xfb, 0x0f, 0x81, 0xb8, 0xf7, 0xff, 0xfe, 0x72, 
-	0x28, 0x00, 0xd0, 0xd8, 0x20, 0x45, 0x70, 0x28, 
-	0x20, 0x47, 0x70, 0x68, 0x20, 0x04, 0x80, 0x68, 
-	0x88, 0x60, 0x80, 0xa8, 0x21, 0x00, 0x71, 0xa9, 
-	0xf7, 0xff, 0xfe, 0x6e, 0xe0, 0xb0, 0x68, 0xb9, 
-	0x91, 0x00, 0x89, 0xb9, 0xab, 0x01, 0x80, 0x19, 
-	0x22, 0x43, 0x70, 0x2a, 0x22, 0x34, 0x70, 0x6a, 
-	0x21, 0x0c, 0x80, 0x69, 0x78, 0x61, 0x71, 0x29, 
-	0x88, 0x61, 0x46, 0x6a, 0x1c, 0x03, 0x20, 0x90, 
-	0xf7, 0xff, 0xfa, 0xea, 0x81, 0xa8, 0xf7, 0xff, 
-	0xfe, 0x57, 0x28, 0x00, 0xd1, 0x06, 0x68, 0xa8, 
-	0xf0, 0x02, 0xf8, 0x6a, 0xe7, 0xaf, 0xe0, 0x61, 
-	0xe0, 0x8b, 0xe0, 0xc5, 0x20, 0x00, 0x9b, 0x06, 
-	0x60, 0x18, 0xe0, 0x61, 0x88, 0xe0, 0x28, 0x00, 
-	0xd1, 0x1c, 0x9a, 0x05, 0x88, 0x90, 0xf0, 0x02, 
-	0xf8, 0x35, 0x60, 0xa8, 0x1c, 0x01, 0xd0, 0x9e, 
-	0x20, 0x45, 0x70, 0x28, 0x70, 0x68, 0x22, 0x0c, 
-	0x80, 0x6a, 0x88, 0x60, 0x80, 0xa8, 0x9a, 0x05, 
-	0x88, 0x90, 0x81, 0xa8, 0x89, 0xaa, 0x1c, 0x08, 
-	0x99, 0x05, 0x68, 0x09, 0xf0, 0x14, 0xff, 0x42, 
-	0xf7, 0xff, 0xfe, 0x2e, 0x28, 0x00, 0xd1, 0xdd, 
-	0xe7, 0xd5, 0xe0, 0x16, 0x99, 0x05, 0x88, 0xc9, 
-	0x42, 0x81, 0xd1, 0x05, 0x78, 0x60, 0x71, 0x38, 
-	0x68, 0xb8, 0x1c, 0x81, 0x88, 0x60, 0xe0, 0x03, 
-	0x79, 0x21, 0x71, 0x39, 0x68, 0xb9, 0x31, 0x02, 
-	0xf7, 0xff, 0xfb, 0x76, 0x22, 0x43, 0x70, 0x3a, 
-	0xf7, 0xff, 0xfe, 0x0c, 0x28, 0x00, 0xd0, 0xc1, 
-	0xe0, 0x2a, 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, 
-	0x70, 0x7a, 0x21, 0x0c, 0x80, 0x79, 0x9a, 0x05, 
-	0x88, 0x11, 0x42, 0x88, 0xd1, 0x0f, 0x78, 0x60, 
-	0x71, 0x38, 0x68, 0xb8, 0x1c, 0x81, 0x88, 0x60, 
-	0xf7, 0xff, 0xfb, 0x5e, 0x88, 0xe1, 0x79, 0x20, 
-	0x88, 0x62, 0x80, 0xe2, 0x78, 0x62, 0x71, 0x22, 
-	0x80, 0x61, 0x70, 0x60, 0xe0, 0x05, 0x79, 0x21, 
-	0x71, 0x39, 0x68, 0xb9, 0x31, 0x02, 0xf7, 0xff, 
-	0xfb, 0x4f, 0xf7, 0xff, 0xfd, 0xe7, 0x28, 0x00, 
-	0xd0, 0x9c, 0xe0, 0x23, 0x20, 0x04, 0xf0, 0x01, 
-	0xff, 0xdd, 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 
-	0x20, 0x01, 0xe0, 0x16, 0x25, 0x00, 0xab, 0x00, 
-	0x70, 0x9d, 0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, 
-	0x70, 0x7a, 0x21, 0x0c, 0x80, 0x79, 0x78, 0x61, 
-	0x71, 0x39, 0x88, 0x61, 0x46, 0x6a, 0x1c, 0x03, 
-	0x20, 0x95, 0xf7, 0xff, 0xfa, 0x65, 0x81, 0xb8, 
-	0xf7, 0xff, 0xfd, 0xc8, 0x28, 0x00, 0xd1, 0x05, 
-	0x1c, 0x28, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x7d, 0x00, 0xc0, 
-	0xf7, 0xff, 0xfd, 0x72, 0x81, 0x20, 0x20, 0x06, 
-	0xe0, 0x37, 0x88, 0xe0, 0x28, 0x00, 0xd0, 0x03, 
-	0x79, 0x20, 0x78, 0x61, 0x42, 0x88, 0xd1, 0x01, 
-	0x20, 0x02, 0xe0, 0x2e, 0x20, 0x04, 0xf0, 0x01, 
-	0xff, 0xa9, 0x60, 0xb8, 0x28, 0x00, 0xd0, 0xcb, 
-	0x21, 0x00, 0xab, 0x00, 0x70, 0x99, 0x79, 0x21, 
-	0x9a, 0x05, 0x78, 0x12, 0x42, 0x91, 0xd1, 0x02, 
-	0x78, 0x61, 0x88, 0x63, 0xe0, 0x00, 0x88, 0xe3, 
-	0x22, 0x43, 0x70, 0x3a, 0x22, 0x34, 0x70, 0x7a, 
-	0x22, 0x0c, 0x80, 0x7a, 0x71, 0x39, 0x46, 0x6a, 
-	0x1c, 0x05, 0x20, 0x95, 0x1c, 0x19, 0x1c, 0x2b, 
-	0xf7, 0xff, 0xfa, 0x2a, 0x81, 0xb8, 0xf7, 0xff, 
-	0xfd, 0x8d, 0x28, 0x00, 0xd1, 0x03, 0x21, 0x00, 
-	0x9b, 0x06, 0x60, 0x18, 0xe6, 0xef, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xff, 0xfd, 0x39, 0x81, 0x20, 
-	0x20, 0x08, 0x99, 0x02, 0x54, 0x70, 0xe7, 0x9f, 
-	0x29, 0x7f, 0xdd, 0x9d, 0xe7, 0x36, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0xa0, 0x2e, 0x08, 0x54, 0x80, 
-	0x2e, 0x08, 0x54, 0x90, 0xb5, 0xff, 0x06, 0x09, 
-	0x0e, 0x09, 0x22, 0x01, 0xb0, 0x83, 0x9b, 0x06, 
-	0x01, 0x05, 0x60, 0x1a, 0x4e, 0x4f, 0x19, 0xac, 
-	0x1d, 0xe2, 0x32, 0x03, 0x92, 0x02, 0x4f, 0x4e, 
-	0x29, 0x33, 0xd0, 0x61, 0x29, 0x70, 0xd0, 0x37, 
-	0x29, 0x94, 0xd1, 0x5e, 0xf7, 0xff, 0xfd, 0x3a, 
-	0x88, 0xe0, 0x99, 0x05, 0x88, 0xc9, 0x42, 0x88, 
-	0xd1, 0x06, 0x22, 0x04, 0x98, 0x02, 0x99, 0x05, 
-	0xf0, 0x14, 0xff, 0x2c, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x00, 0xe0, 0x2c, 0x99, 0x05, 0x79, 0x08, 
-	0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, 
-	0x99, 0x02, 0xf0, 0x14, 0xfe, 0x63, 0x20, 0x43, 
-	0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, 
-	0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, 
-	0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, 
-	0xf9, 0xd3, 0x81, 0xb8, 0xf7, 0xff, 0xfd, 0x36, 
-	0x28, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x9b, 0x06, 
-	0x60, 0x18, 0xe7, 0xdd, 0x99, 0x05, 0x79, 0x08, 
-	0x28, 0x00, 0xd1, 0x53, 0x20, 0x04, 0xe0, 0x52, 
-	0x20, 0x09, 0xf0, 0x01, 0xff, 0x23, 0x60, 0xb8, 
-	0x28, 0x00, 0xd1, 0x05, 0x20, 0x01, 0xb0, 0x03, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0xf1, 0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 
-	0x22, 0x04, 0x99, 0x02, 0xf0, 0x14, 0xfe, 0x32, 
-	0x20, 0x43, 0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 
-	0x20, 0x0c, 0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 
-	0x88, 0x61, 0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 
-	0xf7, 0xff, 0xf9, 0xa2, 0x81, 0xb8, 0xf7, 0xff, 
-	0xfd, 0x05, 0x28, 0x00, 0xd0, 0xb0, 0xe0, 0x29, 
-	0xe0, 0x00, 0xe0, 0x2a, 0x78, 0x60, 0x99, 0x05, 
-	0x78, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x07, 
-	0xe0, 0x21, 0x20, 0x09, 0xf0, 0x01, 0xfe, 0xf2, 
-	0x60, 0xb8, 0x28, 0x00, 0xd0, 0xa0, 0x20, 0xf1, 
-	0xab, 0x01, 0x70, 0x18, 0x46, 0x68, 0x22, 0x04, 
-	0x99, 0x02, 0xf0, 0x14, 0xfe, 0x07, 0x20, 0x43, 
-	0x70, 0x38, 0x20, 0x34, 0x70, 0x78, 0x20, 0x0c, 
-	0x80, 0x78, 0x78, 0x60, 0x71, 0x38, 0x88, 0x61, 
-	0x46, 0x6a, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xff, 
-	0xf9, 0x77, 0x81, 0xb8, 0xf7, 0xff, 0xfc, 0xda, 
-	0x28, 0x00, 0xd0, 0xa3, 0x20, 0x02, 0x55, 0x70, 
-	0xe7, 0xb0, 0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, 
-	0xd1, 0xac, 0x20, 0x00, 0x9b, 0x06, 0x60, 0x18, 
-	0xe7, 0xa8, 0x00, 0x00, 0x2e, 0x08, 0x54, 0xa0, 
-	0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0x06, 0x09, 
-	0x0e, 0x09, 0x1c, 0x04, 0x20, 0x01, 0x60, 0x18, 
-	0x1c, 0x17, 0xb0, 0x82, 0x29, 0x70, 0xd0, 0x28, 
-	0x29, 0x94, 0xd1, 0x2c, 0x1c, 0x20, 0xf7, 0xff, 
-	0xfc, 0x95, 0x79, 0x38, 0x28, 0x00, 0xd1, 0x2d, 
-	0x20, 0x43, 0x4f, 0x19, 0x70, 0x38, 0x20, 0x34, 
-	0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, 0x01, 0x25, 
-	0x4e, 0x16, 0x19, 0xac, 0x79, 0x20, 0x71, 0x38, 
-	0x88, 0xe1, 0x46, 0x6a, 0x20, 0x95, 0x68, 0xbb, 
-	0xf7, 0xff, 0xf9, 0x3e, 0x81, 0xb8, 0xf7, 0xff, 
-	0xfc, 0xa1, 0x28, 0x00, 0xd1, 0x01, 0x25, 0x00, 
-	0xe0, 0x14, 0x20, 0x7d, 0x00, 0xc0, 0xf7, 0xff, 
-	0xfc, 0x4f, 0x81, 0x20, 0x20, 0x08, 0x55, 0x70, 
-	0xe0, 0x0b, 0x1c, 0x20, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xff, 0x1d, 0x1c, 0x05, 0xe0, 0x06, 0x29, 0x7f, 
-	0xdc, 0x01, 0x29, 0x45, 0xd1, 0x01, 0x20, 0x00, 
-	0x60, 0x18, 0x25, 0x01, 0x1c, 0x28, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0xa0, 
-	0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x22, 0x01, 
-	0x26, 0x02, 0x01, 0x05, 0x60, 0x1a, 0x1c, 0x1f, 
-	0x4c, 0x0c, 0x29, 0x33, 0xd0, 0x08, 0x29, 0x70, 
-	0xd0, 0x08, 0x29, 0x96, 0xd1, 0x08, 0xf7, 0xff, 
-	0xfc, 0x49, 0x20, 0x00, 0x60, 0x38, 0xe0, 0x01, 
-	0xf7, 0xff, 0xfc, 0x44, 0x55, 0x66, 0xe0, 0x05, 
-	0x29, 0x7f, 0xdc, 0x01, 0x29, 0x45, 0xd1, 0x01, 
-	0x20, 0x00, 0x60, 0x38, 0x20, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, 
-	0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0xb0, 0x81, 
-	0x91, 0x00, 0x21, 0x01, 0xb0, 0x83, 0x9b, 0x07, 
-	0x60, 0x19, 0x91, 0x02, 0x01, 0x05, 0x99, 0x03, 
-	0x4e, 0x52, 0x19, 0xac, 0x4f, 0x52, 0x29, 0x33, 
-	0xd0, 0x4f, 0x29, 0x70, 0xd0, 0x06, 0x29, 0x96, 
-	0xd1, 0x5d, 0xf7, 0xff, 0xfc, 0x1f, 0x20, 0x00, 
-	0x9b, 0x07, 0x60, 0x18, 0x88, 0xe0, 0x28, 0x00, 
-	0xd1, 0x0f, 0x20, 0x45, 0x70, 0x38, 0x20, 0x47, 
-	0x70, 0x78, 0x20, 0x04, 0x80, 0x78, 0x88, 0x60, 
-	0x80, 0xb8, 0x20, 0x00, 0x71, 0xb8, 0xf7, 0xff, 
-	0xfc, 0x31, 0x28, 0x00, 0xd0, 0x75, 0x20, 0x02, 
-	0xe0, 0x51, 0x20, 0x05, 0xf0, 0x01, 0xfe, 0x26, 
-	0x4f, 0x42, 0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 
-	0x20, 0x01, 0xe0, 0x76, 0x21, 0x43, 0x70, 0x39, 
-	0x21, 0x34, 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, 
-	0x99, 0x03, 0x29, 0x70, 0xd1, 0x03, 0x21, 0x00, 
-	0xab, 0x00, 0x70, 0x99, 0xe0, 0x08, 0x9a, 0x06, 
-	0x78, 0x91, 0xab, 0x00, 0x70, 0x99, 0x88, 0xe1, 
-	0x9a, 0x06, 0x88, 0x12, 0x42, 0x91, 0xd1, 0x04, 
-	0x78, 0x61, 0x71, 0x39, 0x88, 0x61, 0x1c, 0x03, 
-	0xe0, 0x02, 0x79, 0x22, 0x71, 0x3a, 0x1c, 0x03, 
-	0x46, 0x6a, 0x20, 0x96, 0xf7, 0xff, 0xf8, 0x9c, 
-	0x81, 0xb8, 0xf7, 0xff, 0xfc, 0x09, 0x28, 0x00, 
-	0xd1, 0xcd, 0x68, 0xb8, 0xf0, 0x01, 0xfe, 0x1c, 
-	0xe7, 0xd2, 0x88, 0xe0, 0x28, 0x00, 0xd1, 0x0f, 
-	0x20, 0x45, 0x70, 0x38, 0x20, 0x47, 0x70, 0x78, 
-	0x20, 0x04, 0x80, 0x78, 0x88, 0x60, 0x80, 0xb8, 
-	0x20, 0x00, 0x71, 0xb8, 0xf7, 0xff, 0xfb, 0xea, 
-	0x28, 0x00, 0xd1, 0xb8, 0xe0, 0x38, 0xe0, 0x2e, 
-	0x78, 0x60, 0x79, 0x21, 0x42, 0x88, 0xd1, 0x02, 
-	0x20, 0x02, 0x55, 0x70, 0xe7, 0xb8, 0x79, 0x39, 
-	0x42, 0x81, 0xd1, 0x02, 0x20, 0x08, 0x55, 0x70, 
-	0xe0, 0x2a, 0x20, 0x05, 0xf0, 0x01, 0xfd, 0xd2, 
-	0x60, 0xb8, 0x28, 0x00, 0xd0, 0xac, 0x21, 0x00, 
-	0xab, 0x00, 0x70, 0x99, 0x21, 0x43, 0x70, 0x39, 
-	0x21, 0x34, 0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, 
-	0x78, 0x61, 0x71, 0x39, 0x88, 0x61, 0x46, 0x6a, 
-	0x1c, 0x03, 0x20, 0x96, 0xf7, 0xff, 0xf8, 0x5c, 
-	0x81, 0xb8, 0xf7, 0xff, 0xfb, 0xbf, 0x28, 0x00, 
-	0xd1, 0x8d, 0x68, 0xb8, 0xf0, 0x01, 0xfd, 0xdc, 
-	0xe0, 0x00, 0xe0, 0x09, 0xe7, 0x87, 0x99, 0x03, 
-	0x29, 0x7f, 0xdc, 0x02, 0x99, 0x03, 0x29, 0x45, 
-	0xd1, 0x02, 0x20, 0x00, 0x9b, 0x07, 0x60, 0x18, 
-	0x98, 0x02, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0xa0, 
-	0x2e, 0x08, 0x54, 0x80, 0x2e, 0x08, 0x54, 0x90, 
-	0xb5, 0x00, 0x06, 0x01, 0x0e, 0x09, 0x22, 0x45, 
-	0x48, 0x07, 0x70, 0x02, 0x22, 0x41, 0x70, 0x42, 
-	0x22, 0x04, 0x80, 0x42, 0x71, 0x01, 0xf7, 0xff, 
-	0xfb, 0x95, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x80, 0xb5, 0x00, 0x06, 0x01, 
-	0x0e, 0x09, 0x22, 0x45, 0x48, 0x07, 0x70, 0x02, 
-	0x22, 0x49, 0x70, 0x42, 0x22, 0x04, 0x80, 0x42, 
-	0x71, 0x01, 0xf7, 0xff, 0xfb, 0x7f, 0x28, 0x00, 
-	0xd1, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x54, 0x80, 
-	0xb5, 0x00, 0x06, 0x01, 0x0e, 0x09, 0x22, 0x43, 
-	0x48, 0x07, 0x70, 0x02, 0x22, 0x32, 0x70, 0x42, 
-	0x22, 0x04, 0x80, 0x42, 0x71, 0x01, 0xf7, 0xff, 
-	0xfb, 0x69, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x80, 0xb5, 0x80, 0x79, 0x41, 
-	0xb0, 0x82, 0xab, 0x01, 0x70, 0x19, 0x1c, 0x41, 
-	0x46, 0x68, 0x22, 0x04, 0xf0, 0x14, 0xfc, 0x72, 
-	0x20, 0x43, 0x4f, 0x0b, 0x70, 0x38, 0x20, 0x34, 
-	0x70, 0x78, 0x20, 0x0c, 0x80, 0x78, 0x46, 0x6a, 
-	0x21, 0x00, 0x20, 0x92, 0x68, 0xbb, 0xf7, 0xfe, 
-	0xff, 0xe3, 0x81, 0xb8, 0xf7, 0xff, 0xfb, 0x46, 
-	0x28, 0x00, 0xd1, 0x00, 0xe0, 0x00, 0x20, 0x01, 
-	0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x54, 0x80, 0xb5, 0xf0, 0x00, 0xc6, 
-	0x18, 0x36, 0x01, 0x36, 0x1c, 0x07, 0xb0, 0x84, 
-	0x48, 0x0d, 0x90, 0x03, 0x18, 0x34, 0x68, 0xa0, 
-	0x28, 0x00, 0xd0, 0x0b, 0x46, 0x69, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x48, 0x1c, 0x05, 0x28, 0x34, 
-	0xd1, 0x02, 0x98, 0x01, 0xf0, 0x01, 0xfd, 0x48, 
-	0x2d, 0x00, 0xd1, 0xf3, 0x20, 0x00, 0x99, 0x03, 
-	0x51, 0x88, 0x60, 0x60, 0x60, 0xa0, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x57, 0xc0, 0xb4, 0xb0, 0x06, 0x0f, 
-	0x0e, 0x3f, 0x00, 0xc3, 0x18, 0x18, 0x01, 0x00, 
-	0x49, 0x15, 0x18, 0x41, 0x20, 0x00, 0x68, 0x8b, 
-	0x2b, 0x0a, 0xda, 0x23, 0x33, 0x01, 0x60, 0x8b, 
-	0x68, 0x4d, 0x19, 0x4c, 0x34, 0x80, 0x71, 0x27, 
-	0x2f, 0x34, 0xd1, 0x14, 0x78, 0x14, 0x68, 0x4d, 
-	0x00, 0x6b, 0x19, 0x5b, 0x00, 0x9b, 0x18, 0xcb, 
-	0x73, 0x1c, 0x68, 0x54, 0x68, 0x4d, 0x00, 0x6b, 
-	0x19, 0x5b, 0x00, 0x9b, 0x18, 0xcb, 0x61, 0x1c, 
-	0x89, 0x17, 0x68, 0x4c, 0x00, 0x63, 0x19, 0x1b, 
-	0x00, 0x9b, 0x18, 0xca, 0x82, 0x97, 0x68, 0x4a, 
-	0x32, 0x01, 0x60, 0x4a, 0x2a, 0x0a, 0xdb, 0x00, 
-	0x60, 0x48, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, 
-	0x2e, 0x08, 0x57, 0xc0, 0xb4, 0xf0, 0x00, 0xc7, 
-	0x18, 0x3f, 0x01, 0x3f, 0x4a, 0x16, 0x18, 0xbc, 
-	0x25, 0x00, 0x68, 0xa0, 0x28, 0x00, 0xdc, 0x02, 
-	0x1c, 0x28, 0xbc, 0xf0, 0x47, 0x70, 0x38, 0x01, 
-	0x60, 0xa0, 0x59, 0xd3, 0x18, 0xe0, 0x30, 0x80, 
-	0x79, 0x00, 0x28, 0x34, 0xd1, 0x14, 0x1c, 0x1e, 
-	0x00, 0x5b, 0x19, 0x9b, 0x00, 0x9b, 0x18, 0xe3, 
-	0x7b, 0x1b, 0x70, 0x0b, 0x59, 0xd6, 0x00, 0x73, 
-	0x19, 0x9b, 0x00, 0x9b, 0x18, 0xe3, 0x69, 0x1b, 
-	0x60, 0x4b, 0x59, 0xd6, 0x00, 0x73, 0x19, 0x9b, 
-	0x00, 0x9b, 0x18, 0xe3, 0x8a, 0x9b, 0x81, 0x0b, 
-	0x59, 0xd1, 0x31, 0x01, 0x51, 0xd1, 0x29, 0x0a, 
-	0xdb, 0xdb, 0x51, 0xd5, 0xbc, 0xf0, 0x47, 0x70, 
-	0x2e, 0x08, 0x57, 0xc0, 0xb5, 0x00, 0x78, 0x01, 
-	0x48, 0x0c, 0x70, 0x01, 0x78, 0x01, 0x29, 0x01, 
-	0xd0, 0x01, 0x29, 0x02, 0xd1, 0x0e, 0x48, 0x0a, 
-	0x29, 0x01, 0xd1, 0x04, 0xca, 0x0a, 0xc0, 0x0a, 
-	0xca, 0x0a, 0xc0, 0x0a, 0xe0, 0x01, 0x88, 0x11, 
-	0x80, 0x01, 0xf0, 0x00, 0xf8, 0x32, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x88, 
-	0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x90, 0x27, 0x00, 
-	0x48, 0x0d, 0x70, 0x07, 0x80, 0x87, 0x20, 0x03, 
-	0xf0, 0x01, 0xfc, 0xc0, 0x28, 0x00, 0xda, 0x03, 
-	0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x00, 0x20, 0x01, 0x27, 0xff, 0x4a, 0x07, 
-	0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x18, 0x9c, 
-	0x70, 0xa0, 0x52, 0xd7, 0x31, 0x01, 0x29, 0x08, 
-	0xdb, 0xf6, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x88, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0x00, 0xf0, 0x01, 0xfb, 0x5f, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00, 0x48, 0x1f, 
-	0x78, 0x00, 0x4c, 0x1f, 0x28, 0x01, 0xd1, 0x1c, 
-	0x78, 0x60, 0x28, 0x23, 0xd0, 0x0f, 0xdc, 0x06, 
-	0x28, 0x21, 0xd0, 0x10, 0x28, 0x22, 0xd1, 0x28, 
-	0xf0, 0x00, 0xf8, 0x62, 0xe0, 0x24, 0x28, 0x32, 
-	0xd0, 0x0c, 0x28, 0x34, 0xd1, 0x21, 0x68, 0xa5, 
-	0xf0, 0x00, 0xf8, 0xea, 0xe0, 0x1c, 0x68, 0xa5, 
-	0xf0, 0x00, 0xf8, 0x88, 0xe0, 0x18, 0xf0, 0x00, 
-	0xf8, 0x25, 0xe0, 0x15, 0xf0, 0x00, 0xf8, 0xf8, 
-	0xe0, 0x12, 0x28, 0x02, 0xd1, 0x11, 0x88, 0x20, 
-	0xf0, 0x01, 0xfc, 0x28, 0x88, 0x20, 0x28, 0x50, 
-	0xdd, 0x04, 0x28, 0x58, 0xdc, 0x02, 0xf0, 0x00, 
-	0xf9, 0x03, 0xe0, 0x05, 0x28, 0x60, 0xdd, 0x04, 
-	0x28, 0x68, 0xdc, 0x02, 0xf0, 0x00, 0xf9, 0x22, 
-	0x1c, 0x07, 0x2f, 0x00, 0xd1, 0x02, 0x1c, 0x28, 
-	0xf0, 0x01, 0xfc, 0x4e, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x88, 
-	0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x90, 0x20, 0x01, 
-	0xb0, 0x81, 0x90, 0x00, 0xf0, 0x00, 0xf9, 0x2c, 
-	0x1c, 0x04, 0xd5, 0x01, 0x20, 0x01, 0xe0, 0x1a, 
-	0x4f, 0x0f, 0x88, 0xb8, 0x00, 0xe1, 0x1b, 0x09, 
-	0x00, 0x89, 0x4a, 0x0e, 0x52, 0x50, 0x78, 0x79, 
-	0x46, 0x6b, 0x22, 0x00, 0x1c, 0x20, 0xf0, 0x00, 
-	0xfb, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x20, 
-	0xf0, 0x00, 0xf9, 0x60, 0x20, 0x35, 0x70, 0x38, 
-	0x20, 0x4a, 0x70, 0x78, 0x20, 0x04, 0x80, 0x78, 
-	0xf0, 0x00, 0xf9, 0xee, 0x98, 0x00, 0xb0, 0x01, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0xf0, 0x20, 0x01, 0xb0, 0x81, 0x90, 0x00, 
-	0x4c, 0x14, 0x88, 0xa6, 0x27, 0x00, 0x4d, 0x14, 
-	0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x19, 0x41, 
-	0x78, 0x89, 0x29, 0x01, 0xd0, 0x0d, 0x5a, 0x28, 
-	0x42, 0xb0, 0xd1, 0x0a, 0x78, 0x61, 0x46, 0x6b, 
-	0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0xd6, 
-	0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf9, 0x31, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xe7, 
-	0x20, 0x35, 0x70, 0x20, 0x20, 0x4b, 0x70, 0x60, 
-	0x20, 0x04, 0x80, 0x60, 0xf0, 0x00, 0xf9, 0xbc, 
-	0x98, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xc0, 
-	0x2e, 0x08, 0x56, 0xe0, 0xb5, 0xf0, 0x20, 0x00, 
-	0xb0, 0x87, 0x90, 0x00, 0x48, 0x2a, 0x89, 0x87, 
-	0x68, 0x85, 0x79, 0x80, 0x90, 0x05, 0x24, 0x00, 
-	0xaa, 0x03, 0xb4, 0x04, 0x04, 0x39, 0x0c, 0x09, 
-	0x9a, 0x06, 0x1c, 0x28, 0xab, 0x07, 0xf0, 0x00, 
-	0xfa, 0x21, 0xb0, 0x01, 0x90, 0x01, 0x28, 0x00, 
-	0xdb, 0x04, 0x98, 0x05, 0xf0, 0x00, 0xf9, 0x2c, 
-	0x1c, 0x06, 0xd5, 0x01, 0x20, 0x00, 0xe0, 0x36, 
-	0x98, 0x00, 0x30, 0x01, 0x90, 0x00, 0x98, 0x01, 
-	0x18, 0x2d, 0x1a, 0x3f, 0x2f, 0x00, 0xdd, 0x0b, 
-	0x04, 0x38, 0x0c, 0x00, 0xf0, 0x01, 0xfb, 0x96, 
-	0x1c, 0x04, 0xd0, 0xef, 0x1c, 0x20, 0x1c, 0x29, 
-	0x1c, 0x3a, 0xf0, 0x14, 0xfa, 0xaf, 0x1c, 0x25, 
-	0xa9, 0x06, 0x78, 0x09, 0x1c, 0x30, 0xaa, 0x03, 
-	0xab, 0x02, 0xf0, 0x00, 0xfa, 0x83, 0x28, 0x00, 
-	0xd0, 0xe0, 0x98, 0x00, 0x28, 0x02, 0xda, 0x01, 
-	0x2f, 0x00, 0xdc, 0xc9, 0x2c, 0x00, 0xd0, 0x02, 
-	0x1c, 0x20, 0xf0, 0x01, 0xfb, 0xa1, 0x2f, 0x00, 
-	0xd0, 0x01, 0x20, 0x00, 0x90, 0x02, 0x00, 0xf0, 
-	0x1b, 0x80, 0x00, 0x80, 0x49, 0x07, 0x18, 0x40, 
-	0x78, 0x80, 0x28, 0x02, 0xd1, 0x02, 0x1c, 0x30, 
-	0xf0, 0x00, 0xf8, 0xc8, 0x98, 0x02, 0xb0, 0x07, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x09, 0x79, 0x38, 
-	0xf0, 0x00, 0xf8, 0xe2, 0x28, 0x00, 0xdb, 0x06, 
-	0x78, 0x79, 0x46, 0x6b, 0x22, 0x00, 0xf0, 0x00, 
-	0xfa, 0x51, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, 
-	0x90, 0x00, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, 
-	0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x09, 0x79, 0x38, 
-	0xf0, 0x00, 0xf8, 0xca, 0x28, 0x00, 0xdb, 0x06, 
-	0x78, 0x79, 0x46, 0x6b, 0x22, 0x00, 0xf0, 0x00, 
-	0xfa, 0x39, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, 
-	0x90, 0x00, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, 
-	0xb5, 0x90, 0xb0, 0x81, 0x48, 0x0f, 0x88, 0x00, 
-	0xf0, 0x00, 0xf8, 0xca, 0x1c, 0x07, 0xd5, 0x01, 
-	0x20, 0x01, 0xe0, 0x13, 0x20, 0x00, 0x00, 0xf9, 
-	0x1b, 0xc9, 0x00, 0x89, 0x4a, 0x0a, 0x18, 0x8c, 
-	0x80, 0xa0, 0x21, 0x50, 0x46, 0x6b, 0x22, 0x00, 
-	0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x17, 0x78, 0xa0, 
-	0x28, 0x02, 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0x71, 0x98, 0x00, 0xb0, 0x01, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xc0, 
-	0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x00, 0xb0, 0x81, 
-	0x48, 0x0b, 0x88, 0x00, 0xf0, 0x00, 0xf8, 0xbc, 
-	0x28, 0x00, 0xda, 0x01, 0x20, 0x01, 0xe0, 0x0c, 
-	0x21, 0x00, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, 
-	0x4b, 0x06, 0x18, 0xd2, 0x80, 0xd1, 0x46, 0x6b, 
-	0x22, 0x00, 0x21, 0x60, 0xf0, 0x00, 0xf9, 0xf2, 
-	0x98, 0x00, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0xf0, 0x4c, 0x22, 0x23, 0x04, 0x5e, 0xe1, 
-	0x1f, 0x58, 0x29, 0x08, 0xda, 0x35, 0x27, 0x00, 
-	0x4d, 0x1f, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, 
-	0x19, 0x49, 0x78, 0x89, 0x29, 0x01, 0xd1, 0x2f, 
-	0x22, 0x00, 0x00, 0xd3, 0x1a, 0x9b, 0x00, 0x9b, 
-	0x19, 0x5b, 0x78, 0x9e, 0x2e, 0x01, 0xd0, 0x02, 
-	0x78, 0xdb, 0x42, 0x8b, 0xd0, 0x02, 0x32, 0x01, 
-	0x2a, 0x08, 0xdb, 0xf2, 0x2a, 0x08, 0xda, 0x04, 
-	0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x09, 
-	0xdb, 0xea, 0x29, 0x09, 0xd0, 0x15, 0x00, 0xf8, 
-	0x1b, 0xc0, 0x00, 0x80, 0x19, 0x40, 0x70, 0xc1, 
-	0x21, 0x02, 0x70, 0x81, 0x21, 0x00, 0x80, 0x81, 
-	0x80, 0xc1, 0x82, 0x01, 0x60, 0xc1, 0x83, 0x01, 
-	0x61, 0x41, 0x76, 0x81, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0x7d, 0x88, 0xa0, 0x30, 0x01, 0x80, 0xa0, 
-	0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x37, 0x01, 0x2f, 0x08, 0xdb, 0xc5, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x88, 
-	0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x90, 0x1c, 0x07, 
-	0xd5, 0x06, 0x2f, 0x08, 0xdb, 0x04, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x65, 0x00, 0xf8, 
-	0x1b, 0xc0, 0x00, 0x80, 0x49, 0x0a, 0x18, 0x44, 
-	0x88, 0xe0, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, 
-	0xfa, 0x79, 0x20, 0x00, 0x80, 0xe0, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfd, 0x50, 0x20, 0x01, 0x70, 0xa0, 
-	0x48, 0x04, 0x88, 0x81, 0x39, 0x01, 0x80, 0x81, 
-	0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x1a, 0x88, 
-	0xb4, 0x80, 0x06, 0x02, 0x0e, 0x12, 0x20, 0x00, 
-	0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 
-	0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, 
-	0x78, 0xdb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, 
-	0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 
-	0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 
-	0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, 
-	0x88, 0x9b, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, 
-	0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 
-	0x49, 0x08, 0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 
-	0x18, 0x5b, 0x78, 0x9f, 0x2f, 0x01, 0xd0, 0x02, 
-	0x88, 0xdb, 0x42, 0x93, 0xd0, 0x04, 0x30, 0x01, 
-	0x28, 0x08, 0xdb, 0xf2, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0x80, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 
-	0x49, 0x05, 0x18, 0x47, 0x88, 0xb8, 0x28, 0x00, 
-	0xd0, 0x03, 0xf0, 0x01, 0xfa, 0x13, 0x20, 0x00, 
-	0x80, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xe0, 0xb5, 0x80, 0x00, 0xc3, 
-	0x1a, 0x18, 0x00, 0x80, 0x49, 0x05, 0x18, 0x47, 
-	0x88, 0xf8, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, 
-	0xfa, 0x01, 0x20, 0x00, 0x80, 0xf8, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0x00, 0x49, 0x03, 0x78, 0x08, 0xf0, 0x01, 
-	0xf9, 0x53, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x56, 0xc0, 0xb5, 0x00, 0x49, 0x03, 
-	0x78, 0x08, 0xf0, 0x01, 0xf9, 0x49, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xd0, 
-	0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 0x49, 0x0a, 
-	0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 0x18, 0x5b, 
-	0x78, 0xdb, 0x42, 0x93, 0xd1, 0x06, 0x00, 0xc3, 
-	0x1a, 0x18, 0x00, 0x80, 0x5a, 0x08, 0x06, 0x00, 
-	0x0e, 0x00, 0x47, 0x70, 0x30, 0x01, 0x28, 0x08, 
-	0xdb, 0xee, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x56, 0xe0, 0xb5, 0xf0, 0x06, 0x05, 
-	0x0e, 0x2d, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x17, 
-	0x1c, 0x59, 0x1c, 0x1a, 0x1c, 0x4e, 0xb0, 0x81, 
-	0x2d, 0x86, 0xd0, 0x3b, 0xdc, 0x0b, 0x1f, 0xef, 
-	0x3f, 0x79, 0x2f, 0x06, 0xd2, 0x3c, 0xa3, 0x02, 
-	0x5d, 0xdb, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
-	0x3a, 0x32, 0x32, 0x32, 0x32, 0x32, 0x2d, 0xa0, 
-	0xd0, 0x15, 0xdc, 0x0d, 0x20, 0x02, 0x18, 0x1b, 
-	0x33, 0x01, 0x2d, 0x87, 0xd0, 0x01, 0x2d, 0x88, 
-	0xd1, 0x2a, 0x70, 0x15, 0x70, 0x08, 0x70, 0x34, 
-	0x78, 0x38, 0x70, 0x18, 0x20, 0x04, 0xe0, 0x25, 
-	0x2d, 0xa1, 0xd0, 0x04, 0x2d, 0xa2, 0xd1, 0x1f, 
-	0x20, 0xa0, 0x70, 0x10, 0xe0, 0x17, 0x70, 0x15, 
-	0x1c, 0x0d, 0x88, 0xb9, 0x46, 0x6a, 0x1c, 0x28, 
-	0xf0, 0x00, 0xf8, 0x5d, 0xa8, 0x00, 0x88, 0x00, 
-	0x18, 0x28, 0x70, 0x04, 0x88, 0xb9, 0x1e, 0x4a, 
-	0x68, 0x39, 0x30, 0x01, 0xf0, 0x14, 0xf8, 0xbe, 
-	0x88, 0xb8, 0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 
-	0x30, 0x01, 0xe0, 0x07, 0x70, 0x15, 0x20, 0x01, 
-	0x70, 0x08, 0x70, 0x34, 0x20, 0x03, 0xe0, 0x01, 
-	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x16, 
-	0x0e, 0x36, 0x9d, 0x05, 0x1c, 0x04, 0x78, 0x00, 
-	0x70, 0x18, 0xb0, 0x82, 0x46, 0x6a, 0x34, 0x01, 
-	0x1c, 0x20, 0xa9, 0x01, 0x1c, 0x1f, 0xf0, 0x00, 
-	0xf8, 0x57, 0x21, 0x00, 0x43, 0xc9, 0x28, 0x00, 
-	0xdb, 0x06, 0xa8, 0x00, 0x88, 0x00, 0x18, 0x20, 
-	0x78, 0x02, 0x30, 0x01, 0x42, 0xb2, 0xd0, 0x01, 
-	0x1c, 0x08, 0xe0, 0x20, 0x78, 0x3a, 0x2a, 0x85, 
-	0xd0, 0x17, 0xdc, 0x06, 0x2a, 0x80, 0xd0, 0x10, 
-	0x2a, 0x83, 0xd0, 0x12, 0x2a, 0x84, 0xd1, 0xf3, 
-	0xe0, 0x0f, 0x2a, 0x86, 0xd0, 0x0d, 0x2a, 0xa0, 
-	0xd0, 0x01, 0x2a, 0xa1, 0xd1, 0xec, 0x60, 0x28, 
-	0xa8, 0x01, 0x88, 0x00, 0x38, 0x01, 0x80, 0xa8, 
-	0xe0, 0x03, 0x78, 0x00, 0x23, 0x80, 0x40, 0x18, 
-	0x70, 0x28, 0xa8, 0x01, 0x88, 0x00, 0xa9, 0x00, 
-	0x88, 0x09, 0x18, 0x40, 0x30, 0x01, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x04, 0x09, 
-	0x0c, 0x09, 0xb0, 0x81, 0xab, 0x00, 0x80, 0x19, 
-	0x29, 0x7f, 0xdc, 0x05, 0xa9, 0x00, 0x88, 0x09, 
-	0x70, 0x01, 0x20, 0x01, 0x80, 0x10, 0xe0, 0x15, 
-	0xa9, 0x00, 0x88, 0x09, 0x29, 0xff, 0xdc, 0x07, 
-	0x21, 0x81, 0x70, 0x01, 0x21, 0x02, 0x80, 0x11, 
-	0xa9, 0x00, 0x88, 0x09, 0x70, 0x41, 0xe0, 0x09, 
-	0x21, 0x82, 0x70, 0x01, 0x21, 0x03, 0x80, 0x11, 
-	0xa9, 0x00, 0x78, 0x49, 0x70, 0x41, 0xa9, 0x00, 
-	0x78, 0x09, 0x70, 0x81, 0xb0, 0x01, 0x47, 0x70, 
-	0xb4, 0x90, 0x27, 0x01, 0x78, 0x04, 0x23, 0x80, 
-	0x40, 0x23, 0x2b, 0x80, 0xd1, 0x14, 0x06, 0x63, 
-	0x0e, 0x5b, 0x80, 0x13, 0x88, 0x13, 0x2b, 0x01, 
-	0xd1, 0x01, 0x78, 0x40, 0xe0, 0x05, 0x2b, 0x02, 
-	0xd1, 0x07, 0x78, 0x43, 0x02, 0x1b, 0x78, 0x80, 
-	0x18, 0x18, 0x80, 0x08, 0x88, 0x10, 0x30, 0x01, 
-	0xe0, 0x04, 0x27, 0x00, 0x43, 0xff, 0xe0, 0x02, 
-	0x80, 0x0c, 0x20, 0x01, 0x80, 0x10, 0x1c, 0x38, 
-	0xbc, 0x90, 0x47, 0x70, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x06, 0x09, 0x0e, 0x09, 0x1c, 0x18, 0x00, 0xfb, 
-	0x1b, 0xdb, 0x00, 0x9b, 0xb0, 0x82, 0x4c, 0x42, 
-	0x19, 0x1e, 0x78, 0xb3, 0x1e, 0x9c, 0x4b, 0x41, 
-	0x93, 0x01, 0x1d, 0x1d, 0x2c, 0x07, 0xd2, 0x63, 
-	0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x60, 0x65, 0x03, 0x08, 0x40, 0x24, 0x6b, 0x00, 
-	0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x80, 
-	0xe0, 0x66, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 
-	0xfa, 0x83, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x5a, 
-	0x78, 0xb0, 0x28, 0x04, 0xd1, 0x57, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xf7, 0x1c, 0x01, 
-	0xd0, 0x59, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, 
-	0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x68, 
-	0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x46, 
-	0xe0, 0x36, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 
-	0xfc, 0x53, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x3e, 
-	0x78, 0xb0, 0x28, 0x04, 0xd1, 0x3b, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xdb, 0x1c, 0x01, 
-	0xd0, 0x3d, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, 
-	0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x4c, 
-	0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x2a, 
-	0xe0, 0x1a, 0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 
-	0xfc, 0x03, 0x1c, 0x04, 0x28, 0x01, 0xd1, 0x22, 
-	0x78, 0xb0, 0x28, 0x04, 0xd1, 0x1f, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf7, 0xff, 0xfb, 0xbf, 0x1c, 0x01, 
-	0xd0, 0x21, 0x9b, 0x01, 0x68, 0x9d, 0x46, 0x6b, 
-	0x22, 0x00, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x30, 
-	0x1c, 0x04, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x0e, 
-	0x1c, 0x28, 0xf0, 0x01, 0xf8, 0xb5, 0xe0, 0x12, 
-	0xe0, 0x10, 0x1c, 0x02, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0x17, 0xe0, 0x09, 0x1c, 0x03, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x62, 0xe0, 0x04, 0xe0, 0x06, 
-	0x1c, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xfd, 0x14, 
-	0x1c, 0x04, 0xe0, 0x00, 0x24, 0x00, 0x1c, 0x20, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, 
-	0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x17, 
-	0x22, 0x01, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 
-	0xb0, 0x81, 0x60, 0x3a, 0x90, 0x00, 0x4e, 0x1f, 
-	0x19, 0x85, 0x29, 0x21, 0xd0, 0x02, 0x29, 0x80, 
-	0xd0, 0x2f, 0xe0, 0x06, 0x20, 0x03, 0xf0, 0x01, 
-	0xf8, 0x5d, 0x4c, 0x1b, 0x60, 0xa0, 0x1c, 0x01, 
-	0xd1, 0x01, 0x20, 0x00, 0xe0, 0x2a, 0x20, 0x32, 
-	0x70, 0x20, 0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, 
-	0x80, 0x60, 0x98, 0x00, 0x5a, 0x30, 0x80, 0xa0, 
-	0x78, 0xe8, 0x71, 0xa0, 0x1c, 0x0b, 0x79, 0xa1, 
-	0x22, 0x00, 0x20, 0x82, 0xf7, 0xff, 0xfe, 0x66, 
-	0x81, 0xa0, 0xf7, 0xff, 0xfe, 0x35, 0x28, 0x00, 
-	0xd1, 0x01, 0x60, 0x38, 0xe7, 0xe5, 0x78, 0xe8, 
-	0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 
-	0x04, 0x1b, 0x43, 0x18, 0x49, 0x09, 0xf0, 0x00, 
-	0xff, 0xe9, 0x80, 0xa8, 0x20, 0x03, 0x70, 0xa8, 
-	0xe0, 0x03, 0x7e, 0xa8, 0x28, 0x00, 0xd1, 0x00, 
-	0x60, 0x38, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, 
-	0x2e, 0x08, 0x56, 0xc0, 0x00, 0x00, 0x27, 0x10, 
-	0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x22, 0x01, 
-	0x60, 0x1a, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, 
-	0xb0, 0x81, 0x92, 0x00, 0x1c, 0x1f, 0x4e, 0x54, 
-	0x19, 0x95, 0x4c, 0x54, 0x29, 0x80, 0xd0, 0x35, 
-	0xdc, 0x04, 0x29, 0x22, 0xd0, 0x13, 0x29, 0x50, 
-	0xd1, 0x0d, 0xe0, 0x0e, 0x29, 0x83, 0xd0, 0x11, 
-	0x29, 0x84, 0xd1, 0x08, 0xf7, 0xff, 0xfd, 0xd4, 
-	0x20, 0x03, 0xf0, 0x01, 0xf8, 0x03, 0x4c, 0x4c, 
-	0x60, 0xa0, 0x1c, 0x01, 0xd1, 0x6d, 0x20, 0x00, 
-	0xe0, 0x89, 0x20, 0x02, 0xe0, 0x67, 0xf7, 0xff, 
-	0xfd, 0xc7, 0xe7, 0xfa, 0xf7, 0xff, 0xfd, 0xc4, 
-	0x20, 0x34, 0x70, 0x20, 0x20, 0x31, 0x70, 0x60, 
-	0x20, 0x04, 0x80, 0x60, 0x78, 0xe8, 0x71, 0x20, 
-	0xf7, 0xff, 0xfd, 0xde, 0x28, 0x00, 0xd1, 0x01, 
-	0x60, 0x38, 0xe0, 0x74, 0x78, 0xe8, 0x30, 0x50, 
-	0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 
-	0x43, 0x18, 0x49, 0x3c, 0xf0, 0x00, 0xff, 0x92, 
-	0x80, 0xa8, 0xe0, 0x65, 0xf7, 0xff, 0xfd, 0xa8, 
-	0x9a, 0x03, 0x78, 0x10, 0x28, 0x80, 0xd1, 0x21, 
-	0x20, 0x32, 0x70, 0x20, 0x20, 0x23, 0x70, 0x60, 
-	0x20, 0x0c, 0x80, 0x60, 0x9a, 0x00, 0x5a, 0xb0, 
-	0x80, 0xa0, 0x78, 0xe9, 0x71, 0xa1, 0x22, 0x00, 
-	0x20, 0x81, 0x68, 0xa3, 0xf7, 0xff, 0xfd, 0xe6, 
-	0x81, 0xa0, 0xf7, 0xff, 0xfd, 0xb5, 0x28, 0x00, 
-	0xd0, 0xc1, 0x78, 0xe8, 0x30, 0x50, 0x04, 0x00, 
-	0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 
-	0x49, 0x28, 0xf0, 0x00, 0xff, 0x6b, 0x80, 0xa8, 
-	0x20, 0x07, 0xe0, 0x20, 0x20, 0x32, 0x70, 0x20, 
-	0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, 0x80, 0x60, 
-	0x9a, 0x00, 0x5a, 0xb0, 0x80, 0xa0, 0x78, 0xe9, 
-	0x71, 0xa1, 0x22, 0x00, 0x20, 0xa2, 0x68, 0xa3, 
-	0xf7, 0xff, 0xfd, 0xc4, 0x81, 0xa0, 0xf7, 0xff, 
-	0xfd, 0x93, 0x28, 0x00, 0xd0, 0x0a, 0x78, 0xe8, 
-	0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 
-	0x04, 0x1b, 0x43, 0x18, 0x49, 0x17, 0xf0, 0x00, 
-	0xff, 0x49, 0x80, 0xa8, 0x20, 0x05, 0x70, 0xa8, 
-	0xe0, 0x1c, 0xe7, 0xff, 0x20, 0x32, 0x70, 0x20, 
-	0x20, 0x23, 0x70, 0x60, 0x20, 0x0c, 0x80, 0x60, 
-	0x9a, 0x00, 0x5a, 0xb0, 0x80, 0xa0, 0x78, 0xe8, 
-	0x71, 0xa0, 0x1c, 0x0b, 0x22, 0x00, 0x1c, 0x01, 
-	0x20, 0x85, 0xf7, 0xff, 0xfd, 0x9f, 0x81, 0xa0, 
-	0xf7, 0xff, 0xfd, 0x78, 0x28, 0x00, 0xd1, 0x01, 
-	0x60, 0x38, 0xe7, 0x78, 0x20, 0x02, 0x70, 0xa8, 
-	0x20, 0x00, 0x60, 0x38, 0x20, 0x01, 0xb0, 0x01, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, 
-	0x2e, 0x08, 0x56, 0xd0, 0x00, 0x00, 0x27, 0x10, 
-	0xb5, 0xff, 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, 
-	0x21, 0x01, 0xb0, 0x84, 0x9a, 0x07, 0x26, 0x01, 
-	0x60, 0x11, 0x00, 0xf9, 0x1b, 0xc9, 0x00, 0x89, 
-	0x91, 0x02, 0x4a, 0x78, 0x92, 0x03, 0x18, 0x8c, 
-	0x28, 0x22, 0xd0, 0x0d, 0x4d, 0x76, 0x28, 0x32, 
-	0xd0, 0x6f, 0x28, 0x34, 0xd0, 0x12, 0x28, 0x60, 
-	0xd1, 0x6c, 0x20, 0x03, 0xf0, 0x00, 0xff, 0x4a, 
-	0x60, 0xa8, 0x1c, 0x01, 0xd1, 0x67, 0xe0, 0x16, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x23, 0x1c, 0x38, 
-	0xf0, 0x00, 0xfc, 0x16, 0x1c, 0x06, 0xd0, 0x5f, 
-	0x20, 0x02, 0xe0, 0xcc, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0x19, 0x89, 0xa8, 0x30, 0x0a, 0x04, 0x00, 
-	0x0c, 0x00, 0xf0, 0x00, 0xff, 0x33, 0x4f, 0x67, 
-	0x60, 0xb8, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x00, 
-	0xe0, 0xbf, 0x89, 0xa9, 0x22, 0x01, 0x02, 0x92, 
-	0x42, 0x91, 0xdc, 0x1e, 0x31, 0x01, 0xab, 0x01, 
-	0x80, 0x19, 0x68, 0xa9, 0x91, 0x00, 0x21, 0x32, 
-	0x70, 0x39, 0x21, 0x23, 0x70, 0x79, 0x21, 0x0c, 
-	0x80, 0x79, 0x99, 0x02, 0x9a, 0x03, 0x5a, 0x51, 
-	0x80, 0xb9, 0x78, 0xe1, 0x71, 0xb9, 0x46, 0x6a, 
-	0x1c, 0x03, 0x20, 0xa0, 0xf7, 0xff, 0xfd, 0x32, 
-	0x81, 0xb8, 0x20, 0x00, 0x82, 0x20, 0x21, 0x05, 
-	0x60, 0xe0, 0x70, 0xa1, 0x9a, 0x07, 0x60, 0x10, 
-	0xe0, 0x1f, 0xab, 0x01, 0x80, 0x1a, 0x68, 0xa9, 
-	0x91, 0x00, 0x21, 0x32, 0x70, 0x39, 0x21, 0x23, 
-	0x70, 0x79, 0x21, 0x0c, 0x80, 0x79, 0x99, 0x02, 
-	0x9a, 0x03, 0x5a, 0x51, 0x80, 0xb9, 0x78, 0xe1, 
-	0x71, 0xb9, 0x46, 0x6a, 0x1c, 0x03, 0x20, 0xa1, 
-	0xf7, 0xff, 0xfd, 0x14, 0x81, 0xb8, 0x68, 0xa8, 
-	0x60, 0xa0, 0x4b, 0x47, 0x18, 0xc0, 0x60, 0xe0, 
-	0x89, 0xa8, 0x1a, 0xc0, 0x82, 0x20, 0x20, 0x06, 
-	0x70, 0xa0, 0xf7, 0xff, 0xfc, 0xe3, 0x28, 0x00, 
-	0xd1, 0x07, 0x68, 0xb8, 0xf0, 0x00, 0xff, 0x08, 
-	0xe0, 0x2f, 0xe0, 0x0e, 0xe0, 0x63, 0xe0, 0x3a, 
-	0xe0, 0x6e, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, 
-	0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 
-	0x49, 0x3a, 0xf0, 0x00, 0xfe, 0x87, 0x80, 0xa0, 
-	0xe0, 0x62, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xae, 
-	0x20, 0x03, 0xf0, 0x00, 0xfe, 0xcb, 0x60, 0xa8, 
-	0x1c, 0x01, 0xd0, 0x98, 0x20, 0x32, 0x70, 0x28, 
-	0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, 0x80, 0x68, 
-	0x98, 0x02, 0x9a, 0x03, 0x5a, 0x10, 0x80, 0xa8, 
-	0x78, 0xe0, 0x71, 0xa8, 0x1c, 0x0b, 0x22, 0x00, 
-	0x1c, 0x01, 0x20, 0x84, 0xf7, 0xff, 0xfc, 0xd6, 
-	0x81, 0xa8, 0xf7, 0xff, 0xfc, 0xa5, 0x28, 0x00, 
-	0xd1, 0x01, 0x26, 0x00, 0xe0, 0x40, 0x78, 0xe0, 
-	0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 
-	0x04, 0x1b, 0x43, 0x18, 0x49, 0x23, 0xf0, 0x00, 
-	0xfe, 0x59, 0x80, 0xa0, 0xe0, 0x32, 0x20, 0x32, 
-	0x70, 0x28, 0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, 
-	0x80, 0x68, 0x98, 0x02, 0x9a, 0x03, 0x5a, 0x10, 
-	0x80, 0xa8, 0x78, 0xe0, 0x71, 0xa8, 0x1c, 0x0b, 
-	0x22, 0x00, 0x1c, 0x01, 0x20, 0xa2, 0xf7, 0xff, 
-	0xfc, 0xb1, 0x81, 0xa8, 0xf7, 0xff, 0xfc, 0x80, 
-	0x28, 0x00, 0xd1, 0x02, 0x9a, 0x07, 0x60, 0x10, 
-	0xe7, 0xd7, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, 
-	0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 
-	0x49, 0x10, 0xf0, 0x00, 0xfe, 0x33, 0x80, 0xa0, 
-	0x21, 0x05, 0x70, 0xa1, 0xe0, 0x0c, 0x28, 0x7f, 
-	0xda, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 
-	0x9a, 0x07, 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x64, 
-	0x1c, 0x06, 0xd0, 0x01, 0x20, 0x08, 0x70, 0xa0, 
-	0x1c, 0x30, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, 
-	0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xd0, 
-	0x00, 0x00, 0x03, 0xff, 0x00, 0x00, 0x27, 0x10, 
-	0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x20, 0x01, 
-	0xb0, 0x84, 0x9a, 0x07, 0x25, 0x01, 0x60, 0x10, 
-	0x98, 0x04, 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 
-	0x90, 0x03, 0x4e, 0xcf, 0x19, 0x87, 0x4c, 0xcf, 
-	0x29, 0x60, 0xd0, 0x6d, 0xdc, 0x0e, 0x29, 0x22, 
-	0xd0, 0x37, 0x29, 0x32, 0xd0, 0x69, 0x29, 0x34, 
-	0xd0, 0x68, 0x29, 0x50, 0xd1, 0x67, 0x20, 0x03, 
-	0xf0, 0x00, 0xfe, 0x40, 0x60, 0xa0, 0x28, 0x00, 
-	0xd1, 0x62, 0xe0, 0x80, 0x29, 0x80, 0xd0, 0x32, 
-	0x29, 0x84, 0xd0, 0x5e, 0x29, 0x86, 0xd1, 0x5a, 
-	0x98, 0x04, 0xf7, 0xff, 0xfc, 0x01, 0x20, 0x86, 
-	0x76, 0xb8, 0xf7, 0xff, 0xfb, 0x41, 0x1c, 0x05, 
-	0xd5, 0x73, 0x20, 0x01, 0xab, 0x01, 0x70, 0x18, 
-	0x21, 0x32, 0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 
-	0x21, 0x0c, 0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, 
-	0x80, 0xa0, 0x78, 0xf9, 0x71, 0xa1, 0x20, 0x88, 
-	0x68, 0xa3, 0xaa, 0x01, 0xf7, 0xff, 0xfc, 0x3a, 
-	0x81, 0xa0, 0xf7, 0xff, 0xfc, 0x09, 0x28, 0x00, 
-	0xd1, 0x5c, 0x1c, 0x28, 0xf7, 0xff, 0xfb, 0x6e, 
-	0xe0, 0xdd, 0x98, 0x04, 0xf7, 0xff, 0xfb, 0xdc, 
-	0x98, 0x04, 0xf0, 0x00, 0xfa, 0xe1, 0x1c, 0x05, 
-	0xd0, 0x2a, 0x20, 0x02, 0xe1, 0x4c, 0x98, 0x04, 
-	0xf7, 0xff, 0xfb, 0xd2, 0x9a, 0x06, 0x78, 0x10, 
-	0x28, 0x80, 0xd1, 0x27, 0x21, 0x32, 0x70, 0x21, 
-	0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, 
-	0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, 0x78, 0xf9, 
-	0x71, 0xa1, 0x22, 0x00, 0x20, 0x81, 0x68, 0xa3, 
-	0xf7, 0xff, 0xfc, 0x10, 0x81, 0xa0, 0xf7, 0xff, 
-	0xfb, 0xdf, 0x28, 0x00, 0xd0, 0x73, 0x78, 0xf8, 
-	0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 
-	0x04, 0x1b, 0x43, 0x18, 0x49, 0x9a, 0xf0, 0x00, 
-	0xfd, 0x95, 0x80, 0xb8, 0x20, 0x07, 0xe1, 0x23, 
-	0xe1, 0x23, 0xe0, 0xea, 0xe0, 0xe6, 0xe1, 0x13, 
-	0xe0, 0xed, 0xe0, 0x7e, 0x8a, 0x38, 0x28, 0x00, 
-	0xdd, 0x5e, 0x68, 0xf9, 0x29, 0x00, 0xd0, 0x5c, 
-	0x91, 0x01, 0x21, 0x32, 0x4c, 0x91, 0x70, 0x21, 
-	0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 0x80, 0x61, 
-	0x99, 0x03, 0x5a, 0x71, 0x80, 0xa1, 0x78, 0xf9, 
-	0x71, 0xa1, 0x26, 0x01, 0x02, 0xb6, 0x42, 0xb0, 
-	0xdd, 0x1c, 0x48, 0x8b, 0xf0, 0x00, 0xfd, 0xbe, 
-	0x60, 0xa0, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x00, 
-	0xe0, 0x01, 0xe0, 0x8e, 0xe0, 0x7e, 0xe0, 0xfd, 
-	0xab, 0x02, 0x80, 0x1e, 0x78, 0xf9, 0x1c, 0x03, 
-	0x20, 0xa1, 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0xce, 
-	0x81, 0xa0, 0x68, 0xf8, 0x4b, 0x81, 0x18, 0xc0, 
-	0x60, 0xf8, 0x8a, 0x38, 0x1a, 0xc0, 0x82, 0x38, 
-	0x20, 0x06, 0xe0, 0x1a, 0x30, 0x0a, 0x04, 0x00, 
-	0x0c, 0x00, 0xf0, 0x00, 0xfd, 0x9f, 0x60, 0xa0, 
-	0x28, 0x00, 0xd0, 0xe0, 0x8a, 0x39, 0x31, 0x01, 
-	0xab, 0x02, 0x80, 0x19, 0x78, 0xf9, 0x1c, 0x03, 
-	0x20, 0xa0, 0xaa, 0x01, 0xf7, 0xff, 0xfb, 0xb2, 
-	0x81, 0xa0, 0x24, 0x00, 0x82, 0x3c, 0x60, 0xfc, 
-	0x68, 0xb8, 0xf0, 0x00, 0xfd, 0xb1, 0x20, 0x05, 
-	0x60, 0xbc, 0x70, 0xb8, 0xf7, 0xff, 0xfb, 0x82, 
-	0x28, 0x00, 0xd0, 0x0c, 0x78, 0xf8, 0x30, 0x50, 
-	0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 
-	0x43, 0x18, 0x49, 0x67, 0xf0, 0x00, 0xfd, 0x2e, 
-	0x80, 0xb8, 0x20, 0x00, 0xe0, 0x02, 0xe0, 0xa1, 
-	0xe0, 0x03, 0xe0, 0x02, 0x9a, 0x07, 0x60, 0x10, 
-	0xe0, 0xb7, 0x7e, 0xb8, 0x28, 0x00, 0xd1, 0x11, 
-	0x78, 0xf8, 0x30, 0x60, 0x04, 0x00, 0x0c, 0x00, 
-	0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 0x21, 0x7d, 
-	0x00, 0xc9, 0xf0, 0x00, 0xfd, 0x17, 0x80, 0xf8, 
-	0x20, 0x04, 0x70, 0xb8, 0x68, 0xa0, 0xf0, 0x00, 
-	0xfd, 0x83, 0xe0, 0xa2, 0x20, 0x00, 0x76, 0xb8, 
-	0xe0, 0x9f, 0x20, 0x84, 0x76, 0xb8, 0x21, 0x32, 
-	0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 
-	0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, 
-	0x78, 0xf9, 0x71, 0xa1, 0x22, 0x00, 0x20, 0x85, 
-	0x68, 0xa3, 0xf7, 0xff, 0xfb, 0x67, 0x81, 0xa0, 
-	0xf7, 0xff, 0xfb, 0x36, 0x28, 0x00, 0xd1, 0x01, 
-	0x25, 0x00, 0xe0, 0x03, 0x98, 0x04, 0xf0, 0x00, 
-	0xfa, 0x13, 0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x00, 
-	0xe7, 0x2f, 0xe0, 0x7e, 0x78, 0xf8, 0x30, 0x50, 
-	0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 0x23, 0x03, 
-	0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, 0x49, 0x40, 
-	0xf0, 0x00, 0xfc, 0xe0, 0x80, 0xb8, 0x20, 0x01, 
-	0xe0, 0x70, 0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, 
-	0x19, 0x81, 0x78, 0xc9, 0xab, 0x01, 0x70, 0x19, 
-	0x99, 0x03, 0x5a, 0x71, 0x52, 0x31, 0x21, 0x32, 
-	0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 
-	0x80, 0x61, 0x98, 0x03, 0x5a, 0x30, 0x80, 0xa0, 
-	0x78, 0xf9, 0x71, 0xa1, 0x20, 0x87, 0x68, 0xa3, 
-	0xaa, 0x01, 0xf7, 0xff, 0xfb, 0x2f, 0x81, 0xa0, 
-	0xf7, 0xff, 0xfa, 0xfe, 0x28, 0x00, 0xd1, 0x03, 
-	0x1c, 0x28, 0xf7, 0xff, 0xfa, 0x63, 0xe0, 0x31, 
-	0x21, 0x21, 0x9a, 0x07, 0x1c, 0x28, 0xf7, 0xff, 
-	0xfc, 0x8f, 0x1c, 0x05, 0x78, 0xf8, 0x30, 0x50, 
-	0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 
-	0x43, 0x18, 0x49, 0x25, 0xf0, 0x00, 0xfc, 0xaa, 
-	0x80, 0xb8, 0xe0, 0x3a, 0x98, 0x04, 0x1d, 0x22, 
-	0xe0, 0x01, 0x22, 0x00, 0x98, 0x04, 0xf7, 0xfe, 
-	0xff, 0xd9, 0x1c, 0x05, 0xe0, 0x31, 0x21, 0x32, 
-	0x70, 0x21, 0x21, 0x23, 0x70, 0x61, 0x21, 0x0c, 
-	0x80, 0x61, 0x99, 0x03, 0x5a, 0x71, 0x80, 0xa1, 
-	0x78, 0xf9, 0x71, 0xa1, 0x22, 0x00, 0x1c, 0x03, 
-	0x20, 0x84, 0xf7, 0xff, 0xfa, 0xfb, 0x81, 0xa0, 
-	0xf7, 0xff, 0xfa, 0xca, 0x28, 0x00, 0xd1, 0x03, 
-	0x9a, 0x07, 0x60, 0x10, 0x25, 0x00, 0xe0, 0x18, 
-	0x78, 0xf8, 0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 
-	0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 0x49, 0x0e, 
-	0xf0, 0x00, 0xfc, 0x7c, 0x80, 0xb8, 0xe0, 0x0a, 
-	0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, 0xe0, 0x00, 
-	0x21, 0x00, 0x98, 0x04, 0x9a, 0x07, 0xf0, 0x00, 
-	0xf9, 0xaf, 0x1c, 0x05, 0xd0, 0x01, 0x20, 0x08, 
-	0x70, 0xb8, 0x1c, 0x28, 0xb0, 0x04, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xc0, 
-	0x00, 0x00, 0x27, 0x10, 0x2e, 0x08, 0x56, 0xd0, 
-	0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0x03, 0xff, 
-	0xb5, 0x80, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, 
-	0x20, 0x01, 0x60, 0x18, 0x29, 0x50, 0xd0, 0x0e, 
-	0xdc, 0x06, 0x29, 0x22, 0xd0, 0x0b, 0x29, 0x32, 
-	0xd0, 0x09, 0x29, 0x34, 0xd1, 0x0d, 0xe0, 0x06, 
-	0x29, 0x80, 0xd0, 0x02, 0x29, 0x84, 0xd1, 0x08, 
-	0xe0, 0x01, 0x20, 0x00, 0x70, 0x10, 0x1c, 0x38, 
-	0xf7, 0xff, 0xfe, 0x2e, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, 
-	0xe0, 0x00, 0x21, 0x00, 0x1c, 0x38, 0x1c, 0x1a, 
-	0xf0, 0x00, 0xf9, 0x72, 0x28, 0x00, 0xd0, 0xf1, 
-	0x21, 0x08, 0x00, 0xfa, 0x1b, 0xd2, 0x00, 0x92, 
-	0x4b, 0x02, 0x18, 0xd2, 0x70, 0x91, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0xff, 0x06, 0x09, 0x0e, 0x09, 0x20, 0x01, 
-	0xb0, 0x81, 0x1c, 0x17, 0x9a, 0x04, 0x25, 0x01, 
-	0x60, 0x10, 0x98, 0x01, 0x00, 0xc2, 0x1a, 0x12, 
-	0x00, 0x92, 0x1c, 0x16, 0x48, 0x78, 0x90, 0x00, 
-	0x18, 0x14, 0x29, 0x80, 0xd0, 0x59, 0xdc, 0x08, 
-	0x29, 0x22, 0xd0, 0x1a, 0x29, 0x32, 0xd0, 0x55, 
-	0x29, 0x34, 0xd0, 0x53, 0x29, 0x50, 0xd1, 0x61, 
-	0xe0, 0xc8, 0x29, 0x84, 0xd0, 0x4e, 0x4e, 0x71, 
-	0x29, 0xa0, 0xd0, 0x18, 0x29, 0xa1, 0xd1, 0x59, 
-	0x98, 0x01, 0xf7, 0xff, 0xfa, 0x19, 0x8b, 0x21, 
-	0x29, 0x00, 0xd1, 0x54, 0x88, 0xb8, 0xf0, 0x00, 
-	0xfc, 0x45, 0x60, 0xb0, 0x28, 0x00, 0xd1, 0x58, 
-	0xe0, 0x15, 0x98, 0x01, 0xf7, 0xff, 0xfa, 0x0c, 
-	0x98, 0x01, 0xf0, 0x00, 0xf9, 0x11, 0x1c, 0x05, 
-	0xd0, 0x6a, 0x20, 0x02, 0xe0, 0xbd, 0x98, 0x01, 
-	0xf7, 0xff, 0xfa, 0x02, 0x8b, 0x21, 0x29, 0x00, 
-	0xd1, 0x07, 0x88, 0xb8, 0xf0, 0x00, 0xfc, 0x2e, 
-	0x60, 0xb0, 0x28, 0x00, 0xd1, 0x0c, 0x20, 0x00, 
-	0xe0, 0xb1, 0x88, 0xb8, 0x18, 0x08, 0x04, 0x02, 
-	0x0c, 0x12, 0x69, 0x60, 0xf0, 0x00, 0xfc, 0x27, 
-	0x60, 0xb0, 0x28, 0x00, 0xd0, 0xf3, 0x61, 0x60, 
-	0x20, 0x34, 0x70, 0x30, 0x70, 0x70, 0x20, 0x0c, 
-	0x80, 0x70, 0x78, 0xe0, 0x71, 0x30, 0x88, 0xb9, 
-	0x8b, 0x20, 0x18, 0x09, 0x81, 0xb1, 0x68, 0xb1, 
-	0x18, 0x08, 0x88, 0xba, 0x68, 0x39, 0xf0, 0x13, 
-	0xfb, 0x2d, 0xf7, 0xff, 0xfa, 0x07, 0x28, 0x00, 
-	0xd1, 0x05, 0x68, 0xb0, 0xf0, 0x00, 0xfc, 0x2c, 
-	0xe0, 0x53, 0xe0, 0x36, 0xe0, 0x76, 0x78, 0xe0, 
-	0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 
-	0x04, 0x1b, 0x43, 0x18, 0x49, 0x46, 0xf0, 0x00, 
-	0xfb, 0xad, 0x80, 0xa0, 0x20, 0x00, 0x83, 0x20, 
-	0x61, 0x60, 0xe0, 0x22, 0xe0, 0x6d, 0x88, 0xb8, 
-	0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x69, 0x60, 
-	0xf0, 0x00, 0xfb, 0xf1, 0x60, 0xb0, 0x28, 0x00, 
-	0xd0, 0xbd, 0x61, 0x60, 0x8b, 0x21, 0x69, 0x60, 
-	0x18, 0x40, 0x88, 0xba, 0x68, 0x39, 0xf0, 0x13, 
-	0xfb, 0x01, 0x8b, 0x20, 0x88, 0xb9, 0x18, 0x40, 
-	0x83, 0x20, 0x78, 0xe0, 0x30, 0x50, 0x04, 0x00, 
-	0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 0x43, 0x18, 
-	0x49, 0x33, 0xf0, 0x00, 0xfb, 0x87, 0x80, 0xa0, 
-	0x20, 0x00, 0x9a, 0x04, 0x60, 0x10, 0xe0, 0x55, 
-	0xe0, 0x54, 0x98, 0x01, 0xf7, 0xff, 0xf9, 0x98, 
-	0x78, 0x38, 0x28, 0x80, 0xd1, 0x23, 0x20, 0x32, 
-	0x4f, 0x2c, 0x70, 0x38, 0x20, 0x23, 0x70, 0x78, 
-	0x20, 0x0c, 0x80, 0x78, 0x98, 0x00, 0x5b, 0x80, 
-	0x80, 0xb8, 0x78, 0xe1, 0x71, 0xb9, 0x22, 0x00, 
-	0x20, 0x81, 0x68, 0xbb, 0xf7, 0xff, 0xf9, 0xd6, 
-	0x81, 0xb8, 0xf7, 0xff, 0xf9, 0xa5, 0x28, 0x00, 
-	0xd1, 0x01, 0x25, 0x00, 0xe0, 0x36, 0x78, 0xe0, 
-	0x30, 0x50, 0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 
-	0x04, 0x1b, 0x43, 0x18, 0x49, 0x1c, 0xf0, 0x00, 
-	0xfb, 0x59, 0x80, 0xa0, 0xe0, 0x2a, 0x7e, 0xa0, 
-	0x28, 0x00, 0xd1, 0x10, 0x78, 0xe0, 0x30, 0x60, 
-	0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 
-	0x43, 0x18, 0x21, 0x7d, 0x00, 0xc9, 0xf0, 0x00, 
-	0xfb, 0x49, 0x80, 0xe0, 0x20, 0x00, 0x9a, 0x04, 
-	0x60, 0x10, 0x20, 0x04, 0xe0, 0x15, 0x20, 0x00, 
-	0x76, 0xa0, 0xe0, 0x13, 0x98, 0x01, 0x9b, 0x04, 
-	0x1c, 0x3a, 0xf7, 0xff, 0xfd, 0x29, 0x1c, 0x05, 
-	0xe0, 0x0c, 0x29, 0x7f, 0xda, 0x01, 0x21, 0x01, 
-	0xe0, 0x00, 0x21, 0x00, 0x98, 0x01, 0x9a, 0x04, 
-	0xf0, 0x00, 0xf8, 0x6e, 0x1c, 0x05, 0xd0, 0x01, 
-	0x20, 0x08, 0x70, 0xa0, 0x1c, 0x28, 0xb0, 0x01, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x56, 0xd0, 
-	0x00, 0x00, 0x27, 0x10, 0x2e, 0x08, 0x56, 0xc0, 
-	0xb5, 0xf0, 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, 
-	0x21, 0x01, 0x26, 0x02, 0x00, 0xfa, 0x1b, 0xd2, 
-	0x00, 0x92, 0x60, 0x19, 0x1c, 0x1c, 0x49, 0x19, 
-	0x18, 0x55, 0x28, 0x22, 0xd0, 0x19, 0x28, 0x50, 
-	0xd0, 0x11, 0x28, 0x80, 0xd0, 0x21, 0x28, 0x85, 
-	0xd1, 0x23, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x20, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x25, 0x28, 0x00, 
-	0xd0, 0x00, 0x70, 0xae, 0x21, 0x00, 0x60, 0x21, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x1a, 0x28, 0x00, 0xd0, 0xf7, 
-	0xe0, 0x07, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x0c, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x11, 0x28, 0x00, 
-	0xd0, 0xee, 0x70, 0xae, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0x00, 0x22, 0x34, 0x49, 0x0a, 0x70, 0x0a, 
-	0x22, 0x33, 0x70, 0x4a, 0x22, 0x04, 0x80, 0x4a, 
-	0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 0x4a, 0x07, 
-	0x18, 0x80, 0x78, 0xc0, 0x71, 0x08, 0xf7, 0xff, 
-	0xf9, 0x0b, 0x28, 0x00, 0xd1, 0x01, 0xbc, 0x08, 
-	0x47, 0x18, 0x20, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x56, 0xc0, 0x2e, 0x08, 0x56, 0xe0, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x20, 0x01, 0x26, 0x01, 
-	0x60, 0x10, 0x1c, 0x17, 0x4d, 0x1b, 0x29, 0x00, 
-	0xd0, 0x08, 0x20, 0x03, 0xf0, 0x00, 0xfb, 0x02, 
-	0x60, 0xa8, 0x28, 0x00, 0xd1, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x32, 0x70, 0x28, 
-	0x20, 0x23, 0x70, 0x68, 0x20, 0x0c, 0x80, 0x68, 
-	0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x12, 
-	0x5a, 0x0a, 0x80, 0xaa, 0x18, 0x44, 0x78, 0xe1, 
-	0x71, 0xa9, 0x22, 0x00, 0x20, 0x84, 0x68, 0xab, 
-	0xf7, 0xff, 0xf9, 0x08, 0x81, 0xa8, 0xf7, 0xff, 
-	0xf8, 0xd7, 0x28, 0x00, 0xd1, 0x02, 0x26, 0x00, 
-	0x60, 0x38, 0xe0, 0x0a, 0x78, 0xe0, 0x30, 0x50, 
-	0x04, 0x00, 0x0c, 0x00, 0x23, 0x03, 0x04, 0x1b, 
-	0x43, 0x18, 0x49, 0x06, 0xf0, 0x00, 0xfa, 0x8a, 
-	0x80, 0xa0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x56, 0xc0, 
-	0x2e, 0x08, 0x56, 0xe0, 0x00, 0x00, 0x27, 0x10, 
-	0x20, 0x00, 0x47, 0x70, 0xb5, 0x90, 0x28, 0x00, 
-	0xd0, 0x06, 0x21, 0xff, 0x4a, 0x24, 0x73, 0x11, 
-	0x4b, 0x24, 0x18, 0xc1, 0xf7, 0xfa, 0xfe, 0x88, 
-	0x20, 0x00, 0x21, 0x00, 0x4a, 0x22, 0x01, 0x83, 
-	0x18, 0x1b, 0x00, 0xdb, 0x18, 0x9b, 0x33, 0xff, 
-	0x33, 0xff, 0x33, 0x02, 0x60, 0x19, 0x60, 0x59, 
-	0x30, 0x01, 0x28, 0x06, 0xdb, 0xf3, 0x20, 0x00, 
-	0x43, 0xc4, 0x4a, 0x1c, 0x01, 0x03, 0x50, 0xd1, 
-	0x18, 0x9b, 0x60, 0xdc, 0x30, 0x01, 0x28, 0x1e, 
-	0xdb, 0xf8, 0x27, 0x01, 0x20, 0x02, 0x49, 0x18, 
-	0x60, 0x08, 0xf7, 0xfd, 0xfb, 0x11, 0x28, 0x01, 
-	0xd0, 0x00, 0x27, 0x00, 0xf7, 0xfb, 0xff, 0x78, 
-	0x28, 0x00, 0xd1, 0x00, 0x27, 0x00, 0xf7, 0xfe, 
-	0xfe, 0x09, 0x28, 0x00, 0xd1, 0x00, 0x27, 0x00, 
-	0xf7, 0xfd, 0xfe, 0x24, 0x28, 0x00, 0xd1, 0x00, 
-	0x27, 0x00, 0xf0, 0x01, 0xf9, 0x05, 0x28, 0x00, 
-	0xd1, 0x00, 0x27, 0x00, 0xf0, 0x02, 0xf8, 0xb6, 
-	0x42, 0xa0, 0xd1, 0x00, 0x27, 0x00, 0x2f, 0x01, 
-	0xd1, 0x01, 0xf0, 0x00, 0xf8, 0x0f, 0x1c, 0x38, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0x90, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5c, 0x50, 
-	0x6e, 0x00, 0x11, 0x00, 0xb5, 0x00, 0xf0, 0x18, 
-	0xfd, 0x33, 0x49, 0x07, 0x20, 0x19, 0xf0, 0x18, 
-	0xfc, 0xfb, 0xf0, 0x18, 0xfc, 0xf1, 0x4b, 0x05, 
-	0x40, 0x18, 0xf0, 0x18, 0xfc, 0xf1, 0xf0, 0x18, 
-	0xfd, 0x5d, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x00, 0xaf, 0xb5, 0xfd, 0xff, 0xff, 0xff, 
-	0xb5, 0x00, 0xf0, 0x18, 0xfc, 0xe1, 0x23, 0x01, 
-	0x06, 0x5b, 0x43, 0x18, 0xf0, 0x18, 0xfc, 0xe0, 
-	0x20, 0x01, 0x06, 0x40, 0xf0, 0x18, 0xfc, 0xd3, 
-	0x48, 0x02, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x90, 
-	0xb5, 0xf0, 0xb0, 0x84, 0xf0, 0x00, 0xfa, 0x80, 
-	0x4f, 0x99, 0x88, 0x39, 0x48, 0x99, 0x29, 0x06, 
-	0xd2, 0x64, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x03, 0x36, 0x61, 0x8e, 
-	0xb9, 0xe8, 0x1d, 0xc5, 0x35, 0xff, 0x35, 0xfa, 
-	0x68, 0x6c, 0x68, 0x2e, 0x2e, 0x00, 0xd1, 0x13, 
-	0xf7, 0xfa, 0xfc, 0xa0, 0x69, 0x39, 0x42, 0x88, 
-	0xd9, 0x24, 0xf7, 0xfa, 0xfc, 0x9b, 0x30, 0x64, 
-	0x61, 0x38, 0x20, 0x00, 0xab, 0x01, 0x70, 0x18, 
-	0x3b, 0x04, 0x70, 0x18, 0x46, 0x69, 0x22, 0x00, 
-	0xa8, 0x01, 0xf7, 0xfd, 0xfa, 0x69, 0xe0, 0x15, 
-	0x21, 0x01, 0xab, 0x01, 0x70, 0x19, 0x19, 0x01, 
-	0x31, 0xff, 0x31, 0xe1, 0x78, 0x09, 0x3b, 0x04, 
-	0x70, 0x19, 0x01, 0x21, 0x18, 0x0a, 0x46, 0x69, 
-	0xa8, 0x01, 0xf7, 0xfd, 0xfa, 0x59, 0x20, 0x1e, 
-	0x1c, 0x61, 0x3e, 0x01, 0xf0, 0x13, 0xf8, 0xd8, 
-	0x60, 0x69, 0x60, 0x2e, 0x21, 0x01, 0xe0, 0x54, 
-	0x23, 0x01, 0x02, 0x9b, 0x18, 0xc5, 0x68, 0xec, 
-	0x68, 0xae, 0x2e, 0x00, 0xd0, 0x20, 0x19, 0x01, 
-	0x23, 0x1f, 0x01, 0x5b, 0x18, 0xc9, 0x7a, 0x09, 
-	0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, 0x78, 0x09, 
-	0x09, 0x09, 0x29, 0x06, 0xd0, 0x01, 0x21, 0x01, 
-	0xe0, 0x00, 0x21, 0x02, 0xab, 0x01, 0x70, 0x19, 
-	0x01, 0x21, 0x18, 0x08, 0x23, 0x41, 0x00, 0xdb, 
-	0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, 0xf7, 0xfb, 
-	0xfe, 0xa3, 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, 
-	0xf0, 0x13, 0xf8, 0xae, 0x60, 0xe9, 0x60, 0xae, 
-	0x21, 0x02, 0xe0, 0x2a, 0xe0, 0xc2, 0x23, 0x03, 
-	0x02, 0x5b, 0x18, 0xc5, 0x69, 0x6c, 0x69, 0x2e, 
-	0x2e, 0x00, 0xd0, 0x21, 0x21, 0x01, 0xab, 0x01, 
-	0x70, 0x19, 0x19, 0x01, 0x23, 0x2f, 0x01, 0x5b, 
-	0x18, 0xc9, 0x7c, 0x09, 0xab, 0x00, 0x70, 0x19, 
-	0xa9, 0x00, 0x78, 0x09, 0x09, 0x09, 0x29, 0x06, 
-	0xd1, 0x02, 0x21, 0x02, 0x71, 0x19, 0x33, 0x04, 
-	0x01, 0x21, 0x18, 0x08, 0x23, 0x41, 0x01, 0x1b, 
-	0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, 0xf7, 0xfe, 
-	0xfd, 0x09, 0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, 
-	0xf0, 0x13, 0xf8, 0x82, 0x61, 0x69, 0x61, 0x2e, 
-	0x21, 0x03, 0x80, 0x39, 0x20, 0x00, 0xe0, 0x97, 
-	0x23, 0x01, 0x02, 0xdb, 0x18, 0xc5, 0x69, 0xec, 
-	0x69, 0xae, 0x2e, 0x00, 0xd0, 0x21, 0x21, 0x01, 
-	0xab, 0x01, 0x70, 0x19, 0x19, 0x01, 0x23, 0x3f, 
-	0x01, 0x5b, 0x18, 0xc9, 0x7e, 0x09, 0xab, 0x00, 
-	0x70, 0x19, 0xa9, 0x00, 0x78, 0x09, 0x09, 0x09, 
-	0x29, 0x06, 0xd1, 0x02, 0x21, 0x02, 0x71, 0x19, 
-	0x33, 0x04, 0x01, 0x21, 0x18, 0x08, 0x23, 0xc3, 
-	0x00, 0xdb, 0x18, 0xc2, 0x46, 0x69, 0xa8, 0x01, 
-	0xf7, 0xfd, 0xfc, 0xfe, 0x20, 0x1e, 0x1c, 0x61, 
-	0x3e, 0x01, 0xf0, 0x13, 0xf8, 0x55, 0x61, 0xe9, 
-	0x61, 0xae, 0x20, 0x04, 0xe0, 0x2c, 0x23, 0x05, 
-	0x02, 0x5b, 0x18, 0xc5, 0x6a, 0x6c, 0x6a, 0x2e, 
-	0x2e, 0x00, 0xd0, 0x24, 0x19, 0x01, 0x18, 0xc9, 
-	0x78, 0x09, 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, 
-	0x78, 0x09, 0x09, 0x09, 0x29, 0x06, 0xd0, 0x05, 
-	0x29, 0x07, 0xd0, 0x01, 0x29, 0x08, 0xd1, 0x03, 
-	0x21, 0x03, 0xe0, 0x02, 0x21, 0x02, 0xe0, 0x00, 
-	0x21, 0x01, 0xab, 0x01, 0x70, 0x19, 0x01, 0x21, 
-	0x18, 0x08, 0x23, 0x41, 0x01, 0x5b, 0x18, 0xc2, 
-	0x46, 0x69, 0xa8, 0x01, 0xf0, 0x00, 0xff, 0xb4, 
-	0x20, 0x1e, 0x1c, 0x61, 0x3e, 0x01, 0xf0, 0x13, 
-	0xf8, 0x27, 0x62, 0x69, 0x62, 0x2e, 0x20, 0x05, 
-	0x80, 0x38, 0xe7, 0xa3, 0xe7, 0xff, 0x23, 0x03, 
-	0x02, 0x9b, 0x18, 0xc6, 0x6a, 0xf4, 0x6a, 0xb5, 
-	0x2d, 0x00, 0xd0, 0x33, 0x19, 0x01, 0x18, 0xc9, 
-	0x7a, 0x09, 0xab, 0x00, 0x70, 0x19, 0xa9, 0x00, 
-	0x78, 0x09, 0x09, 0x09, 0x29, 0x09, 0xd0, 0x10, 
-	0x29, 0x0a, 0xd1, 0x1f, 0x01, 0x21, 0x18, 0x08, 
-	0x23, 0x05, 0x02, 0x5b, 0x18, 0xc0, 0x90, 0x02, 
-	0x8d, 0x01, 0x6a, 0xc0, 0xf7, 0xf5, 0xfd, 0x7c, 
-	0x23, 0x01, 0x42, 0xd8, 0xd0, 0x14, 0x98, 0x02, 
-	0xe0, 0x0d, 0x01, 0x21, 0x18, 0x08, 0x23, 0x05, 
-	0x02, 0x5b, 0x18, 0xc0, 0x90, 0x03, 0x8d, 0x01, 
-	0x6a, 0xc0, 0xf7, 0xf5, 0xfd, 0xe6, 0x23, 0x01, 
-	0x42, 0xd8, 0xd0, 0x05, 0x98, 0x03, 0x6a, 0xc0, 
-	0xf0, 0x00, 0xf9, 0x42, 0x34, 0x01, 0x3d, 0x01, 
-	0x20, 0x1e, 0x1c, 0x21, 0xf0, 0x12, 0xff, 0xe8, 
-	0x62, 0xf1, 0x62, 0xb5, 0x20, 0x00, 0x80, 0x38, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x90, 0x2e, 0x08, 0x5e, 0x30, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0xb4, 0x0f, 0xb5, 0x80, 
-	0xb0, 0x84, 0x99, 0x06, 0xaa, 0x07, 0x4f, 0x15, 
-	0x68, 0x38, 0xf0, 0x13, 0xf8, 0xf5, 0x30, 0x01, 
-	0x04, 0x00, 0x0c, 0x00, 0xab, 0x00, 0x80, 0x18, 
-	0x28, 0x80, 0xdc, 0x19, 0xa8, 0x00, 0x88, 0x00, 
-	0x28, 0x04, 0xdb, 0x15, 0xa8, 0x00, 0x88, 0x00, 
-	0x30, 0x02, 0xf0, 0x00, 0xf8, 0xeb, 0x28, 0x00, 
-	0xd0, 0x0e, 0x90, 0x01, 0xaa, 0x00, 0x88, 0x12, 
-	0x68, 0x39, 0xf0, 0x13, 0xf8, 0x03, 0x21, 0x00, 
-	0xaa, 0x00, 0x88, 0x12, 0x98, 0x01, 0x54, 0x81, 
-	0x46, 0x69, 0x20, 0xa6, 0xf0, 0x00, 0xf8, 0x24, 
-	0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0xb0, 0x04, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xcc, 
-	0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x07, 
-	0x1c, 0x20, 0xb0, 0x84, 0xf0, 0x00, 0xf8, 0xca, 
-	0x28, 0x00, 0xd1, 0x01, 0x43, 0xc0, 0xe0, 0x0b, 
-	0xab, 0x00, 0x80, 0x1c, 0x90, 0x01, 0x1c, 0x39, 
-	0x1c, 0x22, 0xf0, 0x12, 0xff, 0xdf, 0x46, 0x69, 
-	0x20, 0x96, 0xf0, 0x00, 0xf8, 0x05, 0x20, 0x00, 
-	0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x06, 0x06, 0x0e, 0x36, 0x07, 0x30, 
-	0x0f, 0x00, 0x01, 0x83, 0x18, 0x18, 0x00, 0xc0, 
-	0x1c, 0x0f, 0xb0, 0x83, 0x49, 0x2e, 0x18, 0x45, 
-	0x1f, 0xe8, 0x38, 0x79, 0x90, 0x02, 0x6f, 0x84, 
-	0x6f, 0xc0, 0x2c, 0x1e, 0xda, 0x4e, 0x09, 0x31, 
-	0x29, 0x06, 0xd1, 0x11, 0x88, 0x3a, 0xb0, 0x81, 
-	0x92, 0x00, 0x19, 0x01, 0x20, 0x1e, 0x1c, 0x2f, 
-	0xf0, 0x12, 0xff, 0x6a, 0x9a, 0x00, 0x01, 0x08, 
-	0x18, 0x38, 0x38, 0xff, 0x38, 0xff, 0x38, 0x42, 
-	0x87, 0x02, 0x18, 0x68, 0xb0, 0x01, 0xe0, 0x34, 
-	0x29, 0x07, 0xd1, 0x22, 0x19, 0x01, 0x20, 0x1e, 
-	0xf0, 0x12, 0xff, 0x5a, 0x91, 0x00, 0x01, 0x08, 
-	0x18, 0x28, 0x90, 0x01, 0x22, 0x10, 0x38, 0xff, 
-	0x38, 0xff, 0x38, 0x0a, 0x1c, 0x39, 0xf0, 0x12, 
-	0xff, 0x9d, 0x98, 0x00, 0x18, 0x28, 0x38, 0x40, 
-	0x76, 0x06, 0x78, 0xb8, 0xf0, 0x00, 0xf8, 0x76, 
-	0x99, 0x01, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 
-	0x67, 0xc8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x1a, 
-	0x78, 0xba, 0x68, 0x79, 0xf0, 0x12, 0xff, 0x8a, 
-	0xe0, 0x11, 0x19, 0x01, 0x20, 0x1e, 0xf0, 0x12, 
-	0xff, 0x37, 0x91, 0x00, 0x01, 0x08, 0x18, 0x28, 
-	0x22, 0x10, 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 
-	0x1c, 0x39, 0xf0, 0x12, 0xff, 0x7b, 0x98, 0x00, 
-	0x18, 0x28, 0x38, 0x40, 0x76, 0x06, 0x1c, 0x60, 
-	0x99, 0x02, 0x67, 0x88, 0x20, 0xff, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x5e, 0x30, 0xb5, 0xf3, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x98, 0x00, 0x04, 0x06, 0x0c, 0x36, 
-	0x27, 0x00, 0x4c, 0x17, 0x01, 0x38, 0x58, 0x20, 
-	0x42, 0xb0, 0xd1, 0x07, 0xf7, 0xfa, 0xfa, 0xb2, 
-	0x19, 0x41, 0x01, 0x38, 0x19, 0x00, 0x60, 0xc1, 
-	0x60, 0x85, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1e, 
-	0xdb, 0xf0, 0x2f, 0x1e, 0xdb, 0x1a, 0x27, 0x00, 
-	0x01, 0x38, 0x58, 0x20, 0x28, 0x00, 0xd1, 0x0b, 
-	0x01, 0x38, 0x50, 0x26, 0x99, 0x00, 0x0c, 0x09, 
-	0x19, 0x04, 0x60, 0x61, 0xf7, 0xfa, 0xfa, 0x9a, 
-	0x19, 0x40, 0x60, 0xe0, 0x60, 0xa5, 0xe0, 0x02, 
-	0x37, 0x01, 0x2f, 0x1e, 0xdb, 0xec, 0x2f, 0x1e, 
-	0xdb, 0x04, 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x30, 0xe7, 0xf9, 
-	0x2e, 0x08, 0x5c, 0x50, 0xb4, 0x80, 0x21, 0x00, 
-	0x4a, 0x07, 0x23, 0x00, 0x01, 0x0f, 0x59, 0xd7, 
-	0x42, 0x87, 0xd1, 0x02, 0x01, 0x08, 0x50, 0x13, 
-	0xe0, 0x02, 0x31, 0x01, 0x29, 0x1e, 0xdb, 0xf5, 
-	0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x5c, 0x50, 0xb5, 0x00, 0xf7, 0xfa, 
-	0xfb, 0xd7, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0x1c, 0x04, 0x1c, 0x10, 0x1c, 0x15, 0x1c, 0x0f, 
-	0xf7, 0xff, 0xff, 0xf4, 0x1c, 0x06, 0xd1, 0x06, 
-	0x1c, 0x20, 0xf7, 0xfa, 0xfb, 0xd3, 0x20, 0x00, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1b, 0xea, 
-	0x19, 0xf0, 0x21, 0x00, 0xf0, 0x12, 0xff, 0xfe, 
-	0x1c, 0x30, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x12, 
-	0xff, 0x01, 0x1c, 0x20, 0xf7, 0xfa, 0xfb, 0xc2, 
-	0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x80, 0x27, 0x01, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xfa, 0xfb, 0xb8, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x1c, 0x07, 
-	0xf7, 0xfa, 0xfa, 0x40, 0x19, 0xc7, 0xf7, 0xfa, 
-	0xfa, 0x3d, 0x42, 0xb8, 0xd3, 0xfb, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x47, 0x70, 
-	0xb5, 0xf0, 0xf7, 0xfa, 0xfa, 0x33, 0x4e, 0x13, 
-	0x69, 0x71, 0x42, 0x88, 0xd0, 0x1d, 0xf7, 0xfa, 
-	0xfa, 0x2d, 0x27, 0x00, 0x61, 0x70, 0x4d, 0x10, 
-	0x4c, 0x10, 0x01, 0x38, 0x58, 0x22, 0x2a, 0x00, 
-	0xd0, 0x10, 0x19, 0x00, 0x68, 0xc3, 0x69, 0x71, 
-	0x42, 0x8b, 0xd2, 0x0b, 0x80, 0x2a, 0x68, 0x82, 
-	0x18, 0x51, 0x60, 0xc1, 0x68, 0x40, 0x07, 0x00, 
-	0x0f, 0x00, 0x23, 0x60, 0x43, 0x18, 0x1c, 0x29, 
-	0xf7, 0xff, 0xfe, 0xea, 0x37, 0x01, 0x2f, 0x1e, 
-	0xdb, 0xe7, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x90, 
-	0x2e, 0x08, 0x5c, 0x40, 0x2e, 0x08, 0x5c, 0x50, 
-	0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x21, 0x9f, 
-	0x4a, 0x07, 0x70, 0x11, 0x21, 0x80, 0x70, 0x51, 
-	0x21, 0x10, 0x70, 0x91, 0x27, 0x00, 0x70, 0xd7, 
-	0x21, 0x04, 0xf0, 0x01, 0xf8, 0xdd, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x72, 0x60, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0xf0, 0x00, 0xf8, 0x03, 0x20, 0x00, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x04, 0x00, 
-	0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, 
-	0x21, 0x80, 0x70, 0x51, 0x21, 0x12, 0x70, 0x91, 
-	0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, 
-	0xf8, 0xbf, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x21, 0x00, 
-	0x20, 0x9f, 0x4a, 0x14, 0x70, 0x10, 0x20, 0x80, 
-	0x70, 0x50, 0x20, 0x11, 0x70, 0x90, 0x27, 0x00, 
-	0x48, 0x11, 0x01, 0x3d, 0x19, 0xed, 0x00, 0xed, 
-	0x59, 0x46, 0x2e, 0x00, 0xd0, 0x0c, 0x00, 0x8b, 
-	0x18, 0x9b, 0x0e, 0x36, 0x71, 0x1e, 0x59, 0x46, 
-	0x0c, 0x36, 0x71, 0x5e, 0x59, 0x46, 0x0a, 0x36, 
-	0x71, 0x9e, 0x59, 0x45, 0x71, 0xdd, 0x31, 0x01, 
-	0x37, 0x01, 0x2f, 0x07, 0xdb, 0xe9, 0x00, 0x88, 
-	0x70, 0xd0, 0x1d, 0x01, 0x1c, 0x20, 0xf0, 0x01, 
-	0xf8, 0x8f, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, 
-	0x2e, 0x08, 0x7e, 0xa8, 0xb5, 0x80, 0x04, 0x00, 
-	0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, 
-	0x21, 0x80, 0x70, 0x51, 0x21, 0x20, 0x70, 0x91, 
-	0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, 
-	0xf8, 0x77, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, 
-	0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x82, 
-	0x1c, 0xc8, 0x1c, 0x0c, 0x46, 0x69, 0xf0, 0x00, 
-	0xfc, 0x8b, 0x1c, 0x01, 0x00, 0xf8, 0x4a, 0x25, 
-	0x18, 0x80, 0x88, 0xc2, 0x20, 0x00, 0x4f, 0x24, 
-	0x00, 0xc3, 0x1a, 0x1b, 0x00, 0x9b, 0x19, 0xdb, 
-	0x78, 0xdb, 0x42, 0x93, 0xd1, 0x07, 0x00, 0xc2, 
-	0x1a, 0x12, 0x00, 0x92, 0x5a, 0xba, 0x32, 0x01, 
-	0x4b, 0x1e, 0x70, 0x9a, 0xe0, 0x04, 0x30, 0x01, 
-	0x04, 0x00, 0x14, 0x00, 0x28, 0x08, 0xdb, 0xeb, 
-	0x18, 0x61, 0x91, 0x01, 0x7a, 0x09, 0x04, 0x0d, 
-	0x14, 0x2d, 0x00, 0xc6, 0x1a, 0x36, 0x00, 0xb6, 
-	0x5b, 0xb8, 0x01, 0x00, 0x4c, 0x16, 0x19, 0x00, 
-	0x68, 0x40, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 
-	0xff, 0x07, 0x1c, 0x68, 0xf7, 0xff, 0xfe, 0xde, 
-	0x5b, 0xb9, 0x01, 0x09, 0x19, 0x09, 0x60, 0x48, 
-	0x28, 0x00, 0xd0, 0x0a, 0x99, 0x01, 0x31, 0x09, 
-	0x1c, 0x2a, 0xf0, 0x12, 0xfd, 0xf3, 0x21, 0x00, 
-	0x5b, 0xb8, 0x01, 0x00, 0x19, 0x00, 0x68, 0x40, 
-	0x55, 0x41, 0x20, 0x02, 0x5b, 0xb9, 0x01, 0x0a, 
-	0x54, 0xa0, 0x1c, 0x08, 0xf0, 0x01, 0xf9, 0xae, 
-	0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7a, 0x60, 
-	0x2e, 0x08, 0x56, 0xe0, 0x2e, 0x08, 0x72, 0x60, 
-	0x2e, 0x08, 0x7e, 0x88, 0xb5, 0x80, 0x04, 0x00, 
-	0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, 
-	0x21, 0x80, 0x70, 0x51, 0x21, 0x22, 0x70, 0x91, 
-	0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x01, 
-	0xf8, 0x03, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, 
-	0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0xb0, 0x81, 
-	0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, 
-	0xfc, 0x17, 0x18, 0x38, 0x78, 0xc0, 0x28, 0x00, 
-	0xd0, 0x0f, 0x23, 0x7d, 0x00, 0xdb, 0x43, 0x58, 
-	0x22, 0x03, 0x1c, 0x21, 0xf0, 0x01, 0xf8, 0x77, 
-	0x28, 0x00, 0xdd, 0x06, 0x00, 0x61, 0x4a, 0x07, 
-	0x18, 0x89, 0x31, 0xff, 0x31, 0xff, 0x31, 0x02, 
-	0x84, 0xc8, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x08, 
-	0x20, 0x00, 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7e, 0xa8, 
-	0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x21, 0x9f, 
-	0x4a, 0x0b, 0x70, 0x11, 0x21, 0x84, 0x70, 0x51, 
-	0x21, 0x41, 0x70, 0x91, 0x49, 0x09, 0x68, 0x09, 
-	0x0a, 0x0b, 0x70, 0xd3, 0x71, 0x11, 0x49, 0x08, 
-	0x68, 0x09, 0x0c, 0x0b, 0x71, 0x53, 0x0a, 0x0b, 
-	0x71, 0x93, 0x71, 0xd1, 0x21, 0x08, 0xf0, 0x00, 
-	0xff, 0xbb, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x1a, 0xd8, 
-	0x2e, 0x08, 0x1a, 0xd4, 0xb5, 0x80, 0x04, 0x00, 
-	0x0c, 0x00, 0x21, 0x9f, 0x4a, 0x07, 0x70, 0x11, 
-	0x21, 0x80, 0x70, 0x51, 0x21, 0x30, 0x70, 0x91, 
-	0x27, 0x00, 0x70, 0xd7, 0x21, 0x04, 0xf0, 0x00, 
-	0xff, 0xa3, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, 
-	0xb5, 0x90, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, 
-	0x1c, 0xc8, 0x46, 0x69, 0xf0, 0x00, 0xfb, 0xb8, 
-	0x00, 0xf8, 0x49, 0x19, 0x18, 0x40, 0x88, 0xc2, 
-	0x20, 0x00, 0x49, 0x18, 0x00, 0xc3, 0x1a, 0x1b, 
-	0x00, 0x9b, 0x18, 0x5b, 0x78, 0xdb, 0x42, 0x93, 
-	0xd1, 0x07, 0x00, 0xc2, 0x1a, 0x12, 0x00, 0x92, 
-	0x5a, 0x89, 0x31, 0x01, 0x4a, 0x12, 0x70, 0x91, 
-	0xe0, 0x04, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 
-	0x28, 0x08, 0xdb, 0xeb, 0x01, 0x00, 0x49, 0x0f, 
-	0x18, 0x47, 0x68, 0xb8, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xff, 0xfe, 0x3e, 0x24, 0x00, 0x81, 0xbc, 
-	0xa8, 0x00, 0x88, 0x00, 0xf7, 0xff, 0xfe, 0x12, 
-	0x60, 0xb8, 0x28, 0x00, 0xd0, 0x03, 0xa8, 0x00, 
-	0x88, 0x00, 0x08, 0x40, 0x81, 0xb8, 0x1c, 0x20, 
-	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x7a, 0x60, 0x2e, 0x08, 0x56, 0xe0, 
-	0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7e, 0x88, 
-	0xb5, 0x80, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x08, 
-	0x0c, 0x00, 0xf0, 0x02, 0xfc, 0xe9, 0x28, 0x00, 
-	0xd0, 0x0c, 0x68, 0x82, 0x2a, 0x00, 0xd0, 0x09, 
-	0x89, 0x81, 0x29, 0x00, 0xd0, 0x06, 0x1c, 0x38, 
-	0xf0, 0x00, 0xff, 0x46, 0x20, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x47, 0x70, 
-	0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0xb0, 0x81, 
-	0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, 
-	0xfb, 0x57, 0x18, 0x3f, 0x78, 0xf8, 0x28, 0x00, 
-	0xd0, 0x0d, 0x28, 0x01, 0xd1, 0x16, 0x1c, 0x20, 
-	0xf0, 0x00, 0xfc, 0x16, 0x79, 0x38, 0x23, 0x7d, 
-	0x00, 0xdb, 0x43, 0x58, 0x22, 0x01, 0x1c, 0x21, 
-	0xf0, 0x00, 0xff, 0xb1, 0xe0, 0x08, 0x1c, 0x20, 
-	0xf0, 0x00, 0xfc, 0x0a, 0x21, 0x09, 0x48, 0x06, 
-	0x70, 0x01, 0x21, 0x20, 0xf7, 0xff, 0xfc, 0xec, 
-	0x20, 0x00, 0xe0, 0x01, 0x20, 0x00, 0x43, 0xc0, 
-	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x72, 0x60, 0xb5, 0x90, 0x04, 0x04, 
-	0x0c, 0x24, 0xb0, 0x81, 0x1c, 0xc8, 0x1c, 0x0f, 
-	0x46, 0x69, 0xf0, 0x00, 0xfb, 0x29, 0x1c, 0x02, 
-	0x18, 0x38, 0x78, 0xc0, 0x28, 0x01, 0xd1, 0x04, 
-	0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x0a, 
-	0xe0, 0x03, 0x21, 0xf0, 0x1c, 0x20, 0xf0, 0x00, 
-	0xf8, 0x31, 0x20, 0x00, 0xb0, 0x01, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0x04, 0x12, 0x14, 0x12, 0x18, 0x89, 
-	0x79, 0x0a, 0x2a, 0x00, 0xdd, 0x13, 0x2a, 0x03, 
-	0xdc, 0x11, 0x49, 0x0c, 0x70, 0x0a, 0x23, 0x9f, 
-	0x4a, 0x0b, 0x70, 0x13, 0x23, 0x88, 0x70, 0x53, 
-	0x23, 0x02, 0x70, 0x93, 0x70, 0xd3, 0x23, 0x01, 
-	0x71, 0x13, 0x78, 0x09, 0x71, 0x51, 0x21, 0x06, 
-	0xf0, 0x00, 0xfe, 0xd6, 0xe0, 0x02, 0x21, 0xf1, 
-	0xf0, 0x00, 0xf8, 0x0c, 0x20, 0x00, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x70, 
-	0x2e, 0x08, 0x72, 0x60, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0xb5, 0x00, 0x04, 0x00, 
-	0x0c, 0x00, 0x23, 0x9f, 0x4a, 0x07, 0x70, 0x13, 
-	0x23, 0x88, 0x70, 0x53, 0x23, 0x02, 0x70, 0x93, 
-	0x23, 0x01, 0x70, 0xd3, 0x71, 0x11, 0x21, 0x05, 
-	0xf0, 0x00, 0xfe, 0xb6, 0x20, 0x00, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x72, 0x60, 
-	0xb5, 0xf3, 0xb0, 0x82, 0x4d, 0x1f, 0x78, 0x28, 
-	0x28, 0x0f, 0xd1, 0x2a, 0x99, 0x03, 0x1c, 0xc8, 
-	0xa9, 0x01, 0xf0, 0x00, 0xfa, 0xc9, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x00, 0x1d, 0xec, 0x34, 0xf9, 
-	0x88, 0xe1, 0xa8, 0x01, 0x88, 0x00, 0x18, 0x08, 
-	0x04, 0x06, 0x0c, 0x36, 0x68, 0xa0, 0x1c, 0x32, 
-	0xf7, 0xff, 0xfd, 0x41, 0x1c, 0x07, 0xd1, 0x01, 
-	0x43, 0xf8, 0xe0, 0x1d, 0x98, 0x00, 0x99, 0x03, 
-	0x18, 0x08, 0x1c, 0xc1, 0x88, 0xe0, 0x19, 0xc0, 
-	0xaa, 0x01, 0x88, 0x12, 0xf0, 0x12, 0xfc, 0x4e, 
-	0x1f, 0xb0, 0x04, 0x00, 0x0c, 0x00, 0x12, 0x01, 
-	0x71, 0x39, 0x71, 0x78, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0x4b, 0x21, 0x04, 0x48, 0x08, 0x70, 0x01, 
-	0x27, 0x00, 0x70, 0x47, 0x70, 0x87, 0x21, 0x03, 
-	0xf7, 0xff, 0xfc, 0x4a, 0x70, 0x2f, 0x1c, 0x38, 
-	0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, 
-	0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0xb0, 0x81, 
-	0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, 
-	0xfa, 0x87, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, 
-	0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x0f, 
-	0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, 
-	0xf7, 0xff, 0xfc, 0xfc, 0x60, 0xa0, 0x1c, 0x02, 
-	0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, 
-	0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xfc, 0x12, 
-	0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, 
-	0x68, 0xa1, 0x70, 0x48, 0x20, 0x03, 0x68, 0xa1, 
-	0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, 
-	0x20, 0x0f, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, 
-	0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, 
-	0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfc, 0xdb, 
-	0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, 
-	0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, 
-	0x31, 0x03, 0xf0, 0x12, 0xfb, 0xeb, 0x88, 0xe0, 
-	0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, 
-	0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0xb5, 0xf0, 0x1c, 0x0f, 0x04, 0x01, 0x0c, 0x09, 
-	0xb0, 0x81, 0x91, 0x00, 0xb0, 0x81, 0x46, 0x69, 
-	0x1c, 0xf8, 0xf0, 0x00, 0xfa, 0x2d, 0x1c, 0x02, 
-	0x18, 0x38, 0x78, 0xc1, 0x07, 0xc9, 0x0f, 0xc9, 
-	0x79, 0x04, 0x23, 0x05, 0x48, 0x16, 0x70, 0x03, 
-	0x70, 0x41, 0x70, 0x84, 0x21, 0x00, 0xab, 0x00, 
-	0x88, 0x1b, 0x3b, 0x02, 0x2b, 0x00, 0xdd, 0x09, 
-	0x18, 0x55, 0x19, 0xed, 0x79, 0x6d, 0x18, 0x46, 
-	0x70, 0xf5, 0x31, 0x01, 0x04, 0x09, 0x14, 0x09, 
-	0x42, 0x8b, 0xdc, 0xf5, 0x27, 0x00, 0xa9, 0x00, 
-	0x88, 0x09, 0x18, 0x41, 0x70, 0x4f, 0xa9, 0x00, 
-	0x88, 0x09, 0x31, 0x02, 0xf7, 0xff, 0xfb, 0xb8, 
-	0x23, 0x05, 0x48, 0x08, 0x70, 0x03, 0x21, 0x01, 
-	0x70, 0x41, 0x30, 0xff, 0x30, 0x01, 0x99, 0x01, 
-	0x80, 0x41, 0x80, 0x84, 0x80, 0xc7, 0x1c, 0x38, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7d, 0x7c, 
-	0xb5, 0xb0, 0x21, 0x9f, 0x4f, 0x1e, 0x70, 0x39, 
-	0x21, 0x88, 0x70, 0x79, 0x21, 0x08, 0x70, 0xb9, 
-	0x1d, 0xc2, 0x32, 0xf9, 0x88, 0xd1, 0x18, 0x09, 
-	0x78, 0x4b, 0x21, 0x01, 0x24, 0x00, 0x2b, 0x0b, 
-	0xd1, 0x05, 0x70, 0xf9, 0x71, 0x3c, 0x88, 0x50, 
-	0x21, 0x05, 0x1c, 0x3a, 0xe0, 0x17, 0x23, 0x81, 
-	0x70, 0xfb, 0x88, 0xd3, 0x33, 0x01, 0x71, 0x3b, 
-	0x71, 0x79, 0x21, 0x00, 0x88, 0xd3, 0x2b, 0x00, 
-	0xdd, 0x09, 0x18, 0x43, 0x78, 0x9b, 0x18, 0x7d, 
-	0x71, 0xab, 0x31, 0x01, 0x04, 0x09, 0x14, 0x09, 
-	0x88, 0xd3, 0x42, 0x8b, 0xdc, 0xf5, 0x88, 0xd0, 
-	0x1d, 0x81, 0x88, 0x50, 0x1c, 0x3a, 0xf0, 0x00, 
-	0xfd, 0x9f, 0x22, 0x20, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x12, 0xfc, 0x58, 0x20, 0x06, 0x70, 0x38, 
-	0x21, 0x20, 0x1c, 0x38, 0xf7, 0xff, 0xfb, 0x68, 
-	0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0x1c, 0x0f, 
-	0x04, 0x01, 0x0c, 0x09, 0xb0, 0x83, 0x91, 0x00, 
-	0xb0, 0x84, 0x49, 0x2f, 0x91, 0x06, 0x78, 0x08, 
-	0x4e, 0x2e, 0x1c, 0xf1, 0x91, 0x05, 0x4d, 0x2e, 
-	0x28, 0x08, 0xd1, 0x34, 0x1c, 0xf8, 0xa9, 0x02, 
-	0xf0, 0x00, 0xf9, 0x9e, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x01, 0x88, 0xe9, 0xa8, 0x02, 0x88, 0x00, 
-	0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x92, 0x00, 
-	0x68, 0xa8, 0xf7, 0xff, 0xfc, 0x18, 0x1c, 0x04, 
-	0xd1, 0x02, 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x3a, 
-	0x98, 0x01, 0x18, 0x38, 0x1c, 0xc1, 0x88, 0xe8, 
-	0x19, 0x00, 0xaa, 0x02, 0x88, 0x12, 0xf0, 0x12, 
-	0xfb, 0x25, 0x9a, 0x00, 0x1f, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x12, 0x01, 0x71, 0x21, 0x71, 0x60, 
-	0x98, 0x05, 0x1c, 0x21, 0xaa, 0x03, 0xf0, 0x00, 
-	0xf9, 0xcd, 0x1c, 0x07, 0xd5, 0x03, 0x1c, 0x20, 
-	0xf7, 0xff, 0xfc, 0x1a, 0xe7, 0xe1, 0x1c, 0x20, 
-	0xf7, 0xff, 0xfc, 0x16, 0xe0, 0x06, 0x98, 0x05, 
-	0x1c, 0x39, 0xaa, 0x03, 0xf0, 0x00, 0xf9, 0xbe, 
-	0x1c, 0x07, 0xd4, 0xd6, 0x24, 0x02, 0x70, 0x34, 
-	0x12, 0x38, 0x70, 0x70, 0x70, 0xb7, 0xa8, 0x03, 
-	0x88, 0x00, 0x1c, 0xc1, 0x1c, 0x30, 0xf7, 0xff, 
-	0xfb, 0x0b, 0x99, 0x06, 0x70, 0x0c, 0x20, 0x01, 
-	0x99, 0x06, 0x70, 0x48, 0x99, 0x04, 0x80, 0x69, 
-	0x80, 0xa8, 0x21, 0x00, 0x80, 0xe9, 0xb0, 0x07, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x72, 0x60, 
-	0x2e, 0x08, 0x7e, 0x7c, 0xb5, 0xf0, 0xb0, 0x81, 
-	0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, 
-	0xf9, 0x3f, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, 
-	0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x08, 
-	0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, 
-	0xf7, 0xff, 0xfb, 0xb4, 0x60, 0xa0, 0x1c, 0x02, 
-	0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, 
-	0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xfa, 0xca, 
-	0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, 
-	0x68, 0xa1, 0x70, 0x48, 0x20, 0x09, 0x68, 0xa1, 
-	0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, 
-	0x20, 0x08, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, 
-	0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, 
-	0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfb, 0x93, 
-	0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, 
-	0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, 
-	0x31, 0x03, 0xf0, 0x12, 0xfa, 0xa3, 0x88, 0xe0, 
-	0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, 
-	0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, 
-	0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x22, 0x9f, 
-	0x4f, 0x0d, 0x70, 0x3a, 0x22, 0x88, 0x70, 0x7a, 
-	0x22, 0x0b, 0x70, 0xba, 0x22, 0x01, 0x70, 0xfa, 
-	0x71, 0x39, 0x21, 0x05, 0x1c, 0x3a, 0xf0, 0x00, 
-	0xfc, 0xbf, 0x22, 0x20, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x12, 0xfb, 0x78, 0x20, 0x06, 0x70, 0x38, 
-	0x21, 0x20, 0x1c, 0x38, 0xf7, 0xff, 0xfa, 0x88, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x72, 0x60, 0xb5, 0xf0, 0x1c, 0x0f, 
-	0x04, 0x01, 0x0c, 0x09, 0xb0, 0x83, 0x91, 0x00, 
-	0xb0, 0x84, 0x49, 0x2f, 0x91, 0x06, 0x78, 0x08, 
-	0x4e, 0x2e, 0x1c, 0xf1, 0x91, 0x05, 0x4d, 0x2e, 
-	0x28, 0x07, 0xd1, 0x34, 0x1c, 0xf8, 0xa9, 0x02, 
-	0xf0, 0x00, 0xf8, 0xbe, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x01, 0x88, 0xe9, 0xa8, 0x02, 0x88, 0x00, 
-	0x18, 0x08, 0x04, 0x02, 0x0c, 0x12, 0x92, 0x00, 
-	0x68, 0xa8, 0xf7, 0xff, 0xfb, 0x38, 0x1c, 0x04, 
-	0xd1, 0x02, 0x20, 0x00, 0x43, 0xc0, 0xe0, 0x3a, 
-	0x98, 0x01, 0x18, 0x38, 0x1c, 0xc1, 0x88, 0xe8, 
-	0x19, 0x00, 0xaa, 0x02, 0x88, 0x12, 0xf0, 0x12, 
-	0xfa, 0x45, 0x9a, 0x00, 0x1f, 0x90, 0x04, 0x00, 
-	0x0c, 0x00, 0x12, 0x01, 0x71, 0x21, 0x71, 0x60, 
-	0x98, 0x05, 0x1c, 0x21, 0xaa, 0x03, 0xf0, 0x00, 
-	0xf8, 0xed, 0x1c, 0x07, 0xd5, 0x03, 0x1c, 0x20, 
-	0xf7, 0xff, 0xfb, 0x3a, 0xe7, 0xe1, 0x1c, 0x20, 
-	0xf7, 0xff, 0xfb, 0x36, 0xe0, 0x06, 0x98, 0x05, 
-	0x1c, 0x39, 0xaa, 0x03, 0xf0, 0x00, 0xf8, 0xde, 
-	0x1c, 0x07, 0xd4, 0xd6, 0x24, 0x03, 0x70, 0x34, 
-	0x12, 0x38, 0x70, 0x70, 0x70, 0xb7, 0xa8, 0x03, 
-	0x88, 0x00, 0x19, 0x01, 0x1c, 0x30, 0xf7, 0xff, 
-	0xfa, 0x2b, 0x99, 0x06, 0x70, 0x0c, 0x20, 0x01, 
-	0x99, 0x06, 0x70, 0x48, 0x99, 0x04, 0x80, 0x69, 
-	0x80, 0xa8, 0x21, 0x00, 0x80, 0xe9, 0xb0, 0x07, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x72, 0x60, 
-	0x2e, 0x08, 0x7e, 0x7c, 0xb5, 0xf0, 0xb0, 0x81, 
-	0x1c, 0xc8, 0x1c, 0x0f, 0x46, 0x69, 0xf0, 0x00, 
-	0xf8, 0x5f, 0x04, 0x05, 0x0c, 0x2d, 0x4e, 0x23, 
-	0x78, 0x30, 0x1d, 0xf4, 0x34, 0xf9, 0x28, 0x07, 
-	0xd0, 0x23, 0xa8, 0x00, 0x88, 0x00, 0x30, 0x06, 
-	0xf7, 0xff, 0xfa, 0xd4, 0x60, 0xa0, 0x1c, 0x02, 
-	0xd0, 0x18, 0x19, 0x78, 0x1c, 0xc1, 0x1d, 0x90, 
-	0xaa, 0x00, 0x88, 0x12, 0xf0, 0x12, 0xf9, 0xea, 
-	0x20, 0x9f, 0x68, 0xa1, 0x70, 0x08, 0x20, 0x88, 
-	0x68, 0xa1, 0x70, 0x48, 0x20, 0x0c, 0x68, 0xa1, 
-	0x70, 0x88, 0x20, 0x82, 0x68, 0xa1, 0x70, 0xc8, 
-	0x20, 0x07, 0x70, 0x30, 0xa8, 0x00, 0x88, 0x00, 
-	0x30, 0x06, 0xe0, 0x18, 0x20, 0x00, 0x43, 0xc0, 
-	0xe0, 0x17, 0x88, 0xe1, 0xa8, 0x00, 0x88, 0x00, 
-	0x18, 0x0a, 0x68, 0xa0, 0xf7, 0xff, 0xfa, 0xb3, 
-	0x60, 0xa0, 0x28, 0x00, 0xd0, 0xf2, 0x88, 0xe1, 
-	0x18, 0x40, 0x19, 0x79, 0xaa, 0x00, 0x88, 0x12, 
-	0x31, 0x03, 0xf0, 0x12, 0xf9, 0xc3, 0x88, 0xe0, 
-	0xa9, 0x00, 0x88, 0x09, 0x18, 0x40, 0x80, 0xe0, 
-	0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x7c, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0xb4, 0xb0, 0x24, 0x01, 0x22, 0x00, 0x78, 0x07, 
-	0x0a, 0x3b, 0xd3, 0x15, 0x23, 0x00, 0x06, 0x7c, 
-	0x0e, 0x64, 0x2c, 0x00, 0xdd, 0x0a, 0x02, 0x12, 
-	0x04, 0x12, 0x0c, 0x12, 0x18, 0xc5, 0x78, 0x6d, 
-	0x43, 0x2a, 0x04, 0x12, 0x0c, 0x12, 0x33, 0x01, 
-	0x42, 0x9c, 0xdc, 0xf4, 0x1c, 0x78, 0x06, 0x40, 
-	0x0e, 0x40, 0x04, 0x04, 0x14, 0x24, 0xe0, 0x01, 
-	0x06, 0x7a, 0x0e, 0x52, 0x80, 0x0a, 0x1c, 0x20, 
-	0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xf0, 0x04, 0x16, 
-	0x0c, 0x36, 0x1c, 0x07, 0x78, 0x00, 0x04, 0x00, 
-	0x1c, 0x0c, 0x78, 0x79, 0x02, 0x09, 0x43, 0x08, 
-	0x78, 0xb9, 0x43, 0x08, 0xb0, 0x81, 0x4b, 0x12, 
-	0x42, 0x98, 0xd1, 0x09, 0x46, 0x69, 0x1c, 0xf8, 
-	0xf7, 0xff, 0xff, 0xca, 0x1c, 0x05, 0xa8, 0x00, 
-	0x88, 0x00, 0x30, 0x02, 0x42, 0xb0, 0xdd, 0x02, 
-	0x20, 0x00, 0x43, 0xc0, 0xe0, 0x10, 0x19, 0x78, 
-	0xaa, 0x00, 0x88, 0x12, 0x1c, 0xc1, 0x1c, 0x20, 
-	0xf0, 0x12, 0xf9, 0x5c, 0xa8, 0x00, 0x88, 0x00, 
-	0x18, 0x28, 0x30, 0x03, 0x04, 0x00, 0x14, 0x00, 
-	0x21, 0x00, 0xaa, 0x00, 0x88, 0x12, 0x54, 0xa1, 
-	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x00, 0x9f, 0x88, 0x03, 0xb5, 0xf7, 0x1c, 0x07, 
-	0x20, 0x00, 0xb0, 0x85, 0x90, 0x02, 0x26, 0x00, 
-	0x99, 0x06, 0x1c, 0xc8, 0xa9, 0x04, 0xf7, 0xff, 
-	0xff, 0x9f, 0xa9, 0x04, 0x88, 0x09, 0x1c, 0x04, 
-	0x43, 0xf0, 0x02, 0xc3, 0x42, 0xd9, 0xd2, 0x58, 
-	0x21, 0x00, 0x91, 0x03, 0x4d, 0x2d, 0x99, 0x06, 
-	0x19, 0x08, 0x22, 0x01, 0x02, 0xd2, 0x30, 0x04, 
-	0x1c, 0x29, 0xf7, 0xff, 0xff, 0xaf, 0x90, 0x01, 
-	0x23, 0x01, 0x42, 0xd8, 0xd0, 0x1c, 0x1c, 0x28, 
-	0xf0, 0x12, 0xf9, 0x98, 0x90, 0x00, 0x1c, 0x42, 
-	0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x12, 0xf9, 0x22, 
-	0x98, 0x00, 0x18, 0x38, 0x1c, 0x47, 0x98, 0x00, 
-	0x18, 0x30, 0x1c, 0x46, 0x98, 0x01, 0x18, 0x24, 
-	0x98, 0x03, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x03, 0x28, 0x03, 0xdb, 0xdb, 0xa8, 0x04, 
-	0x88, 0x00, 0x42, 0x84, 0xda, 0x27, 0xe0, 0x02, 
-	0x20, 0x00, 0x43, 0xc0, 0xe0, 0x29, 0x99, 0x06, 
-	0x19, 0x08, 0x22, 0x01, 0x02, 0xd2, 0x30, 0x04, 
-	0x1c, 0x29, 0xf7, 0xff, 0xff, 0x83, 0x90, 0x01, 
-	0x23, 0x01, 0x42, 0xd8, 0xd0, 0xf0, 0x1c, 0x28, 
-	0xf0, 0x12, 0xf9, 0x6c, 0x90, 0x00, 0x1c, 0x42, 
-	0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x12, 0xf8, 0xf6, 
-	0x98, 0x00, 0x18, 0x38, 0x1c, 0x47, 0x98, 0x00, 
-	0x18, 0x30, 0x1c, 0x46, 0x98, 0x01, 0x18, 0x24, 
-	0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 0xa8, 0x04, 
-	0x88, 0x00, 0x42, 0x84, 0xdb, 0xdb, 0x9a, 0x07, 
-	0x80, 0x16, 0x98, 0x02, 0x30, 0x03, 0x04, 0x00, 
-	0x14, 0x00, 0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x6a, 0x60, 
-	0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x54, 
-	0xb0, 0x84, 0xab, 0x00, 0x70, 0x18, 0x22, 0x46, 
-	0x70, 0x5a, 0x22, 0x04, 0x80, 0x5a, 0x80, 0x99, 
-	0x46, 0x69, 0xf7, 0xff, 0xf8, 0xf5, 0xb0, 0x04, 
-	0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 0x00, 0x00, 
-	0xb5, 0x00, 0x78, 0x01, 0x48, 0x0c, 0x70, 0x01, 
-	0x78, 0x00, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x02, 
-	0xd0, 0x01, 0x28, 0x03, 0xd1, 0x0b, 0x48, 0x09, 
-	0xca, 0x08, 0xc0, 0x08, 0xca, 0x08, 0xc0, 0x08, 
-	0xca, 0x0c, 0xc0, 0x0c, 0xf0, 0x00, 0xf8, 0x67, 
-	0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0xa8, 0x2e, 0x08, 0x7b, 0x60, 
-	0xb5, 0x80, 0x20, 0x00, 0x27, 0x00, 0x4a, 0x1f, 
-	0x01, 0x03, 0x54, 0xd7, 0x18, 0x9b, 0x60, 0x5f, 
-	0x60, 0x9f, 0x81, 0x9f, 0x30, 0x01, 0x28, 0x02, 
-	0xdb, 0xf6, 0x48, 0x1b, 0x70, 0x07, 0x49, 0x1b, 
-	0x48, 0x1b, 0x60, 0x01, 0x49, 0x1b, 0x1d, 0xc2, 
-	0x32, 0x79, 0x60, 0x91, 0x49, 0x1a, 0x1d, 0xc2, 
-	0x32, 0xf9, 0x61, 0x11, 0x49, 0x19, 0x23, 0x05, 
-	0x01, 0xdb, 0x18, 0xc2, 0x23, 0x03, 0x02, 0x1b, 
-	0x62, 0x91, 0x18, 0xc1, 0x63, 0x0f, 0x49, 0x16, 
-	0x1d, 0xc2, 0x32, 0xff, 0x32, 0xfa, 0x30, 0xff, 
-	0x30, 0x81, 0x62, 0x11, 0x61, 0x87, 0x20, 0x05, 
-	0xf7, 0xff, 0xf9, 0x94, 0x28, 0x00, 0xda, 0x03, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x49, 0x0e, 0x00, 0xc2, 0x52, 0x8f, 
-	0x30, 0x01, 0x28, 0x40, 0xdb, 0xfa, 0x48, 0x0c, 
-	0x70, 0x47, 0x20, 0x01, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7e, 0x88, 
-	0x2e, 0x08, 0x1a, 0xa8, 0x00, 0x01, 0x00, 0x41, 
-	0x2e, 0x08, 0x7e, 0xa8, 0x00, 0x02, 0x00, 0x41, 
-	0x00, 0x03, 0x00, 0x41, 0x00, 0x40, 0x00, 0x41, 
-	0x00, 0x24, 0x00, 0x41, 0x2e, 0x08, 0x7b, 0x70, 
-	0x2e, 0x08, 0x7d, 0x7c, 0xb5, 0x00, 0xf7, 0xff, 
-	0xf8, 0x25, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0xb0, 0x83, 0x48, 0xda, 0x90, 0x02, 0x78, 0x00, 
-	0x21, 0x00, 0x4a, 0xd9, 0x4c, 0xd9, 0x4f, 0xda, 
-	0x28, 0x01, 0xd1, 0x71, 0x78, 0x78, 0x38, 0x41, 
-	0x4d, 0xd8, 0x4e, 0xd9, 0x4b, 0xd9, 0x93, 0x01, 
-	0x28, 0x0b, 0xd2, 0x6a, 0xa3, 0x01, 0x5c, 0x1b, 
-	0x00, 0x5b, 0x44, 0x9f, 0xc9, 0x8e, 0xc9, 0xde, 
-	0xdd, 0xc9, 0x67, 0xc9, 0x3b, 0x2b, 0x05, 0x00, 
-	0x88, 0xb8, 0x06, 0x00, 0x0e, 0x00, 0x01, 0x00, 
-	0x9b, 0x01, 0x54, 0x19, 0x9b, 0x01, 0x18, 0xc0, 
-	0x68, 0x40, 0x1c, 0x0c, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xff, 0xf9, 0x26, 0x88, 0xb8, 0x06, 0x00, 
-	0x0e, 0x00, 0x01, 0x00, 0x9b, 0x01, 0x18, 0xc0, 
-	0x60, 0x44, 0x68, 0x80, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xff, 0xf9, 0x1a, 0x88, 0xb8, 0x06, 0x00, 
-	0x0e, 0x00, 0x01, 0x01, 0x9b, 0x01, 0x18, 0xc9, 
-	0x22, 0x01, 0x60, 0x8c, 0x70, 0x32, 0x70, 0x74, 
-	0x18, 0x80, 0xe0, 0x09, 0x20, 0x01, 0x88, 0xb9, 
-	0x06, 0x09, 0x0e, 0x09, 0x01, 0x0a, 0x9b, 0x01, 
-	0x54, 0x98, 0x70, 0x30, 0x70, 0x70, 0x18, 0x08, 
-	0x70, 0xb0, 0x21, 0x20, 0x1c, 0x30, 0xf7, 0xff, 
-	0xf8, 0x07, 0xe0, 0x8d, 0x26, 0x00, 0x00, 0xf1, 
-	0x19, 0x08, 0x88, 0xc2, 0x79, 0x3b, 0x42, 0x9a, 
-	0xd1, 0x1e, 0x22, 0x00, 0x80, 0xc2, 0x58, 0x60, 
-	0xf0, 0x00, 0xfa, 0x86, 0x23, 0x01, 0x42, 0xd8, 
-	0xd0, 0x16, 0x01, 0x01, 0x18, 0x09, 0x00, 0xc9, 
-	0x19, 0x49, 0x88, 0x8a, 0x2a, 0x00, 0xd0, 0x01, 
-	0x3a, 0x01, 0x80, 0x8a, 0x28, 0x04, 0xd1, 0x0b, 
-	0x00, 0x70, 0x19, 0x40, 0x30, 0xff, 0x30, 0xff, 
-	0x30, 0x02, 0x90, 0x00, 0x8c, 0xc0, 0xf0, 0x00, 
-	0xfa, 0xcb, 0x22, 0x00, 0x98, 0x00, 0x84, 0xc2, 
-	0x36, 0x01, 0x2e, 0x20, 0xdb, 0xd7, 0xe0, 0x63, 
-	0xe0, 0x9c, 0xe0, 0x74, 0x88, 0xb8, 0x00, 0xc0, 
-	0x1c, 0x0e, 0x19, 0x01, 0x80, 0xce, 0x58, 0x20, 
-	0xf0, 0x00, 0xfa, 0x5e, 0x23, 0x01, 0x42, 0xd8, 
-	0xd0, 0x56, 0x01, 0x01, 0x18, 0x09, 0x00, 0xc9, 
-	0x19, 0x49, 0x88, 0x8a, 0x2a, 0x00, 0xd0, 0x01, 
-	0x3a, 0x01, 0x80, 0x8a, 0x28, 0x04, 0xd1, 0x5e, 
-	0x88, 0xb8, 0x00, 0x40, 0x19, 0x40, 0x30, 0xff, 
-	0x30, 0xff, 0x30, 0x02, 0x8c, 0xc0, 0xf0, 0x00, 
-	0xfa, 0xa3, 0x88, 0xb8, 0x00, 0x40, 0x19, 0x40, 
-	0x30, 0xff, 0x30, 0xff, 0x30, 0x02, 0x84, 0xc6, 
-	0xe0, 0xb6, 0x7a, 0x38, 0x06, 0x00, 0x7a, 0x79, 
-	0x04, 0x09, 0x43, 0x08, 0x7a, 0xb9, 0x02, 0x09, 
-	0x43, 0x08, 0x7a, 0xf9, 0x43, 0x08, 0x4b, 0x8a, 
-	0x42, 0x98, 0xd0, 0x43, 0xdc, 0x0d, 0x49, 0x89, 
-	0x42, 0x88, 0xd0, 0x19, 0x42, 0x90, 0xd0, 0x1b, 
-	0x49, 0x87, 0x42, 0x88, 0xd1, 0x3a, 0x1d, 0xe8, 
-	0x30, 0xf9, 0x8a, 0x82, 0x32, 0x01, 0x82, 0x82, 
-	0xe0, 0x28, 0x49, 0x84, 0x42, 0x88, 0xd0, 0x1f, 
-	0x49, 0x83, 0x42, 0x88, 0xd1, 0x2e, 0x23, 0x05, 
-	0x01, 0xdb, 0x18, 0xe8, 0x8d, 0x82, 0x2a, 0x00, 
-	0xd1, 0x13, 0x22, 0x01, 0x85, 0x82, 0xe0, 0x19, 
-	0x88, 0xa8, 0x30, 0x01, 0x80, 0xa8, 0xe0, 0x15, 
-	0x1d, 0xe8, 0x30, 0x79, 0x89, 0x81, 0x31, 0x01, 
-	0x81, 0x81, 0x88, 0xf9, 0x00, 0xc8, 0x50, 0x22, 
-	0x79, 0x3a, 0x19, 0x00, 0x80, 0xc2, 0xe0, 0x10, 
-	0xe0, 0x7b, 0x88, 0xf9, 0x22, 0xf3, 0xe0, 0x13, 
-	0x1d, 0xe8, 0x30, 0xff, 0x30, 0xfa, 0x8c, 0x82, 
-	0x32, 0x01, 0x84, 0x82, 0x88, 0xfa, 0x00, 0xd0, 
-	0x50, 0x21, 0x79, 0x39, 0x19, 0x00, 0x80, 0xc1, 
-	0x1c, 0x11, 0x22, 0x00, 0xe0, 0x04, 0xe0, 0xbd, 
-	0xe0, 0x1b, 0xe0, 0x05, 0x88, 0xf9, 0x22, 0xf0, 
-	0x20, 0x00, 0xf0, 0x00, 0xf9, 0xc1, 0xe0, 0x5f, 
-	0x88, 0xb8, 0x00, 0xc1, 0x58, 0x61, 0x4b, 0x64, 
-	0x42, 0x99, 0xd0, 0x0b, 0xdc, 0x58, 0x4b, 0x61, 
-	0x42, 0x99, 0xd0, 0x04, 0x42, 0x91, 0xd1, 0x54, 
-	0xf7, 0xff, 0xf8, 0xf4, 0xe0, 0xa6, 0xf7, 0xff, 
-	0xf8, 0x8b, 0xe0, 0xa3, 0xf7, 0xff, 0xf9, 0xc2, 
-	0xe0, 0xa0, 0x68, 0xb9, 0x98, 0x02, 0x60, 0x41, 
-	0x88, 0xb8, 0xf0, 0x00, 0xf8, 0xbd, 0x98, 0x02, 
-	0x68, 0x40, 0xe0, 0x8f, 0x28, 0x03, 0xd1, 0x50, 
-	0x68, 0x78, 0x88, 0x3b, 0x06, 0x1e, 0x0e, 0x36, 
-	0x1c, 0x05, 0x2e, 0x06, 0xd0, 0x3f, 0xdc, 0x08, 
-	0x2e, 0x06, 0xd2, 0x58, 0xa3, 0x01, 0x5d, 0x9b, 
-	0x00, 0x5b, 0x44, 0x9f, 0x5b, 0x55, 0x3c, 0x12, 
-	0x61, 0x4d, 0x2e, 0x0a, 0xd0, 0x3e, 0xdc, 0x05, 
-	0x2e, 0x08, 0xd0, 0x36, 0x2e, 0x09, 0xd1, 0x57, 
-	0x26, 0x00, 0xe0, 0x56, 0x2e, 0x0b, 0xd0, 0x66, 
-	0x2e, 0xe0, 0xd1, 0x51, 0x48, 0x49, 0x70, 0x01, 
-	0xe0, 0x69, 0x49, 0x49, 0x78, 0x4a, 0x2a, 0x01, 
-	0xd1, 0x4a, 0x78, 0x03, 0x1d, 0xca, 0x32, 0xf9, 
-	0x88, 0xd7, 0x18, 0x7f, 0x70, 0xbb, 0x88, 0xd3, 
-	0x33, 0x01, 0x80, 0xd3, 0x88, 0xd3, 0x88, 0x97, 
-	0x42, 0xbb, 0xd0, 0x02, 0x78, 0x00, 0x28, 0x0b, 
-	0xd1, 0x3a, 0x78, 0x08, 0x28, 0x02, 0xd0, 0x09, 
-	0x28, 0x03, 0xd0, 0x07, 0x28, 0x05, 0xd1, 0x33, 
-	0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x59, 0xe0, 0x4a, 
-	0xe0, 0x54, 0xe0, 0x53, 0x78, 0x89, 0x88, 0x50, 
-	0xf7, 0xff, 0xfc, 0x52, 0xe0, 0x43, 0x78, 0xb9, 
-	0xf0, 0x00, 0xff, 0x52, 0xe0, 0x3f, 0x20, 0x00, 
-	0xe0, 0x0b, 0x78, 0xb9, 0xf0, 0x00, 0xfa, 0x2a, 
-	0xe0, 0x39, 0xe0, 0x3e, 0x78, 0x01, 0x02, 0x09, 
-	0x78, 0x40, 0x43, 0x08, 0x49, 0x2f, 0x81, 0x48, 
-	0x20, 0x08, 0xf0, 0x00, 0xfe, 0xeb, 0xe0, 0x2e, 
-	0x78, 0x01, 0x02, 0x09, 0x78, 0x40, 0x43, 0x08, 
-	0xf0, 0x00, 0xfa, 0x45, 0xe0, 0x27, 0xe0, 0x26, 
-	0x78, 0xba, 0x1c, 0x01, 0x78, 0x00, 0xf0, 0x00, 
-	0xfa, 0x13, 0xe0, 0x20, 0x78, 0xba, 0x1c, 0x01, 
-	0x78, 0x00, 0xf0, 0x00, 0xfa, 0x22, 0xe0, 0x1a, 
-	0xe0, 0x19, 0x00, 0xf0, 0x58, 0x21, 0x4b, 0x14, 
-	0x42, 0x99, 0xd1, 0x0d, 0x19, 0x00, 0x88, 0xc0, 
-	0xf7, 0xfd, 0xfd, 0x9a, 0x68, 0x79, 0x78, 0x09, 
-	0x30, 0x01, 0x42, 0x88, 0xd1, 0x04, 0x1c, 0x30, 
-	0xf7, 0xff, 0xf8, 0xd4, 0xe0, 0x07, 0xe0, 0x03, 
-	0x36, 0x01, 0x2e, 0x20, 0xdb, 0xe9, 0xe0, 0x02, 
-	0x20, 0xff, 0xf0, 0x00, 0xfa, 0x6b, 0x2d, 0x00, 
-	0xd0, 0x08, 0x1c, 0x28, 0xf7, 0xfe, 0xff, 0xa4, 
-	0xe0, 0x04, 0x28, 0x02, 0xd1, 0x02, 0x88, 0x38, 
-	0xf0, 0x00, 0xf9, 0xac, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xa8, 
-	0x00, 0x02, 0x00, 0x41, 0x2e, 0x08, 0x7a, 0x60, 
-	0x2e, 0x08, 0x7b, 0x60, 0x2e, 0x08, 0x7e, 0xa8, 
-	0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7e, 0x88, 
-	0x00, 0x20, 0x00, 0x41, 0x00, 0x01, 0x00, 0x41, 
-	0x00, 0x03, 0x00, 0x41, 0x00, 0x24, 0x00, 0x41, 
-	0x00, 0x40, 0x00, 0x41, 0x2e, 0x08, 0x1a, 0x94, 
-	0x2e, 0x08, 0x7d, 0x7c, 0x2e, 0x08, 0x8f, 0x80, 
-	0xb5, 0x90, 0x04, 0x04, 0x0c, 0x24, 0x78, 0x08, 
-	0x04, 0x00, 0x1c, 0x0f, 0x78, 0x49, 0x02, 0x09, 
-	0x43, 0x08, 0x78, 0xb9, 0x43, 0x08, 0x4b, 0x47, 
-	0x42, 0x98, 0xd0, 0x5d, 0xdc, 0x20, 0x4b, 0x46, 
-	0x42, 0x98, 0xd0, 0x5a, 0xdc, 0x0f, 0x4b, 0x45, 
-	0x42, 0x98, 0xd0, 0x41, 0x33, 0x01, 0x42, 0x98, 
-	0xd0, 0x37, 0x4b, 0x43, 0x42, 0x98, 0xd1, 0x5f, 
-	0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xf8, 0x20, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x3f, 
-	0x42, 0x98, 0xd0, 0x3e, 0x4b, 0x3e, 0x42, 0x98, 
-	0xd1, 0x52, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 
-	0xf8, 0x87, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x4b, 0x3a, 0x42, 0x98, 0xd0, 0x50, 0xdc, 0x0f, 
-	0x4b, 0x39, 0x42, 0x98, 0xd0, 0x3d, 0x33, 0x06, 
-	0x42, 0x98, 0xd0, 0x42, 0x4b, 0x37, 0x42, 0x98, 
-	0xd1, 0x3e, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 
-	0xfa, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x4b, 0x33, 0x42, 0x98, 0xd0, 0x16, 0x33, 0x01, 
-	0x42, 0x98, 0xd1, 0x31, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf7, 0xff, 0xfc, 0x20, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xfe, 
-	0xff, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x20, 0xf7, 0xfe, 0xff, 0x9d, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf7, 0xff, 0xfb, 0xa0, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 
-	0xf9, 0x09, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xe0, 0x00, 0xe0, 0x1c, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf7, 0xff, 0xf9, 0x02, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 
-	0xf9, 0x29, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xe0, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 
-	0xfa, 0x1b, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xfb, 0x06, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x11, 
-	0x89, 0x40, 0xf0, 0x00, 0xf9, 0x60, 0x1c, 0x20, 
-	0x1c, 0x39, 0xf7, 0xff, 0xf8, 0x81, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x9f, 0x88, 0x00, 
-	0x00, 0x9f, 0x80, 0x31, 0x00, 0x9f, 0x80, 0x10, 
-	0x00, 0x9f, 0x80, 0x21, 0x00, 0x9f, 0x80, 0x33, 
-	0x00, 0x9f, 0x84, 0x40, 0x00, 0x9f, 0x88, 0x0a, 
-	0x00, 0x9f, 0x88, 0x01, 0x00, 0x9f, 0x88, 0x09, 
-	0x00, 0x9f, 0x88, 0x0c, 0x2e, 0x08, 0x8f, 0x80, 
-	0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x1c, 0x28, 0x1c, 0x17, 0xf7, 0xfe, 
-	0xfe, 0x9d, 0x4c, 0x0d, 0x60, 0xa0, 0x28, 0x00, 
-	0xd1, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x54, 0x70, 0x21, 0x21, 0x45, 0x70, 0x61, 
-	0x21, 0x0c, 0x80, 0x61, 0x80, 0xa6, 0x81, 0xa5, 
-	0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x11, 0xfd, 0xaa, 
-	0x78, 0x20, 0x1c, 0x21, 0xf7, 0xfe, 0xfd, 0xd0, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7b, 0x60, 0xb5, 0x00, 0x06, 0x02, 
-	0x0e, 0x12, 0x20, 0x54, 0x49, 0x05, 0x70, 0x08, 
-	0x23, 0x48, 0x70, 0x4b, 0x23, 0x04, 0x80, 0x4b, 
-	0x71, 0x0a, 0xf7, 0xfe, 0xfd, 0xbd, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x60, 
-	0xb5, 0x90, 0x04, 0x0b, 0x0c, 0x1b, 0x27, 0x54, 
-	0x49, 0x07, 0x70, 0x0f, 0x24, 0x43, 0x70, 0x4c, 
-	0x24, 0x04, 0x80, 0x4c, 0x71, 0xc8, 0x80, 0x8b, 
-	0x71, 0x8a, 0x1c, 0x38, 0xf7, 0xfe, 0xfd, 0xa8, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7b, 0x60, 0xb5, 0x00, 0x04, 0x02, 
-	0x0c, 0x12, 0x20, 0x54, 0x49, 0x05, 0x70, 0x08, 
-	0x23, 0x46, 0x70, 0x4b, 0x23, 0x04, 0x80, 0x4b, 
-	0x80, 0x8a, 0xf7, 0xfe, 0xfd, 0x95, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x60, 
-	0x23, 0xff, 0x04, 0x1b, 0x40, 0x18, 0x23, 0x01, 
-	0x05, 0x5b, 0x42, 0x98, 0xd0, 0x1e, 0xdc, 0x0b, 
-	0x09, 0x5b, 0x42, 0x98, 0xd0, 0x16, 0x00, 0x5b, 
-	0x42, 0x98, 0xd0, 0x15, 0x23, 0x03, 0x04, 0x1b, 
-	0x42, 0x98, 0xd1, 0x19, 0x20, 0x02, 0x47, 0x70, 
-	0x23, 0x09, 0x04, 0x9b, 0x42, 0x98, 0xd0, 0x0f, 
-	0x23, 0x01, 0x05, 0x9b, 0x42, 0x98, 0xd0, 0x0d, 
-	0x23, 0x03, 0x05, 0x5b, 0x42, 0x98, 0xd1, 0x0b, 
-	0x20, 0x06, 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x01, 0x47, 0x70, 0x20, 0x03, 0x47, 0x70, 
-	0x20, 0x04, 0x47, 0x70, 0x20, 0x05, 0x47, 0x70, 
-	0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, 0xb5, 0xb0, 
-	0x04, 0x07, 0x0c, 0x3f, 0x04, 0x0b, 0x0c, 0x1b, 
-	0x04, 0x14, 0x0c, 0x24, 0x22, 0x00, 0x20, 0x00, 
-	0x49, 0x10, 0x00, 0xc5, 0x5b, 0x4d, 0x2d, 0x00, 
-	0xd1, 0x08, 0x1c, 0x42, 0x04, 0x12, 0x0c, 0x12, 
-	0x00, 0xc0, 0x52, 0x0a, 0x18, 0x40, 0x80, 0x84, 
-	0x80, 0x43, 0xe0, 0x02, 0x30, 0x01, 0x28, 0x40, 
-	0xdd, 0xef, 0x2a, 0x00, 0xd0, 0x0a, 0x20, 0x05, 
-	0x04, 0x00, 0x43, 0x10, 0x1c, 0x39, 0xf7, 0xfe, 
-	0xfd, 0xa9, 0x04, 0x00, 0x0c, 0x00, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7b, 0x70, 
-	0xb5, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 
-	0x49, 0x0b, 0x00, 0xc3, 0x5a, 0xcb, 0x42, 0x93, 
-	0xd1, 0x09, 0x27, 0x00, 0x00, 0xc0, 0x52, 0x0f, 
-	0x1c, 0x10, 0xf7, 0xfe, 0xfd, 0xc7, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x30, 0x01, 
-	0x28, 0x40, 0xdb, 0xee, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x7b, 0x70, 0xb5, 0xf0, 0x04, 0x06, 
-	0x0c, 0x36, 0x27, 0x00, 0x4c, 0x17, 0x00, 0xf8, 
-	0x5a, 0x20, 0x42, 0xb0, 0xd1, 0x1d, 0x00, 0xfd, 
-	0x19, 0x28, 0x88, 0x81, 0x29, 0x05, 0xd2, 0x10, 
-	0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 
-	0x17, 0x02, 0x09, 0x10, 0x17, 0x00, 0x21, 0x09, 
-	0x48, 0x0f, 0x70, 0x01, 0x21, 0x20, 0xf7, 0xfe, 
-	0xfc, 0xdf, 0xe0, 0x02, 0x88, 0x40, 0xf0, 0x01, 
-	0xfc, 0xf9, 0x5b, 0x60, 0xf7, 0xff, 0xff, 0xc0, 
-	0xe0, 0x06, 0x88, 0x40, 0xf7, 0xfe, 0xff, 0x2c, 
-	0xe0, 0x02, 0x37, 0x01, 0x2f, 0x40, 0xdb, 0xda, 
-	0x2f, 0x40, 0xd1, 0x02, 0x1c, 0x30, 0xf7, 0xfe, 
-	0xfd, 0x89, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7b, 0x70, 
-	0x2e, 0x08, 0x72, 0x60, 0x20, 0x00, 0x47, 0x70, 
-	0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x05, 
-	0xd0, 0x0c, 0x28, 0x0a, 0xd0, 0x05, 0x28, 0x0b, 
-	0xd1, 0x08, 0x78, 0x48, 0x22, 0x10, 0x21, 0x0b, 
-	0xe0, 0x02, 0x78, 0x48, 0x22, 0x10, 0x21, 0x0a, 
-	0xf0, 0x01, 0xfc, 0x90, 0x20, 0x00, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x00, 0x06, 0x00, 0x0e, 0x00, 
-	0x28, 0x05, 0xd0, 0x06, 0x28, 0x0a, 0xd0, 0x07, 
-	0x28, 0x0b, 0xd1, 0x02, 0x78, 0x88, 0xf0, 0x01, 
-	0xfb, 0xaf, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
-	0x78, 0x48, 0x28, 0x01, 0xd0, 0xf9, 0x78, 0x88, 
-	0xf0, 0x01, 0xfb, 0xa4, 0xe7, 0xf5, 0xb5, 0xf0, 
-	0x4d, 0x22, 0x81, 0x68, 0x27, 0x00, 0x06, 0x38, 
-	0x0e, 0x00, 0xf0, 0x01, 0xfb, 0xc5, 0x28, 0x4e, 
-	0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x01, 0xfb, 0x6c, 
-	0x1c, 0x78, 0x04, 0x07, 0x14, 0x3f, 0x2f, 0x14, 
-	0xdb, 0xf1, 0x89, 0x68, 0xf0, 0x01, 0xfc, 0xda, 
-	0x89, 0x68, 0xf0, 0x01, 0xfc, 0x41, 0x21, 0x0e, 
-	0x4f, 0x17, 0x28, 0x00, 0xd1, 0x02, 0x70, 0x39, 
-	0x20, 0x04, 0xe0, 0x1e, 0x20, 0x00, 0x24, 0x00, 
-	0x4e, 0x14, 0x00, 0xe1, 0x58, 0x71, 0x4b, 0x14, 
-	0x42, 0x99, 0xd1, 0x0e, 0x89, 0x69, 0x1c, 0x20, 
-	0xf7, 0xfe, 0xff, 0x3e, 0x28, 0x00, 0xd0, 0x07, 
-	0x21, 0x0e, 0x70, 0x39, 0x20, 0x00, 0x70, 0x78, 
-	0x21, 0x06, 0x1c, 0x38, 0xf7, 0xfe, 0xfc, 0x60, 
-	0x20, 0x01, 0x34, 0x01, 0x2c, 0x20, 0xdb, 0xe8, 
-	0x28, 0x00, 0xd1, 0x07, 0x21, 0x0e, 0x70, 0x39, 
-	0x20, 0x05, 0x70, 0x78, 0x21, 0x06, 0x1c, 0x38, 
-	0xf7, 0xfe, 0xfc, 0x52, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, 
-	0x2e, 0x08, 0x72, 0x60, 0x2e, 0x08, 0x7a, 0x60, 
-	0x00, 0x03, 0x00, 0x41, 0xb5, 0xf0, 0x06, 0x00, 
-	0x0e, 0x00, 0x21, 0x00, 0xb0, 0x85, 0x91, 0x02, 
-	0x22, 0x02, 0x92, 0x01, 0x28, 0xff, 0xd0, 0x02, 
-	0x22, 0x01, 0x92, 0x01, 0x1c, 0x01, 0x9a, 0x01, 
-	0x2a, 0x00, 0xdd, 0x4d, 0x4a, 0x28, 0x92, 0x04, 
-	0x4f, 0x28, 0x20, 0x01, 0x70, 0x38, 0x01, 0x08, 
-	0x9a, 0x04, 0x5c, 0x12, 0x70, 0x7a, 0x31, 0x01, 
-	0x91, 0x03, 0x70, 0xb9, 0x21, 0x00, 0x91, 0x00, 
-	0x9a, 0x04, 0x18, 0x84, 0x89, 0xa0, 0x28, 0x00, 
-	0xd0, 0x16, 0x68, 0xa3, 0x2b, 0x00, 0xd0, 0x13, 
-	0x70, 0xf8, 0x28, 0x00, 0xdd, 0x0b, 0x00, 0x4a, 
-	0x5a, 0x9d, 0x0a, 0x2e, 0x19, 0xd5, 0x71, 0x2e, 
-	0x5a, 0x9a, 0x71, 0x6a, 0x31, 0x01, 0x06, 0x09, 
-	0x0e, 0x09, 0x42, 0x88, 0xdc, 0xf3, 0x00, 0x40, 
-	0x99, 0x00, 0x18, 0x40, 0x1c, 0x45, 0xe0, 0x02, 
-	0x20, 0x00, 0x70, 0xf8, 0x25, 0x01, 0x68, 0x60, 
-	0x28, 0x00, 0xd0, 0x0e, 0xf0, 0x11, 0xfc, 0x66, 
-	0x1c, 0x02, 0x19, 0x78, 0x68, 0x61, 0x30, 0x03, 
-	0xf0, 0x11, 0xfb, 0xf0, 0x68, 0x60, 0xf0, 0x11, 
-	0xfc, 0x5d, 0x19, 0x45, 0x20, 0x00, 0x19, 0x79, 
-	0x70, 0xc8, 0x1c, 0x38, 0x1d, 0x69, 0xf7, 0xfe, 
-	0xfb, 0xf3, 0x99, 0x03, 0x06, 0x09, 0x0e, 0x09, 
-	0x98, 0x02, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x02, 0x9a, 0x01, 0x42, 0x90, 0xdb, 0xb4, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x7e, 0x88, 0x2e, 0x08, 0x72, 0x60, 
-	0xb5, 0x80, 0x20, 0x00, 0x22, 0x00, 0x1c, 0x0f, 
-	0x49, 0x0a, 0x54, 0x0a, 0x30, 0x01, 0x06, 0x00, 
-	0x0e, 0x00, 0x28, 0x02, 0xdb, 0xf9, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0xc6, 0x28, 0x01, 0xd1, 0x03, 
-	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb8, 
-	0xb5, 0xf0, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x17, 
-	0xf0, 0x00, 0xf8, 0x8e, 0x4d, 0x0d, 0x69, 0x28, 
-	0x4b, 0x0d, 0x18, 0xc6, 0x20, 0x04, 0xf0, 0x00, 
-	0xf9, 0x65, 0x20, 0x00, 0x2c, 0x00, 0xdd, 0x0c, 
-	0x5c, 0x39, 0x80, 0x31, 0x23, 0x03, 0x07, 0x1b, 
-	0x69, 0x29, 0x18, 0xc9, 0x88, 0x09, 0x54, 0x39, 
-	0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x42, 0xa0, 
-	0xdb, 0xf2, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb0, 
-	0x30, 0x00, 0x40, 0x00, 0xb5, 0xf0, 0x1c, 0x0c, 
-	0x1c, 0x17, 0xb0, 0x83, 0xf0, 0x00, 0xf8, 0x68, 
-	0x4e, 0x13, 0x69, 0x30, 0x4b, 0x13, 0x18, 0xc5, 
-	0x20, 0x04, 0xf0, 0x00, 0xf9, 0x3f, 0x23, 0x03, 
-	0x07, 0x1b, 0x69, 0x30, 0x18, 0xc1, 0x20, 0x00, 
-	0x2c, 0x00, 0xdd, 0x0a, 0x88, 0x2a, 0x54, 0x3a, 
-	0x88, 0x0a, 0x54, 0x3a, 0x88, 0x0a, 0x54, 0x3a, 
-	0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x42, 0xa0, 
-	0xdb, 0xf4, 0x46, 0x68, 0x90, 0x02, 0x20, 0x01, 
-	0xab, 0x01, 0x80, 0x18, 0x21, 0x04, 0xa8, 0x01, 
-	0xf0, 0x00, 0xf8, 0x9e, 0x1c, 0x20, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0xb0, 0x30, 0x00, 0x40, 0x00, 
-	0xb5, 0xb0, 0x25, 0x01, 0x1c, 0x0c, 0x1c, 0x17, 
-	0xf0, 0x00, 0xf8, 0x36, 0x48, 0x18, 0x2c, 0x08, 
-	0xd2, 0x2a, 0xa3, 0x02, 0x5d, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x26, 0x04, 0x06, 0x0c, 
-	0x12, 0x18, 0x1e, 0x23, 0x25, 0x00, 0xe0, 0x1f, 
-	0x61, 0x47, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, 
-	0xf8, 0x31, 0xe0, 0x14, 0x61, 0x47, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x53, 0xe0, 0x0e, 
-	0x61, 0x87, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x00, 
-	0xf8, 0x6f, 0xe0, 0x08, 0x61, 0x87, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x00, 0xf8, 0x93, 0xe0, 0x02, 
-	0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xb1, 0x1c, 0x05, 
-	0xe0, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x14, 
-	0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0xb0, 0x20, 0x00, 0x47, 0x70, 
-	0x49, 0x05, 0x68, 0xca, 0x42, 0x90, 0xd0, 0x06, 
-	0x60, 0xc8, 0x28, 0x00, 0xd1, 0x00, 0xe0, 0x01, 
-	0x20, 0x01, 0x03, 0x40, 0x61, 0x08, 0x47, 0x70, 
-	0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x88, 0x00, 0x4a, 0x10, 0x43, 0x02, 0x48, 0x10, 
-	0x69, 0x00, 0x43, 0x02, 0x25, 0x03, 0x07, 0x2d, 
-	0x43, 0x05, 0x1c, 0x08, 0x1c, 0x14, 0xf0, 0x00, 
-	0xf8, 0xc1, 0x20, 0x00, 0x88, 0x79, 0x29, 0x00, 
-	0xdd, 0x0a, 0x88, 0x21, 0x68, 0x7a, 0x54, 0x11, 
-	0x88, 0x29, 0x68, 0x7a, 0x54, 0x11, 0x88, 0x79, 
-	0x30, 0x01, 0x34, 0x02, 0x42, 0x81, 0xdc, 0xf4, 
-	0x30, 0x01, 0x81, 0x38, 0x20, 0x00, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0x30, 0x00, 0x40, 0x00, 
-	0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0x90, 0x1c, 0x07, 
-	0x88, 0x00, 0x4b, 0x0d, 0x18, 0xc0, 0x4a, 0x0d, 
-	0x69, 0x12, 0x18, 0x84, 0x1c, 0x08, 0xf0, 0x00, 
-	0xf8, 0x9d, 0x20, 0x00, 0x88, 0x79, 0x29, 0x00, 
-	0xdd, 0x07, 0x68, 0x79, 0x5c, 0x09, 0x80, 0x21, 
-	0x88, 0x79, 0x30, 0x01, 0x34, 0x02, 0x42, 0x81, 
-	0xdc, 0xf7, 0x20, 0x01, 0x81, 0x38, 0x20, 0x00, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x30, 0x00, 0x40, 0x00, 0x2e, 0x08, 0x1a, 0xb0, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x88, 0x00, 0x07, 0xc2, 
-	0x0f, 0xd2, 0x4c, 0x0f, 0xd0, 0x04, 0x23, 0xfe, 
-	0x40, 0x18, 0x4b, 0x0e, 0x18, 0xc0, 0xe0, 0x01, 
-	0x4b, 0x0d, 0x18, 0xc0, 0x69, 0x22, 0x18, 0x85, 
-	0x1c, 0x08, 0xf0, 0x00, 0xf8, 0x73, 0x23, 0x03, 
-	0x07, 0x1b, 0x69, 0x20, 0x18, 0xc0, 0x88, 0x29, 
-	0x68, 0x7a, 0x70, 0x11, 0x88, 0x01, 0x68, 0x7a, 
-	0x70, 0x11, 0x88, 0x00, 0x68, 0x79, 0x70, 0x08, 
-	0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0xb0, 0x30, 0x00, 0x50, 0x00, 
-	0x30, 0x00, 0x40, 0x00, 0xb5, 0x90, 0x88, 0x02, 
-	0x07, 0xd3, 0x0f, 0xdb, 0x1c, 0x07, 0x48, 0x0b, 
-	0x2b, 0x00, 0xd0, 0x02, 0x4b, 0x0a, 0x18, 0xd2, 
-	0xe0, 0x01, 0x4b, 0x0a, 0x18, 0xd2, 0x69, 0x00, 
-	0x18, 0x14, 0x1c, 0x08, 0xf0, 0x00, 0xf8, 0x4a, 
-	0x68, 0x78, 0x78, 0x00, 0x80, 0x20, 0x88, 0x38, 
-	0x07, 0xc0, 0x0f, 0xc0, 0x20, 0x00, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xb0, 
-	0x30, 0x00, 0x50, 0x00, 0x30, 0x00, 0x40, 0x00, 
-	0xb5, 0x90, 0x1c, 0x07, 0x20, 0x00, 0x78, 0x39, 
-	0x29, 0x01, 0xd0, 0x02, 0x29, 0x02, 0xd1, 0x28, 
-	0xe0, 0x26, 0x48, 0x15, 0x24, 0x00, 0x68, 0x01, 
-	0x29, 0x00, 0xd0, 0x16, 0x60, 0x04, 0x20, 0x1a, 
-	0xf0, 0x00, 0xf9, 0x10, 0x20, 0xc8, 0xf7, 0xfe, 
-	0xfb, 0x79, 0x20, 0x01, 0x06, 0x40, 0xf0, 0x16, 
-	0xfd, 0xca, 0xf0, 0x16, 0xfd, 0xcd, 0x4b, 0x0d, 
-	0x40, 0x18, 0xf0, 0x16, 0xfd, 0xcd, 0x20, 0x00, 
-	0xf0, 0x00, 0xf8, 0xb8, 0x20, 0x01, 0xf0, 0x00, 
-	0xf8, 0xb5, 0x48, 0x09, 0x1f, 0xc1, 0x39, 0x01, 
-	0x68, 0xc9, 0x5c, 0x40, 0x28, 0x00, 0xd0, 0x02, 
-	0x20, 0x01, 0x70, 0x78, 0xe0, 0x00, 0x70, 0x7c, 
-	0x20, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0x98, 0xfd, 0xff, 0xff, 0xff, 
-	0x2e, 0x08, 0x1a, 0xb8, 0xb5, 0xb0, 0x1c, 0x07, 
-	0x4c, 0x1e, 0x68, 0xe0, 0x00, 0x80, 0x4d, 0x1e, 
-	0x58, 0x28, 0x42, 0xb8, 0xd0, 0x32, 0x2f, 0x08, 
-	0xd2, 0x2d, 0xa3, 0x02, 0x5d, 0xdb, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x29, 0x29, 0x04, 0x04, 
-	0x13, 0x13, 0x29, 0x29, 0x28, 0x03, 0xd0, 0x22, 
-	0x28, 0x02, 0xd0, 0x20, 0x20, 0x03, 0x49, 0x15, 
-	0x60, 0x08, 0x68, 0xe0, 0x00, 0xc3, 0x18, 0x18, 
-	0xf0, 0x00, 0xf8, 0xc8, 0x21, 0xf3, 0x40, 0x01, 
-	0xe0, 0x10, 0x28, 0x04, 0xd0, 0x13, 0x28, 0x05, 
-	0xd0, 0x11, 0x20, 0x00, 0x21, 0x03, 0x07, 0x09, 
-	0x80, 0x08, 0x68, 0xe0, 0x00, 0xc3, 0x18, 0x18, 
-	0xf0, 0x00, 0xf8, 0xb8, 0x23, 0xf3, 0x40, 0x18, 
-	0x21, 0x04, 0x43, 0x01, 0x68, 0xe0, 0x00, 0xc3, 
-	0x18, 0x18, 0xf0, 0x00, 0xf8, 0x95, 0x68, 0xe0, 
-	0x00, 0x80, 0x50, 0x2f, 0xbc, 0xb0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb0, 
-	0x2e, 0x08, 0x1a, 0xb0, 0x6e, 0x00, 0x11, 0x00, 
-	0xb5, 0x80, 0x21, 0x80, 0x1c, 0x07, 0x20, 0x1f, 
-	0xf0, 0x00, 0xf8, 0x82, 0x21, 0x55, 0x20, 0x02, 
-	0xf0, 0x00, 0xf8, 0x7e, 0x20, 0x02, 0xf0, 0x00, 
-	0xf8, 0x95, 0x28, 0x55, 0xd0, 0x03, 0x20, 0x00, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x33, 
-	0x20, 0x05, 0xf0, 0x00, 0xf8, 0x71, 0x21, 0x33, 
-	0x20, 0x0e, 0xf0, 0x00, 0xf8, 0x6d, 0x21, 0x21, 
-	0x20, 0x17, 0xf0, 0x00, 0xf8, 0x69, 0x21, 0x00, 
-	0x20, 0x01, 0xf0, 0x00, 0xf8, 0x65, 0x21, 0x00, 
-	0x20, 0x0a, 0xf0, 0x00, 0xf8, 0x61, 0x21, 0x01, 
-	0x20, 0x02, 0xf0, 0x00, 0xf8, 0x5d, 0x21, 0x01, 
-	0x20, 0x0b, 0xf0, 0x00, 0xf8, 0x59, 0x21, 0x00, 
-	0x20, 0x03, 0xf0, 0x00, 0xf8, 0x55, 0x21, 0x00, 
-	0x20, 0x0c, 0xf0, 0x00, 0xf8, 0x51, 0x21, 0x00, 
-	0x20, 0x04, 0xf0, 0x00, 0xf8, 0x4d, 0x21, 0x01, 
-	0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x49, 0x21, 0x02, 
-	0x20, 0x1e, 0xf0, 0x00, 0xf8, 0x45, 0x21, 0x04, 
-	0x20, 0x1c, 0xf0, 0x00, 0xf8, 0x41, 0x21, 0x03, 
-	0x20, 0x1b, 0xf0, 0x00, 0xf8, 0x3d, 0x21, 0x01, 
-	0x20, 0x1f, 0xf0, 0x00, 0xf8, 0x39, 0x21, 0x01, 
-	0x20, 0x18, 0xf0, 0x00, 0xf8, 0x35, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x04, 0x20, 0x01, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x00, 0xc3, 
-	0x1c, 0x07, 0x18, 0x18, 0x1c, 0x06, 0xf0, 0x00, 
-	0xf8, 0x41, 0x07, 0xc0, 0x0f, 0xc0, 0x25, 0x01, 
-	0x4c, 0x10, 0x28, 0x00, 0xd0, 0x06, 0x5d, 0xe1, 
-	0x29, 0x00, 0xd0, 0x03, 0x1c, 0x28, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x28, 0x00, 0xd1, 0x01, 
-	0x55, 0xe0, 0xe7, 0xf7, 0x21, 0x80, 0x1c, 0x30, 
-	0xf0, 0x00, 0xf8, 0x12, 0x20, 0x32, 0xf7, 0xfe, 
-	0xfa, 0x95, 0x21, 0x00, 0x1c, 0x30, 0xf0, 0x00, 
-	0xf8, 0x0b, 0x20, 0x32, 0xf7, 0xfe, 0xfa, 0x8e, 
-	0x55, 0xe5, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xb8, 
-	0xb5, 0xb0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0d, 
-	0x0e, 0x2d, 0x24, 0x09, 0xb0, 0x81, 0xab, 0x00, 
-	0x70, 0x1f, 0x70, 0x5d, 0x46, 0x69, 0x22, 0x02, 
-	0x20, 0x80, 0xf7, 0xf4, 0xfa, 0xe6, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x08, 0x1e, 0x60, 0x06, 0x04, 
-	0x0e, 0x24, 0xd1, 0xf0, 0xb0, 0x01, 0xbc, 0xb0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x06, 0x04, 
-	0x0e, 0x24, 0xb0, 0x82, 0x48, 0x1f, 0x68, 0x00, 
-	0x90, 0x00, 0x25, 0x09, 0xab, 0x01, 0x70, 0x1c, 
-	0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 
-	0xb4, 0x04, 0x20, 0x80, 0xa9, 0x02, 0xab, 0x01, 
-	0xf7, 0xf4, 0xfb, 0x22, 0xb0, 0x01, 0xaf, 0x00, 
-	0x78, 0x3f, 0xab, 0x01, 0x70, 0x1c, 0x20, 0xff, 
-	0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 
-	0x20, 0x80, 0xa9, 0x02, 0xab, 0x01, 0xf7, 0xf4, 
-	0xfb, 0x13, 0xb0, 0x01, 0xae, 0x00, 0x78, 0x36, 
-	0xab, 0x01, 0x70, 0x1c, 0x20, 0xff, 0x3b, 0x04, 
-	0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 0x20, 0x80, 
-	0xa9, 0x02, 0xab, 0x01, 0xf7, 0xf4, 0xfb, 0x04, 
-	0xb0, 0x01, 0xa8, 0x00, 0x78, 0x00, 0x42, 0xb7, 
-	0xd1, 0x03, 0x42, 0x87, 0xd1, 0x01, 0x1c, 0x38, 
-	0xe0, 0x04, 0x1e, 0x68, 0x06, 0x05, 0x0e, 0x2d, 
-	0xd1, 0xc8, 0x20, 0xff, 0xb0, 0x02, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0xcc, 0x9c, 
-	0xb5, 0x80, 0x78, 0x01, 0x29, 0x00, 0xd1, 0x1b, 
-	0x78, 0x40, 0x28, 0x00, 0xd0, 0x18, 0x4f, 0x0e, 
-	0x68, 0xf8, 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 
-	0xff, 0xad, 0x21, 0x20, 0x43, 0x01, 0x68, 0xf8, 
-	0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 0xff, 0x8c, 
-	0x68, 0xf8, 0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 
-	0xff, 0xa1, 0x21, 0x40, 0x43, 0x01, 0x68, 0xf8, 
-	0x00, 0xc3, 0x18, 0x18, 0xf7, 0xff, 0xff, 0x80, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0xb0, 0xb5, 0x80, 0x20, 0xe1, 
-	0x01, 0x00, 0xf7, 0xfe, 0xf9, 0xcb, 0x49, 0x1f, 
-	0x60, 0xc8, 0x28, 0x00, 0xd0, 0x0d, 0x27, 0x00, 
-	0x80, 0x4f, 0x70, 0x0f, 0x20, 0x64, 0x80, 0x88, 
-	0x80, 0xcf, 0x21, 0x64, 0x20, 0x00, 0xf0, 0x00, 
-	0xfe, 0x34, 0x20, 0x00, 0x22, 0xff, 0x49, 0x18, 
-	0xe0, 0x08, 0x78, 0x08, 0x23, 0x80, 0x43, 0x18, 
-	0x70, 0x08, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x01, 0x03, 0x18, 0x5b, 
-	0x70, 0x5a, 0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 
-	0x28, 0x0a, 0xdb, 0xf7, 0x20, 0x00, 0x49, 0x0f, 
-	0x22, 0xff, 0x32, 0x01, 0x54, 0x0f, 0x30, 0x01, 
-	0x04, 0x00, 0x0c, 0x00, 0x42, 0x90, 0xdb, 0xf9, 
-	0x20, 0x00, 0x49, 0x0b, 0x54, 0x0f, 0x30, 0x01, 
-	0x04, 0x00, 0x0c, 0x00, 0x42, 0x90, 0xdb, 0xf9, 
-	0x1c, 0x38, 0x49, 0x08, 0x63, 0x8f, 0x60, 0x4f, 
-	0x60, 0x0f, 0x62, 0x0f, 0x61, 0xcf, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, 
-	0x2e, 0x08, 0x8f, 0x90, 0x2e, 0x08, 0x90, 0x7c, 
-	0x2e, 0x08, 0x91, 0x7c, 0x2e, 0x08, 0x90, 0x30, 
-	0xb5, 0x90, 0x27, 0x00, 0x4c, 0x0b, 0x01, 0x38, 
-	0x5c, 0x21, 0x29, 0x00, 0xd0, 0x09, 0x19, 0x00, 
-	0x68, 0x81, 0x29, 0x00, 0xd0, 0x02, 0x88, 0x80, 
-	0xf7, 0xff, 0xfb, 0x8a, 0x1c, 0x38, 0xf0, 0x00, 
-	0xff, 0x83, 0x37, 0x01, 0x2f, 0x0a, 0xdb, 0xee, 
-	0xf0, 0x00, 0xf8, 0x06, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, 
-	0xb5, 0xf0, 0x25, 0x00, 0x4f, 0x1e, 0x88, 0x78, 
-	0x26, 0x00, 0x28, 0x00, 0xdd, 0x2c, 0x00, 0xec, 
-	0x19, 0x64, 0x00, 0xa4, 0x68, 0xf8, 0x19, 0x00, 
-	0x68, 0x80, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfe, 
-	0xf9, 0x7b, 0x68, 0xf8, 0x19, 0x00, 0x60, 0x86, 
-	0x68, 0xf8, 0x19, 0x00, 0x68, 0x40, 0x28, 0x00, 
-	0xd0, 0x04, 0xf7, 0xfe, 0xf9, 0x71, 0x68, 0xf8, 
-	0x19, 0x00, 0x60, 0x46, 0x68, 0xf8, 0x59, 0x00, 
-	0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xf9, 0x68, 
-	0x68, 0xf8, 0x51, 0x06, 0x68, 0xf8, 0x19, 0x00, 
-	0x69, 0x40, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfe, 
-	0xf9, 0x5f, 0x68, 0xf8, 0x19, 0x00, 0x61, 0x46, 
-	0x88, 0x78, 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xd2, 
-	0x68, 0xf8, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfe, 
-	0xf9, 0x53, 0x60, 0xfe, 0x80, 0x7e, 0x80, 0xbe, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x8f, 0x80, 0xb5, 0xf0, 0x06, 0x0d, 
-	0x0e, 0x2d, 0x1c, 0x07, 0x20, 0x02, 0x40, 0x28, 
-	0x26, 0x00, 0x43, 0xf6, 0x24, 0x00, 0x28, 0x00, 
-	0xd0, 0x0d, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x02, 
-	0xf7, 0xfe, 0xf9, 0x3a, 0x60, 0x3c, 0x68, 0x78, 
-	0x28, 0x00, 0xd0, 0x02, 0xf7, 0xfe, 0xf9, 0x34, 
-	0x60, 0x7c, 0x61, 0x7e, 0x61, 0xbe, 0x08, 0x68, 
-	0xd3, 0x0d, 0x69, 0xf8, 0x28, 0x00, 0xd0, 0x02, 
-	0xf7, 0xfe, 0xf9, 0x2a, 0x61, 0xfc, 0x6a, 0x38, 
-	0x28, 0x00, 0xd0, 0x02, 0xf7, 0xfe, 0xf9, 0x24, 
-	0x62, 0x3c, 0x63, 0x3e, 0x63, 0x7e, 0x08, 0xe8, 
-	0xd3, 0x05, 0x6b, 0xb8, 0x28, 0x00, 0xd0, 0x02, 
-	0xf7, 0xfe, 0xf9, 0x1a, 0x63, 0xbc, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x4f, 0x12, 
-	0x88, 0xb8, 0x1d, 0xc1, 0x31, 0x0d, 0x00, 0xca, 
-	0x18, 0x52, 0x00, 0x92, 0x00, 0xc1, 0x18, 0x09, 
-	0x00, 0x89, 0x68, 0xf8, 0xf7, 0xfe, 0xf8, 0xe7, 
-	0x60, 0xf8, 0x28, 0x00, 0xd0, 0x0b, 0x88, 0xb8, 
-	0x1d, 0xc1, 0x31, 0x0d, 0xf0, 0x00, 0xfd, 0x51, 
-	0x88, 0xb8, 0x30, 0x14, 0x80, 0xb8, 0x20, 0x00, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x38, 
-	0x23, 0x80, 0x43, 0x18, 0x70, 0x38, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x06, 0x07, 
-	0x0e, 0x3f, 0x4c, 0x10, 0x2f, 0x11, 0xd1, 0x02, 
-	0x78, 0x20, 0x27, 0x08, 0x40, 0x07, 0xf7, 0xff, 
-	0xff, 0x3b, 0xf7, 0xff, 0xfe, 0xeb, 0x09, 0x38, 
-	0xd3, 0x03, 0x78, 0x20, 0x23, 0x08, 0x43, 0x18, 
-	0x70, 0x20, 0x4b, 0x09, 0x22, 0x00, 0x21, 0x00, 
-	0x20, 0x00, 0xf0, 0x00, 0xfe, 0x4f, 0x4b, 0x07, 
-	0x22, 0x11, 0x21, 0x00, 0x20, 0x42, 0xf0, 0x00, 
-	0xfe, 0x49, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, 
-	0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x27, 0x10, 
-	0x49, 0x0e, 0x78, 0x0a, 0x08, 0x52, 0xd3, 0x01, 
-	0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, 0x70, 0x02, 
-	0x78, 0x0a, 0x08, 0x92, 0xd3, 0x01, 0x22, 0xff, 
-	0xe0, 0x00, 0x22, 0x00, 0x70, 0x42, 0x78, 0x0a, 
-	0x09, 0x52, 0xd3, 0x01, 0x22, 0xff, 0xe0, 0x00, 
-	0x22, 0x00, 0x70, 0x82, 0x78, 0x09, 0x09, 0x89, 
-	0xd3, 0x01, 0x21, 0xff, 0xe0, 0x00, 0x21, 0x00, 
-	0x70, 0xc1, 0x47, 0x70, 0x2e, 0x08, 0x8f, 0x80, 
-	0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xf9, 0x48, 0x03, 
-	0x78, 0x01, 0x23, 0x80, 0x43, 0x19, 0x70, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, 
-	0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x07, 
-	0xb0, 0x81, 0x48, 0x3b, 0x90, 0x00, 0x78, 0x00, 
-	0x23, 0x80, 0x40, 0x18, 0x26, 0x00, 0x43, 0xf6, 
-	0x28, 0x00, 0xd1, 0x04, 0x1c, 0x38, 0xf0, 0x00, 
-	0xfe, 0xd5, 0x1c, 0x04, 0xd5, 0x01, 0x1c, 0x30, 
-	0xe0, 0x61, 0x78, 0x38, 0x4e, 0x33, 0x28, 0x42, 
-	0xd0, 0x45, 0xdc, 0x1c, 0x28, 0x00, 0xd0, 0x25, 
-	0x28, 0x01, 0xd0, 0x57, 0x28, 0x02, 0xd1, 0x55, 
-	0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xe8, 
-	0x28, 0x00, 0xd0, 0x04, 0x01, 0x20, 0x19, 0x80, 
-	0x88, 0x80, 0xf7, 0xff, 0xfa, 0x5d, 0x1c, 0x20, 
-	0xf0, 0x00, 0xfe, 0x56, 0xf0, 0x00, 0xfd, 0x6f, 
-	0x28, 0x00, 0xd1, 0x43, 0xf0, 0x00, 0xfd, 0x6b, 
-	0x28, 0x00, 0xd0, 0xfb, 0xe0, 0x3e, 0x28, 0x4e, 
-	0xd0, 0x38, 0x28, 0x70, 0xd0, 0x1e, 0x28, 0x73, 
-	0xd1, 0x38, 0x1c, 0x38, 0x1c, 0x29, 0xf0, 0x00, 
-	0xfc, 0x37, 0xe0, 0x33, 0x98, 0x00, 0x78, 0x00, 
-	0x08, 0x40, 0xd2, 0x2f, 0x1c, 0x38, 0x1c, 0x29, 
-	0xf0, 0x00, 0xf8, 0x36, 0x28, 0x01, 0xd1, 0x29, 
-	0x01, 0x20, 0x19, 0x80, 0x88, 0x80, 0xf7, 0xff, 
-	0xfa, 0x37, 0xf0, 0x00, 0xfd, 0x4c, 0x28, 0x00, 
-	0xd1, 0x20, 0xf0, 0x00, 0xfd, 0x48, 0x28, 0x00, 
-	0xd0, 0xfb, 0xe0, 0x1b, 0x1c, 0x38, 0x1c, 0x29, 
-	0xf0, 0x00, 0xfb, 0xf6, 0xe0, 0x16, 0x98, 0x00, 
-	0x78, 0x00, 0x09, 0x40, 0xd2, 0x12, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf0, 0x00, 0xf8, 0xd1, 0x28, 0x10, 
-	0xd1, 0x0c, 0x01, 0x20, 0x19, 0x80, 0x88, 0x80, 
-	0xf7, 0xff, 0xfa, 0x1a, 0x1c, 0x20, 0xf0, 0x00, 
-	0xfe, 0x13, 0xe0, 0x03, 0x1c, 0x38, 0x1c, 0x29, 
-	0xf0, 0x00, 0xfb, 0x10, 0x20, 0x00, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x8f, 0x80, 0x2e, 0x08, 0x8f, 0x90, 
-	0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x25, 0x00, 
-	0xb0, 0x85, 0xf7, 0xf3, 0xff, 0xa9, 0x20, 0x08, 
-	0xf7, 0xf3, 0xff, 0xc2, 0x20, 0x04, 0xf7, 0xf3, 
-	0xff, 0xbf, 0x20, 0x0c, 0xf7, 0xf3, 0xff, 0xbc, 
-	0x04, 0x00, 0x0c, 0x00, 0x90, 0x03, 0x20, 0x10, 
-	0xf7, 0xf3, 0xff, 0xb6, 0x4f, 0x4d, 0x81, 0x38, 
-	0x20, 0x02, 0xf7, 0xf3, 0xff, 0xb1, 0x20, 0x05, 
-	0xf7, 0xf3, 0xff, 0xae, 0x06, 0x04, 0x0e, 0x24, 
-	0x20, 0x01, 0xf7, 0xf3, 0xff, 0xa9, 0x20, 0x08, 
-	0xf7, 0xf3, 0xff, 0xa6, 0x06, 0x06, 0x0e, 0x36, 
-	0x20, 0x08, 0xf7, 0xf3, 0xff, 0xa1, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x02, 0x48, 0x42, 0x90, 0x04, 
-	0x5d, 0x80, 0x0a, 0x01, 0xd3, 0x03, 0x06, 0xc0, 
-	0x0e, 0xc0, 0x42, 0xa0, 0xd0, 0x45, 0x20, 0x80, 
-	0x43, 0x20, 0x99, 0x04, 0x55, 0x88, 0x98, 0x03, 
-	0x38, 0x09, 0xd5, 0x00, 0x30, 0x03, 0x10, 0x80, 
-	0x04, 0x00, 0x0c, 0x00, 0x90, 0x01, 0x88, 0x7c, 
-	0x28, 0x00, 0xdd, 0x36, 0x20, 0x10, 0xf7, 0xf3, 
-	0xff, 0x83, 0x04, 0x06, 0x0c, 0x36, 0x20, 0x10, 
-	0xf7, 0xf3, 0xff, 0x7e, 0x04, 0xc1, 0x0c, 0xc9, 
-	0x91, 0x00, 0x2e, 0x00, 0xd0, 0x21, 0x1c, 0x30, 
-	0xf0, 0x00, 0xfb, 0xe0, 0x4b, 0x2f, 0x42, 0x98, 
-	0xd1, 0x10, 0x88, 0xb8, 0x88, 0x79, 0x42, 0x88, 
-	0xd1, 0x05, 0xf7, 0xff, 0xfe, 0xa3, 0x23, 0x01, 
-	0x42, 0xd8, 0xd1, 0x00, 0xe0, 0x49, 0x88, 0x79, 
-	0x31, 0x01, 0x80, 0x79, 0x1c, 0x61, 0x1c, 0x20, 
-	0x04, 0x0c, 0x0c, 0x24, 0x00, 0xc3, 0x18, 0x18, 
-	0x00, 0x80, 0x68, 0xf9, 0x18, 0x09, 0x81, 0xce, 
-	0x99, 0x00, 0x68, 0xfa, 0x18, 0x10, 0x82, 0x01, 
-	0xe0, 0x01, 0x99, 0x00, 0x80, 0xf9, 0x1c, 0x68, 
-	0x04, 0x05, 0x0c, 0x2d, 0x98, 0x01, 0x42, 0x85, 
-	0xdb, 0xc8, 0x98, 0x04, 0x99, 0x02, 0xf0, 0x00, 
-	0xfb, 0xd3, 0x28, 0xff, 0xd1, 0x28, 0x22, 0x00, 
-	0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xfe, 0x0a, 
-	0x04, 0x00, 0x0c, 0x00, 0xf0, 0x00, 0xfd, 0x78, 
-	0x78, 0x38, 0x09, 0x00, 0xd3, 0x16, 0x20, 0x00, 
-	0x88, 0x79, 0x29, 0x00, 0xdd, 0x12, 0x00, 0xc2, 
-	0x18, 0x12, 0x00, 0x92, 0x68, 0xf9, 0x18, 0x89, 
-	0x89, 0xca, 0x89, 0x7b, 0x42, 0x9a, 0xd0, 0x03, 
-	0x7f, 0x0a, 0x23, 0x80, 0x43, 0x1a, 0x77, 0x0a, 
-	0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x88, 0x79, 
-	0x42, 0x81, 0xdc, 0xec, 0x78, 0x38, 0x23, 0x01, 
-	0x43, 0x18, 0x70, 0x38, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x00, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, 
-	0x2e, 0x08, 0x90, 0x7c, 0x00, 0x00, 0xff, 0xff, 
-	0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x25, 0x00, 
-	0xb0, 0x88, 0xf7, 0xf3, 0xfe, 0xf1, 0x20, 0x08, 
-	0xf7, 0xf3, 0xff, 0x0a, 0x20, 0x04, 0xf7, 0xf3, 
-	0xff, 0x07, 0x20, 0x0c, 0xf7, 0xf3, 0xff, 0x04, 
-	0x04, 0x04, 0x0c, 0x24, 0x20, 0x10, 0xf7, 0xf3, 
-	0xfe, 0xff, 0x20, 0x02, 0xf7, 0xf3, 0xfe, 0xfc, 
-	0x20, 0x05, 0xf7, 0xf3, 0xfe, 0xf9, 0x06, 0x06, 
-	0x0e, 0x36, 0x20, 0x01, 0xf7, 0xf3, 0xfe, 0xf4, 
-	0x20, 0x08, 0xf7, 0xf3, 0xfe, 0xf1, 0x06, 0x07, 
-	0x0e, 0x3f, 0x20, 0x08, 0xf7, 0xf3, 0xfe, 0xec, 
-	0x06, 0x01, 0x0e, 0x09, 0x91, 0x04, 0x20, 0x10, 
-	0xf7, 0xf3, 0xfe, 0xe6, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfe, 0xe3, 0x49, 0x4c, 0x91, 0x07, 0x5d, 0xc8, 
-	0x0a, 0x01, 0xd3, 0x05, 0x06, 0xc0, 0x0e, 0xc0, 
-	0x42, 0xb0, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x88, 
-	0x20, 0x80, 0x43, 0x30, 0x99, 0x07, 0x55, 0xc8, 
-	0x4f, 0x45, 0x88, 0x78, 0x90, 0x00, 0x1f, 0xe0, 
-	0x38, 0x05, 0x90, 0x06, 0x28, 0x00, 0xdd, 0x68, 
-	0x48, 0x42, 0x90, 0x05, 0x20, 0x10, 0xf7, 0xf3, 
-	0xfe, 0xc7, 0x04, 0x06, 0x0c, 0x36, 0x20, 0x06, 
-	0xf7, 0xf3, 0xfe, 0xc2, 0x20, 0x06, 0xf7, 0xf3, 
-	0xfe, 0xbf, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x03, 
-	0x2e, 0x00, 0xd1, 0x11, 0x20, 0x0c, 0xf7, 0xf3, 
-	0xfe, 0xb7, 0x04, 0x06, 0x0c, 0x36, 0x24, 0x00, 
-	0x2e, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfe, 0xaf, 0x1c, 0x60, 0x04, 0x04, 0x0c, 0x24, 
-	0x42, 0xb4, 0xdb, 0xf7, 0x19, 0xa8, 0xe0, 0x3e, 
-	0x1c, 0x30, 0xf0, 0x00, 0xfb, 0x0f, 0x1c, 0x04, 
-	0x4b, 0x2f, 0x42, 0x98, 0xd1, 0x18, 0x88, 0xb8, 
-	0x88, 0x79, 0x42, 0x88, 0xd1, 0x05, 0xf7, 0xff, 
-	0xfd, 0xd1, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x00, 
-	0xe0, 0x47, 0x9c, 0x00, 0x00, 0xe1, 0x19, 0x09, 
-	0x00, 0x89, 0x68, 0xf8, 0x18, 0x40, 0x81, 0xc6, 
-	0x88, 0x78, 0x30, 0x01, 0x80, 0x78, 0x98, 0x00, 
-	0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 
-	0x98, 0x03, 0x00, 0xe2, 0x19, 0x12, 0x00, 0x92, 
-	0x68, 0xf9, 0x18, 0x89, 0x77, 0xc8, 0x20, 0x0c, 
-	0xf7, 0xf3, 0xfe, 0x7e, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x02, 0x26, 0x00, 0x28, 0x00, 0xdd, 0x0c, 
-	0x98, 0x05, 0xa9, 0x01, 0x1c, 0x22, 0xf0, 0x00, 
-	0xfb, 0x45, 0xa8, 0x01, 0x88, 0x00, 0x18, 0x30, 
-	0x04, 0x06, 0x0c, 0x36, 0x98, 0x02, 0x42, 0x86, 
-	0xdb, 0xf2, 0x98, 0x02, 0x18, 0x28, 0x30, 0x05, 
-	0x04, 0x05, 0x0c, 0x2d, 0x98, 0x06, 0x42, 0xa8, 
-	0xdc, 0x98, 0x98, 0x07, 0x99, 0x04, 0xf0, 0x00, 
-	0xfa, 0xe7, 0x28, 0xff, 0xd1, 0x82, 0x78, 0x38, 
-	0x23, 0x10, 0x43, 0x18, 0x70, 0x38, 0x78, 0x38, 
-	0x08, 0x81, 0xd3, 0x05, 0x09, 0x41, 0xd3, 0x03, 
-	0x09, 0x00, 0xd2, 0x01, 0xf0, 0x00, 0xfe, 0xd3, 
-	0x20, 0x10, 0xb0, 0x08, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x91, 0x7c, 
-	0x2e, 0x08, 0x8f, 0x80, 0x2e, 0x08, 0x82, 0x80, 
-	0x00, 0x00, 0xff, 0xff, 0x20, 0x00, 0x47, 0x70, 
-	0xb5, 0xf0, 0x04, 0x09, 0x0c, 0x09, 0x22, 0x00, 
-	0xb0, 0x90, 0x92, 0x0c, 0x92, 0x02, 0x92, 0x01, 
-	0xf7, 0xf3, 0xfe, 0x1a, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfe, 0x33, 0x20, 0x04, 0xf7, 0xf3, 0xfe, 0x30, 
-	0x20, 0x0c, 0xf7, 0xf3, 0xfe, 0x2d, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x0d, 0x20, 0x10, 0xf7, 0xf3, 
-	0xfe, 0x27, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0a, 
-	0x20, 0x02, 0xf7, 0xf3, 0xfe, 0x21, 0x20, 0x05, 
-	0xf7, 0xf3, 0xfe, 0x1e, 0x06, 0x03, 0x0e, 0x1b, 
-	0x93, 0x05, 0x20, 0x01, 0xf7, 0xf3, 0xfe, 0x18, 
-	0x06, 0x02, 0x0e, 0x12, 0x92, 0x04, 0x20, 0x08, 
-	0xf7, 0xf3, 0xfe, 0x12, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfe, 0x0f, 0x20, 0x03, 0xf7, 0xf3, 0xfe, 0x0c, 
-	0x20, 0x0d, 0xf7, 0xf3, 0xfe, 0x09, 0x04, 0x07, 
-	0x0c, 0x3f, 0x20, 0x04, 0xf7, 0xf3, 0xfe, 0x04, 
-	0x20, 0x0c, 0xf7, 0xf3, 0xfe, 0x01, 0x04, 0x01, 
-	0x0c, 0x09, 0x91, 0x09, 0x98, 0x0a, 0xf0, 0x00, 
-	0xfd, 0x13, 0x1c, 0x04, 0xd1, 0x01, 0x43, 0xe0, 
-	0xe1, 0x27, 0x7f, 0x20, 0x0a, 0x00, 0xd3, 0x01, 
-	0x20, 0x00, 0xe1, 0x22, 0x84, 0x27, 0x25, 0x00, 
-	0x99, 0x09, 0x4e, 0x92, 0x1d, 0xf7, 0x37, 0xf9, 
-	0x29, 0x00, 0xdd, 0x2a, 0x98, 0x0a, 0xf0, 0x00, 
-	0xfa, 0x51, 0x1c, 0x02, 0x1c, 0x30, 0xa9, 0x06, 
-	0xf0, 0x00, 0xfa, 0xb4, 0x28, 0x09, 0xd1, 0x16, 
-	0x98, 0x02, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, 
-	0x90, 0x01, 0x20, 0x01, 0x70, 0x38, 0x18, 0x28, 
-	0x04, 0x05, 0x0c, 0x2d, 0x20, 0xff, 0x90, 0x02, 
-	0x19, 0x78, 0xaa, 0x06, 0x88, 0x12, 0x1c, 0x31, 
-	0xf0, 0x10, 0xfd, 0x14, 0xa8, 0x06, 0x88, 0x00, 
-	0x18, 0x28, 0x04, 0x05, 0x0c, 0x2d, 0xa9, 0x06, 
-	0x88, 0x09, 0x98, 0x0c, 0x18, 0x40, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x0c, 0x99, 0x09, 0x42, 0x88, 
-	0xdb, 0xd4, 0x48, 0x7b, 0x90, 0x0f, 0x2d, 0x00, 
-	0xd0, 0x0d, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, 
-	0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, 
-	0xfd, 0xac, 0xb0, 0x01, 0x98, 0x0f, 0x1c, 0x39, 
-	0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xc8, 0x20, 0x00, 
-	0x90, 0x0b, 0x98, 0x0d, 0x99, 0x09, 0x1a, 0x40, 
-	0x38, 0x0d, 0x90, 0x0e, 0x28, 0x00, 0xdd, 0x75, 
-	0x20, 0x00, 0x90, 0x00, 0x25, 0x00, 0x20, 0x08, 
-	0xf7, 0xf3, 0xfd, 0x9e, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x03, 0x20, 0x03, 0xf7, 0xf3, 0xfd, 0x98, 
-	0x20, 0x0d, 0xf7, 0xf3, 0xfd, 0x95, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x07, 0x98, 0x03, 0x28, 0x07, 
-	0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x0e, 0x04, 0x04, 0x07, 
-	0x07, 0x0e, 0x0c, 0x00, 0x98, 0x07, 0x82, 0x60, 
-	0xe0, 0x06, 0x99, 0x07, 0x1c, 0x20, 0xf0, 0x00, 
-	0xfd, 0x51, 0xe0, 0x01, 0x20, 0xff, 0x90, 0x00, 
-	0x20, 0x04, 0xf7, 0xf3, 0xfd, 0x79, 0x20, 0x0c, 
-	0xf7, 0xf3, 0xfd, 0x76, 0x04, 0x01, 0x0c, 0x09, 
-	0x91, 0x08, 0x20, 0x00, 0x90, 0x0c, 0x29, 0x00, 
-	0xdd, 0x1c, 0x98, 0x0a, 0xf0, 0x00, 0xf9, 0xd6, 
-	0x1c, 0x02, 0x1c, 0x30, 0xa9, 0x06, 0xf0, 0x00, 
-	0xfa, 0x39, 0x28, 0x09, 0xd0, 0x37, 0x28, 0x0a, 
-	0xd0, 0x44, 0x28, 0x56, 0xd1, 0x04, 0x98, 0x00, 
-	0x28, 0xff, 0xd1, 0x01, 0x98, 0x07, 0x83, 0x60, 
-	0xa9, 0x06, 0x88, 0x09, 0x98, 0x0c, 0x18, 0x40, 
-	0x04, 0x00, 0x0c, 0x00, 0x90, 0x0c, 0x99, 0x08, 
-	0x42, 0x88, 0xdb, 0xe2, 0x98, 0x03, 0x70, 0x38, 
-	0x98, 0x07, 0x12, 0x00, 0x70, 0x78, 0x98, 0x07, 
-	0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, 
-	0x20, 0x01, 0x71, 0x78, 0x2d, 0x00, 0xd0, 0x40, 
-	0x98, 0x02, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, 
-	0x90, 0x02, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, 
-	0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, 
-	0xfd, 0x30, 0xb0, 0x01, 0x1f, 0x68, 0x12, 0x01, 
-	0x70, 0xf9, 0x71, 0x38, 0x98, 0x0f, 0x1c, 0x39, 
-	0x1c, 0x2a, 0xe0, 0x3e, 0xe0, 0x4b, 0x2d, 0x00, 
-	0xd1, 0x00, 0x25, 0x06, 0x19, 0x78, 0xaa, 0x06, 
-	0x88, 0x12, 0x1c, 0x31, 0xf0, 0x10, 0xfc, 0x6a, 
-	0xa8, 0x06, 0x88, 0x00, 0x18, 0x28, 0x04, 0x05, 
-	0x0c, 0x2d, 0xe7, 0xc1, 0x98, 0x03, 0x28, 0x04, 
-	0xd0, 0x02, 0x98, 0x03, 0x28, 0x03, 0xd1, 0xbb, 
-	0x69, 0x60, 0x28, 0x00, 0xd0, 0x09, 0x8b, 0x21, 
-	0x00, 0xc9, 0x18, 0x40, 0x78, 0xb1, 0x38, 0x06, 
-	0x70, 0x81, 0x78, 0x71, 0x70, 0x41, 0x78, 0x31, 
-	0x70, 0x01, 0x22, 0x00, 0x8b, 0x21, 0x00, 0xc9, 
-	0x69, 0x60, 0x18, 0x40, 0x38, 0x20, 0x77, 0x42, 
-	0xe7, 0xa6, 0x98, 0x01, 0x28, 0xff, 0xd1, 0x12, 
-	0x98, 0x02, 0x28, 0x00, 0xd1, 0x0a, 0x20, 0xff, 
-	0x90, 0x02, 0x9a, 0x04, 0xb4, 0x04, 0x21, 0x03, 
-	0x98, 0x10, 0x9a, 0x0b, 0x9b, 0x06, 0xf0, 0x00, 
-	0xfc, 0xec, 0xb0, 0x01, 0x22, 0x05, 0x98, 0x0f, 
-	0x1c, 0x39, 0xf0, 0x00, 0xfd, 0x24, 0x98, 0x0b, 
-	0x99, 0x08, 0x18, 0x40, 0x30, 0x06, 0x04, 0x00, 
-	0x0c, 0x00, 0x90, 0x0b, 0x98, 0x0e, 0x99, 0x0b, 
-	0x42, 0x88, 0xdd, 0x00, 0xe7, 0x3c, 0x7f, 0x20, 
-	0x23, 0x80, 0x43, 0x18, 0x77, 0x20, 0x9a, 0x04, 
-	0x07, 0xd0, 0x0e, 0x80, 0x9b, 0x05, 0x18, 0xc0, 
-	0x77, 0x60, 0x98, 0x02, 0x28, 0xff, 0xd1, 0x03, 
-	0x99, 0x0f, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0x20, 
-	0x20, 0x01, 0xb0, 0x10, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x83, 0x80, 
-	0x2e, 0x08, 0x85, 0x80, 0xb5, 0xf0, 0x04, 0x09, 
-	0x0c, 0x09, 0x22, 0x00, 0xb0, 0x88, 0x92, 0x05, 
-	0xf7, 0xf3, 0xfc, 0xa2, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfc, 0xbb, 0x20, 0x04, 0xf7, 0xf3, 0xfc, 0xb8, 
-	0x20, 0x0c, 0xf7, 0xf3, 0xfc, 0xb5, 0x04, 0x05, 
-	0x0c, 0x2d, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0xb0, 
-	0x04, 0x07, 0x0c, 0x3f, 0x20, 0x02, 0xf7, 0xf3, 
-	0xfc, 0xab, 0x20, 0x05, 0xf7, 0xf3, 0xfc, 0xa8, 
-	0x20, 0x01, 0xf7, 0xf3, 0xfc, 0xa5, 0x06, 0x04, 
-	0x0e, 0x24, 0x20, 0x08, 0xf7, 0xf3, 0xfc, 0xa0, 
-	0x06, 0x06, 0x0e, 0x36, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfc, 0x9b, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x98, 
-	0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x95, 0x20, 0x08, 
-	0xf7, 0xf3, 0xfc, 0x92, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfc, 0x8f, 0x2c, 0x00, 0xd0, 0x65, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0xf4, 0x90, 0x03, 0x4b, 0x44, 
-	0x42, 0x98, 0xd0, 0x5e, 0x48, 0x43, 0x89, 0x41, 
-	0x42, 0xb9, 0xd1, 0x5b, 0x68, 0xc0, 0x9a, 0x03, 
-	0x00, 0xd1, 0x18, 0x89, 0x00, 0x89, 0x18, 0x40, 
-	0x7f, 0x80, 0x4c, 0x3f, 0x1d, 0xe7, 0x37, 0x39, 
-	0x28, 0x04, 0xd0, 0x0b, 0x28, 0x05, 0xd0, 0x09, 
-	0x2e, 0x00, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x04, 
-	0x2e, 0x01, 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x00, 
-	0x20, 0x02, 0x72, 0xb8, 0x2d, 0x0f, 0xdd, 0x61, 
-	0x1f, 0xe8, 0x38, 0x08, 0x90, 0x07, 0x28, 0x00, 
-	0xdd, 0x5c, 0x48, 0x34, 0x90, 0x06, 0x20, 0x10, 
-	0xf7, 0xf3, 0xfc, 0x5e, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x04, 0x20, 0x10, 0xf7, 0xf3, 0xfc, 0x58, 
-	0x20, 0x18, 0xf7, 0xf3, 0xfc, 0x55, 0x90, 0x01, 
-	0x20, 0x18, 0xf7, 0xf3, 0xfc, 0x51, 0x90, 0x00, 
-	0x20, 0x03, 0xf7, 0xf3, 0xfc, 0x4d, 0x20, 0x01, 
-	0xf7, 0xf3, 0xfc, 0x4a, 0x20, 0x0c, 0xf7, 0xf3, 
-	0xfc, 0x47, 0x04, 0x05, 0x0c, 0x2d, 0x98, 0x05, 
-	0x19, 0x40, 0x30, 0x0c, 0x04, 0x00, 0x0c, 0x00, 
-	0x90, 0x05, 0x7a, 0xb8, 0x00, 0xc1, 0x1a, 0x09, 
-	0x00, 0x89, 0x19, 0x09, 0x69, 0x8a, 0x9b, 0x04, 
-	0x42, 0x9a, 0xd0, 0x2b, 0x26, 0x00, 0x28, 0x00, 
-	0xd0, 0x01, 0x28, 0x01, 0xd1, 0x0b, 0x98, 0x01, 
-	0x60, 0xc8, 0x7a, 0xb9, 0x00, 0xcb, 0x1a, 0x59, 
-	0x00, 0x89, 0x19, 0x09, 0x98, 0x00, 0x61, 0x08, 
-	0xe0, 0x05, 0xe0, 0x1f, 0xe0, 0x1e, 0x98, 0x01, 
-	0x63, 0xe0, 0x98, 0x00, 0x64, 0x20, 0x2d, 0x00, 
-	0xdd, 0x14, 0x98, 0x06, 0x9a, 0x03, 0xa9, 0x02, 
-	0xf0, 0x00, 0xf8, 0xec, 0x28, 0x4d, 0xd1, 0x06, 
-	0x7a, 0xb9, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 
-	0x19, 0x09, 0x98, 0x04, 0x61, 0x48, 0xa8, 0x02, 
-	0x88, 0x00, 0x18, 0x30, 0x04, 0x06, 0x0c, 0x36, 
-	0x42, 0xae, 0xdb, 0xea, 0x98, 0x07, 0x99, 0x05, 
-	0x42, 0x88, 0xdc, 0xa4, 0x20, 0x00, 0xb0, 0x08, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x8f, 0x80, 
-	0x2e, 0x08, 0x90, 0x30, 0x2e, 0x08, 0x89, 0x98, 
-	0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0xf7, 0xf3, 
-	0xfb, 0xd7, 0x20, 0x08, 0xf7, 0xf3, 0xfb, 0xf0, 
-	0x20, 0x04, 0xf7, 0xf3, 0xfb, 0xed, 0x20, 0x0c, 
-	0xf7, 0xf3, 0xfb, 0xea, 0x20, 0x10, 0xf7, 0xf3, 
-	0xfb, 0xe7, 0x4f, 0x07, 0x60, 0xf8, 0x20, 0x18, 
-	0xf7, 0xf3, 0xfb, 0xe2, 0x60, 0xb8, 0x48, 0x05, 
-	0x78, 0x01, 0x23, 0x20, 0x43, 0x19, 0x70, 0x01, 
-	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x1a, 0xcc, 0x2e, 0x08, 0x8f, 0x80, 
-	0xb5, 0xb0, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81, 
-	0xf7, 0xf3, 0xfb, 0xb2, 0x20, 0x08, 0xf7, 0xf3, 
-	0xfb, 0xcb, 0x20, 0x04, 0xf7, 0xf3, 0xfb, 0xc8, 
-	0x20, 0x0c, 0xf7, 0xf3, 0xfb, 0xc5, 0x20, 0x10, 
-	0xf7, 0xf3, 0xfb, 0xc2, 0x04, 0x00, 0x0c, 0x00, 
-	0x4f, 0x11, 0x60, 0xf8, 0x20, 0x18, 0xf7, 0xf3, 
-	0xfb, 0xbb, 0x60, 0xb8, 0x20, 0x04, 0xf7, 0xf3, 
-	0xfb, 0xb7, 0x20, 0x0c, 0xf7, 0xf3, 0xfb, 0xb4, 
-	0x04, 0x04, 0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 
-	0xdd, 0x0c, 0x4d, 0x0a, 0x46, 0x69, 0x1c, 0x28, 
-	0x4a, 0x09, 0xf0, 0x00, 0xf8, 0x7b, 0xa8, 0x00, 
-	0x88, 0x00, 0x18, 0x38, 0x04, 0x07, 0x0c, 0x3f, 
-	0x42, 0xa7, 0xdb, 0xf3, 0x20, 0x00, 0xb0, 0x01, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1a, 0xcc, 0x2e, 0x08, 0x8a, 0x98, 
-	0x00, 0x00, 0xff, 0xff, 0xb4, 0x80, 0x04, 0x02, 
-	0x0c, 0x12, 0x20, 0x00, 0x49, 0x0a, 0x88, 0x49, 
-	0x29, 0x00, 0xdd, 0x0d, 0x4b, 0x08, 0x68, 0xdf, 
-	0x00, 0xc3, 0x18, 0x1b, 0x00, 0x9b, 0x18, 0xfb, 
-	0x89, 0xdb, 0x42, 0x93, 0xd0, 0x05, 0x30, 0x01, 
-	0x04, 0x00, 0x0c, 0x00, 0x42, 0x81, 0xdc, 0xf3, 
-	0x48, 0x02, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x8f, 0x80, 0x00, 0x00, 0xff, 0xff, 
-	0xb4, 0x80, 0x06, 0x0a, 0x0e, 0x12, 0x21, 0x00, 
-	0x32, 0x01, 0x2a, 0x00, 0xdd, 0x0a, 0x5c, 0x47, 
-	0x0a, 0x3b, 0xd2, 0x02, 0x20, 0x00, 0xbc, 0x80, 
-	0x47, 0x70, 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 
-	0x42, 0x8a, 0xdc, 0xf4, 0x20, 0xff, 0xbc, 0x80, 
-	0x47, 0x70, 0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, 
-	0x04, 0x0f, 0x0c, 0x3f, 0x42, 0xba, 0xda, 0x29, 
-	0x20, 0x00, 0x49, 0x15, 0x00, 0xd3, 0x18, 0x9b, 
-	0x00, 0x9b, 0x68, 0xcc, 0x18, 0xe4, 0x81, 0xe0, 
-	0x68, 0xcc, 0x18, 0xe4, 0x77, 0x20, 0x68, 0xcc, 
-	0x18, 0xe4, 0x60, 0x60, 0x68, 0xcc, 0x50, 0xe0, 
-	0x68, 0xcc, 0x18, 0xe4, 0x82, 0x20, 0x68, 0xcc, 
-	0x18, 0xe4, 0x60, 0xa0, 0x68, 0xcc, 0x18, 0xe4, 
-	0x81, 0xa0, 0x68, 0xcc, 0x18, 0xe4, 0x61, 0x60, 
-	0x68, 0xcc, 0x18, 0xe4, 0x83, 0x20, 0x68, 0xcc, 
-	0x18, 0xe4, 0x83, 0x60, 0x68, 0xcc, 0x18, 0xe3, 
-	0x82, 0x58, 0x32, 0x01, 0x04, 0x12, 0x0c, 0x12, 
-	0x42, 0xba, 0xdb, 0xd7, 0xbc, 0x90, 0x47, 0x70, 
-	0x2e, 0x08, 0x8f, 0x80, 0xb5, 0xf0, 0x04, 0x15, 
-	0x0c, 0x2d, 0x1c, 0x07, 0x20, 0x08, 0x1c, 0x0c, 
-	0xf7, 0xf3, 0xfb, 0x26, 0x06, 0x06, 0x0e, 0x36, 
-	0x20, 0x08, 0xf7, 0xf3, 0xfb, 0x21, 0x06, 0x01, 
-	0x0e, 0x09, 0x1c, 0x88, 0x80, 0x20, 0x2e, 0x48, 
-	0xd0, 0x42, 0xdc, 0x0c, 0x1e, 0xb0, 0x28, 0x09, 
-	0xd2, 0x61, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x25, 0x2c, 0x5e, 0x5e, 
-	0x5e, 0x5e, 0x33, 0x1e, 0x4f, 0x00, 0x2e, 0x56, 
-	0xd0, 0x4e, 0xdc, 0x0a, 0x2e, 0x4d, 0xd0, 0x36, 
-	0x2e, 0x4e, 0xd1, 0x51, 0x1c, 0x38, 0x1c, 0x2a, 
-	0xf0, 0x00, 0xfd, 0x4c, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x2e, 0x58, 0xd0, 0x32, 0x2e, 0x5d, 
-	0xd1, 0x46, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 
-	0xfc, 0x11, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfb, 0xbc, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 
-	0x1c, 0x2a, 0xf0, 0x00, 0xfb, 0xcd, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 
-	0xf0, 0x00, 0xfb, 0xd8, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 
-	0xfb, 0xe3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfc, 0x00, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 
-	0x1c, 0x2a, 0xf0, 0x00, 0xfc, 0x71, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 
-	0xf0, 0x00, 0xfd, 0x6c, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 
-	0xfd, 0x97, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xb4, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 
-	0x1c, 0x38, 0x1c, 0x2a, 0xf0, 0x00, 0xfd, 0xbe, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0x22, 0x01, 0x20, 0x00, 0xb0, 0x88, 0x4f, 0x35, 
-	0x88, 0x79, 0x25, 0x00, 0x29, 0x00, 0xdd, 0x35, 
-	0x00, 0xc4, 0x18, 0x24, 0x00, 0xa4, 0x68, 0xf9, 
-	0x19, 0x09, 0x7f, 0x0e, 0x0a, 0x33, 0xd2, 0x1d, 
-	0x09, 0xf3, 0xd2, 0x1b, 0x8a, 0x0b, 0x2b, 0x00, 
-	0xd0, 0x18, 0x00, 0xc3, 0x18, 0x18, 0x00, 0x80, 
-	0x68, 0xfa, 0x18, 0x10, 0x8a, 0x02, 0x89, 0xc9, 
-	0x4b, 0x29, 0x20, 0x02, 0xf0, 0x00, 0xf8, 0x52, 
-	0x21, 0x00, 0x43, 0xc9, 0x42, 0x88, 0xd1, 0x01, 
-	0x1c, 0x08, 0xe0, 0x42, 0x68, 0xf8, 0x19, 0x00, 
-	0x7f, 0x01, 0x23, 0x40, 0x43, 0x19, 0x77, 0x01, 
-	0x1c, 0x28, 0xe0, 0x3a, 0x8a, 0x0b, 0x2b, 0x00, 
-	0xd1, 0x02, 0x23, 0xa0, 0x43, 0x33, 0x77, 0x0b, 
-	0x68, 0xf9, 0x19, 0x09, 0x7f, 0x09, 0x0a, 0x09, 
-	0xd2, 0x00, 0x22, 0x00, 0x88, 0x79, 0x30, 0x01, 
-	0x42, 0x81, 0xdc, 0xc9, 0x2a, 0x00, 0xd1, 0x01, 
-	0x20, 0x02, 0xe0, 0x26, 0x78, 0x38, 0x08, 0x81, 
-	0xd2, 0x22, 0x23, 0x02, 0x43, 0x18, 0x70, 0x38, 
-	0x78, 0x38, 0x09, 0x00, 0xd3, 0x02, 0x89, 0x78, 
-	0xf7, 0xfe, 0xfd, 0x1d, 0x20, 0x0c, 0xab, 0x00, 
-	0x70, 0x18, 0x88, 0x78, 0x0a, 0x01, 0x70, 0x59, 
-	0x70, 0x98, 0x46, 0x68, 0x21, 0x20, 0xf7, 0xfd, 
-	0xf9, 0xa7, 0x78, 0x38, 0x08, 0x81, 0xd3, 0x05, 
-	0x09, 0x41, 0xd3, 0x03, 0x09, 0x00, 0xd2, 0x01, 
-	0xf0, 0x00, 0xfa, 0xcd, 0x22, 0x14, 0x21, 0x00, 
-	0x20, 0x70, 0x1c, 0x2b, 0xf0, 0x00, 0xf8, 0x0a, 
-	0x20, 0x01, 0xb0, 0x08, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x80, 
-	0x00, 0x00, 0x13, 0x88, 0xb5, 0xf0, 0x06, 0x04, 
-	0x0e, 0x24, 0x04, 0x08, 0x0c, 0x00, 0xb0, 0x83, 
-	0x90, 0x00, 0x04, 0x10, 0x0c, 0x00, 0x90, 0x01, 
-	0x04, 0x1e, 0x0c, 0x36, 0xb0, 0x89, 0x98, 0x0a, 
-	0xf0, 0x00, 0xf9, 0x28, 0x90, 0x00, 0x23, 0x01, 
-	0x42, 0xd8, 0xd1, 0x00, 0xe0, 0x55, 0x98, 0x00, 
-	0x01, 0x01, 0x91, 0x0b, 0x4f, 0x2b, 0x19, 0xc8, 
-	0x70, 0x44, 0x9a, 0x09, 0x80, 0x42, 0x5c, 0x7a, 
-	0x23, 0x01, 0x43, 0x1a, 0x54, 0x7a, 0x99, 0x0a, 
-	0x80, 0xc1, 0x1c, 0x05, 0x60, 0x86, 0x20, 0x00, 
-	0x21, 0x00, 0x00, 0x42, 0xab, 0x01, 0x52, 0x99, 
-	0x30, 0x01, 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 
-	0xdb, 0xf6, 0x02, 0x20, 0x23, 0xff, 0x43, 0x18, 
-	0xab, 0x01, 0x80, 0x18, 0x2c, 0x02, 0xd0, 0x01, 
-	0x2c, 0x4e, 0xd1, 0x10, 0x20, 0xff, 0x02, 0x00, 
-	0x9a, 0x09, 0x40, 0x10, 0x23, 0xff, 0x43, 0x18, 
-	0xab, 0x01, 0x80, 0x58, 0x9a, 0x09, 0x02, 0x10, 
-	0x23, 0xff, 0x02, 0x1b, 0x40, 0x18, 0x23, 0xff, 
-	0x43, 0x18, 0xab, 0x02, 0x80, 0x18, 0x21, 0x04, 
-	0x98, 0x0a, 0xaa, 0x01, 0xf7, 0xf7, 0xfe, 0x98, 
-	0x04, 0x01, 0x0c, 0x09, 0x81, 0xa9, 0x20, 0x00, 
-	0x43, 0xc0, 0x42, 0x81, 0xd1, 0x07, 0x21, 0x00, 
-	0x9a, 0x0b, 0x54, 0xb9, 0x21, 0xff, 0x70, 0x69, 
-	0x0c, 0x01, 0x81, 0xa9, 0xe0, 0x0d, 0x99, 0x0b, 
-	0x5c, 0x78, 0x23, 0x02, 0x43, 0x18, 0x54, 0x78, 
-	0x2e, 0x00, 0xd0, 0x05, 0x22, 0x02, 0x99, 0x00, 
-	0x1c, 0x30, 0xf7, 0xfe, 0xfb, 0xe0, 0x80, 0xa8, 
-	0x20, 0x00, 0xb0, 0x0c, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, 
-	0xb5, 0xf0, 0x04, 0x00, 0x14, 0x00, 0x01, 0x05, 
-	0x4c, 0x10, 0x5d, 0x60, 0x26, 0x00, 0x28, 0x00, 
-	0xd1, 0x03, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x19, 0x2f, 0x89, 0xb8, 0xf7, 0xf7, 
-	0xff, 0xe3, 0x22, 0x00, 0x43, 0xd2, 0x21, 0xff, 
-	0x42, 0x90, 0xd1, 0x07, 0x55, 0x66, 0x70, 0x79, 
-	0x0c, 0x00, 0x81, 0xb8, 0x1c, 0x10, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x55, 0x66, 0x70, 0x79, 
-	0x1c, 0x30, 0x49, 0x03, 0x81, 0xb9, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x90, 
-	0x00, 0x00, 0xff, 0xff, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x00, 0x47, 0x70, 0xb5, 0xb0, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x1c, 0x07, 0xb0, 0x84, 0xf0, 0x00, 
-	0xf8, 0x2d, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x01, 
-	0x20, 0x01, 0xe0, 0x15, 0x1c, 0x28, 0xf7, 0xfd, 
-	0xf9, 0xb1, 0x1c, 0x04, 0xd0, 0x0f, 0x1c, 0x20, 
-	0x1c, 0x39, 0x1c, 0x2a, 0xf0, 0x10, 0xf8, 0xca, 
-	0x20, 0x06, 0xab, 0x00, 0x80, 0x18, 0x70, 0x9d, 
-	0x94, 0x01, 0x46, 0x69, 0x20, 0x85, 0xf7, 0xfd, 
-	0xf8, 0xeb, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, 
-	0xb0, 0x04, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x06, 0x00, 0x0e, 0x00, 0x28, 0x0a, 0xdd, 0x01, 
-	0x20, 0xff, 0x47, 0x70, 0x01, 0x00, 0x49, 0x02, 
-	0x18, 0x40, 0x78, 0x40, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x8f, 0x90, 0xb4, 0x90, 0x21, 0x00, 
-	0x4b, 0x13, 0x01, 0x0a, 0x5c, 0x9f, 0x2f, 0x00, 
-	0xd0, 0x18, 0x18, 0xd7, 0x78, 0x7c, 0x78, 0x02, 
-	0x42, 0x94, 0xd1, 0x13, 0x2a, 0x00, 0xd0, 0x0e, 
-	0x2a, 0x42, 0xd0, 0x0c, 0x2a, 0x70, 0xd0, 0x0a, 
-	0x2a, 0x73, 0xd0, 0x08, 0x79, 0x02, 0x78, 0xc4, 
-	0x02, 0x24, 0x19, 0x12, 0x04, 0x12, 0x0c, 0x12, 
-	0x88, 0x7f, 0x42, 0x97, 0xd1, 0x02, 0x1c, 0x08, 
-	0xbc, 0x90, 0x47, 0x70, 0x31, 0x01, 0x04, 0x09, 
-	0x14, 0x09, 0x29, 0x0a, 0xd1, 0xdd, 0x20, 0x00, 
-	0x43, 0xc0, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, 
-	0x2e, 0x08, 0x8f, 0x90, 0xb4, 0xb0, 0x06, 0x03, 
-	0x0e, 0x1b, 0x04, 0x0f, 0x0c, 0x3f, 0x06, 0x14, 
-	0x0e, 0x24, 0x20, 0x00, 0x4a, 0x09, 0x01, 0x01, 
-	0x18, 0x89, 0x78, 0x4d, 0x42, 0x9d, 0xd1, 0x04, 
-	0x2c, 0x00, 0xd0, 0x09, 0x88, 0x49, 0x42, 0xb9, 
-	0xd0, 0x06, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, 
-	0x28, 0x0a, 0xd1, 0xf0, 0x20, 0x00, 0x43, 0xc0, 
-	0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x8f, 0x90, 
-	0xb4, 0x80, 0x04, 0x02, 0x0c, 0x12, 0x20, 0x00, 
-	0x49, 0x09, 0x01, 0x03, 0x5c, 0xcf, 0x2f, 0x00, 
-	0xd0, 0x06, 0x18, 0x5b, 0x89, 0x9b, 0x42, 0x93, 
-	0xd1, 0x02, 0x20, 0xff, 0xbc, 0x80, 0x47, 0x70, 
-	0x30, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x28, 0x0a, 
-	0xdb, 0xef, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, 
-	0x2e, 0x08, 0x8f, 0x90, 0x48, 0x0a, 0x21, 0x00, 
-	0x4a, 0x0a, 0x01, 0x0b, 0x5c, 0xd3, 0x2b, 0x00, 
-	0xd1, 0x00, 0x1c, 0x08, 0x31, 0x01, 0x04, 0x09, 
-	0x0c, 0x09, 0x29, 0x0a, 0xdb, 0xf5, 0x4b, 0x04, 
-	0x42, 0x98, 0xd0, 0x02, 0x04, 0x00, 0x14, 0x00, 
-	0x47, 0x70, 0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x8f, 0x90, 
-	0xb4, 0x80, 0x04, 0x07, 0x0c, 0x3f, 0x20, 0x00, 
-	0x49, 0x0b, 0x88, 0x4a, 0x2a, 0x00, 0xdd, 0x10, 
-	0x68, 0xc9, 0x00, 0xc3, 0x18, 0x1b, 0x00, 0x9b, 
-	0x18, 0xcb, 0x89, 0xdb, 0x42, 0xbb, 0xd1, 0x05, 
-	0x00, 0xc3, 0x18, 0x18, 0x00, 0x80, 0x18, 0x08, 
-	0xbc, 0x80, 0x47, 0x70, 0x30, 0x01, 0x42, 0x82, 
-	0xdc, 0xef, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, 
-	0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x06, 0x03, 
-	0x0e, 0x1b, 0x06, 0x0c, 0x0e, 0x24, 0x06, 0x00, 
-	0x0e, 0x00, 0x01, 0x02, 0x48, 0x16, 0x18, 0x11, 
-	0x27, 0x00, 0x2c, 0x0a, 0xd0, 0x0c, 0x2c, 0x0b, 
-	0xd1, 0x06, 0x2b, 0x0a, 0xda, 0x04, 0x54, 0x87, 
-	0x20, 0xff, 0x70, 0x48, 0x48, 0x11, 0x81, 0x88, 
-	0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x2b, 0x0a, 0xda, 0xf9, 0x5c, 0x84, 0x23, 0x02, 
-	0x43, 0x23, 0x54, 0x83, 0x78, 0x48, 0x28, 0x00, 
-	0xd0, 0x0b, 0x28, 0x02, 0xd1, 0xf0, 0x88, 0x48, 
-	0xf7, 0xff, 0xff, 0xba, 0x28, 0x00, 0xd0, 0xeb, 
-	0x7f, 0x01, 0x23, 0x10, 0x43, 0x19, 0x77, 0x01, 
-	0xe7, 0xe6, 0x48, 0x05, 0x78, 0x01, 0x23, 0x40, 
-	0x43, 0x19, 0x70, 0x01, 0xe7, 0xe0, 0x00, 0x00, 
-	0x2e, 0x08, 0x8f, 0x90, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x8f, 0x80, 0xb5, 0x90, 0x04, 0x07, 
-	0x14, 0x3f, 0x2f, 0x0a, 0xda, 0x25, 0x2f, 0x00, 
-	0xdb, 0x23, 0x01, 0x38, 0x49, 0x17, 0x18, 0x44, 
-	0x78, 0x60, 0x28, 0x02, 0xd1, 0x0d, 0x88, 0x60, 
-	0xf7, 0xff, 0xff, 0x96, 0x28, 0x00, 0xd0, 0x08, 
-	0x7f, 0x01, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, 
-	0x77, 0x01, 0x7f, 0x01, 0x23, 0xa0, 0x43, 0x19, 
-	0x77, 0x01, 0x78, 0x60, 0x28, 0x42, 0xd1, 0x09, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xa5, 0x4b, 0x0c, 
-	0x22, 0x11, 0x21, 0x00, 0x20, 0x42, 0xf7, 0xff, 
-	0xfe, 0x2d, 0xe0, 0x02, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfe, 0x9b, 0xf7, 0xff, 0xfd, 0xb4, 0x28, 0x00, 
-	0xd1, 0x03, 0xf7, 0xff, 0xfd, 0xb0, 0x28, 0x00, 
-	0xd0, 0xfb, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x8f, 0x90, 
-	0x00, 0x00, 0x27, 0x10, 0xb5, 0xb0, 0x04, 0x05, 
-	0x0c, 0x2d, 0x24, 0x00, 0x27, 0x00, 0x48, 0x0e, 
-	0x21, 0x07, 0xf7, 0xfe, 0xff, 0x4b, 0x1c, 0x28, 
-	0xf7, 0xff, 0xff, 0x5e, 0x28, 0x00, 0xd0, 0x0e, 
-	0x8a, 0x41, 0x29, 0x00, 0xd0, 0x00, 0x1c, 0x0f, 
-	0x69, 0x40, 0x28, 0x00, 0xd0, 0x03, 0x88, 0x00, 
-	0x42, 0x88, 0xd0, 0x00, 0x1c, 0x04, 0x42, 0xbc, 
-	0xd0, 0x01, 0xf7, 0xf2, 0xf9, 0x27, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x90, 0x30, 0xb5, 0x90, 0x04, 0x0c, 
-	0x0c, 0x24, 0x1c, 0x07, 0x69, 0x40, 0x28, 0x00, 
-	0xd0, 0x06, 0x8b, 0x39, 0x1c, 0x4a, 0x00, 0xd2, 
-	0x00, 0xc9, 0xf7, 0xfd, 0xf8, 0x4c, 0xe0, 0x02, 
-	0x20, 0x08, 0xf7, 0xfd, 0xf8, 0x43, 0x61, 0x78, 
-	0x69, 0x78, 0x28, 0x00, 0xd0, 0x0e, 0x8b, 0x39, 
-	0x31, 0x01, 0x83, 0x39, 0x8b, 0x39, 0x00, 0xc9, 
-	0x18, 0x40, 0x38, 0x40, 0x87, 0x04, 0x21, 0x00, 
-	0x8b, 0x3a, 0x00, 0xd2, 0x69, 0x78, 0x18, 0x80, 
-	0x38, 0x20, 0x76, 0x81, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb4, 0xb0, 0x06, 0x09, 0x0e, 0x09, 
-	0x04, 0x12, 0x0c, 0x12, 0x06, 0x1b, 0x0e, 0x1b, 
-	0x9f, 0x03, 0x06, 0x3c, 0x0e, 0x24, 0x27, 0x9f, 
-	0x70, 0x07, 0x27, 0x80, 0x70, 0x47, 0x27, 0x32, 
-	0x70, 0x87, 0x27, 0x82, 0x70, 0xc7, 0x27, 0x00, 
-	0x71, 0x07, 0x25, 0x06, 0x71, 0x45, 0x71, 0x81, 
-	0x0a, 0x11, 0x71, 0xc1, 0x72, 0x02, 0x08, 0x59, 
-	0x43, 0x21, 0x72, 0x41, 0x72, 0x87, 0x72, 0xc7, 
-	0x1c, 0x38, 0xbc, 0xb0, 0x47, 0x70, 0xb5, 0xb0, 
-	0x04, 0x14, 0x0c, 0x24, 0x1c, 0x07, 0x79, 0x00, 
-	0x02, 0x00, 0x79, 0x7a, 0x43, 0x10, 0x04, 0x05, 
-	0x0c, 0x2d, 0x1d, 0xf8, 0x30, 0x05, 0x1c, 0x22, 
-	0xf0, 0x0f, 0xff, 0x1c, 0x19, 0x28, 0x04, 0x00, 
-	0x0c, 0x00, 0x12, 0x01, 0x71, 0x39, 0x71, 0x78, 
-	0x0a, 0x20, 0x72, 0xb8, 0x72, 0xfc, 0x20, 0x00, 
-	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 
-	0x04, 0x15, 0x0c, 0x2d, 0x1c, 0x07, 0x79, 0x00, 
-	0x02, 0x00, 0x79, 0x7a, 0x43, 0x10, 0x04, 0x04, 
-	0x0c, 0x24, 0x19, 0x38, 0x30, 0x06, 0x1c, 0x2a, 
-	0xf0, 0x0f, 0xff, 0x00, 0x19, 0x60, 0x04, 0x00, 
-	0x0c, 0x00, 0x12, 0x01, 0x71, 0x39, 0x71, 0x78, 
-	0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf3, 0x79, 0x08, 0x02, 0x00, 0x1c, 0x0f, 
-	0x79, 0x49, 0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, 
-	0x25, 0x9f, 0x23, 0x80, 0x22, 0x32, 0x28, 0x80, 
-	0xda, 0x04, 0x24, 0x04, 0x70, 0xbd, 0x70, 0xfb, 
-	0x71, 0x3a, 0xe0, 0x07, 0x28, 0xff, 0xda, 0x07, 
-	0x24, 0x05, 0x70, 0x7d, 0x70, 0xbb, 0x70, 0xfa, 
-	0x21, 0x81, 0x71, 0x39, 0x71, 0x78, 0xe0, 0x00, 
-	0x24, 0x06, 0x19, 0x00, 0x1c, 0x06, 0xf7, 0xfc, 
-	0xff, 0xb5, 0x1c, 0x05, 0xd0, 0x0a, 0x20, 0x06, 
-	0x1b, 0x00, 0x19, 0xc1, 0x1c, 0x28, 0x1c, 0x32, 
-	0xf0, 0x0f, 0xfe, 0xcc, 0x98, 0x00, 0x60, 0x85, 
-	0x98, 0x00, 0x81, 0x86, 0x20, 0x00, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 
-	0xb5, 0xf0, 0x06, 0x12, 0x0e, 0x12, 0xb0, 0x81, 
-	0x92, 0x00, 0x25, 0x00, 0x1c, 0x04, 0x1c, 0x0f, 
-	0x28, 0x00, 0xd0, 0x01, 0x2f, 0x00, 0xd1, 0x01, 
-	0x20, 0x00, 0xe0, 0x34, 0x26, 0x00, 0x1c, 0x20, 
-	0xf0, 0x0f, 0xff, 0x20, 0x28, 0x00, 0xd9, 0x2a, 
-	0x5d, 0xa0, 0x28, 0x80, 0xdb, 0x03, 0x28, 0x9f, 
-	0xdc, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xff, 
-	0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x0f, 0x28, 0x87, 
-	0xd1, 0x01, 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, 
-	0x2a, 0x00, 0xd0, 0x10, 0x29, 0x00, 0xd0, 0x0e, 
-	0x1c, 0x69, 0x04, 0x0a, 0x0c, 0x12, 0x1c, 0x29, 
-	0x54, 0x78, 0x1c, 0x15, 0xe0, 0x07, 0x29, 0x00, 
-	0xd0, 0x05, 0x1c, 0x69, 0x04, 0x09, 0x0c, 0x09, 
-	0x1c, 0x2a, 0x54, 0xb8, 0x1c, 0x0d, 0x1c, 0x70, 
-	0x04, 0x06, 0x0c, 0x36, 0x1c, 0x20, 0xf0, 0x0f, 
-	0xfe, 0xf5, 0x42, 0xb0, 0xd8, 0xd4, 0x20, 0x00, 
-	0x55, 0x78, 0x04, 0x28, 0x14, 0x00, 0xb0, 0x01, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x26, 0x09, 
-	0x70, 0x06, 0x1c, 0x07, 0x70, 0x7d, 0x24, 0x00, 
-	0x2d, 0x00, 0xdd, 0x09, 0x20, 0x08, 0xf7, 0xf2, 
-	0xff, 0x27, 0x19, 0x39, 0x70, 0x88, 0x1c, 0x60, 
-	0x06, 0x04, 0x0e, 0x24, 0x42, 0xac, 0xdb, 0xf5, 
-	0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, 
-	0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, 
-	0xff, 0x13, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 
-	0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x02, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, 
-	0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, 
-	0x20, 0x08, 0xf7, 0xf2, 0xff, 0x01, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, 
-	0x20, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, 
-	0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfe, 0xef, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 
-	0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x08, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, 
-	0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, 
-	0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xdd, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, 
-	0x20, 0x5d, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf0, 0x04, 0x14, 0x0c, 0x24, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfe, 0xce, 0x4f, 0x37, 0x00, 0xe3, 
-	0x19, 0x1c, 0x00, 0xa4, 0x68, 0xf9, 0x19, 0x09, 
-	0x77, 0x88, 0x20, 0x08, 0x1c, 0x26, 0xf7, 0xf2, 
-	0xfe, 0xc3, 0x06, 0x05, 0x0e, 0x2d, 0x68, 0xf8, 
-	0x19, 0x80, 0x68, 0x40, 0x28, 0x00, 0xd0, 0x01, 
-	0xf7, 0xfc, 0xff, 0x06, 0x1c, 0x68, 0xf7, 0xfc, 
-	0xfe, 0xdd, 0x68, 0xf9, 0x19, 0x09, 0x60, 0x48, 
-	0x28, 0x00, 0xd1, 0x0b, 0x26, 0x00, 0x2d, 0x00, 
-	0xdd, 0x1c, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xac, 
-	0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, 
-	0xdb, 0xf7, 0xe0, 0x13, 0x26, 0x00, 0x2d, 0x00, 
-	0xdd, 0x0b, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0xa0, 
-	0x68, 0xf9, 0x19, 0x09, 0x68, 0x49, 0x55, 0x88, 
-	0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, 
-	0xdb, 0xf3, 0x21, 0x00, 0x68, 0xf8, 0x19, 0x00, 
-	0x68, 0x40, 0x55, 0x81, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfe, 0x8f, 0x06, 0x05, 0x0e, 0x2d, 0x68, 0xf8, 
-	0x59, 0x00, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfc, 
-	0xfe, 0xd3, 0x1c, 0x68, 0xf7, 0xfc, 0xfe, 0xaa, 
-	0x68, 0xf9, 0x51, 0x08, 0x28, 0x00, 0xd1, 0x0b, 
-	0x27, 0x00, 0x2d, 0x00, 0xdd, 0x1a, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfe, 0x7a, 0x1c, 0x78, 0x06, 0x07, 
-	0x0e, 0x3f, 0x42, 0xaf, 0xdb, 0xf7, 0xe0, 0x11, 
-	0x26, 0x00, 0x2d, 0x00, 0xdd, 0x0a, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfe, 0x6e, 0x68, 0xf9, 0x59, 0x09, 
-	0x55, 0x88, 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 
-	0x42, 0xae, 0xdb, 0xf4, 0x21, 0x00, 0x68, 0xf8, 
-	0x59, 0x00, 0x55, 0x81, 0x20, 0x48, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x8f, 0x80, 
-	0xb5, 0xf0, 0x04, 0x0d, 0x0c, 0x2d, 0x20, 0x18, 
-	0xf7, 0xf2, 0xfe, 0x56, 0x4f, 0x4e, 0x1d, 0xfc, 
-	0x34, 0x39, 0x7a, 0xa0, 0x28, 0x00, 0xd0, 0x0e, 
-	0x28, 0x01, 0xd0, 0x0c, 0x27, 0x00, 0x1e, 0xec, 
-	0x2c, 0x00, 0xdd, 0x68, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfe, 0x47, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 
-	0x42, 0xbc, 0xdc, 0xf7, 0xe0, 0x84, 0x28, 0x00, 
-	0xd1, 0x01, 0x21, 0x02, 0xe0, 0x00, 0x21, 0x01, 
-	0x1c, 0x38, 0xf7, 0xfe, 0xfd, 0x3b, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfe, 0x36, 0x06, 0x05, 0x0e, 0x2d, 
-	0x1c, 0x68, 0xf7, 0xfc, 0xfe, 0x57, 0x7a, 0xa1, 
-	0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x50, 0x78, 
-	0x28, 0x00, 0xd1, 0x0b, 0x26, 0x00, 0x2d, 0x00, 
-	0xdd, 0x29, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0x24, 
-	0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0x42, 0xae, 
-	0xdb, 0xf7, 0xe0, 0x20, 0x26, 0x00, 0x2d, 0x00, 
-	0xdd, 0x0d, 0x20, 0x08, 0xf7, 0xf2, 0xfe, 0x18, 
-	0x7a, 0xa1, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 
-	0x58, 0x79, 0x55, 0x88, 0x1c, 0x70, 0x06, 0x06, 
-	0x0e, 0x36, 0x42, 0xae, 0xdb, 0xf1, 0x20, 0x00, 
-	0x7a, 0xa1, 0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 
-	0x58, 0x79, 0x55, 0x88, 0x7a, 0xa0, 0x00, 0xc3, 
-	0x1a, 0x18, 0x00, 0x80, 0x58, 0x39, 0x22, 0x00, 
-	0x1c, 0x08, 0xf7, 0xff, 0xfe, 0x81, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfd, 0xfa, 0x06, 0x06, 0x0e, 0x36, 
-	0x1c, 0x70, 0xf7, 0xfc, 0xfe, 0x1b, 0x7a, 0xa1, 
-	0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, 
-	0x60, 0x48, 0x28, 0x00, 0xd1, 0x0c, 0x27, 0x00, 
-	0x2e, 0x00, 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfd, 0xe7, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 
-	0x42, 0xb7, 0xdb, 0xf7, 0xe0, 0x24, 0xe0, 0x23, 
-	0x25, 0x00, 0x2e, 0x00, 0xdd, 0x0e, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfd, 0xda, 0x7a, 0xa1, 0x00, 0xcb, 
-	0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, 0x68, 0x49, 
-	0x55, 0x48, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 
-	0x42, 0xb5, 0xdb, 0xf0, 0x20, 0x00, 0x7a, 0xa1, 
-	0x00, 0xcb, 0x1a, 0x59, 0x00, 0x89, 0x19, 0xc9, 
-	0x68, 0x49, 0x55, 0x48, 0x7a, 0xa0, 0x00, 0xc3, 
-	0x1a, 0x18, 0x00, 0x80, 0x19, 0xc0, 0x68, 0x41, 
-	0x22, 0x00, 0x1c, 0x08, 0xf7, 0xff, 0xfe, 0x40, 
-	0x20, 0x4d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x90, 0x30, 0xb5, 0xf0, 0x1c, 0x07, 
-	0x20, 0x04, 0xb0, 0x81, 0xf7, 0xf2, 0xfd, 0xb0, 
-	0x20, 0x04, 0xf7, 0xf2, 0xfd, 0xad, 0x20, 0x18, 
-	0xf7, 0xf2, 0xfd, 0xaa, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfd, 0xa7, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 
-	0x26, 0x00, 0x28, 0x00, 0xdd, 0x2e, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfd, 0x9e, 0x04, 0x05, 0x0c, 0x2d, 
-	0x24, 0x00, 0x2d, 0x00, 0xdd, 0x08, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfd, 0x96, 0x55, 0x38, 0x1c, 0x60, 
-	0x04, 0x04, 0x0c, 0x24, 0x42, 0xac, 0xdb, 0xf6, 
-	0x20, 0x20, 0x55, 0x78, 0x19, 0x70, 0x06, 0x06, 
-	0x0e, 0x36, 0x20, 0x08, 0xf7, 0xf2, 0xfd, 0x88, 
-	0x04, 0x04, 0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, 
-	0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, 0xfd, 0x80, 
-	0x55, 0x78, 0x1c, 0x68, 0x04, 0x05, 0x0c, 0x2d, 
-	0x42, 0xa5, 0xdb, 0xf6, 0x20, 0x00, 0x55, 0x38, 
-	0x19, 0x30, 0x06, 0x06, 0x0e, 0x36, 0x98, 0x00, 
-	0x42, 0x86, 0xdb, 0xd0, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfd, 0x6f, 0x04, 0x05, 0x0c, 0x2d, 0x24, 0x00, 
-	0x2d, 0x00, 0xdd, 0x08, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfd, 0x67, 0x55, 0x38, 0x1c, 0x60, 0x06, 0x04, 
-	0x0e, 0x24, 0x42, 0xac, 0xdb, 0xf6, 0x20, 0x00, 
-	0x55, 0x78, 0x20, 0x4e, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x04, 0x0c, 
-	0x0c, 0x24, 0x26, 0x00, 0x2c, 0x00, 0xdd, 0x24, 
-	0x4d, 0x14, 0x20, 0x18, 0xf7, 0xf2, 0xfd, 0x50, 
-	0x68, 0x29, 0x42, 0x88, 0xd1, 0x12, 0x20, 0x06, 
-	0xf7, 0xf2, 0xfd, 0x4a, 0x20, 0x01, 0xf7, 0xf2, 
-	0xfd, 0x47, 0x20, 0x01, 0xf7, 0xf2, 0xfd, 0x44, 
-	0x20, 0x10, 0xf7, 0xf2, 0xfd, 0x41, 0x20, 0x28, 
-	0xf7, 0xf2, 0xfd, 0x3e, 0x20, 0x10, 0xf7, 0xf2, 
-	0xfd, 0x3b, 0xe0, 0x08, 0x27, 0x00, 0x20, 0x08, 
-	0xf7, 0xf2, 0xfd, 0x36, 0x1c, 0x78, 0x04, 0x07, 
-	0x0c, 0x3f, 0x2f, 0x0a, 0xdb, 0xf7, 0x42, 0xa6, 
-	0xdb, 0xdb, 0x20, 0x58, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xd0, 
-	0xb5, 0xb0, 0x1c, 0x07, 0x04, 0x08, 0x0c, 0x00, 
-	0x24, 0x00, 0x08, 0x85, 0x2d, 0x00, 0xdd, 0x17, 
-	0x2c, 0x00, 0xd1, 0x0d, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfd, 0x1b, 0x70, 0x38, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfd, 0x17, 0x70, 0x78, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfd, 0x13, 0x70, 0xb8, 0x20, 0x08, 0xe0, 0x00, 
-	0x20, 0x20, 0xf7, 0xf2, 0xfd, 0x0d, 0x1c, 0x60, 
-	0x06, 0x04, 0x0e, 0x24, 0x42, 0xa5, 0xdc, 0xe7, 
-	0x20, 0x0a, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x90, 0x04, 0x0c, 0x0c, 0x24, 0x27, 0x00, 
-	0x2c, 0x00, 0xdd, 0x07, 0x20, 0x08, 0xf7, 0xf2, 
-	0xfc, 0xfb, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 
-	0x42, 0xa7, 0xdb, 0xf7, 0x20, 0x56, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x04, 0x0c, 
-	0x0c, 0x24, 0x27, 0x00, 0x2c, 0x00, 0xdd, 0x07, 
-	0x20, 0x08, 0xf7, 0xf2, 0xfc, 0xe9, 0x1c, 0x78, 
-	0x06, 0x07, 0x0e, 0x3f, 0x42, 0xa7, 0xdb, 0xf7, 
-	0x20, 0xff, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xf7, 0x06, 0x0e, 0x0e, 0x36, 0xb0, 0x83, 
-	0xf0, 0x0c, 0xfc, 0x22, 0x1c, 0x05, 0xd0, 0x05, 
-	0x00, 0xa8, 0x30, 0x0c, 0xf7, 0xf7, 0xf8, 0x5c, 
-	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, 0xc8, 0xb0, 0x01, 0x98, 0x00, 
-	0x60, 0x38, 0x28, 0x00, 0xd0, 0x0b, 0x99, 0x05, 
-	0xf0, 0x0c, 0xfb, 0x9e, 0x28, 0x00, 0xd1, 0x02, 
-	0x60, 0x7d, 0x1c, 0x38, 0xe0, 0x07, 0x68, 0x38, 
-	0xa9, 0x01, 0xf0, 0x0c, 0xf9, 0xe7, 0x1c, 0x20, 
-	0xf7, 0xf7, 0xf8, 0x58, 0x1c, 0x28, 0xb0, 0x03, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0xff, 0x9c, 0x0b, 0x9d, 0x09, 0x9e, 0x0a, 
-	0xb0, 0x8c, 0x4a, 0x78, 0x92, 0x0b, 0x49, 0x78, 
-	0x91, 0x0a, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, 
-	0x00, 0x81, 0x9a, 0x0b, 0x58, 0x51, 0x29, 0x00, 
-	0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x19, 0x30, 0x01, 
-	0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x15, 0x2c, 0x08, 
-	0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0b, 
-	0x58, 0x10, 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 
-	0xe0, 0xcf, 0x23, 0x20, 0x99, 0x0a, 0x5e, 0xcc, 
-	0x1c, 0x60, 0x84, 0x08, 0x99, 0x0a, 0x5e, 0xc8, 
-	0x28, 0x00, 0xd1, 0x02, 0x20, 0x64, 0x99, 0x0a, 
-	0x84, 0x08, 0x2e, 0x00, 0xd0, 0x03, 0x2e, 0x01, 
-	0xd1, 0x03, 0x22, 0x01, 0xe0, 0x02, 0x22, 0x00, 
-	0xe0, 0x00, 0x22, 0x03, 0x92, 0x01, 0x1c, 0x28, 
-	0xf0, 0x08, 0xfd, 0xd3, 0x90, 0x00, 0x00, 0x80, 
-	0x30, 0x80, 0xf7, 0xf6, 0xff, 0xf1, 0x1c, 0x07, 
-	0xd0, 0xdd, 0x98, 0x00, 0x1d, 0xc2, 0x32, 0x79, 
-	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfc, 0x9e, 
-	0x98, 0x00, 0x60, 0xf8, 0x1d, 0xf8, 0x30, 0x79, 
-	0x61, 0x38, 0x98, 0x0e, 0x86, 0x78, 0x98, 0x0f, 
-	0x86, 0xb8, 0x98, 0x0c, 0x90, 0x02, 0x99, 0x0d, 
-	0x91, 0x03, 0x9a, 0x0e, 0x18, 0x80, 0x38, 0x01, 
-	0x90, 0x04, 0x98, 0x0f, 0x18, 0x08, 0x38, 0x01, 
-	0x90, 0x05, 0xa8, 0x02, 0x1c, 0x29, 0xf0, 0x08, 
-	0xfd, 0xb3, 0x61, 0x78, 0x9a, 0x01, 0x2a, 0x00, 
-	0xd0, 0x0e, 0x2a, 0x01, 0xd1, 0x1e, 0x00, 0x80, 
-	0xf7, 0xf6, 0xff, 0xc6, 0x61, 0xb8, 0x28, 0x00, 
-	0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00, 
-	0xf0, 0x0f, 0xfc, 0x74, 0x20, 0x01, 0xe0, 0x0b, 
-	0x00, 0x80, 0xf7, 0xf7, 0xf8, 0x01, 0x61, 0xb8, 
-	0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 
-	0x21, 0x00, 0xf0, 0x0f, 0xfc, 0x67, 0x20, 0x00, 
-	0x86, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, 
-	0x43, 0x18, 0xe0, 0x0d, 0x61, 0xbe, 0x0e, 0x36, 
-	0x06, 0x36, 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xde, 
-	0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, 
-	0x86, 0x38, 0x69, 0xf8, 0x4b, 0x33, 0x40, 0x18, 
-	0x61, 0xf8, 0x69, 0xb8, 0x28, 0x00, 0xd1, 0x06, 
-	0x69, 0x78, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 
-	0xf7, 0xf6, 0xff, 0xb4, 0xe7, 0x7f, 0x68, 0xf8, 
-	0x90, 0x06, 0x69, 0x38, 0x90, 0x07, 0x69, 0x78, 
-	0x90, 0x08, 0x69, 0xb8, 0x90, 0x09, 0xa8, 0x02, 
-	0x1c, 0x21, 0x1d, 0xfa, 0x32, 0x01, 0xb4, 0x07, 
-	0x1c, 0x2a, 0xb4, 0x04, 0x20, 0x00, 0x9a, 0x05, 
-	0xa9, 0x0a, 0xab, 0x0c, 0xf0, 0x03, 0xf8, 0x8a, 
-	0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x5f, 0xe7, 0x63, 0x2d, 0x00, 
-	0xd0, 0x09, 0x2d, 0x01, 0xd0, 0x07, 0x2d, 0x02, 
-	0xd0, 0x05, 0x2d, 0x03, 0xd0, 0x03, 0x23, 0x02, 
-	0x69, 0xf8, 0x43, 0x18, 0x61, 0xf8, 0x85, 0xfc, 
-	0x2c, 0x08, 0xd2, 0x02, 0x00, 0xa0, 0x9a, 0x0b, 
-	0x50, 0x17, 0x20, 0x01, 0x24, 0x00, 0x63, 0xf8, 
-	0x63, 0xbc, 0x85, 0xbd, 0x21, 0x01, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf9, 0x0c, 0x99, 0x0a, 0x8c, 0x88, 
-	0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0xbe, 0x22, 0x00, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x00, 0xf8, 0x93, 0x98, 0x18, 0x60, 0x38, 
-	0x98, 0x18, 0x28, 0x00, 0xd0, 0x06, 0x22, 0x00, 
-	0x21, 0x03, 0x1c, 0x23, 0x9c, 0x18, 0x1c, 0x38, 
-	0xf0, 0x0f, 0xfa, 0xaa, 0x68, 0xb8, 0x60, 0x78, 
-	0x1c, 0x38, 0xb0, 0x0c, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0xdc, 
-	0x2e, 0x08, 0x1a, 0xdc, 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, 0xd1, 0x22, 0x0c, 0x21, 0x00, 0x1c, 0x38, 
-	0xf0, 0x0f, 0xfb, 0xd4, 0x1c, 0x38, 0xf7, 0xf6, 
-	0xff, 0x3d, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x84, 
-	0x28, 0x00, 0xd1, 0x03, 0xb0, 0x04, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x23, 0x00, 
-	0x49, 0x1d, 0x00, 0x82, 0x58, 0x8c, 0x42, 0xbc, 
-	0xd1, 0x00, 0x50, 0x8b, 0x30, 0x01, 0x28, 0x08, 
-	0xdb, 0xf7, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x00, 
-	0xf8, 0xbc, 0x68, 0xf8, 0x90, 0x00, 0x69, 0x38, 
-	0x90, 0x01, 0x69, 0x78, 0x90, 0x02, 0x69, 0xb8, 
-	0x90, 0x03, 0x46, 0x68, 0x1d, 0xc2, 0x32, 0x01, 
-	0x46, 0x69, 0x68, 0xb8, 0xf0, 0x03, 0xfb, 0x0e, 
-	0x6a, 0x38, 0x28, 0x00, 0xd0, 0x03, 0x68, 0x41, 
-	0x39, 0x01, 0x60, 0x41, 0x30, 0x04, 0x69, 0xf8, 
-	0x0c, 0x00, 0xd3, 0x0c, 0x23, 0x30, 0x5e, 0xf8, 
-	0x28, 0x00, 0xd1, 0x03, 0x69, 0xb8, 0xf7, 0xf6, 
-	0xff, 0x31, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, 
-	0x69, 0xb8, 0xf7, 0xf6, 0xfe, 0xfb, 0x22, 0x80, 
-	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x8a, 
-	0x1c, 0x38, 0xf7, 0xf6, 0xfe, 0xf3, 0xe7, 0xbd, 
-	0x2e, 0x08, 0x1a, 0xdc, 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, 0x15, 0x68, 0xb8, 0x1c, 0x21, 0xf0, 0x04, 
-	0xfc, 0xbd, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
-	0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x0a, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
-	0x06, 0x09, 0xd0, 0x02, 0x68, 0x80, 0x21, 0x02, 
-	0xe0, 0x01, 0x68, 0x80, 0x21, 0x00, 0xf0, 0x04, 
-	0xfb, 0xfd, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
-	0x06, 0x09, 0x0e, 0x09, 0x28, 0x00, 0xd0, 0x02, 
-	0x68, 0x80, 0xf0, 0x04, 0xfe, 0x03, 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, 0xdc, 
-	0x2e, 0x08, 0x1a, 0xdc, 0x48, 0x01, 0x23, 0x24, 
-	0x5e, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0xdc, 
-	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, 0x0f, 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, 0x03, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 
-	0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 
-	0x68, 0xb8, 0xf0, 0x04, 0xf8, 0x9b, 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, 0x5f, 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, 0x7d, 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, 0x2b, 0x90, 0x06, 0x00, 0x80, 
-	0x30, 0x10, 0x00, 0x80, 0xf7, 0xf6, 0xfc, 0x48, 
-	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, 0x09, 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, 0x21, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, 
-	0x1c, 0x20, 0xf7, 0xf6, 0xfc, 0x2f, 0x24, 0x00, 
-	0x1c, 0x20, 0xe7, 0xc5, 0x2e, 0x08, 0x1b, 0x04, 
-	0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, 
-	0xd0, 0x1a, 0x20, 0x00, 0xf0, 0x08, 0xf9, 0xdd, 
-	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, 0x0e, 
-	0x22, 0x10, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 
-	0xf8, 0xa1, 0x1c, 0x38, 0xf7, 0xf6, 0xfc, 0x0a, 
-	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, 0x81, 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, 0x1b, 0x04, 
-	0x2e, 0x03, 0x45, 0xb8, 0x29, 0x00, 0xd1, 0x00, 
-	0x49, 0x02, 0x06, 0x40, 0x0e, 0x40, 0x18, 0x40, 
-	0x7a, 0x00, 0x47, 0x70, 0x2e, 0x03, 0x45, 0xb8, 
-	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, 0x1b, 0x04, 
-	0x2e, 0x03, 0x45, 0xb8, 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, 0x1b, 0x04, 0x2e, 0x03, 0x45, 0xb8, 
-	0xb5, 0xf0, 0xb0, 0x83, 0x4a, 0x18, 0x21, 0x00, 
-	0x20, 0xff, 0x30, 0x01, 0xf7, 0xff, 0xfa, 0xac, 
-	0x49, 0x16, 0x27, 0x00, 0x64, 0x08, 0x49, 0x16, 
-	0x91, 0x02, 0x49, 0x16, 0x91, 0x01, 0x49, 0x16, 
-	0x91, 0x00, 0x4c, 0x16, 0x01, 0x38, 0x06, 0x01, 
-	0x0e, 0x09, 0x20, 0x10, 0x1c, 0x22, 0x1c, 0x0d, 
-	0xf7, 0xff, 0xfa, 0x9a, 0x00, 0xbe, 0x99, 0x02, 
-	0x51, 0x88, 0x20, 0x04, 0x1c, 0x29, 0x1c, 0x22, 
-	0xf7, 0xff, 0xfa, 0x92, 0x99, 0x01, 0x51, 0x88, 
-	0x20, 0x02, 0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, 
-	0xfa, 0x8b, 0x99, 0x00, 0x51, 0x88, 0x37, 0x01, 
-	0x2f, 0x08, 0xdb, 0xe3, 0x20, 0x00, 0xb0, 0x03, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x1b, 0x4c, 0x2e, 0x08, 0x1d, 0x0c, 
-	0x2e, 0x08, 0x92, 0xbc, 0x2e, 0x08, 0x92, 0xdc, 
-	0x2e, 0x08, 0x92, 0xfc, 0x2e, 0x08, 0x1b, 0x0c, 
-	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, 0xcc, 0xa0, 
-	0x2e, 0x08, 0x1d, 0x0c, 0x2e, 0x03, 0x03, 0x2c, 
-	0x2e, 0x03, 0x45, 0xb8, 0x2e, 0x08, 0x92, 0x7c, 
-	0xb5, 0x90, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
-	0x29, 0x00, 0xd0, 0x0b, 0x29, 0x0f, 0xdc, 0x09, 
-	0x00, 0x8c, 0x4f, 0x06, 0x59, 0x39, 0x29, 0x00, 
-	0xd0, 0x04, 0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x91, 
-	0x20, 0x00, 0x51, 0x38, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, 
-	0xb5, 0xff, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x10, 
-	0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, 0x04, 0x18, 
-	0x0c, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xd0, 0x01, 
-	0x2d, 0x0f, 0xdd, 0x01, 0x20, 0xff, 0xe0, 0x53, 
-	0x00, 0xaf, 0x4c, 0x2c, 0x59, 0xe0, 0x28, 0x00, 
-	0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd0, 
-	0x98, 0x00, 0x4a, 0x29, 0x40, 0x02, 0x92, 0x00, 
-	0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9a, 0xdd, 0x01, 
-	0x1c, 0x1a, 0x93, 0x00, 0x23, 0x09, 0x01, 0x9b, 
-	0x98, 0x01, 0x42, 0x98, 0xdd, 0x01, 0x1c, 0x1a, 
-	0x93, 0x00, 0x2d, 0x08, 0xda, 0x01, 0x20, 0x00, 
-	0xe0, 0x00, 0x20, 0x01, 0x22, 0x00, 0x21, 0x00, 
-	0xb4, 0x07, 0x9a, 0x06, 0xb4, 0x04, 0x20, 0x00, 
-	0x9a, 0x04, 0x9b, 0x05, 0xf7, 0xff, 0xfa, 0x38, 
-	0x51, 0xe0, 0xb0, 0x04, 0x1c, 0x01, 0xd0, 0xd1, 
-	0x48, 0x18, 0x6c, 0x82, 0x62, 0x4a, 0x21, 0x01, 
-	0x59, 0xe2, 0x63, 0xd1, 0x21, 0x00, 0x43, 0xc9, 
-	0x59, 0xe2, 0x63, 0x91, 0x99, 0x03, 0x29, 0x08, 
-	0xd2, 0x10, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
-	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x06, 0x08, 0x0b, 
-	0x04, 0x06, 0x08, 0x0b, 0x48, 0x0e, 0xe0, 0x02, 
-	0x48, 0x0e, 0xe0, 0x00, 0x48, 0x0e, 0x59, 0xc6, 
-	0xe0, 0x00, 0x6c, 0x06, 0x59, 0xe0, 0x1c, 0x31, 
-	0xf7, 0xff, 0xfb, 0xd6, 0x59, 0xe0, 0x68, 0x80, 
-	0x21, 0x07, 0xf0, 0x04, 0xf9, 0xb3, 0x20, 0x00, 
-	0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, 
-	0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x1d, 0x0c, 
-	0x2e, 0x08, 0x92, 0xfc, 0x2e, 0x08, 0x92, 0xdc, 
-	0x2e, 0x08, 0x92, 0xbc, 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, 0x61, 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, 0x31, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, 
-	0xf0, 0x03, 0xff, 0x00, 0x98, 0x00, 0x28, 0x00, 
-	0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, 
-	0xf0, 0x03, 0xfc, 0x44, 0x20, 0x00, 0xb0, 0x05, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x92, 0x7c, 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, 0x02, 
-	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, 0xe3, 0x59, 0x38, 
-	0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xfe, 0xb2, 
-	0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38, 
-	0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfb, 0xf6, 
-	0x20, 0x00, 0xe7, 0xd5, 0x2e, 0x08, 0x92, 0x7c, 
-	0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x80, 
-	0x49, 0x04, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x03, 
-	0x68, 0x80, 0x21, 0x00, 0xf0, 0x03, 0xfb, 0xe6, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, 
-	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, 0x2c, 0x1c, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x92, 0x7c, 
-	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, 0x92, 0x7c, 
-	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, 0x92, 0x7c, 
-	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, 0x9b, 0x59, 0x78, 
-	0x68, 0x80, 0x1c, 0x21, 0xf0, 0x03, 0xff, 0x42, 
-	0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x92, 0x7c, 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, 0x81, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x92, 0x7c, 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, 0x6d, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x92, 0x7c, 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, 0x13, 0xe7, 0xe1, 
-	0x2e, 0x08, 0x92, 0x7c, 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, 0x92, 0x7c, 
-	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, 0x70, 
-	0x98, 0x03, 0x10, 0x40, 0x90, 0x00, 0x10, 0x6e, 
-	0x1c, 0x28, 0xb0, 0x82, 0xf0, 0x0e, 0xfd, 0x38, 
-	0xf0, 0x0e, 0xfd, 0x74, 0x90, 0x00, 0x91, 0x01, 
-	0x98, 0x05, 0xf0, 0x0e, 0xfd, 0x31, 0xf0, 0x0e, 
-	0xfd, 0x6d, 0x9a, 0x00, 0x9b, 0x01, 0xb0, 0x02, 
-	0xf0, 0x0e, 0xfd, 0x6c, 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, 0x37, 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, 0x11, 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, 0xeb, 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, 0xc2, 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, 0x92, 0x7c, 
-	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, 0x92, 0x7c, 
-	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, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, 
-	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, 0x6c, 0x20, 0x00, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x92, 0x7c, 
-	0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x12, 
-	0x0c, 0x12, 0x1c, 0x1f, 0x28, 0x07, 0xdc, 0x1f, 
-	0x28, 0x01, 0xdb, 0x1d, 0x00, 0x80, 0x4b, 0x10, 
-	0x58, 0x1b, 0x2b, 0x00, 0xd0, 0x18, 0x29, 0x02, 
-	0xd0, 0x0e, 0x29, 0x04, 0xd0, 0x0c, 0x29, 0x10, 
-	0xd0, 0x0a, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 
-	0xd1, 0x0e, 0x06, 0x12, 0x0e, 0x12, 0x1c, 0x39, 
-	0x48, 0x08, 0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, 
-	0x07, 0x12, 0x0f, 0x12, 0x49, 0x06, 0x58, 0x08, 
-	0x68, 0x00, 0x1c, 0x39, 0xf0, 0x0b, 0xfa, 0xf2, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, 
-	0x2e, 0x08, 0x92, 0xbc, 0xb5, 0xf0, 0x04, 0x07, 
-	0x0c, 0x3f, 0x04, 0x10, 0x0c, 0x00, 0x22, 0x00, 
-	0xb0, 0x85, 0x92, 0x00, 0x2f, 0x07, 0xdc, 0x74, 
-	0x2f, 0x01, 0xdb, 0x73, 0x00, 0xbe, 0x4a, 0x3e, 
-	0x59, 0x92, 0x2a, 0x00, 0xd0, 0x6f, 0x04, 0x1a, 
-	0x0c, 0x12, 0x07, 0xd5, 0x0f, 0xed, 0x24, 0x02, 
-	0x40, 0x14, 0x27, 0x04, 0x40, 0x17, 0x23, 0x08, 
-	0x40, 0x1a, 0x92, 0x04, 0x29, 0x02, 0xd0, 0x34, 
-	0x29, 0x04, 0xd0, 0x32, 0x29, 0x10, 0xd0, 0x30, 
-	0x01, 0x5b, 0x42, 0x99, 0xd1, 0x60, 0x06, 0x02, 
-	0x0e, 0x12, 0x46, 0x69, 0x1c, 0x16, 0x48, 0x31, 
-	0x90, 0x01, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, 
-	0xfa, 0xe9, 0x98, 0x00, 0x4b, 0x2e, 0x40, 0x18, 
-	0x90, 0x00, 0x2d, 0x00, 0xd0, 0x02, 0x23, 0x02, 
-	0x43, 0x18, 0x90, 0x00, 0x2c, 0x00, 0xd0, 0x04, 
-	0x23, 0x01, 0x04, 0x5b, 0x98, 0x00, 0x43, 0x18, 
-	0x90, 0x00, 0x2f, 0x00, 0xd0, 0x03, 0x23, 0x01, 
-	0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x9a, 0x04, 
-	0x2a, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x1b, 
-	0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x98, 0x01, 
-	0x99, 0x00, 0x6c, 0x00, 0x68, 0x00, 0x1c, 0x32, 
-	0xe0, 0x30, 0x07, 0x02, 0x0f, 0x12, 0x92, 0x03, 
-	0x48, 0x1c, 0x90, 0x02, 0x59, 0x80, 0x68, 0x00, 
-	0x46, 0x69, 0xf0, 0x0b, 0xfa, 0xbb, 0x98, 0x00, 
-	0x4b, 0x17, 0x40, 0x18, 0x90, 0x00, 0x2d, 0x00, 
-	0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, 0x90, 0x00, 
-	0x2c, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x5b, 
-	0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x2f, 0x00, 
-	0xd0, 0x03, 0x23, 0x01, 0x98, 0x00, 0x43, 0x18, 
-	0x90, 0x00, 0x9a, 0x04, 0x2a, 0x00, 0xd0, 0x04, 
-	0x23, 0x01, 0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, 
-	0x90, 0x00, 0x98, 0x02, 0x9a, 0x03, 0x59, 0x80, 
-	0xe0, 0x02, 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x03, 
-	0x68, 0x00, 0x99, 0x00, 0xf0, 0x0b, 0xfa, 0x62, 
-	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x0c, 
-	0xff, 0xfc, 0xff, 0xfc, 0x2e, 0x08, 0x92, 0xbc, 
-	0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
-	0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0xb0, 0x85, 
-	0xa8, 0x01, 0x49, 0x48, 0xc9, 0x8e, 0xc0, 0x8e, 
-	0x2c, 0x00, 0xd0, 0x07, 0x2c, 0x01, 0xd0, 0x07, 
-	0x2c, 0x02, 0xd0, 0x07, 0x2c, 0x03, 0xd1, 0x74, 
-	0x20, 0x08, 0xe0, 0x04, 0x20, 0x01, 0xe0, 0x02, 
-	0x20, 0x02, 0xe0, 0x00, 0x20, 0x04, 0x90, 0x00, 
-	0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xdc, 0x69, 
-	0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdc, 0x65, 
-	0x1e, 0x68, 0x90, 0x03, 0x1e, 0x70, 0x90, 0x04, 
-	0xa8, 0x01, 0x1c, 0x21, 0xf0, 0x07, 0xfb, 0xe4, 
-	0x4f, 0x37, 0x60, 0x78, 0x00, 0x80, 0x23, 0x01, 
-	0x04, 0x1b, 0x42, 0x98, 0xdc, 0x56, 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, 0x6e, 
-	0x68, 0x38, 0xf7, 0xfe, 0xfe, 0xd2, 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, 0xac, 
-	0x60, 0x38, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x40, 
-	0x69, 0x84, 0x98, 0x00, 0x43, 0x45, 0x1d, 0xe8, 
-	0xd5, 0x00, 0x30, 0x07, 0x10, 0xc0, 0x43, 0x70, 
-	0x1c, 0x01, 0x60, 0x78, 0x20, 0x00, 0x29, 0x00, 
-	0xdd, 0x05, 0x21, 0x00, 0x54, 0x21, 0x68, 0x7a, 
-	0x30, 0x01, 0x42, 0x90, 0xdb, 0xfa, 0x20, 0x01, 
-	0x02, 0x80, 0xf7, 0xf0, 0xff, 0x55, 0x28, 0x00, 
-	0xdb, 0xf9, 0x4d, 0x18, 0x1c, 0x28, 0xf7, 0xf0, 
-	0xff, 0x6f, 0x28, 0x00, 0xdb, 0xfa, 0x68, 0x78, 
-	0x28, 0x00, 0xdd, 0x14, 0x68, 0x78, 0x04, 0x00, 
-	0x0c, 0x00, 0xf7, 0xf0, 0xff, 0x45, 0x28, 0x00, 
-	0xdb, 0xf8, 0x1c, 0x20, 0xf7, 0xf0, 0xff, 0x60, 
-	0x28, 0x00, 0xdb, 0xfa, 0x18, 0x24, 0x68, 0x79, 
-	0x1a, 0x08, 0x60, 0x78, 0x28, 0x00, 0xdc, 0xed, 
-	0xe0, 0x01, 0xe0, 0x0a, 0xe0, 0x09, 0x20, 0x00, 
-	0xf7, 0xf0, 0xff, 0x32, 0x28, 0x00, 0xd1, 0xfa, 
-	0x1c, 0x20, 0xf7, 0xf0, 0xff, 0x4d, 0x28, 0x00, 
-	0xdb, 0xfa, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x03, 0xa7, 0xc4, 
-	0x2e, 0x08, 0x1d, 0x8c, 0x2e, 0x08, 0x93, 0x1c, 
-	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, 0x53, 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, 0x3f, 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, 0x08, 
-	0xb0, 0x0e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x92, 0x7c, 0x2e, 0x08, 0x1d, 0x8c, 
-	0x2e, 0x08, 0x93, 0x1c, 0x2e, 0x08, 0x1d, 0x0c, 
-	0x2e, 0x08, 0x92, 0xbc, 0xb5, 0x80, 0x4f, 0x05, 
-	0x68, 0x38, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xfe, 
-	0xfd, 0xd4, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1d, 0x8c, 
-	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, 0x92, 0x7c, 
-	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, 0x92, 0x7c, 
-	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, 0x13, 0xfc, 0x2a, 
-	0x90, 0x01, 0xf0, 0x13, 0xfc, 0x0d, 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, 0x13, 
-	0xfb, 0x89, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x01, 
-	0xf0, 0x13, 0xfb, 0x68, 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, 0x97, 0x1c, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x3b, 0xa4, 0x2e, 0x08, 0x1d, 0x94, 
-	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, 0xa7, 0xd4, 
-	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, 0x13, 
-	0xfa, 0x67, 0x90, 0x03, 0xf0, 0x13, 0xfa, 0x7e, 
-	0xe0, 0x00, 0xe0, 0x13, 0x90, 0x02, 0xf0, 0x13, 
-	0xfa, 0xdd, 0x1c, 0x04, 0x4b, 0x30, 0x40, 0x1c, 
-	0x1c, 0x20, 0xf0, 0x13, 0xfa, 0xdb, 0x98, 0x02, 
-	0x28, 0x40, 0xd0, 0x01, 0xf0, 0x13, 0xfa, 0xa6, 
-	0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x13, 
-	0xfa, 0x85, 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, 0x13, 0xfa, 0x21, 0x90, 0x03, 
-	0xf0, 0x13, 0xfa, 0x38, 0x90, 0x02, 0xf0, 0x13, 
-	0xfa, 0x99, 0x1c, 0x04, 0x23, 0x01, 0x04, 0x5b, 
-	0x43, 0x1c, 0x1c, 0x20, 0xf0, 0x13, 0xfa, 0x96, 
-	0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x13, 
-	0xfa, 0x61, 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 
-	0xf0, 0x13, 0xfa, 0x40, 0x1c, 0x38, 0xb0, 0x07, 
-	0xe7, 0x34, 0xb0, 0x04, 0xb0, 0x03, 0xe7, 0x31, 
-	0x2e, 0x08, 0x9b, 0x24, 0x2e, 0x08, 0x9b, 0x1c, 
-	0x2e, 0x08, 0x9b, 0x20, 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, 0x9b, 0x28, 
-	0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x40, 
-	0x2e, 0x08, 0x9b, 0x38, 0x2e, 0x08, 0x9b, 0x30, 
-	0x00, 0x40, 0x00, 0x03, 0x2e, 0x08, 0x9b, 0x78, 
-	0x2e, 0x08, 0x9b, 0x7c, 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, 0x9b, 0x3c, 
-	0x2e, 0x08, 0x9b, 0x38, 0x2e, 0x08, 0x9b, 0x30, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0xff, 
-	0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, 
-	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x9b, 0x44, 
-	0xff, 0xff, 0x1f, 0xff, 0x2e, 0x08, 0x9b, 0x98, 
-	0x2e, 0x08, 0x9b, 0x40, 0x00, 0x00, 0x20, 0x01, 
-	0x2e, 0x08, 0x9b, 0x9c, 0x2e, 0x08, 0x9b, 0x68, 
-	0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x80, 
-	0x2e, 0x08, 0x9b, 0xac, 0x2e, 0x08, 0x9b, 0xb0, 
-	0x00, 0x00, 0x20, 0xa0, 0x2e, 0x08, 0xb9, 0xb0, 
-	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, 0x9b, 0x3c, 
-	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, 0x9b, 0x30, 
-	0x2e, 0x08, 0x9b, 0x40, 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, 0x12, 0xfe, 0x1f, 0x20, 0x00, 
-	0x71, 0xb8, 0x20, 0x00, 0xe7, 0xba, 0xe7, 0xb9, 
-	0x2e, 0x08, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x9b, 0x3c, 0x2e, 0x08, 0x9b, 0x38, 
-	0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x9b, 0x2c, 
-	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, 0x9b, 0x58, 
-	0x2e, 0x08, 0x9b, 0x5c, 0x2e, 0x08, 0x9b, 0x60, 
-	0x2e, 0x08, 0x9b, 0x64, 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, 0x9b, 0xa0, 
-	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, 0x9b, 0x3c, 0x00, 0x00, 0x80, 0x0f, 
-	0xcc, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x84, 0x80, 
-	0x66, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfd, 0xff, 
-	0x2e, 0x08, 0x9b, 0x30, 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, 0x9b, 0x3c, 0x00, 0x00, 0xff, 0xff, 
-	0x00, 0x01, 0xd4, 0xc0, 0x2e, 0x08, 0x9b, 0x38, 
-	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, 0x12, 
-	0xfc, 0xc3, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, 
-	0x20, 0x01, 0xf0, 0x00, 0xfb, 0x6d, 0x2c, 0x80, 
-	0xd0, 0x01, 0xf0, 0x12, 0xfc, 0xef, 0x98, 0x00, 
-	0x21, 0x80, 0x68, 0x49, 0x60, 0x08, 0x48, 0x09, 
-	0x68, 0x00, 0x70, 0x05, 0xe0, 0x0b, 0xf0, 0x12, 
-	0xfc, 0xaf, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, 
-	0x20, 0x02, 0xf0, 0x00, 0xfb, 0x59, 0x2c, 0x80, 
-	0xd0, 0x01, 0xf0, 0x12, 0xfc, 0xdb, 0x20, 0x00, 
-	0xe7, 0xd3, 0xe7, 0xd2, 0x2e, 0x08, 0x9b, 0x88, 
-	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, 0x12, 0xfc, 0x74, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, 
-	0x20, 0x02, 0xf0, 0x00, 0xfb, 0x1d, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x12, 0xfc, 0x9f, 0xe0, 0x13, 
-	0xf0, 0x12, 0xfc, 0x66, 0x1c, 0x05, 0x1c, 0x21, 
-	0x22, 0x01, 0x02, 0x92, 0x20, 0x01, 0xf0, 0x00, 
-	0xfb, 0x0f, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x12, 
-	0xfc, 0x91, 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, 0x9b, 0x30, 
-	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, 0x12, 0xfc, 0x0e, 0x1c, 0x06, 0x1c, 0x22, 
-	0x1c, 0x39, 0x20, 0x01, 0xf0, 0x00, 0xfa, 0xb8, 
-	0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x12, 0xfc, 0x3a, 
-	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, 0x12, 0xfb, 0xe8, 
-	0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x02, 
-	0xf0, 0x00, 0xfa, 0x92, 0x2e, 0x80, 0xd0, 0x01, 
-	0xf0, 0x12, 0xfc, 0x14, 0xe7, 0xde, 0x20, 0x00, 
-	0xb0, 0x02, 0xe7, 0x9f, 0xb0, 0x02, 0xe7, 0x9d, 
-	0x2e, 0x08, 0x9b, 0x7c, 0x00, 0x00, 0xbf, 0xff, 
-	0xb5, 0x80, 0x1c, 0x07, 0x48, 0x07, 0x68, 0x01, 
-	0x20, 0x00, 0xf0, 0x1b, 0xfa, 0xad, 0x60, 0x38, 
-	0x48, 0x04, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, 
-	0xf0, 0x1b, 0xfa, 0xa6, 0x60, 0x78, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x9b, 0x7c, 
-	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, 0x12, 0xfb, 0xa8, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, 
-	0x20, 0x02, 0xf0, 0x00, 0xfa, 0x51, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x12, 0xfb, 0xd3, 0xe0, 0x16, 
-	0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, 
-	0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, 
-	0x68, 0x09, 0x71, 0x08, 0xf0, 0x12, 0xfb, 0x90, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, 
-	0x20, 0x01, 0xf0, 0x00, 0xfa, 0x39, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x12, 0xfb, 0xbb, 0x20, 0x00, 
-	0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x9b, 0x80, 
-	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, 0x12, 0xfb, 0x68, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, 
-	0x20, 0x02, 0xf0, 0x00, 0xfa, 0x11, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x12, 0xfb, 0x93, 0xe0, 0x16, 
-	0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, 
-	0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, 
-	0x68, 0x09, 0x71, 0x08, 0xf0, 0x12, 0xfb, 0x50, 
-	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, 
-	0x20, 0x01, 0xf0, 0x00, 0xf9, 0xf9, 0x2d, 0x80, 
-	0xd0, 0x01, 0xf0, 0x12, 0xfb, 0x7b, 0x20, 0x00, 
-	0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x9b, 0x84, 
-	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, 0x9b, 0x34, 
-	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, 0x9b, 0x34, 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, 0x9b, 0x3c, 0xff, 0xff, 0xdf, 0xe1, 
-	0x20, 0xff, 0x49, 0x02, 0x68, 0x09, 0x70, 0x08, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x98, 
-	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, 0x9b, 0xa4, 
-	0xb5, 0x80, 0x1c, 0x07, 0x48, 0x05, 0x68, 0x00, 
-	0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 0xf0, 0x1b, 
-	0xf8, 0x37, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0x7c, 
-	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, 0x9b, 0xa8, 
-	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, 0x1a, 
-	0xff, 0xb7, 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, 0x1a, 0xfe, 0xdc, 
-	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, 0xa8, 0xc8, 
-	0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, 
-	0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xbb, 0x00, 0x2e, 0x08, 0xba, 0x28, 
-	0x2e, 0x08, 0x9b, 0xb8, 0x00, 0x00, 0x02, 0xcf, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0xd1, 0xf4, 
-	0x2e, 0x08, 0xbb, 0x20, 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, 0x1a, 0xfd, 0x58, 
-	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, 0xbb, 0x20, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x24, 
-	0x2e, 0x08, 0xba, 0x2c, 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, 0x1a, 
-	0xfc, 0x5b, 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, 0x1a, 0xfb, 0x40, 
-	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, 0xa8, 0x78, 
-	0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0x9d, 0xf0, 
-	0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 
-	0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0xba, 0x28, 
-	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0xbb, 0x00, 
-	0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0xd1, 0xf4, 
-	0x2e, 0x08, 0xbb, 0x20, 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, 0x1a, 0xfa, 0xd2, 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, 0xbb, 0x20, 0x2e, 0x08, 0xd1, 0xf4, 
-	0x2e, 0x08, 0xbb, 0x24, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0x9b, 0xb8, 0x2e, 0x08, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 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, 0x1a, 
-	0xf9, 0xf3, 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, 0x1a, 0xf9, 0x2c, 
-	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, 0x1a, 0xf8, 0xc6, 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, 0x1a, 0xf8, 0xa0, 
-	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, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, 
-	0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xbb, 0x00, 0xcc, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0xba, 0x28, 0x3f, 0xff, 0xff, 0xff, 
-	0x2e, 0x08, 0x9b, 0xb8, 0x68, 0x00, 0x04, 0x00, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xbb, 0x24, 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, 0x19, 0xff, 0xba, 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, 0xbb, 0x20, 0x2e, 0x08, 0xd1, 0xf4, 
-	0x2e, 0x08, 0xbb, 0x24, 0x2e, 0x08, 0xba, 0x2c, 
-	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, 0x19, 0xff, 0x38, 
-	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, 0x19, 0xfe, 0xa0, 
-	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, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x2e, 0x08, 0xba, 0x28, 0x2e, 0x08, 0xbb, 0x00, 
-	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, 0xb9, 0xc4, 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, 0xb9, 0xc4, 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, 0x19, 0xfd, 0x5d, 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, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, 
-	0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, 
-	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, 0x9d, 0xf0, 
-	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, 0xba, 0x38, 0x68, 0x00, 0x0d, 0x40, 
-	0x2e, 0x08, 0xbb, 0x00, 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, 0x19, 0xfb, 0xbd, 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, 0x19, 0xfb, 0x75, 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, 0x19, 
-	0xfa, 0x77, 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, 0x19, 
-	0xfa, 0x4b, 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, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, 
-	0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xbb, 0x24, 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, 0x19, 0xf9, 0x52, 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, 0xbb, 0x20, 0x00, 0x00, 0x04, 0xcc, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x24, 
-	0x2e, 0x08, 0xba, 0x2c, 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, 0x19, 
-	0xf9, 0x0b, 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, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x2c, 
-	0x2e, 0x08, 0xb9, 0xc4, 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, 0x19, 0xf8, 0xb4, 
-	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, 0x19, 
-	0xf8, 0x77, 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, 0x19, 0xf8, 0x5e, 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, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xbb, 0x24, 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, 0x19, 0xf8, 0x08, 
-	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, 0x18, 
-	0xff, 0xcb, 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, 0x18, 0xff, 0xb2, 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, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xbb, 0x24, 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, 0x18, 0xff, 0x50, 
-	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, 0x18, 0xff, 0x11, 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, 0x18, 0xfe, 0xf8, 
-	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, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xbb, 0x24, 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, 0x18, 0xfe, 0x91, 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, 0x18, 0xfe, 0x52, 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, 0x18, 0xfe, 0x39, 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, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xbb, 0x24, 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, 0xa8, 0xc8, 
-	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, 0x18, 0xfd, 0x16, 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, 0x18, 0xfc, 0xe1, 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, 0x18, 0xfc, 0xc8, 
-	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, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x68, 0x00, 0x0c, 0x04, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xbb, 0x24, 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, 0xb9, 0xc4, 
-	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, 0x9b, 0xbc, 
-	0x2e, 0x08, 0xb9, 0x88, 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, 0xb9, 0x88, 0x2e, 0x08, 0x9b, 0xbc, 
-	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, 0x9b, 0x40, 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, 0x9b, 0xbc, 
-	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, 0xa8, 0x70, 0x2e, 0x08, 0xb9, 0x88, 
-	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, 0x9b, 0xc0, 
-	0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x9b, 0xc4, 
-	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, 0x9b, 0xc0, 
-	0x1c, 0x02, 0x1c, 0x0b, 0x48, 0x03, 0x68, 0x00, 
-	0x60, 0x02, 0x48, 0x02, 0x68, 0x00, 0x60, 0x43, 
-	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x9b, 0xc0, 
-	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, 0x9b, 0xb0, 
-	0x2e, 0x08, 0x9b, 0x9c, 0x2e, 0x08, 0x9b, 0x3c, 
-	0x2e, 0x08, 0x1f, 0x98, 0x66, 0x00, 0x00, 0x80, 
-	0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x9b, 0x98, 
-	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, 0x98, 
-	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, 0x9b, 0xb0, 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, 0x9b, 0xc8, 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, 0x9b, 0xc8, 
-	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, 0x9b, 0x38, 
-	0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9c, 0x48, 
-	0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9d, 0x10, 
-	0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, 
-	0x2e, 0x08, 0xb9, 0x60, 0x64, 0x00, 0x00, 0x18, 
-	0x2e, 0x08, 0x9c, 0x4c, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x30, 
-	0x2e, 0x08, 0x9b, 0x30, 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, 0x9b, 0x38, 
-	0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9c, 0x50, 
-	0x64, 0x00, 0x08, 0x08, 0x2e, 0x08, 0x9d, 0x10, 
-	0x2e, 0x08, 0x9c, 0x48, 0x2e, 0x08, 0xb9, 0x60, 
-	0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x9b, 0x30, 
-	0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x30, 
-	0x2e, 0x08, 0x9c, 0x4c, 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, 0x9b, 0xc8, 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, 0x9d, 0xfc, 0x9e, 0x00, 0x04, 0x80, 
-	0x9e, 0x00, 0x04, 0x90, 0x2e, 0x08, 0xa6, 0xfc, 
-	0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x9d, 0x30, 
-	0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9d, 0x10, 
-	0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9b, 0xc8, 
-	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, 0x9b, 0xc8, 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, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, 
-	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, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x30, 
-	0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9c, 0x48, 
-	0x2e, 0x08, 0x9d, 0x10, 0x2e, 0x08, 0x9d, 0x30, 
-	0x2e, 0x08, 0x9c, 0xd0, 0x2e, 0x08, 0x9c, 0x4c, 
-	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, 0x9b, 0x30, 
-	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, 0x9d, 0xfc, 
-	0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0xa6, 0xfc, 
-	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, 0x0d, 
-	0xfd, 0xef, 0x20, 0xff, 0x30, 0x01, 0x49, 0x02, 
-	0x61, 0xc8, 0x20, 0x00, 0xe7, 0xc0, 0xe7, 0xbf, 
-	0x2e, 0x08, 0x1f, 0x9c, 0xff, 0xff, 0xfd, 0xff, 
-	0x2e, 0x01, 0x5f, 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, 0x9c, 0x48, 0x03, 0x6e, 0x80, 
-	0x68, 0x00, 0x07, 0x40, 0x0f, 0xc0, 0x47, 0x70, 
-	0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x9c, 
-	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, 0x9c, 
-	0x2e, 0x08, 0x9d, 0xc0, 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, 0x0d, 0xfc, 0xd0, 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, 0x0d, 
-	0xfc, 0x6d, 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, 0x0d, 0xfc, 0x16, 
-	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, 0x0d, 0xfb, 0xc2, 
-	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, 0x9c, 
-	0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff, 
-	0x2e, 0x08, 0x9d, 0xc0, 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, 0x0d, 0xfb, 0x0f, 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, 0x0d, 0xfa, 0xbf, 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, 0x0d, 0xfa, 0x54, 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, 0x9c, 0xff, 0xff, 0xef, 0xff, 
-	0x2e, 0x08, 0x9d, 0xc0, 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, 0xc4, 0x2e, 0x08, 0x1f, 0x9c, 
-	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, 0x9d, 0xe8, 
-	0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, 
-	0x2e, 0x08, 0x9d, 0xe4, 0x2e, 0x08, 0x20, 0x1c, 
-	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, 0x9d, 0xdc, 
-	0x2e, 0x08, 0x9d, 0xd8, 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, 0xb9, 0x88, 
-	0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0xd2, 0x10, 
-	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, 0x9d, 0xe0, 
-	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, 0xba, 0x28, 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, 0xba, 0x30, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xbb, 0x00, 
-	0x2e, 0x08, 0xba, 0x38, 0x68, 0x00, 0x0d, 0x00, 
-	0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x2e, 0x08, 0xba, 0x28, 0x00, 0x00, 0x02, 0x3f, 
-	0x2e, 0x08, 0x9d, 0xec, 0x2e, 0x08, 0xbb, 0x0c, 
-	0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x9d, 0xf0, 
-	0x00, 0xf0, 0x29, 0x6d, 0x3f, 0xff, 0xff, 0xff, 
-	0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xeb, 0x80, 
-	0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0x9b, 0xb8, 
-	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, 0x9d, 0xec, 
-	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, 0xa8, 0x78, 
-	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, 0xb9, 0xc4, 
-	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, 0x9d, 0xec, 0x2e, 0x08, 0xbb, 0x0c, 
-	0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0xba, 0x28, 
-	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, 0x14, 
-	0xff, 0x47, 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, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x2c, 0x2e, 0x08, 0xb9, 0xc4, 
-	0x2e, 0x08, 0xba, 0x28, 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, 0x9d, 0xec, 
-	0x2e, 0x08, 0xba, 0x28, 0xcc, 0x00, 0x02, 0x00, 
-	0x2e, 0x08, 0xbb, 0x0c, 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, 0xb0, 0x58, 
-	0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0xaf, 0xfc, 
-	0x2e, 0x08, 0xb0, 0x08, 0x9e, 0x00, 0x04, 0x80, 
-	0x2e, 0x08, 0x9d, 0xfc, 0x2e, 0x08, 0xa6, 0xfc, 
-	0x9e, 0x00, 0x04, 0xa0, 0x2e, 0x08, 0x9c, 0x48, 
-	0x2e, 0x08, 0x9c, 0x4c, 0x2e, 0x08, 0x9c, 0x50, 
-	0x2e, 0x08, 0x9d, 0x10, 0x64, 0x00, 0x08, 0x00, 
-	0x64, 0x00, 0x10, 0x00, 0x2e, 0x08, 0xb9, 0x60, 
-	0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x9c, 0xd0, 
-	0x2e, 0x08, 0x9d, 0x30, 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, 0x9b, 0xc8, 
-	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, 0x9b, 0xc8, 
-	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, 0x9b, 0xc8, 0x2e, 0x08, 0x9d, 0xf4, 
-	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, 0x9b, 0xc8, 
-	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, 0x9b, 0xc8, 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, 0x9b, 0xc8, 0x2e, 0x08, 0x9b, 0x38, 
-	0x2e, 0x08, 0x9b, 0x30, 0x2e, 0x08, 0x9d, 0x10, 
-	0x2e, 0x08, 0x9c, 0x50, 0x2e, 0x08, 0x9d, 0x30, 
-	0x2e, 0x08, 0x9c, 0xd0, 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, 0x9b, 0xc8, 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, 0x9b, 0xc8, 
-	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, 0x9b, 0x30, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0x9b, 0xc8, 0x2e, 0x08, 0x9d, 0x10, 
-	0x2e, 0x08, 0x9c, 0x48, 0x2e, 0x08, 0x9c, 0x50, 
-	0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x9c, 0xd0, 
-	0x2e, 0x08, 0x9c, 0x4c, 0x2e, 0x08, 0x9d, 0x30, 
-	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, 0xb9, 0x80, 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, 0x0a, 0xff, 0x04, 
-	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, 0x20, 0x20, 0x2e, 0x01, 0x8b, 0x35, 
-	0x2e, 0x08, 0xb9, 0x80, 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, 0xb9, 0x84, 
-	0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x9b, 0x78, 
-	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x9b, 0x30, 
-	0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 
-	0xff, 0xff, 0xfe, 0xff, 0xb5, 0x80, 0x1c, 0x07, 
-	0x48, 0x17, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x13, 
-	0xfc, 0xa3, 0x60, 0x38, 0x48, 0x14, 0x68, 0x00, 
-	0x1d, 0x01, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x9c, 
-	0x60, 0x78, 0x48, 0x11, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x05, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x94, 
-	0x60, 0xf8, 0x48, 0x0d, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x09, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x8c, 
-	0x61, 0x38, 0x48, 0x09, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x0d, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x84, 
-	0x61, 0x78, 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, 
-	0x31, 0x01, 0x20, 0x00, 0xf0, 0x13, 0xfc, 0x7c, 
-	0x60, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x9b, 0x78, 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, 0xb9, 0x88, 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, 0x90, 
-	0x2e, 0x08, 0x21, 0x10, 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, 0x9b, 0xc8, 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, 0x9b, 0xc8, 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, 0x20, 0x24, 
-	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, 0x12, 0xff, 0xa4, 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, 0x20, 0x28, 
-	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, 0x12, 0xff, 0x42, 0xf0, 0x12, 0xff, 0x1e, 
-	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, 0x12, 0xff, 0x14, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, 
-	0x2e, 0x08, 0x20, 0x28, 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, 0x12, 0xfe, 0xc0, 
-	0xf0, 0x12, 0xfe, 0x9c, 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, 0x12, 0xfe, 0x73, 0x48, 0x0a, 
-	0x6b, 0x81, 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0xf0, 
-	0x9b, 0x04, 0x60, 0x18, 0xf0, 0x12, 0xfe, 0x8c, 
-	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 
-	0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, 
-	0x2e, 0x08, 0x20, 0x28, 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, 0x12, 
-	0xfe, 0x27, 0xf0, 0x12, 0xfe, 0x03, 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, 0x12, 0xfd, 0xf4, 
-	0x20, 0x00, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xb0, 0x03, 0xe7, 0xf9, 
-	0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, 
-	0x2e, 0x08, 0x20, 0x28, 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, 0x12, 0xfd, 0x90, 
-	0xf0, 0x12, 0xfd, 0x6c, 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, 0x12, 0xfd, 0x51, 0x20, 0x00, 
-	0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, 
-	0x2e, 0x03, 0xa8, 0x78, 0x2e, 0x03, 0xa8, 0xc8, 
-	0x2e, 0x08, 0x20, 0x28, 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, 0x12, 0xfc, 0xd4, 
-	0xf0, 0x12, 0xfc, 0xb0, 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, 0x12, 
-	0xfc, 0x8f, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x02, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, 
-	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0xa8, 0x78, 
-	0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0x20, 0x28, 
-	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, 0xa8, 0xc8, 
-	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, 0xa8, 0xc8, 
-	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, 0x12, 0xf9, 0xd5, 0xf0, 0x12, 
-	0xf9, 0xb1, 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, 0x12, 
-	0xf9, 0x03, 0x20, 0x00, 0xb0, 0x0f, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x0e, 
-	0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0xa8, 0x78, 
-	0x2e, 0x03, 0xa8, 0xc8, 0x2e, 0x08, 0x20, 0x28, 
-	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, 0xa8, 0x78, 
-	0x2e, 0x08, 0x20, 0x28, 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, 0x20, 0x28, 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, 0x20, 0x28, 0x2e, 0x08, 0x20, 0x2c, 
-	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, 0x08, 0xff, 0x9f, 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, 0x08, 
-	0xff, 0x85, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x6e, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0xb9, 0x98, 
-	0x2e, 0x08, 0xb9, 0x9c, 0x2e, 0x08, 0xb9, 0xa0, 
-	0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0xb9, 0xa4, 
-	0x2e, 0x08, 0xb9, 0xa8, 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, 0x08, 0xff, 0x76, 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, 0xa9, 0xed, 0x2e, 0x08, 0xb9, 0x9c, 
-	0x2e, 0x08, 0xb9, 0x98, 0x2e, 0x08, 0xb9, 0xa0, 
-	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, 0x08, 0xff, 0x51, 0x48, 0x06, 
-	0x60, 0x07, 0x20, 0x00, 0x49, 0x04, 0x68, 0x09, 
-	0x70, 0x08, 0x48, 0x04, 0x70, 0x05, 0x20, 0x00, 
-	0xe7, 0xee, 0xe7, 0xed, 0x2e, 0x01, 0xa9, 0xed, 
-	0x2e, 0x08, 0xb9, 0xa4, 0x2e, 0x08, 0xb9, 0xa8, 
-	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, 0xb9, 0xa9, 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, 0xb9, 0xa9, 
-	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, 0xb9, 0xa9, 
-	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, 0x9d, 0xf0, 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, 0x11, 0xfc, 0x04, 
-	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, 0x11, 
-	0xfb, 0xdf, 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, 0x11, 0xfb, 0x40, 
-	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, 0xd1, 0xf0, 0x2e, 0x08, 0x9d, 0xf0, 
-	0xff, 0x00, 0xff, 0xff, 0x2e, 0x08, 0xba, 0x2c, 
-	0x2e, 0x08, 0xb9, 0xc4, 0x2e, 0x08, 0xd1, 0xf4, 
-	0x2e, 0x08, 0xbb, 0x20, 0x2e, 0x08, 0xbb, 0x24, 
-	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, 0x11, 0xfa, 0xc2, 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, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xba, 0x30, 0x68, 0x00, 0x08, 0x00, 
-	0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0xba, 0x34, 
-	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, 0x11, 0xfa, 0x58, 
-	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, 0x9d, 0xf0, 0x2e, 0x08, 0xba, 0x30, 
-	0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0xba, 0x34, 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, 0x11, 
-	0xf9, 0xff, 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, 0xba, 0x30, 
-	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, 0x11, 0xf9, 0xd5, 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, 0xba, 0x30, 
-	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, 0x11, 
-	0xf9, 0x7f, 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, 0x11, 0xf9, 0x44, 
-	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, 0x11, 
-	0xf8, 0x9f, 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, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x30, 
-	0xfe, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x20, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x2e, 0x08, 0xbb, 0x20, 
-	0xff, 0xff, 0x00, 0x00, 0x2e, 0x08, 0xbb, 0x24, 
-	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, 0x9d, 0xf0, 0x2e, 0x08, 0xba, 0x30, 
-	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, 0x11, 0xf8, 0x28, 
-	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, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xd1, 0xf0, 0x2e, 0x08, 0xba, 0x30, 
-	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, 0x9d, 0xf0, 0x2e, 0x08, 0xd1, 0xf0, 
-	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, 0x10, 0xff, 0xb9, 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, 0x9d, 0xf0, 0x2e, 0x08, 0xd1, 0xf0, 
-	0x2e, 0x08, 0xba, 0x30, 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, 0xba, 0x34, 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, 0x9b, 0x28, 0x2e, 0x08, 0x9b, 0x2c, 
-	0x64, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x9b, 0x34, 
-	0x64, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x9b, 0x38, 
-	0x2e, 0x08, 0x9b, 0x30, 0x64, 0x00, 0x04, 0x00, 
-	0x2e, 0x08, 0x9b, 0x3c, 0x9e, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x9b, 0x54, 0x9e, 0x00, 0x05, 0x00, 
-	0x2e, 0x08, 0x9b, 0x40, 0x2e, 0x08, 0xd2, 0x08, 
-	0x2e, 0x08, 0xd2, 0x0c, 0x2e, 0x08, 0xd2, 0x10, 
-	0x2e, 0x08, 0xd2, 0x14, 0x2e, 0x08, 0x9b, 0x44, 
-	0x2e, 0x08, 0x9b, 0x48, 0x2e, 0x08, 0x9b, 0x58, 
-	0x2e, 0x08, 0x9b, 0x5c, 0x2e, 0x08, 0x9b, 0x60, 
-	0x2e, 0x08, 0x9b, 0x64, 0x2e, 0x08, 0x9b, 0x4c, 
-	0x2e, 0x08, 0x9b, 0x50, 0x2e, 0x08, 0x9d, 0xd8, 
-	0x2e, 0x08, 0x9d, 0xdc, 0x2e, 0x08, 0x9b, 0x68, 
-	0x2e, 0x08, 0x9b, 0x6c, 0x2e, 0x08, 0x9b, 0x98, 
-	0x2e, 0x08, 0x9b, 0x70, 0x2e, 0x08, 0x9b, 0x74, 
-	0x2e, 0x08, 0x9b, 0x78, 0x2e, 0x08, 0x9b, 0x7c, 
-	0x2e, 0x08, 0x9b, 0x80, 0x2e, 0x08, 0x9b, 0x84, 
-	0x2e, 0x08, 0x9b, 0x88, 0x2e, 0x08, 0x9b, 0x8c, 
-	0x2e, 0x08, 0x9b, 0x90, 0x2e, 0x08, 0x9b, 0x94, 
-	0x2e, 0x08, 0x9b, 0x1c, 0x2e, 0x08, 0x9b, 0x20, 
-	0x2e, 0x08, 0xb9, 0xb0, 0x2e, 0x08, 0x9b, 0xc0, 
-	0x2e, 0x08, 0x9b, 0xa0, 0x2e, 0x08, 0x9d, 0xe0, 
-	0x2e, 0x08, 0xb9, 0x88, 0xcc, 0x1f, 0xe0, 0x00, 
-	0xcc, 0x1f, 0xfe, 0x00, 0x2e, 0x08, 0x9b, 0xac, 
-	0x2e, 0x08, 0x9b, 0xc4, 0x2e, 0x08, 0x9b, 0xa4, 
-	0x2e, 0x08, 0x9b, 0xa8, 0x2e, 0x08, 0xb9, 0xac, 
-	0x2e, 0x08, 0xb9, 0x84, 0x2e, 0x08, 0x9b, 0xb4, 
-	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, 0xb9, 0xb0, 
-	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
-	0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, 
-	0x23, 0x48, 0x00, 0x00, 0x2e, 0x08, 0xb9, 0xb4, 
-	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, 0xb9, 0xb4, 0x2e, 0x08, 0xb9, 0xb0, 
-	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, 0xb9, 0xb0, 
-	0x62, 0x00, 0x03, 0x00, 0x66, 0x00, 0x01, 0x00, 
-	0xa0, 0x00, 0x0d, 0x80, 0x2e, 0x08, 0x20, 0x88, 
-	0x66, 0x00, 0x00, 0x08, 0x2e, 0x01, 0xe1, 0xa8, 
-	0xdf, 0xff, 0xff, 0xff, 0x62, 0x01, 0x00, 0x00, 
-	0x2e, 0x08, 0xb9, 0xb4, 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, 0xb9, 0xb0, 0x66, 0x00, 0x01, 0x00, 
-	0x2e, 0x08, 0x9b, 0x40, 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, 0xb9, 0xb0, 
-	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, 0x07, 0xf9, 0xea, 
-	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, 0xb9, 0xb0, 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, 0x07, 0xf8, 0x7f, 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, 0x06, 0xff, 0xf8, 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, 0x06, 0xff, 0xc6, 
-	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, 0xb9, 0xb0, 
-	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, 0xb9, 0xb0, 
-	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, 0xb9, 0xb0, 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, 0xd1, 0xfc, 
-	0x2e, 0x08, 0xd2, 0x00, 0x2e, 0x08, 0xd2, 0x04, 
-	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, 0xba, 0x38, 
-	0x2e, 0x08, 0xbb, 0x00, 0x2e, 0x08, 0xd1, 0xf0, 
-	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, 0x9d, 0xf0, 
-	0x2e, 0x08, 0xbb, 0x28, 0x2e, 0x08, 0xbb, 0x1c, 
-	0x2e, 0x08, 0xc2, 0xc0, 0x2e, 0x08, 0xbb, 0x20, 
-	0x2e, 0x08, 0xca, 0x58, 0x2e, 0x08, 0xbb, 0x24, 
-	0x2e, 0x08, 0xd2, 0x00, 0x00, 0x00, 0x16, 0xc8, 
-	0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 
-	0x2e, 0x08, 0xd1, 0xf4, 0x68, 0x00, 0x0d, 0x00, 
-	0x2e, 0x08, 0xd1, 0xf0, 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, 0xd1, 0xfc, 
-	0x2e, 0x08, 0xd2, 0x04, 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, 0xd2, 0x04, 
-	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, 0xd2, 0x04, 
-	0x2e, 0x08, 0xd1, 0xfc, 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, 0xd2, 0x04, 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, 0xbb, 0x00, 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, 0xbb, 0x00, 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, 0xd1, 0xf8, 
-	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, 0xd1, 0xf8, 
-	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, 0xbb, 0x20, 0x2e, 0x08, 0xbb, 0x24, 
-	0x2e, 0x08, 0xd1, 0xfc, 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, 0xb9, 0xc4, 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, 0x0e, 0xfc, 0x1a, 0x1c, 0x06, 0x1c, 0x38, 
-	0x21, 0x01, 0xf0, 0x0e, 0xfc, 0x15, 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, 0xd2, 0x08, 
-	0x2e, 0x08, 0xd2, 0x0c, 0x6a, 0x00, 0x00, 0x18, 
-	0x2e, 0x08, 0xd2, 0x10, 0x2e, 0x08, 0xd2, 0x14, 
-	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, 0x8c, 
-	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, 0xb9, 0xb4, 
-	0x47, 0x00, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 
-	0x47, 0x10, 0x00, 0x00, 0x47, 0x18, 0x00, 0x00, 
-	0x47, 0x20, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00, 
-	0x47, 0x30, 0x00, 0x00, 0x47, 0x38, 0x00, 0x00, 
-	0x17, 0xcb, 0x40, 0x59, 0x1a, 0xc9, 0x17, 0xc2, 
-	0x40, 0x50, 0x1a, 0x80, 0xd1, 0x01, 0xf0, 0x00, 
-	0xf9, 0xf1, 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, 0xd3, 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, 0x1c, 0x02, 0x43, 0x0a, 
-	0x07, 0x92, 0xd1, 0x1a, 0x46, 0xbc, 0xb4, 0x30, 
-	0x4c, 0x11, 0x01, 0xe5, 0xc8, 0x04, 0xc9, 0x08, 
-	0x1a, 0xd7, 0xd1, 0x09, 0x1b, 0x17, 0x43, 0x97, 
-	0x40, 0x2f, 0xd0, 0xf7, 0x20, 0x00, 0xbc, 0x30, 
-	0x46, 0x67, 0x47, 0x70, 0x02, 0x12, 0x02, 0x1b, 
-	0x0e, 0x11, 0x0e, 0x18, 0x1a, 0x08, 0xd1, 0x01, 
-	0x29, 0x00, 0xd1, 0xf7, 0xbc, 0x30, 0x46, 0x67, 
-	0x47, 0x70, 0x78, 0x02, 0x78, 0x0b, 0x1a, 0xd2, 
-	0xd1, 0x03, 0x1c, 0x40, 0x1c, 0x49, 0x2b, 0x00, 
-	0xd1, 0xf7, 0x1c, 0x10, 0x47, 0x70, 0x00, 0x00, 
-	0x01, 0x01, 0x01, 0x01, 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, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, 
-	0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, 
-	0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, 
-	0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, 
-	0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, 
-	0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, 
-	0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, 
-	0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, 
-	0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, 
-	0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, 
-	0x01, 0x01, 0x01, 0x01, 0x46, 0xbc, 0x1c, 0x03, 
-	0x43, 0x08, 0x07, 0x80, 0xd1, 0x13, 0x1f, 0x12, 
-	0xd3, 0x05, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, 
-	0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf9, 0x1c, 0xd2, 
-	0xd3, 0x0c, 0xe0, 0x02, 0x1f, 0x1b, 0x1f, 0x09, 
-	0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, 0x1b, 0xc0, 
-	0xd1, 0x04, 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 
-	0xd2, 0xf7, 0x20, 0x00, 0x46, 0x67, 0x47, 0x70, 
-	0xb5, 0x80, 0xb0, 0x8f, 0x4b, 0x0a, 0x93, 0x08, 
-	0x4b, 0x0a, 0x93, 0x09, 0x4b, 0x0a, 0x93, 0x07, 
-	0x90, 0x0e, 0x46, 0x6b, 0xa8, 0x0e, 0xf0, 0x00, 
-	0xff, 0x4d, 0x1c, 0x07, 0x20, 0x00, 0xa9, 0x0e, 
-	0xf0, 0x00, 0xf8, 0xdc, 0x1c, 0x38, 0xb0, 0x0f, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x01, 0xe6, 0x39, 0x2e, 0x01, 0xe6, 0x47, 
-	0x2e, 0x01, 0xeb, 0xe3, 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, 
-	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, 0x04, 0xec, 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, 0x04, 0xe9, 
-	0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, 
-	0x8a, 0x00, 0x04, 0xe2, 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, 0x04, 0xd9, 
-	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, 0x05, 0x71, 0x80, 0x00, 0x00, 0x20, 
-	0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, 
-	0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0xd0, 0x06, 0x00, 0x0e, 0x00, 
-	0x68, 0x0a, 0x70, 0x10, 0x32, 0x01, 0x60, 0x0a, 
-	0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, 
-	0xb4, 0x90, 0x18, 0x42, 0x78, 0x17, 0x23, 0x00, 
-	0x2f, 0x00, 0xd0, 0x22, 0x2f, 0x35, 0xdb, 0x20, 
-	0x2f, 0x35, 0xd0, 0x01, 0x24, 0x30, 0xe0, 0x07, 
-	0x1c, 0x17, 0x78, 0x7c, 0x37, 0x01, 0x2c, 0x30, 
-	0xd0, 0xfb, 0x2c, 0x00, 0xd1, 0xf6, 0xe0, 0x14, 
-	0x3a, 0x01, 0x78, 0x17, 0x2f, 0x39, 0xd1, 0x01, 
-	0x70, 0x14, 0xe7, 0xf9, 0x37, 0x01, 0x70, 0x17, 
-	0x78, 0x02, 0x2a, 0x30, 0xd0, 0x09, 0x29, 0x00, 
-	0xdb, 0x04, 0x5c, 0x42, 0x18, 0x43, 0x70, 0x5a, 
-	0x39, 0x01, 0xd5, 0xfa, 0x20, 0x01, 0xbc, 0x90, 
-	0x47, 0x70, 0x1c, 0x18, 0xbc, 0x90, 0x47, 0x70, 
-	0xb5, 0x90, 0x1c, 0x0c, 0x1e, 0x57, 0x2a, 0x00, 
-	0xdd, 0x08, 0xf0, 0x01, 0xfc, 0x81, 0x31, 0x30, 
-	0x70, 0x21, 0x1c, 0x39, 0x3c, 0x01, 0x3f, 0x01, 
-	0x29, 0x00, 0xdc, 0xf6, 0xbc, 0x90, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0xf7, 0x1c, 0x14, 0x1c, 0x0f, 
-	0xb0, 0x85, 0xa3, 0xfb, 0x1c, 0x08, 0x1c, 0x11, 
-	0xcb, 0x0c, 0xf7, 0xff, 0xff, 0x3b, 0x28, 0x00, 
-	0xd0, 0x05, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
-	0xff, 0x29, 0x1c, 0x0c, 0x1c, 0x07, 0xa3, 0xf4, 
-	0xcb, 0x0c, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x01, 
-	0xfc, 0x7b, 0x28, 0x00, 0xd0, 0x05, 0x27, 0x00, 
-	0x97, 0x01, 0x1f, 0x78, 0x90, 0x00, 0x1c, 0x3e, 
-	0xe1, 0xc8, 0xb0, 0x8a, 0x46, 0x6a, 0x1c, 0x38, 
-	0x1c, 0x21, 0xf0, 0x01, 0xfc, 0x93, 0x90, 0x08, 
-	0x91, 0x09, 0x20, 0xff, 0x30, 0x2e, 0x9f, 0x00, 
-	0x43, 0x78, 0x4b, 0xe9, 0x18, 0xc1, 0x20, 0x7d, 
-	0x00, 0xc0, 0xf7, 0xff, 0xfd, 0x71, 0x90, 0x0a, 
-	0x1b, 0xc2, 0xa1, 0xe6, 0xc9, 0x03, 0xf0, 0x01, 
-	0xfc, 0xc7, 0x9e, 0x0a, 0xb0, 0x83, 0xf0, 0x01, 
-	0xfd, 0x55, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 
-	0x2e, 0x00, 0xda, 0x04, 0x42, 0x76, 0x4d, 0xe1, 
-	0x4c, 0xe1, 0x1c, 0x67, 0xe0, 0x02, 0x4d, 0xe1, 
-	0x4c, 0xe1, 0x27, 0x00, 0x2e, 0x00, 0xd0, 0x16, 
-	0x08, 0x70, 0xd3, 0x0a, 0x46, 0x6b, 0x1c, 0x28, 
-	0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x01, 0xfd, 0xba, 
-	0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x2e, 0x01, 
-	0xd0, 0x09, 0x1c, 0x28, 0x1c, 0x21, 0x1c, 0x3a, 
-	0xf0, 0x01, 0xfd, 0xca, 0x10, 0x76, 0x1c, 0x0c, 
-	0x1c, 0x05, 0x1c, 0x17, 0xe7, 0xe8, 0xaa, 0x00, 
-	0xca, 0x07, 0xf0, 0x01, 0xfd, 0xdd, 0x90, 0x04, 
-	0x91, 0x05, 0xb0, 0x03, 0x98, 0x08, 0x99, 0x09, 
-	0x9a, 0x01, 0x9b, 0x02, 0xf0, 0x01, 0xfe, 0xd6, 
-	0x1c, 0x04, 0x1c, 0x0f, 0xa3, 0xcd, 0xcb, 0x0c, 
-	0xf7, 0xff, 0xfe, 0xd0, 0x28, 0x00, 0xd0, 0x1d, 
-	0xa3, 0xcc, 0x68, 0x1a, 0x68, 0x5b, 0x1c, 0x20, 
-	0x1c, 0x39, 0x1c, 0x15, 0x1c, 0x1e, 0xf0, 0x01, 
-	0xff, 0x6f, 0x1c, 0x04, 0x98, 0x0a, 0x38, 0x01, 
-	0x90, 0x0a, 0x1c, 0x0f, 0x98, 0x01, 0x99, 0x02, 
-	0x1c, 0x2a, 0x1c, 0x33, 0xf0, 0x01, 0xfe, 0xba, 
-	0x90, 0x01, 0x91, 0x02, 0xa3, 0xbf, 0xcb, 0x0c, 
-	0x1c, 0x20, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0xb2, 
-	0x28, 0x00, 0xd1, 0xe1, 0xa3, 0xbf, 0xcb, 0x0c, 
-	0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x01, 0xff, 0xc2, 
-	0x28, 0x00, 0xd0, 0x1d, 0xa3, 0xb9, 0x68, 0x1a, 
-	0x68, 0x5b, 0x1c, 0x20, 0x1c, 0x39, 0x1c, 0x15, 
-	0x1c, 0x1e, 0xf0, 0x01, 0xfe, 0x9f, 0x1c, 0x04, 
-	0x98, 0x0a, 0x30, 0x01, 0x90, 0x0a, 0x1c, 0x0f, 
-	0x98, 0x01, 0x99, 0x02, 0x1c, 0x2a, 0x1c, 0x33, 
-	0xf0, 0x01, 0xff, 0x3e, 0x90, 0x01, 0x91, 0x02, 
-	0xa3, 0xb0, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 
-	0xf0, 0x01, 0xff, 0xa4, 0x28, 0x00, 0xd1, 0xe1, 
-	0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x01, 0xff, 0xf6, 
-	0x90, 0x0b, 0x98, 0x0a, 0x42, 0x46, 0x96, 0x0e, 
-	0x98, 0x0b, 0xf7, 0xff, 0xfe, 0x3d, 0x9a, 0x00, 
-	0x9e, 0x0a, 0x1a, 0xb2, 0xf0, 0x01, 0xfc, 0x34, 
-	0x90, 0x06, 0x91, 0x07, 0xa0, 0x96, 0x68, 0x02, 
-	0x92, 0x04, 0x68, 0x41, 0x91, 0x05, 0x9e, 0x0a, 
-	0x2e, 0x00, 0xda, 0x25, 0x9e, 0x0e, 0xa1, 0xa1, 
-	0xc9, 0x03, 0xa2, 0x91, 0x68, 0x14, 0x68, 0x52, 
-	0x92, 0x03, 0x25, 0x00, 0x1c, 0x02, 0x1c, 0x2b, 
-	0x1c, 0x07, 0xf0, 0x02, 0xf8, 0x13, 0x1c, 0x02, 
-	0x1c, 0x0b, 0x99, 0x03, 0x1c, 0x20, 0xf0, 0x02, 
-	0xf8, 0x15, 0xa1, 0x9a, 0x68, 0x08, 0x68, 0x49, 
-	0x91, 0x0d, 0x1c, 0x3a, 0x1c, 0x2b, 0x1c, 0x04, 
-	0xf0, 0x01, 0xfe, 0xfe, 0xa3, 0x87, 0xcb, 0x0c, 
-	0xf0, 0x02, 0xf8, 0x76, 0x9b, 0x0d, 0x1c, 0x22, 
-	0xf0, 0x01, 0xfe, 0x4c, 0x1c, 0x04, 0xe0, 0x05, 
-	0xa0, 0x90, 0x68, 0x45, 0x68, 0x07, 0xa0, 0x7e, 
-	0x68, 0x41, 0x68, 0x04, 0x91, 0x03, 0x2e, 0x00, 
-	0xd0, 0x5d, 0x08, 0x70, 0xd3, 0x35, 0xb0, 0x82, 
-	0x98, 0x08, 0x99, 0x09, 0x9b, 0x05, 0x1c, 0x22, 
-	0xf0, 0x01, 0xfe, 0xe2, 0x90, 0x00, 0x91, 0x01, 
-	0x9b, 0x05, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x22, 
-	0xf0, 0x01, 0xff, 0xe8, 0x9a, 0x06, 0x9b, 0x07, 
-	0xf0, 0x01, 0xfe, 0xd6, 0x9a, 0x00, 0x9b, 0x01, 
-	0xb0, 0x02, 0xf0, 0x01, 0xff, 0xdf, 0x90, 0x04, 
-	0x91, 0x05, 0x98, 0x06, 0x99, 0x07, 0x1c, 0x3a, 
-	0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0xc9, 0xb0, 0x82, 
-	0x90, 0x00, 0x23, 0x00, 0x93, 0x01, 0x1c, 0x02, 
-	0xf0, 0x01, 0xff, 0xc8, 0x1c, 0x02, 0x1c, 0x0b, 
-	0x98, 0x06, 0x99, 0x07, 0xf0, 0x01, 0xff, 0xca, 
-	0x90, 0x06, 0x91, 0x07, 0x98, 0x00, 0x90, 0x08, 
-	0x99, 0x01, 0x91, 0x09, 0xb0, 0x02, 0x2e, 0x01, 
-	0xd0, 0x25, 0xa1, 0x72, 0xc9, 0x03, 0x1c, 0x3a, 
-	0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0xad, 0x9b, 0x03, 
-	0x1c, 0x22, 0xf0, 0x01, 0xff, 0xb7, 0x9b, 0x03, 
-	0x1c, 0x22, 0xf0, 0x01, 0xfe, 0xa5, 0x91, 0x03, 
-	0x1c, 0x04, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x3a, 
-	0x1c, 0x2b, 0xf0, 0x01, 0xfe, 0x9d, 0x25, 0x00, 
-	0x1c, 0x02, 0x1c, 0x2b, 0x1c, 0x07, 0xf0, 0x01, 
-	0xff, 0x9d, 0x1c, 0x02, 0x1c, 0x0b, 0x99, 0x03, 
-	0x1c, 0x20, 0xf0, 0x01, 0xff, 0x9f, 0x91, 0x03, 
-	0x10, 0x76, 0x1c, 0x04, 0xe7, 0xa1, 0xe7, 0xff, 
-	0xab, 0x06, 0xcb, 0x0f, 0xf0, 0x02, 0xf8, 0x0c, 
-	0x28, 0x00, 0xd1, 0x03, 0x98, 0x0b, 0x38, 0x01, 
-	0x90, 0x0b, 0xe7, 0x55, 0x98, 0x08, 0x99, 0x09, 
-	0x9a, 0x06, 0x9b, 0x07, 0xf0, 0x01, 0xff, 0x82, 
-	0x9a, 0x04, 0x9b, 0x05, 0xf0, 0x01, 0xff, 0x7e, 
-	0x9a, 0x01, 0x9b, 0x02, 0xf0, 0x01, 0xfd, 0xca, 
-	0xa3, 0x4c, 0x68, 0x1a, 0x68, 0x5b, 0x93, 0x0c, 
-	0x1c, 0x15, 0xf0, 0x01, 0xfe, 0x6d, 0x1c, 0x0c, 
-	0x1c, 0x07, 0xf0, 0x01, 0xff, 0x2f, 0x1c, 0x06, 
-	0xf7, 0xff, 0xfd, 0x7a, 0x1c, 0x3a, 0x1c, 0x23, 
-	0xf0, 0x01, 0xff, 0xde, 0x9b, 0x0c, 0x1c, 0x2a, 
-	0xf0, 0x01, 0xfe, 0x5e, 0xf0, 0x01, 0xff, 0x22, 
-	0x1c, 0x07, 0xd5, 0x04, 0x4b, 0x47, 0x18, 0xff, 
-	0x3e, 0x01, 0x2f, 0x00, 0xdb, 0xfa, 0x48, 0x45, 
-	0x42, 0x87, 0xdb, 0x04, 0x4b, 0x43, 0x1a, 0xff, 
-	0x36, 0x01, 0x42, 0x87, 0xda, 0xfa, 0x2e, 0x00, 
-	0xda, 0x06, 0x4b, 0x40, 0x18, 0xf6, 0x99, 0x0b, 
-	0x39, 0x01, 0x91, 0x0b, 0x2e, 0x00, 0xdb, 0xf8, 
-	0x42, 0x86, 0xdb, 0x06, 0x4b, 0x3b, 0x1a, 0xf6, 
-	0x99, 0x0b, 0x31, 0x01, 0x91, 0x0b, 0x42, 0x86, 
-	0xda, 0xf8, 0x99, 0x0b, 0x4b, 0x38, 0x42, 0x99, 
-	0xda, 0x17, 0x98, 0x0b, 0x00, 0x84, 0x18, 0x24, 
-	0x00, 0x64, 0x1c, 0x18, 0x1c, 0x31, 0xf7, 0xff, 
-	0xfb, 0xe3, 0x18, 0x20, 0x90, 0x0b, 0x00, 0x8c, 
-	0x18, 0x64, 0x00, 0x64, 0x1c, 0x39, 0x48, 0x30, 
-	0xf7, 0xff, 0xfb, 0xda, 0x18, 0x26, 0x00, 0x8f, 
-	0x18, 0x7f, 0x00, 0x7f, 0x98, 0x0a, 0x38, 0x01, 
-	0xe0, 0x16, 0x99, 0x0b, 0x42, 0x81, 0xdb, 0x14, 
-	0x98, 0x0b, 0xf0, 0x01, 0xfa, 0xa1, 0x4b, 0x27, 
-	0x43, 0x59, 0x19, 0x89, 0x90, 0x0b, 0x1c, 0x08, 
-	0xf0, 0x01, 0xfa, 0x9a, 0x4b, 0x23, 0x43, 0x59, 
-	0x19, 0xc9, 0x1c, 0x06, 0x1d, 0x48, 0xf0, 0x01, 
-	0xfa, 0x93, 0x1c, 0x07, 0x98, 0x0a, 0x30, 0x01, 
-	0x90, 0x0a, 0xb0, 0x0a, 0x24, 0x30, 0x98, 0x05, 
-	0x70, 0x04, 0x98, 0x05, 0x1d, 0x81, 0x22, 0x06, 
-	0x98, 0x01, 0xf7, 0xff, 0xfd, 0xfd, 0x98, 0x05, 
-	0x1d, 0xc1, 0x31, 0x05, 0x22, 0x06, 0x1c, 0x30, 
-	0xf7, 0xff, 0xfd, 0xf6, 0xe0, 0x2e, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0xff, 0xff, 0xea, 0x84, 0x3f, 0xf0, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xfc, 
-	0xcc, 0xcc, 0xcc, 0xcc, 0x00, 0x00, 0x40, 0x01, 
-	0xa0, 0x00, 0x00, 0x00, 0x40, 0xf8, 0x6a, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x24, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x41, 0x2e, 0x84, 0x80, 
-	0x00, 0x00, 0x00, 0x00, 0x3f, 0xc9, 0x99, 0x99, 
-	0x99, 0x99, 0x99, 0x9a, 0x40, 0x14, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0x40, 
-	0x00, 0x01, 0x86, 0xa0, 0x98, 0x05, 0x1d, 0xc1, 
-	0x31, 0x0b, 0x22, 0x06, 0x1c, 0x38, 0xf7, 0xff, 
-	0xfd, 0xbf, 0x98, 0x05, 0x74, 0xc4, 0x27, 0x00, 
-	0x98, 0x05, 0x75, 0x07, 0x98, 0x00, 0x30, 0x05, 
-	0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
-	0x47, 0x18, 0x68, 0x02, 0x08, 0x12, 0xd3, 0x01, 
-	0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x60, 0x0a, 
-	0x68, 0x01, 0x4a, 0x08, 0x40, 0x0a, 0x4b, 0x07, 
-	0x42, 0x9a, 0xd0, 0x01, 0x20, 0x00, 0x47, 0x70, 
-	0x03, 0x09, 0xd1, 0x02, 0x68, 0x40, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0x01, 0x47, 0x70, 0x20, 0x02, 
-	0x47, 0x70, 0x00, 0x00, 0x7f, 0xf0, 0x00, 0x00, 
-	0xb5, 0x90, 0x1c, 0x04, 0x54, 0x63, 0x1c, 0x4f, 
-	0x2a, 0x00, 0xda, 0x02, 0x42, 0x52, 0x21, 0x2d, 
-	0xe0, 0x00, 0x21, 0x2b, 0x1c, 0x38, 0x54, 0x21, 
-	0x23, 0x7d, 0x00, 0xdb, 0x37, 0x01, 0x42, 0x9a, 
-	0xdb, 0x09, 0x1c, 0x18, 0x1c, 0x11, 0xf7, 0xff, 
-	0xfb, 0x37, 0x1d, 0xc2, 0x32, 0x29, 0x1c, 0x38, 
-	0x54, 0x22, 0x1c, 0x0a, 0x37, 0x01, 0x2a, 0x64, 
-	0xdb, 0x09, 0x20, 0x64, 0x1c, 0x11, 0xf7, 0xff, 
-	0xfb, 0x2b, 0x1d, 0xc2, 0x32, 0x29, 0x1c, 0x38, 
-	0x54, 0x22, 0x1c, 0x0a, 0x37, 0x01, 0x1c, 0x10, 
-	0xf0, 0x01, 0xf9, 0xf6, 0x1d, 0xc2, 0x32, 0x29, 
-	0x1c, 0x38, 0x54, 0x22, 0x37, 0x01, 0x1c, 0x38, 
-	0x31, 0x30, 0x54, 0x21, 0x37, 0x01, 0x1c, 0x38, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
-	0x1c, 0x06, 0xb0, 0x82, 0x68, 0x10, 0x90, 0x00, 
-	0x1d, 0xd0, 0x30, 0x0d, 0xb0, 0x81, 0x1c, 0x0f, 
-	0x46, 0x69, 0x1c, 0x14, 0x1c, 0x05, 0xf7, 0xff, 
-	0xff, 0xa0, 0x99, 0x00, 0x29, 0x00, 0xd0, 0x01, 
-	0xa1, 0xc9, 0xe0, 0x0a, 0x99, 0x01, 0x08, 0x89, 
-	0xd3, 0x01, 0xa1, 0xc8, 0xe0, 0x05, 0x99, 0x01, 
-	0x08, 0xc9, 0xd3, 0x01, 0xa1, 0xc6, 0xe0, 0x00, 
-	0xa1, 0xc6, 0x60, 0x61, 0x28, 0x00, 0xd0, 0x15, 
-	0x28, 0x01, 0xd1, 0x01, 0xa0, 0xc4, 0xe0, 0x00, 
-	0xa0, 0xc4, 0x78, 0x01, 0x70, 0x39, 0x78, 0x41, 
-	0x70, 0x79, 0x78, 0x80, 0x70, 0xb8, 0x20, 0x00, 
-	0x70, 0xf8, 0x98, 0x01, 0x4b, 0xc0, 0x40, 0x18, 
-	0x60, 0x20, 0x20, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0xcd, 0x06, 0xb0, 0x01, 
-	0x48, 0xbc, 0x90, 0x01, 0x2e, 0x45, 0xd0, 0x74, 
-	0x2e, 0x65, 0xd0, 0x72, 0x2e, 0x66, 0xd1, 0x71, 
-	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x2e, 0x1c, 0x06, 
-	0xd5, 0x4e, 0x42, 0x76, 0x68, 0xa0, 0x1c, 0x41, 
-	0x42, 0xb1, 0xda, 0x09, 0x21, 0x30, 0x70, 0x39, 
-	0x98, 0x01, 0x68, 0x00, 0x78, 0x00, 0x25, 0x02, 
-	0x70, 0x78, 0x68, 0xa0, 0x61, 0x20, 0xe0, 0x3b, 
-	0x1b, 0x80, 0x1c, 0x85, 0x2d, 0x12, 0xdd, 0x03, 
-	0x1f, 0xe8, 0x38, 0x0c, 0x25, 0x13, 0x61, 0x20, 
-	0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfc, 0xd4, 
-	0x28, 0x00, 0xd0, 0x01, 0x35, 0x01, 0x3e, 0x01, 
-	0x2e, 0x00, 0xd1, 0x02, 0x78, 0x78, 0x70, 0x38, 
-	0xe0, 0x0d, 0x2e, 0x01, 0xd1, 0x10, 0x1c, 0x28, 
-	0x2d, 0x00, 0xdd, 0x05, 0x5c, 0x39, 0x18, 0x3a, 
-	0x70, 0x51, 0x38, 0x01, 0x28, 0x00, 0xdc, 0xf9, 
-	0x21, 0x30, 0x70, 0x39, 0x35, 0x01, 0x98, 0x01, 
-	0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0xe0, 0x13, 
-	0x1c, 0x28, 0x2d, 0x00, 0xdd, 0x05, 0x5c, 0x39, 
-	0x18, 0x3a, 0x70, 0x91, 0x38, 0x01, 0x28, 0x00, 
-	0xdc, 0xf9, 0x21, 0x30, 0x70, 0x39, 0x98, 0x01, 
-	0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0x20, 0x3c, 
-	0x70, 0xb8, 0x1e, 0x70, 0x60, 0xe0, 0x35, 0x02, 
-	0x69, 0x20, 0x28, 0x00, 0xdd, 0x5d, 0xe0, 0x26, 
-	0x68, 0xa0, 0x19, 0x80, 0x1c, 0x85, 0x2d, 0x12, 
-	0xdd, 0x41, 0x25, 0x13, 0x1c, 0x38, 0x1c, 0x29, 
-	0xf7, 0xff, 0xfc, 0x96, 0x28, 0x00, 0xd0, 0x01, 
-	0x25, 0x14, 0x36, 0x01, 0x1e, 0x69, 0x42, 0xb1, 
-	0xdd, 0x1a, 0x20, 0x00, 0x2e, 0x00, 0xdb, 0x05, 
-	0x18, 0x39, 0x78, 0x49, 0x54, 0x39, 0x30, 0x01, 
-	0x42, 0xb0, 0xdd, 0xf9, 0x98, 0x01, 0x68, 0x00, 
-	0xe0, 0x01, 0xe0, 0xc1, 0xe0, 0x45, 0x78, 0x00, 
-	0x19, 0xb9, 0x70, 0x48, 0x68, 0xa0, 0x19, 0x80, 
-	0x38, 0x11, 0x61, 0x20, 0xd0, 0x35, 0x21, 0x3e, 
-	0x1c, 0x28, 0x54, 0x39, 0x35, 0x01, 0xe0, 0x30, 
-	0x20, 0x00, 0x29, 0x00, 0xdd, 0x05, 0x18, 0x3a, 
-	0x78, 0x52, 0x54, 0x3a, 0x30, 0x01, 0x42, 0x81, 
-	0xdc, 0xf9, 0x20, 0x3c, 0x19, 0x79, 0x39, 0x20, 
-	0x77, 0xc8, 0x1b, 0x70, 0x30, 0x02, 0x60, 0xe0, 
-	0x98, 0x01, 0x68, 0x00, 0x78, 0x01, 0x1c, 0x28, 
-	0x54, 0x39, 0x68, 0xa0, 0x35, 0x01, 0x28, 0x00, 
-	0xd0, 0x17, 0x61, 0x20, 0xe7, 0xdf, 0x1c, 0x38, 
-	0x1c, 0x29, 0xf7, 0xff, 0xfc, 0x55, 0x28, 0x00, 
-	0xd0, 0x01, 0x35, 0x01, 0x36, 0x01, 0x20, 0x00, 
-	0x2e, 0x00, 0xdb, 0x05, 0x18, 0x39, 0x78, 0x49, 
-	0x54, 0x39, 0x30, 0x01, 0x42, 0xb0, 0xdd, 0xf9, 
-	0x98, 0x01, 0x68, 0x00, 0x78, 0x00, 0x19, 0xb9, 
-	0x70, 0x48, 0x68, 0xa0, 0x28, 0x00, 0xd1, 0x68, 
-	0x98, 0x00, 0x09, 0x00, 0xd2, 0x66, 0x3d, 0x01, 
-	0xe0, 0x75, 0x1c, 0x38, 0xb0, 0x81, 0xf7, 0xff, 
-	0xfc, 0x74, 0x90, 0x00, 0x68, 0xa0, 0x28, 0x01, 
-	0xda, 0x01, 0x20, 0x01, 0x60, 0xa0, 0x68, 0xa0, 
-	0x28, 0x11, 0xdd, 0x01, 0x25, 0x12, 0xe0, 0x00, 
-	0x1c, 0x45, 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 
-	0xfc, 0x27, 0x99, 0x00, 0x18, 0x42, 0x68, 0xa0, 
-	0x42, 0x90, 0xdd, 0x02, 0x23, 0x04, 0x42, 0xda, 
-	0xda, 0x02, 0x78, 0x78, 0x70, 0x38, 0xe0, 0x22, 
-	0x26, 0x66, 0x2a, 0x00, 0xdb, 0x0e, 0x20, 0x00, 
-	0x2a, 0x00, 0xdb, 0x05, 0x18, 0x39, 0x78, 0x49, 
-	0x54, 0x39, 0x30, 0x01, 0x42, 0x90, 0xdd, 0xf9, 
-	0x98, 0x02, 0x68, 0x00, 0x78, 0x00, 0x18, 0xb9, 
-	0x70, 0x48, 0xe0, 0x14, 0x42, 0x52, 0x1c, 0x28, 
-	0xd4, 0x04, 0x5c, 0x3b, 0x18, 0x81, 0x54, 0x7b, 
-	0x38, 0x01, 0xd5, 0xfa, 0x18, 0xad, 0x20, 0x00, 
-	0x2a, 0x00, 0xdb, 0x04, 0x21, 0x30, 0x54, 0x39, 
-	0x30, 0x01, 0x42, 0x90, 0xdd, 0xfb, 0x98, 0x02, 
-	0x68, 0x00, 0x78, 0x00, 0x70, 0x78, 0x98, 0x01, 
-	0x09, 0x00, 0xd2, 0x1c, 0x20, 0x00, 0x43, 0xc0, 
-	0x61, 0x20, 0x5d, 0x78, 0x99, 0x02, 0x68, 0x09, 
-	0x78, 0x09, 0x42, 0x88, 0xd0, 0x0a, 0x19, 0x78, 
-	0x38, 0x20, 0x7f, 0xc0, 0x28, 0x30, 0xd1, 0x05, 
-	0x3d, 0x01, 0x19, 0x78, 0x38, 0x20, 0x7f, 0xc0, 
-	0x28, 0x30, 0xd0, 0xf9, 0x19, 0x78, 0x38, 0x20, 
-	0x7f, 0xc0, 0x42, 0x88, 0xd1, 0x0c, 0x3d, 0x01, 
-	0xe0, 0x0a, 0xe0, 0x10, 0xe0, 0x0f, 0x68, 0xa0, 
-	0x28, 0x11, 0xdd, 0x05, 0x38, 0x11, 0x21, 0x3e, 
-	0x61, 0x20, 0x1c, 0x28, 0x54, 0x39, 0x35, 0x01, 
-	0x2e, 0x66, 0xd0, 0x03, 0x1c, 0x38, 0x1c, 0x29, 
-	0x1e, 0xb3, 0xe0, 0x31, 0xb0, 0x01, 0x1c, 0x28, 
-	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x1c, 0x38, 0xb0, 0x81, 0xf7, 0xff, 0xfb, 0xf9, 
-	0x90, 0x00, 0x68, 0xa0, 0x28, 0x11, 0xdd, 0x03, 
-	0x38, 0x11, 0x61, 0x20, 0x20, 0x11, 0x60, 0xa0, 
-	0x68, 0xa0, 0x1c, 0x85, 0x1c, 0x38, 0x1c, 0x29, 
-	0xf7, 0xff, 0xfb, 0xae, 0x99, 0x00, 0x18, 0x42, 
-	0x78, 0x78, 0x70, 0x38, 0x68, 0xa0, 0x28, 0x00, 
-	0xd1, 0x04, 0x98, 0x01, 0x09, 0x00, 0xd2, 0x01, 
-	0x25, 0x01, 0xe0, 0x03, 0x98, 0x02, 0x68, 0x00, 
-	0x78, 0x00, 0x70, 0x78, 0x69, 0x20, 0x28, 0x00, 
-	0xdd, 0x03, 0x21, 0x3e, 0x1c, 0x28, 0x54, 0x39, 
-	0x35, 0x01, 0x1c, 0x38, 0x1c, 0x29, 0x1c, 0x33, 
-	0xf7, 0xff, 0xfe, 0x26, 0x1c, 0x05, 0xe7, 0xc9, 
-	0x2d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 
-	0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x4e, 0x61, 0x4e, 0x00, 0x49, 0x6e, 0x66, 0x00, 
-	0xff, 0xff, 0xfe, 0xff, 0x2e, 0x08, 0x22, 0x10, 
-	0xb5, 0xf0, 0x1c, 0x04, 0x25, 0x00, 0x26, 0x00, 
-	0x1c, 0x18, 0xb0, 0x92, 0x68, 0x13, 0x93, 0x00, 
-	0x1c, 0x17, 0x43, 0xea, 0x60, 0xfa, 0x61, 0x3a, 
-	0x1c, 0x1a, 0x23, 0x21, 0x01, 0x1b, 0x40, 0x1a, 
-	0xd1, 0x01, 0x22, 0x01, 0x60, 0xba, 0x1d, 0xfa, 
-	0x32, 0x29, 0x29, 0x67, 0xd0, 0x0e, 0xdc, 0x2c, 
-	0x29, 0x64, 0xd0, 0x5b, 0xdc, 0x06, 0x29, 0x45, 
-	0xd0, 0x08, 0x29, 0x47, 0xd0, 0x06, 0x29, 0x58, 
-	0xd1, 0x0c, 0xe0, 0x58, 0x29, 0x65, 0xd0, 0x01, 
-	0x29, 0x66, 0xd1, 0x07, 0xab, 0x01, 0x1c, 0x08, 
-	0x1c, 0x19, 0x69, 0xfb, 0x1c, 0x3a, 0xf7, 0xff, 
-	0xf9, 0x29, 0x1c, 0x05, 0xb0, 0x82, 0x6a, 0xf9, 
-	0x91, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x98, 0x02, 
-	0x40, 0x18, 0x90, 0x0d, 0xd0, 0x6c, 0x21, 0x00, 
-	0x91, 0x01, 0x68, 0xf8, 0x28, 0x00, 0xdd, 0x01, 
-	0x1e, 0x41, 0x91, 0x01, 0x69, 0x38, 0x28, 0x00, 
-	0xdd, 0x63, 0x99, 0x01, 0x18, 0x40, 0x1e, 0x41, 
-	0xe0, 0xca, 0x29, 0x70, 0xd0, 0x33, 0xdc, 0x2e, 
-	0x29, 0x69, 0xd0, 0x2b, 0x29, 0x6f, 0xd1, 0xe1, 
-	0x99, 0x00, 0x09, 0xc9, 0xd3, 0x63, 0xb0, 0x82, 
-	0x68, 0x10, 0x90, 0x00, 0x68, 0x51, 0x91, 0x01, 
-	0xa3, 0xc0, 0x93, 0x12, 0xcb, 0x0c, 0xf0, 0x01, 
-	0xfd, 0x2d, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x00, 
-	0x99, 0x01, 0xf7, 0xff, 0xf9, 0x4d, 0x07, 0x40, 
-	0x0f, 0x40, 0x6a, 0xb9, 0x5c, 0x09, 0x1c, 0x28, 
-	0xaa, 0x03, 0x54, 0x11, 0x22, 0x03, 0x98, 0x00, 
-	0x99, 0x01, 0x35, 0x01, 0xf7, 0xff, 0xf9, 0x2c, 
-	0x90, 0x00, 0x91, 0x01, 0x9b, 0x12, 0xcb, 0x0c, 
-	0xf0, 0x01, 0xfd, 0x14, 0x28, 0x00, 0xd1, 0xe6, 
-	0xb0, 0x02, 0xe0, 0x49, 0xe0, 0x4f, 0x29, 0x75, 
-	0xd0, 0x4d, 0x29, 0x78, 0xd1, 0xb2, 0x99, 0x00, 
-	0x09, 0xc9, 0xd3, 0x27, 0xb0, 0x82, 0x68, 0x10, 
-	0x90, 0x00, 0x68, 0x51, 0x91, 0x01, 0xa3, 0xa9, 
-	0x93, 0x13, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xfe, 
-	0x28, 0x00, 0xd0, 0x71, 0x98, 0x00, 0x99, 0x01, 
-	0xf7, 0xff, 0xf9, 0x1e, 0x07, 0x00, 0x0f, 0x00, 
-	0x6a, 0xb9, 0x5c, 0x09, 0x1c, 0x28, 0xaa, 0x03, 
-	0x54, 0x11, 0x22, 0x04, 0x98, 0x00, 0x99, 0x01, 
-	0x35, 0x01, 0xf7, 0xff, 0xf8, 0xfd, 0x90, 0x00, 
-	0x91, 0x01, 0x9b, 0x13, 0xcb, 0x0c, 0xf0, 0x01, 
-	0xfc, 0xe5, 0x28, 0x00, 0xd1, 0xe6, 0xe0, 0x57, 
-	0xe0, 0x65, 0xe0, 0x6a, 0x28, 0x00, 0xd0, 0x85, 
-	0x07, 0x02, 0x0f, 0x12, 0x6a, 0xb9, 0x5c, 0x8a, 
-	0x1c, 0x29, 0xab, 0x01, 0x54, 0x5a, 0x35, 0x01, 
-	0x09, 0x00, 0xd1, 0xf5, 0xe7, 0x7a, 0xe7, 0xff, 
-	0x28, 0x00, 0xd0, 0x09, 0x07, 0x41, 0x0f, 0x49, 
-	0x1d, 0xca, 0x32, 0x29, 0x1c, 0x29, 0xab, 0x01, 
-	0x54, 0x5a, 0x35, 0x01, 0x08, 0xc0, 0xd1, 0xf5, 
-	0x98, 0x00, 0x09, 0x00, 0xd3, 0xee, 0x68, 0xb8, 
-	0x38, 0x01, 0x60, 0xb8, 0xe7, 0x66, 0x99, 0x00, 
-	0x09, 0xc9, 0xd3, 0x33, 0xb0, 0x82, 0x68, 0x10, 
-	0x90, 0x00, 0x68, 0x51, 0x91, 0x01, 0xa3, 0x83, 
-	0x93, 0x11, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xb2, 
-	0x28, 0x00, 0xd0, 0x25, 0xa3, 0x81, 0x93, 0x10, 
-	0xa3, 0x82, 0x93, 0x0f, 0xa3, 0x7f, 0x93, 0x0e, 
-	0x98, 0x00, 0x99, 0x01, 0x9b, 0x10, 0xcb, 0x0c, 
-	0xf0, 0x01, 0xfc, 0xac, 0x1c, 0x19, 0x1c, 0x10, 
-	0x9b, 0x0f, 0xcb, 0x0c, 0xf0, 0x01, 0xfc, 0xe8, 
-	0xf7, 0xff, 0xf8, 0xc2, 0x1c, 0x29, 0xaa, 0x03, 
-	0x54, 0x50, 0x98, 0x00, 0x99, 0x01, 0x9b, 0x0e, 
-	0xcb, 0x0c, 0x35, 0x01, 0xf0, 0x01, 0xfc, 0x9a, 
-	0x90, 0x00, 0x91, 0x01, 0x9b, 0x11, 0xcb, 0x0c, 
-	0xf0, 0x01, 0xfc, 0x8c, 0x28, 0x00, 0xd1, 0xdf, 
-	0xb0, 0x02, 0xe7, 0x2f, 0x28, 0x00, 0xd0, 0xb1, 
-	0xf0, 0x01, 0xfc, 0xd2, 0x1d, 0xca, 0x32, 0x29, 
-	0x1c, 0x29, 0xab, 0x01, 0x54, 0x5a, 0x35, 0x01, 
-	0x28, 0x00, 0xd1, 0xf5, 0xe7, 0x22, 0x68, 0xb8, 
-	0x1b, 0x41, 0x91, 0x01, 0xd5, 0x01, 0x21, 0x00, 
-	0x91, 0x01, 0x68, 0x78, 0xf7, 0xff, 0xf9, 0x0a, 
-	0x99, 0x01, 0x19, 0x49, 0x18, 0x40, 0x99, 0x00, 
-	0x1a, 0x08, 0x90, 0x00, 0x23, 0xff, 0x33, 0x01, 
-	0x98, 0x02, 0x40, 0x18, 0x90, 0x0c, 0xd1, 0x1b, 
-	0x98, 0x02, 0x08, 0x40, 0xd2, 0x18, 0xb0, 0x81, 
-	0x98, 0x0d, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x30, 
-	0xe0, 0x00, 0x20, 0x20, 0x06, 0x00, 0x0e, 0x00, 
-	0x90, 0x00, 0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 
-	0xd4, 0x09, 0x98, 0x00, 0x6a, 0x3a, 0x1c, 0x21, 
-	0x36, 0x01, 0xf7, 0xff, 0xf8, 0x1d, 0x98, 0x01, 
-	0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, 0xb0, 0x01, 
-	0x68, 0x79, 0x78, 0x08, 0x31, 0x01, 0xb0, 0x81, 
-	0x91, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x6a, 0x3a, 
-	0x1c, 0x21, 0xf7, 0xff, 0xf8, 0x0d, 0x99, 0x00, 
-	0x78, 0x08, 0x31, 0x01, 0x91, 0x00, 0x36, 0x01, 
-	0x28, 0x00, 0xd1, 0xf4, 0xb0, 0x01, 0x98, 0x02, 
-	0x07, 0xc0, 0x0f, 0xc0, 0x90, 0x0b, 0xd1, 0x18, 
-	0xb0, 0x81, 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x01, 
-	0x20, 0x30, 0xe0, 0x00, 0x20, 0x20, 0x06, 0x00, 
-	0x0e, 0x00, 0x90, 0x00, 0x98, 0x01, 0x38, 0x01, 
-	0x90, 0x01, 0xd4, 0x09, 0x98, 0x00, 0x6a, 0x3a, 
-	0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, 0xff, 0xec, 
-	0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, 
-	0xb0, 0x01, 0x98, 0x0d, 0x28, 0x00, 0xd0, 0x35, 
-	0x21, 0x00, 0xb0, 0x81, 0x91, 0x00, 0x2d, 0x00, 
-	0xdd, 0x2e, 0xa8, 0x04, 0x99, 0x00, 0x5c, 0x40, 
-	0x28, 0x3c, 0xd0, 0x10, 0x28, 0x3e, 0xd1, 0x1d, 
-	0x69, 0x38, 0x38, 0x01, 0x61, 0x38, 0xd4, 0x1e, 
-	0x20, 0x30, 0x6a, 0x3a, 0x1c, 0x21, 0x36, 0x01, 
-	0xf7, 0xfe, 0xff, 0xce, 0x69, 0x38, 0x38, 0x01, 
-	0x61, 0x38, 0xd5, 0xf5, 0xe0, 0x13, 0x68, 0xf8, 
-	0x38, 0x01, 0x60, 0xf8, 0xd4, 0x0f, 0x20, 0x30, 
-	0x6a, 0x3a, 0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, 
-	0xff, 0xbf, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, 
-	0xd5, 0xf5, 0xe0, 0x04, 0x6a, 0x3a, 0x1c, 0x21, 
-	0xf7, 0xfe, 0xff, 0xb6, 0x36, 0x01, 0x99, 0x00, 
-	0x31, 0x01, 0x91, 0x00, 0x42, 0xa9, 0xdb, 0xd0, 
-	0xb0, 0x01, 0xe0, 0x1c, 0x99, 0x01, 0x1e, 0x48, 
-	0x90, 0x01, 0xd4, 0x09, 0x20, 0x30, 0x6a, 0x3a, 
-	0x1c, 0x21, 0x36, 0x01, 0xf7, 0xfe, 0xff, 0xa4, 
-	0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0xd5, 0xf5, 
-	0x19, 0x76, 0x1c, 0x28, 0x3d, 0x01, 0x28, 0x00, 
-	0xdd, 0x09, 0xa8, 0x03, 0x5d, 0x40, 0x6a, 0x3a, 
-	0x1c, 0x21, 0xf7, 0xfe, 0xff, 0x95, 0x1c, 0x28, 
-	0x3d, 0x01, 0x28, 0x00, 0xdc, 0xf5, 0x98, 0x0b, 
-	0x28, 0x00, 0xd0, 0x0a, 0x98, 0x00, 0x1e, 0x45, 
-	0xd4, 0x07, 0x20, 0x20, 0x6a, 0x3a, 0x1c, 0x21, 
-	0x36, 0x01, 0xf7, 0xfe, 0xff, 0x85, 0x3d, 0x01, 
-	0xd5, 0xf7, 0x1c, 0x30, 0xb0, 0x14, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 
-	0x00, 0x00, 0x00, 0x00, 0xb5, 0xff, 0x20, 0x00, 
-	0xb0, 0x88, 0x90, 0x00, 0x99, 0x09, 0x78, 0x08, 
-	0x31, 0x01, 0x91, 0x09, 0x1c, 0x1c, 0x1c, 0x17, 
-	0x28, 0x00, 0xd0, 0x74, 0xa3, 0xf4, 0x93, 0x07, 
-	0x1d, 0xe2, 0x32, 0x0d, 0x92, 0x06, 0x1d, 0xe1, 
-	0x31, 0x29, 0x91, 0x05, 0x28, 0x25, 0xd0, 0x07, 
-	0x99, 0x08, 0x6a, 0x22, 0xf7, 0xfe, 0xff, 0x58, 
-	0x98, 0x00, 0x30, 0x01, 0x90, 0x00, 0xe2, 0xc4, 
-	0x25, 0x00, 0x23, 0x00, 0xb0, 0x82, 0x93, 0x00, 
-	0x20, 0x00, 0x60, 0xa0, 0x99, 0x0b, 0x78, 0x0e, 
-	0x31, 0x01, 0x91, 0x0b, 0x2e, 0x2b, 0xd0, 0x16, 
-	0xdc, 0x06, 0x2e, 0x20, 0xd0, 0x16, 0x2e, 0x23, 
-	0xd1, 0x17, 0x23, 0x08, 0x43, 0x1d, 0xe7, 0xf1, 
-	0x2e, 0x2d, 0xd0, 0x05, 0x2e, 0x30, 0xd1, 0x10, 
-	0x23, 0xff, 0x33, 0x01, 0x43, 0x1d, 0xe7, 0xe9, 
-	0x23, 0xff, 0x33, 0x01, 0x43, 0x9d, 0x1c, 0x28, 
-	0x25, 0x01, 0x43, 0x05, 0xe7, 0xe2, 0x23, 0x02, 
-	0x43, 0x1d, 0xe7, 0xdf, 0x23, 0x04, 0x43, 0x1d, 
-	0xe7, 0xdc, 0x20, 0x00, 0x2e, 0x2a, 0xd1, 0x11, 
-	0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 
-	0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, 
-	0x28, 0x00, 0xda, 0x02, 0x42, 0x40, 0x23, 0x01, 
-	0x40, 0x5d, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, 
-	0x91, 0x0b, 0xe0, 0x0f, 0x49, 0xce, 0x5d, 0x8a, 
-	0x09, 0x92, 0xd3, 0x0b, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0x40, 0x19, 0x80, 0x9a, 0x0b, 0x78, 0x16, 
-	0x32, 0x01, 0x92, 0x0b, 0x5d, 0x8a, 0x38, 0x30, 
-	0x09, 0x92, 0xd2, 0xf3, 0x28, 0x00, 0xda, 0x00, 
-	0x20, 0x00, 0x90, 0x01, 0x2e, 0x2e, 0xd1, 0x2a, 
-	0x20, 0x00, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, 
-	0x91, 0x0b, 0x2e, 0x2a, 0xd1, 0x0e, 0x68, 0x38, 
-	0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, 
-	0x60, 0x38, 0x38, 0x80, 0xe0, 0x00, 0xe2, 0x67, 
-	0x6f, 0xc0, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, 
-	0x91, 0x0b, 0xe0, 0x0f, 0x49, 0xb8, 0x5d, 0x8a, 
-	0x09, 0x92, 0xd3, 0x0b, 0x00, 0x83, 0x18, 0x18, 
-	0x00, 0x40, 0x19, 0x80, 0x9a, 0x0b, 0x78, 0x16, 
-	0x32, 0x01, 0x92, 0x0b, 0x5d, 0x8a, 0x38, 0x30, 
-	0x09, 0x92, 0xd2, 0xf3, 0x28, 0x00, 0xdb, 0x02, 
-	0x23, 0x10, 0x43, 0x1d, 0x60, 0xa0, 0x2e, 0x6c, 
-	0xd0, 0x01, 0x2e, 0x4c, 0xd1, 0x0d, 0x99, 0x0b, 
-	0x78, 0x0e, 0x31, 0x01, 0x91, 0x0b, 0x2e, 0x6c, 
-	0xd0, 0x01, 0x2e, 0x4c, 0xd1, 0x02, 0x23, 0x40, 
-	0x43, 0x1d, 0xe0, 0x06, 0x23, 0x20, 0x43, 0x1d, 
-	0xe0, 0x07, 0x2e, 0x68, 0xd1, 0x05, 0x23, 0x80, 
-	0x43, 0x1d, 0x99, 0x0b, 0x78, 0x0e, 0x31, 0x01, 
-	0x91, 0x0b, 0x2e, 0x67, 0xd0, 0x63, 0xdc, 0x12, 
-	0x2e, 0x63, 0xd0, 0x21, 0xdc, 0x08, 0x2e, 0x00, 
-	0xd0, 0x5e, 0x2e, 0x45, 0xd0, 0x5b, 0x2e, 0x47, 
-	0xd0, 0x59, 0x2e, 0x58, 0xd0, 0x59, 0xe0, 0x1f, 
-	0x2e, 0x64, 0xd0, 0x57, 0x2e, 0x65, 0xd0, 0x52, 
-	0x2e, 0x66, 0xd0, 0x50, 0xe0, 0x18, 0x2e, 0x70, 
-	0xd0, 0x55, 0xdc, 0x06, 0x2e, 0x69, 0xd0, 0x4d, 
-	0x2e, 0x6e, 0xd0, 0x51, 0x2e, 0x6f, 0xd0, 0x5c, 
-	0xe0, 0x0e, 0x2e, 0x73, 0xd0, 0x5a, 0x2e, 0x75, 
-	0xd0, 0x59, 0x2e, 0x78, 0xd0, 0x58, 0xe0, 0x07, 
-	0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 
-	0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc6, 
-	0x98, 0x01, 0x38, 0x01, 0x90, 0x01, 0x07, 0xe8, 
-	0x0f, 0xc0, 0x90, 0x06, 0xd1, 0x16, 0x0a, 0x68, 
-	0xd3, 0x01, 0x20, 0x30, 0xe0, 0x00, 0x20, 0x20, 
-	0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, 0x38, 0x01, 
-	0x90, 0x01, 0xd4, 0x0b, 0x98, 0x02, 0x30, 0x01, 
-	0x90, 0x02, 0x99, 0x0a, 0x6a, 0x22, 0x1c, 0x28, 
-	0xf7, 0xfe, 0xfe, 0x72, 0x98, 0x01, 0x38, 0x01, 
-	0x90, 0x01, 0xd5, 0xf3, 0x99, 0x0a, 0x6a, 0x22, 
-	0x1c, 0x30, 0xf7, 0xfe, 0xfe, 0x69, 0x98, 0x02, 
-	0x30, 0x01, 0x90, 0x02, 0x98, 0x06, 0x28, 0x00, 
-	0xd0, 0x52, 0x98, 0x01, 0x1e, 0x45, 0xd4, 0x58, 
-	0x98, 0x02, 0x30, 0x01, 0x90, 0x02, 0x20, 0x20, 
-	0x99, 0x0a, 0x6a, 0x22, 0xf7, 0xfe, 0xfe, 0x58, 
-	0x3d, 0x01, 0xd5, 0xf5, 0xe1, 0xc4, 0xe1, 0xa0, 
-	0xe0, 0x01, 0xe0, 0x8e, 0xe1, 0x53, 0x99, 0x0b, 
-	0x39, 0x01, 0x91, 0x0b, 0xe1, 0xbc, 0xe0, 0xed, 
-	0x0a, 0x28, 0xd3, 0x0e, 0x98, 0x02, 0x68, 0x39, 
-	0x31, 0x03, 0x08, 0x89, 0x00, 0x89, 0x31, 0x04, 
-	0x60, 0x39, 0x39, 0x80, 0x6f, 0xc9, 0x80, 0x08, 
-	0xe1, 0xae, 0xe0, 0xf5, 0xe0, 0x1d, 0xe1, 0x1b, 
-	0xe0, 0xa0, 0x09, 0xe8, 0xd3, 0x0c, 0x98, 0x02, 
-	0x68, 0x39, 0x31, 0x03, 0x08, 0x89, 0x00, 0x89, 
-	0x31, 0x04, 0x60, 0x39, 0x39, 0x80, 0x6f, 0xcd, 
-	0xf0, 0x01, 0xfa, 0xda, 0xc5, 0x03, 0xe1, 0x9b, 
-	0x20, 0x20, 0x40, 0x28, 0x99, 0x02, 0x68, 0x38, 
-	0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, 
-	0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, 0x60, 0x01, 
-	0xe1, 0x8e, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 
-	0x00, 0x80, 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 
-	0x6f, 0xc0, 0xb0, 0x81, 0x90, 0x00, 0x09, 0x68, 
-	0xd3, 0x0c, 0x26, 0x00, 0x68, 0xa0, 0xe0, 0x01, 
-	0xe1, 0x7e, 0x36, 0x01, 0x42, 0x86, 0xda, 0x09, 
-	0x99, 0x00, 0x5d, 0x89, 0x29, 0x00, 0xd1, 0xf8, 
-	0xe0, 0x04, 0xe1, 0x75, 0x98, 0x00, 0xf7, 0xfe, 
-	0xfe, 0xcd, 0x1c, 0x06, 0x98, 0x02, 0x1b, 0x80, 
-	0x90, 0x02, 0x07, 0xe8, 0x0f, 0xc0, 0x90, 0x06, 
-	0xd1, 0x16, 0x0a, 0x68, 0xd3, 0x01, 0x20, 0x30, 
-	0xe0, 0x00, 0x20, 0x20, 0x06, 0x05, 0x0e, 0x2d, 
-	0x98, 0x02, 0x38, 0x01, 0x90, 0x02, 0xd4, 0x0b, 
-	0x98, 0x03, 0x30, 0x01, 0x90, 0x03, 0x99, 0x0b, 
-	0x6a, 0x22, 0x1c, 0x28, 0xf7, 0xfe, 0xfd, 0xe8, 
-	0x98, 0x02, 0x38, 0x01, 0x90, 0x02, 0xd5, 0xf3, 
-	0x25, 0x00, 0x2e, 0x00, 0xdd, 0x08, 0x99, 0x00, 
-	0x5d, 0x48, 0x99, 0x0b, 0x6a, 0x22, 0xf7, 0xfe, 
-	0xfd, 0xdb, 0x35, 0x01, 0x42, 0xb5, 0xdb, 0xf6, 
-	0x98, 0x03, 0x19, 0x80, 0x90, 0x03, 0x98, 0x06, 
-	0x28, 0x00, 0xd0, 0x0c, 0x98, 0x02, 0x1e, 0x45, 
-	0xd4, 0x09, 0x98, 0x03, 0x30, 0x01, 0x90, 0x03, 
-	0x20, 0x20, 0x99, 0x0b, 0x6a, 0x22, 0xf7, 0xfe, 
-	0xfd, 0xc7, 0x3d, 0x01, 0xd5, 0xf5, 0xb0, 0x01, 
-	0xe1, 0x32, 0x09, 0xe8, 0xd3, 0x0c, 0x68, 0x38, 
-	0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x08, 
-	0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, 0x22, 0x08, 
-	0x98, 0x07, 0xf7, 0xfe, 0xfe, 0x0f, 0xe0, 0x08, 
-	0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 
-	0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, 
-	0x93, 0x00, 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, 
-	0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x00, 0xa0, 0x17, 
-	0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x1a, 
-	0xe0, 0x00, 0xa0, 0x18, 0x60, 0x60, 0x09, 0x68, 
-	0xd3, 0x61, 0xe0, 0xe3, 0x09, 0xe8, 0xd3, 0x0c, 
-	0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 
-	0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, 
-	0x22, 0x08, 0x98, 0x07, 0xf7, 0xfe, 0xfd, 0xe6, 
-	0xe0, 0x08, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 
-	0x00, 0x80, 0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 
-	0x6f, 0xc3, 0x93, 0x00, 0x0a, 0x28, 0xd3, 0x16, 
-	0x9b, 0x00, 0x04, 0x1b, 0x0c, 0x1b, 0xe0, 0x11, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x22, 0x44, 0x30, 0x31, 0x32, 0x33, 
-	0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 
-	0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x58, 0x00, 0x00, 0x93, 0x00, 0xa0, 0x78, 
-	0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x7b, 
-	0xe0, 0x00, 0xa0, 0x79, 0x60, 0x60, 0x09, 0x68, 
-	0xd3, 0x25, 0xe0, 0xa7, 0x68, 0x38, 0x30, 0x03, 
-	0x08, 0x80, 0x00, 0x80, 0x30, 0x04, 0x60, 0x38, 
-	0x38, 0x80, 0x6f, 0xc3, 0x93, 0x00, 0xa0, 0x6e, 
-	0x62, 0xa0, 0x09, 0x28, 0xd3, 0x01, 0xa0, 0x72, 
-	0xe0, 0x00, 0xa0, 0x6f, 0x60, 0x60, 0x20, 0x08, 
-	0x23, 0x10, 0x43, 0x1d, 0x60, 0xa0, 0xe0, 0x7e, 
-	0x09, 0xe8, 0xd3, 0x0d, 0x68, 0x38, 0x30, 0x03, 
-	0x08, 0x80, 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, 
-	0x39, 0x01, 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, 
-	0xf7, 0xfe, 0xfd, 0x94, 0xe0, 0x09, 0xe0, 0x9b, 
-	0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 
-	0x30, 0x04, 0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, 
-	0x93, 0x00, 0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, 
-	0x04, 0x1b, 0x0c, 0x1b, 0x93, 0x00, 0x09, 0x28, 
-	0xd3, 0x01, 0xa0, 0x5e, 0xe0, 0x00, 0xa0, 0x5a, 
-	0x60, 0x60, 0x09, 0x68, 0xd3, 0x57, 0xe0, 0x69, 
-	0x09, 0xe8, 0xd3, 0x0c, 0x68, 0x38, 0x30, 0x03, 
-	0x08, 0x80, 0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, 
-	0x39, 0x01, 0x60, 0x38, 0x22, 0x08, 0x98, 0x07, 
-	0xf7, 0xfe, 0xfd, 0x6c, 0xe0, 0x08, 0x68, 0x38, 
-	0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, 
-	0x60, 0x38, 0x38, 0x80, 0x6f, 0xc3, 0x93, 0x00, 
-	0x0a, 0x28, 0xd3, 0x03, 0x9b, 0x00, 0x04, 0x1b, 
-	0x0c, 0x1b, 0x93, 0x00, 0xa0, 0x48, 0x60, 0x60, 
-	0x09, 0x68, 0xd3, 0x34, 0xe0, 0x46, 0x09, 0xe8, 
-	0xd3, 0x21, 0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 
-	0x00, 0x80, 0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, 
-	0x60, 0x38, 0x22, 0x08, 0x98, 0x07, 0xf7, 0xfe, 
-	0xfd, 0x49, 0x99, 0x07, 0x9b, 0x09, 0x68, 0x08, 
-	0x90, 0x04, 0x68, 0x49, 0x91, 0x03, 0xcb, 0x0c, 
-	0xf0, 0x01, 0xf9, 0x94, 0x28, 0x00, 0xd0, 0x08, 
-	0x98, 0x04, 0x99, 0x03, 0xf0, 0x01, 0xf9, 0x98, 
-	0x9a, 0x07, 0xc2, 0x03, 0x20, 0x00, 0x43, 0xc0, 
-	0xe0, 0x14, 0x20, 0x00, 0xe0, 0x12, 0x68, 0x38, 
-	0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 0x30, 0x04, 
-	0x60, 0x38, 0x38, 0x80, 0x6f, 0xc0, 0x0a, 0x29, 
-	0xd3, 0x01, 0x04, 0x00, 0x14, 0x00, 0x28, 0x00, 
-	0xda, 0x02, 0x42, 0x43, 0xe0, 0x01, 0xe0, 0x2b, 
-	0x1c, 0x03, 0x93, 0x00, 0x28, 0x00, 0xda, 0x01, 
-	0xa0, 0x2d, 0xe0, 0x08, 0x08, 0xa8, 0xd3, 0x01, 
-	0xa0, 0x2c, 0xe0, 0x04, 0x08, 0xe8, 0xd3, 0x01, 
-	0xa0, 0x2b, 0xe0, 0x00, 0xa0, 0x24, 0x60, 0x60, 
-	0x09, 0x68, 0xd3, 0x19, 0x4b, 0x29, 0x40, 0x1d, 
-	0xe0, 0x16, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x1d, 
-	0x09, 0x68, 0xd2, 0x01, 0x20, 0x06, 0x60, 0xa0, 
-	0x68, 0x38, 0x30, 0x03, 0x08, 0x80, 0x00, 0x80, 
-	0x30, 0x08, 0x1f, 0xc1, 0x39, 0x01, 0x60, 0x38, 
-	0x22, 0x08, 0x98, 0x08, 0xf7, 0xfe, 0xfc, 0xfa, 
-	0x20, 0x00, 0x23, 0x00, 0x60, 0x60, 0x93, 0x00, 
-	0x98, 0x01, 0x62, 0xe0, 0x60, 0x25, 0x98, 0x0a, 
-	0x9b, 0x00, 0x1c, 0x31, 0x1c, 0x22, 0xf7, 0xff, 
-	0xfb, 0x3f, 0x99, 0x02, 0x18, 0x40, 0x90, 0x02, 
-	0xb0, 0x02, 0x99, 0x09, 0x78, 0x08, 0x31, 0x01, 
-	0x91, 0x09, 0x28, 0x00, 0xd0, 0x00, 0xe5, 0x29, 
-	0x98, 0x08, 0x6a, 0x61, 0xf7, 0xfe, 0xfc, 0x82, 
-	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0x43, 0xc0, 
-	0xe0, 0x00, 0x98, 0x00, 0xb0, 0x08, 0xb0, 0x04, 
-	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
-	0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 
-	0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x00, 0x00, 
-	0x40, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 
-	0x2d, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 
-	0x20, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0xff, 
-	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, 0x07, 0x2e, 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, 0xa9, 0xd0, 
-	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, 0x0e, 0xf4, 
-	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, 0xd0, 
-	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, 0x04, 0x1d, 
-	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, 0x04, 0x15, 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, 0x0e, 0xb5, 
-	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, 0x03, 0xde, 
-	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, 0x03, 0xfe, 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, 0x0e, 0x72, 
-	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, 0x0e, 0x68, 
-	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, 0x21, 0x4c, 0x2e, 0x08, 0x21, 0x18, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0xcc, 0x18, 
-	0x2e, 0x02, 0xcc, 0x14, 0x2e, 0x02, 0xcc, 0x10, 
-	0x2e, 0x08, 0xd7, 0x68, 0x2e, 0x00, 0x1a, 0xf9, 
-	0x2e, 0x02, 0x0e, 0x19, 0x2e, 0x02, 0x0c, 0xcd, 
-	0x2e, 0x02, 0x0d, 0x8d, 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, 0xfe, 0x80, 
-	0x2e, 0x01, 0xfe, 0x98, 0x2e, 0x01, 0xfe, 0xb4, 
-	0x2e, 0x01, 0xfe, 0xd4, 0x2e, 0x01, 0xfe, 0xe8, 
-	0x2e, 0x01, 0xfe, 0xf8, 0x2e, 0x01, 0xff, 0x10, 
-	0x2e, 0x01, 0xff, 0x28, 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, 
-	0x17, 0xc3, 0x40, 0x58, 0x1a, 0xc0, 0x1c, 0x01, 
-	0x08, 0x40, 0x08, 0x42, 0x18, 0x80, 0x09, 0x02, 
-	0x18, 0x80, 0x0a, 0x02, 0x18, 0x80, 0x0c, 0x02, 
-	0x18, 0x80, 0x08, 0xc0, 0x00, 0x82, 0x18, 0x12, 
-	0x00, 0x52, 0x1a, 0x89, 0x29, 0x0a, 0xdb, 0x01, 
-	0x1c, 0x40, 0x39, 0x0a, 0x40, 0x58, 0x1a, 0xc0, 
-	0x40, 0x59, 0x1a, 0xc9, 0x47, 0x70, 0x00, 0x00, 
-	0x47, 0x78, 0x00, 0x00, 0xe1, 0x30, 0x00, 0x02, 
-	0x01, 0x31, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x05, 
-	0xe1, 0x80, 0xc0, 0x02, 0xe3, 0x3c, 0x01, 0x02, 
-	0x01, 0x91, 0xc0, 0x03, 0x03, 0xa0, 0x00, 0x01, 
-	0x13, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0xc4, 0xff, 0xe3, 0x8c, 0xc6, 0x0e, 
-	0xe1, 0x5c, 0x00, 0x80, 0x83, 0xa0, 0x00, 0x01, 
-	0x81, 0x2f, 0xff, 0x1e, 0x03, 0x51, 0x00, 0x00, 
-	0x03, 0xa0, 0x00, 0x01, 0x13, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 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, 0x00, 0x04, 0x70, 
-	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, 0xe9, 0x2d, 0x40, 0x00, 
-	0xe2, 0x00, 0xc1, 0x02, 0xe1, 0xb0, 0x30, 0x80, 
-	0xe1, 0xb0, 0x3a, 0xa3, 0x0a, 0x00, 0x00, 0x0b, 
-	0xe2, 0x83, 0xe0, 0x01, 0xe3, 0x5e, 0x0b, 0x02, 
-	0xaa, 0x00, 0x00, 0x39, 0xe0, 0x93, 0x30, 0x02, 
-	0xda, 0x00, 0x00, 0x11, 0xe2, 0x83, 0xe0, 0x01, 
-	0xe3, 0x5e, 0x0b, 0x02, 0xaa, 0x00, 0x00, 0x37, 
-	0xe1, 0x83, 0x06, 0x00, 0xe1, 0x8c, 0x06, 0x60, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x91, 0x30, 0x80, 0x01, 0xa0, 0x00, 0x0c, 
-	0x08, 0xbd, 0x40, 0x00, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe1, 0xb0, 0x10, 0x81, 0xe0, 0xa0, 0x00, 0x00, 
-	0xe2, 0x42, 0x20, 0x01, 0xe3, 0x10, 0x06, 0x01, 
-	0x0a, 0xff, 0xff, 0xfa, 0xe3, 0xa0, 0x30, 0x01, 
-	0xea, 0xff, 0xff, 0xeb, 0xe1, 0xa0, 0x05, 0x80, 
-	0xe3, 0x80, 0x01, 0x02, 0xe3, 0x73, 0x00, 0x14, 
-	0xca, 0x00, 0x00, 0x05, 0xe3, 0x73, 0x00, 0x34, 
-	0xaa, 0x00, 0x00, 0x0d, 0xe1, 0xa0, 0x00, 0x0c, 
-	0xe3, 0xa0, 0x10, 0x00, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xa0, 0x05, 0xa0, 
-	0xe2, 0x63, 0x30, 0x01, 0xe2, 0x63, 0x20, 0x20, 
-	0xe1, 0xa0, 0xe2, 0x11, 0xe1, 0xb0, 0xe0, 0x8e, 
-	0xe1, 0xa0, 0xe2, 0x10, 0xe1, 0x8e, 0x13, 0x31, 
-	0xe1, 0xa0, 0x03, 0x30, 0xe1, 0x80, 0x00, 0x0c, 
-	0xea, 0x00, 0x00, 0x0a, 0xe2, 0x93, 0x30, 0x20, 
-	0xda, 0x00, 0x00, 0x03, 0xe1, 0x80, 0x0a, 0xa1, 
-	0xe1, 0xb0, 0xe3, 0x11, 0xe2, 0x63, 0x30, 0x0c, 
-	0xea, 0x00, 0x00, 0x02, 0xe2, 0x83, 0x30, 0x15, 
-	0xe1, 0x91, 0xe3, 0x10, 0xe2, 0x63, 0x30, 0x21, 
-	0xe1, 0xa0, 0x13, 0x30, 0xe1, 0xa0, 0x00, 0x0c, 
-	0x03, 0x11, 0x00, 0x01, 0x98, 0xbd, 0x40, 0x00, 
-	0x91, 0x2f, 0xff, 0x1e, 0xe2, 0x91, 0x10, 0x01, 
-	0x22, 0x80, 0x00, 0x01, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe8, 0xbd, 0x40, 0x00, 
-	0xe3, 0xa0, 0x10, 0x01, 0xea, 0x00, 0x04, 0x1e, 
-	0xe8, 0xbd, 0x40, 0x00, 0xe3, 0xa0, 0x10, 0x01, 
-	0xea, 0x00, 0x04, 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, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe8, 0x93, 0x00, 0x38, 
-	0xe3, 0x10, 0x01, 0x01, 0x03, 0x13, 0x01, 0x01, 
-	0x1a, 0x00, 0x00, 0x03, 0xeb, 0x00, 0x03, 0xe5, 
-	0xeb, 0x00, 0x05, 0x39, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x04, 0x7f, 
-	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, 0xd7, 
-	0xeb, 0x00, 0x05, 0x2b, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe2, 0x4f, 0xe0, 0x14, 
-	0xe3, 0xa0, 0xb0, 0x00, 0xea, 0x00, 0x04, 0x71, 
-	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, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe1, 0xb0, 0xc0, 0x82, 
-	0x03, 0x33, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x3c, 
-	0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x2a, 0x2c, 
-	0xe1, 0xa0, 0x55, 0x83, 0xe1, 0x88, 0x4a, 0xa3, 
-	0x12, 0x82, 0x2b, 0x1e, 0xe1, 0xa0, 0x30, 0x62, 
-	0x13, 0x84, 0x41, 0x02, 0xe1, 0xb0, 0xca, 0xcc, 
-	0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0xf8, 
-	0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x16, 
-	0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x3c, 0xe1, 0xa0, 0x85, 0x0c, 
-	0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, 
-	0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, 
-	0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, 
-	0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, 
-	0x0a, 0x00, 0x04, 0xb9, 0xe3, 0x7c, 0x00, 0x01, 
-	0x0a, 0x00, 0x00, 0x16, 0xe3, 0xa0, 0xb0, 0x02, 
-	0xeb, 0x00, 0x05, 0x15, 0xeb, 0xff, 0xff, 0x5f, 
-	0xe3, 0x13, 0x02, 0x02, 0x08, 0xbd, 0x4b, 0xf0, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x83, 0x35, 0x02, 
-	0xea, 0x00, 0x04, 0x0f, 0xe3, 0x83, 0x31, 0x01, 
-	0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x0e, 0xe1, 0xa0, 0x85, 0x0c, 
-	0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, 
-	0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, 
-	0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, 
-	0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, 
-	0x0a, 0x00, 0x04, 0xa1, 0xe3, 0x7c, 0x00, 0x01, 
-	0x03, 0x80, 0x01, 0x01, 0xe2, 0x4f, 0xe0, 0x60, 
-	0xe3, 0xa0, 0xb0, 0x02, 0xea, 0x00, 0x06, 0x2b, 
-	0xe1, 0x95, 0xc0, 0x84, 0x0a, 0x00, 0x00, 0x13, 
-	0xe1, 0xb0, 0x40, 0x84, 0x5a, 0x00, 0x00, 0x0d, 
-	0xe3, 0xe0, 0x00, 0x00, 0xe8, 0xbd, 0x4b, 0xf0, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0xb0, 0xc0, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x07, 
-	0xe1, 0xf0, 0xca, 0x4c, 0x08, 0xbd, 0x4b, 0xf0, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x3c, 0x00, 0x01, 
-	0x1a, 0x00, 0x00, 0x04, 0xe1, 0x91, 0xc6, 0x00, 
-	0x08, 0xbd, 0x4b, 0xf0, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x35, 0x06, 0xea, 0x00, 0x03, 0xe8, 
-	0xe3, 0xa0, 0x35, 0x0a, 0xea, 0x00, 0x03, 0xe6, 
-	0xe0, 0x20, 0x00, 0x03, 0xe2, 0x00, 0x01, 0x02, 
-	0xe8, 0xbd, 0x4b, 0xf0, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe1, 0xb0, 0xc0, 0x82, 0x03, 0x33, 0x00, 0x00, 
-	0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x2a, 0x2c, 
-	0xe1, 0xa0, 0x55, 0x83, 0xe1, 0x88, 0x4a, 0xa3, 
-	0x12, 0x82, 0x2b, 0x1e, 0xe1, 0xa0, 0x30, 0x62, 
-	0x13, 0x84, 0x41, 0x02, 0xe1, 0xb0, 0xca, 0xcc, 
-	0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0xa4, 
-	0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x14, 
-	0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, 
-	0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, 
-	0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x88, 0x1a, 0xa1, 
-	0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, 
-	0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, 
-	0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0x66, 
-	0xe3, 0x7c, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x14, 
-	0xeb, 0x00, 0x02, 0xdc, 0xeb, 0xff, 0xff, 0x0d, 
-	0xe3, 0x13, 0x02, 0x02, 0x08, 0xbd, 0x4b, 0xf0, 
-	0x01, 0x2f, 0xff, 0x1e, 0xe3, 0x83, 0x35, 0x02, 
-	0xea, 0x00, 0x03, 0xbd, 0xe3, 0x83, 0x31, 0x01, 
-	0xe1, 0xb0, 0xc0, 0x80, 0x03, 0x31, 0x00, 0x00, 
-	0xe1, 0xa0, 0x85, 0x0c, 0xe1, 0xa0, 0x0a, 0x2c, 
-	0xe1, 0xa0, 0x25, 0x81, 0xe1, 0x88, 0x1a, 0xa1, 
-	0x12, 0x80, 0x0b, 0x1e, 0xe1, 0xa0, 0x00, 0x60, 
-	0x13, 0x81, 0x11, 0x02, 0xe1, 0xb0, 0xca, 0xcc, 
-	0x02, 0x8f, 0xe0, 0x08, 0x0a, 0x00, 0x04, 0x50, 
-	0xe3, 0x7c, 0x00, 0x01, 0x03, 0x80, 0x01, 0x01, 
-	0xe2, 0x4f, 0xe0, 0x5c, 0xe3, 0xa0, 0xb0, 0x02, 
-	0xea, 0x00, 0x03, 0x64, 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, 0xff, 0xfc, 0x60, 0xe1, 0xb0, 0x20, 0x82, 
-	0x8a, 0x00, 0x00, 0x18, 0xe3, 0xa0, 0x00, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x03, 0x53, 0x00, 0x00, 
-	0x0a, 0xff, 0xff, 0xf2, 0xea, 0xff, 0xfc, 0x5d, 
-	0xe1, 0x50, 0x00, 0x0c, 0x03, 0x51, 0x00, 0x00, 
-	0x8a, 0xff, 0xfc, 0x56, 0xe1, 0xb0, 0x20, 0x82, 
-	0x33, 0xa0, 0x00, 0x00, 0x23, 0xa0, 0x00, 0x01, 
-	0x03, 0x33, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfc, 0x4d, 
-	0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x01, 
-	0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, 
-	0x01, 0x51, 0x00, 0x03, 0x33, 0xa0, 0x00, 0x00, 
-	0x23, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, 
-	0x83, 0xa0, 0x00, 0x00, 0x93, 0xa0, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 
-	0xe1, 0xb0, 0x20, 0x80, 0xe1, 0xa0, 0x2a, 0xa2, 
-	0xe1, 0xa0, 0x05, 0x80, 0xe1, 0x80, 0x0a, 0xa1, 
-	0xe3, 0x80, 0x01, 0x02, 0xe2, 0x42, 0x2c, 0x03, 
-	0x2a, 0x00, 0x00, 0x08, 0xe2, 0x52, 0x20, 0xff, 
-	0x4a, 0x00, 0x00, 0x04, 0xe2, 0x72, 0x20, 0x1f, 
-	0xc1, 0xa0, 0x02, 0x30, 0xc1, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xc0, 0x01, 0x02, 0xea, 0x00, 0x00, 0x09, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe2, 0x52, 0x20, 0xff, 0x4a, 0xff, 0xff, 0xfb, 
-	0xe2, 0x72, 0x20, 0x1f, 0xc1, 0xa0, 0x02, 0x30, 
-	0xc2, 0x60, 0x00, 0x00, 0xc1, 0x2f, 0xff, 0x1e, 
-	0x01, 0x91, 0xc0, 0x80, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe3, 0xa0, 0x36, 0x12, 0xe2, 0x82, 0x2e, 0x3e, 
-	0xe3, 0x72, 0x00, 0x01, 0x1a, 0x00, 0x03, 0x63, 
-	0xe1, 0x91, 0xc0, 0x80, 0x13, 0xa0, 0x37, 0x42, 
-	0xea, 0x00, 0x03, 0x60, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe2, 0x22, 0x21, 0x02, 
-	0xea, 0x00, 0x00, 0x01, 0x47, 0x78, 0x00, 0x00, 
-	0xe9, 0x2d, 0x4b, 0xf0, 0xe1, 0xb0, 0xc0, 0x82, 
-	0x03, 0x33, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, 
-	0xe1, 0xa0, 0x2a, 0x2c, 0xe1, 0xa0, 0x55, 0x83, 
-	0xe1, 0x88, 0x4a, 0xa3, 0x12, 0x82, 0x2b, 0x1e, 
-	0xe1, 0xa0, 0x30, 0x62, 0x13, 0x84, 0x41, 0x02, 
-	0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, 
-	0x0a, 0x00, 0x04, 0x1d, 0xe3, 0x7c, 0x00, 0x01, 
-	0x0a, 0x00, 0x00, 0x14, 0xe1, 0xb0, 0xc0, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, 
-	0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, 
-	0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, 
-	0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, 
-	0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, 
-	0x0a, 0x00, 0x03, 0xdf, 0xe3, 0x7c, 0x00, 0x01, 
-	0x0a, 0x00, 0x00, 0x14, 0xeb, 0x00, 0x05, 0xbb, 
-	0xeb, 0xff, 0xfe, 0x86, 0xe3, 0x13, 0x02, 0x02, 
-	0x08, 0xbd, 0x4b, 0xf0, 0x01, 0x2f, 0xff, 0x1e, 
-	0xe3, 0x83, 0x35, 0x02, 0xea, 0x00, 0x03, 0x36, 
-	0xe3, 0x83, 0x31, 0x01, 0xe1, 0xb0, 0xc0, 0x80, 
-	0x03, 0x31, 0x00, 0x00, 0xe1, 0xa0, 0x85, 0x0c, 
-	0xe1, 0xa0, 0x0a, 0x2c, 0xe1, 0xa0, 0x25, 0x81, 
-	0xe1, 0x88, 0x1a, 0xa1, 0x12, 0x80, 0x0b, 0x1e, 
-	0xe1, 0xa0, 0x00, 0x60, 0x13, 0x81, 0x11, 0x02, 
-	0xe1, 0xb0, 0xca, 0xcc, 0x02, 0x8f, 0xe0, 0x08, 
-	0x0a, 0x00, 0x03, 0xc9, 0xe3, 0x7c, 0x00, 0x01, 
-	0x03, 0x80, 0x01, 0x01, 0xe2, 0x4f, 0xe0, 0x5c, 
-	0xe3, 0xa0, 0xb0, 0x02, 0xea, 0x00, 0x05, 0xff, 
-	0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x4b, 0xf0, 
-	0xe2, 0x20, 0x01, 0x02, 0xea, 0xff, 0xff, 0xc6, 
-	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, 0xfb, 0xd5, 
-	0xe1, 0xb0, 0x20, 0x82, 0x8a, 0x00, 0x00, 0x17, 
-	0xe3, 0xa0, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x03, 0x53, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xf2, 
-	0xea, 0xff, 0xfb, 0xd2, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xcb, 
-	0xe1, 0xb0, 0x20, 0x82, 0x03, 0x33, 0x00, 0x00, 
-	0x83, 0xa0, 0x00, 0x00, 0x93, 0xa0, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x0c, 
-	0x03, 0x51, 0x00, 0x00, 0x8a, 0xff, 0xfb, 0xc3, 
-	0xe1, 0xb0, 0x20, 0x82, 0x23, 0xa0, 0x00, 0x00, 
-	0x21, 0x2f, 0xff, 0x1e, 0xe1, 0x50, 0x00, 0x02, 
-	0x01, 0x51, 0x00, 0x03, 0x93, 0xa0, 0x00, 0x01, 
-	0x83, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 
-	0xe1, 0x50, 0x00, 0x02, 0x01, 0x51, 0x00, 0x03, 
-	0x33, 0xa0, 0x00, 0x00, 0x23, 0xa0, 0x00, 0x01, 
-	0xe1, 0x2f, 0xff, 0x1e, 0x42, 0x99, 0xd1, 0x03, 
-	0x42, 0x90, 0xd1, 0x01, 0x20, 0x00, 0x47, 0x70, 
-	0x20, 0x01, 0x47, 0x70, 0xb5, 0x70, 0x1c, 0x04, 
-	0x1c, 0x0d, 0x1c, 0x16, 0x46, 0x9e, 0x47, 0x78, 
-	0xe3, 0xa0, 0x00, 0x00, 0xe3, 0xa0, 0x10, 0x00, 
-	0xe1, 0xa0, 0x30, 0x05, 0xe1, 0xa0, 0x20, 0x04, 
-	0xe3, 0x3e, 0x00, 0x00, 0x03, 0x36, 0x00, 0x00, 
-	0x0a, 0x00, 0x00, 0x14, 0xe3, 0xb0, 0xc0, 0x00, 
-	0xe0, 0x96, 0x60, 0x06, 0xe0, 0xbe, 0xe0, 0x0e, 
-	0x2a, 0x00, 0x00, 0x04, 0xe1, 0x5e, 0x00, 0x03, 
-	0x01, 0x56, 0x00, 0x02, 0x92, 0x8c, 0xc0, 0x01, 
-	0x9a, 0xff, 0xff, 0xf8, 0xe2, 0x9c, 0xc0, 0x00, 
-	0xe1, 0xb0, 0xe0, 0x6e, 0xe1, 0xa0, 0x60, 0x66, 
-	0xe0, 0x52, 0x40, 0x06, 0xe0, 0xd3, 0x50, 0x0e, 
-	0x21, 0xa0, 0x30, 0x05, 0x21, 0xa0, 0x20, 0x04, 
-	0xe0, 0xb0, 0x00, 0x00, 0xe0, 0xa1, 0x10, 0x01, 
-	0xe1, 0xb0, 0xe0, 0xae, 0xe1, 0xa0, 0x60, 0x66, 
-	0xe2, 0x5c, 0xc0, 0x01, 0xaa, 0xff, 0xff, 0xf5, 
-	0xe8, 0xbd, 0x40, 0x70, 0xe1, 0x2f, 0xff, 0x1e, 
-	0x18, 0x80, 0x41, 0x59, 0x47, 0x70, 0x00, 0x00, 
-	0x1c, 0x01, 0x08, 0x40, 0x08, 0x42, 0x18, 0x80, 
-	0x09, 0x02, 0x18, 0x80, 0x0a, 0x02, 0x18, 0x80, 
-	0x0c, 0x02, 0x18, 0x80, 0x08, 0xc0, 0x00, 0x82, 
-	0x18, 0x12, 0x00, 0x52, 0x1a, 0x89, 0x29, 0x0a, 
-	0xdb, 0x01, 0x1c, 0x40, 0x39, 0x0a, 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, 0x22, 0x44, 0x2e, 0x03, 0xa9, 0x2c, 
-	0x17, 0xc1, 0x47, 0x70, 0x42, 0x99, 0xdb, 0x04, 
-	0xdc, 0x01, 0x42, 0x90, 0xd3, 0x01, 0x20, 0x00, 
-	0x47, 0x70, 0x20, 0x01, 0x47, 0x70, 0x00, 0x00, 
-	0x1c, 0x0b, 0x21, 0x00, 0x42, 0x40, 0x41, 0x99, 
-	0x47, 0x70, 0x00, 0x00, 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, 0x23, 0x44, 
-	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, 0xfb, 0x87, 
-	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, 0xfb, 0xa4, 0x2e, 0x08, 0x21, 0x34, 
-	0x2e, 0x08, 0x21, 0x46, 0x2e, 0x02, 0x24, 0x85, 
-	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, 
-	0xf7, 0xff, 0xff, 0x06, 0x48, 0x19, 0x28, 0x00, 
-	0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x48, 0x18, 
-	0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xfb, 0xf8, 
-	0x48, 0x16, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 
-	0xfd, 0x69, 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, 0xff, 0x6e, 
-	0x2f, 0x00, 0xd0, 0x01, 0xf7, 0xfd, 0xfa, 0x5a, 
-	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x3a, 0x74, 0x74, 0x00, 0x2e, 0x08, 0x23, 0x48, 
-	0x2e, 0x08, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x02, 0x0b, 0x1d, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x02, 0x25, 0x15, 0x2e, 0x02, 0x28, 0x01, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x02, 0x2c, 0x29, 
-	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, 0xfd, 0xfa, 0x22, 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, 0xff, 0x7a, 
-	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x23, 0x48, 
-	0x2e, 0x08, 0x23, 0x48, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x02, 0x2c, 0xc9, 0xb5, 0x90, 0x1c, 0x0c, 
-	0x21, 0x01, 0x1c, 0x17, 0xf0, 0x01, 0xfb, 0x9c, 
-	0x21, 0x00, 0x1c, 0x20, 0xf0, 0x01, 0xfb, 0x98, 
-	0x21, 0x02, 0x1c, 0x38, 0xf0, 0x01, 0xfb, 0x94, 
-	0x20, 0x01, 0xf7, 0xfe, 0xfe, 0x95, 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, 0xfc, 0xc2, 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, 0xde, 0x4b, 0xd6, 0x93, 0x08, 
-	0x60, 0x18, 0x1c, 0x78, 0xf0, 0x01, 0xfc, 0xd8, 
-	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, 0xfd, 0x3a, 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, 
-	0xfe, 0x29, 0x01, 0x80, 0x99, 0x07, 0x18, 0x40, 
-	0xf0, 0x01, 0xfa, 0xdc, 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, 0xfb, 0xa8, 
-	0x1c, 0x01, 0x23, 0xff, 0x22, 0x01, 0x02, 0x52, 
-	0x98, 0x01, 0x33, 0x01, 0xf0, 0x01, 0xfe, 0x1e, 
-	0x98, 0x01, 0x68, 0xc0, 0x23, 0x01, 0x02, 0xdb, 
-	0x43, 0x18, 0x99, 0x01, 0x60, 0xc8, 0x08, 0xd8, 
-	0xf0, 0x01, 0xfb, 0x96, 0x1c, 0x01, 0x23, 0xff, 
-	0x22, 0x01, 0x02, 0x52, 0x98, 0x00, 0x33, 0x01, 
-	0xf0, 0x01, 0xfe, 0x0c, 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, 0xfe, 0xfc, 0x47, 0xf7, 0xfe, 0xfc, 0xc0, 
-	0x1e, 0x61, 0xa2, 0x19, 0xa0, 0x19, 0xf7, 0xff, 
-	0xfe, 0x15, 0xb0, 0x09, 0xb0, 0x01, 0xbc, 0xf0, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x22, 0x44, 
-	0x2e, 0x08, 0x23, 0x50, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0xd3, 0x48, 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, 
-	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, 0x21, 0x30, 0x2e, 0x08, 0x21, 0x3c, 
-	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, 0x06, 0x7c, 
-	0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x06, 0x93, 
-	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, 0x06, 0xbc, 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, 0x06, 0xc5, 0xe1, 0x94, 0x80, 0x05, 
-	0x1a, 0xff, 0xff, 0xf5, 0xe3, 0x80, 0x04, 0x61, 
-	0xe1, 0xa0, 0xf0, 0x0e, 0xe1, 0x95, 0x80, 0x84, 
-	0x1a, 0x00, 0x06, 0xb6, 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, 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, 0x23, 0x5c, 
-	0x2e, 0x08, 0x23, 0x60, 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, 0xfb, 0xe5, 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, 0x11, 0x01, 0x02, 
-	0x01, 0xa0, 0xf0, 0x0e, 0xe9, 0x2d, 0x40, 0x08, 
-	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, 0xe8, 0xbd, 0x80, 0x08, 
-	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, 
-	0xe8, 0xbd, 0x80, 0x08, 0xe3, 0x14, 0x01, 0x02, 
-	0x01, 0xa0, 0xf0, 0x0e, 0xe9, 0x2d, 0x40, 0x01, 
-	0xe3, 0xd4, 0x41, 0x02, 0x0a, 0x00, 0x00, 0x15, 
-	0xe1, 0xb0, 0x08, 0x24, 0x01, 0xa0, 0x48, 0x04, 
-	0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, 
-	0xe1, 0xb0, 0x0c, 0x24, 0x01, 0xa0, 0x44, 0x04, 
-	0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x0e, 0x24, 
-	0x01, 0xa0, 0x42, 0x04, 0x02, 0x8c, 0xc0, 0x04, 
-	0xe1, 0xb0, 0x0f, 0x24, 0x01, 0xa0, 0x41, 0x04, 
-	0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x0f, 0xa4, 
-	0x01, 0xa0, 0x40, 0x84, 0x02, 0x8c, 0xc0, 0x01, 
-	0xe2, 0x6c, 0x00, 0x20, 0xe1, 0x84, 0x40, 0x35, 
-	0xe1, 0xa0, 0x5c, 0x15, 0xe0, 0x43, 0x30, 0x0c, 
-	0xe2, 0x83, 0x30, 0x01, 0xe8, 0xbd, 0x80, 0x01, 
-	0xe1, 0xb0, 0x08, 0x25, 0x01, 0xa0, 0x58, 0x05, 
-	0x03, 0xa0, 0xc0, 0x10, 0x13, 0xa0, 0xc0, 0x00, 
-	0xe1, 0xb0, 0x0c, 0x25, 0x01, 0xa0, 0x54, 0x05, 
-	0x02, 0x8c, 0xc0, 0x08, 0xe1, 0xb0, 0x0e, 0x25, 
-	0x01, 0xa0, 0x52, 0x05, 0x02, 0x8c, 0xc0, 0x04, 
-	0xe1, 0xb0, 0x0f, 0x25, 0x01, 0xa0, 0x51, 0x05, 
-	0x02, 0x8c, 0xc0, 0x02, 0xe1, 0xb0, 0x0f, 0xa5, 
-	0x01, 0xa0, 0x50, 0x85, 0x02, 0x8c, 0xc0, 0x01, 
-	0xe1, 0xa0, 0x40, 0x05, 0xe3, 0xa0, 0x50, 0x00, 
-	0xe2, 0x43, 0x30, 0x1f, 0xe0, 0x43, 0x30, 0x0c, 
-	0xe8, 0xbd, 0x80, 0x01, 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, 0x04, 0x30, 
-	0xe3, 0x14, 0x01, 0x02, 0x0b, 0x00, 0x04, 0x15, 
-	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, 0x04, 0x45, 
-	0xe3, 0x80, 0x04, 0x61, 0xe1, 0xa0, 0xf0, 0x0e, 
-	0xe1, 0x92, 0x80, 0x81, 0x1a, 0x00, 0x04, 0x52, 
-	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, 0x04, 0x3d, 
-	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, 
-	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, 0x03, 0x7e, 
-	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, 0x02, 0xe6, 0xe3, 0x13, 0x01, 0x01, 
-	0x11, 0xb0, 0x68, 0x83, 0x1b, 0x00, 0x03, 0x1d, 
-	0xeb, 0xff, 0xff, 0x8a, 0xe3, 0x11, 0x01, 0x02, 
-	0x18, 0xbd, 0x80, 0x00, 0xe1, 0x91, 0xe0, 0x02, 
-	0x1b, 0x00, 0x03, 0x5b, 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, 0x03, 0xa5, 
-	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, 0x03, 0xae, 
-	0xe2, 0x00, 0x81, 0x02, 0xea, 0x00, 0x00, 0x04, 
-	0xe1, 0x95, 0x80, 0x84, 0x1a, 0x00, 0x03, 0xa1, 
-	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, 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, 0x71, 0x21, 0x03, 0xf0, 0x00, 
-	0xf9, 0x27, 0x2f, 0x04, 0xd1, 0x05, 0x20, 0x01, 
-	0xf7, 0xfd, 0xfc, 0x2c, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0xf7, 0xfe, 0xfc, 0xd3, 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, 0xfd, 0xfb, 0x7f, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x23, 0x48, 
-	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, 0xfb, 0xfe, 0x9c, 0x20, 0x00, 0xbc, 0x90, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, 
-	0x2e, 0x08, 0xd2, 0x18, 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, 0xd2, 0x18, 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, 0xd2, 0x18, 
-	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, 0x2c, 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, 0x02, 0x2b, 0xa9, 0x2e, 0x08, 0x23, 0x48, 
-	0xb5, 0x80, 0xb0, 0x83, 0x90, 0x00, 0x91, 0x01, 
-	0xf7, 0xfb, 0xfe, 0xf8, 0x90, 0x02, 0x46, 0x69, 
-	0x20, 0x01, 0xf0, 0x01, 0xf8, 0x49, 0x23, 0x01, 
-	0x1c, 0x07, 0x42, 0xd8, 0xd1, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x01, 0xf8, 0x41, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, 
-	0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 
-	0x20, 0x02, 0xf0, 0x01, 0xf8, 0x31, 0x1c, 0x07, 
-	0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 
-	0xf8, 0x2b, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
-	0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x84, 
-	0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x46, 0x69, 
-	0x20, 0x05, 0xf0, 0x01, 0xf8, 0x19, 0x1c, 0x07, 
-	0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 
-	0xf8, 0x13, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
-	0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x84, 
-	0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x93, 0x03, 
-	0x46, 0x69, 0x20, 0x06, 0xf0, 0x01, 0xf8, 0x00, 
-	0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 
-	0xf0, 0x00, 0xff, 0xfa, 0x49, 0x03, 0x60, 0x08, 
-	0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, 
-	0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 
-	0x20, 0x08, 0xf0, 0x00, 0xff, 0xe9, 0xb0, 0x01, 
-	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x69, 0x40, 
-	0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 0x20, 0x09, 
-	0xf0, 0x00, 0xff, 0xde, 0xb0, 0x01, 0xbc, 0x08, 
-	0x47, 0x18, 0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 
-	0x91, 0x01, 0x46, 0x69, 0x20, 0x0a, 0xf0, 0x00, 
-	0xff, 0xd3, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00, 
-	0x20, 0x13, 0xf0, 0x00, 0xff, 0xcd, 0x49, 0x03, 
-	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0x30, 
-	0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 
-	0x20, 0x0b, 0xf0, 0x00, 0xff, 0xbd, 0x1c, 0x07, 
-	0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 
-	0xff, 0xb7, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
-	0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x21, 0x30, 0xb5, 0x00, 0xb0, 0x81, 
-	0x90, 0x00, 0x46, 0x69, 0x20, 0x0c, 0xf0, 0x00, 
-	0xff, 0xa7, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x91, 0x01, 
-	0x92, 0x02, 0x46, 0x69, 0x20, 0x0d, 0xf0, 0x00, 
-	0xff, 0x9b, 0xb0, 0x03, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x01, 0x46, 0x69, 0x20, 0x03, 0xf0, 0x00, 
-	0xff, 0x93, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 
-	0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfb, 
-	0xfe, 0x35, 0x90, 0x01, 0x46, 0x69, 0x20, 0x12, 
-	0xf0, 0x00, 0xff, 0x86, 0x1c, 0x07, 0xd0, 0x05, 
-	0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x80, 
-	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x30, 0xb5, 0x80, 0xb0, 0x82, 
-	0x90, 0x00, 0xf7, 0xfb, 0xfe, 0x1b, 0x90, 0x01, 
-	0x46, 0x69, 0x20, 0x0e, 0xf0, 0x00, 0xff, 0x6c, 
-	0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 
-	0xf0, 0x00, 0xff, 0x66, 0x49, 0x03, 0x60, 0x08, 
-	0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, 
-	0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x1c, 0x0f, 
-	0xf7, 0xfb, 0xfe, 0x00, 0x90, 0x01, 0x97, 0x02, 
-	0x1c, 0x38, 0xf7, 0xfb, 0xfd, 0xfb, 0x90, 0x03, 
-	0x46, 0x69, 0x20, 0x0f, 0xf0, 0x00, 0xff, 0x4c, 
-	0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 
-	0xf0, 0x00, 0xff, 0x46, 0x49, 0x03, 0x60, 0x08, 
-	0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 
-	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x30, 
-	0xb5, 0x80, 0xb0, 0x82, 0x4f, 0x08, 0x97, 0x00, 
-	0x20, 0xff, 0x30, 0x01, 0x90, 0x01, 0x46, 0x69, 
-	0x20, 0x15, 0xf0, 0x00, 0xff, 0x31, 0x28, 0x00, 
-	0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 
-	0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0xd2, 0x48, 0xb5, 0x00, 0x21, 0x00, 
-	0x20, 0x10, 0xf0, 0x00, 0xff, 0x21, 0x49, 0x02, 
-	0x68, 0x09, 0x1a, 0x40, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0x23, 0x58, 0xb5, 0x00, 0x21, 0x00, 
-	0x20, 0x10, 0xf0, 0x00, 0xff, 0x15, 0x49, 0x02, 
-	0x60, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x23, 0x58, 0xb5, 0x80, 0x21, 0x00, 
-	0x1c, 0x07, 0x20, 0x11, 0xf0, 0x00, 0xff, 0x08, 
-	0x2f, 0x00, 0xd0, 0x00, 0x60, 0x38, 0xbc, 0x80, 
-	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x47, 0x70, 
-	0xb5, 0x80, 0x49, 0x07, 0x68, 0x09, 0xf7, 0xfb, 
-	0xfc, 0xd9, 0x1c, 0x07, 0xd1, 0x03, 0xa1, 0x05, 
-	0xa0, 0x05, 0xf0, 0x00, 0xfc, 0xe7, 0x1c, 0x38, 
-	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
-	0x2e, 0x08, 0x21, 0x28, 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, 0xff, 0x14, 0x61, 0xb8, 0x48, 0x12, 
-	0x40, 0x28, 0xd0, 0x08, 0x69, 0xb9, 0x1c, 0x30, 
-	0xf7, 0xff, 0xfe, 0xdf, 0x28, 0x00, 0xdb, 0x10, 
-	0x4b, 0x0e, 0x40, 0x1d, 0x60, 0xfd, 0x99, 0x00, 
-	0x1c, 0x30, 0x1c, 0x22, 0x1c, 0x2b, 0xf7, 0xff, 
-	0xfe, 0x8d, 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, 0xd3, 0x48, 0x00, 0x00, 0x02, 0x02, 
-	0x2e, 0x08, 0xd3, 0x88, 0x2e, 0x08, 0xd3, 0xc8, 
-	0x2e, 0x08, 0xd4, 0x08, 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, 0x9b, 0x28, 0x00, 0xda, 0x01, 0x25, 0x00, 
-	0x43, 0xed, 0x0b, 0x30, 0xd3, 0x04, 0x98, 0x00, 
-	0x49, 0x0f, 0x68, 0x09, 0xf7, 0xfb, 0xfb, 0xa6, 
-	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, 0xfb, 0xfc, 0xe7, 0x1c, 0x28, 
-	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
-	0x2e, 0x08, 0xd3, 0x48, 0xff, 0xef, 0xff, 0xff, 
-	0x2e, 0x08, 0x21, 0x2c, 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, 0x23, 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, 0xd3, 0x48, 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, 0xd3, 0xc8, 
-	0x2e, 0x08, 0x23, 0x48, 0xb5, 0x80, 0x1c, 0x07, 
-	0xa0, 0x06, 0x21, 0x01, 0xf7, 0xff, 0xfc, 0x98, 
-	0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x94, 
-	0x20, 0x01, 0xf7, 0xfc, 0xff, 0x95, 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, 0xfb, 
-	0xfc, 0x2d, 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, 0xd3, 0x48, 0x2e, 0x08, 0xd3, 0xc8, 
-	0x77, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0xd3, 0x88, 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, 0xd3, 0x48, 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, 0xd3, 0x48, 
-	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, 0xfb, 0xf8, 0x67, 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, 0x21, 0x4c, 0x2e, 0x08, 0xd7, 0x48, 
-	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, 0x87, 0x21, 0x00, 0x1c, 0x20, 0xf7, 0xff, 
-	0xf9, 0x83, 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 
-	0xf9, 0x7f, 0x20, 0x01, 0xf7, 0xfc, 0xfc, 0x80, 
-	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, 0xd3, 0x48, 
-	0xb5, 0xf7, 0x68, 0xc5, 0x69, 0x46, 0x1c, 0x0c, 
-	0x1c, 0x07, 0xb0, 0x81, 0x48, 0x3c, 0x40, 0x28, 
-	0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0xaa, 
-	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, 0xd4, 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, 0x21, 0x30, 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, 0xa0, 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, 0x02, 0x38, 0x58, 
-	0x2e, 0x02, 0x37, 0xfc, 0x2e, 0x02, 0x38, 0x2c, 
-	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, 0x02, 0x36, 0xcc, 0x2e, 0x02, 0x37, 0x04, 
-	0x2e, 0x02, 0x37, 0x20, 0x2e, 0x02, 0x36, 0xcc, 
-	0x2e, 0x02, 0x36, 0xe8, 0x2e, 0x02, 0x37, 0x20, 
-	0x2e, 0x02, 0x37, 0x04, 0x2e, 0x02, 0x36, 0x7c, 
-	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, 0x02, 0x39, 0x35, 
-	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, 0x3b, 0xa4, 0x2e, 0x02, 0x39, 0x64, 
-	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, 0x02, 0x39, 0xe4, 
-	0xe8, 0xbd, 0x5f, 0xf0, 0xe1, 0xb0, 0xf0, 0x0e, 
-	0x2e, 0x08, 0x20, 0x68, 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, 0x71, 
-	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, 0xf0, 0xfb, 0x8c, 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, 0x60, 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, 0x20, 0x28, 
-	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, 0x31, 0x03, 
-	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, 0x7f, 0xe5, 0x9f, 0x00, 0x60, 
-	0xe5, 0x9f, 0x10, 0x58, 0xeb, 0x00, 0x37, 0x7f, 
-	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, 0xd7, 0x6c, 
-	0xcc, 0x1f, 0xff, 0xef, 0xcc, 0x1f, 0x7f, 0xf0, 
-	0x2e, 0x00, 0x1a, 0xf9, 0x2e, 0x02, 0x38, 0xbc, 
-	0x2e, 0x02, 0x39, 0xb4, 0x2e, 0x08, 0x33, 0xa4, 
-	0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x23, 0xa4, 
-	0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x2b, 0xa4, 
-	0x00, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x97, 0x1c, 
-	0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, 
-	0xe5, 0x9f, 0xf0, 0x04, 0x2e, 0x08, 0x97, 0x1c, 
-	0x2e, 0x08, 0x97, 0x1d, 0x2e, 0x08, 0x97, 0x1e, 
-	0x2e, 0x03, 0xa9, 0xd0, 0x2e, 0x08, 0x00, 0x00, 
-	0x2e, 0x08, 0x3c, 0x20, 0x2e, 0x08, 0xd7, 0x68, 
-	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, 0x2e, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 
-	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 
-	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, 0xcf, 0x19, 0xe5, 0x9f, 0xc0, 0x00, 
-	0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5b, 0x17, 
-	0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, 
-	0x2e, 0x00, 0x5b, 0xa1, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 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, 0x02, 0x37, 0x7c, 
-	0x2e, 0x02, 0x38, 0x94, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x02, 0x37, 0x7c, 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, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 
-	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 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, 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, 0xd0, 
-	0x2e, 0x08, 0x05, 0xd0, 0x2e, 0x08, 0x05, 0xd8, 
-	0x2e, 0x08, 0x05, 0xd8, 0x2e, 0x08, 0x05, 0xe0, 
-	0x2e, 0x08, 0x05, 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, 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, 0x65, 0xd0, 
-	0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 
-	0x2e, 0x08, 0x07, 0xa4, 0x00, 0x00, 0x00, 0x00, 
-	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
-	0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 
-	0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x10, 
-	0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 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, 0x06, 0xf7, 
-	0x11, 0x38, 0x06, 0x53, 0x2e, 0x08, 0x17, 0xe4, 
-	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, 0x02, 0xb9, 
-	0x0e, 0xa6, 0x06, 0x53, 0x2e, 0x08, 0x19, 0x14, 
-	0x2e, 0x08, 0x1a, 0x38, 0x2e, 0x08, 0x19, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xf4, 
-	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, 0x01, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x2e, 0x08, 0x8b, 0x98, 0x00, 0x44, 0x45, 0x55, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 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, 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, 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, 0xc8, 0x2e, 0x08, 0x1f, 0xcc, 
-	0x2e, 0x08, 0x1f, 0xd0, 0x2e, 0x08, 0x1f, 0xd8, 
-	0x2e, 0x08, 0x1f, 0xdc, 0x2e, 0x08, 0x1f, 0xe0, 
-	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, 0x9d, 0xc4, 
-	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, 0x20, 0x2c, 
-	0x2e, 0x08, 0x20, 0x30, 0x2e, 0x08, 0x20, 0x34, 
-	0x2e, 0x08, 0x20, 0x38, 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, 0x02, 0x3a, 0x7d, 
-	0x2e, 0x02, 0x3a, 0x0d, 0x2e, 0x02, 0x39, 0x85, 
-	0x2e, 0x02, 0x39, 0x7d, 0x2e, 0x02, 0x3a, 0xb5, 
-	0x2e, 0x02, 0x3a, 0x45, 0x2e, 0x02, 0x3a, 0xf9, 
-	0x2e, 0x02, 0x3a, 0xf1, 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, 0x2e, 0x03, 0xa9, 0x18, 
-	0x2e, 0x03, 0xa9, 0x1a, 0x2e, 0x03, 0xa9, 0x1b, 
-	0x2e, 0x03, 0xa9, 0x1c, 0x2e, 0x03, 0xa9, 0x1d, 
-	0x2e, 0x03, 0xa9, 0x1e, 0x2e, 0x03, 0xa9, 0x1f, 
-	0x2e, 0x03, 0xa9, 0x20, 0x2e, 0x03, 0xa9, 0x21, 
-	0x2e, 0x03, 0xa9, 0x22, 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, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-	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, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 0x2e, 0x02, 0x39, 0x64, 
-	0x2e, 0x02, 0x39, 0x64, 
-};
-
diff -Nru a/drivers/media/dvb/av7110/av7110_ir.c b/drivers/media/dvb/av7110/av7110_ir.c
--- a/drivers/media/dvb/av7110/av7110_ir.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,171 +0,0 @@
-#include <asm/types.h>
-#include <asm/bitops.h>
-#include <linux/init.h>
-#include <linux/module.h>
-#include <linux/input.h>
-#include <linux/proc_fs.h>
-
-#include "av7110.h"
-
-
-#define UP_TIMEOUT (HZ/2)
-
-static int av7110_ir_debug = 0;
-
-#define dprintk(x...)  do { if (av7110_ir_debug) printk (x); } while (0)
-
-
-static struct input_dev input_dev;
-
-
-static
-u16 key_map [256] = {
-	KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7,
-	KEY_8, KEY_9, KEY_LAST, 0, KEY_POWER, KEY_MUTE, 0, KEY_INFO,
-	KEY_VOLUMEUP, KEY_VOLUMEDOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-	KEY_CHANNELUP, KEY_CHANNELDOWN, 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, KEY_TEXT, 0, 0, KEY_TV, 0, 0, 0, 0, 0, KEY_SETUP, 0, 0,
-	0, 0, 0, KEY_SUBTITLE, 0, 0, KEY_LANGUAGE, 0,
-	KEY_RADIO, 0, 0, 0, 0, KEY_EXIT, 0, 0, 
-	KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_OK, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RED, KEY_GREEN, KEY_YELLOW,
-	KEY_BLUE, 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_LIST, 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, KEY_UP, KEY_UP, KEY_DOWN, KEY_DOWN,
-	0, 0, 0, 0, KEY_EPG, 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, KEY_MHP
-};
-
-
-static
-void av7110_emit_keyup (unsigned long data)
-{
-	if (!data || !test_bit (data, input_dev.key))
-		return;
-
-	input_event (&input_dev, EV_KEY, data, !!0);
-}
-
-
-static
-struct timer_list keyup_timer = { .function = av7110_emit_keyup };
-
-
-static
-void av7110_emit_key (u32 ircom)
-{
-	int down = ircom & (0x80000000);
-	u16 keycode = key_map[ircom & 0xff];
-
-	dprintk ("#########%08x######### key %02x %s (keycode %i)\n",
-		 ircom, ircom & 0xff, down ? "pressed" : "released", keycode);
-
-	if (!keycode) {
-		printk ("%s: unknown key 0x%02x!!\n",
-			__FUNCTION__, ircom & 0xff);
-		return;
-	}
-
-	if (timer_pending (&keyup_timer)) {
-		del_timer (&keyup_timer);
-		if (keyup_timer.data != keycode)
-			input_event (&input_dev, EV_KEY, keyup_timer.data, !!0);
-	}
-
-	clear_bit (keycode, input_dev.key);
-
-	input_event (&input_dev, EV_KEY, keycode, !0);
-
-	keyup_timer.expires = jiffies + UP_TIMEOUT;
-	keyup_timer.data = keycode;
-
-	add_timer (&keyup_timer);
-}
-
-static
-void input_register_keys (void)
-{
-	int i;
-
-	memset (input_dev.keybit, 0, sizeof(input_dev.keybit));
-
-	for (i=0; i<sizeof(key_map)/sizeof(key_map[0]); i++) {
-		if (key_map[i] > KEY_MAX)
-			key_map[i] = 0;
-		else if (key_map[i] > KEY_RESERVED)
-			set_bit (key_map[i], input_dev.keybit);
-	}
-}
-
-
-static
-int av7110_ir_write_proc (struct file *file, const char *buffer,
-	                  unsigned long count, void *data)
-{
-	u32 ir_config;
-
-	if (count < 4 + 256 * sizeof(u16))
-		return -EINVAL;
-	
-	memcpy (&ir_config, buffer, 4);
-	memcpy (&key_map, buffer + 4, 256 * sizeof(u16));
-
-	av7110_setup_irc_config (NULL, ir_config);
-
-	input_register_keys ();
-
-	return count;
-}
-
-
-int __init av7110_ir_init (void)
-{
-	static struct proc_dir_entry *e;
-
-	init_timer (&keyup_timer);
-	keyup_timer.data = 0;
-
-        input_dev.name = "DVB on-card IR receiver";
-
-        /**
-         *  enable keys
-         */
-        set_bit (EV_KEY, input_dev.evbit);
-
-	input_register_keys ();
-
-	input_register_device(&input_dev);
-
-	av7110_setup_irc_config (NULL, 0x0001);
-	av7110_register_irc_handler (av7110_emit_key);
-
-	e = create_proc_entry ("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL);
-
-	if (e) {
-		e->write_proc = av7110_ir_write_proc;
-		e->size = 4 + 256 * sizeof(u16);
-	}
-
-	return 0;
-}
-
-
-void __exit av7110_ir_exit (void)
-{
-	remove_proc_entry ("av7110_ir", NULL);
-	av7110_unregister_irc_handler (av7110_emit_key);
-	input_unregister_device(&input_dev);
-}
-
-//MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");
-//MODULE_LICENSE("GPL");
-
-MODULE_PARM(av7110_ir_debug,"i");
-MODULE_PARM_DESC(av7110_ir_debug, "enable AV7110 IR receiver debug messages");
-
diff -Nru a/drivers/media/dvb/av7110/saa7146.c b/drivers/media/dvb/av7110/saa7146.c
--- a/drivers/media/dvb/av7110/saa7146.c	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,1662 +0,0 @@
-/*
-    the api- and os-independet parts of the saa7146 device driver
-    
-    Copyright (C) 1998,1999 Michael Hunold <michael@mihu.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 "saa7146_defs.h"
-
-#define TRUNC(val,max) ((val) < (max) ? (val) : (max))
-
-#ifdef __COMPILE_SAA7146__
-
-struct saa7146_modes_constants
- modes_constants[] = {
-	{ V_OFFSET_PAL,		V_FIELD_PAL,	V_ACTIVE_LINES_PAL,
-	  H_OFFSET_PAL,		H_PIXELS_PAL,	H_PIXELS_PAL+1,
-	  V_ACTIVE_LINES_PAL,	1024 },	/* PAL values */
-	{ V_OFFSET_NTSC,	V_FIELD_NTSC,	V_ACTIVE_LINES_NTSC,
-	  H_OFFSET_NTSC,	H_PIXELS_NTSC,  H_PIXELS_NTSC+1,
-	  V_ACTIVE_LINES_NTSC,	1024 },	/* NTSC values */
-	{ 0,0,0,0,0,0,0,0 }, /* secam values */
-	{ 0,288,576, 
-	  0,188*4,188*4+1,
-	  288,188*4 } /* TS values */
-};
-
-/* -----------------------------------------------------------------------------------------
-   helper functions for the calculation of the horizontal- and vertical scaling	registers,
-   clip-format-register etc ...
-   these functions take pointers to the (most-likely read-out original-values) and manipulate
-   them according to the requested new scaling parameters.
-   ----------------------------------------------------------------------------------------- */
-
-/* hps_coeff used for CXY and CXUV; scale 1/1 -> scale 1/64 */
-struct {
-	u16 hps_coeff;
-	u16 weight_sum;
-} hps_h_coeff_tab [] = { 
-	{0x00,   2}, {0x02,   4}, {0x00,   4}, {0x06,   8}, {0x02,   8},
-	{0x08,   8}, {0x00,   8}, {0x1E,  16}, {0x0E,   8}, {0x26,   8},
-	{0x06,   8}, {0x42,   8}, {0x02,   8}, {0x80,   8}, {0x00,   8},
-	{0xFE,  16}, {0xFE,   8}, {0x7E,   8}, {0x7E,   8}, {0x3E,   8},
-	{0x3E,   8}, {0x1E,   8}, {0x1E,   8}, {0x0E,   8}, {0x0E,   8},
-	{0x06,   8}, {0x06,   8}, {0x02,   8}, {0x02,   8}, {0x00,   8},
-	{0x00,   8}, {0xFE,  16}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8},
-	{0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8},
-	{0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8},
-	{0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0xFE,   8}, {0x7E,   8},
-	{0x7E,   8}, {0x3E,   8}, {0x3E,   8}, {0x1E,   8}, {0x1E,   8},
-	{0x0E,   8}, {0x0E,   8}, {0x06,   8}, {0x06,   8}, {0x02,   8},
-	{0x02,   8}, {0x00,   8}, {0x00,   8}, {0xFE,  16}
-};
-
-/* table of attenuation values for horizontal scaling */
-u8 h_attenuation[] = { 1, 2, 4, 8, 2, 4, 8, 16, 0};
-
-int calculate_h_scale_registers(struct saa7146* saa, u32 in_x, u32 out_x, int flip_lr, u32* hps_ctrl, u32* hps_v_gain, u32* hps_h_prescale, u32* hps_h_scale)
-{
-	/* horizontal prescaler */
-	u32 dcgx = 0, xpsc = 0, xacm = 0, cxy = 0, cxuv = 0;
-	/* horizontal scaler */
-	u32 xim = 0, xp = 0, xsci =0;
-	/* vertical scale & gain */
-	u32 pfuv = 0;	
-	/* helper variables */
-	u32 h_atten = 0, i = 0;
-
-	if ( 0 == out_x ) {
-		printk("saa7146: ==> calculate_h_scale_registers: invalid value (=0).\n");
-		return -EINVAL;
-	}
-	
-	/* mask out vanity-bit */
-	*hps_ctrl &= ~MASK_29;
-		
-	/* calculate prescale-(xspc)-value:	[n   .. 1/2) : 1
-				    		[1/2 .. 1/3) : 2
-				    		[1/3 .. 1/4) : 3
-						... 			*/
-	if (in_x > out_x) {
-		xpsc = in_x / out_x;
-	} else {
-		/* zooming */
-		xpsc = 1;						
-	}
-	
-	/* if flip_lr-bit is set, number of pixels after horizontal prescaling must be < 384 */
-	if ( 0 != flip_lr ) {
-		/* set vanity bit */
-		*hps_ctrl |= MASK_29;
-	
-		while (in_x / xpsc >= 384 )
-			xpsc++;
-	}
-	/* if zooming is wanted, number of pixels after horizontal prescaling must be < 768 */
-	else {
-		while ( in_x / xpsc >= 768 )
-			xpsc++;
-	}
-	
-	/* maximum prescale is 64 (p.69) */
-	if ( xpsc > 64 )
-		xpsc = 64;
-
-	/* keep xacm clear*/
-	xacm = 0;
-	
-	/* set horizontal filter parameters (CXY = CXUV) */
-	cxy = hps_h_coeff_tab[TRUNC(xpsc - 1, 63)].hps_coeff;
-	cxuv = cxy;
-	
-	/* calculate and set horizontal fine scale (xsci) */
-	
-	/* bypass the horizontal scaler ? */
-	if ( (in_x == out_x) && ( 1 == xpsc ) )
-		xsci = 0x400;
-	else	
-		xsci = ( (1024 * in_x) / (out_x * xpsc) ) + xpsc;
-
-	/* set start phase for horizontal fine scale (xp) to 0 */	
-	xp = 0;
-	
-	/* set xim, if we bypass the horizontal scaler */
-	if ( 0x400 == xsci )
-		xim = 1;
-	else
-		xim = 0;
-		
-	/* if the prescaler is bypassed, enable horizontal accumulation mode (xacm)
-	   and clear dcgx */
-	if( 1 == xpsc ) {
-		xacm = 1;
-		dcgx = 0;
-	} else {
-		xacm = 0;
-		/* get best match in the table of attenuations for horizontal scaling */
-		h_atten = hps_h_coeff_tab[TRUNC(xpsc - 1, 63)].weight_sum;
-	
-		for (i = 0; h_attenuation[i] != 0; i++) {
-			if (h_attenuation[i] >= h_atten)
-				break;
-		}
-	
-		dcgx = i;
-	}
-
-	/* the horizontal scaling increment controls the UV filter to reduce the bandwith to
-	   improve the display quality, so set it ... */
-	if ( xsci == 0x400)
-		pfuv = 0x00;
-	else if ( xsci < 0x600)
-		pfuv = 0x01;
-	else if ( xsci < 0x680)
-		pfuv = 0x11;
-	else if ( xsci < 0x700)
-		pfuv = 0x22;
-	else
-		pfuv = 0x33;
-
-	
-	*hps_v_gain  &= MASK_W0|MASK_B2;
-	*hps_v_gain  |= (pfuv << 24);	
-
-	*hps_h_scale 	&= ~(MASK_W1 | 0xf000);
-	*hps_h_scale	|= (xim << 31) | (xp << 24) | (xsci << 12);
-
-	*hps_h_prescale	|= (dcgx << 27) | ((xpsc-1) << 18) | (xacm << 17) | (cxy << 8) | (cxuv << 0);
-
-	return 0;
-}
-
-struct {
-	u16 hps_coeff;
-	u16 weight_sum;
-} hps_v_coeff_tab [] = { 
-	{0x0100,   2},  {0x0102,   4},  {0x0300,   4},  {0x0106,   8},
-	{0x0502,   8},  {0x0708,   8},  {0x0F00,   8},  {0x011E,  16},
-	{0x110E,  16},  {0x1926,  16},  {0x3906,  16},  {0x3D42,  16},
-	{0x7D02,  16},  {0x7F80,  16},  {0xFF00,  16},  {0x01FE,  32},
-	{0x01FE,  32},  {0x817E,  32},  {0x817E,  32},  {0xC13E,  32},
-	{0xC13E,  32},  {0xE11E,  32},  {0xE11E,  32},  {0xF10E,  32},
-	{0xF10E,  32},  {0xF906,  32},  {0xF906,  32},  {0xFD02,  32},
-	{0xFD02,  32},  {0xFF00,  32},  {0xFF00,  32},  {0x01FE,  64},
-	{0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},
-	{0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},
-	{0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},
-	{0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},  {0x01FE,  64},
-	{0x01FE,  64},  {0x817E,  64},  {0x817E,  64},  {0xC13E,  64},
-	{0xC13E,  64},  {0xE11E,  64},  {0xE11E,  64},  {0xF10E,  64},
-	{0xF10E,  64},  {0xF906,  64},  {0xF906,  64},  {0xFD02,  64},
-	{0xFD02,  64},  {0xFF00,  64},  {0xFF00,  64},  {0x01FE, 128}
-};
-
-/* table of attenuation values for vertical scaling */
-u16 v_attenuation[] = { 2, 4, 8, 16, 32, 64, 128, 256, 0};
-
-int calculate_v_scale_registers(struct saa7146* saa, u32 in_y, u32 out_y, u32* hps_v_scale, u32* hps_v_gain)
-{
-	u32 yacm = 0, ysci = 0, yacl = 0, ypo = 0, ype = 0;	/* vertical scaling */
-	u32 dcgy = 0, cya_cyb = 0;				/* vertical scale & gain */
-				
-	u32 v_atten = 0, i = 0;					/* helper variables */
-
-	/* error, if vertical zooming */
-	if ( in_y < out_y ) {
-		printk("saa7146: ==> calculate_v_scale_registers: we cannot do vertical zooming.\n");
-		return -EINVAL;
-	}
-
-	/* linear phase interpolation may be used if scaling is between 1 and 1/2
-	   or scaling is between 1/2 and 1/4 (if interlace is set; see below) */
-	if( ((2*out_y) >= in_y) || (((4*out_y) >= in_y) && saa->interlace != 0)) {
-
-		/* convention: if scaling is between 1/2 and 1/4 we only use
-		   the even lines, the odd lines get discarded (see function move_to)
-		   if interlace is set */
-		if( saa->interlace != 0 && (out_y*4) >= in_y && (out_y*2) <= in_y) 
-			out_y *= 2;
-
-		yacm = 0;
-		yacl = 0;
-		cya_cyb = 0x00ff;
-		
-		/* calculate scaling increment */
-		if ( in_y > out_y )
-			ysci = ((1024 * in_y) / (out_y + 1)) - 1024;
-		else
-			ysci = 0;
-
-		dcgy = 0;
-
-		/* calculate ype and ypo */
-                if (saa->interlace !=0) { 
-                    
-                    /* Special case for interlaced input */
-
-                    /* See Philips SAA7146A Product Spec (page 75):       */
-                    /* "For interlaced input, ype and ypo is defiend as   */
-                    /* YPeven= 3/2 x YPodd (line 1 = odd)"                */
-                    /*                                                    */
-                    /* It looks like the spec is wrong!                   */
-                    /* The  ad hoc values below works fine for a target   */
-                    /* window height of 480 (vertical scale = 1/1) NTSC.  */
-                    /* PLI: December 27, 2000.                            */
-                    ypo=64;
-                    ype=0; 
-                } else {
-                    ype = ysci / 16;
-                    ypo = ype + (ysci / 64);
-                }
-	}
-	else {
-		yacm = 1;	
-
-		/* calculate scaling increment */
-		ysci = (((10 * 1024 * (in_y - out_y - 1)) / in_y) + 9) / 10;
-
-		/* calculate ype and ypo */
-		ypo = ype = ((ysci + 15) / 16);
-
-		/* the sequence length interval (yacl) has to be set according
-		   to the prescale value, e.g.	[n   .. 1/2) : 0
-		   				[1/2 .. 1/3) : 1
-						[1/3 .. 1/4) : 2
-						... */
-		if ( ysci < 512) {
-			yacl = 0;
-		}
-		else {
-			yacl = ( ysci / (1024 - ysci) );
-		}
-
-		/* get filter coefficients for cya, cyb from table hps_v_coeff_tab */	
-		cya_cyb = hps_v_coeff_tab[TRUNC(yacl, 63)].hps_coeff;
-
-		/* get best match in the table of attenuations for vertical scaling */
-		v_atten = hps_v_coeff_tab[TRUNC(yacl, 63)].weight_sum;
-
-		for (i = 0; v_attenuation[i] != 0; i++) {
-			if (v_attenuation[i] >= v_atten)
-				break;
-		}
-	
-		dcgy = i;
-	}
-
-	/* ypo and ype swapped in spec ? */
-	*hps_v_scale	|= (yacm << 31) | (ysci << 21) | (yacl << 15) | (ypo << 8 ) | (ype << 1);
-
-	*hps_v_gain	&= ~(MASK_W0|MASK_B2);
-	*hps_v_gain	|= (dcgy << 16) | (cya_cyb << 0);
-
-	return 0;
-}
-
-void calculate_hxo_hyo_and_sources(struct saa7146* saa, int port_sel, int sync_sel, u32* hps_h_scale, u32* hps_ctrl)
-{
-	u32 hyo = 0, hxo = 0;
-	
-	hyo = modes_constants[saa->mode].v_offset;
-	hxo = modes_constants[saa->mode].h_offset;
-				
-	*hps_h_scale	&= ~(MASK_B0 | 0xf00);
-	*hps_ctrl	&= ~(MASK_W0 | MASK_B2 | MASK_30 | MASK_31 | MASK_28);
-
-	*hps_h_scale	|= (hxo <<  0);
-	*hps_ctrl	|= (hyo << 12);
-
-	*hps_ctrl	|= ( port_sel == 0 ? 0x0 : MASK_30);
-	*hps_ctrl	|= ( sync_sel == 0 ? 0x0 : MASK_28);
-}
-
-void calculate_output_format_register(struct saa7146* saa, u16 palette, u32* clip_format)
-{
-	/* clear out the necessary bits */
-	*clip_format &= 0x0000ffff;	
-	/* set these bits new */
-	*clip_format |=  (( ((palette&0xf00)>>8) << 30) | ((palette&0x00f) << 24) | (((palette&0x0f0)>>4) << 16));
-}
-
-void calculate_bcs_ctrl_register(struct saa7146 *saa, u32 brightness, u32 contrast, u32 colour, u32 *bcs_ctrl)
-{
-	*bcs_ctrl = ((brightness << 24) | (contrast << 16) | (colour <<  0));
-}
-
-
-int calculate_video_dma1_grab(struct saa7146* saa, int frame, struct saa7146_video_dma* vdma1) 
-{
-	int depth = 0;
-	
-	switch(saa->grab_format[frame]) {
-		case YUV422_COMPOSED:
-		case RGB15_COMPOSED:
-		case RGB16_COMPOSED:
-			depth = 2;
-			break;
-		case RGB24_COMPOSED:
-			depth = 3;
-			break;
-		default:
-			depth = 4;	
-		break;
-	}
-
-	vdma1->pitch		= saa->grab_width[frame]*depth*2;
-	vdma1->base_even	= 0;
-	vdma1->base_odd		= vdma1->base_even + (vdma1->pitch/2);
-	vdma1->prot_addr	= (saa->grab_width[frame]*saa->grab_height[frame]*depth)-1;
-	vdma1->num_line_byte	= ((modes_constants[saa->mode].v_field<<16) + modes_constants[saa->mode].h_pixels);
-	vdma1->base_page	= virt_to_bus(saa->page_table[frame]) | ME1;
-
-	/* convention: if scaling is between 1/2 and 1/4 we only use
-	   the even lines, the odd lines get discarded (see vertical scaling) */
-	if( saa->interlace != 0 && saa->grab_height[frame]*4 >= modes_constants[saa->mode].v_calc && saa->grab_height[frame]*2 <= modes_constants[saa->mode].v_calc) {
-		vdma1->base_odd = vdma1->prot_addr;
-		vdma1->pitch /= 2;
-	}
-
-	return 0;
-}
-
-/* ---------------------------------------------*/
-/* position of overlay-window			*/
-/* ---------------------------------------------*/
-		
-/* calculate the new memory offsets for a desired position */
-int move_to(struct saa7146* saa, int w_x, int w_y, int w_height, int b_width, int b_depth, int b_bpl, u32 base, int td_flip)
-{	
-	struct	saa7146_video_dma	vdma1;
-
-	if( w_y < 0 || w_height <= 0 || b_depth <= 0 || b_bpl <= 0 || base == 0 ) {
-		printk("saa7146: ==> calculate_video_dma1_overlay: illegal values: y: %d  h: %d  d: %d  b: %d  base: %d\n",w_y ,w_height,b_depth,b_bpl,base);
-		return -EINVAL;
-	}	
-
-	/* calculate memory offsets for picture, look if we shall top-down-flip */
-	vdma1.pitch	= 2*b_bpl;
-	if ( 0 == td_flip ) {
-		vdma1.prot_addr = (u32)base + ((w_height+w_y+1)*b_width*(b_depth/4));		
-		vdma1.base_even = (u32)base + (w_y * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); 
-		vdma1.base_odd  = vdma1.base_even + (vdma1.pitch / 2);
-	}
-	else {
-		vdma1.prot_addr = (u32)base + (w_y * (vdma1.pitch/2));
-		vdma1.base_even = (u32)base + ((w_y+w_height) * (vdma1.pitch/2)) + (w_x * (b_depth / 8)); 
-		vdma1.base_odd  = vdma1.base_even + (vdma1.pitch / 2);
-		vdma1.pitch    *= -1;
-	}	
-
-	/* convention: if scaling is between 1/2 and 1/4 we only use
-	   the even lines, the odd lines get discarded (see vertical scaling) */
-	if( saa->interlace != 0 && w_height*4 >= modes_constants[saa->mode].v_calc && w_height*2 <= modes_constants[saa->mode].v_calc) {
-		vdma1.base_odd = vdma1.prot_addr;
-		vdma1.pitch /= 2;
-	}
-		
-	vdma1.base_page = 0;
-	vdma1.num_line_byte = (modes_constants[saa->mode].v_field<<16)+modes_constants[saa->mode].h_pixels;
-
-	saa7146_write(saa->mem, BASE_EVEN1,     vdma1.base_even);
-	saa7146_write(saa->mem, BASE_ODD1,      vdma1.base_odd);
-	saa7146_write(saa->mem, PROT_ADDR1,     vdma1.prot_addr);
-	saa7146_write(saa->mem, BASE_PAGE1,     vdma1.base_page);
-	saa7146_write(saa->mem, PITCH1,		vdma1.pitch);
-	saa7146_write(saa->mem, NUM_LINE_BYTE1,	vdma1.num_line_byte);
-
-	/* update the video dma 1 registers */
-      	saa7146_write(saa->mem, MC2, (MASK_02 | MASK_18));
-	
-	return 0;
-
-}
-
-/* ---------------------------------------------*/
-/* size of window (overlay)			*/
-/* ---------------------------------------------*/
-
-int set_window(struct saa7146* saa, int width, int height, int flip_lr, int port_sel, int sync_sel)
-{
-	u32 hps_v_scale = 0, hps_v_gain  = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0;
-
-	/* set vertical scale according to selected mode: 0 = PAL, 1 = NTSC */
-	hps_v_scale = 0; /* all bits get set by the function-call */
-	hps_v_gain  = 0; /* fixme: saa7146_read(saa->mem, HPS_V_GAIN);*/ 
-	calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, height, &hps_v_scale, &hps_v_gain);
-
-	/* set horizontal scale according to selected mode: 0 = PAL, 1 = NTSC */
-	hps_ctrl 	= 0;
-	hps_h_prescale	= 0; /* all bits get set in the function */
-	hps_h_scale	= 0;
-	calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, width, 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale);
-
-	/* set hyo and hxo */
-	calculate_hxo_hyo_and_sources(saa, port_sel, sync_sel, &hps_h_scale, &hps_ctrl);
-	
-	/* write out new register contents */
-	saa7146_write(saa->mem, HPS_V_SCALE,	hps_v_scale);
-	saa7146_write(saa->mem, HPS_V_GAIN,	hps_v_gain);
-	saa7146_write(saa->mem, HPS_CTRL,	hps_ctrl);
-	saa7146_write(saa->mem, HPS_H_PRESCALE,hps_h_prescale);
-	saa7146_write(saa->mem, HPS_H_SCALE,	hps_h_scale);
-
-	/* upload shadow-ram registers */
-      	saa7146_write( saa->mem, MC2, (MASK_05 | MASK_06 | MASK_21 | MASK_22) );
-
-/*
-	printk("w:%d,h:%d\n",width,height);
-*/
-	return 0;
-
-}
-
-void set_output_format(struct saa7146* saa, u16 palette)
-{
-	u32	clip_format = saa7146_read(saa->mem, CLIP_FORMAT_CTRL);
-	
-	dprintk("saa7146: ==> set_output_format: pal:0x%03x\n",palette);
-	
-	/* call helper function */
-	calculate_output_format_register(saa,palette,&clip_format);
-	dprintk("saa7146: ==> set_output_format: 0x%08x\n",clip_format);
-
-	/* update the hps registers */
-	saa7146_write(saa->mem, CLIP_FORMAT_CTRL, clip_format);
-      	saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21));
-}
-
-void set_picture_prop(struct saa7146 *saa, u32 brightness, u32 contrast, u32 colour)
-{
-	u32	bcs_ctrl = 0;
-	
-	calculate_bcs_ctrl_register(saa, brightness, contrast, colour, &bcs_ctrl);
-	saa7146_write(saa->mem, BCS_CTRL, bcs_ctrl);
-	
-	/* update the bcs register */
-      	saa7146_write(saa->mem, MC2, (MASK_06 | MASK_22));
-}
-
-/* ---------------------------------------------*/
-/* overlay enable/disable			*/
-/* ---------------------------------------------*/
-
-/* enable(1) / disable(0) video */
-void video_setmode(struct saa7146* saa, int v)
-{
-	hprintk("saa7146: ==> video_setmode; m:%d\n",v);
-	
-	/* disable ? */
-	if(v==0) {
-		/* disable video dma1 */
-      		saa7146_write(saa->mem, MC1, MASK_22);
-	} else {/* or enable ? */
-		/* fixme: enable video */
-	        saa7146_write(saa->mem, MC1, (MASK_06 | MASK_22));
-	}
-}		
-
-/* -----------------------------------------------------
-   common grabbing-functions. if you have some simple
-   saa7146-based frame-grabber you can most likely call
-   these. they do all the revision-dependend stuff and
-   do rps/irq-based grabbing for you.
-   -----------------------------------------------------*/
-
-/* this function initializes the rps for the next grab for any "old"
-   saa7146s (= revision 0). it assumes that the rps is *not* running
-   when it gets called. */
-int init_rps0_rev0(struct saa7146* saa, int frame, int irq_call)
-{
-	struct	saa7146_video_dma	vdma1;
-	u32 hps_v_scale = 0, hps_v_gain  = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0;
-	u32 clip_format = 0; /* this can be 0, since we don't do clipping */
-	u32 bcs_ctrl = 0;
-	
-	int count = 0;
-
-/* these static values are used to remember the last "programming" of the rps.
-   if the height, width and format of the grab has not changed (which is very likely
-   when some streaming capture is done) the reprogramming overhead can be minimized */
-static	int last_height = 0;
-static	int last_width = 0;
-static	int last_format = 0;
-static	int last_port = 0;
-static	int last_frame = -1;
-
-	/* write the address of the rps-program */
-	saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[ 0]));
-
-	/* let's check if we can re-use something of the last grabbing process */
-	if (	   saa->grab_height[frame] != last_height
-		|| saa->grab_width[frame] != last_width
-		|| saa->grab_port[frame] != last_port
-		|| saa->grab_format[frame] != last_format ) {
-
-		/* nope, we have to start from the beginning */
-		calculate_video_dma1_grab(saa, frame, &vdma1);
-		calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, saa->grab_height[frame], &hps_v_scale, &hps_v_gain);
-		calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, saa->grab_width[frame], 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale);
-		calculate_hxo_hyo_and_sources(saa, saa->grab_port[frame], saa->grab_port[frame], &hps_h_scale, &hps_ctrl);
-		calculate_output_format_register(saa,saa->grab_format[frame],&clip_format);
-		calculate_bcs_ctrl_register(saa, 0x80, 0x40, 0x40, &bcs_ctrl);
-
-		count = 0;
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4));		/* turn off video-dma1 and dma2 (clipping)*/
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22 | MASK_05 | MASK_21);	/* => mask */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_22 | MASK_21);			/* => values */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_12 : MASK_14));	/* wait for o_fid_a/b */
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_11 : MASK_13));	/* wait for e_fid_a/b */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | HPS_CTRL/4);	/* upload hps-registers for next grab */
-		saa->rps0[ count++ ] = cpu_to_le32(hps_ctrl);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_v_scale);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_v_gain);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_h_prescale);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_h_scale);
-		saa->rps0[ count++ ] = cpu_to_le32(bcs_ctrl);
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | CLIP_FORMAT_CTRL/4);/* upload hps-registers for next grab */
-		saa->rps0[ count++ ] = cpu_to_le32(clip_format);
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_05 | MASK_06);		/* upload hps1/2 */
-
-		/* upload video-dma1 registers for next grab */
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | BASE_ODD1/4);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_odd);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_even);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.prot_addr);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.pitch);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_page);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.num_line_byte);
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_02);		/* upload video-dma1 */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4));		/* turn on video-dma1 */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22);	    		/* => mask */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22);			/* => values */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | (MC2/4)); 	/* Write MC2 */
-		saa->rps0[ count++ ] = cpu_to_le32((1 << (27+frame)) | (1 << (11+frame)));
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_12 : MASK_14));	/* wait for o_fid_a/b */
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[frame] == 0 ? MASK_11 : MASK_13));	/* wait for e_fid_a/b */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4));     		/* turn off video-dma1 */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22);	    		/* => mask */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_22);					/* => values */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_INTERRUPT);				/* generate interrupt */
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_STOP);				/* stop processing */	
-	} else {
-	
-		/* the height, width, ... have not changed. check if the user wants to grab to
-		   another *buffer* */
-		if( frame != last_frame ) {
-
-			/* ok, we want to grab to another buffer, but with the same programming.
-			   it is sufficient to adjust the video_dma1-registers and the rps-signal stuff. */
-			saa->rps0[ 20 ] = cpu_to_le32(virt_to_bus(saa->page_table[frame]) | ME1);
-			saa->rps0[ 27 ] = cpu_to_le32((1 << (27+frame)) | (1 << (11+frame)));
-	
-		}
-	 }
-	 
-	/* if we are called from within the irq-handler, the hps is at the beginning of a
-	   new frame. the rps does not need to wait the new frame, and so we tweak the
-	   starting address a little bit and so we can directly start grabbing again.
-	   note: for large video-sizes and slow computers this can cause jaggy pictures
-	   because the whole process is not in sync. perhaps one should be able to
-	   disable this. (please remember that this whole stuff only belongs to 
-	   "old" saa7146s (= revision 0), newer saa7146s don´t have any hardware-bugs
-	   and capture works fine. (see below) */   
-	if( 1 == irq_call ) {
-		saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[15]));
-	}	
-	
-	/* turn on rps */
-	saa7146_write(saa->mem, MC1, (MASK_12 | MASK_28));	
-
-	/* store the values for the last grab */
-	last_height = saa->grab_height[frame];
-	last_width = saa->grab_width[frame];
-	last_format = saa->grab_format[frame];
-	last_port = saa->grab_port[frame];
-	last_frame = frame;
-
-	return 0;
-}
-
-int init_rps0_rev1(struct saa7146* saa, int frame) {
-
-static	int old_width[SAA7146_MAX_BUF];		/* pixel width of grabs */
-static	int old_height[SAA7146_MAX_BUF];	/* pixel height of grabs */
-static	int old_format[SAA7146_MAX_BUF];	/* video format of grabs */
-static	int old_port[SAA7146_MAX_BUF];		/* video port for grab */
-	
-static	int buf_stat[SAA7146_MAX_BUF];
-
-	struct	saa7146_video_dma	vdma1;
-	u32 hps_v_scale = 0, hps_v_gain  = 0, hps_ctrl = 0, hps_h_prescale = 0, hps_h_scale = 0;
-	u32 clip_format = 0; /* this can be 0, since we don't do clipping */
-	u32 bcs_ctrl = 0;
-
-	int i = 0, count = 0;
-
-	/* check if something has changed since the last grab for this buffer */
-	if ( 	   saa->grab_height[frame]	== old_height[frame]
-		&& saa->grab_width[frame]	== old_width[frame]
-		&& saa->grab_port[frame] 	== old_port[frame]
-		&& saa->grab_format[frame]	== old_format[frame] ) {
-
-		/* nope, nothing to be done here */
-		return 0;
-	}
-
-	/* re-program the rps0 completely */
-
-	/* indicate that the user has requested re-programming of the 'frame'-buffer */
-	buf_stat[frame] = 1;
-
-	/* turn off rps */
-	saa7146_write(saa->mem, MC1, MASK_28);	
-
-
-	/* write beginning of rps-program */
-	count = 0;
-	saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_12);				/* wait for o_fid_a */
-	saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_11);				/* wait for e_fid_a */
-	for(i = 0; i < saa->buffers; i++) {		
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP  | (1 << (21+i)));		/* check signal x, jump if set */
-		saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[40*(i+1)]));
-	}
-	saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_12);				/* wait for o_fid_a */
-	saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | MASK_11);				/* wait for e_fid_a */
-	saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP);					/* jump to the beginning */
-	saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[2]));
-		
-	for(i = 0; i < saa->buffers; i++) {
-
-		/* we only re-program the i-th buffer if the user had set some values for it earlier.
-		   otherwise the calculation-functions may fail. */
-		if( buf_stat[i] == 0)
-			continue;
-
-		count = 40*(i+1);
-
-		calculate_video_dma1_grab(saa, i, &vdma1);
-		calculate_v_scale_registers(saa, modes_constants[saa->mode].v_calc, saa->grab_height[i], &hps_v_scale, &hps_v_gain);
-		calculate_h_scale_registers(saa, modes_constants[saa->mode].h_calc, saa->grab_width[i], 0, &hps_ctrl, &hps_v_gain, &hps_h_prescale, &hps_h_scale);
-		calculate_hxo_hyo_and_sources(saa, saa->grab_port[i], saa->grab_port[i], &hps_h_scale, &hps_ctrl);
-		calculate_output_format_register(saa,saa->grab_format[i],&clip_format);
-		calculate_bcs_ctrl_register(saa, 0x80, 0x40, 0x40, &bcs_ctrl);
-	
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | HPS_CTRL/4);	/* upload hps-registers for next grab */
-		saa->rps0[ count++ ] = cpu_to_le32(hps_ctrl);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_v_scale);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_v_gain);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_h_prescale);
-		saa->rps0[ count++ ] = cpu_to_le32(hps_h_scale);
-		saa->rps0[ count++ ] = cpu_to_le32(bcs_ctrl);
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | CLIP_FORMAT_CTRL/4);/* upload hps-registers for next grab */
-		saa->rps0[ count++ ] = cpu_to_le32(clip_format);	
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_05 | MASK_06);		/* upload hps1/2 */
-	
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (6 << 8) | BASE_ODD1/4);	/* upload video-dma1 registers for next grab */
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_odd);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_even);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.prot_addr);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.pitch);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.base_page);
-		saa->rps0[ count++ ] = cpu_to_le32(vdma1.num_line_byte);
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_UPLOAD | MASK_02);		/* upload video-dma1 */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4));		/* turn on video-dma1 */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22);	    		/* => mask */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22);			/* => values */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[i] == 0 ? MASK_12 : MASK_14));	/* wait for o_fid_a/b */
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_PAUSE | ( saa->grab_port[i] == 0 ? MASK_11 : MASK_13));	/* wait for e_fid_a/b */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG_MASK | (MC1/4));		/* turn off video-dma1 and dma2 (clipping)*/
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_06 | MASK_22 | MASK_05 | MASK_21);	/* => mask */
-		saa->rps0[ count++ ] = cpu_to_le32(MASK_22 | MASK_21);			/* => values */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_WR_REG | (1 << 8) | (MC2/4)); 	/* Write MC2 */
-		saa->rps0[ count++ ] = cpu_to_le32((1 << (27+i)));
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_INTERRUPT);				/* generate interrupt */
-
-		saa->rps0[ count++ ] = cpu_to_le32(CMD_JUMP);	/* jump to the beginning */
-		saa->rps0[ count++ ] = cpu_to_le32(virt_to_bus(&saa->rps0[2]));
-
-		old_height[frame] = saa->grab_height[frame];
-		old_width[frame]  = saa->grab_width[frame];
-		old_port[frame]	  = saa->grab_port[frame];
-		old_format[frame] = saa->grab_format[frame];
-	}
-
-	/* write the address of the rps-program */
-	saa7146_write(saa->mem, RPS_ADDR0, virt_to_bus(&saa->rps0[ 0]));
-	/* turn on rps again */
-	saa7146_write(saa->mem, MC1, (MASK_12 | MASK_28));	
-
-	return 0;
-}
-
-/* this funtion is called whenever a new grab is requested. if possible (that
-   means: if the rps is not running) it re-programs the rps, otherwise it relys on
-   the irq-handler to do that */
-int set_up_grabbing(struct saa7146* saa, int frame)
-{
-	u32 mc1 = 0;
-
-	if( 0 == saa->revision ) {
-
-		/* check if the rps is currently in use */
-		mc1   = saa7146_read(saa->mem, MC1);
-
-		/* the rps is not running ... */
-		if( 0 == ( mc1 & MASK_12) ) {
-
-			/* we can completly re-program the rps now */
-			dprintk("saa7146_v4l.o: ==> set_up_grabbing: start new rps.\n");
-			init_rps0_rev0(saa,frame,0);
-		} else {
-	
-			/* the rps is running. in this case, the irq-handler is responsible for
-			   re-programming the rps and nothing can be done right now */
-			dprintk("saa7146_v4l.o: ==> set_up_grabbing: no new rps started.\n");
-		}
-	} else {
-			/* check if something has changed, reprogram if necessary */
-			init_rps0_rev1(saa,frame);
-			/* set rps-signal-bit to start grabbing */
-			saa7146_write(saa->mem, MC2, (1 << (27+frame)) |  (1 << (11+frame)));
-	}
-	
-	return 0;	
-}
-
-
-void saa7146_std_grab_irq_callback_rps0(struct saa7146* saa, u32 isr, void* data)
-{
-	u32 mc2 = 0;
-	int i = 0;
-		
-	hprintk("saa7146_v4l.o: ==> saa7146_v4l_irq_callback_rps0\n");
-
-	/* check for revision: old revision */
-	if( 0 == saa->revision ) {
-
-		/* look what buffer has been grabbed, set the ´done´-flag and clear the signal */
-		mc2   = saa7146_read(saa->mem, MC2);
-		for( i = 0; i < saa->buffers; i++ ) {
-
-			if ((0 != (mc2 & (1 << (11+i)))) && (GBUFFER_GRABBING == saa->frame_stat[i])) {
-				saa->frame_stat[i] = GBUFFER_DONE;
-				saa7146_write(saa->mem, MC2, (1<<(27+i)));
-			}
-		}
-
-		/* look if there is another buffer we can grab to */
-		for( i = 0; i < saa->buffers; i++ ) {
-			if ( GBUFFER_GRABBING == saa->frame_stat[i] )
-					break;
-		}
-
-		/* yes, then set up the rps again */
-		if( saa->buffers != i) {
-			init_rps0_rev0(saa,i,1);
-		}
- 	} else {
-		/* new revisions */
-
-		/* look what buffer has been grabbed, set the ´done´-flag */
-		mc2   = saa7146_read(saa->mem, MC2);
-		for( i = 0; i < saa->buffers; i++ ) {
-
-			if ((0 == (mc2 & (1 << (11+i)))) && (GBUFFER_GRABBING == saa->frame_stat[i])) {
-				saa->frame_stat[i] = GBUFFER_DONE;
-			}
-		}
-				
-	}
-	/* notify any pending process */
-	wake_up_interruptible(&saa->rps0_wq);
-	return;
-}
-
-/* ---------------------------------------------*/
-/* mask-clipping				*/
-/* ---------------------------------------------*/
-int calculate_clipping_registers_mask(struct saa7146* saa, u32 width, u32 height, struct saa7146_video_dma* vdma2, u32* clip_format, u32* arbtr_ctrl)
-{ 
-	u32 clip_addr = 0, clip_pitch = 0;
-
-	dprintk("saa7146: ==> calculate_clipping_registers_mask\n");
-
-	/* adjust arbitration control register */
-	*arbtr_ctrl &= 0xffff00ff;
-	*arbtr_ctrl |= 0x00001000;	
-
-	clip_addr	= virt_to_bus(saa->clipping);
-	clip_pitch = ((width+31)/32)*4;
-
-	vdma2->base_even	= clip_addr;	
-	vdma2->base_page	= 0x04;	/* enable read - operation */
-	vdma2->prot_addr	= clip_addr + (clip_pitch*height);
-
-	/* convention: if scaling is between 1/2 and 1/4 we only use
-	   the even lines, the odd lines get discarded (see vertical scaling) */
-	if( saa->interlace != 0 && height*4 >= modes_constants[saa->mode].v_calc && height*2 <= modes_constants[saa->mode].v_calc) {
-		vdma2->base_odd		= vdma2->prot_addr;
-		vdma2->pitch		= clip_pitch;
-		vdma2->num_line_byte	= (((height)-1) << 16) | (clip_pitch-1);
-	} else {
-		vdma2->base_odd		= clip_addr+clip_pitch;
-		vdma2->pitch		= clip_pitch*2;
-		vdma2->num_line_byte	= (((height/2)-1) << 16) | (clip_pitch-1);
-	}
-
-	*clip_format &= 0xfffffff7;
-
-	return 0;
-}
-
-/* helper functions for emulate rect-clipping via mask-clipping.
-   note: these are extremely inefficient, but for clipping with less than 16
-   windows rect-clipping should be done anyway...
-*/
-
-/* clear one pixel of the clipping memory at position (x,y) */
-void set_pixel(s32 x, s32 y, s32 window_width, u32* mem) {
-
-	u32 mem_per_row = 0;
-	u32 adr		= 0;
-	u32 shift 	= 0;
-	u32 bit 	= 0;
-
-	mem_per_row 	= (window_width + 31 )/ 32 ;
-	adr 		= y * mem_per_row + (x / 32);
-	shift 		= 31 - (x % 32);
-	bit 		= (1 << shift);
-	
-	mem[adr] |= bit;	
-}
-
-/* clear a box out of the clipping memory, beginning at (x,y) with "width" and "height" */
-void set_box(s32 x, s32 y, s32 width, s32 height, s32 window_width, s32 window_height, u32* mem)
-{
-	s32 ty = 0;
-	s32 tx = 0;
-
-	/* the video_clip-struct may contain negative values to indicate that a window
-	   doesn't lay completly over the video window. Thus, we correct the values */
-	
-	if( width < 0) {
-		x += width; width = -width;
-	}
-	if( height < 0) {
-		y += height; height = -height;
-	}
-
-	if( x < 0) {
-		width += x; x = 0;
-	}
-	if( y < 0) {
-		height += y; y = 0;
-	}
-
-	if( width <= 0 || height <= 0) {
- 		printk("saa7146: ==> set_box: sanity error!\n");
-		return;
-	}			
-
-	if(x + width > window_width)
-		width -= (x + width) - window_width;
-	if(y + height > window_height)
-		height -= (y + height) - window_height;
-
-	/* Now, set a '1' in the memory, where no video picture should appear */
-	for(ty = y; ty < y+height; ty++) {		
-		for(tx = x; tx < x+width; tx++) {
-			set_pixel(tx, ty, window_width, mem);
-		}
-	}
-}
-
-int emulate_rect_clipping(struct saa7146 *saa, u16 clipcount, int x[], int y[], int w[], int h[], u32 w_width, u32 w_height)
-{
-	int i = 0;
-	
-	/* clear out clipping mem */
-	memset(saa->clipping, 0x0, CLIPPING_MEM_SIZE*sizeof(u32));
-
-	/* go through list of clipping-windows, clear out rectangular-regions in the clipping memory */
-	for(i = 0; i < clipcount; i++) {
-		set_box(x[i], y[i], w[i], h[i], w_width, w_height, saa->clipping);
-	}		
-
-	return 0;
-}
-
-/* ---------------------------------------------*/
-/* rectangle-clipping				*/
-/* ---------------------------------------------*/
-
-#define MIN(x,y)	( ((x) < (y)) ? (x) : (y) )
-#define MAX(x,y)	( ((x) > (y)) ? (x) : (y) )
-
-/* simple double-sort algorithm with duplicate elimination */
-int sort_and_eliminate(u32* values, int* count)
-{
-	int low = 0, high = 0, top = 0, temp = 0;
-	int cur = 0, next = 0;
-	
-	/* sanity checks */
-	if( (0 > *count) || (NULL == values) ) {
-		printk("saa7146: ==> sort_and_eliminate: internal error #1\n");
-		return -EINVAL;
-	}
-	
-	/* bubble sort the first ´count´ items of the array ´values´ */
-	for( top = *count; top > 0; top--) {
-		for( low = 0, high = 1; high < top; low++, high++) {
-			if( values[low] > values[high] ) {
-				temp = values[low];
-				values[low] = values[high];
-				values[high] = temp;
-			}
-		}
-	}
-
-	/* remove duplicate items */
-	for( cur = 0, next = 1; next < *count; next++) {
-		if( values[cur] != values[next])
-			values[++cur] = values[next];
-	}
-	
-	*count = cur + 1;
-	 
-	return 0;
-}
-
-int calculate_clipping_registers_rect(struct saa7146 *saa, int clipcount, int x[], int y[], int w[], int h[], u32 width, u32 height, struct saa7146_video_dma* vdma2, u32* clip_format, u32* arbtr_ctrl)
-{
-	u32 line_list[32];			
-	u32 pixel_list[32];
-	u32 numdwords = 0;
-
-	int i = 0, j = 0;
-	int l = 0, r = 0, t = 0, b = 0;
-	int cnt_line = 0, cnt_pixel = 0;
-
-	dprintk("saa7146: ==> calculate_clipping_registers_clip\n");
-							
-	/* clear out memory */
-	memset(&line_list[0],  0x00, sizeof(u32)*32);
-	memset(&pixel_list[0], 0x00, sizeof(u32)*32);
-	memset(saa->clipping,  0x00, sizeof(u32)*CLIPPING_MEM_SIZE);
-
-	/* fill the line and pixel-lists */
-	for(i = 0; i < clipcount; i++) {
-
-		/* calculate values for l(eft), r(ight), t(op), b(ottom) */
-		l = x[i];
-		r = x[i]+w[i];
-		t = y[i];
-		b = y[i]+h[i];
-
-		/* insert left/right coordinates */
-		pixel_list[ 2*i   ] = MIN(l, width);
-		pixel_list[(2*i)+1] = MIN(r, width);
-		/* insert top/bottom coordinates */
-		line_list[ 2*i   ] = MIN(t, height);
-		line_list[(2*i)+1] = MIN(b, height);
-	}
-
-	/* sort and eliminate lists */
-	cnt_line = cnt_pixel = 2*clipcount;
-	sort_and_eliminate( &pixel_list[0], &cnt_pixel );
-	sort_and_eliminate( &line_list[0], &cnt_line );
-
-	/* calculate the number of used u32s */
-	numdwords = MAX( (cnt_line+1), (cnt_pixel+1))*2; 
-	numdwords = MAX(4, numdwords);
-	numdwords = MIN(64, numdwords);
-
-	/* fill up cliptable */
-	for(i = 0; i < cnt_pixel; i++) {
-		saa->clipping[2*i] |= (pixel_list[i] << 16);
-	}
-	for(i = 0; i < cnt_line; i++) {
-		saa->clipping[(2*i)+1] |= (line_list[i] << 16);
-	}
-
-	/* fill up cliptable with the display infos */
-	for(j = 0; j < clipcount; j++) {
-
-		for(i = 0; i < cnt_pixel; i++) {
-
-			if( x[j] < 0)
-				x[j] = 0;
-
-			if( pixel_list[i] < (x[j] + w[j])) {
-			
-				if ( pixel_list[i] >= x[j] ) {
-					saa->clipping[2*i] |= (1 << j);			
-				}
-			}
-		}
-		for(i = 0; i < cnt_line; i++) {
-
-			if( y[j] < 0)
-				y[j] = 0;
-
-			if( line_list[i] < (y[j] + h[j]) ) {
-
-				if( line_list[i] >= y[j] ) {
-					saa->clipping[(2*i)+1] |= (1 << j);			
-				}
-			}
-		}
-	}
-
-	/* adjust arbitration control register */
-	*arbtr_ctrl &= 0xffff00ff;
-	*arbtr_ctrl |= 0x00001c00;	
-	
-	vdma2->base_even	= virt_to_bus(saa->clipping);
-	vdma2->base_odd		= virt_to_bus(saa->clipping);
-	vdma2->prot_addr	= virt_to_bus(saa->clipping)+((sizeof(u32))*(numdwords));
-	vdma2->base_page	= 0x04;
-	vdma2->pitch		= 0x00;
-	vdma2->num_line_byte	= (0 << 16 | (sizeof(u32))*(numdwords-1) );
-
-	/* set clipping-mode. please note again, that for sizes below 1/2, we only use the
-	   even-field. because of this, we have to specify ´recinterl´ correctly (specs, p. 97)*/
-	*clip_format &= 0xfffffff7;
-
-	if( saa->interlace != 0 && height*4 >= modes_constants[saa->mode].v_calc && height*2 <= modes_constants[saa->mode].v_calc) {
-		*clip_format |= 0x00000000;
-	} else {
-		*clip_format |= 0x00000008;
-	}
-	return 0;
-}
-
-
-/* ---------------------------------------------*/
-/* main function for clipping			*/
-/* ---------------------------------------------*/
-/* arguments:
-	type 	= see ´saa7146.h´
-	width 	= width of the video-window
-	height 	= height of the video-window
-	*mask 	= pointer to mask memory	(only needed for mask-clipping)
-	*clips	= pointer to clip-window-list   (only needed for rect-clipping)
-	clipcount = # of clip-windows		(only needed for rect-clipping)
-*/
-int clip_windows(struct saa7146* saa, u32 type, u32 width, u32 height, u32* mask, u16 clipcount, int x[], int y[], int w[], int h[]) 
-{
-	struct	saa7146_video_dma	vdma2;
-
-	u32 clip_format	= saa7146_read(saa->mem, CLIP_FORMAT_CTRL);
-	u32 arbtr_ctrl	= saa7146_read(saa->mem, PCI_BT_V1);
-
-	hprintk("saa7146: ==> clip_windows\n");
-	
-	/* some sanity checks first */
-	if ( width <= 0 || height <= 0 ) {
-		printk("saa7146: ==> clip_windows: sanity error #1!\n");
-		return -EINVAL;
-	}
-
-	/* check if anything to do here, disable clipping if == 0 */
-	if( clipcount == 0 ) {
-	
-		/* mask out relevant bits (=lower word)*/
-		clip_format &= MASK_W1;
-
-		/* upload clipping-registers*/
-		saa7146_write(saa->mem, CLIP_FORMAT_CTRL,clip_format);
- 		saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21));
- 
- 		/* disable video dma2 */
-		saa7146_write(saa->mem, MC1, (MASK_21));
-
-		return 0;
-	}
-
-	switch(type) {
-		
-		case SAA7146_CLIPPING_MASK_INVERTED:
-		case SAA7146_CLIPPING_MASK:
-		{
-		  printk("mask\n");
-			/* sanity check */
-			if( NULL == mask ) {
-				printk("saa7146: ==> clip_windows: sanity error #1!\n");
-				return -EINVAL;
-			}
-			
-			/* copy the clipping mask to structure */
-			memmove(saa->clipping, mask, CLIPPING_MEM_SIZE*sizeof(u32));
-			/* set clipping registers */
-			calculate_clipping_registers_mask(saa,width,height,&vdma2,&clip_format,&arbtr_ctrl);
-
-			break;
-		}
-
-		case SAA7146_CLIPPING_RECT_INVERTED:
-		case SAA7146_CLIPPING_RECT:
-		{
-			/* see if we have anything to do */
-			if ( 0 == clipcount ) {
-				return 0;	
-			}
-
-			/* sanity check */
-			if( NULL == x || NULL == y || NULL == w || NULL == h ) {
-				printk("saa7146: ==> clip_windows: sanity error #2!\n");
-				return -EINVAL;
-			}
-
-			/* rectangle clipping can only handle 16 overlay windows; if we
-			   have more, we have do emulate the whole thing with mask-clipping */
-			if (1) { //clipcount >  > 16 ) {
-			  //printk("emulate\n");
-				emulate_rect_clipping(saa, clipcount, x,y,w,h, width, height);
-				calculate_clipping_registers_mask(saa,width,height,&vdma2,&clip_format,&arbtr_ctrl);
-				if( SAA7146_CLIPPING_RECT == type )
-					type = SAA7146_CLIPPING_MASK;
-				else
-					type = SAA7146_CLIPPING_MASK_INVERTED;
-				
-			}
-			else {
-				calculate_clipping_registers_rect(saa,clipcount,x,y,w,h,width,height,&vdma2,&clip_format,&arbtr_ctrl);
-			}
-			
-			break;
-		}
-
-		default:
-		{
-			printk("saa7146: ==> clip_windows: internal error #1!\n");
-			return -EINVAL;
-		}
-	
-	}
-
-	/* set clipping format */
-	clip_format &= 0xffff0008;
-	clip_format |= (type << 4);
-
-	saa7146_write(saa->mem, BASE_EVEN2,     vdma2.base_even);
-	saa7146_write(saa->mem, BASE_ODD2,      vdma2.base_odd);
-	saa7146_write(saa->mem, PROT_ADDR2,     vdma2.prot_addr);
-	saa7146_write(saa->mem, BASE_PAGE2,     vdma2.base_page);
-	saa7146_write(saa->mem, PITCH2,		vdma2.pitch);
-	saa7146_write(saa->mem, NUM_LINE_BYTE2,	vdma2.num_line_byte);
-
-	saa7146_write(saa->mem, CLIP_FORMAT_CTRL,clip_format);
-	saa7146_write(saa->mem, PCI_BT_V1, arbtr_ctrl);	
-
-	/* upload clip_control-register, clipping-registers, enable video dma2 */
-	saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21 | MASK_03 | MASK_19));
-	saa7146_write(saa->mem, MC1, (MASK_05 | MASK_21));
-/*
-       	printk("ARBTR_CTRL:     0x%08x\n",saa7146_read(saa->mem, PCI_BT_V1));
-       	printk("CLIP_FORMAT:    0x%08x\n",saa7146_read(saa->mem, CLIP_FORMAT_CTRL));
-        printk("BASE_ODD1:      0x%08x\n",saa7146_read(saa->mem, BASE_ODD1));
-        printk("BASE_EVEN1:     0x%08x\n",saa7146_read(saa->mem, BASE_EVEN1));
-        printk("PROT_ADDR1:     0x%08x\n",saa7146_read(saa->mem, PROT_ADDR1));
-        printk("PITCH1:         0x%08x\n",saa7146_read(saa->mem, PITCH1));
-        printk("BASE_PAGE1:     0x%08x\n",saa7146_read(saa->mem, BASE_PAGE1));
-        printk("NUM_LINE_BYTE1: 0x%08x\n",saa7146_read(saa->mem, NUM_LINE_BYTE1));
-        printk("BASE_ODD2:      0x%08x\n",saa7146_read(saa->mem, BASE_ODD2));
-        printk("BASE_EVEN2:     0x%08x\n",saa7146_read(saa->mem, BASE_EVEN2));
-        printk("PROT_ADDR2:     0x%08x\n",saa7146_read(saa->mem, PROT_ADDR2));
-        printk("PITCH2:         0x%08x\n",saa7146_read(saa->mem, PITCH2));
-        printk("BASE_PAGE2:     0x%08x\n",saa7146_read(saa->mem, BASE_PAGE2));
-        printk("NUM_LINE_BYTE2: 0x%08x\n",saa7146_read(saa->mem, NUM_LINE_BYTE2));
-*/
-	return 0;
-
-}		
-#endif
-
-#ifdef __COMPILE_SAA7146_I2C__
-
-/* ---------------------------------------------*/
-/* i2c-helper functions				*/
-/* ---------------------------------------------*/
-
-/* this functions gets the status from the saa7146 at address 'addr'
-   and returns it */
-u32 i2c_status_check(struct saa7146* saa) 
-{
-	u32 iicsta = 0;
-	
-	iicsta = saa7146_read(saa->mem, I2C_STATUS );
-	hprintk("saa7146: ==> i2c_status_check:0x%08x\n",iicsta);
-
-	return iicsta;
-}
-
-/* this function should be called after an i2c-command has been written. 
-   if we are debugging, it checks, if the busy flags rises and falls correctly
-   and reports a timeout (-1) or the error-bits set like in described in the specs,
-   p.123, table 110 */
-int i2c_busy_rise_and_fall(struct saa7146* saa, int timeout)
-{
-	int i = 0;
-	u32 status = 0;
-		
-	hprintk("saa7146: ==> i2c_busy_rise_and_fall\n");
-
-	/* wait until busy-flag rises */
-	for (i = 5; i > 0; i--) {
-
-		hprintk("saa7146: i2c_busy_rise_and_fall; rise wait %d\n",i);
-
-		status = i2c_status_check(saa);
-
-		/* check busy flag */
-		if ( 0 != (status & SAA7146_I2C_BUSY))
-			break;
-
-		/* see if anything can be done while we're waiting */
-		cond_resched ();
-		mdelay(1);
-	}
-
-	/* we don't check the i-value, since it does not matter
-	   if we missed the rise of the busy flag or the fall or
-	   whatever. we just have to wait some undefined time
-	   after an i2c-command has been written out */	
-	
-	/* wait until busy-flag is inactive or error is reported */
-	for (i = timeout; i > 0; i--) {
-	
-		hprintk("saa7146: i2c_busy_rise_and_fall; fall wait %d\n",i);
-
-		status = i2c_status_check(saa);
-
-		/* check busy flag */
-		if ( 0 == (status & SAA7146_I2C_BUSY))
-			break;
-
-		/* check error flag */
-		if ( 0 != (status & SAA7146_I2C_ERR))
-			break;
-
-		/* see if anything can be done while we're waiting */
-		cond_resched ();
-
-		mdelay(1);
-	}
-	
-	/* did a timeout occur ? */
-	if ( 0 == i ) {
-		hprintk("saa7146: i2c_busy_rise_and_fall: timeout #2\n");
-		return -1;
-	}
-	
-	/* report every error pending */
-	switch( status & 0xfc ) {
-		
-		case SAA7146_I2C_SPERR:
-			hprintk("saa7146: i2c_busy_rise_and_fall: error due to invalid start/stop condition\n");
-			break;
-
-		case SAA7146_I2C_APERR:
-			hprintk("saa7146: i2c_busy_rise_and_fall: error in address phase\n");
-			break;
-
-		case SAA7146_I2C_DTERR:
-			hprintk("saa7146: i2c_busy_rise_and_fall: error in data transmission\n");
-			break;
-
-		case SAA7146_I2C_DRERR:
-			hprintk("saa7146: i2c_busy_rise_and_fall: error when receiving data\n");
-			break;
-
-		case SAA7146_I2C_AL:
-			hprintk("saa7146: i2c_busy_rise_and_fall: error because arbitration lost\n");
-			break;
-	}
-				
-	return status;	
-
-}
-
-/* this functions resets the saa7146 at address 'addr'
-   and returns 0 if everything was fine, otherwise -1 */
-int i2c_reset(struct saa7146* saa)
-{
-	u32 status = 0;
-
-	hprintk("saa7146: ==> i2c_reset\n");
-
-	status = i2c_status_check(saa);
-
-	/* clear data-byte for sure */
-    	saa7146_write(saa->mem, I2C_TRANSFER, 0x00);
-	
-	/* check if any operation is still in progress */
-	if ( 0 != ( status & SAA7146_I2C_BUSY) ) {
-
-		/* Yes, kill ongoing operation */
-		hprintk("saa7146: i2c_reset: busy_state detected\n"); 
-
-		/* set ABORT-OPERATION-bit */
-		saa7146_write(saa->mem, I2C_STATUS, ( SAA7146_I2C_BBR | MASK_07));
-		saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16));
-		mdelay( SAA7146_I2C_DELAY );
-
-		/* clear all error-bits pending; this is needed because p.123, note 1 */
-		saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR );
-		saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16));
-		mdelay( SAA7146_I2C_DELAY );
- 	}
-
-	/* check if any other error is still present */
-	if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) {
-
-		/* yes, try to kick it */
-		hprintk("saa7146: i2c_reset: error_state detected, status:0x%08x\n",status);
-
-		/* clear all error-bits pending */
-		saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR );
-		saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16));
-		mdelay( SAA7146_I2C_DELAY );
- 		/* the data sheet says it might be necessary to clear the status
-		   twice after an abort */
-		saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR );
-		saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16));
-	}
-
-	/* if any error is still present, a fatal error has occurred ... */
-	if ( SAA7146_I2C_BBR != (status = i2c_status_check(saa)) ) {
-		hprintk("saa7146: i2c_reset: fatal error, status:0x%08x\n",status);
-		return -EIO;
-	}
-
-	return 0;
-}
-
-/* this functions writes out the data-bytes at 'data' to the saa7146
-   at address 'addr' regarding the 'timeout' and 'retries' values;
-   it returns 0 if ok, -1 if the transfer failed, -2 if the transfer
-   failed badly (e.g. address error) */
-int i2c_write_out(struct saa7146* saa, u32* data, int timeout)
-{
-	int status = 0;
-		
-	hprintk("saa7146: ==> writeout: 0x%08x (before) (to:%d)\n",*data,timeout);
-	
-	/* write out i2c-command */
-	saa7146_write(saa->mem, I2C_TRANSFER, *data);
-   	saa7146_write(saa->mem, I2C_STATUS, SAA7146_I2C_BBR);
-	saa7146_write(saa->mem, MC2, (MASK_00 | MASK_16));
-
-	/* after writing out an i2c-command we have to wait for a while;
-	   because we do not know, how long we have to wait, we simply look
-	   what the busy-flag is doing, before doing something else */
-	 
-	/* reason: while fiddling around with the i2c-routines, I noticed
-	   that after writing out an i2c-command, one may not read out the
-	   status immediately after that. you *must* wait some time, before
-	   even the busy-flag gets set */
-	   
-	status = i2c_busy_rise_and_fall(saa,timeout);
-
-	if ( -1 == status ) {
-		hprintk("saa7146: i2c_write_out; timeout\n");
-		return -ETIMEDOUT;
-	}
-
-	/* we only handle address-errors here */
-	if ( 0 != (status & SAA7146_I2C_APERR)) {
-		hprintk("saa7146: i2c_write_out; error in address phase\n");
-		return -EREMOTEIO;
-	}
-
-	/* check for some other mysterious error; we don't handle this here */
-	if ( 0 != ( status & 0xff)) {
-		hprintk("saa7146: i2c_write_out: some error has occurred\n");
-        	return -EIO;
-  	}
-	
-	/* read back data, just in case we were reading ... */
-	*data = saa7146_read(saa->mem, I2C_TRANSFER);
-
-	hprintk("saa7146: writeout: 0x%08x (after)\n",*data);
-
-	return 0;
-}
-
-int clean_up(struct i2c_msg m[], int num, u32 *op)
-{
-	u16 i, j;
-	u16 op_count = 0;
-
-	/* loop through all messages */
-	for(i = 0; i < num; i++) {
-		op_count++;
-		/* loop throgh all bytes of message i */
-		for(j = 0; j < m[i].len; j++) {
-			/* write back all bytes that could have been read */
-			m[i].buf[j] = (op[op_count/3] >> ((3-(op_count%3))*8));
-			op_count++;
-		}
-	}
-	
-	return 0;
-}
-
-int prepare(struct i2c_msg m[], int num, u32 *op)
-{
-	u16 h1, h2;
-	u16 i, j, addr;
-	u16 mem = 0, op_count = 0;
-
-//for (i=0; i<num; i++) { printk ("\n%02x (%s): ", m[i].addr, m[i].flags & I2C_M_RD ? "R" : "W"); for (j=0; j<m[i].len; j++) { m[i].buf[j] &= 0xff; printk (" %02x ", (u8) m[i].buf[j]); } } printk ("\n");
-	/* determine size of needed memory */
-	for(i = 0; i < num; i++)
-		mem += m[i].len + 1;
-
-	/* we need one u32 for three bytes to be send plus
-	   one byte to address the device */
-	mem = 1 + ((mem-1) / 3);
-
-	if ( mem > I2C_MEM_SIZE ) {
-		hprintk("saa7146: prepare: i2c-message to big\n");
-		return -1;
-	}
-
-	/* be careful: clear out the i2c-mem first */
-	memset(op,0,sizeof(u32)*mem);
-
-	for(i = 0; i < num; i++) {
-		/* insert the address of the i2c-slave.
-		 * note: we get 7-bit-i2c-addresses,
-		 * so we have to perform a translation
-		 */
-		addr = (m[i].addr << 1) | ((m[i].flags & I2C_M_RD) ? 1 : 0);
-		h1 = op_count/3; h2 = op_count%3;
-		op[h1] |= ((u8)addr << ((3-h2)*8));
-		op[h1] |= (SAA7146_I2C_START << ((3-h2)*2));
-		op_count++;
-		/* loop through all bytes of message i */
-		for(j = 0; j < m[i].len; j++) {
-			/* insert the data bytes */
-			h1 = op_count/3; h2 = op_count%3;
-			op[h1] |= ((u8)m[i].buf[j] << ((3-h2)*8));
-			op[h1] |= (SAA7146_I2C_CONT << ((3-h2)*2));
-			op_count++;
-		}
-	}
-
-	/* have a look at the last byte inserted:
-	 * if it was: ...CONT change it to ...STOP
-	 */
-	h1 = (op_count-1)/3; h2 = (op_count-1)%3;
-	if ( SAA7146_I2C_CONT == (0x3 & ((op[h1]) >> ((3-h2)*2))) ) {
-		op[h1] &= ~(0x2 << ((3-h2)*2));
-		op[h1] |= (SAA7146_I2C_STOP << ((3-h2)*2));
-	}
-
-	return mem;
-}
-#endif
-
-
-#ifdef __COMPILE_SAA7146_DEBI__
-
-/* functions for accessing the debi-port. note: we currently don't support 
- * page-table-transfers.
- */
-
-#define MY_DEBI_TIMEOUT_MS 5
-
-int	debi_transfer(struct saa7146* saa, struct saa7146_debi_transfer* dt)
-{
-	u32	debi_config = 0, debi_command = 0, debi_page = 0, debi_ad = 0;
-	u32	timeout = MY_DEBI_TIMEOUT_MS;
-
-	/* sanity checks */
-	if(dt->direction > 1 || dt->timeout > 15 || dt->swap > 3 || dt->slave16 > 2 || dt->intel > 1 || dt->increment > 1 || dt->tien > 1 )
-		return -EINVAL;
-
-	debi_page	= 0;
-	/* keep bits 31,30,28 clear */
-	debi_config	= (dt->timeout << 22) | (dt->swap << 20) | (dt->slave16 << 19) | (dt->increment << 18) | (dt->intel << 17) | (dt->tien << 16);
-	debi_command	= (dt->num_bytes << 17) | (dt->direction << 16) | (dt->address << 0);
-	debi_ad		= dt->mem;
-
-	saa7146_write(saa->mem, DEBI_PAGE,	debi_page);	
-	saa7146_write(saa->mem, DEBI_CONFIG,	debi_config);	
-	saa7146_write(saa->mem, DEBI_COMMAND,	debi_command);	
-	saa7146_write(saa->mem, DEBI_AD,	debi_ad);	
-
-	/* upload debi-registers */
-	saa7146_write(saa->mem, MC2, (MASK_01|MASK_17));
-
-	/* wait for DEBI upload to complete */
-	while (! (saa7146_read(saa->mem, MC2) & 0x2));
-
-	while( --timeout ) {
-		/* check, if DEBI still active */
-		u32 psr = saa7146_read(saa->mem, PSR);
-		if (0 !=  (psr & SPCI_DEBI_S)) {
-			/* check, if error occurred */
-/*			if ( 0 != (saa7146_read(saa->mem, SSR) & (MASK_23|MASK_22))) { */
-			if ( 0 != (saa7146_read(saa->mem, SSR) & (MASK_22))) {
-				/* clear error status and indicate error */
-				saa7146_write(saa->mem, ISR, SPCI_DEBI_E);
-				return -1;
-			}
-		 }
-		else {
-			/* Clear status bit */
-			saa7146_write(saa->mem, ISR, SPCI_DEBI_S);
-			break;
-		}
-		/* I don´t know how we should actually wait for the debi to have finished.
-		   we simply wait 1ms here and then check in a loop for max. MY_DEBI_TIMEOUT_MS */		
-		mdelay(1);
-	}
-
-	/* check for timeout */
-	if( 0 == timeout ) {
-		return -1;
-	}
-
-	/* read back data if we did immediate read-transfer */
-	if(dt->num_bytes <= 4 && dt->direction == 1) {
-		dt->mem = saa7146_read(saa->mem, DEBI_AD);
-		switch(dt->num_bytes) {
-			case 1:
-			 dt->mem &= 0x000000ff;
-			break;
-			case 2:
-			 dt->mem &= 0x0000ffff;
-			break;
-			case 3:
-			 dt->mem &= 0x00ffffff;
-			break;
-		}		
-	}
-	
-	return 0;
-}
-#endif
-
-#ifdef __COMPILE_SAA7146_STUFF__
-/* ---------------------------------------------*/
-/* helper-function: set gpio-pins		*/
-/* ---------------------------------------------*/
-void	gpio_set(struct saa7146* saa, u8 pin, u8 data)
-{
-	u32 value = 0;
-
-	/* sanity check */
-	if(pin > 3)
-		return;
-
-	/* read old register contents */
-	value = saa7146_read(saa->mem, GPIO_CTRL );
-	
-	value &= ~(0xff << (8*pin));
-	value |= (data << (8*pin));
-
-	saa7146_write(saa->mem, GPIO_CTRL, value);
-}
-
-void select_input(struct saa7146* saa, int p)
-{
-	u32 hps_ctrl = 0;
-
-	/* sanity check */
-	if( p < 0 || p > 1 )
-		return;
-
-	/* read old state */
-	hps_ctrl = saa7146_read(saa->mem, HPS_CTRL);
-
-	/* mask out relevant bits */
-	hps_ctrl &= ~( MASK_31 | MASK_30 | MASK_28 );
-
-	/* set bits for input b */
-	if( 1 == p ) {
-		hps_ctrl |= ( (1 << 30) | (1 << 28) );
-	}
-
-	/* write back & upload register */
-	saa7146_write(saa->mem, HPS_CTRL, hps_ctrl);
-	saa7146_write(saa->mem, MC2, (MASK_05 | MASK_21));
-} 
-
-#endif
-
diff -Nru a/drivers/media/dvb/av7110/saa7146_core.c b/drivers/media/dvb/av7110/saa7146_core.c
--- a/drivers/media/dvb/av7110/saa7146_core.c	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,962 +0,0 @@
-/*
-    saa7146_core.c - core-functions + i2c driver for the saa7146 by
-    Philips Semiconductors.
-    
-    Copyright (C) 1998,1999 Michael Hunold <michael@mihu.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/module.h>	/* for module-version */
-#include <linux/delay.h>	/* for delay-stuff */
-#include <linux/slab.h>		/* for kmalloc/kfree */
-#include <linux/pci.h>		/* for pci-config-stuff, vendor ids etc. */
-#include <linux/wrapper.h>	/* for mem_map_reserve */
-#include <linux/init.h>
-#include <asm/io.h>		/* for accessing the pci-device */
-#include <linux/vmalloc.h>	/* for module-version */
-
-#include "saa7146_defs.h"
-#include "saa7146_core.h"
-#include "saa7146_v4l.h"
-#include "av7110.h"
-#include "compat.h"
-#include "dvb_i2c.h"
-
-/* insmod parameter: here you can specify the number of video-buffers
-   to be allocated. for simple capturing 2 buffers (double-buffering)
-   should suffice. but if you plan to do 25fps grabbing, you should
-   set this to 4(=maximum), in order to be able to catch up from
-   temporarily delays */
-static int buffers = 2;
-
-/* insmod parameter: some programs (e.g. ´vic´) do not allow to
-   specify the used video-mode, so you have to tell this to the
-   modules by hand, 0 = PAL (default), 1 = NTSC  */
-static int mode;
-
-/* debug levels: 0 -- no debugging outputs: default
-		 1 -- prints out entering (and exiting if useful) of functions
-		 2 -- prints out very, very detailed informations of what is going on
-		 3 -- both of the above */
-int saa7146_debug;	/* insmod parameter */
-
-#define dprintk		if (saa7146_debug & 1) printk
-#define hprintk		if (saa7146_debug & 2) printk
-
-/* ---------------------------------------------*/
-/* memory functions - taken from bttv.c		*/
-/* ---------------------------------------------*/
-
-static inline unsigned long kvirt_to_pa(unsigned long adr) 
-{
-	unsigned long kva;
-
-	kva = (unsigned long) page_address(vmalloc_to_page((void *)adr));
-	kva |= adr & (PAGE_SIZE-1); /* restore the offset */
-
-	return __pa(kva);
-}
-
-
-static LIST_HEAD(saa7146_list);
-
-static int saa7146_extension_count = 0;
-static struct saa7146_extension* saa7146_ext[SAA7146_MAX_EXTENSIONS];
-
-#define SAA7146_I2C_TIMEOUT  100   /* in ms */
-#define SAA7146_I2C_RETRIES  6
-
-static u32 SAA7146_I2C_BBR = SAA7146_I2C_BUS_BIT_RATE_3200;
-
-#define	__COMPILE_SAA7146_I2C__
-#define	__COMPILE_SAA7146_DEBI__
-#include "saa7146.c"
-#undef	__COMPILE_SAA7146_I2C__
-
-/* ---------------------------------------------*/
-/* memory functions designed for saa7146	*/
-/* ---------------------------------------------*/
-
-/* rvmalloc allocates the memory and builds up
-   the page-tables for ´quant´-number of buffers */
-static void* rvmalloc(int quant, u32* pt[])
-{
-	void* mem;
-
-	unsigned long adr = 0;
-	unsigned long count = 0;
-
-	u32* ptp = 0;
-	int i = 0, j = 0;
-
-	dprintk(KERN_ERR "saa7146: rvmalloc called, quant:%d\n",quant);
-
-	if(!quant) 
-		return NULL;
-
-	/* get grabbing memory */
-	mem = vmalloc_32(quant*GRABBING_MEM_SIZE); 
-
-	if(!mem) 
-		return NULL;
-
-	dprintk(KERN_ERR "saa7146: alloc page tables\n");
-
-	/* alloc one page for a page-table for ´quant´ buffers */
-	for(i = 0; i < quant; i++) {
-		pt[i] = (u32*)kmalloc(PAGE_SIZE,GFP_KERNEL);
-
-		/* error: memory could not be allocated */
-		if(!pt[i]) {
-			dprintk(KERN_ERR "saa7146: failed, free tables\n");
-			for(j = (i-1); j >= 0; j--) 
-				kfree(pt[j]);
-			dprintk(KERN_ERR "saa7146: free buffer memory\n");
-			vfree(mem);
-			dprintk(KERN_ERR "saa7146: return 0 address for buffer\n");
-			return NULL;
-		}
-		memset(pt[i], 0x00, PAGE_SIZE);
-	}
-
-	dprintk(KERN_ERR "saa7146: clear RAM\n");
-
-	/* clear the ram out, no junk to the user
-	   note: 0x7f gives a nice grey field
-	   in RGB and YUV as well */
-	memset(mem, 0x7f, quant*GRABBING_MEM_SIZE); 
-
-	dprintk(KERN_ERR "saa7146: build page tables\n");
-	adr = (unsigned long)mem;
-	/* walk through the grabbing-memory and build up the page-tables */
-	for(i = 0; i < quant; i++) {
-
-	        for (count=0; count<GRABBING_MEM_SIZE; count+=PAGE_SIZE) 
-		        mem_map_reserve(virt_to_page(__va(kvirt_to_pa(adr+count))));
-		/* separate loop for SAA MMU, PAGE_SIZE can be !=4096 */
-		ptp = pt[i];
-		for (count=0; count<GRABBING_MEM_SIZE; count+=4096, adr+=4096)
- 	                *(ptp++) = cpu_to_le32(kvirt_to_pa(adr));
-	}
-	dprintk(KERN_ERR "saa7146: page tables built\n");
-	return mem;
-}
-
-static void rvfree(void* mem, int quant, u32* pt[])
-{
-        unsigned long adr, page;
-	unsigned long size = 0;
-
-	int i = 0;
-
-	dprintk(KERN_ERR "saa7146: rvfree called\n");
-
-	if (!quant) 
-		return;
-	
-	if (mem) {
-		adr = (unsigned long)mem;
-		size = quant * GRABBING_MEM_SIZE;
-		
-		while (size > 0) {
-			page = kvirt_to_pa(adr);
-			mem_map_unreserve(virt_to_page(__va(page)));
-			adr	+= PAGE_SIZE;
-			size	-= PAGE_SIZE;
-		}
-		
-		/* release the grabbing memory */
-		vfree(mem);
-	}
-	/* free the page tables */
-	for(i = 0; i < quant; i++) {
-		kfree(pt[i]);
-	}
-}
-
-
-/* ---------------------------------------------*/
-/* i2c-functions				*/
-/* ---------------------------------------------*/
-
-static
-int do_master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num)
-{
-	struct saa7146 *a = i2c->data;
-	int count;
-	int i = 0;
-	
-	dprintk(KERN_ERR "saa7146_core.o: master_xfer called, num:%d\n",num);
-
-	/* prepare the message(s), get number of u32s to transfer */
-	count = prepare(msgs, num, a->i2c);
-
-	if (count < 0) {
-		hprintk(KERN_ERR "saa7146_core.o: could not prepare i2c-message\n");
-		return -EIO;
-	}
-
-	/* reset the i2c-device if necessary */
-	if (i2c_reset(a) < 0) {
-		hprintk(KERN_ERR "saa7146_core.o: could not reset i2c-bus\n");
-		return -EIO;
-	}	
-
-	for(i = 0; i < count; i++) {
-		/* see how many u32 have to be transferred;
-		 * if there is only 1,
-		 * we do not start the whole rps1-engine...
-		 */
-
-			/* if address-error occurred, don't retry */
-		if (i2c_write_out(a, &a->i2c[i], SAA7146_I2C_TIMEOUT) < 0) {
-			hprintk (KERN_ERR "saa7146_core.o: "
-				"i2c error in address phase\n");
-			return -EREMOTEIO;
-	}
-	}
-
-	/* if any things had to be read, get the results */
-	if (clean_up(msgs, num, a->i2c) < 0) {
-		hprintk(KERN_ERR "saa7146_core.o: i2c cleanup failed!\n");
-		return -EIO;
-	}
-
-	/* return the number of delivered messages */
-	return num;
-}
-
-
-
-static
-int master_xfer (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num)
-{
-	struct saa7146 *saa = i2c->data;
-	int retries = SAA7146_I2C_RETRIES;
-	int ret;
-
-	if (down_interruptible (&saa->i2c_sem))
-		return -ERESTARTSYS;
-
-	do {
-		ret = do_master_xfer (i2c, msgs, num);
-	} while (ret != num && retries--);
-
-	up (&saa->i2c_sem);
-
-	return ret;
-}
-
-
-/* registering functions to load algorithms at runtime */
-int i2c_saa7146_add_bus (struct saa7146 *saa)
-{
-	init_MUTEX(&saa->i2c_sem);
-
-	/* enable i2c-port pins */
-	saa7146_write (saa->mem, MC1, (MASK_08 | MASK_24));
-
-	sprintf(saa->name, "saa7146(%d)", saa->dvb_adapter->num);	
-
-	saa->i2c_bus = dvb_register_i2c_bus (master_xfer, saa,
-					     saa->dvb_adapter, 0);
-	if (!saa->i2c_bus)
-		return -ENOMEM;
-
-	return 0;
-}
-
-
-void i2c_saa7146_del_bus (struct saa7146 *saa)
-{
-	dvb_unregister_i2c_bus (master_xfer,
-				saa->i2c_bus->adapter, saa->i2c_bus->id);
-
-	dvb_unregister_adapter (saa->dvb_adapter);
-}
-
-/* ---------------------------------------------*/
-/* debug-helper function: dump-registers	*/
-/* ---------------------------------------------*/
-
-void	dump_registers(unsigned char* mem) {	
-	
-	u16 j = 0;
-	
-	for( j = 0x0; j < 0x1fe; j+=0x4 ) {
-	printk("0x%03x: 0x%08x\n",j,saa7146_read(mem,j));
-	}
-
-}
-
-/* -----------------------------------------------------*/
-/* dispatcher-function for handling external commands	*/
-/* -----------------------------------------------------*/
-
-static int saa7146_core_command (struct dvb_i2c_bus *i2c, unsigned int cmd, void *arg)
-{
-	int i = 0, result = -ENOIOCTLCMD;
-	struct saa7146* saa = i2c->data;
-
-	dprintk("saa7146_core.o: ==> saa7146_core_command\n");
-
-	if( NULL == saa)
-		return -EINVAL;
-
-	/* first let the extensions handle the command */
-	for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) {
-		if (NULL != saa7146_ext[i]) {
-			if( -ENOIOCTLCMD != (result = saa7146_ext[i]->command(saa, saa->data[i], cmd, arg))) {
-				break;
-			}
-		}
-	}
-
-	/* if command has not been handled by an extension, handle it now */
-	if( result == -ENOIOCTLCMD ) {
-		
-		switch(cmd) {
-	        case SAA7146_DUMP_REGISTERS:
-		{
-			dump_registers(saa->mem);
-                        break;
-		}
-		case SAA7146_SET_DD1:
-		{
-			u32 *i = arg;
-
-			dprintk(KERN_ERR "saa7146_core.o: SAA7146_SET_DD1 to 0x%08x\n",*i);
-
-			/* set dd1 port register */
-			saa7146_write(saa->mem, DD1_INIT, *i);
-
-			/* write out init-values */
-			saa7146_write(saa->mem,MC2, (MASK_09 | MASK_10 | MASK_26 | MASK_26));
-
-			break;
-		}
-		case SAA7146_DO_MMAP:
-		{
-			struct vm_area_struct *vma = arg;
-			unsigned long size = vma->vm_end - vma->vm_start;
-			unsigned long start = vma->vm_start;
-			unsigned long page,pos;
-
-			dprintk(KERN_ERR "saa7146_core.o: SAA7146_DO_MMAP.\n");
-			
-			if (size > saa->buffers * GRABBING_MEM_SIZE)
-			        return -EINVAL;
-
-                        if ( NULL == saa->grabbing )
-                                return -EINVAL;
-
-			pos=(unsigned long)saa->grabbing;
-
-			while (size > 0) 
-			{
-			        page = kvirt_to_pa(pos);
-				if (remap_page_range(vma, start, page,
-						     PAGE_SIZE, PAGE_SHARED))
-					return -EAGAIN;
-				start	+= PAGE_SIZE;
-				pos	+= PAGE_SIZE;
-				size	-= PAGE_SIZE;    
-			}
-				
-			break;
-		}
-		case SAA7146_DEBI_TRANSFER: {
-		
-			struct saa7146_debi_transfer *dt = arg;
-
-			dprintk("saa7146_core.o: SAA7146_DEBI_TRANSFER\n");
-			dprintk("saa7146_core.o: timeout:%d, swap:%d, slave16:%d, increment:%d, intel:%d, tien:%d\n", dt->timeout, dt->swap, dt->slave16, dt->increment, dt->intel, dt->tien);
-			dprintk("saa7146_core.o: address:0x%04x, num_bytes:%d, direction:%d, mem:0x%08x\n",dt->address,dt->address,dt->direction,dt->mem);						
-
-			debi_transfer(saa, dt);
-			break;
-		}
-		
-		default: {
-			return -ENOIOCTLCMD;
-		}
-		}
-	}
-	
-	return 0;
-}
-
-/* -----------------------------------------------------*/
-/* dispatcher-function for handling irq-events		*/
-/* -----------------------------------------------------*/
-
-/* irq-handler function */
-static void saa7146_irq(int irq, void *dev_id, struct pt_regs * regs)
-{
-	struct saa7146 *saa = (struct saa7146 *)dev_id;
-	u32 isr = 0;
-	int i;
-	int count = 0;
-
-	/* process all interrupts */
-	while (1) {
-
-		/* read out the primary status register */
-		isr = saa7146_read(saa->mem, ISR);
-		/* clear all IRQs */
-		saa7146_write(saa->mem, ISR, isr);
-	
-		/* is anything to do? */
-		if ( 0 == isr )
-			return;
-
-		dprintk("%s: irq-call: isr:0x%08x\n",saa->name,isr);
-		
-		/* first let the extensions handle the interrupt */
-		for (i = 0; i < SAA7146_MAX_EXTENSIONS; i++) 
-			if (saa7146_ext[i] && 
-			    (isr&saa7146_ext[i]->handles_irqs)) {
-			  saa7146_ext[i]->irq_handler(saa, isr, saa->data[i]);
-			  //saa7146_write(saa->mem, ISR, saa7146_ext[i]->handles_irqs);
-			}
-		
-		//printk(KERN_ERR "%s: unhandled interrupt: 0x%08x\n", saa->name, isr);
-		
-		/* see if we are in a hard interrupt loop */
-		++count;
-		if (count > 10)
-			printk (KERN_WARNING "%s: irq loop %d\n", saa->name, count);
-		if (count > 20) {
-			saa7146_write(saa->mem, IER, 0x00000000);
-			printk(KERN_ERR "%s: IRQ lockup, cleared int mask\n", saa->name);
-			break;
-		}
-	}
-}
-
-/* -----------------------------------------------------
-   functions for finding any saa7146s in the system,
-   inserting/removing module for kernel, etc.
-   -----------------------------------------------------*/
-
-int configure_saa7146 (struct saa7146 *saa)
-{
-	u32 rev = 0;
-	int result = 0;
-
-	hprintk("saa7146_core.o: ==> configure_saa7146\n");
-
-	/* check module-parameters for sanity */
-
-	/* check if wanted number of video-buffers is valid, otherwise fix it */
-	//if (buffers < 2)
-	//	buffers = 2;
-
-	if ( buffers > SAA7146_MAX_BUF )
-		buffers = SAA7146_MAX_BUF;
-
-	/* check if mode is supported */
-	switch( mode ) {
-		/* 0 = pal, 1 = ntsc */
-		case 0:
-		case 1:
-		{
-			break;
-		}
-		/* default to pal */
-		default:
-		{
-			mode = 0;
-			break;
-		}
-	}
-
-	/* get chip-revision; this is needed to enable bug-fixes */
-	if( 0 > pci_read_config_dword(saa->device, 0x08, &rev)) {
-		printk (KERN_ERR 
-			"saa7146_core.o: cannot read from pci-device!\n");
-		return -1;
-	}
-
-	saa->revision = (rev & 0xf);
-
-	/* remap the memory from virtual to physical address */
-	saa->mem = ioremap ((saa->device->resource[0].start)
-			    &PCI_BASE_ADDRESS_MEM_MASK, 0x1000);
-
-	if ( !saa->mem ) {
-	    	printk(KERN_ERR "saa7146_core.o: cannot map pci-address!\n");
-		return -EFAULT;
-	}
-	
-	/* get clipping memory */	
-	saa->clipping = (u32*) kmalloc (CLIPPING_MEM_SIZE*sizeof(u32),GFP_KERNEL);
-
-	if ( !saa->clipping ) {
-	    	printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for clipping!\n");
-		return -ENOMEM;
-	}
-
-	memset(saa->clipping, 0x0, CLIPPING_MEM_SIZE*sizeof(u32));
-
-	/* get i2c memory */	
-	saa->i2c = (u32*) kmalloc (I2C_MEM_SIZE*sizeof(u32),GFP_KERNEL); /*64*/
-
-	if ( !saa->i2c ) {
-	    	printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for i2c!\n");
-		kfree(saa->clipping);
-		return -ENOMEM;
-	}
-
-	memset(saa->i2c, 0x0, I2C_MEM_SIZE*sizeof(u32));
-	
-	/* get grabbing memory */
-	saa->grabbing = (u32*) rvmalloc (buffers, &saa->page_table[0]);
-
-	if ( !saa->grabbing ) {
-	    	printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for grabbing_mem!\n");
-		kfree(saa->i2c);
-		kfree(saa->clipping);
-		return -ENOMEM;
-	}
-
-	/* get rps0 memory */
-	saa->rps0 = (u32*) kmalloc (RPS_MEM_SIZE*sizeof(u32),GFP_KERNEL);
-
-	if ( !saa->rps0 ) {
-	    	printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for rps0_mem!\n");
-		kfree(saa->i2c);
-		kfree(saa->clipping);
-		rvfree(saa->grabbing, buffers, &saa->page_table[0]);
-		return -ENOMEM;
-	}
-
-	memset(saa->rps0, 0x0, RPS_MEM_SIZE*sizeof(u32));
-
-	/* get rps1 memory */
-	saa->rps1 = (u32*) kmalloc (RPS_MEM_SIZE*sizeof(u32),GFP_KERNEL);
-	if ( !saa->rps1 ) {
-	    	printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for rps1_mem!\n");
-		kfree(saa->rps0);
-		kfree(saa->i2c);
-		kfree(saa->clipping);
-		rvfree(saa->grabbing, buffers, &saa->page_table[0]);
-		return -1;
-	}
-
-	memset(saa->rps1, 0x0, RPS_MEM_SIZE*sizeof(u32));
-
-	/* get debi memory (32kB) */
-	saa->debi = (u32*) kmalloc (8192*sizeof(u32),GFP_KERNEL);
-
-	if ( !saa->debi ) {
-	    	printk(KERN_ERR "saa7146_core.o: not enough kernel-memory for debi_mem!\n");
-		kfree(saa->rps1);
-		kfree(saa->rps0);
-		kfree(saa->i2c);
-		kfree(saa->clipping);
-		rvfree(saa->grabbing, buffers, &saa->page_table[0]);
-		return -1;
-	}
-
-	memset(saa->debi, 0x0, 8192*sizeof(u32));
-
-
-	/* clear out memory for grabbing information */
-	memset(&saa->grab_width[0],  0x0, sizeof(int)*SAA7146_MAX_BUF);
-	memset(&saa->grab_height[0], 0x0, sizeof(int)*SAA7146_MAX_BUF);
-	memset(&saa->grab_format[0], 0x0, sizeof(int)*SAA7146_MAX_BUF);
-	memset(&saa->grab_port[0], 0x0, sizeof(int)*SAA7146_MAX_BUF);
-
-	/* init the frame-status array */
-	memset(&saa->frame_stat[0], GBUFFER_UNUSED, sizeof(int)*SAA7146_MAX_BUF);
-	
-	/* clear out all wait queues */
-	init_waitqueue_head(&saa->rps0_wq);
-	init_waitqueue_head(&saa->rps1_wq);
-	
-
-    	/* request an interrupt for the saa7146 */
-	result = request_irq (saa->device->irq, saa7146_irq,
-			      SA_SHIRQ | SA_INTERRUPT, saa->name, (void *) saa);
-
-	switch(result) {
-		case -EINVAL:
-		{
-			printk(KERN_ERR "saa7146_core.o: Bad irq number or handler\n");
-			return -EINVAL;
-		}
-		case -EBUSY:
-		{
-			printk(KERN_ERR "saa7146_core.o: IRQ %d busy, change your PnP config in BIOS\n", saa->device->irq);
-			return -EBUSY;
-		}
-		case 0:
-		{
-			break;
-		}
-		default:
-		{
-			return result;
-		}
-	}
-	
-	/* print status message */
-    	dprintk("saa7146_core.o: %s: bus:%d, rev:%d, mem:0x%08x.\n", saa->name, saa->device->bus->number, saa->revision, (unsigned int) saa->mem);
-
-	/* enable bus-mastering */
- 	pci_set_master( saa->device );
-
-	/* disable everything on the saa7146, perform a software-reset */
-	saa7146_write(saa->mem, MC1, 0xbfff0000);
-	mdelay(2);
-#if 0
-	{
-		int j;
-
-		/* clear all registers */
-		for( j = 0x0; j < 0xfc; j+=0x4 ) {
-			saa7146_write(saa->mem,j, 0x0000000);
-		}
-		for( j = 0x104; j < 0x1fc; j+=0x4 ) {
-			saa7146_write(saa->mem,j, 0x0000000); 
-		}
-	}
-#endif 
-	/* clear out any rps-signals pending */
-	saa7146_write(saa->mem, MC2, 0xf8000000);
-
-	/* enable video-port-pins*/
-	saa7146_write(saa->mem,MC1, (MASK_10 | MASK_26));
-
-	/* disable all interrupt-conditions, only enable RPS interrupts */
-	saa7146_write(saa->mem, ISR, 0xffffffff);
-	saa7146_write(saa->mem, IER, (MASK_27 | MASK_28));
-/*
-	printk("main: 0x114: 0x%08x\n",saa7146_read(saa->mem, 0x114));
-	printk("main: 0x0e4: 0x%08x\n",saa7146_read(saa->mem, 0x0e4));
-	printk("PSR:   0x%08x\n",saa7146_read(saa->mem, PSR));
-	printk("SSR:   0x%08x\n",saa7146_read(saa->mem, SSR));
-	printk("IER:   0x%08x\n",saa7146_read(saa->mem, IER));
-	printk("ISR:   0x%08x\n",saa7146_read(saa->mem, ISR));
-*/
-
-	saa7146_write(saa->mem,PCI_BT_V1, 0x1c00101f);
-	saa7146_write(saa->mem,BCS_CTRL, 0x80400040);
-
-	/* set dd1 stream a & b */
-      	saa7146_write(saa->mem, DD1_STREAM_B, 0x00000000);
-	saa7146_write(saa->mem, DD1_INIT, 0x02000000);
-	saa7146_write(saa->mem, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
-
-	saa7146_write(saa->mem, MC2, 0x077c077c);
-
-	/* the Siemens DVB needs this if you want to have the i2c chips
-           get recognized before the main driver is loaded 
-	*/
-        saa7146_write(saa->mem, GPIO_CTRL, 0x500000);
-
-	saa->command = &saa7146_core_command;
-	saa->buffers = buffers;
-	saa->mode = mode;
-	saa->interlace = 1;
-
-	i2c_saa7146_add_bus (saa);
-
-        saa7146_write(saa->mem, GPIO_CTRL, 0x000000);
-	return 0;
-}
-
-
-void saa7146_foreach (void (*callback) (struct saa7146* saa, void *data),
-		      void *data)
-{
-	struct list_head *entry;
-
-	list_for_each (entry, &saa7146_list) {
-		struct saa7146* saa;
-
-		saa = list_entry (entry, struct saa7146, list_head);
-		callback (saa, data);
-	}
-}
-
-
-static
-void saa7146_attach_extension (struct saa7146* saa, void *data)
-{
-	int ext_id = (int) data;
-	saa7146_ext[ext_id]->attach (saa, &saa->data[ext_id]);
-}
-
-
-static
-void saa7146_detach_extension (struct saa7146* saa, void *data)
-{
-	int ext_id = (int) data;
-	saa7146_ext[ext_id]->detach (saa, &saa->data[ext_id]);
-}
-
-
-int saa7146_add_extension(struct saa7146_extension* ext)
-{
-	int ext_id = 0;
-
-	for (ext_id = 0; ext_id < SAA7146_MAX_EXTENSIONS; ext_id++) {
-		if (NULL == saa7146_ext[ext_id])
-			break;
-		if (SAA7146_MAX_EXTENSIONS == ext_id) {
-			printk(KERN_WARNING "saa7146.o: attach_extension(%s) - "
-			       "enlarge SAA7146_MAX_EXTENSIONS.\n",ext->name);
-			return -ENOMEM;
-		}
-	}
-
-	saa7146_ext[ext_id] = ext;
-	saa7146_extension_count++;
-
-	if (ext->attach)
- 		saa7146_foreach (saa7146_attach_extension, (void*) ext_id);
-	
-	return 0;
-}
-
-
-int saa7146_del_extension(struct saa7146_extension* ext)
-{
-	int ext_id = 0;
-
-	for (ext_id = 0; ext_id < SAA7146_MAX_EXTENSIONS; ext_id++)
-		if (ext == saa7146_ext[ext_id])
-			break;
-
-	if (SAA7146_MAX_EXTENSIONS == ext_id) {
-		printk("%s: detach_extension extension [%s] not found.\n",
-			__FUNCTION__, ext->name);
-		return -ENODEV;
-	}		
-
-	if (ext->detach)
- 		saa7146_foreach (saa7146_detach_extension, (void*) ext_id);
-	
-	saa7146_ext[ext_id] = NULL;
-	saa7146_extension_count--;		
-
-	return 0;
-}
-
-
-static
-void remove_saa7146(struct saa7146 *saa)
-{
-	i2c_saa7146_del_bus (saa);
-
-	/* shut down all dma transfers */
-        saa7146_write(saa->mem, MC1, 0xbfff0000);
-	
-	dprintk("free irqs\n");
-	/* disable alle irqs, release irq-routine */
-	saa7146_write(saa->mem, IER, 0x00);
-	saa7146_write(saa->mem, ISR, 0xffffffff);
-	free_irq(saa->device->irq, (void *)saa);
-	dprintk("unmap memory\n");
-	/* unmap the memory, if necessary */
-	if (saa->mem)
-		iounmap((unsigned char *)((unsigned int)saa->mem));
-	
-	dprintk("release grabbing memory\n");
-	/* release grabbing memory */
-	if(saa->grabbing)
-		rvfree(saa->grabbing, buffers, &saa->page_table[0]);
-	
-	dprintk("release other memory\n");
-	/* release clipping, i2c, rps0 memory */
-	kfree(saa->clipping);
-	kfree(saa->i2c);
-	kfree(saa->rps0);
-	kfree(saa->rps1);
-	kfree(saa->debi);
-}
-
-
-static int saa7146_suspend(struct pci_dev *pdev, u32 state)
-{
-        printk("saa7146_suspend()\n");
-	saa7146_core_command(((struct saa7146 *)pci_get_drvdata(pdev))->i2c_bus,
-			     SAA7146_SUSPEND, 0);
-	return 0;
-}
-
-static int
-saa7146_resume(struct pci_dev *pdev)
-{
-        printk("saa7146_resume()\n");
-	saa7146_core_command(((struct saa7146 *)pci_get_drvdata(pdev))->i2c_bus,
-			     SAA7146_RESUME, 0);
-	return 0;
-}
-
-
-struct card_info {
-	int type;
-	char *name;
-};
-
-
-static
-int __devinit saa7146_init_one (struct pci_dev *pdev,
-				const struct pci_device_id *ent)
-{
-	struct dvb_adapter *adap;
-	struct saa7146 *saa;
-	int card_type;
-	struct card_info *cinfo= (struct card_info *) ent->driver_data;
-
-	dprintk("saa7146_init_one()\n");
-
-	card_type = cinfo->type;
-	dvb_register_adapter(&adap, cinfo->name);
-
-	if (!(saa = kmalloc (sizeof (struct saa7146), GFP_KERNEL))) {
-		printk ("%s: out of memory!\n", __FUNCTION__);
-		return -ENOMEM;
-	}
-
-	memset (saa, 0, sizeof (struct saa7146));
-
-	saa->device = pdev;
-	pci_set_drvdata(pdev, saa);
-	saa->card_type = card_type;
-	saa->dvb_adapter = adap;
-
-	pci_enable_device (saa->device);
-
-	configure_saa7146 (saa);
-
-	list_add_tail (&saa->list_head, &saa7146_list);
-
-	return 0;
-}
-
-static
-void __devexit saa7146_remove_one (struct pci_dev *pdev)
-{
-	struct saa7146 *saa = pci_get_drvdata(pdev);
-
-	dprintk("saa7146_remove_one()\n");
-
-	list_del (&saa->list_head);
-	pci_disable_device(pdev);
-	remove_saa7146 (saa);
-}
-
-
-static struct card_info fs_1_5 = { DVB_CARD_TT_SIEMENS,   "Siemens cable card PCI rev1.5" };
-static struct card_info fs_1_3 = { DVB_CARD_TT_SIEMENS,   "Siemens/Technotrend/Hauppauge PCI rev1.3" };
-static struct card_info ttbs   = { DVB_CARD_TT_BUDGET,    "TT-Budget/WinTV-NOVA-S  PCI" };
-static struct card_info ttbc   = { DVB_CARD_TT_BUDGET,    "TT-Budget/WinTV-NOVA-C  PCI" };
-static struct card_info ttbt   = { DVB_CARD_TT_BUDGET,    "TT-Budget/WinTV-NOVA-T  PCI" };
-static struct card_info ttbci  = { DVB_CARD_TT_BUDGET_CI, "TT-Budget/WinTV-NOVA-CI PCI" };
-static struct card_info satel  = { DVB_CARD_TT_BUDGET,    "SATELCO Multimedia PCI"};
-static struct card_info unkwn  = { DVB_CARD_TT_SIEMENS,   "Technotrend/Hauppauge PCI rev?(unknown0)?"};
-static struct card_info tt_1_6 = { DVB_CARD_TT_SIEMENS,   "Technotrend/Hauppauge PCI rev1.3 or 1.6" };
-static struct card_info tt_2_1 = { DVB_CARD_TT_SIEMENS,   "Technotrend/Hauppauge PCI rev2.1" };
-static struct card_info tt_t   = { DVB_CARD_TT_SIEMENS,   "Technotrend/Hauppauge PCI DVB-T" };
-static struct card_info knc1   = { DVB_CARD_KNC1,         "KNC1 DVB-S" };
-
-#define PHILIPS_SAA7146 PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146
-#define CARD_INFO driver_data: (unsigned long) &
-
-static struct pci_device_id saa7146_pci_tbl[] __devinitdata = {
-	{ PHILIPS_SAA7146, 0x110a, 0xffff, CARD_INFO fs_1_5 },
-	{ PHILIPS_SAA7146, 0x110a, 0x0000, CARD_INFO fs_1_5 },
-	{ PHILIPS_SAA7146, 0x13c2, 0x1003, CARD_INFO ttbs },
-	{ PHILIPS_SAA7146, 0x13c2, 0x1004, CARD_INFO ttbc },
-	{ PHILIPS_SAA7146, 0x13c2, 0x1005, CARD_INFO ttbt },
-	{ PHILIPS_SAA7146, 0x13c2, 0x100c, CARD_INFO ttbci },
-	{ PHILIPS_SAA7146, 0x13c2, 0x1013, CARD_INFO satel },
-	{ PHILIPS_SAA7146, 0x13c2, 0x0000, CARD_INFO fs_1_3 },
-	{ PHILIPS_SAA7146, 0x13c2, 0x1002, CARD_INFO unkwn },
-	{ PHILIPS_SAA7146, 0x13c2, 0x0001, CARD_INFO tt_1_6 },
-	{ PHILIPS_SAA7146, 0x13c2, 0x0002, CARD_INFO tt_2_1 },
-	{ PHILIPS_SAA7146, 0x13c2, 0x0003, CARD_INFO tt_2_1 },
-	{ PHILIPS_SAA7146, 0x13c2, 0x0004, CARD_INFO tt_2_1 },
-	{ PHILIPS_SAA7146, 0x13c2, 0x0006, CARD_INFO tt_1_6 },
-	{ PHILIPS_SAA7146, 0x13c2, 0x0008, CARD_INFO tt_t },
-	{ PHILIPS_SAA7146, 0xffc2, 0x0000, CARD_INFO unkwn },
-	{ PHILIPS_SAA7146, 0x1131, 0x4f56, CARD_INFO knc1 },
-	{ 0,},
-};
-
-MODULE_DEVICE_TABLE(pci, saa7146_pci_tbl);
-	
-static struct pci_driver saa7146_driver = {
-	.name		= "saa7146",
-	.id_table	= saa7146_pci_tbl,
-	.probe		= saa7146_init_one,
-	.remove		= saa7146_remove_one,
-	.suspend	= saa7146_suspend,
-	.resume		= saa7146_resume,
-};
-
-
-static
-int __init saa7146_init_module(void)
-{
-	int err;
-
-	dprintk("saa7146_init_module\n");
-
-	if ((err = pci_module_init(&saa7146_driver)))
-		return err;
-
-	if ((err = saa7146_v4l_init ()))
-		return err;
-
-	if ((err = av7110_init ()))
-		return err;
-
-	if ((err = av7110_ir_init ()))
-		return err;
-
-	return 0;
-}
-
-static
-void __exit saa7146_cleanup_module(void)
-{
-	av7110_ir_exit ();
-	av7110_exit ();
-	saa7146_v4l_exit ();
-	pci_unregister_driver(&saa7146_driver);
-}
-
-module_init(saa7146_init_module);
-module_exit(saa7146_cleanup_module);
-
-MODULE_AUTHOR("Michael Hunold <michael@mihu.de>, "
-	      "Christian Theiss <mistert@rz.fh-augsburg.de>, "
-	      "Ralph Metzler <rjkm@convergence.de>, "
-	      "Marcus Metzler <mocm@convergence.de>, "
-	      "Holger Waechtler <holger@convergence.de> and others");
-
-MODULE_DESCRIPTION("driver for saa7146/av7110 based DVB PCI cards");
-MODULE_LICENSE("GPL");
-MODULE_PARM(mode,"i");
-MODULE_PARM(saa7146_debug,"i");
-MODULE_PARM(buffers,"i");
-
diff -Nru a/drivers/media/dvb/av7110/saa7146_core.h b/drivers/media/dvb/av7110/saa7146_core.h
--- a/drivers/media/dvb/av7110/saa7146_core.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,111 +0,0 @@
-#ifndef __SAA7146_CORE__
-#define __SAA7146_CORE__
-
-#include <asm/io.h>
-#include <asm/semaphore.h>
-
-#include "dvbdev.h"
-
-
-/* maximum number of capture frames we support */
-#define SAA7146_MAX_BUF		5
-/* maximum number of extensions we support */
-#define SAA7146_MAX_EXTENSIONS	4
-
-/* stuff for writing to saa7146 */
-#define saa7146_write(mem,adr,dat)    writel((dat),(mem+(adr)))
-#define saa7146_read(mem,adr)         readl(mem+(adr))
-
-
-#define DVB_CARD_TT_SIEMENS   0
-#define DVB_CARD_TT_BUDGET    1
-#define DVB_CARD_TT_BUDGET_CI 2
-#define DVB_CARD_KNC1         3
-
-
-/* this struct contains some constants needed for horizontal and vertical scaling. 
-   currently we only support PAL (mode=0)and NTSC (mode=1). */
-
-struct saa7146 {
-
-        char			name[32];	/* give it a nice name */
-
-	struct list_head	list_head;
-	struct pci_dev		*device;
-	int 			card_type;
-
-	struct dvb_adapter	*dvb_adapter;
-	struct dvb_i2c_bus	*i2c_bus;
-	struct semaphore	i2c_sem;
-
-	void*			  data[SAA7146_MAX_EXTENSIONS];	/* data hooks for extensions */
-
-	int (*command) (struct dvb_i2c_bus *i, unsigned int cmd, void *arg);
-
-	unsigned char*		mem;		/* pointer to mapped IO memory */
-	int			revision;	/* chip revision; needed for bug-workarounds*/
-
-	int			interlace;
-	int			mode;
-	
-	u32*	i2c;				/* i2c memory */
-	u32*	grabbing;			/* grabbing memory */
-	u32*	clipping;			/* clipping memory for mask or rectangle clipping*/
-	u32*	rps0;				/* memory for rps0-program */
-	u32*	rps1;				/* memory for rps1-program */
-	u32*	debi;				/* memory for debi-transfers */
-	
-	int	buffers;			/* number of grabbing-buffers */
-		
-	u32*	page_table[SAA7146_MAX_BUF];	/* page_tables for buffers*/
-	int	frame_stat[SAA7146_MAX_BUF];	/* status of grabbing buffers */
-
-	int grab_width[SAA7146_MAX_BUF];	/* pixel width of grabs */
-	int grab_height[SAA7146_MAX_BUF];	/* pixel height of grabs */
-	int grab_format[SAA7146_MAX_BUF];	/* video format of grabs */
-	int grab_port[SAA7146_MAX_BUF];		/* video port for grab */
-
-        wait_queue_head_t rps0_wq;     /* rps0 interrupt queue (=> capture) */
-        wait_queue_head_t rps1_wq;     /* rps1 interrupt queue (=> i2c, ...) */
-};
-
-#define	SAA7146_IRQ_RPS0  
-#define	SAA7146_IRQ_RPS1 
-
-struct saa7146_extension {
-	char	name[32];
-	u32 	handles_irqs;
-
-	void (*irq_handler)(struct saa7146*, u32, void*);
-
-	int (*command)(struct saa7146*, void*, unsigned int cmd, void *arg);
-
-	int (*attach)(struct saa7146*, void**);
-	int (*detach)(struct saa7146*, void**);
-
-	void (*inc_use)(struct saa7146*);
-	void (*dec_use)(struct saa7146*);
-};
-
-extern int saa7146_add_extension(struct saa7146_extension* ext);
-extern int saa7146_del_extension(struct saa7146_extension* ext);
-
-
-/* external grabbing states */
-#define GBUFFER_UNUSED         0x000
-#define GBUFFER_GRABBING       0x001
-#define GBUFFER_DONE           0x002
-
-#define SAA7146_CORE_BASE	200
-
-#define	SAA7146_DO_MMAP		_IOW('d', (SAA7146_CORE_BASE+11), struct vm_area_struct *)
-#define SAA7146_SET_DD1		_IOW('d', (SAA7146_CORE_BASE+12), u32)
-#define SAA7146_DUMP_REGISTERS	_IOW('d', (SAA7146_CORE_BASE+13), u32)
-#define SAA7146_DEBI_TRANSFER	_IOW('d', (SAA7146_CORE_BASE+14), struct saa7146_debi_transfer)
-
-
-#define SAA7146_SUSPEND	_IOW('d', (SAA7146_CORE_BASE+32), u32)
-#define SAA7146_RESUME	_IOW('d', (SAA7146_CORE_BASE+33), u32)
-
-#endif
-
diff -Nru a/drivers/media/dvb/av7110/saa7146_defs.h b/drivers/media/dvb/av7110/saa7146_defs.h
--- a/drivers/media/dvb/av7110/saa7146_defs.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,382 +0,0 @@
-#ifndef __INCLUDED_SAA7146__
-#define __INCLUDED_SAA7146__
-
-struct	saa7146_video_dma {
-	u32 base_odd;
-	u32 base_even;
-	u32 prot_addr;
-	u32 pitch;
-	u32 base_page;
-	u32 num_line_byte;
-};
-
-struct saa7146_debi_transfer {
-
-	u8	timeout;	/* have a look at the specs for reasonable values, p.110 ff */
-	u8	swap;
-	u8	slave16;
-	u8	increment;	/* only for block transfers */
-	u8	intel;
-	u8	tien;
-
-	u16	address;
-	u16	num_bytes;
-	u8	direction;
-	u32	mem;		/* either a "pointer" (actually the physical address) of the debi-memory (block-transfer, use virt_to_bus to supply it) or 4 bytes (as one u32-value) for immediate transfer */
-};
-
-struct saa7146_modes_constants {
-	u8  v_offset;
-	u16 v_field;
-	u16 v_calc;
-	
-	u8  h_offset;
-	u16 h_pixels;
-	u16 h_calc;
-	
-	u16 v_max_out;
-	u16 h_max_out;
-};
-
-struct	saa7146_mmap_struct
-{
-	const char *adr;
-	unsigned long size;
-};
-
-#define SAA7146_PAL	0
-#define SAA7146_NTSC	1
-#define SAA7146_SECAM	2
-
-#define SAA7146_HPS_SOURCE_PORT_A	0x00
-#define SAA7146_HPS_SOURCE_PORT_B	0x01
-#define SAA7146_HPS_SOURCE_YPB_CPA	0x02
-#define SAA7146_HPS_SOURCE_YPA_CPB	0x03
-
-#define SAA7146_HPS_SYNC_PORT_A	0x00
-#define SAA7146_HPS_SYNC_PORT_B	0x01
-
-
-/* Number of vertical active lines */
-#define V_ACTIVE_LINES_PAL	576
-#define V_ACTIVE_LINES_NTSC	480
-#define V_ACTIVE_LINES_SECAM	576
-
-/* Number of lines in a field for HPS to process */
-#define V_FIELD_PAL	288
-#define V_FIELD_NTSC	240
-#define V_FIELD_SECAM	288
-
-/* Number of lines of vertical offset before processing */
-#define V_OFFSET_NTSC	0x10 /* PLI */
-#define V_OFFSET_PAL	0x15
-#define V_OFFSET_SECAM	0x14
-
-/* Number of horizontal pixels to process */
-#define H_PIXELS_NTSC	708
-#define H_PIXELS_PAL	720
-#define H_PIXELS_SECAM	720
-
-/* Horizontal offset of processing window */
-#define H_OFFSET_NTSC	0x40 /* PLI Try 0x3f and find all red colors turning into blue !!?? */
-#define H_OFFSET_PAL	0x3a
-#define H_OFFSET_SECAM	0x14
-
-/* some memory-sizes */
-#define GRABBING_MEM_SIZE	0x240000	/* 1024 * 576 * 4*/
-#define CLIPPING_MEM_SIZE	20000 	        /* 1024 * 625 / 32 */
-#define I2C_MEM_SIZE		0x000800	/* 2048 */
-#define	RPS_MEM_SIZE		0x000800	/* 2048 */
-
-/************************************************************************/
-/* UNSORTED								*/
-/************************************************************************/
-
-#define ME1    0x0000000800
-#define PV1    0x0000000008
-
-/************************************************************************/
-/* CLIPPING								*/
-/************************************************************************/
-
-/* some defines for the various clipping-modes */
-#define SAA7146_CLIPPING_RECT		0x4
-#define SAA7146_CLIPPING_RECT_INVERTED	0x5
-#define SAA7146_CLIPPING_MASK		0x6
-#define SAA7146_CLIPPING_MASK_INVERTED	0x7
-
-/************************************************************************/
-/* RPS									*/
-/************************************************************************/
-
-#define CMD_NOP		0x00000000  /* No operation */
-#define CMD_CLR_EVENT	0x00000000  /* Clear event */
-#define CMD_SET_EVENT	0x10000000  /* Set signal event */
-#define CMD_PAUSE	0x20000000  /* Pause */
-#define CMD_CHECK_LATE	0x30000000  /* Check late */
-#define CMD_UPLOAD	0x40000000  /* Upload */
-#define CMD_STOP	0x50000000  /* Stop */
-#define CMD_INTERRUPT	0x60000000  /* Interrupt */
-#define CMD_JUMP	0x80000000  /* Jump */
-#define CMD_WR_REG	0x90000000  /* Write (load) register */
-#define CMD_RD_REG	0xa0000000  /* Read (store) register */
-#define CMD_WR_REG_MASK	0xc0000000  /* Write register with mask */
-
-/************************************************************************/
-/* OUTPUT FORMATS 							*/
-/************************************************************************/
-
-/* output formats; each entry holds three types of information */
-/* composed is used in the sense of "not-planar" */
-
-#define RGB15_COMPOSED	0x213
-/* this means: yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 3 */
-#define RGB16_COMPOSED	0x210
-#define RGB24_COMPOSED	0x201
-#define RGB32_COMPOSED	0x202
-
-#define YUV411_COMPOSED		0x003
-/* this means: yuv2rgb-conversation-mode=0, dither=no(=0), format-mode = 3 */
-#define YUV422_COMPOSED		0x000
-#define YUV411_DECOMPOSED	0x00b
-#define YUV422_DECOMPOSED	0x009
-#define YUV420_DECOMPOSED	0x00a
-
-/************************************************************************/
-/* MISC 								*/
-/************************************************************************/
-
-/* Bit mask constants */
-#define MASK_00   0x00000001    /* Mask value for bit 0 */
-#define MASK_01   0x00000002    /* Mask value for bit 1 */
-#define MASK_02   0x00000004    /* Mask value for bit 2 */
-#define MASK_03   0x00000008    /* Mask value for bit 3 */
-#define MASK_04   0x00000010    /* Mask value for bit 4 */
-#define MASK_05   0x00000020    /* Mask value for bit 5 */
-#define MASK_06   0x00000040    /* Mask value for bit 6 */
-#define MASK_07   0x00000080    /* Mask value for bit 7 */
-#define MASK_08   0x00000100    /* Mask value for bit 8 */
-#define MASK_09   0x00000200    /* Mask value for bit 9 */
-#define MASK_10   0x00000400    /* Mask value for bit 10 */
-#define MASK_11   0x00000800    /* Mask value for bit 11 */
-#define MASK_12   0x00001000    /* Mask value for bit 12 */
-#define MASK_13   0x00002000    /* Mask value for bit 13 */
-#define MASK_14   0x00004000    /* Mask value for bit 14 */
-#define MASK_15   0x00008000    /* Mask value for bit 15 */
-#define MASK_16   0x00010000    /* Mask value for bit 16 */
-#define MASK_17   0x00020000    /* Mask value for bit 17 */
-#define MASK_18   0x00040000    /* Mask value for bit 18 */
-#define MASK_19   0x00080000    /* Mask value for bit 19 */
-#define MASK_20   0x00100000    /* Mask value for bit 20 */
-#define MASK_21   0x00200000    /* Mask value for bit 21 */
-#define MASK_22   0x00400000    /* Mask value for bit 22 */
-#define MASK_23   0x00800000    /* Mask value for bit 23 */
-#define MASK_24   0x01000000    /* Mask value for bit 24 */
-#define MASK_25   0x02000000    /* Mask value for bit 25 */
-#define MASK_26   0x04000000    /* Mask value for bit 26 */
-#define MASK_27   0x08000000    /* Mask value for bit 27 */
-#define MASK_28   0x10000000    /* Mask value for bit 28 */
-#define MASK_29   0x20000000    /* Mask value for bit 29 */
-#define MASK_30   0x40000000    /* Mask value for bit 30 */
-#define MASK_31   0x80000000    /* Mask value for bit 31 */
-
-#define MASK_B0   0x000000ff    /* Mask value for byte 0 */
-#define MASK_B1   0x0000ff00    /* Mask value for byte 1 */
-#define MASK_B2   0x00ff0000    /* Mask value for byte 2 */
-#define MASK_B3   0xff000000    /* Mask value for byte 3 */
-
-#define MASK_W0   0x0000ffff    /* Mask value for word 0 */
-#define MASK_W1   0xffff0000    /* Mask value for word 1 */
-
-#define MASK_PA   0xfffffffc    /* Mask value for physical address */
-#define MASK_PR   0xfffffffe 	/* Mask value for protection register */
-#define MASK_ER   0xffffffff    /* Mask value for the entire register */
-
-#define MASK_NONE 0x00000000    /* No mask */
-
-/************************************************************************/
-/* REGISTERS 								*/
-/************************************************************************/
-
-#define BASE_ODD1         0x00  /* Video DMA 1 registers  */
-#define BASE_EVEN1        0x04
-#define PROT_ADDR1        0x08
-#define PITCH1            0x0C
-#define BASE_PAGE1        0x10  /* Video DMA 1 base page */
-#define NUM_LINE_BYTE1    0x14
-
-#define BASE_ODD2         0x18  /* Video DMA 2 registers */
-#define BASE_EVEN2        0x1C
-#define PROT_ADDR2        0x20
-#define PITCH2            0x24
-#define BASE_PAGE2        0x28  /* Video DMA 2 base page */
-#define NUM_LINE_BYTE2    0x2C
-
-#define BASE_ODD3         0x30  /* Video DMA 3 registers */
-#define BASE_EVEN3        0x34
-#define PROT_ADDR3        0x38
-#define PITCH3            0x3C         
-#define BASE_PAGE3        0x40  /* Video DMA 3 base page */
-#define NUM_LINE_BYTE3    0x44
-
-#define PCI_BT_V1         0x48  /* Video/FIFO 1 */
-#define PCI_BT_V2         0x49  /* Video/FIFO 2 */
-#define PCI_BT_V3         0x4A  /* Video/FIFO 3 */
-#define PCI_BT_DEBI       0x4B  /* DEBI */
-#define PCI_BT_A          0x4C  /* Audio */
-
-#define DD1_INIT          0x50  /* Init setting of DD1 interface */
-
-#define DD1_STREAM_B      0x54  /* DD1 B video data stream handling */
-#define DD1_STREAM_A      0x56  /* DD1 A video data stream handling */
-
-#define BRS_CTRL          0x58  /* BRS control register */
-#define HPS_CTRL          0x5C  /* HPS control register */
-#define HPS_V_SCALE       0x60  /* HPS vertical scale */
-#define HPS_V_GAIN        0x64  /* HPS vertical ACL and gain */
-#define HPS_H_PRESCALE    0x68  /* HPS horizontal prescale   */
-#define HPS_H_SCALE       0x6C  /* HPS horizontal scale */
-#define BCS_CTRL          0x70  /* BCS control */
-#define CHROMA_KEY_RANGE  0x74
-#define CLIP_FORMAT_CTRL  0x78  /* HPS outputs formats & clipping */
-
-#define DEBI_CONFIG       0x7C
-#define DEBI_COMMAND      0x80
-#define DEBI_PAGE         0x84
-#define DEBI_AD           0x88	
-
-#define I2C_TRANSFER      0x8C	
-#define I2C_STATUS        0x90	
-
-#define BASE_A1_IN        0x94	/* Audio 1 input DMA */
-#define PROT_A1_IN        0x98
-#define PAGE_A1_IN        0x9C
-  
-#define BASE_A1_OUT       0xA0  /* Audio 1 output DMA */
-#define PROT_A1_OUT       0xA4
-#define PAGE_A1_OUT       0xA8
-
-#define BASE_A2_IN        0xAC  /* Audio 2 input DMA */
-#define PROT_A2_IN        0xB0
-#define PAGE_A2_IN        0xB4
-
-#define BASE_A2_OUT       0xB8  /* Audio 2 output DMA */
-#define PROT_A2_OUT       0xBC
-#define PAGE_A2_OUT       0xC0
-
-#define RPS_PAGE0         0xC4  /* RPS task 0 page register */
-#define RPS_PAGE1         0xC8  /* RPS task 1 page register */
-
-#define RPS_THRESH0       0xCC  /* HBI threshold for task 0 */
-#define RPS_THRESH1       0xD0  /* HBI threshold for task 1 */
-
-#define RPS_TOV0          0xD4  /* RPS timeout for task 0 */
-#define RPS_TOV1          0xD8  /* RPS timeout for task 1 */
-
-#define IER               0xDC  /* Interrupt enable register */
-
-#define GPIO_CTRL         0xE0  /* GPIO 0-3 register */
-
-#define EC1SSR            0xE4  /* Event cnt set 1 source select */
-#define EC2SSR            0xE8  /* Event cnt set 2 source select */
-#define ECT1R             0xEC  /* Event cnt set 1 thresholds */
-#define ECT2R             0xF0  /* Event cnt set 2 thresholds */
-
-#define ACON1             0xF4
-#define ACON2             0xF8
-
-#define MC1               0xFC   /* Main control register 1 */
-#define MC2               0x100  /* Main control register 2  */
-
-#define RPS_ADDR0         0x104  /* RPS task 0 address register */
-#define RPS_ADDR1         0x108  /* RPS task 1 address register */
-
-#define ISR               0x10C  /* Interrupt status register */                                                             
-#define PSR               0x110  /* Primary status register */
-#define SSR               0x114  /* Secondary status register */
-
-#define EC1R              0x118  /* Event counter set 1 register */
-#define EC2R              0x11C  /* Event counter set 2 register */         
-
-#define PCI_VDP1          0x120  /* Video DMA pointer of FIFO 1 */
-#define PCI_VDP2          0x124  /* Video DMA pointer of FIFO 2 */
-#define PCI_VDP3          0x128  /* Video DMA pointer of FIFO 3 */
-#define PCI_ADP1          0x12C  /* Audio DMA pointer of audio out 1 */
-#define PCI_ADP2          0x130  /* Audio DMA pointer of audio in 1 */
-#define PCI_ADP3          0x134  /* Audio DMA pointer of audio out 2 */
-#define PCI_ADP4          0x138  /* Audio DMA pointer of audio in 2 */
-#define PCI_DMA_DDP       0x13C  /* DEBI DMA pointer */
-
-#define LEVEL_REP         0x140,
-#define A_TIME_SLOT1      0x180,  /* from 180 - 1BC */
-#define A_TIME_SLOT2      0x1C0,  /* from 1C0 - 1FC */
-
-/************************************************************************/
-/* ISR-MASKS 								*/
-/************************************************************************/
-
-#define SPCI_PPEF       0x80000000  /* PCI parity error */
-#define SPCI_PABO       0x40000000  /* PCI access error (target or master abort) */
-#define SPCI_PPED       0x20000000  /* PCI parity error on 'real time data' */
-#define SPCI_RPS_I1     0x10000000  /* Interrupt issued by RPS1 */
-#define SPCI_RPS_I0     0x08000000  /* Interrupt issued by RPS0 */
-#define SPCI_RPS_LATE1  0x04000000  /* RPS task 1 is late */
-#define SPCI_RPS_LATE0  0x02000000  /* RPS task 0 is late */
-#define SPCI_RPS_E1     0x01000000  /* RPS error from task 1 */
-#define SPCI_RPS_E0     0x00800000  /* RPS error from task 0 */
-#define SPCI_RPS_TO1    0x00400000  /* RPS timeout task 1 */
-#define SPCI_RPS_TO0    0x00200000  /* RPS timeout task 0 */
-#define SPCI_UPLD       0x00100000  /* RPS in upload */
-#define SPCI_DEBI_S     0x00080000  /* DEBI status */
-#define SPCI_DEBI_E     0x00040000  /* DEBI error */
-#define SPCI_IIC_S      0x00020000  /* I2C status */
-#define SPCI_IIC_E      0x00010000  /* I2C error */
-#define SPCI_A2_IN      0x00008000  /* Audio 2 input DMA protection / limit */
-#define SPCI_A2_OUT     0x00004000  /* Audio 2 output DMA protection / limit */
-#define SPCI_A1_IN      0x00002000  /* Audio 1 input DMA protection / limit */
-#define SPCI_A1_OUT     0x00001000  /* Audio 1 output DMA protection / limit */
-#define SPCI_AFOU       0x00000800  /* Audio FIFO over- / underflow */
-#define SPCI_V_PE       0x00000400  /* Video protection address */
-#define SPCI_VFOU       0x00000200  /* Video FIFO over- / underflow */
-#define SPCI_FIDA       0x00000100  /* Field ID video port A */
-#define SPCI_FIDB       0x00000080  /* Field ID video port B */
-#define SPCI_PIN3       0x00000040  /* GPIO pin 3 */
-#define SPCI_PIN2       0x00000020  /* GPIO pin 2 */
-#define SPCI_PIN1       0x00000010  /* GPIO pin 1 */
-#define SPCI_PIN0       0x00000008  /* GPIO pin 0 */
-#define SPCI_ECS        0x00000004  /* Event counter 1, 2, 4, 5 */
-#define SPCI_EC3S       0x00000002  /* Event counter 3 */
-#define SPCI_EC0S       0x00000001  /* Event counter 0 */
-
-/************************************************************************/
-/* I2C									*/
-/************************************************************************/
-
-/* time we wait after certain i2c-operations */
-#define SAA7146_I2C_DELAY 		10
-
-#define	SAA7146_I2C_ABORT	(1<<7)
-#define	SAA7146_I2C_SPERR	(1<<6)
-#define	SAA7146_I2C_APERR	(1<<5)
-#define	SAA7146_I2C_DTERR	(1<<4)
-#define	SAA7146_I2C_DRERR	(1<<3)
-#define	SAA7146_I2C_AL		(1<<2)
-#define	SAA7146_I2C_ERR		(1<<1)
-#define	SAA7146_I2C_BUSY	(1<<0)
-
-#define	SAA7146_I2C_START	(0x3)
-#define	SAA7146_I2C_CONT	(0x2)
-#define	SAA7146_I2C_STOP	(0x1)
-#define	SAA7146_I2C_NOP		(0x0)
-
-#define SAA7146_I2C_BUS_BIT_RATE_6400	(0x500)
-#define SAA7146_I2C_BUS_BIT_RATE_3200	(0x100)
-#define SAA7146_I2C_BUS_BIT_RATE_480	(0x400)
-#define SAA7146_I2C_BUS_BIT_RATE_320	(0x600)
-#define SAA7146_I2C_BUS_BIT_RATE_240	(0x700)
-#define SAA7146_I2C_BUS_BIT_RATE_120	(0x000)
-#define SAA7146_I2C_BUS_BIT_RATE_80	(0x200)
-#define SAA7146_I2C_BUS_BIT_RATE_60	(0x300)
-
-
-#endif
diff -Nru a/drivers/media/dvb/av7110/saa7146_v4l.c b/drivers/media/dvb/av7110/saa7146_v4l.c
--- a/drivers/media/dvb/av7110/saa7146_v4l.c	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,501 +0,0 @@
-/*
-    video4linux-parts of the saa7146 device driver
-    
-    Copyright (C) 1998,1999 Michael Hunold <michael@mihu.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/module.h>	/* for module-version */
-#include <linux/string.h>
-#include <linux/slab.h>		/* for kmalloc/kfree */
-#include <linux/delay.h>	/* for delay-stuff */
-#include <asm/uaccess.h>	/* for copy_to/from_user */
-#include <linux/wrapper.h>	/* for mem_map_reserve */
-#include <linux/vmalloc.h>
-#include <linux/videodev.h>
-
-#include "saa7146_defs.h"
-#include "saa7146_core.h"
-#include "saa7146_v4l.h"
-
-
-static int saa7146_v4l_debug = 0;
-
-#define dprintk	if (saa7146_v4l_debug) printk
-#define hprintk	if (saa7146_v4l_debug >= 2) printk
-#define gprintk	if (saa7146_v4l_debug >= 3) printk
-
-#define __COMPILE_SAA7146__
-#include "saa7146.c"
-
-/* transform video4linux-cliplist to plain arrays -- we assume that the arrays
-   are big enough -- if not: your fault! */	
-int	saa7146_v4lclip2plain(struct video_clip *clips, u16 clipcount, int x[], int y[], int width[], int height[])
-{
-	int	i = 0;
-	struct	video_clip* vc = NULL;
-
-	dprintk("saa7146_v4l.o: ==> saa7146_v4lclip2plain, cc:%d\n",clipcount);
-
-	/* anything to do here? */	
-	if( 0 == clipcount )
-		return 0;
-
-	/* copy to kernel-space */
-	vc = vmalloc(sizeof(struct video_clip)*(clipcount));
-	if( NULL == vc	) {
-		printk("saa7146_v4l.o: ==> v4lclip2saa7146_v4l.o: no memory #2!\n");
-		return -ENOMEM;
-	}
-	if(copy_from_user(vc,clips,sizeof(struct video_clip)*clipcount)) {
-		printk("saa7146_v4l.o: ==> v4lclip2saa7146_v4l.o: could not copy from user-space!\n");
-		return -EFAULT;
-	}
-
-	/* copy the clip-list to the arrays
-	   note: the video_clip-struct may contain negative values to indicate that a window
-		 doesn't lay completly over the video window. Thus, we correct the values right here */
-	for(i = 0; i < clipcount; i++) {
-
-		if( vc[i].width < 0) {
-			vc[i].x += vc[i].width; vc[i].width = -vc[i].width;
-		}
-		if( vc[i].height < 0) {
-			vc[i].y += vc[i].height; vc[i].height = -vc[i].height;
-		}			
-
-		if( vc[i].x < 0) {
-			vc[i].width += vc[i].x; vc[i].x = 0;
-		}
-		if( vc[i].y < 0) {
-			vc[i].height += vc[i].y; vc[i].y = 0;
-		}		
-
-		if(vc[i].width <= 0 || vc[i].height <= 0) {
-			vfree(vc);
-			return -EINVAL;
-		}
-		
-		x[i]		= vc[i].x;
-		y[i]		= vc[i].y;
-		width[i]	= vc[i].width;
-		height[i]	= vc[i].height;
-	}		
-
-	/* free memory used for temporary clips */
-	vfree(vc);
-
-	return 0;	
-}
-	
-struct saa7146_v4l_struct {
-	struct video_buffer	buffer;
-	struct video_mbuf	mbuf;
-	struct video_window	window;
-	struct video_picture	picture;
-}; 
-
-static int saa7146_v4l_command(struct saa7146* saa, void *p, unsigned int cmd, void *arg)
-{
-	struct saa7146_v4l_struct* data = (struct saa7146_v4l_struct*)p;
-
-	hprintk("saa7146_v4l.o: ==> saa7146_v4l_command\n");
-
-	if( NULL == saa)
-		return -EINVAL;
-
-	switch(cmd) {
-		case SAA7146_V4L_GPICT:
-		{
-			struct video_picture *p = arg;
-
-			hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GPICT\n");
-
-			memcpy(p, &data->picture, sizeof(struct video_picture));
-
-		}
-		break;
-
-		case SAA7146_V4L_SPICT:
-		{
-			struct video_picture *p = arg;
-			
-			hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SPICT\n");
-
-			memcpy(&data->picture, p, sizeof(struct video_picture));
-			set_picture_prop(saa, (u32)(data->picture.brightness>>8),(u32)(data->picture.contrast>>9),(u32)(data->picture.colour>>9));
-
-		}
-		break;
-
-		case SAA7146_V4L_SWIN:
-		{
-			struct video_window *vw = arg;
-			int	*x = NULL, *y = NULL, *w = NULL, *h = NULL;
-
-			u32 palette = 0;
-			
-			hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SWIN\n");
-			
-			video_setmode(saa, 0);
-			saa7146_write(saa->mem, MC1, (MASK_21));
-
-			set_window(saa, vw->width, vw->height,0,0,0);
-			//saa->port, saa->sync);
-			if (move_to(saa, vw->x, vw->y, vw->height, data->buffer.width,
-				    data->buffer.depth, data->buffer.bytesperline,
-				    (u32)data->buffer.base, 0)<0)
-			  return -1;
-
-			switch( data->picture.palette ) {
-
-			case VIDEO_PALETTE_RGB555:
-				palette = RGB15_COMPOSED;
-				break;
-
-			case VIDEO_PALETTE_RGB24:
-				palette = RGB24_COMPOSED;
-				break;
-
-			case VIDEO_PALETTE_RGB32:
-				palette = RGB32_COMPOSED;
-				break;
-
-			case VIDEO_PALETTE_UYVY:
-				palette = YUV422_COMPOSED;
-				break;
-
-			case VIDEO_PALETTE_YUV422P:
-				palette = YUV422_DECOMPOSED;
-				break;
-
-			case VIDEO_PALETTE_YUV420P:
-				palette = YUV420_DECOMPOSED;
-				break;
-
-			case VIDEO_PALETTE_YUV411P:
-				palette = YUV411_DECOMPOSED;
-				break;
-
-			default:
-			/*case VIDEO_PALETTE_RGB565:*/
-				palette = RGB16_COMPOSED;
-				break;
-			}
-
-			set_output_format(saa, palette);
-
-			if (vw->flags==VIDEO_CLIP_BITMAP) {
-			  clip_windows(saa, SAA7146_CLIPPING_MASK, vw->width, vw->height,
-				       (u32 *) vw->clips, 1, 0, 0, 0, 0);
-			} else {
-			  
-			  
-			  /* this is tricky, but helps us saving kmalloc/kfree-calls 
-			     and boring if/else-constructs ... */
-			  x = (int*)kmalloc(sizeof(int)*vw->clipcount*4,GFP_KERNEL);
-			  if( NULL == x ) {
-			    hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SWIN: out of kernel-memory.\n");
-			    return -ENOMEM;
-			  }
-			  y = x+(1*vw->clipcount);
-			  w = x+(2*vw->clipcount);
-			  h = x+(3*vw->clipcount);
-			  
-			  /* transform clipping-windows */
-			  if (0 != saa7146_v4lclip2plain(vw->clips, vw->clipcount,x,y,w,h))
-			    break;
-			  clip_windows(saa, SAA7146_CLIPPING_RECT, vw->width, vw->height,
-				       NULL, vw->clipcount, x, y, w, h);
-			  kfree(x);
-			  
-			  memcpy(&data->window, arg, sizeof(struct video_window));
-			}
-			video_setmode(saa, 1);
-			break;
-		}
-
-		case SAA7146_V4L_CCAPTURE:
-		{
-			int* i = arg;
-
-			hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CCAPTURE\n");
-
-			if ( 0 == *i ) {
-				video_setmode(saa, 0);
-			}
-			else {
-				video_setmode(saa, 1);
-			}
-						
-			break;
-		}
-
-		case SAA7146_V4L_GFBUF:
-		{
-			struct video_buffer *b = arg;
-
-			hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GFBUF\n");
-
-			memcpy(b, &data->buffer, sizeof(struct video_buffer));
-
-			break;
-		}
-
-		case SAA7146_V4L_SFBUF:
-		{
-			struct video_buffer *b = arg;
-		
-			memcpy(&data->buffer, b, sizeof(struct video_buffer));
-			hprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_SFBUF: b:0x%08x, h:%d, w:%d, d:%d\n", (u32)data->buffer.base, data->buffer.height, data->buffer.width, data->buffer.depth);			
-
-			break;
-		}
-
-
-		case SAA7146_V4L_CSYNC:
-		{
-			int i = *((int*)arg);
-
-			int count = 0, k = 0;
-			unsigned char* grabbfr;
-			unsigned char y, uv;
-
-			/* sanity checks */
-                        if ( i >= saa->buffers || i < 0) {
-				gprintk("saa7146_v4l.o: SAA7146_V4L_CSYNC, invalid buffer %d\n",i);
-				return -EINVAL;
-			}
-
-			/* get the state */
-			switch ( saa->frame_stat[i] ) {
-				case GBUFFER_UNUSED:
-				{
-					/* there was no grab to this buffer */
-					gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CSYNC, invalid frame (fr:%d)\n",i);
-					return -EINVAL;
-				}
-				case GBUFFER_GRABBING:
-				{		
-					/* wait to be woken up by the irq-handler */
-					interruptible_sleep_on(&saa->rps0_wq);
-					break;
-				}
-				case GBUFFER_DONE:
-				{
-					gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CSYNC, frame done! (fr:%d)\n",i);
-					break;
-				}
-			}
-
-			/* all saa7146´s below chip-revision 3 are not capable of
-			   doing byte-swaps with video-dma1. for rgb-grabbing this
-			   does not matter, but yuv422-grabbing has the wrong
-			   byte-order, so we have to swap in software */
-			if ( ( saa->revision<3) && 
-			     (saa->grab_format[i] == YUV422_COMPOSED)) {
-				/* swap UYVY to YUYV */
-				count = saa->grab_height[i]*saa->grab_width[i]*2;
-				grabbfr = ((unsigned char*)(saa->grabbing))+i*GRABBING_MEM_SIZE;
-				for (k=0; k<count; k=k+2) {
-					y = grabbfr[k+1];
-					uv = grabbfr[k];
-					grabbfr[k] = y;
-					grabbfr[k+1] = uv;
-				}
-			}
-						
-			/* set corresponding buffer to ´unused´ */
-			saa->frame_stat[i] = GBUFFER_UNUSED;
-
-			break;
-		}
-		case SAA7146_V4L_CMCAPTURE:
-		{
-                        struct video_mmap *vm = arg;
-
-			gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_CMCAPTURE, trying buffer:%d\n", vm->frame);
-
-			/* check status for wanted frame */
-			if ( GBUFFER_GRABBING == saa->frame_stat[vm->frame] ) {
-				gprintk("saa7146_v4l.o: frame #%d still grabbing!\n",vm->frame);
-				return -EBUSY;
-			}
-
-			/* do necessary transformations from the videodev-structure to our own format. */		
-
-			/* sanity checks */
-			if ( vm->width <= 0 || vm->height <= 0 ) {
-				gprintk("saa7146_v4l.o: set_up_grabbing, invalid dimension for wanted buffer %d\n",vm->frame);
-				return -EINVAL;
-			}
-
-			/* set corresponding buffer to ´grabbing´ */
-			saa->frame_stat[vm->frame] = GBUFFER_GRABBING;
-
-			/* copy grabbing informtaion for the buffer */
-			saa->grab_height[vm->frame] = vm->height;
-			saa->grab_width[vm->frame]  = vm->width;
-			/* fixme: setting of grabbing port ?!*/
-			saa->grab_port[vm->frame]   = 0;
-
-			switch( vm->format ) {
-
-				case VIDEO_PALETTE_RGB555:
-					saa->grab_format[vm->frame] = RGB15_COMPOSED;
-					break;
-
-				case VIDEO_PALETTE_RGB24:
-					saa->grab_format[vm->frame] = RGB24_COMPOSED;
-					break;
-
-				case VIDEO_PALETTE_RGB32:
-					saa->grab_format[vm->frame] = RGB32_COMPOSED;
-					break;
-
-				case VIDEO_PALETTE_YUV420P:
-					return -EINVAL;
-
-				case VIDEO_PALETTE_YUV422:
-					saa->grab_format[vm->frame] = YUV422_COMPOSED;
-					break;
-
-				case VIDEO_PALETTE_YUV422P:
-					saa->grab_format[vm->frame] = YUV422_DECOMPOSED;
-					break;
-
-				case VIDEO_PALETTE_YUV411P:
-					saa->grab_format[vm->frame] = YUV411_DECOMPOSED;
-					break;
-
-				default:
-					/*case VIDEO_PALETTE_RGB565:*/
-					saa->grab_format[vm->frame] = RGB16_COMPOSED;
-					break;
-				}
-
-			set_up_grabbing(saa,vm->frame);
-			break;
-		}
-		case SAA7146_V4L_GMBUF:
-		{
-                        struct video_mbuf *m = arg;
-			int i = 0;
-
-			m->size = saa->buffers * GRABBING_MEM_SIZE;
-			m->frames = saa->buffers;
-
-			for(i = 0; i < saa->buffers; i++)
-				m->offsets[i]=(i*GRABBING_MEM_SIZE);
-
-			gprintk(KERN_ERR "saa7146_v4l.o: SAA7146_V4L_GMBUF, providing %d buffers.\n", saa->buffers);
-			
-			break;
-		}
-
-		default:
-			return -ENOIOCTLCMD;
-	}
-	
-	return 0;
-}
-
-int saa7146_v4l_attach(struct saa7146* adap, void** p)
-{
-	struct saa7146_v4l_struct* data;
-
-	hprintk("saa7146_v4l.o: ==> saa7146_v4l_inc_use_attach\n");
-					
-	if (!(data = kmalloc(sizeof(struct saa7146_v4l_struct), GFP_KERNEL))) {
-	    	printk (KERN_ERR "%s: out of memory!\n", __FUNCTION__);
-		return -ENOMEM;
-	}
-	*(struct saa7146_v4l_struct**)p = data;
-
-	memset(&data->buffer, 0x0, sizeof(struct video_buffer));
-	memset(&data->mbuf,   0x0, sizeof(struct video_mbuf));
-	memset(&data->window, 0x0, sizeof(struct video_window));
-	memset(&data->picture,0x0, sizeof(struct video_picture));
-
-	data->picture.brightness = 32768;
-	data->picture.contrast = 32768;
-	data->picture.colour = 32768;	/* saturation */
-	data->picture.depth = 16;
-	data->picture.palette = VIDEO_PALETTE_RGB565;
-
-	return 0;
-}
-
-
-void saa7146_v4l_inc_use(struct saa7146* adap)
-{
-	MOD_INC_USE_COUNT;
-}
-
-
-int saa7146_v4l_detach(struct saa7146* adap, void** p)
-{
-	struct saa7146_v4l_struct** data = (struct saa7146_v4l_struct**)p;
-
-	kfree(*data);
-	*data = NULL;
-
-	return 0;
-}
-
-
-void saa7146_v4l_dec_use(struct saa7146* adap)
-{
-	MOD_DEC_USE_COUNT;
-}
-
-
-static struct saa7146_extension saa7146_v4l_extension = {
-	"v4l extension\0",
-	MASK_27,                            /* handles rps0 irqs */
-	saa7146_std_grab_irq_callback_rps0,
-	saa7146_v4l_command,
-	saa7146_v4l_attach,
-	saa7146_v4l_detach,
-	saa7146_v4l_inc_use,
-	saa7146_v4l_dec_use
-};	
-
-
-int saa7146_v4l_init (void) 
-{
-	int res = 0;
-
-	if((res = saa7146_add_extension(&saa7146_v4l_extension))) {
-		printk("saa7146_v4l.o: extension registration failed, module not inserted.\n");
-		return res;
-	}
-	
-	return 0;
-}
-
-
-void saa7146_v4l_exit (void) 
-{
-	int res = 0;
-	if ((res = saa7146_del_extension(&saa7146_v4l_extension))) {
-		printk("saa7146_v4l.o: extension deregistration failed, module not removed.\n");
-	}
-}
-
-MODULE_PARM(saa7146_v4l_debug, "i");
-MODULE_PARM_DESC(saa7146_v4l_debug, "set saa7146_v4l.c in debug mode");
-
diff -Nru a/drivers/media/dvb/av7110/saa7146_v4l.h b/drivers/media/dvb/av7110/saa7146_v4l.h
--- a/drivers/media/dvb/av7110/saa7146_v4l.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,32 +0,0 @@
-#ifndef __INCLUDED_SAA7146_V4L_V4L__
-#define __INCLUDED_SAA7146_V4L_V4L__
-
-/************************************************************************/
-/* ADDRESSING 								*/
-/************************************************************************/
-
-#define SAA7146_V4L_BASE	100
-
-#define	SAA7146_V4L_GPICT	    	_IOW('d', (SAA7146_V4L_BASE+ 1), struct video_picture)
-#define	SAA7146_V4L_SPICT	    	_IOW('d', (SAA7146_V4L_BASE+ 2), struct video_picture)
-
-#define	SAA7146_V4L_GFBUF	    	_IOW('d', (SAA7146_V4L_BASE+ 3), struct video_buffer)
-#define	SAA7146_V4L_SFBUF	    	_IOW('d', (SAA7146_V4L_BASE+ 4), struct video_buffer)
-
-#define	SAA7146_V4L_GMBUF	    	_IOW('d', (SAA7146_V4L_BASE+ 5), struct video_mbuf)
-
-#define	SAA7146_V4L_SWIN	    	_IOW('d', (SAA7146_V4L_BASE+ 6), struct video_window)
-
-#define	SAA7146_V4L_CCAPTURE    	_IOW('d', (SAA7146_V4L_BASE+ 7), int)
-
-#define	SAA7146_V4L_CMCAPTURE		_IOW('d', (SAA7146_V4L_BASE+ 8), struct video_mmap)
-#define	SAA7146_V4L_CSYNC    		_IOW('d', (SAA7146_V4L_BASE+ 9), int)
-#define	SAA7146_V4L_CGSTATUS   		_IOW('d', (SAA7146_V4L_BASE+10), int)
-
-#define	SAA7146_V4L_TSCAPTURE  		_IOW('d', (SAA7146_V4L_BASE+11), int)
-
-extern int saa7146_v4l_init (void);
-extern void saa7146_v4l_exit (void);
-
-#endif
-
diff -Nru a/drivers/media/dvb/dvb-core/Makefile b/drivers/media/dvb/dvb-core/Makefile
--- a/drivers/media/dvb/dvb-core/Makefile	Sat Apr 19 19:51:51 2003
+++ b/drivers/media/dvb/dvb-core/Makefile	Sat Apr 19 19:51:51 2003
@@ -3,6 +3,6 @@
 #
 
 dvb-core-objs = dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o \
-		dvb_frontend.o dvb_i2c.o dvb_net.o dvb_ksyms.o
+		dvb_frontend.o dvb_i2c.o dvb_net.o dvb_ksyms.o dvb_ringbuffer.o
 
 obj-$(CONFIG_DVB_CORE) += dvb-core.o
diff -Nru a/drivers/media/dvb/dvb-core/Makefile.lib b/drivers/media/dvb/dvb-core/Makefile.lib
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/dvb-core/Makefile.lib	Sat Apr 19 19:51:51 2003
@@ -0,0 +1 @@
+obj-$(CONFIG_DVB_CORE)		+= crc32.o
diff -Nru a/drivers/media/dvb/dvb-core/compat.h b/drivers/media/dvb/dvb-core/compat.h
--- a/drivers/media/dvb/dvb-core/compat.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,24 +0,0 @@
-#ifndef __CRAP_H
-#define __CRAP_H
-
-/**
- *  compatibility crap for old kernels. No guarantee for a working driver
- *  even when everything compiles.
- */
-
-
-#include <linux/module.h>
-#include <linux/list.h>
-
-#ifndef MODULE_LICENSE
-#define MODULE_LICENSE(x)
-#endif
-
-#ifndef list_for_each_safe
-#define list_for_each_safe(pos, n, head) \
-        for (pos = (head)->next, n = pos->next; pos != (head); \
-                pos = n, n = pos->next)
-#endif
-
-#endif
-
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	Sat Apr 19 19:51:46 2003
+++ b/drivers/media/dvb/dvb-core/demux.h	Sat Apr 19 19:51:46 2003
@@ -144,6 +144,14 @@
         int is_filtering; /* Set to non-zero when filtering in progress */ 
         struct dmx_demux_s* parent; /* Back-pointer */
         void* priv; /* Pointer to private data of the API client */ 
+
+        int check_crc;
+	u32 crc_val;
+
+        u8 secbuf[4096];
+        int secbufp;
+        int seclen;
+
         int (*set) (struct dmx_section_feed_s* feed, 
 		    __u16 pid, 
 		    size_t circular_buffer_size, 
@@ -162,16 +170,16 @@
 /* Callback functions */ 
 /*--------------------------------------------------------------------------*/ 
 
-typedef int (*dmx_ts_cb) ( __u8 * buffer1, 
+typedef int (*dmx_ts_cb) ( const u8 * buffer1, 
 			   size_t buffer1_length,
-			   __u8 * buffer2, 
+			   const u8 * buffer2, 
 			   size_t buffer2_length,
 			   dmx_ts_feed_t* source, 
 			   dmx_success_t success); 
 
-typedef int (*dmx_section_cb) (	__u8 * buffer1,
+typedef int (*dmx_section_cb) (	const u8 * buffer1,
 				size_t buffer1_len,
-				__u8 * buffer2, 
+				const u8 * buffer2, 
 				size_t buffer2_len,
 			       	dmx_section_filter_t * source,
 			       	dmx_success_t success);
@@ -278,6 +286,9 @@
         int (*disconnect_frontend) (struct dmx_demux_s* demux); 
 
         int (*get_pes_pids) (struct dmx_demux_s* demux, __u16 *pids);
+
+        int (*get_stc) (struct dmx_demux_s* demux, unsigned int num,
+			uint64_t *stc, unsigned int *base);
 }; 
 typedef struct dmx_demux_s dmx_demux_t; 
 
diff -Nru a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c
--- a/drivers/media/dvb/dvb-core/dmxdev.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/media/dvb/dvb-core/dmxdev.c	Sat Apr 19 19:51:49 2003
@@ -2,8 +2,8 @@
  * dmxdev.c - DVB demultiplexer device 
  *
  * Copyright (C) 2000 Ralph  Metzler <ralph@convergence.de>
- *                  & Marcus Metzler <marcus@convergence.de>
-                      for convergence integrated media GmbH
+ *		  & Marcus Metzler <marcus@convergence.de>
+		      for convergence integrated media GmbH
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -24,11 +24,13 @@
 #include <linux/vmalloc.h>
 #include <linux/module.h>
 #include <linux/poll.h>
-#include <linux/videodev.h>
 #include <asm/uaccess.h>
 
 #include "dmxdev.h"
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#include "compat.h"
+#endif
 
 //MODULE_DESCRIPTION("");
 //MODULE_AUTHOR("Ralph Metzler, Marcus Metzler");
@@ -43,133 +45,133 @@
 inline dmxdev_filter_t *
 dvb_dmxdev_file_to_filter(struct file *file)
 {
-        return (dmxdev_filter_t *) file->private_data;
+	return (dmxdev_filter_t *) file->private_data;
 }
 
 inline dmxdev_dvr_t *
 dvb_dmxdev_file_to_dvr(dmxdev_t *dmxdev, struct file *file)
 {
-        return (dmxdev_dvr_t *) file->private_data;
+	return (dmxdev_dvr_t *) file->private_data;
 }
 
 static inline void 
 dvb_dmxdev_buffer_init(dmxdev_buffer_t *buffer) 
 {
-        buffer->data=0;
-        buffer->size=8192;
-        buffer->pread=0;
-        buffer->pwrite=0;
-        buffer->error=0;
-        init_waitqueue_head(&buffer->queue);
+	buffer->data=0;
+	buffer->size=8192;
+	buffer->pread=0;
+	buffer->pwrite=0;
+	buffer->error=0;
+	init_waitqueue_head(&buffer->queue);
 }
 
-static inline int 
-dvb_dmxdev_buffer_write(dmxdev_buffer_t *buf, uint8_t *src, int len) 
-{
-        int split;
-        int free;
-        int todo;
+static inline
+int dvb_dmxdev_buffer_write(dmxdev_buffer_t *buf, const u8 *src, int len) 
+{
+	int split;
+	int free;
+	int todo;
 
 	if (!len)
-	        return 0;
+		return 0;
 	if (!buf->data)
-	        return 0;
+		return 0;
 	
-        free=buf->pread-buf->pwrite;
-        split=0;
-        if (free<=0) {
-                free+=buf->size;
-                split=buf->size-buf->pwrite;
-        }
-        if (len>=free) {
+	free=buf->pread-buf->pwrite;
+	split=0;
+	if (free<=0) {
+		free+=buf->size;
+		split=buf->size-buf->pwrite;
+	}
+	if (len>=free) {
 		dprintk("dmxdev: buffer overflow\n");
-                return -1;
+		return -1;
 	}
-        if (split>=len)
-                split=0;
-        todo=len;
-        if (split) {
-                memcpy(buf->data + buf->pwrite, src, split);
-                todo-=split;
-                buf->pwrite=0;
-        }
-        memcpy(buf->data + buf->pwrite, src+split, todo);
-        buf->pwrite=(buf->pwrite+todo)%buf->size;
-        return len;
+	if (split>=len)
+		split=0;
+	todo=len;
+	if (split) {
+		memcpy(buf->data + buf->pwrite, src, split);
+		todo-=split;
+		buf->pwrite=0;
+	}
+	memcpy(buf->data + buf->pwrite, src+split, todo);
+	buf->pwrite=(buf->pwrite+todo)%buf->size;
+	return len;
 }
 
 static ssize_t 
 dvb_dmxdev_buffer_read(dmxdev_buffer_t *src, int non_blocking, 
-		 char *buf, size_t count, loff_t *ppos)
+		       char *buf, size_t count, loff_t *ppos)
 {
-        unsigned long todo=count;
-        int split, avail, error;
+	unsigned long todo=count;
+	int split, avail, error;
 	
 	if (!src->data)
-	        return 0;
+		return 0;
 
 	if ((error=src->error)) {
 		src->pwrite=src->pread;
-	        src->error=0;
+		src->error=0;
 		return error; 
 	}
 
 	if (non_blocking && (src->pwrite==src->pread))
-	        return -EWOULDBLOCK;
+		return -EWOULDBLOCK;
 
-        while (todo>0) {
-	        if (non_blocking && (src->pwrite==src->pread))
-		        return (count-todo) ? (count-todo) : -EWOULDBLOCK;
+	while (todo>0) {
+		if (non_blocking && (src->pwrite==src->pread))
+			return (count-todo) ? (count-todo) : -EWOULDBLOCK;
 
-	        if (wait_event_interruptible(src->queue,
+		if (wait_event_interruptible(src->queue,
 					     (src->pread!=src->pwrite) ||
 					     (src->error))<0)
-		        return count-todo;
+			return count-todo;
 
 		if ((error=src->error)) {
 			src->pwrite=src->pread;
-		        src->error=0;
+			src->error=0;
 			return error; 
 		}
 		
-                split=src->size;
-                avail=src->pwrite - src->pread;
-                if (avail<0) {
-                        avail+=src->size;
-                        split=src->size - src->pread;
-                }
-                if (avail>todo)
-                        avail=todo;
-                if (split<avail) {
-                        if (copy_to_user(buf, src->data+src->pread, split))
-                                  return -EFAULT;
-                        buf+=split;
-                        src->pread=0;
-                        todo-=split;
-                        avail-=split;
-                }
-                if (avail) {
-                        if (copy_to_user(buf, src->data+src->pread, avail))
-                                return -EFAULT;
-                        src->pread = (src->pread + avail) % src->size;
-                        todo-=avail;
-                        buf+=avail;
-                }
-        }
-        return count;
+		split=src->size;
+		avail=src->pwrite - src->pread;
+		if (avail<0) {
+			avail+=src->size;
+			split=src->size - src->pread;
+		}
+		if (avail>todo)
+			avail=todo;
+		if (split<avail) {
+			if (copy_to_user(buf, src->data+src->pread, split))
+				  return -EFAULT;
+			buf+=split;
+			src->pread=0;
+			todo-=split;
+			avail-=split;
+		}
+		if (avail) {
+			if (copy_to_user(buf, src->data+src->pread, avail))
+				return -EFAULT;
+			src->pread = (src->pread + avail) % src->size;
+			todo-=avail;
+			buf+=avail;
+		}
+	}
+	return count;
 }
 
 static dmx_frontend_t *
 get_fe(dmx_demux_t *demux, int type)
 {
-        struct list_head *head, *pos;
+	struct list_head *head, *pos;
 
-        head=demux->get_frontends(demux);
+	head=demux->get_frontends(demux);
 	if (!head)
-	        return 0;
+		return 0;
 	list_for_each(pos, head)
-	        if (DMX_FE_ENTRY(pos)->source==type)
-		        return DMX_FE_ENTRY(pos);
+		if (DMX_FE_ENTRY(pos)->source==type)
+			return DMX_FE_ENTRY(pos);
 	
 	return 0;
 }
@@ -177,8 +179,8 @@
 static inline void 
 dvb_dmxdev_dvr_state_set(dmxdev_dvr_t *dmxdevdvr, int state)
 {
-        spin_lock_irq(&dmxdevdvr->dev->lock);
-        dmxdevdvr->state=state;
+	spin_lock_irq(&dmxdevdvr->dev->lock);
+	dmxdevdvr->state=state;
 	spin_unlock_irq(&dmxdevdvr->dev->lock);
 }
 
@@ -186,17 +188,17 @@
 {
 	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
 	dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
-        dmx_frontend_t *front;
+	dmx_frontend_t *front;
 
-        dprintk ("function : %s\n", __FUNCTION__);
+	dprintk ("function : %s\n", __FUNCTION__);
 
-        if (down_interruptible (&dmxdev->mutex))
+	if (down_interruptible (&dmxdev->mutex))
 		return -ERESTARTSYS;
 	
 	if ((file->f_flags&O_ACCMODE)==O_RDWR) {
-	        if (!(dmxdev->capabilities&DMXDEV_CAP_DUPLEX)) {
+		if (!(dmxdev->capabilities&DMXDEV_CAP_DUPLEX)) {
 			up(&dmxdev->mutex);
-		        return -EOPNOTSUPP;
+			return -EOPNOTSUPP;
 		}
 	}
 
@@ -206,12 +208,12 @@
 	      dmxdev->dvr_buffer.data=vmalloc(DVR_BUFFER_SIZE);
 	      if (!dmxdev->dvr_buffer.data) {
 		      up(&dmxdev->mutex);
-	              return -ENOMEM;
+		      return -ENOMEM;
 	      }
 	}
 
 	if ((file->f_flags&O_ACCMODE)==O_WRONLY) {
-	        dmxdev->dvr_orig_fe=dmxdev->demux->frontend;
+		dmxdev->dvr_orig_fe=dmxdev->demux->frontend;
 		
 		if (!dmxdev->demux->write) {
 			up(&dmxdev->mutex);
@@ -222,13 +224,13 @@
 		
 		if (!front) {
 			up(&dmxdev->mutex);
-		        return -EINVAL;
+			return -EINVAL;
 		}
 		dmxdev->demux->disconnect_frontend(dmxdev->demux);	
 		dmxdev->demux->connect_frontend(dmxdev->demux, front);	
 	}
-        up(&dmxdev->mutex);
-        return 0;
+	up(&dmxdev->mutex);
+	return 0;
 }
 
 static int dvb_dvr_release(struct inode *inode, struct file *file)
@@ -236,25 +238,25 @@
 	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
 	dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
 
-        if (down_interruptible (&dmxdev->mutex))
+	if (down_interruptible (&dmxdev->mutex))
 		return -ERESTARTSYS;
 
 	if ((file->f_flags&O_ACCMODE)==O_WRONLY) {
-	        dmxdev->demux->disconnect_frontend(dmxdev->demux);	
+		dmxdev->demux->disconnect_frontend(dmxdev->demux);	
 		dmxdev->demux->connect_frontend(dmxdev->demux, 
 						dmxdev->dvr_orig_fe);
 	}
 	if ((file->f_flags&O_ACCMODE)==O_RDONLY) {
 		if (dmxdev->dvr_buffer.data) {
-		        void *mem=dmxdev->dvr_buffer.data;
+			void *mem=dmxdev->dvr_buffer.data;
 			mb();
 			spin_lock_irq(&dmxdev->lock);
 			dmxdev->dvr_buffer.data=0;
 			spin_unlock_irq(&dmxdev->lock);
-		        vfree(mem);
+			vfree(mem);
 		}
 	}
-        up(&dmxdev->mutex);
+	up(&dmxdev->mutex);
 	return 0;
 }
 
@@ -265,14 +267,14 @@
 	dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
 	int ret;
 
-        if (!dmxdev->demux->write)
-	        return -EOPNOTSUPP;
+	if (!dmxdev->demux->write)
+		return -EOPNOTSUPP;
 	if ((file->f_flags&O_ACCMODE)!=O_WRONLY)
-	        return -EINVAL;
-        if (down_interruptible (&dmxdev->mutex))
+		return -EINVAL;
+	if (down_interruptible (&dmxdev->mutex))
 		return -ERESTARTSYS;
-        ret=dmxdev->demux->write(dmxdev->demux, buf, count);
-        up(&dmxdev->mutex);
+	ret=dmxdev->demux->write(dmxdev->demux, buf, count);
+	up(&dmxdev->mutex);
 	return ret;
 }
 
@@ -283,19 +285,19 @@
 	dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
 	int ret;
 
-        //down(&dmxdev->mutex);
-        ret= dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, 
+	//down(&dmxdev->mutex);
+	ret= dvb_dmxdev_buffer_read(&dmxdev->dvr_buffer, 
 			      file->f_flags&O_NONBLOCK, 
 			      buf, count, ppos);
-        //up(&dmxdev->mutex);
+	//up(&dmxdev->mutex);
 	return ret;
 }
 
 static inline void 
 dvb_dmxdev_filter_state_set(dmxdev_filter_t *dmxdevfilter, int state)
 {
-        spin_lock_irq(&dmxdevfilter->dev->lock);
-        dmxdevfilter->state=state;
+	spin_lock_irq(&dmxdevfilter->dev->lock);
+	dmxdevfilter->state=state;
 	spin_unlock_irq(&dmxdevfilter->dev->lock);
 }
 
@@ -306,25 +308,25 @@
 	void *mem;
 
 	if (buf->size==size)
-	        return 0;
-        if (dmxdevfilter->state>=DMXDEV_STATE_GO)
-                return -EBUSY;
+		return 0;
+	if (dmxdevfilter->state>=DMXDEV_STATE_GO)
+		return -EBUSY;
 	spin_lock_irq(&dmxdevfilter->dev->lock);
 	mem=buf->data;
 	buf->data=0;
 	buf->size=size;
 	buf->pwrite=buf->pread=0;    
 	spin_unlock_irq(&dmxdevfilter->dev->lock);
-        if (mem) 
+	if (mem) 
 		vfree(mem);
 		
-        if (buf->size) {
-	        mem=vmalloc(dmxdevfilter->buffer.size);
+	if (buf->size) {
+		mem=vmalloc(dmxdevfilter->buffer.size);
 		if (!mem)
-		        return -ENOMEM;
-	        spin_lock_irq(&dmxdevfilter->dev->lock);
-                buf->data=mem;
-	        spin_unlock_irq(&dmxdevfilter->dev->lock);
+			return -ENOMEM;
+		spin_lock_irq(&dmxdevfilter->dev->lock);
+		buf->data=mem;
+		spin_unlock_irq(&dmxdevfilter->dev->lock);
 	}
 	return 0;
 }
@@ -332,23 +334,23 @@
 static void
 dvb_dmxdev_filter_timeout(unsigned long data)
 {
-        dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *)data;
+	dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *)data;
 	
 	dmxdevfilter->buffer.error=-ETIMEDOUT;
-        spin_lock_irq(&dmxdevfilter->dev->lock);
+	spin_lock_irq(&dmxdevfilter->dev->lock);
 	dmxdevfilter->state=DMXDEV_STATE_TIMEDOUT;
-        spin_unlock_irq(&dmxdevfilter->dev->lock);
+	spin_unlock_irq(&dmxdevfilter->dev->lock);
 	wake_up(&dmxdevfilter->buffer.queue);
 }
 
 static void
 dvb_dmxdev_filter_timer(dmxdev_filter_t *dmxdevfilter)
 {
-        struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec;
+	struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec;
   
 	del_timer(&dmxdevfilter->timer);
 	if (para->timeout) {
-	        dmxdevfilter->timer.function=dvb_dmxdev_filter_timeout;
+		dmxdevfilter->timer.function=dvb_dmxdev_filter_timeout;
 		dmxdevfilter->timer.data=(unsigned long) dmxdevfilter;
 		dmxdevfilter->timer.expires=jiffies+1+(HZ/2+HZ*para->timeout)/1000;
 		add_timer(&dmxdevfilter->timer);
@@ -356,53 +358,51 @@
 }
 
 static int 
-dvb_dmxdev_section_callback(u8 *buffer1, size_t buffer1_len,
-		      u8 *buffer2, size_t buffer2_len,
-		      dmx_section_filter_t *filter,
-		      dmx_success_t success)
-{
-        dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) filter->priv;
-        int ret;
-        
+dvb_dmxdev_section_callback(const u8 *buffer1, size_t buffer1_len,
+			    const u8 *buffer2, size_t buffer2_len,
+			    dmx_section_filter_t *filter, dmx_success_t success)
+{
+	dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) filter->priv;
+	int ret;
+	
 	if (dmxdevfilter->buffer.error) {
 		wake_up(&dmxdevfilter->buffer.queue);
-	        return 0;
+		return 0;
 	}
 	spin_lock(&dmxdevfilter->dev->lock);
 	if (dmxdevfilter->state!=DMXDEV_STATE_GO) {
 		spin_unlock(&dmxdevfilter->dev->lock);
-	        return 0;
+		return 0;
 	}
 	del_timer(&dmxdevfilter->timer);
 	dprintk("dmxdev: section callback %02x %02x %02x %02x %02x %02x\n", 
 		buffer1[0], buffer1[1], 
 		buffer1[2], buffer1[3], 
 		buffer1[4], buffer1[5]);
-        ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1, buffer1_len);
-        if (ret==buffer1_len) {
-	        ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2, buffer2_len);
-	}
-        if (ret<0) {
-	        dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread;    
-	        dmxdevfilter->buffer.error=-EOVERFLOW;
+	ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer1, buffer1_len);
+	if (ret==buffer1_len) {
+		ret=dvb_dmxdev_buffer_write(&dmxdevfilter->buffer, buffer2, buffer2_len);
+	}
+	if (ret<0) {
+		dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread;    
+		dmxdevfilter->buffer.error=-EOVERFLOW;
 	}
 	if (dmxdevfilter->params.sec.flags&DMX_ONESHOT)
-	        dmxdevfilter->state=DMXDEV_STATE_DONE;
+		dmxdevfilter->state=DMXDEV_STATE_DONE;
 	spin_unlock(&dmxdevfilter->dev->lock);
 	wake_up(&dmxdevfilter->buffer.queue);
 	return 0;
 }
 
 static int 
-dvb_dmxdev_ts_callback(u8 *buffer1, size_t buffer1_len,
-		 u8 *buffer2, size_t buffer2_len,
-		 dmx_ts_feed_t *feed,
-		 dmx_success_t success)
+dvb_dmxdev_ts_callback(const u8 *buffer1, size_t buffer1_len,
+		       const u8 *buffer2, size_t buffer2_len,
+		       dmx_ts_feed_t *feed, dmx_success_t success)
 {
-        dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) feed->priv;
+	dmxdev_filter_t *dmxdevfilter=(dmxdev_filter_t *) feed->priv;
 	dmxdev_buffer_t *buffer;
-        int ret;
-        
+	int ret;
+	
 	spin_lock(&dmxdevfilter->dev->lock);
 	if (dmxdevfilter->params.pes.output==DMX_OUT_DECODER) {
 		spin_unlock(&dmxdevfilter->dev->lock);
@@ -410,20 +410,20 @@
 	}
 
 	if (dmxdevfilter->params.pes.output==DMX_OUT_TAP)
-	        buffer=&dmxdevfilter->buffer;
+		buffer=&dmxdevfilter->buffer;
 	else
-	        buffer=&dmxdevfilter->dev->dvr_buffer;
+		buffer=&dmxdevfilter->dev->dvr_buffer;
 	if (buffer->error) {
 		spin_unlock(&dmxdevfilter->dev->lock);
 		wake_up(&buffer->queue);
-	        return 0;
+		return 0;
 	}
-        ret=dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
-        if (ret==buffer1_len) 
-	        ret=dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len);
-        if (ret<0) {
-	        buffer->pwrite=buffer->pread;    
-	        buffer->error=-EOVERFLOW;
+	ret=dvb_dmxdev_buffer_write(buffer, buffer1, buffer1_len);
+	if (ret==buffer1_len) 
+		ret=dvb_dmxdev_buffer_write(buffer, buffer2, buffer2_len);
+	if (ret<0) {
+		buffer->pwrite=buffer->pread;    
+		buffer->error=-EOVERFLOW;
 	}
 	spin_unlock(&dmxdevfilter->dev->lock);
 	wake_up(&buffer->queue);
@@ -440,49 +440,50 @@
 
 	switch (dmxdevfilter->type) {
 	case DMXDEV_TYPE_SEC:
-	        del_timer(&dmxdevfilter->timer);
-	        dmxdevfilter->feed.sec->stop_filtering(dmxdevfilter->feed.sec);
+		del_timer(&dmxdevfilter->timer);
+		dmxdevfilter->feed.sec->stop_filtering(dmxdevfilter->feed.sec);
 		break;
 	case DMXDEV_TYPE_PES:
-	        dmxdevfilter->feed.ts->stop_filtering(dmxdevfilter->feed.ts);
+		dmxdevfilter->feed.ts->stop_filtering(dmxdevfilter->feed.ts);
 		break;
 	default:
-	        return -EINVAL;
+		return -EINVAL;
 	}
-        return 0;
+	return 0;
 }
 
 
 /* start feed associated with the specified filter */
 
-static int 
-dvb_dmxdev_feed_start(dmxdev_filter_t *dmxdevfilter)
+static
+int dvb_dmxdev_feed_start(dmxdev_filter_t *filter)
 {
-	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_GO);
+	dvb_dmxdev_filter_state_set (filter, DMXDEV_STATE_GO);
 
-	switch (dmxdevfilter->type) {
+	switch (filter->type) {
 	case DMXDEV_TYPE_SEC:
-	        dmxdevfilter->feed.sec->start_filtering(dmxdevfilter->feed.sec);
+		return filter->feed.sec->start_filtering(filter->feed.sec);
 		break;
 	case DMXDEV_TYPE_PES:
-	        dmxdevfilter->feed.ts->start_filtering(dmxdevfilter->feed.ts);
+		return filter->feed.ts->start_filtering(filter->feed.ts);
 		break;
 	default:
-	        return -EINVAL;
+		return -EINVAL;
 	}
-        return 0;
+
+	return 0;
 }
 
 
 /* restart section feed if it has filters left associated with it, 
    otherwise release the feed */
 
-static int 
-dvb_dmxdev_feed_restart(dmxdev_filter_t *dmxdevfilter)
+static
+int dvb_dmxdev_feed_restart(dmxdev_filter_t *filter)
 {
 	int i;
-	dmxdev_t *dmxdev=dmxdevfilter->dev;
-	uint16_t pid=dmxdevfilter->params.sec.pid;
+	dmxdev_t *dmxdev = filter->dev;
+	uint16_t pid = filter->params.sec.pid;
 	
 	for (i=0; i<dmxdev->filternum; i++) 
 		if (dmxdev->filter[i].state>=DMXDEV_STATE_GO &&
@@ -492,36 +493,34 @@
 			return 0;
 		}
 	
-	dmxdevfilter->dev->demux->
-		release_section_feed(dmxdev->demux,
-				     dmxdevfilter->feed.sec);
+	filter->dev->demux->release_section_feed(dmxdev->demux, filter->feed.sec);
 
-        return 0;
+	return 0;
 }
 
 static int 
 dvb_dmxdev_filter_stop(dmxdev_filter_t *dmxdevfilter)
 {
-        if (dmxdevfilter->state<DMXDEV_STATE_GO) 
-	        return 0;
+	if (dmxdevfilter->state<DMXDEV_STATE_GO) 
+		return 0;
 
 	switch (dmxdevfilter->type) {
 	case DMXDEV_TYPE_SEC:
-	        if (!dmxdevfilter->feed.sec)
-		        break;
-	        dvb_dmxdev_feed_stop(dmxdevfilter);
-	        if (dmxdevfilter->filter.sec)
-		        dmxdevfilter->feed.sec->
+		if (!dmxdevfilter->feed.sec)
+			break;
+		dvb_dmxdev_feed_stop(dmxdevfilter);
+		if (dmxdevfilter->filter.sec)
+			dmxdevfilter->feed.sec->
 				release_filter(dmxdevfilter->feed.sec,
 					       dmxdevfilter->filter.sec);
-	        dvb_dmxdev_feed_restart(dmxdevfilter);
+		dvb_dmxdev_feed_restart(dmxdevfilter);
 		dmxdevfilter->feed.sec=0;
 		break;
 	case DMXDEV_TYPE_PES:
-	        if (!dmxdevfilter->feed.ts)
-		        break;
-	        dvb_dmxdev_feed_stop(dmxdevfilter);
-	        dmxdevfilter->dev->demux->
+		if (!dmxdevfilter->feed.ts)
+			break;
+		dvb_dmxdev_feed_stop(dmxdevfilter);
+		dmxdevfilter->dev->demux->
 			release_ts_feed(dmxdevfilter->dev->demux,
 					dmxdevfilter->feed.ts);
 		dmxdevfilter->feed.ts=0;
@@ -529,10 +528,10 @@
 	default:
 		if (dmxdevfilter->state==DMXDEV_STATE_ALLOCATED) 
 			return 0;
-	        return -EINVAL;
+		return -EINVAL;
 	}
 	dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread=0;    
-        return 0;
+	return 0;
 }
 
 static inline int 
@@ -544,58 +543,58 @@
 	dmxdevfilter->type=DMXDEV_TYPE_NONE;
 	dmxdevfilter->pid=0xffff;
 	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
-        return 0;
+	return 0;
 }
 
 static int 
-dvb_dmxdev_filter_start(dmxdev_filter_t *dmxdevfilter)
+dvb_dmxdev_filter_start(dmxdev_filter_t *filter)
 {
-	dmxdev_t *dmxdev=dmxdevfilter->dev;
+	dmxdev_t *dmxdev = filter->dev;
 	void *mem;
 	int ret, i;
 
-        if (dmxdevfilter->state<DMXDEV_STATE_SET) 
-	        return -EINVAL;
-        if (dmxdevfilter->state>=DMXDEV_STATE_GO)
-	        dvb_dmxdev_filter_stop(dmxdevfilter); 
-
-	mem=dmxdevfilter->buffer.data;
-	if (!mem) {
-                mem=vmalloc(dmxdevfilter->buffer.size);
-	        spin_lock_irq(&dmxdevfilter->dev->lock);
-		dmxdevfilter->buffer.data=mem;
-	        spin_unlock_irq(&dmxdevfilter->dev->lock);
-                if (!dmxdevfilter->buffer.data)
-                        return -ENOMEM;
+	if (filter->state < DMXDEV_STATE_SET) 
+		return -EINVAL;
+
+	if (filter->state >= DMXDEV_STATE_GO)
+		dvb_dmxdev_filter_stop(filter); 
+
+	if (!(mem = filter->buffer.data)) {
+		mem = vmalloc(filter->buffer.size);
+		spin_lock_irq(&filter->dev->lock);
+		filter->buffer.data=mem;
+		spin_unlock_irq(&filter->dev->lock);
+		if (!filter->buffer.data)
+			return -ENOMEM;
 	}
 
-	dmxdevfilter->buffer.pwrite=dmxdevfilter->buffer.pread=0;
+	filter->buffer.pwrite = filter->buffer.pread = 0;
 
-	switch (dmxdevfilter->type) {
+	switch (filter->type) {
 	case DMXDEV_TYPE_SEC:
 	{
-		struct dmx_sct_filter_params *para=&dmxdevfilter->params.sec;
-		dmx_section_filter_t **secfilter=&dmxdevfilter->filter.sec;
-		dmx_section_feed_t **secfeed=&dmxdevfilter->feed.sec;
+		struct dmx_sct_filter_params *para=&filter->params.sec;
+		dmx_section_filter_t **secfilter=&filter->filter.sec;
+		dmx_section_feed_t **secfeed=&filter->feed.sec;
 
 		*secfilter=0;
 		*secfeed=0;
 
 		/* find active filter/feed with same PID */
-		for (i=0; i<dmxdev->filternum; i++) 
-			if (dmxdev->filter[i].state>=DMXDEV_STATE_GO &&
-			    dmxdev->filter[i].pid==para->pid) {
-				if (dmxdev->filter[i].type!=DMXDEV_TYPE_SEC)
-					return -EBUSY;
-				*secfeed=dmxdev->filter[i].feed.sec;
+		for (i=0; i<dmxdev->filternum; i++) {
+			if (dmxdev->filter[i].state >= DMXDEV_STATE_GO &&
+			    dmxdev->filter[i].pid == para->pid && 
+			    dmxdev->filter[i].type == DMXDEV_TYPE_SEC) {
+				*secfeed = dmxdev->filter[i].feed.sec;
 				break;
 			}
+		}
 
 		/* if no feed found, try to allocate new one */ 
 		if (!*secfeed) {
 			ret=dmxdev->demux->allocate_section_feed(dmxdev->demux, 
-						      secfeed, 
-					           dvb_dmxdev_section_callback);
+								 secfeed, 
+						   dvb_dmxdev_section_callback);
 			if (ret<0) {
 				printk ("DVB (%s): could not alloc feed\n",
 					__FUNCTION__);
@@ -608,22 +607,23 @@
 			if (ret<0) {
 				printk ("DVB (%s): could not set feed\n",
 					__FUNCTION__);
-				dvb_dmxdev_feed_restart(dmxdevfilter);
+				dvb_dmxdev_feed_restart(filter);
 				return ret;
 			}
+		} else {
+			dvb_dmxdev_feed_stop(filter);
 		}
-	        else 
-			dvb_dmxdev_feed_stop(dmxdevfilter);
 			
 		ret=(*secfeed)->allocate_filter(*secfeed, secfilter);
-		if (ret<0) {
-			dvb_dmxdev_feed_restart(dmxdevfilter);
-			dmxdevfilter->feed.sec->start_filtering(*secfeed);
+
+		if (ret < 0) {
+			dvb_dmxdev_feed_restart(filter);
+			filter->feed.sec->start_filtering(*secfeed);
 			dprintk ("could not get filter\n");
 			return ret;
 		}
 
-		(*secfilter)->priv=(void *) dmxdevfilter;
+		(*secfilter)->priv = filter;
 
 		memcpy(&((*secfilter)->filter_value[3]), 
 		       &(para->filter.filter[1]), DMX_FILTER_SIZE-1);
@@ -638,23 +638,28 @@
 		(*secfilter)->filter_mask[1]=0;
 		(*secfilter)->filter_mask[2]=0;
 		
-	        dmxdevfilter->todo=0;
-	        dmxdevfilter->feed.sec->start_filtering(dmxdevfilter->feed.sec);
-	        dvb_dmxdev_filter_timer(dmxdevfilter);
+		filter->todo = 0;
+
+		ret = filter->feed.sec->start_filtering (filter->feed.sec);
+
+		if (ret < 0)
+			return ret;
+
+		dvb_dmxdev_filter_timer(filter);
 		break;
 	}
 
 	case DMXDEV_TYPE_PES: 
 	{
 		struct timespec timeout = { 0 };
-		struct dmx_pes_filter_params *para=&dmxdevfilter->params.pes;
+		struct dmx_pes_filter_params *para = &filter->params.pes;
 		dmx_output_t otype;
 		int ret;
 		int ts_type;
 		dmx_ts_pes_t ts_pes;
-		dmx_ts_feed_t **tsfeed=&dmxdevfilter->feed.ts;
+		dmx_ts_feed_t **tsfeed = &filter->feed.ts;
 		
-		dmxdevfilter->feed.ts=0;
+		filter->feed.ts = 0;
 		otype=para->output;
 		
 		ts_pes=(dmx_ts_pes_t) para->pes_type;
@@ -664,11 +669,11 @@
 		else
 			ts_type=0;
 		
-		if (otype==DMX_OUT_TS_TAP) 
-			ts_type|=TS_PACKET;
+		if (otype == DMX_OUT_TS_TAP) 
+			ts_type |= TS_PACKET;
 		
-		if (otype==DMX_OUT_TAP) 
-			ts_type|=TS_PAYLOAD_ONLY|TS_PACKET;
+		if (otype == DMX_OUT_TAP) 
+			ts_type |= TS_PAYLOAD_ONLY|TS_PACKET;
 		
 		ret=dmxdev->demux->allocate_ts_feed(dmxdev->demux, 
 						    tsfeed, 
@@ -676,75 +681,97 @@
 		if (ret<0) 
 			return ret;
 
-		(*tsfeed)->priv=(void *) dmxdevfilter;
-		ret=(*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes, 188, 32768, 0, timeout);
-		if (ret<0) {
+		(*tsfeed)->priv = (void *) filter;
+
+		ret = (*tsfeed)->set(*tsfeed, para->pid, ts_type, ts_pes,
+				     188, 32768, 0, timeout);
+
+		if (ret < 0) {
 			dmxdev->demux->release_ts_feed(dmxdev->demux, *tsfeed);
 			return ret;
 		}
-	        dmxdevfilter->feed.ts->start_filtering(dmxdevfilter->feed.ts);
+
+		ret = filter->feed.ts->start_filtering(filter->feed.ts);
+
+		if (ret < 0)
+			return ret;
+
 		break;
 	}
 	default:
-	        return -EINVAL;
+		return -EINVAL;
 	}
-	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_GO);
-        return 0;
+
+	dvb_dmxdev_filter_state_set(filter, DMXDEV_STATE_GO);
+	return 0;
 }
 
 static int dvb_demux_open(struct inode *inode, struct file *file)
 {
 	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
 	dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
-        int i;
-        dmxdev_filter_t *dmxdevfilter;
+	int i;
+	dmxdev_filter_t *dmxdevfilter;
 
 	if (!dmxdev->filter)
-	        return -EINVAL;
-        if (down_interruptible(&dmxdev->mutex))
+		return -EINVAL;
+
+	if (down_interruptible(&dmxdev->mutex))
 		return -ERESTARTSYS;
-        for (i=0; i<dmxdev->filternum; i++)
-                if (dmxdev->filter[i].state==DMXDEV_STATE_FREE)
-                        break;
-        if (i==dmxdev->filternum) {
-	        up(&dmxdev->mutex);
-                return -EMFILE;
+
+	for (i=0; i<dmxdev->filternum; i++)
+		if (dmxdev->filter[i].state==DMXDEV_STATE_FREE)
+			break;
+
+	if (i==dmxdev->filternum) {
+		up(&dmxdev->mutex);
+		return -EMFILE;
 	}
-        dmxdevfilter=&dmxdev->filter[i];
-        dmxdevfilter->dvbdev=dmxdev->dvbdev;
+
+	dmxdevfilter=&dmxdev->filter[i];
+	sema_init(&dmxdevfilter->mutex, 1);
+	dmxdevfilter->dvbdev=dmxdev->dvbdev;
 	file->private_data=dmxdevfilter;
 
 	dvb_dmxdev_buffer_init(&dmxdevfilter->buffer);
-        dmxdevfilter->type=DMXDEV_TYPE_NONE;
+	dmxdevfilter->type=DMXDEV_TYPE_NONE;
 	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_ALLOCATED);
 	dmxdevfilter->feed.ts=0;
 	init_timer(&dmxdevfilter->timer);
 
-        up(&dmxdev->mutex);
-        return 0;
+	up(&dmxdev->mutex);
+	return 0;
 }
 
-int 
-dvb_dmxdev_filter_free(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter)
+
+static
+int dvb_dmxdev_filter_free(dmxdev_t *dmxdev, dmxdev_filter_t *dmxdevfilter)
 {
-        if (down_interruptible(&dmxdev->mutex))
+	if (down_interruptible(&dmxdev->mutex))
 		return -ERESTARTSYS;
 
-        dvb_dmxdev_filter_stop(dmxdevfilter);
+	if (down_interruptible(&dmxdevfilter->mutex)) {
+		up(&dmxdev->mutex);
+		return -ERESTARTSYS;
+	}
+	
+	dvb_dmxdev_filter_stop(dmxdevfilter);
 	dvb_dmxdev_filter_reset(dmxdevfilter);
-        
-        if (dmxdevfilter->buffer.data) {
-	        void *mem=dmxdevfilter->buffer.data;
+	
+	if (dmxdevfilter->buffer.data) {
+		void *mem=dmxdevfilter->buffer.data;
 		
-	        spin_lock_irq(&dmxdev->lock);
+		spin_lock_irq(&dmxdev->lock);
 		dmxdevfilter->buffer.data=0;
-	        spin_unlock_irq(&dmxdev->lock);
+		spin_unlock_irq(&dmxdev->lock);
 		vfree(mem);
 	}
+
 	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_FREE);
 	wake_up(&dmxdevfilter->buffer.queue);
+	up(&dmxdevfilter->mutex);
 	up(&dmxdev->mutex);
-        return 0;
+	return 0;
 }
 
 static inline void 
@@ -759,83 +786,83 @@
 
 static int 
 dvb_dmxdev_filter_set(dmxdev_t *dmxdev, 
-                dmxdev_filter_t *dmxdevfilter, 
+		dmxdev_filter_t *dmxdevfilter, 
 		struct dmx_sct_filter_params *params)
 {
-        dprintk ("function : %s\n", __FUNCTION__);
+	dprintk ("function : %s\n", __FUNCTION__);
 
 	dvb_dmxdev_filter_stop(dmxdevfilter);
-        
-        dmxdevfilter->type=DMXDEV_TYPE_SEC;
-        dmxdevfilter->pid=params->pid;
+	
+	dmxdevfilter->type=DMXDEV_TYPE_SEC;
+	dmxdevfilter->pid=params->pid;
 	memcpy(&dmxdevfilter->params.sec, 
 	       params, sizeof(struct dmx_sct_filter_params));
 	invert_mode(&dmxdevfilter->params.sec.filter);
 	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
 		
-        if (params->flags&DMX_IMMEDIATE_START) 
-                return dvb_dmxdev_filter_start(dmxdevfilter);
+	if (params->flags&DMX_IMMEDIATE_START) 
+		return dvb_dmxdev_filter_start(dmxdevfilter);
 
-        return 0;
+	return 0;
 }
 
 static int 
 dvb_dmxdev_pes_filter_set(dmxdev_t *dmxdev,
-                   dmxdev_filter_t *dmxdevfilter,
-                   struct dmx_pes_filter_params *params)
+		   dmxdev_filter_t *dmxdevfilter,
+		   struct dmx_pes_filter_params *params)
 {
 	dvb_dmxdev_filter_stop(dmxdevfilter);
 
 	if (params->pes_type>DMX_PES_OTHER || params->pes_type<0)
-	        return -EINVAL;
+		return -EINVAL;
 
-        dmxdevfilter->type=DMXDEV_TYPE_PES;
-        dmxdevfilter->pid=params->pid;
+	dmxdevfilter->type=DMXDEV_TYPE_PES;
+	dmxdevfilter->pid=params->pid;
 	memcpy(&dmxdevfilter->params, params, sizeof(struct dmx_pes_filter_params));
 
 	dvb_dmxdev_filter_state_set(dmxdevfilter, DMXDEV_STATE_SET);
 
-        if (params->flags&DMX_IMMEDIATE_START) 
-                return dvb_dmxdev_filter_start(dmxdevfilter);
+	if (params->flags&DMX_IMMEDIATE_START) 
+		return dvb_dmxdev_filter_start(dmxdevfilter);
 
-        return 0;
+	return 0;
 }
 
 static ssize_t 
 dvb_dmxdev_read_sec(dmxdev_filter_t *dfil, struct file *file, 
 	      char *buf, size_t count, loff_t *ppos)
 {
-        int result, hcount;
+	int result, hcount;
 	int done=0;
 	
 	if (dfil->todo<=0) {
-	        hcount=3+dfil->todo;
-	        if (hcount>count)
-		        hcount=count;
+		hcount=3+dfil->todo;
+		if (hcount>count)
+			hcount=count;
 		result=dvb_dmxdev_buffer_read(&dfil->buffer, file->f_flags&O_NONBLOCK, 
 					buf, hcount, ppos);
 		if (result<0) {
 			dfil->todo=0;
-		        return result;
+			return result;
 		}
 		if (copy_from_user(dfil->secheader-dfil->todo, buf, result)) 
-		        return -EFAULT;
+			return -EFAULT;
 		buf+=result;
 		done=result;
 		count-=result;
 		dfil->todo-=result;
 		if (dfil->todo>-3)
-		        return done;
+			return done;
 		dfil->todo=((dfil->secheader[1]<<8)|dfil->secheader[2])&0xfff;
 		if (!count)
-		        return done;
+			return done;
 	}
 	if (count>dfil->todo)
-	        count=dfil->todo;
-        result=dvb_dmxdev_buffer_read(&dfil->buffer, file->f_flags&O_NONBLOCK, 
+		count=dfil->todo;
+	result=dvb_dmxdev_buffer_read(&dfil->buffer, file->f_flags&O_NONBLOCK, 
 				buf, count, ppos);
 	if (result<0)
-	        return result;
+		return result;
 	dfil->todo-=result;
 	return (result+done);
 }
@@ -844,19 +871,20 @@
 ssize_t 
 dvb_demux_read(struct file *file, char *buf, size_t count, loff_t *ppos)
 {
-        dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
-	//dmxdev_t *dmxdev=dmxdevfilter->dev;
+	dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
 	int ret=0;
 
-	// semaphore should not be necessary (I hope ...)
-        //down(&dmxdev->mutex);
+	if (down_interruptible(&dmxdevfilter->mutex))
+		return -ERESTARTSYS;
+
 	if (dmxdevfilter->type==DMXDEV_TYPE_SEC)
-	        ret=dvb_dmxdev_read_sec(dmxdevfilter, file, buf, count, ppos);
+		ret=dvb_dmxdev_read_sec(dmxdevfilter, file, buf, count, ppos);
 	else
-	        ret=dvb_dmxdev_buffer_read(&dmxdevfilter->buffer, 
+		ret=dvb_dmxdev_buffer_read(&dmxdevfilter->buffer, 
 				     file->f_flags&O_NONBLOCK, 
 				     buf, count, ppos);
-        //up(&dmxdev->mutex);
+
+	up(&dmxdevfilter->mutex);
 	return ret;
 }
 
@@ -864,102 +892,131 @@
 static int dvb_demux_do_ioctl(struct inode *inode, struct file *file,
 			      unsigned int cmd, void *parg)
 {
-        dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
+	dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
 	dmxdev_t *dmxdev=dmxdevfilter->dev;
-        unsigned long arg=(unsigned long) parg;
+	unsigned long arg=(unsigned long) parg;
 	int ret=0;
   
-        if (down_interruptible (&dmxdev->mutex))
+	if (down_interruptible (&dmxdev->mutex))
 		return -ERESTARTSYS;
 
 	switch (cmd) {
-	case DMX_START: 
-	        if (dmxdevfilter->state<DMXDEV_STATE_SET)
-		        ret=-EINVAL;
+	case DMX_START:
+		if (down_interruptible(&dmxdevfilter->mutex)) {
+			up(&dmxdev->mutex);
+			return -ERESTARTSYS;
+		}
+		if (dmxdevfilter->state<DMXDEV_STATE_SET)
+			ret = -EINVAL;
 		else
-		        ret=dvb_dmxdev_filter_start(dmxdevfilter);
+			ret = dvb_dmxdev_filter_start(dmxdevfilter);
+		up(&dmxdevfilter->mutex);
 		break;
 
-	case DMX_STOP: 
+	case DMX_STOP:
+		if (down_interruptible(&dmxdevfilter->mutex)) {
+			up(&dmxdev->mutex);
+			return -ERESTARTSYS;
+		}
 		ret=dvb_dmxdev_filter_stop(dmxdevfilter);
+		up(&dmxdevfilter->mutex);
 		break;
 
 	case DMX_SET_FILTER: 
-		ret=dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, 
+		if (down_interruptible(&dmxdevfilter->mutex)) {
+			up(&dmxdev->mutex);
+			return -ERESTARTSYS;
+		}
+		ret = dvb_dmxdev_filter_set(dmxdev, dmxdevfilter, 
 				    (struct dmx_sct_filter_params *)parg);
+		up(&dmxdevfilter->mutex);
 		break;
 
 	case DMX_SET_PES_FILTER: 
+		if (down_interruptible(&dmxdevfilter->mutex)) {
+			up(&dmxdev->mutex);
+			return -ERESTARTSYS;
+		}
 		ret=dvb_dmxdev_pes_filter_set(dmxdev, dmxdevfilter, 
 					       (struct dmx_pes_filter_params *)parg);
+		up(&dmxdevfilter->mutex);
 		break;
 
 	case DMX_SET_BUFFER_SIZE: 
-	        ret=dvb_dmxdev_set_buffer_size(dmxdevfilter, arg);
+		if (down_interruptible(&dmxdevfilter->mutex)) {
+			up(&dmxdev->mutex);
+			return -ERESTARTSYS;
+		}
+		ret=dvb_dmxdev_set_buffer_size(dmxdevfilter, arg);
+		up(&dmxdevfilter->mutex);
+		break;
+	
+	case DMX_GET_EVENT: 
 		break;
-        
-        case DMX_GET_EVENT: 
-	        break;
 		
-        case DMX_GET_PES_PIDS: 
+	case DMX_GET_PES_PIDS: 
 		if (!dmxdev->demux->get_pes_pids) {
-		        ret=-EINVAL;
+			ret=-EINVAL;
 			break;
 		}
 		dmxdev->demux->get_pes_pids(dmxdev->demux, (uint16_t *)parg);
-	        break;
+		break;
+
+	case DMX_GET_STC:
+		if (!dmxdev->demux->get_stc) {
+		        ret=-EINVAL;
+			break;
+		}
+		ret = dmxdev->demux->get_stc(dmxdev->demux,
+				((struct dmx_stc *)parg)->num,
+				&((struct dmx_stc *)parg)->stc,
+				&((struct dmx_stc *)parg)->base);
+		break;
 
 	default:
-	        ret=-EINVAL;
+		ret=-EINVAL;
 	}
-        up(&dmxdev->mutex);
+	up(&dmxdev->mutex);
 	return ret;
 }
 
 static int dvb_demux_ioctl(struct inode *inode, struct file *file,
 			   unsigned int cmd, unsigned long arg)
 {
-	return video_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl);
+	return dvb_usercopy(inode, file, cmd, arg, dvb_demux_do_ioctl);
 }
 
 
-static unsigned int dvb_demux_poll(struct file *file, poll_table *wait)
+static
+unsigned int dvb_demux_poll (struct file *file, poll_table *wait)
 {
-        dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
+	dmxdev_filter_t *dmxdevfilter = dvb_dmxdev_file_to_filter(file);
+	unsigned int mask = 0;
 
 	if (!dmxdevfilter)
-	        return -EINVAL;
-
-	if (dmxdevfilter->state==DMXDEV_STATE_FREE)
-	        return 0;
-
-	if (dmxdevfilter->buffer.error)
-	        return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
-
-	if (dmxdevfilter->buffer.pread!=dmxdevfilter->buffer.pwrite)
-	        return (POLLIN | POLLRDNORM | POLLPRI);
-
-	if (dmxdevfilter->state!=DMXDEV_STATE_GO)
-	        return 0;
+		return -EINVAL;
 
 	poll_wait(file, &dmxdevfilter->buffer.queue, wait);
-                
-	if (dmxdevfilter->state==DMXDEV_STATE_FREE)
-	        return 0;
+
+	if (dmxdevfilter->state != DMXDEV_STATE_GO &&
+	    dmxdevfilter->state != DMXDEV_STATE_DONE)
+		return 0;
 
 	if (dmxdevfilter->buffer.error)
-	        return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
+		mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
 
-	if (dmxdevfilter->buffer.pread!=dmxdevfilter->buffer.pwrite)
-	        return (POLLIN | POLLRDNORM | POLLPRI);
+	if (dmxdevfilter->buffer.pread != dmxdevfilter->buffer.pwrite)
+		mask |= (POLLIN | POLLRDNORM | POLLPRI);
 
-	return 0;
+	return mask;
 }
 
-static int dvb_demux_release(struct inode *inode, struct file *file)
+
+static
+int dvb_demux_release(struct inode *inode, struct file *file)
 {
-        dmxdev_filter_t *dmxdevfilter=dvb_dmxdev_file_to_filter(file);
-	dmxdev_t *dmxdev=dmxdevfilter->dev;
+	dmxdev_filter_t *dmxdevfilter = dvb_dmxdev_file_to_filter(file);
+	dmxdev_t *dmxdev = dmxdevfilter->dev;
 
 	return dvb_dmxdev_filter_free(dmxdev, dmxdevfilter);
 }
@@ -988,64 +1045,62 @@
 
 	int ret=0;
 
-        if (down_interruptible (&dmxdev->mutex))
+	if (down_interruptible (&dmxdev->mutex))
 		return -ERESTARTSYS;
 
 	switch (cmd) {
 	case DMX_SET_BUFFER_SIZE: 
 		// FIXME: implement
-	        ret=0;
+		ret=0;
 		break;
 		
 	default:
-	        ret=-EINVAL;
+		ret=-EINVAL;
 	}
-        up(&dmxdev->mutex);
+	up(&dmxdev->mutex);
 	return ret;
 }
 
 static int dvb_dvr_ioctl(struct inode *inode, struct file *file,
 			 unsigned int cmd, unsigned long arg)
 {
-	return video_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl);
+	return dvb_usercopy(inode, file, cmd, arg, dvb_dvr_do_ioctl);
 }
 
 
-static unsigned int dvb_dvr_poll(struct file *file, poll_table *wait)
+static
+unsigned int dvb_dvr_poll (struct file *file, poll_table *wait)
 {
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-	dmxdev_t *dmxdev=(dmxdev_t *) dvbdev->priv;
+	struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
+	dmxdev_t *dmxdev = (dmxdev_t *) dvbdev->priv;
+	unsigned int mask = 0;
 
-        dprintk ("function : %s\n", __FUNCTION__);
+	dprintk ("function : %s\n", __FUNCTION__);
 
-        if ((file->f_flags&O_ACCMODE)==O_RDONLY) {
-		if (dmxdev->dvr_buffer.error)
-			return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
+	poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
 
-		if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite)
-			return (POLLIN | POLLRDNORM | POLLPRI);
-		
-		poll_wait(file, &dmxdev->dvr_buffer.queue, wait);
-		
+	if ((file->f_flags&O_ACCMODE) == O_RDONLY) {
 		if (dmxdev->dvr_buffer.error)
-			return (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
+			mask |= (POLLIN | POLLRDNORM | POLLPRI | POLLERR);
 
 		if (dmxdev->dvr_buffer.pread!=dmxdev->dvr_buffer.pwrite)
-			return (POLLIN | POLLRDNORM | POLLPRI);
-		
-		return 0;
+			mask |= (POLLIN | POLLRDNORM | POLLPRI);
 	} else 
-	        return (POLLOUT | POLLWRNORM | POLLPRI);
+		mask |= (POLLOUT | POLLWRNORM | POLLPRI);
+
+	return mask;
 }
 
-static struct file_operations dvb_dvr_fops = {
+
+static
+struct file_operations dvb_dvr_fops = {
 	.owner		= THIS_MODULE,
 	.read		= dvb_dvr_read,
 	.write		= dvb_dvr_write,
 	.ioctl		= dvb_dvr_ioctl,
 	.open		= dvb_dvr_open,
 	.release	= dvb_dvr_release,
-	.poll		=dvb_dvr_poll,
+	.poll		= dvb_dvr_poll,
 };
 
 static struct dvb_device dvbdev_dvr = {
@@ -1058,37 +1113,38 @@
 int 
 dvb_dmxdev_init(dmxdev_t *dmxdev, struct dvb_adapter *dvb_adapter)
 {
-        int i;
+	int i;
 
 	if (dmxdev->demux->open(dmxdev->demux)<0)
 		return -EUSERS;
 	
 	dmxdev->filter=vmalloc(dmxdev->filternum*sizeof(dmxdev_filter_t));
 	if (!dmxdev->filter)
-	        return -ENOMEM;
+		return -ENOMEM;
 
 	dmxdev->dvr=vmalloc(dmxdev->filternum*sizeof(dmxdev_dvr_t));
 	if (!dmxdev->dvr) {
 		vfree(dmxdev->filter);
 		dmxdev->filter=0;
-	        return -ENOMEM;
+		return -ENOMEM;
 	}
-        sema_init(&dmxdev->mutex, 1);
+	sema_init(&dmxdev->mutex, 1);
 	spin_lock_init(&dmxdev->lock);
 	for (i=0; i<dmxdev->filternum; i++) {
-                dmxdev->filter[i].dev=dmxdev;
-                dmxdev->filter[i].buffer.data=0;
-	        dvb_dmxdev_filter_state_set(&dmxdev->filter[i], DMXDEV_STATE_FREE);
-                dmxdev->dvr[i].dev=dmxdev;
-                dmxdev->dvr[i].buffer.data=0;
-	        dvb_dmxdev_filter_state_set(&dmxdev->filter[i], DMXDEV_STATE_FREE);
-	        dvb_dmxdev_dvr_state_set(&dmxdev->dvr[i], DMXDEV_STATE_FREE);
+		dmxdev->filter[i].dev=dmxdev;
+		dmxdev->filter[i].buffer.data=0;
+		dvb_dmxdev_filter_state_set(&dmxdev->filter[i], DMXDEV_STATE_FREE);
+		dmxdev->dvr[i].dev=dmxdev;
+		dmxdev->dvr[i].buffer.data=0;
+		dvb_dmxdev_filter_state_set(&dmxdev->filter[i], DMXDEV_STATE_FREE);
+		dvb_dmxdev_dvr_state_set(&dmxdev->dvr[i], DMXDEV_STATE_FREE);
 	}
 	dvb_register_device(dvb_adapter, &dmxdev->dvbdev, &dvbdev_demux, dmxdev, DVB_DEVICE_DEMUX);
 	dvb_register_device(dvb_adapter, &dmxdev->dvr_dvbdev, &dvbdev_dvr, dmxdev, DVB_DEVICE_DVR);
 
 	dvb_dmxdev_buffer_init(&dmxdev->dvr_buffer);
-	MOD_INC_USE_COUNT;
+	/* fixme: is this correct? */
+	try_module_get(THIS_MODULE);
 	return 0;
 }
 
@@ -1098,15 +1154,16 @@
 	dvb_unregister_device(dmxdev->dvbdev);
 	dvb_unregister_device(dmxdev->dvr_dvbdev);
 	if (dmxdev->filter) {
-	        vfree(dmxdev->filter);
+		vfree(dmxdev->filter);
 		dmxdev->filter=0;
 	}
 	if (dmxdev->dvr) {
-	        vfree(dmxdev->dvr);
+		vfree(dmxdev->dvr);
 		dmxdev->dvr=0;
 	}
-        dmxdev->demux->close(dmxdev->demux);
-	MOD_DEC_USE_COUNT;
+	dmxdev->demux->close(dmxdev->demux);
+	/* fixme: is this correct? */
+	module_put(THIS_MODULE);
 }
 
 
diff -Nru a/drivers/media/dvb/dvb-core/dmxdev.h b/drivers/media/dvb/dvb-core/dmxdev.h
--- a/drivers/media/dvb/dvb-core/dmxdev.h	Sat Apr 19 19:51:51 2003
+++ b/drivers/media/dvb/dvb-core/dmxdev.h	Sat Apr 19 19:51:51 2003
@@ -85,6 +85,8 @@
         struct dmxdev_s *dev;
         dmxdev_buffer_t buffer;
 
+	struct semaphore mutex;
+
         // only for sections
         struct timer_list timer;
         int todo;
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	Sat Apr 19 19:51:28 2003
+++ b/drivers/media/dvb/dvb-core/dvb_demux.c	Sat Apr 19 19:51:28 2003
@@ -2,8 +2,8 @@
  * dvb_demux.c - DVB kernel demux API
  *
  * Copyright (C) 2000-2001 Ralph  Metzler <ralph@convergence.de>
- *                       & Marcus Metzler <marcus@convergence.de>
- *                         for convergence integrated media GmbH
+ *		       & Marcus Metzler <marcus@convergence.de>
+ *			 for convergence integrated media GmbH
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -27,27 +27,36 @@
 #include <linux/version.h>
 #include <asm/uaccess.h>
 
-#include "compat.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#include "compat.h"
+#else
+	#include <linux/crc32.h>
+#endif
+
 #include "dvb_demux.h"
 
 #define NOBUFS  
 
 LIST_HEAD(dmx_muxs);
 
+
 int dmx_register_demux(dmx_demux_t *demux) 
 {
-	struct list_head *pos, *head=&dmx_muxs;
+	struct list_head *pos;
 	
 	if (!(demux->id && demux->vendor && demux->model)) 
-	        return -EINVAL;
-	list_for_each(pos, head) 
-	{
-	        if (!strcmp(DMX_DIR_ENTRY(pos)->id, demux->id))
-		        return -EEXIST;
+		return -EINVAL;
+
+	list_for_each(pos, &dmx_muxs) {
+		if (!strcmp(DMX_DIR_ENTRY(pos)->id, demux->id))
+			return -EEXIST;
 	}
-	demux->users=0;
-	list_add(&(demux->reg_list), head);
-	MOD_INC_USE_COUNT;
+
+	demux->users = 0;
+	list_add(&demux->reg_list, &dmx_muxs);
+	/* fixme: is this correct? */
+	try_module_get(THIS_MODULE);
+
 	return 0;
 }
 
@@ -55,25 +64,25 @@
 {
 	struct list_head *pos, *n, *head=&dmx_muxs;
 
-	list_for_each_safe (pos, n, head) 
-	{
-	        if (DMX_DIR_ENTRY(pos)==demux) 
-		{
-		        if (demux->users>0)
-			        return -EINVAL;
-		        list_del(pos);
-		        MOD_DEC_USE_COUNT;
+	list_for_each_safe (pos, n, head) {
+		if (DMX_DIR_ENTRY(pos) == demux) {
+			if (demux->users>0)
+				return -EINVAL;
+			list_del(pos);
+			/* fixme: is this correct? */
+			module_put(THIS_MODULE);
 			return 0;
 		}
 	}
+
 	return -ENODEV;
 }
 
 
 struct list_head *dmx_get_demuxes(void)
 {
-        if (list_empty(&dmx_muxs))
-	        return NULL;
+	if (list_empty(&dmx_muxs))
+		return NULL;
 
 	return &dmx_muxs;
 }
@@ -82,628 +91,661 @@
  * static inlined helper functions
  ******************************************************************************/
 
-static inline u16 
-section_length(const u8 *buf)
+
+static inline
+u16 section_length(const u8 *buf)
 {
-        return 3+((buf[1]&0x0f)<<8)+buf[2];
+	return 3+((buf[1]&0x0f)<<8)+buf[2];
 }
 
-static inline u16 
-ts_pid(const u8 *buf)
+
+static inline
+u16 ts_pid(const u8 *buf)
 {
-        return ((buf[1]&0x1f)<<8)+buf[2];
+	return ((buf[1]&0x1f)<<8)+buf[2];
 }
 
-static inline int
-payload(const u8 *tsp)
+
+static inline
+int payload(const u8 *tsp)
 {
-        if (!(tsp[3]&0x10)) // no payload?
-                return 0;
-        if (tsp[3]&0x20) {  // adaptation field?
+	if (!(tsp[3]&0x10)) // no payload?
+		return 0;
+	if (tsp[3]&0x20) {  // adaptation field?
 		if (tsp[4]>183)    // corrupted data?
 			return 0;
 		else
 			return 184-1-tsp[4];
 	}
-        return 184;
+	return 184;
 }
 
 
-static u32 
-dvb_crc_table[256] = {
-	0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
-	0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
-	0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
-	0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
-	0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
-	0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
-	0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
-	0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
-	0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
-	0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
-	0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
-	0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
-	0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
-	0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
-	0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
-	0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
-	0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
-	0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
-	0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
-	0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
-	0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
-	0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
-	0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
-	0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
-	0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
-	0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
-	0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
-	0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
-	0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
-	0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
-	0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
-	0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
-	0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
-	0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
-	0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
-	0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
-	0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
-	0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
-	0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
-	0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
-	0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
-	0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
-	0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4};
-
-u32 dvb_crc32(u8 *data, int len)
+void dvb_set_crc32(u8 *data, int length)
 {
-	int i;
-	u32 crc = 0xffffffff;
+	u32 crc;
+
+	crc = crc32_le(~0, data, length);
 
-	for (i=0; i<len; i++)
-                crc = (crc << 8) ^ dvb_crc_table[((crc >> 24) ^ *data++) & 0xff];
-	return crc;
+	data[length]   = (crc >> 24) & 0xff;
+	data[length+1] = (crc >> 16) & 0xff;
+	data[length+2] = (crc >>  8) & 0xff;
+	data[length+3] = (crc)       & 0xff;
 }
 
-void dvb_set_crc32(u8 *data, int length)
+
+static
+u32 dvb_dmx_crc32 (struct dvb_demux_feed *f, const u8 *src, size_t len)
 {
-        u32 crc;
+	return (f->feed.sec.crc_val = crc32_le (f->feed.sec.crc_val, src, len));
+}
+
 
-        crc=dvb_crc32(data,length);
-        data[length]   = (crc>>24)&0xff;
-        data[length+1] = (crc>>16)&0xff;
-        data[length+2] = (crc>>8)&0xff;
-        data[length+3] = (crc)&0xff;
+static
+void dvb_dmx_memcopy (struct dvb_demux_feed *f, u8 *d, const u8 *s, size_t len)
+{
+	memcpy (d, s, len);
 }
-  
+
 
 /******************************************************************************
  * Software filter functions
  ******************************************************************************/
 
-static inline int
-dvb_dmx_swfilter_payload(struct dvb_demux_feed *dvbdmxfeed, const u8 *buf) 
+static inline
+int dvb_dmx_swfilter_payload (struct dvb_demux_feed *feed, const u8 *buf) 
 {
-        int p, count;
+	int count = payload(buf);
+	int p;
 	//int ccok;
 	//u8 cc;
 
-        if (!(count=payload(buf)))
-                return -1;
-        p=188-count;
-        /*
+	if (count == 0)
+		return -1;
+
+	p = 188-count;
+
+	/*
 	cc=buf[3]&0x0f;
-        ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0;
-        dvbdmxfeed->cc=cc;
-        if (!ccok)
-          printk("missed packet!\n");
-        */
-        if (buf[1]&0x40)  // PUSI ?
-                dvbdmxfeed->peslen=0xfffa;
-        dvbdmxfeed->peslen+=count;
-
-        return dvbdmxfeed->cb.ts((u8 *)&buf[p], count, 0, 0, 
-                                 &dvbdmxfeed->feed.ts, DMX_OK); 
+	ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0;
+	dvbdmxfeed->cc=cc;
+	if (!ccok)
+		printk("missed packet!\n");
+	*/
+
+	if (buf[1] & 0x40)  // PUSI ?
+		feed->peslen = 0xfffa;
+
+	feed->peslen += count;
+
+	return feed->cb.ts (&buf[p], count, 0, 0, &feed->feed.ts, DMX_OK); 
 }
 
 
-static int
-dvb_dmx_swfilter_sectionfilter(struct dvb_demux_feed *dvbdmxfeed, 
-                            struct dvb_demux_filter *f)
-{
-        dmx_section_filter_t *filter=&f->filter;
-        int i;
-	u8 xor, neq=0;
-
-        for (i=0; i<DVB_DEMUX_MASK_MAX; i++) {
-		xor=filter->filter_value[i]^dvbdmxfeed->secbuf[i];
-		if (f->maskandmode[i]&xor)
+static
+int dvb_dmx_swfilter_sectionfilter (struct dvb_demux_feed *feed, 
+				    struct dvb_demux_filter *f)
+{
+	u8 neq = 0;
+	int i;
+
+	for (i=0; i<DVB_DEMUX_MASK_MAX; i++) {
+		u8 xor = f->filter.filter_value[i] ^ feed->feed.sec.secbuf[i];
+
+		if (f->maskandmode[i] & xor)
 			return 0;
-		neq|=f->maskandnotmode[i]&xor;
+
+		neq |= f->maskandnotmode[i] & xor;
 	}
-	if (f->doneq && !neq)
+
+	if (f->doneq & !neq)
 		return 0;
 
-        return dvbdmxfeed->cb.sec(dvbdmxfeed->secbuf, dvbdmxfeed->seclen, 
-                                  0, 0, filter, DMX_OK); 
+	return feed->cb.sec (feed->feed.sec.secbuf, feed->feed.sec.seclen, 
+			     0, 0, &f->filter, DMX_OK); 
 }
 
-static inline int
-dvb_dmx_swfilter_section_feed(struct dvb_demux_feed *dvbdmxfeed)
+
+static inline
+int dvb_dmx_swfilter_section_feed (struct dvb_demux_feed *feed)
 {
-        u8 *buf=dvbdmxfeed->secbuf;
-        struct dvb_demux_filter *f;
+	struct dvb_demux *demux = feed->demux;
+	struct dvb_demux_filter *f = feed->filter;
+	dmx_section_feed_t *sec = &feed->feed.sec;
+	u8 *buf = sec->secbuf;
+
+	if (sec->secbufp != sec->seclen)
+		return -1;
+
+	if (!sec->is_filtering)
+		return 0;
+
+	if (!f)
+		return 0;
+
+	if (sec->check_crc && demux->check_crc32(feed, sec->secbuf, sec->seclen))
+		return -1;
 
-        if (dvbdmxfeed->secbufp!=dvbdmxfeed->seclen)
-                return -1;
-        if (!dvbdmxfeed->feed.sec.is_filtering)
-                return 0;
-        if (!(f=dvbdmxfeed->filter))
-                return 0;
-        do 
-                if (dvb_dmx_swfilter_sectionfilter(dvbdmxfeed, f)<0)
-                        return -1;
-        while ((f=f->next) && dvbdmxfeed->feed.sec.is_filtering);
+	do {
+		if (dvb_dmx_swfilter_sectionfilter(feed, f) < 0)
+			return -1;
+	} while ((f = f->next) && sec->is_filtering);
+
+	sec->secbufp = sec->seclen = 0;
 
-        dvbdmxfeed->secbufp=dvbdmxfeed->seclen=0;
-        memset(buf, 0, DVB_DEMUX_MASK_MAX);
-        return 0;
+	memset(buf, 0, DVB_DEMUX_MASK_MAX);
+ 
+	return 0;
 }
 
-static inline int
-dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *dvbdmxfeed, const u8 *buf) 
+
+static
+int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed, const u8 *buf) 
 {
-        int p, count;
-        int ccok, rest;
+	struct dvb_demux *demux = feed->demux;
+	dmx_section_feed_t *sec = &feed->feed.sec;
+	int p, count;
+	int ccok, rest;
 	u8 cc;
 
-        if (!(count=payload(buf)))
-                return -1;
-        p=188-count;
+	if (!(count = payload(buf)))
+		return -1;
 
-	cc=buf[3]&0x0f;
-        ccok=((dvbdmxfeed->cc+1)&0x0f)==cc ? 1 : 0;
-        dvbdmxfeed->cc=cc;
+	p = 188-count;
 
-        if (buf[1]&0x40) { // PUSI set
-                // offset to start of first section is in buf[p] 
+	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-dvbdmxfeed->secbufp;
-                        if (tmp>0 && tmp!=3) {
-				if (p+tmp>=187)
+
+		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;
-                                memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp,
-                                       buf+p+1, tmp);
-                                dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf);
-				if (dvbdmxfeed->seclen>4096) 
+
+				demux->memcopy (feed, sec->secbuf+sec->secbufp,
+					       buf+p+1, tmp);
+
+				sec->seclen = section_length(sec->secbuf);
+
+				if (sec->seclen > 4096) 
 					return -1;
-                        }
-                        rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp;
-                        if (rest==buf[p] && dvbdmxfeed->seclen) {
-                                memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp,
-                                       buf+p+1, buf[p]);
-                                dvbdmxfeed->secbufp+=buf[p];
-                                dvb_dmx_swfilter_section_feed(dvbdmxfeed);
-                        }
-                }
-                p+=buf[p]+1; 		// skip rest of last section
-                count=188-p;
-                while (count>0) {
-                        if ((count>2) &&  // enough data to determine sec length?
-                            ((dvbdmxfeed->seclen=section_length(buf+p))<=count)) {
-				if (dvbdmxfeed->seclen>4096) 
+			}
+
+			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;
+
+		while (count) {
+
+			sec->crc_val = ~0;
+
+			if ((count>2) && // enough data to determine sec length?
+			    ((sec->seclen = section_length(buf+p)) <= count)) {
+				if (sec->seclen>4096) 
 					return -1;
-                                memcpy(dvbdmxfeed->secbuf, buf+p, 
-                                       dvbdmxfeed->seclen);
-                                dvbdmxfeed->secbufp=dvbdmxfeed->seclen;
-                                p+=dvbdmxfeed->seclen;
-                                count=188-p;
-                                dvb_dmx_swfilter_section_feed(dvbdmxfeed);
-
-                                // filling bytes until packet end?
-                                if (count && buf[p]==0xff) 
-                                        count=0;
-                        } else { // section continues to following TS packet
-                                memcpy(dvbdmxfeed->secbuf, buf+p, count);
-                                dvbdmxfeed->secbufp+=count;
-                                count=0;
-                        }
-                }
+
+				demux->memcopy (feed, sec->secbuf, buf+p,
+					       sec->seclen);
+
+				sec->secbufp = sec->seclen;
+				p += sec->seclen;
+				count = 188 - p;
+
+				dvb_dmx_swfilter_section_feed(feed);
+
+				// filling bytes until packet end?
+				if (count && buf[p]==0xff) 
+					count=0;
+
+			} else { // section continues to following TS packet
+				demux->memcopy(feed, sec->secbuf, buf+p, count);
+				sec->secbufp+=count;
+				count=0;
+			}
+		}
+
 		return 0;
 	}
 
 	// section continued below
 	if (!ccok)
 		return -1;
-	if (!dvbdmxfeed->secbufp) // any data in last ts packet?
+
+	if (!sec->secbufp) // any data in last ts packet?
 		return -1;
+
 	// did we have enough data in last packet to calc section length?
-	if (dvbdmxfeed->secbufp<3) {
-		int tmp=3-dvbdmxfeed->secbufp;
+	if (sec->secbufp < 3) {
+		int tmp = 3 - sec->secbufp;
 		
 		if (tmp>count)
 			return -1;
-		memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, tmp);
-		dvbdmxfeed->seclen=section_length(dvbdmxfeed->secbuf);
-		if (dvbdmxfeed->seclen>4096) 
+
+		sec->crc_val = ~0;
+
+		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, tmp);
+
+		sec->seclen = section_length(sec->secbuf);
+
+		if (sec->seclen > 4096) 
 			return -1;
 	}
-	rest=dvbdmxfeed->seclen-dvbdmxfeed->secbufp;
-	if (rest<0)
+
+	rest = sec->seclen - sec->secbufp;
+
+	if (rest < 0)
 		return -1;
-	if (rest<=count) {	// section completed in this TS packet
-		memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, rest);
-		dvbdmxfeed->secbufp+=rest;
-		dvb_dmx_swfilter_section_feed(dvbdmxfeed);
+
+	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
-		memcpy(dvbdmxfeed->secbuf+dvbdmxfeed->secbufp, buf+p, count);
-		dvbdmxfeed->secbufp+=count;
+		demux->memcopy (feed, sec->secbuf + sec->secbufp, buf+p, count);
+		sec->secbufp += count;
 	}
-        return 0;
+
+	return 0;
 }
 
-static inline void 
-dvb_dmx_swfilter_packet_type(struct dvb_demux_feed *dvbdmxfeed, const u8 *buf)
+
+static inline
+void dvb_dmx_swfilter_packet_type(struct dvb_demux_feed *feed, const u8 *buf)
 {
-        switch(dvbdmxfeed->type) {
-        case DMX_TYPE_TS:
-                if (!dvbdmxfeed->feed.ts.is_filtering)
-                        break;
-                if (dvbdmxfeed->ts_type & TS_PACKET) {
-                        if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)
-                                dvb_dmx_swfilter_payload(dvbdmxfeed, buf);
-                        else
-                                dvbdmxfeed->cb.ts((u8 *)buf, 188, 0, 0, 
-                                                  &dvbdmxfeed->feed.ts, DMX_OK); 
-                }
-                if (dvbdmxfeed->ts_type & TS_DECODER) 
-                        if (dvbdmxfeed->demux->write_to_decoder)
-                                dvbdmxfeed->demux->
-                                  write_to_decoder(dvbdmxfeed, (u8 *)buf, 188);
-                break;
-
-        case DMX_TYPE_SEC:
-                if (!dvbdmxfeed->feed.sec.is_filtering)
-                        break;
-                if (dvb_dmx_swfilter_section_packet(dvbdmxfeed, buf)<0)
-                        dvbdmxfeed->seclen=dvbdmxfeed->secbufp=0;
-                break;
-
-        default:
-                break;
-        }
-}
-
-void
-dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf)
-{
-        struct dvb_demux_feed *dvbdmxfeed;
-
-        if (!(dvbdmxfeed=dvbdmx->pid2feed[ts_pid(buf)]))
-                return;
-        dvb_dmx_swfilter_packet_type(dvbdmxfeed, buf);
-}
-
-void
-dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, int count)
-{
-        struct dvb_demux_feed *dvbdmxfeed;
-
-	spin_lock(&dvbdmx->lock);
-	if ((dvbdmxfeed=dvbdmx->pid2feed[0x2000]))
-		dvbdmxfeed->cb.ts((u8 *)buf, count*188, 0, 0, 
-				  &dvbdmxfeed->feed.ts, DMX_OK); 
-        while (count) {
-		dvb_dmx_swfilter_packet(dvbdmx, buf);
-		count--;
-		buf+=188;
-	}
-	spin_unlock(&dvbdmx->lock);
-}
-
-static inline void
-dvb_dmx_swfilter(struct dvb_demux *dvbdmx, const u8 *buf, size_t count)
-{
-        int p=0,i, j;
-        
-        if ((i=dvbdmx->tsbufp)) {
-                if (count<(j=188-i)) {
-                        memcpy(&dvbdmx->tsbuf[i], buf, count);
-                        dvbdmx->tsbufp+=count;
-                        return;
-                }
-                memcpy(&dvbdmx->tsbuf[i], buf, j);
-                dvb_dmx_swfilter_packet(dvbdmx, dvbdmx->tsbuf);
-                dvbdmx->tsbufp=0;
-                p+=j;
-        }
-        
-        while (p<count) {
-                if (buf[p]==0x47) {
-                        if (count-p>=188) {
-                                dvb_dmx_swfilter_packet(dvbdmx, buf+p);
-                                p+=188;
-                        } else {
-                                i=count-p;
-                                memcpy(dvbdmx->tsbuf, buf+p, i);
-                                dvbdmx->tsbufp=i;
-				return;
-                        }
-                } else 
-                        p++;
-        }
-}
+	switch(feed->type) {
+	case DMX_TYPE_TS:
+		if (!feed->feed.ts.is_filtering)
+			break;
+		if (feed->ts_type & TS_PACKET) {
+			if (feed->ts_type & TS_PAYLOAD_ONLY)
+				dvb_dmx_swfilter_payload(feed, buf);
+			else
+				feed->cb.ts(buf, 188, 0, 0, &feed->feed.ts, DMX_OK); 
+		}
+		if (feed->ts_type & TS_DECODER) 
+			if (feed->demux->write_to_decoder)
+				feed->demux->write_to_decoder(feed, buf, 188);
+		break;
 
+	case DMX_TYPE_SEC:
+		if (!feed->feed.sec.is_filtering)
+			break;
+		if (dvb_dmx_swfilter_section_packet(feed, buf) < 0)
+			feed->feed.sec.seclen = feed->feed.sec.secbufp=0;
+		break;
+
+	default:
+		break;
+	}
+}
 
-/******************************************************************************
- ******************************************************************************
- * DVB DEMUX API LEVEL FUNCTIONS
- ******************************************************************************
- ******************************************************************************/
 
-static struct dvb_demux_filter *
-dvb_dmx_filter_alloc(struct dvb_demux *dvbdmx)
+void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf)
 {
-        int i;
+	struct dvb_demux_feed *feed;
+	struct list_head *pos, *head=&demux->feed_list;
+	u16 pid = ts_pid(buf);
 
-        for (i=0; i<dvbdmx->filternum; i++)
-                if (dvbdmx->filter[i].state==DMX_STATE_FREE)
-                        break;
-        if (i==dvbdmx->filternum)
-                return 0;
-        dvbdmx->filter[i].state=DMX_STATE_ALLOCATED;
-        return &dvbdmx->filter[i];
-}
-
-static struct dvb_demux_feed *
-dvb_dmx_feed_alloc(struct dvb_demux *dvbdmx)
-{
-        int i;
-
-        for (i=0; i<dvbdmx->feednum; i++)
-                if (dvbdmx->feed[i].state==DMX_STATE_FREE)
-                        break;
-        if (i==dvbdmx->feednum)
-                return 0;
-        dvbdmx->feed[i].state=DMX_STATE_ALLOCATED;
-        return &dvbdmx->feed[i];
+	list_for_each(pos, head) {
+		feed = list_entry(pos, struct dvb_demux_feed, list_head);
+		if (feed->pid == pid)
+			dvb_dmx_swfilter_packet_type (feed, buf);
+		if (feed->pid == 0x2000)
+			feed->cb.ts(buf, 188, 0, 0, &feed->feed.ts, DMX_OK);
+	}
 }
 
 
-/******************************************************************************
- * dmx_ts_feed API calls
- ******************************************************************************/
+void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t count)
+{
+	spin_lock(&demux->lock);
 
-static int 
-dmx_pid_set(u16 pid, struct dvb_demux_feed *dvbdmxfeed)
+	while (count--) {
+		dvb_dmx_swfilter_packet(demux, buf);
+		buf += 188;
+	}
+
+	spin_unlock(&demux->lock);
+}
+
+
+void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count)
 {
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-	struct dvb_demux_feed **pid2feed=dvbdmx->pid2feed;
+	int p = 0,i, j;
+	
+	if ((i = demux->tsbufp)) {
+		if (count < (j=188-i)) {
+			memcpy(&demux->tsbuf[i], buf, count);
+			demux->tsbufp += count;
+			return;
+		}
+		memcpy(&demux->tsbuf[i], buf, j);
+		dvb_dmx_swfilter_packet(demux, demux->tsbuf);
+		demux->tsbufp = 0;
+		p += j;
+	}
 
-	if (pid>DMX_MAX_PID)
-                return -EINVAL;
-        if (dvbdmxfeed->pid!=0xffff) {
-                if (dvbdmxfeed->pid<=DMX_MAX_PID)
-                        pid2feed[dvbdmxfeed->pid]=0;
-                dvbdmxfeed->pid=0xffff;
-        }
-        if (pid2feed[pid]) {
-                return -EBUSY;
+	while (p < count) {
+		if (buf[p] == 0x47) {
+			if (count-p >= 188) {
+				dvb_dmx_swfilter_packet(demux, buf+p);
+				p += 188;
+			} else {
+				i = count-p;
+				memcpy(demux->tsbuf, buf+p, i);
+				demux->tsbufp=i;
+				return;
+			}
+		} else 
+			p++;
 	}
-        pid2feed[pid]=dvbdmxfeed;
-        dvbdmxfeed->pid=pid;
+}
+
+
+static
+struct dvb_demux_filter* dvb_dmx_filter_alloc(struct dvb_demux *demux)
+{
+	int i;
+
+	for (i=0; i<demux->filternum; i++)
+		if (demux->filter[i].state == DMX_STATE_FREE)
+			break;
+
+	if (i == demux->filternum)
+		return NULL;
+
+	demux->filter[i].state = DMX_STATE_ALLOCATED;
+
+	return &demux->filter[i];
+}
+
+static
+struct dvb_demux_feed* dvb_dmx_feed_alloc(struct dvb_demux *demux)
+{
+	int i;
+
+	for (i=0; i<demux->feednum; i++)
+		if (demux->feed[i].state == DMX_STATE_FREE)
+			break;
+
+	if (i == demux->feednum)
+		return NULL;
+
+	demux->feed[i].state = DMX_STATE_ALLOCATED;
+
+	return &demux->feed[i];
+}
+
+
+static
+int dmx_pid_set (u16 pid, struct dvb_demux_feed *feed)
+{
+	struct dvb_demux *demux = feed->demux;
+	struct list_head *pos, *n, *head=&demux->feed_list;
+
+	if (pid > DMX_MAX_PID)
+		return -EINVAL;
+
+	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;
+			}
+
+	list_add(&feed->list_head, head);
+	feed->pid = pid;
+
 	return 0;
 }
 
 
-static int 
-dmx_ts_feed_set(struct dmx_ts_feed_s* feed,
-                u16 pid,
-		int ts_type, 
-		dmx_ts_pes_t pes_type,
-		size_t callback_length, 
-                size_t circular_buffer_size, 
-                int descramble, 
-                struct timespec timeout
-                )
+static
+int dmx_ts_feed_set (struct dmx_ts_feed_s* ts_feed, u16 pid, int ts_type, 
+		     dmx_ts_pes_t pes_type, size_t callback_length, 
+		     size_t circular_buffer_size, int descramble, 
+		     struct timespec timeout)
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+	struct dvb_demux_feed *feed = (struct dvb_demux_feed *) ts_feed;
+	struct dvb_demux *demux = feed->demux;
 	int ret;
 	
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&demux->mutex))
 		return -ERESTARTSYS;
 
 	if (ts_type & TS_DECODER) {
-                if (pes_type >= DMX_TS_PES_OTHER) {
-			up(&dvbdmx->mutex);
-                        return -EINVAL;
+		if (pes_type >= DMX_TS_PES_OTHER) {
+			up(&demux->mutex);
+			return -EINVAL;
 		}
-                if (dvbdmx->pesfilter[pes_type] && 
-                    (dvbdmx->pesfilter[pes_type]!=dvbdmxfeed)) {
-			up(&dvbdmx->mutex);
-                        return -EINVAL;
+
+		if (demux->pesfilter[pes_type] && 
+		    demux->pesfilter[pes_type] != feed) {
+			up(&demux->mutex);
+			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, dvbdmxfeed))<0) {
-				up(&dvbdmx->mutex);
+			if ((ret = dmx_pid_set(pid, feed))<0) {
+				up(&demux->mutex);
 				return ret;
-			} else
-				dvbdmxfeed->pid=pid;
-		}
-                dvbdmx->pesfilter[pes_type]=dvbdmxfeed;
-	        dvbdmx->pids[pes_type]=dvbdmxfeed->pid;
-        } else
-		if ((ret=dmx_pid_set(pid, dvbdmxfeed))<0) {
-			up(&dvbdmx->mutex);
+			}
+		} 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;
 		}
+	}
 
-        dvbdmxfeed->buffer_size=circular_buffer_size;
-        dvbdmxfeed->descramble=descramble;
-        dvbdmxfeed->timeout=timeout;
-        dvbdmxfeed->cb_length=callback_length;
-        dvbdmxfeed->ts_type=ts_type;
-        dvbdmxfeed->pes_type=pes_type;
-
-        if (dvbdmxfeed->descramble) {
-		up(&dvbdmx->mutex);
-                return -ENOSYS;
+	feed->buffer_size = circular_buffer_size;
+	feed->descramble = descramble;
+	feed->timeout = timeout;
+	feed->cb_length = callback_length;
+	feed->ts_type = ts_type;
+	feed->pes_type = pes_type;
+
+	if (feed->descramble) {
+		up(&demux->mutex);
+		return -ENOSYS;
 	}
 
-        if (dvbdmxfeed->buffer_size) {
+	if (feed->buffer_size) {
 #ifdef NOBUFS
-                dvbdmxfeed->buffer=0;
+		feed->buffer=0;
 #else
-                dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size);
-                if (!dvbdmxfeed->buffer) {
-			up(&dvbdmx->mutex);
+		feed->buffer = vmalloc(feed->buffer_size);
+		if (!feed->buffer) {
+			up(&demux->mutex);
 			return -ENOMEM;
 		}
 #endif
-        }
-        dvbdmxfeed->state=DMX_STATE_READY;
-        up(&dvbdmx->mutex);
-        return 0;
+	}
+	
+	feed->state = DMX_STATE_READY;
+	up(&demux->mutex);
+
+	return 0;
 }
 
-static int 
-dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* feed)
+
+static
+int dmx_ts_feed_start_filtering(struct dmx_ts_feed_s* ts_feed)
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+	struct dvb_demux_feed *feed = (struct dvb_demux_feed *) ts_feed;
+	struct dvb_demux *demux = feed->demux;
 	int ret;
 
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&demux->mutex))
 		return -ERESTARTSYS;
 
-        if (dvbdmxfeed->state!=DMX_STATE_READY ||
-	    dvbdmxfeed->type!=DMX_TYPE_TS) {
-		up(&dvbdmx->mutex);
-                return -EINVAL;
+	if (feed->state != DMX_STATE_READY || feed->type != DMX_TYPE_TS) {
+		up(&demux->mutex);
+		return -EINVAL;
 	}
-        if (!dvbdmx->start_feed) {
-		up(&dvbdmx->mutex);
-                return -1;
+
+	if (!demux->start_feed) {
+		up(&demux->mutex);
+		return -ENODEV;
 	}
-        ret=dvbdmx->start_feed(dvbdmxfeed); 
-        if (ret<0) {
-		up(&dvbdmx->mutex);
+
+	if ((ret = demux->start_feed(feed)) < 0) {
+		up(&demux->mutex);
 		return ret;
 	}
-	spin_lock_irq(&dvbdmx->lock);
-        feed->is_filtering=1;
-        dvbdmxfeed->state=DMX_STATE_GO;
-	spin_unlock_irq(&dvbdmx->lock);
-        up(&dvbdmx->mutex);
+
+	spin_lock_irq(&demux->lock);
+	ts_feed->is_filtering = 1;
+	feed->state = DMX_STATE_GO;
+	spin_unlock_irq(&demux->lock);
+	up(&demux->mutex);
+
 	return 0;
 }
  
-static int 
-dmx_ts_feed_stop_filtering(struct dmx_ts_feed_s* feed)
+static
+int dmx_ts_feed_stop_filtering(struct dmx_ts_feed_s* ts_feed)
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+	struct dvb_demux_feed *feed = (struct dvb_demux_feed *) ts_feed;
+	struct dvb_demux *demux = feed->demux;
 	int ret;
 
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&demux->mutex))
 		return -ERESTARTSYS;
 
-        if (dvbdmxfeed->state<DMX_STATE_GO) {
-		up(&dvbdmx->mutex);
-                return -EINVAL;
+	if (feed->state<DMX_STATE_GO) {
+		up(&demux->mutex);
+		return -EINVAL;
 	}
-        if (!dvbdmx->stop_feed) {
-		up(&dvbdmx->mutex);
-                return -1;
+
+	if (!demux->stop_feed) {
+		up(&demux->mutex);
+		return -ENODEV;
 	}
-        ret=dvbdmx->stop_feed(dvbdmxfeed); 
-	spin_lock_irq(&dvbdmx->lock);
-        feed->is_filtering=0;
-        dvbdmxfeed->state=DMX_STATE_ALLOCATED;
 
-	spin_unlock_irq(&dvbdmx->lock);
-        up(&dvbdmx->mutex);
-        return ret;
+	ret = demux->stop_feed(feed); 
+
+	spin_lock_irq(&demux->lock);
+	ts_feed->is_filtering = 0;
+	feed->state = DMX_STATE_ALLOCATED;
+	spin_unlock_irq(&demux->lock);
+	up(&demux->mutex);
+
+	return ret;
 }
 
-static int dvbdmx_allocate_ts_feed(dmx_demux_t *demux,
-                                   dmx_ts_feed_t **feed, 
-                                   dmx_ts_cb callback)
+static
+int dvbdmx_allocate_ts_feed (dmx_demux_t *dmx, dmx_ts_feed_t **ts_feed, 
+			     dmx_ts_cb callback)
 {
-        struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
-        struct dvb_demux_feed *dvbdmxfeed;
+	struct dvb_demux *demux = (struct dvb_demux *) dmx;
+	struct dvb_demux_feed *feed;
 
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&demux->mutex))
 		return -ERESTARTSYS;
 
-        if (!(dvbdmxfeed=dvb_dmx_feed_alloc(dvbdmx))) {
-		up(&dvbdmx->mutex);
-                return -EBUSY;
+	if (!(feed = dvb_dmx_feed_alloc(demux))) {
+		up(&demux->mutex);
+		return -EBUSY;
 	}
-        dvbdmxfeed->type=DMX_TYPE_TS;
-        dvbdmxfeed->cb.ts=callback;
-        dvbdmxfeed->demux=dvbdmx;
-        dvbdmxfeed->pid=0xffff;
-        dvbdmxfeed->peslen=0xfffa;
-        dvbdmxfeed->buffer=0;
-
-        (*feed)=&dvbdmxfeed->feed.ts;
-        (*feed)->is_filtering=0;
-        (*feed)->parent=demux;
-        (*feed)->priv=0;
-        (*feed)->set=dmx_ts_feed_set;
-        (*feed)->start_filtering=dmx_ts_feed_start_filtering;
-        (*feed)->stop_filtering=dmx_ts_feed_stop_filtering;
 
+	feed->type = DMX_TYPE_TS;
+	feed->cb.ts = callback;
+	feed->demux = demux;
+	feed->pid = 0xffff;
+	feed->peslen = 0xfffa;
+	feed->buffer = 0;
+
+	(*ts_feed) = &feed->feed.ts;
+	(*ts_feed)->is_filtering = 0;
+	(*ts_feed)->parent = dmx;
+	(*ts_feed)->priv = 0;
+	(*ts_feed)->set = dmx_ts_feed_set;
+	(*ts_feed)->start_filtering = dmx_ts_feed_start_filtering;
+	(*ts_feed)->stop_filtering = dmx_ts_feed_stop_filtering;
+
+
+	if (!(feed->filter = dvb_dmx_filter_alloc(demux))) {
+		feed->state = DMX_STATE_FREE;
+		up(&demux->mutex);
+		return -EBUSY;
+	}
 
-        if (!(dvbdmxfeed->filter=dvb_dmx_filter_alloc(dvbdmx))) {
-                dvbdmxfeed->state=DMX_STATE_FREE;
-		up(&dvbdmx->mutex);
-                return -EBUSY;
-        }
+	feed->filter->type = DMX_TYPE_TS;
+	feed->filter->feed = feed;
+	feed->filter->state = DMX_STATE_READY;
+	
+	up(&demux->mutex);
 
-        dvbdmxfeed->filter->type=DMX_TYPE_TS;
-        dvbdmxfeed->filter->feed=dvbdmxfeed;
-        dvbdmxfeed->filter->state=DMX_STATE_READY;
-        
-        up(&dvbdmx->mutex);
-        return 0;
+	return 0;
 }
 
-static int dvbdmx_release_ts_feed(dmx_demux_t *demux, dmx_ts_feed_t *feed)
+static
+int dvbdmx_release_ts_feed(dmx_demux_t *dmx, dmx_ts_feed_t *ts_feed)
 {
-        struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
+	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 (&dvbdmx->mutex))
+	if (down_interruptible (&demux->mutex))
 		return -ERESTARTSYS;
 
-        if (dvbdmxfeed->state==DMX_STATE_FREE) {
-		up(&dvbdmx->mutex);
-                return -EINVAL;
+	if (feed->state == DMX_STATE_FREE) {
+		up(&demux->mutex);
+		return -EINVAL;
 	}
+
 #ifndef NOBUFS
-        if (dvbdmxfeed->buffer) { 
-                vfree(dvbdmxfeed->buffer);
-                dvbdmxfeed->buffer=0;
-        }
+	if (feed->buffer) { 
+		vfree(feed->buffer);
+		feed->buffer=0;
+	}
 #endif
-        dvbdmxfeed->state=DMX_STATE_FREE;
-        dvbdmxfeed->filter->state=DMX_STATE_FREE;
-	if (dvbdmxfeed->pid<=DMX_MAX_PID) {
-		dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0;
-                dvbdmxfeed->pid=0xffff;
-        }
 
-        up(&dvbdmx->mutex);
-        return 0;
+	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;
+			}
+		feed->pid = 0xffff;
+	}
+	
+	if (feed->ts_type & TS_DECODER)
+		demux->pesfilter[feed->pes_type] = NULL;
+
+	up(&demux->mutex);
+	return 0;
 }
 
 
@@ -713,92 +755,92 @@
 
 static int 
 dmx_section_feed_allocate_filter(struct dmx_section_feed_s* feed, 
-                                 dmx_section_filter_t** filter) 
+				 dmx_section_filter_t** filter) 
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdemux=dvbdmxfeed->demux;
-        struct dvb_demux_filter *dvbdmxfilter;
+	struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
+	struct dvb_demux *dvbdemux=dvbdmxfeed->demux;
+	struct dvb_demux_filter *dvbdmxfilter;
 
 	if (down_interruptible (&dvbdemux->mutex))
 		return -ERESTARTSYS;
 
-        dvbdmxfilter=dvb_dmx_filter_alloc(dvbdemux);
-        if (!dvbdmxfilter) {
+	dvbdmxfilter=dvb_dmx_filter_alloc(dvbdemux);
+	if (!dvbdmxfilter) {
 		up(&dvbdemux->mutex);
-                return -ENOSPC;
+		return -ENOSPC;
 	}
 	spin_lock_irq(&dvbdemux->lock);
-        *filter=&dvbdmxfilter->filter;
-        (*filter)->parent=feed;
-        (*filter)->priv=0;
-        dvbdmxfilter->feed=dvbdmxfeed;
-        dvbdmxfilter->type=DMX_TYPE_SEC;
-        dvbdmxfilter->state=DMX_STATE_READY;
+	*filter=&dvbdmxfilter->filter;
+	(*filter)->parent=feed;
+	(*filter)->priv=0;
+	dvbdmxfilter->feed=dvbdmxfeed;
+	dvbdmxfilter->type=DMX_TYPE_SEC;
+	dvbdmxfilter->state=DMX_STATE_READY;
 
-        dvbdmxfilter->next=dvbdmxfeed->filter;
-        dvbdmxfeed->filter=dvbdmxfilter;
+	dvbdmxfilter->next=dvbdmxfeed->filter;
+	dvbdmxfeed->filter=dvbdmxfilter;
 	spin_unlock_irq(&dvbdemux->lock);
-        up(&dvbdemux->mutex);
-        return 0;
+	up(&dvbdemux->mutex);
+	return 0;
 }
 
 static int 
 dmx_section_feed_set(struct dmx_section_feed_s* feed, 
-                     u16 pid, size_t circular_buffer_size, 
-                     int descramble, int check_crc) 
+		     u16 pid, size_t circular_buffer_size, 
+		     int descramble, int check_crc) 
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+	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;
+	if (pid>0x1fff)
+		return -EINVAL;
 
 	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
 	
-        if (dvbdmxfeed->pid!=0xffff) {
-                dvbdmx->pid2feed[dvbdmxfeed->pid]=0;
-                dvbdmxfeed->pid=0xffff;
-        }
-        if (dvbdmx->pid2feed[pid]) {
-		up(&dvbdmx->mutex);
-		return -EBUSY;
-	}
-        dvbdmx->pid2feed[pid]=dvbdmxfeed;
-        dvbdmxfeed->pid=pid;
-
-        dvbdmxfeed->buffer_size=circular_buffer_size;
-        dvbdmxfeed->descramble=descramble;
-        if (dvbdmxfeed->descramble) {
+	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);
+	dvbdmxfeed->pid=pid;
+
+	dvbdmxfeed->buffer_size=circular_buffer_size;
+	dvbdmxfeed->descramble=descramble;
+	if (dvbdmxfeed->descramble) {
 		up(&dvbdmx->mutex);
-                return -ENOSYS;
+		return -ENOSYS;
 	}
 
-        dvbdmxfeed->check_crc=check_crc;
+	dvbdmxfeed->feed.sec.check_crc=check_crc;
 #ifdef NOBUFS
-        dvbdmxfeed->buffer=0;
+	dvbdmxfeed->buffer=0;
 #else
-        dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size);
-        if (!dvbdmxfeed->buffer) {
+	dvbdmxfeed->buffer=vmalloc(dvbdmxfeed->buffer_size);
+	if (!dvbdmxfeed->buffer) {
 		up(&dvbdmx->mutex);
 		return -ENOMEM;
 	}
 #endif
-        dvbdmxfeed->state=DMX_STATE_READY;
-        up(&dvbdmx->mutex);
-        return 0;
+	dvbdmxfeed->state=DMX_STATE_READY;
+	up(&dvbdmx->mutex);
+	return 0;
 }
 
 static void prepare_secfilters(struct dvb_demux_feed *dvbdmxfeed)
 {
 	int i;
-        dmx_section_filter_t *sf;
+	dmx_section_filter_t *sf;
 	struct dvb_demux_filter *f;
 	u8 mask, mode, doneq;
 		
 	if (!(f=dvbdmxfeed->filter))
-                return;
-        do {
+		return;
+	do {
 		sf=&f->filter;
 		doneq=0;
 		for (i=0; i<DVB_DEMUX_MASK_MAX; i++) {
@@ -815,159 +857,169 @@
 static int 
 dmx_section_feed_start_filtering(dmx_section_feed_t *feed)
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+	struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
+	struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
 	int ret;
 
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
 	
-        if (feed->is_filtering) {
+	if (feed->is_filtering) {
 		up(&dvbdmx->mutex);
 		return -EBUSY;
 	}
-        if (!dvbdmxfeed->filter) {
+	if (!dvbdmxfeed->filter) {
 		up(&dvbdmx->mutex);
-                return -EINVAL;
+		return -EINVAL;
 	}
-        dvbdmxfeed->secbufp=0;
-        dvbdmxfeed->seclen=0;
-        
-        if (!dvbdmx->start_feed) {
+	dvbdmxfeed->feed.sec.secbufp=0;
+	dvbdmxfeed->feed.sec.seclen=0;
+	
+	if (!dvbdmx->start_feed) {
 		up(&dvbdmx->mutex);
-                return -1;
+		return -ENODEV;
 	}
+
 	prepare_secfilters(dvbdmxfeed);
-        ret=dvbdmx->start_feed(dvbdmxfeed); 
-	if (ret<0) {
+
+	if ((ret = dvbdmx->start_feed(dvbdmxfeed)) < 0) {
 		up(&dvbdmx->mutex);
 		return ret;
 	}
+
 	spin_lock_irq(&dvbdmx->lock);
-        feed->is_filtering=1;
-        dvbdmxfeed->state=DMX_STATE_GO;
+	feed->is_filtering=1;
+	dvbdmxfeed->state=DMX_STATE_GO;
 	spin_unlock_irq(&dvbdmx->lock);
-        up(&dvbdmx->mutex);
+	up(&dvbdmx->mutex);
 	return 0;
 }
 
 static int 
 dmx_section_feed_stop_filtering(struct dmx_section_feed_s* feed)
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
-        int ret;
+	struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
+	struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+	int ret;
 
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
 
-        if (!dvbdmx->stop_feed) {
+	if (!dvbdmx->stop_feed) {
 		up(&dvbdmx->mutex);
-                return -1;
+		return -ENODEV;
 	}
 	ret=dvbdmx->stop_feed(dvbdmxfeed); 
 	spin_lock_irq(&dvbdmx->lock);
-        dvbdmxfeed->state=DMX_STATE_READY;
-        feed->is_filtering=0;
+	dvbdmxfeed->state=DMX_STATE_READY;
+	feed->is_filtering=0;
 	spin_unlock_irq(&dvbdmx->lock);
-        up(&dvbdmx->mutex);
+	up(&dvbdmx->mutex);
 	return ret;
 }
 
 static int 
 dmx_section_feed_release_filter(dmx_section_feed_t *feed, 
-                                dmx_section_filter_t* filter)
+				dmx_section_filter_t* filter)
 {
-        struct dvb_demux_filter *dvbdmxfilter=(struct dvb_demux_filter *) filter, *f;
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+	struct dvb_demux_filter *dvbdmxfilter=(struct dvb_demux_filter *) filter, *f;
+	struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
+	struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
 
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
 
-        if (dvbdmxfilter->feed!=dvbdmxfeed) {
+	if (dvbdmxfilter->feed!=dvbdmxfeed) {
 		up(&dvbdmx->mutex);
-                return -EINVAL;
+		return -EINVAL;
 	}
-        if (feed->is_filtering) 
-                feed->stop_filtering(feed);
+	if (feed->is_filtering) 
+		feed->stop_filtering(feed);
 	
 	spin_lock_irq(&dvbdmx->lock);
-        f=dvbdmxfeed->filter;
-        if (f==dvbdmxfilter)
-                dvbdmxfeed->filter=dvbdmxfilter->next;
-        else {
-                while(f->next!=dvbdmxfilter)
-                        f=f->next;
-                f->next=f->next->next;
-        }
-        dvbdmxfilter->state=DMX_STATE_FREE;
+	f=dvbdmxfeed->filter;
+	if (f==dvbdmxfilter)
+		dvbdmxfeed->filter=dvbdmxfilter->next;
+	else {
+		while(f->next!=dvbdmxfilter)
+			f=f->next;
+		f->next=f->next->next;
+	}
+	dvbdmxfilter->state=DMX_STATE_FREE;
 	spin_unlock_irq(&dvbdmx->lock);
-        up(&dvbdmx->mutex);
-        return 0;
+	up(&dvbdmx->mutex);
+	return 0;
 }
 
 static int dvbdmx_allocate_section_feed(dmx_demux_t *demux, 
-                                        dmx_section_feed_t **feed,
-                                        dmx_section_cb callback)
+					dmx_section_feed_t **feed,
+					dmx_section_cb callback)
 {
-        struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
-        struct dvb_demux_feed *dvbdmxfeed;
+	struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
+	struct dvb_demux_feed *dvbdmxfeed;
 
-        if (down_interruptible (&dvbdmx->mutex))
+	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
 
-        if (!(dvbdmxfeed=dvb_dmx_feed_alloc(dvbdmx))) {
+	if (!(dvbdmxfeed=dvb_dmx_feed_alloc(dvbdmx))) {
 		up(&dvbdmx->mutex);
-                return -EBUSY;
+		return -EBUSY;
 	}
-        dvbdmxfeed->type=DMX_TYPE_SEC;
-        dvbdmxfeed->cb.sec=callback;
-        dvbdmxfeed->demux=dvbdmx;
-        dvbdmxfeed->pid=0xffff;
-        dvbdmxfeed->secbufp=0;
-        dvbdmxfeed->filter=0;
-        dvbdmxfeed->buffer=0;
-
-        (*feed)=&dvbdmxfeed->feed.sec;
-        (*feed)->is_filtering=0;
-        (*feed)->parent=demux;
-        (*feed)->priv=0;
-        (*feed)->set=dmx_section_feed_set;
-        (*feed)->allocate_filter=dmx_section_feed_allocate_filter;
-        (*feed)->release_filter=dmx_section_feed_release_filter;
-        (*feed)->start_filtering=dmx_section_feed_start_filtering;
-        (*feed)->stop_filtering=dmx_section_feed_stop_filtering;
+	dvbdmxfeed->type=DMX_TYPE_SEC;
+	dvbdmxfeed->cb.sec=callback;
+	dvbdmxfeed->demux=dvbdmx;
+	dvbdmxfeed->pid=0xffff;
+	dvbdmxfeed->feed.sec.secbufp=0;
+	dvbdmxfeed->filter=0;
+	dvbdmxfeed->buffer=0;
+
+	(*feed)=&dvbdmxfeed->feed.sec;
+	(*feed)->is_filtering=0;
+	(*feed)->parent=demux;
+	(*feed)->priv=0;
+	(*feed)->set=dmx_section_feed_set;
+	(*feed)->allocate_filter=dmx_section_feed_allocate_filter;
+	(*feed)->release_filter=dmx_section_feed_release_filter;
+	(*feed)->start_filtering=dmx_section_feed_start_filtering;
+	(*feed)->stop_filtering=dmx_section_feed_stop_filtering;
 
-        up(&dvbdmx->mutex);
-        return 0;
+	up(&dvbdmx->mutex);
+	return 0;
 }
 
 static int dvbdmx_release_section_feed(dmx_demux_t *demux, 
-                                       dmx_section_feed_t *feed)
+				       dmx_section_feed_t *feed)
 {
-        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) feed;
-        struct dvb_demux *dvbdmx=(struct dvb_demux *) demux;
+	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))
+	if (down_interruptible (&dvbdmx->mutex))
 		return -ERESTARTSYS;
 
-        if (dvbdmxfeed->state==DMX_STATE_FREE) {
+	if (dvbdmxfeed->state==DMX_STATE_FREE) {
 		up(&dvbdmx->mutex);
-                return -EINVAL;
+		return -EINVAL;
 	}
 #ifndef NOBUFS
-        if (dvbdmxfeed->buffer) {
-                vfree(dvbdmxfeed->buffer);
-                dvbdmxfeed->buffer=0;
-        }
+	if (dvbdmxfeed->buffer) {
+		vfree(dvbdmxfeed->buffer);
+		dvbdmxfeed->buffer=0;
+	}
 #endif
-        dvbdmxfeed->state=DMX_STATE_FREE;
-        dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0;
-        if (dvbdmxfeed->pid!=0xffff)
-                dvbdmxfeed->demux->pid2feed[dvbdmxfeed->pid]=0;
-        up(&dvbdmx->mutex);
-        return 0;
+	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;
+			}
+		dvbdmxfeed->pid = 0xffff;
+	}
+
+	up(&dvbdmx->mutex);
+	return 0;
 }
 
 
@@ -977,72 +1029,72 @@
 
 static int dvbdmx_open(dmx_demux_t *demux)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
 
-        if (dvbdemux->users>=MAX_DVB_DEMUX_USERS)
-                return -EUSERS;
-        dvbdemux->users++;
-        return 0;
+	if (dvbdemux->users>=MAX_DVB_DEMUX_USERS)
+		return -EUSERS;
+	dvbdemux->users++;
+	return 0;
 }
 
 static int dvbdmx_close(struct dmx_demux_s *demux)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
 
-        if (dvbdemux->users==0)
-                return -ENODEV;
-        dvbdemux->users--;
-        //FIXME: release any unneeded resources if users==0
-        return 0;
+	if (dvbdemux->users==0)
+		return -ENODEV;
+	dvbdemux->users--;
+	//FIXME: release any unneeded resources if users==0
+	return 0;
 }
 
 static int dvbdmx_write(dmx_demux_t *demux, const char *buf, size_t count)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
 
-        if ((!demux->frontend) ||
-            (demux->frontend->source!=DMX_MEMORY_FE))
-                return -EINVAL;
+	if ((!demux->frontend) ||
+	    (demux->frontend->source!=DMX_MEMORY_FE))
+		return -EINVAL;
 
-        if (down_interruptible (&dvbdemux->mutex))
+	if (down_interruptible (&dvbdemux->mutex))
 		return -ERESTARTSYS;
 
-        dvb_dmx_swfilter(dvbdemux, buf, count);
-        up(&dvbdemux->mutex);
-        return count;
+	dvb_dmx_swfilter(dvbdemux, buf, count);
+	up(&dvbdemux->mutex);
+	return count;
 }
 
 
 static int dvbdmx_add_frontend(dmx_demux_t *demux, 
-                               dmx_frontend_t *frontend)
+			       dmx_frontend_t *frontend)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
-        struct list_head *pos, *head=&dvbdemux->frontend_list;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct list_head *pos, *head=&dvbdemux->frontend_list;
 	
 	if (!(frontend->id && frontend->vendor && frontend->model)) 
-	        return -EINVAL;
+		return -EINVAL;
 	list_for_each(pos, head) 
 	{
-	        if (!strcmp(DMX_FE_ENTRY(pos)->id, frontend->id))
-		        return -EEXIST;
+		if (!strcmp(DMX_FE_ENTRY(pos)->id, frontend->id))
+			return -EEXIST;
 	}
 
 	list_add(&(frontend->connectivity_list), head);
-        return 0;
+	return 0;
 }
 
 static int 
 dvbdmx_remove_frontend(dmx_demux_t *demux, 
-                       dmx_frontend_t *frontend)
+		       dmx_frontend_t *frontend)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
-        struct list_head *pos, *n, *head=&dvbdemux->frontend_list;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct list_head *pos, *n, *head=&dvbdemux->frontend_list;
 
 	list_for_each_safe (pos, n, head) 
 	{
-	        if (DMX_FE_ENTRY(pos)==frontend) 
-                {
-		        list_del(pos);
+		if (DMX_FE_ENTRY(pos)==frontend) 
+		{
+			list_del(pos);
 			return 0;
 		}
 	}
@@ -1052,123 +1104,129 @@
 static struct list_head *
 dvbdmx_get_frontends(dmx_demux_t *demux)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
 
-        if (list_empty(&dvbdemux->frontend_list))
-	        return NULL;
-        return &dvbdemux->frontend_list;
+	if (list_empty(&dvbdemux->frontend_list))
+		return NULL;
+	return &dvbdemux->frontend_list;
 }
 
 static int dvbdmx_connect_frontend(dmx_demux_t *demux, 
-                                   dmx_frontend_t *frontend)
+				   dmx_frontend_t *frontend)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
 
-        if (demux->frontend)
-                return -EINVAL;
-        
-        if (down_interruptible (&dvbdemux->mutex))
+	if (demux->frontend)
+		return -EINVAL;
+	
+	if (down_interruptible (&dvbdemux->mutex))
 		return -ERESTARTSYS;
 
-        demux->frontend=frontend;
-        up(&dvbdemux->mutex);
-        return 0;
+	demux->frontend=frontend;
+	up(&dvbdemux->mutex);
+	return 0;
 }
 
 static int dvbdmx_disconnect_frontend(dmx_demux_t *demux)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
 
-        if (down_interruptible (&dvbdemux->mutex))
+	if (down_interruptible (&dvbdemux->mutex))
 		return -ERESTARTSYS;
 
-        demux->frontend=NULL;
-        up(&dvbdemux->mutex);
-        return 0;
+	demux->frontend=NULL;
+	up(&dvbdemux->mutex);
+	return 0;
 }
 
 static int dvbdmx_get_pes_pids(dmx_demux_t *demux, u16 *pids)
 {
-        struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
+	struct dvb_demux *dvbdemux=(struct dvb_demux *) demux;
 
-        memcpy(pids, dvbdemux->pids, 5*sizeof(u16));
-        return 0;
+	memcpy(pids, dvbdemux->pids, 5*sizeof(u16));
+	return 0;
 }
 
 int 
 dvb_dmx_init(struct dvb_demux *dvbdemux)
 {
-        int i;
-        dmx_demux_t *dmx=&dvbdemux->dmx;
+	int i;
+	dmx_demux_t *dmx=&dvbdemux->dmx;
 
-        dvbdemux->users=0;
+	dvbdemux->users=0;
 	dvbdemux->filter=vmalloc(dvbdemux->filternum*sizeof(struct dvb_demux_filter));
 	if (!dvbdemux->filter)
-                return -ENOMEM;
+		return -ENOMEM;
 
 	dvbdemux->feed=vmalloc(dvbdemux->feednum*sizeof(struct dvb_demux_feed));
 	if (!dvbdemux->feed) {
-	        vfree(dvbdemux->filter);
-                return -ENOMEM;
+		vfree(dvbdemux->filter);
+		return -ENOMEM;
 	}
-        for (i=0; i<dvbdemux->filternum; i++) {
-                dvbdemux->filter[i].state=DMX_STATE_FREE;
-                dvbdemux->filter[i].index=i;
-        }
-        for (i=0; i<dvbdemux->feednum; i++)
-                dvbdemux->feed[i].state=DMX_STATE_FREE;
-        dvbdemux->frontend_list.next=
-          dvbdemux->frontend_list.prev=
-            &dvbdemux->frontend_list;
-        for (i=0; i<DMX_TS_PES_OTHER; i++) {
-                dvbdemux->pesfilter[i]=NULL;
-                dvbdemux->pids[i]=0xffff;
-	}
-        dvbdemux->playing=dvbdemux->recording=0;
-        memset(dvbdemux->pid2feed, 0, (DMX_MAX_PID+1)*sizeof(struct dvb_demux_feed *));
-        dvbdemux->tsbufp=0;
-
-        dmx->frontend=0;
-        dmx->reg_list.next=dmx->reg_list.prev=&dmx->reg_list;
-        dmx->priv=(void *) dvbdemux;
-        //dmx->users=0;                  // reset in dmx_register_demux() 
-        dmx->open=dvbdmx_open;
-        dmx->close=dvbdmx_close;
-        dmx->write=dvbdmx_write;
-        dmx->allocate_ts_feed=dvbdmx_allocate_ts_feed;
-        dmx->release_ts_feed=dvbdmx_release_ts_feed;
-        dmx->allocate_section_feed=dvbdmx_allocate_section_feed;
-        dmx->release_section_feed=dvbdmx_release_section_feed;
-
-        dmx->descramble_mac_address=NULL;
-        dmx->descramble_section_payload=NULL;
-        
-        dmx->add_frontend=dvbdmx_add_frontend;
-        dmx->remove_frontend=dvbdmx_remove_frontend;
-        dmx->get_frontends=dvbdmx_get_frontends;
-        dmx->connect_frontend=dvbdmx_connect_frontend;
-        dmx->disconnect_frontend=dvbdmx_disconnect_frontend;
-        dmx->get_pes_pids=dvbdmx_get_pes_pids;
-        sema_init(&dvbdemux->mutex, 1);
+	for (i=0; i<dvbdemux->filternum; i++) {
+		dvbdemux->filter[i].state=DMX_STATE_FREE;
+		dvbdemux->filter[i].index=i;
+	}
+	for (i=0; i<dvbdemux->feednum; i++)
+		dvbdemux->feed[i].state=DMX_STATE_FREE;
+	dvbdemux->frontend_list.next=
+	  dvbdemux->frontend_list.prev=
+	    &dvbdemux->frontend_list;
+	for (i=0; i<DMX_TS_PES_OTHER; i++) {
+		dvbdemux->pesfilter[i]=NULL;
+		dvbdemux->pids[i]=0xffff;
+	}
+	dvbdemux->playing=dvbdemux->recording=0;
+	INIT_LIST_HEAD(&dvbdemux->feed_list);
+	dvbdemux->tsbufp=0;
+
+	if (!dvbdemux->check_crc32)
+		dvbdemux->check_crc32 = dvb_dmx_crc32;
+
+	 if (!dvbdemux->memcopy)
+		 dvbdemux->memcopy = dvb_dmx_memcopy;
+
+	dmx->frontend=0;
+	dmx->reg_list.next=dmx->reg_list.prev=&dmx->reg_list;
+	dmx->priv=(void *) dvbdemux;
+	//dmx->users=0;		  // reset in dmx_register_demux() 
+	dmx->open=dvbdmx_open;
+	dmx->close=dvbdmx_close;
+	dmx->write=dvbdmx_write;
+	dmx->allocate_ts_feed=dvbdmx_allocate_ts_feed;
+	dmx->release_ts_feed=dvbdmx_release_ts_feed;
+	dmx->allocate_section_feed=dvbdmx_allocate_section_feed;
+	dmx->release_section_feed=dvbdmx_release_section_feed;
+
+	dmx->descramble_mac_address=NULL;
+	dmx->descramble_section_payload=NULL;
+	
+	dmx->add_frontend=dvbdmx_add_frontend;
+	dmx->remove_frontend=dvbdmx_remove_frontend;
+	dmx->get_frontends=dvbdmx_get_frontends;
+	dmx->connect_frontend=dvbdmx_connect_frontend;
+	dmx->disconnect_frontend=dvbdmx_disconnect_frontend;
+	dmx->get_pes_pids=dvbdmx_get_pes_pids;
+	sema_init(&dvbdemux->mutex, 1);
 	spin_lock_init(&dvbdemux->lock);
 
-        if (dmx_register_demux(dmx)<0) 
-                return -1;
+	if (dmx_register_demux(dmx)<0) 
+		return -1;
 
-        return 0;
+	return 0;
 }
 
 int 
 dvb_dmx_release(struct dvb_demux *dvbdemux)
 {
-        dmx_demux_t *dmx=&dvbdemux->dmx;
+	dmx_demux_t *dmx=&dvbdemux->dmx;
 
-        dmx_unregister_demux(dmx);
+	dmx_unregister_demux(dmx);
 	if (dvbdemux->filter)
-                vfree(dvbdemux->filter);
+		vfree(dvbdemux->filter);
 	if (dvbdemux->feed)
-                vfree(dvbdemux->feed);
-        return 0;
+		vfree(dvbdemux->feed);
+	return 0;
 }
 
 #if 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	Sat Apr 19 19:51:46 2003
+++ b/drivers/media/dvb/dvb-core/dvb_demux.h	Sat Apr 19 19:51:46 2003
@@ -25,6 +25,9 @@
 #ifndef _DVB_DEMUX_H_
 #define _DVB_DEMUX_H_
 
+#include <asm/semaphore.h>
+#include <linux/timer.h>
+
 #include "demux.h"
 
 #define DMX_TYPE_TS  0
@@ -59,6 +62,8 @@
 };
 
 
+#define DMX_FEED_ENTRY(pos) list_entry(pos, struct dvb_demux_feed, list_head)
+
 struct dvb_demux_feed {
         union {
 	        dmx_ts_feed_t ts;
@@ -71,13 +76,13 @@
 	} cb;
 
         struct dvb_demux *demux;
+	void *priv;
         int type;
         int state;
         u16 pid;
         u8 *buffer;
         int buffer_size;
         int descramble;
-        int check_crc;
 
         struct timespec timeout; 
         struct dvb_demux_filter *filter;
@@ -86,12 +91,11 @@
         int ts_type;
         dmx_ts_pes_t pes_type;
 
-        u8 secbuf[4096];
-        int secbufp;
-        int seclen;
         int cc;
 
         u16 peslen;
+
+	struct list_head list_head;
 };
 
 struct dvb_demux {
@@ -99,10 +103,14 @@
         void *priv;
         int filternum;
         int feednum;
-        int (*start_feed)(struct dvb_demux_feed *);
-        int (*stop_feed)(struct dvb_demux_feed *);
-        int (*write_to_decoder)(struct dvb_demux_feed *, u8 *, size_t);
-
+        int (*start_feed) (struct dvb_demux_feed *feed);
+        int (*stop_feed) (struct dvb_demux_feed *feed);
+        int (*write_to_decoder) (struct dvb_demux_feed *feed,
+				 const u8 *buf, size_t len);
+	u32 (*check_crc32) (struct dvb_demux_feed *feed,
+			    const u8 *buf, size_t len);
+	void (*memcopy) (struct dvb_demux_feed *feed, u8 *dst,
+			 const u8 *src, size_t len);
   
         int users;
 #define MAX_DVB_DEMUX_USERS 10
@@ -117,7 +125,7 @@
         int recording; 
 
 #define DMX_MAX_PID 0x2000
-        struct dvb_demux_feed *pid2feed[DMX_MAX_PID+1];
+	struct list_head feed_list;
         u8 tsbuf[188];
         int tsbufp;
 
@@ -129,6 +137,7 @@
 int dvb_dmx_init(struct dvb_demux *dvbdemux);
 int dvb_dmx_release(struct dvb_demux *dvbdemux);
 void dvb_dmx_swfilter_packet(struct dvb_demux *dvbdmx, const u8 *buf);
-void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, int count);
+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);
 
 #endif /* _DVB_DEMUX_H_ */
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	Sat Apr 19 19:51:51 2003
+++ b/drivers/media/dvb/dvb-core/dvb_filter.c	Sat Apr 19 19:51:51 2003
@@ -1,5 +1,4 @@
 #include <linux/module.h>
-#include <linux/videodev.h>
 #include "dvb_filter.h"
 
 unsigned int bitrates[3][16] =
@@ -52,10 +51,10 @@
 	if (buf[1]&PAY_START) {
 		if (p->plength == MMAX_PLENGTH-6 && p->found>6){
 			p->plength = p->found-6;
-	p->found = 0;
+			p->found = 0;
 			send_ipack(p);
 			dvb_filter_ipack_reset(p);
-	}
+		}
 	}
 	if (buf[3] & ADAPT_FIELD) {  // adaptation field?
 		off = buf[4] + 1;
@@ -71,12 +70,12 @@
 int read_picture_header(uint8_t *headr, mpg_picture *pic, int field, int pr)
 {
 	uint8_t pct;
-			
+
 	if (pr) printk( "Pic header: ");
         pic->temporal_reference[field] = (( headr[0] << 2 ) | 
 					  (headr[1] & 0x03) )& 0x03ff;
 	if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
-					
+
 	pct = ( headr[1] >> 2 ) & 0x07;
         pic->picture_coding_type[field] = pct;
 	if (pr) {
@@ -90,26 +89,26 @@
 			case P_FRAME:
 				printk( "  P-FRAME");
 				break;
-			}
-		} 
-	
+		}
+	}
+
 
         pic->vinfo.vbv_delay  = (( headr[1] >> 5 ) | ( headr[2] << 3) | 
 				 ( (headr[3] & 0x1F) << 11) ) & 0xffff;
-		
+
 	if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
-	
+
         pic->picture_header_parameter = ( headr[3] & 0xe0 ) | 
 		((headr[4] & 0x80) >> 3);
 
         if ( pct == B_FRAME ){
                 pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
-	}
+        }
 	if (pr) printk( " pic head param: 0x%x", 
 			pic->picture_header_parameter);
 
 	return pct;
-}
+} 
 #endif
 
 #if 0
@@ -130,14 +129,14 @@
                 pic->closed_gop = 1;
         } else {
                 pic->closed_gop = 0;
-	}
+        }
 	if (pr) printk("closed: %d", pic->closed_gop); 
 
         if ( ( headr[3] & 0x20 ) != 0 ){
                 pic->broken_link = 1;
-	} else {
+        } else {
                 pic->broken_link = 0;
-	}
+        }
 	if (pr) printk(" broken: %d\n", pic->broken_link); 
 
 	return 0;
@@ -160,37 +159,37 @@
         sw = (int)((headr[3]&0xF0) >> 4) ;
 
         switch( sw ){
-		case 1:
+	case 1:
 		if (pr)
 			printk("Videostream: ASPECT: 1:1");
 		vi->aspect_ratio = 100;        
-			break;
-		case 2:
+		break;
+	case 2:
 		if (pr)
 			printk("Videostream: ASPECT: 4:3");
                 vi->aspect_ratio = 133;        
-			break;
-		case 3:
+		break;
+	case 3:
 		if (pr)
 			printk("Videostream: ASPECT: 16:9");
                 vi->aspect_ratio = 177;        
-				break;
+		break;
 	case 4:
 		if (pr)
 			printk("Videostream: ASPECT: 2.21:1");
                 vi->aspect_ratio = 221;        
-				break;
+		break;
 
         case 5 ... 15:
 		if (pr)
 			printk("Videostream: ASPECT: reserved");
                 vi->aspect_ratio = 0;        
-			break;
-			
+		break;
+
         default:
                 vi->aspect_ratio = 0;        
                 return -1;
-			}
+	}
 
 	if (pr)
 		printk("  Size = %dx%d",vi->horizontal_size,vi->vertical_size);
@@ -221,29 +220,29 @@
 			printk("  FRate: 29.97 fps");
                 vi->framerate = 29970;
 		form = VIDEO_MODE_NTSC;
-			break;
-		case 5:
+		break;
+	case 5:
 		if (pr)
 			printk("  FRate: 30 fps");
                 vi->framerate = 30000;
 		form = VIDEO_MODE_NTSC;
-			break;
-		case 6:
+		break;
+	case 6:
 		if (pr)
 			printk("  FRate: 50 fps");
                 vi->framerate = 50000;
 		form = VIDEO_MODE_PAL;
-			break;
-		case 7:
+		break;
+	case 7:
 		if (pr)
 			printk("  FRate: 60 fps");
                 vi->framerate = 60000;
 		form = VIDEO_MODE_NTSC;
-			break;
-			}
-			
-	vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
+		break;
+	}
 
+	vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
+	
         vi->vbv_buffer_size
                 = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
 
@@ -259,7 +258,7 @@
 }
 #endif
 
-			
+
 #if 0
 static
 int get_vinfo(uint8_t *mbuf, int count, VideoInfo *vi, int pr)
@@ -267,7 +266,7 @@
 	uint8_t *headr;
 	int found = 0;
 	int c = 0;
-			
+
 	while (found < 4 && c+4 < count){
 		uint8_t *b;
 
@@ -277,7 +276,7 @@
 		else {
 			c++;
 		}
-			}
+	}
 
 	if (! found) return -1;
 	c += 4;
@@ -288,7 +287,7 @@
 	return 0;
 }
 #endif
-			
+
 
 #if 0
 static
@@ -306,9 +305,9 @@
 		if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
 			found = 2;
 		else {
-					c++;
-				}
-			}
+			c++;
+		}
+	}	
 
 	if (!found) return -1;
 
@@ -330,7 +329,7 @@
 			printk("  BRate: reserved");
 		else
 			printk("  BRate: %d kb/s", ai->bit_rate/1000);
-				}
+	}
 
 	fr = (headr[2] & 0x0c ) >> 2;
 	ai->frequency = freq[fr]*100;
@@ -340,41 +339,41 @@
 		else
 			printk("  Freq: %d kHz\n",ai->frequency); 
 			       
-				}
+	}
 	ai->off = c;
 	return 0;
 }
 #endif
-				
-static
-int get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr)
+
+
+int dvb_filter_get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr)
 {
 	uint8_t *headr;
 	int found = 0;
 	int c = 0;
 	uint8_t frame = 0;
 	int fr = 0;
-				
+	
 	while ( !found  && c < count){
 		uint8_t *b = mbuf+c;
-					
+
 		if ( b[0] == 0x0b &&  b[1] == 0x77 )
 			found = 1;
 		else {
-					c++;
-				}
-				}
-				
+			c++;
+		}
+	}	
+
 	if (!found) return -1;
 	if (pr)
 		printk("Audiostream: AC3");
-				
+
 	ai->off = c;
 	if (c+5 >= count) return -1;
-			
+
 	ai->layer = 0;  // 0 for AC3
         headr = mbuf+c+2;
-			
+
 	frame = (headr[2]&0x3f);
 	ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
 
@@ -420,8 +419,8 @@
         } else {        /* mpeg1 */
                 for (buf = inbuf + 6; *buf == 0xff; buf++)
                         if (buf == inbuf + 6 + 16) {
-				break;
-		}
+                                break;
+                        }
                 if ((*buf & 0xc0) == 0x40)
                         buf += 2;
                 skip = mpeg1_skip_table [*buf >> 4];
@@ -433,7 +432,7 @@
 
         *bufp = buf;
         return pts;
-} 
+}
 #endif
 
 #if 0
@@ -509,7 +508,7 @@
                 pic->progressive_frame = 1;
                 pic->picture_coding_parameter = 0x000010;
         }
-    
+
         /* Reset flag */
         pic->picture_display_extension_flag[field_type] = 0;
 
@@ -527,7 +526,7 @@
         } else {
                 pic->frame_centre_horizontal_offset[3] = last_h_offset;
                 pic->frame_centre_vertical_offset[3] = last_v_offset;
-	}
+        }
 }
 #endif
 
@@ -566,7 +565,7 @@
 			    dvb_filter_pes2ts_cb_t *cb, void *priv)
 {
 	unsigned char *buf=p2ts->buf;
-	
+
 	buf[0]=0x47;
 	buf[1]=(pid>>8);
 	buf[2]=pid&0xff;
@@ -579,7 +578,7 @@
 {
 	unsigned char *buf=p2ts->buf;
 	int ret=0, rest;
-
+	
 	//len=6+((pes[4]<<8)|pes[5]);
 
 	buf[1]|=0x40;
@@ -592,7 +591,7 @@
 		buf[1]&=~0x40;
 	}
 	if (!len)
-	return 0;
+	        return 0;
 	buf[3]=0x30|((p2ts->cc++)&0x0f);
 	rest=183-len;
 	if (rest) {
@@ -603,399 +602,5 @@
 	buf[4]=rest;
 	memcpy(buf+5+rest, pes, len);
 	return p2ts->cb(p2ts->priv, buf);
-}
-
-void dvb_filter_ipack_reset(ipack *p)
-{
-	p->found = 0;
-	p->cid = 0;
-	p->plength = 0;
-	p->flag1 = 0;
-	p->flag2 = 0;
-	p->hlength = 0;
-	p->mpeg = 0;
-	p->check = 0;
-	p->which = 0;
-	p->done = 0;
-	p->count = 0;
-}
-
-void dvb_filter_ipack_init(ipack *p, int size,
-		void (*func)(u8 *buf, int size, void *priv))
-{
-	if ( !(p->buf = vmalloc(size*sizeof(u8))) ){
-		printk ("Couldn't allocate memory for ipack\n");
-	}
-	p->size = size;
-	p->func = func;
-	p->repack_subids = 0;
-	dvb_filter_ipack_reset(p);
-}
-
-void dvb_filter_ipack_free(ipack * p)
-{
-	if (p->buf) vfree(p->buf);
-}
-
-static
-void send_ipack(ipack *p)
-{
-	int off;
-	AudioInfo ai;
-	int ac3_off = 0;
-	int streamid=0;
-	int nframes= 0;
-	int f=0;
-
-	switch ( p->mpeg ){
-	case 2:		
-		if (p->count < 10) return;
-		p->buf[3] = p->cid;
-
-		p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8);
-		p->buf[5] = (u8)((p->count-6) & 0x00FF);
-		if (p->repack_subids && p->cid == PRIVATE_STREAM1){
-			
-			off = 9+p->buf[8];
-			streamid = p->buf[off];
-			if ((streamid & 0xF8) == 0x80){
-				ai.off = 0;
-				ac3_off = ((p->buf[off+2] << 8)| 
-					   p->buf[off+3]);
-				if (ac3_off < p->count)
-					f=get_ac3info(p->buf+off+3+ac3_off, 
-						      p->count-ac3_off, &ai,0);
-				if ( !f ){
-					nframes = (p->count-off-3-ac3_off)/ 
-						ai.framesize + 1;
-					p->buf[off+2] = (ac3_off >> 8)& 0xFF;
-					p->buf[off+3] = (ac3_off)& 0xFF;
-					p->buf[off+1] = nframes;
-					
-					ac3_off +=  nframes * ai.framesize - 
-						p->count;
-				}
-		}
-	}	
-		p->func(p->buf, p->count, p->data);
-
-		p->buf[6] = 0x80;
-		p->buf[7] = 0x00;
-		p->buf[8] = 0x00;
-		p->count = 9;
-		if (p->repack_subids && p->cid == PRIVATE_STREAM1 
-		    && (streamid & 0xF8)==0x80 ){
-			p->count += 4;
-			p->buf[9] = streamid;
-			p->buf[10] = (ac3_off >> 8)& 0xFF;
-			p->buf[11] = (ac3_off)& 0xFF;
-			p->buf[12] = 0;
-		}
-
-		break;
-	case 1:
-		if (p->count < 8) return;
-		p->buf[3] = p->cid;
-
-		p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8);
-		p->buf[5] = (u8)((p->count-6) & 0x00FF);
-		p->func(p->buf, p->count, p->data);
-
-		p->buf[6] = 0x0F;
-		p->count = 7;
-		break;
-	}
-}
-
-void dvb_filter_ipack_flush(ipack *p)
-{
-	if (p->plength != MMAX_PLENGTH-6 || p->found<=6)
-		return;
-	p->plength = p->found-6;
-	p->found = 0;
-	send_ipack(p);
-	dvb_filter_ipack_reset(p);
-}
-
-static 
-void write_ipack(ipack *p, u8 *data, int count)
-{
-	u8 headr[3] = { 0x00, 0x00, 0x01} ;
-
-	if (p->count < 6){
-		memcpy(p->buf, headr, 3);
-		p->count = 6;
-	}
-
-	if (p->count + count < p->size){
-		memcpy(p->buf+p->count, data, count);
-		p->count += count;
-	} else {
-		int rest = p->size - p->count;
-		memcpy(p->buf+p->count, data, rest);
-		p->count += rest;
-		send_ipack(p);
-		if (count - rest > 0)
-			write_ipack(p, data+rest, count-rest);
-	}
-}
-
-
-int dvb_filter_instant_repack(u8 *buf, int count, ipack *p)
-{
-	int l;
-	int c=0;
-	
-	while (c < count && (p->mpeg == 0 ||
-			     (p->mpeg == 1 && p->found < 7) ||
-			     (p->mpeg == 2 && p->found < 9))
-	       &&  (p->found < 5 || !p->done)){
-		switch ( p->found ){
-		case 0:
-		case 1:
-			if (buf[c] == 0x00) p->found++;
-			else p->found = 0;
-			c++;
-			break;
-		case 2:
-			if (buf[c] == 0x01) p->found++;
-			else if (buf[c] == 0) {
-				p->found = 2;
-			} else p->found = 0;
-			c++;
-			break;
-		case 3:
-			p->cid = 0;
-			switch (buf[c]){
-			case PROG_STREAM_MAP:
-			case PRIVATE_STREAM2:
-			case PROG_STREAM_DIR:
-			case ECM_STREAM     :
-			case EMM_STREAM     :
-			case PADDING_STREAM :
-			case DSM_CC_STREAM  :
-			case ISO13522_STREAM:
-				p->done = 1;
-			case PRIVATE_STREAM1:
-			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
-				p->found++;
-				p->cid = buf[c];
-				c++;
-				break;
-			default:
-				p->found = 0;
-				break;
-			}
-			break;
-
-		case 4:
-			if (count-c > 1){
-				p->plen[0] = buf[c];
-			c++;
-				p->plen[1] = buf[c];
-				c++;
-				p->found+=2;
-				p->plength=(p->plen[0]<<8)|p->plen[1];
- 			} else {
-				p->plen[0] = buf[c];
-				p->found++;
-				return count;
-		}
-			break;
-		case 5:
-			p->plen[1] = buf[c];
-			c++;
-			p->found++;
-			p->plength=(p->plen[0]<<8)|p->plen[1];
-			break;
-		case 6:
-			if (!p->done){
-				p->flag1 = buf[c];
-				c++;
-				p->found++;
-				if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2;
-				else {
-					p->hlength = 0;
-					p->which = 0;
-					p->mpeg = 1;
-					p->flag2 = 0;
-	}	
-			}
-			break;
-
-		case 7:
-			if ( !p->done && p->mpeg == 2) {
-				p->flag2 = buf[c];
-				c++;
-				p->found++;
-			}	
-			break;
-
-		case 8:
-			if ( !p->done && p->mpeg == 2) {
-				p->hlength = buf[c];
-				c++;
-				p->found++;
-			}
-			break;
-
-		default:
-
-			break;
-		}
-	}
-
-	if (c == count) return count;
-
-	if (!p->plength) p->plength = MMAX_PLENGTH-6;
-
-	if ( p->done || ((p->mpeg == 2 && p->found >= 9) || 
-	     (p->mpeg == 1 && p->found >= 7)) ){
-		switch (p->cid){
-
-		case AUDIO_STREAM_S ... AUDIO_STREAM_E:			
-		case VIDEO_STREAM_S ... VIDEO_STREAM_E:
-		case PRIVATE_STREAM1:
-
-			if (p->mpeg == 2 && p->found == 9) {
-				write_ipack(p, &p->flag1, 1);
-				write_ipack(p, &p->flag2, 1);
-				write_ipack(p, &p->hlength, 1);
-			}
-
-			if (p->mpeg == 1 && p->found == 7) 
-				write_ipack(p, &p->flag1, 1);
-
-			if (p->mpeg == 2 && (p->flag2 & PTS_ONLY) &&  
-			    p->found < 14) {
-				while (c < count && p->found < 14) {
-					p->pts[p->found-9] = buf[c];
-					write_ipack(p, buf+c, 1);
-					c++;
-					p->found++;
-                        }
-				if (c == count) return count;
-        }
-
-			if (p->mpeg == 1 && p->which < 2000) {
-
-				if (p->found == 7) {
-					p->check = p->flag1;
-					p->hlength = 1;
-				}
-
-				while (!p->which && c < count && 
-				       p->check == 0xFF){
-					p->check = buf[c];
-					write_ipack(p, buf+c, 1);
-					c++;
-					p->found++;
-					p->hlength++;
-				}
-
-				if ( c == count) return count;
-
-				if ( (p->check & 0xC0) == 0x40 && !p->which){
-					p->check = buf[c];
-					write_ipack(p, buf+c, 1);
-					c++;
-					p->found++;
-					p->hlength++;
-
-					p->which = 1;
-					if ( c == count) return count;
-					p->check = buf[c];
-					write_ipack(p, buf+c, 1);
-					c++;
-					p->found++;
-					p->hlength++;
-					p->which = 2;
-					if ( c == count) return count;
-				}
-
-				if (p->which == 1){
-					p->check = buf[c];
-					write_ipack(p, buf+c, 1);
-					c++;
-					p->found++;
-					p->hlength++;
-					p->which = 2;
-					if ( c == count) return count;
-        }
-
-				if ( (p->check & 0x30) && p->check != 0xFF){
-					p->flag2 = (p->check & 0xF0) << 2;
-					p->pts[0] = p->check;
-					p->which = 3;
-				} 
-
-				if ( c == count) return count;
-				if (p->which > 2){
-					if ((p->flag2 & PTS_DTS_FLAGS)
-					    == PTS_ONLY){
-						while (c < count && 
-						       p->which < 7){
-							p->pts[p->which-2] =
-								buf[c];
-							write_ipack(p,buf+c,1);
-							c++;
-							p->found++;
-							p->which++;
-							p->hlength++;
-						}
-						if ( c == count) return count;
-					} else if ((p->flag2 & PTS_DTS_FLAGS) 
-						   == PTS_DTS){
-						while (c < count && 
-						       p->which< 12){
-							if (p->which< 7)
-								p->pts[p->which
-								      -2] =
-									buf[c];
-							write_ipack(p,buf+c,1);
-							c++;
-							p->found++;
-							p->which++;
-							p->hlength++;
-						}
-						if ( c == count) return count;
-					}
-					p->which = 2000;
-				}
-
-			}
-
-			while (c < count && p->found < p->plength+6){
-				l = count -c;
-				if (l+p->found > p->plength+6)
-					l = p->plength+6-p->found;
-				write_ipack(p, buf+c, l);
-				p->found += l;
-				c += l;
-			}	
-
-			break;
-        }
-
-
-		if ( p->done ){
-			if( p->found + count - c < p->plength+6){
-				p->found += count-c;
-				c = count;
-        } else {
-				c += p->plength+6 - p->found;
-				p->found = p->plength+6;
-			}
-        }
-
-		if (p->plength && p->found == p->plength+6) {
-			send_ipack(p);
-			dvb_filter_ipack_reset(p);
-			if (c < count)
-				dvb_filter_instant_repack(buf+c, count-c, p);
-		}
-	}
-	return count;
 }
 
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	Sat Apr 19 19:51:29 2003
+++ b/drivers/media/dvb/dvb-core/dvb_filter.h	Sat Apr 19 19:51:29 2003
@@ -17,6 +17,7 @@
 
 void dvb_filter_pes2ts_init(dvb_filter_pes2ts_t *p2ts, unsigned short pid, 
 		 	    dvb_filter_pes2ts_cb_t *cb, void *priv);
+
 int dvb_filter_pes2ts(dvb_filter_pes2ts_t *p2ts, unsigned char *pes, int len);
 
 
@@ -223,12 +224,7 @@
 	uint32_t off;
 } AudioInfo;
 
+int dvb_filter_get_ac3info(uint8_t *mbuf, int count, AudioInfo *ai, int pr);
 
-void dvb_filter_ipack_reset(ipack *p);
-int dvb_filter_instant_repack(u8 *buf, int count, ipack *p);
-void dvb_filter_ipack_init(ipack *p, int size,
-		void (*func)(u8 *buf,  int size, void *priv));
-void dvb_filter_ipack_free(ipack * p);
-void dvb_filter_ipack_flush(ipack *p);
 
 #endif
diff -Nru a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c	Sat Apr 19 19:51:29 2003
@@ -27,16 +27,14 @@
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/module.h>
-#include <linux/compatmac.h>
 #include <linux/list.h>
 
-#include "compat.h"
 #include "dvb_frontend.h"
 #include "dvbdev.h"
 
 
 static int dvb_frontend_debug = 0;
-static int dvb_shutdown_timeout = 0;
+static int dvb_shutdown_timeout = 5;
 
 #define dprintk if (dvb_frontend_debug) printk
 
@@ -52,18 +50,10 @@
 };
 
 
-struct dvb_fe_notifier_callbacks {
-	struct list_head list_head;
-	void (*callback) (fe_status_t s, void *data);
-	void *data;
-};
-
-
 struct dvb_frontend_data {
 	struct dvb_frontend_info *info;
 	struct dvb_frontend frontend;
 	struct dvb_device *dvbdev;
-	struct list_head notifier_callbacks;
 	struct dvb_frontend_parameters parameters;
 	struct dvb_fe_events events;
 	struct semaphore sem;
@@ -92,8 +82,17 @@
 };
 
 
+struct dvb_frontend_notifier_data {
+	struct list_head list_head;
+	struct dvb_adapter *adapter;
+	void (*callback) (fe_status_t s, void *data);
+	void *data;
+};
+
+
 static LIST_HEAD(frontend_list);
 static LIST_HEAD(frontend_ioctl_list);
+static LIST_HEAD(frontend_notifier_list);
 
 static DECLARE_MUTEX(frontend_mutex);
 
@@ -153,6 +152,7 @@
 	if (!recursive) {
 		if (down_interruptible (&frontend_mutex))
 			return;
+
 		this_fe->bending = 0;
 	}
 
@@ -170,7 +170,7 @@
 		frequency += this_fe->lnb_drift;
 		frequency += this_fe->bending;
 
-		if (this_fe != fe &&
+		if (this_fe != fe && fe->lost_sync_count != -1 &&
                     frequency > f - stepsize && frequency < f + stepsize)
 		{
 			if (recursive % 2)
@@ -192,9 +192,6 @@
 void dvb_call_frontend_notifiers (struct dvb_frontend_data *fe,
 				  fe_status_t s)
 {
-        struct list_head *e;
-	struct dvb_fe_notifier_callbacks *c;
-
 	dprintk ("%s\n", __FUNCTION__);
 
 	if ((fe->status & FE_HAS_LOCK) && !(s & FE_HAS_LOCK))
@@ -211,10 +208,8 @@
 	/**
 	 *   now tell the Demux about the TS status changes...
 	 */
-	list_for_each (e, &fe->notifier_callbacks) {
-		c = list_entry (e, struct dvb_fe_notifier_callbacks, list_head);
-		c->callback (fe->status, c->data);
-	}
+	if (fe->frontend.notifier_callback)
+		fe->frontend.notifier_callback(fe->status, fe->frontend.notifier_data);
 }
 
 
@@ -297,38 +292,6 @@
 
 
 static
-struct dvb_frontend_parameters default_param [] = {
-	{						/* NTV on Astra */
-		frequency: 12669500-10600000,
-		inversion: INVERSION_OFF,
-		{ qpsk: { symbol_rate: 22000000, fec_inner: FEC_AUTO } }
-	},
-	{						/* Cable */
-		frequency: 394000000,
-		inversion: INVERSION_OFF,
-		{ qam:  { symbol_rate: 6900000,
-			  fec_inner: FEC_AUTO,
-			  modulation: QAM_64
-			}
-		}
-	},
-	{						/* DVB-T */
-		frequency: 730000000,
-		inversion: INVERSION_OFF,
-		{ ofdm: { bandwidth: BANDWIDTH_8_MHZ,
-			  code_rate_HP: FEC_2_3,
-			  code_rate_LP: FEC_1_2,
-			  constellation: QAM_16,
-			  transmission_mode: TRANSMISSION_MODE_2K,
-			  guard_interval: GUARD_INTERVAL_1_8,
-			  hierarchy_information: HIERARCHY_NONE
-			}
-		}
-	}
-};
-
-
-static
 int dvb_frontend_set_parameters (struct dvb_frontend_data *fe,
 				 struct dvb_frontend_parameters *param,
 				 int first_trial)
@@ -336,8 +299,6 @@
 	struct dvb_frontend *frontend = &fe->frontend;
 	int err;
 
-	dvb_bend_frequency (fe, 0);
-
 	if (first_trial) {
 		fe->timeout_count = 0;
 		fe->lost_sync_count = 0;
@@ -349,6 +310,8 @@
 			sizeof (struct dvb_frontend_parameters));
 	}
 
+	dvb_bend_frequency (fe, 0);
+
 	dprintk ("%s: f == %i, drift == %i\n",
 		 __FUNCTION__, param->frequency, fe->lnb_drift);
 
@@ -365,23 +328,12 @@
 void dvb_frontend_init (struct dvb_frontend_data *fe)
 {
 	struct dvb_frontend *frontend = &fe->frontend;
-	struct dvb_frontend_parameters *init_param;
 
-	printk ("DVB: initialising frontend %i:%i (%s)...\n",
-		frontend->i2c->adapter->num, frontend->i2c->id, fe->info->name);
+	dprintk ("DVB: initialising frontend %i:%i (%s)...\n",
+		 frontend->i2c->adapter->num, frontend->i2c->id,
+		 fe->info->name);
 
 	dvb_frontend_internal_ioctl (frontend, FE_INIT, NULL);
-
-	if (fe->info->type == FE_QPSK) {
-		dvb_frontend_internal_ioctl (frontend, FE_SET_VOLTAGE,
-					     (void*) SEC_VOLTAGE_13);
-		dvb_frontend_internal_ioctl (frontend, FE_SET_TONE,
-					     (void*) SEC_TONE_ON);
-	}
-
-	init_param = &default_param[fe->info->type-FE_QPSK];
-
-	dvb_frontend_set_parameters (fe, init_param, 1);
 }
 
 
@@ -464,7 +416,7 @@
 	if (fe->exit)
 		return 1;
 
-	if (fe->dvbdev->users == 0 && dvb_shutdown_timeout)
+	if (fe->dvbdev->writers == 1)
 		if (jiffies - fe->release_jiffies > dvb_shutdown_timeout * HZ)
 			return 1;
 
@@ -482,13 +434,27 @@
 	dprintk ("%s\n", __FUNCTION__);
 
 	lock_kernel ();
-	daemonize("kdvb-fe");
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,61))
+	daemonize ();
+#else
+	daemonize ("dvb fe");
+#endif
+/*	not needed anymore in 2.5.x, done in daemonize() */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+	reparent_to_init ();
+#endif
+
+	sigfillset (&current->blocked);
 	fe->thread = current;
+	snprintf (current->comm, sizeof (current->comm), "kdvb-fe-%i:%i",
+		  fe->frontend.i2c->adapter->num, fe->frontend.i2c->id);
 	unlock_kernel ();
 
 	dvb_call_frontend_notifiers (fe, 0);
 	dvb_frontend_init (fe);
 
+	fe->lost_sync_count = -1;
+
 	while (!dvb_frontend_is_exiting (fe)) {
 		up (&fe->sem);      /* is locked when we enter the thread... */
 
@@ -499,6 +465,9 @@
 			return -ERESTARTSYS;
 		}
 
+		if (fe->lost_sync_count == -1)
+			continue;
+
 		if (dvb_frontend_is_exiting (fe))
 			break;
 
@@ -513,10 +482,14 @@
 			fe->lost_sync_count = 0;
 		} else {
 			fe->lost_sync_count++;
-			if (fe->lost_sync_count < 10)  /* XXX FIXME CHECKME! */
-				continue;
-			dvb_frontend_recover (fe);
-			delay = HZ/5;
+			if (!(fe->info->caps & FE_CAN_RECOVER)) {
+				if (!(fe->info->caps & FE_CAN_CLEAN_SETUP)) {
+					if (fe->lost_sync_count < 10)
+						continue;
+				}
+				dvb_frontend_recover (fe);
+				delay = HZ/5;
+			}
 			if (jiffies - fe->lost_sync_jiffies > TIMEOUT) {
 				s |= FE_TIMEDOUT;
 				if ((fe->status & FE_TIMEDOUT) == 0)
@@ -528,7 +501,9 @@
 			dvb_frontend_add_event (fe, s);
 	};
 
-	dvb_frontend_internal_ioctl (&fe->frontend, FE_SLEEP, NULL); 
+	if (dvb_shutdown_timeout)
+		dvb_frontend_internal_ioctl (&fe->frontend, FE_SLEEP, NULL); 
+
 	up (&fe->sem);
 	fe->thread = NULL;
 	return 0;
@@ -536,30 +511,36 @@
 
 
 static
-void dvb_frontend_start (struct dvb_frontend_data *fe)
+void dvb_frontend_stop (struct dvb_frontend_data *fe)
 {
 	dprintk ("%s\n", __FUNCTION__);
 
-	if (!fe->exit && !fe->thread) {
-		if (down_interruptible (&fe->sem))
-			return;
-		kernel_thread (dvb_frontend_thread, fe, 0);
-	}
+	while (fe->thread) {
+		fe->exit = 1;
+		wake_up_interruptible (&fe->wait_queue);
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout (5);
+		if (signal_pending(current))
+			break;
+	};
 }
 
 
 static
-void dvb_frontend_stop (struct dvb_frontend_data *fe)
+void dvb_frontend_start (struct dvb_frontend_data *fe)
 {
 	dprintk ("%s\n", __FUNCTION__);
 
-	fe->exit = 1;
-	wake_up_interruptible (&fe->wait_queue);
+	if (fe->thread)
+		dvb_frontend_stop (fe);
 
-	while (fe->thread) {
-		current->state = TASK_INTERRUPTIBLE;
-		schedule_timeout (5);
-	};
+	if (down_interruptible (&fe->sem))
+		return;
+
+	fe->exit = 0;
+	fe->thread = (void*) ~0;
+
+	kernel_thread (dvb_frontend_thread, fe, 0);
 }
 
 
@@ -615,9 +596,6 @@
 
 	dprintk ("%s\n", __FUNCTION__);
 
-	if (fe->events.eventw != fe->events.eventr)
-		return (POLLIN | POLLRDNORM | POLLPRI);
-
 	poll_wait (file, &fe->events.wait_queue, wait);
 
 	if (fe->events.eventw != fe->events.eventr)
@@ -639,10 +617,12 @@
 	if ((ret = dvb_generic_open (inode, file)) < 0)
 		return ret;
 
-	dvb_frontend_start (fe);
+	if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
+		dvb_frontend_start (fe);
 
-	/*  empty event queue */
-	fe->events.eventr = fe->events.eventw;
+		/*  empty event queue */
+		fe->events.eventr = fe->events.eventw;
+	}
 	
 	return ret;
 }
@@ -656,7 +636,8 @@
 
 	dprintk ("%s\n", __FUNCTION__);
 
-	fe->release_jiffies = jiffies;
+	if ((file->f_flags & O_ACCMODE) != O_RDONLY)
+		fe->release_jiffies = jiffies;
 
 	return dvb_generic_release (inode, file);
 }
@@ -673,7 +654,6 @@
 {
 	struct dvb_frontend_ioctl_data *ioctl;
         struct list_head *entry;
-	int frontend_count = 0;
 
 	dprintk ("%s\n", __FUNCTION__);
 
@@ -706,14 +686,12 @@
 			fe->frontend.before_ioctl = before_ioctl;
 			fe->frontend.after_ioctl = after_ioctl;
 			fe->frontend.before_after_data = before_after_data;
-			dvb_frontend_start (fe);
-			frontend_count++;
 		}
 	}
 
 	up (&frontend_mutex);
 
-	return frontend_count;
+	return 0;
 }
 
 
@@ -724,12 +702,11 @@
                             int (*after_ioctl)  (struct dvb_frontend *frontend,
                                                  unsigned int cmd, void *arg))
 {
-        struct list_head *entry;
+	struct list_head *entry, *n;
 
 	dprintk ("%s\n", __FUNCTION__);
 
-	if (down_interruptible (&frontend_mutex))
-		return;
+	down (&frontend_mutex);
 
 	list_for_each (entry, &frontend_list) {
 		struct dvb_frontend_data *fe;
@@ -746,6 +723,22 @@
 		}
 	}
 
+	list_for_each_safe (entry, n, &frontend_ioctl_list) {
+		struct dvb_frontend_ioctl_data *ioctl;
+
+		ioctl = list_entry (entry, struct dvb_frontend_ioctl_data, list_head);
+
+		if (ioctl->adapter == adapter &&
+		    ioctl->before_ioctl == before_ioctl &&
+		    ioctl->after_ioctl == after_ioctl)
+		{
+			list_del (&ioctl->list_head);
+			kfree (ioctl);
+			
+			break;
+		}
+	}
+
 	up (&frontend_mutex);
 }
 
@@ -755,41 +748,43 @@
 			   void (*callback) (fe_status_t s, void *data),
 			   void *data)
 {
-        struct list_head *entry;
+	struct dvb_frontend_notifier_data *notifier;
+	struct list_head *entry;
 
 	dprintk ("%s\n", __FUNCTION__);
 
 	if (down_interruptible (&frontend_mutex))
 		return -ERESTARTSYS;
 
-	list_for_each (entry, &frontend_list) {
-		struct dvb_frontend_data *fe;
+	notifier = kmalloc (sizeof(struct dvb_frontend_notifier_data), GFP_KERNEL);
 
-		fe = list_entry (entry, struct dvb_frontend_data, list_head);
+	if (!notifier) {
+		up (&frontend_mutex);
+		return -ENOMEM;
+	}
 
-		if (fe->frontend.i2c->adapter == adapter) {
-			struct dvb_fe_notifier_callbacks *e;
+	notifier->adapter = adapter;
+	notifier->callback = callback;
+	notifier->data = data;
 
-			e = kmalloc (sizeof(struct dvb_fe_notifier_callbacks),
-				     GFP_KERNEL);
+	list_add_tail (&notifier->list_head, &frontend_notifier_list);
 
-			if (!e) {
-				up (&frontend_mutex);
-				return -ENOMEM;
-			}
+	list_for_each (entry, &frontend_list) {
+		struct dvb_frontend_data *fe;
 
-			e->callback = callback;
-			e->data = data;
-			list_add_tail (&e->list_head, &fe->notifier_callbacks);
+		fe = list_entry (entry, struct dvb_frontend_data, list_head);
 
-			up (&frontend_mutex);
-			return 0;
+		if (fe->frontend.i2c->adapter == adapter &&
+		    fe->frontend.notifier_callback == NULL)
+		{
+			fe->frontend.notifier_callback = callback;
+			fe->frontend.notifier_data = data;
 		}
 	}
 
 	up (&frontend_mutex);
 
-	return -ENODEV;
+	return 0;
 }
 
 
@@ -797,30 +792,37 @@
 dvb_remove_frontend_notifier (struct dvb_adapter *adapter,
 			      void (*callback) (fe_status_t s, void *data))
 {
-        struct list_head *entry;
+	struct list_head *entry, *n;
 
 	dprintk ("%s\n", __FUNCTION__);
 
-	if (down_interruptible (&frontend_mutex))
-		return;
+	down (&frontend_mutex);
 
 	list_for_each (entry, &frontend_list) {
 		struct dvb_frontend_data *fe;
 
 		fe = list_entry (entry, struct dvb_frontend_data, list_head);
 
-		if (fe->frontend.i2c->adapter == adapter) {
-			struct list_head *e0, *n0;
+		if (fe->frontend.i2c->adapter == adapter &&
+		    fe->frontend.notifier_callback == callback)
+		{
+			fe->frontend.notifier_callback = NULL;
 
-			list_for_each_safe (e0, n0, &fe->notifier_callbacks) {
-				struct dvb_fe_notifier_callbacks *e;
+		}
+	}
 
-				e = list_entry (e0,
-						struct dvb_fe_notifier_callbacks,
-						list_head);
-				list_del (&e->list_head);
-				kfree (e);
-			}
+	list_for_each_safe (entry, n, &frontend_notifier_list) {
+		struct dvb_frontend_notifier_data *notifier;
+
+		notifier = list_entry (entry, struct dvb_frontend_notifier_data, list_head);
+
+		if (notifier->adapter == adapter &&
+		    notifier->callback == callback)
+		{
+			list_del (&notifier->list_head);
+			kfree (notifier);
+			
+			break;
 		}
 	}
 
@@ -849,7 +851,7 @@
 	struct list_head *entry;
 	struct dvb_frontend_data *fe;
 	static const struct dvb_device dvbdev_template = {
-		.users = 1,
+		.users = ~0,
 		.writers = 1,
 		.fops = &dvb_frontend_fops,
 		.kernel_ioctl = dvb_frontend_ioctl
@@ -873,7 +875,6 @@
 	init_MUTEX (&fe->events.sem);
 	fe->events.eventw = fe->events.eventr = 0;
 	fe->events.overflow = 0;
-	INIT_LIST_HEAD (&fe->notifier_callbacks);
 
 	fe->frontend.ioctl = ioctl;
 	fe->frontend.i2c = i2c;
@@ -891,13 +892,30 @@
 			fe->frontend.before_ioctl = ioctl->before_ioctl;
 			fe->frontend.after_ioctl = ioctl->after_ioctl;
 			fe->frontend.before_after_data = ioctl->before_after_data;
-			dvb_frontend_start (fe);
+			break;
+		}
+	}
+
+	list_for_each (entry, &frontend_notifier_list) {
+		struct dvb_frontend_notifier_data *notifier;
+
+		notifier = list_entry (entry,
+				       struct dvb_frontend_notifier_data,
+				       list_head);
+
+		if (notifier->adapter == i2c->adapter) {
+			fe->frontend.notifier_callback = notifier->callback;
+			fe->frontend.notifier_data = notifier->data;
 			break;
 		}
 	}
 
 	list_add_tail (&fe->list_head, &frontend_list);
 
+	printk ("DVB: registering frontend %i:%i (%s)...\n",
+		fe->frontend.i2c->adapter->num, fe->frontend.i2c->id,
+		fe->info->name);
+
 	dvb_register_device (i2c->adapter, &fe->dvbdev, &dvbdev_template,
 			     fe, DVB_DEVICE_FRONTEND);
 
@@ -915,8 +933,7 @@
 
 	dprintk ("%s\n", __FUNCTION__);
 
-	if (down_interruptible (&frontend_mutex))
-		return -ERESTARTSYS;
+	down (&frontend_mutex);
 
 	list_for_each_safe (entry, n, &frontend_list) {
 		struct dvb_frontend_data *fe;
@@ -925,10 +942,8 @@
 
 		if (fe->frontend.ioctl == ioctl && fe->frontend.i2c == i2c) {
 			dvb_unregister_device (fe->dvbdev);
-
 			list_del (entry);
 			up (&frontend_mutex);
-
 			dvb_frontend_stop (fe);
 			kfree (fe);
 			return 0;
diff -Nru a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h
--- a/drivers/media/dvb/dvb-core/dvb_frontend.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.h	Sat Apr 19 19:51:50 2003
@@ -52,8 +52,10 @@
 	int (*before_ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg);
 	int (*ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg);
 	int (*after_ioctl) (struct dvb_frontend *frontend, unsigned int cmd, void *arg);
+	void (*notifier_callback) (fe_status_t s, void *data);
 	struct dvb_i2c_bus *i2c;
 	void *before_after_data;   /*  can be used by hardware module... */
+	void *notifier_data;       /*  can be used by hardware module... */
 	void *data;                /*  can be used by hardware module... */
 };
 
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	Sat Apr 19 19:51:49 2003
+++ b/drivers/media/dvb/dvb-core/dvb_i2c.c	Sat Apr 19 19:51:49 2003
@@ -22,10 +22,13 @@
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/version.h>
 
-#include "compat.h"
-#include "dvb_i2c.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#include "compat.h"
+#endif
 
+#include "dvb_i2c.h"
 
 struct dvb_i2c_device {
 	struct list_head list_head;
@@ -34,13 +37,11 @@
 	void (*detach) (struct dvb_i2c_bus *i2c);
 };
 
-
 LIST_HEAD(dvb_i2c_buslist);
 LIST_HEAD(dvb_i2c_devicelist);
 
 DECLARE_MUTEX(dvb_i2c_mutex);
 
-
 static
 int register_i2c_client (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev)
 {
@@ -63,11 +64,16 @@
 static
 void try_attach_device (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev)
 {
-	if (try_module_get(dev->owner)) {
-		if (dev->attach(i2c) == 0)
-			register_i2c_client(i2c, dev);
-		else
-			module_put(dev->owner);
+	if (dev->owner) {
+		if (!try_module_get(dev->owner))
+			return;
+	}
+
+	if (dev->attach (i2c) == 0) {
+		register_i2c_client (i2c, dev);
+	} else {
+		if (dev->owner)
+			module_put (dev->owner);
 	}
 }
 
@@ -75,8 +81,10 @@
 static
 void detach_device (struct dvb_i2c_bus *i2c, struct dvb_i2c_device *dev)
 {
-	dev->detach(i2c);
-	module_put(dev->owner);
+	dev->detach (i2c);
+
+	if (dev->owner)
+		module_put (dev->owner);
 }
 
 
@@ -84,15 +92,17 @@
 void unregister_i2c_client_from_bus (struct dvb_i2c_device *dev,
 				     struct dvb_i2c_bus *i2c)
 {
-	struct list_head *entry;
+	struct list_head *entry, *n;
 
-	list_for_each (entry, &i2c->client_list) {
+	list_for_each_safe (entry, n, &i2c->client_list) {
                 struct dvb_i2c_device *client;
 
 		client = list_entry (entry, struct dvb_i2c_device, list_head);
 
-		if (client->detach == dev->detach)
+		if (client->detach == dev->detach) {
+			list_del (entry);
 			detach_device (i2c, dev);
+		}
 	}
 }
 
@@ -100,9 +110,9 @@
 static
 void unregister_i2c_client_from_all_busses (struct dvb_i2c_device *dev)
 {
-	struct list_head *entry;
+	struct list_head *entry, *n;
 
-	list_for_each (entry, &dvb_i2c_buslist) {
+	list_for_each_safe (entry, n, &dvb_i2c_buslist) {
                 struct dvb_i2c_bus *i2c;
 
 		i2c = list_entry (entry, struct dvb_i2c_bus, list_head);
@@ -118,18 +128,15 @@
 	struct list_head *entry, *n;
 
 	list_for_each_safe (entry, n, &(i2c->client_list)) {
-		struct dvb_i2c_device *client;
-
-		client = list_entry (entry, struct dvb_i2c_device, list_head);
+		struct dvb_i2c_device *dev;
 
-		detach_device (i2c, client);
+		dev = list_entry (entry, struct dvb_i2c_device, list_head);
 
-		list_del (entry);
+		unregister_i2c_client_from_bus (dev, i2c);
 	}
 }
 
 
-
 static
 void probe_device_on_all_busses (struct dvb_i2c_device *dev)
 {
@@ -160,15 +167,38 @@
 }
 
 
+static
+struct dvb_i2c_bus* dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
+		                                   const struct i2c_msg msgs[],
+						   int num),
+				      struct dvb_adapter *adapter,
+				      int id)
+{
+	struct list_head *entry;
+
+	list_for_each (entry, &dvb_i2c_buslist) {
+		struct dvb_i2c_bus *i2c;
+
+		i2c = list_entry (entry, struct dvb_i2c_bus, list_head);
+
+		if (i2c->xfer == xfer && i2c->adapter == adapter && i2c->id == id)
+			return i2c;
+	}
+
+	return NULL;
+}
+
+
 struct dvb_i2c_bus*
 dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
-				   struct i2c_msg msgs[], int num),
-		      void *data,
-		      struct dvb_adapter *adapter,
-		      int id)
+				   const struct i2c_msg *msgs, int num),
+		      void *data, struct dvb_adapter *adapter, int id)
 {
 	struct dvb_i2c_bus *i2c;
 
+	if (down_interruptible (&dvb_i2c_mutex))
+		return NULL;
+
 	if (!(i2c = kmalloc (sizeof (struct dvb_i2c_bus), GFP_KERNEL)))
 		return NULL;
 
@@ -184,54 +214,27 @@
 
 	list_add_tail (&i2c->list_head, &dvb_i2c_buslist);
 
-	return i2c;
-}
-
-
-struct dvb_i2c_bus*
-dvb_find_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
-                                   struct i2c_msg msgs[], int num),
-                  struct dvb_adapter *adapter,
-		  int id)
-{
-	struct list_head *entry;
-
-	if (down_interruptible (&dvb_i2c_mutex))
-		return NULL;
-
-	list_for_each (entry, &dvb_i2c_buslist) {
-		struct dvb_i2c_bus *i2c;
-
-		i2c = list_entry (entry, struct dvb_i2c_bus, list_head);
-
-		if (i2c->xfer == xfer &&
-		    i2c->adapter == adapter &&
-		    i2c->id == id)
-		{
-			up (&dvb_i2c_mutex);
-			return i2c;
-		}
-	}
-
 	up (&dvb_i2c_mutex);
 
-	return NULL;
+	return i2c;
 }
 
 
-
 void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
-					  struct i2c_msg msgs[], int num),
-			     struct dvb_adapter *adapter,
-			     int id)
+					  const struct i2c_msg msgs[], int num),
+			     struct dvb_adapter *adapter, int id)
 {
-	struct dvb_i2c_bus *i2c = dvb_find_i2c_bus (xfer, adapter, id);
+	struct dvb_i2c_bus *i2c;
+
+	down (&dvb_i2c_mutex);
 
-	if (i2c) {
+	if ((i2c = dvb_find_i2c_bus (xfer, adapter, id))) {
 		unregister_all_clients_from_bus (i2c);
 		list_del (&i2c->list_head);
 		kfree (i2c);
 	}
+
+	up (&dvb_i2c_mutex);
 }
 
 
@@ -267,8 +270,7 @@
 {
 	struct list_head *entry, *n;
 
-	if (down_interruptible (&dvb_i2c_mutex))
-		return -ERESTARTSYS;
+	down (&dvb_i2c_mutex);
 
 	list_for_each_safe (entry, n, &dvb_i2c_devicelist) {
 		struct dvb_i2c_device *dev;
diff -Nru a/drivers/media/dvb/dvb-core/dvb_i2c.h b/drivers/media/dvb/dvb-core/dvb_i2c.h
--- a/drivers/media/dvb/dvb-core/dvb_i2c.h	Sat Apr 19 19:51:29 2003
+++ b/drivers/media/dvb/dvb-core/dvb_i2c.h	Sat Apr 19 19:51:29 2003
@@ -30,7 +30,9 @@
 
 struct dvb_i2c_bus {
 	struct list_head list_head;
-	int (*xfer) (struct dvb_i2c_bus *i2c, struct i2c_msg msgs[], int num);
+	int (*xfer) (struct dvb_i2c_bus *i2c, 
+		     const struct i2c_msg msgs[],
+		     int num);
 	void *data;
 	struct dvb_adapter *adapter;
 	int id;
@@ -38,17 +40,16 @@
 };
 
 
-extern 
-struct dvb_i2c_bus* dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
-						       struct i2c_msg msgs[],
-						       int num),
-					  void *data,
-					  struct dvb_adapter *adapter,
-					  int id);
+extern struct dvb_i2c_bus*
+dvb_register_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
+				   const struct i2c_msg *msgs, int num),
+		      void *data,
+		      struct dvb_adapter *adapter,
+		      int id);
 
 extern
 void dvb_unregister_i2c_bus (int (*xfer) (struct dvb_i2c_bus *i2c,
-					  struct i2c_msg msgs[], int num),
+					  const struct i2c_msg msgs[], int num),
 			     struct dvb_adapter *adapter,
 			     int id);
 
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	Sat Apr 19 19:51:50 2003
+++ b/drivers/media/dvb/dvb-core/dvb_ksyms.c	Sat Apr 19 19:51:50 2003
@@ -8,6 +8,69 @@
 #include "dvb_demux.h"
 #include "dvb_net.h"
 
+/* if the miracle happens and "generic_usercopy()" is included into
+   the kernel, then this can vanish. please don't make the mistake and
+   define this as video_usercopy(). this will introduce a dependecy
+   to the v4l "videodev.o" module, which is unnecessary for some
+   cards (ie. the budget dvb-cards don't need the v4l module...) */
+int dvb_usercopy(struct inode *inode, struct file *file,
+	             unsigned int cmd, unsigned long arg,
+		     int (*func)(struct inode *inode, struct file *file,
+		     unsigned int cmd, void *arg))
+{
+        char    sbuf[128];
+        void    *mbuf = NULL;
+        void    *parg = NULL;
+        int     err  = -EINVAL;
+
+        /*  Copy arguments into temp kernel buffer  */
+        switch (_IOC_DIR(cmd)) {
+        case _IOC_NONE:
+                parg = (void *)arg;
+                break;
+        case _IOC_READ: /* some v4l ioctls are marked wrong ... */
+        case _IOC_WRITE:
+        case (_IOC_WRITE | _IOC_READ):
+                if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
+                        parg = sbuf;
+                } else {
+                        /* too big to allocate from stack */
+                        mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
+                        if (NULL == mbuf)
+                                return -ENOMEM;
+                        parg = mbuf;
+                }
+
+                err = -EFAULT;
+                if (copy_from_user(parg, (void *)arg, _IOC_SIZE(cmd)))
+                        goto out;
+                break;
+        }
+
+        /* call driver */
+        if ((err = func(inode, file, cmd, parg)) == -ENOIOCTLCMD)
+                err = -EINVAL;
+
+        if (err < 0)
+                goto out;
+
+        /*  Copy results into user buffer  */
+        switch (_IOC_DIR(cmd))
+        {
+        case _IOC_READ:
+        case (_IOC_WRITE | _IOC_READ):
+                if (copy_to_user((void *)arg, parg, _IOC_SIZE(cmd)))
+                        err = -EFAULT;
+                break;
+        }
+
+out:
+        if (mbuf)
+                kfree(mbuf);
+
+        return err;
+}
+EXPORT_SYMBOL(dvb_usercopy);
 
 EXPORT_SYMBOL(dvb_dmxdev_init);
 EXPORT_SYMBOL(dvb_dmxdev_release);
@@ -15,6 +78,7 @@
 EXPORT_SYMBOL(dvb_dmx_release);
 EXPORT_SYMBOL(dvb_dmx_swfilter_packet);
 EXPORT_SYMBOL(dvb_dmx_swfilter_packets);
+EXPORT_SYMBOL(dvb_dmx_swfilter);
 
 EXPORT_SYMBOL(dvb_register_frontend);
 EXPORT_SYMBOL(dvb_unregister_frontend);
@@ -39,11 +103,7 @@
 EXPORT_SYMBOL(dvb_generic_open);
 EXPORT_SYMBOL(dvb_generic_release);
 
-EXPORT_SYMBOL(dvb_filter_ipack_init);
-EXPORT_SYMBOL(dvb_filter_ipack_reset);
-EXPORT_SYMBOL(dvb_filter_ipack_free);
-EXPORT_SYMBOL(dvb_filter_ipack_flush);
-EXPORT_SYMBOL(dvb_filter_instant_repack);
 EXPORT_SYMBOL(dvb_filter_pes2ts_init);
 EXPORT_SYMBOL(dvb_filter_pes2ts);
+EXPORT_SYMBOL(dvb_filter_get_ac3info);
 
diff -Nru a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c
--- a/drivers/media/dvb/dvb-core/dvb_net.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/media/dvb/dvb-core/dvb_net.c	Sat Apr 19 19:51:28 2003
@@ -3,29 +3,52 @@
  *
  * Copyright (C) 2001 Convergence integrated media GmbH
  *                    Ralph Metzler <ralph@convergence.de>
+ * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de>
  *
  * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
+ * 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 Lesser General Public License
+ * 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.
- *
+ * 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/dvb/net.h>
-
 #include <asm/uaccess.h>
-#include "demux.h"
+
+#include <linux/dvb/net.h>
+#include "dvb_demux.h"
 #include "dvb_net.h"
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#include "compat.h"
+#endif
+
+#define DVB_NET_MULTICAST_MAX 10
+
+struct dvb_net_priv {
+        struct net_device_stats stats;
+        char name[6];
+	u16 pid;
+        struct dmx_demux_s *demux;
+	dmx_section_feed_t *secfeed;
+	dmx_section_filter_t *secfilter;
+	int multi_num;
+	dmx_section_filter_t *multi_secfilter[DVB_NET_MULTICAST_MAX];
+	unsigned char multi_macs[DVB_NET_MULTICAST_MAX][6];
+	int mode;
+};
+
 /*
  *	Determine the packet's protocol ID. The rule here is that we 
  *	assume 802.3 if the type field is short enough to be a length.
@@ -73,7 +96,7 @@
 }
 
 static void 
-dvb_net_sec(struct net_device *dev, u8 *pkt, int pkt_len)
+dvb_net_sec(struct net_device *dev, const u8 *pkt, int pkt_len)
 {
         u8 *eth;
         struct sk_buff *skb;
@@ -86,7 +109,7 @@
         if (skb == NULL) {
                 printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n",
                        dev->name);
-                ((dvb_net_priv_t *)dev->priv)->stats.rx_dropped++;
+                ((struct dvb_net_priv *)dev->priv)->stats.rx_dropped++;
                 return;
         }
         eth=(u8 *) skb_put(skb, pkt_len+2);
@@ -104,15 +127,14 @@
 	skb->protocol=my_eth_type_trans(skb,dev);
         skb->dev=dev;
         
-        ((dvb_net_priv_t *)dev->priv)->stats.rx_packets++;
-        ((dvb_net_priv_t *)dev->priv)->stats.rx_bytes+=skb->len;
-        //sti();
+        ((struct dvb_net_priv *)dev->priv)->stats.rx_packets++;
+        ((struct dvb_net_priv *)dev->priv)->stats.rx_bytes+=skb->len;
         netif_rx(skb);
 }
  
 static int 
-dvb_net_callback(u8 *buffer1, size_t buffer1_len,
-		 u8 *buffer2, size_t buffer2_len,
+dvb_net_callback(const u8 *buffer1, size_t buffer1_len,
+		 const u8 *buffer2, size_t buffer2_len,
 		 dmx_section_filter_t *filter,
 		 dmx_success_t success)
 {
@@ -130,18 +152,21 @@
 	return 0;
 }
 
-#define MASK 0x00;
+static u8 mask_normal[6]={0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+static u8 mask_allmulti[6]={0xff, 0xff, 0xff, 0x00, 0x00, 0x00};
+static u8 mac_allmulti[6]={0x01, 0x00, 0x5e, 0x00, 0x00, 0x00};
+static u8 mask_promisc[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 
 static int 
 dvb_net_filter_set(struct net_device *dev, 
 		   dmx_section_filter_t **secfilter,
-		   unsigned char *mac)
+		   u8 *mac, u8 *mac_mask)
 {
-	dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv;
+	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
 	int ret;
 
 	*secfilter=0;
-	ret=priv->secfeed->allocate_filter(priv->secfeed, secfilter);
+	ret = priv->secfeed->allocate_filter(priv->secfeed, secfilter);
 	if (ret<0) {
 		printk("%s: could not get filter\n", dev->name);
 		return ret;
@@ -149,25 +174,26 @@
 
 	(*secfilter)->priv=(void *) dev;
 
-	memset((*secfilter)->filter_value, 0, DMX_MAX_FILTER_SIZE);
-	memset((*secfilter)->filter_mask , 0, DMX_MAX_FILTER_SIZE);
+	memset((*secfilter)->filter_value, 0x00, DMX_MAX_FILTER_SIZE);
+	memset((*secfilter)->filter_mask,  0x00, DMX_MAX_FILTER_SIZE);
+	memset((*secfilter)->filter_mode,  0xff, DMX_MAX_FILTER_SIZE);
 
 	(*secfilter)->filter_value[0]=0x3e;
-	(*secfilter)->filter_mask[0]=MASK;
+	(*secfilter)->filter_mask[0]=0xff;
 
 	(*secfilter)->filter_value[3]=mac[5];
-	(*secfilter)->filter_mask[3]=MASK;
+	(*secfilter)->filter_mask[3]=mac_mask[5];
 	(*secfilter)->filter_value[4]=mac[4];
-	(*secfilter)->filter_mask[4]=MASK;
+	(*secfilter)->filter_mask[4]=mac_mask[4];
 	(*secfilter)->filter_value[8]=mac[3];
-	(*secfilter)->filter_mask[8]=MASK;
+	(*secfilter)->filter_mask[8]=mac_mask[3];
 	(*secfilter)->filter_value[9]=mac[2];
-	(*secfilter)->filter_mask[9]=MASK;
+	(*secfilter)->filter_mask[9]=mac_mask[2];
 
 	(*secfilter)->filter_value[10]=mac[1];
-	(*secfilter)->filter_mask[10]=MASK;
+	(*secfilter)->filter_mask[10]=mac_mask[1];
 	(*secfilter)->filter_value[11]=mac[0];
-	(*secfilter)->filter_mask[11]=MASK;
+	(*secfilter)->filter_mask[11]=mac_mask[0];
 
 	printk("%s: filter mac=%02x %02x %02x %02x %02x %02x\n", 
 	       dev->name, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
@@ -178,9 +204,9 @@
 dvb_net_feed_start(struct net_device *dev)
 {
 	int ret, i;
-	dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv;
-        dmx_demux_t *demux=priv->demux;
-        unsigned char *mac=(unsigned char *) dev->dev_addr;
+	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+        dmx_demux_t *demux = priv->demux;
+        unsigned char *mac = (unsigned char *) dev->dev_addr;
 		
 	priv->secfeed=0;
 	priv->secfilter=0;
@@ -200,28 +226,41 @@
 		priv->secfeed=0;
 		return ret;
 	}
-	MOD_INC_USE_COUNT;
+	/* fixme: is this correct? */
+	try_module_get(THIS_MODULE);
 
-	dvb_net_filter_set(dev, &priv->secfilter, mac);
-	for (i=0; i<priv->multi_num; i++) 
-		dvb_net_filter_set(dev, &priv->secfilter,
-				   priv->multi_macs[i]);
+	if (priv->mode<3) 
+		dvb_net_filter_set(dev, &priv->secfilter, mac, mask_normal);
 
+	switch (priv->mode) {
+	case 1:
+		for (i=0; i<priv->multi_num; i++) 
+			dvb_net_filter_set(dev, &priv->multi_secfilter[i],
+					   priv->multi_macs[i], mask_normal);
+		break;
+	case 2:
+		priv->multi_num=1;
+		dvb_net_filter_set(dev, &priv->multi_secfilter[0], mac_allmulti, mask_allmulti);
+		break;
+	case 3:
+		priv->multi_num=0;
+		dvb_net_filter_set(dev, &priv->secfilter, mac, mask_promisc);
+		break;
+	}
+	
 	priv->secfeed->start_filtering(priv->secfeed);
-	printk("%s: feed_started\n", dev->name);
 	return 0;
 }
 
 static void
 dvb_net_feed_stop(struct net_device *dev)
 {
-	dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv;
+	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
 	int i;
 
         if (priv->secfeed) {
 	        if (priv->secfeed->is_filtering)
 		        priv->secfeed->stop_filtering(priv->secfeed);
-		printk("%s: feed_stopped\n", dev->name);
 	        if (priv->secfilter)
 		        priv->secfeed->
 			        release_filter(priv->secfeed, 
@@ -238,62 +277,70 @@
 		priv->demux->
 		        release_section_feed(priv->demux, priv->secfeed);
 		priv->secfeed=0;
-		MOD_DEC_USE_COUNT;
+		/* fixme: is this correct? */
+		module_put(THIS_MODULE);
 	} else
 		printk("%s: no feed to stop\n", dev->name);
 }
 
 static int
-dvb_set_mc_filter(struct net_device *dev, struct dev_mc_list *mc)
+dvb_add_mc_filter(struct net_device *dev, struct dev_mc_list *mc)
 {
-	dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv;
+	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+	int ret;
 
-	if (priv->multi_num==DVB_NET_MULTICAST_MAX)
+	if (priv->multi_num >= DVB_NET_MULTICAST_MAX)
 		return -ENOMEM;
 
-	printk("%s: set_mc_filter %d: %02x %02x %02x %02x %02x %02x\n", 
-	       dev->name, 
-	       priv->multi_num,
-	       mc->dmi_addr[0],
-	       mc->dmi_addr[1],
-	       mc->dmi_addr[2],
-	       mc->dmi_addr[3],
-	       mc->dmi_addr[4],
-	       mc->dmi_addr[5]);
+	ret = memcmp(priv->multi_macs[priv->multi_num], mc->dmi_addr, 6);
 	memcpy(priv->multi_macs[priv->multi_num], mc->dmi_addr, 6);
-	
+
 	priv->multi_num++;
-	return 0;
+
+	return ret;
 }
 
 static void
 dvb_net_set_multi(struct net_device *dev)
 {
-	dvb_net_priv_t *priv=(dvb_net_priv_t *)dev->priv;
-
-	printk("%s: set_multi()\n", dev->name);
-	dvb_net_feed_stop(dev);
+	struct dvb_net_priv *priv = (struct dvb_net_priv*) dev->priv;
+	struct dev_mc_list *mc;
+	int mci;
+	int update = 0;
+	
+	if(dev->flags & IFF_PROMISC) {
+//	printk("%s: promiscuous mode\n", dev->name);
+		if(priv->mode != 3)
+			update = 1;
+		priv->mode = 3;
+	} else if(dev->flags & IFF_ALLMULTI) {
+//	printk("%s: allmulti mode\n", dev->name);
+		if(priv->mode != 2)
+			update = 1;
+		priv->mode = 2;
+	} else if(dev->mc_count > 0) {
+//	printk("%s: set_mc_list, %d entries\n", 
+//	       dev->name, dev->mc_count);
+		if(priv->mode != 1)
+			update = 1;
+		priv->mode = 1;
+		priv->multi_num = 0;
+		for (mci = 0, mc=dev->mc_list; 
+		     mci < dev->mc_count;
+		     mc=mc->next, mci++)
+			if(dvb_add_mc_filter(dev, mc) != 0)
+				update = 1;
+	} else {
+		if(priv->mode != 0)
+			update = 1;
+		priv->mode = 0;
+	}
 
-	if (dev->flags&IFF_PROMISC) {
-		/* Enable promiscuous mode */
-		printk("%s: promiscuous mode\n", dev->name);
-	} else if((dev->flags&IFF_ALLMULTI)) {
-		/* Disable promiscuous mode, use normal mode. */
-		printk("%s: normal mode\n", dev->name);
-	} else if(dev->mc_count) {
-                int mci;
-                struct dev_mc_list *mc;
-		
-		printk("%s: set_mc_list, %d entries\n", 
-		       dev->name, dev->mc_count);
-		priv->multi_num=0;
-                for (mci=0, mc=dev->mc_list; 
-		     mci<dev->mc_count;
-		     mc=mc->next, mci++) {
-			dvb_set_mc_filter(dev, mc);
-                } 
+	if(netif_running(dev) != 0 && update > 0)
+	{
+		dvb_net_feed_stop(dev);
+		dvb_net_feed_start(dev);
 	}
-	dvb_net_feed_start(dev);
 }
 
 static int
@@ -308,13 +355,15 @@
 dvb_net_set_mac(struct net_device *dev, void *p)
 {
 	struct sockaddr *addr=p;
+	int update;
 
+	update = memcmp(dev->dev_addr, addr->sa_data, dev->addr_len);
 	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
-	if (netif_running(dev)) {
-	        dvb_net_feed_stop(dev);
+	if (netif_running(dev) != 0 && update > 0) {
+		dvb_net_feed_stop(dev);
 		dvb_net_feed_start(dev);
 	}
-        return 0;
+	return 0;
 }
 
 
@@ -335,15 +384,13 @@
 static struct net_device_stats *
 dvb_net_get_stats(struct net_device *dev)
 {
-        return &((dvb_net_priv_t *)dev->priv)->stats;
+        return &((struct dvb_net_priv*) dev->priv)->stats;
 }
 
 
 static int
 dvb_net_init_dev(struct net_device *dev)
 {
-	printk("dvb_net: dvb_net_init_dev()\n");
-
 	ether_setup(dev);
 
 	dev->open		= dvb_net_open;
@@ -354,6 +401,7 @@
 	dev->set_config         = dvb_net_set_config;
 	dev->set_mac_address    = dvb_net_set_mac;
 	dev->mtu		= 4096;
+	dev->mc_count           = 0;
 
 	dev->flags             |= IFF_NOARP;
 	dev->hard_header_cache  = NULL;
@@ -364,7 +412,7 @@
 }
 
 static int 
-get_if(dvb_net_t *dvbnet)
+get_if(struct dvb_net *dvbnet)
 {
 	int i;
 
@@ -379,10 +427,11 @@
 
 
 int 
-dvb_net_add_if(dvb_net_t *dvbnet, u16 pid)
+dvb_net_add_if(struct dvb_net *dvbnet, u16 pid)
 {
         struct net_device *net;
 	dmx_demux_t *demux;
+	struct dvb_net_priv *priv;
 	int result;
 	int if_num;
  
@@ -402,25 +451,29 @@
         net->name[5]=if_num+0x30;
         net->next      = NULL;
         net->init      = dvb_net_init_dev;
-        net->priv      = kmalloc(sizeof(dvb_net_priv_t), GFP_KERNEL);
+        net->priv      = kmalloc(sizeof(struct dvb_net_priv), GFP_KERNEL);
 	if (net->priv == NULL)
 			return -ENOMEM;
-	memset(net->priv, 0, sizeof(dvb_net_priv_t));
 
-        ((dvb_net_priv_t *)net->priv)->demux=demux;
-        ((dvb_net_priv_t *)net->priv)->pid=pid;
+	priv = net->priv;
+	memset(priv, 0, sizeof(struct dvb_net_priv));
+        priv->demux = demux;
+        priv->pid = pid;
+	priv->mode = 0;
 
-        net->base_addr=pid;
+        net->base_addr = pid;
                 
 	if ((result = register_netdev(net)) < 0) {
 		return result;
 	}
-	MOD_INC_USE_COUNT;
+	/* fixme: is this correct? */
+	try_module_get(THIS_MODULE);
+
         return if_num;
 }
 
 int 
-dvb_net_remove_if(dvb_net_t *dvbnet, int num)
+dvb_net_remove_if(struct dvb_net *dvbnet, int num)
 {
 	if (!dvbnet->state[num])
 		return -EINVAL;
@@ -428,15 +481,17 @@
         kfree(dvbnet->device[num].priv);
         unregister_netdev(&dvbnet->device[num]);
 	dvbnet->state[num]=0;
-	MOD_DEC_USE_COUNT;
+	/* fixme: is this correct? */
+	module_put(THIS_MODULE);
+
 	return 0;
 }
 
-int dvb_net_ioctl(struct inode *inode, struct file *file, 
+int dvb_net_do_ioctl(struct inode *inode, struct file *file, 
 		  unsigned int cmd, void *parg)
 {
-	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
-	dvb_net_t *dvbnet=(dvb_net_t *) dvbdev->priv;
+	struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
+	struct dvb_net *dvbnet = (struct dvb_net *) dvbdev->priv;
 
 	if (((file->f_flags&O_ACCMODE)==O_RDONLY))
 		return -EPERM;
@@ -453,6 +508,21 @@
 		dvbnetif->if_num=result;
 		break;
 	}
+	case NET_GET_IF:
+	{
+		struct net_device *netdev;
+		struct dvb_net_priv *priv_data;
+		struct dvb_net_if *dvbnetif=(struct dvb_net_if *)parg;
+
+		if (dvbnetif->if_num >= dvbnet->dev_num ||
+		    !dvbnet->state[dvbnetif->if_num])
+			return -EFAULT;
+
+		netdev=(struct net_device*)&dvbnet->device[dvbnetif->if_num];
+		priv_data=(struct dvb_net_priv*)netdev->priv;
+		dvbnetif->pid=priv_data->pid;
+		break;
+	}
 	case NET_REMOVE_IF:
 		return dvb_net_remove_if(dvbnet, (int) parg);
 	default:
@@ -461,23 +531,32 @@
 	return 0;
 }
 
+static int 
+dvb_net_ioctl(struct inode *inode, struct file *file,
+	      unsigned int cmd, unsigned long arg)
+{
+	return dvb_usercopy(inode, file, cmd, arg, dvb_net_do_ioctl);
+}
+
 static struct file_operations dvb_net_fops = {
-	.owner		= THIS_MODULE,
-	.ioctl		= dvb_generic_ioctl,
-	.open		= dvb_generic_open,
-	.release	= dvb_generic_release,
+	.owner = THIS_MODULE,
+        .read =	0,
+	.write = 0,
+	.ioctl = dvb_net_ioctl,
+	.open =	dvb_generic_open,
+	.release = dvb_generic_release,
+	.poll =	0,
 };
 
 static struct dvb_device dvbdev_net = {
-	.priv		= 0,
-	.users		= 1,
-	.writers	= 1,
-	.fops		= &dvb_net_fops,
-	.kernel_ioctl	= dvb_net_ioctl,
+        .priv = 0,
+        .users = 1,
+        .writers = 1,
+        .fops = &dvb_net_fops,
 };
 
 void
-dvb_net_release(dvb_net_t *dvbnet)
+dvb_net_release(struct dvb_net *dvbnet)
 {
 	int i;
 
@@ -490,15 +569,19 @@
 }
 
 int
-dvb_net_init(struct dvb_adapter *adap, dvb_net_t *dvbnet, dmx_demux_t *demux)
+dvb_net_init(struct dvb_adapter *adap, struct dvb_net *dvbnet, dmx_demux_t *dmx)
 {
 	int i;
 		
-	dvbnet->demux=demux;
-	dvbnet->dev_num=DVB_NET_DEVICES_MAX;
+	dvbnet->demux = dmx;
+	dvbnet->dev_num = DVB_NET_DEVICES_MAX;
+
 	for (i=0; i<dvbnet->dev_num; i++) 
-		dvbnet->state[i]=0;
-	dvb_register_device(adap, &dvbnet->dvbdev, &dvbdev_net, dvbnet, DVB_DEVICE_NET);
+		dvbnet->state[i] = 0;
+
+	dvb_register_device (adap, &dvbnet->dvbdev, &dvbdev_net,
+			     dvbnet, DVB_DEVICE_NET);
+
 	return 0;
 }
 
diff -Nru a/drivers/media/dvb/dvb-core/dvb_net.h b/drivers/media/dvb/dvb-core/dvb_net.h
--- a/drivers/media/dvb/dvb-core/dvb_net.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/media/dvb/dvb-core/dvb_net.h	Sat Apr 19 19:51:28 2003
@@ -32,23 +32,9 @@
 #include "dvbdev.h"
 
 #define DVB_NET_DEVICES_MAX 10
-#define DVB_NET_MULTICAST_MAX 10
 
-typedef struct dvb_net_priv_s {
-        struct net_device_stats stats;
-        char name[6];
-	u16 pid;
-        dmx_demux_t *demux;
-	dmx_section_feed_t *secfeed;
-	dmx_section_filter_t *secfilter;
-	int multi_num;
-	dmx_section_filter_t *multi_secfilter[DVB_NET_MULTICAST_MAX];
-	unsigned char multi_macs[DVB_NET_MULTICAST_MAX][6];
-} dvb_net_priv_t;
-
-typedef struct dvb_net_s {
+typedef struct dvb_net {
 	struct dvb_device *dvbdev;
-
 	int card_num;
 	int dev_num;
 	struct net_device device[DVB_NET_DEVICES_MAX];
@@ -57,7 +43,8 @@
 } dvb_net_t;
 
 
-void dvb_net_release(dvb_net_t *);
-int  dvb_net_init(struct dvb_adapter *, dvb_net_t *, dmx_demux_t *);
+void dvb_net_release(struct dvb_net *);
+int  dvb_net_init(struct dvb_adapter *, struct dvb_net *, dmx_demux_t *);
 
 #endif
+
diff -Nru a/drivers/media/dvb/dvb-core/dvb_ringbuffer.c b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,176 @@
+/*
+ *
+ * dvb_ringbuffer.c: ring buffer implementation for the dvb driver
+ *
+ * Copyright (C) 2003 Oliver Endriss 
+ * 
+ * based on code originally found in av7110.c:
+ * Copyright (C) 1999-2002 Ralph  Metzler 
+ *                       & Marcus Metzler for convergence integrated media GmbH
+ *
+ * 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
+ * 
+ *
+ * the project's page is at http://www.linuxtv.org/dvb/
+ */
+
+
+
+#define __KERNEL_SYSCALLS__
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/module.h>
+#include <asm/uaccess.h>
+
+#include "dvb_ringbuffer.h"
+
+
+
+void dvb_ringbuffer_init(dvb_ringbuffer_t *rbuf, void *data, size_t len)
+{
+        rbuf->pread=rbuf->pwrite=0;
+        rbuf->data=data;
+        rbuf->size=len;
+
+        init_waitqueue_head(&rbuf->queue);
+
+        spin_lock_init(&(rbuf->lock));
+        rbuf->lock=SPIN_LOCK_UNLOCKED;
+}
+
+
+
+int dvb_ringbuffer_empty(dvb_ringbuffer_t *rbuf)
+{
+        return (rbuf->pread==rbuf->pwrite);
+}
+
+
+
+ssize_t dvb_ringbuffer_free(dvb_ringbuffer_t *rbuf)
+{
+        ssize_t free;
+  
+        free = rbuf->pread - rbuf->pwrite;
+        if (free <= 0)
+                free += rbuf->size;
+        return free-1;
+}
+
+
+
+ssize_t dvb_ringbuffer_avail(dvb_ringbuffer_t *rbuf)
+{
+        ssize_t avail;
+  
+        avail = rbuf->pwrite - rbuf->pread;
+        if (avail < 0)
+                avail += rbuf->size;
+        return avail;
+}
+
+
+
+void dvb_ringbuffer_flush(dvb_ringbuffer_t *rbuf)
+{
+        rbuf->pread = rbuf->pwrite;
+}
+
+
+
+void dvb_ringbuffer_flush_spinlock_wakeup(dvb_ringbuffer_t *rbuf)
+{
+        unsigned long flags;
+
+        spin_lock_irqsave(&rbuf->lock, flags);
+        dvb_ringbuffer_flush(rbuf);
+        spin_unlock_irqrestore(&rbuf->lock, flags);
+
+        wake_up(&rbuf->queue);
+}
+
+
+
+ssize_t dvb_ringbuffer_read(dvb_ringbuffer_t *rbuf, u8 *buf, size_t len, int usermem)
+{
+        size_t todo = len;
+        size_t split;
+
+        split = (rbuf->pread + len > rbuf->size) ? rbuf->size - rbuf->pread : 0;
+        if (split > 0) {
+                if (!usermem)
+                        memcpy(buf, rbuf->data+rbuf->pread, split);
+                else
+                        if (copy_to_user(buf, rbuf->data+rbuf->pread, split))
+                                return -EFAULT;
+                buf += split;
+                todo -= split;
+                rbuf->pread = 0;
+        }
+        if (!usermem)
+                memcpy(buf, rbuf->data+rbuf->pread, todo);
+        else
+                if (copy_to_user(buf, rbuf->data+rbuf->pread, todo))
+                        return -EFAULT;
+
+        rbuf->pread = (rbuf->pread + len) % rbuf->size;
+
+        return len;
+}
+
+
+
+ssize_t dvb_ringbuffer_write(dvb_ringbuffer_t *rbuf, const u8 *buf,
+                             size_t len, int usermem)
+{
+        size_t todo = len;
+        size_t split;
+    
+        split = (rbuf->pwrite + len > rbuf->size) ? rbuf->size - rbuf->pwrite : 0;
+
+        if (split > 0) {
+                if (!usermem) 
+                        memcpy(rbuf->data+rbuf->pwrite, buf, split);
+                else
+                        if (copy_from_user(rbuf->data+rbuf->pwrite, 
+                                           buf, split))
+                                return -EFAULT;
+                buf += split;
+                todo -= split;
+                rbuf->pwrite = 0;
+        }
+        if (!usermem) 
+                memcpy(rbuf->data+rbuf->pwrite, buf, todo);
+        else
+                if (copy_from_user(rbuf->data+rbuf->pwrite, buf, todo)) 
+                        return -EFAULT;
+
+        rbuf->pwrite = (rbuf->pwrite + len) % rbuf->size;
+
+	return len;
+}
+
+
+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);
diff -Nru a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,127 @@
+/*
+ *
+ * dvb_ringbuffer.h: ring buffer implementation for the dvb driver
+ *
+ * Copyright (C) 2003 Oliver Endriss 
+ * 
+ * based on code originally found in av7110.c:
+ * Copyright (C) 1999-2002 Ralph  Metzler 
+ *                       & Marcus Metzler for convergence integrated media GmbH
+ *
+ * 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
+ * 
+ *
+ * the project's page is at http://www.linuxtv.org/dvb/
+ */
+
+#ifndef _DVB_RINGBUFFER_H_
+#define _DVB_RINGBUFFER_H_
+
+
+typedef struct dvb_ringbuffer {
+        u8               *data;
+        ssize_t           size;
+        ssize_t           pread;
+        ssize_t           pwrite;
+
+        wait_queue_head_t queue;
+        spinlock_t        lock;
+} dvb_ringbuffer_t;
+
+
+/*
+** Notes:
+** ------
+** (1) For performance reasons read and write routines don't check buffer sizes
+**     and/or number of bytes free/available. This has to be done before these
+**     routines are called. For example:
+**
+**     *** write <buflen> bytes ***
+**     free = dvb_ringbuffer_free(rbuf);
+**     if (free >= buflen) 
+**         count = dvb_ringbuffer_write(rbuf, buffer, buflen, 0);
+**     else
+**         ...
+**
+**     *** read min. 1000, max. <bufsize> bytes ***
+**     avail = dvb_ringbuffer_avail(rbuf);
+**     if (avail >= 1000)
+**         count = dvb_ringbuffer_read(rbuf, buffer, min(avail, bufsize), 0);
+**     else
+**         ...
+**
+** (2) If there is exactly one reader and one writer, there is no need 
+**     to lock read or write operations.
+**     Two or more readers must be locked against each other.
+**     Flushing the buffer counts as a read operation.
+**     Two or more writers must be locked against each other.
+*/
+
+/* initialize ring buffer, lock and queue */
+extern void dvb_ringbuffer_init(dvb_ringbuffer_t *rbuf, void *data, size_t len);
+
+/* test whether buffer is empty */
+extern int dvb_ringbuffer_empty(dvb_ringbuffer_t *rbuf);
+
+/* return the number of free bytes in the buffer */
+extern ssize_t dvb_ringbuffer_free(dvb_ringbuffer_t *rbuf);
+
+/* return the number of bytes waiting in the buffer */
+extern ssize_t dvb_ringbuffer_avail(dvb_ringbuffer_t *rbuf);
+
+
+/* read routines & macros */
+/* ---------------------- */
+/* flush buffer */
+extern void dvb_ringbuffer_flush(dvb_ringbuffer_t *rbuf);
+
+/* flush buffer protected by spinlock and wake-up waiting task(s) */
+extern void dvb_ringbuffer_flush_spinlock_wakeup(dvb_ringbuffer_t *rbuf);
+
+/* peek at byte <offs> in the buffer */
+#define DVB_RINGBUFFER_PEEK(rbuf,offs)	\
+			(rbuf)->data[((rbuf)->pread+(offs))%(rbuf)->size]
+
+/* advance read ptr by <num> bytes */
+#define DVB_RINGBUFFER_SKIP(rbuf,num)	\
+			(rbuf)->pread=((rbuf)->pread+(num))%(rbuf)->size
+ 
+/*
+** read <len> bytes from ring buffer into <buf> 
+** <usermem> specifies whether <buf> resides in user space
+** returns number of bytes transferred or -EFAULT
+*/
+extern ssize_t dvb_ringbuffer_read(dvb_ringbuffer_t *rbuf, u8 *buf, 
+                                   size_t len, int usermem);
+
+
+/* write routines & macros */
+/* ----------------------- */
+/* write single byte to ring buffer */
+#define DVB_RINGBUFFER_WRITE_BYTE(rbuf,byte)	\
+			{ (rbuf)->data[(rbuf)->pwrite]=(byte); \
+			(rbuf)->pwrite=((rbuf)->pwrite+1)%(rbuf)->size; }
+/*
+** write <len> bytes to ring buffer
+** <usermem> specifies whether <buf> resides in user space
+** returns number of bytes transferred or -EFAULT
+*/
+extern ssize_t dvb_ringbuffer_write(dvb_ringbuffer_t *rbuf, const u8 *buf,
+                                    size_t len, int usermem);
+
+#endif /* _DVB_RINGBUFFER_H_ */
diff -Nru a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c
--- a/drivers/media/dvb/dvb-core/dvbdev.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/media/dvb/dvb-core/dvbdev.c	Sat Apr 19 19:51:28 2003
@@ -35,11 +35,13 @@
 #include <asm/system.h>
 #include <linux/kmod.h>
 #include <linux/slab.h>
-#include <linux/videodev.h>
 
-#include "compat.h"
 #include "dvbdev.h"
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#include "compat.h"
+#endif
+
 static int dvbdev_debug = 0;
 #define dprintk if (dvbdev_debug) printk
 
@@ -57,7 +59,6 @@
 #define DVB_MAX_IDS              4
 #define nums2minor(num,type,id)  ((num << 6) | (id << 4) | type)
 
-
 static
 struct dvb_device* dvbdev_find_device (int minor)
 {
@@ -160,7 +161,7 @@
 	if (!dvbdev->kernel_ioctl)
 		return -EINVAL;
 
-	return video_usercopy (inode, file, cmd, arg, dvbdev->kernel_ioctl);
+	return dvb_usercopy (inode, file, cmd, arg, dvbdev->kernel_ioctl);
 }
 
 
@@ -219,9 +220,8 @@
 
 	list_add_tail (&dvbdev->list_head, &adap->device_list);
 
-	sprintf(name, "%s%d", dnames[type], id);
-	dvbdev->devfs_handle = devfs_register(adap->devfs_handle, name,
-					      0, DVB_MAJOR,
+	sprintf(name, "dvb/adapter%d%s%d", adap->num, dnames[type], id);
+	dvbdev->devfs_handle = devfs_register(NULL, name, 0, DVB_MAJOR,
 					      nums2minor(adap->num, type, id),
 					      S_IFCHR | S_IRUSR | S_IWUSR,
 					      dvbdev->fops, dvbdev);
@@ -267,7 +267,7 @@
 }
 
 
-int dvb_register_adapter(struct dvb_adapter **padap, char *name)
+int dvb_register_adapter(struct dvb_adapter **padap, const char *name)
 {
 	struct dvb_adapter *adap;
 	int num;
@@ -288,12 +288,14 @@
 	memset (adap, 0, sizeof(struct dvb_adapter));
 	INIT_LIST_HEAD (&adap->device_list);
 
-	MOD_INC_USE_COUNT;
+ 	/* fixme: is this correct? */
+	try_module_get(THIS_MODULE);
 
 	printk ("DVB: registering new adapter (%s).\n", name);
 	
 	adap->devfs_handle = devfs_mk_dir("dvb/adapter%d", num);
 	adap->num = num;
+	adap->name = name;
 
 	list_add_tail (&adap->list_head, &dvb_adapter_list);
 
@@ -311,7 +313,8 @@
 	list_del (&adap->list_head);
 	up (&dvbdev_register_lock);
 	kfree (adap);
-	MOD_DEC_USE_COUNT;
+	/* fixme: is this correct? */
+	module_put(THIS_MODULE);
 	return 0;
 }
 
diff -Nru a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h
--- a/drivers/media/dvb/dvb-core/dvbdev.h	Sat Apr 19 19:51:30 2003
+++ b/drivers/media/dvb/dvb-core/dvbdev.h	Sat Apr 19 19:51:30 2003
@@ -48,6 +48,7 @@
 	devfs_handle_t devfs_handle;
 	struct list_head list_head;
 	struct list_head device_list;
+	const char *name;
 };
 
 
@@ -63,14 +64,14 @@
 	int writers;
 
         /* don't really need those !? -- FIXME: use video_usercopy  */
-	int (*kernel_ioctl)(struct inode *inode, struct file *file,
+        int (*kernel_ioctl)(struct inode *inode, struct file *file,
 			    unsigned int cmd, void *arg);
 
 	void *priv;
 };
 
 
-extern int dvb_register_adapter (struct dvb_adapter **padap, char *name);
+extern int dvb_register_adapter (struct dvb_adapter **padap, const char *name);
 extern int dvb_unregister_adapter (struct dvb_adapter *adap);
 
 extern int dvb_register_device (struct dvb_adapter *adap,
@@ -84,7 +85,10 @@
 extern int dvb_generic_open (struct inode *inode, struct file *file);
 extern int dvb_generic_release (struct inode *inode, struct file *file);
 extern int dvb_generic_ioctl (struct inode *inode, struct file *file,
-		      unsigned int cmd, unsigned long arg);
-
+			      unsigned int cmd, unsigned long arg);
+int dvb_usercopy(struct inode *inode, struct file *file,
+                     unsigned int cmd, unsigned long arg,
+                     int (*func)(struct inode *inode, struct file *file,
+                     unsigned int cmd, void *arg));
 #endif /* #ifndef _DVBDEV_H_ */
 
diff -Nru a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig
--- a/drivers/media/dvb/frontends/Kconfig	Sat Apr 19 19:51:28 2003
+++ b/drivers/media/dvb/frontends/Kconfig	Sat Apr 19 19:51:28 2003
@@ -1,13 +1,17 @@
 comment "Supported Frontend Modules"
 	depends on DVB
 
-config DVB_ALPS_BSRU6
-	tristate "Alps BSRU6 (QPSK)"
+config DVB_STV0299
+	tristate "STV0299 based DVB-S frontend (QPSK)"
 	depends on DVB_CORE
 	help
 	  A DVB-S tuner module. 
 
-	  Say Y when you want to support this frontend.
+	  Say Y when you want to support frontend based on this 
+	  demodulator.
+
+	  Some examples are the Alps BSRU6, the Philips SU1278 and
+	  the LG TDQB-S00x.
 
 	  If you don't know what tuner module is soldered on your 
 	  DVB adapter simply enable all supported frontends, the 
@@ -29,22 +33,34 @@
 	help
 	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
-	  This tuner module needs some microcode located in a file called 
+	  This tuner module needs some microcode located in a file called
 	  "Sc_main.mc" in the windows driver. Please pass the module parameter
-	  mcfile="/PATH/FILENAME" when loading alps_tdlb7.
+	  mcfile="/PATH/FILENAME" when loading alps_tdlb7.o.
 
-	  If you don't know what tuner module is soldered on your 
-	  DVB adapter simply enable all supported frontends, the 
+	  If you don't know what tuner module is soldered on your
+	  DVB adapter simply enable all supported frontends, the
 	  right one will get autodetected.
 
+
 config DVB_ALPS_TDMB7
-	tristate "Alps BSRV2 (OFDM)"
+	tristate "Alps TDMB7 (OFDM)"
 	depends on DVB_CORE
 	help
-	  A DVB-S tuner module. Say Y when you want to support this frontend.
+	  A DVB-T tuner module. Say Y when you want to support this frontend.
 
-	  If you don't know what tuner module is soldered on your 
-	  DVB adapter simply enable all supported frontends, the 
+	  If you don't know what tuner module is soldered on your
+	  DVB adapter simply enable all supported frontends, the
+	  right one will get autodetected.
+
+config DVB_ATMEL_AT76C651
+	tristate "Atmel AT76C651 (QAM)"
+	depends on DVB_CORE
+	help
+	  The AT76C651 Demodulator is used in some DVB-C SetTopBoxes. Say Y
+	  when you see this demodulator chip near your tuner module.
+
+	  If you don't know what tuner module is soldered on your
+	  DVB adapter simply enable all supported frontends, the
 	  right one will get autodetected.
 
 config DVB_GRUNDIG_29504_491
diff -Nru a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile
--- a/drivers/media/dvb/frontends/Makefile	Sat Apr 19 19:51:27 2003
+++ b/drivers/media/dvb/frontends/Makefile	Sat Apr 19 19:51:27 2003
@@ -4,10 +4,11 @@
 
 EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
 
-obj-$(CONFIG_DVB_ALPS_BSRU6) += alps_bsru6.o
+obj-$(CONFIG_DVB_STV0299) += stv0299.o
 obj-$(CONFIG_DVB_ALPS_BSRV2) += alps_bsrv2.o
 obj-$(CONFIG_DVB_ALPS_TDLB7) += alps_tdlb7.o
 obj-$(CONFIG_DVB_ALPS_TDMB7) += alps_tdmb7.o
+obj-$(CONFIG_DVB_ATMEL_AT76C651) += at76c651.o
 obj-$(CONFIG_DVB_GRUNDIG_29504_491) += grundig_29504-491.o
 obj-$(CONFIG_DVB_GRUNDIG_29504_401) += grundig_29504-401.o
 obj-$(CONFIG_DVB_VES1820) += ves1820.o
diff -Nru a/drivers/media/dvb/frontends/alps_bsru6.c b/drivers/media/dvb/frontends/alps_bsru6.c
--- a/drivers/media/dvb/frontends/alps_bsru6.c	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,745 +0,0 @@
-/* 
-    Alps BSRU6 and LG TDQB-S00x DVB QPSK frontend driver
-
-    Copyright (C) 2001-2002 Convergence Integrated Media GmbH
-	<ralph@convergence.de>, <holger@convergence.de>,
-	<js@convergence.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/init.h>
-#include <linux/module.h>
-
-#include "compat.h"
-#include "dvb_frontend.h"
-
-
-static int debug = 0;
-#define dprintk	if (debug) printk
-
-
-#define M_CLK (88000000UL)
-/* M=21, K=0, P=0, f_VCO = 4MHz*4*(M+1)/(K+1) = 352 MHz */
-
-
-static
-struct dvb_frontend_info bsru6_info = {
-#ifdef CONFIG_ALPS_BSRU6_IS_LG_TDQBS00X
-	.name			= "LG TDQB-S00x",
-#else
-	.name			= "Alps BSRU6",
-#endif
-	.type			= FE_QPSK,
-	.frequency_min		= 950000,
-	.frequency_max		= 2150000,
-	.frequency_stepsize	= 125,   /* kHz for QPSK frontends */
-	.frequency_tolerance	= M_CLK/2000,
-	.symbol_rate_min	= 1000000,
-	.symbol_rate_max	= 45000000,
-	.symbol_rate_tolerance	= 500,  /* ppm */
-	.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
-};
-
-
-static
-u8 init_tab [] = {
-	0x01, 0x15,   // M: 0x15 DIRCLK: 0 K:0
-	0x02, 0x30,   // P: 0  SERCLK: 0 VCO:ON  STDBY:0
- 
-	0x03, 0x00,
-	0x04, 0x7d,   // F22FR, F22=22kHz
-	0x05, 0x35,   // SDAT:0 SCLT:0 I2CT:1
-	0x06, 0x00,   // DAC mode and MSB 
-	0x07, 0x00,   // DAC LSB
-//	0x08, 0x43,   // DiSEqC
-	0x08, 0x03,   // DiSEqC
-	0x09, 0x00,
-	0x0a, 0x42, 
-	0x0c, 0x51,   // QPSK reverse:1  Nyquist:0 OP0 val:1 OP0 con:1 OP1 val:1 OP1 con:1 
-	0x0d, 0x82,
-	0x0e, 0x23,
-	0x0f, 0x52,
-
-	0x10, 0x3d,   // AGC2
-	0x11, 0x84,   
-	0x12, 0xb5,   // Lock detect: -64  Carrier freq detect:on
-	0x13, 0xb6,   // alpha_car b:4 a:0  noise est:256ks  derot:on 
-	0x14, 0x93,   // beat carc:0 d:0 e:0xf  phase detect algo: 1
-	0x15, 0xc9,   // lock detector threshold
-	
-	0x16, 0x1d,
-	0x17, 0x00,
-	0x18, 0x14,
-	0x19, 0xf2,
-
-	0x1a, 0x11,
-
-	0x1b, 0x9c,
-	0x1c, 0x00,
-	0x1d, 0x00,
-	0x1e, 0x0b,
-	0x1f, 0x50,
-
-	0x20, 0x00,
-	0x21, 0x00,
-	0x22, 0x00,
-	0x23, 0x00,
-	0x24, 0xff,
-	0x25, 0xff,
-	0x26, 0xff,
-
-	0x28, 0x00,  // out imp: normal  out type: parallel FEC mode:0 
-	0x29, 0x1e,  // 1/2 threshold
-	0x2a, 0x14,  // 2/3 threshold
-	0x2b, 0x0f,  // 3/4 threshold
-	0x2c, 0x09,  // 5/6 threshold
-	0x2d, 0x05,  // 7/8 threshold
-	0x2e, 0x01,
-
-	0x31, 0x1f,  // test all FECs 
-
-	0x32, 0x19,  // viterbi and synchro search
-	0x33, 0xfc,  // rs control
-	0x34, 0x93,  // error control
-
-	0x0b, 0x00, 
-	0x27, 0x00,
-	0x2f, 0x00,
-	0x30, 0x00,
-	0x35, 0x00,
-	0x36, 0x00,
-	0x37, 0x00,
-	0x38, 0x00,
-	0x39, 0x00,
-	0x3a, 0x00,
-	0x3b, 0x00,
-	0x3c, 0x00,
-	0x3d, 0x00,
-	0x3e, 0x00,
-	0x3f, 0x00,
-	0x40, 0x00,
-	0x41, 0x00,
-	0x42, 0x00,
-	0x43, 0x00,
-	0x44, 0x00,
-	0x45, 0x00,
-	0x46, 0x00,
-	0x47, 0x00,
-	0x48, 0x00,
-	0x49, 0x00,
-	0x4a, 0x00,
-	0x4b, 0x00,
-	0x4c, 0x00,
-	0x4d, 0x00,
-	0x4e, 0x00,
-	0x4f, 0x00
-};
-
-
-static
-int stv0299_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
-{
-	int ret;
-	u8 buf [] = { reg, data };
-	struct i2c_msg msg = { .addr = 0x68, .flags = 0, .buf = buf, .len = 2 };
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	ret = i2c->xfer (i2c, &msg, 1);
-
-	if (ret != 1) 
-		dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, ret == %i)\n",
-			__FUNCTION__, reg, data, ret);
-
-	return (ret != 1) ? -1 : 0;
-}
-
-
-static
-u8 stv0299_readreg (struct dvb_i2c_bus *i2c, u8 reg)
-{
-	int ret;
-	u8 b0 [] = { reg };
-	u8 b1 [] = { 0 };
-	struct i2c_msg msg [] = { { .addr = 0x68, .flags = 0, .buf = b0, .len = 1 },
-			   { .addr = 0x68, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
-        
-	dprintk ("%s\n", __FUNCTION__);
-
-	ret = i2c->xfer (i2c, msg, 2);
-        
-	if (ret != 2) 
-		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
-
-	return b1[0];
-}
-
-
-static
-int stv0299_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len)
-{
-        int ret;
-        struct i2c_msg msg [] = { { .addr = 0x68, .flags = 0, .buf = &reg1, .len = 1 },
-                           { .addr = 0x68, .flags = I2C_M_RD, .buf = b, .len = len } };
-
-	dprintk ("%s\n", __FUNCTION__);
-
-        ret = i2c->xfer (i2c, msg, 2);
-
-        if (ret != 2)
-                dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
-
-        return ret == 2 ? 0 : -1;
-}
-
-
-
-static
-int tsa5059_write (struct dvb_i2c_bus *i2c, u8 data [4])
-{
-	int ret;
-	u8 rpt1 [] = { 0x05, 0xb5 };  /*  enable i2c repeater on stv0299  */
-	struct i2c_msg msg [] = {{ .addr = 0x68, .flags = 0, .buf = rpt1, .len = 2 },
-				 { .addr = 0x61, .flags = 0, .buf = data, .len = 4 }};
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	ret = i2c->xfer (i2c, msg, 2);
-
-	if (ret != 2)
-		dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
-
-	return (ret != 2) ? -1 : 0;
-}
-
-
-/**
- *   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, u8 pwr)
-{
-	u32 div = freq / 125;
-	u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x84, (pwr << 5) | 0x20 };
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	return tsa5059_write (i2c, buf);
-}
-
-
-static
-int stv0299_init (struct dvb_i2c_bus *i2c)
-{
-	int i;
-
-	dprintk("stv0299: init chip\n");
-
-	for (i=0; i<sizeof(init_tab); i+=2)
-		stv0299_writereg (i2c, init_tab[i], init_tab[i+1]);
-
-	return 0;
-}
-
-
-static
-int stv0299_set_inversion (struct dvb_i2c_bus *i2c,
-			   fe_spectral_inversion_t inversion)
-{
-	u8 val;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-#ifdef CONFIG_ALPS_BSRU6_IS_LG_TDQBS00X    /*  reversed I/Q pins  */
-	switch (inversion) {
-	case INVERSION_AUTO:
-		return -EOPNOTSUPP;
-	case INVERSION_OFF:
-		val = stv0299_readreg (i2c, 0x0c);
-		return stv0299_writereg (i2c, 0x0c, val & 0xfe);
-	case INVERSION_ON:
-		val = stv0299_readreg (i2c, 0x0c);
-		return stv0299_writereg (i2c, 0x0c, val | 0x01);
-	default:
-		return -EINVAL;
-	};
-#else
-	switch (inversion) {
-	case INVERSION_AUTO:
-		return -EOPNOTSUPP;
-	case INVERSION_OFF:
-		val = stv0299_readreg (i2c, 0x0c);
-		return stv0299_writereg (i2c, 0x0c, val | 0x01);
-	case INVERSION_ON:
-		val = stv0299_readreg (i2c, 0x0c);
-		return stv0299_writereg (i2c, 0x0c, val & 0xfe);
-	default:
-		return -EINVAL;
-	};
-#endif
-}
-
-
-static
-int stv0299_set_FEC (struct dvb_i2c_bus *i2c, fe_code_rate_t fec)
-{
-	dprintk ("%s\n", __FUNCTION__);
-
-	switch (fec) {
-	case FEC_AUTO:
-		return stv0299_writereg (i2c, 0x31, 0x1f);
-	case FEC_1_2:
-		return stv0299_writereg (i2c, 0x31, 0x01);
-	case FEC_2_3:
-		return stv0299_writereg (i2c, 0x31, 0x02);
-	case FEC_3_4:
-		return stv0299_writereg (i2c, 0x31, 0x04);
-	case FEC_5_6:
-		return stv0299_writereg (i2c, 0x31, 0x08);
-	case FEC_7_8:
-		return stv0299_writereg (i2c, 0x31, 0x10);
-	default:
-		return -EINVAL;
-	}
-}
-
-
-static
-fe_code_rate_t stv0299_get_fec (struct dvb_i2c_bus *i2c)
-{
-	static fe_code_rate_t fec_tab [] = { FEC_2_3, FEC_3_4, FEC_5_6,
-					     FEC_7_8, FEC_1_2 };
-	u8 index;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	index = stv0299_readreg (i2c, 0x1b);
-	index &= 0x7;
-
-	if (index > 4)
-		return FEC_AUTO;
-
-	return fec_tab [index];
-}
-
-
-static
-int stv0299_wait_diseqc_fifo (struct dvb_i2c_bus *i2c, int timeout)
-{
-	unsigned long start = jiffies;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	while (stv0299_readreg(i2c, 0x0a) & 1) {
-		if (jiffies - start > timeout) {
-			dprintk ("%s: timeout!!\n", __FUNCTION__);
-			return -ETIMEDOUT;
-		}
-		current->state = TASK_INTERRUPTIBLE;
-		schedule_timeout (1);
-	};
-
-	return 0;
-}
-
-
-static
-int stv0299_wait_diseqc_idle (struct dvb_i2c_bus *i2c, int timeout)
-{
-	unsigned long start = jiffies;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	while ((stv0299_readreg(i2c, 0x0a) & 3) != 2 ) {
-		if (jiffies - start > timeout) {
-			dprintk ("%s: timeout!!\n", __FUNCTION__);
-			return -ETIMEDOUT;
-		}
-		current->state = TASK_INTERRUPTIBLE;
-		schedule_timeout (1);
-	};
-
-	return 0;
-}
-
-
-static
-int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c,
-			     struct dvb_diseqc_master_cmd *m)
-{
-	u8 val;
-	int i;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
-		return -ETIMEDOUT;
-
-	val = stv0299_readreg (i2c, 0x08);
-
-	if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x6))  /* DiSEqC mode */
-		return -EREMOTEIO;
-
-	for (i=0; i<m->msg_len; i++) {
-		if (stv0299_wait_diseqc_fifo (i2c, 100) < 0)
-			return -ETIMEDOUT;
-
-		if (stv0299_writereg (i2c, 0x09, m->msg[i]))
-			return -EREMOTEIO;
-	}
-
-	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
-		return -ETIMEDOUT;
-
-	return 0;
-}
-
-
-static
-int stv0299_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst)
-{
-	u8 val;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
-		return -ETIMEDOUT;
-
-	val = stv0299_readreg (i2c, 0x08);
-
-	if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x2))   /* burst mode */
-		return -EREMOTEIO;
-
-	if (stv0299_writereg (i2c, 0x09, burst == SEC_MINI_A ? 0x00 : 0xff))
-		return -EREMOTEIO;
-
-	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
-		return -ETIMEDOUT;
-
-	if (stv0299_writereg (i2c, 0x08, val))
-		return -EREMOTEIO;
-
-	return 0;
-}
-
-
-static
-int stv0299_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone)
-{
-	u8 val;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
-		return -ETIMEDOUT;
-
-	val = stv0299_readreg (i2c, 0x08);
-
-	switch (tone) {
-	case SEC_TONE_ON:
-		return stv0299_writereg (i2c, 0x08, val | 0x3);
-	case SEC_TONE_OFF:
-		return stv0299_writereg (i2c, 0x08, (val & ~0x3) | 0x02);
-	default:
-		return -EINVAL;
-	};
-}
-
-
-static
-int stv0299_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage)
-{
-	u8 val;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	val = stv0299_readreg (i2c, 0x0c);
-	val &= 0x0f;
-	val |= 0x40;
-	
-	switch (voltage) {
-	case SEC_VOLTAGE_13:
-		return stv0299_writereg (i2c, 0x0c, val);
-	case SEC_VOLTAGE_18:
-		return stv0299_writereg (i2c, 0x0c, val | 0x10);
-	default:
-		return -EINVAL;
-	};
-}
-
-	
-static
-int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
-{
-	u32 ratio;
-	u32 tmp;
-	u8 aclk = 0xb4, bclk = 0x51;
-
-	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; }
-
-#define FIN (M_CLK >> 4)
-
-	tmp = srate << 4;
-	ratio = tmp / FIN;
-        
-	tmp = (tmp % FIN) << 8;
-	ratio = (ratio << 8) + tmp / FIN;
-        
-	tmp = (tmp % FIN) << 8;
-	ratio = (ratio << 8) + tmp / FIN;
-  
-	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);
-
-	return 0;
-}
-
-
-static
-int stv0299_get_symbolrate (struct dvb_i2c_bus *i2c)
-{
-	u32 Mclk = M_CLK / 4096L;
-	u32 srate;
-	s32 offset;
-	u8 sfr[3];
-	s8 rtf;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	stv0299_readregs (i2c, 0x1f, sfr, 3);
-	stv0299_readregs (i2c, 0x1a, &rtf, 1);
-
-	srate = (sfr[0] << 8) | sfr[1];
-	srate *= Mclk;
-	srate /= 16;
-	srate += (sfr[2] >> 4) * Mclk / 256;
-
-	offset = (s32) rtf * (srate / 4096L);
-	offset /= 128;
-
-	srate += offset;
-
-	srate += 1000;
-	srate /= 2000;
-	srate *= 2000;
-
-	return srate;
-}
-
-
-static
-int bsru6_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
-{
-	struct dvb_i2c_bus *i2c = fe->i2c;
-
-	dprintk ("%s\n", __FUNCTION__);
-
-	switch (cmd) {
-	case FE_GET_INFO:
-		memcpy (arg, &bsru6_info, sizeof(struct dvb_frontend_info));
-		break;
-
-	case FE_READ_STATUS:
-	{
-		fe_status_t *status = (fe_status_t *) arg;
-		u8 signal = 0xff - stv0299_readreg (i2c, 0x18);
-		u8 sync = stv0299_readreg (i2c, 0x1b);
-
-		*status = 0;
-
-		if (signal > 10)
-			*status |= FE_HAS_SIGNAL;
-
-		if (sync & 0x80)
-			*status |= FE_HAS_CARRIER;
-
-		if (sync & 0x10)
-			*status |= FE_HAS_VITERBI;
-
-		if (sync & 0x08)
-			*status |= FE_HAS_SYNC;
-
-		if ((sync & 0x98) == 0x98)
-			*status |= FE_HAS_LOCK;
-
-		break;
-	}
-
-        case FE_READ_BER:
-		*((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
-			       | stv0299_readreg (i2c, 0x1e);
-		break;
-
-	case FE_READ_SIGNAL_STRENGTH:
-	{
-		s32 signal =  0xffff - ((stv0299_readreg (i2c, 0x18) << 8)
-			               | stv0299_readreg (i2c, 0x19));
-		signal = signal * 5 / 4;
-		*((u16*) arg) = (signal > 0xffff) ? 0xffff :
-				(signal < 0) ? 0 : signal;
-		break;
-	}
-        case FE_READ_SNR:
-	{
-		s32 snr = 0xffff - ((stv0299_readreg (i2c, 0x24) << 8)
-			           | stv0299_readreg (i2c, 0x25));
-		snr = 3 * (snr - 0xa100);
-		*((u16*) arg) = (snr > 0xffff) ? 0xffff :
-				(snr < 0) ? 0 : 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;
-
-		tsa5059_set_tv_freq (i2c, p->frequency, 3);
-		stv0299_set_inversion (i2c, p->inversion);
-                stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
-                stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
-		tsa5059_set_tv_freq (i2c, p->frequency, 0);
-		stv0299_writereg (i2c, 0x22, 0x00);
-		stv0299_writereg (i2c, 0x23, 0x00);
-		stv0299_readreg (i2c, 0x23);
-		stv0299_writereg (i2c, 0x12, 0xb9);
-                break;
-        }
-
-        case FE_GET_FRONTEND:
-        {
-		struct dvb_frontend_parameters *p = arg;
-		s32 derot_freq;
-
-		derot_freq = (s32)(s16) ((stv0299_readreg (i2c, 0x22) << 8)
-					| stv0299_readreg (i2c, 0x23));
-
-		derot_freq *= (M_CLK >> 16);
-		derot_freq += 500;
-		derot_freq /= 1000;
-
-		p->frequency += derot_freq;
-		p->inversion = (stv0299_readreg (i2c, 0x0c) & 1) ?
-						INVERSION_OFF : INVERSION_ON;
-		p->u.qpsk.fec_inner = stv0299_get_fec (i2c);
-		p->u.qpsk.symbol_rate = stv0299_get_symbolrate (i2c);
-                break;
-        }
-
-        case FE_SLEEP:
-		stv0299_writereg (i2c, 0x0c, 0x00);  /*  LNB power off! */
-		stv0299_writereg (i2c, 0x02, 0x80);
-		break;
-
-        case FE_INIT:
-		return stv0299_init (i2c);
-
-        case FE_RESET:
-		stv0299_writereg (i2c, 0x22, 0x00);
-		stv0299_writereg (i2c, 0x23, 0x00);
-		stv0299_readreg (i2c, 0x23);
-		stv0299_writereg (i2c, 0x12, 0xb9);
-                break;
-
-	case FE_DISEQC_SEND_MASTER_CMD:
-		return stv0299_send_diseqc_msg (i2c, arg);
-
-	case FE_DISEQC_SEND_BURST:
-		return stv0299_send_diseqc_burst (i2c, (fe_sec_mini_cmd_t) arg);
-
-	case FE_SET_TONE:
-		return stv0299_set_tone (i2c, (fe_sec_tone_mode_t) arg);
-
-	case FE_SET_VOLTAGE:
-		return stv0299_set_voltage (i2c, (fe_sec_voltage_t) arg);
-
-	default:
-		return -EOPNOTSUPP;
-	};
-
-	return 0;
-}
-
-
-
-static
-int bsru6_attach (struct dvb_i2c_bus *i2c)
-{
-	dprintk ("%s\n", __FUNCTION__);
-
-	if ((stv0299_readreg (i2c, 0x00)) != 0xa1)
-                return -ENODEV;
-
-	dvb_register_frontend (bsru6_ioctl, i2c, NULL, &bsru6_info);
-
-	return 0;
-}
-
-
-static
-void bsru6_detach (struct dvb_i2c_bus *i2c)
-{
-	dprintk ("%s\n", __FUNCTION__);
-
-	dvb_unregister_frontend (bsru6_ioctl, i2c);
-}
-
-
-static
-int __init init_bsru6 (void)
-{
-	dprintk ("%s\n", __FUNCTION__);
-
-	return dvb_register_i2c_device (THIS_MODULE, bsru6_attach, bsru6_detach);
-}
-
-
-static 
-void __exit exit_bsru6 (void)
-{
-	dprintk ("%s\n", __FUNCTION__);
-
-	dvb_unregister_i2c_device (bsru6_attach);
-}
-
-module_init (init_bsru6);
-module_exit (exit_bsru6);
-
-MODULE_PARM(debug,"i");
-MODULE_PARM_DESC(debug, "enable verbose debug messages");
-MODULE_DESCRIPTION("Alps BSRU6/LG TDQB-S00x DVB Frontend driver");
-MODULE_AUTHOR("Ralph Metzler, Holger Waechtler");
-MODULE_LICENSE("GPL");
-
diff -Nru a/drivers/media/dvb/frontends/alps_bsrv2.c b/drivers/media/dvb/frontends/alps_bsrv2.c
--- a/drivers/media/dvb/frontends/alps_bsrv2.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/media/dvb/frontends/alps_bsrv2.c	Sat Apr 19 19:51:28 2003
@@ -23,7 +23,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-#include "compat.h"
 #include "dvb_frontend.h"
 
 static int debug = 0;
@@ -32,20 +31,20 @@
 
 static
 struct dvb_frontend_info bsrv2_info = {
-	.name			= "Alps BSRV2",
-	.type			= FE_QPSK,
-	.frequency_min		= 950000,
-	.frequency_max		= 2150000,
-	.frequency_stepsize	= 250,           /* kHz for QPSK frontends */
-	.frequency_tolerance	= 29500,
-	.symbol_rate_min	= 1000000,
-	.symbol_rate_max	= 45000000,
-	.notifier_delay		= 50,                /* 1/20 s */
-	.caps			= FE_CAN_INVERSION_AUTO |
-				  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
+	name: "Alps BSRV2",
+	type: FE_QPSK,
+	frequency_min: 950000,
+	frequency_max: 2150000,
+	frequency_stepsize: 250,           /* 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_INVERSION_AUTO |
+		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
 };
 
 
@@ -73,10 +72,10 @@
 
 
 static
-int ves1893_writereg (struct dvb_i2c_bus *i2c, int reg, int data)
+int ves1893_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
 {
         u8 buf [] = { 0x00, reg, data };
-	struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = buf, .len = 3 };
+	struct i2c_msg msg = { addr: 0x08, flags: 0, buf: buf, len: 3 };
 	int err;
 
         if ((err = i2c->xfer (i2c, &msg, 1)) != 1) {
@@ -94,8 +93,8 @@
 	int ret;
 	u8 b0 [] = { 0x00, reg };
 	u8 b1 [] = { 0 };
-	struct i2c_msg msg [] = { { .addr = 0x08, .flags = 0, .buf = b0, .len = 2 },
-			   { .addr = 0x08, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+	struct i2c_msg msg [] = { { addr: 0x08, flags: 0, buf: b0, len: 2 },
+			   { addr: 0x08, flags: I2C_M_RD, buf: b1, len: 1 } };
 
 	ret = i2c->xfer (i2c, msg, 2);
 
@@ -110,7 +109,7 @@
 int sp5659_write (struct dvb_i2c_bus *i2c, u8 data [4])
 {
         int ret;
-        struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = 4 };
+        struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 };
 
         ret = i2c->xfer (i2c, &msg, 1);
 
@@ -297,7 +296,7 @@
 		return ves1893_writereg (i2c, 0x1f, 0x30);
 	default:
 		return -EINVAL;
-	};
+	}
 }
 
 
@@ -314,7 +313,7 @@
         case FE_READ_STATUS:
 	{
 		fe_status_t *status = arg;
-		int sync = ves1893_readreg (i2c, 0x0e);
+		u8 sync = ves1893_readreg (i2c, 0x0e);
 
 		*status = 0;
 
diff -Nru a/drivers/media/dvb/frontends/alps_tdlb7.c b/drivers/media/dvb/frontends/alps_tdlb7.c
--- a/drivers/media/dvb/frontends/alps_tdlb7.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/media/dvb/frontends/alps_tdlb7.c	Sat Apr 19 19:51:29 2003
@@ -51,7 +51,6 @@
 #include <linux/fs.h>
 #include <linux/unistd.h>
 
-#include "compat.h"
 #include "dvb_frontend.h"
 
 static int debug = 0;
@@ -63,7 +62,7 @@
 #define dprintk	if (debug) printk
 
 /* microcode size for sp8870 */
-#define SP8870_CODE_SIZE 16384
+#define SP8870_CODE_SIZE 16382
 
 /* starting point for microcode in file 'Sc_main.mc' */
 #define SP8870_CODE_OFFSET 0x0A
@@ -73,15 +72,21 @@
 
 static
 struct dvb_frontend_info tdlb7_info = {
-	.name			= "Alps TDLB7",
-	.type			= FE_OFDM,
-	.frequency_min		= 470000000,
-	.frequency_max		= 860000000,
-	.frequency_stepsize	= 166666,
-	.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
+	name: "Alps TDLB7",
+	type: FE_OFDM,
+	frequency_min: 470000000,
+	frequency_max: 860000000,
+	frequency_stepsize: 166666,
+#if 0
+    	frequency_tolerance: ???,
+	symbol_rate_min: ???,
+	symbol_rate_max: ???,
+	symbol_rate_tolerance: ???,
+	notifier_delay: 0,
+#endif
+	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
 };
 
 
@@ -89,7 +94,7 @@
 int sp8870_writereg (struct dvb_i2c_bus *i2c, u16 reg, u16 data)
 {
         u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
-	struct i2c_msg msg = { .addr = 0x71, .flags = 0, .buf = buf, .len = 4 };
+	struct i2c_msg msg = { addr: 0x71, flags: 0, buf: buf, len: 4 };
 	int err;
 
         if ((err = i2c->xfer (i2c, &msg, 1)) != 1) {
@@ -107,8 +112,8 @@
 	int ret;
 	u8 b0 [] = { reg >> 8 , reg & 0xff };
 	u8 b1 [] = { 0, 0 };
-	struct i2c_msg msg [] = { { .addr = 0x71, .flags = 0, .buf = b0, .len = 2 },
-			   { .addr = 0x71, .flags = I2C_M_RD, .buf = b1, .len = 2 } };
+	struct i2c_msg msg [] = { { addr: 0x71, flags: 0, buf: b0, len: 2 },
+			   { addr: 0x71, flags: I2C_M_RD, buf: b1, len: 2 } };
 
 	ret = i2c->xfer (i2c, msg, 2);
 
@@ -123,7 +128,7 @@
 int sp5659_write (struct dvb_i2c_bus *i2c, u8 data [4])
 {
         int ret;
-        struct i2c_msg msg = { .addr = 0x60, .flags = 0, .buf = data, .len = 4 };
+        struct i2c_msg msg = { addr: 0x60, flags: 0, buf: data, len: 4 };
 
         ret = i2c->xfer (i2c, &msg, 1);
 
@@ -135,10 +140,21 @@
 
 
 static
-int sp5659_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr)
+int sp5659_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq)
 {
         u32 div = (freq + 36200000) / 166666;
-        u8 buf [4] = { (div >> 8) & 0x7f, div & 0xff, 0x85, (pwr << 5) | 0x30 };
+        u8 buf [4];
+	int pwr;
+
+	if (freq <= 782000000)
+		pwr = 1;
+	else 
+		pwr = 2;
+
+	buf[0] = (div >> 8) & 0x7f;
+	buf[1] = div & 0xff;
+	buf[2] = 0x85;
+	buf[3] = pwr << 6;
 
 	return sp5659_write (i2c, buf);
 }
@@ -193,8 +209,14 @@
 	int c;
 	mm_segment_t fs = get_fs();
 
-	sp8870_writereg(i2c,0x8F08,0x1FFF);
-	sp8870_writereg(i2c,0x8F0A,0x0000);
+	// system controller stop 
+	sp8870_writereg(i2c,0x0F00,0x0000);
+
+	// instruction RAM register hiword
+	sp8870_writereg(i2c,0x8F08,((SP8870_CODE_SIZE/2) & 0xFFFF));
+
+	// instruction RAM MWR
+	sp8870_writereg(i2c,0x8F0A,((SP8870_CODE_SIZE/2) >> 16));
 
 	set_fs(get_ds());
         if (sp8870_read_code(mcfile,(char**) &lcode)<0) return -1;
@@ -210,7 +232,8 @@
 		msg.buf=buf;
 		msg.len=c;
         	if ((err = i2c->xfer (i2c, &msg, 1)) != 1) {
-			dprintk ("%s: i2c error (err == %i)\n", __FUNCTION__, err);
+			dprintk ("%s: i2c error (err == %i)\n",
+				 __FUNCTION__, err);
         		vfree(lcode);
 			return -EREMOTEIO;
 		}
@@ -228,49 +251,40 @@
 
 	dprintk ("%s\n", __FUNCTION__);
 
-	sp8870_readreg(i2c,0x200);
-     	sp8870_readreg(i2c,0x200);
-	sp8870_readreg(i2c,0x0F00);	/* system controller stop */
-	sp8870_readreg(i2c,0x0301);	/* ???????? */
-	sp8870_readreg(i2c,0x0309);	/* integer carrier offset */
-	sp8870_readreg(i2c,0x030A);	/* fractional carrier offset */
-	sp8870_readreg(i2c,0x0311);	/* filter for 8 Mhz channel */
-	sp8870_readreg(i2c,0x0319);	/* sample rate correction bit [23..17] */
-	sp8870_readreg(i2c,0x031A);	/* sample rate correction bit [16..0] */
-	sp8870_readreg(i2c,0x0338);	/* ???????? */
-	sp8870_readreg(i2c,0x0F00);
-	sp8870_readreg(i2c,0x0200);
+	// system controller stop 
+	sp8870_writereg(i2c,0x0F00,0x0000);
 
-	if (loadcode) {
-		dprintk("%s: loading mcfile '%s' !\n", __FUNCTION__, mcfile);
-		if (sp8870_load_code(i2c)==0)
-		    dprintk("%s: microcode loaded!\n", __FUNCTION__);
-	}else{
-		dprintk("%s: without loading mcfile!\n", __FUNCTION__);
-	}
+	// ADC mode: 2 for MT8872, 3 for MT8870/8871 
+	sp8870_writereg(i2c,0x0301,0x0003);
 
-	return 0;
-}
+	// Reed Solomon parity bytes passed to output
+	sp8870_writereg(i2c,0x0C13,0x0001);
 
+	// MPEG clock is suppressed if no valid data
+	sp8870_writereg(i2c,0x0C14,0x0001);
 
-static
-int sp8870_reset (struct dvb_i2c_bus *i2c)
-{
-	dprintk("%s\n", __FUNCTION__);
-	sp8870_writereg(i2c,0x0F00,0x0000);	/* system controller stop */
-	sp8870_writereg(i2c,0x0301,0x0003);	/* ???????? */
-	sp8870_writereg(i2c,0x0309,0x0400);	/* integer carrier offset */
-	sp8870_writereg(i2c,0x030A,0x0000);	/* fractional carrier offset */
-	sp8870_writereg(i2c,0x0311,0x0000);	/* filter for 8 Mhz channel */
-	sp8870_writereg(i2c,0x0319,0x000A);	/* sample rate correction bit [23..17] */
-	sp8870_writereg(i2c,0x031A,0x0AAB);	/* sample rate correction bit [16..0] */
-	sp8870_writereg(i2c,0x0338,0x0000);	/* ???????? */
-	sp8870_writereg(i2c,0x0201,0x0000);	/* interrupts for change of lock or tuner adjustment disabled */
-	sp8870_writereg(i2c,0x0F00,0x0001);	/* system controller start */
+	// sample rate correction bit [23..17]
+	sp8870_writereg(i2c,0x0319,0x000A);
 
-        return 0;
+	// sample rate correction bit [16..0]
+	sp8870_writereg(i2c,0x031A,0x0AAB);
+
+	// integer carrier offset
+	sp8870_writereg(i2c,0x0309,0x0400);
+
+	// fractional carrier offset
+	sp8870_writereg(i2c,0x030A,0x0000);
+
+	// filter for 8 Mhz channel 
+	sp8870_writereg(i2c,0x0311,0x0000);
+
+	// scan order: 2k first = 0x0000, 8k first = 0x0001 
+	sp8870_writereg(i2c,0x0338,0x0000);
+
+	return 0;
 }
 
+
 static
 int tdlb7_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
 {
@@ -285,10 +299,10 @@
 	{
 		fe_status_t *status = arg;
 		int sync = sp8870_readreg (i2c, 0x0200);
+		int signal = 0xff-sp8870_readreg (i2c, 0x303);
 
 		*status=0;
-
-		if (sync&0x04) // FIXME: find criteria for having signal
+		if (signal>10) // FIXME: is 10 the right value ?
 			*status |= FE_HAS_SIGNAL;
 
 		if (sync&0x04) // FIXME: find criteria
@@ -309,15 +323,15 @@
         case FE_READ_BER:
 	{
 		u32 *ber=(u32 *) arg;
-		*ber=sp8870_readreg(i2c,0x0C07);  // bit error rate before Viterbi
+		// bit error rate before Viterbi
+		*ber=sp8870_readreg(i2c,0x0C07);
 		break;
 
 	}
 
-        case FE_READ_SIGNAL_STRENGTH:		// not supported by hardware?
+        case FE_READ_SIGNAL_STRENGTH:		// FIXME: correct registers ?
 	{
-		s32 *signal=(s32 *) arg;
-                *signal=0;
+		*((u16*) arg) = 0xffff-((sp8870_readreg (i2c, 0x306) << 8) | sp8870_readreg (i2c, 0x303));
 		break;
 	}
 
@@ -325,27 +339,64 @@
 	{
 		s32 *snr=(s32 *) arg;
                 *snr=0;  
-		break;
+		return -EOPNOTSUPP;
 	}
 
 	case FE_READ_UNCORRECTED_BLOCKS: 	// not supported by hardware?
 	{
 		u32 *ublocks=(u32 *) arg;
 		*ublocks=0;  
-		break;
+		return -EOPNOTSUPP;
 	}
 
         case FE_SET_FRONTEND:
         {
 		struct dvb_frontend_parameters *p = arg;
-		sp5659_set_tv_freq (i2c, p->frequency, 0);
-		 			// all other parameters are set by the on card
-					// system controller. Don't know how to pass 
-					// distinct values to the card.
-		break;			
+
+		// system controller stop 
+		sp8870_writereg(i2c,0x0F00,0x0000);
+
+		sp5659_set_tv_freq (i2c, p->frequency);
+
+		// sample rate correction bit [23..17]
+		sp8870_writereg(i2c,0x0319,0x000A);
+		
+		// sample rate correction bit [16..0]
+		sp8870_writereg(i2c,0x031A,0x0AAB);
+
+		// integer carrier offset 
+		sp8870_writereg(i2c,0x0309,0x0400);
+
+		// fractional carrier offset
+		sp8870_writereg(i2c,0x030A,0x0000);
+
+		// filter for 6/7/8 Mhz channel
+		if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ)
+			sp8870_writereg(i2c,0x0311,0x0002);
+		else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ)
+			sp8870_writereg(i2c,0x0311,0x0001);
+		else
+			sp8870_writereg(i2c,0x0311,0x0000);
+
+		// scan order: 2k first = 0x0000, 8k first = 0x0001 
+		if (p->u.ofdm.transmission_mode == TRANSMISSION_MODE_2K)
+			sp8870_writereg(i2c,0x0338,0x0000);
+		else
+			sp8870_writereg(i2c,0x0338,0x0001);
+
+		// instruction RAM register loword
+		sp8870_writereg(i2c,0x0F09,0x0000);
+
+		// instruction RAM register hiword
+		sp8870_writereg(i2c,0x0F08,0x0000);
+
+		// system controller start
+		sp8870_writereg(i2c,0x0F00,0x0001);
+
+		break;
         }
 
-	case FE_GET_FRONTEND: 		// how to do this?
+	case FE_GET_FRONTEND:  // FIXME: read known values back from Hardware...
 	{
 		break;
 	}
@@ -356,9 +407,6 @@
         case FE_INIT:
 		return sp8870_init (i2c);
 
-	case FE_RESET:
-		return sp8870_reset (i2c);
-
 	default:
 		return -EOPNOTSUPP;
         };
@@ -371,12 +419,20 @@
 int tdlb7_attach (struct dvb_i2c_bus *i2c)
 {
 
-	struct i2c_msg msg = { .addr = 0x71, .flags = 0, .buf = NULL, .len = 0 };
+	struct i2c_msg msg = { addr: 0x71, flags: 0, buf: NULL, len: 0 };
 
 	dprintk ("%s\n", __FUNCTION__);
 
 	if (i2c->xfer (i2c, &msg, 1) != 1)
                 return -ENODEV;
+
+	if (loadcode) {
+		dprintk("%s: loading mcfile '%s' !\n", __FUNCTION__, mcfile);
+		if (sp8870_load_code(i2c)==0)
+		    dprintk("%s: microcode loaded!\n", __FUNCTION__);
+	}else{
+		dprintk("%s: without loading mcfile!\n", __FUNCTION__);
+	}
 
 	dvb_register_frontend (tdlb7_ioctl, i2c, NULL, &tdlb7_info);
 
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	Sat Apr 19 19:51:29 2003
+++ b/drivers/media/dvb/frontends/alps_tdmb7.c	Sat Apr 19 19:51:29 2003
@@ -23,7 +23,6 @@
 #include <linux/init.h>
 #include <linux/module.h>
 
-#include "compat.h"
 #include "dvb_frontend.h"
 
 
@@ -33,15 +32,22 @@
 
 static
 struct dvb_frontend_info tdmb7_info = {
-	.name			= "Alps TDMB7",
-	.type			= FE_OFDM,
-	.frequency_min		= 470000000,
-	.frequency_max		= 860000000,
-	.frequency_stepsize	= 166667,
-	.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
+	name: "Alps TDMB7",
+	type: FE_OFDM,
+	frequency_min: 470000000,
+	frequency_max: 860000000,
+	frequency_stepsize: 166667,
+#if 0
+    	frequency_tolerance: ???,
+	symbol_rate_min: ???,
+	symbol_rate_max: ???,
+	symbol_rate_tolerance: 500,  /* ppm */
+	notifier_delay: 0,
+#endif
+	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_CLEAN_SETUP | FE_CAN_RECOVER
 };
 
 
@@ -81,7 +87,7 @@
 {
 	int ret;
 	u8 buf [] = { reg, data };
-	struct i2c_msg msg = { .addr = 0x43, .flags = 0, .buf = buf, .len = 2 };
+	struct i2c_msg msg = { addr: 0x43, flags: 0, buf: buf, len: 2 };
 
 	dprintk ("%s\n", __FUNCTION__);
 
@@ -101,8 +107,8 @@
 	int ret;
 	u8 b0 [] = { reg };
 	u8 b1 [] = { 0 };
-	struct i2c_msg msg [] = { { .addr = 0x43, .flags = 0, .buf = b0, .len = 1 },
-			   { .addr = 0x43, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+	struct i2c_msg msg [] = { { addr: 0x43, flags: 0, buf: b0, len: 1 },
+			   { addr: 0x43, flags: I2C_M_RD, buf: b1, len: 1 } };
         
 	dprintk ("%s\n", __FUNCTION__);
 
@@ -118,7 +124,7 @@
 static
 int pll_write (struct dvb_i2c_bus *i2c, u8 data [4])
 {
-	struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = 4 };
+	struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 };
 	int ret;
 
 	cx22700_writereg (i2c, 0x0a, 0x00);  /* open i2c bus switch */
@@ -350,6 +356,7 @@
 
         case FE_READ_BER:
 		*((uint32_t*) arg) = cx22700_readreg (i2c, 0x0c) & 0x7f;
+		cx22700_writereg (i2c, 0x0c, 0x00);
 		break;
 
 	case FE_READ_SIGNAL_STRENGTH:
@@ -368,6 +375,7 @@
 	}
 	case FE_READ_UNCORRECTED_BLOCKS: 
 		*((uint32_t*) arg) = cx22700_readreg (i2c, 0x0f);
+		cx22700_writereg (i2c, 0x0f, 0x00);
 		break;
 
         case FE_SET_FRONTEND:
@@ -412,7 +420,7 @@
 static
 int tdmb7_attach (struct dvb_i2c_bus *i2c)
 {
-	struct i2c_msg msg = { .addr = 0x43, .flags = 0, .buf = NULL, .len = 0 };
+	struct i2c_msg msg = { addr: 0x43, flags: 0, buf: NULL, len: 0 };
 
 	dprintk ("%s\n", __FUNCTION__);
 
diff -Nru a/drivers/media/dvb/frontends/at76c651.c b/drivers/media/dvb/frontends/at76c651.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/frontends/at76c651.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,542 @@
+/*
+ * at76c651.c
+ * 
+ * Atmel DVB-C Frontend Driver (at76c651/dat7021)
+ *
+ * Copyright (C) 2001 fnbrd <fnbrd@gmx.de>
+ *             & 2002 Andreas Oberritter <andreas@oberritter.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/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+
+#if defined(__powerpc__)
+#include <asm/bitops.h>
+#endif
+
+#include "dvb_frontend.h"
+#include "dvb_i2c.h"
+
+static int debug = 0;
+
+#define dprintk	if (debug) printk
+
+/*
+ * DAT7021
+ * -------
+ * Input Frequency Range (RF): 48.25 MHz to 863.25 MHz
+ * Band Width: 8 MHz
+ * Level Input (Range for Digital Signals): -61 dBm to -41 dBm
+ * Output Frequency (IF): 36 MHz
+ *
+ * (see http://www.atmel.com/atmel/acrobat/doc1320.pdf)
+ */
+
+static struct dvb_frontend_info at76c651_info = {
+
+	.name = "Atmel AT76c651(B) with DAT7021",
+	.type = FE_QAM,
+	.frequency_min = 48250000,
+	.frequency_max = 863250000,
+	.frequency_stepsize = 62500,
+	/*.frequency_tolerance = */	/* FIXME: 12% of SR */
+	.symbol_rate_min = 0,		/* FIXME */
+	.symbol_rate_max = 9360000,	/* FIXME */
+	.symbol_rate_tolerance = 4000,
+	.notifier_delay = 0,
+	.caps = FE_CAN_INVERSION_AUTO |
+	    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_32 | FE_CAN_QAM_64 | FE_CAN_QAM_128 |
+	    FE_CAN_QAM_256,
+	/* FE_CAN_QAM_512 | FE_CAN_QAM_1024 |  */
+
+};
+
+#if ! defined(__powerpc__)
+static __inline__ int
+__ilog2(unsigned long x)
+{
+	int i;
+
+	if (x == 0)
+		return -1;
+
+	for (i = 0; x != 0; i++)
+		x >>= 1;
+
+	return i - 1;
+}
+#endif
+
+static int
+at76c651_writereg(struct dvb_i2c_bus *i2c, u8 reg, u8 data)
+{
+
+	int ret;
+	u8 buf[] = { reg, data };
+	struct i2c_msg msg = { addr:0x1a >> 1, flags:0, buf:buf, len:2 };
+
+	ret = i2c->xfer(i2c, &msg, 1);
+
+	if (ret != 1)
+		dprintk("%s: writereg error "
+			"(reg == 0x%02x, val == 0x%02x, ret == %i)\n",
+			__FUNCTION__, reg, data, ret);
+
+	mdelay(10);
+
+	return (ret != 1) ? -EREMOTEIO : 0;
+
+}
+
+static u8
+at76c651_readreg(struct dvb_i2c_bus *i2c, u8 reg)
+{
+
+	int ret;
+	u8 b0[] = { reg };
+	u8 b1[] = { 0 };
+	struct i2c_msg msg[] = { {addr: 0x1a >> 1, flags: 0, buf: b0, len:1},
+			  {addr: 0x1a >> 1, flags: I2C_M_RD, buf: b1, len:1} };
+
+	ret = i2c->xfer(i2c, msg, 2);
+
+	if (ret != 2)
+		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
+
+	return b1[0];
+
+}
+
+static int
+at76c651_set_auto_config(struct dvb_i2c_bus *i2c)
+{
+
+	at76c651_writereg(i2c, 0x06, 0x01);
+
+	/*
+	 * performance optimizations 
+	 */
+
+	at76c651_writereg(i2c, 0x10, 0x06);
+	at76c651_writereg(i2c, 0x11, 0x10);
+	at76c651_writereg(i2c, 0x15, 0x28);
+	at76c651_writereg(i2c, 0x20, 0x09);
+	at76c651_writereg(i2c, 0x24, 0x90);
+
+	return 0;
+
+}
+
+static int
+at76c651_set_bbfreq(struct dvb_i2c_bus *i2c)
+{
+
+	at76c651_writereg(i2c, 0x04, 0x3f);
+	at76c651_writereg(i2c, 0x05, 0xee);
+
+	return 0;
+
+}
+
+static int
+at76c651_reset(struct dvb_i2c_bus *i2c)
+{
+
+	return at76c651_writereg(i2c, 0x07, 0x01);
+
+}
+
+static int
+at76c651_disable_interrupts(struct dvb_i2c_bus *i2c)
+{
+
+	return at76c651_writereg(i2c, 0x0b, 0x00);
+
+}
+
+static int
+at76c651_switch_tuner_i2c(struct dvb_i2c_bus *i2c, u8 enable)
+{
+
+	if (enable)
+		return at76c651_writereg(i2c, 0x0c, 0xc2 | 0x01);
+	else
+		return at76c651_writereg(i2c, 0x0c, 0xc2);
+
+}
+
+static int
+dat7021_write(struct dvb_i2c_bus *i2c, u32 tw)
+{
+
+	int ret;
+	struct i2c_msg msg =
+	    { addr:0xc2 >> 1, flags:0, buf:(u8 *) & tw, len:sizeof (tw) };
+
+	at76c651_switch_tuner_i2c(i2c, 1);
+
+	ret = i2c->xfer(i2c, &msg, 1);
+
+	at76c651_switch_tuner_i2c(i2c, 0);
+
+	if (ret != 4)
+		return -EFAULT;
+
+	at76c651_reset(i2c);
+
+	return 0;
+
+}
+
+static int
+dat7021_set_tv_freq(struct dvb_i2c_bus *i2c, u32 freq)
+{
+
+	u32 dw;
+
+	freq /= 1000;
+
+	if ((freq < 48250) || (freq > 863250))
+		return -EINVAL;
+
+	/*
+	 * formula: dw=0x17e28e06+(freq-346000UL)/8000UL*0x800000
+	 *      or: dw=0x4E28E06+(freq-42000) / 125 * 0x20000
+	 */
+
+	dw = (freq - 42000) * 4096;
+	dw = dw / 125;
+	dw = dw * 32;
+
+	if (freq > 394000)
+		dw += 0x4E28E85;
+	else
+		dw += 0x4E28E06;
+
+	return dat7021_write(i2c, dw);
+
+}
+
+static int
+at76c651_set_symbolrate(struct dvb_i2c_bus *i2c, u32 symbolrate)
+{
+
+	u8 exponent;
+	u32 mantissa;
+
+	if (symbolrate > 9360000)
+		return -1;
+
+	/*
+	 * FREF = 57800 kHz
+	 * exponent = 10 + floor ( log2 ( symbolrate / FREF ) )
+	 * mantissa = ( symbolrate / FREF) * ( 1 << ( 30 - exponent ) )
+	 */
+
+	exponent = __ilog2((symbolrate << 4) / 903125);
+	mantissa = ((symbolrate / 3125) * (1 << (24 - exponent))) / 289;
+
+	at76c651_writereg(i2c, 0x00, mantissa >> 13);
+	at76c651_writereg(i2c, 0x01, mantissa >> 5);
+	at76c651_writereg(i2c, 0x02, (mantissa << 3) | exponent);
+
+	return 0;
+
+}
+
+static int
+at76c651_set_qam(struct dvb_i2c_bus *i2c, fe_modulation_t qam)
+{
+
+	u8 qamsel = 0;
+
+	switch (qam) {
+
+	case QPSK:
+		qamsel = 0x02;
+		break;
+	case QAM_16:
+		qamsel = 0x04;
+		break;
+	case QAM_32:
+		qamsel = 0x05;
+		break;
+	case QAM_64:
+		qamsel = 0x06;
+		break;
+	case QAM_128:
+		qamsel = 0x07;
+		break;
+	case QAM_256:
+		qamsel = 0x08;
+		break;
+#if 0
+	case QAM_512:
+		qamsel = 0x09;
+		break;
+	case QAM_1024:
+		qamsel = 0x0A;
+		break;
+#endif
+	default:
+		return -EINVAL;
+
+	}
+
+	return at76c651_writereg(i2c, 0x03, qamsel);
+
+}
+
+static int
+at76c651_set_inversion(struct dvb_i2c_bus *i2c,
+		       fe_spectral_inversion_t inversion)
+{
+
+	u8 feciqinv = at76c651_readreg(i2c, 0x60);
+
+	switch (inversion) {
+	case INVERSION_OFF:
+		feciqinv |= 0x02;
+		feciqinv &= 0xFE;
+		break;
+
+	case INVERSION_ON:
+		feciqinv |= 0x03;
+		break;
+
+	case INVERSION_AUTO:
+		feciqinv &= 0xFC;
+		break;
+
+	default:
+		return -EINVAL;
+	}
+
+	return at76c651_writereg(i2c, 0x60, feciqinv);
+
+}
+
+static int
+at76c651_set_parameters(struct dvb_i2c_bus *i2c,
+			struct dvb_frontend_parameters *p)
+{
+
+	dat7021_set_tv_freq(i2c, p->frequency);
+	at76c651_set_symbolrate(i2c, p->u.qam.symbol_rate);
+	at76c651_set_inversion(i2c, p->inversion);
+	at76c651_set_auto_config(i2c);
+
+	return 0;
+
+}
+
+static int
+at76c651_set_defaults(struct dvb_i2c_bus *i2c)
+{
+
+	at76c651_set_symbolrate(i2c, 6900000);
+	at76c651_set_qam(i2c, QAM_64);
+	at76c651_set_bbfreq(i2c);
+	at76c651_set_auto_config(i2c);
+	at76c651_disable_interrupts(i2c);
+
+	return 0;
+
+}
+
+static int
+at76c651_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+
+	switch (cmd) {
+
+	case FE_GET_INFO:
+		memcpy(arg, &at76c651_info, sizeof (struct dvb_frontend_info));
+		break;
+
+	case FE_READ_STATUS:
+		{
+
+			fe_status_t *status = (fe_status_t *) arg;
+			u8 sync;
+
+			/*
+			 * Bits: FEC, CAR, EQU, TIM, AGC2, AGC1, ADC, PLL (PLL=0) 
+			 */
+			sync = at76c651_readreg(fe->i2c, 0x80);
+
+			*status = 0;
+
+			if (sync & (0x04 | 0x10))	/* AGC1 || TIM */
+				*status |= FE_HAS_SIGNAL;
+
+			if (sync & 0x10)	/* TIM */
+				*status |= FE_HAS_CARRIER;
+
+			if (sync & 0x80)	/* FEC */
+				*status |= FE_HAS_VITERBI;
+
+			if (sync & 0x40)	/* CAR */
+				*status |= FE_HAS_SYNC;
+
+			if ((sync & 0xF0) == 0xF0)	/* TIM && EQU && CAR && FEC */
+				*status |= FE_HAS_LOCK;
+
+			break;
+
+		}
+
+	case FE_READ_BER:
+		{
+			u32 *ber = (u32 *) arg;
+
+			*ber = (at76c651_readreg(fe->i2c, 0x81) & 0x0F) << 16;
+			*ber |= at76c651_readreg(fe->i2c, 0x82) << 8;
+			*ber |= at76c651_readreg(fe->i2c, 0x83);
+			*ber *= 10;
+
+			break;
+		}
+
+	case FE_READ_SIGNAL_STRENGTH:
+		{
+			u8 gain = ~at76c651_readreg(fe->i2c, 0x91);
+
+			*(s32 *) arg = (gain << 8) | gain;
+			*(s32 *) arg = 0x0FFF;
+			break;
+		}
+
+	case FE_READ_SNR:
+		*(s32 *) arg =
+		    0xFFFF -
+		    ((at76c651_readreg(fe->i2c, 0x8F) << 8) |
+		     at76c651_readreg(fe->i2c, 0x90));
+		break;
+
+	case FE_READ_UNCORRECTED_BLOCKS:
+		*(u32 *) arg = at76c651_readreg(fe->i2c, 0x82);
+		break;
+
+	case FE_SET_FRONTEND:
+		return at76c651_set_parameters(fe->i2c, arg);
+
+	case FE_GET_FRONTEND:
+		break;
+
+	case FE_SLEEP:
+		break;
+
+	case FE_INIT:
+		return at76c651_set_defaults(fe->i2c);
+
+	case FE_RESET:
+		return at76c651_reset(fe->i2c);
+
+	default:
+		return -ENOSYS;
+	}
+
+	return 0;
+
+}
+
+static int
+at76c651_attach(struct dvb_i2c_bus *i2c)
+{
+
+	if (at76c651_readreg(i2c, 0x0e) != 0x65) {
+
+		dprintk("no AT76C651(B) found\n");
+
+		return -ENODEV;
+
+	}
+
+	if (at76c651_readreg(i2c, 0x0F) != 0x10) {
+
+		if (at76c651_readreg(i2c, 0x0F) == 0x11) {
+
+			dprintk("AT76C651B found\n");
+
+		} else {
+
+			dprintk("no AT76C651(B) found\n");
+
+			return -ENODEV;
+
+		}
+
+	} else {
+
+		dprintk("AT76C651B found\n");
+
+	}
+
+	at76c651_set_defaults(i2c);
+
+	dvb_register_frontend(at76c651_ioctl, i2c, NULL, &at76c651_info);
+
+	return 0;
+
+}
+
+static void
+at76c651_detach(struct dvb_i2c_bus *i2c)
+{
+
+	dvb_unregister_frontend(at76c651_ioctl, i2c);
+
+	at76c651_disable_interrupts(i2c);
+
+}
+
+static int __init
+at76c651_init(void)
+{
+
+	return dvb_register_i2c_device(THIS_MODULE, at76c651_attach,
+				       at76c651_detach);
+
+}
+
+static void __exit
+at76c651_exit(void)
+{
+
+	dvb_unregister_i2c_device(at76c651_attach);
+
+}
+
+module_init(at76c651_init);
+module_exit(at76c651_exit);
+
+#ifdef MODULE
+MODULE_DESCRIPTION("at76c651/dat7021 dvb-c frontend driver");
+MODULE_AUTHOR("Andreas Oberritter <andreas@oberritter.de>");
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+MODULE_PARM(debug, "i");
+#endif
diff -Nru a/drivers/media/dvb/frontends/dvb_dummy_fe.c b/drivers/media/dvb/frontends/dvb_dummy_fe.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/frontends/dvb_dummy_fe.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,219 @@
+/* 
+ *  Driver for Dummy Frontend 
+ *
+ *  Written by Emard <emard@softhome.net>
+ *
+ *  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 "dvb_frontend.h"
+
+static int sct = 0;
+
+
+/* depending on module parameter sct deliver different infos
+ */
+
+static
+struct dvb_frontend_info dvb_s_dummyfe_info = {
+	name: "DVB-S dummy frontend",
+	type: FE_QPSK,
+	frequency_min: 950000,
+	frequency_max: 2150000,
+	frequency_stepsize: 250,           /* 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_INVERSION_AUTO | 
+	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
+};
+
+static
+struct dvb_frontend_info dvb_c_dummyfe_info = {
+	.name = "DVB-C dummy frontend",
+	.type = FE_QAM,
+	.frequency_stepsize = 62500,
+	.frequency_min = 51000000,
+	.frequency_max = 858000000,
+	.symbol_rate_min = (57840000/2)/64,     /* SACLK/64 == (XIN/2)/64 */
+	.symbol_rate_max = (57840000/2)/4,      /* SACLK/4 */
+#if 0
+	frequency_tolerance: ???,
+	symbol_rate_tolerance: ???,  /* ppm */  /* == 8% (spec p. 5) */
+	notifier_delay: ?,
+#endif
+	.caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
+		FE_CAN_QAM_128 | FE_CAN_QAM_256 | 
+		FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO |
+		FE_CAN_CLEAN_SETUP
+};
+
+static struct dvb_frontend_info dvb_t_dummyfe_info = {
+	.name = "DVB-T dummy frontend",
+	.type = FE_OFDM,
+	.frequency_min = 0,
+	.frequency_max = 863250000,
+	.frequency_stepsize = 62500,
+	/*.frequency_tolerance = */	/* FIXME: 12% of SR */
+	.symbol_rate_min = 0,		/* FIXME */
+	.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,
+};
+
+struct dvb_frontend_info *frontend_info(void)
+{
+	switch(sct)
+	{
+	case 2:
+		return &dvb_t_dummyfe_info;
+	case 1:
+		return &dvb_c_dummyfe_info;
+	case 0:
+	default:
+	        return &dvb_s_dummyfe_info;
+	}
+}
+
+
+static
+int dvbdummyfe_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+        switch (cmd) {
+        case FE_GET_INFO:
+		memcpy (arg, frontend_info(), 
+			sizeof(struct dvb_frontend_info));
+		break;
+
+        case FE_READ_STATUS:
+	{
+		fe_status_t *status = arg;
+		*status = FE_HAS_SIGNAL
+			| FE_HAS_CARRIER
+			| FE_HAS_VITERBI
+			| FE_HAS_SYNC
+			| FE_HAS_LOCK;
+		break;
+	}
+
+        case FE_READ_BER:
+	{
+		u32 *ber = (u32 *) arg;
+		*ber = 0;
+		break;
+	}
+
+        case FE_READ_SIGNAL_STRENGTH:
+	{
+		u8 signal = 0xff;
+		*((u16*) arg) = (signal << 8) | signal;
+		break;
+	}
+
+        case FE_READ_SNR:
+	{
+		u8 snr = 0xf0;
+		*(u16*) arg = (snr << 8) | snr;
+		break;
+	}
+
+	case FE_READ_UNCORRECTED_BLOCKS: 
+		*(u32*) arg = 0;
+		break;
+
+        case FE_SET_FRONTEND:
+                break;
+
+	case FE_GET_FRONTEND:
+		break;
+
+        case FE_SLEEP:
+		return 0;
+
+        case FE_INIT:
+		return 0;
+
+	case FE_RESET:
+		return 0;
+
+	case FE_SET_TONE:
+		return -EOPNOTSUPP;
+
+	case FE_SET_VOLTAGE:
+		return 0;
+
+	default:
+		return -EOPNOTSUPP;
+        }
+        return 0;
+} 
+
+
+static
+int dvbdummyfe_attach (struct dvb_i2c_bus *i2c)
+{
+	dvb_register_frontend (dvbdummyfe_ioctl, i2c, NULL, frontend_info());
+	return 0;
+}
+
+
+static
+void dvbdummyfe_detach (struct dvb_i2c_bus *i2c)
+{
+	dvb_unregister_frontend (dvbdummyfe_ioctl, i2c);
+}
+
+
+static
+int __init init_dvbdummyfe (void)
+{
+	return dvb_register_i2c_device (THIS_MODULE,
+					dvbdummyfe_attach, 
+					dvbdummyfe_detach);
+	return 0;
+}
+
+
+static 
+void __exit exit_dvbdummyfe (void)
+{
+	dvb_unregister_i2c_device (dvbdummyfe_attach);
+	return;
+}
+
+
+module_init(init_dvbdummyfe);
+module_exit(exit_dvbdummyfe);
+
+
+MODULE_DESCRIPTION("DVB DUMMY Frontend");
+MODULE_AUTHOR("Emard");
+MODULE_LICENSE("GPL");
+MODULE_PARM(sct, "i");
diff -Nru a/drivers/media/dvb/frontends/grundig_29504-401.c b/drivers/media/dvb/frontends/grundig_29504-401.c
--- a/drivers/media/dvb/frontends/grundig_29504-401.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/media/dvb/frontends/grundig_29504-401.c	Sat Apr 19 19:51:28 2003
@@ -25,7 +25,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-#include "compat.h"
 #include "dvb_frontend.h"
 
 static int debug = 0;
@@ -34,14 +33,18 @@
 
 
 struct dvb_frontend_info grundig_29504_401_info = {
-	.name			= "Grundig 29504-401",
-	.type			= FE_OFDM,
-	.frequency_stepsize	= 166666,
-	.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_QPSK |
-				  FE_CAN_QAM_16 | FE_CAN_QAM_64 |
-				  FE_CAN_MUTE_TS
+	name: "Grundig 29504-401",
+	type: FE_OFDM,
+/*	frequency_min: ???,*/
+/*	frequency_max: ???,*/
+	frequency_stepsize: 166666,
+/*      frequency_tolerance: ???,*/
+/*      symbol_rate_tolerance: ???,*/
+	notifier_delay: 0,
+	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_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
+	      FE_CAN_MUTE_TS /*| FE_CAN_CLEAN_SETUP*/
 };
 
 
@@ -50,7 +53,7 @@
 {
 	int ret;
 	u8 buf [] = { reg, data };
-	struct i2c_msg msg = { .addr = 0x55, .flags = 0, .buf = buf, .len = 2 };
+	struct i2c_msg msg = { addr: 0x55, flags: 0, buf: buf, len: 2 };
 
 	if ((ret = i2c->xfer (i2c, &msg, 1)) != 1)
 		dprintk ("%s: write_reg error (reg == %02x) = %02x!\n",
@@ -66,8 +69,8 @@
 	int ret;
 	u8 b0 [] = { reg };
 	u8 b1 [] = { 0 };
-	struct i2c_msg msg [] = { { .addr = 0x55, .flags = 0, .buf = b0, .len = 1 },
-			   { .addr = 0x55, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+	struct i2c_msg msg [] = { { addr: 0x55, flags: 0, buf: b0, len: 1 },
+			   { addr: 0x55, flags: I2C_M_RD, buf: b1, len: 1 } };
 
 	ret = i2c->xfer (i2c, msg, 2);
 
@@ -82,7 +85,7 @@
 int tsa5060_write (struct dvb_i2c_bus *i2c, u8 data [4])
 {
 	int ret;
-	struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = 4 };
+	struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 };
 
 	if ((ret = i2c->xfer (i2c, &msg, 1)) != 1)
 		dprintk ("%s: write_reg error == %02x!\n", __FUNCTION__, ret);
@@ -97,24 +100,19 @@
  *   frequency offset is 36000000 Hz.
  */
 static
-int tsa5060_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, u8 pwr)
+int tsa5060_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq)
 {
 	u32 div;
 	u8 buf [4];
 	u8 cfg;
 
-	if (freq < 700000000) {
-		div = (36000000 + freq) / 31250;
-		cfg = 0x86;
-	} else {
-		div = (36000000 + freq) / 166666;
-		cfg = 0x88;
-	}
+	div = (36000000 + freq) / 166666;
+	cfg = 0x88;
 
 	buf [0] = (div >> 8) & 0x7f;
 	buf [1] = div & 0xff;
 	buf [2] = ((div >> 10) & 0x60) | cfg;
-	buf [3] = pwr << 6;
+	buf [3] = 0xc0;
 
 	return tsa5060_write (i2c, buf);
 }
@@ -175,12 +173,13 @@
 	u8 val0x04;
 	u8 val0x05;
 	u8 val0x06;
+	int bw = p->bandwidth - BANDWIDTH_8_MHZ;
 
 	if (param->inversion != INVERSION_ON &&
 	    param->inversion != INVERSION_OFF)
 		return -EINVAL;
 
-	if (p->bandwidth < BANDWIDTH_8_MHZ || p->bandwidth > BANDWIDTH_6_MHZ)
+	if (bw < 0 || bw > 2)
 		return -EINVAL;
 	
 	if (p->code_rate_HP != FEC_1_2 && p->code_rate_HP != FEC_2_3 &&
@@ -230,6 +229,7 @@
 
 	val0x04 = (p->transmission_mode << 2) | p->guard_interval;
 	val0x05 = fec_tab[p->code_rate_HP];
+
 	if (p->hierarchy_information != HIERARCHY_NONE)
 		val0x05 |= (p->code_rate_LP - FEC_1_2) << 3;
 
@@ -269,7 +269,7 @@
 void reset_and_configure (struct dvb_i2c_bus *i2c)
 {
 	u8 buf [] = { 0x06 };
-	struct i2c_msg msg = { .addr = 0x00, .flags = 0, .buf = buf, .len = 1 };
+	struct i2c_msg msg = { addr: 0x00, flags: 0, buf: buf, len: 1 };
 
 	i2c->xfer (i2c, &msg, 1);
 }
@@ -307,7 +307,7 @@
         /*l64781_writereg (i2c, 0x19, 0x92);*/
 
 	/* Everything is two's complement, soft bit and CSI_OUT too */
-	l64781_writereg (i2c, 0x1e, 0x49);
+	l64781_writereg (i2c, 0x1e, 0x09);
 
 	return 0;
 }
@@ -390,9 +390,8 @@
 	{
 		struct dvb_frontend_parameters *p = arg;
 
-		tsa5060_set_tv_freq (i2c, p->frequency, 3);
+		tsa5060_set_tv_freq (i2c, p->frequency);
 		apply_frontend_param (i2c, p);
-//		tsa5060_set_tv_freq (i2c, p->frequency, 0);
 	}
         case FE_GET_FRONTEND:
 		/*  we could correct the frequency here, but...
@@ -407,13 +406,6 @@
 	case FE_INIT:
 		return init (i2c);
 
-        case FE_RESET:
-		//reset_afc (i2c);
-		apply_tps (i2c);
-		l64781_readreg (i2c, 0x00);  /*  clear interrupt registers... */
-		l64781_readreg (i2c, 0x01);  /*  dto. */
-		break;
-
         default:
 		dprintk ("%s: unknown command !!!\n", __FUNCTION__);
 		return -EINVAL;
@@ -428,8 +420,8 @@
 {
 	u8 b0 [] = { 0x1a };
 	u8 b1 [] = { 0x00 };
-	struct i2c_msg msg [] = { { .addr = 0x55, .flags = 0, .buf = b0, .len = 1 },
-			   { .addr = 0x55, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
+	struct i2c_msg msg [] = { { addr: 0x55, flags: 0, buf: b0, len: 1 },
+			   { addr: 0x55, flags: I2C_M_RD, buf: b1, len: 1 } };
 
 	if (i2c->xfer (i2c, msg, 2) == 2)   /*  probably an EEPROM... */
 		return -ENODEV;
diff -Nru a/drivers/media/dvb/frontends/grundig_29504-491.c b/drivers/media/dvb/frontends/grundig_29504-491.c
--- a/drivers/media/dvb/frontends/grundig_29504-491.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/media/dvb/frontends/grundig_29504-491.c	Sat Apr 19 19:51:50 2003
@@ -27,7 +27,6 @@
 #include <linux/init.h>
 #include <linux/module.h>
 
-#include "compat.h"
 #include "dvb_frontend.h"
 
 static int debug = 0;
@@ -36,20 +35,22 @@
 
 static
 struct dvb_frontend_info grundig_29504_491_info = {
-	.name			= "Grundig 29504-491, (TDA8083 based)",
-	.type			= FE_QPSK,
-	.frequency_min		= 950000,     /* FIXME: guessed! */
-	.frequency_max		= 1400000,    /* FIXME: guessed! */
-	.frequency_stepsize	= 125,   /* kHz for QPSK frontends */
-	.symbol_rate_min	= 1000000,   /* FIXME: guessed! */
-	.symbol_rate_max	= 45000000,  /* FIXME: guessed! */
-	.caps			= FE_CAN_INVERSION_AUTO |
-				  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_QPSK |
-				  FE_CAN_MUTE_TS
+	name: "Grundig 29504-491, (TDA8083 based)",
+	type: FE_QPSK,
+	frequency_min: 950000,     /* FIXME: guessed! */
+	frequency_max: 1400000,    /* FIXME: guessed! */
+	frequency_stepsize: 125,   /* kHz for QPSK frontends */
+/*      frequency_tolerance: ???,*/
+	symbol_rate_min: 1000000,   /* FIXME: guessed! */
+	symbol_rate_max: 45000000,  /* FIXME: guessed! */
+/*      symbol_rate_tolerance: ???,*/
+	notifier_delay: 0,
+	caps:	FE_CAN_INVERSION_AUTO |
+		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_QPSK |
+		FE_CAN_MUTE_TS | FE_CAN_CLEAN_SETUP
 };
 
 
@@ -71,7 +72,7 @@
 {
 	int ret;
 	u8 buf [] = { reg, data };
-	struct i2c_msg msg = { .addr = 0x68, .flags = 0, .buf = buf, .len = 2 };
+	struct i2c_msg msg = { addr: 0x68, flags: 0, buf: buf, len: 2 };
 
         ret = i2c->xfer (i2c, &msg, 1);
 
@@ -87,8 +88,8 @@
 int tda8083_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len)
 {
 	int ret;
-	struct i2c_msg msg [] = { { .addr = 0x68, .flags = 0, .buf = &reg1, .len = 1 },
-			   { .addr = 0x68, .flags = I2C_M_RD, .buf = b, .len = len } };
+	struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: &reg1, len: 1 },
+			   { addr: 0x68, flags: I2C_M_RD, buf: b, len: len } };
 
 	ret = i2c->xfer (i2c, msg, 2);
 
@@ -115,7 +116,7 @@
 int tsa5522_write (struct dvb_i2c_bus *i2c, u8 data [4])
 {
 	int ret;
-	struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = 4 };
+	struct i2c_msg msg = { addr: 0x61, flags: 0, buf: data, len: 4 };
 
 	ret = i2c->xfer (i2c, &msg, 1);
 
diff -Nru a/drivers/media/dvb/frontends/nxt6000.c b/drivers/media/dvb/frontends/nxt6000.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/frontends/nxt6000.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,869 @@
+/* 
+
+	NxtWave Communications - NXT6000 demodulator driver
+	
+	This driver currently supports:
+	
+	Alps TDME7 (Tuner: MITEL SP5659)
+	Alps TDED4 (Tuner: TI ALP510, external Nxt6000)
+
+    Copyright (C) 2002-2003 Florian Schirmer <schirmer@taytron.net>
+
+    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/delay.h>
+#include <linux/slab.h>
+#include <linux/poll.h>
+#include <asm/io.h>
+#include <linux/i2c.h>
+
+#include "dvb_frontend.h"
+#include "nxt6000.h"
+
+static int debug = 0;
+
+MODULE_DESCRIPTION("NxtWave NXT6000 DVB demodulator driver");
+MODULE_AUTHOR("Florian Schirmer");
+MODULE_LICENSE("GPL");
+MODULE_PARM(debug, "i");
+
+static struct dvb_frontend_info nxt6000_info = {
+
+	.name = "NxtWave NXT6000",
+	.type = FE_OFDM,
+	.frequency_min = 0,
+	.frequency_max = 863250000,
+	.frequency_stepsize = 62500,
+	/*.frequency_tolerance = */	/* FIXME: 12% of SR */
+	.symbol_rate_min = 0,		/* FIXME */
+	.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,
+
+};
+
+#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 FE2NXT(fe) ((struct nxt6000_config *)&(fe->data))
+#define FREQ2DIV(freq) ((freq + 36166667) / 166667)
+
+#define dprintk if (debug) printk
+
+static int nxt6000_write(struct dvb_i2c_bus *i2c, u8 addr, u8 reg, u8 data)
+{
+
+	u8 buf[] = {reg, data};
+	struct i2c_msg msg = {addr: addr >> 1, flags: 0, buf: buf, len: 2};
+	int ret;
+	
+	if ((ret = i2c->xfer(i2c, &msg, 1)) != 1)
+		dprintk("nxt6000: nxt6000_write error (addr: 0x%02X, reg: 0x%02X, data: 0x%02X, ret: %d)\n", addr, reg, data, ret);
+
+	return (ret != 1) ? -EFAULT : 0;
+	
+}
+
+static u8 nxt6000_writereg(struct dvb_frontend *fe, u8 reg, u8 data)
+{
+
+	struct nxt6000_config *nxt = FE2NXT(fe);
+
+	return nxt6000_write(fe->i2c, nxt->demod_addr, reg, data);
+
+}
+
+static u8 nxt6000_read(struct dvb_i2c_bus *i2c, u8 addr, u8 reg)
+{
+
+	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}};
+
+	ret = i2c->xfer(i2c, msgs, 2);
+	
+	if (ret != 2)
+		dprintk("nxt6000: nxt6000_read error (addr: 0x%02X, reg: 0x%02X, ret: %d)\n", addr, reg, ret);
+	
+	return b1[0];
+
+}
+
+static u8 nxt6000_readreg(struct dvb_frontend *fe, u8 reg)
+{
+
+	struct nxt6000_config *nxt = FE2NXT(fe);
+
+	return nxt6000_read(fe->i2c, nxt->demod_addr, reg);
+
+}
+
+static int pll_write(struct dvb_i2c_bus *i2c, u8 demod_addr, u8 tuner_addr, u8 *buf, u8 len)
+{
+
+	struct i2c_msg msg = {addr: tuner_addr >> 1, flags: 0, buf: buf, len: len};
+	int ret;
+				
+	nxt6000_write(i2c, demod_addr, ENABLE_TUNER_IIC, 0x01);		/* open i2c bus switch */
+	ret = i2c->xfer(i2c, &msg, 1);
+	nxt6000_write(i2c, demod_addr, ENABLE_TUNER_IIC, 0x00);		/* close i2c bus switch */
+										
+	if (ret != 1)
+		dprintk("nxt6000: pll_write error %d\n", ret);
+																
+	return (ret != 1) ? -EFAULT : 0;
+
+}
+
+static int sp5659_set_tv_freq(struct dvb_frontend *fe, u32 freq)
+{
+
+	u8 buf[4];
+	struct nxt6000_config *nxt = FE2NXT(fe);
+
+	buf[0] = (FREQ2DIV(freq) >> 8) & 0x7F;
+	buf[1] = FREQ2DIV(freq) & 0xFF;
+	buf[2] = (((FREQ2DIV(freq) >> 15) & 0x03) << 5) | 0x85;
+
+	if ((freq >= 174000000) && (freq < 230000000))
+		buf[3] = 0x82;
+	else if ((freq >= 470000000) && (freq < 782000000))
+		buf[3] = 0x85;
+	else if ((freq >= 782000000) && (freq < 863000000))
+		buf[3] = 0xC5;
+	else
+		return -EINVAL;
+
+	return pll_write(fe->i2c, nxt->demod_addr, nxt->tuner_addr, buf, 4);
+	
+}
+
+static int alp510_set_tv_freq(struct dvb_frontend *fe, u32 freq)
+{
+
+	u8 buf[4];
+	struct nxt6000_config *nxt = FE2NXT(fe);
+
+	buf[0] = (FREQ2DIV(freq) >> 8) & 0x7F;
+	buf[1] = FREQ2DIV(freq) & 0xFF;
+	buf[2] = 0x85;
+
+#if 0
+	if ((freq >= 47000000) && (freq < 153000000))
+		buf[3] = 0x01;
+	else if ((freq >= 153000000) && (freq < 430000000))
+		buf[3] = 0x02;
+	else if ((freq >= 430000000) && (freq < 824000000))
+		buf[3] = 0x08;
+	else if ((freq >= 824000000) && (freq < 863000000))
+		buf[3] = 0x88;
+	else
+		return -EINVAL;
+#else
+	if ((freq >= 47000000) && (freq < 153000000))
+		buf[3] = 0x01;
+	else if ((freq >= 153000000) && (freq < 430000000))
+		buf[3] = 0x02;
+	else if ((freq >= 430000000) && (freq < 824000000))
+		buf[3] = 0x0C;
+	else if ((freq >= 824000000) && (freq < 863000000))
+		buf[3] = 0x8C;
+	else
+		return -EINVAL;
+#endif
+
+	return pll_write(fe->i2c, nxt->demod_addr, nxt->tuner_addr, buf, 4);
+	
+}
+
+static void nxt6000_reset(struct dvb_frontend *fe)
+{
+
+	u8 val;
+
+	val = nxt6000_readreg(fe, OFDM_COR_CTL);
+	
+	nxt6000_writereg(fe, OFDM_COR_CTL, val & ~COREACT);
+	nxt6000_writereg(fe, OFDM_COR_CTL, val | COREACT);
+	
+}
+
+static int nxt6000_set_bandwidth(struct dvb_frontend *fe, fe_bandwidth_t bandwidth)
+{
+
+	u16 nominal_rate;
+	int result;
+
+	switch(bandwidth) {
+	
+		case BANDWIDTH_6_MHZ:
+		
+			nominal_rate = 0x55B7;
+			
+			break;
+
+		case BANDWIDTH_7_MHZ:
+
+			nominal_rate = 0x6400;
+			
+			break;
+
+		case BANDWIDTH_8_MHZ:
+
+			nominal_rate = 0x7249;
+			
+			break;
+
+		default:
+			
+			return -EINVAL;
+			
+	}
+
+	if ((result = nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_1, nominal_rate & 0xFF)) < 0)
+		return result;
+		
+	return nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_2, (nominal_rate >> 8) & 0xFF);
+		
+}
+
+static int nxt6000_set_guard_interval(struct dvb_frontend *fe, fe_guard_interval_t guard_interval)
+{
+
+	switch(guard_interval) {
+	
+		case GUARD_INTERVAL_1_32:
+
+			return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x00 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+
+		case GUARD_INTERVAL_1_16:
+
+			return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x01 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+
+		case GUARD_INTERVAL_AUTO:
+		case GUARD_INTERVAL_1_8:
+
+			return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x02 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+
+		case GUARD_INTERVAL_1_4:
+
+			return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, 0x03 | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x03));
+			
+		default:
+		
+			return -EINVAL;
+
+	}
+
+}
+
+static int nxt6000_set_inversion(struct dvb_frontend *fe, fe_spectral_inversion_t inversion)
+{
+
+	switch(inversion) {
+	
+		case INVERSION_OFF:
+		
+			return nxt6000_writereg(fe, OFDM_ITB_CTL, 0x00);
+			
+		case INVERSION_ON:
+		
+			return nxt6000_writereg(fe, OFDM_ITB_CTL, ITBINV);
+
+		default:
+		
+			return -EINVAL;	
+	
+	}
+
+}
+
+static int nxt6000_set_transmission_mode(struct dvb_frontend *fe, fe_transmit_mode_t transmission_mode)
+{
+
+	int result;
+
+	switch(transmission_mode) {
+
+		case TRANSMISSION_MODE_2K:	
+
+			if ((result = nxt6000_writereg(fe, EN_DMD_RACQ, 0x00 | (nxt6000_readreg(fe, EN_DMD_RACQ) & ~0x03))) < 0)
+				return result;
+				
+			return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, (0x00 << 2) | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x04));
+
+		case TRANSMISSION_MODE_8K:	
+		case TRANSMISSION_MODE_AUTO:	
+
+			if ((result = nxt6000_writereg(fe, EN_DMD_RACQ, 0x02 | (nxt6000_readreg(fe, EN_DMD_RACQ) & ~0x03))) < 0)
+				return result;
+
+			return nxt6000_writereg(fe, OFDM_COR_MODEGUARD, (0x01 << 2) | (nxt6000_readreg(fe, OFDM_COR_MODEGUARD) & ~0x04));
+
+		default:
+			
+			return -EINVAL;
+	
+	}
+
+}
+
+static void nxt6000_setup(struct dvb_frontend *fe)
+{
+
+	struct nxt6000_config *nxt = FE2NXT(fe);
+
+	nxt6000_writereg(fe, RS_COR_SYNC_PARAM, SYNC_PARAM);
+	nxt6000_writereg(fe, BER_CTRL, /*(1 << 2) |*/ (0x01 << 1) | 0x01);
+	nxt6000_writereg(fe, VIT_COR_CTL, VIT_COR_RESYNC);
+	nxt6000_writereg(fe, OFDM_COR_CTL, (0x01 << 5) | (nxt6000_readreg(fe, OFDM_COR_CTL) & 0x0F));
+	nxt6000_writereg(fe, OFDM_COR_MODEGUARD, FORCEMODE8K | 0x02);
+	nxt6000_writereg(fe, OFDM_AGC_CTL, AGCLAST | INITIAL_AGC_BW);
+	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, OFDM_SYR_CTL, 1 << 2);
+	nxt6000_writereg(fe, OFDM_PPM_CTL_1, PPM256);
+	nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_1, 0x49);
+	nxt6000_writereg(fe, OFDM_TRL_NOMINALRATE_2, 0x72);
+	nxt6000_writereg(fe, ANALOG_CONTROL_0, 1 << 5);
+	nxt6000_writereg(fe, EN_DMD_RACQ, (1 << 7) | (3 << 4) | 2);
+	nxt6000_writereg(fe, DIAG_CONFIG, TB_SET);
+	
+	if (nxt->clock_inversion)
+		nxt6000_writereg(fe, SUB_DIAG_MODE_SEL, CLKINVERSION);
+	else
+		nxt6000_writereg(fe, SUB_DIAG_MODE_SEL, 0);
+		
+	nxt6000_writereg(fe, TS_FORMAT, 0);
+
+}
+
+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("NXT6000 status:");
+
+	val = nxt6000_readreg(fe, RS_COR_STAT);
+	
+	printk(" DATA DESCR LOCK: %d,", val & 0x01);
+	printk(" DATA SYNC LOCK: %d,", (val >> 1) & 0x01);
+
+	val = nxt6000_readreg(fe, VIT_SYNC_STATUS);
+
+	printk(" VITERBI LOCK: %d,", (val >> 7) & 0x01);
+
+	switch((val >> 4) & 0x07) {
+	
+		case 0x00: 
+		
+			printk(" VITERBI CODERATE: 1/2,");
+			
+			break;
+	
+		case 0x01: 
+		
+			printk(" VITERBI CODERATE: 2/3,");
+			
+			break;
+	
+		case 0x02: 
+		
+			printk(" VITERBI CODERATE: 3/4,");
+			
+			break;
+	
+		case 0x03: 
+		
+			printk(" VITERBI CODERATE: 5/6,");
+
+		case 0x04: 
+		
+			printk(" VITERBI CODERATE: 7/8,");
+			
+			break;
+
+		default: 
+		
+			printk(" VITERBI CODERATE: Reserved,");
+			
+	}
+
+	val = nxt6000_readreg(fe, OFDM_COR_STAT);
+	
+	printk(" CHCTrack: %d,", (val >> 7) & 0x01);
+	printk(" TPSLock: %d,", (val >> 6) & 0x01);
+	printk(" SYRLock: %d,", (val >> 5) & 0x01);
+	printk(" AGCLock: %d,", (val >> 4) & 0x01);
+
+	switch(val & 0x0F) {
+	
+		case 0x00:
+		
+			printk(" CoreState: IDLE,");
+			
+			break;
+	
+		case 0x02:
+		
+			printk(" CoreState: WAIT_AGC,");
+			
+			break;
+	
+		case 0x03:
+		
+			printk(" CoreState: WAIT_SYR,");
+			
+			break;
+	
+		case 0x04:
+		
+			printk(" CoreState: WAIT_PPM,");
+
+		case 0x01:
+		
+			printk(" CoreState: WAIT_TRL,");
+			
+			break;
+
+		case 0x05:
+		
+			printk(" CoreState: WAIT_TPS,");
+			
+			break;
+
+		case 0x06:
+		
+			printk(" CoreState: MONITOR_TPS,");
+			
+			break;
+
+		default: 
+		
+			printk(" CoreState: Reserved,");
+			
+	}
+
+	val = nxt6000_readreg(fe, OFDM_SYR_STAT);
+
+	printk(" SYRLock: %d,", (val >> 4) & 0x01);
+	printk(" SYRMode: %s,", (val >> 2) & 0x01 ? "8K" : "2K");
+
+	switch((val >> 4) & 0x03) {
+	
+		case 0x00: 
+		
+			printk(" SYRGuard: 1/32,");
+			
+			break;
+	
+		case 0x01: 
+		
+			printk(" SYRGuard: 1/16,");
+			
+			break;
+	
+		case 0x02: 
+		
+			printk(" SYRGuard: 1/8,");
+			
+			break;
+	
+		case 0x03: 
+		
+			printk(" SYRGuard: 1/4,");
+			
+			break;
+			
+	}
+
+	val = nxt6000_readreg(fe, OFDM_TPS_RCVD_3);
+	
+	switch((val >> 4) & 0x07) {
+	
+		case 0x00: 
+		
+			printk(" TPSLP: 1/2,");
+			
+			break;
+	
+		case 0x01: 
+		
+			printk(" TPSLP: 2/3,");
+			
+			break;
+	
+		case 0x02: 
+		
+			printk(" TPSLP: 3/4,");
+			
+			break;
+	
+		case 0x03: 
+		
+			printk(" TPSLP: 5/6,");
+
+		case 0x04: 
+		
+			printk(" TPSLP: 7/8,");
+			
+			break;
+
+		default: 
+		
+			printk(" TPSLP: Reserved,");
+			
+	}
+
+	switch(val & 0x07) {
+	
+		case 0x00: 
+		
+			printk(" TPSHP: 1/2,");
+			
+			break;
+	
+		case 0x01: 
+		
+			printk(" TPSHP: 2/3,");
+			
+			break;
+	
+		case 0x02: 
+		
+			printk(" TPSHP: 3/4,");
+			
+			break;
+	
+		case 0x03: 
+		
+			printk(" TPSHP: 5/6,");
+
+		case 0x04: 
+		
+			printk(" TPSHP: 7/8,");
+			
+			break;
+
+		default: 
+		
+			printk(" TPSHP: Reserved,");
+			
+	}
+
+	val = nxt6000_readreg(fe, OFDM_TPS_RCVD_4);
+	
+	printk(" TPSMode: %s,", val & 0x01 ? "8K" : "2K");
+	
+	switch((val >> 4) & 0x03) {
+	
+		case 0x00: 
+		
+			printk(" TPSGuard: 1/32,");
+			
+			break;
+	
+		case 0x01: 
+		
+			printk(" TPSGuard: 1/16,");
+			
+			break;
+	
+		case 0x02: 
+		
+			printk(" TPSGuard: 1/8,");
+			
+			break;
+	
+		case 0x03: 
+		
+			printk(" TPSGuard: 1/4,");
+			
+			break;
+			
+	}
+	
+	// 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);
+
+	printk(" RF AGC LOCK: %d,", (val >> 4) & 0x01);
+
+	printk("\n");
+	
+}
+
+static int nxt6000_ioctl(struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+
+	switch (cmd) {
+
+		case FE_GET_INFO:
+
+			memcpy(arg, &nxt6000_info, sizeof (struct dvb_frontend_info));
+
+			return 0;
+
+		case FE_READ_STATUS:
+		{
+			fe_status_t *status = (fe_status_t *)arg;
+
+			u8 core_status;
+
+			*status = 0;
+			
+			core_status = nxt6000_readreg(fe, OFDM_COR_STAT);
+
+			if (core_status & AGCLOCKED)
+				*status |= FE_HAS_SIGNAL;
+
+			if (nxt6000_readreg(fe, OFDM_SYR_STAT) & GI14_SYR_LOCK)
+				*status |= FE_HAS_CARRIER;
+
+			if (nxt6000_readreg(fe, VIT_SYNC_STATUS) & VITINSYNC)
+				*status |= FE_HAS_VITERBI;
+
+			if (nxt6000_readreg(fe, RS_COR_STAT) & RSCORESTATUS)
+				*status |= FE_HAS_SYNC;
+				
+			if ((core_status & TPSLOCKED) && (*status == (FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)))
+				*status |= FE_HAS_LOCK;
+				
+			if (debug)
+				nxt6000_dump_status(fe);
+
+			return 0;
+			
+		}
+	
+		case FE_READ_BER:
+		{
+			u32 *ber = (u32 *)arg;
+
+			*ber=0;
+
+			return 0;
+			
+		}
+	
+		case FE_READ_SIGNAL_STRENGTH:
+		{
+//			s16 *signal = (s16 *)arg;
+
+//		*signal=(((signed char)readreg(client, 0x16))+128)<<8;
+
+			return 0;
+			
+		}
+	
+		case FE_READ_SNR:
+		{
+//			s16 *snr = (s16 *)arg;
+
+//		*snr=readreg(client, 0x24)<<8;
+//		*snr|=readreg(client, 0x25);
+
+			break;
+		}
+	
+		case FE_READ_UNCORRECTED_BLOCKS: 
+		{
+			u32 *ublocks = (u32 *)arg;
+
+			*ublocks = 0;
+
+			break;
+		}
+	
+		case FE_INIT:
+		case FE_RESET:
+		
+			nxt6000_reset(fe);
+			nxt6000_setup(fe);
+
+			break;
+		
+		case FE_SET_FRONTEND:
+		{
+			struct nxt6000_config *nxt = FE2NXT(fe);
+			struct dvb_frontend_parameters *param = (struct dvb_frontend_parameters *)arg;
+			int result;
+
+			switch(nxt->tuner_type) {
+			
+				case TUNER_TYPE_ALP510:
+
+					if ((result = alp510_set_tv_freq(fe, param->frequency)) < 0)
+						return result;
+						
+					break;
+
+				case TUNER_TYPE_SP5659:
+
+					if ((result = sp5659_set_tv_freq(fe, param->frequency)) < 0)
+						return result;
+						
+					break;
+					
+				default:
+				
+					return -EFAULT;
+					
+			}
+
+			if ((result = nxt6000_set_bandwidth(fe, param->u.ofdm.bandwidth)) < 0)
+				return result;
+			if ((result = nxt6000_set_guard_interval(fe, param->u.ofdm.guard_interval)) < 0)
+				return result;
+			if ((result = nxt6000_set_transmission_mode(fe, param->u.ofdm.transmission_mode)) < 0)
+				return result;
+			if ((result = nxt6000_set_inversion(fe, param->inversion)) < 0)
+				return result;
+			
+			break;
+		}
+
+		default:
+
+			return -EOPNOTSUPP;
+
+	}
+
+	return 0;
+	
+} 
+
+static u8 demod_addr_tbl[] = {0x14, 0x18, 0x24, 0x28};
+
+static int nxt6000_attach(struct dvb_i2c_bus *i2c)
+{
+
+	u8 addr_nr;
+	u8 fe_count = 0;
+	struct nxt6000_config nxt;
+
+	dprintk("nxt6000: attach\n");
+	
+	for (addr_nr = 0; addr_nr < sizeof(demod_addr_tbl); 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;
+			
+			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;
+	
+			dprintk("nxt6000: detected MITEL SP5659 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];
+	  
+		dprintk("nxt6000: attached at %d:%d\n", i2c->adapter->num, i2c->id);
+	
+		dvb_register_frontend(nxt6000_ioctl, i2c, (void *)(*((u32 *)&nxt)), &nxt6000_info);
+		
+	}
+	
+	return (fe_count > 0) ? 0 : -ENODEV;
+	
+}
+
+static void nxt6000_detach(struct dvb_i2c_bus *i2c)
+{
+
+	dprintk("nxt6000: detach\n");
+
+	dvb_unregister_frontend(nxt6000_ioctl, i2c);
+	
+}
+
+static __init int nxt6000_init(void)
+{
+
+	dprintk("nxt6000: init\n");
+	
+	return dvb_register_i2c_device(THIS_MODULE, nxt6000_attach, nxt6000_detach);
+	
+}
+
+static __exit void nxt6000_exit(void)
+{
+
+	dprintk("nxt6000: cleanup\n");
+
+	dvb_unregister_i2c_device(nxt6000_attach);
+
+}
+
+module_init(nxt6000_init);
+module_exit(nxt6000_exit);
diff -Nru a/drivers/media/dvb/frontends/nxt6000.h b/drivers/media/dvb/frontends/nxt6000.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/frontends/nxt6000.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,301 @@
+/**********************************************************************/
+ * DRV6000reg.H
+ * Public Include File for DRV6000 users
+ *
+ * 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 */
+
+/* Maximum Register Number */
+#define MAXNXT6000REG          (0x9A)
+
+/* 0x1B A_VIT_BER_0  aka 0x3A */
+#define A_VIT_BER_0            (0x1B)
+
+/* 0x1D A_VIT_BER_TIMER_0 aka 0x38 */
+#define A_VIT_BER_TIMER_0      (0x1D)
+
+/* 0x21 RS_COR_STAT */
+#define RS_COR_STAT            (0x21)
+#define RSCORESTATUS           (0x03)
+
+/* 0x22 RS_COR_INTEN */
+#define RS_COR_INTEN           (0x22)
+
+/* 0x23 RS_COR_INSTAT */
+#define RS_COR_INSTAT          (0x23)
+#define INSTAT_ERROR           (0x04)
+#define LOCK_LOSS_BITS         (0x03)
+
+/* 0x24 RS_COR_SYNC_PARAM */
+#define RS_COR_SYNC_PARAM      (0x24)
+#define SYNC_PARAM             (0x03)
+
+/* 0x25 BER_CTRL */
+#define BER_CTRL               (0x25)
+#define BER_ENABLE             (0x02)
+#define BER_RESET              (0x01)
+
+/* 0x26 BER_PAY */
+#define BER_PAY                (0x26)
+
+/* 0x27 BER_PKT_L */
+#define BER_PKT_L              (0x27)
+#define BER_PKTOVERFLOW        (0x80)
+
+/* 0x30 VIT_COR_CTL */
+#define VIT_COR_CTL            (0x30)
+#define BER_CONTROL            (0x02)
+#define VIT_COR_MASK           (0x82)
+#define VIT_COR_RESYNC         (0x80)
+
+
+/* 0x32 VIT_SYNC_STATUS */
+#define VIT_SYNC_STATUS        (0x32)
+#define VITINSYNC              (0x80)
+
+/* 0x33 VIT_COR_INTEN */
+#define VIT_COR_INTEN          (0x33)
+#define GLOBAL_ENABLE          (0x80)
+
+/* 0x34 VIT_COR_INTSTAT */
+#define VIT_COR_INTSTAT        (0x34)
+#define BER_DONE               (0x08)
+#define BER_OVERFLOW           (0x10)
+
+/* 0x38 OFDM_BERTimer */     /* Use the alias registers */
+#define A_VIT_BER_TIMER_0      (0x1D)
+
+/* 0x3A VIT_BER_TIMER_0 */   /* Use the alias registers */
+#define A_VIT_BER_0            (0x1B)
+
+/* 0x40 OFDM_COR_CTL */
+#define OFDM_COR_CTL           (0x40)
+#define COREACT                (0x20)
+#define HOLDSM                 (0x10)
+#define WAIT_AGC               (0x02)
+#define WAIT_SYR               (0x03)
+
+/* 0x41 OFDM_COR_STAT */
+#define OFDM_COR_STAT          (0x41)
+#define COR_STATUS             (0x0F)
+#define MONITOR_TPS            (0x06)
+#define TPSLOCKED              (0x40)
+#define AGCLOCKED              (0x10)
+
+/* 0x42 OFDM_COR_INTEN */
+#define OFDM_COR_INTEN         (0x42)
+#define TPSRCVBAD              (0x04)
+#define TPSRCVCHANGED         (0x02)
+#define TPSRCVUPDATE           (0x01)
+
+/* 0x43 OFDM_COR_INSTAT */
+#define OFDM_COR_INSTAT        (0x43)
+
+/* 0x44 OFDM_COR_MODEGUARD */
+#define OFDM_COR_MODEGUARD     (0x44)
+#define FORCEMODE              (0x08)
+#define FORCEMODE8K			   (0x04)
+
+/* 0x45 OFDM_AGC_CTL */
+#define OFDM_AGC_CTL           (0x45)
+#define INITIAL_AGC_BW		   (0x08)
+#define AGCNEG                 (0x02)
+#define AGCLAST				   (0x10)
+
+/* 0x48 OFDM_AGC_TARGET */
+#define OFDM_AGC_TARGET		   (0x48)
+#define OFDM_AGC_TARGET_DEFAULT (0x28)
+#define OFDM_AGC_TARGET_IMPULSE (0x38)
+
+/* 0x49 OFDM_AGC_GAIN_1 */
+#define OFDM_AGC_GAIN_1        (0x49)
+
+/* 0x4B OFDM_ITB_CTL */
+#define OFDM_ITB_CTL           (0x4B)
+#define ITBINV                 (0x01)
+
+/* 0x4C OFDM_ITB_FREQ_1 */
+#define OFDM_ITB_FREQ_1        (0x4C)
+
+/* 0x4D OFDM_ITB_FREQ_2 */
+#define OFDM_ITB_FREQ_2        (0x4D)
+
+/* 0x4E  OFDM_CAS_CTL */       
+#define OFDM_CAS_CTL           (0x4E)
+#define ACSDIS                 (0x40)
+#define CCSEN                  (0x80)
+
+/* 0x4F CAS_FREQ */
+#define CAS_FREQ               (0x4F)
+
+/* 0x51 OFDM_SYR_CTL */
+#define OFDM_SYR_CTL           (0x51)
+#define SIXTH_ENABLE           (0x80)
+#define SYR_TRACKING_DISABLE   (0x01)
+
+/* 0x52 OFDM_SYR_STAT */
+#define OFDM_SYR_STAT		   (0x52)
+#define GI14_2K_SYR_LOCK	   (0x13)
+#define GI14_8K_SYR_LOCK	   (0x17)
+#define GI14_SYR_LOCK		   (0x10)
+
+/* 0x55 OFDM_SYR_OFFSET_1 */
+#define OFDM_SYR_OFFSET_1      (0x55)
+
+/* 0x56 OFDM_SYR_OFFSET_2 */
+#define OFDM_SYR_OFFSET_2      (0x56)
+
+/* 0x58 OFDM_SCR_CTL */
+#define OFDM_SCR_CTL           (0x58)
+#define SYR_ADJ_DECAY_MASK     (0x70)
+#define SYR_ADJ_DECAY          (0x30)
+ 
+/* 0x59 OFDM_PPM_CTL_1 */
+#define OFDM_PPM_CTL_1         (0x59)
+#define PPMMAX_MASK            (0x30)
+#define PPM256				   (0x30)
+
+/* 0x5B OFDM_TRL_NOMINALRATE_1 */
+#define OFDM_TRL_NOMINALRATE_1 (0x5B)
+
+/* 0x5C OFDM_TRL_NOMINALRATE_2 */
+#define OFDM_TRL_NOMINALRATE_2 (0x5C)
+
+/* 0x5D OFDM_TRL_TIME_1 */
+#define OFDM_TRL_TIME_1        (0x5D)
+
+/* 0x60 OFDM_CRL_FREQ_1 */
+#define OFDM_CRL_FREQ_1        (0x60)
+
+/* 0x63 OFDM_CHC_CTL_1 */
+#define OFDM_CHC_CTL_1         (0x63)
+#define MANMEAN1               (0xF0);
+#define CHCFIR                 (0x01)
+
+/* 0x64 OFDM_CHC_SNR */
+#define OFDM_CHC_SNR           (0x64)
+
+/* 0x65 OFDM_BDI_CTL */
+#define OFDM_BDI_CTL           (0x65)
+#define LP_SELECT              (0x02)
+
+/* 0x67 OFDM_TPS_RCVD_1 */
+#define OFDM_TPS_RCVD_1        (0x67)
+#define TPSFRAME               (0x03)
+
+/* 0x68 OFDM_TPS_RCVD_2 */
+#define OFDM_TPS_RCVD_2        (0x68)
+
+/* 0x69 OFDM_TPS_RCVD_3 */
+#define OFDM_TPS_RCVD_3        (0x69)
+
+/* 0x6A OFDM_TPS_RCVD_4 */
+#define OFDM_TPS_RCVD_4        (0x6A)
+
+/* 0x6B OFDM_TPS_RESERVED_1 */
+#define OFDM_TPS_RESERVED_1    (0x6B)
+
+/* 0x6C OFDM_TPS_RESERVED_2 */
+#define OFDM_TPS_RESERVED_2    (0x6C)
+
+/* 0x73 OFDM_MSC_REV */
+#define OFDM_MSC_REV           (0x73)
+
+/* 0x76 OFDM_SNR_CARRIER_2 */
+#define OFDM_SNR_CARRIER_2     (0x76)
+#define MEAN_MASK              (0x80)
+#define MEANBIT                (0x80)
+
+/* 0x80 ANALOG_CONTROL_0 */
+#define ANALOG_CONTROL_0       (0x80)
+#define POWER_DOWN_ADC         (0x40)
+
+/* 0x81 ENABLE_TUNER_IIC */
+#define ENABLE_TUNER_IIC       (0x81)
+#define ENABLE_TUNER_BIT       (0x01)
+
+/* 0x82 EN_DMD_RACQ */
+#define EN_DMD_RACQ            (0x82)
+#define EN_DMD_RACQ_REG_VAL    (0x81) 
+#define EN_DMD_RACQ_REG_VAL_14 (0x01)
+
+/* 0x84 SNR_COMMAND */
+#define SNR_COMMAND            (0x84)
+#define SNRStat                (0x80)
+
+/* 0x85 SNRCARRIERNUMBER_LSB */
+#define SNRCARRIERNUMBER_LSB   (0x85)
+
+/* 0x87 SNRMINTHRESHOLD_LSB */
+#define SNRMINTHRESHOLD_LSB    (0x87)
+
+/* 0x89 SNR_PER_CARRIER_LSB */
+#define SNR_PER_CARRIER_LSB    (0x89)
+
+/* 0x8B SNRBELOWTHRESHOLD_LSB */
+#define SNRBELOWTHRESHOLD_LSB  (0x8B)
+
+/* 0x91 RF_AGC_VAL_1 */
+#define RF_AGC_VAL_1           (0x91)
+
+/* 0x92 RF_AGC_STATUS */
+#define RF_AGC_STATUS          (0x92)
+
+/* 0x98 DIAG_CONFIG */
+#define DIAG_CONFIG            (0x98)
+#define DIAG_MASK              (0x70)
+#define TB_SET                 (0x10)
+#define TRAN_SELECT            (0x07)
+#define SERIAL_SELECT          (0x01)
+
+/* 0x99 SUB_DIAG_MODE_SEL */
+#define SUB_DIAG_MODE_SEL      (0x99)
+#define CLKINVERSION           (0x01)
+
+/* 0x9A TS_FORMAT */
+#define TS_FORMAT              (0x9A)
+#define ERROR_SENSE            (0x08)
+#define VALID_SENSE            (0x04)
+#define SYNC_SENSE             (0x02)
+#define GATED_CLOCK            (0x01)
+
+#define NXT6000ASICDEVICE      (0x0b)
+
diff -Nru a/drivers/media/dvb/frontends/stv0299.c b/drivers/media/dvb/frontends/stv0299.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/frontends/stv0299.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,880 @@
+/*
+    Universal driver for STV0299/TDA5059/SL1935 based
+    DVB QPSK frontends
+
+    Alps BSRU6, LG TDQB-S00x
+
+    Copyright (C) 2001-2002 Convergence Integrated Media GmbH
+	<ralph@convergence.de>,
+	<holger@convergence.de>,
+	<js@convergence.de>
+    
+    Philips SU1278/SH
+
+    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>
+
+    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"
+
+static int debug = 0;
+#define dprintk	if (debug) printk
+
+/* frontend types */
+#define UNKNOWN_FRONTEND  -1
+#define PHILIPS_SU1278SH   0
+#define ALPS_BSRU6         1
+#define LG_TDQF_S001F      2
+
+/* Master Clock = 88 MHz */
+#define M_CLK (88000000UL) 
+
+static
+struct dvb_frontend_info uni0299_info = {
+	name: "STV0299/TSA5059/SL1935 based",
+	type: FE_QPSK,
+	frequency_min: 950000,
+	frequency_max: 2150000,
+	frequency_stepsize: 125,   /* kHz for QPSK frontends */
+	frequency_tolerance: M_CLK/2000,
+	symbol_rate_min: 1000000,
+	symbol_rate_max: 45000000,
+	symbol_rate_tolerance: 500,  /* ppm */
+	notifier_delay: 0,
+	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_QPSK |
+	      FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO |
+	      FE_CAN_CLEAN_SETUP
+};
+
+
+static
+u8 init_tab [] = {
+        /* clock registers */
+        0x01, 0x15,   /* K = 0, DIRCLK = 0, M = 0x15                  */
+	0x02, 0x30,   /* STDBY = 0, VCO = 0 (ON), SERCLK = 0, P = 0   */
+                      /* f_VCO = 4MHz * 4 * (M+1) / (K+1) = 352 MHz   */
+	0x03, 0x00,   /* auxiliary clock not used                     */
+	0x04, 0x7d,   /* F22FR = 0x7d                                 */
+		      /* F22 = f_VCO / 128 / 0x7d = 22 kHz            */
+
+        /* I2C bus repeater */
+	0x05, 0x35,   /* I2CT = 0, SCLT = 1, SDAT = 1                 */
+
+ 	/* general purpose DAC registers */
+	0x06, 0x40,   /* DAC not used, set to high impendance mode    */
+	0x07, 0x00,   /* DAC LSB                                      */
+
+	/* DiSEqC registers */
+	0x08, 0x40,   /* DiSEqC off                                   */
+	0x09, 0x00,   /* FIFO                                         */
+
+        /* Input/Output configuration register */
+	0x0c, 0x51,   /* OP1 ctl = Normal, OP1 val = 1 (LNB Power ON) */
+	              /* OP0 ctl = Normal, OP0 val = 1 (18 V)         */
+                      /* Nyquist filter = 00, QPSK reverse = 0        */
+                   
+        /* AGC1 control register */
+	0x0d, 0x82,   /* DC offset compensation = ON, beta_agc1 = 2   */
+
+        /* Timing loop register */
+	0x0e, 0x23,   /* alpha_tmg = 2, beta_tmg = 3                  */
+
+	0x10, 0x3f,   // AGC2  0x3d
+	0x11, 0x84,
+	0x12, 0xb5,   // Lock detect: -64  Carrier freq detect:on
+	0x13, 0xb6,   // alpha_car b:4 a:0  noise est:256ks  derot:on
+	0x14, 0x93,   // beat carc:0 d:0 e:0xf  phase detect algo: 1
+	0x15, 0xc9,   // lock detector threshold
+
+	0x16, 0x1d,   /* AGC1 integrator value                        */
+	0x17, 0x00,
+	0x18, 0x14,
+	0x19, 0xf2,
+
+	0x1a, 0x11,
+
+	0x1b, 0x9c,
+	0x1c, 0x00,
+	0x1d, 0x00,
+	0x1e, 0x0b,
+	0x1f, 0x50,
+
+	0x20, 0x00,
+	0x21, 0x00,
+	0x22, 0x00,
+	0x23, 0x00,
+	0x24, 0xff,
+	0x25, 0xff,
+	0x26, 0xff,
+
+	0x28, 0x00,  // out imp: normal  out type: parallel FEC mode:0
+	0x29, 0x1e,  // 1/2 threshold
+	0x2a, 0x14,  // 2/3 threshold
+	0x2b, 0x0f,  // 3/4 threshold
+	0x2c, 0x09,  // 5/6 threshold
+	0x2d, 0x05,  // 7/8 threshold
+	0x2e, 0x01,
+
+	0x31, 0x1f,  // test all FECs
+
+	0x32, 0x19,  // viterbi and synchro search
+	0x33, 0xfc,  // rs control
+	0x34, 0x93,  // error control
+
+	0x0b, 0x00,
+	0x27, 0x00,
+	0x2f, 0x00,
+	0x30, 0x00,
+	0x35, 0x00,
+	0x36, 0x00,
+	0x37, 0x00,
+	0x38, 0x00,
+	0x39, 0x00,
+	0x3a, 0x00,
+	0x3b, 0x00,
+	0x3c, 0x00,
+	0x3d, 0x00,
+	0x3e, 0x00,
+	0x3f, 0x00,
+	0x40, 0x00,
+	0x41, 0x00,
+	0x42, 0x00,
+	0x43, 0x00,
+	0x44, 0x00,
+	0x45, 0x00,
+	0x46, 0x00,
+	0x47, 0x00,
+	0x48, 0x00,
+	0x49, 0x00,
+	0x4a, 0x00,
+	0x4b, 0x00,
+	0x4c, 0x00,
+	0x4d, 0x00,
+	0x4e, 0x00,
+	0x4f, 0x00
+};
+
+
+static
+int stv0299_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
+{
+	int ret;
+	u8 buf [] = { reg, data };
+	struct i2c_msg msg = { addr: 0x68, flags: 0, buf: buf, len: 2 };
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	ret = i2c->xfer (i2c, &msg, 1);
+
+	if (ret != 1) 
+		dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, ret == %i)\n",
+			__FUNCTION__, reg, data, ret);
+
+	return (ret != 1) ? -1 : 0;
+}
+
+
+static
+u8 stv0299_readreg (struct dvb_i2c_bus *i2c, u8 reg)
+{
+	int ret;
+	u8 b0 [] = { reg };
+	u8 b1 [] = { 0 };
+	struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: b0, len: 1 },
+			   { addr: 0x68, flags: I2C_M_RD, buf: b1, len: 1 } };
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	ret = i2c->xfer (i2c, msg, 2);
+        
+	if (ret != 2) 
+		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
+
+	return b1[0];
+}
+
+
+static
+int stv0299_readregs (struct dvb_i2c_bus *i2c, u8 reg1, u8 *b, u8 len)
+{
+        int ret;
+        struct i2c_msg msg [] = { { addr: 0x68, flags: 0, buf: &reg1, len: 1 },
+                           { addr: 0x68, flags: I2C_M_RD, buf: b, len: len } };
+
+	dprintk ("%s\n", __FUNCTION__);
+
+        ret = i2c->xfer (i2c, msg, 2);
+
+        if (ret != 2)
+                dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
+
+        return ret == 2 ? 0 : -1;
+}
+
+
+static
+int pll_write (struct dvb_i2c_bus *i2c, u8 data [4], int ftype)
+{
+	int ret;
+	u8 rpt1 [] = { 0x05, 0xb5 };  /*  enable i2c repeater on stv0299  */
+	/* TSA5059 i2c-bus address */
+	u8 addr = (ftype == PHILIPS_SU1278SH) ? 0x60 : 0x61;
+	struct i2c_msg msg [] = {{ addr: 0x68, flags: 0, buf: rpt1, len: 2 },
+			         { addr: addr, flags: 0, buf: data, len: 4 }};
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	if (ftype == LG_TDQF_S001F || ftype == ALPS_BSRU6) {
+		ret  = i2c->xfer (i2c, &msg[0], 1);
+		ret += i2c->xfer (i2c, &msg[1], 1);
+	}
+	else {
+		ret = i2c->xfer (i2c, msg, 2);
+	}
+
+	if (ret != 2)
+		dprintk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret);
+
+	return (ret != 2) ? -1 : 0;
+}
+
+
+static
+int sl1935_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, int ftype)
+{
+	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 / ratios[ratio];
+
+	buf[0] = (freq >> 8) & 0x7f;
+	buf[1] = freq & 0xff;
+	buf[2] = 0x80 | ratio;
+
+	if (freq < 1531000)
+		buf[3] = 0x10;
+	else
+		buf[3] = 0x00;
+
+	return pll_write (i2c, buf, ftype);
+}
+
+/**
+ *   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)
+{
+        u32 div = freq / 125;
+
+	u8 buf[4] = { (div >> 8) & 0x7f, div & 0xff, 0x84 };
+
+	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;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	return pll_write (i2c, buf, ftype);
+}
+
+static
+int pll_set_tv_freq (struct dvb_i2c_bus *i2c, u32 freq, int ftype)
+{
+	if (ftype == LG_TDQF_S001F)
+		return sl1935_set_tv_freq(i2c, freq, ftype);
+	else
+		return tsa5059_set_tv_freq(i2c, freq, ftype);
+}
+
+#if 0
+static
+int tsa5059_read_status	(struct dvb_i2c_bus *i2c)
+{
+	int ret;
+	u8 rpt1 [] = { 0x05, 0xb5 };
+	u8 stat [] = { 0 };
+
+	struct i2c_msg msg [] = {{ addr: 0x68, flags: 0, buf: rpt1, len: 2 },
+			  { addr: 0x60, flags: I2C_M_RD, buf: stat, len: 1 }};
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	ret = i2c->xfer (i2c, msg, 2);
+
+	if (ret != 2)
+		dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret);
+
+	return stat[0];
+}
+#endif
+
+
+static
+int stv0299_init (struct dvb_i2c_bus *i2c, int ftype)
+{
+	int i;
+
+	dprintk("stv0299: init chip\n");
+
+	for (i=0; i<sizeof(init_tab); i+=2)
+		stv0299_writereg (i2c, init_tab[i], init_tab[i+1]);
+
+        /* AGC1 reference register setup */
+	if (ftype == PHILIPS_SU1278SH)
+	  stv0299_writereg (i2c, 0x0f, 0xd2);  /* Iagc = Inverse, m1 = 18 */
+	else
+	  stv0299_writereg (i2c, 0x0f, 0x52);  /* Iagc = Normal,  m1 = 18 */
+
+	return 0;
+}
+
+
+static
+int stv0299_check_inversion (struct dvb_i2c_bus *i2c)
+{
+	dprintk ("%s\n", __FUNCTION__);
+
+	if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
+		u8 val = stv0299_readreg (i2c, 0x0c);
+		return stv0299_writereg (i2c, 0x0c, val ^ 0x01);
+	}
+
+	return 0;
+}
+
+
+static
+int stv0299_set_FEC (struct dvb_i2c_bus *i2c, fe_code_rate_t fec)
+{
+	dprintk ("%s\n", __FUNCTION__);
+
+	switch (fec) {
+	case FEC_AUTO:
+		return stv0299_writereg (i2c, 0x31, 0x1f);
+	case FEC_1_2:
+		return stv0299_writereg (i2c, 0x31, 0x01);
+	case FEC_2_3:
+		return stv0299_writereg (i2c, 0x31, 0x02);
+	case FEC_3_4:
+		return stv0299_writereg (i2c, 0x31, 0x04);
+	case FEC_5_6:
+		return stv0299_writereg (i2c, 0x31, 0x08);
+	case FEC_7_8:
+		return stv0299_writereg (i2c, 0x31, 0x10);
+	default:
+		return -EINVAL;
+	}
+}
+
+
+static
+fe_code_rate_t stv0299_get_fec (struct dvb_i2c_bus *i2c)
+{
+	static fe_code_rate_t fec_tab [] = { FEC_2_3, FEC_3_4, FEC_5_6,
+					     FEC_7_8, FEC_1_2 };
+	u8 index;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	index = stv0299_readreg (i2c, 0x1b);
+	index &= 0x7;
+
+	if (index > 4)
+		return FEC_AUTO;
+
+	return fec_tab [index];
+}
+
+
+static
+int stv0299_wait_diseqc_fifo (struct dvb_i2c_bus *i2c, int timeout)
+{
+	unsigned long start = jiffies;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	while (stv0299_readreg(i2c, 0x0a) & 1) {
+		if (jiffies - start > timeout) {
+			dprintk ("%s: timeout!!\n", __FUNCTION__);
+			return -ETIMEDOUT;
+		}
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout (1);
+	};
+
+	return 0;
+}
+
+
+static
+int stv0299_wait_diseqc_idle (struct dvb_i2c_bus *i2c, int timeout)
+{
+	unsigned long start = jiffies;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	while ((stv0299_readreg(i2c, 0x0a) & 3) != 2 ) {
+		if (jiffies - start > timeout) {
+			dprintk ("%s: timeout!!\n", __FUNCTION__);
+			return -ETIMEDOUT;
+		}
+		current->state = TASK_INTERRUPTIBLE;
+		schedule_timeout (1);
+	};
+
+	return 0;
+}
+
+
+static
+int stv0299_send_diseqc_msg (struct dvb_i2c_bus *i2c,
+			     struct dvb_diseqc_master_cmd *m)
+{
+	u8 val;
+	int i;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
+		return -ETIMEDOUT;
+
+	val = stv0299_readreg (i2c, 0x08);
+
+	if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x6))  /* DiSEqC mode */
+		return -EREMOTEIO;
+
+	for (i=0; i<m->msg_len; i++) {
+		if (stv0299_wait_diseqc_fifo (i2c, 100) < 0)
+			return -ETIMEDOUT;
+
+		if (stv0299_writereg (i2c, 0x09, m->msg[i]))
+			return -EREMOTEIO;
+	}
+
+	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
+		return -ETIMEDOUT;
+
+	return 0;
+}
+
+
+static
+int stv0299_send_diseqc_burst (struct dvb_i2c_bus *i2c, fe_sec_mini_cmd_t burst)
+{
+	u8 val;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
+		return -ETIMEDOUT;
+
+	val = stv0299_readreg (i2c, 0x08);
+
+	if (stv0299_writereg (i2c, 0x08, (val & ~0x7) | 0x2))   /* burst mode */
+		return -EREMOTEIO;
+
+	if (stv0299_writereg (i2c, 0x09, burst == SEC_MINI_A ? 0x00 : 0xff))
+		return -EREMOTEIO;
+
+	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
+		return -ETIMEDOUT;
+
+	if (stv0299_writereg (i2c, 0x08, val))
+		return -EREMOTEIO;
+
+	return 0;
+}
+
+
+static
+int stv0299_set_tone (struct dvb_i2c_bus *i2c, fe_sec_tone_mode_t tone)
+{
+	u8 val;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	if (stv0299_wait_diseqc_idle (i2c, 100) < 0)
+		return -ETIMEDOUT;
+
+	val = stv0299_readreg (i2c, 0x08);
+
+	switch (tone) {
+	case SEC_TONE_ON:
+		return stv0299_writereg (i2c, 0x08, val | 0x3);
+	case SEC_TONE_OFF:
+		return stv0299_writereg (i2c, 0x08, (val & ~0x3) | 0x02);
+	default:
+		return -EINVAL;
+	};
+}
+
+
+static
+int stv0299_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage)
+{
+	u8 val;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	val = stv0299_readreg (i2c, 0x0c);
+	val &= 0x0f;
+	val |= 0x40;   /* LNB power on */
+
+	switch (voltage) {
+	case SEC_VOLTAGE_13:
+		return stv0299_writereg (i2c, 0x0c, val);
+	case SEC_VOLTAGE_18:
+		return stv0299_writereg (i2c, 0x0c, val | 0x10);
+	default:
+		return -EINVAL;
+	};
+}
+
+
+static
+int stv0299_set_symbolrate (struct dvb_i2c_bus *i2c, u32 srate)
+{
+	u32 ratio;
+	u32 tmp;
+	u8 aclk = 0xb4, bclk = 0x51;
+
+	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; }
+
+#define FIN (M_CLK >> 4)
+
+	tmp = srate << 4;
+	ratio = tmp / FIN;
+        
+	tmp = (tmp % FIN) << 8;
+	ratio = (ratio << 8) + tmp / FIN;
+        
+	tmp = (tmp % FIN) << 8;
+	ratio = (ratio << 8) + tmp / FIN;
+  
+	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);
+
+	return 0;
+}
+
+
+static
+int stv0299_get_symbolrate (struct dvb_i2c_bus *i2c)
+{
+	u32 Mclk = M_CLK / 4096L;
+	u32 srate;
+	s32 offset;
+	u8 sfr[3];
+	s8 rtf;
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	stv0299_readregs (i2c, 0x1f, sfr, 3);
+	stv0299_readregs (i2c, 0x1a, &rtf, 1);
+
+	srate = (sfr[0] << 8) | sfr[1];
+	srate *= Mclk;
+	srate /= 16;
+	srate += (sfr[2] >> 4) * Mclk / 256;
+
+	offset = (s32) rtf * (srate / 4096L);
+	offset /= 128;
+
+	srate += offset;
+
+	srate += 1000;
+	srate /= 2000;
+	srate *= 2000;
+
+	return srate;
+}
+
+
+static
+int uni0299_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+        int tuner_type = (int)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));
+		break;
+
+	case FE_READ_STATUS:
+	{
+		fe_status_t *status = (fe_status_t *) arg;
+		u8 signal = 0xff - stv0299_readreg (i2c, 0x18);
+		u8 sync = stv0299_readreg (i2c, 0x1b);
+
+		dprintk ("VSTATUS: 0x%02x\n", sync);
+
+		*status = 0;
+
+		if (signal > 10)
+			*status |= FE_HAS_SIGNAL;
+
+		if (sync & 0x80)
+			*status |= FE_HAS_CARRIER;
+
+		if (sync & 0x10)
+			*status |= FE_HAS_VITERBI;
+
+		if (sync & 0x08)
+			*status |= FE_HAS_SYNC;
+
+		if ((sync & 0x98) == 0x98)
+			*status |= FE_HAS_LOCK;
+
+		break;
+	}
+
+        case FE_READ_BER:
+		*((u32*) arg) = (stv0299_readreg (i2c, 0x1d) << 8)
+			       | stv0299_readreg (i2c, 0x1e);
+		break;
+
+	case FE_READ_SIGNAL_STRENGTH:
+	{
+		s32 signal =  0xffff - ((stv0299_readreg (i2c, 0x18) << 8)
+			               | stv0299_readreg (i2c, 0x19));
+
+		dprintk ("AGC2I: 0x%02x%02x, signal=0x%04x\n",
+			 stv0299_readreg (i2c, 0x18),
+			 stv0299_readreg (i2c, 0x19), signal);
+
+		signal = signal * 5 / 4;
+		*((u16*) arg) = (signal > 0xffff) ? 0xffff :
+				(signal < 0) ? 0 : signal;
+		break;
+	}
+        case FE_READ_SNR:
+	{
+		s32 snr = 0xffff - ((stv0299_readreg (i2c, 0x24) << 8)
+			           | stv0299_readreg (i2c, 0x25));
+		snr = 3 * (snr - 0xa100);
+		*((u16*) arg) = (snr > 0xffff) ? 0xffff :
+				(snr < 0) ? 0 : 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;
+
+		pll_set_tv_freq (i2c, p->frequency, tuner_type);
+                stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
+                stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
+		stv0299_check_inversion (i2c);
+		/* pll_set_tv_freq (i2c, p->frequency, tuner_type); */
+		stv0299_writereg (i2c, 0x22, 0x00);
+		stv0299_writereg (i2c, 0x23, 0x00);
+		stv0299_readreg (i2c, 0x23);
+		stv0299_writereg (i2c, 0x12, 0xb9);
+
+		/* printk ("%s: tsa5059 status: %x\n", __FUNCTION__, tsa5059_read_status(i2c)); */
+                break;
+        }
+
+        case FE_GET_FRONTEND:
+        {
+		struct dvb_frontend_parameters *p = arg;
+		s32 derot_freq;
+
+		derot_freq = (s32)(s16) ((stv0299_readreg (i2c, 0x22) << 8)
+					| stv0299_readreg (i2c, 0x23));
+
+		derot_freq *= (M_CLK >> 16);
+		derot_freq += 500;
+		derot_freq /= 1000;
+
+		p->frequency += derot_freq;
+		p->inversion = (stv0299_readreg (i2c, 0x0c) & 1) ?
+						INVERSION_OFF : INVERSION_ON;
+		p->u.qpsk.fec_inner = stv0299_get_fec (i2c);
+		p->u.qpsk.symbol_rate = stv0299_get_symbolrate (i2c);
+                break;
+        }
+
+        case FE_SLEEP:
+		stv0299_writereg (i2c, 0x0c, 0x00);  /*  LNB power off! */
+		stv0299_writereg (i2c, 0x02, 0x80);
+		break;
+
+        case FE_INIT:
+		return stv0299_init (i2c, tuner_type);
+
+        case FE_RESET:
+		stv0299_writereg (i2c, 0x22, 0x00);
+		stv0299_writereg (i2c, 0x23, 0x00);
+		stv0299_readreg (i2c, 0x23);
+		stv0299_writereg (i2c, 0x12, 0xb9);
+                break;
+
+	case FE_DISEQC_SEND_MASTER_CMD:
+		return stv0299_send_diseqc_msg (i2c, arg);
+
+	case FE_DISEQC_SEND_BURST:
+		return stv0299_send_diseqc_burst (i2c, (fe_sec_mini_cmd_t) arg);
+
+	case FE_SET_TONE:
+		return stv0299_set_tone (i2c, (fe_sec_tone_mode_t) arg);
+
+	case FE_SET_VOLTAGE:
+		return stv0299_set_voltage (i2c, (fe_sec_voltage_t) arg);
+
+	default:
+		return -EOPNOTSUPP;
+	};
+
+	return 0;
+}
+
+static
+int probe_tuner (struct dvb_i2c_bus *i2c)
+{
+	int type;
+
+        /* read the status register of TSA5059 */
+	u8 rpt[] = { 0x05, 0xb5 };
+        u8 stat [] = { 0 };
+	struct i2c_msg msg1 [] = {{ addr: 0x68, flags: 0, buf: rpt,  len: 2 },
+                           { addr: 0x60, flags: I2C_M_RD, buf: stat, len: 1 }};
+	struct i2c_msg msg2 [] = {{ addr: 0x68, flags: 0, buf: rpt,  len: 2 },
+                           { addr: 0x61, flags: I2C_M_RD, buf: stat, len: 1 }};
+
+	if (i2c->xfer(i2c, msg1, 2) == 2) {
+		type = PHILIPS_SU1278SH;
+		printk ("%s: setup for tuner SU1278/SH\n", __FILE__);
+	} else if (i2c->xfer(i2c, msg2, 2) == 2) {
+if (0) { //		if ((stat[0] & 0x3f) == 0) {
+			type = LG_TDQF_S001F;
+			printk ("%s: setup for tuner TDQF-S001F\n", __FILE__);
+		}
+		else {
+			type = ALPS_BSRU6;
+			printk ("%s: setup for tuner BSRU6, TDQB-S00x\n", __FILE__);
+		}
+	} else {
+		type = UNKNOWN_FRONTEND;
+		printk ("%s: unknown PLL synthesizer, "
+			"please report to <linuxdvb@linuxtv.org>!!\n",
+			__FILE__);
+	}
+	return type;
+}
+
+
+static
+int uni0299_attach (struct dvb_i2c_bus *i2c)
+{
+        int tuner_type;
+	u8 id = stv0299_readreg (i2c, 0x00);
+
+	dprintk ("%s\n", __FUNCTION__);
+
+	/* register 0x00 contains 0xa1 for STV0299 and STV0299B */
+	/* register 0x00 might contain 0x80 when returning from standby */
+	if (id != 0xa1 && id != 0x80)
+		return -ENODEV;
+
+	if ((tuner_type = probe_tuner(i2c)) < 0)
+		return -ENODEV;
+
+	dvb_register_frontend (uni0299_ioctl, i2c, (void*) tuner_type, 
+			       &uni0299_info);
+
+	return 0;
+}
+
+
+static
+void uni0299_detach (struct dvb_i2c_bus *i2c)
+{
+	dprintk ("%s\n", __FUNCTION__);
+
+	dvb_unregister_frontend (uni0299_ioctl, i2c);
+}
+
+
+static
+int __init init_uni0299 (void)
+{
+	dprintk ("%s\n", __FUNCTION__);
+
+	return dvb_register_i2c_device (THIS_MODULE, uni0299_attach, uni0299_detach);
+}
+
+
+static 
+void __exit exit_uni0299 (void)
+{
+	dprintk ("%s\n", __FUNCTION__);
+
+	dvb_unregister_i2c_device (uni0299_attach);
+}
+
+module_init (init_uni0299);
+module_exit (exit_uni0299);
+
+MODULE_PARM(debug,"i");
+MODULE_PARM_DESC(debug, "enable verbose debug messages");
+
+MODULE_DESCRIPTION("Universal STV0299/TSA5059/SL1935 DVB Frontend driver");
+MODULE_AUTHOR("Ralph Metzler, Holger Waechtler, Peter Schildmann, Felix Domke, Andreas Oberritter");
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c
--- a/drivers/media/dvb/frontends/ves1820.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/media/dvb/frontends/ves1820.c	Sat Apr 19 19:51:47 2003
@@ -23,12 +23,14 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 
-#include "compat.h"
 #include "dvb_frontend.h"
 
 
-static int debug = 0;
-#define dprintk	if (debug) printk
+#if 0
+#define dprintk(x...) printk(x)
+#else
+#define dprintk(x...)
+#endif
 
 
 /**
@@ -36,36 +38,58 @@
  *  extra memory but use frontend->data as bitfield
  */
 
-#define SET_PWM(frontend,pwm) do { 		\
-	(int) frontend->data &= ~0xff; 		\
-	(int) frontend->data |= pwm; 		\
+#define SET_PWM(data,pwm) do { 		\
+	(int) data &= ~0xff; 		\
+	(int) data |= pwm; 		\
 } while (0)
 
-#define SET_REG0(frontend,reg0) do {		\
-	(int) frontend->data &= ~(0xff << 8); 	\
-	(int) frontend->data |= reg0 << 8; 	\
+#define SET_REG0(data,reg0) do {	\
+	(int) data &= ~(0xff << 8); 	\
+	(int) data |= reg0 << 8; 	\
 } while (0)
 
-#define SET_TUNER(frontend,type) do {		\
-	(int) frontend->data &= ~(0xff << 16); 	\
-	(int) frontend->data |= type << 16;	\
+#define SET_TUNER(data,type) do {	\
+	(int) data &= ~(0xff << 16); 	\
+	(int) data |= type << 16;	\
 } while (0)
 
-#define GET_PWM(frontend) ((u8) ((int) frontend->data & 0xff))
-#define GET_REG0(frontend) ((u8) (((int) frontend->data >> 8) & 0xff))
-#define GET_TUNER(frontend) ((u8) (((int) frontend->data >> 16) & 0xff))
+#define SET_DEMOD_ADDR(data,type) do {	\
+	(int) data &= ~(0xff << 24); 	\
+	(int) data |= type << 24;	\
+} while (0)
+
+#define GET_PWM(data) ((u8) ((int) data & 0xff))
+#define GET_REG0(data) ((u8) (((int) data >> 8) & 0xff))
+#define GET_TUNER(data) ((u8) (((int) data >> 16) & 0xff))
+#define GET_DEMOD_ADDR(data) ((u8) (((int) data >> 24) & 0xff))
 
 
+static inline
+void ddelay (int ms)
+{
+	current->state=TASK_INTERRUPTIBLE;
+	schedule_timeout((HZ*ms)/1000);
+}
+
 
 static
 struct dvb_frontend_info ves1820_info = {
-	.name	= "VES1820/Grundig tuner as used on the Siemens DVB-C card",
-	.type	= FE_QAM,
-	.frequency_stepsize	= 62500,
-	.frequency_min		= 51000000,
-	.frequency_max		= 858000000,
-	.caps	= FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
-		  FE_CAN_QAM_128 | FE_CAN_QAM_256
+	.name = "VES1820 based DVB-C frontend",
+	.type = FE_QAM,
+	.frequency_stepsize = 62500,
+	.frequency_min = 51000000,
+	.frequency_max = 858000000,
+	.symbol_rate_min = (57840000/2)/64,     /* SACLK/64 == (XIN/2)/64 */
+	.symbol_rate_max = (57840000/2)/4,      /* SACLK/4 */
+#if 0
+	frequency_tolerance: ???,
+	symbol_rate_tolerance: ???,  /* ppm */  /* == 8% (spec p. 5) */
+	notifier_delay: ?,
+#endif
+	.caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
+		FE_CAN_QAM_128 | FE_CAN_QAM_256 | 
+		FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO |
+		FE_CAN_CLEAN_SETUP | FE_CAN_RECOVER
 };
 
 
@@ -73,22 +97,24 @@
 static
 u8 ves1820_inittab [] =
 {
-  0x69, 0x6A, 0x9B, 0x0A, 0x52, 0x46, 0x26, 0x1A,
-  0x43, 0x6A, 0xAA, 0xAA, 0x1E, 0x85, 0x43, 0x28,
-  0xE0, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-  0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x40
+	0x69, 0x6A, 0x9B, 0x0A, 0x52, 0x46, 0x26, 0x1A,
+	0x43, 0x6A, 0xAA, 0xAA, 0x1E, 0x85, 0x43, 0x28,
+	0xE0, 0x00, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+	0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+	0x00, 0x00, 0x00, 0x00, 0x40
 };
 
 
 static
-int ves1820_writereg (struct dvb_i2c_bus *i2c, u8 reg, u8 data)
+int ves1820_writereg (struct dvb_frontend *fe, u8 reg, u8 data)
 {
-        int ret;
+	u8 addr = GET_DEMOD_ADDR(fe->data);
         u8 buf[] = { 0x00, reg, data };
-	struct i2c_msg msg = { .addr = 0x09, .flags = 0, .buf = buf, .len = 3 };
+	struct i2c_msg msg = { addr: addr, flags: 0, buf: buf, len: 3 };
+	struct dvb_i2c_bus *i2c = fe->i2c;
+        int ret;
 
 	ret = i2c->xfer (i2c, &msg, 1);
 
@@ -103,14 +129,15 @@
 
 
 static
-u8 ves1820_readreg (struct dvb_i2c_bus *i2c, u8 reg)
+u8 ves1820_readreg (struct dvb_frontend *fe, u8 reg)
 {
-	int ret;
 	u8 b0 [] = { 0x00, reg };
 	u8 b1 [] = { 0 };
-	struct i2c_msg msg [] = { { .addr = 0x09, .flags = 0, .buf = b0, .len = 2 },
-	                   { .addr = 0x09, .flags = I2C_M_RD, .buf = b1, .len = 1 } };
-
+	u8 addr = GET_DEMOD_ADDR(fe->data);
+	struct i2c_msg msg [] = { { addr: addr, flags: 0, buf: b0, len: 2 },
+	                   { addr: addr, flags: I2C_M_RD, buf: b1, len: 1 } };
+	struct dvb_i2c_bus *i2c = fe->i2c;
+	int ret;
 
 	ret = i2c->xfer (i2c, msg, 2);
 
@@ -125,7 +152,7 @@
 int tuner_write (struct dvb_i2c_bus *i2c, u8 addr, u8 data [4])
 {
         int ret;
-        struct i2c_msg msg = { .addr = addr, .flags = 0, .buf = data, .len = 4 };
+        struct i2c_msg msg = { addr: addr, flags: 0, buf: data, len: 4 };
 
         ret = i2c->xfer (i2c, &msg, 1);
 
@@ -141,15 +168,18 @@
  *   reference clock comparision frequency of 62.5 kHz.
  */
 static
-int tuner_set_tv_freq (struct dvb_frontend *frontend, u32 freq)
+int tuner_set_tv_freq (struct dvb_frontend *fe, u32 freq)
 {
         u32 div;
 	static u8 addr [] = { 0x61, 0x62 };
 	static u8 byte3 [] = { 0x8e, 0x85 };
-	int tuner_type = GET_TUNER(frontend);
+	int tuner_type = GET_TUNER(fe->data);
         u8 buf [4];
 
-	div = (freq + 36250000 + 31250) / 62500;
+	if (tuner_type == 0xff)     /*  PLL not reachable over i2c ...  */
+		return 0;
+
+	div = (freq + 36125000 + 31250) / 62500;
 	buf[0] = (div >> 8) & 0x7f;
 	buf[1] = div & 0xff;
 	buf[2] = byte3[tuner_type];
@@ -163,115 +193,56 @@
 			  freq < 454000000 ? 0x92 : 0x34);
 	}
 
-        return tuner_write (frontend->i2c, addr[tuner_type], buf);
+        return tuner_write (fe->i2c, addr[tuner_type], buf);
 }
 
 
 static
-int probe_tuner (struct dvb_frontend *frontend)
+int ves1820_setup_reg0 (struct dvb_frontend *fe, u8 reg0)
 {
-	struct dvb_i2c_bus *i2c = frontend->i2c;
-	struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = NULL, .len = 0 };
+	reg0 |= GET_REG0(fe->data) & 0x62;
+	
+	ves1820_writereg (fe, 0x00, reg0 & 0xfe);
+        ves1820_writereg (fe, 0x00, reg0 | 0x01);
 
-	if (i2c->xfer(i2c, &msg, 1) == 1) {
-		SET_TUNER(frontend,0);
-		printk ("%s: setup for tuner spXXXX\n", __FILE__);
-	} else {
-		SET_TUNER(frontend,1);
-		printk ("%s: setup for tuner sp5659c\n", __FILE__);
+	/**
+	 *  check lock and toggle inversion bit if required...
+	 */
+	if (!(ves1820_readreg (fe, 0x11) & 0x08)) {
+		ddelay(1);
+		if (!(ves1820_readreg (fe, 0x11) & 0x08)) {
+			reg0 ^= 0x20;
+			ves1820_writereg (fe, 0x00, reg0 & 0xfe);
+        		ves1820_writereg (fe, 0x00, reg0 | 0x01);
+		}
 	}
 
+	SET_REG0(fe->data, reg0);
+
 	return 0;
 }
 
 
 static
-int ves1820_init (struct dvb_frontend *frontend)
+int ves1820_init (struct dvb_frontend *fe)
 {
-	struct dvb_i2c_bus *i2c = frontend->i2c;
-	u8 b0 [] = { 0xff };
-	u8 pwm;
 	int i;
-	struct i2c_msg msg [] = { { .addr = 0x50, .flags = 0, .buf = b0, .len = 1 },
-	                   { .addr = 0x50, .flags = I2C_M_RD, .buf = &pwm, .len = 1 } };
         
         dprintk("VES1820: init chip\n");
 
-	i2c->xfer (i2c, msg, 2);
-
-	dprintk("VES1820: pwm=%02x\n", pwm);
-
-	if (pwm == 0xff)
-                pwm=0x48;
-
-        ves1820_writereg (i2c, 0, 0);
+        ves1820_writereg (fe, 0, 0);
 
 	for (i=0; i<53; i++)
-                ves1820_writereg (i2c, i, ves1820_inittab[i]);
-
-        ves1820_writereg (i2c, 0x34, pwm);
-
-	(int) frontend->data = 0;
-	SET_PWM(frontend,pwm);
-
-	probe_tuner (frontend);
-
-	return 0;
-}
-
-
-static
-int ves1820_setup_reg0 (struct dvb_frontend *frontend,
-			u8 real_qam, fe_spectral_inversion_t inversion)
-{
-	struct dvb_i2c_bus *i2c = frontend->i2c;
-	u8 reg0 = (ves1820_inittab[0] & 0xe3) | (real_qam << 2);
-
-	switch (inversion) {
-	case INVERSION_OFF:      /* XXX FIXME: reversed?? p. 25  */
-		reg0 |= 0x20;
-		break;
-
-	case INVERSION_ON:
-		reg0 &= 0xdf;
-		break;
-
-	default:
-		return -EINVAL;
-	}
-
-	SET_REG0(frontend, reg0);
+                ves1820_writereg (fe, i, ves1820_inittab[i]);
 
-	ves1820_writereg (i2c, 0x00, reg0 & 0xfe);
-        ves1820_writereg (i2c, 0x00, reg0);
+	ves1820_writereg (fe, 0x34, GET_PWM(fe->data)); 
 
 	return 0;
 }
 
 
 static
-int ves1820_reset (struct dvb_frontend *frontend)
-{
-	struct dvb_i2c_bus *i2c = frontend->i2c;
-	u8 reg0 = GET_REG0(frontend);
-
-	ves1820_writereg (i2c, 0x00, reg0 & 0xfe);
-        ves1820_writereg (i2c, 0x00, reg0);
-
-	return 0;
-}
-
-
-static
-void ves1820_reset_uncorrected_block_counter (struct dvb_i2c_bus *i2c)
-{
-	ves1820_writereg (i2c, 0x10, ves1820_inittab[0x10] & 0xdf);
-        ves1820_writereg (i2c, 0x10, ves1820_inittab[0x10]);
-}
-
-
-static
-int ves1820_set_symbolrate (struct dvb_i2c_bus *i2c, u32 symbolrate)
+int ves1820_set_symbolrate (struct dvb_frontend *fe, u32 symbolrate)
 {
         s32 BDR; 
         s32 BDRI;
@@ -280,7 +251,7 @@
         u32 tmp, ratio;
 
 #define XIN 57840000UL
-#define FIN (57840000UL>>4)
+#define FIN (XIN >> 4)
 
         if (symbolrate > XIN/2) 
                 symbolrate = XIN/2;
@@ -317,81 +288,50 @@
         
         NDEC = (NDEC << 6) | ves1820_inittab[0x03];
 
-        ves1820_writereg (i2c, 0x03, NDEC);
-        ves1820_writereg (i2c, 0x0a, BDR&0xff);
-        ves1820_writereg (i2c, 0x0b, (BDR>> 8)&0xff);
-        ves1820_writereg (i2c, 0x0c, (BDR>>16)&0x3f);
+        ves1820_writereg (fe, 0x03, NDEC);
+        ves1820_writereg (fe, 0x0a, BDR&0xff);
+        ves1820_writereg (fe, 0x0b, (BDR>> 8)&0xff);
+        ves1820_writereg (fe, 0x0c, (BDR>>16)&0x3f);
 
-        ves1820_writereg (i2c, 0x0d, BDRI);
-        ves1820_writereg (i2c, 0x0e, SFIL);
+        ves1820_writereg (fe, 0x0d, BDRI);
+        ves1820_writereg (fe, 0x0e, SFIL);
 
         return 0;
 }
 
 
 static
-void ves1820_reset_pwm (struct dvb_frontend *frontend) 
+int ves1820_set_parameters (struct dvb_frontend *fe,
+			    struct dvb_frontend_parameters *p)
 {
-	u8 pwm = GET_PWM(frontend);
-
-	ves1820_writereg (frontend->i2c, 0x34, pwm); 
-}
-
-
-typedef struct {
-        fe_modulation_t  QAM_Mode;
-        int         NoOfSym;
-        u8          Reg1;
-        u8          Reg5;
-        u8          Reg8;
-        u8          Reg9;
-} QAM_SETTING;
+	static const u8 reg0x00 [] = { 0x00, 0x04, 0x08, 0x0c, 0x10 };
+	static const u8 reg0x01 [] = {  140,  140,  106,  120,   92 };
+	static const u8 reg0x05 [] = {  135,  100,   70,   54,   38 };
+	static const u8 reg0x08 [] = {  162,  116,   67,   52,   35 };
+	static const u8 reg0x09 [] = {  145,  150,  106,  126,  107 };
+	int real_qam = p->u.qam.modulation - QAM_16;
 
+	if (real_qam < 0 || real_qam > 4)
+		return -EINVAL;
 
-QAM_SETTING QAM_Values[] = {	
-        {  QAM_16,  16, 140, 164, 162, 145 },
-        {  QAM_32,  32, 140, 120, 116, 150 },
-        {  QAM_64,  64, 106,  70,  67, 106 },
-        { QAM_128, 128, 120,  54,  52, 126 },
-        { QAM_256, 256,  92,  38,  35, 107 }
-};
+	tuner_set_tv_freq (fe, p->frequency);
+	ves1820_set_symbolrate (fe, p->u.qam.symbol_rate);
+	ves1820_writereg (fe, 0x34, GET_PWM(fe->data));
+
+        ves1820_writereg (fe, 0x01, reg0x01[real_qam]);
+        ves1820_writereg (fe, 0x05, reg0x05[real_qam]);
+        ves1820_writereg (fe, 0x08, reg0x08[real_qam]);
+        ves1820_writereg (fe, 0x09, reg0x09[real_qam]);
 
+	ves1820_setup_reg0 (fe, reg0x00[real_qam]);
 
-static
-int ves1820_set_parameters (struct dvb_frontend *frontend,
-			    struct dvb_frontend_parameters *p)
-{
-	struct dvb_i2c_bus* i2c = frontend->i2c;
-        int real_qam;
-        
-        switch (p->u.qam.modulation) {
-        case QAM_16 : real_qam = 0; break;
-        case QAM_32 : real_qam = 1; break;
-        case QAM_64 : real_qam = 2; break;
-        case QAM_128: real_qam = 3; break;
-        case QAM_256: real_qam = 4; break;
-        default:
-                return -EINVAL;
-        }
-
-	tuner_set_tv_freq (frontend, p->frequency);
-	ves1820_set_symbolrate (i2c, p->u.qam.symbol_rate);
-	ves1820_reset_pwm (frontend);
-
-        ves1820_writereg (i2c, 0x01, QAM_Values[real_qam].Reg1);
-        ves1820_writereg (i2c, 0x05, QAM_Values[real_qam].Reg5);
-        ves1820_writereg (i2c, 0x08, QAM_Values[real_qam].Reg8);
-        ves1820_writereg (i2c, 0x09, QAM_Values[real_qam].Reg9);
-
-	ves1820_setup_reg0 (frontend, real_qam, p->inversion);
-	
 	return 0;
 }
 
 
 
 static
-int ves1820_ioctl (struct dvb_frontend *frontend, unsigned int cmd, void *arg)
+int ves1820_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
 {
         switch (cmd) {
 	case FE_GET_INFO:
@@ -405,7 +345,7 @@
 
 		*status = 0;
 
-                sync = ves1820_readreg (frontend->i2c, 0x11);
+                sync = ves1820_readreg (fe, 0x11);
 
 		if (sync & 2)
 			*status |= FE_HAS_SIGNAL;
@@ -427,35 +367,37 @@
 
 	case FE_READ_BER:
 	{
-		u32 ber = ves1820_readreg(frontend->i2c, 0x14) |
-			        (ves1820_readreg(frontend->i2c, 0x15) << 8) |
-			 ((ves1820_readreg(frontend->i2c, 0x16) & 0x0f) << 16);
+		u32 ber = ves1820_readreg(fe, 0x14) |
+			 (ves1820_readreg(fe, 0x15) << 8) |
+			 ((ves1820_readreg(fe, 0x16) & 0x0f) << 16);
 		*((u32*) arg) = 10 * ber;
 		break;
 	}
 	case FE_READ_SIGNAL_STRENGTH:
 	{
-		u8 gain = ves1820_readreg(frontend->i2c, 0x17);
+		u8 gain = ves1820_readreg(fe, 0x17);
 		*((u16*) arg) = (gain << 8) | gain;
 		break;
 	}
 
 	case FE_READ_SNR:
 	{
-		u8 quality = ~ves1820_readreg(frontend->i2c, 0x18);
+		u8 quality = ~ves1820_readreg(fe, 0x18);
 		*((u16*) arg) = (quality << 8) | quality;
 		break;
 	}
 
 	case FE_READ_UNCORRECTED_BLOCKS:
-		*((u32*) arg) = ves1820_readreg (frontend->i2c, 0x13) & 0x7f;
+		*((u32*) arg) = ves1820_readreg (fe, 0x13) & 0x7f;
 		if (*((u32*) arg) == 0x7f)
 			*((u32*) arg) = 0xffffffff;
-		ves1820_reset_uncorrected_block_counter (frontend->i2c);
+		/* reset uncorrected block counter */
+		ves1820_writereg (fe, 0x10, ves1820_inittab[0x10] & 0xdf);
+	        ves1820_writereg (fe, 0x10, ves1820_inittab[0x10]);
 		break;
 
         case FE_SET_FRONTEND:
-		return ves1820_set_parameters (frontend, arg);
+		return ves1820_set_parameters (fe, arg);
 
 	case FE_GET_FRONTEND:
 		/*  XXX FIXME: implement! */
@@ -468,16 +410,12 @@
 		break;
 
 	case FE_SLEEP:
-		ves1820_writereg (frontend->i2c, 0x1b, 0x02);  /* pdown ADC */
-		ves1820_writereg (frontend->i2c, 0x00, 0x80);  /* standby */
+		ves1820_writereg (fe, 0x1b, 0x02);  /* pdown ADC */
+		ves1820_writereg (fe, 0x00, 0x80);  /* standby */
 		break;
 
         case FE_INIT:
-                return ves1820_init (frontend);
-
-        case FE_RESET:
-		ves1820_reset (frontend);
-		break;
+                return ves1820_init (fe);
 
         default:
                 return -EINVAL;
@@ -488,12 +426,89 @@
 
 
 static
+int probe_tuner (struct dvb_i2c_bus *i2c)
+{
+	static const
+	struct i2c_msg msg1 = { addr: 0x61, flags: 0, buf: NULL, len: 0 };
+	static const
+	struct i2c_msg msg2 = { addr: 0x62, flags: 0, buf: NULL, len: 0 };
+	int type;
+
+	if (i2c->xfer(i2c, &msg1, 1) == 1) {
+		type = 0;
+		printk ("%s: setup for tuner spXXXX\n", __FILE__);
+	} else if (i2c->xfer(i2c, &msg2, 1) == 1) {
+		type = 1;
+		printk ("%s: setup for tuner sp5659c\n", __FILE__);
+	} else {
+		type = -1;
+		printk ("%s: unknown PLL, "
+			"please report to <linuxdvb@linuxtv.org>!!\n",
+			__FILE__);
+	}
+
+	return type;
+}
+
+
+static
+u8 read_pwm (struct dvb_i2c_bus *i2c)
+{
+	u8 b = 0xff;
+	u8 pwm;
+	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);
+
+	dprintk("VES1820: pwm=%02x\n", pwm);
+
+	if (pwm == 0xff)
+		pwm = 0x48;
+
+	return pwm;
+}
+
+
+static
+int probe_demod_addr (struct dvb_i2c_bus *i2c)
+{
+	u8 b [] = { 0x00, 0x1a };
+	u8 id;
+	struct i2c_msg msg [] = { { addr: 0x08, flags: 0, buf: b, len: 2 },
+	                   { addr: 0x08, flags: I2C_M_RD, buf: &id, len: 1 } };
+
+	if (i2c->xfer(i2c, msg, 2) == 2 && (id & 0xf0) == 0x70)
+		return msg[0].addr;
+
+	msg[0].addr = msg[1].addr = 0x09;
+
+	if (i2c->xfer(i2c, msg, 2) == 2 && (id & 0xf0) == 0x70)
+		return msg[0].addr;
+
+	return -1;
+}
+
+
+static
 int ves1820_attach (struct dvb_i2c_bus *i2c)
 {
-        if ((ves1820_readreg (i2c, 0x1a) & 0xf0) != 0x70)
-                return -ENODEV;
-        
-        dvb_register_frontend (ves1820_ioctl, i2c, NULL, &ves1820_info);
+	void *data = NULL;
+	int demod_addr;
+	int tuner_type;
+
+	if ((demod_addr = probe_demod_addr(i2c)) < 0)
+		return -ENODEV;
+
+	if ((tuner_type = probe_tuner(i2c)) < 0)
+		return -ENODEV;
+
+	SET_PWM(data, read_pwm(i2c));
+	SET_REG0(data, ves1820_inittab[0]);
+	SET_TUNER(data, tuner_type);
+	SET_DEMOD_ADDR(data, demod_addr);
+
+	dvb_register_frontend (ves1820_ioctl, i2c, data, &ves1820_info);
 
         return 0;
 }
@@ -524,8 +539,7 @@
 module_init(init_ves1820);
 module_exit(exit_ves1820);
 
-MODULE_DESCRIPTION("");
-MODULE_AUTHOR("Ralph Metzler");
+MODULE_DESCRIPTION("VES1820 DVB-C frontend driver");
+MODULE_AUTHOR("Ralph Metzler, Holger Waechtler");
 MODULE_LICENSE("GPL");
-MODULE_PARM(debug,"i");
 
diff -Nru a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/Kconfig	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,92 @@
+config DVB_AV7110
+	tristate "AV7110 cards"
+	depends on VIDEO_DEV && DVB_CORE
+	help
+	  Support for SAA7146 and AV7110 based DVB cards as produced 
+	  by Fujitsu-Siemens, Technotrend, Hauppauge and others.
+
+	  This driver only supports the fullfeatured cards with
+	  onboard MPEG2 decoder.
+
+	  Say Y if you own such a card and want to use it.
+
+config DVB_AV7110_OSD
+	bool "AV7110 OSD support"
+	depends on DVB_AV7110
+	help
+	  The AV7110 firmware provides some code to generate an OnScreenDisplay
+	  on the video output. This is kind of nonstandard and not guaranteed to
+	  be maintained.
+
+	  Anyway, some popular DVB software like VDR uses this OSD to render
+	  its menus, so say Y if you want to use this software.
+
+	  All other people say N.
+
+config DVB_BUDGET
+	tristate "Budget cards"
+	depends on DVB_CORE
+	help
+	  Support for simple SAA7146 based DVB cards
+	  (so called Budget- or Nova-PCI cards) without onboard
+	  MPEG2 decoder.
+
+	  Say Y if you own such a card and want to use it.
+
+	  This driver is available as a module called
+	  dvb-ttpci-budget.o ( = 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>.
+
+config DVB_BUDGET_CI
+	tristate "Budget cards with onboard CI connector"
+	depends on VIDEO_DEV && DVB_CORE && DVB_BUDGET
+	help
+	  Support for simple SAA7146 based DVB cards
+	  (so called Budget- or Nova-PCI cards) without onboard
+	  MPEG2 decoder, but with onboard Common Interface connector.
+
+	  Say Y if you own such a card and want to use it.
+
+	  This driver is available as a module called
+	  dvb-ttpci-budget-av.o ( = 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>.
+
+config DVB_BUDGET_AV
+	tristate "Budget cards with analog video inputs"
+	depends on VIDEO_DEV && DVB_CORE && DVB_BUDGET
+	help
+	  Support for simple SAA7146 based DVB cards
+	  (so called Budget- or Nova-PCI cards) without onboard
+	  MPEG2 decoder, but with one or more analog video inputs.
+
+	  Say Y if you own such a card and want to use it.
+
+	  This driver is available as a module called
+	  dvb-ttpci-budget-av.o ( = code which can be inserted in
+	  and removed from the running kernel whenever you want).
+	  here and read <file:Documentation/modules.txt>.
+
+config DVB_BUDGET_PATCH
+	tristate "AV7110 cards with Budget Patch"
+	depends on DVB_CORE && DVB_BUDGET
+	help
+	  Support for Budget Patch (full TS) modification on 
+	  SAA7146+AV7110 based cards (DVB-S cards). This
+	  driver doesn't use onboard MPEG2 decoder. The 
+	  card is driven in Budget-only mode. Card is
+	  required to have loaded firmware to tune properly.
+	  Firmware can be loaded by insertion and removal of
+	  standard AV7110 driver prior to loading this
+	  driver.
+
+	  Say Y if you own such a card and want to use it.
+
+	  This driver is available as a module called
+	  dvb-ttpci-budget-patch.o ( = 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>.
diff -Nru a/drivers/media/dvb/ttpci/Makefile b/drivers/media/dvb/ttpci/Makefile
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/Makefile	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,18 @@
+#
+# Makefile for the kernel SAA7146 FULL TS DVB device driver
+# and the AV7110 DVB device driver
+#
+
+dvb-ttpci-budget-objs := budget.o
+dvb-ttpci-budget-av-objs := budget-av.o
+dvb-ttpci-budget-ci-objs := budget-ci.o
+dvb-ttpci-budget-patch-objs := budget-patch.o
+dvb-ttpci-objs := av7110.o av7110_ipack.o av7110_ir.o
+
+obj-$(CONFIG_DVB_BUDGET) += budget-core.o dvb-ttpci-budget.o
+obj-$(CONFIG_DVB_BUDGET_CI) += budget-core.o dvb-ttpci-budget-ci.o
+obj-$(CONFIG_DVB_BUDGET_AV) += budget-core.o dvb-ttpci-budget-av.o
+obj-$(CONFIG_DVB_BUDGET_PATCH) += budget-core.o dvb-ttpci-budget-patch.o
+obj-$(CONFIG_DVB_AV7110) += dvb-ttpci.o
+
+EXTRA_CFLAGS = -Idrivers/media/dvb/dvb-core/
diff -Nru a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/av7110.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,4371 @@
+/*
+ * av7110.c: driver for the SAA7146 based AV110 cards (like the Fujitsu-Siemens DVB)
+ *
+ * Copyright (C) 1999-2002 Ralph  Metzler 
+ *                       & Marcus Metzler for convergence integrated media GmbH
+ *
+ * originally based on code by:
+ * 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., 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/
+ */
+
+#define NEW_CI 1
+
+/* for debugging ARM communication: */
+//#define COM_DEBUG
+
+#define __KERNEL_SYSCALLS__
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/kmod.h>
+#include <linux/delay.h>
+#include <linux/fs.h>
+#include <linux/timer.h>
+#include <linux/unistd.h>
+#include <linux/byteorder/swabb.h>
+#include <linux/poll.h>
+#include <linux/slab.h>
+#include <linux/smp_lock.h>
+#include <stdarg.h>
+
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/interrupt.h>
+#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 <asm/system.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/semaphore.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/dvb/frontend.h>
+
+#include "dvb_i2c.h"
+#include "dvb_frontend.h"
+
+#if 1 
+	#define DEBUG_VARIABLE av7110_debug
+#else
+	#define DEB_S(x) 
+	#define DEB_D(x) 
+	#define DEB_EE(x)
+#endif
+
+#include "av7110.h"
+#include "av7110_ipack.h"
+
+static int AV_StartPlay(av7110_t *av7110, int av);
+static void restart_feeds(av7110_t *av7110);
+static int bootarm(av7110_t *av7110);
+static inline int i2c_writereg(av7110_t *av7110, u8 id, u8 reg, u8 val);
+static inline u8 i2c_readreg(av7110_t *av7110, u8 id, u8 reg);
+static int  outcom(av7110_t *av7110, int type, int com, int num, ...);
+static void SetMode(av7110_t *av7110, int mode);
+
+void pes_to_ts(u8 const *buf, long int length, u16 pid, p2t_t *p);
+void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, struct dvb_demux_feed *feed);
+
+static int av7110_debug = 0;
+
+static int vidmode=CVBS_RGB_OUT;
+static int pids_off;
+static int adac=DVB_ADAC_TI;
+static int hw_sections = 1;
+
+int av7110_num = 0;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+        #define KBUILD_MODNAME av7110
+#endif
+
+/****************************************************************************
+ * General helper functions
+ ****************************************************************************/
+
+static inline void ddelay(int i) 
+{
+        current->state=TASK_INTERRUPTIBLE;
+        schedule_timeout((HZ*i)/100);
+}
+
+
+/****************************************************************************
+ * DEBI functions
+ ****************************************************************************/
+
+/* This DEBI code is based on the Stradis driver 
+   by Nathan Laredo <laredo@gnu.org> */
+
+static
+int wait_for_debi_done(av7110_t *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(av7110_t *av7110, u32 config, 
+                     int addr, u32 val, int count)
+{
+        struct saa7146_dev *dev = av7110->dev;
+	u32 cmd;
+
+	if (count <= 0 || count > 32764)
+		return -1;
+	if (wait_for_debi_done(av7110) < 0)
+		return -1;
+	saa7146_write(dev, DEBI_CONFIG, config);
+	if (count <= 4)		/* immediate transfer */
+		saa7146_write(dev, DEBI_AD, val );
+	else			/* block transfer */
+		saa7146_write(dev, DEBI_AD, av7110->debi_bus);
+	saa7146_write(dev, DEBI_COMMAND, (cmd = (count << 17) | (addr & 0xffff)));
+	saa7146_write(dev, MC2, (2 << 16) | 2);
+	return 0;
+}
+
+static u32 debiread(av7110_t *av7110, u32 config, int addr, int count)
+{
+        struct saa7146_dev *dev = av7110->dev;
+	u32 result = 0;
+
+	if (count > 32764 || count <= 0)
+		return 0;
+	if (wait_for_debi_done(av7110) < 0)
+		return 0;
+	saa7146_write(dev, DEBI_AD, av7110->debi_bus);
+	saa7146_write(dev, DEBI_COMMAND, (count << 17) | 0x10000 | (addr & 0xffff));
+
+	saa7146_write(dev, DEBI_CONFIG, config);
+	saa7146_write(dev, MC2, (2 << 16) | 2);
+	if (count > 4)	
+		return count;
+	wait_for_debi_done(av7110);
+	result = saa7146_read(dev, DEBI_AD);
+        result &= (0xffffffffUL >> ((4-count)*8));
+	return result;
+}
+
+/* DEBI during interrupt */
+
+static inline void 
+iwdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
+{
+        if (count>4 && val)
+                memcpy(av7110->debi_virt, (char *) val, count);
+        debiwrite(av7110, config, addr, val, count);
+}
+
+static inline u32 
+irdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
+{
+        u32 res;
+
+        res=debiread(av7110, config, addr, count);
+        if (count<=4) 
+                memcpy(av7110->debi_virt, (char *) &res, count);
+        return res;
+}
+
+/* DEBI outside interrupts, only for count<=4! */
+
+static inline void 
+wdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
+{
+        unsigned long flags;
+
+        spin_lock_irqsave(&av7110->debilock, flags);
+        debiwrite(av7110, config, addr, val, count);
+        spin_unlock_irqrestore(&av7110->debilock, flags);
+}
+
+static inline u32 
+rdebi(av7110_t *av7110, u32 config, int addr, u32 val, int count)
+{
+        unsigned long flags;
+        u32 res;
+
+        spin_lock_irqsave(&av7110->debilock, flags);
+        res=debiread(av7110, config, addr, count);
+        spin_unlock_irqrestore(&av7110->debilock, flags);
+        return res;
+}
+
+
+static inline char 
+chtrans(char c)
+{
+        if (c<32 || c>126)
+                c=0x20;
+        return c;
+}
+
+
+/* handle mailbox registers of the dual ported RAM */
+
+static inline void 
+ARM_ResetMailBox(av7110_t *av7110)
+{
+        unsigned long flags;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        spin_lock_irqsave(&av7110->debilock, flags);
+        debiread(av7110, DEBINOSWAP, IRQ_RX, 2);
+        //printk("dvb: IRQ_RX=%d\n", debiread(av7110, DEBINOSWAP, IRQ_RX, 2));
+        debiwrite(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
+        spin_unlock_irqrestore(&av7110->debilock, flags);
+}
+
+static inline void 
+ARM_ClearMailBox(av7110_t *av7110)
+{
+        iwdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
+}
+
+static inline void 
+ARM_ClearIrq(av7110_t *av7110)
+{
+	irdebi(av7110, DEBINOSWAP, IRQ_RX, 0, 2);
+}
+
+static void 
+reset_arm(av7110_t *av7110)
+{
+        saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTLO);
+
+        /* Disable DEBI and GPIO irq */
+	IER_DISABLE(av7110->dev, (MASK_19 | MASK_03));
+//        saa7146_write(av7110->dev, IER, 
+//                      saa7146_read(av7110->dev, IER) & ~(MASK_19 | MASK_03));
+        saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
+
+        mdelay(800);
+        saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTHI);
+        mdelay(800);
+
+        ARM_ResetMailBox(av7110); 
+
+        saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
+
+	IER_ENABLE(av7110->dev, MASK_03);
+//        saa7146_write(av7110->dev, IER, 
+//                      saa7146_read(av7110->dev, IER) | MASK_03 );
+
+        av7110->arm_ready=1;
+        printk("av7110: ARM RESET\n");
+}
+
+static void 
+recover_arm(av7110_t *av7110)
+{
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (current->files)
+                bootarm(av7110);
+        else {
+                printk("OOPS, no current->files\n");
+                reset_arm(av7110);
+        }
+        ddelay(10); 
+        restart_feeds(av7110);
+}
+
+static void 
+arm_error(av7110_t *av7110)
+{
+	DEB_EE(("av7110: %p\n",av7110));
+
+        av7110->arm_errors++;
+        av7110->arm_ready=0;
+        recover_arm(av7110);
+}
+
+static int arm_thread(void *data)
+{
+	av7110_t *av7110 = data;
+        u16 newloops = 0;
+
+	DEB_EE(("av7110: %p\n",av7110));
+	
+	lock_kernel();
+#if 0
+        daemonize();
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+        reparent_to_init ();
+#endif
+#else
+        exit_mm(current);
+        current->session=current->pgrp=1;
+#endif
+	sigfillset(&current->blocked);
+	strcpy(current->comm, "arm_mon");
+	av7110->arm_thread = current;
+	unlock_kernel();
+
+	while (!av7110->arm_rmmod && !signal_pending(current)) {
+                interruptible_sleep_on_timeout(&av7110->arm_wait, 5*HZ);
+
+                if (!av7110->arm_ready)
+                        continue;
+
+                if (down_interruptible(&av7110->dcomlock))
+                        break;
+
+                newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2);
+                up(&av7110->dcomlock);
+
+                if (newloops==av7110->arm_loops) {
+                        printk(KERN_ERR "av7110%d: ARM crashed!\n",
+				av7110->dvb_adapter->num);
+
+			arm_error(av7110);
+
+                        if (down_interruptible(&av7110->dcomlock))
+                                break;
+
+                        newloops=rdebi(av7110, DEBINOSWAP, STATUS_LOOPS, 0, 2)-1;
+                        up(&av7110->dcomlock);
+                }
+                av7110->arm_loops=newloops;
+	}
+
+	av7110->arm_thread = NULL;
+	return 0;
+}
+
+
+static int
+record_cb(dvb_filter_pes2ts_t *p2t, u8 *buf, size_t len)
+{
+        struct dvb_demux_feed *dvbdmxfeed=(struct dvb_demux_feed *) p2t->priv;
+
+	DEB_EE(("dvb_filter_pes2ts_t:%p\n",p2t));
+
+        if (!(dvbdmxfeed->ts_type & TS_PACKET)) 
+                return 0;
+	if (buf[3]==0xe0)        // video PES do not have a length in TS
+                buf[4]=buf[5]=0;
+        if (dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY) 
+                return dvbdmxfeed->cb.ts(buf, len, 0, 0, 
+                                         &dvbdmxfeed->feed.ts, DMX_OK); 
+        else
+                return dvb_filter_pes2ts(p2t, buf, len);
+}
+
+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));
+        
+        dvbdmxfeed->cb.ts(data, 188, 0, 0,
+                          &dvbdmxfeed->feed.ts,
+                          DMX_OK); 
+        return 0;
+}
+
+static int 
+AV_StartRecord(av7110_t *av7110, int av,
+               struct dvb_demux_feed *dvbdmxfeed)
+{
+        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+  
+	DEB_EE(("av7110: %p, dvb_demux_feed:%p\n",av7110,dvbdmxfeed));
+
+        if (av7110->playing||(av7110->rec_mode&av))
+                return -EBUSY;
+        outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
+        dvbdmx->recording=1;
+        av7110->rec_mode|=av;
+
+        switch (av7110->rec_mode) {
+        case RP_AUDIO:
+                dvb_filter_pes2ts_init (&av7110->p2t[0],
+					dvbdmx->pesfilter[0]->pid,
+					dvb_filter_pes2ts_cb,
+					(void *)dvbdmx->pesfilter[0]);
+                outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
+                break;
+
+	case RP_VIDEO:
+                dvb_filter_pes2ts_init (&av7110->p2t[1],
+					dvbdmx->pesfilter[1]->pid,
+					dvb_filter_pes2ts_cb,
+					(void *)dvbdmx->pesfilter[1]);
+                outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
+                break;
+
+	case RP_AV:
+                dvb_filter_pes2ts_init (&av7110->p2t[0],
+					dvbdmx->pesfilter[0]->pid,
+					dvb_filter_pes2ts_cb,
+					(void *)dvbdmx->pesfilter[0]);
+                dvb_filter_pes2ts_init (&av7110->p2t[1],
+					dvbdmx->pesfilter[1]->pid,
+					dvb_filter_pes2ts_cb,
+					(void *)dvbdmx->pesfilter[1]);
+                outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0);
+                break;
+        }
+        return 0;
+}
+
+static int 
+AV_StartPlay(av7110_t *av7110, int av)
+{
+	DEB_EE(("av7110: %p\n",av7110));
+	
+        if (av7110->rec_mode)
+                return -EBUSY;
+        if (av7110->playing&av)
+                return -EBUSY;
+
+        outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
+
+        if (av7110->playing == RP_NONE) {
+                av7110_ipack_reset(&av7110->ipack[0]);
+                av7110_ipack_reset(&av7110->ipack[1]);
+        }
+
+        av7110->playing|=av;
+        switch (av7110->playing) {
+        case RP_AUDIO:
+                outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
+                break;
+        case RP_VIDEO:
+                outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
+                av7110->sinfo=0;
+                break;
+        case RP_AV:
+                av7110->sinfo=0;
+                outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0);
+                break;
+        }
+        return av7110->playing;
+}
+
+static void 
+AV_Stop(av7110_t *av7110, int av)
+{
+	DEB_EE(("av7110: %p\n",av7110));
+
+	if (!(av7110->playing&av) && !(av7110->rec_mode&av))
+                return;
+
+        outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
+        if (av7110->playing) {
+                av7110->playing&=~av;
+                switch (av7110->playing) {
+                case RP_AUDIO:
+                        outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0);
+                        break;
+                case RP_VIDEO:
+                        outcom(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0);
+                        break;
+                case RP_NONE:
+                        SetMode(av7110, av7110->vidmode);
+                        break;
+                }
+        } else {
+                av7110->rec_mode&=~av;
+                switch (av7110->rec_mode) {
+                case RP_AUDIO:
+                        outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0);
+                        break;
+                case RP_VIDEO:
+                        outcom(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0);
+                        break;
+                case RP_NONE:
+                        break;
+                }
+        }
+}
+
+/**
+ *  Hack! we save the last av7110 ptr. This should be ok, since
+ *  you rarely will use more then one IR control. 
+ *
+ *  If we want to support multiple controls we would have to do much more...
+ */
+void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config)
+{
+	static av7110_t *last;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+	if (!av7110)
+		av7110 = last;
+	else
+		last = av7110;
+
+	if (av7110)
+		outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config);
+}
+
+static void (*irc_handler)(u32);
+
+void av7110_register_irc_handler(void (*func)(u32)) 
+{
+        //DEB_EE(("registering %08x\n",func));
+        irc_handler = func;
+}
+
+void av7110_unregister_irc_handler(void (*func)(u32)) 
+{
+        //DEB_EE(("unregistering %08x\n",func));
+        irc_handler = NULL;
+}
+
+void run_handlers(unsigned long ircom) 
+{
+        if (irc_handler != NULL)
+                (*irc_handler)((u32) ircom);
+}
+
+DECLARE_TASKLET(irtask,run_handlers,0);
+
+void IR_handle(av7110_t *av7110, u32 ircom)
+{
+	DEB_S(("av7110: ircommand = %08x\n", ircom));
+        irtask.data = (unsigned long) ircom;
+        tasklet_schedule(&irtask);
+}
+
+/****************************************************************************
+ * IRQ handling
+ ****************************************************************************/
+
+void CI_handle(av7110_t *av7110, u8 *data, u16 len) 
+{
+        //CI_out(av7110, data, len);
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (len<3)
+                return;
+        switch (data[0]) {
+        case CI_MSG_CI_INFO:
+                if (data[2]!=1 && data[2]!=2)
+                        break;
+                switch (data[1]) {
+                case 0:
+                        av7110->ci_slot[data[2]-1].flags=0;
+                        break;
+                case 1:
+                        av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_PRESENT;
+                        break;
+                case 2:
+                        av7110->ci_slot[data[2]-1].flags|=CA_CI_MODULE_READY;
+                        break;
+                }
+                break;
+        case CI_SWITCH_PRG_REPLY:
+                //av7110->ci_stat=data[1];
+                break;
+        default:
+                break;
+        }
+
+}
+
+static inline int
+DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len,
+                     u8 * buffer2, size_t buffer2_len,
+                     struct dvb_demux_filter *dvbdmxfilter,
+                     dmx_success_t success,
+                     av7110_t *av7110)
+{
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!dvbdmxfilter->feed->demux->dmx.frontend)
+                return 0;
+        if (dvbdmxfilter->feed->demux->dmx.frontend->source==DMX_MEMORY_FE)
+                return 0;
+        
+        switch(dvbdmxfilter->type) {
+        case DMX_TYPE_SEC:
+                if ((((buffer1[1]<<8)|buffer1[2])&0xfff)+3!=buffer1_len)
+                        return 0;
+                if (dvbdmxfilter->doneq) {
+                        dmx_section_filter_t *filter=&dvbdmxfilter->filter;
+                        int i;
+                        u8 xor, neq=0;
+                        
+                        for (i=0; i<DVB_DEMUX_MASK_MAX; i++) {
+                                xor=filter->filter_value[i]^buffer1[i];
+                                neq|=dvbdmxfilter->maskandnotmode[i]&xor;
+                        }
+                        if (!neq)
+                                return 0;
+                }
+                return dvbdmxfilter->feed->cb.sec(buffer1, buffer1_len,
+						  buffer2, buffer2_len,
+						  &dvbdmxfilter->filter,
+						  DMX_OK); 
+        case DMX_TYPE_TS:
+                if (!(dvbdmxfilter->feed->ts_type & TS_PACKET)) 
+                        return 0;
+                if (dvbdmxfilter->feed->ts_type & TS_PAYLOAD_ONLY) 
+                        return dvbdmxfilter->feed->cb.ts(buffer1, buffer1_len,
+                                                         buffer2, buffer2_len,
+                                                         &dvbdmxfilter->feed->feed.ts,
+                                                         DMX_OK); 
+                else
+                        pes_to_ts(buffer1, buffer1_len, 
+                                  dvbdmxfilter->feed->pid, 
+                                  &av7110->p2t_filter[dvbdmxfilter->index]);
+	default:
+	        return 0;
+        }
+}
+
+
+u8 pshead[0x26] = {
+        0x00, 0x00, 0x01, 0xba, 0x5f, 0xff, 0xfe, 0xe6, 
+        0xc4, 0x01, 0x01, 0x89, 0xc3, 0xf8, 0x00, 0x00,
+        0x01, 0xbb, 0x00, 0x12, 0x80, 0xc4, 0xe1, 0x00,
+        0xe1, 0xff, 0xb9, 0xe0, 0xe8, 0xb8, 0xc0, 0x20,
+        0xbd, 0xe0, 0x44, 0xbf, 0xe0, 0x02,
+};								
+
+
+//#define DEBUG_TIMING
+inline static void 
+print_time(char *s)
+{
+#ifdef DEBUG_TIMING
+        struct timeval tv;
+        do_gettimeofday(&tv);
+        printk("%s: %d.%d\n", s, (int)tv.tv_sec, (int)tv.tv_usec);
+#endif
+}
+
+static void 
+ci_get_data(dvb_ringbuffer_t *cibuf, u8 *data, int len)
+{
+        if (dvb_ringbuffer_free(cibuf) < len+2)
+                return;
+
+        DVB_RINGBUFFER_WRITE_BYTE(cibuf,len>>8);
+        DVB_RINGBUFFER_WRITE_BYTE(cibuf,len&0xff);   
+
+        dvb_ringbuffer_write(cibuf,data,len,0);
+
+        wake_up_interruptible(&cibuf->queue);
+}
+
+static
+void debiirq (unsigned long data)
+{
+	struct av7110_s *av7110 = (struct av7110_s*) data;
+        int type=av7110->debitype;
+        int handle=(type>>8)&0x1f;
+	
+//	DEB_EE(("av7110: %p\n",av7110));
+
+        print_time("debi");
+        saa7146_write(av7110->dev, IER, 
+                      saa7146_read(av7110->dev, IER) & ~MASK_19 );
+        saa7146_write(av7110->dev, ISR, MASK_19 );
+
+        if (type==-1) {
+                printk("DEBI irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",jiffies,saa7146_read(av7110->dev,PSR),saa7146_read(av7110->dev,SSR));
+                ARM_ClearMailBox(av7110);
+                ARM_ClearIrq(av7110);
+                return;
+        }
+        av7110->debitype=-1;
+
+        switch (type&0xff) {
+
+        case DATA_TS_RECORD:
+                dvb_dmx_swfilter_packets(&av7110->demux, 
+                                      (const u8 *)av7110->debi_virt, 
+                                      av7110->debilen/188);
+                spin_lock(&av7110->debilock);
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                ARM_ClearMailBox(av7110);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_PES_RECORD:
+                if (av7110->demux.recording) 
+                        record_cb(&av7110->p2t[handle], 
+                                  (u8 *)av7110->debi_virt,
+                                  av7110->debilen);
+                spin_lock(&av7110->debilock);
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                ARM_ClearMailBox(av7110);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_IPMPE:
+        case DATA_FSECTION:
+        case DATA_PIPING:
+                if (av7110->handle2filter[handle]) 
+                        DvbDmxFilterCallback((u8 *)av7110->debi_virt, 
+                                             av7110->debilen, 0, 0, 
+                                             av7110->handle2filter[handle], 
+                                             DMX_OK, av7110); 
+                spin_lock(&av7110->debilock);
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                ARM_ClearMailBox(av7110);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_CI_GET:
+        {
+                u8 *data=av7110->debi_virt;
+
+                if ((data[0]<2) && data[2]==0xff) {
+                        int flags=0;
+                        if (data[5]>0) 
+                                flags|=CA_CI_MODULE_PRESENT;
+                        if (data[5]>5) 
+                                flags|=CA_CI_MODULE_READY;
+                        av7110->ci_slot[data[0]].flags=flags;
+                } else
+                        ci_get_data(&av7110->ci_rbuffer, 
+                                    av7110->debi_virt, 
+                                    av7110->debilen);
+                spin_lock(&av7110->debilock);
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                ARM_ClearMailBox(av7110);
+                spin_unlock(&av7110->debilock);
+                return;
+        }
+
+        case DATA_COMMON_INTERFACE:
+                CI_handle(av7110, (u8 *)av7110->debi_virt, av7110->debilen);
+#if 0
+        {
+                int i;
+
+                printk("av7110%d: ", av7110->num);
+                printk("%02x ", *(u8 *)av7110->debi_virt);
+                printk("%02x ", *(1+(u8 *)av7110->debi_virt));
+                for (i=2; i<av7110->debilen; i++)
+                  printk("%02x ", (*(i+(unsigned char *)av7110->debi_virt)));
+                for (i=2; i<av7110->debilen; i++)
+                  printk("%c", chtrans(*(i+(unsigned char *)av7110->debi_virt)));
+
+                printk("\n");
+        }
+#endif
+                spin_lock(&av7110->debilock);
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                ARM_ClearMailBox(av7110);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_DEBUG_MESSAGE:
+                ((s8*)av7110->debi_virt)[Reserved_SIZE-1]=0;
+                printk("%s\n", (s8 *)av7110->debi_virt);
+                spin_lock(&av7110->debilock);
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                ARM_ClearMailBox(av7110);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_CI_PUT:
+        case DATA_MPEG_PLAY:
+        case DATA_BMP_LOAD:
+                spin_lock(&av7110->debilock);
+                iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
+                ARM_ClearMailBox(av7110);
+                spin_unlock(&av7110->debilock);
+                return;
+        default:
+                break;
+        }
+        spin_lock(&av7110->debilock);
+        ARM_ClearMailBox(av7110);
+        spin_unlock(&av7110->debilock);
+}
+
+static int
+pes_play(void *dest, dvb_ringbuffer_t *buf, int dlen)
+{
+        int len;
+        u32 sync;
+        u16 blen;
+
+	DEB_EE(("dvb_ring_buffer_t: %p\n",buf));
+
+        if (!dlen) {
+                wake_up(&buf->queue);
+                return -1;
+        }
+        while (1) {
+                if ((len=dvb_ringbuffer_avail(buf)) < 6)
+                        return -1;
+                sync= DVB_RINGBUFFER_PEEK(buf,0)<<24;
+                sync|=DVB_RINGBUFFER_PEEK(buf,1)<<16;
+                sync|=DVB_RINGBUFFER_PEEK(buf,2)<<8;
+                sync|=DVB_RINGBUFFER_PEEK(buf,3);
+                
+                if (((sync&~0x0f)==0x000001e0) ||
+                    ((sync&~0x1f)==0x000001c0) ||
+                    (sync==0x000001bd))
+                        break;
+                printk("resync\n");
+                DVB_RINGBUFFER_SKIP(buf,1);
+        }
+        blen= DVB_RINGBUFFER_PEEK(buf,4)<<8;
+        blen|=DVB_RINGBUFFER_PEEK(buf,5);
+        blen+=6;
+        if (len<blen || blen>dlen) {
+                printk("buffer empty - avail %d blen %u dlen %d\n",len,blen,dlen);
+                wake_up(&buf->queue);
+                return -1;
+        }
+
+        (void)dvb_ringbuffer_read(buf,dest,(size_t)blen,0);
+
+        DEB_S(("pread=%08x, pwrite=%08x\n",buf->pread, buf->pwrite));
+        wake_up(&buf->queue);
+        return blen;
+}
+
+
+static
+void gpioirq (unsigned long data)
+{
+	struct av7110_s *av7110 = (struct av7110_s*) data;
+        u32 rxbuf, txbuf;
+        int len;
+        
+        //printk("GPIO0 irq\n");        
+
+        if (av7110->debitype !=-1)
+                printk("GPIO0 irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",jiffies,saa7146_read(av7110->dev,PSR),saa7146_read(av7110->dev,SSR));
+       
+        spin_lock(&av7110->debilock);
+
+	ARM_ClearIrq(av7110);
+
+        saa7146_write(av7110->dev, IER, 
+                      saa7146_read(av7110->dev, IER) & ~MASK_19 );
+        saa7146_write(av7110->dev, ISR, MASK_19 );
+
+        av7110->debitype = irdebi(av7110, DEBINOSWAP, IRQ_STATE, 0, 2);
+        av7110->debilen  = irdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
+        av7110->debibuf  = 0;
+        rxbuf=irdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+        txbuf=irdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
+        len=(av7110->debilen+3)&(~3);
+
+        DEB_D(("GPIO0 irq %d %d\n", av7110->debitype, av7110->debilen));
+        print_time("gpio");
+
+        DEB_D(("GPIO0 irq %02x\n", av7110->debitype&0xff));        
+        switch (av7110->debitype&0xff) {
+
+        case DATA_TS_PLAY:
+        case DATA_PES_PLAY:
+                break;
+
+        case DATA_CI_PUT:
+        {
+                int avail;
+                dvb_ringbuffer_t *cibuf=&av7110->ci_wbuffer;
+
+                avail=dvb_ringbuffer_avail(cibuf);
+                if (avail<=2) {
+                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
+                        break;
+                } 
+                len= DVB_RINGBUFFER_PEEK(cibuf,0)<<8;
+                len|=DVB_RINGBUFFER_PEEK(cibuf,1);
+                if (avail<len+2) {
+                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
+                        break;
+                } 
+                DVB_RINGBUFFER_SKIP(cibuf,2); 
+
+                dvb_ringbuffer_read(cibuf,av7110->debi_virt,len,0);
+
+                wake_up(&cibuf->queue);
+                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
+                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
+                wait_for_debi_done(av7110);
+                saa7146_write(av7110->dev, IER, 
+                              saa7146_read(av7110->dev, IER) | MASK_19 );
+                if (len<5) len=5; /* we want a real DEBI DMA */
+                iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
+                spin_unlock(&av7110->debilock);
+                return;
+        }
+
+        case DATA_MPEG_PLAY:
+                if (!av7110->playing) {
+                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
+                        break;
+                }
+                len=0;
+                if (av7110->debitype&0x100) {
+                        spin_lock(&av7110->aout.lock);
+                        len=pes_play(av7110->debi_virt, &av7110->aout, 2048);
+                        spin_unlock(&av7110->aout.lock);
+                }
+                if (len<=0 && (av7110->debitype&0x200)
+                        &&av7110->videostate.play_state!=VIDEO_FREEZED) {
+                        spin_lock(&av7110->avout.lock);
+                        len=pes_play(av7110->debi_virt, &av7110->avout, 2048);
+                        spin_unlock(&av7110->avout.lock);
+                }
+                if (len<=0) {
+                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
+                        break;
+                } 
+                DEB_D(("GPIO0 PES_PLAY len=%04x\n", len));        
+                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
+                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
+                wait_for_debi_done(av7110);
+                saa7146_write(av7110->dev, IER, 
+                              saa7146_read(av7110->dev, IER) | MASK_19 );
+
+                iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_BMP_LOAD:
+                len=av7110->debilen;
+                if (!len) {
+                        av7110->bmp_state=BMP_LOADED;
+                        iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_LEN, 0, 2);
+                        iwdebi(av7110, DEBINOSWAP, TX_BUFF, 0, 2);
+                        wake_up(&av7110->bmpq);
+                        break;
+                }
+                if (len>av7110->bmplen)
+                        len=av7110->bmplen;
+                if (len>2*1024)
+                        len=2*1024;
+                iwdebi(av7110, DEBINOSWAP, TX_LEN, len, 2);
+                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, len, 2);
+                memcpy(av7110->debi_virt, av7110->bmpbuf+av7110->bmpp, len);
+                av7110->bmpp+=len;
+                av7110->bmplen-=len;
+                wait_for_debi_done(av7110);
+                saa7146_write(av7110->dev, IER, 
+                              saa7146_read(av7110->dev, IER) | MASK_19 );
+                if (len<5) len=5; /* we want a real DEBI DMA */
+                iwdebi(av7110, DEBISWAB, DPRAM_BASE+txbuf, 0, (len+3)&~3);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_CI_GET:
+        case DATA_COMMON_INTERFACE:
+        case DATA_FSECTION:
+        case DATA_IPMPE:
+        case DATA_PIPING:
+                if (!len || len>4*1024) {
+                        iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                        break;
+                }                  /* yes, fall through */
+        case DATA_TS_RECORD:
+        case DATA_PES_RECORD:
+                wait_for_debi_done(av7110);
+                saa7146_write(av7110->dev, IER, 
+                              saa7146_read(av7110->dev, IER) | MASK_19);
+                irdebi(av7110, DEBISWAB, DPRAM_BASE+rxbuf, 0, len);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_DEBUG_MESSAGE:
+                wait_for_debi_done(av7110);
+                if (!len || len>0xff) {
+                        iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                        break;
+                }
+                saa7146_write(av7110->dev, IER, 
+                              saa7146_read(av7110->dev, IER) | MASK_19);
+                irdebi(av7110, DEBISWAB, Reserved, 0, len);
+                spin_unlock(&av7110->debilock);
+                return;
+
+        case DATA_IRCOMMAND: 
+                IR_handle(av7110, 
+                          swahw32(irdebi(av7110, DEBINOSWAP, Reserved, 0, 4)));
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+                break;
+
+        default:
+                printk("gpioirq unknown type=%d len=%d\n", 
+                       av7110->debitype, av7110->debilen);
+                break;
+        }      
+        ARM_ClearMailBox(av7110);
+        av7110->debitype=-1;
+        spin_unlock(&av7110->debilock);
+}
+
+
+/****************************************************************************
+ * DEBI command polling 
+ ****************************************************************************/
+
+
+static int OutCommand(av7110_t *av7110, u16* buf, int length)
+{
+        int i;
+        u32 start;
+#ifdef COM_DEBUG
+        u32 stat;
+#endif
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+	if (!av7110->arm_ready) {
+		DEB_D(("arm not ready.\n"));
+		return -1;
+	}
+
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) )
+        {
+                ddelay(1);
+                if ((jiffies - start) > ARM_WAIT_FREE) {
+			printk(KERN_ERR "%s: timeout waiting for COMMAND idle\n", __FUNCTION__);
+                        return -1;
+                }
+        }
+
+#ifndef _NOHANDSHAKE
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) )
+        {
+                ddelay(1);
+                if ((jiffies - start) > ARM_WAIT_SHAKE) {
+			printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
+                        return -1;
+                }
+        }
+#endif
+
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2) & OSDQFull )
+        {
+                ddelay(1);
+                if ((jiffies - start) > ARM_WAIT_OSD) {
+			printk(KERN_ERR "%s: timeout waiting for !OSDQFull\n", __FUNCTION__);
+			return -1;
+                }
+        }
+        for (i=2; i<length; i++)
+                wdebi(av7110, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2);
+
+        if (length)
+                wdebi(av7110, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2);
+        else
+                wdebi(av7110, DEBINOSWAP, COMMAND + 2, 0, 2);
+
+        wdebi(av7110, DEBINOSWAP, COMMAND, (u32) buf[0], 2);
+
+#ifdef COM_DEBUG
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) )
+        {
+                ddelay(1);
+                if ((jiffies - start) > ARM_WAIT_FREE) {
+                        printk(KERN_ERR "%s: timeout waiting for COMMAND to complete\n", __FUNCTION__);
+                        return -1;
+                }
+        }
+
+	stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
+	if (stat & GPMQOver) {
+		printk(KERN_ERR "%s: GPMQOver\n", __FUNCTION__);
+		return -1;
+	}
+	else if (stat & OSDQOver) {
+		printk(KERN_ERR "%s: OSDQOver\n", __FUNCTION__);
+		return -1;
+	}
+#endif
+
+        return 0;
+}
+
+inline static int 
+SOutCommand(av7110_t *av7110, u16* buf, int length)
+{
+        int ret;
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!av7110->arm_ready) {
+		DEB_D(("arm not ready.\n"));
+		return -1;
+	}
+	
+        if (down_interruptible(&av7110->dcomlock))
+		return -ERESTARTSYS;
+
+        ret=OutCommand(av7110, buf, length);
+        up(&av7110->dcomlock);
+	if (ret)
+                printk("SOutCommand error\n");
+        return ret;
+}
+
+
+static int outcom(av7110_t *av7110, int type, int com, int num, ...)
+{
+	va_list args;
+        u16 buf[num+2];
+        int i, ret;
+
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        buf[0]=(( type << 8 ) | com);
+        buf[1]=num;
+
+        if (num) {
+                va_start(args, num);
+                for (i=0; i<num; i++)
+                        buf[i+2]=va_arg(args, u32);
+                va_end(args);
+        }
+
+        ret = SOutCommand(av7110, buf, num+2);
+	if (ret)
+                printk("outcom error\n");
+	return ret;
+}
+
+int SendCICommand(av7110_t *av7110, u8 subcom, u8 *Params, u8 ParamLen)
+{
+        int i, ret;
+        u16 CommandBuffer[18] = { ((COMTYPE_COMMON_IF << 8) + subcom),
+                                  16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+	for(i=0; (i<ParamLen)&&(i<32); i++)	
+	{
+		if(i%2 == 0)
+			CommandBuffer[(i/2)+2] = (u16)(Params[i]) << 8;
+		else
+			CommandBuffer[(i/2)+2] |= Params[i];
+	}
+
+        ret = SOutCommand(av7110, CommandBuffer, 18);
+	if (ret)
+                printk("SendCICommand error\n");
+	return ret;
+}
+
+
+static int CommandRequest(av7110_t *av7110, u16 *Buff, int length, u16 *buf, int n)
+{
+	int err;
+        s16 i;
+        u32 start;
+#ifdef COM_DEBUG
+        u32 stat;
+#endif
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!av7110->arm_ready) {
+		DEB_D(("arm not ready.\n"));
+		return -1;
+	}
+
+        if (down_interruptible(&av7110->dcomlock))
+		return -ERESTARTSYS;
+
+        if ((err = OutCommand(av7110, Buff, length)) < 0) {
+		up(&av7110->dcomlock);
+		printk("CommandRequest error\n");
+		return err;
+	}
+
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) )
+        {
+#ifdef _NOHANDSHAKE
+                ddelay(1);
+#endif
+                if ((jiffies - start) > ARM_WAIT_FREE) {
+			printk("%s: timeout waiting for COMMAND to complete\n", __FUNCTION__);
+                        up(&av7110->dcomlock);
+                        return -1;
+                }
+        }
+
+#ifndef _NOHANDSHAKE
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
+                ddelay(1);
+                if ((jiffies - start) > ARM_WAIT_SHAKE) {
+			printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
+                        up(&av7110->dcomlock);
+                        return -1;
+                }
+        }
+#endif
+
+#ifdef COM_DEBUG
+	stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
+	if (stat & GPMQOver) {
+		printk(KERN_ERR "%s: GPMQOver\n", __FUNCTION__);
+                up(&av7110->dcomlock);
+		return -1;
+	}
+	else if (stat & OSDQOver) {
+		printk(KERN_ERR "%s: OSDQOver\n", __FUNCTION__);
+                up(&av7110->dcomlock);
+		return -1;
+	}
+#endif
+
+        for (i=0; i<n; i++)
+                buf[i] = rdebi(av7110, DEBINOSWAP, COM_BUFF + 2*i, 0, 2);
+
+	up(&av7110->dcomlock);
+        return 0;
+}
+
+
+static inline int 
+RequestParameter(av7110_t *av7110, u16 tag, u16* Buff, s16 length)
+{
+	int ret;
+        ret = CommandRequest(av7110, &tag, 0, Buff, length);
+	if (ret)
+		printk("RequestParameter error\n");
+	return ret;
+}
+
+
+/****************************************************************************
+ * Firmware commands 
+ ****************************************************************************/
+
+
+inline static int 
+SendDAC(av7110_t *av7110, u8 addr, u8 data)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        return outcom(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data);
+}
+
+static int
+SetVolume(av7110_t *av7110, int volleft, int volright)
+{
+        int err;
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        switch (av7110->adac_type) {
+        case DVB_ADAC_TI:
+                volleft = (volleft * 256) / 1036;
+                volright = (volright * 256) / 1036;
+                if (volleft > 0x3f)
+                        volleft = 0x3f;
+                if (volright > 0x3f)
+                        volright = 0x3f;
+                if ((err = SendDAC(av7110, 3, 0x80 + volleft)))
+                        return err;
+                return SendDAC(av7110, 4, volright);
+                
+        case DVB_ADAC_CRYSTAL:
+                volleft=127-volleft/2;
+                volright=127-volright/2;
+                i2c_writereg(av7110, 0x20, 0x03, volleft);
+                i2c_writereg(av7110, 0x20, 0x04, volright);
+                return 0;
+        }
+        return 0;
+}
+
+#ifdef CONFIG_DVB_AV7110_OSD
+
+inline static int ResetBlend(av7110_t *av7110, u8 windownr)
+{
+        return outcom(av7110, COMTYPE_OSD, SetNonBlend, 1, windownr);
+}
+
+inline static int SetColorBlend(av7110_t *av7110, u8 windownr)
+{
+        return outcom(av7110, COMTYPE_OSD, SetCBlend, 1, windownr); 
+}
+
+inline static int SetWindowBlend(av7110_t *av7110, u8 windownr, u8 blending)
+{
+        return outcom(av7110, COMTYPE_OSD, SetWBlend, 2, windownr, blending); 
+}
+
+inline static int SetBlend_(av7110_t *av7110, u8 windownr,
+                     OSDPALTYPE colordepth, u16 index, u8 blending)
+{
+        return outcom(av7110, COMTYPE_OSD, SetBlend, 4,
+                      windownr, colordepth, index, blending);
+} 
+
+inline static int SetColor_(av7110_t *av7110, u8 windownr,
+                     OSDPALTYPE colordepth, u16 index, u16 colorhi, u16 colorlo)
+{
+        return outcom(av7110, COMTYPE_OSD, SetColor, 5,
+                      windownr, colordepth, index, colorhi, colorlo);
+} 
+
+inline static int BringToTop(av7110_t *av7110, u8 windownr)
+{
+        return outcom(av7110, COMTYPE_OSD, WTop, 1, windownr);
+} 
+
+inline static int SetFont(av7110_t *av7110, u8 windownr, u8 fontsize,
+                   u16 colorfg, u16 colorbg)
+{
+        return outcom(av7110, COMTYPE_OSD, Set_Font, 4,
+                      windownr, fontsize, colorfg, colorbg);
+} 
+
+static int FlushText(av7110_t *av7110)
+{
+        u32 start;
+
+        if (down_interruptible(&av7110->dcomlock))
+		return -ERESTARTSYS;
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
+                ddelay(1); 
+                if ((jiffies - start) > ARM_WAIT_OSD) {
+                        printk(KERN_ERR "%s: timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__);
+                        up(&av7110->dcomlock);
+                        return -1;
+                }
+        }
+        up(&av7110->dcomlock);
+        return 0;
+}
+
+static int WriteText(av7110_t *av7110, u8 win, u16 x, u16 y, u8* buf)
+{
+        int i, ret;
+        u32 start;
+        int length=strlen(buf)+1;
+        u16 cbuf[5] = { (COMTYPE_OSD<<8) + DText, 3, win, x, y };
+        
+        if (down_interruptible(&av7110->dcomlock))
+		return -ERESTARTSYS;
+
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
+                ddelay(1);
+                if ((jiffies - start) > ARM_WAIT_OSD) {
+                        printk(KERN_ERR "%s: timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__);
+                        up(&av7110->dcomlock);
+                        return -1;
+                }
+        }
+#ifndef _NOHANDSHAKE
+        start = jiffies;
+        while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
+                ddelay(1);
+                if ((jiffies - start) > ARM_WAIT_SHAKE) {
+                        printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
+                        up(&av7110->dcomlock);
+                        return -1;
+                }
+        }
+#endif
+        for (i=0; i<length/2; i++)
+                wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2, 
+                      swab16(*(u16 *)(buf+2*i)), 2);
+        if (length&1)
+                wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i*2, 0, 2);
+        ret=OutCommand(av7110, cbuf, 5);
+        up(&av7110->dcomlock);
+	if (ret)
+		printk("WriteText error\n");
+        return ret;
+}
+
+inline static int DrawLine(av7110_t *av7110, u8 windownr, 
+                    u16 x, u16 y, u16 dx, u16 dy, u16 color)
+{
+        return outcom(av7110, COMTYPE_OSD, DLine, 6,
+                      windownr, x, y, dx, dy, color);
+} 
+
+inline static int DrawBlock(av7110_t *av7110, u8 windownr, 
+                    u16 x, u16 y, u16 dx, u16 dy, u16 color)
+{
+        return outcom(av7110, COMTYPE_OSD, DBox, 6,
+                      windownr, x, y, dx, dy, color);
+} 
+
+inline static int HideWindow(av7110_t *av7110, u8 windownr)
+{
+        return outcom(av7110, COMTYPE_OSD, WHide, 1, windownr);
+} 
+
+inline static int MoveWindowRel(av7110_t *av7110, u8 windownr, u16 x, u16 y)
+{
+        return outcom(av7110, COMTYPE_OSD, WMoveD, 3, windownr, x, y);
+} 
+
+inline static int MoveWindowAbs(av7110_t *av7110, u8 windownr, u16 x, u16 y)
+{
+        return outcom(av7110, COMTYPE_OSD, WMoveA, 3, windownr, x, y);
+} 
+
+inline static int DestroyOSDWindow(av7110_t *av7110, u8 windownr)
+{
+        return outcom(av7110, COMTYPE_OSD, WDestroy, 1, windownr);
+} 
+
+#if 0
+static void DestroyOSDWindows(av7110_t *av7110)
+{
+        int i;
+
+        for (i=1; i<7; i++)
+                outcom(av7110, COMTYPE_OSD, WDestroy, 1, i);
+} 
+#endif
+
+static inline int 
+CreateOSDWindow(av7110_t *av7110, u8 windownr,
+                           DISPTYPE disptype, u16 width, u16 height)
+{
+        return outcom(av7110, COMTYPE_OSD, WCreate, 4,
+                      windownr, disptype, width, height);
+} 
+
+
+static OSDPALTYPE bpp2pal[8]={Pal1Bit, Pal2Bit, 0, Pal4Bit, 0, 0, 0, Pal8Bit}; 
+static DISPTYPE   bpp2bit[8]={BITMAP1, BITMAP2, 0, BITMAP4, 0, 0, 0, BITMAP8}; 
+
+static inline int 
+LoadBitmap(av7110_t *av7110, u16 format, u16 dx, u16 dy, int inc, u8* data)
+{
+        int bpp;
+        int i;
+        int d, delta; 
+        u8 c;
+        DECLARE_WAITQUEUE(wait, current);
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (av7110->bmp_state==BMP_LOADING) {
+                add_wait_queue(&av7110->bmpq, &wait);
+                while (1) {
+                        set_current_state(TASK_INTERRUPTIBLE);
+                        if (av7110->bmp_state!=BMP_LOADING
+                            || signal_pending(current))
+                                break;
+                        schedule();
+                }
+                current->state=TASK_RUNNING;
+                remove_wait_queue(&av7110->bmpq, &wait);
+        }
+        if (av7110->bmp_state==BMP_LOADING)
+                return -1;
+        av7110->bmp_state=BMP_LOADING;
+        if      (format==BITMAP8) { bpp=8; delta = 1; } 
+        else if (format==BITMAP4) { bpp=4; delta = 2; }
+        else if (format==BITMAP2) { bpp=2; delta = 4; }
+        else if (format==BITMAP1) { bpp=1; delta = 8; }
+        else {
+                av7110->bmp_state=BMP_NONE;
+                return -1;
+        }
+        av7110->bmplen= ((dx*dy*bpp+7)&~7)/8; 
+        av7110->bmpp=0;
+        if (av7110->bmplen>32768) {
+                av7110->bmp_state=BMP_NONE;
+                return -1;
+        }
+        for (i=0; i<dy; i++) {
+                if (copy_from_user(av7110->bmpbuf+1024+i*dx, data+i*inc, dx)) { 
+                        av7110->bmp_state=BMP_NONE;
+                        return -1;
+                }
+        }
+        if (format != BITMAP8) {
+                for (i=0; i<dx*dy/delta; i++) {
+                        c = ((u8 *)av7110->bmpbuf)[1024+i*delta+delta-1];
+                        for (d=delta-2; d>=0; d--) {
+                                c |= (((u8 *)av7110->bmpbuf)[1024+i*delta+d] 
+                                      << ((delta-d-1)*bpp));
+                                ((u8 *)av7110->bmpbuf)[1024+i] = c;
+                        }
+                }
+        }
+        av7110->bmplen+=1024;
+        return outcom(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy);
+} 
+
+static int 
+BlitBitmap(av7110_t *av7110, u16 win, u16 x, u16 y, u16 trans)
+{
+        DECLARE_WAITQUEUE(wait, current);
+        
+  	DEB_EE(("av7110: %p\n",av7110));
+
+       if (av7110->bmp_state==BMP_NONE)
+                return -1;
+        if (av7110->bmp_state==BMP_LOADING) {
+                add_wait_queue(&av7110->bmpq, &wait);
+                while (1) {
+                        set_current_state(TASK_INTERRUPTIBLE);
+                        if (av7110->bmp_state!=BMP_LOADING
+                            || signal_pending(current))
+                                break;
+                        schedule();
+                }
+                current->state=TASK_RUNNING;
+                remove_wait_queue(&av7110->bmpq, &wait);
+        }
+        if (av7110->bmp_state==BMP_LOADED)
+                return outcom(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans);
+        return -1;
+} 
+
+static inline int 
+ReleaseBitmap(av7110_t *av7110)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (av7110->bmp_state!=BMP_LOADED)
+                return -1;
+        av7110->bmp_state=BMP_NONE;
+        return outcom(av7110, COMTYPE_OSD, ReleaseBmp, 0);
+} 
+
+static u32 RGB2YUV(u16 R, u16 G, u16 B)
+{
+        u16 y, u, v;
+        u16 Y, Cr, Cb;
+
+        y = R * 77 + G * 150 + B * 29;  // Luma=0.299R+0.587G+0.114B 0..65535
+        u = 2048+B * 8 -(y>>5);    // Cr 0..4095
+        v = 2048+R * 8 -(y>>5);    // Cb 0..4095
+
+        Y=y/256;
+        Cb=u/16;
+        Cr=v/16;
+
+        return Cr|(Cb<<16)|(Y<<8);
+}
+
+static void
+OSDSetColor(av7110_t *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend)
+{
+        u16 ch, cl;
+        u32 yuv;
+
+        yuv=blend ? RGB2YUV(r,g,b) : 0;
+        cl=(yuv&0xffff);
+        ch=((yuv>>16)&0xffff);
+        SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
+                  color, ch, cl);
+        SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
+                  color, ((blend>>4)&0x0f));
+}
+
+static int
+OSDSetBlock(av7110_t *av7110, int x0, int y0, int x1, int y1, int inc, u8 *data)
+{
+        uint w, h, bpp, bpl, size, lpb, bnum, brest;
+        int i;
+
+        w=x1-x0+1; h=y1-y0+1;
+        if (inc<=0)
+                inc=w; 
+        if (w<=0 || w>720 || h<=0 || h>576) 
+                return -1;
+        bpp=av7110->osdbpp[av7110->osdwin]+1; 
+        bpl=((w*bpp+7)&~7)/8; 
+        size=h*bpl;
+        lpb=(32*1024)/bpl; 
+        bnum=size/(lpb*bpl);
+        brest=size-bnum*lpb*bpl;
+
+        for (i=0; i<bnum; i++) {
+                LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, lpb, inc, data); 
+                BlitBitmap(av7110, av7110->osdwin, x0, y0+i*lpb, 0);
+                data+=lpb*inc; 
+        }
+        if (brest) {
+                LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], w, brest/bpl, inc, data); 
+                BlitBitmap(av7110, av7110->osdwin, x0, y0+bnum*lpb, 0);
+        }
+        ReleaseBitmap(av7110);
+        return 0;
+}
+
+static int 
+OSD_DrawCommand(av7110_t *av7110, osd_cmd_t *dc)
+{
+        switch (dc->cmd) {
+        case OSD_Close:
+                DestroyOSDWindow(av7110, av7110->osdwin);
+                return 0;
+        case OSD_Open:
+                av7110->osdbpp[av7110->osdwin]=(dc->color-1)&7;
+                CreateOSDWindow(av7110, av7110->osdwin, bpp2bit[av7110->osdbpp[av7110->osdwin]],
+                                dc->x1-dc->x0+1, dc->y1-dc->y0+1);
+                if (!dc->data) {
+                        MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
+                        SetColorBlend(av7110, av7110->osdwin);
+                }
+                return 0;
+        case OSD_Show:
+                MoveWindowRel(av7110, av7110->osdwin, 0, 0);
+                return 0;
+        case OSD_Hide:
+                HideWindow(av7110, av7110->osdwin);
+                return 0;
+        case OSD_Clear:
+                DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0);
+                return 0;
+        case OSD_Fill:
+                DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color);
+                return 0;
+        case OSD_SetColor:
+                OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1); 
+                return 0;
+        case OSD_SetPalette:
+        {      
+                int i, len=dc->x0-dc->color+1;
+                u8 *colors=(u8 *)dc->data;
+
+                for (i=0; i<len; i++)
+                        OSDSetColor(av7110, dc->color+i,
+                                    colors[i*4]  , colors[i*4+1],
+                                    colors[i*4+2], colors[i*4+3]);
+                return 0;
+        }
+        case OSD_SetTrans: 
+                return 0;
+        case OSD_SetPixel:
+                DrawLine(av7110, av7110->osdwin,
+                         dc->x0, dc->y0, 0, 0,
+                         dc->color);
+                return 0;
+        case OSD_GetPixel: 
+                return 0;
+
+        case OSD_SetRow:   
+                dc->y1=dc->y0;
+        case OSD_SetBlock:
+                OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data);
+                return 0;
+
+        case OSD_FillRow:
+                DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
+                          dc->x1-dc->x0+1, dc->y1,
+                          dc->color);
+                return 0;
+        case OSD_FillBlock:
+                DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
+                          dc->x1-dc->x0+1, dc->y1-dc->y0+1,
+                          dc->color);
+                return 0;
+        case OSD_Line:
+                DrawLine(av7110, av7110->osdwin,
+                         dc->x0, dc->y0, dc->x1-dc->x0, dc->y1-dc->y0,
+                         dc->color);
+                return 0;
+        case OSD_Query: 
+                return 0;
+        case OSD_Test:
+                return 0;
+        case OSD_Text:
+        {
+                char textbuf[240];
+                
+                if (strncpy_from_user(textbuf, dc->data, 240)<0)
+                        return -EFAULT;
+                textbuf[239]=0;
+                if (dc->x1>3) 
+                        dc->x1=3;
+                SetFont(av7110, av7110->osdwin, dc->x1,
+                        (u16) (dc->color&0xffff), (u16) (dc->color>>16));
+                FlushText(av7110);
+                WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf);
+                return 0;
+        }
+        case OSD_SetWindow:
+                if (dc->x0<1 || dc->x0>7)
+                        return -EINVAL;
+                av7110->osdwin=dc->x0;
+                return 0;
+        case OSD_MoveWindow:
+                MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
+                SetColorBlend(av7110, av7110->osdwin);
+                return 0;
+        default:
+                return -EINVAL;
+        }
+}
+
+
+static int 
+dvb_osd_ioctl(struct inode *inode, struct file *file,
+            unsigned int cmd, void *parg)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (cmd==OSD_SEND_CMD)
+                return OSD_DrawCommand(av7110, (osd_cmd_t *)parg);
+
+	return -EINVAL;
+}
+
+
+static struct file_operations dvb_osd_fops = {
+	.owner		= THIS_MODULE,
+	.ioctl		= dvb_generic_ioctl,
+	.open		= dvb_generic_open,
+	.release	= dvb_generic_release,
+};
+
+static struct dvb_device dvbdev_osd = {
+	.priv		= 0,
+	.users		= 1,
+	.writers	= 1,
+	.fops		= &dvb_osd_fops,
+	.kernel_ioctl	= dvb_osd_ioctl,
+};
+
+#endif /* CONFIG_DVB_AV7110_OSD */
+
+
+/* get version of the firmware ROM, RTSL, video ucode and ARM application  */
+
+static void 
+firmversion(av7110_t *av7110)
+{
+        u16 buf[20];
+
+        u16 tag = ((COMTYPE_REQUEST << 8) + ReqVersion);
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        RequestParameter(av7110, tag, buf, 16);
+        
+        av7110->arm_fw=(buf[0] << 16) + buf[1];
+        av7110->arm_rtsl=(buf[2] << 16) + buf[3];
+        av7110->arm_vid=(buf[4] << 16) + buf[5];
+        av7110->arm_app=(buf[6] << 16) + buf[7];
+        av7110->avtype=(buf[8] << 16) + buf[9];
+
+        printk ("DVB: AV711%d(%d) - firm %08x, rtsl %08x, vid %08x, app %08x\n",
+		av7110->avtype, av7110->dvb_adapter->num, av7110->arm_fw, 
+                av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
+
+	/* print firmware capabilities */
+	if ((av7110->arm_app >> 16) & 0x8000)
+		printk ("DVB: AV711%d(%d) - firmware supports CI link layer interface\n",
+				av7110->avtype, av7110->dvb_adapter->num);
+	else
+		printk ("DVB: AV711%d(%d) - no firmware support for CI link layer interface\n",
+				av7110->avtype, av7110->dvb_adapter->num);
+
+        return;
+}
+
+static int 
+waitdebi(av7110_t *av7110, int adr, int state)
+{
+        int k;
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        for (k=0; k<100; k++, udelay(500)) {
+                if (irdebi(av7110, DEBINOSWAP, adr, 0, 2) == state) 
+                        return 0;
+        }
+        return -1;
+}
+
+
+static int 
+load_dram(av7110_t *av7110, u32 *data, int len)
+{
+        int i;
+        int blocks, rest;
+        u32 base, bootblock=BOOT_BLOCK;
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        blocks=len/BOOT_MAX_SIZE;
+        rest=len % BOOT_MAX_SIZE;
+        base=DRAM_START_CODE;
+        
+        for (i=0; i<blocks; i++) {
+                if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
+                        return -1;
+                DEB_D(("Writing DRAM block %d\n",i));
+                iwdebi(av7110, DEBISWAB, bootblock,
+                       i*(BOOT_MAX_SIZE)+(u32)data,
+                       BOOT_MAX_SIZE);
+                bootblock^=0x1400;
+                iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
+                iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, BOOT_MAX_SIZE, 2);
+                iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
+                base+=BOOT_MAX_SIZE;
+        }
+        
+        if (rest > 0) {
+                if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
+                        return -1;
+                if (rest>4)
+                        iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)+(u32)data, rest);
+                else
+                        iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)-4+(u32)data, rest+4);
+                
+                iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4);
+                iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2);
+                iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
+        }
+        if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0)
+                return -1;
+        iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2);
+        iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
+        if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0)
+                return -1;
+        return 0;
+}
+
+
+static u8 
+bootcode[] = {
+        0xea, 0x00, 0x00, 0x0e, 0xe1, 0xb0, 0xf0, 0x0e, /* 0x0000 */
+        0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04,
+        0xe2, 0x5e, 0xf0, 0x08, 0xe2, 0x5e, 0xf0, 0x04,
+        0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x04,
+        0x2c, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c,
+        0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x34,
+        0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0x5a, 0x5a,
+        0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09,
+        0xe5, 0x9f, 0xd0, 0x5c, 0xe5, 0x9f, 0x40, 0x54, /* 0x0040 */
+        0xe3, 0xa0, 0x00, 0x00, 0xe5, 0x84, 0x00, 0x00,
+        0xe5, 0x84, 0x00, 0x04, 0xe1, 0xd4, 0x10, 0xb0,
+        0xe3, 0x51, 0x00, 0x00, 0x0a, 0xff, 0xff, 0xfc,
+        0xe1, 0xa0, 0x10, 0x0d, 0xe5, 0x94, 0x30, 0x04,
+        0xe1, 0xd4, 0x20, 0xb2, 0xe2, 0x82, 0x20, 0x3f,
+        0xe1, 0xb0, 0x23, 0x22, 0x03, 0xa0, 0x00, 0x02,
+        0xe1, 0xc4, 0x00, 0xb0, 0x0a, 0xff, 0xff, 0xf4,
+        0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0, /* 0x0080 */
+        0xe8, 0xb1, 0x1f, 0xe0, 0xe8, 0xa3, 0x1f, 0xe0,
+        0xe2, 0x52, 0x20, 0x01, 0x1a, 0xff, 0xff, 0xf9,
+        0xe2, 0x2d, 0xdb, 0x05, 0xea, 0xff, 0xff, 0xec,
+        0x2c, 0x00, 0x03, 0xf8, 0x2c, 0x00, 0x04, 0x00,
+};
+
+#include "av7110_firm.h"
+
+static int 
+bootarm(av7110_t *av7110)
+{
+	struct saa7146_dev *dev= av7110->dev;
+        u32 ret;
+        int i;
+
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
+
+        /* Disable DEBI and GPIO irq */
+	IER_DISABLE(av7110->dev, MASK_03|MASK_19);
+/*
+        saa7146_write(av7110->dev, IER, 
+                      saa7146_read(av7110->dev, IER) & 
+                      ~(MASK_19 | MASK_03));
+*/
+        saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
+
+        /* enable DEBI */
+        saa7146_write(av7110->dev, MC1, 0x08800880);
+        saa7146_write(av7110->dev, DD1_STREAM_B, 0x00000000);
+        saa7146_write(av7110->dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+        
+        /* test DEBI */
+        iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4);
+        if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4))!=0x10325476) {
+                printk(KERN_ERR "dvb: debi test in bootarm() failed: "
+                       "%08x != %08x\n", ret, 0x10325476);;
+                return -1;
+        }
+        for (i=0; i<8192; i+=4) 
+                iwdebi(av7110, DEBISWAP, DPRAM_BASE+i, 0x00, 4);
+        DEB_D(("bootarm: debi test OK\n"));
+
+        /* boot */
+        DEB_D(("bootarm: load boot code\n"));
+
+        saa7146_setgpio(dev, ARM_IRQ_LINE, SAA7146_GPIO_IRQLO);
+        //saa7146_setgpio(dev, DEBI_DONE_LINE, SAA7146_GPIO_INPUT);
+        //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT);
+
+        iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) bootcode, sizeof(bootcode));
+        iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
+        
+        wait_for_debi_done(av7110);
+        saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI);
+        current->state=TASK_INTERRUPTIBLE;
+        schedule_timeout(HZ);
+        
+        DEB_D(("bootarm: load dram code\n"));
+
+	if (load_dram(av7110, (u32 *)Root, sizeof(Root))<0)
+		return -1;
+
+	saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTLO);
+        mdelay(1);
+        
+        DEB_D(("bootarm: load dpram code\n"));
+
+	iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) Dpram, sizeof(Dpram));
+
+	wait_for_debi_done(av7110);
+
+        saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI);
+        mdelay(800);
+
+        //ARM_ClearIrq(av7110); 
+        ARM_ResetMailBox(av7110); 
+        saa7146_write(av7110->dev, ISR, (MASK_19 | MASK_03));
+	IER_ENABLE(av7110->dev, MASK_03);
+//      saa7146_write(av7110->dev, IER, 
+//                      saa7146_read(av7110->dev, IER) | MASK_03 );
+
+        av7110->arm_errors=0;
+        av7110->arm_ready=1;
+        return 0;
+}
+
+static inline int
+SetPIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, 
+        u16 subpid, u16 pcrpid)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+	if (vpid == 0x1fff || apid == 0x1fff ||
+	    ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff)
+		vpid = apid = ttpid = subpid = pcrpid = 0;
+
+        return outcom(av7110, COMTYPE_PIDFILTER, MultiPID, 5, 
+                      pcrpid, vpid, apid, ttpid, subpid);
+}
+
+static void
+ChangePIDs(av7110_t *av7110, u16 vpid, u16 apid, u16 ttpid, 
+        u16 subpid, u16 pcrpid)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (down_interruptible(&av7110->pid_mutex))
+		return;
+
+        if (!(vpid&0x8000))  av7110->pids[DMX_PES_VIDEO]=vpid;
+        if (!(apid&0x8000))  av7110->pids[DMX_PES_AUDIO]=apid;
+        if (!(ttpid&0x8000)) av7110->pids[DMX_PES_TELETEXT]=ttpid;
+        if (!(pcrpid&0x8000)) av7110->pids[DMX_PES_PCR]=pcrpid;
+
+        av7110->pids[DMX_PES_SUBTITLE]=0;
+
+        if (av7110->fe_synced) 
+                SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid);
+
+        up(&av7110->pid_mutex);
+}
+
+
+static void 
+SetMode(av7110_t *av7110, int mode)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        outcom(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode);
+        
+        if (!av7110->playing) {
+                ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], 
+                           av7110->pids[DMX_PES_AUDIO], 
+                           av7110->pids[DMX_PES_TELETEXT],  
+                           0, av7110->pids[DMX_PES_PCR]);
+                outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
+        }
+}
+
+inline static void 
+TestMode(av7110_t *av7110, int mode)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+        outcom(av7110, COMTYPE_ENCODER, SetTestMode, 1, mode);
+}
+
+inline static void 
+VidMode(av7110_t *av7110, int mode)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+        outcom(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode);
+}
+           
+
+static int inline
+vidcom(av7110_t *av7110, u32 com, u32 arg)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+        return outcom(av7110, 0x80, 0x02, 4, 
+                      (com>>16), (com&0xffff), 
+                      (arg>>16), (arg&0xffff));
+}
+
+static int inline
+audcom(av7110_t *av7110, u32 com)
+{
+	DEB_EE(("av7110: %p\n",av7110));
+	return outcom(av7110, 0x80, 0x03, 4, 
+                      (com>>16), (com&0xffff));
+}
+
+inline static void 
+Set22K(av7110_t *av7110, int state)
+{
+ 	DEB_EE(("av7110: %p\n",av7110));
+	outcom(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0);
+}
+
+
+static
+int SendDiSEqCMsg(av7110_t *av7110, int len, u8 *msg, int burst)
+{
+        int i;
+	u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) + SendDiSEqC),
+                        16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+	if (len>10)
+		len=10;
+
+	buf[1] = len+2;
+	buf[2] = len;
+
+	if (burst!=-1)
+		buf[3]=burst ? 0x01 : 0x00;
+	else
+		buf[3]=0xffff;
+
+	for (i=0; i<len; i++)
+		buf[i+4]=msg[i];
+
+	if (SOutCommand(av7110, buf, 18))
+		printk("SendDiSEqCMsg error\n");
+
+        return 0;
+}
+
+/****************************************************************************
+ * I2C client commands
+ ****************************************************************************/
+
+static inline int
+i2c_writereg(av7110_t *av7110, u8 id, u8 reg, u8 val)
+{
+        u8 msg[2]={ reg, val }; 
+        struct dvb_i2c_bus *i2c = av7110->i2c_bus;
+        struct i2c_msg msgs;
+
+        msgs.flags=0;
+        msgs.addr=id/2;
+        msgs.len=2;
+        msgs.buf=msg;
+        return i2c->xfer (i2c, &msgs, 1);
+}
+
+static inline int
+msp_writereg(av7110_t *av7110, u8 dev, u16 reg, u16 val)
+{
+        u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff }; 
+        struct dvb_i2c_bus *i2c = av7110->i2c_bus;
+        struct i2c_msg msgs;
+
+        msgs.flags=0;
+        msgs.addr=0x40;
+        msgs.len=5;
+        msgs.buf=msg;
+        return i2c->xfer(i2c, &msgs, 1);
+}
+
+static inline u8
+i2c_readreg(av7110_t *av7110, u8 id, u8 reg)
+{
+        struct dvb_i2c_bus *i2c = av7110->i2c_bus;
+        u8 mm1[] = {0x00};
+        u8 mm2[] = {0x00};
+        struct i2c_msg msgs[2];
+
+        msgs[0].flags=0;
+        msgs[1].flags=I2C_M_RD;
+        msgs[0].addr=msgs[1].addr=id/2;
+        mm1[0]=reg;
+        msgs[0].len=1; msgs[1].len=1;
+        msgs[0].buf=mm1; msgs[1].buf=mm2;
+        i2c->xfer(i2c, msgs, 2);
+
+        return mm2[0];
+}
+
+
+/****************************************************************************
+ * I/O buffer management and control
+ ****************************************************************************/
+
+static int sw2mode[16] = {
+        VIDEO_MODE_PAL, VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL,
+        VIDEO_MODE_NTSC, VIDEO_MODE_NTSC, VIDEO_MODE_PAL, VIDEO_MODE_NTSC,
+        VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
+        VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL,
+};
+
+static void
+get_video_format(av7110_t *av7110, u8 *buf, int count)
+{
+        int i;
+	int hsize,vsize;
+        int sw;
+        u8 *p;
+
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (av7110->sinfo)
+                return;
+        for (i=7; i<count-10; i++) {
+                p=buf+i;
+                if (p[0] || p[1] || p[2]!=0x01 || p[3]!=0xb3)
+                        continue;
+                p+=4;
+                hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4);
+                vsize = ((p[1] &0x0F) << 8) | (p[2]);
+                sw = (p[3]&0x0F);
+                SetMode(av7110, sw2mode[sw]);
+                DEB_S(("dvb: playback %dx%d fr=%d\n", hsize, vsize, sw));
+                av7110->sinfo=1;
+                break;
+        }
+}
+
+static inline long
+aux_ring_buffer_write(dvb_ringbuffer_t *rbuf, const char *buf, unsigned long count)
+{
+        unsigned long todo = count;
+        int free;
+    
+        while (todo > 0) {
+                if (dvb_ringbuffer_free(rbuf)<2048) {
+                        if (wait_event_interruptible(rbuf->queue,
+                                                     (dvb_ringbuffer_free(rbuf)>=2048)))
+                        	return count-todo;
+                }   
+                free = dvb_ringbuffer_free(rbuf);
+                if (free > todo)
+                        free = todo;
+                (void)dvb_ringbuffer_write(rbuf,buf,free,0);
+                todo -= free;
+                buf += free;
+        }
+
+	return count-todo;
+}
+
+static void
+play_video_cb(u8 *buf, int count, void *priv)
+{
+        av7110_t *av7110=(av7110_t *) priv;
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if ((buf[3]&0xe0)==0xe0) {
+                get_video_format(av7110, buf, count);
+                aux_ring_buffer_write(&av7110->avout, buf, count);
+        } else
+                aux_ring_buffer_write(&av7110->aout, buf, count);
+}
+
+static void
+play_audio_cb(u8 *buf, int count, void *priv)
+{
+        av7110_t *av7110=(av7110_t *) priv;
+ 	DEB_EE(("av7110: %p\n",av7110));
+        
+        aux_ring_buffer_write(&av7110->aout, buf, count);
+}
+
+#define FREE_COND (dvb_ringbuffer_free(&av7110->avout)>=20*1024 && dvb_ringbuffer_free(&av7110->aout)>=20*1024)
+
+static ssize_t 
+dvb_play(av7110_t *av7110, const u8 *buf,
+         unsigned long count, int nonblock, int type, int umem)
+{
+        unsigned long todo = count, n;
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!av7110->kbuf[type])
+                return -ENOBUFS;
+
+	if (nonblock && !FREE_COND)
+                return -EWOULDBLOCK;
+                
+        while (todo>0) {
+                if (!FREE_COND) {
+                        if (nonblock)
+                                return count-todo;
+                        if (wait_event_interruptible(av7110->avout.queue,
+                                                     FREE_COND))
+                        	return count-todo;
+                } 
+		n=todo;
+                if (n>IPACKS*2)
+                        n=IPACKS*2;
+                if (umem) {
+                        if (copy_from_user(av7110->kbuf[type], buf, n)) 
+                                return -EFAULT;
+                        av7110_ipack_instant_repack(av7110->kbuf[type], n,
+						    &av7110->ipack[type]);
+                } else {
+                        av7110_ipack_instant_repack(buf, n,
+						    &av7110->ipack[type]);
+		}
+                todo -= n;
+                buf += n;
+        }
+	return count-todo;
+}
+
+static ssize_t 
+dvb_aplay(av7110_t *av7110, const u8 *buf,
+         unsigned long count, int nonblock, int type)
+{
+        unsigned long todo = count, n;
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!av7110->kbuf[type])
+                return -ENOBUFS;
+        if (nonblock && dvb_ringbuffer_free(&av7110->aout)<20*1024)
+                return -EWOULDBLOCK;
+                
+        while (todo>0) {
+                if (dvb_ringbuffer_free(&av7110->aout)<20*1024) {
+                        if (nonblock)
+                                return count-todo;
+                        if (wait_event_interruptible(av7110->aout.queue,
+                                                     (dvb_ringbuffer_free(&av7110->aout)>=
+                                                      20*1024)))
+                        	return count-todo;
+                } 
+		n=todo;
+                if (n>IPACKS*2)
+                        n=IPACKS*2;
+                if (copy_from_user(av7110->kbuf[type], buf, n)) 
+                        return -EFAULT;
+                av7110_ipack_instant_repack(av7110->kbuf[type], n,
+					    &av7110->ipack[type]);
+//                        memcpy(dvb->kbuf[type], buf, n); 
+                todo -= n;
+                buf += n;
+        }
+	return count-todo;
+}
+
+void init_p2t(p2t_t *p, struct dvb_demux_feed *feed)
+{
+	memset(p->pes,0,TS_SIZE);
+	p->counter = 0;
+	p->pos = 0;
+	p->frags = 0;
+	if (feed) p->feed = feed;
+}
+
+void clear_p2t(p2t_t *p)
+{
+	memset(p->pes,0,TS_SIZE);
+//	p->counter = 0;
+	p->pos = 0;
+	p->frags = 0;
+}
+
+
+long int find_pes_header(u8 const *buf, long int length, int *frags)
+{
+	int c = 0;
+	int found = 0;
+
+	*frags = 0;
+
+	while (c < length-3 && !found) {
+		if (buf[c] == 0x00 && buf[c+1] == 0x00 && 
+		    buf[c+2] == 0x01) {
+			switch ( buf[c+3] ) {
+				
+			case PROG_STREAM_MAP:
+			case PRIVATE_STREAM2:
+			case PROG_STREAM_DIR:
+			case ECM_STREAM     :
+			case EMM_STREAM     :
+			case PADDING_STREAM :
+			case DSM_CC_STREAM  :
+			case ISO13522_STREAM:
+			case PRIVATE_STREAM1:
+			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
+			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
+				found = 1;
+				break;
+				
+			default:
+				c++;
+				break;
+			}	
+		} else c++;
+	}
+	if (c == length-3 && !found){
+		if (buf[length-1] == 0x00) *frags = 1;
+		if (buf[length-2] == 0x00 &&
+		    buf[length-1] == 0x00) *frags = 2;
+		if (buf[length-3] == 0x00 &&
+		    buf[length-2] == 0x00 &&
+		    buf[length-1] == 0x01) *frags = 3;
+		return -1;
+	}
+
+	return c;
+}
+
+void pes_to_ts( u8 const *buf, long int length, u16 pid, p2t_t *p)
+{
+	int c,c2,l,add;
+	int check,rest;
+
+	c = 0;
+	c2 = 0;
+	if (p->frags){
+		check = 0;
+		switch(p->frags){
+		case 1:
+			if ( buf[c] == 0x00 && buf[c+1] == 0x01 ){
+				check = 1;
+				c += 2;
+			}
+			break;
+		case 2:
+			if ( buf[c] == 0x01 ){
+				check = 1;
+				c++;
+			}
+			break;
+		case 3:
+			check = 1;
+		}
+		if(check){
+			switch ( buf[c] ) {
+				
+			case PROG_STREAM_MAP:
+			case PRIVATE_STREAM2:
+			case PROG_STREAM_DIR:
+			case ECM_STREAM     :
+			case EMM_STREAM     :
+			case PADDING_STREAM :
+			case DSM_CC_STREAM  :
+			case ISO13522_STREAM:
+			case PRIVATE_STREAM1:
+			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
+			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
+				p->pes[0] = 0x00;
+				p->pes[1] = 0x00;
+				p->pes[2] = 0x01;
+				p->pes[3] = buf[c];
+				p->pos=4;
+				memcpy(p->pes+p->pos,buf+c,(TS_SIZE-4)-p->pos);
+				c += (TS_SIZE-4)-p->pos;
+				p_to_t(p->pes,(TS_SIZE-4),pid,&p->counter,
+				       p->feed);
+				clear_p2t(p);
+				break;
+				
+			default:
+				c=0;
+				break;
+			}
+		}
+		p->frags = 0;
+	}
+		
+	if (p->pos){
+		c2 = find_pes_header(buf+c,length-c,&p->frags);
+		if (c2 >= 0 && c2 < (TS_SIZE-4)-p->pos){
+			l = c2+c;
+		} else l = (TS_SIZE-4)-p->pos;
+		memcpy(p->pes+p->pos,buf,l);
+		c += l;
+		p->pos += l;
+		p_to_t(p->pes,p->pos,pid,&p->counter, p->feed);
+		clear_p2t(p);
+	}
+			
+	add = 0;
+	while (c < length){
+		c2 = find_pes_header(buf+c+add,length-c-add,&p->frags);
+		if (c2 >= 0) {
+			c2 += c+add;
+			if (c2 > c){
+				p_to_t(buf+c,c2-c,pid,&p->counter,
+				       p->feed);
+				c = c2;
+				clear_p2t(p);
+				add = 0;
+			} else add = 1;
+		} else {
+			l = length-c;
+			rest = l % (TS_SIZE-4);
+			l -= rest;
+			p_to_t(buf+c,l,pid,&p->counter,
+			       p->feed);
+			memcpy(p->pes,buf+c+l,rest);
+			p->pos = rest;
+			c = length;
+		}
+	}
+}
+
+
+int write_ts_header2(u16 pid, u8 *counter, int pes_start, u8 *buf, u8 length)
+{
+	int i;
+	int c = 0;
+	int fill;
+	u8 tshead[4] = { 0x47, 0x00, 0x00, 0x10}; 
+        
+	fill = (TS_SIZE-4)-length;
+        if (pes_start) tshead[1] = 0x40;
+	if (fill) tshead[3] = 0x30;
+        tshead[1] |= (u8)((pid & 0x1F00) >> 8);
+        tshead[2] |= (u8)(pid & 0x00FF);
+        tshead[3] |= ((*counter)++ & 0x0F) ;
+        memcpy(buf,tshead,4);
+	c+=4;
+
+
+	if (fill){
+		buf[4] = fill-1;
+		c++;
+		if (fill >1){
+			buf[5] = 0x00;
+			c++;
+		}
+		for ( i = 6; i < fill+4; i++){
+			buf[i] = 0xFF;
+			c++;
+		}
+	}
+
+        return c;
+}
+
+
+void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, 
+            struct dvb_demux_feed *feed)
+{
+  
+	int l, pes_start;
+	u8 obuf[TS_SIZE];
+	long int c = 0;
+
+	pes_start = 0;
+	if ( length > 3 && 
+             buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x01 )
+		switch (buf[3]){
+			case PROG_STREAM_MAP:
+			case PRIVATE_STREAM2:
+			case PROG_STREAM_DIR:
+			case ECM_STREAM     :
+			case EMM_STREAM     :
+			case PADDING_STREAM :
+			case DSM_CC_STREAM  :
+			case ISO13522_STREAM:
+			case PRIVATE_STREAM1:
+			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
+			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
+				pes_start = 1;
+				break;
+				
+			default:
+				break;
+		}			
+
+	while ( c < length ){
+		memset(obuf,0,TS_SIZE);
+		if (length - c >= (TS_SIZE-4)){
+			l = write_ts_header2(pid, counter, pes_start
+					     , obuf, (TS_SIZE-4));
+			memcpy(obuf+l, buf+c, TS_SIZE-l);
+			c += TS_SIZE-l;
+		} else { 
+			l = write_ts_header2(pid, counter, pes_start
+					     , obuf, length-c);
+			memcpy(obuf+l, buf+c, TS_SIZE-l);
+			c = length;
+		}
+                feed->cb.ts(obuf, 188, 0, 0, &feed->feed.ts, DMX_OK); 
+		pes_start = 0;
+	}
+}
+
+/****************************************************************************
+ * V4L SECTION
+ ****************************************************************************/
+
+int av7110_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
+{
+ 	DEB_EE(("saa7146_dev: %p\n",dev));
+
+	switch(cmd) {
+	case VIDIOC_ENUMINPUT:
+	{
+		struct v4l2_input *i = arg;
+		
+		if( i->index != 0 ) {
+			return -EINVAL;
+		}
+
+		memset(i,0,sizeof(*i));
+		i->index = 0;
+		strcpy(i->name, "DVB");
+		i->type = V4L2_INPUT_TYPE_CAMERA;
+		i->audioset = 1;
+		
+		return 0;
+	}
+	case VIDIOC_G_INPUT:
+	{
+		int *input = (int *)arg;
+		*input = 0;
+		return 0;		
+	}	
+	case VIDIOC_S_INPUT:
+	{
+		return 0;		
+	}	
+	default:
+		return -ENOIOCTLCMD;
+	}
+	return 0;
+}	
+
+static
+unsigned int dvb_audio_poll(struct file *file, poll_table *wait)
+{
+	struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
+        av7110_t *av7110 = (av7110_t *) dvbdev->priv;
+        unsigned int mask = 0;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+	poll_wait(file, &av7110->aout.queue, wait);
+
+	if (av7110->playing) {
+                if (dvb_ringbuffer_free(&av7110->aout)>=20*1024)
+                        mask |= (POLLOUT | POLLWRNORM);
+        } else /* if not playing: may play if asked for */
+		mask = (POLLOUT | POLLWRNORM);
+
+	return mask;
+}
+
+
+/****************************************************************************
+ * END OF V4L SECTION
+ ****************************************************************************/
+
+
+/****************************************************************************
+ * DVB API SECTION
+ ****************************************************************************/
+
+
+/******************************************************************************
+ * hardware filter functions
+ ******************************************************************************/
+
+static int 
+StartHWFilter(struct dvb_demux_filter *dvbdmxfilter)
+{
+        struct dvb_demux_feed *dvbdmxfeed=dvbdmxfilter->feed;
+        av7110_t *av7110=(av7110_t *) dvbdmxfeed->demux->priv;
+        u16 buf[20];
+        int ret, i;
+        u16 handle;
+//        u16 mode=0x0320;
+        u16 mode=0xb96a;
+        
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        if (dvbdmxfilter->type==DMX_TYPE_SEC) {
+		if (hw_sections) {
+	                buf[4]=(dvbdmxfilter->filter.filter_value[0]<<8)|
+        	                dvbdmxfilter->maskandmode[0];
+                	for (i=3; i<18; i++)
+                        	buf[i+4-2]=(dvbdmxfilter->filter.filter_value[i]<<8)|
+                                	dvbdmxfilter->maskandmode[i];
+	                mode=4;
+		}
+        } else
+        if ((dvbdmxfeed->ts_type & TS_PACKET) &&
+            !(dvbdmxfeed->ts_type & TS_PAYLOAD_ONLY)) 
+                init_p2t(&av7110->p2t_filter[dvbdmxfilter->index], dvbdmxfeed);
+
+        buf[0] = (COMTYPE_PID_FILTER << 8) + AddPIDFilter; 
+        buf[1] = 16;	
+        buf[2] = dvbdmxfeed->pid;
+        buf[3] = mode;
+
+        ret=CommandRequest(av7110, buf, 20, &handle, 1);          
+        if (ret<0) {
+		printk("StartHWFilter error\n");
+                return ret;
+	}
+
+        av7110->handle2filter[handle]=dvbdmxfilter;
+        dvbdmxfilter->hw_handle=handle;
+
+        return ret;
+}
+
+static int 
+StopHWFilter(struct dvb_demux_filter *dvbdmxfilter)
+{
+        av7110_t *av7110=(av7110_t *) dvbdmxfilter->feed->demux->priv;
+        u16 buf[3];
+        u16 answ[2];
+        int ret;
+        u16 handle;
+                
+ 	DEB_EE(("av7110: %p\n",av7110));
+
+        handle=dvbdmxfilter->hw_handle;
+        if (handle>32) {
+                DEB_S(("dvb: StopHWFilter tried to stop invalid filter %d.\n",
+                       handle));
+                DEB_S(("dvb: filter type = %d\n",  dvbdmxfilter->type));
+                return 0;
+        }
+
+        av7110->handle2filter[handle]=NULL;
+
+        buf[0] = (COMTYPE_PID_FILTER << 8) + DelPIDFilter; 
+        buf[1] = 1;	
+        buf[2] = handle;
+        ret=CommandRequest(av7110, buf, 3, answ, 2);          
+	if (ret)
+		printk("StopHWFilter error\n");
+
+        if (answ[1] != handle) {
+                DEB_S(("dvb: filter %d shutdown error :%d\n", handle, answ[1]));
+                ret=-1;
+        }
+        return ret;
+}
+
+
+static int 
+av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len)
+{
+        struct dvb_demux *demux = feed->demux;
+        av7110_t *av7110 = (av7110_t *) demux->priv;
+        ipack *ipack = &av7110->ipack[feed->pes_type];
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        switch (feed->pes_type) {
+        case 0:
+                if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
+                        return -EINVAL;
+                break;
+        case 1:
+                if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY)
+                        return -EINVAL;
+                break;
+        default:
+                return -1;
+        }
+
+        if (!(buf[3] & 0x10)) { // no payload?
+                return -1;
+        }
+        if (buf[1] & 0x40)
+                av7110_ipack_flush(ipack);
+
+        if (buf[3] & 0x20) {  // adaptation field?
+                len -= buf[4]+1;
+                buf += buf[4]+1;
+                if (!len)
+                        return 0;
+        }
+        
+        av7110_ipack_instant_repack(buf+4, len-4, &av7110->ipack[feed->pes_type]);
+        return 0;
+}
+
+
+static void
+dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed)
+{
+        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+        av7110_t *av7110=(av7110_t *) dvbdmx->priv;
+        u16 *pid=dvbdmx->pids, npids[5];
+        int i;
+        
+	DEB_EE(("av7110: %p\n",av7110));
+
+        npids[0]=npids[1]=npids[2]=npids[3]=0xffff;
+        npids[4]=0xffff;
+        i=dvbdmxfeed->pes_type;
+        npids[i]=(pid[i]&0x8000) ? 0 : pid[i];
+        if ((i==2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) {
+                npids[i]=0;
+                ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
+                StartHWFilter(dvbdmxfeed->filter); 
+                return;
+        }
+        if (dvbdmxfeed->pes_type<=2)
+                ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
+
+        if (dvbdmxfeed->pes_type<2 && npids[0])
+                if (av7110->fe_synced) 
+                        outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
+
+        if ((dvbdmxfeed->ts_type & TS_PACKET)) { 
+                if (dvbdmxfeed->pes_type == 0 && 
+                    !(dvbdmx->pids[0]&0x8000))
+                        AV_StartRecord(av7110, RP_AUDIO, 
+                                       dvbdmxfeed);
+                if (dvbdmxfeed->pes_type == 1 && 
+                    !(dvbdmx->pids[1]&0x8000))
+                        AV_StartRecord(av7110, RP_VIDEO, 
+                                       dvbdmxfeed);
+        }
+}
+
+static void
+dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed)
+{
+        struct dvb_demux *dvbdmx=dvbdmxfeed->demux;
+        av7110_t *av7110=(av7110_t *) dvbdmx->priv;
+        u16 *pid=dvbdmx->pids, npids[5];
+        int i;
+        
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (dvbdmxfeed->pes_type<=1) {
+                AV_Stop(av7110, dvbdmxfeed->pes_type ? 
+                        RP_VIDEO : RP_AUDIO);
+                if (!av7110->rec_mode)
+                        dvbdmx->recording=0;
+                if (!av7110->playing)
+                        dvbdmx->playing=0;
+        }
+        npids[0]=npids[1]=npids[2]=npids[3]=0xffff;
+        npids[4]=0xffff;
+        i=dvbdmxfeed->pes_type;
+        switch (i) {
+        case 2: //teletext
+                if (dvbdmxfeed->ts_type & TS_PACKET)
+                        StopHWFilter(dvbdmxfeed->filter); 
+                npids[2]=0;
+                break;
+        case 0:
+        case 1:
+        case 4:
+                if (!pids_off) 
+                        return;
+                npids[i]=(pid[i]&0x8000) ? 0 : pid[i];
+                break;
+        }
+        ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
+}
+
+static int 
+av7110_start_feed(struct dvb_demux_feed *feed)
+{
+        struct dvb_demux *demux = feed->demux;
+        av7110_t *av7110 = (av7110_t *) demux->priv;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!demux->dmx.frontend)
+                return -EINVAL;
+
+        if (feed->pid > 0x1fff) 
+                return -EINVAL;
+
+        if (feed->type == DMX_TYPE_TS) {
+	        if ((feed->ts_type & TS_DECODER) &&
+		    (feed->pes_type < DMX_TS_PES_OTHER)) {
+		        switch (demux->dmx.frontend->source) {
+			case DMX_MEMORY_FE: 
+			        if (feed->ts_type & TS_DECODER)
+				       if (feed->pes_type < 2 && 
+                                           !(demux->pids[0] & 0x8000) &&
+					   !(demux->pids[1] & 0x8000)) {
+                                               dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
+                                               dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
+                                               AV_StartPlay(av7110,RP_AV);
+                                               demux->playing = 1;
+					}
+				break;
+			default:
+                                dvb_feed_start_pid(feed);
+				break;
+			}
+		} else
+		        if ((feed->ts_type & TS_PACKET) &&
+                            (demux->dmx.frontend->source!=DMX_MEMORY_FE))
+                                StartHWFilter(feed->filter); 
+        }
+        
+        if (feed->type == DMX_TYPE_SEC) {
+                int i;
+
+	        for (i=0; i<demux->filternum; i++) {
+		        if (demux->filter[i].state!=DMX_STATE_READY)
+			        continue;
+			if (demux->filter[i].type!=DMX_TYPE_SEC)
+			        continue;
+			if (demux->filter[i].filter.parent!=&feed->feed.sec)
+			        continue;
+			demux->filter[i].state=DMX_STATE_GO;
+                        if (demux->dmx.frontend->source!=DMX_MEMORY_FE)
+                                StartHWFilter(&demux->filter[i]); 
+                }
+	}
+
+        return 0;
+}
+
+
+static int 
+av7110_stop_feed(struct dvb_demux_feed *feed)
+{
+        struct dvb_demux *demux = feed->demux;
+        av7110_t *av7110 = (av7110_t *) demux->priv;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (feed->type == DMX_TYPE_TS) {
+                if (feed->ts_type & TS_DECODER) {
+                        if (feed->pes_type >= DMX_TS_PES_OTHER ||
+                            !demux->pesfilter[feed->pes_type]) 
+                                return -EINVAL;
+                        demux->pids[feed->pes_type]|=0x8000;
+                        demux->pesfilter[feed->pes_type]=0;
+                }
+                if (feed->ts_type & TS_DECODER &&
+		    feed->pes_type < DMX_TS_PES_OTHER) {
+                        dvb_feed_stop_pid(feed);
+                } else 
+                        if ((feed->ts_type & TS_PACKET) &&
+                            (demux->dmx.frontend->source != DMX_MEMORY_FE))
+                                StopHWFilter(feed->filter); 
+        }
+        
+        if (feed->type == DMX_TYPE_SEC) {
+                int i;
+
+	        for (i=0; i<demux->filternum; i++)
+		        if (demux->filter[i].state==DMX_STATE_GO && 
+			    demux->filter[i].filter.parent==&feed->feed.sec) {
+			        demux->filter[i].state=DMX_STATE_READY;
+                                if (demux->dmx.frontend->source!=DMX_MEMORY_FE)
+                                        StopHWFilter(&demux->filter[i]); 
+                }
+	}
+
+        return 0;
+}
+
+
+static void 
+restart_feeds(av7110_t *av7110)
+{
+        struct dvb_demux *dvbdmx=&av7110->demux;
+        struct dvb_demux_feed *feed;
+        int mode;
+        int i;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        mode=av7110->playing;
+        av7110->playing=0;
+        av7110->rec_mode=0;
+
+        for (i=0; i<dvbdmx->filternum; i++) {
+                feed=&dvbdmx->feed[i];
+                if (feed->state==DMX_STATE_GO)
+                        av7110_start_feed(feed);
+        }
+
+        if (mode)
+                AV_StartPlay(av7110, mode);
+}
+
+/******************************************************************************
+ * SEC device file operations
+ ******************************************************************************/
+
+static
+int av7110_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+	av7110_t *av7110 = fe->before_after_data;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+	switch (cmd) {
+	case FE_SET_TONE:
+		switch ((fe_sec_tone_mode_t) arg) {
+		case SEC_TONE_ON:
+			Set22K (av7110, 1);
+			break;
+		case SEC_TONE_OFF:
+			Set22K (av7110, 0);
+			break;
+		default:
+			return -EINVAL;
+		};
+		break;
+
+	case FE_DISEQC_SEND_MASTER_CMD:
+	{
+		struct dvb_diseqc_master_cmd *cmd = arg;
+
+		SendDiSEqCMsg (av7110, cmd->msg_len, cmd->msg, 0);
+		break;
+	}
+
+	case FE_DISEQC_SEND_BURST:
+		SendDiSEqCMsg (av7110, 0, NULL, (int) arg);
+		break;
+
+	default:
+		return -EOPNOTSUPP;
+	};
+
+	return 0;
+}
+
+/******************************************************************************
+ * CI link layer file ops (FIXME: move this to separate module later)
+ ******************************************************************************/
+
+int ci_ll_init(dvb_ringbuffer_t *cirbuf, dvb_ringbuffer_t *ciwbuf, int size)
+{
+        dvb_ringbuffer_init(cirbuf, vmalloc(size), size);
+        dvb_ringbuffer_init(ciwbuf, vmalloc(size), size);
+        return 0;
+}
+
+void ci_ll_flush(dvb_ringbuffer_t *cirbuf, dvb_ringbuffer_t *ciwbuf)
+{
+        dvb_ringbuffer_flush_spinlock_wakeup(cirbuf);
+        dvb_ringbuffer_flush_spinlock_wakeup(ciwbuf);
+}
+
+void ci_ll_release(dvb_ringbuffer_t *cirbuf, dvb_ringbuffer_t *ciwbuf)
+{
+        vfree(cirbuf->data);
+        cirbuf->data=0;
+        vfree(ciwbuf->data);
+        ciwbuf->data=0;
+}
+
+
+int ci_ll_reset(dvb_ringbuffer_t *cibuf, struct file *file, 
+                int slots, ca_slot_info_t *slot)
+{
+	int i;
+	int len=0;
+	u8 msg[8]={0x00,0x06,0,0x00,0xff,0x02,0x00,0x00};
+
+	for (i=0; i<2; i++) {
+		if (slots & (1<<i)) 
+			len+=8;
+	}
+
+	if (dvb_ringbuffer_free(cibuf) < len)
+		return -EBUSY;
+
+	for (i=0; i<2; i++) {
+		if (slots & (1<<i)) {
+			msg[2]=i;
+			dvb_ringbuffer_write(cibuf,msg,8,0);
+			slot[i].flags=0;
+		}
+	}
+
+	return 0;
+}
+
+static ssize_t 
+ci_ll_write(dvb_ringbuffer_t *cibuf, struct file *file, const char *buf, size_t count, loff_t *ppos)
+{
+        int free;
+        int non_blocking=file->f_flags&O_NONBLOCK;
+
+        if (count>2048)
+                return -EINVAL;
+        free=dvb_ringbuffer_free(cibuf);
+        if (count+2>free) { 
+                if (non_blocking)
+                        return -EWOULDBLOCK;
+                if (wait_event_interruptible(cibuf->queue,
+                                             (dvb_ringbuffer_free(cibuf)>=count+2)))
+                        return 0;
+        }
+
+        DVB_RINGBUFFER_WRITE_BYTE(cibuf,count>>8);   
+        DVB_RINGBUFFER_WRITE_BYTE(cibuf,count&0xff); 
+
+        return dvb_ringbuffer_write(cibuf,buf,count,1);
+}
+
+static ssize_t 
+ci_ll_read(dvb_ringbuffer_t *cibuf, struct file *file, char *buf, size_t count, loff_t *ppos)
+{
+	int avail;
+	int non_blocking=file->f_flags&O_NONBLOCK;
+	ssize_t len;
+
+	if (!cibuf->data || !count)
+	        return 0;
+	if (non_blocking && (dvb_ringbuffer_empty(cibuf)))
+	        return -EWOULDBLOCK;
+	if (wait_event_interruptible(cibuf->queue, 
+				     !dvb_ringbuffer_empty(cibuf)))
+		return 0;
+	avail=dvb_ringbuffer_avail(cibuf);
+	if (avail<4) 
+		return 0;
+	len= DVB_RINGBUFFER_PEEK(cibuf,0)<<8;
+	len|=DVB_RINGBUFFER_PEEK(cibuf,1);
+	if (avail<len+2 || count<len) 
+		return -EINVAL;
+	DVB_RINGBUFFER_SKIP(cibuf,2);
+
+	return dvb_ringbuffer_read(cibuf,buf,len,1);
+}
+
+static int 
+dvb_ca_open(struct inode *inode, struct file *file)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        int err=dvb_generic_open(inode, file);
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (err<0)
+                return err;
+        ci_ll_flush(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
+        return 0;
+}
+
+static
+unsigned int dvb_ca_poll (struct file *file, poll_table *wait)
+{
+	struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
+        av7110_t *av7110 = (av7110_t *) dvbdev->priv;
+        dvb_ringbuffer_t *rbuf = &av7110->ci_rbuffer;
+        dvb_ringbuffer_t *wbuf = &av7110->ci_wbuffer;
+        unsigned int mask = 0;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        poll_wait (file, &rbuf->queue, wait);
+        
+        if (!dvb_ringbuffer_empty(rbuf))
+                mask |= POLLIN;
+
+	if (dvb_ringbuffer_avail(wbuf)>1024)
+                mask |= POLLOUT;
+
+        return mask;
+}
+
+static
+int dvb_ca_ioctl(struct inode *inode, struct file *file, 
+                 unsigned int cmd, void *parg)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        unsigned long arg=(unsigned long) parg;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        switch (cmd) {
+        case CA_RESET:
+#ifdef NEW_CI
+                
+                return ci_ll_reset(&av7110->ci_wbuffer, file, arg, &av7110->ci_slot[0]);
+#endif                        
+                break;
+                
+        case CA_GET_CAP:
+        {
+                ca_caps_t cap;
+                
+                cap.slot_num=2;
+#ifdef NEW_CI
+                cap.slot_type=CA_CI_LINK|CA_DESCR;
+#else
+                cap.slot_type=CA_CI|CA_DESCR;
+#endif
+                cap.descr_num=16;
+                cap.descr_type=CA_ECD;
+                memcpy(parg, &cap, sizeof(cap));
+        }
+        break;
+
+        case CA_GET_SLOT_INFO:
+        {
+                ca_slot_info_t *info=(ca_slot_info_t *)parg;
+
+                if (info->num>1)
+                        return -EINVAL;
+                av7110->ci_slot[info->num].num = info->num;
+#ifdef NEW_CI
+                av7110->ci_slot[info->num].type = CA_CI_LINK;
+#else
+                av7110->ci_slot[info->num].type = CA_CI;
+#endif
+                memcpy(info, &av7110->ci_slot[info->num], sizeof(ca_slot_info_t));
+        }
+        break;
+
+        case CA_GET_MSG:
+                break;
+
+        case CA_SEND_MSG:
+                break;
+                
+        case CA_GET_DESCR_INFO:
+        {
+                ca_descr_info_t info;
+
+                info.num=16;
+                info.type=CA_ECD;
+                memcpy (parg, &info, sizeof (info));
+        }
+        break;
+
+        case CA_SET_DESCR:
+        {
+                ca_descr_t *descr=(ca_descr_t*) parg;
+
+                if (descr->index>=16)
+                        return -EINVAL;
+                if (descr->parity>1)
+                        return -EINVAL;
+                outcom(av7110, COMTYPE_PIDFILTER, SetDescr, 5,
+                       (descr->index<<8)|descr->parity,
+                       (descr->cw[0]<<8)|descr->cw[1],
+                       (descr->cw[2]<<8)|descr->cw[3],
+                       (descr->cw[4]<<8)|descr->cw[5],
+                       (descr->cw[6]<<8)|descr->cw[7]);
+        }
+        break;
+
+        default:
+                return -EINVAL;
+        }
+        return 0;
+}
+
+static ssize_t 
+dvb_ca_write(struct file *file, const char *buf, 
+             size_t count, loff_t *ppos)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        
+	DEB_EE(("av7110: %p\n",av7110));
+        return ci_ll_write(&av7110->ci_wbuffer, file, buf, count, ppos);
+}
+
+static ssize_t 
+dvb_ca_read(struct file *file, char *buf, size_t count, loff_t *ppos)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+
+	DEB_EE(("av7110: %p\n",av7110));
+        return ci_ll_read(&av7110->ci_rbuffer, file, buf, count, ppos);
+}
+
+
+
+/******************************************************************************
+ * DVB device file operations
+ ******************************************************************************/
+
+static
+unsigned int dvb_video_poll(struct file *file, poll_table *wait)
+{
+	struct dvb_device *dvbdev = (struct dvb_device *) file->private_data;
+        av7110_t *av7110 = (av7110_t *) dvbdev->priv;
+        unsigned int mask = 0;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+	poll_wait(file, &av7110->avout.queue, wait);
+
+	if (av7110->playing) {
+                if (FREE_COND)
+                        mask |= (POLLOUT | POLLWRNORM);
+        } else /* if not playing: may play if asked for */
+                mask = (POLLOUT | POLLWRNORM);
+
+        return mask;
+}
+
+static ssize_t 
+dvb_video_write(struct file *file, const char *buf, 
+                size_t count, loff_t *ppos)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY) 
+                return -EPERM;
+
+	return dvb_play(av7110, buf, count, file->f_flags&O_NONBLOCK, 1, 1);
+}
+
+static ssize_t 
+dvb_audio_write(struct file *file, const char *buf, 
+                size_t count, loff_t *ppos)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (av7110->audiostate.stream_source!=AUDIO_SOURCE_MEMORY) {
+                printk(KERN_ERR "not audio source memory\n");
+                return -EPERM;
+        }
+        return dvb_aplay(av7110, buf, count, file->f_flags&O_NONBLOCK, 0);
+}
+
+u8 iframe_header[] = { 0x00, 0x00, 0x01, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00 };
+
+#define MIN_IFRAME 400000
+
+static void 
+play_iframe(av7110_t *av7110, u8 *buf, unsigned int len, int nonblock)
+{
+        int i, n=1;
+       
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!(av7110->playing&RP_VIDEO)) {
+                AV_StartPlay(av7110, RP_VIDEO);
+                n=MIN_IFRAME/len+1;
+        }
+
+	dvb_play(av7110, iframe_header, sizeof(iframe_header), 0, 1, 0);
+
+	for (i=0; i<n; i++) 
+                dvb_play(av7110, buf, len, 0, 1, 1);
+
+	av7110_ipack_flush(&av7110->ipack[1]);
+}
+
+
+static int 
+dvb_video_ioctl(struct inode *inode, struct file *file,
+            unsigned int cmd, void *parg)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        unsigned long arg=(unsigned long) parg;
+        int ret=0;
+        
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
+            (cmd!=VIDEO_GET_STATUS))
+                return -EPERM;
+        
+        switch (cmd) {
+        case VIDEO_STOP:
+                av7110->videostate.play_state=VIDEO_STOPPED;
+                if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY)
+                        AV_Stop(av7110, RP_VIDEO);
+                else
+                        vidcom(av7110, 0x000e, 
+                               av7110->videostate.video_blank ? 0 : 1);
+                av7110->trickmode=TRICK_NONE;
+                break; 
+                
+        case VIDEO_PLAY:
+                av7110->trickmode=TRICK_NONE;
+                if (av7110->videostate.play_state==VIDEO_FREEZED) {
+                        av7110->videostate.play_state=VIDEO_PLAYING;
+                        vidcom(av7110, 0x000d, 0);
+                } 
+                
+                if (av7110->videostate.stream_source==VIDEO_SOURCE_MEMORY) {
+                        if (av7110->playing==RP_AV) {
+                                outcom(av7110, COMTYPE_REC_PLAY, __Stop, 0);
+                                av7110->playing&=~RP_VIDEO;
+                        }
+                        AV_StartPlay(av7110,RP_VIDEO);
+                        vidcom(av7110, 0x000d, 0);
+                } else {
+                        //AV_Stop(av7110, RP_VIDEO);
+                        vidcom(av7110, 0x000d, 0);
+                }
+                av7110->videostate.play_state=VIDEO_PLAYING;
+                break;
+                
+        case VIDEO_FREEZE:
+                av7110->videostate.play_state=VIDEO_FREEZED;
+                if (av7110->playing&RP_VIDEO) 
+                        outcom(av7110, COMTYPE_REC_PLAY, __Pause, 0);
+                else
+                        vidcom(av7110, 0x0102, 1);
+                av7110->trickmode=TRICK_FREEZE;
+                break;
+                
+        case VIDEO_CONTINUE:
+                if (av7110->playing&RP_VIDEO) 
+                        outcom(av7110, COMTYPE_REC_PLAY, __Continue, 0);
+                vidcom(av7110, 0x000d, 0);
+                av7110->videostate.play_state=VIDEO_PLAYING;
+                av7110->trickmode=TRICK_NONE;
+                break;
+                
+        case VIDEO_SELECT_SOURCE:
+                av7110->videostate.stream_source=(video_stream_source_t) arg;
+                break;
+                
+        case VIDEO_SET_BLANK:
+                av7110->videostate.video_blank=(int) arg;
+		break;
+                
+        case VIDEO_GET_STATUS:
+                memcpy(parg, &av7110->videostate, sizeof(struct video_status));
+                break;
+                
+        case VIDEO_GET_EVENT:
+                //FIXME: write firmware support for this
+                ret=-EOPNOTSUPP;
+                
+        case VIDEO_SET_DISPLAY_FORMAT:
+        {
+                video_displayformat_t format=(video_displayformat_t) arg;
+                u16 val=0;
+                
+                switch(format) {
+                case VIDEO_PAN_SCAN:
+                        val=VID_PAN_SCAN_PREF;
+                        break;
+                        
+                case VIDEO_LETTER_BOX:
+                        val=VID_VC_AND_PS_PREF;
+                        break;
+                        
+                case VIDEO_CENTER_CUT_OUT:
+                        val=VID_CENTRE_CUT_PREF;
+                        break;
+                        
+                default:
+                        ret=-EINVAL;
+                        break;
+                }
+                if (ret<0)
+                        break;
+                av7110->videostate.video_format=format;
+                ret=outcom(av7110, COMTYPE_ENCODER, SetPanScanType, 
+                           1, (u16) val);
+                break;
+        }
+        
+        case VIDEO_SET_FORMAT:
+                if (arg>1) {
+                        ret=-EINVAL;
+                        break;
+                }
+                av7110->display_ar=arg;
+                ret=outcom(av7110, COMTYPE_ENCODER, SetMonitorType, 
+                           1, (u16) arg);
+                break;
+                
+        case VIDEO_STILLPICTURE:
+        { 
+                struct video_still_picture *pic=
+                        (struct video_still_picture *) parg;
+                dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
+                play_iframe(av7110, pic->iFrame, pic->size, 
+                            file->f_flags&O_NONBLOCK);
+                break;
+        }
+        
+        case VIDEO_FAST_FORWARD:
+                //note: arg is ignored by firmware
+                if (av7110->playing&RP_VIDEO) 
+                        outcom(av7110, COMTYPE_REC_PLAY, 
+                               __Scan_I, 2, AV_PES, 0);
+                else 
+                        vidcom(av7110, 0x16, arg); 
+                av7110->trickmode=TRICK_FAST;
+                av7110->videostate.play_state=VIDEO_PLAYING;
+                break;
+                
+        case VIDEO_SLOWMOTION:
+                if (av7110->playing&RP_VIDEO) {
+                        outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0);
+                        vidcom(av7110, 0x22, arg);
+                } else {
+                        vidcom(av7110, 0x0d, 0);
+                        vidcom(av7110, 0x0e, 0);
+                        vidcom(av7110, 0x22, arg);
+                }
+                av7110->trickmode=TRICK_SLOW;
+                av7110->videostate.play_state=VIDEO_PLAYING;
+                break;
+                
+        case VIDEO_GET_CAPABILITIES:
+                *(int *)parg=VIDEO_CAP_MPEG1|
+                        VIDEO_CAP_MPEG2|
+                        VIDEO_CAP_SYS|
+                        VIDEO_CAP_PROG;
+                break;
+        
+        case VIDEO_CLEAR_BUFFER:
+                dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
+                av7110_ipack_reset(&av7110->ipack[1]);
+                
+                if (av7110->playing==RP_AV) {
+                        outcom(av7110, COMTYPE_REC_PLAY, 
+                               __Play, 2, AV_PES, 0);
+                        if (av7110->trickmode==TRICK_FAST)
+                                outcom(av7110, COMTYPE_REC_PLAY, 
+                                       __Scan_I, 2, AV_PES, 0);
+                        if (av7110->trickmode==TRICK_SLOW) {
+                                outcom(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0);
+                                vidcom(av7110, 0x22, arg);
+                        }
+                        if (av7110->trickmode==TRICK_FREEZE)
+                                vidcom(av7110, 0x000e, 1);
+                }
+                break;
+                
+        case VIDEO_SET_STREAMTYPE:
+                
+                break;
+                
+        default:
+                ret=-ENOIOCTLCMD;
+                break;
+        }
+        return ret;
+}
+
+static int 
+dvb_audio_ioctl(struct inode *inode, struct file *file,
+            unsigned int cmd, void *parg)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        unsigned long arg=(unsigned long) parg;
+        int ret=0;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (((file->f_flags&O_ACCMODE)==O_RDONLY) &&
+            (cmd!=AUDIO_GET_STATUS))
+                return -EPERM;
+        
+        switch (cmd) {
+        case AUDIO_STOP:
+                if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
+                        AV_Stop(av7110, RP_AUDIO);
+                else
+                        audcom(av7110, 1);
+                av7110->audiostate.play_state=AUDIO_STOPPED;
+                break;
+                
+        case AUDIO_PLAY:
+                if (av7110->audiostate.stream_source==AUDIO_SOURCE_MEMORY)
+                        AV_StartPlay(av7110, RP_AUDIO);
+                audcom(av7110, 2);
+                av7110->audiostate.play_state=AUDIO_PLAYING;
+                break;
+                
+        case AUDIO_PAUSE:
+                audcom(av7110, 1);
+                av7110->audiostate.play_state=AUDIO_PAUSED;
+                break;
+                
+        case AUDIO_CONTINUE:
+                if (av7110->audiostate.play_state==AUDIO_PAUSED) {
+                        av7110->audiostate.play_state=AUDIO_PLAYING;
+                        audcom(av7110, 0x12);
+                } 
+                break;
+                
+        case AUDIO_SELECT_SOURCE:
+                av7110->audiostate.stream_source=(audio_stream_source_t) arg;
+                break;
+                
+        case AUDIO_SET_MUTE:
+        {
+                audcom(av7110, arg ? 1 : 2);
+                av7110->audiostate.mute_state=(int) arg;
+                break;
+        }
+        
+        case AUDIO_SET_AV_SYNC:
+                av7110->audiostate.AV_sync_state=(int) arg;
+                audcom(av7110, arg ? 0x0f : 0x0e);
+                break;
+                
+        case AUDIO_SET_BYPASS_MODE:
+                ret=-EINVAL;
+                break;
+                
+        case AUDIO_CHANNEL_SELECT:
+                av7110->audiostate.channel_select=(audio_channel_select_t) arg;
+                
+                switch(av7110->audiostate.channel_select) {
+                case AUDIO_STEREO:
+                        audcom(av7110, 0x80);
+                        break;
+                        
+                case AUDIO_MONO_LEFT:
+                        audcom(av7110, 0x100);
+                        break;
+                        
+                case AUDIO_MONO_RIGHT:
+                        audcom(av7110, 0x200);
+                        break;
+                        
+                default:
+                        ret=-EINVAL;
+                        break;
+                }
+                break;
+                
+        case AUDIO_GET_STATUS:
+                memcpy(parg, &av7110->audiostate, sizeof(struct audio_status));
+                break;
+                
+        case AUDIO_GET_CAPABILITIES:
+                *(int *)parg=AUDIO_CAP_LPCM|
+                        AUDIO_CAP_MP1|
+                        AUDIO_CAP_MP2;
+                break;
+
+        case AUDIO_CLEAR_BUFFER:
+                dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
+                av7110_ipack_reset(&av7110->ipack[0]);
+                if (av7110->playing==RP_AV)
+                        outcom(av7110, COMTYPE_REC_PLAY, 
+                               __Play, 2, AV_PES, 0);
+                break;
+        case AUDIO_SET_ID:
+                
+                break;
+        case AUDIO_SET_MIXER:
+        {
+                struct audio_mixer *amix=(struct audio_mixer *)parg;
+
+                SetVolume(av7110, amix->volume_left, amix->volume_right);
+                break;
+        }
+        case AUDIO_SET_STREAMTYPE:
+                break;
+        default:
+                ret=-ENOIOCTLCMD;
+                break;
+        }
+        return ret;
+}
+
+
+static int dvb_video_open(struct inode *inode, struct file *file)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        int err;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if ((err=dvb_generic_open(inode, file))<0)
+                return err;
+        dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
+        dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
+        av7110->video_blank=1;
+        av7110->audiostate.AV_sync_state=1;
+        av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX;
+        return 0;
+}
+
+static int dvb_video_release(struct inode *inode, struct file *file)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        AV_Stop(av7110, RP_VIDEO);
+        return dvb_generic_release(inode, file);
+}
+
+static int dvb_audio_open(struct inode *inode, struct file *file)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        int err=dvb_generic_open(inode, file);
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (err<0)
+                return err;
+        dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout);
+        av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX;
+        return 0;
+}
+
+static int dvb_audio_release(struct inode *inode, struct file *file)
+{
+	struct dvb_device *dvbdev=(struct dvb_device *) file->private_data;
+        av7110_t *av7110=(av7110_t *) dvbdev->priv;
+        
+	DEB_EE(("av7110: %p\n",av7110));
+
+        AV_Stop(av7110, RP_AUDIO);
+        return dvb_generic_release(inode, file);
+}
+
+
+
+/******************************************************************************
+ * driver registration 
+ ******************************************************************************/
+
+static struct file_operations dvb_video_fops = {
+	.owner		= THIS_MODULE,
+	.write		= dvb_video_write,
+	.ioctl		= dvb_generic_ioctl,
+	.open		= dvb_video_open,
+	.release	= dvb_video_release,
+	.poll		= dvb_video_poll,
+};
+
+static struct dvb_device dvbdev_video = {
+	.priv		= 0,
+	.users		= 1,
+	.writers	= 1,
+	.fops		= &dvb_video_fops,
+	.kernel_ioctl	= dvb_video_ioctl,
+};
+
+static struct file_operations dvb_audio_fops = {
+	.owner		= THIS_MODULE,
+	.write		= dvb_audio_write,
+	.ioctl		= dvb_generic_ioctl,
+	.open		= dvb_audio_open,
+	.release	= dvb_audio_release,
+	.poll		= dvb_audio_poll,
+};
+
+static struct dvb_device dvbdev_audio = {
+	.priv		= 0,
+	.users		= 1,
+	.writers	= 1,
+	.fops		= &dvb_audio_fops,
+	.kernel_ioctl	= dvb_audio_ioctl,
+};
+
+static struct file_operations dvb_ca_fops = {
+	.owner		= THIS_MODULE,
+	.read		= dvb_ca_read,
+	.write		= dvb_ca_write,
+	.ioctl		= dvb_generic_ioctl,
+	.open		= dvb_ca_open,
+	.release	= dvb_generic_release,
+	.poll		= dvb_ca_poll,
+};
+
+static struct dvb_device dvbdev_ca = {
+	.priv		= 0,
+	.users		= 1,
+	.writers	= 1,
+	.fops		= &dvb_ca_fops,
+	.kernel_ioctl	= dvb_ca_ioctl,
+};
+
+
+static
+void av7110_before_after_tune (fe_status_t s, void *data)
+{
+	struct av7110_s *av7110 = data;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        av7110->fe_synced = (s & FE_HAS_LOCK) ? 1 : 0;
+
+        if (av7110->playing)
+                return;
+
+        if (down_interruptible(&av7110->pid_mutex))
+                return;
+
+	if (av7110->fe_synced) {
+                SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO], 
+                        av7110->pids[DMX_PES_AUDIO], 
+                        av7110->pids[DMX_PES_TELETEXT], 0, 
+                        av7110->pids[DMX_PES_PCR]);
+        	outcom(av7110, COMTYPE_PIDFILTER, Scan, 0);
+	} else 
+		SetPIDs(av7110, 0, 0, 0, 0, 0);
+
+        up(&av7110->pid_mutex);
+}
+
+
+static
+int av7110_register(av7110_t *av7110)
+{
+        int ret, i;
+        dmx_frontend_t *dvbfront=&av7110->hw_frontend;
+        struct dvb_demux *dvbdemux=&av7110->demux;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (av7110->registered)
+                return -1;
+
+        av7110->registered=1;
+
+	dvb_add_frontend_notifier (av7110->dvb_adapter,
+				   av7110_before_after_tune, av7110);
+
+	/**
+	 *   init DiSEqC stuff
+	 */
+	dvb_add_frontend_ioctls (av7110->dvb_adapter,
+				 av7110_diseqc_ioctl, NULL, av7110);
+
+	av7110->audiostate.AV_sync_state=0;
+	av7110->audiostate.mute_state=0;
+	av7110->audiostate.play_state=AUDIO_STOPPED;
+	av7110->audiostate.stream_source=AUDIO_SOURCE_DEMUX;
+	av7110->audiostate.channel_select=AUDIO_STEREO;
+	av7110->audiostate.bypass_mode=0;
+
+	av7110->videostate.video_blank=0;
+	av7110->videostate.play_state=VIDEO_STOPPED;
+	av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX;
+	av7110->videostate.video_format=VIDEO_FORMAT_4_3;
+	av7110->videostate.display_format=VIDEO_CENTER_CUT_OUT;
+        av7110->display_ar=VIDEO_FORMAT_4_3;
+
+        memcpy(av7110->demux_id, "demux0_0", 9);
+        av7110->demux_id[5] = av7110->dvb_adapter->num + '0';
+        dvbdemux->priv = (void *) av7110;
+
+	for (i=0; i<32; i++)
+		av7110->handle2filter[i]=NULL;
+
+	dvbdemux->filternum = 32;
+	dvbdemux->feednum = 32;
+	dvbdemux->start_feed = av7110_start_feed;
+	dvbdemux->stop_feed = av7110_stop_feed;
+	dvbdemux->write_to_decoder = av7110_write_to_decoder;
+	dvbdemux->dmx.vendor = "TI";
+	dvbdemux->dmx.model = "AV7110";
+	dvbdemux->dmx.id = av7110->demux_id;
+	dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
+				      DMX_MEMORY_BASED_FILTERING);
+
+	dvb_dmx_init(&av7110->demux);
+
+	dvbfront->id = "hw_frontend";
+	dvbfront->vendor = "VLSI";
+	dvbfront->model = "DVB Frontend";
+	dvbfront->source = DMX_FRONTEND_0;
+
+	av7110->dmxdev.filternum = 32;
+	av7110->dmxdev.demux = &dvbdemux->dmx;
+	av7110->dmxdev.capabilities = 0;
+        
+	dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
+
+        ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, 
+					 &av7110->hw_frontend);
+        if (ret < 0)
+                return ret;
+        
+        av7110->mem_frontend.id = "mem_frontend";
+        av7110->mem_frontend.vendor = "memory";
+        av7110->mem_frontend.model = "sw";
+        av7110->mem_frontend.source = DMX_MEMORY_FE;
+
+	ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
+
+	if (ret < 0)
+                return ret;
+        
+        ret = dvbdemux->dmx.connect_frontend(&dvbdemux->dmx, 
+					     &av7110->hw_frontend);
+        if (ret < 0)
+                return ret;
+
+	dvb_register_device(av7110->dvb_adapter, &av7110->video_dev,
+			    &dvbdev_video, av7110, DVB_DEVICE_VIDEO);
+          
+	dvb_register_device(av7110->dvb_adapter, &av7110->audio_dev,
+			    &dvbdev_audio, av7110, DVB_DEVICE_AUDIO);
+  
+	dvb_register_device(av7110->dvb_adapter, &av7110->ca_dev,  
+                                    &dvbdev_ca, av7110, DVB_DEVICE_CA);
+#ifdef CONFIG_DVB_AV7110_OSD
+	dvb_register_device(av7110->dvb_adapter, &av7110->osd_dev,
+			    &dvbdev_osd, av7110, DVB_DEVICE_OSD);
+#endif
+#ifdef USE_DVB_DSP
+                dvb->dsp_dev = dvb_register_dsp(dvb_audio_open, 
+                                                dvb_audio_release, 
+                                                dvb_audio_ioctl, 
+                                                dvb_audio_write, 
+                                                av7110->audio_dev);
+#endif
+//        }
+        
+        av7110->dvb_net.card_num=av7110->dvb_adapter->num;
+        dvb_net_init(av7110->dvb_adapter, &av7110->dvb_net, &dvbdemux->dmx);
+
+	return 0;
+}
+
+
+static void 
+dvb_unregister(av7110_t *av7110)
+{
+        struct dvb_demux *dvbdemux=&av7110->demux;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+        if (!av7110->registered)
+                return;
+
+	dvb_net_release(&av7110->dvb_net);
+
+	dvbdemux->dmx.close(&dvbdemux->dmx);
+        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
+        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
+
+        dvb_dmxdev_release(&av7110->dmxdev);
+        dvb_dmx_release(&av7110->demux);
+
+	dvb_remove_frontend_notifier (av7110->dvb_adapter,
+				      av7110_before_after_tune);
+
+	dvb_remove_frontend_ioctls (av7110->dvb_adapter,
+				    av7110_diseqc_ioctl, NULL);
+
+	dvb_unregister_device(av7110->audio_dev);
+	dvb_unregister_device(av7110->video_dev);
+	dvb_unregister_device(av7110->osd_dev);
+	dvb_unregister_device(av7110->ca_dev);
+#ifdef USE_DVB_DSP
+	dvb_unregister_dsp(av7110->dsp_dev);
+#endif
+//        }
+}
+
+static
+int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], int num)
+{
+	struct saa7146_dev *dev = i2c->data;
+	return saa7146_i2c_transfer(dev, msgs, num, 6);
+}
+
+/****************************************************************************
+ * INITIALIZATION
+ ****************************************************************************/
+
+struct saa7146_extension_ioctls ioctls[] = {
+	{ VIDIOC_ENUMINPUT, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
+	{ 0, 0 }
+};
+
+static
+int av7110_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *pci_ext)
+{
+	av7110_t *av7110 = NULL;
+	int ret = 0;
+	
+	if (!(av7110 = kmalloc (sizeof (struct av7110_s), GFP_KERNEL))) {
+		printk ("%s: out of memory!\n", __FUNCTION__);
+		return -ENOMEM;
+	}
+
+	memset(av7110, 0, sizeof(av7110_t));
+
+	av7110->card_name = (char*)pci_ext->ext_priv;
+	(av7110_t*)dev->ext_priv = av7110;
+
+	DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
+
+	if (saa7146_vv_init(dev)) {
+		ERR(("cannot init capture device. skipping.\n"));
+		kfree(av7110);
+		return -1;
+	}
+
+	if (saa7146_register_device(&av7110->vd, dev, "av7110", VFL_TYPE_GRABBER)) {
+		ERR(("cannot register capture device. skipping.\n"));
+		saa7146_vv_release(dev);
+		kfree(av7110);
+		return -1;
+	}
+
+	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);
+
+	av7110->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
+						av7110->dvb_adapter, 0);
+
+	if (!av7110->i2c_bus) {
+		saa7146_unregister_device(&av7110->vd, dev);
+		saa7146_vv_release(dev);
+		dvb_unregister_adapter (av7110->dvb_adapter);
+		kfree(av7110);
+		return -ENOMEM;
+	}
+
+	saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
+	saa7146_write(dev, BCS_CTRL, 0x80400040);
+
+	/* set dd1 stream a & b */
+      	saa7146_write(dev, DD1_STREAM_B, 0x00000000);
+	saa7146_write(dev, DD1_INIT, 0x02000000);
+	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+
+	/* upload all */
+	saa7146_write(dev, MC2, 0x077c077c);
+        saa7146_write(dev, GPIO_CTRL, 0x000000);
+
+	tasklet_init (&av7110->debi_tasklet, debiirq, (unsigned long) av7110);
+	tasklet_init (&av7110->gpio_tasklet, gpioirq, (unsigned long) av7110);
+
+        sema_init(&av7110->pid_mutex, 1);
+
+        /* locks for data transfers from/to AV7110 */
+        spin_lock_init (&av7110->debilock);
+        sema_init(&av7110->dcomlock, 1);
+        av7110->debilock=SPIN_LOCK_UNLOCKED;
+        av7110->debitype=-1;
+
+        /* default ADAC type */
+        av7110->adac_type = adac;
+
+        /* default OSD window */
+        av7110->osdwin=1;
+
+        /* ARM "watchdog" */
+	init_waitqueue_head(&av7110->arm_wait);
+        av7110->arm_thread=0;
+     
+        av7110->vidmode=VIDEO_MODE_PAL;
+
+        av7110_ipack_init(&av7110->ipack[0], IPACKS, play_audio_cb);
+        av7110->ipack[0].data=(void *) av7110;
+        av7110_ipack_init(&av7110->ipack[1], IPACKS, play_video_cb);
+        av7110->ipack[1].data=(void *) av7110;
+        
+
+        /* allocate and init buffers */
+        av7110->debi_virt = pci_alloc_consistent(dev->pci, 8192,
+						 &av7110->debi_bus);
+	if (!av7110->debi_virt) {
+		ret = -ENOMEM;
+                goto err;
+	}
+
+        av7110->iobuf = vmalloc(AVOUTLEN+AOUTLEN+BMPLEN+4*IPACKS);
+	if (!av7110->iobuf) {
+		ret = -ENOMEM;
+                goto err;
+	}
+
+        dvb_ringbuffer_init(&av7110->avout, av7110->iobuf, AVOUTLEN);
+        dvb_ringbuffer_init(&av7110->aout, av7110->iobuf+AVOUTLEN, AOUTLEN);
+
+        /* init BMP buffer */
+        av7110->bmpbuf=av7110->iobuf+AVOUTLEN+AOUTLEN;
+        init_waitqueue_head(&av7110->bmpq);
+        
+        av7110->kbuf[0]=(u8 *)(av7110->iobuf+AVOUTLEN+AOUTLEN+BMPLEN);
+        av7110->kbuf[1]=av7110->kbuf[0]+2*IPACKS;
+
+        /* CI link layer buffers */
+        ci_ll_init(&av7110->ci_rbuffer, &av7110->ci_wbuffer, 8192);
+
+        /* handle different card types */
+
+        /* load firmware into AV7110 cards */
+
+	bootarm(av7110);
+	firmversion(av7110);
+
+	if ((av7110->arm_app&0xffff)<0x2501)
+		printk ("av7110: Warning, firmware version 0x%04x is too old. "
+			"System might be unstable!\n", av7110->arm_app&0xffff);
+
+	kernel_thread(arm_thread, (void *) av7110, 0);
+
+	SetVolume(av7110, 0xff, 0xff);
+	VidMode(av7110, vidmode);
+
+	/* remaining inits according to card and frontend type */
+	if (i2c_writereg(av7110, 0x20, 0x00, 0x00)==1) {
+		printk ("av7110%d: Crystal audio DAC detected\n",
+			av7110->dvb_adapter->num);
+		av7110->adac_type = DVB_ADAC_CRYSTAL;
+		i2c_writereg(av7110, 0x20, 0x01, 0xd2);
+		i2c_writereg(av7110, 0x20, 0x02, 0x49);
+		i2c_writereg(av7110, 0x20, 0x03, 0x00);
+		i2c_writereg(av7110, 0x20, 0x04, 0x00);
+	}
+                
+	
+	/**
+	 * some special handling for the Siemens DVB-C card...
+	 */
+	if (dev->pci->subsystem_vendor == 0x110a) {
+		if (i2c_writereg(av7110, 0x80, 0x0, 0x80)==1) {
+			i2c_writereg(av7110, 0x80, 0x0, 0);
+			printk ("av7110: DVB-C analog module detected, "
+				"initializing MSP3400\n");
+			ddelay(10);
+			msp_writereg(av7110, 0x12, 0x0013, 0x0c00);
+			msp_writereg(av7110, 0x12, 0x0000, 0x7f00); // loudspeaker + headphone
+			msp_writereg(av7110, 0x12, 0x0008, 0x0220); // loudspeaker source
+			msp_writereg(av7110, 0x12, 0x0004, 0x7f00); // loudspeaker volume
+			msp_writereg(av7110, 0x12, 0x000a, 0x0220); // SCART 1 source
+			msp_writereg(av7110, 0x12, 0x0007, 0x7f00); // SCART 1 volume
+			msp_writereg(av7110, 0x12, 0x000d, 0x4800); // prescale SCART
+		}
+
+
+		// 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
+		//saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
+		av7110->adac_type = DVB_ADAC_NONE;
+	}
+	
+	av7110_setup_irc_config (av7110, 0);
+	av7110_register(av7110);
+	
+	printk(KERN_INFO "av7110: found av7110-%d.\n",av7110_num);
+	av7110_num++;
+        return 0;
+
+err:
+	if (av7110 )
+		kfree(av7110);
+
+	/* FIXME: error handling is pretty bogus: memory does not get freed...*/
+	saa7146_unregister_device(&av7110->vd, dev);
+	saa7146_vv_release(dev);
+
+	dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter,
+				av7110->i2c_bus->id);
+
+	dvb_unregister_adapter (av7110->dvb_adapter);
+
+	return ret;
+}
+
+static
+int av7110_detach (struct saa7146_dev* saa)
+{
+	av7110_t *av7110 = (av7110_t*)saa->ext_priv;
+	DEB_EE(("av7110: %p\n",av7110));
+
+	saa7146_unregister_device(&av7110->vd, saa);
+
+	av7110->arm_rmmod=1;
+	wake_up_interruptible(&av7110->arm_wait);
+
+	while (av7110->arm_thread)
+		ddelay(1);
+
+	dvb_unregister(av7110);
+	
+	IER_DISABLE(saa, (MASK_19 | MASK_03));
+//	saa7146_write (av7110->dev, IER, 
+//		     saa7146_read(av7110->dev, IER) & ~(MASK_19 | MASK_03));
+	
+	saa7146_write(av7110->dev, ISR,(MASK_19 | MASK_03));
+
+	ci_ll_release(&av7110->ci_rbuffer, &av7110->ci_wbuffer);
+	av7110_ipack_free(&av7110->ipack[0]);
+	av7110_ipack_free(&av7110->ipack[1]);
+	vfree(av7110->iobuf);
+	pci_free_consistent(saa->pci, 8192, av7110->debi_virt,
+			    av7110->debi_bus);
+
+	dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, av7110->i2c_bus->id);
+	dvb_unregister_adapter (av7110->dvb_adapter);
+
+	kfree (av7110);
+
+	saa->ext_priv = NULL;
+	av7110_num--;
+	
+	return 0;
+}
+
+
+static
+void av7110_irq(struct saa7146_dev* dev, u32 *isr) 
+{
+	av7110_t *av7110 = (av7110_t*)dev->ext_priv;
+
+	DEB_EE(("dev: %p, av7110: %p\n",dev,av7110));
+
+	if (*isr & MASK_19)
+		tasklet_schedule (&av7110->debi_tasklet);
+	
+	if (*isr & MASK_03)
+		tasklet_schedule (&av7110->gpio_tasklet);
+}
+
+
+/* FIXME: these values are experimental values that look better than the
+   values from the latest "official" driver -- at least for me... (MiHu) */
+static
+struct saa7146_standard standard[] = {
+	{ "PAL", V4L2_STD_PAL, 0x15, 288, 576, 0x4a, 708, 709, 576, 768 },
+//	{ "PAL", V4L2_STD_PAL, 0x15, 288, 576, 0x3a, 720, 721, 576, 768 },
+	{ "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 },
+};
+
+static
+struct saa7146_extension av7110_extension;
+
+#define MAKE_AV7110_INFO(x_var,x_name) \
+static struct saa7146_pci_extension_data x_var = { \
+	.ext_priv = x_name, \
+	.ext = &av7110_extension }
+
+MAKE_AV7110_INFO(fs_1_5, "Siemens cable card PCI rev1.5");
+MAKE_AV7110_INFO(fs_1_3, "Siemens/Technotrend/Hauppauge PCI rev1.3");
+MAKE_AV7110_INFO(tt_1_6, "Technotrend/Hauppauge PCI rev1.3 or 1.6");
+MAKE_AV7110_INFO(tt_2_1, "Technotrend/Hauppauge PCI rev2.1");
+MAKE_AV7110_INFO(tt_t,	 "Technotrend/Hauppauge PCI DVB-T");
+MAKE_AV7110_INFO(unkwn0, "Technotrend/Hauppauge PCI rev?(unknown0)?");
+MAKE_AV7110_INFO(unkwn1, "Technotrend/Hauppauge PCI rev?(unknown1)?");
+MAKE_AV7110_INFO(unkwn2, "Technotrend/Hauppauge PCI rev?(unknown2)?");
+MAKE_AV7110_INFO(nexus,  "Technotrend/Hauppauge Nexus PCI DVB-S");
+
+static
+struct pci_device_id pci_tbl[] = {
+	MAKE_EXTENSION_PCI(fs_1_5, 0x110a, 0xffff),
+	MAKE_EXTENSION_PCI(fs_1_5, 0x110a, 0x0000),
+	MAKE_EXTENSION_PCI(fs_1_3, 0x13c2, 0x0000),
+	MAKE_EXTENSION_PCI(unkwn0, 0x13c2, 0x1002),
+	MAKE_EXTENSION_PCI(tt_1_6, 0x13c2, 0x0001),
+	MAKE_EXTENSION_PCI(tt_2_1, 0x13c2, 0x0002),
+	MAKE_EXTENSION_PCI(tt_2_1, 0x13c2, 0x0003),
+	MAKE_EXTENSION_PCI(tt_2_1, 0x13c2, 0x0004),
+	MAKE_EXTENSION_PCI(tt_1_6, 0x13c2, 0x0006),
+	MAKE_EXTENSION_PCI(tt_t,   0x13c2, 0x0008),
+	MAKE_EXTENSION_PCI(unkwn1, 0xffc2, 0x0000),
+	MAKE_EXTENSION_PCI(unkwn2, 0x00a1, 0x00a1),
+	MAKE_EXTENSION_PCI(nexus,  0x00a1, 0xa1a0),
+	{
+		.vendor    = 0,
+	}
+};
+
+static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
+{
+	av7110_t *av7110 = (av7110_t*)dev->ext_priv;
+	if (std->id == V4L2_STD_PAL) {
+                av7110->vidmode = VIDEO_MODE_PAL;
+		SetMode(av7110, av7110->vidmode);
+	}
+	else if (std->id == V4L2_STD_NTSC) {
+		av7110->vidmode = VIDEO_MODE_NTSC;
+		SetMode(av7110, av7110->vidmode);
+	}
+	else
+		return -1;
+
+	return 0;
+}
+
+
+static
+struct saa7146_ext_vv av7110_vv_data = {
+	.inputs		= 1,
+	.audios 	= 1,
+	.capabilities	= 0,
+	.flags		= SAA7146_EXT_SWAP_ODD_EVEN,
+
+	.stds		= &standard[0],
+	.num_stds	= sizeof(standard)/sizeof(struct saa7146_standard),
+	.std_callback	= &std_callback, 
+
+	.ioctls		= &ioctls[0],
+	.ioctl		= av7110_ioctl,
+};
+
+static
+struct saa7146_extension av7110_extension = {
+	.name		= "dvb\0",
+	.ext_vv_data	= &av7110_vv_data,
+
+	.module		= THIS_MODULE,
+	.pci_tbl	= &pci_tbl[0],
+	.attach		= av7110_attach,
+	.detach		= av7110_detach,
+
+	.irq_mask	= MASK_19|MASK_03,
+	.irq_func	= av7110_irq,
+};	
+
+
+static
+int __init av7110_init(void) 
+{
+	if (saa7146_register_extension(&av7110_extension))
+		return -ENODEV;
+	
+	av7110_ir_init();
+
+	return 0;
+}
+
+
+static
+void __exit av7110_exit(void)
+{
+	av7110_ir_exit();
+	saa7146_unregister_extension(&av7110_extension);
+}
+
+module_init(av7110_init);
+module_exit(av7110_exit);
+
+MODULE_DESCRIPTION("driver for the SAA7146 based AV110 PCI DVB cards by "
+		   "Siemens, Technotrend, Hauppauge");
+MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, others");
+MODULE_LICENSE("GPL");
+
+MODULE_PARM(av7110_debug,"i");
+MODULE_PARM(vidmode,"i");
+MODULE_PARM(pids_off,"i");
+MODULE_PARM(adac,"i");
+MODULE_PARM(hw_sections, "i");
+
diff -Nru a/drivers/media/dvb/ttpci/av7110.h b/drivers/media/dvb/ttpci/av7110.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/av7110.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,683 @@
+#ifndef _AV7110_H_
+#define _AV7110_H_
+
+#define DVB_FIRM_PATH "/lib/DVB/"
+
+#include <linux/interrupt.h>
+#include <linux/socket.h>
+#include <linux/netdevice.h>
+
+#ifdef CONFIG_DEVFS_FS
+#include <linux/devfs_fs_kernel.h>
+#endif
+
+#include <media/saa7146_vv.h>
+
+/* DEBI transfer mode defs */
+
+#define DEBINOSWAP 0x000e0000
+#define DEBISWAB   0x001e0000
+#define DEBISWAP   0x002e0000
+
+#define ARM_WAIT_FREE  (HZ)
+#define ARM_WAIT_SHAKE (HZ/5)
+#define ARM_WAIT_OSD (HZ)
+
+#define WAIT_QUEUE                 wait_queue_head_t
+
+#include <linux/dvb/video.h>
+#include <linux/dvb/audio.h>
+#include <linux/dvb/dmx.h>
+#include <linux/dvb/ca.h>
+#include <linux/dvb/osd.h>
+#include <linux/dvb/net.h>
+
+#include "dvbdev.h"
+#include "demux.h"
+#include "dvb_demux.h"
+#include "dmxdev.h"
+#include "dvb_filter.h"
+#include "dvb_net.h"
+#include "dvb_ringbuffer.h"
+
+typedef enum BOOTSTATES
+{
+	BOOTSTATE_BUFFER_EMPTY	= 0,
+	BOOTSTATE_BUFFER_FULL	= 1,
+	BOOTSTATE_BOOT_COMPLETE	= 2
+} BOOTSTATES;
+
+typedef enum
+{	RP_None,
+	AudioPES,
+	AudioMp2,
+	AudioPCM,
+	VideoPES,
+	AV_PES
+} TYPE_REC_PLAY_FORMAT;
+
+typedef struct PARAMSTRUCT
+{
+	unsigned int	wCommand;
+        int             error;
+	unsigned long	pdwData[100];
+} PARAMSTRUCT, *PPARAMSTRUCT;
+
+typedef enum OSDPALTYPE
+{
+	NoPalet =  0,      /* No palette */
+	Pal1Bit =  2,      /* 2 colors for 1 Bit Palette    */
+	Pal2Bit =  4,      /* 4 colors for 2 bit palette    */
+	Pal4Bit =  16,     /* 16 colors for 4 bit palette   */
+	Pal8Bit =  256     /* 256 colors for 16 bit palette */
+} OSDPALTYPE, *POSDPALTYPE;
+
+typedef enum {
+   BITMAP1,           /* 1 bit bitmap */
+   BITMAP2,           /* 2 bit bitmap */
+   BITMAP4,           /* 4 bit bitmap */
+   BITMAP8,           /* 8 bit bitmap */
+   BITMAP1HR,         /* 1 Bit bitmap half resolution */
+   BITMAP2HR,         /* 2 bit bitmap half resolution */
+   BITMAP4HR,         /* 4 bit bitmap half resolution */
+   BITMAP8HR,         /* 8 bit bitmap half resolution */
+   YCRCB422,          /* 4:2:2 YCRCB Graphic Display */
+   YCRCB444,          /* 4:4:4 YCRCB Graphic Display */
+   YCRCB444HR,        /* 4:4:4 YCRCB graphic half resolution */
+   VIDEOTSIZE,        /* True Size Normal MPEG Video Display */
+   VIDEOHSIZE,        /* MPEG Video Display Half Resolution */
+   VIDEOQSIZE,        /* MPEG Video Display Quarter Resolution */
+   VIDEODSIZE,        /* MPEG Video Display Double Resolution */
+   VIDEOTHSIZE,       /* True Size MPEG Video Display Half Resolution */
+   VIDEOTQSIZE,       /* True Size MPEG Video Display Quarter Resolution*/
+   VIDEOTDSIZE,       /* True Size MPEG Video Display Double Resolution */
+   VIDEONSIZE,        /* Full Size MPEG Video Display */
+   CURSOR             /* Cursor */
+} DISPTYPE;           /* Window display type           */
+
+// switch defines
+#define SB_GPIO 3
+#define SB_OFF	SAA7146_GPIO_OUTLO  //SlowBlank aus (TV-Mode)
+#define SB_ON	SAA7146_GPIO_INPUT  //SlowBlank an  (AV-Mode)
+#define SB_WIDE SAA7146_GPIO_OUTHI  //SlowBlank 6V  (16/9-Mode) nicht realisiert
+
+#define FB_GPIO 1
+#define FB_OFF	SAA7146_GPIO_LO     //FastBlank aus (CVBS-Mode)
+#define FB_ON   SAA7146_GPIO_OUTHI  //FastBlank an  (RGB-Mode)
+#define FB_LOOP	SAA7146_GPIO_INPUT  //FastBlank der PC-Grafik durchschleifen
+
+typedef enum VIDEOOUTPUTMODE
+{
+        NO_OUT       = 0,		//disable analog Output
+	CVBS_RGB_OUT = 1,
+	CVBS_YC_OUT  = 2,
+	YC_OUT	     = 3
+} VIDEOOUTPUTMODE, *PVIDEOOUTPUTMODE;
+
+
+#define GPMQFull        0x0001                  //Main Message Queue Full
+#define GPMQOver        0x0002                  //Main Message Queue Overflow
+#define HPQFull         0x0004                  //High Priority Msg Queue Full
+#define HPQOver         0x0008
+#define OSDQFull        0x0010                  //OSD Queue Full
+#define OSDQOver        0x0020
+
+#define	SECTION_EIT	        0x01
+#define	SECTION_SINGLE	        0x00
+#define	SECTION_CYCLE		0x02
+#define	SECTION_CONTINUOS	0x04
+#define	SECTION_MODE		0x06
+#define SECTION_IPMPE		0x0C	// bis zu 4k gro_
+#define SECTION_HIGH_SPEED	0x1C	// vergrv_erter Puffer f|r High Speed Filter
+#define DATA_PIPING_FLAG	0x20	// f|r Data Piping Filter
+
+#define	PBUFSIZE_NONE 0x0000
+#define	PBUFSIZE_1P   0x0100
+#define	PBUFSIZE_2P   0x0200
+#define	PBUFSIZE_1K   0x0300
+#define	PBUFSIZE_2K   0x0400
+#define	PBUFSIZE_4K   0x0500
+#define	PBUFSIZE_8K   0x0600
+#define PBUFSIZE_16K  0x0700
+#define PBUFSIZE_32K  0x0800
+
+typedef enum {	
+        WCreate,
+	WDestroy,
+	WMoveD,
+	WMoveA,
+	WHide,
+	WTop,
+	DBox,
+	DLine,
+	DText,
+	Set_Font,
+	SetColor,
+	SetBlend,
+	SetWBlend,
+	SetCBlend,
+	SetNonBlend,
+	LoadBmp,
+	BlitBmp,
+	ReleaseBmp,
+	SetWTrans,
+	SetWNoTrans
+} OSDCOM;
+
+typedef enum { 
+	MultiPID,
+        VideoPID,
+	AudioPID,
+	InitFilt,
+	FiltError,
+	NewVersion,
+	CacheError,
+	AddPIDFilter,
+	DelPIDFilter,
+	Scan,
+	SetDescr,
+        SetIR
+} PIDCOM;
+			
+typedef enum {
+        SelAudChannels
+} MPEGCOM;
+
+typedef enum  { 
+        AudioDAC,
+	CabADAC,
+	ON22K,
+	OFF22K,
+	MainSwitch,
+	ADSwitch,
+	SendDiSEqC,
+	SetRegister
+} AUDCOM;
+
+typedef enum  {
+        AudioState,
+	AudioBuffState,
+	VideoState1,
+	VideoState2,
+	VideoState3,
+	CrashCounter,
+	ReqVersion,
+	ReqVCXO,
+	ReqRegister
+} REQCOM;
+
+typedef enum  {
+        SetVidMode,
+	SetTestMode,
+	LoadVidCode,
+	SetMonitorType,
+	SetPanScanType,
+	SetFreezeMode
+} ENC;
+
+typedef enum  { 
+        __Record,
+	__Stop,
+	__Play,
+	__Pause,
+	__Slow,
+	__FF_IP,
+	__Scan_I,
+	__Continue
+} REC_PLAY;
+
+typedef enum  { 
+        COMTYPE_NOCOM,
+	COMTYPE_PIDFILTER,
+	COMTYPE_MPEGDECODER,
+	COMTYPE_OSD,
+	COMTYPE_BMP,
+	COMTYPE_ENCODER,
+	COMTYPE_AUDIODAC,
+	COMTYPE_REQUEST,
+	COMTYPE_SYSTEM,
+	COMTYPE_REC_PLAY,
+	COMTYPE_COMMON_IF,
+	COMTYPE_PID_FILTER,
+        COMTYPE_PES,
+        COMTYPE_TS,
+	COMTYPE_VIDEO,
+	COMTYPE_AUDIO,
+	COMTYPE_CI_LL,
+} COMTYPE;
+
+typedef enum {
+	AV7110_VIDEO_FREEZE,
+	AV7110_VIDEO_CONTINUE
+} VIDEOCOM;
+
+typedef enum {
+	DVB_AUDIO_PAUSE,
+} AUDIOCOM;
+
+
+#define VID_NONE_PREF           0x00    /* No aspect ration processing preferred */
+#define VID_PAN_SCAN_PREF       0x01    /* Pan and Scan Display preferred */
+#define VID_VERT_COMP_PREF      0x02    /* Vertical compression display preferred */
+#define VID_VC_AND_PS_PREF      0x03    /* PanScan and vertical Compression if allowed */
+#define VID_CENTRE_CUT_PREF     0x05    /* PanScan with zero vector */
+
+#define DATA_NONE                0x00
+#define DATA_FSECTION            0x01
+#define DATA_IPMPE               0x02
+#define DATA_MPEG_RECORD         0x03
+#define DATA_DEBUG_MESSAGE       0x04
+#define DATA_COMMON_INTERFACE    0x05
+#define DATA_MPEG_PLAY           0x06
+#define DATA_BMP_LOAD            0x07
+#define DATA_IRCOMMAND           0x08
+#define DATA_PIPING              0x09
+#define DATA_STREAMING           0x0a
+#define DATA_CI_GET              0x0b
+#define DATA_CI_PUT              0x0c
+
+#define DATA_PES_RECORD          0x10
+#define DATA_PES_PLAY            0x11
+#define DATA_TS_RECORD           0x12
+#define DATA_TS_PLAY             0x13
+
+#define CI_CMD_ERROR             0x00
+#define CI_CMD_ACK               0x01
+#define CI_CMD_SYSTEM_READY      0x02
+#define CI_CMD_KEYPRESS          0x03
+#define CI_CMD_ON_TUNED          0x04
+#define CI_CMD_ON_SWITCH_PROGRAM 0x05
+#define CI_CMD_SECTION_ARRIVED   0x06
+#define CI_CMD_SECTION_TIMEOUT   0x07
+#define CI_CMD_TIME              0x08
+#define CI_CMD_ENTER_MENU        0x09
+#define CI_CMD_FAST_PSI          0x0a
+#define CI_CMD_GET_SLOT_INFO     0x0b
+
+#define CI_MSG_NONE              0x00
+#define CI_MSG_CI_INFO           0x01
+#define CI_MSG_MENU              0x02
+#define CI_MSG_LIST              0x03
+#define CI_MSG_TEXT              0x04
+#define CI_MSG_REQUEST_INPUT     0x05
+#define CI_MSG_INPUT_COMPLETE    0x06
+#define CI_MSG_LIST_MORE         0x07
+#define CI_MSG_MENU_MORE         0x08
+#define CI_MSG_CLOSE_MMI_IMM     0x09
+#define CI_MSG_SECTION_REQUEST   0x0a
+#define CI_MSG_CLOSE_FILTER      0x0b
+#define CI_PSI_COMPLETE          0x0c
+#define CI_MODULE_READY          0x0d
+#define CI_SWITCH_PRG_REPLY      0x0e
+#define CI_MSG_TEXT_MORE         0x0f
+
+#define CI_MSG_CA_PMT            0xe0
+#define CI_MSG_ERROR             0xf0
+
+
+#define PROG_STREAM_MAP  0xBC
+#define PRIVATE_STREAM1  0xBD
+#define PADDING_STREAM   0xBE
+#define PRIVATE_STREAM2  0xBF
+#define AUDIO_STREAM_S   0xC0
+#define AUDIO_STREAM_E   0xDF
+#define VIDEO_STREAM_S   0xE0
+#define VIDEO_STREAM_E   0xEF
+#define ECM_STREAM       0xF0
+#define EMM_STREAM       0xF1
+#define DSM_CC_STREAM    0xF2
+#define ISO13522_STREAM  0xF3
+#define PROG_STREAM_DIR  0xFF
+
+#define PTS_DTS_FLAGS    0xC0
+
+//pts_dts flags
+#define PTS_ONLY         0x80
+#define PTS_DTS          0xC0
+#define TS_SIZE          188
+#define TRANS_ERROR      0x80
+#define PAY_START        0x40
+#define TRANS_PRIO       0x20
+#define PID_MASK_HI      0x1F
+//flags
+#define TRANS_SCRMBL1    0x80
+#define TRANS_SCRMBL2    0x40
+#define ADAPT_FIELD      0x20
+#define PAYLOAD          0x10
+#define COUNT_MASK       0x0F
+
+// adaptation flags
+#define DISCON_IND       0x80
+#define RAND_ACC_IND     0x40
+#define ES_PRI_IND       0x20
+#define PCR_FLAG         0x10
+#define OPCR_FLAG        0x08
+#define SPLICE_FLAG      0x04
+#define TRANS_PRIV       0x02
+#define ADAP_EXT_FLAG    0x01
+
+// adaptation extension flags
+#define LTW_FLAG         0x80
+#define PIECE_RATE       0x40
+#define SEAM_SPLICE      0x20
+
+#define MAX_PLENGTH      0xFFFF
+#define MAX_VID_PES      0x1FFF
+
+typedef struct section_s {
+        int               id;
+        int               length;
+        int               found;
+        u8                payload[4096+3];
+} section_t;
+
+
+#define MY_STATE_PES_START     1
+#define MY_STATE_PES_STARTED   2
+#define MY_STATE_FULL          4
+
+#define MASKL   DMX_MAX_FILTER_SIZE
+#define MAXFILT 32
+
+struct dvb_filter {
+        int               state;
+        int               flags;
+        int               type;
+        u8                ts_state;
+
+        u16               pid;
+        u8                value[MASKL];
+        u8                mask[MASKL];
+};
+
+
+enum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM};
+
+typedef struct ps_packet_s{
+        u8                scr[6];
+        u8                mux_rate[3];
+        u8                stuff_length;
+        u8                data[20];
+        u8                sheader_llength[2];
+        int               sheader_length;
+        u8                rate_bound[3];
+        u8                audio_bound;
+        u8                video_bound;
+        u8                reserved;
+        int               npes;
+        int               mpeg;
+} ps_packet_t;
+
+typedef struct a2p_s{
+        int               type;
+        int               found;
+        int               length;
+        int               headr;
+        u8                cid;
+        u8                flags;
+        u8                abuf[MAX_PLENGTH];
+        int               alength;
+        u8                vbuf[MAX_PLENGTH];
+        int               vlength;
+        int               plength;
+        u8                last_av_pts[4];
+        u8                av_pts[4];
+        u8                scr[4];
+        u16               count0;
+        u16               count1;
+        u16               pidv;
+        u16               pida;
+        u16               countv;
+        u16               counta;
+        void             *dataA;
+        void             *dataV;
+        void              (*write_cb)(u8 const *buf, long int count,
+                                      void     *data);
+} a2p_t;
+
+
+typedef struct p2t_s {
+        u8                pes[TS_SIZE];
+        u8                counter;
+        long int          pos;
+        int               frags;
+        struct dvb_demux_feed *feed;
+} p2t_t;
+
+/* place to store all the necessary device information */
+typedef struct av7110_s {
+
+        /* devices */
+
+        struct dvb_device       dvb_dev;
+        dvb_net_t               dvb_net;
+	struct video_device	vd;
+
+        struct saa7146_dev	*dev;
+
+	struct dvb_i2c_bus	*i2c_bus;	
+	char			*card_name;
+
+	struct tasklet_struct   debi_tasklet;
+	struct tasklet_struct   gpio_tasklet;
+
+        int adac_type;         /* audio DAC type */
+#define DVB_ADAC_TI       0
+#define DVB_ADAC_CRYSTAL  1
+#define DVB_ADAC_NONE    -1
+
+
+        /* buffers */
+
+        void                   *iobuf;   /* memory for all buffers */
+        dvb_ringbuffer_t        avout;   /* buffer for video or A/V mux */
+#define AVOUTLEN (128*1024)
+        dvb_ringbuffer_t        aout;    /* buffer for audio */
+#define AOUTLEN (64*1024)
+        void                   *bmpbuf;
+#define BMPLEN (8*32768+1024)
+
+        /* bitmap buffers and states */
+
+        int                     bmpp;
+        int                     bmplen;
+        int                     bmp_win;
+        u16                     bmp_x, bmp_y;
+        int                     bmp_trans;
+        int                     bmp_state;
+#define BMP_NONE     0
+#define BMP_LOADING  1
+#define BMP_LOADINGS 2
+#define BMP_LOADED   3
+        WAIT_QUEUE              bmpq;
+
+
+        /* DEBI and polled command interface */
+
+        spinlock_t              debilock;
+        struct semaphore        dcomlock;
+        int                     debitype;
+        int                     debilen;
+        int                     debibuf;
+
+
+        /* Recording and playback flags */
+
+        int                     rec_mode;
+        int                     playing;
+#define RP_NONE  0
+#define RP_VIDEO 1
+#define RP_AUDIO 2
+#define RP_AV    3
+
+
+        /* OSD */
+
+        int                     osdwin;      /* currently active window */
+        u16                     osdbpp[8];
+
+
+        /* CA */
+
+        ca_slot_info_t          ci_slot[2];
+
+        int                     vidmode;
+        dmxdev_t                dmxdev;
+        struct dvb_demux             demux;
+        char                    demux_id[16];
+
+        dmx_frontend_t          hw_frontend;
+        dmx_frontend_t          mem_frontend;
+
+        int                     fe_synced; 
+        struct semaphore        pid_mutex;
+
+        int                     video_blank;
+        struct video_status     videostate;
+        int                     display_ar;
+        int                     trickmode;
+#define TRICK_NONE   0
+#define TRICK_FAST   1
+#define TRICK_SLOW   2
+#define TRICK_FREEZE 3
+        struct audio_status      audiostate;
+
+        struct dvb_demux_filter     *handle2filter[32];
+        p2t_t                   p2t_filter[MAXFILT];
+        dvb_filter_pes2ts_t     p2t[2];
+        struct ipack_s          ipack[2];
+        u8                     *kbuf[2];
+
+        int sinfo;
+        int feeding;
+
+        int arm_errors;
+        int registered;
+
+
+	/* AV711X */
+
+        u32                 arm_fw;
+        u32                 arm_rtsl;
+        u32                 arm_vid;
+        u32                 arm_app;
+        u32                 avtype;
+        int                 arm_ready;
+        struct task_struct *arm_thread;
+        WAIT_QUEUE          arm_wait;
+        u16                 arm_loops;
+        int                 arm_rmmod;
+
+        void               *debi_virt;
+        dma_addr_t          debi_bus;
+
+        u16                 pids[DMX_PES_OTHER];
+        
+        dvb_ringbuffer_t    ci_rbuffer;
+        dvb_ringbuffer_t    ci_wbuffer;
+
+
+        struct dvb_adapter       *dvb_adapter;
+        struct dvb_device        *video_dev;
+        struct dvb_device        *audio_dev;
+        struct dvb_device        *ca_dev;
+        struct dvb_device        *osd_dev;
+
+        int                 dsp_dev;
+} av7110_t;
+
+
+#define	DPRAM_BASE 0x4000
+
+#define BOOT_STATE	(DPRAM_BASE + 0x3F8)
+#define BOOT_SIZE	(DPRAM_BASE + 0x3FA)
+#define BOOT_BASE	(DPRAM_BASE + 0x3FC)
+#define BOOT_BLOCK	(DPRAM_BASE + 0x400)
+#define BOOT_MAX_SIZE	0xc00
+
+#define IRQ_STATE	(DPRAM_BASE + 0x0F4)
+#define IRQ_STATE_EXT	(DPRAM_BASE + 0x0F6)
+#define MSGSTATE	(DPRAM_BASE + 0x0F8)
+#define FILT_STATE	(DPRAM_BASE + 0x0FA)
+#define COMMAND		(DPRAM_BASE + 0x0FC)
+#define COM_BUFF	(DPRAM_BASE + 0x100)
+#define COM_BUFF_SIZE	0x20
+
+#define BUFF1_BASE	(DPRAM_BASE + 0x120)
+#define BUFF1_SIZE	0xE0
+
+#define DATA_BUFF_BASE	(DPRAM_BASE + 0x200)
+#define DATA_BUFF_SIZE	0x1C00
+
+/* new buffers */
+
+#define DATA_BUFF0_BASE	(DPRAM_BASE + 0x200)
+#define DATA_BUFF0_SIZE	0x0800
+
+#define DATA_BUFF1_BASE	(DATA_BUFF0_BASE+DATA_BUFF0_SIZE)
+#define DATA_BUFF1_SIZE	0x0800
+
+#define DATA_BUFF2_BASE	(DATA_BUFF1_BASE+DATA_BUFF1_SIZE)
+#define DATA_BUFF2_SIZE	0x0800
+
+#define Reserved	(DPRAM_BASE + 0x1E00)
+#define Reserved_SIZE	0x1C0
+
+#define DEBUG_WINDOW	(DPRAM_BASE + 0x1FC0)
+#define	DBG_LOOP_CNT	(DEBUG_WINDOW + 0x00)
+#define DBG_SEC_CNT	(DEBUG_WINDOW + 0x02)
+#define DBG_AVRP_BUFF	(DEBUG_WINDOW + 0x04)
+#define DBG_AVRP_PEAK	(DEBUG_WINDOW + 0x06)
+#define DBG_MSG_CNT	(DEBUG_WINDOW + 0x08)
+#define DBG_CODE_REG	(DEBUG_WINDOW + 0x0a)
+#define DBG_TTX_Q	(DEBUG_WINDOW + 0x0c)
+#define DBG_AUD_EN	(DEBUG_WINDOW + 0x0e)
+#define DBG_WRONG_COM	(DEBUG_WINDOW + 0x10)
+#define DBG_ARR_OVFL	(DEBUG_WINDOW + 0x12)
+#define DBG_BUFF_OVFL	(DEBUG_WINDOW + 0x14)
+#define DBG_OVFL_CNT	(DEBUG_WINDOW + 0x16)
+#define DBG_SEC_OVFL	(DEBUG_WINDOW + 0x18)
+
+#define STATUS_BASE	(DPRAM_BASE + 0x1FC0)
+#define STATUS_SCR      (STATUS_BASE + 0x00)
+#define STATUS_MODES    (STATUS_BASE + 0x04)
+#define STATUS_LOOPS    (STATUS_BASE + 0x08)
+
+#define RX_TYPE         (DPRAM_BASE + 0x1FE8)
+#define RX_LEN          (DPRAM_BASE + 0x1FEA)
+#define TX_TYPE         (DPRAM_BASE + 0x1FEC)
+#define TX_LEN          (DPRAM_BASE + 0x1FEE)
+
+#define RX_BUFF         (DPRAM_BASE + 0x1FF4)
+#define TX_BUFF 	(DPRAM_BASE + 0x1FF6)
+
+#define HANDSHAKE_REG	(DPRAM_BASE + 0x1FF8)
+#define COM_IF_LOCK	(DPRAM_BASE + 0x1FFA)
+
+#define IRQ_RX		(DPRAM_BASE + 0x1FFC)
+#define IRQ_TX		(DPRAM_BASE + 0x1FFE)
+
+#define DRAM_START_CODE		0x2e000404
+#define DRAM_MAX_CODE_SIZE	0x00100000
+
+#define RESET_LINE		2
+#define DEBI_DONE_LINE		1
+#define ARM_IRQ_LINE		0
+
+#define DAC_CS	0x8000
+#define DAC_CDS	0x0000
+
+
+extern unsigned char *av7110_dpram_addr, *av7110_root_addr;
+extern int av7110_dpram_len, av7110_root_len;
+
+extern void av7110_register_irc_handler(void (*func)(u32));
+extern void av7110_unregister_irc_handler(void (*func)(u32)); 
+extern void av7110_setup_irc_config (av7110_t *av7110, u32 ir_config);
+
+extern int av7110_ir_init (void);
+extern void av7110_ir_exit (void);
+
+
+#endif /* _AV7110_H_ */
+
diff -Nru a/drivers/media/dvb/ttpci/av7110_firm.h b/drivers/media/dvb/ttpci/av7110_firm.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/av7110_firm.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,28080 @@
+
+#include <asm/types.h>
+
+u8 Dpram [] __initdata = {
+	0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e, 
+	0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04, 
+	0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00, 
+	0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04, 
+	0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0x55, 0x6c, 
+	0x2e, 0x01, 0xc3, 0xe0, 0xa5, 0xa5, 0x5a, 0x5a, 
+	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, 0xfc, 0x66, 0x00, 0x00, 0x14, 
+	0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, 
+	0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0x56, 0x74, 
+	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, 
+};
+
+
+u8 Root [] __initdata = {
+	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, 0xc0, 0xa8, 
+	0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x01, 0xc1, 0xa8, 
+	0x2e, 0x01, 0xc0, 0xf8, 0x2e, 0x01, 0xc2, 0xc8, 
+	0x2e, 0x01, 0xc1, 0x30, 0x2e, 0x01, 0xc2, 0xcc, 
+	0x2e, 0x01, 0xc1, 0x4c, 0x2e, 0x01, 0xc2, 0xd0, 
+	0x2e, 0x01, 0xc0, 0xf8, 0x2e, 0x01, 0xc2, 0xd4, 
+	0x2e, 0x01, 0xc1, 0x14, 0x2e, 0x01, 0xc2, 0xd8, 
+	0x2e, 0x01, 0xc1, 0x4c, 0x2e, 0x01, 0xc2, 0xdc, 
+	0x2e, 0x01, 0xc1, 0x30, 0x2e, 0x01, 0xc2, 0xe0, 
+	0x2e, 0x01, 0xc0, 0xa8, 0x2e, 0x01, 0xc2, 0xe4, 
+	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, 0x17, 0xff, 0xdc, 
+	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, 0x17, 0xff, 0xa5, 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, 0x17, 
+	0xff, 0x83, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48, 
+	0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfb, 0xe2, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x4f, 0x10, 
+	0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04, 
+	0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a, 
+	0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00, 
+	0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x14, 
+	0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07, 
+	0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a, 
+	0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x09, 0xb0, 0x01, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
+	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, 0xf8, 0x1c, 
+	0xb0, 0x03, 0x99, 0x01, 0x29, 0x00, 0xd0, 0x0a, 
+	0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07, 
+	0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, 0x68, 0x38, 
+	0xf0, 0x0a, 0xf8, 0x0e, 0xb0, 0x03, 0x99, 0x01, 
+	0x82, 0xb9, 0x4b, 0x6d, 0x42, 0x9c, 0xd0, 0x37, 
+	0xdc, 0x28, 0x2c, 0x00, 0xd0, 0x2e, 0x3b, 0x02, 
+	0x42, 0x9c, 0xd0, 0x29, 0x4b, 0x69, 0x42, 0x9c, 
+	0xd1, 0x00, 0x1c, 0x34, 0x22, 0x00, 0xb4, 0x04, 
+	0x23, 0x00, 0x49, 0x62, 0x20, 0x1c, 0xf0, 0x0a, 
+	0xf9, 0x95, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, 
+	0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44, 
+	0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x0a, 0xfc, 0xce, 
+	0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 
+	0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0a, 0xfb, 0x46, 
+	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, 0xf9, 0x5c, 0x23, 0x01, 0x02, 0x9b, 
+	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, 
+	0xf0, 0x0a, 0xfb, 0x18, 0x21, 0x00, 0x20, 0x1f, 
+	0xf0, 0x0b, 0xf8, 0x0a, 0x20, 0x01, 0xf0, 0x0d, 
+	0xfb, 0xf9, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x0d, 
+	0xfb, 0xf5, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, 
+	0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00, 
+	0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x0d, 0xfd, 0x4c, 
+	0x20, 0x1e, 0xf0, 0x0a, 0xfd, 0x49, 0x23, 0x03, 
+	0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 
+	0x20, 0x1e, 0xf0, 0x0a, 0xfa, 0xf7, 0x82, 0x3e, 
+	0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02, 
+	0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00, 
+	0x90, 0x00, 0xf0, 0x1b, 0xfd, 0xe7, 0x23, 0x01, 
+	0x04, 0x1b, 0x43, 0x18, 0xf0, 0x1b, 0xfd, 0xe6, 
+	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfa, 0x2a, 
+	0x20, 0xff, 0x49, 0x29, 0x68, 0x09, 0x70, 0x08, 
+	0x49, 0x28, 0x48, 0x29, 0x23, 0x1e, 0x22, 0x10, 
+	0xf0, 0x0e, 0xfb, 0x5e, 0x48, 0x27, 0x68, 0x00, 
+	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
+	0xf0, 0x1b, 0xfd, 0xcc, 0x4b, 0x24, 0x40, 0x18, 
+	0xf0, 0x1b, 0xfd, 0xcc, 0x22, 0x00, 0xb4, 0x04, 
+	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 
+	0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31, 
+	0xf0, 0x0a, 0xf8, 0xfc, 0x23, 0x01, 0x02, 0x9b, 
+	0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, 
+	0xf0, 0x0a, 0xfa, 0xb8, 0x21, 0x00, 0x20, 0x1e, 
+	0xf0, 0x0a, 0xff, 0xaa, 0x42, 0xac, 0xd0, 0x13, 
+	0x42, 0xb4, 0xd0, 0x11, 0x2c, 0x00, 0xd0, 0x0f, 
+	0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 
+	0x20, 0x1c, 0xf0, 0x0a, 0xfa, 0xa7, 0x22, 0x00, 
+	0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c, 
+	0x1c, 0x21, 0xf0, 0x0a, 0xf8, 0xdb, 0xb0, 0x01, 
+	0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 
+	0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc, 
+	0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x47, 0x68, 
+	0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x08, 0x5e, 0x60, 
+	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, 
+	0xfc, 0xa3, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x80, 
+	0xf0, 0x0d, 0xfc, 0x9e, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0xff, 0x30, 0x01, 0xf0, 0x0d, 0xfc, 0x98, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00, 
+	0x4c, 0x1b, 0x20, 0x01, 0x04, 0x80, 0x21, 0x00, 
+	0x22, 0x00, 0xc4, 0x86, 0xc4, 0x84, 0x3c, 0x14, 
+	0xf0, 0x05, 0xf9, 0x40, 0x61, 0x60, 0x28, 0x00, 
+	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, 0x78, 
+	0x2e, 0x08, 0x49, 0x00, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x49, 0x38, 0x2e, 0x08, 0x49, 0xf0, 
+	0x2e, 0x08, 0x4a, 0x70, 0xb4, 0xf0, 0xb0, 0x81, 
+	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, 0x78, 
+	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, 0x98, 0x88, 0xa0, 0x23, 0x06, 
+	0x40, 0x18, 0x28, 0x02, 0xd1, 0x09, 0x88, 0xe0, 
+	0x99, 0x00, 0x42, 0x88, 0xd1, 0x05, 0x1c, 0x28, 
+	0xf0, 0x05, 0xfb, 0x8c, 0x20, 0xff, 0xb0, 0x01, 
+	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, 0x80, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x3b, 0x78, 
+	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, 
+	0xfc, 0xb1, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x29, 
+	0x06, 0xed, 0x0e, 0xed, 0x1c, 0xe0, 0x08, 0x82, 
+	0x00, 0x92, 0x98, 0x00, 0x99, 0x01, 0x6a, 0xfb, 
+	0xf0, 0x17, 0xfc, 0x9e, 0x00, 0x68, 0x19, 0x40, 
+	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, 0x78, 0x2e, 0x08, 0x49, 0xf0, 
+	0x2e, 0x08, 0x4a, 0x70, 0x2e, 0x08, 0x47, 0x80, 
+	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, 
+	0xfc, 0x03, 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, 0xfb, 0x8e, 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, 
+	0xfb, 0x2b, 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, 0x7c, 
+	0x6a, 0xb8, 0xf0, 0x04, 0xfe, 0x79, 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, 0x09, 0xff, 0xb9, 0xb0, 0x02, 
+	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xc0, 
+	0x2e, 0x08, 0x03, 0xbc, 0x2e, 0x08, 0x44, 0x70, 
+	0x2e, 0x08, 0x00, 0x1c, 0x2c, 0x00, 0x02, 0x00, 
+	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x4f, 0x0b, 
+	0x68, 0x38, 0x28, 0x00, 0xd1, 0x0f, 0x20, 0x2f, 
+	0x02, 0x80, 0xf0, 0x04, 0xfe, 0x57, 0x60, 0x38, 
+	0x20, 0x00, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07, 
+	0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x20, 0x2f, 
+	0x02, 0x80, 0x49, 0x06, 0x60, 0x08, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x55, 0x30, 
+	0x2e, 0x02, 0x55, 0x38, 0x2e, 0x02, 0x55, 0x34, 
+	0x2e, 0x02, 0x55, 0x3c, 0x2e, 0x02, 0x55, 0x40, 
+	0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04, 
+	0xfe, 0x43, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x55, 0x30, 
+	0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x34, 0x8e, 0x90, 
+	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x48, 0x31, 0x68, 0x01, 
+	0x4e, 0x31, 0x68, 0x30, 0x1a, 0x09, 0xd1, 0x03, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x29, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, 
+	0x18, 0xc9, 0x23, 0x2f, 0x01, 0x1b, 0x42, 0x99, 
+	0xda, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x4a, 0x25, 0x8e, 0xd2, 0x2a, 0x00, 
+	0xd0, 0x07, 0x23, 0xeb, 0x01, 0x1b, 0x42, 0x99, 
+	0xda, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x1f, 0xcf, 0x3f, 0xff, 0x3f, 0x72, 
+	0x4b, 0x20, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
+	0x21, 0x2f, 0x02, 0x89, 0x1a, 0x0c, 0x4d, 0x1e, 
+	0x49, 0x1e, 0x91, 0x01, 0x42, 0xa7, 0xdd, 0x14, 
+	0x1b, 0x3a, 0x92, 0x00, 0x99, 0x01, 0x68, 0x09, 
+	0x18, 0x08, 0x1c, 0x22, 0x49, 0x1a, 0x6b, 0x2b, 
+	0xf0, 0x17, 0xfa, 0x3a, 0x4b, 0x18, 0x18, 0xe1, 
+	0x98, 0x01, 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x2b, 
+	0xf0, 0x17, 0xfa, 0x32, 0x9a, 0x00, 0x60, 0x32, 
+	0xe0, 0x0e, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, 
+	0x1c, 0x3a, 0x49, 0x11, 0x6b, 0x2b, 0xf0, 0x17, 
+	0xfa, 0x27, 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, 
+	0x02, 0x80, 0xf0, 0x17, 0xfa, 0x2b, 0x60, 0x31, 
+	0x20, 0x12, 0x4a, 0x05, 0x85, 0x10, 0x85, 0x57, 
+	0x20, 0x01, 0x02, 0x40, 0x86, 0x90, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x02, 0x55, 0x38, 
+	0x2e, 0x02, 0x55, 0x34, 0x00, 0x00, 0x0f, 0x6c, 
+	0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x02, 0x55, 0x30, 
+	0x2c, 0x00, 0x02, 0x00, 0x2a, 0x00, 0xd0, 0x05, 
+	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, 0xf9, 0xc6, 0xe0, 0x44, 0x2d, 0x00, 
+	0xdd, 0x42, 0x4b, 0x25, 0x93, 0x01, 0x99, 0x00, 
+	0x42, 0x8f, 0xd9, 0x07, 0x9b, 0x02, 0x68, 0x18, 
+	0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, 
+	0xb0, 0x03, 0xe7, 0xc4, 0x42, 0xa5, 0xdd, 0x07, 
+	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x22, 
+	0xf0, 0x17, 0xf9, 0xae, 0x68, 0x36, 0xe0, 0x05, 
+	0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, 
+	0xf0, 0x17, 0xf9, 0xa6, 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, 0x64, 0x2e, 0x08, 0x00, 0x58, 
+	0x2e, 0x08, 0x5d, 0xcc, 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, 0xcc, 
+	0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00, 
+	0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x78, 
+	0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x43, 0x78, 0x48, 0x01, 0x68, 0x80, 
+	0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x78, 
+	0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00, 
+	0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x78, 
+	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, 0x78, 0x2e, 0x08, 0x00, 0x60, 
+	0xb5, 0xb0, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x00, 
+	0x2f, 0x00, 0xdd, 0x09, 0x00, 0x85, 0x18, 0x2d, 
+	0x00, 0x6d, 0x20, 0x04, 0xf7, 0xff, 0xff, 0x44, 
+	0x19, 0x40, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf5, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x47, 0x70, 0xb5, 0xb0, 0x1c, 0x0c, 0x1c, 0x05, 
+	0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x1a, 0xff, 0xba, 
+	0x49, 0x25, 0x20, 0x0c, 0xf0, 0x1a, 0xff, 0x82, 
+	0xf0, 0x1a, 0xff, 0x78, 0x4b, 0x23, 0x40, 0x18, 
+	0xf0, 0x1a, 0xff, 0x78, 0xf0, 0x1a, 0xff, 0xe4, 
+	0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b, 
+	0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d, 
+	0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x0e, 
+	0xfd, 0x9b, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, 
+	0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c, 
+	0x27, 0x00, 0x4d, 0x18, 0xf0, 0x0e, 0xfd, 0xfc, 
+	0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf, 
+	0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x0e, 
+	0xfd, 0xfd, 0xf0, 0x0e, 0xfd, 0xf1, 0x28, 0x00, 
+	0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x0e, 
+	0xfd, 0x7f, 0xf0, 0x1a, 0xff, 0x83, 0x21, 0x00, 
+	0x20, 0x0c, 0xf0, 0x1a, 0xff, 0x4b, 0xf0, 0x1a, 
+	0xff, 0x41, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
+	0xf0, 0x1a, 0xff, 0x40, 0xf0, 0x1a, 0xff, 0xac, 
+	0x46, 0x68, 0xf0, 0x0e, 0xfd, 0xb9, 0x98, 0x04, 
+	0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x00, 0x14, 0x9d, 0xff, 0xff, 0xf7, 0xff, 
+	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, 
+	0xb5, 0xff, 0x9e, 0x09, 0x1c, 0x04, 0x1c, 0x0d, 
+	0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x1a, 0xff, 0x5e, 
+	0x49, 0x31, 0x20, 0x0c, 0xf0, 0x1a, 0xff, 0x26, 
+	0xf0, 0x1a, 0xff, 0x1c, 0x4b, 0x2f, 0x40, 0x18, 
+	0xf0, 0x1a, 0xff, 0x1c, 0xf0, 0x1a, 0xff, 0x88, 
+	0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e, 
+	0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10, 
+	0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x0e, 
+	0xfd, 0x3f, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08, 
+	0x72, 0x1f, 0x20, 0xff, 0xab, 0x09, 0x70, 0x58, 
+	0x1c, 0x60, 0x71, 0x18, 0x9b, 0x16, 0x93, 0x0b, 
+	0xab, 0x0c, 0x70, 0x1e, 0x20, 0xff, 0x70, 0x58, 
+	0x24, 0x00, 0x4d, 0x20, 0xf0, 0x0e, 0xfd, 0x98, 
+	0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac, 
+	0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, 
+	0xa9, 0x0a, 0xf0, 0x0e, 0xfd, 0x97, 0xe0, 0x03, 
+	0x20, 0x02, 0xa9, 0x07, 0xf0, 0x0e, 0xfd, 0x92, 
+	0xf0, 0x0e, 0xfd, 0x86, 0x28, 0x00, 0xd1, 0xfb, 
+	0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x0e, 
+	0xfd, 0x13, 0xf0, 0x1a, 0xff, 0x17, 0x21, 0x00, 
+	0x20, 0x0c, 0xf0, 0x1a, 0xfe, 0xdf, 0xf0, 0x1a, 
+	0xfe, 0xd5, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, 
+	0xf0, 0x1a, 0xfe, 0xd4, 0xf0, 0x1a, 0xff, 0x40, 
+	0x46, 0x68, 0xf0, 0x0e, 0xfd, 0x4d, 0x98, 0x01, 
+	0x0a, 0x80, 0xd2, 0x05, 0x20, 0x01, 0xb0, 0x13, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x1c, 0x38, 0xb0, 0x13, 0xe7, 0xf8, 0x00, 0x00, 
+	0x2e, 0x00, 0x14, 0x9d, 0xff, 0xff, 0xf7, 0xff, 
+	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, 0x90, 0x20, 0x00, 0x60, 0x38, 
+	0x69, 0xf8, 0x60, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, 
+	0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x43, 0x84, 
+	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, 0x2c, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x43, 0x84, 
+	0x2e, 0x00, 0x16, 0x59, 0xb5, 0x80, 0x04, 0x01, 
+	0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88, 
+	0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01, 
+	0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, 
+	0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2, 
+	0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04, 
+	0xfa, 0xf9, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42, 
+	0x18, 0x12, 0x00, 0x92, 0x4b, 0x04, 0x5a, 0x9a, 
+	0x81, 0x0a, 0xb0, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x88, 
+	0x2e, 0x08, 0x47, 0x80, 0xb5, 0xf0, 0xb0, 0xb3, 
+	0xa8, 0x01, 0xf0, 0x0f, 0xfa, 0x8f, 0x48, 0x51, 
+	0x68, 0x06, 0x68, 0x45, 0x68, 0x84, 0x68, 0xc7, 
+	0x69, 0x00, 0x90, 0x00, 0x1c, 0x30, 0x1c, 0x29, 
+	0x1c, 0x3a, 0xf0, 0x00, 0xfa, 0x9b, 0x1c, 0x20, 
+	0xf0, 0x00, 0xfb, 0xb6, 0xa0, 0x4a, 0x22, 0x00, 
+	0x21, 0x11, 0xf0, 0x04, 0xff, 0xc5, 0x22, 0x0a, 
+	0x21, 0x11, 0x98, 0x1b, 0xf0, 0x05, 0xf8, 0x22, 
+	0x22, 0x14, 0x21, 0x11, 0x1c, 0x30, 0xf0, 0x05, 
+	0xf8, 0x1d, 0x22, 0x1e, 0x21, 0x11, 0x1c, 0x28, 
+	0xf0, 0x05, 0xf8, 0x18, 0x22, 0x28, 0x21, 0x11, 
+	0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x13, 0x22, 0x32, 
+	0x21, 0x11, 0x1c, 0x38, 0xf0, 0x05, 0xf8, 0x0e, 
+	0x22, 0x3c, 0x21, 0x11, 0x98, 0x00, 0xf0, 0x05, 
+	0xf8, 0x09, 0xa0, 0x3b, 0x22, 0x00, 0x21, 0x13, 
+	0xf0, 0x04, 0xff, 0xa2, 0x22, 0x0a, 0x21, 0x13, 
+	0x4f, 0x39, 0x8d, 0x78, 0xf0, 0x04, 0xff, 0xfe, 
+	0xa0, 0x38, 0x22, 0x14, 0x21, 0x13, 0xf0, 0x04, 
+	0xff, 0x97, 0x22, 0x1e, 0x21, 0x13, 0x8d, 0xf8, 
+	0xf0, 0x04, 0xff, 0xf4, 0xa0, 0x35, 0x22, 0x00, 
+	0x21, 0x14, 0xf0, 0x04, 0xff, 0x8d, 0x22, 0x0a, 
+	0x21, 0x14, 0x8e, 0xb8, 0xf0, 0x04, 0xff, 0xea, 
+	0xa0, 0x32, 0x22, 0x14, 0x21, 0x14, 0xf0, 0x04, 
+	0xff, 0x83, 0x22, 0x1e, 0x21, 0x14, 0x8e, 0xf8, 
+	0xf0, 0x04, 0xff, 0xe0, 0xa0, 0x2f, 0x22, 0x28, 
+	0x21, 0x14, 0xf0, 0x04, 0xff, 0x79, 0x22, 0x32, 
+	0x21, 0x14, 0x48, 0x2f, 0x6f, 0xc0, 0xf0, 0x04, 
+	0xff, 0xd5, 0xa0, 0x2e, 0x22, 0x00, 0x21, 0x15, 
+	0xf0, 0x04, 0xff, 0x6e, 0x22, 0x0a, 0x21, 0x15, 
+	0x8d, 0x38, 0xf0, 0x04, 0xff, 0xcb, 0xa0, 0x2c, 
+	0x22, 0x14, 0x21, 0x15, 0xf0, 0x04, 0xff, 0x64, 
+	0x22, 0x1e, 0x21, 0x15, 0x8d, 0xb8, 0xf0, 0x04, 
+	0xff, 0xc1, 0xa0, 0x2a, 0x22, 0x00, 0x21, 0x10, 
+	0xf0, 0x04, 0xff, 0x5a, 0xf0, 0x0f, 0xfb, 0xd8, 
+	0x22, 0x0a, 0x21, 0x10, 0xf0, 0x04, 0xff, 0xb6, 
+	0xa0, 0x26, 0x22, 0x14, 0x21, 0x10, 0xf0, 0x04, 
+	0xff, 0x4f, 0x22, 0x1e, 0x21, 0x10, 0x27, 0x33, 
+	0x06, 0x7f, 0x6d, 0x78, 0xf0, 0x04, 0xff, 0xaa, 
+	0xa0, 0x22, 0x22, 0x28, 0x21, 0x10, 0xf0, 0x04, 
+	0xff, 0x43, 0xf0, 0x0f, 0xfb, 0xc1, 0x6d, 0x79, 
+	0x1a, 0x08, 0x22, 0x32, 0x21, 0x10, 0xf0, 0x04, 
+	0xff, 0x9d, 0xb0, 0x33, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x0c, 0x00, 
+	0x73, 0x74, 0x61, 0x74, 0x73, 0x3a, 0x00, 0x00, 
+	0x72, 0x78, 0x6c, 0x65, 0x6e, 0x3a, 0x00, 0x00, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x74, 0x78, 0x6c, 0x65, 
+	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, 0x00, 0x06, 0x00, 
+	0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, 0xf0, 0x09, 
+	0xfe, 0xa1, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
+	0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, 
+	0x4b, 0x04, 0x68, 0x1b, 0x06, 0x1b, 0x0e, 0x1b, 
+	0x2b, 0x30, 0xd3, 0x01, 0xf0, 0x09, 0xfe, 0x92, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc0, 
+	0xb5, 0xf0, 0x25, 0x00, 0x4e, 0x1a, 0x4c, 0x1b, 
+	0x4f, 0x1b, 0x68, 0x30, 0x68, 0x00, 0x00, 0x40, 
+	0x0a, 0x40, 0x02, 0x40, 0x21, 0x19, 0x06, 0x89, 
+	0x6a, 0x89, 0x4b, 0x18, 0x40, 0x19, 0x0a, 0x49, 
+	0x43, 0x08, 0x49, 0x17, 0x64, 0x08, 0xf0, 0x01, 
+	0xfc, 0x65, 0xf0, 0x02, 0xf9, 0x4d, 0x68, 0x38, 
+	0x30, 0x01, 0x60, 0x38, 0x48, 0x13, 0x88, 0x01, 
+	0x31, 0x01, 0x80, 0x01, 0x20, 0x0c, 0x68, 0x21, 
+	0xf0, 0x16, 0xfd, 0x6a, 0x29, 0x00, 0xd1, 0x01, 
+	0xf7, 0xff, 0xfe, 0xe0, 0x20, 0x32, 0x68, 0x21, 
+	0xf0, 0x16, 0xfd, 0x62, 0x4b, 0x0c, 0x42, 0x98, 
+	0xd9, 0x01, 0x49, 0x0c, 0x60, 0xf9, 0x42, 0x85, 
+	0xd0, 0xd3, 0x1c, 0x05, 0xf0, 0x00, 0xfe, 0x42, 
+	0x20, 0x00, 0x60, 0x38, 0xe7, 0xcd, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x05, 0xc0, 
+	0x2e, 0x08, 0x01, 0x88, 0x00, 0x03, 0xfe, 0x00, 
+	0x2c, 0x00, 0x1f, 0x80, 0x2c, 0x00, 0x1f, 0xc8, 
+	0x00, 0x00, 0x05, 0x46, 0x2e, 0x00, 0x19, 0xfb, 
+	0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x94, 0x46, 0x68, 
+	0x4c, 0x2f, 0xcc, 0x6e, 0xc0, 0x6e, 0xcc, 0x6e, 
+	0xc0, 0x6e, 0x23, 0x28, 0x22, 0x41, 0x00, 0xd2, 
+	0x21, 0x00, 0x20, 0x01, 0xf0, 0x07, 0xfe, 0xd8, 
+	0x22, 0xff, 0x21, 0x64, 0x20, 0x01, 0x32, 0xf5, 
+	0xf0, 0x07, 0xff, 0x9a, 0x20, 0x00, 0x46, 0x69, 
+	0x5c, 0x09, 0x40, 0x41, 0x23, 0x35, 0x40, 0x59, 
+	0xaa, 0x0a, 0x54, 0x11, 0x30, 0x01, 0x28, 0x25, 
+	0xdb, 0xf5, 0x24, 0x00, 0xa9, 0x0a, 0x54, 0x0c, 
+	0x22, 0x00, 0x20, 0x01, 0x1c, 0x23, 0xf0, 0x08, 
+	0xf9, 0xf8, 0x4e, 0x1e, 0x4d, 0x1e, 0x4c, 0x1f, 
+	0xf0, 0x03, 0xff, 0x66, 0xf0, 0x03, 0xff, 0x64, 
+	0x28, 0x28, 0xd9, 0x10, 0x42, 0xb0, 0xd3, 0x0e, 
+	0x69, 0xe9, 0x08, 0xc9, 0xd3, 0x0b, 0x4b, 0x1a, 
+	0x18, 0xc1, 0x20, 0x1e, 0xf0, 0x16, 0xfd, 0x08, 
+	0x21, 0x64, 0x1d, 0xc2, 0x32, 0xff, 0x32, 0xee, 
+	0x20, 0x01, 0xf0, 0x07, 0xff, 0x6d, 0xf0, 0x01, 
+	0xfb, 0xed, 0xf0, 0x02, 0xf8, 0xd5, 0xf0, 0x03, 
+	0xff, 0x4b, 0x1c, 0x01, 0x20, 0x7d, 0x00, 0xc0, 
+	0xf0, 0x16, 0xfc, 0xf6, 0x1c, 0x01, 0x48, 0x0f, 
+	0x88, 0x02, 0x32, 0x01, 0x80, 0x02, 0x42, 0xb9, 
+	0xd0, 0xd6, 0x2f, 0x04, 0xd3, 0x06, 0x20, 0x01, 
+	0xf0, 0x07, 0xfe, 0x76, 0xb0, 0x14, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0f, 0xf0, 0x00, 
+	0xfd, 0xcd, 0x20, 0x00, 0x60, 0x20, 0xe7, 0xc7, 
+	0x2e, 0x02, 0x56, 0xa0, 0x00, 0x00, 0x0b, 0xb8, 
+	0x72, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x01, 0x88, 
+	0xff, 0xff, 0xf4, 0x48, 0x2c, 0x00, 0x1f, 0xc8, 
+	0xb5, 0x80, 0x27, 0x00, 0x48, 0x09, 0x81, 0x07, 
+	0x48, 0x09, 0x49, 0x0a, 0x60, 0xc8, 0xf0, 0x03, 
+	0xfd, 0x45, 0xf7, 0xff, 0xff, 0x85, 0xf0, 0x00, 
+	0xf8, 0xd5, 0xf0, 0x05, 0xfb, 0x90, 0xf7, 0xff, 
+	0xff, 0x37, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
+	0x2e, 0x00, 0x19, 0xe9, 0x2e, 0x08, 0x01, 0x88, 
+	0x47, 0x70, 0xb5, 0xf0, 0x4d, 0x29, 0x68, 0x01, 
+	0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, 0x68, 0x41, 
+	0x10, 0x89, 0x68, 0x82, 0x10, 0x92, 0x00, 0x89, 
+	0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, 0x05, 0x89, 
+	0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, 0x49, 0x22, 
+	0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, 0x60, 0x0e, 
+	0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, 0xc8, 0x40, 
+	0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, 0xd3, 0xfa, 
+	0x23, 0x00, 0x49, 0x1c, 0x65, 0x8b, 0x20, 0x00, 
+	0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, 0x64, 0x8d, 
+	0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, 0x48, 0x18, 
+	0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, 0x60, 0x3b, 
+	0x22, 0x01, 0x64, 0xca, 0x21, 0x00, 0x4a, 0x15, 
+	0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, 0x33, 0x01, 
+	0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, 0x42, 0x91, 
+	0xdb, 0xf6, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, 
+	0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, 0x20, 0x33, 
+	0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, 0x65, 0x81, 
+	0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, 0x66, 0x41, 
+	0x21, 0x03, 0x67, 0x01, 0x21, 0x00, 0x20, 0x0d, 
+	0xf0, 0x0e, 0xfe, 0x88, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 
+	0x66, 0x00, 0x00, 0x70, 0x6a, 0x00, 0x00, 0x80, 
+	0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, 
+	0x6a, 0x00, 0x00, 0x10, 0xcc, 0x00, 0x0f, 0x84, 
+	0xcc, 0x00, 0x0f, 0x88, 0x98, 0x00, 0x0f, 0x88, 
+	0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, 
+	0xf0, 0x0f, 0xfa, 0xc2, 0x48, 0x08, 0x21, 0x40, 
+	0xf0, 0x0e, 0xff, 0x92, 0x20, 0x01, 0x21, 0x35, 
+	0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 
+	0x49, 0x04, 0x63, 0x08, 0x20, 0x00, 0x21, 0x39, 
+	0x06, 0x49, 0x62, 0xc8, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x01, 0xc5, 0x30, 0x72, 0x00, 0x01, 0x00, 
+	0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0f, 0xd0, 0x10, 
+	0x29, 0x01, 0xd0, 0x12, 0x29, 0x02, 0xd0, 0x14, 
+	0x29, 0x03, 0xd1, 0x01, 0x49, 0x0c, 0x60, 0x01, 
+	0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, 
+	0x21, 0x1e, 0xf0, 0x0f, 0xfb, 0x01, 0xbc, 0x08, 
+	0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01, 
+	0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01, 
+	0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01, 
+	0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, 
+	0x00, 0x08, 0x10, 0x08, 0xb5, 0x00, 0x1c, 0x01, 
+	0x48, 0x0b, 0xd0, 0x0e, 0x29, 0x01, 0xd0, 0x0f, 
+	0x29, 0x02, 0xd1, 0x01, 0x21, 0x04, 0x60, 0x41, 
+	0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, 
+	0x21, 0x1e, 0xf0, 0x0f, 0xfa, 0xdd, 0xbc, 0x08, 
+	0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3, 
+	0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00, 
+	0x2e, 0x08, 0x01, 0x98, 0xb5, 0x80, 0x4b, 0x09, 
+	0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x0f, 
+	0xfd, 0x11, 0x20, 0x0b, 0xf0, 0x0f, 0xfe, 0x33, 
+	0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03, 
+	0xff, 0x21, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc4, 
+	0x2e, 0x08, 0x01, 0xd4, 0xb5, 0xb0, 0x25, 0x00, 
+	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, 0xf9, 0x0a, 0x6a, 0xb8, 0x1c, 0x29, 
+	0xb0, 0x04, 0xf0, 0x0b, 0xfa, 0x59, 0xe0, 0x04, 
+	0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x0a, 
+	0xfc, 0x0f, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, 
+	0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x81, 0x4d, 0x56, 
+	0x1d, 0xee, 0x36, 0x19, 0x79, 0x30, 0x42, 0x87, 
+	0xd1, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x24, 0x00, 0x6c, 0x68, 0x28, 0x00, 
+	0xd0, 0x05, 0x64, 0x6c, 0x4a, 0x4f, 0x21, 0x00, 
+	0x6a, 0xa8, 0xf0, 0x0a, 0xfb, 0xf1, 0x71, 0x37, 
+	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0e, 0xfd, 0x82, 
+	0x20, 0x00, 0xf0, 0x0c, 0xf8, 0x83, 0x20, 0x1f, 
+	0xf0, 0x09, 0xf9, 0x18, 0x26, 0x03, 0x02, 0x76, 
+	0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, 
+	0x1c, 0x33, 0xf0, 0x08, 0xff, 0x8f, 0x20, 0x1e, 
+	0xf0, 0x09, 0xf9, 0xd6, 0x22, 0x01, 0x02, 0xd2, 
+	0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x08, 
+	0xff, 0x85, 0x26, 0x1c, 0x1c, 0x39, 0x48, 0x3e, 
+	0x27, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02, 
+	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
+	0x03, 0x12, 0x03, 0x21, 0x12, 0x30, 0x48, 0x39, 
+	0x21, 0x40, 0xf0, 0x0e, 0xfe, 0x81, 0xab, 0x00, 
+	0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9e, 
+	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0f, 
+	0xf9, 0xa3, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, 
+	0xf0, 0x0e, 0xfe, 0x72, 0xab, 0x00, 0x70, 0x1c, 
+	0x70, 0x5c, 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, 
+	0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, 0xf9, 0x94, 
+	0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x0e, 0xfe, 0x64, 
+	0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58, 
+	0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 
+	0x20, 0x08, 0xf0, 0x0f, 0xf9, 0x85, 0xe0, 0x0d, 
+	0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x0e, 0xfe, 0x54, 
+	0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9f, 
+	0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, 
+	0xf0, 0x0f, 0xf9, 0x76, 0x20, 0x01, 0x21, 0x35, 
+	0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 
+	0x49, 0x19, 0x63, 0x08, 0x20, 0x39, 0x06, 0x40, 
+	0x62, 0xc4, 0xcd, 0x03, 0x43, 0x08, 0x22, 0x00, 
+	0x21, 0x1e, 0xf0, 0x0f, 0xf9, 0xcd, 0x48, 0x15, 
+	0xf0, 0x0b, 0xff, 0x8e, 0x20, 0x00, 0xf0, 0x0b, 
+	0xff, 0xff, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, 
+	0x20, 0x00, 0xf0, 0x03, 0xfb, 0x15, 0x20, 0x01, 
+	0xf0, 0x0c, 0xf8, 0x04, 0x4a, 0x0e, 0xb4, 0x04, 
+	0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8, 
+	0xf7, 0xfe, 0xfb, 0x5a, 0x21, 0x00, 0x20, 0x0d, 
+	0xb0, 0x01, 0xf0, 0x0e, 0xfc, 0xf3, 0xb0, 0x01, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xd4, 
+	0x2e, 0x02, 0x0b, 0x9c, 0x2e, 0x01, 0xc5, 0x30, 
+	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, 0x0e, 0xff, 0xc0, 0x69, 0x61, 0x1c, 0x28, 
+	0xb0, 0x01, 0xf0, 0x10, 0xf8, 0x67, 0x62, 0x27, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, 
+	0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a, 
+	0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48, 
+	0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00, 
+	0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff, 
+	0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a, 
+	0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xe0, 
+	0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x0b, 
+	0xd0, 0x02, 0x20, 0x00, 0x73, 0x38, 0xe0, 0x01, 
+	0x20, 0x01, 0x73, 0x38, 0x22, 0x01, 0xb4, 0x04, 
+	0x7a, 0x3b, 0x7c, 0x3a, 0x7b, 0x39, 0x20, 0x00, 
+	0xf0, 0x0e, 0xff, 0x88, 0x69, 0x79, 0xb0, 0x01, 
+	0x48, 0x03, 0xf0, 0x10, 0xf8, 0x2f, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x98, 
+	0x2e, 0x08, 0x01, 0xb0, 0xb5, 0x80, 0x06, 0x00, 
+	0x0e, 0x00, 0x1c, 0x01, 0x4f, 0x08, 0x74, 0x39, 
+	0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7b, 0x39, 
+	0x1c, 0x02, 0x20, 0x00, 0xf0, 0x0e, 0xff, 0x6e, 
+	0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x10, 
+	0xf8, 0x15, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, 
+	0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01, 
+	0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09, 
+	0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39, 
+	0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20, 
+	0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x43, 0x90, 
+	0x2e, 0x08, 0x44, 0x10, 0x2e, 0x08, 0x44, 0x50, 
+	0x2e, 0x08, 0x44, 0x30, 0x06, 0x00, 0x0e, 0x00, 
+	0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05, 
+	0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00, 
+	0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03, 
+	0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe8, 
+	0x2e, 0x08, 0x43, 0x90, 0x2e, 0x08, 0x44, 0x10, 
+	0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38, 
+	0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x23, 
+	0xf8, 0x5d, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, 
+	0x31, 0x05, 0x20, 0x00, 0xf0, 0x23, 0xf8, 0x56, 
+	0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09, 
+	0x20, 0x00, 0xf0, 0x23, 0xf8, 0x4f, 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, 
+	0xfc, 0x27, 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, 0x14, 0x2e, 0x08, 0x01, 0xe8, 
+	0x2e, 0x08, 0x44, 0x30, 0x2e, 0x08, 0x44, 0x50, 
+	0x2e, 0x08, 0x43, 0x90, 0x2e, 0x08, 0x44, 0x10, 
+	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, 
+	0xfb, 0xc3, 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, 0xe8, 0x2e, 0x08, 0x44, 0x30, 
+	0x2e, 0x08, 0x44, 0x50, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x43, 0x90, 0x2e, 0x08, 0x44, 0x10, 
+	0xb4, 0xf0, 0x06, 0x02, 0x0e, 0x12, 0xb0, 0x82, 
+	0x92, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa0, 
+	0xb0, 0x81, 0x49, 0x31, 0x58, 0x09, 0x91, 0x00, 
+	0x29, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, 
+	0xbc, 0xf0, 0x47, 0x70, 0x49, 0x2d, 0x68, 0x09, 
+	0x18, 0x47, 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 
+	0x4a, 0x2b, 0x68, 0x12, 0x18, 0x89, 0x9a, 0x01, 
+	0x4d, 0x2a, 0x4b, 0x2b, 0x93, 0x02, 0x2a, 0x01, 
+	0xd0, 0x28, 0x2a, 0x02, 0xd1, 0x44, 0x4b, 0x29, 
+	0x58, 0x1a, 0x2a, 0x00, 0xd1, 0x03, 0x20, 0xff, 
+	0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4a, 
+	0x22, 0x00, 0x50, 0x1a, 0x5c, 0xa8, 0x42, 0xa0, 
+	0xd1, 0x06, 0x00, 0x90, 0x9b, 0x02, 0x58, 0x18, 
+	0x78, 0x46, 0x23, 0x80, 0x43, 0x9e, 0x70, 0x46, 
+	0x1c, 0x50, 0x06, 0x02, 0x0e, 0x12, 0x2a, 0x20, 
+	0xdb, 0xf0, 0x88, 0x08, 0x4b, 0x1c, 0x40, 0x18, 
+	0x80, 0x08, 0x98, 0x00, 0x9a, 0x01, 0x70, 0xc2, 
+	0x68, 0x38, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
+	0x60, 0x38, 0xe0, 0x19, 0x68, 0x38, 0x4b, 0x17, 
+	0x40, 0x18, 0x60, 0x38, 0x98, 0x00, 0x9a, 0x01, 
+	0x70, 0xc2, 0x20, 0x00, 0x60, 0x88, 0x70, 0xc8, 
+	0x60, 0xc8, 0x5c, 0x29, 0x42, 0xa1, 0xd1, 0x06, 
+	0x00, 0x81, 0x9b, 0x02, 0x58, 0x59, 0x78, 0x4a, 
+	0x23, 0x80, 0x43, 0x1a, 0x70, 0x4a, 0x30, 0x01, 
+	0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf0, 
+	0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 
+	0x20, 0xbc, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 
+	0x2e, 0x08, 0x5e, 0x64, 0x2e, 0x08, 0x5d, 0xd4, 
+	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5f, 0xac, 
+	0x2e, 0x08, 0x5e, 0xec, 0x2e, 0x08, 0x43, 0x90, 
+	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, 0x64, 0x2e, 0x08, 0x5d, 0xcc, 
+	0x2e, 0x08, 0x43, 0x90, 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, 0xfb, 0xdc, 0x28, 0x00, 0xd1, 0x00, 
+	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x5d, 0xd8, 0x2e, 0x08, 0x5d, 0xd4, 
+	0x2e, 0x08, 0x5d, 0xcc, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x5d, 0xdc, 0x00, 0x00, 0x20, 0xa0, 
+	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, 
+	0xfb, 0xe6, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02, 
+	0x42, 0x88, 0xd0, 0x01, 0x2c, 0x00, 0xd0, 0x83, 
+	0x70, 0x3c, 0x98, 0x04, 0x99, 0x03, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, 
+	0x2e, 0x08, 0x60, 0x98, 0x9e, 0x00, 0x04, 0x90, 
+	0x2e, 0x08, 0x69, 0x98, 0x9e, 0x00, 0x04, 0x98, 
+	0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, 
+	0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xec, 
+	0x2e, 0x08, 0x5e, 0x64, 0xb5, 0x00, 0x20, 0xff, 
+	0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00, 
+	0xf0, 0x19, 0xfe, 0x3e, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x01, 0xe8, 0xb5, 0xf0, 0x06, 0x07, 
+	0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x20, 0x10, 
+	0x2f, 0x1f, 0xdc, 0x2c, 0x2c, 0x1f, 0xdc, 0x2a, 
+	0x1c, 0x39, 0x43, 0x21, 0x08, 0x49, 0xd2, 0x26, 
+	0x49, 0x14, 0x1c, 0x38, 0xf0, 0x19, 0xfe, 0x3a, 
+	0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30, 
+	0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x19, 
+	0xfe, 0x24, 0xf0, 0x19, 0xfe, 0x27, 0x43, 0xa8, 
+	0xf0, 0x19, 0xfe, 0x28, 0xf0, 0x19, 0xfe, 0x22, 
+	0x43, 0xa0, 0xf0, 0x19, 0xfe, 0x23, 0x1c, 0x38, 
+	0xf0, 0x0f, 0xfd, 0x28, 0x1c, 0x04, 0xd1, 0x07, 
+	0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a, 
+	0x1c, 0x33, 0xf0, 0x10, 0xfb, 0xd9, 0x1c, 0x04, 
+	0xf7, 0xff, 0xfc, 0x92, 0x1c, 0x20, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2c, 0xa3, 
+	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, 0x19, 
+	0xfd, 0x89, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, 
+	0x90, 0x00, 0xf0, 0x19, 0xfd, 0x83, 0x23, 0x01, 
+	0x05, 0x1b, 0x43, 0x18, 0xf0, 0x19, 0xfd, 0x82, 
+	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, 0xf8, 0x86, 0x1c, 0x06, 0xe0, 0x0d, 
+	0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01, 
+	0x20, 0xc8, 0xf0, 0x10, 0xf8, 0x7d, 0x1c, 0x06, 
+	0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x10, 
+	0xf8, 0x77, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, 
+	0xf9, 0x4d, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c, 
+	0x91, 0x08, 0x50, 0x88, 0x00, 0xa1, 0x91, 0x07, 
+	0x48, 0x4a, 0x90, 0x06, 0x58, 0x40, 0x28, 0x00, 
+	0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x3e, 
+	0x99, 0x07, 0x9a, 0x06, 0x50, 0x50, 0x98, 0x09, 
+	0x99, 0x08, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x04, 
+	0x98, 0x06, 0x99, 0x07, 0x58, 0x40, 0x28, 0x00, 
+	0xd1, 0x01, 0x27, 0x13, 0xe0, 0x64, 0x99, 0x07, 
+	0x4a, 0x3f, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x3a, 
+	0x9a, 0x01, 0xb4, 0x04, 0x23, 0x40, 0x1c, 0x31, 
+	0x1c, 0x22, 0xf0, 0x10, 0xf8, 0xd5, 0xb0, 0x01, 
+	0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b, 
+	0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20, 
+	0xf0, 0x08, 0xfa, 0x18, 0x22, 0x00, 0xb4, 0x04, 
+	0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20, 
+	0xf0, 0x08, 0xf8, 0x4c, 0xb0, 0x01, 0x1c, 0x07, 
+	0xd1, 0x04, 0x22, 0x01, 0x48, 0x2f, 0x55, 0x02, 
+	0x48, 0x2f, 0x55, 0x02, 0x2f, 0x00, 0xd1, 0x16, 
+	0x98, 0x16, 0x28, 0x00, 0xd0, 0x13, 0x21, 0x02, 
+	0x98, 0x16, 0xf0, 0x10, 0xf8, 0x25, 0x1c, 0x07, 
+	0x00, 0x80, 0xf0, 0x03, 0xf8, 0xfb, 0x99, 0x07, 
+	0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05, 
+	0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x10, 0xf8, 0x39, 
+	0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00, 
+	0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06, 
+	0x20, 0x5c, 0xf0, 0x03, 0xf8, 0xe7, 0x28, 0x00, 
+	0xd1, 0x02, 0x27, 0x13, 0xe0, 0x00, 0x20, 0x00, 
+	0x1c, 0x02, 0x98, 0x05, 0x99, 0x17, 0xb4, 0x07, 
+	0x1c, 0x2a, 0xb4, 0x04, 0x98, 0x0d, 0x99, 0x0c, 
+	0x58, 0x08, 0x99, 0x18, 0x9a, 0x08, 0x9b, 0x07, 
+	0xf0, 0x00, 0xf9, 0x1c, 0xb0, 0x04, 0x2f, 0x00, 
+	0xd1, 0x06, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08, 
+	0x1c, 0x21, 0xf0, 0x0c, 0xfa, 0xb9, 0x1c, 0x07, 
+	0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29, 
+	0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00, 
+	0xd0, 0x05, 0xf0, 0x19, 0xfc, 0xbb, 0x4b, 0x0c, 
+	0x40, 0x18, 0xf0, 0x19, 0xfc, 0xbb, 0x1c, 0x38, 
+	0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xf0, 
+	0x2e, 0x08, 0x01, 0xf4, 0x2e, 0x08, 0x02, 0x74, 
+	0x2e, 0x08, 0x5e, 0x64, 0x2e, 0x08, 0x44, 0x50, 
+	0x2e, 0x08, 0x44, 0x30, 0x2e, 0x08, 0x02, 0xf4, 
+	0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07, 
+	0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, 
+	0xf0, 0x19, 0xfc, 0x98, 0x0d, 0x40, 0xd2, 0x09, 
+	0x20, 0xff, 0x90, 0x00, 0xf0, 0x19, 0xfc, 0x92, 
+	0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x19, 
+	0xfc, 0x91, 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, 
+	0xfa, 0xd3, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, 
+	0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0x8c, 
+	0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01, 
+	0xf0, 0x03, 0xf8, 0x86, 0x59, 0xa8, 0xf0, 0x03, 
+	0xf8, 0x83, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, 
+	0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00, 
+	0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x0f, 0xfd, 0xf8, 
+	0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80, 
+	0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25, 
+	0xf0, 0x0f, 0xff, 0x93, 0x28, 0x00, 0xd0, 0x03, 
+	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x9b, 0x02, 
+	0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x07, 0xff, 0x7a, 
+	0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01, 
+	0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a, 
+	0x1c, 0x33, 0x48, 0x18, 0xf0, 0x0f, 0xff, 0xe4, 
+	0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6, 
+	0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff, 
+	0xfa, 0xc5, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, 
+	0xf8, 0x47, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, 
+	0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03, 
+	0xf8, 0x3f, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, 
+	0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00, 
+	0xd0, 0x05, 0xf0, 0x19, 0xfc, 0x0f, 0x4b, 0x0b, 
+	0x40, 0x18, 0xf0, 0x19, 0xfc, 0x0f, 0x1c, 0x20, 
+	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x01, 0xf4, 
+	0x2e, 0x08, 0x5e, 0x64, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x44, 0x50, 0x2e, 0x08, 0x44, 0x30, 
+	0x2e, 0x08, 0x02, 0x74, 0xff, 0xef, 0xff, 0xff, 
+	0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x80, 
+	0x1c, 0x0c, 0x1c, 0x17, 0xb0, 0xad, 0x49, 0x1c, 
+	0x58, 0x08, 0x90, 0x04, 0x78, 0x81, 0x23, 0x04, 
+	0x40, 0x19, 0x25, 0x00, 0x29, 0x00, 0xd0, 0x0b, 
+	0xa9, 0x25, 0xf0, 0x0c, 0xfe, 0x95, 0xab, 0x00, 
+	0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68, 
+	0x21, 0x00, 0xf0, 0x0c, 0xfe, 0xb4, 0xe0, 0x0c, 
+	0x78, 0x00, 0x0a, 0x00, 0xd3, 0x04, 0x20, 0x01, 
+	0x03, 0x00, 0xab, 0x00, 0x80, 0x58, 0xe0, 0x03, 
+	0x20, 0x01, 0x02, 0x80, 0xab, 0x00, 0x80, 0x58, 
+	0x20, 0x00, 0x28, 0x00, 0xd1, 0x0e, 0xa8, 0x00, 
+	0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xca, 
+	0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13, 
+	0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x0c, 
+	0xfe, 0x96, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, 
+	0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x01, 0xf4, 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, 0x0c, 
+	0xfd, 0x1b, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, 
+	0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06, 
+	0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x0d, 
+	0xf8, 0xe2, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08, 
+	0x69, 0x07, 0x78, 0xfe, 0xad, 0x07, 0x88, 0x6d, 
+	0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 0xa8, 0x07, 
+	0xa9, 0x01, 0xf0, 0x10, 0xfb, 0x31, 0x78, 0xb8, 
+	0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38, 
+	0xa9, 0x01, 0xf0, 0x10, 0xfb, 0x5e, 0xe0, 0x08, 
+	0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 
+	0xfb, 0x9b, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, 
+	0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, 
+	0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0x4a, 
+	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39, 
+	0xf0, 0x0c, 0xff, 0x54, 0x28, 0x00, 0xd1, 0x09, 
+	0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, 
+	0xfe, 0x99, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
+	0xfe, 0x8b, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x88, 
+	0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06, 
+	0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x0c, 
+	0xfd, 0xbd, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x5c, 
+	0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08, 
+	0xf0, 0x0c, 0xfc, 0xbe, 0x22, 0x05, 0x21, 0x16, 
+	0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x54, 0x2c, 0xb2, 
+	0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x0c, 
+	0xfc, 0x6d, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
+	0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06, 
+	0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x0d, 
+	0xf8, 0x7a, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08, 
+	0x69, 0x07, 0x78, 0xf8, 0x90, 0x07, 0xae, 0x08, 
+	0x88, 0x76, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 
+	0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 0xfa, 0xc8, 
+	0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 
+	0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 0xfa, 0xf5, 
+	0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 
+	0xf0, 0x10, 0xfb, 0x32, 0xe0, 0x02, 0x20, 0x40, 
+	0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 
+	0x09, 0xc0, 0xd3, 0x29, 0x78, 0xb8, 0x09, 0x80, 
+	0xd3, 0x0f, 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 
+	0xfc, 0x8f, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, 
+	0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80, 
+	0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x96, 
+	0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfd, 0xce, 
+	0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39, 
+	0xf0, 0x0c, 0xfe, 0xd8, 0x28, 0x00, 0xd1, 0x09, 
+	0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd, 
+	0xfe, 0x1d, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, 
+	0xfe, 0x0f, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x0c, 
+	0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06, 
+	0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00, 
+	0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x0c, 0xfd, 0x3e, 
+	0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 
+	0xf0, 0x0c, 0xfc, 0x00, 0xf7, 0xff, 0xf9, 0x5c, 
+	0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88, 
+	0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 
+	0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89, 
+	0xf7, 0xff, 0xf9, 0xca, 0xb0, 0x2d, 0xbc, 0xf0, 
+	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, 0xfa, 0x6d, 
+	0xf0, 0x19, 0xfa, 0x70, 0x4b, 0x1b, 0x40, 0x18, 
+	0xf0, 0x19, 0xfa, 0x70, 0x49, 0x1a, 0x20, 0x0a, 
+	0xf0, 0x19, 0xfa, 0x70, 0x21, 0x00, 0x4f, 0x19, 
+	0x20, 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, 0xbc, 
+	0x2e, 0x08, 0x49, 0xb8, 0x2e, 0x08, 0x49, 0x78, 
+	0x2e, 0x08, 0x45, 0xf0, 0xff, 0xff, 0xfb, 0xff, 
+	0x2e, 0x00, 0x30, 0xdd, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x44, 0x70, 0xb5, 0xf0, 0x06, 0x00, 
+	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, 
+	0xfd, 0xf9, 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, 0xbd, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, 
+	0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02, 
+	0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xd4, 
+	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, 0xfa, 0x56, 0x1d, 0xfc, 0x34, 0x19, 
+	0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01, 
+	0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x07, 
+	0xfe, 0x89, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, 
+	0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x07, 
+	0xfc, 0xbd, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, 
+	0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, 
+	0x6a, 0xbb, 0xf0, 0x07, 0xff, 0x05, 0x1c, 0x30, 
+	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x44, 0x70, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x49, 0x78, 0x2e, 0x08, 0x45, 0xf0, 
+	0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x08, 
+	0xfc, 0x99, 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, 0x70, 0x2e, 0x08, 0x45, 0xf0, 
+	0x2e, 0x08, 0x03, 0xbc, 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, 0x07, 0xfe, 0xd1, 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, 0xfc, 0xf5, 0x6a, 0xb8, 
+	0xf0, 0x02, 0xfc, 0xf2, 0x4f, 0x12, 0x00, 0x68, 
+	0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12, 
+	0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11, 
+	0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x02, 0xff, 0xf0, 
+	0x20, 0x00, 0x00, 0x41, 0x18, 0x09, 0x01, 0x09, 
+	0x5a, 0x61, 0x42, 0xb9, 0xd1, 0x04, 0x30, 0x01, 
+	0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, 
+	0x28, 0x08, 0xd1, 0x03, 0x21, 0x00, 0x48, 0x08, 
+	0x71, 0x01, 0x70, 0x01, 0x20, 0x00, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x44, 0x70, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x38, 
+	0x2e, 0x08, 0x49, 0x00, 0x2e, 0x08, 0x49, 0x78, 
+	0x2e, 0x08, 0x03, 0xbc, 0xb5, 0x80, 0x1c, 0x07, 
+	0x30, 0x28, 0xf0, 0x02, 0xfc, 0x9b, 0x49, 0x07, 
+	0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0, 
+	0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f, 
+	0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, 
+	0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
+	0x30, 0x28, 0xf0, 0x02, 0xfc, 0x83, 0x49, 0x06, 
+	0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0, 
+	0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x03, 0xc4, 0xb4, 0x80, 0x04, 0x09, 
+	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, 0x70, 0xe0, 0x03, 0x48, 0x08, 
+	0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00, 
+	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9f, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 
+	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, 
+	0x2e, 0x08, 0x04, 0x04, 0xb5, 0xf0, 0x04, 0x04, 
+	0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, 
+	0x2d, 0x10, 0xdd, 0x03, 0x20, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0xf0, 0x19, 0xf8, 0x32, 
+	0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01, 
+	0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02, 
+	0x48, 0x1c, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46, 
+	0x4b, 0x1b, 0x42, 0xb5, 0xdd, 0x0a, 0x88, 0x19, 
+	0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01, 
+	0xf0, 0x19, 0xf8, 0x52, 0x20, 0x01, 0xbc, 0xf0, 
+	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, 
+	0xf8, 0x2b, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, 
+	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, 0xc4, 0x2c, 0x00, 0x00, 0xf8, 
+	0xb5, 0xb0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 
+	0x0c, 0x2d, 0x1c, 0x17, 0xf0, 0x18, 0xff, 0x9a, 
+	0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xff, 
+	0xff, 0xa9, 0x1c, 0x07, 0xf0, 0x18, 0xff, 0xc8, 
+	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, 0xc4, 0x2c, 0x00, 0x00, 0xf8, 
+	0xb5, 0x80, 0x48, 0x28, 0x88, 0x00, 0x06, 0x00, 
+	0x0e, 0x00, 0x4f, 0x27, 0x28, 0x01, 0xd0, 0x13, 
+	0x28, 0x02, 0xd0, 0x1a, 0x28, 0x03, 0xd1, 0x0c, 
+	0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xdb, 0x02, 
+	0x88, 0x41, 0x29, 0x0f, 0xdd, 0x2f, 0x88, 0x01, 
+	0x04, 0x09, 0x88, 0x40, 0x43, 0x08, 0xf0, 0x0a, 
+	0xfe, 0x43, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x68, 0x38, 0x88, 0x82, 0x88, 0x41, 0x88, 0x00, 
+	0xf0, 0x0d, 0xfd, 0x22, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09, 
+	0x88, 0xc2, 0x43, 0x11, 0x88, 0x02, 0x04, 0x12, 
+	0x88, 0x40, 0x43, 0x10, 0xf0, 0x0d, 0xf9, 0xc6, 
+	0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xd1, 0x08, 
+	0x88, 0x81, 0x04, 0x09, 0x88, 0xc0, 0x43, 0x08, 
+	0xf0, 0x0a, 0xfc, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x20, 0x01, 0xf0, 0x0a, 0xfc, 0xba, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x41, 
+	0x48, 0x08, 0x29, 0x0e, 0xd1, 0x02, 0x21, 0x00, 
+	0x60, 0x01, 0xe0, 0x01, 0x21, 0x01, 0x60, 0x01, 
+	0x68, 0x00, 0xf0, 0x00, 0xfb, 0xc3, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x00, 0xfc, 
+	0x2e, 0x08, 0x03, 0xc4, 0x2e, 0x08, 0x04, 0xfc, 
+	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, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x03, 0xf7, 0xfd, 0xff, 0xdd, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, 0xf7, 0xfd, 
+	0xff, 0xd7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x88, 0x00, 0x4b, 0x1e, 0x28, 0x00, 0xd0, 0x03, 
+	0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x88, 0x00, 0x4b, 0x19, 0x28, 0x00, 0xd0, 0x03, 
+	0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0xf0, 0x02, 0xfe, 0x50, 0x68, 0x39, 0x88, 0x4a, 
+	0x1d, 0x08, 0x88, 0x09, 0xf7, 0xfe, 0xf8, 0x4e, 
+	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, 0xc4, 0x6e, 0x00, 0x13, 0x00, 
+	0x6e, 0x00, 0x12, 0x00, 0xb5, 0x90, 0xb0, 0x84, 
+	0x48, 0x76, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
+	0x4c, 0x75, 0x4f, 0x76, 0x28, 0x0a, 0xd2, 0x60, 
+	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
+	0x04, 0x0e, 0x16, 0x39, 0x5d, 0x85, 0x8f, 0xbc, 
+	0xc4, 0xd2, 0xf0, 0x0a, 0xff, 0xfb, 0x90, 0x03, 
+	0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x03, 
+	0x68, 0x39, 0x80, 0x48, 0xe0, 0xcd, 0x20, 0x1e, 
+	0xa9, 0x03, 0xf0, 0x0a, 0xfe, 0xfd, 0x98, 0x03, 
+	0x68, 0x39, 0x80, 0x08, 0xe0, 0xc5, 0x1c, 0x20, 
+	0xf0, 0x0d, 0xfa, 0xf4, 0x20, 0x00, 0x00, 0x81, 
+	0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 0x52, 0x99, 
+	0x30, 0x01, 0x28, 0x04, 0xdd, 0xf7, 0x20, 0x07, 
+	0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 
+	0x18, 0xd2, 0x3a, 0x40, 0x87, 0x91, 0x30, 0x01, 
+	0x28, 0x0b, 0xdd, 0xf5, 0x20, 0x0d, 0x00, 0x81, 
+	0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 
+	0x3a, 0x40, 0x87, 0x51, 0x30, 0x01, 0x28, 0x12, 
+	0xdd, 0xf5, 0xe0, 0xa2, 0x20, 0x13, 0x00, 0x81, 
+	0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 
+	0x3a, 0x40, 0x83, 0x51, 0x30, 0x01, 0x28, 0x15, 
+	0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 0x19, 0x09, 
+	0x6d, 0x89, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 
+	0x80, 0xd1, 0x30, 0x01, 0x28, 0x0a, 0xdd, 0xf5, 
+	0x20, 0x00, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 
+	0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 
+	0x83, 0x91, 0x30, 0x01, 0x28, 0x01, 0xdd, 0xf4, 
+	0xe0, 0x7f, 0xe0, 0x79, 0x20, 0x02, 0x00, 0x81, 
+	0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 
+	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, 0x56, 0x22, 0x00, 0x21, 0x00, 
+	0x20, 0x01, 0x02, 0xc0, 0xf7, 0xff, 0xfe, 0x48, 
+	0x6f, 0xb8, 0x49, 0x2d, 0x80, 0x08, 0xe0, 0x4c, 
+	0x46, 0x68, 0xf0, 0x10, 0xf8, 0xdb, 0x98, 0x00, 
+	0x0c, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x00, 
+	0x68, 0x39, 0x80, 0x48, 0x98, 0x01, 0x0c, 0x00, 
+	0x68, 0x39, 0x80, 0x88, 0x98, 0x01, 0x68, 0x39, 
+	0x80, 0xc8, 0x98, 0x02, 0x0c, 0x00, 0x68, 0x39, 
+	0x81, 0x08, 0x98, 0x02, 0x68, 0x39, 0x81, 0x48, 
+	0x20, 0x00, 0x68, 0x39, 0x81, 0x88, 0x68, 0x38, 
+	0x89, 0x81, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x19, 
+	0x81, 0x81, 0x48, 0x1c, 0x68, 0x39, 0x81, 0xc8, 
+	0x48, 0x1b, 0x68, 0x01, 0x14, 0x09, 0x68, 0x3a, 
+	0x82, 0x11, 0x68, 0x00, 0x68, 0x39, 0x82, 0x48, 
+	0xe0, 0x1f, 0x20, 0x19, 0x06, 0x80, 0x6b, 0x80, 
+	0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, 0x80, 0x08, 
+	0xe0, 0x17, 0x68, 0x38, 0x88, 0x01, 0x04, 0x09, 
+	0x88, 0x40, 0x18, 0x08, 0x68, 0x00, 0x90, 0x03, 
+	0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x03, 
+	0x68, 0x39, 0x80, 0x48, 0xe0, 0x09, 0x48, 0x0d, 
+	0x68, 0x00, 0x68, 0x39, 0x80, 0x08, 0xe0, 0x04, 
+	0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 
+	0x86, 0x81, 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, 
+	0x2e, 0x08, 0x46, 0x70, 0x2e, 0x08, 0x03, 0xc4, 
+	0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x26, 0x10, 
+	0x2e, 0x08, 0x05, 0x78, 0x2e, 0x08, 0x00, 0x58, 
+	0xb5, 0xb0, 0x4f, 0x60, 0x25, 0x00, 0x24, 0x01, 
+	0x6f, 0xf8, 0x28, 0x00, 0xd0, 0x08, 0xf0, 0x06, 
+	0xfc, 0x1f, 0x28, 0x00, 0xd0, 0x00, 0x67, 0xfd, 
+	0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x6c, 0x38, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x28, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, 
+	0x6d, 0x39, 0x42, 0x81, 0xd1, 0x03, 0x1c, 0x28, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x81, 
+	0x06, 0x09, 0x0e, 0x09, 0x29, 0x12, 0xd2, 0x57, 
+	0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 
+	0x08, 0x0f, 0x19, 0x13, 0x1f, 0x4f, 0x23, 0x2e, 
+	0x39, 0x44, 0x54, 0x5e, 0x65, 0x6a, 0x6e, 0x72, 
+	0x79, 0x80, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, 
+	0x89, 0x00, 0xf0, 0x05, 0xff, 0x7d, 0xe0, 0x72, 
+	0x89, 0x00, 0xf0, 0x05, 0xff, 0x61, 0xe0, 0x6e, 
+	0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 
+	0xf8, 0x3b, 0xe0, 0x68, 0x89, 0x82, 0x89, 0x41, 
+	0x89, 0x00, 0xf0, 0x05, 0xff, 0xe3, 0xe0, 0x62, 
+	0x89, 0x00, 0xf0, 0x06, 0xf8, 0x79, 0xe0, 0x5e, 
+	0x8a, 0x42, 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, 
+	0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 
+	0xf8, 0xfd, 0xb0, 0x02, 0xe0, 0x53, 0x8a, 0x42, 
+	0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, 0x89, 0x82, 
+	0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 0xf9, 0x44, 
+	0xb0, 0x02, 0xe0, 0x48, 0x89, 0x83, 0x89, 0x42, 
+	0x89, 0x00, 0x49, 0x2f, 0xf0, 0x06, 0xfa, 0x85, 
+	0x21, 0x00, 0x48, 0x2d, 0xf7, 0xff, 0xfc, 0x6e, 
+	0xe0, 0x3d, 0x89, 0xc1, 0x04, 0x0b, 0x14, 0x1b, 
+	0x89, 0x81, 0x04, 0x0a, 0x14, 0x12, 0x89, 0x41, 
+	0x89, 0x00, 0xf0, 0x06, 0xfa, 0xa5, 0xe0, 0x32, 
+	0x89, 0x00, 0xf0, 0x06, 0xf8, 0x59, 0xe0, 0x2e, 
+	0xe0, 0x2d, 0x89, 0xc1, 0x04, 0x09, 0x8a, 0x02, 
+	0x18, 0x8b, 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 
+	0xf0, 0x06, 0xfa, 0xde, 0xe0, 0x23, 0x89, 0xc3, 
+	0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 
+	0xfb, 0x09, 0xe0, 0x1c, 0x89, 0x41, 0x89, 0x00, 
+	0xf0, 0x06, 0xf8, 0x7a, 0xe0, 0x17, 0x89, 0x00, 
+	0xf0, 0x06, 0xf8, 0x94, 0xe0, 0x13, 0x89, 0x00, 
+	0xf0, 0x06, 0xf8, 0xa4, 0xe0, 0x0f, 0x67, 0xfc, 
+	0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 
+	0xfb, 0xdd, 0xe0, 0x08, 0x89, 0xc3, 0x89, 0x82, 
+	0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 0xfc, 0x40, 
+	0xe0, 0x01, 0xf0, 0x06, 0xfc, 0xd7, 0x6d, 0x78, 
+	0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, 0x64, 0x38, 
+	0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x05, 
+	0x48, 0x08, 0x88, 0x01, 0x23, 0x10, 0x43, 0xdb, 
+	0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, 0x68, 0x00, 
+	0x65, 0x78, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, 
+	0x2c, 0x00, 0x01, 0x20, 0x2c, 0x00, 0x00, 0xf8, 
+	0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, 
+	0x0e, 0x09, 0x89, 0xd7, 0x23, 0xc7, 0x40, 0x7b, 
+	0x81, 0xd3, 0x4b, 0x06, 0x68, 0x1f, 0x37, 0x01, 
+	0x60, 0x1f, 0x2f, 0x28, 0xda, 0x03, 0x4b, 0x04, 
+	0x68, 0x1b, 0xf0, 0x14, 0xfd, 0x09, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, 
+	0x2e, 0x08, 0x01, 0x94, 0xb5, 0x90, 0x4f, 0x5c, 
+	0x6e, 0xf8, 0x6e, 0xb9, 0x42, 0x81, 0xd0, 0x5a, 
+	0x88, 0x81, 0x0a, 0x0a, 0x2a, 0x0a, 0xd2, 0x57, 
+	0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 
+	0x97, 0x04, 0x3d, 0x97, 0x97, 0x43, 0x97, 0x97, 
+	0x6a, 0x70, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, 
+	0x29, 0x0c, 0xd2, 0x49, 0xa3, 0x01, 0x5c, 0x5b, 
+	0x00, 0x5b, 0x44, 0x9f, 0x1d, 0x09, 0x13, 0x2a, 
+	0x89, 0x89, 0x89, 0x89, 0x89, 0x27, 0x89, 0x05, 
+	0x89, 0x00, 0xf0, 0x03, 0xf8, 0xb7, 0xe0, 0x7f, 
+	0x22, 0x00, 0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23, 
+	0x4a, 0x48, 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0x84, 
+	0xb0, 0x01, 0xe0, 0x75, 0x22, 0x00, 0xb4, 0x04, 
+	0x89, 0x02, 0x1c, 0x23, 0x49, 0x43, 0x1e, 0x48, 
+	0xf7, 0xfc, 0xfd, 0x7a, 0xb0, 0x01, 0xe0, 0x6b, 
+	0x8a, 0x02, 0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82, 
+	0x89, 0x41, 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0x70, 
+	0xb0, 0x01, 0xe0, 0x61, 0xf7, 0xfc, 0xfd, 0x40, 
+	0xe0, 0x5e, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 
+	0xfd, 0xd9, 0xe0, 0x59, 0x06, 0x09, 0xd1, 0x57, 
+	0x89, 0x00, 0xf7, 0xfc, 0xfe, 0xb7, 0xe0, 0x53, 
+	0x06, 0x09, 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x0b, 
+	0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 
+	0x02, 0x08, 0x0c, 0x10, 0x14, 0x18, 0x89, 0x00, 
+	0xf7, 0xfe, 0xf8, 0x9a, 0xe0, 0x44, 0xe0, 0x54, 
+	0xe0, 0x42, 0x89, 0x00, 0xf7, 0xfe, 0xf8, 0xba, 
+	0xe0, 0x3e, 0x89, 0x00, 0xf7, 0xfe, 0xf9, 0x48, 
+	0xe0, 0x3a, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x2c, 
+	0xe0, 0x36, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x5e, 
+	0xe0, 0x32, 0x89, 0x00, 0x06, 0x00, 0x0e, 0x00, 
+	0xf7, 0xfe, 0xfa, 0x3a, 0xe0, 0x2c, 0x06, 0x08, 
+	0xd1, 0x2a, 0x6f, 0xb8, 0x30, 0x01, 0x67, 0xb8, 
+	0xe0, 0x26, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, 
+	0xd2, 0x22, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x0c, 0x08, 0x0f, 
+	0x12, 0x16, 0x19, 0x1c, 0x89, 0x00, 0xf0, 0x01, 
+	0xf9, 0x83, 0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, 
+	0xf9, 0xab, 0xe0, 0x11, 0xf0, 0x01, 0xf9, 0xf6, 
+	0xe0, 0x0e, 0xf0, 0x01, 0xfa, 0x4d, 0xe0, 0x0b, 
+	0x89, 0x00, 0xf0, 0x01, 0xfa, 0xd1, 0xe0, 0x07, 
+	0xf0, 0x01, 0xfb, 0x0a, 0xe0, 0x04, 0xf0, 0x01, 
+	0xfb, 0x23, 0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x80, 
+	0x6e, 0xf8, 0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, 
+	0x65, 0xb8, 0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, 
+	0xdb, 0x04, 0x48, 0x07, 0x88, 0x01, 0x08, 0x49, 
+	0x00, 0x49, 0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, 
+	0x66, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x03, 0xc4, 0x00, 0x00, 0xff, 0xff, 
+	0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, 
+	0x0e, 0x00, 0x1c, 0x17, 0x28, 0x03, 0xd0, 0x0b, 
+	0x28, 0x07, 0xd0, 0x0e, 0x28, 0x08, 0xd1, 0x03, 
+	0x88, 0x38, 0xf0, 0x02, 0xfa, 0x43, 0x80, 0x78, 
+	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x4e, 
+	0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a, 
+	0xf0, 0x02, 0xf8, 0xb4, 0x49, 0x01, 0x68, 0x09, 
+	0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc4, 
+	0x48, 0x0d, 0x6f, 0xc0, 0x28, 0x00, 0xd1, 0x0c, 
+	0x49, 0x0c, 0x60, 0x48, 0x48, 0x0c, 0x8e, 0x83, 
+	0x49, 0x0c, 0x22, 0x01, 0x2b, 0x00, 0xd0, 0x05, 
+	0x8d, 0x03, 0x86, 0x8b, 0x8d, 0x43, 0x86, 0xcb, 
+	0x87, 0x82, 0x47, 0x70, 0x8e, 0xc3, 0x2b, 0x00, 
+	0xd0, 0xfb, 0x8d, 0x83, 0x86, 0x8b, 0x8d, 0xc3, 
+	0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x00, 0x00, 
+	0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x44, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, 
+	0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x7f, 0xf7, 0xfd, 
+	0xf8, 0x73, 0xf7, 0xfc, 0xff, 0x19, 0xf7, 0xfd, 
+	0xf9, 0x73, 0xf0, 0x03, 0xf8, 0x75, 0xf7, 0xff, 
+	0xff, 0xcf, 0x48, 0x10, 0x8e, 0x80, 0x28, 0x00, 
+	0xd1, 0x19, 0x48, 0x0f, 0x6f, 0xc0, 0x28, 0x00, 
+	0xd1, 0x0f, 0xb0, 0x82, 0x46, 0x69, 0xa8, 0x01, 
+	0xf0, 0x01, 0xfa, 0xcc, 0xa8, 0x01, 0x78, 0x00, 
+	0x28, 0x32, 0xda, 0x05, 0xa8, 0x00, 0x78, 0x00, 
+	0x28, 0x32, 0xda, 0x01, 0xf0, 0x03, 0xfa, 0x90, 
+	0xb0, 0x02, 0xf7, 0xff, 0xfd, 0xf1, 0x28, 0x00, 
+	0xd1, 0x01, 0xf7, 0xff, 0xfe, 0xcf, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
+	0x2c, 0x00, 0x1f, 0x80, 0xb4, 0x80, 0x02, 0x4f, 
+	0x4b, 0x07, 0x40, 0x3b, 0x43, 0x1a, 0x23, 0x19, 
+	0x06, 0x9b, 0x62, 0x9a, 0x0a, 0x49, 0x02, 0x49, 
+	0x08, 0x49, 0x07, 0xc0, 0x43, 0x08, 0x49, 0x03, 
+	0x68, 0x09, 0x60, 0x08, 0xbc, 0x80, 0x47, 0x70, 
+	0x00, 0x03, 0xfe, 0x00, 0x2e, 0x08, 0x5e, 0x40, 
+	0xb4, 0x90, 0x4b, 0x0c, 0x68, 0x1f, 0x68, 0x3f, 
+	0x0f, 0xff, 0x60, 0x07, 0x68, 0x18, 0x68, 0x00, 
+	0x00, 0x40, 0x0a, 0x47, 0x02, 0x7f, 0x20, 0x19, 
+	0x06, 0x80, 0x6a, 0x84, 0x4b, 0x06, 0x40, 0x23, 
+	0x0a, 0x5b, 0x43, 0x3b, 0x60, 0x0b, 0x6a, 0x80, 
+	0x05, 0xc0, 0x0d, 0xc0, 0x60, 0x10, 0xbc, 0x90, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x40, 
+	0x00, 0x03, 0xfe, 0x00, 0xb5, 0x00, 0x49, 0x1d, 
+	0x62, 0xc8, 0x28, 0x00, 0xd0, 0x11, 0x28, 0x01, 
+	0xd0, 0x1b, 0x28, 0x02, 0xd0, 0x25, 0x28, 0x03, 
+	0xd1, 0x09, 0x48, 0x19, 0x68, 0x01, 0x08, 0x49, 
+	0x00, 0x49, 0x60, 0x01, 0x22, 0x01, 0x21, 0x01, 
+	0x20, 0x00, 0xf0, 0x0a, 0xfe, 0x6f, 0xbc, 0x08, 
+	0x47, 0x18, 0x48, 0x13, 0x68, 0x01, 0x08, 0x49, 
+	0x00, 0x49, 0x60, 0x01, 0x48, 0x11, 0x68, 0x01, 
+	0x04, 0x03, 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 
+	0x47, 0x18, 0x48, 0x0d, 0x68, 0x01, 0x23, 0x01, 
+	0x43, 0x19, 0x60, 0x01, 0x48, 0x0b, 0x68, 0x01, 
+	0x4b, 0x0b, 0x40, 0x19, 0x60, 0x01, 0xbc, 0x08, 
+	0x47, 0x18, 0x48, 0x07, 0x68, 0x01, 0x08, 0x49, 
+	0x00, 0x49, 0x60, 0x01, 0x22, 0x00, 0x21, 0x00, 
+	0x20, 0x00, 0xf0, 0x0a, 0xfe, 0x4b, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xcc, 
+	0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, 
+	0xff, 0xdf, 0xff, 0xff, 0xb5, 0x90, 0x48, 0x11, 
+	0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x0f, 0x48, 0x10, 
+	0xd5, 0x01, 0x69, 0x01, 0x18, 0x7f, 0x69, 0x00, 
+	0x10, 0x80, 0x4c, 0x0e, 0x42, 0xb8, 0xda, 0x0b, 
+	0x68, 0xe0, 0x28, 0x00, 0xd1, 0x08, 0x48, 0x0c, 
+	0x68, 0x01, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 
+	0x60, 0x01, 0x20, 0x02, 0xf0, 0x0a, 0xf9, 0xec, 
+	0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, 0x61, 0xe0, 
+	0x6b, 0xa0, 0x30, 0x01, 0x63, 0xa0, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x66, 0x00, 0x00, 0x80, 
+	0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, 
+	0x6c, 0x00, 0x00, 0x20, 0xb5, 0x00, 0x20, 0x03, 
+	0xf0, 0x0a, 0xf9, 0xd6, 0x20, 0x1e, 0xf0, 0x07, 
+	0xf9, 0xd3, 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 
+	0x02, 0xd2, 0x21, 0x02, 0x20, 0x1e, 0xf0, 0x06, 
+	0xff, 0x81, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x02, 
+	0x22, 0x02, 0x49, 0x07, 0x20, 0x1e, 0xf0, 0x06, 
+	0xfd, 0xb5, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 
+	0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, 0xf0, 0x06, 
+	0xff, 0x71, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x00, 0x00, 0x1f, 0xff, 0xb5, 0x00, 0x21, 0x00, 
+	0x20, 0x0e, 0xf0, 0x0c, 0xfd, 0x4b, 0x20, 0x1f, 
+	0xf0, 0x07, 0xf8, 0xe4, 0x23, 0x03, 0x02, 0x5b, 
+	0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, 
+	0xf0, 0x06, 0xff, 0x5c, 0x20, 0x00, 0xf0, 0x0a, 
+	0xf8, 0x41, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x01, 
+	0x22, 0x02, 0x49, 0x07, 0x20, 0x1f, 0xf0, 0x06, 
+	0xfd, 0x8d, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 
+	0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, 0xf0, 0x06, 
+	0xff, 0x49, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x00, 0x00, 0x1f, 0xfe, 0xb5, 0x80, 0x20, 0x0f, 
+	0x02, 0x40, 0x4f, 0x0a, 0x61, 0x38, 0x49, 0x0a, 
+	0x6c, 0x89, 0x61, 0x79, 0xf0, 0x01, 0xfe, 0x3a, 
+	0x1d, 0xf9, 0x31, 0x79, 0x61, 0x08, 0x28, 0x00, 
+	0xd0, 0x05, 0x20, 0x00, 0x61, 0xf8, 0x62, 0x38, 
+	0x64, 0xf8, 0x20, 0xff, 0x72, 0x08, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, 
+	0x66, 0x00, 0x00, 0x80, 0xb5, 0x80, 0x4f, 0x05, 
+	0x69, 0x38, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, 
+	0xfe, 0x43, 0x20, 0x00, 0x61, 0x38, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0xcc, 
+	0xb5, 0x00, 0x4a, 0x0d, 0xb4, 0x04, 0x1f, 0x10, 
+	0x1e, 0x51, 0x1c, 0x13, 0xf7, 0xfc, 0xfb, 0x58, 
+	0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 
+	0x1a, 0x82, 0xb0, 0x01, 0x48, 0x07, 0x62, 0x42, 
+	0x6d, 0x49, 0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, 
+	0x21, 0x01, 0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, 
+	0x30, 0x60, 0x76, 0x01, 0xbc, 0x08, 0x47, 0x18, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x04, 0x4c, 
+	0xb5, 0x00, 0x4a, 0x10, 0xb4, 0x04, 0x1c, 0x13, 
+	0x3a, 0x01, 0x49, 0x0f, 0x1e, 0xc8, 0xf7, 0xfc, 
+	0xfb, 0x37, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, 
+	0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0b, 
+	0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1, 0x21, 0x00, 
+	0x65, 0x81, 0x21, 0x01, 0x02, 0xc9, 0x64, 0x41, 
+	0x21, 0x01, 0x30, 0x60, 0x76, 0x01, 0x48, 0x06, 
+	0x23, 0x02, 0x68, 0x01, 0x43, 0x19, 0x60, 0x01, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
+	0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x04, 0x4c, 
+	0x2e, 0x08, 0x00, 0x04, 0x48, 0x03, 0x23, 0x02, 
+	0x43, 0xdb, 0x68, 0x01, 0x40, 0x19, 0x60, 0x01, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x04, 
+	0xb5, 0xf0, 0x20, 0x0f, 0x02, 0x40, 0x4c, 0x11, 
+	0x61, 0x20, 0x20, 0x00, 0xf7, 0xfc, 0xfc, 0x4a, 
+	0x48, 0x0f, 0xf7, 0xfc, 0xfc, 0x47, 0x26, 0x00, 
+	0x1d, 0xe0, 0x30, 0x59, 0x77, 0x06, 0x25, 0xff, 
+	0x1d, 0xe7, 0x37, 0x79, 0x70, 0x3d, 0x20, 0x01, 
+	0x63, 0x78, 0x60, 0xe6, 0x69, 0x78, 0x28, 0x00, 
+	0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, 0xf0, 0x01, 
+	0xfd, 0xa9, 0x61, 0x78, 0x69, 0x78, 0x28, 0x00, 
+	0xd0, 0x01, 0x76, 0x3e, 0x70, 0x3d, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, 
+	0x00, 0x00, 0x1f, 0xff, 0xb5, 0x00, 0x20, 0x00, 
+	0xf7, 0xfd, 0xff, 0xde, 0x22, 0x00, 0xb4, 0x04, 
+	0x23, 0x00, 0x4a, 0x06, 0x21, 0x00, 0x20, 0x00, 
+	0xf7, 0xfc, 0xfa, 0xd6, 0x21, 0x00, 0x20, 0x0d, 
+	0xb0, 0x01, 0xf0, 0x0c, 0xfc, 0x6f, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 
+	0xb5, 0x80, 0x22, 0x00, 0xb4, 0x04, 0x27, 0x00, 
+	0x1c, 0x3b, 0x4a, 0x17, 0x21, 0x00, 0x20, 0x00, 
+	0xf7, 0xfc, 0xfa, 0xc2, 0x22, 0x00, 0xb0, 0x01, 
+	0xb4, 0x04, 0x1c, 0x3b, 0x4a, 0x12, 0x49, 0x13, 
+	0x20, 0x00, 0xf7, 0xfc, 0xfa, 0xb9, 0x21, 0x33, 
+	0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 
+	0xb0, 0x01, 0x48, 0x0f, 0x62, 0x42, 0x6d, 0x49, 
+	0x63, 0x01, 0x21, 0x01, 0x02, 0xc9, 0x64, 0x81, 
+	0x21, 0x01, 0x65, 0x87, 0x30, 0x60, 0x76, 0x01, 
+	0x77, 0x07, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 
+	0xf7, 0xff, 0xfe, 0x28, 0x20, 0x00, 0xf7, 0xff, 
+	0xfe, 0x59, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0c, 
+	0xfc, 0x39, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xfe, 
+	0x2e, 0x08, 0x04, 0x4c, 0xb5, 0xf0, 0x06, 0x05, 
+	0x0e, 0x2d, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x2f, 
+	0x26, 0x33, 0x06, 0x76, 0x61, 0x38, 0x6d, 0xb0, 
+	0x6d, 0x71, 0x1a, 0x40, 0x62, 0x78, 0x62, 0xb8, 
+	0x20, 0x00, 0x1d, 0xfc, 0x34, 0x79, 0x60, 0xe0, 
+	0x2d, 0x00, 0xd0, 0x02, 0x20, 0xff, 0xf7, 0xfd, 
+	0xff, 0x7b, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 
+	0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0x74, 
+	0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xb0, 0x01, 
+	0xf0, 0x0a, 0xfc, 0xac, 0x21, 0x00, 0x20, 0x00, 
+	0xf0, 0x0a, 0xfd, 0x6c, 0x22, 0x00, 0xb4, 0x04, 
+	0x23, 0x00, 0x4a, 0x1d, 0x20, 0x00, 0x1e, 0x51, 
+	0xf7, 0xfc, 0xfa, 0x62, 0x20, 0x01, 0x63, 0x60, 
+	0x69, 0x60, 0xb0, 0x01, 0x28, 0x00, 0xd1, 0x04, 
+	0x20, 0x41, 0x01, 0x40, 0xf0, 0x01, 0xfd, 0x12, 
+	0x61, 0x60, 0x69, 0x60, 0x28, 0x00, 0xd0, 0x03, 
+	0x20, 0x00, 0x76, 0x20, 0x20, 0xff, 0x70, 0x20, 
+	0x6d, 0x70, 0x63, 0x38, 0x20, 0x01, 0x02, 0xc0, 
+	0x64, 0xb8, 0x20, 0x00, 0x26, 0x01, 0x65, 0xb8, 
+	0x1d, 0xf9, 0x31, 0x59, 0x76, 0x0e, 0x22, 0x00, 
+	0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfd, 0xc6, 
+	0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0c, 0xfb, 0xda, 
+	0x20, 0x00, 0x60, 0xf8, 0x2d, 0x00, 0xd1, 0x02, 
+	0xf7, 0xff, 0xfd, 0xf0, 0x61, 0xe6, 0x20, 0x00, 
+	0x60, 0xb8, 0x66, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, 
+	0x00, 0x00, 0x1f, 0xff, 0xb5, 0xb0, 0x4f, 0x45, 
+	0x25, 0x00, 0x6d, 0x38, 0x4c, 0x44, 0x28, 0x05, 
+	0xd2, 0x14, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x10, 0x03, 0x2e, 0x65, 
+	0x73, 0x00, 0x4d, 0x40, 0x68, 0x28, 0x08, 0x41, 
+	0xd2, 0x08, 0x08, 0xc0, 0xd3, 0x09, 0xf7, 0xff, 
+	0xfe, 0xb3, 0x23, 0x04, 0x43, 0xdb, 0x68, 0x28, 
+	0x40, 0x18, 0x60, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x6d, 0x78, 0x28, 0x00, 0xd0, 0xf9, 
+	0x28, 0x01, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x06, 
+	0xf0, 0x00, 0xf8, 0x6c, 0x8e, 0xa0, 0x28, 0x00, 
+	0xd1, 0xf0, 0xf0, 0x00, 0xf9, 0x29, 0x6d, 0x78, 
+	0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0xe9, 
+	0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xe6, 0xf0, 0x00, 
+	0xfa, 0x4b, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x8e, 0xe0, 0x28, 0x00, 0xd1, 0xde, 0x8d, 0xa0, 
+	0x06, 0x00, 0x0e, 0x00, 0x28, 0x06, 0xd1, 0x15, 
+	0x48, 0x27, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x06, 
+	0x6d, 0x78, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x05, 
+	0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xc5, 0x6d, 0x78, 
+	0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 
+	0xf0, 0x00, 0xfc, 0x2e, 0x85, 0xa5, 0xbc, 0xb0, 
+	0xbc, 0x08, 0x47, 0x18, 0x8d, 0xa0, 0x28, 0x00, 
+	0xd1, 0xc0, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x08, 
+	0x28, 0x04, 0xd0, 0x0b, 0x28, 0x05, 0xd1, 0xb9, 
+	0xf0, 0x00, 0xfd, 0xdc, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0xf0, 0x00, 0xfd, 0xb1, 0xbc, 0xb0, 
+	0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 0xfd, 0x80, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 
+	0x28, 0x00, 0xd1, 0xa7, 0x20, 0x06, 0x85, 0xa0, 
+	0x85, 0xe5, 0x20, 0x09, 0x02, 0x40, 0x86, 0xe0, 
+	0x20, 0x04, 0x65, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0x99, 
+	0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x06, 
+	0xd1, 0x94, 0x85, 0xa5, 0x65, 0x3d, 0xbc, 0xb0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x04, 
+	0x2e, 0x08, 0x04, 0xcc, 0xb5, 0xb0, 0x48, 0x46, 
+	0x6c, 0xc1, 0x4c, 0x46, 0x64, 0x21, 0x69, 0x60, 
+	0x1a, 0x09, 0x1d, 0xe7, 0x37, 0x79, 0x63, 0xf9, 
+	0x29, 0x00, 0xda, 0x02, 0x69, 0x22, 0x18, 0x89, 
+	0x63, 0xf9, 0x23, 0xff, 0x6b, 0xf9, 0x33, 0x01, 
+	0x42, 0x99, 0xdb, 0x73, 0x22, 0x01, 0x03, 0x12, 
+	0x42, 0x91, 0xdd, 0x00, 0x63, 0xfa, 0x6b, 0xf9, 
+	0x08, 0x89, 0x00, 0x89, 0x63, 0xf9, 0x7a, 0x3a, 
+	0x2a, 0x00, 0xd0, 0x05, 0x23, 0xff, 0x03, 0x5b, 
+	0x1a, 0xc2, 0x61, 0xe2, 0x22, 0x00, 0x72, 0x3a, 
+	0x18, 0x42, 0x49, 0x35, 0x25, 0x12, 0x42, 0x8a, 
+	0xdd, 0x2c, 0x1a, 0x08, 0x64, 0x38, 0xf0, 0x18, 
+	0xf8, 0x1d, 0x4b, 0x32, 0x40, 0x18, 0xf0, 0x18, 
+	0xf8, 0x1d, 0x22, 0x00, 0x49, 0x30, 0xb4, 0x06, 
+	0x69, 0x60, 0x69, 0x39, 0x18, 0x41, 0x23, 0xff, 
+	0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, 
+	0x1a, 0xc0, 0x6c, 0x3a, 0x1c, 0x2b, 0xf0, 0x0e, 
+	0xfd, 0x47, 0x22, 0x00, 0xb0, 0x02, 0x49, 0x28, 
+	0xb4, 0x06, 0x6b, 0xf8, 0x6c, 0x39, 0x1a, 0x42, 
+	0x69, 0x39, 0x1c, 0x2b, 0x48, 0x25, 0xf0, 0x0e, 
+	0xfd, 0x3b, 0xb0, 0x02, 0xf0, 0x17, 0xff, 0xfa, 
+	0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, 
+	0xff, 0xf9, 0xe0, 0x1d, 0xf0, 0x17, 0xff, 0xf2, 
+	0x4b, 0x1c, 0x40, 0x18, 0xf0, 0x17, 0xff, 0xf2, 
+	0x22, 0x00, 0x49, 0x1b, 0xb4, 0x06, 0x69, 0x60, 
+	0x69, 0x39, 0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, 
+	0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 
+	0x6b, 0xfa, 0x1c, 0x2b, 0xf0, 0x0e, 0xfd, 0x1c, 
+	0xb0, 0x02, 0xf0, 0x17, 0xff, 0xdb, 0x23, 0x01, 
+	0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, 0xff, 0xda, 
+	0x69, 0x60, 0x6b, 0xf9, 0x18, 0x40, 0x23, 0x0d, 
+	0x06, 0x9b, 0x1a, 0xc1, 0x61, 0x60, 0x4b, 0x0e, 
+	0x42, 0x99, 0xd3, 0x02, 0x69, 0x21, 0x1a, 0x40, 
+	0x61, 0x60, 0x23, 0xff, 0x03, 0x5b, 0x69, 0x60, 
+	0x1a, 0xc0, 0xe0, 0x00, 0xe0, 0x00, 0x62, 0x20, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x4c, 
+	0x00, 0x1f, 0xfe, 0x00, 0xff, 0xfb, 0xff, 0xff, 
+	0x9e, 0x00, 0x08, 0x00, 0xcc, 0x1f, 0xe0, 0x00, 
+	0xcc, 0x1f, 0xfe, 0x00, 0x21, 0x00, 0x23, 0xff, 
+	0x68, 0x02, 0x33, 0xc1, 0x42, 0x9a, 0xd0, 0x01, 
+	0x1c, 0x08, 0x47, 0x70, 0x79, 0xc2, 0x0a, 0x12, 
+	0xd2, 0x01, 0x1c, 0x08, 0x47, 0x70, 0x7a, 0x41, 
+	0x23, 0x0e, 0x40, 0x19, 0x07, 0x49, 0x7a, 0x82, 
+	0x05, 0x92, 0x43, 0x11, 0x7a, 0xc2, 0x23, 0xfe, 
+	0x40, 0x1a, 0x03, 0x92, 0x43, 0x11, 0x7b, 0x02, 
+	0x01, 0xd2, 0x43, 0x11, 0x7b, 0x40, 0x40, 0x18, 
+	0x08, 0x40, 0x43, 0x08, 0x49, 0x01, 0x67, 0x08, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, 
+	0xb5, 0xf0, 0xb0, 0x86, 0x4c, 0x8c, 0x6c, 0xe0, 
+	0x1d, 0xe7, 0x37, 0x79, 0x1d, 0xfd, 0x35, 0x39, 
+	0x28, 0x00, 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x3a, 
+	0x28, 0x02, 0xd1, 0x73, 0xe0, 0x74, 0x69, 0xe0, 
+	0x6a, 0x21, 0x1a, 0x09, 0x63, 0xf9, 0x1c, 0x0a, 
+	0xd5, 0x02, 0x69, 0x21, 0x18, 0x51, 0x63, 0xf9, 
+	0x6b, 0xf9, 0x29, 0x04, 0xdb, 0x67, 0x69, 0x3e, 
+	0x5c, 0x31, 0x06, 0x0a, 0x65, 0x7a, 0x92, 0x05, 
+	0x1c, 0x41, 0x69, 0x20, 0x90, 0x04, 0xf0, 0x14, 
+	0xf8, 0x09, 0x61, 0xe1, 0x5c, 0x70, 0x04, 0x00, 
+	0x9a, 0x05, 0x18, 0x82, 0x65, 0x7a, 0x92, 0x03, 
+	0x98, 0x04, 0x31, 0x01, 0xf0, 0x13, 0xff, 0xfe, 
+	0x61, 0xe1, 0x5c, 0x70, 0x02, 0x00, 0x9a, 0x03, 
+	0x18, 0x80, 0x65, 0x78, 0x90, 0x02, 0x98, 0x04, 
+	0x31, 0x01, 0xf0, 0x13, 0xff, 0xf3, 0x61, 0xe1, 
+	0x5c, 0x70, 0x9a, 0x02, 0x18, 0x80, 0x65, 0x78, 
+	0x98, 0x04, 0x31, 0x01, 0xf0, 0x13, 0xff, 0xea, 
+	0x20, 0x01, 0x64, 0xe0, 0x61, 0xe1, 0x6a, 0x20, 
+	0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, 
+	0xd4, 0x05, 0x48, 0x67, 0x69, 0x06, 0x30, 0x80, 
+	0x69, 0x02, 0x92, 0x01, 0xe0, 0x03, 0x69, 0x20, 
+	0x18, 0x08, 0x63, 0xf8, 0xe7, 0xf5, 0x6b, 0xf8, 
+	0x90, 0x00, 0x28, 0x02, 0xdb, 0x22, 0x6d, 0x78, 
+	0x09, 0x01, 0x01, 0x09, 0x23, 0xff, 0x33, 0xc1, 
+	0x42, 0x99, 0xd1, 0x31, 0x9a, 0x01, 0x69, 0xe0, 
+	0x5c, 0x11, 0x02, 0x09, 0x83, 0x29, 0x1c, 0x41, 
+	0x1c, 0x30, 0xf0, 0x13, 0xff, 0xc3, 0x61, 0xe1, 
+	0x69, 0x38, 0x5c, 0x40, 0x8b, 0x2a, 0x18, 0x80, 
+	0x83, 0x28, 0x8b, 0x28, 0x30, 0x06, 0x83, 0x28, 
+	0x19, 0x88, 0x1f, 0x41, 0x1c, 0x30, 0xf0, 0x13, 
+	0xff, 0xb5, 0x61, 0xe1, 0x21, 0xff, 0x71, 0x39, 
+	0x20, 0x02, 0x64, 0xe0, 0x6c, 0xe0, 0x28, 0x02, 
+	0xd1, 0x00, 0xe0, 0x01, 0xe0, 0x94, 0xe0, 0x93, 
+	0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, 
+	0x1c, 0x01, 0xd5, 0x02, 0x69, 0x20, 0x18, 0x08, 
+	0x63, 0xf8, 0x79, 0x38, 0x28, 0x00, 0xd0, 0x13, 
+	0x20, 0x01, 0x02, 0xc0, 0x83, 0xa8, 0xe0, 0x11, 
+	0x02, 0x01, 0x65, 0x79, 0x9a, 0x01, 0x69, 0xe0, 
+	0x5c, 0x12, 0x18, 0x51, 0x65, 0x79, 0x1c, 0x41, 
+	0x1c, 0x30, 0xf0, 0x13, 0xff, 0x8f, 0x61, 0xe1, 
+	0x98, 0x00, 0x38, 0x01, 0x63, 0xf8, 0xe7, 0xb2, 
+	0x48, 0x3c, 0x83, 0xa8, 0x8b, 0x28, 0x6b, 0xf9, 
+	0x42, 0x88, 0xda, 0x01, 0x63, 0xf8, 0xe0, 0x02, 
+	0x8b, 0xa8, 0x42, 0x81, 0xdb, 0x68, 0x8b, 0xa8, 
+	0x6b, 0xf9, 0x42, 0x81, 0xdd, 0x00, 0x63, 0xf8, 
+	0x48, 0x35, 0x21, 0x00, 0x66, 0x78, 0x80, 0x01, 
+	0x30, 0x02, 0x21, 0xff, 0x31, 0xc1, 0x66, 0x78, 
+	0x80, 0x01, 0x48, 0x32, 0x66, 0x78, 0x79, 0x39, 
+	0x29, 0x00, 0xd0, 0x21, 0x21, 0x00, 0x71, 0x39, 
+	0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, 
+	0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x2a, 
+	0xf0, 0x00, 0xfe, 0xec, 0x6b, 0xf8, 0x38, 0x06, 
+	0x6e, 0x79, 0x80, 0x08, 0x31, 0x02, 0x66, 0x79, 
+	0xb0, 0x01, 0x48, 0x25, 0xf7, 0xff, 0xff, 0x02, 
+	0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, 
+	0x69, 0xe0, 0x6b, 0xf9, 0x18, 0x41, 0x69, 0x20, 
+	0xf0, 0x13, 0xff, 0x4c, 0x61, 0xe1, 0xe0, 0x26, 
+	0x6b, 0xf9, 0x31, 0x03, 0x80, 0x01, 0x48, 0x1e, 
+	0x21, 0x01, 0x03, 0xc9, 0x66, 0x78, 0x80, 0x01, 
+	0x30, 0x02, 0x21, 0xff, 0x66, 0x78, 0x80, 0x01, 
+	0x48, 0x1a, 0x66, 0x78, 0x69, 0x3b, 0x69, 0x20, 
+	0x18, 0x1a, 0xb4, 0x04, 0x69, 0xe0, 0x18, 0x18, 
+	0x6b, 0xfa, 0x49, 0x17, 0xf0, 0x00, 0xfe, 0xbe, 
+	0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, 
+	0x69, 0xe0, 0x6b, 0xfe, 0x19, 0x81, 0x69, 0x20, 
+	0xb0, 0x01, 0xf0, 0x13, 0xff, 0x27, 0x1d, 0xf0, 
+	0x30, 0x02, 0x61, 0xe1, 0x63, 0xf8, 0x8b, 0x28, 
+	0x28, 0x00, 0xd1, 0x01, 0x21, 0x00, 0x64, 0xe0, 
+	0x21, 0x10, 0x48, 0x0c, 0x85, 0x01, 0x6b, 0xf9, 
+	0x85, 0x41, 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, 
+	0xb0, 0x06, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x04, 0x4c, 0x00, 0x00, 0x07, 0xf7, 
+	0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x02, 0x04, 
+	0x2c, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x02, 0x0a, 
+	0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0, 
+	0xb5, 0xf0, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x40, 
+	0xb0, 0x81, 0x4f, 0x77, 0x63, 0xb8, 0x6a, 0xf9, 
+	0x1a, 0x40, 0x1d, 0xfc, 0x34, 0x79, 0x63, 0xe0, 
+	0x28, 0x00, 0xda, 0x02, 0x6a, 0x79, 0x18, 0x40, 
+	0x63, 0xe0, 0x6b, 0xe0, 0x4b, 0x71, 0x42, 0x98, 
+	0xdc, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x6d, 0xb9, 0x48, 0x6e, 0x1d, 0xc5, 
+	0x35, 0x59, 0x29, 0x00, 0xd1, 0x16, 0x7e, 0x01, 
+	0x29, 0x00, 0xd1, 0x13, 0x21, 0x01, 0x75, 0x01, 
+	0x21, 0x05, 0x84, 0x29, 0x23, 0x0d, 0x06, 0x9b, 
+	0x6c, 0x79, 0x1a, 0xca, 0x68, 0x52, 0x31, 0x08, 
+	0x23, 0x05, 0x02, 0x5b, 0x64, 0x79, 0x66, 0xba, 
+	0x42, 0x99, 0xdb, 0x06, 0x21, 0x01, 0x02, 0xc9, 
+	0x64, 0x79, 0xe0, 0x02, 0x21, 0x00, 0x75, 0x01, 
+	0x84, 0x29, 0x8c, 0x29, 0x1c, 0x4a, 0x6a, 0xfb, 
+	0x1a, 0x9a, 0x07, 0x92, 0x0f, 0x92, 0x18, 0x51, 
+	0x84, 0x29, 0x7e, 0x01, 0x29, 0x00, 0xd0, 0x03, 
+	0x21, 0x00, 0x66, 0x39, 0x66, 0x79, 0x76, 0x01, 
+	0x6c, 0x79, 0x4a, 0x58, 0x69, 0x52, 0x42, 0x91, 
+	0xd0, 0x26, 0x6e, 0x7a, 0x2a, 0x00, 0xd1, 0x10, 
+	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc9, 0x68, 0x09, 
+	0x66, 0x79, 0x1c, 0x0a, 0x6e, 0x3b, 0x18, 0x59, 
+	0x66, 0x39, 0x4b, 0x51, 0x42, 0x99, 0xdb, 0x04, 
+	0x32, 0x01, 0x31, 0x01, 0x40, 0x19, 0x66, 0x39, 
+	0x66, 0x7a, 0x6e, 0x79, 0x6d, 0xba, 0x1a, 0x89, 
+	0x65, 0x21, 0x91, 0x00, 0x8c, 0x2b, 0x4e, 0x4b, 
+	0x1a, 0xf3, 0x42, 0x8b, 0xd3, 0x04, 0x63, 0xe1, 
+	0x21, 0x00, 0x65, 0xb9, 0x66, 0x79, 0xe0, 0x0a, 
+	0x18, 0xd1, 0x63, 0xe3, 0x65, 0xb9, 0xe0, 0x06, 
+	0x8c, 0x29, 0x4a, 0x44, 0x1a, 0x51, 0x63, 0xe1, 
+	0x6d, 0xba, 0x18, 0x51, 0x65, 0xb9, 0x49, 0x42, 
+	0x66, 0x61, 0x8c, 0x2a, 0x6b, 0xe1, 0x18, 0x89, 
+	0x31, 0x03, 0x83, 0xa9, 0x22, 0x00, 0x6e, 0x61, 
+	0x80, 0x0a, 0x31, 0x02, 0x22, 0xff, 0x32, 0xe1, 
+	0x66, 0x61, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, 
+	0x8b, 0xaa, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, 
+	0x7d, 0x00, 0x28, 0x00, 0xd0, 0x1d, 0x4a, 0x37, 
+	0x80, 0x0a, 0x1c, 0x88, 0x66, 0x60, 0x8c, 0x29, 
+	0x02, 0x09, 0x6e, 0xba, 0x0f, 0x52, 0x23, 0x06, 
+	0x40, 0x1a, 0x43, 0x11, 0x23, 0x21, 0x43, 0x19, 
+	0x80, 0x01, 0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, 
+	0x0b, 0x89, 0x23, 0x01, 0x43, 0x19, 0x80, 0x01, 
+	0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, 0x00, 0x49, 
+	0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, 
+	0xe0, 0x0b, 0x20, 0x01, 0x03, 0xc0, 0x80, 0x08, 
+	0x31, 0x02, 0x66, 0x61, 0x8c, 0x28, 0x02, 0x00, 
+	0x23, 0xff, 0x43, 0x18, 0x80, 0x08, 0x31, 0x02, 
+	0x66, 0x61, 0x48, 0x23, 0x6e, 0x61, 0x80, 0x08, 
+	0x31, 0x02, 0x66, 0x61, 0x80, 0x08, 0x31, 0x02, 
+	0x22, 0x33, 0x06, 0x52, 0x66, 0x61, 0x00, 0x53, 
+	0x6d, 0x90, 0x18, 0xc2, 0xb4, 0x04, 0x08, 0x5a, 
+	0x6d, 0x50, 0x18, 0xc6, 0x8c, 0x28, 0x4b, 0x1b, 
+	0x18, 0xc1, 0x00, 0x53, 0x6a, 0xf8, 0x18, 0xc0, 
+	0x6b, 0xe2, 0x1c, 0x33, 0xf0, 0x00, 0xfd, 0xb6, 
+	0x6a, 0xf8, 0x6b, 0xe1, 0x18, 0x40, 0x22, 0x33, 
+	0x06, 0x52, 0x62, 0xf8, 0x6d, 0x92, 0xb0, 0x01, 
+	0x42, 0x90, 0xdb, 0x02, 0x6a, 0x79, 0x1a, 0x40, 
+	0x62, 0xf8, 0x21, 0xff, 0x31, 0x11, 0x48, 0x10, 
+	0x85, 0x01, 0x8b, 0xa9, 0x31, 0x06, 0x85, 0x41, 
+	0x21, 0x01, 0x02, 0x49, 0x86, 0x81, 0xb0, 0x01, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x04, 0x4c, 0x00, 0x00, 0x0f, 0xee, 
+	0x2e, 0x08, 0x04, 0xac, 0xcc, 0x00, 0x0f, 0x00, 
+	0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xf7, 
+	0x2c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x80, 
+	0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x02, 0x09, 
+	0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xb0, 0x1c, 0x07, 
+	0xb0, 0x83, 0x4d, 0x20, 0x6b, 0x28, 0xf7, 0xff, 
+	0xfa, 0x51, 0x48, 0x1f, 0x6c, 0xc1, 0x6c, 0x80, 
+	0x1a, 0x08, 0xd5, 0x03, 0x1f, 0xe9, 0x39, 0x79, 
+	0x69, 0x09, 0x18, 0x40, 0x6e, 0xa9, 0x29, 0x00, 
+	0xd0, 0x22, 0x29, 0x10, 0xd0, 0x20, 0x29, 0x20, 
+	0xd0, 0x24, 0x29, 0x30, 0xd1, 0x04, 0x24, 0x2d, 
+	0x43, 0x44, 0xd5, 0x00, 0x34, 0x3f, 0x11, 0xa4, 
+	0x46, 0x6a, 0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, 
+	0xfa, 0x17, 0x1b, 0x38, 0x99, 0x02, 0x1a, 0x08, 
+	0x22, 0x7d, 0x01, 0x52, 0x42, 0x90, 0xdc, 0x01, 
+	0x42, 0x90, 0xda, 0x05, 0x1a, 0x09, 0x91, 0x02, 
+	0x22, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xf9, 0xf2, 
+	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x01, 0x04, 0x1a, 0x24, 0xd5, 0x00, 0x34, 0x1f, 
+	0x11, 0x64, 0xe7, 0xe1, 0x21, 0x4b, 0x43, 0x41, 
+	0x20, 0x93, 0xf0, 0x13, 0xfd, 0xb7, 0x1c, 0x04, 
+	0xe7, 0xda, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xcc, 
+	0x66, 0x00, 0x00, 0x80, 0xb5, 0x90, 0x1c, 0x07, 
+	0xb0, 0x83, 0x4c, 0x18, 0x6f, 0x60, 0x30, 0x01, 
+	0x46, 0x6a, 0x67, 0x60, 0xa8, 0x01, 0xa9, 0x02, 
+	0xf7, 0xff, 0xf9, 0xe6, 0x4b, 0x14, 0x18, 0xf9, 
+	0x98, 0x02, 0x1a, 0x40, 0x4b, 0x13, 0x42, 0x98, 
+	0xdc, 0x04, 0x42, 0xd8, 0xdb, 0x02, 0x69, 0xe0, 
+	0x28, 0x01, 0xd1, 0x07, 0x91, 0x02, 0x20, 0x00, 
+	0x90, 0x01, 0x22, 0x00, 0xf7, 0xff, 0xf9, 0xbe, 
+	0x20, 0x01, 0x61, 0xe0, 0x69, 0xe0, 0x28, 0x00, 
+	0xd0, 0x0b, 0x6b, 0x20, 0xf7, 0xff, 0xf9, 0xea, 
+	0x6f, 0x60, 0x67, 0xa0, 0x48, 0x08, 0x60, 0x07, 
+	0x6f, 0xe0, 0x30, 0x01, 0x67, 0xe0, 0x20, 0x00, 
+	0x61, 0xe0, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xcc, 
+	0xff, 0xff, 0xec, 0x78, 0x00, 0x02, 0xbf, 0x20, 
+	0x2e, 0x08, 0x05, 0x4c, 0xb4, 0xf0, 0x1c, 0x1c, 
+	0x23, 0x00, 0x9f, 0x04, 0x60, 0x3b, 0x79, 0x85, 
+	0x23, 0xc0, 0x40, 0x1d, 0x4b, 0x33, 0x2d, 0x80, 
+	0xd1, 0x16, 0x25, 0x02, 0x60, 0x9d, 0x79, 0xc5, 
+	0x0a, 0x2b, 0xd3, 0x06, 0x7a, 0x45, 0x23, 0xe0, 
+	0x40, 0x2b, 0x2b, 0x20, 0xd1, 0x01, 0x23, 0x09, 
+	0x60, 0x3b, 0x7a, 0x03, 0x33, 0x09, 0x60, 0x13, 
+	0x79, 0x02, 0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, 
+	0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22, 0xe0, 0x25, 
+	0x25, 0x06, 0x26, 0x01, 0x60, 0x9e, 0x79, 0x83, 
+	0x2b, 0xff, 0xd1, 0x03, 0x35, 0x01, 0x5d, 0x43, 
+	0x2b, 0xff, 0xd0, 0xfb, 0x5d, 0x46, 0x23, 0xc0, 
+	0x40, 0x33, 0x2b, 0x40, 0xd1, 0x00, 0x35, 0x02, 
+	0x5d, 0x46, 0x09, 0x33, 0x07, 0x9b, 0xd0, 0x08, 
+	0x60, 0x3d, 0x5d, 0x46, 0x09, 0x73, 0xd3, 0x02, 
+	0x1d, 0xeb, 0x33, 0x03, 0xe0, 0x02, 0x1d, 0x6b, 
+	0xe0, 0x00, 0x1c, 0x6b, 0x60, 0x13, 0x79, 0x02, 
+	0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, 
+	0x1a, 0xd2, 0x60, 0x22, 0x68, 0x3a, 0x2a, 0x00, 
+	0xd0, 0x20, 0x5c, 0x82, 0x23, 0x0e, 0x40, 0x1a, 
+	0x07, 0x52, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, 
+	0x78, 0x5b, 0x05, 0x9b, 0x43, 0x1a, 0x60, 0x0a, 
+	0x68, 0x3b, 0x18, 0xc3, 0x78, 0x9c, 0x23, 0xfe, 
+	0x40, 0x23, 0x03, 0x9b, 0x43, 0x1a, 0x60, 0x0a, 
+	0x68, 0x3b, 0x18, 0xc3, 0x78, 0xdb, 0x01, 0xdb, 
+	0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc0, 
+	0x79, 0x00, 0x23, 0xfe, 0x40, 0x18, 0x08, 0x40, 
+	0x43, 0x10, 0x60, 0x08, 0x20, 0x00, 0xbc, 0xf0, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, 
+	0xb5, 0xb0, 0xb0, 0x83, 0x48, 0x3f, 0x49, 0x40, 
+	0x8d, 0xc9, 0x4c, 0x40, 0x63, 0xe1, 0x29, 0x06, 
+	0xda, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x68, 0x01, 0x09, 0x49, 0x01, 0x49, 
+	0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, 0xd0, 0x03, 
+	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, 
+	0x49, 0x35, 0xf7, 0xff, 0xff, 0x6f, 0xb0, 0x01, 
+	0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 
+	0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 0x99, 0x01, 
+	0x18, 0x40, 0x6b, 0xe1, 0x42, 0x88, 0xd0, 0x03, 
+	0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x98, 0x00, 0x4f, 0x2c, 0x28, 0x00, 0xd0, 0x25, 
+	0x6e, 0x38, 0x6d, 0xb9, 0x18, 0x40, 0x23, 0x01, 
+	0x06, 0x1b, 0x66, 0x38, 0x42, 0x98, 0xdb, 0x04, 
+	0x43, 0xdb, 0x18, 0xc0, 0x66, 0x38, 0x1e, 0x48, 
+	0x65, 0xb8, 0x23, 0x0d, 0x06, 0x9b, 0x6d, 0xb8, 
+	0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x08, 0x6e, 0xe0, 
+	0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x48, 0x20, 0x00, 
+	0x65, 0xb8, 0x6c, 0xb8, 0x30, 0x08, 0x23, 0x05, 
+	0x02, 0x5b, 0x64, 0xb8, 0x42, 0x98, 0xd1, 0x02, 
+	0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x6c, 0xb8, 
+	0x49, 0x19, 0x61, 0x48, 0x24, 0x33, 0x06, 0x64, 
+	0x00, 0x63, 0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, 
+	0x6d, 0x60, 0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, 
+	0x98, 0x03, 0x4b, 0x0e, 0x18, 0xc0, 0x9a, 0x02, 
+	0x1c, 0x2b, 0xf0, 0x00, 0xfc, 0x53, 0xb0, 0x01, 
+	0x6d, 0xb8, 0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, 
+	0x48, 0x0e, 0x68, 0x02, 0x18, 0x51, 0x60, 0x01, 
+	0x6e, 0x60, 0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, 
+	0x48, 0x0a, 0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, 
+	0x60, 0x01, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x04, 0xcc, 
+	0x2e, 0x08, 0x05, 0x38, 0x2e, 0x08, 0x04, 0x4c, 
+	0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x64, 
+	0xb5, 0xf0, 0xb0, 0x83, 0x4e, 0x65, 0x25, 0x00, 
+	0x4f, 0x65, 0x6a, 0xf8, 0xf7, 0xff, 0xf8, 0xca, 
+	0x48, 0x64, 0x8d, 0xc0, 0x63, 0xf8, 0x28, 0x0a, 
+	0xda, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x68, 0x34, 0x09, 0x60, 0x01, 0x40, 
+	0x23, 0xff, 0x33, 0xc1, 0x42, 0x98, 0xd0, 0x07, 
+	0x23, 0xff, 0x33, 0xbe, 0x42, 0x9c, 0xd0, 0x03, 
+	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, 
+	0x49, 0x57, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xd6, 
+	0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 
+	0x99, 0x01, 0x18, 0x41, 0x6b, 0xfa, 0x42, 0x91, 
+	0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x21, 0x01, 0x1c, 0x22, 0x4c, 0x4d, 
+	0x23, 0xff, 0x33, 0xbe, 0x42, 0x9a, 0xd1, 0x3c, 
+	0x5c, 0x30, 0x28, 0xa0, 0xd0, 0x03, 0xb0, 0x03, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe0, 
+	0x28, 0x00, 0xd1, 0x1b, 0x20, 0x02, 0x63, 0x78, 
+	0x60, 0xe1, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 
+	0xfa, 0x75, 0x20, 0x00, 0xf7, 0xfb, 0xfe, 0x0a, 
+	0x98, 0x02, 0x4b, 0x3c, 0x18, 0xc0, 0x79, 0x40, 
+	0x23, 0x30, 0x40, 0x18, 0x66, 0xb8, 0xd0, 0x16, 
+	0x28, 0x10, 0xd0, 0x14, 0x28, 0x20, 0xd0, 0x17, 
+	0x28, 0x30, 0xd1, 0x03, 0x21, 0x20, 0x20, 0x1e, 
+	0xf0, 0x09, 0xfd, 0x8f, 0x98, 0x00, 0x28, 0x00, 
+	0xd0, 0x2b, 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x28, 
+	0x68, 0xf8, 0x28, 0x00, 0xd1, 0x25, 0x6f, 0x38, 
+	0xf7, 0xff, 0xfe, 0x08, 0xe0, 0x21, 0x21, 0x02, 
+	0x20, 0x1e, 0xf0, 0x09, 0xfd, 0x7e, 0xe7, 0xed, 
+	0x21, 0x08, 0x20, 0x1e, 0xf0, 0x09, 0xfd, 0x79, 
+	0xe7, 0xe8, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x08, 
+	0x20, 0x00, 0x63, 0x79, 0x21, 0x00, 0x60, 0xe0, 
+	0xf0, 0x09, 0xfa, 0x40, 0x20, 0x02, 0xf0, 0x09, 
+	0xfa, 0x93, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x08, 
+	0x6d, 0x60, 0x28, 0x05, 0xd1, 0x05, 0x68, 0xf8, 
+	0x28, 0x00, 0xd1, 0x02, 0x6f, 0x38, 0xf7, 0xff, 
+	0xfe, 0x2d, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, 
+	0x98, 0x02, 0x1d, 0xc5, 0x6b, 0xf8, 0x1b, 0x42, 
+	0x63, 0xfa, 0x7e, 0x39, 0x69, 0x78, 0x18, 0x41, 
+	0x4b, 0x16, 0x18, 0xe8, 0xf7, 0xfb, 0xfb, 0xb0, 
+	0x7e, 0x38, 0x6b, 0xf9, 0x18, 0x40, 0x07, 0x81, 
+	0x0f, 0x89, 0x76, 0x39, 0x1a, 0x44, 0x20, 0x01, 
+	0x06, 0x00, 0x49, 0x15, 0x60, 0x08, 0xf0, 0x17, 
+	0xfb, 0x1d, 0x4b, 0x14, 0x40, 0x18, 0xf0, 0x17, 
+	0xfb, 0x1d, 0x22, 0x04, 0x49, 0x10, 0xb4, 0x06, 
+	0x23, 0x12, 0x21, 0x1e, 0x69, 0x78, 0x1c, 0x22, 
+	0xf0, 0x0e, 0xf8, 0x4e, 0xb0, 0x02, 0xf0, 0x17, 
+	0xfb, 0x0d, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 
+	0xf0, 0x17, 0xfb, 0x0c, 0x69, 0x78, 0x59, 0x01, 
+	0x60, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, 
+	0x2e, 0x08, 0x04, 0xcc, 0x2c, 0x00, 0x1f, 0xc0, 
+	0x2e, 0x08, 0x05, 0x3c, 0x2e, 0x08, 0x04, 0x4c, 
+	0x9e, 0x00, 0x08, 0x00, 0xff, 0xfb, 0xff, 0xff, 
+	0x20, 0x33, 0x06, 0x40, 0x6e, 0x81, 0x6e, 0x40, 
+	0x1a, 0x09, 0x48, 0x0f, 0x63, 0xc1, 0x29, 0x00, 
+	0xdc, 0x04, 0x1f, 0xc2, 0x3a, 0x79, 0x6a, 0x52, 
+	0x18, 0x89, 0x63, 0xc1, 0x6b, 0xc1, 0x08, 0x89, 
+	0x00, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x63, 0xc1, 
+	0x42, 0x99, 0xdd, 0x0b, 0x4a, 0x07, 0x42, 0x91, 
+	0xdd, 0x00, 0x63, 0xc2, 0x4a, 0x06, 0x49, 0x07, 
+	0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, 
+	0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x04, 0xcc, 0x00, 0x00, 0xff, 0xff, 
+	0x00, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x1f, 0xc0, 
+	0x48, 0x0f, 0x78, 0x01, 0x29, 0x00, 0xd0, 0x1a, 
+	0x49, 0x0e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x51, 
+	0x63, 0xc1, 0x1c, 0x0a, 0x29, 0x00, 0xdc, 0x04, 
+	0x1f, 0xc1, 0x39, 0x79, 0x69, 0x09, 0x18, 0x51, 
+	0x63, 0xc1, 0x23, 0x01, 0x03, 0x1b, 0x6b, 0xc1, 
+	0x42, 0x99, 0xdb, 0x08, 0x22, 0xff, 0x32, 0x07, 
+	0x49, 0x05, 0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, 
+	0x20, 0x09, 0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, 
+	0x2e, 0x08, 0x04, 0xcc, 0x66, 0x00, 0x00, 0x80, 
+	0x2c, 0x00, 0x1f, 0xc0, 0xb4, 0x80, 0x20, 0x00, 
+	0x49, 0x1e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x52, 
+	0x49, 0x1d, 0x2a, 0x00, 0xdc, 0x01, 0x69, 0x0b, 
+	0x18, 0xd2, 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9a, 
+	0xdd, 0x00, 0x08, 0xd8, 0x22, 0x33, 0x06, 0x52, 
+	0x6e, 0x93, 0x6e, 0x52, 0x1a, 0x9a, 0x2a, 0x00, 
+	0xdc, 0x01, 0x6a, 0x4b, 0x18, 0xd2, 0x08, 0x92, 
+	0x00, 0x92, 0x4b, 0x14, 0x68, 0xdb, 0x2b, 0x00, 
+	0xd0, 0x06, 0x23, 0x01, 0x03, 0x1b, 0x6a, 0x4f, 
+	0x18, 0xfb, 0x6a, 0x89, 0x1a, 0x59, 0xe0, 0x01, 
+	0x21, 0x01, 0x03, 0x09, 0x42, 0x8a, 0xdd, 0x04, 
+	0x04, 0x00, 0x0c, 0x00, 0x23, 0x01, 0x02, 0x5b, 
+	0x43, 0x18, 0x28, 0x00, 0xd0, 0x0b, 0x4b, 0x0a, 
+	0x42, 0x9a, 0xdd, 0x00, 0x1c, 0x1a, 0x21, 0x06, 
+	0x43, 0x01, 0x48, 0x08, 0x85, 0x81, 0x85, 0xc2, 
+	0x21, 0x09, 0x02, 0x49, 0x86, 0xc1, 0xbc, 0x80, 
+	0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, 
+	0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, 
+	0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x1f, 0xc0, 
+	0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x13, 
+	0x6d, 0x39, 0x29, 0x00, 0xd1, 0x10, 0x24, 0x01, 
+	0x28, 0x01, 0xd0, 0x10, 0x28, 0x04, 0xd0, 0x15, 
+	0x28, 0x05, 0xd1, 0x09, 0xf7, 0xff, 0xf8, 0x50, 
+	0xf7, 0xff, 0xf8, 0x04, 0x20, 0x00, 0x66, 0xf8, 
+	0x67, 0x38, 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 
+	0xff, 0xf9, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x3c, 
+	0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, 
+	0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x23, 
+	0x6d, 0x39, 0x29, 0x00, 0xd0, 0x0e, 0x29, 0x02, 
+	0xd1, 0x09, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x34, 
+	0x28, 0x04, 0xd0, 0x27, 0x28, 0x05, 0xd1, 0x02, 
+	0x20, 0xff, 0xf7, 0xff, 0xf8, 0xcf, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x24, 0x02, 0x28, 0x01, 
+	0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x12, 0x28, 0x05, 
+	0xd1, 0xf5, 0x20, 0x00, 0xf7, 0xff, 0xf8, 0xc2, 
+	0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x40, 
+	0x20, 0x01, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x78, 
+	0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, 
+	0xf0, 0x0b, 0xfc, 0xd8, 0x21, 0x00, 0x20, 0x0d, 
+	0xf0, 0x0b, 0xfc, 0xd4, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x20, 0x02, 0xf0, 0x09, 0xf9, 0x34, 
+	0x20, 0xff, 0x49, 0x03, 0x70, 0x08, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, 
+	0x2e, 0x08, 0x04, 0xcc, 0xb5, 0xf0, 0x4f, 0x2b, 
+	0x24, 0x00, 0x6d, 0x38, 0x28, 0x01, 0xd0, 0x1e, 
+	0x28, 0x02, 0xd1, 0x19, 0x26, 0x03, 0x6d, 0x78, 
+	0x1d, 0xfd, 0x35, 0x79, 0x28, 0x01, 0xd0, 0x34, 
+	0x28, 0x04, 0xd0, 0x3f, 0x28, 0x05, 0xd1, 0x0f, 
+	0x20, 0x02, 0x63, 0x6c, 0xf0, 0x09, 0xf9, 0x14, 
+	0x20, 0x00, 0xf7, 0xfb, 0xfc, 0x53, 0xf7, 0xff, 
+	0xf8, 0x29, 0x65, 0x3e, 0x20, 0x00, 0x65, 0x78, 
+	0xf7, 0xfe, 0xfe, 0xc0, 0x20, 0x01, 0x61, 0xe8, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, 
+	0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x11, 
+	0x28, 0x05, 0xd1, 0xf5, 0xf7, 0xfe, 0xff, 0x8a, 
+	0xf7, 0xfe, 0xff, 0xe0, 0x65, 0x3c, 0x65, 0x7c, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 
+	0xff, 0x81, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xd2, 
+	0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x63, 0x6c, 0x20, 0x02, 0x60, 0xfc, 
+	0xf0, 0x09, 0xf8, 0xe2, 0x20, 0x00, 0xf7, 0xfb, 
+	0xfc, 0x21, 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf2, 
+	0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, 
+	0xb5, 0x90, 0x4c, 0x1b, 0x68, 0xe0, 0x28, 0x03, 
+	0xd0, 0x1f, 0x1f, 0xe7, 0x3f, 0x79, 0x6d, 0x38, 
+	0x28, 0x02, 0xd1, 0x1a, 0x6d, 0x78, 0x28, 0x01, 
+	0xd0, 0x1a, 0x28, 0x04, 0xd0, 0x20, 0x28, 0x05, 
+	0xd1, 0x13, 0x4a, 0x14, 0x49, 0x14, 0x48, 0x15, 
+	0xf7, 0xfe, 0xfe, 0x52, 0x21, 0x00, 0x20, 0x0e, 
+	0xf0, 0x0b, 0xfc, 0x50, 0x20, 0x01, 0xf0, 0x09, 
+	0xf8, 0xb3, 0x20, 0x03, 0x60, 0xe0, 0x68, 0xf8, 
+	0x28, 0x00, 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x09, 
+	0xf8, 0xab, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x01, 0xf0, 0x09, 0xf8, 0xa5, 0x20, 0x00, 
+	0x70, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x21, 0x00, 0x20, 0x0b, 0xf0, 0x0b, 0xfc, 0x36, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x04, 0xcc, 0x2e, 0x08, 0x05, 0x58, 
+	0x2e, 0x08, 0x05, 0x50, 0x2e, 0x08, 0x05, 0x54, 
+	0xb5, 0xf0, 0x4c, 0x21, 0x6d, 0x20, 0x28, 0x02, 
+	0xd1, 0x24, 0x26, 0xff, 0x6d, 0x60, 0x1d, 0xe7, 
+	0x37, 0x79, 0x28, 0x01, 0xd0, 0x1d, 0x28, 0x04, 
+	0xd0, 0x1f, 0x28, 0x05, 0xd1, 0x1a, 0x20, 0x01, 
+	0xf0, 0x09, 0xf8, 0x7e, 0x25, 0x00, 0x68, 0xe0, 
+	0x28, 0x00, 0xd0, 0x04, 0x21, 0x00, 0x20, 0x00, 
+	0xf0, 0x09, 0xf8, 0x20, 0x60, 0xe5, 0x70, 0x3e, 
+	0x68, 0xf8, 0x28, 0x03, 0xd1, 0x14, 0x48, 0x13, 
+	0x22, 0x00, 0x68, 0x41, 0x20, 0x00, 0xf7, 0xfe, 
+	0xfd, 0xed, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x1e, 
+	0xe0, 0x0f, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 
+	0xfb, 0xf9, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x01, 0x61, 0xf8, 0x6b, 0x38, 0xf7, 0xfe, 
+	0xfe, 0x0d, 0x20, 0x02, 0x60, 0xfd, 0xf0, 0x09, 
+	0xf8, 0x53, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 
+	0xfb, 0xe9, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x05, 0x4c, 
+	0xb5, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x2f, 0x01, 
+	0xda, 0x00, 0x27, 0x01, 0x2f, 0x3f, 0xdd, 0x00, 
+	0x27, 0x3f, 0x48, 0x17, 0x6d, 0x01, 0x29, 0x02, 
+	0xd1, 0x13, 0x6d, 0x40, 0x25, 0x02, 0x4c, 0x15, 
+	0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0x0c, 
+	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xfb, 0xca, 
+	0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xfb, 0xc6, 
+	0x20, 0x22, 0x1c, 0x39, 0xf0, 0x0b, 0xfb, 0xc2, 
+	0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xfb, 0xba, 
+	0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xfb, 0xb6, 
+	0x20, 0x22, 0x1c, 0x39, 0xf0, 0x0b, 0xfb, 0xb2, 
+	0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xcb, 0x60, 0xe5, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, 
+	0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, 
+	0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, 
+	0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x16, 
+	0xf0, 0x0b, 0xfb, 0x98, 0x20, 0x00, 0xf7, 0xfe, 
+	0xfd, 0xb1, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, 
+	0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, 
+	0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, 
+	0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, 
+	0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x1a, 
+	0xf0, 0x0b, 0xfb, 0x7c, 0x20, 0x00, 0xf7, 0xfe, 
+	0xfd, 0x95, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, 
+	0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, 
+	0x48, 0x03, 0x6d, 0x00, 0x28, 0x00, 0xd1, 0x00, 
+	0x47, 0x70, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x04, 0x4c, 0xb5, 0xf0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x4d, 0x52, 0x6d, 0x29, 0x48, 0x52, 
+	0x26, 0x00, 0x29, 0x01, 0xd0, 0x4c, 0x29, 0x02, 
+	0xd1, 0x6e, 0x6d, 0x69, 0x29, 0x01, 0xd0, 0x20, 
+	0x29, 0x04, 0xd0, 0x2e, 0x29, 0x05, 0xd1, 0x3e, 
+	0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, 
+	0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 
+	0x69, 0x28, 0xf0, 0x13, 0xf9, 0x03, 0x70, 0x20, 
+	0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, 
+	0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 
+	0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 
+	0xf8, 0xf5, 0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 
+	0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 
+	0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xf8, 0xe6, 
+	0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, 
+	0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 
+	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 
+	0xf0, 0x13, 0xf8, 0xd4, 0x70, 0x38, 0x70, 0x26, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, 
+	0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x6d, 0x69, 0x29, 0x01, 0xd0, 0x21, 0x29, 0x04, 
+	0xd0, 0x2f, 0x29, 0x05, 0xd1, 0x3f, 0x69, 0x69, 
+	0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29, 
+	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 
+	0xf0, 0x13, 0xf8, 0xb8, 0x70, 0x20, 0x21, 0x33, 
+	0x06, 0x49, 0x6a, 0xe8, 0x6e, 0x49, 0x1a, 0x08, 
+	0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 
+	0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xf8, 0xaa, 
+	0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xe0, 0x26, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, 
+	0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 
+	0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xf8, 0x9a, 
+	0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, 
+	0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 
+	0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 
+	0xf0, 0x13, 0xf8, 0x88, 0x70, 0x38, 0x70, 0x26, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, 
+	0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, 
+	0x66, 0x00, 0x00, 0x80, 0xb5, 0xf0, 0x1c, 0x17, 
+	0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x0d, 0x21, 0x00, 
+	0x1c, 0x1c, 0x42, 0xba, 0xda, 0x03, 0x1c, 0x08, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x42, 0xa0, 
+	0xd3, 0x01, 0x42, 0xb0, 0xd9, 0x03, 0x1c, 0x08, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x19, 0xc1, 
+	0x42, 0xb1, 0xd9, 0x0c, 0x1a, 0x32, 0x4e, 0x0a, 
+	0x64, 0x32, 0x1c, 0x29, 0xf7, 0xfb, 0xf8, 0x38, 
+	0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x29, 0x1c, 0x20, 
+	0xf7, 0xfb, 0xf8, 0x32, 0xe0, 0x03, 0x1c, 0x29, 
+	0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x2d, 0x1c, 0x38, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x04, 0xcc, 0xb5, 0xf0, 0x1c, 0x17, 
+	0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x05, 0x20, 0x00, 
+	0x1c, 0x1c, 0x42, 0xba, 0xdb, 0x18, 0x42, 0xa1, 
+	0xd3, 0x16, 0x42, 0xb1, 0xd2, 0x14, 0x19, 0xc8, 
+	0x42, 0xb0, 0xd9, 0x0c, 0x1a, 0x72, 0x4e, 0x0a, 
+	0x64, 0x32, 0x1c, 0x28, 0xf7, 0xfb, 0xf8, 0x10, 
+	0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x28, 0x1c, 0x21, 
+	0xf7, 0xfb, 0xf8, 0x0a, 0xe0, 0x03, 0x1c, 0x28, 
+	0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x05, 0x1c, 0x38, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x04, 0xcc, 0x47, 0x70, 0xb5, 0x00, 
+	0xb0, 0x82, 0x46, 0x6a, 0x49, 0x06, 0xa8, 0x01, 
+	0xf7, 0xfe, 0xfc, 0x56, 0x21, 0x00, 0x20, 0x0b, 
+	0xf0, 0x0b, 0xfa, 0x54, 0x20, 0x03, 0x49, 0x03, 
+	0x61, 0x88, 0xb0, 0x02, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x05, 0x68, 0x2e, 0x08, 0x05, 0x4c, 
+	0xb5, 0x80, 0x4f, 0x0b, 0x22, 0x00, 0x20, 0x00, 
+	0x69, 0xf9, 0xf7, 0xfe, 0xfc, 0x2b, 0x21, 0x00, 
+	0x20, 0x0d, 0xf0, 0x0b, 0xfa, 0x3f, 0x21, 0x01, 
+	0x1f, 0xf8, 0x38, 0x79, 0x61, 0xc1, 0x6b, 0x00, 
+	0xf7, 0xfe, 0xfc, 0x54, 0x20, 0x00, 0x61, 0xb8, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x05, 0x4c, 0xb5, 0x80, 0x4f, 0x06, 
+	0x68, 0x38, 0x1d, 0xc1, 0x31, 0xb5, 0x20, 0x2f, 
+	0x02, 0x80, 0xf0, 0x12, 0xff, 0xe3, 0x60, 0x39, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x02, 0x55, 0x3c, 0x48, 0x05, 0x8f, 0xc1, 
+	0x29, 0x00, 0xd0, 0x05, 0x21, 0x00, 0x87, 0xc1, 
+	0x48, 0x03, 0x69, 0x01, 0x31, 0x01, 0x61, 0x01, 
+	0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
+	0x2e, 0x08, 0x05, 0x6c, 0x48, 0x03, 0x21, 0x00, 
+	0x60, 0x01, 0x48, 0x03, 0x69, 0x41, 0x31, 0x01, 
+	0x61, 0x41, 0x47, 0x70, 0x2e, 0x08, 0x47, 0x58, 
+	0x2e, 0x08, 0x05, 0x6c, 0xb5, 0x00, 0xb0, 0x88, 
+	0x46, 0x68, 0xf0, 0x0d, 0xfd, 0xe5, 0x48, 0x07, 
+	0x69, 0x81, 0x31, 0x01, 0x23, 0x01, 0x22, 0x06, 
+	0x61, 0x81, 0x21, 0x47, 0x02, 0x49, 0x05, 0x48, 
+	0xf0, 0x0d, 0xfc, 0xd2, 0xb0, 0x08, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x6c, 
+	0xb5, 0x90, 0x1c, 0x07, 0x20, 0xff, 0x30, 0xa5, 
+	0xb0, 0x85, 0x90, 0x00, 0x20, 0x01, 0x02, 0x40, 
+	0x90, 0x02, 0x48, 0x12, 0x90, 0x04, 0x20, 0x0e, 
+	0xab, 0x03, 0x80, 0x18, 0x46, 0x68, 0xf0, 0x0d, 
+	0xfd, 0xf7, 0x2f, 0x00, 0xd0, 0x16, 0x20, 0x33, 
+	0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, 
+	0x1a, 0xc7, 0x98, 0x02, 0x1e, 0x79, 0xf0, 0x00, 
+	0xfb, 0x27, 0x4c, 0x09, 0x68, 0x20, 0x28, 0x00, 
+	0xd1, 0x04, 0x20, 0xa5, 0x01, 0xc0, 0xf0, 0x00, 
+	0xfb, 0x2d, 0x60, 0x20, 0x98, 0x02, 0x1a, 0x38, 
+	0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x1c, 0x00, 0x00, 
+	0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x6c, 
+	0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 
+	0xf0, 0x09, 0xfa, 0x54, 0x48, 0x04, 0x68, 0x00, 
+	0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, 
+	0xf0, 0x00, 0xf9, 0xe0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x5e, 0x60, 0xb5, 0xf0, 0x48, 0x51, 
+	0x4e, 0x51, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x51, 
+	0x86, 0xe7, 0x86, 0xa7, 0x48, 0x50, 0x60, 0x07, 
+	0xf0, 0x05, 0xf9, 0x54, 0x48, 0x4f, 0xf0, 0x0e, 
+	0xfa, 0x01, 0xf7, 0xfa, 0xfe, 0xdd, 0x21, 0xff, 
+	0x48, 0x4d, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, 
+	0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, 
+	0x4a, 0x4a, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, 
+	0xfb, 0x17, 0x20, 0x01, 0xf7, 0xff, 0xff, 0x98, 
+	0x21, 0x00, 0x20, 0x00, 0xf0, 0x08, 0xfd, 0x92, 
+	0xf0, 0x01, 0xfa, 0xa6, 0x48, 0x44, 0x60, 0x07, 
+	0x25, 0x02, 0x48, 0x44, 0x60, 0x05, 0x20, 0x03, 
+	0x49, 0x43, 0x60, 0x08, 0x49, 0x43, 0x60, 0x08, 
+	0x49, 0x43, 0x60, 0x0d, 0x49, 0x43, 0x60, 0x08, 
+	0x48, 0x43, 0x60, 0x07, 0x48, 0x43, 0x65, 0x87, 
+	0xf0, 0x00, 0xf9, 0x80, 0xf0, 0x0e, 0xfa, 0x6e, 
+	0x20, 0x00, 0xf0, 0x0b, 0xff, 0xab, 0x28, 0x00, 
+	0xd1, 0x5d, 0x48, 0x3f, 0xf0, 0x08, 0xfb, 0xe4, 
+	0x20, 0x00, 0xf0, 0x08, 0xfc, 0x55, 0x87, 0xe7, 
+	0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03, 
+	0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x0b, 
+	0xfc, 0x51, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, 
+	0xfc, 0x73, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, 
+	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xc7, 0x20, 0x7d, 
+	0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xdb, 0xf0, 0x04, 
+	0xf8, 0x4b, 0xf0, 0x04, 0xf8, 0x89, 0xf7, 0xfb, 
+	0xf9, 0x11, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfd, 
+	0xf8, 0x11, 0xf7, 0xfd, 0xfb, 0xbf, 0xf7, 0xfb, 
+	0xfc, 0x3d, 0x05, 0xa8, 0xf0, 0x16, 0xfe, 0x49, 
+	0x49, 0x28, 0x20, 0x17, 0xf0, 0x16, 0xfe, 0x52, 
+	0x49, 0x27, 0x20, 0x08, 0xf0, 0x16, 0xfe, 0x4e, 
+	0xf0, 0x16, 0xfe, 0x44, 0x4b, 0x25, 0x40, 0x18, 
+	0xf0, 0x16, 0xfe, 0x44, 0x01, 0xe8, 0xf0, 0x16, 
+	0xfe, 0x38, 0x48, 0x23, 0x23, 0x01, 0x22, 0x08, 
+	0x21, 0x81, 0x01, 0x09, 0x60, 0x07, 0xf0, 0x0b, 
+	0xfb, 0x65, 0xf0, 0x01, 0xfa, 0xc7, 0x49, 0x1f, 
+	0x20, 0x04, 0xf0, 0x16, 0xfe, 0x37, 0xf0, 0x16, 
+	0xfe, 0x2d, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 
+	0xf0, 0x16, 0xfe, 0x2c, 0x20, 0x10, 0xf0, 0x16, 
+	0xfe, 0x20, 0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 
+	0xf7, 0xfd, 0xfd, 0xb0, 0x1c, 0x38, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, 
+	0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x1f, 0xc0, 
+	0x2e, 0x08, 0x04, 0x9c, 0x07, 0x77, 0x77, 0x20, 
+	0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x6c, 
+	0x6e, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, 
+	0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x15, 0x00, 
+	0x6e, 0x00, 0x16, 0x00, 0x6e, 0x00, 0x17, 0x00, 
+	0x6e, 0x00, 0x18, 0x00, 0xcc, 0x00, 0x0f, 0x80, 
+	0x00, 0x80, 0x10, 0x80, 0x2e, 0x00, 0x55, 0x39, 
+	0x2e, 0x00, 0x55, 0x59, 0xff, 0xff, 0xfe, 0xff, 
+	0x2e, 0x08, 0x47, 0x58, 0x2e, 0x00, 0x55, 0x19, 
+	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, 
+	0xfe, 0x29, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
+	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
+	0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 
+	0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 
+	0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, 
+	0xf0, 0x16, 0xfd, 0xe0, 0xf0, 0x16, 0xfd, 0xd6, 
+	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, 
+	0xfd, 0xd5, 0xf0, 0x16, 0xfe, 0x41, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
+	0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x03, 0x00, 
+	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, 
+	0xfd, 0xfd, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
+	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
+	0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 
+	0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 
+	0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, 
+	0xf0, 0x16, 0xfd, 0xb4, 0xf0, 0x16, 0xfd, 0xaa, 
+	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, 
+	0xfd, 0xa9, 0xf0, 0x16, 0xfe, 0x15, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
+	0x6e, 0x00, 0x03, 0x00, 0xb5, 0x00, 0xf0, 0x16, 
+	0xfd, 0xd5, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, 
+	0xf0, 0x16, 0xfd, 0x94, 0x23, 0x02, 0x43, 0x18, 
+	0xf0, 0x16, 0xfd, 0x94, 0xf0, 0x16, 0xfe, 0x00, 
+	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x03, 0x00, 
+	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, 
+	0xfd, 0xc1, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
+	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
+	0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 
+	0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 
+	0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, 
+	0xf0, 0x16, 0xfd, 0x78, 0xf0, 0x16, 0xfd, 0x6e, 
+	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, 
+	0xfd, 0x6d, 0xf0, 0x16, 0xfd, 0xd9, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
+	0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x04, 0x00, 
+	0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, 
+	0xfd, 0x95, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 
+	0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 
+	0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 
+	0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 
+	0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, 
+	0xf0, 0x16, 0xfd, 0x4c, 0xf0, 0x16, 0xfd, 0x42, 
+	0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, 
+	0xfd, 0x41, 0xf0, 0x16, 0xfd, 0xad, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 
+	0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0xf0, 0x16, 
+	0xfd, 0x6d, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, 
+	0xf0, 0x16, 0xfd, 0x2c, 0x23, 0x20, 0x43, 0x18, 
+	0xf0, 0x16, 0xfd, 0x2c, 0xf0, 0x16, 0xfd, 0x98, 
+	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x04, 0x00, 
+	0xb5, 0x00, 0x48, 0x0b, 0x68, 0x41, 0x31, 0x14, 
+	0x60, 0x41, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81, 
+	0x48, 0x08, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
+	0x28, 0x01, 0xd1, 0x01, 0xf7, 0xfe, 0xfa, 0x5a, 
+	0xbc, 0x08, 0x47, 0x18, 0x48, 0x04, 0x21, 0x10, 
+	0xf0, 0x09, 0xf9, 0x64, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x08, 0x05, 0x00, 
+	0x2e, 0x08, 0x05, 0xb8, 0xb5, 0x00, 0xf0, 0x16, 
+	0xfd, 0x3d, 0x21, 0x00, 0x48, 0x08, 0x60, 0x41, 
+	0x60, 0x81, 0x49, 0x08, 0x20, 0x07, 0xf0, 0x16, 
+	0xfd, 0x01, 0xf0, 0x16, 0xfc, 0xf7, 0x23, 0x80, 
+	0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, 0xfc, 0xf6, 
+	0xf0, 0x16, 0xfd, 0x62, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x00, 0x59, 0x65, 
+	0x48, 0x01, 0x68, 0x40, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x05, 0xb8, 0xb5, 0x90, 0x49, 0x0d, 
+	0x1c, 0x0f, 0x48, 0x0d, 0x24, 0x1e, 0x22, 0x10, 
+	0x1c, 0x23, 0xf0, 0x09, 0xfa, 0x65, 0x22, 0x02, 
+	0x21, 0x10, 0x1c, 0x38, 0x1c, 0x23, 0xf0, 0x05, 
+	0xfc, 0xcd, 0x49, 0x08, 0x20, 0x10, 0xf0, 0x16, 
+	0xfc, 0xd9, 0xf0, 0x16, 0xfc, 0xcf, 0x4b, 0x06, 
+	0x40, 0x18, 0xf0, 0x16, 0xfc, 0xcf, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x68, 
+	0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x00, 0x5a, 0x29, 
+	0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0xb0, 0x86, 
+	0x46, 0x68, 0x49, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 
+	0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 
+	0x48, 0x09, 0xab, 0x00, 0xcb, 0x0e, 0xb0, 0x03, 
+	0xf0, 0x09, 0xfa, 0x6a, 0xb0, 0x03, 0x48, 0x07, 
+	0x68, 0x01, 0x08, 0x4a, 0xd3, 0x04, 0x08, 0x49, 
+	0x00, 0x49, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x68, 
+	0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x08, 0x00, 0x04, 
+	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, 0xdc, 0xb5, 0x90, 0x1c, 0x07, 
+	0xf0, 0x16, 0xfb, 0xf8, 0x23, 0x11, 0x05, 0x1b, 
+	0x1c, 0x04, 0x43, 0x18, 0xf0, 0x16, 0xfb, 0xf6, 
+	0x1c, 0x39, 0x48, 0x05, 0xf7, 0xff, 0xff, 0x50, 
+	0x1c, 0x07, 0x1c, 0x20, 0xf0, 0x16, 0xfb, 0xee, 
+	0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x05, 0xdc, 0xb5, 0x00, 0x1c, 0x01, 
+	0x48, 0x02, 0xf7, 0xff, 0xff, 0x41, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xdc, 
+	0xb5, 0x90, 0x1c, 0x07, 0xd0, 0x0e, 0xf0, 0x16, 
+	0xfb, 0xd5, 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, 
+	0x43, 0x18, 0xf0, 0x16, 0xfb, 0xd3, 0x1c, 0x39, 
+	0x48, 0x04, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x20, 
+	0xf0, 0x16, 0xfb, 0xcc, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xdc, 
+	0xb5, 0x00, 0x4a, 0x04, 0xc2, 0x03, 0x1c, 0x0a, 
+	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x97, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc4, 
+	0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x1c, 0x01, 
+	0x48, 0x02, 0xf7, 0xff, 0xff, 0x11, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd4, 
+	0xb5, 0x00, 0x49, 0x08, 0x68, 0x0a, 0x42, 0x90, 
+	0xd3, 0x02, 0x68, 0x49, 0x42, 0x88, 0xd9, 0x03, 
+	0xf7, 0xff, 0xff, 0xc6, 0xbc, 0x08, 0x47, 0x18, 
+	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x30, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc4, 
+	0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x4a, 0x05, 
+	0x60, 0x90, 0x60, 0xd1, 0x1c, 0x0a, 0x1c, 0x01, 
+	0x48, 0x03, 0xf7, 0xff, 0xff, 0x68, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4, 
+	0x2e, 0x08, 0x05, 0xe4, 0xb5, 0x00, 0x1c, 0x01, 
+	0x48, 0x02, 0xf7, 0xff, 0xfe, 0xe1, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xe4, 
+	0xb5, 0x00, 0x49, 0x08, 0x68, 0x8a, 0x42, 0x90, 
+	0xd3, 0x02, 0x68, 0xc9, 0x42, 0x88, 0xd9, 0x03, 
+	0xf7, 0xff, 0xff, 0x96, 0xbc, 0x08, 0x47, 0x18, 
+	0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x00, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc4, 
+	0x2e, 0x08, 0x05, 0xe4, 0xb5, 0xf0, 0x06, 0x07, 
+	0x0e, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81, 
+	0x91, 0x00, 0x06, 0x16, 0x0e, 0x36, 0x00, 0xbd, 
+	0x4c, 0x15, 0x59, 0x60, 0x28, 0x00, 0xd1, 0x15, 
+	0xf7, 0xfb, 0xf9, 0x40, 0x22, 0x00, 0xb4, 0x04, 
+	0x23, 0x00, 0x22, 0x02, 0x99, 0x01, 0x1c, 0x38, 
+	0xf0, 0x04, 0xfe, 0x8c, 0x23, 0x01, 0x02, 0x9b, 
+	0x00, 0x5a, 0x21, 0x01, 0x1c, 0x38, 0xb0, 0x01, 
+	0xf0, 0x05, 0xf8, 0x48, 0x20, 0x03, 0x00, 0x71, 
+	0x4a, 0x0a, 0x52, 0x50, 0x59, 0x60, 0x30, 0x01, 
+	0x51, 0x60, 0x48, 0x09, 0x23, 0x14, 0x5e, 0xc1, 
+	0x29, 0x00, 0xd1, 0x02, 0x49, 0x07, 0x4a, 0x08, 
+	0x65, 0xd1, 0x8a, 0x81, 0x31, 0x01, 0x82, 0x81, 
+	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x02, 0x54, 0xb0, 0x2e, 0x08, 0x49, 0x78, 
+	0x2e, 0x08, 0x07, 0x6c, 0x2e, 0x02, 0x52, 0xc0, 
+	0xa0, 0x00, 0x0d, 0x00, 0xb5, 0xb0, 0x06, 0x07, 
+	0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xb9, 
+	0x48, 0x1a, 0x58, 0x42, 0x3a, 0x01, 0x50, 0x42, 
+	0xd1, 0x20, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 
+	0x21, 0x02, 0x1c, 0x38, 0xf0, 0x05, 0xf8, 0x16, 
+	0x22, 0x00, 0xb4, 0x04, 0x25, 0x00, 0x1c, 0x38, 
+	0x1c, 0x2b, 0x49, 0x13, 0xf0, 0x04, 0xfe, 0x4a, 
+	0x00, 0x61, 0xb0, 0x01, 0x48, 0x11, 0x52, 0x45, 
+	0x48, 0x0f, 0x4a, 0x11, 0x52, 0x50, 0x00, 0x79, 
+	0x4a, 0x10, 0x52, 0x50, 0x00, 0x62, 0x19, 0x12, 
+	0x00, 0x92, 0x49, 0x0f, 0x18, 0x53, 0x81, 0x1d, 
+	0x52, 0x88, 0x80, 0x58, 0x48, 0x0d, 0x8a, 0x81, 
+	0x39, 0x01, 0x82, 0x81, 0x23, 0x14, 0x5e, 0xc0, 
+	0x28, 0x00, 0xd1, 0x03, 0x20, 0xd7, 0x00, 0xc0, 
+	0x49, 0x09, 0x65, 0xc8, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x54, 0xb0, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x78, 
+	0x2e, 0x08, 0x49, 0x38, 0x2e, 0x08, 0x49, 0x00, 
+	0x2e, 0x08, 0x47, 0x80, 0x2e, 0x08, 0x07, 0x6c, 
+	0xa0, 0x00, 0x0d, 0x00, 0xb5, 0xf0, 0x04, 0x06, 
+	0x0c, 0x36, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x17, 
+	0xb0, 0x8a, 0x46, 0x69, 0x1c, 0x30, 0x1c, 0x22, 
+	0xf0, 0x00, 0xf8, 0xb0, 0x23, 0x01, 0x1c, 0x05, 
+	0x42, 0xd8, 0xd1, 0x03, 0xb0, 0x0a, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x4b, 0x4e, 0x42, 0x9c, 
+	0xd1, 0x06, 0xa8, 0x00, 0x88, 0x00, 0x1c, 0x31, 
+	0x1c, 0x2a, 0xf7, 0xff, 0xff, 0x57, 0xe0, 0x7f, 
+	0x20, 0x20, 0x40, 0x20, 0x28, 0x20, 0xd1, 0x1f, 
+	0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x00, 0x88, 0x00, 
+	0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0x1c, 0x23, 
+	0xf7, 0xfd, 0xf8, 0x7c, 0x28, 0x00, 0xd0, 0x6f, 
+	0x48, 0x42, 0x00, 0x69, 0x4a, 0x42, 0x52, 0x50, 
+	0xa9, 0x00, 0x88, 0x09, 0x00, 0x49, 0x4a, 0x41, 
+	0x52, 0x50, 0xa8, 0x00, 0x88, 0x00, 0x1c, 0x29, 
+	0xf0, 0x00, 0xf9, 0xce, 0x20, 0x00, 0x43, 0xc0, 
+	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x00, 0x21, 0x00, 0xaa, 0x01, 0x88, 0x3b, 
+	0x0a, 0x1b, 0x70, 0x13, 0x88, 0x3b, 0x93, 0x09, 
+	0x32, 0x01, 0x06, 0x1b, 0xd0, 0x02, 0x1c, 0x48, 
+	0x06, 0x00, 0x0e, 0x00, 0x9b, 0x09, 0x70, 0x13, 
+	0x31, 0x01, 0x32, 0x01, 0x37, 0x02, 0x29, 0x0e, 
+	0xdb, 0xed, 0x21, 0x00, 0x23, 0x00, 0x70, 0x13, 
+	0x31, 0x01, 0x32, 0x01, 0x29, 0x04, 0xdb, 0xfa, 
+	0x21, 0x0c, 0x40, 0x21, 0x29, 0x0c, 0xd1, 0x03, 
+	0x04, 0x21, 0x0c, 0x09, 0x24, 0x01, 0x43, 0x0c, 
+	0x28, 0x06, 0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, 
+	0xb4, 0x04, 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 
+	0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 
+	0xab, 0x02, 0xf7, 0xfc, 0xfc, 0x59, 0xb0, 0x01, 
+	0xe0, 0x1e, 0x28, 0x0a, 0xdc, 0x0e, 0x06, 0x22, 
+	0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, 0x0e, 0x12, 
+	0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
+	0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, 0xfc, 0x62, 
+	0xb0, 0x01, 0xe0, 0x0d, 0x06, 0x22, 0x0e, 0x12, 
+	0xb4, 0x04, 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 
+	0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 
+	0xab, 0x02, 0xf7, 0xfc, 0xfc, 0x6d, 0xb0, 0x01, 
+	0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, 
+	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xe7, 0xff, 0xa8, 0x00, 0x88, 0x00, 0x00, 0x6a, 
+	0x19, 0x52, 0x00, 0x92, 0x49, 0x0a, 0x52, 0x88, 
+	0x18, 0x50, 0x80, 0x46, 0x80, 0x84, 0x49, 0x05, 
+	0x80, 0xc1, 0x21, 0x01, 0x81, 0x01, 0x1c, 0x28, 
+	0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x00, 0x00, 0xb9, 0x6a, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x49, 0x38, 0x2e, 0x08, 0x49, 0x00, 
+	0x2e, 0x08, 0x47, 0x80, 0xb4, 0xf0, 0x04, 0x04, 
+	0x0c, 0x24, 0x04, 0x17, 0x0c, 0x3f, 0xb0, 0x82, 
+	0x48, 0x58, 0x22, 0x00, 0x4d, 0x58, 0x95, 0x01, 
+	0x1c, 0x06, 0x00, 0x53, 0x9d, 0x01, 0x5a, 0xed, 
+	0x42, 0xb5, 0xd1, 0x02, 0x04, 0x10, 0x0c, 0x00, 
+	0xe0, 0x02, 0x32, 0x01, 0x2a, 0x20, 0xdb, 0xf4, 
+	0x42, 0xb0, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 
+	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x80, 0x0e, 
+	0x4a, 0x4e, 0x92, 0x00, 0x4d, 0x4e, 0x4a, 0x4f, 
+	0x4b, 0x4f, 0x42, 0x9f, 0xd1, 0x32, 0x23, 0x00, 
+	0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, 
+	0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x03, 0xd1, 0x01, 
+	0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, 
+	0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 
+	0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x3f, 
+	0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b, 
+	0x5a, 0xd6, 0x4b, 0x3c, 0x42, 0x9e, 0xd1, 0x01, 
+	0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, 
+	0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x37, 0x42, 0x9f, 
+	0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 
+	0xbc, 0xf0, 0x47, 0x70, 0x23, 0x03, 0x00, 0x47, 
+	0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f, 
+	0x53, 0xeb, 0xe0, 0x54, 0x23, 0x20, 0x40, 0x3b, 
+	0x2b, 0x20, 0xd1, 0x1e, 0x23, 0x00, 0x00, 0x5f, 
+	0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x04, 0x20, 0x00, 
+	0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
+	0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xf3, 0x27, 0x00, 
+	0x00, 0x7b, 0x5a, 0xd5, 0x42, 0xb5, 0xd1, 0x01, 
+	0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, 
+	0xdb, 0xf6, 0x88, 0x0f, 0x42, 0xb7, 0xd1, 0x36, 
+	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, 0x38, 0x2e, 0x08, 0x49, 0x78, 
+	0x2e, 0x08, 0x49, 0xb8, 0x2e, 0x08, 0x49, 0x00, 
+	0x00, 0x00, 0xb9, 0x6a, 0xb5, 0xf0, 0x04, 0x07, 
+	0x0c, 0x3f, 0xb0, 0x81, 0x4a, 0x34, 0x92, 0x00, 
+	0x1c, 0x11, 0x42, 0x97, 0xd0, 0x01, 0x2f, 0x20, 
+	0xdb, 0x05, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x7c, 
+	0x4a, 0x2e, 0x5b, 0x10, 0x42, 0x88, 0xd1, 0x05, 
+	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x49, 0x28, 0x53, 0x11, 
+	0x23, 0x00, 0x49, 0x29, 0x00, 0x5e, 0x5b, 0x8e, 
+	0x42, 0x86, 0xd1, 0x02, 0x04, 0x1d, 0x0c, 0x2d, 
+	0xe0, 0x02, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xf5, 
+	0x23, 0x00, 0x00, 0x5e, 0x5b, 0x96, 0x42, 0x86, 
+	0xd1, 0x03, 0x04, 0x1a, 0x0c, 0x12, 0x92, 0x00, 
+	0xe0, 0x02, 0x33, 0x01, 0x2b, 0x20, 0xdb, 0xf4, 
+	0x9a, 0x00, 0x4e, 0x1b, 0x42, 0xb2, 0xd1, 0x0d, 
+	0x22, 0x00, 0x00, 0x53, 0x5a, 0xcb, 0x42, 0x83, 
+	0xd1, 0x05, 0x23, 0x00, 0x00, 0x50, 0x4a, 0x19, 
+	0x52, 0x13, 0x52, 0x0e, 0xe0, 0x02, 0x32, 0x01, 
+	0x2a, 0x1c, 0xdb, 0xf2, 0x4e, 0x16, 0x5b, 0x30, 
+	0x28, 0x02, 0xd1, 0x05, 0x23, 0x00, 0x53, 0x33, 
+	0x1c, 0x28, 0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x38, 
+	0x5b, 0x30, 0x28, 0x01, 0xd1, 0x0a, 0x1c, 0x38, 
+	0xf7, 0xfc, 0xff, 0xf0, 0x28, 0x00, 0xd0, 0x05, 
+	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x5b, 0x30, 0x28, 0x03, 
+	0xd1, 0x03, 0x1c, 0x28, 0x1c, 0x39, 0xf7, 0xff, 
+	0xfd, 0xcd, 0x04, 0x38, 0x14, 0x00, 0xb0, 0x01, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x38, 
+	0x2e, 0x08, 0x49, 0x00, 0x2e, 0x08, 0x49, 0xb8, 
+	0x2e, 0x08, 0x49, 0x78, 0x04, 0x01, 0x0c, 0x09, 
+	0x20, 0x02, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0x9b, 
+	0x4a, 0x03, 0x18, 0x99, 0x81, 0x08, 0x48, 0x03, 
+	0x52, 0xd0, 0x80, 0x48, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x47, 0x80, 0x00, 0x00, 0xff, 0xff, 
+	0xb5, 0x80, 0x04, 0x0f, 0x0c, 0x3f, 0x06, 0x39, 
+	0x0e, 0x09, 0x06, 0x00, 0x0e, 0x00, 0xf7, 0xfc, 
+	0xfc, 0x25, 0x20, 0x00, 0x00, 0x7b, 0x19, 0xdb, 
+	0x00, 0x9b, 0x4a, 0x04, 0x18, 0x99, 0x81, 0x08, 
+	0x48, 0x03, 0x52, 0xd0, 0x80, 0x48, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x80, 
+	0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x09, 
+	0x0c, 0x09, 0x78, 0x42, 0x02, 0x12, 0x78, 0x83, 
+	0x43, 0x1a, 0x05, 0x12, 0x0d, 0x12, 0x27, 0x00, 
+	0x43, 0xff, 0x32, 0x03, 0x42, 0x8a, 0xd0, 0x03, 
+	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0xf0, 0x05, 0xfa, 0xd0, 0x28, 0x00, 0xd0, 0x03, 
+	0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0xff, 0x9c, 0x09, 0x04, 0x00, 0x0c, 0x00, 
+	0xb0, 0x81, 0x90, 0x00, 0x06, 0x09, 0x0e, 0x09, 
+	0x06, 0x12, 0x0e, 0x12, 0xb0, 0x88, 0x4f, 0x16, 
+	0x68, 0xb8, 0x28, 0x0c, 0xdb, 0x06, 0x20, 0x00, 
+	0x43, 0xc0, 0xb0, 0x09, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x23, 0x00, 
+	0x00, 0x45, 0x46, 0x6e, 0x53, 0x73, 0x30, 0x01, 
+	0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, 
+	0x02, 0x08, 0x43, 0x10, 0xab, 0x00, 0x80, 0x18, 
+	0x46, 0x6a, 0x21, 0x04, 0x98, 0x08, 0xf7, 0xff, 
+	0xfd, 0x95, 0x28, 0x00, 0xda, 0x01, 0xb0, 0x09, 
+	0xe7, 0xe4, 0x00, 0x81, 0x4a, 0x05, 0x50, 0x54, 
+	0x9b, 0x0c, 0x4a, 0x05, 0x50, 0x53, 0x68, 0xb9, 
+	0x31, 0x01, 0x60, 0xb9, 0xb0, 0x09, 0xe7, 0xd9, 
+	0x2e, 0x08, 0x07, 0x84, 0x2e, 0x08, 0x4a, 0x70, 
+	0x2e, 0x08, 0x49, 0xf0, 0xb5, 0x80, 0x04, 0x07, 
+	0x14, 0x3f, 0xd5, 0x04, 0x20, 0x00, 0x43, 0xc0, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfe, 0xf4, 0x20, 0x00, 0x00, 0xb9, 
+	0x4a, 0x05, 0x50, 0x50, 0x4a, 0x05, 0x50, 0x50, 
+	0x49, 0x05, 0x68, 0x8a, 0x3a, 0x01, 0x60, 0x8a, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x49, 0xf0, 0x2e, 0x08, 0x4a, 0x70, 
+	0x2e, 0x08, 0x07, 0x84, 0xb5, 0x90, 0x27, 0x00, 
+	0x4c, 0x08, 0x00, 0xb8, 0x58, 0x20, 0x28, 0x00, 
+	0xd0, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xd6, 
+	0x37, 0x01, 0x2f, 0x20, 0xdb, 0xf5, 0x20, 0x00, 
+	0x49, 0x03, 0x60, 0xc8, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x49, 0xf0, 
+	0x2e, 0x08, 0x07, 0x84, 0xb5, 0x00, 0xf7, 0xff, 
+	0xff, 0xe5, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
+	0x04, 0x00, 0x14, 0x00, 0xb0, 0x83, 0x90, 0x00, 
+	0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09, 0x24, 0x00, 
+	0x1c, 0x38, 0x1c, 0x1d, 0x1c, 0x0e, 0xb0, 0x81, 
+	0xf7, 0xff, 0xff, 0x58, 0x1c, 0x01, 0x20, 0x00, 
+	0x29, 0x00, 0xd0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x78, 0xf9, 0x02, 0x09, 
+	0x79, 0x3a, 0x43, 0x11, 0x04, 0x09, 0x0c, 0x09, 
+	0x88, 0x2a, 0x42, 0x91, 0xd0, 0x03, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x7a, 0x39, 
+	0x02, 0x09, 0x7a, 0x7a, 0x43, 0x11, 0x04, 0xc9, 
+	0x0c, 0xc9, 0x91, 0x00, 0x7a, 0xb9, 0x02, 0x09, 
+	0x7a, 0xfa, 0x43, 0x11, 0x05, 0x0b, 0x0d, 0x1b, 
+	0x1d, 0xf9, 0x31, 0x05, 0x27, 0x00, 0x1d, 0xd8, 
+	0x30, 0x09, 0x1a, 0x32, 0x2b, 0x00, 0xdd, 0x0a, 
+	0x78, 0x08, 0x28, 0x09, 0xd1, 0x00, 0x37, 0x01, 
+	0x78, 0x48, 0x1c, 0x85, 0x1b, 0x5b, 0x18, 0x40, 
+	0x1c, 0x81, 0x2b, 0x00, 0xdc, 0xf4, 0x2a, 0x00, 
+	0xdd, 0x36, 0x48, 0x26, 0x88, 0x06, 0x96, 0x03, 
+	0x88, 0x85, 0x95, 0x02, 0x78, 0xc8, 0x02, 0x00, 
+	0x79, 0x0b, 0x43, 0x18, 0x05, 0x00, 0x0d, 0x00, 
+	0x78, 0x0b, 0x2b, 0x01, 0xd0, 0x01, 0x2b, 0x02, 
+	0xd1, 0x06, 0x78, 0x4d, 0x02, 0x2d, 0x78, 0x8e, 
+	0x43, 0x35, 0x04, 0xed, 0x0c, 0xed, 0x9e, 0x03, 
+	0x2b, 0x04, 0xd0, 0x01, 0x2b, 0x03, 0xd1, 0x09, 
+	0x78, 0x4b, 0x02, 0x1b, 0x78, 0x8d, 0x43, 0x2b, 
+	0x04, 0xdb, 0x0c, 0xdb, 0x9d, 0x02, 0x42, 0xab, 
+	0xd1, 0x00, 0x24, 0x01, 0x1d, 0x43, 0x1a, 0xd2, 
+	0x31, 0x05, 0x28, 0x00, 0xdd, 0x0a, 0x78, 0x0b, 
+	0x2b, 0x09, 0xd1, 0x00, 0x37, 0x01, 0x78, 0x4b, 
+	0x1c, 0x9d, 0x1b, 0x40, 0x18, 0x59, 0x31, 0x02, 
+	0x28, 0x00, 0xdc, 0xf4, 0x2a, 0x00, 0xdc, 0xcd, 
+	0x2c, 0x00, 0xd0, 0x09, 0xf7, 0xff, 0xff, 0x62, 
+	0x99, 0x00, 0x48, 0x09, 0x80, 0x01, 0x2f, 0x00, 
+	0xd1, 0x07, 0xf7, 0xfa, 0xf8, 0xb7, 0xe0, 0x04, 
+	0x98, 0x01, 0xf7, 0xff, 0xff, 0x37, 0xf0, 0x00, 
+	0xf8, 0x23, 0x20, 0x00, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x84, 
+	0x2e, 0x08, 0x00, 0x08, 0xb4, 0x90, 0x04, 0x02, 
+	0x0c, 0x12, 0x04, 0x0f, 0x0c, 0x3f, 0x4b, 0x07, 
+	0x68, 0xd8, 0x28, 0x80, 0xda, 0x08, 0x2a, 0x00, 
+	0xd0, 0x06, 0x00, 0x41, 0x4c, 0x04, 0x52, 0x67, 
+	0x4f, 0x04, 0x52, 0x7a, 0x30, 0x01, 0x60, 0xd8, 
+	0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x07, 0x84, 
+	0x2e, 0x08, 0x4a, 0xf0, 0x2e, 0x08, 0x4b, 0xf0, 
+	0xb5, 0x90, 0x4f, 0x13, 0x24, 0x00, 0x43, 0xe4, 
+	0x68, 0xf8, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x20, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x40, 
+	0x49, 0x0e, 0x18, 0x41, 0x1e, 0x8a, 0xb4, 0x04, 
+	0x49, 0x0d, 0x18, 0x40, 0x38, 0x40, 0x8f, 0xc0, 
+	0x4b, 0x0c, 0x22, 0xff, 0x21, 0x02, 0xf7, 0xff, 
+	0xfe, 0xbb, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x03, 
+	0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, 0x20, 0x00, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x07, 0x84, 0x2e, 0x08, 0x4b, 0xf0, 
+	0x2e, 0x08, 0x4a, 0xf0, 0x2e, 0x00, 0x63, 0x73, 
+	0xb5, 0xf0, 0x04, 0x05, 0x14, 0x2d, 0x1c, 0x0f, 
+	0x04, 0x11, 0x0c, 0x09, 0x1c, 0x0e, 0x4c, 0x28, 
+	0x23, 0x02, 0x69, 0x20, 0x42, 0xd8, 0xd0, 0x04, 
+	0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x77, 0x28, 0x00, 
+	0xd0, 0x06, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xce, 
+	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x79, 0xb8, 0x69, 0x21, 0x42, 0x88, 0xd1, 0x09, 
+	0x20, 0x01, 0x43, 0xc0, 0x61, 0x20, 0x1c, 0x28, 
+	0xf7, 0xff, 0xfe, 0xc0, 0x20, 0x00, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x42, 0xd9, 
+	0xd1, 0x02, 0x61, 0x20, 0x20, 0x00, 0x60, 0xe0, 
+	0x37, 0x08, 0x1f, 0xf4, 0x3c, 0x05, 0x2c, 0x00, 
+	0xdd, 0x11, 0x78, 0x38, 0x02, 0x00, 0x78, 0x79, 
+	0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, 0x78, 0xb9, 
+	0x02, 0x09, 0x78, 0xfa, 0x43, 0x11, 0x04, 0xc9, 
+	0x0c, 0xc9, 0xf7, 0xff, 0xff, 0x77, 0x37, 0x04, 
+	0x3c, 0x04, 0x2c, 0x00, 0xdc, 0xed, 0xf7, 0xff, 
+	0xff, 0x8b, 0xf7, 0xff, 0xff, 0x89, 0xf7, 0xff, 
+	0xff, 0x87, 0xf7, 0xff, 0xff, 0x85, 0xf7, 0xff, 
+	0xff, 0x83, 0xf7, 0xff, 0xff, 0x81, 0xf7, 0xff, 
+	0xff, 0x7f, 0xf7, 0xff, 0xff, 0x7d, 0x20, 0x00, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x07, 0x84, 0xb5, 0xf0, 0x04, 0x04, 
+	0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x26, 0x00, 
+	0x43, 0xf6, 0x4f, 0x0f, 0x62, 0x3e, 0x61, 0xfe, 
+	0x61, 0xbe, 0xf7, 0xff, 0xfe, 0x9b, 0x2d, 0x00, 
+	0xd0, 0x13, 0x2c, 0x00, 0xd0, 0x11, 0x0c, 0xf0, 
+	0x42, 0x85, 0xd0, 0x0e, 0x42, 0x84, 0xd0, 0x0c, 
+	0x80, 0x3c, 0x80, 0xbd, 0x20, 0x00, 0x61, 0x3e, 
+	0x22, 0x00, 0x61, 0x78, 0xb4, 0x04, 0x4b, 0x05, 
+	0x22, 0xff, 0x21, 0x00, 0xf7, 0xff, 0xfe, 0x28, 
+	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x07, 0x84, 0x2e, 0x00, 0x65, 0x35, 
+	0x56, 0x47, 0x41, 0x38, 0x78, 0x31, 0x36, 0x00, 
+	0xb5, 0x00, 0xb0, 0x81, 0x48, 0x05, 0x69, 0xc0, 
+	0x68, 0x80, 0x46, 0x6b, 0x22, 0x00, 0x21, 0x00, 
+	0xf0, 0x0d, 0xfb, 0x5e, 0xb0, 0x01, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x97, 0x00, 
+	0x26, 0x10, 0x96, 0x01, 0x25, 0x05, 0x01, 0xed, 
+	0x95, 0x02, 0x20, 0xff, 0x30, 0xd1, 0x90, 0x03, 
+	0x97, 0x04, 0x22, 0x00, 0x21, 0x00, 0xb4, 0x06, 
+	0x4c, 0x0d, 0x69, 0xe0, 0x68, 0x81, 0x1c, 0x08, 
+	0xaa, 0x02, 0x1c, 0x3b, 0xf0, 0x0d, 0xfd, 0xc6, 
+	0xb0, 0x02, 0x97, 0x00, 0x20, 0xff, 0x30, 0xd1, 
+	0x90, 0x01, 0x95, 0x02, 0x96, 0x03, 0x97, 0x04, 
+	0x69, 0xe0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0d, 
+	0xfc, 0xf7, 0xf7, 0xff, 0xff, 0xc9, 0xb0, 0x05, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x55, 0x18, 0xb5, 0x90, 0x20, 0x07, 
+	0xb0, 0x85, 0xf0, 0x03, 0xf8, 0xc1, 0x24, 0xff, 
+	0x34, 0xe1, 0x22, 0x05, 0x01, 0xd2, 0x21, 0x00, 
+	0x20, 0x07, 0x1c, 0x23, 0xf0, 0x03, 0xf8, 0xd0, 
+	0x27, 0x00, 0x22, 0x00, 0x21, 0x02, 0x20, 0x07, 
+	0x1c, 0x3b, 0xf0, 0x03, 0xfc, 0x79, 0x22, 0x01, 
+	0x21, 0x01, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x03, 
+	0xfc, 0x2b, 0x22, 0x32, 0x21, 0x32, 0x20, 0x07, 
+	0xf0, 0x03, 0xf9, 0x86, 0x97, 0x00, 0x97, 0x01, 
+	0x20, 0x05, 0x01, 0xc0, 0x90, 0x02, 0x94, 0x03, 
+	0x97, 0x04, 0x48, 0x06, 0x69, 0xc0, 0x68, 0x80, 
+	0x46, 0x69, 0xf0, 0x0d, 0xfc, 0xc1, 0xf7, 0xff, 
+	0xff, 0x93, 0xb0, 0x05, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0xb4, 0x80, 0x01, 0x00, 0x4b, 0x2a, 0x18, 0xc0, 
+	0x4b, 0x2a, 0x69, 0xdb, 0x69, 0x9f, 0x00, 0x8b, 
+	0x18, 0x59, 0x02, 0x09, 0x18, 0x89, 0x18, 0x79, 
+	0x78, 0x02, 0x70, 0x0a, 0x78, 0x42, 0x1d, 0xcb, 
+	0x33, 0x39, 0x74, 0x1a, 0x78, 0x82, 0x1d, 0xcb, 
+	0x33, 0x99, 0x70, 0x1a, 0x78, 0xc2, 0x1d, 0xcb, 
+	0x33, 0xd9, 0x74, 0x1a, 0x79, 0x02, 0x1d, 0xcb, 
+	0x33, 0xff, 0x33, 0x3a, 0x70, 0x1a, 0x79, 0x42, 
+	0x1d, 0xcb, 0x33, 0xff, 0x33, 0x7a, 0x74, 0x1a, 
+	0x79, 0x82, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0xda, 
+	0x70, 0x1a, 0x79, 0xc2, 0x23, 0x11, 0x01, 0x5b, 
+	0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x02, 0x23, 0x05, 
+	0x01, 0xdb, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0x42, 
+	0x23, 0x0b, 0x01, 0x9b, 0x18, 0xcb, 0x74, 0x1a, 
+	0x7a, 0x82, 0x23, 0x19, 0x01, 0x5b, 0x18, 0xcb, 
+	0x70, 0x1a, 0x7a, 0xc2, 0x23, 0x1b, 0x01, 0x5b, 
+	0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x02, 0x23, 0x0f, 
+	0x01, 0x9b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0x42, 
+	0x23, 0x01, 0x02, 0x9b, 0x18, 0xcb, 0x74, 0x1a, 
+	0x7b, 0x82, 0x23, 0x23, 0x01, 0x5b, 0x18, 0xcb, 
+	0x70, 0x1a, 0x7b, 0xc0, 0x23, 0x25, 0x01, 0x5b, 
+	0x18, 0xc9, 0x74, 0x08, 0xbc, 0x80, 0x47, 0x70, 
+	0x2e, 0x08, 0x07, 0xa8, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0xb0, 0x23, 0x00, 0x1c, 0x07, 0x56, 0xc0, 
+	0x1c, 0x14, 0x1c, 0x0d, 0x28, 0x00, 0xd0, 0x0f, 
+	0x20, 0x50, 0x1c, 0x21, 0xf0, 0x11, 0xfe, 0x7a, 
+	0x19, 0x41, 0x23, 0x00, 0x56, 0xf8, 0x1c, 0x22, 
+	0xf7, 0xff, 0xff, 0x92, 0x23, 0x00, 0x37, 0x01, 
+	0x56, 0xf8, 0x34, 0x01, 0x28, 0x00, 0xd1, 0xef, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 
+	0x06, 0x00, 0x0e, 0x00, 0x04, 0x09, 0x14, 0x09, 
+	0x04, 0x17, 0x14, 0x3f, 0x09, 0x03, 0xb0, 0x81, 
+	0x4a, 0x08, 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, 
+	0x07, 0x00, 0x0f, 0x00, 0x5c, 0x10, 0x70, 0x58, 
+	0x20, 0x00, 0x70, 0x98, 0x46, 0x68, 0x1c, 0x3a, 
+	0xf7, 0xff, 0xff, 0xce, 0xb0, 0x01, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xc0, 
+	0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, 
+	0x14, 0x09, 0x04, 0x17, 0x14, 0x3f, 0x0b, 0x03, 
+	0xb0, 0x82, 0x4a, 0x0f, 0x5c, 0xd4, 0xab, 0x00, 
+	0x70, 0x1c, 0x0a, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
+	0x5c, 0xd4, 0xab, 0x00, 0x70, 0x5c, 0x09, 0x03, 
+	0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00, 
+	0x70, 0x9c, 0x07, 0x00, 0x0f, 0x00, 0x5c, 0x10, 
+	0x70, 0xd8, 0x20, 0x00, 0x71, 0x18, 0x46, 0x68, 
+	0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xa5, 0xb0, 0x02, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x17, 0xc0, 0xb5, 0x90, 0x04, 0x0f, 
+	0x14, 0x3f, 0x04, 0x12, 0x14, 0x12, 0x0f, 0x03, 
+	0xb0, 0x83, 0x49, 0x1b, 0x5c, 0xcc, 0xab, 0x00, 
+	0x70, 0x1c, 0x0e, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 
+	0x5c, 0xcc, 0xab, 0x00, 0x70, 0x5c, 0x0d, 0x03, 
+	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, 0xc0, 0xb5, 0xf0, 0x1c, 0x04, 
+	0x04, 0x10, 0x14, 0x00, 0xb0, 0x81, 0x90, 0x00, 
+	0x04, 0x1e, 0x14, 0x36, 0x22, 0x3c, 0x1c, 0x20, 
+	0x1c, 0x0f, 0xb0, 0x85, 0xf0, 0x11, 0xfe, 0x0e, 
+	0xa3, 0x72, 0xcb, 0x0c, 0xf0, 0x11, 0xfe, 0x1a, 
+	0xf0, 0x11, 0xfe, 0x1c, 0x4d, 0x71, 0x5c, 0x28, 
+	0xab, 0x02, 0x70, 0x18, 0x22, 0x38, 0x1c, 0x20, 
+	0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xff, 0xa3, 0x6b, 
+	0xcb, 0x0c, 0xf0, 0x11, 0xfe, 0x0b, 0xf0, 0x11, 
+	0xfe, 0x0d, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x58, 
+	0x22, 0x34, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 
+	0xfd, 0xf1, 0xa3, 0x64, 0xcb, 0x0c, 0xf0, 0x11, 
+	0xfd, 0xfd, 0xf0, 0x11, 0xfd, 0xff, 0x5c, 0x28, 
+	0xab, 0x02, 0x70, 0x98, 0x22, 0x30, 0x1c, 0x20, 
+	0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xe3, 0xa3, 0x5d, 
+	0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0xef, 0xf0, 0x11, 
+	0xfd, 0xf1, 0x5c, 0x28, 0xab, 0x02, 0x70, 0xd8, 
+	0x22, 0x2c, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 
+	0xfd, 0xd5, 0xa3, 0x56, 0xcb, 0x0c, 0xf0, 0x11, 
+	0xfd, 0xe1, 0xf0, 0x11, 0xfd, 0xe3, 0x5c, 0x28, 
+	0xab, 0x03, 0x70, 0x18, 0x22, 0x28, 0x1c, 0x20, 
+	0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xc7, 0xa3, 0x4f, 
+	0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0xd3, 0xf0, 0x11, 
+	0xfd, 0xd5, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x58, 
+	0x22, 0x24, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 
+	0xfd, 0xb9, 0xa3, 0x48, 0xcb, 0x0c, 0xf0, 0x11, 
+	0xfd, 0xc5, 0xf0, 0x11, 0xfd, 0xc7, 0x5c, 0x28, 
+	0xab, 0x03, 0x70, 0x98, 0x22, 0x20, 0x1c, 0x20, 
+	0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xab, 0xa3, 0x41, 
+	0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0xb7, 0xf0, 0x11, 
+	0xfd, 0xb9, 0x5c, 0x28, 0xab, 0x03, 0x70, 0xd8, 
+	0x22, 0x1c, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 
+	0xfd, 0x9d, 0xa3, 0x3a, 0xcb, 0x0c, 0xf0, 0x11, 
+	0xfd, 0xa9, 0xf0, 0x11, 0xfd, 0xab, 0x5c, 0x28, 
+	0xab, 0x00, 0x70, 0x18, 0x22, 0x18, 0x1c, 0x20, 
+	0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x8f, 0xa3, 0x33, 
+	0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0x9b, 0xf0, 0x11, 
+	0xfd, 0x9d, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x58, 
+	0x22, 0x14, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 
+	0xfd, 0x81, 0xa3, 0x2c, 0xcb, 0x0c, 0xf0, 0x11, 
+	0xfd, 0x8d, 0xf0, 0x11, 0xfd, 0x8f, 0x5c, 0x28, 
+	0xab, 0x00, 0x70, 0x98, 0x22, 0x10, 0x1c, 0x20, 
+	0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x73, 0xa3, 0x25, 
+	0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0x7f, 0xf0, 0x11, 
+	0xfd, 0x81, 0x5c, 0x28, 0xab, 0x00, 0x70, 0xd8, 
+	0x22, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 
+	0xfd, 0x65, 0xa3, 0x1e, 0xcb, 0x0c, 0xf0, 0x11, 
+	0xfd, 0x71, 0xf0, 0x11, 0xfd, 0x73, 0x5c, 0x28, 
+	0xab, 0x01, 0x70, 0x18, 0x22, 0x08, 0x1c, 0x20, 
+	0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x57, 0xa3, 0x17, 
+	0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0x63, 0xf0, 0x11, 
+	0xfd, 0x65, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x58, 
+	0x22, 0x04, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 
+	0xfd, 0x49, 0xa3, 0x10, 0xcb, 0x0c, 0xf0, 0x11, 
+	0xfd, 0x55, 0xf0, 0x11, 0xfd, 0x57, 0x5c, 0x28, 
+	0xab, 0x01, 0x70, 0x98, 0xa3, 0x0b, 0xcb, 0x0c, 
+	0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x4a, 
+	0xf0, 0x11, 0xfd, 0x4c, 0x5c, 0x28, 0xab, 0x01, 
+	0x70, 0xd8, 0x20, 0x00, 0x73, 0x18, 0x46, 0x68, 
+	0x99, 0x05, 0x1c, 0x32, 0x33, 0x0c, 0xf7, 0xff, 
+	0xfe, 0x6f, 0xb0, 0x06, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 
+	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xc0, 
+	0x21, 0x00, 0xb0, 0x81, 0x91, 0x00, 0xe0, 0x02, 
+	0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0x99, 0x00, 
+	0x42, 0x81, 0xdb, 0xf9, 0xb0, 0x01, 0x47, 0x70, 
+	0xb5, 0xf0, 0x06, 0x06, 0x0e, 0x36, 0x25, 0x02, 
+	0x48, 0x0d, 0x60, 0x05, 0x27, 0x07, 0x4c, 0x0d, 
+	0x60, 0x25, 0x20, 0x01, 0x40, 0xb8, 0x40, 0x30, 
+	0xd0, 0x01, 0x20, 0x03, 0xe0, 0x00, 0x20, 0x02, 
+	0x49, 0x09, 0x60, 0x08, 0x20, 0x0a, 0xf7, 0xff, 
+	0xff, 0xdf, 0x20, 0x03, 0x60, 0x20, 0x20, 0x0c, 
+	0xf7, 0xff, 0xff, 0xda, 0x3f, 0x01, 0xd5, 0xeb, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x13, 0x00, 
+	0x6e, 0x00, 0x12, 0x00, 0xb5, 0x80, 0x06, 0x00, 
+	0x0e, 0x00, 0x06, 0x0f, 0x0e, 0x3f, 0x06, 0x00, 
+	0x0e, 0x00, 0x23, 0x80, 0x43, 0x18, 0xf7, 0xff, 
+	0xff, 0xcf, 0x20, 0x14, 0xf7, 0xff, 0xff, 0xc0, 
+	0x1c, 0x38, 0xf7, 0xff, 0xff, 0xc9, 0x20, 0x03, 
+	0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0x49, 0x04, 
+	0x60, 0x08, 0x49, 0x04, 0x60, 0x08, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x14, 0x00, 
+	0x6e, 0x00, 0x12, 0x00, 0x6e, 0x00, 0x13, 0x00, 
+	0xb5, 0x00, 0x21, 0x01, 0x20, 0x02, 0xf7, 0xff, 
+	0xff, 0xd9, 0x48, 0x10, 0xf7, 0xff, 0xff, 0xa4, 
+	0x21, 0x00, 0x20, 0x02, 0xf7, 0xff, 0xff, 0xd2, 
+	0x48, 0x0d, 0xf7, 0xff, 0xff, 0x9d, 0x21, 0x44, 
+	0x20, 0x00, 0xf7, 0xff, 0xff, 0xcb, 0x21, 0x81, 
+	0x20, 0x01, 0xf7, 0xff, 0xff, 0xc7, 0x21, 0xf0, 
+	0x20, 0x02, 0xf7, 0xff, 0xff, 0xc3, 0x21, 0x45, 
+	0x20, 0x03, 0xf7, 0xff, 0xff, 0xbf, 0x21, 0x45, 
+	0x20, 0x04, 0xf7, 0xff, 0xff, 0xbb, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x20, 
+	0x00, 0x00, 0xc3, 0x50, 0xb5, 0x80, 0x06, 0x07, 
+	0x0e, 0x3f, 0x06, 0x08, 0x0e, 0x00, 0x28, 0x45, 
+	0xdd, 0x00, 0x20, 0x45, 0x1d, 0xc1, 0x31, 0x79, 
+	0x20, 0x03, 0xf7, 0xff, 0xff, 0xa7, 0x2f, 0x45, 
+	0xdd, 0x00, 0x27, 0x45, 0x20, 0x04, 0x1d, 0xf9, 
+	0x31, 0x79, 0xf7, 0xff, 0xff, 0x9f, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0xf0, 0x15, 
+	0xfb, 0xad, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
+	0xf0, 0x15, 0xfb, 0xac, 0xf0, 0x15, 0xfb, 0xa6, 
+	0x23, 0x01, 0x03, 0x9b, 0x43, 0x18, 0xf0, 0x15, 
+	0xfb, 0xa5, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
+	0xf0, 0x15, 0xfb, 0x9c, 0x4b, 0x05, 0x40, 0x18, 
+	0xf0, 0x15, 0xfb, 0x9c, 0xf0, 0x15, 0xfb, 0x96, 
+	0x4b, 0x03, 0x40, 0x18, 0xf0, 0x15, 0xfb, 0x96, 
+	0xbc, 0x08, 0x47, 0x18, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xdf, 0xff, 0xb5, 0x80, 0x1c, 0x07, 
+	0xf7, 0xff, 0xff, 0xd8, 0x07, 0xf8, 0x0f, 0x40, 
+	0x49, 0x0a, 0x58, 0x08, 0x0c, 0x39, 0xd3, 0x05, 
+	0x23, 0x01, 0x02, 0x5b, 0x68, 0x01, 0x43, 0x19, 
+	0x60, 0x01, 0xe0, 0x03, 0x68, 0x01, 0x4b, 0x06, 
+	0x40, 0x19, 0x60, 0x01, 0xf0, 0x0e, 0xf8, 0x9a, 
+	0xf7, 0xff, 0xff, 0xd5, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x48, 
+	0xff, 0xff, 0xfd, 0xff, 0xb5, 0x00, 0x4a, 0x09, 
+	0x1f, 0x11, 0x20, 0x0e, 0xf0, 0x0e, 0xf8, 0x44, 
+	0x28, 0x00, 0xd1, 0x09, 0x48, 0x06, 0xf0, 0x0e, 
+	0xf8, 0x85, 0x49, 0x06, 0x20, 0x0e, 0xf0, 0x15, 
+	0xfb, 0x65, 0xf7, 0xff, 0xff, 0xbc, 0x20, 0x00, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xe4, 
+	0x2e, 0x08, 0x1a, 0x3c, 0x2e, 0x00, 0x6d, 0x17, 
+	0xb5, 0x00, 0xf7, 0xff, 0xff, 0x9f, 0x21, 0x00, 
+	0x20, 0x0e, 0xf0, 0x15, 0xfb, 0x53, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0x00, 0x48, 0x05, 0x7c, 0x01, 
+	0x29, 0x01, 0xd1, 0x05, 0x69, 0x41, 0x29, 0xff, 
+	0xd0, 0x02, 0x20, 0x01, 0xf0, 0x00, 0xf8, 0x04, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xd0, 
+	0xb5, 0x90, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x07, 
+	0xf7, 0xff, 0xff, 0x84, 0x48, 0x11, 0x68, 0x01, 
+	0x00, 0x49, 0x08, 0x49, 0x07, 0xfa, 0x43, 0x11, 
+	0x0a, 0x09, 0x02, 0x09, 0x43, 0x21, 0x60, 0x01, 
+	0x68, 0xc2, 0x2a, 0x00, 0xd1, 0x11, 0x68, 0x82, 
+	0x1c, 0x53, 0x68, 0x82, 0x60, 0x83, 0x00, 0x92, 
+	0x4b, 0x09, 0x50, 0x99, 0x68, 0x81, 0x29, 0x64, 
+	0xd1, 0x01, 0x21, 0x00, 0x60, 0x81, 0x68, 0x81, 
+	0x68, 0x42, 0x42, 0x91, 0xd1, 0x01, 0x21, 0x01, 
+	0x60, 0xc1, 0xf7, 0xff, 0xff, 0x74, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xd0, 
+	0x2e, 0x08, 0x4c, 0xf0, 0xb5, 0x90, 0x1c, 0x07, 
+	0xf7, 0xff, 0xff, 0x58, 0x48, 0x10, 0x68, 0xc1, 
+	0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x41, 
+	0x68, 0x82, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x41, 
+	0x1c, 0x4a, 0x68, 0x41, 0x60, 0x42, 0x00, 0x89, 
+	0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x41, 
+	0x29, 0x64, 0xd1, 0x00, 0x60, 0x44, 0x60, 0xc4, 
+	0xf7, 0xff, 0xff, 0x51, 0x20, 0x01, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x4b, 
+	0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x17, 0xd0, 0x2e, 0x08, 0x4c, 0xf0, 
+	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, 
+	0x21, 0x00, 0xb0, 0x81, 0x91, 0x00, 0xe0, 0x02, 
+	0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0x99, 0x00, 
+	0x42, 0x81, 0xd3, 0xf9, 0xb0, 0x01, 0x47, 0x70, 
+	0xb5, 0xf0, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, 
+	0x49, 0x23, 0x68, 0x09, 0x91, 0x01, 0x26, 0x09, 
+	0x1d, 0xc4, 0x34, 0x19, 0xab, 0x02, 0x70, 0x1d, 
+	0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 
+	0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, 0xab, 0x02, 
+	0xf7, 0xfa, 0xfb, 0x72, 0xb0, 0x01, 0xaf, 0x01, 
+	0x78, 0x3f, 0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, 
+	0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 
+	0x7b, 0x20, 0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, 
+	0xfb, 0x63, 0xb0, 0x01, 0xa9, 0x01, 0x78, 0x09, 
+	0x91, 0x00, 0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, 
+	0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 
+	0x7b, 0x20, 0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, 
+	0xfb, 0x53, 0xb0, 0x01, 0xa8, 0x01, 0x78, 0x00, 
+	0x99, 0x00, 0x42, 0x8f, 0xd1, 0x06, 0x42, 0x87, 
+	0xd1, 0x04, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x1e, 0x70, 0x06, 0x06, 
+	0x0e, 0x36, 0xd1, 0xc3, 0x20, 0xff, 0xb0, 0x03, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x02, 0x56, 0xc8, 0xb5, 0xf0, 0x06, 0x0c, 
+	0x0e, 0x24, 0x06, 0x16, 0x0e, 0x36, 0x25, 0x0a, 
+	0xb0, 0x82, 0xab, 0x00, 0x70, 0x1c, 0x70, 0x5e, 
+	0x1c, 0x07, 0x30, 0x20, 0x90, 0x01, 0x98, 0x01, 
+	0x7b, 0x00, 0x46, 0x69, 0x22, 0x02, 0xf7, 0xfa, 
+	0xfa, 0xcc, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 
+	0xff, 0x9b, 0x1c, 0x01, 0x2c, 0x00, 0xd0, 0x05, 
+	0x2c, 0x09, 0xd0, 0x03, 0x2c, 0x1f, 0xd1, 0x03, 
+	0x20, 0x7f, 0xe0, 0x02, 0x20, 0x5e, 0xe0, 0x00, 
+	0x20, 0xff, 0x40, 0x71, 0x40, 0x08, 0xd1, 0x03, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x1e, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xd1, 0xde, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0x90, 0x1c, 0x07, 0x2a, 0x00, 0xd0, 0x01, 
+	0x24, 0x09, 0xe0, 0x00, 0x24, 0x00, 0x00, 0x90, 
+	0x19, 0xc0, 0x6c, 0x02, 0x42, 0x8a, 0xd0, 0x15, 
+	0x64, 0x01, 0x20, 0x03, 0x4a, 0x19, 0x29, 0x01, 
+	0xd0, 0x13, 0x29, 0x02, 0xd0, 0x1f, 0x29, 0x03, 
+	0xd1, 0x0c, 0x60, 0x10, 0x1c, 0x38, 0x1c, 0x21, 
+	0xf7, 0xff, 0xff, 0x66, 0x23, 0xf3, 0x40, 0x18, 
+	0x22, 0x08, 0x43, 0x02, 0x1c, 0x38, 0x1c, 0x21, 
+	0xf7, 0xff, 0xff, 0xac, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x60, 0x10, 0x1c, 0x38, 0x1c, 0x21, 
+	0xf7, 0xff, 0xff, 0x56, 0x22, 0xf3, 0x40, 0x02, 
+	0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x9e, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 
+	0x1c, 0x21, 0xf7, 0xff, 0xff, 0x49, 0x23, 0xf3, 
+	0x40, 0x18, 0x22, 0x04, 0x43, 0x02, 0x1c, 0x38, 
+	0x1c, 0x21, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x11, 0x00, 
+	0xb5, 0xf0, 0x1c, 0x0c, 0x68, 0x41, 0x68, 0x09, 
+	0x68, 0x80, 0x1c, 0x1f, 0x28, 0x00, 0xd0, 0x01, 
+	0x6b, 0x8b, 0xe0, 0x00, 0x23, 0x00, 0x6b, 0x0e, 
+	0x43, 0x32, 0x6b, 0xcd, 0x43, 0x2a, 0x43, 0x1a, 
+	0x43, 0x1e, 0x1c, 0x15, 0x1c, 0x02, 0x1c, 0x08, 
+	0x21, 0x01, 0xf7, 0xff, 0xff, 0xa5, 0x20, 0x00, 
+	0x2f, 0x00, 0xdd, 0x07, 0x88, 0x29, 0x54, 0x21, 
+	0x88, 0x31, 0x54, 0x21, 0x30, 0x01, 0x35, 0x02, 
+	0x42, 0xb8, 0xdb, 0xf7, 0x1c, 0x38, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x68, 0x41, 
+	0x68, 0x0c, 0x68, 0x80, 0x1c, 0x1f, 0x28, 0x00, 
+	0xd0, 0x01, 0x6b, 0xa6, 0xe0, 0x00, 0x26, 0x00, 
+	0x6b, 0x21, 0x43, 0x11, 0x6b, 0xe2, 0x43, 0x11, 
+	0x43, 0x31, 0x1c, 0x02, 0x1c, 0x0d, 0x21, 0x01, 
+	0x1c, 0x20, 0xf7, 0xff, 0xff, 0x81, 0x20, 0x00, 
+	0x2f, 0x00, 0xdd, 0x09, 0x99, 0x01, 0x5c, 0x09, 
+	0x80, 0x29, 0x6b, 0x21, 0x19, 0x89, 0x88, 0x09, 
+	0x30, 0x01, 0x35, 0x02, 0x42, 0xb8, 0xdb, 0xf5, 
+	0x1c, 0x38, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0xb0, 0x68, 0x42, 0x68, 0x17, 
+	0x68, 0x82, 0x2a, 0x00, 0xd0, 0x01, 0x6b, 0xbc, 
+	0xe0, 0x00, 0x24, 0x00, 0x08, 0x48, 0xd3, 0x0a, 
+	0x23, 0xfe, 0x40, 0x19, 0x6b, 0x38, 0x43, 0x08, 
+	0x6b, 0x79, 0x43, 0x08, 0x6b, 0xf9, 0x43, 0x08, 
+	0x43, 0x20, 0x1c, 0x05, 0xe0, 0x05, 0x6b, 0x38, 
+	0x43, 0x08, 0x6b, 0xf9, 0x43, 0x08, 0x43, 0x20, 
+	0x1c, 0x05, 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 
+	0xff, 0x4f, 0x6b, 0x38, 0x43, 0x20, 0x88, 0x29, 
+	0x88, 0x01, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 
+	0x06, 0x15, 0x0e, 0x2d, 0x68, 0x42, 0x68, 0x13, 
+	0x68, 0x82, 0x2a, 0x00, 0xd0, 0x01, 0x6b, 0x98, 
+	0xe0, 0x00, 0x20, 0x00, 0x07, 0xcc, 0x0f, 0xe4, 
+	0xd0, 0x08, 0x6b, 0x1f, 0x43, 0x39, 0x6b, 0x5f, 
+	0x43, 0x39, 0x6b, 0xdf, 0x43, 0x39, 0x43, 0x01, 
+	0x1c, 0x0f, 0xe0, 0x05, 0x6b, 0x1f, 0x43, 0x39, 
+	0x6b, 0xdf, 0x43, 0x39, 0x43, 0x01, 0x1c, 0x0f, 
+	0x21, 0x02, 0x1c, 0x18, 0xf7, 0xff, 0xff, 0x24, 
+	0x80, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x47, 0x70, 0xb5, 0x80, 0x68, 0x41, 0x68, 0x0a, 
+	0x68, 0x80, 0x28, 0x00, 0xd0, 0x01, 0x21, 0x09, 
+	0xe0, 0x00, 0x21, 0x00, 0x27, 0x00, 0x1c, 0x10, 
+	0x6c, 0xd2, 0xf0, 0x11, 0xf9, 0xdb, 0x08, 0x40, 
+	0xd3, 0x00, 0x27, 0x01, 0x1c, 0x38, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x68, 0x42, 
+	0x68, 0x17, 0x68, 0x80, 0x28, 0x00, 0xd0, 0x01, 
+	0x24, 0x09, 0xe0, 0x00, 0x24, 0x00, 0x29, 0x00, 
+	0xd0, 0x16, 0x29, 0x01, 0xd0, 0x21, 0x29, 0x02, 
+	0xd1, 0x0e, 0x22, 0x80, 0x6c, 0xbb, 0x1c, 0x38, 
+	0x1c, 0x21, 0xf0, 0x11, 0xf9, 0xc1, 0x48, 0x1e, 
+	0xf7, 0xff, 0xfe, 0x66, 0x22, 0x00, 0x6c, 0xbb, 
+	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0xb8, 
+	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 
+	0xf9, 0xad, 0x22, 0x9f, 0x40, 0x02, 0x6c, 0xbb, 
+	0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0xa8, 
+	0xe7, 0xee, 0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21, 
+	0xf0, 0x11, 0xf9, 0xa0, 0x22, 0x20, 0x43, 0x02, 
+	0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 
+	0xf9, 0x9b, 0x25, 0x00, 0x6c, 0xfa, 0x1c, 0x38, 
+	0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x93, 0x1c, 0x06, 
+	0x09, 0x80, 0xd2, 0x05, 0x20, 0x14, 0xf7, 0xff, 
+	0xfe, 0x37, 0x35, 0x01, 0x2d, 0x0a, 0xdb, 0xf1, 
+	0x22, 0x40, 0x43, 0x32, 0x6c, 0xbb, 0x1c, 0x38, 
+	0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x85, 0xe7, 0xcb, 
+	0x00, 0x01, 0x86, 0xa0, 0xb5, 0x80, 0x49, 0x0f, 
+	0x4f, 0x0f, 0x8e, 0xfa, 0x20, 0x00, 0x43, 0xc0, 
+	0x2a, 0x00, 0xd1, 0x13, 0x8d, 0xba, 0x06, 0x12, 
+	0x0e, 0x12, 0x2a, 0x0c, 0xd1, 0x0e, 0x8d, 0xf8, 
+	0x28, 0x00, 0xd0, 0x09, 0x8d, 0xf8, 0x1e, 0x82, 
+	0xb4, 0x04, 0x78, 0x4a, 0x1c, 0x8b, 0x78, 0x09, 
+	0x48, 0x06, 0xf0, 0x00, 0xfd, 0x69, 0xb0, 0x01, 
+	0x20, 0x00, 0x85, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x4e, 0x80, 
+	0x48, 0x08, 0x8d, 0x81, 0x29, 0x00, 0xd0, 0x02, 
+	0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, 0x21, 0x0c, 
+	0x85, 0x81, 0x21, 0x01, 0x02, 0xc9, 0x85, 0xc1, 
+	0x21, 0x09, 0x02, 0x49, 0x86, 0xc1, 0x20, 0x00, 
+	0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 
+	0xb5, 0x90, 0x4f, 0x15, 0x68, 0x38, 0x28, 0x00, 
+	0xd0, 0x23, 0xf7, 0xff, 0xff, 0xbf, 0x48, 0x13, 
+	0x68, 0x00, 0x68, 0x79, 0x1a, 0x41, 0x29, 0x02, 
+	0xd3, 0x1b, 0x60, 0x78, 0x4c, 0x10, 0x8e, 0xa0, 
+	0x4f, 0x10, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 
+	0xf0, 0x00, 0xfc, 0xda, 0x8e, 0xa0, 0x28, 0x00, 
+	0xd1, 0x04, 0x23, 0xc9, 0x00, 0x9b, 0x18, 0xf8, 
+	0xf0, 0x00, 0xfc, 0xd2, 0x69, 0xb8, 0x28, 0x06, 
+	0xd0, 0x05, 0x23, 0x03, 0x02, 0x1b, 0x18, 0xf8, 
+	0x6b, 0xc0, 0x28, 0x06, 0xd1, 0x01, 0xf7, 0xff, 
+	0xff, 0xc3, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x1a, 0x50, 0x2e, 0x08, 0x05, 0xc0, 
+	0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x4e, 0xd0, 
+	0xb5, 0x00, 0x1c, 0x10, 0x1c, 0x1a, 0x1c, 0x03, 
+	0x1c, 0x08, 0x1c, 0x19, 0xf7, 0xf9, 0xfd, 0x06, 
+	0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 
+	0x4f, 0x23, 0x24, 0x02, 0x48, 0x23, 0x60, 0x04, 
+	0x22, 0x50, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf9, 0x57, 0x20, 0x80, 0x1d, 0xf9, 0x31, 0x19, 
+	0x73, 0x08, 0x20, 0x03, 0x07, 0x00, 0x63, 0x38, 
+	0x02, 0xe0, 0x63, 0x78, 0x03, 0x20, 0x63, 0xb8, 
+	0x03, 0x60, 0x63, 0xf8, 0x48, 0x1a, 0x64, 0xb8, 
+	0x48, 0x1a, 0x64, 0xf8, 0x60, 0x3f, 0x48, 0x1a, 
+	0x60, 0xf8, 0x60, 0x7c, 0x24, 0x00, 0x60, 0xbc, 
+	0x48, 0x18, 0x61, 0x78, 0x48, 0x18, 0x61, 0xb8, 
+	0x48, 0x18, 0x61, 0xf8, 0x48, 0x18, 0x62, 0x38, 
+	0x48, 0x18, 0x61, 0x38, 0x48, 0x18, 0x62, 0x78, 
+	0x48, 0x18, 0x62, 0xb8, 0x1c, 0x38, 0xf0, 0x00, 
+	0xf8, 0xcb, 0x4f, 0x17, 0x28, 0x00, 0xd0, 0x03, 
+	0x60, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x01, 0x06, 0x40, 0xf0, 0x15, 0xf8, 0x2d, 
+	0x48, 0x12, 0xf7, 0xff, 0xfd, 0x71, 0x20, 0x01, 
+	0x60, 0x38, 0x48, 0x11, 0x68, 0x00, 0x60, 0x78, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x4e, 0x80, 0x6e, 0x00, 0x11, 0x00, 
+	0x2e, 0x00, 0x6e, 0xe1, 0x2e, 0x00, 0x6e, 0x45, 
+	0x2e, 0x08, 0x4e, 0xd0, 0x2e, 0x00, 0x6f, 0xcd, 
+	0x2e, 0x00, 0x70, 0x19, 0x2e, 0x00, 0x70, 0x67, 
+	0x2e, 0x00, 0x70, 0xbb, 0x2e, 0x00, 0x72, 0xb5, 
+	0x2e, 0x00, 0x71, 0x07, 0x2e, 0x00, 0x71, 0x31, 
+	0x2e, 0x08, 0x1a, 0x50, 0x00, 0x06, 0x1a, 0x80, 
+	0x2e, 0x08, 0x05, 0xc0, 0xb5, 0x00, 0x23, 0xc9, 
+	0x00, 0x9b, 0x43, 0x4b, 0x68, 0xc2, 0x18, 0xd2, 
+	0x60, 0x10, 0x60, 0x91, 0x60, 0x50, 0x1c, 0x10, 
+	0xf0, 0x00, 0xfb, 0xc4, 0x20, 0x00, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0x80, 0x22, 0x80, 0x21, 0x1f, 
+	0x6c, 0x83, 0x1c, 0x07, 0xf0, 0x11, 0xf8, 0x8c, 
+	0x48, 0x3e, 0xf7, 0xff, 0xfd, 0x31, 0x22, 0x55, 
+	0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x83, 0x21, 0x02, 0x6c, 0xfa, 0x1c, 0x38, 
+	0xf0, 0x11, 0xf8, 0x7c, 0x28, 0x55, 0xd0, 0x04, 
+	0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x22, 0x33, 0x21, 0x05, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x71, 0x22, 0x33, 
+	0x21, 0x0e, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x6b, 0x22, 0x21, 0x21, 0x17, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x65, 0x22, 0x00, 
+	0x21, 0x01, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x5f, 0x22, 0x00, 0x21, 0x0a, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x59, 0x22, 0x01, 
+	0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x53, 0x22, 0x01, 0x21, 0x0b, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x4d, 0x22, 0x00, 
+	0x21, 0x03, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x47, 0x22, 0x00, 0x21, 0x0c, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x41, 0x22, 0x00, 
+	0x21, 0x04, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x3b, 0x22, 0x01, 0x21, 0x0d, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x35, 0x22, 0x02, 
+	0x21, 0x1e, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x2f, 0x22, 0x04, 0x21, 0x1c, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x29, 0x22, 0x03, 
+	0x21, 0x1b, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x23, 0x22, 0x01, 0x21, 0x1f, 0x6c, 0xbb, 
+	0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x1d, 0x22, 0x01, 
+	0x21, 0x18, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 
+	0xf8, 0x17, 0x21, 0x1a, 0x6c, 0xfa, 0x1c, 0x38, 
+	0xf0, 0x11, 0xf8, 0x10, 0x20, 0x00, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xc3, 0x50, 
+	0xb5, 0x90, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0x75, 
+	0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x24, 0x00, 
+	0x64, 0x3c, 0x64, 0x7c, 0x1c, 0x38, 0xf0, 0x00, 
+	0xfc, 0x29, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0xb5, 0x00, 0x1c, 0x13, 
+	0x1c, 0x0a, 0x1c, 0x01, 0x1c, 0x18, 0xf0, 0x00, 
+	0xf8, 0xe5, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 
+	0x1c, 0x0b, 0x68, 0x54, 0x69, 0x27, 0x1c, 0x11, 
+	0x2f, 0x00, 0xd0, 0x04, 0x68, 0x89, 0x1c, 0x02, 
+	0x1c, 0x20, 0xf0, 0x10, 0xff, 0xe9, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x69, 0x82, 
+	0x68, 0x44, 0xb0, 0x81, 0x42, 0x8a, 0xd1, 0x03, 
+	0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x22, 0xff, 0xab, 0x00, 0x61, 0x81, 0x70, 0x1a, 
+	0x22, 0x02, 0x70, 0x5a, 0x22, 0x00, 0x70, 0x9a, 
+	0x70, 0xd9, 0x69, 0x27, 0x2f, 0x00, 0xd0, 0x05, 
+	0x46, 0x6a, 0x68, 0x81, 0x23, 0x04, 0x1c, 0x20, 
+	0xf0, 0x10, 0xff, 0xca, 0xb0, 0x01, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x49, 0x04, 
+	0x68, 0x09, 0x31, 0x19, 0x61, 0x01, 0x21, 0x00, 
+	0xf7, 0xff, 0xff, 0xd8, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x05, 0xc0, 0xb5, 0xf0, 0x1c, 0x07, 
+	0x68, 0x40, 0x69, 0x40, 0x25, 0x00, 0xb0, 0x9e, 
+	0x28, 0x00, 0xd1, 0x08, 0x21, 0x02, 0x1c, 0x38, 
+	0xf7, 0xff, 0xff, 0xc8, 0x1c, 0x28, 0xb0, 0x1e, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x23, 0x11, 
+	0x01, 0x5b, 0x18, 0xfc, 0x70, 0x25, 0x23, 0xff, 
+	0x22, 0x00, 0x68, 0x7e, 0x69, 0x76, 0x1c, 0x38, 
+	0x1c, 0x21, 0x33, 0x01, 0xf0, 0x10, 0xff, 0x9a, 
+	0x46, 0x68, 0x22, 0xff, 0x1c, 0x21, 0x32, 0x01, 
+	0xf0, 0x01, 0xfb, 0x08, 0x28, 0x00, 0xda, 0x11, 
+	0x23, 0x03, 0x02, 0x1b, 0x18, 0xf8, 0x6a, 0x01, 
+	0x31, 0x01, 0x62, 0x01, 0x29, 0x64, 0xdd, 0x03, 
+	0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa2, 
+	0x20, 0x00, 0x43, 0xc0, 0xb0, 0x1e, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x46, 0x68, 0x1d, 0xc1, 
+	0x31, 0x6b, 0x23, 0x01, 0x9a, 0x16, 0x68, 0x7c, 
+	0x69, 0xa4, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x72, 
+	0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8e, 
+	0x21, 0x01, 0x68, 0x7a, 0x6a, 0x92, 0x1c, 0x38, 
+	0xf0, 0x10, 0xff, 0x64, 0x1c, 0x28, 0xb0, 0x1e, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
+	0x21, 0x01, 0x68, 0x42, 0x69, 0xd2, 0xf0, 0x10, 
+	0xff, 0x59, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 
+	0x1d, 0xc6, 0x36, 0x19, 0x1c, 0x07, 0xf7, 0xff, 
+	0xff, 0xf2, 0x0a, 0x00, 0xd2, 0x03, 0x20, 0x00, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x02, 
+	0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 
+	0xff, 0x45, 0x1c, 0x04, 0x21, 0x03, 0x68, 0x7a, 
+	0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x3e, 
+	0x02, 0x00, 0x43, 0x20, 0x04, 0x04, 0x0c, 0x24, 
+	0x69, 0xf8, 0x42, 0xa0, 0xda, 0x01, 0x04, 0x04, 
+	0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, 0xdd, 0x09, 
+	0x21, 0x00, 0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 
+	0xf0, 0x10, 0xff, 0x2c, 0x55, 0x70, 0x35, 0x01, 
+	0x42, 0xa5, 0xdb, 0xf5, 0x1c, 0x21, 0xa0, 0x07, 
+	0xf0, 0x10, 0xff, 0x98, 0x69, 0xb8, 0x28, 0x06, 
+	0xd1, 0x04, 0x68, 0xf8, 0x1c, 0x31, 0x1c, 0x22, 
+	0xf0, 0x00, 0xff, 0x5e, 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, 0xfd, 0x1c, 0x38, 
+	0xf7, 0xff, 0xff, 0x99, 0x09, 0xc0, 0xd3, 0x23, 
+	0x06, 0x22, 0x0e, 0x12, 0x21, 0x02, 0x68, 0x7b, 
+	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xf0, 
+	0x12, 0x22, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, 
+	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xe9, 0x26, 0x00, 
+	0x2c, 0x00, 0xdd, 0x09, 0x5d, 0xaa, 0x21, 0x00, 
+	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
+	0xfe, 0xdf, 0x36, 0x01, 0x42, 0xa6, 0xdb, 0xf5, 
+	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x78, 0x08, 0x80, 
+	0xd3, 0x02, 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0x46, 
+	0x22, 0x00, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
+	0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xcd, 0x1c, 0x38, 
+	0xf7, 0xff, 0xff, 0x69, 0x08, 0x80, 0xd3, 0x02, 
+	0xa0, 0x0b, 0xf0, 0x10, 0xff, 0x37, 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, 0x04, 0x22, 0x08, 0x21, 0x01, 
+	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
+	0xfe, 0x8b, 0x21, 0x03, 0x1c, 0x38, 0xf7, 0xff, 
+	0xfe, 0xa9, 0x48, 0x0a, 0x68, 0x00, 0x30, 0x05, 
+	0x61, 0x38, 0x20, 0x00, 0x23, 0x03, 0x02, 0x1b, 
+	0x18, 0xf9, 0x62, 0x08, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73, 
+	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x73, 
+	0x65, 0x74, 0x0a, 0x00, 0x2e, 0x08, 0x05, 0xc0, 
+	0xb5, 0x90, 0x22, 0x00, 0x21, 0x01, 0x68, 0x43, 
+	0x6a, 0x1b, 0x1c, 0x07, 0xf0, 0x10, 0xfe, 0x68, 
+	0x1c, 0x38, 0xf7, 0xff, 0xff, 0x04, 0x23, 0x40, 
+	0x40, 0x18, 0x4c, 0x14, 0xd1, 0x13, 0x68, 0x20, 
+	0x30, 0x05, 0x23, 0x03, 0x02, 0x1b, 0x61, 0x38, 
+	0x18, 0xf8, 0x6a, 0x01, 0x31, 0x01, 0x62, 0x01, 
+	0x29, 0x0a, 0xdd, 0x03, 0x21, 0x00, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfe, 0x74, 0x20, 0x00, 0x43, 0xc0, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x04, 
+	0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 
+	0xf0, 0x10, 0xfe, 0x46, 0x21, 0x04, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfe, 0x64, 0x68, 0x20, 0x30, 0x05, 
+	0x61, 0x38, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc0, 
+	0xb5, 0xf0, 0x26, 0xff, 0x36, 0x01, 0x61, 0xc6, 
+	0x1d, 0xc5, 0x35, 0x19, 0x1c, 0x07, 0xf7, 0xff, 
+	0xfe, 0xd6, 0x4c, 0x17, 0x28, 0x00, 0xd1, 0x0d, 
+	0xa0, 0x16, 0xf0, 0x10, 0xfe, 0x9b, 0x21, 0xfe, 
+	0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x47, 0x68, 0x20, 
+	0x61, 0x78, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, 0x02, 0x00, 
+	0x78, 0x69, 0x43, 0x01, 0x61, 0xf9, 0xa0, 0x19, 
+	0xf0, 0x10, 0xfe, 0x88, 0x69, 0xf8, 0x42, 0xb0, 
+	0xdd, 0x00, 0x61, 0xfe, 0x22, 0x02, 0x21, 0x01, 
+	0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 
+	0xfe, 0x0b, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38, 
+	0x21, 0x05, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x26, 
+	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x05, 0xc0, 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, 0x38, 0x21, 0xff, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfd, 0xe4, 0x68, 0x20, 0x61, 0x78, 
+	0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x22, 0x03, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 
+	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0xb5, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfe, 0x51, 0x09, 0xc0, 0xd2, 0x0c, 
+	0xa0, 0x3d, 0xf0, 0x10, 0xfe, 0x1f, 0x21, 0xff, 
+	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xcb, 0x68, 0x20, 
+	0x61, 0x78, 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x22, 0x02, 0x21, 0x02, 0x68, 0x7b, 
+	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x9c, 
+	0x22, 0x00, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, 
+	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x95, 0x69, 0xf8, 
+	0x12, 0x02, 0x21, 0x00, 0x68, 0x7b, 0x6a, 0x1b, 
+	0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x8d, 0x69, 0xf8, 
+	0x06, 0x02, 0x0e, 0x12, 0x21, 0x00, 0x68, 0x7b, 
+	0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x84, 
+	0xa0, 0x34, 0xf0, 0x10, 0xfd, 0xf3, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfe, 0x1d, 0x08, 0x80, 0xd3, 0x02, 
+	0xa0, 0x3e, 0xf0, 0x10, 0xfd, 0xeb, 0x22, 0x00, 
+	0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 
+	0xf0, 0x10, 0xfd, 0x72, 0x68, 0xf8, 0x69, 0xf9, 
+	0xf0, 0x00, 0xfa, 0x3e, 0x48, 0x42, 0x68, 0xf9, 
+	0x4b, 0x42, 0x18, 0xc9, 0x61, 0x48, 0x68, 0xf8, 
+	0x18, 0xc0, 0x61, 0x07, 0x48, 0x40, 0x68, 0xf9, 
+	0x18, 0xc9, 0x61, 0x88, 0x68, 0xf8, 0x18, 0xc0, 
+	0x60, 0xc7, 0x69, 0xf9, 0xa0, 0x3d, 0xf0, 0x10, 
+	0xfd, 0xcd, 0x68, 0x20, 0x61, 0x38, 0x21, 0x06, 
+	0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x77, 0x20, 0x00, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x05, 0xc0, 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, 0x74, 0xf1, 0x00, 0x01, 0x3b, 0x80, 
+	0x2e, 0x00, 0x75, 0x03, 0x63, 0x69, 0x5f, 0x73, 
+	0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x62, 0x75, 0x66, 
+	0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 
+	0x20, 0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a, 
+	0x00, 0x00, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, 
+	0x20, 0xff, 0x30, 0x01, 0x61, 0xf8, 0x21, 0x00, 
+	0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xeb, 0x48, 0x05, 
+	0x68, 0x00, 0x61, 0x38, 0x48, 0x04, 0xf7, 0xfe, 
+	0xf8, 0x2d, 0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc0, 
+	0x00, 0x01, 0x3b, 0x9c, 0xb5, 0x00, 0x68, 0xc0, 
+	0xf7, 0xfe, 0xf8, 0x42, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0x80, 0x1c, 0x1f, 0x06, 0x0b, 0x0e, 0x1b, 
+	0x69, 0x81, 0x29, 0x06, 0xd0, 0x04, 0x20, 0x00, 
+	0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x78, 0x11, 0x29, 0xff, 0xd1, 0x05, 0xf7, 0xff, 
+	0xfc, 0xe5, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x68, 0xc0, 0x1c, 0x11, 0x1c, 0x3a, 
+	0xf0, 0x00, 0xfb, 0x9a, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x69, 0x00, 0x49, 0x04, 0x68, 0x09, 
+	0x1a, 0x40, 0x4b, 0x04, 0x42, 0x98, 0xd2, 0x01, 
+	0x20, 0x00, 0x47, 0x70, 0x20, 0x01, 0x47, 0x70, 
+	0x2e, 0x08, 0x05, 0xc0, 0x80, 0x00, 0x00, 0x00, 
+	0xb5, 0x90, 0x68, 0x44, 0x6a, 0x61, 0x1c, 0x07, 
+	0x29, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x10, 
+	0xfc, 0x7b, 0xe0, 0x00, 0x20, 0x01, 0x08, 0x40, 
+	0xd2, 0x06, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 
+	0xfc, 0x99, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x69, 0xb8, 0x28, 0x00, 0xd1, 0xf9, 0x6a, 0xa2, 
+	0x2a, 0x00, 0xd0, 0x03, 0x21, 0x02, 0x1c, 0x38, 
+	0xf0, 0x10, 0xfc, 0x68, 0x21, 0x01, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfc, 0x88, 0x20, 0x00, 0x23, 0x03, 
+	0x02, 0x1b, 0x18, 0xf9, 0x62, 0x08, 0x48, 0x03, 
+	0x68, 0x00, 0x30, 0x19, 0x61, 0x38, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc0, 
+	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, 0x4b, 0x20, 0x00, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x20, 
+	0x30, 0x05, 0x61, 0x38, 0x1c, 0x38, 0xf7, 0xff, 
+	0xfc, 0x6d, 0xe7, 0xf4, 0x1c, 0x38, 0xf7, 0xff, 
+	0xfd, 0x84, 0xe7, 0xf0, 0x1c, 0x38, 0xf7, 0xff, 
+	0xfd, 0xa7, 0xe7, 0xec, 0x1c, 0x38, 0xf7, 0xff, 
+	0xfe, 0x3f, 0xe7, 0xe8, 0x68, 0xf8, 0xf0, 0x00, 
+	0xfc, 0x71, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 
+	0xf7, 0xff, 0xfc, 0xb1, 0x68, 0xf8, 0xf0, 0x00, 
+	0xfb, 0xf7, 0x68, 0x20, 0x30, 0x02, 0x61, 0x38, 
+	0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc0, 
+	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, 0xe7, 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, 0xfb, 0xb8, 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, 0x2b, 0x21, 0x01, 
+	0x02, 0x49, 0x42, 0x88, 0xdd, 0x01, 0x60, 0x79, 
+	0xe0, 0x00, 0x60, 0x78, 0x22, 0x01, 0x04, 0x12, 
+	0x21, 0x00, 0x1d, 0xf8, 0x30, 0x01, 0xf0, 0x10, 
+	0xfb, 0x6b, 0x20, 0x00, 0x43, 0xc1, 0x00, 0x82, 
+	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, 0x32, 0x4b, 0x0d, 0x18, 0xf8, 
+	0x22, 0xff, 0x21, 0x00, 0x32, 0x01, 0xf0, 0x10, 
+	0xfb, 0x2b, 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, 
+	0xfa, 0xdf, 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, 0xf8, 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, 0x14, 0x06, 0x1a, 0x0e, 0x12, 
+	0xb0, 0x81, 0x92, 0x00, 0x1c, 0x07, 0x1c, 0x08, 
+	0x1c, 0x0d, 0xb0, 0x81, 0xf7, 0xff, 0xfd, 0x8e, 
+	0x90, 0x00, 0x1c, 0x22, 0x1c, 0x03, 0xa1, 0x3e, 
+	0x48, 0x3e, 0xf0, 0x10, 0xf9, 0x5f, 0x68, 0x38, 
+	0x38, 0x02, 0x4b, 0x3d, 0x18, 0xfe, 0x42, 0xa0, 
+	0xda, 0x3a, 0x68, 0x38, 0x38, 0x02, 0x1a, 0x24, 
+	0x22, 0x01, 0x9b, 0x00, 0x1c, 0x30, 0x1c, 0x39, 
+	0xf7, 0xff, 0xfe, 0x4e, 0x9a, 0x01, 0xb4, 0x04, 
+	0x22, 0x00, 0x68, 0x3b, 0x1c, 0x38, 0x1c, 0x31, 
+	0xf7, 0xff, 0xfe, 0x8f, 0xb0, 0x01, 0x28, 0x00, 
+	0xda, 0x05, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x80, 
+	0x19, 0xc0, 0x4b, 0x2e, 0x18, 0xc0, 0x68, 0x80, 
+	0x69, 0x40, 0x68, 0x39, 0x43, 0x48, 0x30, 0x02, 
+	0x18, 0x42, 0x23, 0x01, 0x04, 0x1b, 0x3a, 0x02, 
+	0x42, 0x9a, 0xdd, 0x05, 0x20, 0x00, 0x43, 0xc0, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x18, 0x38, 0x1e, 0x8a, 0x30, 0x08, 0x1c, 0x29, 
+	0xf0, 0x10, 0xf9, 0x54, 0x68, 0x38, 0x18, 0x29, 
+	0x38, 0x02, 0x1e, 0x8d, 0x42, 0xa0, 0xdb, 0xc4, 
+	0x2c, 0x00, 0xd0, 0x30, 0x22, 0x00, 0x9b, 0x00, 
+	0x1c, 0x30, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0x14, 
+	0x9a, 0x01, 0xb4, 0x04, 0x22, 0x00, 0x1c, 0x38, 
+	0x1c, 0x31, 0x1c, 0xa3, 0xf7, 0xff, 0xfe, 0x55, 
+	0xb0, 0x01, 0x28, 0x00, 0xda, 0x05, 0x20, 0x00, 
+	0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x80, 0x19, 0xc0, 0x4b, 0x11, 
+	0x18, 0xc0, 0x68, 0x80, 0x69, 0x40, 0x68, 0x39, 
+	0x43, 0x48, 0x30, 0x02, 0x19, 0x01, 0x23, 0x01, 
+	0x04, 0x1b, 0x42, 0x99, 0xdd, 0x05, 0x20, 0x00, 
+	0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x18, 0x38, 0x30, 0x08, 0x1c, 0x29, 
+	0x1c, 0x22, 0xf0, 0x10, 0xf9, 0x1b, 0x20, 0x00, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x63, 0x69, 0x3a, 0x00, 0x2e, 0x00, 0x7e, 0x5c, 
+	0x00, 0x01, 0x38, 0x08, 0x00, 0x01, 0x39, 0x00, 
+	0xb5, 0xf3, 0xb0, 0x83, 0x1c, 0x07, 0x99, 0x04, 
+	0x00, 0x88, 0x19, 0xc0, 0x4b, 0x27, 0x18, 0xc0, 
+	0x90, 0x02, 0x68, 0x84, 0x4b, 0x26, 0x18, 0xf8, 
+	0x90, 0x01, 0x2c, 0x00, 0xd0, 0x37, 0x25, 0x00, 
+	0x7c, 0x26, 0x69, 0x60, 0x68, 0x39, 0x43, 0x48, 
+	0x7c, 0x61, 0x23, 0x80, 0x40, 0x19, 0x91, 0x00, 
+	0x30, 0x02, 0x19, 0x81, 0x02, 0x5b, 0x39, 0x02, 
+	0x42, 0x99, 0xdd, 0x04, 0xb0, 0x03, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x38, 
+	0x1d, 0xc1, 0x31, 0x01, 0x19, 0x78, 0x1e, 0xb2, 
+	0x4b, 0x18, 0x18, 0xc0, 0xf0, 0x10, 0xf8, 0xe2, 
+	0x19, 0xa8, 0x1e, 0x85, 0x22, 0x01, 0x1c, 0x38, 
+	0x1c, 0x21, 0xf7, 0xff, 0xfe, 0xc4, 0x98, 0x02, 
+	0x68, 0x84, 0x2c, 0x00, 0xd0, 0x02, 0x99, 0x00, 
+	0x29, 0x00, 0xd1, 0xd5, 0x23, 0x01, 0x02, 0xdb, 
+	0x42, 0x9d, 0xda, 0x08, 0x98, 0x01, 0x68, 0xc2, 
+	0x4b, 0x0c, 0x18, 0xf8, 0x9b, 0x01, 0x69, 0x9b, 
+	0x1c, 0x29, 0xf0, 0x10, 0xf8, 0x25, 0x99, 0x04, 
+	0x1c, 0x48, 0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x9b, 0x01, 0x72, 0x58, 0xb0, 0x03, 
+	0xe7, 0xc9, 0x00, 0x00, 0x00, 0x01, 0x3a, 0x80, 
+	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x30, 0x08, 
+	0xb5, 0xf0, 0x21, 0x00, 0x4b, 0x24, 0x18, 0xc4, 
+	0x7a, 0xe7, 0x7a, 0xa2, 0x25, 0x00, 0x2a, 0x00, 
+	0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x22, 0x00, 0xe0, 0x1e, 0x00, 0x7b, 
+	0x18, 0x1e, 0x4b, 0x1e, 0x18, 0xf6, 0x23, 0x08, 
+	0x5e, 0xf3, 0x2b, 0x00, 0xdb, 0x0c, 0x00, 0xbb, 
+	0x18, 0x1e, 0x23, 0x9d, 0x02, 0x5b, 0x18, 0xf3, 
+	0x68, 0x9b, 0x2b, 0x00, 0xd0, 0x04, 0x7c, 0x5e, 
+	0x0a, 0x33, 0xd2, 0x01, 0x21, 0x01, 0xe0, 0x09, 
+	0x37, 0x01, 0xd5, 0x04, 0x42, 0x7f, 0x06, 0xff, 
+	0x0e, 0xff, 0x42, 0x7f, 0xe0, 0x01, 0x06, 0xff, 
+	0x0e, 0xff, 0x32, 0x01, 0x2a, 0x20, 0xda, 0x01, 
+	0x29, 0x00, 0xd0, 0xdc, 0x29, 0x00, 0xd1, 0x04, 
+	0x72, 0xe5, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x72, 0xe7, 0x1c, 0x39, 0xf7, 0xff, 
+	0xff, 0x67, 0x1c, 0x78, 0xd5, 0x04, 0x42, 0x40, 
+	0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x01, 
+	0x06, 0xc0, 0x0e, 0xc0, 0x72, 0xe0, 0x20, 0x01, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x40, 
+	0xb5, 0xb0, 0x78, 0x0b, 0x1c, 0x14, 0x1c, 0x05, 
+	0x1c, 0x0f, 0xa1, 0x0c, 0x48, 0x0c, 0xf0, 0x10, 
+	0xf8, 0x29, 0x78, 0x3a, 0xb4, 0x04, 0x22, 0x01, 
+	0x1c, 0x28, 0x1c, 0x39, 0x1c, 0x23, 0xf7, 0xff, 
+	0xfd, 0x68, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 
+	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x3a, 0x00, 
+	0x2e, 0x00, 0x7e, 0x5c, 0xb5, 0xf0, 0x1c, 0x07, 
+	0x4b, 0x2a, 0x18, 0xc4, 0x7a, 0x65, 0x7a, 0x20, 
+	0x28, 0x00, 0xd1, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x20, 0x00, 0x43, 0xc1, 0xe0, 0x09, 
+	0x35, 0x01, 0xd5, 0x04, 0x42, 0x6d, 0x06, 0xed, 
+	0x0e, 0xed, 0x42, 0x6d, 0xe0, 0x01, 0x06, 0xed, 
+	0x0e, 0xed, 0x30, 0x01, 0x28, 0x20, 0xda, 0x07, 
+	0x00, 0x6a, 0x19, 0xd2, 0x4b, 0x1e, 0x18, 0xd2, 
+	0x23, 0x08, 0x5e, 0xd2, 0x42, 0x8a, 0xd0, 0xeb, 
+	0x00, 0xa8, 0x19, 0xc0, 0x4b, 0x1b, 0x18, 0xc1, 
+	0x68, 0x89, 0x29, 0x00, 0xd0, 0x10, 0x72, 0x65, 
+	0x4b, 0x19, 0x18, 0xc6, 0x68, 0xb1, 0x69, 0x48, 
+	0x68, 0x3a, 0x43, 0x50, 0x7c, 0x09, 0x18, 0x0a, 
+	0x23, 0x01, 0x04, 0x1b, 0x42, 0x9a, 0xdd, 0x08, 
+	0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x00, 0x72, 0x60, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x18, 0x38, 0x69, 0x22, 0x69, 0x63, 
+	0x30, 0x08, 0xf0, 0x0f, 0xff, 0x59, 0x22, 0x00, 
+	0x68, 0xb1, 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xdf, 
+	0x1c, 0x68, 0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x72, 0x60, 0x20, 0x01, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0x01, 0x3b, 0x80, 
+	0x00, 0x01, 0x3b, 0x00, 0x00, 0x01, 0x39, 0x00, 
+	0x00, 0x01, 0x39, 0x80, 0xb5, 0xff, 0xb0, 0x8b, 
+	0x9a, 0x0d, 0x1c, 0x1c, 0x1c, 0x0f, 0x2a, 0x02, 
+	0xda, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0b, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x78, 0x79, 0x91, 0x04, 0x31, 0x02, 0x78, 0x3b, 
+	0x1c, 0x0d, 0x42, 0x83, 0xd0, 0x07, 0x1c, 0x19, 
+	0x1c, 0x02, 0xa0, 0xf9, 0xf0, 0x0f, 0xff, 0x96, 
+	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xec, 0x9a, 0x0d, 
+	0x42, 0x91, 0xdd, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
+	0xe7, 0xe6, 0x1d, 0x39, 0x91, 0x0a, 0x1d, 0xe2, 
+	0x32, 0x59, 0x92, 0x09, 0x1d, 0xe6, 0x36, 0x39, 
+	0x28, 0x1d, 0xd0, 0x63, 0xdc, 0x08, 0x28, 0x15, 
+	0xd0, 0x13, 0x28, 0x1a, 0xd0, 0x5f, 0x28, 0x1b, 
+	0xd0, 0x5e, 0x28, 0x1c, 0xd0, 0x5a, 0xe0, 0x7a, 
+	0x28, 0x20, 0xd0, 0x41, 0x1c, 0xbe, 0x28, 0xc0, 
+	0xd0, 0x74, 0x28, 0xc1, 0xd1, 0x73, 0x98, 0x14, 
+	0x28, 0x1b, 0xd0, 0x71, 0x42, 0x68, 0xb0, 0x0b, 
+	0xe7, 0xc6, 0x78, 0xb8, 0x28, 0x05, 0xd0, 0x02, 
+	0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xc0, 0x78, 0xf8, 
+	0x28, 0x00, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
+	0xe7, 0xba, 0x98, 0x04, 0x1e, 0x82, 0x2a, 0x4f, 
+	0xda, 0x04, 0x99, 0x0a, 0x1c, 0x20, 0xf0, 0x0f, 
+	0xff, 0x89, 0xe0, 0x04, 0x22, 0x4f, 0x99, 0x0a, 
+	0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x83, 0x78, 0xfa, 
+	0x78, 0xb9, 0x9c, 0x0a, 0xa0, 0xe0, 0x1c, 0x23, 
+	0xf0, 0x0f, 0xff, 0x4c, 0x98, 0x04, 0x18, 0x38, 
+	0x1c, 0x47, 0x42, 0xa7, 0xd9, 0x0c, 0x1c, 0x20, 
+	0xf0, 0x0f, 0xff, 0xb8, 0x19, 0x00, 0x1c, 0x44, 
+	0x42, 0xa7, 0xd9, 0x03, 0x1c, 0x21, 0xa0, 0xdd, 
+	0xf0, 0x0f, 0xff, 0x3c, 0x42, 0xa7, 0xd8, 0xf2, 
+	0xa0, 0xd4, 0xf0, 0x0f, 0xff, 0x37, 0xe0, 0xe3, 
+	0x98, 0x04, 0x28, 0x04, 0xd0, 0x02, 0x42, 0x68, 
+	0xb0, 0x0b, 0xe7, 0x89, 0x78, 0xf8, 0x02, 0x00, 
+	0x78, 0xb9, 0x43, 0x08, 0x82, 0x30, 0x79, 0x78, 
+	0x02, 0x00, 0x79, 0x39, 0x43, 0x08, 0x82, 0x70, 
+	0x8a, 0x72, 0x8a, 0x31, 0xa0, 0xd1, 0xf0, 0x0f, 
+	0xff, 0x21, 0xe0, 0xcd, 0xe2, 0x17, 0xe0, 0x00, 
+	0xe0, 0x62, 0x78, 0xb8, 0x07, 0x80, 0x0f, 0x80, 
+	0x30, 0x01, 0x75, 0x30, 0x78, 0xb8, 0x08, 0x80, 
+	0x07, 0x00, 0x0f, 0x00, 0x30, 0x01, 0x75, 0x70, 
+	0x78, 0xf8, 0x9a, 0x09, 0x73, 0x10, 0x20, 0x00, 
+	0x65, 0xa0, 0x7d, 0x31, 0x29, 0x00, 0xdd, 0x0e, 
+	0x18, 0x39, 0x79, 0x09, 0x00, 0xc2, 0x40, 0x91, 
+	0x6d, 0xa2, 0x43, 0x11, 0x65, 0xa1, 0x7d, 0x31, 
+	0x30, 0x01, 0xe0, 0x02, 0xe1, 0x02, 0xe1, 0xf9, 
+	0xe1, 0x4b, 0x42, 0x81, 0xdc, 0xf0, 0x7d, 0x30, 
+	0x30, 0x04, 0x90, 0x03, 0x7d, 0x72, 0x18, 0x39, 
+	0x1d, 0xe0, 0x30, 0x55, 0xf0, 0x0f, 0xff, 0x22, 
+	0x7d, 0x70, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, 
+	0x6d, 0xa1, 0xa0, 0xbc, 0xf0, 0x0f, 0xfe, 0xea, 
+	0x7d, 0x70, 0x28, 0x00, 0xd0, 0x17, 0xa0, 0xbf, 
+	0xf0, 0x0f, 0xfe, 0xe4, 0x21, 0x00, 0x91, 0x02, 
+	0x7d, 0x70, 0x28, 0x00, 0xdd, 0x0c, 0x99, 0x02, 
+	0x18, 0x60, 0x30, 0x40, 0x7f, 0x01, 0xa0, 0xbc, 
+	0xf0, 0x0f, 0xfe, 0xd8, 0x99, 0x02, 0x31, 0x01, 
+	0x91, 0x02, 0x7d, 0x70, 0x42, 0x88, 0xdc, 0xf2, 
+	0xa0, 0xb9, 0xf0, 0x0f, 0xfe, 0xcf, 0x9a, 0x09, 
+	0x7b, 0x11, 0xa0, 0xb8, 0xf0, 0x0f, 0xfe, 0xca, 
+	0x22, 0x1a, 0xb4, 0x04, 0x98, 0x04, 0x9a, 0x0e, 
+	0x1a, 0x12, 0x18, 0x39, 0x20, 0xc0, 0x1c, 0x23, 
+	0xf7, 0xff, 0xff, 0x10, 0xb0, 0x01, 0x28, 0x00, 
+	0xda, 0x6a, 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0x13, 
+	0x78, 0xb8, 0x06, 0x86, 0x0e, 0xb6, 0x1c, 0x31, 
+	0xa0, 0xb1, 0xf0, 0x0f, 0xfe, 0xb3, 0x9a, 0x09, 
+	0x7b, 0x10, 0x42, 0xb0, 0xd1, 0x01, 0x22, 0x01, 
+	0x67, 0x62, 0x78, 0xb8, 0x23, 0xc0, 0x40, 0x18, 
+	0x28, 0xc0, 0xd0, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 
+	0xe6, 0xfe, 0x2e, 0x00, 0xd1, 0x02, 0x1c, 0x28, 
+	0xb0, 0x0b, 0xe6, 0xf9, 0x78, 0xf8, 0x28, 0x04, 
+	0xd0, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xf3, 
+	0x79, 0x38, 0x90, 0x08, 0x23, 0x0b, 0x40, 0x18, 
+	0x28, 0x09, 0xda, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 
+	0xe6, 0xea, 0x20, 0x00, 0x21, 0x00, 0x79, 0x7a, 
+	0x92, 0x07, 0x9a, 0x07, 0x40, 0xca, 0x08, 0x52, 
+	0xd3, 0x05, 0x30, 0x01, 0x18, 0x3a, 0x79, 0x52, 
+	0x0a, 0x12, 0xd3, 0x00, 0x30, 0x01, 0x31, 0x01, 
+	0x29, 0x08, 0xdb, 0xf2, 0x1c, 0x41, 0x98, 0x08, 
+	0x08, 0xc0, 0xd3, 0x22, 0x20, 0x00, 0x18, 0x7a, 
+	0x79, 0x52, 0x92, 0x06, 0x07, 0x92, 0xd0, 0x0a, 
+	0x19, 0xca, 0x79, 0x92, 0x0a, 0x12, 0xd3, 0x05, 
+	0x30, 0x01, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92, 
+	0x0a, 0x12, 0xd2, 0xf9, 0x30, 0x01, 0x9a, 0x06, 
+	0x08, 0x92, 0x07, 0x52, 0xd0, 0x0b, 0x18, 0x0a, 
+	0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd3, 0x05, 
+	0x30, 0x01, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92, 
+	0x0a, 0x12, 0xd2, 0xf9, 0x30, 0x01, 0x18, 0x08, 
+	0x1c, 0x41, 0x18, 0x78, 0x79, 0x40, 0x28, 0x22, 
+	0xd0, 0x03, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xab, 
+	0xe1, 0x49, 0x1c, 0x48, 0x99, 0x08, 0x09, 0x49, 
+	0xd3, 0x05, 0x18, 0x39, 0x79, 0x49, 0x09, 0x49, 
+	0xd3, 0x00, 0x30, 0x02, 0x30, 0x01, 0x99, 0x08, 
+	0x09, 0x49, 0x07, 0x49, 0xd0, 0x1b, 0x22, 0x00, 
+	0x92, 0x01, 0x92, 0x00, 0x18, 0x39, 0x79, 0x49, 
+	0x91, 0x05, 0x08, 0xc9, 0x07, 0x89, 0x0f, 0x89, 
+	0xd0, 0x03, 0x22, 0x01, 0x39, 0x01, 0x40, 0x8a, 
+	0x92, 0x01, 0x99, 0x05, 0x09, 0x49, 0x07, 0x89, 
+	0x0f, 0x89, 0xd0, 0x03, 0x22, 0x01, 0x39, 0x01, 
+	0x40, 0x8a, 0x92, 0x00, 0x99, 0x00, 0x9a, 0x01, 
+	0x18, 0x51, 0x18, 0x08, 0x30, 0x01, 0x1d, 0x41, 
+	0x91, 0x03, 0x22, 0x1b, 0xb4, 0x04, 0x99, 0x04, 
+	0x9a, 0x0e, 0x1a, 0x52, 0x18, 0x79, 0x20, 0xc0, 
+	0x1c, 0x23, 0xf7, 0xff, 0xfe, 0x6b, 0xb0, 0x01, 
+	0x28, 0x00, 0xda, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
+	0xe6, 0x6e, 0x99, 0x03, 0x18, 0x08, 0x22, 0x1b, 
+	0xb4, 0x04, 0x9a, 0x0e, 0x1a, 0x12, 0x18, 0x39, 
+	0x20, 0xc1, 0x1c, 0x23, 0xf7, 0xff, 0xfe, 0x5a, 
+	0xb0, 0x01, 0x28, 0x00, 0xda, 0x02, 0x42, 0x68, 
+	0xb0, 0x0b, 0xe6, 0x5d, 0x9a, 0x09, 0x74, 0x96, 
+	0x9a, 0x09, 0x7c, 0x91, 0xa0, 0x5d, 0xf0, 0x0f, 
+	0xfd, 0xfd, 0xe0, 0xf4, 0x98, 0x14, 0x28, 0x1a, 
+	0xd1, 0x2f, 0x98, 0x04, 0x28, 0x0e, 0xd0, 0x02, 
+	0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x4c, 0x78, 0xb8, 
+	0x28, 0x41, 0xd1, 0x02, 0x78, 0xf8, 0x28, 0x02, 
+	0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x43, 
+	0xa0, 0x5a, 0xf0, 0x0f, 0xfe, 0x5b, 0x99, 0x0a, 
+	0x1c, 0x02, 0xa0, 0x58, 0xf0, 0x0f, 0xfe, 0x78, 
+	0x28, 0x00, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
+	0xe6, 0x36, 0xa0, 0x54, 0xf0, 0x0f, 0xfe, 0x4e, 
+	0x19, 0xc0, 0x1d, 0x01, 0x1d, 0xe0, 0x30, 0x66, 
+	0x22, 0x04, 0x1c, 0x07, 0xf0, 0x0f, 0xfe, 0x92, 
+	0x20, 0x00, 0x9a, 0x09, 0x74, 0x50, 0x1c, 0x3a, 
+	0xa1, 0x4c, 0xa0, 0x4f, 0xf0, 0x0f, 0xfd, 0xca, 
+	0xe0, 0xc1, 0x98, 0x14, 0x28, 0x1b, 0xd1, 0x11, 
+	0xa0, 0x4f, 0xf0, 0x0f, 0xfe, 0x37, 0x1c, 0x31, 
+	0x1c, 0x02, 0xa0, 0x4d, 0xf0, 0x0f, 0xfe, 0x54, 
+	0x28, 0x00, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 
+	0xe6, 0x12, 0xa1, 0x49, 0xa0, 0x4b, 0xf0, 0x0f, 
+	0xfd, 0xb5, 0xe0, 0xac, 0x42, 0x68, 0xb0, 0x0b, 
+	0xe6, 0x0a, 0xa0, 0x4c, 0xf0, 0x0f, 0xfe, 0x22, 
+	0x1c, 0x31, 0x1c, 0x02, 0xa0, 0x49, 0xf0, 0x0f, 
+	0xfe, 0x3f, 0x28, 0x00, 0xe0, 0x96, 0x00, 0x00, 
+	0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x61, 
+	0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 
+	0x72, 0x3a, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 
+	0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 
+	0x78, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x30, 0x78, 
+	0x25, 0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 0x00, 
+	0x76, 0x65, 0x72, 0x73, 0x5f, 0x31, 0x3a, 0x20, 
+	0x25, 0x64, 0x2e, 0x25, 0x64, 0x2c, 0x20, 0x25, 
+	0x73, 0x00, 0x00, 0x00, 0x2c, 0x20, 0x25, 0x73, 
+	0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6e, 0x66, 
+	0x69, 0x64, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, 
+	0x34, 0x78, 0x20, 0x20, 0x30, 0x78, 0x25, 0x30, 
+	0x34, 0x78, 0x0a, 0x00, 0x63, 0x6f, 0x6e, 0x66, 
+	0x69, 0x67, 0x20, 0x62, 0x61, 0x73, 0x65, 0x3a, 
+	0x20, 0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x20, 
+	0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x73, 0x6b, 
+	0x3a, 0x20, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, 
+	0x25, 0x30, 0x32, 0x78, 0x00, 0x00, 0x00, 0x00, 
+	0x20, 0x00, 0x00, 0x00, 0x6c, 0x61, 0x73, 0x74, 
+	0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x20, 
+	0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 0x0a, 0x00, 
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x74, 
+	0x61, 0x62, 0x6c, 0x65, 0x20, 0x6e, 0x62, 0x3a, 
+	0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 0x0a, 
+	0x00, 0x00, 0x00, 0x00, 0x63, 0x66, 0x67, 0x20, 
+	0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 
+	0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 
+	0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 0x20, 
+	0x0a, 0x00, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f, 
+	0x43, 0x49, 0x5f, 0x56, 0x00, 0x00, 0x00, 0x00, 
+	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 
+	0x20, 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0x00, 
+	0x44, 0x56, 0x42, 0x5f, 0x48, 0x4f, 0x53, 0x54, 
+	0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x63, 0x65, 
+	0x5f, 0x65, 0x76, 0x3a, 0x20, 0x25, 0x73, 0x0a, 
+	0x00, 0x00, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f, 
+	0x43, 0x49, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 
+	0x45, 0x00, 0x00, 0x00, 0xd0, 0x02, 0x42, 0x68, 
+	0xb0, 0x0b, 0xe5, 0x65, 0x46, 0x79, 0x39, 0x1c, 
+	0xa0, 0x04, 0xf0, 0x0f, 0xfd, 0x07, 0x1c, 0x28, 
+	0xb0, 0x0b, 0xe5, 0x5d, 0x1c, 0x28, 0xb0, 0x0b, 
+	0xe5, 0x5a, 0x00, 0x00, 0x73, 0x74, 0x63, 0x65, 
+	0x5f, 0x70, 0x64, 0x3a, 0x20, 0x25, 0x73, 0x0a, 
+	0x00, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x26, 0x00, 
+	0x1c, 0x04, 0x20, 0x00, 0x67, 0x60, 0x1c, 0x0d, 
+	0x1c, 0x17, 0xe0, 0x00, 0x36, 0x01, 0x42, 0xbe, 
+	0xda, 0x02, 0x5d, 0xa8, 0x28, 0x1d, 0xd1, 0xf9, 
+	0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 
+	0x20, 0x1d, 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x32, 
+	0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 
+	0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 
+	0x19, 0xa9, 0x20, 0x1c, 0x1c, 0x23, 0xf7, 0xff, 
+	0xfd, 0x21, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 
+	0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 
+	0x1b, 0xba, 0x19, 0xa9, 0x20, 0x15, 0x1c, 0x23, 
+	0xf7, 0xff, 0xfd, 0x10, 0xb0, 0x01, 0x28, 0x00, 
+	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, 0x4c, 0x1c, 0x05, 0xd0, 0x05, 
+	0x00, 0xa8, 0x30, 0x0c, 0xf7, 0xfc, 0xff, 0x56, 
+	0x1c, 0x04, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x22, 
+	0x95, 0x01, 0x1d, 0xe0, 0x30, 0x05, 0x90, 0x02, 
+	0x46, 0x6a, 0xb4, 0x04, 0x25, 0x00, 0x98, 0x04, 
+	0x1c, 0x31, 0xaa, 0x02, 0x1c, 0x2b, 0x1c, 0x27, 
+	0xf0, 0x0c, 0xf9, 0xf2, 0xb0, 0x01, 0x98, 0x00, 
+	0x60, 0x38, 0x28, 0x00, 0xd0, 0x0b, 0x99, 0x05, 
+	0xf0, 0x0c, 0xfb, 0xc8, 0x28, 0x00, 0xd1, 0x02, 
+	0x60, 0x7d, 0x1c, 0x38, 0xe0, 0x07, 0x68, 0x38, 
+	0xa9, 0x01, 0xf0, 0x0c, 0xfa, 0x11, 0x1c, 0x20, 
+	0xf7, 0xfc, 0xff, 0x52, 0x1c, 0x28, 0xb0, 0x03, 
+	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0xff, 0x9c, 0x0b, 0x9d, 0x09, 0x9e, 0x0a, 
+	0xb0, 0x8c, 0x4a, 0x78, 0x92, 0x0b, 0x49, 0x78, 
+	0x91, 0x0a, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, 
+	0x00, 0x81, 0x9a, 0x0b, 0x58, 0x51, 0x29, 0x00, 
+	0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x19, 0x30, 0x01, 
+	0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x15, 0x2c, 0x08, 
+	0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0b, 
+	0x58, 0x10, 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 
+	0xe0, 0xcf, 0x23, 0x20, 0x99, 0x0a, 0x5e, 0xcc, 
+	0x1c, 0x60, 0x84, 0x08, 0x99, 0x0a, 0x5e, 0xc8, 
+	0x28, 0x00, 0xd1, 0x02, 0x20, 0x64, 0x99, 0x0a, 
+	0x84, 0x08, 0x2e, 0x00, 0xd0, 0x03, 0x2e, 0x01, 
+	0xd1, 0x03, 0x22, 0x01, 0xe0, 0x02, 0x22, 0x00, 
+	0xe0, 0x00, 0x22, 0x03, 0x92, 0x01, 0x1c, 0x28, 
+	0xf0, 0x08, 0xfd, 0xfd, 0x90, 0x00, 0x00, 0x80, 
+	0x30, 0x80, 0xf7, 0xfc, 0xfe, 0xeb, 0x1c, 0x07, 
+	0xd0, 0xdd, 0x98, 0x00, 0x1d, 0xc2, 0x32, 0x79, 
+	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0xd0, 
+	0x98, 0x00, 0x60, 0xf8, 0x1d, 0xf8, 0x30, 0x79, 
+	0x61, 0x38, 0x98, 0x0e, 0x86, 0x78, 0x98, 0x0f, 
+	0x86, 0xb8, 0x98, 0x0c, 0x90, 0x02, 0x99, 0x0d, 
+	0x91, 0x03, 0x9a, 0x0e, 0x18, 0x80, 0x38, 0x01, 
+	0x90, 0x04, 0x98, 0x0f, 0x18, 0x08, 0x38, 0x01, 
+	0x90, 0x05, 0xa8, 0x02, 0x1c, 0x29, 0xf0, 0x08, 
+	0xfd, 0xdd, 0x61, 0x78, 0x9a, 0x01, 0x2a, 0x00, 
+	0xd0, 0x0e, 0x2a, 0x01, 0xd1, 0x1e, 0x00, 0x80, 
+	0xf7, 0xfc, 0xfe, 0xc0, 0x61, 0xb8, 0x28, 0x00, 
+	0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00, 
+	0xf0, 0x0f, 0xfb, 0xa6, 0x20, 0x01, 0xe0, 0x0b, 
+	0x00, 0x80, 0xf7, 0xfc, 0xfe, 0xfb, 0x61, 0xb8, 
+	0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 
+	0x21, 0x00, 0xf0, 0x0f, 0xfb, 0x99, 0x20, 0x00, 
+	0x86, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, 
+	0x43, 0x18, 0xe0, 0x0d, 0x61, 0xbe, 0x0e, 0x36, 
+	0x06, 0x36, 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xde, 
+	0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, 
+	0x86, 0x38, 0x69, 0xf8, 0x4b, 0x33, 0x40, 0x18, 
+	0x61, 0xf8, 0x69, 0xb8, 0x28, 0x00, 0xd1, 0x06, 
+	0x69, 0x78, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 
+	0xf7, 0xfc, 0xfe, 0xae, 0xe7, 0x7f, 0x68, 0xf8, 
+	0x90, 0x06, 0x69, 0x38, 0x90, 0x07, 0x69, 0x78, 
+	0x90, 0x08, 0x69, 0xb8, 0x90, 0x09, 0xa8, 0x02, 
+	0x1c, 0x21, 0x1d, 0xfa, 0x32, 0x01, 0xb4, 0x07, 
+	0x1c, 0x2a, 0xb4, 0x04, 0x20, 0x00, 0x9a, 0x05, 
+	0xa9, 0x0a, 0xab, 0x0c, 0xf0, 0x03, 0xf8, 0xb4, 
+	0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 
+	0xf0, 0x00, 0xf8, 0x5f, 0xe7, 0x63, 0x2d, 0x00, 
+	0xd0, 0x09, 0x2d, 0x01, 0xd0, 0x07, 0x2d, 0x02, 
+	0xd0, 0x05, 0x2d, 0x03, 0xd0, 0x03, 0x23, 0x02, 
+	0x69, 0xf8, 0x43, 0x18, 0x61, 0xf8, 0x85, 0xfc, 
+	0x2c, 0x08, 0xd2, 0x02, 0x00, 0xa0, 0x9a, 0x0b, 
+	0x50, 0x17, 0x20, 0x01, 0x24, 0x00, 0x63, 0xf8, 
+	0x63, 0xbc, 0x85, 0xbd, 0x21, 0x01, 0x1c, 0x38, 
+	0xf0, 0x00, 0xf9, 0x0c, 0x99, 0x0a, 0x8c, 0x88, 
+	0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, 0xf0, 0x00, 
+	0xf8, 0xbe, 0x22, 0x00, 0x21, 0x00, 0x1c, 0x38, 
+	0xf0, 0x00, 0xf8, 0x93, 0x98, 0x18, 0x60, 0x38, 
+	0x98, 0x18, 0x28, 0x00, 0xd0, 0x06, 0x22, 0x00, 
+	0x21, 0x03, 0x1c, 0x23, 0x9c, 0x18, 0x1c, 0x38, 
+	0xf0, 0x0f, 0xfa, 0xd4, 0x68, 0xb8, 0x60, 0x78, 
+	0x1c, 0x38, 0xb0, 0x0c, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x58, 
+	0x2e, 0x08, 0x1a, 0x58, 0xff, 0xff, 0x7f, 0xff, 
+	0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x82, 0x28, 0x00, 
+	0xd0, 0x13, 0x68, 0x78, 0x28, 0x00, 0xd1, 0x10, 
+	0x68, 0xb8, 0x90, 0x00, 0x1d, 0xf8, 0x30, 0x05, 
+	0x90, 0x01, 0x46, 0x69, 0x68, 0x38, 0xf0, 0x0c, 
+	0xf8, 0xfb, 0x22, 0x0c, 0x21, 0x00, 0x1c, 0x38, 
+	0xf0, 0x0f, 0xfb, 0x06, 0x1c, 0x38, 0xf7, 0xfc, 
+	0xfe, 0x37, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x84, 
+	0x28, 0x00, 0xd1, 0x03, 0xb0, 0x04, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x23, 0x00, 
+	0x49, 0x1d, 0x00, 0x82, 0x58, 0x8c, 0x42, 0xbc, 
+	0xd1, 0x00, 0x50, 0x8b, 0x30, 0x01, 0x28, 0x08, 
+	0xdb, 0xf7, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x00, 
+	0xf8, 0xbc, 0x68, 0xf8, 0x90, 0x00, 0x69, 0x38, 
+	0x90, 0x01, 0x69, 0x78, 0x90, 0x02, 0x69, 0xb8, 
+	0x90, 0x03, 0x46, 0x68, 0x1d, 0xc2, 0x32, 0x01, 
+	0x46, 0x69, 0x68, 0xb8, 0xf0, 0x03, 0xfb, 0x38, 
+	0x6a, 0x38, 0x28, 0x00, 0xd0, 0x03, 0x68, 0x41, 
+	0x39, 0x01, 0x60, 0x41, 0x30, 0x04, 0x69, 0xf8, 
+	0x0c, 0x00, 0xd3, 0x0c, 0x23, 0x30, 0x5e, 0xf8, 
+	0x28, 0x00, 0xd1, 0x03, 0x69, 0xb8, 0xf7, 0xfc, 
+	0xfe, 0x2b, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, 
+	0x69, 0xb8, 0xf7, 0xfc, 0xfd, 0xf5, 0x22, 0x80, 
+	0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfa, 0xbc, 
+	0x1c, 0x38, 0xf7, 0xfc, 0xfd, 0xed, 0xe7, 0xbd, 
+	0x2e, 0x08, 0x1a, 0x58, 0x28, 0x00, 0xd0, 0x08, 
+	0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, 
+	0x28, 0x03, 0xd1, 0x08, 0x20, 0xff, 0x30, 0x01, 
+	0x47, 0x70, 0x20, 0x02, 0x47, 0x70, 0x20, 0x04, 
+	0x47, 0x70, 0x20, 0x10, 0x47, 0x70, 0x20, 0x00, 
+	0x47, 0x70, 0xb5, 0x90, 0x1c, 0x07, 0x06, 0x08, 
+	0x0e, 0x00, 0x06, 0x14, 0x0e, 0x24, 0x28, 0x00, 
+	0xd0, 0x0a, 0x21, 0x03, 0x68, 0xb8, 0xf0, 0x04, 
+	0xfc, 0x3f, 0x68, 0xb8, 0x1c, 0x21, 0xf0, 0x04, 
+	0xfc, 0xe7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x34, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
+	0x06, 0x09, 0xd0, 0x02, 0x68, 0x80, 0x21, 0x02, 
+	0xe0, 0x01, 0x68, 0x80, 0x21, 0x00, 0xf0, 0x04, 
+	0xfc, 0x27, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 
+	0x06, 0x09, 0x0e, 0x09, 0x28, 0x00, 0xd0, 0x02, 
+	0x68, 0x80, 0xf0, 0x04, 0xfe, 0x2d, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0xb0, 0x23, 0x05, 0x43, 0x18, 
+	0x4d, 0x08, 0x84, 0xa8, 0x27, 0x00, 0x4c, 0x08, 
+	0x00, 0xb8, 0x58, 0x20, 0x8c, 0xa9, 0x06, 0x09, 
+	0x0e, 0x09, 0xf7, 0xff, 0xff, 0xe8, 0x37, 0x01, 
+	0x2f, 0x08, 0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x58, 
+	0x2e, 0x08, 0x1a, 0x58, 0x48, 0x01, 0x23, 0x24, 
+	0x5e, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x58, 
+	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x28, 0x00, 
+	0xd0, 0x15, 0x6a, 0x20, 0x28, 0x00, 0xd0, 0x06, 
+	0x42, 0xb8, 0xd0, 0x10, 0x68, 0x41, 0x39, 0x01, 
+	0x60, 0x41, 0x20, 0x00, 0x62, 0x20, 0x2f, 0x00, 
+	0xd0, 0x09, 0x68, 0xa0, 0x68, 0x39, 0xf0, 0x0c, 
+	0xf8, 0x39, 0x28, 0x00, 0xd1, 0x03, 0x62, 0x27, 
+	0x68, 0x78, 0x30, 0x01, 0x60, 0x78, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 
+	0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 
+	0x68, 0x80, 0xf0, 0x04, 0xfd, 0x2d, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 
+	0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 
+	0x68, 0xb8, 0xf0, 0x04, 0xf8, 0xc5, 0x2c, 0x00, 
+	0xd0, 0x03, 0x23, 0x01, 0x69, 0xf8, 0x43, 0x18, 
+	0xe0, 0x02, 0x69, 0xf8, 0x08, 0x40, 0x00, 0x40, 
+	0x61, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x20, 0x01, 0x21, 0x07, 0x07, 0x09, 0x63, 0x88, 
+	0x47, 0x70, 0x00, 0x00, 0xb5, 0x90, 0x9c, 0x03, 
+	0x9f, 0x04, 0xb0, 0x85, 0x91, 0x00, 0x92, 0x01, 
+	0x93, 0x02, 0x94, 0x03, 0x97, 0x04, 0x68, 0x80, 
+	0x46, 0x69, 0xf0, 0x0a, 0xff, 0x89, 0xb0, 0x05, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 
+	0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, 
+	0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x01, 0x80, 
+	0x06, 0x05, 0x0e, 0x2d, 0x95, 0x00, 0x68, 0x18, 
+	0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 
+	0x08, 0xc0, 0x90, 0x04, 0x99, 0x07, 0x68, 0x48, 
+	0x99, 0x04, 0x43, 0x48, 0x99, 0x07, 0x68, 0x09, 
+	0x08, 0xc9, 0x18, 0x0f, 0x97, 0x03, 0x21, 0x00, 
+	0x91, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, 
+	0xdd, 0x5e, 0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, 
+	0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08, 0x18, 0x81, 
+	0x1c, 0x08, 0xd5, 0x00, 0x30, 0x03, 0x10, 0x80, 
+	0x29, 0x00, 0xda, 0x04, 0x42, 0x49, 0x07, 0x89, 
+	0x0f, 0x89, 0x42, 0x49, 0xe0, 0x01, 0x07, 0x89, 
+	0x0f, 0x89, 0x00, 0x4a, 0x9d, 0x00, 0x41, 0x15, 
+	0x1c, 0x2b, 0x06, 0x2d, 0x0e, 0x2d, 0x27, 0xc0, 
+	0x40, 0xd7, 0x06, 0x3a, 0x0e, 0x12, 0x9b, 0x06, 
+	0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, 
+	0x19, 0xdb, 0x33, 0x88, 0x78, 0x1f, 0x33, 0x01, 
+	0x93, 0x01, 0x24, 0x00, 0x9b, 0x07, 0x68, 0x9b, 
+	0x2b, 0x00, 0xd9, 0x23, 0x0a, 0x3b, 0xd3, 0x05, 
+	0x78, 0x03, 0x43, 0x93, 0x70, 0x03, 0x78, 0x03, 
+	0x43, 0x2b, 0x70, 0x03, 0x31, 0x01, 0x29, 0x03, 
+	0xdd, 0x04, 0x22, 0xc0, 0x21, 0x00, 0x9d, 0x00, 
+	0x30, 0x01, 0xe0, 0x05, 0x10, 0x92, 0x06, 0x12, 
+	0x0e, 0x12, 0x10, 0xab, 0x06, 0x1d, 0x0e, 0x2d, 
+	0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, 
+	0x07, 0x63, 0xd1, 0x03, 0x9b, 0x01, 0x78, 0x1f, 
+	0x33, 0x01, 0x93, 0x01, 0x9b, 0x07, 0x68, 0x9b, 
+	0x42, 0xa3, 0xd8, 0xdb, 0x98, 0x04, 0x9f, 0x03, 
+	0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, 
+	0x93, 0x09, 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, 
+	0x9b, 0x05, 0x68, 0x58, 0x42, 0x88, 0xdc, 0xa0, 
+	0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0xff, 0xb0, 0x86, 0x98, 0x06, 
+	0x6a, 0x40, 0x68, 0xc3, 0x93, 0x05, 0x98, 0x06, 
+	0x6b, 0xc0, 0x07, 0x06, 0x0f, 0x36, 0x96, 0x00, 
+	0x01, 0x30, 0x06, 0x06, 0x0e, 0x36, 0x96, 0x01, 
+	0x68, 0x18, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, 
+	0x01, 0x40, 0x08, 0xc0, 0x90, 0x04, 0x68, 0x48, 
+	0x9a, 0x04, 0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, 
+	0x18, 0x17, 0x97, 0x03, 0x22, 0x00, 0x92, 0x02, 
+	0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, 0xdd, 0x48, 
+	0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, 
+	0x43, 0x58, 0x9a, 0x08, 0x18, 0x82, 0x1c, 0x10, 
+	0xd5, 0x00, 0x30, 0x01, 0x10, 0x40, 0x9b, 0x06, 
+	0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, 
+	0x19, 0xdb, 0x1d, 0xdd, 0x35, 0x81, 0x78, 0x2f, 
+	0x24, 0x00, 0x68, 0x8b, 0x35, 0x01, 0x2b, 0x00, 
+	0xd9, 0x21, 0x0a, 0x3b, 0xd3, 0x10, 0x08, 0x53, 
+	0xd3, 0x06, 0x78, 0x06, 0x23, 0xf0, 0x40, 0x33, 
+	0x70, 0x03, 0x78, 0x03, 0x9e, 0x00, 0xe0, 0x05, 
+	0x78, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 0x70, 0x03, 
+	0x78, 0x03, 0x9e, 0x01, 0x43, 0x33, 0x70, 0x03, 
+	0x32, 0x01, 0x08, 0x53, 0xd2, 0x00, 0x30, 0x01, 
+	0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, 
+	0x07, 0x63, 0xd1, 0x01, 0x78, 0x2f, 0x35, 0x01, 
+	0x68, 0x8b, 0x42, 0xa3, 0xd8, 0xdd, 0x98, 0x04, 
+	0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, 
+	0x33, 0x01, 0x93, 0x09, 0x9a, 0x02, 0x32, 0x01, 
+	0x92, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x42, 0x90, 
+	0xdc, 0xb6, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x83, 
+	0x98, 0x03, 0x6a, 0x40, 0x68, 0xc4, 0x98, 0x03, 
+	0x6b, 0xc0, 0x06, 0x03, 0x0e, 0x1b, 0x93, 0x00, 
+	0x68, 0x20, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, 
+	0x01, 0x40, 0x08, 0xc2, 0x92, 0x02, 0x68, 0x48, 
+	0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, 0x18, 0x10, 
+	0x90, 0x01, 0x25, 0x00, 0x68, 0x60, 0x28, 0x00, 
+	0xdd, 0x35, 0x23, 0x32, 0x98, 0x03, 0x5e, 0xc0, 
+	0x9b, 0x06, 0x43, 0x58, 0x9a, 0x05, 0x18, 0x80, 
+	0x9a, 0x03, 0x69, 0x92, 0x18, 0x17, 0x98, 0x01, 
+	0x18, 0x20, 0x1d, 0xc6, 0x36, 0x81, 0x78, 0x32, 
+	0x20, 0x00, 0x68, 0x8b, 0x36, 0x01, 0x2b, 0x00, 
+	0xd9, 0x16, 0x0a, 0x13, 0xd3, 0x01, 0x9b, 0x00, 
+	0x70, 0x3b, 0x00, 0x52, 0x06, 0x12, 0x0e, 0x12, 
+	0xd1, 0x09, 0x1d, 0xc2, 0x32, 0x01, 0x08, 0xd2, 
+	0x00, 0xd2, 0x1a, 0x10, 0x19, 0xc7, 0x1c, 0x10, 
+	0x78, 0x32, 0x36, 0x01, 0xe0, 0x01, 0x30, 0x01, 
+	0x37, 0x01, 0x68, 0x8b, 0x42, 0x83, 0xd8, 0xe8, 
+	0x98, 0x01, 0x9a, 0x02, 0x18, 0x80, 0x90, 0x01, 
+	0x9b, 0x06, 0x33, 0x01, 0x93, 0x06, 0x68, 0x60, 
+	0x35, 0x01, 0x42, 0xa8, 0xdc, 0xc9, 0xb0, 0x03, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0xff, 0x23, 0x2c, 0x1c, 0x07, 0x5e, 0xc0, 
+	0xb0, 0x85, 0x28, 0x01, 0xd0, 0x0f, 0x28, 0x02, 
+	0xd0, 0x07, 0x28, 0x03, 0xd1, 0x11, 0xab, 0x06, 
+	0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9a, 
+	0xe0, 0x5d, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, 
+	0xf7, 0xff, 0xff, 0x23, 0xe0, 0x57, 0xab, 0x06, 
+	0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x97, 
+	0xe0, 0x51, 0x6a, 0x78, 0x68, 0xc0, 0x90, 0x04, 
+	0x68, 0x00, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, 
+	0x01, 0x40, 0x08, 0xc0, 0x90, 0x03, 0x99, 0x06, 
+	0x68, 0x48, 0x99, 0x03, 0x43, 0x48, 0x99, 0x06, 
+	0x68, 0x09, 0x08, 0xc9, 0x18, 0x09, 0x91, 0x02, 
+	0x21, 0x00, 0x91, 0x01, 0x98, 0x04, 0x68, 0x40, 
+	0x28, 0x00, 0xdd, 0x38, 0x98, 0x04, 0x99, 0x02, 
+	0x9e, 0x07, 0x18, 0x40, 0x30, 0x88, 0x78, 0x05, 
+	0x30, 0x01, 0x90, 0x00, 0x24, 0x00, 0x99, 0x06, 
+	0x68, 0x88, 0x28, 0x00, 0xd9, 0x1d, 0x0a, 0x28, 
+	0xd3, 0x05, 0x68, 0xb8, 0x6b, 0xfb, 0x9a, 0x08, 
+	0x1c, 0x31, 0xf0, 0x0a, 0xfb, 0xa7, 0x00, 0x68, 
+	0x06, 0x05, 0x0e, 0x2d, 0xd1, 0x0b, 0x1d, 0xe0, 
+	0x30, 0x01, 0x08, 0xc0, 0x00, 0xc0, 0x1b, 0x01, 
+	0x19, 0x8e, 0x1c, 0x04, 0x98, 0x00, 0x78, 0x05, 
+	0x30, 0x01, 0x90, 0x00, 0xe0, 0x01, 0x34, 0x01, 
+	0x36, 0x01, 0x99, 0x06, 0x68, 0x88, 0x42, 0xa0, 
+	0xd8, 0xe1, 0x98, 0x03, 0x99, 0x02, 0x18, 0x09, 
+	0x91, 0x02, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, 
+	0x99, 0x01, 0x31, 0x01, 0x91, 0x01, 0x98, 0x04, 
+	0x68, 0x40, 0x42, 0x88, 0xdc, 0xc6, 0xb0, 0x05, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0x90, 0x1c, 0x07, 0x20, 0x00, 0xb0, 0x88, 
+	0xf0, 0x08, 0xfa, 0x55, 0x90, 0x06, 0x00, 0x80, 
+	0x30, 0x10, 0x00, 0x80, 0xf7, 0xfc, 0xfb, 0x42, 
+	0x1c, 0x04, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x03, 
+	0xb0, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x1d, 0xe1, 0x31, 0x09, 0x91, 0x07, 0x49, 0x19, 
+	0x68, 0x4b, 0x1c, 0x5a, 0x60, 0x4a, 0x60, 0x63, 
+	0x60, 0xe7, 0x68, 0x39, 0x01, 0x09, 0x31, 0x1f, 
+	0x09, 0x49, 0x01, 0x49, 0x90, 0x00, 0x90, 0x01, 
+	0x1e, 0x48, 0x90, 0x02, 0x68, 0xe0, 0x68, 0x40, 
+	0x00, 0xc0, 0x38, 0x01, 0x90, 0x03, 0x46, 0x68, 
+	0x21, 0x00, 0xf0, 0x08, 0xfa, 0x33, 0x60, 0xa0, 
+	0x68, 0xe0, 0x30, 0x88, 0x90, 0x05, 0x68, 0xa0, 
+	0x90, 0x04, 0x46, 0x68, 0x1c, 0x22, 0x68, 0x61, 
+	0xb4, 0x07, 0x22, 0x00, 0xb4, 0x04, 0x22, 0x01, 
+	0x20, 0x00, 0xa9, 0x0a, 0xab, 0x08, 0xf0, 0x02, 
+	0xfd, 0x4b, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, 
+	0x1c, 0x20, 0xf7, 0xfc, 0xfb, 0x29, 0x24, 0x00, 
+	0x1c, 0x20, 0xe7, 0xc5, 0x2e, 0x08, 0x1a, 0x80, 
+	0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, 
+	0xd0, 0x1a, 0x20, 0x00, 0xf0, 0x08, 0xfa, 0x07, 
+	0x90, 0x00, 0x1d, 0xf8, 0x30, 0x09, 0x90, 0x01, 
+	0x68, 0xb8, 0x90, 0x02, 0x68, 0xf8, 0x30, 0x88, 
+	0x90, 0x03, 0x46, 0x68, 0x46, 0x69, 0x1d, 0xc2, 
+	0x32, 0x01, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0x38, 
+	0x22, 0x10, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0e, 
+	0xff, 0xd3, 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x04, 
+	0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0xff, 0x23, 0x32, 0x1c, 0x07, 0x5e, 0xc0, 
+	0x1c, 0x0c, 0x1c, 0x15, 0xb0, 0x8a, 0x42, 0x90, 
+	0xdd, 0x63, 0x6a, 0x78, 0x28, 0x00, 0xd1, 0x0b, 
+	0x4e, 0x38, 0x68, 0x30, 0x28, 0x00, 0xd1, 0x05, 
+	0x48, 0x37, 0xf7, 0xff, 0xff, 0x7d, 0x60, 0x30, 
+	0x28, 0x00, 0xd0, 0x61, 0x68, 0x30, 0x62, 0x78, 
+	0x23, 0x01, 0x6b, 0xb8, 0x6a, 0x79, 0x42, 0xd8, 
+	0xd1, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 
+	0x92, 0x01, 0x68, 0xc8, 0x90, 0x00, 0x68, 0x00, 
+	0x90, 0x04, 0x98, 0x00, 0x68, 0x40, 0x90, 0x03, 
+	0x6b, 0xf8, 0x28, 0x01, 0xd1, 0x01, 0x90, 0x02, 
+	0xe0, 0x11, 0x20, 0x00, 0x90, 0x02, 0x9a, 0x01, 
+	0x2a, 0x00, 0xd1, 0x0c, 0x1c, 0x20, 0xf0, 0x00, 
+	0xf8, 0x57, 0x6b, 0xba, 0x99, 0x03, 0xb4, 0x06, 
+	0x1c, 0x03, 0x9a, 0x0f, 0x1c, 0x38, 0x1c, 0x29, 
+	0xf7, 0xff, 0xfd, 0x80, 0xb0, 0x02, 0x99, 0x03, 
+	0x91, 0x08, 0x20, 0x01, 0x90, 0x09, 0x78, 0x20, 
+	0x28, 0x00, 0xd0, 0x31, 0x23, 0x32, 0x5e, 0xf8, 
+	0x42, 0xa8, 0xdd, 0x22, 0x78, 0x20, 0x99, 0x00, 
+	0xf0, 0x00, 0xf8, 0x34, 0x90, 0x07, 0x1c, 0x06, 
+	0x78, 0x20, 0x07, 0x00, 0x0f, 0x00, 0x99, 0x04, 
+	0x43, 0x48, 0x90, 0x05, 0x78, 0x20, 0x09, 0x00, 
+	0x07, 0x40, 0x0f, 0x40, 0x99, 0x03, 0x43, 0x48, 
+	0x90, 0x06, 0x98, 0x02, 0x34, 0x01, 0x28, 0x00, 
+	0xd0, 0x0c, 0x99, 0x0d, 0x9a, 0x01, 0xb4, 0x06, 
+	0x6a, 0x78, 0x68, 0xb9, 0x68, 0x00, 0xaa, 0x07, 
+	0x1c, 0x2b, 0xf0, 0x0a, 0xfd, 0xab, 0xb0, 0x02, 
+	0xe0, 0x06, 0xe0, 0x09, 0x9b, 0x0d, 0x1c, 0x38, 
+	0xa9, 0x05, 0x1c, 0x2a, 0xf7, 0xff, 0xfe, 0xa8, 
+	0x19, 0xad, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xcd, 
+	0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, 
+	0x2e, 0x02, 0xcf, 0xe4, 0x29, 0x00, 0xd1, 0x00, 
+	0x49, 0x02, 0x06, 0x40, 0x0e, 0x40, 0x18, 0x40, 
+	0x7a, 0x00, 0x47, 0x70, 0x2e, 0x02, 0xcf, 0xe4, 
+	0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0xd1, 0x08, 
+	0x4f, 0x0c, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, 
+	0x48, 0x0b, 0xf7, 0xff, 0xfe, 0xf9, 0x60, 0x38, 
+	0x68, 0x3f, 0x25, 0x00, 0x78, 0x20, 0x28, 0x00, 
+	0xd0, 0x08, 0x78, 0x20, 0x68, 0xf9, 0x34, 0x01, 
+	0xf7, 0xff, 0xff, 0xe0, 0x19, 0x45, 0x78, 0x20, 
+	0x28, 0x00, 0xd1, 0xf6, 0x1c, 0x28, 0xbc, 0xb0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x80, 
+	0x2e, 0x02, 0xcf, 0xe4, 0xb5, 0x80, 0x28, 0x00, 
+	0xd1, 0x08, 0x4f, 0x09, 0x68, 0x38, 0x28, 0x00, 
+	0xd1, 0x03, 0x48, 0x08, 0xf7, 0xff, 0xfe, 0xd8, 
+	0x60, 0x38, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x02, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xc0, 
+	0x68, 0x40, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x1a, 0x80, 0x2e, 0x02, 0xcf, 0xe4, 
+	0xb5, 0xf0, 0xb0, 0x83, 0x4a, 0x18, 0x21, 0x00, 
+	0x20, 0xff, 0x30, 0x01, 0xf7, 0xff, 0xfa, 0xac, 
+	0x49, 0x16, 0x27, 0x00, 0x64, 0x08, 0x49, 0x16, 
+	0x91, 0x02, 0x49, 0x16, 0x91, 0x01, 0x49, 0x16, 
+	0x91, 0x00, 0x4c, 0x16, 0x01, 0x38, 0x06, 0x01, 
+	0x0e, 0x09, 0x20, 0x10, 0x1c, 0x22, 0x1c, 0x0d, 
+	0xf7, 0xff, 0xfa, 0x9a, 0x00, 0xbe, 0x99, 0x02, 
+	0x51, 0x88, 0x20, 0x04, 0x1c, 0x29, 0x1c, 0x22, 
+	0xf7, 0xff, 0xfa, 0x92, 0x99, 0x01, 0x51, 0x88, 
+	0x20, 0x02, 0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, 
+	0xfa, 0x8b, 0x99, 0x00, 0x51, 0x88, 0x37, 0x01, 
+	0x2f, 0x08, 0xdb, 0xe3, 0x20, 0x00, 0xb0, 0x03, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x1a, 0xc8, 0x2e, 0x08, 0x1c, 0x88, 
+	0x2e, 0x08, 0x55, 0x58, 0x2e, 0x08, 0x55, 0x78, 
+	0x2e, 0x08, 0x55, 0x98, 0x2e, 0x08, 0x1a, 0x88, 
+	0xb5, 0x80, 0x48, 0x0c, 0xf7, 0xff, 0xfe, 0x84, 
+	0x4f, 0x0b, 0x64, 0x78, 0x48, 0x0b, 0xf7, 0xff, 
+	0xfe, 0x7f, 0x64, 0xb8, 0x48, 0x0a, 0xf7, 0xff, 
+	0xfe, 0x7b, 0x64, 0xf8, 0x20, 0x00, 0x22, 0x00, 
+	0x49, 0x08, 0x00, 0x83, 0x50, 0xca, 0x30, 0x01, 
+	0x28, 0x10, 0xdb, 0xfa, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x56, 0xcc, 
+	0x2e, 0x08, 0x1c, 0x88, 0x2e, 0x02, 0x8d, 0x58, 
+	0x2e, 0x02, 0xcf, 0xe4, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0x90, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
+	0x29, 0x00, 0xd0, 0x0b, 0x29, 0x0f, 0xdc, 0x09, 
+	0x00, 0x8c, 0x4f, 0x06, 0x59, 0x39, 0x29, 0x00, 
+	0xd0, 0x04, 0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x91, 
+	0x20, 0x00, 0x51, 0x38, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0xff, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x10, 
+	0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, 0x04, 0x18, 
+	0x0c, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xd0, 0x01, 
+	0x2d, 0x0f, 0xdd, 0x01, 0x20, 0xff, 0xe0, 0x53, 
+	0x00, 0xaf, 0x4c, 0x2c, 0x59, 0xe0, 0x28, 0x00, 
+	0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd0, 
+	0x98, 0x00, 0x4a, 0x29, 0x40, 0x02, 0x92, 0x00, 
+	0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9a, 0xdd, 0x01, 
+	0x1c, 0x1a, 0x93, 0x00, 0x23, 0x09, 0x01, 0x9b, 
+	0x98, 0x01, 0x42, 0x98, 0xdd, 0x01, 0x1c, 0x1a, 
+	0x93, 0x00, 0x2d, 0x08, 0xda, 0x01, 0x20, 0x00, 
+	0xe0, 0x00, 0x20, 0x01, 0x22, 0x00, 0x21, 0x00, 
+	0xb4, 0x07, 0x9a, 0x06, 0xb4, 0x04, 0x20, 0x00, 
+	0x9a, 0x04, 0x9b, 0x05, 0xf7, 0xff, 0xfa, 0x38, 
+	0x51, 0xe0, 0xb0, 0x04, 0x1c, 0x01, 0xd0, 0xd1, 
+	0x48, 0x18, 0x6c, 0x82, 0x62, 0x4a, 0x21, 0x01, 
+	0x59, 0xe2, 0x63, 0xd1, 0x21, 0x00, 0x43, 0xc9, 
+	0x59, 0xe2, 0x63, 0x91, 0x99, 0x03, 0x29, 0x08, 
+	0xd2, 0x10, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x06, 0x08, 0x0b, 
+	0x04, 0x06, 0x08, 0x0b, 0x48, 0x0e, 0xe0, 0x02, 
+	0x48, 0x0e, 0xe0, 0x00, 0x48, 0x0e, 0x59, 0xc6, 
+	0xe0, 0x00, 0x6c, 0x06, 0x59, 0xe0, 0x1c, 0x31, 
+	0xf7, 0xff, 0xfb, 0xd6, 0x59, 0xe0, 0x68, 0x80, 
+	0x21, 0x07, 0xf0, 0x04, 0xf9, 0xdd, 0x20, 0x00, 
+	0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x1c, 0x88, 
+	0x2e, 0x08, 0x55, 0x98, 0x2e, 0x08, 0x55, 0x78, 
+	0x2e, 0x08, 0x55, 0x58, 0xb5, 0xf0, 0x04, 0x00, 
+	0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x16, 
+	0x14, 0x36, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x29, 
+	0x00, 0x84, 0x4f, 0x21, 0x59, 0x38, 0x28, 0x00, 
+	0xd0, 0x24, 0x08, 0x49, 0x00, 0x49, 0x04, 0x0d, 
+	0x14, 0x2d, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x04, 
+	0xfa, 0x8b, 0x98, 0x01, 0x19, 0x40, 0x90, 0x01, 
+	0x98, 0x03, 0x19, 0x40, 0x90, 0x03, 0x98, 0x02, 
+	0x19, 0x80, 0x90, 0x02, 0x98, 0x04, 0x19, 0x80, 
+	0x90, 0x04, 0x98, 0x01, 0x49, 0x15, 0x42, 0x88, 
+	0xd8, 0x0c, 0x98, 0x02, 0x42, 0x88, 0xd8, 0x09, 
+	0x23, 0x2d, 0x01, 0x1b, 0x98, 0x01, 0x42, 0x98, 
+	0xda, 0x04, 0x23, 0x09, 0x01, 0x9b, 0x98, 0x02, 
+	0x42, 0x98, 0xdb, 0x01, 0x20, 0xff, 0xe0, 0x12, 
+	0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x02, 
+	0xf8, 0x5b, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, 
+	0xf0, 0x03, 0xff, 0x2a, 0x98, 0x00, 0x28, 0x00, 
+	0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, 
+	0xf0, 0x03, 0xfc, 0x6e, 0x20, 0x00, 0xb0, 0x05, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x55, 0x18, 0x80, 0x00, 0x00, 0x00, 
+	0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x0b, 
+	0x0c, 0x1b, 0x04, 0x16, 0x0c, 0x36, 0x20, 0xff, 
+	0xb0, 0x85, 0x2f, 0x07, 0xdc, 0x10, 0x00, 0xbc, 
+	0x4f, 0x1c, 0x59, 0x39, 0x29, 0x00, 0xd0, 0x0b, 
+	0x08, 0x5a, 0x00, 0x52, 0x04, 0x15, 0x0c, 0x2d, 
+	0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xda, 0x03, 
+	0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdb, 0x03, 
+	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x68, 0x88, 0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x2c, 
+	0x98, 0x03, 0x99, 0x01, 0x1a, 0x40, 0x90, 0x03, 
+	0x19, 0x40, 0x90, 0x03, 0x98, 0x04, 0x99, 0x02, 
+	0x1a, 0x40, 0x90, 0x04, 0x19, 0x80, 0x90, 0x04, 
+	0x95, 0x01, 0x96, 0x02, 0x59, 0x38, 0x68, 0x80, 
+	0xa9, 0x01, 0xf0, 0x02, 0xf8, 0x0d, 0x59, 0x38, 
+	0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xfe, 0xdc, 
+	0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38, 
+	0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfc, 0x20, 
+	0x20, 0x00, 0xe7, 0xd5, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x80, 
+	0x49, 0x04, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x03, 
+	0x68, 0x80, 0x21, 0x00, 0xf0, 0x03, 0xfc, 0x10, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, 
+	0x29, 0x07, 0xdc, 0x0c, 0x29, 0x01, 0xdb, 0x0a, 
+	0x00, 0x88, 0x49, 0x06, 0x58, 0x08, 0x27, 0x00, 
+	0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x01, 
+	0xf0, 0x03, 0xfa, 0x56, 0x1c, 0x38, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x18, 
+	0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, 
+	0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, 
+	0x29, 0x00, 0xd0, 0x01, 0x23, 0x32, 0x5e, 0xc8, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, 
+	0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, 
+	0x29, 0x00, 0xd0, 0x01, 0x23, 0x34, 0x5e, 0xc8, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0xb0, 0x04, 0x03, 0x0c, 0x1b, 0x04, 0x0a, 
+	0x0c, 0x12, 0x20, 0xff, 0x2b, 0x07, 0xdc, 0x10, 
+	0x00, 0x9d, 0x4f, 0x09, 0x59, 0x79, 0x29, 0x00, 
+	0xd0, 0x0b, 0x07, 0x14, 0x0f, 0x24, 0x68, 0x88, 
+	0x21, 0x03, 0xf0, 0x03, 0xfe, 0xc5, 0x59, 0x78, 
+	0x68, 0x80, 0x1c, 0x21, 0xf0, 0x03, 0xff, 0x6c, 
+	0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x55, 0x18, 0xb5, 0x00, 0x04, 0x01, 
+	0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, 
+	0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, 
+	0xd0, 0x04, 0x68, 0x88, 0x21, 0x02, 0xf0, 0x03, 
+	0xfe, 0xab, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x55, 0x18, 0xb5, 0x00, 0x04, 0x01, 
+	0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, 
+	0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, 
+	0xd0, 0x04, 0x68, 0x88, 0x21, 0x00, 0xf0, 0x03, 
+	0xfe, 0x97, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x55, 0x18, 0xb5, 0xf0, 0x04, 0x05, 
+	0x0c, 0x2d, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x12, 
+	0x0c, 0x12, 0x04, 0x1e, 0x0c, 0x36, 0x9c, 0x05, 
+	0x9f, 0x06, 0x04, 0x24, 0x0c, 0x24, 0x04, 0x3f, 
+	0x0c, 0x3f, 0x20, 0xff, 0xb0, 0x85, 0x2d, 0x0f, 
+	0xdc, 0x04, 0x00, 0xab, 0x4d, 0x10, 0x58, 0xed, 
+	0x2d, 0x00, 0xd1, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x19, 0x88, 0x23, 0x32, 
+	0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x58, 
+	0x04, 0x06, 0x0c, 0x36, 0x19, 0x10, 0x23, 0x34, 
+	0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x98, 
+	0x04, 0x04, 0x0c, 0x24, 0x91, 0x00, 0x92, 0x01, 
+	0x96, 0x02, 0x94, 0x03, 0x97, 0x04, 0x46, 0x69, 
+	0x68, 0xa8, 0xf0, 0x0a, 0xfa, 0x3d, 0xe7, 0xe1, 
+	0x2e, 0x08, 0x55, 0x18, 0xb4, 0x80, 0x04, 0x03, 
+	0x0c, 0x1b, 0x20, 0x00, 0x29, 0x00, 0xdb, 0x0f, 
+	0x2a, 0x00, 0xdb, 0x0d, 0x00, 0x9b, 0x4f, 0x07, 
+	0x58, 0xff, 0x2f, 0x00, 0xd0, 0x08, 0x23, 0x32, 
+	0x5e, 0xfb, 0x42, 0x8b, 0xdd, 0x04, 0x23, 0x34, 
+	0x5e, 0xf9, 0x42, 0x91, 0xdd, 0x00, 0x20, 0x01, 
+	0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0xf0, 0x9c, 0x06, 0x9e, 0x05, 0x04, 0x00, 
+	0x0c, 0x00, 0xb0, 0x85, 0x90, 0x00, 0x04, 0x08, 
+	0x14, 0x00, 0x04, 0x17, 0x14, 0x3f, 0x04, 0x1d, 
+	0x14, 0x2d, 0x04, 0x31, 0x14, 0x09, 0x91, 0x01, 
+	0x04, 0x23, 0x0c, 0x1b, 0x93, 0x02, 0xb0, 0x82, 
+	0x99, 0x02, 0x00, 0x89, 0x91, 0x06, 0x4a, 0x71, 
+	0x92, 0x05, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x01, 
+	0x20, 0xff, 0xe0, 0xd6, 0x2d, 0x00, 0xda, 0x0e, 
+	0x19, 0x40, 0x04, 0x00, 0x14, 0x00, 0x42, 0x69, 
+	0x04, 0x0d, 0x14, 0x2d, 0x99, 0x03, 0x18, 0x79, 
+	0x04, 0x0f, 0x14, 0x3f, 0x99, 0x03, 0x42, 0x49, 
+	0x04, 0x09, 0x14, 0x09, 0x91, 0x03, 0x1c, 0x01, 
+	0x1c, 0x04, 0x98, 0x02, 0x1c, 0x3a, 0xf7, 0xff, 
+	0xff, 0xb1, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 
+	0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 
+	0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x9a, 
+	0x98, 0x03, 0x10, 0x40, 0x90, 0x00, 0x10, 0x6e, 
+	0x1c, 0x28, 0xb0, 0x82, 0xf0, 0x0e, 0xfd, 0x56, 
+	0xf0, 0x0e, 0xfd, 0x92, 0x90, 0x00, 0x91, 0x01, 
+	0x98, 0x05, 0xf0, 0x0e, 0xfd, 0x4f, 0xf0, 0x0e, 
+	0xfd, 0x8b, 0x9a, 0x00, 0x9b, 0x01, 0xb0, 0x02, 
+	0xf0, 0x0e, 0xfd, 0x8a, 0x28, 0x00, 0xd0, 0x4c, 
+	0x98, 0x03, 0x28, 0x00, 0xdd, 0x21, 0x26, 0x00, 
+	0x2d, 0x00, 0xdd, 0x6d, 0x98, 0x00, 0x99, 0x03, 
+	0x18, 0x40, 0x90, 0x00, 0x34, 0x01, 0x42, 0xa8, 
+	0xdb, 0x03, 0x98, 0x00, 0x1b, 0x40, 0x90, 0x00, 
+	0x37, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 
+	0xf7, 0xff, 0xff, 0x78, 0x28, 0x00, 0xd0, 0x08, 
+	0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 
+	0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 
+	0xff, 0x61, 0x36, 0x01, 0x42, 0xae, 0xdb, 0xe1, 
+	0xe0, 0x76, 0x98, 0x03, 0x42, 0x40, 0x04, 0x00, 
+	0x14, 0x00, 0x90, 0x03, 0x98, 0x00, 0x42, 0x46, 
+	0x20, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xdd, 0x43, 
+	0x98, 0x03, 0x18, 0x36, 0x34, 0x01, 0x42, 0xae, 
+	0xdb, 0x01, 0x1b, 0x76, 0x3f, 0x01, 0x98, 0x02, 
+	0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x52, 
+	0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 
+	0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 
+	0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x3b, 0x98, 0x01, 
+	0x30, 0x01, 0x90, 0x01, 0x42, 0xa8, 0xdb, 0xe3, 
+	0xe0, 0x4e, 0x98, 0x03, 0x28, 0x00, 0xdd, 0x24, 
+	0x20, 0x00, 0x90, 0x01, 0x98, 0x03, 0x28, 0x00, 
+	0xdd, 0x1e, 0x19, 0x76, 0x99, 0x03, 0x37, 0x01, 
+	0x42, 0x8e, 0xdb, 0x02, 0x98, 0x03, 0x1a, 0x36, 
+	0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 
+	0xf7, 0xff, 0xff, 0x2c, 0x28, 0x00, 0xd0, 0x08, 
+	0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 
+	0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 
+	0xff, 0x15, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 
+	0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, 0xe0, 0x27, 
+	0xe0, 0x26, 0x98, 0x03, 0x42, 0x40, 0x04, 0x01, 
+	0x14, 0x09, 0x91, 0x03, 0x20, 0x00, 0x90, 0x01, 
+	0x29, 0x00, 0xdd, 0x1d, 0x19, 0x76, 0x99, 0x03, 
+	0x3f, 0x01, 0x42, 0x8e, 0xdb, 0x02, 0x99, 0x03, 
+	0x1a, 0x76, 0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, 
+	0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x03, 0x28, 0x00, 
+	0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 
+	0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 
+	0xf0, 0x09, 0xfe, 0xec, 0x98, 0x01, 0x30, 0x01, 
+	0x90, 0x01, 0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, 
+	0x20, 0x00, 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0xb4, 0x80, 0x23, 0x00, 0x88, 0x01, 0x0a, 0x0a, 
+	0x06, 0x12, 0x0e, 0x12, 0x06, 0x09, 0x0e, 0x09, 
+	0x2a, 0xdf, 0xd0, 0x1a, 0xdc, 0x07, 0x2a, 0xc4, 
+	0xd0, 0x19, 0x2a, 0xd6, 0xd0, 0x1b, 0x2a, 0xdc, 
+	0xd1, 0x08, 0x22, 0x1e, 0xe0, 0x06, 0x2a, 0xe4, 
+	0xd0, 0x13, 0x2a, 0xf6, 0xd0, 0x15, 0x2a, 0xfc, 
+	0xd1, 0x00, 0x22, 0x1f, 0x29, 0xdf, 0xd0, 0x26, 
+	0xdc, 0x11, 0x29, 0xc4, 0xd0, 0x25, 0x29, 0xd6, 
+	0xd0, 0x27, 0x29, 0xdc, 0xd1, 0x12, 0x21, 0x1e, 
+	0xe0, 0x10, 0x22, 0x19, 0xe7, 0xf2, 0x22, 0x1a, 
+	0xe7, 0xf0, 0x22, 0x1b, 0xe7, 0xee, 0x22, 0x1c, 
+	0xe7, 0xec, 0x22, 0x1d, 0xe7, 0xea, 0x29, 0xe4, 
+	0xd0, 0x15, 0x29, 0xf6, 0xd0, 0x17, 0x29, 0xfc, 
+	0xd1, 0x00, 0x21, 0x1f, 0x02, 0x17, 0x18, 0x7f, 
+	0x80, 0x07, 0x30, 0x02, 0x2a, 0x00, 0xd0, 0x04, 
+	0x29, 0x00, 0xd0, 0x02, 0x33, 0x01, 0x2b, 0x70, 
+	0xdb, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x21, 0x19, 
+	0xe7, 0xf0, 0x21, 0x1a, 0xe7, 0xee, 0x21, 0x1b, 
+	0xe7, 0xec, 0x21, 0x1c, 0xe7, 0xea, 0x21, 0x1d, 
+	0xe7, 0xe8, 0xb5, 0xf0, 0x1c, 0x0f, 0x1c, 0x11, 
+	0x04, 0x02, 0x0c, 0x12, 0x04, 0x0c, 0x0c, 0x24, 
+	0x04, 0x1d, 0x0c, 0x2d, 0x00, 0x96, 0xb0, 0x81, 
+	0x48, 0x10, 0x90, 0x00, 0x59, 0x81, 0x20, 0xff, 
+	0x29, 0x00, 0xd0, 0x16, 0x2a, 0x00, 0xd0, 0x14, 
+	0x2a, 0x0f, 0xdc, 0x12, 0x23, 0x32, 0x5e, 0xca, 
+	0x42, 0xa2, 0xdb, 0x0e, 0x23, 0x34, 0x5e, 0xc9, 
+	0x42, 0xa9, 0xdb, 0x0a, 0x1c, 0x38, 0xf7, 0xff, 
+	0xff, 0x93, 0x98, 0x00, 0x59, 0x80, 0x1c, 0x39, 
+	0x1c, 0x22, 0x1c, 0x2b, 0xf7, 0xff, 0xfb, 0x5c, 
+	0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0xb4, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x09, 
+	0x0c, 0x09, 0x04, 0x14, 0x14, 0x24, 0x04, 0x1a, 
+	0x14, 0x12, 0x20, 0xff, 0x2f, 0x0f, 0xdc, 0x1d, 
+	0x00, 0xbd, 0x4f, 0x0f, 0x59, 0x7b, 0x2b, 0x00, 
+	0xd0, 0x18, 0x48, 0x0e, 0x29, 0x01, 0xd0, 0x05, 
+	0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0x03, 
+	0x6c, 0x80, 0xe0, 0x02, 0x6c, 0x40, 0xe0, 0x00, 
+	0x6c, 0xc0, 0x62, 0x58, 0x59, 0x78, 0x63, 0xc4, 
+	0x20, 0x00, 0x43, 0xc0, 0x42, 0x82, 0xd1, 0x02, 
+	0x59, 0x79, 0x63, 0x88, 0xe0, 0x01, 0x59, 0x78, 
+	0x63, 0x82, 0x20, 0x00, 0xbc, 0xb0, 0x47, 0x70, 
+	0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1c, 0x88, 
+	0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, 
+	0x0c, 0x09, 0x00, 0x80, 0x4a, 0x07, 0x58, 0x10, 
+	0x28, 0x00, 0xd1, 0x02, 0x20, 0xff, 0xbc, 0x08, 
+	0x47, 0x18, 0x07, 0x89, 0x0f, 0x89, 0x68, 0x80, 
+	0xf0, 0x03, 0xfe, 0x96, 0x20, 0x00, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, 
+	0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x12, 
+	0x0c, 0x12, 0x1c, 0x1f, 0x28, 0x07, 0xdc, 0x1f, 
+	0x28, 0x01, 0xdb, 0x1d, 0x00, 0x80, 0x4b, 0x10, 
+	0x58, 0x1b, 0x2b, 0x00, 0xd0, 0x18, 0x29, 0x02, 
+	0xd0, 0x0e, 0x29, 0x04, 0xd0, 0x0c, 0x29, 0x10, 
+	0xd0, 0x0a, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 
+	0xd1, 0x0e, 0x06, 0x12, 0x0e, 0x12, 0x1c, 0x39, 
+	0x48, 0x08, 0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, 
+	0x07, 0x12, 0x0f, 0x12, 0x49, 0x06, 0x58, 0x08, 
+	0x68, 0x00, 0x1c, 0x39, 0xf0, 0x0b, 0xfb, 0x1c, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1c, 0x88, 
+	0x2e, 0x08, 0x55, 0x58, 0xb5, 0xf0, 0x04, 0x07, 
+	0x0c, 0x3f, 0x04, 0x10, 0x0c, 0x00, 0x22, 0x00, 
+	0xb0, 0x85, 0x92, 0x00, 0x2f, 0x07, 0xdc, 0x74, 
+	0x2f, 0x01, 0xdb, 0x73, 0x00, 0xbe, 0x4a, 0x3e, 
+	0x59, 0x92, 0x2a, 0x00, 0xd0, 0x6f, 0x04, 0x1a, 
+	0x0c, 0x12, 0x07, 0xd5, 0x0f, 0xed, 0x24, 0x02, 
+	0x40, 0x14, 0x27, 0x04, 0x40, 0x17, 0x23, 0x08, 
+	0x40, 0x1a, 0x92, 0x04, 0x29, 0x02, 0xd0, 0x34, 
+	0x29, 0x04, 0xd0, 0x32, 0x29, 0x10, 0xd0, 0x30, 
+	0x01, 0x5b, 0x42, 0x99, 0xd1, 0x60, 0x06, 0x02, 
+	0x0e, 0x12, 0x46, 0x69, 0x1c, 0x16, 0x48, 0x31, 
+	0x90, 0x01, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, 
+	0xfb, 0x13, 0x98, 0x00, 0x4b, 0x2e, 0x40, 0x18, 
+	0x90, 0x00, 0x2d, 0x00, 0xd0, 0x02, 0x23, 0x02, 
+	0x43, 0x18, 0x90, 0x00, 0x2c, 0x00, 0xd0, 0x04, 
+	0x23, 0x01, 0x04, 0x5b, 0x98, 0x00, 0x43, 0x18, 
+	0x90, 0x00, 0x2f, 0x00, 0xd0, 0x03, 0x23, 0x01, 
+	0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x9a, 0x04, 
+	0x2a, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x1b, 
+	0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x98, 0x01, 
+	0x99, 0x00, 0x6c, 0x00, 0x68, 0x00, 0x1c, 0x32, 
+	0xe0, 0x30, 0x07, 0x02, 0x0f, 0x12, 0x92, 0x03, 
+	0x48, 0x1c, 0x90, 0x02, 0x59, 0x80, 0x68, 0x00, 
+	0x46, 0x69, 0xf0, 0x0b, 0xfa, 0xe5, 0x98, 0x00, 
+	0x4b, 0x17, 0x40, 0x18, 0x90, 0x00, 0x2d, 0x00, 
+	0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, 0x90, 0x00, 
+	0x2c, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x5b, 
+	0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x2f, 0x00, 
+	0xd0, 0x03, 0x23, 0x01, 0x98, 0x00, 0x43, 0x18, 
+	0x90, 0x00, 0x9a, 0x04, 0x2a, 0x00, 0xd0, 0x04, 
+	0x23, 0x01, 0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, 
+	0x90, 0x00, 0x98, 0x02, 0x9a, 0x03, 0x59, 0x80, 
+	0xe0, 0x02, 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x03, 
+	0x68, 0x00, 0x99, 0x00, 0xf0, 0x0b, 0xfa, 0x8c, 
+	0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1c, 0x88, 
+	0xff, 0xfc, 0xff, 0xfc, 0x2e, 0x08, 0x55, 0x58, 
+	0xb5, 0xf0, 0x4f, 0x28, 0x25, 0x00, 0x24, 0xff, 
+	0x69, 0x38, 0x28, 0x00, 0xd1, 0x01, 0x60, 0xbd, 
+	0xe0, 0x0c, 0x26, 0x05, 0x68, 0xb9, 0x29, 0x07, 
+	0xd2, 0xf9, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x08, 0x10, 0x1a, 
+	0x21, 0x30, 0x38, 0x00, 0x1c, 0x20, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x02, 0x80, 
+	0xf7, 0xf6, 0xfd, 0xd4, 0x28, 0x00, 0xdb, 0x2d, 
+	0x20, 0x02, 0xe0, 0x25, 0x48, 0x18, 0xf7, 0xf6, 
+	0xfd, 0xef, 0x28, 0x00, 0xdb, 0x26, 0x89, 0xb8, 
+	0x28, 0x00, 0xdd, 0x15, 0x20, 0x03, 0xe0, 0x1b, 
+	0x89, 0xb8, 0xf7, 0xf6, 0xfd, 0xc3, 0x28, 0x00, 
+	0xdb, 0x1c, 0x20, 0x04, 0xe0, 0x14, 0xf7, 0xf6, 
+	0xfd, 0xdf, 0x28, 0x00, 0xdb, 0x16, 0x69, 0x39, 
+	0x18, 0x09, 0x61, 0x39, 0x89, 0xb9, 0x1a, 0x08, 
+	0x81, 0xb8, 0x89, 0xb8, 0x28, 0x00, 0xdc, 0xe9, 
+	0x60, 0xbe, 0xe0, 0x0b, 0x20, 0x00, 0xf7, 0xf6, 
+	0xfd, 0xad, 0x28, 0x00, 0xd1, 0x06, 0x20, 0x06, 
+	0x60, 0xb8, 0xe0, 0x03, 0xf7, 0xf6, 0xfd, 0xc8, 
+	0x28, 0x00, 0xda, 0xb8, 0x1c, 0x28, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1d, 0x08, 
+	0x2e, 0x08, 0x55, 0xb8, 0xb5, 0xf0, 0x04, 0x04, 
+	0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 
+	0x0c, 0x36, 0xb0, 0x85, 0xa8, 0x01, 0x49, 0x2e, 
+	0xc9, 0x8e, 0xc0, 0x8e, 0x2c, 0x00, 0xd0, 0x07, 
+	0x2c, 0x01, 0xd0, 0x07, 0x2c, 0x02, 0xd0, 0x07, 
+	0x2c, 0x03, 0xd1, 0x3f, 0x21, 0x08, 0xe0, 0x04, 
+	0x21, 0x01, 0xe0, 0x02, 0x21, 0x02, 0xe0, 0x00, 
+	0x21, 0x04, 0x91, 0x00, 0x23, 0x2d, 0x01, 0x1b, 
+	0x42, 0x9d, 0xdc, 0x33, 0x23, 0x09, 0x01, 0x9b, 
+	0x42, 0x9e, 0xdc, 0x2f, 0x1e, 0x68, 0x90, 0x03, 
+	0x1e, 0x70, 0x90, 0x04, 0xa8, 0x01, 0x1c, 0x21, 
+	0xf0, 0x07, 0xfb, 0xb8, 0x4f, 0x1d, 0x60, 0x78, 
+	0x00, 0x80, 0x23, 0x01, 0x04, 0x1b, 0x42, 0x98, 
+	0xdc, 0x20, 0x1f, 0xf8, 0x38, 0x79, 0x67, 0xc4, 
+	0x68, 0x38, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0x80, 
+	0xb0, 0x81, 0x46, 0x6b, 0x22, 0x00, 0x21, 0x00, 
+	0xf0, 0x09, 0xfd, 0x42, 0x68, 0x38, 0xf7, 0xfe, 
+	0xfe, 0x7c, 0xb0, 0x01, 0x22, 0x00, 0x21, 0x0a, 
+	0x20, 0x01, 0xb4, 0x07, 0x1c, 0x22, 0xb4, 0x04, 
+	0x21, 0x00, 0x20, 0x00, 0x1c, 0x2a, 0x1c, 0x33, 
+	0xf7, 0xfe, 0xfd, 0x56, 0xb0, 0x04, 0x60, 0x38, 
+	0x1c, 0x01, 0xd1, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x69, 0x88, 0x99, 0x00, 
+	0x43, 0x4d, 0x1d, 0xe9, 0xd5, 0x00, 0x31, 0x07, 
+	0x10, 0xc9, 0x43, 0x71, 0x61, 0x38, 0x60, 0x79, 
+	0x81, 0xb9, 0x20, 0x01, 0x60, 0xb8, 0xe7, 0xed, 
+	0x2e, 0x03, 0x31, 0xf0, 0x2e, 0x08, 0x1d, 0x08, 
+	0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, 
+	0x0c, 0x09, 0xb0, 0x87, 0x91, 0x00, 0x04, 0x11, 
+	0x0c, 0x09, 0x91, 0x01, 0x04, 0x19, 0x0c, 0x09, 
+	0x91, 0x02, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x43, 
+	0x28, 0x01, 0xdb, 0x41, 0x00, 0x85, 0x48, 0x3e, 
+	0x90, 0x0b, 0x59, 0x41, 0x29, 0x00, 0xd0, 0x3b, 
+	0x48, 0x3c, 0x90, 0x0a, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x36, 0x23, 0x2c, 0x5e, 0xca, 0x2a, 0x0b, 
+	0xd2, 0x32, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x06, 0x06, 0x06, 0x06, 
+	0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 
+	0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x23, 0x32, 
+	0x5e, 0xc3, 0x93, 0x02, 0x23, 0x34, 0x5e, 0xc0, 
+	0x90, 0x03, 0x92, 0x04, 0x98, 0x07, 0x08, 0x80, 
+	0xd3, 0x40, 0x23, 0x2c, 0x5e, 0xc8, 0x28, 0x00, 
+	0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, 
+	0xd0, 0x08, 0x28, 0x03, 0xd1, 0x10, 0x27, 0xff, 
+	0x37, 0x01, 0xe0, 0x04, 0x27, 0x02, 0xe0, 0x02, 
+	0x27, 0x04, 0xe0, 0x00, 0x27, 0x10, 0x4e, 0x24, 
+	0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x16, 
+	0x24, 0x00, 0x48, 0x22, 0x90, 0x09, 0xe0, 0x03, 
+	0xb0, 0x0c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, 
+	0x06, 0x22, 0x0e, 0x12, 0x98, 0x09, 0x6c, 0x00, 
+	0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x5d, 0x34, 0x01, 
+	0x42, 0xbc, 0xdb, 0xf1, 0xe0, 0x12, 0x24, 0x00, 
+	0x2f, 0x00, 0xdd, 0x0f, 0x48, 0x16, 0x90, 0x08, 
+	0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, 
+	0x07, 0x22, 0x0f, 0x12, 0x98, 0x08, 0x59, 0x40, 
+	0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x49, 0x34, 0x01, 
+	0x42, 0xbc, 0xdb, 0xf1, 0x98, 0x07, 0x08, 0x40, 
+	0xd3, 0x01, 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, 
+	0x99, 0x06, 0xb4, 0x06, 0x98, 0x0d, 0x59, 0x40, 
+	0x68, 0x81, 0x98, 0x0c, 0x68, 0x00, 0x68, 0x80, 
+	0x9b, 0x07, 0xaa, 0x02, 0xf0, 0x09, 0xff, 0x12, 
+	0xb0, 0x0e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1d, 0x08, 
+	0x2e, 0x08, 0x55, 0xb8, 0x2e, 0x08, 0x1c, 0x88, 
+	0x2e, 0x08, 0x55, 0x58, 0xb5, 0x80, 0x4f, 0x0a, 
+	0x68, 0x38, 0x28, 0x00, 0xd0, 0x0c, 0x68, 0x80, 
+	0xb0, 0x81, 0x46, 0x6b, 0x22, 0x00, 0x21, 0x00, 
+	0xf0, 0x09, 0xfc, 0x72, 0x68, 0x38, 0xf7, 0xfe, 
+	0xfd, 0xac, 0x20, 0x00, 0x60, 0x38, 0xb0, 0x01, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x1d, 0x08, 0xb5, 0x00, 0x04, 0x01, 
+	0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, 
+	0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, 
+	0xd0, 0x04, 0x68, 0x88, 0x21, 0x01, 0xf0, 0x03, 
+	0xfb, 0x93, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x55, 0x18, 0xb5, 0x00, 0x04, 0x01, 
+	0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, 
+	0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, 
+	0xd0, 0x04, 0x68, 0x88, 0x21, 0x00, 0xf0, 0x03, 
+	0xfb, 0x7f, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x55, 0x18, 0xb5, 0xf7, 0xb0, 0x86, 
+	0x9c, 0x07, 0x20, 0x00, 0x6e, 0x40, 0x90, 0x05, 
+	0x98, 0x05, 0x30, 0x0c, 0x90, 0x05, 0x48, 0x7f, 
+	0x90, 0x04, 0x98, 0x04, 0x30, 0x0c, 0x90, 0x04, 
+	0xf0, 0x11, 0xff, 0xce, 0x90, 0x01, 0xf0, 0x11, 
+	0xff, 0xb1, 0x90, 0x00, 0x20, 0x00, 0x43, 0xc0, 
+	0x49, 0x79, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, 
+	0x49, 0x77, 0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, 
+	0x49, 0x75, 0x61, 0x08, 0x98, 0x06, 0x28, 0x00, 
+	0xd0, 0x73, 0x20, 0x00, 0x6a, 0x40, 0x90, 0x03, 
+	0x68, 0x20, 0x30, 0x05, 0x99, 0x06, 0x1a, 0x08, 
+	0x90, 0x06, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x08, 
+	0x68, 0x60, 0x99, 0x03, 0x68, 0x09, 0x42, 0x88, 
+	0xd1, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0xe0, 0x06, 0x68, 0x60, 0x9a, 0x08, 0x42, 0x90, 
+	0xd1, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0x28, 0x00, 0xd0, 0x73, 0x68, 0x27, 0x68, 0xe0, 
+	0x28, 0x00, 0xd0, 0x01, 0x98, 0x05, 0xe0, 0x00, 
+	0x98, 0x04, 0x1c, 0x06, 0x68, 0xe0, 0x28, 0x00, 
+	0xd0, 0x02, 0x20, 0x00, 0x6e, 0x40, 0xe0, 0x00, 
+	0x48, 0x5c, 0x90, 0x02, 0x1d, 0xe5, 0x35, 0x0d, 
+	0x68, 0xa0, 0x28, 0x08, 0xd2, 0x5f, 0xa3, 0x02, 
+	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
+	0x04, 0x16, 0x28, 0x3a, 0x49, 0x55, 0x65, 0x71, 
+	0x69, 0x20, 0x49, 0x55, 0x60, 0x08, 0xcd, 0x02, 
+	0x48, 0x53, 0x60, 0x41, 0xcd, 0x02, 0x98, 0x02, 
+	0x60, 0x01, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, 
+	0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, 
+	0xe7, 0xf8, 0xe0, 0x67, 0x69, 0x20, 0x49, 0x4c, 
+	0x60, 0x88, 0xcd, 0x02, 0x48, 0x4a, 0x60, 0xc1, 
+	0xcd, 0x02, 0x98, 0x02, 0x60, 0x41, 0x3f, 0x01, 
+	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, 0x2d, 0x98, 0x00, 
+	0x28, 0x00, 0xd1, 0x01, 0xf0, 0x11, 0xff, 0x0c, 
+	0x20, 0x00, 0x6e, 0x80, 0x68, 0x00, 0x4b, 0x0f, 
+	0x42, 0x98, 0xd0, 0x06, 0x48, 0x0d, 0x21, 0x00, 
+	0x6e, 0x89, 0x60, 0x08, 0x20, 0x01, 0x49, 0x08, 
+	0x62, 0x08, 0x20, 0x00, 0x21, 0x00, 0x6e, 0x89, 
+	0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x03, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, 
+	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x59, 0xb8, 
+	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x3a, 0xfc, 
+	0x2e, 0x08, 0x1d, 0x1c, 0xda, 0xa5, 0xaa, 0x57, 
+	0xb5, 0x80, 0xb0, 0xa7, 0x46, 0x68, 0x4f, 0x08, 
+	0x23, 0x13, 0xcf, 0x06, 0xc0, 0x06, 0x3b, 0x01, 
+	0xd1, 0xfb, 0xcf, 0x04, 0xc0, 0x04, 0x46, 0x69, 
+	0x4a, 0x04, 0x20, 0x27, 0xf7, 0xff, 0xfe, 0xde, 
+	0xb0, 0x27, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x03, 0x32, 0x00, 0xf0, 0x24, 0x00, 0x09, 
+	0xb5, 0xff, 0xb0, 0x83, 0x99, 0x04, 0x04, 0x09, 
+	0x0c, 0x09, 0x91, 0x00, 0x9a, 0x05, 0x06, 0x16, 
+	0x0e, 0x36, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 
+	0x90, 0x01, 0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, 
+	0x90, 0x02, 0xb0, 0x84, 0x25, 0x00, 0x98, 0x07, 
+	0x1d, 0xc2, 0x32, 0x21, 0x92, 0x00, 0x20, 0xff, 
+	0x30, 0x01, 0x68, 0x00, 0x49, 0x6b, 0x60, 0x08, 
+	0x98, 0x12, 0x28, 0x01, 0xd1, 0x73, 0x98, 0x07, 
+	0x28, 0x00, 0xd1, 0x05, 0x20, 0x63, 0xb0, 0x07, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x21, 0x00, 0x91, 0x01, 0x99, 0x01, 0x23, 0xff, 
+	0x33, 0xe1, 0x42, 0x99, 0xd3, 0x04, 0xe0, 0x0a, 
+	0x99, 0x01, 0x31, 0x01, 0x91, 0x01, 0xe7, 0xf5, 
+	0x20, 0x00, 0x99, 0x01, 0x23, 0x2c, 0x43, 0x59, 
+	0x9a, 0x00, 0x50, 0x50, 0xe7, 0xf4, 0x98, 0x07, 
+	0x49, 0x5b, 0x68, 0x09, 0x60, 0x08, 0x98, 0x05, 
+	0x28, 0x10, 0xdb, 0x01, 0x20, 0x01, 0xe0, 0x00, 
+	0x20, 0x00, 0x99, 0x05, 0x29, 0x1f, 0xdc, 0x01, 
+	0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 0x40, 0x08, 
+	0xd0, 0x04, 0x98, 0x05, 0x49, 0x53, 0x68, 0x09, 
+	0x60, 0x08, 0xe0, 0x02, 0x20, 0x62, 0xb0, 0x07, 
+	0xe7, 0xce, 0x20, 0x00, 0x49, 0x4d, 0x68, 0x09, 
+	0x70, 0x08, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, 
+	0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0xf0, 0x00, 
+	0xfb, 0x01, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, 
+	0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xbc, 0x22, 0x00, 
+	0xb4, 0x04, 0x99, 0x05, 0x1c, 0x30, 0x23, 0x04, 
+	0x22, 0x00, 0xf0, 0x00, 0xf9, 0x2f, 0xb0, 0x01, 
+	0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 
+	0xb0, 0x07, 0xe7, 0xad, 0x98, 0x06, 0x28, 0x00, 
+	0xdb, 0x04, 0x98, 0x06, 0x28, 0x3f, 0xdc, 0x01, 
+	0x9d, 0x06, 0xe0, 0x00, 0x25, 0x1b, 0x98, 0x11, 
+	0x01, 0x80, 0x43, 0x05, 0x23, 0x80, 0x43, 0x1d, 
+	0x48, 0x39, 0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, 
+	0x60, 0x01, 0x48, 0x37, 0x68, 0x01, 0x43, 0x29, 
+	0x60, 0x01, 0xf0, 0x11, 0xfe, 0x0b, 0x90, 0x03, 
+	0xf0, 0x11, 0xfe, 0x22, 0xe0, 0x00, 0xe0, 0x13, 
+	0x90, 0x02, 0xf0, 0x11, 0xfe, 0x81, 0x1c, 0x04, 
+	0x4b, 0x30, 0x40, 0x1c, 0x1c, 0x20, 0xf0, 0x11, 
+	0xfe, 0x7f, 0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 
+	0xf0, 0x11, 0xfe, 0x4a, 0x98, 0x03, 0x28, 0x80, 
+	0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x29, 0xe0, 0x43, 
+	0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x04, 
+	0x22, 0x00, 0x49, 0x27, 0xf0, 0x00, 0xf8, 0xee, 
+	0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, 
+	0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x6c, 0x1c, 0x30, 
+	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, 0xc5, 0x90, 0x03, 0xf0, 0x11, 0xfd, 0xdc, 
+	0x90, 0x02, 0xf0, 0x11, 0xfe, 0x3d, 0x1c, 0x04, 
+	0x23, 0x01, 0x04, 0x5b, 0x43, 0x1c, 0x1c, 0x20, 
+	0xf0, 0x11, 0xfe, 0x3a, 0x98, 0x02, 0x28, 0x40, 
+	0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x05, 0x98, 0x03, 
+	0x28, 0x80, 0xd0, 0x01, 0xf0, 0x11, 0xfd, 0xe4, 
+	0x1c, 0x38, 0xb0, 0x07, 0xe7, 0x34, 0xb0, 0x04, 
+	0xb0, 0x03, 0xe7, 0x31, 0x2e, 0x08, 0x5d, 0xc0, 
+	0x2e, 0x08, 0x5d, 0xb8, 0x2e, 0x08, 0x5d, 0xbc, 
+	0x68, 0x00, 0x00, 0x38, 0xff, 0xfd, 0xff, 0xff, 
+	0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0xf7, 0xff, 
+	0xfe, 0xe7, 0xf0, 0x00, 0xf8, 0x02, 0xbc, 0x08, 
+	0x47, 0x18, 0xb5, 0xf0, 0xf0, 0x0b, 0xf9, 0x48, 
+	0x26, 0x00, 0x2e, 0x04, 0xd3, 0x02, 0xe0, 0x12, 
+	0x36, 0x01, 0xe7, 0xfa, 0x01, 0x30, 0x4b, 0x3c, 
+	0x18, 0xc7, 0x25, 0x00, 0x2d, 0x04, 0xd3, 0x02, 
+	0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x00, 
+	0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8, 0x37, 0xff, 
+	0x37, 0x01, 0xe7, 0xf6, 0xe7, 0xec, 0x4f, 0x35, 
+	0x25, 0x00, 0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x07, 
+	0x35, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, 
+	0x20, 0x00, 0x60, 0xf8, 0x37, 0x10, 0xe7, 0xf7, 
+	0x20, 0x00, 0x49, 0x2f, 0x68, 0x09, 0x70, 0x08, 
+	0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02, 0xe0, 0x1f, 
+	0x34, 0x01, 0xe7, 0xfa, 0x21, 0x00, 0x00, 0xe0, 
+	0x4a, 0x2a, 0x68, 0x12, 0x50, 0x11, 0x20, 0x00, 
+	0x00, 0xe1, 0x4a, 0x28, 0x68, 0x12, 0x18, 0x89, 
+	0x60, 0x48, 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x26, 
+	0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x00, 
+	0x00, 0xa1, 0x4a, 0x24, 0x68, 0x12, 0x50, 0x50, 
+	0x20, 0x00, 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 
+	0x4a, 0x21, 0x68, 0x12, 0x52, 0x50, 0xe7, 0xdf, 
+	0x20, 0x00, 0x21, 0x19, 0x06, 0x89, 0x62, 0x48, 
+	0x48, 0x1e, 0x21, 0x19, 0x06, 0x89, 0x62, 0x48, 
+	0x20, 0x00, 0x49, 0x1d, 0x68, 0x09, 0x60, 0x08, 
+	0x20, 0x00, 0x49, 0x1b, 0x68, 0x09, 0x60, 0x48, 
+	0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 0x60, 0xc8, 
+	0x20, 0x00, 0x49, 0x17, 0x68, 0x09, 0x61, 0x08, 
+	0x20, 0x00, 0x49, 0x15, 0x68, 0x09, 0x61, 0x48, 
+	0x20, 0x00, 0x49, 0x13, 0x68, 0x09, 0x61, 0x88, 
+	0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x08, 
+	0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x60, 0x48, 
+	0x20, 0x00, 0x49, 0x0e, 0x68, 0x09, 0x60, 0x88, 
+	0x48, 0x0d, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 
+	0x60, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x9e, 0x00, 0x00, 0xc0, 0x9e, 0x00, 0x09, 0x80, 
+	0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5d, 0xd8, 
+	0x2e, 0x08, 0x5d, 0xdc, 0x2e, 0x08, 0x5d, 0xd4, 
+	0x2e, 0x08, 0x5d, 0xcc, 0x00, 0x40, 0x00, 0x03, 
+	0x2e, 0x08, 0x5e, 0x14, 0x2e, 0x08, 0x5e, 0x18, 
+	0x6a, 0x00, 0x00, 0x10, 0xb5, 0xff, 0xb0, 0x83, 
+	0x98, 0x03, 0x06, 0x04, 0x0e, 0x24, 0x99, 0x04, 
+	0x04, 0x08, 0x0c, 0x00, 0x90, 0x00, 0x9a, 0x05, 
+	0x06, 0x10, 0x0e, 0x00, 0x90, 0x01, 0x9b, 0x06, 
+	0x06, 0x18, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x81, 
+	0x00, 0xe0, 0x49, 0xc1, 0x68, 0x09, 0x18, 0x47, 
+	0x00, 0xa0, 0x49, 0xc0, 0x68, 0x09, 0x18, 0x45, 
+	0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0xbe, 
+	0x68, 0x09, 0x18, 0x46, 0x2c, 0x20, 0xdb, 0x05, 
+	0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x68, 0x28, 0x4b, 0xb9, 
+	0x40, 0x18, 0x60, 0x28, 0x68, 0x38, 0x4b, 0xb8, 
+	0x40, 0x18, 0x60, 0x38, 0x68, 0x38, 0x23, 0x40, 
+	0x40, 0x18, 0xd0, 0x17, 0x68, 0x38, 0x23, 0x40, 
+	0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, 0x48, 0xb3, 
+	0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, 
+	0x48, 0xb1, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 
+	0x43, 0x19, 0x60, 0x01, 0x98, 0x01, 0x4b, 0xaf, 
+	0x42, 0x98, 0xd1, 0x03, 0x20, 0x00, 0x49, 0xae, 
+	0x68, 0x09, 0x60, 0x08, 0x98, 0x01, 0x4b, 0xab, 
+	0x42, 0x98, 0xd0, 0x73, 0x68, 0x38, 0x23, 0x21, 
+	0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, 0x68, 0x28, 
+	0x23, 0x07, 0x03, 0x5b, 0x40, 0x18, 0x60, 0x28, 
+	0x98, 0x01, 0x4b, 0xa6, 0x40, 0x18, 0x68, 0x29, 
+	0x43, 0x08, 0x60, 0x28, 0x20, 0x00, 0x75, 0x30, 
+	0x98, 0x02, 0x07, 0x80, 0x0f, 0x80, 0x28, 0x01, 
+	0xd1, 0x04, 0x88, 0x30, 0x23, 0x10, 0x43, 0x18, 
+	0x80, 0x30, 0xe0, 0x04, 0x88, 0x30, 0x23, 0x10, 
+	0x43, 0xdb, 0x40, 0x18, 0x80, 0x30, 0x98, 0x02, 
+	0x23, 0x80, 0x40, 0x18, 0x28, 0x80, 0xd1, 0x08, 
+	0x68, 0x38, 0x23, 0x40, 0x43, 0x18, 0x60, 0x38, 
+	0x20, 0xff, 0x49, 0x97, 0x68, 0x09, 0x70, 0x08, 
+	0xe0, 0x04, 0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, 
+	0x40, 0x18, 0x60, 0x38, 0x98, 0x03, 0x28, 0x01, 
+	0xd1, 0x36, 0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, 
+	0x40, 0x18, 0x80, 0x30, 0x20, 0x33, 0x06, 0x40, 
+	0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, 
+	0x00, 0xe0, 0x4a, 0x8c, 0x68, 0x12, 0x18, 0x80, 
+	0x60, 0x41, 0x20, 0x01, 0x70, 0xb0, 0x68, 0x38, 
+	0x23, 0x01, 0x03, 0x9b, 0x43, 0x18, 0x60, 0x38, 
+	0x68, 0x38, 0x4b, 0x87, 0x43, 0x18, 0x60, 0x38, 
+	0x48, 0x86, 0x70, 0x44, 0x20, 0x00, 0x49, 0x86, 
+	0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x02, 0xc0, 
+	0x49, 0x84, 0x61, 0x48, 0x49, 0x83, 0x61, 0x08, 
+	0x20, 0x01, 0x49, 0x83, 0x64, 0x48, 0x20, 0x00, 
+	0x49, 0x81, 0x64, 0x48, 0x68, 0x28, 0x23, 0x01, 
+	0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0x20, 0x00, 
+	0x49, 0x7e, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x9a, 
+	0x98, 0x03, 0x28, 0x02, 0xd1, 0x30, 0x20, 0x33, 
+	0x06, 0x40, 0xe0, 0x00, 0xe0, 0x94, 0x6d, 0xc0, 
+	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x00, 0xe1, 
+	0x4a, 0x70, 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 
+	0x20, 0x02, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, 
+	0x03, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 
+	0x4b, 0x6b, 0x43, 0x18, 0x60, 0x38, 0x48, 0x6b, 
+	0x70, 0x84, 0x20, 0x00, 0x49, 0x6e, 0x60, 0x08, 
+	0x00, 0xe0, 0x49, 0x5b, 0x68, 0x09, 0x58, 0x08, 
+	0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xe1, 
+	0x4a, 0x57, 0x68, 0x12, 0x50, 0x50, 0x20, 0x4b, 
+	0x49, 0x67, 0x60, 0x08, 0x68, 0x28, 0x23, 0x01, 
+	0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0xe0, 0x66, 
+	0x98, 0x03, 0x28, 0x04, 0xd1, 0x15, 0x20, 0x00, 
+	0x00, 0xe1, 0x4a, 0x5a, 0x68, 0x12, 0x18, 0x89, 
+	0x60, 0x48, 0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, 
+	0x23, 0x20, 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 
+	0x60, 0x38, 0x48, 0x56, 0x70, 0x04, 0x68, 0x28, 
+	0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 
+	0xe0, 0x4d, 0x98, 0x03, 0x23, 0x10, 0x40, 0x18, 
+	0xd0, 0x0f, 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x4d, 
+	0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x68, 0x38, 
+	0x4b, 0x52, 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 
+	0x60, 0x38, 0x37, 0x04, 0x20, 0x0e, 0x60, 0x38, 
+	0xe0, 0x39, 0x98, 0x03, 0x28, 0x08, 0xd1, 0x23, 
+	0x48, 0x4d, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 
+	0x28, 0x00, 0xd0, 0x03, 0x20, 0x4f, 0xb0, 0x04, 
+	0xe6, 0xf8, 0xe0, 0x67, 0x20, 0x01, 0x49, 0x48, 
+	0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x46, 
+	0x68, 0x00, 0x30, 0x60, 0x76, 0x04, 0x20, 0x01, 
+	0x49, 0x43, 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 
+	0x49, 0x42, 0x00, 0xe0, 0x4a, 0x37, 0x68, 0x12, 
+	0x18, 0x80, 0x60, 0x41, 0x68, 0x28, 0x23, 0x01, 
+	0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0xe0, 0x12, 
+	0x21, 0x00, 0x00, 0xe0, 0x4a, 0x31, 0x68, 0x12, 
+	0x18, 0x80, 0x60, 0x41, 0x98, 0x03, 0x70, 0xb0, 
+	0x68, 0x38, 0x23, 0x20, 0x43, 0x18, 0x60, 0x38, 
+	0x68, 0x38, 0x60, 0x38, 0x68, 0x28, 0x23, 0x01, 
+	0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0xe0, 0x33, 
+	0x98, 0x03, 0x23, 0x10, 0x40, 0x18, 0xd0, 0x09, 
+	0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x0f, 0x90, 0x00, 
+	0x28, 0x00, 0xd0, 0x02, 0x98, 0x00, 0xb0, 0x04, 
+	0xe6, 0xbc, 0xe0, 0x1a, 0x98, 0x03, 0x28, 0x01, 
+	0xd1, 0x03, 0x20, 0xff, 0x49, 0x21, 0x70, 0x48, 
+	0xe0, 0x13, 0x98, 0x03, 0x28, 0x02, 0xd1, 0x03, 
+	0x20, 0xff, 0x49, 0x1e, 0x70, 0x88, 0xe0, 0x0c, 
+	0x98, 0x03, 0x28, 0x08, 0xd1, 0x09, 0x20, 0x00, 
+	0x49, 0x21, 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 
+	0x20, 0x00, 0x49, 0x1f, 0x68, 0x09, 0x31, 0x60, 
+	0x76, 0x88, 0x7d, 0x30, 0x07, 0xc0, 0x0f, 0xc0, 
+	0x28, 0x01, 0xd1, 0x03, 0x1c, 0x20, 0x49, 0x1c, 
+	0xf0, 0x00, 0xf9, 0x16, 0x20, 0x00, 0x70, 0xb0, 
+	0x20, 0x00, 0xb0, 0x04, 0xe6, 0x92, 0xb0, 0x01, 
+	0xb0, 0x03, 0xe6, 0x8f, 0xe6, 0x8e, 0x00, 0x00, 
+	0x2e, 0x08, 0x5d, 0xd8, 0x2e, 0x08, 0x5d, 0xd4, 
+	0x2e, 0x08, 0x5d, 0xcc, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0x3f, 0xff, 0x6a, 0x00, 0x00, 0x18, 
+	0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x5d, 0xe0, 0xff, 0xff, 0x1f, 0xff, 
+	0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x5d, 0xdc, 
+	0x00, 0x00, 0x20, 0x01, 0x2e, 0x08, 0x5e, 0x38, 
+	0x2e, 0x08, 0x5e, 0x04, 0xcc, 0x00, 0x0f, 0x00, 
+	0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5e, 0x48, 
+	0x2e, 0x08, 0x5e, 0x4c, 0x00, 0x00, 0x20, 0xa0, 
+	0x2e, 0x08, 0x7c, 0x4c, 0x66, 0x00, 0x01, 0xf0, 
+	0xff, 0xff, 0x00, 0x00, 0xb5, 0xff, 0x98, 0x00, 
+	0x06, 0x01, 0x0e, 0x09, 0x98, 0x01, 0x06, 0x02, 
+	0x0e, 0x12, 0x98, 0x02, 0x04, 0x07, 0x0c, 0x3f, 
+	0x9b, 0x03, 0x04, 0x1c, 0x0c, 0x24, 0x29, 0x20, 
+	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2a, 0x02, 0xd1, 0x0a, 
+	0x00, 0xc8, 0x4b, 0x1f, 0x68, 0x1b, 0x58, 0x18, 
+	0x4b, 0x1e, 0x40, 0x18, 0x00, 0xcb, 0x4d, 0x1c, 
+	0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x30, 0x2a, 0x01, 
+	0xd1, 0x0b, 0x00, 0xc8, 0x4b, 0x18, 0x68, 0x1b, 
+	0x58, 0x18, 0x43, 0x27, 0x1c, 0x3b, 0x43, 0x18, 
+	0x00, 0xcb, 0x4d, 0x15, 0x68, 0x2d, 0x50, 0xe8, 
+	0xe0, 0x22, 0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, 
+	0xe0, 0x1e, 0x1c, 0x43, 0x06, 0x1b, 0x16, 0x18, 
+	0xe7, 0xf8, 0x2a, 0x03, 0xd1, 0x0b, 0x00, 0xc3, 
+	0x4d, 0x0d, 0x68, 0x2d, 0x58, 0xeb, 0x1c, 0x3d, 
+	0x43, 0x25, 0x43, 0x1d, 0x00, 0xc3, 0x4e, 0x0a, 
+	0x68, 0x36, 0x50, 0xf5, 0xe0, 0x0b, 0x2a, 0x04, 
+	0xd1, 0x09, 0x00, 0xc3, 0x4d, 0x06, 0x68, 0x2d, 
+	0x58, 0xed, 0x4b, 0x06, 0x40, 0x2b, 0x00, 0xc5, 
+	0x4e, 0x03, 0x68, 0x36, 0x51, 0x73, 0xe7, 0xe0, 
+	0x20, 0x00, 0xe7, 0xbb, 0xe7, 0xba, 0x00, 0x00, 
+	0x2e, 0x08, 0x5d, 0xd8, 0xff, 0xff, 0xe1, 0xff, 
+	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38, 
+	0x0e, 0x00, 0x06, 0x11, 0x0e, 0x09, 0x4c, 0x14, 
+	0x68, 0x25, 0x4b, 0x14, 0x40, 0x2b, 0x60, 0x23, 
+	0x28, 0x01, 0xd1, 0x06, 0x4c, 0x10, 0x68, 0x25, 
+	0x23, 0x01, 0x04, 0x1b, 0x43, 0x2b, 0x60, 0x23, 
+	0xe0, 0x07, 0x28, 0x00, 0xd1, 0x05, 0x4c, 0x0c, 
+	0x68, 0x25, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x2b, 
+	0x60, 0x23, 0x29, 0x01, 0xd1, 0x06, 0x4c, 0x08, 
+	0x68, 0x25, 0x23, 0x01, 0x03, 0x9b, 0x43, 0x2b, 
+	0x60, 0x23, 0xe0, 0x07, 0x29, 0x02, 0xd1, 0x05, 
+	0x4c, 0x03, 0x68, 0x25, 0x23, 0x01, 0x03, 0xdb, 
+	0x43, 0x2b, 0x60, 0x23, 0xbc, 0xb0, 0x47, 0x70, 
+	0x64, 0x00, 0x00, 0x24, 0xff, 0xbe, 0x3f, 0xff, 
+	0xb5, 0xff, 0x1c, 0x1f, 0x9c, 0x09, 0xb0, 0x82, 
+	0x98, 0x02, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, 
+	0x99, 0x03, 0x06, 0x0a, 0x0e, 0x12, 0x98, 0x04, 
+	0x06, 0x05, 0x0e, 0x2d, 0x98, 0x0c, 0x06, 0x00, 
+	0x0e, 0x00, 0x90, 0x01, 0x00, 0xd0, 0x1a, 0x80, 
+	0x00, 0x80, 0x4b, 0x1b, 0x68, 0x1b, 0x18, 0xc1, 
+	0x2a, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2d, 0x1f, 0xdb, 0x02, 0x20, 0xaf, 0xb0, 0x02, 
+	0xe7, 0xf6, 0x71, 0x8d, 0x68, 0x3b, 0x00, 0xd0, 
+	0x4e, 0x12, 0x68, 0x36, 0x19, 0x80, 0x60, 0x43, 
+	0x1c, 0x20, 0x71, 0xc8, 0x20, 0x00, 0x80, 0x88, 
+	0x20, 0x00, 0x60, 0xc8, 0x98, 0x00, 0x23, 0x01, 
+	0x43, 0x18, 0x75, 0x08, 0x98, 0x01, 0x74, 0x88, 
+	0x60, 0x8f, 0x88, 0xb8, 0x82, 0x08, 0x20, 0x00, 
+	0x74, 0xc8, 0x88, 0xb8, 0x61, 0x38, 0x20, 0x00, 
+	0x73, 0x38, 0x20, 0x00, 0x73, 0x78, 0x20, 0x00, 
+	0x73, 0xb8, 0x20, 0x00, 0x73, 0xf8, 0x20, 0x00, 
+	0xb0, 0x02, 0xe7, 0xd1, 0xb0, 0x02, 0xe7, 0xcf, 
+	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xdc, 
+	0xb5, 0xf3, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, 
+	0x99, 0x01, 0x04, 0x0d, 0x0c, 0x2d, 0x00, 0xe0, 
+	0x1b, 0x00, 0x00, 0x80, 0x49, 0x25, 0x68, 0x09, 
+	0x18, 0x47, 0x2c, 0x20, 0xdb, 0x04, 0x20, 0xa2, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x4b, 0x21, 0x42, 0x9d, 0xd1, 0x27, 0x00, 0xe1, 
+	0x4b, 0x20, 0x68, 0x1b, 0x18, 0xc8, 0x00, 0xa1, 
+	0x4b, 0x1f, 0x68, 0x1b, 0x18, 0xca, 0x68, 0x11, 
+	0x4b, 0x1e, 0x40, 0x19, 0x60, 0x11, 0x68, 0x01, 
+	0x23, 0x40, 0x40, 0x19, 0xd0, 0x13, 0x68, 0x01, 
+	0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 
+	0x21, 0x00, 0x4b, 0x19, 0x68, 0x1b, 0x70, 0x19, 
+	0x49, 0x18, 0x68, 0x0b, 0x08, 0x5b, 0x00, 0x5b, 
+	0x60, 0x0b, 0x49, 0x17, 0x68, 0x0e, 0x23, 0x01, 
+	0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b, 0x68, 0x01, 
+	0x4b, 0x14, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, 
+	0x75, 0x38, 0x20, 0x00, 0x80, 0x38, 0x20, 0x00, 
+	0x80, 0xb8, 0x68, 0xb8, 0x72, 0x44, 0x20, 0xa0, 
+	0x68, 0xb9, 0x72, 0x08, 0x20, 0x00, 0x60, 0xb8, 
+	0x79, 0xb9, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x11, 
+	0xf9, 0xc3, 0x20, 0x00, 0x71, 0xb8, 0x20, 0x00, 
+	0xe7, 0xba, 0xe7, 0xb9, 0x2e, 0x08, 0x5d, 0xcc, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5d, 0xd8, 
+	0x2e, 0x08, 0x5d, 0xd4, 0xff, 0xff, 0xdf, 0xff, 
+	0x2e, 0x08, 0x5d, 0xc8, 0x6a, 0x00, 0x00, 0x18, 
+	0x6c, 0x00, 0x00, 0x20, 0xff, 0xff, 0x3f, 0xde, 
+	0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
+	0x06, 0x28, 0x0e, 0x00, 0x06, 0x23, 0x0e, 0x1b, 
+	0x06, 0x39, 0x0e, 0x09, 0x9e, 0x03, 0x06, 0x36, 
+	0x16, 0x32, 0x28, 0x20, 0xda, 0x02, 0x4e, 0x08, 
+	0x68, 0x36, 0x60, 0x30, 0x4e, 0x07, 0x68, 0x36, 
+	0x60, 0x33, 0x4e, 0x07, 0x68, 0x36, 0x60, 0x31, 
+	0x4e, 0x06, 0x68, 0x36, 0x60, 0x32, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x5d, 0xf4, 0x2e, 0x08, 0x5d, 0xf8, 
+	0x2e, 0x08, 0x5d, 0xfc, 0x2e, 0x08, 0x5e, 0x00, 
+	0x1c, 0x01, 0x06, 0x08, 0x0e, 0x00, 0x28, 0x01, 
+	0xd1, 0x04, 0x22, 0x01, 0x4b, 0x04, 0x68, 0x1b, 
+	0x60, 0x1a, 0xe0, 0x03, 0x22, 0x02, 0x4b, 0x02, 
+	0x68, 0x1b, 0x60, 0x1a, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x3c, 0xb5, 0xf1, 0x98, 0x00, 
+	0x06, 0x04, 0x0e, 0x24, 0xb0, 0x81, 0x27, 0x00, 
+	0x26, 0x00, 0x4a, 0x55, 0x92, 0x00, 0x00, 0xe0, 
+	0x49, 0x54, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, 
+	0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0x9b, 
+	0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, 
+	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x00, 0xe0, 0x49, 0x4c, 0x68, 0x09, 0x58, 0x08, 
+	0x21, 0x20, 0x43, 0x01, 0x00, 0xe0, 0x4a, 0x49, 
+	0x68, 0x12, 0x50, 0x11, 0x21, 0x00, 0x48, 0x48, 
+	0xf0, 0x05, 0xfc, 0x3c, 0x48, 0x47, 0x68, 0x00, 
+	0x28, 0x00, 0xd1, 0x01, 0xe0, 0x08, 0xe0, 0x82, 
+	0x20, 0x02, 0xf0, 0x0c, 0xf8, 0x75, 0x1c, 0x38, 
+	0x37, 0x01, 0x4b, 0x43, 0x42, 0x98, 0xd3, 0xf1, 
+	0x4b, 0x41, 0x42, 0x9f, 0xd3, 0x00, 0x26, 0xa1, 
+	0x48, 0x40, 0x68, 0x01, 0x4b, 0x40, 0x40, 0x19, 
+	0x60, 0x01, 0x20, 0x00, 0x00, 0xe1, 0x1b, 0x09, 
+	0x00, 0x89, 0x4a, 0x3e, 0x68, 0x12, 0x18, 0x89, 
+	0x70, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x3c, 
+	0x67, 0x48, 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x20, 
+	0x23, 0x00, 0x22, 0x00, 0x49, 0x39, 0xf7, 0xff, 
+	0xfc, 0x69, 0xb0, 0x01, 0x27, 0x00, 0x25, 0x00, 
+	0x2d, 0x04, 0xdb, 0x02, 0xe0, 0x1e, 0x35, 0x01, 
+	0xe7, 0xfa, 0x00, 0xa9, 0x22, 0x0f, 0x1c, 0x10, 
+	0x40, 0x88, 0x01, 0x29, 0x9a, 0x00, 0x18, 0x89, 
+	0x68, 0x49, 0x42, 0xa1, 0xd1, 0x11, 0x21, 0x33, 
+	0x06, 0x49, 0x6b, 0xc9, 0x40, 0x01, 0xd0, 0x01, 
+	0x37, 0x01, 0xe0, 0x00, 0xe0, 0x02, 0x4b, 0x26, 
+	0x42, 0x9f, 0xd3, 0xf4, 0x4b, 0x24, 0x42, 0x9f, 
+	0xd3, 0x02, 0x26, 0xa1, 0xe0, 0x02, 0xe0, 0x3a, 
+	0x27, 0x00, 0xe7, 0xe0, 0x48, 0x26, 0x68, 0x01, 
+	0x23, 0xff, 0x33, 0x01, 0x43, 0x19, 0x60, 0x01, 
+	0x48, 0x21, 0x6d, 0x80, 0x49, 0x20, 0x65, 0x88, 
+	0x48, 0x1f, 0x6b, 0xc0, 0x23, 0x01, 0x07, 0x9b, 
+	0x40, 0x18, 0xd0, 0x00, 0xe7, 0xf8, 0x20, 0x33, 
+	0x06, 0x40, 0x6d, 0x40, 0x21, 0x33, 0x06, 0x49, 
+	0x66, 0x48, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, 
+	0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x20, 0x03, 
+	0x02, 0x00, 0x49, 0x15, 0x67, 0x48, 0x48, 0x11, 
+	0x68, 0x01, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x19, 
+	0x60, 0x01, 0x20, 0x00, 0x49, 0x13, 0x65, 0x88, 
+	0x20, 0x00, 0x49, 0x12, 0x65, 0xc8, 0x20, 0x00, 
+	0x49, 0x10, 0x66, 0x08, 0x21, 0x00, 0x20, 0xff, 
+	0xf0, 0x05, 0xfb, 0xb8, 0x1c, 0x30, 0xb0, 0x01, 
+	0xe7, 0x66, 0xb0, 0x01, 0xe7, 0x64, 0xe7, 0x63, 
+	0x9e, 0x00, 0x00, 0xc0, 0x2e, 0x08, 0x5d, 0xd8, 
+	0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, 
+	0x00, 0x1e, 0x84, 0x80, 0x66, 0x00, 0x00, 0x4c, 
+	0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0x5d, 0xcc, 
+	0x66, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, 0xff, 
+	0x66, 0x00, 0x00, 0xe0, 0xcc, 0x00, 0x00, 0x00, 
+	0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, 
+	0xb0, 0x81, 0x25, 0x00, 0x26, 0x00, 0x4a, 0x2e, 
+	0x92, 0x00, 0x00, 0xf8, 0x49, 0x2d, 0x68, 0x09, 
+	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, 0xd8, 
+	0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0xd4, 0xc0, 
+	0x2e, 0x08, 0x5d, 0xd4, 0xb5, 0xff, 0x99, 0x01, 
+	0x06, 0x0f, 0x0e, 0x3f, 0x9a, 0x02, 0x06, 0x15, 
+	0x0e, 0x2d, 0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, 
+	0x2d, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2f, 0x20, 
+	0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x2e, 0x80, 
+	0xd0, 0x13, 0xf0, 0x11, 0xf8, 0x67, 0x1c, 0x04, 
+	0x1c, 0x39, 0x22, 0x80, 0x20, 0x01, 0xf0, 0x00, 
+	0xfb, 0x6d, 0x2c, 0x80, 0xd0, 0x01, 0xf0, 0x11, 
+	0xf8, 0x93, 0x98, 0x00, 0x21, 0x80, 0x68, 0x49, 
+	0x60, 0x08, 0x48, 0x09, 0x68, 0x00, 0x70, 0x05, 
+	0xe0, 0x0b, 0xf0, 0x11, 0xf8, 0x53, 0x1c, 0x04, 
+	0x1c, 0x39, 0x22, 0x80, 0x20, 0x02, 0xf0, 0x00, 
+	0xfb, 0x59, 0x2c, 0x80, 0xd0, 0x01, 0xf0, 0x11, 
+	0xf8, 0x7f, 0x20, 0x00, 0xe7, 0xd3, 0xe7, 0xd2, 
+	0x2e, 0x08, 0x5e, 0x24, 0xb5, 0xff, 0x99, 0x01, 
+	0x06, 0x0e, 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x17, 
+	0x0e, 0x3f, 0x9b, 0x03, 0x06, 0x1c, 0x0e, 0x24, 
+	0xb0, 0x82, 0x20, 0x80, 0x40, 0x38, 0x90, 0x00, 
+	0x06, 0x7f, 0x0e, 0x7f, 0x2e, 0x1f, 0xdb, 0x05, 
+	0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, 0xdb, 0x02, 
+	0x20, 0xa2, 0xb0, 0x02, 0xe7, 0xf6, 0x2f, 0x04, 
+	0xd1, 0x00, 0x27, 0x00, 0x00, 0xe0, 0x1b, 0x00, 
+	0x00, 0x80, 0x49, 0x17, 0x68, 0x09, 0x18, 0x40, 
+	0x90, 0x01, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x0d, 
+	0xf0, 0x11, 0xf8, 0x18, 0x1c, 0x05, 0x1c, 0x21, 
+	0x22, 0x01, 0x02, 0x92, 0x20, 0x02, 0xf0, 0x00, 
+	0xfb, 0x1d, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x11, 
+	0xf8, 0x43, 0xe0, 0x13, 0xf0, 0x11, 0xf8, 0x0a, 
+	0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, 
+	0x20, 0x01, 0xf0, 0x00, 0xfb, 0x0f, 0x2d, 0x80, 
+	0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x35, 0x98, 0x02, 
+	0x21, 0x80, 0x68, 0x89, 0x60, 0x08, 0x20, 0x80, 
+	0x6a, 0x00, 0x55, 0xc6, 0x20, 0x00, 0xb0, 0x02, 
+	0xe7, 0xc4, 0xb0, 0x02, 0xe7, 0xc2, 0x00, 0x00, 
+	0x2e, 0x08, 0x5d, 0xcc, 0xb5, 0xff, 0xb0, 0x82, 
+	0x99, 0x03, 0x04, 0x0d, 0x0c, 0x2d, 0x9a, 0x04, 
+	0x06, 0x10, 0x0e, 0x00, 0x90, 0x00, 0x9b, 0x05, 
+	0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x00, 
+	0x28, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x2f, 
+	0x98, 0x00, 0x49, 0x2c, 0x68, 0x09, 0x73, 0x08, 
+	0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x26, 
+	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
+	0x20, 0x01, 0x40, 0xb8, 0x99, 0x02, 0x40, 0x08, 
+	0xd0, 0x1c, 0x24, 0x00, 0x20, 0x40, 0x40, 0x28, 
+	0xd0, 0x04, 0x04, 0x20, 0x0c, 0x00, 0x24, 0x01, 
+	0x03, 0xa4, 0x43, 0x04, 0x20, 0x80, 0x40, 0x28, 
+	0xd0, 0x04, 0x04, 0x20, 0x0c, 0x00, 0x24, 0x01, 
+	0x03, 0xe4, 0x43, 0x04, 0xf0, 0x10, 0xff, 0xb2, 
+	0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x01, 
+	0xf0, 0x00, 0xfa, 0xb8, 0x2e, 0x80, 0xd0, 0x01, 
+	0xf0, 0x10, 0xff, 0xde, 0xe7, 0xd8, 0xe0, 0x24, 
+	0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x20, 
+	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
+	0x20, 0x01, 0x40, 0xb8, 0x99, 0x02, 0x40, 0x08, 
+	0xd0, 0x16, 0x24, 0x00, 0x20, 0x40, 0x40, 0x28, 
+	0xd0, 0x01, 0x4b, 0x0d, 0x40, 0x1c, 0x20, 0x80, 
+	0x40, 0x28, 0xd0, 0x01, 0x04, 0x64, 0x0c, 0x64, 
+	0xf0, 0x10, 0xff, 0x8c, 0x1c, 0x06, 0x1c, 0x22, 
+	0x1c, 0x39, 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x92, 
+	0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x10, 0xff, 0xb8, 
+	0xe7, 0xde, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x9f, 
+	0xb0, 0x02, 0xe7, 0x9d, 0x2e, 0x08, 0x5e, 0x18, 
+	0x00, 0x00, 0xbf, 0xff, 0xb5, 0x80, 0x1c, 0x07, 
+	0x48, 0x07, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x19, 
+	0xfe, 0x51, 0x60, 0x38, 0x48, 0x04, 0x68, 0x00, 
+	0x1d, 0x01, 0x20, 0x00, 0xf0, 0x19, 0xfe, 0x4a, 
+	0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x5e, 0x18, 0xb5, 0xf7, 0x1c, 0x07, 
+	0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x9a, 0x02, 
+	0x06, 0x14, 0x0e, 0x24, 0x2e, 0x1f, 0xdb, 0x04, 
+	0x20, 0xaf, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x2c, 0x20, 0xdb, 0x01, 0x20, 0xa2, 
+	0xe7, 0xf7, 0x20, 0x80, 0x40, 0x20, 0xd0, 0x0d, 
+	0xf0, 0x10, 0xff, 0x4c, 0x1c, 0x05, 0x1c, 0x21, 
+	0x22, 0x01, 0x02, 0xd2, 0x20, 0x02, 0xf0, 0x00, 
+	0xfa, 0x51, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, 
+	0xff, 0x77, 0xe0, 0x16, 0x48, 0x0c, 0x68, 0x00, 
+	0x60, 0x07, 0x48, 0x0b, 0x68, 0x00, 0x71, 0x46, 
+	0x20, 0xff, 0x49, 0x09, 0x68, 0x09, 0x71, 0x08, 
+	0xf0, 0x10, 0xff, 0x34, 0x1c, 0x05, 0x1c, 0x21, 
+	0x22, 0x01, 0x02, 0xd2, 0x20, 0x01, 0xf0, 0x00, 
+	0xfa, 0x39, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, 
+	0xff, 0x5f, 0x20, 0x00, 0xe7, 0xcd, 0xe7, 0xcc, 
+	0x2e, 0x08, 0x5e, 0x1c, 0xb5, 0xf7, 0x1c, 0x07, 
+	0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x9a, 0x02, 
+	0x06, 0x14, 0x0e, 0x24, 0x2e, 0x1f, 0xdb, 0x04, 
+	0x20, 0xaf, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x2c, 0x20, 0xdb, 0x01, 0x20, 0xa2, 
+	0xe7, 0xf7, 0x20, 0x80, 0x40, 0x20, 0xd0, 0x0d, 
+	0xf0, 0x10, 0xff, 0x0c, 0x1c, 0x05, 0x1c, 0x21, 
+	0x22, 0x01, 0x03, 0x12, 0x20, 0x02, 0xf0, 0x00, 
+	0xfa, 0x11, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, 
+	0xff, 0x37, 0xe0, 0x16, 0x48, 0x0c, 0x68, 0x00, 
+	0x60, 0x07, 0x48, 0x0b, 0x68, 0x00, 0x71, 0x46, 
+	0x20, 0xff, 0x49, 0x09, 0x68, 0x09, 0x71, 0x08, 
+	0xf0, 0x10, 0xfe, 0xf4, 0x1c, 0x05, 0x1c, 0x21, 
+	0x22, 0x01, 0x03, 0x12, 0x20, 0x01, 0xf0, 0x00, 
+	0xf9, 0xf9, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, 
+	0xff, 0x1f, 0x20, 0x00, 0xe7, 0xcd, 0xe7, 0xcc, 
+	0x2e, 0x08, 0x5e, 0x20, 0xb5, 0xff, 0xb0, 0x81, 
+	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
+	0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0x9a, 0x03, 
+	0x06, 0x16, 0x0e, 0x36, 0x9f, 0x04, 0x1c, 0x29, 
+	0x98, 0x00, 0xf0, 0x00, 0xf8, 0x91, 0x28, 0x00, 
+	0xd0, 0x05, 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x79, 0x38, 
+	0x79, 0x79, 0x18, 0x40, 0x79, 0xb9, 0x18, 0x40, 
+	0x06, 0x04, 0x0e, 0x24, 0x79, 0xb8, 0x02, 0x00, 
+	0x43, 0x04, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 
+	0x49, 0x15, 0x68, 0x09, 0x50, 0x0c, 0x9b, 0x04, 
+	0x88, 0x99, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 
+	0x4a, 0x11, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 
+	0x78, 0x78, 0x78, 0x39, 0x18, 0x40, 0x78, 0xb9, 
+	0x18, 0x40, 0x06, 0x04, 0x0e, 0x24, 0x78, 0xb8, 
+	0x02, 0x00, 0x43, 0x04, 0x00, 0x68, 0x19, 0x80, 
+	0x01, 0x00, 0x49, 0x09, 0x68, 0x09, 0x18, 0x40, 
+	0x60, 0x84, 0x9b, 0x04, 0x88, 0x19, 0x00, 0x68, 
+	0x19, 0x80, 0x01, 0x00, 0x4a, 0x04, 0x68, 0x12, 
+	0x18, 0x80, 0x60, 0xc1, 0x20, 0x00, 0xb0, 0x01, 
+	0xe7, 0xc5, 0xb0, 0x01, 0xe7, 0xc3, 0x00, 0x00, 
+	0x2e, 0x08, 0x5d, 0xd0, 0xb5, 0xff, 0x1c, 0x07, 
+	0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x01, 0x06, 0x0c, 
+	0x0e, 0x24, 0x9a, 0x02, 0x06, 0x16, 0x0e, 0x36, 
+	0x1c, 0x21, 0x1c, 0x28, 0xf0, 0x00, 0xf8, 0x40, 
+	0x28, 0x00, 0xd0, 0x04, 0x20, 0xa2, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x9a, 0x03, 
+	0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x02, 
+	0xe7, 0xf5, 0xe7, 0xf4, 0xb4, 0xf0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x21, 0x0e, 0x09, 
+	0x06, 0x3a, 0x0e, 0x12, 0x29, 0x10, 0xdb, 0x02, 
+	0x20, 0xa2, 0xbc, 0xf0, 0x47, 0x70, 0x88, 0xdd, 
+	0x00, 0x48, 0x18, 0x80, 0x01, 0x00, 0x4e, 0x0f, 
+	0x68, 0x36, 0x50, 0x35, 0x88, 0x98, 0x00, 0x4d, 
+	0x18, 0xad, 0x01, 0x2d, 0x4e, 0x0b, 0x68, 0x36, 
+	0x19, 0xad, 0x60, 0x68, 0x88, 0x58, 0x00, 0x4d, 
+	0x18, 0xad, 0x01, 0x2d, 0x4e, 0x07, 0x68, 0x36, 
+	0x19, 0xad, 0x60, 0xa8, 0x88, 0x18, 0x00, 0x4d, 
+	0x18, 0xad, 0x01, 0x2d, 0x4e, 0x03, 0x68, 0x36, 
+	0x19, 0xad, 0x60, 0xe8, 0x20, 0x00, 0xe7, 0xdc, 
+	0xe7, 0xdb, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, 
+	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, 
+	0x0e, 0x09, 0x06, 0x15, 0x0e, 0x2d, 0xb0, 0x81, 
+	0x29, 0x20, 0xdb, 0x03, 0x20, 0xa2, 0xb0, 0x01, 
+	0xbc, 0xb0, 0x47, 0x70, 0x2d, 0x10, 0xdb, 0x02, 
+	0x20, 0xa2, 0xb0, 0x01, 0xe7, 0xf8, 0x00, 0xc8, 
+	0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc4, 0x68, 0x20, 
+	0x90, 0x00, 0x98, 0x00, 0x4b, 0x08, 0x40, 0x18, 
+	0x90, 0x00, 0x00, 0x68, 0x23, 0x1e, 0x40, 0x18, 
+	0x9b, 0x00, 0x43, 0x18, 0x90, 0x00, 0x98, 0x00, 
+	0x60, 0x20, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xe3, 
+	0xb0, 0x01, 0xe7, 0xe1, 0x2e, 0x08, 0x5d, 0xd8, 
+	0xff, 0xff, 0xdf, 0xe1, 0x20, 0xff, 0x49, 0x02, 
+	0x68, 0x09, 0x70, 0x08, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x34, 0xb4, 0xb0, 0x1c, 0x07, 
+	0x1c, 0x0a, 0xb0, 0x83, 0x20, 0x00, 0x43, 0xc0, 
+	0x23, 0x19, 0x06, 0x9b, 0x67, 0x58, 0x08, 0xb9, 
+	0x00, 0x89, 0x1a, 0x78, 0x90, 0x02, 0x98, 0x02, 
+	0x18, 0x10, 0x07, 0x80, 0x0f, 0x80, 0x90, 0x01, 
+	0x98, 0x02, 0x18, 0x10, 0x08, 0x80, 0x90, 0x00, 
+	0x9b, 0x02, 0x20, 0x03, 0x1a, 0xc0, 0x23, 0x19, 
+	0x06, 0x9b, 0x67, 0xd8, 0x24, 0x00, 0x98, 0x00, 
+	0x42, 0x84, 0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, 
+	0xe7, 0xf9, 0xc9, 0x08, 0x20, 0x19, 0x06, 0x80, 
+	0x67, 0x03, 0xe7, 0xf8, 0x98, 0x01, 0x28, 0x00, 
+	0xd0, 0x0b, 0x9b, 0x01, 0x00, 0xd8, 0x25, 0x00, 
+	0x43, 0xed, 0x40, 0xc5, 0x1c, 0x2b, 0x43, 0xdb, 
+	0x68, 0x0d, 0x40, 0x2b, 0x25, 0x19, 0x06, 0xad, 
+	0x67, 0x2b, 0x20, 0x19, 0x06, 0x80, 0x6f, 0x40, 
+	0xb0, 0x03, 0xbc, 0xb0, 0x47, 0x70, 0xb0, 0x03, 
+	0xe7, 0xfb, 0x1c, 0x01, 0x06, 0x08, 0x0e, 0x00, 
+	0x22, 0x19, 0x06, 0x92, 0x63, 0x90, 0x47, 0x70, 
+	0xb4, 0xf0, 0x48, 0x4d, 0x6a, 0x80, 0x07, 0xc0, 
+	0x0f, 0xc0, 0xd0, 0x74, 0x22, 0x00, 0x27, 0x00, 
+	0x49, 0x4a, 0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, 
+	0xe0, 0x16, 0x1c, 0x43, 0x06, 0x18, 0x0e, 0x00, 
+	0xe7, 0xf8, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 
+	0x03, 0x5b, 0x40, 0x23, 0xd0, 0x0b, 0x24, 0x01, 
+	0x40, 0x84, 0x1c, 0x23, 0x43, 0x1f, 0x00, 0x83, 
+	0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x9c, 
+	0x1c, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xe8, 
+	0x20, 0x00, 0x28, 0x04, 0xdb, 0x04, 0xe0, 0x1a, 
+	0x1c, 0x43, 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 
+	0x01, 0x05, 0x4b, 0x39, 0x18, 0xec, 0x22, 0x00, 
+	0x2a, 0x04, 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x53, 
+	0x06, 0x1a, 0x0e, 0x12, 0xe7, 0xf8, 0x4b, 0x35, 
+	0x60, 0x23, 0x4b, 0x35, 0x60, 0x63, 0x23, 0x00, 
+	0x60, 0xa3, 0x23, 0x00, 0x60, 0xe3, 0x34, 0xff, 
+	0x34, 0x01, 0xe7, 0xf0, 0xe7, 0xe4, 0xb0, 0x82, 
+	0x4b, 0x2b, 0x69, 0xdc, 0x23, 0x0c, 0x40, 0x23, 
+	0x08, 0x9c, 0xab, 0x01, 0x70, 0x1c, 0x4b, 0x28, 
+	0x69, 0xdc, 0x23, 0x30, 0x40, 0x23, 0x09, 0x1c, 
+	0xab, 0x00, 0x70, 0x1c, 0xab, 0x01, 0x78, 0x1b, 
+	0xac, 0x00, 0x78, 0x24, 0x42, 0xa3, 0xd1, 0x09, 
+	0x23, 0x33, 0x06, 0x5b, 0x6b, 0xdb, 0x2b, 0x00, 
+	0xd1, 0x04, 0x4b, 0x1f, 0x6a, 0x9b, 0x07, 0xdb, 
+	0x0f, 0xdb, 0xd0, 0x21, 0x4b, 0x1c, 0x69, 0xdd, 
+	0x23, 0x0c, 0x40, 0x2b, 0x08, 0x9c, 0x00, 0xa5, 
+	0x26, 0x01, 0x40, 0xae, 0x1c, 0x33, 0x25, 0x33, 
+	0x06, 0x6d, 0x64, 0x2b, 0x25, 0x01, 0x40, 0xa5, 
+	0x1c, 0x2b, 0x4d, 0x1a, 0x63, 0xab, 0x4b, 0x14, 
+	0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b, 0x08, 0x9d, 
+	0xab, 0x01, 0x70, 0x1d, 0xe0, 0x00, 0xe0, 0x1d, 
+	0x4b, 0x0f, 0x69, 0xdd, 0x23, 0x30, 0x40, 0x2b, 
+	0x09, 0x1d, 0xab, 0x00, 0x70, 0x1d, 0xe7, 0xcd, 
+	0xb0, 0x02, 0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, 
+	0xe0, 0x10, 0x1c, 0x43, 0x06, 0x18, 0x0e, 0x00, 
+	0xe7, 0xf8, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, 
+	0x40, 0x3b, 0xd0, 0x06, 0x00, 0x83, 0x58, 0xcc, 
+	0x23, 0x01, 0x03, 0x5b, 0x43, 0x23, 0x00, 0x84, 
+	0x51, 0x0b, 0xe7, 0xee, 0xbc, 0xf0, 0x47, 0x70, 
+	0x66, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x80, 
+	0x9e, 0x00, 0x00, 0xc0, 0x9e, 0x00, 0x00, 0x00, 
+	0x2e, 0x0f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, 
+	0xb4, 0x80, 0x1c, 0x03, 0x1c, 0x0a, 0x48, 0x0a, 
+	0x68, 0x00, 0x68, 0x01, 0x20, 0x19, 0x06, 0x80, 
+	0x6a, 0x80, 0x0a, 0x40, 0x00, 0x4f, 0x43, 0x38, 
+	0x60, 0x18, 0x0f, 0xc8, 0x07, 0xc0, 0x60, 0x10, 
+	0x68, 0x10, 0x0f, 0xc0, 0x60, 0x10, 0x20, 0x00, 
+	0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x40, 0xb5, 0x80, 0x1c, 0x07, 
+	0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, 0x31, 0x01, 
+	0x20, 0x00, 0xf0, 0x19, 0xfb, 0xdb, 0x60, 0x38, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x18, 0xb4, 0xf0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x20, 0x0e, 0x00, 
+	0x06, 0x39, 0x0e, 0x09, 0x04, 0x1a, 0x0c, 0x12, 
+	0x4d, 0x07, 0x68, 0x2d, 0x70, 0xe8, 0x4d, 0x06, 
+	0x68, 0x2d, 0x70, 0xa9, 0x4d, 0x04, 0x68, 0x2d, 
+	0x80, 0x2a, 0x25, 0x01, 0x04, 0x2d, 0x26, 0x33, 
+	0x06, 0x76, 0x60, 0x35, 0xbc, 0xf0, 0x47, 0x70, 
+	0x2e, 0x08, 0x5e, 0x44, 0x20, 0x0d, 0x06, 0xc0, 
+	0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 
+	0x31, 0x01, 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x99, 
+	0xd9, 0x03, 0x20, 0x2d, 0x01, 0x00, 0x47, 0x70, 
+	0xe0, 0x01, 0x1c, 0x08, 0xe7, 0xfb, 0xe7, 0xfa, 
+	0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x03, 
+	0x20, 0x00, 0x90, 0x02, 0x9f, 0x05, 0x69, 0x3d, 
+	0x69, 0x38, 0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, 
+	0xb0, 0x05, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x99, 0x06, 0x68, 0x88, 0x68, 0x09, 
+	0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04, 0x69, 0x78, 
+	0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, 
+	0x08, 0x49, 0x91, 0x04, 0x00, 0xa8, 0x49, 0xf8, 
+	0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 0x61, 0xf8, 
+	0x99, 0x06, 0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, 
+	0x30, 0x01, 0x63, 0xb8, 0x68, 0xf8, 0x90, 0x01, 
+	0x48, 0xf2, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 
+	0x98, 0x01, 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x98, 0x01, 
+	0x28, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
+	0x20, 0x00, 0x28, 0x00, 0xd0, 0x07, 0x1d, 0xf8, 
+	0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xea, 
+	0x20, 0x00, 0xb0, 0x05, 0xe7, 0xc5, 0x49, 0xe6, 
+	0x20, 0x91, 0xf0, 0x19, 0xfb, 0x5b, 0x28, 0x92, 
+	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0b, 0xfb, 0x64, 
+	0xe7, 0xf5, 0x98, 0x01, 0x00, 0x80, 0x49, 0xe1, 
+	0x58, 0x08, 0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, 
+	0x20, 0x92, 0x49, 0xdd, 0x60, 0x08, 0x20, 0xff, 
+	0xb0, 0x05, 0xe7, 0xae, 0x48, 0xd9, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x03, 0x2d, 0x0b, 0xdb, 0x26, 
+	0x2d, 0x12, 0xdc, 0x24, 0x2d, 0x0b, 0xdb, 0x0b, 
+	0x2d, 0x12, 0xdc, 0x09, 0x48, 0xd6, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x05, 0x1d, 0xf8, 0x30, 0x21, 
+	0x99, 0x06, 0xf0, 0x02, 0xf9, 0xbb, 0xe0, 0x16, 
+	0x6b, 0x38, 0xf7, 0xff, 0xff, 0x7c, 0x90, 0x00, 
+	0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xcf, 0xf0, 0x0c, 
+	0xfb, 0x4b, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 
+	0xf0, 0x02, 0xf9, 0xac, 0x6b, 0x38, 0xf7, 0xff, 
+	0xff, 0x6e, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 
+	0x48, 0xc8, 0xf0, 0x0c, 0xfb, 0x6b, 0x48, 0xc8, 
+	0x68, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x30, 
+	0x48, 0xc0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2c, 
+	0x48, 0xc1, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0a, 
+	0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x90, 0x02, 
+	0x98, 0x02, 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 
+	0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0xba, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d, 0x6a, 0xb8, 
+	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, 0x80, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0xf0, 0x0c, 0xfa, 0x22, 0x20, 0x92, 
+	0x49, 0x7b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x7b, 
+	0x68, 0x09, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x39, 
+	0x2d, 0x12, 0xdc, 0x37, 0xb0, 0x81, 0x24, 0x00, 
+	0x20, 0x00, 0x90, 0x03, 0x20, 0x01, 0x49, 0x75, 
+	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, 0x32, 0xf4, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x7d, 0x9c, 
+	0x2e, 0x08, 0x7c, 0xc4, 0x2e, 0x08, 0x5e, 0x54, 
+	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, 
+	0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xbc, 
+	0x00, 0x00, 0xff, 0xff, 0x26, 0x01, 0xe7, 0xcd, 
+	0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xfd, 0xc3, 
+	0x90, 0x01, 0x2c, 0x07, 0xd2, 0x12, 0x48, 0x48, 
+	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b, 0xfb, 0xcc, 
+	0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x49, 0x44, 
+	0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, 
+	0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39, 0xf0, 0x0b, 
+	0xfd, 0x21, 0xe0, 0x4a, 0x2c, 0x18, 0xd2, 0x48, 
+	0x1f, 0xe0, 0x49, 0x3d, 0x68, 0x09, 0xf0, 0x0b, 
+	0xfc, 0x0b, 0x20, 0x4c, 0x43, 0x60, 0x49, 0x3a, 
+	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
+	0x38, 0x0a, 0x9a, 0x01, 0x1c, 0x39, 0xf0, 0x0b, 
+	0xfd, 0x0d, 0x20, 0x4c, 0x43, 0x60, 0x49, 0x34, 
+	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
+	0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 
+	0x20, 0x4c, 0x43, 0x60, 0x49, 0x2e, 0x68, 0x09, 
+	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
+	0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 
+	0x20, 0x4c, 0x43, 0x60, 0x49, 0x28, 0x68, 0x09, 
+	0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
+	0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 
+	0x20, 0x02, 0x21, 0x4c, 0x43, 0x61, 0x4a, 0x22, 
+	0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 
+	0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 
+	0x21, 0x4c, 0x43, 0x61, 0x4a, 0x1c, 0x68, 0x12, 
+	0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 
+	0x67, 0x48, 0x48, 0x19, 0x68, 0x00, 0xf0, 0x0c, 
+	0xf8, 0xcf, 0x6b, 0x79, 0x48, 0x16, 0x68, 0x00, 
+	0xf0, 0x0b, 0xfc, 0x36, 0x98, 0x02, 0x42, 0x84, 
+	0xda, 0x01, 0x1c, 0x21, 0xe0, 0x00, 0x99, 0x02, 
+	0x91, 0x00, 0x99, 0x00, 0x48, 0x10, 0x68, 0x00, 
+	0xf0, 0x0b, 0xfd, 0x46, 0x49, 0x0f, 0x20, 0x91, 
+	0xf0, 0x19, 0xf8, 0xfc, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x03, 
+	0x48, 0x0b, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, 
+	0x98, 0x03, 0x49, 0x09, 0x60, 0x08, 0x20, 0x92, 
+	0x49, 0x06, 0x60, 0x08, 0xb0, 0x04, 0x20, 0x92, 
+	0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 
+	0xe5, 0x4b, 0xb0, 0x05, 0xe5, 0x49, 0x00, 0x00, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x7c, 0xc8, 
+	0xb5, 0xff, 0x1c, 0x07, 0x9d, 0x09, 0xb0, 0x89, 
+	0x26, 0x00, 0x20, 0x00, 0x90, 0x03, 0x99, 0x0a, 
+	0x68, 0x4c, 0x2d, 0x13, 0xd1, 0x05, 0x20, 0x75, 
+	0xb0, 0x09, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x98, 0x15, 0x60, 0x04, 0x20, 0x00, 
+	0x60, 0xe0, 0x20, 0x00, 0x61, 0x20, 0x69, 0x60, 
+	0x4b, 0xf9, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00, 
+	0x69, 0x60, 0x4b, 0xf8, 0x40, 0x18, 0x61, 0x60, 
+	0x04, 0x80, 0x69, 0x60, 0x4b, 0xf6, 0x40, 0x18, 
+	0x61, 0x60, 0x05, 0x80, 0x69, 0x60, 0x23, 0xc0, 
+	0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, 0x06, 0x00, 
+	0x69, 0x60, 0x4b, 0xf2, 0x40, 0x18, 0x61, 0x60, 
+	0x04, 0x40, 0x69, 0x60, 0x23, 0x20, 0x43, 0xdb, 
+	0x40, 0x18, 0x61, 0x60, 0x06, 0x80, 0x69, 0x60, 
+	0x09, 0x40, 0x01, 0x40, 0x61, 0x60, 0x06, 0xc0, 
+	0x20, 0x00, 0x61, 0xa0, 0x20, 0x00, 0x61, 0xe0, 
+	0x20, 0x00, 0x62, 0x20, 0x20, 0x00, 0x62, 0x60, 
+	0x20, 0x00, 0x63, 0xa0, 0x20, 0x00, 0x63, 0xe0, 
+	0x20, 0x00, 0x64, 0x60, 0x20, 0x00, 0x64, 0x20, 
+	0x20, 0x00, 0x60, 0x20, 0x20, 0x00, 0x71, 0x20, 
+	0x99, 0x0a, 0x68, 0x48, 0x64, 0xe0, 0x99, 0x0a, 
+	0x68, 0x08, 0x64, 0xa0, 0x1d, 0xe0, 0x30, 0x21, 
+	0x99, 0x13, 0xf0, 0x01, 0xff, 0x07, 0x2d, 0x0b, 
+	0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04, 0x1d, 0xe0, 
+	0x30, 0x49, 0x99, 0x13, 0xf0, 0x01, 0xfe, 0xfe, 
+	0x6b, 0x20, 0x6a, 0xa1, 0x1a, 0x40, 0x30, 0x01, 
+	0x63, 0xa0, 0x00, 0xa8, 0x49, 0xd4, 0x58, 0x08, 
+	0x69, 0x61, 0x09, 0x49, 0x01, 0x49, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x43, 0x08, 0x61, 0x60, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x6b, 0x20, 0x6a, 0xa1, 0x1a, 0x40, 
+	0x1c, 0x41, 0x91, 0x04, 0x69, 0x60, 0x23, 0x04, 
+	0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 
+	0x91, 0x04, 0x00, 0xa8, 0x49, 0xc9, 0x58, 0x08, 
+	0x99, 0x04, 0x43, 0x48, 0x61, 0xe0, 0x2d, 0x13, 
+	0xd1, 0x04, 0x20, 0x00, 0x90, 0x14, 0x20, 0x00, 
+	0x61, 0xa0, 0xe0, 0x13, 0x9b, 0x0c, 0x68, 0x58, 
+	0x90, 0x01, 0x98, 0x01, 0x08, 0x80, 0x61, 0xa0, 
+	0x98, 0x01, 0x64, 0x60, 0x9b, 0x0c, 0x68, 0x18, 
+	0x64, 0x20, 0x20, 0x00, 0x62, 0x60, 0x9a, 0x0b, 
+	0x63, 0xe2, 0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, 
+	0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xb6, 
+	0x40, 0x18, 0x61, 0x60, 0x05, 0x80, 0x69, 0x60, 
+	0x23, 0x0f, 0x02, 0x9b, 0x43, 0x18, 0x61, 0x60, 
+	0x04, 0x80, 0x69, 0x60, 0x23, 0x20, 0x43, 0xdb, 
+	0x40, 0x18, 0x61, 0x60, 0x06, 0x80, 0x69, 0x60, 
+	0x23, 0xc0, 0x43, 0x18, 0x61, 0x60, 0x06, 0x00, 
+	0x69, 0x60, 0x23, 0x01, 0x03, 0x9b, 0x43, 0x18, 
+	0x61, 0x60, 0x04, 0x40, 0x98, 0x14, 0x60, 0xe0, 
+	0x61, 0x25, 0x48, 0xab, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x06, 0x98, 0x14, 0x28, 0x19, 0xd3, 0x01, 
+	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 
+	0x98, 0x14, 0x28, 0x08, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 
+	0x20, 0x00, 0xb0, 0x09, 0xe7, 0x35, 0x49, 0xa1, 
+	0x20, 0x91, 0xf0, 0x18, 0xff, 0xff, 0x28, 0x92, 
+	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0b, 0xf8, 0x08, 
+	0xe7, 0xf5, 0x48, 0x9d, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x53, 0x68, 0x38, 0x01, 0x80, 0x0f, 0xc0, 
+	0x68, 0xa1, 0x4b, 0x9a, 0x40, 0x19, 0x07, 0xc0, 
+	0x09, 0x80, 0x43, 0x08, 0x60, 0xa0, 0x01, 0x80, 
+	0x0f, 0xc0, 0x68, 0x38, 0x01, 0xc0, 0x0f, 0xc0, 
+	0x68, 0xa1, 0x4b, 0x95, 0x40, 0x19, 0x07, 0xc0, 
+	0x09, 0xc0, 0x43, 0x08, 0x60, 0xa0, 0x01, 0xc0, 
+	0x0f, 0xc0, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 
+	0x68, 0xa1, 0x4b, 0x85, 0x40, 0x19, 0x06, 0x00, 
+	0x0e, 0x00, 0x04, 0x00, 0x43, 0x08, 0x60, 0xa0, 
+	0x02, 0x00, 0x0e, 0x00, 0x48, 0x86, 0x68, 0x00, 
+	0x28, 0x00, 0xd1, 0x2a, 0x2f, 0x00, 0xd0, 0x28, 
+	0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00, 0x1c, 0x06, 
+	0x68, 0x38, 0x4b, 0x85, 0x43, 0x98, 0xd0, 0x06, 
+	0x68, 0x38, 0x02, 0x00, 0x0e, 0x01, 0x20, 0x01, 
+	0x40, 0x88, 0x43, 0x06, 0xe0, 0x05, 0x68, 0x38, 
+	0x02, 0x00, 0x0e, 0x00, 0x21, 0x01, 0x40, 0x81, 
+	0x43, 0x8e, 0x68, 0x38, 0x4b, 0x7b, 0x43, 0x98, 
+	0xd0, 0x08, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 
+	0x1d, 0xc1, 0x31, 0x01, 0x20, 0x01, 0x40, 0x88, 
+	0x43, 0x06, 0xe0, 0x06, 0x68, 0x38, 0x02, 0x00, 
+	0x0e, 0x00, 0x30, 0x08, 0x21, 0x01, 0x40, 0x81, 
+	0x43, 0x8e, 0x2d, 0x0b, 0xdb, 0x0a, 0x2d, 0x12, 
+	0xdc, 0x08, 0x48, 0x6f, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x04, 0x20, 0x51, 0x01, 0x00, 0x21, 0x0d, 
+	0x06, 0xc9, 0x60, 0x08, 0x98, 0x14, 0x00, 0x80, 
+	0x49, 0x6c, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x01, 
+	0x20, 0x83, 0x90, 0x03, 0x2d, 0x0b, 0xdb, 0x08, 
+	0x2d, 0x12, 0xdc, 0x06, 0x48, 0x68, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x01, 0x20, 0x84, 0x90, 0x03, 
+	0xe0, 0x06, 0x9a, 0x0b, 0x2a, 0x01, 0xd1, 0x03, 
+	0x2d, 0x13, 0xd0, 0x01, 0x20, 0x82, 0x90, 0x03, 
+	0x98, 0x03, 0x28, 0x00, 0xd0, 0x07, 0x20, 0x92, 
+	0x49, 0x5a, 0x60, 0x08, 0x20, 0x08, 0x60, 0xe0, 
+	0x98, 0x03, 0xb0, 0x09, 0xe6, 0xa1, 0x98, 0x15, 
+	0x68, 0x01, 0x98, 0x14, 0x00, 0x80, 0x4a, 0x59, 
+	0x50, 0x11, 0x6a, 0xa0, 0x28, 0x00, 0xda, 0x01, 
+	0x20, 0x00, 0x62, 0xa0, 0x6b, 0x20, 0x28, 0x00, 
+	0xdc, 0x01, 0x20, 0x01, 0x63, 0x20, 0x6a, 0xe0, 
+	0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xe0, 
+	0x6b, 0x60, 0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, 
+	0x48, 0x50, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 
+	0xfb, 0x9e, 0x90, 0x00, 0x2d, 0x13, 0xd1, 0x05, 
+	0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x4c, 0xf0, 0x0b, 
+	0xff, 0x99, 0xe0, 0x15, 0x2d, 0x0b, 0xdb, 0x01, 
+	0x2d, 0x12, 0xdd, 0x03, 0x48, 0x40, 0x68, 0x00, 
+	0x28, 0x00, 0xd1, 0x0d, 0x2d, 0x0b, 0xdb, 0x06, 
+	0x2d, 0x12, 0xdc, 0x04, 0x48, 0x3e, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x00, 0xe0, 0x04, 0x6a, 0xa1, 
+	0x9a, 0x00, 0x48, 0x41, 0xf0, 0x0b, 0xff, 0x82, 
+	0x2d, 0x0b, 0xdb, 0x5f, 0x2d, 0x12, 0xdc, 0x5e, 
+	0x98, 0x15, 0x68, 0x00, 0x49, 0x3a, 0x60, 0x08, 
+	0x99, 0x13, 0xa8, 0x05, 0xf0, 0x01, 0xfd, 0xae, 
+	0xa9, 0x05, 0x98, 0x15, 0x68, 0x00, 0xf0, 0x05, 
+	0xfc, 0x5f, 0x1d, 0xe0, 0x30, 0x21, 0xa9, 0x05, 
+	0xf0, 0x01, 0xfd, 0xa4, 0x20, 0x01, 0x49, 0x35, 
+	0x65, 0x08, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 
+	0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 
+	0xfa, 0xdd, 0x2d, 0x0b, 0xd0, 0x05, 0x2d, 0x0f, 
+	0xd0, 0x03, 0x2d, 0x10, 0xd0, 0x01, 0x2d, 0x11, 
+	0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x04, 
+	0xfa, 0xd1, 0x2d, 0x0c, 0xd0, 0x01, 0x2d, 0x0f, 
+	0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x04, 
+	0xfa, 0xc9, 0x2d, 0x0d, 0xd0, 0x01, 0x2d, 0x10, 
+	0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x04, 
+	0xfa, 0xc1, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, 
+	0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x04, 
+	0xfa, 0xb9, 0x48, 0x15, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x73, 0xb0, 0x82, 0x49, 0x1c, 0x20, 0x91, 
+	0xf0, 0x18, 0xfe, 0xe4, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0xf0, 0x0b, 0xfe, 0x86, 0x20, 0x92, 
+	0x49, 0x17, 0x60, 0x08, 0x20, 0x01, 0x49, 0x17, 
+	0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x15, 
+	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
+	0x66, 0x88, 0xe0, 0x25, 0xe0, 0xae, 0xe0, 0xad, 
+	0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 
+	0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xbf, 0xff, 
+	0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x03, 0x32, 0xf4, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x60, 0x8c, 0xfd, 0xff, 0xff, 0xff, 
+	0xfe, 0xff, 0xff, 0xff, 0x2e, 0x08, 0x7c, 0x60, 
+	0x2e, 0x08, 0x7c, 0xc4, 0x00, 0x00, 0x02, 0x3f, 
+	0x2e, 0x08, 0x7d, 0x9c, 0xcc, 0x00, 0x00, 0x00, 
+	0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xbc, 
+	0x6a, 0xa0, 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 
+	0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 
+	0x31, 0x02, 0x43, 0x08, 0x90, 0x00, 0x20, 0x00, 
+	0x62, 0xa0, 0x20, 0x00, 0x62, 0xe0, 0x48, 0x5f, 
+	0x63, 0x20, 0x48, 0x5f, 0x63, 0x60, 0x6b, 0x20, 
+	0xf7, 0xff, 0xfa, 0xe1, 0x90, 0x02, 0x48, 0x5d, 
+	0x68, 0x00, 0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, 
+	0x9a, 0x02, 0x1c, 0x21, 0xf0, 0x0b, 0xfa, 0x4a, 
+	0x98, 0x00, 0x49, 0x58, 0x68, 0x09, 0x23, 0x07, 
+	0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x55, 
+	0x68, 0x00, 0x21, 0x00, 0xf0, 0x0b, 0xfa, 0xc4, 
+	0x48, 0x52, 0x68, 0x00, 0xf0, 0x0b, 0xfe, 0x38, 
+	0x49, 0x51, 0x20, 0x91, 0xf0, 0x18, 0xfe, 0x76, 
+	0xe0, 0x00, 0xe0, 0x11, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf6, 0x48, 0x4c, 0x68, 0x00, 0x90, 0x01, 
+	0x48, 0x4c, 0x68, 0x00, 0x49, 0x49, 0x60, 0x08, 
+	0x98, 0x01, 0x49, 0x4a, 0x60, 0x08, 0x20, 0x92, 
+	0x49, 0x47, 0x60, 0x08, 0xb0, 0x02, 0xe0, 0x40, 
+	0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0c, 
+	0x6a, 0xa0, 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 
+	0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 
+	0x31, 0x02, 0x43, 0x08, 0x49, 0x41, 0x60, 0x08, 
+	0xe0, 0x0c, 0x6a, 0xa0, 0x30, 0x01, 0x05, 0x00, 
+	0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 
+	0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, 
+	0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d, 0x06, 0xc0, 
+	0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 
+	0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x82, 
+	0x48, 0x33, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x07, 
+	0x20, 0x00, 0x62, 0xa0, 0x20, 0x00, 0x62, 0xe0, 
+	0x48, 0x2a, 0x63, 0x20, 0x48, 0x2a, 0x63, 0x60, 
+	0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x78, 0x90, 0x00, 
+	0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00, 
+	0xfd, 0xfb, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 
+	0x60, 0x88, 0xe0, 0x05, 0x2d, 0x13, 0xd1, 0x03, 
+	0x20, 0x1f, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, 
+	0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x1a, 
+	0x48, 0x23, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 
+	0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 
+	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
+	0xf0, 0x00, 0xfe, 0x50, 0x6b, 0x20, 0xf7, 0xff, 
+	0xfa, 0x52, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14, 
+	0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xd5, 0x98, 0x02, 
+	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0x48, 0x14, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x06, 0x48, 0x14, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x0d, 
+	0x06, 0xc0, 0x62, 0x06, 0x48, 0x0e, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x07, 0x48, 0x0e, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x03, 0x98, 0x14, 0x21, 0x00, 
+	0xf0, 0x0b, 0xfd, 0x0a, 0x20, 0x92, 0x49, 0x0b, 
+	0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe5, 0x10, 
+	0xb0, 0x09, 0xe5, 0x0e, 0x00, 0x00, 0x02, 0xcf, 
+	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x7d, 0xbc, 
+	0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xc0, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x5e, 0x54, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0xb5, 0xf7, 0xb0, 0x83, 0x9f, 0x03, 0x69, 0x38, 
+	0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x05, 
+	0x20, 0x75, 0xb0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x6c, 0x78, 0x99, 0x04, 
+	0x60, 0x48, 0x6c, 0x38, 0x99, 0x04, 0x60, 0x08, 
+	0x6c, 0xf8, 0x9a, 0x05, 0x60, 0x50, 0x6c, 0xb8, 
+	0x9a, 0x05, 0x60, 0x10, 0x68, 0xfd, 0x48, 0xf9, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 
+	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, 0x97, 0x28, 0x92, 
+	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xfd, 0xa0, 
+	0xe7, 0xf5, 0x00, 0xa8, 0x49, 0xeb, 0x58, 0x08, 
+	0x99, 0x03, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 
+	0x49, 0xe7, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, 
+	0xe7, 0xc4, 0x21, 0x00, 0x00, 0xa8, 0x4a, 0xe5, 
+	0x50, 0x11, 0x48, 0xe2, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x05, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x16, 
+	0x69, 0x38, 0x28, 0x12, 0xdc, 0x13, 0x48, 0xe0, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x06, 0x69, 0x38, 
+	0x28, 0x0b, 0xdb, 0x03, 0x69, 0x38, 0x28, 0x12, 
+	0xdc, 0x00, 0xe0, 0x08, 0x6b, 0x38, 0xf7, 0xff, 
+	0xf9, 0xb6, 0x90, 0x01, 0x6a, 0xb9, 0x9a, 0x01, 
+	0x48, 0xd8, 0xf0, 0x0b, 0xfd, 0x85, 0x69, 0x38, 
+	0x28, 0x0b, 0xdb, 0x2e, 0x69, 0x38, 0x28, 0x12, 
+	0xdc, 0x2b, 0x48, 0xd0, 0x68, 0x00, 0x28, 0x00, 
+	0xd1, 0x27, 0x20, 0x00, 0x49, 0xd2, 0x65, 0x08, 
+	0x20, 0x01, 0x03, 0x00, 0x49, 0xd0, 0x65, 0x48, 
+	0x20, 0x00, 0x49, 0xcf, 0x65, 0x88, 0x20, 0x00, 
+	0x49, 0xcd, 0x65, 0xc8, 0x20, 0x00, 0x49, 0xcc, 
+	0x66, 0x08, 0x20, 0x00, 0x49, 0xcb, 0x60, 0x08, 
+	0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 
+	0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf9, 0x0a, 
+	0x48, 0xc3, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 
+	0x48, 0xc5, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 
+	0xe0, 0x02, 0x48, 0xc3, 0x49, 0xc3, 0x60, 0x08, 
+	0xe0, 0x06, 0x69, 0x38, 0x28, 0x13, 0xd1, 0x03, 
+	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, 
+	0x48, 0xb6, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2c, 
+	0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 
+	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
+	0xf0, 0x00, 0xfd, 0x64, 0x20, 0x00, 0x43, 0xc0, 
+	0x00, 0xe9, 0x4b, 0xb7, 0x18, 0xc9, 0x60, 0x08, 
+	0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb4, 
+	0x18, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, 
+	0x00, 0xe9, 0x4b, 0xb1, 0x18, 0xc9, 0x64, 0x08, 
+	0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xae, 
+	0x18, 0xc9, 0x64, 0x48, 0x20, 0x01, 0x40, 0xa8, 
+	0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 
+	0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
+	0xe0, 0x9c, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x74, 
+	0x69, 0x38, 0x28, 0x12, 0xdc, 0x72, 0x48, 0x9b, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0x20, 0x00, 
+	0x49, 0x9d, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00, 
+	0x49, 0x9b, 0x65, 0x48, 0x20, 0x00, 0x49, 0x9a, 
+	0x65, 0x88, 0x20, 0x00, 0x49, 0x98, 0x65, 0xc8, 
+	0x20, 0x00, 0x49, 0x97, 0x66, 0x08, 0x20, 0x00, 
+	0x49, 0x96, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d, 
+	0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 
+	0xf0, 0x04, 0xf8, 0xa0, 0x49, 0x95, 0x20, 0x91, 
+	0xf0, 0x18, 0xfc, 0xd0, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0xf0, 0x0b, 0xfc, 0x72, 0x20, 0x92, 
+	0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x00, 
+	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, 0x6a, 
+	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x60, 
+	0x68, 0x04, 0x48, 0x60, 0x68, 0x00, 0x49, 0x5e, 
+	0x60, 0x08, 0x48, 0x5e, 0x60, 0x04, 0x20, 0x92, 
+	0x49, 0x5a, 0x60, 0x08, 0x48, 0x52, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x73, 0x48, 0x4d, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x6f, 0x1c, 0x28, 0xf0, 0x0b, 
+	0xfb, 0x9d, 0x28, 0x01, 0xd1, 0x6a, 0x98, 0x00, 
+	0x28, 0x0b, 0xdb, 0x02, 0x98, 0x00, 0x28, 0x12, 
+	0xdd, 0x65, 0xb0, 0x84, 0x49, 0x4f, 0x20, 0x91, 
+	0xf0, 0x18, 0xfc, 0x44, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0xf0, 0x0b, 0xfb, 0xe6, 0x48, 0x4c, 
+	0x68, 0x00, 0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, 
+	0x48, 0x49, 0x68, 0x00, 0x68, 0x40, 0x38, 0x01, 
+	0x49, 0x47, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 
+	0x49, 0x44, 0x60, 0x08, 0x20, 0x01, 0x49, 0x44, 
+	0x68, 0x09, 0x60, 0x08, 0x24, 0x00, 0x20, 0x00, 
+	0x90, 0x02, 0x98, 0x02, 0x28, 0x00, 0xd1, 0x15, 
+	0x2c, 0x07, 0xd2, 0x13, 0x6a, 0xf8, 0x05, 0x81, 
+	0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 
+	0x18, 0x18, 0x00, 0xc0, 0x4a, 0x3a, 0x68, 0x12, 
+	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, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x7d, 0x9c, 
+	0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, 
+	0x3f, 0xff, 0xff, 0xff, 0x2e, 0x08, 0x5e, 0x54, 
+	0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, 
+	0x00, 0x00, 0x04, 0xcc, 0x61, 0x88, 0xe0, 0x2d, 
+	0x26, 0x01, 0x21, 0x00, 0x91, 0x00, 0x48, 0x2b, 
+	0x68, 0x00, 0x68, 0x40, 0x99, 0x00, 0x42, 0x88, 
+	0xd8, 0x04, 0xe0, 0x06, 0x99, 0x00, 0x31, 0x01, 
+	0x91, 0x00, 0xe7, 0xf4, 0x00, 0x70, 0x1c, 0x46, 
+	0xe7, 0xf8, 0x08, 0x76, 0x00, 0x76, 0x48, 0x23, 
+	0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 
+	0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0x49, 0x1f, 
+	0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
+	0x61, 0x88, 0x48, 0x1c, 0x68, 0x00, 0x23, 0x0d, 
+	0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x43, 0x30, 
+	0x49, 0x18, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
+	0x18, 0xc9, 0x61, 0x88, 0x1c, 0x21, 0x48, 0x15, 
+	0x68, 0x00, 0xf0, 0x0a, 0xff, 0xb1, 0x6b, 0x79, 
+	0x48, 0x12, 0x68, 0x00, 0xf0, 0x0a, 0xfe, 0xe6, 
+	0x1c, 0x28, 0x21, 0x00, 0xf0, 0x0b, 0xfa, 0x88, 
+	0x49, 0x0f, 0x20, 0x91, 0xf0, 0x18, 0xfb, 0x5e, 
+	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, 
+	0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, 
+	0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, 
+	0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 
+	0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x03, 0xe5, 0x86, 0xb0, 0x03, 
+	0xe5, 0x84, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xbc, 
+	0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xc0, 
+	0x2e, 0x08, 0x7c, 0xc8, 0xb5, 0xf3, 0xb0, 0x85, 
+	0x20, 0x00, 0x90, 0x01, 0x9d, 0x05, 0x9f, 0x06, 
+	0x69, 0x28, 0x90, 0x04, 0x69, 0x3c, 0x98, 0x04, 
+	0x28, 0x13, 0xd0, 0x01, 0x2c, 0x13, 0xd1, 0x05, 
+	0x20, 0xff, 0xb0, 0x05, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x68, 0xf9, 
+	0x91, 0x03, 0x48, 0xdf, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2e, 0x08, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0x28, 0x00, 0xd0, 0x20, 0x48, 0xd6, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0xe0, 0x05, 0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, 
+	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 
+	0xd0, 0x06, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, 
+	0x20, 0x00, 0xb0, 0x05, 0xe7, 0xce, 0xe1, 0x92, 
+	0x1c, 0x3d, 0x9f, 0x05, 0x9e, 0x03, 0x68, 0xf9, 
+	0x91, 0x03, 0x9c, 0x04, 0xe0, 0xaa, 0x48, 0xc6, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, 
+	0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
+	0x20, 0x00, 0xe0, 0x05, 0x99, 0x03, 0x29, 0x08, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0x28, 0x00, 0xd1, 0x73, 0x49, 0xbd, 0x20, 0x91, 
+	0xf0, 0x18, 0xfa, 0xdc, 0x28, 0x92, 0xd0, 0x03, 
+	0x20, 0x01, 0xf0, 0x0a, 0xfa, 0xe5, 0xe7, 0xf5, 
+	0x00, 0xb0, 0x49, 0xb9, 0x58, 0x08, 0x42, 0xa8, 
+	0xd1, 0x05, 0x99, 0x03, 0x00, 0x88, 0x49, 0xb6, 
+	0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, 
+	0x49, 0xb2, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 
+	0xe7, 0x98, 0x48, 0xb2, 0x68, 0x00, 0x42, 0xa8, 
+	0xd0, 0x03, 0x48, 0xb0, 0x68, 0x00, 0x42, 0xb8, 
+	0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 
+	0x90, 0x01, 0x98, 0x01, 0x28, 0x01, 0xd1, 0x03, 
+	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 
+	0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, 0x00, 0xb0, 
+	0x49, 0xa5, 0x50, 0x0f, 0x99, 0x03, 0x00, 0x88, 
+	0x49, 0xa3, 0x50, 0x0d, 0x48, 0xa0, 0x68, 0x00, 
+	0x28, 0x00, 0xd1, 0x55, 0x20, 0x0d, 0x06, 0xc0, 
+	0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 
+	0x06, 0xc9, 0x60, 0x88, 0x20, 0x01, 0x40, 0xb0, 
+	0x99, 0x02, 0x40, 0x08, 0xd1, 0x12, 0x99, 0x03, 
+	0x20, 0x01, 0x40, 0x88, 0x99, 0x02, 0x40, 0x08, 
+	0xd0, 0x0b, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 
+	0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 
+	0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x43, 0x08, 
+	0x90, 0x02, 0xe0, 0x11, 0x99, 0x03, 0x20, 0x01, 
+	0x40, 0x88, 0x99, 0x02, 0x40, 0x08, 0xd1, 0x0b, 
+	0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x02, 
+	0x40, 0x08, 0x90, 0x02, 0x99, 0x03, 0x20, 0x01, 
+	0x40, 0x88, 0x99, 0x02, 0x43, 0x08, 0x90, 0x02, 
+	0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0xbc, 0x90, 0x00, 
+	0x9a, 0x00, 0xe0, 0x00, 0xe0, 0x22, 0x99, 0x03, 
+	0x1c, 0x28, 0xf0, 0x00, 0xfa, 0x3d, 0x6b, 0x38, 
+	0xf7, 0xfe, 0xfe, 0xb1, 0x90, 0x00, 0x9a, 0x00, 
+	0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x34, 
+	0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
+	0x48, 0x7c, 0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, 
+	0x48, 0x7a, 0x68, 0x00, 0x42, 0xb8, 0xd1, 0x03, 
+	0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 
+	0x20, 0x92, 0x49, 0x74, 0x60, 0x08, 0x20, 0x00, 
+	0xb0, 0x05, 0xe7, 0x1b, 0x49, 0x71, 0x20, 0x91, 
+	0xf0, 0x18, 0xfa, 0x44, 0x28, 0x92, 0xd0, 0x03, 
+	0x20, 0x01, 0xf0, 0x0a, 0xfa, 0x4d, 0xe7, 0xf5, 
+	0x00, 0xb0, 0x49, 0x6d, 0x58, 0x08, 0x42, 0xa8, 
+	0xd0, 0x05, 0x20, 0x92, 0x49, 0x69, 0x60, 0x08, 
+	0x20, 0xff, 0xb0, 0x05, 0xe7, 0x06, 0x2c, 0x0b, 
+	0xdb, 0x12, 0x2c, 0x12, 0xdc, 0x10, 0x48, 0x67, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x09, 0x48, 0x65, 
+	0x68, 0x00, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92, 
+	0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 
+	0xe6, 0xf4, 0x48, 0x60, 0x60, 0x07, 0xe0, 0x08, 
+	0x6b, 0xf8, 0x28, 0x01, 0xd1, 0x05, 0x20, 0x92, 
+	0x49, 0x5a, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 
+	0xe6, 0xe8, 0x48, 0x5a, 0x68, 0x00, 0x42, 0xa8, 
+	0xd1, 0x02, 0x20, 0x00, 0x49, 0x57, 0x60, 0x08, 
+	0x00, 0xb0, 0x49, 0x55, 0x50, 0x0f, 0x99, 0x03, 
+	0x60, 0xe9, 0x60, 0xfe, 0x48, 0x50, 0x68, 0x00, 
+	0x28, 0x00, 0xd1, 0x73, 0x6b, 0x28, 0xf7, 0xfe, 
+	0xfe, 0x4e, 0x90, 0x00, 0x6a, 0xa9, 0x9a, 0x00, 
+	0x48, 0x4f, 0xf0, 0x0b, 0xfa, 0x1d, 0x6b, 0x38, 
+	0xf7, 0xfe, 0xfe, 0x45, 0x90, 0x00, 0x6a, 0xb9, 
+	0x9a, 0x00, 0x48, 0x4b, 0xf0, 0x0b, 0xfa, 0x42, 
+	0x48, 0x48, 0x68, 0x00, 0x42, 0xa8, 0xd1, 0x0f, 
+	0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 
+	0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x07, 
+	0x21, 0x00, 0x20, 0x02, 0xf0, 0x03, 0xfd, 0xae, 
+	0x48, 0x42, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 
+	0x2c, 0x0b, 0xdb, 0x42, 0x2c, 0x12, 0xdc, 0x40, 
+	0x98, 0x04, 0x42, 0xa0, 0xd0, 0x2c, 0x20, 0x02, 
+	0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 
+	0x20, 0x02, 0xf0, 0x03, 0xfd, 0x9b, 0x2c, 0x0f, 
+	0xd0, 0x05, 0x2c, 0x10, 0xd0, 0x03, 0x2c, 0x11, 
+	0xd0, 0x01, 0x2c, 0x0b, 0xd1, 0x03, 0x21, 0x00, 
+	0x20, 0x12, 0xf0, 0x03, 0xfd, 0x8f, 0x2c, 0x0c, 
+	0xd0, 0x01, 0x2c, 0x0f, 0xd1, 0x03, 0x21, 0x00, 
+	0x20, 0x04, 0xf0, 0x03, 0xfd, 0x87, 0x2c, 0x0d, 
+	0xd0, 0x01, 0x2c, 0x10, 0xd1, 0x03, 0x21, 0x00, 
+	0x20, 0x08, 0xf0, 0x03, 0xfd, 0x7f, 0x2c, 0x0e, 
+	0xd0, 0x01, 0x2c, 0x11, 0xd1, 0x03, 0x21, 0x00, 
+	0x20, 0x01, 0xf0, 0x03, 0xfd, 0x77, 0xe0, 0x03, 
+	0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 
+	0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 
+	0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 
+	0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, 
+	0x61, 0x88, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 
+	0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 
+	0x60, 0x88, 0xe0, 0x00, 0xe0, 0x1f, 0x20, 0x01, 
+	0x40, 0xb0, 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 
+	0x90, 0x02, 0xf0, 0x00, 0xf9, 0xcf, 0x6b, 0x38, 
+	0xf7, 0xfe, 0xfd, 0xd1, 0x90, 0x00, 0x9a, 0x00, 
+	0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x54, 
+	0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 
+	0x2c, 0x0b, 0xdb, 0x08, 0x2c, 0x12, 0xdc, 0x06, 
+	0x98, 0x04, 0x42, 0xa0, 0xd1, 0x03, 0x20, 0x01, 
+	0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, 
+	0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 
+	0xe6, 0x3c, 0xb0, 0x05, 0xe6, 0x3a, 0xe6, 0x39, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7c, 0x60, 0x2e, 0x08, 0x7c, 0xc4, 
+	0x2e, 0x08, 0x7d, 0x9c, 0x3f, 0xff, 0xff, 0xff, 
+	0xb5, 0xf0, 0x1c, 0x07, 0x00, 0xb8, 0x49, 0x09, 
+	0x58, 0x0c, 0x1c, 0x7d, 0x60, 0xe5, 0x00, 0xa8, 
+	0x49, 0x06, 0x50, 0x0c, 0x6b, 0x20, 0xf7, 0xfe, 
+	0xfd, 0x9a, 0x1c, 0x06, 0x1c, 0x32, 0x1c, 0x29, 
+	0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x1d, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0x60, 
+	0xb5, 0xf0, 0x1c, 0x07, 0x00, 0xb8, 0x49, 0x09, 
+	0x58, 0x0c, 0x1e, 0x7d, 0x60, 0xe5, 0x00, 0xa8, 
+	0x49, 0x06, 0x50, 0x0c, 0x6b, 0x20, 0xf7, 0xfe, 
+	0xfd, 0x82, 0x1c, 0x06, 0x1c, 0x32, 0x1c, 0x29, 
+	0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x05, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0x60, 
+	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x86, 0x98, 0x06, 
+	0x90, 0x05, 0x98, 0x05, 0x68, 0xc5, 0x48, 0x77, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x05, 
+	0x20, 0xff, 0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x98, 0x05, 0x69, 0x00, 
+	0x28, 0x13, 0xd1, 0x02, 0x20, 0xff, 0xb0, 0x06, 
+	0xe7, 0xf4, 0x49, 0x69, 0x20, 0x91, 0xf0, 0x18, 
+	0xf9, 0x01, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
+	0xf0, 0x0a, 0xf9, 0x0a, 0xe7, 0xf5, 0x00, 0xa8, 
+	0x49, 0x64, 0x58, 0x08, 0x99, 0x05, 0x42, 0x88, 
+	0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, 
+	0x20, 0xff, 0xb0, 0x06, 0xe7, 0xde, 0x42, 0xbd, 
+	0xd1, 0x05, 0x20, 0x92, 0x49, 0x5c, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x06, 0xe7, 0xd6, 0x20, 0x00, 
+	0x00, 0xa9, 0x4a, 0x5a, 0x50, 0x50, 0x98, 0x05, 
+	0x60, 0xc7, 0x48, 0x59, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x0d, 0x48, 0x54, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x09, 0x99, 0x05, 0x00, 0xb8, 0x4a, 0x53, 
+	0x50, 0x11, 0x20, 0x92, 0x49, 0x50, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x06, 0xe7, 0xbe, 0x20, 0x0d, 
+	0x06, 0xc0, 0x68, 0x80, 0x1c, 0x04, 0x20, 0x00, 
+	0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0x20, 0x00, 
+	0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x4b, 0x18, 0xc9, 
+	0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 
+	0x4b, 0x48, 0x18, 0xc9, 0x60, 0x48, 0x20, 0x00, 
+	0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x45, 0x18, 0xc9, 
+	0x64, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 
+	0x4b, 0x42, 0x18, 0xc9, 0x64, 0x48, 0x20, 0x01, 
+	0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x40, 0x20, 
+	0xd1, 0x01, 0x20, 0x00, 0x90, 0x01, 0x20, 0x01, 
+	0x40, 0xa8, 0x43, 0xc0, 0x40, 0x04, 0x1c, 0x3e, 
+	0x42, 0xbd, 0xd9, 0x23, 0x00, 0xb0, 0x49, 0x37, 
+	0x58, 0x08, 0x28, 0x00, 0xd0, 0x01, 0x36, 0x01, 
+	0xe7, 0xf8, 0x1e, 0x70, 0x90, 0x04, 0x98, 0x04, 
+	0x42, 0xb8, 0xda, 0x04, 0xe0, 0x07, 0x98, 0x04, 
+	0x38, 0x01, 0x90, 0x04, 0xe7, 0xf7, 0x98, 0x04, 
+	0xf7, 0xff, 0xff, 0x32, 0xe7, 0xf7, 0x20, 0xff, 
+	0x40, 0xb8, 0x90, 0x03, 0x20, 0xff, 0x40, 0xb0, 
+	0x43, 0xc0, 0x99, 0x03, 0x40, 0x08, 0x90, 0x03, 
+	0x98, 0x03, 0x00, 0x40, 0x90, 0x03, 0x00, 0x60, 
+	0x90, 0x00, 0xe0, 0x1f, 0x00, 0xb0, 0x49, 0x25, 
+	0x58, 0x08, 0x28, 0x00, 0xd0, 0x01, 0x3e, 0x01, 
+	0xe7, 0xf8, 0x1c, 0x70, 0x90, 0x04, 0x98, 0x04, 
+	0x42, 0xb8, 0xd9, 0x04, 0xe0, 0x07, 0x98, 0x04, 
+	0x30, 0x01, 0x90, 0x04, 0xe7, 0xf7, 0x98, 0x04, 
+	0xf7, 0xff, 0xff, 0x26, 0xe7, 0xf7, 0x20, 0xff, 
+	0x40, 0xb0, 0x90, 0x03, 0x20, 0xff, 0x40, 0xb8, 
+	0x43, 0xc0, 0x99, 0x03, 0x40, 0x08, 0x90, 0x03, 
+	0x08, 0x60, 0x90, 0x00, 0x98, 0x00, 0x99, 0x03, 
+	0x40, 0x08, 0x90, 0x00, 0x98, 0x03, 0x43, 0x84, 
+	0x98, 0x00, 0x43, 0x04, 0x20, 0x01, 0x40, 0xb8, 
+	0x43, 0xc0, 0x40, 0x04, 0x98, 0x01, 0x40, 0xb8, 
+	0x43, 0x04, 0x99, 0x05, 0x00, 0xb8, 0x4a, 0x0d, 
+	0x50, 0x11, 0x98, 0x05, 0x6b, 0x00, 0xf7, 0xfe, 
+	0xfc, 0x92, 0x90, 0x02, 0x9a, 0x02, 0x1c, 0x39, 
+	0x98, 0x05, 0xf0, 0x00, 0xf8, 0x15, 0x20, 0x0d, 
+	0x06, 0xc0, 0x60, 0x84, 0x20, 0x92, 0x49, 0x04, 
+	0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x25, 
+	0xb0, 0x06, 0xe7, 0x23, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, 
+	0x2e, 0x08, 0x60, 0x8c, 0x68, 0x00, 0x04, 0x00, 
+	0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x01, 0x3d, 
+	0x4b, 0x2f, 0x18, 0xe9, 0x1d, 0xe2, 0x32, 0x0d, 
+	0x20, 0x00, 0x28, 0x03, 0xd3, 0x02, 0xe0, 0x04, 
+	0x30, 0x01, 0xe7, 0xfa, 0xca, 0x20, 0xc1, 0x20, 
+	0xe7, 0xfa, 0x6a, 0xe3, 0x05, 0x9d, 0x0d, 0xad, 
+	0x00, 0xfe, 0x4b, 0x28, 0x18, 0xf3, 0x60, 0x1d, 
+	0x6b, 0x63, 0x33, 0x01, 0x05, 0x9d, 0x0d, 0xad, 
+	0x00, 0xfe, 0x4b, 0x24, 0x18, 0xf3, 0x60, 0x5d, 
+	0x6a, 0xa5, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x1d, 
+	0x00, 0xfe, 0x4b, 0x20, 0x18, 0xf3, 0x64, 0x1d, 
+	0x9d, 0x02, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x1d, 
+	0x00, 0xfe, 0x4b, 0x1c, 0x18, 0xf3, 0x64, 0x5d, 
+	0x4b, 0x1b, 0x68, 0x1b, 0x2b, 0x01, 0xd1, 0x2a, 
+	0x2f, 0x00, 0xd1, 0x28, 0x4b, 0x17, 0x68, 0x5d, 
+	0x23, 0x8f, 0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x03, 
+	0x23, 0x8f, 0x00, 0x9b, 0x4d, 0x13, 0x60, 0x6b, 
+	0x4b, 0x12, 0x68, 0x1d, 0x4b, 0x13, 0x42, 0x9d, 
+	0xd3, 0x02, 0x4b, 0x12, 0x4d, 0x0f, 0x60, 0x2b, 
+	0x4b, 0x0e, 0x6c, 0x5d, 0x23, 0x01, 0x02, 0x9b, 
+	0x1a, 0xed, 0x23, 0xb3, 0x00, 0x9b, 0x42, 0x9d, 
+	0xd3, 0x02, 0x4b, 0x0d, 0x4d, 0x09, 0x64, 0x6b, 
+	0x4b, 0x08, 0x6c, 0x1d, 0x23, 0x01, 0x02, 0x9b, 
+	0x1a, 0xed, 0x4b, 0x0a, 0x42, 0x9d, 0xd3, 0x02, 
+	0x4b, 0x09, 0x4d, 0x04, 0x64, 0x2b, 0xb0, 0x03, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x04, 0x00, 
+	0x2e, 0x08, 0x60, 0x8c, 0x00, 0x00, 0x02, 0x3a, 
+	0x00, 0x00, 0x06, 0xcc, 0x00, 0x00, 0x02, 0xca, 
+	0x00, 0x00, 0x06, 0xca, 0xb4, 0xf0, 0x4f, 0x15, 
+	0x4c, 0x15, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 
+	0x43, 0xd2, 0x4d, 0x14, 0x68, 0x6d, 0x42, 0x85, 
+	0xdd, 0x1b, 0x1c, 0x05, 0x30, 0x01, 0x00, 0xad, 
+	0x59, 0x7b, 0x42, 0x93, 0xd0, 0xf9, 0x4d, 0x0f, 
+	0x68, 0x6d, 0x42, 0x85, 0xda, 0x00, 0xe0, 0x10, 
+	0x31, 0x01, 0x1c, 0x05, 0x30, 0x01, 0x00, 0xad, 
+	0x59, 0x7a, 0x42, 0x93, 0xd0, 0xf9, 0x02, 0x95, 
+	0x43, 0x1d, 0x1c, 0x2e, 0xc4, 0x40, 0x4d, 0x07, 
+	0x68, 0x6d, 0x42, 0x85, 0xdb, 0x00, 0x31, 0x01, 
+	0xe7, 0xdf, 0x25, 0x0d, 0x06, 0xed, 0x61, 0x29, 
+	0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x7c, 0xd4, 
+	0x68, 0x00, 0x0d, 0x40, 0x2e, 0x08, 0x7d, 0x9c, 
+	0xb5, 0xf3, 0xb0, 0x82, 0x9d, 0x02, 0x69, 0x2c, 
+	0x2c, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x02, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x68, 0xee, 0x48, 0xf8, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2e, 0x08, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0x28, 0x00, 0xd0, 0x02, 0x20, 0xff, 0xb0, 0x02, 
+	0xe7, 0xe6, 0x49, 0xef, 0x20, 0x91, 0xf0, 0x17, 
+	0xff, 0x61, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
+	0xf0, 0x09, 0xff, 0x6a, 0xe7, 0xf5, 0x00, 0xb0, 
+	0x49, 0xea, 0x58, 0x08, 0x99, 0x02, 0x42, 0x88, 
+	0xd0, 0x05, 0x20, 0x92, 0x49, 0xe6, 0x60, 0x08, 
+	0x20, 0xff, 0xb0, 0x02, 0xe7, 0xd0, 0x48, 0xe3, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 
+	0x06, 0xc0, 0x68, 0x80, 0x90, 0x01, 0x99, 0x03, 
+	0x29, 0x01, 0xd1, 0x05, 0x20, 0x01, 0x40, 0xb0, 
+	0x99, 0x01, 0x43, 0x08, 0x90, 0x01, 0xe0, 0x05, 
+	0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x01, 
+	0x40, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x0d, 
+	0x06, 0xc9, 0x60, 0x88, 0x48, 0xd8, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x73, 0x48, 0xd3, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x6f, 0x99, 0x03, 0x29, 0x01, 
+	0xd1, 0x6c, 0xb0, 0x83, 0x1c, 0x30, 0xf0, 0x0a, 
+	0xfe, 0x71, 0x28, 0x01, 0xd1, 0x05, 0x20, 0x92, 
+	0x49, 0xcd, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 
+	0xe7, 0x9e, 0x49, 0xce, 0x20, 0x91, 0xf0, 0x17, 
+	0xff, 0x19, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
+	0xf0, 0x0a, 0xfe, 0xbb, 0x2c, 0x0b, 0xdb, 0x01, 
+	0x2c, 0x12, 0xdd, 0x06, 0x48, 0xc8, 0x68, 0x00, 
+	0x68, 0x40, 0x30, 0x01, 0x49, 0xc6, 0x68, 0x09, 
+	0x60, 0x48, 0x20, 0x92, 0x49, 0xc3, 0x60, 0x08, 
+	0x20, 0x01, 0x49, 0xc3, 0x68, 0x09, 0x60, 0x08, 
+	0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12, 0xdc, 0x0f, 
+	0x48, 0xbf, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 
+	0x18, 0xc0, 0x69, 0x80, 0x23, 0x01, 0x43, 0x18, 
+	0x49, 0xbb, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
+	0x18, 0xc9, 0x61, 0x88, 0x27, 0x00, 0xe0, 0xbc, 
+	0x27, 0x00, 0x20, 0x00, 0x90, 0x01, 0x98, 0x01, 
+	0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, 0xd2, 0x13, 
+	0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 
+	0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 
+	0x4a, 0xaf, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 
+	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 
+	0xda, 0x01, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe6, 
+	0x98, 0x01, 0x28, 0x00, 0xd1, 0x16, 0x2f, 0x18, 
+	0xd2, 0x14, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, 
+	0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, 
+	0x4a, 0xa3, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 
+	0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 
+	0xda, 0x03, 0xe0, 0x00, 0xe0, 0xb0, 0x20, 0x01, 
+	0x90, 0x01, 0xe7, 0xe5, 0x3f, 0x01, 0x6b, 0x28, 
+	0xf7, 0xfe, 0xfb, 0x01, 0x90, 0x00, 0x2f, 0x07, 
+	0xd2, 0x16, 0x48, 0x99, 0x68, 0x01, 0x1c, 0x38, 
+	0xf0, 0x0a, 0xf9, 0x0a, 0x00, 0xb8, 0x19, 0xc0, 
+	0x00, 0xc0, 0x49, 0x95, 0x68, 0x09, 0x18, 0x40, 
+	0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x00, 
+	0x1c, 0x29, 0xf0, 0x0a, 0xfa, 0x5f, 0x48, 0x90, 
+	0x68, 0x00, 0xf0, 0x0a, 0xfe, 0x59, 0xe0, 0x4a, 
+	0x2f, 0x18, 0xd2, 0x48, 0x1f, 0xf8, 0x49, 0x8c, 
+	0x68, 0x09, 0xf0, 0x0a, 0xf9, 0x45, 0x20, 0x4c, 
+	0x43, 0x78, 0x49, 0x89, 0x68, 0x09, 0x18, 0x40, 
+	0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x00, 
+	0x1c, 0x29, 0xf0, 0x0a, 0xfa, 0x47, 0x20, 0x4c, 
+	0x43, 0x78, 0x49, 0x83, 0x68, 0x09, 0x18, 0x40, 
+	0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, 
+	0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x78, 
+	0x49, 0x7d, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 
+	0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 
+	0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x78, 
+	0x49, 0x77, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 
+	0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, 
+	0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, 
+	0x43, 0x79, 0x4a, 0x71, 0x68, 0x12, 0x18, 0x89, 
+	0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 
+	0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x79, 
+	0x4a, 0x6b, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 
+	0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x68, 
+	0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 
+	0x69, 0x80, 0x00, 0x40, 0x90, 0x03, 0x98, 0x03, 
+	0x23, 0x02, 0x43, 0x18, 0x90, 0x03, 0x48, 0x62, 
+	0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 
+	0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0x99, 0x03, 
+	0x18, 0x40, 0x90, 0x03, 0x98, 0x03, 0x49, 0x5c, 
+	0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
+	0x61, 0x88, 0x1c, 0x39, 0x48, 0x58, 0x68, 0x00, 
+	0xf0, 0x0a, 0xfa, 0x72, 0x2c, 0x0b, 0xdb, 0x01, 
+	0x2c, 0x12, 0xdd, 0x04, 0x6b, 0x69, 0x48, 0x54, 
+	0x68, 0x00, 0xf0, 0x0a, 0xf9, 0x4d, 0x1c, 0x30, 
+	0x21, 0x01, 0xf0, 0x0a, 0xfd, 0x45, 0x49, 0x4f, 
+	0x20, 0x91, 0xf0, 0x17, 0xfe, 0x1b, 0x28, 0x92, 
+	0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x4c, 0x68, 0x00, 
+	0x90, 0x02, 0x48, 0x4c, 0x68, 0x00, 0x49, 0x4a, 
+	0x60, 0x08, 0x98, 0x02, 0x49, 0x49, 0x60, 0x08, 
+	0x20, 0x92, 0x49, 0x46, 0x60, 0x08, 0xb0, 0x03, 
+	0x48, 0x43, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x75, 
+	0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x71, 
+	0x99, 0x03, 0x29, 0x00, 0xd1, 0x6e, 0xb0, 0x85, 
+	0x1c, 0x30, 0xf0, 0x0a, 0xfd, 0x47, 0x28, 0x00, 
+	0xd1, 0x05, 0x20, 0x92, 0x49, 0x38, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x07, 0xe6, 0x74, 0x49, 0x39, 
+	0x20, 0x91, 0xf0, 0x17, 0xfd, 0xef, 0x28, 0x92, 
+	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfd, 0x91, 
+	0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x0b, 
+	0x48, 0x33, 0x68, 0x00, 0x68, 0x40, 0x28, 0x00, 
+	0xd0, 0x06, 0x48, 0x31, 0x68, 0x00, 0x68, 0x40, 
+	0x38, 0x01, 0x49, 0x2f, 0x68, 0x09, 0x60, 0x48, 
+	0x20, 0x92, 0x49, 0x2c, 0x60, 0x08, 0x20, 0x01, 
+	0x49, 0x2b, 0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, 
+	0xdb, 0x11, 0x2c, 0x12, 0xdc, 0x0f, 0x48, 0x28, 
+	0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 
+	0x69, 0x80, 0x08, 0x40, 0x00, 0x40, 0x49, 0x24, 
+	0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
+	0x61, 0x88, 0x27, 0x00, 0xe0, 0xb2, 0x27, 0x00, 
+	0x20, 0x00, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00, 
+	0xd1, 0x15, 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, 
+	0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 
+	0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x18, 
+	0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 
+	0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x01, 
+	0x20, 0x01, 0x90, 0x03, 0xe7, 0xe6, 0x98, 0x03, 
+	0x28, 0x00, 0xd1, 0x26, 0x2f, 0x18, 0xd2, 0x24, 
+	0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 
+	0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x0c, 
+	0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 
+	0x38, 0x02, 0xe0, 0x00, 0xe0, 0xa9, 0x69, 0x40, 
+	0x42, 0x81, 0xd1, 0x11, 0x20, 0x01, 0x90, 0x03, 
+	0xe0, 0x0e, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, 
+	0xe7, 0xd5, 0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, 
+	0xf9, 0xc2, 0x90, 0x01, 0x2f, 0x07, 0xd2, 0x09, 
+	0x48, 0x4a, 0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 
+	0xf8, 0x3d, 0x48, 0x48, 0x68, 0x00, 0xf0, 0x0a, 
+	0xfd, 0x27, 0xe0, 0x06, 0x2f, 0x18, 0xd2, 0x04, 
+	0x1f, 0xf8, 0x49, 0x44, 0x68, 0x09, 0xf0, 0x0a, 
+	0xf8, 0x6f, 0x48, 0x42, 0x68, 0x00, 0x4b, 0x42, 
+	0x18, 0xc0, 0xf0, 0x0a, 0xf9, 0x8f, 0x20, 0x00, 
+	0x49, 0x3e, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 
+	0x18, 0xc9, 0x64, 0x88, 0x48, 0x3b, 0x68, 0x00, 
+	0x68, 0x40, 0x28, 0x07, 0xd3, 0x0e, 0x48, 0x39, 
+	0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 
+	0x69, 0x80, 0x23, 0xfe, 0x43, 0x18, 0x49, 0x35, 
+	0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 
+	0x61, 0x88, 0xe0, 0x33, 0x20, 0x01, 0x90, 0x00, 
+	0x21, 0x00, 0x91, 0x02, 0x48, 0x2f, 0x68, 0x00, 
+	0x68, 0x40, 0x99, 0x02, 0x42, 0x88, 0xd8, 0x04, 
+	0xe0, 0x08, 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, 
+	0xe7, 0xf4, 0x98, 0x00, 0x00, 0x40, 0x30, 0x01, 
+	0x90, 0x00, 0xe7, 0xf6, 0x98, 0x00, 0x08, 0x40, 
+	0x00, 0x40, 0x90, 0x00, 0x48, 0x25, 0x68, 0x00, 
+	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 
+	0x07, 0xc0, 0x0f, 0xc0, 0x49, 0x21, 0x68, 0x09, 
+	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 
+	0x48, 0x1e, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 
+	0x18, 0xc0, 0x69, 0x80, 0x99, 0x00, 0x43, 0x08, 
+	0x49, 0x1a, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 
+	0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39, 0x48, 0x17, 
+	0x68, 0x00, 0xf0, 0x0a, 0xf9, 0x4d, 0x2c, 0x0b, 
+	0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04, 0x6b, 0x69, 
+	0x48, 0x12, 0x68, 0x00, 0xf0, 0x0a, 0xf8, 0x7e, 
+	0x1c, 0x30, 0x21, 0x00, 0xf0, 0x0a, 0xfc, 0x20, 
+	0x49, 0x10, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0xf6, 
+	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, 
+	0x68, 0x00, 0x90, 0x04, 0x48, 0x0c, 0x68, 0x00, 
+	0x49, 0x08, 0x60, 0x08, 0x98, 0x04, 0x49, 0x0a, 
+	0x60, 0x08, 0x20, 0x92, 0x49, 0x07, 0x60, 0x08, 
+	0xb0, 0x05, 0x20, 0x92, 0x49, 0x07, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x02, 0xe5, 0x60, 0xb0, 0x02, 
+	0xe5, 0x5e, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xbc, 
+	0x00, 0x00, 0x04, 0xcc, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x7c, 0xc8, 
+	0xb5, 0xf3, 0x1c, 0x07, 0x1c, 0x3e, 0x69, 0x30, 
+	0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf4, 
+	0x48, 0x1e, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
+	0x2c, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
+	0x20, 0x00, 0xe0, 0x04, 0x2c, 0x08, 0xd3, 0x01, 
+	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 
+	0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe7, 0x49, 0x16, 
+	0x20, 0x91, 0xf0, 0x17, 0xfc, 0xaf, 0x28, 0x92, 
+	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfc, 0xb8, 
+	0xe7, 0xf5, 0x00, 0xa0, 0x49, 0x11, 0x58, 0x08, 
+	0x42, 0xb8, 0xd0, 0x04, 0x20, 0x92, 0x49, 0x0e, 
+	0x60, 0x08, 0x20, 0xff, 0xe7, 0xd3, 0x20, 0x0d, 
+	0x06, 0xc0, 0x68, 0x80, 0x1c, 0x05, 0x20, 0x01, 
+	0x40, 0xa0, 0x40, 0x05, 0x2d, 0x00, 0xd1, 0x03, 
+	0x20, 0x00, 0x99, 0x01, 0x60, 0x08, 0xe0, 0x02, 
+	0x20, 0x01, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92, 
+	0x49, 0x03, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xbe, 
+	0xe7, 0xbd, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, 
+	0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x1c, 0x3c, 
+	0x68, 0xe5, 0x69, 0x60, 0x4b, 0x49, 0x40, 0x18, 
+	0x99, 0x02, 0x07, 0x89, 0x0f, 0x89, 0x02, 0x09, 
+	0x43, 0x08, 0x61, 0x60, 0x05, 0x80, 0x48, 0x46, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x05, 
+	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x49, 0x3b, 0x20, 0x91, 
+	0xf0, 0x17, 0xfc, 0x58, 0x28, 0x92, 0xd0, 0x03, 
+	0x20, 0x01, 0xf0, 0x09, 0xfc, 0x61, 0xe7, 0xf5, 
+	0x00, 0xa8, 0x49, 0x37, 0x58, 0x08, 0x42, 0xb8, 
+	0xd0, 0x05, 0x20, 0x92, 0x49, 0x33, 0x60, 0x08, 
+	0x20, 0xff, 0xb0, 0x01, 0xe7, 0xe6, 0x48, 0x30, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x20, 
+	0x28, 0x0b, 0xdb, 0x0c, 0x69, 0x20, 0x28, 0x12, 
+	0xdc, 0x09, 0x01, 0x28, 0x4b, 0x2d, 0x18, 0xc1, 
+	0x91, 0x00, 0x1d, 0xe6, 0x36, 0x0d, 0x68, 0x30, 
+	0x99, 0x00, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x26, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x28, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 
+	0x1c, 0x28, 0xf0, 0x0a, 0xfb, 0x73, 0x28, 0x00, 
+	0xd1, 0x05, 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x03, 0xe7, 0xbe, 0x49, 0x21, 
+	0x20, 0x91, 0xf0, 0x17, 0xfc, 0x1b, 0x28, 0x92, 
+	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfb, 0xbd, 
+	0x20, 0x92, 0x49, 0x1c, 0x60, 0x08, 0x20, 0x01, 
+	0x49, 0x1b, 0x68, 0x09, 0x60, 0x08, 0x48, 0x1a, 
+	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfb, 0x6e, 
+	0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, 
+	0x49, 0x14, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0x02, 
+	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x12, 
+	0x68, 0x00, 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 
+	0x49, 0x0f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0f, 
+	0x60, 0x08, 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 
+	0xb0, 0x02, 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x01, 0xe7, 0x8a, 0xb0, 0x01, 
+	0xe7, 0x88, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xff, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, 
+	0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x1c, 0x3c, 
+	0x68, 0xe5, 0x69, 0x60, 0x4b, 0x49, 0x40, 0x18, 
+	0x99, 0x02, 0x07, 0x09, 0x0f, 0x09, 0x02, 0x89, 
+	0x43, 0x08, 0x61, 0x60, 0x04, 0x80, 0x48, 0x46, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x05, 
+	0x20, 0x00, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x49, 0x3b, 0x20, 0x91, 
+	0xf0, 0x17, 0xfb, 0xac, 0x28, 0x92, 0xd0, 0x03, 
+	0x20, 0x01, 0xf0, 0x09, 0xfb, 0xb5, 0xe7, 0xf5, 
+	0x00, 0xa8, 0x49, 0x37, 0x58, 0x08, 0x42, 0xb8, 
+	0xd0, 0x05, 0x20, 0x92, 0x49, 0x33, 0x60, 0x08, 
+	0x20, 0xff, 0xb0, 0x01, 0xe7, 0xe6, 0x48, 0x30, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x20, 
+	0x28, 0x0b, 0xdb, 0x0c, 0x69, 0x20, 0x28, 0x12, 
+	0xdc, 0x09, 0x01, 0x28, 0x4b, 0x2d, 0x18, 0xc6, 
+	0x1d, 0xe0, 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 
+	0x68, 0x00, 0x60, 0x30, 0xe0, 0x41, 0x48, 0x26, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x28, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 
+	0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0xc7, 0x28, 0x00, 
+	0xd1, 0x05, 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x03, 0xe7, 0xbe, 0x49, 0x21, 
+	0x20, 0x91, 0xf0, 0x17, 0xfb, 0x6f, 0x28, 0x92, 
+	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfb, 0x11, 
+	0x20, 0x92, 0x49, 0x1c, 0x60, 0x08, 0x20, 0x01, 
+	0x49, 0x1b, 0x68, 0x09, 0x60, 0x08, 0x48, 0x1a, 
+	0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0xc2, 
+	0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, 
+	0x49, 0x14, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0x56, 
+	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x12, 
+	0x68, 0x00, 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 
+	0x49, 0x0f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0f, 
+	0x60, 0x08, 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 
+	0xb0, 0x02, 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x01, 0xe7, 0x8a, 0xb0, 0x01, 
+	0xe7, 0x88, 0x00, 0x00, 0xff, 0xff, 0xc3, 0xff, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, 
+	0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x82, 0x1c, 0x3c, 
+	0x68, 0xe5, 0x26, 0x00, 0x99, 0x03, 0x29, 0x01, 
+	0xd1, 0x00, 0x26, 0x01, 0x69, 0x60, 0x06, 0x80, 
+	0x0f, 0xc0, 0x42, 0xb0, 0xd1, 0x05, 0x20, 0x00, 
+	0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x69, 0x60, 0x23, 0x20, 0x43, 0xdb, 
+	0x40, 0x18, 0x07, 0xf1, 0x0e, 0x89, 0x43, 0x08, 
+	0x61, 0x60, 0x06, 0x80, 0x48, 0x44, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 
+	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 
+	0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
+	0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 
+	0xb0, 0x02, 0xe7, 0xde, 0x49, 0x3b, 0x20, 0x91, 
+	0xf0, 0x17, 0xfa, 0xf4, 0x28, 0x92, 0xd0, 0x03, 
+	0x20, 0x01, 0xf0, 0x09, 0xfa, 0xfd, 0xe7, 0xf5, 
+	0x00, 0xa8, 0x49, 0x37, 0x58, 0x08, 0x42, 0xb8, 
+	0xd0, 0x05, 0x20, 0x92, 0x49, 0x33, 0x60, 0x08, 
+	0x20, 0xff, 0xb0, 0x02, 0xe7, 0xc9, 0x48, 0x30, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x20, 
+	0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x20, 0x28, 0x12, 
+	0xdc, 0x0b, 0x01, 0x28, 0x4b, 0x2d, 0x18, 0xc1, 
+	0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d, 0x90, 0x00, 
+	0x98, 0x00, 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 
+	0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, 
+	0xfa, 0x0d, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
+	0x49, 0x1e, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x04, 
+	0xe7, 0x9f, 0x49, 0x20, 0x20, 0x91, 0xf0, 0x17, 
+	0xfa, 0xb5, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
+	0xf0, 0x0a, 0xfa, 0x57, 0x20, 0x92, 0x49, 0x1b, 
+	0x60, 0x08, 0x20, 0x01, 0x49, 0x1a, 0x68, 0x09, 
+	0x60, 0x08, 0x48, 0x19, 0x68, 0x01, 0x1c, 0x20, 
+	0xf0, 0x0a, 0xfa, 0x08, 0x90, 0x00, 0x69, 0x60, 
+	0x99, 0x00, 0x60, 0xc8, 0x49, 0x13, 0x20, 0x91, 
+	0xf0, 0x17, 0xfa, 0x9c, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, 0x90, 0x01, 
+	0x48, 0x10, 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 
+	0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 
+	0x49, 0x0a, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 
+	0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 
+	0xe7, 0x6b, 0xb0, 0x02, 0xe7, 0x69, 0x00, 0x00, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, 
+	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0xb0, 0x83, 
+	0x1c, 0x25, 0x69, 0x28, 0x28, 0x13, 0xd1, 0x04, 
+	0x20, 0x75, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x68, 0xee, 0x20, 0x04, 0x40, 0x38, 
+	0x08, 0x81, 0x91, 0x02, 0x69, 0x68, 0x23, 0xc0, 
+	0x43, 0xdb, 0x40, 0x18, 0x07, 0xb9, 0x0f, 0x89, 
+	0x01, 0x89, 0x43, 0x08, 0x61, 0x68, 0x06, 0x00, 
+	0x69, 0x68, 0x4b, 0x48, 0x40, 0x18, 0x99, 0x02, 
+	0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x61, 0x68, 
+	0x04, 0x40, 0x48, 0x45, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2e, 0x08, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03, 
+	0xe7, 0xd0, 0x49, 0x3c, 0x20, 0x91, 0xf0, 0x17, 
+	0xfa, 0x35, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
+	0xf0, 0x09, 0xfa, 0x3e, 0xe7, 0xf5, 0x00, 0xb0, 
+	0x49, 0x37, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05, 
+	0x20, 0x92, 0x49, 0x34, 0x60, 0x08, 0x20, 0xff, 
+	0xb0, 0x03, 0xe7, 0xbb, 0x48, 0x30, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x05, 0x69, 0x28, 0x28, 0x0b, 
+	0xdb, 0x0e, 0x69, 0x28, 0x28, 0x12, 0xdc, 0x0b, 
+	0x01, 0x30, 0x4b, 0x2e, 0x18, 0xc0, 0x90, 0x01, 
+	0x1d, 0xe8, 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 
+	0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, 
+	0x48, 0x25, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 
+	0x48, 0x27, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 
+	0xb0, 0x82, 0x1c, 0x30, 0xf0, 0x0a, 0xf9, 0x4e, 
+	0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1f, 
+	0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x91, 
+	0x49, 0x20, 0x20, 0x91, 0xf0, 0x17, 0xf9, 0xf6, 
+	0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 
+	0xf9, 0x98, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 
+	0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, 0x60, 0x08, 
+	0x48, 0x19, 0x68, 0x01, 0x1c, 0x28, 0xf0, 0x0a, 
+	0xf9, 0x49, 0x90, 0x00, 0x69, 0x68, 0x99, 0x00, 
+	0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, 0xf0, 0x17, 
+	0xf9, 0xdd, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
+	0x48, 0x11, 0x68, 0x00, 0x90, 0x01, 0x48, 0x11, 
+	0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, 0x98, 0x01, 
+	0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0b, 
+	0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 0x49, 0x05, 
+	0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x5d, 
+	0xb0, 0x03, 0xe7, 0x5b, 0xff, 0xff, 0xbf, 0xff, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, 
+	0x1c, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x41, 
+	0x48, 0x02, 0x63, 0x81, 0x20, 0x00, 0x47, 0x70, 
+	0xe7, 0xfd, 0x00, 0x00, 0x68, 0x00, 0x0d, 0x00, 
+	0x20, 0x0d, 0x06, 0xc0, 0x68, 0x40, 0x02, 0x00, 
+	0x0a, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 
+	0x1c, 0x0a, 0x68, 0xd0, 0x47, 0x70, 0xe7, 0xfd, 
+	0x1c, 0x03, 0x1c, 0x0a, 0x1c, 0x19, 0x69, 0x08, 
+	0x28, 0x13, 0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, 
+	0x69, 0x08, 0x28, 0x0b, 0xdb, 0x0b, 0x69, 0x08, 
+	0x28, 0x12, 0xdc, 0x08, 0x6d, 0x08, 0x60, 0x10, 
+	0x6d, 0x88, 0x60, 0x90, 0x6d, 0x48, 0x60, 0x50, 
+	0x6d, 0xc8, 0x60, 0xd0, 0xe0, 0x07, 0x6a, 0x88, 
+	0x60, 0x10, 0x6b, 0x08, 0x60, 0x90, 0x6a, 0xc8, 
+	0x60, 0x50, 0x6b, 0x48, 0x60, 0xd0, 0x20, 0x00, 
+	0xe7, 0xe5, 0xe7, 0xe4, 0x1c, 0x03, 0x1c, 0x0a, 
+	0x68, 0x10, 0x60, 0x18, 0x68, 0x90, 0x60, 0x98, 
+	0x68, 0x50, 0x60, 0x58, 0x68, 0xd0, 0x60, 0xd8, 
+	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 
+	0x69, 0x50, 0x05, 0x80, 0x0f, 0x80, 0x47, 0x70, 
+	0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, 
+	0x12, 0x80, 0x07, 0x00, 0x0f, 0x00, 0x47, 0x70, 
+	0xe7, 0xfd, 0xb4, 0x80, 0x1c, 0x01, 0x1c, 0x0f, 
+	0x22, 0x01, 0x69, 0x78, 0x23, 0x20, 0x40, 0x18, 
+	0xd1, 0x00, 0x22, 0x00, 0x1c, 0x10, 0xbc, 0x80, 
+	0x47, 0x70, 0xe7, 0xfc, 0x1c, 0x01, 0x1c, 0x0b, 
+	0x69, 0x18, 0x28, 0x13, 0xd1, 0x01, 0x20, 0x75, 
+	0x47, 0x70, 0x69, 0x58, 0x06, 0x00, 0x0f, 0x82, 
+	0x69, 0x58, 0x04, 0x40, 0x0f, 0xc0, 0x00, 0x80, 
+	0x43, 0x02, 0x1c, 0x10, 0xe7, 0xf4, 0xe7, 0xf3, 
+	0x1c, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x61, 0x41, 
+	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x20, 0x0d, 
+	0x06, 0xc0, 0x69, 0x40, 0x1c, 0x01, 0x1c, 0x08, 
+	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x22, 0x00, 
+	0x29, 0x01, 0xd1, 0x00, 0x22, 0x01, 0x20, 0x0d, 
+	0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x03, 0x2b, 0x02, 
+	0xd1, 0x01, 0x29, 0x00, 0xd1, 0x02, 0x20, 0x0d, 
+	0x06, 0xc0, 0x60, 0xc2, 0x20, 0x00, 0x47, 0x70, 
+	0xe7, 0xfd, 0x21, 0x01, 0x20, 0x0d, 0x06, 0xc0, 
+	0x68, 0xc0, 0x1c, 0x02, 0x2a, 0x00, 0xd1, 0x00, 
+	0x21, 0x00, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
+	0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x10, 0x47, 0x70, 
+	0xe7, 0xfd, 0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 
+	0x1c, 0x39, 0x69, 0x08, 0x28, 0x13, 0xd0, 0x05, 
+	0x69, 0x08, 0x28, 0x0b, 0xdb, 0x05, 0x69, 0x08, 
+	0x28, 0x12, 0xdc, 0x02, 0x20, 0x86, 0xbc, 0x90, 
+	0x47, 0x70, 0x6b, 0x8c, 0x69, 0x48, 0x23, 0x04, 
+	0x40, 0x18, 0xd0, 0x00, 0x08, 0x64, 0x69, 0x08, 
+	0x00, 0x80, 0x4b, 0x03, 0x58, 0x18, 0x43, 0x60, 
+	0x60, 0x10, 0x20, 0x00, 0xe7, 0xef, 0xe7, 0xee, 
+	0x2e, 0x03, 0x32, 0xf4, 0xb5, 0xf3, 0x1c, 0x07, 
+	0xb0, 0x81, 0x9c, 0x02, 0x69, 0x20, 0x28, 0x13, 
+	0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x08, 
+	0x69, 0x20, 0x28, 0x12, 0xdc, 0x05, 0x20, 0x86, 
+	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x68, 0xe5, 0x68, 0x38, 0x64, 0x20, 
+	0x68, 0x7e, 0x64, 0x66, 0x08, 0xb6, 0x61, 0xa6, 
+	0x48, 0x3f, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
+	0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 
+	0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 
+	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 
+	0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xe0, 
+	0x49, 0x36, 0x20, 0x91, 0xf0, 0x17, 0xf8, 0xba, 
+	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 
+	0xf8, 0xc3, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x32, 
+	0x58, 0x08, 0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, 
+	0x20, 0x92, 0x49, 0x2e, 0x60, 0x08, 0x20, 0x86, 
+	0xb0, 0x01, 0xe7, 0xca, 0x48, 0x2a, 0x68, 0x00, 
+	0x28, 0x00, 0xd1, 0x06, 0x01, 0x28, 0x4b, 0x2b, 
+	0x18, 0xc0, 0x90, 0x00, 0x98, 0x00, 0x60, 0x06, 
+	0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, 0x28, 0x01, 
+	0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x09, 
+	0xff, 0xdd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 
+	0x49, 0x1e, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 
+	0xe7, 0xab, 0x49, 0x20, 0x20, 0x91, 0xf0, 0x17, 
+	0xf8, 0x85, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 
+	0xf0, 0x0a, 0xf8, 0x27, 0x20, 0x92, 0x49, 0x1b, 
+	0x60, 0x08, 0x20, 0x01, 0x49, 0x1a, 0x68, 0x09, 
+	0x60, 0x08, 0x48, 0x19, 0x68, 0x01, 0x1c, 0x20, 
+	0xf0, 0x09, 0xff, 0xd8, 0x90, 0x00, 0x69, 0xa0, 
+	0x99, 0x00, 0x61, 0x08, 0x49, 0x13, 0x20, 0x91, 
+	0xf0, 0x17, 0xf8, 0x6c, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, 0x90, 0x01, 
+	0x48, 0x10, 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 
+	0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 
+	0x49, 0x0a, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 
+	0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 
+	0xe7, 0x77, 0xb0, 0x01, 0xe7, 0x75, 0x00, 0x00, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x04, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, 
+	0xb4, 0x80, 0x1c, 0x01, 0x06, 0x0b, 0x0e, 0x1b, 
+	0x22, 0x01, 0x2a, 0x19, 0xd3, 0x02, 0xe0, 0x0f, 
+	0x32, 0x01, 0xe7, 0xfa, 0x00, 0x90, 0x4f, 0x08, 
+	0x58, 0x38, 0x68, 0x80, 0x02, 0x00, 0x0e, 0x00, 
+	0x42, 0x98, 0xd1, 0x04, 0x00, 0x90, 0x4f, 0x04, 
+	0x58, 0x38, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xef, 
+	0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0x60, 0xb4, 0x90, 0x1c, 0x07, 
+	0x1c, 0x0a, 0x06, 0x38, 0x16, 0x01, 0x48, 0x20, 
+	0x60, 0x02, 0x48, 0x20, 0x68, 0x80, 0x23, 0x33, 
+	0x06, 0x5b, 0x65, 0xd8, 0x48, 0x1d, 0x68, 0xc0, 
+	0x23, 0x33, 0x06, 0x5b, 0x66, 0x18, 0x48, 0x1c, 
+	0x4b, 0x1a, 0x60, 0x98, 0x48, 0x1b, 0x4b, 0x19, 
+	0x60, 0xd8, 0x20, 0x01, 0x23, 0x33, 0x06, 0x5b, 
+	0x66, 0xd8, 0x48, 0x19, 0x68, 0x04, 0x23, 0x01, 
+	0x04, 0xdb, 0x43, 0x23, 0x60, 0x03, 0x48, 0x16, 
+	0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x9c, 
+	0x1c, 0x23, 0x60, 0x03, 0x29, 0x00, 0xd1, 0x10, 
+	0x20, 0xff, 0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, 
+	0x62, 0x18, 0x48, 0x10, 0x68, 0x04, 0x23, 0xff, 
+	0x33, 0x01, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03, 
+	0x48, 0x0d, 0x23, 0x1b, 0x06, 0x9b, 0x64, 0x18, 
+	0xe0, 0x08, 0x20, 0xff, 0x30, 0x14, 0x23, 0x1b, 
+	0x06, 0x9b, 0x62, 0x18, 0x48, 0x02, 0x68, 0x00, 
+	0x4b, 0x08, 0x60, 0x18, 0xbc, 0x90, 0x47, 0x70, 
+	0x2e, 0x08, 0x5e, 0x58, 0x2e, 0x08, 0x7c, 0x24, 
+	0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00, 
+	0x6c, 0x00, 0x00, 0x40, 0x6c, 0x00, 0x00, 0x20, 
+	0x00, 0x00, 0x82, 0x18, 0x6c, 0x00, 0x00, 0x80, 
+	0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82, 0x23, 0x1b, 
+	0x06, 0x9b, 0x6a, 0x1b, 0x1c, 0x18, 0x27, 0x00, 
+	0x22, 0x00, 0x08, 0x40, 0x00, 0x40, 0x4b, 0xaf, 
+	0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, 0x60, 0x1c, 
+	0x4b, 0xad, 0x68, 0x1b, 0x1c, 0x1d, 0x23, 0x1b, 
+	0x06, 0x9b, 0x6c, 0x1b, 0x93, 0x01, 0x23, 0xff, 
+	0x33, 0x01, 0x40, 0x03, 0xd0, 0x00, 0x22, 0xff, 
+	0x23, 0x01, 0x04, 0x9b, 0x40, 0x03, 0xd0, 0x1b, 
+	0x4c, 0xa4, 0x68, 0x26, 0x23, 0x01, 0x04, 0x9b, 
+	0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0x4c, 0xa1, 
+	0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23, 
+	0x23, 0x00, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x0a, 
+	0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00, 0x33, 0x01, 
+	0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0x4b, 0x99, 
+	0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, 0x60, 0x1c, 
+	0x23, 0x01, 0x02, 0x9b, 0x40, 0x0b, 0xd0, 0x29, 
+	0x23, 0x01, 0x02, 0xdb, 0x40, 0x0b, 0xd0, 0x01, 
+	0x4b, 0x94, 0x40, 0x18, 0x23, 0x01, 0x03, 0x1b, 
+	0x40, 0x0b, 0xd0, 0x02, 0x23, 0x01, 0x05, 0x9b, 
+	0x43, 0x18, 0x4b, 0x91, 0x40, 0x18, 0x02, 0x4c, 
+	0x23, 0x7f, 0x02, 0x5b, 0x40, 0x23, 0x43, 0x18, 
+	0x23, 0x40, 0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, 
+	0x04, 0x5b, 0x43, 0x18, 0xe0, 0x0a, 0x4b, 0x8b, 
+	0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x03, 
+	0x23, 0x01, 0x04, 0x1b, 0x43, 0x18, 0xe0, 0x01, 
+	0x4b, 0x87, 0x40, 0x18, 0x23, 0x1b, 0x06, 0x9b, 
+	0x62, 0x18, 0xe0, 0xfc, 0x23, 0x04, 0x40, 0x0b, 
+	0xd0, 0x0f, 0x4c, 0x7e, 0x68, 0x26, 0x23, 0x01, 
+	0x43, 0x33, 0x60, 0x23, 0x4b, 0x81, 0x68, 0x9b, 
+	0x24, 0x33, 0x06, 0x64, 0x65, 0xe3, 0x4b, 0x7f, 
+	0x68, 0xdb, 0x24, 0x33, 0x06, 0x64, 0x66, 0x23, 
+	0xe0, 0xe9, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x0b, 
+	0xd0, 0x13, 0x4b, 0x7a, 0x68, 0x9b, 0x24, 0x33, 
+	0x06, 0x64, 0x65, 0xe3, 0x4b, 0x77, 0x68, 0xdb, 
+	0x24, 0x33, 0x06, 0x64, 0x66, 0x23, 0x23, 0x01, 
+	0x24, 0x33, 0x06, 0x64, 0x66, 0xe3, 0x4c, 0x6d, 
+	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, 0x24, 
+	0x2e, 0x08, 0x5e, 0x58, 0x6c, 0x00, 0x00, 0x80, 
+	0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60, 
+	0x00, 0x02, 0x54, 0x28, 0x00, 0x00, 0x82, 0x18, 
+	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, 0xdc, 
+	0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, 
+	0x00, 0x02, 0x42, 0x18, 0x00, 0x00, 0x98, 0x60, 
+	0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28, 
+	0x2e, 0x08, 0x5e, 0x58, 0x6c, 0x00, 0x00, 0x80, 
+	0x6c, 0x00, 0x00, 0x20, 0xb5, 0xf3, 0x1c, 0x0f, 
+	0xb0, 0x82, 0x49, 0x2c, 0x46, 0x68, 0x22, 0x08, 
+	0xf0, 0x09, 0xfe, 0x14, 0x20, 0x04, 0xf7, 0xff, 
+	0xfc, 0x23, 0x48, 0x29, 0x68, 0x80, 0x21, 0x33, 
+	0x06, 0x49, 0x65, 0xc8, 0x48, 0x26, 0x68, 0xc0, 
+	0x21, 0x33, 0x06, 0x49, 0x66, 0x08, 0x48, 0x25, 
+	0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 
+	0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x67, 0xc8, 
+	0x48, 0x21, 0x68, 0x01, 0x31, 0xff, 0x31, 0xff, 
+	0x31, 0x02, 0x60, 0x01, 0x1c, 0x78, 0x12, 0x00, 
+	0xab, 0x01, 0x70, 0x18, 0x1c, 0x78, 0xab, 0x01, 
+	0x70, 0x58, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc5, 
+	0x4b, 0x1a, 0x43, 0x1d, 0x26, 0x00, 0x2e, 0x10, 
+	0xdb, 0x02, 0xe0, 0x18, 0x36, 0x01, 0xe7, 0xfa, 
+	0x24, 0x00, 0x2c, 0x07, 0xd3, 0x02, 0xe0, 0x06, 
+	0x34, 0x01, 0xe7, 0xfa, 0x46, 0x68, 0x5d, 0x01, 
+	0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8, 0x24, 0x00, 
+	0x42, 0xbc, 0xdb, 0x02, 0xe0, 0x06, 0x34, 0x01, 
+	0xe7, 0xfa, 0x98, 0x02, 0x5d, 0x01, 0x70, 0x29, 
+	0x35, 0x01, 0xe7, 0xf8, 0xe7, 0xe6, 0x20, 0x33, 
+	0x06, 0x40, 0x66, 0x05, 0x48, 0x0a, 0x68, 0x01, 
+	0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 
+	0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x03, 0x32, 0x9c, 
+	0x2e, 0x08, 0x7c, 0x24, 0x66, 0x00, 0x00, 0x70, 
+	0x66, 0x00, 0x00, 0x5c, 0xcc, 0x00, 0x00, 0x00, 
+	0x6c, 0x00, 0x00, 0x20, 0xb5, 0xf7, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x06, 0x20, 0x0e, 0x00, 0x06, 0x3d, 
+	0x0e, 0x2d, 0x99, 0x02, 0x06, 0x0a, 0x0e, 0x12, 
+	0x21, 0x02, 0x40, 0x01, 0xd0, 0x04, 0x21, 0xff, 
+	0x4b, 0x2f, 0x68, 0x1b, 0x72, 0x19, 0xe0, 0x0c, 
+	0x49, 0x2d, 0x68, 0x09, 0x7a, 0x09, 0x29, 0xff, 
+	0xd1, 0x03, 0x21, 0x00, 0x4b, 0x2a, 0x68, 0x1b, 
+	0x60, 0x19, 0x21, 0x00, 0x4b, 0x28, 0x68, 0x1b, 
+	0x72, 0x19, 0x07, 0xc1, 0x0f, 0xc9, 0xd0, 0x04, 
+	0x21, 0xff, 0x4b, 0x25, 0x68, 0x1b, 0x72, 0x59, 
+	0xe0, 0x0c, 0x49, 0x23, 0x68, 0x09, 0x7a, 0x49, 
+	0x29, 0xff, 0xd1, 0x03, 0x21, 0x00, 0x4b, 0x20, 
+	0x68, 0x1b, 0x60, 0x59, 0x21, 0x00, 0x4b, 0x1e, 
+	0x68, 0x1b, 0x72, 0x59, 0x2d, 0x01, 0xd1, 0x0f, 
+	0x49, 0x1c, 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 
+	0x43, 0x9e, 0x1c, 0x33, 0x60, 0x0b, 0x49, 0x1a, 
+	0x68, 0x09, 0x78, 0x09, 0x23, 0x02, 0x43, 0x19, 
+	0x4b, 0x17, 0x68, 0x1b, 0x70, 0x19, 0xe0, 0x0e, 
+	0x49, 0x14, 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 
+	0x43, 0x33, 0x60, 0x0b, 0x49, 0x12, 0x68, 0x09, 
+	0x78, 0x09, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 
+	0x4b, 0x0f, 0x68, 0x1b, 0x70, 0x19, 0x49, 0x0f, 
+	0x62, 0x4a, 0x2a, 0x01, 0xd1, 0x08, 0x49, 0x0c, 
+	0x68, 0x09, 0x78, 0x09, 0x23, 0x01, 0x43, 0x19, 
+	0x4b, 0x09, 0x68, 0x1b, 0x70, 0x19, 0xe0, 0x07, 
+	0x49, 0x07, 0x68, 0x09, 0x78, 0x09, 0x08, 0x49, 
+	0x00, 0x49, 0x4b, 0x05, 0x68, 0x1b, 0x70, 0x19, 
+	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x5e, 0x5c, 0x6c, 0x00, 0x00, 0x20, 
+	0x2e, 0x08, 0x5e, 0x60, 0xcc, 0x00, 0x0f, 0x80, 
+	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x38, 
+	0x49, 0x23, 0x68, 0x09, 0x60, 0xc8, 0x68, 0x78, 
+	0x49, 0x21, 0x68, 0x09, 0x61, 0x08, 0x68, 0xb8, 
+	0x49, 0x1f, 0x68, 0x09, 0x61, 0x48, 0x68, 0xf8, 
+	0x49, 0x1d, 0x68, 0x09, 0x61, 0x88, 0x7d, 0x38, 
+	0x49, 0x1b, 0x68, 0x09, 0x31, 0x20, 0x70, 0x08, 
+	0x7d, 0x78, 0x49, 0x19, 0x68, 0x09, 0x31, 0x20, 
+	0x70, 0x48, 0x69, 0x38, 0x49, 0x16, 0x68, 0x09, 
+	0x61, 0xc8, 0x7d, 0xb8, 0x49, 0x14, 0x68, 0x09, 
+	0x31, 0x20, 0x70, 0x88, 0x68, 0x10, 0x49, 0x12, 
+	0x68, 0x09, 0x62, 0x48, 0x68, 0x50, 0x49, 0x10, 
+	0x68, 0x09, 0x62, 0x88, 0x68, 0x90, 0x49, 0x0e, 
+	0x68, 0x09, 0x62, 0xc8, 0x68, 0xd0, 0x49, 0x0c, 
+	0x68, 0x09, 0x63, 0x08, 0x7d, 0x10, 0x49, 0x0a, 
+	0x68, 0x09, 0x31, 0x20, 0x76, 0x08, 0x7d, 0x50, 
+	0x49, 0x07, 0x68, 0x09, 0x31, 0x20, 0x76, 0x48, 
+	0x69, 0x10, 0x49, 0x05, 0x68, 0x09, 0x63, 0x48, 
+	0x7d, 0x90, 0x49, 0x03, 0x68, 0x09, 0x31, 0x20, 
+	0x76, 0x88, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x5c, 0x1c, 0x02, 0x1c, 0x0b, 
+	0x48, 0x03, 0x68, 0x00, 0x60, 0x02, 0x48, 0x02, 
+	0x68, 0x00, 0x60, 0x43, 0x47, 0x70, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0xb0, 0x88, 
+	0x98, 0x08, 0x68, 0x04, 0x20, 0x01, 0x90, 0x06, 
+	0x20, 0x01, 0x90, 0x05, 0x48, 0x8c, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x19, 0x48, 0x8a, 0x68, 0x00, 
+	0x38, 0x01, 0x49, 0x89, 0x60, 0x08, 0x48, 0x88, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x10, 0x48, 0x87, 
+	0x78, 0x80, 0x90, 0x00, 0x98, 0x00, 0x00, 0xc0, 
+	0x49, 0x85, 0x68, 0x09, 0x58, 0x08, 0x23, 0xff, 
+	0x33, 0x01, 0x43, 0x98, 0x1c, 0x01, 0x98, 0x00, 
+	0x00, 0xc0, 0x4a, 0x81, 0x68, 0x12, 0x50, 0x11, 
+	0x20, 0x33, 0x06, 0x40, 0x6e, 0x00, 0x23, 0x0d, 
+	0x06, 0x9b, 0x1a, 0xc1, 0x91, 0x02, 0x20, 0x33, 
+	0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 
+	0x1a, 0xc0, 0x90, 0x01, 0x48, 0x79, 0x68, 0x00, 
+	0x42, 0x84, 0xd1, 0x73, 0x98, 0x01, 0x1d, 0xc7, 
+	0x37, 0x01, 0x78, 0x38, 0x18, 0x38, 0x1c, 0x47, 
+	0x48, 0x75, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 
+	0x1a, 0xc0, 0x42, 0xb8, 0xd9, 0x19, 0x78, 0x38, 
+	0x28, 0xff, 0xd1, 0x12, 0x78, 0x78, 0x23, 0xf0, 
+	0x40, 0x18, 0x28, 0xf0, 0xd1, 0x0d, 0x78, 0xb8, 
+	0x10, 0x80, 0x07, 0x80, 0x0f, 0x80, 0x06, 0x00, 
+	0x16, 0x00, 0x90, 0x06, 0x78, 0x78, 0x10, 0xc0, 
+	0x07, 0xc0, 0x09, 0xc0, 0x16, 0x00, 0x90, 0x05, 
+	0xe0, 0x03, 0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, 
+	0xe7, 0xde, 0x21, 0x40, 0x91, 0x03, 0x25, 0x20, 
+	0x21, 0x14, 0x91, 0x07, 0x98, 0x06, 0x28, 0x00, 
+	0xd1, 0x02, 0x25, 0x23, 0x21, 0x12, 0x91, 0x07, 
+	0x98, 0x06, 0x28, 0x02, 0xd1, 0x02, 0x25, 0x30, 
+	0x21, 0x18, 0x91, 0x07, 0x98, 0x05, 0x28, 0x00, 
+	0xd1, 0x02, 0x00, 0x6d, 0x21, 0x70, 0x91, 0x03, 
+	0x99, 0x03, 0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, 
+	0x90, 0x04, 0x98, 0x04, 0x99, 0x02, 0x42, 0x88, 
+	0xd3, 0x05, 0xe0, 0x4e, 0x98, 0x04, 0x99, 0x03, 
+	0x18, 0x40, 0x90, 0x04, 0xe7, 0xf5, 0x9f, 0x04, 
+	0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 
+	0x70, 0x39, 0x37, 0x01, 0x21, 0x01, 0x70, 0x39, 
+	0x18, 0x7f, 0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, 
+	0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 0x21, 0x3a, 
+	0x70, 0x39, 0x37, 0x01, 0x21, 0x80, 0x70, 0x39, 
+	0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 
+	0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02, 0x1b, 0x41, 
+	0x70, 0x39, 0x37, 0x01, 0x26, 0x00, 0x99, 0x03, 
+	0x1f, 0xc8, 0x38, 0x02, 0x1b, 0x40, 0x42, 0xb0, 
+	0xdc, 0x04, 0xe0, 0x00, 0xe0, 0x34, 0xe0, 0x05, 
+	0x36, 0x01, 0xe7, 0xf4, 0x21, 0xff, 0x70, 0x39, 
+	0x37, 0x01, 0xe7, 0xf9, 0x21, 0xff, 0x70, 0x39, 
+	0x37, 0x01, 0x98, 0x05, 0x00, 0xc0, 0x21, 0xf7, 
+	0x43, 0x01, 0x70, 0x39, 0x37, 0x01, 0x99, 0x07, 
+	0x70, 0x39, 0x37, 0x01, 0x21, 0xc0, 0x70, 0x39, 
+	0x37, 0x01, 0x26, 0x00, 0x1f, 0x28, 0x42, 0xb0, 
+	0xdc, 0x02, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf9, 
+	0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9, 
+	0xe7, 0xb0, 0x99, 0x03, 0x00, 0x48, 0x99, 0x02, 
+	0x1a, 0x08, 0x23, 0x0d, 0x06, 0x9b, 0x18, 0xc0, 
+	0x49, 0x29, 0x64, 0x88, 0x99, 0x09, 0x20, 0x78, 
+	0x40, 0x08, 0x23, 0x02, 0x43, 0x18, 0xf7, 0xff, 
+	0xfa, 0x17, 0x20, 0x01, 0xf7, 0xff, 0xfa, 0x14, 
+	0x48, 0x22, 0x68, 0x00, 0x38, 0x02, 0x42, 0xa0, 
+	0xd1, 0x09, 0x48, 0x22, 0x68, 0x01, 0x23, 0x01, 
+	0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0xff, 
+	0x49, 0x1f, 0x68, 0x09, 0x70, 0x08, 0x48, 0x1b, 
+	0x68, 0x00, 0x38, 0x02, 0x42, 0xa0, 0xd3, 0x0f, 
+	0x48, 0x1c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 
+	0x48, 0x1a, 0x68, 0x00, 0x23, 0x01, 0x06, 0x9b, 
+	0x40, 0x18, 0xd0, 0x05, 0x20, 0x32, 0x49, 0x13, 
+	0x60, 0x08, 0x48, 0x12, 0x68, 0x00, 0x1e, 0x84, 
+	0x2c, 0x01, 0xd1, 0x02, 0x20, 0x02, 0xf7, 0xff, 
+	0xf9, 0xeb, 0x2c, 0xff, 0xd1, 0x08, 0x20, 0x33, 
+	0x06, 0x40, 0x6d, 0xc0, 0x30, 0xbc, 0x49, 0x0c, 
+	0x6c, 0xc9, 0x42, 0x88, 0xd2, 0x00, 0x24, 0x18, 
+	0x2c, 0x00, 0xd0, 0x02, 0x2c, 0xff, 0xd0, 0x00, 
+	0x3c, 0x01, 0x98, 0x08, 0x60, 0x04, 0xb0, 0x08, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x5e, 0x4c, 0x2e, 0x08, 0x5e, 0x38, 
+	0x2e, 0x08, 0x5d, 0xd8, 0x2e, 0x08, 0x1f, 0x20, 
+	0x66, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20, 
+	0x2e, 0x08, 0x5e, 0x34, 0x6c, 0x00, 0x08, 0x00, 
+	0xb5, 0xff, 0x1c, 0x04, 0x1c, 0x0f, 0x9a, 0x02, 
+	0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03, 0x06, 0x1e, 
+	0x0e, 0x36, 0x2e, 0x20, 0xdb, 0x04, 0x20, 0xa2, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2d, 0x1f, 0xdb, 0x01, 0x20, 0xaf, 0xe7, 0xf7, 
+	0x20, 0x01, 0x03, 0x40, 0xf7, 0xff, 0xf9, 0xac, 
+	0x20, 0x14, 0x49, 0x09, 0x60, 0x08, 0x20, 0xff, 
+	0x60, 0x20, 0x1c, 0x33, 0x1c, 0x29, 0x1c, 0x38, 
+	0x22, 0x02, 0xf7, 0xfc, 0xfa, 0x4b, 0x48, 0x05, 
+	0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 
+	0x60, 0x01, 0x20, 0x00, 0xe7, 0xe0, 0xe7, 0xdf, 
+	0x2e, 0x08, 0x1f, 0x20, 0x6c, 0x00, 0x00, 0x20, 
+	0xb4, 0x0f, 0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x82, 
+	0x20, 0x00, 0x49, 0x16, 0x60, 0x08, 0x48, 0x16, 
+	0x6f, 0x80, 0x23, 0x09, 0x01, 0x9b, 0x42, 0x98, 
+	0xd1, 0x02, 0x20, 0xe1, 0x00, 0xc0, 0xe0, 0x00, 
+	0x48, 0x12, 0x1c, 0x05, 0x68, 0x38, 0x28, 0xff, 
+	0xd1, 0x17, 0x98, 0x0d, 0x90, 0x00, 0x98, 0x0c, 
+	0x90, 0x01, 0x98, 0x01, 0x99, 0x00, 0x1a, 0x46, 
+	0x08, 0x68, 0x19, 0x81, 0x1c, 0x28, 0xf0, 0x09, 
+	0xfa, 0xeb, 0x1c, 0x04, 0x34, 0x01, 0x0f, 0xf0, 
+	0x07, 0xc0, 0xd0, 0x00, 0x24, 0x04, 0x2c, 0x32, 
+	0xd9, 0x00, 0x24, 0x04, 0x1d, 0xe0, 0x30, 0x0d, 
+	0x60, 0x38, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0xb0, 0x04, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x4c, 
+	0xcc, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x05, 0xdd, 
+	0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x99, 0x02, 
+	0x06, 0x09, 0x0e, 0x09, 0x91, 0x00, 0xb0, 0x82, 
+	0x99, 0x02, 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 
+	0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x99, 0x02, 0x00, 0x88, 0x49, 0x2f, 
+	0x58, 0x08, 0x90, 0x01, 0x28, 0x00, 0xd1, 0x02, 
+	0x20, 0xb0, 0xb0, 0x03, 0xe7, 0xf1, 0x20, 0x00, 
+	0x70, 0x78, 0x78, 0xb8, 0x07, 0x00, 0x0f, 0x00, 
+	0x90, 0x00, 0x98, 0x00, 0x28, 0x04, 0xd1, 0x1f, 
+	0x6a, 0xfe, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, 
+	0xe0, 0x18, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 
+	0xe7, 0xf8, 0x00, 0xa0, 0x19, 0x80, 0x68, 0x40, 
+	0x00, 0xa1, 0x19, 0x89, 0x64, 0x48, 0x21, 0x00, 
+	0x00, 0xa0, 0x19, 0x80, 0x62, 0x41, 0x00, 0xa0, 
+	0x19, 0x80, 0x6c, 0x40, 0x28, 0x00, 0xd0, 0x04, 
+	0x20, 0x80, 0x41, 0x20, 0x88, 0x31, 0x43, 0x08, 
+	0x80, 0x30, 0xe7, 0xe6, 0x88, 0x30, 0x80, 0x70, 
+	0x78, 0xb8, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x1f, 
+	0x6b, 0x3d, 0x20, 0x00, 0x60, 0x28, 0x20, 0x00, 
+	0x60, 0x68, 0x20, 0x00, 0x60, 0xa8, 0x24, 0x00, 
+	0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x60, 
+	0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, 
+	0x00, 0xa1, 0x19, 0x49, 0x60, 0xc8, 0x20, 0x00, 
+	0x00, 0xa1, 0x19, 0x49, 0x63, 0x88, 0xe7, 0xf2, 
+	0x20, 0x00, 0x62, 0xe8, 0x20, 0x00, 0x63, 0x28, 
+	0x20, 0x00, 0x63, 0x68, 0x20, 0x00, 0x65, 0xa8, 
+	0x99, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x3e, 
+	0xb0, 0x03, 0xe7, 0x9e, 0xb0, 0x02, 0xb0, 0x01, 
+	0xe7, 0x9b, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, 
+	0xb5, 0xf3, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0c, 
+	0x0e, 0x24, 0xb0, 0x82, 0x2c, 0x20, 0xdb, 0x05, 
+	0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x49, 0x12, 
+	0x58, 0x08, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, 
+	0xb0, 0x02, 0xe7, 0xf3, 0x1c, 0x21, 0x1c, 0x38, 
+	0xf0, 0x00, 0xf9, 0x84, 0x1c, 0x06, 0xd0, 0x02, 
+	0x1c, 0x30, 0xb0, 0x02, 0xe7, 0xea, 0x78, 0x68, 
+	0x21, 0x20, 0x40, 0x01, 0x91, 0x00, 0x99, 0x00, 
+	0x1c, 0x38, 0xf0, 0x00, 0xff, 0x3f, 0x68, 0xe9, 
+	0x91, 0x01, 0x29, 0x00, 0xd0, 0x03, 0x99, 0x01, 
+	0x1c, 0x38, 0xf0, 0x03, 0xfe, 0x7a, 0x20, 0x00, 
+	0xb0, 0x02, 0xe7, 0xd7, 0xb0, 0x02, 0xe7, 0xd5, 
+	0x2e, 0x08, 0x5e, 0x64, 0xb5, 0xf3, 0x1c, 0x02, 
+	0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, 0xb0, 0x86, 
+	0x00, 0xb8, 0x4b, 0xa1, 0x68, 0x1b, 0x18, 0xc0, 
+	0x90, 0x00, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0xa2, 
+	0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0xb8, 0x4b, 0x9b, 0x58, 0x18, 
+	0x90, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 
+	0xb0, 0x06, 0xe7, 0xf2, 0x78, 0x90, 0x90, 0x01, 
+	0x71, 0xd7, 0x78, 0xd1, 0x98, 0x01, 0x23, 0x80, 
+	0x40, 0x18, 0xd1, 0x73, 0x29, 0x20, 0xdd, 0x02, 
+	0x20, 0xb1, 0xb0, 0x06, 0xe7, 0xe5, 0x48, 0x92, 
+	0x68, 0x00, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x02, 
+	0x20, 0xb2, 0xb0, 0x06, 0xe7, 0xdd, 0x20, 0x01, 
+	0x40, 0x88, 0x4b, 0x8d, 0x68, 0x1b, 0x40, 0x18, 
+	0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0xd4, 
+	0x00, 0x88, 0x4b, 0x8a, 0x50, 0x1a, 0x48, 0x8a, 
+	0x54, 0x47, 0x01, 0x08, 0x4b, 0x89, 0x18, 0xc5, 
+	0x7f, 0x10, 0x06, 0x00, 0x7f, 0x53, 0x04, 0x1b, 
+	0x43, 0x18, 0x7f, 0x93, 0x02, 0x1b, 0x43, 0x18, 
+	0x7f, 0xd3, 0x43, 0x03, 0xc5, 0x08, 0x1d, 0xd0, 
+	0x30, 0x19, 0x78, 0x00, 0x06, 0x00, 0x1d, 0xd3, 
+	0x33, 0x19, 0x78, 0x5b, 0x04, 0x1b, 0x43, 0x18, 
+	0x1d, 0xd3, 0x33, 0x19, 0x78, 0x9b, 0x02, 0x1b, 
+	0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0xdb, 
+	0x43, 0x03, 0xc5, 0x08, 0x01, 0x08, 0x4b, 0x7a, 
+	0x18, 0xc4, 0x7b, 0x10, 0x06, 0x00, 0x7b, 0x53, 
+	0x04, 0x1b, 0x43, 0x18, 0x7b, 0x93, 0x02, 0x1b, 
+	0x43, 0x18, 0x7b, 0xd3, 0x43, 0x03, 0xc4, 0x08, 
+	0x7c, 0x10, 0x06, 0x00, 0x7c, 0x53, 0x04, 0x1b, 
+	0x43, 0x18, 0x7c, 0x93, 0x02, 0x1b, 0x43, 0x18, 
+	0x7c, 0xd3, 0x43, 0x03, 0xc4, 0x08, 0x98, 0x01, 
+	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x20, 0x1d, 0xd0, 
+	0x30, 0x19, 0x79, 0x00, 0x06, 0x00, 0x1d, 0xd3, 
+	0x33, 0x19, 0x79, 0x5b, 0x04, 0x1b, 0x43, 0x18, 
+	0x1d, 0xd3, 0x33, 0x19, 0x79, 0x9b, 0x02, 0x1b, 
+	0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0xdb, 
+	0x43, 0x03, 0xc5, 0x08, 0x7d, 0x10, 0x06, 0x00, 
+	0x7d, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7d, 0x93, 
+	0x02, 0x1b, 0xe0, 0x00, 0xe0, 0x42, 0x43, 0x18, 
+	0x7d, 0xd3, 0x43, 0x03, 0xc4, 0x08, 0xe0, 0x03, 
+	0x23, 0x00, 0xc5, 0x08, 0x23, 0x00, 0xc4, 0x08, 
+	0x23, 0xff, 0xc5, 0x08, 0x20, 0x19, 0x06, 0x80, 
+	0x6b, 0x00, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x06, 
+	0x88, 0x90, 0x04, 0x00, 0x19, 0xc3, 0x93, 0x02, 
+	0x9b, 0x02, 0xc4, 0x08, 0xe0, 0x00, 0xc4, 0x80, 
+	0x98, 0x01, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x17, 
+	0x48, 0x50, 0x5d, 0xc0, 0x30, 0x01, 0x4b, 0x4f, 
+	0x55, 0xd8, 0x7a, 0x10, 0x07, 0xc0, 0x0f, 0xc0, 
+	0xd0, 0x04, 0x20, 0x01, 0x40, 0x88, 0x23, 0x19, 
+	0x06, 0x9b, 0x61, 0x18, 0x7a, 0x10, 0x23, 0x02, 
+	0x40, 0x18, 0xd0, 0x04, 0x20, 0x01, 0x40, 0x88, 
+	0x23, 0x19, 0x06, 0x9b, 0x61, 0x58, 0xe0, 0x05, 
+	0x4e, 0x45, 0x20, 0x01, 0x40, 0x88, 0x68, 0x33, 
+	0x43, 0x18, 0x60, 0x30, 0x20, 0x01, 0x40, 0x88, 
+	0x4b, 0x3b, 0x68, 0x1b, 0x43, 0x18, 0x4b, 0x3a, 
+	0x60, 0x18, 0xe0, 0x4f, 0x98, 0x01, 0x23, 0x80, 
+	0x40, 0x18, 0xd0, 0x48, 0x48, 0x3d, 0x88, 0x00, 
+	0x4b, 0x3d, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xb2, 
+	0xb0, 0x06, 0xe7, 0x26, 0x00, 0x88, 0x4b, 0x3b, 
+	0x58, 0x18, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb1, 
+	0xb0, 0x06, 0xe7, 0x1e, 0x29, 0x10, 0xdb, 0x02, 
+	0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x19, 0x20, 0x01, 
+	0x40, 0x88, 0x4b, 0x32, 0x88, 0x1b, 0x40, 0x18, 
+	0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x10, 
+	0x98, 0x05, 0x78, 0x80, 0x28, 0x02, 0xdb, 0x02, 
+	0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x09, 0x00, 0x88, 
+	0x4b, 0x2c, 0x50, 0x1a, 0x48, 0x2c, 0x54, 0x47, 
+	0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x2b, 
+	0x68, 0x1b, 0x18, 0xc0, 0x90, 0x04, 0x98, 0x04, 
+	0x7e, 0x00, 0x28, 0xff, 0xd1, 0x02, 0x98, 0x04, 
+	0x76, 0x01, 0xe0, 0x01, 0x98, 0x04, 0x76, 0x41, 
+	0x4e, 0x25, 0x96, 0x03, 0x1d, 0xd3, 0x33, 0x05, 
+	0x00, 0x88, 0x9e, 0x03, 0x50, 0x33, 0x20, 0x01, 
+	0x40, 0x88, 0x4b, 0x1c, 0x88, 0x1b, 0x43, 0x18, 
+	0x4b, 0x1a, 0x80, 0x18, 0xe0, 0x02, 0x20, 0xb1, 
+	0xb0, 0x06, 0xe6, 0xe2, 0x78, 0x50, 0x23, 0x80, 
+	0x43, 0xdb, 0x40, 0x18, 0x70, 0x50, 0x98, 0x05, 
+	0x78, 0x80, 0x28, 0x00, 0xd1, 0x09, 0x98, 0x00, 
+	0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
+	0x9b, 0x00, 0x60, 0x18, 0x20, 0x02, 0x9b, 0x05, 
+	0x70, 0xd8, 0x98, 0x05, 0x78, 0x80, 0x30, 0x01, 
+	0x9b, 0x05, 0x70, 0x98, 0x20, 0x00, 0xb0, 0x06, 
+	0xe6, 0xc7, 0xb0, 0x06, 0xe6, 0xc5, 0x00, 0x00, 
+	0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xec, 
+	0x2e, 0x08, 0x5f, 0xac, 0x64, 0x00, 0x10, 0x00, 
+	0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x7b, 0xfc, 
+	0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x5e, 0xe8, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5f, 0x6c, 
+	0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5d, 0xcc, 
+	0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf3, 0x1c, 0x02, 
+	0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, 0xb0, 0x86, 
+	0x00, 0xb8, 0x4b, 0x65, 0x68, 0x1b, 0x18, 0xc0, 
+	0x90, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0xa2, 
+	0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0xb8, 0x4b, 0x5f, 0x58, 0x18, 
+	0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, 
+	0xe7, 0xf3, 0x78, 0x90, 0x90, 0x03, 0x78, 0xd1, 
+	0x00, 0x88, 0x4b, 0x5b, 0x58, 0x18, 0x42, 0x90, 
+	0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0xe8, 
+	0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x49, 
+	0x01, 0x08, 0x4b, 0x56, 0x18, 0xc3, 0x93, 0x00, 
+	0x20, 0x00, 0x9b, 0x00, 0x60, 0x18, 0x23, 0x00, 
+	0x00, 0x88, 0x4e, 0x51, 0x50, 0x33, 0x23, 0xff, 
+	0x48, 0x51, 0x54, 0x43, 0x20, 0x01, 0x40, 0x88, 
+	0x43, 0xc0, 0x4b, 0x50, 0x68, 0x1b, 0x40, 0x18, 
+	0x4b, 0x4e, 0x60, 0x18, 0x98, 0x03, 0x23, 0x08, 
+	0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x40, 0x88, 
+	0x90, 0x04, 0x7a, 0x10, 0x07, 0xc0, 0x0f, 0xc0, 
+	0xd0, 0x0b, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, 
+	0x69, 0x1b, 0x40, 0x18, 0xd0, 0x04, 0x98, 0x04, 
+	0x23, 0x19, 0x06, 0x9b, 0x61, 0x18, 0xe7, 0xf4, 
+	0xe0, 0x0e, 0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, 
+	0xd0, 0x0a, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, 
+	0x69, 0x5b, 0x40, 0x18, 0xd0, 0x04, 0x98, 0x04, 
+	0x23, 0x19, 0x06, 0x9b, 0x61, 0x58, 0xe7, 0xf4, 
+	0x48, 0x3b, 0x5d, 0xc0, 0x38, 0x01, 0x4b, 0x3a, 
+	0x55, 0xd8, 0xe0, 0x06, 0x4e, 0x39, 0x20, 0x01, 
+	0x40, 0x88, 0x43, 0xc0, 0x68, 0x33, 0x40, 0x18, 
+	0x60, 0x30, 0xe0, 0x36, 0x98, 0x03, 0x23, 0x80, 
+	0x40, 0x18, 0xd0, 0x2f, 0x00, 0xf8, 0x1b, 0xc0, 
+	0x00, 0x80, 0x4b, 0x33, 0x68, 0x1b, 0x18, 0xc3, 
+	0x93, 0x02, 0x9b, 0x02, 0x7e, 0x18, 0x42, 0x88, 
+	0xd1, 0x03, 0x20, 0xff, 0x9b, 0x02, 0x76, 0x18, 
+	0xe0, 0x0a, 0x9b, 0x02, 0x7e, 0x58, 0x42, 0x88, 
+	0xd1, 0x03, 0x20, 0xff, 0x9b, 0x02, 0x76, 0x58, 
+	0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x7c, 
+	0x23, 0x00, 0x00, 0x88, 0x4e, 0x27, 0x50, 0x33, 
+	0x20, 0xff, 0x4b, 0x27, 0x54, 0x58, 0x20, 0x01, 
+	0x40, 0x88, 0x43, 0xc0, 0x4b, 0x25, 0x88, 0x1b, 
+	0x40, 0x18, 0x4b, 0x24, 0x80, 0x18, 0x4e, 0x24, 
+	0x96, 0x05, 0x23, 0x00, 0x00, 0x88, 0x9e, 0x05, 
+	0x50, 0x33, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 
+	0xe7, 0x63, 0x78, 0xa8, 0x38, 0x01, 0x70, 0xa8, 
+	0x78, 0x50, 0x23, 0x80, 0x43, 0x18, 0x70, 0x50, 
+	0x78, 0xa8, 0x28, 0x00, 0xd1, 0x07, 0x98, 0x01, 
+	0x68, 0x00, 0x4b, 0x1a, 0x40, 0x18, 0x9b, 0x01, 
+	0x60, 0x18, 0x20, 0x01, 0x70, 0xe8, 0x24, 0x1f, 
+	0x2c, 0x00, 0xd1, 0x02, 0xe0, 0x0a, 0x3c, 0x01, 
+	0xe7, 0xfa, 0x48, 0x0d, 0x5d, 0x00, 0x28, 0x00, 
+	0xd1, 0x03, 0x20, 0x19, 0x06, 0x80, 0x64, 0xc4, 
+	0xe0, 0x00, 0xe7, 0xf4, 0x20, 0x00, 0xb0, 0x06, 
+	0xe7, 0x3f, 0xb0, 0x06, 0xe7, 0x3d, 0x00, 0x00, 
+	0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x5e, 0xec, 0x64, 0x00, 0x08, 0x08, 
+	0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xe4, 
+	0x2e, 0x08, 0x7b, 0xfc, 0x64, 0x00, 0x00, 0x18, 
+	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, 
+	0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5e, 0xe8, 
+	0x9e, 0x00, 0x04, 0xb8, 0xff, 0xff, 0xdf, 0xff, 
+	0x1c, 0x03, 0x1c, 0x0a, 0x78, 0x58, 0x70, 0x10, 
+	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf7, 
+	0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x10, 
+	0x0e, 0x00, 0x90, 0x00, 0xb0, 0x87, 0x78, 0x78, 
+	0x23, 0x80, 0x40, 0x18, 0xd0, 0x4c, 0x78, 0x78, 
+	0x23, 0x80, 0x40, 0x18, 0xd0, 0x48, 0x78, 0xb8, 
+	0x90, 0x06, 0x99, 0x09, 0x78, 0x88, 0x90, 0x05, 
+	0x98, 0x06, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x3f, 
+	0x98, 0x05, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x3b, 
+	0x6b, 0x38, 0x90, 0x01, 0x99, 0x09, 0x6b, 0x08, 
+	0x90, 0x00, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x02, 
+	0x98, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x05, 
+	0x20, 0xb6, 0xb0, 0x08, 0xb0, 0x03, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x68, 0x05, 
+	0x98, 0x00, 0x68, 0x04, 0x7a, 0x2e, 0x7a, 0x21, 
+	0x91, 0x04, 0x7d, 0x6a, 0x92, 0x03, 0x7d, 0x62, 
+	0x92, 0x02, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x0a, 
+	0x9a, 0x02, 0x99, 0x04, 0x1c, 0x28, 0xf0, 0x00, 
+	0xfc, 0xe5, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20, 
+	0xf0, 0x00, 0xfc, 0xe0, 0xe0, 0x09, 0x99, 0x04, 
+	0x1c, 0x28, 0x22, 0x00, 0xf0, 0x00, 0xfc, 0xda, 
+	0x1c, 0x31, 0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, 
+	0xfc, 0xd5, 0x20, 0x00, 0xb0, 0x08, 0xe7, 0xd5, 
+	0x20, 0xb1, 0xb0, 0x08, 0xe7, 0xd2, 0xb0, 0x07, 
+	0xb0, 0x01, 0xe7, 0xcf, 0xb4, 0xf0, 0x1c, 0x02, 
+	0x1c, 0x0b, 0x06, 0x1d, 0x0e, 0x2d, 0xb0, 0x82, 
+	0x2d, 0x00, 0xd1, 0x0a, 0x48, 0x1a, 0x69, 0x00, 
+	0x90, 0x01, 0x49, 0x1a, 0x48, 0x18, 0x69, 0x40, 
+	0x90, 0x00, 0x48, 0x17, 0x6a, 0x00, 0x1e, 0x44, 
+	0xe0, 0x10, 0x2d, 0x20, 0xd1, 0x0a, 0x48, 0x14, 
+	0x69, 0x80, 0x90, 0x01, 0x49, 0x14, 0x48, 0x12, 
+	0x69, 0xc0, 0x90, 0x00, 0x48, 0x10, 0x6a, 0x40, 
+	0x1e, 0x44, 0xe0, 0x03, 0x20, 0xb3, 0xb0, 0x02, 
+	0xbc, 0xf0, 0x47, 0x70, 0x20, 0x00, 0x70, 0x10, 
+	0x78, 0x50, 0x00, 0x80, 0x4e, 0x0d, 0x58, 0x37, 
+	0x69, 0x38, 0x61, 0x78, 0x98, 0x01, 0x9e, 0x00, 
+	0x42, 0xb0, 0xd0, 0x07, 0x98, 0x01, 0x30, 0x01, 
+	0x90, 0x01, 0x98, 0x01, 0x40, 0x20, 0x90, 0x01, 
+	0x98, 0x01, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 
+	0xe7, 0xe6, 0xb0, 0x02, 0xe7, 0xe4, 0x00, 0x00, 
+	0x9e, 0x00, 0x04, 0x80, 0x9e, 0x00, 0x04, 0x90, 
+	0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x5e, 0x64, 
+	0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x99, 0x02, 
+	0x06, 0x08, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x88, 
+	0x98, 0x08, 0x28, 0x00, 0xd1, 0x0e, 0x49, 0x69, 
+	0x91, 0x02, 0x48, 0x69, 0x69, 0x00, 0x90, 0x07, 
+	0x48, 0x68, 0x90, 0x06, 0x48, 0x66, 0x69, 0x40, 
+	0x90, 0x05, 0x48, 0x65, 0x6a, 0x00, 0x1e, 0x41, 
+	0x91, 0x04, 0xe0, 0x17, 0x98, 0x08, 0x28, 0x20, 
+	0xd1, 0x0e, 0x49, 0x63, 0x91, 0x02, 0x48, 0x60, 
+	0x69, 0x80, 0x90, 0x07, 0x48, 0x61, 0x90, 0x06, 
+	0x48, 0x5d, 0x69, 0xc0, 0x90, 0x05, 0x48, 0x5c, 
+	0x6a, 0x40, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x05, 
+	0x20, 0xb3, 0xb0, 0x09, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x25, 0x00, 0x98, 0x07, 
+	0x99, 0x05, 0x42, 0x88, 0xd0, 0x73, 0x2d, 0x00, 
+	0xd1, 0x72, 0x98, 0x07, 0x00, 0x80, 0x99, 0x02, 
+	0x18, 0x40, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xc0, 
+	0x68, 0x01, 0x91, 0x03, 0x98, 0x07, 0x00, 0x80, 
+	0x99, 0x02, 0x58, 0x08, 0x90, 0x01, 0x99, 0x02, 
+	0x98, 0x07, 0x18, 0x08, 0x23, 0x01, 0x02, 0xdb, 
+	0x18, 0xc0, 0x78, 0x00, 0x90, 0x00, 0x20, 0x00, 
+	0x99, 0x02, 0x9a, 0x07, 0x18, 0x89, 0x23, 0x01, 
+	0x02, 0xdb, 0x18, 0xc9, 0x70, 0x08, 0x98, 0x07, 
+	0x30, 0x01, 0x90, 0x07, 0x98, 0x07, 0x99, 0x04, 
+	0x40, 0x08, 0x90, 0x07, 0x99, 0x03, 0x29, 0x00, 
+	0xd0, 0x71, 0xb0, 0x83, 0x20, 0x00, 0x90, 0x00, 
+	0x99, 0x06, 0x91, 0x02, 0x20, 0x01, 0x90, 0x01, 
+	0x98, 0x03, 0x28, 0x80, 0xd1, 0x1f, 0x24, 0x00, 
+	0x2c, 0x10, 0xd3, 0x02, 0xe0, 0x1a, 0x34, 0x01, 
+	0xe7, 0xfa, 0x98, 0x01, 0x99, 0x02, 0x40, 0x08, 
+	0xd0, 0x10, 0x48, 0x39, 0x5d, 0x00, 0x28, 0xff, 
+	0xd0, 0x0c, 0x48, 0x37, 0x5d, 0x00, 0x90, 0x00, 
+	0x00, 0xa0, 0x49, 0x36, 0x58, 0x09, 0x00, 0xa8, 
+	0x19, 0xc0, 0x61, 0x01, 0x1c, 0x68, 0x06, 0x05, 
+	0x0e, 0x2d, 0xe0, 0x03, 0x98, 0x01, 0x00, 0x40, 
+	0x90, 0x01, 0xe7, 0xe4, 0xe0, 0x1d, 0x24, 0x00, 
+	0x2c, 0x20, 0xd3, 0x02, 0xe0, 0x19, 0x34, 0x01, 
+	0xe7, 0xfa, 0x98, 0x01, 0x99, 0x02, 0x40, 0x08, 
+	0xd0, 0x0f, 0x48, 0x2b, 0x5d, 0x00, 0x28, 0xff, 
+	0xd0, 0x0b, 0x48, 0x29, 0x5d, 0x00, 0x90, 0x00, 
+	0x00, 0xa0, 0x49, 0x28, 0x58, 0x09, 0x00, 0xa8, 
+	0x19, 0xc0, 0x61, 0x01, 0x1c, 0x68, 0x06, 0x05, 
+	0x0e, 0x2d, 0x98, 0x01, 0x00, 0x40, 0x90, 0x01, 
+	0xe7, 0xe5, 0x2d, 0x00, 0xe0, 0x01, 0xe0, 0x27, 
+	0xe0, 0x26, 0xd0, 0x23, 0xb0, 0x81, 0x98, 0x01, 
+	0x70, 0x78, 0x98, 0x05, 0x60, 0x78, 0x98, 0x01, 
+	0x00, 0x80, 0x49, 0x1d, 0x58, 0x08, 0x90, 0x00, 
+	0x98, 0x00, 0x69, 0x46, 0x98, 0x05, 0x42, 0xb0, 
+	0xd3, 0x04, 0x1d, 0xf0, 0x30, 0xb9, 0x99, 0x05, 
+	0x42, 0x88, 0xd2, 0x08, 0x68, 0x30, 0x28, 0x00, 
+	0xd0, 0x01, 0x68, 0x36, 0xe0, 0x02, 0x20, 0xba, 
+	0xb0, 0x0d, 0xe7, 0x63, 0xe7, 0xee, 0x60, 0xbe, 
+	0x98, 0x00, 0x61, 0x46, 0x1c, 0x38, 0xf0, 0x00, 
+	0xfb, 0x02, 0xb0, 0x01, 0xb0, 0x03, 0xe7, 0x5e, 
+	0x70, 0x3d, 0x98, 0x07, 0x99, 0x06, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x09, 0xe7, 0x52, 0xb0, 0x08, 
+	0xb0, 0x01, 0xe7, 0x4f, 0x2e, 0x08, 0x60, 0x98, 
+	0x9e, 0x00, 0x04, 0x80, 0x9e, 0x00, 0x04, 0x90, 
+	0x2e, 0x08, 0x69, 0x98, 0x9e, 0x00, 0x04, 0x98, 
+	0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, 
+	0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xec, 
+	0x2e, 0x08, 0x5e, 0x64, 0xb4, 0x90, 0x1c, 0x01, 
+	0x78, 0x48, 0x00, 0x80, 0x4c, 0x0d, 0x58, 0x23, 
+	0x69, 0x1a, 0x68, 0x8f, 0x42, 0xba, 0xd0, 0x12, 
+	0x68, 0x10, 0x42, 0xb8, 0xd0, 0x08, 0x68, 0x10, 
+	0x28, 0x00, 0xd0, 0x01, 0x68, 0x12, 0xe0, 0x02, 
+	0x20, 0xba, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xf3, 
+	0x20, 0x00, 0x60, 0x10, 0x69, 0x9c, 0x69, 0x18, 
+	0x60, 0x20, 0x61, 0x1f, 0x61, 0x9a, 0x20, 0x00, 
+	0xe7, 0xf3, 0xe7, 0xf2, 0x2e, 0x08, 0x5e, 0x64, 
+	0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x78, 0x90, 
+	0x23, 0x04, 0x40, 0x18, 0xd0, 0x1c, 0x78, 0x90, 
+	0x23, 0x20, 0x40, 0x18, 0xd0, 0x18, 0x6b, 0x14, 
+	0x68, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1d, 0xe5, 
+	0x35, 0x05, 0xe0, 0x01, 0x1d, 0xe5, 0x35, 0x31, 
+	0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, 0xe0, 0x08, 
+	0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 
+	0x00, 0x88, 0x58, 0x2b, 0x00, 0x88, 0x50, 0x3b, 
+	0xe7, 0xf6, 0x20, 0x00, 0xbc, 0xb0, 0x47, 0x70, 
+	0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, 
+	0x1c, 0x0a, 0xb0, 0x93, 0x20, 0x00, 0x90, 0x06, 
+	0x98, 0x13, 0x69, 0x00, 0x90, 0x00, 0x98, 0x00, 
+	0x6b, 0x00, 0x90, 0x12, 0x98, 0x00, 0x78, 0x80, 
+	0x90, 0x05, 0x98, 0x12, 0x68, 0x00, 0x90, 0x01, 
+	0x28, 0x00, 0xd0, 0x03, 0x98, 0x12, 0x30, 0x0c, 
+	0x90, 0x09, 0xe0, 0x0e, 0x98, 0x12, 0x6a, 0xc0, 
+	0x90, 0x01, 0x28, 0x00, 0xd0, 0x03, 0x98, 0x12, 
+	0x30, 0x38, 0x90, 0x09, 0xe0, 0x05, 0x20, 0xb1, 
+	0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x20, 0x00, 0x90, 0x06, 0x98, 0x05, 
+	0x23, 0x04, 0x40, 0x18, 0xd0, 0x73, 0x21, 0x00, 
+	0x29, 0x08, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x48, 
+	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x98, 0x13, 
+	0x30, 0x80, 0x69, 0x00, 0x00, 0x8b, 0x58, 0xc0, 
+	0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe7, 0xf2, 
+	0x9d, 0x01, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, 
+	0xe0, 0xa7, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
+	0xe7, 0xf8, 0x00, 0x88, 0xab, 0x0a, 0x58, 0x18, 
+	0x28, 0x00, 0xd0, 0x55, 0x20, 0x00, 0x90, 0x08, 
+	0x48, 0x73, 0x90, 0x07, 0x20, 0x00, 0x90, 0x02, 
+	0x98, 0x02, 0x28, 0x20, 0xdb, 0x06, 0xe0, 0x8d, 
+	0x98, 0x02, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 
+	0x90, 0x02, 0xe7, 0xf5, 0x00, 0x8b, 0xa8, 0x0a, 
+	0x58, 0xc0, 0x9b, 0x07, 0x40, 0x18, 0x90, 0x08, 
+	0x28, 0x00, 0xd0, 0x73, 0x00, 0x88, 0x9b, 0x09, 
+	0x58, 0x18, 0x9b, 0x08, 0x40, 0x18, 0xd0, 0x6e, 
+	0x1d, 0xec, 0x34, 0x01, 0x27, 0x00, 0x79, 0xa0, 
+	0x9b, 0x06, 0x42, 0x98, 0xd0, 0x08, 0x68, 0x68, 
+	0x1c, 0x05, 0xd1, 0x02, 0x20, 0xba, 0xb0, 0x13, 
+	0xe7, 0xab, 0x1d, 0xec, 0x34, 0x01, 0xe7, 0xf2, 
+	0x78, 0x60, 0x07, 0x00, 0x0f, 0x00, 0x02, 0x00, 
+	0x04, 0x07, 0x0c, 0x3f, 0x78, 0xa0, 0x19, 0xc0, 
+	0x30, 0x03, 0x04, 0x07, 0x0c, 0x3f, 0x2a, 0x00, 
+	0xd0, 0x42, 0x98, 0x13, 0x88, 0x40, 0x42, 0xb8, 
+	0xdb, 0x3a, 0x98, 0x13, 0x88, 0x40, 0x1b, 0xc0, 
+	0x9b, 0x13, 0x80, 0x58, 0x20, 0xbc, 0x90, 0x04, 
+	0x2f, 0x00, 0xdd, 0x30, 0x2f, 0xbc, 0xdd, 0x1b, 
+	0x20, 0x00, 0x90, 0x03, 0x98, 0x03, 0x28, 0xbc, 
+	0xdb, 0x09, 0xe0, 0x0d, 0x98, 0x03, 0x30, 0x01, 
+	0x06, 0x00, 0x0e, 0x00, 0xe0, 0x01, 0xe0, 0x4c, 
+	0xe0, 0x41, 0x90, 0x03, 0xe7, 0xf2, 0x78, 0x23, 
+	0x34, 0x01, 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf1, 
+	0x1f, 0xf8, 0x38, 0xb5, 0x04, 0x07, 0x0c, 0x3f, 
+	0x68, 0x2d, 0x1d, 0xec, 0x34, 0x01, 0xe0, 0x11, 
+	0x20, 0x00, 0x90, 0x03, 0x98, 0x03, 0x42, 0xb8, 
+	0xdb, 0x06, 0xe0, 0x0a, 0x98, 0x03, 0x30, 0x01, 
+	0x06, 0x00, 0x0e, 0x00, 0x90, 0x03, 0xe7, 0xf5, 
+	0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 0x32, 0x01, 
+	0xe7, 0xf4, 0x27, 0x00, 0xe7, 0xcc, 0xe0, 0x02, 
+	0x20, 0xb7, 0xb0, 0x13, 0xe7, 0x59, 0xe0, 0x04, 
+	0x98, 0x13, 0x88, 0x40, 0x19, 0xc0, 0x9b, 0x13, 
+	0x80, 0x58, 0x00, 0x88, 0xab, 0x0a, 0x58, 0x18, 
+	0x9b, 0x07, 0x43, 0x98, 0x00, 0x8e, 0xab, 0x0a, 
+	0x51, 0x98, 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x00, 
+	0x9d, 0x01, 0x98, 0x06, 0x30, 0x01, 0x06, 0x00, 
+	0x0e, 0x00, 0x90, 0x06, 0x98, 0x07, 0x08, 0x40, 
+	0x90, 0x07, 0xe7, 0x71, 0xe0, 0x04, 0x98, 0x06, 
+	0x30, 0x20, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06, 
+	0xe7, 0x57, 0x20, 0x00, 0xb0, 0x13, 0xe7, 0x34, 
+	0xe0, 0x44, 0x98, 0x05, 0x23, 0x02, 0x40, 0x18, 
+	0xd0, 0x3b, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01, 
+	0x78, 0x60, 0x07, 0x00, 0x0f, 0x00, 0x02, 0x00, 
+	0x04, 0x07, 0x0c, 0x3f, 0x78, 0xa0, 0x19, 0xc0, 
+	0x30, 0x03, 0x04, 0x07, 0x0c, 0x3f, 0x2f, 0x00, 
+	0xdd, 0x28, 0x2f, 0xbc, 0xdd, 0x17, 0x21, 0x00, 
+	0x29, 0xbc, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 
+	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x23, 
+	0x34, 0x01, 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf6, 
+	0x1f, 0xf8, 0x38, 0xb5, 0x04, 0x07, 0x0c, 0x3f, 
+	0x98, 0x01, 0x68, 0x00, 0x90, 0x01, 0x98, 0x01, 
+	0x1d, 0xc4, 0x34, 0x01, 0xe0, 0x0d, 0x21, 0x00, 
+	0x42, 0xb9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 
+	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x23, 
+	0x34, 0x01, 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf6, 
+	0x27, 0x00, 0xe7, 0xd4, 0x20, 0x00, 0xb0, 0x13, 
+	0xe6, 0xf3, 0x20, 0xb1, 0xb0, 0x13, 0xe6, 0xf0, 
+	0xb0, 0x13, 0xe6, 0xee, 0xe6, 0xed, 0x00, 0x00, 
+	0x80, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0xb0, 0x84, 
+	0x98, 0x04, 0x78, 0x40, 0x00, 0x80, 0x49, 0x4b, 
+	0x58, 0x08, 0x90, 0x03, 0x28, 0x00, 0xd1, 0x05, 
+	0x20, 0xb0, 0xb0, 0x04, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x98, 0x04, 0x68, 0x86, 
+	0x98, 0x04, 0x88, 0x47, 0x98, 0x04, 0x68, 0x44, 
+	0x1d, 0xf0, 0x30, 0xb9, 0x99, 0x04, 0x68, 0x49, 
+	0x1a, 0x45, 0x42, 0xbd, 0xdb, 0x0c, 0x2f, 0x00, 
+	0xdb, 0x01, 0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, 
+	0xb0, 0x04, 0xe7, 0xe7, 0x1c, 0x3a, 0x99, 0x05, 
+	0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x29, 0xe0, 0x6b, 
+	0x20, 0x00, 0x90, 0x00, 0x98, 0x04, 0x78, 0x40, 
+	0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 0x49, 0x36, 
+	0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x01, 
+	0x78, 0x80, 0x90, 0x02, 0x98, 0x02, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x12, 
+	0xd1, 0x03, 0x2d, 0x0e, 0xda, 0x01, 0x20, 0x01, 
+	0x90, 0x00, 0x2f, 0x00, 0xdd, 0x50, 0xb0, 0x81, 
+	0x42, 0xaf, 0xdd, 0x0d, 0x2d, 0x00, 0xdb, 0x01, 
+	0x2d, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05, 
+	0xe7, 0xbc, 0x1c, 0x2a, 0x99, 0x06, 0x1c, 0x20, 
+	0xf0, 0x00, 0xf8, 0xfe, 0x68, 0x36, 0xe0, 0x0b, 
+	0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc, 0xdd, 0x02, 
+	0x20, 0xba, 0xb0, 0x05, 0xe7, 0xae, 0x1c, 0x3a, 
+	0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xf0, 
+	0x99, 0x06, 0x19, 0x49, 0x91, 0x06, 0x1b, 0x7f, 
+	0x1d, 0x31, 0x91, 0x00, 0x99, 0x00, 0x78, 0x88, 
+	0x19, 0x84, 0x98, 0x01, 0x28, 0x00, 0xd0, 0x20, 
+	0x99, 0x00, 0x78, 0xc8, 0x23, 0x80, 0x40, 0x18, 
+	0xd1, 0x1b, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05, 
+	0x42, 0xbd, 0xdb, 0x01, 0x3c, 0x01, 0xe0, 0x14, 
+	0x1c, 0x68, 0x42, 0xb8, 0xd1, 0x11, 0x99, 0x00, 
+	0x78, 0x88, 0x28, 0x09, 0xdd, 0x08, 0x99, 0x00, 
+	0x79, 0x08, 0x30, 0x09, 0x99, 0x00, 0x78, 0x89, 
+	0x42, 0x88, 0xd0, 0x00, 0x3c, 0x01, 0xe0, 0x04, 
+	0x99, 0x00, 0x78, 0x88, 0x28, 0x09, 0xd1, 0x00, 
+	0x3c, 0x01, 0x20, 0x00, 0x90, 0x01, 0x1d, 0xf0, 
+	0x30, 0xb9, 0x1b, 0x05, 0xb0, 0x01, 0xe7, 0xac, 
+	0x20, 0x00, 0xb0, 0x04, 0xe7, 0x72, 0xb0, 0x04, 
+	0xe7, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x5d, 0xcc, 0xb5, 0xf1, 0x98, 0x00, 
+	0x06, 0x04, 0x0e, 0x24, 0xb0, 0x83, 0x00, 0xa0, 
+	0x4b, 0x4c, 0x58, 0x1d, 0x78, 0x28, 0x90, 0x02, 
+	0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 
+	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x00, 0xa0, 0x4b, 0x46, 0x58, 0x18, 0x1c, 0x05, 
+	0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03, 0xe7, 0xf3, 
+	0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x4b, 0x42, 
+	0x68, 0x1b, 0x18, 0xc7, 0x78, 0xa8, 0x28, 0x00, 
+	0xd0, 0x63, 0x20, 0x00, 0x42, 0x80, 0xd0, 0x20, 
+	0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x1b, 
+	0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 
+	0x00, 0x88, 0x4b, 0x3a, 0x58, 0x18, 0x90, 0x01, 
+	0x98, 0x01, 0x79, 0xc0, 0x42, 0xa0, 0xd1, 0x0e, 
+	0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x36, 
+	0x68, 0x1b, 0x40, 0x18, 0x4b, 0x34, 0x60, 0x18, 
+	0x23, 0x00, 0x00, 0x88, 0x4e, 0x31, 0x50, 0x33, 
+	0x23, 0xff, 0x48, 0x32, 0x54, 0x43, 0xe7, 0xe3, 
+	0xe0, 0x3f, 0x7e, 0x38, 0x1c, 0x02, 0x28, 0xff, 
+	0xd0, 0x10, 0x20, 0xff, 0x4b, 0x2e, 0x54, 0x98, 
+	0x23, 0x00, 0x00, 0x90, 0x4e, 0x2d, 0x50, 0x33, 
+	0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, 0x4b, 0x2c, 
+	0x88, 0x1b, 0x40, 0x18, 0x4b, 0x2a, 0x80, 0x18, 
+	0x20, 0xff, 0x76, 0x38, 0x7e, 0x78, 0x1c, 0x02, 
+	0x28, 0xff, 0xd0, 0x11, 0x20, 0xff, 0x4b, 0x24, 
+	0x54, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x23, 
+	0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, 
+	0x4b, 0x21, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x20, 
+	0x80, 0x18, 0x20, 0xff, 0x76, 0x78, 0xe0, 0x02, 
+	0x20, 0xb1, 0xb0, 0x03, 0xe7, 0x98, 0x23, 0x00, 
+	0x00, 0x90, 0x4e, 0x1a, 0x50, 0x33, 0x20, 0x01, 
+	0x40, 0x90, 0x43, 0xc0, 0x4b, 0x18, 0x88, 0x1b, 
+	0x40, 0x18, 0x4b, 0x17, 0x80, 0x18, 0x4e, 0x17, 
+	0x96, 0x00, 0x20, 0x00, 0x00, 0x93, 0x9e, 0x00, 
+	0x50, 0xf0, 0x98, 0x02, 0x23, 0x20, 0x40, 0x18, 
+	0xd0, 0xff, 0x21, 0x00, 0x29, 0x0c, 0xdb, 0x04, 
+	0xe0, 0x07, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
+	0xe7, 0xf8, 0x20, 0x00, 0x18, 0x7b, 0x73, 0x18, 
+	0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 
+	0x70, 0xf8, 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x6f, 
+	0xb0, 0x03, 0xe7, 0x6d, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5e, 0xec, 
+	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xac, 
+	0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, 
+	0x2e, 0x08, 0x5e, 0xe8, 0x9e, 0x00, 0x04, 0xb8, 
+	0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
+	0x20, 0x1d, 0x02, 0x80, 0x69, 0x86, 0x1c, 0x3a, 
+	0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x08, 0xfb, 0x32, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 
+	0x1c, 0x01, 0xb0, 0x82, 0x68, 0x48, 0x68, 0x8c, 
+	0x1d, 0xe2, 0x32, 0xb7, 0x42, 0x82, 0xd9, 0x09, 
+	0x78, 0x42, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, 
+	0x78, 0x83, 0x43, 0x1a, 0x32, 0x03, 0x04, 0x17, 
+	0x0c, 0x3f, 0xe0, 0x41, 0xb0, 0x82, 0x68, 0x23, 
+	0x93, 0x01, 0x9b, 0x01, 0x33, 0x04, 0x93, 0x00, 
+	0x9b, 0x00, 0x78, 0x9b, 0x9e, 0x01, 0x19, 0x9a, 
+	0x78, 0x4e, 0x00, 0xf3, 0x1b, 0x9b, 0x00, 0x9b, 
+	0x4e, 0x1b, 0x68, 0x36, 0x19, 0x9b, 0x93, 0x02, 
+	0x9b, 0x02, 0x78, 0x9d, 0x06, 0xed, 0x0e, 0xed, 
+	0x2d, 0x12, 0xd1, 0x0f, 0x1d, 0xe3, 0x33, 0xb9, 
+	0x68, 0x4e, 0x1b, 0x9b, 0x06, 0x1b, 0x0e, 0x1b, 
+	0x93, 0x03, 0x9b, 0x00, 0x78, 0xde, 0x23, 0x80, 
+	0x40, 0x33, 0xd1, 0x03, 0x9b, 0x03, 0x2b, 0x0e, 
+	0xda, 0x00, 0x3a, 0x01, 0x1d, 0xe3, 0x33, 0xb8, 
+	0x42, 0x83, 0xd9, 0x0b, 0x78, 0x43, 0x07, 0x1b, 
+	0x0f, 0x1b, 0x02, 0x1b, 0x04, 0x1f, 0x0c, 0x3f, 
+	0x78, 0x13, 0x18, 0xfb, 0x33, 0x03, 0x04, 0x1f, 
+	0x0c, 0x3f, 0xe0, 0x08, 0x78, 0x13, 0x07, 0x1b, 
+	0x0f, 0x1b, 0x02, 0x1b, 0x78, 0x56, 0x43, 0x33, 
+	0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xb0, 0x02, 
+	0x80, 0x4f, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
+	0x2e, 0x08, 0x5d, 0xcc, 0xb5, 0xf3, 0xb0, 0x81, 
+	0x99, 0x02, 0x06, 0x0b, 0x0e, 0x1b, 0x93, 0x00, 
+	0x9b, 0x00, 0x2b, 0x00, 0xd1, 0x0a, 0x49, 0x24, 
+	0x4b, 0x24, 0x69, 0x1b, 0x1c, 0x18, 0x4b, 0x23, 
+	0x69, 0x5b, 0x1c, 0x1c, 0x4b, 0x21, 0x6a, 0x1b, 
+	0x1e, 0x5a, 0xe0, 0x09, 0x49, 0x20, 0x4b, 0x1f, 
+	0x69, 0x9b, 0x1c, 0x18, 0x4b, 0x1d, 0x69, 0xdb, 
+	0x1c, 0x1c, 0x4b, 0x1c, 0x6a, 0x5b, 0x1e, 0x5a, 
+	0x9b, 0x01, 0x78, 0xdd, 0x26, 0x01, 0x40, 0xae, 
+	0x1c, 0x37, 0x42, 0xa0, 0xd0, 0x26, 0x00, 0x83, 
+	0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, 
+	0x68, 0x1b, 0x40, 0x3b, 0xd0, 0x1b, 0x00, 0x83, 
+	0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, 
+	0x68, 0x1b, 0x43, 0xbb, 0x1c, 0x1d, 0x00, 0x83, 
+	0x18, 0x5e, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xf3, 
+	0x60, 0x1d, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, 
+	0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x2b, 0x00, 
+	0xd1, 0x05, 0x25, 0x00, 0x18, 0x0e, 0x23, 0x01, 
+	0x02, 0xdb, 0x18, 0xf3, 0x70, 0x1d, 0x30, 0x01, 
+	0x40, 0x10, 0xe7, 0xd6, 0xb0, 0x01, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x60, 0x98, 0x9e, 0x00, 0x04, 0x80, 
+	0x2e, 0x08, 0x69, 0x98, 0xb4, 0x90, 0x1c, 0x03, 
+	0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x21, 0x0e, 0x09, 
+	0x06, 0x38, 0x0e, 0x00, 0x72, 0x19, 0x28, 0x00, 
+	0xd0, 0x00, 0x75, 0x58, 0x68, 0x5b, 0x2b, 0x00, 
+	0xd1, 0xf8, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, 
+	0xb5, 0x80, 0x1c, 0x07, 0x68, 0xf8, 0x28, 0x1f, 
+	0xd9, 0x03, 0x20, 0xe1, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x48, 0x1e, 0x6d, 0x00, 0x68, 0x00, 
+	0x4b, 0x1d, 0x40, 0x18, 0x49, 0x1b, 0x6d, 0x09, 
+	0x60, 0x08, 0x05, 0x80, 0x48, 0x19, 0x6d, 0x00, 
+	0x68, 0x00, 0x49, 0x18, 0x6e, 0xc9, 0x60, 0x08, 
+	0x48, 0x16, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 
+	0x02, 0x5b, 0x43, 0x18, 0x49, 0x13, 0x6d, 0x09, 
+	0x60, 0x08, 0x05, 0x80, 0x48, 0x11, 0x6d, 0x00, 
+	0x68, 0x00, 0x49, 0x10, 0x6e, 0xc9, 0x60, 0x08, 
+	0x48, 0x0e, 0x6f, 0xc1, 0xcf, 0x09, 0xc1, 0x09, 
+	0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x08, 0xc1, 0x08, 
+	0xf0, 0x00, 0xfc, 0x1e, 0x20, 0x00, 0x49, 0x09, 
+	0x60, 0x08, 0x20, 0x00, 0x49, 0x07, 0x60, 0x48, 
+	0x20, 0x00, 0x49, 0x06, 0x60, 0x88, 0x49, 0x07, 
+	0x20, 0x0b, 0xf0, 0x0c, 0xf9, 0x93, 0x20, 0xff, 
+	0x30, 0x01, 0x49, 0x02, 0x61, 0xc8, 0x20, 0x00, 
+	0xe7, 0xc0, 0xe7, 0xbf, 0x2e, 0x08, 0x1f, 0x24, 
+	0xff, 0xff, 0xfd, 0xff, 0x2e, 0x01, 0x01, 0xf9, 
+	0x1c, 0x01, 0x48, 0x0e, 0x6f, 0x00, 0x68, 0x00, 
+	0x60, 0x08, 0x48, 0x0c, 0x6e, 0x80, 0x68, 0x00, 
+	0x60, 0x48, 0x48, 0x0a, 0x6e, 0xc0, 0x68, 0x00, 
+	0x60, 0x88, 0x48, 0x08, 0x6f, 0x40, 0x68, 0x00, 
+	0x60, 0xc8, 0x48, 0x06, 0x68, 0x00, 0x61, 0x08, 
+	0x48, 0x04, 0x68, 0x40, 0x61, 0x48, 0x48, 0x03, 
+	0x68, 0x80, 0x61, 0x88, 0x20, 0x00, 0x47, 0x70, 
+	0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x24, 
+	0x48, 0x03, 0x6e, 0x80, 0x68, 0x00, 0x07, 0x40, 
+	0x0f, 0xc0, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
+	0x2e, 0x08, 0x1f, 0x24, 0xb4, 0x80, 0x1c, 0x07, 
+	0x1c, 0x0a, 0x48, 0x37, 0x69, 0xc0, 0x23, 0xff, 
+	0x33, 0x01, 0x42, 0x98, 0xd0, 0x02, 0x20, 0xe0, 
+	0xbc, 0x80, 0x47, 0x70, 0x48, 0x32, 0x62, 0x07, 
+	0x20, 0x00, 0x49, 0x31, 0x62, 0x48, 0x48, 0x31, 
+	0x60, 0x02, 0x48, 0x30, 0x68, 0x00, 0x78, 0x00, 
+	0x49, 0x2d, 0x61, 0x88, 0x48, 0x2d, 0x68, 0x00, 
+	0x7a, 0x00, 0x49, 0x2b, 0x61, 0x08, 0x48, 0x2b, 
+	0x68, 0x00, 0x68, 0x40, 0x49, 0x28, 0x60, 0xc8, 
+	0x48, 0x27, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
+	0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01, 
+	0x02, 0x40, 0x49, 0x23, 0x61, 0xc8, 0x48, 0x22, 
+	0x68, 0x40, 0x30, 0x01, 0x49, 0x20, 0x60, 0x48, 
+	0x48, 0x1f, 0x6d, 0x40, 0x68, 0x00, 0x0a, 0x00, 
+	0x02, 0x00, 0x49, 0x1d, 0x69, 0x89, 0x08, 0x49, 
+	0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, 0x49, 0x1a, 
+	0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, 0x48, 0x18, 
+	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19, 0x40, 0x18, 
+	0x49, 0x15, 0x69, 0x89, 0x07, 0xc9, 0x0c, 0x49, 
+	0x43, 0x08, 0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, 
+	0x04, 0x40, 0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, 
+	0x4b, 0x13, 0x40, 0x18, 0x49, 0x0e, 0x6d, 0x09, 
+	0x60, 0x08, 0x05, 0x40, 0x48, 0x0c, 0x6d, 0x00, 
+	0x68, 0x00, 0x23, 0x01, 0x03, 0x1b, 0x43, 0x18, 
+	0x49, 0x09, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 
+	0x48, 0x07, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x06, 
+	0x6f, 0x09, 0x60, 0x08, 0x48, 0x04, 0x6d, 0x00, 
+	0x68, 0x00, 0x49, 0x03, 0x6e, 0xc9, 0x60, 0x08, 
+	0x20, 0x00, 0xe7, 0x99, 0xe7, 0x98, 0x00, 0x00, 
+	0x2e, 0x08, 0x1f, 0x24, 0x2e, 0x08, 0x60, 0x5c, 
+	0x00, 0x00, 0x02, 0x01, 0xff, 0xff, 0xbf, 0xff, 
+	0xff, 0xff, 0xfb, 0xff, 0xb5, 0x00, 0x48, 0xf6, 
+	0x6e, 0x80, 0x68, 0x00, 0x23, 0x08, 0x40, 0x18, 
+	0xd0, 0x74, 0x48, 0xf3, 0x6d, 0x00, 0x68, 0x00, 
+	0x4b, 0xf2, 0x40, 0x18, 0x49, 0xf0, 0x6d, 0x09, 
+	0x60, 0x08, 0x04, 0x80, 0x48, 0xee, 0x6e, 0x40, 
+	0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0xec, 
+	0x6e, 0x49, 0x60, 0x08, 0x06, 0x00, 0x48, 0xea, 
+	0x6e, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0xdb, 
+	0x40, 0x18, 0xd0, 0x3e, 0x20, 0xff, 0x30, 0x01, 
+	0x49, 0xe5, 0x61, 0xc8, 0x48, 0xe4, 0x6d, 0x00, 
+	0x68, 0x00, 0x4b, 0xe5, 0x40, 0x18, 0x49, 0xe2, 
+	0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x48, 0xe0, 
+	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, 0x74, 
+	0x48, 0xc9, 0x68, 0x00, 0x30, 0x01, 0x49, 0xc8, 
+	0x60, 0x08, 0x48, 0xc7, 0x69, 0xc0, 0x4b, 0xcb, 
+	0x42, 0x98, 0xd0, 0x73, 0xdc, 0x08, 0x23, 0xff, 
+	0x33, 0x01, 0x42, 0x98, 0xd0, 0x6f, 0x23, 0x01, 
+	0x02, 0x5b, 0x42, 0x98, 0xd0, 0x07, 0xe2, 0xba, 
+	0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x68, 0x4b, 0xc5, 
+	0x42, 0x98, 0xd0, 0x66, 0xe2, 0xb3, 0x48, 0xbc, 
+	0x6e, 0x80, 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 
+	0x40, 0x18, 0xe0, 0x00, 0xe2, 0xcd, 0xd0, 0x3f, 
+	0x48, 0xb7, 0x68, 0x00, 0x30, 0x01, 0x49, 0xb6, 
+	0x60, 0x08, 0x48, 0xb5, 0x6d, 0x00, 0x68, 0x00, 
+	0x4b, 0xb5, 0x40, 0x18, 0x49, 0xb2, 0x6d, 0x09, 
+	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, 0x11, 0xe0, 0x5e, 
+	0x48, 0x97, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x20, 
+	0x48, 0x95, 0x69, 0x00, 0x38, 0x01, 0x49, 0x94, 
+	0x61, 0x08, 0x48, 0x93, 0x68, 0xc0, 0x78, 0x00, 
+	0x49, 0x91, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09, 
+	0x02, 0x09, 0x43, 0x08, 0x49, 0x8e, 0x6c, 0x89, 
+	0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x8c, 
+	0x68, 0xc0, 0xe0, 0x03, 0xe1, 0x4b, 0xe2, 0x4d, 
+	0xe0, 0x42, 0xe1, 0x93, 0x30, 0x01, 0x49, 0x88, 
+	0x60, 0xc8, 0x48, 0x8d, 0x49, 0x86, 0x61, 0xc8, 
+	0xe0, 0x39, 0x20, 0xff, 0x30, 0x01, 0x49, 0x84, 
+	0x61, 0xc8, 0x48, 0x83, 0x6f, 0xc0, 0x68, 0x80, 
+	0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x80, 
+	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, 0xba, 0x48, 0x6c, 0x6d, 0x00, 
+	0x68, 0x00, 0x4b, 0x6d, 0x40, 0x18, 0x49, 0x6a, 
+	0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0xe2, 0x08, 
+	0x48, 0x67, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x5f, 
+	0x48, 0x65, 0x6e, 0x80, 0x68, 0x00, 0x23, 0xff, 
+	0x33, 0x01, 0x40, 0x18, 0xd0, 0x3f, 0x48, 0x62, 
+	0x68, 0x00, 0x30, 0x01, 0x49, 0x60, 0x60, 0x08, 
+	0x48, 0x5f, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x60, 
+	0x40, 0x18, 0x49, 0x5d, 0x6d, 0x09, 0x60, 0x08, 
+	0x04, 0xc0, 0x20, 0xff, 0x30, 0x01, 0x49, 0x5a, 
+	0x61, 0xc8, 0x48, 0x59, 0x6f, 0xc0, 0x68, 0x80, 
+	0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x56, 
+	0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 
+	0x48, 0x56, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x52, 
+	0x69, 0x09, 0x1a, 0x41, 0x48, 0x50, 0x6f, 0xc0, 
+	0x68, 0x80, 0x68, 0x02, 0x4b, 0x52, 0x40, 0x1a, 
+	0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 
+	0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x4a, 
+	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 
+	0x43, 0x19, 0x60, 0x01, 0x07, 0x88, 0x48, 0x46, 
+	0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 
+	0xf0, 0x0b, 0xff, 0x66, 0xe0, 0x17, 0x48, 0x42, 
+	0x68, 0xc0, 0x78, 0x00, 0x49, 0x40, 0x6c, 0x89, 
+	0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08, 
+	0x49, 0x3d, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00, 
+	0x0e, 0x00, 0x48, 0x3b, 0x68, 0xc0, 0x30, 0x01, 
+	0x49, 0x39, 0x60, 0xc8, 0x48, 0x38, 0x69, 0x00, 
+	0x38, 0x01, 0x49, 0x37, 0x61, 0x08, 0xe0, 0xa1, 
+	0x48, 0x35, 0x6a, 0x00, 0x38, 0x01, 0x49, 0x34, 
+	0x62, 0x08, 0x48, 0x33, 0x6a, 0x00, 0x28, 0x00, 
+	0xd0, 0x4b, 0x48, 0x31, 0x6a, 0x40, 0x30, 0x01, 
+	0x49, 0x2f, 0x62, 0x48, 0x48, 0x31, 0x68, 0x00, 
+	0x30, 0x0c, 0x49, 0x30, 0x60, 0x08, 0x48, 0x2f, 
+	0x68, 0x00, 0x78, 0x00, 0x49, 0x2a, 0x61, 0x88, 
+	0x48, 0x2c, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x28, 
+	0x61, 0x08, 0x48, 0x2a, 0x68, 0x00, 0x68, 0x40, 
+	0x49, 0x25, 0x60, 0xc8, 0x48, 0x24, 0x69, 0x80, 
+	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27, 
+	0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x20, 
+	0x61, 0xc8, 0x48, 0x1f, 0x6d, 0x00, 0x68, 0x00, 
+	0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 0x49, 0x1c, 
+	0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, 0x48, 0x1a, 
+	0x6d, 0x40, 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 
+	0x49, 0x17, 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 
+	0x0e, 0x09, 0x43, 0x08, 0x49, 0x14, 0x6d, 0x49, 
+	0x60, 0x08, 0x06, 0x00, 0x48, 0x12, 0x6d, 0x00, 
+	0x68, 0x00, 0x4b, 0x19, 0x40, 0x18, 0x49, 0x10, 
+	0x69, 0x89, 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 
+	0x49, 0x0d, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 
+	0xe0, 0x4c, 0x20, 0xff, 0x30, 0x01, 0x49, 0x0a, 
+	0x61, 0xc8, 0x48, 0x09, 0x6f, 0xc0, 0x68, 0x80, 
+	0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x06, 
+	0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 
+	0x48, 0x06, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x02, 
+	0x69, 0x09, 0x1a, 0x41, 0x48, 0x00, 0xe0, 0x11, 
+	0x2e, 0x08, 0x1f, 0x24, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0xff, 0xef, 0xff, 0x2e, 0x08, 0x60, 0x5c, 
+	0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x02, 0x01, 
+	0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x03, 
+	0xff, 0xff, 0xbf, 0xff, 0x6f, 0xc0, 0x68, 0x80, 
+	0x68, 0x02, 0x4b, 0xa5, 0x40, 0x1a, 0x04, 0x09, 
+	0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 
+	0x02, 0x08, 0x0c, 0x00, 0x48, 0xa1, 0x6f, 0xc0, 
+	0x68, 0x80, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 
+	0x60, 0x01, 0x07, 0xc8, 0x48, 0x9d, 0x6f, 0xc0, 
+	0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 
+	0xfe, 0xb3, 0x48, 0x9a, 0x6d, 0x00, 0x68, 0x00, 
+	0x4b, 0x99, 0x40, 0x18, 0x49, 0x97, 0x6d, 0x09, 
+	0x60, 0x08, 0x04, 0xc0, 0xe1, 0x01, 0x48, 0x95, 
+	0x6e, 0x80, 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 
+	0x40, 0x18, 0xd0, 0x3f, 0x48, 0x91, 0x68, 0x00, 
+	0x30, 0x01, 0x49, 0x90, 0x60, 0x08, 0x48, 0x8f, 
+	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x8e, 0x40, 0x18, 
+	0x49, 0x8c, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 
+	0x20, 0xff, 0x30, 0x01, 0x49, 0x89, 0x61, 0xc8, 
+	0x48, 0x88, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 
+	0x02, 0x09, 0x0a, 0x09, 0x4a, 0x85, 0x6a, 0x52, 
+	0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0x85, 
+	0x68, 0x00, 0x7a, 0x00, 0x49, 0x81, 0x69, 0x09, 
+	0x1a, 0x41, 0x48, 0x80, 0x6f, 0xc0, 0x68, 0x80, 
+	0x68, 0x02, 0x4b, 0x7d, 0x40, 0x1a, 0x04, 0x09, 
+	0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 
+	0x02, 0x08, 0x0c, 0x00, 0x48, 0x79, 0x6f, 0xc0, 
+	0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 
+	0x60, 0x01, 0x07, 0x88, 0x48, 0x75, 0x6f, 0xc0, 
+	0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 
+	0xfe, 0x63, 0xe0, 0x02, 0x48, 0x74, 0x49, 0x71, 
+	0x61, 0xc8, 0xe0, 0xb6, 0x48, 0x6f, 0x69, 0x00, 
+	0x28, 0x00, 0xd0, 0x62, 0x48, 0x6d, 0x6e, 0x00, 
+	0x68, 0x00, 0x49, 0x6c, 0x68, 0xc9, 0x70, 0x08, 
+	0x48, 0x6a, 0x68, 0xc0, 0x30, 0x01, 0x49, 0x69, 
+	0x60, 0xc8, 0x48, 0x68, 0x69, 0x00, 0x38, 0x01, 
+	0x49, 0x66, 0x61, 0x08, 0x48, 0x65, 0x69, 0x00, 
+	0x28, 0x00, 0xd1, 0x4d, 0x48, 0x63, 0x6a, 0x00, 
+	0x28, 0x01, 0xd1, 0x49, 0x48, 0x63, 0x68, 0x00, 
+	0x7a, 0x40, 0x49, 0x60, 0x6d, 0x09, 0x68, 0x09, 
+	0x4b, 0x62, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0x40, 
+	0x43, 0x08, 0x49, 0x5c, 0x6d, 0x09, 0x60, 0x08, 
+	0x05, 0x40, 0x0f, 0xc0, 0x20, 0xff, 0x30, 0x01, 
+	0x49, 0x58, 0x61, 0xc8, 0x48, 0x57, 0x6d, 0x00, 
+	0x68, 0x00, 0x4b, 0x57, 0x40, 0x18, 0x49, 0x55, 
+	0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x48, 0x53, 
+	0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 
+	0x0a, 0x09, 0x4a, 0x50, 0x6a, 0x52, 0x06, 0x12, 
+	0x43, 0x11, 0x60, 0x01, 0x48, 0x4f, 0x68, 0x00, 
+	0x7a, 0x00, 0x49, 0x4c, 0x69, 0x09, 0x1a, 0x41, 
+	0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 
+	0x4b, 0x47, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 
+	0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 
+	0x0c, 0x00, 0x48, 0x44, 0x6f, 0xc0, 0x68, 0x80, 
+	0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 
+	0x07, 0xc8, 0x48, 0x40, 0x6f, 0xc0, 0x68, 0xc1, 
+	0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xfd, 0xf8, 
+	0xe0, 0x4f, 0x48, 0x3c, 0x6a, 0x00, 0x38, 0x01, 
+	0x49, 0x3a, 0x62, 0x08, 0x48, 0x39, 0x6a, 0x40, 
+	0x30, 0x01, 0x49, 0x38, 0x62, 0x48, 0x48, 0x39, 
+	0x68, 0x00, 0x30, 0x0c, 0x49, 0x37, 0x60, 0x08, 
+	0x48, 0x36, 0x68, 0x00, 0x78, 0x00, 0x49, 0x33, 
+	0x61, 0x88, 0x48, 0x34, 0x68, 0x00, 0x7a, 0x00, 
+	0x49, 0x30, 0x61, 0x08, 0x48, 0x31, 0x68, 0x00, 
+	0x68, 0x40, 0x49, 0x2e, 0x60, 0xc8, 0x48, 0x2d, 
+	0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 
+	0x48, 0x2f, 0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 
+	0x49, 0x28, 0x61, 0xc8, 0x48, 0x27, 0x6d, 0x00, 
+	0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 
+	0x49, 0x24, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, 
+	0x48, 0x22, 0x6d, 0x40, 0x68, 0x00, 0x0a, 0x00, 
+	0x02, 0x00, 0x49, 0x20, 0x69, 0x89, 0x08, 0x49, 
+	0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, 0x49, 0x1d, 
+	0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, 0x48, 0x1b, 
+	0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1f, 0x40, 0x18, 
+	0x49, 0x18, 0x69, 0x89, 0x07, 0xc9, 0x0c, 0x49, 
+	0x43, 0x08, 0x49, 0x16, 0x6d, 0x09, 0x60, 0x08, 
+	0x04, 0x40, 0xe0, 0x01, 0xe0, 0x00, 0xe7, 0xff, 
+	0x48, 0x12, 0x6c, 0x80, 0x68, 0x00, 0x49, 0x11, 
+	0x6e, 0x49, 0x60, 0x08, 0x48, 0x0f, 0x6d, 0x40, 
+	0x68, 0x00, 0x49, 0x0e, 0x6f, 0x09, 0x60, 0x08, 
+	0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x0b, 
+	0x6e, 0xc9, 0x60, 0x08, 0x48, 0x09, 0x6c, 0xc0, 
+	0x68, 0x00, 0x23, 0x08, 0x43, 0x18, 0x49, 0x07, 
+	0x6c, 0xc9, 0x60, 0x08, 0x07, 0x00, 0x48, 0x05, 
+	0x6c, 0xc0, 0x68, 0x00, 0x49, 0x03, 0x6e, 0x89, 
+	0x60, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0xff, 0x00, 0x00, 0xff, 0x2e, 0x08, 0x1f, 0x24, 
+	0xff, 0xff, 0xef, 0xff, 0x2e, 0x08, 0x60, 0x5c, 
+	0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xfb, 0xff, 
+	0x00, 0x00, 0x02, 0x01, 0xff, 0xff, 0xbf, 0xff, 
+	0xb4, 0x80, 0x49, 0x2e, 0x20, 0x00, 0x28, 0x08, 
+	0xd3, 0x04, 0xe0, 0x06, 0x1c, 0x42, 0x06, 0x10, 
+	0x0e, 0x00, 0xe7, 0xf8, 0x23, 0x00, 0xc1, 0x08, 
+	0xe7, 0xf8, 0x4a, 0x29, 0x6f, 0xd2, 0x68, 0x12, 
+	0x4b, 0x27, 0x6d, 0x9b, 0x68, 0x1b, 0x0a, 0x1b, 
+	0x02, 0x1b, 0x06, 0x12, 0x0e, 0x12, 0x43, 0x1a, 
+	0x4b, 0x23, 0x6d, 0x9b, 0x60, 0x1a, 0x06, 0x12, 
+	0x0e, 0x12, 0x4a, 0x21, 0x6f, 0xd2, 0x68, 0x52, 
+	0x4b, 0x1f, 0x6d, 0x1b, 0x68, 0x1f, 0x23, 0x01, 
+	0x03, 0xdb, 0x43, 0x9f, 0x1c, 0x3b, 0x07, 0xd2, 
+	0x0c, 0x12, 0x43, 0x1a, 0x4b, 0x1a, 0x6d, 0x1b, 
+	0x60, 0x1a, 0x04, 0x12, 0x0f, 0xd2, 0x4a, 0x18, 
+	0x6f, 0xd2, 0x69, 0x12, 0x4b, 0x16, 0x6d, 0xdb, 
+	0x68, 0x1b, 0x0c, 0x1b, 0x04, 0x1b, 0x04, 0x12, 
+	0x0c, 0x12, 0x43, 0x1a, 0x4b, 0x12, 0x6d, 0xdb, 
+	0x60, 0x1a, 0x04, 0x12, 0x0c, 0x12, 0x4a, 0x10, 
+	0x6d, 0x12, 0x68, 0x12, 0x23, 0x01, 0x02, 0x5b, 
+	0x43, 0x1a, 0x4b, 0x0d, 0x6d, 0x1b, 0x60, 0x1a, 
+	0x05, 0x92, 0x4a, 0x0b, 0x6d, 0x12, 0x68, 0x12, 
+	0x4b, 0x09, 0x6e, 0xdb, 0x60, 0x1a, 0x4a, 0x08, 
+	0x6d, 0x92, 0x68, 0x12, 0x4b, 0x06, 0x6f, 0x5b, 
+	0x60, 0x1a, 0x4a, 0x05, 0x6d, 0xd2, 0x68, 0x12, 
+	0x4b, 0x03, 0x6f, 0x9b, 0x60, 0x1a, 0xbc, 0x80, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x4c, 
+	0x2e, 0x08, 0x1f, 0x24, 0xb5, 0x90, 0x1c, 0x07, 
+	0x1c, 0x0c, 0x2f, 0x22, 0xd1, 0x07, 0x2c, 0x3f, 
+	0xd8, 0x01, 0x2c, 0x01, 0xd2, 0x03, 0x20, 0x38, 
+	0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 
+	0x49, 0x13, 0x70, 0x08, 0x23, 0x01, 0x03, 0xdb, 
+	0x42, 0x9f, 0xd0, 0x02, 0x4b, 0x11, 0x42, 0x9f, 
+	0xd1, 0x04, 0x48, 0x11, 0x60, 0x07, 0x20, 0x00, 
+	0xe7, 0xee, 0xe0, 0x18, 0x2f, 0xff, 0xd1, 0x0b, 
+	0x21, 0x00, 0x43, 0xc9, 0x20, 0x0d, 0xf0, 0x00, 
+	0xf8, 0x1d, 0x48, 0x0c, 0x68, 0x01, 0x48, 0x0c, 
+	0x68, 0x00, 0xf0, 0x00, 0xf8, 0x43, 0xe0, 0x07, 
+	0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x3e, 
+	0x48, 0x07, 0x60, 0x07, 0x48, 0x05, 0x60, 0x04, 
+	0x20, 0x00, 0xe7, 0xd5, 0xe7, 0xd4, 0xe7, 0xd3, 
+	0x2e, 0x08, 0x60, 0x84, 0x00, 0x00, 0x80, 0x0f, 
+	0xcc, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x60, 0x80, 
+	0x2e, 0x08, 0x1f, 0xa4, 0xb4, 0xb0, 0x1c, 0x07, 
+	0x1c, 0x0a, 0x4b, 0x13, 0x68, 0x5b, 0x1c, 0x18, 
+	0x21, 0x00, 0x29, 0x02, 0xdb, 0x04, 0xe0, 0x1a, 
+	0x1c, 0x4b, 0x06, 0x19, 0x0e, 0x09, 0xe7, 0xf8, 
+	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc4, 0x29, 0x00, 
+	0xd1, 0x01, 0x60, 0x27, 0xe0, 0x05, 0x23, 0x01, 
+	0x42, 0xda, 0xd0, 0x01, 0x60, 0x22, 0xe0, 0x00, 
+	0xe0, 0x09, 0x1d, 0x05, 0x23, 0x05, 0x02, 0x1b, 
+	0x42, 0x9d, 0xdb, 0x02, 0x20, 0x01, 0x02, 0x80, 
+	0xe0, 0x00, 0x30, 0x04, 0xe7, 0xe4, 0x4b, 0x02, 
+	0x60, 0x58, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
+	0xcc, 0x00, 0x0f, 0x00, 0xb5, 0x90, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x05, 0x20, 0x0d, 0x00, 0x23, 0xff, 
+	0x33, 0x04, 0x42, 0x98, 0xd0, 0x50, 0xdc, 0x18, 
+	0x28, 0x10, 0xd0, 0x2d, 0xdc, 0x08, 0x28, 0x01, 
+	0xd0, 0x23, 0x28, 0x02, 0xd0, 0x1e, 0x28, 0x04, 
+	0xd0, 0x1f, 0x28, 0x08, 0xd0, 0x1d, 0xe0, 0x76, 
+	0x28, 0x12, 0xd0, 0x1d, 0x28, 0x22, 0xd0, 0x3a, 
+	0x23, 0xff, 0x33, 0x02, 0x42, 0x98, 0xd0, 0x24, 
+	0x23, 0xff, 0x33, 0x03, 0x42, 0x98, 0xd0, 0x29, 
+	0xe0, 0x69, 0x38, 0xff, 0x38, 0x05, 0x28, 0x08, 
+	0xd2, 0x65, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x35, 0x3c, 0x41, 0x4f, 
+	0x56, 0x4b, 0x5d, 0x46, 0x20, 0x00, 0x49, 0x32, 
+	0x63, 0x48, 0x48, 0x31, 0x62, 0x04, 0xe0, 0x5c, 
+	0x20, 0x01, 0x49, 0x2f, 0x63, 0x48, 0xe0, 0x58, 
+	0x20, 0x00, 0x49, 0x2e, 0x67, 0x08, 0x21, 0x00, 
+	0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x92, 
+	0xe0, 0x4f, 0x20, 0x01, 0x49, 0x29, 0x67, 0x08, 
+	0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 
+	0xff, 0x89, 0xe0, 0x46, 0x20, 0x02, 0x49, 0x25, 
+	0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, 
+	0xf7, 0xff, 0xff, 0x80, 0xe0, 0x3d, 0x1c, 0x39, 
+	0x20, 0x22, 0xf7, 0xff, 0xff, 0x7b, 0xe0, 0x38, 
+	0x48, 0x1e, 0x65, 0xc7, 0x21, 0x01, 0x20, 0x35, 
+	0xf7, 0xff, 0xff, 0x74, 0xe0, 0x31, 0x48, 0x1b, 
+	0x65, 0xc7, 0x21, 0x02, 0x20, 0x35, 0xf7, 0xff, 
+	0xff, 0x6d, 0xe0, 0x2a, 0x21, 0x00, 0x20, 0x35, 
+	0xf7, 0xff, 0xff, 0x68, 0xe0, 0x25, 0x21, 0x03, 
+	0x20, 0x35, 0xf7, 0xff, 0xff, 0x63, 0xe0, 0x20, 
+	0x21, 0x04, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x5e, 
+	0xe0, 0x1b, 0x20, 0x00, 0x49, 0x0f, 0x65, 0xc8, 
+	0xe0, 0x17, 0x48, 0x0e, 0x66, 0x07, 0x21, 0x01, 
+	0x20, 0x36, 0xf7, 0xff, 0xff, 0x53, 0xe0, 0x10, 
+	0x48, 0x0a, 0x66, 0x07, 0x21, 0x02, 0x20, 0x36, 
+	0xf7, 0xff, 0xff, 0x4c, 0xe0, 0x09, 0x20, 0x00, 
+	0x49, 0x06, 0x66, 0x08, 0xe0, 0x05, 0x1c, 0x20, 
+	0x21, 0x00, 0x43, 0xc9, 0xf7, 0xff, 0xff, 0x42, 
+	0xe7, 0xff, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x05, 0x00, 
+	0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, 
+	0x06, 0x38, 0x0e, 0x00, 0x06, 0x19, 0x0e, 0x09, 
+	0x29, 0x01, 0xd0, 0x08, 0x22, 0x00, 0x4d, 0x09, 
+	0x60, 0x2a, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x08, 
+	0x68, 0x2d, 0x60, 0x2a, 0xe0, 0x08, 0x4a, 0x07, 
+	0x68, 0x12, 0x60, 0x14, 0x4a, 0x04, 0x68, 0x12, 
+	0x60, 0x10, 0x22, 0x01, 0x4d, 0x01, 0x60, 0x2a, 
+	0xbc, 0xb0, 0x47, 0x70, 0xcc, 0x00, 0x0d, 0x00, 
+	0x2e, 0x08, 0x60, 0x78, 0x2e, 0x08, 0x60, 0x74, 
+	0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, 
+	0x16, 0x00, 0x90, 0x00, 0xb0, 0x85, 0x20, 0x00, 
+	0x90, 0x01, 0x9c, 0x06, 0x1d, 0xe6, 0x36, 0x05, 
+	0xcc, 0x20, 0x07, 0xa8, 0x0f, 0x80, 0x06, 0x00, 
+	0x16, 0x00, 0x90, 0x00, 0x08, 0xad, 0x3d, 0x03, 
+	0xcc, 0x80, 0x08, 0xb8, 0x00, 0x80, 0x19, 0x86, 
+	0xcc, 0x02, 0x91, 0x04, 0x99, 0x04, 0x08, 0x89, 
+	0x91, 0x04, 0x20, 0x03, 0x05, 0x80, 0x21, 0x35, 
+	0x06, 0x49, 0x60, 0x08, 0x48, 0x46, 0x68, 0x01, 
+	0x08, 0x89, 0x00, 0x89, 0x60, 0x01, 0x48, 0x45, 
+	0x90, 0x03, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 
+	0x42, 0xa8, 0xd3, 0x04, 0xe0, 0x08, 0x98, 0x02, 
+	0x30, 0x01, 0x90, 0x02, 0xe7, 0xf7, 0xcc, 0x02, 
+	0x98, 0x03, 0xc0, 0x02, 0x90, 0x03, 0xe7, 0xf6, 
+	0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0xcc, 0x02, 
+	0x98, 0x03, 0xc0, 0x02, 0x90, 0x03, 0x20, 0x00, 
+	0x49, 0x39, 0x65, 0x88, 0x9f, 0x04, 0x2f, 0x00, 
+	0xd8, 0x02, 0xe0, 0x05, 0x3f, 0x01, 0xe7, 0xfa, 
+	0xce, 0x02, 0x48, 0x35, 0x64, 0x81, 0xe7, 0xf9, 
+	0x20, 0x00, 0x49, 0x34, 0x60, 0x48, 0x20, 0x00, 
+	0x21, 0x35, 0x06, 0x49, 0x60, 0x08, 0x20, 0x00, 
+	0x49, 0x2f, 0x66, 0x88, 0x20, 0x00, 0x21, 0x35, 
+	0x06, 0x49, 0x61, 0x88, 0x20, 0x01, 0x49, 0x2c, 
+	0x64, 0xc8, 0x48, 0x2c, 0x68, 0x40, 0x28, 0x00, 
+	0xd1, 0x0e, 0x27, 0x00, 0x2f, 0x64, 0xd3, 0x02, 
+	0xe0, 0x02, 0x37, 0x01, 0xe7, 0xfa, 0xe7, 0xfc, 
+	0x98, 0x01, 0x1c, 0x41, 0x91, 0x01, 0x4b, 0x26, 
+	0x42, 0x98, 0xdb, 0x00, 0xe0, 0x00, 0xe7, 0xec, 
+	0x48, 0x24, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 
+	0x60, 0x01, 0x48, 0x23, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x03, 0x48, 0x21, 0x68, 0x40, 0x28, 0x00, 
+	0xd1, 0x0b, 0x48, 0x20, 0x68, 0x40, 0x4b, 0x19, 
+	0x18, 0xc0, 0x49, 0x1d, 0x60, 0x08, 0x48, 0x1d, 
+	0x68, 0x80, 0x4b, 0x16, 0x18, 0xc0, 0x49, 0x1a, 
+	0x60, 0x48, 0x48, 0x19, 0x68, 0x00, 0x21, 0x33, 
+	0x06, 0x49, 0x65, 0x48, 0x48, 0x16, 0x68, 0x40, 
+	0x21, 0x33, 0x06, 0x49, 0x65, 0x88, 0x48, 0x14, 
+	0x68, 0x40, 0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 
+	0x48, 0x11, 0x68, 0x00, 0x21, 0x33, 0x06, 0x49, 
+	0x66, 0x48, 0x20, 0x03, 0x21, 0x33, 0x06, 0x49, 
+	0x67, 0x08, 0x20, 0x00, 0x49, 0x0e, 0x68, 0x09, 
+	0x70, 0x08, 0x21, 0x00, 0x20, 0x0d, 0xf7, 0xff, 
+	0xfe, 0x2d, 0xb0, 0x05, 0xb0, 0x01, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x66, 0x00, 0x00, 0x70, 0xcc, 0x00, 0x00, 0x00, 
+	0x6a, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0f, 0x00, 
+	0x00, 0x00, 0x27, 0x10, 0x6a, 0x00, 0x00, 0x10, 
+	0x2e, 0x08, 0x7c, 0x24, 0xcc, 0x00, 0x0f, 0x80, 
+	0x2e, 0x08, 0x94, 0xac, 0x1c, 0x01, 0xb0, 0x81, 
+	0x48, 0x27, 0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 
+	0x2a, 0x16, 0xdb, 0x04, 0xe0, 0x09, 0x9a, 0x00, 
+	0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02, 
+	0x9b, 0x00, 0x00, 0x9b, 0x50, 0xca, 0x30, 0x04, 
+	0xe7, 0xf5, 0x48, 0x20, 0x22, 0x00, 0x92, 0x00, 
+	0x9a, 0x00, 0x2a, 0x0b, 0xdb, 0x04, 0xe0, 0x0a, 
+	0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 
+	0x68, 0x03, 0x9a, 0x00, 0x00, 0x92, 0x18, 0x52, 
+	0x65, 0x93, 0x30, 0x04, 0xe7, 0xf4, 0x48, 0x18, 
+	0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x11, 
+	0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, 0x32, 0x01, 
+	0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, 
+	0x00, 0x92, 0x18, 0x52, 0x32, 0x80, 0x60, 0x53, 
+	0x30, 0x04, 0xe7, 0xf3, 0x48, 0x0f, 0x22, 0x02, 
+	0x92, 0x00, 0x9a, 0x00, 0x2a, 0x05, 0xdb, 0x04, 
+	0xe0, 0x0b, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 
+	0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b, 
+	0x18, 0x5b, 0x33, 0x80, 0x60, 0x5a, 0x30, 0x04, 
+	0xe7, 0xf3, 0x4a, 0x07, 0x6c, 0x12, 0x1d, 0xcb, 
+	0x33, 0x79, 0x61, 0xda, 0xb0, 0x01, 0x47, 0x70, 
+	0xcc, 0x00, 0x05, 0x20, 0xcc, 0x00, 0x0c, 0x00, 
+	0xcc, 0x00, 0x0c, 0x5c, 0xcc, 0x00, 0x0c, 0xa0, 
+	0xcc, 0x00, 0x0c, 0x80, 0xb4, 0xf0, 0x1c, 0x06, 
+	0x1c, 0x0f, 0x1c, 0x14, 0x1c, 0x1d, 0x06, 0x29, 
+	0x0e, 0x09, 0x2c, 0x1f, 0xdb, 0x02, 0x20, 0xaf, 
+	0xbc, 0xf0, 0x47, 0x70, 0x4b, 0x0b, 0x40, 0x1f, 
+	0x48, 0x0b, 0x68, 0x00, 0x60, 0x06, 0x29, 0x01, 
+	0xd1, 0x07, 0x48, 0x0a, 0x68, 0x02, 0x43, 0x3a, 
+	0x60, 0x02, 0x20, 0x80, 0x6e, 0x00, 0x60, 0x04, 
+	0xe0, 0x05, 0x29, 0x02, 0xd1, 0x03, 0x48, 0x05, 
+	0x68, 0x02, 0x43, 0xba, 0x60, 0x02, 0x20, 0x00, 
+	0xe7, 0xe6, 0xe7, 0xe5, 0xff, 0xff, 0xf8, 0xff, 
+	0x2e, 0x08, 0x60, 0x7c, 0xcc, 0x00, 0x02, 0x20, 
+	0xb5, 0xf3, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 
+	0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0e, 
+	0x0e, 0x36, 0x48, 0x1a, 0x6f, 0x00, 0x23, 0x02, 
+	0x40, 0x18, 0xd0, 0x0d, 0x20, 0x33, 0x06, 0x40, 
+	0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49, 
+	0x1a, 0x41, 0x48, 0x14, 0x6d, 0xc0, 0x4a, 0x13, 
+	0x6d, 0x92, 0x1a, 0x80, 0x18, 0x0d, 0xe0, 0x06, 
+	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, 0xc4, 
+	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, 
+	0xb4, 0xb0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
+	0x48, 0x14, 0x6c, 0x00, 0x1c, 0x01, 0x48, 0x13, 
+	0x6f, 0x80, 0x23, 0x09, 0x01, 0x9b, 0x42, 0x98, 
+	0xd1, 0x12, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x0c, 
+	0x2d, 0x02, 0xd1, 0x0a, 0x2f, 0x03, 0xd1, 0x00, 
+	0x31, 0x04, 0x2f, 0x03, 0xd2, 0x05, 0x07, 0xe0, 
+	0x0f, 0xc0, 0xd0, 0x01, 0x31, 0x05, 0xe0, 0x00, 
+	0x31, 0x08, 0x2d, 0x02, 0xd9, 0x00, 0x21, 0x12, 
+	0x00, 0x48, 0x18, 0x40, 0x30, 0x01, 0x10, 0x40, 
+	0x21, 0x2d, 0x02, 0x09, 0x43, 0x41, 0x48, 0x03, 
+	0x69, 0x40, 0x18, 0x09, 0x1c, 0x08, 0xbc, 0xb0, 
+	0x47, 0x70, 0xe7, 0xfc, 0xcc, 0x00, 0x0f, 0x80, 
+	0x48, 0x07, 0x6a, 0xc0, 0x1c, 0x01, 0x00, 0x48, 
+	0x18, 0x40, 0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, 
+	0x02, 0x09, 0x43, 0x41, 0x48, 0x03, 0x69, 0x40, 
+	0x18, 0x09, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
+	0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x80, 
+	0x48, 0x07, 0x68, 0x80, 0x28, 0x00, 0xd1, 0x03, 
+	0x48, 0x06, 0x69, 0x00, 0x1c, 0x01, 0xe0, 0x02, 
+	0x48, 0x04, 0x68, 0xc0, 0x1c, 0x01, 0x4b, 0x02, 
+	0x18, 0xc9, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
+	0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x80, 
+	0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x48, 0x06, 
+	0x6c, 0x40, 0x60, 0x20, 0x48, 0x04, 0x6c, 0x80, 
+	0x60, 0x38, 0xf7, 0xff, 0xff, 0xe1, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb, 0x00, 0x00, 
+	0xcc, 0x00, 0x02, 0x00, 0xb5, 0xf0, 0x1c, 0x05, 
+	0x1c, 0x0c, 0x1c, 0x17, 0xf7, 0xff, 0xff, 0xd4, 
+	0x1c, 0x06, 0x2d, 0x00, 0xd0, 0x01, 0x2c, 0x00, 
+	0xd1, 0x03, 0x20, 0x3a, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x08, 0x78, 0x00, 0x40, 0xd0, 0x01, 
+	0x20, 0x3a, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x0d, 
+	0x66, 0x88, 0x48, 0x0d, 0x68, 0x01, 0x23, 0x12, 
+	0x43, 0x19, 0x60, 0x01, 0x48, 0x0b, 0x63, 0x45, 
+	0x48, 0x0a, 0x63, 0x84, 0x20, 0x01, 0x49, 0x09, 
+	0x62, 0x48, 0x48, 0x09, 0x68, 0x01, 0x23, 0x01, 
+	0x40, 0x59, 0x60, 0x01, 0x48, 0x05, 0x63, 0xc7, 
+	0x48, 0x02, 0x60, 0x46, 0x20, 0x00, 0xe7, 0xdd, 
+	0xe7, 0xdc, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 
+	0xcc, 0x00, 0x0f, 0x48, 0xcc, 0x00, 0x00, 0x80, 
+	0xcc, 0x00, 0x00, 0x08, 0xb4, 0xf0, 0x1c, 0x07, 
+	0x1c, 0x0c, 0x1c, 0x16, 0x1c, 0x1d, 0x48, 0x10, 
+	0x6a, 0x00, 0x28, 0x10, 0xd0, 0x02, 0x20, 0x3b, 
+	0xbc, 0xf0, 0x47, 0x70, 0x48, 0x0d, 0x68, 0x00, 
+	0x60, 0x38, 0x68, 0x38, 0x4b, 0x0b, 0x18, 0xc0, 
+	0x60, 0x38, 0x48, 0x0b, 0x6b, 0x40, 0x60, 0x30, 
+	0x48, 0x09, 0x6b, 0x80, 0x60, 0x28, 0x48, 0x09, 
+	0x6c, 0x80, 0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, 
+	0x20, 0x02, 0x60, 0x20, 0xe0, 0x01, 0x20, 0x01, 
+	0x60, 0x20, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3, 
+	0xcc, 0x00, 0x05, 0x00, 0xcc, 0x00, 0x00, 0x00, 
+	0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0f, 0x00, 
+	0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
+	0x06, 0x2a, 0x0e, 0x12, 0x06, 0x21, 0x0e, 0x09, 
+	0x2f, 0x00, 0xd1, 0x30, 0xb0, 0x81, 0x46, 0x6f, 
+	0x2a, 0x00, 0xd0, 0x06, 0x2a, 0x08, 0xd0, 0x0d, 
+	0x2a, 0x10, 0xd0, 0x14, 0x2a, 0x18, 0xd0, 0x1b, 
+	0xe0, 0x23, 0x20, 0x00, 0x70, 0x38, 0x20, 0x00, 
+	0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00, 
+	0x70, 0xf8, 0xe0, 0x1b, 0x20, 0x00, 0x70, 0x38, 
+	0x20, 0x08, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, 
+	0x20, 0x00, 0x70, 0xf8, 0xe0, 0x12, 0x20, 0x00, 
+	0x70, 0x38, 0x20, 0x10, 0x70, 0x78, 0x20, 0x0c, 
+	0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x09, 
+	0x20, 0x00, 0x70, 0x38, 0x20, 0x18, 0x70, 0x78, 
+	0x20, 0x1c, 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 
+	0xe0, 0x00, 0xe7, 0xff, 0xb0, 0x01, 0x23, 0x00, 
+	0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x18, 
+	0x23, 0x01, 0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 
+	0x61, 0xd8, 0x29, 0x00, 0xd1, 0x06, 0x48, 0x0e, 
+	0x68, 0x06, 0x23, 0x20, 0x43, 0x9e, 0x1c, 0x33, 
+	0x60, 0x03, 0xe0, 0x06, 0x29, 0x20, 0xd1, 0x04, 
+	0x48, 0x09, 0x68, 0x06, 0x23, 0x20, 0x43, 0x33, 
+	0x60, 0x03, 0x23, 0x02, 0x56, 0xf8, 0x23, 0x39, 
+	0x06, 0x5b, 0x60, 0x58, 0x23, 0x03, 0x56, 0xf8, 
+	0x4b, 0x04, 0x63, 0x18, 0x20, 0x00, 0x23, 0x39, 
+	0x06, 0x5b, 0x64, 0x98, 0xbc, 0xf0, 0x47, 0x70, 
+	0x72, 0x00, 0x00, 0x1c, 0x72, 0x00, 0x01, 0x00, 
+	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, 
+	0x06, 0x29, 0x0e, 0x09, 0x06, 0x22, 0x0e, 0x12, 
+	0xb0, 0x84, 0x29, 0x33, 0xdc, 0x01, 0x2a, 0x0f, 
+	0xdd, 0x03, 0x20, 0xff, 0xb0, 0x04, 0xbc, 0xb0, 
+	0x47, 0x70, 0x20, 0x39, 0x06, 0x40, 0x63, 0x41, 
+	0x20, 0x10, 0x43, 0x10, 0x23, 0x39, 0x06, 0x5b, 
+	0x63, 0x98, 0x20, 0x39, 0x06, 0x40, 0x68, 0x00, 
+	0x90, 0x03, 0x98, 0x03, 0x23, 0x9c, 0x43, 0xdb, 
+	0x40, 0x18, 0x90, 0x03, 0x20, 0x39, 0x06, 0x40, 
+	0x68, 0x40, 0x90, 0x01, 0x98, 0x01, 0x23, 0x20, 
+	0x43, 0xdb, 0x40, 0x18, 0x90, 0x01, 0x06, 0x38, 
+	0x0e, 0x00, 0xd0, 0x29, 0x20, 0x10, 0x40, 0x38, 
+	0xd0, 0x03, 0x98, 0x03, 0x23, 0x80, 0x43, 0x18, 
+	0x90, 0x03, 0x20, 0x08, 0x40, 0x38, 0xd0, 0x03, 
+	0x98, 0x03, 0x23, 0x10, 0x43, 0x18, 0x90, 0x03, 
+	0x20, 0x04, 0x40, 0x38, 0xd0, 0x04, 0x98, 0x03, 
+	0x23, 0x08, 0x43, 0x18, 0x90, 0x03, 0xe0, 0x0c, 
+	0x20, 0x02, 0x40, 0x38, 0xd0, 0x04, 0x98, 0x03, 
+	0x23, 0x0c, 0x43, 0x18, 0x90, 0x03, 0xe0, 0x04, 
+	0x98, 0x03, 0x23, 0x0c, 0x43, 0xdb, 0x40, 0x18, 
+	0x90, 0x03, 0x20, 0x20, 0x40, 0x38, 0xd0, 0x03, 
+	0x98, 0x01, 0x23, 0x20, 0x43, 0x18, 0x90, 0x01, 
+	0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x18, 
+	0x98, 0x01, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58, 
+	0x20, 0x39, 0x06, 0x40, 0x6a, 0x00, 0x90, 0x00, 
+	0x98, 0x00, 0x23, 0xf0, 0x43, 0xdb, 0x43, 0x18, 
+	0x90, 0x00, 0x20, 0xff, 0x02, 0x00, 0x40, 0x38, 
+	0xd0, 0x27, 0x20, 0xff, 0x30, 0x01, 0x40, 0x38, 
+	0xd0, 0x03, 0x98, 0x00, 0x23, 0xfe, 0x40, 0x18, 
+	0x90, 0x00, 0x20, 0x01, 0x02, 0x40, 0x40, 0x38, 
+	0xd0, 0x03, 0x98, 0x00, 0x23, 0xfd, 0x40, 0x18, 
+	0x90, 0x00, 0x20, 0x01, 0x02, 0x80, 0x40, 0x38, 
+	0xd0, 0x03, 0x98, 0x00, 0x23, 0xfb, 0x40, 0x18, 
+	0x90, 0x00, 0x20, 0x01, 0x02, 0xc0, 0x40, 0x38, 
+	0xd0, 0x03, 0x98, 0x00, 0x23, 0xf7, 0x40, 0x18, 
+	0x90, 0x00, 0x20, 0x01, 0x03, 0x00, 0x40, 0x38, 
+	0xd0, 0x03, 0x98, 0x00, 0x23, 0xf0, 0x40, 0x18, 
+	0x90, 0x00, 0x98, 0x00, 0x23, 0x39, 0x06, 0x5b, 
+	0x62, 0x18, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 
+	0x90, 0x02, 0x98, 0x02, 0x08, 0x40, 0x00, 0x40, 
+	0x90, 0x02, 0x20, 0x39, 0x06, 0x40, 0x6a, 0xc0, 
+	0x90, 0x00, 0x98, 0x00, 0x23, 0x1c, 0x43, 0xdb, 
+	0x40, 0x18, 0x90, 0x00, 0x20, 0x39, 0x06, 0x40, 
+	0x6b, 0x80, 0x90, 0x03, 0x98, 0x03, 0x23, 0x10, 
+	0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x39, 
+	0x06, 0x40, 0x6b, 0xc0, 0x90, 0x01, 0x98, 0x01, 
+	0x09, 0x00, 0x01, 0x00, 0x90, 0x01, 0x48, 0x4a, 
+	0x40, 0x38, 0xd0, 0x45, 0x20, 0x01, 0x04, 0x00, 
+	0x40, 0x38, 0xd0, 0x03, 0x98, 0x02, 0x23, 0x01, 
+	0x43, 0x18, 0x90, 0x02, 0x20, 0x01, 0x05, 0xc0, 
+	0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 0x23, 0x10, 
+	0x43, 0x18, 0x90, 0x00, 0x20, 0x07, 0x04, 0x40, 
+	0x40, 0x38, 0x23, 0x01, 0x04, 0x5b, 0x42, 0x98, 
+	0xd0, 0x08, 0x23, 0x01, 0x04, 0x9b, 0x42, 0x98, 
+	0xd0, 0x07, 0x23, 0x01, 0x04, 0xdb, 0x42, 0x98, 
+	0xd0, 0x08, 0xe0, 0x0c, 0x98, 0x00, 0x90, 0x00, 
+	0xe0, 0x0a, 0x98, 0x00, 0x23, 0x04, 0x43, 0x18, 
+	0x90, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x23, 0x0c, 
+	0x43, 0x18, 0x90, 0x00, 0xe0, 0x00, 0xe7, 0xff, 
+	0x20, 0x01, 0x05, 0x80, 0x40, 0x38, 0xd0, 0x03, 
+	0x98, 0x03, 0x23, 0x10, 0x43, 0x18, 0x90, 0x03, 
+	0x20, 0x01, 0x05, 0x00, 0x40, 0x38, 0xd0, 0x03, 
+	0x98, 0x01, 0x23, 0x08, 0x43, 0x18, 0x90, 0x01, 
+	0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x03, 
+	0x98, 0x01, 0x23, 0x07, 0x43, 0x18, 0x90, 0x01, 
+	0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, 
+	0x98, 0x02, 0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, 
+	0x98, 0x01, 0x23, 0x39, 0x06, 0x5b, 0x63, 0xd8, 
+	0x98, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x62, 0xd8, 
+	0x20, 0x39, 0x06, 0x40, 0x68, 0x80, 0x90, 0x03, 
+	0x98, 0x03, 0x08, 0x80, 0x00, 0x80, 0x90, 0x03, 
+	0x0f, 0x38, 0x07, 0x00, 0xd0, 0x26, 0x20, 0x01, 
+	0x07, 0x00, 0x40, 0x38, 0x23, 0x01, 0x07, 0x1b, 
+	0x42, 0x98, 0xd1, 0x04, 0x98, 0x03, 0x23, 0x02, 
+	0x43, 0x18, 0x90, 0x03, 0xe0, 0x07, 0x20, 0x00, 
+	0x42, 0x80, 0xd1, 0x04, 0x98, 0x03, 0x23, 0x02, 
+	0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x01, 
+	0x07, 0x40, 0x40, 0x38, 0x23, 0x01, 0x07, 0x5b, 
+	0x42, 0x98, 0xd1, 0x04, 0x98, 0x03, 0x23, 0x01, 
+	0x43, 0x18, 0x90, 0x03, 0xe0, 0x06, 0x20, 0x00, 
+	0x42, 0x80, 0xd1, 0x03, 0x98, 0x03, 0x08, 0x40, 
+	0x00, 0x40, 0x90, 0x03, 0x98, 0x03, 0x23, 0x39, 
+	0x06, 0x5b, 0x60, 0x98, 0x20, 0x00, 0xb0, 0x04, 
+	0xe6, 0xc1, 0xb0, 0x04, 0xe6, 0xbf, 0x00, 0x00, 
+	0x0f, 0xff, 0x00, 0x00, 0x48, 0x02, 0x69, 0xc0, 
+	0x06, 0x00, 0x16, 0x00, 0x47, 0x70, 0xe7, 0xfd, 
+	0x72, 0x00, 0x01, 0x00, 0xb5, 0xf7, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x06, 0x23, 0x16, 0x18, 0x06, 0x3b, 
+	0x16, 0x19, 0x9b, 0x02, 0x06, 0x1a, 0x0e, 0x12, 
+	0x2a, 0x00, 0xd1, 0x0b, 0x23, 0x39, 0x06, 0x5b, 
+	0x60, 0xd8, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x19, 
+	0x4d, 0x0b, 0x68, 0x2e, 0x23, 0x01, 0x43, 0x33, 
+	0x60, 0x2b, 0xe0, 0x0c, 0x2a, 0x01, 0xd1, 0x0a, 
+	0x23, 0x39, 0x06, 0x5b, 0x61, 0x58, 0x23, 0x39, 
+	0x06, 0x5b, 0x61, 0x99, 0x4d, 0x04, 0x68, 0x2e, 
+	0x23, 0x02, 0x43, 0x33, 0x60, 0x2b, 0xb0, 0x03, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x72, 0x00, 0x00, 0x08, 0xb4, 0x90, 0x1c, 0x01, 
+	0x20, 0x92, 0x4b, 0x4b, 0x60, 0x18, 0x20, 0x92, 
+	0x4b, 0x4a, 0x60, 0x18, 0x20, 0x10, 0x4b, 0x4a, 
+	0x60, 0x18, 0x20, 0x00, 0x4b, 0x48, 0x60, 0x58, 
+	0x48, 0x48, 0x4b, 0x47, 0x60, 0x98, 0x22, 0x00, 
+	0x2a, 0x10, 0xdb, 0x02, 0xe0, 0x07, 0x32, 0x01, 
+	0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93, 
+	0x4c, 0x42, 0x50, 0xe0, 0xe7, 0xf7, 0x20, 0x00, 
+	0x43, 0xc0, 0x00, 0x93, 0x4c, 0x3f, 0x50, 0xe0, 
+	0x22, 0x00, 0x2a, 0x08, 0xdb, 0x02, 0xe0, 0x08, 
+	0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 
+	0x00, 0x94, 0x4b, 0x3b, 0x18, 0xe3, 0x64, 0x18, 
+	0xe7, 0xf6, 0x22, 0x00, 0x2a, 0x20, 0xdb, 0x02, 
+	0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 
+	0x43, 0xc0, 0x00, 0x94, 0x4b, 0x35, 0x18, 0xe3, 
+	0x60, 0x18, 0xe7, 0xf6, 0x22, 0x00, 0x2a, 0x19, 
+	0xdb, 0x02, 0xe0, 0x06, 0x32, 0x01, 0xe7, 0xfa, 
+	0x20, 0x00, 0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, 
+	0xe7, 0xf8, 0x20, 0x00, 0x4b, 0x2f, 0x60, 0x18, 
+	0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 0x27, 0x18, 
+	0x40, 0x07, 0x2f, 0x00, 0xd0, 0x03, 0x48, 0x2c, 
+	0x4b, 0x2c, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff, 
+	0x30, 0xe0, 0x4b, 0x2a, 0x60, 0x18, 0x20, 0x00, 
+	0x4b, 0x29, 0x60, 0x18, 0x20, 0x00, 0x4b, 0x28, 
+	0x60, 0x58, 0x48, 0x28, 0x4b, 0x26, 0x60, 0x98, 
+	0x48, 0x24, 0x68, 0x00, 0x4b, 0x24, 0x60, 0xd8, 
+	0x48, 0x25, 0x60, 0x01, 0x20, 0x0d, 0x06, 0xc0, 
+	0x61, 0xc1, 0x20, 0x05, 0x02, 0x00, 0x23, 0x0d, 
+	0x06, 0xdb, 0x60, 0x18, 0x48, 0x21, 0x23, 0x0d, 
+	0x06, 0xdb, 0x60, 0x58, 0x48, 0x1f, 0x4b, 0x16, 
+	0x63, 0x98, 0x20, 0x00, 0x23, 0x0d, 0x06, 0xdb, 
+	0x60, 0x98, 0x20, 0x00, 0x23, 0x0d, 0x06, 0xdb, 
+	0x61, 0x18, 0x48, 0x1b, 0x23, 0x0d, 0x06, 0xdb, 
+	0x61, 0x98, 0x20, 0x01, 0x23, 0x0d, 0x06, 0xdb, 
+	0x60, 0xd8, 0x48, 0x18, 0x23, 0x0d, 0x06, 0xdb, 
+	0x63, 0x18, 0x48, 0x17, 0x23, 0x0d, 0x06, 0xdb, 
+	0x63, 0x58, 0x20, 0x00, 0x4b, 0x15, 0x60, 0x18, 
+	0x48, 0x11, 0x4b, 0x15, 0x60, 0x18, 0x20, 0x00, 
+	0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0xcc, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7d, 0x9c, 0x2e, 0x08, 0x7c, 0xd4, 
+	0x68, 0x00, 0x0d, 0x00, 0x68, 0x00, 0x04, 0x00, 
+	0x2e, 0x08, 0x7c, 0x60, 0x2e, 0x08, 0x7c, 0xc4, 
+	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x88, 
+	0x2e, 0x08, 0x7d, 0xa8, 0x00, 0x00, 0x02, 0xcf, 
+	0x2e, 0x08, 0x60, 0x8c, 0x00, 0xf0, 0x29, 0x6d, 
+	0x3f, 0xff, 0xff, 0xff, 0x00, 0x80, 0x10, 0x80, 
+	0x00, 0x80, 0xeb, 0x80, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x5e, 0x54, 0xb5, 0xff, 0xb0, 0x85, 
+	0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, 
+	0x40, 0x18, 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 
+	0xd0, 0x03, 0x48, 0x5a, 0x4b, 0x5a, 0x60, 0x18, 
+	0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x58, 
+	0x60, 0x18, 0x9c, 0x06, 0x9f, 0x07, 0x22, 0x00, 
+	0x21, 0x00, 0x98, 0x05, 0x38, 0x0c, 0x28, 0x06, 
+	0xd2, 0x0c, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x04, 0x03, 0x06, 0x04, 
+	0x03, 0x06, 0x32, 0x01, 0x32, 0x01, 0xe0, 0x02, 
+	0x3a, 0x01, 0xe0, 0x00, 0xe7, 0xff, 0x98, 0x05, 
+	0x38, 0x0b, 0x28, 0x08, 0xd2, 0x15, 0xa3, 0x02, 
+	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, 0x88, 0xcc, 0x00, 0x02, 0x00, 
+	0xcc, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0xcf, 
+	0x00, 0x00, 0x02, 0xce, 0xb5, 0xf0, 0x1c, 0x07, 
+	0x1c, 0x0c, 0xb0, 0x81, 0x2c, 0x0b, 0xdb, 0x19, 
+	0x2c, 0x12, 0xdc, 0x17, 0x68, 0xbe, 0x68, 0xf9, 
+	0x91, 0x00, 0x68, 0x7a, 0x1c, 0x3b, 0x68, 0x39, 
+	0x1c, 0x20, 0xf7, 0xff, 0xff, 0x23, 0x1c, 0x05, 
+	0x68, 0xb8, 0x42, 0xb0, 0xd0, 0x00, 0x25, 0x80, 
+	0x68, 0xf8, 0x99, 0x00, 0x42, 0x88, 0xd0, 0x00, 
+	0x25, 0x80, 0x1c, 0x28, 0xb0, 0x01, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x25, 0x00, 0x68, 0x38, 
+	0x28, 0x00, 0xda, 0x02, 0x25, 0x80, 0x20, 0x00, 
+	0x60, 0x38, 0x68, 0x78, 0x28, 0x00, 0xda, 0x02, 
+	0x25, 0x80, 0x20, 0x00, 0x60, 0x78, 0x68, 0x38, 
+	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x25, 0x80, 
+	0x68, 0x38, 0x08, 0x40, 0x00, 0x40, 0x60, 0x38, 
+	0x68, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x09, 
+	0x25, 0x80, 0x68, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, 
+	0xd0, 0x01, 0x68, 0xb8, 0xe0, 0x01, 0x68, 0xb8, 
+	0x38, 0x01, 0x60, 0xb8, 0x68, 0xb8, 0x68, 0x39, 
+	0x42, 0x88, 0xdc, 0x03, 0x25, 0x80, 0x68, 0x38, 
+	0x30, 0x01, 0x60, 0xb8, 0x68, 0x78, 0x68, 0xf9, 
+	0x42, 0x88, 0xdb, 0x03, 0x25, 0x80, 0x68, 0x78, 
+	0x30, 0x01, 0x60, 0xf8, 0x1c, 0x28, 0xb0, 0x01, 
+	0xe7, 0xc5, 0xb0, 0x01, 0xe7, 0xc3, 0x1c, 0x02, 
+	0x21, 0x18, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08, 
+	0x47, 0x70, 0xe7, 0xfd, 0xb4, 0xf0, 0x1c, 0x07, 
+	0x1c, 0x0a, 0xb0, 0x81, 0x68, 0xb8, 0x68, 0x3b, 
+	0x1a, 0xc0, 0x1c, 0x46, 0x68, 0xf8, 0x68, 0x7b, 
+	0x1a, 0xc0, 0x30, 0x01, 0x90, 0x00, 0x00, 0x90, 
+	0x4b, 0x15, 0x58, 0x1c, 0x98, 0x00, 0x43, 0x46, 
+	0x1c, 0x35, 0x07, 0xa0, 0x0f, 0x80, 0x1c, 0x29, 
+	0x40, 0x81, 0x2a, 0x0b, 0xdb, 0x01, 0x2a, 0x12, 
+	0xdd, 0x01, 0x2a, 0x13, 0xd1, 0x01, 0x21, 0x00, 
+	0xe0, 0x0a, 0x2a, 0x09, 0xd0, 0x01, 0x2a, 0x0a, 
+	0xd1, 0x03, 0x00, 0x69, 0x19, 0x49, 0x00, 0xc9, 
+	0xe0, 0x02, 0x2a, 0x08, 0xd1, 0x00, 0x01, 0x29, 
+	0x20, 0x04, 0x40, 0x20, 0xd0, 0x00, 0x08, 0x49, 
+	0x09, 0x4c, 0x06, 0xc8, 0x0e, 0xc0, 0xd0, 0x00, 
+	0x34, 0x01, 0x1c, 0x20, 0xb0, 0x01, 0xbc, 0xf0, 
+	0x47, 0x70, 0xb0, 0x01, 0xe7, 0xfb, 0x00, 0x00, 
+	0x2e, 0x03, 0x32, 0xa4, 0xb4, 0x80, 0x23, 0x00, 
+	0x22, 0x01, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x02, 
+	0xe0, 0x09, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88, 
+	0x4f, 0x05, 0x58, 0x38, 0x28, 0x00, 0xd0, 0x00, 
+	0x43, 0x13, 0x00, 0x52, 0xe7, 0xf5, 0x1c, 0x18, 
+	0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0x60, 0xb5, 0xf3, 0x1c, 0x0f, 
+	0xb0, 0x81, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 
+	0x23, 0x18, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, 
+	0x28, 0x00, 0xd0, 0x03, 0x48, 0x32, 0x49, 0x33, 
+	0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 
+	0x49, 0x30, 0x60, 0x08, 0x24, 0x00, 0x99, 0x01, 
+	0x48, 0x2f, 0xf7, 0xfc, 0xfa, 0x1f, 0x48, 0x2e, 
+	0x68, 0x00, 0x28, 0x00, 0xda, 0x03, 0x20, 0x00, 
+	0x49, 0x2b, 0x60, 0x08, 0x24, 0x80, 0x48, 0x2a, 
+	0x68, 0x40, 0x28, 0x00, 0xda, 0x03, 0x20, 0x00, 
+	0x49, 0x27, 0x60, 0x48, 0x24, 0x80, 0x48, 0x26, 
+	0x68, 0x80, 0x4b, 0x26, 0x42, 0x98, 0xdd, 0x03, 
+	0x48, 0x24, 0x49, 0x23, 0x60, 0x88, 0x24, 0x80, 
+	0x48, 0x21, 0x68, 0xc0, 0x49, 0x1f, 0x68, 0x09, 
+	0x42, 0x88, 0xd9, 0x04, 0x48, 0x1d, 0x68, 0x00, 
+	0x49, 0x1d, 0x60, 0xc8, 0x24, 0x80, 0x48, 0x1e, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x2f, 0x01, 
+	0xd1, 0x25, 0x48, 0x19, 0x68, 0x06, 0x48, 0x18, 
+	0x68, 0x45, 0x23, 0xff, 0x33, 0x68, 0x42, 0x9e, 
+	0xdd, 0x01, 0x26, 0xff, 0x36, 0x68, 0x48, 0x13, 
+	0x68, 0x00, 0x08, 0x40, 0x42, 0xa8, 0xd2, 0x02, 
+	0x48, 0x10, 0x68, 0x00, 0x08, 0x45, 0x48, 0x13, 
+	0x49, 0x13, 0x65, 0x48, 0x48, 0x13, 0x43, 0x70, 
+	0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 
+	0x49, 0x0f, 0x65, 0x88, 0x20, 0x00, 0x49, 0x0e, 
+	0x65, 0xc8, 0x48, 0x0d, 0x66, 0x05, 0x1c, 0x38, 
+	0x21, 0x00, 0xf7, 0xfe, 0xff, 0x13, 0x1c, 0x20, 
+	0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, 
+	0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x88, 
+	0x2e, 0x08, 0x7d, 0xa8, 0x00, 0x00, 0x02, 0xcf, 
+	0x2e, 0x08, 0x7c, 0xc4, 0x00, 0x00, 0x07, 0xfa, 
+	0xcc, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x60, 0xb6, 
+	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0xb0, 0x81, 
+	0x1c, 0x26, 0x69, 0x30, 0x90, 0x00, 0x98, 0x00, 
+	0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x01, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf5, 
+	0x68, 0x38, 0x08, 0x40, 0x00, 0x40, 0x60, 0x38, 
+	0x68, 0x78, 0x08, 0x40, 0x00, 0x40, 0x60, 0x78, 
+	0x68, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x02, 
+	0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8, 0x68, 0xf8, 
+	0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xf8, 
+	0x38, 0x01, 0x60, 0xf8, 0x1d, 0xf0, 0x30, 0x49, 
+	0x1c, 0x39, 0xf7, 0xfc, 0xf9, 0x8b, 0x48, 0x1c, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 
+	0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 
+	0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 
+	0x20, 0x00, 0xb0, 0x01, 0xe7, 0xcc, 0x49, 0x13, 
+	0x20, 0x91, 0xf0, 0x13, 0xfa, 0xeb, 0x28, 0x92, 
+	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x05, 0xfa, 0xf4, 
+	0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x0e, 0x58, 0x08, 
+	0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x0b, 
+	0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xb7, 
+	0x48, 0x0a, 0x68, 0x00, 0x42, 0xa0, 0xd1, 0x03, 
+	0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x10, 
+	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 
+	0xb0, 0x01, 0xe7, 0xa9, 0xb0, 0x01, 0xe7, 0xa7, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, 
+	0x2e, 0x08, 0x7c, 0x60, 0x2e, 0x08, 0x7c, 0xc4, 
+	0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x9b, 0x20, 0x39, 
+	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, 0x88, 0x2e, 0x08, 0x7c, 0xc4, 
+	0xcc, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x7d, 0xa8, 
+	0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x00, 0x80, 
+	0xcc, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xfe, 
+	0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce, 
+	0xcc, 0x00, 0x00, 0x00, 0x90, 0x0f, 0x98, 0x0f, 
+	0x49, 0x0d, 0x66, 0x08, 0x1c, 0x30, 0x21, 0x01, 
+	0x07, 0x49, 0xf0, 0x06, 0xfa, 0x2b, 0x99, 0x00, 
+	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, 0xf4, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x72, 0x98, 0x2e, 0x08, 0x72, 0xa4, 
+	0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0x60, 0x98, 
+	0x2e, 0x08, 0x69, 0x98, 0x9e, 0x00, 0x04, 0xa0, 
+	0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xe8, 
+	0x2e, 0x08, 0x5e, 0xec, 0x2e, 0x08, 0x5f, 0xac, 
+	0x64, 0x00, 0x08, 0x00, 0x64, 0x00, 0x10, 0x00, 
+	0x2e, 0x08, 0x7b, 0xfc, 0x9e, 0x00, 0x04, 0xb8, 
+	0x2e, 0x08, 0x5f, 0x6c, 0x2e, 0x08, 0x5f, 0xcc, 
+	0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x11, 
+	0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, 
+	0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4b, 0x0a, 
+	0x58, 0x18, 0x1c, 0x05, 0xd1, 0x01, 0x20, 0xb0, 
+	0xe7, 0xf6, 0x68, 0xe8, 0x1c, 0x04, 0xd1, 0x01, 
+	0x20, 0xb6, 0xe7, 0xf1, 0x68, 0x60, 0x00, 0x43, 
+	0x18, 0x18, 0x01, 0x80, 0x08, 0x80, 0x60, 0x38, 
+	0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x64, 0xb5, 0xff, 0xb0, 0x82, 
+	0x9a, 0x04, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, 
+	0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 
+	0xb0, 0x83, 0x99, 0x03, 0x29, 0x20, 0xdb, 0x05, 
+	0x20, 0xa2, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x98, 0x05, 0x28, 0x00, 
+	0xd0, 0x64, 0x98, 0x05, 0x23, 0x0d, 0x06, 0x9b, 
+	0x42, 0xd8, 0xd3, 0x02, 0x20, 0xb4, 0xb0, 0x05, 
+	0xe7, 0xf0, 0x99, 0x06, 0x23, 0xff, 0x33, 0x81, 
+	0x42, 0x99, 0xd2, 0x02, 0x20, 0xb5, 0xb0, 0x05, 
+	0xe7, 0xe8, 0x99, 0x03, 0x00, 0x88, 0x49, 0x2c, 
+	0x58, 0x08, 0x90, 0x02, 0x28, 0x00, 0xd1, 0x02, 
+	0x20, 0xb0, 0xb0, 0x05, 0xe7, 0xde, 0x99, 0x06, 
+	0x00, 0x88, 0x1f, 0xc1, 0x39, 0x05, 0x91, 0x00, 
+	0x9e, 0x05, 0x98, 0x05, 0x1d, 0xc5, 0x35, 0x05, 
+	0x60, 0x35, 0x99, 0x06, 0x60, 0x71, 0x20, 0x00, 
+	0x60, 0xb0, 0x98, 0x04, 0x28, 0x10, 0xd1, 0x0a, 
+	0x98, 0x02, 0x68, 0x84, 0x98, 0x02, 0x30, 0x18, 
+	0x90, 0x01, 0x1c, 0x2a, 0x99, 0x00, 0x98, 0x01, 
+	0xf0, 0x00, 0xfc, 0x86, 0xe0, 0x25, 0x98, 0x04, 
+	0x28, 0x20, 0xd1, 0x1f, 0x98, 0x02, 0x68, 0xc0, 
+	0x1c, 0x07, 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x05, 
+	0xe7, 0xb8, 0x78, 0xb8, 0x08, 0x40, 0x00, 0x40, 
+	0x70, 0xb8, 0x69, 0x3c, 0x1d, 0xf8, 0x30, 0x05, 
+	0x90, 0x01, 0x68, 0xb8, 0x28, 0x00, 0xd1, 0x00, 
+	0x60, 0xbd, 0x1c, 0x2a, 0x99, 0x00, 0x98, 0x01, 
+	0xf0, 0x00, 0xfc, 0x6a, 0x68, 0x79, 0x18, 0x40, 
+	0x60, 0x78, 0x78, 0x78, 0x99, 0x03, 0xf0, 0x00, 
+	0xf8, 0xb9, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x05, 
+	0xe7, 0x9c, 0x68, 0xa0, 0x28, 0x00, 0xd0, 0x01, 
+	0x68, 0xa4, 0xe7, 0xfa, 0x60, 0xa6, 0x20, 0x00, 
+	0xb0, 0x05, 0xe7, 0x93, 0x20, 0xb4, 0xb0, 0x05, 
+	0xe7, 0x90, 0xb0, 0x03, 0xb0, 0x02, 0xe7, 0x8d, 
+	0x2e, 0x08, 0x5e, 0x64, 0xb5, 0xff, 0xb0, 0x81, 
+	0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x04, 
+	0x06, 0x18, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x83, 
+	0x27, 0x00, 0x2e, 0x20, 0xdb, 0x05, 0x20, 0xa2, 
+	0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0xb0, 0x49, 0x45, 0x58, 0x08, 
+	0x1c, 0x04, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x04, 
+	0xe7, 0xf3, 0x78, 0xe0, 0x28, 0x00, 0xd1, 0x73, 
+	0x98, 0x03, 0x28, 0x20, 0xd1, 0x19, 0x68, 0xe0, 
+	0x1c, 0x07, 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x04, 
+	0xe7, 0xe7, 0x69, 0x38, 0x49, 0x3c, 0x60, 0x48, 
+	0x48, 0x3b, 0x68, 0x40, 0x68, 0x00, 0x60, 0xb8, 
+	0x1d, 0xf8, 0x30, 0x05, 0x90, 0x02, 0x20, 0x01, 
+	0x90, 0x00, 0x48, 0x37, 0x68, 0x40, 0x68, 0x40, 
+	0x00, 0x80, 0x1f, 0xc1, 0x39, 0x19, 0x91, 0x01, 
+	0xe0, 0x1d, 0x98, 0x03, 0x28, 0x10, 0xd1, 0x17, 
+	0x68, 0xa0, 0x49, 0x31, 0x60, 0x48, 0x48, 0x30, 
+	0x68, 0x40, 0x68, 0x00, 0x61, 0x20, 0x48, 0x2e, 
+	0x68, 0x40, 0x68, 0x00, 0x61, 0x60, 0x1d, 0xe0, 
+	0x30, 0x11, 0x90, 0x02, 0x48, 0x2a, 0x68, 0x40, 
+	0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, 0x39, 0x21, 
+	0x91, 0x01, 0x20, 0x00, 0x90, 0x00, 0xe0, 0x02, 
+	0x20, 0xbc, 0xb0, 0x04, 0xe7, 0xb5, 0x48, 0x24, 
+	0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd0, 0x37, 
+	0x25, 0x00, 0x48, 0x21, 0x68, 0x40, 0x68, 0x02, 
+	0x99, 0x01, 0x98, 0x02, 0xf0, 0x00, 0xfb, 0xe8, 
+	0x19, 0x45, 0x48, 0x1d, 0x68, 0x40, 0x49, 0x1c, 
+	0x60, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x68, 0x80, 
+	0x49, 0x19, 0x60, 0x48, 0x48, 0x18, 0x68, 0x40, 
+	0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, 0x39, 0x05, 
+	0x91, 0x01, 0x48, 0x15, 0x68, 0x40, 0x68, 0x80, 
+	0x28, 0x00, 0xd1, 0xe2, 0x20, 0x00, 0x49, 0x12, 
+	0x68, 0x09, 0x60, 0x88, 0x48, 0x10, 0x68, 0x40, 
+	0x99, 0x04, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x40, 
+	0x68, 0x40, 0x99, 0x05, 0x60, 0x08, 0x98, 0x00, 
+	0x28, 0x00, 0xd0, 0x06, 0x60, 0x7d, 0x78, 0x78, 
+	0x1c, 0x31, 0xf0, 0x00, 0xf8, 0x13, 0xe0, 0x00, 
+	0xe0, 0x05, 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x78, 
+	0x20, 0xb4, 0xb0, 0x04, 0xe7, 0x75, 0x20, 0xbc, 
+	0xb0, 0x04, 0xe7, 0x72, 0xb0, 0x03, 0xb0, 0x01, 
+	0xe7, 0x6f, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x60, 0x90, 0xb5, 0xf3, 0x98, 0x00, 
+	0x06, 0x02, 0x0e, 0x12, 0x99, 0x01, 0x06, 0x0c, 
+	0x0e, 0x24, 0xb0, 0x81, 0x2c, 0x20, 0xdb, 0x05, 
+	0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x14, 
+	0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, 
+	0xb0, 0x01, 0xe7, 0xf3, 0x68, 0xe8, 0x1c, 0x01, 
+	0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x01, 0xe7, 0xed, 
+	0x11, 0x10, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 
+	0x28, 0x00, 0xd1, 0x04, 0x68, 0x48, 0x40, 0xd0, 
+	0x06, 0x07, 0x0e, 0x3f, 0xe0, 0x09, 0x68, 0x48, 
+	0x07, 0x16, 0x0f, 0x36, 0x40, 0xf0, 0x68, 0x4e, 
+	0x40, 0xd6, 0x1c, 0x33, 0x18, 0xc0, 0x06, 0x07, 
+	0x0e, 0x3f, 0x70, 0x0f, 0x70, 0x4a, 0x20, 0x00, 
+	0xb0, 0x01, 0xe7, 0xd3, 0xb0, 0x01, 0xe7, 0xd1, 
+	0x2e, 0x08, 0x5e, 0x64, 0xb4, 0xb0, 0x1c, 0x03, 
+	0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, 
+	0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xb0, 0x47, 0x70, 
+	0x00, 0x88, 0x4d, 0x08, 0x58, 0x28, 0x1c, 0x04, 
+	0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe0, 
+	0x1c, 0x07, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1, 
+	0x78, 0x78, 0x70, 0x18, 0x20, 0x00, 0xe7, 0xed, 
+	0xe7, 0xec, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, 
+	0xb5, 0xf3, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 
+	0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d, 
+	0x0e, 0x2d, 0xb0, 0x86, 0x20, 0x00, 0x90, 0x00, 
+	0x2d, 0x20, 0xdd, 0x05, 0x20, 0xa2, 0xb0, 0x07, 
+	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, 0x64, 
+	0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5d, 0xcc, 
+	0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xec, 
+	0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, 
+	0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 
+	0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11, 
+	0x0e, 0x09, 0x29, 0x20, 0xdd, 0x02, 0x20, 0xa2, 
+	0xbc, 0x90, 0x47, 0x70, 0x00, 0x88, 0x4c, 0x05, 
+	0x58, 0x20, 0x1c, 0x07, 0xd1, 0x01, 0x20, 0xb0, 
+	0xe7, 0xf6, 0x78, 0xf8, 0x70, 0x18, 0x20, 0x00, 
+	0xe7, 0xf2, 0xe7, 0xf1, 0x2e, 0x08, 0x5e, 0x64, 
+	0xb4, 0x90, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0x38, 
+	0x16, 0x04, 0x2a, 0x02, 0xda, 0x02, 0x20, 0x00, 
+	0xbc, 0x90, 0x47, 0x70, 0x2c, 0x01, 0xd1, 0x01, 
+	0x21, 0x28, 0xe0, 0x09, 0x2c, 0x02, 0xd1, 0x01, 
+	0x21, 0x20, 0xe0, 0x05, 0x2c, 0x00, 0xd1, 0x01, 
+	0x21, 0x0c, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xef, 
+	0x00, 0x50, 0x18, 0x80, 0x01, 0x80, 0x18, 0x41, 
+	0x1c, 0xc8, 0x08, 0x81, 0x1c, 0x08, 0xe7, 0xe7, 
+	0xe7, 0xe6, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81, 
+	0x9a, 0x03, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, 
+	0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05, 
+	0x20, 0xa2, 0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x99, 0x04, 0x00, 0x88, 
+	0x49, 0x29, 0x58, 0x08, 0x1c, 0x06, 0xd1, 0x02, 
+	0x20, 0xb0, 0xb0, 0x05, 0xe7, 0xf2, 0x2f, 0x00, 
+	0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xed, 
+	0x4b, 0x24, 0x42, 0x9f, 0xd1, 0x0a, 0x78, 0xf0, 
+	0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x05, 
+	0xe7, 0xe4, 0x20, 0x00, 0x60, 0xf0, 0x20, 0x00, 
+	0xb0, 0x05, 0xe7, 0xdf, 0x68, 0xf0, 0x28, 0x00, 
+	0xd0, 0x02, 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xd9, 
+	0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1, 0x39, 0x19, 
+	0x91, 0x02, 0x20, 0xff, 0x30, 0x81, 0x90, 0x01, 
+	0x99, 0x02, 0x98, 0x01, 0x42, 0x81, 0xda, 0x02, 
+	0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xca, 0x1c, 0x3c, 
+	0x60, 0xf4, 0x37, 0x14, 0x1c, 0x3d, 0x37, 0x0c, 
+	0x60, 0x2f, 0x99, 0x06, 0x60, 0x69, 0x20, 0x00, 
+	0x60, 0xa8, 0x97, 0x03, 0x20, 0x00, 0x60, 0xe0, 
+	0x1d, 0xe0, 0x30, 0x05, 0x9a, 0x03, 0x99, 0x02, 
+	0xf0, 0x00, 0xf9, 0x56, 0x90, 0x00, 0x20, 0x00, 
+	0x70, 0xa0, 0x98, 0x00, 0x60, 0x60, 0x9a, 0x03, 
+	0x60, 0xa2, 0x61, 0x25, 0x99, 0x04, 0x20, 0x54, 
+	0xf7, 0xff, 0xfd, 0xa0, 0xb0, 0x05, 0xe7, 0xa9, 
+	0xb0, 0x04, 0xb0, 0x01, 0xe7, 0xa6, 0x00, 0x00, 
+	0x2e, 0x08, 0x5e, 0x64, 0x00, 0x00, 0xff, 0xff, 
+	0xb5, 0xff, 0xb0, 0x83, 0x9a, 0x05, 0x06, 0x11, 
+	0x0e, 0x09, 0x91, 0x00, 0x9b, 0x06, 0x06, 0x18, 
+	0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c, 0x06, 0x01, 
+	0x0e, 0x09, 0x91, 0x02, 0xb0, 0x85, 0x99, 0x05, 
+	0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x08, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x98, 0x08, 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb4, 
+	0xb0, 0x08, 0xe7, 0xf5, 0x99, 0x05, 0x00, 0xc8, 
+	0x1a, 0x40, 0x00, 0x80, 0x49, 0x83, 0x68, 0x09, 
+	0x18, 0x47, 0x98, 0x08, 0x4b, 0x82, 0x42, 0x98, 
+	0xd1, 0x73, 0x99, 0x05, 0x00, 0x88, 0x49, 0x81, 
+	0x58, 0x08, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, 
+	0xb0, 0x08, 0xe7, 0xe1, 0x68, 0xe8, 0x28, 0x00, 
+	0xd1, 0x02, 0x78, 0xe8, 0x28, 0x00, 0xd0, 0x02, 
+	0x20, 0xbc, 0xb0, 0x08, 0xe7, 0xd8, 0x78, 0xa8, 
+	0x28, 0x00, 0xd0, 0x54, 0x20, 0x00, 0x42, 0x80, 
+	0xd0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xdb, 0x04, 
+	0xe0, 0x18, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 
+	0xe7, 0xf8, 0x48, 0x73, 0x5d, 0x00, 0x99, 0x05, 
+	0x42, 0x88, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0xa0, 
+	0x43, 0xc0, 0x49, 0x70, 0x68, 0x09, 0x40, 0x08, 
+	0x49, 0x6e, 0x60, 0x08, 0x20, 0x00, 0x00, 0xa1, 
+	0x4a, 0x6d, 0x50, 0x50, 0x20, 0xff, 0x49, 0x6a, 
+	0x55, 0x08, 0xe7, 0xe6, 0xe0, 0x33, 0x4a, 0x6b, 
+	0x92, 0x03, 0x7e, 0x38, 0x1c, 0x06, 0x28, 0xff, 
+	0xd0, 0x14, 0x20, 0x00, 0x00, 0xb1, 0x4a, 0x68, 
+	0x50, 0x50, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 
+	0x49, 0x66, 0x68, 0x09, 0x40, 0x08, 0x49, 0x65, 
+	0x60, 0x08, 0x20, 0xff, 0x76, 0x38, 0x21, 0xff, 
+	0x48, 0x63, 0x55, 0x81, 0x21, 0x00, 0x00, 0xb0, 
+	0x9a, 0x03, 0x50, 0x11, 0x7e, 0x78, 0x1c, 0x06, 
+	0x28, 0xff, 0xd0, 0x14, 0x21, 0x00, 0x00, 0xb0, 
+	0x4a, 0x5b, 0x50, 0x11, 0x20, 0x01, 0x40, 0xb0, 
+	0x43, 0xc0, 0x49, 0x5a, 0x68, 0x09, 0x40, 0x08, 
+	0x49, 0x58, 0x60, 0x08, 0x20, 0xff, 0x76, 0x78, 
+	0x20, 0xff, 0x49, 0x51, 0x55, 0x88, 0x21, 0x00, 
+	0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11, 0x20, 0x00, 
+	0x99, 0x05, 0x00, 0x89, 0x4a, 0x4b, 0x50, 0x50, 
+	0x24, 0x00, 0x2c, 0x0c, 0xdb, 0x06, 0xe0, 0x09, 
+	0xe0, 0x00, 0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, 
+	0x0e, 0x24, 0xe7, 0xf6, 0x20, 0x00, 0x19, 0x39, 
+	0x73, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, 
+	0x20, 0x00, 0x70, 0xf8, 0x20, 0x00, 0xb0, 0x08, 
+	0xe7, 0x66, 0x99, 0x05, 0x00, 0x88, 0x49, 0x3f, 
+	0x58, 0x08, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb0, 
+	0xb0, 0x08, 0xe7, 0x5d, 0x99, 0x07, 0x29, 0x11, 
+	0xdb, 0x02, 0x99, 0x07, 0x29, 0x13, 0xdd, 0x02, 
+	0x20, 0xb1, 0xb0, 0x08, 0xe7, 0x54, 0x99, 0x09, 
+	0x00, 0x88, 0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, 
+	0x20, 0xff, 0x30, 0x81, 0x90, 0x00, 0x99, 0x01, 
+	0x98, 0x00, 0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, 
+	0xb0, 0x08, 0xe7, 0x45, 0x9d, 0x08, 0x98, 0x08, 
+	0x30, 0x1c, 0x90, 0x08, 0x98, 0x08, 0x90, 0x04, 
+	0x98, 0x08, 0x30, 0x0c, 0x90, 0x08, 0x98, 0x08, 
+	0x90, 0x02, 0x9a, 0x02, 0x98, 0x04, 0x60, 0x02, 
+	0x99, 0x09, 0x98, 0x04, 0x60, 0x41, 0x20, 0x00, 
+	0x99, 0x04, 0x60, 0x88, 0x20, 0x00, 0x61, 0xa8, 
+	0x1d, 0xe8, 0x30, 0x11, 0x9a, 0x02, 0x99, 0x01, 
+	0xf0, 0x00, 0xf8, 0x56, 0x20, 0x00, 0x70, 0x28, 
+	0x98, 0x06, 0x99, 0x07, 0x43, 0x08, 0x70, 0x68, 
+	0x20, 0x00, 0x70, 0xa8, 0x20, 0x02, 0x70, 0xe8, 
+	0x20, 0x00, 0x71, 0x28, 0x98, 0x04, 0x60, 0xa8, 
+	0x20, 0x00, 0x60, 0xe8, 0x9a, 0x02, 0x61, 0x2a, 
+	0x9a, 0x02, 0x61, 0x6a, 0x99, 0x05, 0x00, 0x88, 
+	0x49, 0x16, 0x50, 0x0d, 0x20, 0x00, 0x60, 0xf8, 
+	0x88, 0x38, 0x4b, 0x1c, 0x40, 0x18, 0x80, 0x38, 
+	0x20, 0x00, 0x60, 0xb8, 0x9a, 0x02, 0x60, 0x7a, 
+	0x98, 0x06, 0x99, 0x07, 0x43, 0x08, 0x70, 0xb8, 
+	0x24, 0x00, 0x2c, 0x0c, 0xdb, 0x04, 0xe0, 0x07, 
+	0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 
+	0x20, 0x00, 0x19, 0x39, 0x74, 0x08, 0xe7, 0xf7, 
+	0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 
+	0x20, 0xff, 0x76, 0x38, 0x20, 0xff, 0x76, 0x78, 
+	0x20, 0x00, 0xb0, 0x08, 0xe6, 0xec, 0xb0, 0x05, 
+	0xb0, 0x03, 0xe6, 0xe9, 0x2e, 0x08, 0x5d, 0xcc, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5e, 0x64, 
+	0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xe4, 
+	0x2e, 0x08, 0x5e, 0xec, 0x9e, 0x00, 0x04, 0xb8, 
+	0x2e, 0x08, 0x5f, 0x6c, 0x2e, 0x08, 0x5e, 0xe8, 
+	0x2e, 0x08, 0x5f, 0xcc, 0xff, 0xff, 0xfb, 0xff, 
+	0xb4, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, 
+	0x21, 0x00, 0x68, 0x22, 0x2a, 0x00, 0xd0, 0x00, 
+	0x60, 0x13, 0x1d, 0xd8, 0x30, 0xb9, 0x60, 0x18, 
+	0x33, 0xc0, 0x31, 0x01, 0x3f, 0xc0, 0x2f, 0xc0, 
+	0xd8, 0xf7, 0x20, 0x00, 0x60, 0x18, 0x60, 0x23, 
+	0x31, 0x01, 0x1c, 0x08, 0xbc, 0x90, 0x47, 0x70, 
+	0xe7, 0xfc, 0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0a, 
+	0x6b, 0x18, 0x68, 0xd1, 0x68, 0x07, 0x2f, 0x00, 
+	0xd0, 0x0c, 0x68, 0x07, 0x60, 0x0f, 0x68, 0x41, 
+	0x68, 0x57, 0x68, 0x84, 0x19, 0x3f, 0x60, 0x57, 
+	0x27, 0x00, 0x60, 0x07, 0x27, 0x00, 0x60, 0x47, 
+	0x27, 0x00, 0x60, 0x87, 0x6a, 0xc7, 0x2f, 0x00, 
+	0xd0, 0x0c, 0x6a, 0xc7, 0x60, 0x0f, 0x6b, 0x01, 
+	0x68, 0x57, 0x6b, 0x44, 0x19, 0x3f, 0x60, 0x57, 
+	0x27, 0x00, 0x62, 0xc7, 0x27, 0x00, 0x63, 0x07, 
+	0x27, 0x00, 0x63, 0x47, 0x60, 0xd1, 0xbc, 0x90, 
+	0x47, 0x70, 0xe7, 0xfc, 0x20, 0x00, 0x49, 0x01, 
+	0x70, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x7c, 0x1c, 
+	0xb5, 0xff, 0xb0, 0x82, 0x9b, 0x05, 0x06, 0x18, 
+	0x16, 0x00, 0x90, 0x00, 0x98, 0x0c, 0x06, 0x01, 
+	0x16, 0x09, 0x91, 0x01, 0x98, 0x00, 0x28, 0x1f, 
+	0xdd, 0x05, 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x37, 
+	0x78, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x20, 0xd2, 
+	0xb0, 0x02, 0xe7, 0xf4, 0xe0, 0x64, 0x20, 0xff, 
+	0x49, 0x32, 0x70, 0x08, 0x49, 0x32, 0x98, 0x00, 
+	0xf0, 0x09, 0xfa, 0xa8, 0x9a, 0x04, 0x2a, 0x00, 
+	0xd9, 0x52, 0x20, 0xff, 0x49, 0x2f, 0x70, 0x08, 
+	0x9d, 0x02, 0x98, 0x0b, 0x99, 0x01, 0x18, 0x44, 
+	0x99, 0x01, 0x20, 0xc0, 0x1a, 0x40, 0x9a, 0x04, 
+	0x42, 0x90, 0xd9, 0x01, 0x9f, 0x04, 0xe0, 0x02, 
+	0x99, 0x01, 0x20, 0xc0, 0x1a, 0x47, 0x1c, 0x3a, 
+	0x1c, 0x21, 0x1c, 0x28, 0x23, 0xfe, 0xf0, 0x05, 
+	0xfa, 0xa5, 0x1c, 0x06, 0x2e, 0xd0, 0xd1, 0x0a, 
+	0x20, 0x03, 0xf0, 0x04, 0xf9, 0xa9, 0x1c, 0x3a, 
+	0x1c, 0x21, 0x1c, 0x28, 0x23, 0xfe, 0xf0, 0x05, 
+	0xfa, 0x99, 0x1c, 0x06, 0xe7, 0xf2, 0x98, 0x02, 
+	0x19, 0xc0, 0x90, 0x02, 0x9a, 0x04, 0x1b, 0xd2, 
+	0x92, 0x04, 0x9d, 0x0b, 0x9c, 0x03, 0x9b, 0x00, 
+	0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 0xf0, 0x05, 
+	0xfa, 0x89, 0x1c, 0x06, 0x2e, 0xd0, 0xd1, 0x0a, 
+	0x20, 0x03, 0xf0, 0x04, 0xf9, 0x8d, 0x9b, 0x00, 
+	0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 0xf0, 0x05, 
+	0xfa, 0x7d, 0x1c, 0x06, 0xe7, 0xf2, 0x99, 0x03, 
+	0x29, 0x20, 0xd3, 0x04, 0x99, 0x01, 0x18, 0x78, 
+	0x99, 0x03, 0x18, 0x41, 0x91, 0x03, 0x48, 0x0b, 
+	0x78, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x20, 0x03, 
+	0xf0, 0x04, 0xf9, 0x76, 0xe7, 0xf7, 0xe7, 0xa9, 
+	0x20, 0x00, 0x49, 0x04, 0x70, 0x08, 0x20, 0x00, 
+	0xb0, 0x02, 0xe7, 0x90, 0xb0, 0x02, 0xe7, 0x8e, 
+	0xe7, 0x8d, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0xa8, 
+	0x2e, 0x01, 0x2e, 0x19, 0x2e, 0x08, 0x7c, 0x1c, 
+	0xb5, 0xff, 0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x14, 
+	0x0e, 0x24, 0x9b, 0x03, 0x06, 0x1d, 0x0e, 0x2d, 
+	0x2c, 0x1f, 0xdb, 0x04, 0x20, 0xb3, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x04, 0x3a, 
+	0x0c, 0x12, 0x2d, 0x01, 0xd1, 0x73, 0x20, 0x01, 
+	0x03, 0x40, 0x40, 0x10, 0xd0, 0x0a, 0x4b, 0x6f, 
+	0x40, 0x1a, 0x48, 0x6f, 0x68, 0x00, 0x68, 0x00, 
+	0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x4b, 0x6c, 
+	0x68, 0x1b, 0x60, 0x18, 0x20, 0x01, 0x02, 0x40, 
+	0x40, 0x10, 0xd0, 0x0a, 0x4b, 0x69, 0x40, 0x1a, 
+	0x48, 0x67, 0x68, 0x00, 0x68, 0x00, 0x23, 0x20, 
+	0x43, 0xdb, 0x40, 0x18, 0x4b, 0x64, 0x68, 0x1b, 
+	0x60, 0x18, 0x20, 0x01, 0x05, 0x00, 0x40, 0x38, 
+	0xd0, 0x08, 0x48, 0x63, 0x68, 0x00, 0x69, 0x80, 
+	0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0x4b, 0x60, 
+	0x68, 0x1b, 0x61, 0x98, 0x20, 0x01, 0x05, 0x40, 
+	0x40, 0x38, 0xd0, 0x08, 0x48, 0x5c, 0x68, 0x00, 
+	0x69, 0x80, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, 
+	0x4b, 0x59, 0x68, 0x1b, 0x61, 0x98, 0x0a, 0x12, 
+	0x48, 0x55, 0x68, 0x00, 0x68, 0x00, 0x43, 0x90, 
+	0x4b, 0x53, 0x68, 0x1b, 0x60, 0x18, 0x48, 0x52, 
+	0x68, 0x00, 0x68, 0x00, 0x4b, 0x53, 0x65, 0x18, 
+	0x48, 0x51, 0x68, 0x00, 0x77, 0x04, 0x20, 0x09, 
+	0x04, 0x80, 0x40, 0x38, 0xd0, 0x35, 0x21, 0x00, 
+	0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, 
+	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x01, 
+	0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x27, 
+	0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0e, 
+	0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x46, 
+	0x68, 0x1b, 0x5a, 0x18, 0x23, 0xff, 0x33, 0x01, 
+	0x43, 0x18, 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 
+	0x4e, 0x41, 0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, 
+	0x04, 0x80, 0x40, 0x38, 0xd0, 0x10, 0x00, 0xc8, 
+	0x1a, 0x40, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x0d, 
+	0x4b, 0x3b, 0x68, 0x1b, 0x5a, 0x18, 0x23, 0x01, 
+	0x02, 0x5b, 0x43, 0x18, 0x00, 0xcb, 0x1a, 0x5b, 
+	0x00, 0x9b, 0x4e, 0x37, 0x68, 0x36, 0x52, 0xf0, 
+	0xe7, 0xcd, 0xe0, 0x5c, 0x2d, 0x02, 0xd1, 0x5a, 
+	0x0a, 0x12, 0x48, 0x2f, 0x68, 0x00, 0x68, 0x00, 
+	0x43, 0x10, 0x4b, 0x2d, 0x68, 0x1b, 0x60, 0x18, 
+	0x48, 0x2b, 0x68, 0x00, 0x68, 0x00, 0x4b, 0x2d, 
+	0x65, 0x18, 0x20, 0x01, 0x05, 0x00, 0x40, 0x38, 
+	0xd0, 0x07, 0x48, 0x29, 0x68, 0x00, 0x69, 0x80, 
+	0x4b, 0x2a, 0x40, 0x18, 0x4b, 0x26, 0x68, 0x1b, 
+	0x61, 0x98, 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 
+	0xd0, 0x07, 0x48, 0x23, 0x68, 0x00, 0x69, 0x80, 
+	0x4b, 0x25, 0x40, 0x18, 0x4b, 0x20, 0x68, 0x1b, 
+	0x61, 0x98, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 
+	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, 0x20, 0xff, 0xff, 0xdf, 0xff, 
+	0x2e, 0x08, 0x5e, 0x14, 0x66, 0x00, 0x00, 0x80, 
+	0x2e, 0x08, 0x5d, 0xcc, 0xff, 0xef, 0xff, 0xff, 
+	0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 
+	0xb5, 0x80, 0x1c, 0x07, 0x48, 0x17, 0x68, 0x01, 
+	0x20, 0x00, 0xf0, 0x12, 0xf8, 0x47, 0x60, 0x38, 
+	0x48, 0x14, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, 
+	0xf0, 0x12, 0xf8, 0x40, 0x60, 0x78, 0x48, 0x11, 
+	0x68, 0x00, 0x1d, 0xc1, 0x31, 0x05, 0x20, 0x00, 
+	0xf0, 0x12, 0xf8, 0x38, 0x60, 0xf8, 0x48, 0x0d, 
+	0x68, 0x00, 0x1d, 0xc1, 0x31, 0x09, 0x20, 0x00, 
+	0xf0, 0x12, 0xf8, 0x30, 0x61, 0x38, 0x48, 0x09, 
+	0x68, 0x00, 0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 
+	0xf0, 0x12, 0xf8, 0x28, 0x61, 0x78, 0x48, 0x05, 
+	0x68, 0x00, 0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 
+	0xf0, 0x12, 0xf8, 0x20, 0x60, 0xb8, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x14, 
+	0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x82, 0x26, 0x00, 
+	0x89, 0xb8, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x08, 
+	0x48, 0x59, 0x6e, 0xc2, 0x48, 0x58, 0x6f, 0x01, 
+	0x48, 0x57, 0x6a, 0x00, 0xf7, 0xfd, 0xff, 0x5c, 
+	0x1c, 0x06, 0x89, 0xb8, 0x23, 0x10, 0x40, 0x18, 
+	0xd0, 0x02, 0x48, 0x53, 0x69, 0x40, 0x1c, 0x06, 
+	0x89, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x21, 
+	0x48, 0x50, 0x68, 0xc0, 0x90, 0x00, 0x68, 0x78, 
+	0x02, 0x40, 0x99, 0x00, 0x1a, 0x08, 0x90, 0x01, 
+	0x98, 0x01, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8, 
+	0x98, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0x08, 
+	0x98, 0x01, 0x49, 0x48, 0x60, 0x88, 0x98, 0x00, 
+	0x49, 0x46, 0x60, 0xc8, 0x20, 0x01, 0x21, 0x33, 
+	0x06, 0x49, 0x66, 0xc8, 0x20, 0x00, 0x21, 0x33, 
+	0x06, 0x49, 0x66, 0xc8, 0x89, 0xb8, 0x23, 0x02, 
+	0x43, 0x18, 0x81, 0xb8, 0x89, 0xb8, 0x23, 0x02, 
+	0x40, 0x18, 0xd0, 0x3e, 0x48, 0x3d, 0x68, 0x80, 
+	0x1f, 0xc4, 0x3c, 0xff, 0x3c, 0xfa, 0x68, 0x38, 
+	0x02, 0x40, 0x1a, 0x25, 0x48, 0x38, 0x60, 0x45, 
+	0x48, 0x37, 0x60, 0x84, 0x20, 0x33, 0x06, 0x40, 
+	0x65, 0x45, 0x20, 0x33, 0x06, 0x40, 0x65, 0x84, 
+	0x1b, 0x60, 0x38, 0xc0, 0x21, 0x33, 0x06, 0x49, 
+	0x66, 0x88, 0x21, 0x00, 0x48, 0x32, 0xf7, 0xfd, 
+	0xfb, 0x89, 0x48, 0x32, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x00, 0xe7, 0xfa, 0x48, 0x30, 0x68, 0x01, 
+	0x23, 0xff, 0x33, 0x01, 0x43, 0x19, 0x60, 0x01, 
+	0x48, 0x2e, 0x6d, 0x80, 0x49, 0x2d, 0x65, 0x88, 
+	0x48, 0x2c, 0x6b, 0xc0, 0x23, 0x01, 0x07, 0x9b, 
+	0x40, 0x18, 0xd0, 0x00, 0xe7, 0xf8, 0x20, 0x33, 
+	0x06, 0x40, 0x66, 0x45, 0x20, 0x33, 0x06, 0x40, 
+	0x66, 0x84, 0x21, 0x00, 0x20, 0xff, 0xf7, 0xfd, 
+	0xfb, 0x69, 0x48, 0x20, 0x60, 0x05, 0x48, 0x1f, 
+	0x60, 0x44, 0x89, 0xb8, 0x23, 0x04, 0x40, 0x18, 
+	0xd0, 0x21, 0x68, 0xb8, 0x28, 0x00, 0xd1, 0x06, 
+	0x48, 0x1f, 0x68, 0x01, 0x23, 0x02, 0x43, 0xdb, 
+	0x40, 0x19, 0x60, 0x01, 0xe0, 0x17, 0x69, 0x38, 
+	0x49, 0x1a, 0x65, 0x88, 0x69, 0x38, 0x68, 0xb9, 
+	0x02, 0x49, 0x18, 0x40, 0x49, 0x17, 0x65, 0xc8, 
+	0x20, 0x03, 0x02, 0x00, 0x49, 0x15, 0x67, 0x48, 
+	0x20, 0x02, 0x49, 0x14, 0x67, 0x88, 0x20, 0x40, 
+	0x49, 0x12, 0x66, 0x08, 0x48, 0x12, 0x68, 0x01, 
+	0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x20, 0x33, 
+	0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, 
+	0x1a, 0xc0, 0x60, 0x38, 0x20, 0x33, 0x06, 0x40, 
+	0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 
+	0x60, 0x78, 0x48, 0x0a, 0x43, 0x30, 0x60, 0xb8, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x7c, 0x24, 
+	0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, 
+	0x66, 0x00, 0x00, 0xe0, 0x66, 0x00, 0x00, 0x80, 
+	0x66, 0x00, 0x00, 0xf0, 0xcc, 0x00, 0x00, 0x00, 
+	0xb5, 0xf3, 0x1c, 0x02, 0xb0, 0x81, 0x68, 0x93, 
+	0x68, 0x54, 0x21, 0x00, 0x1d, 0xd8, 0x30, 0xb9, 
+	0x1b, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x2d, 0x12, 
+	0xda, 0x12, 0x21, 0x00, 0x42, 0xa9, 0xdb, 0x04, 
+	0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 
+	0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01, 0x98, 0x02, 
+	0x54, 0x46, 0xe7, 0xf6, 0x68, 0x1b, 0x1d, 0x18, 
+	0x90, 0x00, 0x98, 0x00, 0x78, 0x80, 0x18, 0xc4, 
+	0x1c, 0x0f, 0x2f, 0x12, 0xdb, 0x04, 0xe0, 0x08, 
+	0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 
+	0x78, 0x26, 0x34, 0x01, 0x98, 0x02, 0x55, 0xc6, 
+	0xe7, 0xf6, 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 
+	0xe7, 0xf9, 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0d, 
+	0x1c, 0x14, 0xb0, 0x82, 0x20, 0x00, 0x70, 0x20, 
+	0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x03, 
+	0x20, 0xb1, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 
+	0x78, 0xba, 0x20, 0x40, 0x40, 0x10, 0xd0, 0x2a, 
+	0x07, 0x12, 0x0f, 0x12, 0x07, 0xd0, 0x0f, 0xc0, 
+	0xd0, 0x25, 0x20, 0x40, 0x70, 0x20, 0x35, 0x0a, 
+	0x21, 0x00, 0x1d, 0xf8, 0x30, 0x0d, 0x90, 0x01, 
+	0x1d, 0xf8, 0x30, 0x1d, 0x90, 0x00, 0x21, 0x00, 
+	0x29, 0x08, 0xdb, 0x04, 0xe0, 0x14, 0x1c, 0x48, 
+	0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x2e, 
+	0x35, 0x01, 0x98, 0x00, 0x78, 0x03, 0x30, 0x01, 
+	0x90, 0x00, 0x40, 0x33, 0x98, 0x01, 0x78, 0x06, 
+	0x30, 0x01, 0x90, 0x01, 0x42, 0xb3, 0xd0, 0x02, 
+	0x20, 0x00, 0x70, 0x20, 0xe0, 0x00, 0xe7, 0xea, 
+	0x20, 0x00, 0xb0, 0x02, 0xe7, 0xce, 0x20, 0xb1, 
+	0xb0, 0x02, 0xe7, 0xcb, 0xb0, 0x02, 0xe7, 0xc9, 
+	0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x8d, 0x20, 0x00, 
+	0x9a, 0x0f, 0x70, 0x10, 0x78, 0x78, 0x23, 0x80, 
+	0x40, 0x18, 0xd0, 0x05, 0x20, 0xb1, 0xb0, 0x0d, 
+	0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x78, 0xb8, 0x90, 0x05, 0x98, 0x05, 0x23, 0x40, 
+	0x40, 0x18, 0xd0, 0x73, 0x98, 0x05, 0x07, 0x00, 
+	0x0f, 0x00, 0x90, 0x05, 0x98, 0x05, 0x23, 0x02, 
+	0x40, 0x18, 0xd1, 0x03, 0x98, 0x05, 0x23, 0x04, 
+	0x40, 0x18, 0xd0, 0x68, 0x99, 0x0e, 0x79, 0x48, 
+	0x23, 0x3e, 0x40, 0x18, 0x90, 0x0c, 0x78, 0xf8, 
+	0x90, 0x04, 0x98, 0x04, 0x01, 0x00, 0x4b, 0x81, 
+	0x18, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x68, 0x00, 
+	0x90, 0x01, 0x78, 0x7c, 0x23, 0xbf, 0x40, 0x1c, 
+	0x23, 0xfe, 0x40, 0x1c, 0x20, 0x00, 0x90, 0x03, 
+	0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x99, 0x0c, 
+	0x42, 0x88, 0xd0, 0x08, 0x06, 0x20, 0x0e, 0x00, 
+	0x24, 0x01, 0x43, 0x04, 0x20, 0x01, 0x90, 0x03, 
+	0x23, 0xdf, 0x40, 0x1c, 0xe0, 0x06, 0x20, 0x02, 
+	0x40, 0x20, 0xd0, 0x03, 0x70, 0x7c, 0x20, 0x00, 
+	0xb0, 0x0d, 0xe7, 0xbd, 0x23, 0xfd, 0x40, 0x1c, 
+	0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x73, 
+	0x6a, 0xfd, 0x98, 0x03, 0x28, 0x00, 0xd0, 0x14, 
+	0x26, 0x00, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x0e, 
+	0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xe7, 0xf8, 
+	0x00, 0xb0, 0x19, 0x40, 0x68, 0x40, 0x00, 0xb1, 
+	0x19, 0x49, 0x64, 0x48, 0x20, 0x00, 0x00, 0xb1, 
+	0x19, 0x49, 0x62, 0x48, 0xe7, 0xf0, 0x88, 0x28, 
+	0x80, 0x68, 0x20, 0x20, 0x40, 0x20, 0xd1, 0x3e, 
+	0x99, 0x0e, 0x79, 0xc8, 0x09, 0x40, 0x06, 0x00, 
+	0x0e, 0x00, 0x90, 0x0a, 0x99, 0x0e, 0x79, 0xc8, 
+	0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x09, 0x98, 0x0a, 
+	0x30, 0x01, 0x06, 0x06, 0x0e, 0x36, 0x2e, 0x08, 
+	0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x70, 0x06, 0x06, 
+	0x0e, 0x36, 0xe7, 0xf8, 0x20, 0x00, 0x00, 0xb1, 
+	0x19, 0x49, 0xe0, 0x01, 0xe0, 0x9d, 0xe0, 0x9c, 
+	0x64, 0x48, 0x88, 0x68, 0x21, 0x80, 0x41, 0x31, 
+	0x43, 0x88, 0x80, 0x68, 0xe7, 0xee, 0x98, 0x0a, 
+	0x00, 0x80, 0x19, 0x40, 0x6c, 0x41, 0x98, 0x09, 
+	0x00, 0x80, 0x4a, 0x4b, 0x58, 0x10, 0x40, 0x08, 
+	0x99, 0x0a, 0x00, 0x89, 0x19, 0x49, 0x64, 0x48, 
+	0x06, 0x20, 0x0e, 0x00, 0x24, 0x20, 0x43, 0x04, 
+	0x98, 0x01, 0x0a, 0x00, 0x02, 0x00, 0x90, 0x01, 
+	0x98, 0x01, 0x99, 0x0c, 0x43, 0x08, 0x90, 0x01, 
+	0x98, 0x01, 0x99, 0x02, 0x60, 0x08, 0x78, 0x38, 
+	0x23, 0x80, 0x40, 0x18, 0xd0, 0x19, 0x99, 0x0e, 
+	0x7b, 0x08, 0x07, 0x42, 0x0f, 0x52, 0x92, 0x07, 
+	0x99, 0x0e, 0x7b, 0x08, 0x08, 0xc0, 0x06, 0x02, 
+	0x0e, 0x12, 0x92, 0x08, 0x1d, 0xe9, 0x31, 0x3d, 
+	0x91, 0x06, 0x99, 0x06, 0x9a, 0x08, 0x5c, 0x88, 
+	0x49, 0x36, 0x9a, 0x07, 0x5c, 0x89, 0xe0, 0x00, 
+	0xe0, 0x4e, 0x40, 0x08, 0x99, 0x06, 0x9a, 0x08, 
+	0x54, 0x88, 0x99, 0x0e, 0x79, 0x88, 0x06, 0xc0, 
+	0x0e, 0xc0, 0x90, 0x00, 0x98, 0x00, 0x49, 0x30, 
+	0x40, 0xc1, 0x91, 0x00, 0x99, 0x0e, 0x79, 0x88, 
+	0x09, 0x40, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x0b, 
+	0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 
+	0x99, 0x00, 0x40, 0x08, 0xd0, 0x33, 0x06, 0x20, 
+	0x0e, 0x00, 0x24, 0x40, 0x43, 0x04, 0x9a, 0x0b, 
+	0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, 
+	0x40, 0x41, 0x00, 0x90, 0x19, 0x40, 0x64, 0x41, 
+	0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, 0x6a, 0x40, 
+	0x99, 0x00, 0x43, 0x01, 0x00, 0x90, 0x19, 0x40, 
+	0x62, 0x41, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, 
+	0x6c, 0x40, 0x28, 0x00, 0xd1, 0x17, 0x88, 0x68, 
+	0x9a, 0x0b, 0x21, 0x80, 0x41, 0x11, 0x43, 0x88, 
+	0x80, 0x68, 0x88, 0x68, 0x28, 0x00, 0xd1, 0x0e, 
+	0x06, 0x20, 0x0e, 0x00, 0x24, 0x02, 0x43, 0x04, 
+	0x23, 0xfe, 0x40, 0x1c, 0x98, 0x0c, 0x30, 0x02, 
+	0x06, 0x00, 0x0e, 0x00, 0x90, 0x0c, 0x98, 0x0c, 
+	0x23, 0x3e, 0x40, 0x18, 0x90, 0x0c, 0xe0, 0x0a, 
+	0x06, 0x20, 0x0e, 0x00, 0x24, 0x40, 0x43, 0x04, 
+	0x23, 0xfe, 0x40, 0x1c, 0x98, 0x0c, 0x1c, 0x41, 
+	0x98, 0x04, 0xf0, 0x00, 0xf8, 0x13, 0x9a, 0x0f, 
+	0x70, 0x14, 0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, 
+	0xe6, 0xe2, 0x20, 0xb1, 0xb0, 0x0d, 0xe6, 0xdf, 
+	0xb0, 0x0d, 0xe6, 0xdd, 0x64, 0x00, 0x08, 0x00, 
+	0x2e, 0x08, 0x20, 0x18, 0x2e, 0x08, 0x20, 0x98, 
+	0x80, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x98, 0x00, 
+	0x06, 0x07, 0x0e, 0x3f, 0x99, 0x01, 0x06, 0x0e, 
+	0x0e, 0x36, 0x00, 0xf8, 0x4b, 0x13, 0x18, 0xc5, 
+	0x01, 0x38, 0x4b, 0x13, 0x18, 0xc4, 0x01, 0x38, 
+	0x4b, 0x12, 0x18, 0xc2, 0x68, 0x10, 0x23, 0x40, 
+	0x43, 0xdb, 0x40, 0x18, 0x60, 0x10, 0x2e, 0x3e, 
+	0xdc, 0x15, 0x68, 0x20, 0x1c, 0x01, 0x0a, 0x09, 
+	0x02, 0x09, 0x43, 0x31, 0x60, 0x21, 0x68, 0x28, 
+	0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x23, 0x3e, 
+	0x43, 0x19, 0x60, 0x29, 0x68, 0x10, 0x23, 0x40, 
+	0x43, 0x18, 0x60, 0x10, 0x20, 0x00, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0xbd, 
+	0xe7, 0xf9, 0xe7, 0xf8, 0x64, 0x00, 0x10, 0x00, 
+	0x64, 0x00, 0x08, 0x00, 0x64, 0x00, 0x08, 0x08, 
+	0xb5, 0xf3, 0xb0, 0x93, 0x98, 0x13, 0x69, 0x00, 
+	0x90, 0x01, 0x98, 0x01, 0x78, 0x40, 0x23, 0x80, 
+	0x40, 0x18, 0xd0, 0x05, 0x20, 0xbe, 0xb0, 0x13, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x98, 0x01, 0x78, 0x80, 0x90, 0x08, 0x98, 0x08, 
+	0x23, 0x40, 0x40, 0x18, 0xd0, 0x73, 0x98, 0x08, 
+	0x23, 0x20, 0x40, 0x18, 0xd0, 0x6f, 0x98, 0x01, 
+	0x6b, 0x07, 0x98, 0x01, 0x79, 0xc0, 0x00, 0x80, 
+	0x49, 0x76, 0x58, 0x08, 0x90, 0x00, 0x98, 0x00, 
+	0x68, 0xc0, 0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb6, 
+	0xb0, 0x13, 0xe7, 0xe1, 0x78, 0xb0, 0x07, 0xc0, 
+	0x0f, 0xc0, 0xd0, 0x02, 0x20, 0xb6, 0xb0, 0x13, 
+	0xe7, 0xda, 0xa9, 0x11, 0x1c, 0x30, 0xf0, 0x00, 
+	0xf9, 0x2b, 0x90, 0x02, 0x98, 0x11, 0x28, 0x00, 
+	0xd1, 0x02, 0x98, 0x02, 0xb0, 0x13, 0xe7, 0xcf, 
+	0x98, 0x11, 0x90, 0x0e, 0x20, 0x01, 0x90, 0x0b, 
+	0x98, 0x13, 0x88, 0x40, 0x90, 0x0d, 0x98, 0x13, 
+	0x68, 0x40, 0x90, 0x06, 0x98, 0x13, 0x68, 0x81, 
+	0x91, 0x10, 0x99, 0x10, 0x1d, 0xc8, 0x30, 0xb9, 
+	0x90, 0x05, 0x98, 0x05, 0x99, 0x06, 0x1a, 0x40, 
+	0x04, 0x04, 0x0c, 0x24, 0x99, 0x14, 0x79, 0x88, 
+	0x90, 0x03, 0x98, 0x03, 0x06, 0xc0, 0x0e, 0xc0, 
+	0x90, 0x0a, 0x98, 0x0a, 0x49, 0x5a, 0x40, 0xc1, 
+	0x91, 0x0a, 0x98, 0x03, 0x09, 0x40, 0x06, 0x00, 
+	0x0e, 0x00, 0x90, 0x09, 0x98, 0x09, 0x00, 0x80, 
+	0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x40, 0x08, 
+	0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x13, 0xe7, 0x9f, 
+	0x20, 0xb8, 0x90, 0x0c, 0x98, 0x11, 0x30, 0x08, 
+	0x90, 0x04, 0x20, 0x00, 0x90, 0x07, 0x98, 0x07, 
+	0x28, 0x00, 0xd0, 0x10, 0x99, 0x10, 0x68, 0x09, 
+	0x91, 0x10, 0x99, 0x10, 0x1d, 0x08, 0x90, 0x12, 
+	0x98, 0x12, 0x78, 0x80, 0x99, 0x10, 0x18, 0x40, 
+	0x90, 0x06, 0x98, 0x12, 0x78, 0x81, 0x20, 0xc0, 
+	0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24, 0x98, 0x0d, 
+	0x42, 0x84, 0xdb, 0x05, 0xe0, 0x00, 0xe0, 0x7c, 
+	0x9c, 0x0d, 0x20, 0x00, 0x90, 0x0d, 0xe0, 0x06, 
+	0x98, 0x0d, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00, 
+	0x90, 0x0d, 0x20, 0x01, 0x90, 0x07, 0x98, 0x0c, 
+	0x42, 0xa0, 0xda, 0x2e, 0x25, 0x00, 0x98, 0x0c, 
+	0x42, 0x85, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, 
+	0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf7, 0x98, 0x06, 
+	0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, 
+	0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2, 
+	0x98, 0x0c, 0x1a, 0x20, 0x04, 0x04, 0x0c, 0x24, 
+	0xa9, 0x11, 0x1c, 0x30, 0xf0, 0x00, 0xf8, 0xac, 
+	0x90, 0x02, 0x98, 0x11, 0x28, 0x00, 0xd1, 0x08, 
+	0x98, 0x0e, 0x60, 0xb0, 0x68, 0x70, 0x99, 0x0b, 
+	0x18, 0x40, 0x60, 0x70, 0x98, 0x02, 0xb0, 0x13, 
+	0xe7, 0x4a, 0x98, 0x0b, 0x30, 0x01, 0x90, 0x0b, 
+	0x20, 0xb8, 0x90, 0x0c, 0x98, 0x11, 0x30, 0x08, 
+	0x90, 0x04, 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x04, 
+	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, 0x64, 
+	0x80, 0x00, 0x00, 0x00, 0xb4, 0xf0, 0x1c, 0x01, 
+	0x78, 0x88, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x42, 
+	0x79, 0xc8, 0x00, 0x80, 0x4b, 0x21, 0x58, 0x1d, 
+	0x6b, 0x0a, 0x68, 0xef, 0x68, 0x10, 0x28, 0x00, 
+	0xd0, 0x17, 0x68, 0xfe, 0x68, 0x10, 0x60, 0x30, 
+	0x68, 0x50, 0x60, 0xf8, 0x68, 0x78, 0x68, 0x93, 
+	0x18, 0xc0, 0x60, 0x78, 0x20, 0x00, 0x60, 0x10, 
+	0x20, 0x00, 0x60, 0x50, 0x20, 0x00, 0x60, 0x90, 
+	0x68, 0x78, 0x78, 0x3b, 0x42, 0x98, 0xd9, 0x04, 
+	0x78, 0xb8, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 
+	0x70, 0xb8, 0x6a, 0xd0, 0x60, 0x10, 0x6b, 0x10, 
+	0x60, 0x50, 0x6b, 0x50, 0x60, 0x90, 0x24, 0x00, 
+	0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x60, 
+	0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0, 
+	0x18, 0x80, 0x6b, 0x80, 0x00, 0xa3, 0x18, 0x9b, 
+	0x60, 0xd8, 0x23, 0x00, 0x00, 0xa0, 0x18, 0x80, 
+	0x63, 0x83, 0xe7, 0xf0, 0x20, 0x00, 0x62, 0xd0, 
+	0x20, 0x00, 0x63, 0x10, 0x20, 0x00, 0x63, 0x50, 
+	0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x20, 0xb1, 
+	0xe7, 0xfb, 0xe7, 0xfa, 0x2e, 0x08, 0x5e, 0x64, 
+	0xb4, 0x90, 0x1c, 0x02, 0x1c, 0x0f, 0x78, 0x14, 
+	0x68, 0x90, 0x1c, 0x01, 0xd1, 0x08, 0x20, 0x00, 
+	0x60, 0x38, 0x78, 0x90, 0x23, 0x01, 0x43, 0x18, 
+	0x70, 0x90, 0x20, 0xb7, 0xbc, 0x90, 0x47, 0x70, 
+	0x68, 0x08, 0x60, 0x90, 0x20, 0x00, 0x60, 0x48, 
+	0x60, 0x39, 0x68, 0x50, 0x38, 0x01, 0x60, 0x50, 
+	0x68, 0x50, 0x42, 0xa0, 0xd1, 0x02, 0x20, 0xbf, 
+	0xe7, 0xf0, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xed, 
+	0xe7, 0xec, 0x00, 0x00, 0x1c, 0x01, 0x22, 0x00, 
+	0x6a, 0x50, 0x68, 0x02, 0x60, 0x0a, 0x4a, 0x05, 
+	0x6f, 0xd2, 0x60, 0x8a, 0x4a, 0x04, 0x68, 0x12, 
+	0x60, 0x4a, 0x22, 0x1d, 0x02, 0x92, 0x68, 0x12, 
+	0x60, 0xca, 0x47, 0x70, 0xcc, 0x00, 0x0f, 0x80, 
+	0x2e, 0x08, 0x1f, 0xac, 0x1c, 0x01, 0x48, 0x02, 
+	0x60, 0x01, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 
+	0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x20, 0x33, 
+	0x06, 0x40, 0x62, 0x01, 0x20, 0x00, 0x47, 0x70, 
+	0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 
+	0x6a, 0xc0, 0x23, 0x7f, 0x03, 0x9b, 0x40, 0x18, 
+	0x03, 0x8a, 0x43, 0x10, 0x22, 0x33, 0x06, 0x52, 
+	0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 
+	0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 
+	0x23, 0x03, 0x03, 0x1b, 0x40, 0x18, 0x43, 0x08, 
+	0x22, 0x33, 0x06, 0x52, 0x62, 0xd0, 0x20, 0x00, 
+	0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x06, 0x0a, 
+	0x0e, 0x12, 0x2a, 0x00, 0xd0, 0x06, 0x20, 0x33, 
+	0x06, 0x40, 0x6a, 0xc0, 0x23, 0x01, 0x05, 0x5b, 
+	0x43, 0x18, 0xe0, 0x04, 0x20, 0x33, 0x06, 0x40, 
+	0x6a, 0xc0, 0x4b, 0x04, 0x40, 0x18, 0x23, 0x33, 
+	0x06, 0x5b, 0x62, 0xd8, 0x20, 0x00, 0x47, 0x70, 
+	0xe7, 0xfd, 0x00, 0x00, 0xff, 0xdf, 0xff, 0xff, 
+	0x48, 0x04, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 
+	0xd0, 0x01, 0x20, 0xff, 0x47, 0x70, 0x20, 0x00, 
+	0xe7, 0xfc, 0xe7, 0xfb, 0x66, 0x00, 0x00, 0x80, 
+	0xb4, 0x80, 0x1c, 0x01, 0x06, 0x0f, 0x0e, 0x3f, 
+	0x4a, 0x08, 0x2f, 0x00, 0xd0, 0x03, 0x68, 0x10, 
+	0x23, 0x01, 0x43, 0x18, 0xe0, 0x02, 0x68, 0x10, 
+	0x08, 0x40, 0x00, 0x40, 0x68, 0x13, 0x43, 0x18, 
+	0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, 
+	0xe7, 0xfc, 0x00, 0x00, 0x66, 0x00, 0x00, 0x98, 
+	0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x06, 
+	0x40, 0x1a, 0x4b, 0x06, 0x40, 0x1f, 0x0b, 0x10, 
+	0x02, 0x39, 0x43, 0x08, 0x49, 0x04, 0x61, 0xc8, 
+	0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 
+	0x01, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xf0, 0x00, 
+	0x66, 0x00, 0x00, 0x80, 0x48, 0x01, 0x69, 0xc0, 
+	0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x00, 0x80, 
+	0x1c, 0x01, 0x48, 0x07, 0x68, 0x02, 0x4b, 0x07, 
+	0x40, 0x1a, 0x60, 0x02, 0x23, 0x01, 0x05, 0x9b, 
+	0x42, 0x99, 0xd1, 0x03, 0x48, 0x02, 0x68, 0x02, 
+	0x43, 0x0a, 0x60, 0x02, 0x47, 0x70, 0x00, 0x00, 
+	0x66, 0x00, 0x00, 0x2c, 0xff, 0xbf, 0xff, 0xff, 
+	0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x67, 0x41, 
+	0x47, 0x70, 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 
+	0x67, 0x81, 0x47, 0x70, 0xb5, 0x90, 0x4c, 0x21, 
+	0x20, 0x01, 0x60, 0x20, 0xf0, 0x11, 0xfb, 0x48, 
+	0x48, 0x1f, 0x69, 0x84, 0x27, 0x00, 0x2f, 0x04, 
+	0xd3, 0x04, 0xe0, 0x06, 0x1c, 0x78, 0x06, 0x07, 
+	0x0e, 0x3f, 0xe7, 0xf8, 0x21, 0x00, 0xc4, 0x02, 
+	0xe7, 0xf8, 0x20, 0x00, 0x49, 0x18, 0x69, 0x49, 
+	0x60, 0x08, 0x20, 0x00, 0x49, 0x16, 0x69, 0x49, 
+	0x60, 0x48, 0x20, 0x00, 0x49, 0x14, 0x69, 0x49, 
+	0x60, 0x88, 0x20, 0x00, 0x49, 0x12, 0x69, 0x49, 
+	0x60, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x69, 0x49, 
+	0x61, 0x08, 0x20, 0x00, 0x49, 0x0e, 0x69, 0x49, 
+	0x61, 0x48, 0x20, 0x00, 0x49, 0x0c, 0x69, 0x49, 
+	0x61, 0x88, 0x20, 0x00, 0x49, 0x0a, 0x69, 0x49, 
+	0x61, 0xc8, 0x20, 0x00, 0x49, 0x08, 0x69, 0x49, 
+	0x62, 0x08, 0x20, 0x00, 0x49, 0x06, 0x69, 0x49, 
+	0x62, 0x48, 0x20, 0x18, 0x49, 0x04, 0x69, 0x49, 
+	0x62, 0x88, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0xe7, 0xfb, 0x70, 0x00, 0x00, 0x38, 
+	0x2e, 0x08, 0x1f, 0xb0, 0xb5, 0xff, 0x1c, 0x0f, 
+	0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, 
+	0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, 
+	0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20, 
+	0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x23, 0x04, 
+	0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20, 
+	0x00, 0x80, 0x49, 0x31, 0x58, 0x08, 0x43, 0x70, 
+	0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, 
+	0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, 
+	0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, 
+	0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x11, 0xfa, 0xe6, 
+	0xf0, 0x11, 0xfa, 0xc2, 0x48, 0x27, 0x69, 0x80, 
+	0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x49, 0x25, 
+	0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x48, 0x23, 
+	0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
+	0x49, 0x20, 0x69, 0x89, 0x60, 0x08, 0x6b, 0xe0, 
+	0x49, 0x1e, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1e, 
+	0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 
+	0x49, 0x1a, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 
+	0x0f, 0xc0, 0x1c, 0x21, 0x1c, 0x20, 0xf0, 0x00, 
+	0xfe, 0x51, 0x48, 0x16, 0x69, 0xc0, 0x68, 0x00, 
+	0x4b, 0x16, 0x40, 0x18, 0x02, 0x29, 0x0a, 0x09, 
+	0x00, 0x89, 0x43, 0x08, 0x49, 0x11, 0x69, 0xc9, 
+	0x60, 0x08, 0x01, 0x80, 0x48, 0x0f, 0x69, 0xc0, 
+	0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x99, 0x00, 
+	0x06, 0xc9, 0x43, 0x08, 0x49, 0x0b, 0x69, 0xc9, 
+	0x60, 0x08, 0x99, 0x04, 0x1c, 0x20, 0x22, 0x00, 
+	0xf0, 0x00, 0xfe, 0xbc, 0xf0, 0x00, 0xff, 0x9d, 
+	0xf0, 0x11, 0xfa, 0xb8, 0x20, 0x00, 0xb0, 0x01, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb0, 0x01, 0xe7, 0xf9, 0x2e, 0x03, 0x32, 0xa4, 
+	0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, 
+	0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, 
+	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, 0x64, 0xf0, 0x11, 0xfa, 0x40, 
+	0x48, 0x2a, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 
+	0x00, 0xc0, 0x23, 0x01, 0x43, 0x18, 0x49, 0x27, 
+	0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x6b, 0xe0, 
+	0x49, 0x24, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x24, 
+	0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 
+	0x49, 0x20, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 
+	0x0f, 0xc0, 0x48, 0x1e, 0x69, 0x80, 0x68, 0x00, 
+	0x01, 0x40, 0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, 
+	0x43, 0x01, 0x48, 0x1a, 0x69, 0x80, 0x60, 0x01, 
+	0x1c, 0x21, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xca, 
+	0x48, 0x16, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x17, 
+	0x40, 0x18, 0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, 
+	0x43, 0x08, 0x49, 0x12, 0x69, 0xc9, 0x60, 0x08, 
+	0x01, 0x80, 0x48, 0x10, 0x69, 0xc0, 0x68, 0x00, 
+	0x01, 0x40, 0x09, 0x40, 0x49, 0x0d, 0x69, 0xc9, 
+	0x60, 0x08, 0xf0, 0x00, 0xff, 0x1e, 0xf0, 0x11, 
+	0xfa, 0x17, 0x48, 0x0a, 0x6b, 0x81, 0x1c, 0x20, 
+	0xf0, 0x00, 0xfe, 0xf0, 0x9b, 0x04, 0x60, 0x18, 
+	0xf0, 0x11, 0xfa, 0x30, 0x20, 0x00, 0xb0, 0x01, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb0, 0x01, 0xe7, 0xf9, 0x2e, 0x03, 0x32, 0xa4, 
+	0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, 
+	0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, 
+	0xb5, 0xff, 0x1c, 0x0c, 0x1c, 0x1f, 0xb0, 0x83, 
+	0x9d, 0x03, 0x6b, 0x28, 0x6a, 0xa9, 0x1a, 0x40, 
+	0x30, 0x01, 0x90, 0x00, 0x19, 0xe0, 0x99, 0x00, 
+	0x42, 0x88, 0xd9, 0x01, 0x98, 0x00, 0x1b, 0x07, 
+	0x69, 0x28, 0x28, 0x08, 0xd1, 0x02, 0x08, 0x7f, 
+	0x08, 0x64, 0x00, 0x64, 0x6b, 0xa8, 0x9a, 0x05, 
+	0x43, 0x50, 0x19, 0x01, 0x91, 0x01, 0x69, 0x28, 
+	0x00, 0x80, 0x49, 0x38, 0x58, 0x08, 0x23, 0x04, 
+	0x40, 0x18, 0xd0, 0x02, 0x99, 0x01, 0x08, 0x49, 
+	0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x34, 
+	0x58, 0x08, 0x99, 0x01, 0x43, 0x48, 0x90, 0x02, 
+	0x69, 0xa8, 0x99, 0x02, 0x09, 0x49, 0x18, 0x46, 
+	0x6b, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x03, 0x30, 
+	0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30, 0x0a, 0x00, 
+	0x1c, 0x06, 0xf0, 0x11, 0xf9, 0xcb, 0xf0, 0x11, 
+	0xf9, 0xa7, 0x48, 0x2a, 0x69, 0x80, 0x68, 0x00, 
+	0x01, 0x40, 0x09, 0x40, 0x49, 0x27, 0x69, 0x89, 
+	0x60, 0x08, 0x48, 0x26, 0x69, 0x80, 0x68, 0x00, 
+	0x08, 0xc0, 0x00, 0xc0, 0x23, 0x02, 0x43, 0x18, 
+	0x49, 0x22, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 
+	0x6b, 0xe8, 0x49, 0x20, 0x69, 0x89, 0x68, 0x09, 
+	0x4b, 0x1f, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 
+	0x43, 0x08, 0x49, 0x1c, 0x69, 0x89, 0x60, 0x08, 
+	0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x29, 0x1c, 0x28, 
+	0xf0, 0x00, 0xfd, 0x34, 0x48, 0x17, 0x69, 0xc0, 
+	0x68, 0x00, 0x4b, 0x18, 0x40, 0x18, 0x02, 0x31, 
+	0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x13, 
+	0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x11, 
+	0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
+	0x99, 0x02, 0x06, 0xc9, 0x43, 0x08, 0x49, 0x0d, 
+	0x69, 0xc9, 0x60, 0x08, 0x99, 0x0c, 0x1c, 0x28, 
+	0x22, 0x02, 0xf0, 0x00, 0xfd, 0x9f, 0x48, 0x09, 
+	0x69, 0x40, 0x62, 0x07, 0xf0, 0x00, 0xfe, 0x7d, 
+	0xf0, 0x11, 0xf9, 0x98, 0x20, 0x00, 0xb0, 0x03, 
+	0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0xb0, 0x03, 0xe7, 0xf9, 0x2e, 0x03, 0x32, 0xa4, 
+	0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, 
+	0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, 
+	0xb5, 0xff, 0xb0, 0x81, 0x9f, 0x01, 0x6b, 0x78, 
+	0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 
+	0x9a, 0x03, 0x9b, 0x04, 0x18, 0xd0, 0x99, 0x00, 
+	0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, 0x9a, 0x03, 
+	0x1a, 0x83, 0x93, 0x04, 0x69, 0x38, 0x28, 0x08, 
+	0xd1, 0x03, 0x99, 0x02, 0x08, 0x49, 0x00, 0x49, 
+	0x91, 0x02, 0x6b, 0xb8, 0x9a, 0x03, 0x43, 0x50, 
+	0x99, 0x02, 0x18, 0x45, 0x69, 0x38, 0x00, 0x80, 
+	0x49, 0x3c, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
+	0xd0, 0x00, 0x08, 0x6d, 0x69, 0x38, 0x00, 0x80, 
+	0x49, 0x39, 0x58, 0x08, 0x1c, 0x06, 0x43, 0x6e, 
+	0x69, 0xb8, 0x09, 0x71, 0x18, 0x44, 0x6b, 0xf8, 
+	0x28, 0x00, 0xd1, 0x02, 0x03, 0x20, 0x0b, 0x00, 
+	0xe0, 0x01, 0x02, 0x20, 0x0a, 0x00, 0x1c, 0x04, 
+	0xf0, 0x11, 0xf9, 0x34, 0xf0, 0x11, 0xf9, 0x10, 
+	0x48, 0x30, 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 
+	0x09, 0x40, 0x49, 0x2e, 0x69, 0x89, 0x60, 0x08, 
+	0x48, 0x2c, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 
+	0x00, 0xc0, 0x23, 0x03, 0x43, 0x18, 0x49, 0x29, 
+	0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x6b, 0xf8, 
+	0x49, 0x26, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x26, 
+	0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 
+	0x49, 0x22, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 
+	0x0f, 0xc0, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00, 
+	0xfc, 0x9d, 0x99, 0x0a, 0x1c, 0x38, 0x22, 0x03, 
+	0xf0, 0x00, 0xfd, 0x20, 0x69, 0xf8, 0x49, 0x1b, 
+	0x69, 0x49, 0x61, 0x08, 0x48, 0x19, 0x69, 0xc0, 
+	0x68, 0x00, 0x4b, 0x1a, 0x40, 0x18, 0x02, 0x21, 
+	0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x15, 
+	0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x13, 
+	0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
+	0x06, 0xf1, 0x43, 0x08, 0x49, 0x0f, 0x69, 0xc9, 
+	0x60, 0x08, 0x48, 0x0e, 0x69, 0x40, 0x61, 0x84, 
+	0x06, 0xf0, 0x0e, 0xc0, 0x49, 0x0b, 0x69, 0x49, 
+	0x61, 0x48, 0x9b, 0x04, 0x48, 0x09, 0x69, 0x40, 
+	0x62, 0x43, 0xf0, 0x00, 0xfd, 0xda, 0xf0, 0x11, 
+	0xf8, 0xf5, 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 
+	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0x32, 0xa4, 
+	0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, 
+	0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, 
+	0xb5, 0xf3, 0xb0, 0x86, 0x9f, 0x06, 0x99, 0x07, 
+	0x68, 0x8c, 0x99, 0x07, 0x68, 0xc8, 0x90, 0x03, 
+	0x99, 0x07, 0x68, 0x0d, 0x99, 0x07, 0x68, 0x49, 
+	0x91, 0x02, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40, 
+	0x30, 0x01, 0x90, 0x01, 0x6b, 0x38, 0x6a, 0xb9, 
+	0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x02, 
+	0x98, 0x03, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88, 
+	0xd9, 0x03, 0x98, 0x01, 0x99, 0x02, 0x1a, 0x40, 
+	0x90, 0x03, 0x19, 0x28, 0x99, 0x00, 0x42, 0x88, 
+	0xd9, 0x01, 0x98, 0x00, 0x1b, 0x44, 0x69, 0x38, 
+	0x28, 0x08, 0xd1, 0x02, 0x08, 0x64, 0x08, 0x6d, 
+	0x00, 0x6d, 0x6b, 0xb8, 0x99, 0x02, 0x43, 0x48, 
+	0x19, 0x41, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, 
+	0x49, 0x41, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 
+	0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 
+	0x69, 0x38, 0x00, 0x80, 0x49, 0x3d, 0x58, 0x08, 
+	0x99, 0x04, 0x43, 0x48, 0x90, 0x05, 0x69, 0xb8, 
+	0x99, 0x05, 0x09, 0x49, 0x18, 0x46, 0x6b, 0xf8, 
+	0x28, 0x00, 0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, 
+	0xe0, 0x01, 0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, 
+	0xf0, 0x11, 0xf8, 0x78, 0xf0, 0x11, 0xf8, 0x54, 
+	0x48, 0x33, 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 
+	0x09, 0x40, 0x49, 0x31, 0x69, 0x89, 0x60, 0x08, 
+	0x48, 0x2f, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 
+	0x00, 0xc0, 0x23, 0x04, 0x43, 0x18, 0x49, 0x2c, 
+	0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x48, 0x2a, 
+	0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 
+	0x99, 0x05, 0x06, 0xc9, 0x43, 0x08, 0x49, 0x26, 
+	0x69, 0xc9, 0x60, 0x08, 0x48, 0x24, 0x69, 0xc0, 
+	0x68, 0x00, 0x4b, 0x24, 0x40, 0x18, 0x02, 0x31, 
+	0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x20, 
+	0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x1c, 0x39, 
+	0x1c, 0x38, 0xf0, 0x00, 0xfb, 0xd7, 0x6b, 0xf8, 
+	0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1c, 
+	0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 
+	0x49, 0x17, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 
+	0x0f, 0xc0, 0x99, 0x07, 0x69, 0x09, 0x1c, 0x38, 
+	0x22, 0x04, 0xf0, 0x00, 0xfc, 0x4b, 0x69, 0xf8, 
+	0x49, 0x11, 0x69, 0x49, 0x61, 0x08, 0x98, 0x05, 
+	0x06, 0xc0, 0x0e, 0xc0, 0x49, 0x0e, 0x69, 0x49, 
+	0x61, 0x48, 0x48, 0x0d, 0x69, 0x40, 0x61, 0x86, 
+	0x48, 0x0b, 0x69, 0x40, 0x62, 0x04, 0x98, 0x03, 
+	0x49, 0x09, 0x69, 0x49, 0x62, 0x48, 0xf0, 0x00, 
+	0xfd, 0x18, 0xf0, 0x11, 0xf8, 0x33, 0x20, 0x00, 
+	0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00, 
+	0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x03, 0x32, 0xf4, 
+	0x2e, 0x08, 0x1f, 0xb0, 0xfc, 0x00, 0x00, 0x03, 
+	0xff, 0xff, 0xdf, 0xff, 0xb5, 0xff, 0x9d, 0x09, 
+	0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, 0x0e, 0x12, 
+	0x92, 0x00, 0xb0, 0x93, 0x98, 0x14, 0x90, 0x12, 
+	0x99, 0x15, 0x91, 0x11, 0xaf, 0x0c, 0x1c, 0x38, 
+	0x9a, 0x16, 0xca, 0x5e, 0xc0, 0x5e, 0x68, 0x39, 
+	0x91, 0x04, 0x68, 0x79, 0x91, 0x03, 0x98, 0x12, 
+	0x99, 0x11, 0x42, 0x88, 0xd1, 0x73, 0x99, 0x03, 
+	0x42, 0x8d, 0xd9, 0x71, 0x68, 0xb8, 0x90, 0x01, 
+	0x68, 0xf8, 0x90, 0x02, 0x99, 0x11, 0x6b, 0x48, 
+	0x6a, 0xc9, 0x1a, 0x40, 0x1c, 0x44, 0x99, 0x11, 
+	0x6b, 0x08, 0x6a, 0x89, 0x1a, 0x40, 0x30, 0x01, 
+	0x90, 0x00, 0x98, 0x02, 0x18, 0x28, 0x42, 0xa0, 
+	0xd9, 0x01, 0x1b, 0x61, 0x91, 0x02, 0x9b, 0x17, 
+	0x98, 0x01, 0x18, 0x18, 0x99, 0x00, 0x42, 0x88, 
+	0xd9, 0x03, 0x98, 0x00, 0x9b, 0x17, 0x1a, 0xc0, 
+	0x90, 0x01, 0x98, 0x01, 0x60, 0xb8, 0x98, 0x02, 
+	0x60, 0xf8, 0x98, 0x12, 0x69, 0xc0, 0x90, 0x0a, 
+	0x98, 0x12, 0x6b, 0x80, 0x99, 0x03, 0x43, 0x48, 
+	0x99, 0x04, 0x18, 0x41, 0x91, 0x05, 0x98, 0x12, 
+	0x69, 0x00, 0x00, 0x80, 0x49, 0x48, 0x58, 0x08, 
+	0x99, 0x05, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x12, 
+	0x69, 0x80, 0x99, 0x0b, 0x09, 0x49, 0x18, 0x41, 
+	0x91, 0x07, 0x98, 0x0a, 0x99, 0x02, 0x43, 0x48, 
+	0x90, 0x0b, 0x98, 0x0b, 0x09, 0x40, 0x99, 0x07, 
+	0x18, 0x40, 0x90, 0x06, 0x98, 0x06, 0x0b, 0xc0, 
+	0x99, 0x07, 0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x09, 
+	0x98, 0x09, 0x28, 0x00, 0xd0, 0x56, 0x9e, 0x02, 
+	0x98, 0x06, 0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, 
+	0x91, 0x08, 0x99, 0x08, 0x98, 0x0a, 0xf0, 0x04, 
+	0xf9, 0x17, 0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, 
+	0x34, 0x01, 0x99, 0x03, 0x98, 0x02, 0x18, 0x08, 
+	0x1b, 0x00, 0x60, 0x78, 0x60, 0xfc, 0x98, 0x02, 
+	0x18, 0x28, 0x1b, 0x05, 0x9a, 0x13, 0x1c, 0x29, 
+	0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 
+	0x98, 0x16, 0xf0, 0x00, 0xf8, 0x57, 0xb0, 0x02, 
+	0x1b, 0x36, 0x98, 0x09, 0xe0, 0x01, 0xe0, 0x3c, 
+	0xe0, 0x3b, 0x38, 0x01, 0x90, 0x09, 0x98, 0x09, 
+	0x28, 0x00, 0xd0, 0x1a, 0x98, 0x0a, 0x21, 0x01, 
+	0x03, 0x09, 0xf0, 0x04, 0xf8, 0xf1, 0x1c, 0x04, 
+	0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, 
+	0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, 
+	0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 
+	0x98, 0x16, 0xf0, 0x00, 0xf8, 0x37, 0xb0, 0x02, 
+	0x1b, 0x36, 0x98, 0x09, 0x38, 0x01, 0x90, 0x09, 
+	0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 
+	0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x13, 
+	0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 
+	0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0x22, 
+	0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13, 0x1c, 0x29, 
+	0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 
+	0x98, 0x16, 0xf0, 0x00, 0xf8, 0x17, 0xb0, 0x02, 
+	0xe0, 0x09, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 
+	0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 
+	0xf0, 0x00, 0xf8, 0xb8, 0xb0, 0x02, 0x20, 0x00, 
+	0xb0, 0x14, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xb0, 0x13, 0xb0, 0x01, 0xe7, 0xf8, 
+	0x2e, 0x03, 0x32, 0xf4, 0xb5, 0xff, 0x9d, 0x09, 
+	0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, 0x0e, 0x12, 
+	0x92, 0x00, 0xb0, 0x92, 0x98, 0x13, 0x90, 0x11, 
+	0x99, 0x14, 0x91, 0x10, 0xaf, 0x0b, 0x1c, 0x38, 
+	0x9a, 0x15, 0xca, 0x5e, 0xc0, 0x5e, 0x68, 0x38, 
+	0x90, 0x03, 0x68, 0x78, 0x90, 0x02, 0x68, 0xb8, 
+	0x90, 0x00, 0x68, 0xf9, 0x91, 0x01, 0x98, 0x11, 
+	0x69, 0xc0, 0x90, 0x09, 0x99, 0x10, 0x6b, 0x88, 
+	0x43, 0x68, 0x9b, 0x16, 0x18, 0xc1, 0x91, 0x04, 
+	0x99, 0x10, 0x69, 0x08, 0x00, 0x80, 0x49, 0x42, 
+	0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 0x90, 0x0a, 
+	0x99, 0x10, 0x69, 0x88, 0x99, 0x0a, 0x09, 0x49, 
+	0x18, 0x40, 0x90, 0x06, 0x98, 0x09, 0x99, 0x01, 
+	0x43, 0x48, 0x90, 0x0a, 0x98, 0x0a, 0x09, 0x40, 
+	0x99, 0x06, 0x18, 0x40, 0x90, 0x05, 0x98, 0x05, 
+	0x0b, 0xc0, 0x99, 0x06, 0x0b, 0xc9, 0x1a, 0x40, 
+	0x90, 0x08, 0x98, 0x08, 0x28, 0x00, 0xd0, 0x53, 
+	0x9e, 0x01, 0x98, 0x05, 0x04, 0x40, 0x0c, 0x40, 
+	0x01, 0x41, 0x91, 0x07, 0x99, 0x07, 0x98, 0x09, 
+	0xf0, 0x04, 0xf8, 0x5e, 0x1c, 0x04, 0x2c, 0x00, 
+	0xd1, 0x00, 0x34, 0x01, 0x98, 0x02, 0x99, 0x01, 
+	0x18, 0x40, 0x1b, 0x00, 0x60, 0x78, 0x60, 0xfc, 
+	0x99, 0x01, 0x18, 0x68, 0x1b, 0x05, 0x9a, 0x12, 
+	0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 
+	0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x4a, 
+	0xb0, 0x02, 0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, 
+	0x90, 0x08, 0x98, 0x08, 0x28, 0x00, 0xd0, 0x1a, 
+	0x98, 0x09, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04, 
+	0xf8, 0x3b, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80, 
+	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, 0x32, 0xf4, 0xb5, 0xff, 0xb0, 0x81, 
+	0x98, 0x0b, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 
+	0xb0, 0x8e, 0x9f, 0x0f, 0x9c, 0x10, 0x9a, 0x11, 
+	0x68, 0x10, 0x90, 0x07, 0x9a, 0x11, 0x68, 0x50, 
+	0x90, 0x06, 0x9a, 0x11, 0x68, 0x91, 0x91, 0x08, 
+	0x9a, 0x11, 0x68, 0xd0, 0x90, 0x09, 0x6b, 0x60, 
+	0x6a, 0xe1, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01, 
+	0x6b, 0x20, 0x6a, 0xa1, 0x1a, 0x40, 0x30, 0x01, 
+	0x90, 0x00, 0x99, 0x18, 0x98, 0x09, 0x18, 0x08, 
+	0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01, 
+	0x99, 0x18, 0x1a, 0x41, 0x91, 0x09, 0x9b, 0x12, 
+	0x99, 0x08, 0x18, 0x58, 0x99, 0x00, 0x42, 0x88, 
+	0xd9, 0x03, 0x98, 0x00, 0x9b, 0x12, 0x1a, 0xc1, 
+	0x91, 0x08, 0x22, 0x00, 0x92, 0x05, 0x42, 0xa7, 
+	0xd1, 0x20, 0x99, 0x18, 0x98, 0x06, 0x42, 0x81, 
+	0xd9, 0x0c, 0x22, 0x02, 0x92, 0x05, 0x99, 0x06, 
+	0x98, 0x09, 0x18, 0x08, 0x1e, 0x41, 0x91, 0x06, 
+	0x99, 0x18, 0x98, 0x09, 0x18, 0x08, 0x1e, 0x41, 
+	0x91, 0x18, 0xe0, 0x0f, 0x9b, 0x12, 0x98, 0x07, 
+	0x42, 0x83, 0xd9, 0x0b, 0x22, 0x01, 0x92, 0x05, 
+	0x98, 0x07, 0x99, 0x08, 0x18, 0x40, 0x38, 0x01, 
+	0x90, 0x07, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58, 
+	0x1e, 0x43, 0x93, 0x12, 0x69, 0x38, 0x28, 0x08, 
+	0xd1, 0x0a, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08, 
+	0x98, 0x07, 0x08, 0x40, 0x00, 0x40, 0x90, 0x07, 
+	0x9b, 0x12, 0x08, 0x5b, 0x00, 0x5b, 0x93, 0x12, 
+	0x69, 0x38, 0x00, 0x80, 0x49, 0xc6, 0x58, 0x08, 
+	0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 0x90, 0x03, 
+	0x69, 0x20, 0x00, 0x80, 0x49, 0xc2, 0x58, 0x08, 
+	0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 0x90, 0x02, 
+	0x6b, 0xb8, 0x99, 0x06, 0x43, 0x48, 0x99, 0x07, 
+	0x18, 0x41, 0x91, 0x04, 0x98, 0x03, 0x28, 0x00, 
+	0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 
+	0x69, 0x38, 0x00, 0x80, 0x49, 0xb9, 0x58, 0x08, 
+	0x99, 0x04, 0x1c, 0x06, 0x43, 0x4e, 0x6b, 0xa0, 
+	0x99, 0x18, 0x43, 0x48, 0x9b, 0x12, 0x18, 0xc1, 
+	0x91, 0x04, 0x98, 0x02, 0x28, 0x00, 0xd0, 0x02, 
+	0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x69, 0x20, 
+	0x00, 0x80, 0x49, 0xb0, 0x58, 0x08, 0x99, 0x04, 
+	0x1c, 0x05, 0x43, 0x4d, 0x9a, 0x05, 0x2a, 0x01, 
+	0xd1, 0x3d, 0x69, 0x38, 0x28, 0x08, 0xd0, 0x3a, 
+	0x69, 0x38, 0x28, 0x09, 0xd0, 0x02, 0x69, 0x38, 
+	0x28, 0x0a, 0xd1, 0x0a, 0x36, 0x10, 0x69, 0xb8, 
+	0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x06, 0xf0, 
+	0x0e, 0xc0, 0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0a, 
+	0xe0, 0x0b, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, 
+	0x91, 0x0b, 0x69, 0x38, 0x00, 0x80, 0x49, 0x9f, 
+	0x58, 0x08, 0x19, 0x86, 0x06, 0xf1, 0x0e, 0xc9, 
+	0x91, 0x0a, 0x69, 0x20, 0x28, 0x09, 0xd0, 0x02, 
+	0x69, 0x20, 0x28, 0x0a, 0xd1, 0x0a, 0x35, 0x10, 
+	0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, 
+	0x06, 0xe8, 0x0e, 0xc0, 0x1d, 0xc1, 0x31, 0x01, 
+	0x91, 0x0c, 0xe0, 0x0b, 0x69, 0xa0, 0x09, 0x69, 
+	0x18, 0x41, 0x91, 0x0d, 0x69, 0x20, 0x00, 0x80, 
+	0x49, 0x90, 0x58, 0x08, 0x19, 0x45, 0x06, 0xe9, 
+	0x0e, 0xc9, 0x91, 0x0c, 0xe0, 0x0d, 0x69, 0xb8, 
+	0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0xa0, 
+	0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, 0x06, 0xf1, 
+	0x0e, 0xc9, 0x91, 0x0a, 0x06, 0xe9, 0x0e, 0xc9, 
+	0x91, 0x0c, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x03, 
+	0x99, 0x0b, 0x03, 0x09, 0x0b, 0x09, 0xe0, 0x02, 
+	0x99, 0x0b, 0x02, 0x09, 0x0a, 0x09, 0x91, 0x0b, 
+	0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x03, 0x99, 0x0d, 
+	0x03, 0x09, 0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0d, 
+	0x02, 0x09, 0x0a, 0x09, 0x91, 0x0d, 0xf0, 0x10, 
+	0xfd, 0x79, 0xf0, 0x10, 0xfd, 0x55, 0x48, 0x7a, 
+	0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 
+	0x23, 0x05, 0x43, 0x18, 0x49, 0x76, 0x69, 0x89, 
+	0x60, 0x08, 0x07, 0x40, 0x1c, 0x21, 0x1c, 0x38, 
+	0xf0, 0x00, 0xf8, 0xf8, 0x98, 0x03, 0x28, 0x00, 
+	0xd0, 0x18, 0x98, 0x02, 0x28, 0x00, 0xd0, 0x15, 
+	0x48, 0x6f, 0x69, 0x80, 0x68, 0x00, 0x23, 0x08, 
+	0x43, 0xdb, 0x40, 0x18, 0x49, 0x6c, 0x69, 0x89, 
+	0x60, 0x08, 0x07, 0x00, 0x48, 0x6a, 0x69, 0x80, 
+	0x68, 0x00, 0x4b, 0x6a, 0x40, 0x18, 0x49, 0x68, 
+	0x69, 0x89, 0x60, 0x08, 0x05, 0xc0, 0x99, 0x08, 
+	0x08, 0x49, 0x91, 0x08, 0x6b, 0xf8, 0x49, 0x64, 
+	0x69, 0x89, 0x68, 0x09, 0x4b, 0x64, 0x40, 0x19, 
+	0x07, 0xc0, 0x0c, 0x40, 0x43, 0x08, 0x49, 0x60, 
+	0x69, 0x89, 0x60, 0x08, 0x04, 0x40, 0x0f, 0xc0, 
+	0x6b, 0xe0, 0x49, 0x5d, 0x69, 0x89, 0x68, 0x09, 
+	0x4b, 0x5e, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 
+	0x43, 0x08, 0x49, 0x59, 0x69, 0x89, 0x60, 0x08, 
+	0x04, 0x80, 0x0f, 0xc0, 0x68, 0x38, 0x28, 0x00, 
+	0xd0, 0x0d, 0x79, 0x38, 0x49, 0x54, 0x69, 0x89, 
+	0x68, 0x09, 0x4b, 0x57, 0x40, 0x19, 0x03, 0xc0, 
+	0x43, 0x08, 0x49, 0x51, 0x69, 0x89, 0x60, 0x08, 
+	0x02, 0x40, 0x0e, 0x00, 0xe0, 0x0d, 0x6a, 0x78, 
+	0x78, 0x00, 0x49, 0x4d, 0x69, 0x89, 0x68, 0x09, 
+	0x4b, 0x4f, 0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, 
+	0x49, 0x49, 0x69, 0x89, 0x60, 0x08, 0x02, 0x40, 
+	0x0e, 0x00, 0x69, 0x20, 0x00, 0x80, 0x49, 0x45, 
+	0x58, 0x08, 0x99, 0x08, 0x43, 0x48, 0x28, 0x40, 
+	0xd9, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, 
+	0x1c, 0x08, 0x49, 0x41, 0x69, 0x89, 0x68, 0x09, 
+	0x4b, 0x44, 0x40, 0x19, 0x07, 0xc2, 0x09, 0x52, 
+	0x43, 0x11, 0x4a, 0x3d, 0x69, 0x92, 0x60, 0x11, 
+	0x01, 0x49, 0x0f, 0xc9, 0x49, 0x3a, 0x69, 0x89, 
+	0x68, 0x09, 0x4b, 0x3f, 0x40, 0x19, 0x9a, 0x05, 
+	0x07, 0x92, 0x0f, 0x92, 0x05, 0xd2, 0x43, 0x11, 
+	0x4a, 0x35, 0x69, 0x92, 0x60, 0x11, 0x01, 0xc9, 
+	0x49, 0x33, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x39, 
+	0x40, 0x19, 0x9a, 0x0e, 0x07, 0xd2, 0x09, 0x92, 
+	0x43, 0x11, 0x4a, 0x2f, 0x69, 0x92, 0x60, 0x11, 
+	0x01, 0x89, 0x69, 0xf9, 0x4a, 0x2c, 0x69, 0x52, 
+	0x60, 0x11, 0x49, 0x2b, 0x69, 0x89, 0x68, 0x09, 
+	0x01, 0x49, 0x09, 0x49, 0x9a, 0x0a, 0x06, 0xd2, 
+	0x43, 0x11, 0x4a, 0x27, 0x69, 0x92, 0x60, 0x11, 
+	0x99, 0x0a, 0x4a, 0x25, 0x69, 0x52, 0x60, 0x51, 
+	0x99, 0x0b, 0x4a, 0x23, 0x69, 0x52, 0x60, 0x91, 
+	0x99, 0x0b, 0x4a, 0x21, 0x69, 0x52, 0x60, 0xd1, 
+	0x69, 0xe1, 0x4a, 0x1f, 0x69, 0x52, 0x61, 0x11, 
+	0x49, 0x1d, 0x69, 0xc9, 0x68, 0x09, 0x01, 0x49, 
+	0x09, 0x49, 0x9a, 0x0c, 0x06, 0xd2, 0x43, 0x11, 
+	0x4a, 0x19, 0x69, 0xd2, 0x60, 0x11, 0x99, 0x0c, 
+	0x4a, 0x17, 0x69, 0x52, 0x61, 0x51, 0x99, 0x0d, 
+	0x4a, 0x15, 0x69, 0x52, 0x61, 0x91, 0x99, 0x0d, 
+	0x4a, 0x13, 0x69, 0x52, 0x61, 0xd1, 0x99, 0x09, 
+	0x4a, 0x11, 0x69, 0x52, 0x62, 0x51, 0x99, 0x08, 
+	0x4a, 0x0f, 0x69, 0x52, 0x62, 0x11, 0x68, 0x38, 
+	0x28, 0x00, 0xd0, 0x05, 0x48, 0x14, 0x68, 0x01, 
+	0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x02, 
+	0x48, 0x11, 0x21, 0x00, 0x60, 0x01, 0xf0, 0x00, 
+	0xf9, 0x8c, 0xf0, 0x10, 0xfc, 0xa7, 0x20, 0x00, 
+	0xb0, 0x0f, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xb0, 0x0e, 0xb0, 0x01, 0xe7, 0xf8, 
+	0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x03, 0x32, 0xf4, 
+	0x2e, 0x08, 0x1f, 0xb0, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, 
+	0xff, 0x80, 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xff, 
+	0xfe, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 
+	0x68, 0x00, 0x00, 0x40, 0xb4, 0x80, 0x1c, 0x07, 
+	0x1c, 0x0a, 0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, 
+	0x58, 0x08, 0x23, 0x18, 0x40, 0x18, 0x08, 0xc0, 
+	0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x23, 0xc0, 
+	0x43, 0xdb, 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 
+	0x01, 0x80, 0x43, 0x08, 0x49, 0x35, 0x69, 0x89, 
+	0x60, 0x08, 0x06, 0x00, 0x0f, 0x80, 0x69, 0x38, 
+	0x00, 0x80, 0x49, 0x31, 0x58, 0x08, 0x23, 0x04, 
+	0x40, 0x18, 0x08, 0x80, 0x49, 0x2f, 0x69, 0x89, 
+	0x68, 0x09, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x19, 
+	0x07, 0xc0, 0x0f, 0x00, 0x43, 0x08, 0x49, 0x2b, 
+	0x69, 0x89, 0x60, 0x08, 0x07, 0x00, 0x0f, 0xc0, 
+	0x69, 0x38, 0x00, 0x80, 0x49, 0x26, 0x58, 0x08, 
+	0x49, 0x26, 0x69, 0x89, 0x68, 0x09, 0x23, 0x30, 
+	0x43, 0xdb, 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 
+	0x01, 0x00, 0x43, 0x08, 0x49, 0x21, 0x69, 0x89, 
+	0x60, 0x08, 0x06, 0x80, 0x0f, 0x80, 0x69, 0x10, 
+	0x00, 0x80, 0x49, 0x1d, 0x58, 0x08, 0x23, 0x18, 
+	0x40, 0x18, 0x08, 0xc0, 0x49, 0x1b, 0x69, 0x89, 
+	0x68, 0x09, 0x4b, 0x1b, 0x40, 0x19, 0x07, 0x80, 
+	0x0f, 0x80, 0x02, 0xc0, 0x43, 0x08, 0x49, 0x17, 
+	0x69, 0x89, 0x60, 0x08, 0x04, 0xc0, 0x0f, 0x80, 
+	0x69, 0x10, 0x00, 0x80, 0x49, 0x12, 0x58, 0x08, 
+	0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 0x49, 0x11, 
+	0x69, 0x89, 0x68, 0x09, 0x4b, 0x11, 0x40, 0x19, 
+	0x07, 0xc0, 0x0d, 0xc0, 0x43, 0x08, 0x49, 0x0d, 
+	0x69, 0x89, 0x60, 0x08, 0x05, 0xc0, 0x0f, 0xc0, 
+	0x69, 0x10, 0x00, 0x80, 0x49, 0x08, 0x58, 0x08, 
+	0x49, 0x08, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x0a, 
+	0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0x40, 
+	0x43, 0x08, 0x49, 0x04, 0x69, 0x89, 0x60, 0x08, 
+	0x05, 0x40, 0x0f, 0x80, 0xbc, 0x80, 0x47, 0x70, 
+	0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x08, 0x1f, 0xb0, 
+	0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xfe, 0xff, 
+	0xff, 0xff, 0xf9, 0xff, 0xb4, 0xb0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x1c, 0x15, 0x2d, 0x00, 0xd0, 0x06, 
+	0x2d, 0x02, 0xd0, 0x21, 0x2d, 0x03, 0xd0, 0x02, 
+	0x2d, 0x04, 0xd0, 0x1d, 0xe0, 0xa3, 0x69, 0x20, 
+	0x28, 0x0b, 0xd2, 0x14, 0xa3, 0x01, 0x5c, 0x1b, 
+	0x00, 0x5b, 0x44, 0x9f, 0x05, 0x07, 0x09, 0x0b, 
+	0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0e, 0x0e, 0x00, 
+	0x07, 0xff, 0xe0, 0x09, 0x07, 0xbf, 0xe0, 0x07, 
+	0x07, 0x3f, 0xe0, 0x05, 0x06, 0x3f, 0xe0, 0x03, 
+	0xe0, 0x02, 0x02, 0x3f, 0xe0, 0x00, 0xe7, 0xff, 
+	0x48, 0x46, 0x6a, 0x00, 0x60, 0x07, 0xe0, 0x86, 
+	0x69, 0x20, 0x28, 0x0b, 0xd2, 0x73, 0xa3, 0x02, 
+	0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
+	0x06, 0x15, 0x24, 0x33, 0x06, 0x15, 0x24, 0x33, 
+	0x41, 0x45, 0x45, 0x00, 0x01, 0xff, 0x48, 0x3d, 
+	0x6a, 0x40, 0x68, 0x00, 0x4b, 0x3c, 0x40, 0x18, 
+	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, 0xb0, 
+	0xff, 0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, 
+	0xfc, 0x03, 0xff, 0xff, 0xb4, 0x80, 0x1c, 0x07, 
+	0x1c, 0x0a, 0x69, 0x38, 0x28, 0x0b, 0xd2, 0x1a, 
+	0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 
+	0x05, 0x08, 0x0b, 0x0e, 0x05, 0x08, 0x0b, 0x0e, 
+	0x11, 0x13, 0x13, 0x00, 0x68, 0x10, 0x0f, 0xc1, 
+	0xe0, 0x0f, 0x68, 0x10, 0x0f, 0x81, 0xe0, 0x0c, 
+	0x68, 0x10, 0x0f, 0x01, 0xe0, 0x09, 0x68, 0x10, 
+	0x0e, 0x01, 0xe0, 0x06, 0x68, 0x11, 0xe0, 0x04, 
+	0x68, 0x10, 0x0a, 0x01, 0xe0, 0x01, 0x68, 0x11, 
+	0xe7, 0xff, 0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, 
+	0xe7, 0xfc, 0x48, 0x14, 0x69, 0x80, 0x68, 0x00, 
+	0x49, 0x12, 0x6a, 0x89, 0x60, 0x08, 0x48, 0x11, 
+	0x69, 0xc0, 0x68, 0x00, 0x49, 0x0f, 0x6a, 0xc9, 
+	0x60, 0x08, 0x48, 0x0e, 0x6a, 0x00, 0x68, 0x00, 
+	0x49, 0x0c, 0x6b, 0x09, 0x60, 0x08, 0x48, 0x0b, 
+	0x6a, 0x40, 0x68, 0x00, 0x49, 0x09, 0x6b, 0x49, 
+	0x60, 0x08, 0x20, 0x01, 0x49, 0x07, 0x6b, 0xc9, 
+	0x60, 0x08, 0x20, 0x00, 0x49, 0x06, 0x60, 0x08, 
+	0x20, 0x00, 0x49, 0x05, 0x60, 0x48, 0x20, 0x00, 
+	0x49, 0x03, 0x60, 0x88, 0x20, 0x00, 0x49, 0x02, 
+	0x60, 0xc8, 0x47, 0x70, 0x2e, 0x08, 0x1f, 0xb0, 
+	0x2e, 0x08, 0x1f, 0xb4, 0xb4, 0x90, 0x1c, 0x01, 
+	0x29, 0x00, 0xd1, 0x02, 0x20, 0x8d, 0xbc, 0x90, 
+	0x47, 0x70, 0x4c, 0x08, 0x1c, 0x0f, 0x22, 0x00, 
+	0x23, 0xff, 0x33, 0x01, 0x42, 0x9a, 0xd3, 0x02, 
+	0xe0, 0x04, 0x32, 0x01, 0xe7, 0xf8, 0xcf, 0x08, 
+	0xc4, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0xee, 
+	0xe7, 0xed, 0x00, 0x00, 0x68, 0x00, 0x18, 0x00, 
+	0xb4, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, 
+	0x06, 0x1a, 0x0e, 0x12, 0x1c, 0x21, 0x60, 0x0f, 
+	0x71, 0x0a, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, 
+	0xe7, 0xfc, 0x00, 0x00, 0xb5, 0x00, 0x48, 0x1d, 
+	0x69, 0x00, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x19, 
+	0x48, 0x1a, 0x69, 0x00, 0x23, 0x02, 0x40, 0x18, 
+	0xd0, 0x09, 0x48, 0x18, 0x69, 0x40, 0x49, 0x18, 
+	0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x17, 
+	0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x00, 
+	0x49, 0x14, 0x68, 0x09, 0x70, 0x08, 0x48, 0x14, 
+	0x78, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x07, 
+	0xfb, 0x43, 0xe0, 0x18, 0x48, 0x11, 0x6a, 0x80, 
+	0x23, 0x02, 0x40, 0x18, 0xd0, 0x13, 0x48, 0x0f, 
+	0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 
+	0x20, 0xfe, 0x49, 0x0d, 0x68, 0x09, 0x70, 0x08, 
+	0xe0, 0x03, 0x20, 0x0e, 0x49, 0x0a, 0x68, 0x09, 
+	0x70, 0x08, 0x48, 0x0a, 0x78, 0x01, 0x20, 0x01, 
+	0x40, 0x88, 0xf0, 0x07, 0xfb, 0x29, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x00, 
+	0x2e, 0x08, 0x7c, 0x34, 0x2e, 0x08, 0x7c, 0x38, 
+	0x2e, 0x08, 0x7c, 0x3c, 0x6e, 0x00, 0x0e, 0x00, 
+	0x2e, 0x08, 0x7c, 0x40, 0x2e, 0x08, 0x7c, 0x44, 
+	0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, 
+	0x06, 0x2e, 0x0e, 0x36, 0x2e, 0x1f, 0xdd, 0x03, 
+	0x20, 0xaf, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x49, 0x08, 0x20, 0x0d, 0xf0, 0x07, 0xfb, 0x1a, 
+	0x48, 0x07, 0x60, 0x04, 0x20, 0x00, 0x49, 0x06, 
+	0x68, 0x09, 0x70, 0x08, 0x48, 0x05, 0x60, 0x07, 
+	0x48, 0x05, 0x70, 0x06, 0x20, 0x00, 0xe7, 0xec, 
+	0xe7, 0xeb, 0x00, 0x00, 0x2e, 0x01, 0x4c, 0xd1, 
+	0x2e, 0x08, 0x7c, 0x38, 0x2e, 0x08, 0x7c, 0x34, 
+	0x2e, 0x08, 0x7c, 0x3c, 0xb5, 0xb0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x06, 0x25, 0x0e, 0x2d, 0x2d, 0x1f, 
+	0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x49, 0x07, 0x20, 0x0d, 0xf0, 0x07, 
+	0xfa, 0xf5, 0x48, 0x06, 0x60, 0x07, 0x20, 0x00, 
+	0x49, 0x04, 0x68, 0x09, 0x70, 0x08, 0x48, 0x04, 
+	0x70, 0x05, 0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, 
+	0x2e, 0x01, 0x4c, 0xd1, 0x2e, 0x08, 0x7c, 0x40, 
+	0x2e, 0x08, 0x7c, 0x44, 0xb4, 0xb0, 0x1c, 0x01, 
+	0x4a, 0x35, 0x23, 0x01, 0x60, 0x13, 0x4a, 0x35, 
+	0x1c, 0x0f, 0x68, 0x3d, 0xc2, 0x20, 0x88, 0x8d, 
+	0xc2, 0x20, 0x88, 0xcb, 0x60, 0x13, 0x68, 0x8c, 
+	0x2c, 0x00, 0xd0, 0x57, 0x4a, 0x30, 0x1c, 0x27, 
+	0x20, 0x00, 0x28, 0x13, 0xdb, 0x02, 0xe0, 0x04, 
+	0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 
+	0xe7, 0xfa, 0x4a, 0x2c, 0x1d, 0xe7, 0x37, 0x45, 
+	0x20, 0x00, 0x28, 0x0b, 0xdb, 0x02, 0xe0, 0x04, 
+	0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 
+	0xe7, 0xfa, 0x4a, 0x27, 0x1d, 0xe7, 0x37, 0x71, 
+	0x20, 0x00, 0x28, 0x07, 0xdb, 0x02, 0xe0, 0x04, 
+	0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 
+	0xe7, 0xfa, 0x4a, 0x22, 0x1d, 0xe7, 0x37, 0x8d, 
+	0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 
+	0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 
+	0xe7, 0xfa, 0x4a, 0x1d, 0x1d, 0xe7, 0x37, 0xb1, 
+	0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 
+	0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 
+	0xe7, 0xfa, 0x68, 0x0d, 0x23, 0x01, 0x02, 0x9b, 
+	0x40, 0x2b, 0xd0, 0x17, 0x4a, 0x15, 0x1d, 0xe7, 
+	0x37, 0xd5, 0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, 
+	0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 
+	0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x10, 0x1d, 0xe7, 
+	0x37, 0xf9, 0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, 
+	0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 
+	0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x02, 0x23, 0x00, 
+	0x60, 0x13, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, 
+	0x6e, 0x00, 0x0c, 0x0c, 0x6e, 0x00, 0x0c, 0x00, 
+	0x6e, 0x00, 0x08, 0x00, 0x6e, 0x00, 0x08, 0x50, 
+	0x6e, 0x00, 0x08, 0x80, 0x6e, 0x00, 0x08, 0xa0, 
+	0x6e, 0x00, 0x08, 0xd0, 0x6e, 0x00, 0x09, 0x00, 
+	0x6e, 0x00, 0x09, 0x30, 0xb4, 0xf0, 0x1c, 0x01, 
+	0x69, 0x08, 0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x01, 
+	0xdb, 0x04, 0x69, 0x08, 0x06, 0xc0, 0x0e, 0xc0, 
+	0x28, 0x0a, 0xdd, 0x02, 0x20, 0xc3, 0xbc, 0xf0, 
+	0x47, 0x70, 0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, 
+	0x28, 0x01, 0xdb, 0x04, 0x69, 0x08, 0x05, 0x80, 
+	0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x01, 0x20, 0xc4, 
+	0xe7, 0xf1, 0x48, 0x4f, 0x6a, 0x80, 0x07, 0xc0, 
+	0x0f, 0xc0, 0xd1, 0x01, 0x20, 0xc0, 0xe7, 0xea, 
+	0x68, 0x08, 0x07, 0x00, 0x0f, 0xc0, 0x4b, 0x4b, 
+	0x70, 0x18, 0x4f, 0x49, 0x1c, 0x0c, 0x22, 0x00, 
+	0x2a, 0x04, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 
+	0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 
+	0x4f, 0x45, 0x69, 0x08, 0x06, 0xc0, 0x0e, 0xc0, 
+	0x00, 0x43, 0x18, 0x18, 0x38, 0x03, 0x69, 0x0b, 
+	0x05, 0x9b, 0x0e, 0xde, 0x00, 0x73, 0x19, 0x9b, 
+	0x3b, 0x03, 0x01, 0x5b, 0x43, 0x18, 0x60, 0x38, 
+	0x4f, 0x3e, 0x69, 0x48, 0x60, 0x38, 0x4f, 0x3e, 
+	0x69, 0x88, 0x05, 0x40, 0x0d, 0x40, 0x69, 0x8b, 
+	0x02, 0x9b, 0x0d, 0x5b, 0x02, 0xdb, 0x43, 0x18, 
+	0x60, 0x38, 0x69, 0xcd, 0x2d, 0x00, 0xd0, 0x63, 
+	0x4f, 0x38, 0x1c, 0x2c, 0x22, 0x00, 0x2a, 0x09, 
+	0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 
+	0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x34, 
+	0x1d, 0xec, 0x34, 0x1d, 0x22, 0x00, 0x2a, 0x09, 
+	0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 
+	0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x2f, 
+	0x1d, 0xec, 0x34, 0x41, 0x22, 0x00, 0x2a, 0x09, 
+	0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 
+	0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x2a, 
+	0x1d, 0xec, 0x34, 0x65, 0x22, 0x00, 0x2a, 0x09, 
+	0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 
+	0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x25, 
+	0x1d, 0xec, 0x34, 0x89, 0x22, 0x00, 0x2a, 0x05, 
+	0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 
+	0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x20, 
+	0x1d, 0xec, 0x34, 0x9d, 0x22, 0x00, 0x2a, 0x05, 
+	0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 
+	0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x68, 0x08, 
+	0x23, 0x01, 0x02, 0x9b, 0x40, 0x18, 0xd0, 0x17, 
+	0x4f, 0x18, 0x1d, 0xec, 0x34, 0xb1, 0x22, 0x00, 
+	0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 
+	0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 
+	0x4f, 0x13, 0x1d, 0xec, 0x34, 0xc5, 0x22, 0x00, 
+	0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 
+	0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 
+	0x20, 0x00, 0xe7, 0x54, 0xe7, 0x53, 0x00, 0x00, 
+	0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0x7c, 0x45, 
+	0x6e, 0x00, 0x0e, 0x10, 0x6e, 0x00, 0x0e, 0x14, 
+	0x6e, 0x00, 0x0e, 0x18, 0x6e, 0x00, 0x0a, 0x00, 
+	0x6e, 0x00, 0x0a, 0x24, 0x6e, 0x00, 0x0a, 0x48, 
+	0x6e, 0x00, 0x0a, 0x90, 0x6e, 0x00, 0x0a, 0xc0, 
+	0x6e, 0x00, 0x0a, 0xe4, 0x6e, 0x00, 0x09, 0xc0, 
+	0x6e, 0x00, 0x09, 0xe4, 0x1c, 0x01, 0x48, 0x0c, 
+	0x78, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, 
+	0x47, 0x70, 0x48, 0x0a, 0x6a, 0x80, 0x07, 0xc0, 
+	0x0f, 0xc0, 0xd1, 0x01, 0x20, 0xc0, 0xe7, 0xf7, 
+	0x20, 0x00, 0x4b, 0x06, 0x61, 0x58, 0x4a, 0x06, 
+	0x68, 0x08, 0x60, 0x10, 0x4a, 0x05, 0x68, 0x48, 
+	0x60, 0x10, 0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, 
+	0x2e, 0x08, 0x7c, 0x45, 0x6e, 0x00, 0x0e, 0x00, 
+	0x6e, 0x00, 0x0e, 0x20, 0x6e, 0x00, 0x0e, 0x24, 
+	0x48, 0x09, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x01, 
+	0x20, 0xc1, 0x47, 0x70, 0x48, 0x07, 0x6a, 0x80, 
+	0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xc2, 
+	0xe7, 0xf7, 0x20, 0x01, 0x49, 0x03, 0x61, 0x48, 
+	0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0x45, 0x6e, 0x00, 0x0e, 0x00, 
+	0xb5, 0xff, 0x1c, 0x04, 0x1c, 0x0d, 0x1c, 0x17, 
+	0x9e, 0x09, 0x20, 0x00, 0x60, 0x30, 0x48, 0x13, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x07, 0x9b, 0x03, 
+	0x2b, 0x00, 0xd1, 0x04, 0x20, 0x8a, 0xb0, 0x04, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x23, 0xff, 
+	0x33, 0x01, 0x42, 0x9c, 0xdd, 0x01, 0x20, 0x87, 
+	0xe7, 0xf5, 0x19, 0x28, 0x23, 0xff, 0x33, 0x01, 
+	0x42, 0x98, 0xd9, 0x01, 0x20, 0x88, 0xe7, 0xee, 
+	0x68, 0x79, 0x1c, 0x20, 0x80, 0x48, 0x70, 0x0d, 
+	0x9b, 0x03, 0x60, 0x4b, 0x68, 0x78, 0x60, 0xc8, 
+	0x68, 0x38, 0x60, 0x88, 0x60, 0x31, 0x20, 0x00, 
+	0xe7, 0xe1, 0xe7, 0xe0, 0x2e, 0x08, 0x60, 0x8c, 
+	0x1c, 0x03, 0x1c, 0x0a, 0x1c, 0x19, 0x68, 0xc8, 
+	0x60, 0x50, 0x68, 0x88, 0x60, 0x10, 0x20, 0x00, 
+	0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0xb0, 0x87, 
+	0x21, 0x00, 0x91, 0x06, 0x26, 0x00, 0x98, 0x07, 
+	0xf0, 0x00, 0xfa, 0xcb, 0x90, 0x03, 0x9c, 0x07, 
+	0x9d, 0x08, 0x88, 0x69, 0x91, 0x04, 0x98, 0x03, 
+	0x99, 0x04, 0x42, 0x88, 0xd0, 0x09, 0x48, 0xbb, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x05, 0x20, 0xff, 
+	0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x78, 0x28, 0x90, 0x05, 0x99, 0x04, 
+	0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdd, 0x02, 
+	0x20, 0xff, 0xb0, 0x07, 0xe7, 0xf1, 0x98, 0x05, 
+	0x99, 0x04, 0x18, 0x40, 0x23, 0xff, 0x33, 0x01, 
+	0x42, 0x98, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07, 
+	0xe7, 0xe7, 0x48, 0xad, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x0a, 0x68, 0xa0, 0x23, 0x01, 0x06, 0x1b, 
+	0x40, 0x18, 0xd0, 0x05, 0x68, 0x68, 0x28, 0x00, 
+	0xd1, 0x02, 0x20, 0x8a, 0xb0, 0x07, 0xe7, 0xd8, 
+	0x62, 0x65, 0x69, 0x60, 0x4b, 0xa5, 0x40, 0x18, 
+	0x99, 0x05, 0x06, 0x09, 0x0e, 0x09, 0x04, 0x09, 
+	0x43, 0x08, 0x61, 0x60, 0x02, 0x00, 0x68, 0xe0, 
+	0x90, 0x00, 0x48, 0x9e, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x06, 0x98, 0x00, 0x28, 0x19, 0xd3, 0x01, 
+	0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 
+	0x98, 0x00, 0x28, 0x08, 0xd3, 0x01, 0x20, 0x01, 
+	0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 
+	0x20, 0x00, 0xb0, 0x07, 0xe7, 0xb5, 0x48, 0x94, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x1e, 0x48, 0x91, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x1a, 0x68, 0xa0, 
+	0x02, 0x00, 0x0e, 0x00, 0x06, 0x01, 0x0e, 0x09, 
+	0x91, 0x06, 0x99, 0x04, 0x29, 0x04, 0xd0, 0x06, 
+	0x29, 0x10, 0xd0, 0x07, 0x23, 0xff, 0x33, 0x01, 
+	0x42, 0x99, 0xd0, 0x06, 0xe0, 0x08, 0x26, 0xff, 
+	0x36, 0x01, 0xe0, 0x07, 0x26, 0x01, 0x02, 0x76, 
+	0xe0, 0x04, 0x26, 0x03, 0x02, 0x36, 0xe0, 0x01, 
+	0x26, 0x00, 0xe7, 0xff, 0x49, 0x84, 0x20, 0x91, 
+	0xf0, 0x0f, 0xff, 0xa8, 0x28, 0x92, 0xd0, 0x03, 
+	0x20, 0x01, 0xf0, 0x01, 0xff, 0xb1, 0xe7, 0xf5, 
+	0x98, 0x00, 0x00, 0x80, 0x49, 0x7f, 0x58, 0x08, 
+	0x99, 0x07, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 
+	0x49, 0x7b, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x07, 
+	0xe7, 0x7b, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x73, 0x48, 0x74, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x6f, 0x98, 0x00, 0xf0, 0x02, 0xfe, 0xd6, 
+	0x28, 0x00, 0xd0, 0x6a, 0xb0, 0x82, 0x49, 0x74, 
+	0x20, 0x91, 0xf0, 0x0f, 0xff, 0x83, 0x28, 0x92, 
+	0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02, 0xff, 0x25, 
+	0x20, 0x92, 0x49, 0x6f, 0x60, 0x08, 0x20, 0x01, 
+	0x49, 0x6e, 0x68, 0x09, 0x60, 0x08, 0x27, 0x00, 
+	0x20, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 
+	0xd1, 0x15, 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe0, 
+	0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 
+	0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x65, 
+	0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 
+	0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x01, 
+	0x20, 0x01, 0x90, 0x00, 0xe7, 0xe6, 0x98, 0x00, 
+	0x28, 0x00, 0xd1, 0x14, 0x2f, 0x18, 0xd2, 0x12, 
+	0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 
+	0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x59, 
+	0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 
+	0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x01, 
+	0x20, 0x01, 0x90, 0x00, 0xe7, 0xe7, 0x3f, 0x01, 
+	0x2f, 0x07, 0xd2, 0x10, 0x00, 0xb8, 0x19, 0xc0, 
+	0x00, 0xc0, 0x49, 0x50, 0x68, 0x09, 0x18, 0x40, 
+	0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x1c, 0x21, 
+	0xf0, 0x02, 0xfb, 0x38, 0x48, 0x4b, 0x68, 0x00, 
+	0xf0, 0x02, 0xfe, 0xee, 0xe0, 0x46, 0x2f, 0x18, 
+	0xd2, 0x44, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x47, 
+	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
+	0x38, 0x0a, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x26, 
+	0x20, 0x4c, 0x43, 0x78, 0x49, 0x41, 0x68, 0x09, 
+	0xe0, 0x00, 0xe0, 0x48, 0x18, 0x40, 0x38, 0xff, 
+	0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 
+	0xd0, 0x17, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x3b, 
+	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
+	0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 
+	0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x35, 
+	0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 
+	0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 
+	0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, 
+	0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 
+	0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 
+	0x20, 0x03, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x29, 
+	0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 
+	0x39, 0x82, 0x67, 0x48, 0x49, 0x24, 0x20, 0x91, 
+	0xf0, 0x0f, 0xfe, 0xe4, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0x48, 0x22, 0x68, 0x00, 0x90, 0x01, 
+	0x48, 0x21, 0x68, 0x00, 0x49, 0x1f, 0x60, 0x08, 
+	0x98, 0x01, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x92, 
+	0x49, 0x1b, 0x60, 0x08, 0xb0, 0x02, 0x48, 0x15, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x1d, 0x98, 0x00, 
+	0x01, 0x00, 0x4b, 0x1a, 0x18, 0xc1, 0x91, 0x01, 
+	0x1d, 0xe0, 0x30, 0x0d, 0x90, 0x02, 0x98, 0x02, 
+	0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x48, 0x0e, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x0d, 0x68, 0x68, 
+	0x08, 0x80, 0x99, 0x06, 0x00, 0x89, 0x4b, 0x12, 
+	0x18, 0xc9, 0x67, 0x08, 0x98, 0x05, 0x43, 0x30, 
+	0x99, 0x06, 0x00, 0x89, 0x4b, 0x0f, 0x18, 0xc9, 
+	0x61, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 
+	0x20, 0x00, 0xb0, 0x07, 0xe6, 0x91, 0xb0, 0x07, 
+	0xe6, 0x8f, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x60, 0x8c, 0xff, 0x00, 0xff, 0xff, 
+	0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, 
+	0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xbc, 
+	0x2e, 0x08, 0x7d, 0xc0, 0x68, 0x00, 0x0c, 0x00, 
+	0x68, 0x00, 0x0e, 0x00, 0x68, 0x00, 0x0e, 0x80, 
+	0x1c, 0x01, 0x1c, 0x0a, 0x6a, 0x53, 0x1c, 0x18, 
+	0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, 
+	0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, 
+	0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 
+	0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01, 
+	0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, 
+	0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee, 
+	0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 
+	0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 
+	0x49, 0x1c, 0x20, 0x91, 0xf0, 0x0f, 0xfe, 0x66, 
+	0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 
+	0xfe, 0x6f, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, 
+	0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, 
+	0x35, 0x01, 0xe7, 0xfa, 0xcf, 0x01, 0x19, 0x71, 
+	0x00, 0x89, 0x4b, 0x13, 0x18, 0xc9, 0x60, 0x08, 
+	0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, 
+	0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, 
+	0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc1, 0x9a, 0x00, 
+	0x1c, 0x38, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0xfe, 
+	0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, 
+	0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, 
+	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 
+	0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x7c, 0xcc, 
+	0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0xd0, 0x21, 0x04, 0xe0, 0x00, 
+	0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, 
+	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, 0xfd, 0xfc, 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, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x08, 0x00, 
+	0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xd0, 
+	0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 
+	0x9c, 0x00, 0x88, 0x66, 0x42, 0xb5, 0xdd, 0x04, 
+	0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x78, 0x20, 0x19, 0x40, 0x06, 0x07, 
+	0x0e, 0x3f, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 
+	0xdd, 0x01, 0x20, 0xff, 0xe7, 0xf1, 0x49, 0x0a, 
+	0x20, 0x91, 0xf0, 0x0f, 0xfd, 0xa3, 0x28, 0x92, 
+	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0xac, 
+	0xe7, 0xf5, 0x99, 0x01, 0x00, 0xb8, 0x4b, 0x05, 
+	0x18, 0xc0, 0x60, 0x01, 0x20, 0x92, 0x49, 0x02, 
+	0x60, 0x08, 0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, 
+	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x08, 0x00, 
+	0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 
+	0x9f, 0x00, 0x88, 0x7d, 0x78, 0x38, 0x19, 0x00, 
+	0x06, 0x06, 0x0e, 0x36, 0x42, 0xac, 0xdd, 0x04, 
+	0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0x49, 0x0b, 0x20, 0x91, 0xf0, 0x0f, 
+	0xfd, 0x79, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
+	0xf0, 0x01, 0xfd, 0x82, 0xe7, 0xf5, 0x00, 0xb0, 
+	0x4b, 0x06, 0x18, 0xc0, 0x68, 0x00, 0x99, 0x01, 
+	0x60, 0x08, 0x20, 0x92, 0x49, 0x02, 0x60, 0x08, 
+	0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x08, 0x00, 
+	0x1c, 0x01, 0x1c, 0x0a, 0x88, 0x50, 0x47, 0x70, 
+	0xe7, 0xfd, 0xb4, 0x80, 0x1c, 0x01, 0x1c, 0x0f, 
+	0x69, 0x3a, 0x2a, 0x08, 0xd2, 0x12, 0xa3, 0x02, 
+	0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
+	0x04, 0x07, 0x09, 0x0b, 0x04, 0x07, 0x09, 0x0b, 
+	0x20, 0x02, 0xbc, 0x80, 0x47, 0x70, 0x20, 0x04, 
+	0xe7, 0xfb, 0x20, 0x10, 0xe7, 0xf9, 0x20, 0xff, 
+	0x30, 0x01, 0xe7, 0xf6, 0x20, 0x00, 0xe7, 0xf4, 
+	0xe7, 0xf3, 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x05, 
+	0x0e, 0x2d, 0x48, 0x89, 0x68, 0x00, 0x28, 0x00, 
+	0xd1, 0x04, 0x20, 0x8b, 0xb0, 0x02, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x48, 0x85, 0x68, 0x00, 
+	0x28, 0x01, 0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, 
+	0x20, 0x8c, 0xe7, 0xf3, 0xe0, 0xfe, 0x2d, 0x07, 
+	0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xee, 0x49, 0x80, 
+	0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x23, 0x28, 0x92, 
+	0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x2c, 
+	0xe7, 0xf5, 0x1c, 0x28, 0xf7, 0xf8, 0xfc, 0xd8, 
+	0x1c, 0x04, 0x2c, 0x00, 0xd0, 0x09, 0x68, 0xa0, 
+	0x4b, 0x78, 0x40, 0x18, 0x99, 0x01, 0x07, 0xc9, 
+	0x09, 0xc9, 0x43, 0x08, 0x60, 0xa0, 0x01, 0xc0, 
+	0xe0, 0x04, 0x20, 0x92, 0x49, 0x72, 0x60, 0x08, 
+	0x20, 0xff, 0xe7, 0xcf, 0x48, 0x6f, 0x68, 0x00, 
+	0x28, 0x00, 0xd1, 0x11, 0x99, 0x01, 0x29, 0x00, 
+	0xd0, 0x06, 0x48, 0x6f, 0x21, 0x01, 0x40, 0xa9, 
+	0x68, 0x02, 0x43, 0x11, 0x60, 0x01, 0xe0, 0x06, 
+	0x48, 0x6b, 0x21, 0x01, 0x40, 0xa9, 0x43, 0xc9, 
+	0x68, 0x02, 0x40, 0x11, 0x60, 0x01, 0xe0, 0xbf, 
+	0x68, 0xe0, 0xf0, 0x02, 0xfc, 0x3b, 0x28, 0x00, 
+	0xd0, 0x73, 0xb0, 0x81, 0x49, 0x65, 0x20, 0x91, 
+	0xf0, 0x0f, 0xfc, 0xe8, 0x28, 0x92, 0xd0, 0x00, 
+	0xe7, 0xf8, 0xf0, 0x02, 0xfc, 0x8a, 0x20, 0x92, 
+	0x49, 0x60, 0x60, 0x08, 0x20, 0x01, 0x49, 0x60, 
+	0x68, 0x09, 0x60, 0x08, 0x27, 0x00, 0x26, 0x00, 
+	0x2e, 0x00, 0xd1, 0x14, 0x2f, 0x07, 0xd2, 0x12, 
+	0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 
+	0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 
+	0x4a, 0x57, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 
+	0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 
+	0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe8, 0x2e, 0x00, 
+	0xd1, 0x13, 0x2f, 0x18, 0xd2, 0x11, 0x6a, 0xe0, 
+	0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 
+	0x23, 0x4c, 0x43, 0x58, 0x4a, 0x4c, 0x68, 0x12, 
+	0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 
+	0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, 
+	0xe7, 0xe9, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x32, 
+	0x99, 0x02, 0x29, 0x00, 0xd0, 0x16, 0x00, 0xb8, 
+	0x19, 0xc0, 0x00, 0xc0, 0x49, 0x42, 0x68, 0x09, 
+	0x18, 0x40, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 
+	0x6e, 0x80, 0x4b, 0x40, 0x43, 0x18, 0x00, 0xb9, 
+	0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x3c, 0x68, 0x12, 
+	0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 
+	0x66, 0x88, 0xe0, 0x17, 0x00, 0xb8, 0x19, 0xc0, 
+	0x00, 0xc0, 0x49, 0x37, 0x68, 0x09, 0x18, 0x40, 
+	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, 
+	0x04, 0x00, 0x0c, 0x00, 0x00, 0xb9, 0x19, 0xc9, 
+	0x00, 0xc9, 0x4a, 0x31, 0x68, 0x12, 0x18, 0x89, 
+	0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 
+	0xe0, 0x00, 0xe0, 0x45, 0xe0, 0x2b, 0x99, 0x02, 
+	0x29, 0x00, 0xd0, 0x14, 0x20, 0x4c, 0x43, 0x78, 
+	0x49, 0x29, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 
+	0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x4b, 0x27, 
+	0x43, 0x18, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x24, 
+	0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 
+	0x39, 0x02, 0x60, 0x08, 0xe0, 0x13, 0x20, 0x4c, 
+	0x43, 0x78, 0x49, 0x1f, 0x68, 0x09, 0x18, 0x40, 
+	0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 
+	0x04, 0x00, 0x0c, 0x00, 0x21, 0x4c, 0x43, 0x79, 
+	0x4a, 0x19, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 
+	0x39, 0xff, 0x39, 0x02, 0x60, 0x08, 0x48, 0x16, 
+	0x68, 0x00, 0xf0, 0x02, 0xfc, 0x05, 0x49, 0x13, 
+	0x20, 0x91, 0xf0, 0x0f, 0xfc, 0x43, 0x28, 0x92, 
+	0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x10, 0x68, 0x00, 
+	0x90, 0x00, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0e, 
+	0x60, 0x08, 0x98, 0x00, 0x49, 0x0e, 0x60, 0x08, 
+	0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, 0xb0, 0x01, 
+	0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 
+	0xe6, 0xf4, 0xe6, 0xf3, 0xe6, 0xf2, 0x00, 0x00, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xcc, 0xfe, 0xff, 0xff, 0xff, 
+	0x68, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x94, 0x90, 
+	0x2e, 0x08, 0x7d, 0xbc, 0xff, 0xff, 0x00, 0x00, 
+	0x2e, 0x08, 0x7d, 0xc0, 0xb5, 0xf0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x06, 0x26, 0x0e, 0x36, 0x48, 0x0f, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x8b, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x07, 
+	0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xf8, 0x1c, 0x30, 
+	0xf7, 0xf8, 0xfb, 0xc2, 0x1c, 0x05, 0x2d, 0x00, 
+	0xd0, 0x04, 0x68, 0xa8, 0x01, 0xc0, 0x0f, 0xc0, 
+	0x60, 0x38, 0xe0, 0x04, 0x20, 0x92, 0x49, 0x04, 
+	0x60, 0x08, 0x20, 0xff, 0xe7, 0xe8, 0x20, 0x00, 
+	0xe7, 0xe6, 0xe7, 0xe5, 0x2e, 0x08, 0x60, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xcc, 0xb5, 0xb0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x06, 0x25, 0x0e, 0x2d, 0x48, 0x20, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x8b, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1d, 
+	0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x2d, 0x17, 
+	0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf4, 0xe0, 0x2d, 
+	0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xef, 
+	0x48, 0x16, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, 
+	0x20, 0xff, 0xe7, 0xe9, 0x49, 0x14, 0x20, 0x91, 
+	0xf0, 0x0f, 0xfb, 0xcc, 0x28, 0x92, 0xd0, 0x03, 
+	0x20, 0x01, 0xf0, 0x01, 0xfb, 0xd5, 0xe7, 0xf5, 
+	0x2f, 0x00, 0xd0, 0x08, 0x48, 0x0f, 0x1d, 0xe9, 
+	0x31, 0x01, 0x22, 0x01, 0x40, 0x8a, 0x68, 0x01, 
+	0x43, 0x11, 0x60, 0x01, 0xe0, 0x08, 0x48, 0x0b, 
+	0x1d, 0xea, 0x32, 0x01, 0x21, 0x01, 0x40, 0x91, 
+	0x43, 0xc9, 0x68, 0x02, 0x40, 0x11, 0x60, 0x01, 
+	0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 
+	0xe7, 0xc6, 0xe7, 0xc5, 0xe7, 0xc4, 0x00, 0x00, 
+	0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x8c, 
+	0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x00, 0x20, 
+	0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, 
+	0x0e, 0x09, 0x48, 0x10, 0x68, 0x00, 0x28, 0x00, 
+	0xd1, 0x02, 0x20, 0x8b, 0xbc, 0x90, 0x47, 0x70, 
+	0x29, 0x07, 0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xf9, 
+	0x48, 0x0b, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, 
+	0x20, 0xff, 0xe7, 0xf3, 0x1d, 0xc8, 0x30, 0x01, 
+	0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, 0x20, 0x0d, 
+	0x06, 0xc0, 0x6a, 0x00, 0x40, 0x18, 0x1d, 0xcc, 
+	0x34, 0x01, 0x40, 0xe0, 0x60, 0x10, 0x20, 0x00, 
+	0xe7, 0xe4, 0xe7, 0xe3, 0x2e, 0x08, 0x60, 0x8c, 
+	0x2e, 0x08, 0x94, 0x8c, 0xb5, 0xb0, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x06, 0x25, 0x0e, 0x2d, 0x48, 0x13, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x8b, 
+	0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x07, 
+	0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xf8, 0x48, 0x0e, 
+	0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 
+	0xe7, 0xf2, 0x49, 0x0c, 0x20, 0x91, 0xf0, 0x0f, 
+	0xfb, 0x5d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 
+	0xf0, 0x01, 0xfb, 0x66, 0xe7, 0xf5, 0x08, 0xb8, 
+	0x00, 0xa9, 0x4b, 0x07, 0x18, 0xc9, 0x67, 0x08, 
+	0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 
+	0xe7, 0xde, 0xe7, 0xdd, 0x2e, 0x08, 0x60, 0x8c, 
+	0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xcc, 
+	0x68, 0x00, 0x0e, 0x00, 0xb4, 0xf0, 0x1c, 0x05, 
+	0x1c, 0x0c, 0x1c, 0x17, 0x1c, 0x1e, 0x04, 0x3f, 
+	0x0c, 0x3f, 0x1c, 0x39, 0x29, 0x00, 0xd8, 0x02, 
+	0xe0, 0x04, 0x39, 0x01, 0xe7, 0xfa, 0xcd, 0x04, 
+	0xc4, 0x04, 0xe7, 0xfa, 0x20, 0x92, 0x4a, 0x03, 
+	0x60, 0x10, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 
+	0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xd0, 
+	0x20, 0x00, 0x6b, 0x00, 0x49, 0x63, 0x60, 0x08, 
+	0x20, 0x00, 0x6b, 0x40, 0x49, 0x62, 0x60, 0x08, 
+	0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 
+	0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6a, 0xc0, 
+	0x49, 0x62, 0x60, 0x08, 0x48, 0x62, 0x49, 0x63, 
+	0x60, 0x08, 0x48, 0x63, 0x49, 0x63, 0x60, 0x08, 
+	0x48, 0x63, 0x49, 0x64, 0x60, 0x08, 0x20, 0x00, 
+	0x6b, 0x80, 0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 
+	0x6b, 0xc0, 0x49, 0x62, 0x60, 0x08, 0x20, 0x00, 
+	0x6c, 0x00, 0x49, 0x61, 0x60, 0x08, 0x20, 0x00, 
+	0x6c, 0x40, 0x49, 0x60, 0x60, 0x08, 0x20, 0x00, 
+	0x6c, 0x80, 0x49, 0x5f, 0x60, 0x08, 0x20, 0x00, 
+	0x6c, 0xc0, 0x49, 0x5e, 0x60, 0x08, 0x20, 0x00, 
+	0x6e, 0xc0, 0x49, 0x5d, 0x60, 0x08, 0x20, 0x80, 
+	0x6d, 0x00, 0x49, 0x5c, 0x60, 0x08, 0x20, 0x80, 
+	0x6d, 0x40, 0x49, 0x5b, 0x60, 0x08, 0x20, 0x80, 
+	0x6d, 0x80, 0x49, 0x5a, 0x60, 0x08, 0x20, 0x00, 
+	0x6d, 0x00, 0x49, 0x59, 0x60, 0x08, 0x20, 0x00, 
+	0x6d, 0x40, 0x49, 0x58, 0x60, 0x08, 0x20, 0x00, 
+	0x6d, 0x80, 0x49, 0x57, 0x60, 0x08, 0x20, 0x00, 
+	0x6d, 0xc0, 0x49, 0x56, 0x60, 0x08, 0x20, 0x80, 
+	0x6a, 0xc0, 0x49, 0x55, 0x60, 0x08, 0x20, 0x80, 
+	0x6d, 0xc0, 0x49, 0x54, 0x60, 0x08, 0x20, 0x80, 
+	0x6c, 0xc0, 0x49, 0x53, 0x60, 0x08, 0x20, 0x80, 
+	0x68, 0x40, 0x49, 0x52, 0x60, 0x08, 0x20, 0x80, 
+	0x68, 0x80, 0x49, 0x51, 0x60, 0x08, 0x20, 0x80, 
+	0x68, 0xc0, 0x49, 0x50, 0x60, 0x08, 0x20, 0x80, 
+	0x69, 0x00, 0x49, 0x4f, 0x60, 0x08, 0x20, 0x80, 
+	0x69, 0x40, 0x49, 0x4e, 0x60, 0x08, 0x20, 0x80, 
+	0x69, 0x80, 0x49, 0x4d, 0x60, 0x08, 0x20, 0x80, 
+	0x69, 0xc0, 0x49, 0x4c, 0x60, 0x08, 0x20, 0x80, 
+	0x6a, 0x00, 0x49, 0x4b, 0x60, 0x08, 0x20, 0x80, 
+	0x6a, 0x40, 0x49, 0x4a, 0x60, 0x08, 0x20, 0x80, 
+	0x6a, 0x80, 0x49, 0x49, 0x60, 0x08, 0x20, 0x00, 
+	0x6f, 0x00, 0x49, 0x48, 0x60, 0x08, 0x20, 0x00, 
+	0x6f, 0x40, 0x49, 0x47, 0x60, 0x08, 0x20, 0x80, 
+	0x6c, 0x40, 0x49, 0x46, 0x60, 0x08, 0x20, 0x80, 
+	0x6c, 0x80, 0x49, 0x45, 0x60, 0x08, 0x20, 0x80, 
+	0x6e, 0x40, 0x49, 0x44, 0x60, 0x08, 0x20, 0x80, 
+	0x6e, 0x80, 0x49, 0x43, 0x60, 0x08, 0x20, 0x00, 
+	0x49, 0x42, 0x60, 0x08, 0x20, 0x00, 0x49, 0x41, 
+	0x60, 0x48, 0x48, 0x41, 0x49, 0x3f, 0x60, 0x88, 
+	0x48, 0x40, 0x49, 0x3e, 0x60, 0xc8, 0x20, 0xff, 
+	0x30, 0x01, 0x68, 0x40, 0x49, 0x3e, 0x60, 0x08, 
+	0x20, 0x80, 0x6e, 0xc0, 0x49, 0x3d, 0x60, 0x08, 
+	0x20, 0x80, 0x6f, 0x00, 0x49, 0x3c, 0x60, 0x08, 
+	0x20, 0x80, 0x6f, 0x40, 0x49, 0x3b, 0x60, 0x08, 
+	0x20, 0x80, 0x6f, 0x80, 0x49, 0x3a, 0x60, 0x08, 
+	0x20, 0x80, 0x6f, 0xc0, 0x49, 0x39, 0x60, 0x08, 
+	0x20, 0xff, 0x30, 0x01, 0x68, 0x80, 0x49, 0x38, 
+	0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x5d, 0xc4, 
+	0x2e, 0x08, 0x5d, 0xc8, 0x64, 0x00, 0x05, 0x00, 
+	0x2e, 0x08, 0x5d, 0xd0, 0x64, 0x00, 0x00, 0x80, 
+	0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5d, 0xcc, 
+	0x64, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x5d, 0xd8, 
+	0x9e, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xf0, 
+	0x9e, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x5d, 0xdc, 
+	0x2e, 0x08, 0x94, 0xa4, 0x2e, 0x08, 0x94, 0xa8, 
+	0x2e, 0x08, 0x94, 0xac, 0x2e, 0x08, 0x94, 0xb0, 
+	0x2e, 0x08, 0x5d, 0xe0, 0x2e, 0x08, 0x5d, 0xe4, 
+	0x2e, 0x08, 0x5d, 0xf4, 0x2e, 0x08, 0x5d, 0xf8, 
+	0x2e, 0x08, 0x5d, 0xfc, 0x2e, 0x08, 0x5e, 0x00, 
+	0x2e, 0x08, 0x5d, 0xe8, 0x2e, 0x08, 0x5d, 0xec, 
+	0x2e, 0x08, 0x60, 0x74, 0x2e, 0x08, 0x60, 0x78, 
+	0x2e, 0x08, 0x5e, 0x04, 0x2e, 0x08, 0x5e, 0x08, 
+	0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x5e, 0x0c, 
+	0x2e, 0x08, 0x5e, 0x10, 0x2e, 0x08, 0x5e, 0x14, 
+	0x2e, 0x08, 0x5e, 0x18, 0x2e, 0x08, 0x5e, 0x1c, 
+	0x2e, 0x08, 0x5e, 0x20, 0x2e, 0x08, 0x5e, 0x24, 
+	0x2e, 0x08, 0x5e, 0x28, 0x2e, 0x08, 0x5e, 0x2c, 
+	0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xb8, 
+	0x2e, 0x08, 0x5d, 0xbc, 0x2e, 0x08, 0x7c, 0x4c, 
+	0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0x3c, 
+	0x2e, 0x08, 0x60, 0x7c, 0x2e, 0x08, 0x7c, 0x24, 
+	0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00, 
+	0x2e, 0x08, 0x5e, 0x48, 0x2e, 0x08, 0x5e, 0x60, 
+	0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x5e, 0x44, 
+	0x2e, 0x08, 0x7c, 0x48, 0x2e, 0x08, 0x7c, 0x20, 
+	0x2e, 0x08, 0x5e, 0x50, 0x49, 0x4f, 0x68, 0x0a, 
+	0x23, 0x04, 0x43, 0x1a, 0x60, 0x0a, 0x21, 0xff, 
+	0x4a, 0x4d, 0x68, 0x12, 0x32, 0x40, 0x72, 0x11, 
+	0x21, 0xff, 0x4a, 0x4b, 0x68, 0x12, 0x32, 0x40, 
+	0x76, 0x11, 0x21, 0xff, 0x4a, 0x48, 0x68, 0x12, 
+	0x32, 0x60, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x46, 
+	0x68, 0x12, 0x32, 0x20, 0x72, 0x11, 0x21, 0xff, 
+	0x4a, 0x43, 0x68, 0x12, 0x32, 0x20, 0x76, 0x11, 
+	0x21, 0xff, 0x4a, 0x41, 0x68, 0x12, 0x32, 0x60, 
+	0x76, 0x11, 0x21, 0x00, 0x4a, 0x3e, 0x68, 0x12, 
+	0x32, 0x40, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x3c, 
+	0x68, 0x12, 0x32, 0x40, 0x76, 0x91, 0x21, 0x00, 
+	0x4a, 0x39, 0x68, 0x12, 0x32, 0x60, 0x72, 0x91, 
+	0x21, 0x00, 0x4a, 0x37, 0x68, 0x12, 0x32, 0x20, 
+	0x72, 0x91, 0x21, 0x00, 0x4a, 0x34, 0x68, 0x12, 
+	0x32, 0x20, 0x76, 0x91, 0x21, 0x00, 0x4a, 0x32, 
+	0x68, 0x12, 0x32, 0x60, 0x76, 0x91, 0x21, 0x00, 
+	0x4a, 0x2f, 0x68, 0x12, 0x32, 0x80, 0x70, 0xd1, 
+	0x21, 0x00, 0x4a, 0x2d, 0x68, 0x12, 0x32, 0x80, 
+	0x70, 0x51, 0x21, 0x00, 0x4a, 0x2a, 0x68, 0x12, 
+	0x32, 0x80, 0x70, 0x91, 0x21, 0x00, 0x4a, 0x29, 
+	0x60, 0x11, 0x21, 0x00, 0x4a, 0x28, 0x64, 0x11, 
+	0x21, 0x03, 0x4a, 0x28, 0x61, 0x11, 0x49, 0x28, 
+	0x68, 0x0a, 0x4b, 0x28, 0x43, 0x1a, 0x60, 0x0a, 
+	0x49, 0x26, 0x22, 0x33, 0x06, 0x52, 0x60, 0x51, 
+	0x21, 0x00, 0x4a, 0x25, 0x70, 0x11, 0x21, 0x00, 
+	0x4a, 0x23, 0x70, 0x51, 0x21, 0x00, 0x4a, 0x22, 
+	0x70, 0x91, 0x21, 0x00, 0x4a, 0x20, 0x70, 0xd1, 
+	0x21, 0x00, 0x4a, 0x1f, 0x71, 0x11, 0x21, 0x00, 
+	0x4a, 0x1d, 0x71, 0x51, 0x21, 0x00, 0x4a, 0x1c, 
+	0x71, 0x91, 0x21, 0x00, 0x4a, 0x1a, 0x71, 0xd1, 
+	0x21, 0x00, 0x4a, 0x19, 0x72, 0x11, 0x21, 0x00, 
+	0x4a, 0x17, 0x72, 0x51, 0x21, 0x00, 0x4a, 0x16, 
+	0x72, 0x91, 0x21, 0x00, 0x4a, 0x14, 0x72, 0xd1, 
+	0x21, 0x00, 0x4a, 0x13, 0x73, 0x11, 0x21, 0xff, 
+	0x4a, 0x11, 0x70, 0x11, 0x21, 0x00, 0x4a, 0x10, 
+	0x70, 0x11, 0x21, 0x00, 0x4a, 0x0e, 0x70, 0x51, 
+	0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x08, 
+	0x1c, 0x41, 0x06, 0x08, 0x0e, 0x00, 0xe7, 0xf8, 
+	0x21, 0xff, 0x4a, 0x03, 0x68, 0x12, 0x54, 0x11, 
+	0xe7, 0xf6, 0x47, 0x70, 0x66, 0x00, 0x01, 0x18, 
+	0x2e, 0x08, 0x7c, 0x4c, 0x9e, 0x00, 0x0a, 0x00, 
+	0x9e, 0x00, 0x0a, 0x80, 0x66, 0x00, 0x01, 0x00, 
+	0x66, 0x00, 0x00, 0x08, 0x23, 0x48, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0x50, 0xb4, 0x80, 0x1c, 0x07, 
+	0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x29, 0x05, 
+	0xd2, 0x40, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 
+	0x44, 0x9f, 0x1c, 0x00, 0x03, 0x14, 0x07, 0x0d, 
+	0x13, 0x00, 0x78, 0x10, 0x4b, 0x1f, 0x70, 0x18, 
+	0xe0, 0x38, 0x78, 0x50, 0x4b, 0x1e, 0x68, 0x1b, 
+	0x33, 0x80, 0x71, 0x58, 0xe0, 0x32, 0x78, 0x10, 
+	0x4b, 0x1b, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x18, 
+	0xe0, 0x2c, 0xe0, 0x2b, 0x78, 0x10, 0x4b, 0x17, 
+	0x70, 0x18, 0x78, 0x50, 0x4b, 0x15, 0x70, 0x58, 
+	0x78, 0x90, 0x4b, 0x14, 0x70, 0x98, 0x78, 0xd0, 
+	0x4b, 0x12, 0x70, 0xd8, 0x79, 0x10, 0x4b, 0x11, 
+	0x71, 0x18, 0x79, 0x50, 0x4b, 0x0f, 0x71, 0x58, 
+	0x79, 0x90, 0x4b, 0x0e, 0x71, 0x98, 0x79, 0xd0, 
+	0x4b, 0x0c, 0x71, 0xd8, 0x7a, 0x10, 0x4b, 0x0b, 
+	0x72, 0x18, 0x7a, 0x50, 0x4b, 0x09, 0x72, 0x58, 
+	0x7a, 0x90, 0x4b, 0x08, 0x72, 0x98, 0x7a, 0xd0, 
+	0x4b, 0x06, 0x72, 0xd8, 0x7b, 0x10, 0x4b, 0x05, 
+	0x73, 0x18, 0xe0, 0x03, 0x20, 0x4a, 0xbc, 0x80, 
+	0x47, 0x70, 0xe7, 0xff, 0x20, 0x00, 0xe7, 0xfa, 
+	0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x50, 
+	0x2e, 0x08, 0x7c, 0x4c, 0xb5, 0xf3, 0x1c, 0x07, 
+	0x06, 0x3e, 0x0e, 0x36, 0x99, 0x01, 0x06, 0x0c, 
+	0x0e, 0x24, 0x2e, 0x20, 0xdb, 0x04, 0x20, 0xa2, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 
+	0x2c, 0x04, 0xd1, 0x0b, 0x48, 0xb8, 0x68, 0x00, 
+	0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x39, 
+	0x48, 0xb5, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, 
+	0x28, 0x00, 0xd1, 0x33, 0x2c, 0x00, 0xd1, 0x17, 
+	0x48, 0xb1, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, 
+	0x28, 0x00, 0xd1, 0x2b, 0x48, 0xae, 0x68, 0x00, 
+	0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x25, 
+	0x48, 0xab, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80, 
+	0x28, 0x00, 0xd1, 0x1f, 0x48, 0xa8, 0x68, 0x00, 
+	0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x19, 
+	0x2c, 0x01, 0xd1, 0x19, 0x48, 0xa4, 0x68, 0x00, 
+	0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x11, 
+	0x48, 0xa1, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, 
+	0x28, 0x00, 0xd1, 0x0b, 0x48, 0x9e, 0x68, 0x00, 
+	0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, 
+	0x48, 0x9b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 
+	0x28, 0x00, 0xd0, 0x01, 0x20, 0x49, 0xe7, 0xb3, 
+	0x48, 0x97, 0x68, 0x00, 0x55, 0x84, 0x2c, 0xff, 
+	0xd0, 0x73, 0x20, 0x01, 0x49, 0x95, 0x60, 0x48, 
+	0x2c, 0x05, 0xd2, 0x6f, 0xa3, 0x01, 0x5d, 0x1b, 
+	0x00, 0x5b, 0x44, 0x9f, 0x02, 0x34, 0x30, 0x30, 
+	0x30, 0x00, 0x20, 0x02, 0x49, 0x90, 0x61, 0x88, 
+	0x48, 0x90, 0x6a, 0xc0, 0x49, 0x90, 0x60, 0x08, 
+	0x48, 0x90, 0x68, 0x01, 0x23, 0x01, 0x07, 0x5b, 
+	0x43, 0x19, 0x60, 0x01, 0x48, 0x8e, 0x49, 0x8b, 
+	0x62, 0xc8, 0x48, 0x8c, 0x68, 0x01, 0x4b, 0x8d, 
+	0x40, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x31, 
+	0x06, 0x49, 0x61, 0x88, 0x20, 0x15, 0x21, 0x31, 
+	0x06, 0x49, 0x61, 0x08, 0x20, 0x0f, 0x21, 0x31, 
+	0x06, 0x49, 0x61, 0xc8, 0x20, 0x0c, 0x21, 0x31, 
+	0x06, 0x49, 0x61, 0xc8, 0x20, 0x54, 0x21, 0x31, 
+	0x06, 0x49, 0x62, 0xc8, 0x20, 0x37, 0x21, 0x31, 
+	0x06, 0x49, 0x60, 0x88, 0xe0, 0x56, 0x20, 0x00, 
+	0x49, 0x79, 0x61, 0x88, 0xe0, 0x52, 0x20, 0x01, 
+	0x49, 0x77, 0x61, 0x88, 0x20, 0x01, 0x49, 0x7c, 
+	0x62, 0x88, 0x48, 0x7c, 0x78, 0x00, 0x06, 0x80, 
+	0x0e, 0x80, 0x02, 0x80, 0x49, 0x79, 0x78, 0x49, 
+	0x07, 0xc9, 0x0d, 0x89, 0x43, 0x08, 0x49, 0x77, 
+	0x78, 0x89, 0x07, 0xc9, 0x0d, 0xc9, 0x43, 0x08, 
+	0x49, 0x74, 0x78, 0xc9, 0x07, 0x89, 0x0f, 0x89, 
+	0x01, 0x89, 0x43, 0x08, 0x49, 0x71, 0x79, 0x09, 
+	0x07, 0x89, 0x0f, 0x89, 0x01, 0x09, 0x43, 0x08, 
+	0x49, 0x6e, 0x79, 0x49, 0x07, 0x89, 0x0f, 0x89, 
+	0x00, 0x89, 0x43, 0x08, 0x49, 0x6b, 0x79, 0x89, 
+	0x07, 0x89, 0x0f, 0x89, 0x43, 0x08, 0x49, 0x68, 
+	0x62, 0x08, 0x48, 0x68, 0x79, 0xc0, 0x07, 0xc0, 
+	0x0e, 0x40, 0x49, 0x66, 0x7a, 0x09, 0x07, 0xc9, 
+	0xe0, 0x01, 0xe0, 0x21, 0xe0, 0x18, 0x0e, 0xc9, 
+	0x43, 0x08, 0x49, 0x62, 0x7a, 0x49, 0x07, 0xc9, 
+	0x0f, 0x09, 0x43, 0x08, 0x49, 0x5f, 0x7a, 0x89, 
+	0x07, 0xc9, 0x0f, 0x49, 0x43, 0x08, 0x49, 0x5d, 
+	0x7a, 0xc9, 0x07, 0xc9, 0x0f, 0x89, 0x43, 0x08, 
+	0x49, 0x5a, 0x7b, 0x09, 0x07, 0xc9, 0x0f, 0xc9, 
+	0x43, 0x08, 0x49, 0x57, 0x62, 0x48, 0xe0, 0x01, 
+	0x20, 0x4a, 0xe7, 0x1d, 0x48, 0x51, 0x68, 0x01, 
+	0x4b, 0x55, 0x40, 0x19, 0x60, 0x01, 0xe0, 0x8f, 
+	0x48, 0x49, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 
+	0x28, 0x00, 0xd0, 0x08, 0x22, 0x00, 0xb4, 0x04, 
+	0x1c, 0x30, 0x23, 0x00, 0x22, 0x00, 0x49, 0x4f, 
+	0xf7, 0xf4, 0xfc, 0x10, 0xb0, 0x01, 0x20, 0x00, 
+	0x49, 0x42, 0x60, 0x48, 0x48, 0x45, 0x68, 0x01, 
+	0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01, 0x48, 0x4a, 
+	0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x49, 
+	0x68, 0x01, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 
+	0x2c, 0x00, 0xd1, 0x0e, 0x48, 0x3c, 0x68, 0x00, 
+	0x28, 0x00, 0xd0, 0x0a, 0x48, 0x3a, 0x68, 0x00, 
+	0x49, 0x38, 0x62, 0xc8, 0x20, 0x00, 0x49, 0x38, 
+	0x60, 0x08, 0x20, 0x00, 0x21, 0x31, 0x06, 0x49, 
+	0x61, 0x88, 0x20, 0x00, 0x49, 0x30, 0x68, 0x09, 
+	0x31, 0x80, 0x70, 0x48, 0x20, 0x00, 0x49, 0x2e, 
+	0x68, 0x09, 0x31, 0x80, 0x70, 0x88, 0x20, 0x00, 
+	0x49, 0x39, 0x60, 0x08, 0x20, 0x00, 0x49, 0x39, 
+	0x64, 0x08, 0x20, 0x03, 0x49, 0x2a, 0x61, 0x08, 
+	0x25, 0x00, 0x2d, 0x20, 0xd3, 0x02, 0xe0, 0x06, 
+	0x35, 0x01, 0xe7, 0xfa, 0x20, 0xff, 0x49, 0x24, 
+	0x68, 0x09, 0x55, 0x48, 0xe7, 0xf8, 0x20, 0xff, 
+	0x49, 0x21, 0x68, 0x09, 0x31, 0x40, 0x72, 0x08, 
+	0x20, 0xff, 0x49, 0x1f, 0x68, 0x09, 0x31, 0x40, 
+	0x76, 0x08, 0x20, 0xff, 0x49, 0x1c, 0x68, 0x09, 
+	0x31, 0x60, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1a, 
+	0x68, 0x09, 0x31, 0x20, 0x72, 0x08, 0x20, 0xff, 
+	0x49, 0x17, 0x68, 0x09, 0x31, 0x20, 0x76, 0x08, 
+	0x20, 0xff, 0x49, 0x15, 0x68, 0x09, 0x31, 0x60, 
+	0x76, 0x08, 0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 
+	0x31, 0x40, 0x72, 0x88, 0x20, 0x00, 0x49, 0x10, 
+	0x68, 0x09, 0x31, 0x40, 0x76, 0x88, 0x20, 0x00, 
+	0x49, 0x0d, 0x68, 0x09, 0x31, 0x60, 0x72, 0x88, 
+	0x20, 0x00, 0x49, 0x0b, 0x68, 0x09, 0x31, 0x20, 
+	0x72, 0x88, 0x20, 0x00, 0x49, 0x08, 0x68, 0x09, 
+	0x31, 0x20, 0x76, 0x88, 0x20, 0x00, 0x49, 0x06, 
+	0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x20, 0x00, 
+	0x49, 0x03, 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 
+	0x20, 0x00, 0xe6, 0x85, 0xe6, 0x84, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0x4c, 0x62, 0x00, 0x03, 0x00, 
+	0x66, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x0d, 0x80, 
+	0x2e, 0x08, 0x20, 0x10, 0x66, 0x00, 0x00, 0x08, 
+	0x2e, 0x01, 0x84, 0x8c, 0xdf, 0xff, 0xff, 0xff, 
+	0x62, 0x01, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x50, 
+	0xfc, 0xb7, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 
+	0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, 
+	0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, 
+	0xb5, 0xf7, 0x1c, 0x17, 0x98, 0x00, 0x06, 0x02, 
+	0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d, 
+	0x48, 0x6a, 0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, 
+	0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x03, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, 
+	0x20, 0x4b, 0xe7, 0xf7, 0x48, 0x64, 0x69, 0x80, 
+	0x28, 0x00, 0xd1, 0x03, 0x29, 0x04, 0xd1, 0x01, 
+	0x20, 0x58, 0xe7, 0xef, 0x48, 0x60, 0x69, 0x80, 
+	0x28, 0x00, 0xd1, 0x03, 0x29, 0x02, 0xd0, 0x01, 
+	0x29, 0x03, 0xd1, 0x0b, 0x48, 0x5c, 0x69, 0x80, 
+	0x28, 0x02, 0xd1, 0x01, 0x29, 0x00, 0xd1, 0x05, 
+	0x48, 0x59, 0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 
+	0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d, 0xe7, 0xd9, 
+	0x29, 0x02, 0xd1, 0x05, 0x48, 0x53, 0x68, 0x00, 
+	0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x17, 
+	0x29, 0x03, 0xd1, 0x05, 0x48, 0x4f, 0x68, 0x00, 
+	0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0f, 
+	0x29, 0x00, 0xd1, 0x05, 0x48, 0x4b, 0x68, 0x00, 
+	0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x07, 
+	0x29, 0x01, 0xd1, 0x07, 0x48, 0x47, 0x68, 0x00, 
+	0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x01, 
+	0x20, 0x4e, 0xe7, 0xb7, 0x68, 0x78, 0x28, 0x00, 
+	0xd1, 0x01, 0x20, 0x4c, 0xe7, 0xb2, 0x23, 0x01, 
+	0x01, 0x08, 0x4e, 0x40, 0x68, 0x36, 0x19, 0x80, 
+	0x30, 0x20, 0x72, 0x83, 0x2d, 0x01, 0xd1, 0x0b, 
+	0x20, 0x33, 0x06, 0x40, 0x6e, 0x40, 0x23, 0x0d, 
+	0x06, 0x9b, 0x1a, 0xc0, 0x00, 0xd3, 0x4e, 0x3b, 
+	0x68, 0x36, 0x19, 0x9b, 0x60, 0x58, 0xe0, 0x12, 
+	0x2d, 0x02, 0xd1, 0x0a, 0x48, 0x38, 0x6c, 0xc0, 
+	0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc3, 0x00, 0xd0, 
+	0x4e, 0x34, 0x68, 0x36, 0x19, 0x80, 0x60, 0x43, 
+	0xe0, 0x05, 0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x31, 
+	0x68, 0x36, 0x19, 0x80, 0x60, 0x43, 0x68, 0x3b, 
+	0x01, 0x08, 0x4e, 0x2c, 0x68, 0x36, 0x19, 0x80, 
+	0x62, 0x03, 0x68, 0x7b, 0x01, 0x08, 0x4e, 0x29, 
+	0x68, 0x36, 0x19, 0x80, 0x62, 0x43, 0x01, 0x08, 
+	0x4b, 0x26, 0x68, 0x1b, 0x18, 0xc0, 0x62, 0xc7, 
+	0x01, 0x08, 0x4b, 0x24, 0x68, 0x1b, 0x18, 0xc0, 
+	0x30, 0x20, 0x72, 0x45, 0x01, 0x08, 0x4b, 0x21, 
+	0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x02, 
+	0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78, 
+	0x20, 0x00, 0x4b, 0x20, 0x60, 0x18, 0x20, 0x00, 
+	0x4b, 0x1f, 0x64, 0x18, 0x01, 0x08, 0x4b, 0x19, 
+	0x68, 0x1b, 0x18, 0xc0, 0x6a, 0x40, 0x28, 0xbc, 
+	0xdd, 0x01, 0x24, 0xbc, 0xe0, 0x04, 0x01, 0x08, 
+	0x4b, 0x14, 0x68, 0x1b, 0x18, 0xc0, 0x6a, 0x44, 
+	0x48, 0x18, 0x60, 0x04, 0x29, 0x01, 0xd1, 0x14, 
+	0x20, 0x01, 0x4b, 0x17, 0x62, 0x98, 0x48, 0x17, 
+	0x68, 0x03, 0x04, 0x1b, 0x0c, 0x1b, 0x60, 0x03, 
+	0x48, 0x14, 0x04, 0x23, 0x68, 0x06, 0x43, 0x33, 
+	0x60, 0x03, 0x48, 0x13, 0x68, 0x06, 0x23, 0x20, 
+	0x43, 0x33, 0x60, 0x03, 0x20, 0x01, 0x4b, 0x0e, 
+	0x63, 0x18, 0x48, 0x07, 0x69, 0x80, 0x28, 0x00, 
+	0xd1, 0x04, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x28, 
+	0x43, 0x33, 0x60, 0x03, 0x20, 0x00, 0xe7, 0x31, 
+	0xe7, 0x30, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x4c, 
+	0x66, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x5d, 0xdc, 
+	0x66, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x0a, 0x00, 
+	0x9e, 0x00, 0x0a, 0x80, 0x62, 0x00, 0x03, 0x00, 
+	0x62, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x20, 
+	0x62, 0x01, 0x00, 0x24, 0x64, 0x00, 0x00, 0x60, 
+	0xb5, 0xf3, 0x1c, 0x0f, 0x98, 0x00, 0x06, 0x06, 
+	0x0e, 0x36, 0xb0, 0x82, 0x4d, 0x68, 0x49, 0x69, 
+	0x91, 0x01, 0x48, 0x69, 0x68, 0x00, 0x5d, 0x84, 
+	0x2e, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, 
+	0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, 0xb0, 0x02, 
+	0xe7, 0xf6, 0x48, 0x62, 0x69, 0x80, 0x28, 0x00, 
+	0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, 
+	0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 0x48, 0x5d, 
+	0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, 
+	0xd1, 0x05, 0x48, 0x5a, 0x69, 0x80, 0x28, 0x01, 
+	0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, 0x20, 0x4d, 
+	0xb0, 0x02, 0xe7, 0xdd, 0x48, 0x54, 0x68, 0x00, 
+	0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x02, 
+	0x20, 0x4f, 0xb0, 0x02, 0xe7, 0xd4, 0x48, 0x50, 
+	0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 
+	0xd0, 0x02, 0x20, 0x50, 0xb0, 0x02, 0xe7, 0xcb, 
+	0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c, 
+	0xb0, 0x02, 0xe7, 0xc5, 0x2c, 0x04, 0xd1, 0x08, 
+	0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xff, 0xac, 
+	0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x02, 
+	0xe7, 0xba, 0x48, 0x43, 0x68, 0x00, 0x30, 0x80, 
+	0x78, 0x80, 0x21, 0x01, 0x40, 0x81, 0x48, 0x41, 
+	0x68, 0x40, 0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, 
+	0xd0, 0x02, 0x20, 0x51, 0xb0, 0x02, 0xe7, 0xab, 
+	0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x00, 
+	0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x20, 0x52, 
+	0xb0, 0x02, 0xe7, 0xa1, 0x2c, 0x00, 0xd1, 0x04, 
+	0x48, 0x37, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19, 
+	0x60, 0x01, 0x20, 0x01, 0x49, 0x32, 0x68, 0x09, 
+	0x31, 0x60, 0x76, 0x88, 0x68, 0x38, 0x49, 0x30, 
+	0x68, 0x09, 0x67, 0x08, 0x68, 0x78, 0x49, 0x2e, 
+	0x68, 0x09, 0x67, 0x48, 0x48, 0x2c, 0x68, 0x00, 
+	0x67, 0xc7, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09, 
+	0x31, 0x60, 0x76, 0x48, 0x48, 0x28, 0x68, 0x00, 
+	0x30, 0x60, 0x76, 0x06, 0x20, 0x00, 0x60, 0x78, 
+	0x20, 0x00, 0x72, 0x78, 0x48, 0x24, 0x68, 0x00, 
+	0x5d, 0x80, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x01, 
+	0x49, 0x24, 0x62, 0x88, 0x98, 0x00, 0x01, 0x00, 
+	0x19, 0x45, 0x48, 0x1f, 0x68, 0x00, 0x6f, 0x40, 
+	0x28, 0xbc, 0xdd, 0x07, 0x48, 0x20, 0x60, 0xa8, 
+	0x20, 0xbc, 0x49, 0x1b, 0x68, 0x09, 0x31, 0x80, 
+	0x70, 0x08, 0xe0, 0x0d, 0x48, 0x18, 0x68, 0x00, 
+	0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 
+	0x60, 0xa8, 0x48, 0x15, 0x68, 0x00, 0x6f, 0x40, 
+	0x49, 0x13, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 
+	0x48, 0x11, 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 
+	0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 0x99, 0x01, 
+	0x18, 0x41, 0x91, 0x01, 0x48, 0x0c, 0x68, 0x00, 
+	0x6f, 0x00, 0x60, 0x28, 0x99, 0x01, 0x1d, 0x08, 
+	0x60, 0x68, 0x20, 0x01, 0x06, 0x00, 0x60, 0xe8, 
+	0x99, 0x00, 0x20, 0x01, 0x40, 0x88, 0x21, 0x33, 
+	0x06, 0x49, 0x63, 0x48, 0x20, 0x00, 0xb0, 0x02, 
+	0xe7, 0x3a, 0xb0, 0x02, 0xe7, 0x38, 0x00, 0x00, 
+	0x9e, 0x00, 0x09, 0x80, 0x9e, 0x00, 0x0b, 0x80, 
+	0x2e, 0x08, 0x7c, 0x4c, 0x66, 0x00, 0x01, 0x00, 
+	0x62, 0x00, 0x00, 0x1c, 0x62, 0x01, 0x00, 0x00, 
+	0x40, 0x00, 0x00, 0xbc, 0xb5, 0xf3, 0x1c, 0x0f, 
+	0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 
+	0x90, 0x00, 0xb0, 0x82, 0x48, 0xf9, 0x68, 0x00, 
+	0x99, 0x02, 0x5c, 0x44, 0x98, 0x02, 0x28, 0x20, 
+	0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 
+	0xd1, 0x02, 0x20, 0x4b, 0xb0, 0x03, 0xe7, 0xf6, 
+	0x48, 0xf1, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 
+	0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 
+	0x2c, 0x04, 0xd1, 0x0b, 0x48, 0xec, 0x69, 0x80, 
+	0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 
+	0x48, 0xe9, 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 
+	0x2c, 0x01, 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x03, 
+	0xe7, 0xdd, 0x48, 0xe4, 0x68, 0x00, 0x30, 0x60, 
+	0x7e, 0x80, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, 
+	0xb0, 0x03, 0xe7, 0xd4, 0x68, 0x78, 0x28, 0x00, 
+	0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x03, 0xe7, 0xce, 
+	0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc, 
+	0xf0, 0x01, 0xfe, 0xce, 0x29, 0x00, 0xd0, 0x02, 
+	0x20, 0x59, 0xb0, 0x03, 0xe7, 0xc3, 0x48, 0xd7, 
+	0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 
+	0xd0, 0x02, 0x20, 0x50, 0xb0, 0x03, 0xe7, 0xba, 
+	0x2c, 0x00, 0xd1, 0x04, 0x48, 0xd3, 0x68, 0x01, 
+	0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x48, 0xd2, 
+	0x68, 0x01, 0x23, 0x8d, 0x05, 0x9b, 0x43, 0x19, 
+	0x60, 0x01, 0x48, 0xd0, 0x21, 0x33, 0x06, 0x49, 
+	0x60, 0x48, 0x20, 0x01, 0x49, 0xc9, 0x68, 0x09, 
+	0x31, 0x60, 0x76, 0x88, 0x68, 0x38, 0x49, 0xc7, 
+	0x68, 0x09, 0x67, 0x08, 0x68, 0x78, 0x49, 0xc5, 
+	0x68, 0x09, 0x67, 0x48, 0x48, 0xc3, 0x68, 0x00, 
+	0x67, 0xc7, 0x20, 0x00, 0x49, 0xc1, 0x68, 0x09, 
+	0x31, 0x60, 0x76, 0x48, 0x98, 0x02, 0x49, 0xbf, 
+	0x68, 0x09, 0x31, 0x60, 0x76, 0x08, 0x20, 0x00, 
+	0x49, 0xbc, 0x68, 0x09, 0x6f, 0xc9, 0x60, 0x48, 
+	0x20, 0x00, 0x49, 0xba, 0x68, 0x09, 0x6f, 0xc9, 
+	0x72, 0x48, 0x48, 0xb8, 0x68, 0x00, 0x99, 0x02, 
+	0x5c, 0x40, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x01, 
+	0x49, 0xb9, 0x62, 0x88, 0x48, 0xb3, 0x68, 0x00, 
+	0x30, 0x80, 0x78, 0x81, 0x20, 0x01, 0x40, 0x88, 
+	0x49, 0xb1, 0x68, 0x49, 0x40, 0x08, 0x07, 0x80, 
+	0x0f, 0x80, 0xd0, 0x1b, 0x20, 0x00, 0x49, 0xad, 
+	0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x20, 0x51, 
+	0x49, 0xaa, 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 
+	0x48, 0xa8, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 
+	0x28, 0xff, 0xd0, 0x07, 0x48, 0xa5, 0x68, 0x00, 
+	0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, 
+	0xf0, 0x05, 0xfd, 0x8e, 0x20, 0x51, 0xb0, 0x03, 
+	0xe7, 0x55, 0xe1, 0x6c, 0x20, 0x33, 0x06, 0x40, 
+	0x6b, 0x81, 0x91, 0x00, 0x99, 0x00, 0x20, 0x04, 
+	0x40, 0x08, 0xd0, 0x07, 0x20, 0x04, 0xf0, 0x00, 
+	0xfc, 0xb3, 0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, 
+	0x91, 0x00, 0xe7, 0xf3, 0x4d, 0x9d, 0x99, 0x00, 
+	0x01, 0x08, 0x19, 0x45, 0x48, 0x95, 0x68, 0x00, 
+	0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x9a, 
+	0x60, 0xa8, 0x20, 0xbc, 0x49, 0x91, 0x68, 0x09, 
+	0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d, 0x48, 0x8f, 
+	0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, 
+	0x43, 0x18, 0x60, 0xa8, 0x48, 0x8b, 0x68, 0x00, 
+	0x6f, 0x40, 0x49, 0x8a, 0x68, 0x09, 0x31, 0x80, 
+	0x70, 0x08, 0x48, 0x90, 0x90, 0x01, 0x48, 0x87, 
+	0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x00, 0x43, 
+	0x18, 0x18, 0x01, 0x80, 0x99, 0x01, 0x18, 0x40, 
+	0x90, 0x01, 0x48, 0x82, 0x68, 0x00, 0x6f, 0x00, 
+	0x60, 0x28, 0x98, 0x01, 0x30, 0x04, 0x60, 0x68, 
+	0x20, 0x01, 0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, 
+	0x20, 0x01, 0x40, 0x88, 0x21, 0x33, 0x06, 0x49, 
+	0x63, 0x48, 0x48, 0x83, 0x6b, 0x00, 0x23, 0x01, 
+	0x06, 0x1b, 0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, 
+	0xf0, 0x00, 0xfc, 0x6a, 0xe7, 0xf5, 0x20, 0x01, 
+	0x06, 0x00, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 
+	0x4e, 0x7c, 0x48, 0x72, 0x68, 0x00, 0x30, 0x80, 
+	0x78, 0x80, 0x01, 0x00, 0x19, 0x86, 0x98, 0x01, 
+	0x30, 0x04, 0x60, 0x30, 0x48, 0x78, 0x60, 0x70, 
+	0x48, 0x6c, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00, 
+	0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xb0, 
+	0x20, 0x01, 0x05, 0x80, 0x60, 0xf0, 0x48, 0x67, 
+	0x68, 0x00, 0x30, 0x80, 0x78, 0x81, 0x20, 0x01, 
+	0x40, 0x88, 0x49, 0x65, 0x60, 0xc8, 0x48, 0x63, 
+	0x68, 0x00, 0x30, 0x60, 0x7e, 0x00, 0x49, 0x61, 
+	0x68, 0x09, 0x5c, 0x08, 0x28, 0x00, 0xd0, 0x48, 
+	0x28, 0x01, 0xd0, 0x47, 0x28, 0x02, 0xd0, 0x02, 
+	0x28, 0x03, 0xd0, 0x21, 0xe0, 0x5a, 0x48, 0x67, 
+	0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 
+	0x48, 0x58, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x57, 
+	0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 
+	0x28, 0xbc, 0xd8, 0x05, 0x48, 0x5f, 0x68, 0x01, 
+	0x23, 0x10, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, 
+	0x48, 0x5c, 0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, 
+	0x40, 0x19, 0x60, 0x01, 0x48, 0x59, 0x68, 0x01, 
+	0x23, 0x08, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x39, 
+	0x48, 0x56, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, 
+	0x60, 0x01, 0x48, 0x48, 0x68, 0x00, 0x6f, 0x40, 
+	0x49, 0x46, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 
+	0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05, 0x48, 0x4f, 
+	0x68, 0x01, 0x23, 0x10, 0x43, 0x19, 0x60, 0x01, 
+	0xe0, 0x05, 0x48, 0x4c, 0x68, 0x01, 0x23, 0x10, 
+	0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x48, 0x49, 
+	0x68, 0x01, 0x23, 0x08, 0x43, 0x19, 0x60, 0x01, 
+	0xe0, 0x18, 0xe0, 0x17, 0x48, 0x46, 0x68, 0x01, 
+	0x04, 0x09, 0x0c, 0x09, 0x60, 0x01, 0x48, 0x44, 
+	0x49, 0x36, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 
+	0x04, 0x09, 0x68, 0x02, 0x43, 0x11, 0x60, 0x01, 
+	0x48, 0x40, 0x68, 0x01, 0x23, 0x20, 0x43, 0xdb, 
+	0x40, 0x19, 0x60, 0x01, 0x20, 0x01, 0x49, 0x34, 
+	0x63, 0x08, 0xe7, 0xff, 0x48, 0x36, 0x6b, 0x00, 
+	0x23, 0x01, 0x05, 0x9b, 0x40, 0x18, 0xd1, 0x03, 
+	0x20, 0x04, 0xf0, 0x00, 0xfb, 0xd1, 0xe7, 0xf5, 
+	0x20, 0x01, 0x05, 0x80, 0x21, 0x33, 0x06, 0x49, 
+	0x60, 0x48, 0x48, 0x26, 0x68, 0x00, 0x30, 0x80, 
+	0x78, 0x80, 0x23, 0x01, 0x40, 0x58, 0x49, 0x23, 
+	0x68, 0x09, 0x31, 0x80, 0x70, 0x88, 0x48, 0x21, 
+	0x68, 0x00, 0x6f, 0x40, 0x49, 0x1f, 0x68, 0x09, 
+	0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x49, 0x1d, 
+	0x68, 0x09, 0x67, 0x48, 0x48, 0x1b, 0x68, 0x00, 
+	0x6f, 0xc0, 0x30, 0x04, 0x49, 0x19, 0x68, 0x09, 
+	0x31, 0x80, 0x78, 0x09, 0x68, 0x02, 0x18, 0x89, 
+	0x60, 0x01, 0x48, 0x16, 0x68, 0x00, 0x6f, 0x00, 
+	0x49, 0x14, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 
+	0x18, 0x40, 0x49, 0x12, 0x68, 0x09, 0x67, 0x08, 
+	0x48, 0x10, 0x68, 0x00, 0x6f, 0x40, 0x28, 0x00, 
+	0xd0, 0x00, 0xe6, 0xb3, 0x48, 0x11, 0x21, 0x33, 
+	0x06, 0x49, 0x60, 0x48, 0x48, 0x0e, 0x68, 0x01, 
+	0x4b, 0x19, 0x40, 0x19, 0x60, 0x01, 0x20, 0x48, 
+	0x49, 0x08, 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 
+	0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x31, 0x60, 
+	0x76, 0x88, 0x48, 0x04, 0x68, 0x00, 0x6f, 0xc0, 
+	0x7a, 0x00, 0x28, 0xff, 0xd0, 0x29, 0x48, 0x01, 
+	0xe0, 0x20, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x4c, 
+	0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c, 
+	0x66, 0x00, 0x00, 0x08, 0x23, 0x48, 0x00, 0x00, 
+	0x62, 0x01, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, 
+	0x40, 0x00, 0x00, 0xbc, 0x9e, 0x00, 0x0b, 0x80, 
+	0x66, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x09, 0xc0, 
+	0x66, 0x00, 0x01, 0xf0, 0x64, 0x00, 0x00, 0x60, 
+	0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24, 
+	0xfc, 0xb7, 0xff, 0xff, 0x68, 0x00, 0x6f, 0xc0, 
+	0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 
+	0xfc, 0x23, 0x20, 0x00, 0xb0, 0x03, 0xe5, 0xea, 
+	0xb0, 0x02, 0xb0, 0x01, 0xe5, 0xe7, 0xe5, 0xe6, 
+	0xb5, 0xb0, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d, 
+	0x48, 0x5d, 0x68, 0x00, 0x5d, 0x44, 0x2d, 0x20, 
+	0xdb, 0x03, 0x20, 0xa2, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x48, 0x59, 0x68, 0x00, 0x5d, 0x40, 
+	0x28, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf5, 
+	0x48, 0x56, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 
+	0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 
+	0x2c, 0x04, 0xd1, 0x0b, 0x48, 0x51, 0x69, 0x80, 
+	0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 
+	0x48, 0x4e, 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 
+	0x2c, 0x01, 0xd0, 0x02, 0x20, 0x4d, 0xe7, 0xdd, 
+	0xe0, 0x90, 0x48, 0x4b, 0x68, 0x01, 0x4b, 0x4b, 
+	0x43, 0x19, 0x60, 0x01, 0x48, 0x49, 0x21, 0x33, 
+	0x06, 0x49, 0x60, 0x48, 0x48, 0x48, 0x68, 0x01, 
+	0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, 
+	0x49, 0x41, 0x68, 0x09, 0x31, 0x80, 0x70, 0x88, 
+	0x20, 0x00, 0x49, 0x3f, 0x68, 0x09, 0x31, 0x80, 
+	0x70, 0x48, 0x20, 0xff, 0x49, 0x3c, 0x68, 0x09, 
+	0x55, 0x48, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x18, 
+	0x21, 0x31, 0x06, 0x49, 0x62, 0x48, 0x01, 0x20, 
+	0x49, 0x37, 0x68, 0x09, 0x18, 0x40, 0x30, 0x20, 
+	0x7a, 0x80, 0x28, 0x00, 0xd0, 0x28, 0x20, 0x00, 
+	0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0x49, 0x38, 
+	0x64, 0x08, 0x20, 0x03, 0x49, 0x31, 0x61, 0x08, 
+	0x21, 0x55, 0x01, 0x20, 0x4a, 0x2e, 0x68, 0x12, 
+	0x18, 0x80, 0x6a, 0xc0, 0x72, 0x41, 0x21, 0x00, 
+	0x01, 0x20, 0x4a, 0x2b, 0x68, 0x12, 0x18, 0x80, 
+	0x30, 0x20, 0x72, 0x81, 0x01, 0x20, 0x49, 0x28, 
+	0x68, 0x09, 0x18, 0x40, 0x6a, 0xc0, 0x7a, 0x00, 
+	0x28, 0xff, 0xd0, 0x09, 0x01, 0x20, 0x49, 0x24, 
+	0x68, 0x09, 0x18, 0x40, 0x6a, 0xc0, 0x7a, 0x01, 
+	0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfb, 0x9c, 
+	0x48, 0x1f, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 
+	0x28, 0x00, 0xd0, 0x2b, 0x48, 0x1c, 0x68, 0x00, 
+	0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x0d, 
+	0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 0x31, 0x80, 
+	0x70, 0xc8, 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x28, 
+	0x23, 0x00, 0x22, 0x00, 0x49, 0x1b, 0xf7, 0xf3, 
+	0xfe, 0xcd, 0xb0, 0x01, 0x20, 0x55, 0x49, 0x12, 
+	0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, 
+	0x49, 0x0f, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 
+	0x48, 0x0d, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 
+	0x28, 0xff, 0xd0, 0x07, 0x48, 0x0a, 0x68, 0x00, 
+	0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, 
+	0xf0, 0x05, 0xfb, 0x6a, 0x48, 0x09, 0x21, 0x33, 
+	0x06, 0x49, 0x60, 0x48, 0x48, 0x06, 0x68, 0x01, 
+	0x4b, 0x0b, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, 
+	0xe7, 0x4c, 0xe7, 0x4b, 0xe7, 0x4a, 0x00, 0x00, 
+	0x2e, 0x08, 0x7c, 0x4c, 0x66, 0x00, 0x01, 0x00, 
+	0x66, 0x00, 0x00, 0x08, 0x23, 0x48, 0x00, 0x00, 
+	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, 0x4c, 0x66, 0x00, 0x01, 0x00, 
+	0x62, 0x01, 0x00, 0x80, 0xb5, 0xf7, 0xb0, 0x82, 
+	0x98, 0x02, 0x06, 0x03, 0x0e, 0x1b, 0x93, 0x00, 
+	0x99, 0x03, 0x06, 0x08, 0x0e, 0x00, 0x90, 0x01, 
+	0x9a, 0x04, 0x06, 0x15, 0x0e, 0x2d, 0xb0, 0x84, 
+	0x4a, 0xca, 0x4f, 0xcb, 0x48, 0xcb, 0x68, 0x00, 
+	0x9b, 0x04, 0x5c, 0xc4, 0x48, 0xca, 0x90, 0x02, 
+	0x21, 0x00, 0x23, 0x00, 0x93, 0x01, 0x9b, 0x04, 
+	0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 
+	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, 0x4c, 
+	0x9e, 0x00, 0x0a, 0x00, 0x66, 0x00, 0x01, 0x00, 
+	0x66, 0x00, 0x00, 0x08, 0x62, 0x00, 0x03, 0x00, 
+	0x80, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x04, 
+	0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 
+	0x62, 0x00, 0x00, 0x1c, 0xfe, 0xbf, 0xff, 0xff, 
+	0x62, 0x00, 0x00, 0x08, 0xff, 0xbf, 0xff, 0xff, 
+	0x40, 0x00, 0x00, 0xbc, 0x48, 0x07, 0x69, 0x80, 
+	0x28, 0x02, 0xd0, 0x03, 0x48, 0x05, 0x69, 0x80, 
+	0x28, 0x03, 0xd1, 0x04, 0x20, 0x31, 0x06, 0x40, 
+	0x6a, 0x80, 0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, 
+	0xe7, 0xfb, 0xe7, 0xfa, 0x66, 0x00, 0x01, 0x00, 
+	0xb5, 0xb0, 0x27, 0x0f, 0x20, 0x31, 0x06, 0x40, 
+	0x68, 0xc0, 0x09, 0x05, 0xf7, 0xff, 0xff, 0xe6, 
+	0x43, 0xc4, 0x48, 0x18, 0x69, 0x80, 0x28, 0x00, 
+	0xd0, 0x03, 0x48, 0x16, 0x69, 0x80, 0x28, 0x01, 
+	0xd1, 0x03, 0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 
+	0x47, 0x18, 0x2d, 0x09, 0xd2, 0x1e, 0xa3, 0x02, 
+	0x5d, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
+	0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 
+	0x0e, 0x00, 0x1c, 0x2f, 0xe0, 0x13, 0x20, 0x08, 
+	0x40, 0x20, 0xd0, 0x01, 0x1c, 0x2f, 0xe0, 0x00, 
+	0x27, 0x02, 0xe0, 0x0c, 0x20, 0x08, 0x40, 0x20, 
+	0xd0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x01, 
+	0x27, 0x07, 0xe0, 0x00, 0x27, 0x08, 0xe0, 0x00, 
+	0x27, 0x02, 0xe0, 0x00, 0xe7, 0xff, 0x1c, 0x38, 
+	0xe7, 0xd8, 0xe7, 0xd7, 0x66, 0x00, 0x01, 0x00, 
+	0x1c, 0x01, 0x29, 0x07, 0xd2, 0x0f, 0xa3, 0x02, 
+	0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 
+	0x04, 0x05, 0x06, 0x09, 0x08, 0x07, 0x0a, 0x00, 
+	0xe0, 0x06, 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x03, 
+	0xe0, 0x02, 0xe0, 0x01, 0xe0, 0x00, 0xe7, 0xff, 
+	0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, 
+	0x20, 0x1d, 0x02, 0x80, 0x69, 0x80, 0x49, 0x06, 
+	0x60, 0x08, 0x20, 0x1d, 0x02, 0x80, 0x69, 0x40, 
+	0x49, 0x04, 0x60, 0x08, 0x20, 0x1d, 0x02, 0x80, 
+	0x69, 0xc0, 0x49, 0x03, 0x60, 0x08, 0x47, 0x70, 
+	0x2e, 0x08, 0x94, 0x98, 0x2e, 0x08, 0x94, 0x9c, 
+	0x2e, 0x08, 0x94, 0xa0, 0xb5, 0xf1, 0xb0, 0x81, 
+	0x20, 0x00, 0x4d, 0x21, 0x95, 0x00, 0x21, 0x00, 
+	0x22, 0x00, 0x23, 0x00, 0x43, 0xdb, 0x4c, 0x1f, 
+	0x68, 0x64, 0x42, 0x8c, 0xdd, 0x21, 0x1c, 0x0c, 
+	0x31, 0x01, 0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2f, 
+	0x42, 0x9f, 0xd0, 0xf8, 0x4c, 0x19, 0x68, 0x64, 
+	0x42, 0x8c, 0xda, 0x00, 0xe0, 0x15, 0x32, 0x01, 
+	0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4, 0x9d, 0x00, 
+	0x59, 0x2b, 0x42, 0x9f, 0xd0, 0xf8, 0x02, 0x9c, 
+	0x43, 0x3c, 0x1c, 0x25, 0x1c, 0x04, 0x30, 0x01, 
+	0x00, 0xa4, 0x9e, 0x01, 0x51, 0x35, 0x4c, 0x0f, 
+	0x68, 0x64, 0x42, 0x8c, 0xdb, 0x00, 0x32, 0x01, 
+	0xe7, 0xd9, 0x28, 0x08, 0xd3, 0x02, 0xe0, 0x07, 
+	0x30, 0x01, 0xe7, 0xfa, 0x25, 0x00, 0x43, 0xed, 
+	0x00, 0x84, 0x9e, 0x01, 0x51, 0x35, 0xe7, 0xf7, 
+	0x4c, 0x07, 0x68, 0x24, 0x2c, 0x00, 0xd1, 0x02, 
+	0x24, 0x0d, 0x06, 0xe4, 0x61, 0x22, 0xb0, 0x01, 
+	0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x7c, 0xd4, 0x2e, 0x08, 0x7d, 0x9c, 
+	0x2e, 0x08, 0x94, 0x8c, 0xb5, 0x80, 0x48, 0xdc, 
+	0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x48, 0xda, 
+	0x68, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0xf7, 0xff, 0xff, 0x92, 0x48, 0xd7, 0x49, 0xd8, 
+	0x60, 0x08, 0x48, 0xd8, 0x49, 0xd8, 0x60, 0x08, 
+	0x48, 0xd8, 0x49, 0xd9, 0x60, 0x08, 0x48, 0xd3, 
+	0x49, 0xd8, 0x68, 0x0b, 0x4a, 0xd8, 0x21, 0x00, 
+	0xf0, 0x01, 0xf8, 0xda, 0x20, 0x00, 0x49, 0xd0, 
+	0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0xd0, 
+	0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0xd0, 
+	0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0xca, 
+	0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 
+	0x66, 0x88, 0x48, 0xce, 0x49, 0xc6, 0x68, 0x09, 
+	0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, 
+	0x20, 0x00, 0x49, 0xc5, 0x68, 0x09, 0x23, 0x07, 
+	0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc7, 
+	0x49, 0xc1, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 
+	0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc0, 
+	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, 0x8c, 0x2e, 0x08, 0x7d, 0xc4, 
+	0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x85, 0x5c, 
+	0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x8c, 0xf4, 
+	0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x94, 0x9c, 
+	0x00, 0x00, 0x16, 0xc8, 0x3f, 0xff, 0xff, 0xff, 
+	0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x94, 0x90, 
+	0x68, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x94, 0x8c, 
+	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, 0x98, 0x2e, 0x08, 0x94, 0xa0, 
+	0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x10, 
+	0xd0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 
+	0x1d, 0xc6, 0x36, 0x01, 0x20, 0x4c, 0x43, 0x78, 
+	0x19, 0x00, 0x1d, 0xc5, 0x35, 0x4d, 0x20, 0x10, 
+	0x1b, 0xc0, 0x22, 0x4c, 0x43, 0x42, 0x1c, 0x31, 
+	0x1c, 0x28, 0x4b, 0x03, 0x68, 0x1b, 0xf0, 0x00, 
+	0xfe, 0xb3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x94, 0xa0, 0xb5, 0x90, 0x1c, 0x04, 
+	0x1c, 0x0f, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, 
+	0xf8, 0x07, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00, 
+	0xf8, 0x33, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x00, 0xa0, 
+	0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0xb1, 
+	0x00, 0xdb, 0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 
+	0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b, 
+	0x18, 0xc5, 0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, 
+	0x18, 0x12, 0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, 
+	0x4b, 0x09, 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0x84, 
+	0x1d, 0xfe, 0x36, 0x05, 0x23, 0x65, 0x01, 0x1b, 
+	0x18, 0xfd, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x05, 
+	0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0x78, 
+	0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x94, 0xa0, 0x2e, 0x08, 0x94, 0x98, 
+	0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x20, 0x4c, 
+	0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x4d, 
+	0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5, 
+	0x35, 0x01, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, 
+	0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, 
+	0x68, 0x1b, 0xf0, 0x00, 0xfe, 0x59, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xa0, 
+	0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x20, 0x00, 
+	0x1c, 0x03, 0x30, 0x01, 0x00, 0x9b, 0x18, 0x9c, 
+	0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, 
+	0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd2, 0x00, 
+	0xe7, 0xf2, 0x38, 0x01, 0x21, 0x18, 0x42, 0x81, 
+	0xd8, 0x02, 0xe0, 0x1a, 0x39, 0x01, 0xe7, 0xfa, 
+	0x00, 0x8b, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb, 
+	0x18, 0xe3, 0x69, 0xdc, 0x00, 0x8b, 0x18, 0x9d, 
+	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, 
+	0x00, 0x8b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, 
+	0x18, 0xe3, 0x68, 0x1c, 0x00, 0x8b, 0x18, 0x9d, 
+	0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, 
+	0xe7, 0xe4, 0x23, 0x00, 0x2b, 0x00, 0xd0, 0x10, 
+	0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, 
+	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, 
+	0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, 
+	0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, 
+	0xe0, 0x0e, 0x10, 0x7c, 0x00, 0x83, 0x18, 0x9d, 
+	0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, 
+	0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, 
+	0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, 
+	0xbc, 0xb0, 0x47, 0x70, 0xb4, 0xb0, 0x1c, 0x02, 
+	0x1c, 0x0f, 0x21, 0x00, 0x1c, 0x0b, 0x31, 0x01, 
+	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, 0x9c, 
+	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 
+	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 
+	0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 
+	0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 
+	0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 
+	0x48, 0x50, 0xf0, 0x00, 0xf9, 0x9d, 0x20, 0x4c, 
+	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, 0x9c, 
+	0xb4, 0x90, 0x1c, 0x02, 0x1c, 0x0f, 0x3a, 0x01, 
+	0x2f, 0x01, 0xd1, 0x0d, 0x09, 0x50, 0x00, 0x80, 
+	0x49, 0x0d, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, 
+	0x21, 0x01, 0x40, 0xa1, 0x43, 0x08, 0x09, 0x51, 
+	0x00, 0x89, 0x4b, 0x09, 0x50, 0x58, 0xe0, 0x0d, 
+	0x09, 0x50, 0x00, 0x80, 0x49, 0x06, 0x58, 0x08, 
+	0x06, 0xd4, 0x0e, 0xe4, 0x21, 0x01, 0x40, 0xa1, 
+	0x43, 0xc9, 0x40, 0x01, 0x09, 0x50, 0x00, 0x80, 
+	0x4b, 0x01, 0x50, 0x19, 0xbc, 0x90, 0x47, 0x70, 
+	0x2e, 0x08, 0x94, 0x94, 0xb4, 0x80, 0x1c, 0x01, 
+	0x39, 0x01, 0x09, 0x48, 0x00, 0x80, 0x4a, 0x08, 
+	0x58, 0x10, 0x06, 0xca, 0x0e, 0xd2, 0x27, 0x01, 
+	0x40, 0x97, 0x1c, 0x3b, 0x40, 0x18, 0xd0, 0x03, 
+	0x20, 0x01, 0xbc, 0x80, 0x47, 0x70, 0xe0, 0x01, 
+	0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, 
+	0x2e, 0x08, 0x94, 0x94, 0xb4, 0xf0, 0x1c, 0x07, 
+	0x1c, 0x0a, 0x68, 0x54, 0x6a, 0xf8, 0x05, 0x86, 
+	0x0d, 0xb6, 0x2c, 0x07, 0xda, 0x01, 0x1c, 0x20, 
+	0xe0, 0x00, 0x20, 0x07, 0x1c, 0x05, 0x21, 0x00, 
+	0x42, 0xa9, 0xd3, 0x02, 0xe0, 0x15, 0x31, 0x01, 
+	0xe7, 0xfa, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0, 
+	0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 
+	0x6f, 0xc0, 0x42, 0xb0, 0xd1, 0x08, 0x00, 0x88, 
+	0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x2b, 
+	0x01, 0x5b, 0x18, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 
+	0xe7, 0xe9, 0x1f, 0xe0, 0x28, 0x11, 0xda, 0x01, 
+	0x1f, 0xe0, 0xe0, 0x00, 0x20, 0x11, 0x1c, 0x05, 
+	0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02, 0xe0, 0x0d, 
+	0x31, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x48, 
+	0x18, 0x80, 0x6a, 0x80, 0x42, 0xb0, 0xd1, 0x04, 
+	0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x30, 0x0c, 
+	0xe7, 0xe4, 0xe7, 0xf1, 0x20, 0x00, 0xe7, 0xe1, 
+	0xe7, 0xe0, 0xb5, 0x90, 0x48, 0x07, 0x68, 0x04, 
+	0x48, 0x07, 0x68, 0x07, 0x1c, 0x39, 0x1c, 0x20, 
+	0x4a, 0x06, 0x68, 0x13, 0x22, 0xf3, 0x00, 0xd2, 
+	0xf0, 0x00, 0xf9, 0xca, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xbc, 
+	0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x94, 0x98, 
+	0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x83, 0x22, 0x00, 
+	0x68, 0x4b, 0x2b, 0x07, 0xdd, 0x01, 0x23, 0x07, 
+	0xe0, 0x00, 0x68, 0x4b, 0x1c, 0x1c, 0x23, 0x00, 
+	0x43, 0xdb, 0x93, 0x02, 0x23, 0x00, 0x43, 0xdb, 
+	0x93, 0x01, 0x23, 0x00, 0x93, 0x00, 0x4b, 0x17, 
+	0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x07, 0x4b, 0x15, 
+	0x68, 0x1b, 0x6a, 0xdb, 0x93, 0x02, 0x4b, 0x13, 
+	0x68, 0x1b, 0x6b, 0x5b, 0x93, 0x01, 0x20, 0x00, 
+	0x42, 0xa0, 0xd3, 0x02, 0xe0, 0x16, 0x30, 0x01, 
+	0xe7, 0xfa, 0x00, 0x83, 0x18, 0x1b, 0x00, 0xdb, 
+	0x18, 0x5d, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xeb, 
+	0x6e, 0x9f, 0x04, 0x3b, 0x0c, 0x1b, 0xd0, 0x08, 
+	0x0c, 0x3b, 0x04, 0x1b, 0xd0, 0x05, 0x9b, 0x00, 
+	0x18, 0xc5, 0x26, 0x01, 0x40, 0xae, 0x1c, 0x33, 
+	0x43, 0x1a, 0xe7, 0xe8, 0x23, 0x0d, 0x01, 0xdb, 
+	0x18, 0xcb, 0x61, 0xda, 0xb0, 0x03, 0xbc, 0xf0, 
+	0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x60, 
+	0xb4, 0x80, 0x1c, 0x01, 0x20, 0x00, 0x68, 0x0a, 
+	0x42, 0x90, 0xdb, 0x02, 0xe0, 0x07, 0x30, 0x01, 
+	0xe7, 0xf9, 0x23, 0x00, 0x43, 0xdb, 0x68, 0x8a, 
+	0x00, 0x87, 0x51, 0xd3, 0xe7, 0xf7, 0x22, 0x00, 
+	0x43, 0xd2, 0x68, 0x8b, 0x68, 0x0f, 0x00, 0xbf, 
+	0x51, 0xda, 0x23, 0x00, 0x43, 0xdb, 0x68, 0x8a, 
+	0x68, 0x0f, 0x00, 0xbf, 0x19, 0xd2, 0x60, 0x53, 
+	0x22, 0x00, 0x60, 0x4a, 0xbc, 0x80, 0x47, 0x70, 
+	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, 0xbe, 
+	0x1c, 0x06, 0x1c, 0x38, 0x21, 0x01, 0xf0, 0x0c, 
+	0xff, 0xb9, 0x90, 0x00, 0x1c, 0x31, 0x1c, 0x38, 
+	0xf0, 0x00, 0xf8, 0x50, 0x49, 0x20, 0x68, 0x09, 
+	0x60, 0x08, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00, 
+	0xf8, 0x49, 0x49, 0x1e, 0x68, 0x09, 0x60, 0x08, 
+	0x48, 0x1b, 0x68, 0x00, 0x68, 0x05, 0x48, 0x1c, 
+	0x68, 0x01, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 
+	0x60, 0x01, 0x2c, 0x00, 0xd0, 0x0c, 0x48, 0x19, 
+	0x68, 0x00, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x07, 
+	0x48, 0x14, 0x68, 0x00, 0x68, 0x05, 0x48, 0x14, 
+	0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 
+	0x1c, 0x20, 0x49, 0x13, 0x68, 0x09, 0x70, 0x08, 
+	0x48, 0x12, 0x63, 0xc5, 0x20, 0x3f, 0x04, 0x00, 
+	0x40, 0x28, 0x0c, 0x00, 0x49, 0x10, 0x62, 0x08, 
+	0x20, 0xff, 0x02, 0x00, 0x40, 0x28, 0x0a, 0x00, 
+	0x49, 0x0d, 0x62, 0x48, 0x06, 0xa8, 0x0e, 0x80, 
+	0x23, 0x80, 0x43, 0x18, 0x49, 0x0a, 0x62, 0x88, 
+	0x1c, 0x28, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xb0, 0x01, 0xe7, 0xfa, 0x00, 0x00, 
+	0x2e, 0x08, 0x94, 0xa4, 0x2e, 0x08, 0x94, 0xa8, 
+	0x6a, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x94, 0xac, 
+	0x2e, 0x08, 0x94, 0xb0, 0x68, 0x00, 0x0d, 0x00, 
+	0x72, 0x00, 0x01, 0x00, 0xb4, 0x80, 0x1c, 0x02, 
+	0x1c, 0x0f, 0x06, 0xb9, 0x0e, 0x89, 0x20, 0x01, 
+	0x03, 0x80, 0x40, 0x10, 0x09, 0xc0, 0x43, 0x01, 
+	0x20, 0xf0, 0x40, 0x10, 0x01, 0x40, 0x43, 0x01, 
+	0x07, 0x10, 0x0f, 0x00, 0x03, 0x00, 0x43, 0x01, 
+	0x20, 0x07, 0x02, 0xc0, 0x40, 0x10, 0x01, 0x40, 
+	0x43, 0x01, 0x20, 0x07, 0x02, 0x00, 0x40, 0x10, 
+	0x02, 0xc0, 0x43, 0x01, 0x1c, 0x08, 0xbc, 0x80, 
+	0x47, 0x70, 0xe7, 0xfc, 0xb5, 0xff, 0x1c, 0x05, 
+	0x1c, 0x0c, 0x1c, 0x17, 0x9b, 0x03, 0x06, 0x18, 
+	0x16, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 
+	0x1c, 0x01, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x05, 
+	0x20, 0xd0, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 
+	0x47, 0x18, 0xe0, 0x17, 0x23, 0x04, 0x43, 0xdb, 
+	0x40, 0x19, 0x01, 0x08, 0x4b, 0x0a, 0x68, 0x1b, 
+	0x18, 0xc2, 0x60, 0x15, 0x60, 0x54, 0x2e, 0xfe, 
+	0xd0, 0x04, 0x20, 0x01, 0x40, 0xb0, 0x60, 0xd0, 
+	0x4b, 0x06, 0x43, 0x1f, 0x60, 0x97, 0x20, 0x01, 
+	0x40, 0x88, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58, 
+	0x20, 0x00, 0xe7, 0xe2, 0xe7, 0xe1, 0x00, 0x00, 
+	0x2e, 0x08, 0x20, 0x14, 0x80, 0x00, 0x00, 0x00, 
+	0xb4, 0xb0, 0x1c, 0x01, 0x06, 0x08, 0x16, 0x04, 
+	0x4f, 0x0c, 0x22, 0x00, 0x20, 0x00, 0x28, 0x04, 
+	0xd3, 0x02, 0xe0, 0x0b, 0x30, 0x01, 0xe7, 0xfa, 
+	0x01, 0x03, 0x19, 0xdb, 0x68, 0x5b, 0x42, 0xa3, 
+	0xd1, 0x03, 0x25, 0x01, 0x40, 0x85, 0x1c, 0x2b, 
+	0x43, 0x1a, 0xe7, 0xf3, 0x23, 0x33, 0x06, 0x5b, 
+	0x6c, 0x1b, 0x40, 0x13, 0xd0, 0x00, 0xe7, 0xf9, 
+	0xbc, 0xb0, 0x47, 0x70, 0x9e, 0x00, 0x00, 0xc0, 
+	0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x91, 0x10, 0x14, 
+	0xe2, 0x01, 0x00, 0xff, 0xe5, 0x9f, 0x10, 0x2c, 
+	0xe5, 0xd1, 0x10, 0x00, 0xe3, 0x51, 0x00, 0xff, 
+	0x0a, 0x00, 0x00, 0x05, 0xe5, 0x9f, 0x10, 0x1c, 
+	0xe5, 0xd1, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x01, 
+	0xe1, 0xa0, 0x11, 0x12, 0xe3, 0xa0, 0x24, 0x66, 
+	0xe5, 0x82, 0x10, 0x10, 0xe3, 0xa0, 0x14, 0x62, 
+	0xe5, 0x81, 0x00, 0x14, 0xe1, 0x2f, 0xff, 0x1e, 
+	0x2e, 0x08, 0x7c, 0x50, 0x47, 0x00, 0x00, 0x00, 
+	0x47, 0x08, 0x00, 0x00, 0x47, 0x10, 0x00, 0x00, 
+	0x47, 0x18, 0x00, 0x00, 0x47, 0x20, 0x00, 0x00, 
+	0x47, 0x28, 0x00, 0x00, 0x47, 0x30, 0x00, 0x00, 
+	0x47, 0x38, 0x00, 0x00, 0x17, 0xcb, 0x40, 0x59, 
+	0x1a, 0xc9, 0x17, 0xc2, 0x40, 0x50, 0x1a, 0x80, 
+	0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xe5, 0xb4, 0x0c, 
+	0x08, 0x4b, 0x1c, 0x02, 0x42, 0x9a, 0xd8, 0x00, 
+	0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00, 0xe0, 0x00, 
+	0x08, 0x52, 0x42, 0x91, 0x41, 0x5b, 0x42, 0x91, 
+	0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82, 0xd1, 0xf7, 
+	0x1c, 0x18, 0xbc, 0x0c, 0x40, 0x5a, 0x40, 0x50, 
+	0x1a, 0x80, 0x40, 0x59, 0x1a, 0xc9, 0x47, 0x70, 
+	0x08, 0x4b, 0x1c, 0x02, 0xd1, 0x01, 0xf0, 0x00, 
+	0xf9, 0xc7, 0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, 
+	0xd3, 0xfb, 0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, 
+	0x42, 0x91, 0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, 
+	0x1a, 0x89, 0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, 
+	0x47, 0x70, 0x00, 0x00, 0x3a, 0x20, 0xd5, 0x09, 
+	0x42, 0x53, 0x32, 0x20, 0x40, 0xd0, 0x46, 0x94, 
+	0x1c, 0x0a, 0x40, 0x9a, 0x43, 0x10, 0x46, 0x62, 
+	0x40, 0xd1, 0x47, 0x70, 0x1c, 0x08, 0x40, 0xd0, 
+	0x21, 0x00, 0x47, 0x70, 0x40, 0x10, 0x40, 0x19, 
+	0x47, 0x70, 0x00, 0x00, 0x47, 0x70, 0x00, 0x00, 
+	0x46, 0x84, 0x07, 0x83, 0xd0, 0x05, 0x1e, 0x52, 
+	0xd3, 0x12, 0x70, 0x01, 0x1c, 0x40, 0x07, 0x83, 
+	0xd1, 0xf9, 0x3a, 0x08, 0xd3, 0x07, 0x02, 0x0b, 
+	0x43, 0x19, 0x04, 0x0b, 0x43, 0x19, 0x1c, 0x0b, 
+	0xc0, 0x0a, 0x3a, 0x08, 0xd2, 0xfc, 0x1d, 0xd2, 
+	0xd3, 0x02, 0x54, 0x81, 0x1e, 0x52, 0xd2, 0xfc, 
+	0x46, 0x60, 0x47, 0x70, 0xb5, 0x80, 0x00, 0x43, 
+	0x15, 0x5f, 0x43, 0xff, 0x1c, 0x02, 0x0f, 0xc0, 
+	0x07, 0xc0, 0x2f, 0x00, 0xd0, 0x15, 0x43, 0x0b, 
+	0xd0, 0x0c, 0x28, 0x00, 0xd1, 0x07, 0x1c, 0x10, 
+	0xf0, 0x00, 0xf9, 0x92, 0xf0, 0x00, 0xfa, 0x2c, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, 
+	0x1c, 0x10, 0xe0, 0x11, 0x21, 0x01, 0x07, 0xc8, 
+	0xf0, 0x00, 0xfb, 0x2a, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x03, 0x13, 0x43, 0x0b, 0xd1, 0x05, 
+	0x28, 0x00, 0xd1, 0x03, 0x1c, 0x10, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, 0x07, 0xc8, 
+	0xf0, 0x00, 0xfb, 0x14, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93, 
+	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, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, 
+	0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, 
+	0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, 
+	0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, 
+	0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, 
+	0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, 
+	0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, 
+	0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, 
+	0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, 
+	0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, 
+	0x01, 0x01, 0x01, 0x01, 0x46, 0x84, 0x1c, 0x03, 
+	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, 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, 0x58, 
+	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, 0x33, 0xb0, 0x80, 0x00, 0x3f, 0xff, 
+	0x80, 0x00, 0x3f, 0xfe, 0x2e, 0x03, 0x33, 0x5c, 
+	0x2e, 0x03, 0x33, 0x80, 0x2e, 0x03, 0x33, 0x44, 
+	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, 0xb8, 
+	0x2e, 0x08, 0x20, 0xc4, 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, 0x34, 0x9c, 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, 0x58, 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, 0xd4, 
+	0x2e, 0x08, 0x20, 0xa0, 0x00, 0x00, 0x00, 0x00, 
+	0x2e, 0x02, 0x56, 0x44, 0x2e, 0x02, 0x56, 0x40, 
+	0x2e, 0x02, 0x56, 0x3c, 0x2e, 0x08, 0x9a, 0x04, 
+	0x2e, 0x00, 0x1b, 0x8d, 0x2e, 0x01, 0x99, 0xd5, 
+	0x2e, 0x01, 0x98, 0x89, 0x2e, 0x01, 0x99, 0x49, 
+	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, 0x91, 0xcc, 0x2e, 0x01, 0x91, 0xe4, 
+	0x2e, 0x01, 0x92, 0x00, 0x2e, 0x01, 0x92, 0x20, 
+	0x2e, 0x01, 0x92, 0x34, 0x2e, 0x01, 0x92, 0x44, 
+	0x2e, 0x01, 0x92, 0x5c, 0x2e, 0x01, 0x92, 0x74, 
+	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, 0x98, 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, 0xbc, 0x2e, 0x08, 0x20, 0xce, 
+	0x2e, 0x01, 0xae, 0x81, 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, 0xee, 0xb0, 0x04, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x3a, 0x74, 0x74, 0x00, 
+	0x2e, 0x08, 0x21, 0x9c, 0x2e, 0x08, 0x21, 0x9c, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb2, 0x31, 
+	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xaf, 0x11, 
+	0x2e, 0x01, 0xb1, 0xfd, 0x00, 0x00, 0x00, 0x00, 
+	0x2e, 0x01, 0xb6, 0x55, 0xb5, 0x90, 0x28, 0x00, 
+	0xd0, 0x04, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x01, 
+	0xf7, 0xff, 0xff, 0xfe, 0x4f, 0x10, 0x68, 0x78, 
+	0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xfd, 0xb6, 
+	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, 0x9c, 0x2e, 0x08, 0x21, 0x9c, 
+	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb6, 0xf5, 
+	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, 0xb4, 0x2e, 0x08, 0x21, 0xa4, 
+	0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xe4, 
+	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, 0xb4, 0x2e, 0x08, 0x22, 0xb8, 
+	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, 0x8f, 0x31, 
+	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, 0x9c, 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, 0xfb, 0x10, 
+	0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x20, 0xb8, 0x2e, 0x08, 0x94, 0xb4, 
+	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 
+	0x28, 0x00, 0xdd, 0x09, 0x28, 0x0b, 0xda, 0x07, 
+	0x00, 0x80, 0x49, 0x04, 0x58, 0x08, 0x49, 0x04, 
+	0x42, 0x88, 0xd0, 0x01, 0x20, 0x01, 0x47, 0x70, 
+	0x20, 0x00, 0x47, 0x70, 0x2e, 0x08, 0x94, 0xb4, 
+	0xff, 0xff, 0xff, 0xff, 0x28, 0x00, 0xdd, 0x01, 
+	0x28, 0x0b, 0xdb, 0x01, 0x48, 0x03, 0x47, 0x70, 
+	0x00, 0x83, 0x4a, 0x03, 0x58, 0xd0, 0x50, 0xd1, 
+	0x47, 0x70, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 
+	0x2e, 0x08, 0x94, 0xb4, 0xb5, 0x90, 0x27, 0x01, 
+	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, 0xb5, 0xd5, 
+	0x2e, 0x08, 0x21, 0x9c, 0xb5, 0x80, 0xb0, 0x83, 
+	0x90, 0x00, 0x91, 0x01, 0xf7, 0xfd, 0xfb, 0x8a, 
+	0x90, 0x02, 0x46, 0x69, 0x20, 0x01, 0xf0, 0x01, 
+	0xf8, 0x61, 0x23, 0x01, 0x1c, 0x07, 0x42, 0xd8, 
+	0xd1, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 
+	0xf8, 0x59, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 
+	0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x80, 0xb0, 0x81, 
+	0x90, 0x00, 0x46, 0x69, 0x20, 0x02, 0xf0, 0x01, 
+	0xf8, 0x49, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 
+	0x20, 0x13, 0xf0, 0x01, 0xf8, 0x43, 0x49, 0x03, 
+	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb8, 
+	0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 
+	0x92, 0x02, 0x46, 0x69, 0x20, 0x05, 0xf0, 0x01, 
+	0xf8, 0x31, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 
+	0x20, 0x13, 0xf0, 0x01, 0xf8, 0x2b, 0x49, 0x03, 
+	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb8, 
+	0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 
+	0x92, 0x02, 0x93, 0x03, 0x46, 0x69, 0x20, 0x06, 
+	0xf0, 0x01, 0xf8, 0x18, 0x1c, 0x07, 0xd0, 0x05, 
+	0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x12, 
+	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x00, 0xb0, 0x81, 
+	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, 0xb8, 0xb5, 0x80, 0xb0, 0x81, 
+	0x90, 0x00, 0x46, 0x69, 0x20, 0x0b, 0xf0, 0x00, 
+	0xff, 0xd5, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00, 
+	0x20, 0x13, 0xf0, 0x00, 0xff, 0xcf, 0x49, 0x03, 
+	0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb8, 
+	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, 0xc7, 0x90, 0x01, 
+	0x46, 0x69, 0x20, 0x12, 0xf0, 0x00, 0xff, 0x9e, 
+	0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 
+	0xf0, 0x00, 0xff, 0x98, 0x49, 0x03, 0x60, 0x08, 
+	0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb8, 
+	0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfd, 
+	0xfa, 0xad, 0x90, 0x01, 0x46, 0x69, 0x20, 0x0e, 
+	0xf0, 0x00, 0xff, 0x84, 0x1c, 0x07, 0xd0, 0x05, 
+	0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x7e, 
+	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x80, 0xb0, 0x84, 
+	0x90, 0x00, 0x1c, 0x0f, 0xf7, 0xfd, 0xfa, 0x92, 
+	0x90, 0x01, 0x97, 0x02, 0x1c, 0x38, 0xf7, 0xfd, 
+	0xfa, 0x8d, 0x90, 0x03, 0x46, 0x69, 0x20, 0x0f, 
+	0xf0, 0x00, 0xff, 0x64, 0x1c, 0x07, 0xd0, 0x05, 
+	0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x5e, 
+	0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 
+	0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 
+	0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x80, 0xb0, 0x82, 
+	0x4f, 0x08, 0x97, 0x00, 0x20, 0xff, 0x30, 0x01, 
+	0x90, 0x01, 0x46, 0x69, 0x20, 0x15, 0xf0, 0x00, 
+	0xff, 0x49, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x00, 
+	0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xe4, 
+	0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 
+	0xff, 0x39, 0x49, 0x02, 0x68, 0x09, 0x1a, 0x40, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0xac, 
+	0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 
+	0xff, 0x2d, 0x49, 0x02, 0x60, 0x08, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xac, 
+	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, 0xb4, 
+	0x2e, 0x03, 0x33, 0xf8, 0xb5, 0x80, 0x49, 0x07, 
+	0x68, 0x09, 0xf7, 0xfd, 0xf9, 0x35, 0x1c, 0x07, 
+	0xd1, 0x03, 0xa1, 0x05, 0xa0, 0x05, 0xf0, 0x00, 
+	0xfc, 0xe7, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, 
+	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, 0xe4, 
+	0x00, 0x00, 0x02, 0x02, 0x2e, 0x08, 0x96, 0x24, 
+	0x2e, 0x08, 0x96, 0x64, 0x2e, 0x08, 0x96, 0xa4, 
+	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, 0xfd, 0xf8, 0x02, 0x0d, 0xf0, 0x05, 0xc0, 
+	0x23, 0xa5, 0x05, 0xdb, 0x42, 0xd8, 0xd1, 0x07, 
+	0x48, 0x0b, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x38, 
+	0x1c, 0x29, 0xf7, 0xff, 0xff, 0xfe, 0x1c, 0x05, 
+	0x22, 0x40, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xfd, 
+	0xf8, 0x4b, 0x1c, 0x28, 0xb0, 0x03, 0xbc, 0xf0, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xe4, 
+	0xff, 0xef, 0xff, 0xff, 0x2e, 0x08, 0x20, 0xb4, 
+	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, 0xe4, 
+	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, 0x64, 0x2e, 0x08, 0x21, 0x9c, 
+	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, 0x91, 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, 0xe4, 
+	0x2e, 0x08, 0x96, 0x64, 0x77, 0x00, 0x00, 0x00, 
+	0x72, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x96, 0x24, 
+	0xb5, 0x90, 0x27, 0x03, 0x4c, 0x09, 0x01, 0xb8, 
+	0x19, 0x00, 0xf7, 0xff, 0xfe, 0xa5, 0x37, 0x01, 
+	0x2f, 0x10, 0xdb, 0xf8, 0x27, 0x00, 0x01, 0xb8, 
+	0x19, 0x00, 0xf7, 0xff, 0xfe, 0x9d, 0x37, 0x01, 
+	0x2f, 0x03, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 
+	0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xe4, 
+	0xb5, 0xb0, 0x01, 0x80, 0x1c, 0x0f, 0x4c, 0x0a, 
+	0x19, 0x00, 0x1c, 0x05, 0xf7, 0xff, 0xfe, 0x8c, 
+	0x01, 0xb8, 0x19, 0x00, 0x23, 0x01, 0x05, 0x1b, 
+	0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1, 0x4b, 0x05, 
+	0x40, 0x19, 0x60, 0xe9, 0x69, 0x40, 0x61, 0x68, 
+	0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 
+	0x2e, 0x08, 0x95, 0xe4, 0x00, 0x10, 0x8f, 0x03, 
+	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, 
+	0xfd, 0x0d, 0x1d, 0xe0, 0x30, 0x0b, 0x1c, 0x39, 
+	0xf7, 0xff, 0xff, 0xda, 0x21, 0x29, 0x70, 0x01, 
+	0x21, 0x00, 0x70, 0x41, 0x1c, 0x20, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x30, 0x08, 0xbc, 0x90, 
+	0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xd4, 
+	0x2e, 0x08, 0x99, 0xe4, 0x55, 0x6e, 0x6b, 0x6e, 
+	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, 0xe4, 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, 0xb8, 
+	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, 0xc2, 0x84, 0x2e, 0x01, 0xc2, 0x28, 
+	0x2e, 0x01, 0xc2, 0x58, 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, 0xc0, 0xf8, 
+	0x2e, 0x01, 0xc1, 0x30, 0x2e, 0x01, 0xc1, 0x4c, 
+	0x2e, 0x01, 0xc0, 0xf8, 0x2e, 0x01, 0xc1, 0x14, 
+	0x2e, 0x01, 0xc1, 0x4c, 0x2e, 0x01, 0xc1, 0x30, 
+	0x2e, 0x01, 0xc0, 0xa8, 0xe9, 0x2d, 0x5f, 0xff, 
+	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, 0xc3, 0x61, 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, 0xfc, 
+	0x2e, 0x01, 0xc3, 0x90, 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, 0xc4, 0x10, 0xe8, 0xbd, 0x5f, 0xf0, 
+	0xe1, 0xb0, 0xf0, 0x0e, 0x2e, 0x08, 0x1f, 0xf0, 
+	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, 0xe8, 
+	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, 0xb0, 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, 0x08, 0xcc, 0x1f, 0xff, 0xef, 
+	0xcc, 0x1f, 0x7f, 0xf0, 0x2e, 0x00, 0x1b, 0x8d, 
+	0x2e, 0x01, 0xc2, 0xe8, 0x2e, 0x01, 0xc3, 0xe0, 
+	0x2e, 0x08, 0x32, 0xfc, 0x00, 0x00, 0x08, 0x00, 
+	0x2e, 0x08, 0x22, 0xfc, 0x00, 0x00, 0x08, 0x00, 
+	0x2e, 0x08, 0x2a, 0xfc, 0x00, 0x00, 0x08, 0x00, 
+	0x2e, 0x08, 0x59, 0xb8, 0xe5, 0x9f, 0xf0, 0x04, 
+	0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, 
+	0x2e, 0x08, 0x59, 0xb8, 0x2e, 0x08, 0x59, 0xb9, 
+	0x2e, 0x08, 0x59, 0xba, 0x2e, 0x03, 0x34, 0x9c, 
+	0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x3b, 0x78, 
+	0x2e, 0x08, 0x9a, 0x04, 0x1d, 0x77, 0x1e, 0x16, 
+	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, 0x71, 0xfd, 
+	0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, 
+	0x2e, 0x00, 0x5b, 0x9b, 0xe5, 0x9f, 0xc0, 0x00, 
+	0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5c, 0x25, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	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, 0xc1, 0xa8, 0x2e, 0x01, 0xc2, 0xc0, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xc1, 0xa8, 
+	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, 0x00, 0x00, 0x00, 
+	0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 
+	0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 
+	0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 
+	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, 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, 0xd4, 
+	0x2e, 0x08, 0x05, 0xd4, 0x2e, 0x08, 0x05, 0xdc, 
+	0x2e, 0x08, 0x05, 0xdc, 0x2e, 0x08, 0x05, 0xe4, 
+	0x2e, 0x08, 0x05, 0xe4, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 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, 0x66, 0x3c, 
+	0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 
+	0x2e, 0x08, 0x07, 0xa8, 0x00, 0x00, 0x00, 0x00, 
+	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
+	0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 
+	0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x10, 
+	0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 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, 0x06, 0xf7, 
+	0x11, 0x38, 0x06, 0x53, 0x2e, 0x08, 0x17, 0xe8, 
+	0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x20, 
+	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x20, 
+	0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, 
+	0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x02, 0xb9, 
+	0x0e, 0xa6, 0x06, 0x53, 0x2e, 0x08, 0x19, 0x18, 
+	0x2e, 0x08, 0x1a, 0x3c, 0x2e, 0x08, 0x19, 0x0c, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
+	0x00, 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, 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, 0x50, 
+	0x2e, 0x08, 0x1f, 0x54, 0x2e, 0x08, 0x1f, 0x58, 
+	0x2e, 0x08, 0x1f, 0x60, 0x2e, 0x08, 0x1f, 0x64, 
+	0x2e, 0x08, 0x1f, 0x68, 0x6e, 0x00, 0x01, 0x00, 
+	0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x08, 
+	0x6e, 0x00, 0x01, 0x0c, 0x6e, 0x00, 0x01, 0x04, 
+	0x6e, 0x00, 0x01, 0x10, 0x6e, 0x00, 0x01, 0x14, 
+	0x2e, 0x08, 0x60, 0x60, 0x00, 0x00, 0x00, 0x0d, 
+	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, 0xb4, 0x2e, 0x08, 0x1f, 0xb8, 
+	0x2e, 0x08, 0x1f, 0xbc, 0x2e, 0x08, 0x1f, 0xc0, 
+	0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x04, 
+	0x70, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x0c, 
+	0x70, 0x00, 0x00, 0x10, 0x70, 0x00, 0x00, 0x30, 
+	0x2e, 0x01, 0xc4, 0xa9, 0x2e, 0x01, 0xc4, 0x39, 
+	0x2e, 0x01, 0xc3, 0xb1, 0x2e, 0x01, 0xc3, 0xa9, 
+	0x2e, 0x01, 0xc4, 0xe1, 0x2e, 0x01, 0xc4, 0x71, 
+	0x2e, 0x01, 0xc5, 0x25, 0x2e, 0x01, 0xc5, 0x1d, 
+	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, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+	0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, 
+};
+
diff -Nru a/drivers/media/dvb/ttpci/av7110_ipack.c b/drivers/media/dvb/ttpci/av7110_ipack.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/av7110_ipack.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,404 @@
+#include "dvb_filter.h"
+#include "av7110_ipack.h"
+#include <linux/string.h>	/* for memcpy() */
+
+
+void av7110_ipack_reset(ipack *p)
+{
+	p->found = 0;
+	p->cid = 0;
+	p->plength = 0;
+	p->flag1 = 0;
+	p->flag2 = 0;
+	p->hlength = 0;
+	p->mpeg = 0;
+	p->check = 0;
+	p->which = 0;
+	p->done = 0;
+	p->count = 0;
+}
+
+
+void av7110_ipack_init(ipack *p, int size,
+		       void (*func)(u8 *buf, int size, void *priv))
+{
+	if ( !(p->buf = vmalloc(size*sizeof(u8))) ){
+		printk ("Couldn't allocate memory for ipack\n");
+	}
+	p->size = size;
+	p->func = func;
+	p->repack_subids = 0;
+	av7110_ipack_reset(p);
+}
+
+
+void av7110_ipack_free(ipack * p)
+{
+	if (p->buf) vfree(p->buf);
+}
+
+
+static
+void send_ipack(ipack *p)
+{
+	int off;
+	AudioInfo ai;
+	int ac3_off = 0;
+	int streamid=0;
+	int nframes= 0;
+	int f=0;
+
+	switch ( p->mpeg ){
+	case 2:		
+		if (p->count < 10) return;
+		p->buf[3] = p->cid;
+		
+		p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8);
+		p->buf[5] = (u8)((p->count-6) & 0x00FF);
+		if (p->repack_subids && p->cid == PRIVATE_STREAM1){
+			
+			off = 9+p->buf[8];
+			streamid = p->buf[off];
+			if ((streamid & 0xF8) == 0x80){
+				ai.off = 0;
+				ac3_off = ((p->buf[off+2] << 8)| 
+					   p->buf[off+3]);
+				if (ac3_off < p->count)
+					f=dvb_filter_get_ac3info(p->buf+off+3+ac3_off, 
+						      p->count-ac3_off, &ai,0);
+				if ( !f ){
+					nframes = (p->count-off-3-ac3_off)/ 
+						ai.framesize + 1;
+					p->buf[off+2] = (ac3_off >> 8)& 0xFF;
+					p->buf[off+3] = (ac3_off)& 0xFF;
+					p->buf[off+1] = nframes;
+					
+					ac3_off +=  nframes * ai.framesize - 
+						p->count;
+				}
+			}
+		} 
+		p->func(p->buf, p->count, p->data);
+	
+		p->buf[6] = 0x80;
+		p->buf[7] = 0x00;
+		p->buf[8] = 0x00;
+		p->count = 9;
+		if (p->repack_subids && p->cid == PRIVATE_STREAM1 
+		    && (streamid & 0xF8)==0x80 ){
+			p->count += 4;
+			p->buf[9] = streamid;
+			p->buf[10] = (ac3_off >> 8)& 0xFF;
+			p->buf[11] = (ac3_off)& 0xFF;
+			p->buf[12] = 0;
+		}
+
+		break;
+	case 1:
+		if (p->count < 8) return;
+		p->buf[3] = p->cid;
+		
+		p->buf[4] = (u8)(((p->count-6) & 0xFF00) >> 8);
+		p->buf[5] = (u8)((p->count-6) & 0x00FF);
+		p->func(p->buf, p->count, p->data);
+	
+		p->buf[6] = 0x0F;
+		p->count = 7;
+		break;
+	}
+}
+
+
+void av7110_ipack_flush(ipack *p)
+{
+	if (p->plength != MMAX_PLENGTH-6 || p->found<=6)
+		return;
+	p->plength = p->found-6;
+	p->found = 0;
+	send_ipack(p);
+	av7110_ipack_reset(p);
+}
+
+
+static 
+void write_ipack(ipack *p, const u8 *data, int count)
+{
+	u8 headr[3] = { 0x00, 0x00, 0x01} ;
+
+	if (p->count < 6){
+		memcpy(p->buf, headr, 3);
+		p->count = 6;
+	}
+
+	if (p->count + count < p->size){
+		memcpy(p->buf+p->count, data, count);
+		p->count += count;
+	} else {
+		int rest = p->size - p->count;
+		memcpy(p->buf+p->count, data, rest);
+		p->count += rest;
+		send_ipack(p);
+		if (count - rest > 0)
+			write_ipack(p, data+rest, count-rest);
+	}
+}
+
+
+int av7110_ipack_instant_repack (const u8 *buf, int count, ipack *p)
+{
+	int l;
+	int c=0;
+
+	while (c < count && (p->mpeg == 0 ||
+			     (p->mpeg == 1 && p->found < 7) ||
+			     (p->mpeg == 2 && p->found < 9))
+	       &&  (p->found < 5 || !p->done)){
+		switch ( p->found ){
+		case 0:
+		case 1:
+			if (buf[c] == 0x00) p->found++;
+			else p->found = 0;
+			c++;
+			break;
+		case 2:
+			if (buf[c] == 0x01) p->found++;
+			else if (buf[c] == 0) {
+				p->found = 2;
+			} else p->found = 0;
+			c++;
+			break;
+		case 3:
+			p->cid = 0;
+			switch (buf[c]){
+			case PROG_STREAM_MAP:
+			case PRIVATE_STREAM2:
+			case PROG_STREAM_DIR:
+			case ECM_STREAM     :
+			case EMM_STREAM     :
+			case PADDING_STREAM :
+			case DSM_CC_STREAM  :
+			case ISO13522_STREAM:
+				p->done = 1;
+			case PRIVATE_STREAM1:
+			case VIDEO_STREAM_S ... VIDEO_STREAM_E:
+			case AUDIO_STREAM_S ... AUDIO_STREAM_E:
+				p->found++;
+				p->cid = buf[c];
+				c++;
+				break;
+			default:
+				p->found = 0;
+				break;
+			}
+			break;
+			
+		case 4:
+			if (count-c > 1){
+				p->plen[0] = buf[c];
+				c++;
+				p->plen[1] = buf[c];
+				c++;
+				p->found+=2;
+				p->plength=(p->plen[0]<<8)|p->plen[1];
+ 			} else {
+				p->plen[0] = buf[c];
+				p->found++;
+				return count;
+			}
+			break;
+		case 5:
+			p->plen[1] = buf[c];
+			c++;
+			p->found++;
+			p->plength=(p->plen[0]<<8)|p->plen[1];
+			break;
+		case 6:
+			if (!p->done){
+				p->flag1 = buf[c];
+				c++;
+				p->found++;
+				if ( (p->flag1 & 0xC0) == 0x80 ) p->mpeg = 2;
+				else {
+					p->hlength = 0;
+					p->which = 0;
+					p->mpeg = 1;
+					p->flag2 = 0;
+				}
+			}
+			break;
+
+		case 7:
+			if ( !p->done && p->mpeg == 2) {
+				p->flag2 = buf[c];
+				c++;
+				p->found++;
+			}	
+			break;
+
+		case 8:
+			if ( !p->done && p->mpeg == 2) {
+				p->hlength = buf[c];
+				c++;
+				p->found++;
+			}
+			break;
+			
+		default:
+
+			break;
+		}
+	}
+
+	if (c == count) return count;
+
+	if (!p->plength) p->plength = MMAX_PLENGTH-6;
+
+	if ( p->done || ((p->mpeg == 2 && p->found >= 9) || 
+	     (p->mpeg == 1 && p->found >= 7)) ){
+		switch (p->cid){
+			
+		case AUDIO_STREAM_S ... AUDIO_STREAM_E:			
+		case VIDEO_STREAM_S ... VIDEO_STREAM_E:
+		case PRIVATE_STREAM1:
+			
+			if (p->mpeg == 2 && p->found == 9) {
+				write_ipack(p, &p->flag1, 1);
+				write_ipack(p, &p->flag2, 1);
+				write_ipack(p, &p->hlength, 1);
+			}
+
+			if (p->mpeg == 1 && p->found == 7) 
+				write_ipack(p, &p->flag1, 1);
+			
+			if (p->mpeg == 2 && (p->flag2 & PTS_ONLY) &&  
+			    p->found < 14) {
+				while (c < count && p->found < 14) {
+					p->pts[p->found-9] = buf[c];
+					write_ipack(p, buf+c, 1);
+					c++;
+					p->found++;
+				}
+				if (c == count) return count;
+			}
+
+			if (p->mpeg == 1 && p->which < 2000) {
+
+				if (p->found == 7) {
+					p->check = p->flag1;
+					p->hlength = 1;
+				}
+
+				while (!p->which && c < count && 
+				       p->check == 0xFF){
+					p->check = buf[c];
+					write_ipack(p, buf+c, 1);
+					c++;
+					p->found++;
+					p->hlength++;
+				}
+				
+				if ( c == count) return count;
+				
+				if ( (p->check & 0xC0) == 0x40 && !p->which){
+					p->check = buf[c];
+					write_ipack(p, buf+c, 1);
+					c++;
+					p->found++;
+					p->hlength++;
+					
+					p->which = 1;
+					if ( c == count) return count;
+					p->check = buf[c];
+					write_ipack(p, buf+c, 1);
+					c++;
+					p->found++;
+					p->hlength++;
+					p->which = 2;
+					if ( c == count) return count;
+				}
+				
+				if (p->which == 1){
+					p->check = buf[c];
+					write_ipack(p, buf+c, 1);
+					c++;
+					p->found++;
+					p->hlength++;
+					p->which = 2;
+					if ( c == count) return count;
+				}
+				
+				if ( (p->check & 0x30) && p->check != 0xFF){
+					p->flag2 = (p->check & 0xF0) << 2;
+					p->pts[0] = p->check;
+					p->which = 3;
+				} 
+			
+				if ( c == count) return count;
+				if (p->which > 2){
+					if ((p->flag2 & PTS_DTS_FLAGS)
+					    == PTS_ONLY){
+						while (c < count && 
+						       p->which < 7){
+							p->pts[p->which-2] =
+								buf[c];
+							write_ipack(p,buf+c,1);
+							c++;
+							p->found++;
+							p->which++;
+							p->hlength++;
+						}
+						if ( c == count) return count;
+					} else if ((p->flag2 & PTS_DTS_FLAGS) 
+						   == PTS_DTS){
+						while (c < count && 
+						       p->which< 12){
+							if (p->which< 7)
+								p->pts[p->which
+								      -2] =
+									buf[c];
+							write_ipack(p,buf+c,1);
+							c++;
+							p->found++;
+							p->which++;
+							p->hlength++;
+						}
+						if ( c == count) return count;
+					}
+					p->which = 2000;
+				}
+				
+			}
+			
+			while (c < count && p->found < p->plength+6){
+				l = count -c;
+				if (l+p->found > p->plength+6)
+					l = p->plength+6-p->found;
+				write_ipack(p, buf+c, l);
+				p->found += l;
+				c += l;
+			}	
+			
+			break;
+		}
+
+
+		if ( p->done ){
+			if( p->found + count - c < p->plength+6){
+				p->found += count-c;
+				c = count;
+			} else {
+				c += p->plength+6 - p->found;
+				p->found = p->plength+6;
+			}
+		}
+
+		if (p->plength && p->found == p->plength+6) {
+			send_ipack(p);
+			av7110_ipack_reset(p);
+			if (c < count)
+				av7110_ipack_instant_repack(buf+c, count-c, p);
+		}
+	}
+	return count;
+}
+
diff -Nru a/drivers/media/dvb/ttpci/av7110_ipack.h b/drivers/media/dvb/ttpci/av7110_ipack.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/av7110_ipack.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+#ifndef _AV7110_IPACK_H_
+#define _AV7110_IPACK_H_
+
+extern void av7110_ipack_init(ipack *p, int size,
+			      void (*func)(u8 *buf,  int size, void *priv));
+
+extern void av7110_ipack_reset(ipack *p);
+extern int  av7110_ipack_instant_repack(const u8 *buf, int count, ipack *p);
+extern void av7110_ipack_free(ipack * p);
+extern void av7110_ipack_flush(ipack *p);
+
+#endif
+
diff -Nru a/drivers/media/dvb/ttpci/av7110_ir.c b/drivers/media/dvb/ttpci/av7110_ir.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/av7110_ir.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,175 @@
+#include <asm/types.h>
+#include <asm/bitops.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/input.h>
+#include <linux/proc_fs.h>
+
+#include "av7110.h"
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#include "input_fake.h"
+#endif
+
+
+#define UP_TIMEOUT (HZ/2)
+
+static int av7110_ir_debug = 0;
+
+#define dprintk(x...)  do { if (av7110_ir_debug) printk (x); } while (0)
+
+
+static struct input_dev input_dev;
+
+
+static
+u16 key_map [256] = {
+	KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7,
+	KEY_8, KEY_9, KEY_MHP, 0, KEY_POWER, KEY_MUTE, 0, KEY_INFO,
+	KEY_VOLUMEUP, KEY_VOLUMEDOWN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+	KEY_CHANNELUP, KEY_CHANNELDOWN, 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, KEY_TEXT, 0, 0, KEY_TV, 0, 0, 0, 0, 0, KEY_SETUP, 0, 0,
+	0, 0, 0, KEY_SUBTITLE, 0, 0, KEY_LANGUAGE, 0,
+	KEY_RADIO, 0, 0, 0, 0, KEY_EXIT, 0, 0, 
+	KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT, KEY_OK, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RED, KEY_GREEN, KEY_YELLOW,
+	KEY_BLUE, 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_LIST, 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, KEY_UP, KEY_UP, KEY_DOWN, KEY_DOWN,
+	0, 0, 0, 0, KEY_EPG, 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, KEY_VCR
+};
+
+
+static
+void av7110_emit_keyup (unsigned long data)
+{
+	if (!data || !test_bit (data, input_dev.key))
+		return;
+
+	input_event (&input_dev, EV_KEY, data, !!0);
+}
+
+
+static
+struct timer_list keyup_timer = { function: av7110_emit_keyup };
+
+
+static
+void av7110_emit_key (u32 ircom)
+{
+	int down = ircom & (0x80000000);
+	u16 keycode = key_map[ircom & 0xff];
+
+	dprintk ("#########%08x######### key %02x %s (keycode %i)\n",
+		 ircom, ircom & 0xff, down ? "pressed" : "released", keycode);
+
+	if (!keycode) {
+		printk ("%s: unknown key 0x%02x!!\n",
+			__FUNCTION__, ircom & 0xff);
+		return;
+	}
+
+	if (timer_pending (&keyup_timer)) {
+		del_timer (&keyup_timer);
+		if (keyup_timer.data != keycode)
+			input_event (&input_dev, EV_KEY, keyup_timer.data, !!0);
+	}
+
+	clear_bit (keycode, input_dev.key);
+
+	input_event (&input_dev, EV_KEY, keycode, !0);
+
+	keyup_timer.expires = jiffies + UP_TIMEOUT;
+	keyup_timer.data = keycode;
+
+	add_timer (&keyup_timer);
+}
+
+static
+void input_register_keys (void)
+{
+	int i;
+
+	memset (input_dev.keybit, 0, sizeof(input_dev.keybit));
+
+	for (i=0; i<sizeof(key_map)/sizeof(key_map[0]); i++) {
+		if (key_map[i] > KEY_MAX)
+			key_map[i] = 0;
+		else if (key_map[i] > KEY_RESERVED)
+			set_bit (key_map[i], input_dev.keybit);
+	}
+}
+
+
+static
+int av7110_ir_write_proc (struct file *file, const char *buffer,
+	                  unsigned long count, void *data)
+{
+	u32 ir_config;
+
+	if (count < 4 + 256 * sizeof(u16))
+		return -EINVAL;
+	
+	memcpy (&ir_config, buffer, 4);
+	memcpy (&key_map, buffer + 4, 256 * sizeof(u16));
+
+	av7110_setup_irc_config (NULL, ir_config);
+
+	input_register_keys ();
+
+	return count;
+}
+
+
+int __init av7110_ir_init (void)
+{
+	static struct proc_dir_entry *e;
+
+	init_timer (&keyup_timer);
+	keyup_timer.data = 0;
+
+        input_dev.name = "DVB on-card IR receiver";
+
+        /**
+         *  enable keys
+         */
+        set_bit (EV_KEY, input_dev.evbit);
+
+	input_register_keys ();
+
+	input_register_device(&input_dev);
+
+	av7110_setup_irc_config (NULL, 0x0001);
+	av7110_register_irc_handler (av7110_emit_key);
+
+	e = create_proc_entry ("av7110_ir", S_IFREG | S_IRUGO | S_IWUSR, NULL);
+
+	if (e) {
+		e->write_proc = av7110_ir_write_proc;
+		e->size = 4 + 256 * sizeof(u16);
+	}
+
+	return 0;
+}
+
+
+void __exit av7110_ir_exit (void)
+{
+	remove_proc_entry ("av7110_ir", NULL);
+	av7110_unregister_irc_handler (av7110_emit_key);
+	input_unregister_device(&input_dev);
+}
+
+//MODULE_AUTHOR("Holger Waechtler <holger@convergence.de>");
+//MODULE_LICENSE("GPL");
+
+MODULE_PARM(av7110_ir_debug,"i");
+MODULE_PARM_DESC(av7110_ir_debug, "enable AV7110 IR receiver debug messages");
+
diff -Nru a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/budget-av.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,395 @@
+/*
+ * budget-av.c: driver for the SAA7146 based Budget DVB cards
+ *              with analog video in 
+ *
+ * Compiled from various sources by Michael Hunold <michael@mihu.de> 
+ *
+ * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de>
+ *
+ * Copyright (C) 1999-2002 Ralph  Metzler 
+ *                       & Marcus Metzler for convergence integrated media GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * 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
+ * 
+ *
+ * the project's page is at http://www.linuxtv.org/dvb/
+ */
+
+#include "budget.h"
+#include <media/saa7146_vv.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+        #define KBUILD_MODNAME budget_av
+#endif
+
+
+struct budget_av {
+	struct budget budget;
+	struct video_device vd;
+	int cur_input;
+};
+
+/****************************************************************************
+ * INITIALIZATION
+ ****************************************************************************/
+
+static inline
+void ddelay(int i) 
+{
+        current->state=TASK_INTERRUPTIBLE;
+        schedule_timeout((HZ*i)/100);
+}
+
+
+static
+u8 i2c_readreg (struct dvb_i2c_bus *i2c, u8 id, u8 reg)
+{
+	u8 mm1[] = {0x00};
+	u8 mm2[] = {0x00};
+	struct i2c_msg msgs[2];
+
+	msgs[0].flags = 0;
+	msgs[1].flags = I2C_M_RD;
+	msgs[0].addr = msgs[1].addr=id/2;
+	mm1[0] = reg;
+	msgs[0].len = 1; msgs[1].len = 1;
+	msgs[0].buf = mm1; msgs[1].buf = mm2;
+
+	i2c->xfer(i2c, msgs, 2);
+
+	return mm2[0];
+}
+
+
+static
+int i2c_writereg (struct dvb_i2c_bus *i2c, u8 id, u8 reg, u8 val)
+{
+        u8 msg[2]={ reg, val }; 
+        struct i2c_msg msgs;
+
+        msgs.flags=0;
+        msgs.addr=id/2;
+        msgs.len=2;
+        msgs.buf=msg;
+        return i2c->xfer (i2c, &msgs, 1);
+}
+
+
+static const
+u8 saa7113_tab[] = {
+	0x01, 0x08,
+	0x02, 0xc0,
+	0x03, 0x33,
+	0x04, 0x00,
+	0x05, 0x00,
+	0x06, 0xeb,
+	0x07, 0xe0,
+	0x08, 0x28,
+	0x09, 0x00,
+	0x0a, 0x80,
+	0x0b, 0x47,
+	0x0c, 0x40,
+	0x0d, 0x00,
+	0x0e, 0x01,
+        0x0f, 0x44,
+
+	0x10, 0x08,
+	0x11, 0x0c,
+	0x12, 0x7b,
+	0x13, 0x00,
+        0x15, 0x00,  0x16, 0x00,  0x17, 0x00,
+
+        0x57, 0xff, 
+        0x40, 0x82,  0x58, 0x00,  0x59, 0x54,  0x5a, 0x07,
+        0x5b, 0x83,  0x5e, 0x00,
+        0xff
+};
+
+
+static
+int saa7113_init (struct budget_av *budget_av)
+{
+	struct budget *budget = &budget_av->budget;
+	const u8 *data = saa7113_tab;
+
+        if (i2c_writereg (budget->i2c_bus, 0x4a, 0x01, 0x08) != 1) {
+                DEB_D(("saa7113: not found on KNC card\n"));
+                return -ENODEV;
+        }
+
+        INFO(("saa7113: detected and initializing\n"));
+
+	while (*data != 0xff) {
+                i2c_writereg(budget->i2c_bus, 0x4a, *data, *(data+1));
+                data += 2;
+        }
+
+	DEB_D(("saa7113: status=%02x\n",
+	      i2c_readreg(budget->i2c_bus, 0x4a, 0x1f)));
+
+	return 0;
+}
+
+
+static
+int saa7113_setinput (struct budget_av *budget_av, int input)
+{
+	struct budget *budget = &budget_av->budget;
+
+	if (input == 1) {
+		i2c_writereg(budget->i2c_bus, 0x4a, 0x02, 0xc7);
+		i2c_writereg(budget->i2c_bus, 0x4a, 0x09, 0x80);
+	} else if (input == 0) {
+		i2c_writereg(budget->i2c_bus, 0x4a, 0x02, 0xc0);
+		i2c_writereg(budget->i2c_bus, 0x4a, 0x09, 0x00);
+	} else
+		return -EINVAL;
+
+	budget_av->cur_input = input;
+	return 0;
+}
+
+
+static
+int budget_av_detach (struct saa7146_dev *dev)
+{
+	struct budget_av *budget_av = (struct budget_av*) dev->ext_priv;
+	int err;
+
+	DEB_EE(("dev: %p\n",dev));
+
+	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTLO);
+
+	ddelay(20);
+
+	saa7146_unregister_device (&budget_av->vd, dev);
+
+	err = ttpci_budget_deinit (&budget_av->budget);
+
+	kfree (budget_av);
+
+	return err;
+}
+
+
+static
+int budget_av_attach (struct saa7146_dev* dev,
+		      struct saa7146_pci_extension_data *info)
+{
+	struct budget_av *budget_av;
+	struct budget_info *bi = info->ext_priv;
+	int err;
+
+	DEB_EE(("dev: %p\n",dev));
+
+	if (bi->type != BUDGET_KNC1) {
+		return -ENODEV;
+	}
+
+	if (!(budget_av = kmalloc(sizeof(struct budget_av), GFP_KERNEL)))
+		return -ENOMEM;
+
+	memset(budget_av, 0, sizeof(struct budget_av));
+
+	if ((err = ttpci_budget_init(&budget_av->budget, dev, info))) {
+		kfree(budget_av);
+		return err;
+	}
+
+	dev->ext_priv = budget_av;
+
+	/* knc1 initialization */
+	saa7146_write(dev, DD1_STREAM_B, 0x04000000);
+	saa7146_write(dev, DD1_INIT, 0x07000600);
+	saa7146_write(dev, MC2, MASK_09 | MASK_25 | MASK_10 | MASK_26);
+
+	//test_knc_ci(av7110);
+
+	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTHI);
+	ddelay(50);
+
+	if ((err = saa7113_init (budget_av))) {
+		budget_av_detach(dev);
+		return err;
+	}
+
+	saa7146_vv_init(dev);
+	if ((err = saa7146_register_device(&budget_av->vd, dev, "knc1",
+					   VFL_TYPE_GRABBER)))
+	{
+		ERR(("cannot register capture v4l2 device.\n"));
+		budget_av_detach(dev);
+		return err;
+	}
+
+	/* beware: this modifies dev->vv ... */
+	saa7146_set_hps_source_and_sync(dev, SAA7146_HPS_SOURCE_PORT_A,
+					SAA7146_HPS_SYNC_PORT_A);
+
+	saa7113_setinput (budget_av, 0);
+
+	/* what is this? since we don't support open()/close()
+	   notifications, we simply put this into the release handler... */
+//	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTLO);
+	ddelay(20);
+
+	/* fixme: find some sane values here... */
+	saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
+
+	return 0;
+}
+
+
+
+#define KNC1_INPUTS 2
+static struct v4l2_input knc1_inputs[KNC1_INPUTS] = {
+	{ 0,	"Composite", V4L2_INPUT_TYPE_TUNER,  1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, 
+	{ 1,	"S-Video",   V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+};
+
+
+static
+struct saa7146_extension_ioctls ioctls[] = {
+	{ VIDIOC_ENUMINPUT, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
+	{ 0,			0 }
+};
+
+
+static
+int av_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
+{
+	struct budget_av *budget_av = (struct budget_av*) dev->ext_priv;
+/*
+	struct saa7146_vv *vv = dev->vv_data; 
+*/	
+	switch(cmd) {
+	case VIDIOC_ENUMINPUT:
+	{
+		struct v4l2_input *i = arg;
+		
+		DEB_EE(("VIDIOC_ENUMINPUT %d.\n",i->index));
+		if( i->index < 0 || i->index >= KNC1_INPUTS) {
+			return -EINVAL;
+		}
+		memcpy(i, &knc1_inputs[i->index], sizeof(struct v4l2_input));
+		return 0;
+	}
+	case VIDIOC_G_INPUT:
+	{
+		int *input = (int *)arg;
+
+		*input = budget_av->cur_input;
+
+		DEB_EE(("VIDIOC_G_INPUT %d.\n",*input));
+		return 0;		
+	}	
+	case VIDIOC_S_INPUT:
+	{
+		int input = *(int *)arg;
+		DEB_EE(("VIDIOC_S_INPUT %d.\n", input));
+		return saa7113_setinput (budget_av, input);
+	}
+	default:
+/*
+		DEB2(printk("does not handle this ioctl.\n"));
+*/
+		return -ENOIOCTLCMD;
+	}
+	return 0;
+}
+
+static
+struct saa7146_standard standard[] = {
+	{ "PAL",	V4L2_STD_PAL,	SAA7146_PAL_VALUES },
+	{ "NTSC",	V4L2_STD_NTSC,	SAA7146_NTSC_VALUES },
+};
+
+
+static
+struct saa7146_ext_vv vv_data = {
+	.inputs		= 2,
+	.capabilities	= 0, // perhaps later: V4L2_CAP_VBI_CAPTURE, but that need tweaking with the saa7113
+	.flags		= 0,
+	.stds		= &standard[0],
+	.num_stds	= sizeof(standard)/sizeof(struct saa7146_standard),
+	.ioctls		= &ioctls[0],
+	.ioctl		= av_ioctl,
+};
+
+
+
+static struct saa7146_extension budget_extension;
+
+
+MAKE_BUDGET_INFO(knc1, "KNC1 DVB-S", BUDGET_KNC1);
+
+static
+struct pci_device_id pci_tbl [] = {
+	MAKE_EXTENSION_PCI(knc1, 0x1131, 0x4f56),
+	{
+		.vendor    = 0,
+	}
+};
+
+
+
+static
+struct saa7146_extension budget_extension = {
+	.name		= "budget dvb /w video in\0",
+	.pci_tbl	= pci_tbl,
+
+	.module		= THIS_MODULE,
+	.attach		= budget_av_attach,
+	.detach		= budget_av_detach,
+
+	.ext_vv_data	= &vv_data,
+
+	.irq_mask	= MASK_10,
+	.irq_func	= ttpci_budget_irq10_handler,
+};	
+
+
+static
+int __init budget_av_init(void) 
+{
+	DEB_EE((".\n"));
+
+	if (saa7146_register_extension(&budget_extension))
+		return -ENODEV;
+	
+	return 0;
+}
+
+
+static
+void __exit budget_av_exit(void)
+{
+	DEB_EE((".\n"));
+	saa7146_unregister_extension(&budget_extension); 
+}
+
+module_init(budget_av_init);
+module_exit(budget_av_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others");
+MODULE_DESCRIPTION("driver for the SAA7146 based so-called "
+		   "budget PCI DVB w/ analog input (e.g. the KNC cards)");
+
diff -Nru a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/budget-ci.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,434 @@
+/*
+ * budget-ci.c: driver for the SAA7146 based Budget DVB cards 
+ *
+ * Compiled from various sources by Michael Hunold <michael@mihu.de> 
+ *
+ *     msp430 IR support contributed by Jack Thomasson <jkt@Helius.COM>
+ *     partially based on the Siemens DVB driver by Ralph+Marcus Metzler
+ *
+ * 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
+ * 
+ *
+ * the project's page is at http://www.linuxtv.org/dvb/
+ */
+
+#include "budget.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+        #define KBUILD_MODNAME budget
+#endif
+
+
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/input.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#include "input_fake.h"
+#endif
+
+
+
+struct budget_ci {
+	struct budget budget;
+	struct input_dev input_dev;
+	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)
+{
+	u32 result = 0;
+
+	if (count > 4 || count <= 0)
+		return 0;
+
+	if (wait_for_debi_done(saa) < 0)
+		return 0;
+
+	saa7146_write (saa, DEBI_COMMAND,
+		       (count << 17) | 0x10000 | (addr & 0xffff));
+
+	saa7146_write(saa, DEBI_CONFIG, config);
+	saa7146_write(saa, MC2, (2 << 16) | 2);
+
+	wait_for_debi_done(saa);
+
+	result = saa7146_read(saa, DEBI_AD);
+	result &= (0xffffffffUL >> ((4 - count) * 8));
+
+	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)
+   i've taken a "middle of the road" approach and note the differences
+*/
+static
+ u16 key_map[64] = {
+	/* 0x0X */
+	KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8,
+	KEY_9,
+	KEY_ENTER,
+	0,
+	KEY_POWER,              /* RADIO on Hauppauge */
+	KEY_MUTE,
+	0,
+	KEY_A,                  /* TV on Hauppauge */
+	/* 0x1X */
+	KEY_VOLUMEUP, KEY_VOLUMEDOWN,
+	0, 0,
+	KEY_B,
+	0, 0, 0, 0, 0, 0, 0,
+	KEY_UP, KEY_DOWN,
+	KEY_OPTION,             /* RESERVED on Hauppauge */
+	0,
+	/* 0x2X */
+	KEY_CHANNELUP, KEY_CHANNELDOWN,
+	KEY_PREVIOUS,           /* Prev. Ch on Zenith, SOURCE on Hauppauge */
+	0, 0, 0,
+	KEY_CYCLEWINDOWS,       /* MINIMIZE on Hauppauge */
+	0,
+	KEY_ENTER,              /* VCR mode on Zenith */
+	KEY_PAUSE,
+	0,
+	KEY_RIGHT, KEY_LEFT,
+	0,
+	KEY_MENU,               /* FULL SCREEN on Hauppauge */
+	0,
+	/* 0x3X */
+	0,
+	KEY_PREVIOUS,           /* VCR mode on Zenith */
+	KEY_REWIND,
+	0,
+	KEY_FASTFORWARD,
+	KEY_PLAY, KEY_STOP,
+	KEY_RECORD,
+	KEY_TUNER,              /* TV/VCR on Zenith */
+	0,
+	KEY_C,
+	0,
+	KEY_EXIT,
+	0,
+	KEY_TUNER,              /* VCR mode on Zenith */
+	0,
+};
+
+
+static
+void msp430_ir_debounce (unsigned long data)
+{
+	struct input_dev *dev = (struct input_dev *) data;
+
+	if (dev->rep[0] == 0 || dev->rep[0] == ~0) {
+		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
+		return;
+	}
+
+	dev->rep[0] = 0;
+	dev->timer.expires = jiffies + HZ * 350 / 1000;
+	add_timer(&dev->timer);
+	input_event(dev, EV_KEY, key_map[dev->repeat_key], 2);  /* REPEAT */
+}
+
+
+
+static
+void msp430_ir_interrupt (unsigned long data)
+{
+	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;
+
+	if (code & 0x40) {
+	        code &= 0x3f;
+
+        	if (timer_pending(&dev->timer)) {
+                	if (code == dev->repeat_key) {
+                        	++dev->rep[0];
+	                        return;
+        	        }
+                	del_timer(&dev->timer);
+		        input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
+		}
+
+		if (!key_map[code]) {
+        	        printk ("DVB (%s): no key for %02x!\n",
+				__FUNCTION__, code);
+		        return;
+       		}
+
+		/* initialize debounce and repeat */
+		dev->repeat_key = code;
+		/* Zenith remote _always_ sends 2 sequences */
+		dev->rep[0] = ~0;
+		/* 350 milliseconds */
+		dev->timer.expires = jiffies + HZ * 350 / 1000;
+		/* MAKE */
+        	input_event(dev, EV_KEY, key_map[code], !0);
+		add_timer(&dev->timer);
+	}
+}
+
+
+static
+int msp430_ir_init (struct budget_ci *budget_ci)
+{
+	struct saa7146_dev *saa = budget_ci->budget.dev;
+	int i;
+
+	memset(&budget_ci->input_dev, 0, sizeof(struct input_dev));
+
+	budget_ci->input_dev.name = saa->name;
+
+	set_bit(EV_KEY, budget_ci->input_dev.evbit);
+
+	for (i=0; i<sizeof(key_map)/sizeof(*key_map); i++)
+		if (key_map[i])
+			set_bit(key_map[i], budget_ci->input_dev.keybit);
+
+	input_register_device(&budget_ci->input_dev);
+
+	budget_ci->input_dev.timer.function = msp430_ir_debounce;
+
+	saa7146_write(saa, IER, saa7146_read(saa, IER) | MASK_06);
+
+	gpio_set(saa, 3, GPIO_IRQHI);
+
+	return 0;
+}
+
+
+static
+void msp430_ir_deinit (struct budget_ci *budget_ci)
+{
+	struct saa7146_dev *saa = budget_ci->budget.dev;
+	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);
+
+	if (del_timer(&dev->timer))
+		input_event(dev, EV_KEY, key_map[dev->repeat_key], !!0);
+
+	input_unregister_device(dev);
+}
+
+
+static
+void budget_ci_irq (struct saa7146_dev *dev, u32 *isr)
+{
+        struct budget_ci *budget_ci = (struct budget_ci*) dev->ext_priv;
+
+        DEB_EE(("dev: %p, budget_ci: %p\n", dev, budget_ci));
+
+        if (*isr & MASK_06)
+                tasklet_schedule (&budget_ci->msp430_irq_tasklet);
+
+        if (*isr & MASK_10)
+		ttpci_budget_irq10_handler (dev, isr);
+}
+
+
+
+static
+int budget_ci_attach (struct saa7146_dev* dev,
+		      struct saa7146_pci_extension_data *info)
+{
+	struct budget_ci *budget_ci;
+	int err;
+
+	if (!(budget_ci = kmalloc (sizeof(struct budget_ci), GFP_KERNEL)))
+		return -ENOMEM;
+
+	DEB_EE(("budget_ci: %p\n", budget_ci));
+
+	if ((err = ttpci_budget_init (&budget_ci->budget, dev, info))) {
+		kfree (budget_ci);
+		return err;
+	}
+
+	dev->ext_priv = budget_ci;
+
+	tasklet_init (&budget_ci->msp430_irq_tasklet, msp430_ir_interrupt,
+		      (unsigned long) budget_ci);
+
+	msp430_ir_init (budget_ci);
+
+	return 0;
+}
+
+
+
+static
+int budget_ci_detach (struct saa7146_dev* dev)
+{
+	struct budget_ci *budget_ci = (struct budget_ci*) dev->ext_priv;
+	int err;
+
+	err = ttpci_budget_deinit (&budget_ci->budget);
+
+	tasklet_kill (&budget_ci->msp430_irq_tasklet);
+
+	msp430_ir_deinit (budget_ci);
+
+	kfree (budget_ci);
+
+	return err;
+}
+
+
+
+static struct saa7146_extension budget_extension; 
+
+MAKE_BUDGET_INFO(ttbci,	"TT-Budget/WinTV-NOVA-CI PCI",	BUDGET_TT_HW_DISEQC);
+
+static
+struct pci_device_id pci_tbl[] = {
+	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c),
+	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f),
+	{
+		.vendor    = 0,
+	}
+};
+
+
+
+static
+struct saa7146_extension budget_extension = {
+	.name		= "budget_ci dvb\0",
+	.flags	 	= 0,
+	.ext_vv_data	= NULL,
+
+	.module		= THIS_MODULE,
+	.pci_tbl	= &pci_tbl[0],
+	.attach		= budget_ci_attach,
+	.detach		= budget_ci_detach,
+
+	.irq_mask	= MASK_06 | MASK_10,
+	.irq_func	= budget_ci_irq,
+};	
+
+
+static
+int __init budget_ci_init(void) 
+{
+	if (saa7146_register_extension(&budget_extension))
+		return -ENODEV;
+	
+	return 0;
+}
+
+
+static
+void __exit budget_ci_exit(void)
+{
+	DEB_EE((".\n"));
+	saa7146_unregister_extension(&budget_extension); 
+}
+
+module_init(budget_ci_init);
+module_exit(budget_ci_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Michael Hunold, Jack Thomasson, others");
+MODULE_DESCRIPTION("driver for the SAA7146 based so-called "
+		   "budget PCI DVB cards w/ CI-module produced by "
+		   "Siemens, Technotrend, Hauppauge");
+
diff -Nru a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/budget-core.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,339 @@
+#include "budget.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+        #define KBUILD_MODNAME budget
+#endif
+
+int budget_debug = 0;
+
+/****************************************************************************
+ * General helper functions
+ ****************************************************************************/
+
+static inline void ddelay(int i) 
+{
+        current->state=TASK_INTERRUPTIBLE;
+        schedule_timeout((HZ*i)/100);
+}
+
+/****************************************************************************
+ * TT budget / WinTV Nova
+ ****************************************************************************/
+
+static
+int stop_ts_capture(struct budget *budget)
+{
+	DEB_EE(("budget: %p\n",budget));
+
+        if (--budget->feeding)
+                return budget->feeding;
+
+        saa7146_write(budget->dev, MC1, MASK_20); // DMA3 off
+	IER_DISABLE(budget->dev, MASK_10);
+        return 0;
+}
+
+
+static
+int start_ts_capture (struct budget *budget)
+{
+        struct saa7146_dev *dev=budget->dev;
+
+	DEB_EE(("budget: %p\n",budget));
+
+        if (budget->feeding) 
+                return ++budget->feeding;
+
+      	saa7146_write(dev, MC1, MASK_20); // DMA3 off
+
+        memset(budget->grabbing, 0x00, TS_HEIGHT*TS_WIDTH);
+
+        saa7146_write(dev, PCI_BT_V1, 0x001c0000 |
+            (saa7146_read(dev, PCI_BT_V1) & ~0x001f0000));
+
+        budget->tsf=0xff;
+        budget->ttbp=0;
+        saa7146_write(dev, DD1_INIT, 0x02000600);
+        saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+
+        saa7146_write(dev, BRS_CTRL, 0x60000000);	
+      	saa7146_write(dev, MC2, (MASK_08 | MASK_24));
+        mdelay(10);
+
+        saa7146_write(dev, BASE_ODD3, 0);
+        saa7146_write(dev, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2);
+        saa7146_write(dev, PROT_ADDR3, TS_WIDTH*TS_HEIGHT);	
+        saa7146_write(dev, BASE_PAGE3, budget->pt.dma |ME1|0x90);
+        saa7146_write(dev, PITCH3, TS_WIDTH);
+
+        saa7146_write(dev, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH);
+      	saa7146_write(dev, MC2, (MASK_04 | MASK_20));
+     	saa7146_write(dev, MC1, (MASK_04 | MASK_20)); // DMA3 on
+
+	IER_ENABLE(budget->dev, MASK_10); // VPE
+
+        return ++budget->feeding;
+}
+
+
+static
+void vpeirq (unsigned long data)
+{
+        struct budget *budget = (struct budget*) data;
+        u8 *mem = (u8 *)(budget->grabbing);
+        u32 olddma = budget->ttbp;
+        u32 newdma = saa7146_read(budget->dev, PCI_VDP3);
+
+        /* nearest lower position divisible by 188 */
+        newdma -= newdma % 188;
+
+        if (newdma >= TS_BUFLEN)
+                return;
+
+	budget->ttbp = newdma;
+	
+	if(budget->feeding == 0 || newdma == olddma)
+		return;
+
+        if (newdma > olddma) { /* no wraparound, dump olddma..newdma */
+               	if(mem[olddma] == 0x47)
+                        dvb_dmx_swfilter_packets(&budget->demux, 
+        	                mem+olddma, (newdma-olddma) / 188);
+        } else { /* wraparound, dump olddma..buflen and 0..newdma */
+                if(mem[olddma] == 0x47)
+	                dvb_dmx_swfilter_packets(&budget->demux,
+        	                mem+olddma, (TS_BUFLEN-olddma) / 188);
+                if(mem[0] == 0x47)
+                        dvb_dmx_swfilter_packets(&budget->demux,
+                                mem, newdma / 188);
+        }
+}
+
+
+/****************************************************************************
+ * DVB API SECTION
+ ****************************************************************************/
+
+static
+int budget_start_feed(struct dvb_demux_feed *feed)
+{
+        struct dvb_demux *demux = feed->demux;
+        struct budget *budget = (struct budget*) demux->priv;
+
+	DEB_EE(("budget: %p\n",budget));
+
+        if (!demux->dmx.frontend)
+                return -EINVAL;
+
+	return start_ts_capture (budget); 
+}
+
+static
+int budget_stop_feed(struct dvb_demux_feed *feed)
+{
+        struct dvb_demux *demux = feed->demux;
+        struct budget *budget = (struct budget *) demux->priv;
+
+	DEB_EE(("budget: %p\n",budget));
+
+	return stop_ts_capture (budget); 
+}
+
+
+static
+int budget_register(struct budget *budget)
+{
+        int ret;
+        dmx_frontend_t *dvbfront=&budget->hw_frontend;
+        struct dvb_demux *dvbdemux=&budget->demux;
+
+	DEB_EE(("budget: %p\n",budget));
+
+        memcpy(budget->demux_id, "demux0_0", 9);
+        budget->demux_id[5] = budget->dvb_adapter->num + '0';
+        dvbdemux->priv = (void *) budget;
+
+	dvbdemux->filternum = 256;
+        dvbdemux->feednum = 256;
+        dvbdemux->start_feed = budget_start_feed;
+        dvbdemux->stop_feed = budget_stop_feed;
+        dvbdemux->write_to_decoder = NULL;
+
+        dvbdemux->dmx.vendor = "CIM";
+        dvbdemux->dmx.model = "sw";
+        dvbdemux->dmx.id = budget->demux_id;
+        dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
+                                      DMX_MEMORY_BASED_FILTERING);
+
+        dvb_dmx_init(&budget->demux);
+
+        dvbfront->id = "hw_frontend";
+        dvbfront->vendor = "VLSI";
+        dvbfront->model = "DVB Frontend";
+        dvbfront->source = DMX_FRONTEND_0;
+
+        budget->dmxdev.filternum = 256;
+        budget->dmxdev.demux = &dvbdemux->dmx;
+        budget->dmxdev.capabilities = 0;
+
+        dvb_dmxdev_init(&budget->dmxdev, budget->dvb_adapter);
+
+        ret=dvbdemux->dmx.add_frontend (&dvbdemux->dmx, 
+                                        &budget->hw_frontend);
+        if (ret < 0)
+                return ret;
+        
+        budget->mem_frontend.id = "mem_frontend";
+        budget->mem_frontend.vendor = "memory";
+        budget->mem_frontend.model = "sw";
+        budget->mem_frontend.source = DMX_MEMORY_FE;
+        ret=dvbdemux->dmx.add_frontend (&dvbdemux->dmx, 
+                                        &budget->mem_frontend);
+        if (ret<0)
+                return ret;
+        
+        ret=dvbdemux->dmx.connect_frontend (&dvbdemux->dmx, 
+                                            &budget->hw_frontend);
+        if (ret < 0)
+                return ret;
+
+        budget->dvb_net.card_num = budget->dvb_adapter->num;
+        dvb_net_init(budget->dvb_adapter, &budget->dvb_net, &dvbdemux->dmx);
+
+	return 0;
+}
+
+
+static
+void budget_unregister(struct budget *budget)
+{
+        struct dvb_demux *dvbdemux=&budget->demux;
+
+	DEB_EE(("budget: %p\n",budget));
+
+	dvb_net_release(&budget->dvb_net);
+
+	dvbdemux->dmx.close(&dvbdemux->dmx);
+        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &budget->hw_frontend);
+        dvbdemux->dmx.remove_frontend(&dvbdemux->dmx, &budget->mem_frontend);
+
+        dvb_dmxdev_release(&budget->dmxdev);
+        dvb_dmx_release(&budget->demux);
+}
+
+
+static
+int master_xfer (struct dvb_i2c_bus *i2c, const struct i2c_msg msgs[], int num)
+{
+	struct saa7146_dev *dev = i2c->data;
+	return saa7146_i2c_transfer(dev, msgs, num, 6);
+}
+
+
+int ttpci_budget_init (struct budget *budget,
+		       struct saa7146_dev* dev,
+		       struct saa7146_pci_extension_data *info)
+{
+	int length = TS_WIDTH*TS_HEIGHT;
+	int ret = 0;
+	struct budget_info *bi = info->ext_priv;
+
+	memset(budget, 0, sizeof(struct budget));
+
+	DEB_EE(("dev: %p, budget: %p\n", dev, budget));
+
+	budget->card = bi;
+	budget->dev = (struct saa7146_dev *) dev;
+
+	dvb_register_adapter(&budget->dvb_adapter, budget->card->name);
+
+	/* set dd1 stream a & b */
+      	saa7146_write(dev, DD1_STREAM_B, 0x00000000);
+	saa7146_write(dev, DD1_INIT, 0x02000000);
+	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+
+	/* the Siemens DVB needs this if you want to have the i2c chips
+           get recognized before the main driver is loaded */
+        saa7146_write(dev, GPIO_CTRL, 0x500000);
+	
+	saa7146_i2c_adapter_prepare(dev, NULL, SAA7146_I2C_BUS_BIT_RATE_3200);
+
+	budget->i2c_bus = dvb_register_i2c_bus (master_xfer, dev,
+						budget->dvb_adapter, 0);
+
+	if (!budget->i2c_bus) {
+		dvb_unregister_adapter (budget->dvb_adapter);
+		return -ENOMEM;
+	}
+
+	if( NULL == (budget->grabbing = saa7146_vmalloc_build_pgtable(dev->pci,length,&budget->pt))) {
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	saa7146_write(dev, PCI_BT_V1, 0x001c0000);
+	/* upload all */
+        saa7146_write(dev, GPIO_CTRL, 0x000000);
+
+	tasklet_init (&budget->vpe_tasklet, vpeirq, (unsigned long) budget);
+
+	saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI); /* frontend power on */
+
+        if (budget_register(budget) == 0)
+		return 0;
+
+err:
+	if (budget->grabbing)
+		vfree(budget->grabbing);
+
+	dvb_unregister_i2c_bus (master_xfer,budget->i2c_bus->adapter,
+				budget->i2c_bus->id);
+
+	dvb_unregister_adapter (budget->dvb_adapter);
+
+	return ret;
+}
+
+
+int ttpci_budget_deinit (struct budget *budget)
+{
+	struct saa7146_dev *dev = budget->dev;
+
+	DEB_EE(("budget: %p\n", budget));
+
+	budget_unregister (budget);
+
+	dvb_unregister_i2c_bus (master_xfer, budget->i2c_bus->adapter,
+				budget->i2c_bus->id);
+
+	dvb_unregister_adapter (budget->dvb_adapter);
+
+	tasklet_kill (&budget->vpe_tasklet);
+
+	saa7146_pgtable_free (dev->pci, &budget->pt);
+
+	vfree (budget->grabbing);
+	kfree (budget);
+
+	return 0;
+}
+
+void ttpci_budget_irq10_handler (struct saa7146_dev* dev, u32 *isr) 
+{
+	struct budget *budget = (struct budget*)dev->ext_priv;
+
+	DEB_EE(("dev: %p, budget: %p\n",dev,budget));
+
+	if (*isr & MASK_10)
+		tasklet_schedule (&budget->vpe_tasklet);
+}
+
+
+EXPORT_SYMBOL_GPL(ttpci_budget_init);
+EXPORT_SYMBOL_GPL(ttpci_budget_deinit);
+EXPORT_SYMBOL_GPL(ttpci_budget_irq10_handler);
+EXPORT_SYMBOL_GPL(budget_debug);
+
+MODULE_PARM(budget_debug,"i");
+MODULE_LICENSE("GPL");
+
+
diff -Nru a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/budget-patch.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,335 @@
+/*
+ * budget-patch.c: driver for Budget Patch,
+ * hardware modification of DVB-S cards enabling full TS
+ *
+ * Written by Emard <emard@softhome.net>
+ *
+ * Original idea by Roberto Deza <rdeza@unav.es>
+ *
+ * Special thanks to Holger Waechtler, Michael Hunold, Marian Durkovic
+ * and Metzlerbros
+ *
+ * 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
+ * 
+ *
+ * the project's page is at http://www.linuxtv.org/dvb/
+ */
+
+#include "budget.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+        #define KBUILD_MODNAME budget_patch
+#endif
+
+#define budget_patch budget
+
+static struct saa7146_extension budget_extension;
+
+MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);
+
+static
+struct pci_device_id pci_tbl[] = {
+        MAKE_EXTENSION_PCI(fs_1_3,0x13c2, 0x0000),
+        {
+                .vendor    = 0,
+        }
+};
+
+
+#define COMMAND (DPRAM_BASE + 0x0FC)
+#define DPRAM_BASE 0x4000
+#define DEBINOSWAP 0x000e0000
+
+
+typedef enum  { 
+        AudioDAC,
+        CabADAC,
+        ON22K,
+        OFF22K,
+        MainSwitch,
+        ADSwitch,
+        SendDiSEqC,
+        SetRegister
+} AUDCOM;
+
+
+typedef enum  { 
+        COMTYPE_NOCOM,
+        COMTYPE_PIDFILTER,
+        COMTYPE_MPEGDECODER,
+        COMTYPE_OSD,
+        COMTYPE_BMP,
+        COMTYPE_ENCODER,
+        COMTYPE_AUDIODAC,
+        COMTYPE_REQUEST,
+        COMTYPE_SYSTEM,
+        COMTYPE_REC_PLAY,
+        COMTYPE_COMMON_IF,
+        COMTYPE_PID_FILTER,
+        COMTYPE_PES,
+        COMTYPE_TS,
+        COMTYPE_VIDEO,
+        COMTYPE_AUDIO,
+        COMTYPE_CI_LL,
+} COMTYPE;
+
+
+static
+int wdebi(struct budget_patch *budget, u32 config, int addr, u32 val, int count)
+{
+        struct saa7146_dev *dev=budget->dev;
+
+        DEB_EE(("budget: %p\n", budget));
+
+        if (count <= 0 || count > 4)
+                return -1;
+
+        saa7146_write(dev, DEBI_CONFIG, config);
+
+        saa7146_write(dev, DEBI_AD, val );
+        saa7146_write(dev, DEBI_COMMAND, (count << 17) | (addr & 0xffff));
+        saa7146_write(dev, MC2, (2 << 16) | 2);
+        mdelay(5);
+
+        return 0;
+}
+
+
+static
+int SOutCommand(struct budget_patch *budget, u16* buf, int length)
+{
+        int i;
+
+        DEB_EE(("budget: %p\n", budget));
+
+        for (i = 2; i < length; i++)
+                wdebi(budget, DEBINOSWAP, COMMAND + 2*i, (u32) buf[i], 2);
+
+        if (length)
+                wdebi(budget, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2);
+        else
+                wdebi(budget, DEBINOSWAP, COMMAND + 2, 0, 2);
+
+        wdebi(budget, DEBINOSWAP, COMMAND, (u32) buf[0], 2);
+        return 0;
+}
+
+
+static
+void av7110_set22k(struct budget_patch *budget, int state)
+{
+        u16 buf[2] = {( COMTYPE_AUDIODAC << 8) | (state ? ON22K : OFF22K), 0};
+        
+        DEB_EE(("budget: %p\n", budget));
+        SOutCommand(budget, buf, 2);
+}
+
+
+static int
+av7110_send_diseqc_msg(struct budget_patch *budget, int len, u8 *msg, int burst)
+{
+        int i;
+        u16 buf[18] = { ((COMTYPE_AUDIODAC << 8) | SendDiSEqC),
+                16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+        DEB_EE(("budget: %p\n", budget));
+
+        if (len>10)
+                len=10;
+
+        buf[1] = len+2;
+        buf[2] = len;
+
+        if (burst != -1)
+                buf[3]=burst ? 0x01 : 0x00;
+        else
+                buf[3]=0xffff;
+                
+        for (i=0; i<len; i++)
+                buf[i+4]=msg[i];
+
+        SOutCommand(budget, buf, 18);
+        return 0;
+}
+
+
+int budget_patch_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+        struct budget_patch *budget = fe->before_after_data;
+
+        DEB_EE(("budget: %p\n", budget));
+
+        switch (cmd) {
+        case FE_SET_TONE:
+                switch ((fe_sec_tone_mode_t) arg) {
+                case SEC_TONE_ON:
+                        av7110_set22k (budget, 1);
+                        break;
+                case SEC_TONE_OFF:
+                        av7110_set22k (budget, 0);
+                        break;
+                default:
+                        return -EINVAL;
+                }
+                break;
+
+        case FE_DISEQC_SEND_MASTER_CMD:
+        {
+                struct dvb_diseqc_master_cmd *cmd = arg;
+
+                av7110_send_diseqc_msg (budget, cmd->msg_len, cmd->msg, 0);
+                break;
+        }
+
+        case FE_DISEQC_SEND_BURST:
+                av7110_send_diseqc_msg (budget, 0, NULL, (int) arg);
+                break;
+
+        default:
+                return -EOPNOTSUPP;
+        }
+
+        return 0;
+}
+
+
+static
+int budget_patch_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+{
+        struct budget_patch *budget;
+        int err;
+        int cnt;
+
+        if (!(budget = kmalloc (sizeof(struct budget_patch), GFP_KERNEL)))
+                return -ENOMEM;
+
+        DEB_EE(("budget: %p\n",budget));
+
+        if ((err = ttpci_budget_init (budget, dev, info))) {
+                kfree (budget);
+                return err;
+        }
+
+/*
+**      This code will setup the SAA7146_RPS1 to generate a square 
+**      wave on GPIO3, changing when a field (TS_HEIGHT/2 "lines" of 
+**      TS_WIDTH packets) has been acquired on SAA7146_D1B video port; 
+**      then, this GPIO3 output which is connected to the D1B_VSYNC 
+**      input, will trigger the acquisition of the alternate field 
+**      and so on.
+**      Currently, the TT_budget / WinTV_Nova cards have two ICs 
+**      (74HCT4040, LVC74) for the generation of this VSYNC signal, 
+**      which seems that can be done perfectly without this :-)).
+*/                                                      
+        cnt = 0;                                // Setup RPS1 "program" (p35)
+        // Wait reset Source Line Counter Threshold                     (p36)
+        dev->rps1[cnt++]=cpu_to_le32(CMD_PAUSE | RPS_INV | EVT_HS);
+        // Wait Source Line Counter Threshold                           (p36)
+        dev->rps1[cnt++]=cpu_to_le32(CMD_PAUSE | EVT_HS);
+        // Set GPIO3=1                                                  (p42)
+        dev->rps1[cnt++]=cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
+        dev->rps1[cnt++]=cpu_to_le32(GPIO3_MSK);
+        dev->rps1[cnt++]=cpu_to_le32(SAA7146_GPIO_OUTHI<<24);
+        // Wait reset Source Line Counter Threshold                     (p36)
+        dev->rps1[cnt++]=cpu_to_le32(CMD_PAUSE | RPS_INV | EVT_HS);
+        // Wait Source Line Counter Threshold
+        dev->rps1[cnt++]=cpu_to_le32(CMD_PAUSE | EVT_HS);
+        // Set GPIO3=0                                                  (p42)
+        dev->rps1[cnt++]=cpu_to_le32(CMD_WR_REG_MASK | (GPIO_CTRL>>2));
+        dev->rps1[cnt++]=cpu_to_le32(GPIO3_MSK);
+        dev->rps1[cnt++]=cpu_to_le32(SAA7146_GPIO_OUTLO<<24);
+        // Jump to begin of RPS program                                 (p37)
+        dev->rps1[cnt++]=cpu_to_le32(CMD_JUMP);
+        dev->rps1[cnt++]=cpu_to_le32(virt_to_bus(&dev->rps1[0]));
+
+        // Fix VSYNC level
+        saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+        // Set RPS1 Address register to point to RPS code               (r108 p42)
+        saa7146_write(dev, RPS_ADDR1, virt_to_bus(&dev->rps1[0]));
+        // Set Source Line Counter Threshold, using BRS                 (rCC p43)
+        saa7146_write(dev, RPS_THRESH1, ((TS_HEIGHT/2) | MASK_12));
+        // Enable RPS1                                                  (rFC p33)
+        saa7146_write(dev, MC1, (MASK_13 | MASK_29));
+
+        dvb_add_frontend_ioctls (budget->dvb_adapter,
+                budget_patch_diseqc_ioctl, NULL, budget);
+
+        dev->ext_priv = budget;
+
+        return 0;
+}
+
+
+static
+int budget_patch_detach (struct saa7146_dev* dev)
+{
+        struct budget_patch *budget = (struct budget_patch*) dev->ext_priv;
+        int err;
+
+        dvb_remove_frontend_ioctls (budget->dvb_adapter,
+                budget_patch_diseqc_ioctl, NULL);
+
+        err = ttpci_budget_deinit (budget);
+
+        kfree (budget);
+
+        return err;
+}
+
+
+static
+int __init budget_patch_init(void) 
+{
+        if (saa7146_register_extension(&budget_extension))
+                return -ENODEV;
+        
+        return 0;
+}
+
+
+static
+void __exit budget_patch_exit(void)
+{
+        DEB_EE((".\n"));
+        saa7146_unregister_extension(&budget_extension); 
+}
+
+
+static
+struct saa7146_extension budget_extension = {
+        .name           = "budget_patch dvb\0",
+        .flags          = 0,
+        .ext_vv_data    = NULL,
+        
+        .module         = THIS_MODULE,
+        .pci_tbl        = pci_tbl,
+        .attach         = budget_patch_attach,
+        .detach         = budget_patch_detach,
+
+        .irq_mask       = MASK_10,
+        .irq_func       = ttpci_budget_irq10_handler,
+};
+
+
+module_init(budget_patch_init);
+module_exit(budget_patch_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Emard, Roberto Deza, Holger Waechtler, Michael Hunold, others");
+MODULE_DESCRIPTION("Driver for full TS modified DVB-S SAA7146+AV7110 "
+                   "based so-called Budget Patch cards");
+
diff -Nru a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/budget.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,267 @@
+/*
+ * budget.c: driver for the SAA7146 based Budget DVB cards 
+ *
+ * Compiled from various sources by Michael Hunold <michael@mihu.de> 
+ *
+ * Copyright (C) 2002 Ralph Metzler <rjkm@metzlerbros.de>
+ *
+ * Copyright (C) 1999-2002 Ralph  Metzler 
+ *                       & Marcus Metzler for convergence integrated media GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * 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
+ * 
+ *
+ * the project's page is at http://www.linuxtv.org/dvb/
+ */
+
+#include "budget.h"
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+        #define KBUILD_MODNAME budget
+#endif
+
+
+
+static inline void ddelay(int i)
+{
+	current->state=TASK_INTERRUPTIBLE;
+	schedule_timeout((HZ*i)/100);
+}
+
+
+static
+void Set22K (struct budget *budget, int state)
+{
+	struct saa7146_dev *dev=budget->dev;
+	DEB_EE(("budget: %p\n",budget));
+	saa7146_setgpio(dev, 3, (state ? SAA7146_GPIO_OUTHI : SAA7146_GPIO_OUTLO));
+}
+
+
+/* Diseqc functions only for TT Budget card */
+/* taken from the Skyvision DVB driver by
+   Ralph Metzler <rjkm@metzlerbros.de> */
+
+static
+void DiseqcSendBit (struct budget *budget, int data)
+{
+	struct saa7146_dev *dev=budget->dev;
+	DEB_EE(("budget: %p\n",budget));
+
+	saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
+	udelay(data ? 500 : 1000);
+	saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+	udelay(data ? 1000 : 500);
+}
+
+
+static
+void DiseqcSendByte (struct budget *budget, int data)
+{
+	int i, par=1, d;
+
+	DEB_EE(("budget: %p\n",budget));
+
+	for (i=7; i>=0; i--) {
+		d = (data>>i)&1;
+		par ^= d;
+		DiseqcSendBit(budget, d);
+	}
+
+	DiseqcSendBit(budget, par);
+}
+
+
+static
+int SendDiSEqCMsg (struct budget *budget, int len, u8 *msg, int burst)
+{
+	struct saa7146_dev *dev=budget->dev;
+	int i;
+
+	DEB_EE(("budget: %p\n",budget));
+
+	saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+	mdelay(16);
+
+	for (i=0; i<len; i++)
+		DiseqcSendByte(budget, msg[i]);
+
+	mdelay(16);
+
+	if (burst!=-1) {
+		if (burst)
+			DiseqcSendByte(budget, 0xff);
+		else {
+			saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTHI);
+			udelay(12500);
+			saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
+		}
+		ddelay(2);
+	}
+
+	return 0;
+}
+
+
+int budget_diseqc_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
+{
+       struct budget *budget = fe->before_after_data;
+
+       DEB_EE(("budget: %p\n",budget));
+
+       switch (cmd) {
+       case FE_SET_TONE:
+               switch ((fe_sec_tone_mode_t) arg) {
+               case SEC_TONE_ON:
+                       Set22K (budget, 1);
+                       break;
+               case SEC_TONE_OFF:
+                       Set22K (budget, 0);
+                       break;
+               default:
+                       return -EINVAL;
+               };
+               break;
+
+       case FE_DISEQC_SEND_MASTER_CMD:
+       {
+               struct dvb_diseqc_master_cmd *cmd = arg;
+
+               SendDiSEqCMsg (budget, cmd->msg_len, cmd->msg, 0);
+               break;
+       }
+
+       case FE_DISEQC_SEND_BURST:
+               SendDiSEqCMsg (budget, 0, NULL, (int) arg);
+               break;
+
+       default:
+               return -EOPNOTSUPP;
+       };
+
+       return 0;
+}
+
+
+static
+int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+{
+	struct budget *budget;
+	int err;
+
+	if (!(budget = kmalloc (sizeof(struct budget), GFP_KERNEL)))
+		return -ENOMEM;
+
+	DEB_EE(("budget: %p\n",budget));
+
+	if ((err = ttpci_budget_init (budget, dev, info))) {
+		kfree (budget);
+		return err;
+	}
+
+	dvb_add_frontend_ioctls (budget->dvb_adapter,
+				 budget_diseqc_ioctl, NULL, budget);
+
+	dev->ext_priv = budget;
+
+	return 0;
+}
+
+
+static
+int budget_detach (struct saa7146_dev* dev)
+{
+	struct budget *budget = (struct budget*) dev->ext_priv;
+	int err;
+
+	dvb_remove_frontend_ioctls (budget->dvb_adapter,
+				    budget_diseqc_ioctl, NULL);
+
+	err = ttpci_budget_deinit (budget);
+
+	kfree (budget);
+
+	return err;
+}
+
+
+
+static struct saa7146_extension budget_extension;
+
+MAKE_BUDGET_INFO(ttbs,	"TT-Budget/WinTV-NOVA-S  PCI",	BUDGET_TT);
+MAKE_BUDGET_INFO(ttbc,	"TT-Budget/WinTV-NOVA-C  PCI",	BUDGET_TT);
+MAKE_BUDGET_INFO(ttbt,	"TT-Budget/WinTV-NOVA-T  PCI",	BUDGET_TT);
+MAKE_BUDGET_INFO(satel,	"SATELCO Multimedia PCI",	BUDGET_TT_HW_DISEQC);
+/* Uncomment for Budget Patch */
+/*MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);*/
+
+static
+struct pci_device_id pci_tbl[] = {
+	/* Uncomment for Budget Patch */
+	/*MAKE_EXTENSION_PCI(fs_1_3,0x13c2, 0x0000),*/
+	MAKE_EXTENSION_PCI(ttbs,  0x13c2, 0x1003),
+	MAKE_EXTENSION_PCI(ttbc,  0x13c2, 0x1004),
+	MAKE_EXTENSION_PCI(ttbt,  0x13c2, 0x1005),
+	MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013),
+	{
+		.vendor    = 0,
+	}
+};
+
+
+
+static
+struct saa7146_extension budget_extension = {
+	.name		= "budget dvb\0",
+	.flags	 	= 0,
+	.ext_vv_data	= NULL,
+	
+	.module		= THIS_MODULE,
+	.pci_tbl	= pci_tbl,
+	.attach		= budget_attach,
+	.detach		= budget_detach,
+
+	.irq_mask	= MASK_10,
+	.irq_func	= ttpci_budget_irq10_handler,
+};	
+
+
+static
+int __init budget_init(void) 
+{
+	if (saa7146_register_extension(&budget_extension))
+		return -ENODEV;
+	
+	return 0;
+}
+
+
+static
+void __exit budget_exit(void)
+{
+	DEB_EE((".\n"));
+	saa7146_unregister_extension(&budget_extension); 
+}
+
+module_init(budget_init);
+module_exit(budget_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Ralph Metzler, Marcus Metzler, Michael Hunold, others");
+MODULE_DESCRIPTION("driver for the SAA7146 based so-called "
+		   "budget PCI DVB cards by Siemens, Technotrend, Hauppauge");
+
diff -Nru a/drivers/media/dvb/ttpci/budget.h b/drivers/media/dvb/ttpci/budget.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/dvb/ttpci/budget.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,86 @@
+#ifndef __BUDGET_DVB__
+#define __BUDGET_DVB__
+
+#include "dvb_i2c.h"
+#include "dvb_frontend.h"
+#include "dvbdev.h"
+#include "demux.h"
+#include "dvb_demux.h"
+#include "dmxdev.h"
+#include "dvb_filter.h"
+#include "dvb_net.h"
+
+#include <media/saa7146.h>
+
+extern int budget_debug;
+
+struct budget_info {
+	char *name;
+	int type;
+};
+
+/* place to store all the necessary device information */
+struct budget {
+
+        /* devices */
+        struct dvb_device       dvb_dev;
+        dvb_net_t               dvb_net;
+
+        struct saa7146_dev	*dev;
+
+	struct dvb_i2c_bus	*i2c_bus;	
+	struct budget_info	*card;
+
+	unsigned char		*grabbing;
+	struct saa7146_pgtable	pt;
+
+	struct tasklet_struct   fidb_tasklet;
+	struct tasklet_struct   vpe_tasklet;
+
+        dmxdev_t                dmxdev;
+        struct dvb_demux	demux;
+        char                    demux_id[16];
+
+        dmx_frontend_t          hw_frontend;
+        dmx_frontend_t          mem_frontend;
+
+        int                     fe_synced; 
+        struct semaphore        pid_mutex;
+
+        u8 tsf;
+        u32 ttbp;
+        int feeding;
+
+        struct dvb_adapter       *dvb_adapter;
+	void			 *priv;
+};
+
+
+
+#define MAKE_BUDGET_INFO(x_var,x_name,x_type) \
+static struct budget_info x_var ## _info = { \
+	.name=x_name,	\
+	.type=x_type };	\
+static struct saa7146_pci_extension_data x_var = { \
+	.ext_priv = &x_var ## _info, \
+	.ext = &budget_extension };
+
+#define TS_WIDTH  (4*188)
+#define TS_HEIGHT (1024/4)
+#define TS_BUFLEN (TS_WIDTH*TS_HEIGHT)
+#define TS_MAX_PACKETS (TS_BUFLEN/TS_SIZE)
+
+#define BUDGET_TT		   0
+#define BUDGET_TT_HW_DISEQC	   1
+#define BUDGET_KNC1		   2
+#define BUDGET_PATCH		   3
+
+
+extern int ttpci_budget_init (struct budget *budget,
+			      struct saa7146_dev* dev,
+			      struct saa7146_pci_extension_data *info);
+extern int ttpci_budget_deinit (struct budget *budget);
+extern void ttpci_budget_irq10_handler (struct saa7146_dev* dev, u32 *isr);
+
+#endif
+
diff -Nru a/drivers/media/radio/radio-cadet.c b/drivers/media/radio/radio-cadet.c
--- a/drivers/media/radio/radio-cadet.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/media/radio/radio-cadet.c	Sat Apr 19 19:51:47 2003
@@ -516,7 +516,7 @@
 	{.id = ""}
 };
 
-MODULE_DEVICE_TABLE(pnp, id_table);
+MODULE_DEVICE_TABLE(pnp, cadet_pnp_devices);
 
 static int cadet_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id)
 {
diff -Nru a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
--- a/drivers/media/video/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/drivers/media/video/Kconfig	Sat Apr 19 19:51:50 2003
@@ -230,5 +230,32 @@
 	  whenever you want). If you want to compile it as a module, say M
 	  here and read <file:Documentation/modules.txt>.
 
+config VIDEO_MXB
+	tristate "Siemens-Nixdorf 'Multimedia eXtension Board'"
+	depends on VIDEO_DEV && PCI && I2C
+	---help---
+	  This is a video4linux driver for the 'Multimedia eXtension Board'
+	  TV card by Siemens-Nixdorf.
+	  
+	  This driver is available as a module called mxb ( = 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>.
+
+config VIDEO_DPC
+	tristate "Philips-Semiconductors 'dpc7146 demonstration board'"
+	depends on VIDEO_DEV && PCI && I2C
+	---help---
+	  This is a video4linux driver for the 'dpc7146 demonstration
+	  board' by Philips-Semiconductors. It's the reference design
+	  for SAA7146 bases boards, so if you have some unsupported
+	  saa7146 based, analog video card, chances are good that it
+	  will work with this skeleton driver.
+	  
+	  This driver is available as a module called dpc7146 ( = 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>.
+
 endmenu
 
diff -Nru a/drivers/media/video/Makefile b/drivers/media/video/Makefile
--- a/drivers/media/video/Makefile	Sat Apr 19 19:51:46 2003
+++ b/drivers/media/video/Makefile	Sat Apr 19 19:51:46 2003
@@ -9,7 +9,7 @@
 obj-$(CONFIG_VIDEO_DEV) += videodev.o v4l2-common.o v4l1-compat.o
 
 obj-$(CONFIG_VIDEO_BT848) += bttv.o msp3400.o tvaudio.o \
-	tda7432.o tda9875.o tuner.o video-buf.o tda9887.o
+	tda7432.o tda9875.o
 obj-$(CONFIG_SOUND_TVMIXER) += tvmixer.o
 
 obj-$(CONFIG_VIDEO_ZR36120) += zoran.o
@@ -29,5 +29,11 @@
 obj-$(CONFIG_VIDEO_CPIA_PP) += cpia_pp.o
 obj-$(CONFIG_VIDEO_CPIA_USB) += cpia_usb.o
 obj-$(CONFIG_VIDEO_MEYE) += meye.o
-obj-$(CONFIG_VIDEO_SAA7134) += saa7134/ tuner.o tda9887.o video-buf.o
+obj-$(CONFIG_VIDEO_SAA7134) += saa7134/
+obj-$(CONFIG_VIDEO_MXB) += saa7111.o tuner.o tda9840.o tea6415c.o tea6420.o mxb.o
+obj-$(CONFIG_VIDEO_DPC) += saa7111.o dpc7146.o
 obj-$(CONFIG_TUNER_3036) += tuner-3036.o
+
+obj-$(CONFIG_VIDEO_TUNER) += tuner.o tda9887.o
+obj-$(CONFIG_VIDEO_BUF)   += video-buf.o
+
diff -Nru a/drivers/media/video/dpc7146.c b/drivers/media/video/dpc7146.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/dpc7146.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,391 @@
+/*
+    dpc7146.c - v4l2 driver for the dpc7146 demonstration board
+    
+    Copyright (C) 2000-2003 Michael Hunold <michael@mihu.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.
+*/
+
+#define DEBUG_VARIABLE debug
+
+#include <media/saa7146_vv.h>
+#include <linux/video_decoder.h>	/* for saa7111a */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME dpc7146
+#endif
+
+#define I2C_SAA7111A            0x24
+
+/* All unused bytes are reserverd. */
+#define SAA711X_CHIP_VERSION            0x00
+#define SAA711X_ANALOG_INPUT_CONTROL_1  0x02
+#define SAA711X_ANALOG_INPUT_CONTROL_2  0x03
+#define SAA711X_ANALOG_INPUT_CONTROL_3  0x04
+#define SAA711X_ANALOG_INPUT_CONTROL_4  0x05
+#define SAA711X_HORIZONTAL_SYNC_START   0x06
+#define SAA711X_HORIZONTAL_SYNC_STOP    0x07
+#define SAA711X_SYNC_CONTROL            0x08
+#define SAA711X_LUMINANCE_CONTROL       0x09
+#define SAA711X_LUMINANCE_BRIGHTNESS    0x0A
+#define SAA711X_LUMINANCE_CONTRAST      0x0B
+#define SAA711X_CHROMA_SATURATION       0x0C
+#define SAA711X_CHROMA_HUE_CONTROL      0x0D
+#define SAA711X_CHROMA_CONTROL          0x0E
+#define SAA711X_FORMAT_DELAY_CONTROL    0x10
+#define SAA711X_OUTPUT_CONTROL_1        0x11
+#define SAA711X_OUTPUT_CONTROL_2        0x12
+#define SAA711X_OUTPUT_CONTROL_3        0x13
+#define SAA711X_V_GATE_1_START          0x15
+#define SAA711X_V_GATE_1_STOP           0x16
+#define SAA711X_V_GATE_1_MSB            0x17
+#define SAA711X_TEXT_SLICER_STATUS      0x1A
+#define SAA711X_DECODED_BYTES_OF_TS_1   0x1B
+#define SAA711X_DECODED_BYTES_OF_TS_2   0x1C
+#define SAA711X_STATUS_BYTE             0x1F
+
+#define DPC_BOARD_CAN_DO_VBI(dev)   (dev->revision != 0) 
+
+static int debug = 0;
+MODULE_PARM(debug,"i");
+MODULE_PARM_DESC(debug, "debug verbosity");
+
+/* global variables */
+int dpc_num = 0;
+
+#define DPC_INPUTS	2
+static struct v4l2_input dpc_inputs[DPC_INPUTS] = {
+	{ 0, "Port A",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+	{ 1, "Port B",	V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+};
+
+#define DPC_AUDIOS	0
+
+static struct saa7146_extension_ioctls ioctls[] = {
+	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
+	{ VIDIOC_ENUMINPUT, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_STD,		SAA7146_AFTER },
+	{ 0,			0 }
+};
+
+struct dpc
+{
+	struct video_device	video_dev;
+	struct video_device	vbi_dev;
+
+	struct i2c_adapter	i2c_adapter;	
+	struct i2c_client	*saa7111a;
+	
+	int cur_input;	/* current input */
+};
+
+/* fixme: add vbi stuff here */
+static int dpc_probe(struct saa7146_dev* dev)
+{
+	struct dpc* dpc = 0;	
+	int i = 0;
+
+	dpc = (struct dpc*)kmalloc(sizeof(struct dpc), GFP_KERNEL);
+	if( NULL == dpc ) {
+		printk("dpc_v4l2.o: dpc_probe: not enough kernel memory.\n");
+		return -ENOMEM;
+	}
+	memset(dpc, 0x0, sizeof(struct dpc));	
+
+	/* FIXME: enable i2c-port pins, video-port-pins
+	   video port pins should be enabled here ?! */
+	saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
+
+	saa7146_i2c_adapter_prepare(dev, &dpc->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
+	if(i2c_add_adapter(&dpc->i2c_adapter) < 0) {
+		DEB_S(("cannot register i2c-device. skipping.\n"));
+		kfree(dpc);
+		return -EFAULT;
+	}
+
+	/* loop through all i2c-devices on the bus and look who is there */
+	for(i = 0; i < I2C_CLIENT_MAX; i++) {
+		if( NULL == dpc->i2c_adapter.clients[i] ) {
+			continue;
+		}
+		if( I2C_SAA7111A == dpc->i2c_adapter.clients[i]->addr ) 
+			dpc->saa7111a = dpc->i2c_adapter.clients[i];
+	}
+
+	/* check if all devices are present */
+	if( 0 == dpc->saa7111a ) {
+		DEB_D(("dpc_v4l2.o: dpc_attach failed for this device.\n"));	
+		kfree(dpc);
+		return -ENODEV;
+	}
+	
+	/* all devices are present, probe was successful */	
+	DEB_D(("dpc_v4l2.o: dpc_probe succeeded for this device.\n"));	
+
+	/* we store the pointer in our private data field */
+	(struct dpc*)dev->ext_priv = dpc;
+
+	return 0;
+}
+
+/* bring hardware to a sane state. this has to be done, just in case someone
+   wants to capture from this device before it has been properly initialized.
+   the capture engine would badly fail, because no valid signal arrives on the
+   saa7146, thus leading to timeouts and stuff. */
+static int dpc_init_done(struct saa7146_dev* dev)
+{
+	struct dpc* dpc = (struct dpc*)dev->ext_priv;
+
+	DEB_D(("dpc_v4l2.o: dpc_init_done called.\n"));
+
+	/* initialize the helper ics to useful values */
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x00, 0x11);
+
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x02, 0xc0);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x03, 0x30);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x04, 0x00);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x05, 0x00);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x06, 0xde);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x07, 0xad);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x08, 0xa8);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x09, 0x00);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x0a, 0x80);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x0b, 0x47);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x0c, 0x40);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x0d, 0x00);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x0e, 0x03);
+
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x10, 0xd0);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x11, 0x1c);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x12, 0xc1);
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x13, 0x30);
+
+	i2c_smbus_write_byte_data(dpc->saa7111a, 0x1f, 0x81);
+
+	return 0;
+}
+
+/* this function only gets called when the probing was successful */
+static int dpc_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+{
+	struct dpc* dpc = (struct dpc*)dev->ext_priv;
+	
+	DEB_D(("dpc_v4l2.o: dpc_attach called.\n"));
+
+	/* checking for i2c-devices can be omitted here, because we
+	   already did this in "dpc_vl42_probe" */
+
+	saa7146_vv_init(dev);
+	if( 0 != saa7146_register_device(&dpc->video_dev, dev, "dpc", VFL_TYPE_GRABBER)) {
+		ERR(("cannot register capture v4l2 device. skipping.\n"));
+		return -1;
+	}
+	
+	/* initialization stuff (vbi) (only for revision > 0 and for extensions which want it)*/
+	if( 0 != DPC_BOARD_CAN_DO_VBI(dev)) {
+		if( 0 != saa7146_register_device(&dpc->vbi_dev, dev, "dpc", VFL_TYPE_VBI)) {
+			ERR(("cannot register vbi v4l2 device. skipping.\n"));
+		}
+	}
+
+	i2c_use_client(dpc->saa7111a);
+
+	printk("dpc: found 'dpc7146 demonstration board'-%d.\n",dpc_num);
+	dpc_num++;
+	
+	/* the rest */
+	dpc->cur_input = 0;
+	dpc_init_done(dev);
+	
+	return 0;
+}
+
+static int dpc_detach(struct saa7146_dev* dev)
+{
+	struct dpc* dpc = (struct dpc*)dev->ext_priv;
+	
+	DEB_EE(("dev:%p\n",dev));
+
+	i2c_release_client(dpc->saa7111a);
+
+	saa7146_unregister_device(&dpc->video_dev,dev);
+	if( 0 != DPC_BOARD_CAN_DO_VBI(dev)) {
+		saa7146_unregister_device(&dpc->vbi_dev,dev);
+	}
+	saa7146_vv_release(dev);
+
+	dpc_num--;
+
+	i2c_del_adapter(&dpc->i2c_adapter);
+	kfree(dpc);
+	return 0;
+}
+
+#ifdef axa
+int dpc_vbi_bypass(struct saa7146_dev* dev)
+{
+	struct dpc* dpc = (struct dpc*)dev->ext_priv;
+	
+	int i = 1;
+
+	/* switch bypass in saa7111a */
+	if ( 0 != dpc->saa7111a->driver->command(dpc->saa7111a,SAA711X_VBI_BYPASS, &i)) {
+		printk("dpc_v4l2.o: VBI_BYPASS: could not address saa7111a.\n");
+		return -1;
+	}			
+
+	return 0;
+}
+#endif
+
+static int dpc_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
+{
+	struct dpc* dpc = (struct dpc*)dev->ext_priv;
+/*
+	struct saa7146_vv *vv = dev->vv_data; 
+*/
+	switch(cmd)
+	{
+	case VIDIOC_ENUMINPUT:
+	{
+		struct v4l2_input *i = arg;
+		DEB_EE(("VIDIOC_ENUMINPUT %d.\n",i->index));
+		
+		if( i->index < 0 || i->index >= DPC_INPUTS) {
+			return -EINVAL;
+		}
+		
+		memcpy(i, &dpc_inputs[i->index], sizeof(struct v4l2_input));
+
+		DEB_D(("dpc_v4l2.o: v4l2_ioctl: VIDIOC_ENUMINPUT %d.\n",i->index));
+		return 0;
+	}
+	case VIDIOC_G_INPUT:
+	{
+		int *input = (int *)arg;
+		*input = dpc->cur_input;
+
+		DEB_D(("dpc_v4l2.o: VIDIOC_G_INPUT: %d\n",*input));
+		return 0;
+	}
+	case VIDIOC_S_INPUT:
+	{
+		int	input = *(int *)arg;
+
+		if (input < 0 || input >= DPC_INPUTS) {
+			return -EINVAL;
+		}
+	
+		dpc->cur_input = input;
+
+		/* fixme: switch input here, switch audio, too! */
+//		saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source, input_port_selection[input].hps_sync);
+		printk("dpc_v4l2.o: VIDIOC_S_INPUT: fixme switch input.\n");
+		
+		return 0;
+	}
+	default:
+/*
+		DEB_D(("dpc_v4l2.o: v4l2_ioctl does not handle this ioctl.\n"));
+*/
+		return -ENOIOCTLCMD;
+	}
+	return 0;
+}
+
+static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
+{
+	return 0;
+}
+
+static struct saa7146_standard standard[] = {
+	{ "PAL-BG",	V4L2_STD_PAL_BG,	SAA7146_PAL_VALUES },
+	{ "PAL-I",	V4L2_STD_PAL_I,		SAA7146_PAL_VALUES },
+	{ "NTSC",	V4L2_STD_NTSC,		SAA7146_NTSC_VALUES },
+	{ "SECAM", 	V4L2_STD_SECAM,		SAA7146_SECAM_VALUES },
+};
+
+static
+struct saa7146_extension extension;
+
+static
+struct saa7146_pci_extension_data dpc = {
+        .ext_priv = "Multimedia eXtension Board",
+        .ext = &extension,
+};
+
+static
+struct pci_device_id pci_tbl[] = {
+	{
+		.vendor    = PCI_VENDOR_ID_PHILIPS,
+		.device	   = PCI_DEVICE_ID_PHILIPS_SAA7146,
+		.subvendor = 0x0000,
+		.subdevice = 0x0000,
+		.driver_data = (unsigned long)&dpc,
+	}, {
+		.vendor = 0,
+	}
+};
+
+static
+struct saa7146_ext_vv vv_data = {
+	.inputs		= DPC_INPUTS,
+	.capabilities	= V4L2_CAP_VBI_CAPTURE,
+	.stds		= &standard[0],
+	.num_stds	= sizeof(standard)/sizeof(struct saa7146_standard),
+	.std_callback	= &std_callback, 
+	.ioctls		= &ioctls[0],
+	.ioctl		= dpc_ioctl,
+};
+
+static
+struct saa7146_extension extension = {
+	.name		= "dpc7146 demonstration board",
+	.flags		= SAA7146_USE_I2C_IRQ,
+	
+	.pci_tbl	= &pci_tbl[0],
+	.module		= THIS_MODULE,
+	.ext_vv_data	= &vv_data,
+
+	.probe		= dpc_probe,
+	.attach		= dpc_attach,
+	.detach		= dpc_detach,
+
+	.irq_mask	= 0,
+	.irq_func	= NULL,
+};	
+
+int __init dpc_init_module(void) 
+{
+	if( 0 != saa7146_register_extension(&extension)) {
+		DEB_S(("failed to register extension.\n"));
+		return -ENODEV;
+	}
+	
+	return 0;
+}
+
+void __exit dpc_cleanup_module(void) 
+{
+	saa7146_unregister_extension(&extension);
+}
+
+module_init(dpc_init_module);
+module_exit(dpc_cleanup_module);
+
+MODULE_DESCRIPTION("video4linux-2 driver for the 'dpc7146 demonstration board'");
+MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+MODULE_LICENSE("GPL");
diff -Nru a/drivers/media/video/mxb.c b/drivers/media/video/mxb.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/mxb.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,1075 @@
+/*
+    mxb.c - v4l2 driver for the Multimedia eXtension Board
+    
+    Copyright (C) 1998-2003 Michael Hunold <michael@mihu.de>
+
+    Visit http://www.mihu.de/linux/saa7146/mxb/
+    for further details about this card.
+    
+    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.
+*/
+
+#define DEBUG_VARIABLE debug
+
+#include <media/saa7146_vv.h>
+#include <linux/video_decoder.h>	/* for saa7111a */
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#define KBUILD_MODNAME mxb
+#endif
+
+#include "mxb.h"
+#include "tea6415c.h"
+#include "tea6420.h"
+#include "tda9840.h"
+#include <media/tuner.h>
+
+#define I2C_SAA7111A            0x24
+
+/* All unused bytes are reserverd. */
+#define SAA711X_CHIP_VERSION            0x00
+#define SAA711X_ANALOG_INPUT_CONTROL_1  0x02
+#define SAA711X_ANALOG_INPUT_CONTROL_2  0x03
+#define SAA711X_ANALOG_INPUT_CONTROL_3  0x04
+#define SAA711X_ANALOG_INPUT_CONTROL_4  0x05
+#define SAA711X_HORIZONTAL_SYNC_START   0x06
+#define SAA711X_HORIZONTAL_SYNC_STOP    0x07
+#define SAA711X_SYNC_CONTROL            0x08
+#define SAA711X_LUMINANCE_CONTROL       0x09
+#define SAA711X_LUMINANCE_BRIGHTNESS    0x0A
+#define SAA711X_LUMINANCE_CONTRAST      0x0B
+#define SAA711X_CHROMA_SATURATION       0x0C
+#define SAA711X_CHROMA_HUE_CONTROL      0x0D
+#define SAA711X_CHROMA_CONTROL          0x0E
+#define SAA711X_FORMAT_DELAY_CONTROL    0x10
+#define SAA711X_OUTPUT_CONTROL_1        0x11
+#define SAA711X_OUTPUT_CONTROL_2        0x12
+#define SAA711X_OUTPUT_CONTROL_3        0x13
+#define SAA711X_V_GATE_1_START          0x15
+#define SAA711X_V_GATE_1_STOP           0x16
+#define SAA711X_V_GATE_1_MSB            0x17
+#define SAA711X_TEXT_SLICER_STATUS      0x1A
+#define SAA711X_DECODED_BYTES_OF_TS_1   0x1B
+#define SAA711X_DECODED_BYTES_OF_TS_2   0x1C
+#define SAA711X_STATUS_BYTE             0x1F
+
+#define MXB_BOARD_CAN_DO_VBI(dev)   (dev->revision != 0) 
+
+/* global variable */
+static int mxb_num = 0;
+
+/* initial frequence the tuner will be tuned to. 
+   in verden (lower saxony, germany) 4148 is a
+   channel called "phoenix" */
+static int freq = 4148;
+MODULE_PARM(freq,"i");
+MODULE_PARM_DESC(freq, "initial frequency the tuner will be tuned to while setup");
+
+static int debug = 0;
+MODULE_PARM(debug,"i");
+MODULE_PARM_DESC(debug, "debug verbosity");
+
+#define MXB_INPUTS 4
+enum { TUNER, AUX1, AUX3, AUX3_YC };
+
+static struct v4l2_input mxb_inputs[MXB_INPUTS] = {
+	{ TUNER,	"Tuner",		V4L2_INPUT_TYPE_TUNER,	1, 1, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, 
+	{ AUX1,		"AUX1",			V4L2_INPUT_TYPE_CAMERA,	2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+	{ AUX3,		"AUX3 Composite",	V4L2_INPUT_TYPE_CAMERA,	4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+	{ AUX3_YC,	"AUX3 S-Video",		V4L2_INPUT_TYPE_CAMERA,	4, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 },
+};
+
+/* this array holds the information, which port of the saa7146 each
+   input actually uses. the mxb uses port 0 for every input */
+static struct {
+	int hps_source;
+	int hps_sync;
+} input_port_selection[MXB_INPUTS] = { 	
+	{ SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
+	{ SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
+	{ SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
+	{ SAA7146_HPS_SOURCE_PORT_A, SAA7146_HPS_SYNC_PORT_A },
+};
+
+/* this array holds the information of the audio source (mxb_audios),
+   which has to be switched corresponding to the video source (mxb_channels) */
+static int video_audio_connect[MXB_AUDIOS] =
+	{ 0, 1, 2, 3, 3 };
+
+/* these are the necessary input-output-pins for bringing one audio source
+(see above) to the CD-output */
+static struct tea6420_multiplex TEA6420_cd[MXB_AUDIOS+1][2] =
+		{ 
+		{{1,1,0},{1,1,0}},	/* Tuner */
+		{{5,1,0},{6,1,0}},	/* AUX 1 */
+		{{4,1,0},{6,1,0}},	/* AUX 2 */
+		{{3,1,0},{6,1,0}},	/* AUX 3 */
+		{{1,1,0},{3,1,0}},	/* Radio */
+		{{1,1,0},{2,1,0}},	/* CD-Rom */
+		{{6,1,0},{6,1,0}}	/* Mute */
+		};
+
+/* these are the necessary input-output-pins for bringing one audio source
+(see above) to the line-output */
+static struct tea6420_multiplex TEA6420_line[MXB_AUDIOS+1][2] =
+		{
+		{{2,3,0},{1,2,0}},
+		{{5,3,0},{6,2,0}},
+		{{4,3,0},{6,2,0}},
+		{{3,3,0},{6,2,0}},
+		{{2,3,0},{3,2,0}},
+		{{2,3,0},{2,2,0}},
+		{{6,3,0},{6,2,0}}	/* Mute */
+		};
+
+#define MAXCONTROLS	1
+static struct v4l2_queryctrl mxb_controls[] = {
+	{ V4L2_CID_AUDIO_MUTE, V4L2_CTRL_TYPE_BOOLEAN, "Mute", 0, 1, 1, 0, 0 },
+};
+
+static struct saa7146_extension_ioctls ioctls[] = {
+	{ VIDIOC_ENUMINPUT, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_G_INPUT,	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_INPUT,	SAA7146_EXCLUSIVE },
+	{ VIDIOC_QUERYCTRL, 	SAA7146_BEFORE },
+	{ VIDIOC_G_CTRL,	SAA7146_BEFORE },
+	{ VIDIOC_S_CTRL,	SAA7146_BEFORE },
+	{ VIDIOC_G_TUNER, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_TUNER, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_G_FREQUENCY,	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_FREQUENCY, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_G_AUDIO, 	SAA7146_EXCLUSIVE },
+	{ VIDIOC_S_AUDIO, 	SAA7146_EXCLUSIVE },
+	{ MXB_S_AUDIO_CD, 	SAA7146_EXCLUSIVE },	/* custom control */	
+	{ MXB_S_AUDIO_LINE, 	SAA7146_EXCLUSIVE },	/* custom control */	
+	{ 0,			0 }
+};
+
+struct mxb
+{
+	struct video_device	video_dev;
+	struct video_device	vbi_dev;
+
+	struct i2c_adapter	i2c_adapter;	
+
+	struct i2c_client*	saa7111a;
+	struct i2c_client*	tda9840;
+	struct i2c_client*	tea6415c;
+	struct i2c_client*	tuner;
+	struct i2c_client*	tea6420_1;
+	struct i2c_client*	tea6420_2;
+
+	int	cur_mode;	/* current audio mode (mono, stereo, ...) */
+	int	cur_input;	/* current input */
+	int	cur_freq;	/* current frequency the tuner is tuned to */
+	int	cur_mute;	/* current mute status */
+};
+
+static int mxb_vbi_bypass(struct saa7146_dev* dev)
+{
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+	s32 byte = 0x0;
+	int result = 0;
+
+	DEB_EE(("dev:%p\n",dev));
+
+	/* switch bypass in saa7111a, this should be done in the
+	   saa7111a driver of course... */
+	if ( -1 == (result = i2c_smbus_read_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_3))) {
+		DEB_D(("could not read from saa7111a.\n"));
+		return -EFAULT;
+	}
+	byte = result;
+	byte &= 0xf0;
+	byte |= 0x0a;
+
+	if ( 0 != (result = i2c_smbus_write_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_3, byte))) {
+		DEB_D(("could not write to saa7111a.\n"));
+		return -EFAULT;
+	}
+	return 0;
+}
+
+static int mxb_probe(struct saa7146_dev* dev)
+{
+	struct mxb* mxb = 0;
+	int i = 0;	
+
+	request_module("tuner");
+	request_module("tea6420");
+	request_module("tea6415c");
+	request_module("tda9840");
+	request_module("saa7111");
+
+	mxb = (struct mxb*)kmalloc(sizeof(struct mxb), GFP_KERNEL);
+	if( NULL == mxb ) {
+		DEB_D(("not enough kernel memory.\n"));
+		return -ENOMEM;
+	}
+	memset(mxb, 0x0, sizeof(struct mxb));	
+
+	/* FIXME: enable i2c-port pins, video-port-pins
+	   video port pins should be enabled here ?! */
+	saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26));
+
+	saa7146_i2c_adapter_prepare(dev, &mxb->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480);
+	if(i2c_add_adapter(&mxb->i2c_adapter) < 0) {
+		DEB_S(("cannot register i2c-device. skipping.\n"));
+		kfree(mxb);
+		return -EFAULT;
+	}
+
+	/* loop through all i2c-devices on the bus and look who is there */
+	for(i = 0; i < I2C_CLIENT_MAX; i++) {
+		if( NULL == mxb->i2c_adapter.clients[i] ) {
+			continue;
+		}
+		if( I2C_TEA6420_1 == mxb->i2c_adapter.clients[i]->addr )
+			mxb->tea6420_1 = mxb->i2c_adapter.clients[i];
+		if( I2C_TEA6420_2 == mxb->i2c_adapter.clients[i]->addr ) 
+			mxb->tea6420_2 = mxb->i2c_adapter.clients[i];
+		if( I2C_TEA6415C_2 == mxb->i2c_adapter.clients[i]->addr ) 
+			mxb->tea6415c = mxb->i2c_adapter.clients[i];
+		if( I2C_TDA9840 == mxb->i2c_adapter.clients[i]->addr ) 
+			mxb->tda9840 = mxb->i2c_adapter.clients[i];
+		if( I2C_SAA7111A == mxb->i2c_adapter.clients[i]->addr ) 
+			mxb->saa7111a = mxb->i2c_adapter.clients[i];
+		if( 0x60 == mxb->i2c_adapter.clients[i]->addr ) 
+			mxb->tuner = mxb->i2c_adapter.clients[i];
+	}
+
+	/* check if all devices are present */
+	if(    0 == mxb->tea6420_1	|| 0 == mxb->tea6420_2	|| 0 == mxb->tea6415c
+	    || 0 == mxb->tda9840	|| 0 == mxb->saa7111a	|| 0 == mxb->tuner ) {
+
+		printk("mxb: did not find all i2c devices. are you sure you\n");
+		printk("mxb: insmod'ed tea6420, tea6415c, saa7111, tea6415c and tuner?\n");
+		i2c_del_adapter(&mxb->i2c_adapter);
+		kfree(mxb);
+		return -ENODEV;
+	}
+
+	/* all devices are present, probe was successful */	
+
+	/* we store the pointer in our private data field */
+	(struct mxb*)dev->ext_priv = mxb;
+
+	return 0;
+}
+
+/* bring hardware to a sane state. this has to be done, just in case someone
+   wants to capture from this device before it has been properly initialized.
+   the capture engine would badly fail, because no valid signal arrives on the
+   saa7146, thus leading to timeouts and stuff. */
+static int mxb_init_done(struct saa7146_dev* dev)
+{
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+	
+	struct {
+		int	length;
+		char	data[9];
+	} saa7740_init[] = {
+		{ 3, { 0x80, 0x00, 0x00 } },{ 3, { 0x80, 0x89, 0x00 } },
+		{ 3, { 0x80, 0xb0, 0x0a } },{ 3, { 0x00, 0x00, 0x00 } },
+		{ 3, { 0x49, 0x00, 0x00 } },{ 3, { 0x4a, 0x00, 0x00 } },
+		{ 3, { 0x4b, 0x00, 0x00 } },{ 3, { 0x4c, 0x00, 0x00 } },
+		{ 3, { 0x4d, 0x00, 0x00 } },{ 3, { 0x4e, 0x00, 0x00 } },
+		{ 3, { 0x4f, 0x00, 0x00 } },{ 3, { 0x50, 0x00, 0x00 } },
+		{ 3, { 0x51, 0x00, 0x00 } },{ 3, { 0x52, 0x00, 0x00 } },
+		{ 3, { 0x53, 0x00, 0x00 } },{ 3, { 0x54, 0x00, 0x00 } },
+		{ 3, { 0x55, 0x00, 0x00 } },{ 3, { 0x56, 0x00, 0x00 } },
+		{ 3, { 0x57, 0x00, 0x00 } },{ 3, { 0x58, 0x00, 0x00 } },
+		{ 3, { 0x59, 0x00, 0x00 } },{ 3, { 0x5a, 0x00, 0x00 } },
+		{ 3, { 0x5b, 0x00, 0x00 } },{ 3, { 0x5c, 0x00, 0x00 } },
+		{ 3, { 0x5d, 0x00, 0x00 } },{ 3, { 0x5e, 0x00, 0x00 } },
+		{ 3, { 0x5f, 0x00, 0x00 } },{ 3, { 0x60, 0x00, 0x00 } },
+		{ 3, { 0x61, 0x00, 0x00 } },{ 3, { 0x62, 0x00, 0x00 } },
+		{ 3, { 0x63, 0x00, 0x00 } },{ 3, { 0x64, 0x00, 0x00 } },
+		{ 3, { 0x65, 0x00, 0x00 } },{ 3, { 0x66, 0x00, 0x00 } },
+		{ 3, { 0x67, 0x00, 0x00 } },{ 3, { 0x68, 0x00, 0x00 } },
+		{ 3, { 0x69, 0x00, 0x00 } },{ 3, { 0x6a, 0x00, 0x00 } },
+		{ 3, { 0x6b, 0x00, 0x00 } },{ 3, { 0x6c, 0x00, 0x00 } },
+		{ 3, { 0x6d, 0x00, 0x00 } },{ 3, { 0x6e, 0x00, 0x00 } },
+		{ 3, { 0x6f, 0x00, 0x00 } },{ 3, { 0x70, 0x00, 0x00 } },
+		{ 3, { 0x71, 0x00, 0x00 } },{ 3, { 0x72, 0x00, 0x00 } },
+		{ 3, { 0x73, 0x00, 0x00 } },{ 3, { 0x74, 0x00, 0x00 } },
+		{ 3, { 0x75, 0x00, 0x00 } },{ 3, { 0x76, 0x00, 0x00 } },
+		{ 3, { 0x77, 0x00, 0x00 } },{ 3, { 0x41, 0x00, 0x42 } },
+		{ 3, { 0x42, 0x10, 0x42 } },{ 3, { 0x43, 0x20, 0x42 } },
+		{ 3, { 0x44, 0x30, 0x42 } },{ 3, { 0x45, 0x00, 0x01 } },
+		{ 3, { 0x46, 0x00, 0x01 } },{ 3, { 0x47, 0x00, 0x01 } },
+		{ 3, { 0x48, 0x00, 0x01 } },
+		{ 9, { 0x01, 0x03, 0xc5, 0x5c, 0x7a, 0x85, 0x01, 0x00, 0x54 } },
+		{ 9, { 0x21, 0x03, 0xc5, 0x5c, 0x7a, 0x85, 0x01, 0x00, 0x54 } },
+		{ 9, { 0x09, 0x0b, 0xb4, 0x6b, 0x74, 0x85, 0x95, 0x00, 0x34 } },
+		{ 9, { 0x29, 0x0b, 0xb4, 0x6b, 0x74, 0x85, 0x95, 0x00, 0x34 } },
+		{ 9, { 0x11, 0x17, 0x43, 0x62, 0x68, 0x89, 0xd1, 0xff, 0xb0 } },
+		{ 9, { 0x31, 0x17, 0x43, 0x62, 0x68, 0x89, 0xd1, 0xff, 0xb0 } },
+		{ 9, { 0x19, 0x20, 0x62, 0x51, 0x5a, 0x95, 0x19, 0x01, 0x50 } },
+		{ 9, { 0x39, 0x20, 0x62, 0x51, 0x5a, 0x95, 0x19, 0x01, 0x50 } },
+		{ 9, { 0x05, 0x3e, 0xd2, 0x69, 0x4e, 0x9a, 0x51, 0x00, 0xf0 } },
+		{ 9, { 0x25, 0x3e, 0xd2, 0x69, 0x4e, 0x9a, 0x51, 0x00, 0xf0 } },
+		{ 9, { 0x0d, 0x3d, 0xa1, 0x40, 0x7d, 0x9f, 0x29, 0xfe, 0x14 } },
+		{ 9, { 0x2d, 0x3d, 0xa1, 0x40, 0x7d, 0x9f, 0x29, 0xfe, 0x14 } },
+		{ 9, { 0x15, 0x73, 0xa1, 0x50, 0x5d, 0xa6, 0xf5, 0xfe, 0x38 } },
+		{ 9, { 0x35, 0x73, 0xa1, 0x50, 0x5d, 0xa6, 0xf5, 0xfe, 0x38 } },
+		{ 9, { 0x1d, 0xed, 0xd0, 0x68, 0x29, 0xb4, 0xe1, 0x00, 0xb8 } },
+		{ 9, { 0x3d, 0xed, 0xd0, 0x68, 0x29, 0xb4, 0xe1, 0x00, 0xb8 } },
+		{ 3, { 0x80, 0xb3, 0x0a } },
+		{-1, { 0} }
+	};
+	
+	unsigned char init[25] = {
+		0x00,
+		
+		0x00,	  /* 00 - ID byte */
+		0x00,	  /* 01 - reserved */
+
+		/*front end */
+		0xd8,	  /* 02 - FUSE=x, GUDL=x, MODE=x */
+		0x23,	  /* 03 - HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0, GAFIX=0, GAI1=256, GAI2=256 */
+		0x00,	  /* 04 - GAI1=256 */
+		0x00,	  /* 05 - GAI2=256 */
+
+		/* decoder */
+		0xf0,	  /* 06 - HSB at  xx(50Hz) /  xx(60Hz) pixels after end of last line */
+		0x30,	  /* 07 - HSS at  xx(50Hz) /  xx(60Hz) pixels after end of last line */
+		0xa8,	  /* 08 - AUFD=x, FSEL=x, EXFIL=x, VTRC=x, HPLL=x, VNOI=x */
+		0x02,	  /* 09 - BYPS=x, PREF=x, BPSS=x, VBLB=x, UPTCV=x, APER=x */
+		0x80,	  /* 0a - BRIG=128 */
+		0x47,	  /* 0b - CONT=1.109 */
+		0x40,	  /* 0c - SATN=1.0 */
+		0x00,	  /* 0d - HUE=0 */
+		0x01,	  /* 0e - CDTO=0, CSTD=0, DCCF=0, FCTC=0, CHBW=1 */
+		0x00,	  /* 0f - reserved */
+		0xd0,	  /* 10 - OFTS=x, HDEL=x, VRLN=x, YDEL=x */
+		0x8c,	  /* 11 - GPSW=x, CM99=x, FECO=x, COMPO=x, OEYC=1, OEHV=1, VIPB=0, COLO=0 */
+		0x80,	  /* 12 - xx output control 2 */
+		0x30,	  /* 13 - xx output control 3 */
+		0x00,	  /* 14 - reserved */
+		0x15,	  /* 15 - VBI */
+		0x04,	  /* 16 - VBI */
+		0x00,	  /* 17 - VBI */
+	};
+
+	struct i2c_msg msg;
+
+	int i = 0, err = 0;
+	struct	tea6415c_multiplex vm;	
+
+	/* write configuration to saa7111a */
+	i = i2c_master_send(mxb->saa7111a, init, sizeof(init));
+	if (i < 0) {
+		printk("failed to initialize saa7111a. this should never happen.\n");
+	}
+
+	/* select tuner-output on saa7111a */
+	i = 0;
+	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i);
+//	i = VIDEO_MODE_PAL;
+//	mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_NORM, &i);
+
+	mxb_vbi_bypass(dev);
+
+	/* select a tuner type */
+	i = 5; 
+	mxb->tuner->driver->command(mxb->tuner,TUNER_SET_TYPE, &i);
+	
+	/* mute audio on tea6420s */
+	mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[6][0]);
+	mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[6][1]);
+	mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_cd[6][0]);
+	mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_cd[6][1]);
+
+	/* switch to tuner-channel on tea6415c*/
+	vm.out = 17;
+	vm.in  = 3;
+	mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm);
+
+	/* select tuner-output on multicable on tea6415c*/
+	vm.in  = 3;
+	vm.out = 13;
+	mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm);
+				
+	/* tune in some frequency on tuner */
+	mxb->tuner->driver->command(mxb->tuner, VIDIOCSFREQ, &freq);
+
+	/* the rest for mxb */
+	mxb->cur_input = 0;
+	mxb->cur_freq = freq;
+	mxb->cur_mute = 1;
+
+	mxb->cur_mode = V4L2_TUNER_MODE_STEREO;
+	mxb->tda9840->driver->command(mxb->tda9840, TDA9840_SWITCH, &mxb->cur_mode);
+			
+	/* check if the saa7740 (aka 'sound arena module') is present
+	   on the mxb. if so, we must initialize it. due to lack of 
+	   informations about the saa7740, the values were reverse
+	   engineered. */
+	msg.addr = 0x1b;
+	msg.flags = 0;
+	msg.len = saa7740_init[0].length;
+	msg.buf = &saa7740_init[0].data[0];
+
+	if( 1 == (err = i2c_transfer(&mxb->i2c_adapter, &msg, 1))) {
+		for(i = 1;;i++) {
+			msg.len = saa7740_init[i].length;		
+			if( -1 == msg.len ) {
+				break;
+			}
+			msg.buf = &saa7740_init[i].data[0];
+			if( 1 != (err = i2c_transfer(&mxb->i2c_adapter, &msg, 1))) {
+				DEB_D(("failed to initialize 'sound arena module'.\n"));
+				goto err;
+			}
+		}
+		INFO(("'sound arena module' detected.\n"));
+	}
+err:	
+	/* the rest for saa7146: you should definitely set some basic values
+	   for the input-port handling of the saa7146. */
+
+	/* ext->saa has been filled by the core driver */
+	   
+	/* some stuff is done via variables */
+	saa7146_set_hps_source_and_sync(dev, input_port_selection[mxb->cur_input].hps_source, input_port_selection[mxb->cur_input].hps_sync);
+
+	/* some stuff is done via direct write to the registers */
+
+	/* this is ugly, but because of the fact that this is completely
+	   hardware dependend, it should be done directly... */
+      	saa7146_write(dev, DD1_STREAM_B,	0x00000000);
+	saa7146_write(dev, DD1_INIT,		0x02000200);
+	saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
+
+	return 0;
+}
+
+/* interrupt-handler. this gets called when irq_mask is != 0.
+   it must clear the interrupt-bits in irq_mask it has handled */
+/*
+void mxb_irq_bh(struct saa7146_dev* dev, u32* irq_mask)
+{
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+}
+*/
+
+/* this function only gets called when the probing was successful */
+static int mxb_attach(struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
+{
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+	
+	DEB_EE(("dev:%p\n",dev));
+
+	/* checking for i2c-devices can be omitted here, because we
+	   already did this in "mxb_vl42_probe" */
+
+	saa7146_vv_init(dev);
+	if( 0 != saa7146_register_device(&mxb->video_dev, dev, "mxb", VFL_TYPE_GRABBER)) {
+		ERR(("cannot register capture v4l2 device. skipping.\n"));
+		return -1;
+	}
+	
+	/* initialization stuff (vbi) (only for revision > 0 and for extensions which want it)*/
+	if( 0 != MXB_BOARD_CAN_DO_VBI(dev)) {
+		if( 0 != saa7146_register_device(&mxb->vbi_dev, dev, "mxb", VFL_TYPE_VBI)) {
+			ERR(("cannot register vbi v4l2 device. skipping.\n"));
+		}
+	}
+
+	i2c_use_client(mxb->tea6420_1);
+	i2c_use_client(mxb->tea6420_2);
+	i2c_use_client(mxb->tea6415c);
+	i2c_use_client(mxb->tda9840);
+	i2c_use_client(mxb->saa7111a);
+	i2c_use_client(mxb->tuner);
+
+	printk("mxb: found 'Multimedia eXtension Board'-%d.\n",mxb_num);
+
+	mxb_num++;
+	mxb_init_done(dev);
+	return 0;
+}
+
+static int mxb_detach(struct saa7146_dev* dev)
+{
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+
+	DEB_EE(("dev:%p\n",dev));
+
+	i2c_release_client(mxb->tea6420_1);
+	i2c_release_client(mxb->tea6420_2);
+	i2c_release_client(mxb->tea6415c);
+	i2c_release_client(mxb->tda9840);
+	i2c_release_client(mxb->saa7111a);
+	i2c_release_client(mxb->tuner);
+
+	saa7146_unregister_device(&mxb->video_dev,dev);
+	if( 0 != MXB_BOARD_CAN_DO_VBI(dev)) {
+		saa7146_unregister_device(&mxb->vbi_dev,dev);
+	}
+	saa7146_vv_release(dev);
+
+	mxb_num--;
+
+	i2c_del_adapter(&mxb->i2c_adapter);
+	kfree(mxb);
+
+	return 0;
+}
+
+/* hack: this should go into saa711x */
+static int saa7111_set_gpio(struct saa7146_dev *dev, int bl)
+{
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+	s32 byte = 0x0;
+	int result = 0;
+	
+	DEB_EE(("dev:%p\n",dev));
+
+	/* get the old register contents */
+	if ( -1 == (byte = i2c_smbus_read_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_1))) {
+		DEB_D(("could not read from saa711x\n"));
+		return -EFAULT;
+	}
+	
+	if( 0 == bl ) {
+		byte &= 0x7f;
+	} else {
+		byte |= 0x80;
+	}
+
+	/* write register contents back */
+	if ( 0 != (result = i2c_smbus_write_byte_data(mxb->saa7111a, SAA711X_OUTPUT_CONTROL_1, byte))) {
+		DEB_D(("could not write to saa711x\n"));
+		return -EFAULT;
+	}
+
+	return 0;
+}
+
+static int mxb_ioctl(struct saa7146_dev *dev, unsigned int cmd, void *arg) 
+{
+	struct mxb* mxb = (struct mxb*)dev->ext_priv;
+	struct saa7146_vv *vv = dev->vv_data; 
+	
+	switch(cmd) {
+	case VIDIOC_ENUMINPUT:
+	{
+		struct v4l2_input *i = arg;
+		
+		DEB_EE(("VIDIOC_ENUMINPUT %d.\n",i->index));
+		if( i->index < 0 || i->index >= MXB_INPUTS) {
+			return -EINVAL;
+		}
+		memcpy(i, &mxb_inputs[i->index], sizeof(struct v4l2_input));
+
+		return 0;
+	}
+	/* the saa7146 provides some controls (brightness, contrast, saturation)
+	   which gets registered *after* this function. because of this we have
+	   to return with a value != 0 even if the function succeded.. */
+	case VIDIOC_QUERYCTRL:
+	{
+		struct v4l2_queryctrl *qc = arg;
+		int i;
+
+		for (i = MAXCONTROLS - 1; i >= 0; i--) {
+			if (mxb_controls[i].id == qc->id) {
+				*qc = mxb_controls[i];
+				DEB_D(("VIDIOC_QUERYCTRL %d.\n",qc->id));
+				return 0;
+			}
+		}
+		return -EAGAIN;
+	}
+	case VIDIOC_G_CTRL:
+	{
+		struct v4l2_control *vc = arg;
+		int i;
+
+		for (i = MAXCONTROLS - 1; i >= 0; i--) {
+			if (mxb_controls[i].id == vc->id) {
+				break;
+			}
+		}
+		
+		if( i < 0 ) {
+			return -EAGAIN;
+		}
+			
+		switch (vc->id ) {
+			case V4L2_CID_AUDIO_MUTE: {
+				vc->value = mxb->cur_mute;
+				DEB_D(("VIDIOC_G_CTRL V4L2_CID_AUDIO_MUTE:%d.\n",vc->value));
+				return 0;
+			}
+		}
+		
+		DEB_EE(("VIDIOC_G_CTRL V4L2_CID_AUDIO_MUTE:%d.\n",vc->value));
+		return 0;
+	}
+
+	case VIDIOC_S_CTRL:
+	{
+		struct	v4l2_control	*vc = arg;
+		int i = 0;
+		
+		for (i = MAXCONTROLS - 1; i >= 0; i--) {
+			if (mxb_controls[i].id == vc->id) {
+				break;
+			}
+		}
+		
+		if( i < 0 ) {
+			return -EAGAIN;
+		}
+		
+		switch (vc->id ) {
+			case V4L2_CID_AUDIO_MUTE: {
+				mxb->cur_mute = vc->value;
+				if( 0 == vc->value ) {
+					/* switch the audio-source */
+					mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[mxb->cur_input]][0]);
+					mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[mxb->cur_input]][1]);
+				} else {
+					mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[6][0]);
+					mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[6][1]);
+				}
+				DEB_EE(("VIDIOC_S_CTRL, V4L2_CID_AUDIO_MUTE: %d.\n",vc->value));
+				break;
+			}
+		}
+		return 0;
+	}
+	case VIDIOC_G_INPUT:
+	{
+		int *input = (int *)arg;
+		*input = mxb->cur_input;
+
+		DEB_EE(("VIDIOC_G_INPUT %d.\n",*input));
+		return 0;		
+	}	
+	case VIDIOC_S_INPUT:
+	{
+		int input = *(int *)arg;
+		struct	tea6415c_multiplex vm;	
+		int i = 0;
+
+		DEB_EE(("VIDIOC_S_INPUT %d.\n",input));
+
+		if (input < 0 || input >= MXB_INPUTS) {
+			return -EINVAL;
+		}
+		
+		/* fixme: locke das setzen des inputs mit hilfe des mutexes
+		down(&dev->lock);
+		video_mux(dev,*i);
+		up(&dev->lock);
+		*/
+				
+		/* fixme: check if streaming capture
+		if ( 0 != dev->streaming ) {
+			DEB_D(("VIDIOC_S_INPUT illegal while streaming.\n"));
+			return -EPERM;
+		}
+		*/
+		
+		mxb->cur_input = input;
+	
+		saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source, input_port_selection[input].hps_sync);
+		
+		/* prepare switching of tea6415c and saa7111a;
+		   have a look at the 'background'-file for further informations  */
+		switch( input ) {
+			
+			case TUNER:
+			{
+				i = 0;
+				vm.in  = 3;
+				vm.out = 17;
+								
+			if ( 0 != mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm)) {
+					printk("VIDIOC_S_INPUT: could not address tea6415c #1\n");
+					return -EFAULT;
+				}
+				/* connect tuner-output always to multicable */
+				vm.in  = 3;
+				vm.out = 13;
+				break;				
+			}
+			case AUX3_YC:
+			{
+				/* nothing to be done here. aux3_yc is
+				   directly connected to the saa711a */
+				i = 5;
+				break;
+			}
+			case AUX3:
+			{
+				/* nothing to be done here. aux3 is
+				   directly connected to the saa711a */
+				i = 1;
+				break;
+			}
+			case AUX1:
+			{
+				i = 0;
+				vm.in  = 1;
+				vm.out = 17;
+				break;
+			}
+		}
+
+		/* switch video in tea6415c only if necessary */
+		switch( input ) {
+			case TUNER:
+			case AUX1:
+			{
+				if ( 0 != mxb->tea6415c->driver->command(mxb->tea6415c,TEA6415C_SWITCH, &vm)) {
+					printk("VIDIOC_S_INPUT: could not address tea6415c #3\n");
+					return -EFAULT;
+				}
+				break;
+			}
+			default:
+			{
+				break;
+			}
+		}
+				
+		/* switch video in saa7111a */
+		if ( 0 != mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_SET_INPUT, &i)) {
+			printk("VIDIOC_S_INPUT: could not address saa7111a #1.\n");
+		}			
+
+		/* switch the audio-source only if necessary */
+		if( 0 == mxb->cur_mute ) {
+			mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[input]][0]);
+			mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[video_audio_connect[input]][1]);
+		}
+
+		return 0;
+	}
+	case VIDIOC_G_TUNER:
+	{
+		struct v4l2_tuner *t = arg;
+		int byte = 0;
+
+		if( 0 != t->index ) {
+			DEB_D(("VIDIOC_G_TUNER: channel %d does not have a tuner attached.\n", t->index));
+			return -EINVAL;
+		}
+
+		DEB_EE(("VIDIOC_G_TUNER: %d\n", t->index));
+
+		memset(t,0,sizeof(*t));
+		strcpy(t->name, "Television");
+
+		t->type = V4L2_TUNER_ANALOG_TV;
+		t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP;
+		t->rangelow = 772;	/* 48.25 MHZ / 62.5 kHz = 772, see fi1216mk2-specs, page 2 */
+		t->rangehigh = 13684;	/* 855.25 MHz / 62.5 kHz = 13684 */
+		/* FIXME: add the real signal strength here */
+		t->signal = 0xffff;
+		t->afc = 0;		
+
+		byte = mxb->tda9840->driver->command(mxb->tda9840,TDA9840_DETECT, NULL);
+		t->audmode = mxb->cur_mode;
+		
+		if( byte < 0 ) {
+			t->rxsubchans  = V4L2_TUNER_SUB_MONO;
+		} else {
+			switch(byte) {
+				case TDA9840_MONO_DETECT: {
+					t->rxsubchans 	= V4L2_TUNER_SUB_MONO;
+					DEB_D(("VIDIOC_G_TUNER: V4L2_TUNER_MODE_MONO.\n"));
+					break;
+				}
+				case TDA9840_DUAL_DETECT: {
+					t->rxsubchans 	= V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
+					DEB_D(("VIDIOC_G_TUNER: V4L2_TUNER_MODE_LANG1.\n"));
+					break;
+				}
+				case TDA9840_STEREO_DETECT: {
+					t->rxsubchans 	= V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO;
+					DEB_D(("VIDIOC_G_TUNER: V4L2_TUNER_MODE_STEREO.\n"));
+					break;
+				}
+				default: { /* TDA9840_INCORRECT_DETECT */
+					t->rxsubchans 	= V4L2_TUNER_MODE_MONO;
+					DEB_D(("VIDIOC_G_TUNER: TDA9840_INCORRECT_DETECT => V4L2_TUNER_MODE_MONO\n"));
+					break;
+				}
+			}
+		}
+
+		return 0;
+	}
+	case VIDIOC_S_TUNER:
+	{
+		struct v4l2_tuner *t = arg;
+		int result = 0;
+		int byte = 0;
+		
+		if( 0 != t->index ) {
+			DEB_D(("VIDIOC_S_TUNER: channel %d does not have a tuner attached.\n",t->index));
+			return -EINVAL;
+		}
+	
+		switch(t->audmode) {
+			case V4L2_TUNER_MODE_STEREO: {
+				mxb->cur_mode = V4L2_TUNER_MODE_STEREO;
+				byte = TDA9840_SET_STEREO;
+				DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n"));
+				break;
+			}
+			case V4L2_TUNER_MODE_LANG1: {
+				mxb->cur_mode = V4L2_TUNER_MODE_LANG1;
+				byte = TDA9840_SET_LANG1;
+				DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n"));
+				break;
+			}
+			case V4L2_TUNER_MODE_LANG2: {
+				mxb->cur_mode = V4L2_TUNER_MODE_LANG2;
+				byte = TDA9840_SET_LANG2;
+				DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG2\n"));
+				break;
+			}
+			default: { /* case V4L2_TUNER_MODE_MONO: {*/
+				mxb->cur_mode = V4L2_TUNER_MODE_MONO;
+				byte = TDA9840_SET_MONO;
+				DEB_D(("VIDIOC_S_TUNER: TDA9840_SET_MONO\n"));
+				break;
+			}
+		}
+
+		if( 0 != (result = mxb->tda9840->driver->command(mxb->tda9840, TDA9840_SWITCH, &byte))) {
+			printk("VIDIOC_S_TUNER error. result:%d, byte:%d\n",result,byte);
+		}
+				
+		return 0;
+	}
+	case VIDIOC_G_FREQUENCY:
+	{
+		struct v4l2_frequency *f = arg;
+
+		if(0 != mxb->cur_input) {
+			DEB_D(("VIDIOC_G_FREQ: channel %d does not have a tuner!\n",mxb->cur_input));
+			return -EINVAL;
+		}
+
+		memset(f,0,sizeof(*f));
+		f->type = V4L2_TUNER_ANALOG_TV;
+		f->frequency =  mxb->cur_freq;
+
+		DEB_EE(("VIDIOC_G_FREQ: freq:0x%08x.\n", mxb->cur_freq));
+		return 0;
+	}
+	case VIDIOC_S_FREQUENCY:
+	{
+		struct v4l2_frequency *f = arg;
+		int t_locked = 0;
+		int v_byte = 0;
+
+		if (0 != f->tuner)
+			return -EINVAL;
+
+		if (V4L2_TUNER_ANALOG_TV != f->type)
+			return -EINVAL;
+		
+		if(0 != mxb->cur_input) {
+			DEB_D(("VIDIOC_S_FREQ: channel %d does not have a tuner!\n",mxb->cur_input));
+			return -EINVAL;
+		}
+
+		DEB_EE(("VIDIOC_S_FREQUENCY: freq:0x%08x.\n",f->frequency));
+
+		mxb->cur_freq = f->frequency;
+
+		/* tune in desired frequency */			
+		mxb->tuner->driver->command(mxb->tuner, VIDIOCSFREQ, &mxb->cur_freq);
+
+		/* check if pll of tuner & saa7111a is locked */
+//		mxb->tuner->driver->command(mxb->tuner,TUNER_IS_LOCKED, &t_locked);
+		mxb->saa7111a->driver->command(mxb->saa7111a,DECODER_GET_STATUS, &v_byte);
+
+		/* not locked -- anything to do here ? */
+		if( 0 == t_locked || 0 == (v_byte & DECODER_STATUS_GOOD)) {
+		}
+
+		/* hack: changing the frequency should invalidate the vbi-counter (=> alevt) */
+		spin_lock(&dev->slock);
+		vv->vbi_fieldcount = 0;
+		spin_unlock(&dev->slock);
+
+		return 0;
+	}
+	case MXB_S_AUDIO_CD:
+	{
+		int i = *(int*)arg;
+				
+		if( i < 0 || i >= MXB_AUDIOS ) {
+			DEB_D(("illegal argument to MXB_S_AUDIO_CD: i:%d.\n",i));
+			return -EINVAL;
+		}
+		
+		DEB_EE(("MXB_S_AUDIO_CD: i:%d.\n",i));
+
+		mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_cd[i][0]);
+		mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_cd[i][1]);
+
+		return 0;
+	}
+	case MXB_S_AUDIO_LINE:
+	{
+		int i = *(int*)arg;
+				
+		if( i < 0 || i >= MXB_AUDIOS ) {
+			DEB_D(("illegal argument to MXB_S_AUDIO_LINE: i:%d.\n",i));
+			return -EINVAL;
+		}
+		
+		DEB_EE(("MXB_S_AUDIO_LINE: i:%d.\n",i));
+		mxb->tea6420_1->driver->command(mxb->tea6420_1,TEA6420_SWITCH, &TEA6420_line[i][0]);
+		mxb->tea6420_2->driver->command(mxb->tea6420_2,TEA6420_SWITCH, &TEA6420_line[i][1]);
+
+		return 0;
+	}
+	case VIDIOC_G_AUDIO:
+	{
+		struct v4l2_audio *a = arg;
+
+		if( a->index < 0 || a->index > MXB_INPUTS ) {
+	 		DEB_D(("VIDIOC_G_AUDIO %d out of range.\n",a->index));
+			return -EINVAL;
+		}
+		
+ 		DEB_EE(("VIDIOC_G_AUDIO %d.\n",a->index));
+		memcpy(a, &mxb_audios[video_audio_connect[mxb->cur_input]], sizeof(struct v4l2_audio));
+		
+		return 0;
+	}
+	case VIDIOC_S_AUDIO:
+	{
+		struct v4l2_audio *a = arg;
+		DEB_D(("VIDIOC_S_AUDIO %d.\n",a->index));
+		return 0;
+	}	
+	default:
+/*
+		DEB2(printk("does not handle this ioctl.\n"));
+*/
+		return -ENOIOCTLCMD;
+	}
+	return 0;
+}
+
+static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
+{
+	if(V4L2_STD_PAL_I == std->id ) {
+		DEB_D(("VIDIOC_S_STD: setting mxb for PAL_I.\n"));
+		/* set the 7146 gpio register -- I don't know what this does exactly */
+      		saa7146_write(dev, GPIO_CTRL, 0x00404050);
+		/* unset the 7111 gpio register -- I don't know what this does exactly */
+		saa7111_set_gpio(dev,0);
+	} else {
+		DEB_D(("VIDIOC_S_STD: setting mxb for PAL/NTSC/SECAM.\n"));
+		/* set the 7146 gpio register -- I don't know what this does exactly */
+      		saa7146_write(dev, GPIO_CTRL, 0x00404050);
+		/* set the 7111 gpio register -- I don't know what this does exactly */
+		saa7111_set_gpio(dev,1);
+	}
+	return 0;
+}
+
+static struct saa7146_standard standard[] = {
+	{ "PAL-BG",	V4L2_STD_PAL_BG,	SAA7146_PAL_VALUES },
+	{ "PAL-I",	V4L2_STD_PAL_I,		SAA7146_PAL_VALUES },
+	{ "NTSC",	V4L2_STD_NTSC,		SAA7146_NTSC_VALUES },
+	{ "SECAM", 	V4L2_STD_SECAM,		SAA7146_SECAM_VALUES },
+};
+
+static
+struct saa7146_extension extension;
+
+static
+struct saa7146_pci_extension_data mxb = {
+        .ext_priv = "Multimedia eXtension Board",
+        .ext = &extension,
+};
+
+static
+struct pci_device_id pci_tbl[] = {
+	{
+		.vendor    = PCI_VENDOR_ID_PHILIPS,
+		.device	   = PCI_DEVICE_ID_PHILIPS_SAA7146,
+		.subvendor = 0x0000,
+		.subdevice = 0x0000,
+		.driver_data = (unsigned long)&mxb,
+	}, {
+		.vendor	= 0,
+	}
+};
+
+static
+struct saa7146_ext_vv vv_data = {
+	.inputs		= MXB_INPUTS,
+	.capabilities	= V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE,
+	.stds		= &standard[0],
+	.num_stds	= sizeof(standard)/sizeof(struct saa7146_standard),
+	.std_callback	= &std_callback, 
+	.ioctls		= &ioctls[0],
+	.ioctl		= mxb_ioctl,
+};
+
+static
+struct saa7146_extension extension = {
+	.name		= MXB_IDENTIFIER,
+	.flags		= SAA7146_USE_I2C_IRQ,
+	
+	.pci_tbl	= &pci_tbl[0],
+	.module		= THIS_MODULE,
+	.ext_vv_data	= &vv_data,
+
+	.probe		= mxb_probe,
+	.attach		= mxb_attach,
+	.detach		= mxb_detach,
+
+	.irq_mask	= 0,
+	.irq_func	= NULL,
+};	
+
+int __init mxb_init_module(void) 
+{
+	if( 0 != saa7146_register_extension(&extension)) {
+		DEB_S(("failed to register extension.\n"));
+		return -ENODEV;
+	}
+	
+	return 0;
+}
+
+void __exit mxb_cleanup_module(void) 
+{
+	saa7146_unregister_extension(&extension);
+}
+
+module_init(mxb_init_module);
+module_exit(mxb_cleanup_module);
+
+MODULE_DESCRIPTION("video4linux-2 driver for the Siemens-Nixdorf 'Multimedia eXtension board'");
+MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+MODULE_LICENSE("GPL");
diff -Nru a/drivers/media/video/mxb.h b/drivers/media/video/mxb.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/mxb.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,42 @@
+#ifndef __MXB__
+#define __MXB__
+
+#define BASE_VIDIOC_MXB 10
+
+#define MXB_S_AUDIO_CD		_IOW  ('V', BASE_VIDIOC_PRIVATE+BASE_VIDIOC_MXB+0, int)
+#define MXB_S_AUDIO_LINE	_IOW  ('V', BASE_VIDIOC_PRIVATE+BASE_VIDIOC_MXB+1, int)
+
+#define MXB_IDENTIFIER "Multimedia eXtension Board"
+
+#define MXB_AUDIOS	6
+
+/* these are the available audio sources, which can switched
+   to the line- and cd-output individually */
+struct v4l2_audio mxb_audios[MXB_AUDIOS] = {
+	    {
+		.index	= 0,
+		.name	= "Tuner",
+		.capability = V4L2_AUDCAP_STEREO,
+	} , {
+		.index	= 1,
+		.name	= "AUX1",
+		.capability = V4L2_AUDCAP_STEREO,
+	} , {
+		.index	= 2,
+		.name	= "AUX2",
+		.capability = V4L2_AUDCAP_STEREO,
+	} , {
+		.index	= 3,
+		.name	= "AUX3",
+		.capability = V4L2_AUDCAP_STEREO,
+	} , {
+		.index	= 4,
+		.name	= "Radio (X9)",
+		.capability = V4L2_AUDCAP_STEREO,
+	} , {
+		.index	= 5,
+		.name	= "CD-ROM (X10)",
+		.capability = V4L2_AUDCAP_STEREO,
+	}
+};	
+#endif
diff -Nru a/drivers/media/video/saa7111.c b/drivers/media/video/saa7111.c
--- a/drivers/media/video/saa7111.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/media/video/saa7111.c	Sat Apr 19 19:51:46 2003
@@ -57,15 +57,13 @@
 	int sat;
 };
 
-#define   I2C_SAA7111        0x48
-
-#define   I2C_DELAY   10
-
 static unsigned short normal_i2c[] = { 34>>1, I2C_CLIENT_END };	
 static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };	
 
 I2C_CLIENT_INSMOD;
 
+static struct i2c_client client_template;
+
 /* ----------------------------------------------------------------------- */
 
 static int saa7111_attach(struct i2c_adapter *adap, int addr, unsigned short flags, int kind)
@@ -73,40 +71,45 @@
 	int i;
 	struct saa7111 *decoder;
 	struct i2c_client *client;
+
+	/* who wrote this? init[] is used for i2c_master_send() which expects an array that
+	   will be used for the 'buf' part of an i2c message unchanged. so, the first byte
+	   needs to be the subaddress to start with, then follow the data bytes... */
 	static const unsigned char init[] = {
-		0x00, 0x00,	/* 00 - ID byte */
-		0x01, 0x00,	/* 01 - reserved */
+		0x00,	  /* start address */
+	
+		0x00,	  /* 00 - ID byte */
+		0x00,	  /* 01 - reserved */
 
 		/*front end */
-		0x02, 0xd0,	/* 02 - FUSE=3, GUDL=2, MODE=0 */
-		0x03, 0x23,	/* 03 - HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0, GAFIX=0, GAI1=256, GAI2=256 */
-		0x04, 0x00,	/* 04 - GAI1=256 */
-		0x05, 0x00,	/* 05 - GAI2=256 */
+		0xd0,	  /* 02 - FUSE=3, GUDL=2, MODE=0 */
+		0x23,	  /* 03 - HLNRS=0, VBSL=1, WPOFF=0, HOLDG=0, GAFIX=0, GAI1=256, GAI2=256 */
+		0x00,	  /* 04 - GAI1=256 */
+		0x00,	  /* 05 - GAI2=256 */
 
 		/* decoder */
-		0x06, 0xf3,	/* 06 - HSB at  13(50Hz) /  17(60Hz) pixels after end of last line */
-		0x07, 0x13,	/* 07 - HSS at 113(50Hz) / 117(60Hz) pixels after end of last line */
-		0x08, 0xc8,	/* 08 - AUFD=1, FSEL=1, EXFIL=0, VTRC=1, HPLL=0, VNOI=0 */
-		0x09, 0x01,	/* 09 - BYPS=0, PREF=0, BPSS=0, VBLB=0, UPTCV=0, APER=1 */
-		0x0a, 0x80,	/* 0a - BRIG=128 */
-		0x0b, 0x47,	/* 0b - CONT=1.109 */
-		0x0c, 0x40,	/* 0c - SATN=1.0 */
-		0x0d, 0x00,	/* 0d - HUE=0 */
-		0x0e, 0x01,	/* 0e - CDTO=0, CSTD=0, DCCF=0, FCTC=0, CHBW=1 */
-		0x0f, 0x00,	/* 0f - reserved */
-		0x10, 0x48,	/* 10 - OFTS=1, HDEL=0, VRLN=1, YDEL=0 */
-		0x11, 0x1c,	/* 11 - GPSW=0, CM99=0, FECO=0, COMPO=1, OEYC=1, OEHV=1, VIPB=0, COLO=0 */
-		0x12, 0x00,	/* 12 - output control 2 */
-		0x13, 0x00,	/* 13 - output control 3 */
-		0x14, 0x00,	/* 14 - reserved */
-		0x15, 0x00,	/* 15 - VBI */
-		0x16, 0x00,	/* 16 - VBI */
-		0x17, 0x00,	/* 17 - VBI */
+		0xf3,	  /* 06 - HSB at  13(50Hz) /  17(60Hz) pixels after end of last line */
+		0x13,	  /* 07 - HSS at 113(50Hz) / 117(60Hz) pixels after end of last line */
+		0xc8,	  /* 08 - AUFD=1, FSEL=1, EXFIL=0, VTRC=1, HPLL=0, VNOI=0 */
+		0x01,	  /* 09 - BYPS=0, PREF=0, BPSS=0, VBLB=0, UPTCV=0, APER=1 */
+		0x80,	  /* 0a - BRIG=128 */
+		0x47,	  /* 0b - CONT=1.109 */
+		0x40,	  /* 0c - SATN=1.0 */
+		0x00,	  /* 0d - HUE=0 */
+		0x01,	  /* 0e - CDTO=0, CSTD=0, DCCF=0, FCTC=0, CHBW=1 */
+		0x00,	  /* 0f - reserved */
+		0x48,	  /* 10 - OFTS=1, HDEL=0, VRLN=1, YDEL=0 */
+		0x1c,	  /* 11 - GPSW=0, CM99=0, FECO=0, COMPO=1, OEYC=1, OEHV=1, VIPB=0, COLO=0 */
+		0x00,	  /* 12 - output control 2 */
+		0x00,	  /* 13 - output control 3 */
+		0x00,	  /* 14 - reserved */
+		0x00,	  /* 15 - VBI */
+		0x00,	  /* 16 - VBI */
+		0x00,	  /* 17 - VBI */
 	};
 	client = kmalloc(sizeof(*client), GFP_KERNEL);
 	if(client == NULL) 
 		return -ENOMEM;
-	memset(client, 0, sizeof(*client));
 	client_template.adapter = adap;
 	client_template.addr = addr;
 	memcpy(client, &client_template, sizeof(*client));
@@ -136,9 +139,10 @@
 		printk(KERN_ERR "%s_attach: init status %d\n",
 		       client->dev.name, i);
 	} else {
-		printk(KERN_INFO "%s_attach: chip version %x\n",
-		       client->dev.name, i2c_smbus_read_byte_data(client, 0x00) >> 4);
+		printk(KERN_INFO "%s_attach: chip version %x @ 0x%08x\n",
+		       client->dev.name, i2c_smbus_read_byte_data(client, 0x00) >> 4,addr);
 	}
+
 	init_MUTEX(&decoder->lock);
 	i2c_attach_client(client);
 	MOD_INC_USE_COUNT;
@@ -146,6 +150,16 @@
 }
 static int saa7111_probe(struct i2c_adapter *adap)
 {
+	/* probing unknown devices on any Matrox i2c-bus takes ages due to the
+	   slow bit banging algorithm used. because of the fact a saa7111(a)
+	   is *never* present on a Matrox gfx card, we can skip such adapters
+	   here */
+	if( 0 != (adap->id & I2C_HW_B_G400)) {
+		return -ENODEV;
+	}
+	
+	printk("saa7111: probing %s i2c adapter [id=0x%x]\n",
+                       adap->dev.name,adap->id);
 	return i2c_probe(adap, &addr_data, saa7111_attach);
 }
 
@@ -385,6 +399,9 @@
 /* ----------------------------------------------------------------------- */
 
 static struct i2c_driver i2c_driver_saa7111 = {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,54)
+	.owner		= THIS_MODULE,
+#endif
 	.name 		= "saa7111",		 /* name */
 	.id 		= I2C_DRIVERID_SAA7111A, /* ID */
 	.flags 		= I2C_DF_NOTIFY,
diff -Nru a/drivers/media/video/tda9840.c b/drivers/media/video/tda9840.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/tda9840.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,289 @@
+ /*
+    tda9840.h - i2c-driver for the tda9840 by SGS Thomson   
+
+    Copyright (C) 1998-2003 Michael Hunold <michael@mihu.de>
+
+    The tda9840 is a stereo/dual sound processor with digital
+    identification. It can be found at address 0x84 on the i2c-bus.
+
+    For detailed informations download the specifications directly
+    from SGS Thomson at http://www.st.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.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/poll.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+
+#include "tda9840.h"
+
+static int debug = 0;	/* insmod parameter */
+MODULE_PARM(debug,"i");
+#define dprintk	if (debug) printk
+
+#define	SWITCH		0x00
+#define	LEVEL_ADJUST	0x02
+#define	STEREO_ADJUST	0x03
+#define	TEST		0x04
+
+/* addresses to scan, found only at 0x42 (7-Bit) */
+static unsigned short normal_i2c[] = {I2C_TDA9840, I2C_CLIENT_END};
+static unsigned short normal_i2c_range[] = {I2C_CLIENT_END};
+
+/* magic definition of all other variables and things */
+I2C_CLIENT_INSMOD;
+
+/* unique ID allocation */
+static int tda9840_id = 0;
+
+static struct i2c_driver driver;
+
+static int tda9840_command(struct i2c_client *client, unsigned int cmd, void* arg)
+{
+	int result = 0;
+
+	switch (cmd) {
+		case TDA9840_SWITCH:
+		{
+			int byte = *(int*)arg;
+
+			dprintk("tda9840.o: TDA9840_SWITCH: 0x%02x\n",byte);
+
+			if (    byte != TDA9840_SET_MONO
+			     && byte != TDA9840_SET_MUTE
+			     && byte != TDA9840_SET_STEREO
+			     && byte != TDA9840_SET_LANG1
+			     && byte != TDA9840_SET_LANG2
+			     && byte != TDA9840_SET_BOTH
+			     && byte != TDA9840_SET_BOTH_R
+			     && byte != TDA9840_SET_EXTERNAL ) {
+				return -EINVAL;
+			}
+			
+			if ( 0 != (result = i2c_smbus_write_byte_data(client, SWITCH, byte))) {
+		 		printk("tda9840.o: TDA9840_SWITCH error.\n");
+ 				return -EFAULT;
+			}
+			
+			return 0;
+		}
+
+		case TDA9840_LEVEL_ADJUST:
+		{
+			int  byte = *(int*)arg;
+
+			dprintk("tda9840.o: TDA9840_LEVEL_ADJUST: %d\n",byte);
+
+			/* check for correct range */
+			if ( byte > 25 || byte < -20 )
+				return -EINVAL;
+			
+			/* calculate actual value to set, see specs, page 18 */
+			byte /= 5;
+			if ( 0 < byte )
+				byte += 0x8;
+			else
+				byte = -byte;
+
+			if ( 0 != (result = i2c_smbus_write_byte_data(client, LEVEL_ADJUST, byte))) {
+		 		printk("tda9840.o: TDA9840_LEVEL_ADJUST error.\n");
+ 				return -EFAULT;
+			}
+			
+			return 0;
+		}
+
+		case TDA9840_STEREO_ADJUST:
+		{
+			int  byte = *(int*)arg;
+
+			dprintk("tda9840.o: TDA9840_STEREO_ADJUST: %d\n",byte);
+
+			/* check for correct range */
+			if ( byte > 25 || byte < -24 )
+				return -EINVAL;
+			
+			/* calculate actual value to set */
+			byte /= 5;
+			if ( 0 < byte )
+				byte += 0x20;
+			else
+				byte = -byte;
+
+			if ( 0 != (result = i2c_smbus_write_byte_data(client, STEREO_ADJUST, byte))) {
+		 		printk("tda9840.o: TDA9840_STEREO_ADJUST error.\n");
+ 				return -EFAULT;
+			}
+			
+			return 0;
+		}
+
+		case TDA9840_DETECT:
+		{
+			int byte = 0x0;
+
+			if ( -1 == (byte = i2c_smbus_read_byte_data(client, STEREO_ADJUST))) {
+		 		printk("tda9840.o: TDA9840_DETECT error while reading.\n");
+				return -EFAULT;
+			}			
+
+			if( 0 != (byte & 0x80)) {
+		 		dprintk("tda9840.o: TDA9840_DETECT, register contents invalid.\n");
+				return -EFAULT;
+			}
+
+			dprintk("tda9840.o: TDA9840_DETECT, result: 0x%02x (original byte)\n",byte);
+
+			return ((byte & 0x60) >> 5);				
+		}
+
+		case TDA9840_TEST:
+		{
+			int  byte = *(int*)arg;
+
+			dprintk("tda9840.o: TDA9840_TEST: 0x%02x\n",byte);
+
+			/* mask out irrelevant bits */
+			byte &= 0x3;
+
+			if ( 0 != (result = i2c_smbus_write_byte_data(client, TEST, byte))) {
+		 		printk("tda9840.o: TDA9840_TEST error.\n");
+ 				return -EFAULT;
+			}
+		
+			return 0;
+		}
+
+		default:
+			return -ENOIOCTLCMD;
+	}
+
+	return 0;
+}
+
+static int tda9840_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind)
+{
+	struct	i2c_client *client;
+	int result = 0;
+
+	int byte = 0x0;
+			
+	/* let's see whether this adapter can support what we need */
+	if ( 0 == i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA|I2C_FUNC_SMBUS_WRITE_BYTE_DATA)) {
+		return 0;
+	}
+
+	/* allocate memory for client structure */
+	client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+        if (0 == client) {
+		printk("tda9840.o: not enough kernel memory.\n");
+		return -ENOMEM;
+	}
+	
+	/* fill client structure */
+	sprintf(client->dev.name,"tda9840 (0x%02x)", address);
+	client->id = tda9840_id++;
+	client->flags = 0;
+	client->addr = address;
+	client->adapter = adapter;
+	client->driver = &driver;
+	i2c_set_clientdata(client, NULL);
+
+	/* tell the i2c layer a new client has arrived */
+	if (0 != (result = i2c_attach_client(client))) {
+		kfree(client);
+		return result;
+	}
+
+	/* set initial values for level & stereo - adjustment, mode */
+	byte = 0;
+	if ( 0 != (result = tda9840_command(client, TDA9840_LEVEL_ADJUST, &byte))) {
+ 		printk("tda9840.o: could not initialize ic #1. continuing anyway. (result:%d)\n",result);
+	}
+	
+	if ( 0 != (result = tda9840_command(client, TDA9840_STEREO_ADJUST, &byte))) {
+ 		printk("tda9840.o: could not initialize ic #2. continuing anyway. (result:%d)\n",result);
+	}
+
+	byte = TDA9840_SET_MONO;
+	if ( 0 != (result = tda9840_command(client, TDA9840_SWITCH, &byte))) {
+ 		printk("tda9840.o: could not initialize ic #3. continuing anyway. (result:%d)\n",result);
+	} 
+	
+	printk("tda9840.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+
+	return 0;
+}
+
+static int tda9840_attach(struct i2c_adapter *adapter)
+{
+	/* let's see whether this is a know adapter we can attach to */
+	if( adapter->id != I2C_ALGO_SAA7146 ) {
+		dprintk("tda9840.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		return -ENODEV;
+	}
+
+	return i2c_probe(adapter,&addr_data,&tda9840_detect);
+}
+
+static int tda9840_detach(struct i2c_client *client)
+{
+	int err = 0;
+
+	if ( 0 != (err = i2c_detach_client(client))) {
+		printk("tda9840.o: Client deregistration failed, client not detached.\n");
+		return err;
+	}
+	
+	kfree(client);
+
+	return 0;
+}
+
+static struct i2c_driver driver = {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,54)
+	.owner		= THIS_MODULE,
+#endif
+	.name		= "tda9840 driver",
+	.id		= I2C_DRIVERID_TDA9840,
+	.flags		= I2C_DF_NOTIFY,
+        .attach_adapter = tda9840_attach,
+        .detach_client	= tda9840_detach,
+        .command	= tda9840_command,
+};
+
+static int tda9840_init_module(void)
+{
+        i2c_add_driver(&driver);
+        return 0;
+}
+
+static void tda9840_cleanup_module(void)
+{
+        i2c_del_driver(&driver);
+}
+
+module_init(tda9840_init_module);
+module_exit(tda9840_cleanup_module);
+
+MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+MODULE_DESCRIPTION("tda9840 driver");
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/media/video/tda9840.h b/drivers/media/video/tda9840.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/tda9840.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,35 @@
+#ifndef __INCLUDED_TDA9840__
+#define __INCLUDED_TDA9840__
+
+#define	I2C_TDA9840		0x42
+
+#define TDA9840_DETECT		_IOR('v',1,int)
+/* return values for TDA9840_DETCT */
+#define TDA9840_MONO_DETECT		0x0
+#define	TDA9840_DUAL_DETECT		0x1
+#define	TDA9840_STEREO_DETECT		0x2
+#define	TDA9840_INCORRECT_DETECT	0x3
+
+#define TDA9840_SWITCH		_IOW('v',2,int)
+/* modes than can be set with TDA9840_SWITCH */
+#define	TDA9840_SET_MUTE		0x00
+#define	TDA9840_SET_MONO		0x10
+#define	TDA9840_SET_STEREO		0x2a
+#define	TDA9840_SET_LANG1		0x12
+#define	TDA9840_SET_LANG2		0x1e
+#define	TDA9840_SET_BOTH		0x1a
+#define	TDA9840_SET_BOTH_R		0x16
+#define	TDA9840_SET_EXTERNAL		0x7a
+
+/* values may range between +2.5 and -2.0;
+   the value has to be multiplied with 10 */
+#define TDA9840_LEVEL_ADJUST	_IOW('v',3,int)
+
+/* values may range between +2.5 and -2.4;
+   the value has to be multiplied with 10 */
+#define TDA9840_STEREO_ADJUST	_IOW('v',4,int)
+
+/* currently not implemented */
+#define TDA9840_TEST		_IOW('v',5,int)
+
+#endif
diff -Nru a/drivers/media/video/tea6415c.c b/drivers/media/video/tea6415c.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/tea6415c.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,238 @@
+ /*
+    tea6415c.h - i2c-driver for the tea6415c by SGS Thomson   
+
+    Copyright (C) 1998-2003 Michael Hunold <michael@mihu.de>
+
+    The tea6415c is a bus controlled video-matrix-switch
+    with 8 inputs and 6 outputs.
+    It is cascadable, i.e. it can be found at the addresses
+    0x86 and 0x06 on the i2c-bus.
+    
+    For detailed informations download the specifications directly
+    from SGS Thomson at http://www.st.com
+        
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License vs 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 Mvss Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/poll.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+#include "tea6415c.h"
+
+static int debug = 0;	/* insmod parameter */
+MODULE_PARM(debug,"i");
+#define dprintk	if (debug) printk
+
+#define TEA6415C_NUM_INPUTS	8
+#define TEA6415C_NUM_OUTPUTS	6
+
+/* addresses to scan, found only at 0x03 and/or 0x43 (7-bit) */
+static unsigned short normal_i2c[] = {I2C_TEA6415C_1, I2C_TEA6415C_2, I2C_CLIENT_END};
+static unsigned short normal_i2c_range[] = {I2C_CLIENT_END};
+
+/* magic definition of all other variables and things */
+I2C_CLIENT_INSMOD;
+
+static struct i2c_driver driver;
+
+/* unique ID allocation */
+static int tea6415c_id = 0;
+
+/* this function is called by i2c_probe */
+static int tea6415c_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind)
+{
+	struct	i2c_client *client = 0;
+	int err = 0;
+
+	/* let's see whether this adapter can support what we need */
+	if ( 0 == i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE)) {
+		return 0;
+	}
+
+	/* allocate memory for client structure */
+	client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+        if (0 == client) {
+		return -ENOMEM;
+	}
+
+	/* fill client structure */
+	sprintf(client->dev.name,"tea6415c (0x%02x)", address);
+	client->id = tea6415c_id++;
+	client->flags = 0;
+	client->addr = address;
+	client->adapter = adapter;
+	client->driver = &driver;
+
+	/* tell the i2c layer a new client has arrived */
+	if (0 != (err = i2c_attach_client(client))) {
+		kfree(client);
+		return err;
+	}
+
+	printk("tea6415c.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+
+	return 0;
+}
+
+static int tea6415c_attach(struct i2c_adapter *adapter)
+{
+	/* let's see whether this is a know adapter we can attach to */
+	if( adapter->id != I2C_ALGO_SAA7146 ) {
+		dprintk("tea6415c.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		return -ENODEV;
+	}
+
+	return i2c_probe(adapter,&addr_data,&tea6415c_detect);
+}
+
+static int tea6415c_detach(struct i2c_client *client)
+{
+	int err = 0;
+
+	if ( 0 != (err = i2c_detach_client(client))) {
+		printk("tea6415c.o: Client deregistration failed, client not detached.\n");
+		return err;
+	}
+	
+	kfree(client);
+
+	return 0;
+}
+
+/* makes a connection between the input-pin 'i' and the output-pin 'o'
+   for the tea6415c-client 'client' */
+static int tea6415c_switch(struct i2c_client *client, int i, int o)
+{
+	u8 	byte = 0;
+	
+	dprintk("tea6415c.o: tea6415c_switch: adr:0x%02x, i:%d, o:%d\n", client->addr, i, o);
+		
+	/* check if the pins are valid */
+	if ( 0 == ((  1 == i ||  3 == i ||  5 == i ||  6 == i ||  8 == i || 10 == i || 20 == i || 11 == i ) &&
+		    (18 == o || 17 == o || 16 == o || 15 == o || 14 == o || 13 == o )))
+		return -1;
+
+	/* to understand this, have a look at the tea6415c-specs (p.5) */
+	switch(o) {
+		case 18:
+			byte = 0x00;
+			break;
+		case 14:
+			byte = 0x20;
+			break;
+		case 16:
+			byte = 0x10;
+			break;
+		case 17:
+			byte = 0x08;
+			break;
+		case 15:
+			byte = 0x18;
+			break;
+		case 13:
+			byte = 0x28;
+			break;
+	};
+		
+	switch(i) {
+		case 5:
+			byte |= 0x00;
+			break;
+		case 8:
+			byte |= 0x04;
+			break;
+		case 3:
+			byte |= 0x02;
+			break;
+		case 20:
+			byte |= 0x06;
+			break;
+		case 6:
+			byte |= 0x01;
+			break;
+		case 10:
+			byte |= 0x05;
+			break;
+		case 1:
+			byte |= 0x03;
+			break;
+		case 11:
+			byte |= 0x07;
+			break;
+	};
+
+	if ( 0 != i2c_smbus_write_byte(client,byte)) {
+		dprintk("tea6415c.o: tea6415c_switch: could not write to tea6415c\n");
+		return -1;
+	}
+
+	return 0;
+}
+
+static int tea6415c_command(struct i2c_client *client, unsigned int cmd, void* arg)
+{
+	struct tea6415c_multiplex *v = (struct tea6415c_multiplex*)arg;
+	int result = 0;
+
+	switch (cmd) {
+		case TEA6415C_SWITCH: {
+			result = tea6415c_switch(client,v->in,v->out);
+			break;
+		}
+		default: {
+			return -ENOIOCTLCMD;
+		}
+	}
+
+	if ( 0 != result )
+		return result;
+	
+	return 0;
+}
+
+static struct i2c_driver driver = {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,54)
+	.owner		= THIS_MODULE,
+#endif
+	.name		= "tea6415c driver",
+	.id		= I2C_DRIVERID_TEA6415C,
+	.flags		= I2C_DF_NOTIFY,
+        .attach_adapter = tea6415c_attach,
+        .detach_client	= tea6415c_detach,
+        .command	= tea6415c_command,
+};
+
+static int tea6415c_init_module(void)
+{
+	i2c_add_driver(&driver);
+	return 0;
+}
+
+static void tea6415c_cleanup_module(void)
+{
+        i2c_del_driver(&driver);
+}
+
+module_init(tea6415c_init_module);
+module_exit(tea6415c_cleanup_module);
+
+MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+MODULE_DESCRIPTION("tea6415c driver");
+MODULE_LICENSE("GPL");
+
diff -Nru a/drivers/media/video/tea6415c.h b/drivers/media/video/tea6415c.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/tea6415c.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,39 @@
+#ifndef __INCLUDED_TEA6415C__
+#define __INCLUDED_TEA6415C__
+
+/* possible i2c-addresses */
+#define	I2C_TEA6415C_1		0x03
+#define	I2C_TEA6415C_2		0x43
+
+/* the tea6415c's design is quite brain-dead. although there are
+   8 inputs and 6 outputs, these aren't enumerated in any way. because
+   I don't want to say "connect input pin 20 to output pin 17", I define
+   a "virtual" pin-order. */
+
+/* input pins */
+#define TEA6415C_OUTPUT1 18
+#define TEA6415C_OUTPUT2 14
+#define TEA6415C_OUTPUT3 16
+#define TEA6415C_OUTPUT4 17
+#define TEA6415C_OUTPUT5 13
+#define TEA6415C_OUTPUT6 15
+
+/* output pins */
+#define TEA6415C_INPUT1 5
+#define TEA6415C_INPUT2 8
+#define TEA6415C_INPUT3 3
+#define TEA6415C_INPUT4 20
+#define TEA6415C_INPUT5 6
+#define TEA6415C_INPUT6 10
+#define TEA6415C_INPUT7 1
+#define TEA6415C_INPUT8 11
+
+struct tea6415c_multiplex
+{
+	int	in;	/* input-pin */
+	int	out;	/* output-pin */
+};
+
+#define TEA6415C_SWITCH		_IOW('v',1,struct tea6415c_multiplex)
+
+#endif
diff -Nru a/drivers/media/video/tea6420.c b/drivers/media/video/tea6420.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/tea6420.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,217 @@
+ /*
+    tea6420.o - i2c-driver for the tea6420 by SGS Thomson
+
+    Copyright (C) 1998-2003 Michael Hunold <michael@mihu.de>
+
+    The tea6420 is a bus controlled audio-matrix with 5 stereo inputs,
+    4 stereo outputs and gain control for each output.
+    It is cascadable, i.e. it can be found at the adresses 0x98
+    and 0x9a on the i2c-bus.
+    
+    For detailed informations download the specifications directly
+    from SGS Thomson at http://www.st.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.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/poll.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/init.h>
+
+#include "tea6420.h"
+
+static int debug = 0;	/* insmod parameter */
+MODULE_PARM(debug,"i");
+#define dprintk	if (debug) printk
+
+/* addresses to scan, found only at 0x4c and/or 0x4d (7-Bit) */
+static unsigned short normal_i2c[] = {I2C_TEA6420_1, I2C_TEA6420_2, I2C_CLIENT_END};
+static unsigned short normal_i2c_range[] = {I2C_CLIENT_END};
+
+/* magic definition of all other variables and things */
+I2C_CLIENT_INSMOD;
+
+static struct i2c_driver driver;
+
+/* unique ID allocation */
+static int tea6420_id = 0;
+
+/* make a connection between the input 'i' and the output 'o'
+   with gain 'g' for the tea6420-client 'client' (note: i = 6 means 'mute') */
+static int tea6420_switch(struct i2c_client *client, int i, int o, int g)
+{
+	u8 	byte = 0;
+	
+	int 	result = 0;
+	
+	dprintk("tea6420.o: tea6420_switch: adr:0x%02x, i:%d, o:%d, g:%d\n",client->addr,i,o,g);
+
+	/* check if the paramters are valid */
+	if ( i < 1 || i > 6 || o < 1 || o > 4 || g < 0 || g > 6 || g%2 != 0 )
+		return -1;
+
+	byte  = ((o-1)<<5);
+	byte |=  (i-1);
+
+	/* to understand this, have a look at the tea6420-specs (p.5) */
+	switch(g) {
+		case 0:
+			byte |= (3<<3);
+			break;
+		case 2:
+			byte |= (2<<3);
+			break;
+		case 4:
+			byte |= (1<<3);
+			break;
+		case 6:
+			break;
+	}
+
+	/* fixme?: 1 != ... => 0 != */
+	if ( 0 != (result = i2c_smbus_write_byte(client,byte))) {
+		printk("tea6402:%d\n",result);
+		dprintk(KERN_ERR "tea6420.o: could not switch, result:%d\n",result);
+		return -EFAULT;
+	}
+	
+	return 0;
+}
+
+/* this function is called by i2c_probe */
+static int tea6420_detect(struct i2c_adapter *adapter, int address, unsigned short flags, int kind)
+{
+	struct	i2c_client *client;
+	int err = 0, i = 0;
+
+	/* let's see whether this adapter can support what we need */
+	if ( 0 == i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_BYTE)) {
+		return 0;
+	}
+
+	/* allocate memory for client structure */
+	client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
+        if (0 == client) {
+		return -ENOMEM;
+	}
+	
+	/* fill client structure */
+	sprintf(client->dev.name,"tea6420 (0x%02x)", address);
+	client->id = tea6420_id++;
+	client->flags = 0;
+	client->addr = address;
+	client->adapter = adapter;
+	client->driver = &driver;
+	i2c_set_clientdata(client, NULL);
+
+	/* tell the i2c layer a new client has arrived */
+	if (0 != (err = i2c_attach_client(client))) {
+		kfree(client);
+		return err;
+	}
+
+	/* set initial values: set "mute"-input to all outputs at gain 0 */
+	err = 0;
+	for(i = 1; i < 5; i++) {
+		err += tea6420_switch(client, 6, i, 0);
+	}
+	if( 0 != err) {
+		printk("tea6420.o: could not initialize chipset. continuing anyway.\n");
+	}
+	
+	printk("tea6420.o: detected @ 0x%02x on adapter %s\n",2*address,&client->adapter->dev.name[0]);
+
+	return 0;
+}
+
+static int tea6420_attach(struct i2c_adapter *adapter)
+{
+	/* let's see whether this is a know adapter we can attach to */
+	if( adapter->id != I2C_ALGO_SAA7146 ) {
+		dprintk("tea6420.o: refusing to probe on unknown adapter [name='%s',id=0x%x]\n",adapter->dev.name,adapter->id);
+		return -ENODEV;
+	}
+
+	return i2c_probe(adapter,&addr_data,&tea6420_detect);
+}
+
+static int tea6420_detach(struct i2c_client *client)
+{
+	int err = 0;
+
+	if ( 0 != (err = i2c_detach_client(client))) {
+		printk("tea6420.o: Client deregistration failed, client not detached.\n");
+		return err;
+	}
+	
+	kfree(client);
+
+	return 0;
+}
+
+static int tea6420_command(struct i2c_client *client, unsigned int cmd, void* arg)
+{
+	struct tea6420_multiplex *a = (struct tea6420_multiplex*)arg;
+	int result = 0;
+
+	switch (cmd) {
+		case TEA6420_SWITCH: {
+			result = tea6420_switch(client,a->in,a->out,a->gain);
+			break;
+		}
+		default: {
+			return -ENOIOCTLCMD;
+		}
+	}
+
+	if ( 0 != result )
+		return result;
+	
+	return 0;
+}
+
+static struct i2c_driver driver = {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,54)
+	.owner		= THIS_MODULE,
+#endif
+	.name		= "tea6420 driver",
+	.id		= I2C_DRIVERID_TEA6420,
+	.flags		= I2C_DF_NOTIFY,
+        .attach_adapter = tea6420_attach,
+        .detach_client	= tea6420_detach,
+        .command	= tea6420_command,
+};
+
+static int tea6420_init_module(void)
+{
+	i2c_add_driver(&driver);
+	return 0;
+}
+
+static void tea6420_cleanup_module(void)
+{
+        i2c_del_driver(&driver);
+}
+
+module_init(tea6420_init_module);
+module_exit(tea6420_cleanup_module);
+
+MODULE_AUTHOR("Michael Hunold <michael@mihu.de>");
+MODULE_DESCRIPTION("tea6420 driver");
+MODULE_LICENSE("GPL");
diff -Nru a/drivers/media/video/tea6420.h b/drivers/media/video/tea6420.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/media/video/tea6420.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,17 @@
+#ifndef __INCLUDED_TEA6420__
+#define __INCLUDED_TEA6420__
+
+/* possible addresses */
+#define	I2C_TEA6420_1		0x4c
+#define	I2C_TEA6420_2		0x4d
+
+struct tea6420_multiplex
+{
+	int	in;	/* input of audio switch */
+	int	out;	/* output of audio switch  */
+	int	gain;	/* gain of connection */
+};
+
+#define TEA6420_SWITCH		_IOW('v',1,struct tea6420_multiplex)
+
+#endif
diff -Nru a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig
--- a/drivers/mtd/maps/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/drivers/mtd/maps/Kconfig	Sat Apr 19 19:51:50 2003
@@ -283,6 +283,14 @@
 	  IQ80310 evaluation board. If you have one of these boards and would 
 	  like to use the flash chips on it, say 'Y'.
 
+config MTD_IQ80321
+	tristate "CFI Flash device mapped on the XScale IQ80321 board"
+	depends on ARM && MTD_CFI && ARCH_IQ80321
+	help
+	  This enables access routines for the flash chips on the Intel XScale
+	  IQ80321 evaluation board. If you have one of these boards and would
+	  like to use the flash chips on it, say 'Y'.
+
 config MTD_EPXA10DB
 	tristate "CFI Flash device mapped on Epxa10db"
 	depends on ARM && MTD_CFI && MTD_PARTITIONS && ARCH_CAMELOT
diff -Nru a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile
--- a/drivers/mtd/maps/Makefile	Sat Apr 19 19:51:27 2003
+++ b/drivers/mtd/maps/Makefile	Sat Apr 19 19:51:27 2003
@@ -12,6 +12,7 @@
 obj-$(CONFIG_MTD_ELAN_104NC)	+= elan-104nc.o
 obj-$(CONFIG_MTD_EPXA10DB)	+= epxa10db-flash.o
 obj-$(CONFIG_MTD_IQ80310)	+= iq80310.o
+obj-$(CONFIG_MTD_IQ80321)	+= iq80321.o
 obj-$(CONFIG_MTD_L440GX)	+= l440gx.o
 obj-$(CONFIG_MTD_NORA)		+= nora.o
 obj-$(CONFIG_MTD_CEIVA)		+= ceiva.o
diff -Nru a/drivers/mtd/maps/iq80321.c b/drivers/mtd/maps/iq80321.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/mtd/maps/iq80321.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,169 @@
+/*
+ * $Id: iq80321.c,v 1.1.2.1 2003/03/04 16:14:31 ejc Exp $
+ *
+ * Mapping for the Intel XScale IQ80321 evaluation board
+ *
+ * Author:	Rory Bolt <rorybolt@pacbell.net>
+ * Copyright:	(C) 2002 Rory Bolt
+ *
+ * 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/module.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <asm/io.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/map.h>
+#include <linux/mtd/partitions.h>
+
+
+#define WINDOW_ADDR 	0xf0000000
+#define WINDOW_SIZE 	8*1024*1024
+#define BUSWIDTH 	1
+
+static struct mtd_info *mymtd;
+
+static __u8 iq80321_read8(struct map_info *map, unsigned long ofs)
+{
+	return *(__u8 *)(map->map_priv_1 + ofs);
+}
+
+static __u16 iq80321_read16(struct map_info *map, unsigned long ofs)
+{
+	return *(__u16 *)(map->map_priv_1 + ofs);
+}
+
+static __u32 iq80321_read32(struct map_info *map, unsigned long ofs)
+{
+	return *(__u32 *)(map->map_priv_1 + ofs);
+}
+
+static void iq80321_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len)
+{
+	memcpy(to, (void *)(map->map_priv_1 + from), len);
+}
+
+static void iq80321_write8(struct map_info *map, __u8 d, unsigned long adr)
+{
+	*(__u8 *)(map->map_priv_1 + adr) = d;
+}
+
+static void iq80321_write16(struct map_info *map, __u16 d, unsigned long adr)
+{
+	*(__u16 *)(map->map_priv_1 + adr) = d;
+}
+
+static void iq80321_write32(struct map_info *map, __u32 d, unsigned long adr)
+{
+	*(__u32 *)(map->map_priv_1 + adr) = d;
+}
+
+static void iq80321_copy_to(struct map_info *map, unsigned long to, const void *from, ssize_t len)
+{
+	memcpy((void *)(map->map_priv_1 + to), from, len);
+}
+
+static struct map_info iq80321_map = {
+	name	= "IQ80321 flash",
+	size	= WINDOW_SIZE,
+	buswidth	= BUSWIDTH,
+	read8	= iq80321_read8,
+	read16	= iq80321_read16,
+	read32	= iq80321_read32,
+	copy_from	= iq80321_copy_from,
+	write8	= iq80321_write8,
+	write16	= iq80321_write16,
+	write32	= iq80321_write32,
+	copy_to	= iq80321_copy_to
+};
+
+static struct mtd_partition iq80321_partitions[4] = {
+	{
+		.name	= "Firmware",
+		.size	= 0x00080000,
+		.offset	= 0,
+		.mask_flags	= MTD_WRITEABLE  /* force read-only */
+	},{
+		.name	= "Kernel",
+		.size	= 0x000a0000,
+		.offset	= 0x00080000,
+	},{
+		.name	= "Filesystem",
+		.size	= 0x00600000,
+		.offset	= 0x00120000
+	},{
+		.name	= "RedBoot",
+		.size	= 0x000e0000,
+		.offset	= 0x00720000,
+		.mask_flags	= MTD_WRITEABLE
+	}
+};
+
+#define NB_OF(x)  (sizeof(x)/sizeof(x[0]))
+
+static struct mtd_info *mymtd;
+static struct mtd_partition *parsed_parts;
+
+extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts);
+
+static int __init init_iq80321(void)
+{
+	struct mtd_partition *parts;
+	int nb_parts = 0;
+	int parsed_nr_parts = 0;
+	char *part_type = "Static";
+
+	iq80321_map.map_priv_1 = (unsigned long)ioremap(WINDOW_ADDR, WINDOW_SIZE);
+	if (!iq80321_map.map_priv_1) {
+		printk("Failed to ioremap\n");
+		return -EIO;
+	}
+	mymtd = do_map_probe("cfi_probe", &iq80321_map);
+	if (!mymtd) {
+		iounmap((void *)iq80321_map.map_priv_1);
+		return -ENXIO;
+	}
+	mymtd->module = THIS_MODULE;
+
+#ifdef CONFIG_MTD_REDBOOT_PARTS
+	if (parsed_nr_parts == 0) {
+		int ret = parse_redboot_partitions(mymtd, &parsed_parts);
+
+		if (ret > 0) {
+			part_type = "RedBoot";
+			parsed_nr_parts = ret;
+		}
+	}
+#endif
+
+	if (parsed_nr_parts > 0) {
+		parts = parsed_parts;
+		nb_parts = parsed_nr_parts;
+	} else {
+		parts = iq80321_partitions;
+		nb_parts = NB_OF(iq80321_partitions);
+	}
+	printk(KERN_NOTICE "Using %s partition definition\n", part_type);
+	add_mtd_partitions(mymtd, parts, nb_parts);
+	return 0;
+}
+
+static void __exit cleanup_iq80321(void)
+{
+	if (mymtd) {
+		del_mtd_partitions(mymtd);
+		map_destroy(mymtd);
+		if (parsed_parts)
+			kfree(parsed_parts);
+	}
+	if (iq80321_map.map_priv_1)
+		iounmap((void *)iq80321_map.map_priv_1);
+}
+
+module_init(init_iq80321);
+module_exit(cleanup_iq80321);
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("MTD map driver for Intel XScale IQ80321 evaluation board");
diff -Nru a/drivers/mtd/maps/sa1100-flash.c b/drivers/mtd/maps/sa1100-flash.c
--- a/drivers/mtd/maps/sa1100-flash.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/mtd/maps/sa1100-flash.c	Sat Apr 19 19:51:29 2003
@@ -174,9 +174,15 @@
 
 #ifdef CONFIG_SA1100_BADGE4
 /*
- * 1 x Intel 28F320C3BA100 Advanced+ Boot Block Flash (32 Mi bit)
+ * 1 x Intel 28F320C3 Advanced+ Boot Block Flash (32 Mi bit)
  *   Eight 4 KiW Parameter Bottom Blocks (64 KiB)
  *   Sixty-three 32 KiW Main Blocks (4032 Ki b)
+ *
+ * <or>
+ *
+ * 1 x Intel 28F640C3 Advanced+ Boot Block Flash (64 Mi bit)
+ *   Eight 4 KiW Parameter Bottom Blocks (64 KiB)
+ *   One-hundred-twenty-seven 32 KiW Main Blocks (8128 Ki b)
  */
 static struct mtd_partition badge4_partitions[] = {
 	{
@@ -188,10 +194,6 @@
 		.offset		= MTDPART_OFS_APPEND,
 		.size		= 0x00006000
 	}, {
-		.name		= "kernel",
-		.offset		= MTDPART_OFS_APPEND,
-		.size		= 0x00100000
-	}, {
 		.name		= "root",
 		.offset		= MTDPART_OFS_APPEND,
 		.size		= MTDPART_SIZ_FULL
@@ -1087,8 +1089,10 @@
 
 	del_mtd_partitions(mtd);
 
+#ifdef CONFIG_MTD_CONCAT
 	if (mtd != sa[0].mtd)
 		mtd_concat_destroy(mtd);
+#endif
 
 	for (i = NR_SUBMTD; i >= 0; i--) {
 		if (sa[i].mtd)
@@ -1119,7 +1123,7 @@
 	}
 	if (machine_is_badge4()) {
 		info[0].base = SA1100_CS0_PHYS;
-		info[0].size = SZ_4M;
+		info[0].size = SZ_64M;
 		nr = 1;
 	}
 	if (machine_is_cerf()) {
diff -Nru a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c
--- a/drivers/mtd/mtdblock.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/mtd/mtdblock.c	Sat Apr 19 19:51:46 2003
@@ -388,7 +388,7 @@
 	struct mtdblk_dev *mtdblk;
 	unsigned int res;
 
-	while ((req = elv_next_request(&mtd_queue) != NULL) {
+	while ((req = elv_next_request(&mtd_queue)) != NULL) {
 		struct mtdblk_dev **p = req->rq_disk->private_data;
 		spin_unlock_irq(mtd_queue.queue_lock);
 		mtdblk = *p;
diff -Nru a/drivers/net/3c505.c b/drivers/net/3c505.c
--- a/drivers/net/3c505.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/net/3c505.c	Sat Apr 19 19:51:51 2003
@@ -136,7 +136,7 @@
 #define INVALID_PCB_MSG(len) \
 	printk(invalid_pcb_msg, (len),filename,__FUNCTION__,__LINE__)
 
-static char search_msg[] __initdata = "%s: Looking for 3c505 adapter at address %#x...";
+static char search_msg[] __initdata = KERN_INFO "%s: Looking for 3c505 adapter at address %#x...";
 
 static char stilllooking_msg[] __initdata = "still looking...";
 
@@ -144,7 +144,7 @@
 
 static char notfound_msg[] __initdata = "not found (reason = %d)\n";
 
-static char couldnot_msg[] __initdata = "%s: 3c505 not found\n";
+static char couldnot_msg[] __initdata = KERN_INFO "%s: 3c505 not found\n";
 
 /*********************************************************
  *
@@ -194,7 +194,6 @@
 static unsigned long dma_mem_alloc(int size)
 {
 	int order = get_order(size);
-
 	return __get_dma_pages(GFP_KERNEL, order);
 }
 
@@ -350,7 +349,7 @@
 		if (inb_status(base_addr) & HCRE)
 			return FALSE;
 	}
-	printk("3c505: send_pcb_slow timed out\n");
+	printk(KERN_WARNING "3c505: send_pcb_slow timed out\n");
 	return TRUE;
 }
 
@@ -362,7 +361,7 @@
 		if (inb_status(base_addr) & HCRE)
 			return FALSE;
 	}
-	printk("3c505: send_pcb_fast timed out\n");
+	printk(KERN_WARNING "3c505: send_pcb_fast timed out\n");
 	return TRUE;
 }
 
@@ -415,7 +414,7 @@
 	/* Avoid contention */
 	if (test_and_set_bit(1, &adapter->send_pcb_semaphore)) {
 		if (elp_debug >= 3) {
-			printk("%s: send_pcb entered while threaded\n", dev->name);
+			printk(KERN_DEBUG "%s: send_pcb entered while threaded\n", dev->name);
 		}
 		return FALSE;
 	}
@@ -609,9 +608,10 @@
 	skb = dev_alloc_skb(rlen + 2);
 
 	if (!skb) {
-		printk("%s: memory squeeze, dropping packet\n", dev->name);
+		printk(KERN_WARNING "%s: memory squeeze, dropping packet\n", dev->name);
 		target = adapter->dma_buffer;
 		adapter->current_dma.target = NULL;
+		/* FIXME: stats */
 		return;
 	}
 
@@ -653,7 +653,7 @@
 		adapter->rx_active--;
 
 	if (!adapter->busy)
-		printk("%s: receive_packet called, busy not set.\n", dev->name);
+		printk(KERN_WARNING "%s: receive_packet called, busy not set.\n", dev->name);
 }
 
 /******************************************************
@@ -878,7 +878,7 @@
 	 * make sure we actually found the device
 	 */
 	if (adapter == NULL) {
-		printk("%s: Opening a non-existent physical device\n", dev->name);
+		printk(KERN_ERR "%s: Opening a non-existent physical device\n", dev->name);
 		return -EAGAIN;
 	}
 	/*
@@ -1415,9 +1415,6 @@
 			printk(notfound_msg, 1);
 		goto out;
 	}
-	/* Enable interrupts - we need timers! */
-	save_flags(flags);
-	sti();
 
 	/* Wait for a while; the adapter may still be booting up */
 	if (elp_debug > 0)
@@ -1426,9 +1423,8 @@
 	if (orig_HSR & DIR) {
 		/* If HCR.DIR is up, we pull it down. HSR.DIR should follow. */
 		outb(0, dev->base_addr + PORT_CONTROL);
-		timeout = jiffies + 30*HZ/100;
-		while (time_before(jiffies, timeout));
-		restore_flags(flags);
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(30*HZ/100);
 		if (inb_status(addr) & DIR) {
 			if (elp_debug > 0)
 				printk(notfound_msg, 2);
@@ -1437,9 +1433,8 @@
 	} else {
 		/* If HCR.DIR is down, we pull it up. HSR.DIR should follow. */
 		outb(DIR, dev->base_addr + PORT_CONTROL);
-		timeout = jiffies + 30*HZ/100;
-		while (time_before(jiffies, timeout));
-		restore_flags(flags);
+		set_current_state(TASK_UNINTERRUPTIBLE);
+		schedule_timeout(30*HZ/100);
 		if (!(inb_status(addr) & DIR)) {
 			if (elp_debug > 0)
 				printk(notfound_msg, 3);
diff -Nru a/drivers/net/3c59x.c b/drivers/net/3c59x.c
--- a/drivers/net/3c59x.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/net/3c59x.c	Sat Apr 19 19:51:27 2003
@@ -479,11 +479,12 @@
 	int drv_flags;
 	int io_size;
 } vortex_info_tbl[] __devinitdata = {
-#define EISA_TBL_OFFSET	0		/* Offset of this entry for vortex_eisa_init */
 	{"3c590 Vortex 10Mbps",
 	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
+#define EISA_3C592_OFFSET 1		/* Offset of this entry for vortex_eisa_init */
 	{"3c592 EISA 10Mbps Demon/Vortex",					/* AKPM: from Don's 3c59x_cb.c 0.49H */
 	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
+#define EISA_3C597_OFFSET 2		/* Offset of this entry for vortex_eisa_init */
 	{"3c597 EISA Fast Demon/Vortex",					/* AKPM: from Don's 3c59x_cb.c 0.49H */
 	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },
 	{"3c595 Vortex 100baseTx",
@@ -947,8 +948,8 @@
 
 #ifdef CONFIG_EISA
 static struct eisa_device_id vortex_eisa_ids[] = {
-	{ "TCM5920" },
-	{ "TCM5970" },
+	{ "TCM5920", EISA_3C592_OFFSET },
+	{ "TCM5970", EISA_3C597_OFFSET },
 	{ "" }
 };
 
@@ -976,7 +977,7 @@
 		return -EBUSY;
 
 	if (vortex_probe1(device, ioaddr, inw(ioaddr + 0xC88) >> 12,
-					  EISA_TBL_OFFSET, vortex_cards_found)) {
+					  edev->id.driver_data, vortex_cards_found)) {
 		release_region (ioaddr, VORTEX_TOTAL_SIZE);
 		return -ENODEV;
 	}
@@ -1018,10 +1019,6 @@
 {
 	int eisa_found = 0;
 	int orig_cards_found = vortex_cards_found;
-
-	/* Now check all slots of the EISA bus. */
-	if (!EISA_bus)
-		return 0;
 
 #ifdef CONFIG_EISA
 	if (eisa_driver_register (&vortex_eisa_driver) >= 0) {
diff -Nru a/drivers/net/8139cp.c b/drivers/net/8139cp.c
--- a/drivers/net/8139cp.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/net/8139cp.c	Sat Apr 19 19:51:47 2003
@@ -826,7 +826,7 @@
 		 * Otherwise we could race with the device.
 		 */
 		first_eor = eor;
-		first_len = skb->len - skb->data_len;
+		first_len = skb_headlen(skb);
 		first_mapping = pci_map_single(cp->pdev, skb->data,
 					       first_len, PCI_DMA_TODEVICE);
 		cp->tx_skb[entry].skb = skb;
diff -Nru a/drivers/net/acenic.c b/drivers/net/acenic.c
--- a/drivers/net/acenic.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/net/acenic.c	Sat Apr 19 19:51:47 2003
@@ -2829,7 +2829,7 @@
 		int i, len = 0;
 
 		mapping = ace_map_tx_skb(ap, skb, NULL, idx);
-		flagsize = ((skb->len - skb->data_len) << 16);
+		flagsize = (skb_headlen(skb) << 16);
 		if (skb->ip_summed == CHECKSUM_HW)
 			flagsize |= BD_FLG_TCP_UDP_SUM;
 #if ACENIC_DO_VLAN
diff -Nru a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c
--- a/drivers/net/appletalk/cops.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/net/appletalk/cops.c	Sat Apr 19 19:51:47 2003
@@ -801,7 +801,7 @@
                 lp->stats.rx_dropped++;
                 while(pkt_len--)        /* Discard packet */
                         inb(ioaddr);
-		restore_flags(flags);
+                spin_unlock_irqrestore(&lp->lock, flags);
                 return;
         }
         skb->dev = dev;
diff -Nru a/drivers/net/appletalk/ltpc.c b/drivers/net/appletalk/ltpc.c
--- a/drivers/net/appletalk/ltpc.c	Sat Apr 19 19:51:30 2003
+++ b/drivers/net/appletalk/ltpc.c	Sat Apr 19 19:51:30 2003
@@ -213,6 +213,7 @@
 #include <linux/interrupt.h>
 #include <linux/ptrace.h>
 #include <linux/ioport.h>
+#include <linux/spinlock.h>
 #include <linux/in.h>
 #include <linux/slab.h>
 #include <linux/string.h>
@@ -235,6 +236,9 @@
 /* our stuff */
 #include "ltpc.h"
 
+static spinlock_t txqueue_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t mbox_lock = SPIN_LOCK_UNLOCKED;
+
 /* function prototypes */
 static int do_read(struct net_device *dev, void *cbuf, int cbuflen,
 	void *dbuf, int dbuflen);
@@ -283,17 +287,17 @@
 {
 	unsigned long flags;
 	qel->next = NULL;
-	save_flags(flags);
-	cli();
+	
+	spin_lock_irqsave(&txqueue_lock, flags);
 	if (xmQtl) {
 		xmQtl->next = qel;
 	} else {
 		xmQhd = qel;
 	}
 	xmQtl = qel;
-	restore_flags(flags);
+	spin_unlock_irqrestore(&txqueue_lock, flags);
 
-	if (debug&DEBUG_LOWER)
+	if (debug & DEBUG_LOWER)
 		printk("enqueued a 0x%02x command\n",qel->cbuf[0]);
 }
 
@@ -302,18 +306,18 @@
 	unsigned long flags;
 	int i;
 	struct xmitQel *qel=NULL;
-	save_flags(flags);
-	cli();
+	
+	spin_lock_irqsave(&txqueue_lock, flags);
 	if (xmQhd) {
 		qel = xmQhd;
 		xmQhd = qel->next;
 		if(!xmQhd) xmQtl = NULL;
 	}
-	restore_flags(flags);
+	spin_unlock_irqrestore(&txqueue_lock, flags);
 
-	if ((debug&DEBUG_LOWER) && qel) {
+	if ((debug & DEBUG_LOWER) && qel) {
 		int n;
-		printk("ltpc: dequeued command ");
+		printk(KERN_DEBUG "ltpc: dequeued command ");
 		n = qel->cbuflen;
 		if (n>100) n=100;
 		for(i=0;i<n;i++) printk("%02x ",qel->cbuf[i]);
@@ -352,14 +356,13 @@
 	unsigned long flags;
 	int i;
 
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&mbox_lock, flags);
 	for(i=1;i<16;i++) if(!mboxinuse[i]) {
 		mboxinuse[i]=1;
-		restore_flags(flags);
+		spin_unlock_irqrestore(&mbox_lock, flags);
 		return i;
 	}
-	restore_flags(flags);
+	spin_unlock_irqrestore(&mbox_lock, flags);
 	return 0;
 }
 
@@ -503,16 +506,13 @@
 	int i;
 	int base = dev->base_addr;
 
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&txqueue_lock, flags);
 	if(QInIdle) {
-		restore_flags(flags);
+		spin_unlock_irqrestore(&txqueue_lock, flags);
 		return;
 	}
 	QInIdle = 1;
-
-
-	restore_flags(flags);
+	spin_unlock_irqrestore(&txqueue_lock, flags);
 
 	/* this tri-states the IRQ line */
 	(void) inb_p(base+6);
@@ -531,17 +531,17 @@
 	switch(state) {
 		case 0xfc:
 			/* incoming command */
-			if (debug&DEBUG_LOWER) printk("idle: fc\n");
+			if (debug & DEBUG_LOWER) printk("idle: fc\n");
 			handlefc(dev); 
 			break;
 		case 0xfd:
 			/* incoming data */
-			if(debug&DEBUG_LOWER) printk("idle: fd\n");
+			if(debug & DEBUG_LOWER) printk("idle: fd\n");
 			handlefd(dev); 
 			break;
 		case 0xf9:
 			/* result ready */
-			if (debug&DEBUG_LOWER) printk("idle: f9\n");
+			if (debug & DEBUG_LOWER) printk("idle: f9\n");
 			if(!mboxinuse[0]) {
 				mboxinuse[0] = 1;
 				qels[0].cbuf = rescbuf;
@@ -570,7 +570,7 @@
 			break;
 		case 0xfa:
 			/* waiting for command */
-			if(debug&DEBUG_LOWER) printk("idle: fa\n");
+			if(debug & DEBUG_LOWER) printk("idle: fa\n");
 			if (xmQhd) {
 				q=deQ();
 				memcpy(ltdmacbuf,q->cbuf,q->cbuflen);
@@ -608,7 +608,7 @@
 			break;
 		case 0Xfb:
 			/* data transfer ready */
-			if(debug&DEBUG_LOWER) printk("idle: fb\n");
+			if(debug & DEBUG_LOWER) printk("idle: fb\n");
 			if(q->QWrite) {
 				memcpy(ltdmabuf,q->dbuf,q->dbuflen);
 				handlewrite(dev);
@@ -826,7 +826,7 @@
 	struct lt_init c;
 	int ltflags;
 
-	if(debug&DEBUG_VERBOSE) printk("ltpc_ioctl called\n");
+	if(debug & DEBUG_VERBOSE) printk("ltpc_ioctl called\n");
 
 	switch(cmd) {
 		case SIOCSIFADDR:
@@ -872,7 +872,7 @@
 static int ltpc_hard_header (struct sk_buff *skb, struct net_device *dev, 
 	unsigned short type, void *daddr, void *saddr, unsigned len)
 {
-	if(debug&DEBUG_VERBOSE)
+	if(debug & DEBUG_VERBOSE)
 		printk("ltpc_hard_header called for device %s\n",
 			dev->name);
 	return 0;
@@ -914,7 +914,7 @@
 
 	del_timer(&ltpc_timer);
 
-	if(debug&DEBUG_VERBOSE) {
+	if(debug & DEBUG_VERBOSE) {
 		if (!ltpc_poll_counter) {
 			ltpc_poll_counter = 50;
 			printk("ltpc poll is alive\n");
@@ -951,7 +951,7 @@
 	cbuf.length = skb->len;	/* this is host order */
 	skb->h.raw=skb->data;
 
-	if(debug&DEBUG_UPPER) {
+	if(debug & DEBUG_UPPER) {
 		printk("command ");
 		for(i=0;i<6;i++)
 			printk("%02x ",((unsigned char *)&cbuf)[i]);
@@ -960,7 +960,7 @@
 
 	do_write(dev,&cbuf,sizeof(cbuf),skb->h.raw,skb->len);
 
-	if(debug&DEBUG_UPPER) {
+	if(debug & DEBUG_UPPER) {
 		printk("sent %d ddp bytes\n",skb->len);
 		for(i=0;i<skb->len;i++) printk("%02x ",skb->h.raw[i]);
 		printk("\n");
@@ -984,7 +984,7 @@
 static int __init ltpc_probe_dma(int base)
 {
 	int dma = 0;
-  	int timeout;
+  	unsigned long timeout;
   	unsigned long f;
   
   	if (!request_dma(1,"ltpc")) {
@@ -1055,16 +1055,13 @@
 {
 	int err;
 	int x=0,y=0;
-	int timeout;
 	int autoirq;
-	unsigned long flags;
 	unsigned long f;
 	int portfound=0;
+	unsigned long timeout;
 
 	SET_MODULE_OWNER(dev);
 
-	save_flags(flags);
-
 	/* probe for the I/O port address */
 	if (io != 0x240 && request_region(0x220,8,"ltpc")) {
 		x = inb_p(0x220+6);
@@ -1093,15 +1090,13 @@
 	}
 	if(!portfound) {
 		/* give up in despair */
-		printk ("LocalTalk card not found; 220 = %02x, 240 = %02x.\n",
-			x,y);
-		restore_flags(flags);
+		printk(KERN_ERR "LocalTalk card not found; 220 = %02x, 240 = %02x.\n", x,y);
 		return -1;
 	}
 
 	/* probe for the IRQ line */
 	if (irq < 2) {
-		unsigned long irq_mask, delay;
+		unsigned long irq_mask;
 
 		irq_mask = probe_irq_on();
 		/* reset the interrupt line */
@@ -1109,14 +1104,11 @@
 		inb_p(io+7);
 		/* trigger an interrupt (I hope) */
 		inb_p(io+6);
-
-		delay = jiffies + HZ/50;
-		while (time_before(jiffies, delay)) ;
+		mdelay(2);
 		autoirq = probe_irq_off(irq_mask);
 
 		if (autoirq == 0) {
-			printk("ltpc: probe at %#x failed to detect IRQ line.\n",
-				io);
+			printk(KERN_ERR "ltpc: probe at %#x failed to detect IRQ line.\n", io);
 		}
 		else {
 			irq = autoirq;
@@ -1129,12 +1121,11 @@
 	if (ltdmabuf) ltdmacbuf = &ltdmabuf[800];
 
 	if (!ltdmabuf) {
-		printk("ltpc: mem alloc failed\n");
-		restore_flags(flags);
-		return(-1);
+		printk(KERN_ERR "ltpc: mem alloc failed\n");
+		return -1;
 	}
 
-	if(debug&DEBUG_VERBOSE) {
+	if(debug & DEBUG_VERBOSE) {
 		printk("ltdmabuf pointer %08lx\n",(unsigned long) ltdmabuf);
 	}
 
@@ -1142,8 +1133,10 @@
 
 	inb_p(io+1);
 	inb_p(io+3);
-	timeout = jiffies+2*HZ/100;
-	while(time_before(jiffies, timeout)) ; /* hold it in reset for a coupla jiffies */
+
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(2*HZ/100);
+
 	inb_p(io+0);
 	inb_p(io+2);
 	inb_p(io+7); /* clear reset */
@@ -1152,12 +1145,9 @@
 	inb_p(io+5); /* enable dma */
 	inb_p(io+6); /* tri-state interrupt line */
 
-	timeout = jiffies+100*HZ/100;
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ);
 	
-	while(time_before(jiffies, timeout)) {
-		/* wait for the card to complete initialization */
-	}
- 
 	/* now, figure out which dma channel we're using, unless it's
 	   already been specified */
 	/* well, 0 is a legal DMA channel, but the LTPC card doesn't
@@ -1165,8 +1155,7 @@
 	if (dma == 0) {
 		dma = ltpc_probe_dma(io);
 		if (!dma) {  /* no dma channel */
-			printk("No DMA channel found on ltpc card.\n");
-			restore_flags(flags);
+			printk(KERN_ERR "No DMA channel found on ltpc card.\n");
 			return -1;
 		}
 	}
@@ -1174,9 +1163,9 @@
 	/* print out friendly message */
 
 	if(irq)
-		printk("Apple/Farallon LocalTalk-PC card at %03x, IR%d, DMA%d.\n",io,irq,dma);
+		printk(KERN_INFO "Apple/Farallon LocalTalk-PC card at %03x, IR%d, DMA%d.\n",io,irq,dma);
 	else
-		printk("Apple/Farallon LocalTalk-PC card at %03x, DMA%d.  Using polled mode.\n",io,dma);
+		printk(KERN_INFO "Apple/Farallon LocalTalk-PC card at %03x, DMA%d.  Using polled mode.\n",io,dma);
 
 	/* seems more logical to do this *after* probing the card... */
 	err = ltpc_init(dev);
@@ -1202,20 +1191,25 @@
 	(void) inb_p(io+3);
 	(void) inb_p(io+2);
 	timeout = jiffies+100*HZ/100;
+
 	while(time_before(jiffies, timeout)) {
-		if( 0xf9 == inb_p(io+6)) break;
+		if( 0xf9 == inb_p(io+6))
+			break;
+		schedule();
 	}
 
-	if(debug&DEBUG_VERBOSE) {
+	if(debug & DEBUG_VERBOSE) {
 		printk("setting up timer and irq\n");
 	}
 
-	if (irq) {
-		/* grab it and don't let go :-) */
-		(void) request_irq( irq, &ltpc_interrupt, 0, "ltpc", dev);
+	/* grab it and don't let go :-) */
+	if (irq && request_irq( irq, &ltpc_interrupt, 0, "ltpc", dev) >= 0)
+	{
 		(void) inb_p(io+7);  /* enable interrupts from board */
 		(void) inb_p(io+7);  /* and reset irq line */
 	} else {
+		if( irq )
+			printk(KERN_ERR "ltpc: IRQ already in use, using polled mode.\n");
 		/* polled mode -- 20 times per second */
 		/* this is really, really slow... should it poll more often? */
 		init_timer(&ltpc_timer);
@@ -1224,7 +1218,6 @@
 
 		ltpc_timer.expires = jiffies + 5;
 		add_timer(&ltpc_timer);
-		restore_flags(flags); 
 	}
 
 	return 0;
@@ -1294,7 +1287,7 @@
 		printk(KERN_DEBUG "could not register Localtalk-PC device\n");
 		return result;
 	} else {
-		if(debug&DEBUG_VERBOSE) printk("0 from register_netdev\n");
+		if(debug & DEBUG_VERBOSE) printk("0 from register_netdev\n");
 		return 0;
 	}
 }
@@ -1306,7 +1299,7 @@
 
 	ltpc_timer.data = 0;  /* signal the poll routine that we're done */
 
-	if(debug&DEBUG_VERBOSE) printk("freeing irq\n");
+	if(debug & DEBUG_VERBOSE) printk("freeing irq\n");
 
 	if(dev_ltpc.irq) {
 		free_irq(dev_ltpc.irq,&dev_ltpc);
@@ -1316,7 +1309,7 @@
 	if(del_timer(&ltpc_timer)) 
 	{
 		/* either the poll was never started, or a poll is in process */
-		if(debug&DEBUG_VERBOSE) printk("waiting\n");
+		if(debug & DEBUG_VERBOSE) printk("waiting\n");
 		/* if it's in process, wait a bit for it to finish */
 		timeout = jiffies+HZ; 
 		add_timer(&ltpc_timer);
@@ -1327,31 +1320,31 @@
 		}
 	}
 
-	if(debug&DEBUG_VERBOSE) printk("freeing dma\n");
+	if(debug & DEBUG_VERBOSE) printk("freeing dma\n");
 
 	if(dev_ltpc.dma) {
 		free_dma(dev_ltpc.dma);
 		dev_ltpc.dma = 0;
 	}
 
-	if(debug&DEBUG_VERBOSE) printk("freeing ioaddr\n");
+	if(debug & DEBUG_VERBOSE) printk("freeing ioaddr\n");
 
 	if(dev_ltpc.base_addr) {
 		release_region(dev_ltpc.base_addr,8);
 		dev_ltpc.base_addr = 0;
 	}
 
-	if(debug&DEBUG_VERBOSE) printk("free_pages\n");
+	if(debug & DEBUG_VERBOSE) printk("free_pages\n");
 
 	free_pages( (unsigned long) ltdmabuf, get_order(1000));
 	ltdmabuf=NULL;
 	ltdmacbuf=NULL;
 
-	if(debug&DEBUG_VERBOSE) printk("unregister_netdev\n");
+	if(debug & DEBUG_VERBOSE) printk("unregister_netdev\n");
 
 	unregister_netdev(&dev_ltpc);
 
-	if(debug&DEBUG_VERBOSE) printk("returning from cleanup_module\n");
+	if(debug & DEBUG_VERBOSE) printk("returning from cleanup_module\n");
 }
 
 module_exit(ltpc_cleanup);
diff -Nru a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c
--- a/drivers/net/arcnet/arcnet.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/net/arcnet/arcnet.c	Sat Apr 19 19:51:49 2003
@@ -80,6 +80,7 @@
 	null_prepare_tx
 };
 
+static spinlock_t arcnet_lock = SPIN_LOCK_UNLOCKED;
 
 /* Exported function prototypes */
 int arcnet_debug = ARCNET_DEBUG;
@@ -186,10 +187,7 @@
 void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc)
 {
 	int i;
-	unsigned long flags;
 
-	save_flags(flags);
-	cli();
 	printk(KERN_DEBUG "%6s: skb dump (%s) follows:", dev->name, desc);
 	for (i = 0; i < skb->len; i++) {
 		if (i % 16 == 0)
@@ -197,7 +195,6 @@
 		printk("%02X ", ((u_char *) skb->data)[i]);
 	}
 	printk("\n");
-	restore_flags(flags);
 }
 
 EXPORT_SYMBOL(arcnet_dump_skb);
@@ -215,10 +212,11 @@
 	unsigned long flags;
 	static uint8_t buf[512];
 
-	save_flags(flags);
-	cli();
-
+	/* hw.copy_from_card expects IRQ context so take the IRQ lock
+	   to keep it single threaded */
+	spin_lock_irqsave(&arcnet_lock, flags);
 	lp->hw.copy_from_card(dev, bufnum, 0, buf, 512);
+	spin_unlock_irqrestore(&arcnet_lock, flags);
 
 	/* if the offset[0] byte is nonzero, this is a 256-byte packet */
 	length = (buf[2] ? 256 : 512);
@@ -231,7 +229,6 @@
 	}
 	printk("\n");
 
-	restore_flags(flags);
 }
 
 EXPORT_SYMBOL(arcnet_dump_packet);
@@ -670,9 +667,7 @@
 	int status = ASTATUS();
 	char *msg;
 
-	save_flags(flags);
-	cli();
-
+	spin_lock_irqsave(&arcnet_lock, flags);
 	if (status & TXFREEflag) {	/* transmit _DID_ finish */
 		msg = " - missed IRQ?";
 	} else {
@@ -687,8 +682,8 @@
 	AINTMASK(0);
 	lp->intmask |= TXFREEflag;
 	AINTMASK(lp->intmask);
-
-	restore_flags(flags);
+	
+	spin_unlock_irqrestore(&arcnet_lock, flags);
 
 	if (jiffies - lp->last_timeout > 10*HZ) {
 		BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)\n",
@@ -714,17 +709,14 @@
 
 	BUGMSG(D_DURING, "\n");
 
-	if (dev == NULL) {
-		BUGMSG(D_DURING, "arcnet: irq %d for unknown device.\n", irq);
-		return;
-	}
 	BUGMSG(D_DURING, "in arcnet_interrupt\n");
 
+	spin_lock(&arcnet_lock);
+	
 	lp = (struct arcnet_local *) dev->priv;
-	if (!lp) {
-		BUGMSG(D_DURING, "arcnet: irq ignored due to missing lp.\n");
-		return;
-	}
+	if (!lp)
+		BUG();
+		
 	/*
 	 * RESET flag was enabled - if device is not running, we must clear it right
 	 * away (but nothing else).
@@ -733,6 +725,7 @@
 		if (ASTATUS() & RESETflag)
 			ACOMMAND(CFLAGScmd | RESETclear);
 		AINTMASK(0);
+		spin_unlock(&arcnet_lock);
 		return;
 	}
 
@@ -899,6 +892,8 @@
 	AINTMASK(0);
 	udelay(1);
 	AINTMASK(lp->intmask);
+	
+	spin_unlock(&arcnet_lock);
 }
 
 
diff -Nru a/drivers/net/e100/e100_main.c b/drivers/net/e100/e100_main.c
--- a/drivers/net/e100/e100_main.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/net/e100/e100_main.c	Sat Apr 19 19:51:47 2003
@@ -2199,10 +2199,10 @@
 
 		(tcb->tbd_ptr)->tbd_buf_addr =
 			cpu_to_le32(pci_map_single(bdp->pdev, skb->data,
-						   (skb->len - skb->data_len),
+						   skb_headlen(skb),
 						   PCI_DMA_TODEVICE));
 		(tcb->tbd_ptr)->tbd_buf_cnt =
-			cpu_to_le16(skb->len - skb->data_len);
+			cpu_to_le16(skb_headlen(skb));
 
 		for (i = 0; i < skb_shinfo(skb)->nr_frags;
 		     i++, tbd_arr_ptr++, frag++) {
diff -Nru a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
--- a/drivers/net/e1000/e1000_main.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/net/e1000/e1000_main.c	Sat Apr 19 19:51:46 2003
@@ -61,7 +61,7 @@
 
 char e1000_driver_name[] = "e1000";
 char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
-char e1000_driver_version[] = "5.0.43-k1";
+char e1000_driver_version[] = "5.0.43-k2";
 char e1000_copyright[] = "Copyright (c) 1999-2003 Intel Corporation.";
 
 /* e1000_pci_tbl - PCI Device ID Table
@@ -2000,10 +2000,16 @@
 	}
 
 #ifdef CONFIG_E1000_NAPI
-	/* Don't disable interrupts - rely on h/w interrupt
-	 * moderation to keep interrupts low.  netif_rx_schedule
-	 * is NOP if already polling. */
-	netif_rx_schedule(netdev);
+	if(netif_rx_schedule_prep(netdev)) {
+
+		/* Disable interrupts and register for poll. The flush 
+		  of the posted write is intentionally left out.
+		*/
+
+		atomic_inc(&adapter->irq_sem);
+		E1000_WRITE_REG(&adapter->hw, IMC, ~0);
+		__netif_rx_schedule(netdev);
+	}
 #else
 	for(i = 0; i < E1000_MAX_INTR; i++)
 		if(!e1000_clean_rx_irq(adapter) &&
@@ -2025,16 +2031,16 @@
 	int work_to_do = min(*budget, netdev->quota);
 	int work_done = 0;
 	
-	while(work_done < work_to_do)
-		if(!e1000_clean_rx_irq(adapter, &work_done, work_to_do) &&
-		   !e1000_clean_tx_irq(adapter))
-			break;
+	e1000_clean_tx_irq(adapter);
+	e1000_clean_rx_irq(adapter, &work_done, work_to_do);
 
 	*budget -= work_done;
 	netdev->quota -= work_done;
 	
-	if(work_done < work_to_do)
+	if(work_done < work_to_do) {
 		netif_rx_complete(netdev);
+		e1000_irq_enable(adapter);
+	}
 
 	return (work_done >= work_to_do);
 }
diff -Nru a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c
--- a/drivers/net/e1000/e1000_param.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/net/e1000/e1000_param.c	Sat Apr 19 19:51:49 2003
@@ -322,7 +322,7 @@
 			.name = "Transmit Descriptors",
 			.err  = "using default of " __MODULE_STRING(DEFAULT_TXD),
 			.def  = DEFAULT_TXD,
-			.arg  = { .r { .min = MIN_TXD }}
+			.arg  = { .r = { .min = MIN_TXD }}
 		};
 		struct e1000_desc_ring *tx_ring = &adapter->tx_ring;
 		e1000_mac_type mac_type = adapter->hw.mac_type;
diff -Nru a/drivers/net/fc/iph5526.c b/drivers/net/fc/iph5526.c
--- a/drivers/net/fc/iph5526.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/net/fc/iph5526.c	Sat Apr 19 19:51:29 2003
@@ -689,8 +689,8 @@
 			prev_IMQ_index = current_IMQ_index;
 		}
 	} /*end of for loop*/		
-	return;
 	LEAVE("tachyon_interrupt");
+       return;
 }
 
 
@@ -3375,8 +3375,8 @@
 		q = q->next;
 	}
 	DPRINTK1("Port Name does not match. Txing LOGO.");
-	return 0;
 	LEAVE("validate_login");
+       return 0;
 }
 
 static void add_to_address_cache(struct fc_info *fi, u_int *base_ptr)
diff -Nru a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c
--- a/drivers/net/hamradio/scc.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/net/hamradio/scc.c	Sat Apr 19 19:51:50 2003
@@ -235,13 +235,14 @@
 
 /* These provide interrupt save 2-step access to the Z8530 registers */
 
+static spinlock_t iolock;	/* Guards paired accesses */
+
 static inline unsigned char InReg(io_port port, unsigned char reg)
 {
 	unsigned long flags;
 	unsigned char r;
-	
-	save_flags(flags);
-	cli();
+
+	spin_lock_irqsave(&iolock, flags);	
 #ifdef SCC_LDELAY
 	Outb(port, reg);
 	udelay(SCC_LDELAY);
@@ -251,16 +252,15 @@
 	Outb(port, reg);
 	r=Inb(port);
 #endif
-	restore_flags(flags);
+	spin_unlock_irqrestore(&iolock, flags);
 	return r;
 }
 
 static inline void OutReg(io_port port, unsigned char reg, unsigned char val)
 {
 	unsigned long flags;
-	
-	save_flags(flags);
-	cli();
+
+	spin_lock_irqsave(&iolock, flags);
 #ifdef SCC_LDELAY
 	Outb(port, reg); udelay(SCC_LDELAY);
 	Outb(port, val); udelay(SCC_LDELAY);
@@ -268,7 +268,7 @@
 	Outb(port, reg);
 	Outb(port, val);
 #endif
-	restore_flags(flags);
+	spin_unlock_irqrestore(&iolock, flags);
 }
 
 static inline void wr(struct scc_channel *scc, unsigned char reg,
@@ -295,9 +295,7 @@
 {
 	unsigned long flags;
 	
-	save_flags(flags);
-	cli();
-	
+	spin_lock_irqsave(&scc->lock, flags);	
 	if (scc->tx_buff != NULL)
 	{
 		dev_kfree_skb(scc->tx_buff);
@@ -307,7 +305,7 @@
 	while (skb_queue_len(&scc->tx_queue))
 		dev_kfree_skb(skb_dequeue(&scc->tx_queue));
 
-	restore_flags(flags);
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 
@@ -609,6 +607,7 @@
 
 static void scc_isr_dispatch(struct scc_channel *scc, int vector)
 {
+	spin_lock(&scc->lock);
 	switch (vector & VECTOR_MASK)
 	{
 		case TXINT: scc_txint(scc); break;
@@ -616,6 +615,7 @@
 		case RXINT: scc_rxint(scc); break;
 		case SPINT: scc_spint(scc); break;
 	}
+	spin_unlock(&scc->lock);
 }
 
 /* If the card has a latch for the interrupt vector (like the PA0HZP card)
@@ -722,12 +722,13 @@
 
 static inline void set_speed(struct scc_channel *scc)
 {
-	disable_irq(scc->irq);
+	unsigned long flags;
+	spin_lock_irqsave(&scc->lock, flags);
 
 	if (scc->modem.speed > 0)	/* paranoia... */
 		set_brg(scc, (unsigned) (scc->clock / (scc->modem.speed * 64)) - 2);
-
-	enable_irq(scc->irq);
+		
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 
@@ -988,14 +989,8 @@
 
 /* ----> SCC timer interrupt handler and friends. <---- */
 
-static void scc_start_tx_timer(struct scc_channel *scc, void (*handler)(unsigned long), unsigned long when)
+static void __scc_start_tx_timer(struct scc_channel *scc, void (*handler)(unsigned long), unsigned long when)
 {
-	unsigned long flags;
-	
-	
-	save_flags(flags);
-	cli();
-
 	del_timer(&scc->tx_t);
 
 	if (when == 0)
@@ -1009,17 +1004,22 @@
 		scc->tx_t.expires = jiffies + (when*HZ)/100;
 		add_timer(&scc->tx_t);
 	}
+}
+
+static void scc_start_tx_timer(struct scc_channel *scc, void (*handler)(unsigned long), unsigned long when)
+{
+	unsigned long flags;
 	
-	restore_flags(flags);
+	spin_lock_irqsave(&scc->lock, flags);
+	__scc_start_tx_timer(scc, handler, when);
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 static void scc_start_defer(struct scc_channel *scc)
 {
 	unsigned long flags;
 	
-	save_flags(flags);
-	cli();
-
+	spin_lock_irqsave(&scc->lock, flags);
 	del_timer(&scc->tx_wdog);
 	
 	if (scc->kiss.maxdefer != 0 && scc->kiss.maxdefer != TIMER_OFF)
@@ -1029,16 +1029,14 @@
 		scc->tx_wdog.expires = jiffies + HZ*scc->kiss.maxdefer;
 		add_timer(&scc->tx_wdog);
 	}
-	restore_flags(flags);
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 static void scc_start_maxkeyup(struct scc_channel *scc)
 {
 	unsigned long flags;
 	
-	save_flags(flags);
-	cli();
-
+	spin_lock_irqsave(&scc->lock, flags);
 	del_timer(&scc->tx_wdog);
 	
 	if (scc->kiss.maxkeyup != 0 && scc->kiss.maxkeyup != TIMER_OFF)
@@ -1048,8 +1046,7 @@
 		scc->tx_wdog.expires = jiffies + HZ*scc->kiss.maxkeyup;
 		add_timer(&scc->tx_wdog);
 	}
-	
-	restore_flags(flags);
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 /* 
@@ -1189,13 +1186,10 @@
 	struct scc_channel *scc = (struct scc_channel *) channel;
 	unsigned long flags;
 	
- 	save_flags(flags);
- 	cli();
- 
+	spin_lock_irqsave(&scc->lock, flags); 
  	del_timer(&scc->tx_wdog);	
  	scc_key_trx(scc, TX_OFF);
-
- 	restore_flags(flags);
+	spin_unlock_irqrestore(&scc->lock, flags);
 
  	if (scc->stat.tx_state == TXS_TIMEOUT)		/* we had a timeout? */
  	{
@@ -1242,9 +1236,7 @@
 	struct scc_channel *scc = (struct scc_channel *) channel;
 	unsigned long flags;
 
-	save_flags(flags);
-	cli();
-
+	spin_lock_irqsave(&scc->lock, flags);
 	/* 
 	 * let things settle down before we start to
 	 * accept new data.
@@ -1259,7 +1251,7 @@
 	cl(scc, R15, TxUIE);		/* count it. */
 	OutReg(scc->ctrl, R0, RES_Tx_P);
 
-	restore_flags(flags);
+	spin_unlock_irqrestore(&scc->lock, flags);
 
 	scc->stat.txerrs++;
 	scc->stat.tx_state = TXS_TIMEOUT;
@@ -1289,13 +1281,10 @@
 static void scc_init_timer(struct scc_channel *scc)
 {
 	unsigned long flags;
-	
-	save_flags(flags); 
-	cli();
-	
-	scc->stat.tx_state = TXS_IDLE;
 
-	restore_flags(flags);
+	spin_lock_irqsave(&scc->lock, flags);	
+	scc->stat.tx_state = TXS_IDLE;
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 
@@ -1414,9 +1403,7 @@
 	struct scc_channel *scc = (struct scc_channel *) channel;
 	unsigned long flags;
 	
-	save_flags(flags);
-	cli();
-
+	spin_lock_irqsave(&scc->lock, flags);
 	del_timer(&scc->tx_wdog);
 	scc_key_trx(scc, TX_OFF);
 	wr(scc, R6, 0);
@@ -1425,7 +1412,7 @@
 	Outb(scc->ctrl,RES_EXT_INT);
 
 	netif_wake_queue(scc->dev);
-	restore_flags(flags);
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 
@@ -1434,9 +1421,7 @@
 {
 	unsigned long flags;
 	
-	save_flags(flags);
-	cli();
-
+	spin_lock_irqsave(&scc->lock, flags);
 	netif_stop_queue(scc->dev);
 	scc_discard_buffers(scc);
 
@@ -1460,7 +1445,7 @@
 	Outb(scc->ctrl,RES_EXT_INT);
 
 	scc_key_trx(scc, TX_ON);
-	restore_flags(flags);
+	spin_unlock_irqrestore(&scc->lock, flags);
 }
 
 /* ******************************************************************* */
@@ -1508,16 +1493,14 @@
 			
 		/* Reset and pre-init Z8530 */
 
-		save_flags(flags);
-		cli();
-		
+		spin_lock_irqsave(&scc->lock, flags);
+				
 		Outb(scc->ctrl, 0);
 		OutReg(scc->ctrl,R9,FHWRES);		/* force hardware reset */
 		udelay(100);				/* give it 'a bit' more time than required */
 		wr(scc, R2, chip*16);			/* interrupt vector */
 		wr(scc, R9, VIS);			/* vector includes status */
-		
-        	restore_flags(flags);
+		spin_unlock_irqrestore(&scc->lock, flags);		
         }
 
  
@@ -1548,6 +1531,8 @@
 	dev->priv = (void *) scc;
 	dev->init = scc_net_init;
 
+	spin_lock_init(&scc->lock);
+	
 	if ((addev? register_netdevice(dev) : register_netdev(dev)) != 0) {
 		kfree(dev);
                 return -EIO;
@@ -1625,17 +1610,14 @@
 
 	netif_stop_queue(dev);
 
-	save_flags(flags); 
-	cli();
-	
+	spin_lock_irqsave(&scc->lock, flags);	
 	Outb(scc->ctrl,0);		/* Make sure pointer is written */
 	wr(scc,R1,0);			/* disable interrupts */
 	wr(scc,R3,0);
+	spin_unlock_irqrestore(&scc->lock, flags);
 
-	del_timer(&scc->tx_t);
-	del_timer(&scc->tx_wdog);
-
-	restore_flags(flags);
+	del_timer_sync(&scc->tx_t);
+	del_timer_sync(&scc->tx_wdog);
 	
 	scc_discard_buffers(scc);
 
@@ -1689,9 +1671,8 @@
 		return 0;
 	}
 
-	save_flags(flags);
-	cli();
-	
+	spin_lock_irqsave(&scc->lock, flags);
+		
 	if (skb_queue_len(&scc->tx_queue) > scc->dev->tx_queue_len) {
 		struct sk_buff *skb_del;
 		skb_del = skb_dequeue(&scc->tx_queue);
@@ -1710,12 +1691,11 @@
 	if(scc->stat.tx_state == TXS_IDLE || scc->stat.tx_state == TXS_IDLE2) {
 		scc->stat.tx_state = TXS_BUSY;
 		if (scc->kiss.fulldup == KISS_DUPLEX_HALF)
-			scc_start_tx_timer(scc, t_dwait, scc->kiss.waittime);
+			__scc_start_tx_timer(scc, t_dwait, scc->kiss.waittime);
 		else
-			scc_start_tx_timer(scc, t_dwait, 0);
+			__scc_start_tx_timer(scc, t_dwait, 0);
 	}
-
-	restore_flags(flags);	
+	spin_unlock_irqrestore(&scc->lock, flags);
 	return 0;
 }
 
@@ -1785,19 +1765,23 @@
 				hwcfg.clock = SCC_DEFAULT_CLOCK;
 
 #ifndef SCC_DONT_CHECK
-			disable_irq(hwcfg.irq);
-
-			check_region(scc->ctrl, 1);
-			Outb(hwcfg.ctrl_a, 0);
-			OutReg(hwcfg.ctrl_a, R9, FHWRES);
-			udelay(100);
-			OutReg(hwcfg.ctrl_a,R13,0x55);		/* is this chip really there? */
-			udelay(5);
 
-			if (InReg(hwcfg.ctrl_a,R13) != 0x55)
+			if(request_region(scc->ctrl, 1, "scc-probe"))
+			{
+				disable_irq(hwcfg.irq);
+				Outb(hwcfg.ctrl_a, 0);
+				OutReg(hwcfg.ctrl_a, R9, FHWRES);
+				udelay(100);
+				OutReg(hwcfg.ctrl_a,R13,0x55);		/* is this chip really there? */
+				udelay(5);
+
+				if (InReg(hwcfg.ctrl_a,R13) != 0x55)
+					found = 0;
+				enable_irq(hwcfg.irq);
+				release_region(scc->ctrl, 1);
+			}
+			else
 				found = 0;
-
-			enable_irq(hwcfg.irq);
 #endif
 
 			if (found)
@@ -2111,6 +2095,8 @@
 	
 	printk(banner);
 	
+	spin_lock_init(&iolock);
+	
 	sprintf(devname,"%s0", SCC_DriverName);
 	
 	result = scc_net_setup(SCC_Info, devname, 0);
@@ -2127,20 +2113,19 @@
 
 static void __exit scc_cleanup_driver(void)
 {
-	unsigned long flags;
 	io_port ctrl;
 	int k;
 	struct scc_channel *scc;
 	
-	save_flags(flags); 
-	cli();
-
 	if (Nchips == 0)
 	{
 		unregister_netdev(SCC_Info[0].dev);
 		kfree(SCC_Info[0].dev);
 	}
 
+	/* Guard against chip prattle */
+	local_irq_disable();
+	
 	for (k = 0; k < Nchips; k++)
 		if ( (ctrl = SCC_ctrl[k].chan_A) )
 		{
@@ -2149,6 +2134,13 @@
 			udelay(50);
 		}
 		
+	/* To unload the port must be closed so no real IRQ pending */
+	for (k=0; k < NR_IRQS ; k++)
+		if (Ivec[k].used) free_irq(k, NULL);
+		
+	local_irq_enable();
+		
+	/* Now clean up */
 	for (k = 0; k < Nchips*2; k++)
 	{
 		scc = &SCC_Info[k];
@@ -2164,13 +2156,9 @@
 		}
 	}
 	
-	for (k=0; k < NR_IRQS ; k++)
-		if (Ivec[k].used) free_irq(k, NULL);
 		
 	if (Vector_Latch)
 		release_region(Vector_Latch, 1);
-
-	restore_flags(flags);
 
 	proc_net_remove("z8530drv");
 }
diff -Nru a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c
--- a/drivers/net/hamradio/yam.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/net/hamradio/yam.c	Sat Apr 19 19:51:49 2003
@@ -722,7 +722,6 @@
 	int counter = 100;
 	int i;
 
-	sti();
 
 	for (i = 0; i < NR_PORTS; i++) {
 		yp = &yam_ports[i];
@@ -768,7 +767,6 @@
 	off_t pos = 0;
 	off_t begin = 0;
 
-	cli();
 
 	for (i = 0; i < NR_PORTS; i++) {
 		if (yam_ports[i].iobase == 0 || yam_ports[i].irq == 0)
@@ -802,8 +800,6 @@
 		if (pos > offset + length)
 			break;
 	}
-
-	sti();
 
 	*start = buffer + (offset - begin);
 	len -= (offset - begin);
diff -Nru a/drivers/net/irda/ali-ircc.c b/drivers/net/irda/ali-ircc.c
--- a/drivers/net/irda/ali-ircc.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/net/irda/ali-ircc.c	Sat Apr 19 19:51:46 2003
@@ -854,7 +854,7 @@
 		async_unwrap_char(self->netdev, &self->stats, &self->rx_buff, 
 				  inb(iobase+UART_RX));
 
-		/* Make sure we don't stay here to long */
+		/* Make sure we don't stay here too long */
 		if (boguscount++ > 32) {
 			IRDA_DEBUG(2,"%s(), breaking!\n", __FUNCTION__);
 			break;
diff -Nru a/drivers/net/irda/irport.c b/drivers/net/irda/irport.c
--- a/drivers/net/irda/irport.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/net/irda/irport.c	Sat Apr 19 19:51:49 2003
@@ -707,7 +707,7 @@
 		async_unwrap_char(self->netdev, &self->stats, &self->rx_buff, 
 				  inb(iobase+UART_RX));
 
-		/* Make sure we don't stay here to long */
+		/* Make sure we don't stay here too long */
 		if (boguscount++ > 32) {
 			IRDA_DEBUG(2,"%s(), breaking!\n", __FUNCTION__);
 			break;
@@ -764,7 +764,7 @@
 			break;
 		} 
 		
-		/* Make sure we don't stay here to long */
+		/* Make sure we don't stay here too long */
 		if (boguscount++ > 100)
 			break;
 
diff -Nru a/drivers/net/irda/irtty-sir.c b/drivers/net/irda/irtty-sir.c
--- a/drivers/net/irda/irtty-sir.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/net/irda/irtty-sir.c	Sat Apr 19 19:51:27 2003
@@ -180,32 +180,29 @@
 static int irtty_set_dtr_rts(struct sir_dev *dev, int dtr, int rts)
 {
 	struct sirtty_cb *priv = dev->priv;
-	int arg = 0;
+	int set = 0;
+	int clear = 0;
 
 	ASSERT(priv != NULL, return -1;);
 	ASSERT(priv->magic == IRTTY_MAGIC, return -1;);
 
-#ifdef TIOCM_OUT2 /* Not defined for ARM */
-	arg = TIOCM_OUT2;
-#endif
 	if (rts)
-		arg |= TIOCM_RTS;
+		set |= TIOCM_RTS;
+	else
+		clear |= TIOCM_RTS;
 	if (dtr)
-		arg |= TIOCM_DTR;
+		set |= TIOCM_DTR;
+	else
+		clear |= TIOCM_DTR;
 
 	/*
-	 * The ioctl() function, or actually set_modem_info() in serial.c
-	 * expects a pointer to the argument in user space. This is working
-	 * here because we are always called from the kIrDAd thread which
-	 * has set_fs(KERNEL_DS) permanently set. Therefore copy_from_user()
-	 * is happy with our arg-parameter being local here in kernel space.
+	 * We can't use ioctl() because it expects a non-null file structure,
+	 * and we don't have that here.
+	 * This function is not yet defined for all tty driver, so
+	 * let's be careful... Jean II
 	 */
-
-	lock_kernel();
-	if (priv->tty->driver.ioctl(priv->tty, NULL, TIOCMSET, (unsigned long) &arg)) { 
-		IRDA_DEBUG(2, "%s(), error doing ioctl!\n", __FUNCTION__);
-	}
-	unlock_kernel();
+	ASSERT(priv->tty->driver.tiocmset != NULL, return -1;);
+	priv->tty->driver.tiocmset(priv->tty, NULL, set, clear);
 
 	return 0;
 }
diff -Nru a/drivers/net/lp486e.c b/drivers/net/lp486e.c
--- a/drivers/net/lp486e.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/net/lp486e.c	Sat Apr 19 19:51:29 2003
@@ -56,7 +56,7 @@
 All other communication is through memory!
 */
 
-#define SLOW_DOWN_IO udelay(5);
+#define SLOW_DOWN_IO udelay(5)
 
 #include <linux/module.h>
 #include <linux/init.h>
@@ -195,7 +195,7 @@
 typedef u32 phys_addr;
 
 static inline phys_addr
-va_to_pa(volatile void *x) {
+va_to_pa(void *x) {
 	return x ? virt_to_bus(x) : I596_NULL;
 }
 
@@ -341,14 +341,15 @@
 	unsigned long tdr_stat;	/* directly follows tdr */
 
 	int last_restart;
-	volatile struct i596_rbd *rbd_list;
-	volatile struct i596_rbd *rbd_tail;
-	volatile struct i596_rfd *rx_tail;
-	volatile struct i596_cmd *cmd_tail;
-	volatile struct i596_cmd *cmd_head;
+	struct i596_rbd *rbd_list;
+	struct i596_rbd *rbd_tail;
+	struct i596_rfd *rx_tail;
+	struct i596_cmd *cmd_tail;
+	struct i596_cmd *cmd_head;
 	int cmd_backlog;
 	unsigned long last_cmd;
 	struct net_device_stats stats;
+	spinlock_t cmd_lock;
 };
 
 static char init_setup[14] = {
@@ -386,7 +387,7 @@
 
 static int
 i596_timeout(struct net_device *dev, char *msg, int ct) {
-	volatile struct i596_private *lp;
+	struct i596_private *lp;
 	int boguscnt = ct;
 
 	lp = (struct i596_private *) dev->priv;
@@ -398,13 +399,14 @@
 			return 1;
 		}
 		udelay(5);
+		barrier();
 	}
 	return 0;
 }
 
 static inline int
 init_rx_bufs(struct net_device *dev, int num) {
-	volatile struct i596_private *lp;
+	struct i596_private *lp;
 	struct i596_rfd *rfd;
 	int i;
 	// struct i596_rbd *rbd;
@@ -517,8 +519,8 @@
 /* selftest or dump */
 static void
 i596_port_do(struct net_device *dev, int portcmd, char *cmdname) {
-	volatile struct i596_private *lp = dev->priv;
-	volatile u16 *outp;
+	struct i596_private *lp = dev->priv;
+	u16 *outp;
 	int i, m;
 
 	memset((void *)&(lp->dump), 0, sizeof(struct i596_dump));
@@ -541,7 +543,7 @@
 
 static int
 i596_scp_setup(struct net_device *dev) {
-	volatile struct i596_private *lp = dev->priv;
+	struct i596_private *lp = dev->priv;
 	int boguscnt;
 
 	/* Setup SCP, ISCP, SCB */
@@ -608,6 +610,7 @@
 			return 1;
 		}
 		udelay(5);
+		barrier();
 	}
 	/* I find here boguscnt==100, so no delay was required. */
 
@@ -616,7 +619,7 @@
 
 static int
 init_i596(struct net_device *dev) {
-	volatile struct i596_private *lp;
+	struct i596_private *lp;
 
 	if (i596_scp_setup(dev))
 		return 1;
@@ -641,6 +644,8 @@
 	lp->scb.command = RX_START;
 	CA();
 
+	barrier();
+	
 	if (lp->scb.command && i596_timeout(dev, "Receive Unit start", 100))
 		return 1;
 
@@ -649,7 +654,7 @@
 
 /* Receive a single frame */
 static inline int
-i596_rx_one(struct net_device *dev, volatile struct i596_private *lp,
+i596_rx_one(struct net_device *dev, struct i596_private *lp,
 	    struct i596_rfd *rfd, int *frames) {
 
 	if (rfd->stat & RFD_STAT_OK) {
@@ -703,14 +708,14 @@
 
 static int
 i596_rx(struct net_device *dev) {
-	volatile struct i596_private *lp = (struct i596_private *) dev->priv;
+	struct i596_private *lp = (struct i596_private *) dev->priv;
 	struct i596_rfd *rfd;
 	int frames = 0;
 
 	while (1) {
 		rfd = pa_to_va(lp->scb.pa_rfd);
 		if (!rfd) {
-			printk("i596_rx: NULL rfd?\n");
+			printk(KERN_ERR "i596_rx: NULL rfd?\n");
 			return 0;
 		}
 #if 1
@@ -725,6 +730,7 @@
 		lp->rx_tail->cmd = 0;
 		lp->rx_tail = rfd;
 		lp->scb.pa_rfd = rfd->pa_next;
+		barrier();
 	}
 
 	return frames;
@@ -732,7 +738,7 @@
 
 static void
 i596_cleanup_cmd(struct net_device *dev) {
-	volatile struct i596_private *lp;
+	struct i596_private *lp;
 	struct i596_cmd *cmd;
 
 	lp = (struct i596_private *) dev->priv;
@@ -770,6 +776,7 @@
 				break;
 			}
 		}
+		barrier();
 	}
 
 	if (lp->scb.command && i596_timeout(dev, "i596_cleanup_cmd", 100))
@@ -778,9 +785,7 @@
 	lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
 }
 
-static inline void
-i596_reset(struct net_device *dev,
-	   volatile struct i596_private *lp, int ioaddr) {
+static void i596_reset(struct net_device *dev, struct i596_private *lp, int ioaddr) {
 
 	if (lp->scb.command && i596_timeout(dev, "i596_reset", 100))
 		;
@@ -789,7 +794,8 @@
 
 	lp->scb.command = CUC_ABORT | RX_ABORT;
 	CA();
-
+	barrier();
+	
 	/* wait for shutdown */
 	if (lp->scb.command && i596_timeout(dev, "i596_reset(2)", 400))
 		;
@@ -803,7 +809,7 @@
 }
 
 static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd) {
-	volatile struct i596_private *lp = dev->priv;
+	struct i596_private *lp = dev->priv;
 	int ioaddr = dev->base_addr;
 	unsigned long flags;
 
@@ -811,8 +817,8 @@
 	cmd->command |= (CMD_EOL | CMD_INTR);
 	cmd->pa_next = I596_NULL;
 
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&lp->cmd_lock, flags);
+	
 	if (lp->cmd_head) {
 		lp->cmd_tail->pa_next = va_to_pa(cmd);
 	} else {
@@ -827,64 +833,45 @@
 	lp->cmd_backlog++;
 
 	lp->cmd_head = pa_to_va(lp->scb.pa_cmd);
-	restore_flags(flags);
+	spin_unlock_irqrestore(&lp->cmd_lock, flags);
 
 	if (lp->cmd_backlog > 16) {
 		int tickssofar = jiffies - lp->last_cmd;
-		if (tickssofar < 25) return;
+		if (tickssofar < HZ/4)
+			return;
 
-		printk("%s: command unit timed out, status resetting.\n",
-		       dev->name);
+		printk(KERN_WARNING "%s: command unit timed out, status resetting.\n", dev->name);
 		i596_reset(dev, lp, ioaddr);
 	}
 }
 
-static int
-i596_open(struct net_device *dev) {
+static int i596_open(struct net_device *dev) 
+{
 	int i;
 
 	i = request_irq(dev->irq, &i596_interrupt, SA_SHIRQ, dev->name, dev);
 	if (i) {
-		printk("%s: IRQ %d not free\n", dev->name, dev->irq);
+		printk(KERN_ERR "%s: IRQ %d not free\n", dev->name, dev->irq);
 		return i;
 	}
 
 	if ((i = init_rx_bufs(dev, RX_RING_SIZE)) < RX_RING_SIZE)
-		printk("%s: only able to allocate %d receive buffers\n",
-		       dev->name, i);
+		printk(KERN_ERR "%s: only able to allocate %d receive buffers\n", dev->name, i);
 
 	if (i < 4) {
-// release buffers
 		free_irq(dev->irq, dev);
 		return -EAGAIN;
 	}
-
 	netif_start_queue(dev);
-
 	init_i596(dev);
-
 	return 0;			/* Always succeed */
 }
 
-static int
-i596_start_xmit (struct sk_buff *skb, struct net_device *dev) {
-	volatile struct i596_private *lp = dev->priv;
+static int i596_start_xmit (struct sk_buff *skb, struct net_device *dev) {
+	struct i596_private *lp = dev->priv;
 	struct tx_cmd *tx_cmd;
 	short length;
 
-	/* If some higher level thinks we've missed a tx-done interrupt
-	   we are passed NULL. n.b. dev_tint handles the cli()/sti()
-	   itself. */
-	if (skb == NULL) {
-		printk ("What about dev_tint\n");
-		/* dev_tint(dev); */
-		return 0;
-	}
-
-	/* shouldn't happen */
-	if (skb->len <= 0)
-		return 0;
-
 	length = skb->len;
 	
 	if (length < ETH_ZLEN) {
@@ -896,14 +883,10 @@
 	
 	dev->trans_start = jiffies;
 
-	tx_cmd = (struct tx_cmd *)
-	    kmalloc ((sizeof (struct tx_cmd)
-		      + sizeof (struct i596_tbd)), GFP_ATOMIC);
+	tx_cmd = (struct tx_cmd *) kmalloc ((sizeof (struct tx_cmd) + sizeof (struct i596_tbd)), GFP_ATOMIC);
 	if (tx_cmd == NULL) {
-		printk ("%s: i596_xmit Memory squeeze, dropping packet.\n",
-			dev->name);
+		printk(KERN_WARNING "%s: i596_xmit Memory squeeze, dropping packet.\n", dev->name);
 		lp->stats.tx_dropped++;
-
 		dev_kfree_skb (skb);
 	} else {
 		struct i596_tbd *tx_cmd_tbd;
@@ -934,11 +917,11 @@
 
 static void
 i596_tx_timeout (struct net_device *dev) {
-	volatile struct i596_private *lp = dev->priv;
+	struct i596_private *lp = dev->priv;
 	int ioaddr = dev->base_addr;
 
 	/* Transmitter timeout, serious problems. */
-	printk ("%s: transmit timed out, status resetting.\n", dev->name);
+	printk(KERN_WARNING "%s: transmit timed out, status resetting.\n", dev->name);
 	lp->stats.tx_errors++;
 
 	/* Try to restart the adaptor */
@@ -957,8 +940,8 @@
 	netif_wake_queue(dev);
 }
 
-static void
-print_eth(char *add) {
+static void print_eth(char *add) 
+{
 	int i;
 
 	printk ("Dest  ");
@@ -975,9 +958,8 @@
 		(unsigned char) add[12], (unsigned char) add[13]);
 }
 
-int __init
-lp486e_probe(struct net_device *dev) {
-	volatile struct i596_private *lp;
+int __init lp486e_probe(struct net_device *dev) {
+	struct i596_private *lp;
 	unsigned char eth_addr[6] = { 0, 0xaa, 0, 0, 0, 0 };
 	unsigned char *bios;
 	int i, j;
@@ -996,14 +978,14 @@
 	/*
 	 * Allocate working memory, 16-byte aligned
 	 */
-	dev->mem_start = (unsigned long)
-		kmalloc(sizeof(struct i596_private) + 0x0f, GFP_KERNEL);
+	dev->mem_start = (unsigned long) kmalloc(sizeof(struct i596_private) + 0x0f, GFP_KERNEL);
 	if (!dev->mem_start)
 		goto err_out;
 	dev->priv = (void *)((dev->mem_start + 0xf) & 0xfffffff0);
 	lp = (struct i596_private *) dev->priv;
 	memset((void *)lp, 0, sizeof(struct i596_private));
-
+	spin_lock_init(&lp->cmd_lock);
+	
 	/*
 	 * Do we really have this thing?
 	 */
@@ -1071,14 +1053,16 @@
 
 static inline void
 i596_handle_CU_completion(struct net_device *dev,
-			  volatile struct i596_private *lp,
+			  struct i596_private *lp,
 			  unsigned short status,
 			  unsigned short *ack_cmdp) {
-	volatile struct i596_cmd *cmd;
+	struct i596_cmd *cmd;
 	int frames_out = 0;
 	int commands_done = 0;
 	int cmd_val;
+	unsigned long flags;
 
+	spin_lock_irqsave(&lp->cmd_lock, flags);
 	cmd = lp->cmd_head;
 
 	while (lp->cmd_head && (lp->cmd_head->status & CMD_STAT_C)) {
@@ -1160,31 +1144,29 @@
 			lp->last_cmd = jiffies;
 			
 		}
+		barrier();
 	}
 
 	cmd = lp->cmd_head;
 	while (cmd && (cmd != lp->cmd_tail)) {
 		cmd->command &= 0x1fff;
 		cmd = pa_to_va(cmd->pa_next);
+		barrier();
 	}
 
 	if (lp->cmd_head)
 		*ack_cmdp |= CUC_START;
 	lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
+	spin_unlock_irqrestore(&lp->cmd_lock, flags);
 }
 
 static void
 i596_interrupt (int irq, void *dev_instance, struct pt_regs *regs) {
 	struct net_device *dev = (struct net_device *) dev_instance;
-	volatile struct i596_private *lp;
+	struct i596_private *lp;
 	unsigned short status, ack_cmd = 0;
 	int frames_in = 0;
 
-	if (dev == NULL) {
-		printk ("i596_interrupt(): irq %d for unknown device.\n", irq);
-		return;
-	}
-
 	lp = (struct i596_private *) dev->priv;
 
 	/*
@@ -1251,7 +1233,7 @@
 }
 
 static int i596_close(struct net_device *dev) {
-	volatile struct i596_private *lp = dev->priv;
+	struct i596_private *lp = dev->priv;
 
 	netif_stop_queue(dev);
 
@@ -1284,7 +1266,7 @@
 */
 
 static void set_multicast_list(struct net_device *dev) {
-	volatile struct i596_private *lp = dev->priv;
+	struct i596_private *lp = dev->priv;
 	struct i596_cmd *cmd;
 
 	if (i596_debug > 1)
@@ -1294,12 +1276,9 @@
 	if (dev->mc_count > 0) {
 		struct dev_mc_list *dmi;
 		char *cp;
-		cmd = (struct i596_cmd *)
-			kmalloc(sizeof(struct i596_cmd)+2+dev->mc_count*6,
-				GFP_ATOMIC);
+		cmd = (struct i596_cmd *)kmalloc(sizeof(struct i596_cmd)+2+dev->mc_count*6, GFP_ATOMIC);
 		if (cmd == NULL) {
-			printk ("%s: set_multicast Memory squeeze.\n",
-				dev->name);
+			printk (KERN_ERR "%s: set_multicast Memory squeeze.\n", dev->name);
 			return;
 		}
 		cmd->command = CmdMulticastList;
@@ -1316,8 +1295,7 @@
 		if (lp->set_conf.pa_next != I596_NULL) {
 			return;
 		}
-		if (dev->mc_count == 0 &&
-		    !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
+		if (dev->mc_count == 0 && !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
 			if (dev->flags & IFF_ALLMULTI)
 				dev->flags |= IFF_PROMISC;
 			lp->i596_config[8] &= ~0x01;
diff -Nru a/drivers/net/macmace.c b/drivers/net/macmace.c
--- a/drivers/net/macmace.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/net/macmace.c	Sat Apr 19 19:51:46 2003
@@ -319,8 +319,8 @@
 
 	/* Allocate the DMA ring buffers */
 
-	mp->rx_ring = (void *) __get_free_pages(GFP_DMA, N_RX_PAGES);
-	mp->tx_ring = (void *) __get_free_pages(GFP_DMA, 0);
+	mp->rx_ring = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, N_RX_PAGES);
+	mp->tx_ring = (void *) __get_free_pages(GFP_KERNEL | GFP_DMA, 0);
 	
 	if (mp->tx_ring==NULL || mp->rx_ring==NULL) {
 		if (mp->rx_ring) free_pages((u32) mp->rx_ring, N_RX_PAGES);
diff -Nru a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c
--- a/drivers/net/pcmcia/3c574_cs.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/net/pcmcia/3c574_cs.c	Sat Apr 19 19:51:29 2003
@@ -3,6 +3,7 @@
 	Written 1993-1998 by
 	Donald Becker, becker@scyld.com, (driver core) and
 	David Hinds, dahinds@users.sourceforge.net (from his PC card code).
+	Locking fixes (C) Copyright 2003 Red Hat Inc
 
 	This software may be used and distributed according to the terms of
 	the GNU General Public License, incorporated herein by reference.
@@ -11,6 +12,7 @@
 	following copyright:
 	Copyright 1993 United States Government as represented by the
 	Director, National Security Agency.
+	
 
 */
 
@@ -125,7 +127,7 @@
 INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
 static char *version =
-"3c574_cs.c 1.65 2001/10/13 00:08:50 Donald Becker/David Hinds, becker@scyld.com.\n";
+"3c574_cs.c 1.65ac1 2003/04/07 Donald Becker/David Hinds, becker@scyld.com.\n";
 #else
 #define DEBUG(n, args...)
 #endif
@@ -212,15 +214,15 @@
 	struct net_device dev;
 	dev_node_t node;
 	struct net_device_stats stats;
-	u16 advertising, partner;			/* NWay media advertisement */
-	unsigned char phys;					/* MII device address */
-	unsigned int
-	  autoselect:1, default_media:3;	/* Read from the EEPROM/Wn3_Config. */
+	u16 advertising, partner;		/* NWay media advertisement */
+	unsigned char phys;			/* MII device address */
+	unsigned int autoselect:1, default_media:3;	/* Read from the EEPROM/Wn3_Config. */
 	/* for transceiver monitoring */
 	struct timer_list media;
-	u_short media_status;
-	u_short fast_poll;
-	u_long last_irq;
+	unsigned short media_status;
+	unsigned short fast_poll;
+	unsigned long last_irq;
+	spinlock_t window_lock;			/* Guards the Window selection */
 };
 
 /* Set iff a MII transceiver on any interface requires mdio preamble.
@@ -231,18 +233,18 @@
 /* Index of functions. */
 
 static void tc574_config(dev_link_t *link);
-static void tc574_release(u_long arg);
+static void tc574_release(unsigned long arg);
 static int tc574_event(event_t event, int priority,
 					   event_callback_args_t *args);
 
 static void mdio_sync(ioaddr_t ioaddr, int bits);
 static int mdio_read(ioaddr_t ioaddr, int phy_id, int location);
 static void mdio_write(ioaddr_t ioaddr, int phy_id, int location, int value);
-static u_short read_eeprom(ioaddr_t ioaddr, int index);
+static unsigned short read_eeprom(ioaddr_t ioaddr, int index);
 static void tc574_wait_for_completion(struct net_device *dev, int cmd);
 
 static void tc574_reset(struct net_device *dev);
-static void media_check(u_long arg);
+static void media_check(unsigned long arg);
 static int el3_open(struct net_device *dev);
 static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev);
 static void el3_interrupt(int irq, void *dev_id, struct pt_regs *regs);
@@ -266,15 +268,15 @@
 	dev_link_t *link, *next;
 	for (link = dev_list; link; link = next) {
 		next = link->next;
-	    if (link->state & DEV_STALE_LINK)
+		if (link->state & DEV_STALE_LINK)
 			tc574_detach(link);
-    }
+	}
 }
 
 static void cs_error(client_handle_t handle, int func, int ret)
 {
 #if CS_RELEASE_CODE < 0x2911
-    CardServices(ReportError, dev_info, (void *)func, (void *)ret);
+	CardServices(ReportError, dev_info, (void *)func, (void *)ret);
 #else
 	error_info_t err = { func, ret };
 	CardServices(ReportError, handle, &err);
@@ -300,14 +302,16 @@
 
 	/* Create the PC card device object. */
 	lp = kmalloc(sizeof(*lp), GFP_KERNEL);
-	if (!lp) return NULL;
+	if (!lp)
+		return NULL;
+		
 	memset(lp, 0, sizeof(*lp));
 	link = &lp->link; dev = &lp->dev;
 	link->priv = dev->priv = link->irq.Instance = lp;
 	
 	init_timer(&link->release);
 	link->release.function = &tc574_release;
-	link->release.data = (u_long)link;
+	link->release.data = (unsigned long)link;
 	link->io.NumPorts1 = 32;
 	link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
 	link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
@@ -381,9 +385,9 @@
 	if (*linkp == NULL)
 	return;
 
-	del_timer(&link->release);
+	del_timer_sync(&link->release);
 	if (link->state & DEV_CONFIG) {
-		tc574_release((u_long)link);
+		tc574_release((unsigned long)link);
 		if (link->state & DEV_STALE_CONFIG) {
 			link->state |= DEV_STALE_LINK;
 			return;
@@ -417,7 +421,7 @@
 	struct net_device *dev = &lp->dev;
 	tuple_t tuple;
 	cisparse_t parse;
-	u_short buf[32];
+	unsigned short buf[32];
 	int last_fn, last_ret, i, j;
 	ioaddr_t ioaddr;
 	u16 *phys_addr;
@@ -562,7 +566,7 @@
 cs_failed:
 	cs_error(link->handle, last_fn, last_ret);
 failed:
-	tc574_release((u_long)link);
+	tc574_release((unsigned long)link);
 	return;
 
 } /* tc574_config */
@@ -573,7 +577,7 @@
 	still open, this will be postponed until it is closed.
 */
 
-static void tc574_release(u_long arg)
+static void tc574_release(unsigned long arg)
 {
 	dev_link_t *link = (dev_link_t *)arg;
 
@@ -652,12 +656,12 @@
 {
 	ioaddr_t ioaddr = dev->base_addr;
 	EL3WINDOW(1);
-    printk(KERN_INFO "  irq status %04x, rx status %04x, tx status "
+	printk(KERN_INFO "  irq status %04x, rx status %04x, tx status "
 		   "%02x, tx free %04x\n", inw(ioaddr+EL3_STATUS),
 		   inw(ioaddr+RxStatus), inb(ioaddr+TxStatus),
 		   inw(ioaddr+TxFree));
 	EL3WINDOW(4);
-    printk(KERN_INFO "  diagnostics: fifo %04x net %04x ethernet %04x"
+	printk(KERN_INFO "  diagnostics: fifo %04x net %04x ethernet %04x"
 		   " media %04x\n", inw(ioaddr+0x04), inw(ioaddr+0x06),
 		   inw(ioaddr+0x08), inw(ioaddr+0x0a));
 	EL3WINDOW(1);
@@ -668,19 +672,18 @@
 */
 static void tc574_wait_for_completion(struct net_device *dev, int cmd)
 {
-    int i = 1500;
-    outw(cmd, dev->base_addr + EL3_CMD);
-    while (--i > 0)
+	int i = 1500;
+	outw(cmd, dev->base_addr + EL3_CMD);
+	while (--i > 0)
 		if (!(inw(dev->base_addr + EL3_STATUS) & 0x1000)) break;
-    if (i == 0)
-		printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n",
-			   dev->name, cmd);
+	if (i == 0)
+		printk(KERN_NOTICE "%s: command 0x%04x did not complete!\n", dev->name, cmd);
 }
 
 /* Read a word from the EEPROM using the regular EEPROM access register.
    Assume that we are in register window zero.
  */
-static u_short read_eeprom(ioaddr_t ioaddr, int index)
+static unsigned short read_eeprom(ioaddr_t ioaddr, int index)
 {
 	int timer;
 	outw(EEPROM_Read + index, ioaddr + Wn0EepromCmd);
@@ -773,9 +776,11 @@
 {
 	struct el3_private *lp = (struct el3_private *)dev->priv;
 	int i, ioaddr = dev->base_addr;
+	unsigned long flags;
 
 	tc574_wait_for_completion(dev, TotalReset|0x10);
 
+	spin_lock_irqsave(&lp->window_lock, flags);
 	/* Clear any transactions in progress. */
 	outw(0, ioaddr + RunnerWrCtrl);
 	outw(0, ioaddr + RunnerRdCtrl);
@@ -792,14 +797,18 @@
 	outb((dev->mtu > 1500 ? 0x40 : 0), ioaddr + Wn3_MAC_Ctrl);
 	outl((lp->autoselect ? 0x01000000 : 0) | 0x0062001b,
 		 ioaddr + Wn3_Config);
-	
 	/* Roadrunner only: Turn on the MII transceiver. */
 	outw(0x8040, ioaddr + Wn3_Options);
 	mdelay(1);
 	outw(0xc040, ioaddr + Wn3_Options);
+	EL3WINDOW(1);
+	spin_unlock_irqrestore(&lp->window_lock, flags);
+	
 	tc574_wait_for_completion(dev, TxReset);
 	tc574_wait_for_completion(dev, RxReset);
 	mdelay(1);
+	spin_lock_irqsave(&lp->window_lock, flags);
+	EL3WINDOW(3);
 	outw(0x8040, ioaddr + Wn3_Options);
 
 	/* Switch to the stats window, and clear all stats by reading. */
@@ -815,6 +824,10 @@
 
 	/* .. enable any extra statistics bits.. */
 	outw(0x0040, ioaddr + Wn4_NetDiag);
+	
+	EL3WINDOW(1);
+	spin_unlock_irqrestore(&lp->window_lock, flags);
+	
 	/* .. re-sync MII and re-fill what NWay is advertising. */
 	mdio_sync(ioaddr, 32);
 	mdio_write(ioaddr, lp->phys, 4, lp->advertising);
@@ -824,10 +837,10 @@
 		mdio_write(ioaddr, lp->phys, 16, i);
 	}
 
+	spin_lock_irqsave(&lp->window_lock, flags);
 	/* Switch to register set 1 for normal use, just for TxFree. */
-	EL3WINDOW(1);
-
 	set_rx_mode(dev);
+	spin_unlock_irqrestore(&lp->window_lock, flags);
 	outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
 	outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */
 	outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */
@@ -849,12 +862,11 @@
 		return -ENODEV;
 	
 	link->open++;
-	MOD_INC_USE_COUNT;
 	netif_start_queue(dev);
 	
 	tc574_reset(dev);
 	lp->media.function = &media_check;
-	lp->media.data = (u_long)lp;
+	lp->media.data = (unsigned long)lp;
 	lp->media.expires = jiffies + HZ;
 	add_timer(&lp->media);
 	
@@ -881,14 +893,15 @@
 
 static void pop_tx_status(struct net_device *dev)
 {
-    struct el3_private *lp = (struct el3_private *)dev->priv;
-    ioaddr_t ioaddr = dev->base_addr;
-    int i;
+	struct el3_private *lp = (struct el3_private *)dev->priv;
+	ioaddr_t ioaddr = dev->base_addr;
+	int i;
     
-    /* Clear the Tx status stack. */
-    for (i = 32; i > 0; i--) {
+	/* Clear the Tx status stack. */
+	for (i = 32; i > 0; i--) {
 		u_char tx_status = inb(ioaddr + TxStatus);
-		if (!(tx_status & 0x84)) break;
+		if (!(tx_status & 0x84))
+			break;
 		/* reset transmitter on jabber error or underrun */
 		if (tx_status & 0x30)
 			tc574_wait_for_completion(dev, TxReset);
@@ -899,17 +912,20 @@
 			lp->stats.tx_aborted_errors++;
 		}
 		outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
-    }
+	}
 }
 
 static int el3_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	ioaddr_t ioaddr = dev->base_addr;
+	struct el3_private *lp = (struct el3_private *)dev->priv;
+	unsigned long flags;
 
 	DEBUG(3, "%s: el3_start_xmit(length = %ld) called, "
 		  "status %4.4x.\n", dev->name, (long)skb->len,
 		  inw(ioaddr + EL3_STATUS));
 
+	spin_lock_irqsave(&lp->window_lock, flags);
 	outw(skb->len, ioaddr + TX_FIFO);
 	outw(0, ioaddr + TX_FIFO);
 	outsl(ioaddr + TX_FIFO, skb->data, (skb->len+3)>>2);
@@ -927,6 +943,8 @@
 	dev_kfree_skb (skb);
 	pop_tx_status(dev);
 
+	spin_unlock(&lp->window_lock);
+	
 	return 0;
 }
 
@@ -945,6 +963,8 @@
 	DEBUG(3, "%s: interrupt, status %4.4x.\n",
 		  dev->name, inw(ioaddr + EL3_STATUS));
 
+	spin_lock(&lp->window_lock);
+	
 	while ((status = inw(ioaddr + EL3_STATUS)) &
 		   (IntLatch | RxComplete | RxEarly | StatsFull)) {
 		if (!netif_device_present(dev) ||
@@ -1009,6 +1029,8 @@
 
 	DEBUG(3, "%s: exiting interrupt, status %4.4x.\n",
 		  dev->name, inw(ioaddr + EL3_STATUS));
+		  
+	spin_unlock(&lp->window_lock);
 	return;
 }
 
@@ -1017,41 +1039,38 @@
 	(and as a last resort, poll the NIC for events), and to monitor
 	the MII, reporting changes in cable status.
 */
-static void media_check(u_long arg)
+static void media_check(unsigned long arg)
 {
-    struct el3_private *lp = (struct el3_private *)arg;
-    struct net_device *dev = &lp->dev;
-    ioaddr_t ioaddr = dev->base_addr;
-    u_long flags;
-	u_short /* cable, */ media, partner;
+	struct el3_private *lp = (struct el3_private *)arg;
+	struct net_device *dev = &lp->dev;
+	ioaddr_t ioaddr = dev->base_addr;
+	unsigned long flags;
+	unsigned short /* cable, */ media, partner;
 
 	if (!netif_device_present(dev))
 		goto reschedule;
 	
-    /* Check for pending interrupt with expired latency timer: with
-       this, we can limp along even if the interrupt is blocked */
-    if ((inw(ioaddr + EL3_STATUS) & IntLatch) &&
-		(inb(ioaddr + Timer) == 0xff)) {
+	/* Check for pending interrupt with expired latency timer: with
+	   this, we can limp along even if the interrupt is blocked */
+	if ((inw(ioaddr + EL3_STATUS) & IntLatch) && (inb(ioaddr + Timer) == 0xff)) {
 		if (!lp->fast_poll)
 			printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
 		el3_interrupt(dev->irq, lp, NULL);
 		lp->fast_poll = HZ;
-    }
-    if (lp->fast_poll) {
+	}
+	if (lp->fast_poll) {
 		lp->fast_poll--;
 		lp->media.expires = jiffies + 2;
 		add_timer(&lp->media);
 		return;
-    }
+	}
 
-	save_flags(flags);
-	cli();
+	spin_lock_irqsave(&lp->window_lock, flags);
 	EL3WINDOW(4);
 	media = mdio_read(ioaddr, lp->phys, 1);
 	partner = mdio_read(ioaddr, lp->phys, 5);
 	EL3WINDOW(1);
-	restore_flags(flags);
-
+	
 	if (media != lp->media_status) {
 		if ((media ^ lp->media_status) & 0x0004)
 			printk(KERN_INFO "%s: %s link beat\n", dev->name,
@@ -1086,10 +1105,11 @@
 			printk(KERN_INFO "%s: jabber detected\n", dev->name);
 		lp->media_status = media;
 	}
+	spin_unlock_irqrestore(&lp->window_lock, flags);
 
 reschedule:
-    lp->media.expires = jiffies + HZ;
-    add_timer(&lp->media);
+	lp->media.expires = jiffies + HZ;
+	add_timer(&lp->media);
 }
 
 static struct net_device_stats *el3_get_stats(struct net_device *dev)
@@ -1109,37 +1129,41 @@
 {
 	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);
 
 	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);
-	lp->stats.tx_carrier_errors 	+= inb(ioaddr + 0);
-	lp->stats.tx_heartbeat_errors	+= inb(ioaddr + 1);
+	lp->stats.tx_carrier_errors 		+= inb(ioaddr + 0);
+	lp->stats.tx_heartbeat_errors		+= inb(ioaddr + 1);
 	/* Multiple collisions. */	   	inb(ioaddr + 2);
 	lp->stats.collisions			+= inb(ioaddr + 3);
 	lp->stats.tx_window_errors		+= inb(ioaddr + 4);
 	lp->stats.rx_fifo_errors		+= inb(ioaddr + 5);
 	lp->stats.tx_packets			+= inb(ioaddr + 6);
-	up		 						 = inb(ioaddr + 9);
+	up		 			 = inb(ioaddr + 9);
 	lp->stats.tx_packets			+= (up&0x30) << 4;
-	/* Rx packets   */				   inb(ioaddr + 7);
-	/* Tx deferrals */				   inb(ioaddr + 8);
-	rx		 						 = inw(ioaddr + 10);
-	tx								 = inw(ioaddr + 12);
+	/* Rx packets   */			   inb(ioaddr + 7);
+	/* Tx deferrals */			   inb(ioaddr + 8);
+	rx		 			 = inw(ioaddr + 10);
+	tx					 = inw(ioaddr + 12);
 
 	EL3WINDOW(4);
-	/* BadSSD */					   inb(ioaddr + 12);
-	up								 = inb(ioaddr + 13);
+	/* BadSSD */				   inb(ioaddr + 12);
+	up					 = inb(ioaddr + 13);
 
-	lp->stats.tx_bytes += tx + ((up & 0xf0) << 12);
+	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)
@@ -1150,7 +1174,7 @@
 	
 	DEBUG(3, "%s: in rx_packet(), status %4.4x, rx_status %4.4x.\n",
 		  dev->name, inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
-    while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
+	while (!((rx_status = inw(ioaddr + RxStatus)) & 0x8000) &&
 		   (--worklimit >= 0)) {
 		if (rx_status & 0x4000) { /* Error, update stats. */
 			short error = rx_status & 0x3800;
@@ -1225,7 +1249,7 @@
 		  dev->name, rq->ifr_ifrn.ifrn_name, cmd,
 		  data[0], data[1], data[2], data[3]);
 
-    switch(cmd) {
+	switch(cmd) {
 	case SIOCETHTOOL:
 		return netdev_ethtool_ioctl(dev, (void *)rq->ifr_data);
 	case SIOCDEVPRIVATE:		/* Get the address of the PHY in use. */
@@ -1233,15 +1257,14 @@
 	case SIOCDEVPRIVATE+1:		/* Read the specified MII register. */
 		{
 			int saved_window;
-                       unsigned long flags;
+			unsigned long flags;
 
-			save_flags(flags);
-			cli();
+			spin_lock_irqsave(&lp->window_lock, flags);
 			saved_window = inw(ioaddr + EL3_CMD) >> 13;
 			EL3WINDOW(4);
 			data[3] = mdio_read(ioaddr, data[0] & 0x1f, data[1] & 0x1f);
 			EL3WINDOW(saved_window);
-			restore_flags(flags);
+			spin_unlock_irqrestore(&lp->window_lock, flags);
 			return 0;
 		}
 	case SIOCDEVPRIVATE+2:		/* Write the specified MII register */
@@ -1251,13 +1274,12 @@
 
 			if (!capable(CAP_NET_ADMIN))
 				return -EPERM;
-			save_flags(flags);
-			cli();
+			spin_lock_irqsave(&lp->window_lock, flags);
 			saved_window = inw(ioaddr + EL3_CMD) >> 13;
 			EL3WINDOW(4);
 			mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]);
 			EL3WINDOW(saved_window);
-			restore_flags(flags);
+			spin_unlock_irqrestore(&lp->window_lock, flags);
 			return 0;
 		}
 	default:
@@ -1310,12 +1332,9 @@
 
 	link->open--;
 	netif_stop_queue(dev);
-	del_timer(&lp->media);
+	del_timer_sync(&lp->media);
 	if (link->state & DEV_STALE_CONFIG)
 		mod_timer(&link->release, jiffies + HZ/20);
-
-	MOD_DEC_USE_COUNT;
-
 	return 0;
 }
 
diff -Nru a/drivers/net/rcpci45.c b/drivers/net/rcpci45.c
--- a/drivers/net/rcpci45.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/net/rcpci45.c	Sat Apr 19 19:51:50 2003
@@ -76,10 +76,6 @@
 
 #define NEW_MULTICAST
 
-/* PCI/45 Configuration space values */
-#define RC_PCI45_VENDOR_ID  0x4916
-#define RC_PCI45_DEVICE_ID  0x1960
-
 #define MAX_ETHER_SIZE        1520
 #define MAX_NMBR_RCV_BUFFERS    96
 #define RC_POSTED_BUFFERS_LOW_MARK MAX_NMBR_RCV_BUFFERS-16
@@ -117,7 +113,7 @@
 static int RC_allocate_and_post_buffers (struct net_device *, int);
 
 static struct pci_device_id rcpci45_pci_table[] __devinitdata = {
-	{RC_PCI45_VENDOR_ID, RC_PCI45_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
+	{ PCI_VENDOR_ID_REDCREEK, PCI_DEVICE_ID_RC45, PCI_ANY_ID, PCI_ANY_ID,},
 	{}
 };
 MODULE_DEVICE_TABLE (pci, rcpci45_pci_table);
@@ -207,7 +203,7 @@
 	 * messages. Thus, we need contiguous physical pages of
 	 * memory.
 	 */
-	pDpa->msgbuf = kmalloc (MSG_BUF_SIZE, GFP_DMA|GFP_ATOMIC|GFP_KERNEL);
+	pDpa->msgbuf = kmalloc (MSG_BUF_SIZE, GFP_DMA | GFP_KERNEL);
 	if (!pDpa->msgbuf) {
 		printk (KERN_ERR "(rcpci45 driver:) \
 			Could not allocate %d byte memory for the \
@@ -1000,7 +996,7 @@
 	}
 
 	p = (PU32) kmalloc (sizeof (U32) + numBuffers * sizeof (singleB),
-			    GFP_DMA|GFP_ATOMIC|GFP_KERNEL);
+			    GFP_DMA | GFP_ATOMIC);
 
 	if (!p) {
 		printk (KERN_WARNING "%s unable to allocate TCB\n",
diff -Nru a/drivers/net/sk98lin/skvpd.c b/drivers/net/sk98lin/skvpd.c
--- a/drivers/net/sk98lin/skvpd.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/net/sk98lin/skvpd.c	Sat Apr 19 19:51:48 2003
@@ -1064,7 +1064,8 @@
 		len = VPD_MAX_LEN ;
 		rtv = 2 ;
 		SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR,
-			("keyword to long, cut after %d bytes\n",VPD_MAX_LEN)) ;
+			   ("keyword too long, cut after %d bytes\n",
+			    VPD_MAX_LEN));
 	}
 	if ((rtv2 = VpdSetupPara(pAC,key,buf,len,VPD_RW_KEY,OWR_KEY)) != 0) {
 		SK_DBG_MSG(pAC,SK_DBGMOD_VPD,SK_DBGCAT_ERR,
diff -Nru a/drivers/net/skfp/hwmtm.c b/drivers/net/skfp/hwmtm.c
--- a/drivers/net/skfp/hwmtm.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/net/skfp/hwmtm.c	Sat Apr 19 19:51:48 2003
@@ -1202,7 +1202,7 @@
 			goto abort_frame ;
 		}
 		if (len > FDDI_RAW_MTU-4) {
-			DB_RX("Frame to long error",0,0,2) ;
+			DB_RX("Frame too long error",0,0,2) ;
 			smc->hw.fp.err_stats.err_too_long++ ;
 			goto abort_frame ;
 		}
diff -Nru a/drivers/net/slip.c b/drivers/net/slip.c
--- a/drivers/net/slip.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/net/slip.c	Sat Apr 19 19:51:51 2003
@@ -836,8 +836,6 @@
 	if(!capable(CAP_NET_ADMIN))
 		return -EPERM;
 		
-	MOD_INC_USE_COUNT;
-
 	/* RTnetlink lock is misused here to serialize concurrent
 	   opens of slip channels. There are better ways, but it is
 	   the simplest one.
@@ -905,7 +903,6 @@
 	rtnl_unlock();
 
 	/* Count references from TTY module */
-	MOD_DEC_USE_COUNT;
 	return err;
 }
 
@@ -953,7 +950,6 @@
 #endif
 
 	/* Count references from TTY module */
-	MOD_DEC_USE_COUNT;
 }
 
  /************************************************************************
@@ -1122,8 +1118,7 @@
 #endif /* CONFIG_SLIP_MODE_SLIP6 */
 
 /* Perform I/O control on an active SLIP channel. */
-static int
-slip_ioctl(struct tty_struct *tty, void *file, int cmd, void *arg)
+static int slip_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
 {
 	struct slip *sl = (struct slip *) tty->disc_data;
 	unsigned int tmp;
@@ -1135,11 +1130,8 @@
 
 	switch(cmd) {
 	 case SIOCGIFNAME:
-		/* Please, do not put this line under copy_to_user,
-		   it breaks my old poor gcc on alpha --ANK
-		 */
 		tmp = strlen(sl->dev->name) + 1;
-		if (copy_to_user(arg, sl->dev->name, tmp))
+		if (copy_to_user((void *)arg, sl->dev->name, tmp))
 			return -EFAULT;
 		return 0;
 
@@ -1230,7 +1222,7 @@
 	/* Allow stty to read, but not set, the serial port */
 	case TCGETS:
 	case TCGETA:
-		return n_tty_ioctl(tty, (struct file *) file, cmd, (unsigned long) arg);
+		return n_tty_ioctl(tty, file, cmd, arg);
 
 	default:
 		return -ENOIOCTLCMD;
@@ -1349,34 +1341,28 @@
 	memset(slip_ctrls, 0, sizeof(void*)*slip_maxdev); /* Pointers */
 
 	/* Fill in our line protocol discipline, and register it */
-	memset(&sl_ldisc, 0, sizeof(sl_ldisc));
-	sl_ldisc.magic  = TTY_LDISC_MAGIC;
-	sl_ldisc.name   = "slip";
-	sl_ldisc.flags  = 0;
-	sl_ldisc.open   = slip_open;
-	sl_ldisc.close  = slip_close;
-	sl_ldisc.read   = NULL;
-	sl_ldisc.write  = NULL;
-	sl_ldisc.ioctl  = (int (*)(struct tty_struct *, struct file *,
-				   unsigned int, unsigned long)) slip_ioctl;
-	sl_ldisc.poll   = NULL;
-	sl_ldisc.receive_buf = slip_receive_buf;
-	sl_ldisc.receive_room = slip_receive_room;
-	sl_ldisc.write_wakeup = slip_write_wakeup;
 	if ((status = tty_register_ldisc(N_SLIP, &sl_ldisc)) != 0)  {
 		printk(KERN_ERR "SLIP: can't register line discipline (err = %d)\n", status);
 	}
-
-
 	return status;
 }
 
-
+static struct tty_ldisc	sl_ldisc =
+{
+	.owner 		=	THIS_MODULE,
+	.magic 		= 	TTY_LDISC_MAGIC,
+	.name 		= 	"slip",
+	.open 		= 	slip_open,
+	.close	 	= 	slip_close,
+	.ioctl		=	slip_ioctl,
+	.receive_buf	=	slip_receive_buf,
+	.receive_room	=	slip_receive_room,
+	.write_wakeup	=	slip_write_wakeup,
+};
 
 #ifdef MODULE
 
-int
-init_module(void)
+int init_module(void)
 {
 	return slip_init_ctrl_dev();
 }
diff -Nru a/drivers/net/sungem.c b/drivers/net/sungem.c
--- a/drivers/net/sungem.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/net/sungem.c	Sat Apr 19 19:51:50 2003
@@ -894,7 +894,7 @@
 		/* We must give this initial chunk to the device last.
 		 * Otherwise we could race with the device.
 		 */
-		first_len = skb->len - skb->data_len;
+		first_len = skb_headlen(skb);
 		first_mapping = pci_map_page(gp->pdev, virt_to_page(skb->data),
 					     ((unsigned long) skb->data & ~PAGE_MASK),
 					     first_len, PCI_DMA_TODEVICE);
diff -Nru a/drivers/net/sunhme.c b/drivers/net/sunhme.c
--- a/drivers/net/sunhme.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/net/sunhme.c	Sat Apr 19 19:51:46 2003
@@ -2319,7 +2319,7 @@
 		/* We must give this initial chunk to the device last.
 		 * Otherwise we could race with the device.
 		 */
-		first_len = skb->len - skb->data_len;
+		first_len = skb_headlen(skb);
 		first_mapping = hme_dma_map(hp, skb->data, first_len, DMA_TODEVICE);
 		entry = NEXT_TX(entry);
 
diff -Nru a/drivers/net/tg3.c b/drivers/net/tg3.c
--- a/drivers/net/tg3.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/net/tg3.c	Sat Apr 19 19:51:48 2003
@@ -1751,7 +1751,7 @@
 
 		pci_unmap_single(tp->pdev,
 				 pci_unmap_addr(ri, mapping),
-				 (skb->len - skb->data_len),
+				 skb_headlen(skb),
 				 PCI_DMA_TODEVICE);
 
 		ri->skb = NULL;
@@ -2316,7 +2316,7 @@
 		int len;
 
 		if (i == 0)
-			len = skb->len - skb->data_len;
+			len = skb_headlen(skb);
 		else
 			len = skb_shinfo(skb)->frags[i-1].size;
 		pci_unmap_single(tp->pdev,
@@ -2401,7 +2401,7 @@
 	int would_hit_hwbug;
 	unsigned long flags;
 
-	len = (skb->len - skb->data_len);
+	len = skb_headlen(skb);
 
 	/* No BH disabling for tx_lock here.  We are running in BH disabled
 	 * context and TX reclaim runs via tp->poll inside of a software
@@ -2520,7 +2520,7 @@
 		i = 0;
 		while (entry != last_plus_one) {
 			if (i == 0)
-				len = skb->len - skb->data_len;
+				len = skb_headlen(skb);
 			else
 				len = skb_shinfo(skb)->frags[i-1].size;
 
@@ -2593,7 +2593,7 @@
 	u32 len, entry, base_flags, mss;
 	unsigned long flags;
 
-	len = (skb->len - skb->data_len);
+	len = skb_headlen(skb);
 
 	/* No BH disabling for tx_lock here.  We are running in BH disabled
 	 * context and TX reclaim runs via tp->poll inside of a software
@@ -2829,7 +2829,7 @@
 
 		pci_unmap_single(tp->pdev,
 				 pci_unmap_addr(txp, mapping),
-				 (skb->len - skb->data_len),
+				 skb_headlen(skb),
 				 PCI_DMA_TODEVICE);
 		txp->skb = NULL;
 
diff -Nru a/drivers/net/tokenring/tms380tr.c b/drivers/net/tokenring/tms380tr.c
--- a/drivers/net/tokenring/tms380tr.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/net/tokenring/tms380tr.c	Sat Apr 19 19:51:48 2003
@@ -257,7 +257,7 @@
 	int err;
 	
 	/* init the spinlock */
-	spin_lock_init(tp->lock);
+	spin_lock_init(&tp->lock);
 
 	/* Reset the hardware here. Don't forget to set the station address. */
 
@@ -761,7 +761,7 @@
 	if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies)
 		&& (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy))
 	{
-		/* Anything to send, but stalled to long */
+		/* Anything to send, but stalled too long */
 		tp->LastSendTime = jiffies;
 		tms380tr_exec_cmd(dev, OC_CLOSE);	/* Does reopen automatically */
 	}
@@ -1458,7 +1458,7 @@
 	if(tms380tr_debug > 3)
 	{
 		printk(KERN_DEBUG "%s: buffer (real): %lx\n", dev->name, (long) &tp->scb);
-		printk(KERN_DEBUG "%s: buffer (virt): %lx\n", dev->name, (long) ((char *)&tp->scb - (char *)tp) + tp->dmabuffer);
+		printk(KERN_DEBUG "%s: buffer (virt): %lx\n", dev->name, (long) ((char *)&tp->scb - (char *)tp) + (long) tp->dmabuffer);
 		printk(KERN_DEBUG "%s: buffer (DMA) : %lx\n", dev->name, (long) tp->dmabuffer);
 		printk(KERN_DEBUG "%s: buffer (tp)  : %lx\n", dev->name, (long) tp);
 	}
diff -Nru a/drivers/net/tulip/tulip_core.c b/drivers/net/tulip/tulip_core.c
--- a/drivers/net/tulip/tulip_core.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/net/tulip/tulip_core.c	Sat Apr 19 19:51:48 2003
@@ -485,12 +485,9 @@
         struct tulip_private *tp = (struct tulip_private *)dev->priv;
 #endif
 	int retval;
-	MOD_INC_USE_COUNT;
 
-	if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev))) {
-		MOD_DEC_USE_COUNT;
+	if ((retval = request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev)))
 		return retval;
-	}
 
 	tulip_init_ring (dev);
 
@@ -823,8 +820,6 @@
 		tp->tx_buffers[i].mapping = 0;
 	}
 
-	MOD_DEC_USE_COUNT;
-
 	return 0;
 }
 
@@ -1361,6 +1356,7 @@
 		return -ENOMEM;
 	}
 
+	SET_MODULE_OWNER(dev);
 	if (pci_resource_len (pdev, 0) < tulip_tbl[chip_idx].io_size) {
 		printk (KERN_ERR PFX "%s: I/O region (0x%lx@0x%lx) too small, "
 			"aborting\n", pdev->slot_name,
diff -Nru a/drivers/net/tun.c b/drivers/net/tun.c
--- a/drivers/net/tun.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/net/tun.c	Sat Apr 19 19:51:47 2003
@@ -379,6 +379,7 @@
 		tun->owner = -1;
 		tun->dev.init = tun_net_init;
 		tun->dev.priv = tun;
+		tun->dev.owner = THIS_MODULE;
 
 		err = -EINVAL;
 
@@ -402,8 +403,6 @@
 		if ((err = register_netdevice(&tun->dev)))
 			goto failed;
 	
-		MOD_INC_USE_COUNT;
-
 		tun->name = tun->dev.name;
 	}
 
@@ -553,7 +552,6 @@
 		dev_close(&tun->dev);
 		unregister_netdevice(&tun->dev);
 		kfree(tun);
-		MOD_DEC_USE_COUNT;
 	}
 
 	rtnl_unlock();
diff -Nru a/drivers/net/typhoon.c b/drivers/net/typhoon.c
--- a/drivers/net/typhoon.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/net/typhoon.c	Sat Apr 19 19:51:49 2003
@@ -844,7 +844,7 @@
 	} else {
 		int i, len;
 
-		len = skb->len - skb->data_len;
+		len = skb_headlen(skb);
 		skb_dma = pci_map_single(tp->tx_pdev, skb->data, len,
 				         PCI_DMA_TODEVICE);
 		txd->flags = TYPHOON_FRAG_DESC | TYPHOON_DESC_VALID;
diff -Nru a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c
--- a/drivers/net/wan/cosa.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/net/wan/cosa.c	Sat Apr 19 19:51:28 2003
@@ -1057,7 +1057,8 @@
 		return -EPERM;
 	}
 
-	if (get_user(addr, &(d->addr)) ||
+	if (verify_area(VERIFY_READ, d, sizeof(*d)) ||
+	    __get_user(addr, &(d->addr)) ||
 	    __get_user(len, &(d->len)) ||
 	    __get_user(code, &(d->code)))
 		return -EFAULT;
@@ -1098,7 +1099,8 @@
 		return -EPERM;
 	}
 
-	if (get_user(addr, &(d->addr)) ||
+	if (verify_area(VERIFY_READ, d, sizeof(*d)) ||
+	    __get_user(addr, &(d->addr)) ||
 	    __get_user(len, &(d->len)) ||
 	    __get_user(code, &(d->code)))
 		return -EFAULT;
@@ -1106,7 +1108,7 @@
 	/* If something fails, force the user to reset the card */
 	cosa->firmware_status &= ~COSA_FW_RESET;
 
-	if ((i=readmem(cosa, d->code, len, addr)) < 0) {
+	if ((i=readmem(cosa, code, len, addr)) < 0) {
 		printk(KERN_NOTICE "cosa%d: reading memory failed: %d\n",
 			cosa->num, i);
 		return -EIO;
diff -Nru a/drivers/net/wan/pc300_tty.c b/drivers/net/wan/pc300_tty.c
--- a/drivers/net/wan/pc300_tty.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/net/wan/pc300_tty.c	Sat Apr 19 19:51:47 2003
@@ -215,6 +215,7 @@
 		/* initialize tty driver struct */
 		memset(&serial_drv,0,sizeof(struct tty_driver));
 		serial_drv.magic = TTY_DRIVER_MAGIC;
+		serial_drv.owner = THIS_MODULE;
 		serial_drv.driver_name = "pc300_tty";
 		serial_drv.name = "ttyCP";
 		serial_drv.major = CPC_TTY_MAJOR;
diff -Nru a/drivers/net/wan/sdla_chdlc.c b/drivers/net/wan/sdla_chdlc.c
--- a/drivers/net/wan/sdla_chdlc.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/net/wan/sdla_chdlc.c	Sat Apr 19 19:51:47 2003
@@ -4401,6 +4401,7 @@
 		
 		memset(&serial_driver, 0, sizeof(struct tty_driver));
 		serial_driver.magic = TTY_DRIVER_MAGIC;
+		serial_driver.owner = THIS_MODULE;
 		serial_driver.driver_name = "wanpipe_tty"; 
 		serial_driver.name = "ttyW";
 		serial_driver.major = WAN_TTY_MAJOR;
diff -Nru a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c
--- a/drivers/net/wireless/strip.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/net/wireless/strip.c	Sat Apr 19 19:51:49 2003
@@ -69,9 +69,9 @@
  */
 
 #ifdef MODULE
-static const char StripVersion[] = "1.3-STUART.CHESHIRE-MODULAR";
+static const char StripVersion[] = "1.3A-STUART.CHESHIRE-MODULAR";
 #else
-static const char StripVersion[] = "1.3-STUART.CHESHIRE";
+static const char StripVersion[] = "1.3A-STUART.CHESHIRE";
 #endif
 
 #define TICKLE_TIMERS 0
@@ -89,18 +89,7 @@
 #include <asm/uaccess.h>
 #include <asm/bitops.h>
 
-/*
- * isdigit() and isspace() use the ctype[] array, which is not available
- * to kernel modules.  If compiling as a module,  use  a local definition
- * of isdigit() and isspace() until  _ctype is added to ksyms.
- */
-#ifdef MODULE
-# define isdigit(c) ('0' <= (c) && (c)  <= '9')
-# define isspace(c) ((c) == ' ' || (c)  == '\t')
-#else
 # include <linux/ctype.h>
-#endif
-
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
@@ -131,10 +120,9 @@
  * Starmode packet.
  */
 
-typedef union
-{
-    __u8 c[4];
-    __u32 l;
+typedef union {
+	__u8 c[4];
+	__u32 l;
 } MetricomKey;
 
 /*
@@ -142,10 +130,9 @@
  * a single 32-bit long (which is convenient for assignment, equality testing etc.)
  */
 
-typedef union
-{
-    __u8 b[4];
-    __u32 l;
+typedef union {
+	__u8 b[4];
+	__u32 l;
 } IPaddr;
 
 /*
@@ -153,9 +140,8 @@
  * a Metricom address.
  */
 
-typedef struct
-{
-    __u8 c[24];
+typedef struct {
+	__u8 c[24];
 } MetricomAddressString;
 
 /* Encapsulation can expand packet of size x to 65/64x + 1
@@ -173,24 +159,21 @@
  * already understands Ethernet headers.
  */
 
-typedef struct
-{
-    MetricomAddress dst_addr;		/* Destination address, e.g. "0000-1234"   */
-    MetricomAddress src_addr;		/* Source address, e.g. "0000-5678"        */
-    unsigned short  protocol;		/* The protocol type, using Ethernet codes */
+typedef struct {
+	MetricomAddress dst_addr;	/* Destination address, e.g. "0000-1234"   */
+	MetricomAddress src_addr;	/* Source address, e.g. "0000-5678"        */
+	unsigned short protocol;	/* The protocol type, using Ethernet codes */
 } STRIP_Header;
 
-typedef struct
-{
-    char c[60];
+typedef struct {
+	char c[60];
 } MetricomNode;
 
 #define NODE_TABLE_SIZE 32
-typedef struct
-{
-    struct timeval timestamp;
-    int            num_nodes;
-    MetricomNode   node[NODE_TABLE_SIZE];
+typedef struct {
+	struct timeval timestamp;
+	int num_nodes;
+	MetricomNode node[NODE_TABLE_SIZE];
 } MetricomNodeTable;
 
 enum { FALSE = 0, TRUE = 1 };
@@ -198,123 +181,117 @@
 /*
  * Holds the radio's firmware version.
  */
-typedef struct
-{
-    char c[50];
+typedef struct {
+	char c[50];
 } FirmwareVersion;
 
 /*
  * Holds the radio's serial number.
  */
-typedef struct
-{
-    char c[18];
+typedef struct {
+	char c[18];
 } SerialNumber;
 
 /*
  * Holds the radio's battery voltage.
  */
-typedef struct
-{
-    char c[11];
+typedef struct {
+	char c[11];
 } BatteryVoltage;
 
-typedef struct
-{
-    char c[8];
+typedef struct {
+	char c[8];
 } char8;
 
-enum
-{
-    NoStructure = 0,		/* Really old firmware */
-    StructuredMessages = 1,	/* Parsable AT response msgs */
-    ChecksummedMessages = 2	/* Parsable AT response msgs with checksums */
+enum {
+	NoStructure = 0,	/* Really old firmware */
+	StructuredMessages = 1,	/* Parsable AT response msgs */
+	ChecksummedMessages = 2	/* Parsable AT response msgs with checksums */
 } FirmwareLevel;
 
-struct strip
-{
-    int magic;
-    /*
-     * These are pointers to the malloc()ed frame buffers.
-     */
-
-    unsigned char     *rx_buff;			/* buffer for received IP packet*/
-    unsigned char     *sx_buff;			/* buffer for received serial data*/
-    int                sx_count;		/* received serial data counter */
-    int                sx_size;			/* Serial buffer size		*/
-    unsigned char     *tx_buff;			/* transmitter buffer           */
-    unsigned char     *tx_head;			/* pointer to next byte to XMIT */
-    int                tx_left;			/* bytes left in XMIT queue     */
-    int                tx_size;			/* Serial buffer size		*/
-
-    /*
-     * STRIP interface statistics.
-     */
-
-    unsigned long      rx_packets;		/* inbound frames counter	*/
-    unsigned long      tx_packets;		/* outbound frames counter	*/
-    unsigned long      rx_errors;		/* Parity, etc. errors		*/
-    unsigned long      tx_errors;		/* Planned stuff		*/
-    unsigned long      rx_dropped;		/* No memory for skb		*/
-    unsigned long      tx_dropped;		/* When MTU change		*/
-    unsigned long      rx_over_errors;		/* Frame bigger then STRIP buf. */
-
-    unsigned long      pps_timer;		/* Timer to determine pps	*/
-    unsigned long      rx_pps_count;		/* Counter to determine pps	*/
-    unsigned long      tx_pps_count;		/* Counter to determine pps	*/
-    unsigned long      sx_pps_count;		/* Counter to determine pps	*/
-    unsigned long      rx_average_pps;		/* rx packets per second * 8	*/
-    unsigned long      tx_average_pps;		/* tx packets per second * 8	*/
-    unsigned long      sx_average_pps;		/* sent packets per second * 8	*/
+struct strip {
+	int magic;
+	/*
+	 * These are pointers to the malloc()ed frame buffers.
+	 */
+
+	unsigned char *rx_buff;	/* buffer for received IP packet */
+	unsigned char *sx_buff;	/* buffer for received serial data */
+	int sx_count;		/* received serial data counter */
+	int sx_size;		/* Serial buffer size           */
+	unsigned char *tx_buff;	/* transmitter buffer           */
+	unsigned char *tx_head;	/* pointer to next byte to XMIT */
+	int tx_left;		/* bytes left in XMIT queue     */
+	int tx_size;		/* Serial buffer size           */
+
+	/*
+	 * STRIP interface statistics.
+	 */
+
+	unsigned long rx_packets;	/* inbound frames counter       */
+	unsigned long tx_packets;	/* outbound frames counter      */
+	unsigned long rx_errors;	/* Parity, etc. errors          */
+	unsigned long tx_errors;	/* Planned stuff                */
+	unsigned long rx_dropped;	/* No memory for skb            */
+	unsigned long tx_dropped;	/* When MTU change              */
+	unsigned long rx_over_errors;	/* Frame bigger then STRIP buf. */
+
+	unsigned long pps_timer;	/* Timer to determine pps       */
+	unsigned long rx_pps_count;	/* Counter to determine pps     */
+	unsigned long tx_pps_count;	/* Counter to determine pps     */
+	unsigned long sx_pps_count;	/* Counter to determine pps     */
+	unsigned long rx_average_pps;	/* rx packets per second * 8    */
+	unsigned long tx_average_pps;	/* tx packets per second * 8    */
+	unsigned long sx_average_pps;	/* sent packets per second * 8  */
 
 #ifdef EXT_COUNTERS
-    unsigned long      rx_bytes;                /* total received bytes */
-    unsigned long      tx_bytes;                /* total received bytes */
-    unsigned long      rx_rbytes;               /* bytes thru radio i/f */
-    unsigned long      tx_rbytes;               /* bytes thru radio i/f */
-    unsigned long      rx_sbytes;               /* tot bytes thru serial i/f */
-    unsigned long      tx_sbytes;               /* tot bytes thru serial i/f */
-    unsigned long      rx_ebytes;               /* tot stat/err bytes */
-    unsigned long      tx_ebytes;               /* tot stat/err bytes */
+	unsigned long rx_bytes;		/* total received bytes */
+	unsigned long tx_bytes;		/* total received bytes */
+	unsigned long rx_rbytes;	/* bytes thru radio i/f */
+	unsigned long tx_rbytes;	/* bytes thru radio i/f */
+	unsigned long rx_sbytes;	/* tot bytes thru serial i/f */
+	unsigned long tx_sbytes;	/* tot bytes thru serial i/f */
+	unsigned long rx_ebytes;	/* tot stat/err bytes */
+	unsigned long tx_ebytes;	/* tot stat/err bytes */
 #endif
 
-    /*
-     * Internal variables.
-     */
-
-    struct strip      *next;			/* The next struct in the list	*/
-    struct strip     **referrer;		/* The pointer that points to us*/
-    int                discard;			/* Set if serial error		*/
-    int                working;			/* Is radio working correctly?	*/
-    int                firmware_level;		/* Message structuring level	*/
-    int                next_command;		/* Next periodic command	*/
-    unsigned int       user_baud;		/* The user-selected baud rate  */
-    int                mtu;			/* Our mtu (to spot changes!)	*/
-    long               watchdog_doprobe;	/* Next time to test the radio	*/
-    long               watchdog_doreset;	/* Time to do next reset	*/
-    long               gratuitous_arp;		/* Time to send next ARP refresh*/
-    long               arp_interval;		/* Next ARP interval		*/
-    struct timer_list  idle_timer;		/* For periodic wakeup calls	*/
-    MetricomAddress    true_dev_addr;		/* True address of radio	*/
-    int                manual_dev_addr;		/* Hack: See note below         */
-
-    FirmwareVersion    firmware_version;	/* The radio's firmware version */
-    SerialNumber       serial_number;		/* The radio's serial number    */
-    BatteryVoltage     battery_voltage;		/* The radio's battery voltage  */
-
-    /*
-     * Other useful structures.
-     */
-
-    struct tty_struct *tty;			/* ptr to TTY structure		*/
-    struct net_device      dev;			/* Our device structure		*/
-
-    /*
-     * Neighbour radio records
-     */
+	/*
+	 * Internal variables.
+	 */
+
+	struct strip *next;		/* The next struct in the list  */
+	struct strip **referrer;	/* The pointer that points to us */
+	int discard;			/* Set if serial error          */
+	int working;			/* Is radio working correctly?  */
+	int firmware_level;		/* Message structuring level    */
+	int next_command;		/* Next periodic command        */
+	unsigned int user_baud;		/* The user-selected baud rate  */
+	int mtu;			/* Our mtu (to spot changes!)   */
+	long watchdog_doprobe;		/* Next time to test the radio  */
+	long watchdog_doreset;		/* Time to do next reset        */
+	long gratuitous_arp;		/* Time to send next ARP refresh */
+	long arp_interval;		/* Next ARP interval            */
+	struct timer_list idle_timer;	/* For periodic wakeup calls    */
+	MetricomAddress true_dev_addr;	/* True address of radio        */
+	int manual_dev_addr;		/* Hack: See note below         */
+
+	FirmwareVersion firmware_version;	/* The radio's firmware version */
+	SerialNumber serial_number;	/* The radio's serial number    */
+	BatteryVoltage battery_voltage;	/* The radio's battery voltage  */
+
+	/*
+	 * Other useful structures.
+	 */
+
+	struct tty_struct *tty;		/* ptr to TTY structure         */
+	struct net_device dev;		/* Our device structure         */
 
-    MetricomNodeTable  portables;
-    MetricomNodeTable  poletops;
+	/*
+	 * Neighbour radio records
+	 */
+
+	MetricomNodeTable portables;
+	MetricomNodeTable poletops;
 };
 
 /*
@@ -406,36 +383,39 @@
 static const char CommandString3[] = "*&COMMAND*ATS300?";	/* Query version information */
 static const char CommandString4[] = "*&COMMAND*ATS311?";	/* Query poletop list */
 static const char CommandString5[] = "*&COMMAND*AT~LA";		/* Query portables list */
-typedef struct { const char *string; long length; } StringDescriptor;
-
-static const StringDescriptor CommandString[] =
-    {
-    { CommandString0, sizeof(CommandString0)-1 },
-    { CommandString1, sizeof(CommandString1)-1 },
-    { CommandString2, sizeof(CommandString2)-1 },
-    { CommandString3, sizeof(CommandString3)-1 },
-    { CommandString4, sizeof(CommandString4)-1 },
-    { CommandString5, sizeof(CommandString5)-1 }
-    };
+typedef struct {
+	const char *string;
+	long length;
+} StringDescriptor;
+
+static const StringDescriptor CommandString[] = {
+	{CommandString0, sizeof(CommandString0) - 1},
+	{CommandString1, sizeof(CommandString1) - 1},
+	{CommandString2, sizeof(CommandString2) - 1},
+	{CommandString3, sizeof(CommandString3) - 1},
+	{CommandString4, sizeof(CommandString4) - 1},
+	{CommandString5, sizeof(CommandString5) - 1}
+};
 
 #define GOT_ALL_RADIO_INFO(S)      \
     ((S)->firmware_version.c[0] && \
      (S)->battery_voltage.c[0]  && \
      memcmp(&(S)->true_dev_addr, zero_address.c, sizeof(zero_address)))
 
-static const char            hextable[16]      = "0123456789ABCDEF";
+static const char hextable[16] = "0123456789ABCDEF";
 
 static const MetricomAddress zero_address;
-static const MetricomAddress broadcast_address = { { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF } };
+static const MetricomAddress broadcast_address =
+    { {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} };
 
-static const MetricomKey     SIP0Key           = { { "SIP0" } };
-static const MetricomKey     ARP0Key           = { { "ARP0" } };
-static const MetricomKey     ATR_Key           = { { "ATR " } };
-static const MetricomKey     ACK_Key           = { { "ACK_" } };
-static const MetricomKey     INF_Key           = { { "INF_" } };
-static const MetricomKey     ERR_Key           = { { "ERR_" } };
+static const MetricomKey SIP0Key = { {"SIP0"} };
+static const MetricomKey ARP0Key = { {"ARP0"} };
+static const MetricomKey ATR_Key = { {"ATR "} };
+static const MetricomKey ACK_Key = { {"ACK_"} };
+static const MetricomKey INF_Key = { {"INF_"} };
+static const MetricomKey ERR_Key = { {"ERR_"} };
 
-static const long            MaxARPInterval    = 60 * HZ;          /* One minute */
+static const long MaxARPInterval = 60 * HZ;	/* One minute */
 
 /*
  * Maximum Starmode packet length is 1183 bytes. Allowing 4 bytes for
@@ -445,18 +425,17 @@
  * long, including IP header, UDP header, and NFS header. Setting the STRIP
  * MTU to 1152 allows us to send default sized NFS packets without fragmentation.
  */
-static const unsigned short  MAX_SEND_MTU          = 1152;
-static const unsigned short  MAX_RECV_MTU          = 1500; /* Hoping for Ethernet sized packets in the future! */
-static const unsigned short  DEFAULT_STRIP_MTU      = 1152;
-static const int             STRIP_MAGIC            = 0x5303;
-static const long            LongTime               = 0x7FFFFFFF;
-
+static const unsigned short MAX_SEND_MTU = 1152;
+static const unsigned short MAX_RECV_MTU = 1500;	/* Hoping for Ethernet sized packets in the future! */
+static const unsigned short DEFAULT_STRIP_MTU = 1152;
+static const int STRIP_MAGIC = 0x5303;
+static const long LongTime = 0x7FFFFFFF;
 
 /************************************************************************/
 /* Global variables							*/
 
 static struct strip *struct_strip_list;
-
+static spinlock_t strip_lock;
 
 /************************************************************************/
 /* Macros								*/
@@ -486,99 +465,52 @@
 /************************************************************************/
 /* Utility routines							*/
 
-typedef unsigned long InterruptStatus;
-
-static inline InterruptStatus DisableInterrupts(void)
+static int arp_query(unsigned char *haddr, u32 paddr,
+		     struct net_device *dev)
 {
-    InterruptStatus x;
-    save_flags(x);
-    cli();
-    return(x);
-}
+	struct neighbour *neighbor_entry;
 
-static inline void RestoreInterrupts(InterruptStatus x)
-{
-    restore_flags(x);
-}
-
-static int arp_query(unsigned char *haddr, u32 paddr, struct net_device * dev)
-{
-    struct neighbour *neighbor_entry;
+	neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev);
 
-    neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev);
-
-    if (neighbor_entry != NULL)
-    {
-	neighbor_entry->used = jiffies;
-	if (neighbor_entry->nud_state & NUD_VALID)
-	{
-	    memcpy(haddr, neighbor_entry->ha, dev->addr_len);
-	    return 1;
+	if (neighbor_entry != NULL) {
+		neighbor_entry->used = jiffies;
+		if (neighbor_entry->nud_state & NUD_VALID) {
+			memcpy(haddr, neighbor_entry->ha, dev->addr_len);
+			return 1;
+		}
 	}
-    }
-    return 0;
+	return 0;
 }
 
-static void DumpData(char *msg, struct strip *strip_info, __u8 *ptr, __u8 *end)
+static void DumpData(char *msg, struct strip *strip_info, __u8 * ptr,
+		     __u8 * end)
 {
-    static const int MAX_DumpData = 80;
-    __u8 pkt_text[MAX_DumpData], *p = pkt_text;
-
-    *p++ = '\"';
-
-    while (ptr<end && p < &pkt_text[MAX_DumpData-4])
-    {
-        if (*ptr == '\\')
-        {
-            *p++ = '\\';
-            *p++ = '\\';
-        }
-        else
-        {
-            if (*ptr >= 32 && *ptr <= 126)
-            {
-                *p++ = *ptr;
-            }
-            else
-            {
-                sprintf(p, "\\%02X", *ptr);
-                p+= 3;
-            }
-        }
-        ptr++;
-    }
-
-    if (ptr == end)
-    {
-        *p++ = '\"';
-    }
+	static const int MAX_DumpData = 80;
+	__u8 pkt_text[MAX_DumpData], *p = pkt_text;
 
-    *p++ = 0;
-
-    printk(KERN_INFO "%s: %-13s%s\n", strip_info->dev.name, msg, pkt_text);
-}
+	*p++ = '\"';
+
+	while (ptr < end && p < &pkt_text[MAX_DumpData - 4]) {
+		if (*ptr == '\\') {
+			*p++ = '\\';
+			*p++ = '\\';
+		} else {
+			if (*ptr >= 32 && *ptr <= 126) {
+				*p++ = *ptr;
+			} else {
+				sprintf(p, "\\%02X", *ptr);
+				p += 3;
+			}
+		}
+		ptr++;
+	}
 
-#if 0
-static void HexDump(char *msg, struct strip *strip_info, __u8 *start, __u8 *end)
-{
-    __u8 *ptr = start;
-    printk(KERN_INFO "%s: %s: %d bytes\n", strip_info->dev.name, msg, end-ptr);
+	if (ptr == end)
+		*p++ = '\"';
+	*p++ = 0;
 
-    while (ptr < end)
-    {
-        long offset = ptr - start;
-        __u8 text[80], *p = text;
-        while (ptr < end && p < &text[16*3])
-        {
-            *p++ = hextable[*ptr >> 4];
-            *p++ = hextable[*ptr++ & 0xF];
-            *p++ = ' ';
-        }
-        p[-1] = 0;
-        printk(KERN_INFO "%s: %4lX %s\n", strip_info->dev.name, offset, text);
-    }
+	printk(KERN_INFO "%s: %-13s%s\n", strip_info->dev.name, msg, pkt_text);
 }
-#endif
 
 
 /************************************************************************/
@@ -592,18 +524,17 @@
  * C0-FF Run of 1-64 zeroes (ASCII 0)
  */
 
-typedef enum
-{
-    Stuff_Diff      = 0x00,
-    Stuff_DiffZero  = 0x40,
-    Stuff_Same      = 0x80,
-    Stuff_Zero      = 0xC0,
-    Stuff_NoCode    = 0xFF,	/* Special code, meaning no code selected */
-
-    Stuff_CodeMask  = 0xC0,
-    Stuff_CountMask = 0x3F,
-    Stuff_MaxCount  = 0x3F,
-    Stuff_Magic     = 0x0D	/* The value we are eliminating */
+typedef enum {
+	Stuff_Diff = 0x00,
+	Stuff_DiffZero = 0x40,
+	Stuff_Same = 0x80,
+	Stuff_Zero = 0xC0,
+	Stuff_NoCode = 0xFF,	/* Special code, meaning no code selected */
+
+	Stuff_CodeMask = 0xC0,
+	Stuff_CountMask = 0x3F,
+	Stuff_MaxCount = 0x3F,
+	Stuff_Magic = 0x0D	/* The value we are eliminating */
 } StuffingCode;
 
 /* StuffData encodes the data starting at "src" for "length" bytes.
@@ -622,138 +553,122 @@
 #define StuffData_FinishBlock(X) \
 (*code_ptr = (X) ^ Stuff_Magic, code = Stuff_NoCode)
 
-static __u8 *StuffData(__u8 *src, __u32 length, __u8 *dst, __u8 **code_ptr_ptr)
+static __u8 *StuffData(__u8 * src, __u32 length, __u8 * dst,
+		       __u8 ** code_ptr_ptr)
 {
-    __u8 *end = src + length;
-    __u8 *code_ptr = *code_ptr_ptr;
-     __u8 code = Stuff_NoCode, count = 0;
-
-    if (!length)
-        return(dst);
-
-    if (code_ptr)
-    {
-        /*
-         * Recover state from last call, if applicable
-         */
-        code  = (*code_ptr ^ Stuff_Magic) & Stuff_CodeMask;
-        count = (*code_ptr ^ Stuff_Magic) & Stuff_CountMask;
-    }
-
-    while (src < end)
-    {
-        switch (code)
-        {
-            /* Stuff_NoCode: If no current code, select one */
-            case Stuff_NoCode:
-                /* Record where we're going to put this code */
-                code_ptr = dst++;
-                count = 0;    /* Reset the count (zero means one instance) */
-                /* Tentatively start a new block */
-                if (*src == 0)
-                {
-                    code = Stuff_Zero;
-                    src++;
-                }
-                else
-                {
-                    code = Stuff_Same;
-                    *dst++ = *src++ ^ Stuff_Magic;
-                }
-                /* Note: We optimistically assume run of same -- */
-                /* which will be fixed later in Stuff_Same */
-                /* if it turns out not to be true. */
-                break;
-
-            /* Stuff_Zero: We already have at least one zero encoded */
-            case Stuff_Zero:
-                /* If another zero, count it, else finish this code block */
-                if (*src == 0)
-                {
-                    count++;
-                    src++;
-                }
-                else
-                {
-                    StuffData_FinishBlock(Stuff_Zero + count);
-                }
-                break;
-
-            /* Stuff_Same: We already have at least one byte encoded */
-            case Stuff_Same:
-                /* If another one the same, count it */
-                if ((*src ^ Stuff_Magic) == code_ptr[1])
-                {
-                    count++;
-                    src++;
-                    break;
-                }
-                /* else, this byte does not match this block. */
-                /* If we already have two or more bytes encoded, finish this code block */
-                if (count)
-                {
-                    StuffData_FinishBlock(Stuff_Same + count);
-                    break;
-                }
-                /* else, we only have one so far, so switch to Stuff_Diff code */
-                code = Stuff_Diff;
-                /* and fall through to Stuff_Diff case below
-                 * Note cunning cleverness here: case Stuff_Diff compares 
-                 * the current character with the previous two to see if it
-                 * has a run of three the same. Won't this be an error if
-                 * there aren't two previous characters stored to compare with?
-                 * No. Because we know the current character is *not* the same
-                 * as the previous one, the first test below will necessarily
-                 * fail and the send half of the "if" won't be executed.
-                 */
-
-            /* Stuff_Diff: We have at least two *different* bytes encoded */
-            case Stuff_Diff:
-                /* If this is a zero, must encode a Stuff_DiffZero, and begin a new block */
-                if (*src == 0)
-                {
-                    StuffData_FinishBlock(Stuff_DiffZero + count);
-                }
-                /* else, if we have three in a row, it is worth starting a Stuff_Same block */
-                else if ((*src ^ Stuff_Magic)==dst[-1] && dst[-1]==dst[-2])
-                {
-                    /* Back off the last two characters we encoded */
-                    code += count-2;
-                    /* Note: "Stuff_Diff + 0" is an illegal code */
-                    if (code == Stuff_Diff + 0)
-                    {
-                        code = Stuff_Same + 0;
-                    }
-                    StuffData_FinishBlock(code);
-                    code_ptr = dst-2;
-                    /* dst[-1] already holds the correct value */
-                    count = 2;        /* 2 means three bytes encoded */
-                    code = Stuff_Same;
-                }
-                /* else, another different byte, so add it to the block */
-                else
-                {
-                    *dst++ = *src ^ Stuff_Magic;
-                    count++;
-                }
-                src++;    /* Consume the byte */
-                break;
-        }
-        if (count == Stuff_MaxCount)
-        {
-            StuffData_FinishBlock(code + count);
-        }
-    }
-    if (code == Stuff_NoCode)
-    {
-        *code_ptr_ptr = NULL;
-    }
-    else
-    {
-        *code_ptr_ptr = code_ptr;
-        StuffData_FinishBlock(code + count);
-    }
-    return(dst);
+	__u8 *end = src + length;
+	__u8 *code_ptr = *code_ptr_ptr;
+	__u8 code = Stuff_NoCode, count = 0;
+
+	if (!length)
+		return (dst);
+
+	if (code_ptr) {
+		/*
+		 * Recover state from last call, if applicable
+		 */
+		code = (*code_ptr ^ Stuff_Magic) & Stuff_CodeMask;
+		count = (*code_ptr ^ Stuff_Magic) & Stuff_CountMask;
+	}
+
+	while (src < end) {
+		switch (code) {
+			/* Stuff_NoCode: If no current code, select one */
+		case Stuff_NoCode:
+			/* Record where we're going to put this code */
+			code_ptr = dst++;
+			count = 0;	/* Reset the count (zero means one instance) */
+			/* Tentatively start a new block */
+			if (*src == 0) {
+				code = Stuff_Zero;
+				src++;
+			} else {
+				code = Stuff_Same;
+				*dst++ = *src++ ^ Stuff_Magic;
+			}
+			/* Note: We optimistically assume run of same -- */
+			/* which will be fixed later in Stuff_Same */
+			/* if it turns out not to be true. */
+			break;
+
+			/* Stuff_Zero: We already have at least one zero encoded */
+		case Stuff_Zero:
+			/* If another zero, count it, else finish this code block */
+			if (*src == 0) {
+				count++;
+				src++;
+			} else {
+				StuffData_FinishBlock(Stuff_Zero + count);
+			}
+			break;
+
+			/* Stuff_Same: We already have at least one byte encoded */
+		case Stuff_Same:
+			/* If another one the same, count it */
+			if ((*src ^ Stuff_Magic) == code_ptr[1]) {
+				count++;
+				src++;
+				break;
+			}
+			/* else, this byte does not match this block. */
+			/* If we already have two or more bytes encoded, finish this code block */
+			if (count) {
+				StuffData_FinishBlock(Stuff_Same + count);
+				break;
+			}
+			/* else, we only have one so far, so switch to Stuff_Diff code */
+			code = Stuff_Diff;
+			/* and fall through to Stuff_Diff case below
+			 * Note cunning cleverness here: case Stuff_Diff compares 
+			 * the current character with the previous two to see if it
+			 * has a run of three the same. Won't this be an error if
+			 * there aren't two previous characters stored to compare with?
+			 * No. Because we know the current character is *not* the same
+			 * as the previous one, the first test below will necessarily
+			 * fail and the send half of the "if" won't be executed.
+			 */
+
+			/* Stuff_Diff: We have at least two *different* bytes encoded */
+		case Stuff_Diff:
+			/* If this is a zero, must encode a Stuff_DiffZero, and begin a new block */
+			if (*src == 0) {
+				StuffData_FinishBlock(Stuff_DiffZero +
+						      count);
+			}
+			/* else, if we have three in a row, it is worth starting a Stuff_Same block */
+			else if ((*src ^ Stuff_Magic) == dst[-1]
+				 && dst[-1] == dst[-2]) {
+				/* Back off the last two characters we encoded */
+				code += count - 2;
+				/* Note: "Stuff_Diff + 0" is an illegal code */
+				if (code == Stuff_Diff + 0) {
+					code = Stuff_Same + 0;
+				}
+				StuffData_FinishBlock(code);
+				code_ptr = dst - 2;
+				/* dst[-1] already holds the correct value */
+				count = 2;	/* 2 means three bytes encoded */
+				code = Stuff_Same;
+			}
+			/* else, another different byte, so add it to the block */
+			else {
+				*dst++ = *src ^ Stuff_Magic;
+				count++;
+			}
+			src++;	/* Consume the byte */
+			break;
+		}
+		if (count == Stuff_MaxCount) {
+			StuffData_FinishBlock(code + count);
+		}
+	}
+	if (code == Stuff_NoCode) {
+		*code_ptr_ptr = NULL;
+	} else {
+		*code_ptr_ptr = code_ptr;
+		StuffData_FinishBlock(code + count);
+	}
+	return (dst);
 }
 
 /*
@@ -776,78 +691,75 @@
  * call to resume correctly).
  */
 
-static __u8 *UnStuffData(__u8 *src, __u8 *end, __u8 *dst, __u32 dst_length)
+static __u8 *UnStuffData(__u8 * src, __u8 * end, __u8 * dst,
+			 __u32 dst_length)
 {
-    __u8 *dst_end = dst + dst_length;
-    /* Sanity check */
-    if (!src || !end || !dst || !dst_length)
-        return(NULL);
-    while (src < end && dst < dst_end)
-    {
-        int count = (*src ^ Stuff_Magic) & Stuff_CountMask;
-        switch ((*src ^ Stuff_Magic) & Stuff_CodeMask)
-        {
-            case Stuff_Diff:
-                if (src+1+count >= end)
-                    return(NULL);
-                do
-                {
-                    *dst++ = *++src ^ Stuff_Magic;
-                }
-                while(--count >= 0 && dst < dst_end);
-                if (count < 0)
-                    src += 1;
-                else
-                {
-                    if (count == 0)
-                        *src = Stuff_Same ^ Stuff_Magic;
-                    else
-                        *src = (Stuff_Diff + count) ^ Stuff_Magic;
-                }
-                break;
-            case Stuff_DiffZero:
-                if (src+1+count >= end)
-                    return(NULL);
-                do
-                {
-                    *dst++ = *++src ^ Stuff_Magic;
-                }
-                while(--count >= 0 && dst < dst_end);
-                if (count < 0)
-                    *src = Stuff_Zero ^ Stuff_Magic;
-                else
-                    *src = (Stuff_DiffZero + count) ^ Stuff_Magic;
-                break;
-            case Stuff_Same:
-                if (src+1 >= end)
-                    return(NULL);
-                do
-                {
-                    *dst++ = src[1] ^ Stuff_Magic;
-                }
-                while(--count >= 0 && dst < dst_end);
-                if (count < 0)
-                    src += 2;
-                else
-                    *src = (Stuff_Same + count) ^ Stuff_Magic;
-                break;
-            case Stuff_Zero:
-                do
-                {
-                    *dst++ = 0;
-                }
-                while(--count >= 0 && dst < dst_end);
-                if (count < 0)
-                    src += 1;
-                else
-                    *src = (Stuff_Zero + count) ^ Stuff_Magic;
-                break;
-        }
-    }
-    if (dst < dst_end)
-        return(NULL);
-    else
-        return(src);
+	__u8 *dst_end = dst + dst_length;
+	/* Sanity check */
+	if (!src || !end || !dst || !dst_length)
+		return (NULL);
+	while (src < end && dst < dst_end) {
+		int count = (*src ^ Stuff_Magic) & Stuff_CountMask;
+		switch ((*src ^ Stuff_Magic) & Stuff_CodeMask) {
+		case Stuff_Diff:
+			if (src + 1 + count >= end)
+				return (NULL);
+			do {
+				*dst++ = *++src ^ Stuff_Magic;
+			}
+			while (--count >= 0 && dst < dst_end);
+			if (count < 0)
+				src += 1;
+			else {
+				if (count == 0)
+					*src = Stuff_Same ^ Stuff_Magic;
+				else
+					*src =
+					    (Stuff_Diff +
+					     count) ^ Stuff_Magic;
+			}
+			break;
+		case Stuff_DiffZero:
+			if (src + 1 + count >= end)
+				return (NULL);
+			do {
+				*dst++ = *++src ^ Stuff_Magic;
+			}
+			while (--count >= 0 && dst < dst_end);
+			if (count < 0)
+				*src = Stuff_Zero ^ Stuff_Magic;
+			else
+				*src =
+				    (Stuff_DiffZero + count) ^ Stuff_Magic;
+			break;
+		case Stuff_Same:
+			if (src + 1 >= end)
+				return (NULL);
+			do {
+				*dst++ = src[1] ^ Stuff_Magic;
+			}
+			while (--count >= 0 && dst < dst_end);
+			if (count < 0)
+				src += 2;
+			else
+				*src = (Stuff_Same + count) ^ Stuff_Magic;
+			break;
+		case Stuff_Zero:
+			do {
+				*dst++ = 0;
+			}
+			while (--count >= 0 && dst < dst_end);
+			if (count < 0)
+				src += 1;
+			else
+				*src = (Stuff_Zero + count) ^ Stuff_Magic;
+			break;
+		}
+	}
+	if (dst < dst_end)
+		return (NULL);
+	else
+		return (src);
 }
 
 
@@ -862,16 +774,19 @@
  * currently in effect (57.6 or 115.2) is returned.
  */
 static unsigned int get_baud(struct tty_struct *tty)
-    {
-    if (!tty || !tty->termios) return(0);
-    if ((tty->termios->c_cflag & CBAUD) == B38400 && tty->driver_data)
-        {
-        struct async_struct *info = (struct async_struct *)tty->driver_data;
-        if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI ) return(B57600);
-        if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) return(B115200);
-        }
-    return(tty->termios->c_cflag & CBAUD);
-    }
+{
+	if (!tty || !tty->termios)
+		return (0);
+	if ((tty->termios->c_cflag & CBAUD) == B38400 && tty->driver_data) {
+		struct async_struct *info =
+		    (struct async_struct *) tty->driver_data;
+		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
+			return (B57600);
+		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
+			return (B115200);
+	}
+	return (tty->termios->c_cflag & CBAUD);
+}
 
 /*
  * set_baud sets the baud rate to the rate defined by baudcode
@@ -882,12 +797,12 @@
  * user, so it is simplest to just avoid using 38400.
  */
 static void set_baud(struct tty_struct *tty, unsigned int baudcode)
-    {
-    struct termios old_termios = *(tty->termios);
-    tty->termios->c_cflag &= ~CBAUD; /* Clear the old baud setting */
-    tty->termios->c_cflag |= baudcode; /* Set the new baud setting */
-    tty->driver.set_termios(tty, &old_termios);
-    }
+{
+	struct termios old_termios = *(tty->termios);
+	tty->termios->c_cflag &= ~CBAUD;	/* Clear the old baud setting */
+	tty->termios->c_cflag |= baudcode;	/* Set the new baud setting */
+	tty->driver.set_termios(tty, &old_termios);
+}
 
 /*
  * Convert a string to a Metricom Address.
@@ -898,26 +813,29 @@
   (p)[4] == '-' &&                                                            \
   isdigit((p)[5]) && isdigit((p)[6]) && isdigit((p)[7]) && isdigit((p)[8])    )
 
-static int string_to_radio_address(MetricomAddress *addr, __u8 *p)
+static int string_to_radio_address(MetricomAddress * addr, __u8 * p)
 {
-    if (!IS_RADIO_ADDRESS(p)) return(1);
-    addr->c[0] = 0;
-    addr->c[1] = 0;
-    addr->c[2] = READHEX(p[0]) << 4 | READHEX(p[1]);
-    addr->c[3] = READHEX(p[2]) << 4 | READHEX(p[3]);
-    addr->c[4] = READHEX(p[5]) << 4 | READHEX(p[6]);
-    addr->c[5] = READHEX(p[7]) << 4 | READHEX(p[8]);
-    return(0);
+	if (!IS_RADIO_ADDRESS(p))
+		return (1);
+	addr->c[0] = 0;
+	addr->c[1] = 0;
+	addr->c[2] = READHEX(p[0]) << 4 | READHEX(p[1]);
+	addr->c[3] = READHEX(p[2]) << 4 | READHEX(p[3]);
+	addr->c[4] = READHEX(p[5]) << 4 | READHEX(p[6]);
+	addr->c[5] = READHEX(p[7]) << 4 | READHEX(p[8]);
+	return (0);
 }
 
 /*
  * Convert a Metricom Address to a string.
  */
 
-static __u8 *radio_address_to_string(const MetricomAddress *addr, MetricomAddressString *p)
+static __u8 *radio_address_to_string(const MetricomAddress * addr,
+				     MetricomAddressString * p)
 {
-    sprintf(p->c, "%02X%02X-%02X%02X", addr->c[2], addr->c[3], addr->c[4], addr->c[5]);
-    return(p->c);
+	sprintf(p->c, "%02X%02X-%02X%02X", addr->c[2], addr->c[3],
+		addr->c[4], addr->c[5]);
+	return (p->c);
 }
 
 /*
@@ -928,110 +846,101 @@
 
 static int allocate_buffers(struct strip *strip_info)
 {
-    struct net_device *dev = &strip_info->dev;
-    int sx_size    = MAX(STRIP_ENCAP_SIZE(MAX_RECV_MTU), 4096);
-    int tx_size    = STRIP_ENCAP_SIZE(dev->mtu) + MaxCommandStringLength;
-    __u8 *r = kmalloc(MAX_RECV_MTU, GFP_ATOMIC);
-    __u8 *s = kmalloc(sx_size,      GFP_ATOMIC);
-    __u8 *t = kmalloc(tx_size,      GFP_ATOMIC);
-    if (r && s && t)
-    {
-        strip_info->rx_buff = r;
-        strip_info->sx_buff = s;
-        strip_info->tx_buff = t;
-        strip_info->sx_size = sx_size;
-        strip_info->tx_size = tx_size;
-        strip_info->mtu     = dev->mtu;
-        return(1);
-    }
-    if (r) kfree(r);
-    if (s) kfree(s);
-    if (t) kfree(t);
-    return(0);
+	struct net_device *dev = &strip_info->dev;
+	int sx_size = MAX(STRIP_ENCAP_SIZE(MAX_RECV_MTU), 4096);
+	int tx_size = STRIP_ENCAP_SIZE(dev->mtu) + MaxCommandStringLength;
+	__u8 *r = kmalloc(MAX_RECV_MTU, GFP_ATOMIC);
+	__u8 *s = kmalloc(sx_size, GFP_ATOMIC);
+	__u8 *t = kmalloc(tx_size, GFP_ATOMIC);
+	if (r && s && t) {
+		strip_info->rx_buff = r;
+		strip_info->sx_buff = s;
+		strip_info->tx_buff = t;
+		strip_info->sx_size = sx_size;
+		strip_info->tx_size = tx_size;
+		strip_info->mtu = dev->mtu;
+		return (1);
+	}
+	if (r)
+		kfree(r);
+	if (s)
+		kfree(s);
+	if (t)
+		kfree(t);
+	return (0);
 }
 
 /*
  * MTU has been changed by the IP layer. Unfortunately we are not told
  * about this, but we spot it ourselves and fix things up. We could be in
  * an upcall from the tty driver, or in an ip packet queue.
+ *
+ * Caller must hold the strip_lock
  */
 
 static void strip_changedmtu(struct strip *strip_info)
 {
-    int old_mtu           = strip_info->mtu;
-    struct net_device *dev    = &strip_info->dev;
-    unsigned char *orbuff = strip_info->rx_buff;
-    unsigned char *osbuff = strip_info->sx_buff;
-    unsigned char *otbuff = strip_info->tx_buff;
-    InterruptStatus intstat;
-
-    if (dev->mtu > MAX_SEND_MTU)
-    {
-        printk(KERN_ERR "%s: MTU exceeds maximum allowable (%d), MTU change cancelled.\n",
-            strip_info->dev.name, MAX_SEND_MTU);
-        dev->mtu = old_mtu;
-        return;
-    }
-
-    /*
-     * Have to disable interrupts here because we're reallocating and resizing
-     * the serial buffers, and we can't have data arriving in them while we're
-     * moving them around in memory. This may cause data to be lost on the serial
-     * port, but hopefully people won't change MTU that often.
-     * Also note, this may not work on a symmetric multi-processor system.
-     */
-    intstat = DisableInterrupts();
-
-    if (!allocate_buffers(strip_info))
-    {
-        RestoreInterrupts(intstat);
-        printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n",
-            strip_info->dev.name);
-        dev->mtu = old_mtu;
-        return;
-    }
-
-    if (strip_info->sx_count)
-    {
-        if (strip_info->sx_count <= strip_info->sx_size)
-            memcpy(strip_info->sx_buff, osbuff, strip_info->sx_count);
-        else
-        {
-            strip_info->discard = strip_info->sx_count;
-            strip_info->rx_over_errors++;
-        }
-    }
-
-    if (strip_info->tx_left)
-    {
-        if (strip_info->tx_left <= strip_info->tx_size)
-            memcpy(strip_info->tx_buff, strip_info->tx_head, strip_info->tx_left);
-        else
-        {
-            strip_info->tx_left = 0;
-            strip_info->tx_dropped++;
-        }
-    }
-    strip_info->tx_head = strip_info->tx_buff;
-
-    RestoreInterrupts(intstat);
-
-    printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n",
-        strip_info->dev.name, old_mtu, strip_info->mtu);
-
-    if (orbuff) kfree(orbuff);
-    if (osbuff) kfree(osbuff);
-    if (otbuff) kfree(otbuff);
+	int old_mtu = strip_info->mtu;
+	struct net_device *dev = &strip_info->dev;
+	unsigned char *orbuff = strip_info->rx_buff;
+	unsigned char *osbuff = strip_info->sx_buff;
+	unsigned char *otbuff = strip_info->tx_buff;
+
+	if (dev->mtu > MAX_SEND_MTU) {
+		printk(KERN_ERR
+		       "%s: MTU exceeds maximum allowable (%d), MTU change cancelled.\n",
+		       strip_info->dev.name, MAX_SEND_MTU);
+		dev->mtu = old_mtu;
+		return;
+	}
+
+	if (!allocate_buffers(strip_info)) {
+		printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n",
+		       strip_info->dev.name);
+		dev->mtu = old_mtu;
+		return;
+	}
+
+	if (strip_info->sx_count) {
+		if (strip_info->sx_count <= strip_info->sx_size)
+			memcpy(strip_info->sx_buff, osbuff,
+			       strip_info->sx_count);
+		else {
+			strip_info->discard = strip_info->sx_count;
+			strip_info->rx_over_errors++;
+		}
+	}
+
+	if (strip_info->tx_left) {
+		if (strip_info->tx_left <= strip_info->tx_size)
+			memcpy(strip_info->tx_buff, strip_info->tx_head,
+			       strip_info->tx_left);
+		else {
+			strip_info->tx_left = 0;
+			strip_info->tx_dropped++;
+		}
+	}
+	strip_info->tx_head = strip_info->tx_buff;
+
+	printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n",
+	       strip_info->dev.name, old_mtu, strip_info->mtu);
+
+	if (orbuff)
+		kfree(orbuff);
+	if (osbuff)
+		kfree(osbuff);
+	if (otbuff)
+		kfree(otbuff);
 }
 
 static void strip_unlock(struct strip *strip_info)
 {
-    /*
-     * Set the timer to go off in one second.
-     */
-    strip_info->idle_timer.expires = jiffies + 1*HZ;
-    add_timer(&strip_info->idle_timer);
-    netif_wake_queue(&strip_info->dev);
+	/*
+	 * Set the timer to go off in one second.
+	 */
+	strip_info->idle_timer.expires = jiffies + 1 * HZ;
+	add_timer(&strip_info->idle_timer);
+	netif_wake_queue(&strip_info->dev);
 }
 
 
@@ -1046,32 +955,30 @@
  * amount printed so far exceeds the total amount requested, then this
  * function returns 1, otherwise 0.
  */
-static int 
+static int
 shift_buffer(char *buffer, int requested_offset, int requested_len,
-             int *total, int *slop, char **buf)
+	     int *total, int *slop, char **buf)
 {
-    int printed;
+	int printed;
 
-    /* printk(KERN_DEBUG "shift: buffer: %d o: %d l: %d t: %d buf: %d\n",
-           (int) buffer, requested_offset, requested_len, *total,
-           (int) *buf); */
-    printed = *buf - buffer;
-    if (*total + printed <= requested_offset) {
-        *total += printed;
-        *buf = buffer;
-    }
-    else {
-        if (*total < requested_offset) {
-            *slop = requested_offset - *total;
-        }
-        *total = requested_offset + printed - *slop;
-    }
-    if (*total > requested_offset + requested_len) {
-        return 1;
-    }
-    else {
-        return 0;
-    }
+	/* printk(KERN_DEBUG "shift: buffer: %d o: %d l: %d t: %d buf: %d\n",
+	   (int) buffer, requested_offset, requested_len, *total,
+	   (int) *buf); */
+	printed = *buf - buffer;
+	if (*total + printed <= requested_offset) {
+		*total += printed;
+		*buf = buffer;
+	} else {
+		if (*total < requested_offset) {
+			*slop = requested_offset - *total;
+		}
+		*total = requested_offset + printed - *slop;
+	}
+	if (*total > requested_offset + requested_len) {
+		return 1;
+	} else {
+		return 0;
+	}
 }
 
 /*
@@ -1081,29 +988,29 @@
  */
 static int
 calc_start_len(char *buffer, char **start, int requested_offset,
-               int requested_len, int total, char *buf)
+	       int requested_len, int total, char *buf)
 {
-    int return_len, buffer_len;
+	int return_len, buffer_len;
 
-    buffer_len = buf - buffer;
-    if (buffer_len >= 4095) {
- 	printk(KERN_ERR "STRIP: exceeded /proc buffer size\n");
-    }
-
-    /*
-     * There may be bytes before and after the
-     * chunk that was actually requested.
-     */
-    return_len = total - requested_offset;
-    if (return_len < 0) {
-        return_len = 0;
-    }
-    *start = buf - return_len;
-    if (return_len > requested_len) {
-        return_len = requested_len;
-    }
-    /* printk(KERN_DEBUG "return_len: %d\n", return_len); */
-    return return_len;
+	buffer_len = buf - buffer;
+	if (buffer_len >= 4095) {
+		printk(KERN_ERR "STRIP: exceeded /proc buffer size\n");
+	}
+
+	/*
+	 * There may be bytes before and after the
+	 * chunk that was actually requested.
+	 */
+	return_len = total - requested_offset;
+	if (return_len < 0) {
+		return_len = 0;
+	}
+	*start = buf - return_len;
+	if (return_len > requested_len) {
+		return_len = requested_len;
+	}
+	/* printk(KERN_DEBUG "return_len: %d\n", return_len); */
+	return return_len;
 }
 
 /*
@@ -1116,34 +1023,39 @@
  */
 static char *time_delta(char buffer[], long time)
 {
-    time -= jiffies;
-    if (time > LongTime / 2) return("Not scheduled");
-    if(time < 0) time = 0;  /* Don't print negative times */
-    sprintf(buffer, "%ld seconds", time / HZ);
-    return(buffer);
-}
-
-static int sprintf_neighbours(char *buffer, MetricomNodeTable *table, char *title)
-{
-    /* We wrap this in a do/while loop, so if the table changes */
-    /* while we're reading it, we just go around and try again. */
-    struct timeval t;
-    char *ptr;
-    do
-        {
-        int i;
-        t = table->timestamp;
-        ptr = buffer;
-        if (table->num_nodes) ptr += sprintf(ptr, "\n %s\n", title);
-        for (i=0; i<table->num_nodes; i++)
-            {
-            InterruptStatus intstat = DisableInterrupts();
-            MetricomNode node = table->node[i];
-            RestoreInterrupts(intstat);
-            ptr += sprintf(ptr, "  %s\n", node.c);
-            }
-        } while (table->timestamp.tv_sec != t.tv_sec || table->timestamp.tv_usec != t.tv_usec);
-    return ptr - buffer;
+	time -= jiffies;
+	if (time > LongTime / 2)
+		return ("Not scheduled");
+	if (time < 0)
+		time = 0;	/* Don't print negative times */
+	sprintf(buffer, "%ld seconds", time / HZ);
+	return (buffer);
+}
+
+static int sprintf_neighbours(char *buffer, MetricomNodeTable * table,
+			      char *title)
+{
+	/* We wrap this in a do/while loop, so if the table changes */
+	/* while we're reading it, we just go around and try again. */
+	struct timeval t;
+	char *ptr;
+	unsigned long flags;
+
+	do {
+		int i;
+		t = table->timestamp;
+		ptr = buffer;
+		if (table->num_nodes)
+			ptr += sprintf(ptr, "\n %s\n", title);
+		for (i = 0; i < table->num_nodes; i++) {
+			spin_lock_irqsave(&strip_lock, flags);
+			MetricomNode node = table->node[i];
+			spin_unlock_irqrestore(&strip_lock, flags);
+			ptr += sprintf(ptr, "  %s\n", node.c);
+		}
+	} while (table->timestamp.tv_sec != t.tv_sec
+		 || table->timestamp.tv_usec != t.tv_usec);
+	return ptr - buffer;
 }
 
 /*
@@ -1152,91 +1064,105 @@
  * than 4K of data into it. With the maximum of 32 portables and 32 poletops
  * reported, the routine outputs 3107 bytes into the buffer.
  */
-static int
-sprintf_status_info(char *buffer, struct strip *strip_info)
+static int sprintf_status_info(char *buffer, struct strip *strip_info)
 {
-    char temp[32];
-    char *p = buffer;
-    MetricomAddressString addr_string;
-
-    /* First, we must copy all of our data to a safe place, */
-    /* in case a serial interrupt comes in and changes it.  */
-    InterruptStatus intstat = DisableInterrupts();
-    int                tx_left             = strip_info->tx_left;
-    unsigned long      rx_average_pps      = strip_info->rx_average_pps;
-    unsigned long      tx_average_pps      = strip_info->tx_average_pps;
-    unsigned long      sx_average_pps      = strip_info->sx_average_pps;
-    int                working             = strip_info->working;
-    int                firmware_level      = strip_info->firmware_level;
-    long               watchdog_doprobe    = strip_info->watchdog_doprobe;
-    long               watchdog_doreset    = strip_info->watchdog_doreset;
-    long               gratuitous_arp      = strip_info->gratuitous_arp;
-    long               arp_interval        = strip_info->arp_interval;
-    FirmwareVersion    firmware_version    = strip_info->firmware_version;
-    SerialNumber       serial_number       = strip_info->serial_number;
-    BatteryVoltage     battery_voltage     = strip_info->battery_voltage;
-    char*              if_name             = strip_info->dev.name;
-    MetricomAddress    true_dev_addr       = strip_info->true_dev_addr;
-    MetricomAddress    dev_dev_addr        = *(MetricomAddress*)strip_info->dev.dev_addr;
-    int                manual_dev_addr     = strip_info->manual_dev_addr;
+	char temp[32];
+	char *p = buffer;
+	MetricomAddressString addr_string;
+
+	/* First, we must copy all of our data to a safe place, */
+	/* in case a serial interrupt comes in and changes it.  */
+	int tx_left = strip_info->tx_left;
+	unsigned long rx_average_pps = strip_info->rx_average_pps;
+	unsigned long tx_average_pps = strip_info->tx_average_pps;
+	unsigned long sx_average_pps = strip_info->sx_average_pps;
+	int working = strip_info->working;
+	int firmware_level = strip_info->firmware_level;
+	long watchdog_doprobe = strip_info->watchdog_doprobe;
+	long watchdog_doreset = strip_info->watchdog_doreset;
+	long gratuitous_arp = strip_info->gratuitous_arp;
+	long arp_interval = strip_info->arp_interval;
+	FirmwareVersion firmware_version = strip_info->firmware_version;
+	SerialNumber serial_number = strip_info->serial_number;
+	BatteryVoltage battery_voltage = strip_info->battery_voltage;
+	char *if_name = strip_info->dev.name;
+	MetricomAddress true_dev_addr = strip_info->true_dev_addr;
+	MetricomAddress dev_dev_addr =
+	    *(MetricomAddress *) strip_info->dev.dev_addr;
+	int manual_dev_addr = strip_info->manual_dev_addr;
 #ifdef EXT_COUNTERS
-    unsigned long      rx_bytes            = strip_info->rx_bytes;
-    unsigned long      tx_bytes            = strip_info->tx_bytes;
-    unsigned long      rx_rbytes           = strip_info->rx_rbytes;
-    unsigned long      tx_rbytes           = strip_info->tx_rbytes;
-    unsigned long      rx_sbytes           = strip_info->rx_sbytes;
-    unsigned long      tx_sbytes           = strip_info->tx_sbytes;
-    unsigned long      rx_ebytes           = strip_info->rx_ebytes;
-    unsigned long      tx_ebytes           = strip_info->tx_ebytes;
+	unsigned long rx_bytes = strip_info->rx_bytes;
+	unsigned long tx_bytes = strip_info->tx_bytes;
+	unsigned long rx_rbytes = strip_info->rx_rbytes;
+	unsigned long tx_rbytes = strip_info->tx_rbytes;
+	unsigned long rx_sbytes = strip_info->rx_sbytes;
+	unsigned long tx_sbytes = strip_info->tx_sbytes;
+	unsigned long rx_ebytes = strip_info->rx_ebytes;
+	unsigned long tx_ebytes = strip_info->tx_ebytes;
 #endif
-    RestoreInterrupts(intstat);
 
-    p += sprintf(p, "\nInterface name\t\t%s\n", if_name);
-    p += sprintf(p, " Radio working:\t\t%s\n", working ? "Yes" : "No");
-    radio_address_to_string(&true_dev_addr, &addr_string);
-    p += sprintf(p, " Radio address:\t\t%s\n", addr_string.c);
-    if (manual_dev_addr)
-    {
-        radio_address_to_string(&dev_dev_addr, &addr_string);
-        p += sprintf(p, " Device address:\t%s\n", addr_string.c);
-    }
-    p += sprintf(p, " Firmware version:\t%s", !working        ? "Unknown" :
-                                              !firmware_level ? "Should be upgraded" :
-                                              firmware_version.c);
-    if (firmware_level >= ChecksummedMessages) p += sprintf(p, " (Checksums Enabled)");
-    p += sprintf(p, "\n");
-    p += sprintf(p, " Serial number:\t\t%s\n", serial_number.c);
-    p += sprintf(p, " Battery voltage:\t%s\n", battery_voltage.c);
-    p += sprintf(p, " Transmit queue (bytes):%d\n", tx_left);
-    p += sprintf(p, " Receive packet rate:   %ld packets per second\n", rx_average_pps / 8);
-    p += sprintf(p, " Transmit packet rate:  %ld packets per second\n", tx_average_pps / 8);
-    p += sprintf(p, " Sent packet rate:      %ld packets per second\n", sx_average_pps / 8);
-    p += sprintf(p, " Next watchdog probe:\t%s\n", time_delta(temp, watchdog_doprobe));
-    p += sprintf(p, " Next watchdog reset:\t%s\n", time_delta(temp, watchdog_doreset));
-    p += sprintf(p, " Next gratuitous ARP:\t");
-
-    if (!memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address)))
-        p += sprintf(p, "Disabled\n");
-    else
-    {
-        p += sprintf(p, "%s\n", time_delta(temp, gratuitous_arp));
-        p += sprintf(p, " Next ARP interval:\t%ld seconds\n", JIFFIE_TO_SEC(arp_interval));
-    }
+	p += sprintf(p, "\nInterface name\t\t%s\n", if_name);
+	p += sprintf(p, " Radio working:\t\t%s\n", working ? "Yes" : "No");
+	radio_address_to_string(&true_dev_addr, &addr_string);
+	p += sprintf(p, " Radio address:\t\t%s\n", addr_string.c);
+	if (manual_dev_addr) {
+		radio_address_to_string(&dev_dev_addr, &addr_string);
+		p += sprintf(p, " Device address:\t%s\n", addr_string.c);
+	}
+	p += sprintf(p, " Firmware version:\t%s", !working ? "Unknown" :
+		     !firmware_level ? "Should be upgraded" :
+		     firmware_version.c);
+	if (firmware_level >= ChecksummedMessages)
+		p += sprintf(p, " (Checksums Enabled)");
+	p += sprintf(p, "\n");
+	p += sprintf(p, " Serial number:\t\t%s\n", serial_number.c);
+	p += sprintf(p, " Battery voltage:\t%s\n", battery_voltage.c);
+	p += sprintf(p, " Transmit queue (bytes):%d\n", tx_left);
+	p += sprintf(p, " Receive packet rate:   %ld packets per second\n",
+		     rx_average_pps / 8);
+	p += sprintf(p, " Transmit packet rate:  %ld packets per second\n",
+		     tx_average_pps / 8);
+	p += sprintf(p, " Sent packet rate:      %ld packets per second\n",
+		     sx_average_pps / 8);
+	p += sprintf(p, " Next watchdog probe:\t%s\n",
+		     time_delta(temp, watchdog_doprobe));
+	p += sprintf(p, " Next watchdog reset:\t%s\n",
+		     time_delta(temp, watchdog_doreset));
+	p += sprintf(p, " Next gratuitous ARP:\t");
+
+	if (!memcmp
+	    (strip_info->dev.dev_addr, zero_address.c,
+	     sizeof(zero_address)))
+		p += sprintf(p, "Disabled\n");
+	else {
+		p += sprintf(p, "%s\n", time_delta(temp, gratuitous_arp));
+		p += sprintf(p, " Next ARP interval:\t%ld seconds\n",
+			     JIFFIE_TO_SEC(arp_interval));
+	}
 
-    if (working)
-        {
+	if (working) {
 #ifdef EXT_COUNTERS
-          p += sprintf(p, "\n");
-          p += sprintf(p, " Total bytes:         \trx:\t%lu\ttx:\t%lu\n", rx_bytes, tx_bytes);
-          p += sprintf(p, "  thru radio:         \trx:\t%lu\ttx:\t%lu\n", rx_rbytes, tx_rbytes);
-          p += sprintf(p, "  thru serial port:   \trx:\t%lu\ttx:\t%lu\n", rx_sbytes, tx_sbytes);
-          p += sprintf(p, " Total stat/err bytes:\trx:\t%lu\ttx:\t%lu\n", rx_ebytes, tx_ebytes);
+		p += sprintf(p, "\n");
+		p += sprintf(p,
+			     " Total bytes:         \trx:\t%lu\ttx:\t%lu\n",
+			     rx_bytes, tx_bytes);
+		p += sprintf(p,
+			     "  thru radio:         \trx:\t%lu\ttx:\t%lu\n",
+			     rx_rbytes, tx_rbytes);
+		p += sprintf(p,
+			     "  thru serial port:   \trx:\t%lu\ttx:\t%lu\n",
+			     rx_sbytes, tx_sbytes);
+		p += sprintf(p,
+			     " Total stat/err bytes:\trx:\t%lu\ttx:\t%lu\n",
+			     rx_ebytes, tx_ebytes);
 #endif
-        p += sprintf_neighbours(p, &strip_info->poletops, "Poletops:");
-        p += sprintf_neighbours(p, &strip_info->portables, "Portables:");
-        }
+		p += sprintf_neighbours(p, &strip_info->poletops,
+					"Poletops:");
+		p += sprintf_neighbours(p, &strip_info->portables,
+					"Portables:");
+	}
 
-    return p - buffer;
+	return p - buffer;
 }
 
 /*
@@ -1244,23 +1170,27 @@
  * the /proc file system.
  */
 
-static int get_status_info(char *buffer, char **start, off_t req_offset, int req_len)
+static int get_status_info(char *buffer, char **start, off_t req_offset,
+			   int req_len)
 {
-    int           total = 0, slop = 0;
-    struct strip *strip_info = struct_strip_list;
-    char         *buf = buffer;
-
-    buf += sprintf(buf, "strip_version: %s\n", StripVersion);
-    if (shift_buffer(buffer, req_offset, req_len, &total, &slop, &buf)) goto exit;
-
-    while (strip_info != NULL)
-        {
-        buf += sprintf_status_info(buf, strip_info);
-        if (shift_buffer(buffer, req_offset, req_len, &total, &slop, &buf)) break;
-        strip_info = strip_info->next;
-        }
-    exit:
-    return(calc_start_len(buffer, start, req_offset, req_len, total, buf));
+	int total = 0, slop = 0;
+	struct strip *strip_info = struct_strip_list;
+	char *buf = buffer;
+
+	buf += sprintf(buf, "strip_version: %s\n", StripVersion);
+	if (shift_buffer(buffer, req_offset, req_len, &total, &slop, &buf))
+		goto exit;
+
+	while (strip_info != NULL) {
+		buf += sprintf_status_info(buf, strip_info);
+		if (shift_buffer
+		    (buffer, req_offset, req_len, &total, &slop, &buf))
+			break;
+		strip_info = strip_info->next;
+	}
+      exit:
+	return (calc_start_len
+		(buffer, start, req_offset, req_len, total, buf));
 }
 
 /************************************************************************/
@@ -1268,73 +1198,77 @@
 
 static void ResetRadio(struct strip *strip_info)
 {
-    struct tty_struct *tty = strip_info->tty;
-    static const char init[] = "ate0q1dt**starmode\r**";
-    StringDescriptor s = { init, sizeof(init)-1 };
-
-    /* 
-     * If the radio isn't working anymore,
-     * we should clear the old status information.
-     */
-    if (strip_info->working)
-    {
-        printk(KERN_INFO "%s: No response: Resetting radio.\n", strip_info->dev.name);
-        strip_info->firmware_version.c[0] = '\0';
-        strip_info->serial_number.c[0] = '\0';
-        strip_info->battery_voltage.c[0] = '\0';
-        strip_info->portables.num_nodes = 0;
-        do_gettimeofday(&strip_info->portables.timestamp);
-        strip_info->poletops.num_nodes = 0;
-        do_gettimeofday(&strip_info->poletops.timestamp);
-    }
-
-    strip_info->pps_timer      = jiffies;
-    strip_info->rx_pps_count   = 0;
-    strip_info->tx_pps_count   = 0;
-    strip_info->sx_pps_count   = 0;
-    strip_info->rx_average_pps = 0;
-    strip_info->tx_average_pps = 0;
-    strip_info->sx_average_pps = 0;
-
-    /* Mark radio address as unknown */
-    *(MetricomAddress*)&strip_info->true_dev_addr = zero_address;
-    if (!strip_info->manual_dev_addr)
-        *(MetricomAddress*)strip_info->dev.dev_addr = zero_address;
-    strip_info->working = FALSE;
-    strip_info->firmware_level = NoStructure;
-    strip_info->next_command   = CompatibilityCommand;
-    strip_info->watchdog_doprobe = jiffies + 10 * HZ;
-    strip_info->watchdog_doreset = jiffies + 1 * HZ;
-
-    /* If the user has selected a baud rate above 38.4 see what magic we have to do */
-    if (strip_info->user_baud > B38400)
-        {
-        /*
-         * Subtle stuff: Pay attention :-)
-         * If the serial port is currently at the user's selected (>38.4) rate,
-         * then we temporarily switch to 19.2 and issue the ATS304 command
-         * to tell the radio to switch to the user's selected rate.
-         * If the serial port is not currently at that rate, that means we just
-         * issued the ATS304 command last time through, so this time we restore
-         * the user's selected rate and issue the normal starmode reset string.
-         */
-        if (strip_info->user_baud == get_baud(tty))
-	    {
-	    static const char b0[] = "ate0q1s304=57600\r";
-	    static const char b1[] = "ate0q1s304=115200\r";
-	    static const StringDescriptor baudstring[2] =
-                { { b0, sizeof(b0)-1 }, { b1, sizeof(b1)-1 } };
-	    set_baud(tty, B19200);
-	    if      (strip_info->user_baud == B57600 ) s = baudstring[0];
-	    else if (strip_info->user_baud == B115200) s = baudstring[1];
-	    else s = baudstring[1]; /* For now */
-	    }
-        else set_baud(tty, strip_info->user_baud);
-        }
+	struct tty_struct *tty = strip_info->tty;
+	static const char init[] = "ate0q1dt**starmode\r**";
+	StringDescriptor s = { init, sizeof(init) - 1 };
+
+	/* 
+	 * If the radio isn't working anymore,
+	 * we should clear the old status information.
+	 */
+	if (strip_info->working) {
+		printk(KERN_INFO "%s: No response: Resetting radio.\n",
+		       strip_info->dev.name);
+		strip_info->firmware_version.c[0] = '\0';
+		strip_info->serial_number.c[0] = '\0';
+		strip_info->battery_voltage.c[0] = '\0';
+		strip_info->portables.num_nodes = 0;
+		do_gettimeofday(&strip_info->portables.timestamp);
+		strip_info->poletops.num_nodes = 0;
+		do_gettimeofday(&strip_info->poletops.timestamp);
+	}
 
-    tty->driver.write(tty, 0, s.string, s.length);
+	strip_info->pps_timer = jiffies;
+	strip_info->rx_pps_count = 0;
+	strip_info->tx_pps_count = 0;
+	strip_info->sx_pps_count = 0;
+	strip_info->rx_average_pps = 0;
+	strip_info->tx_average_pps = 0;
+	strip_info->sx_average_pps = 0;
+
+	/* Mark radio address as unknown */
+	*(MetricomAddress *) & strip_info->true_dev_addr = zero_address;
+	if (!strip_info->manual_dev_addr)
+		*(MetricomAddress *) strip_info->dev.dev_addr =
+		    zero_address;
+	strip_info->working = FALSE;
+	strip_info->firmware_level = NoStructure;
+	strip_info->next_command = CompatibilityCommand;
+	strip_info->watchdog_doprobe = jiffies + 10 * HZ;
+	strip_info->watchdog_doreset = jiffies + 1 * HZ;
+
+	/* If the user has selected a baud rate above 38.4 see what magic we have to do */
+	if (strip_info->user_baud > B38400) {
+		/*
+		 * Subtle stuff: Pay attention :-)
+		 * If the serial port is currently at the user's selected (>38.4) rate,
+		 * then we temporarily switch to 19.2 and issue the ATS304 command
+		 * to tell the radio to switch to the user's selected rate.
+		 * If the serial port is not currently at that rate, that means we just
+		 * issued the ATS304 command last time through, so this time we restore
+		 * the user's selected rate and issue the normal starmode reset string.
+		 */
+		if (strip_info->user_baud == get_baud(tty)) {
+			static const char b0[] = "ate0q1s304=57600\r";
+			static const char b1[] = "ate0q1s304=115200\r";
+			static const StringDescriptor baudstring[2] =
+			    { {b0, sizeof(b0) - 1}
+			, {b1, sizeof(b1) - 1}
+			};
+			set_baud(tty, B19200);
+			if (strip_info->user_baud == B57600)
+				s = baudstring[0];
+			else if (strip_info->user_baud == B115200)
+				s = baudstring[1];
+			else
+				s = baudstring[1];	/* For now */
+		} else
+			set_baud(tty, strip_info->user_baud);
+	}
+
+	tty->driver.write(tty, 0, s.string, s.length);
 #ifdef EXT_COUNTERS
-    strip_info->tx_ebytes += s.length;
+	strip_info->tx_ebytes += s.length;
 #endif
 }
 
@@ -1345,346 +1279,354 @@
 
 static void strip_write_some_more(struct tty_struct *tty)
 {
-    struct strip *strip_info = (struct strip *) tty->disc_data;
+	struct strip *strip_info = (struct strip *) tty->disc_data;
 
-    /* First make sure we're connected. */
-    if (!strip_info || strip_info->magic != STRIP_MAGIC || 
-    	!netif_running(&strip_info->dev))
-        return;
-
-    if (strip_info->tx_left > 0)
-    {
-        /*
-         * If some data left, send it
-         * Note: There's a kernel design bug here. The write_wakeup routine has to
-         * know how many bytes were written in the previous call, but the number of
-         * bytes written is returned as the result of the tty->driver.write call,
-         * and there's no guarantee that the tty->driver.write routine will have
-         * returned before the write_wakeup routine is invoked. If the PC has fast
-         * Serial DMA hardware, then it's quite possible that the write could complete
-         * almost instantaneously, meaning that my write_wakeup routine could be
-         * called immediately, before tty->driver.write has had a chance to return
-         * the number of bytes that it wrote. In an attempt to guard against this,
-         * I disable interrupts around the call to tty->driver.write, although even
-         * this might not work on a symmetric multi-processor system.
-         */
-        InterruptStatus intstat = DisableInterrupts();
-        int num_written = tty->driver.write(tty, 0, strip_info->tx_head, strip_info->tx_left);
-        strip_info->tx_left -= num_written;
-        strip_info->tx_head += num_written;
+	/* First make sure we're connected. */
+	if (!strip_info || strip_info->magic != STRIP_MAGIC ||
+	    !netif_running(&strip_info->dev))
+		return;
+
+	if (strip_info->tx_left > 0) {
+		int num_written =
+		    tty->driver.write(tty, 0, strip_info->tx_head,
+				      strip_info->tx_left);
+		strip_info->tx_left -= num_written;
+		strip_info->tx_head += num_written;
 #ifdef EXT_COUNTERS
-        strip_info->tx_sbytes += num_written;
+		strip_info->tx_sbytes += num_written;
 #endif
-        RestoreInterrupts(intstat);
-    }
-    else            /* Else start transmission of another packet */
-    {
-        tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
-        strip_unlock(strip_info);
-    }
-}
-
-static __u8 *add_checksum(__u8 *buffer, __u8 *end)
-{
-    __u16 sum = 0;
-    __u8 *p = buffer;
-    while (p < end) sum += *p++;
-    end[3] = hextable[sum & 0xF]; sum >>= 4;
-    end[2] = hextable[sum & 0xF]; sum >>= 4;
-    end[1] = hextable[sum & 0xF]; sum >>= 4;
-    end[0] = hextable[sum & 0xF];
-    return(end+4);
-}
-
-static unsigned char *strip_make_packet(unsigned char *buffer, struct strip *strip_info, struct sk_buff *skb)
-{
-    __u8           *ptr = buffer;
-    __u8           *stuffstate = NULL;
-    STRIP_Header   *header     = (STRIP_Header *)skb->data;
-    MetricomAddress haddr      = header->dst_addr;
-    int             len        = skb->len - sizeof(STRIP_Header);
-    MetricomKey     key;
-
-    /*HexDump("strip_make_packet", strip_info, skb->data, skb->data + skb->len);*/
-
-    if      (header->protocol == htons(ETH_P_IP))  key = SIP0Key;
-    else if (header->protocol == htons(ETH_P_ARP)) key = ARP0Key;
-    else
-    {
-        printk(KERN_ERR "%s: strip_make_packet: Unknown packet type 0x%04X\n",
-            strip_info->dev.name, ntohs(header->protocol));
-        return(NULL);
-    }
-
-    if (len > strip_info->mtu)
-    {
-        printk(KERN_ERR "%s: Dropping oversized transmit packet: %d bytes\n",
-            strip_info->dev.name, len);
-        return(NULL);
-    }
-
-    /*
-     * If we're sending to ourselves, discard the packet.
-     * (Metricom radios choke if they try to send a packet to their own address.)
-     */
-    if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr)))
-    {
-        printk(KERN_ERR "%s: Dropping packet addressed to self\n", strip_info->dev.name);
-        return(NULL);
-    }
-
-    /*
-     * If this is a broadcast packet, send it to our designated Metricom
-     * 'broadcast hub' radio (First byte of address being 0xFF means broadcast)
-     */
-    if (haddr.c[0] == 0xFF)
-    {
-	u32 brd = 0;
- 	struct in_device *in_dev = in_dev_get(&strip_info->dev);
-	if (in_dev == NULL)
-		return NULL;
-	read_lock(&in_dev->lock);
-	if (in_dev->ifa_list)
-		brd = in_dev->ifa_list->ifa_broadcast;
-	read_unlock(&in_dev->lock);
-	in_dev_put(in_dev);
-
-	/* arp_query returns 1 if it succeeds in looking up the address, 0 if it fails */
-        if (!arp_query(haddr.c, brd, &strip_info->dev))
-        {
-            printk(KERN_ERR "%s: Unable to send packet (no broadcast hub configured)\n",
-                strip_info->dev.name);
-            return(NULL);
-        }
+	} else {		/* Else start transmission of another packet */
+
+		tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
+		strip_unlock(strip_info);
+	}
+}
+
+static __u8 *add_checksum(__u8 * buffer, __u8 * end)
+{
+	__u16 sum = 0;
+	__u8 *p = buffer;
+	while (p < end)
+		sum += *p++;
+	end[3] = hextable[sum & 0xF];
+	sum >>= 4;
+	end[2] = hextable[sum & 0xF];
+	sum >>= 4;
+	end[1] = hextable[sum & 0xF];
+	sum >>= 4;
+	end[0] = hextable[sum & 0xF];
+	return (end + 4);
+}
+
+static unsigned char *strip_make_packet(unsigned char *buffer,
+					struct strip *strip_info,
+					struct sk_buff *skb)
+{
+	__u8 *ptr = buffer;
+	__u8 *stuffstate = NULL;
+	STRIP_Header *header = (STRIP_Header *) skb->data;
+	MetricomAddress haddr = header->dst_addr;
+	int len = skb->len - sizeof(STRIP_Header);
+	MetricomKey key;
+
+	/*HexDump("strip_make_packet", strip_info, skb->data, skb->data + skb->len); */
+
+	if (header->protocol == htons(ETH_P_IP))
+		key = SIP0Key;
+	else if (header->protocol == htons(ETH_P_ARP))
+		key = ARP0Key;
+	else {
+		printk(KERN_ERR
+		       "%s: strip_make_packet: Unknown packet type 0x%04X\n",
+		       strip_info->dev.name, ntohs(header->protocol));
+		return (NULL);
+	}
+
+	if (len > strip_info->mtu) {
+		printk(KERN_ERR
+		       "%s: Dropping oversized transmit packet: %d bytes\n",
+		       strip_info->dev.name, len);
+		return (NULL);
+	}
+
 	/*
-	 * If we are the broadcast hub, don't bother sending to ourselves.
+	 * If we're sending to ourselves, discard the packet.
 	 * (Metricom radios choke if they try to send a packet to their own address.)
 	 */
-        if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr))) return(NULL);
-    }
+	if (!memcmp(haddr.c, strip_info->true_dev_addr.c, sizeof(haddr))) {
+		printk(KERN_ERR "%s: Dropping packet addressed to self\n",
+		       strip_info->dev.name);
+		return (NULL);
+	}
 
-    *ptr++ = 0x0D;
-    *ptr++ = '*';
-    *ptr++ = hextable[haddr.c[2] >> 4];
-    *ptr++ = hextable[haddr.c[2] & 0xF];
-    *ptr++ = hextable[haddr.c[3] >> 4];
-    *ptr++ = hextable[haddr.c[3] & 0xF];
-    *ptr++ = '-';
-    *ptr++ = hextable[haddr.c[4] >> 4];
-    *ptr++ = hextable[haddr.c[4] & 0xF];
-    *ptr++ = hextable[haddr.c[5] >> 4];
-    *ptr++ = hextable[haddr.c[5] & 0xF];
-    *ptr++ = '*';
-    *ptr++ = key.c[0];
-    *ptr++ = key.c[1];
-    *ptr++ = key.c[2];
-    *ptr++ = key.c[3];
+	/*
+	 * If this is a broadcast packet, send it to our designated Metricom
+	 * 'broadcast hub' radio (First byte of address being 0xFF means broadcast)
+	 */
+	if (haddr.c[0] == 0xFF) {
+		u32 brd = 0;
+		struct in_device *in_dev = in_dev_get(&strip_info->dev);
+		if (in_dev == NULL)
+			return NULL;
+		read_lock(&in_dev->lock);
+		if (in_dev->ifa_list)
+			brd = in_dev->ifa_list->ifa_broadcast;
+		read_unlock(&in_dev->lock);
+		in_dev_put(in_dev);
+
+		/* arp_query returns 1 if it succeeds in looking up the address, 0 if it fails */
+		if (!arp_query(haddr.c, brd, &strip_info->dev)) {
+			printk(KERN_ERR
+			       "%s: Unable to send packet (no broadcast hub configured)\n",
+			       strip_info->dev.name);
+			return (NULL);
+		}
+		/*
+		 * If we are the broadcast hub, don't bother sending to ourselves.
+		 * (Metricom radios choke if they try to send a packet to their own address.)
+		 */
+		if (!memcmp
+		    (haddr.c, strip_info->true_dev_addr.c, sizeof(haddr)))
+			return (NULL);
+	}
 
-    ptr = StuffData(skb->data + sizeof(STRIP_Header), len, ptr, &stuffstate);
+	*ptr++ = 0x0D;
+	*ptr++ = '*';
+	*ptr++ = hextable[haddr.c[2] >> 4];
+	*ptr++ = hextable[haddr.c[2] & 0xF];
+	*ptr++ = hextable[haddr.c[3] >> 4];
+	*ptr++ = hextable[haddr.c[3] & 0xF];
+	*ptr++ = '-';
+	*ptr++ = hextable[haddr.c[4] >> 4];
+	*ptr++ = hextable[haddr.c[4] & 0xF];
+	*ptr++ = hextable[haddr.c[5] >> 4];
+	*ptr++ = hextable[haddr.c[5] & 0xF];
+	*ptr++ = '*';
+	*ptr++ = key.c[0];
+	*ptr++ = key.c[1];
+	*ptr++ = key.c[2];
+	*ptr++ = key.c[3];
+
+	ptr =
+	    StuffData(skb->data + sizeof(STRIP_Header), len, ptr,
+		      &stuffstate);
 
-    if (strip_info->firmware_level >= ChecksummedMessages) ptr = add_checksum(buffer+1, ptr);
+	if (strip_info->firmware_level >= ChecksummedMessages)
+		ptr = add_checksum(buffer + 1, ptr);
 
-    *ptr++ = 0x0D;
-    return(ptr);
+	*ptr++ = 0x0D;
+	return (ptr);
 }
 
 static void strip_send(struct strip *strip_info, struct sk_buff *skb)
 {
-    MetricomAddress haddr;
-    unsigned char *ptr = strip_info->tx_buff;
-    int doreset = (long)jiffies - strip_info->watchdog_doreset >= 0;
-    int doprobe = (long)jiffies - strip_info->watchdog_doprobe >= 0 && !doreset;
-    u32 addr, brd;
-
-    /*
-     * 1. If we have a packet, encapsulate it and put it in the buffer
-     */
-    if (skb)
-    {
-        char *newptr = strip_make_packet(ptr, strip_info, skb);
-        strip_info->tx_pps_count++;
-        if (!newptr) strip_info->tx_dropped++;
-        else
-        {
-            ptr = newptr;
-            strip_info->sx_pps_count++;
-            strip_info->tx_packets++;        /* Count another successful packet */
+	MetricomAddress haddr;
+	unsigned char *ptr = strip_info->tx_buff;
+	int doreset = (long) jiffies - strip_info->watchdog_doreset >= 0;
+	int doprobe = (long) jiffies - strip_info->watchdog_doprobe >= 0
+	    && !doreset;
+	u32 addr, brd;
+
+	/*
+	 * 1. If we have a packet, encapsulate it and put it in the buffer
+	 */
+	if (skb) {
+		char *newptr = strip_make_packet(ptr, strip_info, skb);
+		strip_info->tx_pps_count++;
+		if (!newptr)
+			strip_info->tx_dropped++;
+		else {
+			ptr = newptr;
+			strip_info->sx_pps_count++;
+			strip_info->tx_packets++;	/* Count another successful packet */
 #ifdef EXT_COUNTERS
-            strip_info->tx_bytes += skb->len;
-            strip_info->tx_rbytes += ptr - strip_info->tx_buff;
+			strip_info->tx_bytes += skb->len;
+			strip_info->tx_rbytes += ptr - strip_info->tx_buff;
 #endif
-            /*DumpData("Sending:", strip_info, strip_info->tx_buff, ptr);*/
-            /*HexDump("Sending", strip_info, strip_info->tx_buff, ptr);*/
-        }
-    }
-
-    /*
-     * 2. If it is time for another tickle, tack it on, after the packet
-     */
-    if (doprobe)
-    {
-        StringDescriptor ts = CommandString[strip_info->next_command];
+			/*DumpData("Sending:", strip_info, strip_info->tx_buff, ptr); */
+			/*HexDump("Sending", strip_info, strip_info->tx_buff, ptr); */
+		}
+	}
+
+	/*
+	 * 2. If it is time for another tickle, tack it on, after the packet
+	 */
+	if (doprobe) {
+		StringDescriptor ts = CommandString[strip_info->next_command];
 #if TICKLE_TIMERS
-        {
-        struct timeval tv;
-        do_gettimeofday(&tv);
-        printk(KERN_INFO "**** Sending tickle string %d      at %02d.%06d\n",
-            strip_info->next_command, tv.tv_sec % 100, tv.tv_usec);
-        }
+		{
+			struct timeval tv;
+			do_gettimeofday(&tv);
+			printk(KERN_INFO "**** Sending tickle string %d      at %02d.%06d\n",
+			       strip_info->next_command, tv.tv_sec % 100,
+			       tv.tv_usec);
+		}
 #endif
-        if (ptr == strip_info->tx_buff) *ptr++ = 0x0D;
-
-        *ptr++ = '*'; /* First send "**" to provoke an error message */
-        *ptr++ = '*';
+		if (ptr == strip_info->tx_buff)
+			*ptr++ = 0x0D;
 
-        /* Then add the command */
-        memcpy(ptr, ts.string, ts.length);
+		*ptr++ = '*';	/* First send "**" to provoke an error message */
+		*ptr++ = '*';
 
-        /* Add a checksum ? */
-        if (strip_info->firmware_level < ChecksummedMessages) ptr += ts.length;
-        else ptr = add_checksum(ptr, ptr + ts.length);
+		/* Then add the command */
+		memcpy(ptr, ts.string, ts.length);
 
-        *ptr++ = 0x0D; /* Terminate the command with a <CR> */
-
-        /* Cycle to next periodic command? */
-        if (strip_info->firmware_level >= StructuredMessages)
-                if (++strip_info->next_command >= ELEMENTS_OF(CommandString))
-                        strip_info->next_command = 0;
+		/* Add a checksum ? */
+		if (strip_info->firmware_level < ChecksummedMessages)
+			ptr += ts.length;
+		else
+			ptr = add_checksum(ptr, ptr + ts.length);
+
+		*ptr++ = 0x0D;	/* Terminate the command with a <CR> */
+
+		/* Cycle to next periodic command? */
+		if (strip_info->firmware_level >= StructuredMessages)
+			if (++strip_info->next_command >=
+			    ELEMENTS_OF(CommandString))
+				strip_info->next_command = 0;
 #ifdef EXT_COUNTERS
-        strip_info->tx_ebytes += ts.length;
+		strip_info->tx_ebytes += ts.length;
 #endif
-        strip_info->watchdog_doprobe = jiffies + 10 * HZ;
-        strip_info->watchdog_doreset = jiffies + 1 * HZ;
-        /*printk(KERN_INFO "%s: Routine radio test.\n", strip_info->dev.name);*/
-    }
-
-    /*
-     * 3. Set up the strip_info ready to send the data (if any).
-     */
-    strip_info->tx_head = strip_info->tx_buff;
-    strip_info->tx_left = ptr - strip_info->tx_buff;
-    strip_info->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
-
-    /*
-     * 4. Debugging check to make sure we're not overflowing the buffer.
-     */
-    if (strip_info->tx_size - strip_info->tx_left < 20)
-        printk(KERN_ERR "%s: Sending%5d bytes;%5d bytes free.\n", strip_info->dev.name,
-            strip_info->tx_left, strip_info->tx_size - strip_info->tx_left);
-
-    /*
-     * 5. If watchdog has expired, reset the radio. Note: if there's data waiting in
-     * the buffer, strip_write_some_more will send it after the reset has finished
-     */
-    if (doreset) { ResetRadio(strip_info); return; }
-
-    if (1) {
-	    struct in_device *in_dev = in_dev_get(&strip_info->dev);
-	    brd = addr = 0;
-	    if (in_dev) {
-		    read_lock(&in_dev->lock);
-		    if (in_dev->ifa_list) {
-			    brd = in_dev->ifa_list->ifa_broadcast;
-			    addr = in_dev->ifa_list->ifa_local;
-		    }
-		    read_unlock(&in_dev->lock);
-		    in_dev_put(in_dev);
-	    }
-    }
-    
-
-    /*
-     * 6. If it is time for a periodic ARP, queue one up to be sent.
-     * We only do this if:
-     *  1. The radio is working
-     *  2. It's time to send another periodic ARP
-     *  3. We really know what our address is (and it is not manually set to zero)
-     *  4. We have a designated broadcast address configured
-     * If we queue up an ARP packet when we don't have a designated broadcast
-     * address configured, then the packet will just have to be discarded in
-     * strip_make_packet. This is not fatal, but it causes misleading information
-     * to be displayed in tcpdump. tcpdump will report that periodic APRs are
-     * being sent, when in fact they are not, because they are all being dropped
-     * in the strip_make_packet routine.
-     */
-    if (strip_info->working && (long)jiffies - strip_info->gratuitous_arp >= 0 &&
-        memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address)) &&
-        arp_query(haddr.c, brd, &strip_info->dev))
-    {
-        /*printk(KERN_INFO "%s: Sending gratuitous ARP with interval %ld\n",
-            strip_info->dev.name, strip_info->arp_interval / HZ);*/
-        strip_info->gratuitous_arp = jiffies + strip_info->arp_interval;
-        strip_info->arp_interval *= 2;
-        if (strip_info->arp_interval > MaxARPInterval)
-            strip_info->arp_interval = MaxARPInterval;
-	if (addr)
-	    arp_send(
-		ARPOP_REPLY, ETH_P_ARP,
-		addr, /* Target address of ARP packet is our address */
-		&strip_info->dev,	       /* Device to send packet on */
-		addr, /* Source IP address this ARP packet comes from */
-		NULL,			       /* Destination HW address is NULL (broadcast it) */
-		strip_info->dev.dev_addr,      /* Source HW address is our HW address */
-		strip_info->dev.dev_addr);     /* Target HW address is our HW address (redundant) */
-    }
-
-    /*
-     * 7. All ready. Start the transmission
-     */
-    strip_write_some_more(strip_info->tty);
+		strip_info->watchdog_doprobe = jiffies + 10 * HZ;
+		strip_info->watchdog_doreset = jiffies + 1 * HZ;
+		/*printk(KERN_INFO "%s: Routine radio test.\n", strip_info->dev.name); */
+	}
+
+	/*
+	 * 3. Set up the strip_info ready to send the data (if any).
+	 */
+	strip_info->tx_head = strip_info->tx_buff;
+	strip_info->tx_left = ptr - strip_info->tx_buff;
+	strip_info->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
+
+	/*
+	 * 4. Debugging check to make sure we're not overflowing the buffer.
+	 */
+	if (strip_info->tx_size - strip_info->tx_left < 20)
+		printk(KERN_ERR "%s: Sending%5d bytes;%5d bytes free.\n",
+		       strip_info->dev.name, strip_info->tx_left,
+		       strip_info->tx_size - strip_info->tx_left);
+
+	/*
+	 * 5. If watchdog has expired, reset the radio. Note: if there's data waiting in
+	 * the buffer, strip_write_some_more will send it after the reset has finished
+	 */
+	if (doreset) {
+		ResetRadio(strip_info);
+		return;
+	}
+
+	if (1) {
+		struct in_device *in_dev = in_dev_get(&strip_info->dev);
+		brd = addr = 0;
+		if (in_dev) {
+			read_lock(&in_dev->lock);
+			if (in_dev->ifa_list) {
+				brd = in_dev->ifa_list->ifa_broadcast;
+				addr = in_dev->ifa_list->ifa_local;
+			}
+			read_unlock(&in_dev->lock);
+			in_dev_put(in_dev);
+		}
+	}
+
+
+	/*
+	 * 6. If it is time for a periodic ARP, queue one up to be sent.
+	 * We only do this if:
+	 *  1. The radio is working
+	 *  2. It's time to send another periodic ARP
+	 *  3. We really know what our address is (and it is not manually set to zero)
+	 *  4. We have a designated broadcast address configured
+	 * If we queue up an ARP packet when we don't have a designated broadcast
+	 * address configured, then the packet will just have to be discarded in
+	 * strip_make_packet. This is not fatal, but it causes misleading information
+	 * to be displayed in tcpdump. tcpdump will report that periodic APRs are
+	 * being sent, when in fact they are not, because they are all being dropped
+	 * in the strip_make_packet routine.
+	 */
+	if (strip_info->working
+	    && (long) jiffies - strip_info->gratuitous_arp >= 0
+	    && memcmp(strip_info->dev.dev_addr, zero_address.c,
+		      sizeof(zero_address))
+	    && arp_query(haddr.c, brd, &strip_info->dev)) {
+		/*printk(KERN_INFO "%s: Sending gratuitous ARP with interval %ld\n",
+		   strip_info->dev.name, strip_info->arp_interval / HZ); */
+		strip_info->gratuitous_arp =
+		    jiffies + strip_info->arp_interval;
+		strip_info->arp_interval *= 2;
+		if (strip_info->arp_interval > MaxARPInterval)
+			strip_info->arp_interval = MaxARPInterval;
+		if (addr)
+			arp_send(ARPOP_REPLY, ETH_P_ARP, addr,	/* Target address of ARP packet is our address */
+				 &strip_info->dev,	/* Device to send packet on */
+				 addr,	/* Source IP address this ARP packet comes from */
+				 NULL,	/* Destination HW address is NULL (broadcast it) */
+				 strip_info->dev.dev_addr,	/* Source HW address is our HW address */
+				 strip_info->dev.dev_addr);	/* Target HW address is our HW address (redundant) */
+	}
+
+	/*
+	 * 7. All ready. Start the transmission
+	 */
+	strip_write_some_more(strip_info->tty);
 }
 
 /* Encapsulate a datagram and kick it into a TTY queue. */
 static int strip_xmit(struct sk_buff *skb, struct net_device *dev)
 {
-    struct strip *strip_info = (struct strip *)(dev->priv);
+	struct strip *strip_info = (struct strip *) (dev->priv);
+	unsigned long flags;
+
+	if (!netif_running(dev)) {
+		printk(KERN_ERR "%s: xmit call when iface is down\n",
+		       dev->name);
+		return (1);
+	}
 
-    if (!netif_running(dev))
-    {
-        printk(KERN_ERR "%s: xmit call when iface is down\n", dev->name);
-        return(1);
-    }
-
-    netif_stop_queue(dev);
-    
-    del_timer(&strip_info->idle_timer);
-
-    /* See if someone has been ifconfigging */
-    if (strip_info->mtu != strip_info->dev.mtu)
-        strip_changedmtu(strip_info);
-
-    if (jiffies - strip_info->pps_timer > HZ)
-    {
-        unsigned long t = jiffies - strip_info->pps_timer;
-        unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t/2) / t;
-        unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t/2) / t;
-        unsigned long sx_pps_count = (strip_info->sx_pps_count * HZ * 8 + t/2) / t;
-
-        strip_info->pps_timer = jiffies;
-        strip_info->rx_pps_count = 0;
-        strip_info->tx_pps_count = 0;
-        strip_info->sx_pps_count = 0;
-
-        strip_info->rx_average_pps = (strip_info->rx_average_pps + rx_pps_count + 1) / 2;
-        strip_info->tx_average_pps = (strip_info->tx_average_pps + tx_pps_count + 1) / 2;
-        strip_info->sx_average_pps = (strip_info->sx_average_pps + sx_pps_count + 1) / 2;
-
-        if (rx_pps_count / 8 >= 10)
-            printk(KERN_INFO "%s: WARNING: Receiving %ld packets per second.\n",
-                strip_info->dev.name, rx_pps_count / 8);
-        if (tx_pps_count / 8 >= 10)
-            printk(KERN_INFO "%s: WARNING: Tx        %ld packets per second.\n",
-                strip_info->dev.name, tx_pps_count / 8);
-        if (sx_pps_count / 8 >= 10)
-            printk(KERN_INFO "%s: WARNING: Sending   %ld packets per second.\n",
-                strip_info->dev.name, sx_pps_count / 8);
-    }
-
-    strip_send(strip_info, skb);
-
-    if (skb)
-    	dev_kfree_skb(skb);
-    return(0);
+	netif_stop_queue(dev);
+
+	del_timer(&strip_info->idle_timer);
+
+
+	if (jiffies - strip_info->pps_timer > HZ) {
+		unsigned long t = jiffies - strip_info->pps_timer;
+		unsigned long rx_pps_count = (strip_info->rx_pps_count * HZ * 8 + t / 2) / t;
+		unsigned long tx_pps_count = (strip_info->tx_pps_count * HZ * 8 + t / 2) / t;
+		unsigned long sx_pps_count = (strip_info->sx_pps_count * HZ * 8 + t / 2) / t;
+
+		strip_info->pps_timer = jiffies;
+		strip_info->rx_pps_count = 0;
+		strip_info->tx_pps_count = 0;
+		strip_info->sx_pps_count = 0;
+
+		strip_info->rx_average_pps = (strip_info->rx_average_pps + rx_pps_count + 1) / 2;
+		strip_info->tx_average_pps = (strip_info->tx_average_pps + tx_pps_count + 1) / 2;
+		strip_info->sx_average_pps = (strip_info->sx_average_pps + sx_pps_count + 1) / 2;
+
+		if (rx_pps_count / 8 >= 10)
+			printk(KERN_INFO "%s: WARNING: Receiving %ld packets per second.\n",
+			       strip_info->dev.name, rx_pps_count / 8);
+		if (tx_pps_count / 8 >= 10)
+			printk(KERN_INFO "%s: WARNING: Tx        %ld packets per second.\n",
+			       strip_info->dev.name, tx_pps_count / 8);
+		if (sx_pps_count / 8 >= 10)
+			printk(KERN_INFO "%s: WARNING: Sending   %ld packets per second.\n",
+			       strip_info->dev.name, sx_pps_count / 8);
+	}
+
+	spin_lock_irqsave(&strip_lock, flags);
+	/* See if someone has been ifconfigging */
+	if (strip_info->mtu != strip_info->dev.mtu)
+		strip_changedmtu(strip_info);
+
+	strip_send(strip_info, skb);
+
+	spin_unlock_irqrestore(&strip_lock, flags);
+
+	if (skb)
+		dev_kfree_skb(skb);
+	return 0;
 }
 
 /*
@@ -1695,7 +1637,7 @@
 
 static void strip_IdleTask(unsigned long parameter)
 {
-    strip_xmit(NULL, (struct net_device *)parameter);
+	strip_xmit(NULL, (struct net_device *) parameter);
 }
 
 /*
@@ -1710,23 +1652,25 @@
  */
 
 static int strip_header(struct sk_buff *skb, struct net_device *dev,
-        unsigned short type, void *daddr, void *saddr, unsigned len)
+			unsigned short type, void *daddr, void *saddr,
+			unsigned len)
 {
-    struct strip *strip_info = (struct strip *)(dev->priv);
-    STRIP_Header *header = (STRIP_Header *)skb_push(skb, sizeof(STRIP_Header));
+	struct strip *strip_info = (struct strip *) (dev->priv);
+	STRIP_Header *header = (STRIP_Header *) skb_push(skb, sizeof(STRIP_Header));
 
-    /*printk(KERN_INFO "%s: strip_header 0x%04X %s\n", dev->name, type,
-        type == ETH_P_IP ? "IP" : type == ETH_P_ARP ? "ARP" : "");*/
+	/*printk(KERN_INFO "%s: strip_header 0x%04X %s\n", dev->name, type,
+	   type == ETH_P_IP ? "IP" : type == ETH_P_ARP ? "ARP" : ""); */
 
-    header->src_addr = strip_info->true_dev_addr;
-    header->protocol = htons(type);
+	header->src_addr = strip_info->true_dev_addr;
+	header->protocol = htons(type);
 
-    /*HexDump("strip_header", (struct strip *)(dev->priv), skb->data, skb->data + skb->len);*/
+	/*HexDump("strip_header", (struct strip *)(dev->priv), skb->data, skb->data + skb->len); */
 
-    if (!daddr) return(-dev->hard_header_len);
+	if (!daddr)
+		return (-dev->hard_header_len);
 
-    header->dst_addr = *(MetricomAddress*)daddr;
-    return(dev->hard_header_len);
+	header->dst_addr = *(MetricomAddress *) daddr;
+	return (dev->hard_header_len);
 }
 
 /*
@@ -1740,13 +1684,13 @@
 static int strip_rebuild_header(struct sk_buff *skb)
 {
 #ifdef CONFIG_INET
-    STRIP_Header *header = (STRIP_Header *) skb->data;
+	STRIP_Header *header = (STRIP_Header *) skb->data;
 
-    /* Arp find returns zero if if knows the address, */
-    /* or if it doesn't know the address it sends an ARP packet and returns non-zero */
-    return arp_find(header->dst_addr.c, skb)? 1 : 0;
+	/* Arp find returns zero if if knows the address, */
+	/* or if it doesn't know the address it sends an ARP packet and returns non-zero */
+	return arp_find(header->dst_addr.c, skb) ? 1 : 0;
 #else
-    return 0;
+	return 0;
 #endif
 }
 
@@ -1756,422 +1700,446 @@
 
 static int strip_receive_room(struct tty_struct *tty)
 {
-    return 0x10000;  /* We can handle an infinite amount of data. :-) */
+	return 0x10000;		/* We can handle an infinite amount of data. :-) */
 }
 
 /*
  * This function parses the response to the ATS300? command,
  * extracting the radio version and serial number.
  */
-static void get_radio_version(struct strip *strip_info, __u8 *ptr, __u8 *end)
+static void get_radio_version(struct strip *strip_info, __u8 * ptr, __u8 * end)
 {
-    __u8 *p, *value_begin, *value_end;
-    int len;
-    
-    /* Determine the beginning of the second line of the payload */
-    p = ptr;
-    while (p < end && *p != 10) p++;
-    if (p >= end) return;
-    p++;
-    value_begin = p;
-    
-    /* Determine the end of line */
-    while (p < end && *p != 10) p++;
-    if (p >= end) return;
-    value_end = p;
-    p++;
-     
-    len = value_end - value_begin;
-    len = MIN(len, sizeof(FirmwareVersion) - 1);
-    if (strip_info->firmware_version.c[0] == 0)
-        printk(KERN_INFO "%s: Radio Firmware: %.*s\n",
-            strip_info->dev.name, len, value_begin);
-    sprintf(strip_info->firmware_version.c, "%.*s", len, value_begin);
-    
-    /* Look for the first colon */
-    while (p < end && *p != ':') p++;
-    if (p >= end) return;
-    /* Skip over the space */
-    p += 2;
-    len = sizeof(SerialNumber) - 1;
-    if (p + len <= end) {
-        sprintf(strip_info->serial_number.c, "%.*s", len, p);
-    }
-    else {
-     	printk(KERN_DEBUG "STRIP: radio serial number shorter (%d) than expected (%d)\n",
-     	       end - p, len);
-    }
+	__u8 *p, *value_begin, *value_end;
+	int len;
+
+	/* Determine the beginning of the second line of the payload */
+	p = ptr;
+	while (p < end && *p != 10)
+		p++;
+	if (p >= end)
+		return;
+	p++;
+	value_begin = p;
+
+	/* Determine the end of line */
+	while (p < end && *p != 10)
+		p++;
+	if (p >= end)
+		return;
+	value_end = p;
+	p++;
+
+	len = value_end - value_begin;
+	len = MIN(len, sizeof(FirmwareVersion) - 1);
+	if (strip_info->firmware_version.c[0] == 0)
+		printk(KERN_INFO "%s: Radio Firmware: %.*s\n",
+		       strip_info->dev.name, len, value_begin);
+	sprintf(strip_info->firmware_version.c, "%.*s", len, value_begin);
+
+	/* Look for the first colon */
+	while (p < end && *p != ':')
+		p++;
+	if (p >= end)
+		return;
+	/* Skip over the space */
+	p += 2;
+	len = sizeof(SerialNumber) - 1;
+	if (p + len <= end) {
+		sprintf(strip_info->serial_number.c, "%.*s", len, p);
+	} else {
+		printk(KERN_DEBUG
+		       "STRIP: radio serial number shorter (%d) than expected (%d)\n",
+		       end - p, len);
+	}
 }
 
 /*
  * This function parses the response to the ATS325? command,
  * extracting the radio battery voltage.
  */
-static void get_radio_voltage(struct strip *strip_info, __u8 *ptr, __u8 *end)
+static void get_radio_voltage(struct strip *strip_info, __u8 * ptr, __u8 * end)
 {
-    int len;
+	int len;
 
-    len = sizeof(BatteryVoltage) - 1;
-    if (ptr + len <= end) {
-        sprintf(strip_info->battery_voltage.c, "%.*s", len, ptr);
-    }
-    else {
- 	printk(KERN_DEBUG "STRIP: radio voltage string shorter (%d) than expected (%d)\n",
- 	       end - ptr, len);
-    }
+	len = sizeof(BatteryVoltage) - 1;
+	if (ptr + len <= end) {
+		sprintf(strip_info->battery_voltage.c, "%.*s", len, ptr);
+	} else {
+		printk(KERN_DEBUG
+		       "STRIP: radio voltage string shorter (%d) than expected (%d)\n",
+		       end - ptr, len);
+	}
 }
 
 /*
  * This function parses the responses to the AT~LA and ATS311 commands,
  * which list the radio's neighbours.
  */
-static void get_radio_neighbours(MetricomNodeTable *table, __u8 *ptr, __u8 *end)
+static void get_radio_neighbours(MetricomNodeTable * table, __u8 * ptr, __u8 * end)
 {
-    table->num_nodes = 0;
-    while (ptr < end && table->num_nodes < NODE_TABLE_SIZE)
-        {
-        MetricomNode *node = &table->node[table->num_nodes++];
-        char *dst = node->c, *limit = dst + sizeof(*node) - 1;
-        while (ptr < end && *ptr <= 32) ptr++;
-        while (ptr < end && dst < limit && *ptr != 10) *dst++ = *ptr++;
-        *dst++ = 0;
-        while (ptr < end && ptr[-1] != 10) ptr++;
-        }
-    do_gettimeofday(&table->timestamp);
-}
-
-static int get_radio_address(struct strip *strip_info, __u8 *p)
-{
-    MetricomAddress addr;
-
-    if (string_to_radio_address(&addr, p)) return(1);
-
-    /* See if our radio address has changed */
-    if (memcmp(strip_info->true_dev_addr.c, addr.c, sizeof(addr)))
-    {
-        MetricomAddressString addr_string;
-        radio_address_to_string(&addr, &addr_string);
-        printk(KERN_INFO "%s: Radio address = %s\n", strip_info->dev.name, addr_string.c);
-        strip_info->true_dev_addr = addr;
-        if (!strip_info->manual_dev_addr) *(MetricomAddress*)strip_info->dev.dev_addr = addr;
-        /* Give the radio a few seconds to get its head straight, then send an arp */
-        strip_info->gratuitous_arp = jiffies + 15 * HZ;
-        strip_info->arp_interval = 1 * HZ;
-    }
-    return(0);
+	table->num_nodes = 0;
+	while (ptr < end && table->num_nodes < NODE_TABLE_SIZE) {
+		MetricomNode *node = &table->node[table->num_nodes++];
+		char *dst = node->c, *limit = dst + sizeof(*node) - 1;
+		while (ptr < end && *ptr <= 32)
+			ptr++;
+		while (ptr < end && dst < limit && *ptr != 10)
+			*dst++ = *ptr++;
+		*dst++ = 0;
+		while (ptr < end && ptr[-1] != 10)
+			ptr++;
+	}
+	do_gettimeofday(&table->timestamp);
+}
+
+static int get_radio_address(struct strip *strip_info, __u8 * p)
+{
+	MetricomAddress addr;
+
+	if (string_to_radio_address(&addr, p))
+		return (1);
+
+	/* See if our radio address has changed */
+	if (memcmp(strip_info->true_dev_addr.c, addr.c, sizeof(addr))) {
+		MetricomAddressString addr_string;
+		radio_address_to_string(&addr, &addr_string);
+		printk(KERN_INFO "%s: Radio address = %s\n",
+		       strip_info->dev.name, addr_string.c);
+		strip_info->true_dev_addr = addr;
+		if (!strip_info->manual_dev_addr)
+			*(MetricomAddress *) strip_info->dev.dev_addr =
+			    addr;
+		/* Give the radio a few seconds to get its head straight, then send an arp */
+		strip_info->gratuitous_arp = jiffies + 15 * HZ;
+		strip_info->arp_interval = 1 * HZ;
+	}
+	return (0);
 }
 
 static int verify_checksum(struct strip *strip_info)
 {
-    __u8 *p = strip_info->sx_buff;
-    __u8 *end = strip_info->sx_buff + strip_info->sx_count - 4;
-    u_short sum = (READHEX16(end[0]) << 12) | (READHEX16(end[1]) << 8) |
-                  (READHEX16(end[2]) <<  4) | (READHEX16(end[3]));
-    while (p < end) sum -= *p++;
-    if (sum == 0 && strip_info->firmware_level == StructuredMessages)
-    {
-        strip_info->firmware_level = ChecksummedMessages;
-        printk(KERN_INFO "%s: Radio provides message checksums\n", strip_info->dev.name);
-    }
-    return(sum == 0);
+	__u8 *p = strip_info->sx_buff;
+	__u8 *end = strip_info->sx_buff + strip_info->sx_count - 4;
+	u_short sum =
+	    (READHEX16(end[0]) << 12) | (READHEX16(end[1]) << 8) |
+	    (READHEX16(end[2]) << 4) | (READHEX16(end[3]));
+	while (p < end)
+		sum -= *p++;
+	if (sum == 0 && strip_info->firmware_level == StructuredMessages) {
+		strip_info->firmware_level = ChecksummedMessages;
+		printk(KERN_INFO "%s: Radio provides message checksums\n",
+		       strip_info->dev.name);
+	}
+	return (sum == 0);
 }
 
 static void RecvErr(char *msg, struct strip *strip_info)
 {
-    __u8 *ptr = strip_info->sx_buff;
-    __u8 *end = strip_info->sx_buff + strip_info->sx_count;
-    DumpData(msg, strip_info, ptr, end);
-    strip_info->rx_errors++;
-}
-
-static void RecvErr_Message(struct strip *strip_info, __u8 *sendername, const __u8 *msg, u_long len)
-{
-    if (has_prefix(msg, len, "001")) /* Not in StarMode! */
-    {
-        RecvErr("Error Msg:", strip_info);
-        printk(KERN_INFO "%s: Radio %s is not in StarMode\n",
-            strip_info->dev.name, sendername);
-    }
-
-    else if (has_prefix(msg, len, "002")) /* Remap handle */
-    {
-	/* We ignore "Remap handle" messages for now */
-    }
-
-    else if (has_prefix(msg, len, "003")) /* Can't resolve name */
-    {
-        RecvErr("Error Msg:", strip_info);
-        printk(KERN_INFO "%s: Destination radio name is unknown\n",
-            strip_info->dev.name);
-    }
-
-    else if (has_prefix(msg, len, "004")) /* Name too small or missing */
-    {
-        strip_info->watchdog_doreset = jiffies + LongTime;
-#if TICKLE_TIMERS
-        {
-        struct timeval tv;
-        do_gettimeofday(&tv);
-        printk(KERN_INFO "**** Got ERR_004 response         at %02d.%06d\n",
-            tv.tv_sec % 100, tv.tv_usec);
-        }
-#endif
-        if (!strip_info->working)
-        {
-            strip_info->working = TRUE;
-            printk(KERN_INFO "%s: Radio now in starmode\n", strip_info->dev.name);
-            /*
-             * If the radio has just entered a working state, we should do our first
-             * probe ASAP, so that we find out our radio address etc. without delay.
-             */
-            strip_info->watchdog_doprobe = jiffies;
-        }
-        if (strip_info->firmware_level == NoStructure && sendername)
-        {
-            strip_info->firmware_level = StructuredMessages;
-            strip_info->next_command   = 0; /* Try to enable checksums ASAP */
-            printk(KERN_INFO "%s: Radio provides structured messages\n", strip_info->dev.name);
-        }
-        if (strip_info->firmware_level >= StructuredMessages)
-        {
-            /*
-             * If this message has a valid checksum on the end, then the call to verify_checksum
-             * will elevate the firmware_level to ChecksummedMessages for us. (The actual return
-             * code from verify_checksum is ignored here.)
-             */
-            verify_checksum(strip_info);
-            /*
-             * If the radio has structured messages but we don't yet have all our information about it,
-             * we should do probes without delay, until we have gathered all the information
-             */
-            if (!GOT_ALL_RADIO_INFO(strip_info)) strip_info->watchdog_doprobe = jiffies;
-        }
-    }
-
-    else if (has_prefix(msg, len, "005")) /* Bad count specification */
-        RecvErr("Error Msg:", strip_info);
-
-    else if (has_prefix(msg, len, "006")) /* Header too big */
-        RecvErr("Error Msg:", strip_info);
-
-    else if (has_prefix(msg, len, "007")) /* Body too big */
-    {
-        RecvErr("Error Msg:", strip_info);
-        printk(KERN_ERR "%s: Error! Packet size too big for radio.\n",
-            strip_info->dev.name);
-    }
-
-    else if (has_prefix(msg, len, "008")) /* Bad character in name */
-    {
-        RecvErr("Error Msg:", strip_info);
-        printk(KERN_ERR "%s: Radio name contains illegal character\n",
-            strip_info->dev.name);
-    }
-
-    else if (has_prefix(msg, len, "009")) /* No count or line terminator */
-        RecvErr("Error Msg:", strip_info);
-
-    else if (has_prefix(msg, len, "010")) /* Invalid checksum */
-        RecvErr("Error Msg:", strip_info);
-
-    else if (has_prefix(msg, len, "011")) /* Checksum didn't match */
-        RecvErr("Error Msg:", strip_info);
-
-    else if (has_prefix(msg, len, "012")) /* Failed to transmit packet */
-        RecvErr("Error Msg:", strip_info);
-
-    else
-        RecvErr("Error Msg:", strip_info);
-}
-
-static void process_AT_response(struct strip *strip_info, __u8 *ptr, __u8 *end)
-{
-    u_long len;
-    __u8 *p = ptr;
-    while (p < end && p[-1] != 10) p++; /* Skip past first newline character */
-    /* Now ptr points to the AT command, and p points to the text of the response. */
-    len = p-ptr;
+	__u8 *ptr = strip_info->sx_buff;
+	__u8 *end = strip_info->sx_buff + strip_info->sx_count;
+	DumpData(msg, strip_info, ptr, end);
+	strip_info->rx_errors++;
+}
+
+static void RecvErr_Message(struct strip *strip_info, __u8 * sendername,
+			    const __u8 * msg, u_long len)
+{
+	if (has_prefix(msg, len, "001")) {	/* Not in StarMode! */
+		RecvErr("Error Msg:", strip_info);
+		printk(KERN_INFO "%s: Radio %s is not in StarMode\n",
+		       strip_info->dev.name, sendername);
+	}
+
+	else if (has_prefix(msg, len, "002")) {	/* Remap handle */
+		/* We ignore "Remap handle" messages for now */
+	}
+
+	else if (has_prefix(msg, len, "003")) {	/* Can't resolve name */
+		RecvErr("Error Msg:", strip_info);
+		printk(KERN_INFO "%s: Destination radio name is unknown\n",
+		       strip_info->dev.name);
+	}
 
+	else if (has_prefix(msg, len, "004")) {	/* Name too small or missing */
+		strip_info->watchdog_doreset = jiffies + LongTime;
 #if TICKLE_TIMERS
-    {
-    struct timeval tv;
-    do_gettimeofday(&tv);
-    printk(KERN_INFO "**** Got AT response %.7s      at %02d.%06d\n",
-        ptr, tv.tv_sec % 100, tv.tv_usec);
-    }
+		{
+			struct timeval tv;
+			do_gettimeofday(&tv);
+			printk(KERN_INFO
+			       "**** Got ERR_004 response         at %02d.%06d\n",
+			       tv.tv_sec % 100, tv.tv_usec);
+		}
 #endif
+		if (!strip_info->working) {
+			strip_info->working = TRUE;
+			printk(KERN_INFO "%s: Radio now in starmode\n",
+			       strip_info->dev.name);
+			/*
+			 * If the radio has just entered a working state, we should do our first
+			 * probe ASAP, so that we find out our radio address etc. without delay.
+			 */
+			strip_info->watchdog_doprobe = jiffies;
+		}
+		if (strip_info->firmware_level == NoStructure && sendername) {
+			strip_info->firmware_level = StructuredMessages;
+			strip_info->next_command = 0;	/* Try to enable checksums ASAP */
+			printk(KERN_INFO
+			       "%s: Radio provides structured messages\n",
+			       strip_info->dev.name);
+		}
+		if (strip_info->firmware_level >= StructuredMessages) {
+			/*
+			 * If this message has a valid checksum on the end, then the call to verify_checksum
+			 * will elevate the firmware_level to ChecksummedMessages for us. (The actual return
+			 * code from verify_checksum is ignored here.)
+			 */
+			verify_checksum(strip_info);
+			/*
+			 * If the radio has structured messages but we don't yet have all our information about it,
+			 * we should do probes without delay, until we have gathered all the information
+			 */
+			if (!GOT_ALL_RADIO_INFO(strip_info))
+				strip_info->watchdog_doprobe = jiffies;
+		}
+	}
+
+	else if (has_prefix(msg, len, "005"))	/* Bad count specification */
+		RecvErr("Error Msg:", strip_info);
+
+	else if (has_prefix(msg, len, "006"))	/* Header too big */
+		RecvErr("Error Msg:", strip_info);
+
+	else if (has_prefix(msg, len, "007")) {	/* Body too big */
+		RecvErr("Error Msg:", strip_info);
+		printk(KERN_ERR
+		       "%s: Error! Packet size too big for radio.\n",
+		       strip_info->dev.name);
+	}
 
-    if      (has_prefix(ptr, len, "ATS300?" )) get_radio_version(strip_info, p, end);
-    else if (has_prefix(ptr, len, "ATS305?" )) get_radio_address(strip_info, p);
-    else if (has_prefix(ptr, len, "ATS311?" )) get_radio_neighbours(&strip_info->poletops, p, end);
-    else if (has_prefix(ptr, len, "ATS319=7")) verify_checksum(strip_info);
-    else if (has_prefix(ptr, len, "ATS325?" )) get_radio_voltage(strip_info, p, end);
-    else if (has_prefix(ptr, len, "AT~LA"   )) get_radio_neighbours(&strip_info->portables, p, end);
-    else                                       RecvErr("Unknown AT Response:", strip_info);
+	else if (has_prefix(msg, len, "008")) {	/* Bad character in name */
+		RecvErr("Error Msg:", strip_info);
+		printk(KERN_ERR
+		       "%s: Radio name contains illegal character\n",
+		       strip_info->dev.name);
+	}
+
+	else if (has_prefix(msg, len, "009"))	/* No count or line terminator */
+		RecvErr("Error Msg:", strip_info);
+
+	else if (has_prefix(msg, len, "010"))	/* Invalid checksum */
+		RecvErr("Error Msg:", strip_info);
+
+	else if (has_prefix(msg, len, "011"))	/* Checksum didn't match */
+		RecvErr("Error Msg:", strip_info);
+
+	else if (has_prefix(msg, len, "012"))	/* Failed to transmit packet */
+		RecvErr("Error Msg:", strip_info);
+
+	else
+		RecvErr("Error Msg:", strip_info);
 }
 
-static void process_ACK(struct strip *strip_info, __u8 *ptr, __u8 *end)
+static void process_AT_response(struct strip *strip_info, __u8 * ptr,
+				__u8 * end)
+{
+	u_long len;
+	__u8 *p = ptr;
+	while (p < end && p[-1] != 10)
+		p++;		/* Skip past first newline character */
+	/* Now ptr points to the AT command, and p points to the text of the response. */
+	len = p - ptr;
+
+#if TICKLE_TIMERS
+	{
+		struct timeval tv;
+		do_gettimeofday(&tv);
+		printk(KERN_INFO "**** Got AT response %.7s      at %02d.%06d\n",
+		       ptr, tv.tv_sec % 100, tv.tv_usec);
+	}
+#endif
+
+	if (has_prefix(ptr, len, "ATS300?"))
+		get_radio_version(strip_info, p, end);
+	else if (has_prefix(ptr, len, "ATS305?"))
+		get_radio_address(strip_info, p);
+	else if (has_prefix(ptr, len, "ATS311?"))
+		get_radio_neighbours(&strip_info->poletops, p, end);
+	else if (has_prefix(ptr, len, "ATS319=7"))
+		verify_checksum(strip_info);
+	else if (has_prefix(ptr, len, "ATS325?"))
+		get_radio_voltage(strip_info, p, end);
+	else if (has_prefix(ptr, len, "AT~LA"))
+		get_radio_neighbours(&strip_info->portables, p, end);
+	else
+		RecvErr("Unknown AT Response:", strip_info);
+}
+
+static void process_ACK(struct strip *strip_info, __u8 * ptr, __u8 * end)
 {
-    /* Currently we don't do anything with ACKs from the radio */
+	/* Currently we don't do anything with ACKs from the radio */
 }
 
-static void process_Info(struct strip *strip_info, __u8 *ptr, __u8 *end)
+static void process_Info(struct strip *strip_info, __u8 * ptr, __u8 * end)
 {
-    if (ptr+16 > end) RecvErr("Bad Info Msg:", strip_info);
+	if (ptr + 16 > end)
+		RecvErr("Bad Info Msg:", strip_info);
 }
 
 static struct net_device *get_strip_dev(struct strip *strip_info)
 {
-    /* If our hardware address is *manually set* to zero, and we know our */
-    /* real radio hardware address, try to find another strip device that has been */
-    /* manually set to that address that we can 'transfer ownership' of this packet to  */
-    if (strip_info->manual_dev_addr &&
-        !memcmp(strip_info->dev.dev_addr, zero_address.c, sizeof(zero_address)) &&
-        memcmp(&strip_info->true_dev_addr, zero_address.c, sizeof(zero_address)))
-    {
-        struct net_device *dev;
-	read_lock_bh(&dev_base_lock);
-	dev = dev_base;
-        while (dev)
-        {
-            if (dev->type == strip_info->dev.type &&
-                !memcmp(dev->dev_addr, &strip_info->true_dev_addr, sizeof(MetricomAddress)))
-            {
-                printk(KERN_INFO "%s: Transferred packet ownership to %s.\n",
-                    strip_info->dev.name, dev->name);
+	/* If our hardware address is *manually set* to zero, and we know our */
+	/* real radio hardware address, try to find another strip device that has been */
+	/* manually set to that address that we can 'transfer ownership' of this packet to  */
+	if (strip_info->manual_dev_addr &&
+	    !memcmp(strip_info->dev.dev_addr, zero_address.c,
+		    sizeof(zero_address))
+	    && memcmp(&strip_info->true_dev_addr, zero_address.c,
+		      sizeof(zero_address))) {
+		struct net_device *dev;
+		read_lock_bh(&dev_base_lock);
+		dev = dev_base;
+		while (dev) {
+			if (dev->type == strip_info->dev.type &&
+			    !memcmp(dev->dev_addr,
+				    &strip_info->true_dev_addr,
+				    sizeof(MetricomAddress))) {
+				printk(KERN_INFO
+				       "%s: Transferred packet ownership to %s.\n",
+				       strip_info->dev.name, dev->name);
+				read_unlock_bh(&dev_base_lock);
+				return (dev);
+			}
+			dev = dev->next;
+		}
 		read_unlock_bh(&dev_base_lock);
-                return(dev);
-            }
-            dev = dev->next;
-        }
-	read_unlock_bh(&dev_base_lock);
-    }
-    return(&strip_info->dev);
+	}
+	return (&strip_info->dev);
 }
 
 /*
  * Send one completely decapsulated datagram to the next layer.
  */
 
-static void deliver_packet(struct strip *strip_info, STRIP_Header *header, __u16 packetlen)
+static void deliver_packet(struct strip *strip_info, STRIP_Header * header,
+			   __u16 packetlen)
 {
-    struct sk_buff *skb = dev_alloc_skb(sizeof(STRIP_Header) + packetlen);
-    if (!skb)
-    {
-        printk(KERN_ERR "%s: memory squeeze, dropping packet.\n", strip_info->dev.name);
-        strip_info->rx_dropped++;
-    }
-    else
-    {
-        memcpy(skb_put(skb, sizeof(STRIP_Header)), header, sizeof(STRIP_Header));
-        memcpy(skb_put(skb, packetlen), strip_info->rx_buff, packetlen);
-        skb->dev      = get_strip_dev(strip_info);
-        skb->protocol = header->protocol;
-        skb->mac.raw  = skb->data;
-
-        /* Having put a fake header on the front of the sk_buff for the */
-        /* benefit of tools like tcpdump, skb_pull now 'consumes' that  */
-        /* fake header before we hand the packet up to the next layer.  */
-        skb_pull(skb, sizeof(STRIP_Header));
-
-        /* Finally, hand the packet up to the next layer (e.g. IP or ARP, etc.) */
-        strip_info->rx_packets++;
-        strip_info->rx_pps_count++;
+	struct sk_buff *skb = dev_alloc_skb(sizeof(STRIP_Header) + packetlen);
+	if (!skb) {
+		printk(KERN_ERR "%s: memory squeeze, dropping packet.\n",
+		       strip_info->dev.name);
+		strip_info->rx_dropped++;
+	} else {
+		memcpy(skb_put(skb, sizeof(STRIP_Header)), header,
+		       sizeof(STRIP_Header));
+		memcpy(skb_put(skb, packetlen), strip_info->rx_buff,
+		       packetlen);
+		skb->dev = get_strip_dev(strip_info);
+		skb->protocol = header->protocol;
+		skb->mac.raw = skb->data;
+
+		/* Having put a fake header on the front of the sk_buff for the */
+		/* benefit of tools like tcpdump, skb_pull now 'consumes' that  */
+		/* fake header before we hand the packet up to the next layer.  */
+		skb_pull(skb, sizeof(STRIP_Header));
+
+		/* Finally, hand the packet up to the next layer (e.g. IP or ARP, etc.) */
+		strip_info->rx_packets++;
+		strip_info->rx_pps_count++;
 #ifdef EXT_COUNTERS
-        strip_info->rx_bytes += packetlen;
+		strip_info->rx_bytes += packetlen;
 #endif
-        skb->dev->last_rx = jiffies;
-        netif_rx(skb);
-    }
-}
-
-static void process_IP_packet(struct strip *strip_info, STRIP_Header *header, __u8 *ptr, __u8 *end)
-{
-    __u16 packetlen;
-
-    /* Decode start of the IP packet header */
-    ptr = UnStuffData(ptr, end, strip_info->rx_buff, 4);
-    if (!ptr)
-    {
-        RecvErr("IP Packet too short", strip_info);
-        return;
-    }
-
-    packetlen = ((__u16)strip_info->rx_buff[2] << 8) | strip_info->rx_buff[3];
-
-    if (packetlen > MAX_RECV_MTU)
-    {
-        printk(KERN_INFO "%s: Dropping oversized received IP packet: %d bytes\n",
-            strip_info->dev.name, packetlen);
-        strip_info->rx_dropped++;
-        return;
-    }
-
-    /*printk(KERN_INFO "%s: Got %d byte IP packet\n", strip_info->dev.name, packetlen);*/
-
-    /* Decode remainder of the IP packet */
-    ptr = UnStuffData(ptr, end, strip_info->rx_buff+4, packetlen-4);
-    if (!ptr)
-    {
-        RecvErr("IP Packet too short", strip_info);
-        return;
-    }
-
-    if (ptr < end)
-    {
-        RecvErr("IP Packet too long", strip_info);
-        return;
-    }
-
-    header->protocol = htons(ETH_P_IP);
-
-    deliver_packet(strip_info, header, packetlen);
-}
-
-static void process_ARP_packet(struct strip *strip_info, STRIP_Header *header, __u8 *ptr, __u8 *end)
-{
-    __u16 packetlen;
-    struct arphdr *arphdr = (struct arphdr *)strip_info->rx_buff;
-
-    /* Decode start of the ARP packet */
-    ptr = UnStuffData(ptr, end, strip_info->rx_buff, 8);
-    if (!ptr)
-    {
-        RecvErr("ARP Packet too short", strip_info);
-        return;
-    }
-
-    packetlen = 8 + (arphdr->ar_hln + arphdr->ar_pln) * 2;
-
-    if (packetlen > MAX_RECV_MTU)
-    {
-        printk(KERN_INFO "%s: Dropping oversized received ARP packet: %d bytes\n",
-            strip_info->dev.name, packetlen);
-        strip_info->rx_dropped++;
-        return;
-    }
-
-    /*printk(KERN_INFO "%s: Got %d byte ARP %s\n",
-        strip_info->dev.name, packetlen,
-        ntohs(arphdr->ar_op) == ARPOP_REQUEST ? "request" : "reply");*/
-
-    /* Decode remainder of the ARP packet */
-    ptr = UnStuffData(ptr, end, strip_info->rx_buff+8, packetlen-8);
-    if (!ptr)
-    {
-        RecvErr("ARP Packet too short", strip_info);
-        return;
-    }
-
-    if (ptr < end)
-    {
-        RecvErr("ARP Packet too long", strip_info);
-        return;
-    }
+		skb->dev->last_rx = jiffies;
+		netif_rx(skb);
+	}
+}
+
+static void process_IP_packet(struct strip *strip_info,
+			      STRIP_Header * header, __u8 * ptr,
+			      __u8 * end)
+{
+	__u16 packetlen;
+
+	/* Decode start of the IP packet header */
+	ptr = UnStuffData(ptr, end, strip_info->rx_buff, 4);
+	if (!ptr) {
+		RecvErr("IP Packet too short", strip_info);
+		return;
+	}
+
+	packetlen = ((__u16) strip_info->rx_buff[2] << 8) | strip_info->rx_buff[3];
+
+	if (packetlen > MAX_RECV_MTU) {
+		printk(KERN_INFO "%s: Dropping oversized received IP packet: %d bytes\n",
+		       strip_info->dev.name, packetlen);
+		strip_info->rx_dropped++;
+		return;
+	}
+
+	/*printk(KERN_INFO "%s: Got %d byte IP packet\n", strip_info->dev.name, packetlen); */
+
+	/* Decode remainder of the IP packet */
+	ptr =
+	    UnStuffData(ptr, end, strip_info->rx_buff + 4, packetlen - 4);
+	if (!ptr) {
+		RecvErr("IP Packet too short", strip_info);
+		return;
+	}
+
+	if (ptr < end) {
+		RecvErr("IP Packet too long", strip_info);
+		return;
+	}
 
-    header->protocol = htons(ETH_P_ARP);
+	header->protocol = htons(ETH_P_IP);
 
-    deliver_packet(strip_info, header, packetlen);
+	deliver_packet(strip_info, header, packetlen);
+}
+
+static void process_ARP_packet(struct strip *strip_info,
+			       STRIP_Header * header, __u8 * ptr,
+			       __u8 * end)
+{
+	__u16 packetlen;
+	struct arphdr *arphdr = (struct arphdr *) strip_info->rx_buff;
+
+	/* Decode start of the ARP packet */
+	ptr = UnStuffData(ptr, end, strip_info->rx_buff, 8);
+	if (!ptr) {
+		RecvErr("ARP Packet too short", strip_info);
+		return;
+	}
+
+	packetlen = 8 + (arphdr->ar_hln + arphdr->ar_pln) * 2;
+
+	if (packetlen > MAX_RECV_MTU) {
+		printk(KERN_INFO
+		       "%s: Dropping oversized received ARP packet: %d bytes\n",
+		       strip_info->dev.name, packetlen);
+		strip_info->rx_dropped++;
+		return;
+	}
+
+	/*printk(KERN_INFO "%s: Got %d byte ARP %s\n",
+	   strip_info->dev.name, packetlen,
+	   ntohs(arphdr->ar_op) == ARPOP_REQUEST ? "request" : "reply"); */
+
+	/* Decode remainder of the ARP packet */
+	ptr =
+	    UnStuffData(ptr, end, strip_info->rx_buff + 8, packetlen - 8);
+	if (!ptr) {
+		RecvErr("ARP Packet too short", strip_info);
+		return;
+	}
+
+	if (ptr < end) {
+		RecvErr("ARP Packet too long", strip_info);
+		return;
+	}
+
+	header->protocol = htons(ETH_P_ARP);
+
+	deliver_packet(strip_info, header, packetlen);
 }
 
 /*
@@ -2184,22 +2152,29 @@
  */
 static void process_text_message(struct strip *strip_info)
 {
-    __u8 *msg = strip_info->sx_buff;
-    int len   = strip_info->sx_count;
+	__u8 *msg = strip_info->sx_buff;
+	int len = strip_info->sx_count;
 
-    /* Check for anything that looks like it might be our radio name */
-    /* (This is here for backwards compatibility with old firmware)  */
-    if (len == 9 && get_radio_address(strip_info, msg) == 0) return;
-
-    if (text_equal(msg, len, "OK"      )) return; /* Ignore 'OK' responses from prior commands */
-    if (text_equal(msg, len, "ERROR"   )) return; /* Ignore 'ERROR' messages */
-    if (has_prefix(msg, len, "ate0q1"  )) return; /* Ignore character echo back from the radio */
-
-    /* Catch other error messages */
-    /* (This is here for backwards compatibility with old firmware) */
-    if (has_prefix(msg, len, "ERR_")) { RecvErr_Message(strip_info, NULL, &msg[4], len-4); return; }
-    
-    RecvErr("No initial *", strip_info);
+	/* Check for anything that looks like it might be our radio name */
+	/* (This is here for backwards compatibility with old firmware)  */
+	if (len == 9 && get_radio_address(strip_info, msg) == 0)
+		return;
+
+	if (text_equal(msg, len, "OK"))
+		return;		/* Ignore 'OK' responses from prior commands */
+	if (text_equal(msg, len, "ERROR"))
+		return;		/* Ignore 'ERROR' messages */
+	if (has_prefix(msg, len, "ate0q1"))
+		return;		/* Ignore character echo back from the radio */
+
+	/* Catch other error messages */
+	/* (This is here for backwards compatibility with old firmware) */
+	if (has_prefix(msg, len, "ERR_")) {
+		RecvErr_Message(strip_info, NULL, &msg[4], len - 4);
+		return;
+	}
+
+	RecvErr("No initial *", strip_info);
 }
 
 /*
@@ -2213,105 +2188,113 @@
  */
 static void process_message(struct strip *strip_info)
 {
-    STRIP_Header header = { zero_address, zero_address, 0 };
-    __u8 *ptr = strip_info->sx_buff;
-    __u8 *end = strip_info->sx_buff + strip_info->sx_count;
-    __u8 sendername[32], *sptr = sendername;
-    MetricomKey key;
-
-    /*HexDump("Receiving", strip_info, ptr, end);*/
-
-    /* Check for start of address marker, and then skip over it */
-    if (*ptr == '*') ptr++;
-    else { process_text_message(strip_info); return; }
-
-    /* Copy out the return address */
-    while (ptr < end && *ptr != '*' && sptr < ARRAY_END(sendername)-1) *sptr++ = *ptr++;
-    *sptr = 0;                /* Null terminate the sender name */
-
-    /* Check for end of address marker, and skip over it */
-    if (ptr >= end || *ptr != '*')
-    {
-        RecvErr("No second *", strip_info);
-        return;
-    }
-    ptr++; /* Skip the second '*' */
-
-    /* If the sender name is "&COMMAND", ignore this 'packet'       */
-    /* (This is here for backwards compatibility with old firmware) */
-    if (!strcmp(sendername, "&COMMAND"))
-    {
-        strip_info->firmware_level = NoStructure;
-        strip_info->next_command   = CompatibilityCommand;
-        return;
-    }
-
-    if (ptr+4 > end)
-    {
-        RecvErr("No proto key", strip_info);
-        return;
-    }
-
-    /* Get the protocol key out of the buffer */
-    key.c[0] = *ptr++;
-    key.c[1] = *ptr++;
-    key.c[2] = *ptr++;
-    key.c[3] = *ptr++;
-
-    /* If we're using checksums, verify the checksum at the end of the packet */
-    if (strip_info->firmware_level >= ChecksummedMessages)
-    {
-        end -= 4;	/* Chop the last four bytes off the packet (they're the checksum) */
-        if (ptr > end)
-        {
-            RecvErr("Missing Checksum", strip_info);
-            return;
-        }
-        if (!verify_checksum(strip_info))
-        {
-            RecvErr("Bad Checksum", strip_info);
-            return;
-        }
-    }
-
-    /*printk(KERN_INFO "%s: Got packet from \"%s\".\n", strip_info->dev.name, sendername);*/
-
-    /*
-     * Fill in (pseudo) source and destination addresses in the packet.
-     * We assume that the destination address was our address (the radio does not
-     * tell us this). If the radio supplies a source address, then we use it.
-     */
-    header.dst_addr = strip_info->true_dev_addr;
-    string_to_radio_address(&header.src_addr, sendername);
+	STRIP_Header header = { zero_address, zero_address, 0 };
+	__u8 *ptr = strip_info->sx_buff;
+	__u8 *end = strip_info->sx_buff + strip_info->sx_count;
+	__u8 sendername[32], *sptr = sendername;
+	MetricomKey key;
+
+	/*HexDump("Receiving", strip_info, ptr, end); */
+
+	/* Check for start of address marker, and then skip over it */
+	if (*ptr == '*')
+		ptr++;
+	else {
+		process_text_message(strip_info);
+		return;
+	}
+
+	/* Copy out the return address */
+	while (ptr < end && *ptr != '*'
+	       && sptr < ARRAY_END(sendername) - 1)
+		*sptr++ = *ptr++;
+	*sptr = 0;		/* Null terminate the sender name */
+
+	/* Check for end of address marker, and skip over it */
+	if (ptr >= end || *ptr != '*') {
+		RecvErr("No second *", strip_info);
+		return;
+	}
+	ptr++;			/* Skip the second '*' */
+
+	/* If the sender name is "&COMMAND", ignore this 'packet'       */
+	/* (This is here for backwards compatibility with old firmware) */
+	if (!strcmp(sendername, "&COMMAND")) {
+		strip_info->firmware_level = NoStructure;
+		strip_info->next_command = CompatibilityCommand;
+		return;
+	}
+
+	if (ptr + 4 > end) {
+		RecvErr("No proto key", strip_info);
+		return;
+	}
+
+	/* Get the protocol key out of the buffer */
+	key.c[0] = *ptr++;
+	key.c[1] = *ptr++;
+	key.c[2] = *ptr++;
+	key.c[3] = *ptr++;
+
+	/* If we're using checksums, verify the checksum at the end of the packet */
+	if (strip_info->firmware_level >= ChecksummedMessages) {
+		end -= 4;	/* Chop the last four bytes off the packet (they're the checksum) */
+		if (ptr > end) {
+			RecvErr("Missing Checksum", strip_info);
+			return;
+		}
+		if (!verify_checksum(strip_info)) {
+			RecvErr("Bad Checksum", strip_info);
+			return;
+		}
+	}
+
+	/*printk(KERN_INFO "%s: Got packet from \"%s\".\n", strip_info->dev.name, sendername); */
+
+	/*
+	 * Fill in (pseudo) source and destination addresses in the packet.
+	 * We assume that the destination address was our address (the radio does not
+	 * tell us this). If the radio supplies a source address, then we use it.
+	 */
+	header.dst_addr = strip_info->true_dev_addr;
+	string_to_radio_address(&header.src_addr, sendername);
 
 #ifdef EXT_COUNTERS
-    if      (key.l == SIP0Key.l) {
-      strip_info->rx_rbytes += (end - ptr);
-      process_IP_packet(strip_info, &header, ptr, end);
-    } else if (key.l == ARP0Key.l) {
-      strip_info->rx_rbytes += (end - ptr);
-      process_ARP_packet(strip_info, &header, ptr, end);
-    } else if (key.l == ATR_Key.l) {
-      strip_info->rx_ebytes += (end - ptr);
-      process_AT_response(strip_info, ptr, end);
-    } else if (key.l == ACK_Key.l) {
-      strip_info->rx_ebytes += (end - ptr);
-      process_ACK(strip_info, ptr, end);
-    } else if (key.l == INF_Key.l) {
-      strip_info->rx_ebytes += (end - ptr);
-      process_Info(strip_info, ptr, end);
-    } else if (key.l == ERR_Key.l) {
-      strip_info->rx_ebytes += (end - ptr);
-      RecvErr_Message(strip_info, sendername, ptr, end-ptr);
-    } else RecvErr("Unrecognized protocol key", strip_info);
+	if (key.l == SIP0Key.l) {
+		strip_info->rx_rbytes += (end - ptr);
+		process_IP_packet(strip_info, &header, ptr, end);
+	} else if (key.l == ARP0Key.l) {
+		strip_info->rx_rbytes += (end - ptr);
+		process_ARP_packet(strip_info, &header, ptr, end);
+	} else if (key.l == ATR_Key.l) {
+		strip_info->rx_ebytes += (end - ptr);
+		process_AT_response(strip_info, ptr, end);
+	} else if (key.l == ACK_Key.l) {
+		strip_info->rx_ebytes += (end - ptr);
+		process_ACK(strip_info, ptr, end);
+	} else if (key.l == INF_Key.l) {
+		strip_info->rx_ebytes += (end - ptr);
+		process_Info(strip_info, ptr, end);
+	} else if (key.l == ERR_Key.l) {
+		strip_info->rx_ebytes += (end - ptr);
+		RecvErr_Message(strip_info, sendername, ptr, end - ptr);
+	} else
+		RecvErr("Unrecognized protocol key", strip_info);
 #else
-    if      (key.l == SIP0Key.l) process_IP_packet  (strip_info, &header, ptr, end);
-    else if (key.l == ARP0Key.l) process_ARP_packet (strip_info, &header, ptr, end);
-    else if (key.l == ATR_Key.l) process_AT_response(strip_info, ptr, end);
-    else if (key.l == ACK_Key.l) process_ACK        (strip_info, ptr, end);
-    else if (key.l == INF_Key.l) process_Info       (strip_info, ptr, end);
-    else if (key.l == ERR_Key.l) RecvErr_Message    (strip_info, sendername, ptr, end-ptr);
-    else                         RecvErr("Unrecognized protocol key", strip_info);
+	if (key.l == SIP0Key.l)
+		process_IP_packet(strip_info, &header, ptr, end);
+	else if (key.l == ARP0Key.l)
+		process_ARP_packet(strip_info, &header, ptr, end);
+	else if (key.l == ATR_Key.l)
+		process_AT_response(strip_info, ptr, end);
+	else if (key.l == ACK_Key.l)
+		process_ACK(strip_info, ptr, end);
+	else if (key.l == INF_Key.l)
+		process_Info(strip_info, ptr, end);
+	else if (key.l == ERR_Key.l)
+		RecvErr_Message(strip_info, sendername, ptr, end - ptr);
+	else
+		RecvErr("Unrecognized protocol key", strip_info);
 #endif
 }
 
@@ -2327,121 +2310,140 @@
  * and sent on to some IP layer for further processing.
  */
 
-static void
-strip_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
+static void strip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
+		  char *fp, int count)
 {
-    struct strip *strip_info = (struct strip *) tty->disc_data;
-    const unsigned char *end = cp + count;
-
-    if (!strip_info || strip_info->magic != STRIP_MAGIC 
-    	|| !netif_running(&strip_info->dev))
-        return;
-
-    /* Argh! mtu change time! - costs us the packet part received at the change */
-    if (strip_info->mtu != strip_info->dev.mtu)
-        strip_changedmtu(strip_info);
+	struct strip *strip_info = (struct strip *) tty->disc_data;
+	const unsigned char *end = cp + count;
+	unsigned long flags;
+
+	if (!strip_info || strip_info->magic != STRIP_MAGIC
+	    || !netif_running(&strip_info->dev))
+		return;
+
+	spin_lock_irqsave(&strip_lock, flags);
+
+	/* Argh! mtu change time! - costs us the packet part received at the change */
+	if (strip_info->mtu != strip_info->dev.mtu)
+		strip_changedmtu(strip_info);
 
 #if 0
-    {
-    struct timeval tv;
-    do_gettimeofday(&tv);
-    printk(KERN_INFO "**** strip_receive_buf: %3d bytes at %02d.%06d\n",
-        count, tv.tv_sec % 100, tv.tv_usec);
-    }
+	{
+		struct timeval tv;
+		do_gettimeofday(&tv);
+		printk(KERN_INFO
+		       "**** strip_receive_buf: %3d bytes at %02d.%06d\n",
+		       count, tv.tv_sec % 100, tv.tv_usec);
+	}
 #endif
 
 #ifdef EXT_COUNTERS
-    strip_info->rx_sbytes += count;
+	strip_info->rx_sbytes += count;
 #endif
 
-    /* Read the characters out of the buffer */
-    while (cp < end)
-    {
-        if (fp && *fp) printk(KERN_INFO "%s: %s on serial port\n", strip_info->dev.name, TTYERROR(*fp));
-        if (fp && *fp++ && !strip_info->discard) /* If there's a serial error, record it */
-        {
-            /* If we have some characters in the buffer, discard them */
-            strip_info->discard = strip_info->sx_count;
-            strip_info->rx_errors++;
-        }
-
-        /* Leading control characters (CR, NL, Tab, etc.) are ignored */
-        if (strip_info->sx_count > 0 || *cp >= ' ')
-        {
-            if (*cp == 0x0D)                /* If end of packet, decide what to do with it */
-            {
-                if (strip_info->sx_count > 3000)
-                    printk(KERN_INFO "%s: Cut a %d byte packet (%d bytes remaining)%s\n",
-                        strip_info->dev.name, strip_info->sx_count, end-cp-1,
-                        strip_info->discard ? " (discarded)" : "");
-                if (strip_info->sx_count > strip_info->sx_size)
-                {
-                    strip_info->rx_over_errors++;
-                    printk(KERN_INFO "%s: sx_buff overflow (%d bytes total)\n",
-                           strip_info->dev.name, strip_info->sx_count);
-                }
-                else if (strip_info->discard)
-                    printk(KERN_INFO "%s: Discarding bad packet (%d/%d)\n",
-                        strip_info->dev.name, strip_info->discard, strip_info->sx_count);
-                else process_message(strip_info);
-                strip_info->discard = 0;
-                strip_info->sx_count = 0;
-            }
-            else
-            {
-                /* Make sure we have space in the buffer */
-                if (strip_info->sx_count < strip_info->sx_size)
-                    strip_info->sx_buff[strip_info->sx_count] = *cp;
-                strip_info->sx_count++;
-            }
-        }
-        cp++;
-    }
+	/* Read the characters out of the buffer */
+	while (cp < end) {
+		if (fp && *fp)
+			printk(KERN_INFO "%s: %s on serial port\n",
+			       strip_info->dev.name, TTYERROR(*fp));
+		if (fp && *fp++ && !strip_info->discard) {	/* If there's a serial error, record it */
+			/* If we have some characters in the buffer, discard them */
+			strip_info->discard = strip_info->sx_count;
+			strip_info->rx_errors++;
+		}
+
+		/* Leading control characters (CR, NL, Tab, etc.) are ignored */
+		if (strip_info->sx_count > 0 || *cp >= ' ') {
+			if (*cp == 0x0D) {	/* If end of packet, decide what to do with it */
+				if (strip_info->sx_count > 3000)
+					printk(KERN_INFO
+					       "%s: Cut a %d byte packet (%d bytes remaining)%s\n",
+					       strip_info->dev.name,
+					       strip_info->sx_count,
+					       end - cp - 1,
+					       strip_info->
+					       discard ? " (discarded)" :
+					       "");
+				if (strip_info->sx_count >
+				    strip_info->sx_size) {
+					strip_info->rx_over_errors++;
+					printk(KERN_INFO
+					       "%s: sx_buff overflow (%d bytes total)\n",
+					       strip_info->dev.name,
+					       strip_info->sx_count);
+				} else if (strip_info->discard)
+					printk(KERN_INFO
+					       "%s: Discarding bad packet (%d/%d)\n",
+					       strip_info->dev.name,
+					       strip_info->discard,
+					       strip_info->sx_count);
+				else
+					process_message(strip_info);
+				strip_info->discard = 0;
+				strip_info->sx_count = 0;
+			} else {
+				/* Make sure we have space in the buffer */
+				if (strip_info->sx_count <
+				    strip_info->sx_size)
+					strip_info->sx_buff[strip_info->
+							    sx_count] =
+					    *cp;
+				strip_info->sx_count++;
+			}
+		}
+		cp++;
+	}
+	spin_unlock_irqrestore(&strip_lock, flags);
 }
 
 
 /************************************************************************/
 /* General control routines						*/
 
-static int set_mac_address(struct strip *strip_info, MetricomAddress *addr)
+static int set_mac_address(struct strip *strip_info,
+			   MetricomAddress * addr)
 {
-    /*
-     * We're using a manually specified address if the address is set
-     * to anything other than all ones. Setting the address to all ones
-     * disables manual mode and goes back to automatic address determination
-     * (tracking the true address that the radio has).
-     */
-    strip_info->manual_dev_addr = memcmp(addr->c, broadcast_address.c, sizeof(broadcast_address));
-    if (strip_info->manual_dev_addr)
-         *(MetricomAddress*)strip_info->dev.dev_addr = *addr;
-    else *(MetricomAddress*)strip_info->dev.dev_addr = strip_info->true_dev_addr;
-    return 0;
+	/*
+	 * We're using a manually specified address if the address is set
+	 * to anything other than all ones. Setting the address to all ones
+	 * disables manual mode and goes back to automatic address determination
+	 * (tracking the true address that the radio has).
+	 */
+	strip_info->manual_dev_addr =
+	    memcmp(addr->c, broadcast_address.c,
+		   sizeof(broadcast_address));
+	if (strip_info->manual_dev_addr)
+		*(MetricomAddress *) strip_info->dev.dev_addr = *addr;
+	else
+		*(MetricomAddress *) strip_info->dev.dev_addr =
+		    strip_info->true_dev_addr;
+	return 0;
 }
 
 static int dev_set_mac_address(struct net_device *dev, void *addr)
 {
-    struct strip *strip_info = (struct strip *)(dev->priv);
-    struct sockaddr *sa = addr;
-    printk(KERN_INFO "%s: strip_set_dev_mac_address called\n", dev->name);
-    set_mac_address(strip_info, (MetricomAddress *)sa->sa_data);
-    return 0;
+	struct strip *strip_info = (struct strip *) (dev->priv);
+	struct sockaddr *sa = addr;
+	printk(KERN_INFO "%s: strip_set_dev_mac_address called\n", dev->name);
+	set_mac_address(strip_info, (MetricomAddress *) sa->sa_data);
+	return 0;
 }
 
 static struct net_device_stats *strip_get_stats(struct net_device *dev)
 {
-    static struct net_device_stats stats;
-    struct strip *strip_info = (struct strip *)(dev->priv);
+	static struct net_device_stats stats;
+	struct strip *strip_info = (struct strip *) (dev->priv);
 
-    memset(&stats, 0, sizeof(struct net_device_stats));
+	memset(&stats, 0, sizeof(struct net_device_stats));
 
-    stats.rx_packets     = strip_info->rx_packets;
-    stats.tx_packets     = strip_info->tx_packets;
-    stats.rx_dropped     = strip_info->rx_dropped;
-    stats.tx_dropped     = strip_info->tx_dropped;
-    stats.tx_errors      = strip_info->tx_errors;
-    stats.rx_errors      = strip_info->rx_errors;
-    stats.rx_over_errors = strip_info->rx_over_errors;
-    return(&stats);
+	stats.rx_packets = strip_info->rx_packets;
+	stats.tx_packets = strip_info->tx_packets;
+	stats.rx_dropped = strip_info->rx_dropped;
+	stats.tx_dropped = strip_info->tx_dropped;
+	stats.tx_errors = strip_info->tx_errors;
+	stats.rx_errors = strip_info->rx_errors;
+	stats.rx_over_errors = strip_info->rx_over_errors;
+	return (&stats);
 }
 
 
@@ -2474,43 +2476,30 @@
 
 static int strip_open_low(struct net_device *dev)
 {
-    struct strip *strip_info = (struct strip *)(dev->priv);
-#if 0
-    struct in_device *in_dev = dev->ip_ptr;
-#endif
-
-    if (strip_info->tty == NULL)
-        return(-ENODEV);
-
-    if (!allocate_buffers(strip_info))
-        return(-ENOMEM);
+	struct strip *strip_info = (struct strip *) (dev->priv);
 
-    strip_info->sx_count = 0;
-    strip_info->tx_left  = 0;
+	if (strip_info->tty == NULL)
+		return (-ENODEV);
 
-    strip_info->discard  = 0;
-    strip_info->working  = FALSE;
-    strip_info->firmware_level = NoStructure;
-    strip_info->next_command   = CompatibilityCommand;
-    strip_info->user_baud      = get_baud(strip_info->tty);
+	if (!allocate_buffers(strip_info))
+		return (-ENOMEM);
 
-#if 0
-    /*
-     * Needed because address '0' is special
-     *
-     * --ANK Needed it or not needed, it does not matter at all.
-     *	     Make it at user level, guys.
-     */
-
-    if (in_dev->ifa_list->ifa_address == 0)
-        in_dev->ifa_list->ifa_address = ntohl(0xC0A80001);
-#endif
-    printk(KERN_INFO "%s: Initializing Radio.\n", strip_info->dev.name);
-    ResetRadio(strip_info);
-    strip_info->idle_timer.expires = jiffies + 1*HZ;
-    add_timer(&strip_info->idle_timer);
-    netif_wake_queue(dev);
-    return(0);
+	strip_info->sx_count = 0;
+	strip_info->tx_left = 0;
+
+	strip_info->discard = 0;
+	strip_info->working = FALSE;
+	strip_info->firmware_level = NoStructure;
+	strip_info->next_command = CompatibilityCommand;
+	strip_info->user_baud = get_baud(strip_info->tty);
+
+	printk(KERN_INFO "%s: Initializing Radio.\n",
+	       strip_info->dev.name);
+	ResetRadio(strip_info);
+	strip_info->idle_timer.expires = jiffies + 1 * HZ;
+	add_timer(&strip_info->idle_timer);
+	netif_wake_queue(dev);
+	return (0);
 }
 
 
@@ -2520,34 +2509,31 @@
 
 static int strip_close_low(struct net_device *dev)
 {
-    struct strip *strip_info = (struct strip *)(dev->priv);
+	struct strip *strip_info = (struct strip *) (dev->priv);
+
+	if (strip_info->tty == NULL)
+		return -EBUSY;
+	strip_info->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
 
-    if (strip_info->tty == NULL)
-        return -EBUSY;
-    strip_info->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
-
-    netif_stop_queue(dev);
-    
-    /*
-     * Free all STRIP frame buffers.
-     */
-    if (strip_info->rx_buff)
-    {
-        kfree(strip_info->rx_buff);
-        strip_info->rx_buff = NULL;
-    }
-    if (strip_info->sx_buff)
-    {
-        kfree(strip_info->sx_buff);
-        strip_info->sx_buff = NULL;
-    }
-    if (strip_info->tx_buff)
-    {
-        kfree(strip_info->tx_buff);
-        strip_info->tx_buff = NULL;
-    }
-    del_timer(&strip_info->idle_timer);
-    return 0;
+	netif_stop_queue(dev);
+
+	/*
+	 * Free all STRIP frame buffers.
+	 */
+	if (strip_info->rx_buff) {
+		kfree(strip_info->rx_buff);
+		strip_info->rx_buff = NULL;
+	}
+	if (strip_info->sx_buff) {
+		kfree(strip_info->sx_buff);
+		strip_info->sx_buff = NULL;
+	}
+	if (strip_info->tx_buff) {
+		kfree(strip_info->tx_buff);
+		strip_info->tx_buff = NULL;
+	}
+	del_timer(&strip_info->idle_timer);
+	return 0;
 }
 
 /*
@@ -2557,38 +2543,38 @@
 
 static int strip_dev_init(struct net_device *dev)
 {
-    /*
-     * Finish setting up the DEVICE info.
-     */
-
-    dev->trans_start        = 0;
-    dev->last_rx            = 0;
-    dev->tx_queue_len       = 30;         /* Drop after 30 frames queued */
-
-    dev->flags              = 0;
-    dev->mtu                = DEFAULT_STRIP_MTU;
-    dev->type               = ARPHRD_METRICOM;        /* dtang */
-    dev->hard_header_len    = sizeof(STRIP_Header);
-    /*
-     *  dev->priv             Already holds a pointer to our struct strip
-     */
-
-    *(MetricomAddress*)&dev->broadcast = broadcast_address;
-    dev->dev_addr[0]        = 0;
-    dev->addr_len           = sizeof(MetricomAddress);
-
-    /*
-     * Pointers to interface service routines.
-     */
-
-    dev->open               = strip_open_low;
-    dev->stop               = strip_close_low;
-    dev->hard_start_xmit    = strip_xmit;
-    dev->hard_header        = strip_header;
-    dev->rebuild_header     = strip_rebuild_header;
-    dev->set_mac_address    = dev_set_mac_address;
-    dev->get_stats          = strip_get_stats;
-    return 0;
+	/*
+	 * Finish setting up the DEVICE info.
+	 */
+
+	dev->trans_start = 0;
+	dev->last_rx = 0;
+	dev->tx_queue_len = 30;	/* Drop after 30 frames queued */
+
+	dev->flags = 0;
+	dev->mtu = DEFAULT_STRIP_MTU;
+	dev->type = ARPHRD_METRICOM;	/* dtang */
+	dev->hard_header_len = sizeof(STRIP_Header);
+	/*
+	 *  dev->priv             Already holds a pointer to our struct strip
+	 */
+
+	*(MetricomAddress *) & dev->broadcast = broadcast_address;
+	dev->dev_addr[0] = 0;
+	dev->addr_len = sizeof(MetricomAddress);
+
+	/*
+	 * Pointers to interface service routines.
+	 */
+
+	dev->open = strip_open_low;
+	dev->stop = strip_close_low;
+	dev->hard_start_xmit = strip_xmit;
+	dev->hard_header = strip_header;
+	dev->rebuild_header = strip_rebuild_header;
+	dev->set_mac_address = dev_set_mac_address;
+	dev->get_stats = strip_get_stats;
+	return 0;
 }
 
 /*
@@ -2597,11 +2583,11 @@
 
 static void strip_free(struct strip *strip_info)
 {
-    *(strip_info->referrer) = strip_info->next;
-    if (strip_info->next)
-        strip_info->next->referrer = strip_info->referrer;
-    strip_info->magic = 0;
-    kfree(strip_info);
+	*(strip_info->referrer) = strip_info->next;
+	if (strip_info->next)
+		strip_info->next->referrer = strip_info->referrer;
+	strip_info->magic = 0;
+	kfree(strip_info);
 }
 
 /*
@@ -2610,59 +2596,58 @@
 
 static struct strip *strip_alloc(void)
 {
-    int channel_id = 0;
-    struct strip **s = &struct_strip_list;
-    struct strip *strip_info = (struct strip *)
-        kmalloc(sizeof(struct strip), GFP_KERNEL);
-
-    if (!strip_info)
-        return(NULL);        /* If no more memory, return */
-
-    /*
-     * Clear the allocated memory
-     */
-
-    memset(strip_info, 0, sizeof(struct strip));
-
-    /*
-     * Search the list to find where to put our new entry
-     * (and in the process decide what channel number it is
-     * going to be)
-     */
-
-    while (*s && (*s)->dev.base_addr == channel_id)
-    {
-        channel_id++;
-        s = &(*s)->next;
-    }
-
-    /*
-     * Fill in the link pointers
-     */
-
-    strip_info->next = *s;
-    if (*s)
-        (*s)->referrer = &strip_info->next;
-    strip_info->referrer = s;
-    *s = strip_info;
-
-    strip_info->magic = STRIP_MAGIC;
-    strip_info->tty   = NULL;
-
-    strip_info->gratuitous_arp   = jiffies + LongTime;
-    strip_info->arp_interval     = 0;
-    init_timer(&strip_info->idle_timer);
-    strip_info->idle_timer.data     = (long)&strip_info->dev;
-    strip_info->idle_timer.function = strip_IdleTask;
-
-    /* Note: strip_info->if_name is currently 8 characters long */
-    sprintf(strip_info->dev.name, "st%d", channel_id);
-    strip_info->dev.base_addr    = channel_id;
-    strip_info->dev.priv         = (void*)strip_info;
-    strip_info->dev.next         = NULL;
-    strip_info->dev.init         = strip_dev_init;
+	int channel_id = 0;
+	struct strip **s = &struct_strip_list;
+	struct strip *strip_info = (struct strip *)
+	    kmalloc(sizeof(struct strip), GFP_KERNEL);
+
+	if (!strip_info)
+		return NULL;	/* If no more memory, return */
+
+	/*
+	 * Clear the allocated memory
+	 */
 
-    return(strip_info);
+	memset(strip_info, 0, sizeof(struct strip));
+
+	/*
+	 * Search the list to find where to put our new entry
+	 * (and in the process decide what channel number it is
+	 * going to be)
+	 */
+
+	while (*s && (*s)->dev.base_addr == channel_id) {
+		channel_id++;
+		s = &(*s)->next;
+	}
+
+	/*
+	 * Fill in the link pointers
+	 */
+
+	strip_info->next = *s;
+	if (*s)
+		(*s)->referrer = &strip_info->next;
+	strip_info->referrer = s;
+	*s = strip_info;
+
+	strip_info->magic = STRIP_MAGIC;
+	strip_info->tty = NULL;
+
+	strip_info->gratuitous_arp = jiffies + LongTime;
+	strip_info->arp_interval = 0;
+	init_timer(&strip_info->idle_timer);
+	strip_info->idle_timer.data = (long) &strip_info->dev;
+	strip_info->idle_timer.function = strip_IdleTask;
+
+	/* Note: strip_info->if_name is currently 8 characters long */
+	sprintf(strip_info->dev.name, "st%d", channel_id);
+	strip_info->dev.base_addr = channel_id;
+	strip_info->dev.priv = (void *) strip_info;
+	strip_info->dev.next = NULL;
+	strip_info->dev.init = strip_dev_init;
+
+	return strip_info;
 }
 
 /*
@@ -2675,62 +2660,62 @@
 
 static int strip_open(struct tty_struct *tty)
 {
-    struct strip *strip_info = (struct strip *) tty->disc_data;
+	struct strip *strip_info = (struct strip *) tty->disc_data;
+
+	/*
+	 * First make sure we're not already connected.
+	 */
+
+	if (strip_info && strip_info->magic == STRIP_MAGIC)
+		return -EEXIST;
+
+	/*
+	 * OK.  Find a free STRIP channel to use.
+	 */
+	if ((strip_info = strip_alloc()) == NULL)
+		return -ENFILE;
+
+	/*
+	 * Register our newly created device so it can be ifconfig'd
+	 * strip_dev_init() will be called as a side-effect
+	 */
+
+	if (register_netdev(&strip_info->dev) != 0) {
+		printk(KERN_ERR "strip: register_netdev() failed.\n");
+		strip_free(strip_info);
+		return -ENFILE;
+	}
+
+	strip_info->tty = tty;
+	tty->disc_data = strip_info;
+	if (tty->driver.flush_buffer)
+		tty->driver.flush_buffer(tty);
+	if (tty->ldisc.flush_buffer)
+		tty->ldisc.flush_buffer(tty);
+
+	/*
+	 * Restore default settings
+	 */
+
+	strip_info->dev.type = ARPHRD_METRICOM;	/* dtang */
+
+	/*
+	 * Set tty options
+	 */
+
+	tty->termios->c_iflag |= IGNBRK | IGNPAR;	/* Ignore breaks and parity errors. */
+	tty->termios->c_cflag |= CLOCAL;	/* Ignore modem control signals. */
+	tty->termios->c_cflag &= ~HUPCL;	/* Don't close on hup */
+
+	MOD_INC_USE_COUNT;
 
-    /*
-     * First make sure we're not already connected.
-     */
-
-    if (strip_info && strip_info->magic == STRIP_MAGIC)
-        return -EEXIST;
-
-    /*
-     * OK.  Find a free STRIP channel to use.
-     */
-    if ((strip_info = strip_alloc()) == NULL)
-        return -ENFILE;
-
-    /*
-     * Register our newly created device so it can be ifconfig'd
-     * strip_dev_init() will be called as a side-effect
-     */
-
-    if (register_netdev(&strip_info->dev) != 0)
-    {
-        printk(KERN_ERR "strip: register_netdev() failed.\n");
-        strip_free(strip_info);
-        return -ENFILE;
-    }
-
-    strip_info->tty = tty;
-    tty->disc_data = strip_info;
-    if (tty->driver.flush_buffer)
-        tty->driver.flush_buffer(tty);
-    if (tty->ldisc.flush_buffer)
-        tty->ldisc.flush_buffer(tty);
-
-    /*
-     * Restore default settings
-     */
-
-    strip_info->dev.type = ARPHRD_METRICOM;    /* dtang */
-
-    /*
-     * Set tty options
-     */
-
-    tty->termios->c_iflag |= IGNBRK |IGNPAR;/* Ignore breaks and parity errors. */
-    tty->termios->c_cflag |= CLOCAL;    /* Ignore modem control signals. */
-    tty->termios->c_cflag &= ~HUPCL;    /* Don't close on hup */
-
-    MOD_INC_USE_COUNT;
-
-    printk(KERN_INFO "STRIP: device \"%s\" activated\n", strip_info->dev.name);
-
-    /*
-     * Done.  We have linked the TTY line to a channel.
-     */
-    return(strip_info->dev.base_addr);
+	printk(KERN_INFO "STRIP: device \"%s\" activated\n",
+	       strip_info->dev.name);
+
+	/*
+	 * Done.  We have linked the TTY line to a channel.
+	 */
+	return (strip_info->dev.base_addr);
 }
 
 /*
@@ -2742,23 +2727,24 @@
 
 static void strip_close(struct tty_struct *tty)
 {
-    struct strip *strip_info = (struct strip *) tty->disc_data;
+	struct strip *strip_info = (struct strip *) tty->disc_data;
+
+	/*
+	 * First make sure we're connected.
+	 */
+
+	if (!strip_info || strip_info->magic != STRIP_MAGIC)
+		return;
 
-    /*
-     * First make sure we're connected.
-     */
-
-    if (!strip_info || strip_info->magic != STRIP_MAGIC)
-        return;
-
-    unregister_netdev(&strip_info->dev);
-
-    tty->disc_data = 0;
-    strip_info->tty = NULL;
-    printk(KERN_INFO "STRIP: device \"%s\" closed down\n", strip_info->dev.name);
-    strip_free(strip_info);
-    tty->disc_data = NULL;
-    MOD_DEC_USE_COUNT;
+	unregister_netdev(&strip_info->dev);
+
+	tty->disc_data = 0;
+	strip_info->tty = NULL;
+	printk(KERN_INFO "STRIP: device \"%s\" closed down\n",
+	       strip_info->dev.name);
+	strip_free(strip_info);
+	tty->disc_data = NULL;
+	MOD_DEC_USE_COUNT;
 }
 
 
@@ -2766,45 +2752,43 @@
 /* Perform I/O control calls on an active STRIP channel.		*/
 
 static int strip_ioctl(struct tty_struct *tty, struct file *file,
-    unsigned int cmd, unsigned long arg)
+		       unsigned int cmd, unsigned long arg)
 {
-    struct strip *strip_info = (struct strip *) tty->disc_data;
+	struct strip *strip_info = (struct strip *) tty->disc_data;
+
+	/*
+	 * First make sure we're connected.
+	 */
+
+	if (!strip_info || strip_info->magic != STRIP_MAGIC)
+		return -EINVAL;
+
+	switch (cmd) {
+	case SIOCGIFNAME:
+		if(copy_to_user((void *) arg, strip_info->dev.name, strlen(strip_info->dev.name) + 1))
+			return -EFAULT;
+		break;
+	case SIOCSIFHWADDR:
+	{
+		MetricomAddress addr;
+		//printk(KERN_INFO "%s: SIOCSIFHWADDR\n", strip_info->dev.name);
+		if(copy_from_user(&addr, (void *) arg, sizeof(MetricomAddress)))
+			return -EFAULT;
+		return set_mac_address(strip_info, &addr);
+	}
+	/*
+	 * Allow stty to read, but not set, the serial port
+	 */
 
-    /*
-     * First make sure we're connected.
-     */
-
-    if (!strip_info || strip_info->magic != STRIP_MAGIC)
-        return -EINVAL;
-
-    switch(cmd)
-    {
-        case SIOCGIFNAME:
-	    return copy_to_user((void*)arg, strip_info->dev.name,
-				strlen(strip_info->dev.name) + 1) ? 
-		-EFAULT : 0;
-	    break;
-        case SIOCSIFHWADDR:
-            {
-            MetricomAddress addr;
-            printk(KERN_INFO "%s: SIOCSIFHWADDR\n", strip_info->dev.name);
-	    return copy_from_user(&addr, (void*)arg, sizeof(MetricomAddress)) ?
-		-EFAULT : set_mac_address(strip_info, &addr);
-	    break;
-	    }
-        /*
-         * Allow stty to read, but not set, the serial port
-         */
-
-        case TCGETS:
-        case TCGETA:
-            return n_tty_ioctl(tty, (struct file *) file, cmd,
-                (unsigned long) arg);
-	    break;
-        default:
-            return -ENOIOCTLCMD;
-	    break;
-    }
+	case TCGETS:
+	case TCGETA:
+		return n_tty_ioctl(tty, (struct file *) file, cmd, (unsigned long) arg);
+		break;
+	default:
+		return -ENOIOCTLCMD;
+		break;
+	}
+	return 0;
 }
 
 
@@ -2812,14 +2796,14 @@
 /* Initialization							*/
 
 static struct tty_ldisc strip_ldisc = {
-	.magic		= TTY_LDISC_MAGIC,
-	.name		= "strip",
-	.open		= strip_open,
-	.close		= strip_close,
-	.ioctl		= strip_ioctl,
-	.receive_buf	= strip_receive_buf,
-	.receive_room	= strip_receive_room,
-	.write_wakeup	= strip_write_some_more,
+	.magic = TTY_LDISC_MAGIC,
+	.name = "strip",
+	.open = strip_open,
+	.close = strip_close,
+	.ioctl = strip_ioctl,
+	.receive_buf = strip_receive_buf,
+	.receive_room = strip_receive_room,
+	.write_wakeup = strip_write_some_more,
 };
 
 /*
@@ -2828,45 +2812,52 @@
  * STRIP driver
  */
 
-static char signon[] __initdata = KERN_INFO "STRIP: Version %s (unlimited channels)\n";
+static char signon[] __initdata =
+    KERN_INFO "STRIP: Version %s (unlimited channels)\n";
 
 static int __init strip_init_driver(void)
 {
-    int status;
+	int status;
 
-    printk(signon, StripVersion);
+	printk(signon, StripVersion);
 
-    /*
-     * Fill in our line protocol discipline, and register it
-     */
-    if ((status = tty_register_ldisc(N_STRIP, &strip_ldisc)))
-        printk(KERN_ERR "STRIP: can't register line discipline (err = %d)\n", status);
-
-    /*
-     * Register the status file with /proc
-     */
-    proc_net_create("strip", S_IFREG | S_IRUGO, get_status_info);
+	spin_lock_init(&strip_lock);
+	
+	/*
+	 * Fill in our line protocol discipline, and register it
+	 */
+	if ((status = tty_register_ldisc(N_STRIP, &strip_ldisc)))
+		printk(KERN_ERR "STRIP: can't register line discipline (err = %d)\n",
+		       status);
 
-    return status;
+	/*
+	 * Register the status file with /proc
+	 */
+	proc_net_create("strip", S_IFREG | S_IRUGO, get_status_info);
+
+	return status;
 }
+
 module_init(strip_init_driver);
 
-static const char signoff[] __exitdata = KERN_INFO "STRIP: Module Unloaded\n";
+static const char signoff[] __exitdata =
+    KERN_INFO "STRIP: Module Unloaded\n";
 
 static void __exit strip_exit_driver(void)
 {
-    int i;
-    while (struct_strip_list)
-        strip_free(struct_strip_list);
+	int i;
+	while (struct_strip_list)
+		strip_free(struct_strip_list);
 
-    /* Unregister with the /proc/net file here. */
-    proc_net_remove("strip");
+	/* Unregister with the /proc/net file here. */
+	proc_net_remove("strip");
 
-    if ((i = tty_register_ldisc(N_STRIP, NULL)))
-        printk(KERN_ERR "STRIP: can't unregister line discipline (err = %d)\n", i);
+	if ((i = tty_register_ldisc(N_STRIP, NULL)))
+		printk(KERN_ERR "STRIP: can't unregister line discipline (err = %d)\n", i);
 
-    printk(signoff);
+	printk(signoff);
 }
+
 module_exit(strip_exit_driver);
 
 MODULE_AUTHOR("Stuart Cheshire <cheshire@cs.stanford.edu>");
@@ -2874,4 +2865,3 @@
 MODULE_LICENSE("Dual BSD/GPL");
 
 MODULE_SUPPORTED_DEVICE("Starmode Radio IP (STRIP) modem");
-
diff -Nru a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c
--- a/drivers/pcmcia/cardbus.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/pcmcia/cardbus.c	Sat Apr 19 19:51:29 2003
@@ -270,5 +270,6 @@
 {
 	struct pci_dev *bridge = s->cap.cb_dev;
 
-	pci_remove_behind_bridge(bridge);
+	if (bridge)
+		pci_remove_behind_bridge(bridge);
 }
diff -Nru a/drivers/pcmcia/sa1111_generic.h b/drivers/pcmcia/sa1111_generic.h
--- a/drivers/pcmcia/sa1111_generic.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/pcmcia/sa1111_generic.h	Sat Apr 19 19:51:50 2003
@@ -7,6 +7,7 @@
 extern void sa1111_pcmcia_socket_init(struct sa1100_pcmcia_socket *);
 extern void sa1111_pcmcia_socket_suspend(struct sa1100_pcmcia_socket *);
 
+extern int pcmcia_badge4_init(struct device *);
 extern int pcmcia_jornada720_init(struct device *);
 extern int pcmcia_neponset_init(struct device *);
 
diff -Nru a/drivers/pnp/isapnp/core.c b/drivers/pnp/isapnp/core.c
--- a/drivers/pnp/isapnp/core.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/pnp/isapnp/core.c	Sat Apr 19 19:51:48 2003
@@ -106,8 +106,6 @@
 
 /* some prototypes */
 
-extern struct pnp_protocol isapnp_protocol;
-
 static inline void write_data(unsigned char x)
 {
 	outb(x, _PNPWRP);
diff -Nru a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c
--- a/drivers/pnp/pnpbios/core.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/pnp/pnpbios/core.c	Sat Apr 19 19:51:28 2003
@@ -869,7 +869,7 @@
 
 /* PnP Layer support */
 
-static struct pnp_protocol pnpbios_protocol = {
+struct pnp_protocol pnpbios_protocol = {
 	.name	= "Plug and Play BIOS",
 	.get	= pnpbios_get_resources,
 	.set	= pnpbios_set_resources,
diff -Nru a/drivers/s390/Kconfig b/drivers/s390/Kconfig
--- a/drivers/s390/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/Kconfig	Sat Apr 19 19:51:50 2003
@@ -164,7 +164,7 @@
 
 config DASD_DIAG
 	tristate "Support for DIAG access to CMS reserved Disks"
-	depends on DASD
+	depends on DASD && ARCH_S390X = 'n'
 	help
 	  Select this option if you want to use CMS reserved Disks under VM
 	  with the Diagnose250 command.  If you are not running under VM or
diff -Nru a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
--- a/drivers/s390/block/dasd.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/s390/block/dasd.c	Sat Apr 19 19:51:47 2003
@@ -7,43 +7,12 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
- * $Revision: 1.74 $
- *
- * History of changes (starts July 2000)
- * 11/09/00 complete redesign after code review
- * 02/01/01 added dynamic registration of ioctls
- *	    fixed bug in registration of new majors
- *	    fixed handling of request during dasd_end_request
- *	    fixed handling of plugged queues
- *	    fixed partition handling and HDIO_GETGEO
- *	    fixed traditional naming scheme for devices beyond 702
- *	    fixed some race conditions related to modules
- *	    added devfs suupport
- * 03/06/01 refined dynamic attach/detach for leaving devices which are online.
- * 03/09/01 refined dynamic modifiaction of devices
- * 03/12/01 moved policy in dasd_format to dasdfmt (renamed BIODASDFORMAT)
- * 03/19/01 added BIODASDINFO-ioctl
- *	    removed 2.2 compatibility
- * 04/27/01 fixed PL030119COT (dasd_disciplines does not work)
- * 04/30/01 fixed PL030146HSM (module locking with dynamic ioctls)
- *	    fixed PL030130SBA (handling of invalid ranges)
- * 05/02/01 fixed PL030145SBA (killing dasdmt)
- *	    fixed PL030149SBA (status of 'accepted' devices)
- *	    fixed PL030146SBA (BUG in ibm.c after adding device)
- *	    added BIODASDPRRD ioctl interface
- * 05/11/01 fixed  PL030164MVE (trap in probeonly mode)
- * 05/15/01 fixed devfs support for unformatted devices
- * 06/26/01 hopefully fixed PL030172SBA,PL030234SBA
- * 07/09/01 fixed PL030324MSH (wrong statistics output)
- * 07/16/01 merged in new fixes for handling low-mem situations
- * 01/22/01 fixed PL030579KBE (wrong statistics)
- * 05/04/02 code restructuring.
+ * $Revision: 1.94 $
  */
 
 #define LOCAL_END_REQUEST /* Don't generate end_request in blk.h */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/kmod.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
@@ -83,12 +52,12 @@
 /*
  * SECTION: prototypes for static functions of dasd.c
  */
-static int  dasd_setup_blkdev(dasd_device_t * device);
-static void dasd_disable_blkdev(dasd_device_t * device);
-static void dasd_flush_request_queue(dasd_device_t *);
+static int  dasd_setup_blkdev(struct dasd_device * device);
+static void dasd_disable_blkdev(struct dasd_device * device);
+static void dasd_flush_request_queue(struct dasd_device *);
 static void dasd_int_handler(struct ccw_device *, unsigned long, struct irb *);
-static void dasd_flush_ccw_queue(dasd_device_t *, int);
-static void dasd_tasklet(dasd_device_t *);
+static void dasd_flush_ccw_queue(struct dasd_device *, int);
+static void dasd_tasklet(struct dasd_device *);
 static void do_kick_device(void *data);
 static int  dasd_add_sysfs_files(struct ccw_device *cdev);
 
@@ -100,18 +69,16 @@
 /*
  * Allocate memory for a new device structure.
  */
-dasd_device_t *
-dasd_alloc_device(dasd_devmap_t *devmap)
+struct dasd_device *
+dasd_alloc_device(unsigned int devindex)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	struct gendisk *gdp;
 
-	device = kmalloc(sizeof (dasd_device_t), GFP_ATOMIC);
+	device = kmalloc(sizeof (struct dasd_device), GFP_ATOMIC);
 	if (device == NULL)
 		return ERR_PTR(-ENOMEM);
-	memset(device, 0, sizeof (dasd_device_t));
-
-	device->devno = devmap->devno;
+	memset(device, 0, sizeof (struct dasd_device));
 
 	/* Get two pages for normal block device operations. */
 	device->ccw_mem = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA, 1);
@@ -128,12 +95,12 @@
 	}
 
 	/* Allocate gendisk structure for device. */
-	gdp = dasd_gendisk_alloc(devmap->devindex);
+	gdp = dasd_gendisk_alloc(devindex);
 	if (IS_ERR(gdp)) {
 		free_page((unsigned long) device->erp_mem);
 		free_pages((unsigned long) device->ccw_mem, 1);
 		kfree(device);
-		return (dasd_device_t *) gdp;
+		return (struct dasd_device *) gdp;
 	}
 	gdp->private_data = device;
 	device->gdp = gdp;
@@ -147,7 +114,7 @@
 		     (unsigned long) device);
 	INIT_LIST_HEAD(&device->ccw_queue);
 	init_timer(&device->timer);
-	INIT_WORK(&device->kick_work, do_kick_device, (void *) (addr_t) device->devno);
+	INIT_WORK(&device->kick_work, do_kick_device, device);
 	device->state = DASD_STATE_NEW;
 	device->target = DASD_STATE_NEW;
 
@@ -158,7 +125,7 @@
  * Free memory of a device structure.
  */
 void
-dasd_free_device(dasd_device_t *device)
+dasd_free_device(struct dasd_device *device)
 {
 	if (device->private)
 		kfree(device->private);
@@ -172,37 +139,38 @@
  * Make a new device known to the system.
  */
 static inline int
-dasd_state_new_to_known(dasd_device_t *device)
+dasd_state_new_to_known(struct dasd_device *device)
 {
-	dasd_devmap_t *devmap;
 	umode_t devfs_perm;
-	devfs_handle_t dir;
-	int major, minor;
+	kdev_t kdev;
 	char buf[20];
 
-	/* Increase reference count of bdev. */
-	if (bdget(MKDEV(device->gdp->major, device->gdp->first_minor)) == NULL)
+	kdev = dasd_get_kdev(device);
+	if (kdev_none(kdev))
 		return -ENODEV;
 
-	devmap = dasd_devmap_from_devno(device->devno);
-	if (devmap == NULL)
-		return -ENODEV;
-	major = dasd_gendisk_index_major(devmap->devindex);
-	if (major < 0)
-		return -ENODEV;
-	minor = devmap->devindex % DASD_PER_MAJOR;
+	/*
+	 * As long as the device is not in state DASD_STATE_NEW we want to 
+	 * keep the reference count > 0.
+	 */
+	dasd_get_device(device);
 
+#ifdef CONFIG_DEVFS_FS
 	/* Add a proc directory and the dasd device entry to devfs. */
- 	dir = devfs_mk_dir("dasd/%04x", device->devno);
-	device->gdp->de = dir;
+ 	sprintf(device->gdp->devfs_name, "dasd/%04x",
+		_ccw_device_get_device_number(device->cdev));
+#endif
+
 	if (device->ro_flag)
 		devfs_perm = S_IFBLK | S_IRUSR;
 	else
 		devfs_perm = S_IFBLK | S_IRUSR | S_IWUSR;
 
-	snprintf(buf, sizeof(buf), "dasd/%04x/device", device->devno);
+	snprintf(buf, sizeof(buf), "dasd/%04x/device",
+		 _ccw_device_get_device_number(device->cdev));
 	device->devfs_entry = devfs_register(NULL, buf, 0,
-					     major, minor << DASD_PARTN_BITS,
+					     major(kdev),
+					     minor(kdev) << DASD_PARTN_BITS,
 					     devfs_perm,
 					     &dasd_device_operations, NULL);
 	device->state = DASD_STATE_KNOWN;
@@ -213,10 +181,8 @@
  * Let the system forget about a device.
  */
 static inline void
-dasd_state_known_to_new(dasd_device_t * device)
+dasd_state_known_to_new(struct dasd_device * device)
 {
-	struct block_device *bdev;
-
 	/* Remove device entry and devfs directory. */
 	devfs_unregister(device->devfs_entry);
 	devfs_unregister(device->gdp->de);
@@ -225,17 +191,15 @@
 	device->discipline = NULL;
 	device->state = DASD_STATE_NEW;
 
-	/* Decrease reference count of bdev. */
-	bdev = bdget(MKDEV(device->gdp->major, device->gdp->first_minor));
-	bdput(bdev);
-	bdput(bdev);
+	/* Give up reference we took in dasd_state_new_to_known. */
+	dasd_put_device(device);
 }
 
 /*
  * Request the irq line for the device.
  */
 static inline int
-dasd_state_known_to_basic(dasd_device_t * device)
+dasd_state_known_to_basic(struct dasd_device * device)
 {
 	/* register 'device' debug area, used for all DBF_DEV_XXX calls */
 	device->debug_area = debug_register(device->gdp->disk_name, 0, 2,
@@ -252,7 +216,7 @@
  * Release the irq line for the device. Terminate any running i/o.
  */
 static inline void
-dasd_state_basic_to_known(dasd_device_t * device)
+dasd_state_basic_to_known(struct dasd_device * device)
 {
 	dasd_flush_ccw_queue(device, 1);
 	DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device);
@@ -274,7 +238,7 @@
  * discipline code, see dasd_eckd.c.
  */
 static inline int
-dasd_state_basic_to_accept(dasd_device_t * device)
+dasd_state_basic_to_accept(struct dasd_device * device)
 {
 	int rc;
 
@@ -290,7 +254,7 @@
  * Forget everything the initial analysis found out.
  */
 static inline void
-dasd_state_accept_to_basic(dasd_device_t * device)
+dasd_state_accept_to_basic(struct dasd_device * device)
 {
 	device->blocks = 0;
 	device->bp_block = 0;
@@ -302,7 +266,7 @@
  * Setup block device.
  */
 static inline int
-dasd_state_accept_to_ready(dasd_device_t * device)
+dasd_state_accept_to_ready(struct dasd_device * device)
 {
 	int rc;
 
@@ -318,7 +282,7 @@
  * Remove device from block device layer. Destroy dirty buffers.
  */
 static inline void
-dasd_state_ready_to_accept(dasd_device_t * device)
+dasd_state_ready_to_accept(struct dasd_device * device)
 {
 	dasd_flush_ccw_queue(device, 0);
 	dasd_destroy_partitions(device);
@@ -333,7 +297,7 @@
  * ccw queue.
  */
 static inline int
-dasd_state_ready_to_online(dasd_device_t * device)
+dasd_state_ready_to_online(struct dasd_device * device)
 {
 	device->state = DASD_STATE_ONLINE;
 	dasd_schedule_bh(device);
@@ -344,7 +308,7 @@
  * Stop the requeueing of requests again.
  */
 static inline void
-dasd_state_online_to_ready(dasd_device_t * device)
+dasd_state_online_to_ready(struct dasd_device * device)
 {
 	device->state = DASD_STATE_READY;
 }
@@ -353,7 +317,7 @@
  * Device startup state changes.
  */
 static inline int
-dasd_increase_state(dasd_device_t *device)
+dasd_increase_state(struct dasd_device *device)
 {
 	int rc;
 
@@ -385,7 +349,7 @@
  * Device shutdown state changes.
  */
 static inline int
-dasd_decrease_state(dasd_device_t *device)
+dasd_decrease_state(struct dasd_device *device)
 {
 	if (device->state == DASD_STATE_ONLINE &&
 	    device->target <= DASD_STATE_READY)
@@ -414,7 +378,7 @@
  * This is the main startup/shutdown routine.
  */
 static void
-dasd_change_state(dasd_device_t *device)
+dasd_change_state(struct dasd_device *device)
 {
         int rc;
 
@@ -428,7 +392,8 @@
         if (rc && rc != -EAGAIN) {
 		if (rc != -ENODEV)
 			MESSAGE (KERN_INFO, "giving up on dasd device with "
-				 "devno %04x", device->devno);
+				 "devno %04x",
+				 _ccw_device_get_device_number(device->cdev));
                 device->target = device->state;
         }
 
@@ -445,26 +410,18 @@
 static void
 do_kick_device(void *data)
 {
-	int devno;
-	dasd_devmap_t *devmap;
-	dasd_device_t *device;
+	struct dasd_device *device;
 
-	devno = (long) data;
-	devmap = dasd_devmap_from_devno(devno);
-	device = (devmap != NULL) ?
-		dasd_get_device(devmap) : ERR_PTR(-ENODEV);
-	if (IS_ERR(device))
-		return;
-	atomic_dec(&device->ref_count);
+	device = (struct dasd_device *) data;
 	dasd_change_state(device);
 	dasd_schedule_bh(device);
-	dasd_put_device(devmap);
+	dasd_put_device(device);
 }
 
 void
-dasd_kick_device(dasd_device_t *device)
+dasd_kick_device(struct dasd_device *device)
 {
-	atomic_inc(&device->ref_count);
+	dasd_get_device(device);
 	/* queue call to dasd_kick_device to the kernel event daemon. */
 	schedule_work(&device->kick_work);
 }
@@ -473,7 +430,7 @@
  * Set the target state for a device and starts the state change.
  */
 void
-dasd_set_target_state(dasd_device_t *device, int target)
+dasd_set_target_state(struct dasd_device *device, int target)
 {
 	/* If we are in probeonly mode stop at DASD_STATE_ACCEPT. */
 	if (dasd_probeonly && target > DASD_STATE_ACCEPT)
@@ -491,14 +448,14 @@
  * Enable devices with device numbers in [from..to].
  */
 static inline int
-_wait_for_device(dasd_device_t *device)
+_wait_for_device(struct dasd_device *device)
 {
 	return (device->state == device->target);
 }
 
 // FIXME: if called from dasd_devices_write discpline is not set -> oops.
 void
-dasd_enable_device(dasd_device_t *device)
+dasd_enable_device(struct dasd_device *device)
 {
 	dasd_set_target_state(device, DASD_STATE_ONLINE);
 	if (device->state <= DASD_STATE_KNOWN)
@@ -513,7 +470,7 @@
  */
 #ifdef CONFIG_DASD_PROFILE
 
-dasd_profile_info_t dasd_global_profile;
+struct dasd_profile_info_t dasd_global_profile;
 unsigned int dasd_profile_level = DASD_PROFILE_OFF;
 
 /*
@@ -531,7 +488,7 @@
  * Add profiling information for cqr before execution.
  */
 static inline void
-dasd_profile_start(dasd_device_t *device, dasd_ccw_req_t * cqr,
+dasd_profile_start(struct dasd_device *device, struct dasd_ccw_req * cqr,
 		   struct request *req)
 {
 	struct list_head *l;
@@ -553,7 +510,7 @@
  * Add profiling information for cqr after execution.
  */
 static inline void
-dasd_profile_end(dasd_device_t *device, dasd_ccw_req_t * cqr,
+dasd_profile_end(struct dasd_device *device, struct dasd_ccw_req * cqr,
 		 struct request *req)
 {
 	long strtime, irqtime, endtime, tottime;	/* in microseconds */
@@ -575,12 +532,14 @@
 	tottimeps = tottime / sectors;
 
 	if (!dasd_global_profile.dasd_io_reqs)
-		memset(&dasd_global_profile, 0, sizeof (dasd_profile_info_t));
+		memset(&dasd_global_profile, 0,
+		       sizeof (struct dasd_profile_info_t));
 	dasd_global_profile.dasd_io_reqs++;
 	dasd_global_profile.dasd_io_sects += sectors;
 
 	if (!device->profile.dasd_io_reqs)
-		memset(&device->profile, 0, sizeof (dasd_profile_info_t));
+		memset(&device->profile, 0,
+		       sizeof (struct dasd_profile_info_t));
 	device->profile.dasd_io_reqs++;
 	device->profile.dasd_io_sects += sectors;
 
@@ -604,11 +563,11 @@
  * memory and 2) dasd_smalloc_request uses the static ccw memory
  * that gets allocated for each device.
  */
-dasd_ccw_req_t *
+struct dasd_ccw_req *
 dasd_kmalloc_request(char *magic, int cplength, int datasize,
-		   dasd_device_t * device)
+		   struct dasd_device * device)
 {
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 
 	/* Sanity checks */
 	if ( magic == NULL || datasize > PAGE_SIZE ||
@@ -619,10 +578,10 @@
 	debug_int_event ( dasd_debug_area, 1, cplength);
 	debug_int_event ( dasd_debug_area, 1, datasize);
 
-	cqr = kmalloc(sizeof(dasd_ccw_req_t), GFP_ATOMIC);
+	cqr = kmalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC);
 	if (cqr == NULL)
 		return ERR_PTR(-ENOMEM);
-	memset(cqr, 0, sizeof(dasd_ccw_req_t));
+	memset(cqr, 0, sizeof(struct dasd_ccw_req));
 	cqr->cpaddr = NULL;
 	if (cplength > 0) {
 		cqr->cpaddr = kmalloc(cplength*sizeof(struct ccw1),
@@ -646,16 +605,16 @@
 	}
 	strncpy((char *) &cqr->magic, magic, 4);
 	ASCEBC((char *) &cqr->magic, 4);
-	atomic_inc(&device->ref_count);
+	dasd_get_device(device);
 	return cqr;
 }
 
-dasd_ccw_req_t *
+struct dasd_ccw_req *
 dasd_smalloc_request(char *magic, int cplength, int datasize,
-		   dasd_device_t * device)
+		   struct dasd_device * device)
 {
 	unsigned long flags;
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	char *data;
 	int size;
 
@@ -668,18 +627,19 @@
 	debug_int_event ( dasd_debug_area, 1, cplength);
 	debug_int_event ( dasd_debug_area, 1, datasize);
 
-	size = (sizeof(dasd_ccw_req_t) + 7L) & -8L;
+	size = (sizeof(struct dasd_ccw_req) + 7L) & -8L;
 	if (cplength > 0)
 		size += cplength * sizeof(struct ccw1);
 	if (datasize > 0)
 		size += datasize;
 	spin_lock_irqsave(&device->mem_lock, flags);
-	cqr = (dasd_ccw_req_t *) dasd_alloc_chunk(&device->ccw_chunks, size);
+	cqr = (struct dasd_ccw_req *)
+		dasd_alloc_chunk(&device->ccw_chunks, size);
 	spin_unlock_irqrestore(&device->mem_lock, flags);
 	if (cqr == NULL)
 		return ERR_PTR(-ENOMEM);
-	memset(cqr, 0, sizeof(dasd_ccw_req_t));
-	data = (char *) cqr + ((sizeof(dasd_ccw_req_t) + 7L) & -8L);
+	memset(cqr, 0, sizeof(struct dasd_ccw_req));
+	data = (char *) cqr + ((sizeof(struct dasd_ccw_req) + 7L) & -8L);
 	cqr->cpaddr = NULL;
 	if (cplength > 0) {
 		cqr->cpaddr = (struct ccw1 *) data;
@@ -693,17 +653,17 @@
 	}
 	strncpy((char *) &cqr->magic, magic, 4);
 	ASCEBC((char *) &cqr->magic, 4);
-	atomic_inc(&device->ref_count);
+	dasd_get_device(device);
 	return cqr;
 }
 
 /*
  * Free memory of a channel program. This function needs to free all the
  * idal lists that might have been created by dasd_set_cda and the
- * dasd_ccw_req_t itself.
+ * struct dasd_ccw_req itself.
  */
 void
-dasd_kfree_request(dasd_ccw_req_t * cqr, dasd_device_t * device)
+dasd_kfree_request(struct dasd_ccw_req * cqr, struct dasd_device * device)
 {
 #ifdef CONFIG_ARCH_S390X
 	struct ccw1 *ccw;
@@ -723,11 +683,11 @@
 	if (cqr->data != NULL)
 		kfree(cqr->data);
 	kfree(cqr);
-	atomic_dec(&device->ref_count);
+	dasd_put_device(device);
 }
 
 void
-dasd_sfree_request(dasd_ccw_req_t * cqr, dasd_device_t * device)
+dasd_sfree_request(struct dasd_ccw_req * cqr, struct dasd_device * device)
 {
 	unsigned long flags;
 
@@ -738,23 +698,23 @@
 	spin_lock_irqsave(&device->mem_lock, flags);
 	dasd_free_chunk(&device->ccw_chunks, cqr);
 	spin_unlock_irqrestore(&device->mem_lock, flags);
-	atomic_dec(&device->ref_count);
+	dasd_put_device(device);
 }
 
 /*
  * Check discipline magic in cqr.
  */
 static inline int
-dasd_check_cqr(dasd_ccw_req_t *cqr)
+dasd_check_cqr(struct dasd_ccw_req *cqr)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	if (cqr == NULL)
 		return -EINVAL;
 	device = cqr->device;
 	if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) {
 		DEV_MESSAGE(KERN_WARNING, device,
-			    " dasd_ccw_req_t 0x%08x magic doesn't match"
+			    " dasd_ccw_req 0x%08x magic doesn't match"
 			    " discipline 0x%08x",
 			    cqr->magic,
 			    *(unsigned int *) device->discipline->name);
@@ -769,9 +729,9 @@
  * is in a bad mood.
  */
 int
-dasd_term_IO(dasd_ccw_req_t * cqr)
+dasd_term_IO(struct dasd_ccw_req * cqr)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int retries, rc;
 
 	/* Check the cqr */
@@ -779,7 +739,7 @@
 	if (rc)
 		return rc;
 	retries = 0;
-	device = (dasd_device_t *) cqr->device;
+	device = (struct dasd_device *) cqr->device;
 	while ((retries < 5) && (cqr->status == DASD_CQR_IN_IO)) {
 		if (retries < 2)
 			rc = ccw_device_halt(device->cdev, (long) cqr);
@@ -821,16 +781,16 @@
  * In that case set up a timer to start the request later.
  */
 int
-dasd_start_IO(dasd_ccw_req_t * cqr)
+dasd_start_IO(struct dasd_ccw_req * cqr)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int rc;
 
 	/* Check the cqr */
 	rc = dasd_check_cqr(cqr);
 	if (rc)
 		return rc;
-	device = (dasd_device_t *) cqr->device;
+	device = (struct dasd_device *) cqr->device;
 	cqr->startclk = get_clock();
 	rc = ccw_device_start(device->cdev, cqr->cpaddr, (long) cqr,
 			      cqr->lpm, 0);
@@ -873,14 +833,15 @@
 dasd_timeout_device(unsigned long ptr)
 {
 	unsigned long flags;
-	dasd_device_t *device;
-	dasd_ccw_req_t *cqr;
+	struct dasd_device *device;
+	struct dasd_ccw_req *cqr;
 
-	device = (dasd_device_t *) ptr;
+	device = (struct dasd_device *) ptr;
 	spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
 	/* re-activate first request in queue */
 	if (!list_empty(&device->ccw_queue)) {
-		cqr = list_entry(device->ccw_queue.next, dasd_ccw_req_t, list);
+		cqr = list_entry(device->ccw_queue.next,
+				 struct dasd_ccw_req, list);
 		if (cqr->status == DASD_CQR_PENDING)
 			cqr->status = DASD_CQR_QUEUED;
 	}
@@ -892,7 +853,7 @@
  * Setup timeout for a device.
  */
 void
-dasd_set_timer(dasd_device_t *device, int expires)
+dasd_set_timer(struct dasd_device *device, int expires)
 {
 	/* FIXME: timeouts are based on jiffies but the timeout
 	 * comparision in __dasd_check_expire is based on the
@@ -916,7 +877,7 @@
  * Clear timeout for a device.
  */
 void
-dasd_clear_timer(dasd_device_t *device)
+dasd_clear_timer(struct dasd_device *device)
 {
 	if (timer_pending(&device->timer))
 		del_timer(&device->timer);
@@ -934,25 +895,21 @@
 {
 	struct {
 		struct work_struct work;
-		dasd_device_t *device;
+		struct dasd_device *device;
 	} *p;
-	dasd_devmap_t *devmap;
-	dasd_device_t *device;
-	dasd_ccw_req_t *cqr;
-	int devno;
+	struct dasd_device *device;
+	struct dasd_ccw_req *cqr;
 
 	p = data;
 	device = p->device;
 	DBF_EVENT(DBF_NOTICE, "State change Interrupt for bus_id %s",
 		  device->cdev->dev.bus_id);
 
-	// FIXME: get rid of devmap.
-	devno = _ccw_device_get_device_number(device->cdev);
-	devmap = dasd_devmap_from_devno(devno);
 	spin_lock_irq(get_ccwdev_lock(device->cdev));
 	/* re-activate first request in queue */
 	if (!list_empty(&device->ccw_queue)) {
-		cqr = list_entry(device->ccw_queue.next, dasd_ccw_req_t, list);
+		cqr = list_entry(device->ccw_queue.next,
+				 struct dasd_ccw_req, list);
 		if (cqr == NULL) {
 			MESSAGE (KERN_DEBUG,
 				 "got state change pending interrupt on"
@@ -965,17 +922,46 @@
 	}
 	spin_unlock_irq(get_ccwdev_lock(device->cdev));
 	dasd_schedule_bh(device);
-	dasd_put_device(devmap);
+	dasd_put_device(device);
 	kfree(p);
 }
 
+static void
+dasd_handle_killed_request(struct ccw_device *cdev, unsigned long intparm)
+{
+	struct dasd_ccw_req *cqr;
+	struct dasd_device *device;
+
+	cqr = (struct dasd_ccw_req *) intparm;
+	if (cqr->status != DASD_CQR_IN_IO) {
+		MESSAGE(KERN_DEBUG,
+			"invalid status: bus_id %s, status %02x",
+			cdev->dev.bus_id, cqr->status);
+		return;
+	}
+
+	device = (struct dasd_device *) cqr->device;
+	if (device == NULL ||
+	    device != cdev->dev.driver_data ||
+	    strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {
+		MESSAGE(KERN_DEBUG, "invalid device in request: bus_id %s",
+			cdev->dev.bus_id);
+		return;
+	}
+
+	/* Schedule request to be retried. */
+	cqr->status = DASD_CQR_QUEUED;
+
+	dasd_clear_timer(device);
+	dasd_schedule_bh(device);
+}
 
 static void
-dasd_handle_state_change_pending(dasd_device_t *device)
+dasd_handle_state_change_pending(struct dasd_device *device)
 {
 	struct {
 		struct work_struct work;
-		dasd_device_t *device;
+		struct dasd_device *device;
 	} *p;
 
 	p = kmalloc(sizeof(*p), GFP_ATOMIC);
@@ -984,8 +970,7 @@
 		return;
 	INIT_WORK(&p->work, (void *) do_state_change_pending, p);
 	p->device = device;
-	atomic_inc(&device->ref_count);
-	/* queue call to do_state_change_pending to the kernel event daemon. */
+	dasd_get_device(device);
 	schedule_work(&p->work);
 }
 
@@ -996,13 +981,30 @@
 dasd_int_handler(struct ccw_device *cdev, unsigned long intparm,
 		 struct irb *irb)
 {
-	dasd_ccw_req_t *cqr, *next;
-	dasd_device_t *device;
+	struct dasd_ccw_req *cqr, *next;
+	struct dasd_device *device;
 	unsigned long long now;
 	int expires;
 	dasd_era_t era;
 	char mask;
 
+	if (IS_ERR(irb)) {
+		switch (PTR_ERR(irb)) {
+		case -EIO:
+			dasd_handle_killed_request(cdev, intparm);
+			break;
+		case -ETIMEDOUT:
+			printk(KERN_WARNING"%s(%s): request timed out\n",
+			       __FUNCTION__, cdev->dev.bus_id);
+			//FIXME - dasd uses own timeout interface...
+			break;
+		default:
+			printk(KERN_WARNING"%s(%s): unknown error %ld\n",
+			       __FUNCTION__, cdev->dev.bus_id, PTR_ERR(irb));
+		}
+		return;
+	}
+
 	now = get_clock();
 
 	DBF_EVENT(DBF_DEBUG, "Interrupt: stat %02x, bus_id %s",
@@ -1015,7 +1017,7 @@
 		return;
 	}
 
-	cqr = (dasd_ccw_req_t *) intparm;
+	cqr = (struct dasd_ccw_req *) intparm;
 	/*
 	 * check status - the request might have been killed
 	 * because of dyn detach
@@ -1027,7 +1029,7 @@
 		return;
 	}
 
-	device = (dasd_device_t *) cqr->device;
+	device = (struct dasd_device *) cqr->device;
 	if (device == NULL ||
 	    device != cdev->dev.driver_data ||
 	    strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {
@@ -1057,7 +1059,7 @@
 		/* Start first request on queue if possible -> fast_io. */
 		if (cqr->list.next != &device->ccw_queue) {
 			next = list_entry(cqr->list.next,
-					  dasd_ccw_req_t, list);
+					  struct dasd_ccw_req, list);
 			if (next->status == DASD_CQR_QUEUED) {
 				if (device->discipline->start_IO(next) == 0)
 					expires = next->expires;
@@ -1108,14 +1110,13 @@
 		BUG();
 	add_disk_randomness(req->rq_disk);
 	end_that_request_last(req);
-	return;
 }
 
 /*
  * Process finished error recovery ccw.
  */
 static inline void
-__dasd_process_erp(dasd_device_t *device, dasd_ccw_req_t *cqr)
+__dasd_process_erp(struct dasd_device *device, struct dasd_ccw_req *cqr)
 {
 	dasd_erp_fn_t erp_fn;
 
@@ -1131,16 +1132,17 @@
  * Process ccw request queue.
  */
 static inline void
-__dasd_process_ccw_queue(dasd_device_t * device, struct list_head *final_queue)
+__dasd_process_ccw_queue(struct dasd_device * device,
+			 struct list_head *final_queue)
 {
 	struct list_head *l, *n;
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	dasd_erp_fn_t erp_fn;
 
 restart:
 	/* Process request with final status. */
 	list_for_each_safe(l, n, &device->ccw_queue) {
-		cqr = list_entry(l, dasd_ccw_req_t, list);
+		cqr = list_entry(l, struct dasd_ccw_req, list);
 		/* Stop list processing at the first non-final request. */
 		if (cqr->status != DASD_CQR_DONE &&
 		    cqr->status != DASD_CQR_FAILED &&
@@ -1171,13 +1173,15 @@
 }
 
 static void
-dasd_end_request_cb(dasd_ccw_req_t * cqr, void *data)
+dasd_end_request_cb(struct dasd_ccw_req * cqr, void *data)
 {
 	struct request *req;
 
 	req = (struct request *) data;
 	dasd_profile_end(cqr->device, cqr, req);
+	spin_lock_irq(&cqr->device->request_queue_lock);
 	dasd_end_request(req, (cqr->status == DASD_CQR_DONE));
+	spin_unlock_irq(&cqr->device->request_queue_lock);
 	dasd_sfree_request(cqr, cqr->device);
 }
 
@@ -1186,12 +1190,11 @@
  * Fetch requests from the block device queue.
  */
 static inline void
-__dasd_process_blk_queue(dasd_device_t * device)
+__dasd_process_blk_queue(struct dasd_device * device)
 {
 	request_queue_t *queue;
-	struct list_head *l;
 	struct request *req;
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	int nr_queued;
 
 	queue = device->request_queue;
@@ -1211,11 +1214,9 @@
 		return;
 	nr_queued = 0;
 	/* Now we try to fetch requests from the request queue */
-	list_for_each(l, &device->ccw_queue) {
-		cqr = list_entry(l, dasd_ccw_req_t, list);
+	list_for_each_entry(cqr, &device->ccw_queue, list)
 		if (cqr->status == DASD_CQR_QUEUED)
 			nr_queued++;
-	}
 	while (!blk_queue_plugged(queue) &&
 	       elv_next_request(queue) &&
 		nr_queued < DASD_CHANQ_MAX_SIZE) {
@@ -1223,7 +1224,8 @@
 		if (device->ro_flag && rq_data_dir(req) == WRITE) {
 			DBF_EVENT(DBF_ERR,
 				  "(%04x) Rejecting write request %p",
-				  device->devno, req);
+				  _ccw_device_get_device_number(device->cdev),
+				  req);
 			blkdev_dequeue_request(req);
 			dasd_end_request(req, 0);
 			continue;
@@ -1234,7 +1236,8 @@
 				break;	/* terminate request queue loop */
 			DBF_EVENT(DBF_ERR,
 				  "(%04x) CCW creation failed on request %p",
-				  device->devno, req);
+				  _ccw_device_get_device_number(device->cdev),
+				  req);
 			blkdev_dequeue_request(req);
 			dasd_end_request(req, 0);
 			continue;
@@ -1254,14 +1257,14 @@
  * if it reached its expire time. If so, terminate the IO.
  */
 static inline void
-__dasd_check_expire(dasd_device_t * device)
+__dasd_check_expire(struct dasd_device * device)
 {
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	unsigned long long now;
 
 	if (list_empty(&device->ccw_queue))
 		return;
-	cqr = list_entry(device->ccw_queue.next, dasd_ccw_req_t, list);
+	cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list);
 	if (cqr->status == DASD_CQR_IN_IO && cqr->expires != 0) {
 		now = get_clock();
 		if (cqr->expires * (TOD_SEC / HZ) + cqr->startclk < now) {
@@ -1277,14 +1280,14 @@
  * if it needs to be started.
  */
 static inline void
-__dasd_start_head(dasd_device_t * device)
+__dasd_start_head(struct dasd_device * device)
 {
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	int rc;
 
 	if (list_empty(&device->ccw_queue))
 		return;
-	cqr = list_entry(device->ccw_queue.next, dasd_ccw_req_t, list);
+	cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list);
 	if (cqr->status == DASD_CQR_QUEUED) {
 		/* try to start the first I/O that can be started */
 		rc = device->discipline->start_IO(cqr);
@@ -1300,16 +1303,16 @@
  * Remove requests from the ccw queue. 
  */
 static void
-dasd_flush_ccw_queue(dasd_device_t * device, int all)
+dasd_flush_ccw_queue(struct dasd_device * device, int all)
 {
 	struct list_head flush_queue;
 	struct list_head *l, *n;
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 
 	INIT_LIST_HEAD(&flush_queue);
 	spin_lock_irq(get_ccwdev_lock(device->cdev));
 	list_for_each_safe(l, n, &device->ccw_queue) {
-		cqr = list_entry(l, dasd_ccw_req_t, list);
+		cqr = list_entry(l, struct dasd_ccw_req, list);
 		/* Flush all request or only block device requests? */
 		if (all == 0 && cqr->callback == dasd_end_request_cb)
 			continue;
@@ -1332,7 +1335,7 @@
 	spin_unlock_irq(get_ccwdev_lock(device->cdev));
 	/* Now call the callback function of flushed requests */
 	list_for_each_safe(l, n, &flush_queue) {
-		cqr = list_entry(l, dasd_ccw_req_t, list);
+		cqr = list_entry(l, struct dasd_ccw_req, list);
 		if (cqr->callback != NULL)
 			(cqr->callback)(cqr, cqr->callback_data);
 	}
@@ -1342,11 +1345,11 @@
  * Acquire the device lock and process queues for the device.
  */
 static void
-dasd_tasklet(dasd_device_t * device)
+dasd_tasklet(struct dasd_device * device)
 {
 	struct list_head final_queue;
 	struct list_head *l, *n;
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 
 	atomic_set (&device->tasklet_scheduled, 0);
 	INIT_LIST_HEAD(&final_queue);
@@ -1358,7 +1361,7 @@
 	spin_unlock_irq(get_ccwdev_lock(device->cdev));
 	/* Now call the callback function of requests with final status */
 	list_for_each_safe(l, n, &final_queue) {
-		cqr = list_entry(l, dasd_ccw_req_t, list);
+		cqr = list_entry(l, struct dasd_ccw_req, list);
 		list_del(&cqr->list);
 		if (cqr->callback != NULL)
 			(cqr->callback)(cqr, cqr->callback_data);
@@ -1371,20 +1374,19 @@
 	__dasd_start_head(device);
 	spin_unlock(get_ccwdev_lock(device->cdev));
 	spin_unlock_irq(&device->request_queue_lock);
-	/* FIXME: what if ref_count == 0 && state == DASD_STATE_NEW ?? */
-	atomic_dec(&device->ref_count);
+	dasd_put_device(device);
 }
 
 /*
  * Schedules a call to dasd_tasklet over the device tasklet.
  */
 void
-dasd_schedule_bh(dasd_device_t * device)
+dasd_schedule_bh(struct dasd_device * device)
 {
 	/* Protect against rescheduling. */
 	if (atomic_compare_and_swap (0, 1, &device->tasklet_scheduled))
 		return;
-	atomic_inc(&device->ref_count);
+	dasd_get_device(device);
 	tasklet_hi_schedule(&device->tasklet);
 }
 
@@ -1393,9 +1395,9 @@
  * possible.
  */
 void
-dasd_add_request_head(dasd_ccw_req_t *req)
+dasd_add_request_head(struct dasd_ccw_req *req)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	unsigned long flags;
 
 	device = req->device;
@@ -1413,9 +1415,9 @@
  * possible.
  */
 void
-dasd_add_request_tail(dasd_ccw_req_t *req)
+dasd_add_request_tail(struct dasd_ccw_req *req)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	unsigned long flags;
 
 	device = req->device;
@@ -1432,15 +1434,15 @@
  * Wakeup callback.
  */
 static void
-dasd_wakeup_cb(dasd_ccw_req_t *cqr, void *data)
+dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data)
 {
 	wake_up((wait_queue_head_t *) data);
 }
 
 static inline int
-_wait_for_wakeup(dasd_ccw_req_t *cqr)
+_wait_for_wakeup(struct dasd_ccw_req *cqr)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int rc;
 
 	device = cqr->device;
@@ -1454,10 +1456,10 @@
  * Attempts to start a special ccw queue and waits for its completion.
  */
 int
-dasd_sleep_on(dasd_ccw_req_t * cqr)
+dasd_sleep_on(struct dasd_ccw_req * cqr)
 {
 	wait_queue_head_t wait_q;
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int rc;
 	
 	device = cqr->device;
@@ -1486,10 +1488,10 @@
  * for its completion.
  */
 int
-dasd_sleep_on_interruptible(dasd_ccw_req_t * cqr)
+dasd_sleep_on_interruptible(struct dasd_ccw_req * cqr)
 {
 	wait_queue_head_t wait_q;
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int rc, finished;
 
 	device = cqr->device;
@@ -1531,14 +1533,14 @@
  * to the head of the queue. Then the special request is waited on normally.
  */
 static inline int
-_dasd_term_running_cqr(dasd_device_t *device)
+_dasd_term_running_cqr(struct dasd_device *device)
 {
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	int rc;
 
 	if (list_empty(&device->ccw_queue))
 		return 0;
-	cqr = list_entry(device->ccw_queue.next, dasd_ccw_req_t, list);
+	cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list);
 	rc = device->discipline->term_IO(cqr);
 	if (rc == 0) {
 		/* termination successful */
@@ -1549,10 +1551,10 @@
 }
 
 int
-dasd_sleep_on_immediatly(dasd_ccw_req_t * cqr)
+dasd_sleep_on_immediatly(struct dasd_ccw_req * cqr)
 {
 	wait_queue_head_t wait_q;
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int rc;
 	
 	device = cqr->device;
@@ -1587,9 +1589,9 @@
  * terminated if it is currently in i/o.
  * Returns 1 if the request has been terminated.
  */
-int dasd_cancel_req(dasd_ccw_req_t *cqr)
+int dasd_cancel_req(struct dasd_ccw_req *cqr)
 {
-	dasd_device_t *device = cqr->device;
+	struct dasd_device *device = cqr->device;
 	unsigned long flags;
 	int rc;
 
@@ -1635,9 +1637,9 @@
 static void
 do_dasd_request(request_queue_t * queue)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
-	device = (dasd_device_t *) queue->queuedata;
+	device = (struct dasd_device *) queue->queuedata;
 	spin_lock(get_ccwdev_lock(device->cdev));
 	/* Get new request from the block device request queue */
 	__dasd_process_blk_queue(device);
@@ -1650,7 +1652,7 @@
  * Allocate request queue and initialize gendisk info for device.
  */
 static int
-dasd_setup_blkdev(dasd_device_t * device)
+dasd_setup_blkdev(struct dasd_device * device)
 {
 	int max, rc;
 
@@ -1685,7 +1687,7 @@
  * Deactivate and free request queue.
  */
 static void
-dasd_disable_blkdev(dasd_device_t * device)
+dasd_disable_blkdev(struct dasd_device * device)
 {
 	if (device->request_queue) {
 		blk_cleanup_queue(device->request_queue);
@@ -1698,7 +1700,7 @@
  * Flush request on the request queue.
  */
 static void
-dasd_flush_request_queue(dasd_device_t * device)
+dasd_flush_request_queue(struct dasd_device * device)
 {
 	struct request *req;
 
@@ -1719,7 +1721,7 @@
 static int
 dasd_open(struct inode *inp, struct file *filp)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int rc;
 	
 	if (dasd_probeonly) {
@@ -1750,7 +1752,7 @@
 static int
 dasd_release(struct inode *inp, struct file *filp)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	device = inp->i_bdev->bd_disk->private_data;
 
@@ -1766,8 +1768,8 @@
 	return 0;
 }
 
-struct
-block_device_operations dasd_device_operations = {
+struct block_device_operations
+dasd_device_operations = {
 	.owner		= THIS_MODULE,
 	.open		= dasd_open,
 	.release	= dasd_release,
@@ -1798,7 +1800,8 @@
 /* initial attempt at a probe function. this can be simplified once
  * the other detection code is gone */
 int
-dasd_generic_probe (struct ccw_device *cdev, dasd_discipline_t *discipline)
+dasd_generic_probe (struct ccw_device *cdev,
+		    struct dasd_discipline *discipline)
 {
 	int devno;
 	int ret = 0;
@@ -1823,12 +1826,6 @@
 
 	cdev->handler = &dasd_int_handler;
 
-	if (dasd_autodetect ||
-	    dasd_devmap_from_devno(devno) != 0) {
-		/* => device was in dasd parameter line */
-		ccw_device_set_online(cdev);
-	}
-
 	return ret;
 }
 
@@ -1837,7 +1834,7 @@
 int
 dasd_generic_remove (struct ccw_device *cdev)
 {
-	struct dasd_device_t *device;
+	struct dasd_device *device;
 
 	device = cdev->dev.driver_data;
 	cdev->dev.driver_data = NULL;
@@ -1851,33 +1848,15 @@
  * or the user has started activation through sysfs */
 int
 dasd_generic_set_online (struct ccw_device *cdev,
-			 dasd_discipline_t *discipline)
+			 struct dasd_discipline *discipline)
 
 {
-	int devno;
-	dasd_devmap_t *devmap;
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int rc;
 
-	if (cdev->dev.driver_data != NULL) /* already enabled */
-		return 0;
-
-	devno = _ccw_device_get_device_number(cdev);
-	rc = dasd_add_range(devno, devno, DASD_FEATURE_DEFAULT);
-	if (rc)
-		return rc;
-
-	if (!(devmap = dasd_devmap_from_devno (devno)))
-		return 0; /* device is still disabled -> ignore it */
-
-	if (IS_ERR(device = dasd_get_device(devmap))) {
-		printk (KERN_WARNING "dasd_generic could not get %s\n",
-				cdev->dev.bus_id);
+	device = dasd_create_device(cdev);
+	if (IS_ERR(device))
 		return PTR_ERR(device);
-	}
-
-	device->gdp->driverfs_dev = &cdev->dev;
-	device->cdev = cdev;
 
 	if (device->use_diag_flag)
 		device->discipline = dasd_diag_discipline_pointer;
@@ -1898,7 +1877,7 @@
 	if (rc) {
 		printk (KERN_WARNING "dasd_generic found a bad device %s\n", 
 			cdev->dev.bus_id);
-		dasd_put_device(devmap);
+		dasd_delete_device(device);
 		return rc;
 	}
 
@@ -1909,43 +1888,70 @@
 			cdev->dev.bus_id);
 		rc = -ENODEV;
 		dasd_set_target_state(device, DASD_STATE_NEW);
+		dasd_delete_device(device);
 	} else {
 		pr_debug("dasd_generic device %s found\n",
 				cdev->dev.bus_id);
 		cdev->dev.driver_data = device;
 	}
 
-	dasd_put_device(devmap);
 	/* FIXME: we have to wait for the root device but we don't want
 	 * to wait for each single device but for all at once. */
 	wait_event(dasd_init_waitq, _wait_for_device(device));
+
 	return rc;
 }
 
 int
 dasd_generic_set_offline (struct ccw_device *cdev)
 {
-	dasd_device_t *device;
-	dasd_devmap_t *devmap;
-	int devno;
+	struct dasd_device *device;
 
-	devno = _ccw_device_get_device_number(cdev);
 	device = cdev->dev.driver_data;
-	devmap = dasd_devmap_from_devno(devno);
-	if (device == NULL || devmap == NULL)
-		return -ENODEV;
-
-	device = dasd_get_device(devmap);
-	if (IS_ERR(device))
-		return PTR_ERR(device);
-
+	if (atomic_read(&device->open_count) > 0) {
+		printk (KERN_WARNING "Can't offline dasd device with open"
+			" count = %i.\n",
+			atomic_read(&device->open_count));
+		return -EBUSY;
+	}
 	dasd_set_target_state(device, DASD_STATE_NEW);
-	dasd_put_device(devmap);
+	dasd_delete_device(device);
 	
 	return 0;
 }
 
 /*
+ * Automatically online either all dasd devices (dasd_autodetect) or
+ * all devices specified with dasd= parameters. For dasd_autodetect
+ * dasd_generic_probe has added devmaps for all dasd devices. We
+ * scan all present dasd devmaps and call ccw_device_set_online.
+ */
+void
+dasd_generic_auto_online (struct ccw_driver *dasd_discipline_driver)
+{
+	struct device_driver *drv;
+	struct device *d, *dev;
+	struct ccw_device *cdev;
+	int devno;
+
+	drv = get_driver(&dasd_discipline_driver->driver);
+	down_read(&drv->bus->subsys.rwsem);
+	dev = NULL;
+	list_for_each_entry(d, &drv->devices, driver_list) {
+		dev = get_device(d);
+		if (!dev)
+			continue;
+		cdev = to_ccwdev(dev);
+		devno = _ccw_device_get_device_number(cdev);
+		if (dasd_autodetect || dasd_devno_in_range(devno) == 0)
+			ccw_device_set_online(cdev);
+		put_device(dev);
+	}
+	up_read(&drv->bus->subsys.rwsem);
+	put_driver(drv);
+}
+
+/*
  * SECTION: files in sysfs
  */
 
@@ -1955,7 +1961,7 @@
 static ssize_t
 dasd_ro_show(struct device *dev, char *buf)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	device = dev->driver_data;
 	if (!device)
@@ -1967,7 +1973,7 @@
 static ssize_t
 dasd_ro_store(struct device *dev, const char *buf, size_t count)
 {
-	dasd_device_t *device = dev->driver_data;
+	struct dasd_device *device = dev->driver_data;
 
 	if (device)
 		device->ro_flag = (buf[0] == '1') ? 1 : 0;
@@ -1984,7 +1990,7 @@
 static ssize_t 
 dasd_use_diag_show(struct device *dev, char *buf)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	device = dev->driver_data;
 	if (!device)
@@ -1996,7 +2002,7 @@
 static ssize_t
 dasd_use_diag_store(struct device *dev, const char *buf, size_t count)
 {
-	dasd_device_t *device = dev->driver_data;
+	struct dasd_device *device = dev->driver_data;
 
 	if (device)
 		device->use_diag_flag = (buf[0] == '1') ? 1 : 0;
@@ -2014,7 +2020,7 @@
 dasd_devices_show(struct device *dev, char *buf)
 {
 	
-	dasd_device_t *device;
+	struct dasd_device *device;
 	dasd_devmap_t *devmap;
 
 	devmap = NULL;
@@ -2034,7 +2040,7 @@
 static ssize_t
 dasd_discipline_show(struct device *dev, char *buf)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	device = dev->driver_data;
 	if (!device || !device->discipline)
@@ -2078,11 +2084,13 @@
 
 	DBF_EVENT(DBF_EMERG, "%s", "debug area created");
 
-	if (devfs_mk_dir("dasd")) {
+#ifdef CONFIG_DEVFS_FS
+	if (!devfs_mk_dir("dasd")) {
 		DBF_EVENT(DBF_ALERT, "%s", "no devfs");
 		rc = -ENOSYS;
 		goto failed;
 	}
+#endif
 	rc = dasd_devmap_init();
 	if (rc)
 		goto failed;
diff -Nru a/drivers/s390/block/dasd_3370_erp.c b/drivers/s390/block/dasd_3370_erp.c
--- a/drivers/s390/block/dasd_3370_erp.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/block/dasd_3370_erp.c	Sat Apr 19 19:51:49 2003
@@ -4,10 +4,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
  *
- * $Revision: 1.7 $
- *
- * History of changes 
- *
+ * $Revision: 1.9 $
  */
 
 #define PRINTK_HEADER "dasd_erp(3370)"
@@ -32,7 +29,7 @@
  *   dasd_era_recover	for all others.
  */
 dasd_era_t
-dasd_3370_erp_examine(dasd_ccw_req_t * cqr, struct irb * irb)
+dasd_3370_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb)
 {
 	char *sense = irb->ecw;
 
diff -Nru a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c
--- a/drivers/s390/block/dasd_3990_erp.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/block/dasd_3990_erp.c	Sat Apr 19 19:51:50 2003
@@ -5,11 +5,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001
  *
- * $Revision: 1.20 $
- *
- * History of changes:
- * 05/14/01 fixed PL030160GTO (BUG() in erp_action_5)
- * 05/04/02 code restructuring.
+ * $Revision: 1.24 $
  */
 
 #include <linux/timer.h>
@@ -23,11 +19,11 @@
 #include "dasd_eckd.h"
 
 
-typedef struct DCTL_data_t {
+struct DCTL_data {
 	unsigned char subcommand;	/* e.g Inhibit Write, Enable Write,... */
 	unsigned char modifier;	/* Subcommand modifier		       */
 	unsigned short res;	/* reserved */
-} __attribute__ ((packed)) DCTL_data_t;
+} __attribute__ ((packed));
 
 /*
  ***************************************************************************** 
@@ -54,10 +50,10 @@
  *   dasd_era_recover	for all others.
  */
 static dasd_era_t
-dasd_3990_erp_examine_24(dasd_ccw_req_t * cqr, char *sense)
+dasd_3990_erp_examine_24(struct dasd_ccw_req * cqr, char *sense)
 {
 
-	dasd_device_t *device = cqr->device;
+	struct dasd_device *device = cqr->device;
 
 	/* check for 'Command Reject' */
 	if ((sense[0] & SNS0_CMD_REJECT) &&
@@ -111,10 +107,10 @@
  *   dasd_era_recover	for recoverable others.
  */
 static dasd_era_t
-dasd_3990_erp_examine_32(dasd_ccw_req_t * cqr, char *sense)
+dasd_3990_erp_examine_32(struct dasd_ccw_req * cqr, char *sense)
 {
 
-	dasd_device_t *device = cqr->device;
+	struct dasd_device *device = cqr->device;
 
 	switch (sense[25]) {
 	case 0x00:
@@ -149,12 +145,12 @@
  *   dasd_era_recover	for all others.
  */
 dasd_era_t
-dasd_3990_erp_examine(dasd_ccw_req_t * cqr, struct irb * irb)
+dasd_3990_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb)
 {
 
 	char *sense = irb->ecw;
 	dasd_era_t era = dasd_era_recover;
-	dasd_device_t *device = cqr->device;
+	struct dasd_device *device = cqr->device;
 
 	/* check for successful execution first */
 	if (irb->scsw.cstat == 0x00 &&
@@ -207,10 +203,10 @@
  * RETURN VALUES
  *   cqr		original cqr		   
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_cleanup(dasd_ccw_req_t * erp, char final_status)
+static struct dasd_ccw_req *
+dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status)
 {
-	dasd_ccw_req_t *cqr = erp->refers;
+	struct dasd_ccw_req *cqr = erp->refers;
 
 	dasd_free_erp_request(erp, erp->device);
 	cqr->status = final_status;
@@ -234,10 +230,10 @@
  *   void		
  */
 static void
-dasd_3990_erp_block_queue(dasd_ccw_req_t * erp, int expires)
+dasd_3990_erp_block_queue(struct dasd_ccw_req * erp, int expires)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	DEV_MESSAGE(KERN_INFO, device,
 		    "blocking request queue for %is", expires);
@@ -258,11 +254,11 @@
  * RETURN VALUES
  *   erp		modified erp
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_int_req(dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_int_req(struct dasd_ccw_req * erp)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	/* first time set initial retry counter and erp_function */
 	/* and retry once without blocking queue		 */
@@ -301,9 +297,9 @@
  *   erp		modified pointer to the ERP
  */
 static void
-dasd_3990_erp_alternate_path(dasd_ccw_req_t * erp)
+dasd_3990_erp_alternate_path(struct dasd_ccw_req * erp)
 {
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 	__u8 opm;
 
 	/* try alternate valid path */
@@ -349,17 +345,18 @@
  *   dctl_cqr		pointer to NEW dctl_cqr 
  *
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_DCTL(dasd_ccw_req_t * erp, char modifier)
+static struct dasd_ccw_req *
+dasd_3990_erp_DCTL(struct dasd_ccw_req * erp, char modifier)
 {
 
-	dasd_device_t *device = erp->device;
-	DCTL_data_t *DCTL_data;
+	struct dasd_device *device = erp->device;
+	struct DCTL_data *DCTL_data;
 	struct ccw1 *ccw;
-	dasd_ccw_req_t *dctl_cqr;
+	struct dasd_ccw_req *dctl_cqr;
 
 	dctl_cqr = dasd_alloc_erp_request((char *) &erp->magic, 1,
-					  sizeof (DCTL_data_t), erp->device);
+					  sizeof (struct DCTL_data),
+					  erp->device);
 	if (IS_ERR(dctl_cqr)) {
 		DEV_MESSAGE(KERN_ERR, device, "%s",
 			    "Unable to allocate DCTL-CQR");
@@ -409,8 +406,8 @@
  *   erp		pointer to the ERP
  *
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_action_1(dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_action_1(struct dasd_ccw_req * erp)
 {
 
 	erp->function = dasd_3990_erp_action_1;
@@ -438,11 +435,11 @@
  *   erp		pointer to the ERP
  *
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_action_4(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	/* first time set initial retry counter and erp_function    */
 	/* and retry once without waiting for state change pending  */
@@ -496,8 +493,8 @@
  *   erp		pointer to the ERP
  *
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_action_5(dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_action_5(struct dasd_ccw_req * erp)
 {
 
 	/* first of all retry */
@@ -523,10 +520,10 @@
  *   void
  */
 static void
-dasd_3990_handle_env_data(dasd_ccw_req_t * erp, char *sense)
+dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 	char msg_format = (sense[7] & 0xF0);
 	char msg_no = (sense[7] & 0x0F);
 
@@ -1146,11 +1143,11 @@
  * RETURN VALUES
  *   erp		'new' erp_head - pointer to new ERP 
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_com_rej(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->function = dasd_3990_erp_com_rej;
 
@@ -1187,11 +1184,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_bus_out(dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_bus_out(struct dasd_ccw_req * erp)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	/* first time set initial retry counter and erp_function */
 	/* and retry once without blocking queue		 */
@@ -1226,11 +1223,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_equip_check(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_equip_check(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->function = dasd_3990_erp_equip_check;
 
@@ -1288,11 +1285,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_data_check(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_data_check(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->function = dasd_3990_erp_data_check;
 
@@ -1347,11 +1344,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_overrun(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_overrun(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->function = dasd_3990_erp_overrun;
 
@@ -1376,11 +1373,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_inv_format(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_inv_format(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->function = dasd_3990_erp_inv_format;
 
@@ -1417,11 +1414,11 @@
  * RETURN VALUES
  *   erp		pointer to original (failed) cqr.
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_EOC(dasd_ccw_req_t * default_erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_EOC(struct dasd_ccw_req * default_erp, char *sense)
 {
 
-	dasd_device_t *device = default_erp->device;
+	struct dasd_device *device = default_erp->device;
 
 	DEV_MESSAGE(KERN_ERR, device, "%s",
 		    "End-of-Cylinder - must never happen");
@@ -1442,11 +1439,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_env_data(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_env_data(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->function = dasd_3990_erp_env_data;
 
@@ -1479,11 +1476,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_no_rec(dasd_ccw_req_t * default_erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_no_rec(struct dasd_ccw_req * default_erp, char *sense)
 {
 
-	dasd_device_t *device = default_erp->device;
+	struct dasd_device *device = default_erp->device;
 
 	DEV_MESSAGE(KERN_ERR, device, "%s",
 		    "No Record Found - Fatal error should "
@@ -1506,11 +1503,11 @@
  * RETURN VALUES
  *   erp		new erp_head - pointer to new ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_file_prot(dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_file_prot(struct dasd_ccw_req * erp)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	DEV_MESSAGE(KERN_ERR, device, "%s", "File Protected");
 
@@ -1532,11 +1529,11 @@
  * RETURN VALUES
  *   erp		pointer to the (addtitional) ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_inspect_24(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_ccw_req_t *erp_filled = NULL;
+	struct dasd_ccw_req *erp_filled = NULL;
 
 	/* Check sense for ....	   */
 	/* 'Command Reject'	   */
@@ -1612,11 +1609,11 @@
  * RETURN VALUES
  *   erp		modified erp_head
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_action_10_32(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->retries = 256;
 	erp->function = dasd_3990_erp_action_10_32;
@@ -1646,15 +1643,15 @@
  *   erp		new erp or 
  *			default_erp in case of imprecise ending or error
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_action_1B_32(dasd_ccw_req_t * default_erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_action_1B_32(struct dasd_ccw_req * default_erp, char *sense)
 {
 
-	dasd_device_t *device = default_erp->device;
+	struct dasd_device *device = default_erp->device;
 	__u32 cpa = 0;
-	dasd_ccw_req_t *cqr;
-	dasd_ccw_req_t *erp;
-	DE_eckd_data_t *DE_data;
+	struct dasd_ccw_req *cqr;
+	struct dasd_ccw_req *erp;
+	struct DE_eckd_data *DE_data;
 	char *LO_data;		/* LO_eckd_data_t */
 	struct ccw1 *ccw;
 
@@ -1695,8 +1692,8 @@
 	/* Build new ERP request including DE/LO */
 	erp = dasd_alloc_erp_request((char *) &cqr->magic,
 				     2 + 1,/* DE/LO + TIC */
-				     sizeof (DE_eckd_data_t) +
-				     sizeof (LO_eckd_data_t), device);
+				     sizeof (struct DE_eckd_data) +
+				     sizeof (struct LO_eckd_data), device);
 
 	if (IS_ERR(erp)) {
 		DEV_MESSAGE(KERN_ERR, device, "%s", "Unable to allocate ERP");
@@ -1705,10 +1702,10 @@
 
 	/* use original DE */
 	DE_data = erp->data;
-	memcpy(DE_data, cqr->data, sizeof (DE_eckd_data_t));
+	memcpy(DE_data, cqr->data, sizeof (struct DE_eckd_data));
 
 	/* create LO */
-	LO_data = erp->data + sizeof (DE_eckd_data_t);
+	LO_data = erp->data + sizeof (struct DE_eckd_data);
 
 	if ((sense[3] == 0x01) && (LO_data[1] & 0x01)) {
 
@@ -1791,15 +1788,15 @@
  * RETURN VALUES
  *   erp		modified erp 
  */
-static dasd_ccw_req_t *
-dasd_3990_update_1B(dasd_ccw_req_t * previous_erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense)
 {
 
-	dasd_device_t *device = previous_erp->device;
+	struct dasd_device *device = previous_erp->device;
 	__u32 cpa = 0;
-	dasd_ccw_req_t *cqr;
-	dasd_ccw_req_t *erp;
-	char *LO_data;		/* LO_eckd_data_t */
+	struct dasd_ccw_req *cqr;
+	struct dasd_ccw_req *erp;
+	char *LO_data;		/* struct LO_eckd_data */
 	struct ccw1 *ccw;
 
 	DEV_MESSAGE(KERN_DEBUG, device, "%s",
@@ -1842,7 +1839,7 @@
 	erp = previous_erp;
 
 	/* update the LO with the new returned sense data  */
-	LO_data = erp->data + sizeof (DE_eckd_data_t);
+	LO_data = erp->data + sizeof (struct DE_eckd_data);
 
 	if ((sense[3] == 0x01) && (LO_data[1] & 0x01)) {
 
@@ -1905,7 +1902,7 @@
  *
  */
 static void
-dasd_3990_erp_compound_retry(dasd_ccw_req_t * erp, char *sense)
+dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense)
 {
 
 	switch (sense[25] & 0x03) {
@@ -1949,7 +1946,7 @@
  *
  */
 static void
-dasd_3990_erp_compound_path(dasd_ccw_req_t * erp, char *sense)
+dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense)
 {
 
 	if (sense[25] & DASD_SENSE_BIT_3) {
@@ -1984,8 +1981,8 @@
  *   erp		NEW ERP pointer
  *
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_compound_code(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense)
 {
 
 	if (sense[25] & DASD_SENSE_BIT_2) {
@@ -2033,13 +2030,13 @@
  *
  */
 static void
-dasd_3990_erp_compound_config(dasd_ccw_req_t * erp, char *sense)
+dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense)
 {
 
 	if ((sense[25] & DASD_SENSE_BIT_1) && (sense[26] & DASD_SENSE_BIT_2)) {
 
 		/* set to suspended duplex state then restart */
-		dasd_device_t *device = erp->device;
+		struct dasd_device *device = erp->device;
 
 		DEV_MESSAGE(KERN_ERR, device, "%s",
 			    "Set device to suspended duplex state should be "
@@ -2068,8 +2065,8 @@
  *   erp		(additional) ERP pointer
  *
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_compound(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense)
 {
 
 	if ((erp->function == dasd_3990_erp_compound_retry) &&
@@ -2115,11 +2112,11 @@
  *   erp_filled		pointer to the ERP
  *
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_inspect_32(dasd_ccw_req_t * erp, char *sense)
+static struct dasd_ccw_req *
+dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 
 	erp->function = dasd_3990_erp_inspect_32;
 
@@ -2232,11 +2229,11 @@
  * RETURN VALUES
  *   erp_new		contens was possibly modified 
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_inspect(dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_inspect(struct dasd_ccw_req * erp)
 {
 
-	dasd_ccw_req_t *erp_new = NULL;
+	struct dasd_ccw_req *erp_new = NULL;
 	/* sense data are located in the refers record of the */
 	/* already set up new ERP !			      */
 	char *sense = erp->refers->dstat->ecw;
@@ -2272,15 +2269,15 @@
  * RETURN VALUES
  *   erp		pointer to new ERP-chain head
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_add_erp(dasd_ccw_req_t * cqr)
+static struct dasd_ccw_req *
+dasd_3990_erp_add_erp(struct dasd_ccw_req * cqr)
 {
 
-	dasd_device_t *device = cqr->device;
+	struct dasd_device *device = cqr->device;
 	struct ccw1 *ccw;
 
 	/* allocate additional request block */
-	dasd_ccw_req_t *erp;
+	struct dasd_ccw_req *erp;
 
 	erp = dasd_alloc_erp_request((char *) &cqr->magic, 2, 0, cqr->device);
 	if (IS_ERR(erp)) {
@@ -2333,11 +2330,11 @@
  * RETURN VALUES
  *   erp		pointer to new ERP-chain head
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_additional_erp(dasd_ccw_req_t * cqr)
+static struct dasd_ccw_req *
+dasd_3990_erp_additional_erp(struct dasd_ccw_req * cqr)
 {
 
-	dasd_ccw_req_t *erp = NULL;
+	struct dasd_ccw_req *erp = NULL;
 
 	/* add erp and initialize with default TIC */
 	erp = dasd_3990_erp_add_erp(cqr);
@@ -2371,7 +2368,7 @@
  *			returns 1 if match found, otherwise 0.
  */
 static int
-dasd_3990_erp_error_match(dasd_ccw_req_t * cqr1, dasd_ccw_req_t * cqr2)
+dasd_3990_erp_error_match(struct dasd_ccw_req *cqr1, struct dasd_ccw_req *cqr2)
 {
 
 	/* check failed CCW */
@@ -2406,11 +2403,11 @@
  *			recovery procedure OR
  *			NULL if a 'new' error occurred.
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_in_erp(dasd_ccw_req_t * cqr)
+static struct dasd_ccw_req *
+dasd_3990_erp_in_erp(struct dasd_ccw_req *cqr)
 {
 
-	dasd_ccw_req_t *erp_head = cqr,	/* save erp chain head */
+	struct dasd_ccw_req *erp_head = cqr,	/* save erp chain head */
 	*erp_match = NULL;	/* save erp chain head */
 	int match = 0;		/* 'boolean' for matching error found */
 
@@ -2450,11 +2447,11 @@
  * RETURN VALUES
  *   erp		modified/additional ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_further_erp(dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_further_erp(struct dasd_ccw_req *erp)
 {
 
-	dasd_device_t *device = erp->device;
+	struct dasd_device *device = erp->device;
 	char *sense = erp->dstat->ecw;
 
 	/* check for 24 byte sense ERP */
@@ -2539,13 +2536,14 @@
  * RETURN VALUES
  *   erp		modified/additional ERP
  */
-static dasd_ccw_req_t *
-dasd_3990_erp_handle_match_erp(dasd_ccw_req_t * erp_head, dasd_ccw_req_t * erp)
+static struct dasd_ccw_req *
+dasd_3990_erp_handle_match_erp(struct dasd_ccw_req *erp_head,
+			       struct dasd_ccw_req *erp)
 {
 
-	dasd_device_t *device = erp_head->device;
-	dasd_ccw_req_t *erp_done = erp_head;	/* finished req */
-	dasd_ccw_req_t *erp_free = NULL;	/* req to be freed */
+	struct dasd_device *device = erp_head->device;
+	struct dasd_ccw_req *erp_done = erp_head;	/* finished req */
+	struct dasd_ccw_req *erp_free = NULL;	/* req to be freed */
 
 	/* loop over successful ERPs and remove them from chanq */
 	while (erp_done != erp) {
@@ -2619,12 +2617,12 @@
  *			 - the original given cqr (which's status might 
  *			   be modified)
  */
-dasd_ccw_req_t *
-dasd_3990_erp_action(dasd_ccw_req_t * cqr)
+struct dasd_ccw_req *
+dasd_3990_erp_action(struct dasd_ccw_req * cqr)
 {
 
-	dasd_ccw_req_t *erp = NULL;
-	dasd_device_t *device = cqr->device;
+	struct dasd_ccw_req *erp = NULL;
+	struct dasd_device *device = cqr->device;
 	__u32 cpa = cqr->dstat->scsw.cpa;
 
 #ifdef ERP_DEBUG
@@ -2632,7 +2630,7 @@
 	DEV_MESSAGE(KERN_DEBUG, device, "%s",
 		    "ERP chain at BEGINNING of ERP-ACTION");
 	{
-		dasd_ccw_req_t *temp_erp = NULL;
+		struct dasd_ccw_req *temp_erp = NULL;
 
 		for (temp_erp = cqr;
 		     temp_erp != NULL; temp_erp = temp_erp->refers) {
@@ -2683,7 +2681,7 @@
 	/* print current erp_chain */
 	DEV_MESSAGE(KERN_DEBUG, device, "%s", "ERP chain at END of ERP-ACTION");
 	{
-		dasd_ccw_req_t *temp_erp = NULL;
+		struct dasd_ccw_req *temp_erp = NULL;
 		for (temp_erp = erp;
 		     temp_erp != NULL; temp_erp = temp_erp->refers) {
 
diff -Nru a/drivers/s390/block/dasd_9336_erp.c b/drivers/s390/block/dasd_9336_erp.c
--- a/drivers/s390/block/dasd_9336_erp.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/block/dasd_9336_erp.c	Sat Apr 19 19:51:49 2003
@@ -4,10 +4,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
  *
- * $Revision: 1.6 $
- *
- * History of changes 
- *
+ * $Revision: 1.8 $
  */
 
 #define PRINTK_HEADER "dasd_erp(9336)"
@@ -32,7 +29,7 @@
  *   dasd_era_recover	for all others.
  */
 dasd_era_t
-dasd_9336_erp_examine(dasd_ccw_req_t * cqr, struct irb * irb)
+dasd_9336_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb)
 {
 	/* check for successful execution first */
 	if (irb->scsw.cstat == 0x00 &&
diff -Nru a/drivers/s390/block/dasd_9343_erp.c b/drivers/s390/block/dasd_9343_erp.c
--- a/drivers/s390/block/dasd_9343_erp.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/s390/block/dasd_9343_erp.c	Sat Apr 19 19:51:51 2003
@@ -4,10 +4,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000
  *
- * $Revision: 1.11 $
- *
- * History of changes 
- * 
+ * $Revision: 1.13 $
  */
 
 #define PRINTK_HEADER "dasd_erp(9343)"
@@ -15,7 +12,7 @@
 #include "dasd_int.h"
 
 dasd_era_t
-dasd_9343_erp_examine(dasd_ccw_req_t * cqr, struct irb * irb)
+dasd_9343_erp_examine(struct dasd_ccw_req * cqr, struct irb * irb)
 {
 	if (irb->scsw.cstat == 0x00 &&
 	    irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END))
diff -Nru a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c
--- a/drivers/s390/block/dasd_devmap.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/s390/block/dasd_devmap.c	Sat Apr 19 19:51:47 2003
@@ -11,14 +11,10 @@
  * functions may not be called from interrupt context. In particular
  * dasd_get_device is a no-no from interrupt context.
  *
- * $Revision: 1.11 $
- *
- * History of changes 
- * 05/04/02 split from dasd.c, code restructuring.
+ * $Revision: 1.15 $
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/ctype.h>
 #include <linux/init.h>
 
@@ -31,6 +27,25 @@
 #include "dasd_int.h"
 
 /*
+ * dasd_devmap_t is used to store the features and the relation
+ * between device number and device index. To find a dasd_devmap_t
+ * that corresponds to a device number of a device index each
+ * dasd_devmap_t is added to two linked lists, one to search by
+ * the device number and one to search by the device index. As
+ * soon as big minor numbers are available the device index list
+ * can be removed since the device number will then be identical
+ * to the device index.
+ */
+struct dasd_devmap {
+	struct list_head devindex_list;
+	struct list_head devno_list;
+        unsigned int devindex;
+        unsigned short devno;
+        unsigned short features;
+	struct dasd_device *device;
+};
+
+/*
  * Parameter parsing functions for dasd= parameter. The syntax is:
  *   <devno>		: (0x)?[0-9a-fA-F]+
  *   <feature>		: ro
@@ -245,13 +260,12 @@
 	}
 	spin_lock(&dasd_devmap_lock);
 	for (devno = from; devno <= to; devno++) {
-		dasd_devmap_t *devmap, *tmp;
-		struct list_head *l;
+		struct dasd_devmap *devmap, *tmp;
 
 		devmap = NULL;
 		/* Find previous devmap for device number i */
-		list_for_each(l, &dasd_devno_hashlists[devno & 255]) {
-			tmp = list_entry(l, dasd_devmap_t, devno_list);
+		list_for_each_entry(tmp, &dasd_devno_hashlists[devno & 255],
+				    devno_list) {
 			if (tmp->devno == devno) {
 				devmap = tmp;
 				break;
@@ -259,8 +273,8 @@
 		}
 		if (devmap == NULL) {
 			/* This devno is new. */
-			devmap = (dasd_devmap_t *)
-				kmalloc(sizeof(dasd_devmap_t), GFP_KERNEL);
+			devmap = (struct dasd_devmap *)
+				kmalloc(sizeof(struct dasd_devmap),GFP_KERNEL);
 			if (devmap == NULL)
 				return -ENOMEM;
 			devindex = dasd_max_devindex++;
@@ -279,6 +293,30 @@
 }
 
 /*
+ * Check if devno has been added to the list of dasd ranges.
+ */
+int
+dasd_devno_in_range(int devno)
+{
+	struct dasd_devmap *devmap;
+	int ret;
+		
+	ret = -ENOENT;
+	spin_lock(&dasd_devmap_lock);
+	/* Find devmap for device with device number devno */
+	list_for_each_entry(devmap, &dasd_devno_hashlists[devno&255],
+			    devno_list) {
+		if (devmap->devno == devno) {
+			/* Found the device. */
+			ret = 0;
+			break;
+		}
+	}
+	spin_unlock(&dasd_devmap_lock);
+	return ret;
+}
+
+/*
  * Forget all about the device numbers added so far.
  * This may only be called at module unload or system shutdown.
  */
@@ -290,9 +328,9 @@
 	spin_lock(&dasd_devmap_lock);
 	for (i = 0; i < 256; i++) {
 		struct list_head *l, *next;
-		dasd_devmap_t *devmap;
+		struct dasd_devmap *devmap;
 		list_for_each_safe(l, next, &dasd_devno_hashlists[i]) {
-			devmap = list_entry(l, dasd_devmap_t, devno_list);
+			devmap = list_entry(l, struct dasd_devmap, devno_list);
 			if (devmap->device != NULL)
 				BUG();
 			list_del(&devmap->devindex_list);
@@ -307,17 +345,15 @@
  * Find the devmap structure from a devno. Can be removed as soon
  * as big minors are available.
  */
-dasd_devmap_t *
+static struct dasd_devmap *
 dasd_devmap_from_devno(int devno)
 {
-	struct list_head *l;
-	dasd_devmap_t *devmap, *tmp;
+	struct dasd_devmap *devmap, *tmp;
 		
 	devmap = NULL;
 	spin_lock(&dasd_devmap_lock);
 	/* Find devmap for device with device number devno */
-	list_for_each(l, &dasd_devno_hashlists[devno&255]) {
-		tmp = list_entry(l, dasd_devmap_t, devno_list);
+	list_for_each_entry(tmp, &dasd_devno_hashlists[devno&255], devno_list) {
 		if (tmp->devno == devno) {
 			/* Found the device, return devmap */
 			devmap = tmp;
@@ -332,17 +368,16 @@
  * Find the devmap for a device by its device index. Can be removed
  * as soon as big minors are available.
  */
-dasd_devmap_t *
+static struct dasd_devmap *
 dasd_devmap_from_devindex(int devindex)
 {
-	struct list_head *l;
-	dasd_devmap_t *devmap, *tmp;
+	struct dasd_devmap *devmap, *tmp;
 		
 	devmap = NULL;
 	spin_lock(&dasd_devmap_lock);
 	/* Find devmap for device with device index devindex */
-	list_for_each(l, &dasd_devindex_hashlists[devindex & 255]) {
-		tmp = list_entry(l, dasd_devmap_t, devindex_list);
+	list_for_each_entry(tmp, &dasd_devindex_hashlists[devindex & 255],
+			    devindex_list) {
 		if (tmp->devindex == devindex) {
 			/* Found the device, return devno */
 			devmap = tmp;
@@ -353,60 +388,140 @@
 	return devmap;
 }
 
-/*
- * Find the device structure for device number devno. If it does not
- * exists yet, allocate it. Increase the reference counter in the device
- * structure and return a pointer to it.
- */
-dasd_device_t *
-dasd_get_device(dasd_devmap_t *devmap)
+struct dasd_device *
+dasd_device_from_devindex(int devindex)
 {
-	dasd_device_t *device;
+	struct dasd_devmap *devmap;
+	struct dasd_device *device;
 
+	devmap = dasd_devmap_from_devindex(devindex);
 	spin_lock(&dasd_devmap_lock);
 	device = devmap->device;
-	if (device != NULL)
-		atomic_inc(&device->ref_count);
+	if (device)
+		dasd_get_device(device);
+	else
+		device = ERR_PTR(-ENODEV);
 	spin_unlock(&dasd_devmap_lock);
-	if (device != NULL)
-		return device;
+	return device;
+}
+
+/*
+ * Return kdev for a dasd device.
+ */
+kdev_t
+dasd_get_kdev(struct dasd_device *device)
+{
+	struct dasd_devmap *devmap;
+	int major, minor;
+	int devno;
+
+	devno = _ccw_device_get_device_number(device->cdev);
+	devmap = dasd_devmap_from_devno(devno);
+	if (devmap == NULL)
+		return NODEV;
+	major = dasd_gendisk_index_major(devmap->devindex);
+	if (major < 0)
+		return NODEV;
+	minor = devmap->devindex % DASD_PER_MAJOR;
+	return mk_kdev(major, minor);
+}
+
+/*
+ * Create a dasd device structure for cdev.
+ */
+struct dasd_device *
+dasd_create_device(struct ccw_device *cdev)
+{
+	struct dasd_devmap *devmap;
+	struct dasd_device *device;
+	int devno;
+	int rc;
+
+	devno = _ccw_device_get_device_number(cdev);
+	rc = dasd_add_range(devno, devno, DASD_FEATURE_DEFAULT);
+	if (rc)
+		return ERR_PTR(rc);
+
+	if (!(devmap = dasd_devmap_from_devno (devno)))
+		return ERR_PTR(-ENODEV);
 
-	device = dasd_alloc_device(devmap);
+	device = dasd_alloc_device(devmap->devindex);
 	if (IS_ERR(device))
 		return device;
+	atomic_set(&device->ref_count, 1);
+	device->ro_flag = (devmap->features & DASD_FEATURE_READONLY) ? 1 : 0;
+	device->use_diag_flag = 1;
 
-	spin_lock(&dasd_devmap_lock);
-	if (devmap->device != NULL) {
+	spin_lock_irq(get_ccwdev_lock(cdev));
+	if (cdev->dev.driver_data == NULL) {
+		get_device(&cdev->dev);
+		cdev->dev.driver_data = device;
+		device->gdp->driverfs_dev = &cdev->dev;
+		device->cdev = cdev;
+		rc = 0;
+	} else
 		/* Someone else was faster. */
+		rc = -EBUSY;
+	spin_unlock_irq(get_ccwdev_lock(cdev));
+	if (rc) {
 		dasd_free_device(device);
-		device = devmap->device;
-	} else
-		devmap->device = device;
-	atomic_inc(&device->ref_count);
-	device->ro_flag = (devmap->features & DASD_FEATURE_READONLY) ? 1 : 0;
-	device->use_diag_flag = 1;
+		return ERR_PTR(rc);
+	}
+	/* Device created successfully. Make it known via devmap. */
+	spin_lock(&dasd_devmap_lock);
+	devmap->device = device;
 	spin_unlock(&dasd_devmap_lock);
+
 	return device;
 }
 
 /*
- * Decrease the reference counter of a devices structure. If the
- * reference counter reaches zero and the device status is
- * DASD_STATE_NEW the device structure is freed. 
+ * Wait queue for dasd_delete_device waits.
+ */
+static DECLARE_WAIT_QUEUE_HEAD(dasd_delete_wq);
+
+/*
+ * Remove a dasd device structure.
  */
 void
-dasd_put_device(dasd_devmap_t *devmap)
+dasd_delete_device(struct dasd_device *device)
 {
-	dasd_device_t *device;
+	struct ccw_device *cdev;
+	struct dasd_devmap *devmap;
+	int devno;
 
+	/* First remove device pointer from devmap. */
+	devno = _ccw_device_get_device_number(device->cdev);
+	devmap = dasd_devmap_from_devno (devno);
 	spin_lock(&dasd_devmap_lock);
-	device = devmap->device;
-	if (atomic_dec_return(&device->ref_count) == 0 &&
-	    device->state == DASD_STATE_NEW) {
-		devmap->device = NULL;
-		dasd_free_device(device);
-	}
+	devmap->device = NULL;
 	spin_unlock(&dasd_devmap_lock);
+
+	/* Wait for reference counter to drop to zero. */
+	atomic_dec(&device->ref_count);
+	wait_event(dasd_delete_wq, atomic_read(&device->ref_count) == 0);
+
+	/* Disconnect dasd_device structure from ccw_device structure. */
+	cdev = device->cdev;
+	device->cdev = NULL;
+	device->gdp->driverfs_dev = NULL;
+	cdev->dev.driver_data = NULL;
+
+	/* Put ccw_device structure. */
+	put_device(&cdev->dev);
+
+	/* Now the device structure can be freed. */
+	dasd_free_device(device);
+}
+
+/*
+ * Reference counter dropped to zero. Wake up waiter
+ * in dasd_delete_device.
+ */
+void
+dasd_put_device_wake(struct dasd_device *device)
+{
+	wake_up(&dasd_delete_wq);
 }
 
 int
diff -Nru a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c
--- a/drivers/s390/block/dasd_diag.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/block/dasd_diag.c	Sat Apr 19 19:51:28 2003
@@ -6,16 +6,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.27 $
- *
- * History of changes
- * 07/13/00 Added fixup sections for diagnoses ans saved some registers
- * 07/14/00 fixed constraints in newly generated inline asm
- * 10/05/00 adapted to 'new' DASD driver
- *	    fixed return codes of dia250()
- *	    fixed partition handling and HDIO_GETGEO
- * 2002/01/04 Created 2.4-2.5 compatibility mode
- * 05/04/02 code restructuring.
+ * $Revision: 1.31 $
  */
 
 #include <linux/config.h>
@@ -44,17 +35,17 @@
 
 MODULE_LICENSE("GPL");
 
-typedef struct dasd_diag_private_t {
-	dasd_diag_characteristics_t rdc_data;
-	diag_rw_io_t iob;
-	diag_init_io_t iib;
+struct dasd_diag_private {
+	struct dasd_diag_characteristics rdc_data;
+	struct dasd_diag_rw_io iob;
+	struct dasd_diag_init_io iib;
 	unsigned int pt_block;
-} dasd_diag_private_t;
+};
 
-typedef struct dasd_diag_req_t {
+struct dasd_diag_req {
 	int block_count;
-	diag_bio_t bio[0];
-} dasd_diag_req_t;
+	struct dasd_diag_bio bio[0];
+};
 
 static __inline__ int
 dia250(void *iob, int cmd)
@@ -86,17 +77,17 @@
 }
 
 static __inline__ int
-mdsk_init_io(dasd_device_t * device, int blocksize, int offset, int size)
+mdsk_init_io(struct dasd_device * device, int blocksize, int offset, int size)
 {
-	dasd_diag_private_t *private;
-	diag_init_io_t *iib;
+	struct dasd_diag_private *private;
+	struct dasd_diag_init_io *iib;
 	int rc;
 
-	private = (dasd_diag_private_t *) device->private;
+	private = (struct dasd_diag_private *) device->private;
 	iib = &private->iib;
-	memset(iib, 0, sizeof (diag_init_io_t));
+	memset(iib, 0, sizeof (struct dasd_diag_init_io));
 
-	iib->dev_nr = device->devno;
+	iib->dev_nr = _ccw_device_get_device_number(device->cdev);
 	iib->block_size = blocksize;
 	iib->offset = offset;
 	iib->start_block = 0;
@@ -108,33 +99,33 @@
 }
 
 static __inline__ int
-mdsk_term_io(dasd_device_t * device)
+mdsk_term_io(struct dasd_device * device)
 {
-	dasd_diag_private_t *private;
-	diag_init_io_t *iib;
+	struct dasd_diag_private *private;
+	struct dasd_diag_init_io *iib;
 	int rc;
 
-	private = (dasd_diag_private_t *) device->private;
+	private = (struct dasd_diag_private *) device->private;
 	iib = &private->iib;
-	memset(iib, 0, sizeof (diag_init_io_t));
-	iib->dev_nr = device->devno;
+	memset(iib, 0, sizeof (struct dasd_diag_init_io));
+	iib->dev_nr = _ccw_device_get_device_number(device->cdev);
 	rc = dia250(iib, TERM_BIO);
 	return rc & 3;
 }
 
 static int
-dasd_start_diag(dasd_ccw_req_t * cqr)
+dasd_start_diag(struct dasd_ccw_req * cqr)
 {
-	dasd_device_t *device;
-	dasd_diag_private_t *private;
-	dasd_diag_req_t *dreq;
+	struct dasd_device *device;
+	struct dasd_diag_private *private;
+	struct dasd_diag_req *dreq;
 	int rc;
 
 	device = cqr->device;
-	private = (dasd_diag_private_t *) device->private;
-	dreq = (dasd_diag_req_t *) cqr->data;
+	private = (struct dasd_diag_private *) device->private;
+	dreq = (struct dasd_diag_req *) cqr->data;
 
-	private->iob.dev_nr = device->devno;
+	private->iob.dev_nr = _ccw_device_get_device_number(device->cdev);
 	private->iob.key = 0;
 	private->iob.flags = 2;	/* do asynchronous io */
 	private->iob.block_count = dreq->block_count;
@@ -160,8 +151,8 @@
 static void
 dasd_ext_handler(struct pt_regs *regs, __u16 code)
 {
-	dasd_ccw_req_t *cqr, *next;
-	dasd_device_t *device;
+	struct dasd_ccw_req *cqr, *next;
+	struct dasd_device *device;
 	unsigned long long expires;
 	unsigned long flags;
 	char status;
@@ -186,11 +177,11 @@
 		irq_exit();
 		return;
 	}
-	cqr = (dasd_ccw_req_t *)(addr_t) ip;
-	device = (dasd_device_t *) cqr->device;
+	cqr = (struct dasd_ccw_req *)(addr_t) ip;
+	device = (struct dasd_device *) cqr->device;
 	if (strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) {
 		DEV_MESSAGE(KERN_WARNING, device,
-			    " magic number of dasd_ccw_req_t 0x%08X doesn't"
+			    " magic number of dasd_ccw_req 0x%08X doesn't"
 			    " match discipline 0x%08X",
 			    cqr->magic, *(int *) (&device->discipline->name));
 		irq_exit();
@@ -208,7 +199,7 @@
 		/* Start first request on queue if possible -> fast_io. */
 		if (!list_empty(&device->ccw_queue)) {
 			next = list_entry(device->ccw_queue.next,
-					  dasd_ccw_req_t, list);
+					  struct dasd_ccw_req, list);
 			if (next->status == DASD_CQR_QUEUED) {
 				if (dasd_start_diag(next) == 0)
 					expires = next->expires;
@@ -231,18 +222,18 @@
 }
 
 static int
-dasd_diag_check_device(dasd_device_t *device)
+dasd_diag_check_device(struct dasd_device *device)
 {
-	dasd_diag_private_t *private;
-	dasd_diag_characteristics_t *rdc_data;
-	diag_bio_t bio;
+	struct dasd_diag_private *private;
+	struct dasd_diag_characteristics *rdc_data;
+	struct dasd_diag_bio bio;
 	long *label;
 	int sb, bsize;
 	int rc;
 
-	private = (dasd_diag_private_t *) device->private;
+	private = (struct dasd_diag_private *) device->private;
 	if (private == NULL) {
-		private = kmalloc(sizeof(dasd_diag_private_t), GFP_KERNEL);
+		private = kmalloc(sizeof(struct dasd_diag_private),GFP_KERNEL);
 		if (private == NULL) {
 			MESSAGE(KERN_WARNING, "%s",
 				"memory allocation failed for private data");
@@ -252,8 +243,8 @@
 	}
 	/* Read Device Characteristics */
 	rdc_data = (void *) &(private->rdc_data);
-	rdc_data->dev_nr = device->devno;
-	rdc_data->rdc_len = sizeof (dasd_diag_characteristics_t);
+	rdc_data->dev_nr = _ccw_device_get_device_number(device->cdev);
+	rdc_data->rdc_len = sizeof (struct dasd_diag_characteristics);
 
 	rc = diag210((struct diag210 *) rdc_data);
 	if (rc)
@@ -289,11 +280,11 @@
 	}
 	for (bsize = 512; bsize <= PAGE_SIZE; bsize <<= 1) {
 		mdsk_init_io(device, bsize, 0, 64);
-		memset(&bio, 0, sizeof (diag_bio_t));
+		memset(&bio, 0, sizeof (struct dasd_diag_bio));
 		bio.type = MDSK_READ_REQ;
 		bio.block_number = private->pt_block + 1;
 		bio.buffer = __pa(label);
-		memset(&private->iob, 0, sizeof (diag_rw_io_t));
+		memset(&private->iob, 0, sizeof (struct dasd_diag_rw_io));
 		private->iob.dev_nr = rdc_data->dev_nr;
 		private->iob.key = 0;
 		private->iob.flags = 0;	/* do synchronous io */
@@ -324,7 +315,7 @@
 }
 
 static int
-dasd_diag_fill_geometry(dasd_device_t *device, struct hd_geometry *geo)
+dasd_diag_fill_geometry(struct dasd_device *device, struct hd_geometry *geo)
 {
 	if (dasd_check_blocksize(device->bp_block) != 0)
 		return -EINVAL;
@@ -335,29 +326,29 @@
 }
 
 static dasd_era_t
-dasd_diag_examine_error(dasd_ccw_req_t * cqr, struct irb * stat)
+dasd_diag_examine_error(struct dasd_ccw_req * cqr, struct irb * stat)
 {
 	return dasd_era_fatal;
 }
 
 static dasd_erp_fn_t
-dasd_diag_erp_action(dasd_ccw_req_t * cqr)
+dasd_diag_erp_action(struct dasd_ccw_req * cqr)
 {
 	return dasd_default_erp_action;
 }
 
 static dasd_erp_fn_t
-dasd_diag_erp_postaction(dasd_ccw_req_t * cqr)
+dasd_diag_erp_postaction(struct dasd_ccw_req * cqr)
 {
 	return dasd_default_erp_postaction;
 }
 
-static dasd_ccw_req_t *
-dasd_diag_build_cp(dasd_device_t * device, struct request *req)
+static struct dasd_ccw_req *
+dasd_diag_build_cp(struct dasd_device * device, struct request *req)
 {
-	dasd_ccw_req_t *cqr;
-	dasd_diag_req_t *dreq;
-	diag_bio_t *dbio;
+	struct dasd_ccw_req *cqr;
+	struct dasd_diag_req *dreq;
+	struct dasd_diag_bio *dbio;
 	struct bio *bio;
 	struct bio_vec *bv;
 	char *dst;
@@ -391,13 +382,14 @@
 	if (count != last_rec - first_rec + 1)
 		return ERR_PTR(-EINVAL);
 	/* Build the request */
-	datasize = sizeof(dasd_diag_req_t) + count*sizeof(diag_bio_t);
+	datasize = sizeof(struct dasd_diag_req) +
+		count*sizeof(struct dasd_diag_bio);
 	cqr = dasd_smalloc_request(dasd_diag_discipline.name, 0,
 				   datasize, device);
 	if (IS_ERR(cqr))
 		return cqr;
 	
-	dreq = (dasd_diag_req_t *) cqr->data;
+	dreq = (struct dasd_diag_req *) cqr->data;
 	dreq->block_count = count;
 	dbio = dreq->bio;
 	recid = first_rec;
@@ -405,7 +397,7 @@
 		bio_for_each_segment(bv, bio, i) {
 			dst = kmap(bv->bv_page) + bv->bv_offset;
 			for (off = 0; off < bv->bv_len; off += blksize) {
-				memset(dbio, 0, sizeof (diag_bio_t));
+				memset(dbio, 0, sizeof (struct dasd_diag_bio));
 				dbio->type = rw_cmd;
 				dbio->block_number = recid + 1;
 				dbio->buffer = __pa(dst);
@@ -423,24 +415,25 @@
 }
 
 static int
-dasd_diag_fill_info(dasd_device_t * device, dasd_information2_t * info)
+dasd_diag_fill_info(struct dasd_device * device,
+		    struct dasd_information2_t * info)
 {
-	dasd_diag_private_t *private;
+	struct dasd_diag_private *private;
 
-	private = (dasd_diag_private_t *) device->private;
+	private = (struct dasd_diag_private *) device->private;
 	info->label_block = private->pt_block;
 	info->FBA_layout = 1;
 	info->format = DASD_FORMAT_LDL;
-	info->characteristics_size = sizeof (dasd_diag_characteristics_t);
+	info->characteristics_size = sizeof (struct dasd_diag_characteristics);
 	memcpy(info->characteristics,
-	       &((dasd_diag_private_t *) device->private)->rdc_data,
-	       sizeof (dasd_diag_characteristics_t));
+	       &((struct dasd_diag_private *) device->private)->rdc_data,
+	       sizeof (struct dasd_diag_characteristics));
 	info->confdata_size = 0;
 	return 0;
 }
 
 static void
-dasd_diag_dump_sense(dasd_device_t *device, dasd_ccw_req_t * req,
+dasd_diag_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
 		     struct irb *stat)
 {
 	char *page;
@@ -463,15 +456,15 @@
  * max_blocks is dependent on the amount of storage that is available
  * in the static io buffer for each device. Currently each device has
  * 8192 bytes (=2 pages). dasd diag is only relevant for 31 bit.
- * The dasd_ccw_req_t has 96 bytes, the dasd_diag_req_t has 8 bytes and
- * the diag_bio_t for each block has 16 bytes. 
+ * The struct dasd_ccw_req has 96 bytes, the struct dasd_diag_req has
+ * 8 bytes and the struct dasd_diag_bio for each block has 16 bytes. 
  * That makes:
  * (8192 - 96 - 8) / 16 = 505.5 blocks at maximum.
  * We want to fit two into the available memory so that we can immediately
  * start the next request if one finishes off. That makes 252.75 blocks
  * for one request. Give a little safety and the result is 240.
  */
-dasd_discipline_t dasd_diag_discipline = {
+struct dasd_discipline dasd_diag_discipline = {
 	.owner = THIS_MODULE,
 	.name = "DIAG",
 	.ebcname = "DIAG",
diff -Nru a/drivers/s390/block/dasd_diag.h b/drivers/s390/block/dasd_diag.h
--- a/drivers/s390/block/dasd_diag.h	Sat Apr 19 19:51:46 2003
+++ b/drivers/s390/block/dasd_diag.h	Sat Apr 19 19:51:46 2003
@@ -6,10 +6,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.4 $
- *
- * History of changes
- *
+ * $Revision: 1.6 $
  */
 
 #define MDSK_WRITE_REQ 0x01
@@ -22,7 +19,7 @@
 #define DEV_CLASS_FBA	0x01
 #define DEV_CLASS_ECKD	0x04
 
-typedef struct dasd_diag_characteristics_t {
+struct dasd_diag_characteristics {
 	u16 dev_nr;
 	u16 rdc_len;
 	u8 vdev_class;
@@ -33,22 +30,18 @@
 	u8 rdev_type;
 	u8 rdev_model;
 	u8 rdev_features;
-} __attribute__ ((packed, aligned(4)))
+} __attribute__ ((packed, aligned(4)));
 
-    dasd_diag_characteristics_t;
-
-typedef struct diag_bio_t {
+struct dasd_diag_bio {
 	u8 type;
 	u8 status;
 	u16 spare1;
 	u32 block_number;
 	u32 alet;
 	u32 buffer;
-} __attribute__ ((packed, aligned(8)))
-
-    diag_bio_t;
+} __attribute__ ((packed, aligned(8)));
 
-typedef struct diag_init_io_t {
+struct dasd_diag_init_io {
 	u16 dev_nr;
 	u16 spare1[11];
 	u32 block_size;
@@ -56,11 +49,9 @@
 	u32 start_block;
 	u32 end_block;
 	u32 spare2[6];
-} __attribute__ ((packed, aligned(8)))
+} __attribute__ ((packed, aligned(8)));
 
-    diag_init_io_t;
-
-typedef struct diag_rw_io_t {
+struct dasd_diag_rw_io {
 	u16 dev_nr;
 	u16 spare1[11];
 	u8 key;
@@ -71,7 +62,5 @@
 	u32 bio_list;
 	u32 interrupt_params;
 	u32 spare3[5];
-} __attribute__ ((packed, aligned(8)))
-
-    diag_rw_io_t;
+} __attribute__ ((packed, aligned(8)));
 
diff -Nru a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
--- a/drivers/s390/block/dasd_eckd.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/s390/block/dasd_eckd.c	Sat Apr 19 19:51:27 2003
@@ -7,23 +7,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.36 $
- *
- * History of changes (starts July 2000)
- * 07/11/00 Enabled rotational position sensing
- * 07/14/00 Reorganized the format process for better ERP
- * 07/20/00 added experimental support for 2105 control unit (ESS)
- * 07/24/00 increased expiration time and added the missing zero
- * 08/07/00 added some bits to define_extent for ESS support
- * 09/20/00 added reserve and release ioctls
- * 10/04/00 changed RW-CCWS to R/W Key and Data
- * 10/10/00 reverted last change according to ESS exploitation
- * 10/10/00 now dequeuing init_cqr before freeing *ouch*
- * 26/10/00 fixed ITPM20144ASC (problems when accessing a device formatted by VIF)
- * 01/23/01 fixed kmalloc statement in dump_sense to be GFP_ATOMIC
- *	    fixed partition handling and HDIO_GETGEO
- * 2002/01/04 Created 2.4-2.5 compatibility mode
- * 05/04/02 code restructuring.
+ * $Revision: 1.42 $
  */
 
 #include <linux/config.h>
@@ -64,16 +48,16 @@
 
 MODULE_LICENSE("GPL");
 
-static dasd_discipline_t dasd_eckd_discipline;
+static struct dasd_discipline dasd_eckd_discipline;
 
-typedef struct dasd_eckd_private_t {
-	dasd_eckd_characteristics_t rdc_data;
-	dasd_eckd_confdata_t conf_data;
-	eckd_count_t count_area[5];
+struct dasd_eckd_private {
+	struct dasd_eckd_characteristics rdc_data;
+	struct dasd_eckd_confdata conf_data;
+	struct eckd_count count_area[5];
 	int init_cqr_status;
 	int uses_cdl;
-	attrib_data_t attrib;	/* e.g. cache operations */
-} dasd_eckd_private_t;
+	struct attrib_data_t attrib;	/* e.g. cache operations */
+};
 
 /* The ccw bus type uses this table to find devices that it sends to
  * dasd_eckd_probe */
@@ -132,7 +116,7 @@
 }
 
 static inline int
-bytes_per_record(dasd_eckd_characteristics_t *rdc, int kl, int dl)
+bytes_per_record(struct dasd_eckd_characteristics *rdc, int kl, int dl)
 {
 	unsigned int fl1, fl2, int1, int2;
 	int bpr;
@@ -164,13 +148,13 @@
 }
 
 static inline unsigned int
-bytes_per_track(dasd_eckd_characteristics_t *rdc)
+bytes_per_track(struct dasd_eckd_characteristics *rdc)
 {
 	return *(unsigned int *) (rdc->byte_per_track) >> 8;
 }
 
 static inline unsigned int
-recs_per_track(dasd_eckd_characteristics_t * rdc,
+recs_per_track(struct dasd_eckd_characteristics * rdc,
 	       unsigned int kl, unsigned int dl)
 {
 	int dn, kn;
@@ -204,12 +188,12 @@
 
 static inline void
 check_XRC (struct ccw1         *de_ccw,
-           DE_eckd_data_t *data,
-           dasd_device_t  *device)
+           struct DE_eckd_data *data,
+           struct dasd_device  *device)
 {
-        dasd_eckd_private_t *private;
+        struct dasd_eckd_private *private;
 
-        private = (dasd_eckd_private_t *) device->private;
+        private = (struct dasd_eckd_private *) device->private;
 
         /* switch on System Time Stamp - needed for XRC Support */
         if (private->rdc_data.facilities.XRC_supported) {
@@ -219,7 +203,7 @@
                 
                 data->ep_sys_time = get_clock ();
                 
-                de_ccw->count = sizeof (DE_eckd_data_t);
+                de_ccw->count = sizeof (struct DE_eckd_data);
                 de_ccw->flags = CCW_FLAG_SLI;  
         }
 
@@ -228,20 +212,20 @@
 } /* end check_XRC */
 
 static inline void
-define_extent(struct ccw1 * ccw, DE_eckd_data_t * data, int trk, int totrk,
-	      int cmd, dasd_device_t * device)
+define_extent(struct ccw1 * ccw, struct DE_eckd_data * data, int trk,
+	      int totrk, int cmd, struct dasd_device * device)
 {
-	dasd_eckd_private_t *private;
-	ch_t geo, beg, end;
+	struct dasd_eckd_private *private;
+	struct ch_t geo, beg, end;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 
 	ccw->cmd_code = DASD_ECKD_CCW_DEFINE_EXTENT;
 	ccw->flags = 0;
 	ccw->count = 16;
 	ccw->cda = (__u32) __pa(data);
 
-	memset(data, 0, sizeof (DE_eckd_data_t));
+	memset(data, 0, sizeof (struct DE_eckd_data));
 	switch (cmd) {
 	case DASD_ECKD_CCW_READ_HOME_ADDRESS:
 	case DASD_ECKD_CCW_READ_RECORD_ZERO:
@@ -319,15 +303,15 @@
 }
 
 static inline void
-locate_record(struct ccw1 *ccw, LO_eckd_data_t *data, int trk,
+locate_record(struct ccw1 *ccw, struct LO_eckd_data *data, int trk,
 	      int rec_on_trk, int no_rec, int cmd,
-	      dasd_device_t * device, int reclen)
+	      struct dasd_device * device, int reclen)
 {
-	dasd_eckd_private_t *private;
+	struct dasd_eckd_private *private;
 	int sector;
 	int dn, d;
 				
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 
 	DBF_EVENT(DBF_INFO,
 		  "Locate: trk %d, rec %d, no_rec %d, cmd %d, reclen %d",
@@ -338,7 +322,7 @@
 	ccw->count = 16;
 	ccw->cda = (__u32) __pa(data);
 
-	memset(data, 0, sizeof (LO_eckd_data_t));
+	memset(data, 0, sizeof (struct LO_eckd_data));
 	sector = 0;
 	if (rec_on_trk) {
 		switch (private->rdc_data.dev_type) {
@@ -456,17 +440,17 @@
 }
 
 static int
-dasd_eckd_check_characteristics(dasd_device_t *device)
+dasd_eckd_check_characteristics(struct dasd_device *device)
 {
-	dasd_eckd_private_t *private;
+	struct dasd_eckd_private *private;
 	void *rdc_data;
 	void *conf_data;
 	int conf_len;
 	int rc;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	if (private == NULL) {
-		private = kmalloc(sizeof(dasd_eckd_private_t),
+		private = kmalloc(sizeof(struct dasd_eckd_private),
 				  GFP_KERNEL | GFP_DMA);
 		if (private == NULL) {
 			MESSAGE(KERN_WARNING, "%s",
@@ -511,14 +495,15 @@
 		MESSAGE(KERN_WARNING, "%s", "No configuration data retrieved");
 		return 0;	/* no errror */
 	}
-	if (conf_len != sizeof (dasd_eckd_confdata_t)) {
+	if (conf_len != sizeof (struct dasd_eckd_confdata)) {
 		MESSAGE(KERN_WARNING,
 			"sizes of configuration data mismatch"
 			"%d (read) vs %ld (expected)",
-			conf_len, sizeof (dasd_eckd_confdata_t));
+			conf_len, sizeof (struct dasd_eckd_confdata));
 		return 0;	/* no errror */
 	}
-	memcpy(&private->conf_data, conf_data, sizeof (dasd_eckd_confdata_t));
+	memcpy(&private->conf_data, conf_data,
+	       sizeof (struct dasd_eckd_confdata));
 
 	DEV_MESSAGE(KERN_INFO, device,
 		    "%04X/%02X(CU:%04X/%02X): Configuration data read",
@@ -528,27 +513,28 @@
 		    private->rdc_data.cu_model.model);
 	return 0;
 
-        /* get characteristis via diag to determine the kind of minidisk under VM */
-        /* needed beacause XRC is not support by VM (jet)                         */
-        /* Can be removed as soon as VM supports XRC                              */
-	// TBD ??? HUM
+        /* get characteristis via diag to determine the kind of
+	 * minidisk under VM needed beacause XRC is not support
+	 * by VM (jet). Can be removed as soon as VM supports XRC
+	 * FIXME: TBD ??? HUM
+	 */
 }
 
-static dasd_ccw_req_t *
-dasd_eckd_analysis_ccw(struct dasd_device_t *device)
-{
-	dasd_eckd_private_t *private;
-	eckd_count_t *count_data;
-	LO_eckd_data_t *LO_data;
-	dasd_ccw_req_t *cqr;
+static struct dasd_ccw_req *
+dasd_eckd_analysis_ccw(struct dasd_device *device)
+{
+	struct dasd_eckd_private *private;
+	struct eckd_count *count_data;
+	struct LO_eckd_data *LO_data;
+	struct dasd_ccw_req *cqr;
 	struct ccw1 *ccw;
 	int cplength, datasize;
 	int i;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 
 	cplength = 8;
-	datasize = sizeof(DE_eckd_data_t) + 2*sizeof(LO_eckd_data_t);
+	datasize = sizeof(struct DE_eckd_data) + 2*sizeof(struct LO_eckd_data);
 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
 				   cplength, datasize, device);
 	if (IS_ERR(cqr))
@@ -557,7 +543,7 @@
 	/* Define extent for the first 3 tracks. */
 	define_extent(ccw++, cqr->data, 0, 2,
 		      DASD_ECKD_CCW_READ_COUNT, device);
-	LO_data = cqr->data + sizeof (DE_eckd_data_t);
+	LO_data = cqr->data + sizeof (struct DE_eckd_data);
 	/* Locate record for the first 4 records on track 0. */
 	ccw[-1].flags |= CCW_FLAG_CC;
 	locate_record(ccw++, LO_data++, 0, 0, 4,
@@ -600,25 +586,25 @@
  * for deletion in the meantime).
  */
 static void
-dasd_eckd_analysis_callback(dasd_ccw_req_t *init_cqr, void *data)
+dasd_eckd_analysis_callback(struct dasd_ccw_req *init_cqr, void *data)
 {
-	dasd_eckd_private_t *private;
-	dasd_device_t *device;
+	struct dasd_eckd_private *private;
+	struct dasd_device *device;
 
 	device = init_cqr->device;
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	private->init_cqr_status = init_cqr->status;
 	dasd_sfree_request(init_cqr, device);
 	dasd_kick_device(device);
 }
 
 static int
-dasd_eckd_start_analysis(struct dasd_device_t *device)
+dasd_eckd_start_analysis(struct dasd_device *device)
 {
-	dasd_eckd_private_t *private;
-	dasd_ccw_req_t *init_cqr;
+	struct dasd_eckd_private *private;
+	struct dasd_ccw_req *init_cqr;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	init_cqr = dasd_eckd_analysis_ccw(device);
 	if (IS_ERR(init_cqr))
 		return PTR_ERR(init_cqr);
@@ -630,14 +616,14 @@
 }
 
 static int
-dasd_eckd_end_analysis(struct dasd_device_t *device)
+dasd_eckd_end_analysis(struct dasd_device *device)
 {
-	dasd_eckd_private_t *private;
-	eckd_count_t *count_area;
+	struct dasd_eckd_private *private;
+	struct eckd_count *count_area;
 	unsigned int sb, blk_per_trk;
 	int status, i;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	status = private->init_cqr_status;
 	private->init_cqr_status = -1;
 	if (status != DASD_CQR_DONE) {
@@ -708,11 +694,11 @@
 }
 
 static int
-dasd_eckd_do_analysis(struct dasd_device_t *device)
+dasd_eckd_do_analysis(struct dasd_device *device)
 {
-	dasd_eckd_private_t *private;
+	struct dasd_eckd_private *private;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	if (private->init_cqr_status < 0)
 		return dasd_eckd_start_analysis(device);
 	else
@@ -720,34 +706,34 @@
 }
 
 static int
-dasd_eckd_fill_geometry(struct dasd_device_t *device, struct hd_geometry *geo)
+dasd_eckd_fill_geometry(struct dasd_device *device, struct hd_geometry *geo)
 {
-	int rc = 0;
-	dasd_eckd_private_t *private;
+	struct dasd_eckd_private *private;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	if (dasd_check_blocksize(device->bp_block) == 0) {
 		geo->sectors = recs_per_track(&private->rdc_data,
 					      0, device->bp_block);
 	}
 	geo->cylinders = private->rdc_data.no_cyl;
 	geo->heads = private->rdc_data.trk_per_cyl;
-	return rc;
+	return 0;
 }
 
-static dasd_ccw_req_t *
-dasd_eckd_format_device(dasd_device_t * device, format_data_t * fdata)
-{
-	dasd_eckd_private_t *private;
-	dasd_ccw_req_t *fcp;
-	eckd_count_t *ect;
+static struct dasd_ccw_req *
+dasd_eckd_format_device(struct dasd_device * device,
+			struct format_data_t * fdata)
+{
+	struct dasd_eckd_private *private;
+	struct dasd_ccw_req *fcp;
+	struct eckd_count *ect;
 	struct ccw1 *ccw;
 	void *data;
 	int rpt, cyl, head;
 	int cplength, datasize;
 	int i;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	rpt = recs_per_track(&private->rdc_data, 0, fdata->blksize);
 	cyl = fdata->start_unit / private->rdc_data.trk_per_cyl;
 	head = fdata->start_unit % private->rdc_data.trk_per_cyl;
@@ -782,20 +768,24 @@
 	case 0x00:	/* Normal format */
 	case 0x08:	/* Normal format, use cdl. */
 		cplength = 2 + rpt;
-		datasize = sizeof(DE_eckd_data_t) + sizeof(LO_eckd_data_t) +
-			rpt * sizeof(eckd_count_t);
+		datasize = sizeof(struct DE_eckd_data) +
+			sizeof(struct LO_eckd_data) +
+			rpt * sizeof(struct eckd_count);
 		break;
 	case 0x01:	/* Write record zero and format track. */
 	case 0x09:	/* Write record zero and format track, use cdl. */
 		cplength = 3 + rpt;
-		datasize = sizeof(DE_eckd_data_t) + sizeof(LO_eckd_data_t) +
-			sizeof(eckd_count_t) + rpt * sizeof(eckd_count_t);
+		datasize = sizeof(struct DE_eckd_data) +
+			sizeof(struct LO_eckd_data) +
+			sizeof(struct eckd_count) +
+			rpt * sizeof(struct eckd_count);
 		break;
 	case 0x04:	/* Invalidate track. */
 	case 0x0c:	/* Invalidate track, use cdl. */
 		cplength = 3;
-		datasize = sizeof(DE_eckd_data_t) + sizeof(LO_eckd_data_t) +
-			sizeof(eckd_count_t);
+		datasize = sizeof(struct DE_eckd_data) +
+			sizeof(struct LO_eckd_data) +
+			sizeof(struct eckd_count);
 		break;
 	default:
 		MESSAGE(KERN_WARNING, "Invalid flags 0x%x.", fdata->intensity);
@@ -812,45 +802,45 @@
 
 	switch (fdata->intensity & ~0x08) {
 	case 0x00: /* Normal format. */
-		define_extent(ccw++, (DE_eckd_data_t *) data,
+		define_extent(ccw++, (struct DE_eckd_data *) data,
 			      fdata->start_unit, fdata->start_unit,
 			      DASD_ECKD_CCW_WRITE_CKD, device);
-		data += sizeof(DE_eckd_data_t);
+		data += sizeof(struct DE_eckd_data);
 		ccw[-1].flags |= CCW_FLAG_CC;
-		locate_record(ccw++, (LO_eckd_data_t *) data,
+		locate_record(ccw++, (struct LO_eckd_data *) data,
 			      fdata->start_unit, 0, rpt,
 			      DASD_ECKD_CCW_WRITE_CKD, device,
 			      fdata->blksize);
-		data += sizeof(LO_eckd_data_t);
+		data += sizeof(struct LO_eckd_data);
 		break;
 	case 0x01: /* Write record zero + format track. */
-		define_extent(ccw++, (DE_eckd_data_t *) data,
+		define_extent(ccw++, (struct DE_eckd_data *) data,
 			      fdata->start_unit, fdata->start_unit,
 			      DASD_ECKD_CCW_WRITE_RECORD_ZERO,
 			      device);
-		data += sizeof(DE_eckd_data_t);
+		data += sizeof(struct DE_eckd_data);
 		ccw[-1].flags |= CCW_FLAG_CC;
-		locate_record(ccw++, (LO_eckd_data_t *) data,
+		locate_record(ccw++, (struct LO_eckd_data *) data,
 			      fdata->start_unit, 0, rpt + 1,
 			      DASD_ECKD_CCW_WRITE_RECORD_ZERO, device,
 			      device->bp_block);
-		data += sizeof(LO_eckd_data_t);
+		data += sizeof(struct LO_eckd_data);
 		break;
 	case 0x04: /* Invalidate track. */
-		define_extent(ccw++, (DE_eckd_data_t *) data,
+		define_extent(ccw++, (struct DE_eckd_data *) data,
 			      fdata->start_unit, fdata->start_unit,
 			      DASD_ECKD_CCW_WRITE_CKD, device);
-		data += sizeof(DE_eckd_data_t);
+		data += sizeof(struct DE_eckd_data);
 		ccw[-1].flags |= CCW_FLAG_CC;
-		locate_record(ccw++, (LO_eckd_data_t *) data,
+		locate_record(ccw++, (struct LO_eckd_data *) data,
 			      fdata->start_unit, 0, 1,
 			      DASD_ECKD_CCW_WRITE_CKD, device, 8);
-		data += sizeof(LO_eckd_data_t);
+		data += sizeof(struct LO_eckd_data);
 		break;
 	}
 	if (fdata->intensity & 0x01) {	/* write record zero */
-		ect = (eckd_count_t *) data;
-		data += sizeof(eckd_count_t);
+		ect = (struct eckd_count *) data;
+		data += sizeof(struct eckd_count);
 		ect->cyl = cyl;
 		ect->head = head;
 		ect->record = 0;
@@ -863,8 +853,8 @@
 		ccw->cda = (__u32)(addr_t) ect;
 	}
 	if (fdata->intensity & 0x04) {	/* erase track */
-		ect = (eckd_count_t *) data;
-		data += sizeof(eckd_count_t);
+		ect = (struct eckd_count *) data;
+		data += sizeof(struct eckd_count);
 		ect->cyl = cyl;
 		ect->head = head;
 		ect->record = 1;
@@ -877,8 +867,8 @@
 		ccw->cda = (__u32)(addr_t) ect;
 	} else {		/* write remaining records */
 		for (i = 0; i < rpt; i++) {
-			ect = (eckd_count_t *) data;
-			data += sizeof(eckd_count_t);
+			ect = (struct eckd_count *) data;
+			data += sizeof(struct eckd_count);
 			ect->cyl = cyl;
 			ect->head = head;
 			ect->record = i + 1;
@@ -912,9 +902,9 @@
 }
 
 static dasd_era_t
-dasd_eckd_examine_error(dasd_ccw_req_t * cqr, struct irb * irb)
+dasd_eckd_examine_error(struct dasd_ccw_req * cqr, struct irb * irb)
 {
-	dasd_device_t *device = (dasd_device_t *) cqr->device;
+	struct dasd_device *device = (struct dasd_device *) cqr->device;
 	struct ccw_device *cdev = device->cdev;
 
 	if (irb->scsw.cstat == 0x00 &&
@@ -936,9 +926,9 @@
 }
 
 static dasd_erp_fn_t
-dasd_eckd_erp_action(dasd_ccw_req_t * cqr)
+dasd_eckd_erp_action(struct dasd_ccw_req * cqr)
 {
-	dasd_device_t *device = (dasd_device_t *) cqr->device;
+	struct dasd_device *device = (struct dasd_device *) cqr->device;
 	struct ccw_device *cdev = device->cdev;
 
 	switch (cdev->id.cu_type) {
@@ -954,18 +944,18 @@
 }
 
 static dasd_erp_fn_t
-dasd_eckd_erp_postaction(dasd_ccw_req_t * cqr)
+dasd_eckd_erp_postaction(struct dasd_ccw_req * cqr)
 {
 	return dasd_default_erp_postaction;
 }
 
-static dasd_ccw_req_t *
-dasd_eckd_build_cp(dasd_device_t * device, struct request *req)
+static struct dasd_ccw_req *
+dasd_eckd_build_cp(struct dasd_device * device, struct request *req)
 {
-	dasd_eckd_private_t *private;
+	struct dasd_eckd_private *private;
 	unsigned long *idaws;
-	LO_eckd_data_t *LO_data;
-	dasd_ccw_req_t *cqr;
+	struct LO_eckd_data *LO_data;
+	struct dasd_ccw_req *cqr;
 	struct ccw1 *ccw;
 	struct bio *bio;
 	struct bio_vec *bv;
@@ -978,7 +968,7 @@
 	unsigned char cmd, rcmd;
 	int i;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	if (rq_data_dir(req) == READ)
 		cmd = DASD_ECKD_CCW_READ_MT;
 	else if (rq_data_dir(req) == WRITE)
@@ -991,7 +981,8 @@
 	/* Calculate record id of first and last block. */
 	first_rec = first_trk = req->sector >> device->s2b_shift;
 	first_offs = sector_div(first_trk, blk_per_trk);
-	last_rec = last_trk = (req->sector + req->nr_sectors - 1) >> device->s2b_shift;
+	last_rec = last_trk =
+		(req->sector + req->nr_sectors - 1) >> device->s2b_shift;
 	last_offs = sector_div(last_trk, blk_per_trk);
 	/* Check struct bio and count the number of blocks for the request. */
 	count = 0;
@@ -1003,7 +994,7 @@
 				return ERR_PTR(-EINVAL);
 			count += bv->bv_len >> (device->s2b_shift + 9);
 #if defined(CONFIG_ARCH_S390X)
-			cidaw += idal_nr_words(kmap(bv->bv_page) +
+			cidaw += idal_nr_words(page_address(bv->bv_page) +
 					       bv->bv_offset, bv->bv_len);
 #endif
 		}
@@ -1014,14 +1005,14 @@
 	/* 1x define extent + 1x locate record + number of blocks */
 	cplength = 2 + count;
 	/* 1x define extent + 1x locate record + cidaws*sizeof(long) */
-	datasize = sizeof(DE_eckd_data_t) + sizeof(LO_eckd_data_t) +
+	datasize = sizeof(struct DE_eckd_data) + sizeof(struct LO_eckd_data) +
 		cidaw * sizeof(unsigned long);
 	/* Find out the number of additional locate record ccws for cdl. */
 	if (private->uses_cdl && first_rec < 2*blk_per_trk) {
 		if (last_rec >= 2*blk_per_trk)
 			count = 2*blk_per_trk - first_rec;
 		cplength += count;
-		datasize += count*sizeof(LO_eckd_data_t);
+		datasize += count*sizeof(struct LO_eckd_data);
 	}
 	/* Allocate the ccw request. */
 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
@@ -1032,8 +1023,8 @@
 	/* First ccw is define extent. */
 	define_extent(ccw++, cqr->data, first_trk, last_trk, cmd, device);
 	/* Build locate_record+read/write/ccws. */
-	idaws = (unsigned long *) (cqr->data + sizeof(DE_eckd_data_t));
-	LO_data = (LO_eckd_data_t *) (idaws + cidaw);
+	idaws = (unsigned long *) (cqr->data + sizeof(struct DE_eckd_data));
+	LO_data = (struct LO_eckd_data *) (idaws + cidaw);
 	recid = first_rec;
 	if (private->uses_cdl == 0 || recid > 2*blk_per_trk) {
 		/* Only standard blocks so there is just one locate record. */
@@ -1042,7 +1033,7 @@
 			      last_rec - recid + 1, cmd, device, blksize);
 	}
 	rq_for_each_bio(bio, req) bio_for_each_segment(bv, bio, i) {
-		dst = kmap(bv->bv_page) + bv->bv_offset;
+		dst = page_address(bv->bv_page) + bv->bv_offset;
 		for (off = 0; off < bv->bv_len; off += blksize) {
 			sector_t trkid = recid;
 			unsigned int recoffs = sector_div(trkid, blk_per_trk);
@@ -1097,20 +1088,21 @@
 }
 
 static int
-dasd_eckd_fill_info(dasd_device_t * device, dasd_information2_t * info)
+dasd_eckd_fill_info(struct dasd_device * device,
+		    struct dasd_information2_t * info)
 {
-	dasd_eckd_private_t *private;
+	struct dasd_eckd_private *private;
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 	info->label_block = 2;
 	info->FBA_layout = private->uses_cdl ? 0 : 1;
 	info->format = private->uses_cdl ? DASD_FORMAT_CDL : DASD_FORMAT_LDL;
-	info->characteristics_size = sizeof(dasd_eckd_characteristics_t);
+	info->characteristics_size = sizeof(struct dasd_eckd_characteristics);
 	memcpy(info->characteristics, &private->rdc_data,
-	       sizeof(dasd_eckd_characteristics_t));
-	info->confdata_size = sizeof (dasd_eckd_confdata_t);
+	       sizeof(struct dasd_eckd_characteristics));
+	info->confdata_size = sizeof (struct dasd_eckd_confdata);
 	memcpy(info->configuration_data, &private->conf_data,
-	       sizeof (dasd_eckd_confdata_t));
+	       sizeof (struct dasd_eckd_confdata));
 	return 0;
 }
 
@@ -1126,8 +1118,8 @@
 static int
 dasd_eckd_release(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
-	dasd_ccw_req_t *cqr;
+	struct dasd_device *device;
+	struct dasd_ccw_req *cqr;
 	int rc;
 
 	if (!capable(CAP_SYS_ADMIN))
@@ -1166,8 +1158,8 @@
 static int
 dasd_eckd_reserve(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
-	dasd_ccw_req_t *cqr;
+	struct dasd_device *device;
+	struct dasd_ccw_req *cqr;
 	int rc;
 
 	if (!capable(CAP_SYS_ADMIN))
@@ -1210,8 +1202,8 @@
 static int
 dasd_eckd_steal_lock(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
-	dasd_ccw_req_t *cqr;
+	struct dasd_device *device;
+	struct dasd_ccw_req *cqr;
 	int rc;
 
 	if (!capable(CAP_SYS_ADMIN))
@@ -1251,10 +1243,10 @@
 static int
 dasd_eckd_performance(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
-	dasd_psf_prssd_data_t *prssdp;
-	dasd_rssd_perf_stats_t *stats;
-	dasd_ccw_req_t *cqr;
+	struct dasd_device *device;
+	struct dasd_psf_prssd_data *prssdp;
+	struct dasd_rssd_perf_stats_t *stats;
+	struct dasd_ccw_req *cqr;
 	struct ccw1 *ccw;
 	int rc;
 
@@ -1264,8 +1256,9 @@
 
 	cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
 				   1 /* PSF */  + 1 /* RSSD */ ,
-				   (sizeof (dasd_psf_prssd_data_t) +
-				    sizeof (dasd_rssd_perf_stats_t)), device);
+				   (sizeof (struct dasd_psf_prssd_data) +
+				    sizeof (struct dasd_rssd_perf_stats_t)),
+				   device);
 	if (cqr == NULL) {
 		MESSAGE(KERN_WARNING, "%s",
 			"No memory to allocate initialization request");
@@ -1276,24 +1269,24 @@
 	cqr->expires = 10 * HZ;
 
 	/* Prepare for Read Subsystem Data */
-	prssdp = (dasd_psf_prssd_data_t *) cqr->data;
-	memset(prssdp, 0, sizeof (dasd_psf_prssd_data_t));
+	prssdp = (struct dasd_psf_prssd_data *) cqr->data;
+	memset(prssdp, 0, sizeof (struct dasd_psf_prssd_data));
 	prssdp->order = PSF_ORDER_PRSSD;
 	prssdp->suborder = 0x01;	/* Perfomance Statistics */
 	prssdp->varies[1] = 0x01;	/* Perf Statistics for the Subsystem */
 
 	ccw = cqr->cpaddr;
 	ccw->cmd_code = DASD_ECKD_CCW_PSF;
-	ccw->count = sizeof (dasd_psf_prssd_data_t);
+	ccw->count = sizeof (struct dasd_psf_prssd_data);
 	ccw->flags |= CCW_FLAG_CC;
 	ccw->cda = (__u32)(addr_t) prssdp;
 
 	/* Read Subsystem Data - Performance Statistics */
-	stats = (dasd_rssd_perf_stats_t *) (prssdp + 1);
-	memset(stats, 0, sizeof (dasd_rssd_perf_stats_t));
+	stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
+	memset(stats, 0, sizeof (struct dasd_rssd_perf_stats_t));
 
 	ccw->cmd_code = DASD_ECKD_CCW_RSSD;
-	ccw->count = sizeof (dasd_rssd_perf_stats_t);
+	ccw->count = sizeof (struct dasd_rssd_perf_stats_t);
 	ccw->cda = (__u32)(addr_t) stats;
 
 	cqr->buildclk = get_clock();
@@ -1301,10 +1294,10 @@
 	rc = dasd_sleep_on(cqr);
 	if (rc == 0) {
 		/* Prepare for Read Subsystem Data */
-		prssdp = (dasd_psf_prssd_data_t *) cqr->data;
-		stats = (dasd_rssd_perf_stats_t *) (prssdp + 1);
+		prssdp = (struct dasd_psf_prssd_data *) cqr->data;
+		stats = (struct dasd_rssd_perf_stats_t *) (prssdp + 1);
 		rc = copy_to_user((long *) args, (long *) stats,
-				  sizeof(dasd_rssd_perf_stats_t));
+				  sizeof(struct dasd_rssd_perf_stats_t));
 	}
 	dasd_sfree_request(cqr, cqr->device);
 	return rc;
@@ -1317,9 +1310,9 @@
 static int
 dasd_eckd_set_attrib(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
-	dasd_eckd_private_t *private;
-	attrib_data_t attrib;
+	struct dasd_device *device;
+	struct dasd_eckd_private *private;
+	struct attrib_data_t attrib;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
@@ -1330,11 +1323,12 @@
 	if (device == NULL)
 		return -ENODEV;
 
-	if (copy_from_user(&attrib, (void *) args, sizeof (attrib_data_t))) {
+	if (copy_from_user(&attrib, (void *) args,
+			   sizeof (struct attrib_data_t))) {
 		return -EFAULT;
 	}
 
-	private = (dasd_eckd_private_t *) device->private;
+	private = (struct dasd_eckd_private *) device->private;
 
 	DBF_DEV_EVENT(DBF_ERR, device,
 		      "cache operation mode got "
@@ -1351,7 +1345,7 @@
 }
 
 static void
-dasd_eckd_dump_sense(struct dasd_device_t *device, dasd_ccw_req_t * req,
+dasd_eckd_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
 		     struct irb *irb)
 {
 
@@ -1422,7 +1416,7 @@
  * max_blocks is dependent on the amount of storage that is available
  * in the static io buffer for each device. Currently each device has
  * 8192 bytes (=2 pages). For 64 bit one dasd_mchunkt_t structure has
- * 24 bytes, the dasd_ccw_req_t has 136 bytes and each block can use
+ * 24 bytes, the struct dasd_ccw_req has 136 bytes and each block can use
  * up to 16 bytes (8 for the ccw and 8 for the idal pointer). In
  * addition we have one define extent ccw + 16 bytes of data and one
  * locate record ccw + 16 bytes of data. That makes:
@@ -1431,7 +1425,7 @@
  * start the next request if one finishes off. That makes 249.5 blocks
  * for one request. Give a little safety and the result is 240.
  */
-static dasd_discipline_t dasd_eckd_discipline = {
+static struct dasd_discipline dasd_eckd_discipline = {
 	.owner = THIS_MODULE,
 	.name = "ECKD",
 	.ebcname = "ECKD",
@@ -1453,6 +1447,8 @@
 static int __init
 dasd_eckd_init(void)
 {
+	int ret;
+
 	dasd_ioctl_no_register(THIS_MODULE, BIODASDSATTR,
 			       dasd_eckd_set_attrib);
 	dasd_ioctl_no_register(THIS_MODULE, BIODASDPSRD,
@@ -1466,7 +1462,22 @@
 
 	ASCEBC(dasd_eckd_discipline.ebcname, 4);
 
-	ccw_driver_register(&dasd_eckd_driver);
+	ret = ccw_driver_register(&dasd_eckd_driver);
+	if (ret) {
+		dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSATTR,
+					 dasd_eckd_set_attrib);
+		dasd_ioctl_no_unregister(THIS_MODULE, BIODASDPSRD,
+					 dasd_eckd_performance);
+		dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRLSE,
+					 dasd_eckd_release);
+		dasd_ioctl_no_unregister(THIS_MODULE, BIODASDRSRV,
+					 dasd_eckd_reserve);
+		dasd_ioctl_no_unregister(THIS_MODULE, BIODASDSLCK,
+					 dasd_eckd_steal_lock);
+		return ret;
+	}
+
+	dasd_generic_auto_online(&dasd_eckd_driver);
 	return 0;
 }
 
diff -Nru a/drivers/s390/block/dasd_eckd.h b/drivers/s390/block/dasd_eckd.h
--- a/drivers/s390/block/dasd_eckd.h	Sat Apr 19 19:51:46 2003
+++ b/drivers/s390/block/dasd_eckd.h	Sat Apr 19 19:51:46 2003
@@ -5,10 +5,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.6 $
- *
- * History of changes 
- * 
+ * $Revision: 1.8 $
  */
 
 #ifndef DASD_ECKD_H
@@ -52,49 +49,49 @@
  * SECTION: Type Definitions
  ******************************************************************************/
 
-typedef struct eckd_count_t {
+struct eckd_count {
 	__u16 cyl;
 	__u16 head;
 	__u8 record;
 	__u8 kl;
 	__u16 dl;
-} __attribute__ ((packed)) eckd_count_t;
+} __attribute__ ((packed));
 
-typedef struct ch_t {
+struct ch_t {
 	__u16 cyl;
 	__u16 head;
-} __attribute__ ((packed)) ch_t;
+} __attribute__ ((packed));
 
-typedef struct chs_t {
+struct chs_t {
 	__u16 cyl;
 	__u16 head;
 	__u32 sector;
-} __attribute__ ((packed)) chs_t;
+} __attribute__ ((packed));
 
-typedef struct chr_t {
+struct chr_t {
 	__u16 cyl;
 	__u16 head;
 	__u8 record;
-} __attribute__ ((packed)) chr_t;
+} __attribute__ ((packed));
 
-typedef struct geom_t {
+struct geom_t {
 	__u16 cyl;
 	__u16 head;
 	__u32 sector;
-} __attribute__ ((packed)) geom_t;
+} __attribute__ ((packed));
 
-typedef struct eckd_home_t {
+struct eckd_home {
 	__u8 skip_control[14];
 	__u16 cell_number;
 	__u8 physical_addr[3];
 	__u8 flag;
-	ch_t track_addr;
+	struct ch_t track_addr;
 	__u8 reserved;
 	__u8 key_length;
 	__u8 reserved2[2];
-} __attribute__ ((packed)) eckd_home_t;
+} __attribute__ ((packed));
 
-typedef struct DE_eckd_data_t {
+struct DE_eckd_data {
 	struct {
 		unsigned char perm:2;	/* Permissions on this extent */
 		unsigned char reserved:1;
@@ -113,15 +110,15 @@
 	__u16 fast_write_id;
 	__u8 ga_additional;	/* Global Attributes Additional */
 	__u8 ga_extended;	/* Global Attributes Extended	*/
-	ch_t beg_ext;
-	ch_t end_ext;
+	struct ch_t beg_ext;
+	struct ch_t end_ext;
 	unsigned long long ep_sys_time; /* Extended Parameter - System Time Stamp */
 	__u8 ep_format;        /* Extended Parameter format byte       */
 	__u8 ep_prio;          /* Extended Parameter priority I/O byte */
 	__u8 ep_reserved[6];   /* Extended Parameter Reserved          */
-} __attribute__ ((packed)) DE_eckd_data_t;
+} __attribute__ ((packed));
 
-typedef struct LO_eckd_data_t {
+struct LO_eckd_data {
 	struct {
 		unsigned char orientation:2;
 		unsigned char operation:6;
@@ -133,13 +130,13 @@
 	} __attribute__ ((packed)) auxiliary;
 	__u8 unused;
 	__u8 count;
-	ch_t seek_addr;
-	chr_t search_arg;
+	struct ch_t seek_addr;
+	struct chr_t search_arg;
 	__u8 sector;
 	__u16 length;
-} __attribute__ ((packed)) LO_eckd_data_t;
+} __attribute__ ((packed));
 
-typedef struct dasd_eckd_characteristics_t {
+struct dasd_eckd_characteristics {
 	__u16 cu_type;
 	struct {
 		unsigned char support:2;
@@ -210,9 +207,9 @@
 	__u8 factor8;
 	__u8 reserved2[3];
 	__u8 reserved3[10];
-} __attribute__ ((packed)) dasd_eckd_characteristics_t;
+} __attribute__ ((packed));
 
-typedef struct dasd_eckd_confdata_t {
+struct dasd_eckd_confdata {
 	struct {
 		struct {
 			unsigned char identifier:2;
@@ -327,17 +324,17 @@
 		__u8 log_dev_address;
 		unsigned char reserved2[12];
 	} __attribute__ ((packed)) neq;
-} __attribute__ ((packed)) dasd_eckd_confdata_t;
+} __attribute__ ((packed));
 
 /*
  * Perform Subsystem Function - Prepare for Read Subsystem Data	 
  */
-typedef struct dasd_psf_prssd_data_t {
+struct dasd_psf_prssd_data {
 	unsigned char order;
 	unsigned char flags;
 	unsigned char reserved[4];
 	unsigned char suborder;
 	unsigned char varies[9];
-} __attribute__ ((packed)) dasd_psf_prssd_data_t;
+} __attribute__ ((packed));
 
 #endif				/* DASD_ECKD_H */
diff -Nru a/drivers/s390/block/dasd_erp.c b/drivers/s390/block/dasd_erp.c
--- a/drivers/s390/block/dasd_erp.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/block/dasd_erp.c	Sat Apr 19 19:51:28 2003
@@ -7,14 +7,10 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
- * $Revision: 1.6 $
- *
- * History of changes
- * 05/04/02 split from dasd.c, code restructuring.
+ * $Revision: 1.9 $
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/ctype.h>
 #include <linux/init.h>
 
@@ -27,12 +23,12 @@
 
 #include "dasd_int.h"
 
-dasd_ccw_req_t *
+struct dasd_ccw_req *
 dasd_alloc_erp_request(char *magic, int cplength, int datasize,
-		       dasd_device_t * device)
+		       struct dasd_device * device)
 {
 	unsigned long flags;
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	char *data;
 	int size;
 
@@ -45,18 +41,19 @@
 	debug_int_event ( dasd_debug_area, 1, cplength);
 	debug_int_event ( dasd_debug_area, 1, datasize);
 
-	size = (sizeof(dasd_ccw_req_t) + 7L) & -8L;
+	size = (sizeof(struct dasd_ccw_req) + 7L) & -8L;
 	if (cplength > 0)
 		size += cplength * sizeof(struct ccw1);
 	if (datasize > 0)
 		size += datasize;
 	spin_lock_irqsave(&device->mem_lock, flags);
-	cqr = (dasd_ccw_req_t *) dasd_alloc_chunk(&device->erp_chunks, size);
+	cqr = (struct dasd_ccw_req *)
+		dasd_alloc_chunk(&device->erp_chunks, size);
 	spin_unlock_irqrestore(&device->mem_lock, flags);
 	if (cqr == NULL)
 		return ERR_PTR(-ENOMEM);
-	memset(cqr, 0, sizeof(dasd_ccw_req_t));
-	data = (char *) cqr + ((sizeof(dasd_ccw_req_t) + 7L) & -8L);
+	memset(cqr, 0, sizeof(struct dasd_ccw_req));
+	data = (char *) cqr + ((sizeof(struct dasd_ccw_req) + 7L) & -8L);
 	cqr->cpaddr = NULL;
 	if (cplength > 0) {
 		cqr->cpaddr = (struct ccw1 *) data;
@@ -75,7 +72,7 @@
 }
 
 void
-dasd_free_erp_request(dasd_ccw_req_t * cqr, dasd_device_t * device)
+dasd_free_erp_request(struct dasd_ccw_req * cqr, struct dasd_device * device)
 {
 	unsigned long flags;
 
@@ -91,8 +88,8 @@
 
 /*
  * DESCRIPTION
- *   sets up the default-ERP dasd_ccw_req_t, namely one, which performs a TIC
- *   to the original channel program with a retry counter of 16
+ *   sets up the default-ERP struct dasd_ccw_req, namely one, which performs
+ *   a TIC to the original channel program with a retry counter of 16
  *
  * PARAMETER
  *   cqr		failed CQR
@@ -100,11 +97,11 @@
  * RETURN VALUES
  *   erp		CQR performing the ERP
  */
-dasd_ccw_req_t *
-dasd_default_erp_action(dasd_ccw_req_t * cqr)
+struct dasd_ccw_req *
+dasd_default_erp_action(struct dasd_ccw_req * cqr)
 {
-	dasd_device_t *device;
-	dasd_ccw_req_t *erp;
+	struct dasd_device *device;
+	struct dasd_ccw_req *erp;
 
 	MESSAGE(KERN_DEBUG, "%s", "Default ERP called... ");
 	device = cqr->device;
@@ -147,10 +144,10 @@
  * RETURN VALUES
  *   cqr		pointer to the original CQR
  */
-dasd_ccw_req_t *
-dasd_default_erp_postaction(dasd_ccw_req_t * cqr)
+struct dasd_ccw_req *
+dasd_default_erp_postaction(struct dasd_ccw_req * cqr)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int success;
 
 	if (cqr->refers == NULL || cqr->function == NULL)
@@ -161,7 +158,7 @@
 
 	/* free all ERPs - but NOT the original cqr */
 	while (cqr->refers != NULL) {
-		dasd_ccw_req_t *refers;
+		struct dasd_ccw_req *refers;
 
 		refers = cqr->refers;
 		/* remove the request from the device queue */
@@ -189,7 +186,7 @@
  * real request.
  */
 static inline void
-hex_dump_memory(dasd_device_t *device, void *data, int len)
+hex_dump_memory(struct dasd_device *device, void *data, int len)
 {
 	int *pint;
 
@@ -203,9 +200,9 @@
 }
 
 void
-dasd_log_sense(dasd_ccw_req_t *cqr, struct irb *irb)
+dasd_log_sense(struct dasd_ccw_req *cqr, struct irb *irb)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	device = cqr->device;
 	/* dump sense data */
@@ -214,10 +211,10 @@
 }
 
 void
-dasd_log_ccw(dasd_ccw_req_t * cqr, int caller, __u32 cpa)
+dasd_log_ccw(struct dasd_ccw_req * cqr, int caller, __u32 cpa)
 {
-	dasd_device_t *device;
-	dasd_ccw_req_t *lcqr;
+	struct dasd_device *device;
+	struct dasd_ccw_req *lcqr;
 	struct ccw1 *ccw;
 	int cplength;
 
@@ -227,7 +224,7 @@
 		DEV_MESSAGE(KERN_ERR, device,
 			    "(%s) ERP chain report for req: %p",
 			    caller == 0 ? "EXAMINE" : "ACTION", lcqr);
-		hex_dump_memory(device, lcqr, sizeof(dasd_ccw_req_t));
+		hex_dump_memory(device, lcqr, sizeof(struct dasd_ccw_req));
 
 		cplength = 1;
 		ccw = lcqr->cpaddr;
diff -Nru a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c
--- a/drivers/s390/block/dasd_fba.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/block/dasd_fba.c	Sat Apr 19 19:51:49 2003
@@ -4,12 +4,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.25 $
- *
- * History of changes
- *	    fixed partition handling and HDIO_GETGEO
- * 2002/01/04 Created 2.4-2.5 compatibility mode
- * 05/04/02 code restructuring.
+ * $Revision: 1.29 $
  */
 
 #include <linux/config.h>
@@ -44,11 +39,11 @@
 
 MODULE_LICENSE("GPL");
 
-static dasd_discipline_t dasd_fba_discipline;
+static struct dasd_discipline dasd_fba_discipline;
 
-typedef struct dasd_fba_private_t {
-	dasd_fba_characteristics_t rdc_data;
-} dasd_fba_private_t;
+struct dasd_fba_private {
+	struct dasd_fba_characteristics rdc_data;
+};
 
 static struct ccw_device_id dasd_fba_ids[] = {
 	{ CCW_DEVICE_DEVTYPE (0x6310, 0, 0x9336, 0), driver_info: 0x1},
@@ -82,14 +77,14 @@
 };
 
 static inline void
-define_extent(struct ccw1 * ccw, DE_fba_data_t *data, int rw,
+define_extent(struct ccw1 * ccw, struct DE_fba_data *data, int rw,
 	      int blksize, int beg, int nr)
 {
 	ccw->cmd_code = DASD_FBA_CCW_DEFINE_EXTENT;
 	ccw->flags = 0;
 	ccw->count = 16;
 	ccw->cda = (__u32) __pa(data);
-	memset(data, 0, sizeof (DE_fba_data_t));
+	memset(data, 0, sizeof (struct DE_fba_data));
 	if (rw == WRITE)
 		(data->mask).perm = 0x0;
 	else if (rw == READ)
@@ -102,14 +97,14 @@
 }
 
 static inline void
-locate_record(struct ccw1 * ccw, LO_fba_data_t *data, int rw,
+locate_record(struct ccw1 * ccw, struct LO_fba_data *data, int rw,
 	      int block_nr, int block_ct)
 {
 	ccw->cmd_code = DASD_FBA_CCW_LOCATE;
 	ccw->flags = 0;
 	ccw->count = 8;
 	ccw->cda = (__u32) __pa(data);
-	memset(data, 0, sizeof (LO_fba_data_t));
+	memset(data, 0, sizeof (struct LO_fba_data));
 	if (rw == WRITE)
 		data->operation.cmd = 0x5;
 	else if (rw == READ)
@@ -121,16 +116,16 @@
 }
 
 static int
-dasd_fba_check_characteristics(struct dasd_device_t *device)
+dasd_fba_check_characteristics(struct dasd_device *device)
 {
-	dasd_fba_private_t *private;
+	struct dasd_fba_private *private;
 	struct ccw_device *cdev = device->cdev;	
 	void *rdc_data;
 	int rc;
 
-	private = (dasd_fba_private_t *) device->private;
+	private = (struct dasd_fba_private *) device->private;
 	if (private == NULL) {
-		private = kmalloc(sizeof(dasd_fba_private_t), GFP_KERNEL);
+		private = kmalloc(sizeof(struct dasd_fba_private), GFP_KERNEL);
 		if (private == NULL) {
 			MESSAGE(KERN_WARNING, "%s",
 				"memory allocation failed for private data");
@@ -160,12 +155,12 @@
 }
 
 static int
-dasd_fba_do_analysis(struct dasd_device_t *device)
+dasd_fba_do_analysis(struct dasd_device *device)
 {
-	dasd_fba_private_t *private;
+	struct dasd_fba_private *private;
 	int sb, rc;
 
-	private = (dasd_fba_private_t *) device->private;
+	private = (struct dasd_fba_private *) device->private;
 	rc = dasd_check_blocksize(private->rdc_data.blk_size);
 	if (rc) {
 		DEV_MESSAGE(KERN_INFO, device, "unknown blocksize %d",
@@ -181,7 +176,7 @@
 }
 
 static int
-dasd_fba_fill_geometry(struct dasd_device_t *device, struct hd_geometry *geo)
+dasd_fba_fill_geometry(struct dasd_device *device, struct hd_geometry *geo)
 {
 	if (dasd_check_blocksize(device->bp_block) != 0)
 		return -EINVAL;
@@ -192,12 +187,12 @@
 }
 
 static dasd_era_t
-dasd_fba_examine_error(dasd_ccw_req_t * cqr, struct irb * irb)
+dasd_fba_examine_error(struct dasd_ccw_req * cqr, struct irb * irb)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	struct ccw_device *cdev;
 
-	device = (dasd_device_t *) cqr->device;
+	device = (struct dasd_device *) cqr->device;
 	if (irb->scsw.cstat == 0x00 &&
 	    irb->scsw.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END))
 		return dasd_era_none;
@@ -214,13 +209,13 @@
 }
 
 static dasd_erp_fn_t
-dasd_fba_erp_action(dasd_ccw_req_t * cqr)
+dasd_fba_erp_action(struct dasd_ccw_req * cqr)
 {
 	return dasd_default_erp_action;
 }
 
 static dasd_erp_fn_t
-dasd_fba_erp_postaction(dasd_ccw_req_t * cqr)
+dasd_fba_erp_postaction(struct dasd_ccw_req * cqr)
 {
 	if (cqr->function == dasd_default_erp_action)
 		return dasd_default_erp_postaction;
@@ -230,13 +225,13 @@
 	return NULL;
 }
 
-static dasd_ccw_req_t *
-dasd_fba_build_cp(dasd_device_t * device, struct request *req)
+static struct dasd_ccw_req *
+dasd_fba_build_cp(struct dasd_device * device, struct request *req)
 {
-	dasd_fba_private_t *private;
+	struct dasd_fba_private *private;
 	unsigned long *idaws;
-	LO_fba_data_t *LO_data;
-	dasd_ccw_req_t *cqr;
+	struct LO_fba_data *LO_data;
+	struct dasd_ccw_req *cqr;
 	struct ccw1 *ccw;
 	struct bio *bio;
 	struct bio_vec *bv;
@@ -247,7 +242,7 @@
 	unsigned char cmd;
 	int i;
 
-	private = (dasd_fba_private_t *) device->private;
+	private = (struct dasd_fba_private *) device->private;
 	if (rq_data_dir(req) == READ) {
 		cmd = DASD_FBA_CCW_READ;
 	} else if (rq_data_dir(req) == WRITE) {
@@ -279,7 +274,7 @@
 	/* 1x define extent + 1x locate record + number of blocks */
 	cplength = 2 + count;
 	/* 1x define extent + 1x locate record */
-	datasize = sizeof(DE_fba_data_t) + sizeof(LO_fba_data_t) +
+	datasize = sizeof(struct DE_fba_data) + sizeof(struct LO_fba_data) +
 		cidaw * sizeof(unsigned long);
 	/*
 	 * Find out number of additional locate record ccws if the device
@@ -287,7 +282,7 @@
 	 */
 	if (private->rdc_data.mode.bits.data_chain == 0) {
 		cplength += count - 1;
-		datasize += (count - 1)*sizeof(LO_fba_data_t);
+		datasize += (count - 1)*sizeof(struct LO_fba_data);
 	}
 	/* Allocate the ccw request. */
 	cqr = dasd_smalloc_request(dasd_fba_discipline.name,
@@ -299,8 +294,8 @@
 	define_extent(ccw++, cqr->data, rq_data_dir(req),
 		      device->bp_block, req->sector, req->nr_sectors);
 	/* Build locate_record + read/write ccws. */
-	idaws = (unsigned long *) (cqr->data + sizeof(DE_fba_data_t));
-	LO_data = (LO_fba_data_t *) (idaws + cidaw);
+	idaws = (unsigned long *) (cqr->data + sizeof(struct DE_fba_data));
+	LO_data = (struct LO_fba_data *) (idaws + cidaw);
 	/* Locate record for all blocks for smart devices. */
 	if (private->rdc_data.mode.bits.data_chain != 0) {
 		ccw[-1].flags |= CCW_FLAG_CC;
@@ -346,21 +341,22 @@
 }
 
 static int
-dasd_fba_fill_info(dasd_device_t * device, dasd_information2_t * info)
+dasd_fba_fill_info(struct dasd_device * device,
+		   struct dasd_information2_t * info)
 {
 	info->label_block = 1;
 	info->FBA_layout = 1;
 	info->format = DASD_FORMAT_LDL;
-	info->characteristics_size = sizeof(dasd_fba_characteristics_t);
+	info->characteristics_size = sizeof(struct dasd_fba_characteristics);
 	memcpy(info->characteristics,
-	       &((dasd_fba_private_t *) device->private)->rdc_data,
-	       sizeof (dasd_fba_characteristics_t));
+	       &((struct dasd_fba_private *) device->private)->rdc_data,
+	       sizeof (struct dasd_fba_characteristics));
 	info->confdata_size = 0;
 	return 0;
 }
 
 static void
-dasd_fba_dump_sense(struct dasd_device_t *device, dasd_ccw_req_t * req,
+dasd_fba_dump_sense(struct dasd_device *device, struct dasd_ccw_req * req,
 		    struct irb *irb)
 {
 	char *page;
@@ -383,7 +379,7 @@
  * max_blocks is dependent on the amount of storage that is available
  * in the static io buffer for each device. Currently each device has
  * 8192 bytes (=2 pages). For 64 bit one dasd_mchunkt_t structure has
- * 24 bytes, the dasd_ccw_req_t has 136 bytes and each block can use
+ * 24 bytes, the struct dasd_ccw_req has 136 bytes and each block can use
  * up to 16 bytes (8 for the ccw and 8 for the idal pointer). In
  * addition we have one define extent ccw + 16 bytes of data and a 
  * locate record ccw for each block (stupid devices!) + 16 bytes of data.
@@ -393,7 +389,7 @@
  * start the next request if one finishes off. That makes 100.1 blocks
  * for one request. Give a little safety and the result is 96.
  */
-static dasd_discipline_t dasd_fba_discipline = {
+static struct dasd_discipline dasd_fba_discipline = {
 	.owner = THIS_MODULE,
 	.name = "FBA ",
 	.ebcname = "FBA ",
@@ -414,9 +410,16 @@
 static int __init
 dasd_fba_init(void)
 {
+	int ret;
+
 	ASCEBC(dasd_fba_discipline.ebcname, 4);
 
-	return ccw_driver_register(&dasd_fba_driver);
+	ret = ccw_driver_register(&dasd_fba_driver);
+	if (ret)
+		return ret;
+
+	dasd_generic_auto_online(&dasd_fba_driver);
+	return 0;
 }
 
 static void __exit
diff -Nru a/drivers/s390/block/dasd_fba.h b/drivers/s390/block/dasd_fba.h
--- a/drivers/s390/block/dasd_fba.h	Sat Apr 19 19:51:51 2003
+++ b/drivers/s390/block/dasd_fba.h	Sat Apr 19 19:51:51 2003
@@ -4,17 +4,13 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.4 $
- *
- * History of changes 
- * 
+ * $Revision: 1.6 $
  */
 
 #ifndef DASD_FBA_H
 #define DASD_FBA_H
 
-typedef
-    struct DE_fba_data_t {
+struct DE_fba_data {
 	struct {
 		unsigned char perm:2;	/* Permissions on this extent */
 		unsigned char zero:2;	/* Must be zero */
@@ -27,12 +23,9 @@
 	__u32 ext_loc;		/* Extent locator */
 	__u32 ext_beg;		/* logical number of block 0 in extent */
 	__u32 ext_end;		/* logocal number of last block in extent */
-} __attribute__ ((packed))
+} __attribute__ ((packed));
 
-    DE_fba_data_t;
-
-typedef
-    struct LO_fba_data_t {
+struct LO_fba_data {
 	struct {
 		unsigned char zero:4;
 		unsigned char cmd:4;
@@ -40,12 +33,9 @@
 	__u8 auxiliary;
 	__u16 blk_ct;
 	__u32 blk_nr;
-} __attribute__ ((packed))
-
-    LO_fba_data_t;
+} __attribute__ ((packed));
 
-typedef
-    struct dasd_fba_characteristics_t {
+struct dasd_fba_characteristics {
 	union {
 		__u8 c;
 		struct {
@@ -78,8 +68,6 @@
 	__u16 blk_ce;
 	__u32 reserved2;
 	__u16 reserved3;
-} __attribute__ ((packed))
-
-    dasd_fba_characteristics_t;
+} __attribute__ ((packed));
 
 #endif				/* DASD_FBA_H */
diff -Nru a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c
--- a/drivers/s390/block/dasd_genhd.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/block/dasd_genhd.c	Sat Apr 19 19:51:50 2003
@@ -9,10 +9,7 @@
  *
  * Dealing with devices registered to multiple major numbers.
  *
- * $Revision: 1.23 $
- *
- * History of changes
- * 05/04/02 split from dasd.c, code restructuring.
+ * $Revision: 1.29 $
  */
 
 #include <linux/config.h>
@@ -108,7 +105,6 @@
 struct gendisk *
 dasd_gendisk_alloc(int devindex)
 {
-	struct list_head *l;
 	struct major_info *mi;
 	struct gendisk *gdp;
 	int index, len, rc;
@@ -118,8 +114,7 @@
 	while (1) {
 		spin_lock(&dasd_major_lock);
 		index = devindex;
-		list_for_each(l, &dasd_major_info) {
-			mi = list_entry(l, struct major_info, list);
+		list_for_each_entry(mi, &dasd_major_info, list) {
 			if (index < DASD_PER_MAJOR)
 				break;
 			index -= DASD_PER_MAJOR;
@@ -163,42 +158,16 @@
 }
 
 /*
- * Return devindex of first device using a specific major number.
- */
-static int dasd_gendisk_major_index(int major)
-{
-	struct list_head *l;
-	struct major_info *mi;
-	int devindex, rc;
-
-	spin_lock(&dasd_major_lock);
-	rc = -EINVAL;
-	devindex = 0;
-	list_for_each(l, &dasd_major_info) {
-		mi = list_entry(l, struct major_info, list);
-		if (mi->major == major) {
-			rc = devindex;
-			break;
-		}
-		devindex += DASD_PER_MAJOR;
-	}
-	spin_unlock(&dasd_major_lock);
-	return rc;
-}
-
-/*
  * Return major number for device with device index devindex.
  */
 int dasd_gendisk_index_major(int devindex)
 {
-	struct list_head *l;
 	struct major_info *mi;
 	int rc;
 
 	spin_lock(&dasd_major_lock);
 	rc = -ENODEV;
-	list_for_each(l, &dasd_major_info) {
-		mi = list_entry(l, struct major_info, list);
+	list_for_each_entry(mi, &dasd_major_info, list) {
 		if (devindex < DASD_PER_MAJOR) {
 			rc = mi->major;
 			break;
@@ -213,7 +182,7 @@
  * Register disk to genhd. This will trigger a partition detection.
  */
 void
-dasd_setup_partitions(dasd_device_t * device)
+dasd_setup_partitions(struct dasd_device * device)
 {
 	/* Make the disk known. */
 	set_capacity(device->gdp, device->blocks << device->s2b_shift);
@@ -228,9 +197,10 @@
  * partitions unusable by setting their size to zero.
  */
 void
-dasd_destroy_partitions(dasd_device_t * device)
+dasd_destroy_partitions(struct dasd_device * device)
 {
 	del_gendisk(device->gdp);
+	put_disk(device->gdp);
 }
 
 int
diff -Nru a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h
--- a/drivers/s390/block/dasd_int.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/block/dasd_int.h	Sat Apr 19 19:51:49 2003
@@ -6,12 +6,7 @@
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
- * $Revision: 1.36 $
- *
- * History of changes (starts July 2000)
- * 02/01/01 added dynamic registration of ioctls
- * 2002/01/04 Created 2.4-2.5 compatibility mode
- * 05/04/02 code restructuring.
+ * $Revision: 1.40 $
  */
 
 #ifndef DASD_INT_H
@@ -24,7 +19,7 @@
 
 /*
  * States a dasd device can have:
- *   new: the dasd_device_t structure is allocated.
+ *   new: the dasd_device structure is allocated.
  *   known: the discipline for the device is identified.
  *   basic: the device can do basic i/o.
  *   accept: the device is analysed (format is known).
@@ -70,16 +65,16 @@
 /*
  * SECTION: Type definitions
  */
-struct dasd_device_t;
+struct dasd_device;
 
 typedef int (*dasd_ioctl_fn_t) (struct block_device *bdev, int no, long args);
 
-typedef struct {
+struct dasd_ioctl {
 	struct list_head list;
 	struct module *owner;
 	int no;
 	dasd_ioctl_fn_t handler;
-} dasd_ioctl_list_t;
+};
 
 typedef enum {
 	dasd_era_fatal = -1,	/* no chance to recover		     */
@@ -154,12 +149,12 @@
 	DBF_EVENT(DBF_ALERT, d_string, d_args); \
 } while(0)
 
-typedef struct dasd_ccw_req_t {
+struct dasd_ccw_req {
 	unsigned int magic;		/* Eye catcher */
         struct list_head list;		/* list_head for request queueing. */
 
 	/* Where to execute what... */
-	struct dasd_device_t *device;	/* device the request is for */
+	struct dasd_device *device;	/* device the request is for */
 	struct ccw1 *cpaddr;		/* address of channel program */
 	char status;	        	/* status of this request */
 	short retries;			/* A retry counter */
@@ -171,7 +166,7 @@
 
 	/* these are important for recovering erroneous requests          */
 	struct irb *dstat;		/* device status in case of an error */
-	struct dasd_ccw_req_t *refers;	/* ERP-chain queueing. */
+	struct dasd_ccw_req *refers;	/* ERP-chain queueing. */
 	void *function; 		/* originating ERP action */
 
 	unsigned long long buildclk;	/* TOD-clock of request generation */
@@ -180,12 +175,12 @@
 	unsigned long long endclk;	/* TOD-clock of request termination */
 
         /* Callback that is called after reaching final status. */
-        void (*callback)(struct dasd_ccw_req_t *, void *data);
+        void (*callback)(struct dasd_ccw_req *, void *data);
         void *callback_data;
-} dasd_ccw_req_t;
+};
 
 /* 
- * dasd_ccw_req_t -> status can be:
+ * dasd_ccw_req -> status can be:
  */
 #define DASD_CQR_FILLED   0x00	/* request is ready to be processed */
 #define DASD_CQR_QUEUED   0x01	/* request is queued to be processed */
@@ -196,15 +191,15 @@
 #define DASD_CQR_PENDING  0x06  /* request is waiting for interrupt - ERP only */ 
 
 /* Signature for error recovery functions. */
-typedef dasd_ccw_req_t *(*dasd_erp_fn_t) (dasd_ccw_req_t * cqr);
+typedef struct dasd_ccw_req *(*dasd_erp_fn_t) (struct dasd_ccw_req *);
 
 /*
- * the dasd_discipline_t is
+ * the struct dasd_discipline is
  * sth like a table of virtual functions, if you think of dasd_eckd
  * inheriting dasd...
  * no, currently we are not planning to reimplement the driver in C++
  */
-typedef struct dasd_discipline_t {
+struct dasd_discipline {
 	struct module *owner;
 	char ebcname[8];	/* a name used for tagging and printks */
 	char name[8];		/* a name used for tagging and printks */
@@ -223,8 +218,8 @@
          * -EAGAIN if do_analysis started a ccw that needs to complete
          * before the analysis may be repeated.
          */
-        int (*check_device)(struct dasd_device_t *);
-	int (*do_analysis) (struct dasd_device_t *);
+        int (*check_device)(struct dasd_device *);
+	int (*do_analysis) (struct dasd_device *);
 
         /*
          * Device operation functions. build_cp creates a ccw chain for
@@ -232,11 +227,12 @@
          * term_IO cancels it (e.g. in case of a timeout). format_device
          * returns a ccw chain to be used to format the device.
          */
-	dasd_ccw_req_t *(*build_cp) (struct dasd_device_t *, struct request *);
-	int (*start_IO) (dasd_ccw_req_t *);
-	int (*term_IO) (dasd_ccw_req_t *);
-	dasd_ccw_req_t *(*format_device) (struct dasd_device_t *,
-                                          struct format_data_t *);
+	struct dasd_ccw_req *(*build_cp) (struct dasd_device *,
+					  struct request *);
+	int (*start_IO) (struct dasd_ccw_req *);
+	int (*term_IO) (struct dasd_ccw_req *);
+	struct dasd_ccw_req *(*format_device) (struct dasd_device *,
+					       struct format_data_t *);
 
         /*
          * Error recovery functions. examine_error() returns a value that
@@ -247,25 +243,25 @@
          * is called for every error condition to print the sense data
          * to the console.
          */
-	dasd_era_t(*examine_error) (dasd_ccw_req_t *, struct irb *);
-	dasd_erp_fn_t(*erp_action) (dasd_ccw_req_t *);
-	dasd_erp_fn_t(*erp_postaction) (dasd_ccw_req_t *);
-	void (*dump_sense) (struct dasd_device_t *, dasd_ccw_req_t *,
+	dasd_era_t(*examine_error) (struct dasd_ccw_req *, struct irb *);
+	dasd_erp_fn_t(*erp_action) (struct dasd_ccw_req *);
+	dasd_erp_fn_t(*erp_postaction) (struct dasd_ccw_req *);
+	void (*dump_sense) (struct dasd_device *, struct dasd_ccw_req *,
 			    struct irb *);
 
         /* i/o control functions. */
-	int (*fill_geometry) (struct dasd_device_t *, struct hd_geometry *);
-	int (*fill_info) (struct dasd_device_t *, dasd_information2_t *);
-} dasd_discipline_t;
+	int (*fill_geometry) (struct dasd_device *, struct hd_geometry *);
+	int (*fill_info) (struct dasd_device *, struct dasd_information2_t *);
+};
 
-extern dasd_discipline_t dasd_diag_discipline;
+extern struct dasd_discipline dasd_diag_discipline;
 #ifdef CONFIG_DASD_DIAG
 #define dasd_diag_discipline_pointer (&dasd_diag_discipline)
 #else
 #define dasd_diag_discipline_pointer (0)
 #endif
 
-typedef struct dasd_device_t {
+struct dasd_device {
 	/* Block device stuff. */
 	struct gendisk *gdp;
 	devfs_handle_t devfs_entry;
@@ -279,7 +275,7 @@
 
 
 	/* Device discipline stuff. */
-	dasd_discipline_t *discipline;
+	struct dasd_discipline *discipline;
 	char *private;
 
 	/* Device state and target state. */
@@ -297,10 +293,6 @@
 	struct list_head ccw_chunks;
 	struct list_head erp_chunks;
 
-	/* Common i/o stuff. */
-	/* FIXME: remove the next */
-	int devno;
-
 	atomic_t tasklet_scheduled;
         struct tasklet_struct tasklet;
 	struct work_struct kick_work;
@@ -311,67 +303,64 @@
 	struct ccw_device *cdev;
 
 #ifdef CONFIG_DASD_PROFILE
-	dasd_profile_info_t profile;
+	struct dasd_profile_info_t profile;
 #endif
-} dasd_device_t;
+};
+
+void dasd_put_device_wake(struct dasd_device *);
 
 /*
- * dasd_devmap_t is used to store the features and the relation
- * between device number and device index. To find a dasd_devmap_t
- * that corresponds to a device number of a device index each
- * dasd_devmap_t is added to two linked lists, one to search by
- * the device number and one to search by the device index. As
- * soon as big minor numbers are available the device index list
- * can be removed since the device number will then be identical
- * to the device index.
+ * Reference count inliners
  */
-typedef struct {
-	struct list_head devindex_list;
-	struct list_head devno_list;
-        unsigned int devindex;
-        unsigned short devno;
-        unsigned short features;
-        dasd_device_t *device;
-} dasd_devmap_t;
+static inline void
+dasd_get_device(struct dasd_device *device)
+{
+	atomic_inc(&device->ref_count);
+}
+
+static inline void
+dasd_put_device(struct dasd_device *device)
+{
+	if (atomic_dec_return(&device->ref_count) == 0)
+		dasd_put_device_wake(device);
+}
 
 /*
  * The static memory in ccw_mem and erp_mem is managed by a sorted
  * list of free memory chunks.
  */
-typedef struct dasd_mchunk_t
+struct dasd_mchunk
 {
 	struct list_head list;
 	unsigned long size;
-} __attribute__ ((aligned(8))) dasd_mchunk_t;
+} __attribute__ ((aligned(8)));
 
 static inline void
 dasd_init_chunklist(struct list_head *chunk_list, void *mem,
 		    unsigned long size)
 {
-	dasd_mchunk_t *chunk;
+	struct dasd_mchunk *chunk;
 
 	INIT_LIST_HEAD(chunk_list);
-	chunk = (dasd_mchunk_t *) mem;
-	chunk->size = size - sizeof(dasd_mchunk_t);
+	chunk = (struct dasd_mchunk *) mem;
+	chunk->size = size - sizeof(struct dasd_mchunk);
 	list_add(&chunk->list, chunk_list);
 }
 
 static inline void *
 dasd_alloc_chunk(struct list_head *chunk_list, unsigned long size)
 {
-	dasd_mchunk_t *chunk, *tmp;
-	struct list_head *l;
+	struct dasd_mchunk *chunk, *tmp;
 
 	size = (size + 7L) & -8L;
-	list_for_each(l, chunk_list) {
-		chunk = list_entry(l, dasd_mchunk_t, list);
+	list_for_each_entry(chunk, chunk_list, list) {
 		if (chunk->size < size)
 			continue;
-		if (chunk->size > size + sizeof(dasd_mchunk_t)) {
+		if (chunk->size > size + sizeof(struct dasd_mchunk)) {
 			char *endaddr = (char *) (chunk + 1) + chunk->size;
-			tmp = (dasd_mchunk_t *) (endaddr - size) - 1;
+			tmp = (struct dasd_mchunk *) (endaddr - size) - 1;
 			tmp->size = size;
-			chunk->size -= size + sizeof(dasd_mchunk_t);
+			chunk->size -= size + sizeof(struct dasd_mchunk);
 			chunk = tmp;
 		} else
 			list_del(&chunk->list);
@@ -383,30 +372,31 @@
 static inline void
 dasd_free_chunk(struct list_head *chunk_list, void *mem)
 {
-	dasd_mchunk_t *chunk, *tmp;
+	struct dasd_mchunk *chunk, *tmp;
 	struct list_head *p, *left;
 
-	chunk = (dasd_mchunk_t *)((char *) mem - sizeof(dasd_mchunk_t));
+	chunk = (struct dasd_mchunk *)
+		((char *) mem - sizeof(struct dasd_mchunk));
 	/* Find out the left neighbour in chunk_list. */
 	left = chunk_list;
 	list_for_each(p, chunk_list) {
-		if (list_entry(p, dasd_mchunk_t, list) > chunk)
+		if (list_entry(p, struct dasd_mchunk, list) > chunk)
 			break;
 		left = p;
 	}
 	/* Try to merge with right neighbour = next element from left. */
 	if (left->next != chunk_list) {
-		tmp = list_entry(left->next, dasd_mchunk_t, list);
+		tmp = list_entry(left->next, struct dasd_mchunk, list);
 		if ((char *) (chunk + 1) + chunk->size == (char *) tmp) {
 			list_del(&tmp->list);
-			chunk->size += tmp->size + sizeof(dasd_mchunk_t);
+			chunk->size += tmp->size + sizeof(struct dasd_mchunk);
 		}
 	}
 	/* Try to merge with left neighbour. */
 	if (left != chunk_list) {
-		tmp = list_entry(left, dasd_mchunk_t, list);
+		tmp = list_entry(left, struct dasd_mchunk, list);
 		if ((char *) (tmp + 1) + tmp->size == (char *) chunk) {
-			tmp->size += chunk->size + sizeof(dasd_mchunk_t);
+			tmp->size += chunk->size + sizeof(struct dasd_mchunk);
 			return;
 		}
 	}
@@ -429,44 +419,46 @@
 #define DASD_PROFILE_OFF 0
 
 extern debug_info_t *dasd_debug_area;
-extern dasd_profile_info_t dasd_global_profile;
+extern struct dasd_profile_info_t dasd_global_profile;
 extern unsigned int dasd_profile_level;
 extern struct block_device_operations dasd_device_operations;
 
-dasd_ccw_req_t *dasd_kmalloc_request(char *, int, int, dasd_device_t *); /* unused */
-dasd_ccw_req_t *dasd_smalloc_request(char *, int, int, dasd_device_t *);
-void dasd_kfree_request(dasd_ccw_req_t *, dasd_device_t *);
-void dasd_sfree_request(dasd_ccw_req_t *, dasd_device_t *);
+struct dasd_ccw_req *
+dasd_kmalloc_request(char *, int, int, struct dasd_device *);
+struct dasd_ccw_req *
+dasd_smalloc_request(char *, int, int, struct dasd_device *);
+void dasd_kfree_request(struct dasd_ccw_req *, struct dasd_device *);
+void dasd_sfree_request(struct dasd_ccw_req *, struct dasd_device *);
 
 static inline int
-dasd_kmalloc_set_cda(struct ccw1 *ccw, void *cda, dasd_device_t *device)
+dasd_kmalloc_set_cda(struct ccw1 *ccw, void *cda, struct dasd_device *device)
 {
 	return set_normalized_cda(ccw, cda);
 }
 
-dasd_device_t *dasd_alloc_device(dasd_devmap_t *);
-void dasd_free_device(dasd_device_t *);
-void dasd_enable_device(dasd_device_t *);
-void dasd_set_target_state(dasd_device_t *, int);
-void dasd_kick_device(dasd_device_t *);
-
-void dasd_add_request_head(dasd_ccw_req_t *);
-void dasd_add_request_tail(dasd_ccw_req_t *); /* unused */
-int  dasd_start_IO(dasd_ccw_req_t *);
-int  dasd_term_IO(dasd_ccw_req_t *);
-void dasd_schedule_bh(dasd_device_t *);
-int  dasd_sleep_on(dasd_ccw_req_t *);
-int  dasd_sleep_on_immediatly(dasd_ccw_req_t *);
-int  dasd_sleep_on_interruptible(dasd_ccw_req_t *);
-void dasd_set_timer(dasd_device_t *, int);
-void dasd_clear_timer(dasd_device_t *);
-int  dasd_cancel_req(dasd_ccw_req_t *); /* unused */
-int dasd_generic_probe (struct ccw_device *cdev, 
-			dasd_discipline_t *discipline);
+struct dasd_device *dasd_alloc_device(unsigned int devindex);
+void dasd_free_device(struct dasd_device *);
+
+void dasd_enable_device(struct dasd_device *);
+void dasd_set_target_state(struct dasd_device *, int);
+void dasd_kick_device(struct dasd_device *);
+
+void dasd_add_request_head(struct dasd_ccw_req *);
+void dasd_add_request_tail(struct dasd_ccw_req *);
+int  dasd_start_IO(struct dasd_ccw_req *);
+int  dasd_term_IO(struct dasd_ccw_req *);
+void dasd_schedule_bh(struct dasd_device *);
+int  dasd_sleep_on(struct dasd_ccw_req *);
+int  dasd_sleep_on_immediatly(struct dasd_ccw_req *);
+int  dasd_sleep_on_interruptible(struct dasd_ccw_req *);
+void dasd_set_timer(struct dasd_device *, int);
+void dasd_clear_timer(struct dasd_device *);
+int  dasd_cancel_req(struct dasd_ccw_req *);
+int dasd_generic_probe (struct ccw_device *, struct dasd_discipline *);
 int dasd_generic_remove (struct ccw_device *cdev);
-int dasd_generic_set_online(struct ccw_device *cdev, 
-			    dasd_discipline_t *discipline);
+int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *);
 int dasd_generic_set_offline (struct ccw_device *cdev);
+void dasd_generic_auto_online (struct ccw_driver *);
 
 /* externals in dasd_devmap.c */
 extern int dasd_max_devindex;
@@ -475,21 +467,24 @@
 
 int dasd_devmap_init(void);
 void dasd_devmap_exit(void);
-dasd_devmap_t *dasd_devmap_from_devno(int);
-dasd_devmap_t *dasd_devmap_from_devindex(int);
-dasd_device_t *dasd_get_device(dasd_devmap_t *);
-void dasd_put_device(dasd_devmap_t *);
+
+struct dasd_device *dasd_create_device(struct ccw_device *);
+void dasd_delete_device(struct dasd_device *);
+
+kdev_t dasd_get_kdev(struct dasd_device *);
+struct dasd_device *dasd_device_from_devindex(int);
 
 int dasd_parse(void);
 int dasd_add_range(int, int, int);
+int dasd_devno_in_range(int);
 
 /* externals in dasd_gendisk.c */
 int  dasd_gendisk_init(void);
 void dasd_gendisk_exit(void);
 int  dasd_gendisk_index_major(int);
 struct gendisk *dasd_gendisk_alloc(int);
-void dasd_setup_partitions(dasd_device_t *);
-void dasd_destroy_partitions(dasd_device_t *);
+void dasd_setup_partitions(struct dasd_device *);
+void dasd_destroy_partitions(struct dasd_device *);
 
 /* externals in dasd_ioctl.c */
 int  dasd_ioctl_init(void);
@@ -503,26 +498,26 @@
 void dasd_proc_exit(void);
 
 /* externals in dasd_erp.c */
-dasd_ccw_req_t *dasd_default_erp_action(dasd_ccw_req_t *);
-dasd_ccw_req_t *dasd_default_erp_postaction(dasd_ccw_req_t *);
-dasd_ccw_req_t *dasd_alloc_erp_request(char *, int, int, dasd_device_t *);
-void dasd_free_erp_request(dasd_ccw_req_t *, dasd_device_t *);
-void dasd_log_sense(dasd_ccw_req_t *, struct irb *);
-void dasd_log_ccw(dasd_ccw_req_t *, int, __u32);
+struct dasd_ccw_req *dasd_default_erp_action(struct dasd_ccw_req *);
+struct dasd_ccw_req *dasd_default_erp_postaction(struct dasd_ccw_req *);
+struct dasd_ccw_req *dasd_alloc_erp_request(char *, int, int, struct dasd_device *);
+void dasd_free_erp_request(struct dasd_ccw_req *, struct dasd_device *);
+void dasd_log_sense(struct dasd_ccw_req *, struct irb *);
+void dasd_log_ccw(struct dasd_ccw_req *, int, __u32);
 
 /* externals in dasd_3370_erp.c */
-dasd_era_t dasd_3370_erp_examine(dasd_ccw_req_t *, struct irb *);
+dasd_era_t dasd_3370_erp_examine(struct dasd_ccw_req *, struct irb *);
 
 /* externals in dasd_3990_erp.c */
-dasd_era_t dasd_3990_erp_examine(dasd_ccw_req_t *, struct irb *);
-dasd_ccw_req_t *dasd_3990_erp_action(dasd_ccw_req_t *);
+dasd_era_t dasd_3990_erp_examine(struct dasd_ccw_req *, struct irb *);
+struct dasd_ccw_req *dasd_3990_erp_action(struct dasd_ccw_req *);
 
 /* externals in dasd_9336_erp.c */
-dasd_era_t dasd_9336_erp_examine(dasd_ccw_req_t *, struct irb *);
+dasd_era_t dasd_9336_erp_examine(struct dasd_ccw_req *, struct irb *);
 
 /* externals in dasd_9336_erp.c */
-dasd_era_t dasd_9343_erp_examine(dasd_ccw_req_t *, struct irb *);
-dasd_ccw_req_t *dasd_9343_erp_action(dasd_ccw_req_t *);
+dasd_era_t dasd_9343_erp_examine(struct dasd_ccw_req *, struct irb *);
+struct dasd_ccw_req *dasd_9343_erp_action(struct dasd_ccw_req *);
 
 #endif				/* __KERNEL__ */
 
diff -Nru a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c
--- a/drivers/s390/block/dasd_ioctl.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/s390/block/dasd_ioctl.c	Sat Apr 19 19:51:48 2003
@@ -8,11 +8,8 @@
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001
  *
  * i/o controls for the dasd driver.
- *
- * 05/04/02 split from dasd.c, code restructuring.
  */
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/interrupt.h>
 #include <linux/major.h>
 #include <linux/fs.h>
@@ -35,15 +32,14 @@
 /*
  * Find the ioctl with number no.
  */
-static dasd_ioctl_list_t *
+static struct dasd_ioctl *
 dasd_find_ioctl(int no)
 {
-	struct list_head *curr;
-	list_for_each (curr, &dasd_ioctl_list) {
-		if (list_entry (curr, dasd_ioctl_list_t, list)->no == no) {
-			return list_entry (curr, dasd_ioctl_list_t, list);
-		}
-	}
+	struct dasd_ioctl *ioctl;
+
+	list_for_each_entry (ioctl, &dasd_ioctl_list, list)
+		if (ioctl->no == no)
+			return ioctl;
 	return NULL;
 }
 
@@ -53,10 +49,10 @@
 int
 dasd_ioctl_no_register(struct module *owner, int no, dasd_ioctl_fn_t handler)
 {
-	dasd_ioctl_list_t *new;
+	struct dasd_ioctl *new;
 	if (dasd_find_ioctl(no))
 		return -EBUSY;
-	new = kmalloc(sizeof (dasd_ioctl_list_t), GFP_KERNEL);
+	new = kmalloc(sizeof (struct dasd_ioctl), GFP_KERNEL);
 	if (new == NULL)
 		return -ENOMEM;
 	new->owner = owner;
@@ -73,7 +69,7 @@
 int
 dasd_ioctl_no_unregister(struct module *owner, int no, dasd_ioctl_fn_t handler)
 {
-	dasd_ioctl_list_t *old = dasd_find_ioctl(no);
+	struct dasd_ioctl *old = dasd_find_ioctl(no);
 	if (old == NULL)
 		return -ENOENT;
 	if (old->no != no || old->handler != handler || owner != old->owner)
@@ -89,9 +85,8 @@
 	   unsigned int no, unsigned long data)
 {
 	struct block_device *bdev = inp->i_bdev;
-	dasd_device_t *device = bdev->bd_disk->private_data;
-	dasd_ioctl_list_t *ioctl;
-	struct list_head *l;
+	struct dasd_device *device = bdev->bd_disk->private_data;
+	struct dasd_ioctl *ioctl;
 	const char *dir;
 	int rc;
 
@@ -107,8 +102,7 @@
 		      "ioctl 0x%08x %s'0x%x'%d(%d) with data %8lx", no,
 		      dir, _IOC_TYPE(no), _IOC_NR(no), _IOC_SIZE(no), data);
 	/* Search for ioctl no in the ioctl list. */
-	list_for_each(l, &dasd_ioctl_list) {
-		ioctl = list_entry(l, dasd_ioctl_list_t, list);
+	list_for_each_entry(ioctl, &dasd_ioctl_list, list) {
 		if (ioctl->no == no) {
 			/* Found a matching ioctl. Call it. */
 			if (!try_module_get(ioctl->owner))
@@ -140,7 +134,7 @@
 static int
 dasd_ioctl_enable(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
@@ -157,7 +151,7 @@
 static int
 dasd_ioctl_disable(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
@@ -183,9 +177,9 @@
  * devices this means CCWs are generated to format a single track.
  */
 static int
-dasd_format(dasd_device_t * device, format_data_t * fdata)
+dasd_format(struct dasd_device * device, struct format_data_t * fdata)
 {
-	dasd_ccw_req_t *cqr;
+	struct dasd_ccw_req *cqr;
 	int rc;
 
 	if (device->discipline->format_device == NULL)
@@ -227,8 +221,8 @@
 static int
 dasd_ioctl_format(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
-	format_data_t fdata;
+	struct dasd_device *device;
+	struct format_data_t fdata;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
@@ -241,7 +235,8 @@
 		return -ENODEV;
 	if (device->ro_flag)
 		return -EROFS;
-	if (copy_from_user(&fdata, (void *) args, sizeof (format_data_t)))
+	if (copy_from_user(&fdata, (void *) args,
+			   sizeof (struct format_data_t)))
 		return -EFAULT;
 	if (bdev != bdev->bd_contains) {
 		DEV_MESSAGE(KERN_WARNING, device, "%s",
@@ -258,7 +253,7 @@
 static int
 dasd_ioctl_reset_profile(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	if (!capable(CAP_SYS_ADMIN))
 		return -EACCES;
@@ -267,7 +262,7 @@
 	if (device == NULL)
 		return -ENODEV;
 
-	memset(&device->profile, 0, sizeof (dasd_profile_info_t));
+	memset(&device->profile, 0, sizeof (struct dasd_profile_info_t));
 	return 0;
 }
 
@@ -277,14 +272,14 @@
 static int
 dasd_ioctl_read_profile(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	device = bdev->bd_disk->private_data;
 	if (device == NULL)
 		return -ENODEV;
 
 	if (copy_to_user((long *) args, (long *) &device->profile,
-			 sizeof (dasd_profile_info_t)))
+			 sizeof (struct dasd_profile_info_t)))
 		return -EFAULT;
 	return 0;
 }
@@ -308,8 +303,8 @@
 static int
 dasd_ioctl_information(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
-	dasd_information2_t *dasd_info;
+	struct dasd_device *device;
+	struct dasd_information2_t *dasd_info;
 	unsigned long flags;
 	int rc;
 	struct ccw_device *cdev;
@@ -321,7 +316,7 @@
 	if (!device->discipline->fill_info)
 		return -EINVAL;
 
-	dasd_info = kmalloc(sizeof(dasd_information2_t), GFP_KERNEL);
+	dasd_info = kmalloc(sizeof(struct dasd_information2_t), GFP_KERNEL);
 	if (dasd_info == NULL)
 		return -ENOMEM;
 
@@ -333,7 +328,7 @@
 
 	cdev = device->cdev;
 
-	dasd_info->devno = device->devno;
+	dasd_info->devno = _ccw_device_get_device_number(device->cdev);
 	dasd_info->schid = _ccw_device_get_subchannel_number(device->cdev);
 	dasd_info->cu_type = cdev->id.cu_type;
 	dasd_info->cu_model = cdev->id.cu_model;
@@ -380,8 +375,8 @@
 	rc = 0;
 	if (copy_to_user((long *) args, (long *) dasd_info,
 			 ((no == (unsigned int) BIODASDINFO2) ?
-			  sizeof (dasd_information2_t) :
-			  sizeof (dasd_information_t))))
+			  sizeof (struct dasd_information2_t) :
+			  sizeof (struct dasd_information_t))))
 		rc = -EFAULT;
 	kfree(dasd_info);
 	return rc;
@@ -393,7 +388,7 @@
 static int
 dasd_ioctl_set_ro(struct block_device *bdev, int no, long args)
 {
-	dasd_device_t *device;
+	struct dasd_device *device;
 	int intval;
 
 	if (!capable(CAP_SYS_ADMIN))
@@ -418,7 +413,7 @@
 dasd_ioctl_getgeo(struct block_device *bdev, int no, long args)
 {
 	struct hd_geometry geo = { 0, };
-	dasd_device_t *device;
+	struct dasd_device *device;
 
 	device =  bdev->bd_disk->private_data;
 	if (device == NULL)
diff -Nru a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c
--- a/drivers/s390/block/dasd_proc.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/s390/block/dasd_proc.c	Sat Apr 19 19:51:29 2003
@@ -9,14 +9,10 @@
  *
  * /proc interface for the dasd driver.
  *
- * $Revision: 1.17 $
- *
- * History of changes
- * 05/04/02 split from dasd.c, code restructuring.
+ * $Revision: 1.21 $
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/ctype.h>
 #include <linux/seq_file.h>
 #include <linux/vmalloc.h>
@@ -56,17 +52,14 @@
 static int
 dasd_devices_show(struct seq_file *m, void *v)
 {
-	dasd_devmap_t *devmap;
-	dasd_device_t *device;
+	struct dasd_device *device;
 	char *substr;
 
-	devmap = dasd_devmap_from_devindex((unsigned long) v - 1);
-	device = (devmap != NULL) ?
-		dasd_get_device(devmap) : ERR_PTR(-ENODEV);
+	device = dasd_device_from_devindex((unsigned long) v - 1);
 	if (IS_ERR(device))
 		return 0;
 	/* Print device number. */
-	seq_printf(m, "%04x", devmap->devno);
+	seq_printf(m, "%04x", _ccw_device_get_device_number(device->cdev));
 	/* Print discipline string. */
 	if (device != NULL && device->discipline != NULL)
 		seq_printf(m, "(%s)", device->discipline->name);
@@ -113,7 +106,7 @@
 		seq_printf(m, "no stat");
 		break;
 	}
-	dasd_put_device(devmap);
+	dasd_put_device(device);
 	if (dasd_probeonly)
 		seq_printf(m, "(probeonly)");
 	seq_printf(m, "\n");
@@ -189,7 +182,7 @@
 {
 	unsigned long len;
 #ifdef CONFIG_DASD_PROFILE
-	dasd_profile_info_t *prof;
+	struct dasd_profile_info_t *prof;
 	char *str;
 	int shift;
 
@@ -266,14 +259,15 @@
 		} else if (strcmp(str, "off") == 0) {
 			/* switch off and reset statistics profiling */
 			memset(&dasd_global_profile,
-			       0, sizeof (dasd_profile_info_t));
+			       0, sizeof (struct dasd_profile_info_t));
 			dasd_profile_level = DASD_PROFILE_OFF;
 			MESSAGE(KERN_INFO, "%s", "Statictics switched off");
 		} else
 			goto out_error;
 	} else if (strncmp(str, "reset", 5) == 0) {
 		/* reset the statistics */
-		memset(&dasd_global_profile, 0, sizeof (dasd_profile_info_t));
+		memset(&dasd_global_profile, 0,
+		       sizeof (struct dasd_profile_info_t));
 		MESSAGE(KERN_INFO, "%s", "Statictics reset");
 	} else
 		goto out_error;
diff -Nru a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c
--- a/drivers/s390/char/con3215.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/char/con3215.c	Sat Apr 19 19:51:49 2003
@@ -872,7 +872,7 @@
  *  The console structure for the 3215 console
  */
 static struct console con3215 = {
-	.name	 = "tty3215",
+	.name	 = "ttyS",
 	.write	 = con3215_write,
 	.device	 = con3215_device,
 	.unblank = con3215_unblank,
@@ -884,7 +884,7 @@
  * 3215 console initialization code called from console_init().
  * NOTE: This is called before kmalloc is available.
  */
-static void __init
+static int __init
 con3215_init(void)
 {
 	struct ccw_device *cdev;
@@ -894,7 +894,7 @@
 
 	/* Check if 3215 is to be the console */
 	if (!CONSOLE_IS_3215)
-		return;
+		return -ENODEV;
 
 	/* Set the console mode for VM */
 	if (MACHINE_IS_VM) {
@@ -913,7 +913,7 @@
 
 	cdev = ccw_device_probe_console();
 	if (!cdev)
-		return;
+		return -ENODEV;
 
 	raw3215[0] = raw = (struct raw3215_info *)
 		alloc_bootmem_low(sizeof(struct raw3215_info));
@@ -938,10 +938,12 @@
 		free_bootmem((unsigned long) raw, sizeof(struct raw3215_info));
 		raw3215[0] = NULL;
 		printk("Couldn't find a 3215 console device\n");
-		return;
+		return -ENODEV;
 	}
 	register_console(&con3215);
+	return 0;
 }
+console_initcall(con3215_init);
 #endif
 
 /*
@@ -1122,7 +1124,6 @@
 		spin_unlock_irqrestore(raw->lock, flags);
 	}
 }
-console_initcall(con3215_init);
 
 /*
  * Disable writing to a 3215 tty
diff -Nru a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c
--- a/drivers/s390/char/sclp.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/char/sclp.c	Sat Apr 19 19:51:49 2003
@@ -9,7 +9,6 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/kmod.h>
 #include <linux/bootmem.h>
@@ -25,14 +24,6 @@
 
 #define SCLP_CORE_PRINT_HEADER "sclp low level driver: "
 
-/*
- * decides whether we make use of the macro MACHINE_IS_VM to
- * configure the driver for VM at run time (a little bit
- * different behaviour); otherwise we use the default
- * settings in sclp_data.init_ioctls
- */
-#define USE_VM_DETECTION
-
 /* Structure for register_early_external_interrupt. */
 static ext_int_info_t ext_int_info_hwc;
 
@@ -111,30 +102,32 @@
 }
 
 static int
-__sclp_start_request(void)
+sclp_start_request(void)
 {
 	struct sclp_req *req;
 	int rc;
+	unsigned long flags;
 
 	/* quick exit if sclp is already in use */
 	if (test_bit(SCLP_RUNNING, &sclp_status))
 		return -EBUSY;
-	/* quick exit if queue is empty */
-	if (list_empty(&sclp_req_queue))
-		return -EINVAL;
-	/* try to start the first request on the request queue. */
-	req = list_entry(sclp_req_queue.next, struct sclp_req, list);
-	rc = __service_call(req->command, req->sccb);
-	switch (rc) {
-	case 0:
-		req->status = SCLP_REQ_RUNNING;
-		break;
-	case -EIO:
-		req->status = SCLP_REQ_FAILED;
-		if (req->callback != NULL)
-			req->callback(req, req->callback_data);
-		break;
-	}
+	spin_lock_irqsave(&sclp_lock, flags);
+	/* Get first request on queue if available */
+	req = NULL;
+	if (!list_empty(&sclp_req_queue))
+		req = list_entry(sclp_req_queue.next, struct sclp_req, list);
+	if (req) {
+		rc = __service_call(req->command, req->sccb);
+		if (rc) {
+			req->status = SCLP_REQ_FAILED;
+			list_del(&req->list);
+		} else
+			req->status = SCLP_REQ_RUNNING;
+	} else
+		rc = -EINVAL;
+	spin_unlock_irqrestore(&sclp_lock, flags);
+	if (rc == -EIO && req->callback != NULL)
+		req->callback(req, req->callback_data);
 	return rc;
 }
 
@@ -156,8 +149,12 @@
 		list_for_each(l, &sclp_reg_list) {
 			t = list_entry(l, struct sclp_register, list);
 			if (t->receive_mask & (1 << (32 - evbuf->type))) {
-				if (t->receiver_fn != NULL)
+				if (t->receiver_fn != NULL) {
+					spin_unlock_irqrestore(&sclp_lock,
+							       flags);
 					t->receiver_fn(evbuf);
+					spin_lock_irqsave(&sclp_lock, flags);
+				}
 				break;
 			}
 			else
@@ -230,7 +227,7 @@
 }
 
 /*
- * Function to issue Read Event Data/Unconditional Read
+ * Function to queue Read Event Data/Unconditional Read
  */
 static void
 __sclp_unconditional_read(void)
@@ -278,45 +275,44 @@
 	struct list_head *l;
 	struct sclp_req *req, *tmp;
 
+	/*
+	 * Only process interrupt if sclp is initialized.
+	 * This avoids strange effects for a pending request
+	 * from before the last re-ipl.
+	 */
+	if (!test_bit(SCLP_INIT, &sclp_status))
+		return;
 	ext_int_param = S390_lowcore.ext_params;
 	finished_sccb = ext_int_param & EXT_INT_SCCB_MASK;
 	evbuf_pending = ext_int_param & (EXT_INT_EVBUF_PENDING |
 					 EXT_INT_STATECHANGE_PENDING);
 	irq_enter();
-	/*
-	 * Only do request callbacks if sclp is initialized.
-	 * This avoids strange effects for a pending request
-	 * from before the last re-ipl.
-	 */
-	if (test_bit(SCLP_INIT, &sclp_status)) {
-		spin_lock(&sclp_lock);
-		req = NULL;
-		if (finished_sccb != 0U) {
-			list_for_each(l, &sclp_req_queue) {
-				tmp = list_entry(l, struct sclp_req, list);
-				if (finished_sccb == (u32)(addr_t) tmp->sccb) {
-					list_del(&tmp->list);
-					req = tmp;
-					break;
-				}
+	req = NULL;
+	spin_lock(&sclp_lock);
+	if (finished_sccb != 0U) {
+		list_for_each(l, &sclp_req_queue) {
+			tmp = list_entry(l, struct sclp_req, list);
+			if (finished_sccb == (u32)(addr_t) tmp->sccb) {
+				list_del(&tmp->list);
+				req = tmp;
+				break;
 			}
 		}
-		spin_unlock(&sclp_lock);
-		if (req != NULL) {
-			req->status = SCLP_REQ_DONE;
-			if (req->callback != NULL)
-				req->callback(req, req->callback_data);
-		}
 	}
-	spin_lock(&sclp_lock);
 	/* Head queue a read sccb if an event buffer is pending */
 	if (evbuf_pending)
 		__sclp_unconditional_read();
+	spin_unlock(&sclp_lock);
+	/* Perform callback */
+	if (req != NULL) {
+		req->status = SCLP_REQ_DONE;
+		if (req->callback != NULL)
+			req->callback(req, req->callback_data);
+	}
 	/* Now clear the running bit */
 	clear_bit(SCLP_RUNNING, &sclp_status);
 	/* and start next request on the queue */
-	__sclp_start_request();
-	spin_unlock(&sclp_lock);
+	sclp_start_request();
 	irq_exit();
 }
 
@@ -368,15 +364,19 @@
 {
 	unsigned long flags;
 
-	if (!test_bit(SCLP_INIT, &sclp_status))
+	if (!test_bit(SCLP_INIT, &sclp_status)) {
+		req->status = SCLP_REQ_FAILED;
+		if (req->callback != NULL)
+			req->callback(req, req->callback_data);
 		return;
+	}
 	spin_lock_irqsave(&sclp_lock, flags);
 	/* queue the request */
 	req->status = SCLP_REQ_QUEUED;
 	list_add_tail(&req->list, &sclp_req_queue);
-	/* try to start the first request on the queue */
-	__sclp_start_request();
 	spin_unlock_irqrestore(&sclp_lock, flags);
+	/* try to start the first request on the queue */
+	sclp_start_request();
 }
 
 /* state change notification */
@@ -489,8 +489,8 @@
 {
 	psw_t quiesce_psw;
 
-	quiesce_psw.mask = _DW_PSW_MASK;
-	queisce_psw.addr = 0xfff;
+	quiesce_psw.mask = PSW_BASE_BITS | PSW_MASK_WAIT;
+	quiesce_psw.addr = 0xfff;
 	__load_psw(quiesce_psw);
 }
 #endif
@@ -566,10 +566,9 @@
 	if (test_bit(SCLP_INIT, &sclp_status)) {
 		/* add request to sclp queue */
 		list_add_tail(&req->list, &sclp_req_queue);
-		/* and start if SCLP is idle */
-		if (!test_bit(SCLP_RUNNING, &sclp_status))
-			__sclp_start_request();
 		spin_unlock_irqrestore(&sclp_lock, flags);
+		/* and start if SCLP is idle */
+		sclp_start_request();
 		/* now wait for completion */
 		while (req->status != SCLP_REQ_DONE &&
 		       req->status != SCLP_REQ_FAILED)
@@ -730,7 +729,41 @@
 	sclp_init_mask();
 }
 
+#define	SCLP_EVBUF_PROCESSED	0x80
+
+/*
+ * Traverse array of event buffers contained in SCCB and remove all buffers
+ * with a set "processed" flag. Return the number of unprocessed buffers.
+ */
+int
+sclp_remove_processed(struct sccb_header *sccb)
+{
+	struct evbuf_header *evbuf;
+	int unprocessed;
+	u16 remaining;
+
+	evbuf = (struct evbuf_header *) (sccb + 1);
+	unprocessed = 0;
+	remaining = sccb->length - sizeof(struct sccb_header);
+	while (remaining > 0) {
+		remaining -= evbuf->length;
+		if (evbuf->flags & SCLP_EVBUF_PROCESSED) {
+			sccb->length -= evbuf->length;
+			memcpy((void *) evbuf,
+			       (void *) ((addr_t) evbuf + evbuf->length),
+			       remaining);
+		} else {
+			unprocessed++;
+			evbuf = (struct evbuf_header *)
+					((addr_t) evbuf + evbuf->length);
+		}
+	}
+
+	return unprocessed;
+}
+
 EXPORT_SYMBOL(sclp_add_request);
 EXPORT_SYMBOL(sclp_sync_wait);
 EXPORT_SYMBOL(sclp_register);
 EXPORT_SYMBOL(sclp_unregister);
+EXPORT_SYMBOL(sclp_error_message);
diff -Nru a/drivers/s390/char/sclp.h b/drivers/s390/char/sclp.h
--- a/drivers/s390/char/sclp.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/char/sclp.h	Sat Apr 19 19:51:28 2003
@@ -126,6 +126,7 @@
 int sclp_register(struct sclp_register *reg);
 void sclp_unregister(struct sclp_register *reg);
 char *sclp_error_message(u16 response_code);
+int sclp_remove_processed(struct sccb_header *sccb);
 
 /* useful inlines */
 
diff -Nru a/drivers/s390/char/sclp_con.c b/drivers/s390/char/sclp_con.c
--- a/drivers/s390/char/sclp_con.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/s390/char/sclp_con.c	Sat Apr 19 19:51:47 2003
@@ -9,7 +9,6 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/kmod.h>
 #include <linux/console.h>
 #include <linux/init.h>
@@ -24,7 +23,7 @@
 
 #define sclp_console_major 4		/* TTYAUX_MAJOR */
 #define sclp_console_minor 64
-#define sclp_console_name  "console"
+#define sclp_console_name  "ttyS"
 
 /* Lock to guard over changes to global variables */
 static spinlock_t sclp_con_lock;
@@ -193,28 +192,29 @@
 	.write = sclp_console_write,
 	.device = sclp_console_device,
 	.unblank = sclp_console_unblank,
-	.flags = CON_PRINTBUFFER
+	.flags = CON_PRINTBUFFER,
+	.index = 0 /* ttyS0 */
 };
 
 /*
  * called by console_init() in drivers/char/tty_io.c at boot-time.
  */
-void __init
+static int __init
 sclp_console_init(void)
 {
 	void *page;
 	int i;
 
 	if (!CONSOLE_IS_SCLP)
-		return;
+		return 0;
 	if (sclp_rw_init() != 0)
-		return;
+		return 0;
 	/* Allocate pages for output buffering */
 	INIT_LIST_HEAD(&sclp_con_pages);
 	for (i = 0; i < MAX_CONSOLE_PAGES; i++) {
 		page = alloc_bootmem_low_pages(PAGE_SIZE);
 		if (page == NULL)
-			return;
+			return 0;
 		list_add_tail((struct list_head *) page, &sclp_con_pages);
 	}
 	INIT_LIST_HEAD(&sclp_con_outqueue);
@@ -236,6 +236,7 @@
 
 	/* enable printk-access to this driver */
 	register_console(&sclp_console);
+	return 0;
 }
 
 console_initcall(sclp_console_init);
diff -Nru a/drivers/s390/char/sclp_cpi.c b/drivers/s390/char/sclp_cpi.c
--- a/drivers/s390/char/sclp_cpi.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/s390/char/sclp_cpi.c	Sat Apr 19 19:51:48 2003
@@ -130,7 +130,7 @@
 	req = (struct sclp_req *) kmalloc(sizeof(struct sclp_req), GFP_KERNEL);
 	if (req == NULL)
 		return ERR_PTR(-ENOMEM);
-	sccb = (struct cpi_sccb *) __get_free_page(GFP_KERNEL);
+	sccb = (struct cpi_sccb *) __get_free_page(GFP_KERNEL | GFP_DMA);
 	if (sccb == NULL) {
 		kfree(req);
 		return ERR_PTR(-ENOMEM);
diff -Nru a/drivers/s390/char/sclp_rw.c b/drivers/s390/char/sclp_rw.c
--- a/drivers/s390/char/sclp_rw.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/s390/char/sclp_rw.c	Sat Apr 19 19:51:47 2003
@@ -9,7 +9,6 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/kmod.h>
 #include <linux/types.h>
 #include <linux/err.h>
@@ -374,39 +373,6 @@
 	return rc;
 }
 
-#define	SCLP_EVBUF_PROCESSED	0x80
-
-/*
- * Traverse array of event buffers contained in SCCB and remove all buffers
- * with a set "processed" flag. Return the number of unprocessed buffers.
- */
-static int
-sclp_remove_processed(struct sccb_header *sccb)
-{
-	struct evbuf_header *evbuf;
-	int unprocessed;
-	u16 remaining;
-
-	evbuf = (struct evbuf_header *) (sccb + 1);
-	unprocessed = 0;
-	remaining = sccb->length - sizeof(struct sccb_header);
-	while (remaining > 0) {
-		remaining -= evbuf->length;
-		if (evbuf->flags & SCLP_EVBUF_PROCESSED) {
-			sccb->length -= evbuf->length;
-			memcpy((void *) evbuf,
-			       (void *) ((addr_t) evbuf + evbuf->length),
-			       remaining);
-		} else {
-			unprocessed++;
-			evbuf = (struct evbuf_header *)
-					((addr_t) evbuf + evbuf->length);
-		}
-	}
-
-	return unprocessed;
-}
-
 static void
 sclp_buffer_retry(unsigned long data)
 {
@@ -480,10 +446,6 @@
 			rc = -ENOMEM;
 		else
 			rc = -EINVAL;
-		printk(KERN_WARNING SCLP_RW_PRINT_HEADER
-		       "sclp_writedata_callback: %s (response code=0x%x).\n",
-		       sclp_error_message(sccb->header.response_code),
-		       sccb->header.response_code);
 		break;
 	}
 	if (buffer->callback != NULL)
@@ -505,8 +467,11 @@
 		sclp_finalize_mto(buffer);
 
 	/* Are there messages in the output buffer ? */
-	if (buffer->mto_number == 0)
+	if (buffer->mto_number == 0) {
+		if (callback != NULL)
+			callback(buffer, 0);
 		return;
+	}
 
 	sccb = buffer->sccb;
 	if (sclp_rw_event.sclp_send_mask & EvTyp_Msg_Mask)
@@ -516,7 +481,8 @@
 		/* Use write priority message */
 		sccb->msg_buf.header.type = EvTyp_PMsgCmd;
 	else {
-		callback(buffer, -ENOSYS);
+		if (callback != NULL)
+			callback(buffer, -ENOSYS);
 		return;
 	}
 	buffer->request.command = SCLP_CMDW_WRITEDATA;
diff -Nru a/drivers/s390/char/sclp_tty.c b/drivers/s390/char/sclp_tty.c
--- a/drivers/s390/char/sclp_tty.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/char/sclp_tty.c	Sat Apr 19 19:51:28 2003
@@ -9,7 +9,7 @@
  */
 
 #include <linux/config.h>
-#include <linux/version.h>
+#include <linux/module.h>
 #include <linux/kmod.h>
 #include <linux/tty.h>
 #include <linux/tty_driver.h>
@@ -81,9 +81,6 @@
 static int
 sclp_tty_open(struct tty_struct *tty, struct file *filp)
 {
-	/* only 1 SCLP terminal supported */
-	if (minor(tty->device) != tty->driver.minor_start)
-		return -ENODEV;
 	sclp_tty = tty;
 	tty->driver_data = NULL;
 	tty->low_latency = 0;
@@ -94,9 +91,6 @@
 static void
 sclp_tty_close(struct tty_struct *tty, struct file *filp)
 {
-	/* only 1 SCLP terminal supported */
-	if (minor(tty->device) != tty->driver.minor_start)
-		return;
 	if (tty->count > 1)
 		return;
 	sclp_tty = NULL;
@@ -294,8 +288,15 @@
 static inline void
 __sclp_ttybuf_emit(struct sclp_buffer *buffer)
 {
+	unsigned long flags;
+	int count;
+
+	spin_lock_irqsave(&sclp_tty_lock, flags);
 	list_add_tail(&buffer->list, &sclp_tty_outqueue);
-	if (sclp_tty_buffer_count++ == 0)
+	count = sclp_tty_buffer_count++;
+	spin_unlock_irqrestore(&sclp_tty_lock, flags);
+
+	if (count == 0)
 		sclp_emit_buffer(buffer, sclp_ttybuf_callback);
 }
 
@@ -307,13 +308,16 @@
 sclp_tty_timeout(unsigned long data)
 {
 	unsigned long flags;
+	struct sclp_buffer *buf;
 
 	spin_lock_irqsave(&sclp_tty_lock, flags);
-	if (sclp_ttybuf != NULL) {
-		__sclp_ttybuf_emit(sclp_ttybuf);
-		sclp_ttybuf = NULL;
-	}
+	buf = sclp_ttybuf;
+	sclp_ttybuf = NULL;
 	spin_unlock_irqrestore(&sclp_tty_lock, flags);
+
+	if (buf != NULL) {
+		__sclp_ttybuf_emit(buf);
+	}
 }
 
 /*
@@ -325,6 +329,7 @@
 	unsigned long flags;
 	void *page;
 	int written;
+	struct sclp_buffer *buf;
 
 	if (count <= 0)
 		return;
@@ -353,8 +358,11 @@
 		 * output buffer. Emit the buffer, create a new buffer
 		 * and then output the rest of the string.
 		 */
-		__sclp_ttybuf_emit(sclp_ttybuf);
+		buf = sclp_ttybuf;
 		sclp_ttybuf = NULL;
+		spin_unlock_irqrestore(&sclp_tty_lock, flags);
+		__sclp_ttybuf_emit(buf);
+		spin_lock_irqsave(&sclp_tty_lock, flags);
 		str += written;
 		count -= written;
 	} while (count > 0);
@@ -466,7 +474,8 @@
 /*
  * push input to tty
  */
-static void sclp_tty_input(unsigned char* buf, unsigned int count)
+static void
+sclp_tty_input(unsigned char* buf, unsigned int count)
 {
 	unsigned int cchar;
 
@@ -706,15 +715,21 @@
 {
 	void *page;
 	int i;
+	int rc;
 
 	if (!CONSOLE_IS_SCLP)
 		return;
-	if (sclp_rw_init() != 0)
+	rc = sclp_rw_init();
+	if (rc != 0) {
+		printk(KERN_ERR SCLP_TTY_PRINT_HEADER
+		       "could not register tty - "
+		       "sclp_rw_init returned %d\n", rc);
 		return;
+	}
 	/* Allocate pages for output buffering */
 	INIT_LIST_HEAD(&sclp_tty_pages);
 	for (i = 0; i < MAX_KMEM_PAGES; i++) {
-		page = (void *) get_zeroed_page(GFP_KERNEL);
+		page = (void *) get_zeroed_page(GFP_KERNEL | GFP_DMA);
 		if (page == NULL)
 			return;
 		list_add_tail((struct list_head *) page, &sclp_tty_pages);
@@ -744,7 +759,7 @@
 	memset (&sclp_tty_driver, 0, sizeof(struct tty_driver));
 	sclp_tty_driver.magic = TTY_DRIVER_MAGIC;
 	sclp_tty_driver.owner = THIS_MODULE;
-	sclp_tty_driver.driver_name = "tty_sclp";
+	sclp_tty_driver.driver_name = "sclp_line";
 	sclp_tty_driver.name = "ttyS";
 	sclp_tty_driver.name_base = 0;
 	sclp_tty_driver.major = TTY_MAJOR;
@@ -795,9 +810,9 @@
 	sclp_tty_driver.read_proc = NULL;
 	sclp_tty_driver.write_proc = NULL;
 
-	if (tty_register_driver(&sclp_tty_driver))
-		panic("Couldn't register sclp_tty driver\n");
+	rc = tty_register_driver(&sclp_tty_driver);
+	if (rc != 0)
+		printk(KERN_ERR SCLP_TTY_PRINT_HEADER
+		       "could not register tty - "
+		       "sclp_drv_register returned %d\n", rc);
 }
-
-console_initcall(sclp_tty_init);
-
diff -Nru a/drivers/s390/cio/airq.c b/drivers/s390/cio/airq.c
--- a/drivers/s390/cio/airq.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/cio/airq.c	Sat Apr 19 19:51:50 2003
@@ -2,7 +2,7 @@
  *  drivers/s390/cio/airq.c
  *   S/390 common I/O routines -- support for adapter interruptions
  *
- *   $Revision: 1.10 $
+ *   $Revision: 1.11 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -87,14 +87,14 @@
 }
 
 void
-do_adapter_IO (__u32 intparm)
+do_adapter_IO (void)
 {
 	CIO_TRACE_EVENT (4, "doaio");
 
 	spin_lock (&adapter_lock);
 
 	if (adapter_handler)
-		(*adapter_handler) (intparm);
+		(*adapter_handler) ();
 
 	spin_unlock (&adapter_lock);
 
diff -Nru a/drivers/s390/cio/airq.h b/drivers/s390/cio/airq.h
--- a/drivers/s390/cio/airq.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/cio/airq.h	Sat Apr 19 19:51:50 2003
@@ -1,10 +1,10 @@
 #ifndef S390_AINTERRUPT_H
 #define S390_AINTERRUPT_H
 
-typedef	int (*adapter_int_handler_t)(__u32 intparm);
+typedef	int (*adapter_int_handler_t)(void);
 
 extern int s390_register_adapter_interrupt(adapter_int_handler_t handler);
 extern int s390_unregister_adapter_interrupt(adapter_int_handler_t handler);
-extern void do_adapter_IO (__u32 intparm);
+extern void do_adapter_IO (void);
 
 #endif
diff -Nru a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
--- a/drivers/s390/cio/chsc.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/s390/cio/chsc.c	Sat Apr 19 19:51:48 2003
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/chsc.c
  *   S/390 common I/O routines -- channel subsystem call
- *   $Revision: 1.57 $
+ *   $Revision: 1.67 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -76,53 +76,77 @@
 chsc_get_sch_desc_irq(int irq)
 {
 	int ccode, chpid, j;
+	int ret;
 
-	/* FIXME: chsc_area_sei cannot be on the stack since it needs to
-	 * be page-aligned. Implement proper locking or dynamic
-	 * allocation or prove that this function does not have to be
-	 * reentrant! */
-	static struct ssd_area chsc_area_ssd 
-		__attribute__ ((aligned(PAGE_SIZE)));
-
-	typeof (chsc_area_ssd.response_block)
-		*ssd_res = &chsc_area_ssd.response_block;
-
-	chsc_area_ssd = (struct ssd_area) {
-		.request_block = {
-			.command_code1 = 0x0010,
-			.command_code2 = 0x0004,
-			.f_sch = irq,
-			.l_sch = irq,
-		}
+	struct {
+		struct chsc_header request;
+		u16 reserved1;
+		u16 f_sch;	  /* first subchannel */
+		u16 reserved2;
+		u16 l_sch;	  /* last subchannel */
+		u32 reserved3;
+		struct chsc_header response;
+		u32 reserved4;
+		u8 sch_valid : 1;
+		u8 dev_valid : 1;
+		u8 st	     : 3; /* subchannel type */
+		u8 zeroes    : 3;
+		u8  unit_addr;	  /* unit address */
+		u16 devno;	  /* device number */
+		u8 path_mask;
+		u8 fla_valid_mask;
+		u16 sch;	  /* subchannel */
+		u8 chpid[8];	  /* chpids 0-7 */
+		u16 fla[8];	  /* full link addresses 0-7 */
+	} *ssd_area;
+
+	ssd_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	if (!ssd_area) {
+		CIO_CRW_EVENT(0, "No memory for ssd area!\n");
+		return -ENOMEM;
+	}
+
+	ssd_area->request = (struct chsc_header) {
+		.length = 0x0010,
+		.code   = 0x0004,
 	};
 
-	ccode = chsc(&chsc_area_ssd);
+	ssd_area->f_sch = irq;
+	ssd_area->l_sch = irq;
+
+	ccode = chsc(ssd_area);
 	if (ccode > 0) {
 		pr_debug("chsc returned with ccode = %d\n", ccode);
-		if (ccode == 3)
-			return -ENODEV;
-		return -EBUSY;
+		ret = (ccode == 3) ? -ENODEV : -EBUSY;
+		goto out;
 	}
 
-	switch (chsc_area_ssd.response_block.response_code) {
+	switch (ssd_area->response.code) {
 	case 0x0001: /* everything ok */
+		ret = 0;
 		break;
 	case 0x0002:
 		CIO_CRW_EVENT(2, "Invalid command!\n");
 	case 0x0003:
 		CIO_CRW_EVENT(2, "Error in chsc request block!\n");
-		return -EINVAL;
+		ret = -EINVAL;
+		break;
 	case 0x0004:
 		CIO_CRW_EVENT(2, "Model does not provide ssd\n");
-		return -EOPNOTSUPP;
+		ret = -EOPNOTSUPP;
+		break;
 	default:
 		CIO_CRW_EVENT(2, "Unknown CHSC response %d\n",
-			      chsc_area_ssd.response_block.response_code);
-		return -EIO;
+			      ssd_area->response.code);
+		ret = -EIO;
+		break;
 	}
 
+	if (ret != 0)
+		goto out;
+
 	/*
-	 * ssd_res->st stores the type of the detected
+	 * ssd_area->st stores the type of the detected
 	 * subchannel, with the following definitions:
 	 *
 	 * 0: I/O subchannel:	  All fields have meaning
@@ -135,43 +159,45 @@
 	 *
 	 * Other types are currently undefined.
 	 */
-	if (ssd_res->st > 3) { /* uhm, that looks strange... */
+	if (ssd_area->st > 3) { /* uhm, that looks strange... */
 		CIO_CRW_EVENT(0, "Strange subchannel type %d"
-			      " for sch %x\n", ssd_res->st, irq);
+			      " for sch %x\n", ssd_area->st, irq);
 		/*
 		 * There may have been a new subchannel type defined in the
 		 * time since this code was written; since we don't know which
 		 * fields have meaning and what to do with it we just jump out
 		 */
-		return 0;
+		goto out;
 	} else {
-		const char type[4][8] = {"I/O", "chsc", "message", "ADM"};
+		const char *type[4] = {"I/O", "chsc", "message", "ADM"};
 		CIO_CRW_EVENT(6, "ssd: sch %x is %s subchannel\n",
-			      irq, type[ssd_res->st]);
+			      irq, type[ssd_area->st]);
 		if (ioinfo[irq] == NULL)
 			/* FIXME: we should do device rec. here... */
-			return 0;
+			goto out;
 
 		ioinfo[irq]->ssd_info.valid = 1;
-		ioinfo[irq]->ssd_info.type = ssd_res->st;
+		ioinfo[irq]->ssd_info.type = ssd_area->st;
 	}
 
-	if (ssd_res->st == 0 || ssd_res->st == 2) {
+	if (ssd_area->st == 0 || ssd_area->st == 2) {
 		for (j = 0; j < 8; j++) {
-			if (!((0x80 >> j) & ssd_res->path_mask &
-			      ssd_res->fla_valid_mask))
+			if (!((0x80 >> j) & ssd_area->path_mask &
+			      ssd_area->fla_valid_mask))
 				continue;
-			chpid = ssd_res->chpid[j];
+			chpid = ssd_area->chpid[j];
 			if (chpid
 			    && (!test_and_set_bit (chpid, chpids_known))
 			    && (test_bit (chpid, chpids_logical)))
 				set_bit	 (chpid, chpids);
 
 			ioinfo[irq]->ssd_info.chpid[j] = chpid;
-			ioinfo[irq]->ssd_info.fla[j]   = ssd_res->fla[j];
+			ioinfo[irq]->ssd_info.fla[j]   = ssd_area->fla[j];
 		}
 	}
-	return 0;
+out:
+	free_page ((unsigned long) ssd_area);
+	return ret;
 }
 
 static int
@@ -216,6 +242,7 @@
 s390_subchannel_remove_chpid(struct subchannel *sch, __u8 chpid)
 {
 	int j;
+	int mask;
 
 	for (j = 0; j < 8; j++)
 		if (sch->schib.pmcw.chpid[j] == chpid)
@@ -223,16 +250,68 @@
 	if (j >= 8)
 		return;
 
+	mask = 0x80 >> j;
 	spin_lock(&sch->lock);
 
 	chsc_validate_chpids(sch);
 
-	/* just to be sure... */
-	sch->lpm &= ~(0x80>>j);
+	stsch(sch->irq, &sch->schib);
+	if (sch->vpm == mask) {
+		dev_fsm_event(sch->dev.driver_data, DEV_EVENT_NOTOPER);
+		goto out_unlock;
+	}
+	if ((sch->schib.scsw.actl & (SCSW_ACTL_CLEAR_PEND |
+				     SCSW_ACTL_HALT_PEND |
+				     SCSW_ACTL_START_PEND |
+				     SCSW_ACTL_RESUME_PEND)) &&
+	    (sch->schib.pmcw.lpum == mask)) {
+		int cc = cio_cancel(sch);
+		
+		if (cc == -ENODEV) {
+			dev_fsm_event(sch->dev.driver_data, DEV_EVENT_NOTOPER);
+			goto out_unlock;
+		}
+
+		if (cc == -EINVAL) {
+			struct ccw_device *cdev;
+
+			cc = cio_clear(sch);
+			if (cc == -ENODEV) {
+				dev_fsm_event(sch->dev.driver_data,
+					      DEV_EVENT_NOTOPER);
+				goto out_unlock;
+			}
+			/* Call handler. */
+			cdev = sch->dev.driver_data;
+			cdev->private->state = DEV_STATE_CLEAR_VERIFY;
+			if (cdev->handler)
+				cdev->handler(cdev, cdev->private->intparm,
+					      ERR_PTR(-EIO));
+			goto out_unlock;
+		}
+	} else if ((sch->schib.scsw.actl & SCSW_ACTL_DEVACT) &&
+		   (sch->schib.scsw.actl & SCSW_ACTL_SCHACT) &&
+		   (sch->schib.pmcw.lpum == mask)) {
+		struct ccw_device *cdev;
+		int cc;
+
+		cc = cio_clear(sch);
+		if (cc == -ENODEV) {
+			dev_fsm_event(sch->dev.driver_data, DEV_EVENT_NOTOPER);
+			goto out_unlock;
+		}
+		/* Call handler. */
+		cdev = sch->dev.driver_data;
+		cdev->private->state = DEV_STATE_CLEAR_VERIFY;
+		if (cdev->handler)
+			cdev->handler(cdev, cdev->private->intparm,
+				      ERR_PTR(-EIO));
+		goto out_unlock;
+	}
 
 	/* trigger path verification. */
 	dev_fsm_event(sch->dev.driver_data, DEV_EVENT_VERIFY);
-
+out_unlock:
 	spin_unlock(&sch->lock);
 }
 
@@ -265,7 +344,7 @@
 		sch = ioinfo[irq];
 		if (sch == NULL)
 			continue;  /* we don't know the device anyway */
-		/* FIXME: Kill pending I/O. */
+
 		s390_subchannel_remove_chpid(sch, chpid);
 	}
 #endif
@@ -349,7 +428,7 @@
 	if (!test_bit(chpid, chpids_logical))
 		return; /* no need to do the rest */
 
-	for (irq = 0; irq <= __MAX_SUBCHANNELS; irq++) {
+	for (irq = 0; irq < __MAX_SUBCHANNELS; irq++) {
 		int chp_mask;
 
 		sch = ioinfo[irq];
@@ -369,7 +448,6 @@
 			continue;
 		}
 	
-		/* FIXME: Kill pending I/O. */
 		spin_lock_irq(&sch->lock);
 
 		chp_mask = s390_process_res_acc_sch(chpid, fla, fla_mask, sch);
@@ -402,92 +480,97 @@
 static void
 do_process_crw(void *ignore)
 {
-	int do_sei;
+	struct {
+		struct chsc_header request;
+		u32 reserved1;
+		u32 reserved2;
+		u32 reserved3;
+		struct chsc_header response;
+		u32 reserved4;
+		u8  flags;
+		u8  vf;		/* validity flags */
+		u8  rs;		/* reporting source */
+		u8  cc;		/* content code */
+		u16 fla;	/* full link address */
+		u16 rsid;	/* reporting source id */
+		u32 reserved5;
+		u32 reserved6;
+		u32 ccdf;	/* content-code dependent field */
+		u32 reserved7;
+		u32 reserved8;
+		u32 reserved9;
+	} *sei_area;
 
 	/*
 	 * build the chsc request block for store event information
 	 * and do the call
 	 */
+	sei_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
 
-	/* FIXME: chsc_area_sei cannot be on the stack since it needs to
-	 * be page-aligned. Implement proper locking or dynamic
-	 * allocation or prove that this function does not have to be
-	 * reentrant! */
-	static struct sei_area chsc_area_sei
-		__attribute__ ((aligned(PAGE_SIZE))) = {
-			.request_block = {
-				.command_code1 = 0x0010,
-				.command_code2 = 0x000e
-			}
-		};
-
-	typeof (chsc_area_sei.response_block)
-		*sei_res = &chsc_area_sei.response_block;
-
+	if (!sei_area) {
+		CIO_CRW_EVENT(0, "No memory for sei area!\n");
+		return;
+	}
 
 	CIO_TRACE_EVENT( 2, "prcss");
 
-	do_sei = 1;
-
-	while (do_sei) {
+	do {
 		int ccode;
+		memset(sei_area, 0, sizeof(*sei_area));
+
+		sei_area->request = (struct chsc_header) {
+			.length = 0x0010,
+			.code   = 0x000e,
+		};
 
-		ccode = chsc(&chsc_area_sei);
+		ccode = chsc(sei_area);
 		if (ccode > 0)
-			return;
+			goto out;
 
-		switch (sei_res->response_code) {
+		switch (sei_area->response.code) {
 			/* for debug purposes, check for problems */
 		case 0x0001:
+			CIO_CRW_EVENT(4, "chsc_process_crw: event information "
+					"successfully stored\n");
 			break; /* everything ok */
 		case 0x0002:
 			CIO_CRW_EVENT(2,
 				      "chsc_process_crw: invalid command!\n");
-			return;
+			goto out;
 		case 0x0003:
 			CIO_CRW_EVENT(2, "chsc_process_crw: error in chsc "
 				      "request block!\n");
-			return;
+			goto out;
 		case 0x0005:
 			CIO_CRW_EVENT(2, "chsc_process_crw: no event "
 				      "information stored\n");
-			return;
+			goto out;
 		default:
 			CIO_CRW_EVENT(2, "chsc_process_crw: chsc response %d\n",
-				      sei_res->response_code);
-			return;
+				      sei_area->response.code);
+			goto out;
 		}
-		
-		CIO_CRW_EVENT(4, "chsc_process_crw: event information "
-			      "successfully stored\n");
-
-		/* Check if there is more event information pending. */
-		if (sei_res->flags & 0x80)
-			CIO_CRW_EVENT( 2, "chsc_process_crw: "
-				       "further event information pending\n");
-		else
-			do_sei = 0;
 
 		/* Check if we might have lost some information. */
-		if (sei_res->flags & 0x40)
-			CIO_CRW_EVENT( 2, "chsc_process_crw: Event information "
+		if (sei_area->flags & 0x40)
+			CIO_CRW_EVENT(2, "chsc_process_crw: Event information "
 				       "has been lost due to overflow!\n");
 
-		if (sei_res->rs != 4) {
+		if (sei_area->rs != 4) {
 			CIO_CRW_EVENT(2, "chsc_process_crw: reporting source "
 				      "(%04X) isn't a chpid!\n",
-				      sei_res->rsid);
+				      sei_area->rsid);
 			continue;
 		}
-		
+
 		/* which kind of information was stored? */
-		switch (sei_res->cc) {
+		switch (sei_area->cc) {
 		case 1: /* link incident*/
 			CIO_CRW_EVENT(4, "chsc_process_crw: "
 				      "channel subsystem reports link incident,"
-				      " source is chpid %x\n", sei_res->rsid);
+				      " source is chpid %x\n", sei_area->rsid);
 			
-			s390_set_chpid_offline(sei_res->rsid);
+			s390_set_chpid_offline(sei_area->rsid);
 			break;
 			
 		case 2: /* i/o resource accessibiliy */
@@ -495,27 +578,27 @@
 				      "channel subsystem reports some I/O "
 				      "devices may have become accessible\n");
 			pr_debug("Data received after sei: \n");
-			pr_debug("Validity flags: %x\n", sei_res->vf);
+			pr_debug("Validity flags: %x\n", sei_area->vf);
 			
 			/* allocate a new channel path structure, if needed */
-			if (chps[sei_res->rsid] == NULL)
-				new_channel_path(sei_res->rsid, CHP_ONLINE);
+			if (chps[sei_area->rsid] == NULL)
+				new_channel_path(sei_area->rsid, CHP_ONLINE);
 			else
-				set_chp_status(sei_res->rsid, CHP_ONLINE);
+				set_chp_status(sei_area->rsid, CHP_ONLINE);
 			
-			if ((sei_res->vf & 0x80) == 0) {
-				pr_debug("chpid: %x\n", sei_res->rsid);
-				s390_process_res_acc(sei_res->rsid, 0, 0);
-			} else if ((sei_res->vf & 0xc0) == 0x80) {
+			if ((sei_area->vf & 0x80) == 0) {
+				pr_debug("chpid: %x\n", sei_area->rsid);
+				s390_process_res_acc(sei_area->rsid, 0, 0);
+			} else if ((sei_area->vf & 0xc0) == 0x80) {
 				pr_debug("chpid: %x link addr: %x\n",
-					 sei_res->rsid, sei_res->fla);
-				s390_process_res_acc(sei_res->rsid,
-						     sei_res->fla, 0xff00);
-			} else if ((sei_res->vf & 0xc0) == 0xc0) {
+					 sei_area->rsid, sei_area->fla);
+				s390_process_res_acc(sei_area->rsid,
+						     sei_area->fla, 0xff00);
+			} else if ((sei_area->vf & 0xc0) == 0xc0) {
 				pr_debug("chpid: %x full link addr: %x\n",
-					 sei_res->rsid, sei_res->fla);
-				s390_process_res_acc(sei_res->rsid,
-						     sei_res->fla, 0xffff);
+					 sei_area->rsid, sei_area->fla);
+				s390_process_res_acc(sei_area->rsid,
+						     sei_area->fla, 0xffff);
 			}
 			pr_debug("\n");
 			
@@ -523,15 +606,13 @@
 			
 		default: /* other stuff */
 			CIO_CRW_EVENT(4, "chsc_process_crw: event %d\n",
-				      sei_res->cc);
+				      sei_area->cc);
 			break;
 		}
-		if (do_sei) {
-			memset(&chsc_area_sei, 0, sizeof(struct sei_area));
-			chsc_area_sei.request_block.command_code1 = 0x0010;
-			chsc_area_sei.request_block.command_code2 = 0x000e;
-		}
-	}
+	} while (sei_area->flags & 0x80);
+
+out:
+	free_page((unsigned long)sei_area);
 }
 
 void
@@ -539,7 +620,7 @@
 {
 	static DECLARE_WORK(work, do_process_crw, 0);
 
-	schedule_work(&work);
+	queue_work(ccw_device_work, &work);
 }
 
 static void
@@ -555,7 +636,7 @@
 	sprintf(dbf_txt, "cadd%x", chpid);
 	CIO_TRACE_EVENT(2, dbf_txt);
 
-	for (irq = 0; irq <= __MAX_SUBCHANNELS; irq++) {
+	for (irq = 0; irq < __MAX_SUBCHANNELS; irq++) {
 		int i;
 
 		sch = ioinfo[irq];
@@ -567,7 +648,6 @@
 			continue;
 		}
 	
-		/* FIXME: Kill pending I/O. */
 		spin_lock(&sch->lock);
 		for (i=0; i<8; i++)
 			if (sch->schib.pmcw.chpid[i] == chpid) {
@@ -599,26 +679,9 @@
  * Handling of crw machine checks with channel path source.
  */
 void
-chp_process_crw(int chpid)
+chp_process_crw(int chpid, int on)
 {
-	/*
-	 * Update our descriptions. We need this since we don't always
-	 * get machine checks for path come and can't rely on our information
-	 * being consistent otherwise.
-	 */
-	chsc_get_sch_descriptions();
-	if (!cio_chsc_desc_avail) {
-		/*
-		 * Something went wrong...
-		 * We can't reliably say whether a path was there before.
-		 */
-		CIO_CRW_EVENT(0, "Error: Could not retrieve "
-			      "subchannel descriptions, will not process chp"
-			      "machine check...\n");
-		return;
-	}
-
-	if (!test_bit(chpid, chpids)) {
+	if (on == 0) {
 		/* Path has gone. We use the link incident routine.*/
 		s390_set_chpid_offline(chpid);
 	} else {
@@ -645,9 +708,6 @@
 	char dbf_text[15];
 	struct subchannel *sch;
 	int irq;
-
-	if (chpid <=0 || chpid >= NR_CHPIDS)
-		return -EINVAL;
 
 	sprintf(dbf_text, on?"varyon%x":"varyoff%x", chpid);
 	CIO_TRACE_EVENT( 2, dbf_text);
diff -Nru a/drivers/s390/cio/chsc.h b/drivers/s390/cio/chsc.h
--- a/drivers/s390/cio/chsc.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/cio/chsc.h	Sat Apr 19 19:51:50 2003
@@ -12,85 +12,10 @@
 #define CHSC_SEI_ACC_LINKADDR     2
 #define CHSC_SEI_ACC_FULLLINKADDR 3
 
-struct sei_area {
-	struct {
-		/* word 0 */
-		__u16 command_code1;
-		__u16 command_code2;
-		/* word 1 */
-		__u32 reserved1;
-		/* word 2 */
-		__u32 reserved2;
-		/* word 3 */
-		__u32 reserved3;
-	} __attribute__ ((packed,aligned(8))) request_block;
-	struct {
-		/* word 0 */
-		__u16 length;
-		__u16 response_code;
-		/* word 1 */
-		__u32 reserved1;
-		/* word 2 */
-		__u8  flags;
-		__u8  vf;	  /* validity flags */
-		__u8  rs;	  /* reporting source */
-		__u8  cc;	  /* content code */
-		/* word 3 */
-		__u16 fla;	  /* full link address */
-		__u16 rsid;	  /* reporting source id */
-		/* word 4 */
-		__u32 reserved2;
-		/* word 5 */
-		__u32 reserved3;
-		/* word 6 */
-		__u32 ccdf;	  /* content-code dependent field */
-		/* word 7 */
-		__u32 reserved4;
-		/* word 8 */
-		__u32 reserved5;
-		/* word 9 */
-		__u32 reserved6;
-	} __attribute__ ((packed,aligned(8))) response_block;
-} __attribute__ ((packed,aligned(PAGE_SIZE)));
-
-struct ssd_area {
-	struct {
-		/* word 0 */
-		__u16 command_code1;
-		__u16 command_code2;
-		/* word 1 */
-		__u16 reserved1;
-		__u16 f_sch;	 /* first subchannel */
-		/* word 2 */
-		__u16 reserved2;
-		__u16 l_sch;	/* last subchannel */
-		/* word 3 */
-		__u32 reserved3;
-	} __attribute__ ((packed,aligned(8))) request_block;
-	struct {
-		/* word 0 */
-		__u16 length;
-		__u16 response_code;
-		/* word 1 */
-		__u32 reserved1;
-		/* word 2 */
-		__u8 sch_valid : 1;
-		__u8 dev_valid : 1;
-		__u8 st	       : 3; /* subchannel type */
-		__u8 zeroes    : 3;
-		__u8  unit_addr;  /* unit address */
-		__u16 devno;	  /* device number */
-		/* word 3 */
-		__u8 path_mask;
-		__u8 fla_valid_mask;
-		__u16 sch;	  /* subchannel */
-		/* words 4-5 */
-		__u8 chpid[8];	  /* chpids 0-7 */
-		/* words 6-9 */
-		__u16 fla[8];	  /* full link addresses 0-7 */
-	} __attribute__ ((packed,aligned(8))) response_block;
-} __attribute__ ((packed,aligned(PAGE_SIZE)));
-
+struct chsc_header {
+	u16 length;
+	u16 code;
+};
 
 struct channel_path {
 	int id;
diff -Nru a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c
--- a/drivers/s390/cio/cio.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/s390/cio/cio.c	Sat Apr 19 19:51:51 2003
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/cio.c
  *   S/390 common I/O routines -- low level i/o calls
- *   $Revision: 1.91 $
+ *   $Revision: 1.97 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -176,13 +176,13 @@
 	CIO_TRACE_EVENT(0, dbf_text);
 	CIO_HEX_EVENT(0, &sch->schib, sizeof (struct schib));
 
-	return -ENODEV;
+	return (sch->lpm ? -EACCES : -ENODEV);
 }
 
 int
 cio_start (struct subchannel *sch,	/* subchannel structure */
 	   struct ccw1 * cpa,		/* logical channel prog addr */
-	   unsigned long intparm,	/* interruption parameter */
+	   unsigned int intparm,	/* interruption parameter */
 	   __u8 lpm)			/* logical path mask */
 {
 	char dbf_txt[15];
@@ -191,7 +191,7 @@
 	sprintf (dbf_txt, "stIO%x", sch->irq);
 	CIO_TRACE_EVENT (4, dbf_txt);
 
-	sch->orb.intparm = (__u32) (long) &sch->u_intparm;
+	sch->orb.intparm = intparm;
 	sch->orb.fmt = 1;
 
 	sch->orb.pfch = sch->options.prefetch == 0;
@@ -219,7 +219,6 @@
 		/*
 		 * initialize device status information
 		 */
-		sch->u_intparm = intparm;
 		sch->schib.scsw.actl |= SCSW_ACTL_START_PEND;
 		return 0;
 	case 1:		/* status pending */
@@ -265,13 +264,10 @@
 }
 
 /*
- * Note: The "intparm" parameter is not used by the halt_IO() function
- *	 itself, as no ORB is built for the HSCH instruction. However,
- *	 it allows the device interrupt handler to associate the upcoming
- *	 interrupt with the halt_IO() request.
+ * halt I/O operation
  */
 int
-cio_halt(struct subchannel *sch, unsigned long intparm)
+cio_halt(struct subchannel *sch)
 {
 	char dbf_txt[15];
 	int ccode;
@@ -297,7 +293,6 @@
 
 	switch (ccode) {
 	case 0:
-		sch->u_intparm = intparm;
 		sch->schib.scsw.actl |= SCSW_ACTL_HALT_PEND;
 		return 0;
 	case 1:		/* status pending */
@@ -309,13 +304,10 @@
 }
 
 /*
- * Note: The "intparm" parameter is not used by the clear_IO() function
- *	 itself, as no ORB is built for the CSCH instruction. However,
- *	 it allows the device interrupt handler to associate the upcoming
- *	 interrupt with the clear_IO() request.
+ * Clear I/O operation
  */
 int
-cio_clear(struct subchannel *sch, unsigned long intparm)
+cio_clear(struct subchannel *sch)
 {
 	char dbf_txt[15];
 	int ccode;
@@ -340,7 +332,6 @@
 
 	switch (ccode) {
 	case 0:
-		sch->u_intparm = intparm;
 		sch->schib.scsw.actl |= SCSW_ACTL_CLEAR_PEND;
 		return 0;
 	default:		/* device not operational */
@@ -374,6 +365,8 @@
 
 	switch (ccode) {
 	case 0:		/* success */
+		/* Update information in scsw. */
+		stsch (sch->irq, &sch->schib);
 		return 0;
 	case 1:		/* status pending */
 		return -EBUSY;
@@ -620,7 +613,7 @@
 		 */
 		if (tpi_info->adapter_IO == 1 &&
 		    tpi_info->int_type == IO_INTERRUPT_TYPE) {
-			do_adapter_IO (tpi_info->intparm);
+			do_adapter_IO();
 			continue;
 		}
 		sch = ioinfo[tpi_info->irq];
diff -Nru a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h
--- a/drivers/s390/cio/cio.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/cio/cio.h	Sat Apr 19 19:51:28 2003
@@ -98,8 +98,6 @@
 
 	__u8 vpm;		/* verified path mask */
 	__u8 lpm;		/* logical path mask */
-	// TODO: intparm for second start i/o
-	unsigned long u_intparm;	/* user interruption parameter */
 	struct schib schib;	/* subchannel information block */
 	struct orb orb;		/* operation request block */
 	struct ccw1 sense_ccw;	/* static ccw for sense command */
@@ -116,11 +114,10 @@
 extern int cio_enable_subchannel (struct subchannel *, unsigned int);
 extern int cio_disable_subchannel (struct subchannel *);
 extern int cio_cancel (struct subchannel *);
-extern int cio_clear (struct subchannel *, unsigned long);
-extern int cio_do_io (struct subchannel *, struct ccw1 *, unsigned long, __u8);
+extern int cio_clear (struct subchannel *);
 extern int cio_resume (struct subchannel *);
-extern int cio_halt (struct subchannel *, unsigned long);
-extern int cio_start (struct subchannel *, struct ccw1 *, unsigned long, __u8);
+extern int cio_halt (struct subchannel *);
+extern int cio_start (struct subchannel *, struct ccw1 *, unsigned int, __u8);
 extern int cio_cancel (struct subchannel *);
 extern int cio_set_options (struct subchannel *, int);
 extern int cio_get_options (struct subchannel *);
diff -Nru a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
--- a/drivers/s390/cio/css.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/cio/css.c	Sat Apr 19 19:51:28 2003
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/css.c
  *  driver for channel subsystem
- *   $Revision: 1.40 $
+ *   $Revision: 1.43 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *			 IBM Corporation
@@ -41,7 +41,7 @@
 		/* There already is a struct subchannel for this irq. */
 		return -EBUSY;
 
-	sch = kmalloc (sizeof (*sch), GFP_DMA);
+	sch = kmalloc (sizeof (*sch), GFP_KERNEL | GFP_DMA);
 	if (sch == NULL)
 		return -ENOMEM;
 	ret = cio_validate_subchannel (sch, irq);
@@ -161,7 +161,7 @@
 
 	sch = ioinfo[irq];
 	if (sch == NULL) {
-		schedule_work(&work);
+		queue_work(ccw_device_work, &work);
 		return;
 	}
 	if (!sch->dev.driver_data)
@@ -172,7 +172,7 @@
 	ccode = stsch(irq, &sch->schib);
 	if (!ccode)
 		if (devno != sch->schib.pmcw.dev)
-			schedule_work(&work);
+			queue_work(ccw_device_work, &work);
 }
 
 /*
diff -Nru a/drivers/s390/cio/css.h b/drivers/s390/cio/css.h
--- a/drivers/s390/cio/css.h	Sat Apr 19 19:51:51 2003
+++ b/drivers/s390/cio/css.h	Sat Apr 19 19:51:51 2003
@@ -79,6 +79,7 @@
 		unsigned int esid:1;        /* Ext. SenseID supported by HW */
 		unsigned int dosense:1;	    /* delayed SENSE required */
 	} __attribute__((packed)) flags;
+	unsigned long intparm;	/* user interruption parameter */
 	struct qdio_irq *qdio_data;
 	struct irb irb;		/* device status */
 	struct senseid senseid;	/* SenseID info */
diff -Nru a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c
--- a/drivers/s390/cio/device.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/cio/device.c	Sat Apr 19 19:51:49 2003
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/device.c
  *  bus driver for ccw devices
- *   $Revision: 1.50 $
+ *   $Revision: 1.53 $
  *
  *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH,
  *			 IBM Corporation
@@ -18,6 +18,7 @@
 #include <linux/slab.h>
 #include <linux/list.h>
 #include <linux/device.h>
+#include <linux/workqueue.h>
 
 #include <asm/ccwdev.h>
 #include <asm/cio.h>
@@ -126,14 +127,32 @@
 	.irq = io_subchannel_irq,
 };
 
+struct workqueue_struct *ccw_device_work;
+static wait_queue_head_t ccw_device_init_wq;
+static atomic_t ccw_device_init_count;
+
 static int __init
 init_ccw_bus_type (void)
 {
 	int ret;
+
+	init_waitqueue_head(&ccw_device_init_wq);
+	atomic_set(&ccw_device_init_count, 0);
+
+	ccw_device_work = create_workqueue("cio");
+	if (!ccw_device_work)
+		return -ENOMEM; /* FIXME: better errno ? */
+
 	if ((ret = bus_register (&ccw_bus_type)))
 		return ret;
 
-	return driver_register(&io_subchannel_driver.drv);
+	if ((ret = driver_register(&io_subchannel_driver.drv)))
+		return ret;
+
+	wait_event(ccw_device_init_wq,
+		   atomic_read(&ccw_device_init_count) == 0);
+	flush_workqueue(ccw_device_work);
+	return 0;
 }
 
 static void __exit
@@ -141,6 +160,7 @@
 {
 	driver_unregister(&io_subchannel_driver.drv);
 	bus_unregister(&ccw_bus_type);
+	destroy_workqueue(ccw_device_work);
 }
 
 subsys_initcall(init_ccw_bus_type);
@@ -360,7 +380,7 @@
 /*
  * Register recognized device.
  */
-void
+static void
 io_subchannel_register(void *data)
 {
 	struct ccw_device *cdev;
@@ -389,6 +409,42 @@
 	put_device(&sch->dev);
 }
 
+/*
+ * subchannel recognition done. Called from the state machine.
+ */
+void
+io_subchannel_recog_done(struct ccw_device *cdev)
+{
+	struct subchannel *sch;
+
+	if (css_init_done == 0)
+		return;
+	switch (cdev->private->state) {
+	case DEV_STATE_NOT_OPER:
+		/* Remove device found not operational. */
+		sch = to_subchannel(cdev->dev.parent);
+		sch->dev.driver_data = 0;
+		put_device(&sch->dev);
+		if (cdev->dev.release)
+			cdev->dev.release(&cdev->dev);
+		break;
+	case DEV_STATE_OFFLINE:
+		/* 
+		 * We can't register the device in interrupt context so
+		 * we schedule a work item.
+		 */
+		INIT_WORK(&cdev->private->kick_work,
+			  io_subchannel_register, (void *) cdev);
+		queue_work(ccw_device_work, &cdev->private->kick_work);
+		break;
+	case DEV_STATE_BOXED:
+		/* Device did not respond in time. */
+		break;
+	}
+	if (atomic_dec_and_test(&ccw_device_init_count))
+		wake_up(&ccw_device_init_wq);
+}
+
 static void
 io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch)
 {
@@ -419,6 +475,9 @@
 	/* Do first half of device_register. */
 	device_initialize(&cdev->dev);
 
+	/* Increase counter of devices currently in recognition. */
+	atomic_inc(&ccw_device_init_count);
+
 	/* Start async. device sensing. */
 	spin_lock_irq(cdev->ccwlock);
 	rc = ccw_device_recognition(cdev);
@@ -428,6 +487,8 @@
 		put_device(&sch->dev);
 		if (cdev->dev.release)
 			cdev->dev.release(&cdev->dev);
+		if (atomic_dec_and_test(&ccw_device_init_count))
+			wake_up(&ccw_device_init_wq);
 	}
 }
 
@@ -452,7 +513,8 @@
 	if (!cdev)
 		return -ENOMEM;
 	memset(cdev, 0, sizeof(struct ccw_device));
-	cdev->private = kmalloc(sizeof(struct ccw_device_private), GFP_DMA);
+	cdev->private = kmalloc(sizeof(struct ccw_device_private), 
+				GFP_KERNEL | GFP_DMA);
 	if (!cdev->private) {
 		kfree(cdev);
 		return -ENOMEM;
diff -Nru a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h
--- a/drivers/s390/cio/device.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/cio/device.h	Sat Apr 19 19:51:50 2003
@@ -14,13 +14,11 @@
 	DEV_STATE_W4SENSE,
 	DEV_STATE_DISBAND_PGID,
 	DEV_STATE_BOXED,
-	/* special states for qdio */
-	DEV_STATE_QDIO_INIT,
-	DEV_STATE_QDIO_ACTIVE,
-	DEV_STATE_QDIO_CLEANUP,
 	/* states to wait for i/o completion before doing something */
 	DEV_STATE_ONLINE_VERIFY,
 	DEV_STATE_W4SENSE_VERIFY,
+	DEV_STATE_CLEAR_VERIFY,
+	DEV_STATE_TIMEOUT_KILL,
 	/* last element! */
 	NR_DEV_STATES
 };
@@ -63,7 +61,9 @@
 		cdev->private->state == DEV_STATE_BOXED);
 }
 
-void io_subchannel_register(void *data);
+extern struct workqueue_struct *ccw_device_work;
+
+void io_subchannel_recog_done(struct ccw_device *cdev);
 
 int ccw_device_recognition(struct ccw_device *);
 int ccw_device_online(struct ccw_device *);
diff -Nru a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
--- a/drivers/s390/cio/device_fsm.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/s390/cio/device_fsm.c	Sat Apr 19 19:51:47 2003
@@ -81,14 +81,14 @@
 	if (!(sch->schib.scsw.actl & SCSW_ACTL_CLEAR_PEND)) {
 		/* Stage 2: halt io. */
 		while (cdev->private->iretry-- > 0)
-			if (cio_halt (sch, 0xC8C1D3E3) == 0)
+			if (cio_halt (sch) == 0)
 				return -EBUSY;
 		/* halt io unsuccessful. */
 		cdev->private->iretry = 255;	/* 255 clear retries. */
 	}
 	/* Stage 3: clear io. */
 	while (cdev->private->iretry-- > 0)
-		if (cio_clear (sch, 0x40C3D3D9) == 0)
+		if (cio_clear (sch) == 0)
 			return -EBUSY;
 	panic("Can't stop i/o on subchannel.\n");
 }
@@ -112,10 +112,6 @@
 		CIO_DEBUG(KERN_WARNING, 2,
 			  "SenseID : unknown device %04X on subchannel %04X\n",
 			  sch->schib.pmcw.dev, sch->irq);
-		sch->dev.driver_data = 0;
-		put_device(&sch->dev);
-		if (cdev->dev.release)
-			cdev->dev.release(&cdev->dev);
 		break;
 	case DEV_STATE_OFFLINE:
 		/* fill out sense information */
@@ -131,11 +127,6 @@
 			  "%04X/%02X\n", sch->schib.pmcw.dev,
 			  cdev->id.cu_type, cdev->id.cu_model,
 			  cdev->id.dev_type, cdev->id.dev_model);
-		if (css_init_done == 0)
-			break;
-		INIT_WORK(&cdev->private->kick_work,
-			  io_subchannel_register, (void *) cdev);
-		schedule_work(&cdev->private->kick_work);
 		break;
 	case DEV_STATE_BOXED:
 		CIO_DEBUG(KERN_WARNING, 2,
@@ -143,6 +134,7 @@
 			  sch->schib.pmcw.dev, sch->irq);
 		break;
 	}
+	io_subchannel_recog_done(cdev);
 	wake_up(&cdev->private->wait_q);
 }
 
@@ -219,9 +211,6 @@
 static void
 ccw_device_recog_timeout(struct ccw_device *cdev, enum dev_event dev_event)
 {
-	struct subchannel *sch;
-
-	sch = to_subchannel(cdev->dev.parent);
 	if (ccw_device_cancel_halt_clear(cdev) == 0)
 		ccw_device_recog_done(cdev, DEV_STATE_BOXED);
 	else
@@ -349,9 +338,6 @@
 static void
 ccw_device_onoff_timeout(struct ccw_device *cdev, enum dev_event dev_event)
 {
-	struct subchannel *sch;
-
-	sch = to_subchannel(cdev->dev.parent);
 	if (ccw_device_cancel_halt_clear(cdev) == 0)
 		ccw_device_done(cdev, DEV_STATE_BOXED);
 	else
@@ -393,8 +379,8 @@
 		// FIXME: not-oper indication to device driver ?
 		ccw_device_call_handler(cdev);
 	}
-	device_unregister(&cdev->dev);
 	wake_up(&cdev->private->wait_q);
+	device_unregister(&cdev->dev);
 }
 
 /*
@@ -438,14 +424,39 @@
 	/* Accumulate status and find out if a basic sense is needed. */
 	ccw_device_accumulate_irb(cdev, irb);
 	if (cdev->private->flags.dosense) {
-		if (ccw_device_do_sense(cdev, irb) == 0)
-			cdev->private->state = DEV_STATE_W4SENSE;
+		if (ccw_device_do_sense(cdev, irb) == 0) {
+			/* Check if we have to trigger path verification. */
+			if (irb->esw.esw0.erw.pvrf)
+				cdev->private->state = DEV_STATE_W4SENSE_VERIFY;
+			else
+				cdev->private->state = DEV_STATE_W4SENSE;
+		}
 		return;
 	}
+	if (irb->esw.esw0.erw.pvrf)
+		/* Try to start path verification. */
+		ccw_device_online_verify(cdev, 0);
 	/* No basic sense required, call the handler. */
 	ccw_device_call_handler(cdev);
 }
 
+/*
+ * Got an timeout in online state.
+ */
+static void
+ccw_device_online_timeout(struct ccw_device *cdev, enum dev_event dev_event)
+{
+	ccw_device_set_timeout(cdev, 0);
+	if (ccw_device_cancel_halt_clear(cdev) != 0) {
+		ccw_device_set_timeout(cdev, 3*HZ);
+		cdev->private->state = DEV_STATE_TIMEOUT_KILL;
+		return;
+	}
+	if (cdev->handler)
+		cdev->handler(cdev, cdev->private->intparm,
+			      ERR_PTR(-ETIMEDOUT));
+}
+
 static void
 ccw_device_irq_verify(struct ccw_device *cdev, enum dev_event dev_event)
 {
@@ -491,11 +502,17 @@
 	/* Add basic sense info to irb. */
 	ccw_device_accumulate_basic_sense(cdev, irb);
 	if (cdev->private->flags.dosense) {
+		/* Check if we have to trigger path verification. */
+		if (irb->esw.esw0.erw.pvrf)
+			cdev->private->state = DEV_STATE_W4SENSE_VERIFY;
 		/* Another basic sense is needed. */
 		ccw_device_do_sense(cdev, irb);
 		return;
 	}
 	cdev->private->state = DEV_STATE_ONLINE;
+	if (irb->esw.esw0.erw.pvrf)
+		/* Try to start path verification. */
+		ccw_device_online_verify(cdev, 0);
 	/* Call the handler. */
 	ccw_device_call_handler(cdev);
 }
@@ -527,103 +544,68 @@
 	ccw_device_call_handler(cdev);
 }
 
-/*
- * No operation action. This is used e.g. to ignore a timeout event in
- * state offline.
- */
 static void
-ccw_device_nop(struct ccw_device *cdev, enum dev_event dev_event)
-{
-}
-
-/*
- * Bug operation action. 
- */
-static void
-ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event)
-{
-	printk(KERN_EMERG "dev_jumptable[%i][%i] == NULL\n",
-	       cdev->private->state, dev_event);
-	BUG();
-}
-
-/*
- * We've got an interrupt on establish queues. Check for errors and
- * accordingly retry or move on.
- */
-static void
-ccw_device_qdio_init_irq(struct ccw_device *cdev, enum dev_event dev_event)
+ccw_device_clear_verify(struct ccw_device *cdev, enum dev_event dev_event)
 {
 	struct irb *irb;
-	struct subchannel *sch;
 
 	irb = (struct irb *) __LC_IRB;
 	/* Check for unsolicited interrupt. */
 	if (irb->scsw.stctl ==
 	    		(SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) {
-		if (cdev->private->qdio_data && 
-		    cdev->private->qdio_data->establish_irq)
-			cdev->private->qdio_data->establish_irq(cdev, 0, irb);
-		wake_up(&cdev->private->wait_q);
+		if (cdev->handler)
+			cdev->handler (cdev, 0, irb);
 		return;
 	}
+	/* Accumulate status. We don't do basic sense. */
 	ccw_device_accumulate_irb(cdev, irb);
-	//FIXME: Basic sense?
-	sch = to_subchannel(cdev->dev.parent);
-	if (cdev->private->qdio_data && cdev->private->qdio_data->establish_irq)
-		cdev->private->qdio_data->establish_irq(cdev, sch->u_intparm,
-							&cdev->private->irb);
-	wake_up(&cdev->private->wait_q);
+	/* Try to start delayed device verification. */
+	ccw_device_online_verify(cdev, 0);
+	/* Note: Don't call handler for cio initiated clear! */
 }
 
-/*
- * Run into a timeout after establish queues, retry if needed.
- */
 static void
-ccw_device_qdio_init_timeout(struct ccw_device *cdev, enum dev_event dev_event)
+ccw_device_killing_irq(struct ccw_device *cdev, enum dev_event dev_event)
 {
-	ccw_device_set_timeout(cdev, 0);
-	if (cdev->private->qdio_data &&
-	    cdev->private->qdio_data->establish_timeout)
-		cdev->private->qdio_data->establish_timeout(cdev);
-	wake_up(&cdev->private->wait_q);
+	/* OK, i/o is dead now. Call interrupt handler. */
+	cdev->private->state = DEV_STATE_ONLINE;
+	if (cdev->handler)
+		cdev->handler(cdev, cdev->private->intparm,
+			      ERR_PTR(-ETIMEDOUT));
 }
 
 static void
-ccw_device_qdio_cleanup_irq(struct ccw_device *cdev,
-			    enum dev_event dev_event)
+ccw_device_killing_timeout(struct ccw_device *cdev, enum dev_event dev_event)
 {
-	struct irb *irb;
-	struct subchannel *sch;
-
-	irb = (struct irb *) __LC_IRB;
-	/* Check for unsolicited interrupt. */
-	if (irb->scsw.stctl ==
-	    		(SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)) {
-		if (cdev->private->qdio_data && 
-		    cdev->private->qdio_data->cleanup_irq)
-			cdev->private->qdio_data->cleanup_irq(cdev, 0, irb);
-		wake_up(&cdev->private->wait_q);
+	if (ccw_device_cancel_halt_clear(cdev) != 0) {
+		ccw_device_set_timeout(cdev, 3*HZ);
 		return;
 	}
-	ccw_device_accumulate_irb(cdev, irb);
-	//FIXME: Basic sense?
-	sch = to_subchannel(cdev->dev.parent);
-	if (cdev->private->qdio_data && cdev->private->qdio_data->cleanup_irq)
-		cdev->private->qdio_data->cleanup_irq(cdev, sch->u_intparm,
-						      &cdev->private->irb);
-	wake_up(&cdev->private->wait_q);
+	//FIXME: Can we get here?
+	cdev->private->state = DEV_STATE_ONLINE;
+	if (cdev->handler)
+		cdev->handler(cdev, cdev->private->intparm,
+			      ERR_PTR(-ETIMEDOUT));
 }
 
+/*
+ * No operation action. This is used e.g. to ignore a timeout event in
+ * state offline.
+ */
 static void
-ccw_device_qdio_cleanup_timeout(struct ccw_device *cdev,
-				enum dev_event dev_event)
+ccw_device_nop(struct ccw_device *cdev, enum dev_event dev_event)
 {
-	ccw_device_set_timeout(cdev, 0);
-	if (cdev->private->qdio_data &&
-	    cdev->private->qdio_data->cleanup_timeout)
-		cdev->private->qdio_data->cleanup_timeout(cdev);
-	wake_up(&cdev->private->wait_q);
+}
+
+/*
+ * Bug operation action. 
+ */
+static void
+ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event)
+{
+	printk(KERN_EMERG "dev_jumptable[%i][%i] == NULL\n",
+	       cdev->private->state, dev_event);
+	BUG();
 }
 
 /*
@@ -663,7 +645,7 @@
 	[DEV_STATE_ONLINE] {
 		[DEV_EVENT_NOTOPER]	ccw_device_online_notoper,
 		[DEV_EVENT_INTERRUPT]	ccw_device_irq,
-		[DEV_EVENT_TIMEOUT]	ccw_device_nop,
+		[DEV_EVENT_TIMEOUT]	ccw_device_online_timeout,
 		[DEV_EVENT_VERIFY]	ccw_device_online_verify,
 	},
 	[DEV_STATE_W4SENSE] {
@@ -684,25 +666,6 @@
 		[DEV_EVENT_TIMEOUT]	ccw_device_nop,
 		[DEV_EVENT_VERIFY]	ccw_device_nop,
 	},
-	/* special states for qdio */
-	[DEV_STATE_QDIO_INIT] {
-		[DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-		[DEV_EVENT_INTERRUPT]   ccw_device_qdio_init_irq,
-		[DEV_EVENT_TIMEOUT]     ccw_device_qdio_init_timeout,
-		[DEV_EVENT_VERIFY]      ccw_device_nop,
-	},
-	[DEV_STATE_QDIO_ACTIVE] {
-		[DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-		[DEV_EVENT_INTERRUPT]   ccw_device_irq,
-		[DEV_EVENT_TIMEOUT]     ccw_device_nop,
-		[DEV_EVENT_VERIFY]      ccw_device_nop,
-	},
-	[DEV_STATE_QDIO_CLEANUP] {
-		[DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
-		[DEV_EVENT_INTERRUPT]   ccw_device_qdio_cleanup_irq,
-		[DEV_EVENT_TIMEOUT]     ccw_device_qdio_cleanup_timeout,
-		[DEV_EVENT_VERIFY]      ccw_device_nop,
-	},
 	/* states to wait for i/o completion before doing something */
 	[DEV_STATE_ONLINE_VERIFY] {
 		[DEV_EVENT_NOTOPER]	ccw_device_online_notoper,
@@ -716,6 +679,18 @@
 		[DEV_EVENT_TIMEOUT]	ccw_device_nop,
 		[DEV_EVENT_VERIFY]	ccw_device_nop,
 	},
+	[DEV_STATE_CLEAR_VERIFY] {
+		[DEV_EVENT_NOTOPER]     ccw_device_online_notoper,
+		[DEV_EVENT_INTERRUPT]   ccw_device_clear_verify,
+		[DEV_EVENT_TIMEOUT]	ccw_device_nop,
+		[DEV_EVENT_VERIFY]	ccw_device_nop,
+	},
+	[DEV_STATE_TIMEOUT_KILL] {
+		[DEV_EVENT_NOTOPER]	ccw_device_online_notoper,
+		[DEV_EVENT_INTERRUPT]	ccw_device_killing_irq,
+		[DEV_EVENT_TIMEOUT]	ccw_device_killing_timeout,
+		[DEV_EVENT_VERIFY]	ccw_device_nop, //FIXME
+	},
 };
 
 /*
@@ -736,3 +711,4 @@
 	dev_fsm_event(cdev, DEV_EVENT_INTERRUPT);
 }
 
+EXPORT_SYMBOL_GPL(ccw_device_set_timeout);
diff -Nru a/drivers/s390/cio/device_id.c b/drivers/s390/cio/device_id.c
--- a/drivers/s390/cio/device_id.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/s390/cio/device_id.c	Sat Apr 19 19:51:27 2003
@@ -16,6 +16,7 @@
 #include <asm/ccwdev.h>
 #include <asm/delay.h>
 #include <asm/cio.h>
+#include <asm/lowcore.h>
 
 #include "cio.h"
 #include "cio_debug.h"
@@ -198,11 +199,13 @@
 			/* 0x00E2C9C4 == ebcdic "SID" */
 			ret = cio_start (sch, cdev->private->iccws,
 					 0x00E2C9C4, cdev->private->imask);
-			/* ret is 0, -EBUSY or -ENODEV */
-			if (ret != -EBUSY)
+			/* ret is 0, -EBUSY, -EACCES or -ENODEV */
+			if (ret == -EBUSY) {
+				udelay(100);
+				continue;
+			}
+			if (ret != -EACCES)
 				return ret;
-			udelay(100);
-			continue;
 		}
 		cdev->private->imask >>= 1;
 		cdev->private->iretry = 5;
diff -Nru a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c
--- a/drivers/s390/cio/device_ops.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/cio/device_ops.c	Sat Apr 19 19:51:49 2003
@@ -49,12 +49,15 @@
 		return -ENODEV;
 	if (cdev->private->state != DEV_STATE_ONLINE &&
 	    cdev->private->state != DEV_STATE_W4SENSE &&
-	    cdev->private->state != DEV_STATE_QDIO_ACTIVE)
+	    cdev->private->state != DEV_STATE_ONLINE_VERIFY &&
+	    cdev->private->state != DEV_STATE_W4SENSE_VERIFY)
 		return -EINVAL;
 	sch = to_subchannel(cdev->dev.parent);
 	if (!sch)
 		return -ENODEV;
-	ret = cio_clear(sch, intparm);
+	ret = cio_clear(sch);
+	if (ret == 0)
+		cdev->private->intparm = intparm;
 	return ret;
 }
 
@@ -67,17 +70,35 @@
 
 	if (!cdev)
 		return -ENODEV;
-	if (cdev->private->state != DEV_STATE_ONLINE &&
-	    cdev->private->state != DEV_STATE_W4SENSE &&
-	    cdev->private->state != DEV_STATE_QDIO_INIT)
-		return -EINVAL;
 	sch = to_subchannel(cdev->dev.parent);
 	if (!sch)
 		return -ENODEV;
+	if (cdev->private->state != DEV_STATE_ONLINE ||
+	    sch->schib.scsw.actl != 0)
+		return -EBUSY;
 	ret = cio_set_options (sch, flags);
 	if (ret)
 		return ret;
-	ret = cio_start (sch, cpa, intparm, lpm);
+	/* 0xe4e2c5d9 == ebcdic "USER" */
+	ret = cio_start (sch, cpa, 0xe4e2c5d9, lpm);
+	if (ret == 0)
+		cdev->private->intparm = intparm;
+	return ret;
+}
+
+int
+ccw_device_start_timeout(struct ccw_device *cdev, struct ccw1 *cpa,
+			 unsigned long intparm, __u8 lpm, unsigned long flags,
+			 int expires)
+{
+	int ret;
+
+	if (!cdev)
+		return -ENODEV;
+	ccw_device_set_timeout(cdev, expires);
+	ret = ccw_device_start(cdev, cpa, intparm, lpm, flags);
+	if (ret != 0)
+		ccw_device_set_timeout(cdev, 0);
 	return ret;
 }
 
@@ -90,12 +111,16 @@
 	if (!cdev)
 		return -ENODEV;
 	if (cdev->private->state != DEV_STATE_ONLINE &&
-	    cdev->private->state != DEV_STATE_W4SENSE)
+	    cdev->private->state != DEV_STATE_W4SENSE &&
+	    cdev->private->state != DEV_STATE_ONLINE_VERIFY &&
+	    cdev->private->state != DEV_STATE_W4SENSE_VERIFY)
 		return -EINVAL;
 	sch = to_subchannel(cdev->dev.parent);
 	if (!sch)
 		return -ENODEV;
-	ret = cio_halt(sch, intparm);
+	ret = cio_halt(sch);
+	if (ret == 0)
+		cdev->private->intparm = intparm;
 	return ret;
 }
 
@@ -106,12 +131,12 @@
 
 	if (!cdev)
 		return -ENODEV;
-	if (cdev->private->state != DEV_STATE_ONLINE &&
-	    cdev->private->state != DEV_STATE_W4SENSE)
-		return -EINVAL;
 	sch = to_subchannel(cdev->dev.parent);
 	if (!sch)
 		return -ENODEV;
+	if (cdev->private->state != DEV_STATE_ONLINE ||
+	    !(sch->schib.scsw.actl & SCSW_ACTL_SUSPENDED))
+		return -EINVAL;
 	return cio_resume(sch);
 }
 
@@ -123,15 +148,6 @@
 {
 	struct subchannel *sch;
 	unsigned int stctl;
-	void (*handler)(struct ccw_device *, unsigned long, struct irb *);
-
-	if (cdev->private->state == DEV_STATE_QDIO_ACTIVE) {
-		if (cdev->private->qdio_data)
-			handler = cdev->private->qdio_data->handler;
-		else
-			handler = NULL;
-	} else
-		handler = cdev->handler;
 
 	sch = to_subchannel(cdev->dev.parent);
 
@@ -154,8 +170,9 @@
 	/*
 	 * Now we are ready to call the device driver interrupt handler.
 	 */
-	if (handler)
-		handler(cdev, sch->u_intparm, &cdev->private->irb);
+	if (cdev->handler)
+		cdev->handler(cdev, cdev->private->intparm,
+			      &cdev->private->irb);
 
 	/*
 	 * Clear the old and now useless interrupt response block.
@@ -192,6 +209,11 @@
 static void
 ccw_device_wake_up(struct ccw_device *cdev, unsigned long ip, struct irb *irb)
 {
+	struct subchannel *sch;
+
+	sch = to_subchannel(cdev->dev.parent);
+	if (!IS_ERR(irb))
+		memcpy(&sch->schib.scsw, &irb->scsw, sizeof(struct scsw));
 	wake_up(&cdev->private->wait_q);
 }
 
@@ -218,8 +240,7 @@
 
 	if (!cdev)
 		return -ENODEV;
-	if (cdev->private->state != DEV_STATE_ONLINE &&
-	    cdev->private->state != DEV_STATE_W4SENSE)
+	if (cdev->private->state != DEV_STATE_ONLINE)
 		return -EINVAL;
 	if (!buffer || !length)
 		return -EINVAL;
@@ -251,7 +272,13 @@
 			wait_event(cdev->private->wait_q,
 				   sch->schib.scsw.actl == 0);
 			spin_lock_irqsave(&sch->lock, flags);
-			/* FIXME: Check if we got sensible stuff. */
+			/* Check at least for channel end / device end */
+			if ((sch->schib.scsw.dstat !=
+			     (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) ||
+			    (sch->schib.scsw.cstat != 0)) {
+				ret = -EIO;
+				continue;
+			}
 			break;
 		}
 	}
@@ -281,8 +308,7 @@
 
 	if (!cdev)
 		return -ENODEV;
-	if (cdev->private->state != DEV_STATE_ONLINE &&
-	    cdev->private->state != DEV_STATE_W4SENSE)
+	if (cdev->private->state != DEV_STATE_ONLINE)
 		return -EINVAL;
 	if (cdev->private->flags.esid == 0)
 		return -EOPNOTSUPP;
@@ -300,7 +326,7 @@
 	if (!ciw || ciw->cmd == 0)
 		return -EOPNOTSUPP;
 
-	rcd_buf = kmalloc(ciw->count, GFP_DMA);
+	rcd_buf = kmalloc(ciw->count, GFP_KERNEL | GFP_DMA);
  	if (!rcd_buf)
 		return -ENOMEM;
  	memset (rcd_buf, 0, ciw->count);
@@ -325,7 +351,13 @@
 		spin_unlock_irqrestore(&sch->lock, flags);
 		wait_event(cdev->private->wait_q, sch->schib.scsw.actl == 0);
 		spin_lock_irqsave(&sch->lock, flags);
-		/* FIXME: Check if we got sensible stuff. */
+		/* Check at least for channel end / device end */
+		if ((sch->schib.scsw.dstat != 
+		     (DEV_STAT_CHN_END|DEV_STAT_DEV_END)) ||
+		    (sch->schib.scsw.cstat != 0)) {
+			ret = -EIO;
+			continue;
+		}
 		break;
 	}
 	/* Restore interrupt handler. */
@@ -363,13 +395,15 @@
 
 
 MODULE_LICENSE("GPL");
+EXPORT_SYMBOL(ccw_device_set_options);
 EXPORT_SYMBOL(ccw_device_clear);
 EXPORT_SYMBOL(ccw_device_halt);
 EXPORT_SYMBOL(ccw_device_resume);
+EXPORT_SYMBOL(ccw_device_start_timeout);
 EXPORT_SYMBOL(ccw_device_start);
 EXPORT_SYMBOL(ccw_device_get_ciw);
 EXPORT_SYMBOL(ccw_device_get_path_mask);
-EXPORT_SYMBOL (read_conf_data);
-EXPORT_SYMBOL (read_dev_chars);
+EXPORT_SYMBOL(read_conf_data);
+EXPORT_SYMBOL(read_dev_chars);
 EXPORT_SYMBOL(_ccw_device_get_subchannel_number);
 EXPORT_SYMBOL(_ccw_device_get_device_number);
diff -Nru a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c
--- a/drivers/s390/cio/device_pgid.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/s390/cio/device_pgid.c	Sat Apr 19 19:51:48 2003
@@ -16,6 +16,7 @@
 #include <asm/ccwdev.h>
 #include <asm/cio.h>
 #include <asm/delay.h>
+#include <asm/lowcore.h>
 
 #include "cio.h"
 #include "cio_debug.h"
@@ -51,14 +52,23 @@
 			/* 0xe2d5c9c4 == ebcdic "SNID" */
 			ret = cio_start (sch, cdev->private->iccws, 
 					 0xE2D5C9C4, cdev->private->imask);
-			/* ret is 0, -EBUSY or -ENODEV */
-			if (ret != -EBUSY)
+			/* ret is 0, -EBUSY, -EACCES or -ENODEV */
+			if (ret == -EBUSY) {
+				CIO_MSG_EVENT(2, 
+					      "SNID - device %04X, start_io() "
+					      "reports rc : %d, retrying ...\n",
+					      sch->schib.pmcw.dev, ret);
+				udelay(100);
+				continue;
+			}
+			if (ret != -EACCES)
 				return ret;
-			CIO_MSG_EVENT(2, "SNID - device %04X, start_io() "
-				      "reports rc : %d, retrying ...\n",
-				      sch->schib.pmcw.dev, ret);
-			udelay(100);
-			continue;
+			CIO_MSG_EVENT(2, "SNID - Device %04X on Subchannel "
+				      "%04X, lpm %02X, became 'not "
+				      "operational'\n",
+				      sch->schib.pmcw.dev, sch->irq,
+				      cdev->private->imask);
+
 		}
 		cdev->private->imask >>= 1;
 		cdev->private->iretry = 5;
@@ -231,7 +241,9 @@
 		/* 0xE2D7C9C4 == ebcdic "SPID" */
 		ret = cio_start (sch, cdev->private->iccws,
 				 0xE2D7C9C4, cdev->private->imask);
-		/* ret is 0, -EBUSY or -ENODEV */
+		/* ret is 0, -EBUSY, -EACCES or -ENODEV */
+		if (ret == -EACCES)
+			break;
 		if (ret != -EBUSY)
 			return ret;
 		udelay(100);
diff -Nru a/drivers/s390/cio/device_status.c b/drivers/s390/cio/device_status.c
--- a/drivers/s390/cio/device_status.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/s390/cio/device_status.c	Sat Apr 19 19:51:47 2003
@@ -167,7 +167,7 @@
 
 	/* Copy authorization bit. */
 	cdev_irb->esw.esw0.erw.auth = irb->esw.esw0.erw.auth;
-	/* Copy path verification required flag. FIXME: how to verify ?? */
+	/* Copy path verification required flag. */
 	cdev_irb->esw.esw0.erw.pvrf = irb->esw.esw0.erw.pvrf;
 	/* Copy concurrent sense bit. */
 	cdev_irb->esw.esw0.erw.cons = irb->esw.esw0.erw.cons;
@@ -309,7 +309,7 @@
 	sch->sense_ccw.flags = CCW_FLAG_SLI;
 
 	/* 0xe2C5D5E2 == "SENS" in ebcdic */
-	return cio_start (sch, &sch->sense_ccw, 0xE2C5D5E2, 0);
+	return cio_start (sch, &sch->sense_ccw, 0xE2C5D5E2, 0xff);
 }
 
 /*
diff -Nru a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c
--- a/drivers/s390/cio/qdio.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/cio/qdio.c	Sat Apr 19 19:51:49 2003
@@ -34,7 +34,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-#include <linux/version.h>
 #include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/proc_fs.h>
@@ -54,8 +53,9 @@
 #include "airq.h"
 #include "qdio.h"
 #include "ioasm.h"
+#include "chsc.h"
 
-#define VERSION_QDIO_C "$Revision: 1.34 $"
+#define VERSION_QDIO_C "$Revision: 1.48 $"
 
 /****************** MODULE PARAMETER VARIABLES ********************/
 MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
@@ -87,7 +87,6 @@
 static debug_info_t *qdio_dbf_slsb_in;
 #endif /* QDIO_DBF_LIKE_HELL */
 
-static struct qdio_chsc_area *chsc_area;
 /* iQDIO stuff: */
 static volatile struct qdio_q *iq_list=NULL; /* volatile as it could change
 						  during a while loop */
@@ -611,16 +610,13 @@
 iqdio_is_inbound_q_done(struct qdio_q *q)
 {
 	int no_used;
-#ifdef QDIO_DBF_LIKE_HELL
 	char dbf_text[15];
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	no_used=atomic_read(&q->number_of_buffers_used);
 
 	/* propagate the change from 82 to 80 through VM */
 	SYNC_MEMORY;
 
-#ifdef QDIO_DBF_LIKE_HELL
 	if (no_used) {
 		sprintf(dbf_text,"iqisnt%02x",no_used);
 		QDIO_DBF_TEXT4(0,trace,dbf_text);
@@ -628,7 +624,6 @@
 		QDIO_DBF_TEXT4(0,trace,"iniqisdo");
 	}
 	QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	if (!no_used)
 		return 1;
@@ -664,9 +659,7 @@
 qdio_is_inbound_q_done(struct qdio_q *q)
 {
 	int no_used;
-#ifdef QDIO_DBF_LIKE_HELL
 	char dbf_text[15];
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	no_used=atomic_read(&q->number_of_buffers_used);
 
@@ -677,11 +670,9 @@
 	SYNC_MEMORY;
 
 	if (!no_used) {
-#ifdef QDIO_DBF_LIKE_HELL
 		QDIO_DBF_TEXT4(0,trace,"inqisdnA");
 		QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
 		QDIO_DBF_TEXT4(0,trace,dbf_text);
-#endif /* QDIO_DBF_LIKE_HELL */
 		return 1;
 	}
 
@@ -703,20 +694,16 @@
 	 * has (probably) not moved (see qdio_inbound_processing) 
 	 */
 	if (NOW>GET_SAVED_TIMESTAMP(q)+q->timing.threshold) {
-#ifdef QDIO_DBF_LIKE_HELL
 		QDIO_DBF_TEXT4(0,trace,"inqisdon");
 		QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
 		sprintf(dbf_text,"pf%02xcn%02x",q->first_to_check,no_used);
 		QDIO_DBF_TEXT4(0,trace,dbf_text);
-#endif /* QDIO_DBF_LIKE_HELL */
 		return 1;
 	} else {
-#ifdef QDIO_DBF_LIKE_HELL
 		QDIO_DBF_TEXT4(0,trace,"inqisntd");
 		QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
 		sprintf(dbf_text,"pf%02xcn%02x",q->first_to_check,no_used);
 		QDIO_DBF_TEXT4(0,trace,dbf_text);
-#endif /* QDIO_DBF_LIKE_HELL */
 		return 0;
 	}
 }
@@ -725,12 +712,10 @@
 qdio_kick_inbound_handler(struct qdio_q *q)
 {
 	int count, start, end, real_end, i;
-#ifdef QDIO_DBF_LIKE_HELL
 	char dbf_text[15];
 
 	QDIO_DBF_TEXT4(0,trace,"kickinh");
 	QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
-#endif /* QDIO_DBF_LIKE_HELL */
 
   	start=q->first_element_to_kick;
  	real_end=q->first_to_check;
@@ -744,10 +729,8 @@
  		i=(i+1)&(QDIO_MAX_BUFFERS_PER_Q-1);
  	}
 
-#ifdef QDIO_DBF_LIKE_HELL
 	sprintf(dbf_text,"s=%2xc=%2x",start,count);
 	QDIO_DBF_TEXT4(0,trace,dbf_text);
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	if (q->state==QDIO_IRQ_STATE_ACTIVE)
 		q->handler(q->cdev,
@@ -950,13 +933,10 @@
 qdio_is_outbound_q_done(struct qdio_q *q)
 {
 	int no_used;
-#ifdef QDIO_DBF_LIKE_HELL
 	char dbf_text[15];
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	no_used=atomic_read(&q->number_of_buffers_used);
 
-#ifdef QDIO_DBF_LIKE_HELL
 	if (no_used) {
 		sprintf(dbf_text,"oqisnt%02x",no_used);
 		QDIO_DBF_TEXT4(0,trace,dbf_text);
@@ -964,7 +944,6 @@
 		QDIO_DBF_TEXT4(0,trace,"oqisdone");
 	}
 	QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
-#endif /* QDIO_DBF_LIKE_HELL */
 	return (no_used==0);
 }
 
@@ -1015,10 +994,7 @@
 qdio_kick_outbound_handler(struct qdio_q *q)
 {
 	int start, end, real_end, count;
-	
-#ifdef QDIO_DBF_LIKE_HELL
 	char dbf_text[15];
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	start = q->first_element_to_kick;
 	/* last_move_ftc was just updated */
@@ -1031,10 +1007,8 @@
 	QDIO_DBF_TEXT4(0,trace,"kickouth");
 	QDIO_DBF_HEX4(0,trace,&q,sizeof(void*));
 
-#ifdef QDIO_DBF_LIKE_HELL
 	sprintf(dbf_text,"s=%2xc=%2x",start,count);
 	QDIO_DBF_TEXT4(0,trace,dbf_text);
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	if (q->state==QDIO_IRQ_STATE_ACTIVE)
 		q->handler(q->cdev,QDIO_STATUS_OUTBOUND_INT|
@@ -1239,8 +1213,6 @@
 	if (irq_ptr->qdr)
 		kfree(irq_ptr->qdr);
 	kfree(irq_ptr);
-	QDIO_DBF_TEXT3(0,setup,"MOD_DEC_");
-	MOD_DEC_USE_COUNT;
 }
 
 static void
@@ -1482,7 +1454,7 @@
 }
 
 static int
-iqdio_thinint_handler(__u32 intparm)
+iqdio_thinint_handler(void)
 {
 	QDIO_DBF_TEXT4(0,trace,"thin_int");
 
@@ -1500,7 +1472,7 @@
 }
 
 static void
-qdio_set_state(struct qdio_irq *irq_ptr,int state)
+qdio_set_state(struct qdio_irq *irq_ptr, enum qdio_irq_states state)
 {
 	int i;
 	char dbf_text[15];
@@ -1570,23 +1542,90 @@
 	}
 }
 
+static void qdio_establish_handle_irq(struct ccw_device*, int, int);
+
+static inline void
+qdio_handle_activate_check(struct ccw_device *cdev, unsigned long intparm,
+			   int cstat, int dstat)
+{
+	struct qdio_irq *irq_ptr;
+	struct qdio_q *q;
+	char dbf_text[15];
+
+	irq_ptr = cdev->private->qdio_data;
+
+	QDIO_DBF_TEXT2(1, trace, "ick2");
+	sprintf(dbf_text,"%s", cdev->dev.bus_id);
+	QDIO_DBF_TEXT2(1,trace,dbf_text);
+	QDIO_DBF_HEX2(0,trace,&intparm,sizeof(int));
+	QDIO_DBF_HEX2(0,trace,&dstat,sizeof(int));
+	QDIO_DBF_HEX2(0,trace,&cstat,sizeof(int));
+	QDIO_PRINT_ERR("received check condition on activate " \
+		       "queues on device %s (cs=x%x, ds=x%x).\n",
+		       cdev->dev.bus_id, cstat, dstat);
+	if (irq_ptr->no_input_qs) {
+		q=irq_ptr->input_qs[0];
+	} else if (irq_ptr->no_output_qs) {
+		q=irq_ptr->output_qs[0];
+	} else {
+		QDIO_PRINT_ERR("oops... no queue registered for device %s!?\n",
+			       cdev->dev.bus_id);
+		goto omit_handler_call;
+	}
+	q->handler(q->cdev,QDIO_STATUS_ACTIVATE_CHECK_CONDITION|
+		   QDIO_STATUS_LOOK_FOR_ERROR,
+		   0,0,0,-1,-1,q->int_parm);
+omit_handler_call:
+	qdio_set_state(irq_ptr,QDIO_IRQ_STATE_STOPPED);
+
+}
+
+static void
+qdio_timeout_handler(struct ccw_device *cdev)
+{
+	struct qdio_irq *irq_ptr;
+	char dbf_text[15];
+
+	QDIO_DBF_TEXT2(0, trace, "qtoh");
+	sprintf(dbf_text, "%s", cdev->dev.bus_id);
+	QDIO_DBF_TEXT2(0, trace, dbf_text);
+
+	irq_ptr = cdev->private->qdio_data;
+	sprintf(dbf_text, "state:%d", irq_ptr->state);
+	QDIO_DBF_TEXT2(0, trace, dbf_text);
+
+	switch (irq_ptr->state) {
+	case QDIO_IRQ_STATE_INACTIVE:
+		QDIO_PRINT_ERR("establish queues on irq %04x: timed out\n",
+			       irq_ptr->irq);
+		QDIO_DBF_TEXT2(1,setup,"eq:timeo");
+		qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR);
+		break;
+	case QDIO_IRQ_STATE_CLEANUP:
+		QDIO_PRINT_INFO("Did not get interrupt on cleanup, irq=0x%x.\n",
+				irq_ptr->irq);
+		qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR);
+		break;
+	default:
+		BUG();
+	}
+	wake_up(&cdev->private->wait_q);
+
+}
+
 static void
 qdio_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
 {
 	struct qdio_irq *irq_ptr;
-	struct qdio_q *q;
 	int cstat,dstat;
 	char dbf_text[15];
 
-        cstat = irb->scsw.cstat;
-        dstat = irb->scsw.dstat;
-
 	QDIO_DBF_TEXT4(0, trace, "qint");
 	sprintf(dbf_text, "%s", cdev->dev.bus_id);
 	QDIO_DBF_TEXT4(0, trace, dbf_text);
 	
-	if (!intparm || !cdev) {
-		QDIO_PRINT_STUPID("got unsolicited interrupt in qdio " \
+	if (!intparm) {
+		QDIO_PRINT_ERR("got unsolicited interrupt in qdio " \
 				  "handler, device %s\n", cdev->dev.bus_id);
 		return;
 	}
@@ -1601,39 +1640,58 @@
 		return;
 	}
 
+	if (IS_ERR(irb)) {
+		/* Currently running i/o is in error. */
+		switch (PTR_ERR(irb)) {
+		case -EIO:
+			QDIO_PRINT_ERR("i/o error on device %s\n",
+				       cdev->dev.bus_id);
+			//FIXME: hm?
+			return;
+		case -ETIMEDOUT:
+			qdio_timeout_handler(cdev);
+			return;
+		default:
+			QDIO_PRINT_ERR("unknown error state %ld on device %s\n",
+				       PTR_ERR(irb), cdev->dev.bus_id);
+			return;
+		}
+	}
+
 	qdio_irq_check_sense(irq_ptr->irq, irb);
 
-	if (cstat & SCHN_STAT_PCI) {
-		qdio_handle_pci(irq_ptr);
-		return;
-	}
+	sprintf(dbf_text, "state:%d", irq_ptr->state);
+	QDIO_DBF_TEXT4(0, trace, dbf_text);
 
-	if ((cstat&~SCHN_STAT_PCI)||dstat) {
-		QDIO_DBF_TEXT2(1, trace, "ick2");
-		sprintf(dbf_text,"%s", cdev->dev.bus_id);
-		QDIO_DBF_TEXT2(1,trace,dbf_text);
-		QDIO_DBF_HEX2(0,trace,&intparm,sizeof(int));
-		QDIO_DBF_HEX2(0,trace,&dstat,sizeof(int));
-		QDIO_DBF_HEX2(0,trace,&cstat,sizeof(int));
-		QDIO_PRINT_ERR("received check condition on activate " \
-			       "queues on device %s (cs=x%x, ds=x%x).\n",
-			       cdev->dev.bus_id, cstat, dstat);
-		if (irq_ptr->no_input_qs) {
-			q=irq_ptr->input_qs[0];
-		} else if (irq_ptr->no_output_qs) {
-			q=irq_ptr->output_qs[0];
-		} else {
-			QDIO_PRINT_ERR("oops... no queue registered for " \
-				       "device %s!?\n", cdev->dev.bus_id);
-			goto omit_handler_call;
-		}
-		q->handler(q->cdev,QDIO_STATUS_ACTIVATE_CHECK_CONDITION|
-			   QDIO_STATUS_LOOK_FOR_ERROR,
-			   0,0,0,-1,-1,q->int_parm);
-	omit_handler_call:
-		qdio_set_state(irq_ptr,QDIO_IRQ_STATE_STOPPED);
-		return;
+        cstat = irb->scsw.cstat;
+        dstat = irb->scsw.dstat;
+
+	switch (irq_ptr->state) {
+	case QDIO_IRQ_STATE_INACTIVE:
+		qdio_establish_handle_irq(cdev, cstat, dstat);
+		break;
+
+	case QDIO_IRQ_STATE_CLEANUP:
+		qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE);
+		break;
+
+	case QDIO_IRQ_STATE_ESTABLISHED:
+	case QDIO_IRQ_STATE_ACTIVE:
+		if (cstat & SCHN_STAT_PCI) {
+			qdio_handle_pci(irq_ptr);
+			break;
+		}
+
+		if ((cstat&~SCHN_STAT_PCI)||dstat) {
+			qdio_handle_activate_check(cdev, intparm, cstat, dstat);
+			break;
+		}
+	default:
+		QDIO_PRINT_ERR("got interrupt for queues in state %d on " \
+			       "device %s?!\n",
+			       irq_ptr->state, cdev->dev.bus_id);
 	}
+	wake_up(&cdev->private->wait_q);
 
 }
 
@@ -1680,60 +1738,108 @@
 static unsigned char
 qdio_check_siga_needs(int sch)
 {
-	int resp_code,result;
+	int result;
+	unsigned char qdioac;
 
-	memset(chsc_area,0,sizeof(struct qdio_chsc_area));
-	chsc_area->request_block.command_code1=0x0010; /* length */
-	chsc_area->request_block.command_code2=0x0024; /* op code */
-	chsc_area->request_block.first_sch=sch;
-	chsc_area->request_block.last_sch=sch;
+	struct {
+		struct chsc_header request;
+		u16 reserved1;
+		u16 first_sch;
+		u16 reserved2;
+		u16 last_sch;
+		u32 reserved3;
+		struct chsc_header response;
+		u32 reserved4;
+		u8  flags;
+		u8  reserved5;
+		u16 sch;
+		u8  qfmt;
+		u8  reserved6;
+		u8  qdioac;
+		u8  sch_class;
+		u8  reserved7;
+		u8  icnt;
+		u8  reserved8;
+		u8  ocnt;
+	} *ssqd_area;
+
+	ssqd_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	if (!ssqd_area) {
+	        QDIO_PRINT_WARN("Could not get memory for chsc. Using all " \
+				"SIGAs for sch x%x.\n", sch);
+		return -1; /* all flags set */
+	}
+	ssqd_area->request = (struct chsc_header) {
+		.length = 0x0010,
+		.code   = 0x0024,
+	};
 
-	result=chsc(chsc_area);
+	ssqd_area->first_sch = sch;
+	ssqd_area->last_sch = sch;
+
+	result=chsc(ssqd_area);
 
 	if (result) {
 		QDIO_PRINT_WARN("CHSC returned cc %i. Using all " \
 				"SIGAs for sch x%x.\n",
 				result,sch);
-		return -1; /* all flags set */
+		qdioac = -1; /* all flags set */
+		goto out;
 	}
 
-	resp_code=chsc_area->request_block.operation_data_area.
-		store_qdio_data_response.response_code;
-	if (resp_code!=QDIO_CHSC_RESPONSE_CODE_OK) {
+	if (ssqd_area->response.code != QDIO_CHSC_RESPONSE_CODE_OK) {
 		QDIO_PRINT_WARN("response upon checking SIGA needs " \
 				"is 0x%x. Using all SIGAs for sch x%x.\n",
-				resp_code,sch);
-		return -1; /* all flags set */
+				ssqd_area->response.code, sch);
+		qdioac = -1; /* all flags set */
+		goto out;
 	}
-	if (
-	    (!(chsc_area->request_block.operation_data_area.
-	       store_qdio_data_response.flags&CHSC_FLAG_QDIO_CAPABILITY)) ||
-	    (!(chsc_area->request_block.operation_data_area.
-	       store_qdio_data_response.flags&CHSC_FLAG_VALIDITY)) ||
-	    (chsc_area->request_block.operation_data_area.
-	     store_qdio_data_response.sch!=sch)
-	    ) {
+	if (!(ssqd_area->flags & CHSC_FLAG_QDIO_CAPABILITY) ||
+	    !(ssqd_area->flags & CHSC_FLAG_VALIDITY) ||
+	    (ssqd_area->sch != sch)) {
 		QDIO_PRINT_WARN("huh? problems checking out sch x%x... " \
 				"using all SIGAs.\n",sch);
-		return CHSC_FLAG_SIGA_INPUT_NECESSARY |
+		qdioac = CHSC_FLAG_SIGA_INPUT_NECESSARY |
 			CHSC_FLAG_SIGA_OUTPUT_NECESSARY |
 			CHSC_FLAG_SIGA_SYNC_NECESSARY; /* worst case */
+		goto out;
 	}
 
-	return chsc_area->request_block.operation_data_area.
-		store_qdio_data_response.qdioac;
+	qdioac = ssqd_area->qdioac;
+out:
+	free_page ((unsigned long) ssqd_area);
+	return qdioac;
 }
 
-/* the chsc_area is locked by the lock in qdio_activate */
 static unsigned int
-iqdio_check_chsc_availability(void) {
+iqdio_check_chsc_availability(void)
+{
 	int result;
-	int i;
 
-	memset(chsc_area,0,sizeof(struct qdio_chsc_area));
-	chsc_area->request_block.command_code1=0x0010;
-	chsc_area->request_block.command_code2=0x0010;
-	result=chsc(chsc_area);
+	struct {
+		struct chsc_header request;
+		u32 reserved1;
+		u32 reserved2;
+		u32 reserved3;
+		struct chsc_header response;
+		u32 reserved4;
+		u32 general_char[510];
+		u32 chsc_char[518];
+	} *scsc_area;
+		
+	scsc_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	if (!scsc_area) {
+	        QDIO_PRINT_WARN("Was not able to determine available" \
+				"CHSCs due to no memory.\n");
+		return -ENOMEM;
+	}
+
+	scsc_area->request = (struct chsc_header) {
+		.length = 0x0010,
+		.code   = 0x0010,
+	};
+
+	result=chsc(scsc_area);
 	if (result) {
 		QDIO_PRINT_WARN("Was not able to determine " \
 				"available CHSCs, cc=%i.\n",
@@ -1741,10 +1847,8 @@
 		result=-EIO;
 		goto exit;
 	}
-	result=0;
-	i=chsc_area->request_block.operation_data_area.
-		store_qdio_data_response.response_code;
-	if (i!=1) {
+
+	if (scsc_area->response.code != 1) {
 		QDIO_PRINT_WARN("Was not able to determine " \
 				"available CHSCs.\n");
 		result=-EIO;
@@ -1753,24 +1857,24 @@
 	/* 4: request block
 	 * 2: general char
 	 * 512: chsc char */
-	if ( (*(((unsigned int*)(chsc_area))+4+2+1)&0x00800000)!=0x00800000) {
+	if ((scsc_area->general_char[1] & 0x00800000) != 0x00800000) {
 		QDIO_PRINT_WARN("Adapter interruption facility not " \
 				"installed.\n");
 		result=-ENOENT;
 		goto exit;
 	}
-	if ( (*(((unsigned int*)(chsc_area))+4+512+3)&0x00180000)!=
-	     0x00180000 ) {
+	if ((scsc_area->chsc_char[2] & 0x00180000) != 0x00180000) {
 		QDIO_PRINT_WARN("Set Chan Subsys. Char. & Fast-CHSCs " \
 				"not available.\n");
 		result=-ENOENT;
 		goto exit;
 	}
 exit:
+	free_page ((unsigned long) scsc_area);
 	return result;
 }
 
-/* the chsc_area is locked by the lock in qdio_activate */
+
 static unsigned int
 iqdio_set_subchannel_ind(struct qdio_irq *irq_ptr, int reset_to_zero)
 {
@@ -1782,7 +1886,27 @@
 	unsigned int resp_code;
 	int result;
 
-	if (!irq_ptr->is_iqdio_irq) return -ENODEV;
+	struct {
+		struct chsc_header request;
+		u16 operation_code;
+		u16 reserved1;
+		u32 reserved2;
+		u32 reserved3;
+		u64 summary_indicator_addr;
+		u64 subchannel_indicator_addr;
+		u32 ks:4;
+		u32 kc:4;
+		u32 reserved4:21;
+		u32 isc:3;
+		u32 reserved5[2];
+		u32 subsystem_id;
+		u32 reserved6[1004];
+		struct chsc_header response;
+		u32 reserved7;
+	} *scssc_area;
+
+	if (!irq_ptr->is_iqdio_irq)
+		return -ENODEV;
 
 	if (reset_to_zero) {
 		real_addr_local_summary_bit=0;
@@ -1794,52 +1918,57 @@
 			virt_to_phys((volatile void *)irq_ptr->dev_st_chg_ind);
 	}
 
-	memset(chsc_area,0,sizeof(struct qdio_chsc_area));
-	chsc_area->request_block.command_code1=0x0fe0;
-	chsc_area->request_block.command_code2=0x0021;
-	chsc_area->request_block.operation_code=0;
-	chsc_area->request_block.image_id=0;
-
-	chsc_area->request_block.operation_data_area.set_chsc.
-		summary_indicator_addr=real_addr_local_summary_bit;
-	chsc_area->request_block.operation_data_area.set_chsc.
-		subchannel_indicator_addr=real_addr_dev_st_chg_ind;
-	chsc_area->request_block.operation_data_area.set_chsc.
-		ks=QDIO_STORAGE_KEY;
-	chsc_area->request_block.operation_data_area.set_chsc.
-		kc=QDIO_STORAGE_KEY;
-	chsc_area->request_block.operation_data_area.set_chsc.
-		isc=IQDIO_THININT_ISC;
-	chsc_area->request_block.operation_data_area.set_chsc.
-		subsystem_id=(1<<16)+irq_ptr->irq;
+	scssc_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	if (!scssc_area) {
+		QDIO_PRINT_WARN("No memory for setting indicators on " \
+				"subchannel x%x.\n", irq_ptr->irq);
+		return -ENOMEM;
+	}
+	scssc_area->request = (struct chsc_header) {
+		.length = 0x0fe0,
+		.code   = 0x0021,
+	};
+	scssc_area->operation_code = 0;
+
+        scssc_area->summary_indicator_addr = real_addr_local_summary_bit;
+	scssc_area->subchannel_indicator_addr = real_addr_dev_st_chg_ind;
+	scssc_area->ks = QDIO_STORAGE_KEY;
+	scssc_area->kc = QDIO_STORAGE_KEY;
+	scssc_area->isc = IQDIO_THININT_ISC;
+	scssc_area->subsystem_id = (1<<16) + irq_ptr->irq;
 
-	result=chsc(chsc_area);
+	result = chsc(scssc_area);
 	if (result) {
 		QDIO_PRINT_WARN("could not set indicators on irq x%x, " \
 				"cc=%i.\n",irq_ptr->irq,result);
-		return -EIO;
+		result = -EIO;
+		goto out;
 	}
 
-	resp_code=chsc_area->response_block.response_code;
+	resp_code = scssc_area->response.code;
 	if (resp_code!=QDIO_CHSC_RESPONSE_CODE_OK) {
 		QDIO_PRINT_WARN("response upon setting indicators " \
 				"is 0x%x.\n",resp_code);
 		sprintf(dbf_text,"sidR%4x",resp_code);
 		QDIO_DBF_TEXT1(0,trace,dbf_text);
 		QDIO_DBF_TEXT1(0,setup,dbf_text);
-		ptr=&chsc_area->response_block;
+		ptr=&scssc_area->response;
 		QDIO_DBF_HEX2(1,setup,&ptr,QDIO_DBF_SETUP_LEN);
-		return -EIO;
+		result = -EIO;
+		goto out;
 	}
 
 	QDIO_DBF_TEXT2(0,setup,"setscind");
 	QDIO_DBF_HEX2(0,setup,&real_addr_local_summary_bit,
 		      sizeof(unsigned long));
 	QDIO_DBF_HEX2(0,setup,&real_addr_dev_st_chg_ind,sizeof(unsigned long));
-	return 0;
+	result = 0;
+out:
+	free_page ((unsigned long) scssc_area);
+	return result;
+
 }
 
-/* chsc_area would have to be locked if called from outside qdio_activate */
 static unsigned int
 iqdio_set_delay_target(struct qdio_irq *irq_ptr, unsigned long delay_target)
 {
@@ -1848,34 +1977,59 @@
 	void *ptr;
 	char dbf_text[15];
 
-	if (!irq_ptr->is_iqdio_irq) return -ENODEV;
+	struct {
+		struct chsc_header request;
+		u16 operation_code;
+		u16 reserved1;
+		u32 reserved2;
+		u32 reserved3;
+		u32 reserved4[2];
+		u32 delay_target;
+		u32 reserved5[1009];
+		struct chsc_header response;
+		u32 reserved6;
+	} *scsscf_area;
 
-	memset(chsc_area,0,sizeof(struct qdio_chsc_area));
-	chsc_area->request_block.command_code1=0x0fe0;
-	chsc_area->request_block.command_code2=0x1027;
-	chsc_area->request_block.operation_data_area.set_chsc_fast.
-		delay_target=delay_target<<16;
+	if (!irq_ptr->is_iqdio_irq)
+		return -ENODEV;
 
-	result=chsc(chsc_area);
+	scsscf_area = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
+	if (!scsscf_area) {
+		QDIO_PRINT_WARN("No memory for setting delay target on " \
+				"subchannel x%x.\n", irq_ptr->irq);
+		return -ENOMEM;
+	}
+	scsscf_area->request = (struct chsc_header) {
+		.length = 0x0fe0,
+		.code   = 0x1027,
+	};
+
+	scsscf_area->delay_target = delay_target<<16;
+
+	result=chsc(scsscf_area);
 	if (result) {
 		QDIO_PRINT_WARN("could not set delay target on irq x%x, " \
 				"cc=%i. Continuing.\n",irq_ptr->irq,result);
-		return -EIO;
+		result = -EIO;
+		goto out;
 	}
 
-	resp_code=chsc_area->response_block.response_code;
+	resp_code = scsscf_area->response.code;
 	if (resp_code!=QDIO_CHSC_RESPONSE_CODE_OK) {
 		QDIO_PRINT_WARN("response upon setting delay target " \
 				"is 0x%x. Continuing.\n",resp_code);
 		sprintf(dbf_text,"sdtR%4x",resp_code);
 		QDIO_DBF_TEXT1(0,trace,dbf_text);
 		QDIO_DBF_TEXT1(0,setup,dbf_text);
-		ptr=&chsc_area->response_block;
+		ptr=&scsscf_area->response;
 		QDIO_DBF_HEX2(1,trace,&ptr,QDIO_DBF_TRACE_LEN);
 	}
 	QDIO_DBF_TEXT2(0,trace,"delytrgt");
 	QDIO_DBF_HEX2(0,trace,&delay_target,sizeof(unsigned long));
-	return 0;
+	result = 0; /* not critical */
+out:
+	free_page ((unsigned long) scsscf_area);
+	return result;
 }
 
 int
@@ -1972,19 +2126,22 @@
 		ccw_device_halt(cdev, QDIO_DOING_CLEANUP);
 		timeout=QDIO_CLEANUP_HALT_TIMEOUT;
 	}
-	cdev->private->state = DEV_STATE_QDIO_CLEANUP;
+	qdio_set_state(irq_ptr, QDIO_IRQ_STATE_CLEANUP);
 	ccw_device_set_timeout(cdev, timeout);
 	spin_unlock_irqrestore(get_ccwdev_lock(cdev),flags);
 
-	wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
-
+	wait_event(cdev->private->wait_q,
+		   irq_ptr->state == QDIO_IRQ_STATE_INACTIVE ||
+		   irq_ptr->state == QDIO_IRQ_STATE_ERR);
+	/* Ignore errors. */
+	qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE);
 out:
 	up(&irq_ptr->setting_up_sema);
 	return result;
 }
 
 static inline void
-qdio_cleanup_finish(struct qdio_irq *irq_ptr)
+qdio_cleanup_finish(struct ccw_device *cdev, struct qdio_irq *irq_ptr)
 {
 	if (irq_ptr->is_iqdio_irq) {
 		qdio_put_indicator((__u32*)irq_ptr->dev_st_chg_ind);
@@ -1992,6 +2149,10 @@
                 /* reset adapter interrupt indicators */
 	}
 
+ 	/* exchange int handlers, if necessary */
+ 	if ((void*)cdev->handler == (void*)qdio_handler)
+ 		cdev->handler=irq_ptr->original_int_handler;
+
 	qdio_set_state(irq_ptr,QDIO_IRQ_STATE_INACTIVE);
 }
 
@@ -2014,51 +2175,16 @@
 	if (cdev->private->state != DEV_STATE_ONLINE)
 		return -EINVAL;
 
-	qdio_cleanup_finish(irq_ptr);
+	qdio_cleanup_finish(cdev, irq_ptr);
 	cdev->private->qdio_data = 0;
 
 	up(&irq_ptr->setting_up_sema);
 
 	qdio_release_irq_memory(irq_ptr);
+	module_put(THIS_MODULE);
 	return 0;
 }
 
-static void
-qdio_cleanup_handle_timeout(struct ccw_device *cdev)
-{
-	unsigned long flags;
-	struct qdio_irq *irq_ptr;
-
-	irq_ptr = cdev->private->qdio_data;
-
-	spin_lock_irqsave(get_ccwdev_lock(cdev),flags);
-	QDIO_PRINT_INFO("Did not get interrupt on cleanup, irq=0x%x.\n",
-			irq_ptr->irq);
-
-	spin_unlock_irqrestore(get_ccwdev_lock(cdev),flags);
-
-	cdev->private->state = DEV_STATE_ONLINE;
-	wake_up(&cdev->private->wait_q);
-}
-
-static void
-qdio_cleanup_handle_irq(struct ccw_device *cdev, unsigned long intparm,
-			struct irb *irb)
-{
-	struct qdio_irq *irq_ptr;
-
-	if (intparm == 0)
-		QDIO_PRINT_WARN("Got unsolicited interrupt on cleanup "
-				"(irq 0x%x).\n", cdev->private->irq);
-
-	irq_ptr = cdev->private->qdio_data;
-
-	qdio_irq_check_sense(irq_ptr->irq, irb);
-
-	cdev->private->state = DEV_STATE_ONLINE;
-	wake_up(&cdev->private->wait_q);
-}
-
 static inline void
 qdio_allocate_do_dbf(struct qdio_initialize *init_data)
 {
@@ -2134,24 +2260,6 @@
 	irq_ptr->qdr->qdf0[i+j].dkey=QDIO_STORAGE_KEY;
 }
 
-void
-qdio_establish_handle_timeout(struct ccw_device *cdev)
-{
-	struct qdio_irq *irq_ptr;
-
-	irq_ptr = cdev->private->qdio_data;
-
-	QDIO_PRINT_ERR("establish queues on irq %04x: timed out\n",
-		       irq_ptr->irq);
-	QDIO_DBF_TEXT2(1,setup,"eq:timeo");
-	/*
-	 * FIXME:
-	 * this is broken,
-	 * we are in the context of a timer interrupt and
-	 * qdio_shutdown calls schedule
-	 */
-	qdio_shutdown(cdev,QDIO_FLAG_CLEANUP_USING_CLEAR);
-}
 
 static inline void
 qdio_initialize_set_siga_flags_input(struct qdio_irq *irq_ptr)
@@ -2208,7 +2316,7 @@
 		QDIO_PRINT_ERR("received check condition on establish " \
 			       "queues on irq 0x%x (cs=x%x, ds=x%x).\n",
 			       irq_ptr->irq,cstat,dstat);
-		qdio_set_state(irq_ptr,QDIO_IRQ_STATE_STOPPED);
+		qdio_set_state(irq_ptr,QDIO_IRQ_STATE_ERR);
 	}
 	
 	if (!(dstat & DEV_STAT_DEV_END)) {
@@ -2218,13 +2326,7 @@
 		QDIO_PRINT_ERR("establish queues on irq %04x: didn't get "
 			       "device end: dstat=%02x, cstat=%02x\n",
 			       irq_ptr->irq, dstat, cstat);
-		/*
-		 * FIXME:
-		 * this is broken,
-		 * we are probably in the context of an i/o interrupt and
-		 * qdio_shutdown calls schedule
-		 */
-		qdio_shutdown(cdev,QDIO_FLAG_CLEANUP_USING_CLEAR);
+		qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR);
 		return 1;
 	}
 
@@ -2236,36 +2338,27 @@
 			       "the following devstat: dstat=%02x, "
 			       "cstat=%02x\n",
 			       irq_ptr->irq, dstat, cstat);
-		cdev->private->state = DEV_STATE_ONLINE;
+		qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ERR);
 		return 1;
 	}
 	return 0;
 }
 
 static void
-qdio_establish_handle_irq(struct ccw_device *cdev, unsigned long intparm,
-			  struct irb *irb)
+qdio_establish_handle_irq(struct ccw_device *cdev, int cstat, int dstat)
 {
 	struct qdio_irq *irq_ptr;
-	int cstat, dstat;
 	char dbf_text[15];
 
-        cstat = irb->scsw.cstat;
-        dstat = irb->scsw.dstat;
-
-	irq_ptr = cdev->private->qdio_data;
-
-	if (intparm == 0) {
-		QDIO_PRINT_WARN("Got unsolicited interrupt on establish "
-				"queues (irq 0x%x).\n", cdev->private->irq);
-		return;
-	}
-
-	qdio_irq_check_sense(irq_ptr->irq, irb);
+	sprintf(dbf_text,"qehi%4x",cdev->private->irq);
+	QDIO_DBF_TEXT0(0,setup,dbf_text);
+	QDIO_DBF_TEXT0(0,trace,dbf_text);
 
 	if (qdio_establish_irq_check_for_errors(cdev, cstat, dstat))
 		return;
 
+	irq_ptr = cdev->private->qdio_data;
+
 	if (MACHINE_IS_VM)
 		irq_ptr->qdioac=qdio_check_siga_needs(irq_ptr->irq);
 	else
@@ -2287,6 +2380,7 @@
 	qdio_initialize_set_siga_flags_output(irq_ptr);
 
 	qdio_set_state(irq_ptr,QDIO_IRQ_STATE_ESTABLISHED);
+
 }
 
 int
@@ -2334,7 +2428,7 @@
 	qdio_allocate_do_dbf(init_data);
 
 	/* create irq */
-	irq_ptr=kmalloc(sizeof(struct qdio_irq),GFP_DMA);
+	irq_ptr=kmalloc(sizeof(struct qdio_irq), GFP_KERNEL | GFP_DMA);
 
 	QDIO_DBF_TEXT0(0,setup,"irq_ptr:");
 	QDIO_DBF_HEX0(0,setup,&irq_ptr,sizeof(void*));
@@ -2347,7 +2441,7 @@
 	memset(irq_ptr,0,sizeof(struct qdio_irq));
         /* wipes qib.ac, required by ar7063 */
 
-	irq_ptr->qdr=kmalloc(sizeof(struct qdr),GFP_DMA);
+	irq_ptr->qdr=kmalloc(sizeof(struct qdr), GFP_KERNEL | GFP_DMA);
   	if (!(irq_ptr->qdr)) {
    		kfree(irq_ptr->qdr);
    		kfree(irq_ptr);
@@ -2372,11 +2466,6 @@
 		if (!irq_ptr->dev_st_chg_ind) {
 			QDIO_PRINT_WARN("no indicator location available " \
 					"for irq 0x%x\n",irq_ptr->irq);
-			/*
-			 * FIXME:
-			 * qdio_release_irq_memory does MOD_DEC_USE_COUNT
-			 * in an unbalanced fashion (see 30 lines farther down)
-			 */
 			qdio_release_irq_memory(irq_ptr);
 			return -ENOBUFS;
 		}
@@ -2396,19 +2485,17 @@
 			   init_data->q_format,init_data->flags,
 			   init_data->input_sbal_addr_array,
 			   init_data->output_sbal_addr_array)) {
-		/*
-		 * FIXME:
-		 * qdio_release_irq_memory does MOD_DEC_USE_COUNT
-		 * in an unbalanced fashion (see 10 lines farther down)
-		 */
 		qdio_release_irq_memory(irq_ptr);
 		return -ENOMEM;
 	}
 
 	qdio_set_state(irq_ptr,QDIO_IRQ_STATE_INACTIVE);
 
-	MOD_INC_USE_COUNT;
-	QDIO_DBF_TEXT3(0,setup,"MOD_INC_");
+	if (!try_module_get(THIS_MODULE)) {
+		QDIO_PRINT_CRIT("try_module_get() failed!\n");
+		qdio_release_irq_memory(irq_ptr);
+		return -EINVAL;
+	}
 
 	init_MUTEX_LOCKED(&irq_ptr->setting_up_sema);
 
@@ -2474,6 +2561,10 @@
 	} else
 		irq_ptr->aqueue = *ciw;
 
+	/* Set new interrupt handler. */
+	irq_ptr->original_int_handler = init_data->cdev->handler;
+	init_data->cdev->handler = qdio_handler;
+
 	/* the iqdio CHSC stuff */
 	if (irq_ptr->is_iqdio_irq) {
 /*		iqdio_enable_adapter_int_facility(irq_ptr);*/
@@ -2485,25 +2576,12 @@
 		result=iqdio_set_subchannel_ind(irq_ptr,0);
 		if (result) {
 			up(&irq_ptr->setting_up_sema);
-			/*
-			 * FIXME:
-			 * need some callback pointers to be set already,
-			 * i.e. irq_ptr->cleanup_irq and irq_ptr->cleanup_timeout?
-			 * (see 10 lines farther down)
-			 */
 			qdio_cleanup(init_data->cdev, QDIO_FLAG_CLEANUP_USING_CLEAR);
 			return result;
 		}
 		iqdio_set_delay_target(irq_ptr,IQDIO_DELAY_TARGET);
 	}
 
-	/* Set callback functions. */
-	irq_ptr->cleanup_irq = qdio_cleanup_handle_irq;
-	irq_ptr->cleanup_timeout = qdio_cleanup_handle_timeout;
-	irq_ptr->establish_irq = qdio_establish_handle_irq;
-	irq_ptr->establish_timeout = qdio_establish_handle_timeout;
-	irq_ptr->handler = qdio_handler;
-
 	up(&irq_ptr->setting_up_sema);
 
 	return 0;
@@ -2538,13 +2616,14 @@
 
 	spin_lock_irqsave(get_ccwdev_lock(cdev),saveflags);
 
-	ccw_device_set_timeout(cdev, QDIO_ESTABLISH_TIMEOUT);
 	ccw_device_set_options(cdev, 0);
-	result=ccw_device_start(cdev,&irq_ptr->ccw,
-				QDIO_DOING_ESTABLISH,0,0);
+	result=ccw_device_start_timeout(cdev,&irq_ptr->ccw,
+					QDIO_DOING_ESTABLISH,0,0,
+					QDIO_ESTABLISH_TIMEOUT);
 	if (result) {
-		result2=ccw_device_start(cdev,&irq_ptr->ccw,
-					 QDIO_DOING_ESTABLISH,0,0);
+		result2=ccw_device_start_timeout(cdev,&irq_ptr->ccw,
+						 QDIO_DOING_ESTABLISH,0,0,
+						 QDIO_ESTABLISH_TIMEOUT);
 		sprintf(dbf_text,"eq:io%4x",result);
 		QDIO_DBF_TEXT2(1,setup,dbf_text);
 		if (result2) {
@@ -2556,8 +2635,7 @@
                            irq_ptr->irq,result,result2);
 		result=result2;
 	}
-	if (result == 0)
-		cdev->private->state = DEV_STATE_QDIO_INIT;
+
 	spin_unlock_irqrestore(get_ccwdev_lock(cdev),saveflags);
 
 	if (result) {
@@ -2567,13 +2645,15 @@
 	}
 	
 	wait_event(cdev->private->wait_q,
-		   dev_fsm_final_state(cdev) ||
-		   (irq_ptr->state == QDIO_IRQ_STATE_ESTABLISHED));
+		   irq_ptr->state == QDIO_IRQ_STATE_ESTABLISHED ||
+		   irq_ptr->state == QDIO_IRQ_STATE_ERR);
 
-	if (cdev->private->state == DEV_STATE_QDIO_INIT)
+	if (irq_ptr->state == QDIO_IRQ_STATE_ESTABLISHED)
 		result = 0;
-	else 
+	else {
+		qdio_shutdown(cdev, QDIO_FLAG_CLEANUP_USING_CLEAR);
 		result = -EIO;
+	}
 
 	up(&irq_ptr->setting_up_sema);
 
@@ -2593,7 +2673,7 @@
 	if (!irq_ptr)
 		return -ENODEV;
 
-	if (cdev->private->state != DEV_STATE_QDIO_INIT)
+	if (cdev->private->state != DEV_STATE_ONLINE)
 		return -EINVAL;
 
 	down(&irq_ptr->setting_up_sema);
@@ -2637,8 +2717,6 @@
 	if (result)
 		goto out;
 
-	cdev->private->state = DEV_STATE_QDIO_ACTIVE;
-
 	for (i=0;i<irq_ptr->no_input_qs;i++) {
 		if (irq_ptr->is_iqdio_irq) {
 			/* 
@@ -2659,9 +2737,9 @@
 		}
 	}
 
-	qdio_wait_nonbusy(QDIO_ACTIVATE_DELAY);
+	qdio_wait_nonbusy(QDIO_ACTIVATE_TIMEOUT);
 
-	qdio_set_state(irq_ptr,QDIO_IRQ_STATE_ACTIVE);
+	qdio_set_state(irq_ptr, QDIO_IRQ_STATE_ACTIVE);
 
  out:
 	up(&irq_ptr->setting_up_sema);
@@ -2807,12 +2885,10 @@
 {
 	struct qdio_irq *irq_ptr;
 
-#ifdef QDIO_DBF_LIKE_HELL
 	char dbf_text[20];
 
-	sprintf(dbf_text,"doQD%04x",irq);
+	sprintf(dbf_text,"doQD%04x",cdev->private->irq);
 	QDIO_DBF_TEXT3(0,trace,dbf_text);
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	if ( (qidx>QDIO_MAX_BUFFERS_PER_Q) ||
 	     (count>QDIO_MAX_BUFFERS_PER_Q) ||
@@ -2826,7 +2902,6 @@
 	if (!irq_ptr)
 		return -ENODEV;
 
-#ifdef QDIO_DBF_LIKE_HELL
 	if (callflags&QDIO_FLAG_SYNC_INPUT)
 		QDIO_DBF_HEX3(0,trace,&irq_ptr->input_qs[queue_number],
 			      sizeof(void*));
@@ -2837,7 +2912,6 @@
 	QDIO_DBF_TEXT3(0,trace,dbf_text);
 	sprintf(dbf_text,"qi%02xct%02x",qidx,count);
 	QDIO_DBF_TEXT3(0,trace,dbf_text);
-#endif /* QDIO_DBF_LIKE_HELL */
 
 	if (irq_ptr->state!=QDIO_IRQ_STATE_ACTIVE)
 		return -EBUSY;
@@ -2989,25 +3063,12 @@
 				   GFP_KERNEL);
        	if (!indicators) return -ENOMEM;
 	memset(indicators,0,sizeof(__u32)*(INDICATORS_PER_CACHELINE));
-
-	chsc_area=(struct qdio_chsc_area *)
-		kmalloc(sizeof(struct qdio_chsc_area),GFP_KERNEL);
-	QDIO_DBF_TEXT3(0,trace,"chscarea"); \
-	QDIO_DBF_HEX3(0,trace,&chsc_area,sizeof(void*)); \
-	if (!chsc_area) {
-		QDIO_PRINT_ERR("not enough memory for chsc area. Cannot " \
-			       "initialize QDIO.\n");
-		kfree(indicators);
-		return -ENOMEM;
-	}
-	memset(chsc_area,0,sizeof(struct qdio_chsc_area));
 	return 0;
 }
 
 static void
 qdio_release_qdio_memory(void)
 {
-	kfree(chsc_area);
 	if (indicators)
 		kfree(indicators);
 }
diff -Nru a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
--- a/drivers/s390/cio/qdio.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/cio/qdio.h	Sat Apr 19 19:51:28 2003
@@ -1,7 +1,7 @@
 #ifndef _CIO_QDIO_H
 #define _CIO_QDIO_H
 
-#define VERSION_CIO_QDIO_H "$Revision: 1.11 $"
+#define VERSION_CIO_QDIO_H "$Revision: 1.16 $"
 
 //#define QDIO_DBF_LIKE_HELL
 
@@ -48,25 +48,25 @@
 #define QDIO_STATS_CLASSES 2
 #define QDIO_STATS_COUNT_NEEDED 2*/
 
-#define QDIO_ACTIVATE_DELAY 5 /* according to brenton belmar and paul
-				 gioquindo it can take up to 5ms before
-				 queues are really active */
-
 #define QDIO_NO_USE_COUNT_TIME 10
 #define QDIO_NO_USE_COUNT_TIMEOUT 1000 /* wait for 1 sec on each q before
 					  exiting without having use_count
 					  of the queue to 0 */
 
 #define QDIO_ESTABLISH_TIMEOUT 1000
-#define QDIO_ACTIVATE_TIMEOUT 100
+#define QDIO_ACTIVATE_TIMEOUT 5
 #define QDIO_CLEANUP_CLEAR_TIMEOUT 20000
 #define QDIO_CLEANUP_HALT_TIMEOUT 10000
 
-#define QDIO_IRQ_STATE_FRESH 0 /* must be 0 -> memset has set it to 0 */
-#define QDIO_IRQ_STATE_INACTIVE 1
-#define QDIO_IRQ_STATE_ESTABLISHED 2
-#define QDIO_IRQ_STATE_ACTIVE 3
-#define QDIO_IRQ_STATE_STOPPED 4
+enum qdio_irq_states {
+	QDIO_IRQ_STATE_INACTIVE,
+	QDIO_IRQ_STATE_ESTABLISHED,
+	QDIO_IRQ_STATE_ACTIVE,
+	QDIO_IRQ_STATE_STOPPED,
+	QDIO_IRQ_STATE_CLEANUP,
+	QDIO_IRQ_STATE_ERR,
+	NR_QDIO_IRQ_STATES,
+};
 
 /* used as intparm in do_IO: */
 #define QDIO_DOING_SENSEID 0
@@ -443,81 +443,6 @@
 #define CHSC_FLAG_SIGA_SYNC_DONE_ON_THININTS 0x08
 #define CHSC_FLAG_SIGA_SYNC_DONE_ON_OUTB_PCIS 0x04
 
-struct qdio_chsc_area {
-	struct {
-		/* word 0 */
-		__u16 command_code1;
-		__u16 command_code2;
-		/* word 1 */
-		__u16 operation_code;
-		__u16 first_sch;
-		/* word 2 */
-		__u8 reserved1;
-		__u8 image_id;
-		__u16 last_sch;
-		/* word 3 */
-		__u32 reserved2;
-
-		/* word 4 */
-		union {
-			struct {
-				/* word 4&5 */
-				__u64 summary_indicator_addr;
-				/* word 6&7 */
-				__u64 subchannel_indicator_addr;
-				/* word 8 */
-				int ks:4;
-				int kc:4;
-				int reserved1:21;
-				int isc:3;
-				/* word 9&10 */
-				__u32 reserved2[2];
-				/* word 11 */
-				__u32 subsystem_id;
-				/* word 12-1015 */
-				__u32 reserved3[1004];
-			} __attribute__ ((packed,aligned(4))) set_chsc;
-			struct {
-				/* word 4&5 */
-				__u32 reserved1[2];	
-				/* word 6 */
-				__u32 delay_target;
-				/* word 7-1015 */
-				__u32 reserved4[1009];
-			} __attribute__ ((packed,aligned(4))) set_chsc_fast;
-			struct {
-				/* word 0 */
-				__u16 length;
-				__u16 response_code;
-				/* word 1 */
-				__u32 reserved1;
-				/* words 2 to 9 for st sch qdio data */
-				__u8 flags;
-				__u8 reserved2;
-				__u16 sch;
-				__u8 qfmt;
-				__u8 reserved3;
-				__u8 qdioac;
-				__u8 sch_class;
-				__u8 reserved4;
-				__u8 icnt;
-				__u8 reserved5;
-				__u8 ocnt;
-				/* plus 5 words of reserved fields */
-			} __attribute__ ((packed,aligned(8)))
-			store_qdio_data_response;
-		} operation_data_area;
-	} __attribute__ ((packed,aligned(8))) request_block;
-	struct {
-		/* word 0 */
-		__u16 length;
-		__u16 response_code;
-		/* word 1 */
-		__u32 reserved1;
-	} __attribute__ ((packed,aligned(8))) response_block;
-} __attribute__ ((packed,aligned(PAGE_SIZE)));
-
-
 #ifdef QDIO_PERFORMANCE_STATS
 struct qdio_perf_stats {
 	unsigned int tl_runs;
@@ -623,7 +548,7 @@
 	struct tasklet_struct tasklet;
 #endif /* QDIO_USE_TIMERS_FOR_POLLING */
 
-	unsigned int state;
+	enum qdio_irq_states state;
 
 	/* used to store the error condition during a data transfer */
 	unsigned int qdio_error;
@@ -674,7 +599,7 @@
 	unsigned int hydra_gives_outbound_pcis;
 	unsigned int sync_done_on_outb_pcis;
 
-	unsigned int state;
+	enum qdio_irq_states state;
 	struct semaphore setting_up_sema;
 
 	unsigned int no_input_qs;
@@ -694,13 +619,8 @@
 
 	struct qib qib;
 	
-	/* Functions called via the generic cio layer */
-	void (*cleanup_irq) (struct ccw_device *, unsigned long, struct irb *);
-	void (*cleanup_timeout) (struct ccw_device *);
-	void (*establish_irq) (struct ccw_device *, unsigned long,
-			       struct irb *);
-	void (*establish_timeout) (struct ccw_device *);
-	void (*handler) (struct ccw_device *, unsigned long, struct irb *);
+ 	void (*original_int_handler) (struct ccw_device *,
+ 				      unsigned long, struct irb *);
 
 };
 #endif
diff -Nru a/drivers/s390/cio/requestirq.c b/drivers/s390/cio/requestirq.c
--- a/drivers/s390/cio/requestirq.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/s390/cio/requestirq.c	Sat Apr 19 19:51:49 2003
@@ -1,7 +1,7 @@
 /*
  *  drivers/s390/cio/requestirq.c
  *   S/390 common I/O routines -- enabling and disabling of devices
- *   $Revision: 1.42 $
+ *   $Revision: 1.44 $
  *
  *    Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH,
  *			      IBM Corporation
@@ -14,6 +14,7 @@
 #include <linux/config.h>
 #include <linux/device.h>
 #include <linux/init.h>
+#include <asm/lowcore.h>
 
 #include "css.h"
 
@@ -44,7 +45,11 @@
 	/*
 	 * Let's build our path group ID here.
 	 */
-	global_pgid.cpu_addr = *(__u16 *) __LC_CPUADDR;
+#ifdef CONFIG_SMP
+	global_pgid.cpu_addr = hard_smp_processor_id();
+#else
+	global_pgid.cpu_addr = 0;
+#endif
 	global_pgid.cpu_id = ((cpuid_t *) __LC_CPUID)->ident;
 	global_pgid.cpu_model = ((cpuid_t *) __LC_CPUID)->machine;
 	global_pgid.tod_high = (__u32) (get_clock() >> 32);
diff -Nru a/drivers/s390/net/Kconfig b/drivers/s390/net/Kconfig
--- a/drivers/s390/net/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/drivers/s390/net/Kconfig	Sat Apr 19 19:51:50 2003
@@ -9,7 +9,7 @@
   	   or zSeries. This device driver supports Token Ring (IEEE 802.5),
   	   FDDI (IEEE 802.7) and Ethernet. 
 	   This option is also available as a module which will be
-	   called lcs.o . If you do not know what it is, it's safe to say "Y".
+	   called lcs.ko. If you do not know what it is, it's safe to say "Y".
 
 config CTC
 	tristate "CTC device support"
@@ -20,7 +20,7 @@
 	  coupling using ESCON. It also supports virtual CTCs when running
 	  under VM. It will use the channel device configuration if this is
 	  available.  This option is also available as a module which will be
-	  called ctc.o.  If you do not know what it is, it's safe to say "Y".
+	  called ctc.ko.  If you do not know what it is, it's safe to say "Y".
 
 config IUCV
 	tristate "IUCV device support (VM only)"
@@ -28,7 +28,7 @@
 	help
 	  Select this option if you want to use inter-user communication
 	  vehicle networking under VM or VIF.  This option is also available
-	  as a module which will be called iucv.o. If unsure, say "Y".
+	  as a module which will be called iucv.ko. If unsure, say "Y".
 
 config CCWGROUP
  	tristate
diff -Nru a/drivers/s390/net/ctcmain.c b/drivers/s390/net/ctcmain.c
--- a/drivers/s390/net/ctcmain.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/s390/net/ctcmain.c	Sat Apr 19 19:51:46 2003
@@ -1,5 +1,5 @@
 /*
- * $Id: ctcmain.c,v 1.36 2003/02/18 09:15:14 mschwide Exp $
+ * $Id: ctcmain.c,v 1.40 2003/04/08 16:00:17 mschwide Exp $
  *
  * CTC / ESCON network driver
  *
@@ -36,13 +36,12 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.36 $
+ * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.40 $
  *
  */
 
 #undef DEBUG
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -273,7 +272,7 @@
 print_banner(void)
 {
 	static int printed = 0;
-	char vbuf[] = "$Revision: 1.36 $";
+	char vbuf[] = "$Revision: 1.40 $";
 	char *version = vbuf;
 
 	if (printed)
@@ -1962,22 +1961,17 @@
 	}
 	
 	priv = cdev->dev.driver_data;
-	ch = (struct channel *) intparm;
-	if ((ch != priv->channel[READ]) && (ch != priv->channel[WRITE]))
-		ch = NULL;
-	
-	if (!ch) {
-		/* Try to extract channel from driver data. */
-		if (priv->channel[READ]->cdev == cdev)
-			ch = priv->channel[READ];
-		else if (priv->channel[WRITE]->cdev == cdev)
-			ch = priv->channel[READ];
-		else {
-			printk(KERN_ERR
-			       "ctc: Can't determine channel for interrupt, "
-			       "device %s\n", cdev->dev.bus_id);
-			return;
-		}
+
+	/* Try to extract channel from driver data. */
+	if (priv->channel[READ]->cdev == cdev)
+		ch = priv->channel[READ];
+	else if (priv->channel[WRITE]->cdev == cdev)
+		ch = priv->channel[READ];
+	else {
+		printk(KERN_ERR
+		       "ctc: Can't determine channel for interrupt, "
+		       "device %s\n", cdev->dev.bus_id);
+		return;
 	}
 	
 	dev = (struct net_device *) (ch->netdev);
@@ -2392,7 +2386,6 @@
 static int
 ctc_open(struct net_device * dev)
 {
-	MOD_INC_USE_COUNT;
 	fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_START, dev);
 	return 0;
 }
@@ -2409,7 +2402,6 @@
 ctc_close(struct net_device * dev)
 {
 	fsm_event(((struct ctc_priv *) dev->priv)->fsm, DEV_EVENT_STOP, dev);
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
@@ -2761,6 +2753,7 @@
 	dev->addr_len = 0;
 	dev->type = ARPHRD_SLIP;
 	dev->tx_queue_len = 100;
+	dev->owner = THIS_MODULE;
 	dev->flags = IFF_POINTOPOINT | IFF_NOARP;
 	return dev;
 }
diff -Nru a/drivers/s390/net/ctctty.c b/drivers/s390/net/ctctty.c
--- a/drivers/s390/net/ctctty.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/s390/net/ctctty.c	Sat Apr 19 19:51:48 2003
@@ -1,5 +1,5 @@
 /*
- * $Id: ctctty.c,v 1.9 2002/12/02 15:25:13 aberg Exp $
+ * $Id: ctctty.c,v 1.10 2003/03/21 18:47:31 aberg Exp $
  *
  * CTC / ESCON network driver, tty interface.
  *
@@ -22,7 +22,6 @@
  *
  */
 
-#define __NO_VERSION__
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/tty.h>
diff -Nru a/drivers/s390/net/fsm.c b/drivers/s390/net/fsm.c
--- a/drivers/s390/net/fsm.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/s390/net/fsm.c	Sat Apr 19 19:51:47 2003
@@ -1,12 +1,11 @@
 /**
- * $Id: fsm.c,v 1.3 2002/10/08 16:53:45 mschwide Exp $
+ * $Id: fsm.c,v 1.4 2003/03/28 08:54:40 mschwide Exp $
  *
  * A generic FSM based on fsm used in isdn4linux
  *
  */
 
 #include "fsm.h"
-#include <linux/version.h>
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/timer.h>
diff -Nru a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c
--- a/drivers/s390/net/iucv.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/net/iucv.c	Sat Apr 19 19:51:28 2003
@@ -1,5 +1,5 @@
 /* 
- * $Id: iucv.c,v 1.9 2002/11/06 13:37:25 cohuck Exp $
+ * $Id: iucv.c,v 1.10 2003/03/28 08:54:40 mschwide Exp $
  *
  * IUCV network driver
  *
@@ -29,14 +29,13 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.9 $
+ * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.10 $
  *
  */
 
 #include <linux/module.h>
 #include <linux/config.h>
 
-#include <linux/version.h>
 #include <linux/spinlock.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -333,7 +332,7 @@
 static void
 iucv_banner(void)
 {
-	char vbuf[] = "$Revision: 1.9 $";
+	char vbuf[] = "$Revision: 1.10 $";
 	char *version = vbuf;
 
 	if ((version = strchr(version, ':'))) {
diff -Nru a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c
--- a/drivers/s390/net/lcs.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/s390/net/lcs.c	Sat Apr 19 19:51:28 2003
@@ -11,7 +11,7 @@
  *			  Frank Pavlic (pavlic@de.ibm.com) and
  *		 	  Martin Schwidefsky <schwidefsky@de.ibm.com>
  *
- *    $Revision: 1.44 $	 $Date: 2003/02/18 19:49:02 $
+ *    $Revision: 1.51 $	 $Date: 2003/03/28 08:54:40 $
  *
  * 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
@@ -28,7 +28,6 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/if.h>
 #include <linux/netdevice.h>
@@ -59,7 +58,7 @@
 /**
  * initialization string for output
  */
-#define VERSION_LCS_C  "$Revision: 1.44 $"
+#define VERSION_LCS_C  "$Revision: 1.51 $"
 
 static char version[] __initdata = "LCS driver ("VERSION_LCS_C "/" VERSION_LCS_H ")";
 
@@ -335,7 +334,9 @@
 		  (void *)lcs_start_kernel_thread,card);
 	card->thread_mask = 0;
 	spin_lock_init(&card->lock);
+#ifdef CONFIG_IP_MULTICAST
 	INIT_LIST_HEAD(&card->ipm_list);
+#endif
 	INIT_LIST_HEAD(&card->lancmd_waiters);
 	return 0;
 }
@@ -358,6 +359,7 @@
 		kfree(ipm_list);
 	}
 #endif
+	kfree(card->dev);
 	/* Cleanup channels. */
 	lcs_cleanup_channel(&card->write);
 	lcs_cleanup_channel(&card->read);
@@ -556,13 +558,12 @@
 static int
 __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
 {
-	int index, prevprev, prev, next;
+	int index, prev, next;
 
 	if (buffer->state != BUF_STATE_READY)
 		BUG();
 	buffer->state = BUF_STATE_PROCESSED;
 	index = buffer - channel->iob;
-	prevprev = (index - 1) & (LCS_NUM_BUFFS - 1);
 	prev = (index - 1) & (LCS_NUM_BUFFS - 1);
 	next = (index + 1) & (LCS_NUM_BUFFS - 1);
 	/* Set the suspend bit and clear the PCI bit of this buffer. */
@@ -1082,7 +1083,7 @@
 	unsigned long flags;
 	struct lcs_channel *channel;
 	struct lcs_buffer *iob;
-	int buf_idx, io_idx;
+	int buf_idx;
 	int rc;
 
 	channel = (struct lcs_channel *) data;
@@ -1092,9 +1093,7 @@
 	/* Check for processed buffers. */
 	iob = channel->iob;
 	buf_idx = channel->buf_idx;
-	io_idx = channel->io_idx;
-	while (buf_idx != io_idx &&
-	       iob[buf_idx].state == BUF_STATE_PROCESSED) {
+	while (iob[buf_idx].state == BUF_STATE_PROCESSED) {
 		/* Do the callback thing. */
 		if (iob[buf_idx].callback != NULL)
 			iob[buf_idx].callback(channel, iob + buf_idx);
@@ -1434,6 +1433,7 @@
 lcs_lgw_stoplan_thread(void *data)
 {
 	struct lcs_card *card;
+	int rc;
 
 	card = (struct lcs_card *) data;
 	daemonize("lgwstop");
@@ -1446,7 +1446,11 @@
 	else
 		PRINT_ERR("Stoplan %s initiated by LGW failed!\n",
 			  card->dev->name);
-	return 0;
+	/*Try to reset the card, stop it on failure */
+        rc = lcs_resetcard(card);
+        if (rc != 0)
+                rc = lcs_stopcard(card);
+        return rc;
 }
 
 /**
@@ -1462,8 +1466,10 @@
 		kernel_thread(lcs_lgw_startlan_thread, (void *) card, SIGCHLD);
 	if (test_and_clear_bit(2, &card->thread_mask))
 		kernel_thread(lcs_lgw_stoplan_thread, (void *) card, SIGCHLD);
+#ifdef CONFIG_IP_MULTICAST
 	if (test_and_clear_bit(3, &card->thread_mask))
 		kernel_thread(lcs_fix_multicast_list, (void *) card, SIGCHLD);
+#endif
 }
 
 /**
@@ -1599,12 +1605,9 @@
 	LCS_DBF_TEXT(2, trace, "stopdev");
 	card   = (struct lcs_card *) dev->priv;
 	netif_stop_queue(dev);
-	// FIXME: really free the net_device here ?!?
-	kfree(card->dev);
 	rc = lcs_stopcard(card);
 	if (rc)
 		PRINT_ERR("Try it again!\n ");
-	MOD_DEC_USE_COUNT;
 	return rc;
 }
 
@@ -1626,7 +1629,6 @@
 		PRINT_ERR("LCS:Error in opening device!\n");
 
 	} else {
-		MOD_INC_USE_COUNT;
 		netif_wake_queue(dev);
 		card->state = DEV_STATE_UP;
 	}
@@ -1784,6 +1786,7 @@
 		dev->set_multicast_list = lcs_set_multicast_list;
 #endif
 	dev->get_stats = lcs_getstats;
+	dev->owner = THIS_MODULE;
 	netif_stop_queue(dev);
 	lcs_stopcard(card);
 	return 0;
diff -Nru a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c
--- a/drivers/s390/net/netiucv.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/s390/net/netiucv.c	Sat Apr 19 19:51:48 2003
@@ -1,5 +1,5 @@
 /*
- * $Id: netiucv.c,v 1.16 2003/02/18 09:15:14 mschwide Exp $
+ * $Id: netiucv.c,v 1.19 2003/04/08 16:00:17 mschwide Exp $
  *
  * IUCV network driver
  *
@@ -30,7 +30,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV network driver $Revision: 1.16 $
+ * RELEASE-TAG: IUCV network driver $Revision: 1.19 $
  *
  */
 
@@ -1140,7 +1140,6 @@
  */
 static int
 netiucv_open(struct net_device *dev) {
-	MOD_INC_USE_COUNT;
 	SET_DEVICE_START(dev, 1);
 	fsm_event(((struct netiucv_priv *)dev->priv)->fsm, DEV_EVENT_START, dev);
 	return 0;
@@ -1158,7 +1157,6 @@
 netiucv_close(struct net_device *dev) {
 	SET_DEVICE_START(dev, 0);
 	fsm_event(((struct netiucv_priv *)dev->priv)->fsm, DEV_EVENT_STOP, dev);
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
@@ -1517,12 +1515,14 @@
 		conn->max_buffsize = NETIUCV_BUFSIZE_DEFAULT;
 		conn->netdev = dev;
 
-		conn->rx_buff = alloc_skb(NETIUCV_BUFSIZE_DEFAULT, GFP_DMA);
+		conn->rx_buff = alloc_skb(NETIUCV_BUFSIZE_DEFAULT,
+					  GFP_KERNEL | GFP_DMA);
 		if (!conn->rx_buff) {
 			kfree(conn);
 			return NULL;
 		}
-		conn->tx_buff = alloc_skb(NETIUCV_BUFSIZE_DEFAULT, GFP_DMA);
+		conn->tx_buff = alloc_skb(NETIUCV_BUFSIZE_DEFAULT,
+					  GFP_KERNEL | GFP_DMA);
 		if (!conn->tx_buff) {
 			kfree_skb(conn->rx_buff);
 			kfree(conn);
@@ -1630,6 +1630,7 @@
 	dev->addr_len            = 0;
 	dev->type                = ARPHRD_SLIP;
 	dev->tx_queue_len        = NETIUCV_QUEUELEN_DEFAULT;
+	dev->owner               = THIS_MODULE;
 	dev->flags	         = IFF_POINTOPOINT | IFF_NOARP;
 	return dev;
 }
@@ -1716,7 +1717,7 @@
 static void
 netiucv_banner(void)
 {
-	char vbuf[] = "$Revision: 1.16 $";
+	char vbuf[] = "$Revision: 1.19 $";
 	char *version = vbuf;
 
 	if ((version = strchr(version, ':'))) {
diff -Nru a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c
--- a/drivers/s390/s390mach.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/s390/s390mach.c	Sat Apr 19 19:51:51 2003
@@ -21,7 +21,7 @@
 
 extern void css_process_crw(int);
 extern void chsc_process_crw(void);
-extern void chp_process_crw(int);
+extern void chp_process_crw(int, int);
 
 static void
 s390_handle_damage(char *msg)
@@ -62,7 +62,17 @@
 			break;
 		case CRW_RSC_CPATH:
 			pr_debug("source is channel path %02X\n", crw.rsid);
-			chp_process_crw(crw.rsid);
+			switch (crw.erc) {
+			case CRW_ERC_IPARM: /* Path has come. */
+				chp_process_crw(crw.rsid, 1);
+				break;
+			case CRW_ERC_PERRI: /* Path has gone. */
+				chp_process_crw(crw.rsid, 0);
+				break;
+			default:
+				pr_debug("Don't know how to handle erc=%x\n",
+					 crw.erc);
+			}
 			break;
 		case CRW_RSC_CONFIG:
 			pr_debug("source is configuration-alert facility\n");
diff -Nru a/drivers/scsi/NCR_D700.c b/drivers/scsi/NCR_D700.c
--- a/drivers/scsi/NCR_D700.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/scsi/NCR_D700.c	Sat Apr 19 19:51:28 2003
@@ -95,17 +95,8 @@
 #include <linux/config.h>
 #include <linux/blk.h>
 #include <linux/interrupt.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/types.h>
-#include <linux/string.h>
-#include <linux/spinlock.h>
-#include <linux/ioport.h>
-#include <linux/delay.h>
-#include <linux/proc_fs.h>
-#include <linux/init.h>
-#include <linux/device.h>
 #include <linux/mca.h>
 
 #include <asm/dma.h>
diff -Nru a/drivers/scsi/aic7xxx/Kconfig.aic79xx b/drivers/scsi/aic7xxx/Kconfig.aic79xx
--- a/drivers/scsi/aic7xxx/Kconfig.aic79xx	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/aic7xxx/Kconfig.aic79xx	Sat Apr 19 19:51:47 2003
@@ -1,6 +1,6 @@
 #
 # AIC79XX 2.5.X Kernel configuration File.
-# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic79xx#3 $
+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic79xx#4 $
 #
 config SCSI_AIC79XX
 	tristate "Adaptec AIC79xx U320 support"
@@ -59,6 +59,7 @@
 config AIC79XX_ENABLE_RD_STRM
 	bool "Enable Read Streaming for All Targets"
 	depends on SCSI_AIC79XX
+	default n
 	help
 	Read Streaming is a U320 protocol option that should enhance
 	performance.  Early U320 drive firmware actually performs slower
diff -Nru a/drivers/scsi/aic7xxx/Kconfig.aic7xxx b/drivers/scsi/aic7xxx/Kconfig.aic7xxx
--- a/drivers/scsi/aic7xxx/Kconfig.aic7xxx	Sat Apr 19 19:51:46 2003
+++ b/drivers/scsi/aic7xxx/Kconfig.aic7xxx	Sat Apr 19 19:51:46 2003
@@ -1,6 +1,6 @@
 #
 # AIC7XXX and AIC79XX 2.5.X Kernel configuration File.
-# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#5 $
+# $Id: //depot/linux-aic79xx-2.5.0/drivers/scsi/aic7xxx/Kconfig.aic7xxx#6 $
 #
 config SCSI_AIC7XXX
 	tristate "Adaptec AIC7xxx Fast -> U160 support (New Driver)"
diff -Nru a/drivers/scsi/aic7xxx/aic7770.c b/drivers/scsi/aic7xxx/aic7770.c
--- a/drivers/scsi/aic7xxx/aic7770.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/scsi/aic7xxx/aic7770.c	Sat Apr 19 19:51:51 2003
@@ -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#27 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7770.c#29 $
  *
  * $FreeBSD$
  */
@@ -59,6 +59,9 @@
 #define	ID_OLV_274x	0x04907782 /* Olivetti OEM */
 #define	ID_OLV_274xD	0x04907783 /* Olivetti OEM (Differential) */
 
+static int aic7770_chip_init(struct ahc_softc *ahc);
+static int aic7770_suspend(struct ahc_softc *ahc);
+static int aic7770_resume(struct ahc_softc *ahc);
 static int aha2840_load_seeprom(struct ahc_softc *ahc);
 static ahc_device_setup_t ahc_aic7770_VL_setup;
 static ahc_device_setup_t ahc_aic7770_EISA_setup;;
@@ -144,6 +147,12 @@
 
 	ahc->description = entry->name;
 	error = ahc_softc_init(ahc);
+	if (error != 0)
+		return (error);
+
+	ahc->bus_chip_init = aic7770_chip_init;
+	ahc->bus_suspend = aic7770_suspend;
+	ahc->bus_resume = aic7770_resume;
 
 	error = ahc_reset(ahc);
 	if (error != 0)
@@ -226,6 +235,9 @@
 	ahc_outb(ahc, BUSSPD, hostconf & DFTHRSH);
 	ahc_outb(ahc, BUSTIME, (hostconf << 2) & BOFF);
 
+	ahc->bus_softc.aic7770_softc.busspd = hostconf & DFTHRSH;
+	ahc->bus_softc.aic7770_softc.bustime = (hostconf << 2) & BOFF;
+
 	/*
 	 * Generic aic7xxx initialization.
 	 */
@@ -253,6 +265,28 @@
 	return (0);
 }
 
+static int
+aic7770_chip_init(struct ahc_softc *ahc)
+{
+	ahc_outb(ahc, BUSSPD, ahc->bus_softc.aic7770_softc.busspd);
+	ahc_outb(ahc, BUSTIME, ahc->bus_softc.aic7770_softc.bustime);
+	ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~AUTOFLUSHDIS);
+	ahc_outb(ahc, BCTL, ENABLE);
+	return (ahc_chip_init(ahc));
+}
+
+static int
+aic7770_suspend(struct ahc_softc *ahc)
+{
+	return (ahc_suspend(ahc));
+}
+
+static int
+aic7770_resume(struct ahc_softc *ahc)
+{
+	return (ahc_resume(ahc));
+}
+
 /*
  * Read the 284x SEEPROM.
  */
@@ -371,5 +405,6 @@
 	ahc->features = AHC_AIC7770_FE;
 	ahc->bugs |= AHC_TMODE_WIDEODD_BUG;
 	ahc->flags |= AHC_PAGESCBS;
+	ahc->instruction_ram_size = 448;
 	return (0);
 }
diff -Nru a/drivers/scsi/aic7xxx/aic7770_osm.c b/drivers/scsi/aic7xxx/aic7770_osm.c
--- a/drivers/scsi/aic7xxx/aic7770_osm.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/aic7xxx/aic7770_osm.c	Sat Apr 19 19:51:49 2003
@@ -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/aic7770_osm.c#12 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7770_osm.c#13 $
  */
 
 #include "aic7xxx_osm.h"
@@ -66,7 +66,7 @@
 			continue;
 		request_region(eisaBase, AHC_EISA_IOSIZE, "aic7xxx");
 #else
-		if (request_region(eisaBase, AHC_EISA_IOSIZE, "aic7xxx") != 0)
+		if (request_region(eisaBase, AHC_EISA_IOSIZE, "aic7xxx") == 0)
 			continue;
 #endif
 
diff -Nru a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h
--- a/drivers/scsi/aic7xxx/aic79xx.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/aic7xxx/aic79xx.h	Sat Apr 19 19:51:49 2003
@@ -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#78 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#88 $
  *
  * $FreeBSD$
  */
@@ -258,27 +258,30 @@
 	AHD_PCIX_CHIPRST_BUG	= 0x0040,
 	/* MMAPIO is not functional in PCI-X mode.  */
 	AHD_PCIX_MMAPIO_BUG	= 0x0080,
+	/* Reads to SCBRAM fail to reset the discard timer. */
+	AHD_PCIX_SCBRAM_RD_BUG  = 0x0100,
 	/* Bug workarounds that can be disabled on non-PCIX busses. */
 	AHD_PCIX_BUG_MASK	= AHD_PCIX_CHIPRST_BUG
-				| AHD_PCIX_MMAPIO_BUG,
+				| AHD_PCIX_MMAPIO_BUG
+				| AHD_PCIX_SCBRAM_RD_BUG,
 	/*
 	 * LQOSTOP0 status set even for forced selections with ATN
 	 * to perform non-packetized message delivery.
 	 */
-	AHD_LQO_ATNO_BUG	= 0x0100,
+	AHD_LQO_ATNO_BUG	= 0x0200,
 	/* FIFO auto-flush does not always trigger.  */
-	AHD_AUTOFLUSH_BUG	= 0x0200,
+	AHD_AUTOFLUSH_BUG	= 0x0400,
 	/* The CLRLQO registers are not self-clearing. */
-	AHD_CLRLQO_AUTOCLR_BUG	= 0x0400,
+	AHD_CLRLQO_AUTOCLR_BUG	= 0x0800,
 	/* The PACKETIZED status bit refers to the previous connection. */
-	AHD_PKTIZED_STATUS_BUG  = 0x0800,
+	AHD_PKTIZED_STATUS_BUG  = 0x1000,
 	/* "Short Luns" are not placed into outgoing LQ packets correctly. */
-	AHD_PKT_LUN_BUG		= 0x1000,
+	AHD_PKT_LUN_BUG		= 0x2000,
 	/*
 	 * Only the FIFO allocated to the non-packetized connection may
 	 * be in use during a non-packetzied connection.
 	 */
-	AHD_NONPACKFIFO_BUG	= 0x2000,
+	AHD_NONPACKFIFO_BUG	= 0x4000,
 	/*
 	 * Writing to a DFF SCBPTR register may fail if concurent with
 	 * a hardware write to the other DFF SCBPTR register.  This is
@@ -286,30 +289,44 @@
 	 * this bug have the AHD_NONPACKFIFO_BUG and all writes of concern
 	 * occur in non-packetized connections.
 	 */
-	AHD_MDFF_WSCBPTR_BUG	= 0x4000,
+	AHD_MDFF_WSCBPTR_BUG	= 0x8000,
 	/* SGHADDR updates are slow. */
-	AHD_REG_SLOW_SETTLE_BUG	= 0x8000,
+	AHD_REG_SLOW_SETTLE_BUG	= 0x10000,
 	/*
 	 * Changing the MODE_PTR coincident with an interrupt that
 	 * switches to a different mode will cause the interrupt to
 	 * be in the mode written outside of interrupt context.
 	 */
-	AHD_SET_MODE_BUG	= 0x10000,
+	AHD_SET_MODE_BUG	= 0x20000,
 	/* Non-packetized busfree revision does not work. */
-	AHD_BUSFREEREV_BUG	= 0x20000,
+	AHD_BUSFREEREV_BUG	= 0x40000,
 	/*
 	 * Paced transfers are indicated with a non-standard PPR
 	 * option bit in the neg table, 160MHz is indicated by
 	 * sync factor 0x7, and the offset if off by a factor of 2.
 	 */
-	AHD_PACED_NEGTABLE_BUG	= 0x40000,
+	AHD_PACED_NEGTABLE_BUG	= 0x80000,
 	/* LQOOVERRUN false positives. */
-	AHD_LQOOVERRUN_BUG	= 0x80000,
+	AHD_LQOOVERRUN_BUG	= 0x100000,
 	/*
 	 * Controller write to INTSTAT will lose to a host
 	 * write to CLRINT.
 	 */
-	AHD_INTCOLLISION_BUG	= 0x100000
+	AHD_INTCOLLISION_BUG	= 0x200000,
+	/*
+	 * The GEM318 violates the SCSI spec by not waiting
+	 * the mandated bus settle delay between phase changes
+	 * in some situations.  Some aic79xx chip revs. are more
+	 * strict in this regard and will treat REQ assertions
+	 * that fall within the bus settle delay window as
+	 * glitches.  This flag tells the firmware to tolerate
+	 * early REQ assertions.
+	 */
+	AHD_EARLY_REQ_BUG	= 0x400000,
+	/*
+	 * The LED does not stay on long enough in packetized modes.
+	 */
+	AHD_FAINT_LED_BUG	= 0x800000
 } ahd_bug;
 
 /*
@@ -319,10 +336,7 @@
  */
 typedef enum {
 	AHD_FNONE	      = 0x00000,
-	AHD_PRIMARY_CHANNEL   = 0x00003,/*
-					 * The channel that should
-					 * be probed first.
-					 */
+	AHD_BOOT_CHANNEL      = 0x00001,/* We were set as the boot channel. */
 	AHD_USEDEFAULTS	      = 0x00004,/*
 					 * For cards without an seeprom
 					 * or a BIOS to initialize the chip's
@@ -411,7 +425,10 @@
 #define MAX_CDB_LEN 16
 #define MAX_CDB_LEN_WITH_SENSE_ADDR (MAX_CDB_LEN - sizeof(sense_addr_t))
 union initiator_data {
-	uint64_t cdbptr;
+	struct {
+		uint64_t cdbptr;
+		uint8_t  cdblen;
+	} cdb_from_host;
 	uint8_t	 cdb[MAX_CDB_LEN];
 	struct {
 		uint8_t	 cdb[MAX_CDB_LEN_WITH_SENSE_ADDR];
@@ -727,7 +744,7 @@
 
 #define AHD_WIDTH_UNKNOWN	0xFF
 #define AHD_PERIOD_UNKNOWN	0xFF
-#define AHD_OFFSET_UNKNOWN	0x0
+#define AHD_OFFSET_UNKNOWN	0xFF
 #define AHD_PPR_OPTS_UNKNOWN	0xFF
 
 /*
@@ -884,6 +901,40 @@
 	uint16_t checksum;		/* word 31 */
 };
 
+/*
+ * Vital Product Data used during POST and by the BIOS.
+ */
+struct vpd_config {
+	uint8_t  bios_flags;
+#define		VPDMASTERBIOS	0x0001
+#define		VPDBOOTHOST	0x0002
+	uint8_t  reserved_1[21];
+	uint8_t  resource_type;
+	uint8_t  resource_len[2];
+	uint8_t  resource_data[8];
+	uint8_t  vpd_tag;
+	uint16_t vpd_len;
+	uint8_t  vpd_keyword[2];
+	uint8_t  length;
+	uint8_t  revision;
+	uint8_t  device_flags;
+	uint8_t  termnation_menus[2];
+	uint8_t  fifo_threshold;
+	uint8_t  end_tag;
+	uint8_t  vpd_checksum;
+	uint16_t default_target_flags;
+	uint16_t default_bios_flags;
+	uint16_t default_ctrl_flags;
+	uint8_t  default_irq;
+	uint8_t  pci_lattime;
+	uint8_t  max_target;
+	uint8_t  boot_lun;
+	uint16_t signature;
+	uint8_t  reserved_2;
+	uint8_t  checksum;
+	uint8_t	 reserved_3[4];
+};
+
 /****************************** Flexport Logic ********************************/
 #define FLXADDR_TERMCTL			0x0
 #define		FLX_TERMCTL_ENSECHIGH	0x8
@@ -916,11 +967,12 @@
 #define		FLX_CSTAT_INVALID	0x3
 
 int		ahd_read_seeprom(struct ahd_softc *ahd, uint16_t *buf,
-				 u_int start_addr, u_int count);
+				 u_int start_addr, u_int count, int bstream);
 
 int		ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf,
 				  u_int start_addr, u_int count);
 int		ahd_wait_seeprom(struct ahd_softc *ahd);
+int		ahd_verify_vpd_cksum(struct vpd_config *vpd);
 int		ahd_verify_cksum(struct seeprom_config *sc);
 int		ahd_acquire_seeprom(struct ahd_softc *ahd);
 void		ahd_release_seeprom(struct ahd_softc *ahd);
@@ -1305,6 +1357,8 @@
 void			 ahd_controller_info(struct ahd_softc *ahd, char *buf);
 int			 ahd_init(struct ahd_softc *ahd);
 int			 ahd_default_config(struct ahd_softc *ahd);
+int			 ahd_parse_vpddata(struct ahd_softc *ahd,
+					   struct vpd_config *vpd);
 int			 ahd_parse_cfgdata(struct ahd_softc *ahd,
 					   struct seeprom_config *sc);
 void			 ahd_intr_enable(struct ahd_softc *ahd, int enable);
diff -Nru a/drivers/scsi/aic7xxx/aic79xx.reg b/drivers/scsi/aic7xxx/aic79xx.reg
--- a/drivers/scsi/aic7xxx/aic79xx.reg	Sat Apr 19 19:51:50 2003
+++ b/drivers/scsi/aic7xxx/aic79xx.reg	Sat Apr 19 19:51:50 2003
@@ -39,7 +39,7 @@
  *
  * $FreeBSD$
  */
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#60 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#65 $"
 
 /*
  * This file is processed by the aic7xxx_asm utility for use in assembling
@@ -2071,14 +2071,14 @@
 	address			0x051
 	access_mode	RW
 	modes		M_CFG
-	field	ENLQIPHASE_LQ	0x80
-	field	ENLQIPHASE_NLQ	0x40
+	field	ENLQIPHASE_LQ	0x80	/* LQIPHASE1 */
+	field	ENLQIPHASE_NLQ	0x40	/* LQIPHASE2 */
 	field	ENLIQABORT	0x20
-	field	ENLQICRCI_LQ	0x10
-	field	ENLQICRCI_NLQ	0x08
+	field	ENLQICRCI_LQ	0x10	/* LQICRCI1 */
+	field	ENLQICRCI_NLQ	0x08	/* LQICRCI2 */
 	field	ENLQIBADLQI	0x04
-	field	ENLQIOVERI_LQ	0x02
-	field	ENLQIOVERI_NLQ	0x01
+	field	ENLQIOVERI_LQ	0x02	/* LQIOVERI1 */
+	field	ENLQIOVERI_NLQ	0x01	/* LQIOVERI2 */
 }
 
 /*
@@ -2545,10 +2545,10 @@
 const	AHD_SLEWRATE_MASK	0x78
 const	AHD_SLEWRATE_SHIFT	3
 /*
- * Rev A has only a single bit of slew adjustment.
- * Rev B has 4 bits.
+ * Rev A has only a single bit (high bit of field) of slew adjustment.
+ * Rev B has 4 bits.  The current default happens to be the same for both.
  */
-const	AHD_SLEWRATE_DEF_REVA	0x01
+const	AHD_SLEWRATE_DEF_REVA	0x08
 const	AHD_SLEWRATE_DEF_REVB	0x08
 
 /* Rev A does not have any amplitude setting. */
@@ -3769,16 +3769,17 @@
 	SCB_RESIDUAL_DATACNT {
 		size	4
 		alias	SCB_CDB_STORE
+		alias	SCB_HOST_CDB_PTR
 	}
 	SCB_RESIDUAL_SGPTR {
 		size	4
-		alias	SCB_CDB_PTR
 		field	SG_ADDR_MASK		0xf8	/* In the last byte */
 		field	SG_OVERRUN_RESID	0x02	/* In the first byte */
 		field	SG_LIST_NULL		0x01	/* In the first byte */
 	}
 	SCB_SCSI_STATUS {
 		size	1
+		alias	SCB_HOST_CDB_LEN
 	}
 	SCB_TARGET_PHASES {
 		size	1
diff -Nru a/drivers/scsi/aic7xxx/aic79xx.seq b/drivers/scsi/aic7xxx/aic79xx.seq
--- a/drivers/scsi/aic7xxx/aic79xx.seq	Sat Apr 19 19:51:50 2003
+++ b/drivers/scsi/aic7xxx/aic79xx.seq	Sat Apr 19 19:51:50 2003
@@ -40,7 +40,7 @@
  * $FreeBSD$
  */
 
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#78 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#89 $"
 PATCH_ARG_LIST = "struct ahd_softc *ahd"
 PREFIX = "ahd_"
 
@@ -89,6 +89,13 @@
 idle_loop_check_nonpackreq:
 	test	SSTAT2, NONPACKREQ jz . + 2;
 	call	unexpected_nonpkt_phase_find_ctxt;
+	if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
+		and	A, FIFO0FREE|FIFO1FREE, DFFSTAT;
+		cmp	A, FIFO0FREE|FIFO1FREE jne . + 3;
+		and	SBLKCTL, ~DIAGLEDEN|DIAGLEDON;
+		jmp	. + 2;
+		or	SBLKCTL, DIAGLEDEN|DIAGLEDON;
+	}
 	call	idle_loop_gsfifo_in_scsi_mode;
 	call	idle_loop_service_fifos;
 	call	idle_loop_cchan;
@@ -122,22 +129,24 @@
 	/*
 	 * Since this status did not consume a FIFO, we have to
 	 * be a bit more dilligent in how we check for FIFOs pertaining
-	 * to this transaction.  There are three states that a FIFO still
+	 * to this transaction.  There are two states that a FIFO still
 	 * transferring data may be in.
 	 *
-	 * 1) Configured and draining to the host, with a pending CLRCHN.
-	 * 2) Configured and draining to the host, no pending CLRCHN.
-	 * 3) Pending cfg4data, fifo not empty.
+	 * 1) Configured and draining to the host, with a FIFO handler.
+	 * 2) Pending cfg4data, fifo not empty.
 	 *
-	 * Cases 1 and 2 can be detected by noticing that a longjmp is
-	 * active for the FIFO and LONGJMP_SCB matches our SCB.  In this
-	 * case, we allow the routine servicing the FIFO to complete the SCB.
+	 * Case 1 can be detected by noticing that a longjmp is active for
+	 * the FIFO and LONGJMP_SCB matches our SCB.  In this case, we allow
+	 * the routine servicing the FIFO to complete the SCB.
 	 * 
-	 * Case 3 implies either a pending or yet to occur save data
+	 * Case 2 implies either a pending or yet to occur save data
 	 * pointers for this same context in the other FIFO.  So, if
-	 * we detect case 2, we will properly defer the post of the SCB
+	 * we detect case 1, we will properly defer the post of the SCB
 	 * and achieve the desired result.  The pending cfg4data will
 	 * notice that status has been received and complete the SCB.
+	 *
+	 * If the data-transfer has been completed, or no data transfer
+	 * was needed for this SCB, it is safe to complete the command.
 	 */
 	test	SCB_SGPTR, SG_LIST_NULL jz good_status_check_fifos;
 	/*
@@ -519,7 +528,7 @@
 		/*
 		 * For packetized, the LQO manager clears ENSELO on
 		 * the assertion of SELDO.  If we are non-packetized,
-		 * LASTSCB and CURRSCB are acuate.
+		 * LASTSCB and CURRSCB are accurate.
 		 */
 		test	SCSISEQ0, ENSELO jnz use_lastscb;
 
@@ -706,7 +715,7 @@
 	add	NONE, -17, SCB_CDB_LEN;
 	jnc	p_command_embedded;
 p_command_from_host:
-	bmov	HADDR[0], SCB_CDB_PTR, 11;
+	bmov	HADDR[0], SCB_HOST_CDB_PTR, 9;
 	mvi	SG_CACHE_PRE, LAST_SEG;
 	mvi	DFCNTRL, (PRELOADEN|SCSIEN|HDMAEN);
 	jmp	p_command_xfer;
@@ -1030,14 +1039,6 @@
 	SET_MODE(M_SCSI, M_SCSI)
 	bmov	SCBPTR, ARG_1, 2;
 queue_scb_completion:
-	if ((ahd->bugs & AHD_ABORT_LQI_BUG) == 0) {
-		/*
-		 * Set MK_MESSAGE to trigger an abort should this SCB
-		 * be referenced by a target even though it is not currently
-		 * active.
-		 */
-		or	SCB_CONTROL, MK_MESSAGE;
-	}
 	test	SCB_SCSI_STATUS,0xff	jnz bad_status;
 	/*
 	 * Check for residuals
@@ -1163,7 +1164,28 @@
 	mvi	SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT ret;
 
 phase_lock:     
-	test	SCSIPHASE, 0xFF jz .;
+	if ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0) {
+		/*
+		 * Don't ignore persistent REQ assertions just because
+		 * they were asserted within the bus settle delay window.
+		 * This allows us to tolerate devices like the GEM318
+		 * that violate the SCSI spec.  We are careful not to
+		 * count REQ while we are waiting for it to fall during
+		 * an async phase due to our asserted ACK.  Each
+		 * sequencer instruction takes ~25ns, so the REQ must
+		 * last at least 100ns in order to be counted as a true
+		 * REQ.
+		 */
+		test	SCSIPHASE, 0xFF jnz phase_locked;
+		test	SCSISIGI, ACKI jnz phase_lock;
+		test	SCSISIGI, REQI jz phase_lock;
+		test	SCSIPHASE, 0xFF jnz phase_locked;
+		test	SCSISIGI, ACKI jnz phase_lock;
+		test	SCSISIGI, REQI jz phase_lock;
+phase_locked:
+	} else {
+		test	SCSIPHASE, 0xFF jz .;
+	}
 	test	SSTAT1, SCSIPERR jnz phase_lock;
 phase_lock_latch_phase:
 	and	LASTPHASE, PHASE_MASK, SCSISIGI ret;
@@ -1247,7 +1269,7 @@
 		nop;
 	}
 	and	SGHADDR[0], SG_PREFETCH_ALIGN_MASK, SCB_RESIDUAL_SGPTR;
-	mvi	CCSGCTL, CCSGEN|SG_CACHE_AVAIL|CCSGRESET;
+	mvi	CCSGCTL, CCSGEN|CCSGRESET;
 	or	SG_STATE, FETCH_INPROG ret;
 idle_sgfetch_complete:
 	/*
@@ -1261,6 +1283,15 @@
 idle_sg_avail:
 	/* Does the hardware have space for another SG entry? */
 	test	DFSTATUS, PRELOAD_AVAIL jz return;
+	/*
+	 * On the A, preloading a segment before HDMAENACK
+	 * comes true can clobber the shaddow address of the
+	 * first segment in the S/G FIFO.  Wait until it is
+	 * safe to proceed.
+	 */
+	if ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0) {
+		test	DFCNTRL, HDMAENACK jz return;
+	}
 	if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
 		bmov	HADDR, CCSGRAM, 8;
 	} else {
@@ -1290,22 +1321,12 @@
 	or	SINDEX, LAST_SEG;
 	clr	SG_STATE;
 	mov	SG_CACHE_PRE, SINDEX;
-	/*
-	 * Load the segment.  Or in HDMAEN here too
-	 * just in case HDMAENACK has not come true
-	 * by the time this segment is loaded.  If
-	 * HDMAENACK is not true, this or will disable
-	 * HDMAEN mid-transfer.  We do not want to simply
-	 * mvi our original settings as SCSIEN automatically
-	 * de-asserts and we don't want to accidentally
-	 * re-enable it.
-	 */
 	if ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0) {
 		/*
 		 * Use SCSIENWRDIS so that SCSIEN is never
 		 * modified by this operation.
 		 */
-		or	DFCNTRL, PRELOADEN|SCSIENWRDIS|HDMAEN;
+		or	DFCNTRL, PRELOADEN|HDMAEN|SCSIENWRDIS;
 	} else {
 		or	DFCNTRL, PRELOADEN|HDMAEN;
 	}
@@ -1510,12 +1531,6 @@
  * the idle loop and there is no need to perform
  * any fixups.
  */
-calc_residual:
-	test	SG_CACHE_SHADOW, LAST_SEG jz residual_before_last_seg;
-	/* Record if we've consumed all S/G entries */
-	test	MDFFSTAT, SHVALID	jz . + 2;
-	bmov	SCB_RESIDUAL_DATACNT, SHCNT, 3 ret;
-	or	SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL ret;
 residual_before_last_seg:
 	test    MDFFSTAT, SHVALID	jnz sgptr_fixup;
 	/*
@@ -1525,7 +1540,13 @@
 	 */
 	call	idle_loop_service_fifos;
 	RESTORE_MODE(SAVED_MODE)
-	jmp	calc_residual;
+	/* FALLTHROUGH */
+calc_residual:
+	test	SG_CACHE_SHADOW, LAST_SEG jz residual_before_last_seg;
+	/* Record if we've consumed all S/G entries */
+	test	MDFFSTAT, SHVALID	jz . + 2;
+	bmov	SCB_RESIDUAL_DATACNT, SHCNT, 3 ret;
+	or	SCB_RESIDUAL_SGPTR[0], SG_LIST_NULL ret;
 
 sgptr_fixup:
 	/*
@@ -1570,7 +1591,51 @@
 	}
 
 export seq_isr:
-	nop;	/* Jumps in the first ISR instruction fail on Rev A. */
+	if ((ahd->features & AHD_RTI) == 0) {
+		/*
+		 * On RevA Silicon, if the target returns us to data-out
+		 * after we have already trained for data-out, it is
+		 * possible for us to transition the free running clock to
+		 * data-valid before the required 100ns P1 setup time (8 P1
+		 * assertions in fast-160 mode).  This will only happen if
+		 * this L-Q is a continuation of a data transfer for which
+		 * we have already prefetched data into our FIFO (LQ/Data
+		 * followed by LQ/Data for the same write transaction).
+		 * This can cause some target implementations to miss the
+		 * first few data transfers on the bus.  We detect this
+		 * situation by noticing that this is the first data transfer
+		 * after an LQ (LQIWORKONLQ true), that the data transfer is
+		 * a continuation of a transfer already setup in our FIFO
+		 * (SAVEPTRS interrupt), and that the transaction is a write
+		 * (DIRECTION set in DFCNTRL). The delay is performed by
+		 * disabling SCSIEN until we see the first REQ from the
+		 * target.
+		 * 
+		 * First instruction in an ISR cannot be a branch on
+		 * Rev A.  Snapshot LQISTAT2 so the status is not missed
+		 * and deffer the test by one instruction.
+		 */
+		mov	REG_ISR, LQISTAT2;
+		test	REG_ISR, LQIWORKONLQ jz data_valid;
+		test	SEQINTSRC, SAVEPTRS  jz data_valid;
+		test	LONGJMP_ADDR[1], INVALID_ADDR jz saveptr_active_fifo;
+		/*
+		 * Switch to the active FIFO.
+		 */
+		xor	MODE_PTR, MK_MODE(M_DFF1, M_DFF1);
+		test	DFCNTRL, DIRECTION jz snapshot_other_fifo;
+		and	DFCNTRL, ~SCSIEN;
+		test	SSTAT1, REQINIT	jz .;
+		or	DFCNTRL, SCSIEN;
+		/* FALLTHROUGH */
+snapshot_other_fifo:
+		xor	MODE_PTR, MK_MODE(M_DFF1, M_DFF1);
+		/* FALLTHROUGH */
+snapshot_saveptr:
+		mvi	DFFSXFRCTL, CLRCHN;
+		or	SEQINTCTL, IRET ret;
+data_valid:
+	}
 	test	SEQINTSRC, CFG4DATA	jnz cfg4data_intr;
 	test	SEQINTSRC, CFG4ISTAT	jnz cfg4istat_intr;
 	test	SEQINTSRC, SAVEPTRS	jnz saveptr_intr;
@@ -1583,21 +1648,23 @@
  * active and contains a snapshot of the current poniter information.
  * This happens between packets in a stream for a single L_Q.  Since we
  * are not performing a pointer save, we can safely clear the channel
- * so it can be used for other transactions.
+ * so it can be used for other transactions.  On RTI capable controllers,
+ * where snapshots can, and are, disabled, the code to handle this type
+ * of snapshot is not active.
  *
  * The second case is a save pointers on an active FIFO which occurs
- * if the target changes to a new L_Q or busfrees/QAS' and the transfer
+ * if the target changes to a new L_Q or busfrees/QASes and the transfer
  * has a residual.  This should occur coincident with a ctxtdone.  We
  * disable the interrupt and allow our active routine to handle the
  * save.
  */
 saveptr_intr:
-	test	DFCNTRL, HDMAENACK jz snapshot_saveptr;
+	if ((ahd->features & AHD_RTI) == 0) {
+		test	LONGJMP_ADDR[1], INVALID_ADDR jnz snapshot_saveptr;
+	}
+saveptr_active_fifo:
 	and	SEQIMODE, ~ENSAVEPTRS;
 	or	SEQINTCTL, IRET ret;
-snapshot_saveptr:
-	mvi	DFFSXFRCTL, CLRCHN;
-	or	SEQINTCTL, IRET ret;
 
 cfg4data_intr:
 	test	SCB_SGPTR[0], SG_LIST_NULL jnz pkt_handle_overrun;
@@ -1633,6 +1700,18 @@
 	call	pkt_handle_status;
 	or	SEQINTCTL, IRET ret;
 
+cfg4icmd_intr:
+	/*
+	 * In the case of DMAing a CDB from the host, the normal
+	 * CDB buffer is formatted with an 8 byte address followed
+	 * by a 1 byte count.
+	 */
+	bmov	HADDR[0], SCB_HOST_CDB_PTR, 9;
+	mvi	SG_CACHE_PRE, LAST_SEG;
+	mvi	DFCNTRL, (PRELOADEN|SCSIEN|HDMAEN);
+	call	pkt_handle_cdb;
+	or	SEQINTCTL, IRET ret;
+
 /*
  * See if the target has gone on in this context creating an
  * overrun condition.  For the write case, the hardware cannot
@@ -1672,7 +1751,7 @@
 pkt_last_seg:
 	call	setjmp;
 	test	SEQINTSRC, SAVEPTRS jnz pkt_saveptrs;
-	test	SG_CACHE_SHADOW, LAST_SEG_DONE jnz last_pkt_done;
+	test	SG_CACHE_SHADOW, LAST_SEG_DONE jnz last_pkt_xfer_done;
 	test	SCSIPHASE, ~DATA_PHASE_MASK jz . + 2;
 	test	SCSISIGO, ATNO jnz . + 2;
 	test	SSTAT2, NONPACKREQ jz return;
@@ -1716,7 +1795,7 @@
 	mvi	DFFSXFRCTL, CLRCHN ret;
 END_CRITICAL;
 
-last_pkt_done:
+last_pkt_xfer_done:
 BEGIN_CRITICAL;
 	if ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0) {
 		or	DFCNTRL, FIFOFLUSH;
@@ -1765,13 +1844,15 @@
 	mvi	DFFSXFRCTL, CLRCHN ret;
 END_CRITICAL;
 
-check_status_overrun:
-	test	SHCNT[2], 0xFF jz status_IU_done;
-	SET_SEQINTCODE(STATUS_OVERRUN)
-	jmp	status_IU_done;
+/*
+ * Watch over the status transfer.  Our host sense buffer is
+ * large enough to take the maximum allowed status packet.
+ * None-the-less, we must still catch and report overruns to
+ * the host.
+ */
 pkt_handle_status:
 	call	setjmp_setscb;
-	test	MDFFSTAT, LASTSDONE jnz check_status_overrun;
+	test	SG_CACHE_SHADOW, LAST_SEG_DONE jz check_status_overrun;
 	test	SEQINTSRC, CTXTDONE jz return;
 status_IU_done:
 BEGIN_CRITICAL;
@@ -1783,6 +1864,21 @@
 	or	SCB_CONTROL, STATUS_RCVD;
 	jmp	last_pkt_complete;
 END_CRITICAL;
+check_status_overrun:
+	/*
+	 * We've filled the entire sense buffer.
+	 * Wait for either context done or a negative
+	 * shaddow count.  If the context completes without
+	 * causing the shaddow count to go negative, then
+	 * this was a successful transfer up to the status
+	 * limit.  Otherwise we report the error.
+	 */
+	test	SHCNT[2], 0xFF jnz report_status_overrun;
+	test	SEQINTSRC, CTXTDONE jz return;
+	test	SHCNT[2], 0xFF jz status_IU_done;
+report_status_overrun:
+	SET_SEQINTCODE(STATUS_OVERRUN)
+	jmp	status_IU_done;
 
 SET_SRC_MODE	M_DFF0;
 SET_DST_MODE	M_DFF0;
@@ -1797,6 +1893,16 @@
 END_CRITICAL;
 
 /*
+ * Must wait until CDB xfer is over before issuing the
+ * clear channel.
+ */
+pkt_handle_cdb:
+	call	setjmp_setscb;
+	test	SG_CACHE_SHADOW, LAST_SEG_DONE jz return;
+	or	LONGJMP_ADDR[1], INVALID_ADDR;
+	mvi	DFFSXFRCTL, CLRCHN ret;
+
+/*
  * Nonpackreq is a polled status.  It can come true in three situations:
  * we have received an L_Q, we have sent one or more L_Qs, or there is no
  * L_Q context associated with this REQ (REQ occurs immediately after a
@@ -1865,6 +1971,7 @@
 	or	SCB_RESIDUAL_SGPTR, SG_OVERRUN_RESID;
 	test	SEQINTSRC, CTXTDONE jz unexpected_nonpkt_phase;
 	test	SCB_CONTROL, STATUS_RCVD jnz last_pkt_queue_scb;
+	or	LONGJMP_ADDR[1], INVALID_ADDR;
 	mvi	DFFSXFRCTL, CLRCHN ret;
 
 if ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0) {
@@ -1885,5 +1992,3 @@
 	mvi	HCNT[1], ((PKT_OVERRUN_BUFSIZE >> 8) & 0xFF);
 	clr	HCNT[2] ret;
 }
-
-cfg4icmd_intr:
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c
--- a/drivers/scsi/aic7xxx/aic79xx_core.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_core.c	Sat Apr 19 19:51:27 2003
@@ -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#156 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#178 $
  *
  * $FreeBSD$
  */
@@ -406,7 +406,7 @@
 		u_int	 i;
 		
 		ahd_set_scbptr(ahd, scbid);
-		next_scbid = ahd_inw(ahd, SCB_NEXT_COMPLETE);
+		next_scbid = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
 		scb = ahd_lookup_scb(ahd, scbid);
 		if (scb == NULL) {
 			printf("%s: Warning - DMA-up and complete "
@@ -415,7 +415,7 @@
 		}
 		hscb_ptr = (uint8_t *)scb->hscb;
 		for (i = 0; i < sizeof(struct hardware_scb); i++)
-			*hscb_ptr++ = ahd_inb(ahd, SCB_BASE + i);
+			*hscb_ptr++ = ahd_inb_scbram(ahd, SCB_BASE + i);
 
 		ahd_complete_scb(ahd, scb);
 		scbid = next_scbid;
@@ -426,7 +426,7 @@
 	while (!SCBID_IS_NULL(scbid)) {
 
 		ahd_set_scbptr(ahd, scbid);
-		next_scbid = ahd_inw(ahd, SCB_NEXT_COMPLETE);
+		next_scbid = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
 		scb = ahd_lookup_scb(ahd, scbid);
 		if (scb == NULL) {
 			printf("%s: Warning - Complete SCB %d invalid\n",
@@ -1249,6 +1249,14 @@
 		ahd_outb(ahd, CLRSINT3, status3);
 	} else if ((lqistat1 & (LQIPHASE_LQ|LQIPHASE_NLQ)) != 0) {
 		ahd_handle_lqiphase_error(ahd, lqistat1);
+	} else if ((lqistat1 & LQICRCI_NLQ) != 0) {
+		/*
+		 * This status can be delayed during some
+		 * streaming operations.  The SCSIPHASE
+		 * handler has already dealt with this case
+		 * so just clear the error.
+		 */
+		ahd_outb(ahd, CLRLQIINT1, CLRLQICRCI_NLQ);
 	} else if ((status & BUSFREE) != 0) {
 		u_int lqostat1;
 		int   restart;
@@ -1284,9 +1292,9 @@
 			scbid = ahd_get_scbptr(ahd);
 			scb = ahd_lookup_scb(ahd, scbid);
 			if (scb == NULL) {
-				printf("%s: Invalid SCB in DFF%d "
+				printf("%s: Invalid SCB %d in DFF%d "
 				       "during unexpected busfree\n",
-				       ahd_name(ahd), mode);
+				       ahd_name(ahd), scbid, mode);
 				packetized = 0;
 			} else
 				packetized = (scb->flags & SCB_PACKETIZED) != 0;
@@ -1627,23 +1635,24 @@
 		if (scb == NULL)
 		       panic("SCB not valid during LQOBUSFREE");
 		/*
-		 * Return the LQO manager to its idle loop.  It will
-		 * not do this automatically if the busfree occurs
-		 * after the first REQ of either the LQ or command
-		 * packet or between the LQ and command packet.
-		 */
-		ahd_outb(ahd, LQCTL2, ahd_inb(ahd, LQCTL2) | LQOTOIDLE);
-
-		/*
 		 * Clear the status.
 		 */
 		ahd_outb(ahd, CLRLQOINT1, CLRLQOBUSFREE);
 		if ((ahd->bugs & AHD_CLRLQO_AUTOCLR_BUG) != 0)
 			ahd_outb(ahd, CLRLQOINT1, 0);
 		ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO);
+		ahd_flush_device_writes(ahd);
 		ahd_outb(ahd, CLRSINT0, CLRSELDO);
 
 		/*
+		 * Return the LQO manager to its idle loop.  It will
+		 * not do this automatically if the busfree occurs
+		 * after the first REQ of either the LQ or command
+		 * packet or between the LQ and command packet.
+		 */
+		ahd_outb(ahd, LQCTL2, ahd_inb(ahd, LQCTL2) | LQOTOIDLE);
+
+		/*
 		 * Update the waiting for selection queue so
 		 * we restart on the correct SCB.
 		 */
@@ -1653,12 +1662,12 @@
 
 			ahd_outw(ahd, WAITING_TID_HEAD, scbid);
 			waiting_t = ahd_inw(ahd, WAITING_TID_TAIL);
-			next = SCB_LIST_NULL;
 			if (waiting_t == waiting_h) {
 				ahd_outw(ahd, WAITING_TID_TAIL, scbid);
+				next = SCB_LIST_NULL;
 			} else {
 				ahd_set_scbptr(ahd, waiting_h);
-				next = ahd_inw(ahd, SCB_NEXT2);
+				next = ahd_inw_scbram(ahd, SCB_NEXT2);
 			}
 			ahd_set_scbptr(ahd, scbid);
 			ahd_outw(ahd, SCB_NEXT2, next);
@@ -1704,6 +1713,7 @@
 		scb = ahd_lookup_scb(ahd, scbid);
 		ahd_print_path(ahd, scb);
 		printf("Unexpected PKT busfree condition\n");
+		ahd_dump_card_state(ahd);
 		ahd_abort_scbs(ahd, SCB_GET_TARGET(ahd, scb), 'A',
 			       SCB_GET_LUN(scb), SCB_GET_TAG(scb),
 			       ROLE_INITIATOR, CAM_UNEXP_BUSFREE);
@@ -1988,7 +1998,8 @@
 		if ((seq_flags & NO_CDB_SENT) != 0) {
 			ahd_print_path(ahd, scb);
 			printf("No or incomplete CDB sent to device.\n");
-		} else if ((ahd_inb(ahd, SCB_CONTROL) & STATUS_RCVD) == 0) {
+		} else if ((ahd_inb_scbram(ahd, SCB_CONTROL)
+			  & STATUS_RCVD) == 0) {
 			/*
 			 * The target never bothered to provide status to
 			 * us prior to completing the command.  Since we don't
@@ -2605,8 +2616,12 @@
 				       ahd_name(ahd), devinfo->target,
 				       period, offset);
 				options = 0;
+				if ((ppr_options & MSG_EXT_PPR_RD_STRM) != 0) {
+					printf("(RDSTRM");
+					options++;
+				}
 				if ((ppr_options & MSG_EXT_PPR_DT_REQ) != 0) {
-					printf("(DT");
+					printf("%s", options ? "|DT" : "(DT");
 					options++;
 				}
 				if ((ppr_options & MSG_EXT_PPR_IU_REQ) != 0) {
@@ -4817,9 +4832,6 @@
 				slave->flags &= ~AHD_BIOS_ENABLED; 
 				slave->flags |=
 				    master->flags & AHD_BIOS_ENABLED;
-				slave->flags &= ~AHD_PRIMARY_CHANNEL; 
-				slave->flags |=
-				    master->flags & AHD_PRIMARY_CHANNEL;
 				break;
 			}
 		}
@@ -4831,7 +4843,7 @@
 	 */
 	list_ahd = TAILQ_FIRST(&ahd_tailq);
 	while (list_ahd != NULL
-	    && ahd_softc_comp(list_ahd, ahd) <= 0)
+	    && ahd_softc_comp(ahd, list_ahd) <= 0)
 		list_ahd = TAILQ_NEXT(list_ahd, links);
 	if (list_ahd != NULL)
 		TAILQ_INSERT_BEFORE(list_ahd, ahd, links);
@@ -4980,6 +4992,8 @@
 	 * to disturb the integrity of the bus.
 	 */
 	ahd_pause(ahd);
+	ahd_update_modes(ahd);
+	ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
 	sxfrctl1 = ahd_inb(ahd, SXFRCTL1);
 
 	cmd = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
@@ -5028,13 +5042,16 @@
 		ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
 				     cmd, /*bytes*/2);
 	}
-	/* After a reset, we know the state of the mode register. */
-	ahd_known_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
 
-	/* Determine chip configuration */
-	ahd->features &= ~AHD_WIDE;
-	if ((ahd_inb(ahd, SBLKCTL) & SELWIDE) != 0)
-		ahd->features |= AHD_WIDE;
+	/*
+	 * Mode should be SCSI after a chip reset, but lets
+	 * set it just to be safe.  We touch the MODE_PTR
+	 * register directly so as to bypass the lazy update
+	 * code in ahd_set_modes().
+	 */
+	ahd_known_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
+	ahd_outb(ahd, MODE_PTR,
+		 ahd_build_mode_state(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI));
 
 	/*
 	 * Restore SXFRCTL1.
@@ -5047,9 +5064,14 @@
 	ahd_outb(ahd, SXFRCTL1, sxfrctl1|STPWEN);
 	ahd_outb(ahd, SXFRCTL1, sxfrctl1);
 
+	/* Determine chip configuration */
+	ahd->features &= ~AHD_WIDE;
+	if ((ahd_inb(ahd, SBLKCTL) & SELWIDE) != 0)
+		ahd->features |= AHD_WIDE;
+
 	/*
 	 * If a recovery action has forced a chip reset,
-	 * re-initialize the chip to our likeing.
+	 * re-initialize the chip to our liking.
 	 */
 	if (ahd->init_level > 0)
 		ahd_chip_init(ahd);
@@ -5158,7 +5180,7 @@
 	scb_data->init_level++;
 
 	/* DMA tag for our S/G structures. */
-	if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
+	if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/8,
 			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
 			       /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
@@ -5793,7 +5815,9 @@
 	/* DMA tag for mapping buffers into device visible space. */
 	if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
 			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
-			       /*lowaddr*/BUS_SPACE_MAXADDR,
+			       /*lowaddr*/ahd->flags & AHD_39BIT_ADDRESSING
+					? (bus_addr_t)0x7FFFFFFFFFULL
+					: BUS_SPACE_MAXADDR_32BIT,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
 			       /*filter*/NULL, /*filterarg*/NULL,
 			       /*maxsize*/(AHD_NSEG - 1) * PAGE_SIZE,
@@ -6050,7 +6074,7 @@
 	} else {
 		ahd_outb(ahd, OPTIONMODE, AUTOACKEN|BUSFREEREV|AUTO_MSGOUT_DE);
 	}
-	ahd_outb(ahd, SCSCHKN, CURRFIFODEF|WIDERESEN);
+	ahd_outb(ahd, SCSCHKN, CURRFIFODEF|WIDERESEN|SHVALIDSTDIS);
 	if ((ahd->chip & AHD_BUS_MASK) == AHD_PCIX)
 		/*
 		 * Do not issue a target abort when a split completion
@@ -6341,7 +6365,7 @@
 #else
 		tinfo->user.period = AHD_SYNCRATE_160;
 #endif
-		tinfo->user.offset= ~0;
+		tinfo->user.offset = MAX_OFFSET;
 		tinfo->user.ppr_options = MSG_EXT_PPR_RD_STRM
 					| MSG_EXT_PPR_WR_FLOW
 					| MSG_EXT_PPR_HOLD_MCS
@@ -6508,6 +6532,22 @@
 	return (0);
 }
 
+/*
+ * Parse device configuration information.
+ */
+int
+ahd_parse_vpddata(struct ahd_softc *ahd, struct vpd_config *vpd)
+{
+	int error;
+
+	error = ahd_verify_vpd_cksum(vpd);
+	if (error == 0)
+		return (EINVAL);
+	if ((vpd->bios_flags & VPDBOOTHOST) != 0)
+		ahd->flags |= AHD_BOOT_CHANNEL;
+	return (0);
+}
+
 void
 ahd_intr_enable(struct ahd_softc *ahd, int enable)
 {
@@ -6565,13 +6605,13 @@
 void
 ahd_pause_and_flushwork(struct ahd_softc *ahd)
 {
-	u_int intstat;
-	u_int maxloops;
-	int   paused;
+	ahd_mode_state	saved_modes;
+	u_int		intstat;
+	u_int		maxloops;
+	int		paused;
 
 	maxloops = 1000;
 	ahd->flags |= AHD_ALL_INTERRUPTS;
-	intstat = 0;
 	paused = FALSE;
 	do {
 		struct scb *waiting_scb;
@@ -6582,6 +6622,8 @@
 		ahd_pause(ahd);
 		paused = TRUE;
 		ahd_clear_critical_section(ahd);
+		saved_modes = ahd_save_modes(ahd);
+		ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
 		if ((ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO)) == 0)
 			ahd_outb(ahd, SCSISEQ0,
 				 ahd_inb(ahd, SCSISEQ0) & ~ENSELO);
@@ -6598,10 +6640,10 @@
 			ahd_outb(ahd, SCSISEQ0,
 				 ahd_inb(ahd, SCSISEQ0) | ENSELO);
 
-		if (intstat == 0xFF && (ahd->features & AHD_REMOVABLE) != 0)
-			break;
+		intstat = ahd_inb(ahd, INTSTAT);
 	} while (--maxloops
-	      && (((intstat = ahd_inb(ahd, INTSTAT)) & INT_PEND) != 0
+	      && (intstat != 0xFF || (ahd->features & AHD_REMOVABLE) == 0)
+	      && ((intstat & INT_PEND) != 0
 	       || (ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO))));
 	if (maxloops == 0) {
 		printf("Infinite interrupt loop, INTSTAT = %x",
@@ -6612,6 +6654,7 @@
 
 	ahd_platform_flushwork(ahd);
 	ahd->flags &= ~AHD_ALL_INTERRUPTS;
+	ahd_restore_modes(ahd, saved_modes);
 }
 
 int
@@ -6785,7 +6828,6 @@
 
 /*
  * Return the untagged transaction id for a given target/channel lun.
- * Optionally, clear the entry.
  */
 u_int
 ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl)
@@ -7295,7 +7337,6 @@
 {
 	struct		scb *scbp;
 	struct		scb *scbp_next;
-	u_int		active_scb;
 	u_int		i, j;
 	u_int		maxtarget;
 	u_int		minlun;
@@ -7303,11 +7344,10 @@
 	int		found;
 	ahd_mode_state	saved_modes;
 
-	/* restore these when we're done */
-	active_scb = ahd_get_scbptr(ahd);
+	/* restore this when we're done */
 	saved_modes = ahd_save_modes(ahd);
-
 	ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
+
 	found = ahd_search_qinfifo(ahd, target, channel, lun, SCB_LIST_NULL,
 				   role, CAM_REQUEUE_REQ, SEARCH_COMPLETE);
 
@@ -7381,7 +7421,6 @@
 			found++;
 		}
 	}
-	ahd_set_scbptr(ahd, active_scb);
 	ahd_restore_modes(ahd, saved_modes);
 	ahd_platform_abort_scbs(ahd, target, channel, lun, tag, role, status);
 	ahd->flags |= AHD_UPDATE_PEND_CMDS;
@@ -7670,7 +7709,6 @@
 {
 	struct hardware_scb *hscb;
 	u_int  qfreeze_cnt;
-	ahd_mode_state saved_modes;
 
 	/*
 	 * The sequencer freezes its select-out queue
@@ -7682,7 +7720,6 @@
 
 	/* Freeze the queue until the client sees the error. */
 	ahd_pause(ahd);
-	saved_modes = ahd_save_modes(ahd);
 	ahd_clear_critical_section(ahd);
 	ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
 	ahd_freeze_devq(ahd, scb);
@@ -8148,7 +8185,7 @@
 	/* Start by aligning to the nearest cacheline. */
 	sg_prefetch_align = ahd->pci_cachesize;
 	if (sg_prefetch_align == 0)
-		sg_prefetch_cnt = 8;
+		sg_prefetch_align = 8;
 	/* Round down to the nearest power of 2. */
 	while (powerof2(sg_prefetch_align) == 0)
 		sg_prefetch_align--;
@@ -8744,11 +8781,12 @@
 /*
  * Read count 16bit words from 16bit word address start_addr from the
  * SEEPROM attached to the controller, into buf, using the controller's
- * SEEPROM reading state machine.
+ * SEEPROM reading state machine.  Optionally treat the data as a byte
+ * stream in terms of byte order.
  */
 int
 ahd_read_seeprom(struct ahd_softc *ahd, uint16_t *buf,
-		 u_int start_addr, u_int count)
+		 u_int start_addr, u_int count, int bytestream)
 {
 	u_int cur_addr;
 	u_int end_addr;
@@ -8762,13 +8800,26 @@
 	AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
 	end_addr = start_addr + count;
 	for (cur_addr = start_addr; cur_addr < end_addr; cur_addr++) {
+
 		ahd_outb(ahd, SEEADR, cur_addr);
 		ahd_outb(ahd, SEECTL, SEEOP_READ | SEESTART);
 		
 		error = ahd_wait_seeprom(ahd);
 		if (error)
 			break;
-		*buf++ = ahd_inw(ahd, SEEDAT);
+		if (bytestream != 0) {
+			uint8_t *bytestream_ptr;
+
+			bytestream_ptr = (uint8_t *)buf;
+			*bytestream_ptr++ = ahd_inb(ahd, SEEDAT);
+			*bytestream_ptr = ahd_inb(ahd, SEEDAT+1);
+		} else {
+			/*
+			 * ahd_inw() already handles machine byte order.
+			 */
+			*buf = ahd_inw(ahd, SEEDAT);
+		}
+		buf++;
 	}
 	return (error);
 }
@@ -8839,6 +8890,38 @@
 	if (cnt == 0)
 		return (ETIMEDOUT);
 	return (0);
+}
+
+/*
+ * Validate the two checksums in the per_channel
+ * vital product data struct.
+ */
+int
+ahd_verify_vpd_cksum(struct vpd_config *vpd)
+{
+	int i;
+	int maxaddr;
+	uint32_t checksum;
+	uint8_t *vpdarray;
+
+	vpdarray = (uint8_t *)vpd;
+	maxaddr = offsetof(struct vpd_config, vpd_checksum);
+	checksum = 0;
+	for (i = offsetof(struct vpd_config, resource_type); i < maxaddr; i++)
+		checksum = checksum + vpdarray[i];
+	if (checksum == 0
+	 || (-checksum & 0xFF) != vpd->vpd_checksum)
+		return (0);
+
+	checksum = 0;
+	maxaddr = offsetof(struct vpd_config, checksum);
+	for (i = offsetof(struct vpd_config, default_target_flags);
+	     i < maxaddr; i++)
+		checksum = checksum + vpdarray[i];
+	if (checksum == 0
+	 || (-checksum & 0xFF) != vpd->checksum)
+		return (0);
+	return (1);
 }
 
 int
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_inline.h b/drivers/scsi/aic7xxx/aic79xx_inline.h
--- a/drivers/scsi/aic7xxx/aic79xx_inline.h	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_inline.h	Sat Apr 19 19:51:47 2003
@@ -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#41 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#44 $
  *
  * $FreeBSD$
  */
@@ -678,7 +678,8 @@
 	 * Razor #528
 	 */
 	value = ahd_inb(ahd, offset);
-	ahd_inb(ahd, MODE_PTR);
+	if ((ahd->flags & AHD_PCIX_SCBRAM_RD_BUG) != 0)
+		ahd_inb(ahd, MODE_PTR);
 	return (value);
 }
 
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c	Sat Apr 19 19:51:48 2003
@@ -1,7 +1,7 @@
 /*
  * Adaptec AIC79xx device driver for Linux.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#115 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.c#141 $
  *
  * --------------------------------------------------------------------------
  * Copyright (c) 1994-2000 Justin T. Gibbs.
@@ -460,12 +460,12 @@
 "		Set tag depth on Controller 2/Target 2 to 10 tags\n"
 "		Shorten the selection timeout to 128ms\n"
 "\n"
-"	options aic79xx='\"verbose.tag_info:{{}.{}.{..10}}.seltime:1\"'\n"
+"	options aic79xx 'aic79xx=verbose.tag_info:{{}.{}.{..10}}.seltime:1'\n"
 "\n"
 "	Sample /etc/modules.conf line:\n"
 "		Change Read Streaming for Controller's 2 and 3\n"
 "\n"
-"	options aic79xx='\"rd_strm:{..0xFFF0.0xC0F0}\"'");
+"	options aic79xx 'aic79xx=rd_strm:{..0xFFF0.0xC0F0}'");
 #endif
 
 static void ahd_linux_handle_scsi_status(struct ahd_softc *,
@@ -482,6 +482,7 @@
 static void ahd_linux_start_dv(struct ahd_softc *ahd);
 static void ahd_linux_dv_timeout(struct scsi_cmnd *cmd);
 static int  ahd_linux_dv_thread(void *data);
+static void ahd_linux_kill_dv_thread(struct ahd_softc *ahd);
 static void ahd_linux_dv_target(struct ahd_softc *ahd, u_int target);
 static void ahd_linux_dv_transition(struct ahd_softc *ahd,
 				    struct scsi_cmnd *cmd,
@@ -526,6 +527,7 @@
 static u_int ahd_linux_user_tagdepth(struct ahd_softc *ahd,
 				     struct ahd_devinfo *devinfo);
 static u_int ahd_linux_user_dv_setting(struct ahd_softc *ahd);
+static void ahd_linux_setup_user_rd_strm_settings(struct ahd_softc *ahd);
 static void ahd_linux_device_queue_depth(struct ahd_softc *ahd,
 					 struct ahd_linux_device *dev);
 static struct ahd_linux_target*	ahd_linux_alloc_target(struct ahd_softc*,
@@ -539,11 +541,11 @@
 						      struct ahd_linux_device*);
 static void ahd_linux_run_device_queue(struct ahd_softc*,
 				       struct ahd_linux_device*);
-static void ahd_linux_setup_tag_info(char *p, char *end, char *s);
 static void ahd_linux_setup_tag_info_global(char *p);
-static void ahd_linux_setup_rd_strm_info(char *p, char *end, char *s);
-static void ahd_linux_setup_dv(char *p, char *end, char *s);
-static void ahd_linux_setup_iocell_info(char *p, char *end, char *s, int index);
+static aic_option_callback_t ahd_linux_setup_tag_info;
+static aic_option_callback_t ahd_linux_setup_rd_strm_info;
+static aic_option_callback_t ahd_linux_setup_dv;
+static aic_option_callback_t ahd_linux_setup_iocell_info;
 static int ahd_linux_next_unit(void);
 static void ahd_runq_tasklet(unsigned long data);
 static int ahd_linux_halt(struct notifier_block *nb, u_long event, void *buf);
@@ -599,6 +601,9 @@
 	}
 }
 
+/*
+ * Must be called with our lock held.
+ */
 static __inline void
 ahd_schedule_runq(struct ahd_softc *ahd)
 {
@@ -662,8 +667,8 @@
 	u_long	done_flags;
 	int	with_errors;
 
-	ahd_done_lock(ahd, &done_flags);
 	with_errors = 0;
+	ahd_done_lock(ahd, &done_flags);
 	while (acmd != NULL) {
 		Scsi_Cmnd *cmd;
 
@@ -994,9 +999,13 @@
 				   cmd->device->id, cmd->device->lun,
 				   /*alloc*/TRUE);
 	if (dev == NULL) {
+		ahd_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
+		ahd_linux_queue_cmd_complete(ahd, cmd);
+		ahd_schedule_completeq(ahd, NULL);
 		ahd_midlayer_entrypoint_unlock(ahd, &flags);
-		printf("aic79xx_linux_queue: Unable to allocate device!\n");
-		return (-ENOMEM);
+		printf("%s: aic79xx_linux_queue - Unable to allocate device!\n",
+		       ahd_name(ahd));
+		return (0);
 	}
 	if (cmd->cmd_len > MAX_CDB_LEN)
 		return (-EINVAL);
@@ -1098,7 +1107,7 @@
 	int	scbnum;
 
 	ahd = *((struct ahd_softc **)host->hostdata);
-	ahd_midlayer_entrypoint_lock(ahd, &flags);
+	ahd_lock(ahd, &flags);
 	scbnum = 0;
 	for (device = scsi_devs; device != NULL; device = device->next) {
 
@@ -1133,7 +1142,7 @@
 			}
 		}
 	}
-	ahd_midlayer_entrypoint_unlock(ahd, &flags);
+	ahd_unlock(ahd, &flags);
 }
 #endif
 
@@ -1215,6 +1224,7 @@
 	u_int  saved_scbptr;
 	u_int  active_scbptr;
 	u_int  last_phase;
+	u_int  cdb_byte;
 	int    retval;
 	int    paused;
 	int    wait;
@@ -1227,9 +1237,12 @@
 	ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
 	acmd = (struct ahd_cmd *)cmd;
 
-	printf("%s:%d:%d:%d: Attempting to abort cmd %p\n",
+	printf("%s:%d:%d:%d: Attempting to abort cmd %p:",
 	       ahd_name(ahd), cmd->device->channel, cmd->device->id,
 	       cmd->device->lun, cmd);
+	for (cdb_byte = 0; cdb_byte < cmd->cmd_len; cdb_byte++)
+		printf(" 0x%x", cmd->cmnd[cdb_byte]);
+	printf("\n");
 
 	/*
 	 * In all versions of Linux, we have to work around
@@ -1245,9 +1258,6 @@
 	 * by acquiring either the io_request_lock or our own
 	 * lock, this *should* be safe.
 	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_unlock_irq(&io_request_lock);
-#endif
 	ahd_midlayer_entrypoint_lock(ahd, &s);
 
 	/*
@@ -1456,14 +1466,10 @@
 		struct timer_list timer;
 		int ret;
 
-		ahd->platform_data->flags |= AHD_UP_EH_SEMAPHORE;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-		ahd_unlock(ahd, &s);
-#else
-		spin_unlock_irq(ahd->platform_data->host->host_lock);
-#endif
+		pending_scb->platform_data->flags |= AHD_SCB_UP_EH_SEM;
+		spin_unlock_irq(&ahd->platform_data->spin_lock);
 		init_timer(&timer);
-		timer.data = (u_long)ahd;
+		timer.data = (u_long)pending_scb;
 		timer.expires = jiffies + (5 * HZ);
 		timer.function = ahd_linux_sem_timeout;
 		add_timer(&timer);
@@ -1475,27 +1481,17 @@
 			printf("Timer Expired\n");
 			retval = FAILED;
 		}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-		ahd_lock(ahd, &s);
-#else
-		spin_lock_irq(ahd->platform_data->host->host_lock);
-#endif
+		spin_lock_irq(&ahd->platform_data->spin_lock);
 	}
 	acmd = TAILQ_FIRST(&ahd->platform_data->completeq);
 	TAILQ_INIT(&ahd->platform_data->completeq);
-	ahd_midlayer_entrypoint_unlock(ahd, &s);
+	ahd_schedule_runq(ahd);
 	if (acmd != NULL) {
 		acmd = ahd_linux_run_complete_queue(ahd, acmd);
-		if (acmd != NULL) {
-			ahd_midlayer_entrypoint_lock(ahd, &s);
+		if (acmd != NULL)
 			ahd_schedule_completeq(ahd, acmd);
-			ahd_midlayer_entrypoint_unlock(ahd, &s);
-		}
 	}
-	ahd_schedule_runq(ahd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_lock_irq(&io_request_lock);
-#endif
+	ahd_midlayer_entrypoint_unlock(ahd, &s);
 	return (retval);
 }
 
@@ -1524,9 +1520,6 @@
 	struct	timer_list timer;
 	int	retval;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_unlock_irq(&io_request_lock);
-#endif
 	ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
 	recovery_cmd = malloc(sizeof(struct scsi_cmnd), M_DEVBUF, M_WAITOK);
 	memset(recovery_cmd, 0, sizeof(struct scsi_cmnd));
@@ -1577,14 +1570,10 @@
 	LIST_INSERT_HEAD(&ahd->pending_scbs, scb, pending_links);
 	ahd_queue_scb(ahd, scb);
 
-	ahd->platform_data->flags |= AHD_UP_EH_SEMAPHORE;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahd_unlock(ahd, &s);
-#else
-	spin_unlock_irq(ahd->platform_data->host->host_lock);
-#endif
+	scb->platform_data->flags |= AHD_SCB_UP_EH_SEM;
+	spin_unlock_irq(&ahd->platform_data->spin_lock);
 	init_timer(&timer);
-	timer.data = (u_long)ahd;
+	timer.data = (u_long)scb;
 	timer.expires = jiffies + (5 * HZ);
 	timer.function = ahd_linux_sem_timeout;
 	add_timer(&timer);
@@ -1596,26 +1585,16 @@
 		printf("Timer Expired\n");
 		retval = FAILED;
 	}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahd_lock(ahd, &s);
-#else
-	spin_lock_irq(ahd->platform_data->host->host_lock);
-#endif
+	spin_lock_irq(&ahd->platform_data->spin_lock);
 	acmd = TAILQ_FIRST(&ahd->platform_data->completeq);
 	TAILQ_INIT(&ahd->platform_data->completeq);
-	ahd_midlayer_entrypoint_unlock(ahd, &s);
+	ahd_schedule_runq(ahd);
 	if (acmd != NULL) {
 		acmd = ahd_linux_run_complete_queue(ahd, acmd);
-		if (acmd != NULL) {
-			ahd_midlayer_entrypoint_lock(ahd, &s);
+		if (acmd != NULL)
 			ahd_schedule_completeq(ahd, acmd);
-			ahd_midlayer_entrypoint_unlock(ahd, &s);
-		}
 	}
-	ahd_schedule_runq(ahd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_lock_irq(&io_request_lock);
-#endif
+	ahd_midlayer_entrypoint_unlock(ahd, &s);
 	printf("%s: Device reset returning 0x%x\n", ahd_name(ahd), retval);
 	return (retval);
 }
@@ -1631,9 +1610,6 @@
 	u_long s;
 	int    found;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_unlock_irq(&io_request_lock);
-#endif
 	ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
 #ifdef AHD_DEBUG
 	if ((ahd_debug & AHD_SHOW_RECOVERY) != 0)
@@ -1645,23 +1621,18 @@
 				  /*initiate reset*/TRUE);
 	acmd = TAILQ_FIRST(&ahd->platform_data->completeq);
 	TAILQ_INIT(&ahd->platform_data->completeq);
-	ahd_midlayer_entrypoint_unlock(ahd, &s);
-	if (bootverbose)
-		printf("%s: SCSI bus reset delivered. "
-		       "%d SCBs aborted.\n", ahd_name(ahd), found);
 
 	if (acmd != NULL) {
 		acmd = ahd_linux_run_complete_queue(ahd, acmd);
-		if (acmd != NULL) {
-			ahd_midlayer_entrypoint_lock(ahd, &s);
+		if (acmd != NULL)
 			ahd_schedule_completeq(ahd, acmd);
-			ahd_midlayer_entrypoint_unlock(ahd, &s);
-		}
 	}
+	ahd_midlayer_entrypoint_unlock(ahd, &s);
+
+	if (bootverbose)
+		printf("%s: SCSI bus reset delivered. "
+		       "%d SCBs aborted.\n", ahd_name(ahd), found);
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_lock_irq(&io_request_lock);
-#endif
 	return (SUCCESS);
 }
 
@@ -1691,7 +1662,7 @@
 	.max_sectors		= 8192,
 #endif
 #if defined CONFIG_HIGHIO || LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
 /* Assume RedHat Distribution with its different HIGHIO conventions. */
 	.can_dma_32		= 1,
 	.single_sg_okay		= 1,
@@ -1713,15 +1684,25 @@
 
 /**************************** Tasklet Handler *********************************/
 
+/*
+ * In 2.4.X and above, this routine is called from a tasklet,
+ * so we must re-acquire our lock prior to executing this code.
+ * In all prior kernels, ahd_schedule_runq() calls this routine
+ * directly and ahd_schedule_runq() is called with our lock held.
+ */
 static void
 ahd_runq_tasklet(unsigned long data)
 {
 	struct ahd_softc* ahd;
 	struct ahd_linux_device *dev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 	u_long flags;
+#endif
 
 	ahd = (struct ahd_softc *)data;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 	ahd_lock(ahd, &flags);
+#endif
 	while ((dev = ahd_linux_next_device_to_run(ahd)) != NULL) {
 	
 		TAILQ_REMOVE(&ahd->platform_data->device_runq, dev, links);
@@ -1731,7 +1712,9 @@
 		ahd_unlock(ahd, &flags);
 		ahd_lock(ahd, &flags);
 	}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 	ahd_unlock(ahd, &flags);
+#endif
 }
 
 /************************ Shutdown/halt/reboot hook ***************************/
@@ -1890,361 +1873,109 @@
 }
 
 /********************* Platform Dependent Functions ***************************/
+/*
+ * Compare "left hand" softc with "right hand" softc, returning:
+ * < 0 - lahd has a lower priority than rahd
+ *   0 - Softcs are equal
+ * > 0 - lahd has a higher priority than rahd
+ */
 int
 ahd_softc_comp(struct ahd_softc *lahd, struct ahd_softc *rahd)
 {
 	int	value;
-	char	primary_channel;
 
 	/*
 	 * Under Linux, cards are ordered as follows:
-	 *	1) PCI devices with BIOS enabled sorted by bus/slot/func.
-	 *	2) All remaining PCI devices sorted by bus/slot/func.
-	 */
+	 *	1) PCI devices that are marked as the boot controller.
+	 *	2) PCI devices with BIOS enabled sorted by bus/slot/func.
+	 *	3) All remaining PCI devices sorted by bus/slot/func.
+	 */
+#if 0
+	value = (lahd->flags & AHD_BOOT_CHANNEL)
+	      - (rahd->flags & AHD_BOOT_CHANNEL);
+	if (value != 0)
+		/* Controllers set for boot have a *higher* priority */
+		return (value);
+#endif
+
 	value = (lahd->flags & AHD_BIOS_ENABLED)
 	      - (rahd->flags & AHD_BIOS_ENABLED);
 	if (value != 0)
 		/* Controllers with BIOS enabled have a *higher* priority */
-		return (-value);
+		return (value);
 
 	/* Still equal.  Sort by bus/slot/func. */
 	if (aic79xx_reverse_scan != 0)
-		value = ahd_get_pci_bus(rahd->dev_softc)
-		      - ahd_get_pci_bus(lahd->dev_softc);
-	else
 		value = ahd_get_pci_bus(lahd->dev_softc)
 		      - ahd_get_pci_bus(rahd->dev_softc);
+	else
+		value = ahd_get_pci_bus(rahd->dev_softc)
+		      - ahd_get_pci_bus(lahd->dev_softc);
 	if (value != 0)
 		return (value);
 	if (aic79xx_reverse_scan != 0)
-		value = ahd_get_pci_slot(rahd->dev_softc)
-		      - ahd_get_pci_slot(lahd->dev_softc);
-	else
 		value = ahd_get_pci_slot(lahd->dev_softc)
 		      - ahd_get_pci_slot(rahd->dev_softc);
+	else
+		value = ahd_get_pci_slot(rahd->dev_softc)
+		      - ahd_get_pci_slot(lahd->dev_softc);
 	if (value != 0)
 		return (value);
 
-	/*
-	 * On multi-function devices, the user can choose
-	 * to have function 1 probed before function 0.
-	 * Give whichever channel is the primary channel
-	 * the lowest priority.
-	 */
-	primary_channel = (lahd->flags & AHD_PRIMARY_CHANNEL) + 'A';
-	value = 1;
-	if (lahd->channel == primary_channel)
-		value = -1;
+	value = rahd->channel - lahd->channel;
 	return (value);
 }
 
 static void
-ahd_linux_setup_tag_info(char *p, char *end, char *s)
+ahd_linux_setup_tag_info(void *arg, int instance, int targ, int32_t value)
 {
-	char	*base;
-	char	*tok;
-	char	*tok_end;
-	char	*tok_end2;
-	int      i;
-	int      instance;
-	int	 targ;
-	int	 done;
-	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
 
-	if (*p != ':')
-		return;
-
-	instance = -1;
-	targ = -1;
-	done = FALSE;
-	base = p;
-	/* Forward us just past the ':' */
-	tok = base + 1;
-	tok_end = strchr(tok, '\0');
-	if (tok_end < end)
-		*tok_end = ',';
-	while (!done) {
-		switch (*tok) {
-		case '{':
-			if (instance == -1)
-				instance = 0;
-			else if (targ == -1)
-				targ = 0;
-			tok++;
-			break;
-		case '}':
-			if (targ != -1)
-				targ = -1;
-			else if (instance != -1)
-				instance = -1;
-			tok++;
-			break;
-		case ',':
-		case '.':
-			if (instance == -1)
-				done = TRUE;
-			else if (targ >= 0)
-				targ++;
-			else if (instance >= 0)
-				instance++;
-			if ((targ >= AHD_NUM_TARGETS) ||
-			    (instance >= NUM_ELEMENTS(aic79xx_tag_info)))
-				done = TRUE;
-			tok++;
-			if (!done) {
-				base = tok;
-			}
-			break;
-		case '\0':
-			done = TRUE;
-			break;
-		default:
-			done = TRUE;
-			tok_end = strchr(tok, '\0');
-			for (i = 0; tok_list[i]; i++) {
-				tok_end2 = strchr(tok, tok_list[i]);
-				if ((tok_end2) && (tok_end2 < tok_end)) {
-					tok_end = tok_end2;
-					done = FALSE;
-				}
-			}
-			if ((instance >= 0) && (targ >= 0)
-			 && (instance < NUM_ELEMENTS(aic79xx_tag_info))
-			 && (targ < AHD_NUM_TARGETS)) {
-				aic79xx_tag_info[instance].tag_commands[targ] =
-				    simple_strtoul(tok, NULL, 0) & 0xff;
-			}
-			tok = tok_end;
-			break;
-		}
+	if ((instance >= 0) && (targ >= 0)
+	 && (instance < NUM_ELEMENTS(aic79xx_tag_info))
+	 && (targ < AHD_NUM_TARGETS)) {
+		aic79xx_tag_info[instance].tag_commands[targ] = value & 0x1FF;
+		if (bootverbose)
+			printf("tag_info[%d:%d] = %d\n", instance, targ, value);
 	}
-	while ((p != base) && (p != NULL))
-		p = strsep(&s, ",.");
 }
 
 static void
-ahd_linux_setup_rd_strm_info(char *p, char *end, char *s)
+ahd_linux_setup_rd_strm_info(void *arg, int instance, int targ, int32_t value)
 {
-	char	*base;
-	char	*tok;
-	char	*tok_end;
-	char	*tok_end2;
-	int      i;
-	int      instance;
-	int	 done;
-	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
-
-	if (*p != ':')
-		return;
-
-	instance = -1;
-	done = FALSE;
-	base = p;
-	/* Forward us just past the ':' */
-	tok = base + 1;
-	tok_end = strchr(tok, '\0');
-	if (tok_end < end)
-		*tok_end = ',';
-	while (!done) {
-		switch (*tok) {
-		case '{':
-			if (instance == -1)
-				instance = 0;
-			tok++;
-			break;
-		case '}':
-			if (instance != -1)
-				instance = -1;
-			tok++;
-			break;
-		case ',':
-		case '.':
-			if (instance == -1)
-				done = TRUE;
-			else if (instance >= 0)
-				instance++;
-			if (instance >= NUM_ELEMENTS(aic79xx_rd_strm_info))
-				done = TRUE;
-			tok++;
-			if (!done) {
-				base = tok;
-			}
-			break;
-		case '\0':
-			done = TRUE;
-			break;
-		default:
-			done = TRUE;
-			tok_end = strchr(tok, '\0');
-			for (i = 0; tok_list[i]; i++) {
-				tok_end2 = strchr(tok, tok_list[i]);
-				if ((tok_end2) && (tok_end2 < tok_end)) {
-					tok_end = tok_end2;
-					done = FALSE;
-				}
-			}
-			if ((instance >= 0)
-			 && (instance < NUM_ELEMENTS(aic79xx_rd_strm_info))) {
-				aic79xx_rd_strm_info[instance] =
-				    simple_strtoul(tok, NULL, 0) & 0xffff;
-			}
-			tok = tok_end;
-			break;
-		}
+	if ((instance >= 0)
+	 && (instance < NUM_ELEMENTS(aic79xx_rd_strm_info))) {
+		aic79xx_rd_strm_info[instance] = value * 0xFFFF;
+		if (bootverbose)
+			printf("rd_strm[%d] = 0x%x\n", instance, value);
 	}
-	while ((p != base) && (p != NULL))
-		p = strsep(&s, ",.");
 }
 
 static void
-ahd_linux_setup_dv(char *p, char *end, char *s)
+ahd_linux_setup_dv(void *arg, int instance, int targ, int32_t value)
 {
-	char	*base;
-	char	*tok;
-	char	*tok_end;
-	char	*tok_end2;
-	int      i;
-	int      instance;
-	int	 done;
-	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
-
-	if (*p != ':')
-		return;
-
-	instance = -1;
-	done = FALSE;
-	base = p;
-	/* Forward us just past the ':' */
-	tok = base + 1;
-	tok_end = strchr(tok, '\0');
-	if (tok_end < end)
-		*tok_end = ',';
-	while (!done) {
-		switch (*tok) {
-		case '{':
-			if (instance == -1)
-				instance = 0;
-			tok++;
-			break;
-		case '}':
-			if (instance != -1)
-				instance = -1;
-			tok++;
-			break;
-		case ',':
-		case '.':
-			if (instance == -1)
-				done = TRUE;
-			else if (instance >= 0)
-				instance++;
-			if (instance >= NUM_ELEMENTS(aic79xx_dv_settings))
-				done = TRUE;
-			tok++;
-			if (!done) {
-				base = tok;
-			}
-			break;
-		case '\0':
-			done = TRUE;
-			break;
-		default:
-			done = TRUE;
-			tok_end = strchr(tok, '\0');
-			for (i = 0; tok_list[i]; i++) {
-				tok_end2 = strchr(tok, tok_list[i]);
-				if ((tok_end2) && (tok_end2 < tok_end)) {
-					tok_end = tok_end2;
-					done = FALSE;
-				}
-			}
-			if ((instance >= 0)
-			 && (instance < NUM_ELEMENTS(aic79xx_dv_settings))) {
-				aic79xx_dv_settings[instance] =
-				    simple_strtol(tok, NULL, 0);
-			}
-			tok = tok_end;
-			break;
-		}
+	if ((instance >= 0)
+	 && (instance < NUM_ELEMENTS(aic79xx_dv_settings))) {
+		aic79xx_dv_settings[instance] = value;
+		if (bootverbose)
+			printf("dv[%d] = %d\n", instance, value);
 	}
-	while ((p != base) && (p != NULL))
-		p = strsep(&s, ",.");
 }
 
 static void
-ahd_linux_setup_iocell_info(char *p, char *end, char *s, int index)
+ahd_linux_setup_iocell_info(void *arg, int instance, int targ, int32_t value)
 {
-	char	*base;
-	char	*tok;
-	char	*tok_end;
-	char	*tok_end2;
-	uint8_t	*iocell_info;
-	int      i;
-	int      instance;
-	int	 done;
-	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
-
-	if (*p != ':')
-		return;
+	u_int index;
 
-	instance = -1;
-	done = FALSE;
-	base = p;
-	/* Forward us just past the ':' */
-	tok = base + 1;
-	tok_end = strchr(tok, '\0');
-	if (tok_end < end)
-		*tok_end = ',';
-	while (!done) {
-		switch (*tok) {
-		case '{':
-			if (instance == -1)
-				instance = 0;
-			tok++;
-			break;
-		case '}':
-			if (instance != -1)
-				instance = -1;
-			tok++;
-			break;
-		case ',':
-		case '.':
-			if (instance == -1)
-				done = TRUE;
-			else if (instance >= 0)
-				instance++;
-			if (instance >= NUM_ELEMENTS(aic79xx_iocell_info))
-				done = TRUE;
-			tok++;
-			if (!done) {
-				base = tok;
-			}
-			break;
-		case '\0':
-			done = TRUE;
-			break;
-		default:
-			done = TRUE;
-			tok_end = strchr(tok, '\0');
-			for (i = 0; tok_list[i]; i++) {
-				tok_end2 = strchr(tok, tok_list[i]);
-				if ((tok_end2) && (tok_end2 < tok_end)) {
-					tok_end = tok_end2;
-					done = FALSE;
-				}
-			}
-			if ((instance >= 0)
-			 && (instance < NUM_ELEMENTS(aic79xx_iocell_info))) {
-				iocell_info =
-				    (uint8_t*)&aic79xx_iocell_info[instance];
-				iocell_info[index] = 
-				    simple_strtoul(tok, NULL, 0) & 0xffff;
-			}
-			tok = tok_end;
-			break;
-		}
+	index = (u_int)arg;
+	if ((instance >= 0)
+	 && (instance < NUM_ELEMENTS(aic79xx_iocell_info))) {
+		uint8_t *iocell_info;
+
+		iocell_info = (uint8_t*)&aic79xx_iocell_info[instance];
+		iocell_info[index] = value & 0xFFFF;
+		if (bootverbose)
+			printf("iocell[%d:%d] = %d\n", instance, index, value);
 	}
-	while ((p != base) && (p != NULL))
-		p = strsep(&s, ",.");
 }
 
 static void
@@ -2300,41 +2031,54 @@
 
 	end = strchr(s, '\0');
 
+	/*
+	 * XXX ia64 gcc isn't smart enough to know that NUM_ELEMENTS
+	 * will never be 0 in this case.
+	 */      
+	n = 0;  
+
 	while ((p = strsep(&s, ",.")) != NULL) {
 		if (*p == '\0')
 			continue;
 		for (i = 0; i < NUM_ELEMENTS(options); i++) {
-			n = strlen(options[i].name);
 
-			if (strncmp(options[i].name, p, n) != 0)
-				continue;
+			n = strlen(options[i].name);
+			if (strncmp(options[i].name, p, n) == 0)
+				break;
+		}
+		if (i == NUM_ELEMENTS(options))
+			continue;
 
-			if (!strncmp(p, "global_tag_depth", n)) {
-				ahd_linux_setup_tag_info_global(p + n);
-			} else if (!strncmp(p, "tag_info", n)) {
-				ahd_linux_setup_tag_info(p + n, end, s);
-			} else if (strncmp(p, "rd_strm", n) == 0) {
-				ahd_linux_setup_rd_strm_info(p + n, end, s);
-			} else if (strncmp(p, "dv", n) == 0) {
-				ahd_linux_setup_dv(p + n, end, s);
-			} else if (strncmp(p, "slewrate", n) == 0) {
-				ahd_linux_setup_iocell_info(p + n, end, s,
-				    AIC79XX_SLEWRATE_INDEX);
-			} else if (strncmp(p, "precomp", n) == 0) {
-				ahd_linux_setup_iocell_info(p + n, end, s,
-				    AIC79XX_PRECOMP_INDEX);
-			} else if (strncmp(p, "amplitude", n) == 0) {
-				ahd_linux_setup_iocell_info(p + n, end, s,
-				    AIC79XX_AMPLITUDE_INDEX);
-			} else if (p[n] == ':') {
-				*(options[i].flag) =
-				    simple_strtoul(p + n + 1, NULL, 0);
-			} else if (!strncmp(p, "verbose", n)) {
-				*(options[i].flag) = 1;
-			} else {
-				*(options[i].flag) = ~(*(options[i].flag));
-			}
-			break;
+		if (strncmp(p, "global_tag_depth", n) == 0) {
+			ahd_linux_setup_tag_info_global(p + n);
+		} else if (strncmp(p, "tag_info", n) == 0) {
+			s = aic_parse_brace_option("tag_info", p + n, end,
+			    2, ahd_linux_setup_tag_info, NULL);
+		} else if (strncmp(p, "rd_strm", n) == 0) {
+			printf("Calling brace parse for %s\n", p);
+			s = aic_parse_brace_option("rd_strm", p + n, end,
+			    1, ahd_linux_setup_rd_strm_info, NULL);
+		} else if (strncmp(p, "dv", n) == 0) {
+			s = aic_parse_brace_option("dv", p + n, end, 1,
+			    ahd_linux_setup_dv, NULL);
+		} else if (strncmp(p, "slewrate", n) == 0) {
+			s = aic_parse_brace_option("slewrate",
+			    p + n, end, 1, ahd_linux_setup_iocell_info,
+			    (void *)AIC79XX_SLEWRATE_INDEX);
+		} else if (strncmp(p, "precomp", n) == 0) {
+			s = aic_parse_brace_option("precomp",
+			    p + n, end, 1, ahd_linux_setup_iocell_info,
+			    (void *)AIC79XX_PRECOMP_INDEX);
+		} else if (strncmp(p, "amplitude", n) == 0) {
+			s = aic_parse_brace_option("amplitude",
+			    p + n, end, 1, ahd_linux_setup_iocell_info,
+			    (void *)AIC79XX_AMPLITUDE_INDEX);
+		} else if (p[n] == ':') {
+			*(options[i].flag) = simple_strtoul(p + n + 1, NULL, 0);
+		} else if (!strncmp(p, "verbose", n)) {
+			*(options[i].flag) = 1;
+		} else {
+			*(options[i].flag) = ~(*(options[i].flag));
 		}
 	}
 	return 1;
@@ -2364,6 +2108,8 @@
 	ahd_lock(ahd, &s);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	scsi_assign_lock(host, &ahd->platform_data->spin_lock);
+#elif AHD_SCSI_HAS_HOST_LOCK != 0
+	host->lock = &ahd->platform_data->spin_lock;
 #endif
 	ahd->platform_data->host = host;
 	host->can_queue = AHD_MAX_QUEUE;
@@ -2383,9 +2129,10 @@
 	}
 	host->unique_id = ahd->unit;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) && \
-    LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
+    LINUX_VERSION_CODE  < KERNEL_VERSION(2,5,0)
 	scsi_set_pci_device(host, ahd->dev_softc);
 #endif
+	ahd_linux_setup_user_rd_strm_settings(ahd);
 	ahd_linux_initialize_scsi_bus(ahd);
 	ahd_unlock(ahd, &s);
 	ahd->platform_data->dv_pid = kernel_thread(ahd_linux_dv_thread, ahd, 0);
@@ -2405,13 +2152,28 @@
 	 * negotiation will occur for the first command, and DV
 	 * will comence should that first command be successful.
 	 */
-	for (target = 0; target < host->max_id; target++)
+	for (target = 0; target < host->max_id; target++) {
+
+		/*
+		 * Skip our own ID.  Some Compaq/HP storage devices
+		 * have enclosure management devices that respond to
+		 * single bit selection (i.e. selecting ourselves).
+		 * It is expected that either an external application
+		 * or a modified kernel will be used to probe this
+		 * ID if it is appropriate.  To accommodate these
+		 * installations, ahc_linux_alloc_target() will allocate
+		 * for our ID if asked to do so.
+		 */
+		if (target == ahd->our_id) 
+			continue;
+
 		ahd_linux_alloc_target(ahd, 0, target);
+	}
 	ahd_intr_enable(ahd, TRUE);
 	ahd_linux_start_dv(ahd);
 	ahd_unlock(ahd, &s);
 
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	scsi_add_host(host, &ahd->dev_softc->dev);
 #endif
 	return (0);
@@ -2539,29 +2301,13 @@
 {
 	struct ahd_linux_target *targ;
 	struct ahd_linux_device *dev;
-	u_long s;
 	int i, j;
 
 	if (ahd->platform_data != NULL) {
-		/* Kill the DV kthread */
-		if (ahd->platform_data->dv_pid != 0) {
-			ahd_lock(ahd, &s);
-			ahd->platform_data->flags |= AHD_DV_SHUTDOWN;
-			ahd_unlock(ahd, &s);
-			up(&ahd->platform_data->dv_sem);
-			do {
-#ifdef AHD_DEBUG
-				if (ahd_debug & AHD_SHOW_DV) {
-					printf("%s: Waiting for DV thread to "
-					       "exit\n", ahd_name(ahd));
-				}
-#endif
-			} while (waitpid(ahd->platform_data->dv_pid, NULL,
-					 __WCLONE) == -ERESTARTSYS);
-		}
+		ahd_linux_kill_dv_thread(ahd);
 		ahd_teardown_runq_tasklet(ahd);
 		if (ahd->platform_data->host != NULL) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 			scsi_remove_host(ahd->platform_data->host);
 #endif
 			scsi_unregister(ahd->platform_data->host);
@@ -2604,10 +2350,12 @@
 #endif
 		}
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) && \
-    LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
+    LINUX_VERSION_CODE  < KERNEL_VERSION(2,5,0)
     		/*
 		 * In 2.4 we detach from the scsi midlayer before the PCI
-		 * layer invokes our remove callback.
+		 * layer invokes our remove callback.  No per-instance
+		 * detach is provided, so we must reach inside the PCI
+		 * subsystem's internals and detach our driver manually.
 		 */
 		if (ahd->dev_softc != NULL)
 			ahd->dev_softc->driver = NULL;
@@ -2659,7 +2407,18 @@
 	if (dev == NULL)
 		return;
 	was_queuing = dev->flags & (AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED);
-	now_queuing = alg != AHD_QUEUE_NONE;
+	switch (alg) {
+	default:
+	case AHD_QUEUE_NONE:
+		now_queuing = 0;
+		break; 
+	case AHD_QUEUE_BASIC:
+		now_queuing = AHD_DEV_Q_BASIC;
+		break;
+	case AHD_QUEUE_TAGGED:
+		now_queuing = AHD_DEV_Q_TAGGED;
+		break;
+	}
 	if ((dev->flags & AHD_DEV_FREEZE_TIL_EMPTY) == 0
 	 && (was_queuing != now_queuing)
 	 && (dev->active != 0)) {
@@ -2795,24 +2554,12 @@
 	ahd->platform_data->flags &= ~AHD_RUN_CMPLT_Q_TIMER;
 	acmd = TAILQ_FIRST(&ahd->platform_data->completeq);
 	TAILQ_INIT(&ahd->platform_data->completeq);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahd_unlock(ahd, &flags);
-#endif
 	if (acmd != NULL) {
 		acmd = ahd_linux_run_complete_queue(ahd, acmd);
-		if (acmd != NULL) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahd_lock(ahd, &flags);
-#endif
+		if (acmd != NULL)
 			ahd_schedule_completeq(ahd, acmd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahd_unlock(ahd, &flags);
-#endif
-		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	ahd_unlock(ahd, &flags);
-#endif
 }
 
 static void
@@ -2852,15 +2599,20 @@
 #endif
 
 	/*
+	 * Complete thread creation.
+	 */
+	lock_kernel();
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,60)
+	/*
 	 * Don't care about any signals.
 	 */
 	siginitsetinv(&current->blocked, 0);
 
-	/*
-	 * Complete thread creation.
-	 */
-	lock_kernel();
+	daemonize();
+	sprintf(current->comm, "ahd_dv_%d", ahd->unit);
+#else
 	daemonize("ahd_dv_%d", ahd->unit);
+#endif
 	unlock_kernel();
 
 	while (1) {
@@ -2874,7 +2626,7 @@
 		ahd_lock(ahd, &s);
 		if ((ahd->platform_data->flags & AHD_DV_SHUTDOWN) != 0) {
 			ahd_unlock(ahd, &s);
-			return (0);
+			break;
 		}
 		ahd_unlock(ahd, &s);
 
@@ -2920,10 +2672,52 @@
 		 */
 		ahd_release_simq(ahd);
 	}
-
+	up(&ahd->platform_data->eh_sem);
 	return (0);
 }
 
+static void
+ahd_linux_kill_dv_thread(struct ahd_softc *ahd)
+{
+	u_long s;
+
+	ahd_lock(ahd, &s);
+	if (ahd->platform_data->dv_pid != 0) {
+		ahd->platform_data->flags |= AHD_DV_SHUTDOWN;
+		ahd_unlock(ahd, &s);
+		up(&ahd->platform_data->dv_sem);
+
+		/*
+		 * Use the eh_sem as an indicator that the
+		 * dv thread is exiting.  Note that the dv
+		 * thread must still return after performing
+		 * the up on our semaphore before it has
+		 * completely exited this module.  Unfortunately,
+		 * there seems to be no easy way to wait for the
+		 * exit of a thread for which you are not the
+		 * parent (dv threads are parented by init).
+		 * Cross your fingers...
+		 */
+		down(&ahd->platform_data->eh_sem);
+
+		/*
+		 * Mark the dv thread as already dead.  This
+		 * avoids attempting to kill it a second time.
+		 * This is necessary because we must kill the
+		 * DV thread before calling ahd_free() in the
+		 * module shutdown case to avoid bogus locking
+		 * in the SCSI mid-layer, but we ahd_free() is
+		 * called without killing the DV thread in the
+		 * instance detach case, so ahd_platform_free()
+		 * calls us again to verify that the DV thread
+		 * is dead.
+		 */
+		ahd->platform_data->dv_pid = 0;
+	} else {
+		ahd_unlock(ahd, &s);
+	}
+}
+
 #define AHD_LINUX_DV_INQ_SHORT_LEN	36
 #define AHD_LINUX_DV_INQ_LEN		256
 #define AHD_LINUX_DV_TIMEOUT		(HZ / 4)
@@ -3026,6 +2820,7 @@
 		}
 		case AHD_DV_STATE_TUR:
 		case AHD_DV_STATE_BUSY:
+			timeout = 5 * HZ;
 			ahd_linux_dv_tur(ahd, cmd, &devinfo);
 			break;
 		case AHD_DV_STATE_REBD:
@@ -3066,14 +2861,19 @@
 		/*
 		 * In 2.5.X, it is assumed that all calls from the
 		 * "midlayer" (which we are emulating) will have the
-		 * ahd host lock held.
+		 * ahd host lock held.  For other kernels, the
+		 * io_request_lock must be held.
 		 */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#if AHD_SCSI_HAS_HOST_LOCK != 0
 		ahd_lock(ahd, &s);
+#else
+		spin_lock_irqsave(&io_request_lock, s);
 #endif
 		ahd_linux_queue(cmd, ahd_linux_dv_complete);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#if AHD_SCSI_HAS_HOST_LOCK != 0
 		ahd_unlock(ahd, &s);
+#else
+		spin_unlock_irqrestore(&io_request_lock, s);
 #endif
 		down_interruptible(&ahd->platform_data->dv_cmd_sem);
 		/*
@@ -3961,7 +3761,6 @@
 {
 	struct	ahd_softc *ahd;
 	struct	ahd_cmd *acmd;
-	struct	ahd_linux_device *next_dev;
 	struct	scb *scb;
 	u_long	flags;
 
@@ -4008,36 +3807,17 @@
 	ahd->platform_data->reset_timer.function =
 	    (ahd_linux_callback_t *)ahd_release_simq;
 	add_timer(&ahd->platform_data->reset_timer);
-	/*
-	 * In 2.5.X, the "done lock" is the ahd_lock.
-	 * Instead of dropping and re-acquiring the same
-	 * lock in the 2.5.X case, just hold our ahd_lock
-	 * the whole time.  ahd_done_lock() has been
-	 * made a no-op for 2.5.X too.
-	 */
 	acmd = TAILQ_FIRST(&ahd->platform_data->completeq);
 	TAILQ_INIT(&ahd->platform_data->completeq);
-	next_dev = ahd_linux_next_device_to_run(ahd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahd_unlock(ahd, &flags);
-#endif
-	if (next_dev)
+	if (ahd_linux_next_device_to_run(ahd) != NULL)
 		ahd_schedule_runq(ahd);
 	if (acmd != NULL) {
 		acmd = ahd_linux_run_complete_queue(ahd, acmd);
 		if (acmd != NULL) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahd_lock(ahd, &flags);
-#endif
 			ahd_schedule_completeq(ahd, acmd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahd_unlock(ahd, &flags);
-#endif
 		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	ahd_unlock(ahd, &flags);
-#endif
 }
 
 static void
@@ -4126,17 +3906,17 @@
 
 	tags = 0;
 	if ((ahd->user_discenable & devinfo->target_mask) != 0) {
-		if (warned_user == 0
-		 && ahd->unit >= NUM_ELEMENTS(aic79xx_tag_info)) {
+		if (ahd->unit >= NUM_ELEMENTS(aic79xx_tag_info)) {
 
-			printf("aic79xx: WARNING, insufficient "
-			       "tag_info instances for installed "
-			       "controllers. Using defaults\n");
-			printf("aic79xx: Please update the "
-			       "aic79xx_tag_info array in the "
-			       "aic79xx.c source file.\n");
+			if (warned_user == 0) {
+				printf(KERN_WARNING
+"aic79xx: WARNING: Insufficient tag_info instances\n"
+"aic79xx: for installed controllers.  Using defaults\n"
+"aic79xx: Please update the aic79xx_tag_info array in\n"
+"aic79xx: the aic79xx_osm.c source file.\n");
+				warned_user++;
+			}
 			tags = AHD_MAX_QUEUE;
-			warned_user++;
 		} else {
 			adapter_tag_info_t *tag_info;
 
@@ -4155,17 +3935,17 @@
 	static int warned_user;
 	int dv;
 
-	if (warned_user == 0
-	 && ahd->unit >= NUM_ELEMENTS(aic79xx_dv_settings)) {
+	if (ahd->unit >= NUM_ELEMENTS(aic79xx_dv_settings)) {
 
-		printf("aic79xx: WARNING, insufficient "
-		       "dv settings instances for installed "
-		       "controllers. Using defaults\n");
-		printf("aic79xx: Please update the "
-		       "aic79xx_dv_settings array in the "
-		       "aic79xx.c source file.\n");
+		if (warned_user == 0) {
+			printf(KERN_WARNING
+"aic79xx: WARNING: Insufficient dv settings instances\n"
+"aic79xx: for installed controllers. Using defaults\n"
+"aic79xx: Please update the aic79xx_dv_settings array in"
+"aic79xx: the aic79xx_osm.c source file.\n");
+			warned_user++;
+		}
 		dv = -1;
-		warned_user++;
 	} else {
 
 		dv = aic79xx_dv_settings[ahd->unit];
@@ -4182,6 +3962,48 @@
 	return (dv);
 }
 
+static void
+ahd_linux_setup_user_rd_strm_settings(struct ahd_softc *ahd)
+{
+	static	int warned_user;
+	u_int	rd_strm_mask;
+	u_int	target_id;
+
+	/*
+	 * If we have specific read streaming info for this controller,
+	 * apply it.  Otherwise use the defaults.
+	 */
+	 if (ahd->unit >= NUM_ELEMENTS(aic79xx_rd_strm_info)) {
+
+		if (warned_user == 0) {
+
+			printf(KERN_WARNING
+"aic79xx: WARNING: Insufficient rd_strm instances\n"
+"aic79xx: for installed controllers. Using defaults\n"
+"aic79xx: Please update the aic79xx_rd_strm_info array\n"
+"aic79xx: in the aic79xx_osm.c source file.\n");
+			warned_user++;
+		}
+		rd_strm_mask = AIC79XX_CONFIGED_RD_STRM;
+	} else {
+
+		rd_strm_mask = aic79xx_rd_strm_info[ahd->unit];
+	}
+	for (target_id = 0; target_id < 16; target_id++) {
+		struct ahd_devinfo devinfo;
+		struct ahd_initiator_tinfo *tinfo;
+		struct ahd_tmode_tstate *tstate;
+
+		tinfo = ahd_fetch_transinfo(ahd, 'A', ahd->our_id,
+					    target_id, &tstate);
+		ahd_compile_devinfo(&devinfo, ahd->our_id, target_id,
+				    CAM_LUN_WILDCARD, 'A', ROLE_INITIATOR);
+		tinfo->user.ppr_options &= ~MSG_EXT_PPR_RD_STRM;
+		if ((rd_strm_mask & devinfo.target_mask) != 0)
+			tinfo->user.ppr_options |= MSG_EXT_PPR_RD_STRM;
+	}
+}
+
 /*
  * Determines the queue depth for a given device.
  */
@@ -4385,41 +4207,21 @@
 	struct	ahd_softc *ahd;
 	struct	ahd_cmd *acmd;
 	u_long	flags;
-	struct	ahd_linux_device *next_dev;
 
 	ahd = (struct ahd_softc *) dev_id;
 	ahd_lock(ahd, &flags); 
 	ahd_intr(ahd);
 	acmd = TAILQ_FIRST(&ahd->platform_data->completeq);
 	TAILQ_INIT(&ahd->platform_data->completeq);
-	next_dev = ahd_linux_next_device_to_run(ahd);
-	/*
-	 * In 2.5.X, the "done lock" is the ahd_lock.
-	 * Instead of dropping and re-acquiring the same
-	 * lock in the 2.5.X case, just hold our ahd_lock
-	 * the whole time.  ahd_done_lock() has been
-	 * made a no-op for 2.5.X too.
-	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahd_unlock(ahd, &flags);
-#endif
-	if (next_dev)
+	if (ahd_linux_next_device_to_run(ahd) != NULL)
 		ahd_schedule_runq(ahd);
 	if (acmd != NULL) {
 		acmd = ahd_linux_run_complete_queue(ahd, acmd);
 		if (acmd != NULL) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahd_lock(ahd, &flags);
-#endif
 			ahd_schedule_completeq(ahd, acmd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahd_unlock(ahd, &flags);
-#endif
 		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	ahd_unlock(ahd, &flags);
-#endif
 }
 
 void
@@ -4437,17 +4239,6 @@
 ahd_linux_alloc_target(struct ahd_softc *ahd, u_int channel, u_int target)
 {
 	struct ahd_linux_target *targ;
-	u_int target_offset;
-
-	target_offset = target;
-	/*
-	 * Never allow allocation of a target object for
-	 * our own SCSIID.
-	 */
-	if (target == ahd->our_id) {
-		ahd->platform_data->targets[target_offset] = NULL;
-		return (NULL);
-	}
 
 	targ = malloc(sizeof(*targ), M_DEVBUF, M_NOWAIT);
 	if (targ == NULL)
@@ -4457,7 +4248,7 @@
 	targ->target = target;
 	targ->ahd = ahd;
 	targ->flags = AHD_DV_REQUIRED;
-	ahd->platform_data->targets[target_offset] = targ;
+	ahd->platform_data->targets[target] = targ;
 	return (targ);
 }
 
@@ -4699,6 +4490,14 @@
 #endif
 			ahd_set_transaction_status(scb, CAM_UNCOR_PARITY);
 		} else if (amount_xferred < scb->io_ctx->underflow) {
+			u_int i;
+
+			ahd_print_path(ahd, scb);
+			printf("CDB:");
+			for (i = 0; i < scb->io_ctx->cmd_len; i++)
+				printf(" 0x%x", scb->io_ctx->cmnd[i]);
+			printf("\n");
+			ahd_print_path(ahd, scb);
 			printf("Saw underflow (%ld of %ld bytes). "
 			       "Treated as error\n",
 				ahd_get_residual(scb),
@@ -4755,8 +4554,8 @@
 		if (ahd_get_transaction_status(scb) == CAM_BDR_SENT
 		 || ahd_get_transaction_status(scb) == CAM_REQ_ABORTED)
 			ahd_set_transaction_status(scb, CAM_CMD_TIMEOUT);
-		if ((ahd->platform_data->flags & AHD_UP_EH_SEMAPHORE) != 0) {
-			ahd->platform_data->flags &= ~AHD_UP_EH_SEMAPHORE;
+		if ((scb->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) {
+			scb->platform_data->flags &= ~AHD_SCB_UP_EH_SEM;
 			up(&ahd->platform_data->eh_sem);
 		}
 	}
@@ -4869,7 +4668,7 @@
 			 */
 			dev->openings = 0;
 #ifdef AHD_DEBUG
-			if (ahd_debug & AHD_SHOW_QFULL) {
+			if ((ahd_debug & AHD_SHOW_QFULL) != 0) {
 				ahd_print_path(ahd, scb);
 				printf("Dropping tag count to %d\n",
 				       dev->active);
@@ -4899,7 +4698,7 @@
 			}
 			ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
 			ahd_set_scsi_status(scb, SCSI_STATUS_OK);
-			ahd_set_tags(ahd, &devinfo,
+			ahd_platform_set_tags(ahd, &devinfo,
 				     (dev->flags & AHD_DEV_Q_BASIC)
 				   ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED);
 			break;
@@ -4909,7 +4708,7 @@
 		 * as if the target returned BUSY SCSI status.
 		 */
 		dev->openings = 1;
-		ahd_set_tags(ahd, &devinfo,
+		ahd_platform_set_tags(ahd, &devinfo,
 			     (dev->flags & AHD_DEV_Q_BASIC)
 			   ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED);
 		ahd_set_scsi_status(scb, SCSI_STATUS_BUSY);
@@ -5108,7 +4907,6 @@
 	u_int	ppr_options;
 	u_int	trans_version;
 	u_int	prot_version;
-	static	int warned_user;
 
 	/*
 	 * Determine if this lun actually exists.  If so,
@@ -5148,26 +4946,6 @@
 	prot_version = MIN(user->protocol_version, SID_ANSI_REV(sid));
 
 	/*
-	 * If we have read streaming info for this controller,
-	 * apply it to this target.
-	 */
-	if (warned_user == 0
-	 && ahd->unit >= NUM_ELEMENTS(aic79xx_rd_strm_info)) {
-
-		printf("aic79xx: WARNING, insufficient rd_strm instances "
-		       "for installed controllers. Using defaults\n");
-		printf("aic79xx: Please update the aic79xx_rd_strm_info "
-		       "array in the aic79xx_osm.c source file.\n");
-		warned_user++;
-	} else {
-		uint16_t rd_strm_mask;
-
-		rd_strm_mask = aic79xx_rd_strm_info[ahd->unit];
-		if ((rd_strm_mask & devinfo->target_mask) == 0)
-			ppr_options &= ~MSG_EXT_PPR_RD_STRM;
-	}
-	
-	/*
 	 * Only attempt SPI3/4 once we've verified that
 	 * the device claims to support SPI3/4 features.
 	 */
@@ -5242,6 +5020,7 @@
 		ahd->platform_data->flags &= ~AHD_DV_WAIT_SIMQ_RELEASE;
 		up(&ahd->platform_data->dv_sem);
 	}
+	ahd_schedule_runq(ahd);
 	ahd_unlock(ahd, &s);
 	/*
 	 * There is still a race here.  The mid-layer
@@ -5251,20 +5030,20 @@
 	 */
 	if (unblock_reqs)
 		scsi_unblock_requests(ahd->platform_data->host);
-
-	ahd_schedule_runq(ahd);
 }
 
 static void
 ahd_linux_sem_timeout(u_long arg)
 {
+	struct	scb *scb;
 	struct	ahd_softc *ahd;
 	u_long	s;
 
-	ahd = (struct ahd_softc *)arg;
+	scb = (struct scb *)arg;
+	ahd = scb->ahd_softc;
 	ahd_lock(ahd, &s);
-	if ((ahd->platform_data->flags & AHD_UP_EH_SEMAPHORE) != 0) {
-		ahd->platform_data->flags &= ~AHD_UP_EH_SEMAPHORE;
+	if ((scb->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) {
+		scb->platform_data->flags &= ~AHD_SCB_UP_EH_SEM;
 		up(&ahd->platform_data->eh_sem);
 	}
 	ahd_unlock(ahd, &s);
@@ -5320,13 +5099,14 @@
 	}
 }
 
-static int __init ahd_linux_init(void)
+static int __init
+ahd_linux_init(void)
 {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        return (ahd_linux_detect(&aic79xx_driver_template) ? 0 : -ENODEV);
 #else
 	scsi_register_module(MODULE_SCSI_HA, &aic79xx_driver_template);
-	if (!driver_template.present) {
+	if (aic79xx_driver_template.present == 0) {
 		scsi_unregister_module(MODULE_SCSI_HA,
 				       &aic79xx_driver_template);
 		return (-ENODEV);
@@ -5336,12 +5116,35 @@
 #endif
 }
 
-static void __exit ahd_linux_exit(void)
+static void __exit
+ahd_linux_exit(void)
 {
+	struct ahd_softc *ahd;
+	u_long l;
+
+	/*
+	 * Shutdown DV threads before going into the SCSI mid-layer.
+	 * This avoids situations where the mid-layer locks the entire
+	 * kernel so that waiting for our DV threads to exit leads
+	 * to deadlock.
+	 */
+	ahd_list_lock(&l);
+	TAILQ_FOREACH(ahd, &ahd_tailq, links) {
+
+		ahd_linux_kill_dv_thread(ahd);
+	}
+	ahd_list_unlock(&l);
 #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, &aic79xx_driver_template);
 #endif
 	ahd_linux_pci_exit();
+
+	unregister_reboot_notifier(&ahd_linux_notifier);
 }
 
 module_init(ahd_linux_init);
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h
--- a/drivers/scsi/aic7xxx/aic79xx_osm.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.h	Sat Apr 19 19:51:49 2003
@@ -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#108 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm.h#121 $
  *
  */
 #ifndef _AIC79XX_LINUX_H_
@@ -92,6 +92,7 @@
  * Compile in debugging code, but do not enable any printfs.
  */
 #define AHD_DEBUG 1
+#define AHD_DEBUG_OPTS 0
 #endif
 /* No debugging code. */
 #endif
@@ -286,7 +287,13 @@
 #include <linux/smp.h>
 #endif
 
-#define AIC79XX_DRIVER_VERSION "1.3.0"
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) || defined(SCSI_HAS_HOST_LOCK))
+#define AHD_SCSI_HAS_HOST_LOCK 1
+#else
+#define AHD_SCSI_HAS_HOST_LOCK 0
+#endif
+
+#define AIC79XX_DRIVER_VERSION "1.3.5"
 
 /**************************** Front End Queues ********************************/
 /*
@@ -487,7 +494,7 @@
  * Per-SCB OSM storage.
  */
 typedef enum {
-	AHD_UP_EH_SEMAPHORE = 0x1
+	AHD_SCB_UP_EH_SEM = 0x1
 } ahd_linux_scb_flags;
 
 struct scb_platform_data {
@@ -733,7 +740,6 @@
 static __inline void
 ahd_lock(struct ahd_softc *ahd, unsigned long *flags)
 {
-	*flags = 0;
 	spin_lock_irqsave(&ahd->platform_data->spin_lock, *flags);
 }
 
@@ -747,23 +753,24 @@
 ahd_midlayer_entrypoint_lock(struct ahd_softc *ahd, unsigned long *flags)
 {
 	/*
-	 * In 2.5.X, the midlayer takes our lock just before
-	 * calling us, so avoid locking again.
-	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahd_lock(ahd, flags);
+	 * In 2.5.X and some 2.4.X versions, the midlayer takes our
+	 * lock just before calling us, so we avoid locking again.
+	 * For other kernel versions, the io_request_lock is taken
+	 * just before our entry point is called.  In this case, we
+	 * trade the io_request_lock for our per-softc lock.
+	 */
+#if AHD_SCSI_HAS_HOST_LOCK == 0
+	spin_unlock(&io_request_lock);
+	spin_lock(&ahd->platform_data->spin_lock);
 #endif
 }
 
 static __inline void
 ahd_midlayer_entrypoint_unlock(struct ahd_softc *ahd, unsigned long *flags)
 {
-	/*
-	 * In 2.5.X, the midlayer takes our lock just before
-	 * calling us and unlocks when we return, so let it do the unlock.
-	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahd_unlock(ahd, flags);
+#if AHD_SCSI_HAS_HOST_LOCK == 0
+	spin_unlock(&ahd->platform_data->spin_lock);
+	spin_lock(&io_request_lock);
 #endif
 }
 
@@ -780,17 +787,16 @@
 static __inline void
 ahd_done_lock(struct ahd_softc *ahd, unsigned long *flags)
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	*flags = 0;
-	spin_lock_irqsave(&io_request_lock, *flags);
+#if AHD_SCSI_HAS_HOST_LOCK == 0
+	spin_lock(&io_request_lock);
 #endif
 }
 
 static __inline void
 ahd_done_unlock(struct ahd_softc *ahd, unsigned long *flags)
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_unlock_irqrestore(&io_request_lock, *flags);
+#if AHD_SCSI_HAS_HOST_LOCK == 0
+	spin_unlock(&io_request_lock);
 #endif
 }
 
@@ -803,7 +809,6 @@
 static __inline void
 ahd_list_lock(unsigned long *flags)
 {
-	*flags = 0;
 	spin_lock_irqsave(&ahd_list_spinlock, *flags);
 }
 
@@ -822,7 +827,6 @@
 static __inline void
 ahd_lock(struct ahd_softc *ahd, unsigned long *flags)
 {
-	*flags = 0;
 	save_flags(*flags);
 	cli();
 }
@@ -860,7 +864,6 @@
 static __inline void
 ahd_list_lock(unsigned long *flags)
 {
-	*flags = 0;
 	save_flags(*flags);
 	cli();
 }
@@ -947,7 +950,7 @@
  */
 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,1,92)
 #if defined(__sparc_v9__) || defined(__powerpc__)
-#error "PPC and Sparc platforms are only support under 2.1.92 and above"
+#error "PPC and Sparc platforms are only supported under 2.1.92 and above"
 #endif
 #include <linux/bios32.h>
 #endif
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	Sat Apr 19 19:51:29 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c	Sat Apr 19 19:51:29 2003
@@ -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#20 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_osm_pci.c#21 $
  */
 
 #include "aic79xx_osm.h"
diff -Nru a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c
--- a/drivers/scsi/aic7xxx/aic79xx_pci.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_pci.c	Sat Apr 19 19:51:47 2003
@@ -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#61 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#70 $
  *
  * $FreeBSD$
  */
@@ -80,6 +80,7 @@
 #define ID_AIC7902_B			0x801D9005FFFF9005ull
 #define ID_AIC7902_B_IROC		0x809D9005FFFF9005ull
 #define ID_AHA_39320			0x8010900500409005ull
+#define ID_AHA_39320A			0x8016900500409005ull
 #define ID_AHA_39320D			0x8011900500419005ull
 #define ID_AHA_39320D_B			0x801C900500419005ull
 #define ID_AHA_39320D_HP		0x8011900500AC0E11ull
@@ -138,6 +139,12 @@
 		ahd_aic7902_setup
 	},
 	{
+		ID_AHA_39320A,
+		ID_ALL_MASK,
+		"Adaptec 39320A Ultra320 SCSI adapter",
+		ahd_aic7902_setup
+	},
+	{
 		ID_AHA_39320D,
 		ID_ALL_MASK,
 		"Adaptec 39320D Ultra320 SCSI adapter",
@@ -378,12 +385,10 @@
 int
 ahd_pci_test_register_access(struct ahd_softc *ahd)
 {
-	ahd_mode_state	saved_modes;
 	uint32_t	cmd;
 	int		error;
 	uint8_t		hcntrl;
 
-	saved_modes = ahd_save_modes(ahd);
 	error = EIO;
 
 	/*
@@ -449,7 +454,6 @@
 		ahd_outb(ahd, CLRINT, CLRPCIINT);
 	}
 
-	ahd_restore_modes(ahd, saved_modes);
 	ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS);
 	ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
 	return (error);
@@ -462,6 +466,7 @@
 static int
 ahd_check_extport(struct ahd_softc *ahd)
 {
+	struct	vpd_config vpd;
 	struct	seeprom_config *sc;
 	u_int	adapter_control;
 	int	have_seeprom;
@@ -472,6 +477,27 @@
 	if (have_seeprom) {
 		u_int start_addr;
 
+		/*
+		 * Fetch VPD for this function and parse it.
+		 */
+		if (bootverbose) 
+			printf("%s: Reading VPD from SEEPROM...",
+			       ahd_name(ahd));
+
+		/* Address is always in units of 16bit words */
+		start_addr = ((2 * sizeof(*sc))
+			    + (sizeof(vpd) * (ahd->channel - 'A'))) / 2;
+
+		error = ahd_read_seeprom(ahd, (uint16_t *)&vpd,
+					 start_addr, sizeof(vpd)/2,
+					 /*bytestream*/TRUE);
+		if (error == 0)
+			error = ahd_parse_vpddata(ahd, &vpd);
+		if (bootverbose) 
+			printf("%s: VPD parsing %s\n",
+			       ahd_name(ahd),
+			       error == 0 ? "successful" : "failed");
+
 		if (bootverbose) 
 			printf("%s: Reading SEEPROM...", ahd_name(ahd));
 
@@ -479,7 +505,8 @@
 		start_addr = (sizeof(*sc) / 2) * (ahd->channel - 'A');
 
 		error = ahd_read_seeprom(ahd, (uint16_t *)sc,
-					 start_addr, sizeof(*sc)/2);
+					 start_addr, sizeof(*sc)/2,
+					 /*bytestream*/FALSE);
 
 		if (error != 0) {
 			printf("Unable to read SEEPROM\n");
@@ -698,7 +725,7 @@
 	"%s: Split completion data bucket in %s\n",
 	"%s: Split completion address error in %s\n",
 	"%s: Split completion byte count error in %s\n",
-	"%s: Signaled Target-abort to early terminate a split in %s\n",
+	"%s: Signaled Target-abort to early terminate a split in %s\n"
 };
 
 static const char *pci_status_strings[] =
@@ -799,7 +826,7 @@
 		/* Clear latched errors.  So our interrupt deasserts. */
 		ahd_outb(ahd, DCHSPLTSTAT0, split_status[i]);
 		ahd_outb(ahd, DCHSPLTSTAT1, split_status1[i]);
-		if (i != 0)
+		if (i > 1)
 			continue;
 		sg_split_status[i] = ahd_inb(ahd, SGSPLTSTAT0);
 		sg_split_status1[i] = ahd_inb(ahd, SGSPLTSTAT1);
@@ -821,7 +848,7 @@
 				       split_status_source[i]);
 			}
 
-			if (i != 0)
+			if (i > 1)
 				continue;
 
 			if ((sg_split_status[i] & (0x1 << bit)) != 0) {
@@ -879,11 +906,12 @@
 			  |  AHD_NLQICRC_DELAYED_BUG|AHD_SCSIRST_BUG
 			  |  AHD_LQO_ATNO_BUG|AHD_AUTOFLUSH_BUG
 			  |  AHD_CLRLQO_AUTOCLR_BUG|AHD_PCIX_MMAPIO_BUG
-			  |  AHD_PCIX_CHIPRST_BUG|AHD_PKTIZED_STATUS_BUG
-			  |  AHD_PKT_LUN_BUG|AHD_MDFF_WSCBPTR_BUG
-			  |  AHD_REG_SLOW_SETTLE_BUG|AHD_SET_MODE_BUG
-			  |  AHD_BUSFREEREV_BUG|AHD_NONPACKFIFO_BUG
-			  |  AHD_PACED_NEGTABLE_BUG;
+			  |  AHD_PCIX_CHIPRST_BUG|AHD_PCIX_SCBRAM_RD_BUG
+			  |  AHD_PKTIZED_STATUS_BUG|AHD_PKT_LUN_BUG
+			  |  AHD_MDFF_WSCBPTR_BUG|AHD_REG_SLOW_SETTLE_BUG
+			  |  AHD_SET_MODE_BUG|AHD_BUSFREEREV_BUG
+			  |  AHD_NONPACKFIFO_BUG|AHD_PACED_NEGTABLE_BUG
+			  |  AHD_FAINT_LED_BUG;
 
 		/*
 		 * IO Cell paramter setup.
@@ -898,7 +926,7 @@
 		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_INTCOLLISION_BUG|AHD_EARLY_REQ_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	Sat Apr 19 19:51:50 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_proc.c	Sat Apr 19 19:51:50 2003
@@ -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#11 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic79xx_proc.c#14 $
  */
 #include "aic79xx_osm.h"
 #include "aic79xx_inline.h"
@@ -124,8 +124,12 @@
 
 		printed_options = 0;
 		copy_info(info, " (%d.%03dMHz", freq / 1000, freq % 1000);
+		if ((tinfo->ppr_options & MSG_EXT_PPR_RD_STRM) != 0) {
+			copy_info(info, " RDSTRM");
+			printed_options++;
+		}
 		if ((tinfo->ppr_options & MSG_EXT_PPR_DT_REQ) != 0) {
-			copy_info(info, " DT");
+			copy_info(info, "%s", printed_options ? "|DT" : " DT");
 			printed_options++;
 		}
 		if ((tinfo->ppr_options & MSG_EXT_PPR_IU_REQ) != 0) {
@@ -258,7 +262,8 @@
 		ahd_write_seeprom(ahd, (u_int16_t *)buffer, start_addr,
 				  sizeof(struct seeprom_config)/2);
 		ahd_read_seeprom(ahd, (uint16_t *)ahd->seep_config,
-				 start_addr, sizeof(struct seeprom_config)/2);
+				 start_addr, sizeof(struct seeprom_config)/2,
+				 /*ByteStream*/FALSE);
 		ahd_release_seeprom(ahd);
 		written = length;
 	}
@@ -311,6 +316,7 @@
 
 	copy_info(&info, "Adaptec AIC79xx driver version: %s\n",
 		  AIC79XX_DRIVER_VERSION);
+	copy_info(&info, "%s\n", ahd->description);
 	ahd_controller_info(ahd, ahd_info);
 	copy_info(&info, "%s\n\n", ahd_info);
 
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	Sat Apr 19 19:51:51 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped	Sat Apr 19 19:51:51 2003
@@ -2,8 +2,8 @@
  * DO NOT EDIT - This file is automatically generated
  *		 from the following source files:
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#78 $
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#60 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#89 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#65 $
  */
 typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
 typedef struct ahd_reg_parse_entry {
@@ -3638,13 +3638,14 @@
 
 #define	SCB_RESIDUAL_DATACNT		0x180
 #define	SCB_CDB_STORE   		0x180
+#define	SCB_HOST_CDB_PTR		0x180
 
 #define	SCB_RESIDUAL_SGPTR		0x184
-#define	SCB_CDB_PTR     		0x184
 #define		SG_ADDR_MASK    	0xf8
 #define		SG_OVERRUN_RESID	0x02
 
 #define	SCB_SCSI_STATUS 		0x188
+#define	SCB_HOST_CDB_LEN		0x188
 
 #define	SCB_TARGET_PHASES		0x189
 
@@ -3719,7 +3720,7 @@
 #define	AHD_AMPLITUDE_SHIFT	0x00
 #define	AHD_AMPLITUDE_MASK	0x07
 #define	AHD_ANNEXCOL_AMPLITUDE	0x06
-#define	AHD_SLEWRATE_DEF_REVA	0x01
+#define	AHD_SLEWRATE_DEF_REVA	0x08
 #define	AHD_SLEWRATE_SHIFT	0x03
 #define	AHD_SLEWRATE_MASK	0x78
 #define	AHD_PRECOMP_CUTBACK_29	0x06
@@ -3774,5 +3775,5 @@
 
 
 /* Exported Labels */
-#define	LABEL_seq_isr 	0x263
-#define	LABEL_timer_isr	0x25f
+#define	LABEL_seq_isr 	0x26d
+#define	LABEL_timer_isr	0x269
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	Sat Apr 19 19:51:27 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped	Sat Apr 19 19:51:27 2003
@@ -2,8 +2,8 @@
  * DO NOT EDIT - This file is automatically generated
  *		 from the following source files:
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#78 $
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#60 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#89 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#65 $
  */
 
 #include "aic79xx_osm.h"
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	Sat Apr 19 19:51:51 2003
+++ b/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped	Sat Apr 19 19:51:51 2003
@@ -2,97 +2,102 @@
  * DO NOT EDIT - This file is automatically generated
  *		 from the following source files:
  *
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#78 $
- * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#60 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#89 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#65 $
  */
 static uint8_t seqprog[] = {
 	0xff, 0x02, 0x06, 0x78,
-	0x00, 0xea, 0x46, 0x59,
+	0x00, 0xea, 0x50, 0x59,
 	0x01, 0xea, 0x04, 0x30,
 	0xff, 0x04, 0x0c, 0x78,
-	0x19, 0xea, 0x46, 0x59,
+	0x19, 0xea, 0x50, 0x59,
 	0x19, 0xea, 0x04, 0x00,
-	0x33, 0xea, 0x3a, 0x59,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
 	0x60, 0x3a, 0x1a, 0x68,
 	0x04, 0x47, 0x1b, 0x68,
 	0xff, 0x21, 0x1b, 0x70,
-	0x40, 0x4b, 0x88, 0x69,
-	0x00, 0xe2, 0x4a, 0x59,
-	0x40, 0x4b, 0x88, 0x69,
-	0x20, 0x4b, 0x78, 0x69,
+	0x40, 0x4b, 0x92, 0x69,
+	0x00, 0xe2, 0x54, 0x59,
+	0x40, 0x4b, 0x92, 0x69,
+	0x20, 0x4b, 0x82, 0x69,
 	0xfc, 0x42, 0x24, 0x78,
 	0x10, 0x40, 0x24, 0x78,
-	0x00, 0xe2, 0xa4, 0x5d,
+	0x00, 0xe2, 0xe0, 0x5d,
 	0x20, 0x4d, 0x28, 0x78,
-	0x00, 0xe2, 0xa4, 0x5d,
-	0x00, 0xe2, 0x34, 0x58,
-	0x00, 0xe2, 0x66, 0x58,
-	0x00, 0xe2, 0x76, 0x58,
+	0x00, 0xe2, 0xe0, 0x5d,
+	0x30, 0x3f, 0xc0, 0x09,
+	0x30, 0xe0, 0x30, 0x60,
+	0x7f, 0x4a, 0x94, 0x08,
+	0x00, 0xe2, 0x32, 0x40,
+	0xc0, 0x4a, 0x94, 0x00,
+	0x00, 0xe2, 0x3e, 0x58,
+	0x00, 0xe2, 0x70, 0x58,
+	0x00, 0xe2, 0x80, 0x58,
 	0x00, 0xe2, 0x06, 0x40,
-	0x33, 0xea, 0x3a, 0x59,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
-	0x01, 0x52, 0x66, 0x7d,
+	0x01, 0x52, 0x96, 0x7d,
 	0x02, 0x58, 0x50, 0x31,
 	0xff, 0xea, 0x10, 0x0b,
-	0xff, 0x93, 0x45, 0x78,
-	0x50, 0x4b, 0x40, 0x68,
+	0xff, 0x93, 0x4f, 0x78,
+	0x50, 0x4b, 0x4a, 0x68,
 	0xbf, 0x3a, 0x74, 0x08,
-	0x14, 0xea, 0x46, 0x59,
+	0x14, 0xea, 0x50, 0x59,
 	0x14, 0xea, 0x04, 0x00,
 	0x08, 0xa8, 0x51, 0x03,
-	0x01, 0xa4, 0x4d, 0x78,
-	0x00, 0xe2, 0x44, 0x5b,
-	0x00, 0xe2, 0x34, 0x40,
+	0x01, 0xa4, 0x57, 0x78,
+	0x00, 0xe2, 0x4c, 0x5b,
+	0x00, 0xe2, 0x3e, 0x40,
 	0xff, 0xea, 0xd4, 0x19,
 	0x02, 0xa8, 0x84, 0x32,
-	0x00, 0xea, 0x3a, 0x59,
+	0x00, 0xea, 0x44, 0x59,
 	0x01, 0xea, 0x00, 0x30,
-	0x00, 0xe2, 0x98, 0x5d,
-	0x00, 0xe2, 0x66, 0x4d,
-	0x11, 0xea, 0x3a, 0x59,
+	0x00, 0xe2, 0xcc, 0x5d,
+	0x00, 0xe2, 0x96, 0x4d,
+	0x11, 0xea, 0x44, 0x59,
 	0x11, 0xea, 0x00, 0x00,
-	0x00, 0xe2, 0x98, 0x5d,
-	0x00, 0xe2, 0x66, 0x4d,
-	0x33, 0xea, 0x3a, 0x59,
+	0x00, 0xe2, 0xcc, 0x5d,
+	0x00, 0xe2, 0x96, 0x4d,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
-	0x00, 0xe2, 0x3a, 0x43,
-	0x00, 0xea, 0x3a, 0x59,
+	0x00, 0xe2, 0x44, 0x43,
+	0x00, 0xea, 0x44, 0x59,
 	0x01, 0xea, 0x00, 0x30,
-	0x80, 0xf9, 0x6e, 0x68,
-	0x00, 0xe2, 0x38, 0x59,
-	0x11, 0xea, 0x3a, 0x59,
+	0x80, 0xf9, 0x78, 0x68,
+	0x00, 0xe2, 0x42, 0x59,
+	0x11, 0xea, 0x44, 0x59,
 	0x11, 0xea, 0x00, 0x00,
-	0x80, 0xf9, 0x38, 0x79,
+	0x80, 0xf9, 0x42, 0x79,
 	0xff, 0xea, 0xd4, 0x0d,
-	0x22, 0xea, 0x3a, 0x59,
+	0x22, 0xea, 0x44, 0x59,
 	0x22, 0xea, 0x00, 0x00,
-	0x10, 0x16, 0x80, 0x78,
+	0x10, 0x16, 0x8a, 0x78,
 	0x01, 0x0b, 0xa2, 0x32,
 	0x10, 0x16, 0x2c, 0x00,
-	0x18, 0xad, 0xee, 0x78,
-	0x04, 0xad, 0xbc, 0x68,
-	0x80, 0xad, 0x66, 0x7d,
-	0x10, 0xad, 0x8a, 0x78,
+	0x18, 0xad, 0xf8, 0x78,
+	0x04, 0xad, 0xc6, 0x68,
+	0x80, 0xad, 0x96, 0x7d,
+	0x10, 0xad, 0x94, 0x78,
 	0xe7, 0xad, 0x5a, 0x0d,
 	0xe7, 0xad, 0x5a, 0x09,
-	0x00, 0xe2, 0x98, 0x58,
+	0x00, 0xe2, 0xa2, 0x58,
 	0xff, 0xea, 0x56, 0x02,
 	0x04, 0x7c, 0x78, 0x32,
-	0x20, 0x16, 0x66, 0x7d,
+	0x20, 0x16, 0x96, 0x7d,
 	0x04, 0x38, 0x79, 0x32,
 	0x80, 0x37, 0x6f, 0x16,
-	0xff, 0x2d, 0xa7, 0x60,
-	0xff, 0x29, 0xa7, 0x60,
-	0x40, 0x51, 0xb7, 0x78,
-	0xff, 0x4f, 0xa7, 0x68,
+	0xff, 0x2d, 0xb1, 0x60,
+	0xff, 0x29, 0xb1, 0x60,
+	0x40, 0x51, 0xc1, 0x78,
+	0xff, 0x4f, 0xb1, 0x68,
 	0xff, 0x4d, 0xc1, 0x19,
 	0x00, 0x4e, 0xd5, 0x19,
-	0x00, 0xe2, 0xb6, 0x50,
+	0x00, 0xe2, 0xc0, 0x50,
 	0x01, 0x4c, 0xc1, 0x31,
 	0x00, 0x50, 0xd5, 0x19,
-	0x00, 0xe2, 0xb6, 0x48,
-	0x80, 0x18, 0x66, 0x7d,
+	0x00, 0xe2, 0xc0, 0x48,
+	0x80, 0x18, 0x96, 0x7d,
 	0x02, 0x4a, 0x1d, 0x30,
 	0x10, 0xea, 0x18, 0x00,
 	0x60, 0x18, 0x30, 0x00,
@@ -100,7 +105,7 @@
 	0x02, 0xea, 0x02, 0x00,
 	0xff, 0xea, 0xa0, 0x0a,
 	0x80, 0x18, 0x30, 0x04,
-	0x40, 0xad, 0x66, 0x7d,
+	0x40, 0xad, 0x96, 0x7d,
 	0xe7, 0xad, 0x5a, 0x09,
 	0x02, 0xa8, 0x40, 0x31,
 	0xff, 0xea, 0xc0, 0x09,
@@ -110,25 +115,25 @@
 	0xff, 0xea, 0x2a, 0x03,
 	0xff, 0xea, 0x2e, 0x03,
 	0x01, 0x10, 0xd4, 0x31,
-	0x10, 0xa8, 0xe3, 0x68,
+	0x10, 0xa8, 0xed, 0x68,
 	0x3d, 0xa9, 0xc5, 0x29,
 	0xfe, 0xe2, 0xc4, 0x09,
 	0x01, 0xea, 0xc6, 0x01,
 	0x02, 0xe2, 0xc8, 0x31,
 	0x02, 0xec, 0x50, 0x31,
 	0x02, 0xa0, 0xda, 0x31,
-	0xff, 0xa9, 0xe2, 0x70,
+	0xff, 0xa9, 0xec, 0x70,
 	0x02, 0xa0, 0x28, 0x37,
-	0xff, 0x21, 0xeb, 0x70,
+	0xff, 0x21, 0xf5, 0x70,
 	0x02, 0x22, 0x51, 0x31,
 	0x02, 0xa0, 0x2c, 0x33,
 	0x02, 0xa0, 0x44, 0x36,
 	0x02, 0xa0, 0x40, 0x32,
 	0x02, 0xa0, 0x44, 0x36,
-	0x04, 0x47, 0xf3, 0x68,
-	0x40, 0x16, 0x1e, 0x69,
-	0xff, 0x2d, 0x23, 0x61,
-	0xff, 0x29, 0x67, 0x75,
+	0x04, 0x47, 0xfd, 0x68,
+	0x40, 0x16, 0x28, 0x69,
+	0xff, 0x2d, 0x2d, 0x61,
+	0xff, 0x29, 0x97, 0x75,
 	0x01, 0x37, 0xc1, 0x31,
 	0x02, 0x28, 0x55, 0x32,
 	0x01, 0xea, 0x5a, 0x01,
@@ -140,20 +145,20 @@
 	0x01, 0x50, 0xa1, 0x1a,
 	0xff, 0x4e, 0x9d, 0x1a,
 	0xff, 0x4f, 0x9f, 0x22,
-	0xff, 0x8d, 0x17, 0x71,
-	0x80, 0xac, 0x16, 0x71,
-	0x20, 0x16, 0x16, 0x69,
+	0xff, 0x8d, 0x21, 0x71,
+	0x80, 0xac, 0x20, 0x71,
+	0x20, 0x16, 0x20, 0x69,
 	0x02, 0x8c, 0x51, 0x31,
-	0x00, 0xe2, 0x00, 0x41,
+	0x00, 0xe2, 0x0a, 0x41,
 	0x01, 0xac, 0x08, 0x31,
 	0x09, 0xea, 0x5a, 0x01,
 	0x02, 0x8c, 0x51, 0x32,
 	0xff, 0xea, 0x1a, 0x07,
 	0x04, 0x24, 0xf9, 0x30,
-	0x1d, 0xea, 0x2e, 0x41,
+	0x1d, 0xea, 0x38, 0x41,
 	0x02, 0x2c, 0x51, 0x31,
 	0x04, 0xac, 0xf9, 0x30,
-	0x19, 0xea, 0x2e, 0x59,
+	0x19, 0xea, 0x38, 0x59,
 	0x02, 0x8c, 0x59, 0x32,
 	0x02, 0x28, 0x19, 0x33,
 	0x02, 0xa8, 0x50, 0x36,
@@ -175,23 +180,23 @@
 	0x02, 0x20, 0xb9, 0x30,
 	0x02, 0x20, 0x51, 0x31,
 	0x4c, 0xa9, 0xd7, 0x28,
-	0x10, 0xa8, 0x59, 0x79,
+	0x10, 0xa8, 0x63, 0x79,
 	0x01, 0x6b, 0xc0, 0x30,
 	0x02, 0x64, 0xc8, 0x00,
 	0x40, 0x3a, 0x74, 0x04,
-	0x00, 0xe2, 0x66, 0x58,
-	0x33, 0xea, 0x3a, 0x59,
+	0x00, 0xe2, 0x70, 0x58,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
 	0x30, 0x3f, 0xc0, 0x09,
-	0x30, 0xe0, 0x5a, 0x61,
-	0x20, 0x3f, 0x70, 0x69,
-	0x10, 0x3f, 0x5a, 0x79,
+	0x30, 0xe0, 0x64, 0x61,
+	0x20, 0x3f, 0x7a, 0x69,
+	0x10, 0x3f, 0x64, 0x79,
 	0x02, 0xea, 0x7e, 0x00,
-	0x00, 0xea, 0x3a, 0x59,
+	0x00, 0xea, 0x44, 0x59,
 	0x01, 0xea, 0x00, 0x30,
 	0x02, 0x48, 0x51, 0x35,
 	0x01, 0xea, 0x7e, 0x00,
-	0x11, 0xea, 0x3a, 0x59,
+	0x11, 0xea, 0x44, 0x59,
 	0x11, 0xea, 0x00, 0x00,
 	0x02, 0x48, 0x51, 0x35,
 	0x08, 0xea, 0x98, 0x00,
@@ -201,11 +206,11 @@
 	0x0f, 0x67, 0xc0, 0x09,
 	0x00, 0x34, 0x69, 0x02,
 	0x20, 0xea, 0x96, 0x00,
-	0x00, 0xe2, 0xee, 0x41,
-	0x40, 0x3a, 0xa4, 0x69,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x40, 0x3a, 0xae, 0x69,
 	0x02, 0x55, 0x06, 0x68,
-	0x02, 0x56, 0xa4, 0x69,
-	0xff, 0x5b, 0xa4, 0x61,
+	0x02, 0x56, 0xae, 0x69,
+	0xff, 0x5b, 0xae, 0x61,
 	0x02, 0x20, 0x51, 0x31,
 	0x80, 0xea, 0xb2, 0x01,
 	0x44, 0xea, 0x00, 0x00,
@@ -213,36 +218,36 @@
 	0x33, 0xea, 0x00, 0x00,
 	0xff, 0xea, 0xb2, 0x09,
 	0xff, 0xe0, 0xc0, 0x19,
-	0xff, 0xe0, 0xa6, 0x79,
+	0xff, 0xe0, 0xb0, 0x79,
 	0x02, 0x94, 0x51, 0x31,
-	0x00, 0xe2, 0x9c, 0x41,
+	0x00, 0xe2, 0xa6, 0x41,
 	0x02, 0x5e, 0x50, 0x31,
 	0x02, 0xa8, 0xb8, 0x30,
 	0x02, 0x5c, 0x50, 0x31,
-	0xff, 0x95, 0xb7, 0x71,
+	0xff, 0x95, 0xc1, 0x71,
 	0x02, 0x94, 0x41, 0x31,
 	0x02, 0x22, 0x51, 0x31,
 	0x02, 0xa0, 0x2c, 0x33,
 	0x02, 0xa0, 0x44, 0x32,
-	0x00, 0xe2, 0xc0, 0x41,
-	0x10, 0xa8, 0xc1, 0x69,
+	0x00, 0xe2, 0xca, 0x41,
+	0x10, 0xa8, 0xcb, 0x69,
 	0x3d, 0xa9, 0xc9, 0x29,
 	0x01, 0xe4, 0xc8, 0x01,
 	0x01, 0xea, 0xca, 0x01,
 	0xff, 0xea, 0xda, 0x01,
 	0x02, 0x20, 0x51, 0x31,
 	0x02, 0x96, 0x41, 0x32,
-	0xff, 0x21, 0xc9, 0x61,
+	0xff, 0x21, 0xd3, 0x61,
 	0xff, 0xea, 0x46, 0x02,
 	0x02, 0x5c, 0x50, 0x31,
 	0x40, 0xea, 0x96, 0x00,
-	0x02, 0x56, 0xac, 0x6d,
-	0x01, 0x55, 0xac, 0x6d,
-	0x10, 0xa8, 0xd5, 0x79,
-	0x10, 0x40, 0xde, 0x69,
-	0x01, 0x56, 0xde, 0x79,
+	0x02, 0x56, 0xe8, 0x6d,
+	0x01, 0x55, 0xe8, 0x6d,
+	0x10, 0xa8, 0xdf, 0x79,
+	0x10, 0x40, 0xe8, 0x69,
+	0x01, 0x56, 0xe8, 0x79,
 	0xff, 0x93, 0x07, 0x78,
-	0x13, 0xea, 0x46, 0x59,
+	0x13, 0xea, 0x50, 0x59,
 	0x13, 0xea, 0x04, 0x00,
 	0x00, 0xe2, 0x06, 0x40,
 	0xbf, 0x3a, 0x74, 0x08,
@@ -253,104 +258,104 @@
 	0x40, 0xea, 0x66, 0x02,
 	0x08, 0x3c, 0x78, 0x00,
 	0x80, 0xea, 0x62, 0x02,
-	0x00, 0xe2, 0xa4, 0x5b,
+	0x00, 0xe2, 0xac, 0x5b,
 	0x01, 0x36, 0xc1, 0x31,
-	0x9f, 0xe0, 0x38, 0x7c,
-	0x80, 0xe0, 0x02, 0x72,
-	0xa0, 0xe0, 0x3a, 0x72,
-	0xc0, 0xe0, 0x30, 0x72,
-	0xe0, 0xe0, 0x6a, 0x72,
-	0x01, 0xea, 0x46, 0x59,
+	0x9f, 0xe0, 0x4e, 0x7c,
+	0x80, 0xe0, 0x0c, 0x72,
+	0xa0, 0xe0, 0x44, 0x72,
+	0xc0, 0xe0, 0x3a, 0x72,
+	0xe0, 0xe0, 0x74, 0x72,
+	0x01, 0xea, 0x50, 0x59,
 	0x01, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xee, 0x41,
-	0x80, 0x33, 0x09, 0x7a,
-	0x03, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x80, 0x33, 0x13, 0x7a,
+	0x03, 0xea, 0x50, 0x59,
 	0x03, 0xea, 0x04, 0x00,
-	0xee, 0x00, 0x10, 0x6a,
+	0xee, 0x00, 0x1a, 0x6a,
 	0x05, 0xea, 0xb4, 0x00,
-	0x33, 0xea, 0x3a, 0x59,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
 	0x02, 0xa8, 0x90, 0x32,
-	0x00, 0xe2, 0x60, 0x59,
+	0x00, 0xe2, 0x6a, 0x59,
 	0xef, 0x92, 0xd5, 0x19,
-	0x00, 0xe2, 0x20, 0x52,
-	0x0b, 0x84, 0xe1, 0x30,
+	0x00, 0xe2, 0x2a, 0x52,
+	0x09, 0x80, 0xe1, 0x30,
 	0x02, 0xea, 0x36, 0x00,
 	0xa8, 0xea, 0x32, 0x00,
-	0x00, 0xe2, 0x26, 0x42,
+	0x00, 0xe2, 0x30, 0x42,
 	0x01, 0x92, 0xd1, 0x30,
 	0x10, 0x80, 0x89, 0x31,
 	0x20, 0xea, 0x32, 0x00,
 	0xbf, 0x33, 0x67, 0x0a,
-	0x20, 0x19, 0x28, 0x6a,
-	0x02, 0x4d, 0xee, 0x69,
+	0x20, 0x19, 0x32, 0x6a,
+	0x02, 0x4d, 0xf8, 0x69,
 	0x40, 0x33, 0x67, 0x02,
-	0x00, 0xe2, 0xee, 0x41,
-	0x80, 0x33, 0xa7, 0x6a,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x80, 0x33, 0xb1, 0x6a,
 	0x01, 0x44, 0x10, 0x33,
 	0x08, 0xa8, 0x51, 0x03,
-	0x00, 0xe2, 0xee, 0x41,
+	0x00, 0xe2, 0xf8, 0x41,
 	0x10, 0xea, 0x80, 0x00,
 	0x01, 0x31, 0xc5, 0x31,
-	0x80, 0xe2, 0x56, 0x62,
-	0x10, 0xa8, 0x7b, 0x6a,
+	0x80, 0xe2, 0x60, 0x62,
+	0x10, 0xa8, 0x85, 0x6a,
 	0xc0, 0xaa, 0xc5, 0x01,
-	0x40, 0xa8, 0x47, 0x6a,
+	0x40, 0xa8, 0x51, 0x6a,
 	0xbf, 0xe2, 0xc4, 0x09,
-	0x20, 0xa8, 0x5b, 0x7a,
+	0x20, 0xa8, 0x65, 0x7a,
 	0x01, 0xe2, 0x88, 0x30,
-	0x00, 0xe2, 0xa4, 0x5b,
-	0xa0, 0x36, 0x63, 0x62,
+	0x00, 0xe2, 0xac, 0x5b,
+	0xa0, 0x36, 0x6d, 0x62,
 	0x23, 0xa8, 0x89, 0x08,
-	0x00, 0xe2, 0xa4, 0x5b,
-	0xa0, 0x36, 0x63, 0x62,
-	0x00, 0xa8, 0x5a, 0x42,
-	0xff, 0xe2, 0x5a, 0x62,
-	0x00, 0xe2, 0x7a, 0x42,
+	0x00, 0xe2, 0xac, 0x5b,
+	0xa0, 0x36, 0x6d, 0x62,
+	0x00, 0xa8, 0x64, 0x42,
+	0xff, 0xe2, 0x64, 0x62,
+	0x00, 0xe2, 0x84, 0x42,
 	0x40, 0xea, 0x98, 0x00,
 	0x01, 0xe2, 0x88, 0x30,
-	0x00, 0xe2, 0xa4, 0x5b,
-	0xa0, 0x36, 0x39, 0x72,
+	0x00, 0xe2, 0xac, 0x5b,
+	0xa0, 0x36, 0x43, 0x72,
 	0x40, 0xea, 0x98, 0x00,
 	0x01, 0x31, 0x89, 0x32,
 	0x08, 0xea, 0x62, 0x02,
-	0x00, 0xe2, 0xee, 0x41,
-	0xe0, 0xea, 0xb4, 0x5b,
-	0x80, 0xe0, 0xb2, 0x6a,
-	0x04, 0xe0, 0x52, 0x73,
-	0x02, 0xe0, 0x82, 0x73,
-	0x00, 0xea, 0x10, 0x73,
-	0x03, 0xe0, 0x92, 0x73,
-	0x23, 0xe0, 0x8c, 0x72,
-	0x08, 0xe0, 0xae, 0x72,
-	0x00, 0xe2, 0xa4, 0x5b,
-	0x07, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0xf8, 0x41,
+	0xe0, 0xea, 0xc8, 0x5b,
+	0x80, 0xe0, 0xbc, 0x6a,
+	0x04, 0xe0, 0x5a, 0x73,
+	0x02, 0xe0, 0x8a, 0x73,
+	0x00, 0xea, 0x1a, 0x73,
+	0x03, 0xe0, 0x9a, 0x73,
+	0x23, 0xe0, 0x96, 0x72,
+	0x08, 0xe0, 0xb8, 0x72,
+	0x00, 0xe2, 0xac, 0x5b,
+	0x07, 0xea, 0x50, 0x59,
 	0x07, 0xea, 0x04, 0x00,
-	0x08, 0x42, 0xef, 0x71,
-	0x04, 0x42, 0x89, 0x62,
+	0x08, 0x42, 0xf9, 0x71,
+	0x04, 0x42, 0x93, 0x62,
 	0x01, 0x43, 0x89, 0x30,
-	0x00, 0xe2, 0x7a, 0x42,
+	0x00, 0xe2, 0x84, 0x42,
 	0x01, 0x44, 0xd4, 0x31,
-	0x00, 0xe2, 0x7a, 0x42,
+	0x00, 0xe2, 0x84, 0x42,
 	0x01, 0x00, 0x60, 0x32,
-	0x33, 0xea, 0x3a, 0x59,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
 	0x4c, 0x34, 0xc1, 0x28,
 	0x01, 0x64, 0xc0, 0x31,
-	0x00, 0x30, 0x3b, 0x59,
+	0x00, 0x30, 0x45, 0x59,
 	0x01, 0x30, 0x01, 0x30,
-	0x01, 0xe0, 0xac, 0x7a,
-	0xa0, 0xea, 0xaa, 0x5b,
-	0x01, 0xa0, 0xac, 0x62,
-	0x01, 0x84, 0xa5, 0x7a,
-	0x01, 0xa7, 0xae, 0x7a,
-	0x00, 0xe2, 0xae, 0x42,
-	0x03, 0xea, 0x46, 0x59,
+	0x01, 0xe0, 0xb6, 0x7a,
+	0xa0, 0xea, 0xbe, 0x5b,
+	0x01, 0xa0, 0xb6, 0x62,
+	0x01, 0x84, 0xaf, 0x7a,
+	0x01, 0xa7, 0xb8, 0x7a,
+	0x00, 0xe2, 0xb8, 0x42,
+	0x03, 0xea, 0x50, 0x59,
 	0x03, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xae, 0x42,
-	0x07, 0xea, 0xbc, 0x5b,
+	0x00, 0xe2, 0xb8, 0x42,
+	0x07, 0xea, 0xd0, 0x5b,
 	0x01, 0x44, 0xd4, 0x31,
-	0x00, 0xe2, 0xee, 0x41,
+	0x00, 0xe2, 0xf8, 0x41,
 	0x3f, 0xe0, 0x6a, 0x0a,
 	0xc0, 0x34, 0xc1, 0x09,
 	0x00, 0x35, 0x51, 0x01,
@@ -361,54 +366,54 @@
 	0x01, 0xea, 0xc6, 0x01,
 	0x02, 0xe2, 0xc8, 0x31,
 	0x02, 0xec, 0x40, 0x31,
-	0xff, 0xa1, 0xce, 0x72,
+	0xff, 0xa1, 0xd8, 0x72,
 	0x02, 0xe8, 0xda, 0x31,
 	0x02, 0xa0, 0x50, 0x31,
-	0x00, 0xe2, 0xf0, 0x42,
+	0x00, 0xe2, 0xfa, 0x42,
 	0x80, 0x33, 0x67, 0x02,
 	0x01, 0x44, 0xd4, 0x31,
-	0x00, 0xe2, 0xa4, 0x5b,
+	0x00, 0xe2, 0xac, 0x5b,
 	0x01, 0x33, 0x67, 0x02,
-	0xe0, 0x36, 0x0b, 0x63,
+	0xe0, 0x36, 0x15, 0x63,
 	0x02, 0x33, 0x67, 0x02,
-	0x20, 0x46, 0x04, 0x63,
+	0x20, 0x46, 0x0e, 0x63,
 	0xff, 0xea, 0x52, 0x09,
-	0xa8, 0xea, 0xaa, 0x5b,
-	0x04, 0xa8, 0xeb, 0x7a,
+	0xa8, 0xea, 0xbe, 0x5b,
+	0x04, 0xa8, 0xf5, 0x7a,
 	0x01, 0x34, 0xc1, 0x31,
-	0x00, 0xa9, 0xeb, 0x62,
+	0x00, 0xa9, 0xf5, 0x62,
 	0x01, 0x35, 0xc1, 0x31,
-	0x00, 0xaa, 0xf5, 0x72,
+	0x00, 0xaa, 0xff, 0x72,
 	0x01, 0xa9, 0x52, 0x11,
-	0xff, 0xa9, 0xe0, 0x6a,
-	0x00, 0xe2, 0x04, 0x43,
+	0xff, 0xa9, 0xea, 0x6a,
+	0x00, 0xe2, 0x0e, 0x43,
 	0x10, 0x33, 0x67, 0x02,
-	0x04, 0xa8, 0x05, 0x7b,
+	0x04, 0xa8, 0x0f, 0x7b,
 	0xfb, 0xa8, 0x51, 0x0b,
 	0xff, 0xea, 0x66, 0x0a,
-	0x01, 0xa4, 0xff, 0x6a,
+	0x01, 0xa4, 0x09, 0x6b,
 	0x02, 0xa8, 0x90, 0x32,
-	0x00, 0xe2, 0x60, 0x59,
-	0x10, 0xa8, 0xaf, 0x7a,
-	0xff, 0xea, 0xbc, 0x5b,
-	0x00, 0xe2, 0xae, 0x42,
-	0x04, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0x6a, 0x59,
+	0x10, 0xa8, 0xb9, 0x7a,
+	0xff, 0xea, 0xd0, 0x5b,
+	0x00, 0xe2, 0xb8, 0x42,
+	0x04, 0xea, 0x50, 0x59,
 	0x04, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xae, 0x42,
-	0x04, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0xb8, 0x42,
+	0x04, 0xea, 0x50, 0x59,
 	0x04, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xee, 0x41,
-	0x08, 0xa8, 0xa7, 0x7a,
-	0xc0, 0x33, 0x1b, 0x7b,
-	0x80, 0x33, 0xa7, 0x6a,
-	0xff, 0x88, 0x1b, 0x6b,
-	0x40, 0x33, 0xa7, 0x6a,
-	0x10, 0xa8, 0x21, 0x7b,
-	0x0a, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x08, 0xa8, 0xb1, 0x7a,
+	0xc0, 0x33, 0x25, 0x7b,
+	0x80, 0x33, 0xb1, 0x6a,
+	0xff, 0x88, 0x25, 0x6b,
+	0x40, 0x33, 0xb1, 0x6a,
+	0x10, 0xa8, 0x2b, 0x7b,
+	0x0a, 0xea, 0x50, 0x59,
 	0x0a, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0x3a, 0x5b,
-	0x00, 0xe2, 0x6e, 0x43,
-	0x50, 0x4b, 0x28, 0x6b,
+	0x00, 0xe2, 0x44, 0x5b,
+	0x00, 0xe2, 0x76, 0x43,
+	0x50, 0x4b, 0x32, 0x6b,
 	0xbf, 0x3a, 0x74, 0x08,
 	0x01, 0xe0, 0xf8, 0x31,
 	0xff, 0xea, 0xc0, 0x09,
@@ -416,24 +421,23 @@
 	0x00, 0x2f, 0x5f, 0x22,
 	0x04, 0x47, 0x8f, 0x02,
 	0x01, 0xfc, 0xc0, 0x35,
-	0x33, 0xea, 0x3a, 0x59,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
 	0x02, 0x42, 0x51, 0x31,
-	0x10, 0xa8, 0x51, 0x03,
-	0xff, 0x88, 0x49, 0x6b,
-	0x01, 0xa4, 0x45, 0x6b,
-	0x02, 0xa4, 0x4d, 0x6b,
-	0x01, 0x84, 0x4d, 0x7b,
+	0xff, 0x88, 0x51, 0x6b,
+	0x01, 0xa4, 0x4d, 0x6b,
+	0x02, 0xa4, 0x55, 0x6b,
+	0x01, 0x84, 0x55, 0x7b,
 	0x02, 0x28, 0x19, 0x33,
 	0x02, 0xa8, 0x50, 0x36,
-	0xff, 0x88, 0x4d, 0x73,
-	0x00, 0xe2, 0x24, 0x5b,
+	0xff, 0x88, 0x55, 0x73,
+	0x00, 0xe2, 0x2e, 0x5b,
 	0x02, 0x2c, 0x19, 0x33,
 	0x02, 0xa8, 0x58, 0x32,
 	0x04, 0xa4, 0x49, 0x07,
-	0xc0, 0x33, 0xa7, 0x6a,
+	0xc0, 0x33, 0xb1, 0x6a,
 	0x04, 0xa8, 0x51, 0x03,
-	0x20, 0xa8, 0x6f, 0x6b,
+	0x20, 0xa8, 0x77, 0x6b,
 	0x02, 0xa8, 0x40, 0x31,
 	0xc0, 0x34, 0xc1, 0x09,
 	0x00, 0x35, 0x51, 0x01,
@@ -448,66 +452,73 @@
 	0xf7, 0x57, 0xae, 0x08,
 	0x08, 0xea, 0x98, 0x00,
 	0x01, 0x44, 0xd4, 0x31,
-	0xee, 0x00, 0x78, 0x6b,
+	0xee, 0x00, 0x80, 0x6b,
 	0x02, 0xea, 0xb4, 0x00,
-	0x00, 0xe2, 0xa0, 0x5b,
-	0x09, 0x4c, 0x7a, 0x7b,
+	0x00, 0xe2, 0xa8, 0x5b,
+	0x09, 0x4c, 0x82, 0x7b,
 	0x08, 0x4c, 0x06, 0x68,
-	0x0b, 0xea, 0x46, 0x59,
+	0x0b, 0xea, 0x50, 0x59,
 	0x0b, 0xea, 0x04, 0x00,
 	0x01, 0x44, 0xd4, 0x31,
-	0x20, 0x33, 0xef, 0x79,
-	0x00, 0xe2, 0x8a, 0x5b,
-	0x00, 0xe2, 0xee, 0x41,
-	0x01, 0x84, 0x8f, 0x7b,
+	0x20, 0x33, 0xf9, 0x79,
+	0x00, 0xe2, 0x92, 0x5b,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x01, 0x84, 0x97, 0x7b,
 	0x01, 0xa4, 0x49, 0x07,
 	0x08, 0x60, 0x30, 0x33,
 	0x08, 0x80, 0x41, 0x37,
 	0xdf, 0x33, 0x67, 0x0a,
-	0xee, 0x00, 0x9c, 0x6b,
+	0xee, 0x00, 0xa4, 0x6b,
 	0x05, 0xea, 0xb4, 0x00,
-	0x33, 0xea, 0x3a, 0x59,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
-	0x00, 0xe2, 0x60, 0x59,
-	0x00, 0xe2, 0xae, 0x42,
+	0x00, 0xe2, 0x6a, 0x59,
+	0x00, 0xe2, 0xb8, 0x42,
 	0x01, 0xea, 0x6c, 0x02,
 	0xc0, 0xea, 0x66, 0x06,
-	0xff, 0x42, 0xa4, 0x7b,
-	0x04, 0x4c, 0xa4, 0x6b,
+	0xff, 0x42, 0xb8, 0x6b,
+	0x01, 0x41, 0xac, 0x6b,
+	0x02, 0x41, 0xac, 0x7b,
+	0xff, 0x42, 0xb8, 0x6b,
+	0x01, 0x41, 0xac, 0x6b,
+	0x02, 0x41, 0xac, 0x7b,
+	0xff, 0x42, 0xb8, 0x7b,
+	0x04, 0x4c, 0xac, 0x6b,
 	0xe0, 0x41, 0x6c, 0x0e,
 	0x01, 0x44, 0xd4, 0x31,
-	0xff, 0x42, 0xac, 0x7b,
-	0x04, 0x4c, 0xac, 0x6b,
+	0xff, 0x42, 0xc0, 0x7b,
+	0x04, 0x4c, 0xc0, 0x6b,
 	0xe0, 0x41, 0x6c, 0x0a,
-	0xe0, 0x36, 0xef, 0x61,
+	0xe0, 0x36, 0xf9, 0x61,
 	0xff, 0xea, 0xca, 0x09,
 	0x01, 0xe2, 0xc8, 0x31,
 	0x01, 0x46, 0xda, 0x35,
 	0x01, 0x44, 0xd4, 0x35,
 	0x10, 0xea, 0x80, 0x00,
 	0x01, 0xe2, 0x62, 0x36,
-	0x04, 0xa6, 0xc4, 0x7b,
+	0x04, 0xa6, 0xd8, 0x7b,
 	0xff, 0xea, 0x5a, 0x09,
 	0xff, 0xea, 0x4c, 0x0d,
-	0x01, 0xa6, 0xe2, 0x6b,
-	0x10, 0xad, 0x66, 0x7d,
-	0x80, 0xad, 0xda, 0x6b,
-	0x08, 0xad, 0x66, 0x6d,
+	0x01, 0xa6, 0xf6, 0x6b,
+	0x10, 0xad, 0x96, 0x7d,
+	0x80, 0xad, 0xee, 0x6b,
+	0x08, 0xad, 0x96, 0x6d,
 	0x04, 0x84, 0xf9, 0x30,
 	0x00, 0xea, 0x08, 0x81,
 	0xff, 0xea, 0xd4, 0x09,
 	0x02, 0x84, 0xf9, 0x88,
-	0x1d, 0xea, 0x5a, 0x01,
+	0x0d, 0xea, 0x5a, 0x01,
 	0x04, 0xa6, 0x4c, 0x05,
-	0x04, 0xa6, 0x66, 0x7d,
+	0x04, 0xa6, 0x96, 0x7d,
 	0xff, 0xea, 0x5a, 0x09,
 	0x03, 0x84, 0x59, 0x89,
 	0x03, 0xea, 0x4c, 0x01,
-	0x80, 0x1a, 0x66, 0x7d,
+	0x80, 0x1a, 0x96, 0x7d,
+	0x08, 0x19, 0x96, 0x7d,
 	0x08, 0xb0, 0xe0, 0x30,
 	0x04, 0xb0, 0xe0, 0x30,
 	0x03, 0xb0, 0xf0, 0x30,
-	0x01, 0x78, 0xee, 0x7b,
+	0x01, 0x78, 0x04, 0x7c,
 	0x01, 0xa7, 0x4e, 0x11,
 	0x01, 0xb0, 0x06, 0x33,
 	0x7f, 0x83, 0xe9, 0x08,
@@ -518,247 +529,267 @@
 	0x00, 0x86, 0x0d, 0x23,
 	0x00, 0x87, 0x0f, 0x23,
 	0x01, 0x84, 0xc5, 0x31,
-	0x01, 0xa7, 0x04, 0x7c,
+	0x01, 0xa7, 0x1a, 0x7c,
 	0x04, 0xe2, 0xc4, 0x01,
-	0x80, 0x83, 0x0b, 0x7c,
+	0x80, 0x83, 0x21, 0x7c,
 	0x02, 0xe2, 0xc4, 0x01,
 	0xff, 0xea, 0x4c, 0x09,
 	0x01, 0xe2, 0x36, 0x30,
 	0xc8, 0x19, 0x32, 0x00,
 	0x88, 0x19, 0x32, 0x00,
 	0x01, 0xac, 0xd4, 0x99,
-	0x00, 0xe2, 0x66, 0x55,
+	0x00, 0xe2, 0x96, 0x55,
 	0xfe, 0xa6, 0x4c, 0x0d,
 	0x0b, 0x98, 0xe1, 0x30,
 	0x01, 0xa0, 0x4f, 0x09,
 	0xfd, 0xa4, 0x49, 0x09,
-	0x80, 0xa3, 0x21, 0x7c,
+	0x80, 0xa3, 0x37, 0x7c,
 	0x02, 0xa4, 0x48, 0x01,
-	0x01, 0xa7, 0x24, 0x7c,
+	0x01, 0xa7, 0x3a, 0x7c,
 	0x04, 0xa4, 0x48, 0x01,
 	0x01, 0xa4, 0x36, 0x30,
 	0xa8, 0xea, 0x32, 0x00,
 	0xfd, 0xa4, 0x49, 0x0b,
 	0x05, 0xa3, 0x07, 0x33,
-	0x80, 0x83, 0x31, 0x6c,
+	0x80, 0x83, 0x47, 0x6c,
 	0x02, 0xea, 0x4c, 0x05,
 	0xff, 0xea, 0x4c, 0x0d,
-	0x00, 0xe2, 0x32, 0x59,
-	0x02, 0xa6, 0xc6, 0x6b,
+	0x00, 0xe2, 0x3c, 0x59,
+	0x02, 0xa6, 0xda, 0x6b,
 	0x80, 0xf9, 0xf2, 0x05,
-	0xc0, 0x33, 0x3f, 0x7c,
-	0x03, 0xea, 0x46, 0x59,
+	0xc0, 0x33, 0x55, 0x7c,
+	0x03, 0xea, 0x50, 0x59,
 	0x03, 0xea, 0x04, 0x00,
-	0x20, 0x33, 0x63, 0x7c,
-	0x01, 0x84, 0x49, 0x6c,
-	0x06, 0xea, 0x46, 0x59,
+	0x20, 0x33, 0x79, 0x7c,
+	0x01, 0x84, 0x5f, 0x6c,
+	0x06, 0xea, 0x50, 0x59,
 	0x06, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0x66, 0x44,
+	0x00, 0xe2, 0x7c, 0x44,
 	0x01, 0x00, 0x60, 0x32,
-	0xee, 0x00, 0x52, 0x6c,
+	0xee, 0x00, 0x68, 0x6c,
 	0x05, 0xea, 0xb4, 0x00,
-	0x33, 0xea, 0x3a, 0x59,
+	0x33, 0xea, 0x44, 0x59,
 	0x33, 0xea, 0x00, 0x00,
 	0x80, 0x3d, 0x7a, 0x00,
-	0xfc, 0x42, 0x54, 0x7c,
+	0xfc, 0x42, 0x6a, 0x7c,
 	0x7f, 0x3d, 0x7a, 0x08,
-	0x00, 0x30, 0x3b, 0x59,
+	0x00, 0x30, 0x45, 0x59,
 	0x01, 0x30, 0x01, 0x30,
-	0x09, 0xea, 0x46, 0x59,
+	0x09, 0xea, 0x50, 0x59,
 	0x09, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xee, 0x41,
-	0x01, 0xa4, 0x49, 0x6c,
-	0x00, 0xe2, 0x16, 0x5c,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x01, 0xa4, 0x5f, 0x6c,
+	0x00, 0xe2, 0x2c, 0x5c,
 	0x20, 0x33, 0x67, 0x02,
 	0x01, 0x00, 0x60, 0x32,
-	0x02, 0xa6, 0x6e, 0x7c,
-	0x00, 0xe2, 0x32, 0x5c,
-	0x00, 0xe2, 0x66, 0x58,
-	0x00, 0xe2, 0x76, 0x58,
-	0x00, 0xe2, 0x30, 0x58,
-	0x00, 0x30, 0x3b, 0x59,
+	0x02, 0xa6, 0x84, 0x7c,
+	0x00, 0xe2, 0x48, 0x5c,
+	0x00, 0xe2, 0x70, 0x58,
+	0x00, 0xe2, 0x80, 0x58,
+	0x00, 0xe2, 0x3a, 0x58,
+	0x00, 0x30, 0x45, 0x59,
 	0x01, 0x30, 0x01, 0x30,
-	0x20, 0x19, 0x6e, 0x6c,
-	0x00, 0xe2, 0x96, 0x5c,
-	0x04, 0x19, 0x88, 0x6c,
+	0x20, 0x19, 0x84, 0x6c,
+	0x00, 0xe2, 0xb4, 0x5c,
+	0x04, 0x19, 0x9e, 0x6c,
 	0x02, 0x19, 0x32, 0x00,
-	0x01, 0x84, 0x89, 0x7c,
-	0x01, 0x1b, 0x82, 0x7c,
-	0x01, 0x1a, 0x88, 0x6c,
-	0x00, 0xe2, 0x38, 0x44,
-	0x80, 0x4b, 0x8e, 0x6c,
-	0x01, 0x4c, 0x8a, 0x7c,
-	0x03, 0x42, 0x38, 0x6c,
-	0x00, 0xe2, 0xc0, 0x5b,
+	0x01, 0x84, 0x9f, 0x7c,
+	0x01, 0x1b, 0x98, 0x7c,
+	0x01, 0x1a, 0x9e, 0x6c,
+	0x00, 0xe2, 0x4e, 0x44,
+	0x80, 0x4b, 0xa4, 0x6c,
+	0x01, 0x4c, 0xa0, 0x7c,
+	0x03, 0x42, 0x4e, 0x6c,
+	0x00, 0xe2, 0xd4, 0x5b,
 	0x80, 0xf9, 0xf2, 0x01,
-	0x04, 0x33, 0xef, 0x79,
-	0x00, 0xe2, 0xee, 0x41,
-	0x02, 0x1b, 0x9e, 0x7c,
-	0x08, 0x5d, 0x9c, 0x7c,
+	0x04, 0x33, 0xf9, 0x79,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x08, 0x5d, 0xbc, 0x6c,
+	0x00, 0xe2, 0x70, 0x58,
+	0x00, 0x30, 0x45, 0x59,
+	0x01, 0x30, 0x01, 0x30,
+	0x02, 0x1b, 0xac, 0x7c,
+	0x08, 0x5d, 0xba, 0x7c,
 	0x03, 0x68, 0x00, 0x37,
 	0x01, 0x84, 0x09, 0x07,
-	0x08, 0x5d, 0xa8, 0x6c,
-	0x00, 0xe2, 0x66, 0x58,
-	0x00, 0x30, 0x3b, 0x59,
-	0x01, 0x30, 0x01, 0x30,
-	0x00, 0xe2, 0x96, 0x44,
-	0x80, 0x1b, 0xb2, 0x7c,
-	0x80, 0x84, 0xb3, 0x6c,
+	0x80, 0x1b, 0xc6, 0x7c,
+	0x80, 0x84, 0xc7, 0x6c,
 	0xff, 0x85, 0x0b, 0x1b,
 	0xff, 0x86, 0x0d, 0x23,
 	0xff, 0x87, 0x0f, 0x23,
 	0xf8, 0x1b, 0x08, 0x0b,
 	0xff, 0xea, 0x4e, 0x09,
-	0x04, 0x1b, 0xba, 0x7c,
+	0x04, 0x1b, 0xce, 0x7c,
 	0x01, 0xa7, 0x4e, 0x01,
 	0xff, 0xea, 0x06, 0x0b,
 	0x03, 0x68, 0x00, 0x37,
-	0x00, 0xe2, 0xb6, 0x58,
+	0x00, 0xe2, 0xc0, 0x58,
 	0x10, 0xea, 0x18, 0x00,
 	0xf9, 0xd9, 0xb2, 0x0d,
 	0x01, 0xd9, 0xb2, 0x05,
-	0xff, 0xea, 0xd4, 0x09,
-	0x10, 0x5b, 0xde, 0x6c,
-	0x08, 0x5b, 0xe6, 0x6c,
-	0x20, 0x5b, 0xd4, 0x6c,
-	0x02, 0x5b, 0xfa, 0x6d,
-	0x0e, 0xea, 0x46, 0x59,
+	0x01, 0x52, 0x48, 0x31,
+	0x20, 0xa4, 0xf2, 0x7c,
+	0x20, 0x5b, 0xf2, 0x7c,
+	0x80, 0xf9, 0x00, 0x7d,
+	0x11, 0x00, 0x00, 0x10,
+	0x04, 0x19, 0xec, 0x7c,
+	0xdf, 0x19, 0x32, 0x08,
+	0x01, 0x4c, 0xe8, 0x7c,
+	0x20, 0x19, 0x32, 0x00,
+	0x11, 0x00, 0x00, 0x10,
+	0x02, 0xea, 0xb4, 0x00,
+	0x01, 0xd9, 0xb2, 0x05,
+	0x10, 0x5b, 0x04, 0x6d,
+	0x08, 0x5b, 0x0c, 0x6d,
+	0x20, 0x5b, 0xfe, 0x6c,
+	0x02, 0x5b, 0x2c, 0x6d,
+	0x0e, 0xea, 0x50, 0x59,
 	0x0e, 0xea, 0x04, 0x00,
-	0x08, 0x19, 0xda, 0x7c,
+	0x80, 0xf9, 0xee, 0x6c,
 	0xdf, 0x5c, 0xb8, 0x08,
 	0x01, 0xd9, 0xb2, 0x05,
-	0x02, 0xea, 0xb4, 0x00,
-	0x01, 0xd9, 0xb2, 0x05,
-	0x01, 0xa4, 0xc3, 0x6d,
-	0x00, 0xe2, 0x16, 0x5c,
-	0x00, 0xe2, 0x06, 0x5d,
+	0x01, 0xa4, 0xff, 0x6d,
+	0x00, 0xe2, 0x2c, 0x5c,
+	0x00, 0xe2, 0x36, 0x5d,
 	0x01, 0xd9, 0xb2, 0x05,
-	0x00, 0xe2, 0x24, 0x5b,
+	0x00, 0xe2, 0x2e, 0x5b,
 	0xf3, 0x92, 0xd5, 0x19,
-	0x00, 0xe2, 0xf4, 0x54,
-	0x80, 0x92, 0xf5, 0x6c,
-	0x0f, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0x1a, 0x55,
+	0x80, 0x92, 0x1b, 0x6d,
+	0x0f, 0xea, 0x50, 0x59,
 	0x0f, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xfc, 0x44,
+	0x00, 0xe2, 0x22, 0x45,
 	0x04, 0x8c, 0xe1, 0x30,
 	0x01, 0xea, 0xf2, 0x00,
 	0x02, 0xea, 0x36, 0x00,
 	0xa8, 0xea, 0x32, 0x00,
-	0xff, 0x93, 0x03, 0x7d,
-	0x14, 0xea, 0x46, 0x59,
+	0xff, 0x93, 0x29, 0x7d,
+	0x14, 0xea, 0x50, 0x59,
 	0x14, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0x88, 0x5d,
+	0x00, 0xe2, 0xb0, 0x5d,
+	0x01, 0xd9, 0xb2, 0x05,
+	0x09, 0x80, 0xe1, 0x30,
+	0x02, 0xea, 0x36, 0x00,
+	0xa8, 0xea, 0x32, 0x00,
+	0x00, 0xe2, 0xd8, 0x5d,
 	0x01, 0xd9, 0xb2, 0x05,
 	0x02, 0xa8, 0xf4, 0x31,
-	0x02, 0xa6, 0x18, 0x7d,
-	0x00, 0xe2, 0x34, 0x59,
-	0x20, 0x5b, 0x26, 0x6d,
-	0xfc, 0x42, 0x12, 0x7d,
-	0x10, 0x40, 0x14, 0x6d,
-	0x20, 0x4d, 0x16, 0x7d,
-	0x08, 0x5d, 0x26, 0x6d,
-	0x02, 0xa6, 0xc6, 0x6b,
-	0x00, 0xe2, 0x34, 0x59,
-	0x20, 0x5b, 0x26, 0x6d,
-	0x01, 0x1b, 0x46, 0x6d,
-	0xfc, 0x42, 0x22, 0x7d,
-	0x10, 0x40, 0x24, 0x6d,
-	0x20, 0x4d, 0x66, 0x7d,
-	0x08, 0x5d, 0x66, 0x7d,
+	0x02, 0xa6, 0x48, 0x7d,
+	0x00, 0xe2, 0x3e, 0x59,
+	0x20, 0x5b, 0x56, 0x6d,
+	0xfc, 0x42, 0x42, 0x7d,
+	0x10, 0x40, 0x44, 0x6d,
+	0x20, 0x4d, 0x46, 0x7d,
+	0x08, 0x5d, 0x56, 0x6d,
+	0x02, 0xa6, 0xda, 0x6b,
+	0x00, 0xe2, 0x3e, 0x59,
+	0x20, 0x5b, 0x56, 0x6d,
+	0x01, 0x1b, 0x76, 0x6d,
+	0xfc, 0x42, 0x52, 0x7d,
+	0x10, 0x40, 0x54, 0x6d,
+	0x20, 0x4d, 0x96, 0x7d,
+	0x08, 0x5d, 0x96, 0x7d,
 	0x02, 0x19, 0x32, 0x00,
 	0x01, 0x5b, 0x40, 0x31,
-	0x00, 0xe2, 0x96, 0x5c,
-	0x00, 0xe2, 0x8a, 0x5b,
+	0x00, 0xe2, 0xb4, 0x5c,
+	0x00, 0xe2, 0x92, 0x5b,
 	0x20, 0xea, 0xb6, 0x00,
-	0x00, 0xe2, 0xc0, 0x5b,
+	0x00, 0xe2, 0xd4, 0x5b,
 	0x20, 0x5c, 0xb8, 0x00,
-	0x04, 0x19, 0x3c, 0x6d,
-	0x01, 0x1a, 0x3c, 0x6d,
-	0x00, 0xe2, 0x34, 0x59,
-	0x01, 0x1a, 0x66, 0x7d,
+	0x04, 0x19, 0x6c, 0x6d,
+	0x01, 0x1a, 0x6c, 0x6d,
+	0x00, 0xe2, 0x3e, 0x59,
+	0x01, 0x1a, 0x96, 0x7d,
 	0x80, 0xf9, 0xf2, 0x01,
-	0x20, 0xa0, 0xac, 0x7d,
-	0x08, 0xa8, 0x45, 0x7d,
-	0x00, 0xe2, 0x58, 0x45,
+	0x20, 0xa0, 0xe8, 0x7d,
+	0x08, 0xa8, 0x75, 0x7d,
+	0x00, 0xe2, 0x88, 0x45,
 	0x02, 0xea, 0xb4, 0x04,
 	0x02, 0x19, 0x32, 0x00,
-	0x08, 0xa8, 0x69, 0x7d,
-	0x04, 0x5d, 0xc2, 0x7d,
-	0x01, 0x1a, 0xc2, 0x7d,
+	0x08, 0xa8, 0x99, 0x7d,
+	0x04, 0x5d, 0xfe, 0x7d,
+	0x01, 0x1a, 0xfe, 0x7d,
 	0x01, 0xa4, 0x49, 0x03,
 	0x80, 0xf9, 0xf2, 0x01,
 	0x02, 0xa8, 0x84, 0x32,
 	0x02, 0xea, 0xb4, 0x00,
-	0x00, 0xe2, 0x34, 0x43,
+	0x00, 0xe2, 0x3e, 0x43,
 	0x02, 0xa8, 0x84, 0x32,
 	0x02, 0xea, 0xb4, 0x00,
 	0xff, 0xea, 0xd4, 0x19,
-	0x00, 0xe2, 0x40, 0x59,
+	0x00, 0xe2, 0x4a, 0x59,
 	0x11, 0x00, 0x00, 0x10,
-	0x00, 0xe2, 0x98, 0x5d,
-	0x00, 0xe2, 0x34, 0x53,
+	0x00, 0xe2, 0xcc, 0x5d,
+	0x00, 0xe2, 0x3e, 0x53,
 	0xff, 0xea, 0xd4, 0x0d,
-	0x00, 0xe2, 0x34, 0x59,
-	0x40, 0x5b, 0x74, 0x6d,
-	0x04, 0x5d, 0xc2, 0x7d,
-	0x01, 0x1a, 0xc2, 0x7d,
-	0x20, 0x4d, 0x66, 0x7d,
-	0x40, 0x5b, 0xac, 0x7d,
-	0x04, 0x5d, 0xc2, 0x7d,
-	0x01, 0x1a, 0xc2, 0x7d,
+	0x00, 0xe2, 0x3e, 0x59,
+	0x40, 0x5b, 0xa4, 0x6d,
+	0x04, 0x5d, 0xfe, 0x7d,
+	0x01, 0x1a, 0xfe, 0x7d,
+	0x20, 0x4d, 0x96, 0x7d,
+	0x40, 0x5b, 0xe8, 0x7d,
+	0x04, 0x5d, 0xfe, 0x7d,
+	0x01, 0x1a, 0xfe, 0x7d,
 	0x80, 0xf9, 0xf2, 0x01,
 	0x01, 0xa4, 0x49, 0x03,
-	0x08, 0xa8, 0x59, 0x6d,
+	0x08, 0xa8, 0x89, 0x6d,
 	0x02, 0xea, 0xb4, 0x04,
-	0xff, 0x6a, 0x8e, 0x7d,
-	0x10, 0xea, 0x46, 0x59,
-	0x10, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0x8e, 0x45,
-	0x00, 0xe2, 0x32, 0x59,
-	0x10, 0x5d, 0x80, 0x6d,
-	0x40, 0x5b, 0x66, 0x7d,
+	0x00, 0xe2, 0x3c, 0x59,
+	0x01, 0x1b, 0xc0, 0x7d,
+	0x40, 0x5b, 0x96, 0x7d,
 	0x02, 0x19, 0x32, 0x00,
 	0x80, 0xf9, 0xf2, 0x01,
 	0xff, 0xea, 0x10, 0x03,
 	0x08, 0xa8, 0x51, 0x03,
-	0x00, 0xe2, 0x58, 0x45,
-	0x80, 0xf9, 0x66, 0x6d,
+	0x00, 0xe2, 0x88, 0x45,
+	0xff, 0x6a, 0xc6, 0x6d,
+	0x40, 0x5b, 0x96, 0x7d,
+	0xff, 0x6a, 0xb6, 0x7d,
+	0x10, 0xea, 0x50, 0x59,
+	0x10, 0xea, 0x04, 0x00,
+	0x00, 0xe2, 0xb6, 0x45,
+	0x80, 0xf9, 0x96, 0x6d,
 	0x01, 0x43, 0xc1, 0x31,
-	0x00, 0xfb, 0x66, 0x65,
+	0x00, 0xfb, 0x96, 0x65,
 	0x01, 0x42, 0xc1, 0x31,
-	0x00, 0xfa, 0x66, 0x65,
+	0x00, 0xfa, 0x96, 0x65,
 	0x01, 0xe8, 0xd4, 0x1d,
+	0x00, 0xe2, 0x3c, 0x59,
+	0x01, 0x1b, 0x96, 0x7d,
+	0x80, 0xf9, 0xf2, 0x01,
+	0x02, 0xea, 0xb4, 0x04,
 	0x30, 0x3f, 0xc0, 0x09,
-	0x30, 0xe0, 0x66, 0x65,
-	0x40, 0x4b, 0x66, 0x6d,
+	0x30, 0xe0, 0x96, 0x65,
+	0x40, 0x4b, 0x96, 0x6d,
 	0xff, 0xea, 0x52, 0x01,
-	0xee, 0x00, 0xb2, 0x6d,
+	0xee, 0x00, 0xee, 0x6d,
 	0x80, 0xf9, 0xf2, 0x01,
 	0x02, 0xea, 0xb4, 0x00,
 	0x20, 0xea, 0x9a, 0x00,
-	0xf3, 0x42, 0xbc, 0x6d,
-	0x12, 0xea, 0x46, 0x59,
+	0xf3, 0x42, 0xf8, 0x6d,
+	0x12, 0xea, 0x50, 0x59,
 	0x12, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xee, 0x41,
-	0x0d, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x0d, 0xea, 0x50, 0x59,
 	0x0d, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0xee, 0x41,
-	0x11, 0xea, 0x46, 0x59,
+	0x00, 0xe2, 0xf8, 0x41,
+	0x11, 0xea, 0x50, 0x59,
 	0x11, 0xea, 0x04, 0x00,
-	0x00, 0xe2, 0x24, 0x5b,
+	0x00, 0xe2, 0x2e, 0x5b,
 	0x08, 0x5a, 0xb4, 0x00,
-	0x00, 0xe2, 0xe4, 0x5d,
+	0x00, 0xe2, 0x22, 0x5e,
 	0xa8, 0xea, 0x32, 0x00,
-	0x00, 0xe2, 0x34, 0x59,
-	0x80, 0x1a, 0xd6, 0x7d,
-	0x00, 0xe2, 0xe4, 0x5d,
+	0x00, 0xe2, 0x3e, 0x59,
+	0x80, 0x1a, 0x12, 0x7e,
+	0x00, 0xe2, 0x22, 0x5e,
 	0x80, 0x19, 0x32, 0x00,
-	0x40, 0x5b, 0xdc, 0x6d,
-	0x08, 0x5a, 0xdc, 0x7d,
-	0x20, 0x4d, 0x66, 0x7d,
+	0x40, 0x5b, 0x18, 0x6e,
+	0x08, 0x5a, 0x18, 0x7e,
+	0x20, 0x4d, 0x96, 0x7d,
 	0x02, 0x84, 0x09, 0x03,
-	0x40, 0x5b, 0xac, 0x7d,
-	0x08, 0xa8, 0x51, 0x6d,
+	0x40, 0x5b, 0xe8, 0x7d,
+	0x08, 0xa8, 0x81, 0x6d,
+	0x80, 0xf9, 0xf2, 0x01,
 	0x02, 0xea, 0xb4, 0x04,
 	0x01, 0x38, 0xe1, 0x30,
 	0x05, 0x39, 0xe3, 0x98,
@@ -774,12 +805,36 @@
 };
 
 typedef int ahd_patch_func_t (struct ahd_softc *ahd);
+static ahd_patch_func_t ahd_patch21_func;
+
+static int
+ahd_patch21_func(struct ahd_softc *ahd)
+{
+	return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0);
+}
+
+static ahd_patch_func_t ahd_patch20_func;
+
+static int
+ahd_patch20_func(struct ahd_softc *ahd)
+{
+	return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0);
+}
+
+static ahd_patch_func_t ahd_patch19_func;
+
+static int
+ahd_patch19_func(struct ahd_softc *ahd)
+{
+	return ((ahd->features & AHD_RTI) == 0);
+}
+
 static ahd_patch_func_t ahd_patch18_func;
 
 static int
 ahd_patch18_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0);
+	return ((ahd->flags & AHD_INITIATORROLE) != 0);
 }
 
 static ahd_patch_func_t ahd_patch17_func;
@@ -787,7 +842,7 @@
 static int
 ahd_patch17_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0);
+	return ((ahd->flags & AHD_TARGETROLE) != 0);
 }
 
 static ahd_patch_func_t ahd_patch16_func;
@@ -795,7 +850,7 @@
 static int
 ahd_patch16_func(struct ahd_softc *ahd)
 {
-	return ((ahd->flags & AHD_INITIATORROLE) != 0);
+	return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch15_func;
@@ -803,7 +858,7 @@
 static int
 ahd_patch15_func(struct ahd_softc *ahd)
 {
-	return ((ahd->flags & AHD_TARGETROLE) != 0);
+	return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0);
 }
 
 static ahd_patch_func_t ahd_patch14_func;
@@ -811,7 +866,7 @@
 static int
 ahd_patch14_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0);
+	return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0);
 }
 
 static ahd_patch_func_t ahd_patch13_func;
@@ -819,7 +874,7 @@
 static int
 ahd_patch13_func(struct ahd_softc *ahd)
 {
-	return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0);
+	return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0);
 }
 
 static ahd_patch_func_t ahd_patch12_func;
@@ -827,7 +882,7 @@
 static int
 ahd_patch12_func(struct ahd_softc *ahd)
 {
-	return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0);
+	return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0);
 }
 
 static ahd_patch_func_t ahd_patch11_func;
@@ -835,7 +890,7 @@
 static int
 ahd_patch11_func(struct ahd_softc *ahd)
 {
-	return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0);
+	return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch10_func;
@@ -843,7 +898,7 @@
 static int
 ahd_patch10_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0);
+	return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch9_func;
@@ -859,7 +914,7 @@
 static int
 ahd_patch8_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_ABORT_LQI_BUG) == 0);
+	return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch7_func;
@@ -867,7 +922,7 @@
 static int
 ahd_patch7_func(struct ahd_softc *ahd)
 {
-	return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0);
+	return ((ahd->bugs & AHD_LQO_ATNO_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch6_func;
@@ -875,7 +930,7 @@
 static int
 ahd_patch6_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_LQO_ATNO_BUG) != 0);
+	return ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch5_func;
@@ -883,7 +938,7 @@
 static int
 ahd_patch5_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0);
+	return ((ahd->bugs & AHD_NONPACKFIFO_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch4_func;
@@ -891,7 +946,7 @@
 static int
 ahd_patch4_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_NONPACKFIFO_BUG) != 0);
+	return ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch3_func;
@@ -899,7 +954,7 @@
 static int
 ahd_patch3_func(struct ahd_softc *ahd)
 {
-	return ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0);
+	return ((ahd->bugs & AHD_FAINT_LED_BUG) != 0);
 }
 
 static ahd_patch_func_t ahd_patch2_func;
@@ -940,124 +995,129 @@
 	{ ahd_patch0_func, 5, 1, 1 },
 	{ ahd_patch2_func, 6, 1, 2 },
 	{ ahd_patch0_func, 7, 1, 1 },
-	{ ahd_patch2_func, 24, 1, 2 },
-	{ ahd_patch0_func, 25, 1, 1 },
-	{ ahd_patch1_func, 32, 1, 2 },
-	{ ahd_patch0_func, 33, 1, 1 },
-	{ ahd_patch2_func, 40, 1, 2 },
-	{ ahd_patch0_func, 41, 1, 1 },
-	{ ahd_patch2_func, 44, 1, 2 },
-	{ ahd_patch0_func, 45, 1, 1 },
-	{ ahd_patch2_func, 48, 1, 2 },
-	{ ahd_patch0_func, 49, 1, 1 },
-	{ ahd_patch2_func, 51, 1, 2 },
-	{ ahd_patch0_func, 52, 1, 1 },
-	{ ahd_patch2_func, 55, 1, 2 },
-	{ ahd_patch0_func, 56, 1, 1 },
-	{ ahd_patch2_func, 59, 1, 2 },
-	{ ahd_patch0_func, 60, 1, 1 },
-	{ ahd_patch2_func, 157, 6, 1 },
-	{ ahd_patch1_func, 163, 2, 1 },
-	{ ahd_patch3_func, 165, 1, 1 },
-	{ ahd_patch2_func, 174, 1, 2 },
-	{ ahd_patch0_func, 175, 1, 1 },
-	{ ahd_patch4_func, 176, 2, 2 },
-	{ ahd_patch0_func, 178, 6, 3 },
-	{ ahd_patch2_func, 181, 1, 2 },
-	{ ahd_patch0_func, 182, 1, 1 },
-	{ ahd_patch2_func, 185, 1, 2 },
-	{ ahd_patch0_func, 186, 1, 1 },
-	{ ahd_patch5_func, 188, 2, 1 },
-	{ ahd_patch3_func, 196, 16, 2 },
-	{ ahd_patch0_func, 212, 1, 1 },
-	{ ahd_patch6_func, 232, 2, 1 },
-	{ ahd_patch1_func, 236, 1, 2 },
-	{ ahd_patch0_func, 237, 1, 1 },
-	{ ahd_patch5_func, 240, 2, 1 },
-	{ ahd_patch1_func, 254, 1, 2 },
-	{ ahd_patch0_func, 255, 1, 1 },
-	{ ahd_patch1_func, 258, 1, 2 },
-	{ ahd_patch0_func, 259, 1, 1 },
-	{ ahd_patch2_func, 262, 1, 2 },
-	{ ahd_patch0_func, 263, 1, 1 },
-	{ ahd_patch1_func, 318, 1, 2 },
-	{ ahd_patch0_func, 319, 1, 1 },
-	{ ahd_patch2_func, 327, 1, 2 },
-	{ ahd_patch0_func, 328, 1, 1 },
-	{ ahd_patch2_func, 331, 1, 2 },
-	{ ahd_patch0_func, 332, 1, 1 },
-	{ ahd_patch1_func, 339, 1, 2 },
-	{ ahd_patch0_func, 340, 1, 1 },
-	{ ahd_patch7_func, 359, 1, 1 },
-	{ ahd_patch7_func, 362, 1, 1 },
-	{ ahd_patch7_func, 364, 1, 1 },
-	{ ahd_patch7_func, 376, 1, 1 },
-	{ ahd_patch1_func, 386, 1, 2 },
-	{ ahd_patch0_func, 387, 1, 1 },
-	{ ahd_patch1_func, 389, 1, 2 },
-	{ ahd_patch0_func, 390, 1, 1 },
-	{ ahd_patch1_func, 398, 1, 2 },
-	{ ahd_patch0_func, 399, 1, 1 },
-	{ ahd_patch2_func, 410, 1, 2 },
-	{ ahd_patch0_func, 411, 1, 1 },
-	{ ahd_patch8_func, 413, 1, 1 },
-	{ ahd_patch9_func, 440, 1, 1 },
-	{ ahd_patch1_func, 447, 1, 2 },
-	{ ahd_patch0_func, 448, 1, 1 },
-	{ ahd_patch2_func, 460, 1, 2 },
-	{ ahd_patch0_func, 461, 1, 1 },
-	{ ahd_patch10_func, 489, 1, 1 },
-	{ ahd_patch11_func, 498, 1, 2 },
-	{ ahd_patch0_func, 499, 1, 1 },
-	{ ahd_patch12_func, 504, 1, 1 },
-	{ ahd_patch11_func, 505, 1, 1 },
-	{ ahd_patch13_func, 518, 1, 2 },
-	{ ahd_patch0_func, 519, 1, 1 },
-	{ ahd_patch1_func, 541, 1, 2 },
-	{ ahd_patch0_func, 542, 1, 1 },
-	{ ahd_patch1_func, 545, 1, 2 },
-	{ ahd_patch0_func, 546, 1, 1 },
-	{ ahd_patch2_func, 551, 1, 2 },
-	{ ahd_patch0_func, 552, 1, 1 },
-	{ ahd_patch2_func, 556, 1, 2 },
+	{ ahd_patch3_func, 20, 5, 1 },
+	{ ahd_patch2_func, 29, 1, 2 },
+	{ ahd_patch0_func, 30, 1, 1 },
+	{ ahd_patch1_func, 37, 1, 2 },
+	{ ahd_patch0_func, 38, 1, 1 },
+	{ ahd_patch2_func, 45, 1, 2 },
+	{ ahd_patch0_func, 46, 1, 1 },
+	{ ahd_patch2_func, 49, 1, 2 },
+	{ ahd_patch0_func, 50, 1, 1 },
+	{ ahd_patch2_func, 53, 1, 2 },
+	{ ahd_patch0_func, 54, 1, 1 },
+	{ ahd_patch2_func, 56, 1, 2 },
+	{ ahd_patch0_func, 57, 1, 1 },
+	{ ahd_patch2_func, 60, 1, 2 },
+	{ ahd_patch0_func, 61, 1, 1 },
+	{ ahd_patch2_func, 64, 1, 2 },
+	{ ahd_patch0_func, 65, 1, 1 },
+	{ ahd_patch2_func, 162, 6, 1 },
+	{ ahd_patch1_func, 168, 2, 1 },
+	{ ahd_patch4_func, 170, 1, 1 },
+	{ ahd_patch2_func, 179, 1, 2 },
+	{ ahd_patch0_func, 180, 1, 1 },
+	{ ahd_patch5_func, 181, 2, 2 },
+	{ ahd_patch0_func, 183, 6, 3 },
+	{ ahd_patch2_func, 186, 1, 2 },
+	{ ahd_patch0_func, 187, 1, 1 },
+	{ ahd_patch2_func, 190, 1, 2 },
+	{ ahd_patch0_func, 191, 1, 1 },
+	{ ahd_patch6_func, 193, 2, 1 },
+	{ ahd_patch4_func, 201, 16, 2 },
+	{ ahd_patch0_func, 217, 1, 1 },
+	{ ahd_patch7_func, 237, 2, 1 },
+	{ ahd_patch1_func, 241, 1, 2 },
+	{ ahd_patch0_func, 242, 1, 1 },
+	{ ahd_patch6_func, 245, 2, 1 },
+	{ ahd_patch1_func, 259, 1, 2 },
+	{ ahd_patch0_func, 260, 1, 1 },
+	{ ahd_patch1_func, 263, 1, 2 },
+	{ ahd_patch0_func, 264, 1, 1 },
+	{ ahd_patch2_func, 267, 1, 2 },
+	{ ahd_patch0_func, 268, 1, 1 },
+	{ ahd_patch1_func, 323, 1, 2 },
+	{ ahd_patch0_func, 324, 1, 1 },
+	{ ahd_patch2_func, 332, 1, 2 },
+	{ ahd_patch0_func, 333, 1, 1 },
+	{ ahd_patch2_func, 336, 1, 2 },
+	{ ahd_patch0_func, 337, 1, 1 },
+	{ ahd_patch1_func, 344, 1, 2 },
+	{ ahd_patch0_func, 345, 1, 1 },
+	{ ahd_patch8_func, 364, 1, 1 },
+	{ ahd_patch8_func, 367, 1, 1 },
+	{ ahd_patch8_func, 369, 1, 1 },
+	{ ahd_patch8_func, 381, 1, 1 },
+	{ ahd_patch1_func, 391, 1, 2 },
+	{ ahd_patch0_func, 392, 1, 1 },
+	{ ahd_patch1_func, 394, 1, 2 },
+	{ ahd_patch0_func, 395, 1, 1 },
+	{ ahd_patch1_func, 403, 1, 2 },
+	{ ahd_patch0_func, 404, 1, 1 },
+	{ ahd_patch2_func, 415, 1, 2 },
+	{ ahd_patch0_func, 416, 1, 1 },
+	{ ahd_patch9_func, 444, 1, 1 },
+	{ ahd_patch1_func, 451, 1, 2 },
+	{ ahd_patch0_func, 452, 1, 1 },
+	{ ahd_patch2_func, 464, 1, 2 },
+	{ ahd_patch0_func, 465, 1, 1 },
+	{ ahd_patch10_func, 470, 6, 2 },
+	{ ahd_patch0_func, 476, 1, 1 },
+	{ ahd_patch11_func, 499, 1, 1 },
+	{ ahd_patch12_func, 508, 1, 1 },
+	{ ahd_patch13_func, 509, 1, 2 },
+	{ ahd_patch0_func, 510, 1, 1 },
+	{ ahd_patch14_func, 515, 1, 1 },
+	{ ahd_patch13_func, 516, 1, 1 },
+	{ ahd_patch15_func, 529, 1, 2 },
+	{ ahd_patch0_func, 530, 1, 1 },
+	{ ahd_patch1_func, 552, 1, 2 },
+	{ ahd_patch0_func, 553, 1, 1 },
+	{ ahd_patch1_func, 556, 1, 2 },
 	{ ahd_patch0_func, 557, 1, 1 },
-	{ ahd_patch1_func, 558, 1, 2 },
-	{ ahd_patch0_func, 559, 1, 1 },
-	{ ahd_patch2_func, 570, 1, 2 },
-	{ ahd_patch0_func, 571, 1, 1 },
-	{ ahd_patch14_func, 575, 1, 1 },
-	{ ahd_patch15_func, 580, 1, 1 },
-	{ ahd_patch16_func, 581, 2, 1 },
-	{ ahd_patch15_func, 585, 1, 2 },
-	{ ahd_patch0_func, 586, 1, 1 },
-	{ ahd_patch2_func, 593, 1, 2 },
-	{ ahd_patch0_func, 594, 1, 1 },
-	{ ahd_patch2_func, 609, 1, 2 },
-	{ ahd_patch0_func, 610, 1, 1 },
-	{ ahd_patch1_func, 616, 1, 2 },
-	{ ahd_patch0_func, 617, 1, 1 },
-	{ ahd_patch1_func, 631, 1, 2 },
-	{ ahd_patch0_func, 632, 1, 1 },
-	{ ahd_patch1_func, 639, 1, 2 },
-	{ ahd_patch0_func, 640, 1, 1 },
-	{ ahd_patch14_func, 659, 1, 1 },
-	{ ahd_patch14_func, 675, 1, 1 },
-	{ ahd_patch2_func, 687, 1, 2 },
-	{ ahd_patch0_func, 688, 1, 1 },
-	{ ahd_patch1_func, 705, 1, 2 },
-	{ ahd_patch0_func, 706, 1, 1 },
-	{ ahd_patch14_func, 711, 1, 1 },
-	{ ahd_patch1_func, 731, 1, 2 },
-	{ ahd_patch0_func, 732, 1, 1 },
-	{ ahd_patch1_func, 734, 1, 2 },
-	{ ahd_patch0_func, 735, 1, 1 },
-	{ ahd_patch1_func, 737, 1, 2 },
-	{ ahd_patch0_func, 738, 1, 1 },
-	{ ahd_patch17_func, 740, 1, 2 },
-	{ ahd_patch0_func, 741, 2, 1 },
-	{ ahd_patch18_func, 744, 4, 2 },
-	{ ahd_patch0_func, 748, 1, 1 },
-	{ ahd_patch18_func, 754, 11, 1 }
+	{ ahd_patch2_func, 562, 1, 2 },
+	{ ahd_patch0_func, 563, 1, 1 },
+	{ ahd_patch2_func, 567, 1, 2 },
+	{ ahd_patch0_func, 568, 1, 1 },
+	{ ahd_patch1_func, 569, 1, 2 },
+	{ ahd_patch0_func, 570, 1, 1 },
+	{ ahd_patch2_func, 581, 1, 2 },
+	{ ahd_patch0_func, 582, 1, 1 },
+	{ ahd_patch16_func, 586, 1, 1 },
+	{ ahd_patch17_func, 591, 1, 1 },
+	{ ahd_patch18_func, 592, 2, 1 },
+	{ ahd_patch17_func, 596, 1, 2 },
+	{ ahd_patch0_func, 597, 1, 1 },
+	{ ahd_patch2_func, 600, 1, 2 },
+	{ ahd_patch0_func, 601, 1, 1 },
+	{ ahd_patch2_func, 619, 1, 2 },
+	{ ahd_patch0_func, 620, 1, 1 },
+	{ ahd_patch19_func, 621, 12, 1 },
+	{ ahd_patch1_func, 637, 1, 2 },
+	{ ahd_patch0_func, 638, 1, 1 },
+	{ ahd_patch19_func, 639, 1, 1 },
+	{ ahd_patch1_func, 650, 1, 2 },
+	{ ahd_patch0_func, 651, 1, 1 },
+	{ ahd_patch1_func, 658, 1, 2 },
+	{ ahd_patch0_func, 659, 1, 1 },
+	{ ahd_patch16_func, 683, 1, 1 },
+	{ ahd_patch16_func, 699, 1, 1 },
+	{ ahd_patch2_func, 711, 1, 2 },
+	{ ahd_patch0_func, 712, 1, 1 },
+	{ ahd_patch16_func, 731, 1, 1 },
+	{ ahd_patch1_func, 739, 1, 2 },
+	{ ahd_patch0_func, 740, 1, 1 },
+	{ ahd_patch1_func, 761, 1, 2 },
+	{ ahd_patch0_func, 762, 1, 1 },
+	{ ahd_patch1_func, 764, 1, 2 },
+	{ ahd_patch0_func, 765, 1, 1 },
+	{ ahd_patch1_func, 767, 1, 2 },
+	{ ahd_patch0_func, 768, 1, 1 },
+	{ ahd_patch20_func, 770, 1, 2 },
+	{ ahd_patch0_func, 771, 2, 1 },
+	{ ahd_patch21_func, 774, 4, 2 },
+	{ ahd_patch0_func, 778, 1, 1 },
+	{ ahd_patch21_func, 785, 11, 1 }
 };
 
 static struct cs {
@@ -1066,19 +1126,19 @@
 } critical_sections[] = {
 	{ 11, 12 },
 	{ 13, 14 },
-	{ 24, 37 },
-	{ 38, 51 },
-	{ 64, 67 },
-	{ 94, 119 },
-	{ 120, 151 },
-	{ 153, 157 },
-	{ 165, 173 },
-	{ 196, 245 },
-	{ 659, 675 },
-	{ 675, 693 },
-	{ 698, 704 },
-	{ 711, 716 },
-	{ 716, 722 }
+	{ 29, 42 },
+	{ 43, 56 },
+	{ 69, 72 },
+	{ 99, 124 },
+	{ 125, 156 },
+	{ 158, 162 },
+	{ 170, 178 },
+	{ 201, 250 },
+	{ 683, 699 },
+	{ 699, 717 },
+	{ 722, 728 },
+	{ 731, 736 },
+	{ 742, 748 }
 };
 
 static const int num_critical_sections = sizeof(critical_sections)
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx.h b/drivers/scsi/aic7xxx/aic7xxx.h
--- a/drivers/scsi/aic7xxx/aic7xxx.h	Sat Apr 19 19:51:48 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx.h	Sat Apr 19 19:51:48 2003
@@ -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#70 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.h#74 $
  *
  * $FreeBSD$
  */
@@ -365,7 +365,8 @@
 	AHC_LSCBS_ENABLED     = 0x2000000, /* 64Byte SCBs enabled */
 	AHC_SCB_CONFIG_USED   = 0x4000000, /* No SEEPROM but SCB2 had info. */
 	AHC_NO_BIOS_INIT      = 0x8000000, /* No BIOS left over settings. */
-	AHC_DISABLE_PCI_PERR  = 0x10000000
+	AHC_DISABLE_PCI_PERR  = 0x10000000,
+	AHC_HAS_TERM_LOGIC    = 0x20000000
 } ahc_flag;
 
 /************************* Hardware  SCB Definition ***************************/
@@ -691,7 +692,7 @@
 
 #define AHC_WIDTH_UNKNOWN	0xFF
 #define AHC_PERIOD_UNKNOWN	0xFF
-#define AHC_OFFSET_UNKNOWN	0x0
+#define AHC_OFFSET_UNKNOWN	0xFF
 #define AHC_PPR_OPTS_UNKNOWN	0xFF
 
 /*
@@ -877,31 +878,39 @@
 /*********************** Software Configuration Structure *********************/
 TAILQ_HEAD(scb_tailq, scb);
 
-struct ahc_suspend_channel_state {
-	uint8_t	scsiseq;
-	uint8_t	sxfrctl0;
-	uint8_t	sxfrctl1;
-	uint8_t	simode0;
-	uint8_t	simode1;
-	uint8_t	seltimer;
-	uint8_t	seqctl;
-};
-
-struct ahc_suspend_state {
-	struct	ahc_suspend_channel_state channel[2];
-	uint8_t	optionmode;
-	uint8_t	dscommand0;
-	uint8_t	dspcistatus;
-	/* hsmailbox */
-	uint8_t	crccontrol1;
-	uint8_t	scbbaddr;
-	/* Host and sequencer SCB counts */
-	uint8_t	dff_thrsh;
-	uint8_t	*scratch_ram;
-	uint8_t	*btt;
+struct ahc_aic7770_softc {
+	/*
+	 * Saved register state used for chip_init().
+	 */
+	uint8_t busspd;
+	uint8_t bustime;
+};
+
+struct ahc_pci_softc {
+	/*
+	 * Saved register state used for chip_init().
+	 */
+	uint32_t  devconfig;
+	uint16_t  targcrccnt;
+	uint8_t   command;
+	uint8_t   csize_lattime;
+	uint8_t   optionmode;
+	uint8_t   crccontrol1;
+	uint8_t   dscommand0;
+	uint8_t   dspcistatus;
+	uint8_t   scbbaddr;
+	uint8_t   dff_thrsh;
+};
+
+union ahc_bus_softc {
+	struct ahc_aic7770_softc aic7770_softc;
+	struct ahc_pci_softc pci_softc;
 };
 
 typedef void (*ahc_bus_intr_t)(struct ahc_softc *);
+typedef int (*ahc_bus_chip_init_t)(struct ahc_softc *);
+typedef int (*ahc_bus_suspend_t)(struct ahc_softc *);
+typedef int (*ahc_bus_resume_t)(struct ahc_softc *);
 typedef void ahc_callback_t (void *);
 
 struct ahc_softc {
@@ -937,6 +946,11 @@
 	struct scb_tailq	  untagged_queues[AHC_NUM_TARGETS];
 
 	/*
+	 * Bus attachment specific data.
+	 */
+	union ahc_bus_softc	  bus_softc;
+
+	/*
 	 * Platform specific data.
 	 */
 	struct ahc_platform_data *platform_data;
@@ -952,6 +966,22 @@
 	ahc_bus_intr_t		  bus_intr;
 
 	/*
+	 * Bus specific initialization required
+	 * after a chip reset.
+	 */
+	ahc_bus_chip_init_t	  bus_chip_init;
+
+	/*
+	 * Bus specific suspend routine.
+	 */
+	ahc_bus_suspend_t	  bus_suspend;
+
+	/*
+	 * Bus specific resume routine.
+	 */
+	ahc_bus_resume_t	  bus_resume;
+
+	/*
 	 * Target mode related state kept on a per enabled lun basis.
 	 * Targets that are not enabled will have null entries.
 	 * As an initiator, we keep one target entry for our initiator
@@ -1043,9 +1073,6 @@
 	 */
 	bus_addr_t		  dma_bug_buf;
 
-	/* Information saved through suspend/resume cycles */
-	struct ahc_suspend_state  suspend_state;
-
 	/* Number of enabled target mode device on this card */
 	u_int			  enabled_luns;
 
@@ -1055,7 +1082,8 @@
 	/* PCI cacheline size. */
 	u_int			  pci_cachesize;
 
-	u_int			  stack_size;
+	/* Maximum number of sequencer instructions supported. */
+	u_int			  instruction_ram_size;
 
 	/* Per-Unit descriptive information */
 	const char		 *description;
@@ -1152,6 +1180,7 @@
 struct ahc_softc	*ahc_alloc(void *platform_arg, char *name);
 int			 ahc_softc_init(struct ahc_softc *);
 void			 ahc_controller_info(struct ahc_softc *ahc, char *buf);
+int			 ahc_chip_init(struct ahc_softc *ahc);
 int			 ahc_init(struct ahc_softc *ahc);
 void			 ahc_intr_enable(struct ahc_softc *ahc, int enable);
 void			 ahc_pause_and_flushwork(struct ahc_softc *ahc);
@@ -1167,7 +1196,6 @@
 void			 ahc_shutdown(void *arg);
 
 /*************************** Interrupt Services *******************************/
-void			ahc_pci_intr(struct ahc_softc *ahc);
 void			ahc_clear_intstat(struct ahc_softc *ahc);
 void			ahc_run_qoutfifo(struct ahc_softc *ahc);
 #ifdef AHC_TARGET_MODE
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx.reg b/drivers/scsi/aic7xxx/aic7xxx.reg
--- a/drivers/scsi/aic7xxx/aic7xxx.reg	Sat Apr 19 19:51:51 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx.reg	Sat Apr 19 19:51:51 2003
@@ -39,7 +39,7 @@
  *
  * $FreeBSD$
  */
-VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $"
+VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#38 $"
 
 /*
  * This file is processed by the aic7xxx_asm utility for use in assembling
@@ -1580,7 +1580,7 @@
 const MAX_OFFSET_8BIT		0x0f
 const MAX_OFFSET_16BIT		0x08
 const MAX_OFFSET_ULTRA2		0x7f
-const MAX_OFFSET		0xff
+const MAX_OFFSET		0x7f
 const HOST_MSG			0xff
 
 /* Target mode command processing constants */
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c
--- a/drivers/scsi/aic7xxx/aic7xxx_core.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_core.c	Sat Apr 19 19:51:47 2003
@@ -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#112 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.c#124 $
  *
  * $FreeBSD$
  */
@@ -144,7 +144,8 @@
 #include "aic7xxx_seq.h"
 
 /**************************** Function Declarations ***************************/
-static void		ahc_force_renegotiation(struct ahc_softc *ahc);
+static void		ahc_force_renegotiation(struct ahc_softc *ahc,
+						struct ahc_devinfo *devinfo);
 static struct ahc_tmode_tstate*
 			ahc_alloc_tstate(struct ahc_softc *ahc,
 					 u_int scsi_id, char channel);
@@ -224,7 +225,7 @@
 #ifdef AHC_DUMP_SEQ
 static void		ahc_dumpseq(struct ahc_softc *ahc);
 #endif
-static void		ahc_loadseq(struct ahc_softc *ahc);
+static int		ahc_loadseq(struct ahc_softc *ahc);
 static int		ahc_check_patch(struct ahc_softc *ahc,
 					struct patch **start_patch,
 					u_int start_instr, u_int *skip_addr);
@@ -1032,14 +1033,15 @@
 		 * we should look at the last phase the sequencer recorded,
 		 * or the current phase presented on the bus.
 		 */
-		u_int mesg_out;
-		u_int curphase;
-		u_int errorphase;
-		u_int lastphase;
-		u_int scsirate;
-		u_int i;
-		u_int sstat2;
-		int   silent;
+		struct	ahc_devinfo devinfo;
+		u_int	mesg_out;
+		u_int	curphase;
+		u_int	errorphase;
+		u_int	lastphase;
+		u_int	scsirate;
+		u_int	i;
+		u_int	sstat2;
+		int	silent;
 
 		lastphase = ahc_inb(ahc, LASTPHASE);
 		curphase = ahc_inb(ahc, SCSISIGI) & PHASE_MASK;
@@ -1128,7 +1130,9 @@
 		 * case we are out of sync for some external reason
 		 * unknown (or unreported) by the target.
 		 */
-		ahc_force_renegotiation(ahc);
+		ahc_fetch_devinfo(ahc, &devinfo);
+		ahc_force_renegotiation(ahc, &devinfo);
+
 		ahc_outb(ahc, CLRINT, CLRSCSIINT);
 		ahc_unpause(ahc);
 	} else if ((status & SELTO) != 0) {
@@ -1165,6 +1169,7 @@
 			       ahc_name(ahc), scbptr, scb_index);
 			ahc_dump_card_state(ahc);
 		} else {
+			struct ahc_devinfo devinfo;
 #ifdef AHC_DEBUG
 			if ((ahc_debug & AHC_SHOW_SELTO) != 0) {
 				ahc_print_path(ahc, scb);
@@ -1181,7 +1186,8 @@
 			 * a unit attention in this case, so we must always
 			 * renegotiate.
 			 */
-			ahc_force_renegotiation(ahc);
+			ahc_scb_devinfo(ahc, &devinfo, scb);
+			ahc_force_renegotiation(ahc, &devinfo);
 			ahc_set_transaction_status(scb, CAM_SEL_TIMEOUT);
 			ahc_freeze_devq(ahc, scb);
 		}
@@ -1189,13 +1195,14 @@
 		ahc_restart(ahc);
 	} else if ((status & BUSFREE) != 0
 		&& (ahc_inb(ahc, SIMODE1) & ENBUSFREE) != 0) {
-		u_int lastphase;
-		u_int saved_scsiid;
-		u_int saved_lun;
-		u_int target;
-		u_int initiator_role_id;
-		char channel;
-		int printerror;
+		struct	ahc_devinfo devinfo;
+		u_int	lastphase;
+		u_int	saved_scsiid;
+		u_int	saved_lun;
+		u_int	target;
+		u_int	initiator_role_id;
+		char	channel;
+		int	printerror;
 
 		/*
 		 * Clear our selection hardware as soon as possible.
@@ -1227,13 +1234,13 @@
 		target = SCSIID_TARGET(ahc, saved_scsiid);
 		initiator_role_id = SCSIID_OUR_ID(saved_scsiid);
 		channel = SCSIID_CHANNEL(ahc, saved_scsiid);
+		ahc_compile_devinfo(&devinfo, initiator_role_id,
+				    target, saved_lun, channel, ROLE_INITIATOR);
 		printerror = 1;
 
 		if (lastphase == P_MESGOUT) {
-			struct ahc_devinfo devinfo;
 			u_int tag;
 
-			ahc_fetch_devinfo(ahc, &devinfo);
 			tag = SCB_LIST_NULL;
 			if (ahc_sent_msg(ahc, AHCMSG_1B, MSG_ABORT_TAG, TRUE)
 			 || ahc_sent_msg(ahc, AHCMSG_1B, MSG_ABORT, TRUE)) {
@@ -1344,13 +1351,15 @@
 				if (lastphase == ahc_phase_table[i].phase)
 					break;
 			}
-			/*
-			 * Renegotiate with this device at the
-			 * next oportunity just in case this busfree
-			 * is due to a negotiation mismatch with the
-			 * device.
-			 */
-			ahc_force_renegotiation(ahc);
+			if (lastphase != P_BUSFREE) {
+				/*
+				 * Renegotiate with this device at the
+				 * next oportunity just in case this busfree
+				 * is due to a negotiation mismatch with the
+				 * device.
+				 */
+				ahc_force_renegotiation(ahc, &devinfo);
+			}
 			printf("Unexpected busfree %s\n"
 			       "SEQADDR == 0x%x\n",
 			       ahc_phase_table[i].phasemsg,
@@ -1371,19 +1380,17 @@
  * a command to the current device.
  */
 static void
-ahc_force_renegotiation(struct ahc_softc *ahc)
+ahc_force_renegotiation(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
 {
-	struct	ahc_devinfo devinfo;
 	struct	ahc_initiator_tinfo *targ_info;
 	struct	ahc_tmode_tstate *tstate;
 
-	ahc_fetch_devinfo(ahc, &devinfo);
 	targ_info = ahc_fetch_transinfo(ahc,
-					devinfo.channel,
-					devinfo.our_scsiid,
-					devinfo.target,
+					devinfo->channel,
+					devinfo->our_scsiid,
+					devinfo->target,
 					&tstate);
-	ahc_update_neg_request(ahc, &devinfo, tstate,
+	ahc_update_neg_request(ahc, devinfo, tstate,
 			       targ_info, AHC_NEG_IF_NON_ASYNC);
 }
 
@@ -3898,7 +3905,7 @@
 	 */
 	list_ahc = TAILQ_FIRST(&ahc_tailq);
 	while (list_ahc != NULL
-	    && ahc_softc_comp(list_ahc, ahc) <= 0)
+	    && ahc_softc_comp(ahc, list_ahc) <= 0)
 		list_ahc = TAILQ_NEXT(list_ahc, links);
 	if (list_ahc != NULL)
 		TAILQ_INSERT_BEFORE(list_ahc, ahc, links);
@@ -4038,6 +4045,7 @@
 {
 	u_int	sblkctl;
 	u_int	sxfrctl1_a, sxfrctl1_b;
+	int	error;
 	int	wait;
 	
 	/*
@@ -4128,12 +4136,19 @@
 	}
 	ahc_outb(ahc, SXFRCTL1, sxfrctl1_a);
 
+	error = 0;
+	if (ahc->init_level > 0)
+		/*
+		 * If a recovery action has forced a chip reset,
+		 * re-initialize the chip to our liking.
+		 */
+		error = ahc->bus_chip_init(ahc);
 #ifdef AHC_DUMP_SEQ
-	if (ahc->init_level == 0)
+	else 
 		ahc_dumpseq(ahc);
 #endif
 
-	return (0);
+	return (error);
 }
 
 /*
@@ -4203,6 +4218,14 @@
 		ahc_outb(ahc, SCB_LUN, 0xFF);
 	}
 
+	if ((ahc->flags & AHC_PAGESCBS) != 0) {
+		/* SCB 0 heads the free list. */
+		ahc_outb(ahc, FREE_SCBH, 0);
+	} else {
+		/* No free list. */
+		ahc_outb(ahc, FREE_SCBH, SCB_LIST_NULL);
+	}
+
 	/* Make sure that the last SCB terminates the free list */
 	ahc_outb(ahc, SCBPTR, i-1);
 	ahc_outb(ahc, SCB_NEXT, SCB_LIST_NULL);
@@ -4228,20 +4251,11 @@
 	/* Determine the number of hardware SCBs and initialize them */
 
 	scb_data->maxhscbs = ahc_probe_scbs(ahc);
-	if ((ahc->flags & AHC_PAGESCBS) != 0) {
-		/* SCB 0 heads the free list */
-		ahc_outb(ahc, FREE_SCBH, 0);
-	} else {
-		ahc_outb(ahc, FREE_SCBH, SCB_LIST_NULL);
-	}
-
 	if (ahc->scb_data->maxhscbs == 0) {
 		printf("%s: No SCB space found\n", ahc_name(ahc));
 		return (ENXIO);
 	}
 
-	ahc_build_free_scb_list(ahc);
-
 	/*
 	 * Create our DMA tags.  These tags define the kinds of device
 	 * accessible memory allocations and memory mappings we will
@@ -4343,10 +4357,9 @@
 	}
 
 	/*
-	 * Tell the sequencer which SCB will be the next one it receives.
+	 * Reserve the next queued SCB.
 	 */
 	ahc->next_queued_scb = ahc_get_scb(ahc);
-	ahc_outb(ahc, NEXT_QUEUED_SCB, ahc->next_queued_scb->hscb->tag);
 
 	/*
 	 * Note that we were successfull
@@ -4531,6 +4544,192 @@
 		sprintf(buf, "%d SCBs", ahc->scb_data->maxhscbs);
 }
 
+int
+ahc_chip_init(struct ahc_softc *ahc)
+{
+	int	 term;
+	int	 error;
+	u_int	 i;
+	u_int	 scsi_conf;
+	u_int	 scsiseq_template;
+	uint32_t physaddr;
+
+	ahc_outb(ahc, SEQ_FLAGS, 0);
+	ahc_outb(ahc, SEQ_FLAGS2, 0);
+
+	/* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels*/
+	if (ahc->features & AHC_TWIN) {
+
+		/*
+		 * Setup Channel B first.
+		 */
+		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) | SELBUSB);
+		term = (ahc->flags & AHC_TERM_ENB_B) != 0 ? STPWEN : 0;
+		ahc_outb(ahc, SCSIID, ahc->our_id_b);
+		scsi_conf = ahc_inb(ahc, SCSICONF + 1);
+		ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
+					|term|ahc->seltime_b|ENSTIMER|ACTNEGEN);
+		if ((ahc->features & AHC_ULTRA2) != 0)
+			ahc_outb(ahc, SIMODE0, ahc_inb(ahc, SIMODE0)|ENIOERR);
+		ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
+		ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
+
+		/* Select Channel A */
+		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
+	}
+	term = (ahc->flags & AHC_TERM_ENB_A) != 0 ? STPWEN : 0;
+	if ((ahc->features & AHC_ULTRA2) != 0)
+		ahc_outb(ahc, SCSIID_ULTRA2, ahc->our_id);
+	else
+		ahc_outb(ahc, SCSIID, ahc->our_id);
+	scsi_conf = ahc_inb(ahc, SCSICONF);
+	ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
+				|term|ahc->seltime
+				|ENSTIMER|ACTNEGEN);
+	if ((ahc->features & AHC_ULTRA2) != 0)
+		ahc_outb(ahc, SIMODE0, ahc_inb(ahc, SIMODE0)|ENIOERR);
+	ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
+	ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
+
+	/* There are no untagged SCBs active yet. */
+	for (i = 0; i < 16; i++) {
+		ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, 0));
+		if ((ahc->flags & AHC_SCB_BTT) != 0) {
+			int lun;
+
+			/*
+			 * The SCB based BTT allows an entry per
+			 * target and lun pair.
+			 */
+			for (lun = 1; lun < AHC_NUM_LUNS; lun++)
+				ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, lun));
+		}
+	}
+
+	/* All of our queues are empty */
+	for (i = 0; i < 256; i++)
+		ahc->qoutfifo[i] = SCB_LIST_NULL;
+	ahc_sync_qoutfifo(ahc, BUS_DMASYNC_PREREAD);
+
+	for (i = 0; i < 256; i++)
+		ahc->qinfifo[i] = SCB_LIST_NULL;
+
+	if ((ahc->features & AHC_MULTI_TID) != 0) {
+		ahc_outb(ahc, TARGID, 0);
+		ahc_outb(ahc, TARGID + 1, 0);
+	}
+
+	/*
+	 * Tell the sequencer where it can find our arrays in memory.
+	 */
+	physaddr = ahc->scb_data->hscb_busaddr;
+	ahc_outb(ahc, HSCB_ADDR, physaddr & 0xFF);
+	ahc_outb(ahc, HSCB_ADDR + 1, (physaddr >> 8) & 0xFF);
+	ahc_outb(ahc, HSCB_ADDR + 2, (physaddr >> 16) & 0xFF);
+	ahc_outb(ahc, HSCB_ADDR + 3, (physaddr >> 24) & 0xFF);
+
+	physaddr = ahc->shared_data_busaddr;
+	ahc_outb(ahc, SHARED_DATA_ADDR, physaddr & 0xFF);
+	ahc_outb(ahc, SHARED_DATA_ADDR + 1, (physaddr >> 8) & 0xFF);
+	ahc_outb(ahc, SHARED_DATA_ADDR + 2, (physaddr >> 16) & 0xFF);
+	ahc_outb(ahc, SHARED_DATA_ADDR + 3, (physaddr >> 24) & 0xFF);
+
+	/*
+	 * Initialize the group code to command length table.
+	 * This overrides the values in TARG_SCSIRATE, so only
+	 * setup the table after we have processed that information.
+	 */
+	ahc_outb(ahc, CMDSIZE_TABLE, 5);
+	ahc_outb(ahc, CMDSIZE_TABLE + 1, 9);
+	ahc_outb(ahc, CMDSIZE_TABLE + 2, 9);
+	ahc_outb(ahc, CMDSIZE_TABLE + 3, 0);
+	ahc_outb(ahc, CMDSIZE_TABLE + 4, 15);
+	ahc_outb(ahc, CMDSIZE_TABLE + 5, 11);
+	ahc_outb(ahc, CMDSIZE_TABLE + 6, 0);
+	ahc_outb(ahc, CMDSIZE_TABLE + 7, 0);
+		
+	if ((ahc->features & AHC_HS_MAILBOX) != 0)
+		ahc_outb(ahc, HS_MAILBOX, 0);
+
+	/* Tell the sequencer of our initial queue positions */
+	if ((ahc->features & AHC_TARGETMODE) != 0) {
+		ahc->tqinfifonext = 1;
+		ahc_outb(ahc, KERNEL_TQINPOS, ahc->tqinfifonext - 1);
+		ahc_outb(ahc, TQINPOS, ahc->tqinfifonext);
+	}
+	ahc->qinfifonext = 0;
+	ahc->qoutfifonext = 0;
+	if ((ahc->features & AHC_QUEUE_REGS) != 0) {
+		ahc_outb(ahc, QOFF_CTLSTA, SCB_QSIZE_256);
+		ahc_outb(ahc, HNSCB_QOFF, ahc->qinfifonext);
+		ahc_outb(ahc, SNSCB_QOFF, ahc->qinfifonext);
+		ahc_outb(ahc, SDSCB_QOFF, 0);
+	} else {
+		ahc_outb(ahc, KERNEL_QINPOS, ahc->qinfifonext);
+		ahc_outb(ahc, QINPOS, ahc->qinfifonext);
+		ahc_outb(ahc, QOUTPOS, ahc->qoutfifonext);
+	}
+
+	/* We don't have any waiting selections */
+	ahc_outb(ahc, WAITING_SCBH, SCB_LIST_NULL);
+
+	/* Our disconnection list is empty too */
+	ahc_outb(ahc, DISCONNECTED_SCBH, SCB_LIST_NULL);
+
+	/* Message out buffer starts empty */
+	ahc_outb(ahc, MSG_OUT, MSG_NOOP);
+
+	/*
+	 * Setup the allowed SCSI Sequences based on operational mode.
+	 * If we are a target, we'll enalbe select in operations once
+	 * we've had a lun enabled.
+	 */
+	scsiseq_template = ENSELO|ENAUTOATNO|ENAUTOATNP;
+	if ((ahc->flags & AHC_INITIATORROLE) != 0)
+		scsiseq_template |= ENRSELI;
+	ahc_outb(ahc, SCSISEQ_TEMPLATE, scsiseq_template);
+
+	/* Initialize our list of free SCBs. */
+	ahc_build_free_scb_list(ahc);
+
+	/*
+	 * Tell the sequencer which SCB will be the next one it receives.
+	 */
+	ahc_outb(ahc, NEXT_QUEUED_SCB, ahc->next_queued_scb->hscb->tag);
+
+	/*
+	 * Load the Sequencer program and Enable the adapter
+	 * in "fast" mode.
+	 */
+	if (bootverbose)
+		printf("%s: Downloading Sequencer Program...",
+		       ahc_name(ahc));
+
+	error = ahc_loadseq(ahc);
+	if (error != 0)
+		return (error);
+
+	if ((ahc->features & AHC_ULTRA2) != 0) {
+		int wait;
+
+		/*
+		 * Wait for up to 500ms for our transceivers
+		 * to settle.  If the adapter does not have
+		 * a cable attached, the transceivers may
+		 * 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);
+	}
+
+	return (0);
+}
+
 /*
  * Start the board, ready for normal operation
  */
@@ -4538,15 +4737,12 @@
 ahc_init(struct ahc_softc *ahc)
 {
 	int	 max_targ;
-	int	 i;
-	int	 term;
+	u_int	 i;
 	u_int	 scsi_conf;
-	u_int	 scsiseq_template;
 	u_int	 ultraenb;
 	u_int	 discenable;
 	u_int	 tagenable;
 	size_t	 driver_data_size;
-	uint32_t physaddr;
 
 #ifdef AHC_DEBUG
 	if ((ahc_debug & AHC_DEBUG_SEQUENCER) != 0)
@@ -4600,7 +4796,9 @@
 	/* DMA tag for mapping buffers into device visible space. */
 	if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
 			       /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
-			       /*lowaddr*/BUS_SPACE_MAXADDR,
+			       /*lowaddr*/ahc->flags & AHC_39BIT_ADDRESSING
+					? (bus_addr_t)0x7FFFFFFFFFULL
+					: BUS_SPACE_MAXADDR_32BIT,
 			       /*highaddr*/BUS_SPACE_MAXADDR,
 			       /*filter*/NULL, /*filterarg*/NULL,
 			       /*maxsize*/(AHC_NSEG - 1) * PAGE_SIZE,
@@ -4664,9 +4862,6 @@
 		for (i = 0; i < AHC_TMODE_CMDS; i++)
 			ahc->targetcmds[i].cmd_valid = 0;
 		ahc_sync_tqinfifo(ahc, BUS_DMASYNC_PREREAD);
-		ahc->tqinfifonext = 1;
-		ahc_outb(ahc, KERNEL_TQINPOS, ahc->tqinfifonext - 1);
-		ahc_outb(ahc, TQINPOS, ahc->tqinfifonext);
 		ahc->qoutfifo = (uint8_t *)&ahc->targetcmds[256];
 	}
 	ahc->qinfifo = &ahc->qoutfifo[256];
@@ -4697,9 +4892,6 @@
 		}
 	}
 
-	ahc_outb(ahc, SEQ_FLAGS, 0);
-	ahc_outb(ahc, SEQ_FLAGS2, 0);
-
 	if (ahc->scb_data->maxhscbs < AHC_SCB_MAX_ALLOC) {
 		ahc->flags |= AHC_PAGESCBS;
 	} else {
@@ -4708,62 +4900,31 @@
 
 #ifdef AHC_DEBUG
 	if (ahc_debug & AHC_SHOW_MISC) {
-		printf("%s: hardware scb %Zu bytes; kernel scb %Zu bytes; "
-		       "ahc_dma %Zu bytes\n",
+		printf("%s: hardware scb %u bytes; kernel scb %u bytes; "
+		       "ahc_dma %u bytes\n",
 			ahc_name(ahc),
-			sizeof(struct hardware_scb),
-			sizeof(struct scb),
-			sizeof(struct ahc_dma_seg));
+			(u_int)sizeof(struct hardware_scb),
+			(u_int)sizeof(struct scb),
+			(u_int)sizeof(struct ahc_dma_seg));
 	}
 #endif /* AHC_DEBUG */
 
-	/* Set the SCSI Id, SXFRCTL0, SXFRCTL1, and SIMODE1, for both channels*/
+	/*
+	 * Look at the information that board initialization or
+	 * the board bios has left us.
+	 */
 	if (ahc->features & AHC_TWIN) {
-
-		/*
-		 * The device is gated to channel B after a chip reset,
-		 * so set those values first
-		 */
-		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) | SELBUSB);
-		term = (ahc->flags & AHC_TERM_ENB_B) != 0 ? STPWEN : 0;
-		ahc_outb(ahc, SCSIID, ahc->our_id_b);
 		scsi_conf = ahc_inb(ahc, SCSICONF + 1);
-		ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
-					|term|ahc->seltime_b|ENSTIMER|ACTNEGEN);
-		if ((ahc->features & AHC_ULTRA2) != 0)
-			ahc_outb(ahc, SIMODE0, ahc_inb(ahc, SIMODE0)|ENIOERR);
-		ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
-		ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
-
 		if ((scsi_conf & RESET_SCSI) != 0
 		 && (ahc->flags & AHC_INITIATORROLE) != 0)
 			ahc->flags |= AHC_RESET_BUS_B;
-
-		/* Select Channel A */
-		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
 	}
-	term = (ahc->flags & AHC_TERM_ENB_A) != 0 ? STPWEN : 0;
-	if ((ahc->features & AHC_ULTRA2) != 0)
-		ahc_outb(ahc, SCSIID_ULTRA2, ahc->our_id);
-	else
-		ahc_outb(ahc, SCSIID, ahc->our_id);
-	scsi_conf = ahc_inb(ahc, SCSICONF);
-	ahc_outb(ahc, SXFRCTL1, (scsi_conf & (ENSPCHK|STIMESEL))
-				|term|ahc->seltime
-				|ENSTIMER|ACTNEGEN);
-	if ((ahc->features & AHC_ULTRA2) != 0)
-		ahc_outb(ahc, SIMODE0, ahc_inb(ahc, SIMODE0)|ENIOERR);
-	ahc_outb(ahc, SIMODE1, ENSELTIMO|ENSCSIRST|ENSCSIPERR);
-	ahc_outb(ahc, SXFRCTL0, DFON|SPIOEN);
 
+	scsi_conf = ahc_inb(ahc, SCSICONF);
 	if ((scsi_conf & RESET_SCSI) != 0
 	 && (ahc->flags & AHC_INITIATORROLE) != 0)
 		ahc->flags |= AHC_RESET_BUS_A;
 
-	/*
-	 * Look at the information that board initialization or
-	 * the board bios has left us.
-	 */
 	ultraenb = 0;	
 	tagenable = ALL_TARGETS_MASK;
 
@@ -4815,7 +4976,7 @@
 			 * connection type we have with the target.
 			 */
 			tinfo->user.period = ahc_syncrates->period;
-			tinfo->user.offset = ~0;
+			tinfo->user.offset = MAX_OFFSET;
 		} else {
 			u_int scsirate;
 			uint16_t mask;
@@ -4850,7 +5011,7 @@
 				if (offset == 0)
 					tinfo->user.period = 0;
 				else
-					tinfo->user.offset = ~0;
+					tinfo->user.offset = MAX_OFFSET;
 				if ((scsirate & SXFR_ULTRA2) <= 8/*10MHz*/
 				 && (ahc->features & AHC_DT) != 0)
 					tinfo->user.ppr_options =
@@ -4868,7 +5029,7 @@
 						   ? AHC_SYNCRATE_ULTRA
 						   : AHC_SYNCRATE_FAST);
 				if (tinfo->user.period != 0)
-					tinfo->user.offset = ~0;
+					tinfo->user.offset = MAX_OFFSET;
 			}
 			if (tinfo->user.period == 0)
 				tinfo->user.offset = 0;
@@ -4890,127 +5051,7 @@
 	ahc->user_discenable = discenable;
 	ahc->user_tagenable = tagenable;
 
-	/* There are no untagged SCBs active yet. */
-	for (i = 0; i < 16; i++) {
-		ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, 0));
-		if ((ahc->flags & AHC_SCB_BTT) != 0) {
-			int lun;
-
-			/*
-			 * The SCB based BTT allows an entry per
-			 * target and lun pair.
-			 */
-			for (lun = 1; lun < AHC_NUM_LUNS; lun++)
-				ahc_unbusy_tcl(ahc, BUILD_TCL(i << 4, lun));
-		}
-	}
-
-	/* All of our queues are empty */
-	for (i = 0; i < 256; i++)
-		ahc->qoutfifo[i] = SCB_LIST_NULL;
-	ahc_sync_qoutfifo(ahc, BUS_DMASYNC_PREREAD);
-
-	for (i = 0; i < 256; i++)
-		ahc->qinfifo[i] = SCB_LIST_NULL;
-
-	if ((ahc->features & AHC_MULTI_TID) != 0) {
-		ahc_outb(ahc, TARGID, 0);
-		ahc_outb(ahc, TARGID + 1, 0);
-	}
-
-	/*
-	 * Tell the sequencer where it can find our arrays in memory.
-	 */
-	physaddr = ahc->scb_data->hscb_busaddr;
-	ahc_outb(ahc, HSCB_ADDR, physaddr & 0xFF);
-	ahc_outb(ahc, HSCB_ADDR + 1, (physaddr >> 8) & 0xFF);
-	ahc_outb(ahc, HSCB_ADDR + 2, (physaddr >> 16) & 0xFF);
-	ahc_outb(ahc, HSCB_ADDR + 3, (physaddr >> 24) & 0xFF);
-
-	physaddr = ahc->shared_data_busaddr;
-	ahc_outb(ahc, SHARED_DATA_ADDR, physaddr & 0xFF);
-	ahc_outb(ahc, SHARED_DATA_ADDR + 1, (physaddr >> 8) & 0xFF);
-	ahc_outb(ahc, SHARED_DATA_ADDR + 2, (physaddr >> 16) & 0xFF);
-	ahc_outb(ahc, SHARED_DATA_ADDR + 3, (physaddr >> 24) & 0xFF);
-
-	/*
-	 * Initialize the group code to command length table.
-	 * This overrides the values in TARG_SCSIRATE, so only
-	 * setup the table after we have processed that information.
-	 */
-	ahc_outb(ahc, CMDSIZE_TABLE, 5);
-	ahc_outb(ahc, CMDSIZE_TABLE + 1, 9);
-	ahc_outb(ahc, CMDSIZE_TABLE + 2, 9);
-	ahc_outb(ahc, CMDSIZE_TABLE + 3, 0);
-	ahc_outb(ahc, CMDSIZE_TABLE + 4, 15);
-	ahc_outb(ahc, CMDSIZE_TABLE + 5, 11);
-	ahc_outb(ahc, CMDSIZE_TABLE + 6, 0);
-	ahc_outb(ahc, CMDSIZE_TABLE + 7, 0);
-		
-	/* Tell the sequencer of our initial queue positions */
-	ahc_outb(ahc, KERNEL_QINPOS, 0);
-	ahc_outb(ahc, QINPOS, 0);
-	ahc_outb(ahc, QOUTPOS, 0);
-
-	/*
-	 * Use the built in queue management registers
-	 * if they are available.
-	 */
-	if ((ahc->features & AHC_QUEUE_REGS) != 0) {
-		ahc_outb(ahc, QOFF_CTLSTA, SCB_QSIZE_256);
-		ahc_outb(ahc, SDSCB_QOFF, 0);
-		ahc_outb(ahc, SNSCB_QOFF, 0);
-		ahc_outb(ahc, HNSCB_QOFF, 0);
-	}
-
-
-	/* We don't have any waiting selections */
-	ahc_outb(ahc, WAITING_SCBH, SCB_LIST_NULL);
-
-	/* Our disconnection list is empty too */
-	ahc_outb(ahc, DISCONNECTED_SCBH, SCB_LIST_NULL);
-
-	/* Message out buffer starts empty */
-	ahc_outb(ahc, MSG_OUT, MSG_NOOP);
-
-	/*
-	 * Setup the allowed SCSI Sequences based on operational mode.
-	 * If we are a target, we'll enalbe select in operations once
-	 * we've had a lun enabled.
-	 */
-	scsiseq_template = ENSELO|ENAUTOATNO|ENAUTOATNP;
-	if ((ahc->flags & AHC_INITIATORROLE) != 0)
-		scsiseq_template |= ENRSELI;
-	ahc_outb(ahc, SCSISEQ_TEMPLATE, scsiseq_template);
-
-	/*
-	 * Load the Sequencer program and Enable the adapter
-	 * in "fast" mode.
-	 */
-	if (bootverbose)
-		printf("%s: Downloading Sequencer Program...",
-		       ahc_name(ahc));
-
-	ahc_loadseq(ahc);
-
-	if ((ahc->features & AHC_ULTRA2) != 0) {
-		int wait;
-
-		/*
-		 * Wait for up to 500ms for our transceivers
-		 * to settle.  If the adapter does not have
-		 * a cable attached, the transceivers may
-		 * 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);
-	}
-	return (0);
+	return (ahc->bus_chip_init(ahc));
 }
 
 void
@@ -5046,7 +5087,6 @@
 
 	maxloops = 1000;
 	ahc->flags |= AHC_ALL_INTERRUPTS;
-	intstat = 0;
 	paused = FALSE;
 	do {
 		if (paused)
@@ -5056,10 +5096,10 @@
 		paused = TRUE;
 		ahc_outb(ahc, SCSISEQ, ahc_inb(ahc, SCSISEQ) & ~ENSELO);
 		ahc_clear_critical_section(ahc);
-		if (intstat == 0xFF && (ahc->features & AHC_REMOVABLE) != 0)
-			break;
+		intstat = ahc_inb(ahc, INTSTAT);
 	} while (--maxloops
-	      && (((intstat = ahc_inb(ahc, INTSTAT)) & INT_PEND) != 0
+	      && (intstat != 0xFF || (ahc->features & AHC_REMOVABLE) == 0)
+	      && ((intstat & INT_PEND) != 0
 	       || (ahc_inb(ahc, SSTAT0) & (SELDO|SELINGO))));
 	if (maxloops == 0) {
 		printf("Infinite interrupt loop, INTSTAT = %x",
@@ -5072,13 +5112,13 @@
 int
 ahc_suspend(struct ahc_softc *ahc)
 {
-	uint8_t *ptr;
-	int	 i;
 
 	ahc_pause_and_flushwork(ahc);
 
-	if (LIST_FIRST(&ahc->pending_scbs) != NULL)
+	if (LIST_FIRST(&ahc->pending_scbs) != NULL) {
+		ahc_unpause(ahc);
 		return (EBUSY);
+	}
 
 #if AHC_TARGET_MODE
 	/*
@@ -5086,73 +5126,11 @@
 	 * Perhaps we should just refuse to be suspended if we
 	 * are acting in a target role.
 	 */
-	if (ahc->pending_device != NULL)
+	if (ahc->pending_device != NULL) {
+		ahc_unpause(ahc);
 		return (EBUSY);
-#endif
-
-	/* Save volatile registers */
-	if ((ahc->features & AHC_TWIN) != 0) {
-		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) | SELBUSB);
-		ahc->suspend_state.channel[1].scsiseq = ahc_inb(ahc, SCSISEQ);
-		ahc->suspend_state.channel[1].sxfrctl0 = ahc_inb(ahc, SXFRCTL0);
-		ahc->suspend_state.channel[1].sxfrctl1 = ahc_inb(ahc, SXFRCTL1);
-		ahc->suspend_state.channel[1].simode0 = ahc_inb(ahc, SIMODE0);
-		ahc->suspend_state.channel[1].simode1 = ahc_inb(ahc, SIMODE1);
-		ahc->suspend_state.channel[1].seltimer = ahc_inb(ahc, SELTIMER);
-		ahc->suspend_state.channel[1].seqctl = ahc_inb(ahc, SEQCTL);
-		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
-	}
-	ahc->suspend_state.channel[0].scsiseq = ahc_inb(ahc, SCSISEQ);
-	ahc->suspend_state.channel[0].sxfrctl0 = ahc_inb(ahc, SXFRCTL0);
-	ahc->suspend_state.channel[0].sxfrctl1 = ahc_inb(ahc, SXFRCTL1);
-	ahc->suspend_state.channel[0].simode0 = ahc_inb(ahc, SIMODE0);
-	ahc->suspend_state.channel[0].simode1 = ahc_inb(ahc, SIMODE1);
-	ahc->suspend_state.channel[0].seltimer = ahc_inb(ahc, SELTIMER);
-	ahc->suspend_state.channel[0].seqctl = ahc_inb(ahc, SEQCTL);
-
-	if ((ahc->chip & AHC_PCI) != 0) {
-		ahc->suspend_state.dscommand0 = ahc_inb(ahc, DSCOMMAND0);
-		ahc->suspend_state.dspcistatus = ahc_inb(ahc, DSPCISTATUS);
-	}
-
-	if ((ahc->features & AHC_DT) != 0) {
-		u_int sfunct;
-
-		sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
-		ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
-		ahc->suspend_state.optionmode = ahc_inb(ahc, OPTIONMODE);
-		ahc_outb(ahc, SFUNCT, sfunct);
-		ahc->suspend_state.crccontrol1 = ahc_inb(ahc, CRCCONTROL1);
-	}
-
-	if ((ahc->features & AHC_MULTI_FUNC) != 0)
-		ahc->suspend_state.scbbaddr = ahc_inb(ahc, SCBBADDR);
-
-	if ((ahc->features & AHC_ULTRA2) != 0)
-		ahc->suspend_state.dff_thrsh = ahc_inb(ahc, DFF_THRSH);
-
-	ptr = ahc->suspend_state.scratch_ram;
-	for (i = 0; i < 64; i++)
-		*ptr++ = ahc_inb(ahc, SRAM_BASE + i);
-
-	if ((ahc->features & AHC_MORE_SRAM) != 0) {
-		for (i = 0; i < 16; i++)
-			*ptr++ = ahc_inb(ahc, TARG_OFFSET + i);
-	}
-
-	ptr = ahc->suspend_state.btt;
-	if ((ahc->flags & AHC_SCB_BTT) != 0) {
-		for (i = 0;i < AHC_NUM_TARGETS; i++) {
-			int j;
-
-			for (j = 0;j < AHC_NUM_LUNS; j++) {
-				u_int tcl;
-
-				tcl = BUILD_TCL(i << 4, j);
-				*ptr = ahc_index_busy_tcl(ahc, tcl);
-			}
-		}
 	}
+#endif
 	ahc_shutdown(ahc);
 	return (0);
 }
@@ -5160,81 +5138,8 @@
 int
 ahc_resume(struct ahc_softc *ahc)
 {
-	uint8_t *ptr;
-	int	 i;
 
 	ahc_reset(ahc);
-
-	ahc_build_free_scb_list(ahc);
-
-	/* Restore volatile registers */
-	if ((ahc->features & AHC_TWIN) != 0) {
-		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) | SELBUSB);
-		ahc_outb(ahc, SCSIID, ahc->our_id);
-		ahc_outb(ahc, SCSISEQ, ahc->suspend_state.channel[1].scsiseq);
-		ahc_outb(ahc, SXFRCTL0, ahc->suspend_state.channel[1].sxfrctl0);
-		ahc_outb(ahc, SXFRCTL1, ahc->suspend_state.channel[1].sxfrctl1);
-		ahc_outb(ahc, SIMODE0, ahc->suspend_state.channel[1].simode0);
-		ahc_outb(ahc, SIMODE1, ahc->suspend_state.channel[1].simode1);
-		ahc_outb(ahc, SELTIMER, ahc->suspend_state.channel[1].seltimer);
-		ahc_outb(ahc, SEQCTL, ahc->suspend_state.channel[1].seqctl);
-		ahc_outb(ahc, SBLKCTL, ahc_inb(ahc, SBLKCTL) & ~SELBUSB);
-	}
-	ahc_outb(ahc, SCSISEQ, ahc->suspend_state.channel[0].scsiseq);
-	ahc_outb(ahc, SXFRCTL0, ahc->suspend_state.channel[0].sxfrctl0);
-	ahc_outb(ahc, SXFRCTL1, ahc->suspend_state.channel[0].sxfrctl1);
-	ahc_outb(ahc, SIMODE0, ahc->suspend_state.channel[0].simode0);
-	ahc_outb(ahc, SIMODE1, ahc->suspend_state.channel[0].simode1);
-	ahc_outb(ahc, SELTIMER, ahc->suspend_state.channel[0].seltimer);
-	ahc_outb(ahc, SEQCTL, ahc->suspend_state.channel[0].seqctl);
-	if ((ahc->features & AHC_ULTRA2) != 0)
-		ahc_outb(ahc, SCSIID_ULTRA2, ahc->our_id);
-	else
-		ahc_outb(ahc, SCSIID, ahc->our_id);
-
-	if ((ahc->chip & AHC_PCI) != 0) {
-		ahc_outb(ahc, DSCOMMAND0, ahc->suspend_state.dscommand0);
-		ahc_outb(ahc, DSPCISTATUS, ahc->suspend_state.dspcistatus);
-	}
-
-	if ((ahc->features & AHC_DT) != 0) {
-		u_int sfunct;
-
-		sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
-		ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
-		ahc_outb(ahc, OPTIONMODE, ahc->suspend_state.optionmode);
-		ahc_outb(ahc, SFUNCT, sfunct);
-		ahc_outb(ahc, CRCCONTROL1, ahc->suspend_state.crccontrol1);
-	}
-
-	if ((ahc->features & AHC_MULTI_FUNC) != 0)
-		ahc_outb(ahc, SCBBADDR, ahc->suspend_state.scbbaddr);
-
-	if ((ahc->features & AHC_ULTRA2) != 0)
-		ahc_outb(ahc, DFF_THRSH, ahc->suspend_state.dff_thrsh);
-
-	ptr = ahc->suspend_state.scratch_ram;
-	for (i = 0; i < 64; i++)
-		ahc_outb(ahc, SRAM_BASE + i, *ptr++);
-
-	if ((ahc->features & AHC_MORE_SRAM) != 0) {
-		for (i = 0; i < 16; i++)
-			ahc_outb(ahc, TARG_OFFSET + i, *ptr++);
-	}
-
-	ptr = ahc->suspend_state.btt;
-	if ((ahc->flags & AHC_SCB_BTT) != 0) {
-		for (i = 0;i < AHC_NUM_TARGETS; i++) {
-			int j;
-
-			for (j = 0;j < AHC_NUM_LUNS; j++) {
-				u_int tcl;
-
-				tcl = BUILD_TCL(i << 4, j);
-				ahc_busy_tcl(ahc, tcl, *ptr);
-			}
-		}
-	}
 	return (0);
 }
 
@@ -6379,19 +6284,11 @@
 ahc_dumpseq(struct ahc_softc* ahc)
 {
 	int i;
-	int max_prog;
-
-	if ((ahc->chip & AHC_BUS_MASK) < AHC_PCI)
-		max_prog = 448;
-	else if ((ahc->features & AHC_ULTRA2) != 0)
-		max_prog = 768;
-	else
-		max_prog = 512;
 
 	ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
 	ahc_outb(ahc, SEQADDR0, 0);
 	ahc_outb(ahc, SEQADDR1, 0);
-	for (i = 0; i < max_prog; i++) {
+	for (i = 0; i < ahc->instruction_ram_size; i++) {
 		uint8_t ins_bytes[4];
 
 		ahc_insb(ahc, SEQRAM, ins_bytes, 4);
@@ -6403,7 +6300,7 @@
 }
 #endif
 
-static void
+static int
 ahc_loadseq(struct ahc_softc *ahc)
 {
 	struct	cs cs_table[num_critical_sections];
@@ -6413,9 +6310,9 @@
 	u_int	cs_count;
 	u_int	cur_cs;
 	u_int	i;
-	int	downloaded;
 	u_int	skip_addr;
 	u_int	sg_prefetch_cnt;
+	int	downloaded;
 	uint8_t	download_consts[7];
 
 	/*
@@ -6456,6 +6353,19 @@
 			 */
 			continue;
 		}
+
+		if (downloaded == ahc->instruction_ram_size) {
+			/*
+			 * We're about to exceed the instruction
+			 * storage capacity for this chip.  Fail
+			 * the load.
+			 */
+			printf("\n%s: Program too large for instruction memory "
+			       "size of %d!\n", ahc_name(ahc),
+			       ahc->instruction_ram_size);
+			return (ENOMEM);
+		}
+
 		/*
 		 * Move through the CS table until we find a CS
 		 * that might apply to this instruction.
@@ -6498,6 +6408,7 @@
 		printf("%s: Features 0x%x, Bugs 0x%x, Flags 0x%x\n",
 		       ahc_name(ahc), ahc->features, ahc->bugs, ahc->flags);
 	}
+	return (0);
 }
 
 static int
@@ -6942,11 +6853,12 @@
 	struct	   ahc_tmode_lstate *lstate;
 	struct	   ccb_en_lun *cel;
 	cam_status status;
+	u_long	   s;
 	u_int	   target;
 	u_int	   lun;
 	u_int	   target_mask;
 	u_int	   our_id;
-	u_long	   s;
+	int	   error;
 	char	   channel;
 
 	status = ahc_find_tmode_devs(ahc, sim, ccb, &tstate, &lstate,
@@ -7023,7 +6935,8 @@
 	 */
 	if ((ahc->flags & AHC_TARGETROLE) == 0
 	 && ccb->ccb_h.target_id != CAM_TARGET_WILDCARD) {
-		u_long	s;
+		u_long	 s;
+		ahc_flag saved_flags;
 
 		printf("Configuring Target Mode\n");
 		ahc_lock(ahc, &s);
@@ -7032,11 +6945,28 @@
 			ahc_unlock(ahc, &s);
 			return;
 		}
+		saved_flags = ahc->flags;
 		ahc->flags |= AHC_TARGETROLE;
 		if ((ahc->features & AHC_MULTIROLE) == 0)
 			ahc->flags &= ~AHC_INITIATORROLE;
 		ahc_pause(ahc);
-		ahc_loadseq(ahc);
+		error = ahc_loadseq(ahc);
+		if (error != 0) {
+			/*
+			 * Restore original configuration and notify
+			 * the caller that we cannot support target mode.
+			 * Since the adapter started out in this
+			 * configuration, the firmware load will succeed,
+			 * so there is no point in checking ahc_loadseq's
+			 * return value.
+			 */
+			ahc->flags = saved_flags;
+			(void)ahc_loadseq(ahc);
+			ahc_unpause(ahc);
+			ahc_unlock(ahc, &s);
+			ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
+			return;
+		}
 		ahc_unlock(ahc, &s);
 	}
 	cel = &ccb->cel;
@@ -7272,7 +7202,11 @@
 				ahc->flags &= ~AHC_TARGETROLE;
 				ahc->flags |= AHC_INITIATORROLE;
 				ahc_pause(ahc);
-				ahc_loadseq(ahc);
+				/*
+				 * Returning to a configuration that
+				 * fit previously will always succeed.
+				 */
+				(void)ahc_loadseq(ahc);
 			}
 		}
 		ahc_unpause(ahc);
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_inline.h b/drivers/scsi/aic7xxx/aic7xxx_inline.h
--- a/drivers/scsi/aic7xxx/aic7xxx_inline.h	Sat Apr 19 19:51:51 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_inline.h	Sat Apr 19 19:51:51 2003
@@ -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_inline.h#39 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_inline.h#40 $
  *
  * $FreeBSD$
  */
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c	Sat Apr 19 19:51:28 2003
@@ -1,7 +1,7 @@
 /*
  * Adaptec AIC7xxx device driver for Linux.
  *
- * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#179 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.c#206 $
  *
  * Copyright (c) 1994 John Aycock
  *   The University of Calgary Department of Computer Science.
@@ -488,12 +488,11 @@
 "				(0/256ms,1/128ms,2/64ms,3/32ms)\n"
 "\n"
 "	Sample /etc/modules.conf line:\n"
-"		Enable verbose logging\n"
-"		Disable EISA/VLB probing\n"
+"		Toggle EISA/VLB probing\n"
 "		Set tag depth on Controller 1/Target 2 to 10 tags\n"
 "		Shorten the selection timeout to 128ms\n"
 "\n"
-"	options aic7xxx='\"verbose.no_probe.tag_info:{{}.{..10}}.seltime:1\"'\n"
+"	options aic7xxx 'aic7xxx=no_probe.tag_info:{{}.{..10}}.seltime:1'\n"
 );
 #endif
 
@@ -513,6 +512,7 @@
 static void ahc_linux_start_dv(struct ahc_softc *ahc);
 static void ahc_linux_dv_timeout(struct scsi_cmnd *cmd);
 static int  ahc_linux_dv_thread(void *data);
+static void ahc_linux_kill_dv_thread(struct ahc_softc *ahc);
 static void ahc_linux_dv_target(struct ahc_softc *ahc, u_int target);
 static void ahc_linux_dv_transition(struct ahc_softc *ahc,
 				    struct scsi_cmnd *cmd,
@@ -565,9 +565,9 @@
 						      struct ahc_linux_device*);
 static void ahc_linux_run_device_queue(struct ahc_softc*,
 				       struct ahc_linux_device*);
-static void ahc_linux_setup_tag_info(char *p, char *end, char *s);
 static void ahc_linux_setup_tag_info_global(char *p);
-static void ahc_linux_setup_dv(char *p, char *end, char *s);
+static aic_option_callback_t ahc_linux_setup_tag_info;
+static aic_option_callback_t ahc_linux_setup_dv;
 static int  aic7xxx_setup(char *s);
 static int  ahc_linux_next_unit(void);
 static void ahc_runq_tasklet(unsigned long data);
@@ -620,6 +620,9 @@
 	}
 }
 
+/*
+ * Must be called with our lock held.
+ */
 static __inline void
 ahc_schedule_runq(struct ahc_softc *ahc)
 {
@@ -666,8 +669,8 @@
 	u_long	done_flags;
 	int	with_errors;
 
-	ahc_done_lock(ahc, &done_flags);
 	with_errors = 0;
+	ahc_done_lock(ahc, &done_flags);
 	while (acmd != NULL) {
 		Scsi_Cmnd *cmd;
 
@@ -995,9 +998,13 @@
 	dev = ahc_linux_get_device(ahc, cmd->device->channel, cmd->device->id,
 				   cmd->device->lun, /*alloc*/TRUE);
 	if (dev == NULL) {
+		ahc_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
+		ahc_linux_queue_cmd_complete(ahc, cmd);
+		ahc_schedule_completeq(ahc, NULL);
 		ahc_midlayer_entrypoint_unlock(ahc, &flags);
-		printf("aic7xxx_linux_queue: Unable to allocate device!\n");
-		return (-ENOMEM);
+		printf("%s: aic7xxx_linux_queue - Unable to allocate device!\n",
+		       ahc_name(ahc));
+		return (0);
 	}
 	cmd->result = CAM_REQ_INPROG << 16;
 	TAILQ_INSERT_TAIL(&dev->busyq, (struct ahc_cmd *)cmd, acmd_links.tqe);
@@ -1094,7 +1101,7 @@
 	u_long	flags;
 
 	ahc = *((struct ahc_softc **)host->hostdata);
-	ahc_midlayer_entrypoint_lock(ahc, &flags);
+	ahc_lock(ahc, &flags);
 	for (device = scsi_devs; device != NULL; device = device->next) {
 		if (device->host == host) {
 			struct	 ahc_linux_device *dev;
@@ -1127,7 +1134,7 @@
 			}
 		}
 	}
-	ahc_midlayer_entrypoint_unlock(ahc, &flags);
+	ahc_unlock(ahc, &flags);
 }
 #endif
 
@@ -1238,30 +1245,23 @@
 	int    found;
 
 	ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_unlock_irq(&io_request_lock);
-#endif
 	ahc_midlayer_entrypoint_lock(ahc, &s);
 	found = ahc_reset_channel(ahc, cmd->device->channel + 'A',
 				  /*initiate reset*/TRUE);
 	acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
 	TAILQ_INIT(&ahc->platform_data->completeq);
-	ahc_midlayer_entrypoint_unlock(ahc, &s);
-	if (bootverbose)
-		printf("%s: SCSI bus reset delivered. "
-		       "%d SCBs aborted.\n", ahc_name(ahc), found);
 
 	if (acmd != NULL) {
 		acmd = ahc_linux_run_complete_queue(ahc, acmd);
-		if (acmd != NULL) {
-			ahc_midlayer_entrypoint_lock(ahc, &s);
+		if (acmd != NULL)
 			ahc_schedule_completeq(ahc, acmd);
-			ahc_midlayer_entrypoint_unlock(ahc, &s);
-		}
 	}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_lock_irq(&io_request_lock);
-#endif
+	ahc_midlayer_entrypoint_unlock(ahc, &s);
+
+	if (bootverbose)
+		printf("%s: SCSI bus reset delivered. "
+		       "%d SCBs aborted.\n", ahc_name(ahc), found);
+
 	return SUCCESS;
 }
 
@@ -1291,7 +1291,7 @@
 	.max_sectors		= 8192,
 #endif
 #if defined CONFIG_HIGHIO || LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
 /* Assume RedHat Distribution with its different HIGHIO conventions. */
 	.can_dma_32		= 1,
 	.single_sg_okay		= 1,
@@ -1313,15 +1313,25 @@
 
 /**************************** Tasklet Handler *********************************/
 
+/*
+ * In 2.4.X and above, this routine is called from a tasklet,
+ * so we must re-acquire our lock prior to executing this code.
+ * In all prior kernels, ahc_schedule_runq() calls this routine
+ * directly and ahc_schedule_runq() is called with our lock held.
+ */
 static void
 ahc_runq_tasklet(unsigned long data)
 {
 	struct ahc_softc* ahc;
 	struct ahc_linux_device *dev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 	u_long flags;
+#endif
 
 	ahc = (struct ahc_softc *)data;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 	ahc_lock(ahc, &flags);
+#endif
 	while ((dev = ahc_linux_next_device_to_run(ahc)) != NULL) {
 	
 		TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
@@ -1331,7 +1341,9 @@
 		ahc_unlock(ahc, &flags);
 		ahc_lock(ahc, &flags);
 	}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 	ahc_unlock(ahc, &flags);
+#endif
 }
 
 /************************ Shutdown/halt/reboot hook ***************************/
@@ -1495,6 +1507,12 @@
 }
 
 /********************* Platform Dependent Functions ***************************/
+/*
+ * Compare "left hand" softc with "right hand" softc, returning:
+ * < 0 - lahc has a lower priority than rahc
+ *   0 - Softcs are equal
+ * > 0 - lahc has a higher priority than rahc
+ */
 int
 ahc_softc_comp(struct ahc_softc *lahc, struct ahc_softc *rahc)
 {
@@ -1513,7 +1531,7 @@
 	      - (rahc->flags & AHC_BIOS_ENABLED);
 	if (value != 0)
 		/* Controllers with BIOS enabled have a *higher* priority */
-		return (-value);
+		return (value);
 
 	/*
 	 * Same BIOS setting, now sort based on bus type.
@@ -1526,7 +1544,7 @@
 	lvalue = (lahc->chip & AHC_BUS_MASK);
  	if (lvalue == AHC_VL)
 		lvalue = AHC_EISA;
-	value = lvalue - rvalue;
+	value = rvalue - lvalue;
 	if (value != 0)
 		return (value);
 
@@ -1537,40 +1555,40 @@
 		char primary_channel;
 
 		if (aic7xxx_reverse_scan != 0)
-			value = ahc_get_pci_bus(rahc->dev_softc)
-			      - ahc_get_pci_bus(lahc->dev_softc);
-		else
 			value = ahc_get_pci_bus(lahc->dev_softc)
 			      - ahc_get_pci_bus(rahc->dev_softc);
+		else
+			value = ahc_get_pci_bus(rahc->dev_softc)
+			      - ahc_get_pci_bus(lahc->dev_softc);
 		if (value != 0)
 			break;
 		if (aic7xxx_reverse_scan != 0)
-			value = ahc_get_pci_slot(rahc->dev_softc)
-			      - ahc_get_pci_slot(lahc->dev_softc);
-		else
 			value = ahc_get_pci_slot(lahc->dev_softc)
 			      - ahc_get_pci_slot(rahc->dev_softc);
+		else
+			value = ahc_get_pci_slot(rahc->dev_softc)
+			      - ahc_get_pci_slot(lahc->dev_softc);
 		if (value != 0)
 			break;
 		/*
 		 * On multi-function devices, the user can choose
 		 * to have function 1 probed before function 0.
 		 * Give whichever channel is the primary channel
-		 * the lowest priority.
+		 * the highest priority.
 		 */
 		primary_channel = (lahc->flags & AHC_PRIMARY_CHANNEL) + 'A';
-		value = 1;
+		value = -1;
 		if (lahc->channel == primary_channel)
-			value = -1;
+			value = 1;
 		break;
 	}
 	case AHC_EISA:
 		if ((rahc->flags & AHC_BIOS_ENABLED) != 0) {
-			value = lahc->platform_data->bios_address
-			      - rahc->platform_data->bios_address; 
+			value = rahc->platform_data->bios_address
+			      - lahc->platform_data->bios_address; 
 		} else {
-			value = lahc->bsh.ioport
-			      - rahc->bsh.ioport; 
+			value = rahc->bsh.ioport
+			      - lahc->bsh.ioport; 
 		}
 		break;
 	default:
@@ -1580,90 +1598,6 @@
 }
 
 static void
-ahc_linux_setup_tag_info(char *p, char *end, char *s)
-{
-	char	*base;
-	char	*tok;
-	char	*tok_end;
-	char	*tok_end2;
-	int      i;
-	int      instance;
-	int	 targ;
-	int	 done;
-	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
-
-	if (*p != ':')
-		return;
-
-	instance = -1;
-	targ = -1;
-	done = FALSE;
-	base = p;
-	/* Forward us just past the ':' */
-	tok = base + 1;
-	tok_end = strchr(tok, '\0');
-	if (tok_end < end)
-		*tok_end = ',';
-	while (!done) {
-		switch (*tok) {
-		case '{':
-			if (instance == -1)
-				instance = 0;
-			else if (targ == -1)
-				targ = 0;
-			tok++;
-			break;
-		case '}':
-			if (targ != -1)
-				targ = -1;
-			else if (instance != -1)
-				instance = -1;
-			tok++;
-			break;
-		case ',':
-		case '.':
-			if (instance == -1)
-				done = TRUE;
-			else if (targ >= 0)
-				targ++;
-			else if (instance >= 0)
-				instance++;
-			if ((targ >= AHC_NUM_TARGETS) ||
-			    (instance >= NUM_ELEMENTS(aic7xxx_tag_info)))
-				done = TRUE;
-			tok++;
-			if (!done) {
-				base = tok;
-			}
-			break;
-		case '\0':
-			done = TRUE;
-			break;
-		default:
-			done = TRUE;
-			tok_end = strchr(tok, '\0');
-			for (i = 0; tok_list[i]; i++) {
-				tok_end2 = strchr(tok, tok_list[i]);
-				if ((tok_end2) && (tok_end2 < tok_end)) {
-					tok_end = tok_end2;
-					done = FALSE;
-				}
-			}
-			if ((instance >= 0) && (targ >= 0)
-			 && (instance < NUM_ELEMENTS(aic7xxx_tag_info))
-			 && (targ < AHC_NUM_TARGETS)) {
-				aic7xxx_tag_info[instance].tag_commands[targ] =
-				    simple_strtoul(tok, NULL, 0) & 0xff;
-			}
-			tok = tok_end;
-			break;
-		}
-	}
-	while ((p != base) && (p != NULL))
-		p = strsep(&s, ",.");
-}
-
-static void
 ahc_linux_setup_tag_info_global(char *p)
 {
 	int tags, i, j;
@@ -1679,77 +1613,28 @@
 }
 
 static void
-ahc_linux_setup_dv(char *p, char *end, char *s)
+ahc_linux_setup_tag_info(void *arg, int instance, int targ, int32_t value)
 {
-	char	*base;
-	char	*tok;
-	char	*tok_end;
-	char	*tok_end2;
-	int      i;
-	int      instance;
-	int	 done;
-	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
 
-	if (*p != ':')
-		return;
+	if ((instance >= 0) && (targ >= 0)
+	 && (instance < NUM_ELEMENTS(aic7xxx_tag_info))
+	 && (targ < AHC_NUM_TARGETS)) {
+		aic7xxx_tag_info[instance].tag_commands[targ] = value & 0xff;
+		if (bootverbose)
+			printf("tag_info[%d:%d] = %d\n", instance, targ, value);
+	}
+}
 
-	instance = -1;
-	done = FALSE;
-	base = p;
-	/* Forward us just past the ':' */
-	tok = base + 1;
-	tok_end = strchr(tok, '\0');
-	if (tok_end < end)
-		*tok_end = ',';
-	while (!done) {
-		switch (*tok) {
-		case '{':
-			if (instance == -1)
-				instance = 0;
-			tok++;
-			break;
-		case '}':
-			if (instance != -1)
-				instance = -1;
-			tok++;
-			break;
-		case ',':
-		case '.':
-			if (instance == -1)
-				done = TRUE;
-			else if (instance >= 0)
-				instance++;
-			if (instance >= NUM_ELEMENTS(aic7xxx_dv_settings))
-				done = TRUE;
-			tok++;
-			if (!done) {
-				base = tok;
-			}
-			break;
-		case '\0':
-			done = TRUE;
-			break;
-		default:
-			done = TRUE;
-			tok_end = strchr(tok, '\0');
-			for (i = 0; tok_list[i]; i++) {
-				tok_end2 = strchr(tok, tok_list[i]);
-				if ((tok_end2) && (tok_end2 < tok_end)) {
-					tok_end = tok_end2;
-					done = FALSE;
-				}
-			}
-			if ((instance >= 0)
-			 && (instance < NUM_ELEMENTS(aic7xxx_dv_settings))) {
-				aic7xxx_dv_settings[instance] =
-				    simple_strtol(tok, NULL, 0);
-			}
-			tok = tok_end;
-			break;
-		}
+static void
+ahc_linux_setup_dv(void *arg, int instance, int targ, int32_t value)
+{
+
+	if ((instance >= 0)
+	 && (instance < NUM_ELEMENTS(aic7xxx_dv_settings))) {
+		aic7xxx_dv_settings[instance] = value;
+		if (bootverbose)
+			printf("dv[%d] = %d\n", instance, value);
 	}
-	while ((p != base) && (p != NULL))
-		p = strsep(&s, ",.");
 }
 
 /*
@@ -1787,30 +1672,38 @@
 
 	end = strchr(s, '\0');
 
+	/*
+	 * XXX ia64 gcc isn't smart enough to know that NUM_ELEMENTS
+	 * will never be 0 in this case.
+	 */
+	n = 0;
+
 	while ((p = strsep(&s, ",.")) != NULL) {
 		if (*p == '\0')
 			continue;
 		for (i = 0; i < NUM_ELEMENTS(options); i++) {
-			n = strlen(options[i].name);
 
-			if (strncmp(options[i].name, p, n) != 0)
-				continue;
+			n = strlen(options[i].name);
+			if (strncmp(options[i].name, p, n) == 0)
+				break;
+		}
+		if (i == NUM_ELEMENTS(options))
+			continue;
 
-			if (!strncmp(p, "global_tag_depth", n)) {
-				ahc_linux_setup_tag_info_global(p + n);
-			} else if (!strncmp(p, "tag_info", n)) {
-				ahc_linux_setup_tag_info(p + n, end, s);
-			} else if (strncmp(p, "dv", n) == 0) {
-				ahc_linux_setup_dv(p + n, end, s);
-			} else if (p[n] == ':') {
-				*(options[i].flag) =
-				    simple_strtoul(p + n + 1, NULL, 0);
-			} else if (!strncmp(p, "verbose", n)) {
-				*(options[i].flag) = 1;
-			} else {
-				*(options[i].flag) = ~(*(options[i].flag));
-			}
-			break;
+		if (strncmp(p, "global_tag_depth", n) == 0) {
+			ahc_linux_setup_tag_info_global(p + n);
+		} else if (strncmp(p, "tag_info", n) == 0) {
+			s = aic_parse_brace_option("tag_info", p + n, end,
+			    2, ahc_linux_setup_tag_info, NULL);
+		} else if (strncmp(p, "dv", n) == 0) {
+			s = aic_parse_brace_option("dv", p + n, end, 1,
+			    ahc_linux_setup_dv, NULL);
+		} else if (p[n] == ':') {
+			*(options[i].flag) = simple_strtoul(p + n + 1, NULL, 0);
+		} else if (strncmp(p, "verbose", n) == 0) {
+			*(options[i].flag) = 1;
+		} else {
+			*(options[i].flag) = ~(*(options[i].flag));
 		}
 	}
 	return 1;
@@ -1840,6 +1733,8 @@
 	ahc_lock(ahc, &s);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	scsi_assign_lock(host, &ahc->platform_data->spin_lock);
+#elif AHC_SCSI_HAS_HOST_LOCK != 0
+	host->lock = &ahc->platform_data->spin_lock;
 #endif
 	ahc->platform_data->host = host;
 	host->can_queue = AHC_MAX_QUEUE;
@@ -1860,7 +1755,7 @@
 	}
 	host->unique_id = ahc->unit;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,4) && \
-    LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,0)
+    LINUX_VERSION_CODE  < KERNEL_VERSION(2,5,0)
 	scsi_set_pci_device(host, ahc->dev_softc);
 #endif
 	ahc_linux_initialize_scsi_bus(ahc);
@@ -1882,20 +1777,35 @@
 	 * negotiation will occur for the first command, and DV
 	 * will comence should that first command be successful.
 	 */
-	for (target = 0; target < host->max_id*host->max_channel+1; target++) {
+	for (target = 0;
+	     target < host->max_id * (host->max_channel + 1); target++) {
 		u_int channel;
 
 		channel = 0;
 		if (target > 7
 		 && (ahc->features & AHC_TWIN) != 0)
 			channel = 1;
+		/*
+		 * Skip our own ID.  Some Compaq/HP storage devices
+		 * have enclosure management devices that respond to
+		 * single bit selection (i.e. selecting ourselves).
+		 * It is expected that either an external application
+		 * or a modified kernel will be used to probe this
+		 * ID if it is appropriate.  To accommodate these
+		 * installations, ahc_linux_alloc_target() will allocate
+		 * for our ID if asked to do so.
+		 */
+		if ((channel == 0 && target == ahc->our_id)
+		 || (channel == 1 && target == ahc->our_id_b))
+			continue;
+
 		ahc_linux_alloc_target(ahc, channel, target);
 	}
 	ahc_intr_enable(ahc, TRUE);
 	ahc_linux_start_dv(ahc);
 	ahc_unlock(ahc, &s);
 
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL));
 #endif
 	return (0);
@@ -2053,31 +1963,15 @@
 {
 	struct ahc_linux_target *targ;
 	struct ahc_linux_device *dev;
-	u_long s;
 	int i, j;
 
 	if (ahc->platform_data != NULL) {
-		/* Kill the DV kthread */
-		if (ahc->platform_data->dv_pid > 0) {
-			ahc_lock(ahc, &s);
-			ahc->platform_data->flags |= AHC_DV_SHUTDOWN;
-			ahc_unlock(ahc, &s);
-			up(&ahc->platform_data->dv_sem);
-			do {
-#ifdef AHC_DEBUG
-				if (ahc_debug & AHC_SHOW_DV) {
-					printf("%s: Waiting for DV thread to "
-					       "exit\n", ahc_name(ahc));
-				}
-#endif
-			} while (waitpid(ahc->platform_data->dv_pid, NULL,
-					 __WCLONE) == -ERESTARTSYS);
-		}
+		ahc_linux_kill_dv_thread(ahc);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
 		tasklet_kill(&ahc->platform_data->runq_tasklet);
 #endif
 		if (ahc->platform_data->host != NULL) {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 			scsi_remove_host(ahc->platform_data->host);
 #endif
 			scsi_unregister(ahc->platform_data->host);
@@ -2116,16 +2010,17 @@
 					   0x1000);
 #endif
 		}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) && \
+    LINUX_VERSION_CODE  < KERNEL_VERSION(2,5,0)
 		/*
 		 * In 2.4 we detach from the scsi midlayer before the PCI
-		 * layer invokes our remove callback.
+		 * layer invokes our remove callback.  No per-instance
+		 * detach is provided, so we must reach inside the PCI
+		 * subsystem's internals and detach our driver manually.
 		 */
 		if (ahc->dev_softc != NULL)
 			ahc->dev_softc->driver = NULL;
 #endif
-#endif
 		free(ahc->platform_data, M_DEVBUF);
 	}
 }
@@ -2153,7 +2048,18 @@
 	if (dev == NULL)
 		return;
 	was_queuing = dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED);
-	now_queuing = alg != AHC_QUEUE_NONE;
+	switch (alg) {
+	default:
+	case AHC_QUEUE_NONE:
+		now_queuing = 0;
+		break; 
+	case AHC_QUEUE_BASIC:
+		now_queuing = AHC_DEV_Q_BASIC;
+		break;
+	case AHC_QUEUE_TAGGED:
+		now_queuing = AHC_DEV_Q_TAGGED;
+		break;
+	}
 	if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) == 0
 	 && (was_queuing != now_queuing)
 	 && (dev->active != 0)) {
@@ -2302,24 +2208,12 @@
 	ahc->platform_data->flags &= ~AHC_RUN_CMPLT_Q_TIMER;
 	acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
 	TAILQ_INIT(&ahc->platform_data->completeq);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahc_unlock(ahc, &flags);
-#endif
 	if (acmd != NULL) {
 		acmd = ahc_linux_run_complete_queue(ahc, acmd);
-		if (acmd != NULL) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahc_lock(ahc, &flags);
-#endif
+		if (acmd != NULL)
 			ahc_schedule_completeq(ahc, acmd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahc_unlock(ahc, &flags);
-#endif
-		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	ahc_unlock(ahc, &flags);
-#endif
 }
 
 static void
@@ -2328,7 +2222,7 @@
 
 	/*
 	 * Freeze the simq and signal ahc_linux_queue to not let any
-	 * more commands through
+	 * more commands through.
 	 */
 	if ((ahc->platform_data->flags & AHC_DV_ACTIVE) == 0) {
 #ifdef AHC_DEBUG
@@ -2344,6 +2238,48 @@
 	}
 }
 
+static void
+ahc_linux_kill_dv_thread(struct ahc_softc *ahc)
+{
+	u_long s;
+
+	ahc_lock(ahc, &s);
+	if (ahc->platform_data->dv_pid != 0) {
+		ahc->platform_data->flags |= AHC_DV_SHUTDOWN;
+		ahc_unlock(ahc, &s);
+		up(&ahc->platform_data->dv_sem);
+
+		/*
+		 * Use the eh_sem as an indicator that the
+		 * dv thread is exiting.  Note that the dv
+		 * thread must still return after performing
+		 * the up on our semaphore before it has
+		 * completely exited this module.  Unfortunately,
+		 * there seems to be no easy way to wait for the
+		 * exit of a thread for which you are not the
+		 * parent (dv threads are parented by init).
+		 * Cross your fingers...
+		 */
+		down(&ahc->platform_data->eh_sem);
+
+		/*
+		 * Mark the dv thread as already dead.  This
+		 * avoids attempting to kill it a second time.
+		 * This is necessary because we must kill the
+		 * DV thread before calling ahc_free() in the
+		 * module shutdown case to avoid bogus locking
+		 * in the SCSI mid-layer, but we ahc_free() is
+		 * called without killing the DV thread in the
+		 * instance detach case, so ahc_platform_free()
+		 * calls us again to verify that the DV thread
+		 * is dead.
+		 */
+		ahc->platform_data->dv_pid = 0;
+	} else {
+		ahc_unlock(ahc, &s);
+	}
+}
+
 static int
 ahc_linux_dv_thread(void *data)
 {
@@ -2362,7 +2298,17 @@
 	 * Complete thread creation.
 	 */
 	lock_kernel();
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+	/*
+	 * Don't care about any signals.
+	 */
+	siginitsetinv(&current->blocked, 0);
+
+	daemonize();
+	sprintf(current->comm, "ahc_dv_%d", ahc->unit);
+#else
 	daemonize("ahc_dv_%d", ahc->unit);
+#endif
 	unlock_kernel();
 
 	while (1) {
@@ -2376,7 +2322,7 @@
 		ahc_lock(ahc, &s);
 		if ((ahc->platform_data->flags & AHC_DV_SHUTDOWN) != 0) {
 			ahc_unlock(ahc, &s);
-			return (0);
+			break;
 		}
 		ahc_unlock(ahc, &s);
 
@@ -2422,7 +2368,7 @@
 		 */
 		ahc_linux_release_simq((u_long)ahc);
 	}
-
+	up(&ahc->platform_data->eh_sem);
 	return (0);
 }
 
@@ -2528,6 +2474,7 @@
 		}
 		case AHC_DV_STATE_TUR:
 		case AHC_DV_STATE_BUSY:
+			timeout = 5 * HZ;
 			ahc_linux_dv_tur(ahc, cmd, &devinfo);
 			break;
 		case AHC_DV_STATE_REBD:
@@ -2568,14 +2515,19 @@
 		/*
 		 * In 2.5.X, it is assumed that all calls from the
 		 * "midlayer" (which we are emulating) will have the
-		 * ahc host lock held.
+		 * ahc host lock held.  For other kernels, the
+		 * io_request_lock must be held.
 		 */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#if AHC_SCSI_HAS_HOST_LOCK != 0
 		ahc_lock(ahc, &s);
+#else
+		spin_lock_irqsave(&io_request_lock, s);
 #endif
 		ahc_linux_queue(cmd, ahc_linux_dv_complete);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
+#if AHC_SCSI_HAS_HOST_LOCK != 0
 		ahc_unlock(ahc, &s);
+#else
+		spin_unlock_irqrestore(&io_request_lock, s);
 #endif
 		down_interruptible(&ahc->platform_data->dv_cmd_sem);
 		/*
@@ -3457,7 +3409,6 @@
 {
 	struct	ahc_softc *ahc;
 	struct	ahc_cmd *acmd;
-	struct	ahc_linux_device *next_dev;
 	struct	scb *scb;
 	u_long	flags;
 
@@ -3504,36 +3455,16 @@
 	ahc->platform_data->reset_timer.function =
 	    (ahc_linux_callback_t *)ahc_linux_release_simq;
 	add_timer(&ahc->platform_data->reset_timer);
-	/*
-	 * In 2.5.X, the "done lock" is the ahc_lock.
-	 * Instead of dropping and re-acquiring the same
-	 * lock in the 2.5.X case, just hold our ahc_lock
-	 * the whole time.  ahc_done_lock() has been
-	 * made a no-op for 2.5.X too.
-	 */
 	acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
 	TAILQ_INIT(&ahc->platform_data->completeq);
-	next_dev = ahc_linux_next_device_to_run(ahc);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahc_unlock(ahc, &flags);
-#endif
-	if (next_dev)
+	if (ahc_linux_next_device_to_run(ahc) != NULL)
 		ahc_schedule_runq(ahc);
 	if (acmd != NULL) {
 		acmd = ahc_linux_run_complete_queue(ahc, acmd);
-		if (acmd != NULL) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahc_lock(ahc, &flags);
-#endif
+		if (acmd != NULL)
 			ahc_schedule_completeq(ahc, acmd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahc_unlock(ahc, &flags);
-#endif
-		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	ahc_unlock(ahc, &flags);
-#endif
 }
 
 static void
@@ -3621,17 +3552,17 @@
 
 	tags = 0;
 	if ((ahc->user_discenable & devinfo->target_mask) != 0) {
-		if (warned_user == 0
-		 && ahc->unit >= NUM_ELEMENTS(aic7xxx_tag_info)) {
+		if (ahc->unit >= NUM_ELEMENTS(aic7xxx_tag_info)) {
+			if (warned_user == 0) {
 
-			printf("aic7xxx: WARNING, insufficient "
-			       "tag_info instances for installed "
-			       "controllers. Using defaults\n");
-			printf("aic7xxx: Please update the "
-			       "aic7xxx_tag_info array in the "
-			       "aic7xxx.c source file.\n");
+				printf(KERN_WARNING
+"aic7xxx: WARNING: Insufficient tag_info instances\n"
+"aic7xxx: for installed controllers. Using defaults\n"
+"aic7xxx: Please update the aic7xxx_tag_info array in\n"
+"aic7xxx: the aic7xxx_osm..c source file.\n");
+				warned_user++;
+			}
 			tags = AHC_MAX_QUEUE;
-			warned_user++;
 		} else {
 			adapter_tag_info_t *tag_info;
 
@@ -3650,17 +3581,17 @@
 	static int warned_user;
 	int dv;
 
-	if (warned_user == 0
-	 && ahc->unit >= NUM_ELEMENTS(aic7xxx_dv_settings)) {
+	if (ahc->unit >= NUM_ELEMENTS(aic7xxx_dv_settings)) {
+		if (warned_user == 0) {
 
-		printf("aic7xxx: WARNING, insufficient "
-		       "dv settings instances for installed "
-		       "controllers. Using defaults\n");
-		printf("aic7xxx: Please update the "
-		       "aic7xxx_dv_settings array in the "
-		       "aic7xxx.c source file.\n");
+			printf(KERN_WARNING
+"aic7xxx: WARNING: Insufficient dv settings instances\n"
+"aic7xxx: for installed controllers. Using defaults\n"
+"aic7xxx: Please update the aic7xxx_dv_settings array\n"
+"aic7xxx: in the aic7xxx_osm.c source file.\n");
+			warned_user++;
+		}
 		dv = -1;
-		warned_user++;
 	} else {
 
 		dv = aic7xxx_dv_settings[ahc->unit];
@@ -3938,41 +3869,20 @@
 	struct	ahc_softc *ahc;
 	struct	ahc_cmd *acmd;
 	u_long	flags;
-	struct	ahc_linux_device *next_dev;
 
 	ahc = (struct ahc_softc *) dev_id;
 	ahc_lock(ahc, &flags); 
 	ahc_intr(ahc);
 	acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
 	TAILQ_INIT(&ahc->platform_data->completeq);
-	next_dev = ahc_linux_next_device_to_run(ahc);
-	/*
-	 * In 2.5.X, the "done lock" is the ahc_lock.
-	 * Instead of dropping and re-acquiring the same
-	 * lock in the 2.5.X case, just hold our ahc_lock
-	 * the whole time.  ahc_done_lock() has been
-	 * made a no-op for 2.5.X too.
-	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	ahc_unlock(ahc, &flags);
-#endif
-	if (next_dev)
+	if (ahc_linux_next_device_to_run(ahc) != NULL)
 		ahc_schedule_runq(ahc);
 	if (acmd != NULL) {
 		acmd = ahc_linux_run_complete_queue(ahc, acmd);
-		if (acmd != NULL) {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahc_lock(ahc, &flags);
-#endif
+		if (acmd != NULL)
 			ahc_schedule_completeq(ahc, acmd);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-			ahc_unlock(ahc, &flags);
-#endif
-		}
 	}
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	ahc_unlock(ahc, &flags);
-#endif
 }
 
 void
@@ -3995,15 +3905,6 @@
 	target_offset = target;
 	if (channel != 0)
 		target_offset += 8;
-	/*
-	 * Never allow allocation of a target object for
-	 * our own SCSIID.
-	 */
-	if ((channel == 0 && target == ahc->our_id)
-	 || (channel == 1 && target == ahc->our_id_b)) {
-		ahc->platform_data->targets[target_offset] = NULL;
-		return (NULL);
-	}
 
 	targ = malloc(sizeof(*targ), M_DEVBUG, M_NOWAIT);
 	if (targ == NULL)
@@ -4274,6 +4175,14 @@
 #endif
 			ahc_set_transaction_status(scb, CAM_UNCOR_PARITY);
 		} else if (amount_xferred < scb->io_ctx->underflow) {
+			u_int i;
+
+			ahc_print_path(ahc, scb);
+			printf("CDB:");
+			for (i = 0; i < scb->io_ctx->cmd_len; i++)
+				printf(" 0x%x", scb->io_ctx->cmnd[i]);
+			printf("\n");
+			ahc_print_path(ahc, scb);
 			printf("Saw underflow (%ld of %ld bytes). "
 			       "Treated as error\n",
 				ahc_get_residual(scb),
@@ -4456,7 +4365,7 @@
 			}
 			ahc_set_transaction_status(scb, CAM_REQUEUE_REQ);
 			ahc_set_scsi_status(scb, SCSI_STATUS_OK);
-			ahc_set_tags(ahc, &devinfo,
+			ahc_platform_set_tags(ahc, &devinfo,
 				     (dev->flags & AHC_DEV_Q_BASIC)
 				   ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
 			break;
@@ -4467,7 +4376,7 @@
 		 */
 		dev->openings = 1;
 		ahc_set_scsi_status(scb, SCSI_STATUS_BUSY);
-		ahc_set_tags(ahc, &devinfo,
+		ahc_platform_set_tags(ahc, &devinfo,
 			     (dev->flags & AHC_DEV_Q_BASIC)
 			   ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
 		/* FALLTHROUGH */
@@ -4770,6 +4679,7 @@
 		ahc->platform_data->flags &= ~AHC_DV_WAIT_SIMQ_RELEASE;
 		up(&ahc->platform_data->dv_sem);
 	}
+	ahc_schedule_runq(ahc);
 	ahc_unlock(ahc, &s);
 	/*
 	 * There is still a race here.  The mid-layer
@@ -4779,8 +4689,6 @@
 	 */
 	if (unblock_reqs)
 		scsi_unblock_requests(ahc->platform_data->host);
-
-	ahc_schedule_runq(ahc);
 }
 
 static void
@@ -4815,6 +4723,7 @@
 	u_int  active_scb_index;
 	u_int  last_phase;
 	u_int  saved_scsiid;
+	u_int  cdb_byte;
 	int    retval;
 	int    paused;
 	int    wait;
@@ -4831,6 +4740,11 @@
 	       cmd->device->id, cmd->device->lun,
 	       flag == SCB_ABORT ? "n ABORT" : " TARGET RESET");
 
+	printf("CDB:");
+	for (cdb_byte = 0; cdb_byte < cmd->cmd_len; cdb_byte++)
+		printf(" 0x%x", cmd->cmnd[cdb_byte]);
+	printf("\n");
+
 	/*
 	 * In all versions of Linux, we have to work around
 	 * a major flaw in how the mid-layer is locked down
@@ -4845,9 +4759,6 @@
 	 * by acquiring either the io_request_lock or our own
 	 * lock, this *should* be safe.
 	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_unlock_irq(&io_request_lock);
-#endif
 	ahc_midlayer_entrypoint_lock(ahc, &s);
 
 	/*
@@ -5104,11 +5015,7 @@
 		int ret;
 
 		ahc->platform_data->flags |= AHC_UP_EH_SEMAPHORE;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-		ahc_unlock(ahc, &s);
-#else
-		spin_unlock_irq(ahc->platform_data->host->host_lock);
-#endif
+		spin_unlock_irq(&ahc->platform_data->spin_lock);
 		init_timer(&timer);
 		timer.data = (u_long)ahc;
 		timer.expires = jiffies + (5 * HZ);
@@ -5122,27 +5029,17 @@
 			printf("Timer Expired\n");
 			retval = FAILED;
 		}
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-		ahc_lock(ahc, &s);
-#else
-		spin_lock_irq(ahc->platform_data->host->host_lock);
-#endif
+		spin_lock_irq(&ahc->platform_data->spin_lock);
 	}
 	acmd = TAILQ_FIRST(&ahc->platform_data->completeq);
 	TAILQ_INIT(&ahc->platform_data->completeq);
-	ahc_midlayer_entrypoint_unlock(ahc, &s);
+	ahc_schedule_runq(ahc);
 	if (acmd != NULL) {
 		acmd = ahc_linux_run_complete_queue(ahc, acmd);
-		if (acmd != NULL) {
-			ahc_midlayer_entrypoint_lock(ahc, &s);
+		if (acmd != NULL)
 			ahc_schedule_completeq(ahc, acmd);
-			ahc_midlayer_entrypoint_unlock(ahc, &s);
-		}
 	}
-	ahc_schedule_runq(ahc);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	spin_lock_irq(&io_request_lock);
-#endif
+	ahc_midlayer_entrypoint_unlock(ahc, &s);
 	return (retval);
 }
 
@@ -5185,13 +5082,14 @@
 	}
 }
 
-static int __init ahc_linux_init(void)
+static int __init
+ahc_linux_init(void)
 {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 	return (ahc_linux_detect(&aic7xxx_driver_template) ? 0 : -ENODEV);
 #else
 	scsi_register_module(MODULE_SCSI_HA, &aic7xxx_driver_template);
-	if (!driver_template.present) {
+	if (aic7xxx_driver_template.present == 0) {
 		scsi_unregister_module(MODULE_SCSI_HA,
 				       &aic7xxx_driver_template);
 		return (-ENODEV);
@@ -5201,10 +5099,25 @@
 #endif
 }
 
-static void __exit ahc_linux_exit(void)
+static void __exit
+ahc_linux_exit(void)
 {
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-	struct	ahc_softc *ahc;
+	struct ahc_softc *ahc;
+	u_long l;
+
+	/*
+	 * Shutdown DV threads before going into the SCSI mid-layer.
+	 * This avoids situations where the mid-layer locks the entire
+	 * kernel so that waiting for our DV threads to exit leads
+	 * to deadlock.
+	 */
+	ahc_list_lock(&l);
+	TAILQ_FOREACH(ahc, &ahc_tailq, links) {
+
+		ahc_linux_kill_dv_thread(ahc);
+	}
+	ahc_list_unlock(&l);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 
 	ahc_linux_pci_exit();
 
@@ -5220,9 +5133,8 @@
 
 	/*
 	 * In 2.4 we have to unregister from the PCI core _after_
-	 * unregistering from the scsi midlayer to avoid danling references.
-	 *
-	 * The 2.4 scsi midlayer is so f***ed..
+	 * unregistering from the scsi midlayer to avoid dangling
+	 * references.
 	 */
 	ahc_linux_pci_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	Sat Apr 19 19:51:46 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h	Sat Apr 19 19:51:46 2003
@@ -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#123 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm.h#131 $
  *
  */
 #ifndef _AIC7XXX_LINUX_H_
@@ -299,7 +299,13 @@
 #include <linux/smp.h>
 #endif
 
-#define AIC7XXX_DRIVER_VERSION "6.2.28"
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) || defined(SCSI_HAS_HOST_LOCK))
+#define AHC_SCSI_HAS_HOST_LOCK 1
+#else
+#define AHC_SCSI_HAS_HOST_LOCK 0
+#endif
+
+#define AIC7XXX_DRIVER_VERSION "6.2.31"
 
 /**************************** Front End Queues ********************************/
 /*
@@ -703,7 +709,6 @@
 static __inline void
 ahc_lock(struct ahc_softc *ahc, unsigned long *flags)
 {
-	*flags = 0;
 	spin_lock_irqsave(&ahc->platform_data->spin_lock, *flags);
 }
 
@@ -717,10 +722,13 @@
 ahc_midlayer_entrypoint_lock(struct ahc_softc *ahc, unsigned long *flags)
 {
 	/*
-	 * In 2.5.X, the midlayer takes our lock just before
-	 * calling us, so avoid locking again.
+	 * In 2.5.X and some 2.4.X versions, the midlayer takes our
+	 * lock just before calling us, so we avoid locking again.
+	 * For other kernel versions, the io_request_lock is taken
+	 * just before our entry point is called.  In this case, we
+	 * trade the io_request_lock for our per-softc lock.
 	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if AHC_SCSI_HAS_HOST_LOCK == 0
 	ahc_lock(ahc, flags);
 #endif
 }
@@ -728,11 +736,7 @@
 static __inline void
 ahc_midlayer_entrypoint_unlock(struct ahc_softc *ahc, unsigned long *flags)
 {
-	/*
-	 * In 2.5.X, the midlayer takes our lock just before
-	 * calling us and unlocks when we return, so let it do the unlock.
-	 */
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if AHC_SCSI_HAS_HOST_LOCK == 0
 	ahc_unlock(ahc, flags);
 #endif
 }
@@ -750,8 +754,7 @@
 static __inline void
 ahc_done_lock(struct ahc_softc *ahc, unsigned long *flags)
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-	*flags = 0;
+#if AHC_SCSI_HAS_HOST_LOCK == 0
 	spin_lock_irqsave(&io_request_lock, *flags);
 #endif
 }
@@ -759,7 +762,7 @@
 static __inline void
 ahc_done_unlock(struct ahc_softc *ahc, unsigned long *flags)
 {
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#if AHC_SCSI_HAS_HOST_LOCK == 0
 	spin_unlock_irqrestore(&io_request_lock, *flags);
 #endif
 }
@@ -773,7 +776,6 @@
 static __inline void
 ahc_list_lock(unsigned long *flags)
 {
-	*flags = 0;
 	spin_lock_irqsave(&ahc_list_spinlock, *flags);
 }
 
@@ -793,7 +795,6 @@
 static __inline void
 ahc_lock(struct ahc_softc *ahc, unsigned long *flags)
 {
-	*flags = 0;
 	save_flags(*flags);
 	cli();
 }
@@ -832,7 +833,6 @@
 static __inline void
 ahc_list_lock(unsigned long *flags)
 {
-	*flags = 0;
 	save_flags(*flags);
 	cli();
 }
@@ -907,7 +907,7 @@
  */
 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2,1,92)
 #if defined(__sparc_v9__) || defined(__powerpc__)
-#error "PPC and Sparc platforms are only support under 2.1.92 and above"
+#error "PPC and Sparc platforms are only supported under 2.1.92 and above"
 #endif
 #include <linux/bios32.h>
 #endif
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	Sat Apr 19 19:51:30 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c	Sat Apr 19 19:51:30 2003
@@ -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#43 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c#44 $
  */
 
 #include "aic7xxx_osm.h"
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c
--- a/drivers/scsi/aic7xxx/aic7xxx_pci.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c	Sat Apr 19 19:51:28 2003
@@ -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#57 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#62 $
  *
  * $FreeBSD$
  */
@@ -696,8 +696,12 @@
 static void aic785X_cable_detect(struct ahc_softc *ahc, int *internal50_present,
 				 int *externalcable_present,
 				 int *eeprom_present);
-static void write_brdctl(struct ahc_softc *ahc, uint8_t value);
+static void    write_brdctl(struct ahc_softc *ahc, uint8_t value);
 static uint8_t read_brdctl(struct ahc_softc *ahc);
+static void ahc_pci_intr(struct ahc_softc *ahc);
+static int  ahc_pci_chip_init(struct ahc_softc *ahc);
+static int  ahc_pci_suspend(struct ahc_softc *ahc);
+static int  ahc_pci_resume(struct ahc_softc *ahc);
 
 static int
 ahc_9005_subdevinfo_valid(uint16_t device, uint16_t vendor,
@@ -748,10 +752,7 @@
 	device = ahc_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
 	subvendor = ahc_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
 	subdevice = ahc_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
-	full_id = ahc_compose_id(device,
-				 vendor,
-				 subdevice,
-				 subvendor);
+	full_id = ahc_compose_id(device, vendor, subdevice, subvendor);
 
 	/*
 	 * If the second function is not hooked up, ignore it.
@@ -854,6 +855,9 @@
 		return (error);
 
 	ahc->bus_intr = ahc_pci_intr;
+	ahc->bus_chip_init = ahc_pci_chip_init;
+	ahc->bus_suspend = ahc_pci_suspend;
+	ahc->bus_resume = ahc_pci_resume;
 
 	/* Remeber how the card was setup in case there is no SEEPROM */
 	if ((ahc_inb(ahc, HCNTRL) & POWRDN) == 0) {
@@ -993,6 +997,35 @@
 	if ((sxfrctl1 & STPWEN) != 0)
 		ahc->flags |= AHC_TERM_ENB_A;
 
+	/*
+	 * Save chip register configuration data for chip resets
+	 * that occur during runtime and resume events.
+	 */
+	ahc->bus_softc.pci_softc.devconfig =
+	    ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
+	ahc->bus_softc.pci_softc.command =
+	    ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
+	ahc->bus_softc.pci_softc.csize_lattime =
+	    ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1);
+	ahc->bus_softc.pci_softc.dscommand0 = ahc_inb(ahc, DSCOMMAND0);
+	ahc->bus_softc.pci_softc.dspcistatus = ahc_inb(ahc, DSPCISTATUS);
+	if ((ahc->features & AHC_DT) != 0) {
+		u_int sfunct;
+
+		sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
+		ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
+		ahc->bus_softc.pci_softc.optionmode = ahc_inb(ahc, OPTIONMODE);
+		ahc->bus_softc.pci_softc.targcrccnt = ahc_inw(ahc, TARGCRCCNT);
+		ahc_outb(ahc, SFUNCT, sfunct);
+		ahc->bus_softc.pci_softc.crccontrol1 =
+		    ahc_inb(ahc, CRCCONTROL1);
+	}
+	if ((ahc->features & AHC_MULTI_FUNC) != 0)
+		ahc->bus_softc.pci_softc.scbbaddr = ahc_inb(ahc, SCBBADDR);
+
+	if ((ahc->features & AHC_ULTRA2) != 0)
+		ahc->bus_softc.pci_softc.dff_thrsh = ahc_inb(ahc, DFF_THRSH);
+
 	/* Core initialization */
 	error = ahc_init(ahc);
 	if (error != 0)
@@ -1412,6 +1445,7 @@
 	}
 
 	if (have_autoterm) {
+		ahc->flags |= AHC_HAS_TERM_LOGIC;
 		ahc_acquire_seeprom(ahc, &sd);
 		configure_termination(ahc, &sd, sc->adapter_control, sxfrctl1);
 		ahc_release_seeprom(&sd);
@@ -1845,11 +1879,14 @@
 	spiocap |= EXT_BRDCTL;
 	ahc_outb(ahc, SPIOCAP, spiocap);
 	ahc_outb(ahc, BRDCTL, BRDRW|BRDCS);
+	ahc_flush_device_writes(ahc);
+	ahc_delay(500);
 	ahc_outb(ahc, BRDCTL, 0);
+	ahc_flush_device_writes(ahc);
+	ahc_delay(500);
 	brdctl = ahc_inb(ahc, BRDCTL);
 	*internal50_present = (brdctl & BRDDAT5) ? 0 : 1;
 	*externalcable_present = (brdctl & BRDDAT6) ? 0 : 1;
-
 	*eeprom_present = (ahc_inb(ahc, SPIOCAP) & EEPROM) ? 1 : 0;
 }
 	
@@ -1943,7 +1980,7 @@
 	return (value);
 }
 
-void
+static void
 ahc_pci_intr(struct ahc_softc *ahc)
 {
 	u_int error;
@@ -1996,6 +2033,73 @@
 }
 
 static int
+ahc_pci_chip_init(struct ahc_softc *ahc)
+{
+	ahc_outb(ahc, DSCOMMAND0, ahc->bus_softc.pci_softc.dscommand0);
+	ahc_outb(ahc, DSPCISTATUS, ahc->bus_softc.pci_softc.dspcistatus);
+	if ((ahc->features & AHC_DT) != 0) {
+		u_int sfunct;
+
+		sfunct = ahc_inb(ahc, SFUNCT) & ~ALT_MODE;
+		ahc_outb(ahc, SFUNCT, sfunct | ALT_MODE);
+		ahc_outb(ahc, OPTIONMODE, ahc->bus_softc.pci_softc.optionmode);
+		ahc_outw(ahc, TARGCRCCNT, ahc->bus_softc.pci_softc.targcrccnt);
+		ahc_outb(ahc, SFUNCT, sfunct);
+		ahc_outb(ahc, CRCCONTROL1,
+			 ahc->bus_softc.pci_softc.crccontrol1);
+	}
+	if ((ahc->features & AHC_MULTI_FUNC) != 0)
+		ahc_outb(ahc, SCBBADDR, ahc->bus_softc.pci_softc.scbbaddr);
+
+	if ((ahc->features & AHC_ULTRA2) != 0)
+		ahc_outb(ahc, DFF_THRSH, ahc->bus_softc.pci_softc.dff_thrsh);
+
+	return (ahc_chip_init(ahc));
+}
+
+static int
+ahc_pci_suspend(struct ahc_softc *ahc)
+{
+	return (ahc_suspend(ahc));
+}
+
+static int
+ahc_pci_resume(struct ahc_softc *ahc)
+{
+
+	ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
+
+	/*
+	 * We assume that the OS has restored our register
+	 * mappings, etc.  Just update the config space registers
+	 * that the OS doesn't know about and rely on our chip
+	 * reset handler to handle the rest.
+	 */
+	ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4,
+			     ahc->bus_softc.pci_softc.devconfig);
+	ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1,
+			     ahc->bus_softc.pci_softc.command);
+	ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1,
+			     ahc->bus_softc.pci_softc.csize_lattime);
+	if ((ahc->flags & AHC_HAS_TERM_LOGIC) != 0) {
+		struct	seeprom_descriptor sd;
+		u_int	sxfrctl1;
+
+		sd.sd_ahc = ahc;
+		sd.sd_control_offset = SEECTL;		
+		sd.sd_status_offset = SEECTL;		
+		sd.sd_dataout_offset = SEECTL;		
+
+		ahc_acquire_seeprom(ahc, &sd);
+		configure_termination(ahc, &sd,
+				      ahc->seep_config->adapter_control,
+				      &sxfrctl1);
+		ahc_release_seeprom(&sd);
+	}
+	return (ahc_resume(ahc));
+}
+
+static int
 ahc_aic785X_setup(struct ahc_softc *ahc)
 {
 	ahc_dev_softc_t pci;
@@ -2009,6 +2113,7 @@
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev >= 1)
 		ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
+	ahc->instruction_ram_size = 512;
 	return (0);
 }
 
@@ -2026,6 +2131,7 @@
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev >= 1)
 		ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
+	ahc->instruction_ram_size = 512;
 	return (0);
 }
 
@@ -2049,6 +2155,7 @@
 	ahc->chip = AHC_AIC7870;
 	ahc->features = AHC_AIC7870_FE;
 	ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
+	ahc->instruction_ram_size = 512;
 	return (0);
 }
 
@@ -2102,6 +2209,7 @@
 	} else {
 		ahc->bugs |= AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
 	}
+	ahc->instruction_ram_size = 512;
 	return (0);
 }
 
@@ -2149,6 +2257,7 @@
 	rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
 	if (rev == 0)
 		ahc->bugs |= AHC_AUTOFLUSH_BUG|AHC_CACHETHEN_BUG;
+	ahc->instruction_ram_size = 768;
 	return (0);
 }
 
@@ -2161,6 +2270,7 @@
 	ahc->features = AHC_AIC7892_FE;
 	ahc->flags |= AHC_NEWEEPROM_FMT;
 	ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
+	ahc->instruction_ram_size = 1024;
 	return (0);
 }
 
@@ -2216,6 +2326,7 @@
 	ahc_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
 #endif
 	ahc->flags |= AHC_NEWEEPROM_FMT;
+	ahc->instruction_ram_size = 512;
 	return (0);
 }
 
@@ -2230,6 +2341,7 @@
 	ahc->features = AHC_AIC7896_FE;
 	ahc->flags |= AHC_NEWEEPROM_FMT;
 	ahc->bugs |= AHC_CACHETHEN_DIS_BUG;
+	ahc->instruction_ram_size = 768;
 	return (0);
 }
 
@@ -2244,6 +2356,7 @@
 	ahc->features = AHC_AIC7899_FE;
 	ahc->flags |= AHC_NEWEEPROM_FMT;
 	ahc->bugs |= AHC_SCBCHAN_UPLOAD_BUG;
+	ahc->instruction_ram_size = 1024;
 	return (0);
 }
 
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c
--- a/drivers/scsi/aic7xxx/aic7xxx_proc.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c	Sat Apr 19 19:51:27 2003
@@ -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#23 $
+ * $Id: //depot/aic7xxx/linux/drivers/scsi/aic7xxx/aic7xxx_proc.c#24 $
  */
 #include "aic7xxx_osm.h"
 #include "aic7xxx_inline.h"
@@ -325,6 +325,7 @@
 
 	copy_info(&info, "Adaptec AIC7xxx driver version: %s\n",
 		  AIC7XXX_DRIVER_VERSION);
+	copy_info(&info, "%s\n", ahc->description);
 	ahc_controller_info(ahc, ahc_info);
 	copy_info(&info, "%s\n\n", ahc_info);
 
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped b/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped
--- a/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_reg.h_shipped	Sat Apr 19 19:51:49 2003
@@ -3,7 +3,7 @@
  *		 from the following source files:
  *
  * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#54 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#38 $
  */
 typedef int (ahc_reg_print_t)(u_int, u_int *, u_int);
 typedef struct ahc_reg_parse_entry {
@@ -1776,7 +1776,7 @@
 #define	SEQ_MAILBOX_SHIFT	0x00
 #define	TARGET_DATA_IN	0x01
 #define	HOST_MSG	0xff
-#define	MAX_OFFSET	0xff
+#define	MAX_OFFSET	0x7f
 #define	BUS_16_BIT	0x01
 #define	SCB_UPLOAD_SIZE	0x20
 #define	STACK_SIZE	0x04
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	Sat Apr 19 19:51:48 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_reg_print.c_shipped	Sat Apr 19 19:51:48 2003
@@ -3,7 +3,7 @@
  *		 from the following source files:
  *
  * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#54 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#38 $
  */
 
 #include "aic7xxx_osm.h"
diff -Nru a/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped b/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped
--- a/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped	Sat Apr 19 19:51:51 2003
+++ b/drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped	Sat Apr 19 19:51:51 2003
@@ -3,7 +3,7 @@
  *		 from the following source files:
  *
  * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.seq#54 $
- * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#37 $
+ * $Id: //depot/aic7xxx/aic7xxx/aic7xxx.reg#38 $
  */
 static uint8_t seqprog[] = {
 	0xb2, 0x00, 0x00, 0x08,
diff -Nru a/drivers/scsi/aic7xxx/aicasm/Makefile b/drivers/scsi/aic7xxx/aicasm/Makefile
--- a/drivers/scsi/aic7xxx/aicasm/Makefile	Sat Apr 19 19:51:50 2003
+++ b/drivers/scsi/aic7xxx/aicasm/Makefile	Sat Apr 19 19:51:50 2003
@@ -11,7 +11,7 @@
 
 SRCS=	${CSRCS} ${GENSRCS}
 LIBS=	-ldb
-CLEANFILES= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output)
+clean-files:= ${GENSRCS} ${GENHDRS} $(YSRCS:.y=.output) $(PROG)
 # Override default kernel CFLAGS.  This is a userland app.
 AICASM_CFLAGS:= -I/usr/include -I.
 YFLAGS= -d
@@ -46,7 +46,6 @@
 		echo "*** Install db development libraries";	\
 	 fi
 
-clean-files := $(CLEANFILES) $(PROG)
 clean:
 	rm -f $(clean-files)
 
diff -Nru a/drivers/scsi/aic7xxx/aiclib.c b/drivers/scsi/aic7xxx/aiclib.c
--- a/drivers/scsi/aic7xxx/aiclib.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/scsi/aic7xxx/aiclib.c	Sat Apr 19 19:51:48 2003
@@ -1333,3 +1333,81 @@
 	return (err_action);
 }
 
+char *
+aic_parse_brace_option(char *opt_name, char *opt_arg, char *end, int depth,
+		       aic_option_callback_t *callback, void *callback_arg)
+{
+	char	*tok_end;
+	char	*tok_end2;
+	int      i;
+	int      instance;
+	int	 targ;
+	int	 done;
+	char	 tok_list[] = {'.', ',', '{', '}', '\0'};
+
+	/* All options use a ':' name/arg separator */
+	if (*opt_arg != ':')
+		return (opt_arg);
+	opt_arg++;
+	instance = -1;
+	targ = -1;
+	done = FALSE;
+	/*
+	 * Restore separator that may be in
+	 * the middle of our option argument.
+	 */
+	tok_end = strchr(opt_arg, '\0');
+	if (tok_end < end)
+		*tok_end = ',';
+	while (!done) {
+		switch (*opt_arg) {
+		case '{':
+			if (instance == -1) {
+				instance = 0;
+			} else {
+				if (depth > 1) {
+					if (targ == -1)
+						targ = 0;
+				} else {
+					printf("Malformed Option %s\n",
+					       opt_name);
+					done = TRUE;
+				}
+			}
+			opt_arg++;
+			break;
+		case '}':
+			if (targ != -1)
+				targ = -1;
+			else if (instance != -1)
+				instance = -1;
+			opt_arg++;
+			break;
+		case ',':
+		case '.':
+			if (instance == -1)
+				done = TRUE;
+			else if (targ >= 0)
+				targ++;
+			else if (instance >= 0)
+				instance++;
+			opt_arg++;
+			break;
+		case '\0':
+			done = TRUE;
+			break;
+		default:
+			tok_end = end;
+			for (i = 0; tok_list[i]; i++) {
+				tok_end2 = strchr(opt_arg, tok_list[i]);
+				if ((tok_end2) && (tok_end2 < tok_end))
+					tok_end = tok_end2;
+			}
+			callback(callback_arg, instance, targ,
+				 simple_strtol(opt_arg, NULL, 0));
+			opt_arg = tok_end;
+			break;
+		}
+	}
+	return (opt_arg);
+}
diff -Nru a/drivers/scsi/aic7xxx/aiclib.h b/drivers/scsi/aic7xxx/aiclib.h
--- a/drivers/scsi/aic7xxx/aiclib.h	Sat Apr 19 19:51:28 2003
+++ b/drivers/scsi/aic7xxx/aiclib.h	Sat Apr 19 19:51:28 2003
@@ -870,6 +870,7 @@
 #define	aic_calc_speed			AIC_LIB_ENTRY(_calc_speed)
 #define	aic_inquiry_match		AIC_LIB_ENTRY(_inquiry_match)
 #define	aic_static_inquiry_match	AIC_LIB_ENTRY(_static_inquiry_match)
+#define	aic_parse_brace_option		AIC_LIB_ENTRY(_parse_brace_option)
 
 /******************************************************************************/
 
@@ -905,6 +906,10 @@
 int		aic_static_inquiry_match(caddr_t /*inqbuffer*/,
 					 caddr_t /*table_entry*/);
 
+typedef void aic_option_callback_t(void *, int, int, int32_t);
+char *		aic_parse_brace_option(char *opt_name, char *opt_arg,
+				       char *end, int depth,
+				       aic_option_callback_t *, void *);
 
 static __inline void	 scsi_extract_sense(struct scsi_sense_data *sense,
 					    int *error_code, int *sense_key,
diff -Nru a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
--- a/drivers/scsi/hosts.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/scsi/hosts.c	Sat Apr 19 19:51:28 2003
@@ -183,8 +183,10 @@
 {
 	if (shost->irq)
 		free_irq(shost->irq, NULL);
+#ifdef CONFIG_GENERIC_ISA_DMA
 	if (shost->dma_channel != 0xff)
 		free_dma(shost->dma_channel);
+#endif
 	if (shost->io_port && shost->n_io_port)
 		release_region(shost->io_port, shost->n_io_port);
 
@@ -383,6 +385,7 @@
 	scsi_assign_lock(shost, &shost->default_lock);
 	INIT_LIST_HEAD(&shost->my_devices);
 	INIT_LIST_HEAD(&shost->eh_cmd_q);
+	INIT_LIST_HEAD(&shost->starved_list);
 
 	init_waitqueue_head(&shost->host_wait);
 	shost->dma_channel = 0xff;
@@ -619,7 +622,6 @@
 
 	spin_lock_irqsave(shost->host_lock, flags);
 	shost->host_busy--;
-	sdev->device_busy--;
 	if (shost->in_recovery && shost->host_failed &&
 	    (shost->host_busy == shost->host_failed))
 	{
diff -Nru a/drivers/scsi/hosts.h b/drivers/scsi/hosts.h
--- a/drivers/scsi/hosts.h	Sat Apr 19 19:51:30 2003
+++ b/drivers/scsi/hosts.h	Sat Apr 19 19:51:30 2003
@@ -380,6 +380,7 @@
     struct scsi_host_cmd_pool *cmd_pool;
     spinlock_t            free_list_lock;
     struct list_head      free_list;   /* backup store of cmd structs */
+    struct list_head      starved_list;
 
     spinlock_t		  default_lock;
     spinlock_t		  *host_lock;
@@ -470,12 +471,6 @@
      */
     unsigned reverse_ordering:1;
 
-    /*
-     * Indicates that one or more devices on this host were starved, and
-     * when the device becomes less busy that we need to feed them.
-     */
-    unsigned some_device_starved:1;
-   
     /*
      * Host has rejected a command because it was busy.
      */
diff -Nru a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c
--- a/drivers/scsi/lasi700.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/scsi/lasi700.c	Sat Apr 19 19:51:28 2003
@@ -45,6 +45,7 @@
 #include <linux/version.h>
 #include <linux/config.h>
 #include <linux/ioport.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
diff -Nru a/drivers/scsi/osst.c b/drivers/scsi/osst.c
--- a/drivers/scsi/osst.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/osst.c	Sat Apr 19 19:51:47 2003
@@ -47,6 +47,7 @@
 #include <linux/vmalloc.h>
 #include <linux/version.h>
 #include <linux/blk.h>
+#include <linux/devfs_fs_kernel.h>
 #include <asm/uaccess.h>
 #include <asm/dma.h>
 #include <asm/system.h>
@@ -99,6 +100,8 @@
 };
 #endif
 
+static char *osst_formats[ST_NBR_MODES] ={"", "l", "m", "a"};
+
 /* Some default definitions have been moved to osst_options.h */
 #define OSST_BUFFER_SIZE (OSST_BUFFER_BLOCKS * ST_KILOBYTE)
 #define OSST_WRITE_THRESHOLD (OSST_WRITE_THRESHOLD_BLOCKS * ST_KILOBYTE)
@@ -5524,11 +5527,12 @@
 	write_unlock(&os_scsi_tapes_lock);
 
 	for (mode = 0; mode < ST_NBR_MODES; ++mode) {
-		char name[8];
-		static char *formats[ST_NBR_MODES] ={"", "l", "m", "a"};
-		
+		char name[8], devfs_name[64];
+
 		/*  Rewind entry  */
-		sprintf (name, "ot%s", formats[mode]);
+		sprintf(name, "ot%s", osst_formats[mode]);
+		sprintf(devfs_name, "%s/ot%s", SDp->devfs_name, osst_formats[mode]);
+
 		sprintf(tpnt->driverfs_dev_r[mode].bus_id, "%s:%s", 
 				SDp->sdev_driverfs_dev.bus_id, name);
 		sprintf(tpnt->driverfs_dev_r[mode].name, "%s%s", 
@@ -5541,13 +5545,14 @@
 		device_create_file(&tpnt->driverfs_dev_r[mode], 
 				&dev_attr_type);
 		device_create_file(&tpnt->driverfs_dev_r[mode], &dev_attr_kdev);
-		tpnt->de_r[mode] =
-			devfs_register (SDp->de, name, DEVFS_FL_DEFAULT,
+		devfs_register(NULL, devfs_name, 0,
 					OSST_MAJOR, dev_num + (mode << 5),
 					S_IFCHR | S_IRUGO | S_IWUGO,
 					&osst_fops, NULL);
 		/*  No-rewind entry  */
-		sprintf (name, "ot%sn", formats[mode]);
+		sprintf (name, "ot%sn", osst_formats[mode]);
+		sprintf(devfs_name, "%s/ot%sn", SDp->devfs_name, osst_formats[mode]);
+
 		sprintf(tpnt->driverfs_dev_n[mode].bus_id, "%s:%s", 
 				SDp->sdev_driverfs_dev.bus_id, name);
 		sprintf(tpnt->driverfs_dev_n[mode].name, "%s%s", 
@@ -5561,13 +5566,12 @@
 				&dev_attr_type);
 		device_create_file(&tpnt->driverfs_dev_n[mode], 
 				&dev_attr_kdev);
-		tpnt->de_n[mode] =
-			devfs_register (SDp->de, name, DEVFS_FL_DEFAULT,
+		devfs_register(NULL, devfs_name, 0,
 					OSST_MAJOR, dev_num + (mode << 5) + 128,
 					S_IFCHR | S_IRUGO | S_IWUGO,
 					&osst_fops, NULL);
 	}
-	drive->number = devfs_register_tape (SDp->de);
+	drive->number = devfs_register_tape(SDp->devfs_name);
 
 	printk(KERN_INFO
 		"osst :I: Attached OnStream %.5s tape at scsi%d, channel %d, id %d, lun %d as %s\n",
@@ -5595,10 +5599,8 @@
 	if((tpnt = os_scsi_tapes[i]) && (tpnt->device == SDp)) {
 		tpnt->device = NULL;
 		for (mode = 0; mode < ST_NBR_MODES; ++mode) {
-			devfs_unregister (tpnt->de_r[mode]);
-			tpnt->de_r[mode] = NULL;
-			devfs_unregister (tpnt->de_n[mode]);
-			tpnt->de_n[mode] = NULL;
+			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);
diff -Nru a/drivers/scsi/osst.h b/drivers/scsi/osst.h
--- a/drivers/scsi/osst.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/osst.h	Sat Apr 19 19:51:49 2003
@@ -5,9 +5,7 @@
 #include <asm/byteorder.h>
 #include <linux/config.h>
 #include <linux/completion.h>
-#ifdef CONFIG_DEVFS_FS
-#include <linux/devfs_fs_kernel.h>
-#endif
+
 
 /*	FIXME - rename and use the following two types or delete them!
  *              and the types really should go to st.h anyway...
@@ -557,8 +555,6 @@
   /* Mode characteristics */
   ST_mode modes[ST_NBR_MODES];
   int current_mode;
-  devfs_handle_t de_r[ST_NBR_MODES];  /*  Rewind entries     */
-  devfs_handle_t de_n[ST_NBR_MODES];  /*  No-rewind entries  */
   struct device driverfs_dev_r[ST_NBR_MODES];
   struct device driverfs_dev_n[ST_NBR_MODES];
 
diff -Nru a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
--- a/drivers/scsi/scsi.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/scsi.c	Sat Apr 19 19:51:47 2003
@@ -447,8 +447,6 @@
 
 	host = SCpnt->device->host;
 
-	ASSERT_LOCK(host->host_lock, 0);
-
 	/* Assign a unique nonzero serial_number. */
 	if (++serial_number == 0)
 		serial_number = 1;
@@ -574,8 +572,6 @@
 {
 	struct Scsi_Host *host = SCpnt->device->host;
 
-	ASSERT_LOCK(host->host_lock, 0);
-
 	SCpnt->owner = SCSI_OWNER_MIDLEVEL;
 	SRpnt->sr_command = SCpnt;
 
@@ -819,12 +815,11 @@
 	struct Scsi_Host *host;
 	Scsi_Device *device;
 	Scsi_Request * SRpnt;
+	unsigned long flags;
 
 	host = SCpnt->device->host;
 	device = SCpnt->device;
 
-	ASSERT_LOCK(host->host_lock, 0);
-
         /*
          * We need to protect the decrement, as otherwise a race condition
          * would exist.  Fiddling with SCpnt isn't a problem as the
@@ -833,6 +828,9 @@
          * shared.
          */
 	scsi_host_busy_dec_and_test(host, device);
+	spin_lock_irqsave(SCpnt->device->request_queue->queue_lock, flags);
+	SCpnt->device->device_busy--;
+	spin_unlock_irqrestore(SCpnt->device->request_queue->queue_lock, flags);
 
         /*
          * Clear the flags which say that the device/host is no longer
diff -Nru a/drivers/scsi/scsi.h b/drivers/scsi/scsi.h
--- a/drivers/scsi/scsi.h	Sat Apr 19 19:51:29 2003
+++ b/drivers/scsi/scsi.h	Sat Apr 19 19:51:29 2003
@@ -16,7 +16,6 @@
 #define _SCSI_H
 
 #include <linux/config.h>	    /* for CONFIG_SCSI_LOGGING */
-#include <linux/devfs_fs_kernel.h>  /* some morons don't know struct pointers */
 #include <scsi/scsi.h>
 
 
@@ -417,7 +416,8 @@
 extern void scsi_io_completion(Scsi_Cmnd * SCpnt, int good_sectors,
 			       int block_sectors);
 extern int scsi_queue_insert(struct scsi_cmnd *cmd, int reason);
-extern request_queue_t *scsi_alloc_queue(struct Scsi_Host *shost);
+extern void scsi_queue_next_request(request_queue_t *q, struct scsi_cmnd *cmd);
+extern request_queue_t *scsi_alloc_queue(struct scsi_device *sdev);
 extern void scsi_free_queue(request_queue_t *q);
 extern int scsi_init_queue(void);
 extern void scsi_exit_queue(void);
@@ -531,6 +531,16 @@
 extern int scsi_dev_info_list_add_str(char *);
 
 /*
+ * scsi_target: representation of a scsi target, for now, this is only
+ * used for single_lun devices. If no one has active IO to the target,
+ * starget_sdev_user is NULL, else it points to the active sdev.
+ */
+struct scsi_target {
+	struct scsi_device *starget_sdev_user;
+	unsigned int starget_refcnt;
+};
+
+/*
  *  The scsi_device struct contains what we know about each given scsi
  *  device.
  *
@@ -554,8 +564,10 @@
 	struct Scsi_Host *host;
 	request_queue_t *request_queue;
 	volatile unsigned short device_busy;	/* commands actually active on low-level */
+	spinlock_t sdev_lock;           /* also the request queue_lock */
 	spinlock_t list_lock;
 	struct list_head cmd_list;	/* queue of in use SCSI Command structures */
+	struct list_head starved_entry;
         Scsi_Cmnd *current_cmnd;	/* currently active command */
 	unsigned short queue_depth;	/* How deep of a queue we want */
 	unsigned short last_queue_full_depth; /* These two are used by */
@@ -575,7 +587,7 @@
 	int access_count;	/* Count of open channels/mounts */
 
 	void *hostdata;		/* available to low-level driver */
-	devfs_handle_t de;      /* directory for the device      */
+	char devfs_name[256];	/* devfs junk */
 	char type;
 	char scsi_level;
 	unsigned char inquiry_len;	/* valid bytes in 'inquiry' */
@@ -586,6 +598,7 @@
 	unsigned char current_tag;	/* current tag */
 //	unsigned char sync_min_period;	/* Not less than this period */
 //	unsigned char sync_max_offset;	/* Not greater than this offset */
+	struct scsi_target      *sdev_target;   /* used only for single_lun */
 
 	unsigned online:1;
 	unsigned writeable:1;
@@ -616,8 +629,6 @@
 					 * because we did a bus reset. */
 	unsigned ten:1;		/* support ten byte read / write */
 	unsigned remap:1;	/* support remapping  */
-	unsigned starved:1;	/* unable to process commands because
-				   host busy */
 //	unsigned sync:1;	/* Sync transfer state, managed by host */
 //	unsigned wide:1;	/* WIDE transfer state, managed by host */
 
diff -Nru a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
--- a/drivers/scsi/scsi_error.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/scsi/scsi_error.c	Sat Apr 19 19:51:27 2003
@@ -431,8 +431,6 @@
 	unsigned long flags;
 	int rtn = SUCCESS;
 
-	ASSERT_LOCK(host->host_lock, 0);
-
 	/*
 	 * we will use a queued command if possible, otherwise we will
 	 * emulate the queuing and calling of completion function ourselves.
@@ -1405,8 +1403,6 @@
 	struct scsi_device *sdev;
 	unsigned long flags;
 
-	ASSERT_LOCK(shost->host_lock, 0);
-
 	/*
 	 * If the door was locked, we need to insert a door lock request
 	 * onto the head of the SCSI request queue for the device.  There
@@ -1434,18 +1430,11 @@
 	 * now that error recovery is done, we will need to ensure that these
 	 * requests are started.
 	 */
-	spin_lock_irqsave(shost->host_lock, flags);
 	list_for_each_entry(sdev, &shost->my_devices, siblings) {
-		if ((shost->can_queue > 0 &&
-		     (shost->host_busy >= shost->can_queue))
-		    || (shost->host_blocked)
-		    || (shost->host_self_blocked)) {
-			break;
-		}
-
+		spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
 		__blk_run_queue(sdev->request_queue);
+		spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
 	}
-	spin_unlock_irqrestore(shost->host_lock, flags);
 }
 
 /**
@@ -1681,6 +1670,7 @@
 	struct scsi_cmnd *scmd = scsi_get_command(dev, GFP_KERNEL);
 	struct request req;
 	int rtn;
+	struct request_queue *q;
 
 	scmd->request = &req;
 	memset(&scmd->eh_timeout, 0, sizeof(scmd->eh_timeout));
@@ -1735,6 +1725,8 @@
 	}
 
 	scsi_delete_timer(scmd);
+	q = scmd->device->request_queue;
 	scsi_put_command(scmd);
+	scsi_queue_next_request(q, NULL);
 	return rtn;
 }
diff -Nru a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
--- a/drivers/scsi/scsi_lib.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/scsi_lib.c	Sat Apr 19 19:51:47 2003
@@ -92,6 +92,7 @@
 {
 	struct Scsi_Host *host = cmd->device->host;
 	struct scsi_device *device = cmd->device;
+	unsigned long flags;
 
 	SCSI_LOG_MLQUEUE(1,
 		 printk("Inserting command %p into mlqueue\n", cmd));
@@ -130,6 +131,9 @@
 	 * Decrement the counters, since these commands are no longer
 	 * active on the host/device.
 	 */
+	spin_lock_irqsave(device->request_queue->queue_lock, flags);
+	device->device_busy--;
+	spin_unlock_irqrestore(device->request_queue->queue_lock, flags);
 	scsi_host_busy_dec_and_test(host, device);
 
 	/*
@@ -174,14 +178,18 @@
 		 void (*done)(struct scsi_cmnd *),
 		 int timeout, int retries)
 {
+	struct request_queue *q;
+
 	/*
 	 * If the upper level driver is reusing these things, then
 	 * we should release the low-level block now.  Another one will
 	 * be allocated later when this request is getting queued.
 	 */
 	if (sreq->sr_command) {
+		q = sreq->sr_command->device->request_queue;
 		scsi_put_command(sreq->sr_command);
 		sreq->sr_command = NULL;
+		scsi_queue_next_request(q, NULL);
 	}
 
 	/*
@@ -228,6 +236,7 @@
 void scsi_wait_req(struct scsi_request *sreq, const void *cmnd, void *buffer,
 		   unsigned bufflen, int timeout, int retries)
 {
+	struct request_queue *q;
 	DECLARE_COMPLETION(wait);
 	
 	sreq->sr_request->waiting = &wait;
@@ -239,7 +248,9 @@
 	sreq->sr_request->waiting = NULL;
 
 	if (sreq->sr_command) {
+		q = sreq->sr_command->device->request_queue;
 		scsi_put_command(sreq->sr_command);
+		scsi_queue_next_request(q, NULL);
 		sreq->sr_command = NULL;
 	}
 }
@@ -316,6 +327,53 @@
 }
 
 /*
+ * Called for single_lun devices on IO completion. Clear starget_sdev_user,
+ * and call __blk_run_queue for all the scsi_devices on the target -
+ * including current_sdev first.
+ *
+ * Called with *no* scsi locks held.
+ */
+static void scsi_single_lun_run(struct scsi_device *current_sdev)
+{
+	struct scsi_device *sdev;
+	unsigned long flags, flags2;
+
+	spin_lock_irqsave(current_sdev->host->host_lock, flags);
+	WARN_ON(!current_sdev->sdev_target->starget_sdev_user);
+	current_sdev->sdev_target->starget_sdev_user = NULL;
+	spin_unlock_irqrestore(current_sdev->host->host_lock, flags);
+
+	/*
+	 * Call __blk_run_queue for all LUNs on the target, starting with
+	 * current_sdev. We race with others (to set starget_sdev_user),
+	 * but in most cases, we will be first. Ideally, each LU on the
+	 * target would get some limited time or requests on the target.
+	 */
+	spin_lock_irqsave(current_sdev->request_queue->queue_lock, flags2);
+	__blk_run_queue(current_sdev->request_queue);
+	spin_unlock_irqrestore(current_sdev->request_queue->queue_lock, flags2);
+
+	spin_lock_irqsave(current_sdev->host->host_lock, flags);
+	if (current_sdev->sdev_target->starget_sdev_user) {
+		/*
+		 * After unlock, this races with anyone clearing
+		 * starget_sdev_user, but we (should) always enter this
+		 * function again, avoiding any problems.
+		 */
+		spin_unlock_irqrestore(current_sdev->host->host_lock, flags);
+		return;
+	}
+	spin_unlock_irqrestore(current_sdev->host->host_lock, flags);
+
+	list_for_each_entry(sdev, &current_sdev->same_target_siblings,
+			    same_target_siblings) {
+		spin_lock_irqsave(sdev->request_queue->queue_lock, flags2);
+		__blk_run_queue(sdev->request_queue);
+		spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags2);
+	}
+}
+
+/*
  * Function:    scsi_queue_next_request()
  *
  * Purpose:     Handle post-processing of completed commands.
@@ -351,16 +409,12 @@
  *		permutations grows as 2**N, and if too many more special cases
  *		get added, we start to get screwed.
  */
-static void scsi_queue_next_request(request_queue_t *q, struct scsi_cmnd *cmd)
+void scsi_queue_next_request(request_queue_t *q, struct scsi_cmnd *cmd)
 {
-	struct scsi_device *sdev, *sdev2;
+	struct scsi_device *sdev;
 	struct Scsi_Host *shost;
 	unsigned long flags;
-	int all_clear;
 
-	ASSERT_LOCK(q->queue_lock, 0);
-
-	spin_lock_irqsave(q->queue_lock, flags);
 	if (cmd != NULL) {
 
 		/*
@@ -369,6 +423,7 @@
 		 * in which case we need to request the blocks that come after
 		 * the bad sector.
 		 */
+		spin_lock_irqsave(q->queue_lock, flags);
 		cmd->request->special = cmd;
 		if (blk_rq_tagged(cmd->request))
 			blk_queue_end_tag(q, cmd->request);
@@ -381,62 +436,52 @@
 		cmd->request->flags |= REQ_SPECIAL;
 		cmd->request->flags &= ~REQ_DONTPREP;
 		__elv_add_request(q, cmd->request, 0, 0);
+		spin_unlock_irqrestore(q->queue_lock, flags);
 	}
 
-	/*
-	 * Just hit the requeue function for the queue.
-	 */
-	__blk_run_queue(q);
-
 	sdev = q->queuedata;
-	shost = sdev->host;
 
-	/*
-	 * If this is a single-lun device, and we are currently finished
-	 * with this device, then see if we need to get another device
-	 * started.  FIXME(eric) - if this function gets too cluttered
-	 * with special case code, then spin off separate versions and
-	 * use function pointers to pick the right one.
-	 */
-	if (sdev->single_lun && sdev->device_busy == 0 &&
-	    !shost->host_blocked && !shost->host_self_blocked &&
-	    !((shost->can_queue > 0) && (shost->host_busy >= shost->can_queue))
-	    && elv_queue_empty(q)) {
-		list_for_each_entry(sdev2, &sdev->same_target_siblings,
-			       same_target_siblings) {
-			if (!sdev2->device_blocked &&
-			    !elv_queue_empty(sdev2->request_queue)) {
-				__blk_run_queue(sdev2->request_queue);
-				break;
-			}
-		}
-	}
+	if (sdev->single_lun)
+		scsi_single_lun_run(sdev);
 
-	/*
-	 * Now see whether there are other devices on the bus which
-	 * might be starved.  If so, hit the request function.  If we
-	 * don't find any, then it is safe to reset the flag.  If we
-	 * find any device that it is starved, it isn't safe to reset the
-	 * flag as the queue function releases the lock and thus some
-	 * other device might have become starved along the way.
-	 */
-	all_clear = 1;
-	if (shost->some_device_starved) {
-		list_for_each_entry(sdev, &shost->my_devices, siblings) {
-			if (shost->can_queue > 0 &&
-			    shost->host_busy >= shost->can_queue)
-				break;
-			if (shost->host_blocked || shost->host_self_blocked)
-				break;
-			if (sdev->device_blocked || !sdev->starved)
-				continue;
-			__blk_run_queue(sdev->request_queue);
-			all_clear = 0;
-		}
+	shost = sdev->host;
+	spin_lock_irqsave(shost->host_lock, flags);
+	while (!list_empty(&shost->starved_list) &&
+	       !shost->host_blocked && !shost->host_self_blocked &&
+		!((shost->can_queue > 0) &&
+		  (shost->host_busy >= shost->can_queue))) {
+		/*
+		 * As long as shost is accepting commands and we have
+		 * starved queues, call __blk_run_queue. scsi_request_fn
+		 * drops the queue_lock and can add us back to the
+		 * starved_list.
+		 *
+		 * host_lock protects the starved_list and starved_entry.
+		 * scsi_request_fn must get the host_lock before checking
+		 * or modifying starved_list or starved_entry.
+		 */
+		sdev = list_entry(shost->starved_list.next,
+					  struct scsi_device, starved_entry);
+		list_del_init(&sdev->starved_entry);
+		spin_unlock_irqrestore(shost->host_lock, flags);
+
+		spin_lock_irqsave(sdev->request_queue->queue_lock, flags);
+		__blk_run_queue(sdev->request_queue);
+		spin_unlock_irqrestore(sdev->request_queue->queue_lock, flags);
 
-		if (sdev == NULL && all_clear)
-			shost->some_device_starved = 0;
+		spin_lock_irqsave(shost->host_lock, flags);
+		if (unlikely(!list_empty(&sdev->starved_entry)))
+			/*
+			 * sdev lost a race, and was put back on the
+			 * starved list. This is unlikely but without this
+			 * in theory we could loop forever.
+			 */
+			break;
 	}
+	spin_unlock_irqrestore(shost->host_lock, flags);
+
+	spin_lock_irqsave(q->queue_lock, flags);
+	__blk_run_queue(q);
 	spin_unlock_irqrestore(q->queue_lock, flags);
 }
 
@@ -470,8 +515,6 @@
 	struct request *req = cmd->request;
 	unsigned long flags;
 
-	ASSERT_LOCK(q->queue_lock, 0);
-
 	/*
 	 * If there are blocks left over at the end, set up the command
 	 * to queue the remainder of them.
@@ -569,8 +612,6 @@
 {
 	struct request *req = cmd->request;
 
-	ASSERT_LOCK(cmd->device->host->host_lock, 0);
-
 	/*
 	 * Free up any indirection buffers we allocated for DMA purposes. 
 	 */
@@ -651,8 +692,6 @@
 	 *	would be used if we just wanted to retry, for example.
 	 *
 	 */
-	ASSERT_LOCK(q->queue_lock, 0);
-
 	/*
 	 * Free up any indirection buffers we allocated for DMA purposes. 
 	 * For the case of a READ, we need to copy the data out of the
@@ -923,22 +962,6 @@
 	return BLKPREP_KILL;
 }
 
-/*
- * The target associated with myself can only handle one active command at
- * a time. Scan through all of the luns on the same target as myself,
- * return 1 if any are active.
- */
-static int check_all_luns(struct scsi_device *myself)
-{
-	struct scsi_device *sdev;
-
-	list_for_each_entry(sdev, &myself->same_target_siblings,
-			    same_target_siblings)
-		if (sdev->device_busy)
-			return 1;
-	return 0;
-}
-
 static int scsi_prep_fn(struct request_queue *q, struct request *req)
 {
 	struct Scsi_Device_Template *sdt;
@@ -961,7 +984,7 @@
 		if (sreq->sr_magic == SCSI_REQ_MAGIC) {
 			cmd = scsi_get_command(sreq->sr_device, GFP_ATOMIC);
 			if (unlikely(!cmd))
-				return BLKPREP_DEFER;
+				goto defer;
 			scsi_init_cmd_from_req(cmd, sreq);
 		} else
 			cmd = req->special;
@@ -972,7 +995,7 @@
 		if (!req->special) {
 			cmd = scsi_get_command(sdev, GFP_ATOMIC);
 			if (unlikely(!cmd))
-				return BLKPREP_DEFER;
+				goto defer;
 		} else
 			cmd = req->special;
 		
@@ -1037,6 +1060,82 @@
 	 */
 	req->flags |= REQ_DONTPREP;
 	return BLKPREP_OK;
+
+ defer:
+	/* If we defer, the elv_next_request() returns NULL, but the
+	 * queue must be restarted, so we plug here if no returning
+	 * command will automatically do that. */
+	if (sdev->device_busy == 0)
+		blk_plug_device(q);
+	return BLKPREP_DEFER;
+}
+
+/*
+ * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else
+ * return 0.
+ *
+ * Called with the queue_lock held.
+ */
+static inline int scsi_dev_queue_ready(struct request_queue *q,
+				  struct scsi_device *sdev)
+{
+	if (sdev->device_busy >= sdev->queue_depth)
+		return 0;
+	if (sdev->device_busy == 0 && sdev->device_blocked) {
+		/*
+		 * unblock after device_blocked iterates to zero
+		 */
+		if (--sdev->device_blocked == 0) {
+			SCSI_LOG_MLQUEUE(3,
+				printk("scsi%d (%d:%d) unblocking device at"
+				       " zero depth\n", sdev->host->host_no,
+				       sdev->id, sdev->lun));
+		} else {
+			blk_plug_device(q);
+			return 0;
+		}
+	}
+	if (sdev->device_blocked)
+		return 0;
+
+	return 1;
+}
+
+/*
+ * scsi_host_queue_ready: if we can send requests to shost, return 1 else
+ * return 0. We must end up running the queue again whenever 0 is
+ * returned, else IO can hang.
+ *
+ * Called with host_lock held.
+ */
+static inline int scsi_host_queue_ready(struct request_queue *q,
+				   struct Scsi_Host *shost,
+				   struct scsi_device *sdev)
+{
+	if (shost->in_recovery)
+		return 0;
+	if (shost->host_busy == 0 && shost->host_blocked) {
+		/*
+		 * unblock after host_blocked iterates to zero
+		 */
+		if (--shost->host_blocked == 0) {
+			SCSI_LOG_MLQUEUE(3,
+				printk("scsi%d unblocking host at zero depth\n",
+					shost->host_no));
+		} else {
+			blk_plug_device(q);
+			return 0;
+		}
+	}
+	if (!list_empty(&sdev->starved_entry))
+		return 0;
+	if ((shost->can_queue > 0 && shost->host_busy >= shost->can_queue) ||
+	    shost->host_blocked || shost->host_self_blocked) {
+		list_add_tail(&sdev->starved_entry, &shost->starved_list);
+		return 0;
+	}
+
+	return 1;
 }
 
 /*
@@ -1056,92 +1155,53 @@
 	struct Scsi_Host *shost = sdev->host;
 	struct scsi_cmnd *cmd;
 	struct request *req;
-
-	ASSERT_LOCK(q->queue_lock, 1);
+	unsigned long flags;
 
 	/*
 	 * To start with, we keep looping until the queue is empty, or until
 	 * the host is no longer able to accept any more requests.
 	 */
 	for (;;) {
+		if (blk_queue_plugged(q))
+			goto completed;
+
 		/*
-		 * Check this again - each time we loop through we will have
-		 * released the lock and grabbed it again, so each time
-		 * we need to check to see if the queue is plugged or not.
+		 * get next queueable request.  We do this early to make sure
+		 * that the request is fully prepared even if we cannot 
+		 * accept it.
 		 */
-		if (shost->in_recovery || blk_queue_plugged(q))
-			return;
+		req = elv_next_request(q);
 
-		if (sdev->device_busy >= sdev->queue_depth)
-			break;
+		if (!req)
+			goto completed;
 
-		if (sdev->single_lun && check_all_luns(sdev))
-			break;
-
-		if (shost->host_busy == 0 && shost->host_blocked) {
-			/* unblock after host_blocked iterates to zero */
-			if (--shost->host_blocked == 0) {
-				SCSI_LOG_MLQUEUE(3,
-					printk("scsi%d unblocking host at zero depth\n",
-						shost->host_no));
-			} else {
-				blk_plug_device(q);
-				break;
-			}
-		}
-
-		if (sdev->device_busy == 0 && sdev->device_blocked) {
-			/* unblock after device_blocked iterates to zero */
-			if (--sdev->device_blocked == 0) {
-				SCSI_LOG_MLQUEUE(3,
-					printk("scsi%d (%d:%d) unblocking device at zero depth\n",
-						shost->host_no, sdev->id, sdev->lun));
-			} else {
-				blk_plug_device(q);
-				break;
-			}
-		}
+		if (!scsi_dev_queue_ready(q, sdev))
+			goto completed;
 
 		/*
-		 * If the device cannot accept another request, then quit.
+		 * Remove the request from the request list.
 		 */
-		if (sdev->device_blocked)
-			break;
-		if ((shost->can_queue > 0 && shost->host_busy >= shost->can_queue) ||
-		    shost->host_blocked || shost->host_self_blocked) {
-			/*
-			 * If we are unable to process any commands at all for
-			 * this device, then we consider it to be starved.
-			 * What this means is that there are no outstanding
-			 * commands for this device and hence we need a
-			 * little help getting it started again
-			 * once the host isn't quite so busy.
-			 */
-			if (sdev->device_busy == 0) {
-				sdev->starved = 1;
-				shost->some_device_starved = 1;
-			}
-			break;
-		} else
-			sdev->starved = 0;
+		if (!(blk_queue_tagged(q) && (blk_queue_start_tag(q, req) == 0)))
+			blkdev_dequeue_request(req);
 
-		/*
-		 * get next queueable request.  We do this early to make sure
-		 * that the request is fully prepared even if we cannot 
-		 * accept it.  If there is no request, we'll detect this
-		 * lower down.
-		 */
-		req = elv_next_request(q);
+		sdev->device_busy++;
+		spin_unlock_irq(q->queue_lock);
 
-		if (!req) {
-			/* If the device is busy, a returning I/O
-			 * will restart the queue.  Otherwise, we have
-			 * to plug the queue */
-			if(sdev->device_busy == 0)
-				blk_plug_device(q);
-			break;
+		spin_lock_irqsave(shost->host_lock, flags);
+		if (!scsi_host_queue_ready(q, shost, sdev))
+			goto host_lock_held;
+
+		if (sdev->single_lun) {
+			if (sdev->sdev_target->starget_sdev_user &&
+			    (sdev->sdev_target->starget_sdev_user != sdev))
+				goto host_lock_held;
+			else
+				sdev->sdev_target->starget_sdev_user = sdev;
 		}
 
+		shost->host_busy++;
+		spin_unlock_irqrestore(shost->host_lock, flags);
+
 		cmd = req->special;
 
 		/*
@@ -1151,25 +1211,6 @@
 		BUG_ON(!cmd);
 
 		/*
-		 * Finally, before we release the lock, we copy the
-		 * request to the command block, and remove the
-		 * request from the request list.  Note that we always
-		 * operate on the queue head - there is absolutely no
-		 * reason to search the list, because all of the
-		 * commands in this queue are for the same device.
-		 */
-		if (!(blk_queue_tagged(q) && (blk_queue_start_tag(q, req) == 0)))
-			blkdev_dequeue_request(req);
-	
-		/*
-		 * Now bump the usage count for both the host and the
-		 * device.
-		 */
-		shost->host_busy++;
-		sdev->device_busy++;
-		spin_unlock_irq(q->queue_lock);
-
-		/*
 		 * Finally, initialize any error handling parameters, and set up
 		 * the timers for timeouts.
 		 */
@@ -1186,6 +1227,24 @@
 		 */
 		spin_lock_irq(q->queue_lock);
 	}
+completed:
+	return;
+
+host_lock_held:
+	spin_unlock_irqrestore(shost->host_lock, flags);
+	/*
+	 * lock q, handle tag, requeue req, and decrement device_busy. We
+	 * must return with queue_lock held.
+	 *
+	 * Decrementing device_busy without checking it is OK, as all such
+	 * cases (host limits or settings) should run the queue at some
+	 * later time.
+	 */
+	spin_lock_irq(q->queue_lock);
+	if (blk_rq_tagged(req))
+		blk_queue_end_tag(q, req);
+	__elv_add_request(q, req, 0, 0);
+	sdev->device_busy--;
 }
 
 u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost)
@@ -1207,15 +1266,20 @@
 	return BLK_BOUNCE_HIGH;
 }
 
-request_queue_t *scsi_alloc_queue(struct Scsi_Host *shost)
+request_queue_t *scsi_alloc_queue(struct scsi_device *sdev)
 {
 	request_queue_t *q;
+	struct Scsi_Host *shost;
 
 	q = kmalloc(sizeof(*q), GFP_ATOMIC);
 	if (!q)
 		return NULL;
 	memset(q, 0, sizeof(*q));
 
+	/*
+	 * XXX move host code to scsi_register
+	 */
+	shost = sdev->host;
 	if (!shost->max_sectors) {
 		/*
 		 * Driver imposes no hard sector transfer limit.
@@ -1224,7 +1288,7 @@
 		shost->max_sectors = SCSI_DEFAULT_MAX_SECTORS;
 	}
 
-	blk_init_queue(q, scsi_request_fn, shost->host_lock);
+	blk_init_queue(q, scsi_request_fn, &sdev->sdev_lock);
 	blk_queue_prep_rq(q, scsi_prep_fn);
 
 	blk_queue_max_hw_segments(q, shost->sg_tablesize);
diff -Nru a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
--- a/drivers/scsi/scsi_scan.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/scsi/scsi_scan.c	Sat Apr 19 19:51:50 2003
@@ -387,7 +387,7 @@
  *     Scsi_Device pointer, or NULL on failure.
  **/
 static struct scsi_device *scsi_alloc_sdev(struct Scsi_Host *shost,
-	       	struct request_queue **q, uint channel, uint id, uint lun)
+	       	uint channel, uint id, uint lun)
 {
 	struct scsi_device *sdev, *device;
 
@@ -407,6 +407,7 @@
 	INIT_LIST_HEAD(&sdev->siblings);
 	INIT_LIST_HEAD(&sdev->same_target_siblings);
 	INIT_LIST_HEAD(&sdev->cmd_list);
+	INIT_LIST_HEAD(&sdev->starved_entry);
 	spin_lock_init(&sdev->list_lock);
 
 	/*
@@ -421,14 +422,10 @@
 	 */
 	sdev->borken = 1;
 
-	if (!q || *q == NULL) {
-		sdev->request_queue = scsi_alloc_queue(shost);
-		if (!sdev->request_queue)
-			goto out_free_dev;
-	} else {
-		sdev->request_queue = *q;
-		*q = NULL;
-	}
+	spin_lock_init(&sdev->sdev_lock);
+	sdev->request_queue = scsi_alloc_queue(sdev);
+	if (!sdev->request_queue)
+		goto out_free_dev;
 
 	sdev->request_queue->queuedata = sdev;
 	scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
@@ -468,10 +465,7 @@
 	return sdev;
 
 out_free_queue:
-	if (q && sdev->request_queue) {
-		*q = sdev->request_queue;
-		sdev->request_queue = NULL;
-	} else if (sdev->request_queue)
+	if (sdev->request_queue)
 		scsi_free_queue(sdev->request_queue);
 
 out_free_dev:
@@ -491,6 +485,8 @@
  **/
 static void scsi_free_sdev(struct scsi_device *sdev)
 {
+	unsigned long flags;
+
 	list_del(&sdev->siblings);
 	list_del(&sdev->same_target_siblings);
 
@@ -500,6 +496,15 @@
 		sdev->host->hostt->slave_destroy(sdev);
 	if (sdev->inquiry)
 		kfree(sdev->inquiry);
+	spin_lock_irqsave(sdev->host->host_lock, flags);
+	list_del(&sdev->starved_entry);
+	if (sdev->single_lun) {
+		sdev->sdev_target->starget_refcnt--;
+		if (sdev->sdev_target->starget_refcnt == 0)
+			kfree(sdev->sdev_target);
+	}
+	spin_unlock_irqrestore(sdev->host->host_lock, flags);
+
 	kfree(sdev);
 }
 
@@ -1135,6 +1140,10 @@
 static int scsi_add_lun(Scsi_Device *sdev, Scsi_Request *sreq,
 		char *inq_result, int *bflags)
 {
+	struct scsi_device *sdev_sibling;
+	struct scsi_target *starget;
+	unsigned long flags;
+
 	/*
 	 * XXX do not save the inquiry, since it can change underneath us,
 	 * save just vendor/model/rev.
@@ -1235,7 +1244,7 @@
 	
 	scsi_device_register(sdev);
 
-	sdev->de = devfs_mk_dir("scsi/host%d/bus%d/target%d/lun%d",
+	sprintf(sdev->devfs_name, "scsi/host%d/bus%d/target%d/lun%d",
 				sdev->host->host_no, sdev->channel,
 				sdev->id, sdev->lun);
 
@@ -1256,10 +1265,38 @@
 
 	/*
 	 * If we need to allow I/O to only one of the luns attached to
-	 * this target id at a time, then we set this flag.
+	 * this target id at a time set single_lun, and allocate or modify
+	 * sdev_target.
 	 */
-	if (*bflags & BLIST_SINGLELUN)
+	if (*bflags & BLIST_SINGLELUN) {
 		sdev->single_lun = 1;
+		spin_lock_irqsave(sdev->host->host_lock, flags);
+		starget = NULL;
+		/*
+		 * Search for an existing target for this sdev.
+		 */
+		list_for_each_entry(sdev_sibling, &sdev->same_target_siblings,
+				    same_target_siblings) {
+			if (sdev_sibling->sdev_target != NULL) {
+				starget = sdev_sibling->sdev_target;
+				break;
+			}
+		}
+		if (!starget) {
+			starget = kmalloc(sizeof(*starget), GFP_ATOMIC);
+			if (!starget) {
+				printk(ALLOC_FAILURE_MSG, __FUNCTION__);
+				spin_unlock_irqrestore(sdev->host->host_lock,
+						       flags);
+				return SCSI_SCAN_NO_RESPONSE;
+			}
+			starget->starget_refcnt = 0;
+			starget->starget_sdev_user = NULL;
+		}
+		starget->starget_refcnt++;
+		sdev->sdev_target = starget;
+		spin_unlock_irqrestore(sdev->host->host_lock, flags);
+	}
 
 	/* if the device needs this changing, it may do so in the detect
 	 * function */
@@ -1288,15 +1325,15 @@
  *     SCSI_SCAN_LUN_PRESENT: a new Scsi_Device was allocated and initialized
  **/
 static int scsi_probe_and_add_lun(struct Scsi_Host *host,
-		struct request_queue **q, uint channel, uint id, uint lun,
-		int *bflagsp, struct scsi_device **sdevp)
+		uint channel, uint id, uint lun, int *bflagsp,
+		struct scsi_device **sdevp)
 {
 	struct scsi_device *sdev;
 	struct scsi_request *sreq;
 	unsigned char *result;
 	int bflags, res = SCSI_SCAN_NO_RESPONSE;
 
-	sdev = scsi_alloc_sdev(host, q, channel, id, lun);
+	sdev = scsi_alloc_sdev(host, channel, id, lun);
 	if (!sdev)
 		goto out;
 	sreq = scsi_allocate_request(sdev);
@@ -1350,13 +1387,8 @@
 	if (res == SCSI_SCAN_LUN_PRESENT) {
 		if (sdevp)
 			*sdevp = sdev;
-	} else {
-		if (q) {
-			*q = sdev->request_queue;
-			sdev->request_queue = NULL;
-		}
+	} else
 		scsi_free_sdev(sdev);
-	}
  out:
 	return res;
 }
@@ -1374,9 +1406,8 @@
  *
  *     Modifies sdevscan->lun.
  **/
-static void scsi_sequential_lun_scan(struct Scsi_Host *shost,
-	       	struct request_queue **q, uint channel, uint id,
-	       	int bflags, int lun0_res, int scsi_level)
+static void scsi_sequential_lun_scan(struct Scsi_Host *shost, uint channel,
+		uint id, int bflags, int lun0_res, int scsi_level)
 {
 	unsigned int sparse_lun, lun, max_dev_lun;
 
@@ -1444,7 +1475,7 @@
 	 * sparse_lun.
 	 */
 	for (lun = 1; lun < max_dev_lun; ++lun)
-		if ((scsi_probe_and_add_lun(shost, q, channel, id, lun,
+		if ((scsi_probe_and_add_lun(shost, channel, id, lun,
 		      NULL, NULL) != SCSI_SCAN_LUN_PRESENT) && !sparse_lun)
 			return;
 }
@@ -1497,8 +1528,7 @@
  *     0: scan completed (or no memory, so further scanning is futile)
  *     1: no report lun scan, or not configured
  **/
-static int scsi_report_lun_scan(Scsi_Device *sdev, struct request_queue **q,
-		int bflags)
+static int scsi_report_lun_scan(Scsi_Device *sdev, int bflags)
 {
 #ifdef CONFIG_SCSI_REPORT_LUNS
 
@@ -1659,8 +1689,8 @@
 		} else {
 			int res;
 
-			res = scsi_probe_and_add_lun(sdev->host, q,
-				sdev->channel, sdev->id, lun, NULL, NULL);
+			res = scsi_probe_and_add_lun(sdev->host, sdev->channel,
+				sdev->id, lun, NULL, NULL);
 			if (res == SCSI_SCAN_NO_RESPONSE) {
 				/*
 				 * Got some results, but now none, abort.
@@ -1688,8 +1718,7 @@
 	struct scsi_device *sdev;
 	int error = -ENODEV, res;
 
-	res = scsi_probe_and_add_lun(shost, NULL, channel, id, lun,
-			NULL, &sdev);
+	res = scsi_probe_and_add_lun(shost, channel, id, lun, NULL, &sdev);
 	if (res == SCSI_SCAN_LUN_PRESENT)
 		error = scsi_attach_device(sdev);
 
@@ -1704,7 +1733,7 @@
 	if (sdev->attached)
 		return -EINVAL;
 
-	devfs_unregister(sdev->de);
+	devfs_remove(sdev->devfs_name);
 	scsi_device_unregister(sdev);
 
 	scsi_free_sdev(sdev);
@@ -1730,8 +1759,8 @@
  *     First try a REPORT LUN scan, if that does not scan the target, do a
  *     sequential scan of LUNs on the target id.
  **/
-static void scsi_scan_target(struct Scsi_Host *shost, struct request_queue **q,
-			     unsigned int channel, unsigned int id)
+static void scsi_scan_target(struct Scsi_Host *shost, unsigned int channel,
+			     unsigned int id)
 {
 	int bflags = 0;
 	int res;
@@ -1747,14 +1776,14 @@
 	 * Scan LUN 0, if there is some response, scan further. Ideally, we
 	 * would not configure LUN 0 until all LUNs are scanned.
 	 */
-	res = scsi_probe_and_add_lun(shost, q, channel, id, 0, &bflags, &sdev);
+	res = scsi_probe_and_add_lun(shost, channel, id, 0, &bflags, &sdev);
 	if (res == SCSI_SCAN_LUN_PRESENT) {
-		if (scsi_report_lun_scan(sdev, q, bflags) != 0)
+		if (scsi_report_lun_scan(sdev, bflags) != 0)
 			/*
 			 * The REPORT LUN did not scan the target,
 			 * do a sequential scan.
 			 */
-			scsi_sequential_lun_scan(shost, q, channel, id, bflags,
+			scsi_sequential_lun_scan(shost, channel, id, bflags,
 				       	res, sdev->scsi_level);
 	} else if (res == SCSI_SCAN_TARGET_PRESENT) {
 		/*
@@ -1763,7 +1792,7 @@
 		 * sequential lun scan with a bflags of SPARSELUN and
 		 * a default scsi level of SCSI_2
 		 */
-		scsi_sequential_lun_scan(shost, q, channel, id, BLIST_SPARSELUN,
+		scsi_sequential_lun_scan(shost, channel, id, BLIST_SPARSELUN,
 				SCSI_SCAN_TARGET_PRESENT, SCSI_2);
 	}
 }
@@ -1778,7 +1807,6 @@
  **/
 void scsi_scan_host(struct Scsi_Host *shost)
 {
-	struct request_queue *q = NULL;
 	uint channel, id, order_id;
 
 	/*
@@ -1803,12 +1831,9 @@
 				order_id = shost->max_id - id - 1;
 			else
 				order_id = id;
-			scsi_scan_target(shost, &q, channel, order_id);
+			scsi_scan_target(shost, channel, order_id);
 		}
 	}
-
-	if (q)
-		scsi_free_queue(q);
 }
 
 void scsi_forget_host(struct Scsi_Host *shost)
@@ -1847,7 +1872,7 @@
 {
 	struct scsi_device *sdev;
 
-	sdev = scsi_alloc_sdev(shost, NULL, 0, shost->this_id, 0);
+	sdev = scsi_alloc_sdev(shost, 0, shost->this_id, 0);
 	if (sdev) {
 		sdev->borken = 0;
 	}
diff -Nru a/drivers/scsi/scsi_syms.c b/drivers/scsi/scsi_syms.c
--- a/drivers/scsi/scsi_syms.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/scsi_syms.c	Sat Apr 19 19:51:47 2003
@@ -60,6 +60,8 @@
 EXPORT_SYMBOL(scsi_release_request);
 EXPORT_SYMBOL(scsi_wait_req);
 EXPORT_SYMBOL(scsi_do_req);
+EXPORT_SYMBOL(scsi_get_command);
+EXPORT_SYMBOL(scsi_put_command);
 
 EXPORT_SYMBOL(scsi_report_bus_reset);
 EXPORT_SYMBOL(scsi_block_requests);
diff -Nru a/drivers/scsi/sd.c b/drivers/scsi/sd.c
--- a/drivers/scsi/sd.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/sd.c	Sat Apr 19 19:51:49 2003
@@ -123,7 +123,7 @@
 	case 1 ... 7:
 		return SCSI_DISK1_MAJOR + major_idx - 1;
 	case 8 ... 15:
-		return SCSI_DISK8_MAJOR + major_idx;
+		return SCSI_DISK8_MAJOR + major_idx - 8;
 	default:
 		BUG();
 		return 0;	/* shut up gcc */
@@ -1327,7 +1327,6 @@
 	sdkp->disk = gd;
 	sdkp->index = index;
 
-	gd->de = sdp->de;
 	gd->major = sd_major(index >> 4);
 	gd->first_minor = (index & 15) << 4;
 	gd->minors = 16;
@@ -1340,10 +1339,12 @@
 		sprintf(gd->disk_name, "sd%c", 'a' + index % 26);
 	}
 
+	strcpy(gd->devfs_name, sdp->devfs_name);
+
 	sd_init_onedisk(sdkp, gd);
 
 	gd->driverfs_dev = &sdp->sdev_driverfs_dev;
-	gd->flags = GENHD_FL_DRIVERFS | GENHD_FL_DEVFS;
+	gd->flags = GENHD_FL_DRIVERFS;
 	if (sdp->removable)
 		gd->flags |= GENHD_FL_REMOVABLE;
 	gd->private_data = &sdkp->driver;
diff -Nru a/drivers/scsi/sg.c b/drivers/scsi/sg.c
--- a/drivers/scsi/sg.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/scsi/sg.c	Sat Apr 19 19:51:47 2003
@@ -182,7 +182,6 @@
 	wait_queue_head_t o_excl_wait;	/* queue open() when O_EXCL in use */
 	int sg_tablesize;	/* adapter's max scatter-gather table size */
 	Sg_fd *headfp;		/* first open fd belonging to this device */
-	devfs_handle_t de;
 	volatile char detached;	/* 0->attached, 1->detached pending removal */
 	volatile char exclude;	/* opened for exclusive access */
 	char sgdebug;		/* 0->off, 1->sense, 9->dump dev, 10-> all devs */
@@ -1350,6 +1349,7 @@
 	struct gendisk *disk;
 	Sg_device *sdp = NULL;
 	unsigned long iflags;
+	char devfs_name[64];
 	int k, error;
 
 	disk = alloc_disk(1);
@@ -1447,10 +1447,13 @@
 	device_register(&sdp->sg_driverfs_dev);
 	device_create_file(&sdp->sg_driverfs_dev, &dev_attr_type);
 	device_create_file(&sdp->sg_driverfs_dev, &dev_attr_kdev);
-	sdp->de = devfs_register(scsidp->de, "generic", DEVFS_FL_DEFAULT,
-				 SCSI_GENERIC_MAJOR, k,
-				 S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
-				 &sg_fops, sdp);
+
+	sprintf(devfs_name, "%s/generic", scsidp->devfs_name);
+	devfs_register(NULL, devfs_name, 0,
+			SCSI_GENERIC_MAJOR, k,
+			S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
+			&sg_fops, sdp);
+
 	switch (scsidp->type) {
 	case TYPE_DISK:
 	case TYPE_MOD:
@@ -1527,8 +1530,7 @@
 	write_unlock_irqrestore(&sg_dev_arr_lock, iflags);
 
 	if (sdp) {
-		devfs_unregister(sdp->de);
-		sdp->de = NULL;
+		devfs_remove("%s/generic", scsidp->devfs_name);
 		device_remove_file(&sdp->sg_driverfs_dev, &dev_attr_type);
 		device_remove_file(&sdp->sg_driverfs_dev, &dev_attr_kdev);
 		device_unregister(&sdp->sg_driverfs_dev);
diff -Nru a/drivers/scsi/sr.c b/drivers/scsi/sr.c
--- a/drivers/scsi/sr.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/scsi/sr.c	Sat Apr 19 19:51:29 2003
@@ -569,7 +569,7 @@
 	get_capabilities(cd);
 	sr_vendor_init(cd);
 
-	disk->de = sdev->de;
+	strcpy(disk->devfs_name, sdev->devfs_name);
 	disk->driverfs_dev = &sdev->sdev_driverfs_dev;
 	register_cdrom(&cd->cdi);
 	set_capacity(disk, cd->capacity);
diff -Nru a/drivers/scsi/st.c b/drivers/scsi/st.c
--- a/drivers/scsi/st.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/st.c	Sat Apr 19 19:51:49 2003
@@ -9,16 +9,16 @@
    Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
    Michael Schaefer, J"org Weule, and Eric Youngdale.
 
-   Copyright 1992 - 2002 Kai Makisara
-   email Kai.Makisara@metla.fi
+   Copyright 1992 - 2003 Kai Makisara
+   email Kai.Makisara@kolumbus.fi
 
-   Last modified: Sat Dec 14 14:25:09 2002 by makisara
+   Last modified: Sun Apr 13 10:17:18 2003 by makisara
    Some small formal changes - aeb, 950809
 
    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
  */
 
-static char *verstr = "20021214";
+static char *verstr = "20030413";
 
 #include <linux/module.h>
 
@@ -34,6 +34,8 @@
 #include <linux/fcntl.h>
 #include <linux/spinlock.h>
 #include <linux/blk.h>
+#include <linux/moduleparam.h>
+#include <linux/devfs_fs_kernel.h>
 #include <asm/uaccess.h>
 #include <asm/dma.h>
 #include <asm/system.h>
@@ -65,7 +67,6 @@
 #include "st.h"
 
 static int buffer_kbs;
-static int write_threshold_kbs;
 static int max_sg_segs;
 static int try_direct_io = TRY_DIRECT_IO;
 static int try_rdio = TRUE;
@@ -78,22 +79,25 @@
 MODULE_DESCRIPTION("SCSI Tape Driver");
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(buffer_kbs, "i");
+/* Set 'perm' (4th argument) to 0 to disable module_param's definition
+ * of sysfs parameters (which module_param doesn't yet support).
+ * Sysfs parameters defined explicitly later.
+ */
+module_param_named(buffer_kbs, buffer_kbs, int, 0);
 MODULE_PARM_DESC(buffer_kbs, "Default driver buffer size for fixed block mode (KB; 32)");
-MODULE_PARM(write_threshold_kbs, "i");
-MODULE_PARM_DESC(write_threshold_kbs, "Asynchronous write threshold (KB; 30)");
-MODULE_PARM(max_sg_segs, "i");
+module_param_named(max_sg_segs, max_sg_segs, int, 0);
 MODULE_PARM_DESC(max_sg_segs, "Maximum number of scatter/gather segments to use (256)");
-MODULE_PARM(try_direct_io, "i");
+module_param_named(try_direct_io, try_direct_io, int, 0);
 MODULE_PARM_DESC(try_direct_io, "Try direct I/O between user buffer and tape drive (1)");
 
 /* Extra parameters for testing */
-MODULE_PARM(try_rdio, "i");
+module_param_named(try_rdio, try_rdio, int, 0);
 MODULE_PARM_DESC(try_rdio, "Try direct read i/o when possible");
-MODULE_PARM(try_wdio, "i");
+module_param_named(try_wdio, try_wdio, int, 0);
 MODULE_PARM_DESC(try_wdio, "Try direct write i/o when possible");
 
 #ifndef MODULE
+static int write_threshold_kbs;  /* retained for compatibility */
 static struct st_dev_parm {
 	char *name;
 	int *val;
@@ -101,11 +105,11 @@
 	{
 		"buffer_kbs", &buffer_kbs
 	},
-	{
+	{       /* Retained for compatibility with 2.4 */
 		"write_threshold_kbs", &write_threshold_kbs
 	},
 	{
-		"max_sg_segs", &max_sg_segs
+		"max_sg_segs", NULL
 	},
 	{
 		"try_direct_io", &try_direct_io
@@ -113,11 +117,11 @@
 };
 #endif
 
+static char *st_formats[ST_NBR_MODES] ={"", "l", "m", "a"};
 
 /* The default definitions have been moved to st_options.h */
 
 #define ST_FIXED_BUFFER_SIZE (ST_FIXED_BUFFER_BLOCKS * ST_KILOBYTE)
-#define ST_WRITE_THRESHOLD (ST_WRITE_THRESHOLD_BLOCKS * ST_KILOBYTE)
 
 /* The buffer size should fit into the 24 bits for length in the
    6-byte SCSI read and write commands. */
@@ -146,7 +150,6 @@
 static rwlock_t st_dev_arr_lock = RW_LOCK_UNLOCKED;
 
 static int st_fixed_buffer_size = ST_FIXED_BUFFER_SIZE;
-static int st_write_threshold = ST_WRITE_THRESHOLD;
 static int st_max_sg_segs = ST_MAX_SG;
 
 static Scsi_Tape **scsi_tapes = NULL;
@@ -158,6 +161,7 @@
 static void normalize_buffer(ST_buffer *);
 static int append_to_buffer(const char *, ST_buffer *, int);
 static int from_buffer(ST_buffer *, char *, int);
+static void move_buffer_data(ST_buffer *, int);
 static void buf_to_sg(ST_buffer *, unsigned int);
 
 static int st_map_user_pages(struct scatterlist *, const unsigned int, 
@@ -169,6 +173,10 @@
 static int st_attach(Scsi_Device *);
 static void st_detach(Scsi_Device *);
 
+static void do_create_driverfs_files(void);
+static void do_remove_driverfs_files(void);
+
+
 static struct Scsi_Device_Template st_template = {
 	.module =	THIS_MODULE,
 	.list =		LIST_HEAD_INIT(st_template.list),
@@ -1313,7 +1321,7 @@
 	ssize_t total;
 	ssize_t i, do_count, blks, transfer;
 	ssize_t retval;
-	int undone;
+	int undone, retry_eot = 0, scode;
 	int async_write;
 	unsigned char cmd[MAX_COMMAND_SIZE];
 	const char *b_point;
@@ -1416,7 +1424,7 @@
 	STps->rw = ST_WRITING;
 
 	b_point = buf;
-	while (count > 0) {
+	while (count > 0 && !retry_eot) {
 
 		if (STbp->do_dio) {
 			do_count = count;
@@ -1441,12 +1449,8 @@
 		filp->f_pos += do_count;
 		b_point += do_count;
 
-		async_write = !STbp->do_dio &&
+		async_write = STp->block_size == 0 && !STbp->do_dio &&
 			STm->do_async_writes && STps->eof < ST_EOM_OK;
-		if (STp->block_size != 0)
-			async_write &= count == 0 &&
-				(!STm->do_buffer_writes ||
-				 STbp->buffer_bytes >= STp->write_threshold);
 
 		if (STp->block_size != 0 && STm->do_buffer_writes &&
 		    !(STp->try_dio && try_wdio) && STps->eof < ST_EOM_OK &&
@@ -1457,12 +1461,15 @@
 				break;
 		}
 
+	retry_write:
 		if (STp->block_size == 0)
 			blks = transfer = do_count;
 		else {
 			if (!STbp->do_dio)
-				do_count = STbp->buffer_bytes;
-			blks = do_count / STp->block_size;
+				blks = STbp->buffer_bytes;
+			else
+				blks = do_count;
+			blks /= STp->block_size;
 			transfer = blks * STp->block_size;
 		}
 		cmd[2] = blks >> 16;
@@ -1488,15 +1495,15 @@
                         DEBC(printk(ST_DEB_MSG "%s: Error on write:\n", name));
 			if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 &&
 			    (SRpnt->sr_sense_buffer[2] & 0x40)) {
+				scode = SRpnt->sr_sense_buffer[2] & 0x0f;
 				if ((SRpnt->sr_sense_buffer[0] & 0x80) != 0)
 					undone = (SRpnt->sr_sense_buffer[3] << 24) |
 					    (SRpnt->sr_sense_buffer[4] << 16) |
 					    (SRpnt->sr_sense_buffer[5] << 8) |
                                                 SRpnt->sr_sense_buffer[6];
 				else if (STp->block_size == 0 &&
-					 (SRpnt->sr_sense_buffer[2] & 0x0f) ==
-                                         VOLUME_OVERFLOW)
-					undone = do_count;
+					 scode == VOLUME_OVERFLOW)
+					undone = transfer;
 				else
 					undone = 0;
 				if (STp->block_size != 0)
@@ -1504,7 +1511,7 @@
 				filp->f_pos -= undone;
 				if (undone <= do_count) {
 					/* Only data from this write is not written */
-					count -= undone;
+					count += undone;
 					do_count -= undone;
 					if (STp->block_size)
 						blks = (transfer - undone) / STp->block_size;
@@ -1514,21 +1521,40 @@
 					   (retval left to zero)
 					*/
 					if (STp->block_size == 0 ||
-					   undone > 0 || count == 0)
+					    undone > 0 || count == 0)
 						retval = (-ENOSPC); /* EOM within current request */
                                         DEBC(printk(ST_DEB_MSG
                                                        "%s: EOM with %d bytes unwritten.\n",
-						       name, transfer));
+						       name, count));
 				} else {
-					/* Previously buffered data not written */
-					count -= do_count;
-					blks = do_count = 0;
-					STps->eof = ST_EOM_ERROR;
-					STps->drv_block = (-1); /* Too cautious? */
-					retval = (-EIO);	/* EOM for old data */
-					DEBC(printk(ST_DEB_MSG
-                                                       "%s: EOM with lost data.\n",
-                                                       name));
+					/* EOT within data buffered earlier (possible only
+					   in fixed block mode without direct i/o) */
+					if (!retry_eot && (SRpnt->sr_sense_buffer[0] & 1) == 0 &&
+					    (scode == NO_SENSE || scode == RECOVERED_ERROR)) {
+						move_buffer_data(STp->buffer, transfer - undone);
+						retry_eot = TRUE;
+						if (STps->drv_block >= 0) {
+							STps->drv_block += (transfer - undone) /
+								STp->block_size;
+						}
+						STps->eof = ST_EOM_OK;
+						DEBC(printk(ST_DEB_MSG
+							    "%s: Retry write of %d bytes at EOM.\n",
+							    name, STp->buffer->buffer_bytes));
+						goto retry_write;
+					}
+					else {
+						/* Either error within data buffered by driver or
+						   failed retry */
+						count -= do_count;
+						blks = do_count = 0;
+						STps->eof = ST_EOM_ERROR;
+						STps->drv_block = (-1); /* Too cautious? */
+						retval = (-EIO);	/* EOM for old data */
+						DEBC(printk(ST_DEB_MSG
+							    "%s: EOM with lost data.\n",
+							    name));
+					}
 				}
 			} else {
 				filp->f_pos -= do_count;
@@ -1548,7 +1574,7 @@
 		STbp->buffer_bytes = 0;
 		STp->dirty = 0;
 
-		if (retval) {
+		if (retval || retry_eot) {
 			if (count < total)
 				retval = total - count;
 			goto out;
@@ -1557,9 +1583,9 @@
 
 	if (STps->eof == ST_EOD_1)
 		STps->eof = ST_EOM_OK;
-	else
+	else if (STps->eof != ST_EOM_OK)
 		STps->eof = ST_NOEOF;
-	retval = total;
+	retval = total - count;
 
  out:
 	if (SRpnt != NULL)
@@ -1658,9 +1684,14 @@
 
 				if (SRpnt->sr_sense_buffer[2] & 0x20) {	/* ILI */
 					if (STp->block_size == 0) {
-						if (transfer < 0) {
+						if (transfer <= 0) {
+							if (transfer < 0)
+								printk(KERN_NOTICE
+								       "%s: Failed to read %d byte block with %d byte transfer.\n",
+								       name, bytes - transfer, bytes);
 							if (STps->drv_block >= 0)
 								STps->drv_block += 1;
+							STbp->buffer_bytes = 0;
 							return (-ENOMEM);
 						}
 						STbp->buffer_bytes = bytes - transfer;
@@ -1727,6 +1758,9 @@
 				} else	/* Some other extended sense code */
 					retval = (-EIO);
 			}
+
+			if (STbp->buffer_bytes < 0)  /* Caused by bogus sense data */
+				STbp->buffer_bytes = 0;
 		}
 		/* End of extended sense test */ 
 		else {		/* Non-extended sense */
@@ -1986,16 +2020,7 @@
 			debugging = value; )
 		st_log_options(STp, STm, name);
 	} else if (code == MT_ST_WRITE_THRESHOLD) {
-		value = (options & ~MT_ST_OPTIONS) * ST_KILOBYTE;
-		if (value < 1 || value > st_fixed_buffer_size) {
-			printk(KERN_WARNING
-                               "%s: Write threshold %d too small or too large.\n",
-			       name, value);
-			return (-EIO);
-		}
-		STp->write_threshold = value;
-		printk(KERN_INFO "%s: Write threshold set to %d bytes.\n",
-		       name, value);
+		/* Retained for compatibility */
 	} else if (code == MT_ST_DEF_BLKSIZE) {
 		value = (options & ~MT_ST_OPTIONS);
 		if (value == ~MT_ST_OPTIONS) {
@@ -2136,8 +2161,8 @@
 
 
 /* Send the mode page in the tape buffer to the drive. Assumes that the mode data
-   in the buffer is correctly formatted. */
-static int write_mode_page(Scsi_Tape *STp, int page)
+   in the buffer is correctly formatted. The long timeout is used if slow is non-zero. */
+static int write_mode_page(Scsi_Tape *STp, int page, int slow)
 {
 	int pgo;
 	unsigned char cmd[MAX_COMMAND_SIZE];
@@ -2156,7 +2181,7 @@
 	(STp->buffer)->b_data[pgo + MP_OFF_PAGE_NBR] &= MP_MSK_PAGE_NBR;
 
 	SRpnt = st_do_scsi(SRpnt, STp, cmd, cmd[4], SCSI_DATA_WRITE,
-			   STp->timeout, 0, TRUE);
+			   (slow ? STp->long_timeout : STp->timeout), 0, TRUE);
 	if (SRpnt == NULL)
 		return (STp->buffer)->syscall_result;
 
@@ -2223,7 +2248,7 @@
 			b_data[mpoffs + CP_OFF_C_ALGO] = 0; /* no compression */
 	}
 
-	retval = write_mode_page(STp, COMPRESSION_PAGE);
+	retval = write_mode_page(STp, COMPRESSION_PAGE, FALSE);
 	if (retval) {
                 DEBC(printk(ST_DEB_MSG "%s: Compression change failed.\n", name));
 		return (-EIO);
@@ -3022,7 +3047,7 @@
 	bp[pgo + PP_OFF_RESERVED] = 0;
 	bp[pgo + PP_OFF_FLAGS] = PP_BIT_IDP | PP_MSK_PSUM_MB;
 
-	result = write_mode_page(STp, PART_PAGE);
+	result = write_mode_page(STp, PART_PAGE, TRUE);
 	if (result) {
 		printk(KERN_INFO "%s: Partitioning of tape failed.\n", name);
 		result = (-EIO);
@@ -3527,6 +3552,48 @@
 }
 
 
+/* Move data towards start of buffer */
+static void move_buffer_data(ST_buffer * st_bp, int offset)
+{
+	int src_seg, dst_seg, src_offset = 0, dst_offset;
+	int count, total;
+
+	if (offset == 0)
+		return;
+
+	total=st_bp->buffer_bytes - offset;
+	for (src_seg=0; src_seg < st_bp->frp_segs; src_seg++) {
+		src_offset = offset;
+		if (src_offset < st_bp->frp[src_seg].length)
+			break;
+		offset -= st_bp->frp[src_seg].length;
+	}
+	if (src_seg == st_bp->frp_segs) {	/* Should never happen */
+		printk(KERN_WARNING "st: move_buffer offset overflow.\n");
+		return;
+	}
+
+	st_bp->buffer_bytes = st_bp->read_pointer = total;
+	for (dst_seg=dst_offset=0; total > 0; ) {
+		count = min(st_bp->frp[dst_seg].length - dst_offset,
+			    st_bp->frp[src_seg].length - src_offset);
+		memmove(page_address(st_bp->frp[dst_seg].page) + dst_offset,
+			page_address(st_bp->frp[src_seg].page) + src_offset, count);
+		src_offset += count;
+		if (src_offset >= st_bp->frp[src_seg].length) {
+			src_seg++;
+			src_offset = 0;
+		}
+		dst_offset += count;
+		if (dst_offset >= st_bp->frp[dst_seg].length) {
+			dst_seg++;
+			dst_offset = 0;
+		}
+		total -= count;
+	}
+}
+
+
 /* Fill the s/g list up to the length required for this transfer */
 static void buf_to_sg(ST_buffer *STbp, unsigned int length)
 {
@@ -3559,15 +3626,6 @@
 {
 	if (buffer_kbs > 0)
 		st_fixed_buffer_size = buffer_kbs * ST_KILOBYTE;
-	if (write_threshold_kbs > 0)
-		st_write_threshold = write_threshold_kbs * ST_KILOBYTE;
-	else if (buffer_kbs > 0)
-		st_write_threshold = st_fixed_buffer_size - 2048;
-	if (st_write_threshold > st_fixed_buffer_size) {
-		st_write_threshold = st_fixed_buffer_size;
-		printk(KERN_WARNING "st: write_threshold limited to %d bytes.\n",
-		       st_write_threshold);
-	}
 	if (max_sg_segs >= ST_FIRST_SG)
 		st_max_sg_segs = max_sg_segs;
 }
@@ -3584,15 +3642,20 @@
 
 	if (ints[0] > 0) {
 		for (i = 0; i < ints[0] && i < ARRAY_SIZE(parms); i++)
-			*parms[i].val = ints[i + 1];
+			if (parms[i].val)
+				*parms[i].val = ints[i + 1];
 	} else {
 		while (stp != NULL) {
 			for (i = 0; i < ARRAY_SIZE(parms); i++) {
 				len = strlen(parms[i].name);
 				if (!strncmp(stp, parms[i].name, len) &&
 				    (*(stp + len) == ':' || *(stp + len) == '=')) {
-					*parms[i].val =
-                                                simple_strtoul(stp + len + 1, NULL, 0);
+					if (parms[i].val)
+						*parms[i].val =
+							simple_strtoul(stp + len + 1, NULL, 0);
+					else
+						printk(KERN_WARNING "st: Obsolete parameter %s\n",
+						       parms[i].name);
 					break;
 				}
 			}
@@ -3755,7 +3818,6 @@
 	tpnt->fast_mteom = ST_FAST_MTEOM;
 	tpnt->scsi2_logical = ST_SCSI2LOGICAL;
 	tpnt->immediate = ST_NOWAIT;
-	tpnt->write_threshold = st_write_threshold;
 	tpnt->default_drvbuffer = 0xff;		/* No forced buffering */
 	tpnt->partition = 0;
 	tpnt->new_partition = 0;
@@ -3803,11 +3865,12 @@
 	write_unlock(&st_dev_arr_lock);
 
 	for (mode = 0; mode < ST_NBR_MODES; ++mode) {
-	    char name[8];
-	    static char *formats[ST_NBR_MODES] ={"", "l", "m", "a"};
+	    char name[8], devfs_name[64];
 
 	    /*  Rewind entry  */
-	    sprintf (name, "mt%s", formats[mode]);
+	    sprintf(name, "mt%s", st_formats[mode]);
+	    sprintf(devfs_name, "%s/mt%s", SDp->devfs_name, st_formats[mode]);
+	    
 	    sprintf(tpnt->driverfs_dev_r[mode].bus_id, "%s:%s", 
 		    SDp->sdev_driverfs_dev.bus_id, name);
 	    sprintf(tpnt->driverfs_dev_r[mode].name, "%s%s", 
@@ -3820,13 +3883,14 @@
 	    device_create_file(&tpnt->driverfs_dev_r[mode], 
 			       &dev_attr_type);
 	    device_create_file(&tpnt->driverfs_dev_r[mode], &dev_attr_kdev);
-	    tpnt->de_r[mode] =
-		devfs_register (SDp->de, name, DEVFS_FL_DEFAULT,
+	    devfs_register(NULL, devfs_name, 0,
 				SCSI_TAPE_MAJOR, dev_num + (mode << 5),
 				S_IFCHR | S_IRUGO | S_IWUGO,
 				&st_fops, NULL);
 	    /*  No-rewind entry  */
-	    sprintf (name, "mt%sn", formats[mode]);
+	    sprintf (name, "mt%sn", st_formats[mode]);
+	    sprintf(devfs_name, "%s/mt%sn", SDp->devfs_name, st_formats[mode]);
+
 	    sprintf(tpnt->driverfs_dev_n[mode].bus_id, "%s:%s", 
 		    SDp->sdev_driverfs_dev.bus_id, name);
 	    sprintf(tpnt->driverfs_dev_n[mode].name, "%s%s", 
@@ -3840,13 +3904,12 @@
 			       &dev_attr_type);
 	    device_create_file(&tpnt->driverfs_dev_n[mode], 
 			       &dev_attr_kdev);
-	    tpnt->de_n[mode] =
-		devfs_register (SDp->de, name, DEVFS_FL_DEFAULT,
+	    devfs_register(NULL, devfs_name, 0,
 				SCSI_TAPE_MAJOR, dev_num + (mode << 5) + 128,
 				S_IFCHR | S_IRUGO | S_IWUGO,
 				&st_fops, NULL);
 	}
-	disk->number = devfs_register_tape(SDp->de);
+	disk->number = devfs_register_tape(SDp->devfs_name);
 
 	printk(KERN_WARNING
 	"Attached scsi tape %s at scsi%d, channel %d, id %d, lun %d\n",
@@ -3879,10 +3942,8 @@
 			write_unlock(&st_dev_arr_lock);
 			devfs_unregister_tape(tpnt->disk->number);
 			for (mode = 0; mode < ST_NBR_MODES; ++mode) {
-				devfs_unregister (tpnt->de_r[mode]);
-				tpnt->de_r[mode] = NULL;
-				devfs_unregister (tpnt->de_n[mode]);
-				tpnt->de_n[mode] = NULL;
+				devfs_remove("%s/mt%s", SDp->devfs_name, st_formats[mode]);
+				devfs_remove("%s/mt%sn", SDp->devfs_name, st_formats[mode]);
 				device_remove_file(&tpnt->driverfs_dev_r[mode],
 						   &dev_attr_type);
 				device_remove_file(&tpnt->driverfs_dev_r[mode],
@@ -3917,14 +3978,14 @@
 	validate_options();
 
 	printk(KERN_INFO
-		"st: Version %s, fixed bufsize %d, wrt %d, "
-		"s/g segs %d\n",
-		verstr, st_fixed_buffer_size, st_write_threshold,
-		st_max_sg_segs);
+		"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 (scsi_register_device(&st_template) == 0)
+		if (scsi_register_device(&st_template) == 0) {
+			do_create_driverfs_files();
 			return 0;
+		}
 		unregister_chrdev(SCSI_TAPE_MAJOR, "st");
 	}
 
@@ -3936,6 +3997,7 @@
 {
 	int i;
 
+	do_remove_driverfs_files();
 	scsi_unregister_device(&st_template);
 	unregister_chrdev(SCSI_TAPE_MAJOR, "st");
 	if (scsi_tapes != NULL) {
@@ -3952,6 +4014,52 @@
 
 module_init(init_st);
 module_exit(exit_st);
+
+
+/* The sysfs interface. Read-only at the moment */
+static ssize_t st_try_direct_io_show(struct device_driver *ddp, char *buf)
+{
+	return snprintf(buf, PAGE_SIZE, "%d\n", try_direct_io);
+}
+static DRIVER_ATTR(try_direct_io, S_IRUGO, st_try_direct_io_show, NULL);
+
+static ssize_t st_fixed_buffer_size_show(struct device_driver *ddp, char *buf)
+{
+	return snprintf(buf, PAGE_SIZE, "%d\n", st_fixed_buffer_size);
+}
+static DRIVER_ATTR(fixed_buffer_size, S_IRUGO, st_fixed_buffer_size_show, NULL);
+
+static ssize_t st_max_sg_segs_show(struct device_driver *ddp, char *buf)
+{
+	return snprintf(buf, PAGE_SIZE, "%d\n", st_max_sg_segs);
+}
+static DRIVER_ATTR(max_sg_segs, S_IRUGO, st_max_sg_segs_show, NULL);
+
+static ssize_t st_version_show(struct device_driver *ddd, char *buf)
+{
+	return snprintf(buf, PAGE_SIZE, "[%s]\n", verstr);
+}
+static DRIVER_ATTR(version, S_IRUGO, st_version_show, NULL);
+
+static void do_create_driverfs_files(void)
+{
+	struct device_driver *driverfs = &st_template.scsi_driverfs_driver;
+
+	driver_create_file(driverfs, &driver_attr_try_direct_io);
+	driver_create_file(driverfs, &driver_attr_fixed_buffer_size);
+	driver_create_file(driverfs, &driver_attr_max_sg_segs);
+	driver_create_file(driverfs, &driver_attr_version);
+}
+
+static void do_remove_driverfs_files(void)
+{
+	struct device_driver *driverfs = &st_template.scsi_driverfs_driver;
+
+	driver_remove_file(driverfs, &driver_attr_version);
+	driver_remove_file(driverfs, &driver_attr_max_sg_segs);
+	driver_remove_file(driverfs, &driver_attr_fixed_buffer_size);
+	driver_remove_file(driverfs, &driver_attr_try_direct_io);
+}
 
 
 /* Pin down user pages and put them into a scatter gather list. Returns <= 0 if
diff -Nru a/drivers/scsi/st.h b/drivers/scsi/st.h
--- a/drivers/scsi/st.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/scsi/st.h	Sat Apr 19 19:51:50 2003
@@ -5,7 +5,6 @@
 #ifndef _SCSI_H
 #include "scsi.h"
 #endif
-#include <linux/devfs_fs_kernel.h>
 #include <linux/completion.h>
 
 /* The tape buffer descriptor. */
@@ -96,7 +95,6 @@
 	unsigned char c_algo;			/* compression algorithm */
 	unsigned char pos_unknown;			/* after reset position unknown */
 	int tape_type;
-	int write_threshold;
 	int timeout;		/* timeout for normal commands */
 	int long_timeout;	/* timeout for commands known to take long time */
 
@@ -105,8 +103,6 @@
 	/* Mode characteristics */
 	ST_mode modes[ST_NBR_MODES];
 	int current_mode;
-	devfs_handle_t de_r[ST_NBR_MODES];  /*  Rewind entries     */
-	devfs_handle_t de_n[ST_NBR_MODES];  /*  No-rewind entries  */
 	struct device driverfs_dev_r[ST_NBR_MODES];
 	struct device driverfs_dev_n[ST_NBR_MODES];
 
diff -Nru a/drivers/scsi/st_options.h b/drivers/scsi/st_options.h
--- a/drivers/scsi/st_options.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/st_options.h	Sat Apr 19 19:51:49 2003
@@ -1,9 +1,9 @@
 /*
    The compile-time configurable defaults for the Linux SCSI tape driver.
 
-   Copyright 1995-2002 Kai Makisara.
+   Copyright 1995-2003 Kai Makisara.
 
-   Last modified: Fri Jul 26 15:54:31 2002 by makisara
+   Last modified: Mon Apr  7 22:49:18 2003 by makisara
 */
 
 #ifndef _ST_OPTIONS_H
@@ -38,11 +38,6 @@
 /* The minimum tape driver buffer size in kilobytes in fixed block mode.
    Must be non-zero. */
 #define ST_FIXED_BUFFER_BLOCKS 32
-
-/* The number of kilobytes of data in the buffer that triggers an
-   asynchronous write in fixed block mode. See also ST_ASYNC_WRITES
-   below. */
-#define ST_WRITE_THRESHOLD_BLOCKS 30
 
 /* Maximum number of scatter/gather segments */
 #define ST_MAX_SG      256
diff -Nru a/drivers/scsi/sym53c8xx.c b/drivers/scsi/sym53c8xx.c
--- a/drivers/scsi/sym53c8xx.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/scsi/sym53c8xx.c	Sat Apr 19 19:51:49 2003
@@ -13230,9 +13230,9 @@
 		return -1;
 	}
 
-#ifdef __powerpc__
+#if defined(__powerpc__) || defined(__hppa__)
 	/*
-	**	Fix-up for power/pc.
+	**	Fix-up for power/pc and hppa.
 	**	Should not be performed by the driver.
 	*/
 	if ((command & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY))
diff -Nru a/drivers/serial/68328serial.c b/drivers/serial/68328serial.c
--- a/drivers/serial/68328serial.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/serial/68328serial.c	Sat Apr 19 19:51:50 2003
@@ -1691,9 +1691,10 @@
 };
 
 
-static void __init m68328_console_init(void)
+static int __init m68328_console_init(void)
 {
 	register_console(&m68328_driver);
+	return 0;
 }
 
 console_initcall(m68328_console_init);
diff -Nru a/drivers/serial/68360serial.c b/drivers/serial/68360serial.c
--- a/drivers/serial/68360serial.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/serial/68360serial.c	Sat Apr 19 19:51:50 2003
@@ -39,7 +39,6 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <asm/irq.h>
-#include <linux/compatmac.h>
 #include <asm/m68360.h>
 #include <asm/commproc.h>
 
diff -Nru a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
--- a/drivers/serial/8250_pci.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/serial/8250_pci.c	Sat Apr 19 19:51:49 2003
@@ -1809,13 +1809,6 @@
 		pbn_b1_1_115200 },
 
 	/*
-	 * 3Com US Robotics 56k Voice Internal PCI model 5610
-	 */
-	{	PCI_VENDOR_ID_USR, 0x1008,
-		PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-		pbn_b0_1_115200 },
-
-	/*
 	 * Titan Electronic cards
 	 *  The 400L and 800L have a custom setup quirk.
 	 */
diff -Nru a/drivers/serial/amba.c b/drivers/serial/amba.c
--- a/drivers/serial/amba.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/serial/amba.c	Sat Apr 19 19:51:28 2003
@@ -705,9 +705,10 @@
 	.index		= -1,
 };
 
-static void __init ambauart_console_init(void)
+static int __init ambauart_console_init(void)
 {
 	register_console(&amba_console);
+	return 0;
 }
 console_initcall(ambauart_console_init);
 
diff -Nru a/drivers/serial/anakin.c b/drivers/serial/anakin.c
--- a/drivers/serial/anakin.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/serial/anakin.c	Sat Apr 19 19:51:29 2003
@@ -502,10 +502,10 @@
 	.index		= -1,
 };
 
-static void __init
-anakin_console_init(void)
+static int __init anakin_console_init(void)
 {
 	register_console(&anakin_console);
+	return 0;
 }
 console_initcall(anakin_console_init);
 
diff -Nru a/drivers/serial/clps711x.c b/drivers/serial/clps711x.c
--- a/drivers/serial/clps711x.c	Sat Apr 19 19:51:30 2003
+++ b/drivers/serial/clps711x.c	Sat Apr 19 19:51:30 2003
@@ -567,9 +567,10 @@
 	.index		= -1,
 };
 
-static void __init clps711xuart_console_init(void)
+static int __init clps711xuart_console_init(void)
 {
 	register_console(&clps711x_console);
+	return 0;
 }
 console_initcall(clps711xuart_console_init);
 
diff -Nru a/drivers/serial/core.c b/drivers/serial/core.c
--- a/drivers/serial/core.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/serial/core.c	Sat Apr 19 19:51:29 2003
@@ -873,45 +873,38 @@
 	return put_user(result, value);
 }
 
-static int uart_get_modem_info(struct uart_port *port, unsigned int *value)
+static int uart_tiocmget(struct tty_struct *tty, struct file *file)
 {
-	unsigned int result = port->mctrl;
+	struct uart_state *state = tty->driver_data;
+	struct uart_port *port = state->port;
+	int result = -EIO;
 
-	result |= port->ops->get_mctrl(port);
+	down(&state->sem);
+	if ((!file || !tty_hung_up_p(file)) &&
+	    !(tty->flags & (1 << TTY_IO_ERROR))) {
+		result = port->mctrl;
+		result |= port->ops->get_mctrl(port);
+	}
+	up(&state->sem);
 
-	return put_user(result, value);
+	return result;
 }
 
 static int
-uart_set_modem_info(struct uart_port *port, unsigned int cmd,
-		    unsigned int *value)
+uart_tiocmset(struct tty_struct *tty, struct file *file,
+	      unsigned int set, unsigned int clear)
 {
-	unsigned int arg, set, clear;
-	int ret = 0;
-
-	if (get_user(arg, value))
-		return -EFAULT;
-
-	arg &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2;
+	struct uart_state *state = tty->driver_data;
+	struct uart_port *port = state->port;
+	int ret = -EIO;
 
-	set = clear = 0;
-	switch (cmd) {
-	case TIOCMBIS:
-		set = arg;
-		break;
-	case TIOCMBIC:
-		clear = arg;
-		break;
-	case TIOCMSET:
-		set = arg;
-		clear = ~arg;
-		break;
-	default:
-		ret = -EINVAL;
-		break;
-	}
-	if (ret == 0)
+	down(&state->sem);
+	if ((!file || !tty_hung_up_p(file)) &&
+	    !(tty->flags & (1 << TTY_IO_ERROR))) {
 		uart_update_mctrl(port, set, clear);
+		ret = 0;
+	}
+	up(&state->sem);
 	return ret;
 }
 
@@ -922,8 +915,12 @@
 
 	BUG_ON(!kernel_locked());
 
+	down(&state->sem);
+
 	if (port->type != PORT_UNKNOWN)
 		port->ops->break_ctl(port, break_state);
+
+	up(&state->sem);
 }
 
 static int uart_do_autoconfig(struct uart_state *state)
@@ -1130,17 +1127,6 @@
 	 * protected against the tty being hung up.
 	 */
 	switch (cmd) {
-	case TIOCMGET:
-		ret = uart_get_modem_info(state->port, (unsigned int *)arg);
-		break;
-
-	case TIOCMBIS:
-	case TIOCMBIC:
-	case TIOCMSET:
-		ret = uart_set_modem_info(state->port, cmd,
-					  (unsigned int *)arg);
-		break;
-
 	case TIOCSERGETLSR: /* Get line status register */
 		ret = uart_get_lsr_info(state, (unsigned int *)arg);
 		break;
@@ -2162,6 +2148,8 @@
 #ifdef CONFIG_PROC_FS
 	normal->read_proc	= uart_read_proc;
 #endif
+	normal->tiocmget	= uart_tiocmget;
+	normal->tiocmset	= uart_tiocmset;
 
 	/*
 	 * Initialise the UART state(s).
diff -Nru a/drivers/serial/mcfserial.c b/drivers/serial/mcfserial.c
--- a/drivers/serial/mcfserial.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/serial/mcfserial.c	Sat Apr 19 19:51:47 2003
@@ -1853,9 +1853,10 @@
 	.index		= -1,
 };
 
-static void __init mcfrs_console_init(void)
+static int __init mcfrs_console_init(void)
 {
 	register_console(&mcfrs_console);
+	return 0;
 }
 
 console_initcall(mcfrs_console_init);
diff -Nru a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c
--- a/drivers/serial/sa1100.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/serial/sa1100.c	Sat Apr 19 19:51:28 2003
@@ -836,10 +836,11 @@
 	.index		= -1,
 };
 
-static void __init sa1100_rs_console_init(void)
+static int __init sa1100_rs_console_init(void)
 {
 	sa1100_init_ports();
 	register_console(&sa1100_console);
+	return 0;
 }
 console_initcall(sa1100_rs_console_init);
 
diff -Nru a/drivers/serial/uart00.c b/drivers/serial/uart00.c
--- a/drivers/serial/uart00.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/serial/uart00.c	Sat Apr 19 19:51:46 2003
@@ -645,9 +645,10 @@
 	.index		= 0,
 };
 
-static void __init uart00_console_init(void)
+static int __init uart00_console_init(void)
 {
 	register_console(&uart00_console);
+	return 0;
 }
 console_initcall(uart00_console_init);
 
diff -Nru a/drivers/usb/class/audio.c b/drivers/usb/class/audio.c
--- a/drivers/usb/class/audio.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/class/audio.c	Sat Apr 19 19:51:50 2003
@@ -99,6 +99,8 @@
  *              for abs. Bug report by Andrew Morton <andrewm@uow.edu.au>
  * 2001-06-16:  Bryce Nesbitt <bryce@obviously.com>
  *              Fix SNDCTL_DSP_STEREO API violation
+ * 2003-04-08:	Oliver Neukum (oliver@neukum.name):
+ *		Setting a configuration is done by usbcore and must not be overridden
  */
 
 /*
@@ -3790,10 +3792,6 @@
 	 */
 	i = dev->actconfig - config;
 
-	if (usb_set_configuration(dev, config->desc.bConfigurationValue) < 0) {
-		printk(KERN_ERR "usbaudio: set_configuration failed (ConfigValue 0x%x)\n", config->desc.bConfigurationValue);
-		return -EIO;
-	}
 	ret = usb_get_descriptor(dev, USB_DT_CONFIG, i, buf, 8);
 	if (ret < 0) {
 		printk(KERN_ERR "usbaudio: cannot get first 8 bytes of config descriptor %d of device %d (error %d)\n", i, dev->devnum, ret);
diff -Nru a/drivers/usb/class/usb-midi.c b/drivers/usb/class/usb-midi.c
--- a/drivers/usb/class/usb-midi.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/usb/class/usb-midi.c	Sat Apr 19 19:51:28 2003
@@ -1806,22 +1806,6 @@
 	printk(KERN_INFO "usb-midi: Found YAMAHA USB-MIDI device on dev %04x:%04x, iface %d\n",
 	       d->descriptor.idVendor, d->descriptor.idProduct, ifnum);
 
-	for ( i=0 ; i < d->descriptor.bNumConfigurations ; i++ ) {
-		if ( d->config+i == c ) goto configfound;
-	}
-
-	printk(KERN_INFO "usb-midi: Config not found.\n");
-
-	return -EINVAL;
-
- configfound:
-
-	/* this may not be necessary. */
-	if ( usb_set_configuration( d, c->desc.bConfigurationValue ) < 0 ) {
-		printk(KERN_INFO "usb-midi: Could not set config.\n");
-		return -EINVAL;
-	}
-
 	ret = usb_get_descriptor( d, USB_DT_CONFIG, i, buf, USB_DT_CONFIG_SIZE );
 	if ( ret < 0 ) {
 		printk(KERN_INFO "usb-midi: Could not get config (error=%d).\n", ret);
@@ -1916,21 +1900,6 @@
 	printk(KERN_INFO "usb-midi: Found MIDISTREAMING on dev %04x:%04x, iface %d\n",
 	       d->descriptor.idVendor, d->descriptor.idProduct, ifnum);
 
-	for ( i=0 ; i < d->descriptor.bNumConfigurations ; i++ ) {
-		if ( d->config+i == c ) goto configfound;
-	}
-
-	printk(KERN_INFO "usb-midi: Config not found.\n");
-
-	return -EINVAL;
-
- configfound:
-
-	/* this may not be necessary. */
-	if ( usb_set_configuration( d, c->desc.bConfigurationValue ) < 0 ) {
-		printk(KERN_INFO "usb-midi: Could not set config.\n");
-		return -EINVAL;
-	}
 
 	/* From USB Spec v2.0, Section 9.5.
 	   If the class or vendor specific descriptors use the same format
diff -Nru a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
--- a/drivers/usb/core/hcd.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/usb/core/hcd.c	Sat Apr 19 19:51:48 2003
@@ -1068,6 +1068,28 @@
 
 /*-------------------------------------------------------------------------*/
 
+/* this makes the hcd giveback() the urb more quickly, by kicking it
+ * off hardware queues (which may take a while) and returning it as
+ * soon as practical.  we've already set up the urb's return status,
+ * but we can't know if the callback completed already.
+ */
+static void
+unlink1 (struct usb_hcd *hcd, struct urb *urb)
+{
+	if (urb == (struct urb *) hcd->rh_timer.data)
+		usb_rh_status_dequeue (hcd, urb);
+	else {
+		int		value;
+
+		/* failures "should" be harmless */
+		value = hcd->driver->urb_dequeue (hcd, urb);
+		if (value != 0)
+			dev_dbg (hcd->controller,
+				"dequeue %p --> %d\n",
+				urb, value);
+	}
+}
+
 struct completion_splice {		// modified urb context:
 	/* did we complete? */
 	struct completion	done;
@@ -1176,6 +1198,7 @@
 	spin_unlock (&hcd_data_lock);
 	spin_unlock_irqrestore (&urb->lock, flags);
 
+	// FIXME remove splicing, so this becomes unlink1 (hcd, urb);
 	if (urb == (struct urb *) hcd->rh_timer.data) {
 		usb_rh_status_dequeue (hcd, urb);
 		retval = 0;
@@ -1206,18 +1229,105 @@
 	spin_unlock (&hcd_data_lock);
 	spin_unlock_irqrestore (&urb->lock, flags);
 bye:
-	if (retval && sys)
+	if (retval && sys && sys->driver)
 		dev_dbg (sys, "hcd_unlink_urb %p fail %d\n", urb, retval);
 	return retval;
 }
 
 /*-------------------------------------------------------------------------*/
 
-/* called by khubd, rmmod, apmd, or other thread for hcd-private cleanup */
+/* disables the endpoint: cancels any pending urbs, then synchronizes with
+ * the hcd to make sure all endpoint state is gone from hardware. use for
+ * set_configuration, set_interface, driver removal, physical disconnect.
+ *
+ * example:  a qh stored in hcd_dev.ep[], holding state related to endpoint
+ * type, maxpacket size, toggle, halt status, and scheduling.
+ */
+static void hcd_endpoint_disable (struct usb_device *udev, int endpoint)
+{
+	unsigned long	flags;
+	struct hcd_dev	*dev;
+	struct usb_hcd	*hcd;
+	struct urb	*urb;
+	unsigned	epnum = endpoint & USB_ENDPOINT_NUMBER_MASK;
+
+	dev = udev->hcpriv;
+	hcd = udev->bus->hcpriv;
+
+rescan:
+	/* (re)block new requests, as best we can */
+	if (endpoint & USB_DIR_IN) {
+		usb_endpoint_halt (udev, epnum, 0);
+		udev->epmaxpacketin [epnum] = 0;
+	} else {
+		usb_endpoint_halt (udev, epnum, 1);
+		udev->epmaxpacketout [epnum] = 0;
+	}
+
+	/* then kill any current requests */
+	spin_lock_irqsave (&hcd_data_lock, flags);
+	list_for_each_entry (urb, &dev->urb_list, urb_list) {
+		int	tmp = urb->pipe;
+
+		/* ignore urbs for other endpoints */
+		if (usb_pipeendpoint (tmp) != epnum)
+			continue;
+		if ((tmp ^ endpoint) & USB_DIR_IN)
+			continue;
+
+		/* another cpu may be in hcd, spinning on hcd_data_lock
+		 * to giveback() this urb.  the races here should be
+		 * small, but a full fix needs a new "can't submit"
+		 * urb state.
+		 */
+		if (urb->status != -EINPROGRESS)
+			continue;
+		usb_get_urb (urb);
+		spin_unlock_irqrestore (&hcd_data_lock, flags);
+
+		spin_lock_irqsave (&urb->lock, flags);
+		tmp = urb->status;
+		if (tmp == -EINPROGRESS)
+			urb->status = -ESHUTDOWN;
+		spin_unlock_irqrestore (&urb->lock, flags);
+
+		/* kick hcd unless it's already returning this */
+		if (tmp == -EINPROGRESS) {
+			tmp = urb->pipe;
+			unlink1 (hcd, urb);
+			dev_dbg (hcd->controller,
+				"shutdown urb %p pipe %08x ep%d%s%s\n",
+				urb, tmp, usb_pipeendpoint (tmp),
+				(tmp & USB_DIR_IN) ? "in" : "out",
+				({ char *s; \
+				 switch (usb_pipetype (tmp)) { \
+				 case PIPE_CONTROL:	s = ""; break; \
+				 case PIPE_BULK:	s = "-bulk"; break; \
+				 case PIPE_INTERRUPT:	s = "-intr"; break; \
+				 default: 		s = "-iso"; break; \
+				}; s;}));
+		}
+		usb_put_urb (urb);
 
-// FIXME:  likely best to have explicit per-setting (config+alt)
-// setup primitives in the usbcore-to-hcd driver API, so nothing
-// is implicit.  kernel 2.5 needs a bunch of config cleanup...
+		/* list contents may have changed */
+		goto rescan;
+	}
+	spin_unlock_irqrestore (&hcd_data_lock, flags);
+
+	/* synchronize with the hardware, so old configuration state
+	 * clears out immediately (and will be freed).
+	 */
+	might_sleep ();
+	if (hcd->driver->endpoint_disable)
+		hcd->driver->endpoint_disable (hcd, dev, endpoint);
+}
+
+/*-------------------------------------------------------------------------*/
+
+/* called by khubd, rmmod, apmd, or other thread for hcd-private cleanup.
+ * we're guaranteed that the device is fully quiesced.  also, that each
+ * endpoint has been hcd_endpoint_disabled.
+ */
 
 static int hcd_free_dev (struct usb_device *udev)
 {
@@ -1243,9 +1353,6 @@
 		return -EINVAL;
 	}
 
-	if (hcd->driver->free_config)
-		hcd->driver->free_config (hcd, udev);
-
 	spin_lock_irqsave (&hcd_data_lock, flags);
 	list_del (&dev->dev_list);
 	udev->hcpriv = NULL;
@@ -1270,6 +1377,7 @@
 	.deallocate =		hcd_free_dev,
 	.buffer_alloc =		hcd_buffer_alloc,
 	.buffer_free =		hcd_buffer_free,
+	.disable =		hcd_endpoint_disable,
 };
 EXPORT_SYMBOL (usb_hcd_operations);
 
diff -Nru a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
--- a/drivers/usb/core/hcd.h	Sat Apr 19 19:51:46 2003
+++ b/drivers/usb/core/hcd.h	Sat Apr 19 19:51:46 2003
@@ -153,6 +153,8 @@
 			dma_addr_t *dma);
 	void (*buffer_free)(struct usb_bus *bus, size_t size,
 			void *addr, dma_addr_t dma);
+
+	void (*disable)(struct usb_device *udev, int bEndpointAddress);
 };
 
 /* each driver provides one of these, and hardware init support */
@@ -194,10 +196,9 @@
 					int mem_flags);
 	int	(*urb_dequeue) (struct usb_hcd *hcd, struct urb *urb);
 
-	// frees configuration resources -- allocated as needed during
-	// urb_enqueue, and not freed by urb_dequeue
-	void		(*free_config) (struct usb_hcd *hcd,
-				struct usb_device *dev);
+	/* hw synch, freeing endpoint resources that urb_dequeue can't */
+	void 	(*endpoint_disable)(struct usb_hcd *hcd,
+			struct hcd_dev *dev, int bEndpointAddress);
 
 	/* root hub support */
 	int		(*hub_status_data) (struct usb_hcd *hcd, char *buf);
diff -Nru a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
--- a/drivers/usb/core/hub.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/usb/core/hub.c	Sat Apr 19 19:51:47 2003
@@ -1175,8 +1175,10 @@
  *
  * Take a look at proc_resetdevice in devio.c for some sample code to
  * do this.
+ * Use this only from within your probe function, otherwise use
+ * usb_reset_device() below, which ensure proper locking
  */
-int usb_reset_device(struct usb_device *dev)
+int usb_physical_reset_device(struct usb_device *dev)
 {
 	struct usb_device *parent = dev->parent;
 	struct usb_device_descriptor *descriptor;
@@ -1305,4 +1307,17 @@
 
 	return 0;
 }
+
+int usb_reset_device(struct usb_device *udev)
+{
+	struct device *gdev = &udev->dev;
+	int r;
+	
+	down_read(&gdev->bus->subsys.rwsem);
+	r = usb_physical_reset_device(udev);
+	up_read(&gdev->bus->subsys.rwsem);
+
+	return r;
+}
+
 
diff -Nru a/drivers/usb/core/message.c b/drivers/usb/core/message.c
--- a/drivers/usb/core/message.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/usb/core/message.c	Sat Apr 19 19:51:29 2003
@@ -930,6 +930,8 @@
 	/* reset more hc/hcd endpoint state */
 	dev->toggle[0] = 0;
 	dev->toggle[1] = 0;
+	dev->halted[0] = 0;
+	dev->halted[1] = 0;
 	usb_set_maxpacket(dev);
 
 	return 0;
diff -Nru a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
--- a/drivers/usb/core/urb.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/usb/core/urb.c	Sat Apr 19 19:51:49 2003
@@ -381,16 +381,7 @@
  */
 int usb_unlink_urb(struct urb *urb)
 {
-	/* FIXME
-	 * We should not care about the state here, but the host controllers
-	 * die a horrible death if we unlink a urb for a device that has been
-	 * physically removed.
-	 */
-	if (urb &&
-	    urb->dev &&
-	    (urb->dev->state >= USB_STATE_DEFAULT) &&
-	    urb->dev->bus &&
-	    urb->dev->bus->op)
+	if (urb && urb->dev && urb->dev->bus && urb->dev->bus->op)
 		return urb->dev->bus->op->unlink_urb(urb);
 	else
 		return -ENODEV;
diff -Nru a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
--- a/drivers/usb/core/usb.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/usb/core/usb.c	Sat Apr 19 19:51:47 2003
@@ -11,7 +11,7 @@
  	more docs, etc)
  * (C) Copyright Yggdrasil Computing, Inc. 2000
  *     (usb_device_id matching changes by Adam J. Richter)
- * (C) Copyright Greg Kroah-Hartman 2002
+ * (C) Copyright Greg Kroah-Hartman 2002-2003
  *
  * NOTE! This is not actually a driver at all, rather this is
  * just a collection of helper routines that implement the
@@ -76,6 +76,8 @@
 	.remove = generic_remove,
 };
 
+static int usb_generic_driver_data;
+
 /* needs to be called with BKL held */
 int usb_device_probe(struct device *dev)
 {
@@ -89,11 +91,6 @@
 	if (!driver->probe)
 		return error;
 
-	if (!try_module_get(driver->owner)) {
-		dev_err (dev, "Can't get a module reference for %s\n", driver->name);
-		return error;
-	}
-
 	id = usb_match_id (intf, driver->id_table);
 	if (id) {
 		dev_dbg (dev, "%s - got id\n", __FUNCTION__);
@@ -104,8 +101,6 @@
 	if (!error)
 		intf->driver = driver;
 
-	module_put(driver->owner);
-
 	return error;
 }
 
@@ -117,22 +112,6 @@
 	intf = list_entry(dev,struct usb_interface,dev);
 	driver = to_usb_driver(dev->driver);
 
-	if (!driver) {
-		dev_err(dev, "%s does not have a valid driver to work with!",
-		    __FUNCTION__);
-		return -ENODEV;
-	}
-
-	if (!try_module_get(driver->owner)) {
-		// FIXME this happens even when we just rmmod
-		// drivers that aren't in active use...
-		dev_err(dev, "Dieing driver still bound to device.\n");
-		return -EIO;
-	}
-
-	/* if we sleep here on an umanaged driver 
-	 * the holder of the lock guards against 
-	 * module unload */
 	down(&driver->serialize);
 
 	if (intf->driver && intf->driver->disconnect)
@@ -143,7 +122,6 @@
 		usb_driver_release_interface(driver, intf);
 
 	up(&driver->serialize);
-	module_put(driver->owner);
 
 	return 0;
 }
@@ -498,9 +476,6 @@
 			continue;
 
 		intf = to_usb_interface(dev);
-		if (!intf)
-			continue;
-
 		if (kdev_same(intf->kdev,kdev)) {
 			return intf;
 		}
@@ -562,16 +537,13 @@
 	if (!dev)
 		return -ENODEV;
 
-	if (dev->driver == &usb_generic_driver)
+	/* Must check driver_data here, as on remove driver is always NULL */
+	if ((dev->driver == &usb_generic_driver) || 
+	    (dev->driver_data == &usb_generic_driver_data))
 		return 0;
 
 	intf = to_usb_interface(dev);
-	if (!intf)
-		return -ENODEV;
-
 	usb_dev = interface_to_usbdev (intf);
-	if (!usb_dev)
-		return -ENODEV;
 	
 	if (usb_dev->devnum < 0) {
 		dbg ("device already deleted ??");
@@ -748,8 +720,6 @@
 	struct usb_device *udev;
 
 	udev = to_usb_device(dev);
-	if (!udev)
-		return;
 
 	if (udev->bus && udev->bus->op && udev->bus->op->deallocate)
 		udev->bus->op->deallocate(udev);
@@ -820,8 +790,12 @@
  */
 void usb_disconnect(struct usb_device **pdev)
 {
-	struct usb_device * dev = *pdev;
-	int i;
+	struct usb_device	*dev = *pdev;
+	struct usb_bus		*bus = dev->bus;
+	struct usb_operations	*ops = bus->op;
+	int			i;
+
+	might_sleep ();
 
 	if (!dev)
 		return;
@@ -842,16 +816,28 @@
 			usb_disconnect(child);
 	}
 
+	/* disconnect() drivers from interfaces (a key side effect) */
 	dev_dbg (&dev->dev, "unregistering interfaces\n");
 	if (dev->actconfig) {
 		for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
-			struct usb_interface *interface = &dev->actconfig->interface[i];
+			struct usb_interface	*interface;
 
 			/* remove this interface */
+			interface = &dev->actconfig->interface[i];
 			device_unregister(&interface->dev);
 		}
 	}
 
+	/* deallocate hcd/hardware state */
+	if (ops->disable) {
+		void	(*disable)(struct usb_device *, int) = ops->disable;
+
+		for (i = 0; i < 15; i++) {
+			disable (dev, i);
+			disable (dev, USB_DIR_IN | i);
+		}
+	}
+
 	dev_dbg (&dev->dev, "unregistering device\n");
 	/* Free the device number and remove the /proc/bus/usb entry */
 	if (dev->devnum > 0) {
@@ -1012,6 +998,7 @@
 	dev->dev.driver = &usb_generic_driver;
 	dev->dev.bus = &usb_bus_type;
 	dev->dev.release = usb_release_dev;
+	dev->dev.driver_data = &usb_generic_driver_data;
 	usb_get_dev(dev);
 	if (dev->dev.bus_id[0] == 0)
 		sprintf (&dev->dev.bus_id[0], "%d-%s",
diff -Nru a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
--- a/drivers/usb/host/ehci-hcd.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/usb/host/ehci-hcd.c	Sat Apr 19 19:51:49 2003
@@ -870,80 +870,55 @@
 
 // bulk qh holds the data toggle
 
-static void ehci_free_config (struct usb_hcd *hcd, struct usb_device *udev)
+static void
+ehci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep)
 {
-	struct hcd_dev		*dev = (struct hcd_dev *)udev->hcpriv;
 	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
-	int			i;
+	int			epnum;
 	unsigned long		flags;
+	struct ehci_qh		*qh;
 
-	/* ASSERT:  no requests/urbs are still linked (so no TDs) */
+	/* ASSERT:  any requests/urbs are being unlinked */
 	/* ASSERT:  nobody can be submitting urbs for this any more */
 
-	ehci_dbg (ehci, "free_config %s devnum %d\n",
-			udev->devpath, udev->devnum);
+	ehci_dbg (ehci, "ep %02x disable\n", ep);
+	epnum = ep & USB_ENDPOINT_NUMBER_MASK;
+	if (epnum != 0 && (ep & USB_DIR_IN))
+		epnum |= 0x10;
 
+rescan:
 	spin_lock_irqsave (&ehci->lock, flags);
-	for (i = 0; i < 32; i++) {
-		if (dev->ep [i]) {
-			struct ehci_qh		*qh;
-			char			*why;
-
-			/* dev->ep never has ITDs or SITDs */
-			qh = (struct ehci_qh *) dev->ep [i];
-
-			/* detect/report non-recoverable errors */
-			if (in_interrupt ()) 
-				why = "disconnect() didn't";
-			else if ((qh->hw_info2 & cpu_to_le32 (0xffff)) != 0
-					&& qh->qh_state != QH_STATE_IDLE)
-				why = "(active periodic)";
-			else
-				why = 0;
-			if (why) {
-				err ("dev %s-%s ep %d-%s error: %s",
-					hcd_to_bus (hcd)->bus_name,
-					udev->devpath,
-					i & 0xf, (i & 0x10) ? "IN" : "OUT",
-					why);
-				BUG ();
-			}
-
-			dev->ep [i] = 0;
-			if (qh->qh_state == QH_STATE_IDLE)
-				goto idle;
-			ehci_dbg (ehci, "free_config, async ep 0x%02x qh %p",
-					i, qh);
-
-			/* scan_async() empties the ring as it does its work,
-			 * using IAA, but doesn't (yet?) turn it off.  if it
-			 * doesn't empty this qh, likely it's the last entry.
-			 */
-			while (qh->qh_state == QH_STATE_LINKED
-					&& ehci->reclaim
-					&& HCD_IS_RUNNING (ehci->hcd.state)
-					) {
-				spin_unlock_irqrestore (&ehci->lock, flags);
-				/* wait_ms() won't spin, we're a thread;
-				 * and we know IRQ/timer/... can progress
-				 */
-				wait_ms (1);
-				spin_lock_irqsave (&ehci->lock, flags);
-			}
-			if (qh->qh_state == QH_STATE_LINKED)
-				start_unlink_async (ehci, qh);
-			while (qh->qh_state != QH_STATE_IDLE
-					&& ehci->hcd.state != USB_STATE_HALT) {
-				spin_unlock_irqrestore (&ehci->lock, flags);
-				wait_ms (1);
-				spin_lock_irqsave (&ehci->lock, flags);
-			}
-idle:
+	qh = (struct ehci_qh *) dev->ep [epnum];
+	if (!qh)
+		goto done;
+
+	if (!HCD_IS_RUNNING (ehci->hcd.state))
+		qh->qh_state = QH_STATE_IDLE;
+	switch (qh->qh_state) {
+	case QH_STATE_UNLINK:		/* wait for hw to finish? */
+		spin_unlock_irqrestore (&ehci->lock, flags);
+		set_current_state (TASK_UNINTERRUPTIBLE);
+		schedule_timeout (1);
+		goto rescan;
+	case QH_STATE_IDLE:		/* fully unlinked */
+		if (list_empty (&qh->qtd_list)) {
 			qh_put (ehci, qh);
+			break;
 		}
+		/* else FALL THROUGH */
+	default:
+		/* caller was supposed to have unlinked any requests;
+		 * that's not our job.  just leak this memory.
+		 */
+		ehci_err (ehci, "qh %p (#%d) state %d%s\n",
+			qh, epnum, qh->qh_state,
+			list_empty (&qh->qtd_list) ? "" : "(has tds)");
+		break;
 	}
-
+	dev->ep [epnum] = 0;
+done:
 	spin_unlock_irqrestore (&ehci->lock, flags);
+	return;
 }
 
 /*-------------------------------------------------------------------------*/
@@ -978,7 +953,7 @@
 	 */
 	.urb_enqueue =		ehci_urb_enqueue,
 	.urb_dequeue =		ehci_urb_dequeue,
-	.free_config =		ehci_free_config,
+	.endpoint_disable =	ehci_endpoint_disable,
 
 	/*
 	 * scheduling support
diff -Nru a/drivers/usb/host/ehci-mem.c b/drivers/usb/host/ehci-mem.c
--- a/drivers/usb/host/ehci-mem.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/host/ehci-mem.c	Sat Apr 19 19:51:50 2003
@@ -62,6 +62,7 @@
 {
 	memset (qtd, 0, sizeof *qtd);
 	qtd->qtd_dma = dma;
+	qtd->hw_token = cpu_to_le32 (QTD_STS_HALT);
 	qtd->hw_next = EHCI_LIST_END;
 	qtd->hw_alt_next = EHCI_LIST_END;
 	INIT_LIST_HEAD (&qtd->qtd_list);
diff -Nru a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
--- a/drivers/usb/host/ehci-q.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/host/ehci-q.c	Sat Apr 19 19:51:50 2003
@@ -137,7 +137,10 @@
 			if (QTD_CERR (token))
 				urb->status = -EPIPE;
 			else {
-				dbg ("3strikes");
+				ehci_dbg (ehci, "devpath %s ep%d%s 3strikes\n",
+					urb->dev->devpath,
+					usb_pipeendpoint (urb->pipe),
+					usb_pipein (urb->pipe) ? "in" : "out");
 				urb->status = -EPROTO;
 			}
 		/* CERR nonzero + no errors + halt --> stall */
@@ -213,7 +216,6 @@
 	/* complete() can reenter this HCD */
 	spin_unlock (&ehci->lock);
 	usb_hcd_giveback_urb (&ehci->hcd, urb, regs);
-
 	spin_lock (&ehci->lock);
 }
 
@@ -827,7 +829,7 @@
 			 * HC is allowed to fetch the old dummy (4.10.2).
 			 */
 			token = qtd->hw_token;
-			qtd->hw_token = 0;
+			qtd->hw_token = cpu_to_le32 (QTD_STS_HALT);
 			wmb ();
 			dummy = qh->dummy;
 
@@ -879,8 +881,7 @@
 	if (usb_pipein (urb->pipe) && !usb_pipecontrol (urb->pipe))
 		epnum |= 0x10;
 
-	vdbg ("%s: submit_async urb %p len %d ep %d-%s qtd %p [qh %p]",
-		hcd_to_bus (&ehci->hcd)->bus_name,
+	ehci_vdbg (ehci, "submit_async urb %p len %d ep%d%s qtd %p [qh %p]\n",
 		urb, urb->transfer_buffer_length,
 		epnum & 0x0f, (epnum & 0x10) ? "in" : "out",
 		qtd, dev ? dev->ep [epnum] : (void *)~0);
@@ -916,7 +917,7 @@
 
 	del_timer (&ehci->watchdog);
 
-	qh->hw_next = cpu_to_le32 (qh->qh_dma);
+	// qh->hw_next = cpu_to_le32 (qh->qh_dma);
 	qh->qh_state = QH_STATE_IDLE;
 	qh->qh_next.qh = 0;
 	qh_put (ehci, qh);			// refcount from reclaim 
diff -Nru a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
--- a/drivers/usb/host/ohci-hcd.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/usb/host/ohci-hcd.c	Sat Apr 19 19:51:28 2003
@@ -313,65 +313,56 @@
  */
 
 static void
-ohci_free_config (struct usb_hcd *hcd, struct usb_device *udev)
+ohci_endpoint_disable (struct usb_hcd *hcd, struct hcd_dev *dev, int ep)
 {
 	struct ohci_hcd		*ohci = hcd_to_ohci (hcd);
-	struct hcd_dev		*dev = (struct hcd_dev *) udev->hcpriv;
-	int			i;
+	int			epnum = ep & USB_ENDPOINT_NUMBER_MASK;
 	unsigned long		flags;
+	struct ed		*ed;
 
-rescan:
-	/* free any eds, and dummy tds, still hanging around */
-	spin_lock_irqsave (&ohci->lock, flags);
-	for (i = 0; i < 32; i++) {
-		struct ed	*ed = dev->ep [i];
+	/* ASSERT:  any requests/urbs are being unlinked */
+	/* ASSERT:  nobody can be submitting urbs for this any more */
 
-		if (!ed)
-			continue;
+	ohci_dbg (ohci, "ep %02x disable\n", ep);
+	epnum <<= 1;
+	if (epnum != 0 && !(ep & USB_DIR_IN))
+		epnum |= 1;
 
-		if (ohci->disabled && ed->state != ED_IDLE)
-			ed->state = ED_IDLE;
-		switch (ed->state) {
-		case ED_UNLINK:		/* wait a frame? */
-			goto do_rescan;
-		case ED_IDLE:		/* fully unlinked */
+rescan:
+	spin_lock_irqsave (&ohci->lock, flags);
+	ed = dev->ep [epnum];
+	if (!ed)
+		goto done;
+
+	if (!HCD_IS_RUNNING (ohci->hcd.state) || ohci->disabled)
+		ed->state = ED_IDLE;
+	switch (ed->state) {
+	case ED_UNLINK:		/* wait for hw to finish? */
+		spin_unlock_irqrestore (&ohci->lock, flags);
+		set_current_state (TASK_UNINTERRUPTIBLE);
+		schedule_timeout (1);
+		goto rescan;
+	case ED_IDLE:		/* fully unlinked */
+		if (list_empty (&ed->td_list)) {
 			td_free (ohci, ed->dummy);
+			ed_free (ohci, ed);
 			break;
-		default:
-			ohci_err (ohci,
-				"dev %s ep%d-%s linked; disconnect() bug?\n",
-				udev->devpath,
-				(i >> 1) & 0x0f, (i & 1) ? "out" : "in");
-
-			/* ED_OPER: some driver disconnect() is broken,
-			 * it didn't even start its unlinks much less wait
-			 * for their completions.
-			 * OTHERWISE:  hcd bug, ed is garbage
-			 *
-			 * ... we can't recycle this memory in either case,
-			 * so just leak it to avoid oopsing.
-			 */
-			continue;
 		}
-		ed_free (ohci, ed);
+		/* else FALL THROUGH */
+	default:
+		/* caller was supposed to have unlinked any requests;
+		 * that's not our job.  can't recover; must leak ed.
+		 */
+		ohci_err (ohci, "ed %p (#%d) state %d%s\n",
+			ed, epnum, ed->state,
+			list_empty (&ed->td_list) ? "" : "(has tds)");
+		td_free (ohci, ed->dummy);
+		break;
 	}
+	dev->ep [epnum] = 0;
+done:
 	spin_unlock_irqrestore (&ohci->lock, flags);
 	return;
-
-do_rescan:
-#ifdef DEBUG
-	/* a driver->disconnect() returned before its unlinks completed? */
-	if (in_interrupt ()) {
-		ohci_warn (ohci,
-			"driver disconnect() bug %s ep%d-%s\n", 
-			udev->devpath,
-			(i >> 1) & 0x0f, (i & 1) ? "out" : "in");
-	}
-#endif
-
-	spin_unlock_irqrestore (&ohci->lock, flags);
-	wait_ms (1);
-	goto rescan;
 }
 
 static int ohci_get_frame (struct usb_hcd *hcd)
@@ -429,6 +420,8 @@
 	ohci->hc_control = readl (&ohci->regs->control);
 	ohci->hc_control &= OHCI_CTRL_RWC;	/* hcfs 0 = RESET */
 	writel (ohci->hc_control, &ohci->regs->control);
+	// flush those pci writes
+	(void) readl (&ohci->regs->control);
 	wait_ms (50);
 
 	/* HC Reset requires max 10 us delay */
@@ -450,6 +443,8 @@
 	 * this if we write fmInterval after we're OPERATIONAL.
 	 */
 	writel (ohci->hc_control, &ohci->regs->control);
+	// flush those pci writes
+	(void) readl (&ohci->regs->control);
 
 	return 0;
 }
@@ -524,6 +519,8 @@
 	writel (tmp, &ohci->regs->roothub.a);
 	writel (RH_HS_LPSC, &ohci->regs->roothub.status);
 	writel (0, &ohci->regs->roothub.b);
+	// flush those pci writes
+	(void) readl (&ohci->regs->control);
 
 	// POTPGT delay is bits 24-31, in 2 ms units.
 	mdelay ((roothub_a (ohci) >> 23) & 0x1fe);
@@ -610,6 +607,8 @@
 
 	writel (ints, &regs->intrstatus);
 	writel (OHCI_INTR_MIE, &regs->intrenable);	
+	// flush those pci writes
+	(void) readl (&ohci->regs->control);
 }
 
 /*-------------------------------------------------------------------------*/
diff -Nru a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c
--- a/drivers/usb/host/ohci-pci.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/usb/host/ohci-pci.c	Sat Apr 19 19:51:49 2003
@@ -334,7 +334,7 @@
 	 */
 	.urb_enqueue =		ohci_urb_enqueue,
 	.urb_dequeue =		ohci_urb_dequeue,
-	.free_config =		ohci_free_config,
+	.endpoint_disable =	ohci_endpoint_disable,
 
 	/*
 	 * scheduling support
diff -Nru a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c
--- a/drivers/usb/host/ohci-q.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/host/ohci-q.c	Sat Apr 19 19:51:50 2003
@@ -446,6 +446,8 @@
 	if (!ohci->sleeping) {
 		writel (OHCI_INTR_SF, &ohci->regs->intrstatus);
 		writel (OHCI_INTR_SF, &ohci->regs->intrenable);
+		// flush those pci writes
+		(void) readl (&ohci->regs->control);
 	}
 }
 
diff -Nru a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c
--- a/drivers/usb/host/ohci-sa1111.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/usb/host/ohci-sa1111.c	Sat Apr 19 19:51:47 2003
@@ -333,7 +333,7 @@
 	 */
 	.urb_enqueue =		ohci_urb_enqueue,
 	.urb_dequeue =		ohci_urb_dequeue,
-	.free_config =		ohci_free_config,
+	.endpoint_disable =	ohci_endpoint_disable,
 
 	/*
 	 * scheduling support
diff -Nru a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
--- a/drivers/usb/host/uhci-hcd.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/host/uhci-hcd.c	Sat Apr 19 19:51:50 2003
@@ -2390,7 +2390,6 @@
 
 	.urb_enqueue =		uhci_urb_enqueue,
 	.urb_dequeue =		uhci_urb_dequeue,
-	.free_config =		NULL,
 
 	.get_frame_number =	uhci_hcd_get_frame_number,
 
diff -Nru a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c
--- a/drivers/usb/image/mdc800.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/usb/image/mdc800.c	Sat Apr 19 19:51:48 2003
@@ -806,7 +806,7 @@
 		}
 		else
 		{
-			err ("Command is to long !\n");
+			err ("Command is too long !\n");
 			up (&mdc800->io_lock);
 			return -EIO;
 		}
diff -Nru a/drivers/usb/image/scanner.c b/drivers/usb/image/scanner.c
--- a/drivers/usb/image/scanner.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/usb/image/scanner.c	Sat Apr 19 19:51:29 2003
@@ -355,6 +355,10 @@
  *      is closed and disconnected. Avoids crashes when writing to a 
  *      disconnected device. (Thanks to Greg KH).
  *
+ * 0.4.12  2003-04-11
+ *    - Fixed endpoint detection. The endpoints were numbered from 1 to n but
+ *      that assumption is not correct in all cases.
+ *
  * TODO
  *    - Performance
  *    - Select/poll methods
@@ -957,7 +961,7 @@
 				info ("probe_scanner: ignoring additional bulk_in_ep:%d", ep_cnt);
 				continue;
 			}
-			have_bulk_in = ep_cnt;
+			have_bulk_in = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 			dbg("probe_scanner: bulk_in_ep:%d", have_bulk_in);
 			continue;
 		}
@@ -968,7 +972,7 @@
 				info ("probe_scanner: ignoring additional bulk_out_ep:%d", ep_cnt);
 				continue;
 			}
-			have_bulk_out = ep_cnt;
+			have_bulk_out = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 			dbg("probe_scanner: bulk_out_ep:%d", have_bulk_out);
 			continue;
 		}
@@ -979,7 +983,7 @@
 				info ("probe_scanner: ignoring additional intr_ep:%d", ep_cnt);
 				continue;
 			}
-			have_intr = ep_cnt;
+			have_intr = endpoint->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
 			dbg("probe_scanner: intr_ep:%d", have_intr);
 			continue;
 		}
diff -Nru a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c
--- a/drivers/usb/input/hid-core.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/usb/input/hid-core.c	Sat Apr 19 19:51:48 2003
@@ -1664,6 +1664,9 @@
 	.probe =	hid_probe,
 	.disconnect =	hid_disconnect,
 	.id_table =	hid_usb_ids,
+	.driver	= {
+		.devclass = &input_devclass,
+	},
 };
 
 static int __init hid_init(void)
diff -Nru a/drivers/usb/input/kbtab.c b/drivers/usb/input/kbtab.c
--- a/drivers/usb/input/kbtab.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/usb/input/kbtab.c	Sat Apr 19 19:51:27 2003
@@ -91,7 +91,7 @@
 }
 
 struct usb_device_id kbtab_ids[] = {
-	{ USB_DEVICE(USB_VENDOR_ID_KBGEAR, 0x1001), driver_info : 0 },
+	{ USB_DEVICE(USB_VENDOR_ID_KBGEAR, 0x1001), .driver_info = 0 },
 	{ }
 };
 
diff -Nru a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c
--- a/drivers/usb/input/usbkbd.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/input/usbkbd.c	Sat Apr 19 19:51:50 2003
@@ -359,6 +359,9 @@
 	.probe =	usb_kbd_probe,
 	.disconnect =	usb_kbd_disconnect,
 	.id_table =	usb_kbd_id_table,
+	.driver	= {
+		.devclass = &input_devclass,
+	},
 };
 
 static int __init usb_kbd_init(void)
diff -Nru a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c
--- a/drivers/usb/input/usbmouse.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/input/usbmouse.c	Sat Apr 19 19:51:50 2003
@@ -242,6 +242,9 @@
 	.probe		= usb_mouse_probe,
 	.disconnect	= usb_mouse_disconnect,
 	.id_table	= usb_mouse_id_table,
+	.driver	= {
+		.devclass = &input_devclass,
+	},
 };
 
 static int __init usb_mouse_init(void)
diff -Nru a/drivers/usb/misc/Kconfig b/drivers/usb/misc/Kconfig
--- a/drivers/usb/misc/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/misc/Kconfig	Sat Apr 19 19:51:50 2003
@@ -94,7 +94,7 @@
 	  a module, say M here and read <file:Documentation/modules.txt>.
 
 config USB_SPEEDTOUCH
-	tristate "Alcatel Speedtouch ADSL USB Modem"
+	tristate "Alcatel Speedtouch USB support"
 	depends on USB && ATM
 	help
 	  Say Y here if you have an Alcatel SpeedTouch USB or SpeedTouch 330
diff -Nru a/drivers/usb/misc/speedtch.c b/drivers/usb/misc/speedtch.c
--- a/drivers/usb/misc/speedtch.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/usb/misc/speedtch.c	Sat Apr 19 19:51:51 2003
@@ -278,9 +278,10 @@
 
 		/* here should the header CRC check be... */
 
-		if (!(vcc = udsl_find_vcc (instance, vpi, vci)))
+		if (!(vcc = udsl_find_vcc (instance, vpi, vci))) {
 			dbg ("udsl_decode_rawcell: no vcc found for packet on vpi %d, vci %d", vpi, vci);
-		else {
+			__skb_pull (skb, min (skb->len, (unsigned) 53));
+		} else {
 			dbg ("udsl_decode_rawcell found vcc %p for packet on vpi %d, vci %d", vcc, vpi, vci);
 
 			if (skb->len >= 53) {
@@ -323,8 +324,8 @@
 				skb_pull (skb, 53);
 			} else {
 				/* If data is corrupt and skb doesn't hold a whole cell, flush the lot */
-				if (skb_pull (skb, 53) == NULL)
-					return NULL;
+				__skb_pull (skb, skb->len);
+				return NULL;
 			}
 		}
 	}
@@ -933,15 +934,24 @@
 	if (vcc->qos.aal != ATM_AAL5)
 		return -EINVAL;
 
+	if (!instance->firmware_loaded) {
+		dbg ("firmware not loaded!");
+		return -EAGAIN;
+	}
+
+	MOD_INC_USE_COUNT;
+
 	down (&instance->serialize); /* vs self, udsl_atm_close */
 
 	if (udsl_find_vcc (instance, vpi, vci)) {
 		up (&instance->serialize);
+		MOD_DEC_USE_COUNT;
 		return -EADDRINUSE;
 	}
 
 	if (!(new = kmalloc (sizeof (struct udsl_vcc_data), GFP_KERNEL))) {
 		up (&instance->serialize);
+		MOD_DEC_USE_COUNT;
 		return -ENOMEM;
 	}
 
@@ -967,10 +977,7 @@
 
 	dbg ("Allocated new SARLib vcc 0x%p with vpi %d vci %d", new, vpi, vci);
 
-	MOD_INC_USE_COUNT;
-
-	if (instance->firmware_loaded)
-		udsl_fire_receivers (instance);
+	udsl_fire_receivers (instance);
 
 	dbg ("udsl_atm_open successful");
 
@@ -1034,6 +1041,24 @@
 **  USB  **
 **********/
 
+static int udsl_set_alternate (struct udsl_instance_data *instance)
+{
+	down (&instance->serialize); /* vs self */
+	if (!instance->firmware_loaded) {
+		int ret;
+
+		if ((ret = usb_set_interface (instance->usb_dev, 1, 1)) < 0) {
+			dbg ("usb_set_interface returned %d!", ret);
+			up (&instance->serialize);
+			return ret;
+		}
+		instance->firmware_loaded = 1;
+	}
+	up (&instance->serialize);
+	udsl_fire_receivers (instance);
+	return 0;
+}
+
 static int udsl_usb_ioctl (struct usb_interface *intf, unsigned int code, void *user_data)
 {
 	struct udsl_instance_data *instance = usb_get_intfdata (intf);
@@ -1048,14 +1073,7 @@
 	switch (code) {
 	case UDSL_IOCTL_START:
 		instance->atm_dev->signal = ATM_PHY_SIG_FOUND;
-		down (&instance->serialize); /* vs self */
-		if (!instance->firmware_loaded) {
-			usb_set_interface (instance->usb_dev, 1, 1);
-			instance->firmware_loaded = 1;
-		}
-		up (&instance->serialize);
-		udsl_fire_receivers (instance);
-		return 0;
+		return udsl_set_alternate (instance);
 	case UDSL_IOCTL_STOP:
 		instance->atm_dev->signal = ATM_PHY_SIG_LOST;
 		return 0;
diff -Nru a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c
--- a/drivers/usb/misc/uss720.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/usb/misc/uss720.c	Sat Apr 19 19:51:27 2003
@@ -493,54 +493,42 @@
 	return rlen;
 }
 
-void parport_uss720_inc_use_count(void)
-{
-	MOD_INC_USE_COUNT;
-}
-
-void parport_uss720_dec_use_count(void)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 /* --------------------------------------------------------------------- */
 
 static struct parport_operations parport_uss720_ops = 
 {
-	parport_uss720_write_data,
-	parport_uss720_read_data,
-
-	parport_uss720_write_control,
-	parport_uss720_read_control,
-	parport_uss720_frob_control,
-
-	parport_uss720_read_status,
-
-	parport_uss720_enable_irq,
-	parport_uss720_disable_irq,
-
-	parport_uss720_data_forward,
-	parport_uss720_data_reverse,
-
-	parport_uss720_init_state,
-	parport_uss720_save_state,
-	parport_uss720_restore_state,
-
-	parport_uss720_inc_use_count,
-	parport_uss720_dec_use_count,
-
-	parport_uss720_epp_write_data,
-	parport_uss720_epp_read_data,
-	parport_uss720_epp_write_addr,
-	parport_uss720_epp_read_addr,
-
-	parport_uss720_ecp_write_data,
-	parport_uss720_ecp_read_data,
-	parport_uss720_ecp_write_addr,
-
-	parport_uss720_write_compat,
-	parport_ieee1284_read_nibble,
-	parport_ieee1284_read_byte,
+	.owner =		THIS_MODULE,
+	.write_data =		parport_uss720_write_data,
+	.read_data =		parport_uss720_read_data,
+
+	.write_control =	parport_uss720_write_control,
+	.read_control =		parport_uss720_read_control,
+	.frob_control =		parport_uss720_frob_control,
+
+	.read_status =		parport_uss720_read_status,
+
+	.enable_irq =		parport_uss720_enable_irq,
+	.disable_irq =		parport_uss720_disable_irq,
+
+	.data_forward =		parport_uss720_data_forward,
+	.data_reverse =		parport_uss720_data_reverse,
+
+	.init_state =		parport_uss720_init_state,
+	.save_state =		parport_uss720_save_state,
+	.restore_state =	parport_uss720_restore_state,
+
+	.epp_write_data =	parport_uss720_epp_write_data,
+	.epp_read_data =	parport_uss720_epp_read_data,
+	.epp_write_addr =	parport_uss720_epp_write_addr,
+	.epp_read_addr =	parport_uss720_epp_read_addr,
+
+	.ecp_write_data =	parport_uss720_ecp_write_data,
+	.ecp_read_data =	parport_uss720_ecp_read_data,
+	.ecp_write_addr =	parport_uss720_ecp_write_addr,
+
+	.compat_write_data =	parport_uss720_write_compat,
+	.nibble_read_data =	parport_ieee1284_read_nibble,
+	.byte_read_data =	parport_ieee1284_read_byte,
 };
 
 /* --------------------------------------------------------------------- */
@@ -607,7 +595,6 @@
 	parport_proc_register(pp);
 	parport_announce_port(pp);
 
-	MOD_INC_USE_COUNT;
 	usb_set_intfdata (intf, pp);
 	return 0;
 
@@ -635,7 +622,6 @@
 		parport_proc_unregister(pp);
 		parport_unregister_port(pp);
 		kfree(priv);
-		MOD_DEC_USE_COUNT;
 	}
 }
 
@@ -652,6 +638,7 @@
 
 
 static struct usb_driver uss720_driver = {
+	.owner =	THIS_MODULE,
 	.name =		"uss720",
 	.probe =	uss720_probe,
 	.disconnect =	uss720_disconnect,
diff -Nru a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c
--- a/drivers/usb/net/pegasus.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/net/pegasus.c	Sat Apr 19 19:51:50 2003
@@ -45,7 +45,7 @@
 /*
  * Version Information
  */
-#define DRIVER_VERSION "v0.5.9 (2002/12/31)"
+#define DRIVER_VERSION "v0.5.10 (2003/04/01)"
 #define DRIVER_AUTHOR "Petko Manolov <petkan@users.sourceforge.net>"
 #define DRIVER_DESC "Pegasus/Pegasus II USB Ethernet driver"
 
@@ -121,7 +121,7 @@
 	char *buffer;
 	DECLARE_WAITQUEUE(wait, current);
 
-	buffer = kmalloc(size, GFP_KERNEL);
+	buffer = kmalloc(size, GFP_DMA);
 	if (!buffer) {
 		warn("%s: looks like we're out of memory", __FUNCTION__);
 		return -ENOMEM;
@@ -170,7 +170,7 @@
 	char *buffer;
 	DECLARE_WAITQUEUE(wait, current);
 
-	buffer = kmalloc(size, GFP_KERNEL);
+	buffer = kmalloc(size, GFP_DMA);
 	if (!buffer) {
 		warn("%s: looks like we're out of memory", __FUNCTION__);
 		return -ENOMEM;
@@ -218,7 +218,7 @@
 	char *tmp;
 	DECLARE_WAITQUEUE(wait, current);
 
-	tmp = kmalloc(1, GFP_KERNEL);
+	tmp = kmalloc(1, GFP_DMA);
 	if (!tmp) {
 		warn("%s: looks like we're out of memory", __FUNCTION__);
 		return -ENOMEM;
@@ -233,7 +233,7 @@
 
 	pegasus->dr.bRequestType = PEGASUS_REQT_WRITE;
 	pegasus->dr.bRequest = PEGASUS_REQ_SET_REG;
-	pegasus->dr.wValue = cpu_to_le16p(&data);
+	pegasus->dr.wValue = cpu_to_le16(data);
 	pegasus->dr.wIndex = cpu_to_le16p(&indx);
 	pegasus->dr.wLength = cpu_to_le16(1);
 	pegasus->ctrl_urb->transfer_buffer_length = 1;
@@ -711,11 +711,11 @@
 			pegasus->stats.tx_aborted_errors++;
 		if (d[0] & LATE_COL)
 			pegasus->stats.tx_window_errors++;
-		if (d[0] & (NO_CARRIER | LOSS_CARRIER)) {
-			pegasus->stats.tx_carrier_errors++;
-			netif_carrier_off(net);
-		} else {
+		if (d[5] & LINK_STATUS) {
 			netif_carrier_on(net);
+		} else {
+			pegasus->stats.tx_carrier_errors++;
+			netif_carrier_off(net);	
 		}
 	}
 
@@ -1171,10 +1171,6 @@
 	pegasus_t *pegasus;
 	int dev_index = id - pegasus_ids;
 
-	if (usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue)) {
-		err("usb_set_configuration() failed");
-		return -ENODEV;
-	}
 	if (!(pegasus = kmalloc(sizeof (struct pegasus), GFP_KERNEL))) {
 		err("out of memory allocating device structure");
 		return -ENOMEM;
diff -Nru a/drivers/usb/net/pegasus.h b/drivers/usb/net/pegasus.h
--- a/drivers/usb/net/pegasus.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/net/pegasus.h	Sat Apr 19 19:51:50 2003
@@ -52,6 +52,8 @@
 #define	LOSS_CARRIER		0x08
 #define	JABBER_TIMEOUT		0x04
 
+#define	LINK_STATUS		0x01
+
 #define	PEGASUS_REQT_READ	0xc0
 #define	PEGASUS_REQT_WRITE	0x40
 #define	PEGASUS_REQ_GET_REGS	0xf0
diff -Nru a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c
--- a/drivers/usb/net/rtl8150.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/usb/net/rtl8150.c	Sat Apr 19 19:51:49 2003
@@ -791,10 +791,6 @@
 	rtl8150_t *dev;
 	struct net_device *netdev;
 
-	if (usb_set_configuration(udev, udev->config[0].desc.bConfigurationValue)) {
-		err("usb_set_configuration() failed");
-		return -EIO;
-	}
 	dev = kmalloc(sizeof(rtl8150_t), GFP_KERNEL);
 	if (!dev) {
 		err("Out of memory");
diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
--- a/drivers/usb/net/usbnet.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/usb/net/usbnet.c	Sat Apr 19 19:51:48 2003
@@ -122,6 +122,11 @@
  * 		cleanups and stubbed PXA-250 support (db), fix for framing
  * 		issues on Z, net1080, and gl620a (Toby Milne)
  *
+ * 31-mar-2003	Use endpoint descriptors:  high speed support, simpler sa1100
+ * 		vs pxa25x, and CDC Ethernet.  Throttle down log floods on
+ * 		disconnect; other cleanups. (db)  Flush net1080 fifos
+ * 		after several sequential framing errors. (Johannes Erdfelt)
+ *
  *-------------------------------------------------------------------------*/
 
 #include <linux/config.h>
@@ -155,16 +160,17 @@
 /* minidrivers _could_ be individually configured */
 #define	CONFIG_USB_AN2720
 #define	CONFIG_USB_BELKIN
+#undef	CONFIG_USB_CDCETHER
+//#define	CONFIG_USB_CDCETHER		/* NYET */
 #define	CONFIG_USB_EPSON2888
 #define	CONFIG_USB_GENESYS
 #define	CONFIG_USB_NET1080
 #define	CONFIG_USB_PL2301
-// #define	CONFIG_USB_PXA
-#define	CONFIG_USB_SA1100
+#define	CONFIG_USB_ARMLINUX
 #define	CONFIG_USB_ZAURUS
 
 
-#define DRIVER_VERSION		"18-Oct-2002"
+#define DRIVER_VERSION		"31-Mar-2003"
 
 /*-------------------------------------------------------------------------*/
 
@@ -176,11 +182,11 @@
  * Ethernet packets (so queues should be bigger).
  */
 #ifdef REALLY_QUEUE
-#define	RX_QLEN		4
-#define	TX_QLEN		4
+#define	RX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4)
+#define	TX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4)
 #else
-#define	RX_QLEN		1
-#define	TX_QLEN		1
+#define	RX_QLEN(dev)		1
+#define	TX_QLEN(dev)		1
 #endif
 
 // packets are always ethernet inside
@@ -191,6 +197,10 @@
 // reawaken network queue this soon after stopping; else watchdog barks
 #define TX_TIMEOUT_JIFFIES	(5*HZ)
 
+// throttle rx/tx briefly after some faults, so khubd might disconnect()
+// us (it polls at HZ/4 usually) before we report too many false errors.
+#define THROTTLE_JIFFIES	(HZ/8)
+
 // for vendor-specific control operations
 #define	CONTROL_TIMEOUT_MS	(500)			/* msec */
 #define CONTROL_TIMEOUT_JIFFIES ((CONTROL_TIMEOUT_MS * HZ)/1000)
@@ -200,10 +210,6 @@
 
 /*-------------------------------------------------------------------------*/
 
-// list of all devices we manage
-static DECLARE_MUTEX (usbnet_mutex);
-static LIST_HEAD (usbnet_list);
-
 // randomly generated ethernet address
 static u8	node_id [ETH_ALEN];
 
@@ -213,17 +219,18 @@
 	struct usb_device	*udev;
 	struct driver_info	*driver_info;
 	struct semaphore	mutex;
-	struct list_head	dev_list;
 	wait_queue_head_t	*wait;
 
+	// i/o info: pipes etc
+	unsigned		in, out;
+	unsigned		maxpacket;
+	struct timer_list	delay;
+
 	// protocol/interface state
 	struct net_device	net;
 	struct net_device_stats	stats;
 	int			msg_level;
-
-#ifdef CONFIG_USB_NET1080
-	u16			packet_id;
-#endif
+	unsigned long		data [5];
 
 	// various kinds of pending driver work
 	struct sk_buff_head	rxq;
@@ -231,7 +238,7 @@
 	struct sk_buff_head	done;
 	struct tasklet_struct	bh;
 
-	struct work_struct			kevent;
+	struct work_struct	kevent;
 	unsigned long		flags;
 #		define EVENT_TX_HALT	0
 #		define EVENT_RX_HALT	1
@@ -243,11 +250,19 @@
 	char		*description;
 
 	int		flags;
+/* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */
 #define FLAG_FRAMING_NC	0x0001		/* guard against device dropouts */ 
 #define FLAG_FRAMING_GL	0x0002		/* genelink batches packets */
 #define FLAG_FRAMING_Z	0x0004		/* zaurus adds a trailer */
+
 #define FLAG_NO_SETINT	0x0010		/* device can't set_interface() */
 
+	/* init device ... can sleep, or cause probe() failure */
+	int	(*bind)(struct usbnet *, struct usb_interface *);
+
+	/* cleanup device ... can sleep, but can't fail */
+	void	(*unbind)(struct usbnet *, struct usb_interface *);
+
 	/* reset device ... can sleep */
 	int	(*reset)(struct usbnet *);
 
@@ -263,15 +278,13 @@
 
 	// FIXME -- also an interrupt mechanism
 	// useful for at least PL2301/2302 and GL620USB-A
+	// and CDC use them to report 'is it connected' changes
 
-	/* framework currently "knows" bulk EPs talk packets */
+	/* for new devices, use the descriptor-reading code instead */
 	int		in;		/* rx endpoint */
 	int		out;		/* tx endpoint */
-	int		epsize;
 };
 
-#define EP_SIZE(usbnet)	((usbnet)->driver_info->epsize)
-
 // we record the state for each of our queued skbs
 enum skb_state {
 	illegal = 0,
@@ -300,14 +313,6 @@
 #define	RUN_CONTEXT (in_irq () ? "in_irq" \
 			: (in_interrupt () ? "in_interrupt" : "can sleep"))
 
-/* mostly for PDA style devices, which are always present */
-static int always_connected (struct usbnet *dev)
-{
-	return 0;
-}
-
-/*-------------------------------------------------------------------------*/
-
 #ifdef DEBUG
 #define devdbg(usbnet, fmt, arg...) \
 	printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net.name, ## arg)
@@ -315,11 +320,76 @@
 #define devdbg(usbnet, fmt, arg...) do {} while(0)
 #endif
 
+#define deverr(usbnet, fmt, arg...) \
+	printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net.name, ## arg)
+#define devwarn(usbnet, fmt, arg...) \
+	printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net.name, ## arg)
+
 #define devinfo(usbnet, fmt, arg...) \
 	do { if ((usbnet)->msg_level >= 1) \
 	printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net.name, ## arg); \
 	} while (0)
 
+/*-------------------------------------------------------------------------*/
+
+/* mostly for PDA style devices, which are always connected if present */
+static int always_connected (struct usbnet *dev)
+{
+	return 0;
+}
+
+/* handles CDC Ethernet and many other network "bulk data" interfaces */
+static int
+get_endpoints (struct usbnet *dev, struct usb_interface *intf)
+{
+	int				tmp;
+	struct usb_host_interface	*alt;
+	struct usb_host_endpoint	*in, *out;
+
+	for (tmp = 0; tmp < intf->max_altsetting; tmp++) {
+		unsigned	ep;
+
+		in = out = 0;
+		alt = intf->altsetting + tmp;
+
+		/* take the first altsetting with in-bulk + out-bulk;
+		 * ignore other endpoints and altsetttings.
+		 */
+		for (ep = 0; ep < alt->desc.bNumEndpoints; ep++) {
+			struct usb_host_endpoint	*e;
+
+			e = alt->endpoint + ep;
+			if (e->desc.bmAttributes != USB_ENDPOINT_XFER_BULK)
+				continue;
+			if (e->desc.bEndpointAddress & USB_DIR_IN) {
+				if (!in)
+					in = e;
+			} else {
+				if (!out)
+					out = e;
+			}
+			if (in && out)
+				goto found;
+		}
+	}
+	return -EINVAL;
+
+found:
+	if (alt->desc.bAlternateSetting != 0
+			|| !(dev->driver_info->flags & FLAG_NO_SETINT)) {
+		tmp = usb_set_interface (dev->udev, alt->desc.bInterfaceNumber,
+				alt->desc.bAlternateSetting);
+		if (tmp < 0)
+			return tmp;
+	}
+	
+	dev->in = usb_rcvbulkpipe (dev->udev,
+			in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
+	dev->out = usb_sndbulkpipe (dev->udev,
+			out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
+	return 0;
+}
+
 
 #ifdef	CONFIG_USB_AN2720
 
@@ -340,7 +410,6 @@
 	// no check_connect available!
 
 	.in = 2, .out = 2,		// direction distinguishes these
-	.epsize =64,
 };
 
 #endif	/* CONFIG_USB_AN2720 */
@@ -359,15 +428,226 @@
 
 static const struct driver_info	belkin_info = {
 	.description =	"Belkin, eTEK, or compatible",
-
-	.in = 1, .out = 1,		// direction distinguishes these
-	.epsize =64,
 };
 
 #endif	/* CONFIG_USB_BELKIN */
 
 
 
+#if	defined (CONFIG_USB_CDCETHER) || defined (CONFIG_USB_ZAURUS)
+
+/*-------------------------------------------------------------------------
+ *
+ * Communications Device Class, Ethernet Control model
+ * 
+ * Takes two interfaces.  The DATA interface is inactive till an altsetting
+ * is selected.  Configuration data includes class descriptors.
+ *
+ * Zaurus uses nonstandard framing, but is otherwise CDC Ether.
+ *
+ *-------------------------------------------------------------------------*/
+
+/* "Header Functional Descriptor" from CDC spec  5.2.3.1 */
+struct header_desc {
+	u8	bLength;
+	u8	bDescriptorType;
+	u8	bDescriptorSubType;
+
+	u16	bcdCDC;
+} __attribute__ ((packed));
+
+/* "Union Functional Descriptor" from CDC spec 5.2.3.X */
+struct union_desc {
+	u8	bLength;
+	u8	bDescriptorType;
+	u8	bDescriptorSubType;
+
+	u8	bMasterInterface0;
+	u8	bSlaveInterface0;
+	/* ... and there could be other slave interfaces */
+} __attribute__ ((packed));
+
+/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */
+struct ether_desc {
+	u8	bLength;
+	u8	bDescriptorType;
+	u8	bDescriptorSubType;
+
+	u8	iMACAddress;
+	u32	bmEthernetStatistics;
+	u16	wMaxSegmentSize;
+	u16	wNumberMCFilters;
+	u8	bNumberPowerFilters;
+} __attribute__ ((packed));
+
+struct cdc_info {
+	struct header_desc	*header;
+	struct union_desc	*u;
+	struct ether_desc	*ether;
+	struct usb_interface	*control;
+	struct usb_interface	*data;
+};
+
+#include <linux/ctype.h>
+
+static u8 nibble (unsigned char c)
+{
+	if (likely (isdigit (c)))
+		return c - '0';
+	c = toupper (c);
+	if (likely (isxdigit (c)))
+		return 10 + c - 'A';
+	return 0;
+}
+
+static inline int get_ethernet_addr (struct usbnet *dev, struct ether_desc *e)
+{
+	int 		tmp, i;
+	unsigned char	buf [13];
+
+	tmp = usb_string (dev->udev, e->iMACAddress, buf, sizeof buf);
+	if (tmp < 0)
+		return tmp;
+	else if (tmp != 12)
+		return -EINVAL;
+	for (i = tmp = 0; i < 6; i++, tmp += 2)
+		dev->net.dev_addr [i] =
+			 (nibble (buf [tmp]) << 4) + nibble (buf [tmp + 1]);
+	return 0;
+}
+
+static struct usb_driver usbnet_driver;
+
+static int cdc_bind (struct usbnet *dev, struct usb_interface *intf)
+{
+	u8				*buf = intf->altsetting->extra;
+	int				len = intf->altsetting->extralen;
+	struct usb_interface_descriptor	*d;
+	struct cdc_info			*info = (void *) &dev->data;
+	int				status;
+
+	if (sizeof dev->data < sizeof *info)
+		return -EDOM;
+
+	/* expect strict spec conformance for the descriptors */
+	memset (info, 0, sizeof *info);
+	info->control = intf;
+	while (len > 3) {
+		/* ignore bDescriptorType != CS_INTERFACE */
+		if (buf [1] != 0x24)
+			goto next_desc;
+
+		/* bDescriptorSubType identifies three "must have" descriptors;
+		 * save them for later.
+		 */
+		switch (buf [2]) {
+		case 0x00:		/* Header, mostly useless */
+			if (info->header)
+				goto bad_desc;
+			info->header = (void *) buf;
+			if (info->header->bLength != sizeof *info->header)
+				goto bad_desc;
+			break;
+		case 0x06:		/* Union (groups interfaces) */
+			if (info->u)
+				goto bad_desc;
+			info->u = (void *) buf;
+			if (info->u->bLength != sizeof *info->u)
+				goto bad_desc;
+			d = &intf->altsetting->desc;
+			if (info->u->bMasterInterface0 != d->bInterfaceNumber)
+				goto bad_desc;
+			info->data = dev->udev->actconfig->interface;
+			if (intf != (info->data + info->u->bMasterInterface0))
+				goto bad_desc;
+
+			/* a data interface altsetting does the real i/o */
+			info->data += info->u->bSlaveInterface0;
+			d = &info->data->altsetting->desc;
+			if (info->u->bSlaveInterface0 != d->bInterfaceNumber
+				    || d->bInterfaceClass != USB_CLASS_CDC_DATA)
+				goto bad_desc;
+			if (usb_interface_claimed (info->data))
+				return -EBUSY;
+			break;
+		case 0x0F:		/* Ethernet Networking */
+			if (info->ether)
+				goto bad_desc;
+			info->ether = (void *) buf;
+			if (info->ether->bLength != sizeof *info->ether)
+				goto bad_desc;
+			break;
+		}
+next_desc:
+		len -= buf [0];	/* bLength */
+		buf += buf [0];
+	}
+	if (!info->header || !info ->u || !info->ether)
+		goto bad_desc;
+
+	status = get_ethernet_addr (dev, info->ether);
+	if (status < 0)
+		return status;
+
+	/* claim data interface and set it up ... with side effects.
+	 * network traffic can't flow until an altsetting is enabled.
+	 */
+	usb_driver_claim_interface (&usbnet_driver, info->data, dev);
+	status = get_endpoints (dev, info->data);
+	if (status < 0) {
+		usb_driver_release_interface (&usbnet_driver, info->data);
+		return status;
+	}
+
+	/* FIXME cdc-ether has some multicast code too, though it complains
+	 * in routine cases.  info->ether describes the multicast support.
+	 */
+
+	dev->net.mtu = cpu_to_le16p (&info->ether->wMaxSegmentSize)
+		- ETH_HLEN;
+	if ((dev->driver_info->flags & FLAG_FRAMING_Z) == 0)
+		strcpy (dev->net.name, "eth%d");
+	return 0;
+
+bad_desc:
+	// devdbg (dev, "bad CDC descriptors");
+	return -ENODEV;
+}
+
+static void cdc_unbind (struct usbnet *dev, struct usb_interface *intf)
+{
+	struct cdc_info			*info = (void *) &dev->data;
+
+	/* disconnect master --> disconnect slave */
+	if (intf == info->control && info->data) {
+		usb_driver_release_interface (&usbnet_driver, info->data);
+		info->data = 0;
+	}
+
+	/* and vice versa (just in case) */
+	else if (intf == info->data && info->control) {
+		usb_driver_release_interface (&usbnet_driver, info->control);
+		info->control = 0;
+	}
+
+}
+
+#endif	/* CONFIG_USB_ZAURUS || CONFIG_USB_CDCETHER */
+
+
+#ifdef	CONFIG_USB_CDCETHER
+
+static const struct driver_info	cdc_info = {
+	.description =	"CDC Ethernet Device",
+	// .check_connect = cdc_check_connect,
+	.bind =		cdc_bind,
+	.unbind =	cdc_unbind,
+};
+
+#endif	/* CONFIG_USB_CDCETHER */
+
+
+
 #ifdef	CONFIG_USB_EPSON2888
 
 /*-------------------------------------------------------------------------
@@ -386,7 +666,6 @@
 	.check_connect = always_connected,
 
 	.in = 4, .out = 3,
-	.epsize = 64,
 };
 
 #endif	/* CONFIG_USB_EPSON2888 */
@@ -704,7 +983,7 @@
 	*packet_len = length;
 
 	// add padding byte
-	if ((skb->len % EP_SIZE (dev)) == 0)
+	if ((skb->len % dev->maxpacket) == 0)
 		skb_put (skb, 1);
 
 	return skb;
@@ -717,7 +996,6 @@
 	.tx_fixup =	genelink_tx_fixup,
 
 	.in = 1, .out = 2,
-	.epsize =64,
 
 #ifdef	GENELINK_ACK
 	.check_connect =genelink_check_connect,
@@ -737,6 +1015,9 @@
  *
  *-------------------------------------------------------------------------*/
 
+#define dev_packet_id	data[0]
+#define frame_errors	data[1]
+
 /*
  * NetChip framing of ethernet packets, supporting additional error
  * checks for links that may drop bulk packets from inside messages.
@@ -1064,6 +1345,60 @@
 	return 0;
 }
 
+static void nc_flush_complete (struct urb *urb, struct pt_regs *regs)
+{
+	kfree (urb->context);
+	usb_free_urb(urb);
+}
+
+static void nc_ensure_sync (struct usbnet *dev)
+{
+	dev->frame_errors++;
+	if (dev->frame_errors > 5) {
+		struct urb		*urb;
+		struct usb_ctrlrequest	*req;
+		int			status;
+
+		/* Send a flush */
+		urb = usb_alloc_urb (0, SLAB_ATOMIC);
+		if (!urb)
+			return;
+
+		req = kmalloc (sizeof *req, GFP_ATOMIC);
+		if (!req) {
+			usb_free_urb (urb);
+			return;
+		}
+
+		req->bRequestType = USB_DIR_OUT
+			| USB_TYPE_VENDOR
+			| USB_RECIP_DEVICE;
+		req->bRequest = REQUEST_REGISTER;
+		req->wValue = cpu_to_le16 (USBCTL_FLUSH_THIS
+				| USBCTL_FLUSH_OTHER);
+		req->wIndex = cpu_to_le16 (REG_USBCTL);
+		req->wLength = cpu_to_le16 (0);
+
+		/* queue an async control request, we don't need
+		 * to do anything when it finishes except clean up.
+		 */
+		usb_fill_control_urb (urb, dev->udev,
+			usb_sndctrlpipe (dev->udev, 0),
+			(unsigned char *) req,
+			NULL, 0,
+			nc_flush_complete, req);
+		status = usb_submit_urb (urb, GFP_ATOMIC);
+		if (status) {
+			kfree (req);
+			usb_free_urb (urb);
+			return;
+		}
+
+		devdbg (dev, "flush net1080; too many framing errors");
+		dev->frame_errors = 0;
+	}
+}
+
 static int net1080_rx_fixup (struct usbnet *dev, struct sk_buff *skb)
 {
 	struct nc_header	*header;
@@ -1076,6 +1411,7 @@
 		dbg ("rx framesize %d range %d..%d mtu %d", skb->len,
 			(int)MIN_FRAMED, (int)FRAMED_SIZE (dev->net.mtu),
 			dev->net.mtu);
+		nc_ensure_sync (dev);
 		return 0;
 	}
 
@@ -1085,15 +1421,18 @@
 	if (FRAMED_SIZE (header->packet_len) > MAX_PACKET) {
 		dev->stats.rx_frame_errors++;
 		dbg ("packet too big, %d", header->packet_len);
+		nc_ensure_sync (dev);
 		return 0;
 	} else if (header->hdr_len < MIN_HEADER) {
 		dev->stats.rx_frame_errors++;
 		dbg ("header too short, %d", header->hdr_len);
+		nc_ensure_sync (dev);
 		return 0;
 	} else if (header->hdr_len > MIN_HEADER) {
 		// out of band data for us?
 		dbg ("header OOB, %d bytes",
 			header->hdr_len - MIN_HEADER);
+		nc_ensure_sync (dev);
 		// switch (vendor/product ids) { ... }
 	}
 	skb_pull (skb, header->hdr_len);
@@ -1114,6 +1453,7 @@
 		dev->stats.rx_frame_errors++;
 		dbg ("bad packet len %d (expected %d)",
 			skb->len, header->packet_len);
+		nc_ensure_sync (dev);
 		return 0;
 	}
 	if (header->packet_id != get_unaligned (&trailer->packet_id)) {
@@ -1126,6 +1466,7 @@
 	devdbg (dev, "frame <rx h %d p %d id %d", header->hdr_len,
 		header->packet_len, header->packet_id);
 #endif
+	dev->frame_errors = 0;
 	return 1;
 }
 
@@ -1143,11 +1484,13 @@
 
 		if ((padlen + sizeof (struct nc_trailer)) <= tailroom
 			    && sizeof (struct nc_header) <= headroom)
+			/* There's enough head and tail room */
 			return skb;
 
 		if ((sizeof (struct nc_header) + padlen
 					+ sizeof (struct nc_trailer)) <
 				(headroom + tailroom)) {
+			/* There's enough total room, so just readjust */
 			skb->data = memmove (skb->head
 						+ sizeof (struct nc_header),
 					    skb->data, skb->len);
@@ -1155,6 +1498,8 @@
 			return skb;
 		}
 	}
+
+	/* Create a new skb to use with the correct size */
 	skb2 = skb_copy_expand (skb,
 				sizeof (struct nc_header),
 				sizeof (struct nc_trailer) + padlen,
@@ -1170,9 +1515,6 @@
 	.check_connect =net1080_check_connect,
 	.rx_fixup =	net1080_rx_fixup,
 	.tx_fixup =	net1080_tx_fixup,
-
-	.in = 1, .out = 1,		// direction distinguishes these
-	.epsize =64,
 };
 
 #endif /* CONFIG_USB_NET1080 */
@@ -1237,37 +1579,13 @@
 	.flags =	FLAG_NO_SETINT,
 		/* some PL-2302 versions seem to fail usb_set_interface() */
 	.reset =	pl_reset,
-
-	.in = 3, .out = 2,
-	.epsize =64,
 };
 
 #endif /* CONFIG_USB_PL2301 */
 
 
 
-#ifdef	CONFIG_USB_PXA
-
-/*-------------------------------------------------------------------------
- *
- * PXA250 and PXA210 use XScale cores (ARM v5TE) with better USB support,
- * and different USB endpoint numbering than the SA1100 devices.
- *
- *-------------------------------------------------------------------------*/
-
-static const struct driver_info	pxa_info = {
-	.description =	"PXA-250 Linux Device",
-	.check_connect = always_connected,
-
-	.in = 1, .out = 2,
-	.epsize = 64,
-};
-
-#endif	/* CONFIG_USB_PXA */
-
-
-
-#ifdef	CONFIG_USB_SA1100
+#ifdef	CONFIG_USB_ARMLINUX
 
 /*-------------------------------------------------------------------------
  *
@@ -1279,25 +1597,24 @@
  * This describes the driver currently in standard ARM Linux kernels.
  * The Zaurus uses a different driver (see later).
  *
+ * PXA25x and PXA210 use XScale cores (ARM v5TE) with better USB support
+ * and different USB endpoint numbering than the SA1100 devices.  The
+ * mach-pxa/usb-eth.c driver re-uses the device ids from mach-sa1100
+ * so we rely on the endpoint descriptors.
+ *
  *-------------------------------------------------------------------------*/
 
 static const struct driver_info	linuxdev_info = {
-	.description =	"SA-1100 Linux Device",
+	.description =	"Linux Device",
 	.check_connect = always_connected,
-
-	.in = 2, .out = 1,
-	.epsize = 64,
 };
 
 static const struct driver_info	yopy_info = {
 	.description =	"Yopy",
 	.check_connect = always_connected,
-
-	.in = 2, .out = 1,
-	.epsize = 64,
 };
 
-#endif	/* CONFIG_USB_SA1100 */
+#endif	/* CONFIG_USB_ARMLINUX */
 
 
 #ifdef CONFIG_USB_ZAURUS
@@ -1349,10 +1666,9 @@
 	.description =	"Sharp Zaurus SL-5x00",
 	.flags =	FLAG_FRAMING_Z,
 	.check_connect = always_connected,
+	.bind =		cdc_bind,
+	.unbind =	cdc_unbind,
 	.tx_fixup = 	zaurus_tx_fixup,
-
-	.in = 2, .out = 1,
-	.epsize = 64,
 };
 static const struct driver_info	zaurus_sla300_info = {
 	.description =	"Sharp Zaurus SL-A300",
@@ -1361,7 +1677,6 @@
 	.tx_fixup = 	zaurus_tx_fixup,
 
 	.in = 1, .out = 2,
-	.epsize = 64,
 };
 static const struct driver_info	zaurus_slb500_info = {
 	/* Japanese B500 ~= US SL-5600 */
@@ -1371,7 +1686,6 @@
 	.tx_fixup = 	zaurus_tx_fixup,
 
 	.in = 1, .out = 2,
-	.epsize = 64,
 };
 
 // SL-5600 and C-700 are PXA based; should resemble A300
@@ -1403,7 +1717,7 @@
 		return -EINVAL;
 #endif
 	// no second zero-length packet read wanted after mtu-sized packets
-	if (((new_mtu + sizeof (struct ethhdr)) % EP_SIZE (dev)) == 0)
+	if (((new_mtu + sizeof (struct ethhdr)) % dev->maxpacket) == 0)
 		return -EDOM;
 	net->mtu = new_mtu;
 	return 0;
@@ -1444,10 +1758,9 @@
 {
 	set_bit (work, &dev->flags);
 	if (!schedule_work (&dev->kevent))
-		err ("%s: kevent %d may have been dropped",
-			dev->net.name, work);
+		deverr (dev, "kevent %d may have been dropped", work);
 	else
-		dbg ("%s: kevent %d scheduled", dev->net.name, work);
+		devdbg (dev, "kevent %d scheduled", work);
 }
 
 /*-------------------------------------------------------------------------*/
@@ -1480,7 +1793,7 @@
 		size = (sizeof (struct ethhdr) + dev->net.mtu);
 
 	if ((skb = alloc_skb (size, flags)) == 0) {
-		dbg ("no rx skb");
+		devdbg (dev, "no rx skb");
 		defer_kevent (dev, EVENT_RX_MEMORY);
 		usb_free_urb (urb);
 		return;
@@ -1492,14 +1805,14 @@
 	entry->state = rx_start;
 	entry->length = 0;
 
-	usb_fill_bulk_urb (urb, dev->udev,
-		usb_rcvbulkpipe (dev->udev, dev->driver_info->in),
+	usb_fill_bulk_urb (urb, dev->udev, dev->in,
 		skb->data, size, rx_complete, skb);
 	urb->transfer_flags |= URB_ASYNC_UNLINK;
 
 	spin_lock_irqsave (&dev->rxq.lock, lockflags);
 
 	if (netif_running (&dev->net)
+			&& netif_device_present (&dev->net)
 			&& !test_bit (EVENT_RX_HALT, &dev->flags)) {
 		switch (retval = usb_submit_urb (urb, GFP_ATOMIC)){ 
 		case -EPIPE:
@@ -1508,15 +1821,19 @@
 		case -ENOMEM:
 			defer_kevent (dev, EVENT_RX_MEMORY);
 			break;
+		case -ENODEV:
+			devdbg (dev, "device gone");
+			netif_device_detach (&dev->net);
+			break;
 		default:
-			dbg ("%s rx submit, %d", dev->net.name, retval);
+			devdbg (dev, "rx submit, %d", retval);
 			tasklet_schedule (&dev->bh);
 			break;
 		case 0:
 			__skb_queue_tail (&dev->rxq, skb);
 		}
 	} else {
-		dbg ("rx: stopped");
+		devdbg (dev, "rx: stopped");
 		retval = -ENOLINK;
 	}
 	spin_unlock_irqrestore (&dev->rxq.lock, lockflags);
@@ -1553,7 +1870,7 @@
 		if (status != NET_RX_SUCCESS)
 			devdbg (dev, "netif_rx status %d", status);
 	} else {
-		dbg ("drop");
+		devdbg (dev, "drop");
 error:
 		dev->stats.rx_errors++;
 		skb_queue_tail (&dev->done, skb);
@@ -1580,7 +1897,7 @@
 			entry->state = rx_cleanup;
 			dev->stats.rx_errors++;
 			dev->stats.rx_length_errors++;
-			dbg ("rx length %d", skb->len);
+			devdbg (dev, "rx length %d", skb->len);
 		}
 		break;
 
@@ -1589,15 +1906,31 @@
 	    // we avoid the highspeed version of the ETIMEOUT/EILSEQ
 	    // storm, recovering as needed.
 	    case -EPIPE:
+		dev->stats.rx_errors++;
 		defer_kevent (dev, EVENT_RX_HALT);
 		// FALLTHROUGH
 
 	    // software-driven interface shutdown
-	    case -ECONNRESET:		// according to API spec
-	    case -ECONNABORTED:		// some (now fixed?) UHCI bugs
-		dbg ("%s rx shutdown, code %d", dev->net.name, urb_status);
+	    case -ECONNRESET:		// async unlink
+	    case -ESHUTDOWN:		// hardware gone
+#ifdef	VERBOSE
+		devdbg (dev, "rx shutdown, code %d", urb_status);
+#endif
+		goto block;
+
+	    // we get controller i/o faults during khubd disconnect() delays.
+	    // throttle down resubmits, to avoid log floods; just temporarily,
+	    // so we still recover when the fault isn't a khubd delay.
+	    case -EPROTO:		// ehci
+	    case -ETIMEDOUT:		// ohci
+	    case -EILSEQ:		// uhci
+		dev->stats.rx_errors++;
+		if (!timer_pending (&dev->delay)) {
+			mod_timer (&dev->delay, jiffies + THROTTLE_JIFFIES);
+			devdbg (dev, "rx throttle %d", urb_status);
+		}
+block:
 		entry->state = rx_cleanup;
-		// do urb frees only in the tasklet (UHCI has oopsed ...)
 		entry->urb = urb;
 		urb = 0;
 		break;
@@ -1608,12 +1941,9 @@
 		// FALLTHROUGH
 	    
 	    default:
-		// on unplug we get ETIMEDOUT (ohci) or EILSEQ (uhci)
-		// until khubd sees its interrupt and disconnects us.
-		// that can easily be hundreds of passes through here.
 		entry->state = rx_cleanup;
 		dev->stats.rx_errors++;
-		dbg ("%s rx: status %d", dev->net.name, urb_status);
+		devdbg (dev, "rx status %d", urb_status);
 		break;
 	}
 
@@ -1628,7 +1958,7 @@
 		usb_free_urb (urb);
 	}
 #ifdef	VERBOSE
-	dbg ("no read resubmitted");
+	devdbg (dev, "no read resubmitted");
 #endif /* VERBOSE */
 }
 
@@ -1636,7 +1966,7 @@
 
 // unlink pending rx/tx; completion handlers do all other cleanup
 
-static int unlink_urbs (struct sk_buff_head *q)
+static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q)
 {
 	unsigned long		flags;
 	struct sk_buff		*skb, *skbnext;
@@ -1656,7 +1986,7 @@
 		// these (async) unlinks complete immediately
 		retval = usb_unlink_urb (urb);
 		if (retval != -EINPROGRESS && retval != 0)
-			dbg ("unlink urb err, %d", retval);
+			devdbg (dev, "unlink urb err, %d", retval);
 		else
 			count++;
 	}
@@ -1688,7 +2018,7 @@
 	// ensure there are no more active urbs
 	add_wait_queue (&unlink_wakeup, &wait);
 	dev->wait = &unlink_wakeup;
-	temp = unlink_urbs (&dev->txq) + unlink_urbs (&dev->rxq);
+	temp = unlink_urbs (dev, &dev->txq) + unlink_urbs (dev, &dev->rxq);
 
 	// maybe wait for deletions to finish.
 	while (skb_queue_len (&dev->rxq)
@@ -1696,11 +2026,16 @@
 			&& skb_queue_len (&dev->done)) {
 		set_current_state (TASK_UNINTERRUPTIBLE);
 		schedule_timeout (UNLINK_TIMEOUT_JIFFIES);
-		dbg ("waited for %d urb completions", temp);
+		devdbg (dev, "waited for %d urb completions", temp);
 	}
 	dev->wait = 0;
 	remove_wait_queue (&unlink_wakeup, &wait); 
 
+	// deferred work (task, timer, softirq) must also stop
+	flush_scheduled_work ();
+	del_timer_sync (&dev->delay);
+	tasklet_kill (&dev->bh);
+
 	mutex_unlock (&dev->mutex);
 	return 0;
 }
@@ -1738,7 +2073,7 @@
 	if (dev->msg_level >= 2)
 		devinfo (dev, "open: enable queueing "
 				"(rx %d, tx %d) mtu %d %s framing",
-			RX_QLEN, TX_QLEN, dev->net.mtu,
+			RX_QLEN (dev), TX_QLEN (dev), dev->net.mtu,
 			(info->flags & (FLAG_FRAMING_NC | FLAG_FRAMING_GL))
 			    ? ((info->flags & FLAG_FRAMING_NC)
 				? "NetChip"
@@ -1755,7 +2090,8 @@
 
 /*-------------------------------------------------------------------------*/
 
-static int usbnet_ethtool_ioctl (struct net_device *net, void *useraddr)
+static inline int
+usbnet_ethtool_ioctl (struct net_device *net, void *useraddr)
 {
 	struct usbnet	*dev = (struct usbnet *) net->priv;
 	u32		cmd;
@@ -1829,9 +2165,8 @@
 
 /* work that cannot be done in interrupt context uses keventd.
  *
- * NOTE:  "uhci" and "usb-uhci" may have trouble with this since they don't
- * queue control transfers to individual devices, and other threads could
- * trigger control requests concurrently.  hope that's rare.
+ * NOTE:  with 2.5 we could do more of this using completion callbacks,
+ * especially now that control transfers can be queued.
  */
 static void
 kevent (void *data)
@@ -1841,24 +2176,22 @@
 
 	/* usb_clear_halt() needs a thread context */
 	if (test_bit (EVENT_TX_HALT, &dev->flags)) {
-		unlink_urbs (&dev->txq);
-		status = usb_clear_halt (dev->udev,
-			usb_sndbulkpipe (dev->udev, dev->driver_info->out));
+		unlink_urbs (dev, &dev->txq);
+		status = usb_clear_halt (dev->udev, dev->out);
 		if (status < 0)
-			err ("%s: can't clear tx halt, status %d",
-				dev->net.name, status);
+			deverr (dev, "can't clear tx halt, status %d",
+				status);
 		else {
 			clear_bit (EVENT_TX_HALT, &dev->flags);
 			netif_wake_queue (&dev->net);
 		}
 	}
 	if (test_bit (EVENT_RX_HALT, &dev->flags)) {
-		unlink_urbs (&dev->rxq);
-		status = usb_clear_halt (dev->udev,
-			usb_rcvbulkpipe (dev->udev, dev->driver_info->in));
+		unlink_urbs (dev, &dev->rxq);
+		status = usb_clear_halt (dev->udev, dev->in);
 		if (status < 0)
-			err ("%s: can't clear rx halt, status %d",
-				dev->net.name, status);
+			deverr (dev, "can't clear rx halt, status %d",
+				status);
 		else {
 			clear_bit (EVENT_RX_HALT, &dev->flags);
 			tasklet_schedule (&dev->bh);
@@ -1881,8 +2214,8 @@
 	}
 
 	if (dev->flags)
-		dbg ("%s: kevent done, flags = 0x%lx",
-			dev->net.name, dev->flags);
+		devdbg (dev, "kevent done, flags = 0x%lx",
+			dev->flags);
 }
 
 /*-------------------------------------------------------------------------*/
@@ -1893,8 +2226,35 @@
 	struct skb_data		*entry = (struct skb_data *) skb->cb;
 	struct usbnet		*dev = entry->dev;
 
-	if (urb->status == -EPIPE)
-		defer_kevent (dev, EVENT_TX_HALT);
+	if (urb->status == 0) {
+		dev->stats.tx_packets++;
+		dev->stats.tx_bytes += entry->length;
+	} else {
+		dev->stats.tx_errors++;
+
+		switch (urb->status) {
+		case -EPIPE:
+			defer_kevent (dev, EVENT_TX_HALT);
+			break;
+
+		// like rx, tx gets controller i/o faults during khubd delays
+		// and so it uses the same throttling mechanism.
+		case -EPROTO:		// ehci
+		case -ETIMEDOUT:	// ohci
+		case -EILSEQ:		// uhci
+			if (!timer_pending (&dev->delay)) {
+				mod_timer (&dev->delay,
+					jiffies + THROTTLE_JIFFIES);
+				devdbg (dev, "tx throttle %d", urb->status);
+			}
+			netif_stop_queue (&dev->net);
+			break;
+		default:
+			devdbg (dev, "tx err %d", entry->urb->status);
+			break;
+		}
+	}
+
 	urb->dev = 0;
 	entry->state = tx_done;
 	defer_bh (dev, skb);
@@ -1906,7 +2266,7 @@
 {
 	struct usbnet		*dev = (struct usbnet *) net->priv;
 
-	unlink_urbs (&dev->txq);
+	unlink_urbs (dev, &dev->txq);
 	tasklet_schedule (&dev->bh);
 
 	// FIXME: device recovery -- reset?
@@ -1933,14 +2293,14 @@
 	if (info->tx_fixup) {
 		skb = info->tx_fixup (dev, skb, GFP_ATOMIC);
 		if (!skb) {
-			dbg ("can't tx_fixup skb");
+			devdbg (dev, "can't tx_fixup skb");
 			goto drop;
 		}
 	}
 	length = skb->len;
 
 	if (!(urb = usb_alloc_urb (0, GFP_ATOMIC))) {
-		dbg ("no urb");
+		devdbg (dev, "no urb");
 		goto drop;
 	}
 
@@ -1965,20 +2325,24 @@
 	} else
 #endif	/* CONFIG_USB_NET1080 */
 
-	/* don't assume the hardware handles USB_ZERO_PACKET */
-	if ((length % EP_SIZE (dev)) == 0)
-		skb->len++;
-
-	usb_fill_bulk_urb (urb, dev->udev,
-			usb_sndbulkpipe (dev->udev, info->out),
+	usb_fill_bulk_urb (urb, dev->udev, dev->out,
 			skb->data, skb->len, tx_complete, skb);
 	urb->transfer_flags |= URB_ASYNC_UNLINK;
 
+	/* don't assume the hardware handles USB_ZERO_PACKET
+	 * NOTE:  strictly conforming cdc-ether devices should expect
+	 * the ZLP here, but ignore the one-byte packet.
+	 *
+	 * FIXME zero that byte, if it doesn't require a new skb.
+	 */
+	if ((length % dev->maxpacket) == 0)
+		urb->transfer_buffer_length++;
+
 	spin_lock_irqsave (&dev->txq.lock, flags);
 
 #ifdef	CONFIG_USB_NET1080
 	if (info->flags & FLAG_FRAMING_NC) {
-		header->packet_id = cpu_to_le16 (dev->packet_id++);
+		header->packet_id = cpu_to_le16 ((u16)dev->dev_packet_id++);
 		put_unaligned (header->packet_id, &trailer->packet_id);
 #if 0
 		devdbg (dev, "frame >tx h %d p %d id %d",
@@ -1994,12 +2358,12 @@
 		defer_kevent (dev, EVENT_TX_HALT);
 		break;
 	default:
-		dbg ("%s tx: submit urb err %d", net->name, retval);
+		devdbg (dev, "tx: submit urb err %d", retval);
 		break;
 	case 0:
 		net->trans_start = jiffies;
 		__skb_queue_tail (&dev->txq, skb);
-		if (dev->txq.qlen >= TX_QLEN)
+		if (dev->txq.qlen >= TX_QLEN (dev))
 			netif_stop_queue (net);
 	}
 	spin_unlock_irqrestore (&dev->txq.lock, flags);
@@ -2024,7 +2388,7 @@
 
 /*-------------------------------------------------------------------------*/
 
-// tasklet ... work that avoided running in_irq()
+// tasklet (work deferred from completions, in_irq) or timer
 
 static void usbnet_bh (unsigned long param)
 {
@@ -2040,23 +2404,12 @@
 			rx_process (dev, skb);
 			continue;
 		    case tx_done:
-			if (entry->urb->status) {
-				// can this statistic become more specific?
-				dev->stats.tx_errors++;
-				dbg ("%s tx: err %d", dev->net.name,
-					entry->urb->status);
-			} else {
-				dev->stats.tx_packets++;
-				dev->stats.tx_bytes += entry->length;
-			}
-			// FALLTHROUGH:
 		    case rx_cleanup:
 			usb_free_urb (entry->urb);
 			dev_kfree_skb (skb);
 			continue;
 		    default:
-			dbg ("%s: bogus skb state %d",
-				dev->net.name, entry->state);
+			devdbg (dev, "bogus skb state %d", entry->state);
 		}
 	}
 
@@ -2068,23 +2421,28 @@
 
 	// or are we maybe short a few urbs?
 	} else if (netif_running (&dev->net)
+			&& netif_device_present (&dev->net)
+			&& !timer_pending (&dev->delay)
 			&& !test_bit (EVENT_RX_HALT, &dev->flags)) {
 		int	temp = dev->rxq.qlen;
+		int	qlen = RX_QLEN (dev);
 
-		if (temp < RX_QLEN) {
+		if (temp < qlen) {
 			struct urb	*urb;
 			int		i;
-			for (i = 0; i < 3 && dev->rxq.qlen < RX_QLEN; i++) {
+
+			// don't refill the queue all at once
+			for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) {
 				if ((urb = usb_alloc_urb (0, GFP_ATOMIC)) != 0)
 					rx_submit (dev, urb, GFP_ATOMIC);
 			}
 			if (temp != dev->rxq.qlen)
 				devdbg (dev, "rxqlen %d --> %d",
 						temp, dev->rxq.qlen);
-			if (dev->rxq.qlen < RX_QLEN)
+			if (dev->rxq.qlen < qlen)
 				tasklet_schedule (&dev->bh);
 		}
-		if (dev->txq.qlen < TX_QLEN)
+		if (dev->txq.qlen < TX_QLEN (dev))
 			netif_wake_queue (&dev->net);
 	}
 }
@@ -2117,13 +2475,8 @@
 	
 	unregister_netdev (&dev->net);
 
-	mutex_lock (&usbnet_mutex);
-	mutex_lock (&dev->mutex);
-	list_del (&dev->dev_list);
-	mutex_unlock (&usbnet_mutex);
-
-	// assuming we used keventd, it must quiesce too
-	flush_scheduled_work ();
+	if (dev->driver_info->unbind)
+		dev->driver_info->unbind (dev, intf);
 
 	kfree (dev);
 	usb_put_dev (xdev);
@@ -2142,20 +2495,12 @@
 	struct usb_host_interface	*interface;
 	struct driver_info		*info;
 	struct usb_device		*xdev;
+	int				status;
 
 	info = (struct driver_info *) prod->driver_info;
-
 	xdev = interface_to_usbdev (udev);
 	interface = &udev->altsetting [udev->act_altsetting];
 
-	if (!(info->flags & FLAG_NO_SETINT)) {
-		if (usb_set_interface (xdev, interface->desc.bInterfaceNumber,
-				interface->desc.bAlternateSetting) < 0) {
-			err ("set_interface failed");
-			return -EIO;
-		}
-	}
-
 	// set up our own records
 	if (!(dev = kmalloc (sizeof *dev, GFP_KERNEL))) {
 		dbg ("can't kmalloc dev");
@@ -2168,13 +2513,15 @@
 	dev->udev = xdev;
 	dev->driver_info = info;
 	dev->msg_level = msg_level;
-	INIT_LIST_HEAD (&dev->dev_list);
 	skb_queue_head_init (&dev->rxq);
 	skb_queue_head_init (&dev->txq);
 	skb_queue_head_init (&dev->done);
 	dev->bh.func = usbnet_bh;
 	dev->bh.data = (unsigned long) dev;
 	INIT_WORK (&dev->kevent, kevent, dev);
+	dev->delay.function = usbnet_bh;
+	dev->delay.data = (unsigned long) dev;
+	init_timer (&dev->delay);
 
 	// set up network interface records
 	net = &dev->net;
@@ -2200,31 +2547,41 @@
 	net->tx_timeout = usbnet_tx_timeout;
 	net->do_ioctl = usbnet_ioctl;
 
+	// allow device-specific bind/init procedures
+	// NOTE net->name still not usable ...
+	if (info->bind)
+		status = info->bind (dev, udev);
+	else if (!info->in || info->out)
+		status = get_endpoints (dev, udev);
+	else {
+		dev->in = usb_rcvbulkpipe (xdev, info->in);
+		dev->out = usb_sndbulkpipe (xdev, info->out);
+		if (!(info->flags & FLAG_NO_SETINT))
+			status = usb_set_interface (xdev,
+				interface->desc.bInterfaceNumber,
+				interface->desc.bAlternateSetting);
+		else
+			status = 0;
+
+	}
+	if (status < 0) {
+		kfree (dev);
+		return status;
+	}
+	dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1);
+
 	register_netdev (&dev->net);
-	devinfo (dev, "register usbnet usb-%s-%s, %s",
+	devinfo (dev, "register usbnet at usb-%s-%s, %s",
 		xdev->bus->bus_name, xdev->devpath,
 		dev->driver_info->description);
 
-#ifdef CONFIG_USB_ZAURUS
-	if (dev->driver_info == &zaurus_sl5x00_info) {
-		int	status;
-		status = usb_set_configuration (xdev, 1);
-		devinfo (dev, "set config --> %d", status);
-		status = usb_set_interface (xdev, 1, 1);
-		devinfo (dev, "set altsetting --> %d", status);
-	}
-#endif
-
 	// ok, it's ready to go.
-	usb_set_intfdata(udev, dev);
-	mutex_lock (&usbnet_mutex);
-	list_add (&dev->dev_list, &usbnet_list);
+	usb_set_intfdata (udev, dev);
 	mutex_unlock (&dev->mutex);
 
 	// start as if the link is up
 	netif_device_attach (&dev->net);
 
-	mutex_unlock (&usbnet_mutex);
 	return 0;
 }
 
@@ -2298,28 +2655,19 @@
 },
 #endif
 
-#ifdef	CONFIG_USB_PXA
-/*
- * PXA250 or PXA210 ...  these use a "usb-eth" driver much like
- * the sa1100 one.
- */
-{
-	// Compaq "Itsy" vendor/product id, version "2.0"
-	USB_DEVICE_VER (0x049F, 0x505A, 0x0200, 0x0200),
-	.driver_info =	(unsigned long) &pxa_info,
-}, 
-#endif
-
-#ifdef	CONFIG_USB_SA1100
+#ifdef	CONFIG_USB_ARMLINUX
 /*
  * SA-1100 using standard ARM Linux kernels, or compatible.
  * Often used when talking to Linux PDAs (iPaq, Yopy, etc).
  * The sa-1100 "usb-eth" driver handles the basic framing.
+ *
+ * PXA25x or PXA210 ...  these use a "usb-eth" driver much like
+ * the sa1100 one, but hardware uses different endpoint numbers.
  */
 {
 	// 1183 = 0x049F, both used as hex values?
-	// Compaq "Itsy" vendor/product id, version "0.0"
-	USB_DEVICE_VER (0x049F, 0x505A, 0, 0),
+	// Compaq "Itsy" vendor/product id
+	USB_DEVICE (0x049F, 0x505A),
 	.driver_info =	(unsigned long) &linuxdev_info,
 }, {
 	USB_DEVICE (0x0E7E, 0x1001),	// G.Mate "Yopy"
@@ -2337,9 +2685,10 @@
 			  | USB_DEVICE_ID_MATCH_DEVICE, 
 	.idVendor		= 0x04DD,
 	.idProduct		= 0x8004,
-	.bInterfaceClass	= 0x0a,
-	.bInterfaceSubClass	= 0x00,
-	.bInterfaceProtocol	= 0x00,
+	/* match the master interface */
+	.bInterfaceClass	= USB_CLASS_COMM,
+	.bInterfaceSubClass	= 6 /* Ethernet model */,
+	.bInterfaceProtocol	= 0,
 	.driver_info =  (unsigned long) &zaurus_sl5x00_info,
 }, {
 	.match_flags	=   USB_DEVICE_ID_MATCH_INT_INFO
@@ -2359,6 +2708,24 @@
 	.bInterfaceSubClass	= 0x0a,
 	.bInterfaceProtocol	= 0x00,
 	.driver_info =  (unsigned long) &zaurus_slb500_info,
+},
+#endif
+
+#ifdef	CONFIG_USB_CDCETHER
+{
+	/* CDC Ether uses two interfaces, not necessarily consecutive.
+	 * We match the main interface, ignoring the optional device
+	 * class so we could handle devices that aren't exclusively
+	 * CDC ether.
+	 *
+	 * NOTE:  this match must come AFTER entries working around
+	 * bugs/quirks in a given product (like Zaurus, above).
+	 */
+	.match_flags		= USB_DEVICE_ID_MATCH_INT_INFO,
+	.bInterfaceClass	= USB_CLASS_COMM,
+	.bInterfaceSubClass	= 6 /* Ethernet model */,
+	.bInterfaceProtocol	= 0,
+	.driver_info = (unsigned long) &cdc_info,
 },
 #endif
 
diff -Nru a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
--- a/drivers/usb/serial/io_edgeport.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/usb/serial/io_edgeport.c	Sat Apr 19 19:51:28 2003
@@ -25,6 +25,10 @@
  *
  * Version history:
  * 
+ * 2003_04_03 al borchers
+ *  - fixed a bug (that shows up with dosemu) where the tty struct is
+ *    used in a callback after it has been freed
+ *
  * 2.3 2002_03_08 greg kroah-hartman
  *	- fixed bug when multiple devices were attached at the same time.
  *
@@ -918,7 +922,7 @@
 
 	tty = edge_port->port->tty;
 
-	if (tty) {
+	if (tty && edge_port->open) {
 		/* let the tty driver wakeup if it has a special write_wakeup function */
 		if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup) {
 			(tty->ldisc.write_wakeup)(tty);
@@ -958,9 +962,8 @@
 		kfree(urb->transfer_buffer);
 	}
 
-	// Free the command urb
-	usb_unlink_urb (urb);
-	usb_free_urb   (urb);
+	/* Free the command urb */
+	usb_free_urb (urb);
 
 	if (port_paranoia_check (edge_port->port, __FUNCTION__)) {
 		return;
@@ -975,7 +978,7 @@
 	tty = edge_port->port->tty;
 
 	/* tell the tty driver that something has changed */
-	if (tty)
+	if (tty && edge_port->open)
 		wake_up_interruptible(&tty->write_wait);
 
 	/* we have completed the command */
diff -Nru a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
--- a/drivers/usb/serial/ipaq.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/serial/ipaq.c	Sat Apr 19 19:51:50 2003
@@ -131,6 +131,7 @@
 	{ USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_E740_ID) },
 	{ USB_DEVICE(HTC_VENDOR_ID, HTC_PRODUCT_ID) },
 	{ USB_DEVICE(NEC_VENDOR_ID, NEC_PRODUCT_ID) },
+	{ USB_DEVICE(ASUS_VENDOR_ID, ASUS_A600_PRODUCT_ID) },
 	{ }					/* Terminating entry */
 };
 
diff -Nru a/drivers/usb/serial/ipaq.h b/drivers/usb/serial/ipaq.h
--- a/drivers/usb/serial/ipaq.h	Sat Apr 19 19:51:27 2003
+++ b/drivers/usb/serial/ipaq.h	Sat Apr 19 19:51:27 2003
@@ -77,6 +77,9 @@
 #define NEC_VENDOR_ID		0x0409
 #define NEC_PRODUCT_ID		0x00d5
 
+#define ASUS_VENDOR_ID		0x0b05
+#define ASUS_A600_PRODUCT_ID	0x4201
+
 /*
  * Since we can't queue our bulk write urbs (don't know why - it just
  * doesn't work), we can send down only one write urb at a time. The simplistic
diff -Nru a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c
--- a/drivers/usb/serial/keyspan.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/usb/serial/keyspan.c	Sat Apr 19 19:51:28 2003
@@ -1534,7 +1534,7 @@
 	this_urb->transfer_buffer_length = sizeof(msg);
 
 	this_urb->dev = serial->dev;
-	if ((err = usb_submit_urb(this_urb, GFP_KERNEL)) != 0) {
+	if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
 		dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
 	}
 #if 0
@@ -1659,7 +1659,7 @@
 	this_urb->transfer_buffer_length = sizeof(msg);
 
 	this_urb->dev = serial->dev;
-	if ((err = usb_submit_urb(this_urb, GFP_KERNEL)) != 0) {
+	if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
 		dbg("%s - usb_submit_urb(setup) failed", __FUNCTION__);
 	}
 #if 0
@@ -1824,7 +1824,7 @@
 	this_urb->transfer_buffer_length = sizeof(msg);
 
 	this_urb->dev = serial->dev;
-	if ((err = usb_submit_urb(this_urb, GFP_KERNEL)) != 0) {
+	if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) {
 		dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err);
 	}
 #if 0
diff -Nru a/drivers/usb/serial/keyspan.h b/drivers/usb/serial/keyspan.h
--- a/drivers/usb/serial/keyspan.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/usb/serial/keyspan.h	Sat Apr 19 19:51:49 2003
@@ -411,19 +411,19 @@
 };
 
 static const struct keyspan_device_details usa49wlc_device_details = {
-	product_id:		keyspan_usa49wlc_product_id,
-	msg_format:		msg_usa49,
-	num_ports:		4,
-	indat_endp_flip:	0,
-	outdat_endp_flip:	0,
-	indat_endpoints:	{0x81, 0x82, 0x83, 0x84},
-	outdat_endpoints:	{0x01, 0x02, 0x03, 0x04},
-	inack_endpoints:	{-1, -1, -1, -1},
-	outcont_endpoints:	{-1, -1, -1, -1},
-	instat_endpoint:	0x87,
-	glocont_endpoint:	0x07,
-	calculate_baud_rate:	keyspan_usa19w_calc_baud,
-	baudclk:		KEYSPAN_USA19W_BAUDCLK,
+	.product_id		= keyspan_usa49wlc_product_id,
+	.msg_format		= msg_usa49,
+	.num_ports		= 4,
+	.indat_endp_flip	= 0,
+	.outdat_endp_flip	= 0,
+	.indat_endpoints	= {0x81, 0x82, 0x83, 0x84},
+	.outdat_endpoints	= {0x01, 0x02, 0x03, 0x04},
+	.inack_endpoints	= {-1, -1, -1, -1},
+	.outcont_endpoints	= {-1, -1, -1, -1},
+	.instat_endpoint	= 0x87,
+	.glocont_endpoint	= 0x07,
+	.calculate_baud_rate	= keyspan_usa19w_calc_baud,
+	.baudclk		= KEYSPAN_USA19W_BAUDCLK,
 };
 
 static const struct keyspan_device_details *keyspan_devices[] = {
diff -Nru a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c
--- a/drivers/usb/serial/kl5kusb105.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/usb/serial/kl5kusb105.c	Sat Apr 19 19:51:48 2003
@@ -964,8 +964,9 @@
 	     if (retval)
 			 return(retval);
 
-	     kernel_termios_to_user_termios((struct termios *)arg,  
-					    &priv->termios);
+	     if (kernel_termios_to_user_termios((struct termios *)arg,  
+						&priv->termios))
+		     return -EFAULT;
 	     return(0);
 	     }
 	case TCSETS: {
@@ -980,8 +981,9 @@
 		if (retval)
 			    return(retval);
 
-		user_termios_to_kernel_termios(&priv->termios,
-					       (struct termios *)arg);
+		if (user_termios_to_kernel_termios(&priv->termios,
+						  (struct termios *)arg))
+			return -EFAULT;
 		klsi_105_set_termios(port, &priv->termios);
 		return(0);
 	     }
diff -Nru a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
--- a/drivers/usb/serial/kobil_sct.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/serial/kobil_sct.c	Sat Apr 19 19:51:50 2003
@@ -514,7 +514,9 @@
 			dbg("%s - port %d Error in verify_area", __FUNCTION__, port->number);
 			return(result);
 		}
-		kernel_termios_to_user_termios((struct termios *)arg, &priv->internal_termios);
+		if (kernel_termios_to_user_termios((struct termios *)arg,
+						   &priv->internal_termios))
+			return -EFAULT;
 		return 0;
 
 	case TCSETS:   // 0x5402
@@ -527,7 +529,9 @@
 			dbg("%s - port %d Error in verify_area", __FUNCTION__, port->number);
 			return result;
 		}
-		user_termios_to_kernel_termios( &priv->internal_termios, (struct termios *)arg);
+		if (user_termios_to_kernel_termios(&priv->internal_termios,
+						   (struct termios *)arg))
+			return -EFAULT;
 		
 		settings = (unsigned char *) kmalloc(50, GFP_KERNEL);  
 		if (! settings) {
diff -Nru a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
--- a/drivers/usb/serial/usb-serial.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/usb/serial/usb-serial.c	Sat Apr 19 19:51:46 2003
@@ -531,7 +531,7 @@
 	dbg("%s - port %d", __FUNCTION__, port->number);
 
 	/* if disconnect beat us to the punch here, there's nothing to do */
-	if (tty->driver_data) {
+	if (tty && tty->driver_data) {
 		__serial_close(port, filp);
 	}
 }
@@ -830,6 +830,7 @@
 			while (port->open_count > 0) {
 				__serial_close(port, NULL);
 			}
+			port->tty = NULL;
 		}
 	}
 
diff -Nru a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
--- a/drivers/usb/storage/scsiglue.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/usb/storage/scsiglue.c	Sat Apr 19 19:51:47 2003
@@ -141,13 +141,19 @@
 static int usb_storage_queuecommand( Scsi_Cmnd *srb , void (*done)(Scsi_Cmnd *))
 {
 	struct us_data *us = (struct us_data *)srb->device->host->hostdata[0];
+	int state = atomic_read(&us->sm_state);
 
 	US_DEBUGP("queuecommand() called\n");
 	srb->host_scribble = (unsigned char *)us;
 
 	/* enqueue the command */
-	BUG_ON(atomic_read(&us->sm_state) != US_STATE_IDLE);
-	BUG_ON(us->srb != NULL);
+	if (state != US_STATE_IDLE || us->srb != NULL) {
+		printk(KERN_ERR USB_STORAGE "Error in %s: " 
+			"state = %d, us->srb = %p\n",
+			__FUNCTION__, state, us->srb);
+		return SCSI_MLQUEUE_HOST_BUSY;
+	}
+
 	srb->scsi_done = done;
 	us->srb = srb;
 
@@ -175,8 +181,7 @@
 		return FAILED;
 	}
 
-	usb_stor_abort_transport(us);
-	return SUCCESS;
+	return usb_stor_abort_transport(us);
 }
 
 /* This invokes the transport reset mechanism to reset the state of the
@@ -185,10 +190,15 @@
 static int usb_storage_device_reset( Scsi_Cmnd *srb )
 {
 	struct us_data *us = (struct us_data *)srb->device->host->hostdata[0];
+	int state = atomic_read(&us->sm_state);
 	int result;
 
 	US_DEBUGP("device_reset() called\n" );
-	BUG_ON(atomic_read(&us->sm_state) != US_STATE_IDLE);
+	if (state != US_STATE_IDLE) {
+		printk(KERN_ERR USB_STORAGE "Error in %s: "
+			"invalid state %d\n", __FUNCTION__, state);
+		return FAILED;
+	}
 
 	/* set the state and release the lock */
 	atomic_set(&us->sm_state, US_STATE_RESETTING);
@@ -260,6 +270,7 @@
 	struct us_data *us;
 	char *pos = buffer;
 	struct Scsi_Host *hostptr;
+	unsigned long f;
 
 	/* if someone is sending us data, just throw it away */
 	if (inout)
@@ -274,6 +285,7 @@
 
 	/* if we couldn't find it, we return an error */
 	if (!us) {
+		scsi_host_put(hostptr);
 		return -ESRCH;
 	}
 
@@ -288,6 +300,24 @@
 	/* show the protocol and transport */
 	SPRINTF("     Protocol: %s\n", us->protocol_name);
 	SPRINTF("    Transport: %s\n", us->transport_name);
+
+	/* show the device flags */
+	if (pos < buffer + length) {
+		pos += sprintf(pos, "       Quirks:");
+		f = us->flags;
+
+#define DO_FLAG(a)  	if (f & US_FL_##a)  pos += sprintf(pos, " " #a)
+		DO_FLAG(SINGLE_LUN);
+		DO_FLAG(MODE_XLATE);
+		DO_FLAG(START_STOP);
+		DO_FLAG(IGNORE_SER);
+		DO_FLAG(SCM_MULT_TARG);
+		DO_FLAG(FIX_INQUIRY);
+		DO_FLAG(FIX_CAPACITY);
+#undef DO_FLAG
+
+		*(pos++) = '\n';
+		}
 
 	/* release the reference count on this host */
 	scsi_host_put(hostptr);
diff -Nru a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
--- a/drivers/usb/storage/transport.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/usb/storage/transport.c	Sat Apr 19 19:51:46 2003
@@ -297,10 +297,11 @@
 
 	/* stalled */
 	case -EPIPE:
-		/* for control endpoints, a stall indicates a protocol error */
+		/* for control endpoints, (used by CB[I]) a stall indicates
+		 * a failed command */
 		if (usb_pipecontrol(pipe)) {
 			US_DEBUGP("-- stall on control pipe\n");
-			return USB_STOR_XFER_ERROR;
+			return USB_STOR_XFER_STALLED;
 		}
 
 		/* for other sorts of endpoint, clear the stall */
@@ -691,7 +692,7 @@
 
 /* Abort the currently running scsi command or device reset.
  * This must be called with scsi_lock(us->srb->host) held */
-void usb_stor_abort_transport(struct us_data *us)
+int usb_stor_abort_transport(struct us_data *us)
 {
 	struct Scsi_Host *host;
 	int state = atomic_read(&us->sm_state);
@@ -701,7 +702,11 @@
 	/* Normally the current state is RUNNING.  If the control thread
 	 * hasn't even started processing this command, the state will be
 	 * IDLE.  Anything else is a bug. */
-	BUG_ON((state != US_STATE_RUNNING && state != US_STATE_IDLE));
+	if (state != US_STATE_RUNNING && state != US_STATE_IDLE) {
+		printk(KERN_ERR USB_STORAGE "Error in %s: "
+			"invalid state %d\n", __FUNCTION__, state);
+		return FAILED;
+	}
 
 	/* set state to abort and release the lock */
 	atomic_set(&us->sm_state, US_STATE_ABORTING);
@@ -730,6 +735,7 @@
 
 	/* Reacquire the lock: note that us->srb is now NULL */
 	scsi_lock(host);
+	return SUCCESS;
 }
 
 /*
@@ -750,8 +756,14 @@
 
 	/* check the return code for the command */
 	US_DEBUGP("Call to usb_stor_ctrl_transfer() returned %d\n", result);
+
+	/* if we stalled the command, it means command failed */
+	if (result == USB_STOR_XFER_STALLED) {
+		return USB_STOR_TRANSPORT_FAILED;
+	}
+
+	/* Uh oh... serious problem here */
 	if (result != USB_STOR_XFER_GOOD) {
-		/* Uh oh... serious problem here */
 		return USB_STOR_TRANSPORT_ERROR;
 	}
 
@@ -834,8 +846,14 @@
 
 	/* check the return code for the command */
 	US_DEBUGP("Call to usb_stor_ctrl_transfer() returned %d\n", result);
+
+	/* if we stalled the command, it means command failed */
+	if (result == USB_STOR_XFER_STALLED) {
+		return USB_STOR_TRANSPORT_FAILED;
+	}
+
+	/* Uh oh... serious problem here */
 	if (result != USB_STOR_XFER_GOOD) {
-		/* Uh oh... serious problem here */
 		return USB_STOR_TRANSPORT_ERROR;
 	}
 
diff -Nru a/drivers/usb/storage/transport.h b/drivers/usb/storage/transport.h
--- a/drivers/usb/storage/transport.h	Sat Apr 19 19:51:46 2003
+++ b/drivers/usb/storage/transport.h	Sat Apr 19 19:51:46 2003
@@ -154,7 +154,7 @@
 extern int usb_stor_Bulk_reset(struct us_data*);
 
 extern void usb_stor_invoke_transport(Scsi_Cmnd*, struct us_data*);
-extern void usb_stor_abort_transport(struct us_data*);
+extern int usb_stor_abort_transport(struct us_data*);
 
 extern int usb_stor_bulk_msg(struct us_data *us, void *data,
 		unsigned int pipe, unsigned int len, unsigned int *act_len);
diff -Nru a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
--- a/drivers/usb/storage/unusual_devs.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/usb/storage/unusual_devs.h	Sat Apr 19 19:51:50 2003
@@ -286,6 +286,19 @@
 		"USB Hard Disk",
 		US_SC_RBC, US_PR_CB, NULL, 0 ), 
 
+/* This Pentax still camera is not conformant
+ * to the USB storage specification: -
+ * - It does not like the INQUIRY command. So we must handle this command
+ *   of the SCSI layer ourselves.
+ * Tested on Rev. 10.00 (0x1000)
+ * Submitted by James Courtier-Dutton <James@superbug.demon.co.uk>
+ */
+UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000,
+                "ASAHI PENTAX",
+                "PENTAX OPTIO 430",
+                US_SC_8070, US_PR_CBI, NULL,
+                US_FL_FIX_INQUIRY ),
+
 #ifdef CONFIG_USB_STORAGE_ISD200
 UNUSUAL_DEV(  0x05ab, 0x0031, 0x0100, 0x0110,
 		"In-System",
diff -Nru a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
--- a/drivers/usb/storage/usb.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/usb/storage/usb.c	Sat Apr 19 19:51:29 2003
@@ -430,39 +430,39 @@
 }	
 
 /* Set up the URB and the usb_ctrlrequest.
- * ss->dev_semaphore must already be locked.
+ * us->dev_semaphore must already be locked.
  * Note that this function assumes that all the data in the us_data
  * structure is current.
  * Returns non-zero on failure, zero on success
  */ 
-static int usb_stor_allocate_urbs(struct us_data *ss)
+static int usb_stor_allocate_urbs(struct us_data *us)
 {
 	/* calculate and store the pipe values */
-	ss->send_ctrl_pipe = usb_sndctrlpipe(ss->pusb_dev, 0);
-	ss->recv_ctrl_pipe = usb_rcvctrlpipe(ss->pusb_dev, 0);
-	ss->send_bulk_pipe = usb_sndbulkpipe(ss->pusb_dev, ss->ep_out);
-	ss->recv_bulk_pipe = usb_rcvbulkpipe(ss->pusb_dev, ss->ep_in);
-	ss->recv_intr_pipe = usb_rcvintpipe(ss->pusb_dev, ss->ep_int);
+	us->send_ctrl_pipe = usb_sndctrlpipe(us->pusb_dev, 0);
+	us->recv_ctrl_pipe = usb_rcvctrlpipe(us->pusb_dev, 0);
+	us->send_bulk_pipe = usb_sndbulkpipe(us->pusb_dev, us->ep_out);
+	us->recv_bulk_pipe = usb_rcvbulkpipe(us->pusb_dev, us->ep_in);
+	us->recv_intr_pipe = usb_rcvintpipe(us->pusb_dev, us->ep_int);
 
 	/* allocate the usb_ctrlrequest for control packets */
 	US_DEBUGP("Allocating usb_ctrlrequest\n");
-	ss->dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);
-	if (!ss->dr) {
+	us->dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO);
+	if (!us->dr) {
 		US_DEBUGP("allocation failed\n");
 		return 1;
 	}
 
 	/* allocate the URB we're going to use */
 	US_DEBUGP("Allocating URB\n");
-	ss->current_urb = usb_alloc_urb(0, GFP_KERNEL);
-	if (!ss->current_urb) {
+	us->current_urb = usb_alloc_urb(0, GFP_KERNEL);
+	if (!us->current_urb) {
 		US_DEBUGP("allocation failed\n");
 		return 2;
 	}
 
 	US_DEBUGP("Allocating scatter-gather request block\n");
-	ss->current_sg = kmalloc(sizeof(*ss->current_sg), GFP_KERNEL);
-	if (!ss->current_sg) {
+	us->current_sg = kmalloc(sizeof(*us->current_sg), GFP_KERNEL);
+	if (!us->current_sg) {
 		US_DEBUGP("allocation failed\n");
 		return 5;
 	}
@@ -471,32 +471,32 @@
 }
 
 /* Deallocate the URB, the usb_ctrlrequest, and the IRQ pipe.
- * ss->dev_semaphore must already be locked.
+ * us->dev_semaphore must already be locked.
  */
-static void usb_stor_deallocate_urbs(struct us_data *ss)
+static void usb_stor_deallocate_urbs(struct us_data *us)
 {
 	/* free the scatter-gather request block */
-	if (ss->current_sg) {
-		kfree(ss->current_sg);
-		ss->current_sg = NULL;
+	if (us->current_sg) {
+		kfree(us->current_sg);
+		us->current_sg = NULL;
 	}
 
 	/* free up the main URB for this device */
-	if (ss->current_urb) {
+	if (us->current_urb) {
 		US_DEBUGP("-- releasing main URB\n");
-		usb_free_urb(ss->current_urb);
-		ss->current_urb = NULL;
+		usb_free_urb(us->current_urb);
+		us->current_urb = NULL;
 	}
 
 	/* free the usb_ctrlrequest buffer */
-	if (ss->dr) {
-		kfree(ss->dr);
-		ss->dr = NULL;
+	if (us->dr) {
+		kfree(us->dr);
+		us->dr = NULL;
 	}
 
 	/* mark the device as gone */
-	usb_put_dev(ss->pusb_dev);
-	ss->pusb_dev = NULL;
+	usb_put_dev(us->pusb_dev);
+	us->pusb_dev = NULL;
 }
 
 /* Probe to see if a new device is actually a SCSI device */
@@ -512,7 +512,7 @@
 	char serial[USB_STOR_STRING_LEN];	     /* serial number */
 	unsigned int flags;
 	struct us_unusual_dev *unusual_dev;
-	struct us_data *ss = NULL;
+	struct us_data *us = NULL;
 	int result;
 
 	/* these are temporary copies -- we test on these, then put them
@@ -633,212 +633,212 @@
 			   serial, sizeof(serial));
 
 	/* New device -- allocate memory and initialize */
-	if ((ss = (struct us_data *)kmalloc(sizeof(struct us_data), 
+	if ((us = (struct us_data *)kmalloc(sizeof(struct us_data), 
 					    GFP_KERNEL)) == NULL) {
 		printk(KERN_WARNING USB_STORAGE "Out of memory\n");
 		usb_put_dev(dev);
 		return -ENOMEM;
 	}
-	memset(ss, 0, sizeof(struct us_data));
+	memset(us, 0, sizeof(struct us_data));
 
 	/* Initialize the mutexes only when the struct is new */
-	init_completion(&(ss->notify));
-	init_MUTEX_LOCKED(&(ss->dev_semaphore));
+	init_completion(&(us->notify));
+	init_MUTEX_LOCKED(&(us->dev_semaphore));
 
 	/* copy over the subclass and protocol data */
-	ss->subclass = subclass;
-	ss->protocol = protocol;
-	ss->flags = flags;
-	ss->unusual_dev = unusual_dev;
+	us->subclass = subclass;
+	us->protocol = protocol;
+	us->flags = flags;
+	us->unusual_dev = unusual_dev;
 
 	/* copy over the endpoint data */
-	ss->ep_in = ep_in->bEndpointAddress & 
+	us->ep_in = ep_in->bEndpointAddress & 
 		USB_ENDPOINT_NUMBER_MASK;
-	ss->ep_out = ep_out->bEndpointAddress & 
+	us->ep_out = ep_out->bEndpointAddress & 
 		USB_ENDPOINT_NUMBER_MASK;
 	if (ep_int) {
-		ss->ep_int = ep_int->bEndpointAddress & 
+		us->ep_int = ep_int->bEndpointAddress & 
 			USB_ENDPOINT_NUMBER_MASK;
-		ss->ep_bInterval = ep_int->bInterval;
+		us->ep_bInterval = ep_int->bInterval;
 	}
 	else
-		ss->ep_int = ss->ep_bInterval = 0;
+		us->ep_int = us->ep_bInterval = 0;
 
 	/* establish the connection to the new device */
-	ss->ifnum = ifnum;
-	ss->pusb_dev = dev;
+	us->ifnum = ifnum;
+	us->pusb_dev = dev;
 
 	/* copy over the identifiying strings */
-	strncpy(ss->vendor, mf, USB_STOR_STRING_LEN);
-	strncpy(ss->product, prod, USB_STOR_STRING_LEN);
-	strncpy(ss->serial, serial, USB_STOR_STRING_LEN);
-	if (strlen(ss->vendor) == 0) {
+	strncpy(us->vendor, mf, USB_STOR_STRING_LEN);
+	strncpy(us->product, prod, USB_STOR_STRING_LEN);
+	strncpy(us->serial, serial, USB_STOR_STRING_LEN);
+	if (strlen(us->vendor) == 0) {
 		if (unusual_dev->vendorName)
-			strncpy(ss->vendor, unusual_dev->vendorName,
+			strncpy(us->vendor, unusual_dev->vendorName,
 				USB_STOR_STRING_LEN);
 		else
-			strncpy(ss->vendor, "Unknown",
+			strncpy(us->vendor, "Unknown",
 				USB_STOR_STRING_LEN);
 	}
-	if (strlen(ss->product) == 0) {
+	if (strlen(us->product) == 0) {
 		if (unusual_dev->productName)
-			strncpy(ss->product, unusual_dev->productName,
+			strncpy(us->product, unusual_dev->productName,
 				USB_STOR_STRING_LEN);
 		else
-			strncpy(ss->product, "Unknown",
+			strncpy(us->product, "Unknown",
 				USB_STOR_STRING_LEN);
 	}
-	if (strlen(ss->serial) == 0)
-		strncpy(ss->serial, "None", USB_STOR_STRING_LEN);
+	if (strlen(us->serial) == 0)
+		strncpy(us->serial, "None", USB_STOR_STRING_LEN);
 
 	/* 
 	 * Set the handler pointers based on the protocol
 	 * Again, this data is persistent across reattachments
 	 */
-	switch (ss->protocol) {
+	switch (us->protocol) {
 	case US_PR_CB:
-		ss->transport_name = "Control/Bulk";
-		ss->transport = usb_stor_CB_transport;
-		ss->transport_reset = usb_stor_CB_reset;
-		ss->max_lun = 7;
+		us->transport_name = "Control/Bulk";
+		us->transport = usb_stor_CB_transport;
+		us->transport_reset = usb_stor_CB_reset;
+		us->max_lun = 7;
 		break;
 
 	case US_PR_CBI:
-		ss->transport_name = "Control/Bulk/Interrupt";
-		ss->transport = usb_stor_CBI_transport;
-		ss->transport_reset = usb_stor_CB_reset;
-		ss->max_lun = 7;
+		us->transport_name = "Control/Bulk/Interrupt";
+		us->transport = usb_stor_CBI_transport;
+		us->transport_reset = usb_stor_CB_reset;
+		us->max_lun = 7;
 		break;
 
 	case US_PR_BULK:
-		ss->transport_name = "Bulk";
-		ss->transport = usb_stor_Bulk_transport;
-		ss->transport_reset = usb_stor_Bulk_reset;
-		ss->max_lun = usb_stor_Bulk_max_lun(ss);
+		us->transport_name = "Bulk";
+		us->transport = usb_stor_Bulk_transport;
+		us->transport_reset = usb_stor_Bulk_reset;
+		us->max_lun = usb_stor_Bulk_max_lun(us);
 		break;
 
 #ifdef CONFIG_USB_STORAGE_HP8200e
 	case US_PR_SCM_ATAPI:
-		ss->transport_name = "SCM/ATAPI";
-		ss->transport = hp8200e_transport;
-		ss->transport_reset = usb_stor_CB_reset;
-		ss->max_lun = 1;
+		us->transport_name = "SCM/ATAPI";
+		us->transport = hp8200e_transport;
+		us->transport_reset = usb_stor_CB_reset;
+		us->max_lun = 1;
 		break;
 #endif
 
 #ifdef CONFIG_USB_STORAGE_SDDR09
 	case US_PR_EUSB_SDDR09:
-		ss->transport_name = "EUSB/SDDR09";
-		ss->transport = sddr09_transport;
-		ss->transport_reset = usb_stor_CB_reset;
-		ss->max_lun = 0;
+		us->transport_name = "EUSB/SDDR09";
+		us->transport = sddr09_transport;
+		us->transport_reset = usb_stor_CB_reset;
+		us->max_lun = 0;
 		break;
 #endif
 
 #ifdef CONFIG_USB_STORAGE_SDDR55
 	case US_PR_SDDR55:
-		ss->transport_name = "SDDR55";
-		ss->transport = sddr55_transport;
-		ss->transport_reset = sddr55_reset;
-		ss->max_lun = 0;
+		us->transport_name = "SDDR55";
+		us->transport = sddr55_transport;
+		us->transport_reset = sddr55_reset;
+		us->max_lun = 0;
 		break;
 #endif
 
 #ifdef CONFIG_USB_STORAGE_DPCM
 	case US_PR_DPCM_USB:
-		ss->transport_name = "Control/Bulk-EUSB/SDDR09";
-		ss->transport = dpcm_transport;
-		ss->transport_reset = usb_stor_CB_reset;
-		ss->max_lun = 1;
+		us->transport_name = "Control/Bulk-EUSB/SDDR09";
+		us->transport = dpcm_transport;
+		us->transport_reset = usb_stor_CB_reset;
+		us->max_lun = 1;
 		break;
 #endif
 
 #ifdef CONFIG_USB_STORAGE_FREECOM
 	case US_PR_FREECOM:
-		ss->transport_name = "Freecom";
-		ss->transport = freecom_transport;
-		ss->transport_reset = usb_stor_freecom_reset;
-		ss->max_lun = 0;
+		us->transport_name = "Freecom";
+		us->transport = freecom_transport;
+		us->transport_reset = usb_stor_freecom_reset;
+		us->max_lun = 0;
 		break;
 #endif
 
 #ifdef CONFIG_USB_STORAGE_DATAFAB
 	case US_PR_DATAFAB:
-		ss->transport_name  = "Datafab Bulk-Only";
-		ss->transport = datafab_transport;
-		ss->transport_reset = usb_stor_Bulk_reset;
-		ss->max_lun = 1;
+		us->transport_name  = "Datafab Bulk-Only";
+		us->transport = datafab_transport;
+		us->transport_reset = usb_stor_Bulk_reset;
+		us->max_lun = 1;
 		break;
 #endif
 
 #ifdef CONFIG_USB_STORAGE_JUMPSHOT
 	case US_PR_JUMPSHOT:
-		ss->transport_name  = "Lexar Jumpshot Control/Bulk";
-		ss->transport = jumpshot_transport;
-		ss->transport_reset = usb_stor_Bulk_reset;
-		ss->max_lun = 1;
+		us->transport_name  = "Lexar Jumpshot Control/Bulk";
+		us->transport = jumpshot_transport;
+		us->transport_reset = usb_stor_Bulk_reset;
+		us->max_lun = 1;
 		break;
 #endif
 
 	default:
-		/* ss->transport_name = "Unknown"; */
+		/* us->transport_name = "Unknown"; */
 		goto BadDevice;
 	}
-	US_DEBUGP("Transport: %s\n", ss->transport_name);
+	US_DEBUGP("Transport: %s\n", us->transport_name);
 
 	/* fix for single-lun devices */
-	if (ss->flags & US_FL_SINGLE_LUN)
-		ss->max_lun = 0;
+	if (us->flags & US_FL_SINGLE_LUN)
+		us->max_lun = 0;
 
-	switch (ss->subclass) {
+	switch (us->subclass) {
 	case US_SC_RBC:
-		ss->protocol_name = "Reduced Block Commands (RBC)";
-		ss->proto_handler = usb_stor_transparent_scsi_command;
+		us->protocol_name = "Reduced Block Commands (RBC)";
+		us->proto_handler = usb_stor_transparent_scsi_command;
 		break;
 
 	case US_SC_8020:
-		ss->protocol_name = "8020i";
-		ss->proto_handler = usb_stor_ATAPI_command;
-		ss->max_lun = 0;
+		us->protocol_name = "8020i";
+		us->proto_handler = usb_stor_ATAPI_command;
+		us->max_lun = 0;
 		break;
 
 	case US_SC_QIC:
-		ss->protocol_name = "QIC-157";
-		ss->proto_handler = usb_stor_qic157_command;
-		ss->max_lun = 0;
+		us->protocol_name = "QIC-157";
+		us->proto_handler = usb_stor_qic157_command;
+		us->max_lun = 0;
 		break;
 
 	case US_SC_8070:
-		ss->protocol_name = "8070i";
-		ss->proto_handler = usb_stor_ATAPI_command;
-		ss->max_lun = 0;
+		us->protocol_name = "8070i";
+		us->proto_handler = usb_stor_ATAPI_command;
+		us->max_lun = 0;
 		break;
 
 	case US_SC_SCSI:
-		ss->protocol_name = "Transparent SCSI";
-		ss->proto_handler = usb_stor_transparent_scsi_command;
+		us->protocol_name = "Transparent SCSI";
+		us->proto_handler = usb_stor_transparent_scsi_command;
 		break;
 
 	case US_SC_UFI:
-		ss->protocol_name = "Uniform Floppy Interface (UFI)";
-		ss->proto_handler = usb_stor_ufi_command;
+		us->protocol_name = "Uniform Floppy Interface (UFI)";
+		us->proto_handler = usb_stor_ufi_command;
 		break;
 
 #ifdef CONFIG_USB_STORAGE_ISD200
 	case US_SC_ISD200:
-		ss->protocol_name = "ISD200 ATA/ATAPI";
-		ss->proto_handler = isd200_ata_command;
+		us->protocol_name = "ISD200 ATA/ATAPI";
+		us->proto_handler = isd200_ata_command;
 		break;
 #endif
 
 	default:
-		/* ss->protocol_name = "Unknown"; */
+		/* us->protocol_name = "Unknown"; */
 		goto BadDevice;
 	}
-	US_DEBUGP("Protocol: %s\n", ss->protocol_name);
+	US_DEBUGP("Protocol: %s\n", us->protocol_name);
 
 	/* allocate the URB, the usb_ctrlrequest, and the IRQ URB */
-	if (usb_stor_allocate_urbs(ss))
+	if (usb_stor_allocate_urbs(us))
 		goto BadDevice;
 
 	/*
@@ -849,59 +849,59 @@
 	/* Just before we start our control thread, initialize
 	 * the device if it needs initialization */
 	if (unusual_dev && unusual_dev->initFunction)
-		unusual_dev->initFunction(ss);
+		unusual_dev->initFunction(us);
 
 	/* start up our control thread */
-	atomic_set(&ss->sm_state, US_STATE_IDLE);
-	ss->pid = kernel_thread(usb_stor_control_thread, ss,
+	atomic_set(&us->sm_state, US_STATE_IDLE);
+	us->pid = kernel_thread(usb_stor_control_thread, us,
 				CLONE_VM);
-	if (ss->pid < 0) {
+	if (us->pid < 0) {
 		printk(KERN_WARNING USB_STORAGE 
 		       "Unable to start control thread\n");
 		goto BadDevice;
 	}
 
 	/* wait for the thread to start */
-	wait_for_completion(&(ss->notify));
+	wait_for_completion(&(us->notify));
 
 	/* unlock the device pointers */
-	up(&(ss->dev_semaphore));
+	up(&(us->dev_semaphore));
 
 	/* now register	*/
-	ss->host = scsi_register(&usb_stor_host_template, sizeof(ss));
-	if (!ss->host) {
+	us->host = scsi_register(&usb_stor_host_template, sizeof(us));
+	if (!us->host) {
 		printk(KERN_WARNING USB_STORAGE
 			"Unable to register the scsi host\n");
 
 		/* tell the control thread to exit */
-		ss->srb = NULL;
-		up(&ss->sema);
-		wait_for_completion(&ss->notify);
+		us->srb = NULL;
+		up(&us->sema);
+		wait_for_completion(&us->notify);
 
 		/* re-lock the device pointers */
-		down(&ss->dev_semaphore);
+		down(&us->dev_semaphore);
 		goto BadDevice;
 	}
 
 	/* set the hostdata to prepare for scanning */
-	ss->host->hostdata[0] = (unsigned long)ss;
+	us->host->hostdata[0] = (unsigned long)us;
 
 	/* associate this host with our interface */
-	scsi_set_device(ss->host, &intf->dev);
+	scsi_set_device(us->host, &intf->dev);
 
 	/* now add the host */
-	result = scsi_add_host(ss->host, NULL);
+	result = scsi_add_host(us->host, NULL);
 	if (result) {
 		printk(KERN_WARNING USB_STORAGE
 			"Unable to add the scsi host\n");
 
 		/* tell the control thread to exit */
-		ss->srb = NULL;
-		up(&ss->sema);
-		wait_for_completion(&ss->notify);
+		us->srb = NULL;
+		up(&us->sema);
+		wait_for_completion(&us->notify);
 
 		/* re-lock the device pointers */
-		down(&ss->dev_semaphore);
+		down(&us->dev_semaphore);
 		goto BadDevice;
 	}
 
@@ -911,66 +911,61 @@
 	       "USB Mass Storage device found at %d\n", dev->devnum);
 
 	/* save a pointer to our structure */
-	usb_set_intfdata(intf, ss);
+	usb_set_intfdata(intf, us);
 	return 0;
 
 	/* we come here if there are any problems */
-	/* ss->dev_semaphore must be locked */
+	/* us->dev_semaphore must be locked */
 BadDevice:
 	US_DEBUGP("storage_probe() failed\n");
-	usb_stor_deallocate_urbs(ss);
-	up(&ss->dev_semaphore);
-	kfree(ss);
+	usb_stor_deallocate_urbs(us);
+	up(&us->dev_semaphore);
+	kfree(us);
 	return -EIO;
 }
 
 /* Handle a disconnect event from the USB core */
 static void storage_disconnect(struct usb_interface *intf)
 {
-	struct us_data *ss;
+	struct us_data *us;
 	struct scsi_device *sdev;
 
 	US_DEBUGP("storage_disconnect() called\n");
 
-	ss = usb_get_intfdata(intf);
+	us = usb_get_intfdata(intf);
 	usb_set_intfdata(intf, NULL);
 
-	/* serious error -- we're attempting to disconnect an interface but
-	 * cannot locate the local data structure
-	 */
-	BUG_ON(ss == NULL);
-
 	/* set devices offline -- need host lock for this */
-	scsi_lock(ss->host);
-	list_for_each_entry(sdev, &ss->host->my_devices, siblings)
+	scsi_lock(us->host);
+	list_for_each_entry(sdev, &us->host->my_devices, siblings)
 		sdev->online = 0;
-	scsi_unlock(ss->host);
+	scsi_unlock(us->host);
 
 	/* lock device access -- no need to unlock, as we're going away */
-	down(&(ss->dev_semaphore));
+	down(&(us->dev_semaphore));
 
 	/* Complete all pending commands with * cmd->result = DID_ERROR << 16.
 	 * Since we only queue one command at a time, this is pretty easy. */
-	if (ss->srb) {
-		ss->srb->result = DID_ERROR << 16;
-		ss->srb->scsi_done(ss->srb);
+	if (us->srb) {
+		us->srb->result = DID_ERROR << 16;
+		us->srb->scsi_done(us->srb);
 	}
 
 	/* TODO: somehow, wait for the device to
 	 * be 'idle' (tasklet completion) */
 
 	/* remove the pointer to the data structure we were using */
-	(struct us_data*)ss->host->hostdata[0] = NULL;
+	(struct us_data*)us->host->hostdata[0] = NULL;
 
 	/* begin SCSI host removal sequence */
-	if(scsi_remove_host(ss->host)) {
+	if(scsi_remove_host(us->host)) {
 		US_DEBUGP("-- SCSI refused to unregister\n");
 		BUG();
 		return;
 	};
 
 	/* finish SCSI host removal sequence */
-	scsi_unregister(ss->host);
+	scsi_unregister(us->host);
 
 	/* Kill the control threads
 	 *
@@ -978,34 +973,34 @@
 	 * notification that it has exited.
 	 */
 	US_DEBUGP("-- sending exit command to thread\n");
-	BUG_ON(atomic_read(&ss->sm_state) != US_STATE_IDLE);
-	ss->srb = NULL;
-	up(&(ss->sema));
-	wait_for_completion(&(ss->notify));
+	BUG_ON(atomic_read(&us->sm_state) != US_STATE_IDLE);
+	us->srb = NULL;
+	up(&(us->sema));
+	wait_for_completion(&(us->notify));
 
 	/* free allocated urbs */
-	usb_stor_deallocate_urbs(ss);
+	usb_stor_deallocate_urbs(us);
 
 	/* If there's extra data in the us_data structure then
 	 * free that first */
-	if (ss->extra) {
+	if (us->extra) {
 		/* call the destructor routine, if it exists */
-		if (ss->extra_destructor) {
+		if (us->extra_destructor) {
 			US_DEBUGP("-- calling extra_destructor()\n");
-			ss->extra_destructor(ss->extra);
+			us->extra_destructor(us->extra);
 		}
 
 		/* destroy the extra data */
 		US_DEBUGP("-- freeing the data structure\n");
-		kfree(ss->extra);
+		kfree(us->extra);
 	}
 
 	/* up the semaphore so auto-code-checkers won't complain about
 	 * the down/up imbalance */
-	up(&(ss->dev_semaphore));
+	up(&(us->dev_semaphore));
 
 	/* free the structure itself */
-	kfree (ss);
+	kfree (us);
 }
 
 /***********************************************************************
diff -Nru a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
--- a/drivers/video/aty/aty128fb.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/video/aty/aty128fb.c	Sat Apr 19 19:51:47 2003
@@ -62,7 +62,7 @@
 #ifdef CONFIG_ALL_PPC
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
-#include "macmodes.h"
+#include "../macmodes.h"
 #endif
 
 #ifdef CONFIG_ADB_PMU
@@ -1994,23 +1994,21 @@
 
 	if (regno < 16) {
 		int i;
+		u32 *pal = info->pseudo_palette;
+
 		switch (par->crtc.depth) {
 		case 15:
-			((u16 *) (info->pseudo_palette))[regno] =
-			    (regno << 10) | (regno << 5) | regno;
+			pal[regno] = (regno << 10) | (regno << 5) | regno;
 			break;
 		case 16:
-			((u16 *) (info->pseudo_palette))[regno] =
-			    (regno << 11) | (regno << 6) | regno;
+			pal[regno] = (regno << 11) | (regno << 6) | regno;
 			break;
 		case 24:
-			((u32 *) (info->pseudo_palette))[regno] =
-			    (regno << 16) | (regno << 8) | regno;
+			pal[regno] = (regno << 16) | (regno << 8) | regno;
 			break;
 		case 32:
 			i = (regno << 8) | regno;
-			((u32 *) (info->pseudo_palette))[regno] =
-			    (i << 16) | i;
+			pal[regno] = (i << 16) | i;
 			break;
 		}
 	}
diff -Nru a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
--- a/drivers/video/aty/atyfb_base.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/video/aty/atyfb_base.c	Sat Apr 19 19:51:49 2003
@@ -2278,15 +2278,25 @@
 			return -ENOMEM;
 		}
 		memset(info, 0, sizeof(struct fb_info));
-		info->fix = atyfb_fix;		
+
+		default_par = kmalloc(sizeof(struct atyfb_par), GFP_ATOMIC);
+		if (!default_par) {
+			printk
+			    ("atyfb_init: can't alloc atyfb_par\n");
+			kfree(info);
+			return -ENXIO;
+		}
+		memset(default_par, 0, sizeof(struct atyfb_par));
+
+		info->fix = atyfb_fix;
 
 		/*
 		 *  Map the video memory (physical address given) to somewhere in the
 		 *  kernel address space.
 		 */
-		info->screen_base = (unsigned long)ioremap(phys_vmembase[m64_num],
+		info->screen_base = ioremap(phys_vmembase[m64_num],
 					 		   phys_size[m64_num]);	
-		info->fix.smem_start = info->screen_base;	/* Fake! */
+		info->fix.smem_start = (unsigned long)info->screen_base;	/* Fake! */
 		default_par->ati_regbase = (unsigned long)ioremap(phys_guiregbase[m64_num],
 							  0x10000) + 0xFC00ul;
 		info->fix.mmio_start = default_par->ati_regbase; /* Fake! */
diff -Nru a/drivers/video/cfbimgblt.c b/drivers/video/cfbimgblt.c
--- a/drivers/video/cfbimgblt.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/video/cfbimgblt.c	Sat Apr 19 19:51:48 2003
@@ -329,7 +329,7 @@
 	if (p->fbops->fb_sync)
 		p->fbops->fb_sync(p);
 
-	if (image->depth == 0) {
+	if (image->depth == 1) {
 		if (p->fix.visual == FB_VISUAL_TRUECOLOR ||
 		    p->fix.visual == FB_VISUAL_DIRECTCOLOR) {
 			fgcolor = ((u32*)(p->pseudo_palette))[image->fg_color];
@@ -346,7 +346,7 @@
 		else 
 			slow_imageblit(image, p, dst1, fgcolor, bgcolor,
 					start_index, pitch_index);
-	} else if (image->depth == bpp) 
+	} else if (image->depth <= bpp) 
 		color_imageblit(image, p, dst1, start_index, pitch_index);
 }
 
diff -Nru a/drivers/video/clps711xfb.c b/drivers/video/clps711xfb.c
--- a/drivers/video/clps711xfb.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/video/clps711xfb.c	Sat Apr 19 19:51:28 2003
@@ -342,7 +342,7 @@
 	 * CLPS7110 - no on-board SRAM
 	 * EP7212   - 38400 bytes
 	 */
-	if (size < 38400) {
+	if (size <= 38400) {
 		printk(KERN_INFO "CLPS711xFB: could use on-board SRAM?\n");
 	}
 
diff -Nru a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
--- a/drivers/video/console/fbcon.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/video/console/fbcon.c	Sat Apr 19 19:51:49 2003
@@ -139,8 +139,6 @@
 
 static int vbl_cursor_cnt;
 static int cursor_blink_rate;
-static int cursor_drawn;
-static int cursor_on;
 
 #define divides(a, b)	((!(a) || (b)%(a)) ? 0 : 1)
 
@@ -173,7 +171,6 @@
  */
 static void fbcon_set_display(struct vc_data *vc, int init, int logo);
 static __inline__ int real_y(struct display *p, int ypos);
-static void fb_vbl_handler(int irq, void *dummy, struct pt_regs *fp);
 static __inline__ void updatescrollmode(struct display *p, struct vc_data *vc);
 static __inline__ void ywrap_up(struct vc_data *vc, int count);
 static __inline__ void ywrap_down(struct vc_data *vc, int count);
@@ -194,6 +191,27 @@
 }
 #endif
 
+static void fb_flashcursor(void *private)
+{
+	struct fb_info *info = (struct fb_info *) private;
+
+	/* Test to see if the cursor is erased but still on */
+	if (!info || (info->cursor.rop == ROP_COPY))
+		return;
+	info->cursor.enable ^= 1;
+	info->fbops->fb_cursor(info, &info->cursor);
+}
+
+static void fb_vbl_handler(int irq, void *dev_id, struct pt_regs *fp)
+{
+	struct fb_info *info = dev_id;
+
+	if (vbl_cursor_cnt && --vbl_cursor_cnt == 0) {
+		schedule_work(&info->queue);	
+		vbl_cursor_cnt = cursor_blink_rate; 
+	}
+}
+	
 static void cursor_timer_handler(unsigned long dev_addr);
 
 static struct timer_list cursor_timer =
@@ -203,8 +221,8 @@
 {
 	struct fb_info *info = (struct fb_info *) dev_addr;
 	
-	fb_vbl_handler(0, info, NULL);
-	cursor_timer.expires = jiffies + HZ / 50;
+	schedule_work(&info->queue);	
+	cursor_timer.expires = jiffies + HZ / 5;
 	add_timer(&cursor_timer);
 }
 
@@ -290,14 +308,14 @@
 			    const unsigned short *s)
 {
 	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-	unsigned int width = (vc->vc_font.width + 7)/8;
+	unsigned int width = (vc->vc_font.width + 7) >> 3;
 	unsigned int cellsize = vc->vc_font.height * width;
 	unsigned int maxcnt = info->pixmap.size/cellsize;
 	unsigned int shift_low = 0, mod = vc->vc_font.width % 8;
 	unsigned int shift_high = 8, size, pitch, cnt, k;
 	unsigned int buf_align = info->pixmap.buf_align - 1;
 	unsigned int scan_align = info->pixmap.scan_align - 1;
-	unsigned int idx = vc->vc_font.width/8;
+	unsigned int idx = vc->vc_font.width >> 3;
 	u8 mask, *src, *dst, *dst0;
 
 	while (count) {
@@ -307,7 +325,7 @@
 			cnt = k = count;
 
 		image->width = vc->vc_font.width * cnt;
-		pitch = (image->width + 7)/8 + scan_align;
+		pitch = ((image->width + 7) >> 3) + scan_align;
 		pitch &= ~scan_align;
 		size = pitch * vc->vc_font.height + buf_align;
 		size &= ~buf_align;
@@ -338,7 +356,7 @@
 			  const unsigned short *s)
 {
 	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-	unsigned int width = vc->vc_font.width/8;
+	unsigned int width = vc->vc_font.width >> 3;
 	unsigned int cellsize = vc->vc_font.height * width;
 	unsigned int maxcnt = info->pixmap.size/cellsize;
 	unsigned int scan_align = info->pixmap.scan_align - 1;
@@ -411,7 +429,7 @@
                       int c, int ypos, int xpos)
 {
 	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-	unsigned int width = (vc->vc_font.width + 7)/8;
+	unsigned int width = (vc->vc_font.width + 7) >> 3;
 	unsigned int scan_align = info->pixmap.scan_align - 1;
 	unsigned int buf_align = info->pixmap.buf_align - 1;
 	int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
@@ -426,7 +444,7 @@
 	image.height = vc->vc_font.height;
 	image.fg_color = attr_fgcol(fgshift, c);
 	image.bg_color = attr_bgcol(bgshift, c);
-	image.depth = 0;
+	image.depth = 1;
 
 	pitch = width + scan_align;
 	pitch &= ~scan_align;
@@ -457,7 +475,7 @@
 	image.dx = xx * vc->vc_font.width;
 	image.dy = yy * vc->vc_font.height;
 	image.height = vc->vc_font.height;
-	image.depth = 0;
+	image.depth = 1;
 
 	if (!(vc->vc_font.width & 7))
                putcs_aligned(vc, info, &image, count, s);
@@ -501,7 +519,6 @@
  *  Low Level Operations
  */
 /* NOTE: fbcon cannot be __init: it may be called from take_over_console later */
-
 static const char *fbcon_startup(void)
 {
 	const char *display_desc = "frame buffer device";
@@ -559,6 +576,12 @@
 
 	vc = (struct vc_data *) kmalloc(sizeof(struct vc_data), GFP_ATOMIC); 
 
+	if (!vc) {
+		if (softback_buf)
+			kfree((void *) softback_buf);
+		return NULL;
+	}
+
 	/* Setup default font */
 	vc->vc_font.data = font->data;
 	vc->vc_font.width = font->width;
@@ -639,9 +662,12 @@
 	irqres = request_irq(IRQ_VSYNCPULSE, fb_vbl_handler, SA_SHIRQ,
 			     "framebuffer vbl", info);
 #endif
-
-	if (irqres) {
-		cursor_blink_rate = DEFAULT_CURSOR_BLINK_RATE;
+	/* Initialize the work queue. If the driver provides its
+	 * own work queue this means it will use something besides 
+	 * default timer to flash the cursor. */
+	if (!info->queue.func) {
+		INIT_WORK(&info->queue, fb_flashcursor, info);
+		
 		cursor_timer.expires = jiffies + HZ / 50;
 		cursor_timer.data = (unsigned long ) info;
 		add_timer(&cursor_timer);
@@ -956,112 +982,17 @@
 	accel_putcs(vc, info, s, count, real_y(p, ypos), xpos);
 }
 
-void accel_cursor(struct vc_data *vc, struct fb_info *info, struct fb_cursor *cursor,
-		  int yy)
+static void fbcon_cursor(struct vc_data *vc, int mode)
 {
+	struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
 	unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
 	int bgshift = (vc->vc_hi_font_mask) ? 13 : 12;
 	int fgshift = (vc->vc_hi_font_mask) ? 9 : 8;
-	int height, width, size, c;
-	int w, cur_height, i = 0;
-	char *font, *mask, *data;
-	
-	if (cursor->set & FB_CUR_SETCUR)
-		cursor->enable = 1;
-	else
-		cursor->enable = 0;
-
-	cursor->set |= FB_CUR_SETPOS;
-
-	height = info->cursor.image.height;
-	width = info->cursor.image.width;
-
-	if (width != vc->vc_font.width || 
-	    height != vc->vc_font.height) {
-		width = vc->vc_font.width;
-		height = vc->vc_font.height;
-		cursor->set |= FB_CUR_SETSIZE;
-	}	
-
-	size = ((width + 7) >> 3) * height;
-
-	data = kmalloc(size, GFP_KERNEL);
-	mask = kmalloc(size, GFP_KERNEL);
-	
-	if (cursor->set & FB_CUR_SETSIZE) {
-		memset(data, 0xff, size);
-		cursor->set |= FB_CUR_SETSHAPE;
-	}
-
-	c = scr_readw((u16 *) vc->vc_pos);
-
-	if (info->cursor.image.fg_color != attr_fgcol(fgshift, c) ||
-	    info->cursor.image.bg_color != attr_bgcol(bgshift, c)) {
-		cursor->image.fg_color = attr_fgcol(fgshift, c);
-		cursor->image.bg_color = attr_bgcol(bgshift, c);
-		cursor->set |= FB_CUR_SETCMAP;
-	}
-	font = vc->vc_font.data + ((c & charmask) * size);
-	if (font != info->cursor.dest) {
-		cursor->dest = font;
-		cursor->set |= FB_CUR_SETDEST;
-	}
-
-	w = (width + 7) >> 3;
-
-	switch (vc->vc_cursor_type & 0x0f) {
-		case CUR_NONE:
-			cur_height = 0;
-			break;
-		case CUR_UNDERLINE:
-			cur_height = (height < 10) ? 1 : 2;
-			break;
-		case CUR_LOWER_THIRD:
-			cur_height = height/3;
-			break;
-		case CUR_LOWER_HALF:
-			cur_height = height/2;
-			break;
-		case CUR_TWO_THIRDS:
-			cur_height = (height * 2)/3;
-			break;
-		case CUR_BLOCK:
-		default:
-			cur_height = height;
-			break;
-	}
-
-	size = (height - cur_height) * w;
-	while (size--)
-		mask[i++] = 0;
-	size = cur_height * w;
-	while (size--)
-		mask[i++] = 0xff;
-
-	if (!info->cursor.mask ||  (memcmp(mask, info->cursor.mask, w*height)))
-		cursor->set |= FB_CUR_SETSHAPE;
-
-	cursor->image.width = width;
-	cursor->image.height = height;
-	cursor->image.dx = vc->vc_x * width;
-	cursor->image.dy = yy * height;
-	cursor->image.depth = 0;
-	cursor->image.data = data;
-	cursor->mask = mask;
-	cursor->rop = ROP_XOR;
-
-	info->fbops->fb_cursor(info, cursor);
-	kfree(data);
-	kfree(mask);
-}
-	
-static void fbcon_cursor(struct vc_data *vc, int mode)
-{
-	struct fb_info *info = registered_fb[(int) con2fb_map[vc->vc_num]];
 	struct display *p = &fb_display[vc->vc_num];
+	int w = (vc->vc_font.width + 7) >> 3, c;
+	int y = real_y(p, vc->vc_y);
 	struct fb_cursor cursor;
-	int y = vc->vc_y;
-
+	
 	if (mode & CM_SOFTBACK) {
 		mode &= ~CM_SOFTBACK;
 		if (softback_lines) {
@@ -1073,55 +1004,93 @@
 	} else if (softback_lines)
 		fbcon_set_origin(vc);
 
-	/* Avoid flickering if there's no real change. */
-	if ((mode == CM_ERASE) == !cursor_on)
-		return;
-
-	cursor_on = 0;
+ 	c = scr_readw((u16 *) vc->vc_pos);
 
+	cursor.image.data = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
+	cursor.set = FB_CUR_SETCUR;
+	cursor.image.depth = 1;
+	
 	switch (mode) {
 	case CM_ERASE:
-		if (cursor_drawn) {
-			cursor.set = 0;
-			accel_cursor(vc, info, &cursor,
-				     real_y(p, y));
+		if (info->cursor.rop == ROP_XOR) {
+			info->cursor.enable = 0;
+			info->cursor.rop = ROP_COPY;
+			info->fbops->fb_cursor(info, &cursor);
 		}	
-		cursor_drawn = 0;
 		break;
 	case CM_MOVE:
 	case CM_DRAW:
-		if (cursor_drawn) {
-			cursor.set = FB_CUR_SETCUR;
-			accel_cursor(vc, info, &cursor, 
-				     real_y(p, y));
-		}	
+		info->cursor.enable = 1;
+		
+		if (info->cursor.image.fg_color != attr_fgcol(fgshift, c) ||
+	    	    info->cursor.image.bg_color != attr_bgcol(bgshift, c)) {
+			cursor.image.fg_color = attr_fgcol(fgshift, c);
+			cursor.image.bg_color = attr_bgcol(bgshift, c);
+			cursor.set |= FB_CUR_SETCMAP;
+		}
+		
+		if ((info->cursor.image.dx != (vc->vc_font.width * vc->vc_x)) ||
+		    (info->cursor.image.dy != (vc->vc_font.height * y))) {
+			cursor.image.dx = vc->vc_font.width * vc->vc_x;
+			cursor.image.dy = vc->vc_font.height * y;
+			cursor.set |= FB_CUR_SETPOS;
+		}
+
+		if (info->cursor.image.height != vc->vc_font.height ||
+		    info->cursor.image.width != vc->vc_font.width) {
+			cursor.image.height = vc->vc_font.height;
+			cursor.image.width = vc->vc_font.width;
+			cursor.set |= FB_CUR_SETSIZE;
+		}
+
+		if ((cursor.set & FB_CUR_SETSIZE) || ((vc->vc_cursor_type & 0x0f) != p->cursor_shape)) {
+			char *mask = kmalloc(w*vc->vc_font.height, GFP_ATOMIC);
+			int cur_height, size, i = 0;
+
+			if (!mask)	return;	
+		
+			if (info->cursor.mask)
+				kfree(info->cursor.mask);
+			info->cursor.mask = mask;
+	
+			p->cursor_shape = vc->vc_cursor_type & 0x0f;
+			cursor.set |= FB_CUR_SETSHAPE;
+
+			switch (vc->vc_cursor_type & 0x0f) {
+			case CUR_NONE:
+				cur_height = 0;
+				break;
+			case CUR_UNDERLINE:
+				cur_height = (vc->vc_font.height < 10) ? 1 : 2;
+				break;
+			case CUR_LOWER_THIRD:
+				cur_height = vc->vc_font.height/3;
+				break;
+			case CUR_LOWER_HALF:
+				cur_height = vc->vc_font.height >> 1;
+				break;
+			case CUR_TWO_THIRDS:
+				cur_height = (vc->vc_font.height << 1)/3;
+				break;
+			case CUR_BLOCK:
+			default:
+				cur_height = vc->vc_font.height;
+				break;
+			}
+			size = (vc->vc_font.height - cur_height) * w;
+			while (size--)
+				mask[i++] = 0;
+			size = cur_height * w;
+			while (size--)
+				mask[i++] = 0xff;
+		}
+        	info->cursor.rop = ROP_XOR;
+		info->fbops->fb_cursor(info, &cursor);
 		vbl_cursor_cnt = CURSOR_DRAW_DELAY;
-		cursor_on = 1;
 		break;
 	}
 }
 
-static void fb_vbl_handler(int irq, void *dev_id, struct pt_regs *fp)
-{
-	struct fb_info *info = dev_id;
-	struct display *p = &fb_display[fg_console];
-	struct vc_data *vc = vc_cons[fg_console].d;
-	struct fb_cursor cursor;
-	
-	if (!cursor_on)
-		return;
-
-	if (vbl_cursor_cnt && --vbl_cursor_cnt == 0) {
-		cursor.set = 0;
-
-		if (!cursor_drawn)
-			cursor.set = FB_CUR_SETCUR;
-		accel_cursor(vc, info, &cursor, real_y(p, vc->vc_y));
-		cursor_drawn ^= 1;
-		vbl_cursor_cnt = cursor_blink_rate; 
-	}
-}	
-	
 static int scrollback_phys_max = 0;
 static int scrollback_max = 0;
 static int scrollback_current = 0;
@@ -1129,7 +1098,7 @@
 int update_var(int con, struct fb_info *info)
 {
 	if (con == info->currcon) 
-		return fb_pan_display(&info->var, info);
+		return fb_pan_display(info, &info->var);
 	return 0;
 }
 
@@ -1632,16 +1601,16 @@
 	if (x_diff < 0 || x_diff > fw ||
 	   (y_diff < 0 || y_diff > fh)) {
 		var.activate = FB_ACTIVATE_TEST;
-		err = fb_set_var(&var, info);
+		err = fb_set_var(info, &var);
 		if (err || width > var.xres/fw ||
 		    height > var.yres/fh)
 			return -EINVAL;
 		DPRINTK("resize now %ix%i\n", var.xres, var.yres);
 		var.activate = FB_ACTIVATE_NOW;
-		fb_set_var(&var, info);
+		fb_set_var(info, &var);
 	}
 	p->vrows = var.yres_virtual/fh;
-	if(var.yres > (fh * (height + 1)))
+	if (var.yres > (fh * (height + 1)))
 		p->vrows -= (var.yres - (fh * height)) / fh;
 	return 0;
 }
@@ -1748,7 +1717,7 @@
 			update_screen(vc->vc_num);
 		return 0;
 	} else
-		return fb_blank(blank, info);
+		return fb_blank(info, blank);
 }
 
 static void fbcon_free_font(struct display *p)
diff -Nru a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h
--- a/drivers/video/console/fbcon.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/video/console/fbcon.h	Sat Apr 19 19:51:49 2003
@@ -33,6 +33,7 @@
     u_short scrollmode;             /* Scroll Method */
     short yscroll;                  /* Hardware scrolling */
     int vrows;                      /* number of virtual rows */
+    int cursor_shape;
 };
 
 /* drivers/video/console/fbcon.c */
diff -Nru a/drivers/video/controlfb.c b/drivers/video/controlfb.c
--- a/drivers/video/controlfb.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/video/controlfb.c	Sat Apr 19 19:51:29 2003
@@ -376,13 +376,12 @@
 		int i;
 		switch (p->par.cmode) {
 		case CMODE_16:
-			((u16 *) (info->pseudo_palette))[regno] =
+			p->pseudo_palette[regno] =
 			    (regno << 10) | (regno << 5) | regno;
 			break;
 		case CMODE_32:
 			i = (regno << 8) | regno;
-			((u32 *) (info->pseudo_palette))[regno] =
-			    (i << 16) | i;
+			p->pseudo_palette[regno] = (i << 16) | i;
 			break;
 		}
 	}
@@ -475,7 +474,6 @@
 		var.yres_virtual = vyres;
 
 	/* Apply default var */
-	p->info.var = var;
 	var.activate = FB_ACTIVATE_NOW;
 	rc = fb_set_var(&var, &p->info);
 	if (rc && (vmode != VMODE_640_480_60 || cmode != CMODE_8))
@@ -1068,17 +1066,7 @@
 		return;
 
 	while ((this_opt = strsep(&options, ",")) != NULL) {
-		if (!strncmp(this_opt, "font:", 5)) {
-			char *p;
-			int i;
-
-			p = this_opt +5;
-			for (i = 0; i < sizeof(fontname) - 1; i++)
-				if (!*p || *p == ' ' || *p == ',')
-					break;
-			memcpy(fontname, this_opt + 5, i);
-			fontname[i] = 0;
-		} else if (!strncmp(this_opt, "vmode:", 6)) {
+		if (!strncmp(this_opt, "vmode:", 6)) {
 			int vmode = simple_strtoul(this_opt+6, NULL, 0);
 			if (vmode > 0 && vmode <= VMODE_MAX &&
 			    control_mac_modes[vmode - 1].m[1] >= 0)
diff -Nru a/drivers/video/edid.h b/drivers/video/edid.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/drivers/video/edid.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,138 @@
+/* 
+ * drivers/video/edid.h - EDID/DDC Header
+ *
+ * Based on:
+ *   1. XFree86 4.3.0, edid.h
+ *      Copyright 1998 by Egbert Eich <Egbert.Eich@Physik.TU-Darmstadt.DE>
+ * 
+ *   2. John Fremlin <vii@users.sourceforge.net> and 
+ *      Ani Joshi <ajoshi@unixbox.com>
+ *
+ * DDC is a Trademark of VESA (Video Electronics Standard Association).
+ *
+ * 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.
+*/
+
+#ifndef __EDID_H__
+#define __EDID_H__
+
+#define EDID_LENGTH				0x80
+#define EDID_HEADER				0x00
+#define EDID_HEADER_END				0x07
+
+#define ID_MANUFACTURER_NAME			0x08
+#define ID_MANUFACTURER_NAME_END		0x09
+#define ID_MODEL				0x0a
+
+#define ID_SERIAL_NUMBER			0x0c
+
+#define MANUFACTURE_WEEK			0x10
+#define MANUFACTURE_YEAR			0x11
+
+#define EDID_STRUCT_VERSION			0x12
+#define EDID_STRUCT_REVISION			0x13
+
+#define EDID_STRUCT_DISPLAY                     0x14
+
+#define DPMS_FLAGS				0x18
+#define ESTABLISHED_TIMING_1			0x23
+#define ESTABLISHED_TIMING_2			0x24
+#define MANUFACTURERS_TIMINGS			0x25
+
+/* standard timings supported */
+#define STD_TIMING                              8
+#define STD_TIMING_DESCRIPTION_SIZE             2
+#define STD_TIMING_DESCRIPTIONS_START           0x26
+
+#define DETAILED_TIMING_DESCRIPTIONS_START	0x36
+#define DETAILED_TIMING_DESCRIPTION_SIZE	18
+#define NO_DETAILED_TIMING_DESCRIPTIONS		4
+
+#define DETAILED_TIMING_DESCRIPTION_1		0x36
+#define DETAILED_TIMING_DESCRIPTION_2		0x48
+#define DETAILED_TIMING_DESCRIPTION_3		0x5a
+#define DETAILED_TIMING_DESCRIPTION_4		0x6c
+
+#define DESCRIPTOR_DATA				5
+
+#define UPPER_NIBBLE( x ) \
+        (((128|64|32|16) & (x)) >> 4)
+
+#define LOWER_NIBBLE( x ) \
+        ((1|2|4|8) & (x))
+
+#define COMBINE_HI_8LO( hi, lo ) \
+        ( (((unsigned)hi) << 8) | (unsigned)lo )
+
+#define COMBINE_HI_4LO( hi, lo ) \
+        ( (((unsigned)hi) << 4) | (unsigned)lo )
+
+#define PIXEL_CLOCK_LO     (unsigned)block[ 0 ]
+#define PIXEL_CLOCK_HI     (unsigned)block[ 1 ]
+#define PIXEL_CLOCK	   (COMBINE_HI_8LO( PIXEL_CLOCK_HI,PIXEL_CLOCK_LO )*10000)
+#define H_ACTIVE_LO        (unsigned)block[ 2 ]
+#define H_BLANKING_LO      (unsigned)block[ 3 ]
+#define H_ACTIVE_HI        UPPER_NIBBLE( (unsigned)block[ 4 ] )
+#define H_ACTIVE           COMBINE_HI_8LO( H_ACTIVE_HI, H_ACTIVE_LO )
+#define H_BLANKING_HI      LOWER_NIBBLE( (unsigned)block[ 4 ] )
+#define H_BLANKING         COMBINE_HI_8LO( H_BLANKING_HI, H_BLANKING_LO )
+
+#define V_ACTIVE_LO        (unsigned)block[ 5 ]
+#define V_BLANKING_LO      (unsigned)block[ 6 ]
+#define V_ACTIVE_HI        UPPER_NIBBLE( (unsigned)block[ 7 ] )
+#define V_ACTIVE           COMBINE_HI_8LO( V_ACTIVE_HI, V_ACTIVE_LO )
+#define V_BLANKING_HI      LOWER_NIBBLE( (unsigned)block[ 7 ] )
+#define V_BLANKING         COMBINE_HI_8LO( V_BLANKING_HI, V_BLANKING_LO )
+
+#define H_SYNC_OFFSET_LO   (unsigned)block[ 8 ]
+#define H_SYNC_WIDTH_LO    (unsigned)block[ 9 ]
+
+#define V_SYNC_OFFSET_LO   UPPER_NIBBLE( (unsigned)block[ 10 ] )
+#define V_SYNC_WIDTH_LO    LOWER_NIBBLE( (unsigned)block[ 10 ] )
+
+#define V_SYNC_WIDTH_HI    ((unsigned)block[ 11 ] & (1|2))
+#define V_SYNC_OFFSET_HI   (((unsigned)block[ 11 ] & (4|8)) >> 2)
+
+#define H_SYNC_WIDTH_HI    (((unsigned)block[ 11 ] & (16|32)) >> 4)
+#define H_SYNC_OFFSET_HI   (((unsigned)block[ 11 ] & (64|128)) >> 6)
+
+#define V_SYNC_WIDTH       COMBINE_HI_4LO( V_SYNC_WIDTH_HI, V_SYNC_WIDTH_LO )
+#define V_SYNC_OFFSET      COMBINE_HI_4LO( V_SYNC_OFFSET_HI, V_SYNC_OFFSET_LO )
+
+#define H_SYNC_WIDTH       COMBINE_HI_4LO( H_SYNC_WIDTH_HI, H_SYNC_WIDTH_LO )
+#define H_SYNC_OFFSET      COMBINE_HI_4LO( H_SYNC_OFFSET_HI, H_SYNC_OFFSET_LO )
+
+#define H_SIZE_LO          (unsigned)block[ 12 ]
+#define V_SIZE_LO          (unsigned)block[ 13 ]
+
+#define H_SIZE_HI          UPPER_NIBBLE( (unsigned)block[ 14 ] )
+#define V_SIZE_HI          LOWER_NIBBLE( (unsigned)block[ 14 ] )
+
+#define H_SIZE             COMBINE_HI_8LO( H_SIZE_HI, H_SIZE_LO )
+#define V_SIZE             COMBINE_HI_8LO( V_SIZE_HI, V_SIZE_LO )
+
+#define H_BORDER           (unsigned)block[ 15 ]
+#define V_BORDER           (unsigned)block[ 16 ]
+
+#define FLAGS              (unsigned)block[ 17 ]
+
+#define INTERLACED         (FLAGS&128)
+#define SYNC_TYPE          (FLAGS&3<<3)	/* bits 4,3 */
+#define SYNC_SEPARATE      (3<<3)
+#define HSYNC_POSITIVE     (FLAGS & 4)
+#define VSYNC_POSITIVE     (FLAGS & 2)
+
+#define V_MIN_RATE              block[ 5 ]
+#define V_MAX_RATE              block[ 6 ]
+#define H_MIN_RATE              block[ 7 ]
+#define H_MAX_RATE              block[ 8 ]
+#define MAX_PIXEL_CLOCK         (((int)block[ 9 ]) * 10)
+#define GTF_SUPPORT		block[10]
+
+#define DPMS_ACTIVE_OFF		(1 << 5)
+#define DPMS_SUSPEND		(1 << 6)
+#define DPMS_STANDBY		(1 << 7)
+
+#endif /* __EDID_H__ */
diff -Nru a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c
--- a/drivers/video/fbcmap.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/video/fbcmap.c	Sat Apr 19 19:51:50 2003
@@ -154,11 +154,11 @@
  *
  */
 
-void fb_copy_cmap(struct fb_cmap *from, struct fb_cmap *to, int fsfromto)
+int fb_copy_cmap(struct fb_cmap *from, struct fb_cmap *to, int fsfromto)
 {
-    int size;
     int tooff = 0, fromoff = 0;
-
+    int size;
+    
     if (to->start > from->start)
 	fromoff = to->start-from->start;
     else
@@ -167,7 +167,7 @@
     if (size > (int) (from->len - fromoff))
 	size = from->len-fromoff;
     if (size <= 0)
-	return;
+	return -EINVAL;
     size *= sizeof(u16);
     
     switch (fsfromto) {
@@ -179,20 +179,29 @@
 	    memcpy(to->transp+tooff, from->transp+fromoff, size);
         break;
     case 1:
-	copy_from_user(to->red+tooff, from->red+fromoff, size);
-	copy_from_user(to->green+tooff, from->green+fromoff, size);
-	copy_from_user(to->blue+tooff, from->blue+fromoff, size);
+	if (copy_from_user(to->red+tooff, from->red+fromoff, size))
+		return -EFAULT;
+	if (copy_from_user(to->green+tooff, from->green+fromoff, size))
+		return -EFAULT;	
+	if (copy_from_user(to->blue+tooff, from->blue+fromoff, size))
+		return -EFAULT;
 	if (from->transp && to->transp)
-            copy_from_user(to->transp+tooff, from->transp+fromoff, size);
+            if (copy_from_user(to->transp+tooff, from->transp+fromoff, size))
+		    return -EFAULT;	
 	break;
     case 2:
-	copy_to_user(to->red+tooff, from->red+fromoff, size);
-	copy_to_user(to->green+tooff, from->green+fromoff, size);
-	copy_to_user(to->blue+tooff, from->blue+fromoff, size);
+	if (copy_to_user(to->red+tooff, from->red+fromoff, size))
+		return -EFAULT;
+	if (copy_to_user(to->green+tooff, from->green+fromoff, size))
+		return -EFAULT;
+	if (copy_to_user(to->blue+tooff, from->blue+fromoff, size))
+		return -EFAULT;
 	if (from->transp && to->transp)
-	    copy_to_user(to->transp+tooff, from->transp+fromoff, size);
+		if (copy_to_user(to->transp+tooff, from->transp+fromoff, size))
+			return -EFAULT;
 	break;
     }
+    return 0;
 }
 
 /**
diff -Nru a/drivers/video/fbmem.c b/drivers/video/fbmem.c
--- a/drivers/video/fbmem.c	Sat Apr 19 19:51:27 2003
+++ b/drivers/video/fbmem.c	Sat Apr 19 19:51:27 2003
@@ -403,22 +403,22 @@
 	return *src;
 }
 
-void sys_outbuf(u8 src, u8 *dst)
+void sys_outbuf(u8 *src, u8 *dst, unsigned int size)
 {
-	*dst = src;
+	memcpy(dst, src, size);
 }	
 
 void move_buf_aligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch, 
 			u32 s_pitch, u32 height)
 {
-	int i, j;
-	
+	int i;
+
 	for (i = height; i--; ) {
-		for (j = 0; j < s_pitch; j++)
-			info->pixmap.outbuf(*src++, dst+j);
+		info->pixmap.outbuf(src, dst, s_pitch);
+		src += s_pitch;
 		dst += d_pitch;
-	}	
-}	
+	}
+}
 
 void move_buf_unaligned(struct fb_info *info, u8 *dst, u8 *src, u32 d_pitch, 
 			u32 height, u32 mask, u32 shift_high, u32 shift_low,
@@ -432,20 +432,23 @@
 			tmp = info->pixmap.inbuf(dst+j);
 			tmp &= mask;
 			tmp |= *src >> shift_low;
-			info->pixmap.outbuf(tmp, dst+j);
-			info->pixmap.outbuf(*src << shift_high, dst+j+1);
+			info->pixmap.outbuf(&tmp, dst+j, 1);
+			tmp = *src << shift_high;
+			info->pixmap.outbuf(&tmp, dst+j+1, 1);
 			src++;
 		}
 		tmp = info->pixmap.inbuf(dst+idx);
 		tmp &= mask;
 		tmp |= *src >> shift_low;
-		info->pixmap.outbuf(tmp, dst+idx);
-		if (shift_high < mod)
-			info->pixmap.outbuf(*src<<shift_high, dst+idx+1);
+		info->pixmap.outbuf(&tmp, dst+idx, 1);
+		if (shift_high < mod) {
+			tmp = *src << shift_high;
+			info->pixmap.outbuf(&tmp, dst+idx+1, 1);
+		}	
 		src++;
 		dst += d_pitch;
-	}	
-}	
+	}
+}
 
 /*
  * we need to lock this section since fb_cursor
@@ -456,8 +459,7 @@
 	u32 align = info->pixmap.buf_align - 1;
 	u32 offset, count = 1000;
 
-	spin_lock_irqsave(&info->pixmap.lock,
-			  info->pixmap.lock_flags);
+	spin_lock(&info->pixmap.lock);
 	offset = info->pixmap.offset + align;
 	offset &= ~align;
 	if (offset + size > info->pixmap.size) {
@@ -468,12 +470,9 @@
 		offset = 0;
 	}
 	info->pixmap.offset = offset + size;
-
 	atomic_inc(&info->pixmap.count);	
 	smp_mb__after_atomic_inc();
-
-	spin_unlock_irqrestore(&info->pixmap.lock,
-			       info->pixmap.lock_flags);
+	spin_unlock(&info->pixmap.lock);
 	return offset;
 }
 
@@ -566,13 +565,13 @@
 
 static void __init fb_set_logo(struct fb_info *info,
 			       const struct linux_logo *logo, u8 *dst,
-			       int needs_logo)
+			       int depth)
 {
 	int i, j, shift;
 	const u8 *src = logo->data;
 	u8 d, xor = 0;
 
-	switch (needs_logo) {
+	switch (depth) {
 	case 4:
 		for (i = 0; i < logo->height; i++)
 			for (j = 0; j < logo->width; src++) {
@@ -620,20 +619,18 @@
  * to set the DAC or the pseudo_palette.  However, the bitmap is packed, ie,
  * each byte contains color information for two pixels (upper and lower nibble).
  * To be consistent with fb_imageblit() usage, we therefore separate the two
- * nibbles into separate bytes. The "needs_logo" flag will be set to 4.
+ * nibbles into separate bytes. The "depth" flag will be set to 4.
  *
  * Case 3 - linux_logo_mono:
  * This is similar with Case 2.  Each byte contains information for 8 pixels.
- * We isolate each bit and expand each into a byte. The "needs_logo" flag will
+ * We isolate each bit and expand each into a byte. The "depth" flag will
  * be set to 1.
  */
 static struct logo_data {
 	int depth;
-	int needs_logo;
 	int needs_directpalette;
 	int needs_truepalette;
 	int needs_cmapreset;
-	int type;
 	const struct linux_logo *logo;
 } fb_logo;
 
@@ -641,74 +638,48 @@
 {
 	memset(&fb_logo, 0, sizeof(struct logo_data));
 
-	fb_logo.depth = info->var.bits_per_pixel;
-
 	switch (info->fix.visual) {
 	case FB_VISUAL_TRUECOLOR:
-		if (fb_logo.depth >= 8) {
+		if (info->var.bits_per_pixel >= 8)
 			fb_logo.needs_truepalette = 1;
-			fb_logo.needs_logo = 8;
-		} else if (fb_logo.depth >= 4)
-			fb_logo.needs_logo = 4;
-		else 
-			fb_logo.needs_logo = 1;
 		break;
 	case FB_VISUAL_DIRECTCOLOR:
-		if (fb_logo.depth >= 24) {
+		if (info->var.bits_per_pixel >= 24) {
 			fb_logo.needs_directpalette = 1;
 			fb_logo.needs_cmapreset = 1;
-			fb_logo.needs_logo = 8;
-		} else if (fb_logo.depth >= 16)	/* 16 colors */
-			fb_logo.needs_logo = 4;
-		else
-			fb_logo.needs_logo = 1;	/* 2 colors */
-		break;
-	case FB_VISUAL_MONO01:
-		/* reversed 0 = fg, 1 = bg */
-		fb_logo.needs_logo = ~1;
-		break;
-	case FB_VISUAL_MONO10:
-		fb_logo.needs_logo = 1;
+		}
 		break;
 	case FB_VISUAL_PSEUDOCOLOR:
-	case FB_VISUAL_STATIC_PSEUDOCOLOR:
-		if (fb_logo.depth >= 8) {
-			fb_logo.needs_logo = 8;
-			if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR)
-				fb_logo.needs_cmapreset = 1;
-		} else if (fb_logo.depth >= 4)
-			fb_logo.needs_logo = 4;	/* 16 colors */
-		else
-			fb_logo.needs_logo = 1;	
+		fb_logo.needs_cmapreset = 1;
 		break;
 	}
 
-	if (fb_logo.needs_logo >= 8)
-		fb_logo.type = LINUX_LOGO_CLUT224;
-	else if (fb_logo.needs_logo >= 4)
-		fb_logo.type = LINUX_LOGO_VGA16;
-	else
-		fb_logo.type = LINUX_LOGO_MONO;
-
 	/* Return if no suitable logo was found */
-	fb_logo.logo = fb_find_logo(fb_logo.type);
+	fb_logo.logo = find_logo(info->var.bits_per_pixel);
+	
 	if (!fb_logo.logo || fb_logo.logo->height > info->var.yres) {
 		fb_logo.logo = NULL;
 		return 0;
 	}
+	/* What depth we asked for might be different from what we get */
+	if (fb_logo.logo->type == LINUX_LOGO_CLUT224)
+		fb_logo.depth = 8;
+	else if (fb_logo.logo->type == LINUX_LOGO_VGA16)
+		fb_logo.depth = 4;
+	else
+		fb_logo.depth = 1;		
 	return fb_logo.logo->height;
 }
 
 int fb_show_logo(struct fb_info *info)
 {
-	unsigned char *fb = info->screen_base, *logo_new = NULL;
 	u32 *palette = NULL, *saved_pseudo_palette = NULL;
+	unsigned char *logo_new = NULL;
 	struct fb_image image;
 	int x;
 
 	/* Return if the frame buffer is not mapped */
-	if (!fb || !info->fbops->fb_imageblit ||
-	    fb_logo.logo == NULL)
+	if (fb_logo.logo == NULL)
 		return 0;
 
 	image.depth = fb_logo.depth;
@@ -732,7 +703,7 @@
 		info->pseudo_palette = palette;
 	}
 
-	if (fb_logo.needs_logo != 8) {
+	if (fb_logo.depth == 4) {
 		logo_new = kmalloc(fb_logo.logo->width * fb_logo.logo->height, 
 				   GFP_KERNEL);
 		if (logo_new == NULL) {
@@ -742,9 +713,8 @@
 				info->pseudo_palette = saved_pseudo_palette;
 			return 0;
 		}
-
 		image.data = logo_new;
-		fb_set_logo(info, fb_logo.logo, logo_new, fb_logo.needs_logo);
+		fb_set_logo(info, fb_logo.logo, logo_new, fb_logo.depth);
 	}
 
 	image.width = fb_logo.logo->width;
@@ -755,8 +725,8 @@
 	     x <= info->var.xres-fb_logo.logo->width; x += (fb_logo.logo->width + 8)) {
 		image.dx = x;
 		info->fbops->fb_imageblit(info, &image);
-		atomic_dec(&info->pixmap.count);
-		smp_mb__after_atomic_dec();
+		//atomic_dec(&info->pixmap.count);
+		//smp_mb__after_atomic_dec();
 	}
 	
 	if (palette != NULL)
@@ -876,7 +846,54 @@
 #endif /* CONFIG_KMOD */
 
 int
-fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+fb_cursor(struct fb_info *info, struct fb_cursor *sprite)
+{
+	struct fb_cursor cursor;
+	int err;
+	
+	if (copy_from_user(&cursor, sprite, sizeof(struct fb_cursor)))
+		return -EFAULT;
+
+	if (cursor.set & FB_CUR_SETCUR)
+		info->cursor.enable = 1;
+	
+	if (cursor.set & FB_CUR_SETCMAP) {
+		err = fb_copy_cmap(&cursor.image.cmap, &sprite->image.cmap, 1);
+		if (err)
+			return err;
+	}
+	
+	if (cursor.set & FB_CUR_SETSHAPE) {
+		int size = ((cursor.image.width + 7) >> 3) * cursor.image.height;		
+		if ((cursor.image.height != info->cursor.image.height) ||
+		    (cursor.image.width != info->cursor.image.width))
+			cursor.set |= FB_CUR_SETSIZE;
+		
+		cursor.image.data = kmalloc(size, GFP_KERNEL);
+		if (!cursor.image.data)
+			return -ENOMEM;
+		
+		cursor.mask = kmalloc(size, GFP_KERNEL);
+		if (!cursor.mask) {
+			kfree(cursor.image.data);
+			return -ENOMEM;
+		}
+		
+		if (copy_from_user(&cursor.image.data, sprite->image.data, size) ||
+		    copy_from_user(cursor.mask, sprite->mask, size)) { 
+			kfree(cursor.image.data);
+			kfree(cursor.mask);
+			return -EFAULT;
+		}
+	}
+	info->cursor.set = cursor.set;
+	info->cursor.rop = cursor.rop;
+	err = info->fbops->fb_cursor(info, &cursor);
+	return err;
+}
+
+int
+fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)
 {
         int xoffset = var->xoffset;
         int yoffset = var->yoffset;
@@ -898,7 +915,7 @@
 }
 
 int
-fb_set_var(struct fb_var_screeninfo *var, struct fb_info *info)
+fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)
 {
 	int err;
 
@@ -917,7 +934,7 @@
 			if (info->fbops->fb_set_par)
 				info->fbops->fb_set_par(info);
 
-			fb_pan_display(&info->var, info);
+			fb_pan_display(info, &info->var);
 
 			fb_set_cmap(&info->cmap, 1, info);
 		}
@@ -926,7 +943,7 @@
 }
 
 int
-fb_blank(int blank, struct fb_info *info)
+fb_blank(struct fb_info *info, int blank)
 {	
 	/* ??? Varible sized stack allocation.  */
 	u16 black[info->cmap.len];
@@ -960,7 +977,7 @@
 	struct fb_cmap cmap;
 	int i;
 	
-	if (! fb)
+	if (!fb)
 		return -ENODEV;
 	switch (cmd) {
 	case FBIOGET_VSCREENINFO:
@@ -969,7 +986,7 @@
 	case FBIOPUT_VSCREENINFO:
 		if (copy_from_user(&var, (void *) arg, sizeof(var)))
 			return -EFAULT;
-		i = fb_set_var(&var, info);
+		i = fb_set_var(info, &var);
 		if (i) return i;
 		if (copy_to_user((void *) arg, &var, sizeof(var)))
 			return -EFAULT;
@@ -983,16 +1000,17 @@
 	case FBIOGETCMAP:
 		if (copy_from_user(&cmap, (void *) arg, sizeof(cmap)))
 			return -EFAULT;
-		fb_copy_cmap(&info->cmap, &cmap, 0);
-		return 0;
+		return (fb_copy_cmap(&info->cmap, &cmap, 0));
 	case FBIOPAN_DISPLAY:
 		if (copy_from_user(&var, (void *) arg, sizeof(var)))
 			return -EFAULT;
-		if ((i = fb_pan_display(&var, info)))
+		if ((i = fb_pan_display(info, &var)))
 			return i;
 		if (copy_to_user((void *) arg, &var, sizeof(var)))
 			return -EFAULT;
-		return i;
+		return 0;
+	case FBIO_CURSOR:
+		return (fb_cursor(info, (struct fb_cursor *) arg));
 #ifdef CONFIG_FRAMEBUFFER_CONSOLE
 	case FBIOGET_CON2FBMAP:
 		if (copy_from_user(&con2fb, (void *)arg, sizeof(con2fb)))
@@ -1022,7 +1040,7 @@
 		return 0;
 #endif	/* CONFIG_FRAMEBUFFER_CONSOLE */
 	case FBIOBLANK:
-		return fb_blank(arg, info);
+		return fb_blank(info, arg);
 	default:
 		if (fb->fb_ioctl == NULL)
 			return -EINVAL;
@@ -1136,6 +1154,8 @@
 	struct fb_info *info;
 	int res = 0;
 
+	if (fbidx >= FB_MAX)
+		return -ENODEV;
 #ifdef CONFIG_KMOD
 	if (!(info = registered_fb[fbidx]))
 		try_to_load(fbidx);
@@ -1219,7 +1239,7 @@
 	if (fb_info->pixmap.inbuf == NULL)
 		fb_info->pixmap.inbuf = sys_inbuf;
 	spin_lock_init(&fb_info->pixmap.lock);
-	
+
 	registered_fb[i] = fb_info;
 	sprintf(name_buf, "fb/%d", i);
 	devfs_register(NULL, name_buf, DEVFS_FL_DEFAULT,
diff -Nru a/drivers/video/fbmon.c b/drivers/video/fbmon.c
--- a/drivers/video/fbmon.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/video/fbmon.c	Sat Apr 19 19:51:50 2003
@@ -1,7 +1,25 @@
 /*
- *   linux/drivers/video/fbmon.c
+ * linux/drivers/video/fbmon.c
  *
- *  Copyright (C) 2002 James Simmons <jsimmons@users.sf.net>
+ * Copyright (C) 2002 James Simmons <jsimmons@users.sf.net>
+ *
+ * Credits:
+ * 
+ * The EDID Parser is a conglomeration from the following sources:
+ *
+ *   1. SciTech SNAP Graphics Architecture
+ *      Copyright (C) 1991-2002 SciTech Software, Inc. All rights reserved.
+ *
+ *   2. XFree86 4.3.0, interpret_edid.c
+ *      Copyright 1998 by Egbert Eich <Egbert.Eich@Physik.TU-Darmstadt.DE>
+ * 
+ *   3. John Fremlin <vii@users.sourceforge.net> and 
+ *      Ani Joshi <ajoshi@unixbox.com>
+ *  
+ * Generalized Timing Formula is derived from:
+ *
+ *      GTF Spreadsheet by Andy Morrish (1/5/97) 
+ *      available at http://www.vesa.org
  *
  * 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
@@ -11,124 +29,32 @@
 #include <linux/tty.h>
 #include <linux/fb.h>
 #include <linux/module.h>
-#ifdef CONFIG_PCI
-#include <linux/pci.h>
-#endif
 #ifdef CONFIG_ALL_PPC
+#include <linux/pci.h>
 #include <asm/prom.h>
 #endif
+#include <video/edid.h>
+#include "edid.h"
 
 /* 
  * EDID parser
- *
- * portions of this file were based on the EDID parser by
- * John Fremlin <vii@users.sourceforge.net> and Ani Joshi <ajoshi@unixbox.com>
  */
 
-#define EDID_LENGTH				0x80
-#define EDID_HEADER				0x00
-#define EDID_HEADER_END				0x07
-
-#define ID_MANUFACTURER_NAME			0x08
-#define ID_MANUFACTURER_NAME_END		0x09
-#define ID_MODEL				0x0a
-
-#define ID_SERIAL_NUMBER			0x0c
-
-#define MANUFACTURE_WEEK			0x10
-#define MANUFACTURE_YEAR			0x11
-
-#define EDID_STRUCT_VERSION			0x12
-#define EDID_STRUCT_REVISION			0x13
-
-#define DPMS_FLAGS				0x18
-#define ESTABLISHED_TIMING_1			0x23
-#define ESTABLISHED_TIMING_2			0x24
-#define MANUFACTURERS_TIMINGS			0x25
-
-#define DETAILED_TIMING_DESCRIPTIONS_START	0x36
-#define DETAILED_TIMING_DESCRIPTION_SIZE	18
-#define NO_DETAILED_TIMING_DESCRIPTIONS		4
-
-#define DETAILED_TIMING_DESCRIPTION_1		0x36
-#define DETAILED_TIMING_DESCRIPTION_2		0x48
-#define DETAILED_TIMING_DESCRIPTION_3		0x5a
-#define DETAILED_TIMING_DESCRIPTION_4		0x6c
-
-#define DESCRIPTOR_DATA				5
-
-#define UPPER_NIBBLE( x ) \
-        (((128|64|32|16) & (x)) >> 4)
-
-#define LOWER_NIBBLE( x ) \
-        ((1|2|4|8) & (x))
-
-#define COMBINE_HI_8LO( hi, lo ) \
-        ( (((unsigned)hi) << 8) | (unsigned)lo )
-
-#define COMBINE_HI_4LO( hi, lo ) \
-        ( (((unsigned)hi) << 4) | (unsigned)lo )
-
-#define PIXEL_CLOCK_LO     (unsigned)block[ 0 ]
-#define PIXEL_CLOCK_HI     (unsigned)block[ 1 ]
-#define PIXEL_CLOCK	   (COMBINE_HI_8LO( PIXEL_CLOCK_HI,PIXEL_CLOCK_LO )*1000)
-#define H_ACTIVE_LO        (unsigned)block[ 2 ]
-#define H_BLANKING_LO      (unsigned)block[ 3 ]
-#define H_ACTIVE_HI        UPPER_NIBBLE( (unsigned)block[ 4 ] )
-#define H_ACTIVE           COMBINE_HI_8LO( H_ACTIVE_HI, H_ACTIVE_LO )
-#define H_BLANKING_HI      LOWER_NIBBLE( (unsigned)block[ 4 ] )
-#define H_BLANKING         COMBINE_HI_8LO( H_BLANKING_HI, H_BLANKING_LO )
-
-#define V_ACTIVE_LO        (unsigned)block[ 5 ]
-#define V_BLANKING_LO      (unsigned)block[ 6 ]
-#define V_ACTIVE_HI        UPPER_NIBBLE( (unsigned)block[ 7 ] )
-#define V_ACTIVE           COMBINE_HI_8LO( V_ACTIVE_HI, V_ACTIVE_LO )
-#define V_BLANKING_HI      LOWER_NIBBLE( (unsigned)block[ 7 ] )
-#define V_BLANKING         COMBINE_HI_8LO( V_BLANKING_HI, V_BLANKING_LO )
-
-#define H_SYNC_OFFSET_LO   (unsigned)block[ 8 ]
-#define H_SYNC_WIDTH_LO    (unsigned)block[ 9 ]
-
-#define V_SYNC_OFFSET_LO   UPPER_NIBBLE( (unsigned)block[ 10 ] )
-#define V_SYNC_WIDTH_LO    LOWER_NIBBLE( (unsigned)block[ 10 ] )
-
-#define V_SYNC_WIDTH_HI    ((unsigned)block[ 11 ] & (1|2))
-#define V_SYNC_OFFSET_HI   (((unsigned)block[ 11 ] & (4|8)) >> 2)
-
-#define H_SYNC_WIDTH_HI    (((unsigned)block[ 11 ] & (16|32)) >> 4)
-#define H_SYNC_OFFSET_HI   (((unsigned)block[ 11 ] & (64|128)) >> 6)
-
-#define V_SYNC_WIDTH       COMBINE_HI_4LO( V_SYNC_WIDTH_HI, V_SYNC_WIDTH_LO )
-#define V_SYNC_OFFSET      COMBINE_HI_4LO( V_SYNC_OFFSET_HI, V_SYNC_OFFSET_LO )
-
-#define H_SYNC_WIDTH       COMBINE_HI_4LO( H_SYNC_WIDTH_HI, H_SYNC_WIDTH_LO )
-#define H_SYNC_OFFSET      COMBINE_HI_4LO( H_SYNC_OFFSET_HI, H_SYNC_OFFSET_LO )
-
-#define H_SIZE_LO          (unsigned)block[ 12 ]
-#define V_SIZE_LO          (unsigned)block[ 13 ]
-
-#define H_SIZE_HI          UPPER_NIBBLE( (unsigned)block[ 14 ] )
-#define V_SIZE_HI          LOWER_NIBBLE( (unsigned)block[ 14 ] )
-
-#define H_SIZE             COMBINE_HI_8LO( H_SIZE_HI, H_SIZE_LO )
-#define V_SIZE             COMBINE_HI_8LO( V_SIZE_HI, V_SIZE_LO )
-
-#define H_BORDER           (unsigned)block[ 15 ]
-#define V_BORDER           (unsigned)block[ 16 ]
-
-#define FLAGS              (unsigned)block[ 17 ]
-
-#define INTERLACED         (FLAGS&128)
-#define SYNC_TYPE          (FLAGS&3<<3)	/* bits 4,3 */
-#define SYNC_SEPARATE      (3<<3)
-#define HSYNC_POSITIVE     (FLAGS & 4)
-#define VSYNC_POSITIVE     (FLAGS & 2)
-
 const unsigned char edid_v1_header[] = { 0x00, 0xff, 0xff, 0xff,
 	0xff, 0xff, 0xff, 0x00
 };
 const unsigned char edid_v1_descriptor_flag[] = { 0x00, 0x00 };
 
+static void copy_string(unsigned char *c, unsigned char *s)
+{
+  int i;
+  c = c + 5;
+  for (i = 0; (i < 13 && *c != 0x0A); i++)
+    *(s++) = *(c++);
+  *s = 0;
+  while (i-- && (*--s == 0x20)) *s = 0;
+}
+
 static int edid_checksum(unsigned char *edid)
 {
 	unsigned char i, csum = 0;
@@ -157,138 +83,785 @@
 	return 1;
 }
 
-
-static char *edid_get_vendor(unsigned char *block)
+static void parse_vendor_block(unsigned char *block)
 {
-	static char sign[4];
-	unsigned short h;
+	unsigned char c[4];
 
-	h = COMBINE_HI_8LO(block[0], block[1]);
-	sign[0] = ((h >> 10) & 0x1f) + 'A' - 1;
-	sign[1] = ((h >> 5) & 0x1f) + 'A' - 1;
-	sign[2] = (h & 0x1f) + 'A' - 1;
-	sign[3] = 0;
+	c[0] = ((block[0] & 0x7c) >> 2) + '@';
+	c[1] = ((block[0] & 0x03) << 3) + ((block[1] & 0xe0) >> 5) + '@';
+	c[2] = (block[1] & 0x1f) + '@';
+	c[3] = 0;
+	printk("   Manufacturer: %s ", c);
+	printk("Model: %x ", block[2] + (block[3] << 8));
+	printk("Serial#: %u\n", block[4] + (block[5] << 8) + 
+	       (block[6] << 16) + (block[7] << 24));
+	printk("   Year: %u Week %u\n", block[9] + 1990, block[8]);
+}
 
-	return sign;
+static void parse_dpms_capabilities(unsigned char flags)
+{
+	printk("      DPMS: Active %s, Suspend %s, Standby %s\n",
+	       (flags & DPMS_ACTIVE_OFF) ? "yes" : "no",
+	       (flags & DPMS_SUSPEND)    ? "yes" : "no",
+	       (flags & DPMS_STANDBY)    ? "yes" : "no");
 }
+	
+static void print_chroma(unsigned char *block)
+{
+	int tmp;
 
-static char *edid_get_monitor(unsigned char *block)
+	/* Chromaticity data */
+	printk("      Chromaticity: ");
+	tmp = ((block[5] & (3 << 6)) >> 6) | (block[0x7] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("RedX:   0.%03d ", tmp/1024);
+
+	tmp = ((block[5] & (3 << 4)) >> 4) | (block[0x8] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("RedY:   0.%03d\n", tmp/1024);
+
+	tmp = ((block[5] & (3 << 2)) >> 2) | (block[0x9] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("                    GreenX: 0.%03d ", tmp/1024);
+
+	tmp = (block[5] & 3) | (block[0xa] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("GreenY: 0.%03d\n", tmp/1024);
+
+	tmp = ((block[6] & (3 << 6)) >> 6) | (block[0xb] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("                    BlueX:  0.%03d ", tmp/1024);
+
+	tmp = ((block[6] & (3 << 4)) >> 4) | (block[0xc] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("BlueY:  0.%03d\n", tmp/1024);
+	
+	tmp = ((block[6] & (3 << 2)) >> 2) | (block[0xd] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("                    WhiteX: 0.%03d ", tmp/1024);
+
+	tmp = (block[6] & 3) | (block[0xe] << 2);
+	tmp *= 1000;
+	tmp += 512;
+	printk("WhiteY: 0.%03d\n", tmp/1024);
+}
+
+static void parse_display_block(unsigned char *block)
 {
-	static char name[13];
-	unsigned i;
-	const unsigned char *ptr = block + DESCRIPTOR_DATA;
+	unsigned char c;
 
-	for (i = 0; i < 13; i++, ptr++) {
-		if (*ptr == 0xa) {
-			name[i] = 0x00;
-			return name;
+	c = (block[0] & 0x80) >> 7;
+	if (c) 
+		printk("      Digital Display Input");
+	else {
+		printk("      Analog Display Input: Input Voltage - ");
+		switch ((block[0] & 0x60) >> 5) {
+		case 0:
+			printk("0.700V/0.300V");
+			break;
+		case 1:
+			printk("0.714V/0.286V");
+			break;
+		case 2:
+			printk("1.000V/0.400V");
+			break;
+		case 3:
+			printk("0.700V/0.000V");
+			break;
+		default:
+			printk("unknown");
 		}
-		name[i] = *ptr;
+		printk("\n");
 	}
-	return name;
+	c = (block[0] & 0x10) >> 4;
+	if (c)
+		printk("      Configurable signal level\n");
+	printk("      Sync: ");
+	c = block[0] & 0x0f;
+	if (c & 0x10)
+		printk("Blank to Blank ");
+	if (c & 0x08)
+		printk("Separate ");
+	if (c & 0x04)
+		printk("Composite ");
+	if (c & 0x02)
+		printk("Sync on Green ");
+	if (c & 0x01)
+		printk("Serration on ");
+	printk("\n");
+
+	printk("      Max H-size in cm: ");
+	c = block[1];
+	if (c) 
+		printk("%d\n", c);
+	else
+		printk("variable\n");
+	
+	printk("      Max V-size in cm: ");
+	c = block[2];
+	if (c)
+		printk("%d\n", c);
+	else
+		printk("variable\n");
+
+	c = block[3];
+	printk("      Gamma: ");
+	printk("%d.%d\n", (c + 100)/100, (c+100) % 100);
+
+	parse_dpms_capabilities(block[4]);
+
+	switch ((block[4] & 0x18) >> 3) {
+	case 0:
+		printk("      Monochrome/Grayscale\n");
+		break;
+	case 1:
+		printk("      RGB Color Display\n");
+		break;
+	case 2:
+		printk("      Non-RGB Multicolor Display\n");
+		break;
+	default:
+		printk("      Unknown\n");
+		break;
+	}
+
+	print_chroma(block);
+	
+	c = block[4] & 0x7;
+	if (c & 0x04)
+		printk("      Default color format is primary\n");
+	if (c & 0x02)
+		printk("      First DETAILED Timing is preferred\n");
+	if (c & 0x01)
+		printk("      Display is GTF capable\n");
 }
 
+static void parse_std_md_block(unsigned char *block)
+{
+	unsigned char c;
+
+	c = block[0];
+	if (c&0x80) printk("      720x400@70Hz\n");
+	if (c&0x40) printk("      720x400@88Hz\n");
+	if (c&0x20) printk("      640x480@60Hz\n");
+	if (c&0x10) printk("      640x480@67Hz\n");
+	if (c&0x08) printk("      640x480@72Hz\n");
+	if (c&0x04) printk("      640x480@75Hz\n");
+	if (c&0x02) printk("      800x600@56Hz\n");
+	if (c&0x01) printk("      800x600@60Hz\n");
+
+	c = block[1];
+	if (c&0x80) printk("      800x600@72Hz\n");
+	if (c&0x40) printk("      800x600@75Hz\n");
+	if (c&0x20) printk("      832x624@75Hz\n");
+	if (c&0x10) printk("      1024x768@87Hz (interlaced)\n");
+	if (c&0x08) printk("      1024x768@60Hz\n");
+	if (c&0x04) printk("      1024x768@70Hz\n");
+	if (c&0x02) printk("      1024x768@75Hz\n");
+	if (c&0x01) printk("      1280x1024@75Hz\n");
+
+	c = block[2];
+	if (c&0x80) printk("      1152x870@75Hz\n");
+	printk("      Manufacturer's mask: %x\n",c&0x7F);
+}
+		
+		
 static int edid_is_timing_block(unsigned char *block)
 {
-	if ((block[0] == 0x00) && (block[1] == 0x00))
+	if ((block[0] != 0x00) || (block[1] != 0x00) || 
+	    (block[2] != 0x00) || (block[4] != 0x00)) 
+		return 1;
+	else
 		return 0;
+}
+
+static int edid_is_serial_block(unsigned char *block)
+{
+	if ((block[0] == 0x00) && (block[1] == 0x00) && 
+	    (block[2] == 0x00) && (block[3] == 0xff) &&
+	    (block[4] == 0x00))
+		return 1;
 	else
+		return 0;
+}
+
+static int edid_is_ascii_block(unsigned char *block)
+{
+	if ((block[0] == 0x00) && (block[1] == 0x00) && 
+	    (block[2] == 0x00) && (block[3] == 0xfe) &&
+	    (block[4] == 0x00))
 		return 1;
+	else
+		return 0;
+}
+
+static int edid_is_limits_block(unsigned char *block)
+{
+	if ((block[0] == 0x00) && (block[1] == 0x00) && 
+	    (block[2] == 0x00) && (block[3] == 0xfd) &&
+	    (block[4] == 0x00))
+		return 1;
+	else
+		return 0;
 }
 
 static int edid_is_monitor_block(unsigned char *block)
 {
-	if ((block[0] == 0x00) && (block[1] == 0x00) && (block[3] == 0xfc))
+	if ((block[0] == 0x00) && (block[1] == 0x00) && 
+	    (block[2] == 0x00) && (block[3] == 0xfc) &&
+	    (block[4] == 0x00))
 		return 1;
 	else
 		return 0;
 }
 
-static void parse_timing_block(unsigned char *block,
-			       struct fb_var_screeninfo *var)
+static int edid_is_color_block(unsigned char *block)
 {
-	var->xres = var->xres_virtual = H_ACTIVE;
-	var->yres = var->yres_virtual = V_ACTIVE;
-	var->height = var->width = -1;
-	var->right_margin = H_SYNC_OFFSET;
-	var->left_margin = (H_ACTIVE + H_BLANKING) -
-	    (H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH);
-	var->upper_margin = V_BLANKING - V_SYNC_OFFSET - V_SYNC_WIDTH;
-	var->lower_margin = V_SYNC_OFFSET;
-	var->hsync_len = H_SYNC_WIDTH;
-	var->vsync_len = V_SYNC_WIDTH;
-	var->pixclock = PIXEL_CLOCK;
-	var->pixclock /= 1000;
-	var->pixclock = KHZ2PICOS(var->pixclock);
+	if ((block[0] == 0x00) && (block[1] == 0x00) && 
+	    (block[2] == 0x00) && (block[3] == 0xfb) &&
+	    (block[4] == 0x00))
+		return 1;
+	else
+		return 0;
+}
 
-	if (HSYNC_POSITIVE)
-		var->sync |= FB_SYNC_HOR_HIGH_ACT;
-	if (VSYNC_POSITIVE)
-		var->sync |= FB_SYNC_VERT_HIGH_ACT;
+static int edid_is_std_timings_block(unsigned char *block)
+{
+	if ((block[0] == 0x00) && (block[1] == 0x00) && 
+	    (block[2] == 0x00) && (block[3] == 0xfa) &&
+	    (block[4] == 0x00))
+		return 1;
+	else
+		return 0;
+}
+
+static void parse_serial_block(unsigned char *block)
+{
+	unsigned char c[13];
+	
+	copy_string(block, c);
+	printk("      Serial No     : %s\n", c);
+}
+
+static void parse_ascii_block(unsigned char *block)
+{
+	unsigned char c[13];
+	
+	copy_string(block, c);
+	printk("      %s\n", c);
+}
+
+static void parse_limits_block(unsigned char *block)
+{
+	printk("      HorizSync     : %d-%d KHz\n", H_MIN_RATE, H_MAX_RATE);
+	printk("      VertRefresh   : %d-%d Hz\n", V_MIN_RATE, V_MAX_RATE);
+	if (MAX_PIXEL_CLOCK != 10*0xff)
+		printk("      Max Pixelclock: %d MHz\n", (int) MAX_PIXEL_CLOCK);
+}
+
+static void parse_monitor_block(unsigned char *block)
+{
+	unsigned char c[13];
+	
+	copy_string(block, c);
+	printk("      Monitor Name  : %s\n", c);
+}
+
+static void parse_color_block(unsigned char *block)
+{
+	printk("      Color Point    : unimplemented\n");
+}
+
+static void parse_std_timing_block(unsigned char *block)
+{
+	int xres, yres = 0, refresh, ratio, err = 1;
+	
+	xres = (block[0] + 31) * 8;
+	if (xres <= 256)
+		return;
+
+	ratio = (block[1] & 0xc0) >> 6;
+	switch (ratio) {
+	case 0:
+		yres = xres;
+		break;
+	case 1:
+		yres = (xres * 3)/4;
+		break;
+	case 2:
+		yres = (xres * 4)/5;
+		break;
+	case 3:
+		yres = (xres * 9)/16;
+		break;
+	}
+	refresh = (block[1] & 0x3f) + 60;
+	printk("      %dx%d@%dHz\n", xres, yres, refresh);
+	err = 0;
+}
+
+static void parse_dst_timing_block(unsigned char *block)
+{
+	int i;
+
+	block += 5;
+	for (i = 0; i < 5; i++, block += STD_TIMING_DESCRIPTION_SIZE)
+		parse_std_timing_block(block);
+}
+
+static void parse_detailed_timing_block(unsigned char *block)
+{
+	printk("      %d MHz ",  PIXEL_CLOCK/1000000);
+	printk("%d %d %d %d ", H_ACTIVE, H_ACTIVE + H_SYNC_OFFSET, 
+	       H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH, H_ACTIVE + H_BLANKING);
+	printk("%d %d %d %d ", V_ACTIVE, V_ACTIVE + V_SYNC_OFFSET, 
+	       V_ACTIVE + V_SYNC_OFFSET + V_SYNC_WIDTH, V_ACTIVE + V_BLANKING);
+	printk("%sHSync %sVSync\n\n", (HSYNC_POSITIVE) ? "+" : "-", 
+	       (VSYNC_POSITIVE) ? "+" : "-");
 }
 
 int parse_edid(unsigned char *edid, struct fb_var_screeninfo *var)
 {
-	unsigned char *block, *vendor, *monitor = NULL;
 	int i;
+	unsigned char *block;
+
+	if (edid == NULL || var == NULL)
+		return 1;
 
 	if (!(edid_checksum(edid)))
-		return 0;
+		return 1;
 
 	if (!(edid_check_header(edid)))
+		return 1;
+
+	block = edid + DETAILED_TIMING_DESCRIPTIONS_START;
+
+	for (i = 0; i < 4; i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) {
+		if (edid_is_timing_block(block)) {
+			var->xres = var->xres_virtual = H_ACTIVE;
+			var->yres = var->yres_virtual = V_ACTIVE;
+			var->height = var->width = -1;
+			var->right_margin = H_SYNC_OFFSET;
+			var->left_margin = (H_ACTIVE + H_BLANKING) -
+				(H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH);
+			var->upper_margin = V_BLANKING - V_SYNC_OFFSET - 
+				V_SYNC_WIDTH;
+			var->lower_margin = V_SYNC_OFFSET;
+			var->hsync_len = H_SYNC_WIDTH;
+			var->vsync_len = V_SYNC_WIDTH;
+			var->pixclock = PIXEL_CLOCK;
+			var->pixclock /= 1000;
+			var->pixclock = KHZ2PICOS(var->pixclock);
+
+			if (HSYNC_POSITIVE)
+				var->sync |= FB_SYNC_HOR_HIGH_ACT;
+			if (VSYNC_POSITIVE)
+				var->sync |= FB_SYNC_VERT_HIGH_ACT;
+			return 0;
+		}
+	}
+	return 1;
+}
+
+static void calc_mode_timings(int xres, int yres, int refresh, struct fb_videomode *mode)
+{
+	struct fb_var_screeninfo var;
+	struct fb_info info;
+	
+	var.xres = xres;
+	var.yres = yres;
+	fb_get_mode(FB_VSYNCTIMINGS | FB_IGNOREMON, 
+		    refresh, &var, &info);
+	mode->xres = xres;
+	mode->yres = yres;
+	mode->pixclock = var.pixclock;
+	mode->refresh = refresh;
+	mode->left_margin = var.left_margin;
+	mode->right_margin = var.right_margin;
+	mode->upper_margin = var.upper_margin;
+	mode->lower_margin = var.lower_margin;
+	mode->hsync_len = var.hsync_len;
+	mode->vsync_len = var.vsync_len;
+	mode->vmode = 0;
+	mode->sync = 0;
+}
+
+static int get_est_timing(unsigned char *block, struct fb_videomode *mode)
+{
+	int num = 0;
+	unsigned char c;
+
+	c = block[0];
+	if (c&0x80) 
+		calc_mode_timings(720, 400, 70, &mode[num++]);
+	if (c&0x40) 
+		calc_mode_timings(720, 400, 88, &mode[num++]);
+	if (c&0x20)
+		mode[num++] = vesa_modes[3];
+	if (c&0x10)
+		calc_mode_timings(640, 480, 67, &mode[num++]);
+	if (c&0x08)
+		mode[num++] = vesa_modes[4];
+	if (c&0x04)
+		mode[num++] = vesa_modes[5];
+	if (c&0x02)
+		mode[num++] = vesa_modes[7];
+	if (c&0x01)
+		mode[num++] = vesa_modes[8];
+
+	c = block[1];
+	if (c&0x80)
+ 		mode[num++] = vesa_modes[9];
+	if (c&0x40)
+ 		mode[num++] = vesa_modes[10];
+	if (c&0x20)
+		calc_mode_timings(832, 624, 75, &mode[num++]);
+	if (c&0x10)
+		mode[num++] = vesa_modes[12];
+	if (c&0x08)
+		mode[num++] = vesa_modes[13];
+	if (c&0x04)
+		mode[num++] = vesa_modes[14];
+	if (c&0x02)
+		mode[num++] = vesa_modes[15];
+	if (c&0x01)
+		mode[num++] = vesa_modes[21];
+
+	c = block[2];
+	if (c&0x80)
+		mode[num++] = vesa_modes[17];
+
+	return num;
+}
+
+static int get_std_timing(unsigned char *block, struct fb_videomode *mode)
+{
+	int xres, yres = 0, refresh, ratio, i;
+	
+	xres = (block[0] + 31) * 8;
+	if (xres <= 256)
 		return 0;
 
-	printk("EDID ver %d rev %d\n", (int) edid[EDID_STRUCT_VERSION],
-	       (int) edid[EDID_STRUCT_REVISION]);
+	ratio = (block[1] & 0xc0) >> 6;
+	switch (ratio) {
+	case 0:
+		yres = xres;
+		break;
+	case 1:
+		yres = (xres * 3)/4;
+		break;
+	case 2:
+		yres = (xres * 4)/5;
+		break;
+	case 3:
+		yres = (xres * 9)/16;
+		break;
+	}
+	refresh = (block[1] & 0x3f) + 60;
 
-	vendor = edid_get_vendor(edid + ID_MANUFACTURER_NAME);
+	for (i = 0; i < VESA_MODEDB_SIZE; i++) {
+		if (vesa_modes[i].xres == xres && 
+		    vesa_modes[i].yres == yres &&
+		    vesa_modes[i].refresh == refresh) {
+			*mode = vesa_modes[i];
+			break;
+		} else {
+			calc_mode_timings(xres, yres, refresh, mode);
+			break;
+		}
+	}
+	return 1;
+}
 
-	block = edid + DETAILED_TIMING_DESCRIPTIONS_START;
+static int get_dst_timing(unsigned char *block,
+			  struct fb_videomode *mode)
+{
+	int j, num = 0;
 
-	for (i = 0; i < 4; i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) {
-		if (edid_is_monitor_block(block)) {
-			monitor = edid_get_monitor(block);
+	for (j = 0; j < 6; j++, block+= STD_TIMING_DESCRIPTION_SIZE) 
+		num += get_std_timing(block, &mode[num]);
+
+	return num;
+}
+
+static void get_detailed_timing(unsigned char *block, 
+				struct fb_videomode *mode)
+{
+	mode->xres = H_ACTIVE;
+	mode->yres = V_ACTIVE;
+	mode->pixclock = PIXEL_CLOCK;
+	mode->pixclock /= 1000;
+	mode->pixclock = KHZ2PICOS(mode->pixclock);
+	mode->right_margin = H_SYNC_OFFSET;
+	mode->left_margin = (H_ACTIVE + H_BLANKING) -
+		(H_ACTIVE + H_SYNC_OFFSET + H_SYNC_WIDTH);
+	mode->upper_margin = V_BLANKING - V_SYNC_OFFSET - 
+		V_SYNC_WIDTH;
+	mode->lower_margin = V_SYNC_OFFSET;
+	mode->hsync_len = H_SYNC_WIDTH;
+	mode->vsync_len = V_SYNC_WIDTH;
+	if (HSYNC_POSITIVE)
+		mode->sync |= FB_SYNC_HOR_HIGH_ACT;
+	if (VSYNC_POSITIVE)
+		mode->sync |= FB_SYNC_VERT_HIGH_ACT;
+	mode->refresh = PIXEL_CLOCK/((H_ACTIVE + H_BLANKING) *
+				     (V_ACTIVE + V_BLANKING));
+	mode->vmode = 0;
+}
+
+/**
+ * fb_create_modedb - create video mode database
+ * @edid: EDID data
+ * @dbsize: database size
+ *
+ * RETURNS: struct fb_videomode, @dbsize contains length of database
+ *
+ * DESCRIPTION:
+ * This function builds a mode database using the contents of the EDID
+ * data
+ */
+struct fb_videomode *fb_create_modedb(unsigned char *edid, int *dbsize)
+{
+	struct fb_videomode *mode, *m;
+	unsigned char *block;
+	int num = 0, i;
+
+	mode = kmalloc(50 * sizeof(struct fb_videomode), GFP_KERNEL);
+	if (mode == NULL)
+		return NULL;
+	memset(mode, 0, 50 * sizeof(struct fb_videomode));
+
+	if (edid == NULL || !edid_checksum(edid) || 
+	    !edid_check_header(edid)) {
+		kfree(mode);
+		return NULL;
+	}
+
+	*dbsize = 0;
+
+	block = edid + ESTABLISHED_TIMING_1;
+	num += get_est_timing(block, &mode[num]);
+
+	block = edid + STD_TIMING_DESCRIPTIONS_START;
+	for (i = 0; i < STD_TIMING; i++, block += STD_TIMING_DESCRIPTION_SIZE) 
+		num += get_std_timing(block, &mode[num]);
+
+	block = edid + DETAILED_TIMING_DESCRIPTIONS_START;
+	for (i = 0; i < 4; i++, block+= DETAILED_TIMING_DESCRIPTION_SIZE) {
+		if (block[0] == 0x00 && block[1] == 0x00) {
+			if (block[3] == 0xfa) {
+				num += get_dst_timing(block + 5, &mode[num]);
+			}
+		} else  {
+			get_detailed_timing(block, &mode[num]);
+			num++;
 		}
 	}
+	
+	/* Yikes, EDID data is totally useless */
+	if (!num) {
+		kfree(mode);
+		return NULL;
+	}
+
+	*dbsize = num;
+	m = kmalloc(num * sizeof(struct fb_videomode), GFP_KERNEL);
+	if (!m)
+		return mode;
+	memmove(m, mode, num * sizeof(struct fb_videomode));
+	kfree(mode);
+	return m;
+}
 
-	printk("EDID: detected %s %s\n", vendor, monitor);
+/**
+ * fb_destroy_modedb - destroys mode database
+ * @modedb: mode database to destroy
+ *
+ * DESCRIPTION:
+ * Destroy mode database created by fb_create_modedb
+ */
+void fb_destroy_modedb(struct fb_videomode *modedb)
+{
+	if (modedb)
+		kfree(modedb);
+}
 
+/**
+ * fb_get_monitor_limits - get monitor operating limits
+ * @edid: EDID data
+ * @specs: fb_monspecs structure pointer
+ *
+ * DESCRIPTION:
+ * Gets monitor operating limits from EDID data and places them in 
+ * @specs
+ */
+int fb_get_monitor_limits(unsigned char *edid, struct fb_monspecs *specs)
+{
+	int i, retval = 1;
+	unsigned char *block;
+
+	if (edid == NULL || specs == NULL)
+		return 1;
+
+	if (!(edid_checksum(edid)))
+		return 1;
+
+	if (!(edid_check_header(edid)))
+		return 1;
+
+	memset(specs, 0, sizeof(struct fb_monspecs));
 	block = edid + DETAILED_TIMING_DESCRIPTIONS_START;
 
+	printk("Monitor Operating Limits: ");
 	for (i = 0; i < 4; i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) {
-		if (edid_is_timing_block(block)) {
-			parse_timing_block(block, var);
+		if (edid_is_limits_block(block)) {
+			specs->hfmin = H_MIN_RATE * 1000;
+			specs->hfmax = H_MAX_RATE * 1000;
+			specs->vfmin = V_MIN_RATE;
+			specs->vfmax = V_MAX_RATE;
+			specs->dclkmax = (MAX_PIXEL_CLOCK != 10*0xff) ?
+				MAX_PIXEL_CLOCK * 1000000 : 0;
+			specs->gtf = (GTF_SUPPORT) ? 1 : 0;
+			specs->dpms = edid[DPMS_FLAGS];
+			retval = 0;
+			printk("From EDID\n");
+			break;
 		}
 	}
-	return 1;
+	
+	/* estimate monitor limits based on modes supported */
+	if (retval) {
+		struct fb_videomode *modes;
+		int num_modes, i, hz, hscan, pixclock;
+
+		modes = fb_create_modedb(edid, &num_modes);
+		if (!modes) {
+			printk("None Available\n");
+			return 1;
+		}
+
+		retval = 0;
+		for (i = 0; i < num_modes; i++) {
+			hz = modes[i].refresh;
+			pixclock = PICOS2KHZ(modes[i].pixclock) * 1000;
+			hscan = (modes[i].yres * 105 * hz + 5000)/100;
+			
+			if (specs->dclkmax == 0 || specs->dclkmax < pixclock)
+				specs->dclkmax = pixclock;
+			if (specs->dclkmin == 0 || specs->dclkmin > pixclock)
+				specs->dclkmin = pixclock;
+			if (specs->hfmax == 0 || specs->hfmax < hscan)
+				specs->hfmax = hscan;
+			if (specs->hfmin == 0 || specs->hfmin > hscan)
+				specs->hfmin = hscan;
+			if (specs->vfmax == 0 || specs->vfmax < hz)
+				specs->vfmax = hz;
+			if (specs->vfmin == 0 || specs->vfmin > hz)
+				specs->vfmin = hz;
+		}
+		printk("Extrapolated\n");
+		fb_destroy_modedb(modes);
+	}
+	printk("     H: %d-%dKHz V: %d-%dHz DCLK: %dMHz\n", specs->hfmin/1000, specs->hfmax/1000, 
+	       specs->vfmin, specs->vfmax, specs->dclkmax/1000000);
+	return retval;
 }
 
-#ifdef CONFIG_PCI
-char *get_EDID(struct pci_dev *pdev)
+void show_edid(unsigned char *edid)
 {
+	unsigned char *block;
+	int i;
+
+	if (edid == NULL)
+		return;
+
+	if (!(edid_checksum(edid)))
+		return;
+
+	if (!(edid_check_header(edid)))
+		return;
+	printk("========================================\n");
+	printk("Display Information (EDID)\n");
+	printk("========================================\n");
+	printk("   EDID Version %d.%d\n", (int) edid[EDID_STRUCT_VERSION],
+	       (int) edid[EDID_STRUCT_REVISION]);
+
+	parse_vendor_block(edid + ID_MANUFACTURER_NAME);
+
+	printk("   Display Characteristics:\n");
+	parse_display_block(edid + EDID_STRUCT_DISPLAY);
+
+	printk("   Standard Timings\n");
+	block = edid + STD_TIMING_DESCRIPTIONS_START;
+	for (i = 0; i < STD_TIMING; i++, block += STD_TIMING_DESCRIPTION_SIZE) 
+		parse_std_timing_block(block);
+
+	printk("   Supported VESA Modes\n");
+	parse_std_md_block(edid + ESTABLISHED_TIMING_1);
+
+	printk("   Detailed Monitor Information\n");
+	block = edid + DETAILED_TIMING_DESCRIPTIONS_START;
+	for (i = 0; i < 4; i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) {
+		if (edid_is_serial_block(block)) {
+			parse_serial_block(block);
+		} else if (edid_is_ascii_block(block)) {
+			parse_ascii_block(block);
+		} else if (edid_is_limits_block(block)) {
+			parse_limits_block(block);
+		} else if (edid_is_monitor_block(block)) {
+			parse_monitor_block(block);
+		} else if (edid_is_color_block(block)) {
+			parse_color_block(block);
+		} else if (edid_is_std_timings_block(block)) {
+			parse_dst_timing_block(block);
+		} else if (edid_is_timing_block(block)) {
+			parse_detailed_timing_block(block);
+		}
+	}
+	printk("========================================\n");
+}
+
 #ifdef CONFIG_ALL_PPC
+char *get_EDID_from_OF(struct pci_dev *pdev)
+{
 	static char *propnames[] =
 	    { "DFP,EDID", "LCD,EDID", "EDID", "EDID1", NULL };
 	unsigned char *pedid = NULL;
 	struct device_node *dp;
 	int i;
 
+	if (pdev == NULL)
+		return NULL;
 	dp = pci_device_to_OF_node(pdev);
 	while (dp != NULL) {
 		for (i = 0; propnames[i] != NULL; ++i) {
-			pedid =
-			    (unsigned char *) get_property(dp,
-							   propnames[i],
-							   NULL);
+			pedid = (unsigned char *) get_property(dp, propnames[i], NULL);
 			if (pedid != NULL)
 				return pedid;
 		}
 		dp = dp->child;
 	}
+	show_edid(pedid);
 	return pedid;
-#else
-	return NULL;
+}
 #endif
+
+#ifdef CONFIG_X86
+char *get_EDID_from_BIOS(void *dummy)
+{
+	unsigned char *pedid = edid_info.dummy;
+	
+	if (!pedid)
+		return NULL;
+	show_edid(pedid);
+	return pedid;				
 }
 #endif
 
@@ -679,8 +1252,15 @@
 }
 
 EXPORT_SYMBOL(parse_edid);
-#ifdef CONFIG_PCI
-EXPORT_SYMBOL(get_EDID);
+EXPORT_SYMBOL(show_edid);
+#ifdef CONFIG_X86
+EXPORT_SYMBOL(get_EDID_from_BIOS);
+#endif
+#ifdef CONFIG_ALL_PPC
+EXPORT_SYMBOL(get_EDID_from_OF);
 #endif
+EXPORT_SYMBOL(fb_get_monitor_limits);
 EXPORT_SYMBOL(fb_get_mode);
 EXPORT_SYMBOL(fb_validate_mode);
+EXPORT_SYMBOL(fb_create_modedb);
+EXPORT_SYMBOL(fb_destroy_modedb);
diff -Nru a/drivers/video/i810/i810.h b/drivers/video/i810/i810.h
--- a/drivers/video/i810/i810.h	Sat Apr 19 19:51:50 2003
+++ b/drivers/video/i810/i810.h	Sat Apr 19 19:51:50 2003
@@ -120,7 +120,6 @@
 #define MMIO_SIZE                   (512*1024)
 #define GTT_SIZE                    (16*1024) 
 #define RINGBUFFER_SIZE             (64*1024)
-#define PIXMAP_SIZE                 (4 * 4096)
 #define CURSOR_SIZE                 4096 
 #define OFF                         0
 #define ON                          1
@@ -251,7 +250,6 @@
 	struct heap_data         fb;
 	struct heap_data         iring;
 	struct heap_data         cursor_heap;
-	struct heap_data         pixmap;
 	struct vgastate          state;
 	drm_agp_t                *drm_agp;
 	atomic_t                 use_count;
@@ -259,11 +257,6 @@
 	u32 pci_state[16];
 	unsigned long mmio_start_phys;
 	u8 *mmio_start_virtual;
-	u32 cursor_reset;
-	u8  red[64];
-	u8  green[64];
-	u8  blue[64];
-	u32 pixmap_offset;
 	u32 pitch;
 	u32 pixconf;
 	u32 watermark;
diff -Nru a/drivers/video/i810/i810_accel.c b/drivers/video/i810/i810_accel.c
--- a/drivers/video/i810/i810_accel.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/video/i810/i810_accel.c	Sat Apr 19 19:51:28 2003
@@ -9,6 +9,7 @@
  *  more details.
  */
 #include <linux/kernel.h>
+#include <linux/string.h>
 #include <linux/fb.h>
 
 #include "i810_regs.h"
@@ -54,8 +55,9 @@
  * The function waits until a free space from the ringbuffer
  * is available 
  */	
-static inline int wait_for_space(struct i810fb_par *par, u32 space)
+static inline int wait_for_space(struct fb_info *info, u32 space)
 {
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
 	u32 head, count = WAIT_COUNT, tail;
 	u8 *mmio = par->mmio_start_virtual;
 
@@ -72,6 +74,7 @@
 	printk("ringbuffer lockup!!!\n");
 	i810_report_error(mmio); 
 	par->dev_flags |= LOCKUP;
+	info->pixmap.scan_align = 1;
 	return 1;
 }
 
@@ -83,11 +86,15 @@
  * This waits for lring(0), iring(1), and batch(3), etc to finish and
  * waits until ringbuffer is empty.
  */
-static inline int wait_for_engine_idle(struct i810fb_par *par)
+static inline int wait_for_engine_idle(struct fb_info *info)
 {
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
 	u8 *mmio = par->mmio_start_virtual;
 	int count = WAIT_COUNT;
 
+	if (wait_for_space(info, par->iring.size)) /* flush */
+		return 1;
+
 	while((i810_readw(INSTDONE, mmio) & 0x7B) != 0x7B && --count); 
 	if (count) return 0;
 
@@ -95,6 +102,7 @@
 	printk("INSTDONE: 0x%04x\n", i810_readl(INSTDONE, mmio));
 	i810_report_error(mmio); 
 	par->dev_flags |= LOCKUP;
+	info->pixmap.scan_align = 1;
 	return 1;
 }
 
@@ -106,11 +114,13 @@
  * Checks/waits for sufficent space in ringbuffer of size
  * space.  Returns the tail of the buffer
  */ 
-static inline u32 begin_iring(struct i810fb_par *par, u32 space)
+static inline u32 begin_iring(struct fb_info *info, u32 space)
 {
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
+
 	if (par->dev_flags & ALWAYS_SYNC) 
-		wait_for_engine_idle(par);
-	return wait_for_space(par, space);
+		wait_for_engine_idle(info);
+	return wait_for_space(info, space);
 }
 
 /**
@@ -149,9 +159,11 @@
  */
 static inline void source_copy_blit(int dwidth, int dheight, int dpitch, 
 				    int xdir, int src, int dest, int rop, 
-				    int blit_bpp, struct i810fb_par *par)
+				    int blit_bpp, struct fb_info *info)
 {
-	if (begin_iring(par, 24 + IRING_PAD)) return;
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
+
+	if (begin_iring(info, 24 + IRING_PAD)) return;
 
 	PUT_RING(BLIT | SOURCE_COPY_BLIT | 4);
 	PUT_RING(xdir | rop << 16 | dpitch | DYN_COLOR_EN | blit_bpp);
@@ -181,9 +193,11 @@
  */
 static inline void color_blit(int width, int height, int pitch,  int dest, 
 			      int rop, int what, int blit_bpp, 
-			      struct i810fb_par *par)
+			      struct fb_info *info)
 {
-	if (begin_iring(par, 24 + IRING_PAD)) return;
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
+
+	if (begin_iring(info, 24 + IRING_PAD)) return;
 
 	PUT_RING(BLIT | COLOR_BLT | 3);
 	PUT_RING(rop << 16 | pitch | SOLIDPATTERN | DYN_COLOR_EN | blit_bpp);
@@ -220,9 +234,11 @@
 static inline void mono_src_copy_imm_blit(int dwidth, int dheight, int dpitch,
 					  int dsize, int blit_bpp, int rop,
 					  int dest, const u32 *src, int bg,
-					  int fg, struct i810fb_par *par)
+					  int fg, struct fb_info *info)
 {
-	if (begin_iring(par, 24 + (dsize << 2) + IRING_PAD)) return;
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
+
+	if (begin_iring(info, 24 + (dsize << 2) + IRING_PAD)) return;
 
 	PUT_RING(BLIT | MONO_SOURCE_COPY_IMMEDIATE | (4 + dsize));
 	PUT_RING(DYN_COLOR_EN | blit_bpp | rop << 16 | dpitch);
@@ -261,9 +277,11 @@
 static inline void mono_src_copy_blit(int dwidth, int dheight, int dpitch, 
 				      int qsize, int blit_bpp, int rop, 
 				      int dest, int src, int bg,
-				      int fg, struct i810fb_par *par)
+				      int fg, struct fb_info *info)
 {
-	if (begin_iring(par, 32 + IRING_PAD)) return;
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
+
+	if (begin_iring(info, 32 + IRING_PAD)) return;
 
 	PUT_RING(BLIT | MONO_SOURCE_COPY_BLIT | 6);
 	PUT_RING(DYN_COLOR_EN | blit_bpp | rop << 16 | dpitch | 1 << 27);
@@ -277,19 +295,23 @@
 	end_iring(par);
 }
 
-static u32 get_buffer_offset(u32 size, struct i810fb_par *par) 
+static inline void load_front(int offset, struct fb_info *info)
 {
-	u32 offset;
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
 
-	if (par->pixmap_offset + size > par->pixmap.size) {
-		wait_for_engine_idle(par);
-		par->pixmap_offset = 0;
-	}
+	if (begin_iring(info, 8 + IRING_PAD)) return;
 
-	offset = par->pixmap_offset;
-	par->pixmap_offset += size;
+	PUT_RING(PARSER | FLUSH);
+	PUT_RING(NOP);
 
-	return offset;
+	end_iring(par);
+
+	if (begin_iring(info, 8 + IRING_PAD)) return;
+
+	PUT_RING(PARSER | FRONT_BUFFER | ((par->pitch >> 3) << 8));
+	PUT_RING((par->fb.offset << 12) + offset);
+
+	end_iring(par);
 }
 
 /**
@@ -338,7 +360,7 @@
 
 	dest = info->fix.smem_start + (dy * info->fix.line_length) + dx;
 	color_blit(width, height, info->fix.line_length, dest, rop, color, 
-		   par->blit_bpp, par);
+		   par->blit_bpp, info);
 }
 	
 void i810fb_copyarea(struct fb_info *info, const struct fb_copyarea *region) 
@@ -377,17 +399,16 @@
 	dest = info->fix.smem_start + (dy * info->fix.line_length) + dx;
 
 	source_copy_blit(width, height, pitch, xdir, src, dest,
-			 PAT_COPY_ROP, par->blit_bpp, par);
+			 PAT_COPY_ROP, par->blit_bpp, info);
 }
 
 void i810fb_imageblit(struct fb_info *info, const struct fb_image *image)
 {
 	struct i810fb_par *par = (struct i810fb_par *) info->par;
-	u32 fg = 0, bg = 0, s_pitch, d_pitch, size, offset, dst, i, j;
-	u8 *s_addr, *d_addr;
+	u32 fg = 0, bg = 0, size, dst;
 	
 	if (!info->var.accel_flags || par->dev_flags & LOCKUP ||
-	    par->depth == 4 || image->depth != 0) 
+	    par->depth == 4 || image->depth != 1) 
 		return cfb_imageblit(info, image);
 
 	switch (info->var.bits_per_pixel) {
@@ -405,43 +426,17 @@
 	dst = info->fix.smem_start + (image->dy * info->fix.line_length) + 
 		(image->dx * par->depth);
 
-	s_pitch = (image->width+7)/8;
-	d_pitch = (s_pitch + 1) & ~1;
-	size = d_pitch * image->height;
-	if (s_pitch != d_pitch || size & 7) {
-		size += 7;
-		size &= ~7;
-		offset = get_buffer_offset(size, par);		
-		d_addr = par->pixmap.virtual + offset;
-		s_addr = (u8 *) image->data;
-		
-		if (s_pitch == d_pitch) {
-			memcpy_toio(d_addr, s_addr, s_pitch * image->height);
-		} else { 
-			for (i = image->height; i--; ) {
-				for (j = 0; j < s_pitch; j++) 
-					i810_writeb(j, d_addr, s_addr[j]);
-				s_addr += s_pitch;
-				d_addr += d_pitch;
-			}
-		}
-		mono_src_copy_blit(image->width * par->depth, image->height, 
-				   info->fix.line_length, size/8, 
-				   par->blit_bpp, PAT_COPY_ROP, dst, 
-				   par->pixmap.physical + offset,
-				   bg, fg, par);
-	}
-	/*
-	 * immediate blit if width is a multiple of 16 (hardware requirement)
-	 */
-	else {
-		mono_src_copy_imm_blit(image->width * par->depth, 
-				       image->height, info->fix.line_length, 
-				       size/4, par->blit_bpp,
-				       PAT_COPY_ROP, dst, (u32 *) image->data, 
-				       bg, fg, par);
-	} 
-}
+	size = (image->width+7)/8 + 1;
+	size &= ~1;
+	size *= image->height;
+	size += 7;
+	size &= ~7;
+	mono_src_copy_imm_blit(image->width * par->depth, 
+			       image->height, info->fix.line_length, 
+			       size/4, par->blit_bpp,
+			       PAT_COPY_ROP, dst, (u32 *) image->data, 
+			       bg, fg, info);
+} 
 
 int i810fb_sync(struct fb_info *info)
 {
@@ -450,9 +445,19 @@
 	if (!info->var.accel_flags || par->dev_flags & LOCKUP)
 		return 0;
 
-	return wait_for_engine_idle(par);
+	return wait_for_engine_idle(info);
 }
 
+void i810fb_load_front(u32 offset, struct fb_info *info)
+{
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
+	u8 *mmio = par->mmio_start_virtual;
+
+	if (!info->var.accel_flags || par->dev_flags & LOCKUP)
+		i810_writel(DPLYBASE, mmio, par->fb.physical + offset);
+	else 
+		load_front(offset, info);
+}
 
 /**
  * i810fb_init_ringbuffer - initialize the ringbuffer
@@ -463,12 +468,13 @@
  * size and location of the ringbuffer.  It also sets 
  * the head and tail pointers = 0
  */
-void i810fb_init_ringbuffer(struct i810fb_par *par)
+void i810fb_init_ringbuffer(struct fb_info *info)
 {
+	struct i810fb_par *par = (struct i810fb_par *) info->par;
 	u32 tmp1, tmp2;
 	u8 *mmio = par->mmio_start_virtual;
 	
-	wait_for_engine_idle(par);
+	wait_for_engine_idle(info);
 	i810fb_iring_enable(par, OFF);
 	i810_writel(IRING, mmio, 0);
 	i810_writel(IRING + 4, mmio, 0);
diff -Nru a/drivers/video/i810/i810_dvt.c b/drivers/video/i810/i810_dvt.c
--- a/drivers/video/i810/i810_dvt.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/video/i810/i810_dvt.c	Sat Apr 19 19:51:50 2003
@@ -289,8 +289,7 @@
 		case 32:
 			wmark = params->bpp24_100;
 		}
-	}
-	else {					
+	} else {					
 		switch (var->bits_per_pixel) {
 		case 8:
 			wmark = params->bpp8_133;
diff -Nru a/drivers/video/i810/i810_gtf.c b/drivers/video/i810/i810_gtf.c
--- a/drivers/video/i810/i810_gtf.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/video/i810/i810_gtf.c	Sat Apr 19 19:51:48 2003
@@ -1,5 +1,5 @@
 /*-*- linux-c -*-
- *  linux/drivers/video/i810_main.h -- Intel 810 Nondiscrete Video Timings 
+ *  linux/drivers/video/i810_main.h -- Intel 810 Non-discrete Video Timings 
  *                                     (VESA GTF)
  *
  *      Copyright (C) 2001 Antonino Daplas<adaplas@pol.net>
@@ -213,7 +213,7 @@
  * @par: pointer to i810fb_par structure
  *
  * DESCRIPTION:
- * Get's the required watermark based on 
+ * Gets the required watermark based on 
  * pixelclock and RAMBUS frequency.
  * 
  * RETURNS:
@@ -240,8 +240,7 @@
 			wmark = i810_wm_24_100;
 			size = ARRAY_SIZE(i810_wm_24_100);
 		}
-	}	
-	else {
+	} else {
 		switch(var->bits_per_pixel) {
 		case 8:
 			wmark = i810_wm_8_133;
diff -Nru a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
--- a/drivers/video/i810/i810_main.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/video/i810/i810_main.c	Sat Apr 19 19:51:46 2003
@@ -631,8 +631,7 @@
 		if (f_out <= target_freq) {
 			n_reg++;
 			diff = target_freq - f_out;
-		}
-		else {
+		} else {
 			m_reg++;
 			diff = f_out - target_freq;
 		}
@@ -926,20 +925,21 @@
 	/*
 	 * Monitor limit
 	 */
+	switch (var->bits_per_pixel) {
+	case 8:
+		info->monspecs.dclkmax = 234000000;
+		break;
+	case 16:
+		info->monspecs.dclkmax = 229000000;
+		break;
+	case 24:
+	case 32:
+		info->monspecs.dclkmax = 204000000;
+		break;
+	}
+	info->monspecs.dclkmin = 15000000;
+
 	if (fb_validate_mode(var, info)) {
-		switch (var->bits_per_pixel) {
-		case 8:
-			info->monspecs.dclkmax = 234000000;
-			break;
-		case 16:
-			info->monspecs.dclkmax = 229000000;
-			break;
-		case 24:
-		case 32:
-			info->monspecs.dclkmax = 204000000;
-			break;
-		}
-		info->monspecs.dclkmin = 15000000;
 		if (fb_get_mode(FB_MAXTIMINGS, 0, var, info))
 			return -EINVAL;
 	}
@@ -1177,31 +1177,21 @@
 		for (i = 0; i < 8; i++) 
 			i810_write_dac((u8) (regno * 8) + i, (u8) red, 
 				       (u8) green, (u8) blue, mmio);
-	}
-				
-	else if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && 
+	} else if (info->fix.visual == FB_VISUAL_DIRECTCOLOR && 
 		 info->var.green.length == 6) {
-		if (!regno) {
-			memset(par->red, 0, 64);
-			memset(par->green, 0, 64);
-			memset(par->blue, 0, 64);
-		}
-
-		par->red[regno] = (u8) red;
-		par->green[regno] = (u8) green;
-		par->blue[regno] = (u8) blue;
+		u8 r, g, b;
 
 		if (regno < 32) {
 			for (i = 0; i < 8; i++) 
 				i810_write_dac((u8) (regno * 8) + i,
-					       (u8) red, par->green[regno*2], 
+					       (u8) red, (u8) green, 
 					       (u8) blue, mmio);
 		}
+		i810_read_dac((u8) (regno*4), &r, &g, &b, mmio);
 		for (i = 0; i < 4; i++) 
-			i810_write_dac((u8) (regno*4) + i, par->red[regno/2],
-				       (u8) green, par->blue[regno/2], mmio);
-	}
-	else {
+			i810_write_dac((u8) (regno*4) + i, r, (u8) green, 
+				       b, mmio);
+	} else if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) {
 		i810_write_dac((u8) regno, (u8) red, (u8) green,
 			       (u8) blue, mmio);
 	}
@@ -1220,16 +1210,14 @@
 					((u32 *)info->pseudo_palette)[regno] = 
 						(regno << 11) | (regno << 5) |
 						regno;
-			}
-			else {
+			} else {
 				if (info->var.green.length == 5) {
 					/* RGB 555 */
 					((u32 *)info->pseudo_palette)[regno] = 
 						((red & 0xf800) >> 1) |
 						((green & 0xf800) >> 6) |
 						((blue & 0xf800) >> 11);
-				}
-				else {
+				} else {
 					/* RGB 565 */
 					((u32 *)info->pseudo_palette)[regno] =
 						(red & 0xf800) |
@@ -1260,11 +1248,10 @@
 {
 	struct i810fb_par *par = (struct i810fb_par *) info->par;
 	u32 total;
-	u8 *mmio = par->mmio_start_virtual;
 	
 	total = var->xoffset * par->depth + 
 		var->yoffset * info->fix.line_length;
-	i810_writel(DPLYBASE, mmio, par->fb.physical + total);
+	i810fb_load_front(total, info);
 
 	return 0;
 }
@@ -1314,9 +1301,14 @@
 	decode_var(&info->var, par);
 	i810_load_regs(par);
 	i810_init_cursor(par);
-	par->cursor_reset = 1;
+
 	encode_fix(&info->fix, info);
 
+	if (info->var.accel_flags && !(par->dev_flags & LOCKUP)) 
+		info->pixmap.scan_align = 2;
+	else 
+		info->pixmap.scan_align = 1;
+	
 	return 0;
 }
 
@@ -1345,78 +1337,73 @@
 
 static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 {
-	static u8 data[64 * 8];
 	struct i810fb_par *par = (struct i810fb_par *)info->par;
 	u8 *mmio = par->mmio_start_virtual;	
-	u16 flags = cursor->set;
-
+	u8 data[64 * 8];
+	
 	if (!info->var.accel_flags || par->dev_flags & LOCKUP) 
 		return soft_cursor(info, cursor);
 
-	if (cursor->image.width > 64 || cursor->image.height > 64 ||
-	    (cursor->dest == NULL && cursor->rop == ROP_XOR))
-		return 1;
+	if (cursor->image.width > 64 || cursor->image.height > 64)
+		return -ENXIO;
 
-	if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical) {
+	if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical)
 		i810_init_cursor(par);
-		par->cursor_reset = 1;
-	}
 
-	if (par->cursor_reset) {
-		flags = FB_CUR_SETALL;
-		par->cursor_reset = 0;
-	}
-	
 	i810_enable_cursor(mmio, OFF);
 
-	if (flags & FB_CUR_SETPOS) {
+	if (cursor->set & FB_CUR_SETHOT)
+		info->cursor.hot = cursor->hot;
+	
+	if (cursor->set & FB_CUR_SETPOS) {
 		u32 tmp;
 
+		info->cursor.image.dx = cursor->image.dx;
+		info->cursor.image.dy = cursor->image.dy;
+		
 		tmp = cursor->image.dx - info->var.xoffset;
 		tmp |= (cursor->image.dy - info->var.yoffset) << 16;
 	    
 		i810_writel(CURPOS, mmio, tmp);
 	}
 
-	if (flags & FB_CUR_SETSIZE) {
+	if (cursor->set & FB_CUR_SETSIZE) {
+		info->cursor.image.height = cursor->image.height;
+		info->cursor.image.width = cursor->image.width;
 		i810_reset_cursor_image(par);
 	}
 
-	if (flags & FB_CUR_SETCMAP) {
+	if (cursor->set & FB_CUR_SETCMAP) {
+		info->cursor.image.fg_color = cursor->image.fg_color;
+		info->cursor.image.bg_color = cursor->image.bg_color;
 		i810_load_cursor_colors(cursor->image.fg_color,
 					cursor->image.bg_color,
 					info);
 	}
 
-	if (flags & (FB_CUR_SETDEST | FB_CUR_SETSHAPE)) {
-		int size = ((cursor->image.width + 7)/8) * 
-			cursor->image.height;
+	if (cursor->set & FB_CUR_SETSHAPE) {
+		int size = ((info->cursor.image.width + 7) >> 3) * 
+			     info->cursor.image.height;
 		int i;
 
-		switch (cursor->rop) {
+		switch (info->cursor.rop) {
 		case ROP_XOR:
-			for (i = 0; i < size; i++) {
-				data[i] = ((cursor->image.data[i] & 
-					    cursor->mask[i]) ^
-					   cursor->dest[i]);
-			}
+			for (i = 0; i < size; i++)
+				data[i] = cursor->image.data[i] ^ info->cursor.mask[i]; 
 			break;
 		case ROP_COPY:
 		default:
-			for (i = 0; i < size; i++) {
-				data[i] = cursor->image.data[i] & 
-					cursor->mask[i];
-			}
+			for (i = 0; i < size; i++)
+				data[i] = cursor->image.data[i] & info->cursor.mask[i]; 
 			break;
 		}
-		i810_load_cursor_image(cursor->image.width, 
-				       cursor->image.height, data,
+		i810_load_cursor_image(info->cursor.image.width, 
+				       info->cursor.image.height, data,
 				       par);
 	}
 
-	if (cursor->enable)
+	if (info->cursor.enable)
 		i810_enable_cursor(mmio, ON);
-		
 	return 0;
 }
 
@@ -1512,10 +1499,6 @@
 		(par->iring.offset << 12);
 	par->cursor_heap.virtual = par->aperture.virtual+
 		(par->cursor_heap.offset << 12);
-	par->pixmap.virtual = par->aperture.virtual + 
-		(par->pixmap.offset << 12);
-	par->pixmap.physical = par->aperture.physical + 
-		(par->pixmap.offset << 12);
 }
 
 static void __init i810_fix_offsets(struct i810fb_par *par)
@@ -1531,10 +1514,7 @@
 	par->fb.offset = v_offset_default << 20;
 	par->fb.offset >>= 12;
 
-	par->pixmap.offset = par->fb.offset + (par->fb.size >> 12);
-	par->pixmap.size = PIXMAP_SIZE;
-
-	par->iring.offset = par->pixmap.offset + (PIXMAP_SIZE >> 12);
+	par->iring.offset = par->fb.offset + (par->fb.size >> 12);
 	par->iring.size = RINGBUFFER_SIZE;
 
 	par->cursor_heap.offset = par->iring.offset + (RINGBUFFER_SIZE >> 12);
@@ -1547,7 +1527,7 @@
 	int size;
 	
 	i810_fix_offsets(par);
-	size = par->fb.size + par->iring.size + par->pixmap.size;
+	size = par->fb.size + par->iring.size;
 
 	par->drm_agp = (drm_agp_t *) inter_module_get("drm_agp");
 	if (!par->drm_agp) {
@@ -1637,23 +1617,20 @@
 static void __init i810_init_defaults(struct i810fb_par *par, 
 				      struct fb_info *info)
 {
-	if (voffset) {
+	if (voffset) 
 		v_offset_default = voffset;
-	}
-	else {
-		if (par->aperture.size > 32 * 1024 * 1024)
-			v_offset_default = 16;
-		else
-			v_offset_default = 8;
-	}
+	else if (par->aperture.size > 32 * 1024 * 1024)
+		v_offset_default = 16;
+	else
+		v_offset_default = 8;
 
 	if (!vram) 
 		vram = 1;
 
-	if (accel)
+	if (accel) 
 		par->dev_flags |= HAS_ACCELERATION;
 
-	if (sync)
+	if (sync) 
 		par->dev_flags |= ALWAYS_SYNC;
 
 	if (bpp < 8)
@@ -1698,8 +1675,6 @@
 	pci_read_config_byte(par->dev, 0x50, &reg);
 	reg &= FREQ_MASK;
 	par->mem_freq = (reg) ? 133 : 100;
-
-	i810fb_init_ringbuffer(par);
 }
 
 static int __init 
@@ -1718,8 +1693,7 @@
 		par->aperture.physical = pci_resource_start(par->dev, 0);
 		par->aperture.size = pci_resource_len(par->dev, 0);
 		par->mmio_start_phys = pci_resource_start(par->dev, 1);
-	}
-	else {
+	} else {
 		par->aperture.physical = pci_resource_start(par->dev, 1);
 		par->aperture.size = pci_resource_len(par->dev, 1);
 		par->mmio_start_phys = pci_resource_start(par->dev, 0);
@@ -1737,7 +1711,7 @@
 	}
 	par->res_flags |= FRAMEBUFFER_REQ;
 
-	par->aperture.virtual = ioremap(par->aperture.physical, 
+	par->aperture.virtual = ioremap_nocache(par->aperture.physical, 
 					par->aperture.size);
 	if (!par->aperture.virtual) {
 		printk("i810fb_init: cannot remap framebuffer region\n");
@@ -1766,7 +1740,6 @@
 {
 	char *this_opt, *suffix = NULL;
 
-	i810_init = 1;
 	if (!options || !*options)
 		return 0;
 	
@@ -1795,13 +1768,11 @@
 			hsync1 = simple_strtoul(this_opt+7, &suffix, 0);
 			if (strncmp(suffix, "H", 1)) 
 				hsync1 *= 1000;
-		} 
-		else if (!strncmp(this_opt, "hsync2:", 7)) {
+		} else if (!strncmp(this_opt, "hsync2:", 7)) {
 			hsync2 = simple_strtoul(this_opt+7, &suffix, 0);
 			if (strncmp(suffix, "H", 1)) 
 				hsync2 *= 1000;
-		} 
-		else if (!strncmp(this_opt, "vsync1:", 7)) 
+		} else if (!strncmp(this_opt, "vsync1:", 7)) 
 			vsync1 = simple_strtoul(this_opt+7, NULL, 0);
 		else if (!strncmp(this_opt, "vsync2:", 7))
 			vsync2 = simple_strtoul(this_opt+7, NULL, 0);
@@ -1812,15 +1783,12 @@
 }
 
 static int __init i810fb_init_pci (struct pci_dev *dev, 
-				      const struct pci_device_id *entry)
+				   const struct pci_device_id *entry)
 {
 	struct fb_info    *info;
 	struct i810fb_par *par = NULL;
 	int err, vfreq, hfreq, pixclock;
 
-	if (!i810_init)
-		return -EINVAL;
-
 	if (!(info = kmalloc(sizeof(struct fb_info), GFP_KERNEL))) {
 		i810fb_release_resource(info, par);
 		return -ENOMEM;
@@ -1836,6 +1804,15 @@
 	par->dev = dev;
 	info->par = par;
 
+	if (!(info->pixmap.addr = kmalloc(64*1024, GFP_KERNEL))) {
+		i810fb_release_resource(info, par);
+		return -ENOMEM;
+	}
+	memset(info->pixmap.addr, 0, 64*1024);
+	info->pixmap.size = 64*1024;
+	info->pixmap.buf_align = 8;
+	info->pixmap.flags = FB_PIXMAP_SYSTEM;
+
 	if ((err = i810_allocate_pci_resource(par, entry))) {
 		i810fb_release_resource(info, par);
 		return err;
@@ -1864,6 +1841,7 @@
 	}
 	encode_fix(&info->fix, info); 
 	 	    
+	i810fb_init_ringbuffer(info);
 	err = register_framebuffer(info);
 	if (err < 0) {
     		i810fb_release_resource(info, par); 
@@ -1894,7 +1872,7 @@
 }
 
 /***************************************************************
- *                     Deinitialization                        *
+ *                     De-initialization                        *
  ***************************************************************/
 
 static void i810fb_release_resource(struct fb_info *info, 
@@ -1931,7 +1909,7 @@
 
 		kfree(par);
 	}
-	if (info)
+	if (info) 
 		kfree(info);
 }
 
@@ -1974,7 +1952,6 @@
 
 int __init i810fb_init(void)
 {
-	i810_init = 1;
 	hsync1 *= 1000;
 	hsync2 *= 1000;
 
@@ -1994,14 +1971,14 @@
 MODULE_PARM_DESC(bpp, "Color depth for display in bits per pixel"
 		 " (default = 8)");
 MODULE_PARM(xres, "i");
-MODULE_PARM_DESC(xres, "Hozizontal resolution in pixels (default = 640)");
+MODULE_PARM_DESC(xres, "Horizontal resolution in pixels (default = 640)");
 MODULE_PARM(yres, "i");
 MODULE_PARM_DESC(yres, "Vertical resolution in scanlines (default = 480)");
 MODULE_PARM(vyres, "i");
 MODULE_PARM_DESC(vyres, "Virtual vertical resolution in scanlines"
 		 " (default = 480)");
 MODULE_PARM(hsync1, "i");
-MODULE_PARM_DESC(hsync1, "Mimimum horizontal frequency of monitor in KHz"
+MODULE_PARM_DESC(hsync1, "Minimum horizontal frequency of monitor in KHz"
 		 " (default = 31)");
 MODULE_PARM(hsync2, "i");
 MODULE_PARM_DESC(hsync2, "Maximum horizontal frequency of monitor in KHz"
diff -Nru a/drivers/video/i810/i810_main.h b/drivers/video/i810/i810_main.h
--- a/drivers/video/i810/i810_main.h	Sat Apr 19 19:51:49 2003
+++ b/drivers/video/i810/i810_main.h	Sat Apr 19 19:51:49 2003
@@ -55,7 +55,6 @@
 	.resume   =     i810fb_resume,
 };	
 
-static int i810_init  __initdata = 0;
 static int vram       __initdata = 4;
 static int bpp        __initdata = 8;
 static int mtrr       __initdata = 0;
@@ -132,7 +131,8 @@
 extern void i810fb_imageblit(struct fb_info *p, const struct fb_image *image);
 extern int  i810fb_sync     (struct fb_info *p);
 
-extern void i810fb_init_ringbuffer   (struct i810fb_par *par);
+extern void i810fb_init_ringbuffer(struct fb_info *info);
+extern void i810fb_load_front     (u32 offset, struct fb_info *info);
 
 /* Conditionals */
 #if defined(__i386__)
diff -Nru a/drivers/video/imsttfb.c b/drivers/video/imsttfb.c
--- a/drivers/video/imsttfb.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/video/imsttfb.c	Sat Apr 19 19:51:47 2003
@@ -409,7 +409,7 @@
 static inline u32 read_reg_le32(volatile u32 *base, int regindex)
 {
 #ifdef __powerpc__
-	in_le32((volatile u32 *) (base + regindex));
+	return in_le32((volatile u32 *) (base + regindex));
 #else
 	return readl(base + regindex);
 #endif
@@ -1211,7 +1211,7 @@
 	if (flags & FB_CUR_SETSIZE) {
         }
 
-        if (flags & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETDEST)) {
+        if (flags & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP)) {
                 int fg_idx = cursor->image.fg_color;
                 int width = (cursor->image.width+7)/8;
                 u8 *dat = (u8 *) cursor->image.data;
diff -Nru a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c
--- a/drivers/video/logo/logo.c	Sat Apr 19 19:51:48 2003
+++ b/drivers/video/logo/logo.c	Sat Apr 19 19:51:48 2003
@@ -33,69 +33,64 @@
 extern const struct linux_logo logo_superh_clut224;
 
 
-const struct linux_logo * __init fb_find_logo(int type)
+const struct linux_logo * __init find_logo(int depth)
 {
 	const struct linux_logo *logo = 0;
 
-	switch (type) {
-		case LINUX_LOGO_MONO:
+	if (depth >= 1) {
 #ifdef CONFIG_LOGO_LINUX_MONO
-			/* Generic Linux logo */
-			logo = &logo_linux_mono;
+		/* Generic Linux logo */
+		logo = &logo_linux_mono;
 #endif
 #ifdef CONFIG_LOGO_SUPERH_MONO
-			/* SuperH Linux logo */
-			logo = &logo_superh_mono;
+		/* SuperH Linux logo */
+		logo = &logo_superh_mono;
 #endif
-			break;
-
-		case LINUX_LOGO_VGA16:
+	}
+	
+	if (depth >= 4) {
 #ifdef CONFIG_LOGO_LINUX_VGA16
-			/* Generic Linux logo */
-			logo = &logo_linux_vga16;
+		/* Generic Linux logo */
+		logo = &logo_linux_vga16;
 #endif
 #ifdef CONFIG_LOGO_SUPERH_VGA16
-			/* SuperH Linux logo */
-			logo = &logo_superh_vga16;
+		/* SuperH Linux logo */
+		logo = &logo_superh_vga16;
 #endif
-			break;
-
-		case LINUX_LOGO_CLUT224:
+	}
+	
+	if (depth >= 8) {
 #ifdef CONFIG_LOGO_LINUX_CLUT224
-			/* Generic Linux logo */
-			logo = &logo_linux_clut224;
+		/* Generic Linux logo */
+		logo = &logo_linux_clut224;
 #endif
 #ifdef CONFIG_LOGO_DEC_CLUT224
-			/* DEC Linux logo on MIPS/MIPS64 */
-			if (mips_machgroup == MACH_GROUP_SGI)
-				logo = &logo_dec_clut224;
+		/* DEC Linux logo on MIPS/MIPS64 */
+		if (mips_machgroup == MACH_GROUP_SGI)
+			logo = &logo_dec_clut224;
 #endif
 #ifdef CONFIG_LOGO_MAC_CLUT224
-			/* Macintosh Linux logo on m68k */
-			if (MACH_IS_MAC)
-				logo = &logo_mac_clut224;
+		/* Macintosh Linux logo on m68k */
+		if (MACH_IS_MAC)
+			logo = &logo_mac_clut224;
 #endif
 #ifdef CONFIG_LOGO_PARISC_CLUT224
-			/* PA-RISC Linux logo */
-			logo = &logo_parisc_clut224;
+		/* PA-RISC Linux logo */
+		logo = &logo_parisc_clut224;
 #endif
 #ifdef CONFIG_LOGO_SGI_CLUT224
-			/* SGI Linux logo on MIPS/MIPS64 ans VisWs 320/540 */
-#ifndef CONFIG_X86_VISWS
-			if (mips_machgroup == MACH_GROUP_SGI)
-#endif
-				logo = &logo_sgi_clut224;
+		/* SGI Linux logo on MIPS/MIPS64 */
+		if (mips_machgroup == MACH_GROUP_SGI)
+			logo = &logo_sgi_clut224;
 #endif
 #ifdef CONFIG_LOGO_SUN_CLUT224
-			/* Sun Linux logo */
-			logo = &logo_sun_clut224;
+		/* Sun Linux logo */
+		logo = &logo_sun_clut224;
 #endif
 #ifdef CONFIG_LOGO_SUPERH_CLUT224
-			/* SuperH Linux logo */
-			logo = &logo_superh_clut224;
+		/* SuperH Linux logo */
+		logo = &logo_superh_clut224;
 #endif
-			break;
-
 	}
 	return logo;
 }
diff -Nru a/drivers/video/modedb.c b/drivers/video/modedb.c
--- a/drivers/video/modedb.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/video/modedb.c	Sat Apr 19 19:51:47 2003
@@ -251,6 +251,110 @@
     },
 };
 
+const struct fb_videomode vesa_modes[] = {
+	/* 0 640x350-85 VESA */
+	{ NULL, 85, 640, 350, 31746,  96, 32, 60, 32, 64, 3,
+	  FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 1 640x400-85 VESA */
+	{ NULL, 85, 640, 400, 31746,  96, 32, 41, 01, 64, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 2 720x400-85 VESA */
+	{ NULL, 85, 721, 400, 28169, 108, 36, 42, 01, 72, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 3 640x480-60 VESA */
+	{ NULL, 60, 640, 480, 39682,  48, 16, 33, 10, 96, 2, 
+	  0, FB_VMODE_NONINTERLACED },
+	/* 4 640x480-72 VESA */
+	{ NULL, 72, 640, 480, 31746, 128, 24, 29, 9, 40, 2, 
+	  0, FB_VMODE_NONINTERLACED },
+	/* 5 640x480-75 VESA */
+	{ NULL, 75, 640, 480, 31746, 120, 16, 16, 01, 64, 3,
+	  0, FB_VMODE_NONINTERLACED },
+	/* 6 640x480-85 VESA */
+	{ NULL, 85, 640, 480, 27777, 80, 56, 25, 01, 56, 3,
+	  0, FB_VMODE_NONINTERLACED },
+	/* 7 800x600-56 VESA */
+	{ NULL, 56, 800, 600, 27777, 128, 24, 22, 01, 72, 2,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 8 800x600-60 VESA */
+	{ NULL, 60, 800, 600, 25000, 88, 40, 23, 01, 128, 4,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 9 800x600-72 VESA */
+	{ NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 10 800x600-75 VESA */
+	{ NULL, 75, 800, 600, 20202, 160, 16, 21, 01, 80, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 11 800x600-85 VESA */
+	{ NULL, 85, 800, 600, 17761, 152, 32, 27, 01, 64, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+        /* 12 1024x768i-43 VESA */
+	{ NULL, 53, 1024, 768, 22271, 56, 8, 41, 0, 176, 8,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_INTERLACED },
+	/* 13 1024x768-60 VESA */
+	{ NULL, 60, 1024, 768, 15384, 160, 24, 29, 3, 136, 6,
+	  0, FB_VMODE_NONINTERLACED },
+	/* 14 1024x768-70 VESA */
+	{ NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6,
+	  0, FB_VMODE_NONINTERLACED },
+	/* 15 1024x768-75 VESA */
+	{ NULL, 75, 1024, 768, 12690, 176, 16, 28, 1, 96, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 16 1024x768-85 VESA */
+	{ NULL, 85, 1024, 768, 10582, 208, 48, 36, 1, 96, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 17 1152x864-75 VESA */
+	{ NULL, 75, 1153, 864, 9259, 256, 64, 32, 1, 128, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 18 1280x960-60 VESA */
+	{ NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 19 1280x960-85 VESA */
+	{ NULL, 85, 1280, 960, 6734, 224, 64, 47, 1, 160, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 20 1280x1024-60 VESA */
+	{ NULL, 60, 1280, 1024, 9259, 248, 48, 38, 1, 112, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 21 1280x1024-75 VESA */
+	{ NULL, 75, 1280, 1024, 7407, 248, 16, 38, 1, 144, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 22 1280x1024-85 VESA */
+	{ NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 23 1600x1200-60 VESA */
+	{ NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 24 1600x1200-65 VESA */
+	{ NULL, 65, 1600, 1200, 5698, 304,  64, 46, 1, 192, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 25 1600x1200-70 VESA */
+	{ NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 26 1600x1200-75 VESA */
+	{ NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3, 
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 27 1600x1200-85 VESA */
+	{ NULL, 85, 1600, 1200, 4357, 304, 64, 46, 1, 192, 3,
+	  FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 28 1792x1344-60 VESA */
+	{ NULL, 60, 1792, 1344, 4882, 328, 128, 46, 1, 200, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 29 1792x1344-75 VESA */
+	{ NULL, 75, 1792, 1344, 3831, 352, 96, 69, 1, 216, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 30 1856x1392-60 VESA */
+	{ NULL, 60, 1856, 1392, 4580, 352, 96, 43, 1, 224, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 31 1856x1392-75 VESA */
+	{ NULL, 75, 1856, 1392, 3472, 352, 128, 104, 1, 224, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 32 1920x1440-60 VESA */
+	{ NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 200, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+	/* 33 1920x1440-75 VESA */
+	{ NULL, 60, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3,
+	  FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+};
 
 static int __init my_atoi(const char *name)
 {
@@ -432,3 +536,4 @@
 }
 
 EXPORT_SYMBOL(__fb_try_mode);
+EXPORT_SYMBOL(vesa_modes);
diff -Nru a/drivers/video/platinumfb.c b/drivers/video/platinumfb.c
--- a/drivers/video/platinumfb.c	Sat Apr 19 19:51:46 2003
+++ b/drivers/video/platinumfb.c	Sat Apr 19 19:51:46 2003
@@ -36,8 +36,8 @@
 #include <asm/prom.h>
 #include <asm/pgtable.h>
 
-#include "platinumfb.h"
 #include "macmodes.h"
+#include "platinumfb.h"
 
 static int default_vmode = VMODE_NVRAM;
 static int default_cmode = CMODE_NVRAM;
@@ -219,15 +219,14 @@
 
 	if (regno < 16) {
 		int i;
+		u32 *pal = info->pseudo_palette;
 		switch (p->par.cmode) {
 		case CMODE_16:
-			((u16 *) (info->pseudo_palette))[regno] =
-			    (regno << 10) | (regno << 5) | regno;
+			pal[regno] = (regno << 10) | (regno << 5) | regno;
 			break;
 		case CMODE_32:
 			i = (regno << 8) | regno;
-			((u32 *) (info->pseudo_palette))[regno] =
-			    (i << 16) | i;
+			pal[regno] = (i << 16) | i;
 			break;
 		}
 	}
@@ -401,7 +400,7 @@
 	/* Apply default var */
 	p->info.var = var;
 	var.activate = FB_ACTIVATE_NOW;
-	rc = gen_set_var(&var, -1, &p->info);
+	rc = fb_set_var(&var, &p->info);
 	if (rc && (default_vmode != VMODE_640_480_60 || default_cmode != CMODE_8))
 		goto try_again;
 
@@ -410,7 +409,7 @@
 		return 0;
 
 	printk(KERN_INFO "fb%d: platinum frame buffer device\n",
-	       GET_FB_IDX(p->info.node));
+	       minor(p->info.node));
 
 	return 1;
 }
@@ -607,21 +606,10 @@
 		return 0;
 
 	while ((this_opt = strsep(&options, ",")) != NULL) {
-		if (!strncmp(this_opt, "font:", 5)) {
-			char *p;
-			int i;
-
-			p = this_opt + 5;
-			for (i = 0; i < sizeof(fontname) - 1; i++)
-				if (!*p || *p == ' ' || *p == ',')
-					break;
-			memcpy(fontname, this_opt + 5, i);
-			fontname[i] = 0;
-		}
 		if (!strncmp(this_opt, "vmode:", 6)) {
 	    		int vmode = simple_strtoul(this_opt+6, NULL, 0);
-	    	if (vmode > 0 && vmode <= VMODE_MAX)
-			default_vmode = vmode;
+			if (vmode > 0 && vmode <= VMODE_MAX)
+				default_vmode = vmode;
 		} else if (!strncmp(this_opt, "cmode:", 6)) {
 			int depth = simple_strtoul(this_opt+6, NULL, 0);
 			switch (depth) {
diff -Nru a/drivers/video/pm2fb.c b/drivers/video/pm2fb.c
--- a/drivers/video/pm2fb.c	Sat Apr 19 19:51:51 2003
+++ b/drivers/video/pm2fb.c	Sat Apr 19 19:51:51 2003
@@ -1434,24 +1434,24 @@
 }
 
 static struct display_switch pm2_cfb8 = {
-	.setup =	fbcon_cfb8_setup,
-	.bmove =	pm2fb_pp_bmove,
+	.setup		= fbcon_cfb8_setup,
+	.bmove		= pm2fb_pp_bmove,
 #ifdef __alpha__
 	/* Not sure why, but this works and the other does not. */
 	/* Also, perhaps we need a separate routine to wait for the
 	   blitter to stop before doing this? */
 	/* In addition, maybe we need to do this for 16 and 32 bit depths? */
-	.clear =	fbcon_cfb8_clear,
+	.clear		= fbcon_cfb8_clear,
 #else
-	.clear =	pm2fb_clear8,
+	.clear		= pm2fb_clear8,
 #endif
-	.putc =		fbcon_cfb8_putc,
-	.putcs =	fbcon_cfb8_putcs,
-	.revc =		fbcon_cfb8_revc,
-	.cursor =	pm2fb_cursor,
-	.set_font =	pm2fb_set_font,
-	.clear_margins =pm2fb_clear_margins8,
-	fontwidthmask:	FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16) };
+	.putc		= fbcon_cfb8_putc,
+	.putcs		= fbcon_cfb8_putcs,
+	.revc		= fbcon_cfb8_revc,
+	.cursor		= pm2fb_cursor,
+	.set_font	= pm2fb_set_font,
+	.clear_margins	= pm2fb_clear_margins8,
+	.fontwidthmask	= FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16) };
 #endif /* FBCON_HAS_CFB8 */
 
 #ifdef FBCON_HAS_CFB16
diff -Nru a/drivers/video/radeonfb.c b/drivers/video/radeonfb.c
--- a/drivers/video/radeonfb.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/video/radeonfb.c	Sat Apr 19 19:51:50 2003
@@ -121,7 +121,8 @@
 	RADEON_ND,
 	RADEON_NE,
 	RADEON_NF,
-	RADEON_NG
+	RADEON_NG,
+	RADEON_QM
 };
 
 enum radeon_arch {
@@ -168,7 +169,8 @@
 	{ "9700 ND", RADEON_R300 },
 	{ "9700 NE", RADEON_R300 },
 	{ "9700 NF", RADEON_R300 },
-	{ "9700 NG", RADEON_R300 }
+	{ "9700 NG", RADEON_R300 },
+	{ "9100 QM", RADEON_R200 }
 };
 
 
@@ -213,6 +215,7 @@
 	{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_NE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_NE},
 	{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_NF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_NF},
 	{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_NG, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_NG},
+	{ PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_QM, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RADEON_QM},
 	{ 0, }
 };
 MODULE_DEVICE_TABLE(pci, radeonfb_pci_table);
@@ -881,6 +884,16 @@
 				rinfo->pll.ref_div = 12;
 				rinfo->pll.ref_clk = 2700;
 				break;
+			case PCI_DEVICE_ID_ATI_RADEON_ND:
+			case PCI_DEVICE_ID_ATI_RADEON_NE:
+			case PCI_DEVICE_ID_ATI_RADEON_NF:
+			case PCI_DEVICE_ID_ATI_RADEON_NG:
+				rinfo->pll.ppll_max = 40000;
+				rinfo->pll.ppll_min = 20000;
+				rinfo->pll.xclk = 27000;
+				rinfo->pll.ref_div = 12;
+				rinfo->pll.ref_clk = 2700;
+				break;
 			case PCI_DEVICE_ID_ATI_RADEON_QD:
 			case PCI_DEVICE_ID_ATI_RADEON_QE:
 			case PCI_DEVICE_ID_ATI_RADEON_QF:
@@ -1287,7 +1300,6 @@
 	fb_alloc_cmap(&info->cmap, 256, 0);
 
 	var.activate = FB_ACTIVATE_NOW;
-	fb_set_var(&var, info);
         return 0;
 }
 
@@ -2926,7 +2938,7 @@
 		switch (pdev->device) {
 			case PCI_DEVICE_ID_ATI_RADEON_LY:
 			case PCI_DEVICE_ID_ATI_RADEON_LZ:
-				rinfo->video_ram = 8192;
+				rinfo->video_ram = 8192 * 1024;
 				break;
 			default:
 				break;
@@ -3111,10 +3123,10 @@
 
 
 static struct pci_driver radeonfb_driver = {
-	name:		"radeonfb",
-	id_table:	radeonfb_pci_table,
-	probe:		radeonfb_pci_register,
-	remove:		__devexit_p(radeonfb_pci_unregister),
+	.name		= "radeonfb",
+	.id_table	= radeonfb_pci_table,
+	.probe		= radeonfb_pci_register,
+	.remove		= __devexit_p(radeonfb_pci_unregister),
 };
 
 
diff -Nru a/drivers/video/retz3fb.c b/drivers/video/retz3fb.c
--- a/drivers/video/retz3fb.c	Sat Apr 19 19:51:50 2003
+++ b/drivers/video/retz3fb.c	Sat Apr 19 19:51:50 2003
@@ -1589,13 +1589,13 @@
 
 
 static struct display_switch fbcon_retz3_8 = {
-    setup:		fbcon_cfb8_setup,
-    bmove:		retz3_8_bmove,
-    clear:		retz3_8_clear,
-    putc:		retz3_putc,
-    putcs:		retz3_putcs,
-    revc:		retz3_revc,
-    clear_margins:	retz3_clear_margins,
-    fontwidthmask:	FONTWIDTH(8)
+	.setup		= fbcon_cfb8_setup,
+	.bmove		= retz3_8_bmove,
+	.clear		= retz3_8_clear,
+	.putc		= retz3_putc,
+	.putcs		= retz3_putcs,
+	.revc		= retz3_revc,
+	.clear_margins	= retz3_clear_margins,
+	.fontwidthmask	= FONTWIDTH(8)
 };
 #endif
diff -Nru a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c
--- a/drivers/video/riva/fbdev.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/video/riva/fbdev.c	Sat Apr 19 19:51:49 2003
@@ -420,6 +420,50 @@
 	return (VGA_RD08(par->riva.PVIO, 0x3cc));
 }
 
+static u8 byte_rev[256] = {
+	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
+};
+
+static inline void reverse_order(u32 *l)
+{
+	u8 *a = (u8 *)l;
+	*a = byte_rev[*a], a++;
+	*a = byte_rev[*a], a++;
+	*a = byte_rev[*a], a++;
+	*a = byte_rev[*a];
+}
+
 /* ------------------------------------------------------------------------- *
  *
  * cursor stuff
@@ -429,7 +473,6 @@
 /**
  * rivafb_load_cursor_image - load cursor image to hardware
  * @data: address to monochrome bitmap (1 = foreground color, 0 = background)
- * @mask: address to mask (1 = write image pixel, 0 = do not write pixel)
  * @par:  pointer to private data
  * @w:    width of cursor image in pixels
  * @h:    height of cursor image in scanlines
@@ -438,16 +481,15 @@
  *
  * DESCRIPTiON:
  * Loads cursor image based on a monochrome source and mask bitmap.  The
- * mask bit determines if the image pixel is to be written to the framebuffer
- * or not.  The imaage bits determines the color of the pixel, 0 for
- * background, 1 for foreground.  Only the affected region (as determined
- * by @w and @h parameters) will be updated.
+ * image bits determines the color of the pixel, 0 for background, 1 for
+ * foreground.  Only the affected region (as determined by @w and @h 
+ * parameters) will be updated.
  *
  * CALLED FROM:
  * rivafb_cursor()
  */
-static void rivafb_load_cursor_image(u8 *data, u8 *mask, struct riva_par *par,
-                                     int w, int h, u16 bg, u16 fg)
+static void rivafb_load_cursor_image(struct riva_par *par, u8 *data, 
+				     u8 *mask, u16 bg, u16 fg, u32 w, u32 h)
 {
 	int i, j, k = 0;
 	u32 b, m, tmp;
@@ -455,25 +497,40 @@
 	for (i = 0; i < h; i++) {
 		b = *((u32 *)data)++;
 		m = *((u32 *)mask)++;
+		reverse_order(&b);
+		
 		for (j = 0; j < w/2; j++) {
 			tmp = 0;
 #if defined (__BIG_ENDIAN)
-			if (m & (1 << 31))
-				tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
+			if (m & (1 << 31)) {
+				fg |= 1 << 15;
+				bg |= 1 << 15;
+			}
+			tmp = (b & (1 << 31)) ? fg << 16 : bg << 16;
 			b <<= 1;
 			m <<= 1;
 
-			if (m & (1 << 31))
-				tmp |= (b & (1 << 31)) ? fg : bg;
+			if (m & (1 << 31)) {
+				fg |= 1 << 15;
+				bg |= 1 << 15;
+			}
+			tmp |= (b & (1 << 31)) ? fg : bg;
 			b <<= 1;
 			m <<= 1;
 #else
-			if (m & 1)
-				tmp = (b & 1) ? fg : bg;
+			if (m & 1) {
+				fg |= 1 << 15;
+				bg |= 1 << 15;
+			}
+			tmp = (b & 1) ? fg : bg;
 			b >>= 1;
 			m >>= 1;
-			if (m & 1)
-				tmp |= (b & 1) ? fg << 16 : bg << 16;
+			
+			if (m & 1) {
+				fg |= 1 << 15;
+				bg |= 1 << 15;
+			}
+			tmp |= (b & 1) ? fg << 16 : bg << 16;
 			b >>= 1;
 			m >>= 1;
 #endif
@@ -1104,14 +1161,6 @@
 
 	par->riva.SetStartAddress(&par->riva, base);
 
-	/*
-	 * HACK: The hardware cursor occasionally disappears during fast scrolling.
-	 *       We just reset the cursor each time we change the start address.
-	 *       This also has a beneficial side effect of restoring the cursor
-	 *       image when switching from X.
-	 */
-	par->cursor_reset = 1;
-
 	info->var.xoffset = var->xoffset;
 	info->var.yoffset = var->yoffset;
 
@@ -1311,50 +1360,6 @@
 	wait_for_idle(par);
 }
 
-static u8 byte_rev[256] = {
-	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
-	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
-	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
-	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
-	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
-	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
-	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
-	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
-	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
-	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
-	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
-	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
-	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
-	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
-	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
-	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
-	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
-	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
-	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
-	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
-	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
-	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
-	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
-	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
-	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
-	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
-	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
-	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
-	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
-	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
-	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
-	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
-};
-
-static inline void reverse_order(u32 *l)
-{
-	u8 *a = (u8 *)l;
-	*a = byte_rev[*a], a++;
-	*a = byte_rev[*a], a++;
-	*a = byte_rev[*a], a++;
-	*a = byte_rev[*a];
-}
-
 static inline void convert_bgcolor_16(u32 *col)
 {
 	*col = ((*col & 0x00007C00) << 9)
@@ -1388,7 +1393,7 @@
 	volatile u32 *d;
 	int i, size;
 
-	if (image->depth != 0) {
+	if (image->depth != 1) {
 		cfb_imageblit(info, image);
 		return;
 	}
@@ -1463,29 +1468,19 @@
  */
 static int rivafb_cursor(struct fb_info *info, struct fb_cursor *cursor)
 {
-	static u8 data[MAX_CURS*MAX_CURS/8], mask[MAX_CURS*MAX_CURS/8];
 	struct riva_par *par = (struct riva_par *) info->par;
 	int i, j, d_idx = 0, s_idx = 0;
-	u16 flags = cursor->set, fg, bg;
-
-	/*
-	 * Can't do invert if one of the operands (dest) is missing,
-	 * ie, only opaque cursor supported.  This should be
-	 * standard for GUI apps.
-	 */
-	if (cursor->dest == NULL && cursor->rop == ROP_XOR)
-		return 1;
-
-	if (par->cursor_reset) {
-		flags = FB_CUR_SETALL;
-		par->cursor_reset = 0;
-	}
+	u8 data[MAX_CURS * MAX_CURS/8];
+	u8 mask[MAX_CURS * MAX_CURS/8];
+	u16 fg, bg;
 
 	par->riva.ShowHideCursor(&par->riva, 0);
 
-	if (flags & FB_CUR_SETPOS) {
+	if (cursor->set & FB_CUR_SETPOS) {
 		u32 xx, yy, temp;
 
+		info->cursor.image.dx = cursor->image.dx;
+		info->cursor.image.dy = cursor->image.dy;
 		yy = cursor->image.dy - info->var.yoffset;
 		xx = cursor->image.dx - info->var.xoffset;
 		temp = xx & 0xFFFF;
@@ -1494,58 +1489,58 @@
 		par->riva.PRAMDAC[0x0000300/4] = temp;
 	}
 
-	if (flags & FB_CUR_SETSIZE) {
-		memset(data, 0, MAX_CURS * MAX_CURS/8);
-		memset(mask, 0, MAX_CURS * MAX_CURS/8);
+	if (cursor->set & FB_CUR_SETSIZE) {
+		info->cursor.image.height = cursor->image.height;
+		info->cursor.image.width = cursor->image.width;
 		memset_io(par->riva.CURSOR, 0, MAX_CURS * MAX_CURS * 2);
 	}
 
-	if (flags & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP | FB_CUR_SETDEST)) {
-		int bg_idx = cursor->image.bg_color;
-		int fg_idx = cursor->image.fg_color;
-		int width = (cursor->image.width+7)/8;
-		u8 *dat = (u8 *) cursor->image.data;
-		u8 *dst = (u8 *) cursor->dest;
-		u8 *msk = (u8 *) cursor->mask;
+	if (cursor->set & FB_CUR_SETCMAP) {
+		info->cursor.image.bg_color = cursor->image.bg_color;
+		info->cursor.image.fg_color = cursor->image.fg_color;
+	}
 
-		switch (cursor->rop) {
+	if (cursor->set & (FB_CUR_SETSHAPE | FB_CUR_SETCMAP)) {
+		u32 bg_idx = info->cursor.image.bg_color;
+		u32 fg_idx = info->cursor.image.fg_color;
+		u32 s_pitch = (info->cursor.image.width+7) >> 3;
+		u32 d_pitch = MAX_CURS/8;
+		u8 *dat = (u8 *) cursor->image.data;
+		u8 *msk = (u8 *) info->cursor.mask;
+		u8 src[64];	
+		
+		switch (info->cursor.rop) {
 		case ROP_XOR:
-			for (i = 0; i < cursor->image.height; i++) {
-				for (j = 0; j < width; j++) {
-					d_idx = i * MAX_CURS/8  + j;
-					data[d_idx] =  byte_rev[dat[s_idx] ^ 
-								dst[s_idx]];
-					mask[d_idx] = byte_rev[msk[s_idx]];
-					s_idx++;
-				}
-			}
+			for (i = 0; i < s_pitch * info->cursor.image.height; i++)
+					src[i] = dat[i] ^ msk[i];
 			break;
 		case ROP_COPY:
 		default:
-			for (i = 0; i < cursor->image.height; i++) {
-				for (j = 0; j < width; j++) {
-					d_idx = i * MAX_CURS/8 + j;
-					data[d_idx] = byte_rev[dat[s_idx]];
-					mask[d_idx] = byte_rev[msk[s_idx]];
-					s_idx++;
-				}
-			}
+			for (i = 0; i < s_pitch * info->cursor.image.height; i++)
+				
+					src[i] = dat[i] & msk[i];
 			break;
 		}
+		
+		move_buf_aligned(info, data, src, d_pitch, s_pitch, info->cursor.image.height);
+
+		move_buf_aligned(info, mask, msk, d_pitch, s_pitch, info->cursor.image.height);
 
 		bg = ((info->cmap.red[bg_idx] & 0xf8) << 7) |
 		     ((info->cmap.green[bg_idx] & 0xf8) << 2) |
-		     ((info->cmap.blue[bg_idx] & 0xf8) >> 3) | 1 << 15;
+		     ((info->cmap.blue[bg_idx] & 0xf8) >> 3);
 
 		fg = ((info->cmap.red[fg_idx] & 0xf8) << 7) |
 		     ((info->cmap.green[fg_idx] & 0xf8) << 2) |
-		     ((info->cmap.blue[fg_idx] & 0xf8) >> 3) | 1 << 15;
+		     ((info->cmap.blue[fg_idx] & 0xf8) >> 3);
 
 		par->riva.LockUnlock(&par->riva, 0);
-		rivafb_load_cursor_image(data, mask, par, cursor->image.width,
-		cursor->image.height, bg, fg);
+
+		rivafb_load_cursor_image(par, data, mask, bg, fg,
+					 info->cursor.image.width, 
+					 info->cursor.image.height);
 	}
-	if (cursor->enable)
+	if (info->cursor.enable)
 		par->riva.ShowHideCursor(&par->riva, 1);
 	return 0;
 }
@@ -1609,7 +1604,6 @@
 	info->pixmap.buf_align = 4;
 	info->pixmap.scan_align = 4;
 	info->pixmap.flags = FB_PIXMAP_SYSTEM;
-
 	return 0;
 }
 
diff -Nru a/drivers/video/sis/sis_main.h b/drivers/video/sis/sis_main.h
--- a/drivers/video/sis/sis_main.h	Sat Apr 19 19:51:29 2003
+++ b/drivers/video/sis/sis_main.h	Sat Apr 19 19:51:29 2003
@@ -286,43 +286,43 @@
 static int    video_type = FB_TYPE_PACKED_PIXELS;
 
 static struct fb_var_screeninfo default_var = {
-	xres:           0,
-	yres:           0,
-	xres_virtual:   0,
-	yres_virtual:   0,
-	xoffset:        0,
-	yoffset:        0,
-	bits_per_pixel: 0,
-	grayscale:      0,
-	red:            {0, 8, 0},
-	green:          {0, 8, 0},
-	blue:           {0, 8, 0},
-	transp:         {0, 0, 0},
-	nonstd:         0,
-	activate:       FB_ACTIVATE_NOW,
-	height:         -1,
-	width:          -1,
-	accel_flags:    0,
-	pixclock:       0,
-	left_margin:    0,
-	right_margin:   0,
-	upper_margin:   0,
-	lower_margin:   0,
-	hsync_len:      0,
-	vsync_len:      0,
-	sync:           0,
-	vmode:          FB_VMODE_NONINTERLACED,
+	.xres		= 0,
+	.yres		= 0,
+	.xres_virtual	= 0,
+	.yres_virtual	= 0,
+	.xoffset	= 0,
+	.yoffset	= 0,
+	.bits_per_pixel	= 0,
+	.grayscale	= 0,
+	.red		= {0, 8, 0},
+	.green		= {0, 8, 0},
+	.blue		= {0, 8, 0},
+	.transp		= {0, 0, 0},
+	.nonstd		= 0,
+	.activate	= FB_ACTIVATE_NOW,
+	.height		= -1,
+	.width		= -1,
+	.accel_flags	= 0,
+	.pixclock	= 0,
+	.left_margin	= 0,
+	.right_margin	= 0,
+	.upper_margin	= 0,
+	.lower_margin	= 0,
+	.hsync_len	= 0,
+	.vsync_len	= 0,
+	.sync		= 0,
+	.vmode		= FB_VMODE_NONINTERLACED,
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	
-	reserved:       {0, 0, 0, 0, 0, 0}
+	.reserved	= {0, 0, 0, 0, 0, 0}
 #endif	
 };
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 static struct fb_fix_screeninfo sisfb_fix = {
-	id:		"SiS",
-	type:		FB_TYPE_PACKED_PIXELS,
-	xpanstep:	1,
-	ypanstep:	1,
+	.id		= "SiS",
+	.type		= FB_TYPE_PACKED_PIXELS,
+	.xpanstep	= 1,
+	.ypanstep	= 1,
 };
 static char myid[20];
 static u32 pseudo_palette[17];
diff -Nru a/drivers/video/softcursor.c b/drivers/video/softcursor.c
--- a/drivers/video/softcursor.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/video/softcursor.c	Sat Apr 19 19:51:47 2003
@@ -24,30 +24,9 @@
 	unsigned int i, size, dsize, s_pitch, d_pitch;
 	u8 *dst, src[64];
 
-	info->cursor.enable = (cursor->set & FB_CUR_SETCUR) ? 1 : 0;
-
 	if (cursor->set & FB_CUR_SETSIZE) {
-		info->cursor.image.width = cursor->image.width;
 		info->cursor.image.height = cursor->image.height;
-		cursor->set |= FB_CUR_SETSHAPE;
-	}
-
-	s_pitch = (info->cursor.image.width + 7) >> 3;
-	dsize = s_pitch * info->cursor.image.height;
-	d_pitch = (s_pitch + scan_align) & ~scan_align;
-	size = d_pitch * info->cursor.image.height + buf_align;
-	size &= ~buf_align;
-	dst = info->pixmap.addr + fb_get_buffer_offset(info, size);
-	info->cursor.image.data = dst;
-
-	if (cursor->set & FB_CUR_SETSHAPE) {
-		if (info->cursor.mask)
-			kfree(info->cursor.mask);
-		info->cursor.mask = kmalloc(dsize, GFP_KERNEL);
-		if (cursor->mask)
-			memcpy(info->cursor.mask, cursor->mask, dsize);
-		else
-			memset(info->cursor.mask, 0, dsize);
+		info->cursor.image.width = cursor->image.width;
 	}
 
 	if (cursor->set & FB_CUR_SETPOS) {
@@ -57,9 +36,9 @@
 
 	if (cursor->set & FB_CUR_SETHOT)
 		info->cursor.hot = cursor->hot;
-
+	
 	if (cursor->set & FB_CUR_SETCMAP) {
-		if (cursor->image.depth == 0) {
+		if (cursor->image.depth == 1) {
 			info->cursor.image.bg_color = cursor->image.bg_color;
 			info->cursor.image.fg_color = cursor->image.fg_color;
 		} else {
@@ -67,37 +46,41 @@
 				fb_copy_cmap(&cursor->image.cmap, &info->cursor.image.cmap, 0);
 		}
 		info->cursor.image.depth = cursor->image.depth;
-	}
+	}	
+
+	s_pitch = (info->cursor.image.width + 7) >> 3;
+	dsize = s_pitch * info->cursor.image.height;
+	d_pitch = (s_pitch + scan_align) & ~scan_align;
+	size = d_pitch * info->cursor.image.height + buf_align;
+	size &= ~buf_align;
+	dst = info->pixmap.addr + fb_get_buffer_offset(info, size);
 
 	if (info->cursor.enable) {
-		switch (cursor->rop) {
+		switch (info->cursor.rop) {
 		case ROP_XOR:
-			for (i = 0; i < dsize; i++) {
-				src[i] = (cursor->image.data[i] &
-					  cursor->mask[i]) ^
-				    	  cursor->dest[i];
-			}
+			for (i = 0; i < dsize; i++)
+				src[i] = cursor->image.data[i] ^ info->cursor.mask[i]; 
 			break;
 		case ROP_COPY:
 		default:
-			for (i = 0; i < dsize; i++) {
-				src[i] = cursor->image.data[i] &
-				    	 cursor->mask[i];
-			}
+			for (i = 0; i < dsize; i++)
+				src[i] = cursor->image.data[i] & info->cursor.mask[i];
 			break;
 		}
-		move_buf_aligned(info, dst, src, d_pitch, s_pitch,
-				 cursor->image.height);
-	} else {
-		move_buf_aligned(info, dst, cursor->dest, s_pitch, d_pitch,
-				 cursor->image.height);
-	}
+	} else 
+		memcpy(src, cursor->image.data, dsize);
+	
+	move_buf_aligned(info, dst, src, d_pitch, s_pitch, info->cursor.image.height);
+	info->cursor.image.data = dst;
+	
 	info->fbops->fb_imageblit(info, &info->cursor.image);
+	atomic_dec(&info->pixmap.count);
+	smp_mb__after_atomic_dec();
 	return 0;
 }
 
 EXPORT_SYMBOL(soft_cursor);
-
+ 
 MODULE_AUTHOR("James Simmons <jsimmons@users.sf.net>");
 MODULE_DESCRIPTION("Generic software cursor");
 MODULE_LICENSE("GPL");
diff -Nru a/drivers/video/tdfxfb.c b/drivers/video/tdfxfb.c
--- a/drivers/video/tdfxfb.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/video/tdfxfb.c	Sat Apr 19 19:51:29 2003
@@ -930,34 +930,34 @@
 	banshee_wait_idle(info);
 }
 
-static void tdfxfb_imageblit(struct fb_info *info, const struct fb_image *pixmap) 
+static void tdfxfb_imageblit(struct fb_info *info, const struct fb_image *image) 
 {
 	struct tdfx_par *par = (struct tdfx_par *) info->par;
-	int size = pixmap->height*((pixmap->width*pixmap->depth + 7)>>3);
+	int size = image->height * ((image->width * image->depth + 7)>>3);
 	int i, stride = info->fix.line_length;
 	u32 bpp = info->var.bits_per_pixel;
 	u32 dstfmt = stride | ((bpp+((bpp==8) ? 0 : 8)) << 13); 
-	u8 *chardata = (u8 *) pixmap->data;
+	u8 *chardata = (u8 *) image->data;
 	u32 srcfmt;
 
-	if (pixmap->depth != 0) {
+	if (image->depth != 1) {
 		//banshee_make_room(par, 6 + ((size + 3) >> 2));
 		//srcfmt = stride | ((bpp+((bpp==8) ? 0 : 8)) << 13) | 0x400000;
-		cfb_imageblit(info, pixmap);
+		cfb_imageblit(info, image);
 		return;
 	} else {
 		banshee_make_room(par, 8 + ((size + 3) >> 2));
-		tdfx_outl(par, COLORFORE, pixmap->fg_color);
-		tdfx_outl(par, COLORBACK, pixmap->bg_color);
+		tdfx_outl(par, COLORFORE, image->fg_color);
+		tdfx_outl(par, COLORBACK, image->bg_color);
 		srcfmt = 0x400000;
 	}	
 
 	tdfx_outl(par,	SRCXY,     0);
-	tdfx_outl(par,	DSTXY,     pixmap->dx | (pixmap->dy << 16));
+	tdfx_outl(par,	DSTXY,     image->dx | (image->dy << 16));
 	tdfx_outl(par,	COMMAND_2D, COMMAND_2D_H2S_BITBLT | (TDFX_ROP_COPY << 24));
 	tdfx_outl(par,	SRCFORMAT, srcfmt);
 	tdfx_outl(par,	DSTFORMAT, dstfmt);
-	tdfx_outl(par,	DSTSIZE,   pixmap->width | (pixmap->height << 16));
+	tdfx_outl(par,	DSTSIZE,   image->width | (image->height << 16));
 
 	/* Send four bytes at a time of data */	
 	for (i = (size >> 2) ; i > 0; i--) { 
diff -Nru a/drivers/video/tgafb.c b/drivers/video/tgafb.c
--- a/drivers/video/tgafb.c	Sat Apr 19 19:51:49 2003
+++ b/drivers/video/tgafb.c	Sat Apr 19 19:51:49 2003
@@ -583,7 +583,7 @@
 	   can do better than the generic code.  */
 	/* ??? There is a DMA write mode; I wonder if that could be
 	   made to pull the data from the image buffer...  */
-	if (image->depth > 0) {
+	if (image->depth > 1) {
 		cfb_imageblit(info, image);
 		return;
 	}
diff -Nru a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c
--- a/drivers/video/tridentfb.c	Sat Apr 19 19:51:47 2003
+++ b/drivers/video/tridentfb.c	Sat Apr 19 19:51:47 2003
@@ -1204,10 +1204,10 @@
 MODULE_DEVICE_TABLE(pci,trident_devices); 
 
 static struct pci_driver tridentfb_pci_driver = {
-	name:"tridentfb",
-	id_table:trident_devices,
-	probe:trident_pci_probe,
-	remove:__devexit_p(trident_pci_remove)
+	.name		= "tridentfb",
+	.id_table	= trident_devices,
+	.probe		= trident_pci_probe,
+	.remove		= __devexit_p(trident_pci_remove)
 };
 
 int __init tridentfb_init(void)
diff -Nru a/drivers/video/vesafb.c b/drivers/video/vesafb.c
--- a/drivers/video/vesafb.c	Sat Apr 19 19:51:28 2003
+++ b/drivers/video/vesafb.c	Sat Apr 19 19:51:28 2003
@@ -19,7 +19,9 @@
 #include <linux/fb.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
-
+#ifdef __i386__
+#include <video/edid.h>
+#endif
 #include <asm/io.h>
 #include <asm/mtrr.h>
 
@@ -213,6 +215,7 @@
 int __init vesafb_init(void)
 {
 	int video_cmap_len;
+	char *edid = 0;
 	int i;
 
 	if (screen_info.orig_video_isVGA != VIDEO_TYPE_VLFB)
@@ -296,12 +299,20 @@
 		vesafb_defined.yres_virtual = vesafb_defined.yres;
 		ypan = 0;
 	}
-	
-	/* some dummy values for timing to make fbset happy */
-	vesafb_defined.pixclock     = 10000000 / vesafb_defined.xres * 1000 / vesafb_defined.yres;
-	vesafb_defined.left_margin  = (vesafb_defined.xres / 8) & 0xf8;
-	vesafb_defined.hsync_len    = (vesafb_defined.xres / 8) & 0xf8;
 
+#ifdef __i386__
+	edid = get_EDID_from_BIOS(0);
+	if (edid)
+		parse_edid(edid, &vesafb_defined);	
+	else		
+#endif
+	{	
+		/* some dummy values for timing to make fbset happy */
+		vesafb_defined.pixclock     = 10000000 / vesafb_defined.xres * 1000 / vesafb_defined.yres;
+		vesafb_defined.left_margin  = (vesafb_defined.xres / 8) & 0xf8;
+		vesafb_defined.hsync_len    = (vesafb_defined.xres / 8) & 0xf8;
+	}
+	
 	if (vesafb_defined.bits_per_pixel > 8) {
 		vesafb_defined.red.offset    = screen_info.red_pos;
 		vesafb_defined.red.length    = screen_info.red_size;
diff -Nru a/drivers/video/vga16fb.c b/drivers/video/vga16fb.c
--- a/drivers/video/vga16fb.c	Sat Apr 19 19:51:29 2003
+++ b/drivers/video/vga16fb.c	Sat Apr 19 19:51:29 2003
@@ -1304,9 +1304,9 @@
 				
 void vga16fb_imageblit(struct fb_info *info, const struct fb_image *image)
 {
-	if (image->depth == 0)
+	if (image->depth == 1)
 		vga_imageblit_expand(info, image);
-	else if (image->depth == info->var.bits_per_pixel)
+	else if (image->depth <= info->var.bits_per_pixel)
 		vga_imageblit_color(info, image);
 }
 
diff -Nru a/fs/afs/kafstimod.c b/fs/afs/kafstimod.c
--- a/fs/afs/kafstimod.c	Sat Apr 19 19:51:48 2003
+++ b/fs/afs/kafstimod.c	Sat Apr 19 19:51:48 2003
@@ -99,18 +99,18 @@
 		spin_lock(&kafstimod_lock);
 		if (list_empty(&kafstimod_list)) {
 			timeout = MAX_SCHEDULE_TIMEOUT;
-		}
-		else {
-			timer = list_entry(kafstimod_list.next,afs_timer_t,link);
-			timeout = timer->timo_jif;
+		} else {
+			unsigned long tmo;
+
+			timer = list_entry(kafstimod_list.next,
+					   afs_timer_t, link);
+			tmo = timer->timo_jif;
 			jif = jiffies;
 
-			if (time_before_eq(timeout,jif))
+			if (time_before_eq(tmo,jif))
 				goto immediate;
 
-			else {
-				timeout = (long)timeout - (long)jiffies;
-			}
+			timeout = (long)tmo - (long)jiffies;
 		}
 		spin_unlock(&kafstimod_lock);
 
diff -Nru a/fs/binfmt_elf.c b/fs/binfmt_elf.c
--- a/fs/binfmt_elf.c	Sat Apr 19 19:51:47 2003
+++ b/fs/binfmt_elf.c	Sat Apr 19 19:51:47 2003
@@ -1378,7 +1378,6 @@
 					flush_cache_page(vma, addr);
 					kaddr = kmap(page);
 					DUMP_WRITE(kaddr, PAGE_SIZE);
-					flush_page_to_ram(page);
 					kunmap(page);
 				}
 				page_cache_release(page);
diff -Nru a/fs/buffer.c b/fs/buffer.c
--- a/fs/buffer.c	Sat Apr 19 19:51:48 2003
+++ b/fs/buffer.c	Sat Apr 19 19:51:48 2003
@@ -123,7 +123,8 @@
 	wait_queue_head_t *wqh = bh_waitq_head(bh);
 	DEFINE_WAIT(wait);
 
-	if (atomic_read(&bh->b_count) == 0)
+	if (atomic_read(&bh->b_count) == 0 &&
+			(!bh->b_page || !PageLocked(bh->b_page)))
 		buffer_error();
 
 	do {
@@ -1753,7 +1754,6 @@
 	 * exposing stale data.
 	 * The page is currently locked and not marked for writeback
 	 */
-	ClearPageUptodate(page);
 	bh = head;
 	/* Recovery: lock and submit the mapped buffers */
 	do {
diff -Nru a/fs/coda/psdev.c b/fs/coda/psdev.c
--- a/fs/coda/psdev.c	Sat Apr 19 19:51:49 2003
+++ b/fs/coda/psdev.c	Sat Apr 19 19:51:49 2003
@@ -371,7 +371,7 @@
 		     CODA_PSDEV_MAJOR);
               return -EIO;
 	}
-	devfs_mk_dir (NULL, "coda", NULL);
+	devfs_mk_dir ("coda");
 	for (i = 0; i < MAX_CODADEVS; i++) {
 		char name[16];
 		sprintf(name, "coda/%d", i);
diff -Nru a/fs/dcache.c b/fs/dcache.c
--- a/fs/dcache.c	Sat Apr 19 19:51:28 2003
+++ b/fs/dcache.c	Sat Apr 19 19:51:28 2003
@@ -825,6 +825,7 @@
 
 struct dentry * d_alloc_anon(struct inode *inode)
 {
+	static const struct qstr anonstring = { "", 0, 0};
 	struct dentry *tmp;
 	struct dentry *res;
 
@@ -833,7 +834,7 @@
 		return res;
 	}
 
-	tmp = d_alloc(NULL, &(const struct qstr) {"",0,0});
+	tmp = d_alloc(NULL, &anonstring);
 	if (!tmp)
 		return NULL;
 
@@ -1365,7 +1366,7 @@
  *		return NULL;
  *	}
  */
-asmlinkage long sys_getcwd(char *buf, unsigned long size)
+asmlinkage long sys_getcwd(char __user *buf, unsigned long size)
 {
 	int error;
 	struct vfsmount *pwdmnt, *rootmnt;
diff -Nru a/fs/devfs/base.c b/fs/devfs/base.c
--- a/fs/devfs/base.c	Sat Apr 19 19:51:28 2003
+++ b/fs/devfs/base.c	Sat Apr 19 19:51:28 2003
@@ -1377,23 +1377,19 @@
  *	@uid: The user ID.
  *	@gid: The group ID.
  *	@fs_info: The filesystem info.
- *	@atomic: If TRUE, an atomic allocation is required.
  *
  *	Returns %TRUE if an event was queued and devfsd woken up, else %FALSE.
  */
 
 static int devfsd_notify_de (struct devfs_entry *de,
 			     unsigned short type, umode_t mode,
-			     uid_t uid, gid_t gid, struct fs_info *fs_info,
-			     int atomic)
+			     uid_t uid, gid_t gid, struct fs_info *fs_info)
 {
     struct devfsd_buf_entry *entry;
     struct devfs_entry *curr;
 
     if ( !( fs_info->devfsd_event_mask & (1 << type) ) ) return (FALSE);
-    if ( ( entry = kmem_cache_alloc (devfsd_buf_cache,
-				     atomic ? SLAB_ATOMIC : SLAB_KERNEL) )
-	 == NULL )
+    if ( ( entry = kmem_cache_alloc (devfsd_buf_cache, SLAB_KERNEL) ) == NULL )
     {
 	atomic_inc (&fs_info->devfsd_overrun_count);
 	return (FALSE);
@@ -1423,12 +1419,11 @@
  *		the event.
  */
 
-static void devfsd_notify (struct devfs_entry *de,unsigned short type,int wait)
+static void devfsd_notify (struct devfs_entry *de,unsigned short type)
 {
-    if (devfsd_notify_de (de, type, de->mode, current->euid,
-			  current->egid, &fs_info, 0) && wait)
-	wait_for_devfsd_finished (&fs_info);
-}   /*  End Function devfsd_notify  */
+	devfsd_notify_de(de, type, de->mode, current->euid,
+			 current->egid, &fs_info);
+} 
 
 
 /**
@@ -1436,7 +1431,7 @@
  *	@dir: The handle to the parent devfs directory entry. If this is %NULL the
  *		new name is relative to the root of the devfs.
  *	@name: The name of the entry.
- *	@flags: A set of bitwise-ORed flags (DEVFS_FL_*).
+ *	@flags: Must be 0
  *	@major: The major number. Not needed for regular files.
  *	@minor: The minor number. Not needed for regular files.
  *	@mode: The default file mode.
@@ -1460,6 +1455,9 @@
     dev_t devnum = 0, dev = MKDEV(major, minor);
     struct devfs_entry *de;
 
+    /* we don't accept any flags anymore.  prototype will change soon. */
+    WARN_ON(flags);
+
     if (name == NULL)
     {
 	PRINTK ("(): NULL name pointer\n");
@@ -1501,16 +1499,8 @@
 	return (NULL);
     }
     de->info = info;
-    if (flags & DEVFS_FL_CURRENT_OWNER)
-    {
-	de->inode.uid = current->uid;
-	de->inode.gid = current->gid;
-    }
-    else
-    {
-	de->inode.uid = 0;
-	de->inode.gid = 0;
-    }
+    de->inode.uid = 0;
+    de->inode.gid = 0;
     err = _devfs_append_entry(dir, de, NULL);
     if (err)
     {
@@ -1521,7 +1511,7 @@
     }
     DPRINTK (DEBUG_REGISTER, "(%s): de: %p dir: %p \"%s\"  pp: %p\n",
 	     name, de, dir, dir->name, dir->parent);
-    devfsd_notify (de, DEVFSD_NOTIFY_REGISTERED, flags & DEVFS_FL_WAIT);
+    devfsd_notify (de, DEVFSD_NOTIFY_REGISTERED);
     devfs_put (dir);
     return de;
 }   /*  End Function devfs_register  */
@@ -1568,7 +1558,7 @@
     write_unlock (&dir->u.dir.lock);
     if (!unhooked) return;
     devfs_get (dir);
-    devfsd_notify (de, DEVFSD_NOTIFY_UNREGISTERED, 0);
+    devfsd_notify (de, DEVFSD_NOTIFY_UNREGISTERED);
     free_dentry (de);
     devfs_put (dir);
     if ( !S_ISDIR (de->mode) ) return;
@@ -1673,7 +1663,7 @@
 	err = devfs_do_symlink(NULL, from, to, &de);
 	if (!err) {
 		de->vfs_deletable = TRUE;
-		devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED, 0);
+		devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED);
 	}
 
 	return err;
@@ -1722,7 +1712,7 @@
 	
 	DPRINTK(DEBUG_REGISTER, "(%s): de: %p dir: %p \"%s\"\n",
 			buf, de, dir, dir->name);
-	devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED, 0);
+	devfsd_notify(de, DEVFSD_NOTIFY_REGISTERED);
 
  out_put:
 	devfs_put(dir);
@@ -1757,7 +1747,7 @@
  *	else a negative error code.
  */
 
-int devfs_generate_path (devfs_handle_t de, char *path, int buflen)
+static int devfs_generate_path (devfs_handle_t de, char *path, int buflen)
 {
     int pos;
 #define NAMEOF(de) ( (de)->mode ? (de)->name : (de)->u.name )
@@ -1877,7 +1867,6 @@
 EXPORT_SYMBOL(devfs_mk_symlink);
 EXPORT_SYMBOL(devfs_mk_dir);
 EXPORT_SYMBOL(devfs_remove);
-EXPORT_SYMBOL(devfs_generate_path);
 
 
 /**
@@ -1906,7 +1895,7 @@
     buf->u.name = name;
     WRITE_ENTRY_MAGIC (buf, MAGIC_VALUE);
     if ( !devfsd_notify_de (buf, DEVFSD_NOTIFY_LOOKUP, 0,
-			    current->euid, current->egid, fs_info, 0) )
+			    current->euid, current->egid, fs_info) )
 	return -ENOENT;
     /*  Possible success: event has been queued  */
     return 0;
@@ -1949,7 +1938,7 @@
     if ( ( iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID) ) &&
 	 !is_devfsd_or_child (fs_info) )
 	devfsd_notify_de (de, DEVFSD_NOTIFY_CHANGE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info, 0);
+			  inode->i_uid, inode->i_gid, fs_info);
     return 0;
 }   /*  End Function devfs_notify_change  */
 
@@ -2376,7 +2365,7 @@
     if (!unhooked) return -ENOENT;
     if ( !is_devfsd_or_child (fs_info) )
 	devfsd_notify_de (de, DEVFSD_NOTIFY_DELETE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info, 0);
+			  inode->i_uid, inode->i_gid, fs_info);
     free_dentry (de);
     devfs_put (de);
     return 0;
@@ -2410,7 +2399,7 @@
     d_instantiate (dentry, inode);
     if ( !is_devfsd_or_child (fs_info) )
 	devfsd_notify_de (de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info, 0);
+			  inode->i_uid, inode->i_gid, fs_info);
     return 0;
 }   /*  End Function devfs_symlink  */
 
@@ -2441,7 +2430,7 @@
     d_instantiate (dentry, inode);
     if ( !is_devfsd_or_child (fs_info) )
 	devfsd_notify_de (de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info, 0);
+			  inode->i_uid, inode->i_gid, fs_info);
     return 0;
 }   /*  End Function devfs_mkdir  */
 
@@ -2470,7 +2459,7 @@
     if (err) return err;
     if ( !is_devfsd_or_child (fs_info) )
 	devfsd_notify_de (de, DEVFSD_NOTIFY_DELETE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info, 0);
+			  inode->i_uid, inode->i_gid, fs_info);
     free_dentry (de);
     devfs_put (de);
     return 0;
@@ -2509,7 +2498,7 @@
     d_instantiate (dentry, inode);
     if ( !is_devfsd_or_child (fs_info) )
 	devfsd_notify_de (de, DEVFSD_NOTIFY_CREATE, inode->i_mode,
-			  inode->i_uid, inode->i_gid, fs_info, 0);
+			  inode->i_uid, inode->i_gid, fs_info);
     return 0;
 }   /*  End Function devfs_mknod  */
 
diff -Nru a/fs/devfs/util.c b/fs/devfs/util.c
--- a/fs/devfs/util.c	Sat Apr 19 19:51:48 2003
+++ b/fs/devfs/util.c	Sat Apr 19 19:51:48 2003
@@ -77,28 +77,18 @@
 #define PRINTK(format, args...) \
    {printk (KERN_ERR "%s" format, __FUNCTION__ , ## args);}
 
+int devfs_register_tape(const char *name)
+{
+	char tname[32], dest[64];
+	static unsigned int tape_counter;
+	unsigned int n = tape_counter++;
 
-/*  Private functions follow  */
-
-/**
- *	devfs_register_tape - Register a tape device in the "/dev/tapes" hierarchy.
- *	@de: Any tape device entry in the device directory.
- */
+	sprintf(dest, "../%s", name);
+	sprintf(tname, "tapes/tape%u", n);
+	devfs_mk_symlink(tname, dest);
 
-int devfs_register_tape (devfs_handle_t de)
-{
-    int pos;
-    char name[32], dest[64];
-    static unsigned int tape_counter;
-    int n = tape_counter++;
-
-    pos = devfs_generate_path (de, dest + 3, sizeof dest - 3);
-    if (pos < 0) return -1;
-    strncpy (dest + pos, "../", 3);
-    sprintf (name, "tapes/tape%u", n);
-    devfs_mk_symlink (name, dest + pos);
-    return n;
-}   /*  End Function devfs_register_tape  */
+	return n;
+}
 EXPORT_SYMBOL(devfs_register_tape);
 
 void devfs_unregister_tape(int num)
@@ -356,78 +346,71 @@
 static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
 static struct unique_numspace cdrom_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
 
-void devfs_create_partitions(struct gendisk *dev)
+void devfs_create_partitions(struct gendisk *disk)
 {
-	int pos = 0;
-	devfs_handle_t dir;
-	char dirname[64], symlink[16];
-
-	if (dev->flags & GENHD_FL_DEVFS) {
-		dir = dev->de;
-		if (!dir)  /*  Aware driver wants to block disc management  */
-			return;
-		pos = devfs_generate_path(dir, dirname + 3, sizeof dirname-3);
-		if (pos < 0)
-			return;
-		strncpy(dirname + pos, "../", 3);
-	} else {
-		/*  Unaware driver: construct "real" directory  */
-		sprintf(dirname, "../%s/disc%d", dev->disk_name,
-			dev->first_minor >> dev->minor_shift);
-		dir = devfs_mk_dir(dirname + 3);
-		dev->de = dir;
-	}
-	dev->number = devfs_alloc_unique_number (&disc_numspace);
-	sprintf(symlink, "discs/disc%d", dev->number);
-	devfs_mk_symlink(symlink, dirname + pos);
-	dev->disk_de = devfs_register(dir, "disc", 0,
-			    dev->major, dev->first_minor,
-			    S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL);
+	char dirname[64], diskname[64], symlink[16];
+
+	if (!disk->devfs_name)
+		sprintf(disk->devfs_name, "%s/disc%d", disk->disk_name,
+				disk->first_minor >> disk->minor_shift);
+
+	devfs_mk_dir(disk->devfs_name);
+	disk->number = devfs_alloc_unique_number(&disc_numspace);
+
+	sprintf(diskname, "%s/disc", disk->devfs_name);
+	devfs_register(NULL, diskname, 0,
+			disk->major, disk->first_minor,
+			S_IFBLK | S_IRUSR | S_IWUSR,
+			disk->fops, NULL);
+
+	sprintf(symlink, "discs/disc%d", disk->number);
+	sprintf(dirname, "../%s", disk->devfs_name);
+	devfs_mk_symlink(symlink, dirname);
+
 }
 
-void devfs_create_cdrom(struct gendisk *dev)
+void devfs_create_cdrom(struct gendisk *disk)
 {
-	char vname[23];
+	char dirname[64], cdname[64], symlink[16];
 
-	dev->number = devfs_alloc_unique_number(&cdrom_numspace);
-	sprintf(vname, "cdroms/cdrom%d", dev->number);
-	if (dev->de) {
-		int pos;
-		char rname[64];
-
-		dev->disk_de = devfs_register(dev->de, "cd", DEVFS_FL_DEFAULT,
-				     dev->major, dev->first_minor,
-				     S_IFBLK | S_IRUGO | S_IWUGO,
-				     dev->fops, NULL);
-
-		pos = devfs_generate_path(dev->disk_de, rname+3, sizeof(rname)-3);
-		if (pos >= 0) {
-			strncpy(rname + pos, "../", 3);
-			devfs_mk_symlink(vname, rname + pos);
-		}
-	} else {
-		dev->disk_de = devfs_register (NULL, vname, DEVFS_FL_DEFAULT,
-				    dev->major, dev->first_minor,
-				    S_IFBLK | S_IRUGO | S_IWUGO,
-				    dev->fops, NULL);
-	}
+	if (!disk->devfs_name)
+		strcat(disk->devfs_name, disk->disk_name);
+
+	devfs_mk_dir(disk->devfs_name);
+	disk->number = devfs_alloc_unique_number(&cdrom_numspace);
+
+	sprintf(cdname, "%s/cd", disk->devfs_name);
+	devfs_register(NULL, cdname, 0,
+			disk->major, disk->first_minor,
+			S_IFBLK | S_IRUGO | S_IWUGO,
+			disk->fops, NULL);
+
+	sprintf(symlink, "cdroms/cdrom%d", disk->number);
+	sprintf(dirname, "../%s", disk->devfs_name);
+	devfs_mk_symlink(symlink, dirname);
 }
 
-void devfs_remove_partitions(struct gendisk *dev)
+void devfs_register_partition(struct gendisk *dev, int part)
 {
-	devfs_unregister(dev->disk_de);
-	dev->disk_de = NULL;
+	char devname[64];
 
-	if (dev->flags & GENHD_FL_CD) {
-		if (dev->de)
-			devfs_remove("cdroms/cdrom%d", dev->number);
-		devfs_dealloc_unique_number(&cdrom_numspace, dev->number);
-	} else {
-		devfs_remove("discs/disc%d", dev->number);
-		if (!(dev->flags & GENHD_FL_DEVFS)) {
-			devfs_unregister(dev->de);
-			dev->de = NULL;
-		}
-		devfs_dealloc_unique_number(&disc_numspace, dev->number);
-	}
+	sprintf(devname, "%s/part%d", dev->devfs_name, part);
+	devfs_register(NULL, devname, 0,
+			dev->major, dev->first_minor + part,
+			S_IFBLK | S_IRUSR | S_IWUSR,
+			dev->fops, NULL);
+}
+
+void devfs_remove_partitions(struct gendisk *disk)
+{
+	devfs_remove("discs/disc%d", disk->number);
+	devfs_remove(disk->devfs_name);
+	devfs_dealloc_unique_number(&disc_numspace, disk->number);
+}
+
+void devfs_remove_cdrom(struct gendisk *disk)
+{
+	devfs_remove("cdroms/cdrom%d", disk->number);
+	devfs_remove(disk->devfs_name);
+	devfs_dealloc_unique_number(&cdrom_numspace, disk->number);
 }
diff -Nru a/fs/dquot.c b/fs/dquot.c
--- a/fs/dquot.c	Sat Apr 19 19:51:49 2003
+++ b/fs/dquot.c	Sat Apr 19 19:51:49 2003
@@ -326,7 +326,7 @@
 		if (!dquot_dirty(dquot))
 			continue;
 		spin_unlock(&dq_list_lock);
-		commit_dqblk(dquot);
+		sb->dq_op->sync_dquot(dquot);
 		goto restart;
 	}
 	spin_unlock(&dq_list_lock);
@@ -1072,9 +1072,16 @@
 	.alloc_inode	= dquot_alloc_inode,
 	.free_space	= dquot_free_space,
 	.free_inode	= dquot_free_inode,
-	.transfer	= dquot_transfer
+	.transfer	= dquot_transfer,
+	.sync_dquot	= commit_dqblk
 };
 
+/* Function used by filesystems for initializing the dquot_operations structure */
+void init_dquot_operations(struct dquot_operations *fsdqops)
+{
+	memcpy(fsdqops, &dquot_operations, sizeof(dquot_operations));
+}
+
 static inline void set_enable_flags(struct quota_info *dqopt, int type)
 {
 	switch (type) {
@@ -1432,3 +1439,4 @@
 EXPORT_SYMBOL(dqstats);
 EXPORT_SYMBOL(dq_list_lock);
 EXPORT_SYMBOL(dq_data_lock);
+EXPORT_SYMBOL(init_dquot_operations);
diff -Nru a/fs/eventpoll.c b/fs/eventpoll.c
--- a/fs/eventpoll.c	Sat Apr 19 19:51:46 2003
+++ b/fs/eventpoll.c	Sat Apr 19 19:51:46 2003
@@ -1342,6 +1342,13 @@
 			ep_use_epitem(epi);
 
 			/*
+			 * We need to increase the usage count of the "struct file" because
+			 * another thread might call close() on this target and make the file
+			 * to vanish before we will be able to call f_op->poll().
+			 */
+			get_file(epi->file);
+
+			/*
 			 * This is initialized in this way so that the default
 			 * behaviour of the reinjecting code will be to push back
 			 * the item inside the ready list.
@@ -1386,6 +1393,14 @@
 		revents = epi->file->f_op->poll(epi->file, NULL);
 
 		/*
+		 * Release the file usage before checking the event mask.
+		 * In case this call will lead to the file removal, its
+		 * ->event.events member has been already set to zero and
+		 * this will make the event to be dropped.
+		 */
+		fput(epi->file);
+
+		/*
 		 * Set the return event set for the current file descriptor.
 		 * Note that only the task task was successfully able to link
 		 * the item to its "txlist" will write this field.
@@ -1398,8 +1413,17 @@
 			eventbuf++;
 			if (eventbuf == EP_MAX_BUF_EVENTS) {
 				if (__copy_to_user(&events[eventcnt], event,
-						   eventbuf * sizeof(struct epoll_event)))
+						   eventbuf * sizeof(struct epoll_event))) {
+					/*
+					 * We need to complete the loop to decrement the file
+					 * usage before returning from this function.
+					 */
+					for (lnk = lnk->next; lnk != txlist; lnk = lnk->next) {
+						epi = list_entry(lnk, struct epitem, txlink);
+						fput(epi->file);
+					}
 					return -EFAULT;
+				}
 				eventcnt += eventbuf;
 				eventbuf = 0;
 			}
diff -Nru a/fs/exec.c b/fs/exec.c
--- a/fs/exec.c	Sat Apr 19 19:51:46 2003
+++ b/fs/exec.c	Sat Apr 19 19:51:46 2003
@@ -111,7 +111,7 @@
  *
  * Also note that we take the address to load from from the file itself.
  */
-asmlinkage long sys_uselib(const char * library)
+asmlinkage long sys_uselib(const char __user * library)
 {
 	struct file * file;
 	struct nameidata nd;
@@ -164,13 +164,13 @@
 /*
  * count() counts the number of strings in array ARGV.
  */
-static int count(char ** argv, int max)
+static int count(char __user * __user * argv, int max)
 {
 	int i = 0;
 
 	if (argv != NULL) {
 		for (;;) {
-			char * p;
+			char __user * p;
 
 			if (get_user(p, argv))
 				return -EFAULT;
@@ -189,14 +189,14 @@
  * memory to free pages in kernel mem. These are in a format ready
  * to be put directly into the top of new user memory.
  */
-int copy_strings(int argc,char ** argv, struct linux_binprm *bprm) 
+int copy_strings(int argc,char __user * __user * argv, struct linux_binprm *bprm) 
 {
 	struct page *kmapped_page = NULL;
 	char *kaddr = NULL;
 	int ret;
 
 	while (argc-- > 0) {
-		char *str;
+		char __user *str;
 		int len;
 		unsigned long pos;
 
@@ -275,7 +275,7 @@
 	int r;
 	mm_segment_t oldfs = get_fs();
 	set_fs(KERNEL_DS); 
-	r = copy_strings(argc, argv, bprm);
+	r = copy_strings(argc, (char __user * __user *)argv, bprm);
 	set_fs(oldfs);
 	return r; 
 }
@@ -314,7 +314,6 @@
 	}
 	lru_cache_add_active(page);
 	flush_dcache_page(page);
-	flush_page_to_ram(page);
 	set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, PAGE_COPY))));
 	pte_chain = page_add_rmap(page, pte, pte_chain);
 	pte_unmap(pte);
@@ -407,7 +406,7 @@
 		mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
 		mpnt->vm_end = STACK_TOP;
 #endif
-		mpnt->vm_page_prot = PAGE_COPY;
+		mpnt->vm_page_prot = protection_map[VM_STACK_FLAGS & 0x7];
 		mpnt->vm_flags = VM_STACK_FLAGS;
 		mpnt->vm_ops = NULL;
 		mpnt->vm_pgoff = 0;
@@ -492,7 +491,8 @@
 
 	old_fs = get_fs();
 	set_fs(get_ds());
-	result = vfs_read(file, addr, count, &pos);
+	/* The cast to a user pointer is valid due to the set_fs() */
+	result = vfs_read(file, (void __user *)addr, count, &pos);
 	set_fs(old_fs);
 	return result;
 }
@@ -750,7 +750,7 @@
 {
 	long j = -1;
 
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	for (;;) {
 		unsigned long set, i;
 
@@ -762,16 +762,16 @@
 		if (!set)
 			continue;
 		files->close_on_exec->fds_bits[j] = 0;
-		write_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 		for ( ; set ; i++,set >>= 1) {
 			if (set & 1) {
 				sys_close(i);
 			}
 		}
-		write_lock(&files->file_lock);
+		spin_lock(&files->file_lock);
 
 	}
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 }
 
 int flush_old_exec(struct linux_binprm * bprm)
@@ -1050,7 +1050,10 @@
 /*
  * sys_execve() executes a new program.
  */
-int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)
+int do_execve(char * filename,
+	char __user *__user *argv,
+	char __user *__user *envp,
+	struct pt_regs * regs)
 {
 	struct linux_binprm bprm;
 	struct file *file;
diff -Nru a/fs/ext2/balloc.c b/fs/ext2/balloc.c
--- a/fs/ext2/balloc.c	Sat Apr 19 19:51:46 2003
+++ b/fs/ext2/balloc.c	Sat Apr 19 19:51:46 2003
@@ -94,12 +94,19 @@
 	return bh;
 }
 
-static inline int reserve_blocks(struct super_block *sb, int count)
+/*
+ * Set sb->s_dirt here because the superblock was "logically" altered.  We
+ * need to recalculate its free blocks count and flush it out.
+ */
+static int reserve_blocks(struct super_block *sb, int count)
 {
-	struct ext2_sb_info * sbi = EXT2_SB(sb);
-	struct ext2_super_block * es = sbi->s_es;
-	unsigned free_blocks = le32_to_cpu(es->s_free_blocks_count);
-	unsigned root_blocks = le32_to_cpu(es->s_r_blocks_count);
+	struct ext2_sb_info *sbi = EXT2_SB(sb);
+	struct ext2_super_block *es = sbi->s_es;
+	unsigned free_blocks;
+	unsigned root_blocks;
+
+	free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
+	root_blocks = le32_to_cpu(es->s_r_blocks_count);
 
 	if (free_blocks < count)
 		count = free_blocks;
@@ -117,46 +124,51 @@
 			return 0;
 	}
 
-	es->s_free_blocks_count = cpu_to_le32(free_blocks - count);
-	mark_buffer_dirty(sbi->s_sbh);
+	percpu_counter_mod(&sbi->s_freeblocks_counter, -count);
 	sb->s_dirt = 1;
 	return count;
 }
 
-static inline void release_blocks(struct super_block *sb, int count)
+static void release_blocks(struct super_block *sb, int count)
 {
 	if (count) {
-		struct ext2_sb_info * sbi = EXT2_SB(sb);
-		struct ext2_super_block * es = sbi->s_es;
-		unsigned free_blocks = le32_to_cpu(es->s_free_blocks_count);
-		es->s_free_blocks_count = cpu_to_le32(free_blocks + count);
-		mark_buffer_dirty(sbi->s_sbh);
+		struct ext2_sb_info *sbi = EXT2_SB(sb);
+
+		percpu_counter_mod(&sbi->s_freeblocks_counter, count);
 		sb->s_dirt = 1;
 	}
 }
 
-static inline int group_reserve_blocks(struct ext2_group_desc *desc,
-				    struct buffer_head *bh, int count)
+static int group_reserve_blocks(struct ext2_sb_info *sbi, int group_no,
+	struct ext2_group_desc *desc, struct buffer_head *bh, int count)
 {
 	unsigned free_blocks;
 
 	if (!desc->bg_free_blocks_count)
 		return 0;
 
+	spin_lock(sb_bgl_lock(sbi, group_no));
 	free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
 	if (free_blocks < count)
 		count = free_blocks;
 	desc->bg_free_blocks_count = cpu_to_le16(free_blocks - count);
+	spin_unlock(sb_bgl_lock(sbi, group_no));
 	mark_buffer_dirty(bh);
 	return count;
 }
 
-static inline void group_release_blocks(struct ext2_group_desc *desc,
-				    struct buffer_head *bh, int count)
+static void group_release_blocks(struct super_block *sb, int group_no,
+	struct ext2_group_desc *desc, struct buffer_head *bh, int count)
 {
 	if (count) {
-		unsigned free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
+		struct ext2_sb_info *sbi = EXT2_SB(sb);
+		unsigned free_blocks;
+
+		spin_lock(sb_bgl_lock(sbi, group_no));
+		free_blocks = le16_to_cpu(desc->bg_free_blocks_count);
 		desc->bg_free_blocks_count = cpu_to_le16(free_blocks + count);
+		spin_unlock(sb_bgl_lock(sbi, group_no));
+		sb->s_dirt = 1;
 		mark_buffer_dirty(bh);
 	}
 }
@@ -172,12 +184,11 @@
 	unsigned long i;
 	unsigned long overflow;
 	struct super_block * sb = inode->i_sb;
+	struct ext2_sb_info * sbi = EXT2_SB(sb);
 	struct ext2_group_desc * desc;
-	struct ext2_super_block * es;
+	struct ext2_super_block * es = sbi->s_es;
 	unsigned freed = 0, group_freed;
 
-	lock_super (sb);
-	es = EXT2_SB(sb)->s_es;
 	if (block < le32_to_cpu(es->s_first_data_block) ||
 	    block + count < block ||
 	    block + count > le32_to_cpu(es->s_blocks_count)) {
@@ -215,16 +226,17 @@
 	if (in_range (le32_to_cpu(desc->bg_block_bitmap), block, count) ||
 	    in_range (le32_to_cpu(desc->bg_inode_bitmap), block, count) ||
 	    in_range (block, le32_to_cpu(desc->bg_inode_table),
-		      EXT2_SB(sb)->s_itb_per_group) ||
+		      sbi->s_itb_per_group) ||
 	    in_range (block + count - 1, le32_to_cpu(desc->bg_inode_table),
-		      EXT2_SB(sb)->s_itb_per_group))
+		      sbi->s_itb_per_group))
 		ext2_error (sb, "ext2_free_blocks",
 			    "Freeing blocks in system zones - "
 			    "Block = %lu, count = %lu",
 			    block, count);
 
 	for (i = 0, group_freed = 0; i < count; i++) {
-		if (!ext2_clear_bit(bit + i, bitmap_bh->b_data))
+		if (!ext2_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
+					bit + i, (void *) bitmap_bh->b_data))
 			ext2_error (sb, "ext2_free_blocks",
 				      "bit already cleared for block %lu",
 				      block + i);
@@ -236,7 +248,7 @@
 	if (sb->s_flags & MS_SYNCHRONOUS)
 		sync_dirty_buffer(bitmap_bh);
 
-	group_release_blocks(desc, bh2, group_freed);
+	group_release_blocks(sb, block_group, desc, bh2, group_freed);
 	freed += group_freed;
 
 	if (overflow) {
@@ -247,17 +259,18 @@
 error_return:
 	brelse(bitmap_bh);
 	release_blocks(sb, freed);
-	unlock_super (sb);
 	DQUOT_FREE_BLOCK(inode, freed);
 }
 
-static int grab_block(char *map, unsigned size, int goal)
+static int grab_block(spinlock_t *lock, char *map, unsigned size, int goal)
 {
 	int k;
 	char *p, *r;
 
 	if (!ext2_test_bit(goal, map))
 		goto got_it;
+
+repeat:
 	if (goal) {
 		/*
 		 * The goal was occupied; search forward for a free 
@@ -297,7 +310,8 @@
 	}
 	return -1;
 got_it:
-	ext2_set_bit(goal, map);
+	if (ext2_set_bit_atomic(lock, goal, (void *) map)) 
+		goto repeat;	
 	return goal;
 }
 
@@ -309,15 +323,15 @@
  * bitmap, and then for any free bit if that fails.
  * This function also updates quota and i_blocks field.
  */
-int ext2_new_block (struct inode * inode, unsigned long goal,
-    u32 * prealloc_count, u32 * prealloc_block, int * err)
+int ext2_new_block(struct inode *inode, unsigned long goal,
+			u32 *prealloc_count, u32 *prealloc_block, int *err)
 {
 	struct buffer_head *bitmap_bh = NULL;
 	struct buffer_head *gdp_bh;	/* bh2 */
 	struct ext2_group_desc *desc;
 	int group_no;			/* i */
 	int ret_block;			/* j */
-	int bit;		/* k */
+	int bit;			/* k */
 	int target_block;		/* tmp */
 	int block = 0;
 	struct super_block *sb = inode->i_sb;
@@ -341,13 +355,10 @@
 		prealloc_goal--;
 
 	dq_alloc = prealloc_goal + 1;
-
-	lock_super (sb);
-
 	es_alloc = reserve_blocks(sb, dq_alloc);
 	if (!es_alloc) {
 		*err = -ENOSPC;
-		goto out_unlock;
+		goto out_dquot;
 	}
 
 	ext2_debug ("goal=%lu.\n", goal);
@@ -357,10 +368,16 @@
 		goal = le32_to_cpu(es->s_first_data_block);
 	group_no = (goal - le32_to_cpu(es->s_first_data_block)) / group_size;
 	desc = ext2_get_group_desc (sb, group_no, &gdp_bh);
-	if (!desc)
+	if (!desc) {
+		/*
+		 * gdp_bh may still be uninitialised.  But group_release_blocks
+		 * will not touch it because group_alloc is zero.
+		 */
 		goto io_error;
+	}
 
-	group_alloc = group_reserve_blocks(desc, gdp_bh, es_alloc);
+	group_alloc = group_reserve_blocks(sbi, group_no, desc,
+					gdp_bh, es_alloc);
 	if (group_alloc) {
 		ret_block = ((goal - le32_to_cpu(es->s_first_data_block)) %
 					group_size);
@@ -371,11 +388,11 @@
 		
 		ext2_debug("goal is at %d:%d.\n", group_no, ret_block);
 
-		ret_block = grab_block(bitmap_bh->b_data,
-				group_size, ret_block);
+		ret_block = grab_block(sb_bgl_lock(sbi, group_no),
+				bitmap_bh->b_data, group_size, ret_block);
 		if (ret_block >= 0)
 			goto got_block;
-		group_release_blocks(desc, gdp_bh, group_alloc);
+		group_release_blocks(sb, group_no, desc, gdp_bh, group_alloc);
 		group_alloc = 0;
 	}
 
@@ -393,7 +410,8 @@
 		desc = ext2_get_group_desc(sb, group_no, &gdp_bh);
 		if (!desc)
 			goto io_error;
-		group_alloc = group_reserve_blocks(desc, gdp_bh, es_alloc);
+		group_alloc = group_reserve_blocks(sbi, group_no, desc,
+						gdp_bh, es_alloc);
 	}
 	if (!group_alloc) {
 		*err = -ENOSPC;
@@ -404,7 +422,8 @@
 	if (!bitmap_bh)
 		goto io_error;
 
-	ret_block = grab_block(bitmap_bh->b_data, group_size, 0);
+	ret_block = grab_block(sb_bgl_lock(sbi, group_no), bitmap_bh->b_data,
+				group_size, 0);
 	if (ret_block < 0) {
 		ext2_error (sb, "ext2_new_block",
 			"Free blocks count corrupted for block group %d",
@@ -452,7 +471,9 @@
 		unsigned n;
 
 		for (n = 0; n < group_alloc && ++ret_block < group_size; n++) {
-			if (ext2_set_bit(ret_block, bitmap_bh->b_data))
+			if (ext2_set_bit_atomic(sb_bgl_lock(sbi, group_no),
+						ret_block,
+						(void*) bitmap_bh->b_data))
  				break;
 		}
 		*prealloc_block = block + 1;
@@ -471,10 +492,9 @@
 
 	*err = 0;
 out_release:
-	group_release_blocks(desc, gdp_bh, group_alloc);
+	group_release_blocks(sb, group_no, desc, gdp_bh, group_alloc);
 	release_blocks(sb, es_alloc);
-out_unlock:
-	unlock_super (sb);
+out_dquot:
 	DQUOT_FREE_BLOCK(inode, dq_alloc);
 out:
 	brelse(bitmap_bh);
@@ -487,11 +507,11 @@
 
 unsigned long ext2_count_free_blocks (struct super_block * sb)
 {
-#ifdef EXT2FS_DEBUG
-	struct ext2_super_block * es;
-	unsigned long desc_count, bitmap_count, x;
 	struct ext2_group_desc * desc;
+	unsigned long desc_count = 0;
 	int i;
+#ifdef EXT2FS_DEBUG
+	unsigned long bitmap_count, x;
 	
 	lock_super (sb);
 	es = EXT2_SB(sb)->s_es;
@@ -519,13 +539,18 @@
 	unlock_super (sb);
 	return bitmap_count;
 #else
-	return le32_to_cpu(EXT2_SB(sb)->s_es->s_free_blocks_count);
+        for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
+                desc = ext2_get_group_desc (sb, i, NULL);
+                if (!desc)
+                        continue;
+                desc_count += le16_to_cpu(desc->bg_free_blocks_count);
+	}
+	return desc_count;
 #endif
 }
 
-static inline int block_in_use (unsigned long block,
-				struct super_block * sb,
-				unsigned char * map)
+static inline int
+block_in_use(unsigned long block, struct super_block *sb, unsigned char *map)
 {
 	return ext2_test_bit ((block - le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block)) %
 			 EXT2_BLOCKS_PER_GROUP(sb), map);
diff -Nru a/fs/ext2/ialloc.c b/fs/ext2/ialloc.c
--- a/fs/ext2/ialloc.c	Sat Apr 19 19:51:47 2003
+++ b/fs/ext2/ialloc.c	Sat Apr 19 19:51:47 2003
@@ -64,6 +64,66 @@
 }
 
 /*
+ * Speculatively reserve an inode in a blockgroup which used to have some
+ * spare ones.  Later, when we come to actually claim the inode in the bitmap
+ * it may be that it was taken.  In that case the allocator will undo this
+ * reservation and try again.
+ *
+ * The inode allocator does not physically alter the superblock.  But we still
+ * set sb->s_dirt, because the superblock was "logically" altered - we need to
+ * go and add up the free inodes counts again and flush out the superblock.
+ */
+static void ext2_reserve_inode(struct super_block *sb, int group, int dir)
+{
+	struct ext2_group_desc * desc;
+	struct buffer_head *bh;
+
+	desc = ext2_get_group_desc(sb, group, &bh);
+	if (!desc) {
+		ext2_error(sb, "ext2_reserve_inode",
+			"can't get descriptor for group %d", group);
+		return;
+	}
+
+	spin_lock(sb_bgl_lock(EXT2_SB(sb), group));
+	desc->bg_free_inodes_count =
+		cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) - 1);
+	if (dir)
+		desc->bg_used_dirs_count =
+			cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) + 1);
+	spin_unlock(sb_bgl_lock(EXT2_SB(sb), group));
+	if (dir)
+		percpu_counter_inc(&EXT2_SB(sb)->s_dirs_counter);
+	sb->s_dirt = 1;
+	mark_buffer_dirty(bh);
+}
+
+static void ext2_release_inode(struct super_block *sb, int group, int dir)
+{
+	struct ext2_group_desc * desc;
+	struct buffer_head *bh;
+
+	desc = ext2_get_group_desc(sb, group, &bh);
+	if (!desc) {
+		ext2_error(sb, "ext2_release_inode",
+			"can't get descriptor for group %d", group);
+		return;
+	}
+
+	spin_lock(sb_bgl_lock(EXT2_SB(sb), group));
+	desc->bg_free_inodes_count =
+		cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) + 1);
+	if (dir)
+		desc->bg_used_dirs_count =
+			cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) - 1);
+	spin_unlock(sb_bgl_lock(EXT2_SB(sb), group));
+	if (dir)
+		percpu_counter_dec(&EXT2_SB(sb)->s_dirs_counter);
+	sb->s_dirt = 1;
+	mark_buffer_dirty(bh);
+}
+
+/*
  * NOTE! When we get the inode, we're the only people
  * that have access to it, and as such there are no
  * race conditions we have to worry about. The inode
@@ -85,10 +145,8 @@
 	int is_directory;
 	unsigned long ino;
 	struct buffer_head *bitmap_bh = NULL;
-	struct buffer_head *bh2;
 	unsigned long block_group;
 	unsigned long bit;
-	struct ext2_group_desc * desc;
 	struct ext2_super_block * es;
 
 	ino = inode->i_ino;
@@ -105,7 +163,6 @@
 		DQUOT_DROP(inode);
 	}
 
-	lock_super (sb);
 	es = EXT2_SB(sb)->s_es;
 	is_directory = S_ISDIR(inode->i_mode);
 
@@ -126,32 +183,17 @@
 		goto error_return;
 
 	/* Ok, now we can actually update the inode bitmaps.. */
-	if (!ext2_clear_bit(bit, bitmap_bh->b_data))
+	if (!ext2_clear_bit_atomic(sb_bgl_lock(EXT2_SB(sb), block_group),
+				bit, (void *) bitmap_bh->b_data))
 		ext2_error (sb, "ext2_free_inode",
 			      "bit already cleared for inode %lu", ino);
-	else {
-		desc = ext2_get_group_desc (sb, block_group, &bh2);
-		if (desc) {
-			desc->bg_free_inodes_count =
-				cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) + 1);
-			if (is_directory) {
-				desc->bg_used_dirs_count =
-					cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) - 1);
-				EXT2_SB(sb)->s_dir_count--;
-			}
-		}
-		mark_buffer_dirty(bh2);
-		es->s_free_inodes_count =
-			cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) + 1);
-		mark_buffer_dirty(EXT2_SB(sb)->s_sbh);
-	}
+	else
+		ext2_release_inode(sb, block_group, is_directory);
 	mark_buffer_dirty(bitmap_bh);
 	if (sb->s_flags & MS_SYNCHRONOUS)
 		sync_dirty_buffer(bitmap_bh);
-	sb->s_dirt = 1;
 error_return:
 	brelse(bitmap_bh);
-	unlock_super (sb);
 }
 
 /*
@@ -211,9 +253,8 @@
  */
 static int find_group_dir(struct super_block *sb, struct inode *parent)
 {
-	struct ext2_super_block * es = EXT2_SB(sb)->s_es;
 	int ngroups = EXT2_SB(sb)->s_groups_count;
-	int avefreei = le32_to_cpu(es->s_free_inodes_count) / ngroups;
+	int avefreei = ext2_count_free_inodes(sb) / ngroups;
 	struct ext2_group_desc *desc, *best_desc = NULL;
 	struct buffer_head *bh, *best_bh = NULL;
 	int group, best_group = -1;
@@ -234,11 +275,9 @@
 	}
 	if (!best_desc)
 		return -1;
-	best_desc->bg_free_inodes_count =
-		cpu_to_le16(le16_to_cpu(best_desc->bg_free_inodes_count) - 1);
-	best_desc->bg_used_dirs_count =
-		cpu_to_le16(le16_to_cpu(best_desc->bg_used_dirs_count) + 1);
-	mark_buffer_dirty(best_bh);
+
+	ext2_reserve_inode(sb, best_group, 1);
+
 	return best_group;
 }
 
@@ -277,15 +316,23 @@
 	struct ext2_super_block *es = sbi->s_es;
 	int ngroups = sbi->s_groups_count;
 	int inodes_per_group = EXT2_INODES_PER_GROUP(sb);
-	int avefreei = le32_to_cpu(es->s_free_inodes_count) / ngroups;
-	int avefreeb = le32_to_cpu(es->s_free_blocks_count) / ngroups;
+	int freei;
+	int avefreei;
+	int free_blocks;
+	int avefreeb;
 	int blocks_per_dir;
-	int ndirs = sbi->s_dir_count;
+	int ndirs;
 	int max_debt, max_dirs, min_blocks, min_inodes;
 	int group = -1, i;
 	struct ext2_group_desc *desc;
 	struct buffer_head *bh;
 
+	freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter);
+	avefreei = freei / ngroups;
+	free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter);
+	avefreeb = free_blocks / ngroups;
+	ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
+
 	if ((parent == sb->s_root->d_inode) ||
 	    (parent->i_flags & EXT2_TOPDIR_FL)) {
 		struct ext2_group_desc *best_desc = NULL;
@@ -320,8 +367,10 @@
 		goto fallback;
 	}
 
-	blocks_per_dir = (le32_to_cpu(es->s_blocks_count) -
-			  le32_to_cpu(es->s_free_blocks_count)) / ndirs;
+	if (ndirs == 0)
+		ndirs = 1;	/* percpu_counters are approximate... */
+
+	blocks_per_dir = (le32_to_cpu(es->s_blocks_count)-free_blocks) / ndirs;
 
 	max_dirs = ndirs / ngroups + inodes_per_group / 16;
 	min_inodes = avefreei - inodes_per_group / 4;
@@ -361,15 +410,19 @@
 			goto found;
 	}
 
+	if (avefreei) {
+		/*
+		 * The free-inodes counter is approximate, and for really small
+		 * filesystems the above test can fail to find any blockgroups
+		 */
+		avefreei = 0;
+		goto fallback;
+	}
+
 	return -1;
 
 found:
-	desc->bg_free_inodes_count =
-		cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) - 1);
-	desc->bg_used_dirs_count =
-		cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) + 1);
-	sbi->s_dir_count++;
-	mark_buffer_dirty(bh);
+	ext2_reserve_inode(sb, group, 1);
 	return group;
 }
 
@@ -431,9 +484,8 @@
 	return -1;
 
 found:
-	desc->bg_free_inodes_count =
-		cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) - 1);
-	mark_buffer_dirty(bh);
+	ext2_reserve_inode(sb, group, 0);
+
 	return group;
 }
 
@@ -456,7 +508,6 @@
 		return ERR_PTR(-ENOMEM);
 
 	ei = EXT2_I(inode);
-	lock_super (sb);
 	es = EXT2_SB(sb)->s_es;
 repeat:
 	if (S_ISDIR(mode)) {
@@ -480,7 +531,12 @@
 				      EXT2_INODES_PER_GROUP(sb));
 	if (i >= EXT2_INODES_PER_GROUP(sb))
 		goto bad_count;
-	ext2_set_bit(i, bitmap_bh->b_data);
+	if (ext2_set_bit_atomic(sb_bgl_lock(EXT2_SB(sb), group),
+			i, (void *) bitmap_bh->b_data)) {
+		brelse(bitmap_bh);
+		ext2_release_inode(sb, group, S_ISDIR(mode));
+		goto repeat;
+	}
 
 	mark_buffer_dirty(bitmap_bh);
 	if (sb->s_flags & MS_SYNCHRONOUS)
@@ -497,9 +553,9 @@
 		goto fail2;
 	}
 
-	es->s_free_inodes_count =
-		cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) - 1);
+	percpu_counter_mod(&EXT2_SB(sb)->s_freeinodes_counter, -1);
 
+	spin_lock(sb_bgl_lock(EXT2_SB(sb), group));
 	if (S_ISDIR(mode)) {
 		if (EXT2_SB(sb)->s_debts[group] < 255)
 			EXT2_SB(sb)->s_debts[group]++;
@@ -507,8 +563,8 @@
 		if (EXT2_SB(sb)->s_debts[group])
 			EXT2_SB(sb)->s_debts[group]--;
 	}
+	spin_unlock(sb_bgl_lock(EXT2_SB(sb), group));
 
-	mark_buffer_dirty(EXT2_SB(sb)->s_sbh);
 	sb->s_dirt = 1;
 	inode->i_uid = current->fsuid;
 	if (test_opt (sb, GRPID))
@@ -549,7 +605,6 @@
 	inode->i_generation = EXT2_SB(sb)->s_next_generation++;
 	insert_inode_hash(inode);
 
-	unlock_super(sb);
 	if(DQUOT_ALLOC_INODE(inode)) {
 		DQUOT_DROP(inode);
 		goto fail3;
@@ -571,15 +626,8 @@
 	return ERR_PTR(err);
 
 fail2:
-	desc = ext2_get_group_desc (sb, group, &bh2);
-	desc->bg_free_inodes_count =
-		cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) + 1);
-	if (S_ISDIR(mode))
-		desc->bg_used_dirs_count =
-			cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) - 1);
-	mark_buffer_dirty(bh2);
+	ext2_release_inode(sb, group, S_ISDIR(mode));
 fail:
-	unlock_super(sb);
 	make_bad_inode(inode);
 	iput(inode);
 	return ERR_PTR(err);
@@ -602,16 +650,19 @@
 
 unsigned long ext2_count_free_inodes (struct super_block * sb)
 {
+	struct ext2_group_desc *desc;
+	unsigned long desc_count = 0;
+	int i;	
+
 #ifdef EXT2FS_DEBUG
 	struct ext2_super_block * es;
-	unsigned long desc_count = 0, bitmap_count = 0;
+	unsigned long bitmap_count = 0;
 	struct buffer_head *bitmap_bh = NULL;
 	int i;
 
 	lock_super (sb);
 	es = EXT2_SB(sb)->s_es;
 	for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
-		struct ext2_group_desc *desc;
 		unsigned x;
 
 		desc = ext2_get_group_desc (sb, i, NULL);
@@ -630,11 +681,18 @@
 	}
 	brelse(bitmap_bh);
 	printk("ext2_count_free_inodes: stored = %lu, computed = %lu, %lu\n",
-		le32_to_cpu(es->s_free_inodes_count), desc_count, bitmap_count);
+		percpu_counter_read(EXT2_SB(sb)->s_freeinodes_counter),
+		desc_count, bitmap_count);
 	unlock_super(sb);
 	return desc_count;
 #else
-	return le32_to_cpu(EXT2_SB(sb)->s_es->s_free_inodes_count);
+	for (i = 0; i < EXT2_SB(sb)->s_groups_count; i++) {
+		desc = ext2_get_group_desc (sb, i, NULL);
+		if (!desc)
+			continue;
+		desc_count += le16_to_cpu(desc->bg_free_inodes_count);
+	}
+	return desc_count;
 #endif
 }
 
@@ -684,7 +742,8 @@
 		bitmap_count += x;
 	}
 	brelse(bitmap_bh);
-	if (le32_to_cpu(es->s_free_inodes_count) != bitmap_count)
+	if (percpu_counter_read(EXT2_SB(sb)->s_freeinodes_counter) !=
+				bitmap_count)
 		ext2_error(sb, "ext2_check_inodes_bitmap",
 			    "Wrong free inodes count in super block, "
 			    "stored = %lu, counted = %lu",
diff -Nru a/fs/ext2/super.c b/fs/ext2/super.c
--- a/fs/ext2/super.c	Sat Apr 19 19:51:49 2003
+++ b/fs/ext2/super.c	Sat Apr 19 19:51:49 2003
@@ -769,6 +769,10 @@
 		printk ("EXT2-fs: not enough memory\n");
 		goto failed_mount;
 	}
+	percpu_counter_init(&sbi->s_freeblocks_counter);
+	percpu_counter_init(&sbi->s_freeinodes_counter);
+	percpu_counter_init(&sbi->s_dirs_counter);
+	bgl_lock_init(&sbi->s_blockgroup_lock);
 	sbi->s_debts = kmalloc(sbi->s_groups_count * sizeof(*sbi->s_debts),
 			       GFP_KERNEL);
 	if (!sbi->s_debts) {
@@ -792,7 +796,6 @@
 		goto failed_mount2;
 	}
 	sbi->s_gdb_count = db_count;
-	sbi->s_dir_count = ext2_count_dirs(sb);
 	get_random_bytes(&sbi->s_next_generation, sizeof(u32));
 	/*
 	 * set up enough so that it can read an inode
@@ -814,6 +817,12 @@
 		ext2_warning(sb, __FUNCTION__,
 			"mounting ext3 filesystem as ext2\n");
 	ext2_setup_super (sb, es, sb->s_flags & MS_RDONLY);
+	percpu_counter_mod(&sbi->s_freeblocks_counter,
+				ext2_count_free_blocks(sb));
+	percpu_counter_mod(&sbi->s_freeinodes_counter,
+				ext2_count_free_inodes(sb));
+	percpu_counter_mod(&sbi->s_dirs_counter,
+				ext2_count_dirs(sb));
 	return 0;
 failed_mount2:
 	for (i = 0; i < db_count; i++)
@@ -840,6 +849,8 @@
 
 static void ext2_sync_super(struct super_block *sb, struct ext2_super_block *es)
 {
+	es->s_free_blocks_count = cpu_to_le32(ext2_count_free_blocks(sb));
+	es->s_free_inodes_count = cpu_to_le32(ext2_count_free_inodes(sb));
 	es->s_wtime = cpu_to_le32(get_seconds());
 	mark_buffer_dirty(EXT2_SB(sb)->s_sbh);
 	sync_dirty_buffer(EXT2_SB(sb)->s_sbh);
@@ -868,6 +879,8 @@
 			ext2_debug ("setting valid to 0\n");
 			es->s_state = cpu_to_le16(le16_to_cpu(es->s_state) &
 						  ~EXT2_VALID_FS);
+			es->s_free_blocks_count = cpu_to_le32(ext2_count_free_blocks(sb));
+			es->s_free_inodes_count = cpu_to_le32(ext2_count_free_inodes(sb));
 			es->s_mtime = cpu_to_le32(get_seconds());
 			ext2_sync_super(sb, es);
 		} else
@@ -965,7 +978,7 @@
 	buf->f_type = EXT2_SUPER_MAGIC;
 	buf->f_bsize = sb->s_blocksize;
 	buf->f_blocks = le32_to_cpu(sbi->s_es->s_blocks_count) - overhead;
-	buf->f_bfree = ext2_count_free_blocks (sb);
+	buf->f_bfree = ext2_count_free_blocks(sb);
 	buf->f_bavail = buf->f_bfree - le32_to_cpu(sbi->s_es->s_r_blocks_count);
 	if (buf->f_bfree < le32_to_cpu(sbi->s_es->s_r_blocks_count))
 		buf->f_bavail = 0;
diff -Nru a/fs/ext2/xattr.c b/fs/ext2/xattr.c
--- a/fs/ext2/xattr.c	Sat Apr 19 19:51:49 2003
+++ b/fs/ext2/xattr.c	Sat Apr 19 19:51:49 2003
@@ -732,7 +732,8 @@
 			 * The old block will be released after updating
 			 * the inode.
 			 */
-			ea_bdebug(new_bh, "reusing block %ld",
+			ea_bdebug(new_bh, "%s block %ld",
+				(old_bh == new_bh) ? "keeping" : "reusing",
 				new_bh->b_blocknr);
 			
 			error = -EDQUOT;
@@ -746,6 +747,7 @@
 		} else if (old_bh && header == HDR(old_bh)) {
 			/* Keep this block. */
 			new_bh = old_bh;
+			get_bh(new_bh);
 			ext2_xattr_cache_insert(new_bh);
 		} else {
 			/* We need to allocate a new block */
@@ -816,8 +818,7 @@
 	}
 
 cleanup:
-	if (old_bh != new_bh)
-		brelse(new_bh);
+	brelse(new_bh);
 
 	return error;
 }
diff -Nru a/fs/ext3/super.c b/fs/ext3/super.c
--- a/fs/ext3/super.c	Sat Apr 19 19:51:50 2003
+++ b/fs/ext3/super.c	Sat Apr 19 19:51:50 2003
@@ -566,6 +566,8 @@
 # define ext3_clear_inode NULL
 #endif
 
+static struct dquot_operations ext3_qops;
+
 static struct super_operations ext3_sops = {
 	.alloc_inode	= ext3_alloc_inode,
 	.destroy_inode	= ext3_destroy_inode,
@@ -1337,6 +1339,7 @@
 	 */
 	sb->s_op = &ext3_sops;
 	sb->s_export_op = &ext3_export_ops;
+	sb->dq_op = &ext3_qops;
 	INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */
 
 	sb->s_root = 0;
@@ -1977,6 +1980,56 @@
 	return 0;
 }
 
+/* Helper function for writing quotas on sync - we need to start transaction before quota file
+ * is locked for write. Otherwise the are possible deadlocks:
+ * Process 1                         Process 2
+ * ext3_create()                     quota_sync()
+ *   journal_start()                   write_dquot()
+ *   DQUOT_INIT()                        down(dqio_sem)
+ *     down(dqio_sem)                    journal_start()
+ *
+ */
+
+#ifdef CONFIG_QUOTA
+
+#define EXT3_OLD_QFMT_BLOCKS 2
+#define EXT3_V0_QFMT_BLOCKS 6
+
+static int (*old_sync_dquot)(struct dquot *dquot);
+
+static int ext3_sync_dquot(struct dquot *dquot)
+{
+	int nblocks, ret;
+	handle_t *handle;
+	struct quota_info *dqops = sb_dqopt(dquot->dq_sb);
+	struct inode *qinode;
+
+	switch (dqops->info[dquot->dq_type].dqi_format->qf_fmt_id) {
+		case QFMT_VFS_OLD:
+			nblocks = EXT3_OLD_QFMT_BLOCKS;
+			break;
+		case QFMT_VFS_V0:
+			nblocks = EXT3_V0_QFMT_BLOCKS;
+			break;
+		default:
+			nblocks = EXT3_MAX_TRANS_DATA;
+	}
+	lock_kernel();
+	qinode = dqops->files[dquot->dq_type]->f_dentry->d_inode;
+	handle = ext3_journal_start(qinode, nblocks);
+	if (IS_ERR(handle)) {
+		unlock_kernel();
+		return PTR_ERR(handle);
+	}
+	unlock_kernel();
+	ret = old_sync_dquot(dquot);
+	lock_kernel();
+	ret = ext3_journal_stop(handle);
+	unlock_kernel();
+	return ret;
+}
+#endif
+
 static struct super_block *ext3_get_sb(struct file_system_type *fs_type,
 	int flags, char *dev_name, void *data)
 {
@@ -1999,6 +2052,11 @@
 	err = init_inodecache();
 	if (err)
 		goto out1;
+#ifdef CONFIG_QUOTA
+	init_dquot_operations(&ext3_qops);
+	old_sync_dquot = ext3_qops.sync_dquot;
+	ext3_qops.sync_dquot = ext3_sync_dquot;
+#endif
         err = register_filesystem(&ext3_fs_type);
 	if (err)
 		goto out;
diff -Nru a/fs/ext3/xattr.c b/fs/ext3/xattr.c
--- a/fs/ext3/xattr.c	Sat Apr 19 19:51:48 2003
+++ b/fs/ext3/xattr.c	Sat Apr 19 19:51:48 2003
@@ -733,7 +733,8 @@
 			 * The old block will be released after updating
 			 * the inode.
 			 */
-			ea_bdebug(new_bh, "reusing block %ld",
+			ea_bdebug(new_bh, "%s block %ld",
+				(old_bh == new_bh) ? "keeping" : "reusing",
 				new_bh->b_blocknr);
 			
 			error = -EDQUOT;
@@ -750,6 +751,7 @@
 		} else if (old_bh && header == HDR(old_bh)) {
 			/* Keep this block. */
 			new_bh = old_bh;
+			get_bh(new_bh);
 			ext3_xattr_cache_insert(new_bh);
 		} else {
 			/* We need to allocate a new block */
@@ -827,8 +829,7 @@
 	}
 
 cleanup:
-	if (old_bh != new_bh)
-		brelse(new_bh);
+	brelse(new_bh);
 
 	return error;
 }
diff -Nru a/fs/fcntl.c b/fs/fcntl.c
--- a/fs/fcntl.c	Sat Apr 19 19:51:49 2003
+++ b/fs/fcntl.c	Sat Apr 19 19:51:49 2003
@@ -23,21 +23,21 @@
 void set_close_on_exec(unsigned int fd, int flag)
 {
 	struct files_struct *files = current->files;
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	if (flag)
 		FD_SET(fd, files->close_on_exec);
 	else
 		FD_CLR(fd, files->close_on_exec);
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 }
 
 static inline int get_close_on_exec(unsigned int fd)
 {
 	struct files_struct *files = current->files;
 	int res;
-	read_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	res = FD_ISSET(fd, files->close_on_exec);
-	read_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	return res;
 }
 
@@ -134,15 +134,15 @@
 	struct files_struct * files = current->files;
 	int fd;
 
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	fd = locate_fd(files, file, start);
 	if (fd >= 0) {
 		FD_SET(fd, files->open_fds);
 		FD_CLR(fd, files->close_on_exec);
-		write_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 		fd_install(fd, file);
 	} else {
-		write_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 		fput(file);
 	}
 
@@ -155,7 +155,7 @@
 	struct file * file, *tofree;
 	struct files_struct * files = current->files;
 
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	if (!(file = fcheck(oldfd)))
 		goto out_unlock;
 	err = newfd;
@@ -186,7 +186,7 @@
 	files->fd[newfd] = file;
 	FD_SET(newfd, files->open_fds);
 	FD_CLR(newfd, files->close_on_exec);
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 
 	if (tofree)
 		filp_close(tofree, files);
@@ -194,11 +194,11 @@
 out:
 	return err;
 out_unlock:
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	goto out;
 
 out_fput:
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	fput(file);
 	goto out;
 }
diff -Nru a/fs/file.c b/fs/file.c
--- a/fs/file.c	Sat Apr 19 19:51:28 2003
+++ b/fs/file.c	Sat Apr 19 19:51:28 2003
@@ -65,7 +65,7 @@
 		goto out;
 
 	nfds = files->max_fds;
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 
 	/* 
 	 * Expand to the max in easy steps, and keep expanding it until
@@ -89,7 +89,7 @@
 
 	error = -ENOMEM;
 	new_fds = alloc_fd_array(nfds);
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	if (!new_fds)
 		goto out;
 
@@ -110,15 +110,15 @@
 			memset(&new_fds[i], 0,
 			       (nfds-i) * sizeof(struct file *)); 
 
-			write_unlock(&files->file_lock);
+			spin_unlock(&files->file_lock);
 			free_fd_array(old_fds, i);
-			write_lock(&files->file_lock);
+			spin_lock(&files->file_lock);
 		}
 	} else {
 		/* Somebody expanded the array while we slept ... */
-		write_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 		free_fd_array(new_fds, nfds);
-		write_lock(&files->file_lock);
+		spin_lock(&files->file_lock);
 	}
 	error = 0;
 out:
@@ -167,7 +167,7 @@
 		goto out;
 
 	nfds = files->max_fdset;
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 
 	/* Expand to the max in easy steps */
 	do {
@@ -183,7 +183,7 @@
 	error = -ENOMEM;
 	new_openset = alloc_fdset(nfds);
 	new_execset = alloc_fdset(nfds);
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	if (!new_openset || !new_execset)
 		goto out;
 
@@ -208,21 +208,21 @@
 		nfds = xchg(&files->max_fdset, nfds);
 		new_openset = xchg(&files->open_fds, new_openset);
 		new_execset = xchg(&files->close_on_exec, new_execset);
-		write_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 		free_fdset (new_openset, nfds);
 		free_fdset (new_execset, nfds);
-		write_lock(&files->file_lock);
+		spin_lock(&files->file_lock);
 		return 0;
 	} 
 	/* Somebody expanded the array while we slept ... */
 
 out:
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	if (new_openset)
 		free_fdset(new_openset, nfds);
 	if (new_execset)
 		free_fdset(new_execset, nfds);
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	return error;
 }
 
diff -Nru a/fs/file_table.c b/fs/file_table.c
--- a/fs/file_table.c	Sat Apr 19 19:51:28 2003
+++ b/fs/file_table.c	Sat Apr 19 19:51:28 2003
@@ -182,11 +182,11 @@
 	struct file *file;
 	struct files_struct *files = current->files;
 
-	read_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	file = fcheck(fd);
 	if (file)
 		get_file(file);
-	read_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	return file;
 }
 
diff -Nru a/fs/filesystems.c b/fs/filesystems.c
--- a/fs/filesystems.c	Sat Apr 19 19:51:50 2003
+++ b/fs/filesystems.c	Sat Apr 19 19:51:50 2003
@@ -61,7 +61,7 @@
 
 
 /* define fs_subsys */
-static decl_subsys(fs, NULL);
+static decl_subsys(fs, NULL, NULL);
 
 static int register_fs_subsys(struct file_system_type * fs)
 {
diff -Nru a/fs/fs-writeback.c b/fs/fs-writeback.c
--- a/fs/fs-writeback.c	Sat Apr 19 19:51:51 2003
+++ b/fs/fs-writeback.c	Sat Apr 19 19:51:51 2003
@@ -149,10 +149,10 @@
 	 * read speculatively by this cpu before &= ~I_DIRTY  -- mikulas
 	 */
 
-	write_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	if (wait || !wbc->for_kupdate || list_empty(&mapping->io_pages))
 		list_splice_init(&mapping->dirty_pages, &mapping->io_pages);
-	write_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	spin_unlock(&inode_lock);
 
 	do_writepages(mapping, wbc);
diff -Nru a/fs/inode.c b/fs/inode.c
--- a/fs/inode.c	Sat Apr 19 19:51:51 2003
+++ b/fs/inode.c	Sat Apr 19 19:51:51 2003
@@ -181,7 +181,7 @@
 	INIT_LIST_HEAD(&inode->i_devices);
 	sema_init(&inode->i_sem, 1);
 	INIT_RADIX_TREE(&inode->i_data.page_tree, GFP_ATOMIC);
-	rwlock_init(&inode->i_data.page_lock);
+	spin_lock_init(&inode->i_data.page_lock);
 	init_MUTEX(&inode->i_data.i_shared_sem);
 	INIT_LIST_HEAD(&inode->i_data.private_list);
 	spin_lock_init(&inode->i_data.private_lock);
diff -Nru a/fs/mpage.c b/fs/mpage.c
--- a/fs/mpage.c	Sat Apr 19 19:51:29 2003
+++ b/fs/mpage.c	Sat Apr 19 19:51:29 2003
@@ -627,7 +627,7 @@
 		writepage = mapping->a_ops->writepage;
 
 	pagevec_init(&pvec, 0);
-	write_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	while (!list_empty(&mapping->io_pages) && !done) {
 		struct page *page = list_entry(mapping->io_pages.prev,
 					struct page, list);
@@ -647,7 +647,7 @@
 		list_add(&page->list, &mapping->locked_pages);
 
 		page_cache_get(page);
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 
 		/*
 		 * At this point we hold neither mapping->page_lock nor
@@ -679,12 +679,12 @@
 			unlock_page(page);
 		}
 		page_cache_release(page);
-		write_lock(&mapping->page_lock);
+		spin_lock(&mapping->page_lock);
 	}
 	/*
 	 * Leave any remaining dirty pages on ->io_pages
 	 */
-	write_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	if (bio)
 		mpage_bio_submit(WRITE, bio);
 	return ret;
diff -Nru a/fs/namei.c b/fs/namei.c
--- a/fs/namei.c	Sat Apr 19 19:51:46 2003
+++ b/fs/namei.c	Sat Apr 19 19:51:46 2003
@@ -108,7 +108,7 @@
  * POSIX.1 2.4: an empty pathname is invalid (ENOENT).
  * PATH_MAX includes the nul terminator --RR.
  */
-static inline int do_getname(const char *filename, char *page)
+static inline int do_getname(const char __user *filename, char *page)
 {
 	int retval;
 	unsigned long len = PATH_MAX;
@@ -129,7 +129,7 @@
 	return retval;
 }
 
-char * getname(const char * filename)
+char * getname(const char __user * filename)
 {
 	char *tmp, *result;
 
@@ -847,6 +847,7 @@
 			read_unlock(&current->fs->lock);
 			if (__emul_lookup_dentry(name,nd))
 				return 0;
+			read_lock(&current->fs->lock);
 		}
 		nd->mnt = mntget(current->fs->rootmnt);
 		nd->dentry = dget(current->fs->root);
@@ -941,7 +942,7 @@
  * that namei follows links, while lnamei does not.
  * SMP-safe
  */
-int __user_walk(const char *name, unsigned flags, struct nameidata *nd)
+int __user_walk(const char __user *name, unsigned flags, struct nameidata *nd)
 {
 	char *tmp = getname(name);
 	int err = PTR_ERR(tmp);
@@ -1402,7 +1403,7 @@
 	return error;
 }
 
-asmlinkage long sys_mknod(const char * filename, int mode, dev_t dev)
+asmlinkage long sys_mknod(const char __user * filename, int mode, dev_t dev)
 {
 	int error = 0;
 	char * tmp;
@@ -1471,7 +1472,7 @@
 	return error;
 }
 
-asmlinkage long sys_mkdir(const char * pathname, int mode)
+asmlinkage long sys_mkdir(const char __user * pathname, int mode)
 {
 	int error = 0;
 	char * tmp;
@@ -1568,7 +1569,7 @@
 	return error;
 }
 
-asmlinkage long sys_rmdir(const char * pathname)
+asmlinkage long sys_rmdir(const char __user * pathname)
 {
 	int error = 0;
 	char * name;
@@ -1643,7 +1644,7 @@
  * writeout happening, and we don't want to prevent access to the directory
  * while waiting on the I/O.
  */
-asmlinkage long sys_unlink(const char * pathname)
+asmlinkage long sys_unlink(const char __user * pathname)
 {
 	int error = 0;
 	char * name;
@@ -1714,7 +1715,7 @@
 	return error;
 }
 
-asmlinkage long sys_symlink(const char * oldname, const char * newname)
+asmlinkage long sys_symlink(const char __user * oldname, const char __user * newname)
 {
 	int error = 0;
 	char * from;
@@ -1796,7 +1797,7 @@
  * with linux 2.0, and to avoid hard-linking to directories
  * and other special files.  --ADM
  */
-asmlinkage long sys_link(const char * oldname, const char * newname)
+asmlinkage long sys_link(const char __user * oldname, const char __user * newname)
 {
 	struct dentry *new_dentry;
 	struct nameidata nd, old_nd;
@@ -2057,7 +2058,7 @@
 	return error;
 }
 
-asmlinkage long sys_rename(const char * oldname, const char * newname)
+asmlinkage long sys_rename(const char __user * oldname, const char __user * newname)
 {
 	int error;
 	char * from;
@@ -2076,7 +2077,7 @@
 	return error;
 }
 
-int vfs_readlink(struct dentry *dentry, char *buffer, int buflen, const char *link)
+int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen, const char *link)
 {
 	int len;
 
@@ -2157,7 +2158,7 @@
 	return (char*)page;
 }
 
-int page_readlink(struct dentry *dentry, char *buffer, int buflen)
+int page_readlink(struct dentry *dentry, char __user *buffer, int buflen)
 {
 	struct page *page = NULL;
 	char *s = page_getlink(dentry, &page);
diff -Nru a/fs/namespace.c b/fs/namespace.c
--- a/fs/namespace.c	Sat Apr 19 19:51:49 2003
+++ b/fs/namespace.c	Sat Apr 19 19:51:49 2003
@@ -52,7 +52,7 @@
 		INIT_LIST_HEAD(&mnt->mnt_list);
 		if (name) {
 			int size = strlen(name)+1;
-			char * newname = kmalloc(size, GFP_KERNEL);
+			char *newname = kmalloc(size, GFP_KERNEL);
 			if (newname) {
 				memcpy(newname, name, size);
 				mnt->mnt_devname = newname;
@@ -367,7 +367,7 @@
  * unixes. Our API is identical to OSF/1 to avoid making a mess of AMD
  */
 
-asmlinkage long sys_umount(char * name, int flags)
+asmlinkage long sys_umount(char __user * name, int flags)
 {
 	struct nameidata nd;
 	int retval;
@@ -396,7 +396,7 @@
  *	The 2.0 compatible umount. No flags. 
  */
  
-asmlinkage long sys_oldumount(char * name)
+asmlinkage long sys_oldumount(char __user * name)
 {
 	return sys_umount(name,0);
 }
@@ -664,7 +664,7 @@
 	return err;
 }
 
-static int copy_mount_options (const void *data, unsigned long *where)
+static int copy_mount_options (const void __user *data, unsigned long *where)
 {
 	int i;
 	unsigned long page;
@@ -774,7 +774,7 @@
 
 	get_namespace(namespace);
 
-	if (! (flags & CLONE_NEWNS))
+	if (!(flags & CLONE_NEWNS))
 		return 0;
 
 	if (!capable(CAP_SYS_ADMIN)) {
@@ -782,7 +782,7 @@
 		return -EPERM;
 	}
 
-	new_ns = kmalloc(sizeof(struct namespace *), GFP_KERNEL);
+	new_ns = kmalloc(sizeof(struct namespace), GFP_KERNEL);
 	if (!new_ns)
 		goto out;
 
@@ -842,8 +842,9 @@
 	return -ENOMEM;
 }
 
-asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type,
-			  unsigned long flags, void * data)
+asmlinkage long sys_mount(char __user * dev_name, char __user * dir_name,
+			  char __user * type, unsigned long flags,
+			  void __user * data)
 {
 	int retval;
 	unsigned long data_page;
@@ -963,7 +964,7 @@
  *    first.
  */
 
-asmlinkage long sys_pivot_root(const char *new_root, const char *put_old)
+asmlinkage long sys_pivot_root(const char __user *new_root, const char __user *put_old)
 {
 	struct vfsmount *tmp;
 	struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd;
diff -Nru a/fs/nfs/Makefile b/fs/nfs/Makefile
--- a/fs/nfs/Makefile	Sat Apr 19 19:51:28 2003
+++ b/fs/nfs/Makefile	Sat Apr 19 19:51:28 2003
@@ -8,6 +8,7 @@
 			   proc.o read.o symlink.o unlink.o write.o
 nfs-$(CONFIG_ROOT_NFS)	+= nfsroot.o mount_clnt.o      
 nfs-$(CONFIG_NFS_V3)	+= nfs3proc.o nfs3xdr.o
-nfs-$(CONFIG_NFS_V4)	+= nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o
+nfs-$(CONFIG_NFS_V4)	+= nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o \
+			   idmap.o
 nfs-$(CONFIG_NFS_DIRECTIO) += direct.o
 nfs-objs		:= $(nfs-y)
diff -Nru a/fs/nfs/dir.c b/fs/nfs/dir.c
--- a/fs/nfs/dir.c	Sat Apr 19 19:51:47 2003
+++ b/fs/nfs/dir.c	Sat Apr 19 19:51:47 2003
@@ -35,6 +35,7 @@
 #define NFS_PARANOIA 1
 /* #define NFS_DEBUG_VERBOSE 1 */
 
+static int nfs_opendir(struct inode *, struct file *);
 static int nfs_readdir(struct file *, void *, filldir_t);
 static struct dentry *nfs_lookup(struct inode *, struct dentry *);
 static int nfs_cached_lookup(struct inode *, struct dentry *,
@@ -52,7 +53,7 @@
 struct file_operations nfs_dir_operations = {
 	.read		= generic_read_dir,
 	.readdir	= nfs_readdir,
-	.open		= nfs_open,
+	.open		= nfs_opendir,
 	.release	= nfs_release,
 };
 
@@ -71,6 +72,26 @@
 	.setattr	= nfs_setattr,
 };
 
+/*
+ * Open file
+ */
+static int
+nfs_opendir(struct inode *inode, struct file *filp)
+{
+	struct nfs_server *server = NFS_SERVER(inode);
+	int res = 0;
+
+	lock_kernel();
+	/* Do cto revalidation */
+	if (server->flags & NFS_MOUNT_NOCTO)
+		res = __nfs_revalidate_inode(server, inode);
+	/* Call generic open code in order to cache credentials */
+	if (!res)
+		res = nfs_open(inode, filp);
+	unlock_kernel();
+	return res;
+}
+
 typedef u32 * (*decode_dirent_t)(u32 *, struct nfs_entry *, int);
 typedef struct {
 	struct file	*file;
@@ -715,9 +736,10 @@
 
 		res = -EIO;
 		if (PageUptodate(page)) {
-			desc.ptr = kmap_atomic(page, KM_USER0);
+			void * kaddr = kmap_atomic(page, KM_USER0);
+			desc.ptr = kaddr;
 			res = find_dirent_name(&desc, page, dentry);
-			kunmap_atomic(desc.ptr, KM_USER0);
+			kunmap_atomic(kaddr, KM_USER0);
 		}
 		page_cache_release(page);
 
diff -Nru a/fs/nfs/file.c b/fs/nfs/file.c
--- a/fs/nfs/file.c	Sat Apr 19 19:51:49 2003
+++ b/fs/nfs/file.c	Sat Apr 19 19:51:49 2003
@@ -34,6 +34,7 @@
 
 #define NFSDBG_FACILITY		NFSDBG_FILE
 
+static int nfs_file_open(struct inode *, struct file *);
 static int  nfs_file_mmap(struct file *, struct vm_area_struct *);
 static ssize_t nfs_file_sendfile(struct file *, loff_t *, size_t, read_actor_t, void *);
 static ssize_t nfs_file_read(struct kiocb *, char *, size_t, loff_t);
@@ -48,7 +49,7 @@
 	.aio_read		= nfs_file_read,
 	.aio_write		= nfs_file_write,
 	.mmap		= nfs_file_mmap,
-	.open		= nfs_open,
+	.open		= nfs_file_open,
 	.flush		= nfs_file_flush,
 	.release	= nfs_release,
 	.fsync		= nfs_fsync,
@@ -66,6 +67,30 @@
 #ifndef IS_SWAPFILE
 # define IS_SWAPFILE(inode)	(0)
 #endif
+
+/*
+ * Open file
+ */
+static int
+nfs_file_open(struct inode *inode, struct file *filp)
+{
+	struct nfs_server *server = NFS_SERVER(inode);
+	int (*open)(struct inode *, struct file *);
+	int res = 0;
+
+	lock_kernel();
+	/* Do NFSv4 open() call */
+	if ((open = server->rpc_ops->file_open) != NULL)
+		res = open(inode, filp);
+	/* Do cto revalidation */
+	else if (server->flags & NFS_MOUNT_NOCTO)
+		res = __nfs_revalidate_inode(server, inode);
+	/* Call generic open code in order to cache credentials */
+	if (!res)
+		res = nfs_open(inode, filp);
+	unlock_kernel();
+	return res;
+}
 
 /*
  * Flush all dirty pages, and check for write errors.
diff -Nru a/fs/nfs/idmap.c b/fs/nfs/idmap.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/fs/nfs/idmap.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,474 @@
+/*
+ * fs/nfs/idmap.c
+ *
+ *  UID and GID to name mapping for clients.
+ *
+ *  Copyright (c) 2002 The Regents of the University of Michigan.
+ *  All rights reserved.
+ *
+ *  Marius Aamodt Eriksen <marius@umich.edu>
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. Neither the name of the University nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/slab.h>
+#include <linux/socket.h>
+#include <linux/in.h>
+#include <linux/sched.h>
+
+#include <linux/sunrpc/clnt.h>
+#include <linux/sunrpc/rpc_pipe_fs.h>
+
+#include <linux/nfs_fs_sb.h>
+#include <linux/nfs_fs.h>
+
+#include <linux/nfs_idmap.h>
+
+#define IDMAP_HASH_SZ          128
+#define IDMAP_HASH_TYPE_NAME   0x01
+#define IDMAP_HASH_TYPE_ID     0x02
+#define IDMAP_HASH_TYPE_INSERT 0x04
+
+struct idmap_hashent {
+	uid_t     ih_id;
+	char      ih_name[IDMAP_NAMESZ];
+	u_int32_t ih_namelen;
+};
+
+struct idmap {
+	char                  idmap_path[48];
+	struct dentry        *idmap_dentry;
+	wait_queue_head_t     idmap_wq;
+	struct idmap_msg      idmap_im;
+	struct nfs_server    *idmap_server;
+	struct semaphore      idmap_lock;
+	struct semaphore      idmap_im_lock;
+	struct semaphore      idmap_hash_lock;
+	struct idmap_hashent  idmap_id_hash[IDMAP_HASH_SZ];
+	struct idmap_hashent  idmap_name_hash[IDMAP_HASH_SZ];
+};
+
+static ssize_t   idmap_pipe_upcall(struct file *, struct rpc_pipe_msg *, char *,
+                     size_t);
+static ssize_t   idmap_pipe_downcall(struct file *, const char *, size_t);
+void             idmap_pipe_destroy_msg(struct rpc_pipe_msg *);
+
+static int       validate_ascii(char *, u_int32_t);
+
+static u_int32_t fnvhash32(void *, u_int32_t);
+static int       idmap_cache_lookup(struct idmap *, int, char *, u_int32_t *, uid_t *);
+
+static struct rpc_pipe_ops idmap_upcall_ops = {
+        .upcall         = idmap_pipe_upcall,
+        .downcall       = idmap_pipe_downcall,
+        .destroy_msg    = idmap_pipe_destroy_msg,
+};
+
+void *
+nfs_idmap_new(struct nfs_server *server)
+{
+	struct idmap *idmap;
+
+        if ((idmap = kmalloc(sizeof(*idmap), GFP_KERNEL)) == NULL)
+                return (NULL);
+
+	memset(idmap, 0, sizeof(*idmap));
+
+	idmap->idmap_server = server;
+
+	snprintf(idmap->idmap_path, sizeof(idmap->idmap_path),
+	    "%s/idmap", idmap->idmap_server->client->cl_pathname);
+
+        idmap->idmap_dentry = rpc_mkpipe(idmap->idmap_path,
+	    idmap->idmap_server, &idmap_upcall_ops);
+        if (IS_ERR(idmap->idmap_dentry))
+		goto err_free;
+
+        init_MUTEX(&idmap->idmap_lock);
+        init_MUTEX(&idmap->idmap_im_lock);
+        init_MUTEX(&idmap->idmap_hash_lock);
+
+	return (idmap);
+
+ err_free:
+	kfree(idmap);
+	return (NULL);
+}
+
+void
+nfs_idmap_delete(struct nfs_server *server)
+{
+	struct idmap *idmap = server->idmap;
+
+	rpc_unlink(idmap->idmap_path);
+	kfree(idmap);
+}
+
+/*
+ * Name -> ID
+ */
+int
+nfs_idmap_id(struct nfs_server *server, u_int8_t type, char *name, 
+    u_int namelen, uid_t *id)
+{
+	struct rpc_pipe_msg msg;
+	struct idmap *idmap = server->idmap;
+	struct idmap_msg *im;
+	DECLARE_WAITQUEUE(wq, current);
+	int ret = -1, hashtype = IDMAP_HASH_TYPE_NAME, xnamelen = namelen;
+
+	if (idmap == NULL)
+		return (-1);
+
+	im = &idmap->idmap_im;
+
+	if (namelen > IDMAP_NAMESZ || namelen == 0)
+		return (-1);
+
+	down(&idmap->idmap_lock);
+	down(&idmap->idmap_im_lock);
+
+	if (name[xnamelen - 1] == '\0')
+		xnamelen--;
+
+	if (idmap_cache_lookup(idmap, hashtype, name, &xnamelen, id) == 0) {
+		ret = 0;
+		goto out;
+	}
+
+	memset(im, 0, sizeof(*im));
+	memcpy(im->im_name, name, namelen);
+	/* Make sure the string is NULL terminated */
+	if (namelen != xnamelen) {
+		/* We cannot fit a NULL character */
+		if (namelen == IDMAP_NAMESZ) {
+			ret = -1;
+			goto out;
+		}
+		im->im_name[namelen] = '\0';
+	} 
+
+	im->im_type = type;
+	im->im_conv = IDMAP_CONV_NAMETOID;
+
+	memset(&msg, 0, sizeof(msg));
+	msg.data = im;
+	msg.len = sizeof(*im);
+
+	init_waitqueue_head(&idmap->idmap_wq);
+	add_wait_queue(&idmap->idmap_wq, &wq);
+	set_current_state(TASK_UNINTERRUPTIBLE);
+
+	if (rpc_queue_upcall(idmap->idmap_dentry->d_inode, &msg) < 0) {
+		set_current_state(TASK_RUNNING);
+		goto out;
+	}
+
+	up(&idmap->idmap_im_lock);
+	schedule();
+	down(&idmap->idmap_im_lock);
+
+	/*
+	 * XXX Race condition here, with testing for status.  Go ahead
+	 * and and do the cace lookup anyway.
+	 */
+	if (im->im_status & IDMAP_STATUS_SUCCESS) {
+		ret = 0;
+		*id = im->im_id;
+
+		hashtype |= IDMAP_HASH_TYPE_INSERT;
+		ret = idmap_cache_lookup(idmap, hashtype, name, &xnamelen, id);
+	}
+
+ out:
+	memset(im, 0, sizeof(*im));
+	up(&idmap->idmap_im_lock);
+	up(&idmap->idmap_lock);
+	return (ret);
+}
+
+/*
+ * ID -> Name
+ */
+int
+nfs_idmap_name(struct nfs_server *server, u_int8_t type, uid_t id,
+    char *name, u_int *namelen)
+{
+	struct rpc_pipe_msg msg;
+	struct idmap *idmap = server->idmap;
+	struct idmap_msg *im;
+	DECLARE_WAITQUEUE(wq, current);
+	int ret = -1, hashtype = IDMAP_HASH_TYPE_ID;
+	u_int len;
+
+	if (idmap == NULL)
+		return (-1);
+
+	im = &idmap->idmap_im;
+
+	if (*namelen < IDMAP_NAMESZ || *namelen == 0)
+		return (-1);
+
+	down(&idmap->idmap_lock);
+	down(&idmap->idmap_im_lock);
+
+	if (idmap_cache_lookup(idmap, hashtype, name, namelen, &id) == 0) {
+		ret = 0;
+		goto out;
+	}
+
+	memset(im, 0, sizeof(*im));
+	im->im_type = type;
+	im->im_conv = IDMAP_CONV_IDTONAME;
+	im->im_id = id;
+
+	memset(&msg, 0, sizeof(msg));
+	msg.data = im;
+	msg.len = sizeof(*im);
+
+	init_waitqueue_head(&idmap->idmap_wq);
+	add_wait_queue(&idmap->idmap_wq, &wq);
+	set_current_state(TASK_UNINTERRUPTIBLE);
+
+	if (rpc_queue_upcall(idmap->idmap_dentry->d_inode, &msg) < 0) {
+		set_current_state(TASK_RUNNING);
+		goto out;
+	}
+
+	/*
+	 * XXX add timeouts here
+	 */
+	up(&idmap->idmap_im_lock);
+	schedule();
+	down(&idmap->idmap_im_lock);
+
+	if (im->im_status & IDMAP_STATUS_SUCCESS) {
+		if ((len = validate_ascii(im->im_name, IDMAP_NAMESZ)) == -1)
+			goto out;
+		ret = 0;
+		memcpy(name, im->im_name, len);
+		*namelen = len;
+
+		hashtype |= IDMAP_HASH_TYPE_INSERT;
+		ret = idmap_cache_lookup(idmap, hashtype, name, namelen, &id);
+	}
+
+ out:
+	memset(im, 0, sizeof(*im));
+	up(&idmap->idmap_im_lock);
+	up(&idmap->idmap_lock);
+	return (ret);
+}
+
+static ssize_t
+idmap_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg,
+    char *dst, size_t buflen)
+{
+        char *data = (char *)msg->data + msg->copied;
+        ssize_t mlen = msg->len - msg->copied;
+        ssize_t left;
+
+        if (mlen > buflen)
+                mlen = buflen;
+
+        left = copy_to_user(dst, data, mlen);
+
+        return (mlen - left);
+}
+
+static ssize_t
+idmap_pipe_downcall(struct file *filp, const char *src, size_t mlen)
+{
+        struct rpc_inode *rpci = RPC_I(filp->f_dentry->d_inode);
+	struct nfs_server *server = rpci->private;
+	struct idmap *idmap = server->idmap;
+	struct idmap_msg im_in, *im = &idmap->idmap_im;
+	int match = 0, hashtype, badmsg = 0, namelen_in, namelen;
+
+        if (mlen != sizeof(im_in))
+                return (-ENOSPC);
+
+        if (copy_from_user(&im_in, src, mlen) != 0)
+		return (-EFAULT);
+
+	down(&idmap->idmap_im_lock);
+
+	namelen_in = validate_ascii(im_in.im_name, IDMAP_NAMESZ);
+	namelen = validate_ascii(im->im_name, IDMAP_NAMESZ);
+
+	badmsg = !(im_in.im_status & IDMAP_STATUS_SUCCESS) || namelen_in <= 0;
+
+	switch (im_in.im_conv) {
+	case IDMAP_CONV_IDTONAME:
+		match = im->im_id == im_in.im_id;
+		break;
+	case IDMAP_CONV_NAMETOID:
+		match = namelen == namelen_in &&
+		    memcmp(im->im_name, im_in.im_name, namelen) == 0;
+		break;
+	default:
+		badmsg = 1;
+		break;
+	}
+
+	match = match && im->im_type == im_in.im_type;
+
+	if (match) {
+		memcpy(im, &im_in, sizeof(*im));
+		wake_up(&idmap->idmap_wq);
+		__rpc_purge_current_upcall(filp);
+	} else if (!badmsg) {
+		hashtype = im_in.im_conv == IDMAP_CONV_IDTONAME ?
+		    IDMAP_HASH_TYPE_ID : IDMAP_HASH_TYPE_NAME;
+		hashtype |= IDMAP_HASH_TYPE_INSERT;
+		idmap_cache_lookup(idmap, hashtype, im_in.im_name, &namelen_in,
+		    &im_in.im_id);
+	}
+
+	up(&idmap->idmap_im_lock);
+	return (mlen);
+}
+
+void
+idmap_pipe_destroy_msg(struct rpc_pipe_msg *msg)
+{
+	struct idmap_msg *im = msg->data;
+	struct idmap *idmap = container_of(im, struct idmap, idmap_im); 
+
+	down(&idmap->idmap_im_lock);
+	im->im_status = IDMAP_STATUS_LOOKUPFAIL;
+	wake_up(&idmap->idmap_wq);
+	up(&idmap->idmap_im_lock);
+}
+
+static int
+validate_ascii(char *string, u_int32_t len)
+{
+	int i;
+
+	for (i = 0; i < len; i++) {
+		if (string[i] == '\0')
+			break;
+
+		if (string[i] & 0x80)
+			return (-1);
+	}
+
+	if (string[i] != '\0')
+		return (-1);
+
+	return (i);
+}
+
+/* 
+ * Fowler/Noll/Vo hash
+ *    http://www.isthe.com/chongo/tech/comp/fnv/
+ */
+
+#define FNV_P_32 ((u_int32_t)0x01000193) /* 16777619 */
+#define FNV_1_32 ((u_int32_t)0x811c9dc5) /* 2166136261 */
+
+static u_int32_t
+fnvhash32(void *buf, u_int32_t buflen)
+{
+	u_char *p, *end = (u_char *)buf + buflen;
+	u_int32_t hash = FNV_1_32;
+
+	for (p = buf; p < end; p++) {
+		hash *= FNV_P_32;
+		hash ^= (u_int32_t)*p;
+	}
+
+	return (hash);
+}
+
+/*
+ * ->ih_namelen == 0 indicates negative entry
+ */
+static int
+idmap_cache_lookup(struct idmap *idmap, int type, char *name, u_int32_t *namelen,
+    uid_t *id)
+{
+	u_int32_t hash;
+	struct idmap_hashent *he = NULL;
+	int insert = type & IDMAP_HASH_TYPE_INSERT;
+	int ret = -1;
+
+	/*
+	 * XXX technically, this is not needed, since we will always
+	 * hold idmap_im_lock when altering the hash tables.  but
+	 * semantically that just hurts.
+	 *
+	 * XXX cache negative responses
+	 */
+	down(&idmap->idmap_hash_lock);
+
+	if (*namelen > IDMAP_NAMESZ || *namelen == 0)
+		goto out;
+
+	if (type & IDMAP_HASH_TYPE_NAME) {
+		hash = fnvhash32(name, *namelen) % IDMAP_HASH_SZ;
+		he = &idmap->idmap_name_hash[hash];
+
+		/*
+		 * Testing he->ih_namelen == *namelen implicitly tests
+		 * namelen != 0, and thus a non-negative entry.
+		 */
+		if (!insert && he->ih_namelen == *namelen && 
+		    memcmp(he->ih_name, name, *namelen) == 0) {
+			*id = he->ih_id;
+			ret = 0;
+			goto out;
+		}
+	}
+
+	if (type & IDMAP_HASH_TYPE_ID) {
+		hash = fnvhash32(id, sizeof(*id)) % IDMAP_HASH_SZ;
+		he = &idmap->idmap_id_hash[hash];
+
+		if (!insert && *id == he->ih_id && he->ih_namelen != 0 && 
+		    *namelen >= he->ih_namelen) {
+			memcpy(name, he->ih_name, he->ih_namelen);
+			*namelen = he->ih_namelen;
+			ret = 0;
+			goto out;
+		}
+	}
+
+	if (insert && he != NULL) {
+		he->ih_id = *id;
+		memcpy(he->ih_name, name, *namelen);
+		he->ih_namelen = *namelen;
+		ret = 0;
+	}
+
+ out:
+	up(&idmap->idmap_hash_lock);
+	return (ret);
+}
diff -Nru a/fs/nfs/inode.c b/fs/nfs/inode.c
--- a/fs/nfs/inode.c	Sat Apr 19 19:51:50 2003
+++ b/fs/nfs/inode.c	Sat Apr 19 19:51:50 2003
@@ -33,6 +33,7 @@
 #include <linux/smp_lock.h>
 #include <linux/seq_file.h>
 #include <linux/mount.h>
+#include <linux/nfs_idmap.h>
 #include <linux/vfs.h>
 
 #include <asm/system.h>
@@ -140,6 +141,10 @@
 	cred = nfsi->cache_access.cred;
 	if (cred)
 		put_rpccred(cred);
+	/* Clean up the V4 state */
+	nfs4_put_shareowner(inode, nfsi->wo_owner);
+	nfs4_put_shareowner(inode, nfsi->ro_owner);
+	nfs4_put_shareowner(inode, nfsi->rw_owner);
 }
 
 void
@@ -148,6 +153,11 @@
 	struct nfs_server *server = NFS_SB(sb);
 	struct rpc_clnt	*rpc;
 
+#ifdef CONFIG_NFS_V4
+	if (server->idmap != NULL)
+		nfs_idmap_delete(server);
+#endif /* CONFIG_NFS_V4 */
+
 	if ((rpc = server->client) != NULL)
 		rpc_shutdown_client(rpc);
 
@@ -156,6 +166,7 @@
 	rpciod_down();		/* release rpciod */
 
 	destroy_nfsv4_state(server);
+
 	kfree(server->hostname);
 }
 
@@ -855,23 +866,13 @@
 {
 	struct rpc_auth *auth;
 	struct rpc_cred *cred;
-	int err = 0;
 
-	lock_kernel();
-	/* Ensure that we revalidate the data cache */
-	if (NFS_SERVER(inode)->flags & NFS_MOUNT_NOCTO) {
-		err = __nfs_revalidate_inode(NFS_SERVER(inode),inode);
-		if (err)
-			goto out;
-	}
 	auth = NFS_CLIENT(inode)->cl_auth;
 	cred = rpcauth_lookupcred(auth, 0);
 	filp->private_data = cred;
 	if (filp->f_mode & FMODE_WRITE)
 		nfs_set_mmcred(inode, cred);
-out:
-	unlock_kernel();
-	return err;
+	return 0;
 }
 
 int nfs_release(struct inode *inode, struct file *filp)
@@ -1368,11 +1369,16 @@
 	if (create_nfsv4_state(server, data))
 		goto out_shutdown;
 
+	if ((server->idmap = nfs_idmap_new(server)) == NULL)
+		printk(KERN_WARNING "NFS: couldn't start IDmap\n");
+
 	err = nfs_sb_init(sb);
 	if (err == 0)
 		return 0;
 	rpciod_down();
 	destroy_nfsv4_state(server);
+	if (server->idmap != NULL)
+		nfs_idmap_delete(server);
 out_shutdown:
 	rpc_shutdown_client(server->client);
 out_fail:
@@ -1502,9 +1508,18 @@
 	.kill_sb	= nfs_kill_super,
 	.fs_flags	= FS_ODD_RENAME,
 };
+
+#define nfs4_zero_state(nfsi) \
+	do { \
+		(nfsi)->wo_owner = NULL; \
+		(nfsi)->ro_owner = NULL; \
+		(nfsi)->rw_owner = NULL; \
+	} while(0)
 #define register_nfs4fs() register_filesystem(&nfs4_fs_type)
 #define unregister_nfs4fs() unregister_filesystem(&nfs4_fs_type)
 #else
+#define nfs4_zero_state(nfsi) \
+	do { } while (0)
 #define register_nfs4fs() (0)
 #define unregister_nfs4fs()
 #endif
@@ -1526,6 +1541,7 @@
 		return NULL;
 	nfsi->flags = 0;
 	nfsi->mm_cred = NULL;
+	nfs4_zero_state(nfsi);
 	return &nfsi->vfs_inode;
 }
 
diff -Nru a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
--- a/fs/nfs/nfs4proc.c	Sat Apr 19 19:51:49 2003
+++ b/fs/nfs/nfs4proc.c	Sat Apr 19 19:51:49 2003
@@ -55,7 +55,8 @@
 extern struct rpc_procinfo nfs4_procedures[];
 
 static nfs4_stateid zero_stateid =
-  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ 	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
 static spinlock_t renew_lock = SPIN_LOCK_UNLOCKED;
 
 static void
@@ -81,19 +82,6 @@
 }
 
 static void
-nfs4_setup_close(struct nfs4_compound *cp, nfs4_stateid stateid, u32 seqid)
-{
-	struct nfs4_close *close = GET_OP(cp, close);
-
-	close->cl_stateid = stateid;
-	close->cl_seqid = seqid;
-
-	OPNUM(cp) = OP_CLOSE;
-	cp->req_nops++;
-	cp->renew_index = cp->req_nops;
-}
-
-static void
 nfs4_setup_create_dir(struct nfs4_compound *cp, struct qstr *name,
 		      struct iattr *sattr, struct nfs4_change_info *info)
 {
@@ -347,48 +335,6 @@
 }
 
 static void
-nfs4_setup_open(struct nfs4_compound *cp, int flags, struct qstr *name,
-		struct iattr *sattr, char *stateid, struct nfs4_change_info *cinfo,
-		u32 *rflags)
-{
-	struct nfs4_open *open = GET_OP(cp, open);
-
-	BUG_ON(cp->flags);
-	
-	open->op_client_state = cp->server->nfs4_state;
-	open->op_share_access = flags & 3;
-	open->op_opentype = (flags & O_CREAT) ? NFS4_OPEN_CREATE : NFS4_OPEN_NOCREATE;
-	open->op_createmode = NFS4_CREATE_UNCHECKED;
-	open->op_attrs = sattr;
-	if (flags & O_EXCL) {
-		u32 *p = (u32 *) open->op_verifier;
-		p[0] = jiffies;
-		p[1] = current->pid;
-		open->op_createmode = NFS4_CREATE_EXCLUSIVE;
-	}
-	open->op_name = name;
-	open->op_stateid = stateid;
-	open->op_cinfo = cinfo;
-	open->op_rflags = rflags;
-
-	OPNUM(cp) = OP_OPEN;
-	cp->req_nops++;
-	cp->renew_index = cp->req_nops;
-}
-
-static void
-nfs4_setup_open_confirm(struct nfs4_compound *cp, char *stateid)
-{
-	struct nfs4_open_confirm *open_confirm = GET_OP(cp, open_confirm);
-	
-	open_confirm->oc_stateid = stateid;
-
-	OPNUM(cp) = OP_OPEN_CONFIRM;
-	cp->req_nops++;
-	cp->renew_index = cp->req_nops;
-}
-
-static void
 nfs4_setup_readdir(struct nfs4_compound *cp, u64 cookie, u32 *verifier,
 		     struct page **pages, unsigned int bufsize, struct dentry *dentry)
 {
@@ -517,18 +463,6 @@
 }
 
 static void
-nfs4_setup_setattr(struct nfs4_compound *cp, char *stateid, struct iattr *iap)
-{
-	struct nfs4_setattr *setattr = GET_OP(cp, setattr);
-
-	setattr->st_stateid = stateid;
-	setattr->st_iap = iap;
-	
-	OPNUM(cp) = OP_SETATTR;
-	cp->req_nops++;
-}
-
-static void
 nfs4_setup_setclientid(struct nfs4_compound *cp, u32 program, unsigned short port)
 {
 	struct nfs4_setclientid *setclientid = GET_OP(cp, setclientid);
@@ -626,72 +560,193 @@
 	}
 }
 
-static int
-do_open(struct inode *dir, struct qstr *name, int flags, struct iattr *sattr,
-	struct nfs_fattr *fattr, struct nfs_fh *fhandle, u32 *seqid, char *stateid)
-{
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[7];
-	struct nfs4_change_info	dir_cinfo;
-	struct nfs_fattr	dir_attr;
-	u32			dir_bmres[2];
-	u32			bmres[2];
-	u32			rflags;
-	int			status;
-
-	dir_attr.valid = 0;
-	fattr->valid = 0;
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "open");
-	nfs4_setup_putfh(&compound, NFS_FH(dir));
-	nfs4_setup_savefh(&compound);
-	nfs4_setup_open(&compound, flags, name, sattr, stateid, &dir_cinfo, &rflags);
-	nfs4_setup_getattr(&compound, fattr, bmres);
-	nfs4_setup_getfh(&compound, fhandle);
-	nfs4_setup_restorefh(&compound);
-	nfs4_setup_getattr(&compound, &dir_attr, dir_bmres);
-	if ((status = nfs4_call_compound(&compound, NULL, 0)))
-		return status;
+int
+nfs4_do_open(struct inode *dir, struct qstr *name, int flags,
+		struct iattr *sattr, struct nfs_fattr *fattr,
+		struct nfs_fh *fhandle, struct nfs4_shareowner **spp)
+{
+	struct nfs4_shareowner  *sp;
+	struct nfs_server       *server = NFS_SERVER(dir);
+	struct nfs4_change_info d_cinfo;
+	int                     status;
+	u32                     f_bmres[2];
+	u32                     d_bmres[2];
+	struct nfs_fattr        d_attr = {
+		.valid          0,
+	};
+	struct nfs_fattr        f_attr = {
+		.valid          0,
+	};
+	struct nfs4_getattr     f_getattr = {
+		.gt_bmval       = nfs4_fattr_bitmap,
+		.gt_attrs       = (fattr == NULL ? &f_attr: fattr),
+		.gt_bmres       = f_bmres,
+	};
+	struct nfs4_getattr     d_getattr = {
+		.gt_bmval       = nfs4_fattr_bitmap,
+		.gt_attrs       = &d_attr,
+		.gt_bmres       = d_bmres,
+	};
+	struct nfs_openargs o_arg = {
+		.fh             = NFS_FH(dir),
+		.share_access   = flags & O_ACCMODE,
+		.clientid       = NFS_SERVER(dir)->nfs4_state->cl_clientid,
+		.opentype       = (flags & O_CREAT) ? NFS4_OPEN_CREATE : NFS4_OPEN_NOCREATE,
+		.createmode     = (flags & O_EXCL) ? NFS4_CREATE_EXCLUSIVE : NFS4_CREATE_UNCHECKED,
+		.name           = name,
+		.f_getattr      = &f_getattr,
+		.d_getattr      = &d_getattr,
+		.server         = server,
+	};
+	struct nfs_openres o_res = {
+		.cinfo          = &d_cinfo,
+		.f_getattr      = &f_getattr,
+		.d_getattr      = &d_getattr,
+		.server         = server,
+	};
+	struct rpc_message msg = {
+		.rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
+		.rpc_argp       = &o_arg,
+		.rpc_resp       = &o_res,
+	};
 
-	process_cinfo(&dir_cinfo, &dir_attr);
-	nfs_refresh_inode(dir, &dir_attr);
-	if (!(rflags & NFS4_OPEN_RESULT_CONFIRM)) {
-		*seqid = 1;
-		return 0;
+	status = -ENOMEM;
+	if (!(sp = nfs4_get_shareowner(dir))) {
+		dprintk("nfs4_do_open: nfs4_get_shareowner failed!\n");
+		goto out;
+	}
+	if (o_arg.createmode & NFS4_CREATE_EXCLUSIVE){
+		u32 *p = (u32 *) o_arg.u.verifier;
+		p[0] = jiffies;
+		p[1] = current->pid;
+	} else if (o_arg.createmode == NFS4_CREATE_UNCHECKED) {
+		o_arg.u.attrs = sattr;
+	}
+	/* Serialization for the sequence id */
+	down(&sp->so_sema);
+	o_arg.seqid = sp->so_seqid;
+	o_arg.id = sp->so_id;
+
+	status = rpc_call_sync(server->client, &msg, 0);
+	if (status) {
+		goto out_up;
+	}
+	nfs4_increment_seqid(status, sp);
+	process_cinfo(&d_cinfo, &d_attr);
+	nfs_refresh_inode(dir, &d_attr);
+
+	if (fhandle) {
+		memset(fhandle, 0, sizeof(*fhandle));
+		fhandle->size = (o_res.fh.size < NFS_MAXFHSIZE ? o_res.fh.size : NFS_MAXFHSIZE);
+		memcpy(fhandle->data, o_res.fh.data, fhandle->size);
 	}
-	*seqid = 2;
 
-	nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "open_confirm");
-	nfs4_setup_putfh(&compound, fhandle);
-	nfs4_setup_open_confirm(&compound, stateid);
-	return nfs4_call_compound(&compound, NULL, 0);
-}
+	if(o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) {
+		struct nfs_open_confirmargs oc_arg = {
+			.fh             = &o_res.fh,
+			.seqid          = sp->so_seqid,
+		};
+		struct nfs_open_confirmres oc_res = {
+			.status         = 0,
+		};
+		struct 	rpc_message msg = {
+			.rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
+			.rpc_argp       = &oc_arg,
+			.rpc_resp       = &oc_res,
+		};
 
-static int
-do_setattr(struct nfs_server *server, struct nfs_fattr *fattr,
-	   struct nfs_fh *fhandle, struct iattr *sattr, char *stateid)
-{
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[3];
-	u32			bmres[2];
+		memcpy(oc_arg.stateid, o_res.stateid, sizeof(nfs4_stateid));
+		status = rpc_call_sync(server->client, &msg, 0);
+		if (status)
+			goto out_up;
+		nfs4_increment_seqid(status, sp);
+		memcpy(sp->so_stateid, oc_res.stateid, sizeof(nfs4_stateid));
+	} else
+		memcpy(sp->so_stateid, o_res.stateid, sizeof(nfs4_stateid));
+	sp->so_flags = flags & O_ACCMODE;
 
-	fattr->valid = 0;
-	nfs4_setup_compound(&compound, ops, server, "setattr");
-	nfs4_setup_putfh(&compound, fhandle);
-	nfs4_setup_setattr(&compound, stateid, sattr);
-	nfs4_setup_getattr(&compound, fattr, bmres);
-	return nfs4_call_compound(&compound, NULL, 0);
+out_up:
+	up(&sp->so_sema);
+out:
+	*spp = sp;
+	return status;
 }
 
-static int
-do_close(struct nfs_server *server, struct nfs_fh *fhandle, u32 seqid, char *stateid)
+int
+nfs4_do_setattr(struct nfs_server *server, struct nfs_fattr *fattr,
+                struct nfs_fh *fhandle, struct iattr *sattr,
+                struct nfs4_shareowner *sp)
+{
+        u32                     g_bmres[2];
+        struct nfs4_getattr     getattr = {
+                .gt_bmval       = nfs4_fattr_bitmap,
+                .gt_attrs       = fattr,
+                .gt_bmres       = g_bmres,
+        };
+        struct nfs_setattrargs  arg = {
+                .fh             = fhandle,
+                .iap            = sattr,
+                .attr           = &getattr,
+		.server		= server,
+        };
+        struct nfs_setattrres  res = {
+                .attr           = &getattr,
+		.server		= server,
+        };
+        struct rpc_message msg = {
+                .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
+                .rpc_argp       = &arg,
+                .rpc_resp       = &res,
+        };
+
+        fattr->valid = 0;
+
+        if (sp)
+                memcpy(arg.stateid, sp->so_stateid, sizeof(nfs4_stateid));
+        else
+                memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid));
+
+        return(rpc_call_sync(server->client, &msg, 0));
+}
+
+/* 
+ * It is possible for data to be read/written from a mem-mapped file 
+ * after the sys_close call (which hits the vfs layer as a flush).
+ * This means that we can't safely call nfsv4 close on a file until 
+ * the inode is cleared. This in turn means that we are not good
+ * NFSv4 citizens - we do not indicate to the server to update the file's 
+ * share state even when we are done with one of the three share 
+ * stateid's in the inode.
+ */
+int
+nfs4_do_close(struct inode *inode, struct nfs4_shareowner *sp) 
 {
-	struct nfs4_compound	compound;
-	struct nfs4_op		ops[2];
-	
-	nfs4_setup_compound(&compound, ops, server, "close");
-	nfs4_setup_putfh(&compound, fhandle);
-	nfs4_setup_close(&compound, stateid, seqid);
-	return nfs4_call_compound(&compound, NULL, 0);
+	int status = 0;
+	struct nfs_closeargs arg = {
+		.fh		= NFS_FH(inode),
+	};
+	struct nfs_closeres res = {
+		.status		= 0,
+	};
+	struct rpc_message msg = {
+		.rpc_proc	= &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
+		.rpc_argp	= &arg,
+		.rpc_resp	= &res,
+	};
+
+        memcpy(arg.stateid, sp->so_stateid, sizeof(nfs4_stateid));
+	/* Serialization for the sequence id */
+	down(&sp->so_sema);
+	arg.seqid = sp->so_seqid,
+	status = rpc_call_sync(NFS_SERVER(inode)->client, &msg, 0);
+
+        /* hmm. we are done with the inode, and in the process of freeing
+	 * the shareowner. we keep this around to process errors
+	 */
+	nfs4_increment_seqid(status, sp);
+	up(&sp->so_sema);
+
+	return status;
 }
 
 static int
@@ -792,47 +847,54 @@
 	return nfs4_call_compound(&compound, NULL, 0);
 }
 
+/* 
+ * The file is not closed if it is opened due to the a request to change
+ * the size of the file. The open call will not be needed once the
+ * VFS layer lookup-intents are implemented.
+ *
+ * Close is called when the inode is destroyed.
+ * If we haven't opened the file for O_WRONLY, we
+ * need to in the size_change case to obtain a stateid.
+ *
+ * Got race?
+ * Because OPEN is always done by name in nfsv4, it is
+ * possible that we opened a different file by the same
+ * name.  We can recognize this race condition, but we
+ * can't do anything about it besides returning an error.
+ *
+ * This will be fixed with VFS changes (lookup-intent).
+ */
 static int
 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
 		  struct iattr *sattr)
 {
 	struct inode *		inode = dentry->d_inode;
 	int			size_change = sattr->ia_valid & ATTR_SIZE;
-	struct nfs_fh		throwaway_fh;
-	u32			seqid;
-	nfs4_stateid		stateid;
+	struct nfs4_shareowner	*sp = NULL;
 	int			status;
 
 	fattr->valid = 0;
 	
 	if (size_change) {
-		status = do_open(dentry->d_parent->d_inode, &dentry->d_name,
-				 NFS4_SHARE_ACCESS_WRITE, NULL, fattr,
-				 &throwaway_fh, &seqid, stateid);
+		if (NFS_I(inode)->wo_owner) {
+			/* file is already open for O_WRONLY */
+			sp = NFS_I(inode)->wo_owner;
+			goto no_open;
+		}
+		status = nfs4_do_open(dentry->d_parent->d_inode, 
+				&dentry->d_name, O_WRONLY, NULL, fattr,
+				NULL, &sp);
 		if (status)
 			return status;
 
-		/*
-		 * Because OPEN is always done by name in nfsv4, it is
-		 * possible that we opened a different file by the same
-		 * name.  We can recognize this race condition, but we
-		 * can't do anything about it besides returning an error.
-		 *
-		 * XXX: Should we compare filehandles too, as in
-		 * nfs_find_actor()?
-		 */
 		if (fattr->fileid != NFS_FILEID(inode)) {
 			printk(KERN_WARNING "nfs: raced in setattr, returning -EIO\n");
-			do_close(NFS_SERVER(inode), NFS_FH(inode), seqid, stateid);
 			return -EIO;
 		}
 	}
-	else
-		memcpy(stateid, zero_stateid, sizeof(nfs4_stateid));
-	
-	status = do_setattr(NFS_SERVER(inode), fattr, NFS_FH(inode), sattr, stateid);
-	if (size_change)
-		do_close(NFS_SERVER(inode), NFS_FH(inode), seqid, stateid);
+no_open:
+	status = nfs4_do_setattr(NFS_SERVER(inode), fattr,
+			NFS_FH(inode), sattr, sp);
 	return status;
 }
 
@@ -956,6 +1018,7 @@
 	       struct page *page, int *eofp)
 {
 	struct nfs_server *server = NFS_SERVER(inode);
+	struct nfs4_shareowner	*sp;
 	uint64_t offset = page_offset(page) + base;
 	struct nfs_readargs arg = {
 		.fh		= NFS_FH(inode),
@@ -978,6 +1041,17 @@
 	int status;
 
 	dprintk("NFS call  read %d @ %Ld\n", count, (long long)offset);
+	/*
+	* Try first to use O_RDONLY, then O_RDWR stateid.
+	*/
+	sp = nfs4_get_inode_share(inode, O_RDONLY);
+	if (!sp)
+		sp = nfs4_get_inode_share(inode, O_RDWR);
+	if (sp)
+		memcpy(arg.stateid,sp->so_stateid, sizeof(nfs4_stateid));
+	else
+		memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid));
+
 	fattr->valid = 0;
 	status = rpc_call_sync(server->client, &msg, flags);
 	if (!status) {
@@ -998,6 +1072,7 @@
 		struct page *page, struct nfs_writeverf *verf)
 {
 	struct nfs_server *server = NFS_SERVER(inode);
+	struct nfs4_shareowner	*sp;
 	uint64_t offset = page_offset(page) + base;
 	struct nfs_writeargs arg = {
 		.fh		= NFS_FH(inode),
@@ -1021,25 +1096,54 @@
 	int			rpcflags = (flags & NFS_RW_SWAP) ? NFS_RPC_SWAPFLAGS : 0;
 
 	dprintk("NFS call  write %d @ %Ld\n", count, (long long)offset);
+
+	/*
+	* Try first to use O_WRONLY, then O_RDWR stateid.
+	*/
+	sp = nfs4_get_inode_share(inode, O_WRONLY);
+	if (!sp)
+		sp = nfs4_get_inode_share(inode, O_RDWR);
+
+	if (sp)
+		memcpy(arg.stateid,sp->so_stateid, sizeof(nfs4_stateid));
+	else
+		memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid));
+
 	fattr->valid = 0;
 	return rpc_call_sync(server->client, &msg, rpcflags);
 }
 
+/*
+ * Got race?
+ * We will need to arrange for the VFS layer to provide an atomic open.
+ * Until then, this create/open method is prone to inefficiency and race
+ * conditions due to the lookup, create, and open VFS calls from sys_open()
+ * placed on the wire.
+ *
+ * Given the above sorry state of affairs, I'm simply sending an OPEN.
+ * The file will be opened again in the subsequent VFS open call
+ * (nfs4_proc_file_open).
+ *
+ * The open for read will just hang around to be used by any process that
+ * opens the file O_RDONLY. This will all be resolved with the VFS changes.
+ */
+
 static int
 nfs4_proc_create(struct inode *dir, struct qstr *name, struct iattr *sattr,
-		 int flags, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
+                 int flags, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
 {
-	int			oflags;
-	u32			seqid;
-	nfs4_stateid		stateid;
-	int 			status;
+	int                     oflags;
+	struct nfs4_shareowner   *sp = NULL;
+	int                     status;
 
-	oflags = NFS4_SHARE_ACCESS_READ | O_CREAT | (flags & O_EXCL);
-	status = do_open(dir, name, oflags, sattr, fattr, fhandle, &seqid, stateid);
+	oflags = O_RDONLY | O_CREAT | (flags & O_EXCL);
+	status = nfs4_do_open(dir, name, oflags, sattr, fattr, fhandle, &sp);
 	if (!status) {
-		if (flags & O_EXCL)
-			status = do_setattr(NFS_SERVER(dir), fattr, fhandle, sattr, stateid);
-		do_close(NFS_SERVER(dir), fhandle, seqid, stateid);
+		if (flags & O_EXCL) {
+			status = nfs4_do_setattr(NFS_SERVER(dir), fattr,
+			                     fhandle, sattr, sp);
+		/* XXX should i bother closing the file? */
+		}
 	}
 	return status;
 }
@@ -1368,6 +1472,7 @@
 	};
 	struct inode *inode = data->inode;
 	struct nfs_page *req = nfs_list_entry(data->pages.next);
+	struct nfs4_shareowner	*sp;
 	int flags;
 
 	data->args.fh     = NFS_FH(inode);
@@ -1380,6 +1485,19 @@
 	data->res.eof     = 0;
 	data->timestamp   = jiffies;
 
+	if(req->wb_file) {
+		unsigned int oflags = req->wb_file->f_flags;
+		sp = nfs4_get_inode_share(inode, oflags);
+	} else {
+		sp = nfs4_get_inode_share(inode, O_RDONLY);
+		if (!sp)
+			sp = nfs4_get_inode_share(inode, O_RDWR);
+	}
+	if (sp)
+		memcpy(data->args.stateid,sp->so_stateid, sizeof(nfs4_stateid));
+	else
+		memcpy(data->args.stateid, zero_stateid, sizeof(nfs4_stateid));
+
 	/* N.B. Do we need to test? Never called for swapfile inode */
 	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);
 
@@ -1432,6 +1550,7 @@
 	};
 	struct inode *inode = data->inode;
 	struct nfs_page *req = nfs_list_entry(data->pages.next);
+	struct nfs4_shareowner	*sp;
 	int stable;
 	int flags;
 	
@@ -1454,6 +1573,20 @@
 	data->res.verf    = &data->verf;
 	data->timestamp   = jiffies;
 
+	if(req->wb_file) {
+		unsigned int oflags = req->wb_file->f_flags;
+		sp = nfs4_get_inode_share(inode, oflags);
+	} else {
+		sp = nfs4_get_inode_share(inode, O_WRONLY);
+		if (!sp)
+			sp = nfs4_get_inode_share(inode, O_RDWR);
+	}
+
+	if (sp)
+		memcpy(data->args.stateid,sp->so_stateid, sizeof(nfs4_stateid));
+	else
+		memcpy(data->args.stateid, zero_stateid, sizeof(nfs4_stateid));
+
 	/* Set the initial flags for the task.  */
 	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
 
@@ -1560,6 +1693,55 @@
 	return rpc_execute(task);
 }
 
+/*
+ * We will need to arrange for the VFS layer to provide an atomic open.
+ * Until then, this open method is prone to inefficiency and race conditions
+ * due to the lookup, potential create, and open VFS calls from sys_open()
+ * placed on the wire.
+ */
+int
+nfs4_proc_file_open(struct inode *inode, struct file *filp)
+{
+	struct dentry *dentry = filp->f_dentry;
+	struct inode *dir = dentry->d_parent->d_inode;
+	int flags, status = 0;
+
+	dprintk("nfs4_proc_file_open: starting on (%.*s/%.*s)\n",
+	                       (int)dentry->d_parent->d_name.len,
+	                       dentry->d_parent->d_name.name,
+	                       (int)dentry->d_name.len, dentry->d_name.name);
+
+	lock_kernel();
+
+	/* isn't this done in open_namei? */
+	if (!S_ISREG(inode->i_mode)) {
+		status = -EISDIR;
+		goto out;
+	}
+
+	flags = filp->f_flags & O_ACCMODE;
+
+/*
+* Got race??
+* We have already opened the file "O_EXCL" in nfs4_proc_create!!
+* This ugliness will go away with lookup-intent...
+*/
+	while (!nfs4_get_inode_share(inode, flags)) {
+		struct nfs4_shareowner *sp = NULL;
+		status = nfs4_do_open(dir, &dentry->d_name, flags, NULL, NULL, NULL, &sp);
+		if (status) {
+			nfs4_put_shareowner(inode,sp);
+			break;
+		}
+		if (nfs4_set_inode_share(inode, sp, flags))
+			nfs4_put_shareowner(inode,sp);
+	}
+out:
+	unlock_kernel();
+	return status;
+}
+
+
 struct nfs_rpc_ops	nfs_v4_clientops = {
 	.version	= 4,			/* protocol version */
 	.getroot	= nfs4_proc_get_root,
@@ -1589,6 +1771,7 @@
 	.read_setup	= nfs4_proc_read_setup,
 	.write_setup	= nfs4_proc_write_setup,
 	.commit_setup	= nfs4_proc_commit_setup,
+	.file_open      = nfs4_proc_file_open,
 };
 
 /*
diff -Nru a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
--- a/fs/nfs/nfs4state.c	Sat Apr 19 19:51:27 2003
+++ b/fs/nfs/nfs4state.c	Sat Apr 19 19:51:27 2003
@@ -42,6 +42,16 @@
 #include <linux/slab.h>
 #include <linux/nfs_fs.h>
 
+/* This protects most of the client-side state. */
+static spinlock_t               state_spinlock = SPIN_LOCK_UNLOCKED;
+
+nfs4_stateid zero_stateid =
+	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+nfs4_stateid one_stateid =
+	{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+
+
 /*
  * nfs4_get_client(): returns an empty client structure
  * nfs4_put_client(): drops reference to client structure
@@ -52,26 +62,166 @@
 struct nfs4_client *
 nfs4_get_client(void)
 {
-        struct nfs4_client *clp;
+	struct nfs4_client *clp;
 
-        if ((clp = kmalloc(sizeof(*clp), GFP_KERNEL))) {
-                atomic_set(&clp->cl_count, 1);
-                clp->cl_clientid = 0;
-                INIT_LIST_HEAD(&clp->cl_lockowners);
-        }
-        return clp;
+	if ((clp = kmalloc(sizeof(*clp), GFP_KERNEL)))
+		memset(clp, 0, sizeof(nfs4_verifier));
+	return clp;
 }
 
 void
 nfs4_put_client(struct nfs4_client *clp)
 {
-        BUG_ON(!clp);
-        BUG_ON(!atomic_read(&clp->cl_count));
-        
-        if (atomic_dec_and_test(&clp->cl_count)) {
-                BUG_ON(!list_empty(&clp->cl_lockowners));
-                kfree(clp);
+	BUG_ON(!clp);
+	kfree(clp);
+}
+
+static inline u32
+nfs4_alloc_lockowner_id(struct nfs4_client *clp)
+{
+	u32 res;
+
+	spin_lock(&state_spinlock);
+	res = clp->cl_lockowner_id ++;
+	spin_unlock(&state_spinlock);
+	return res;
+}
+
+/*
+ * nfs4_get_shareowner(): this is called on the OPEN or CREATE path to
+ * obtain a new shareowner.
+ *
+ * There are three shareowners (open_owner4 in rfc3010) per inode,
+ * one for each possible combination of share lock access. Since
+ * Linux does not support the deny access type, there are
+ * three (not 9) referenced by the nfs_inode:
+ *
+ * O_WRONLY: inode->wo_owner
+ * O_RDONLY: inode->ro_owner
+ * O_RDWR:   inode->rw_owner
+ *
+ * We create a new shareowner the first time a file is OPENed with
+ * one of the above shares. All other OPENs with a similar
+ * share use the single stateid associated with the inode.
+ *
+ */
+struct nfs4_shareowner *
+nfs4_get_shareowner(struct inode *dir)
+{
+	struct nfs4_client *clp;
+	struct nfs4_shareowner *sp;
+
+	sp = kmalloc(sizeof(*sp),GFP_KERNEL);
+	if (!sp)
+		return NULL;
+	clp = (NFS_SB(dir->i_sb))->nfs4_state;
+	BUG_ON(!clp);
+	init_MUTEX(&sp->so_sema);
+	sp->so_seqid = 0;                 /* arbitrary */
+	memset(sp->so_stateid, 0, sizeof(nfs4_stateid));
+	sp->so_id = nfs4_alloc_lockowner_id(clp);
+	return sp;
+}
+
+/*
+ * Called for each non-null inode shareowner in nfs_clear_inode, 
+ * or if nfs4_do_open fails.
+ */
+void
+nfs4_put_shareowner(struct inode *inode, struct nfs4_shareowner *sp)
+{
+	if (!sp)
+		return;
+	if (sp->so_flags & O_ACCMODE)
+		nfs4_do_close(inode, sp);
+        kfree(sp);
+}
+
+/*
+* Called with sp->so_sema held.
+*
+* Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or
+* failed with a seqid incrementing error -
+* see comments nfs_fs.h:seqid_mutating_error()
+*/
+void
+nfs4_increment_seqid(u32 status, struct nfs4_shareowner *sp)
+{
+	if (status == NFS_OK || seqid_mutating_err(status))
+		sp->so_seqid++;
+}
+
+/*
+* Called by nfs4_proc_open to set the appropriate stateid
+*/
+int
+nfs4_set_inode_share(struct inode * inode, struct nfs4_shareowner *sp, unsigned int open_flags)
+{
+	struct nfs_inode *nfsi = NFS_I(inode);
+
+	switch (open_flags & O_ACCMODE) {
+		case O_RDONLY:
+			if (!nfsi->ro_owner) {
+				nfsi->ro_owner = sp;
+				return 0;
+			}
+			break;
+		case O_WRONLY:
+			if (!nfsi->wo_owner) {
+				nfsi->wo_owner = sp;
+				return 0;
+			}
+			break;
+		case O_RDWR:
+			if (!nfsi->rw_owner) {
+				nfsi->rw_owner = sp;
+				return 0;
+			}
+	}
+	return -EBUSY;
+}
+
+/*
+* Boolean test to determine if an OPEN call goes on the wire.
+*
+* Called by nfs4_proc_open.
+*/
+int
+nfs4_test_shareowner(struct inode *inode, unsigned int open_flags)
+{
+	struct nfs_inode *nfsi = NFS_I(inode);
+
+	switch (open_flags & O_ACCMODE) {
+		case O_RDONLY:
+			if(nfsi->ro_owner)
+				return 0;
+			break;
+		case O_WRONLY:
+			if(nfsi->wo_owner)
+				return 0;
+			break;
+		case O_RDWR:
+			if(nfsi->rw_owner)
+				return 0;
         }
+        return 1;
+}
+
+struct nfs4_shareowner *
+nfs4_get_inode_share(struct inode * inode, unsigned int open_flags)
+{
+	struct nfs_inode *nfsi = NFS_I(inode);
+
+	switch (open_flags & O_ACCMODE) {
+		case O_RDONLY:
+			return nfsi->ro_owner;
+		case O_WRONLY:
+			return nfsi->wo_owner;
+		case O_RDWR:
+			return nfsi->rw_owner;
+	}
+	/* Duh gcc warning if we don't... */
+	return NULL;
 }
 
 /*
diff -Nru a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
--- a/fs/nfs/nfs4xdr.c	Sat Apr 19 19:51:51 2003
+++ b/fs/nfs/nfs4xdr.c	Sat Apr 19 19:51:51 2003
@@ -8,7 +8,7 @@
  *
  *  Kendrick Smith <kmsmith@umich.edu>
  *  Andy Adamson   <andros@umich.edu>
- *
+ * 
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions
  *  are met:
@@ -50,12 +50,7 @@
 #include <linux/nfs.h>
 #include <linux/nfs4.h>
 #include <linux/nfs_fs.h>
-
-/* Emperically, it seems that the NFS client gets confused if
- * cookies larger than this are returned -- presumably a
- * signedness issue?
- */
-#define COOKIE_MAX		0x7fffffff
+#include <linux/nfs_idmap.h>
 
 #define NFSDBG_FACILITY		NFSDBG_XDR
 
@@ -78,6 +73,17 @@
 #define encode_putfh_maxsz	op_encode_hdr_maxsz + 1 + \
 				(NFS4_FHSIZE >> 2)
 #define decode_putfh_maxsz	op_decode_hdr_maxsz
+#define encode_getfh_maxsz      op_encode_hdr_maxsz
+#define decode_getfh_maxsz      op_decode_hdr_maxsz + 1 + \
+                                (NFS4_FHSIZE >> 2)
+#define encode_getattr_maxsz    op_encode_hdr_maxsz + 3
+#define nfs4_fattr_bitmap_maxsz 26 + 2 * ((NFS4_MAXNAMLEN +1) >> 2)
+#define decode_getattr_maxsz    op_decode_hdr_maxsz + 3 + \
+                                nfs4_fattr_bitmap_maxsz
+#define encode_savefh_maxsz     op_encode_hdr_maxsz
+#define decode_savefh_maxsz     op_decode_hdr_maxsz
+#define encode_restorefh_maxsz  op_encode_hdr_maxsz
+#define decode_restorefh_maxsz  op_decode_hdr_maxsz
 #define encode_read_getattr_maxsz	op_encode_hdr_maxsz + 2
 #define decode_read_getattr_maxsz	op_decode_hdr_maxsz + 8
 #define encode_pre_write_getattr_maxsz	op_encode_hdr_maxsz + 2
@@ -115,6 +121,44 @@
 				decode_pre_write_getattr_maxsz + \
 				op_decode_hdr_maxsz + 2 + \
 				decode_post_write_getattr_maxsz
+#define NFS4_enc_open_sz        compound_encode_hdr_maxsz + \
+                                encode_putfh_maxsz + \
+                                encode_savefh_maxsz + \
+                                op_encode_hdr_maxsz + \
+                                13 + 3 + 2 + 64 + \
+                                encode_getattr_maxsz + \
+                                encode_getfh_maxsz + \
+                                encode_restorefh_maxsz + \
+                                encode_getattr_maxsz
+#define NFS4_dec_open_sz        compound_decode_hdr_maxsz + \
+                                decode_putfh_maxsz + \
+                                decode_savefh_maxsz + \
+                                op_decode_hdr_maxsz + 4 + 5 + 2 + 3 + \
+                                decode_getattr_maxsz + \
+                                decode_getfh_maxsz + \
+                                decode_restorefh_maxsz + \
+                                decode_getattr_maxsz
+#define NFS4_enc_open_confirm_sz      \
+                                compound_encode_hdr_maxsz + \
+                                encode_putfh_maxsz + \
+                                op_encode_hdr_maxsz + 5
+#define NFS4_dec_open_confirm_sz        compound_decode_hdr_maxsz + \
+                                        decode_putfh_maxsz + \
+                                        op_decode_hdr_maxsz + 4
+#define NFS4_enc_close_sz       compound_encode_hdr_maxsz + \
+                                encode_putfh_maxsz + \
+                                op_encode_hdr_maxsz + 5
+#define NFS4_dec_close_sz       compound_decode_hdr_maxsz + \
+                                decode_putfh_maxsz + \
+                                op_decode_hdr_maxsz + 4
+#define NFS4_enc_setattr_sz     compound_encode_hdr_maxsz + \
+                                encode_putfh_maxsz + \
+                                op_encode_hdr_maxsz + 4 + \
+                                nfs4_fattr_bitmap_maxsz + \
+                                encode_getattr_maxsz
+#define NFS4_dec_setattr_sz     compound_decode_hdr_maxsz + \
+                                decode_putfh_maxsz + \
+                                op_decode_hdr_maxsz + 3
 
 
 static struct {
@@ -190,30 +234,9 @@
 	return 0;
 }
 
-/*
- * FIXME: The following dummy entries will be replaced once the userland
- * upcall gets in...
- */
-static int
-encode_uid(char *p, uid_t uid)
-{
-	strcpy(p, "nobody");
-	return 6;
-}
-
-/*
- * FIXME: The following dummy entries will be replaced once the userland
- * upcall gets in...
- */
-static int
-encode_gid(char *p, gid_t gid)
-{
-	strcpy(p, "nobody");
-	return 6;
-}
-
 static int
-encode_attrs(struct xdr_stream *xdr, struct iattr *iap)
+encode_attrs(struct xdr_stream *xdr, struct iattr *iap,
+    struct nfs_server *server)
 {
 	char owner_name[256];
 	char owner_group[256];
@@ -241,20 +264,27 @@
 	if (iap->ia_valid & ATTR_MODE)
 		len += 4;
 	if (iap->ia_valid & ATTR_UID) {
-		status = owner_namelen = encode_uid(owner_name, iap->ia_uid);
+		status = nfs_idmap_name(server, IDMAP_TYPE_USER,
+		    iap->ia_uid, owner_name, &owner_namelen);
 		if (status < 0) {
 			printk(KERN_WARNING "nfs: couldn't resolve uid %d to string\n",
 			       iap->ia_uid);
-			goto out;
+			/* XXX */
+			strcpy(owner_name, "nobody");
+			owner_namelen = sizeof("nobody") - 1;
+			/* goto out; */
 		}
 		len += 4 + (XDR_QUADLEN(owner_namelen) << 2);
 	}
 	if (iap->ia_valid & ATTR_GID) {
-		status = owner_grouplen = encode_gid(owner_group, iap->ia_gid);
+		status = nfs_idmap_name(server, IDMAP_TYPE_GROUP,
+		    iap->ia_gid, owner_group, &owner_grouplen);
 		if (status < 0) {
 			printk(KERN_WARNING "nfs4: couldn't resolve gid %d to string\n",
 			       iap->ia_gid);
-			goto out;
+			strcpy(owner_group, "nobody");
+			owner_grouplen = sizeof("nobody") - 1;
+			/* goto out; */
 		}
 		len += 4 + (XDR_QUADLEN(owner_grouplen) << 2);
 	}
@@ -348,14 +378,14 @@
 }
 
 static int
-encode_close(struct xdr_stream *xdr, struct nfs4_close *close)
+encode_close(struct xdr_stream *xdr, struct nfs_closeargs *arg)
 {
 	uint32_t *p;
 
 	RESERVE_SPACE(8+sizeof(nfs4_stateid));
 	WRITE32(OP_CLOSE);
-	WRITE32(close->cl_seqid);
-	WRITEMEM(close->cl_stateid, sizeof(nfs4_stateid));
+	WRITE32(arg->seqid);
+	WRITEMEM(arg->stateid, sizeof(nfs4_stateid));
 	
 	return 0;
 }
@@ -374,7 +404,8 @@
 }
 
 static int
-encode_create(struct xdr_stream *xdr, struct nfs4_create *create)
+encode_create(struct xdr_stream *xdr, struct nfs4_create *create,
+    struct nfs_server *server)
 {
 	uint32_t *p;
 	
@@ -403,7 +434,7 @@
 	WRITE32(create->cr_namelen);
 	WRITEMEM(create->cr_name, create->cr_namelen);
 
-	return encode_attrs(xdr, create->cr_attrs);
+	return encode_attrs(xdr, create->cr_attrs, server);
 }
 
 static int
@@ -509,69 +540,76 @@
 }
 
 static int
-encode_open(struct xdr_stream *xdr, struct nfs4_open *open)
+encode_open(struct xdr_stream *xdr, struct nfs_openargs *arg)
 {
-	static int global_id = 0;
-	int id = global_id++;
 	int status;
 	uint32_t *p;
-	
-	/* seqid, share_access, share_deny, clientid, ownerlen, owner, opentype */
+
+ /*
+ * opcode 4, seqid 4, share_access 4, share_deny 4, clientid 8, ownerlen 4,
+ * owner 4, opentype 4 = 36
+ */
 	RESERVE_SPACE(36);
 	WRITE32(OP_OPEN);
-	WRITE32(0);                       /* seqid */
-	WRITE32(open->op_share_access);
-	WRITE32(0);                       /* for us, share_deny== 0 always */
-	WRITE64(open->op_client_state->cl_clientid);
+	WRITE32(arg->seqid);
+	switch (arg->share_access) {
+		case O_RDONLY:
+			WRITE32(NFS4_SHARE_ACCESS_READ);
+			break;
+		case O_WRONLY:
+			WRITE32(NFS4_SHARE_ACCESS_WRITE);
+			break;
+		case O_RDWR:
+			WRITE32(NFS4_SHARE_ACCESS_BOTH);
+	}
+	WRITE32(0);                  /* for linux, share_deny = 0 always */
+	WRITE64(arg->clientid);
 	WRITE32(4);
-	WRITE32(id);
-	WRITE32(open->op_opentype);
-	
-	if (open->op_opentype == NFS4_OPEN_CREATE) {
-		if (open->op_createmode == NFS4_CREATE_EXCLUSIVE) {
-			RESERVE_SPACE(4+sizeof(nfs4_verifier));
-			WRITE32(open->op_createmode);
-			WRITEMEM(open->op_verifier, sizeof(nfs4_verifier));
+	WRITE32(arg->id);
+	WRITE32(arg->opentype);
+
+	if (arg->opentype == NFS4_OPEN_CREATE) {
+		if (arg->createmode == NFS4_CREATE_EXCLUSIVE) {
+			RESERVE_SPACE(12);
+			WRITE32(arg->createmode);
+			WRITEMEM(arg->u.verifier, sizeof(nfs4_verifier));
 		}
-		else if (open->op_attrs) {
+		else if (arg->u.attrs) {
 			RESERVE_SPACE(4);
-			WRITE32(open->op_createmode);
-			if ((status = encode_attrs(xdr, open->op_attrs)))
+			WRITE32(arg->createmode);
+			if ((status = encode_attrs(xdr, arg->u.attrs, arg->server)))
 				return status;
 		}
 		else {
 			RESERVE_SPACE(12);
-			WRITE32(open->op_createmode);
+			WRITE32(arg->createmode);
 			WRITE32(0);
 			WRITE32(0);
 		}
 	}
 
-	RESERVE_SPACE(8 + open->op_name->len);
+	RESERVE_SPACE(8 + arg->name->len);
 	WRITE32(NFS4_OPEN_CLAIM_NULL);
-	WRITE32(open->op_name->len);
-	WRITEMEM(open->op_name->name, open->op_name->len);
-	
+	WRITE32(arg->name->len);
+	WRITEMEM(arg->name->name, arg->name->len);
+
 	return 0;
 }
 
 static int
-encode_open_confirm(struct xdr_stream *xdr, struct nfs4_open_confirm *open_confirm)
+encode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmargs *arg)
 {
 	uint32_t *p;
 
-	/*
-	 * Note: In this "stateless" implementation, the OPEN_CONFIRM
-	 * seqid is always equal to 1.
-	 */
 	RESERVE_SPACE(8+sizeof(nfs4_stateid));
 	WRITE32(OP_OPEN_CONFIRM);
-	WRITEMEM(open_confirm->oc_stateid, sizeof(nfs4_stateid));
-	WRITE32(1);
-	
+	WRITEMEM(arg->stateid, sizeof(nfs4_stateid));
+	WRITE32(arg->seqid);
+
 	return 0;
 }
 
+
 static int
 encode_putfh(struct xdr_stream *xdr, struct nfs_fh *fh)
 {
@@ -604,10 +642,7 @@
 
 	RESERVE_SPACE(32);
 	WRITE32(OP_READ);
-	WRITE32(0);   /* all-zero stateid! */
-	WRITE32(0);
-	WRITE32(0);
-	WRITE32(0);
+	WRITEMEM(args->stateid, sizeof(nfs4_stateid));
 	WRITE64(args->offset);
 	WRITE32(args->count);
 
@@ -727,16 +762,17 @@
 }
 
 static int
-encode_setattr(struct xdr_stream *xdr, struct nfs4_setattr *setattr)
+encode_setattr(struct xdr_stream *xdr, struct nfs_setattrargs *arg,
+    struct nfs_server *server)
 {
 	int status;
 	uint32_t *p;
 	
         RESERVE_SPACE(4+sizeof(nfs4_stateid));
         WRITE32(OP_SETATTR);
-	WRITEMEM(setattr->st_stateid, sizeof(nfs4_stateid));
+	WRITEMEM(arg->stateid, sizeof(nfs4_stateid));
 
-        if ((status = encode_attrs(xdr, setattr->st_iap)))
+        if ((status = encode_attrs(xdr, arg->iap, server)))
 		return status;
 
         return 0;
@@ -790,10 +826,7 @@
 
 	RESERVE_SPACE(36);
 	WRITE32(OP_WRITE);
-	WRITE32(0xffffffff);     /* magic stateid -1 */
-	WRITE32(0xffffffff);
-	WRITE32(0xffffffff);
-	WRITE32(0xffffffff);
+	WRITEMEM(args->stateid, sizeof(nfs4_stateid));
 	WRITE64(args->offset);
 	WRITE32(args->stable);
 	WRITE32(args->count);
@@ -821,11 +854,8 @@
 		case OP_ACCESS:
 			status = encode_access(xdr, &cp->ops[i].u.access);
 			break;
-		case OP_CLOSE:
-			status = encode_close(xdr, &cp->ops[i].u.close);
-			break;
 		case OP_CREATE:
-			status = encode_create(xdr, &cp->ops[i].u.create);
+			status = encode_create(xdr, &cp->ops[i].u.create, cp->server);
 			break;
 		case OP_GETATTR:
 			status = encode_getattr(xdr, &cp->ops[i].u.getattr);
@@ -839,12 +869,6 @@
 		case OP_LOOKUP:
 			status = encode_lookup(xdr, &cp->ops[i].u.lookup);
 			break;
-		case OP_OPEN:
-			status = encode_open(xdr, &cp->ops[i].u.open);
-			break;
-		case OP_OPEN_CONFIRM:
-			status = encode_open_confirm(xdr, &cp->ops[i].u.open_confirm);
-			break;
 		case OP_PUTFH:
 			status = encode_putfh(xdr, cp->ops[i].u.putfh.pf_fhandle);
 			break;
@@ -872,9 +896,6 @@
 		case OP_SAVEFH:
 			status = encode_savefh(xdr);
 			break;
-		case OP_SETATTR:
-			status = encode_setattr(xdr, &cp->ops[i].u.setattr);
-			break;
 		case OP_SETCLIENTID:
 			status = encode_setclientid(xdr, &cp->ops[i].u.setclientid);
 			break;
@@ -909,6 +930,87 @@
 	cp->timestamp = jiffies;
 	return status;
 }
+/*
+ * Encode a CLOSE request
+ */
+static int
+nfs4_xdr_enc_close(struct rpc_rqst *req, uint32_t *p, struct nfs_closeargs *args)
+{
+        struct xdr_stream xdr;
+        struct compound_hdr hdr = {
+                .nops   = 2,
+        };
+        int status;
+
+        xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+        encode_compound_hdr(&xdr, &hdr);
+        status = encode_putfh(&xdr, args->fh);
+        if(status)
+                goto out;
+        status = encode_close(&xdr, args);
+out:
+        return status;
+}
+
+/*
+ * Encode an OPEN request
+ */
+static int
+nfs4_xdr_enc_open(struct rpc_rqst *req, uint32_t *p, struct nfs_openargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops   = 7,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if (status)
+		goto out;
+	status = encode_savefh(&xdr);
+	if (status)
+		goto out;
+	status = encode_open(&xdr, args);
+	if (status)
+		goto out;
+	status = encode_getattr(&xdr, args->f_getattr);
+	if (status)
+		goto out;
+	status = encode_getfh(&xdr);
+	if (status)
+		goto out;
+	status = encode_restorefh(&xdr);
+	if (status)
+		goto out;
+	status = encode_getattr(&xdr, args->d_getattr);
+out:
+	return status;
+}
+
+/*
+ * Encode an OPEN_CONFIRM request
+ */
+static int
+nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs_open_confirmargs *args)
+{
+	struct xdr_stream xdr;
+	struct compound_hdr hdr = {
+		.nops   = 2,
+	};
+	int status;
+
+	xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+	encode_compound_hdr(&xdr, &hdr);
+	status = encode_putfh(&xdr, args->fh);
+	if(status)
+		goto out;
+	status = encode_open_confirm(&xdr, args);
+out:
+	return status;
+}
+
 
 /*
  * Encode a READ request
@@ -946,6 +1048,32 @@
 }
 
 /*
+ * Encode an SETATTR request
+ */
+static int
+nfs4_xdr_enc_setattr(struct rpc_rqst *req, uint32_t *p, struct nfs_setattrargs *args)
+
+{
+        struct xdr_stream xdr;
+        struct compound_hdr hdr = {
+                .nops   = 3,
+        };
+        int status;
+
+        xdr_init_encode(&xdr, &req->rq_snd_buf, p);
+        encode_compound_hdr(&xdr, &hdr);
+        status = encode_putfh(&xdr, args->fh);
+        if(status)
+                goto out;
+        status = encode_setattr(&xdr, args, args->server);
+        if(status)
+                goto out;
+        status = encode_getattr(&xdr, args->attr);
+out:
+        return status;
+}
+
+/*
  * Encode a WRITE request
  */
 static int
@@ -974,7 +1102,7 @@
 }
 
 /*
- * Encode a COMMIT request
+ *  a COMMIT request
  */
 static int
 nfs4_xdr_enc_commit(struct rpc_rqst *req, uint32_t *p, struct nfs_writeargs *args)
@@ -1044,28 +1172,6 @@
 	} \
 } while (0)
 
-/*
- * FIXME: The following dummy entry will be replaced once the userland
- * upcall gets in...
- */
-static int
-decode_uid(char *p, uint32_t len, uid_t *uid)
-{
-	*uid = -2;
-	return 0;
-}
-
-/*
- * FIXME: The following dummy entry will be replaced once the userland
- * upcall gets in...
- */
-static int
-decode_gid(char *p, uint32_t len, gid_t *gid)
-{
-	*gid = -2;
-	return 0;
-}
-
 static int
 decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)
 {
@@ -1139,7 +1245,7 @@
 }
 
 static int
-decode_close(struct xdr_stream *xdr, struct nfs4_close *close)
+decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)
 {
 	uint32_t *p;
 	int status;
@@ -1148,7 +1254,7 @@
 	if (status)
 		return status;
 	READ_BUF(sizeof(nfs4_stateid));
-	COPYMEM(close->cl_stateid, sizeof(nfs4_stateid));
+	COPYMEM(res->stateid, sizeof(nfs4_stateid));
 	return 0;
 }
 
@@ -1190,7 +1296,8 @@
 extern uint32_t nfs4_pathconf_bitmap[2];
 
 static int
-decode_getattr(struct xdr_stream *xdr, struct nfs4_getattr *getattr)
+decode_getattr(struct xdr_stream *xdr, struct nfs4_getattr *getattr,
+    struct nfs_server *server)
 {
 	struct nfs_fattr *nfp = getattr->gt_attrs;
 	struct nfs_fsstat *fsstat = getattr->gt_fsstat;
@@ -1354,35 +1461,39 @@
         }
         if (bmval1 & FATTR4_WORD1_OWNER) {
                 READ_BUF(4);
-                len += 4;
-                READ32(dummy32);    /* name length */
-                if (dummy32 > XDR_MAX_NETOBJ) {
+		len += 4;
+		READ32(dummy32);    /* name length */
+		if (dummy32 > XDR_MAX_NETOBJ) {
 			dprintk("read_attrs: name too long!\n");
-                        goto xdr_error;
-                }
-                READ_BUF(dummy32);
-                len += (XDR_QUADLEN(dummy32) << 2);
-                if ((status = decode_uid((char *)p, dummy32, &nfp->uid))) {
-                        dprintk("read_attrs: gss_get_num failed!\n");
-                        goto out;
-                }
-                dprintk("read_attrs: uid=%d\n", (int)nfp->uid);
+			goto xdr_error;
+		}
+		READ_BUF(dummy32);
+		len += (XDR_QUADLEN(dummy32) << 2);
+		if ((status = nfs_idmap_id(server, IDMAP_TYPE_USER,
+			 (char *)p, len, &nfp->uid)) == -1) {
+			dprintk("read_attrs: gss_get_num failed!\n");
+			/* goto out; */
+			nfp->uid = -2;
+		}
+		dprintk("read_attrs: uid=%d\n", (int)nfp->uid);
         }
         if (bmval1 & FATTR4_WORD1_OWNER_GROUP) {
                 READ_BUF(4);
-                len += 4;
-                READ32(dummy32);
-                if (dummy32 > XDR_MAX_NETOBJ) {
-                        dprintk("read_attrs: name too long!\n");
-                        goto xdr_error;
-                }
-                READ_BUF(dummy32);
-                len += (XDR_QUADLEN(dummy32) << 2);
-                if ((status = decode_gid((char *)p, dummy32, &nfp->gid))) {
-                        dprintk("read_attrs: gss_get_num failed!\n");
-                        goto out;
-                }
-                dprintk("read_attrs: gid=%d\n", (int)nfp->gid);
+		len += 4;
+		READ32(dummy32);
+		if (dummy32 > XDR_MAX_NETOBJ) {
+			dprintk("read_attrs: name too long!\n");
+			goto xdr_error;
+		}
+		READ_BUF(dummy32);
+		len += (XDR_QUADLEN(dummy32) << 2);
+		if ((status = nfs_idmap_id(server, IDMAP_TYPE_GROUP,
+			 (char *)p, len, &nfp->gid)) == -1) {
+			dprintk("read_attrs: gss_get_num failed!\n");
+			nfp->gid = -2;
+			/* goto out; */
+		}
+		dprintk("read_attrs: gid=%d\n", (int)nfp->gid);
         }
         if (bmval1 & FATTR4_WORD1_RAWDEV) {
 		uint32_t major, minor;
@@ -1617,49 +1728,49 @@
 }
 
 static int
-decode_open(struct xdr_stream *xdr, struct nfs4_open *open)
+decode_open(struct xdr_stream *xdr, struct nfs_openres *res)
 {
-	uint32_t *p;
-	uint32_t bmlen, delegation_type;
-	int status;
-	
-	status = decode_op_hdr(xdr, OP_OPEN);
-	if (status)
-		return status;
-	READ_BUF(sizeof(nfs4_stateid));
-	COPYMEM(open->op_stateid, sizeof(nfs4_stateid));
+        uint32_t *p;
+        uint32_t bmlen, delegation_type;
+        int status;
 
-	decode_change_info(xdr, open->op_cinfo);
+        status = decode_op_hdr(xdr, OP_OPEN);
+        if (status)
+                return status;
+        READ_BUF(sizeof(nfs4_stateid));
+        COPYMEM(res->stateid, sizeof(nfs4_stateid));
 
-	READ_BUF(8);
-	READ32(*open->op_rflags);
-	READ32(bmlen);
-	if (bmlen > 10)
-		goto xdr_error;
-		
-	READ_BUF((bmlen << 2) + 4);
-	p += bmlen;
-	READ32(delegation_type);
-	if (delegation_type != NFS4_OPEN_DELEGATE_NONE)
-		goto xdr_error;
-	
-	DECODE_TAIL;
+        decode_change_info(xdr, res->cinfo);
+
+        READ_BUF(8);
+        READ32(res->rflags);
+        READ32(bmlen);
+        if (bmlen > 10)
+                goto xdr_error;
+
+        READ_BUF((bmlen << 2) + 4);
+        p += bmlen;
+        READ32(delegation_type);
+        if (delegation_type != NFS4_OPEN_DELEGATE_NONE)
+                goto xdr_error;
+
+        DECODE_TAIL;
 }
 
 static int
-decode_open_confirm(struct xdr_stream *xdr, struct nfs4_open_confirm *open_confirm)
+decode_open_confirm(struct xdr_stream *xdr, struct nfs_open_confirmres *res)
 {
-	uint32_t *p;
-	int status;
+        uint32_t *p;
 
-	status = decode_op_hdr(xdr, OP_OPEN_CONFIRM);
-	if (status)
-		return status;
-	READ_BUF(sizeof(nfs4_stateid));
-	COPYMEM(open_confirm->oc_stateid, sizeof(nfs4_stateid));
-	return 0;
+        res->status = decode_op_hdr(xdr, OP_OPEN_CONFIRM);
+        if (res->status)
+                return res->status;
+        READ_BUF(sizeof(nfs4_stateid));
+        COPYMEM(res->stateid, sizeof(nfs4_stateid));
+        return 0;
 }
 
+
 static int
 decode_putfh(struct xdr_stream *xdr)
 {
@@ -1875,7 +1986,7 @@
 }
 
 static int
-decode_setattr(struct xdr_stream *xdr)
+decode_setattr(struct xdr_stream *xdr, struct nfs_setattrres *res)
 {
 	uint32_t *p;
 	uint32_t bmlen;
@@ -1986,14 +2097,11 @@
 		case OP_ACCESS:
 			status = decode_access(xdr, &op->u.access);
 			break;
-		case OP_CLOSE:
-			status = decode_close(xdr, &op->u.close);
-			break;
 		case OP_CREATE:
 			status = decode_create(xdr, &op->u.create);
 			break;
 		case OP_GETATTR:
-			status = decode_getattr(xdr, &op->u.getattr);
+			status = decode_getattr(xdr, &op->u.getattr, cp->server);
 			break;
 		case OP_GETFH:
 			status = decode_getfh(xdr, &op->u.getfh);
@@ -2004,12 +2112,6 @@
 		case OP_LOOKUP:
 			status = decode_lookup(xdr);
 			break;
-		case OP_OPEN:
-			status = decode_open(xdr, &op->u.open);
-			break;
-		case OP_OPEN_CONFIRM:
-			status = decode_open_confirm(xdr, &op->u.open_confirm);
-			break;
 		case OP_PUTFH:
 			status = decode_putfh(xdr);
 			break;
@@ -2037,9 +2139,6 @@
 		case OP_SAVEFH:
 			status = decode_savefh(xdr);
 			break;
-		case OP_SETATTR:
-			status = decode_setattr(xdr);
-			break;
 		case OP_SETCLIENTID:
 			status = decode_setclientid(xdr, &op->u.setclientid);
 			break;
@@ -2082,6 +2181,118 @@
 }
 
 /*
+ * Decode CLOSE response
+ */
+static int
+nfs4_xdr_dec_close(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_closeres *res)
+{
+        struct xdr_stream xdr;
+        struct compound_hdr hdr;
+        int status;
+
+        xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+        status = decode_compound_hdr(&xdr, &hdr);
+        if (status)
+                goto out;
+        status = decode_putfh(&xdr);
+        if (status)
+                goto out;
+        status = decode_close(&xdr, res);
+out:
+        return status;
+}
+
+/*
+ * Decode OPEN response
+ */
+static int
+nfs4_xdr_dec_open(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_openres *res)
+{
+        struct xdr_stream xdr;
+        struct compound_hdr hdr;
+	struct nfs4_getfh gfh	= {
+		.gf_fhandle = &res->fh,
+	};
+        int status;
+
+        xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+        status = decode_compound_hdr(&xdr, &hdr);
+        if (status)
+                goto out;
+        status = decode_putfh(&xdr);
+        if (status)
+                goto out;
+        status = decode_savefh(&xdr);
+        if (status)
+                goto out;
+        status = decode_open(&xdr, res);
+        if (status)
+                goto out;
+        status = decode_getattr(&xdr, res->f_getattr, res->server);
+        if (status)
+                goto out;
+        status = decode_getfh(&xdr, &gfh);
+        if (status)
+                goto out;
+        status = decode_restorefh(&xdr);
+        if (status)
+                goto out;
+        status = decode_getattr(&xdr, res->d_getattr, res->server);
+        if (status)
+                goto out;
+out:
+        return status;
+}
+
+/*
+ * Decode OPEN_CONFIRM response
+ */
+static int
+nfs4_xdr_dec_open_confirm(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_open_confirmres *res)
+{
+        struct xdr_stream xdr;
+        struct compound_hdr hdr;
+        int status;
+
+        xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+        status = decode_compound_hdr(&xdr, &hdr);
+        if (status)
+                goto out;
+        status = decode_putfh(&xdr);
+        if (status)
+                goto out;
+        status = decode_open_confirm(&xdr, res);
+out:
+        return status;
+}
+
+/*
+ * Decode SETATTR response
+ */
+static int
+nfs4_xdr_dec_setattr(struct rpc_rqst *rqstp, uint32_t *p, struct nfs_setattrres *res)
+{
+        struct xdr_stream xdr;
+        struct compound_hdr hdr;
+        int status;
+
+        xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+        status = decode_compound_hdr(&xdr, &hdr);
+        if (status)
+                goto out;
+        status = decode_putfh(&xdr);
+        if (status)
+                goto out;
+        status = decode_setattr(&xdr, res);
+        if (status)
+                goto out;
+        status = decode_getattr(&xdr, res->attr, res->server);
+out:
+        return status;
+}
+
+
+/*
  * Decode Read response
  */
 static int
@@ -2188,9 +2399,6 @@
 	entry->name = (const char *) p;
 	p += XDR_QUADLEN(entry->len);
 
-	if (entry->cookie > COOKIE_MAX)
-		entry->cookie = COOKIE_MAX;
-	
 	/*
 	 * In case the server doesn't return an inode number,
 	 * we fake one here.  (We don't use inode number 0,
@@ -2213,7 +2421,7 @@
 #endif
 
 #define PROC(proc, argtype, restype)				\
-[NFSPROC4_CLNT_##proc] = {						\
+[NFSPROC4_CLNT_##proc] = {					\
 	.p_proc   = NFSPROC4_COMPOUND,				\
 	.p_encode = (kxdrproc_t) nfs4_xdr_##argtype,		\
 	.p_decode = (kxdrproc_t) nfs4_xdr_##restype,		\
@@ -2225,6 +2433,10 @@
   PROC(READ,		enc_read,	dec_read),
   PROC(WRITE,		enc_write,	dec_write),
   PROC(COMMIT,		enc_commit,	dec_commit),
+  PROC(OPEN,		enc_open,	dec_open),
+  PROC(OPEN_CONFIRM,	enc_open_confirm,	dec_open_confirm),
+  PROC(CLOSE,		enc_close,	dec_close),
+  PROC(SETATTR,		enc_setattr,	dec_setattr),
 };
 
 struct rpc_version		nfs_version4 = {
diff -Nru a/fs/nfs/write.c b/fs/nfs/write.c
--- a/fs/nfs/write.c	Sat Apr 19 19:51:49 2003
+++ b/fs/nfs/write.c	Sat Apr 19 19:51:49 2003
@@ -274,8 +274,14 @@
 	err = nfs_flush_file(inode, NULL, 0, 0, 0);
 	if (err < 0)
 		goto out;
-	if (is_sync)
+	if (wbc->sync_mode == WB_SYNC_HOLD)
+		goto out;
+	if (is_sync && wbc->sync_mode == WB_SYNC_ALL) {
 		err = nfs_wb_all(inode);
+	} else
+		nfs_commit_file(inode, NULL, 0, 0, 0);
+	/* Avoid races. Tell upstream we've done all we were told to do */
+	wbc->nr_to_write = 0;
 out:
 	return err;
 }
@@ -363,6 +369,7 @@
 	nfs_list_add_request(req, &nfsi->dirty);
 	nfsi->ndirty++;
 	spin_unlock(&nfs_wreq_lock);
+	inc_page_state(nr_dirty);
 	mark_inode_dirty(inode);
 }
 
@@ -390,6 +397,7 @@
 	nfs_list_add_request(req, &nfsi->commit);
 	nfsi->ncommit++;
 	spin_unlock(&nfs_wreq_lock);
+	inc_page_state(nr_unstable);
 	mark_inode_dirty(inode);
 }
 #endif
@@ -457,6 +465,7 @@
 	int	res;
 	res = nfs_scan_list(&nfsi->dirty, dst, file, idx_start, npages);
 	nfsi->ndirty -= res;
+	sub_page_state(nr_dirty,res);
 	if ((nfsi->ndirty == 0) != list_empty(&nfsi->dirty))
 		printk(KERN_ERR "NFS: desynchronized value of nfs_i.ndirty.\n");
 	return res;
@@ -481,6 +490,7 @@
 	int	res;
 	res = nfs_scan_list(&nfsi->commit, dst, file, idx_start, npages);
 	nfsi->ncommit -= res;
+	sub_page_state(nr_unstable,res);
 	if ((nfsi->ncommit == 0) != list_empty(&nfsi->commit))
 		printk(KERN_ERR "NFS: desynchronized value of nfs_i.ncommit.\n");
 	return res;
diff -Nru a/fs/nfsctl.c b/fs/nfsctl.c
--- a/fs/nfsctl.c	Sat Apr 19 19:51:51 2003
+++ b/fs/nfsctl.c	Sat Apr 19 19:51:51 2003
@@ -87,10 +87,10 @@
 };
 
 long
-asmlinkage sys_nfsservctl(int cmd, struct nfsctl_arg *arg, void *res)
+asmlinkage sys_nfsservctl(int cmd, struct nfsctl_arg __user *arg, void __user *res)
 {
 	struct file *file;
-	void *p = &arg->u;
+	void __user *p = &arg->u;
 	int version;
 	int err;
 
diff -Nru a/fs/nfsd/Makefile b/fs/nfsd/Makefile
--- a/fs/nfsd/Makefile	Sat Apr 19 19:51:46 2003
+++ b/fs/nfsd/Makefile	Sat Apr 19 19:51:46 2003
@@ -7,5 +7,5 @@
 nfsd-y 			:= nfssvc.o nfsctl.o nfsproc.o nfsfh.o vfs.o \
 			   export.o auth.o lockd.o nfscache.o nfsxdr.o stats.o
 nfsd-$(CONFIG_NFSD_V3)	+= nfs3proc.o nfs3xdr.o
-nfsd-$(CONFIG_NFSD_V4)	+= nfs4proc.o nfs4xdr.o
+nfsd-$(CONFIG_NFSD_V4)	+= nfs4proc.o nfs4xdr.o nfs4state.o
 nfsd-objs		:= $(nfsd-y)
diff -Nru a/fs/nfsd/export.c b/fs/nfsd/export.c
--- a/fs/nfsd/export.c	Sat Apr 19 19:51:48 2003
+++ b/fs/nfsd/export.c	Sat Apr 19 19:51:48 2003
@@ -175,7 +175,7 @@
 		ek = svc_expkey_lookup(&key, 2);
 		if (ek)
 			expkey_put(&ek->h, &svc_expkey_cache);
-		svc_export_put(&exp->h, &svc_export_cache);
+		exp_put(exp);
 		err = 0;
 	out_nd:
 		path_release(&nd);
@@ -648,7 +648,6 @@
 	struct svc_export	new;
 	struct svc_expkey	*fsid_key = NULL;
 	struct nameidata nd;
-	struct inode	*inode = NULL;
 	int		err;
 
 	/* Consistency check */
@@ -674,7 +673,6 @@
 	err = path_lookup(nxp->ex_path, 0, &nd);
 	if (err)
 		goto out_unlock;
-	inode = nd.dentry->d_inode;
 	err = -EINVAL;
 
 	exp = exp_get_by_name(clp, nd.mnt, nd.dentry, NULL);
@@ -687,7 +685,7 @@
 	    fsid_key->ek_export != exp)
 		goto finish;
 
-	if (exp != NULL) {
+	if (exp) {
 		/* just a flags/id/fsid update */
 
 		exp_fsid_unhash(exp);
@@ -700,7 +698,7 @@
 		goto finish;
 	}
 
-	err = check_export(inode, nxp->ex_flags);
+	err = check_export(nd.dentry->d_inode, nxp->ex_flags);
 	if (err) goto finish;
 
 	err = -ENOMEM;
@@ -838,7 +836,7 @@
 		err = 0;
 	memcpy(f, &fh.fh_handle, sizeof(struct knfsd_fh));
 	fh_put(&fh);
-
+	exp_put(exp);
 out:
 	path_release(&nd);
 	return err;
diff -Nru a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
--- a/fs/nfsd/nfs4proc.c	Sat Apr 19 19:51:51 2003
+++ b/fs/nfsd/nfs4proc.c	Sat Apr 19 19:51:51 2003
@@ -173,20 +173,6 @@
 	return nfs_ok;
 }
 
-static inline int
-nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclientid)
-{
-	memset(&setclientid->se_clientid, 0, sizeof(clientid_t));
-	memset(&setclientid->se_confirm, 0, sizeof(nfs4_verifier));
-	return nfs_ok;
-}
-
-static inline int
-nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confirm *setclientid_confirm)
-{
-	return nfs_ok;
-}
-
 /*
  * filehandle-manipulating ops.
  */
diff -Nru a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/fs/nfsd/nfs4state.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,634 @@
+/*
+*  linux/fs/nfsd/nfs4state.c
+*
+*  Copyright (c) 2001 The Regents of the University of Michigan.
+*  All rights reserved.
+*
+*  Kendrick Smith <kmsmith@umich.edu>
+*  Andy Adamson <kandros@umich.edu>
+*
+*  Redistribution and use in source and binary forms, with or without
+*  modification, are permitted provided that the following conditions
+*  are met:
+*
+*  1. Redistributions of source code must retain the above copyright
+*     notice, this list of conditions and the following disclaimer.
+*  2. Redistributions in binary form must reproduce the above copyright
+*     notice, this list of conditions and the following disclaimer in the
+*     documentation and/or other materials provided with the distribution.
+*  3. Neither the name of the University nor the names of its
+*     contributors may be used to endorse or promote products derived
+*     from this software without specific prior written permission.
+*
+*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+*  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+*  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+*  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+*  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+*  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+*  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+*  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+*  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+*  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+
+#include <linux/param.h>
+#include <linux/major.h>
+#include <linux/slab.h>
+
+
+#include <linux/sunrpc/svc.h>
+#include <linux/nfsd/nfsd.h>
+#include <linux/nfsd/cache.h>
+#include <linux/nfs4.h>
+#include <linux/nfsd/xdr4.h>
+#include <linux/nfsd/state.h>
+
+#define NFSDDBG_FACILITY                NFSDDBG_PROC
+
+/* Globals */
+time_t boot_time;
+static u32 current_clientid = 1;
+
+/* Locking:
+ *
+ * client_sema: 
+ * 	protects clientid_hashtbl[], clientstr_hashtbl[],
+ * 	unconfstr_hashtbl[], uncofid_hashtbl[].
+ */
+static struct semaphore client_sema;
+
+static inline u32
+opaque_hashval(const void *ptr, int nbytes)
+{
+	unsigned char *cptr = (unsigned char *) ptr;
+
+	u32 x = 0;
+	while (nbytes--) {
+		x *= 37;
+		x += *cptr++;
+	}
+	return x;
+}
+
+/* Hash tables for nfs4_clientid state */
+#define CLIENT_HASH_BITS                 4
+#define CLIENT_HASH_SIZE                (1 << CLIENT_HASH_BITS)
+#define CLIENT_HASH_MASK                (CLIENT_HASH_SIZE - 1)
+
+#define clientid_hashval(id) \
+	((id) & CLIENT_HASH_MASK)
+#define clientstr_hashval(name, namelen) \
+	(opaque_hashval((name), (namelen)) & CLIENT_HASH_MASK)
+
+/* conf_id_hashtbl[], and conf_str_hashtbl[] hold confirmed
+ * setclientid_confirmed info. 
+ *
+ * unconf_str_hastbl[] and unconf_id_hashtbl[] hold unconfirmed 
+ * setclientid info.
+ */
+static struct list_head	conf_id_hashtbl[CLIENT_HASH_SIZE];
+static struct list_head	conf_str_hashtbl[CLIENT_HASH_SIZE];
+static struct list_head	unconf_str_hashtbl[CLIENT_HASH_SIZE];
+static struct list_head	unconf_id_hashtbl[CLIENT_HASH_SIZE];
+
+/* SETCLIENTID and SETCLIENTID_CONFIRM Helper functions */
+static int
+STALE_CLIENTID(clientid_t *clid)
+{
+	if (clid->cl_boot == boot_time)
+		return 0;
+	printk("NFSD stale clientid (%08x/%08x)\n", clid->cl_boot, clid->cl_id);
+	return 1;
+}
+
+/* 
+ * XXX Should we use a slab cache ?
+ * This type of memory management is somewhat inefficient, but we use it
+ * anyway since SETCLIENTID is not a common operation.
+ */
+static inline struct nfs4_client *
+alloc_client(struct xdr_netobj name)
+{
+	struct nfs4_client *clp;
+
+	if ((clp = kmalloc(sizeof(struct nfs4_client), GFP_KERNEL))!= NULL) {
+		memset(clp, 0, sizeof(*clp));
+		if ((clp->cl_name.data = kmalloc(name.len, GFP_KERNEL)) != NULL) {
+			memcpy(clp->cl_name.data, name.data, name.len);
+			clp->cl_name.len = name.len;
+		}
+		else {
+			kfree(clp);
+			clp = NULL;
+		}
+	}
+	return clp;
+}
+
+static inline void
+free_client(struct nfs4_client *clp)
+{
+	kfree(clp->cl_name.data);
+	kfree(clp);
+}
+
+static void
+expire_client(struct nfs4_client *clp)
+{
+	dprintk("NFSD: expire_client\n");
+	list_del(&clp->cl_idhash);
+	list_del(&clp->cl_strhash);
+	free_client(clp);
+}
+
+static struct nfs4_client *
+create_client(struct xdr_netobj name) {
+	struct nfs4_client *clp;
+
+	if(!(clp = alloc_client(name)))
+		goto out;
+	INIT_LIST_HEAD(&clp->cl_idhash);
+	INIT_LIST_HEAD(&clp->cl_strhash);
+out:
+	return clp;
+}
+
+static void
+copy_verf(struct nfs4_client *target, nfs4_verifier source) {
+	memcpy(&target->cl_verifier, source, sizeof(nfs4_verifier));
+}
+
+static void
+copy_clid(struct nfs4_client *target, struct nfs4_client *source) {
+	target->cl_clientid.cl_boot = source->cl_clientid.cl_boot; 
+	target->cl_clientid.cl_id = source->cl_clientid.cl_id; 
+}
+
+static void
+copy_cred(struct svc_cred *target, struct svc_cred *source) {
+	int i;
+
+	target->cr_uid = source->cr_uid;
+	target->cr_gid = source->cr_gid;
+	for(i = 0; i < NGROUPS; i++)
+		target->cr_groups[i] = source->cr_groups[i];
+}
+
+static int
+cmp_name(struct xdr_netobj *n1, struct xdr_netobj *n2) {
+	if(!n1 || !n2)
+		return 0;
+	return((n1->len == n2->len) && !memcmp(n1->data, n2->data, n2->len));
+}
+
+static int
+cmp_verf(nfs4_verifier v1, nfs4_verifier v2) {
+	return(!memcmp(v1,v2,sizeof(nfs4_verifier)));
+}
+
+static int
+cmp_clid(clientid_t * cl1, clientid_t * cl2) {
+	return((cl1->cl_boot == cl2->cl_boot) &&
+	   	(cl1->cl_id == cl2->cl_id));
+}
+
+/* XXX what about NGROUP */
+static int
+cmp_creds(struct svc_cred *cr1, struct svc_cred *cr2){
+	return((cr1->cr_uid == cr2->cr_uid) &&
+	   	(cr1->cr_gid == cr2->cr_gid));
+
+}
+
+static void
+gen_clid(struct nfs4_client *clp) {
+	clp->cl_clientid.cl_boot = boot_time;
+	clp->cl_clientid.cl_id = current_clientid++; 
+}
+
+static void
+gen_confirm(struct nfs4_client *clp) {
+	struct timespec 	tv;
+	u32 *			p;
+
+	tv = CURRENT_TIME;
+	p = (u32 *)clp->cl_confirm;
+	*p++ = tv.tv_sec;
+	*p++ = tv.tv_nsec;
+}
+
+static int
+check_name(struct xdr_netobj name) {
+
+	if (name.len == 0) 
+		return 0;
+	if (name.len > NFSD4_CLIENT_MAXNAME) {
+		printk("NFSD: check_name: name too long(%d)!\n", name.len);
+		return 0;
+	}
+	return 1;
+}
+
+void
+add_to_unconfirmed(struct nfs4_client *clp, unsigned int strhashval)
+{
+	unsigned int idhashval;
+
+	list_add(&clp->cl_strhash, &unconf_str_hashtbl[strhashval]);
+	idhashval = clientid_hashval(clp->cl_clientid.cl_id);
+	list_add(&clp->cl_idhash, &unconf_id_hashtbl[idhashval]);
+}
+
+void
+move_to_confirmed(struct nfs4_client *clp, unsigned int idhashval)
+{
+	unsigned int strhashval;
+
+	printk("ANDROS: move_to_confirm nfs4_client %p\n", clp);
+	list_del_init(&clp->cl_strhash);
+	list_del_init(&clp->cl_idhash);
+	list_add(&clp->cl_idhash, &conf_id_hashtbl[idhashval]);
+	strhashval = clientstr_hashval(clp->cl_name.data, 
+			clp->cl_name.len);
+	list_add(&clp->cl_strhash, &conf_str_hashtbl[strhashval]);
+}
+
+/*
+ * RFC 3010 has a complex implmentation description of processing a 
+ * SETCLIENTID request consisting of 5 bullets, labeled as 
+ * CASE0 - CASE4 below.
+ *
+ * NOTES:
+ * 	callback information will be processed in a future patch
+ *
+ *	an unconfirmed record is added when:
+ *      NORMAL (part of CASE 4): there is no confirmed nor unconfirmed record.
+ *	CASE 1: confirmed record found with matching name, principal,
+ *		verifier, and clientid.
+ *	CASE 2: confirmed record found with matching name, principal,
+ *		and there is no unconfirmed record with matching
+ *		name and principal
+ *
+ *      an unconfirmed record is replaced when:
+ *	CASE 3: confirmed record found with matching name, principal,
+ *		and an unconfirmed record is found with matching 
+ *		name, principal, and with clientid and
+ *		confirm that does not match the confirmed record.
+ *	CASE 4: there is no confirmed record with matching name and 
+ *		principal. there is an unconfirmed record with 
+ *		matching name, principal.
+ *
+ *	an unconfirmed record is deleted when:
+ *	CASE 1: an unconfirmed record that matches input name, verifier,
+ *		and confirmed clientid.
+ *	CASE 4: any unconfirmed records with matching name and principal
+ *		that exist after an unconfirmed record has been replaced
+ *		as described above.
+ *
+ */
+int
+nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclid)
+{
+	u32 			ip_addr = rqstp->rq_addr.sin_addr.s_addr;
+	struct xdr_netobj 	clname = { 
+		.len = setclid->se_namelen,
+		.data = setclid->se_name,
+	};
+	char *			clverifier = setclid->se_verf;
+	unsigned int 		strhashval;
+	struct nfs4_client *	conf, * unconf, * new, * clp;
+	int 			status;
+	struct list_head *pos, *next;
+	
+	status = nfserr_inval;
+	if (!check_name(clname))
+		goto out;
+
+	/* 
+	 * XXX The Duplicate Request Cache (DRC) has been checked (??)
+	 * We get here on a DRC miss.
+	 */
+
+	strhashval = clientstr_hashval(clname.data, clname.len);
+
+	conf = NULL;
+	down(&client_sema);
+	list_for_each_safe(pos, next, &conf_str_hashtbl[strhashval]) {
+		clp = list_entry(pos, struct nfs4_client, cl_strhash);
+		if (!cmp_name(&clp->cl_name, &clname))
+			continue;
+		/* 
+		 * CASE 0:
+		 * clname match, confirmed, different principal
+		 * or different ip_address
+		 */
+		status = nfserr_clid_inuse;
+		if (!cmp_creds(&clp->cl_cred,&rqstp->rq_cred)) {
+			printk("NFSD: setclientid: string in use by client"
+			"(clientid %08x/%08x)\n",
+			clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
+			goto out;
+		}
+		if (clp->cl_addr != ip_addr) { 
+			printk("NFSD: setclientid: string in use by client"
+			"(clientid %08x/%08x)\n",
+			clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
+			goto out;
+		}
+
+		/* 
+	 	 * cl_name match from a previous SETCLIENTID operation
+	 	 * XXX check for additional matches?
+		 */
+		conf = clp;
+		break;
+	}
+	unconf = NULL;
+	list_for_each_safe(pos, next, &unconf_str_hashtbl[strhashval]) {
+		clp = list_entry(pos, struct nfs4_client, cl_strhash);
+		if (!cmp_name(&clp->cl_name, &clname))
+			continue;
+		/* cl_name match from a previous SETCLIENTID operation */
+		unconf = clp;
+		break;
+	}
+	status = nfserr_resource;
+	if (!conf) {
+		/* 
+		 * CASE 4:
+		 * placed first, because it is the normal case.
+		 */
+		if (unconf)
+			expire_client(unconf);
+		if (!(new = create_client(clname)))
+			goto out;
+		copy_verf(new,clverifier);
+		new->cl_addr = ip_addr;
+		copy_cred(&new->cl_cred,&rqstp->rq_cred);
+		gen_clid(new);
+		gen_confirm(new);
+		add_to_unconfirmed(new, strhashval);
+	} else if (cmp_verf(conf->cl_verifier, clverifier)) {
+		/*
+		 * CASE 1:
+		 * cl_name match, confirmed, principal match
+		 * verifier match: probable callback update
+		 *
+		 * remove any unconfirmed nfs4_client with 
+		 * matching cl_name, cl_verifier, and cl_clientid
+		 *
+		 * create and insert an unconfirmed nfs4_client with same 
+		 * cl_name, cl_verifier, and cl_clientid as existing 
+		 * nfs4_client,  but with the new callback info and a 
+		 * new cl_confirm
+		 */
+		if ((unconf) && 
+		    cmp_verf(unconf->cl_verifier, conf->cl_verifier) &&
+		     cmp_clid(&unconf->cl_clientid, &conf->cl_clientid)) {
+				expire_client(unconf);
+		}
+		if (!(new = create_client(clname)))
+			goto out;
+		copy_verf(new,conf->cl_verifier);
+		new->cl_addr = ip_addr;
+		copy_cred(&new->cl_cred,&rqstp->rq_cred);
+		copy_clid(new, conf);
+		gen_confirm(new);
+		add_to_unconfirmed(new,strhashval);
+	} else if (!unconf) {
+		/*
+		 * CASE 2:
+		 * clname match, confirmed, principal match
+		 * verfier does not match
+		 * no unconfirmed. create a new unconfirmed nfs4_client
+		 * using input clverifier, clname, and callback info
+		 * and generate a new cl_clientid and cl_confirm.
+		 */
+		if (!(new = create_client(clname)))
+			goto out;
+		copy_verf(new,clverifier);
+		new->cl_addr = ip_addr;
+		copy_cred(&new->cl_cred,&rqstp->rq_cred);
+		gen_clid(new);
+		gen_confirm(new);
+		add_to_unconfirmed(new, strhashval);
+	} else if (!cmp_clid(&conf->cl_clientid, &unconf->cl_clientid) &&
+	      !cmp_verf(conf->cl_confirm, unconf->cl_confirm)) {
+		/*	
+		 * CASE3:
+		 * confirmed found (name, principal match)
+		 * confirmed verifier does not match input clverifier
+		 *
+		 * unconfirmed found (name match)
+		 * confirmed->cl_clientid != unconfirmed->cl_clientid and
+		 * confirmed->cl_confirm != unconfirmed->cl_confirm
+		 *
+		 * remove unconfirmed.
+		 *
+		 * create an unconfirmed nfs4_client 
+		 * with same cl_name as existing confirmed nfs4_client, 
+		 * but with new callback info, new cl_clientid,
+		 * new cl_verifier and a new cl_confirm
+		 */
+		expire_client(unconf);
+		if (!(new = create_client(clname)))
+			goto out;
+		copy_verf(new,clverifier);
+		new->cl_addr = ip_addr;
+		copy_cred(&new->cl_cred,&rqstp->rq_cred);
+		gen_clid(new);
+		gen_confirm(new);
+		add_to_unconfirmed(new, strhashval);
+	} else {
+		/* No cases hit !!! */
+		status = nfserr_inval;
+		goto out;
+
+	}
+	setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot;
+	setclid->se_clientid.cl_id = new->cl_clientid.cl_id;
+	memcpy(&setclid->se_confirm, new->cl_confirm, sizeof(nfs4_verifier));
+	printk(KERN_INFO "NFSD: this client will not receive delegations\n");
+	status = nfs_ok;
+out:
+	up(&client_sema);
+	return status;
+}
+
+
+/*
+ * RFC 3010 has a complex implmentation description of processing a 
+ * SETCLIENTID_CONFIRM request consisting of 4 bullets describing
+ * processing on a DRC miss, labeled as CASE1 - CASE4 below.
+ *
+ * NOTE: callback information will be processed here in a future patch
+ */
+int
+nfsd4_setclientid_confirm(struct svc_rqst *rqstp, struct nfsd4_setclientid_confirm *setclientid_confirm)
+{
+	u32 ip_addr = rqstp->rq_addr.sin_addr.s_addr;
+	unsigned int idhashval;
+	struct nfs4_client *clp, *conf = NULL, *unconf = NULL;
+	char * confirm = setclientid_confirm->sc_confirm; 
+	clientid_t * clid = &setclientid_confirm->sc_clientid;
+	struct list_head *pos, *next;
+	int status;
+
+	status = nfserr_stale_clientid;
+	if (STALE_CLIENTID(clid))
+		goto out;
+	/* 
+	 * XXX The Duplicate Request Cache (DRC) has been checked (??)
+	 * We get here on a DRC miss.
+	 */
+
+	idhashval = clientid_hashval(clid->cl_id);
+	down(&client_sema);
+	list_for_each_safe(pos, next, &conf_id_hashtbl[idhashval]) {
+		clp = list_entry(pos, struct nfs4_client, cl_idhash);
+		if (!cmp_clid(&clp->cl_clientid, clid))
+			continue;
+
+		status = nfserr_inval;
+		/* 
+		 * Found a record for this clientid. If the IP addresses
+		 * don't match, return ERR_INVAL just as if the record had
+		 * not been found.
+		 */
+		if (clp->cl_addr != ip_addr) { 
+			printk("NFSD: setclientid: string in use by client"
+			"(clientid %08x/%08x)\n",
+			clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
+			goto out;
+		}
+		conf = clp;
+		break;
+	}
+	list_for_each_safe(pos, next, &unconf_id_hashtbl[idhashval]) {
+		clp = list_entry(pos, struct nfs4_client, cl_idhash);
+		if (!cmp_clid(&clp->cl_clientid, clid))
+			continue;
+		status = nfserr_inval;
+		if (clp->cl_addr != ip_addr) { 
+			printk("NFSD: setclientid: string in use by client"
+			"(clientid %08x/%08x)\n",
+			clp->cl_clientid.cl_boot, clp->cl_clientid.cl_id);
+			goto out;
+		}
+		unconf = clp;
+		break;
+	}
+	/* CASE 1: 
+	* unconf record that matches input clientid and input confirm.
+	* conf record that matches input clientid.
+	* conf  and unconf records match names, verifiers 
+	*/
+	if ((conf && unconf) && 
+	    (cmp_verf(unconf->cl_confirm, confirm)) &&
+	    (cmp_verf(conf->cl_verifier, unconf->cl_verifier)) &&
+	    (cmp_name(&conf->cl_name,&unconf->cl_name))  &&
+	    (!cmp_verf(conf->cl_confirm, unconf->cl_confirm))) {
+		if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) 
+			status = nfserr_clid_inuse;
+		else {
+			expire_client(conf);
+			move_to_confirmed(unconf, idhashval);
+			status = nfs_ok;
+		}
+		goto out;
+	} 
+	/* CASE 2:
+	 * conf record that matches input clientid.
+	 * if unconf record that matches input clientid, then unconf->cl_name
+	 * or unconf->cl_verifier don't match the conf record.
+	 */
+	if ((conf && !unconf) || 
+	    ((conf && unconf) && 
+	     (!cmp_verf(conf->cl_verifier, unconf->cl_verifier) ||
+	      !cmp_name(&conf->cl_name, &unconf->cl_name)))) {
+		if (!cmp_creds(&conf->cl_cred,&rqstp->rq_cred)) {
+			status = nfserr_clid_inuse;
+		} else {
+			status = nfs_ok;
+		}
+		goto out;
+	}
+	/* CASE 3:
+	 * conf record not found.
+	 * unconf record found. 
+	 * unconf->cl_confirm matches input confirm
+	 */ 
+	if (!conf && unconf && cmp_verf(unconf->cl_confirm, confirm)) {
+		if (!cmp_creds(&unconf->cl_cred, &rqstp->rq_cred)) {
+			status = nfserr_clid_inuse;
+		} else {
+			status = nfs_ok;
+			move_to_confirmed(unconf, idhashval);
+		}
+		goto out;
+	}
+	/* CASE 4:
+	 * conf record not found, or if conf, then conf->cl_confirm does not
+	 * match input confirm.
+	 * unconf record not found, or if unconf, then unconf->cl_confirm 
+	 * does not match input confirm.
+	 */
+	if ((!conf || (conf && !cmp_verf(conf->cl_confirm, confirm))) &&
+	    (!unconf || (unconf && !cmp_verf(unconf->cl_confirm, confirm)))) {
+		status = nfserr_stale_clientid;
+		goto out;
+	}
+	/* check that we have hit one of the cases...*/
+	status = nfserr_inval;
+	goto out;
+out:
+	/* XXX if status == nfs_ok, probe callback path */
+	up(&client_sema);
+	return status;
+}
+
+void
+nfs4_state_init(void)
+{
+	struct timespec 	tv;
+	int i;
+
+	for (i = 0; i < CLIENT_HASH_SIZE; i++) {
+		INIT_LIST_HEAD(&conf_id_hashtbl[i]);
+		INIT_LIST_HEAD(&conf_str_hashtbl[i]);
+		INIT_LIST_HEAD(&unconf_str_hashtbl[i]);
+		INIT_LIST_HEAD(&unconf_id_hashtbl[i]);
+	}
+	init_MUTEX(&client_sema);
+	tv = CURRENT_TIME;
+	boot_time = tv.tv_sec;
+}
+
+static void
+__nfs4_state_shutdown(void)
+{
+	int i;
+	struct nfs4_client *clp = NULL;
+
+	for (i = 0; i < CLIENT_HASH_SIZE; i++) {
+		while (!list_empty(&conf_id_hashtbl[i])) {
+			clp = list_entry(conf_id_hashtbl[i].next, struct nfs4_client, cl_idhash);
+			expire_client(clp);
+		}
+		while (!list_empty(&unconf_str_hashtbl[i])) {
+			clp = list_entry(unconf_str_hashtbl[i].next, struct nfs4_client, cl_strhash);
+			expire_client(clp);
+		}
+	}
+}
+
+void
+nfs4_state_shutdown(void)
+{
+	down(&client_sema);
+	__nfs4_state_shutdown();
+	up(&client_sema);
+}
diff -Nru a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
--- a/fs/nfsd/nfs4xdr.c	Sat Apr 19 19:51:50 2003
+++ b/fs/nfsd/nfs4xdr.c	Sat Apr 19 19:51:50 2003
@@ -45,7 +45,6 @@
 #include <linux/param.h>
 #include <linux/smp.h>
 #include <linux/smp_lock.h>
-#include <linux/compatmac.h>
 #include <linux/fs.h>
 #include <linux/namei.h>
 #include <linux/vfs.h>
diff -Nru a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
--- a/fs/nfsd/nfsctl.c	Sat Apr 19 19:51:28 2003
+++ b/fs/nfsd/nfsctl.c	Sat Apr 19 19:51:28 2003
@@ -512,6 +512,7 @@
 	nfsd_cache_init();	/* RPC reply cache */
 	nfsd_export_init();	/* Exports table */
 	nfsd_lockd_init();	/* lockd->nfsd callbacks */
+	nfs4_state_init();      /* NFSv4 State */
 	if (proc_mkdir("fs/nfs", 0)) {
 		struct proc_dir_entry *entry;
 		entry = create_proc_entry("fs/nfs/exports", 0, NULL);
@@ -530,6 +531,7 @@
 	remove_proc_entry("fs/nfs", NULL);
 	nfsd_stat_shutdown();
 	nfsd_lockd_shutdown();
+	nfs4_state_shutdown();
 	unregister_filesystem(&nfsd_fs_type);
 }
 
diff -Nru a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
--- a/fs/nfsd/vfs.c	Sat Apr 19 19:51:46 2003
+++ b/fs/nfsd/vfs.c	Sat Apr 19 19:51:46 2003
@@ -1568,13 +1568,11 @@
 	    inode->i_uid == current->fsuid)
 		return 0;
 
-	acc &= ~ MAY_OWNER_OVERRIDE; /* This bit is no longer needed,
-                                        and gets in the way later */
-
 	err = permission(inode, acc & (MAY_READ|MAY_WRITE|MAY_EXEC));
 
 	/* Allow read access to binaries even when mode 111 */
-	if (err == -EACCES && S_ISREG(inode->i_mode) && acc == MAY_READ)
+	if (err == -EACCES && S_ISREG(inode->i_mode) &&
+	    acc == (MAY_READ | MAY_OWNER_OVERRIDE))
 		err = permission(inode, MAY_EXEC);
 
 	return err? nfserrno(err) : 0;
diff -Nru a/fs/open.c b/fs/open.c
--- a/fs/open.c	Sat Apr 19 19:51:28 2003
+++ b/fs/open.c	Sat Apr 19 19:51:28 2003
@@ -41,7 +41,7 @@
 }
 
 
-asmlinkage long sys_statfs(const char * path, struct statfs * buf)
+asmlinkage long sys_statfs(const char __user * path, struct statfs __user * buf)
 {
 	struct nameidata nd;
 	int error;
@@ -57,7 +57,7 @@
 	return error;
 }
 
-asmlinkage long sys_fstatfs(unsigned int fd, struct statfs * buf)
+asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user * buf)
 {
 	struct file * file;
 	struct statfs tmp;
@@ -92,7 +92,7 @@
 	return err;
 }
 
-static inline long do_sys_truncate(const char * path, loff_t length)
+static inline long do_sys_truncate(const char __user * path, loff_t length)
 {
 	struct nameidata nd;
 	struct inode * inode;
@@ -152,7 +152,7 @@
 	return error;
 }
 
-asmlinkage long sys_truncate(const char * path, unsigned long length)
+asmlinkage long sys_truncate(const char __user * path, unsigned long length)
 {
 	/* on 32-bit boxen it will cut the range 2^31--2^32-1 off */
 	return do_sys_truncate(path, (long)length);
@@ -208,7 +208,7 @@
 
 /* LFS versions of truncate are only needed on 32 bit machines */
 #if BITS_PER_LONG == 32
-asmlinkage long sys_truncate64(const char * path, loff_t length)
+asmlinkage long sys_truncate64(const char __user * path, loff_t length)
 {
 	return do_sys_truncate(path, length);
 }
@@ -232,7 +232,7 @@
  * must be owner or have write permission.
  * Else, update from *times, must be owner or super user.
  */
-asmlinkage long sys_utime(char * filename, struct utimbuf * times)
+asmlinkage long sys_utime(char __user * filename, struct utimbuf __user * times)
 {
 	int error;
 	struct nameidata nd;
@@ -280,7 +280,7 @@
  * must be owner or have write permission.
  * Else, update from *times, must be owner or super user.
  */
-long do_utimes(char * filename, struct timeval * times)
+long do_utimes(char __user * filename, struct timeval __user * times)
 {
 	int error;
 	struct nameidata nd;
@@ -319,7 +319,7 @@
 	return error;
 }
 
-asmlinkage long sys_utimes(char * filename, struct timeval * utimes)
+asmlinkage long sys_utimes(char __user * filename, struct timeval __user * utimes)
 {
 	struct timeval times[2];
 
@@ -334,7 +334,7 @@
  * We do this by temporarily clearing all FS-related capabilities and
  * switching the fsuid/fsgid around to the real ones.
  */
-asmlinkage long sys_access(const char * filename, int mode)
+asmlinkage long sys_access(const char __user * filename, int mode)
 {
 	struct nameidata nd;
 	int old_fsuid, old_fsgid;
@@ -381,7 +381,7 @@
 	return res;
 }
 
-asmlinkage long sys_chdir(const char * filename)
+asmlinkage long sys_chdir(const char __user * filename)
 {
 	struct nameidata nd;
 	int error;
@@ -432,7 +432,7 @@
 	return error;
 }
 
-asmlinkage long sys_chroot(const char * filename)
+asmlinkage long sys_chroot(const char __user * filename)
 {
 	struct nameidata nd;
 	int error;
@@ -493,7 +493,7 @@
 	return err;
 }
 
-asmlinkage long sys_chmod(const char * filename, mode_t mode)
+asmlinkage long sys_chmod(const char __user * filename, mode_t mode)
 {
 	struct nameidata nd;
 	struct inode * inode;
@@ -562,7 +562,7 @@
 	return error;
 }
 
-asmlinkage long sys_chown(const char * filename, uid_t user, gid_t group)
+asmlinkage long sys_chown(const char __user * filename, uid_t user, gid_t group)
 {
 	struct nameidata nd;
 	int error;
@@ -575,7 +575,7 @@
 	return error;
 }
 
-asmlinkage long sys_lchown(const char * filename, uid_t user, gid_t group)
+asmlinkage long sys_lchown(const char __user * filename, uid_t user, gid_t group)
 {
 	struct nameidata nd;
 	int error;
@@ -702,7 +702,7 @@
 	int fd, error;
 
   	error = -EMFILE;
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 
 repeat:
  	fd = find_next_zero_bit(files->open_fds->fds_bits, 
@@ -751,7 +751,7 @@
 	error = fd;
 
 out:
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	return error;
 }
 
@@ -765,9 +765,9 @@
 void put_unused_fd(unsigned int fd)
 {
 	struct files_struct *files = current->files;
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	__put_unused_fd(files, fd);
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 }
 
 /*
@@ -786,14 +786,14 @@
 void fd_install(unsigned int fd, struct file * file)
 {
 	struct files_struct *files = current->files;
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	if (unlikely(files->fd[fd] != NULL))
 		BUG();
 	files->fd[fd] = file;
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 }
 
-asmlinkage long sys_open(const char * filename, int flags, int mode)
+asmlinkage long sys_open(const char __user * filename, int flags, int mode)
 {
 	char * tmp;
 	int fd, error;
@@ -829,7 +829,7 @@
  * For backward compatibility?  Maybe this should be moved
  * into arch/i386 instead?
  */
-asmlinkage long sys_creat(const char * pathname, int mode)
+asmlinkage long sys_creat(const char __user * pathname, int mode)
 {
 	return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
 }
@@ -870,7 +870,7 @@
 	struct file * filp;
 	struct files_struct *files = current->files;
 
-	write_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	if (fd >= files->max_fds)
 		goto out_unlock;
 	filp = files->fd[fd];
@@ -879,11 +879,11 @@
 	files->fd[fd] = NULL;
 	FD_CLR(fd, files->close_on_exec);
 	__put_unused_fd(files, fd);
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	return filp_close(filp, files);
 
 out_unlock:
-	write_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	return -EBADF;
 }
 
diff -Nru a/fs/partitions/check.c b/fs/partitions/check.c
--- a/fs/partitions/check.c	Sat Apr 19 19:51:50 2003
+++ b/fs/partitions/check.c	Sat Apr 19 19:51:50 2003
@@ -94,25 +94,26 @@
 
 char *disk_name(struct gendisk *hd, int part, char *buf)
 {
-	int pos;
 	if (!part) {
-		if (hd->disk_de) {
-			pos = devfs_generate_path(hd->disk_de, buf, 64);
-			if (pos >= 0)
-				return buf + pos;
-		}
-		sprintf(buf, "%s", hd->disk_name);
+#ifdef CONFIG_DEVFS_FS
+		if (hd->devfs_name)
+			sprintf(buf, "%s/%s", hd->devfs_name,
+				(hd->flags & GENHD_FL_CD) ? "cd" : "disc");
+		else
+#endif
+			sprintf(buf, "%s", hd->disk_name);
 	} else {
-		if (hd->part[part-1].de) {
-			pos = devfs_generate_path(hd->part[part-1].de, buf, 64);
-			if (pos >= 0)
-				return buf + pos;
-		}
+#ifdef CONFIG_DEVFS_FS
+		if (hd->devfs_name)
+			sprintf(buf, "%s/part%d", hd->devfs_name, part);
+		else
+#endif
 		if (isdigit(hd->disk_name[strlen(hd->disk_name)-1]))
 			sprintf(buf, "%sp%d", hd->disk_name, part);
 		else
 			sprintf(buf, "%s%d", hd->disk_name, part);
 	}
+
 	return buf;
 }
 
@@ -120,21 +121,19 @@
 check_partition(struct gendisk *hd, struct block_device *bdev)
 {
 	struct parsed_partitions *state;
-	devfs_handle_t de = NULL;
-	char buf[64];
 	int i, res;
 
 	state = kmalloc(sizeof(struct parsed_partitions), GFP_KERNEL);
 	if (!state)
 		return NULL;
 
-	if (hd->flags & GENHD_FL_DEVFS)
-		de = hd->de;
-	i = devfs_generate_path (de, buf, sizeof buf);
-	if (i >= 0) {
-		printk(KERN_INFO " /dev/%s:", buf + i);
+#ifdef CONFIG_DEVFS_FS
+	if (hd->devfs_name) {
+		printk(KERN_INFO " /dev/%s:", hd->devfs_name);
 		sprintf(state->name, "p");
-	} else {
+	}
+#endif
+	else {
 		disk_name(hd, 0, state->name);
 		printk(KERN_INFO " %s:", state->name);
 		if (isdigit(state->name[strlen(state->name)-1]))
@@ -156,26 +155,6 @@
 	return NULL;
 }
 
-static void devfs_register_partition(struct gendisk *dev, int part)
-{
-#ifdef CONFIG_DEVFS_FS
-	devfs_handle_t dir;
-	struct hd_struct *p = dev->part;
-	char devname[16];
-
-	if (p[part-1].de)
-		return;
-	dir = dev->de;
-	if (!dir)
-		return;
-	sprintf(devname, "part%d", part);
-	p[part-1].de = devfs_register (dir, devname, 0,
-				    dev->major, dev->first_minor + part,
-				    S_IFBLK | S_IRUSR | S_IWUSR,
-				    dev->fops, NULL);
-#endif
-}
-
 /*
  * sysfs bindings for partitions
  */
@@ -248,7 +227,7 @@
 
 extern struct subsystem block_subsys;
 
-static struct kobj_type ktype_part = {
+struct kobj_type ktype_part = {
 	.default_attrs	= default_attrs,
 	.sysfs_ops	= &part_sysfs_ops,
 };
@@ -261,8 +240,7 @@
 	p->start_sect = 0;
 	p->nr_sects = 0;
 	p->reads = p->writes = p->read_sectors = p->write_sectors = 0;
-	devfs_unregister(p->de);
-	p->de = NULL;
+	devfs_remove("%s/part%d", disk->devfs_name, part);
 	kobject_unregister(&p->kobj);
 }
 
@@ -414,7 +392,10 @@
 	unlink_gendisk(disk);
 	disk_stat_set_all(disk, 0);
 	disk->stamp = disk->stamp_idle = 0;
-	devfs_remove_partitions(disk);
+	if (disk->flags & GENHD_FL_CD)
+		devfs_remove_cdrom(disk);
+	else
+		devfs_remove_partitions(disk);
 	if (disk->driverfs_dev) {
 		sysfs_remove_link(&disk->kobj, "device");
 		sysfs_remove_link(&disk->driverfs_dev->kobj, "block");
diff -Nru a/fs/proc/base.c b/fs/proc/base.c
--- a/fs/proc/base.c	Sat Apr 19 19:51:49 2003
+++ b/fs/proc/base.c	Sat Apr 19 19:51:49 2003
@@ -117,16 +117,16 @@
 		atomic_inc(&files->count);
 	task_unlock(task);
 	if (files) {
-		read_lock(&files->file_lock);
+		spin_lock(&files->file_lock);
 		file = fcheck_files(files, fd);
 		if (file) {
 			*mnt = mntget(file->f_vfsmnt);
 			*dentry = dget(file->f_dentry);
-			read_unlock(&files->file_lock);
+			spin_unlock(&files->file_lock);
 			put_files_struct(files);
 			return 0;
 		}
-		read_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 		put_files_struct(files);
 	}
 	return -ENOENT;
@@ -655,7 +655,7 @@
 			task_unlock(p);
 			if (!files)
 				goto out;
-			read_lock(&files->file_lock);
+			spin_lock(&files->file_lock);
 			for (fd = filp->f_pos-2;
 			     fd < files->max_fds;
 			     fd++, filp->f_pos++) {
@@ -663,7 +663,7 @@
 
 				if (!fcheck_files(files, fd))
 					continue;
-				read_unlock(&files->file_lock);
+				spin_unlock(&files->file_lock);
 
 				j = NUMBUF;
 				i = fd;
@@ -675,12 +675,12 @@
 
 				ino = fake_ino(pid, PROC_PID_FD_DIR + fd);
 				if (filldir(dirent, buf+j, NUMBUF-j, fd+2, ino, DT_LNK) < 0) {
-					read_lock(&files->file_lock);
+					spin_lock(&files->file_lock);
 					break;
 				}
-				read_lock(&files->file_lock);
+				spin_lock(&files->file_lock);
 			}
-			read_unlock(&files->file_lock);
+			spin_unlock(&files->file_lock);
 			put_files_struct(files);
 	}
 out:
@@ -824,13 +824,13 @@
 		atomic_inc(&files->count);
 	task_unlock(task);
 	if (files) {
-		read_lock(&files->file_lock);
+		spin_lock(&files->file_lock);
 		if (fcheck_files(files, fd)) {
-			read_unlock(&files->file_lock);
+			spin_unlock(&files->file_lock);
 			put_files_struct(files);
 			return 1;
 		}
-		read_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 		put_files_struct(files);
 	}
 	d_drop(dentry);
@@ -920,7 +920,7 @@
 	if (!files)
 		goto out_unlock;
 	inode->i_mode = S_IFLNK;
-	read_lock(&files->file_lock);
+	spin_lock(&files->file_lock);
 	file = fcheck_files(files, fd);
 	if (!file)
 		goto out_unlock2;
@@ -928,7 +928,7 @@
 		inode->i_mode |= S_IRUSR | S_IXUSR;
 	if (file->f_mode & 2)
 		inode->i_mode |= S_IWUSR | S_IXUSR;
-	read_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	put_files_struct(files);
 	inode->i_op = &proc_pid_link_inode_operations;
 	inode->i_size = 64;
@@ -940,7 +940,7 @@
 	return NULL;
 
 out_unlock2:
-	read_unlock(&files->file_lock);
+	spin_unlock(&files->file_lock);
 	put_files_struct(files);
 out_unlock:
 	iput(inode);
diff -Nru a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
--- a/fs/proc/proc_misc.c	Sat Apr 19 19:51:28 2003
+++ b/fs/proc/proc_misc.c	Sat Apr 19 19:51:28 2003
@@ -43,6 +43,7 @@
 #include <linux/hugetlb.h>
 #include <linux/jiffies.h>
 #include <linux/sysrq.h>
+#include <linux/vmalloc.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
 #include <asm/io.h>
@@ -98,6 +99,41 @@
 	return proc_calc_metrics(page, start, off, count, eof, len);
 }
 
+struct vmalloc_info {
+	unsigned long used;
+	unsigned long largest_chunk;
+};
+
+static struct vmalloc_info get_vmalloc_info(void)
+{
+	unsigned long prev_end = VMALLOC_START;
+	struct vm_struct* vma;
+	struct vmalloc_info vmi;
+	vmi.used = 0;
+
+	read_lock(&vmlist_lock);
+
+	if(!vmlist)
+		vmi.largest_chunk = (VMALLOC_END-VMALLOC_START);
+	else
+		vmi.largest_chunk = 0;
+
+	for (vma = vmlist; vma; vma = vma->next) {
+		unsigned long free_area_size =
+			(unsigned long)vma->addr - prev_end;
+		vmi.used += vma->size;
+		if (vmi.largest_chunk < free_area_size )
+
+			vmi.largest_chunk = free_area_size;
+		prev_end = vma->size + (unsigned long)vma->addr;
+	}
+	if(VMALLOC_END-prev_end > vmi.largest_chunk)
+		vmi.largest_chunk = VMALLOC_END-prev_end;
+
+	read_unlock(&vmlist_lock);
+	return vmi;
+}
+
 static int uptime_read_proc(char *page, char **start, off_t off,
 				 int count, int *eof, void *data)
 {
@@ -143,6 +179,8 @@
 	unsigned long inactive;
 	unsigned long active;
 	unsigned long free;
+	unsigned long vmtot;
+	struct vmalloc_info vmi;
 
 	get_page_state(&ps);
 	get_zone_counts(&active, &inactive, &free);
@@ -155,6 +193,11 @@
 	si_swapinfo(&i);
 	committed = atomic_read(&vm_committed_space);
 
+	vmtot = (VMALLOC_END-VMALLOC_START)>>10;
+	vmi = get_vmalloc_info();
+	vmi.used >>= 10;
+	vmi.largest_chunk >>= 10;
+
 	/*
 	 * Tagged format, for easy grepping and expansion.
 	 */
@@ -178,7 +221,9 @@
 		"Slab:         %8lu kB\n"
 		"Committed_AS: %8u kB\n"
 		"PageTables:   %8lu kB\n"
-		"ReverseMaps:  %8lu\n",
+		"VmallocTotal: %8lu kB\n"
+		"VmallocUsed:  %8lu kB\n"
+		"VmallocChunk: %8lu kB\n",
 		K(i.totalram),
 		K(i.freeram),
 		K(i.bufferram),
@@ -198,7 +243,9 @@
 		K(ps.nr_slab),
 		K(committed),
 		K(ps.nr_page_table_pages),
-		ps.nr_reverse_maps
+		vmtot,
+		vmi.used,
+		vmi.largest_chunk
 		);
 
 		len += hugetlb_report_meminfo(page + len);
@@ -388,7 +435,7 @@
 extern int show_interrupts(struct seq_file *p, void *v);
 static int interrupts_open(struct inode *inode, struct file *file)
 {
-	unsigned size = PAGE_SIZE * (1 + NR_CPUS / 8);
+	unsigned size = 4096 * (1 + num_online_cpus() / 8);
 	char *buf = kmalloc(size, GFP_KERNEL);
 	struct seq_file *m;
 	int res;
diff -Nru a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
--- a/fs/proc/task_mmu.c	Sat Apr 19 19:51:28 2003
+++ b/fs/proc/task_mmu.c	Sat Apr 19 19:51:28 2003
@@ -45,13 +45,7 @@
 
 unsigned long task_vsize(struct mm_struct *mm)
 {
-	struct vm_area_struct *vma;
-	unsigned long vsize = 0;
-
-	for (vma = mm->mmap; vma; vma = vma->vm_next)
-		vsize += vma->vm_end - vma->vm_start;
-
-	return vsize;
+	return PAGE_SIZE * mm->total_vm;
 }
 
 int task_statm(struct mm_struct *mm, int *shared, int *text,
diff -Nru a/fs/read_write.c b/fs/read_write.c
--- a/fs/read_write.c	Sat Apr 19 19:51:49 2003
+++ b/fs/read_write.c	Sat Apr 19 19:51:49 2003
@@ -135,7 +135,7 @@
 
 #if !defined(__alpha__)
 asmlinkage long sys_llseek(unsigned int fd, unsigned long offset_high,
-			   unsigned long offset_low, loff_t * result,
+			   unsigned long offset_low, loff_t __user * result,
 			   unsigned int origin)
 {
 	int retval;
@@ -167,7 +167,7 @@
 }
 #endif
 
-ssize_t do_sync_read(struct file *filp, char *buf, size_t len, loff_t *ppos)
+ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
 {
 	struct kiocb kiocb;
 	ssize_t ret;
@@ -181,7 +181,7 @@
 	return ret;
 }
 
-ssize_t vfs_read(struct file *file, char *buf, size_t count, loff_t *pos)
+ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
 {
 	struct inode *inode = file->f_dentry->d_inode;
 	ssize_t ret;
@@ -207,7 +207,7 @@
 	return ret;
 }
 
-ssize_t do_sync_write(struct file *filp, const char *buf, size_t len, loff_t *ppos)
+ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
 {
 	struct kiocb kiocb;
 	ssize_t ret;
@@ -221,7 +221,7 @@
 	return ret;
 }
 
-ssize_t vfs_write(struct file *file, const char *buf, size_t count, loff_t *pos)
+ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
 {
 	struct inode *inode = file->f_dentry->d_inode;
 	ssize_t ret;
@@ -247,7 +247,7 @@
 	return ret;
 }
 
-asmlinkage ssize_t sys_read(unsigned int fd, char * buf, size_t count)
+asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
 {
 	struct file *file;
 	ssize_t ret = -EBADF;
@@ -261,7 +261,7 @@
 	return ret;
 }
 
-asmlinkage ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
+asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
 {
 	struct file *file;
 	ssize_t ret = -EBADF;
@@ -275,7 +275,7 @@
 	return ret;
 }
 
-asmlinkage ssize_t sys_pread64(unsigned int fd, char *buf,
+asmlinkage ssize_t sys_pread64(unsigned int fd, char __user *buf,
 			     size_t count, loff_t pos)
 {
 	struct file *file;
@@ -293,7 +293,7 @@
 	return ret;
 }
 
-asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char *buf,
+asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char __user *buf,
 			      size_t count, loff_t pos)
 {
 	struct file *file;
@@ -332,15 +332,15 @@
 }
 
 static ssize_t do_readv_writev(int type, struct file *file,
-			       const struct iovec * vector,
+			       const struct iovec __user * uvector,
 			       unsigned long nr_segs, loff_t *pos)
 {
-	typedef ssize_t (*io_fn_t)(struct file *, char *, size_t, loff_t *);
+	typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
 	typedef ssize_t (*iov_fn_t)(struct file *, const struct iovec *, unsigned long, loff_t *);
 
 	size_t tot_len;
 	struct iovec iovstack[UIO_FASTIOV];
-	struct iovec *iov=iovstack;
+	struct iovec *iov=iovstack, *vector;
 	ssize_t ret;
 	int seg;
 	io_fn_t fn;
@@ -372,7 +372,7 @@
 			goto out;
 	}
 	ret = -EFAULT;
-	if (copy_from_user(iov, vector, nr_segs*sizeof(*vector)))
+	if (copy_from_user(iov, uvector, nr_segs*sizeof(*uvector)))
 		goto out;
 
 	/*
@@ -423,7 +423,7 @@
 	ret = 0;
 	vector = iov;
 	while (nr_segs > 0) {
-		void * base;
+		void __user * base;
 		size_t len;
 		ssize_t nr;
 
@@ -451,7 +451,7 @@
 	return ret;
 }
 
-ssize_t vfs_readv(struct file *file, const struct iovec *vec,
+ssize_t vfs_readv(struct file *file, const struct iovec __user *vec,
 		  unsigned long vlen, loff_t *pos)
 {
 	if (!(file->f_mode & FMODE_READ))
@@ -462,7 +462,7 @@
 	return do_readv_writev(READ, file, vec, vlen, pos);
 }
 
-ssize_t vfs_writev(struct file *file, const struct iovec *vec,
+ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
 		   unsigned long vlen, loff_t *pos)
 {
 	if (!(file->f_mode & FMODE_WRITE))
@@ -475,7 +475,7 @@
 
 
 asmlinkage ssize_t
-sys_readv(unsigned long fd, const struct iovec *vec, unsigned long vlen)
+sys_readv(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
 {
 	struct file *file;
 	ssize_t ret = -EBADF;
@@ -490,7 +490,7 @@
 }
 
 asmlinkage ssize_t
-sys_writev(unsigned long fd, const struct iovec *vec, unsigned long vlen)
+sys_writev(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
 {
 	struct file *file;
 	ssize_t ret = -EBADF;
@@ -586,7 +586,7 @@
 	return retval;
 }
 
-asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
+asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t __user *offset, size_t count)
 {
 	loff_t pos;
 	off_t off;
@@ -605,7 +605,7 @@
 	return do_sendfile(out_fd, in_fd, NULL, count, MAX_NON_LFS);
 }
 
-asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t *offset, size_t count)
+asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t __user *offset, size_t count)
 {
 	loff_t pos;
 	ssize_t ret;
diff -Nru a/fs/readdir.c b/fs/readdir.c
--- a/fs/readdir.c	Sat Apr 19 19:51:47 2003
+++ b/fs/readdir.c	Sat Apr 19 19:51:47 2003
@@ -58,7 +58,7 @@
 };
 
 struct readdir_callback {
-	struct old_linux_dirent * dirent;
+	struct old_linux_dirent __user * dirent;
 	int count;
 };
 
@@ -66,7 +66,7 @@
 		      ino_t ino, unsigned int d_type)
 {
 	struct readdir_callback * buf = (struct readdir_callback *) __buf;
-	struct old_linux_dirent * dirent;
+	struct old_linux_dirent __user * dirent;
 
 	if (buf->count)
 		return -EINVAL;
@@ -85,7 +85,7 @@
 	return 0;
 }
 
-asmlinkage long old_readdir(unsigned int fd, void * dirent, unsigned int count)
+asmlinkage long old_readdir(unsigned int fd, struct old_linux_dirent __user * dirent, unsigned int count)
 {
 	int error;
 	struct file * file;
@@ -122,8 +122,8 @@
 };
 
 struct getdents_callback {
-	struct linux_dirent * current_dir;
-	struct linux_dirent * previous;
+	struct linux_dirent __user * current_dir;
+	struct linux_dirent __user * previous;
 	int count;
 	int error;
 };
@@ -131,7 +131,7 @@
 static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
 		   ino_t ino, unsigned int d_type)
 {
-	struct linux_dirent * dirent;
+	struct linux_dirent __user * dirent;
 	struct getdents_callback * buf = (struct getdents_callback *) __buf;
 	int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1);
 
@@ -161,10 +161,10 @@
 	return -EFAULT;
 }
 
-asmlinkage long sys_getdents(unsigned int fd, void * dirent, unsigned int count)
+asmlinkage long sys_getdents(unsigned int fd, struct linux_dirent __user * dirent, unsigned int count)
 {
 	struct file * file;
-	struct linux_dirent * lastdirent;
+	struct linux_dirent __user * lastdirent;
 	struct getdents_callback buf;
 	int error;
 
@@ -177,7 +177,7 @@
 	if (!file)
 		goto out;
 
-	buf.current_dir = (struct linux_dirent *) dirent;
+	buf.current_dir = dirent;
 	buf.previous = NULL;
 	buf.count = count;
 	buf.error = 0;
@@ -203,8 +203,8 @@
 #define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
 
 struct getdents_callback64 {
-	struct linux_dirent64 * current_dir;
-	struct linux_dirent64 * previous;
+	struct linux_dirent64 __user * current_dir;
+	struct linux_dirent64 __user * previous;
 	int count;
 	int error;
 };
@@ -212,7 +212,7 @@
 static int filldir64(void * __buf, const char * name, int namlen, loff_t offset,
 		     ino_t ino, unsigned int d_type)
 {
-	struct linux_dirent64 *dirent;
+	struct linux_dirent64 __user *dirent;
 	struct getdents_callback64 * buf = (struct getdents_callback64 *) __buf;
 	int reclen = ROUND_UP64(NAME_OFFSET(dirent) + namlen + 1);
 
@@ -246,10 +246,10 @@
 	return -EFAULT;
 }
 
-asmlinkage long sys_getdents64(unsigned int fd, void * dirent, unsigned int count)
+asmlinkage long sys_getdents64(unsigned int fd, struct linux_dirent64 __user * dirent, unsigned int count)
 {
 	struct file * file;
-	struct linux_dirent64 * lastdirent;
+	struct linux_dirent64 __user * lastdirent;
 	struct getdents_callback64 buf;
 	int error;
 
@@ -262,7 +262,7 @@
 	if (!file)
 		goto out;
 
-	buf.current_dir = (struct linux_dirent64 *) dirent;
+	buf.current_dir = dirent;
 	buf.previous = NULL;
 	buf.count = count;
 	buf.error = 0;
@@ -273,9 +273,8 @@
 	error = buf.error;
 	lastdirent = buf.previous;
 	if (lastdirent) {
-		struct linux_dirent64 d;
-		d.d_off = file->f_pos;
-		__put_user(d.d_off, &lastdirent->d_off);
+		typeof(lastdirent->d_off) d_off = file->f_pos;
+		__put_user(d_off, &lastdirent->d_off);
 		error = count - buf.count;
 	}
 
diff -Nru a/fs/select.c b/fs/select.c
--- a/fs/select.c	Sat Apr 19 19:51:28 2003
+++ b/fs/select.c	Sat Apr 19 19:51:28 2003
@@ -179,9 +179,9 @@
 	int retval, i, off;
 	long __timeout = *timeout;
 
- 	read_lock(&current->files->file_lock);
+ 	spin_lock(&current->files->file_lock);
 	retval = max_select_fd(n, fds);
-	read_unlock(&current->files->file_lock);
+	spin_unlock(&current->files->file_lock);
 
 	if (retval < 0)
 		return retval;
@@ -268,7 +268,7 @@
 	((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1)
 
 asmlinkage long
-sys_select(int n, fd_set *inp, fd_set *outp, fd_set *exp, struct timeval *tvp)
+sys_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp)
 {
 	fd_set_bits fds;
 	char *bits;
@@ -429,7 +429,7 @@
 	return count;
 }
 
-asmlinkage long sys_poll(struct pollfd * ufds, unsigned int nfds, long timeout)
+asmlinkage long sys_poll(struct pollfd __user * ufds, unsigned int nfds, long timeout)
 {
 	struct poll_wqueues table;
  	int fdcount, err;
diff -Nru a/fs/seq_file.c b/fs/seq_file.c
--- a/fs/seq_file.c	Sat Apr 19 19:51:49 2003
+++ b/fs/seq_file.c	Sat Apr 19 19:51:49 2003
@@ -43,7 +43,7 @@
  *
  *	Ready-made ->f_op->read()
  */
-ssize_t seq_read(struct file *file, char *buf, size_t size, loff_t *ppos)
+ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
 {
 	struct seq_file *m = (struct seq_file *)file->private_data;
 	size_t copied = 0;
diff -Nru a/fs/stat.c b/fs/stat.c
--- a/fs/stat.c	Sat Apr 19 19:51:28 2003
+++ b/fs/stat.c	Sat Apr 19 19:51:28 2003
@@ -56,7 +56,7 @@
 	return 0;
 }
 
-int vfs_stat(char *name, struct kstat *stat)
+int vfs_stat(char __user *name, struct kstat *stat)
 {
 	struct nameidata nd;
 	int error;
@@ -69,7 +69,7 @@
 	return error;
 }
 
-int vfs_lstat(char *name, struct kstat *stat)
+int vfs_lstat(char __user *name, struct kstat *stat)
 {
 	struct nameidata nd;
 	int error;
@@ -102,7 +102,7 @@
  * For backward compatibility?  Maybe this should be moved
  * into arch/i386 instead?
  */
-static int cp_old_stat(struct kstat *stat, struct __old_kernel_stat * statbuf)
+static int cp_old_stat(struct kstat *stat, struct __old_kernel_stat __user * statbuf)
 {
 	static int warncount = 5;
 	struct __old_kernel_stat tmp;
@@ -134,7 +134,7 @@
 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
 }
 
-asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf)
+asmlinkage long sys_stat(char __user * filename, struct __old_kernel_stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_stat(filename, &stat);
@@ -144,7 +144,7 @@
 
 	return error;
 }
-asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf)
+asmlinkage long sys_lstat(char __user * filename, struct __old_kernel_stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_lstat(filename, &stat);
@@ -154,7 +154,7 @@
 
 	return error;
 }
-asmlinkage long sys_fstat(unsigned int fd, struct __old_kernel_stat * statbuf)
+asmlinkage long sys_fstat(unsigned int fd, struct __old_kernel_stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_fstat(fd, &stat);
@@ -167,7 +167,7 @@
 
 #endif
 
-static int cp_new_stat(struct kstat *stat, struct stat *statbuf)
+static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)
 {
 	struct stat tmp;
 
@@ -197,7 +197,7 @@
 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
 }
 
-asmlinkage long sys_newstat(char * filename, struct stat * statbuf)
+asmlinkage long sys_newstat(char __user * filename, struct stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_stat(filename, &stat);
@@ -207,7 +207,7 @@
 
 	return error;
 }
-asmlinkage long sys_newlstat(char * filename, struct stat * statbuf)
+asmlinkage long sys_newlstat(char __user * filename, struct stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_lstat(filename, &stat);
@@ -217,7 +217,7 @@
 
 	return error;
 }
-asmlinkage long sys_newfstat(unsigned int fd, struct stat * statbuf)
+asmlinkage long sys_newfstat(unsigned int fd, struct stat __user * statbuf)
 {
 	struct kstat stat;
 	int error = vfs_fstat(fd, &stat);
@@ -228,7 +228,7 @@
 	return error;
 }
 
-asmlinkage long sys_readlink(const char * path, char * buf, int bufsiz)
+asmlinkage long sys_readlink(const char __user * path, char __user * buf, int bufsiz)
 {
 	struct nameidata nd;
 	int error;
@@ -257,7 +257,7 @@
 /* ---------- LFS-64 ----------- */
 #if !defined(__alpha__) && !defined(__ia64__) && !defined(__mips64) && !defined(__x86_64__) && !defined(CONFIG_ARCH_S390X)
 
-static long cp_new_stat64(struct kstat *stat, struct stat64 *statbuf)
+static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf)
 {
 	struct stat64 tmp;
 
@@ -284,7 +284,7 @@
 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
 }
 
-asmlinkage long sys_stat64(char * filename, struct stat64 * statbuf, long flags)
+asmlinkage long sys_stat64(char __user * filename, struct stat64 __user * statbuf, long flags)
 {
 	struct kstat stat;
 	int error = vfs_stat(filename, &stat);
@@ -294,7 +294,7 @@
 
 	return error;
 }
-asmlinkage long sys_lstat64(char * filename, struct stat64 * statbuf, long flags)
+asmlinkage long sys_lstat64(char __user * filename, struct stat64 __user * statbuf, long flags)
 {
 	struct kstat stat;
 	int error = vfs_lstat(filename, &stat);
@@ -304,7 +304,7 @@
 
 	return error;
 }
-asmlinkage long sys_fstat64(unsigned long fd, struct stat64 * statbuf, long flags)
+asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf, long flags)
 {
 	struct kstat stat;
 	int error = vfs_fstat(fd, &stat);
diff -Nru a/fs/super.c b/fs/super.c
--- a/fs/super.c	Sat Apr 19 19:51:47 2003
+++ b/fs/super.c	Sat Apr 19 19:51:47 2003
@@ -407,7 +407,7 @@
 	return NULL;
 }
 
-asmlinkage long sys_ustat(dev_t dev, struct ustat * ubuf)
+asmlinkage long sys_ustat(dev_t dev, struct ustat __user * ubuf)
 {
         struct super_block *s;
         struct ustat tmp;
diff -Nru a/fs/xfs/linux/xfs_aops.c b/fs/xfs/linux/xfs_aops.c
--- a/fs/xfs/linux/xfs_aops.c	Sat Apr 19 19:51:50 2003
+++ b/fs/xfs/linux/xfs_aops.c	Sat Apr 19 19:51:50 2003
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-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
@@ -48,8 +48,11 @@
 	clear_buffer_unwritten(bh);
 	if (!uptodate)
 		pagebuf_ioerror(pb, -EIO);
-	if (atomic_dec_and_test(&pb->pb_io_remaining) == 1)
+	if (atomic_dec_and_test(&pb->pb_io_remaining) == 1) {
 		pagebuf_iodone(pb, 1, 1);
+		pb->pb_flags &= ~_PBF_LOCKABLE;
+		pagebuf_rele(pb);
+	}
 	end_buffer_async_write(bh, uptodate);
 }
 
@@ -160,7 +163,7 @@
 	delta -= mp->pbm_offset;
 	delta >>= block_bits;
 
-	sector_shift = block_bits - 9;
+	sector_shift = block_bits - BBSHIFT;
 	bn = mp->pbm_bn >> sector_shift;
 	bn += delta;
 	ASSERT((bn << sector_shift) >= mp->pbm_bn);
@@ -282,7 +285,7 @@
 		total += bh->b_size;
 	} while ((bh = bh->b_this_page) != head);
 
-	/* if we reached the end of the page, sum forwards in
+	/* If we reached the end of the page, sum forwards in
 	 * following pages.
 	 */
 	if (bh == head) {
@@ -438,8 +441,11 @@
 	XFS_BUF_SET_FSPRIVATE(pb, LINVFS_GET_VP(inode)->v_fbhv);
 	XFS_BUF_SET_IODONE_FUNC(pb, xfs_unwritten_conv);
 
-	if (atomic_dec_and_test(&pb->pb_io_remaining) == 1)
+	if (atomic_dec_and_test(&pb->pb_io_remaining) == 1) {
 		pagebuf_iodone(pb, 1, 1);
+		pb->pb_flags &= ~_PBF_LOCKABLE;
+		pagebuf_rele(pb);
+	}
 
 	return 0;
 }
@@ -729,8 +735,8 @@
 					page_dirty = 0;
 				}
 			} else if (startio) {
-				if (buffer_uptodate(bh)) {
-					lock_buffer(bh);
+				if (buffer_uptodate(bh) &&
+				    !test_and_set_bit(BH_Lock, &bh->b_state)) {
 					bh_arr[cnt++] = bh;
 					page_dirty = 0;
 				}
@@ -753,8 +759,7 @@
 	}
 
 	if (mp) {
-		cluster_write(inode, page->index + 1, mp,
-				startio, unmapped);
+		cluster_write(inode, page->index + 1, mp, startio, unmapped);
 	}
 
 	return page_dirty;
@@ -763,7 +768,7 @@
 	for (i = 0; i < cnt; i++) {
 		unlock_buffer(bh_arr[i]);
 	}
-	
+
 	/*
 	 * If it's delalloc and we have nowhere to put it,
 	 * throw it away, unless the lower layers told
@@ -806,8 +811,7 @@
 		size = 1 << inode->i_blkbits;
 
 	VOP_BMAP(vp, offset, size,
-		create ? flags : PBF_READ,
-		(struct page_buf_bmap_s *)&pbmap, &retpbbm, error);
+		create ? flags : PBF_READ, &pbmap, &retpbbm, error);
 	if (error)
 		return -error;
 
@@ -825,7 +829,7 @@
 			delta = offset - pbmap.pbm_offset;
 			delta >>= inode->i_blkbits;
 
-			bn = pbmap.pbm_bn >> (inode->i_blkbits - 9);
+			bn = pbmap.pbm_bn >> (inode->i_blkbits - BBSHIFT);
 			bn += delta;
 
 			bh_result->b_blocknr = bn;
diff -Nru a/fs/xfs/linux/xfs_file.c b/fs/xfs/linux/xfs_file.c
--- a/fs/xfs/linux/xfs_file.c	Sat Apr 19 19:51:48 2003
+++ b/fs/xfs/linux/xfs_file.c	Sat Apr 19 19:51:48 2003
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-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
@@ -136,6 +136,7 @@
 	return linvfs_writev(iocb->ki_filp, &iov, 1, &iocb->ki_pos);
 }
 
+
 STATIC ssize_t
 linvfs_sendfile(
 	struct file		*filp,
@@ -199,9 +200,7 @@
 		flags |= FSYNC_DATA;
 
 	ASSERT(vp);
-
 	VOP_FSYNC(vp, flags, NULL, (xfs_off_t)0, (xfs_off_t)-1, error);
-
 	return -error;
 }
 
@@ -287,6 +286,7 @@
 	kfree(read_buf);
 	return -error;
 }
+
 
 STATIC int
 linvfs_file_mmap(
diff -Nru a/fs/xfs/linux/xfs_globals.c b/fs/xfs/linux/xfs_globals.c
--- a/fs/xfs/linux/xfs_globals.c	Sat Apr 19 19:51:49 2003
+++ b/fs/xfs/linux/xfs_globals.c	Sat Apr 19 19:51:49 2003
@@ -49,11 +49,6 @@
 xfs_param_t xfs_params = { 0, 1, 0, 0, 0, 3 };
 
 /*
- * Used to serialize atomicIncWithWrap.
- */
-spinlock_t xfs_atomic_spin = SPIN_LOCK_UNLOCKED;
-
-/*
  * Global system credential structure.
  */
 cred_t sys_cred_val, *sys_cred = &sys_cred_val;
diff -Nru a/fs/xfs/linux/xfs_globals.h b/fs/xfs/linux/xfs_globals.h
--- a/fs/xfs/linux/xfs_globals.h	Sat Apr 19 19:51:46 2003
+++ b/fs/xfs/linux/xfs_globals.h	Sat Apr 19 19:51:46 2003
@@ -38,11 +38,7 @@
  */
 
 extern uint64_t xfs_panic_mask;		/* set to cause more panics */
-
 extern unsigned long xfs_physmem;
-
-extern spinlock_t xfs_atomic_spin;
-
 extern struct cred *sys_cred;
 
 #endif	/* __XFS_GLOBALS_H__ */
diff -Nru a/fs/xfs/linux/xfs_ioctl.c b/fs/xfs/linux/xfs_ioctl.c
--- a/fs/xfs/linux/xfs_ioctl.c	Sat Apr 19 19:51:50 2003
+++ b/fs/xfs/linux/xfs_ioctl.c	Sat Apr 19 19:51:50 2003
@@ -39,11 +39,6 @@
 #include <linux/pagemap.h>
 
 
-extern int xfs_change_file_space(bhv_desc_t *, int,
-			xfs_flock64_t *, xfs_off_t, cred_t *, int);
-extern int xfs_set_dmattrs(bhv_desc_t *, u_int, u_int16_t, cred_t *);
-
-
 /*
  * xfs_find_handle maps from userspace xfs_fsop_handlereq structure to
  * a file or fs handle.
diff -Nru a/fs/xfs/linux/xfs_lrw.c b/fs/xfs/linux/xfs_lrw.c
--- a/fs/xfs/linux/xfs_lrw.c	Sat Apr 19 19:51:27 2003
+++ b/fs/xfs/linux/xfs_lrw.c	Sat Apr 19 19:51:27 2003
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-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
diff -Nru a/fs/xfs/linux/xfs_lrw.h b/fs/xfs/linux/xfs_lrw.h
--- a/fs/xfs/linux/xfs_lrw.h	Sat Apr 19 19:51:28 2003
+++ b/fs/xfs/linux/xfs_lrw.h	Sat Apr 19 19:51:28 2003
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-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
diff -Nru a/fs/xfs/linux/xfs_super.c b/fs/xfs/linux/xfs_super.c
--- a/fs/xfs/linux/xfs_super.c	Sat Apr 19 19:51:50 2003
+++ b/fs/xfs/linux/xfs_super.c	Sat Apr 19 19:51:50 2003
@@ -257,7 +257,7 @@
 	};
 	struct proc_xfs_info	*xfs_infop;
 	struct xfs_mount	*mp = XFS_BHVTOM(bhv);
-	char b[BDEVNAME_SIZE];
+	char			b[BDEVNAME_SIZE];
 
 	for (xfs_infop = xfs_info; xfs_infop->flag; xfs_infop++) {
 		if (mp->m_flags & xfs_infop->flag)
diff -Nru a/fs/xfs/support/atomic.h b/fs/xfs/support/atomic.h
--- a/fs/xfs/support/atomic.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2000-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.
- *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like.	 Any license provided herein, whether implied or
- * otherwise, applies only to this software file.  Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc., 59
- * Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
- */
-#ifndef __XFS_SUPPORT_ATOMIC_H__
-#define __XFS_SUPPORT_ATOMIC_H__
-
-#include <linux/version.h>
-#include <linux/time.h>
-#include <linux/wait.h>
-#include <linux/sched.h>
-#include <asm/atomic.h>
-#include <asm/semaphore.h>
-
-/*
- * This is used for two variables in XFS, one of which is a debug trace
- * buffer index. They are not accessed via any other atomic operations
- * so this is safe. All other atomic increments and decrements in XFS
- * now use the Linux built-in functions.
- */
-
-extern spinlock_t xfs_atomic_spin;
-
-static __inline__ int atomicIncWithWrap(int *ip, int val)
-{
-	unsigned long flags;
-	int ret;
-	spin_lock_irqsave(&xfs_atomic_spin, flags);
-	ret = *ip;
-	(*ip)++;
-	if (*ip == val) *ip = 0;
-	spin_unlock_irqrestore(&xfs_atomic_spin, flags);
-	return ret;
-}
-
-#endif /* __XFS_SUPPORT_ATOMIC_H__ */
diff -Nru a/fs/xfs/support/ktrace.c b/fs/xfs/support/ktrace.c
--- a/fs/xfs/support/ktrace.c	Sat Apr 19 19:51:46 2003
+++ b/fs/xfs/support/ktrace.c	Sat Apr 19 19:51:46 2003
@@ -37,7 +37,6 @@
 #include "kmem.h"
 #include "spin.h"
 #include "debug.h"
-#include "atomic.h"
 #include "ktrace.h"
 
 #if	(defined(DEBUG) || defined(CONFIG_XFS_VNODE_TRACING))
@@ -181,6 +180,7 @@
 	void		*val14,
 	void		*val15)
 {
+	static lock_t   wrap_lock = SPIN_LOCK_UNLOCKED;
 	int		index;
 	ktrace_entry_t	*ktep;
 
@@ -189,7 +189,11 @@
 	/*
 	 * Grab an entry by pushing the index up to the next one.
 	 */
-	index = atomicIncWithWrap(&ktp->kt_index, ktp->kt_nentries);
+	spin_lock(&wrap_lock);
+	index = ktp->kt_index;
+	if (++ktp->kt_index == ktp->kt_nentries)
+		ktp->kt_index = 0;
+	spin_unlock(&wrap_lock);
 
 	if (!ktp->kt_rollover && index == ktp->kt_nentries - 1)
 		ktp->kt_rollover = 1;
diff -Nru a/fs/xfs/xfs.h b/fs/xfs/xfs.h
--- a/fs/xfs/xfs.h	Sat Apr 19 19:51:29 2003
+++ b/fs/xfs/xfs.h	Sat Apr 19 19:51:29 2003
@@ -46,7 +46,6 @@
 #include <support/ktrace.h>
 #include <support/mutex.h>
 #include <support/sema.h>
-#include <support/atomic.h>
 #include <support/debug.h>
 #include <support/move.h>
 #include <support/uuid.h>
diff -Nru a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h
--- a/fs/xfs/xfs_bmap_btree.h	Sat Apr 19 19:51:47 2003
+++ b/fs/xfs/xfs_bmap_btree.h	Sat Apr 19 19:51:47 2003
@@ -459,6 +459,8 @@
 #endif
 
 
+#ifdef __KERNEL__
+
 /*
  * Prototypes for xfs_bmap.c to call.
  */
@@ -706,5 +708,6 @@
 	xfs_bmbt_irec_t *,
 	xfs_bmbt_irec_t *);
 
+#endif	/* __KERNEL__ */
 
 #endif	/* __XFS_BMAP_BTREE_H__ */
diff -Nru a/fs/xfs/xfs_dmapi.h b/fs/xfs/xfs_dmapi.h
--- a/fs/xfs/xfs_dmapi.h	Sat Apr 19 19:51:50 2003
+++ b/fs/xfs/xfs_dmapi.h	Sat Apr 19 19:51:50 2003
@@ -186,7 +186,7 @@
 
 extern struct bhv_vfsops xfs_dmops;
 
-extern void xfs_dm_init(void);
-extern void xfs_dm_exit(void);
+extern int dmapi_init(void);
+extern void dmapi_uninit(void);
 
 #endif	/* __XFS_DMAPI_H__ */
diff -Nru a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h
--- a/fs/xfs/xfs_fs.h	Sat Apr 19 19:51:29 2003
+++ b/fs/xfs/xfs_fs.h	Sat Apr 19 19:51:29 2003
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1995-2002 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 1995-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.1 of the GNU Lesser General Public License
@@ -44,21 +44,25 @@
  * d_miniosz is the min xfer size, xfer size multiple and file seek offset
  * alignment.
  */
+#ifndef HAVE_DIOATTR
 struct dioattr {
 	__u32		d_mem;		/* data buffer memory alignment */
 	__u32		d_miniosz;	/* min xfer size		*/
 	__u32		d_maxiosz;	/* max xfer size		*/
 };
+#endif
 
 /*
  * Structure for XFS_IOC_FSGETXATTR[A] and XFS_IOC_FSSETXATTR.
  */
+#ifndef HAVE_FSXATTR
 struct fsxattr {
 	__u32		fsx_xflags;	/* xflags field value (get/set) */
 	__u32		fsx_extsize;	/* extsize field value (get/set)*/
 	__u32		fsx_nextents;	/* nextents field value (get)	*/
 	unsigned char	fsx_pad[16];
 };
+#endif
 
 /*
  * Flags for the bs_xflags/fsx_xflags field
@@ -79,6 +83,7 @@
  * number of array elements given.  The first structure is updated on
  * return to give the offset and length for the next call.
  */
+#ifndef HAVE_GETBMAP
 struct getbmap {
 	__s64		bmv_offset;	/* file offset of segment in blocks */
 	__s64		bmv_block;	/* starting block (64-bit daddr_t)  */
@@ -86,6 +91,7 @@
 	__s32		bmv_count;	/* # of entries in array incl. 1st  */
 	__s32		bmv_entries;	/* # of entries filled in (output)  */
 };
+#endif
 
 /*
  *	Structure for XFS_IOC_GETBMAPX.	 Fields bmv_offset through bmv_entries
@@ -96,6 +102,7 @@
  *	in by the XFS_IOC_GETBMAPX command for each returned structure after
  *	the first.
  */
+#ifndef HAVE_GETBMAPX
 struct getbmapx {
 	__s64		bmv_offset;	/* file offset of segment in blocks */
 	__s64		bmv_block;	/* starting block (64-bit daddr_t)  */
@@ -107,6 +114,7 @@
 	__s32		bmv_unused1;	/* future use			    */
 	__s32		bmv_unused2;	/* future use			    */
 };
+#endif
 
 /*	bmv_iflags values - set by XFS_IOC_GETBMAPX caller.	*/
 #define BMV_IF_ATTRFORK		0x1	/* return attr fork rather than data */
@@ -136,11 +144,13 @@
  * only values previously obtained via xfs_bulkstat!  (Specifically the
  * xfs_bstat_t fields bs_dmevmask and bs_dmstate.)
  */
+#ifndef HAVE_FSDMIDATA
 struct fsdmidata {
 	__u32		fsd_dmevmask;	/* corresponds to di_dmevmask */
 	__u16		fsd_padding;
 	__u16		fsd_dmstate;	/* corresponds to di_dmstate  */
 };
+#endif
 
 /*
  * File segment locking set data type for 64 bit access.
@@ -391,7 +401,7 @@
  * This is typically called by a stateless file server in order to generate
  * "file handles".
  */
-#ifndef MAXFIDSZ
+#ifndef HAVE_FID
 #define MAXFIDSZ	46
 typedef struct fid {
 	__u16		fid_len;		/* length of data in bytes */
@@ -472,7 +482,7 @@
 #define XFS_IOC_FSGROWFSLOG	     _IOW ('X', 111, struct xfs_growfs_log)
 #define XFS_IOC_FSGROWFSRT	     _IOW ('X', 112, struct xfs_growfs_rt)
 #define XFS_IOC_FSCOUNTS	     _IOR ('X', 113, struct xfs_fsop_counts)
-#define XFS_IOC_SET_RESBLKS	     _IOR ('X', 114, struct xfs_fsop_resblks)
+#define XFS_IOC_SET_RESBLKS	     _IOWR('X', 114, struct xfs_fsop_resblks)
 #define XFS_IOC_GET_RESBLKS	     _IOR ('X', 115, struct xfs_fsop_resblks)
 #define XFS_IOC_ERROR_INJECTION	     _IOW ('X', 116, struct xfs_error_injection)
 #define XFS_IOC_ERROR_CLEARALL	     _IOW ('X', 117, struct xfs_error_injection)
@@ -486,6 +496,7 @@
 /*	XFS_IOC_GETFSUUID ---------- deprecated 140	 */
 
 
+#ifndef HAVE_BBMACROS
 /*
  * Block I/O parameterization.	A basic block (BB) is the lowest size of
  * filesystem allocation, and must equal 512.  Length units given to bio
@@ -497,5 +508,6 @@
 #define BTOBB(bytes)	(((__u64)(bytes) + BBSIZE - 1) >> BBSHIFT)
 #define BTOBBT(bytes)	((__u64)(bytes) >> BBSHIFT)
 #define BBTOB(bbs)	((bbs) << BBSHIFT)
+#endif
 
 #endif	/* __XFS_FS_H__ */
diff -Nru a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c
--- a/fs/xfs/xfs_ialloc.c	Sat Apr 19 19:51:48 2003
+++ b/fs/xfs/xfs_ialloc.c	Sat Apr 19 19:51:48 2003
@@ -336,6 +336,21 @@
 	return 0;
 }
 
+STATIC __inline xfs_agnumber_t
+xfs_ialloc_next_ag(
+	xfs_mount_t	*mp)
+{
+	xfs_agnumber_t	agno;
+
+	spin_lock(&mp->m_agirotor_lock);
+	agno = mp->m_agirotor;
+	if (++mp->m_agirotor == mp->m_maxagi)
+		mp->m_agirotor = 0;
+	spin_unlock(&mp->m_agirotor_lock);
+
+	return agno;
+}
+
 /*
  * Select an allocation group to look for a free inode in, based on the parent
  * inode and then mode.	 Return the allocation group buffer.
@@ -366,7 +381,7 @@
 	mp = tp->t_mountp;
 	agcount = mp->m_maxagi;
 	if (S_ISDIR(mode))
-		pagno = atomicIncWithWrap((int *)&mp->m_agirotor, agcount);
+		pagno = xfs_ialloc_next_ag(mp);
 	else {
 		pagno = XFS_INO_TO_AGNO(mp, parent);
 		if (pagno >= agcount)
@@ -394,7 +409,7 @@
 			agbp = NULL;
 
 		if (!pag->pagi_inodeok) {
-			atomicIncWithWrap((int *)&mp->m_agirotor, agcount);
+			xfs_ialloc_next_ag(mp);
 			goto unlock_nextag;
 		}
 
diff -Nru a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c
--- a/fs/xfs/xfs_iget.c	Sat Apr 19 19:51:50 2003
+++ b/fs/xfs/xfs_iget.c	Sat Apr 19 19:51:50 2003
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000-2002 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-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
diff -Nru a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
--- a/fs/xfs/xfs_inode.c	Sat Apr 19 19:51:50 2003
+++ b/fs/xfs/xfs_inode.c	Sat Apr 19 19:51:50 2003
@@ -3608,31 +3608,6 @@
 	ip->i_update_core = 1;
 }
 
-/*
- * xfs_ibusy_check -- Checks whether inode reference count allows unmount
- *
- * The value returned is one if the reference count would prevent an unmount.
- */
-int
-xfs_ibusy_check(
-	xfs_inode_t	*ip,
-	int		refs)
-{
-	xfs_mount_t	*mp = ip->i_mount;
-
-	if ((refs == 1) && (ip == mp->m_rootip))
-		return (0);
-	if ((refs == 1) && (ip == mp->m_rbmip))
-		return (0);
-	if ((refs == 1) && (ip == mp->m_rsumip))
-		return (0);
-	if (mp->m_quotainfo && ip->i_ino == mp->m_sb.sb_uquotino)
-		return (0);
-	if (mp->m_quotainfo && ip->i_ino == mp->m_sb.sb_gquotino)
-		return (0);
-	return (1);
-}
-
 #ifdef XFS_ILOCK_TRACE
 void
 xfs_ilock_trace(xfs_inode_t *ip, int lock, unsigned int lockflags, inst_t *ra)
diff -Nru a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h
--- a/fs/xfs/xfs_inode.h	Sat Apr 19 19:51:49 2003
+++ b/fs/xfs/xfs_inode.h	Sat Apr 19 19:51:49 2003
@@ -516,7 +516,6 @@
 int		xfs_iextents_copy(xfs_inode_t *, xfs_bmbt_rec_t *, int);
 int		xfs_iflush(xfs_inode_t *, uint);
 int		xfs_iflush_all(struct xfs_mount *, int);
-int		xfs_ibusy_check(xfs_inode_t *, int);
 int		xfs_iaccess(xfs_inode_t *, mode_t, cred_t *);
 uint		xfs_iroundup(uint);
 void		xfs_ichgtime(xfs_inode_t *, int);
diff -Nru a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
--- a/fs/xfs/xfs_mount.c	Sat Apr 19 19:51:46 2003
+++ b/fs/xfs/xfs_mount.c	Sat Apr 19 19:51:46 2003
@@ -509,6 +509,7 @@
 	int	i;
 
 	mp->m_agfrotor = mp->m_agirotor = 0;
+	spinlock_init(&mp->m_agirotor_lock, "m_agirotor_lock");
 	mp->m_maxagi = mp->m_sb.sb_agcount;
 	mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG;
 	mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
diff -Nru a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
--- a/fs/xfs/xfs_mount.h	Sat Apr 19 19:51:27 2003
+++ b/fs/xfs/xfs_mount.h	Sat Apr 19 19:51:27 2003
@@ -291,6 +291,7 @@
 	int			m_bsize;	/* fs logical block size */
 	xfs_agnumber_t		m_agfrotor;	/* last ag where space found */
 	xfs_agnumber_t		m_agirotor;	/* last ag dir inode alloced */
+	lock_t			m_agirotor_lock;/* .. and lock protecting it */
 	xfs_agnumber_t		m_maxagi;	/* highest inode alloc group */
 	int			m_ihsize;	/* size of next field */
 	struct xfs_ihash	*m_ihash;	/* fs private inode hash table*/
diff -Nru a/fs/xfs/xfs_rw.h b/fs/xfs/xfs_rw.h
--- a/fs/xfs/xfs_rw.h	Sat Apr 19 19:51:28 2003
+++ b/fs/xfs/xfs_rw.h	Sat Apr 19 19:51:28 2003
@@ -153,39 +153,55 @@
 xfs_bioerror(
 	struct xfs_buf		*b);
 
-/*
- * XFS I/O core functions
- */
-extern int xfs_bioerror_relse(struct xfs_buf *);
+int
+xfs_bioerror_relse(
+	struct xfs_buf		*b);
+
+int
+xfs_read_buf(
+	struct xfs_mount	*mp,
+	xfs_buftarg_t		*target,
+	xfs_daddr_t		blkno,
+	int			len,
+	uint			flags,
+	struct xfs_buf		**bpp);
+
+void
+xfs_ioerror_alert(
+	char			*func,
+	struct xfs_mount	*mp,
+	xfs_buf_t		*bp,
+	xfs_daddr_t		blkno);
 
 
 /*
- * Needed by xfs_rw.c
+ * Prototypes for functions in xfs_vnodeops.c.
  */
+
 int
 xfs_rwlock(
-	bhv_desc_t	*bdp,
-	vrwlock_t	write_lock);
+	bhv_desc_t		*bdp,
+	vrwlock_t		write_lock);
 
 void
 xfs_rwunlock(
-	bhv_desc_t	*bdp,
-	vrwlock_t	write_lock);
+	bhv_desc_t		*bdp,
+	vrwlock_t		write_lock);
 
 int
-xfs_read_buf(
-	struct xfs_mount *mp,
-	xfs_buftarg_t	 *target,
-	xfs_daddr_t	 blkno,
-	int		 len,
-	uint		 flags,
-	struct xfs_buf	 **bpp);
+xfs_change_file_space(
+	bhv_desc_t		*bdp,
+	int			cmd,
+	xfs_flock64_t		*bf,
+	xfs_off_t		offset,
+	cred_t			*credp,
+	int			flags);
 
-void
-xfs_ioerror_alert(
-	char			*func,
-	struct xfs_mount	*mp,
-	xfs_buf_t		*bp,
-	xfs_daddr_t		blkno);
+int
+xfs_set_dmattrs(
+	bhv_desc_t		*bdp,
+	u_int			evmask,
+	u_int16_t		state,
+	cred_t			*credp);
 
 #endif /* __XFS_RW_H__ */
diff -Nru a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c
--- a/fs/xfs/xfs_vfsops.c	Sat Apr 19 19:51:28 2003
+++ b/fs/xfs/xfs_vfsops.c	Sat Apr 19 19:51:28 2003
@@ -34,9 +34,7 @@
 
 #include <xfs.h>
 
-STATIC int xfs_ibusy(xfs_mount_t *);
 STATIC int xfs_sync(bhv_desc_t *, int, cred_t *);
-STATIC int xfs_unmount(bhv_desc_t *, int, cred_t *);
 
 int
 xfs_init(void)
@@ -485,59 +483,6 @@
 	return error;
 }
 
-/*
- * xfs_ibusy searches for a busy inode in the mounted file system.
- *
- * Return 0 if there are no active inodes otherwise return 1.
- */
-STATIC int
-xfs_ibusy(
-	xfs_mount_t	*mp)
-{
-	xfs_inode_t	*ip;
-	vnode_t		*vp;
-	int		busy;
-
-	busy = 0;
-
-	XFS_MOUNT_ILOCK(mp);
-
-	ip = mp->m_inodes;
-	if (ip == NULL) {
-		XFS_MOUNT_IUNLOCK(mp);
-		return busy;
-	}
-
-	do {
-		/* Skip markers inserted by xfs_sync */
-		if (ip->i_mount == NULL) {
-			ip = ip->i_mnext;
-			continue;
-		}
-
-		vp = XFS_ITOV_NULL(ip);
-
-		if (vp && vn_count(vp) != 0) {
-			if (xfs_ibusy_check(ip, vn_count(vp)) == 0) {
-				ip = ip->i_mnext;
-				continue;
-			}
-#ifdef DEBUG
-			cmn_err(CE_WARN, "%s: busy vp=0x%p ip=0x%p "
-					 "inum %Ld count=%d",
-				__FUNCTION__, vp, ip, ip->i_ino, vn_count(vp));
-#endif
-			busy++;
-		}
-		ip = ip->i_mnext;
-	} while ((ip != mp->m_inodes) && !busy);
-
-	XFS_MOUNT_IUNLOCK(mp);
-
-	return busy;
-}
-
-
 STATIC int
 xfs_unmount(
 	bhv_desc_t	*bdp,
@@ -570,16 +515,6 @@
 		unmount_event_wanted = 1;
 		unmount_event_flags = (mp->m_dmevmask & (1<<DM_EVENT_UNMOUNT))?
 					0 : DM_FLAGS_UNWANTED;
-	}
-
-	/*
-	 * Make sure there are no active users.
-	 */
-	if (xfs_ibusy(mp)) {
-		error = XFS_ERROR(EBUSY);
-		cmn_err(CE_ALERT, "%s: xfs_ibusy failed -- error code %d",
-			__FUNCTION__, error);
-		goto out;
 	}
 
 	XFS_bflush(mp->m_ddev_targp);
diff -Nru a/include/asm-alpha/bitops.h b/include/asm-alpha/bitops.h
--- a/include/asm-alpha/bitops.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-alpha/bitops.h	Sat Apr 19 19:51:47 2003
@@ -487,7 +487,9 @@
 
 
 #define ext2_set_bit                 __test_and_set_bit
+#define ext2_set_bit_atomic(l,n,a)   test_and_set_bit(n,a)
 #define ext2_clear_bit               __test_and_clear_bit
+#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
 #define ext2_test_bit                test_bit
 #define ext2_find_first_zero_bit     find_first_zero_bit
 #define ext2_find_next_zero_bit      find_next_zero_bit
diff -Nru a/include/asm-alpha/cacheflush.h b/include/asm-alpha/cacheflush.h
--- a/include/asm-alpha/cacheflush.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-alpha/cacheflush.h	Sat Apr 19 19:51:49 2003
@@ -9,7 +9,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_page(page)			do { } while (0)
 
 /* Note that the following two definitions are _highly_ dependent
diff -Nru a/include/asm-alpha/core_t2.h b/include/asm-alpha/core_t2.h
--- a/include/asm-alpha/core_t2.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-alpha/core_t2.h	Sat Apr 19 19:51:47 2003
@@ -3,8 +3,9 @@
 
 #include <linux/config.h>
 #include <linux/types.h>
+#include <linux/spinlock.h>
 #include <asm/compiler.h>
-
+#include <asm/system.h>
 
 /*
  * T2 is the internal name for the core logic chipset which provides
@@ -22,6 +23,7 @@
 #define T2_MEM_R1_MASK 0x07ffffff  /* Mem sparse region 1 mask is 26 bits */
 
 /* GAMMA-SABLE is a SABLE with EV5-based CPUs */
+/* All LYNX machines, EV4 or EV5, use the GAMMA bias also */
 #define _GAMMA_BIAS		0x8000000000UL
 
 #if defined(CONFIG_ALPHA_GENERIC)
@@ -57,10 +59,33 @@
 #define T2_WMASK2		(IDENT_ADDR + GAMMA_BIAS + 0x38e0001c0UL)
 #define T2_TBASE2		(IDENT_ADDR + GAMMA_BIAS + 0x38e0001e0UL)
 #define T2_TLBBR		(IDENT_ADDR + GAMMA_BIAS + 0x38e000200UL)
-
+#define T2_IVR			(IDENT_ADDR + GAMMA_BIAS + 0x38e000220UL)
 #define T2_HAE_3		(IDENT_ADDR + GAMMA_BIAS + 0x38e000240UL)
 #define T2_HAE_4		(IDENT_ADDR + GAMMA_BIAS + 0x38e000260UL)
 
+/* The CSRs below are T3/T4 only */
+#define T2_WBASE3		(IDENT_ADDR + GAMMA_BIAS + 0x38e000280UL)
+#define T2_WMASK3		(IDENT_ADDR + GAMMA_BIAS + 0x38e0002a0UL)
+#define T2_TBASE3		(IDENT_ADDR + GAMMA_BIAS + 0x38e0002c0UL)
+
+#define T2_TDR0			(IDENT_ADDR + GAMMA_BIAS + 0x38e000300UL)
+#define T2_TDR1			(IDENT_ADDR + GAMMA_BIAS + 0x38e000320UL)
+#define T2_TDR2			(IDENT_ADDR + GAMMA_BIAS + 0x38e000340UL)
+#define T2_TDR3			(IDENT_ADDR + GAMMA_BIAS + 0x38e000360UL)
+#define T2_TDR4			(IDENT_ADDR + GAMMA_BIAS + 0x38e000380UL)
+#define T2_TDR5			(IDENT_ADDR + GAMMA_BIAS + 0x38e0003a0UL)
+#define T2_TDR6			(IDENT_ADDR + GAMMA_BIAS + 0x38e0003c0UL)
+#define T2_TDR7			(IDENT_ADDR + GAMMA_BIAS + 0x38e0003e0UL)
+
+#define T2_WBASE4		(IDENT_ADDR + GAMMA_BIAS + 0x38e000400UL)
+#define T2_WMASK4		(IDENT_ADDR + GAMMA_BIAS + 0x38e000420UL)
+#define T2_TBASE4		(IDENT_ADDR + GAMMA_BIAS + 0x38e000440UL)
+
+#define T2_AIR			(IDENT_ADDR + GAMMA_BIAS + 0x38e000460UL)
+#define T2_VAR			(IDENT_ADDR + GAMMA_BIAS + 0x38e000480UL)
+#define T2_DIR			(IDENT_ADDR + GAMMA_BIAS + 0x38e0004a0UL)
+#define T2_ICE			(IDENT_ADDR + GAMMA_BIAS + 0x38e0004c0UL)
+
 #define T2_HAE_ADDRESS		T2_HAE_1
 
 /*  T2 CSRs are in the non-cachable primary IO space from 3.8000.0000 to
@@ -100,6 +125,9 @@
 #define T2_CPU1_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x381000000L)
 #define T2_CPU2_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x382000000L)
 #define T2_CPU3_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x383000000L)
+
+#define T2_CPUn_BASE(n)		(T2_CPU0_BASE + (((n)&3) * 0x001000000L))
+
 #define T2_MEM0_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x388000000L)
 #define T2_MEM1_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x389000000L)
 #define T2_MEM2_BASE            (IDENT_ADDR + GAMMA_BIAS + 0x38a000000L)
@@ -408,87 +436,120 @@
 	set_hae(msb); \
 }
 
+static spinlock_t t2_hae_lock = SPIN_LOCK_UNLOCKED;
+
 __EXTERN_INLINE u8 t2_readb(unsigned long addr)
 {
 	unsigned long result, msb;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
 	result = *(vip) ((addr << 5) + T2_SPARSE_MEM + 0x00);
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
 	return __kernel_extbl(result, addr & 3);
 }
 
 __EXTERN_INLINE u16 t2_readw(unsigned long addr)
 {
 	unsigned long result, msb;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
 	result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08);
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
 	return __kernel_extwl(result, addr & 3);
 }
 
-/* On SABLE with T2, we must use SPARSE memory even for 32-bit access. */
+/*
+ * On SABLE with T2, we must use SPARSE memory even for 32-bit access,
+ * because we cannot access all of DENSE without changing its HAE.
+ */
 __EXTERN_INLINE u32 t2_readl(unsigned long addr)
 {
-	unsigned long msb;
+	unsigned long result, msb;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
-	return *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18);
+	result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18);
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
+	return result & 0xffffffffUL;
 }
 
 __EXTERN_INLINE u64 t2_readq(unsigned long addr)
 {
 	unsigned long r0, r1, work, msb;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
 	work = (addr << 5) + T2_SPARSE_MEM + 0x18;
 	r0 = *(vuip)(work);
 	r1 = *(vuip)(work + (4 << 5));
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
 	return r1 << 32 | r0;
 }
 
 __EXTERN_INLINE void t2_writeb(u8 b, unsigned long addr)
 {
 	unsigned long msb, w;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
 	w = __kernel_insbl(b, addr & 3);
 	*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = w;
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
 }
 
 __EXTERN_INLINE void t2_writew(u16 b, unsigned long addr)
 {
 	unsigned long msb, w;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
 	w = __kernel_inswl(b, addr & 3);
 	*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = w;
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
 }
 
-/* On SABLE with T2, we must use SPARSE memory even for 32-bit access. */
+/*
+ * On SABLE with T2, we must use SPARSE memory even for 32-bit access,
+ * because we cannot access all of DENSE without changing its HAE.
+ */
 __EXTERN_INLINE void t2_writel(u32 b, unsigned long addr)
 {
 	unsigned long msb;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
 	*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b;
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
 }
 
 __EXTERN_INLINE void t2_writeq(u64 b, unsigned long addr)
 {
 	unsigned long msb, work;
+	unsigned long flags;
+	spin_lock_irqsave(&t2_hae_lock, flags);
 
 	t2_set_hae;
 
 	work = (addr << 5) + T2_SPARSE_MEM + 0x18;
 	*(vuip)work = b;
 	*(vuip)(work + (4 << 5)) = b >> 32;
+	spin_unlock_irqrestore(&t2_hae_lock, flags);
 }
 
 __EXTERN_INLINE unsigned long t2_ioremap(unsigned long addr, 
diff -Nru a/include/asm-alpha/irq.h b/include/asm-alpha/irq.h
--- a/include/asm-alpha/irq.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-alpha/irq.h	Sat Apr 19 19:51:51 2003
@@ -42,6 +42,7 @@
 # define NR_IRQS	40
 
 #elif defined(CONFIG_ALPHA_DP264) || \
+      defined(CONFIG_ALPHA_LYNX)  || \
       defined(CONFIG_ALPHA_SHARK) || \
       defined(CONFIG_ALPHA_EIGER)
 # define NR_IRQS	64
diff -Nru a/include/asm-alpha/mmu_context.h b/include/asm-alpha/mmu_context.h
--- a/include/asm-alpha/mmu_context.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-alpha/mmu_context.h	Sat Apr 19 19:51:47 2003
@@ -232,8 +232,9 @@
 	for (i = 0; i < NR_CPUS; i++)
 		if (cpu_online(i))
 			mm->context[i] = 0;
-        tsk->thread_info->pcb.ptbr
-	  = ((unsigned long)mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
+	if (tsk != current)
+		tsk->thread_info->pcb.ptbr
+		  = ((unsigned long)mm->pgd - IDENT_ADDR) >> PAGE_SHIFT;
 	return 0;
 }
 
diff -Nru a/include/asm-alpha/mmzone.h b/include/asm-alpha/mmzone.h
--- a/include/asm-alpha/mmzone.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-alpha/mmzone.h	Sat Apr 19 19:51:50 2003
@@ -51,7 +51,7 @@
 #ifdef CONFIG_DISCONTIGMEM
 
 /*
- * Following are macros that each numa implmentation must define.
+ * Following are macros that each numa implementation must define.
  */
 
 /*
diff -Nru a/include/asm-alpha/pci.h b/include/asm-alpha/pci.h
--- a/include/asm-alpha/pci.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-alpha/pci.h	Sat Apr 19 19:51:27 2003
@@ -78,7 +78,7 @@
 /* Free and unmap a consistent DMA buffer.  CPU_ADDR and DMA_ADDR must
    be values that were returned from pci_alloc_consistent.  SIZE must
    be the same as what as passed into pci_alloc_consistent.
-   References to the memory and mappings assosciated with CPU_ADDR or
+   References to the memory and mappings associated with CPU_ADDR or
    DMA_ADDR past this call are illegal.  */
 
 extern void pci_free_consistent(struct pci_dev *, size_t, void *, dma_addr_t);
@@ -118,7 +118,7 @@
 	(((PTR)->LEN_NAME) = (VAL))
 
 /* Map a set of buffers described by scatterlist in streaming mode for
-   PCI DMA.  This is the scather-gather version of the above
+   PCI DMA.  This is the scatter-gather version of the above
    pci_map_single interface.  Here the scatter gather list elements
    are each tagged with the appropriate PCI dma address and length.
    They are obtained via sg_dma_{address,length}(SG).
diff -Nru a/include/asm-alpha/posix_types.h b/include/asm-alpha/posix_types.h
--- a/include/asm-alpha/posix_types.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-alpha/posix_types.h	Sat Apr 19 19:51:49 2003
@@ -40,6 +40,8 @@
 typedef __kernel_uid_t __kernel_uid32_t;
 typedef __kernel_gid_t __kernel_gid32_t;
 
+typedef unsigned int	__kernel_old_dev_t;
+
 #ifdef __KERNEL__
 
 #ifndef __GNUC__
diff -Nru a/include/asm-alpha/uaccess.h b/include/asm-alpha/uaccess.h
--- a/include/asm-alpha/uaccess.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-alpha/uaccess.h	Sat Apr 19 19:51:50 2003
@@ -31,7 +31,7 @@
 
 
 /*
- * Is a address valid? This does a straighforward calculation rather
+ * Is a address valid? This does a straightforward calculation rather
  * than tests.
  *
  * Address valid if:
diff -Nru a/include/asm-alpha/unistd.h b/include/asm-alpha/unistd.h
--- a/include/asm-alpha/unistd.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-alpha/unistd.h	Sat Apr 19 19:51:46 2003
@@ -610,8 +610,12 @@
  * "Conditional" syscalls
  *
  * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
+ * but it doesn't work on all toolchains, so we just do it by hand.
+ *
+ * Note that we do *not* provide a parameter list to avoid 
+ * conflicting with one of the syscall declarations in some
+ * of the relevant header files (including this one).
  */
-#define cond_syscall(x) asmlinkage long x(void) __attribute__((weak,alias("sys_ni_syscall")));
+#define cond_syscall(x) asmlinkage long x() __attribute__((weak,alias("sys_ni_syscall")));
 
 #endif /* _ALPHA_UNISTD_H */
diff -Nru a/include/asm-arm/arch-iop310/dma.h b/include/asm-arm/arch-iop310/dma.h
--- a/include/asm-arm/arch-iop310/dma.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,109 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop80310/dma.h
- *
- *  Copyright (C) 2001 MontaVista 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.
- */
-
-#ifndef _IOP310_DMA_H_
-#define _IOP310_DMA_H_
-
-/* 2 DMA on primary PCI and 1 on secondary for 80310 */
-#define MAX_IOP310_DMA_CHANNEL   3
-#define MAX_DMA_DESC        	64	/*128 */
-
-/*
- * Make the generic DMA bits go away since we don't use it
- */
-#define MAX_DMA_CHANNELS	0
-
-#define MAX_DMA_ADDRESS		0xffffffff
-
-#define IOP310_DMA_P0      	0
-#define IOP310_DMA_P1		1
-#define IOP310_DMA_S0      	2
-
-#define DMA_MOD_READ        	0x0001
-#define DMA_MOD_WRITE		0x0002
-#define DMA_MOD_CACHED		0x0004
-#define DMA_MOD_NONCACHED	0x0008
-
-
-#define DMA_DESC_DONE   	0x0010
-#define DMA_INCOMPLETE  	0x0020
-#define DMA_HOLD		0x0040
-#define DMA_END_CHAIN		0x0080
-#define DMA_COMPLETE		0x0100
-#define DMA_NOTIFY		0x0200
-#define DMA_NEW_HEAD		0x0400
-
-#define DMA_USER_MASK	(DMA_NOTIFY | DMA_INCOMPLETE | \
-						 DMA_HOLD | DMA_COMPLETE)
-
-#define DMA_DCR_DAC		0x00000020	/* Dual Addr Cycle Enab */
-#define DMA_DCR_IE		0x00000010	/* Interrupt Enable */
-#define DMA_DCR_PCI_IOR		0x00000002	/* I/O Read */
-#define DMA_DCR_PCI_IOW		0x00000003	/* I/O Write */
-#define DMA_DCR_PCI_MR		0x00000006	/* Memory Read */
-#define DMA_DCR_PCI_MW		0x00000007	/* Memory Write */
-#define DMA_DCR_PCI_CR		0x0000000A	/* Configuration Read */
-#define DMA_DCR_PCI_CW		0x0000000B	/* Configuration Write */
-#define DMA_DCR_PCI_MRM		0x0000000C	/* Memory Read Multiple */
-#define DMA_DCR_PCI_MRL		0x0000000E	/* Memory Read Line */
-#define DMA_DCR_PCI_MWI		0x0000000F	/* Mem Write and Inval */
-
-#define DMA_USER_CMD_IE		0x00000001	/* user request int */
-#define DMA_USER_END_CHAIN	0x00000002	/* end of sgl chain flag */
-
-/* ATU defines */
-#define     IOP310_ATUCR_PRIM_OUT_ENAB  /* Configuration   */      0x00000002
-#define     IOP310_ATUCR_DIR_ADDR_ENAB  /* Configuration   */      0x00000080
-
-
-typedef void (*dma_callback_t) (void *buf_context);
-/*
- * DMA Descriptor
- */
-typedef struct _dma_desc
-{
-	u32 NDAR;					/* next descriptor address */
-	u32 PDAR;					/* PCI address */
-	u32 PUADR;					/* upper PCI address */
-	u32 LADR;					/* local address */
-	u32 BC;						/* byte count */
-	u32 DC;						/* descriptor control */
-} dma_desc_t;
-
-typedef struct _dma_sgl
-{
-	dma_desc_t dma_desc;		/* DMA descriptor pointer */
-	u32 status;					/* descriptor status */
-	void *data;					/* local virt */
-	struct _dma_sgl *next;		/* next descriptor */
-} dma_sgl_t;
-
-/* dma sgl head */
-typedef struct _dma_head
-{
-	u32 total;					/* total elements in SGL */
-	u32 status;					/* status of sgl */
-	u32 mode;					/* read or write mode */
-	dma_sgl_t *list;			/* pointer to list */
-	dma_callback_t callback;	/* callback function */
-} dma_head_t;
-
-/* function prototypes */
-int dma_request(dmach_t, const char *);
-int dma_queue_buffer(dmach_t, dma_head_t *);
-int dma_suspend(dmach_t);
-int dma_resume(dmach_t);
-int dma_flush_all(dmach_t);
-void dma_free(dmach_t);
-void dma_set_irq_threshold(dmach_t, int);
-dma_sgl_t *dma_get_buffer(dmach_t, int);
-void dma_return_buffer(dmach_t, dma_sgl_t *);
-
-#endif /* _ASM_ARCH_DMA_H */
diff -Nru a/include/asm-arm/arch-iop310/hardware.h b/include/asm-arm/arch-iop310/hardware.h
--- a/include/asm-arm/arch-iop310/hardware.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,38 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop80310/hardware.h
- */
-#ifndef __ASM_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H
-
-#include <linux/config.h>
-
-/*
- * Note about PCI IO space mappings
- *
- * To make IO space accesses efficient, we store virtual addresses in
- * the IO resources.
- *
- * The PCI IO space is located at virtual 0xfe000000 from physical
- * 0x90000000.  The PCI BARs must be programmed with physical addresses,
- * but when we read them, we convert them to virtual addresses.  See
- * arch/arm/mach-iop310/iop310-pci.c
- */
-
-#define pcibios_assign_all_busses() 1
-
-/*
- * these are the values for the secondary PCI bus on the 80312 chip.  I will
- * have to do some fixup in the bus/dev fixup code
- */
-#define PCIBIOS_MIN_IO      0
-#define PCIBIOS_MIN_MEM     0x88000000
-
-// Generic chipset bits
-#include "iop310.h"
-
-// Board specific
-#if defined(CONFIG_ARCH_IQ80310)
-#include "iq80310.h"
-#endif
-
-#endif  /* _ASM_ARCH_HARDWARE_H */
diff -Nru a/include/asm-arm/arch-iop310/ide.h b/include/asm-arm/arch-iop310/ide.h
--- a/include/asm-arm/arch-iop310/ide.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,51 +0,0 @@
-/*
- * include/asm-arm/arch-iop310/ide.h
- *
- * Generic IDE functions for IOP310 systems
- *
- * Author: Deepak Saxena <dsaxena@mvista.com>
- *
- * Copyright 2001 MontaVista Software Inc.
- *
- * 09/26/2001 - Sharon Baartmans
- * 	Fixed so it actually works.
- */
-
-#ifndef _ASM_ARCH_IDE_H_
-#define _ASM_ARCH_IDE_H_
-
-/*
- * Set up a hw structure for a specified data port, control port and IRQ.
- * This should follow whatever the default interface uses.
- */
-static __inline__ void
-ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
-{
-	ide_ioreg_t reg;
-	int i;
-	int regincr = 1;
-
-	memset(hw, 0, sizeof(*hw));
-
-	reg = (ide_ioreg_t)data_port;
-
-	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
-		hw->io_ports[i] = reg;
-		reg += regincr;
-	}
-
-	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
-
-	if (irq) *irq = 0;
-}
-
-/*
- * This registers the standard ports for this architecture with the IDE
- * driver.
- */
-static __inline__ void ide_init_default_hwifs(void)
-{
-	/* There are no standard ports */
-}
-
-#endif
diff -Nru a/include/asm-arm/arch-iop310/io.h b/include/asm-arm/arch-iop310/io.h
--- a/include/asm-arm/arch-iop310/io.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,20 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop310/io.h
- *
- *  Copyright (C) 2001  MontaVista 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.
- */
-
-#ifndef __ASM_ARM_ARCH_IO_H
-#define __ASM_ARM_ARCH_IO_H
-
-#define IO_SPACE_LIMIT 0xffffffff
-
-#define __io(p)			((p))
-#define __mem_pci(a)		((unsigned long)(a))
-#define __mem_isa(a)		((unsigned long)(a))
-
-#endif
diff -Nru a/include/asm-arm/arch-iop310/iop310.h b/include/asm-arm/arch-iop310/iop310.h
--- a/include/asm-arm/arch-iop310/iop310.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,247 +0,0 @@
-/*
- * linux/include/asm/arch-iop310/iop310.h
- *
- * Intel IOP310 Compainion Chip definitions
- *
- * 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.
- */
-
-#ifndef _IOP310_HW_H_
-#define _IOP310_HW_H_
-
-/*
- * IOP310 I/O and Mem space regions for PCI autoconfiguration
- */
-#define IOP310_PCISEC_LOWER_IO		0x90010000
-#define IOP310_PCISEC_UPPER_IO		0x9001ffff
-#define IOP310_PCISEC_LOWER_MEM		0x88000000
-#define IOP310_PCISEC_UPPER_MEM		0x8bffffff
-
-#define IOP310_PCIPRI_LOWER_IO		0x90000000
-#define IOP310_PCIPRI_UPPER_IO		0x9000ffff
-#define IOP310_PCIPRI_LOWER_MEM		0x80000000
-#define IOP310_PCIPRI_UPPER_MEM		0x83ffffff
-
-#define IOP310_PCI_WINDOW_SIZE		64 * 0x100000
-
-/*
- * IOP310 chipset registers
- */
-#define IOP310_VIRT_MEM_BASE 0xe8001000  /* chip virtual mem address*/
-#define IOP310_PHY_MEM_BASE  0x00001000  /* chip physical memory address */
-#define IOP310_REG_ADDR(reg) (IOP310_VIRT_MEM_BASE | IOP310_PHY_MEM_BASE | (reg))
-
-/* PCI-to-PCI Bridge Unit 0x00001000 through 0x000010FF */
-#define IOP310_VIDR    (volatile u16 *)IOP310_REG_ADDR(0x00001000)
-#define IOP310_DIDR    (volatile u16 *)IOP310_REG_ADDR(0x00001002)
-#define IOP310_PCR     (volatile u16 *)IOP310_REG_ADDR(0x00001004)
-#define IOP310_PSR     (volatile u16 *)IOP310_REG_ADDR(0x00001006)
-#define IOP310_RIDR    (volatile u8  *)IOP310_REG_ADDR(0x00001008)
-#define IOP310_CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001009)
-#define IOP310_CLSR    (volatile u8  *)IOP310_REG_ADDR(0x0000100C)
-#define IOP310_PLTR    (volatile u8  *)IOP310_REG_ADDR(0x0000100D)
-#define IOP310_HTR     (volatile u8  *)IOP310_REG_ADDR(0x0000100E)
-/* Reserved 0x0000100F through  0x00001017 */
-#define IOP310_PBNR    (volatile u8  *)IOP310_REG_ADDR(0x00001018)
-#define IOP310_SBNR    (volatile u8  *)IOP310_REG_ADDR(0x00001019)
-#define IOP310_SUBBNR  (volatile u8  *)IOP310_REG_ADDR(0x0000101A)
-#define IOP310_SLTR    (volatile u8  *)IOP310_REG_ADDR(0x0000101B)
-#define IOP310_IOBR    (volatile u8  *)IOP310_REG_ADDR(0x0000101C)
-#define IOP310_IOLR    (volatile u8  *)IOP310_REG_ADDR(0x0000101D)
-#define IOP310_SSR     (volatile u16 *)IOP310_REG_ADDR(0x0000101E)
-#define IOP310_MBR     (volatile u16 *)IOP310_REG_ADDR(0x00001020)
-#define IOP310_MLR     (volatile u16 *)IOP310_REG_ADDR(0x00001022)
-#define IOP310_PMBR    (volatile u16 *)IOP310_REG_ADDR(0x00001024)
-#define IOP310_PMLR    (volatile u16 *)IOP310_REG_ADDR(0x00001026)
-/* Reserved 0x00001028 through 0x00001033 */
-#define IOP310_CAPR    (volatile u8  *)IOP310_REG_ADDR(0x00001034)
-/* Reserved 0x00001035 through 0x0000103D */
-#define IOP310_BCR     (volatile u16 *)IOP310_REG_ADDR(0x0000103E)
-#define IOP310_EBCR    (volatile u16 *)IOP310_REG_ADDR(0x00001040)
-#define IOP310_SISR    (volatile u16 *)IOP310_REG_ADDR(0x00001042)
-#define IOP310_PBISR   (volatile u32 *)IOP310_REG_ADDR(0x00001044)
-#define IOP310_SBISR   (volatile u32 *)IOP310_REG_ADDR(0x00001048)
-#define IOP310_SACR    (volatile u32 *)IOP310_REG_ADDR(0x0000104C)
-#define IOP310_PIRSR   (volatile u32 *)IOP310_REG_ADDR(0x00001050)
-#define IOP310_SIOBR   (volatile u8  *)IOP310_REG_ADDR(0x00001054)
-#define IOP310_SIOLR   (volatile u8  *)IOP310_REG_ADDR(0x00001055)
-#define IOP310_SCDR    (volatile u8  *)IOP310_REG_ADDR(0x00001056)
-
-#define IOP310_SMBR    (volatile u16 *)IOP310_REG_ADDR(0x00001058)
-#define IOP310_SMLR    (volatile u16 *)IOP310_REG_ADDR(0x0000105A)
-#define IOP310_SDER    (volatile u16 *)IOP310_REG_ADDR(0x0000105C)
-#define IOP310_QCR     (volatile u16 *)IOP310_REG_ADDR(0x0000105E)
-#define IOP310_CAPID   (volatile u8  *)IOP310_REG_ADDR(0x00001068)
-#define IOP310_NIPTR   (volatile u8  *)IOP310_REG_ADDR(0x00001069)
-#define IOP310_PMCR    (volatile u16 *)IOP310_REG_ADDR(0x0000106A)
-#define IOP310_PMCSR   (volatile u16 *)IOP310_REG_ADDR(0x0000106C)
-#define IOP310_PMCSRBSE (volatile u8 *)IOP310_REG_ADDR(0x0000106E)
-/* Reserved 0x00001064 through 0x000010FFH */
-
-/* Performance monitoring unit  0x00001100 through 0x000011FF*/
-#define IOP310_PMONGTMR    (volatile u32 *)IOP310_REG_ADDR(0x00001100)
-#define IOP310_PMONESR     (volatile u32 *)IOP310_REG_ADDR(0x00001104)
-#define IOP310_PMONEMISR   (volatile u32 *)IOP310_REG_ADDR(0x00001108)
-#define IOP310_PMONGTSR    (volatile u32 *)IOP310_REG_ADDR(0x00001110)
-#define IOP310_PMONPECR1   (volatile u32 *)IOP310_REG_ADDR(0x00001114)
-#define IOP310_PMONPECR2   (volatile u32 *)IOP310_REG_ADDR(0x00001118)
-#define IOP310_PMONPECR3   (volatile u32 *)IOP310_REG_ADDR(0x0000111C)
-#define IOP310_PMONPECR4   (volatile u32 *)IOP310_REG_ADDR(0x00001120)
-#define IOP310_PMONPECR5   (volatile u32 *)IOP310_REG_ADDR(0x00001124)
-#define IOP310_PMONPECR6   (volatile u32 *)IOP310_REG_ADDR(0x00001128)
-#define IOP310_PMONPECR7   (volatile u32 *)IOP310_REG_ADDR(0x0000112C)
-#define IOP310_PMONPECR8   (volatile u32 *)IOP310_REG_ADDR(0x00001130)
-#define IOP310_PMONPECR9   (volatile u32 *)IOP310_REG_ADDR(0x00001134)
-#define IOP310_PMONPECR10  (volatile u32 *)IOP310_REG_ADDR(0x00001138)
-#define IOP310_PMONPECR11  (volatile u32 *)IOP310_REG_ADDR(0x0000113C)
-#define IOP310_PMONPECR12  (volatile u32 *)IOP310_REG_ADDR(0x00001140)
-#define IOP310_PMONPECR13  (volatile u32 *)IOP310_REG_ADDR(0x00001144)
-#define IOP310_PMONPECR14  (volatile u32 *)IOP310_REG_ADDR(0x00001148)
-
-/* Address Translation Unit 0x00001200 through 0x000012FF */
-#define IOP310_ATUVID     (volatile u16 *)IOP310_REG_ADDR(0x00001200)
-#define IOP310_ATUDID     (volatile u16 *)IOP310_REG_ADDR(0x00001202)
-#define IOP310_PATUCMD    (volatile u16 *)IOP310_REG_ADDR(0x00001204)
-#define IOP310_PATUSR     (volatile u16 *)IOP310_REG_ADDR(0x00001206)
-#define IOP310_ATURID     (volatile u8  *)IOP310_REG_ADDR(0x00001208)
-#define IOP310_ATUCCR     (volatile u32 *)IOP310_REG_ADDR(0x00001209)
-#define IOP310_ATUCLSR    (volatile u8  *)IOP310_REG_ADDR(0x0000120C)
-#define IOP310_ATULT      (volatile u8  *)IOP310_REG_ADDR(0x0000120D)
-#define IOP310_ATUHTR     (volatile u8  *)IOP310_REG_ADDR(0x0000120E)
-
-#define IOP310_PIABAR     (volatile u32 *)IOP310_REG_ADDR(0x00001210)
-/* Reserved 0x00001214 through 0x0000122B */
-#define IOP310_ASVIR      (volatile u16 *)IOP310_REG_ADDR(0x0000122C)
-#define IOP310_ASIR       (volatile u16 *)IOP310_REG_ADDR(0x0000122E)
-#define IOP310_ERBAR      (volatile u32 *)IOP310_REG_ADDR(0x00001230)
-#define IOP310_ATUCAPPTR  (volatile u8  *)IOP310_REG_ADDR(0x00001234)
-/* Reserved 0x00001235 through 0x0000123B */
-#define IOP310_ATUILR     (volatile u8  *)IOP310_REG_ADDR(0x0000123C)
-#define IOP310_ATUIPR     (volatile u8  *)IOP310_REG_ADDR(0x0000123D)
-#define IOP310_ATUMGNT    (volatile u8  *)IOP310_REG_ADDR(0x0000123E)
-#define IOP310_ATUMLAT    (volatile u8  *)IOP310_REG_ADDR(0x0000123F)
-#define IOP310_PIALR      (volatile u32 *)IOP310_REG_ADDR(0x00001240)
-#define IOP310_PIATVR     (volatile u32 *)IOP310_REG_ADDR(0x00001244)
-#define IOP310_SIABAR     (volatile u32 *)IOP310_REG_ADDR(0x00001248)
-#define IOP310_SIALR      (volatile u32 *)IOP310_REG_ADDR(0x0000124C)
-#define IOP310_SIATVR     (volatile u32 *)IOP310_REG_ADDR(0x00001250)
-#define IOP310_POMWVR     (volatile u32 *)IOP310_REG_ADDR(0x00001254)
-/* Reserved 0x00001258 through 0x0000125B */
-#define IOP310_POIOWVR    (volatile u32 *)IOP310_REG_ADDR(0x0000125C)
-#define IOP310_PODWVR     (volatile u32 *)IOP310_REG_ADDR(0x00001260)
-#define IOP310_POUDR      (volatile u32 *)IOP310_REG_ADDR(0x00001264)
-#define IOP310_SOMWVR     (volatile u32 *)IOP310_REG_ADDR(0x00001268)
-#define IOP310_SOIOWVR    (volatile u32 *)IOP310_REG_ADDR(0x0000126C)
-/* Reserved 0x00001270 through 0x00001273*/
-#define IOP310_ERLR       (volatile u32 *)IOP310_REG_ADDR(0x00001274)
-#define IOP310_ERTVR      (volatile u32 *)IOP310_REG_ADDR(0x00001278)
-/* Reserved 0x00001279 through 0x0000127C*/
-#define IOP310_ATUCAPID   (volatile u8  *)IOP310_REG_ADDR(0x00001280)
-#define IOP310_ATUNIPTR   (volatile u8  *)IOP310_REG_ADDR(0x00001281)
-#define IOP310_APMCR      (volatile u16 *)IOP310_REG_ADDR(0x00001282)
-#define IOP310_APMCSR     (volatile u16 *)IOP310_REG_ADDR(0x00001284)
-/* Reserved 0x00001286 through 0x00001287 */
-#define IOP310_ATUCR      (volatile u32 *)IOP310_REG_ADDR(0x00001288)
-/* Reserved 0x00001289  through 0x0000128C*/
-#define IOP310_PATUISR    (volatile u32 *)IOP310_REG_ADDR(0x00001290)
-#define IOP310_SATUISR    (volatile u32 *)IOP310_REG_ADDR(0x00001294)
-#define IOP310_SATUCMD    (volatile u16 *)IOP310_REG_ADDR(0x00001298)
-#define IOP310_SATUSR     (volatile u16 *)IOP310_REG_ADDR(0x0000129A)
-#define IOP310_SODWVR     (volatile u32 *)IOP310_REG_ADDR(0x0000129C)
-#define IOP310_SOUDR      (volatile u32 *)IOP310_REG_ADDR(0x000012A0)
-#define IOP310_POCCAR     (volatile u32 *)IOP310_REG_ADDR(0x000012A4)
-#define IOP310_SOCCAR     (volatile u32 *)IOP310_REG_ADDR(0x000012A8)
-#define IOP310_POCCDR     (volatile u32 *)IOP310_REG_ADDR(0x000012AC)
-#define IOP310_SOCCDR     (volatile u32 *)IOP310_REG_ADDR(0x000012B0)
-#define IOP310_PAQCR      (volatile u32 *)IOP310_REG_ADDR(0x000012B4)
-#define IOP310_SAQCR      (volatile u32 *)IOP310_REG_ADDR(0x000012B8)
-#define IOP310_PATUIMR    (volatile u32 *)IOP310_REG_ADDR(0x000012BC)
-#define IOP310_SATUIMR    (volatile u32 *)IOP310_REG_ADDR(0x000012C0)
-/* Reserved 0x000012C4 through 0x000012FF */
-/* Messaging Unit 0x00001300 through 0x000013FF */
-#define IOP310_MUIMR0       (volatile u32 *)IOP310_REG_ADDR(0x00001310)
-#define IOP310_MUIMR1       (volatile u32 *)IOP310_REG_ADDR(0x00001314)
-#define IOP310_MUOMR0       (volatile u32 *)IOP310_REG_ADDR(0x00001318)
-#define IOP310_MUOMR1       (volatile u32 *)IOP310_REG_ADDR(0x0000131C)
-#define IOP310_MUIDR        (volatile u32 *)IOP310_REG_ADDR(0x00001320)
-#define IOP310_MUIISR       (volatile u32 *)IOP310_REG_ADDR(0x00001324)
-#define IOP310_MUIIMR       (volatile u32 *)IOP310_REG_ADDR(0x00001328)
-#define IOP310_MUODR        (volatile u32 *)IOP310_REG_ADDR(0x0000132C)
-#define IOP310_MUOISR       (volatile u32 *)IOP310_REG_ADDR(0x00001330)
-#define IOP310_MUOIMR       (volatile u32 *)IOP310_REG_ADDR(0x00001334)
-#define IOP310_MUMUCR       (volatile u32 *)IOP310_REG_ADDR(0x00001350)
-#define IOP310_MUQBAR       (volatile u32 *)IOP310_REG_ADDR(0x00001354)
-#define IOP310_MUIFHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001360)
-#define IOP310_MUIFTPR      (volatile u32 *)IOP310_REG_ADDR(0x00001364)
-#define IOP310_MUIPHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001368)
-#define IOP310_MUIPTPR      (volatile u32 *)IOP310_REG_ADDR(0x0000136C)
-#define IOP310_MUOFHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001370)
-#define IOP310_MUOFTPR      (volatile u32 *)IOP310_REG_ADDR(0x00001374)
-#define IOP310_MUOPHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001378)
-#define IOP310_MUOPTPR      (volatile u32 *)IOP310_REG_ADDR(0x0000137C)
-#define IOP310_MUIAR        (volatile u32 *)IOP310_REG_ADDR(0x00001380)
-/* DMA Controller 0x00001400 through 0x000014FF */
-#define IOP310_DMA0CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001400)
-#define IOP310_DMA0CSR     (volatile u32 *)IOP310_REG_ADDR(0x00001404)
-/* Reserved 0x001408 through 0x00140B */
-#define IOP310_DMA0DAR     (volatile u32 *)IOP310_REG_ADDR(0x0000140C)
-#define IOP310_DMA0NDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001410)
-#define IOP310_DMA0PADR    (volatile u32 *)IOP310_REG_ADDR(0x00001414)
-#define IOP310_DMA0PUADR   (volatile u32 *)IOP310_REG_ADDR(0x00001418)
-#define IOP310_DMA0LADR    (volatile u32 *)IOP310_REG_ADDR(0x0000141C)
-#define IOP310_DMA0BCR     (volatile u32 *)IOP310_REG_ADDR(0x00001420)
-#define IOP310_DMA0DCR     (volatile u32 *)IOP310_REG_ADDR(0x00001424)
-/* Reserved 0x00001428 through 0x0000143F */
-#define IOP310_DMA1CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001440)
-#define IOP310_DMA1CSR     (volatile u32 *)IOP310_REG_ADDR(0x00001444)
-/* Reserved 0x00001448 through 0x0000144B */
-#define IOP310_DMA1DAR     (volatile u32 *)IOP310_REG_ADDR(0x0000144C)
-#define IOP310_DMA1NDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001450)
-#define IOP310_DMA1PADR    (volatile u32 *)IOP310_REG_ADDR(0x00001454)
-#define IOP310_DMA1PUADR   (volatile u32 *)IOP310_REG_ADDR(0x00001458)
-#define IOP310_DMA1LADR    (volatile u32 *)IOP310_REG_ADDR(0x0000145C)
-#define IOP310_DMA1BCR     (volatile u32 *)IOP310_REG_ADDR(0x00001460)
-#define IOP310_DMA1DCR     (volatile u32 *)IOP310_REG_ADDR(0x00001464)
-/* Reserved 0x00001468 through 0x0000147F */
-#define IOP310_DMA2CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001480)
-#define IOP310_DMA2CSR     (volatile u32 *)IOP310_REG_ADDR(0x00001484)
-/* Reserved 0x00001488 through 0x0000148B */
-#define IOP310_DMA2DAR     (volatile u32 *)IOP310_REG_ADDR(0x0000148C)
-#define IOP310_DMA2NDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001490)
-#define IOP310_DMA2PADR    (volatile u32 *)IOP310_REG_ADDR(0x00001494)
-#define IOP310_DMA2PUADR   (volatile u32 *)IOP310_REG_ADDR(0x00001498)
-#define IOP310_DMA2LADR    (volatile u32 *)IOP310_REG_ADDR(0x0000149C)
-#define IOP310_DMA2BCR     (volatile u32 *)IOP310_REG_ADDR(0x000014A0)
-#define IOP310_DMA2DCR     (volatile u32 *)IOP310_REG_ADDR(0x000014A4)
-
-/* Memory controller 0x00001500 through 0x0015FF */
-
-/* core interface unit 0x00001640 - 0x0000167F */
-#define IOP310_CIUISR     (volatile u32 *)IOP310_REG_ADDR(0x00001644)
-
-/* PCI and Peripheral Interrupt Controller 0x00001700 - 0x0000171B */
-#define IOP310_IRQISR     (volatile u32 *)IOP310_REG_ADDR(0x00001700)
-#define IOP310_FIQ2ISR    (volatile u32 *)IOP310_REG_ADDR(0x00001704)
-#define IOP310_FIQ1ISR    (volatile u32 *)IOP310_REG_ADDR(0x00001708)
-#define IOP310_PDIDR      (volatile u32 *)IOP310_REG_ADDR(0x00001710)
-
-/* AAU registers. DJ 0x00001800 - 0x00001838 */
-#define IOP310_AAUACR    (volatile u32 *)IOP310_REG_ADDR(0x00001800)
-#define IOP310_AAUASR    (volatile u32 *)IOP310_REG_ADDR(0x00001804)
-#define IOP310_AAUADAR   (volatile u32 *)IOP310_REG_ADDR(0x00001808)
-#define IOP310_AAUANDAR  (volatile u32 *)IOP310_REG_ADDR(0x0000180C)
-#define IOP310_AAUSAR1   (volatile u32 *)IOP310_REG_ADDR(0x00001810)
-#define IOP310_AAUSAR2   (volatile u32 *)IOP310_REG_ADDR(0x00001814)
-#define IOP310_AAUSAR3   (volatile u32 *)IOP310_REG_ADDR(0x00001818)
-#define IOP310_AAUSAR4   (volatile u32 *)IOP310_REG_ADDR(0x0000181C)
-#define IOP310_AAUDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001820)
-#define IOP310_AAUABCR   (volatile u32 *)IOP310_REG_ADDR(0x00001824)
-#define IOP310_AAUADCR   (volatile u32 *)IOP310_REG_ADDR(0x00001828)
-#define IOP310_AAUSAR5   (volatile u32 *)IOP310_REG_ADDR(0x0000182C)
-#define IOP310_AAUSAR6   (volatile u32 *)IOP310_REG_ADDR(0x00001830)
-#define IOP310_AAUSAR7   (volatile u32 *)IOP310_REG_ADDR(0x00001834)
-#define IOP310_AAUSAR8   (volatile u32 *)IOP310_REG_ADDR(0x00001838)
-
-#endif // _IOP310_HW_H_
diff -Nru a/include/asm-arm/arch-iop310/iq80310.h b/include/asm-arm/arch-iop310/iq80310.h
--- a/include/asm-arm/arch-iop310/iq80310.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,30 +0,0 @@
-/*
- * linux/include/asm/arch-iop80310/iq80310.h
- *
- * Intel IQ-80310 evaluation board registers
- */
-
-#ifndef _IQ80310_H_
-#define _IQ80310_H_
-
-#define IQ80310_RAMBASE      0xa0000000
-#define IQ80310_UART1        0xfe800000    /* UART #1 */
-#define IQ80310_UART2        0xfe810000    /* UART #2 */
-#define IQ80310_INT_STAT     0xfe820000    /* Interrupt (XINT3#) Status */
-#define IQ80310_BOARD_REV    0xfe830000    /* Board revision register */
-#define IQ80310_CPLD_REV     0xfe840000    /* CPLD revision register */
-#define IQ80310_7SEG_1       0xfe840000    /* 7-Segment MSB */
-#define IQ80310_7SEG_0       0xfe850000    /* 7-Segment LSB (WO) */
-#define IQ80310_PCI_INT_STAT 0xfe850000    /* PCI Interrupt  Status */
-#define IQ80310_INT_MASK     0xfe860000    /* Interrupt (XINT3#) Mask */
-#define IQ80310_BACKPLANE    0xfe870000    /* Backplane Detect */
-#define IQ80310_TIMER_LA0    0xfe880000    /* Timer LA0 */
-#define IQ80310_TIMER_LA1    0xfe890000    /* Timer LA1 */
-#define IQ80310_TIMER_LA2    0xfe8a0000    /* Timer LA2 */
-#define IQ80310_TIMER_LA3    0xfe8b0000    /* Timer LA3 */
-#define IQ80310_TIMER_EN     0xfe8c0000    /* Timer Enable */
-#define IQ80310_ROTARY_SW    0xfe8d0000    /* Rotary Switch */
-#define IQ80310_JTAG         0xfe8e0000    /* JTAG Port Access */
-#define IQ80310_BATT_STAT    0xfe8f0000    /* Battery Status */
-
-#endif	// _IQ80310_H_
diff -Nru a/include/asm-arm/arch-iop310/irqs.h b/include/asm-arm/arch-iop310/irqs.h
--- a/include/asm-arm/arch-iop310/irqs.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,80 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop310/irqs.h
- *
- * Author:	Nicolas Pitre
- * Copyright:	(C) 2001 MontaVista 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.
- *
- * 06/13/01: Added 80310 on-chip interrupt sources <dsaxena@mvista.com>
- *
- */
-#include <linux/config.h>
-
-/*
- * XS80200 specific IRQs
- */
-#define IRQ_XS80200_BCU		0	/* Bus Control Unit */
-#define IRQ_XS80200_PMU		1	/* Performance Monitoring Unit */
-#define IRQ_XS80200_EXTIRQ	2	/* external IRQ signal */
-#define IRQ_XS80200_EXTFIQ	3	/* external IRQ signal */
-
-#define NR_XS80200_IRQS		4
-
-#define XSCALE_PMU_IRQ		IRQ_XS80200_PMU
-
-/*
- * IOP80310 chipset interrupts
- */
-#define IOP310_IRQ_OFS		NR_XS80200_IRQS
-#define IOP310_IRQ(x)		(IOP310_IRQ_OFS + (x))
-
-/*
- * On FIQ1ISR register
- */
-#define IRQ_IOP310_DMA0		IOP310_IRQ(0)	/* DMA Channel 0 */
-#define IRQ_IOP310_DMA1		IOP310_IRQ(1)	/* DMA Channel 1 */
-#define IRQ_IOP310_DMA2		IOP310_IRQ(2)	/* DMA Channel 2 */
-#define IRQ_IOP310_PMON		IOP310_IRQ(3)	/* Bus performance Unit */
-#define IRQ_IOP310_AAU		IOP310_IRQ(4)	/* Application Accelator Unit */
-
-/*
- * On FIQ2ISR register
- */
-#define IRQ_IOP310_I2C		IOP310_IRQ(5)	/* I2C unit */
-#define IRQ_IOP310_MU		IOP310_IRQ(6)	/* messaging unit */
-
-#define NR_IOP310_IRQS		(IOP310_IRQ(6) + 1)
-
-#define NR_IRQS			NR_IOP310_IRQS
-
-
-/*
- * Interrupts available on the Cyclone IQ80310 board
- */
-#ifdef CONFIG_ARCH_IQ80310
-
-#define IQ80310_IRQ_OFS		NR_IOP310_IRQS
-#define IQ80310_IRQ(y)		((IQ80310_IRQ_OFS) + (y))
-
-#define IRQ_IQ80310_TIMER	IQ80310_IRQ(0)	/* Timer Interrupt */
-#define IRQ_IQ80310_I82559	IQ80310_IRQ(1)	/* I82559 Ethernet Interrupt */
-#define IRQ_IQ80310_UART1	IQ80310_IRQ(2)	/* UART1 Interrupt */
-#define IRQ_IQ80310_UART2	IQ80310_IRQ(3)	/* UART2 Interrupt */
-#define IRQ_IQ80310_INTD	IQ80310_IRQ(4)	/* PCI INTD */
-
-
-/*
- * ONLY AVAILABLE ON REV F OR NEWER BOARDS!
- */
-#define	IRQ_IQ80310_INTA	IQ80310_IRQ(5)	/* PCI INTA */
-#define	IRQ_IQ80310_INTB	IQ80310_IRQ(6)	/* PCI INTB */
-#define	IRQ_IQ80310_INTC	IQ80310_IRQ(7)	/* PCI INTC */
-
-#undef	NR_IRQS
-#define NR_IRQS			(IQ80310_IRQ(7) + 1)
-
-#endif // CONFIG_ARCH_IQ80310
-
diff -Nru a/include/asm-arm/arch-iop310/memory.h b/include/asm-arm/arch-iop310/memory.h
--- a/include/asm-arm/arch-iop310/memory.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,58 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop80310/memory.h
- */
-
-#ifndef __ASM_ARCH_MEMORY_H
-#define __ASM_ARCH_MEMORY_H
-
-#include <linux/config.h>
-#include <asm/arch/iop310.h>
-
-/*
- * Task size: 3GB
- */
-#define TASK_SIZE	(0xbf000000UL)
-#define TASK_SIZE_26	(0x04000000UL)
-
-/*
- * This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define TASK_UNMAPPED_BASE (0x40000000)
-
-/*
- * Page offset: 3GB
- */
-#define PAGE_OFFSET	(0xc0000000UL)
-
-/*
- * Physical DRAM offset.
- */
-#define PHYS_OFFSET	(0xa0000000UL)
-
-/*
- * physical vs virtual ram conversion
- */
-#define __virt_to_phys__is_a_macro
-#define __phys_to_virt__is_a_macro
-#define __virt_to_phys(x)	((x) - PAGE_OFFSET + PHYS_OFFSET)
-#define __phys_to_virt(x)	((x) - PHYS_OFFSET + PAGE_OFFSET)
-
-/*
- * Virtual view <-> DMA view memory address translations
- * virt_to_bus: Used to translate the virtual address to an
- *		address suitable to be passed to set_dma_addr
- * bus_to_virt: Used to convert an address for DMA operations
- *		to an address that the kernel can use.
- */
-#define __virt_to_bus__is_a_macro
-#define __bus_to_virt__is_a_macro
-#define __virt_to_bus(x)	(((__virt_to_phys(x)) & ~(*IOP310_SIATVR)) | ((*IOP310_SIABAR) & 0xfffffff0))
-#define __bus_to_virt(x)    (__phys_to_virt(((x) & ~(*IOP310_SIALR)) | ( *IOP310_SIATVR)))
-
-/* boot mem allocate global pointer for MU circular queues QBAR */
-#ifdef CONFIG_IOP310_MU
-extern void *mu_mem;
-#endif
-
-#endif
diff -Nru a/include/asm-arm/arch-iop310/param.h b/include/asm-arm/arch-iop310/param.h
--- a/include/asm-arm/arch-iop310/param.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,3 +0,0 @@
-/*
- *  linux/include/asm-arm/arch-iop80310/param.h
- */
diff -Nru a/include/asm-arm/arch-iop310/pmon.h b/include/asm-arm/arch-iop310/pmon.h
--- a/include/asm-arm/arch-iop310/pmon.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,50 +0,0 @@
-/*
- * Definitions for XScale 80312 PMON
- * (C) 2001 Intel Corporation
- * Author: Chen Chen(chen.chen@intel.com)
- *
- * 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.
- */
-
-#ifndef _IOP310_PMON_H_
-#define _IOP310_PMON_H_
-
-/*
- *  Different modes for Event Select Register for intel 80312
- */
-
-#define IOP310_PMON_MODE0                0x00000000
-#define IOP310_PMON_MODE1                0x00000001
-#define IOP310_PMON_MODE2                0x00000002
-#define IOP310_PMON_MODE3                0x00000003
-#define IOP310_PMON_MODE4                0x00000004
-#define IOP310_PMON_MODE5                0x00000005
-#define IOP310_PMON_MODE6                0x00000006
-#define IOP310_PMON_MODE7                0x00000007
-
-typedef struct _iop310_pmon_result
-{
-	u32 timestamp;			/* Global Time Stamp Register */
-	u32 timestamp_overflow;		/* Time Stamp overflow count */
-	u32 event_count[14];		/* Programmable Event Counter
-					   Registers 1-14 */
-	u32 event_overflow[14];		/* Overflow counter for PECR1-14 */
-} iop310_pmon_res_t;
-
-/* function prototypes */
-
-/* Claim IQ80312 PMON for usage */
-int iop310_pmon_claim(void);
-
-/* Start IQ80312 PMON */
-int iop310_pmon_start(int, int);
-
-/* Stop Performance Monitor Unit */
-int iop310_pmon_stop(iop310_pmon_res_t *);
-
-/* Release IQ80312 PMON */
-int iop310_pmon_release(int);
-
-#endif
diff -Nru a/include/asm-arm/arch-iop310/serial.h b/include/asm-arm/arch-iop310/serial.h
--- a/include/asm-arm/arch-iop310/serial.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,34 +0,0 @@
-/*
- * include/asm-arm/arch-iop310/serial.h
- */
-#include <linux/config.h>
-
-/*
- * This assumes you have a 1.8432 MHz clock for your UART.
- *
- * It'd be nice if someone built a serial card with a 24.576 MHz
- * clock, since the 16550A is capable of handling a top speed of 1.5
- * megabits/second; but this requires the faster clock.
- */
-#define BASE_BAUD ( 1843200 / 16 )
-
-/* Standard COM flags */
-#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
-
-#ifdef CONFIG_ARCH_IQ80310
-
-#define IRQ_UART1	IRQ_IQ80310_UART1
-#define IRQ_UART2	IRQ_IQ80310_UART2
-
-#define RS_TABLE_SIZE 2
-
-#define STD_SERIAL_PORT_DEFNS			\
-       /* UART CLK      PORT        IRQ        FLAGS        */			\
-	{ 0, BASE_BAUD, IQ80310_UART2, IRQ_UART2, STD_COM_FLAGS },  /* ttyS0 */	\
-	{ 0, BASE_BAUD, IQ80310_UART1, IRQ_UART1, STD_COM_FLAGS }  /* ttyS1 */
-
-#endif // CONFIG_ARCH_IQ80310
-
-
-#define EXTRA_SERIAL_PORT_DEFNS
-
diff -Nru a/include/asm-arm/arch-iop310/system.h b/include/asm-arm/arch-iop310/system.h
--- a/include/asm-arm/arch-iop310/system.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,27 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop80310/system.h
- *
- *  Copyright (C) 2001 MontaVista 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.
- */
-
-static inline void arch_idle(void)
-{
-	cpu_do_idle();
-}
-
-
-static inline void arch_reset(char mode)
-{
-	if ( 1 && mode == 's') {
-		/* Jump into ROM at address 0 */
-		cpu_reset(0);
-	} else {
-		/* No on-chip reset capability */
-		cpu_reset(0);
-	}
-}
-
diff -Nru a/include/asm-arm/arch-iop310/time.h b/include/asm-arm/arch-iop310/time.h
--- a/include/asm-arm/arch-iop310/time.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,12 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop80310/time.h
- *
- * Author:  Nicolas Pitre
- * Copyright:   (C) 2001 MontaVista 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.
- *
- */
-
diff -Nru a/include/asm-arm/arch-iop310/timex.h b/include/asm-arm/arch-iop310/timex.h
--- a/include/asm-arm/arch-iop310/timex.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,23 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop80310/timex.h
- *
- * IOP310 architecture timex specifications
- */
-#include <linux/config.h>
-
-
-#ifdef CONFIG_ARCH_IQ80310
-
-#ifndef CONFIG_XSCALE_PMU_TIMER
-/* This is for the on-board timer */
-#define CLOCK_TICK_RATE 33000000 /* Underlying HZ */
-#else
-/* This is for the underlying xs80200 PMU clock. We run the core @ 733MHz */
-#define CLOCK_TICK_RATE	733000000
-#endif
-
-#else
-
-#error "No IOP310 timex information for this architecture"
-
-#endif
diff -Nru a/include/asm-arm/arch-iop310/uncompress.h b/include/asm-arm/arch-iop310/uncompress.h
--- a/include/asm-arm/arch-iop310/uncompress.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,34 +0,0 @@
-/*
- *  linux/include/asm-arm/arch-iop80310/uncompress.h
- */
-#include <linux/config.h>
-
-#ifdef CONFIG_ARCH_IQ80310
-#define UART1_BASE    ((volatile unsigned char *)0xfe800000)
-#define UART2_BASE    ((volatile unsigned char *)0xfe810000)
-#endif
-
-static __inline__ void putc(char c)
-{
-	while ((UART2_BASE[5] & 0x60) != 0x60);
-	UART2_BASE[0] = c;
-}
-
-/*
- * This does not append a newline
- */
-static void puts(const char *s)
-{
-	while (*s) {
-		putc(*s);
-		if (*s == '\n')
-			putc('\r');
-		s++;
-	}
-}
-
-/*
- * nothing to do
- */
-#define arch_decomp_setup()
-#define arch_decomp_wdog()
diff -Nru a/include/asm-arm/arch-iop310/vmalloc.h b/include/asm-arm/arch-iop310/vmalloc.h
--- a/include/asm-arm/arch-iop310/vmalloc.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,19 +0,0 @@
-/*
- * linux/include/asm-arm/arch-iop310/vmalloc.h
- */
-
-/*
- * Just any arbitrary offset to the start of the vmalloc VM area: the
- * current 8MB value just means that there will be a 8MB "hole" after the
- * physical memory until the kernel virtual memory starts.  That means that
- * any out-of-bounds memory accesses will hopefully be caught.
- * The vmalloc() routines leaves a hole of 4kB between each vmalloced
- * area for the same reason. ;)
- */
-#define VMALLOC_OFFSET	  (8*1024*1024)
-#define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
-#define VMALLOC_VMADDR(x) ((unsigned long)(x))
-#define VMALLOC_END       (0xe8000000)
-
-#define MODULE_START	(PAGE_OFFSET - 16*1048576)
-#define MODULE_END	(PAGE_OFFSET)
diff -Nru a/include/asm-arm/arch-iop3xx/dma.h b/include/asm-arm/arch-iop3xx/dma.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/dma.h	Sat Apr 19 19:51:49 2003
@@ -0,0 +1,109 @@
+/*
+ * linux/include/asm-arm/arch-iop80310/dma.h
+ *
+ *  Copyright (C) 2001 MontaVista 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.
+ */
+
+#ifndef _IOP310_DMA_H_
+#define _IOP310_DMA_H_
+
+/* 2 DMA on primary PCI and 1 on secondary for 80310 */
+#define MAX_IOP310_DMA_CHANNEL   3
+#define MAX_DMA_DESC        	64	/*128 */
+
+/*
+ * Make the generic DMA bits go away since we don't use it
+ */
+#define MAX_DMA_CHANNELS	0
+
+#define MAX_DMA_ADDRESS		0xffffffff
+
+#define IOP310_DMA_P0      	0
+#define IOP310_DMA_P1		1
+#define IOP310_DMA_S0      	2
+
+#define DMA_MOD_READ        	0x0001
+#define DMA_MOD_WRITE		0x0002
+#define DMA_MOD_CACHED		0x0004
+#define DMA_MOD_NONCACHED	0x0008
+
+
+#define DMA_DESC_DONE   	0x0010
+#define DMA_INCOMPLETE  	0x0020
+#define DMA_HOLD		0x0040
+#define DMA_END_CHAIN		0x0080
+#define DMA_COMPLETE		0x0100
+#define DMA_NOTIFY		0x0200
+#define DMA_NEW_HEAD		0x0400
+
+#define DMA_USER_MASK	(DMA_NOTIFY | DMA_INCOMPLETE | \
+						 DMA_HOLD | DMA_COMPLETE)
+
+#define DMA_DCR_DAC		0x00000020	/* Dual Addr Cycle Enab */
+#define DMA_DCR_IE		0x00000010	/* Interrupt Enable */
+#define DMA_DCR_PCI_IOR		0x00000002	/* I/O Read */
+#define DMA_DCR_PCI_IOW		0x00000003	/* I/O Write */
+#define DMA_DCR_PCI_MR		0x00000006	/* Memory Read */
+#define DMA_DCR_PCI_MW		0x00000007	/* Memory Write */
+#define DMA_DCR_PCI_CR		0x0000000A	/* Configuration Read */
+#define DMA_DCR_PCI_CW		0x0000000B	/* Configuration Write */
+#define DMA_DCR_PCI_MRM		0x0000000C	/* Memory Read Multiple */
+#define DMA_DCR_PCI_MRL		0x0000000E	/* Memory Read Line */
+#define DMA_DCR_PCI_MWI		0x0000000F	/* Mem Write and Inval */
+
+#define DMA_USER_CMD_IE		0x00000001	/* user request int */
+#define DMA_USER_END_CHAIN	0x00000002	/* end of sgl chain flag */
+
+/* ATU defines */
+#define     IOP310_ATUCR_PRIM_OUT_ENAB  /* Configuration   */      0x00000002
+#define     IOP310_ATUCR_DIR_ADDR_ENAB  /* Configuration   */      0x00000080
+
+
+typedef void (*dma_callback_t) (void *buf_context);
+/*
+ * DMA Descriptor
+ */
+typedef struct _dma_desc
+{
+	u32 NDAR;					/* next descriptor address */
+	u32 PDAR;					/* PCI address */
+	u32 PUADR;					/* upper PCI address */
+	u32 LADR;					/* local address */
+	u32 BC;						/* byte count */
+	u32 DC;						/* descriptor control */
+} dma_desc_t;
+
+typedef struct _dma_sgl
+{
+	dma_desc_t dma_desc;		/* DMA descriptor pointer */
+	u32 status;					/* descriptor status */
+	void *data;					/* local virt */
+	struct _dma_sgl *next;		/* next descriptor */
+} dma_sgl_t;
+
+/* dma sgl head */
+typedef struct _dma_head
+{
+	u32 total;					/* total elements in SGL */
+	u32 status;					/* status of sgl */
+	u32 mode;					/* read or write mode */
+	dma_sgl_t *list;			/* pointer to list */
+	dma_callback_t callback;	/* callback function */
+} dma_head_t;
+
+/* function prototypes */
+int dma_request(dmach_t, const char *);
+int dma_queue_buffer(dmach_t, dma_head_t *);
+int dma_suspend(dmach_t);
+int dma_resume(dmach_t);
+int dma_flush_all(dmach_t);
+void dma_free(dmach_t);
+void dma_set_irq_threshold(dmach_t, int);
+dma_sgl_t *dma_get_buffer(dmach_t, int);
+void dma_return_buffer(dmach_t, dma_sgl_t *);
+
+#endif /* _ASM_ARCH_DMA_H */
diff -Nru a/include/asm-arm/arch-iop3xx/hardware.h b/include/asm-arm/arch-iop3xx/hardware.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/hardware.h	Sat Apr 19 19:51:28 2003
@@ -0,0 +1,55 @@
+/*
+ * linux/include/asm-arm/arch-iop80310/hardware.h
+ */
+#ifndef __ASM_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
+#include <linux/config.h>
+
+/*
+ * Note about PCI IO space mappings
+ *
+ * To make IO space accesses efficient, we store virtual addresses in
+ * the IO resources.
+ *
+ * The PCI IO space is located at virtual 0xfe000000 from physical
+ * 0x90000000.  The PCI BARs must be programmed with physical addresses,
+ * but when we read them, we convert them to virtual addresses.  See
+ * arch/arm/mach-iop310/iop310-pci.c
+ */
+
+#define pcibios_assign_all_busses() 1
+
+#ifdef CONFIG_ARCH_IOP310
+/*
+ * these are the values for the secondary PCI bus on the 80312 chip.  I will
+ * have to do some fixup in the bus/dev fixup code
+ */
+#define PCIBIOS_MIN_IO      0
+#define PCIBIOS_MIN_MEM     0x88000000
+
+// Generic chipset bits
+#include "iop310.h"
+
+// Board specific
+#if defined(CONFIG_ARCH_IQ80310)
+#include "iq80310.h"
+#endif
+#endif
+
+#ifdef CONFIG_ARCH_IOP321
+
+#define PCIBIOS_MIN_IO		0x90000000
+#define PCIBIOS_MIN_MEM		0x80000000
+
+#include "iop321.h"
+
+#ifdef CONFIG_ARCH_IQ80321
+#include "iq80321.h"
+#endif
+#endif
+
+
+
+
+#endif  /* _ASM_ARCH_HARDWARE_H */
diff -Nru a/include/asm-arm/arch-iop3xx/ide.h b/include/asm-arm/arch-iop3xx/ide.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/ide.h	Sat Apr 19 19:51:47 2003
@@ -0,0 +1,51 @@
+/*
+ * include/asm-arm/arch-iop3xx/ide.h
+ *
+ * Generic IDE functions for IOP310 systems
+ *
+ * Author: Deepak Saxena <dsaxena@mvista.com>
+ *
+ * Copyright 2001 MontaVista Software Inc.
+ *
+ * 09/26/2001 - Sharon Baartmans
+ * 	Fixed so it actually works.
+ */
+
+#ifndef _ASM_ARCH_IDE_H_
+#define _ASM_ARCH_IDE_H_
+
+/*
+ * Set up a hw structure for a specified data port, control port and IRQ.
+ * This should follow whatever the default interface uses.
+ */
+static __inline__ void
+ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq)
+{
+	ide_ioreg_t reg;
+	int i;
+	int regincr = 1;
+
+	memset(hw, 0, sizeof(*hw));
+
+	reg = (ide_ioreg_t)data_port;
+
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
+		hw->io_ports[i] = reg;
+		reg += regincr;
+	}
+
+	hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port;
+
+	if (irq) *irq = 0;
+}
+
+/*
+ * This registers the standard ports for this architecture with the IDE
+ * driver.
+ */
+static __inline__ void ide_init_default_hwifs(void)
+{
+	/* There are no standard ports */
+}
+
+#endif
diff -Nru a/include/asm-arm/arch-iop3xx/io.h b/include/asm-arm/arch-iop3xx/io.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/io.h	Sat Apr 19 19:51:29 2003
@@ -0,0 +1,20 @@
+/*
+ * linux/include/asm-arm/arch-iop3xx/io.h
+ *
+ *  Copyright (C) 2001  MontaVista 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.
+ */
+
+#ifndef __ASM_ARM_ARCH_IO_H
+#define __ASM_ARM_ARCH_IO_H
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+#define __io(p)			((p))
+#define __mem_pci(a)		((unsigned long)(a))
+#define __mem_isa(a)		((unsigned long)(a))
+
+#endif
diff -Nru a/include/asm-arm/arch-iop3xx/iop310.h b/include/asm-arm/arch-iop3xx/iop310.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/iop310.h	Sat Apr 19 19:51:47 2003
@@ -0,0 +1,247 @@
+/*
+ * linux/include/asm/arch-iop3xx/iop310.h
+ *
+ * Intel IOP310 Compainion Chip definitions
+ *
+ * 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.
+ */
+
+#ifndef _IOP310_HW_H_
+#define _IOP310_HW_H_
+
+/*
+ * IOP310 I/O and Mem space regions for PCI autoconfiguration
+ */
+#define IOP310_PCISEC_LOWER_IO		0x90010000
+#define IOP310_PCISEC_UPPER_IO		0x9001ffff
+#define IOP310_PCISEC_LOWER_MEM		0x88000000
+#define IOP310_PCISEC_UPPER_MEM		0x8bffffff
+
+#define IOP310_PCIPRI_LOWER_IO		0x90000000
+#define IOP310_PCIPRI_UPPER_IO		0x9000ffff
+#define IOP310_PCIPRI_LOWER_MEM		0x80000000
+#define IOP310_PCIPRI_UPPER_MEM		0x83ffffff
+
+#define IOP310_PCI_WINDOW_SIZE		64 * 0x100000
+
+/*
+ * IOP310 chipset registers
+ */
+#define IOP310_VIRT_MEM_BASE 0xe8001000  /* chip virtual mem address*/
+#define IOP310_PHY_MEM_BASE  0x00001000  /* chip physical memory address */
+#define IOP310_REG_ADDR(reg) (IOP310_VIRT_MEM_BASE | IOP310_PHY_MEM_BASE | (reg))
+
+/* PCI-to-PCI Bridge Unit 0x00001000 through 0x000010FF */
+#define IOP310_VIDR    (volatile u16 *)IOP310_REG_ADDR(0x00001000)
+#define IOP310_DIDR    (volatile u16 *)IOP310_REG_ADDR(0x00001002)
+#define IOP310_PCR     (volatile u16 *)IOP310_REG_ADDR(0x00001004)
+#define IOP310_PSR     (volatile u16 *)IOP310_REG_ADDR(0x00001006)
+#define IOP310_RIDR    (volatile u8  *)IOP310_REG_ADDR(0x00001008)
+#define IOP310_CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001009)
+#define IOP310_CLSR    (volatile u8  *)IOP310_REG_ADDR(0x0000100C)
+#define IOP310_PLTR    (volatile u8  *)IOP310_REG_ADDR(0x0000100D)
+#define IOP310_HTR     (volatile u8  *)IOP310_REG_ADDR(0x0000100E)
+/* Reserved 0x0000100F through  0x00001017 */
+#define IOP310_PBNR    (volatile u8  *)IOP310_REG_ADDR(0x00001018)
+#define IOP310_SBNR    (volatile u8  *)IOP310_REG_ADDR(0x00001019)
+#define IOP310_SUBBNR  (volatile u8  *)IOP310_REG_ADDR(0x0000101A)
+#define IOP310_SLTR    (volatile u8  *)IOP310_REG_ADDR(0x0000101B)
+#define IOP310_IOBR    (volatile u8  *)IOP310_REG_ADDR(0x0000101C)
+#define IOP310_IOLR    (volatile u8  *)IOP310_REG_ADDR(0x0000101D)
+#define IOP310_SSR     (volatile u16 *)IOP310_REG_ADDR(0x0000101E)
+#define IOP310_MBR     (volatile u16 *)IOP310_REG_ADDR(0x00001020)
+#define IOP310_MLR     (volatile u16 *)IOP310_REG_ADDR(0x00001022)
+#define IOP310_PMBR    (volatile u16 *)IOP310_REG_ADDR(0x00001024)
+#define IOP310_PMLR    (volatile u16 *)IOP310_REG_ADDR(0x00001026)
+/* Reserved 0x00001028 through 0x00001033 */
+#define IOP310_CAPR    (volatile u8  *)IOP310_REG_ADDR(0x00001034)
+/* Reserved 0x00001035 through 0x0000103D */
+#define IOP310_BCR     (volatile u16 *)IOP310_REG_ADDR(0x0000103E)
+#define IOP310_EBCR    (volatile u16 *)IOP310_REG_ADDR(0x00001040)
+#define IOP310_SISR    (volatile u16 *)IOP310_REG_ADDR(0x00001042)
+#define IOP310_PBISR   (volatile u32 *)IOP310_REG_ADDR(0x00001044)
+#define IOP310_SBISR   (volatile u32 *)IOP310_REG_ADDR(0x00001048)
+#define IOP310_SACR    (volatile u32 *)IOP310_REG_ADDR(0x0000104C)
+#define IOP310_PIRSR   (volatile u32 *)IOP310_REG_ADDR(0x00001050)
+#define IOP310_SIOBR   (volatile u8  *)IOP310_REG_ADDR(0x00001054)
+#define IOP310_SIOLR   (volatile u8  *)IOP310_REG_ADDR(0x00001055)
+#define IOP310_SCDR    (volatile u8  *)IOP310_REG_ADDR(0x00001056)
+
+#define IOP310_SMBR    (volatile u16 *)IOP310_REG_ADDR(0x00001058)
+#define IOP310_SMLR    (volatile u16 *)IOP310_REG_ADDR(0x0000105A)
+#define IOP310_SDER    (volatile u16 *)IOP310_REG_ADDR(0x0000105C)
+#define IOP310_QCR     (volatile u16 *)IOP310_REG_ADDR(0x0000105E)
+#define IOP310_CAPID   (volatile u8  *)IOP310_REG_ADDR(0x00001068)
+#define IOP310_NIPTR   (volatile u8  *)IOP310_REG_ADDR(0x00001069)
+#define IOP310_PMCR    (volatile u16 *)IOP310_REG_ADDR(0x0000106A)
+#define IOP310_PMCSR   (volatile u16 *)IOP310_REG_ADDR(0x0000106C)
+#define IOP310_PMCSRBSE (volatile u8 *)IOP310_REG_ADDR(0x0000106E)
+/* Reserved 0x00001064 through 0x000010FFH */
+
+/* Performance monitoring unit  0x00001100 through 0x000011FF*/
+#define IOP310_PMONGTMR    (volatile u32 *)IOP310_REG_ADDR(0x00001100)
+#define IOP310_PMONESR     (volatile u32 *)IOP310_REG_ADDR(0x00001104)
+#define IOP310_PMONEMISR   (volatile u32 *)IOP310_REG_ADDR(0x00001108)
+#define IOP310_PMONGTSR    (volatile u32 *)IOP310_REG_ADDR(0x00001110)
+#define IOP310_PMONPECR1   (volatile u32 *)IOP310_REG_ADDR(0x00001114)
+#define IOP310_PMONPECR2   (volatile u32 *)IOP310_REG_ADDR(0x00001118)
+#define IOP310_PMONPECR3   (volatile u32 *)IOP310_REG_ADDR(0x0000111C)
+#define IOP310_PMONPECR4   (volatile u32 *)IOP310_REG_ADDR(0x00001120)
+#define IOP310_PMONPECR5   (volatile u32 *)IOP310_REG_ADDR(0x00001124)
+#define IOP310_PMONPECR6   (volatile u32 *)IOP310_REG_ADDR(0x00001128)
+#define IOP310_PMONPECR7   (volatile u32 *)IOP310_REG_ADDR(0x0000112C)
+#define IOP310_PMONPECR8   (volatile u32 *)IOP310_REG_ADDR(0x00001130)
+#define IOP310_PMONPECR9   (volatile u32 *)IOP310_REG_ADDR(0x00001134)
+#define IOP310_PMONPECR10  (volatile u32 *)IOP310_REG_ADDR(0x00001138)
+#define IOP310_PMONPECR11  (volatile u32 *)IOP310_REG_ADDR(0x0000113C)
+#define IOP310_PMONPECR12  (volatile u32 *)IOP310_REG_ADDR(0x00001140)
+#define IOP310_PMONPECR13  (volatile u32 *)IOP310_REG_ADDR(0x00001144)
+#define IOP310_PMONPECR14  (volatile u32 *)IOP310_REG_ADDR(0x00001148)
+
+/* Address Translation Unit 0x00001200 through 0x000012FF */
+#define IOP310_ATUVID     (volatile u16 *)IOP310_REG_ADDR(0x00001200)
+#define IOP310_ATUDID     (volatile u16 *)IOP310_REG_ADDR(0x00001202)
+#define IOP310_PATUCMD    (volatile u16 *)IOP310_REG_ADDR(0x00001204)
+#define IOP310_PATUSR     (volatile u16 *)IOP310_REG_ADDR(0x00001206)
+#define IOP310_ATURID     (volatile u8  *)IOP310_REG_ADDR(0x00001208)
+#define IOP310_ATUCCR     (volatile u32 *)IOP310_REG_ADDR(0x00001209)
+#define IOP310_ATUCLSR    (volatile u8  *)IOP310_REG_ADDR(0x0000120C)
+#define IOP310_ATULT      (volatile u8  *)IOP310_REG_ADDR(0x0000120D)
+#define IOP310_ATUHTR     (volatile u8  *)IOP310_REG_ADDR(0x0000120E)
+
+#define IOP310_PIABAR     (volatile u32 *)IOP310_REG_ADDR(0x00001210)
+/* Reserved 0x00001214 through 0x0000122B */
+#define IOP310_ASVIR      (volatile u16 *)IOP310_REG_ADDR(0x0000122C)
+#define IOP310_ASIR       (volatile u16 *)IOP310_REG_ADDR(0x0000122E)
+#define IOP310_ERBAR      (volatile u32 *)IOP310_REG_ADDR(0x00001230)
+#define IOP310_ATUCAPPTR  (volatile u8  *)IOP310_REG_ADDR(0x00001234)
+/* Reserved 0x00001235 through 0x0000123B */
+#define IOP310_ATUILR     (volatile u8  *)IOP310_REG_ADDR(0x0000123C)
+#define IOP310_ATUIPR     (volatile u8  *)IOP310_REG_ADDR(0x0000123D)
+#define IOP310_ATUMGNT    (volatile u8  *)IOP310_REG_ADDR(0x0000123E)
+#define IOP310_ATUMLAT    (volatile u8  *)IOP310_REG_ADDR(0x0000123F)
+#define IOP310_PIALR      (volatile u32 *)IOP310_REG_ADDR(0x00001240)
+#define IOP310_PIATVR     (volatile u32 *)IOP310_REG_ADDR(0x00001244)
+#define IOP310_SIABAR     (volatile u32 *)IOP310_REG_ADDR(0x00001248)
+#define IOP310_SIALR      (volatile u32 *)IOP310_REG_ADDR(0x0000124C)
+#define IOP310_SIATVR     (volatile u32 *)IOP310_REG_ADDR(0x00001250)
+#define IOP310_POMWVR     (volatile u32 *)IOP310_REG_ADDR(0x00001254)
+/* Reserved 0x00001258 through 0x0000125B */
+#define IOP310_POIOWVR    (volatile u32 *)IOP310_REG_ADDR(0x0000125C)
+#define IOP310_PODWVR     (volatile u32 *)IOP310_REG_ADDR(0x00001260)
+#define IOP310_POUDR      (volatile u32 *)IOP310_REG_ADDR(0x00001264)
+#define IOP310_SOMWVR     (volatile u32 *)IOP310_REG_ADDR(0x00001268)
+#define IOP310_SOIOWVR    (volatile u32 *)IOP310_REG_ADDR(0x0000126C)
+/* Reserved 0x00001270 through 0x00001273*/
+#define IOP310_ERLR       (volatile u32 *)IOP310_REG_ADDR(0x00001274)
+#define IOP310_ERTVR      (volatile u32 *)IOP310_REG_ADDR(0x00001278)
+/* Reserved 0x00001279 through 0x0000127C*/
+#define IOP310_ATUCAPID   (volatile u8  *)IOP310_REG_ADDR(0x00001280)
+#define IOP310_ATUNIPTR   (volatile u8  *)IOP310_REG_ADDR(0x00001281)
+#define IOP310_APMCR      (volatile u16 *)IOP310_REG_ADDR(0x00001282)
+#define IOP310_APMCSR     (volatile u16 *)IOP310_REG_ADDR(0x00001284)
+/* Reserved 0x00001286 through 0x00001287 */
+#define IOP310_ATUCR      (volatile u32 *)IOP310_REG_ADDR(0x00001288)
+/* Reserved 0x00001289  through 0x0000128C*/
+#define IOP310_PATUISR    (volatile u32 *)IOP310_REG_ADDR(0x00001290)
+#define IOP310_SATUISR    (volatile u32 *)IOP310_REG_ADDR(0x00001294)
+#define IOP310_SATUCMD    (volatile u16 *)IOP310_REG_ADDR(0x00001298)
+#define IOP310_SATUSR     (volatile u16 *)IOP310_REG_ADDR(0x0000129A)
+#define IOP310_SODWVR     (volatile u32 *)IOP310_REG_ADDR(0x0000129C)
+#define IOP310_SOUDR      (volatile u32 *)IOP310_REG_ADDR(0x000012A0)
+#define IOP310_POCCAR     (volatile u32 *)IOP310_REG_ADDR(0x000012A4)
+#define IOP310_SOCCAR     (volatile u32 *)IOP310_REG_ADDR(0x000012A8)
+#define IOP310_POCCDR     (volatile u32 *)IOP310_REG_ADDR(0x000012AC)
+#define IOP310_SOCCDR     (volatile u32 *)IOP310_REG_ADDR(0x000012B0)
+#define IOP310_PAQCR      (volatile u32 *)IOP310_REG_ADDR(0x000012B4)
+#define IOP310_SAQCR      (volatile u32 *)IOP310_REG_ADDR(0x000012B8)
+#define IOP310_PATUIMR    (volatile u32 *)IOP310_REG_ADDR(0x000012BC)
+#define IOP310_SATUIMR    (volatile u32 *)IOP310_REG_ADDR(0x000012C0)
+/* Reserved 0x000012C4 through 0x000012FF */
+/* Messaging Unit 0x00001300 through 0x000013FF */
+#define IOP310_MUIMR0       (volatile u32 *)IOP310_REG_ADDR(0x00001310)
+#define IOP310_MUIMR1       (volatile u32 *)IOP310_REG_ADDR(0x00001314)
+#define IOP310_MUOMR0       (volatile u32 *)IOP310_REG_ADDR(0x00001318)
+#define IOP310_MUOMR1       (volatile u32 *)IOP310_REG_ADDR(0x0000131C)
+#define IOP310_MUIDR        (volatile u32 *)IOP310_REG_ADDR(0x00001320)
+#define IOP310_MUIISR       (volatile u32 *)IOP310_REG_ADDR(0x00001324)
+#define IOP310_MUIIMR       (volatile u32 *)IOP310_REG_ADDR(0x00001328)
+#define IOP310_MUODR        (volatile u32 *)IOP310_REG_ADDR(0x0000132C)
+#define IOP310_MUOISR       (volatile u32 *)IOP310_REG_ADDR(0x00001330)
+#define IOP310_MUOIMR       (volatile u32 *)IOP310_REG_ADDR(0x00001334)
+#define IOP310_MUMUCR       (volatile u32 *)IOP310_REG_ADDR(0x00001350)
+#define IOP310_MUQBAR       (volatile u32 *)IOP310_REG_ADDR(0x00001354)
+#define IOP310_MUIFHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001360)
+#define IOP310_MUIFTPR      (volatile u32 *)IOP310_REG_ADDR(0x00001364)
+#define IOP310_MUIPHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001368)
+#define IOP310_MUIPTPR      (volatile u32 *)IOP310_REG_ADDR(0x0000136C)
+#define IOP310_MUOFHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001370)
+#define IOP310_MUOFTPR      (volatile u32 *)IOP310_REG_ADDR(0x00001374)
+#define IOP310_MUOPHPR      (volatile u32 *)IOP310_REG_ADDR(0x00001378)
+#define IOP310_MUOPTPR      (volatile u32 *)IOP310_REG_ADDR(0x0000137C)
+#define IOP310_MUIAR        (volatile u32 *)IOP310_REG_ADDR(0x00001380)
+/* DMA Controller 0x00001400 through 0x000014FF */
+#define IOP310_DMA0CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001400)
+#define IOP310_DMA0CSR     (volatile u32 *)IOP310_REG_ADDR(0x00001404)
+/* Reserved 0x001408 through 0x00140B */
+#define IOP310_DMA0DAR     (volatile u32 *)IOP310_REG_ADDR(0x0000140C)
+#define IOP310_DMA0NDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001410)
+#define IOP310_DMA0PADR    (volatile u32 *)IOP310_REG_ADDR(0x00001414)
+#define IOP310_DMA0PUADR   (volatile u32 *)IOP310_REG_ADDR(0x00001418)
+#define IOP310_DMA0LADR    (volatile u32 *)IOP310_REG_ADDR(0x0000141C)
+#define IOP310_DMA0BCR     (volatile u32 *)IOP310_REG_ADDR(0x00001420)
+#define IOP310_DMA0DCR     (volatile u32 *)IOP310_REG_ADDR(0x00001424)
+/* Reserved 0x00001428 through 0x0000143F */
+#define IOP310_DMA1CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001440)
+#define IOP310_DMA1CSR     (volatile u32 *)IOP310_REG_ADDR(0x00001444)
+/* Reserved 0x00001448 through 0x0000144B */
+#define IOP310_DMA1DAR     (volatile u32 *)IOP310_REG_ADDR(0x0000144C)
+#define IOP310_DMA1NDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001450)
+#define IOP310_DMA1PADR    (volatile u32 *)IOP310_REG_ADDR(0x00001454)
+#define IOP310_DMA1PUADR   (volatile u32 *)IOP310_REG_ADDR(0x00001458)
+#define IOP310_DMA1LADR    (volatile u32 *)IOP310_REG_ADDR(0x0000145C)
+#define IOP310_DMA1BCR     (volatile u32 *)IOP310_REG_ADDR(0x00001460)
+#define IOP310_DMA1DCR     (volatile u32 *)IOP310_REG_ADDR(0x00001464)
+/* Reserved 0x00001468 through 0x0000147F */
+#define IOP310_DMA2CCR     (volatile u32 *)IOP310_REG_ADDR(0x00001480)
+#define IOP310_DMA2CSR     (volatile u32 *)IOP310_REG_ADDR(0x00001484)
+/* Reserved 0x00001488 through 0x0000148B */
+#define IOP310_DMA2DAR     (volatile u32 *)IOP310_REG_ADDR(0x0000148C)
+#define IOP310_DMA2NDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001490)
+#define IOP310_DMA2PADR    (volatile u32 *)IOP310_REG_ADDR(0x00001494)
+#define IOP310_DMA2PUADR   (volatile u32 *)IOP310_REG_ADDR(0x00001498)
+#define IOP310_DMA2LADR    (volatile u32 *)IOP310_REG_ADDR(0x0000149C)
+#define IOP310_DMA2BCR     (volatile u32 *)IOP310_REG_ADDR(0x000014A0)
+#define IOP310_DMA2DCR     (volatile u32 *)IOP310_REG_ADDR(0x000014A4)
+
+/* Memory controller 0x00001500 through 0x0015FF */
+
+/* core interface unit 0x00001640 - 0x0000167F */
+#define IOP310_CIUISR     (volatile u32 *)IOP310_REG_ADDR(0x00001644)
+
+/* PCI and Peripheral Interrupt Controller 0x00001700 - 0x0000171B */
+#define IOP310_IRQISR     (volatile u32 *)IOP310_REG_ADDR(0x00001700)
+#define IOP310_FIQ2ISR    (volatile u32 *)IOP310_REG_ADDR(0x00001704)
+#define IOP310_FIQ1ISR    (volatile u32 *)IOP310_REG_ADDR(0x00001708)
+#define IOP310_PDIDR      (volatile u32 *)IOP310_REG_ADDR(0x00001710)
+
+/* AAU registers. DJ 0x00001800 - 0x00001838 */
+#define IOP310_AAUACR    (volatile u32 *)IOP310_REG_ADDR(0x00001800)
+#define IOP310_AAUASR    (volatile u32 *)IOP310_REG_ADDR(0x00001804)
+#define IOP310_AAUADAR   (volatile u32 *)IOP310_REG_ADDR(0x00001808)
+#define IOP310_AAUANDAR  (volatile u32 *)IOP310_REG_ADDR(0x0000180C)
+#define IOP310_AAUSAR1   (volatile u32 *)IOP310_REG_ADDR(0x00001810)
+#define IOP310_AAUSAR2   (volatile u32 *)IOP310_REG_ADDR(0x00001814)
+#define IOP310_AAUSAR3   (volatile u32 *)IOP310_REG_ADDR(0x00001818)
+#define IOP310_AAUSAR4   (volatile u32 *)IOP310_REG_ADDR(0x0000181C)
+#define IOP310_AAUDAR    (volatile u32 *)IOP310_REG_ADDR(0x00001820)
+#define IOP310_AAUABCR   (volatile u32 *)IOP310_REG_ADDR(0x00001824)
+#define IOP310_AAUADCR   (volatile u32 *)IOP310_REG_ADDR(0x00001828)
+#define IOP310_AAUSAR5   (volatile u32 *)IOP310_REG_ADDR(0x0000182C)
+#define IOP310_AAUSAR6   (volatile u32 *)IOP310_REG_ADDR(0x00001830)
+#define IOP310_AAUSAR7   (volatile u32 *)IOP310_REG_ADDR(0x00001834)
+#define IOP310_AAUSAR8   (volatile u32 *)IOP310_REG_ADDR(0x00001838)
+
+#endif // _IOP310_HW_H_
diff -Nru a/include/asm-arm/arch-iop3xx/iop321-irqs.h b/include/asm-arm/arch-iop3xx/iop321-irqs.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/iop321-irqs.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,83 @@
+/*
+ * linux/include/asm-arm/arch-iop3xx/irqs.h
+ *
+ * Author:	Rory Bolt <rorybolt@pacbell.net>
+ * Copyright:	(C) 2002 Rory Bolt
+ *
+ * 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.
+ *
+ */
+
+
+/*
+ * IOP80321 chipset interrupts
+ */
+#define IOP321_IRQ_OFS		0
+#define IOP321_IRQ(x)		(IOP321_IRQ_OFS + (x))
+
+/*
+ * On IRQ or FIQ register
+ */
+#define IRQ_IOP321_DMA0_EOT	IOP321_IRQ(0)
+#define IRQ_IOP321_DMA0_EOC	IOP321_IRQ(1)
+#define IRQ_IOP321_DMA1_EOT	IOP321_IRQ(2)
+#define IRQ_IOP321_DMA1_EOC	IOP321_IRQ(3)
+#define IRQ_IOP321_RSVD_4	IOP321_IRQ(4)
+#define IRQ_IOP321_RSVD_5	IOP321_IRQ(5)
+#define IRQ_IOP321_AA_EOT	IOP321_IRQ(6)
+#define IRQ_IOP321_AA_EOC	IOP321_IRQ(7)
+#define IRQ_IOP321_CORE_PMON	IOP321_IRQ(8)
+#define IRQ_IOP321_TIMER0	IOP321_IRQ(9)
+#define IRQ_IOP321_TIMER1	IOP321_IRQ(10)
+#define IRQ_IOP321_I2C_0	IOP321_IRQ(11)
+#define IRQ_IOP321_I2C_1	IOP321_IRQ(12)
+#define IRQ_IOP321_MESSAGING	IOP321_IRQ(13)
+#define IRQ_IOP321_ATU_BIST	IOP321_IRQ(14)
+#define IRQ_IOP321_PERFMON	IOP321_IRQ(15)
+#define IRQ_IOP321_CORE_PMU	IOP321_IRQ(16)
+#define IRQ_IOP321_BIU_ERR	IOP321_IRQ(17)
+#define IRQ_IOP321_ATU_ERR	IOP321_IRQ(18)
+#define IRQ_IOP321_MCU_ERR	IOP321_IRQ(19)
+#define IRQ_IOP321_DMA0_ERR	IOP321_IRQ(20)
+#define IRQ_IOP321_DMA1_ERR	IOP321_IRQ(21)
+#define IRQ_IOP321_RSVD_22	IOP321_IRQ(22)
+#define IRQ_IOP321_AA_ERR	IOP321_IRQ(23)
+#define IRQ_IOP321_MSG_ERR	IOP321_IRQ(24)
+#define IRQ_IOP321_SSP		IOP321_IRQ(25)
+#define IRQ_IOP321_RSVD_26	IOP321_IRQ(26)
+#define IRQ_IOP321_XINT0	IOP321_IRQ(27)
+#define IRQ_IOP321_XINT1	IOP321_IRQ(28)
+#define IRQ_IOP321_XINT2	IOP321_IRQ(29)
+#define IRQ_IOP321_XINT3	IOP321_IRQ(30)
+#define IRQ_IOP321_HPI		IOP321_IRQ(31)
+
+#define NR_IOP321_IRQS		(IOP321_IRQ(31) + 1)
+
+#define NR_IRQS			NR_IOP321_IRQS
+
+
+/*
+ * Interrupts available on the IQ80321 board
+ */
+#ifdef CONFIG_ARCH_IQ80321
+
+/*
+ * On board devices
+ */
+#define	IRQ_IQ80321_I82544	IRQ_IOP321_XINT0
+#define IRQ_IQ80321_UART	IRQ_IOP321_XINT1
+
+/*
+ * PCI interrupts
+ */
+#define	IRQ_IQ80321_INTA	IRQ_IOP321_XINT0
+#define	IRQ_IQ80321_INTB	IRQ_IOP321_XINT1
+#define	IRQ_IQ80321_INTC	IRQ_IOP321_XINT2
+#define	IRQ_IQ80321_INTD	IRQ_IOP321_XINT3
+
+#endif // CONFIG_ARCH_IQ80321
+
+#define XSCALE_PMU_IRQ	IRQ_IOP321_CORE_PMU
+
diff -Nru a/include/asm-arm/arch-iop3xx/iop321.h b/include/asm-arm/arch-iop3xx/iop321.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/iop321.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,143 @@
+/*
+ * linux/include/asm/arch-iop3xx/iop321.h
+ *
+ * Intel IOP321 Chip definitions
+ *
+ * Author: Rory Bolt <rorybolt@pacbell.net>
+ * Copyright (C) 2002 Rory Bolt
+ *
+ * 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.
+ */
+
+#ifndef _IOP321_HW_H_
+#define _IOP321_HW_H_
+
+/*
+ * IOP321 I/O and Mem space regions for PCI autoconfiguration
+ */
+#define	IOP321_PCI_LOWER_IO		0x90000000
+#define	IOP321_PCI_UPPER_IO		0x9000ffff
+#define IOP321_PCI_LOWER_MEM		0x80000000
+#define IOP321_PCI_UPPER_MEM		0x83ffffff
+
+#define IOP321_PCI_WINDOW_SIZE		64 * 0x100000
+
+/*
+ * IOP321 chipset registers
+ */
+#define IOP321_VIRT_MEM_BASE 0xfff00000  /* chip virtual mem address*/
+#define IOP321_PHY_MEM_BASE  0xffffe000  /* chip physical memory address */
+#define IOP321_REG_ADDR(reg) (IOP321_VIRT_MEM_BASE | (reg))
+
+/* Reserved 0x00000000 through 0x000000FF */
+
+/* Address Translation Unit 0x00000100 through 0x000001FF */
+#define IOP321_ATUVID     (volatile u16 *)IOP321_REG_ADDR(0x00000100)
+#define IOP321_ATUDID     (volatile u16 *)IOP321_REG_ADDR(0x00000102)
+#define IOP321_ATUCMD     (volatile u16 *)IOP321_REG_ADDR(0x00000104)
+#define IOP321_ATUSR      (volatile u16 *)IOP321_REG_ADDR(0x00000106)
+#define IOP321_ATURID     (volatile u8  *)IOP321_REG_ADDR(0x00000108)
+#define IOP321_ATUCCR     (volatile u32 *)IOP321_REG_ADDR(0x00000109)
+#define IOP321_ATUCLSR    (volatile u8  *)IOP321_REG_ADDR(0x0000010C)
+#define IOP321_ATULT      (volatile u8  *)IOP321_REG_ADDR(0x0000010D)
+#define IOP321_ATUHTR     (volatile u8  *)IOP321_REG_ADDR(0x0000010E)
+#define IOP321_ATUBIST    (volatile u8  *)IOP321_REG_ADDR(0x0000010F)
+#define IOP321_IABAR0     (volatile u32 *)IOP321_REG_ADDR(0x00000110)
+#define IOP321_IAUBAR0    (volatile u32 *)IOP321_REG_ADDR(0x00000114)
+#define IOP321_IABAR1     (volatile u32 *)IOP321_REG_ADDR(0x00000118)
+#define IOP321_IAUBAR1    (volatile u32 *)IOP321_REG_ADDR(0x0000011C)
+#define IOP321_IABAR2     (volatile u32 *)IOP321_REG_ADDR(0x00000120)
+#define IOP321_IAUBAR2    (volatile u32 *)IOP321_REG_ADDR(0x00000124)
+#define IOP321_ASVIR      (volatile u16 *)IOP321_REG_ADDR(0x0000012C)
+#define IOP321_ASIR       (volatile u16 *)IOP321_REG_ADDR(0x0000012E)
+#define IOP321_ERBAR      (volatile u32 *)IOP321_REG_ADDR(0x00000130)
+/* Reserved 0x00000134 through 0x0000013B */
+#define IOP321_ATUILR     (volatile u8  *)IOP321_REG_ADDR(0x0000013C)
+#define IOP321_ATUIPR     (volatile u8  *)IOP321_REG_ADDR(0x0000013D)
+#define IOP321_ATUMGNT    (volatile u8  *)IOP321_REG_ADDR(0x0000013E)
+#define IOP321_ATUMLAT    (volatile u8  *)IOP321_REG_ADDR(0x0000013F)
+#define IOP321_IALR0      (volatile u32 *)IOP321_REG_ADDR(0x00000140)
+#define IOP321_IATVR0     (volatile u32 *)IOP321_REG_ADDR(0x00000144)
+#define IOP321_ERLR       (volatile u32 *)IOP321_REG_ADDR(0x00000148)
+#define IOP321_ERTVR      (volatile u32 *)IOP321_REG_ADDR(0x0000014C)
+#define IOP321_IALR1      (volatile u32 *)IOP321_REG_ADDR(0x00000150)
+#define IOP321_IALR2      (volatile u32 *)IOP321_REG_ADDR(0x00000154)
+#define IOP321_IATVR2     (volatile u32 *)IOP321_REG_ADDR(0x00000158)
+#define IOP321_OIOWTVR    (volatile u32 *)IOP321_REG_ADDR(0x0000015C)
+#define IOP321_OMWTVR0    (volatile u32 *)IOP321_REG_ADDR(0x00000160)
+#define IOP321_OUMWTVR0   (volatile u32 *)IOP321_REG_ADDR(0x00000164)
+#define IOP321_OMWTVR1    (volatile u32 *)IOP321_REG_ADDR(0x00000168)
+#define IOP321_OUMWTVR1   (volatile u32 *)IOP321_REG_ADDR(0x0000016C)
+/* Reserved 0x00000170 through 0x00000177*/
+#define IOP321_OUDWTVR    (volatile u32 *)IOP321_REG_ADDR(0x00000178)
+/* Reserved 0x0000017C through 0x0000017F*/
+#define IOP321_ATUCR      (volatile u32 *)IOP321_REG_ADDR(0x00000180)
+#define IOP321_PCSR       (volatile u32 *)IOP321_REG_ADDR(0x00000184)
+#define IOP321_ATUISR     (volatile u32 *)IOP321_REG_ADDR(0x00000188)
+#define IOP321_ATUIMR     (volatile u32 *)IOP321_REG_ADDR(0x0000018C)
+#define IOP321_IABAR3     (volatile u32 *)IOP321_REG_ADDR(0x00000190)
+#define IOP321_IAUBAR3    (volatile u32 *)IOP321_REG_ADDR(0x00000194)
+#define IOP321_IALR3      (volatile u32 *)IOP321_REG_ADDR(0x00000198)
+#define IOP321_IATVR3     (volatile u32 *)IOP321_REG_ADDR(0x0000019C)
+/* Reserved 0x000001A0 through 0x000001A3*/
+#define IOP321_OCCAR      (volatile u32 *)IOP321_REG_ADDR(0x000001A4)
+/* Reserved 0x000001A8 through 0x000001AB*/
+#define IOP321_OCCDR      (volatile u32 *)IOP321_REG_ADDR(0x000001AC)
+/* Reserved 0x000001B0 through 0x000001BB*/
+#define IOP321_PDSCR      (volatile u32 *)IOP321_REG_ADDR(0x000001BC)
+#define IOP321_PMCAPID    (volatile u8  *)IOP321_REG_ADDR(0x000001C0)
+#define IOP321_PMNEXT     (volatile u8  *)IOP321_REG_ADDR(0x000001C1)
+#define IOP321_APMCR      (volatile u16 *)IOP321_REG_ADDR(0x000001C2)
+#define IOP321_APMCSR     (volatile u16 *)IOP321_REG_ADDR(0x000001C4)
+/* Reserved 0x000001C6 through 0x000001DF */
+#define IOP321_PCIXCAPID  (volatile u8  *)IOP321_REG_ADDR(0x000001E0)
+#define IOP321_PCIXNEXT   (volatile u8  *)IOP321_REG_ADDR(0x000001E1)
+#define IOP321_PCIXCMD    (volatile u16 *)IOP321_REG_ADDR(0x000001E2)
+#define IOP321_PCIXSR     (volatile u32 *)IOP321_REG_ADDR(0x000001E4)
+#define IOP321_PCIIRSR    (volatile u32 *)IOP321_REG_ADDR(0x000001EC)
+
+/* Messaging Unit 0x00000300 through 0x000003FF */
+/* DMA Controller 0x00000400 through 0x000004FF */
+/* Memory controller 0x00000500 through 0x0005FF */
+/* Peripheral bus interface unit 0x00000680 through 0x0006FF */
+/* Peripheral performance monitoring unit 0x00000700 through 0x00077F */
+/* Internal arbitration unit 0x00000780 through 0x0007BF */
+
+/* Interrupt Controller */
+#define IOP321_INTCTL     (volatile u32 *)IOP321_REG_ADDR(0x000007D0)
+#define IOP321_INTSTR     (volatile u32 *)IOP321_REG_ADDR(0x000007D4)
+#define IOP321_IINTSRC    (volatile u32 *)IOP321_REG_ADDR(0x000007D8)
+#define IOP321_FINTSRC    (volatile u32 *)IOP321_REG_ADDR(0x000007DC)
+
+/* Timers */
+
+#define IOP321_TU_TMR0		(volatile u32 *)IOP321_REG_ADDR(0x000007E0)
+#define IOP321_TU_TMR1		(volatile u32 *)IOP321_REG_ADDR(0x000007E4)
+
+#define IOP321_TMR_TC		0x01
+#define	IOP321_TMR_EN		0x02
+#define IOP321_TMR_RELOAD	0x04
+#define	IOP321_TMR_PRIVILEGED	0x09
+
+#define	IOP321_TMR_RATIO_1_1	0x00
+#define	IOP321_TMR_RATIO_4_1	0x10
+#define	IOP321_TMR_RATIO_8_1	0x20
+#define	IOP321_TMR_RATIO_16_1	0x30
+
+#define IOP321_TU_TCR0    (volatile u32 *)IOP321_REG_ADDR(0x000007E8)
+#define IOP321_TU_TCR1    (volatile u32 *)IOP321_REG_ADDR(0x000007EC)
+#define IOP321_TU_TRR0    (volatile u32 *)IOP321_REG_ADDR(0x000007F0)
+#define IOP321_TU_TRR1    (volatile u32 *)IOP321_REG_ADDR(0x000007F4)
+#define IOP321_TU_TISR    (volatile u32 *)IOP321_REG_ADDR(0x000007F8)
+#define IOP321_TU_WDTCR   (volatile u32 *)IOP321_REG_ADDR(0x000007FC)
+
+/* Application accelerator unit 0x00000800 - 0x000008FF */
+#define IOP321_AAUACR     (volatile u32 *)IOP321_REG_ADDR(0x00000800)
+#define IOP321_AAUASR     (volatile u32 *)IOP321_REG_ADDR(0x00000804)
+#define IOP321_AAUANDAR   (volatile u32 *)IOP321_REG_ADDR(0x0000080C)
+
+/* SSP serial port unit 0x00001600 - 0x0000167F */
+/* I2C bus interface unit 0x00001680 - 0x000016FF */
+#endif // _IOP321_HW_H_
diff -Nru a/include/asm-arm/arch-iop3xx/iq80310.h b/include/asm-arm/arch-iop3xx/iq80310.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/iq80310.h	Sat Apr 19 19:51:28 2003
@@ -0,0 +1,30 @@
+/*
+ * linux/include/asm/arch-iop80310/iq80310.h
+ *
+ * Intel IQ-80310 evaluation board registers
+ */
+
+#ifndef _IQ80310_H_
+#define _IQ80310_H_
+
+#define IQ80310_RAMBASE      0xa0000000
+#define IQ80310_UART1        0xfe800000    /* UART #1 */
+#define IQ80310_UART2        0xfe810000    /* UART #2 */
+#define IQ80310_INT_STAT     0xfe820000    /* Interrupt (XINT3#) Status */
+#define IQ80310_BOARD_REV    0xfe830000    /* Board revision register */
+#define IQ80310_CPLD_REV     0xfe840000    /* CPLD revision register */
+#define IQ80310_7SEG_1       0xfe840000    /* 7-Segment MSB */
+#define IQ80310_7SEG_0       0xfe850000    /* 7-Segment LSB (WO) */
+#define IQ80310_PCI_INT_STAT 0xfe850000    /* PCI Interrupt  Status */
+#define IQ80310_INT_MASK     0xfe860000    /* Interrupt (XINT3#) Mask */
+#define IQ80310_BACKPLANE    0xfe870000    /* Backplane Detect */
+#define IQ80310_TIMER_LA0    0xfe880000    /* Timer LA0 */
+#define IQ80310_TIMER_LA1    0xfe890000    /* Timer LA1 */
+#define IQ80310_TIMER_LA2    0xfe8a0000    /* Timer LA2 */
+#define IQ80310_TIMER_LA3    0xfe8b0000    /* Timer LA3 */
+#define IQ80310_TIMER_EN     0xfe8c0000    /* Timer Enable */
+#define IQ80310_ROTARY_SW    0xfe8d0000    /* Rotary Switch */
+#define IQ80310_JTAG         0xfe8e0000    /* JTAG Port Access */
+#define IQ80310_BATT_STAT    0xfe8f0000    /* Battery Status */
+
+#endif	// _IQ80310_H_
diff -Nru a/include/asm-arm/arch-iop3xx/iq80321.h b/include/asm-arm/arch-iop3xx/iq80321.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/iq80321.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,17 @@
+/*
+ * linux/include/asm/arch-iop3xx/iq80321.h
+ *
+ * Intel IQ-80321 evaluation board registers
+ */
+
+#ifndef _IQ80321_H_
+#define _IQ80321_H_
+
+#define IQ80321_RAMBASE      0xa0000000
+#define IQ80321_UART1        0xfe800000    /* UART #1 */
+#define IQ80321_7SEG_1       0xfe840000    /* 7-Segment MSB */
+#define IQ80321_7SEG_0       0xfe850000    /* 7-Segment LSB (WO) */
+#define IQ80321_ROTARY_SW    0xfe8d0000    /* Rotary Switch */
+#define IQ80321_BATT_STAT    0xfe8f0000    /* Battery Status */
+
+#endif	// _IQ80321_H_
diff -Nru a/include/asm-arm/arch-iop3xx/irqs.h b/include/asm-arm/arch-iop3xx/irqs.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/irqs.h	Sat Apr 19 19:51:46 2003
@@ -0,0 +1,25 @@
+/*
+ * linux/include/asm-arm/arch-iop3xx/irqs.h
+ *
+ * Copyright:	(C) 2001 MontaVista 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.
+ *
+ *
+ */
+
+/*
+ * Whic iop3xx implementation is this?
+ */
+#ifdef CONFIG_ARCH_IOP310
+
+#include "iop310-irqs.h"
+
+#else
+
+#include "iop321-irqs.h"
+
+#endif
+
diff -Nru a/include/asm-arm/arch-iop3xx/memory.h b/include/asm-arm/arch-iop3xx/memory.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/memory.h	Sat Apr 19 19:51:50 2003
@@ -0,0 +1,69 @@
+/*
+ * linux/include/asm-arm/arch-iop80310/memory.h
+ */
+
+#ifndef __ASM_ARCH_MEMORY_H
+#define __ASM_ARCH_MEMORY_H
+
+#include <linux/config.h>
+#include <asm/arch/iop310.h>
+#include <asm/arch/iop321.h>
+
+/*
+ * Task size: 3GB
+ */
+#define TASK_SIZE	(0xbf000000UL)
+#define TASK_SIZE_26	(0x04000000UL)
+
+/*
+ * This decides where the kernel will search for a free chunk of vm
+ * space during mmap's.
+ */
+#define TASK_UNMAPPED_BASE (0x40000000)
+
+/*
+ * Page offset: 3GB
+ */
+#define PAGE_OFFSET	(0xc0000000UL)
+
+/*
+ * Physical DRAM offset.
+ */
+#define PHYS_OFFSET	(0xa0000000UL)
+
+/*
+ * physical vs virtual ram conversion
+ */
+#define __virt_to_phys__is_a_macro
+#define __phys_to_virt__is_a_macro
+#define __virt_to_phys(x)	((x) - PAGE_OFFSET + PHYS_OFFSET)
+#define __phys_to_virt(x)	((x) - PHYS_OFFSET + PAGE_OFFSET)
+
+/*
+ * Virtual view <-> DMA view memory address translations
+ * virt_to_bus: Used to translate the virtual address to an
+ *		address suitable to be passed to set_dma_addr
+ * bus_to_virt: Used to convert an address for DMA operations
+ *		to an address that the kernel can use.
+ */
+#define __virt_to_bus__is_a_macro
+#define __bus_to_virt__is_a_macro
+
+#ifdef CONFIG_ARCH_IOP310
+
+#define __virt_to_bus(x)	(((__virt_to_phys(x)) & ~(*IOP310_SIATVR)) | ((*IOP310_SIABAR) & 0xfffffff0))
+#define __bus_to_virt(x)    (__phys_to_virt(((x) & ~(*IOP310_SIALR)) | ( *IOP310_SIATVR)))
+
+#elif defined(CONFIG_ARCH_IOP321)
+
+#define __virt_to_bus(x)	(((__virt_to_phys(x)) & ~(*IOP321_IATVR2)) | ((*IOP321_IABAR2) & 0xfffffff0))
+#define __bus_to_virt(x)    (__phys_to_virt(((x) & ~(*IOP321_IALR2)) | ( *IOP321_IATVR2)))
+
+#endif
+
+/* boot mem allocate global pointer for MU circular queues QBAR */
+#ifdef CONFIG_IOP3XX_MU
+extern void *mu_mem;
+#endif
+
+#endif
diff -Nru a/include/asm-arm/arch-iop3xx/param.h b/include/asm-arm/arch-iop3xx/param.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/param.h	Sat Apr 19 19:51:48 2003
@@ -0,0 +1,3 @@
+/*
+ *  linux/include/asm-arm/arch-iop80310/param.h
+ */
diff -Nru a/include/asm-arm/arch-iop3xx/pmon.h b/include/asm-arm/arch-iop3xx/pmon.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/pmon.h	Sat Apr 19 19:51:49 2003
@@ -0,0 +1,50 @@
+/*
+ * Definitions for XScale 80312 PMON
+ * (C) 2001 Intel Corporation
+ * Author: Chen Chen(chen.chen@intel.com)
+ *
+ * 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.
+ */
+
+#ifndef _IOP310_PMON_H_
+#define _IOP310_PMON_H_
+
+/*
+ *  Different modes for Event Select Register for intel 80312
+ */
+
+#define IOP310_PMON_MODE0                0x00000000
+#define IOP310_PMON_MODE1                0x00000001
+#define IOP310_PMON_MODE2                0x00000002
+#define IOP310_PMON_MODE3                0x00000003
+#define IOP310_PMON_MODE4                0x00000004
+#define IOP310_PMON_MODE5                0x00000005
+#define IOP310_PMON_MODE6                0x00000006
+#define IOP310_PMON_MODE7                0x00000007
+
+typedef struct _iop310_pmon_result
+{
+	u32 timestamp;			/* Global Time Stamp Register */
+	u32 timestamp_overflow;		/* Time Stamp overflow count */
+	u32 event_count[14];		/* Programmable Event Counter
+					   Registers 1-14 */
+	u32 event_overflow[14];		/* Overflow counter for PECR1-14 */
+} iop310_pmon_res_t;
+
+/* function prototypes */
+
+/* Claim IQ80312 PMON for usage */
+int iop310_pmon_claim(void);
+
+/* Start IQ80312 PMON */
+int iop310_pmon_start(int, int);
+
+/* Stop Performance Monitor Unit */
+int iop310_pmon_stop(iop310_pmon_res_t *);
+
+/* Release IQ80312 PMON */
+int iop310_pmon_release(int);
+
+#endif
diff -Nru a/include/asm-arm/arch-iop3xx/serial.h b/include/asm-arm/arch-iop3xx/serial.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/serial.h	Sat Apr 19 19:51:50 2003
@@ -0,0 +1,45 @@
+/*
+ * include/asm-arm/arch-iop3xx/serial.h
+ */
+#include <linux/config.h>
+
+/*
+ * This assumes you have a 1.8432 MHz clock for your UART.
+ *
+ * It'd be nice if someone built a serial card with a 24.576 MHz
+ * clock, since the 16550A is capable of handling a top speed of 1.5
+ * megabits/second; but this requires the faster clock.
+ */
+#define BASE_BAUD ( 1843200 / 16 )
+
+/* Standard COM flags */
+#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
+
+#ifdef CONFIG_ARCH_IQ80310
+
+#define IRQ_UART1	IRQ_IQ80310_UART1
+#define IRQ_UART2	IRQ_IQ80310_UART2
+
+#define RS_TABLE_SIZE 2
+
+#define STD_SERIAL_PORT_DEFNS			\
+       /* UART CLK      PORT        IRQ        FLAGS        */			\
+	{ 0, BASE_BAUD, IQ80310_UART2, IRQ_UART2, STD_COM_FLAGS },  /* ttyS0 */	\
+	{ 0, BASE_BAUD, IQ80310_UART1, IRQ_UART1, STD_COM_FLAGS }  /* ttyS1 */
+
+#endif // CONFIG_ARCH_IQ80310
+
+#ifdef CONFIG_ARCH_IQ80321
+
+#define IRQ_UART1	IRQ_IQ80321_UART
+
+#define RS_TABLE_SIZE 1
+
+#define STD_SERIAL_PORT_DEFNS			\
+       /* UART CLK      PORT        IRQ        FLAGS        */			\
+	{ 0, BASE_BAUD, 0xfe800000, IRQ_UART1, STD_COM_FLAGS },  /* ttyS0 */
+#endif // CONFIG_ARCH_IQ80321
+
+
+#define EXTRA_SERIAL_PORT_DEFNS
+
diff -Nru a/include/asm-arm/arch-iop3xx/system.h b/include/asm-arm/arch-iop3xx/system.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/system.h	Sat Apr 19 19:51:50 2003
@@ -0,0 +1,27 @@
+/*
+ * linux/include/asm-arm/arch-iop80310/system.h
+ *
+ *  Copyright (C) 2001 MontaVista 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.
+ */
+
+static inline void arch_idle(void)
+{
+	cpu_do_idle();
+}
+
+
+static inline void arch_reset(char mode)
+{
+	if ( 1 && mode == 's') {
+		/* Jump into ROM at address 0 */
+		cpu_reset(0);
+	} else {
+		/* No on-chip reset capability */
+		cpu_reset(0);
+	}
+}
+
diff -Nru a/include/asm-arm/arch-iop3xx/time.h b/include/asm-arm/arch-iop3xx/time.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/time.h	Sat Apr 19 19:51:48 2003
@@ -0,0 +1,12 @@
+/*
+ * linux/include/asm-arm/arch-iop80310/time.h
+ *
+ * Author:  Nicolas Pitre
+ * Copyright:   (C) 2001 MontaVista 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.
+ *
+ */
+
diff -Nru a/include/asm-arm/arch-iop3xx/timex.h b/include/asm-arm/arch-iop3xx/timex.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/timex.h	Sat Apr 19 19:51:48 2003
@@ -0,0 +1,27 @@
+/*
+ * linux/include/asm-arm/arch-iop3xx/timex.h
+ *
+ * IOP310 architecture timex specifications
+ */
+#include <linux/config.h>
+
+
+#ifdef CONFIG_ARCH_IQ80310
+
+#ifndef CONFIG_XSCALE_PMU_TIMER
+/* This is for the on-board timer */
+#define CLOCK_TICK_RATE 33000000 /* Underlying HZ */
+#else
+/* This is for the underlying xs80200 PMU clock. We run the core @ 733MHz */
+#define CLOCK_TICK_RATE	733000000
+#endif // IQ80310
+
+#elif defined(CONFIG_ARCH_IQ80321)
+
+#define CLOCK_TICK_RATE 200000000
+
+#else
+
+#error "No IOP3xx timex information for this architecture"
+
+#endif
diff -Nru a/include/asm-arm/arch-iop3xx/uncompress.h b/include/asm-arm/arch-iop3xx/uncompress.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/uncompress.h	Sat Apr 19 19:51:47 2003
@@ -0,0 +1,37 @@
+/*
+ *  linux/include/asm-arm/arch-iop80310/uncompress.h
+ */
+#include <linux/config.h>
+#include <linux/serial_reg.h>
+#include <asm/hardware.h>
+
+#ifdef CONFIG_ARCH_IQ80310
+#define UART2_BASE    ((volatile unsigned char *)IQ80310_UART2)
+#elif defined(CONFIG_ARCH_IQ80321)
+#define UART2_BASE    ((volatile unsigned char *)IQ80321_UART1)
+#endif
+
+static __inline__ void putc(char c)
+{
+	while ((UART2_BASE[5] & 0x60) != 0x60);
+	UART2_BASE[0] = c;
+}
+
+/*
+ * This does not append a newline
+ */
+static void puts(const char *s)
+{
+	while (*s) {
+		putc(*s);
+		if (*s == '\n')
+			putc('\r');
+		s++;
+	}
+}
+
+/*
+ * nothing to do
+ */
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
diff -Nru a/include/asm-arm/arch-iop3xx/vmalloc.h b/include/asm-arm/arch-iop3xx/vmalloc.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-arm/arch-iop3xx/vmalloc.h	Sat Apr 19 19:51:49 2003
@@ -0,0 +1,19 @@
+/*
+ * linux/include/asm-arm/arch-iop3xx/vmalloc.h
+ */
+
+/*
+ * Just any arbitrary offset to the start of the vmalloc VM area: the
+ * current 8MB value just means that there will be a 8MB "hole" after the
+ * physical memory until the kernel virtual memory starts.  That means that
+ * any out-of-bounds memory accesses will hopefully be caught.
+ * The vmalloc() routines leaves a hole of 4kB between each vmalloced
+ * area for the same reason. ;)
+ */
+#define VMALLOC_OFFSET	  (8*1024*1024)
+#define VMALLOC_START	  (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
+#define VMALLOC_VMADDR(x) ((unsigned long)(x))
+#define VMALLOC_END       (0xe8000000)
+
+#define MODULE_START	(PAGE_OFFSET - 16*1048576)
+#define MODULE_END	(PAGE_OFFSET)
diff -Nru a/include/asm-arm/assembler.h b/include/asm-arm/assembler.h
--- a/include/asm-arm/assembler.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-arm/assembler.h	Sat Apr 19 19:51:28 2003
@@ -26,3 +26,13 @@
 #define push            lsr
 #define byte(x)         ((3-x)*8)
 #endif
+
+/*
+ * Data preload for architectures that support it
+ */
+#if __LINUX_ARM_ARCH__ >= 5
+#define PLD(code...)	code
+#else
+#define PLD(code...)
+#endif
+
diff -Nru a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h
--- a/include/asm-arm/bitops.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-arm/bitops.h	Sat Apr 19 19:51:28 2003
@@ -357,8 +357,12 @@
  */
 #define ext2_set_bit(nr,p)			\
 		__test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
+#define ext2_set_bit_atomic(lock,nr,p)          \
+                test_and_set_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
 #define ext2_clear_bit(nr,p)			\
 		__test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
+#define ext2_clear_bit_atomic(lock,nr,p)        \
+                test_and_clear_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
 #define ext2_test_bit(nr,p)			\
 		__test_bit(WORD_BITOFF_TO_LE(nr), (unsigned long *)(p))
 #define ext2_find_first_zero_bit(p,sz)		\
diff -Nru a/include/asm-arm/hardware/sa1111.h b/include/asm-arm/hardware/sa1111.h
--- a/include/asm-arm/hardware/sa1111.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-arm/hardware/sa1111.h	Sat Apr 19 19:51:50 2003
@@ -553,6 +553,7 @@
 	void		*mapbase;
 	unsigned int	skpcr_mask;
 	unsigned int	irq[6];
+	u64		dma_mask;
 };
 
 #define SA1111_DEV(_d)	container_of((_d), struct sa1111_dev, dev)
diff -Nru a/include/asm-arm/mach/pci.h b/include/asm-arm/mach/pci.h
--- a/include/asm-arm/mach/pci.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-arm/mach/pci.h	Sat Apr 19 19:51:47 2003
@@ -56,6 +56,10 @@
 extern struct pci_bus *iop310_scan_bus(int nr, struct pci_sys_data *);
 extern void iop310_init(void);
 
+extern int iop321_setup(int nr, struct pci_sys_data *);
+extern struct pci_bus *iop321_scan_bus(int nr, struct pci_sys_data *);
+extern void iop321_init(void);
+
 extern int dc21285_setup(int nr, struct pci_sys_data *);
 extern struct pci_bus *dc21285_scan_bus(int nr, struct pci_sys_data *);
 extern void dc21285_preinit(void);
diff -Nru a/include/asm-arm/posix_types.h b/include/asm-arm/posix_types.h
--- a/include/asm-arm/posix_types.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-arm/posix_types.h	Sat Apr 19 19:51:28 2003
@@ -45,6 +45,7 @@
 
 typedef unsigned short		__kernel_old_uid_t;
 typedef unsigned short		__kernel_old_gid_t;
+typedef unsigned short		__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long		__kernel_loff_t;
diff -Nru a/include/asm-arm/proc-armo/cache.h b/include/asm-arm/proc-armo/cache.h
--- a/include/asm-arm/proc-armo/cache.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-arm/proc-armo/cache.h	Sat Apr 19 19:51:28 2003
@@ -13,7 +13,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma,start,end)	do { } while (0)
 #define flush_cache_page(vma,vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 
 #define invalidate_dcache_range(start,end)	do { } while (0)
 #define clean_dcache_range(start,end)		do { } while (0)
diff -Nru a/include/asm-arm/proc-armv/cache.h b/include/asm-arm/proc-armv/cache.h
--- a/include/asm-arm/proc-armv/cache.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-arm/proc-armv/cache.h	Sat Apr 19 19:51:47 2003
@@ -71,13 +71,6 @@
 					 ((unsigned long)start) + size, 0);
 
 /*
- * This is an obsolete interface; the functionality that was provided by this
- * function is now merged into our flush_dcache_page, flush_icache_page,
- * copy_user_page and clear_user_page functions.
- */
-#define flush_page_to_ram(page)	do { } while (0)
-
-/*
  * flush_dcache_page is used when the kernel has written to the page
  * cache page at virtual address page->virtual.
  *
diff -Nru a/include/asm-arm/uaccess.h b/include/asm-arm/uaccess.h
--- a/include/asm-arm/uaccess.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-arm/uaccess.h	Sat Apr 19 19:51:49 2003
@@ -28,8 +28,7 @@
 	unsigned long insn, fixup;
 };
 
-/* Returns 0 if exception not found and fixup otherwise.  */
-extern unsigned long search_exception_table(unsigned long);
+extern int fixup_exception(struct pt_regs *regs);
 
 #define get_ds()	(KERNEL_DS)
 #define get_fs()	(current_thread_info()->addr_limit)
diff -Nru a/include/asm-cris/bitops.h b/include/asm-cris/bitops.h
--- a/include/asm-cris/bitops.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-cris/bitops.h	Sat Apr 19 19:51:50 2003
@@ -360,7 +360,9 @@
 #define hweight8(x) generic_hweight8(x)
 
 #define ext2_set_bit                 test_and_set_bit
+#define ext2_set_bit_atomic(l,n,a)   test_and_set_bit(n,a)
 #define ext2_clear_bit               test_and_clear_bit
+#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
 #define ext2_test_bit                test_bit
 #define ext2_find_first_zero_bit     find_first_zero_bit
 #define ext2_find_next_zero_bit      find_next_zero_bit
diff -Nru a/include/asm-cris/pgtable.h b/include/asm-cris/pgtable.h
--- a/include/asm-cris/pgtable.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-cris/pgtable.h	Sat Apr 19 19:51:28 2003
@@ -121,7 +121,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_page(page)                 do { } while (0)
 #define flush_icache_range(start, end)          do { } while (0)
 #define flush_icache_page(vma,pg)               do { } while (0)
diff -Nru a/include/asm-cris/posix_types.h b/include/asm-cris/posix_types.h
--- a/include/asm-cris/posix_types.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-cris/posix_types.h	Sat Apr 19 19:51:29 2003
@@ -38,6 +38,7 @@
 
 typedef unsigned short  __kernel_old_uid_t;
 typedef unsigned short  __kernel_old_gid_t;
+typedef unsigned short	__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long	__kernel_loff_t;
diff -Nru a/include/asm-generic/rtc.h b/include/asm-generic/rtc.h
--- a/include/asm-generic/rtc.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-generic/rtc.h	Sat Apr 19 19:51:47 2003
@@ -22,9 +22,8 @@
 #define RTC_AIE 0x20		/* alarm interrupt enable */
 #define RTC_UIE 0x10		/* update-finished interrupt enable */
 
-extern void gen_rtc_interrupt(unsigned long);
-
 /* some dummy definitions */
+#define RTC_BATT_BAD 0x100	/* battery bad */
 #define RTC_SQWE 0x08		/* enable square-wave output */
 #define RTC_DM_BINARY 0x04	/* all time/date values are BCD if clear */
 #define RTC_24H 0x02		/* 24 hour mode - else hours bit 7 means pm */
@@ -43,7 +42,7 @@
 	return uip;
 }
 
-static inline void get_rtc_time(struct rtc_time *time)
+static inline unsigned int get_rtc_time(struct rtc_time *time)
 {
 	unsigned long uip_watchdog = jiffies;
 	unsigned char ctrl;
@@ -108,6 +107,8 @@
 		time->tm_year += 100;
 
 	time->tm_mon--;
+
+	return RTC_24H;
 }
 
 /* Set the current date and time in the real time clock. */
diff -Nru a/include/asm-generic/siginfo.h b/include/asm-generic/siginfo.h
--- a/include/asm-generic/siginfo.h	Sat Apr 19 19:51:30 2003
+++ b/include/asm-generic/siginfo.h	Sat Apr 19 19:51:30 2003
@@ -1,6 +1,7 @@
 #ifndef _ASM_GENERIC_SIGINFO_H
 #define _ASM_GENERIC_SIGINFO_H
 
+#include <linux/compiler.h>
 #include <linux/types.h>
 
 typedef union sigval {
@@ -106,7 +107,7 @@
 #define si_fd		_sifields._sigpoll._fd
 
 #ifdef __KERNEL__
-#define __SI_MASK	0xffff0000
+#define __SI_MASK	0xffff0000u
 #define __SI_KILL	(0 << 16)
 #define __SI_TIMER	(1 << 16)
 #define __SI_POLL	(2 << 16)
@@ -275,7 +276,7 @@
 
 #endif
 
-extern int copy_siginfo_to_user(struct siginfo *to, struct siginfo *from);
+extern int copy_siginfo_to_user(struct siginfo __user *to, struct siginfo *from);
 
 #endif /* __KERNEL__ */
 
diff -Nru a/include/asm-h8300/a.out.h b/include/asm-h8300/a.out.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/a.out.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,26 @@
+#ifndef __H8300_A_OUT_H__
+#define __H8300_A_OUT_H__
+
+struct exec
+{
+  unsigned long 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 */
+  unsigned a_syms;		/* length of symbol table data in file, in bytes */
+  unsigned a_entry;		/* start address */
+  unsigned a_trsize;		/* length of relocation info for text, in bytes */
+  unsigned a_drsize;		/* length of relocation info for data, in bytes */
+};
+
+#define N_TRSIZE(a)	((a).a_trsize)
+#define N_DRSIZE(a)	((a).a_drsize)
+#define N_SYMSIZE(a)	((a).a_syms)
+
+#ifdef __KERNEL__
+
+#define STACK_TOP	TASK_SIZE
+
+#endif
+
+#endif /* __H8300_A_OUT_H__ */
diff -Nru a/include/asm-h8300/aki3068net/ne.h b/include/asm-h8300/aki3068net/ne.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/aki3068net/ne.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,23 @@
+/* AE-3068 (aka. aki3068net) RTL8019AS Config */
+
+#define NE2000_ADDR		CONFIG_NE_BASE
+#define NE2000_IRQ              5
+#define NE2000_IRQ_VECTOR	(12 + NE2000_IRQ)
+#define	NE2000_BYTE		volatile unsigned short
+
+#define IER                     0xfee015
+#define ISR			0xfee016
+#define IRQ_MASK		(1 << NE2000_IRQ)
+
+#define WCRL                    0xfee023
+#define MAR0A                   0xffff20
+#define ETCR0A                  0xffff24
+#define DTCR0A                  0xffff27
+#define MAR0B                   0xffff28
+#define DTCR0B                  0xffff2f
+
+#define H8300_INIT_NE()                  \
+do {                                     \
+	wordlength = 1;                  \
+        outb_p(0x48, ioaddr + EN0_DCFG); \
+} while(0)
diff -Nru a/include/asm-h8300/atomic.h b/include/asm-h8300/atomic.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/atomic.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,107 @@
+#ifndef __ARCH_H8300_ATOMIC__
+#define __ARCH_H8300_ATOMIC__
+
+/*
+ * Atomic operations that C can't guarantee us.  Useful for
+ * resource counting etc..
+ */
+
+typedef struct { int counter; } atomic_t;
+#define ATOMIC_INIT(i)	{ (i) }
+
+#define atomic_read(v)		((v)->counter)
+#define atomic_set(v, i)	(((v)->counter) = i)
+
+#include <asm/system.h>
+#include <linux/kernel.h>
+
+static __inline__ int atomic_add_return(int i, atomic_t *v)
+{
+	int ret,flags;
+	local_irq_save(flags);
+	ret = v->counter += i;
+	local_irq_restore(flags);
+	return ret;
+}
+
+#define atomic_add(i, v) atomic_add_return(i, v)
+
+static __inline__ int atomic_sub_return(int i, atomic_t *v)
+{
+	int ret,flags;
+	local_irq_save(flags);
+	ret = v->counter -= i;
+	local_irq_restore(flags);
+	return ret;
+}
+
+#define atomic_sub(i, v) atomic_sub_return(i, v)
+
+static __inline__ int atomic_inc_return(atomic_t *v)
+{
+	int ret,flags;
+	local_irq_save(flags);
+	v->counter++;
+	ret = v->counter;
+	local_irq_restore(flags);
+	return ret;
+}
+
+#define atomic_inc(v) atomic_inc_return(v)
+
+static __inline__ int atomic_dec_return(atomic_t *v)
+{
+	int ret,flags;
+	local_irq_save(flags);
+	--v->counter;
+	ret = v->counter;
+	local_irq_restore(flags);
+	return ret;
+}
+
+#define atomic_dec(v) atomic_dec_return(v)
+
+static __inline__ int atomic_dec_and_test(atomic_t *v)
+{
+	int ret,flags;
+	local_irq_save(flags);
+	--v->counter;
+	ret = v->counter;
+	local_irq_restore(flags);
+	return ret == 0;
+}
+
+static __inline__ void atomic_clear_mask(unsigned long mask, unsigned long *v)
+{
+	__asm__ __volatile__("stc ccr,r2l\n\t"
+	                     "orc #0x80,ccr\n\t"
+	                     "mov.l %0,er0\n\t"
+	                     "mov.l %1,er1\n\t"
+	                     "and.l er1,er0\n\t"
+	                     "mov.l er0,%0\n\t"
+	                     "ldc r2l,ccr" 
+                             : "=m" (*v) : "ir" (~(mask)) :"er0","er1","er2");
+}
+
+static __inline__ void atomic_set_mask(unsigned long mask, unsigned long *v)
+{
+	__asm__ __volatile__("stc ccr,r2l\n\t"
+	                     "orc #0x80,ccr\n\t"
+	                     "mov.l %0,er0\n\t"
+	                     "mov.l %1,er1\n\t"
+	                     "or.l er1,er0\n\t"
+	                     "mov.l er0,%0\n\t"
+	                     "ldc r2l,ccr" 
+                             : "=m" (*v) : "ir" (mask) :"er0","er1","er2");
+}
+
+/* Atomic operations are already serializing */
+#define smp_mb__before_atomic_dec()    barrier()
+#define smp_mb__after_atomic_dec() barrier()
+#define smp_mb__before_atomic_inc()    barrier()
+#define smp_mb__after_atomic_inc() barrier()
+
+#define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0)
+#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
+
+#endif /* __ARCH_H8300_ATOMIC __ */
diff -Nru a/include/asm-h8300/bitops.h b/include/asm-h8300/bitops.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/bitops.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,480 @@
+#ifndef _H8300_BITOPS_H
+#define _H8300_BITOPS_H
+
+/*
+ * Copyright 1992, Linus Torvalds.
+ * Copyright 2002, Yoshinori Sato
+ */
+
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/compiler.h>
+#include <asm/byteorder.h>	/* swab32 */
+
+#ifdef __KERNEL__
+/*
+ * Function prototypes to keep gcc -Wall happy
+ */
+
+/*
+ * The __ functions are not atomic
+ */
+
+extern void set_bit(int nr, volatile unsigned long* addr);
+extern void clear_bit(int nr, volatile unsigned long* addr);
+extern void change_bit(int nr, volatile unsigned long* addr);
+extern int test_and_set_bit(int nr, volatile unsigned long* addr);
+extern int __test_and_set_bit(int nr, volatile unsigned long* addr);
+extern int test_and_clear_bit(int nr, volatile unsigned long* addr);
+extern int __test_and_clear_bit(int nr, volatile unsigned long* addr);
+extern int test_and_change_bit(int nr, volatile unsigned long* addr);
+extern int __test_and_change_bit(int nr, volatile unsigned long* addr);
+extern int __constant_test_bit(int nr, const volatile unsigned long* addr);
+extern int __test_bit(int nr, volatile unsigned long* addr);
+extern int find_first_zero_bit(void * addr, unsigned size);
+extern int find_next_zero_bit (void * addr, int size, int offset);
+
+/*
+ * ffz = Find First Zero in word. Undefined if no zero exists,
+ * so code should check against ~0UL first..
+ */
+extern __inline__ unsigned long ffz(unsigned long word)
+{
+	unsigned long result;
+
+	__asm__("sub.l %0,%0\n\t"
+		"dec.l #1,%0\n"
+		"1:\n\t"
+		"shlr.l %1\n\t"
+		"adds #1,%0\n\t"
+		"bcs 1b"
+		: "=r" (result) : "r" (word));
+	return result;
+}
+
+extern __inline__ void set_bit(int nr, volatile unsigned long* addr)
+{
+	unsigned char *a = (unsigned char *) addr;
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %0,er0\n\t"
+		"bset r0l,@%1"
+		::"r"(nr & 7),"r"(a):"er0","er1");
+}
+/* Bigendian is complexed... */
+
+#define __set_bit(nr, addr) set_bit(nr, addr)
+
+/*
+ * clear_bit() doesn't provide any barrier for the compiler.
+ */
+#define smp_mb__before_clear_bit()	barrier()
+#define smp_mb__after_clear_bit()	barrier()
+
+extern __inline__ void clear_bit(int nr, volatile unsigned long* addr)
+{
+	unsigned char *a = (unsigned char *) addr;
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %0,er0\n\t"
+		"bclr r0l,@%1"
+		::"r"(nr & 7),"r"(a):"er0");
+}
+
+#define __clear_bit(nr, addr) clear_bit(nr, addr)
+
+extern __inline__ void change_bit(int nr, volatile unsigned long* addr)
+{
+	unsigned char *a = (unsigned char *) addr;
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %0,er0\n\t"
+		"bnot r0l,@%1"
+		::"r"(nr & 7),"r"(a):"er0");
+}
+
+#define __change_bit(nr, addr) change_bit(nr, addr)
+
+extern __inline__ int test_and_set_bit(int nr, volatile unsigned long* addr)
+{
+	int retval;
+	unsigned char *a;
+	a = (unsigned char *) addr;
+
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %1,er0\n\t"
+		"stc ccr,r0h\n\t"
+		"orc #0x80,ccr\n\t"
+		"btst r0l,@%2\n\t"
+		"bset r0l,@%2\n\t"
+		"stc ccr,r0l\n\t"
+		"ldc r0h,ccr\n\t"
+		"btst #2,r0l\n\t"
+		"bne 1f\n\t"
+		"sub.l %0,%0\n\t"
+		"inc.l #1,%0\n"
+		"bra 2f\n"
+		"1:\n\t"
+		"sub.l %0,%0\n"
+		"2:"
+		: "=r"(retval) :"r"(nr & 7),"r"(a):"er0");
+	return retval;
+}
+
+extern __inline__ int __test_and_set_bit(int nr, volatile unsigned long* addr)
+{
+	int retval;
+	unsigned char *a = (unsigned char *) addr;
+
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %1,er0\n\t"
+		"btst r0l,@%2\n\t"
+		"bset r0l,@%2\n\t"
+		"beq 1f\n\t"
+		"sub.l %0,%0\n\t"
+		"inc.l #1,%0\n"
+		"bra 2f\n"
+		"1:\n\t"
+		"sub.l %0,%0\n"
+		"2:"
+		: "=r"(retval) :"r"(nr & 7),"r"(a):"er0");
+	return retval;
+}
+
+extern __inline__ int test_and_clear_bit(int nr, volatile unsigned long* addr)
+{
+	int retval;
+	unsigned char *a = (unsigned char *) addr;
+
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %1,er0\n\t"
+		"stc ccr,r0h\n\t"
+		"orc #0x80,ccr\n\t"
+		"btst r0l,@%2\n\t"
+		"bclr r0l,@%2\n\t"
+		"stc ccr,r0l\n\t"
+		"ldc r0h,ccr\n\t"
+		"btst #2,r0l\n\t"
+		"bne 1f\n\t"
+		"sub.l %0,%0\n\t"
+		"inc.l #1,%0\n"
+		"bra 2f\n"
+		"1:\n\t"
+		"sub.l %0,%0\n"
+		"2:"
+		: "=r"(retval) :"r"(nr & 7),"r"(a):"er0");
+	return retval;
+}
+
+extern __inline__ int __test_and_clear_bit(int nr, volatile unsigned long* addr)
+{
+	int retval;
+	unsigned char *a = (unsigned char *) addr;
+
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %1,er0\n\t"
+		"btst r0l,@%2\n\t"
+		"bclr r0l,@%2\n\t"
+		"beq 1f\n\t"
+		"sub.l %0,%0\n\t"
+		"inc.l #1,%0\n"
+		"bra 2f\n"
+		"1:\n\t"
+		"sub.l %0,%0\n"
+		"2:"
+		: "=r"(retval) :"r"(nr & 7),"r"(a):"er0");
+	return retval;
+}
+
+extern __inline__ int test_and_change_bit(int nr, volatile unsigned long* addr)
+{
+	int retval;
+	unsigned char *a = (unsigned char *) addr;
+
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %1,er0\n\t"
+		"stc ccr,r0h\n\t"
+		"orc #0x80,ccr\n\t"
+		"btst r0l,@%2\n\t"
+		"bnot r0l,@%2\n\t"
+		"stc ccr,r0l\n\t"
+		"ldc r0h,ccr\n\t"
+		"btst #2,r0l\n\t"
+		"bne 1f\n\t"
+		"sub.l %0,%0\n\t"
+		"inc.l #1,%0\n"
+		"bra 2f\n"
+		"1:\n\t"
+		"sub.l %0,%0\n"
+		"2:"
+		: "=r"(retval) :"r"(nr & 7),"r"(a):"er0");
+	return retval;
+}
+
+extern __inline__ int __test_and_change_bit(int nr, volatile unsigned long* addr)
+{
+	int retval;
+	unsigned char *a = (unsigned char *) addr;
+
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %1,er0\n\t"
+		"btst r0l,@%2\n\t"
+		"bnot r0l,@%2\n\t"
+		"beq 1f\n\t"
+		"sub.l %0,%0\n\t"
+		"inc.l #1,%0\n"
+		"bra 2f\n"
+		"1:\n\t"
+		"sub.l %0,%0\n"
+		"2:"
+		: "=r"(retval) :"r"(nr & 7),"r"(a):"er0");
+	return retval;
+}
+
+/*
+ * This routine doesn't need to be atomic.
+ */
+extern __inline__ int __constant_test_bit(int nr, const volatile unsigned long* addr)
+{
+	return ((1UL << (nr & 7)) & 
+               (((const volatile unsigned char *) addr)
+               [((nr >> 3) & ~3) + 3 - ((nr >> 3) & 3)])) != 0;
+}
+
+extern __inline__ int __test_bit(int nr, volatile unsigned long* addr)
+{
+	int retval;
+	unsigned char *a = (unsigned char *) addr;
+
+	a += ((nr >> 3) & ~3) + (3 - ((nr >> 3) & 3));
+	__asm__("mov.l %1,er0\n\t"
+		"btst r0l,@%2\n\t"
+		"beq 1f\n\t"
+		"sub.l %0,%0\n\t"
+		"inc.l #1,%0\n"
+		"bra 2f\n"
+		"1:\n\t"
+		"sub.l %0,%0\n"
+		"2:"
+		: "=r"(retval) :"r"(nr & 7),"r"(a):"er0");
+	return retval;
+}
+
+#define test_bit(nr,addr) \
+(__builtin_constant_p(nr) ? \
+ __constant_test_bit((nr),(addr)) : \
+ __test_bit((nr),(addr)))
+
+
+#define find_first_zero_bit(addr, size) \
+        find_next_zero_bit((addr), (size), 0)
+
+extern __inline__ int find_next_zero_bit (void * addr, int size, int offset)
+{
+	unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
+	unsigned long result = offset & ~31UL;
+	unsigned long tmp;
+
+	if (offset >= size)
+		return size;
+	size -= result;
+	offset &= 31UL;
+	if (offset) {
+		tmp = *(p++);
+		tmp |= ~0UL >> (32-offset);
+		if (size < 32)
+			goto found_first;
+		if (~tmp)
+			goto found_middle;
+		size -= 32;
+		result += 32;
+	}
+	while (size & ~31UL) {
+		if (~(tmp = *(p++)))
+			goto found_middle;
+		result += 32;
+		size -= 32;
+	}
+	if (!size)
+		return result;
+	tmp = *p;
+
+found_first:
+	tmp |= ~0UL >> size;
+found_middle:
+	return result + ffz(tmp);
+}
+
+extern __inline__ unsigned long ffs(unsigned long word)
+{
+	unsigned long result;
+
+	__asm__("sub.l er0,er0\n\t"
+		"dec.l #1,er0\n"
+		"1:\n\t"
+		"shlr.l %1\n\t"
+		"adds #1,er0\n\t"
+		"bcc 1b\n\t"
+		"mov.l er0,%0"
+		: "=r" (result) : "r"(word) : "er0");
+	return result;
+}
+
+#define __ffs(x) ffs(x)
+
+/*
+ * fls: find last bit set.
+ */
+#define fls(x) generic_fls(x)
+
+/*
+ * Every architecture must define this function. It's the fastest
+ * way of searching a 140-bit bitmap where the first 100 bits are
+ * unlikely to be set. It's guaranteed that at least one of the 140
+ * bits is cleared.
+ */
+static inline int sched_find_first_bit(unsigned long *b)
+{
+	if (unlikely(b[0]))
+		return __ffs(b[0]);
+	if (unlikely(b[1]))
+		return __ffs(b[1]) + 32;
+	if (unlikely(b[2]))
+		return __ffs(b[2]) + 64;
+	if (b[3])
+		return __ffs(b[3]) + 96;
+	return __ffs(b[4]) + 128;
+}
+
+/*
+ * hweightN: returns the hamming weight (i.e. the number
+ * of bits set) of a N-bit word
+ */
+
+#define hweight32(x) generic_hweight32(x)
+#define hweight16(x) generic_hweight16(x)
+#define hweight8(x) generic_hweight8(x)
+
+extern __inline__ int ext2_set_bit(int nr, volatile void *addr)
+{
+	unsigned char *a = (unsigned char *) addr;
+	register unsigned short r __asm__("er0");
+	a += nr >> 3;
+	__asm__("mov.l %1,er0\n\t"
+		"sub.w e0,e0\n\t"
+		"btst r0l,@%2\n\t"
+		"bset r0l,@%2\n\t"
+		"beq 1f\n\t"
+		"inc.w #1,e0\n"
+		"1:\n\t"
+		"mov.w e0,r0\n\t"
+		"sub.w e0,e0"
+		:"=r"(r):"r"(nr & 7),"r"(a));
+	return r;
+}
+
+extern __inline__ int ext2_clear_bit(int nr, volatile void *addr)
+{
+	unsigned char *a = (unsigned char *) addr;
+	register unsigned short r __asm__("er0");
+	a += nr >> 3;
+	__asm__("mov.l %1,er0\n\t"
+		"sub.w e0,e0\n\t"
+		"btst r0l,@%2\n\t"
+		"bclr r0l,@%2\n\t"
+		"beq 1f\n\t"
+		"inc.w #1,e0\n"
+		"1:\n\t"
+		"mov.w e0,r0\n\t"
+		"sub.w e0,e0"
+		:"=r"(r):"r"(nr & 7),"r"(a));
+	return r;
+}
+
+extern __inline__ int ext2_test_bit(int nr, volatile void *addr)
+{
+	unsigned char *a = (unsigned char *) addr;
+	int ret;
+	a += nr >> 3;
+	__asm__("mov.l %1,er0\n\t"
+		"sub.l %0,%0\n\t"
+		"btst r0l,@%2\n\t"
+		"beq 1f\n\t"
+		"inc.l #1,%0\n"
+		"1:"
+		: "=r"(ret) :"r"(nr & 7),"r"(a):"er0","er1");
+	return ret;
+}
+
+
+#define ext2_find_first_zero_bit(addr, size) \
+        ext2_find_next_zero_bit((addr), (size), 0)
+
+extern __inline__ unsigned long ext2_find_next_zero_bit(void *addr, unsigned long size, unsigned long offset)
+{
+	unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
+	unsigned long result = offset & ~31UL;
+	unsigned long tmp;
+
+	if (offset >= size)
+		return size;
+	size -= result;
+	offset &= 31UL;
+	if(offset) {
+		/* We hold the little endian value in tmp, but then the
+		 * shift is illegal. So we could keep a big endian value
+		 * in tmp, like this:
+		 *
+		 * tmp = __swab32(*(p++));
+		 * tmp |= ~0UL >> (32-offset);
+		 *
+		 * but this would decrease performance, so we change the
+		 * shift:
+		 */
+		tmp = *(p++);
+		tmp |= __swab32(~0UL >> (32-offset));
+		if(size < 32)
+			goto found_first;
+		if(~tmp)
+			goto found_middle;
+		size -= 32;
+		result += 32;
+	}
+	while(size & ~31UL) {
+		if(~(tmp = *(p++)))
+			goto found_middle;
+		result += 32;
+		size -= 32;
+	}
+	if(!size)
+		return result;
+	tmp = *p;
+
+found_first:
+	/* tmp is little endian, so we would have to swab the shift,
+	 * see above. But then we have to swab tmp below for ffz, so
+	 * we might as well do this here.
+	 */
+	return result + ffz(__swab32(tmp) | (~0UL << size));
+found_middle:
+	return result + ffz(__swab32(tmp));
+}
+
+/* Bitmap functions for the minix filesystem.  */
+#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
+#define minix_set_bit(nr,addr) set_bit(nr,addr)
+#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__ */
+
+#endif /* _H8300_BITOPS_H */
diff -Nru a/include/asm-h8300/bootinfo.h b/include/asm-h8300/bootinfo.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/bootinfo.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,2 @@
+
+/* Nothing for h8300 */
diff -Nru a/include/asm-h8300/bug.h b/include/asm-h8300/bug.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/bug.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,12 @@
+#ifndef _H8300_BUG_H
+#define _H8300_BUG_H
+
+#define BUG() do { \
+  printk("%s(%d): kernel BUG!\n", __FILE__, __LINE__); \
+} while (0)
+
+#define PAGE_BUG(page) do { \
+         BUG(); \
+} while (0)
+
+#endif
diff -Nru a/include/asm-h8300/bugs.h b/include/asm-h8300/bugs.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/bugs.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,16 @@
+/*
+ *  include/asm-h8300/bugs.h
+ *
+ *  Copyright (C) 1994  Linus Torvalds
+ */
+
+/*
+ * This is included by init/main.c to check for architecture-dependent bugs.
+ *
+ * Needs:
+ *	void check_bugs(void);
+ */
+
+static void check_bugs(void)
+{
+}
diff -Nru a/include/asm-h8300/byteorder.h b/include/asm-h8300/byteorder.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/byteorder.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+#ifndef _H8300_BYTEORDER_H
+#define _H8300_BYTEORDER_H
+
+#include <asm/types.h>
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
+#  define __BYTEORDER_HAS_U64__
+#  define __SWAB_64_THRU_32__
+#endif
+
+#include <linux/byteorder/big_endian.h>
+
+#endif /* _H8300_BYTEORDER_H */
diff -Nru a/include/asm-h8300/cache.h b/include/asm-h8300/cache.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/cache.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,12 @@
+#ifndef __ARCH_H8300_CACHE_H
+#define __ARCH_H8300_CACHE_H
+
+/* bytes per L1 cache line */
+#define        L1_CACHE_BYTES  4
+
+/* m68k-elf-gcc  2.95.2 doesn't like these */
+
+#define __cacheline_aligned
+#define ____cacheline_aligned
+
+#endif
diff -Nru a/include/asm-h8300/cachectl.h b/include/asm-h8300/cachectl.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/cachectl.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,14 @@
+#ifndef _H8300_CACHECTL_H
+#define _H8300_CACHECTL_H
+
+/* Definitions for the cacheflush system call.  */
+
+#define FLUSH_SCOPE_LINE    0	/* Flush a cache line */
+#define FLUSH_SCOPE_PAGE    0	/* Flush a page */
+#define FLUSH_SCOPE_ALL     0	/* Flush the whole cache -- superuser only */
+
+#define FLUSH_CACHE_DATA    0	/* Writeback and flush data cache */
+#define FLUSH_CACHE_INSN    0	/* Flush instruction cache */
+#define FLUSH_CACHE_BOTH    0	/* Flush both caches */
+
+#endif /* _H8300_CACHECTL_H */
diff -Nru a/include/asm-h8300/cacheflush.h b/include/asm-h8300/cacheflush.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/cacheflush.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,31 @@
+/*
+ * (C) Copyright 2002, Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+#ifndef _ASM_H8300_CACHEFLUSH_H
+#define _AMS_H8300_CACHEFLUSH_H
+
+/*
+ * Cache handling functions
+ * No Cache memory all dummy functions
+ */
+
+#define flush_cache_all()
+#define	flush_cache_all()
+#define	flush_cache_mm(mm)
+#define	flush_cache_range(vma,a,b)
+#define	flush_cache_page(vma,p)
+#define	flush_page_to_ram(page)
+#define	flush_dcache_page(page)
+#define	flush_icache()
+#define	flush_icache_page(vma,page)
+#define	flush_icache_range(start,len)
+#define	cache_push_v(vaddr,len)
+#define	cache_push(paddr,len)
+#define	cache_clear(paddr,len)
+
+#define	flush_dcache_range(a,b)
+
+#define	flush_icache_user_range(vma,page,addr,len)
+
+#endif /* _ASM_H8300_CACHEFLUSH_H */
diff -Nru a/include/asm-h8300/checksum.h b/include/asm-h8300/checksum.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/checksum.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,105 @@
+#ifndef _H8300_CHECKSUM_H
+#define _H8300_CHECKSUM_H
+
+/*
+ * computes the checksum of a memory block at buff, length len,
+ * and adds in "sum" (32-bit)
+ *
+ * returns a 32-bit number suitable for feeding into itself
+ * or csum_tcpudp_magic
+ *
+ * this function must be called with even lengths, except
+ * for the last fragment, which may be odd
+ *
+ * it's best to have buff aligned on a 32-bit boundary
+ */
+unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum);
+
+/*
+ * the same as csum_partial, but copies from src while it
+ * checksums
+ *
+ * here even more important to align src and dst on a 32-bit (or even
+ * better 64-bit) boundary
+ */
+
+unsigned int csum_partial_copy(const char *src, char *dst, int len, int sum);
+
+
+/*
+ * the same as csum_partial_copy, but copies from user space.
+ *
+ * here even more important to align src and dst on a 32-bit (or even
+ * better 64-bit) boundary
+ */
+
+extern unsigned int csum_partial_copy_from_user(const char *src, char *dst,
+						int len, int sum, int *csum_err);
+
+#define csum_partial_copy_nocheck(src, dst, len, sum)	\
+	csum_partial_copy((src), (dst), (len), (sum))
+
+unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl);
+
+
+/*
+ *	Fold a partial checksum
+ */
+
+static inline unsigned int csum_fold(unsigned int sum)
+{
+	__asm__("mov.l %0,er0\n\t"
+	        "sub.w r1,r1\n\t"
+		"add.w e0,r0\n\t"
+		"addx #0,r1l\n\t"
+		"add.w r1,r0\n\t"
+		"sub.w e0,e0\n\t"
+		"mov.l er0,%0"
+		: "=r"(sum)
+		: "0"(sum)
+		: "er0","er1");
+	return ~sum;
+}
+
+
+/*
+ * computes the checksum of the TCP/UDP pseudo-header
+ * returns a 16-bit checksum, already complemented
+ */
+
+static inline unsigned int
+csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr, unsigned short len,
+		  unsigned short proto, unsigned int sum)
+{
+	__asm__ ("sub.l er0,er0\n\t"
+		 "add.l %2,%0\n\t"
+		 "addx	#0,r0l\n\t"
+		 "add.l	%3,%0\n\t"
+		 "addx	#0,r0l\n\t"
+		 "add.l %4,%0\n\t"
+		 "addx	#0,r0l\n\t"
+		 "add.l	er0,%0\n\t"
+		 "bcc	1f\n\t"
+		 "inc.l	#1,%0\n"
+		 "1:"
+		 : "=&r" (sum)
+		 : "0" (sum), "r" (daddr), "r" (saddr), "r" (len + proto)
+		 :"er0");
+	return sum;
+}
+
+static inline unsigned short int
+csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, unsigned short len,
+		  unsigned short proto, unsigned int sum)
+{
+	return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
+}
+
+/*
+ * this routine is used for miscellaneous IP-like checksums, mainly
+ * in icmp.c
+ */
+
+extern unsigned short ip_compute_csum(const unsigned char * buff, int len);
+
+#endif /* _H8300_CHECKSUM_H */
diff -Nru a/include/asm-h8300/current.h b/include/asm-h8300/current.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/current.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,25 @@
+#ifndef _H8300_CURRENT_H
+#define _H8300_CURRENT_H
+/*
+ *	current.h
+ *	(C) Copyright 2000, Lineo, David McCullough <davidm@lineo.com>
+ *	(C) Copyright 2002, Greg Ungerer (gerg@snapgear.com)
+ *
+ *	rather than dedicate a register (as the m68k source does), we
+ *	just keep a global,  we should probably just change it all to be
+ *	current and lose _current_task.
+ */
+
+#include <linux/thread_info.h>
+#include <asm/thread_info.h>
+
+struct task_struct;
+
+static inline struct task_struct *get_current(void)
+{
+	return(current_thread_info()->task);
+}
+
+#define	current	get_current()
+
+#endif /* _H8300_CURRENT_H */
diff -Nru a/include/asm-h8300/dbg.h b/include/asm-h8300/dbg.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/dbg.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,2 @@
+#define DEBUG 1
+#define	BREAK asm volatile ("trap #3")
diff -Nru a/include/asm-h8300/delay.h b/include/asm-h8300/delay.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/delay.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,39 @@
+#ifndef _H8300_DELAY_H
+#define _H8300_DELAY_H
+
+#include <asm/param.h>
+
+/*
+ * Copyright (C) 2002 Yoshinori Sato <ysato@sourceforge.jp>
+ *
+ * Delay routines, using a pre-computed "loops_per_second" value.
+ */
+
+extern __inline__ void __delay(unsigned long loops)
+{
+	__asm__ __volatile__ ("mov.l %0,er0\n\t"
+			      "1:\n\t"
+			      "dec.l #1,er0\n\t"
+			      "bne 1b"
+			      ::"r" (loops):"er0");
+}
+
+/*
+ * Use only for very small delays ( < 1 msec).  Should probably use a
+ * lookup table, really, as the multiplications take much too long with
+ * short delays.  This is a "reasonable" implementation, though (and the
+ * first constant multiplications gets optimized away if the delay is
+ * a constant)  
+ */
+
+extern unsigned long loops_per_jiffy;
+
+extern __inline__ void udelay(unsigned long usecs)
+{
+	usecs *= 4295;		/* 2**32 / 1000000 */
+	usecs /= (loops_per_jiffy*HZ);
+	if (usecs)
+		__delay(usecs);
+}
+
+#endif /* _H8300_DELAY_H */
diff -Nru a/include/asm-h8300/div64.h b/include/asm-h8300/div64.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/div64.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+#ifndef H8300_DIV64_H
+#define H8300_DIV64_H
+
+/* n = n / base; return rem; */
+
+#define do_div(n,base) ({					\
+	int __res;						\
+	__res = ((unsigned long) n) % (unsigned) base;		\
+	n = ((unsigned long) n) / (unsigned) base;		\
+	__res;							\
+})
+
+#endif /* _H8300_DIV64_H */
diff -Nru a/include/asm-h8300/dma.h b/include/asm-h8300/dma.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/dma.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,16 @@
+#ifndef _H8300_DMA_H
+#define _H8300_DMA_H 
+ 
+#include <linux/config.h>
+
+/*
+ * Set number of channels of DMA on ColdFire for different implementations.
+ */
+#define MAX_DMA_CHANNELS 0
+#define MAX_DMA_ADDRESS PAGE_OFFSET
+
+/* These are in kernel/dma.c: */
+extern int request_dma(unsigned int dmanr, const char *device_id);	/* reserve a DMA channel */
+extern void free_dma(unsigned int dmanr);	/* release it again */
+ 
+#endif /* _H8300_DMA_H */
diff -Nru a/include/asm-h8300/elf.h b/include/asm-h8300/elf.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/elf.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,57 @@
+#ifndef __ASMH8300_ELF_H
+#define __ASMH8300_ELF_H
+
+/*
+ * ELF register definitions..
+ */
+
+#include <linux/config.h>
+#include <asm/ptrace.h>
+#include <asm/user.h>
+
+typedef unsigned long elf_greg_t;
+
+#define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+typedef struct user_m68kfp_struct elf_fpregset_t;
+
+/*
+ * This is used to ensure we don't load something for the wrong architecture.
+ */
+#define elf_check_arch(x) ((x)->e_machine == EM_68K)
+
+/*
+ * These are used to set parameters in the core dumps.
+ */
+#define ELF_CLASS	ELFCLASS32
+#define ELF_DATA	ELFDATA2MSB
+#define ELF_ARCH	EM_H8_300H
+
+#define ELF_PLAT_INIT(_r)	_r->er1 = 0
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE	4096
+#endif
+
+/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
+   use of this is to invoke "./ld.so someprog" to test out a new version of
+   the loader.  We need to make sure that it is out of the way of the program
+   that it will "exec", and that there is sufficient room for the brk.  */
+
+#define ELF_ET_DYN_BASE         0xD0000000UL
+
+/* This yields a mask that user programs can use to figure out what
+   instruction set this cpu supports.  */
+
+#define ELF_HWCAP	(0)
+
+/* This yields a string that ld.so will use to load implementation
+   specific libraries for optimization.  This is more specific in
+   intent than poking at uname or /proc/cpuinfo.  */
+
+#define ELF_PLATFORM  (NULL)
+
+#ifdef __KERNEL__
+#define SET_PERSONALITY(ex, ibcs2) set_personality(PER_LINUX)
+#endif
diff -Nru a/include/asm-h8300/errno.h b/include/asm-h8300/errno.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/errno.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,132 @@
+#ifndef _H8300_ERRNO_H
+#define _H8300_ERRNO_H
+
+#define	EPERM		 1	/* Operation not permitted */
+#define	ENOENT		 2	/* No such file or directory */
+#define	ESRCH		 3	/* No such process */
+#define	EINTR		 4	/* Interrupted system call */
+#define	EIO		 5	/* I/O error */
+#define	ENXIO		 6	/* No such device or address */
+#define	E2BIG		 7	/* Arg list too long */
+#define	ENOEXEC		 8	/* Exec format error */
+#define	EBADF		 9	/* Bad file number */
+#define	ECHILD		10	/* No child processes */
+#define	EAGAIN		11	/* Try again */
+#define	ENOMEM		12	/* Out of memory */
+#define	EACCES		13	/* Permission denied */
+#define	EFAULT		14	/* Bad address */
+#define	ENOTBLK		15	/* Block device required */
+#define	EBUSY		16	/* Device or resource busy */
+#define	EEXIST		17	/* File exists */
+#define	EXDEV		18	/* Cross-device link */
+#define	ENODEV		19	/* No such device */
+#define	ENOTDIR		20	/* Not a directory */
+#define	EISDIR		21	/* Is a directory */
+#define	EINVAL		22	/* Invalid argument */
+#define	ENFILE		23	/* File table overflow */
+#define	EMFILE		24	/* Too many open files */
+#define	ENOTTY		25	/* Not a typewriter */
+#define	ETXTBSY		26	/* Text file busy */
+#define	EFBIG		27	/* File too large */
+#define	ENOSPC		28	/* No space left on device */
+#define	ESPIPE		29	/* Illegal seek */
+#define	EROFS		30	/* Read-only file system */
+#define	EMLINK		31	/* Too many links */
+#define	EPIPE		32	/* Broken pipe */
+#define	EDOM		33	/* Math argument out of domain of func */
+#define	ERANGE		34	/* Math result not representable */
+#define	EDEADLK		35	/* Resource deadlock would occur */
+#define	ENAMETOOLONG	36	/* File name too long */
+#define	ENOLCK		37	/* No record locks available */
+#define	ENOSYS		38	/* Function not implemented */
+#define	ENOTEMPTY	39	/* Directory not empty */
+#define	ELOOP		40	/* Too many symbolic links encountered */
+#define	EWOULDBLOCK	EAGAIN	/* Operation would block */
+#define	ENOMSG		42	/* No message of desired type */
+#define	EIDRM		43	/* Identifier removed */
+#define	ECHRNG		44	/* Channel number out of range */
+#define	EL2NSYNC	45	/* Level 2 not synchronized */
+#define	EL3HLT		46	/* Level 3 halted */
+#define	EL3RST		47	/* Level 3 reset */
+#define	ELNRNG		48	/* Link number out of range */
+#define	EUNATCH		49	/* Protocol driver not attached */
+#define	ENOCSI		50	/* No CSI structure available */
+#define	EL2HLT		51	/* Level 2 halted */
+#define	EBADE		52	/* Invalid exchange */
+#define	EBADR		53	/* Invalid request descriptor */
+#define	EXFULL		54	/* Exchange full */
+#define	ENOANO		55	/* No anode */
+#define	EBADRQC		56	/* Invalid request code */
+#define	EBADSLT		57	/* Invalid slot */
+
+#define	EDEADLOCK	EDEADLK
+
+#define	EBFONT		59	/* Bad font file format */
+#define	ENOSTR		60	/* Device not a stream */
+#define	ENODATA		61	/* No data available */
+#define	ETIME		62	/* Timer expired */
+#define	ENOSR		63	/* Out of streams resources */
+#define	ENONET		64	/* Machine is not on the network */
+#define	ENOPKG		65	/* Package not installed */
+#define	EREMOTE		66	/* Object is remote */
+#define	ENOLINK		67	/* Link has been severed */
+#define	EADV		68	/* Advertise error */
+#define	ESRMNT		69	/* Srmount error */
+#define	ECOMM		70	/* Communication error on send */
+#define	EPROTO		71	/* Protocol error */
+#define	EMULTIHOP	72	/* Multihop attempted */
+#define	EDOTDOT		73	/* RFS specific error */
+#define	EBADMSG		74	/* Not a data message */
+#define	EOVERFLOW	75	/* Value too large for defined data type */
+#define	ENOTUNIQ	76	/* Name not unique on network */
+#define	EBADFD		77	/* File descriptor in bad state */
+#define	EREMCHG		78	/* Remote address changed */
+#define	ELIBACC		79	/* Can not access a needed shared library */
+#define	ELIBBAD		80	/* Accessing a corrupted shared library */
+#define	ELIBSCN		81	/* .lib section in a.out corrupted */
+#define	ELIBMAX		82	/* Attempting to link in too many shared libraries */
+#define	ELIBEXEC	83	/* Cannot exec a shared library directly */
+#define	EILSEQ		84	/* Illegal byte sequence */
+#define	ERESTART	85	/* Interrupted system call should be restarted */
+#define	ESTRPIPE	86	/* Streams pipe error */
+#define	EUSERS		87	/* Too many users */
+#define	ENOTSOCK	88	/* Socket operation on non-socket */
+#define	EDESTADDRREQ	89	/* Destination address required */
+#define	EMSGSIZE	90	/* Message too long */
+#define	EPROTOTYPE	91	/* Protocol wrong type for socket */
+#define	ENOPROTOOPT	92	/* Protocol not available */
+#define	EPROTONOSUPPORT	93	/* Protocol not supported */
+#define	ESOCKTNOSUPPORT	94	/* Socket type not supported */
+#define	EOPNOTSUPP	95	/* Operation not supported on transport endpoint */
+#define	EPFNOSUPPORT	96	/* Protocol family not supported */
+#define	EAFNOSUPPORT	97	/* Address family not supported by protocol */
+#define	EADDRINUSE	98	/* Address already in use */
+#define	EADDRNOTAVAIL	99	/* Cannot assign requested address */
+#define	ENETDOWN	100	/* Network is down */
+#define	ENETUNREACH	101	/* Network is unreachable */
+#define	ENETRESET	102	/* Network dropped connection because of reset */
+#define	ECONNABORTED	103	/* Software caused connection abort */
+#define	ECONNRESET	104	/* Connection reset by peer */
+#define	ENOBUFS		105	/* No buffer space available */
+#define	EISCONN		106	/* Transport endpoint is already connected */
+#define	ENOTCONN	107	/* Transport endpoint is not connected */
+#define	ESHUTDOWN	108	/* Cannot send after transport endpoint shutdown */
+#define	ETOOMANYREFS	109	/* Too many references: cannot splice */
+#define	ETIMEDOUT	110	/* Connection timed out */
+#define	ECONNREFUSED	111	/* Connection refused */
+#define	EHOSTDOWN	112	/* Host is down */
+#define	EHOSTUNREACH	113	/* No route to host */
+#define	EALREADY	114	/* Operation already in progress */
+#define	EINPROGRESS	115	/* Operation now in progress */
+#define	ESTALE		116	/* Stale NFS file handle */
+#define	EUCLEAN		117	/* Structure needs cleaning */
+#define	ENOTNAM		118	/* Not a XENIX named type file */
+#define	ENAVAIL		119	/* No XENIX semaphores available */
+#define	EISNAM		120	/* Is a named type file */
+#define	EREMOTEIO	121	/* Remote I/O error */
+#define	EDQUOT		122	/* Quota exceeded */
+
+#define	ENOMEDIUM	123	/* No medium found */
+#define	EMEDIUMTYPE	124	/* Wrong medium type */
+
+#endif /* _H8300_ERRNO_H */
diff -Nru a/include/asm-h8300/fcntl.h b/include/asm-h8300/fcntl.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/fcntl.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,86 @@
+#ifndef _H8300_FCNTL_H
+#define _H8300_FCNTL_H
+
+/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
+   located on an ext2 file system */
+#define O_ACCMODE	  0003
+#define O_RDONLY	    00
+#define O_WRONLY	    01
+#define O_RDWR		    02
+#define O_CREAT		  0100	/* not fcntl */
+#define O_EXCL		  0200	/* not fcntl */
+#define O_NOCTTY	  0400	/* not fcntl */
+#define O_TRUNC		 01000	/* not fcntl */
+#define O_APPEND	 02000
+#define O_NONBLOCK	 04000
+#define O_NDELAY	O_NONBLOCK
+#define O_SYNC		010000
+#define FASYNC		020000	/* fcntl, for BSD compatibility */
+#define O_DIRECTORY	040000	/* must be a directory */
+#define O_NOFOLLOW	0100000	/* don't follow links */
+#define O_DIRECT	0200000	/* direct disk access hint - currently ignored */
+#define O_LARGEFILE	0400000
+
+#define F_DUPFD		0	/* dup */
+#define F_GETFD		1	/* get close_on_exec */
+#define F_SETFD		2	/* set/clear close_on_exec */
+#define F_GETFL		3	/* get file->f_flags */
+#define F_SETFL		4	/* set file->f_flags */
+#define F_GETLK		5
+#define F_SETLK		6
+#define F_SETLKW	7
+
+#define F_SETOWN	8	/*  for sockets. */
+#define F_GETOWN	9	/*  for sockets. */
+#define F_SETSIG	10	/*  for sockets. */
+#define F_GETSIG	11	/*  for sockets. */
+
+#define F_GETLK64	12	/*  using 'struct flock64' */
+#define F_SETLK64	13
+#define F_SETLKW64	14
+
+/* for F_[GET|SET]FL */
+#define FD_CLOEXEC	1	/* actually anything with low bit set goes */
+
+/* for posix fcntl() and lockf() */
+#define F_RDLCK		0
+#define F_WRLCK		1
+#define F_UNLCK		2
+
+/* for old implementation of bsd flock () */
+#define F_EXLCK		4	/* or 3 */
+#define F_SHLCK		8	/* or 4 */
+
+/* for leases */
+#define F_INPROGRESS	16
+
+/* operations for bsd flock(), also used by the kernel implementation */
+#define LOCK_SH		1	/* shared lock */
+#define LOCK_EX		2	/* exclusive lock */
+#define LOCK_NB		4	/* or'd with one of the above to prevent
+				   blocking */
+#define LOCK_UN		8	/* remove lock */
+
+#define LOCK_MAND	32	/* This is a mandatory flock */
+#define LOCK_READ	64	/* ... Which allows concurrent read operations */
+#define LOCK_WRITE	128	/* ... Which allows concurrent write operations */
+#define LOCK_RW		192	/* ... Which allows concurrent read & write ops */
+
+struct flock {
+	short l_type;
+	short l_whence;
+	off_t l_start;
+	off_t l_len;
+	pid_t l_pid;
+};
+
+struct flock64 {
+	short  l_type;
+	short  l_whence;
+	loff_t l_start;
+	loff_t l_len;
+	pid_t  l_pid;
+};
+
+#define F_LINUX_SPECIFIC_BASE	1024
+#endif /* _H8300_FCNTL_H */
diff -Nru a/include/asm-h8300/flat.h b/include/asm-h8300/flat.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/flat.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,10 @@
+/*
+ * include/asm-h8300/flat.h -- uClinux flat-format executables
+ */
+
+#ifndef __H8300_FLAT_H__
+#define __H8300_FLAT_H__
+
+#define flat_argvp_envp_on_stack()	1
+
+#endif /* __H8300_FLAT_H__ */
diff -Nru a/include/asm-h8300/fpu.h b/include/asm-h8300/fpu.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/fpu.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1 @@
+/* Nothing do */
diff -Nru a/include/asm-h8300/generic/timer_rate.h b/include/asm-h8300/generic/timer_rate.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/generic/timer_rate.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,11 @@
+#include <linux/config.h>
+
+#if defined(CONFIG_H83007) || defined(CONFIG_H83068)
+#define H8300_TIMER_COUNT_DATA CONFIG_CPU_CLOCK*10/8192
+#define H8300_TIMER_FREQ CONFIG_CPU_CLOCK*1000/8192
+#endif
+
+#if defined(H8_3002) || defined(CONFIG_H83048)
+#define H8300_TIMER_COUNT_DATA  CONFIG_CPU_CLOCK*10/8
+#define H8300_TIMER_FREQ CONFIG_CPU_CLOCK*1000/8
+#endif
diff -Nru a/include/asm-h8300/gpio.h b/include/asm-h8300/gpio.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/gpio.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,46 @@
+#ifndef _H8300_GPIO_H
+#define _H8300_GPIO_H
+
+#define H8300_GPIO_P1 0
+#define H8300_GPIO_P2 1
+#define H8300_GPIO_P3 2
+#define H8300_GPIO_P4 3
+#define H8300_GPIO_P5 4
+#define H8300_GPIO_P6 5
+/*#define H8300_GPIO_P7 6*/
+#define H8300_GPIO_P8 7
+#define H8300_GPIO_P9 8
+#define H8300_GPIO_PA 9
+#define H8300_GPIO_PB 10
+
+#define H8300_GPIO_B7 0x80
+#define H8300_GPIO_B6 0x40
+#define H8300_GPIO_B5 0x20
+#define H8300_GPIO_B4 0x10
+#define H8300_GPIO_B3 0x08
+#define H8300_GPIO_B2 0x04
+#define H8300_GPIO_B1 0x02
+#define H8300_GPIO_B0 0x01
+
+#define H8300_GPIO_INPUT 0
+#define H8300_GPIO_OUTPUT 1
+
+#define H8300_GPIO_RESERVE(port, bits) \
+        h8300_reserved_gpio(port, bits)
+
+#define H8300_GPIO_FREE(port, bits) \
+        h8300_free_gpio(port, bits)
+
+#define H8300_GPIO_DDR(port, bit, dir) \
+        h8300_set_gpio_dir(((port) << 8) | bit, dir)
+
+#define H8300_GPIO_GETDIR(port, bit) \
+        h8300_get_gpio_dir(((port) << 8) | bit)
+
+extern int h8300_reserved_gpio(int port, int bits);
+extern int h8300_free_gpio(int port, int bits);
+extern int h8300_set_gpio_dir(int port_bit, int dir);
+extern int h8300_get_gpio_dir(int port_bit);
+extern int h8300_init_gpio(void);
+
+#endif
diff -Nru a/include/asm-h8300/h8300_ne.h b/include/asm-h8300/h8300_ne.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/h8300_ne.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,19 @@
+/****************************************************************************/
+
+/*
+ *	h8300_ne.h -- NE2000 in H8/300H Evalution Board.
+ *      
+ *	(C) Copyright 2002, Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+/****************************************************************************/
+#ifndef	h8300ne_h
+#define	h8300ne_h
+/****************************************************************************/
+
+/* Such a description is OK ? */
+#define DEPEND_HEADER(target) <asm/target/ne.h> 
+#include DEPEND_HEADER(TARGET)
+
+/****************************************************************************/
+#endif	/* h8300ne_h */
diff -Nru a/include/asm-h8300/h8max/ide.h b/include/asm-h8300/h8max/ide.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/h8max/ide.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,60 @@
+/* H8MAX IDE I/F Config */
+
+#define H8300_IDE_BASE 0x200000
+#define H8300_IDE_CTRL 0x60000c
+#define H8300_IDE_IRQ  5
+#define H8300_IDE_REG_OFFSET 2
+
+#undef outb
+#undef inb
+#undef outb_p
+#undef inb_p
+#undef outsw
+#undef insw
+
+#define outb(d,a) h8max_outb(d,(unsigned short *)a)
+#define inb(a) h8max_inb((unsigned char *)a)
+#define outb_p(d,a) h8max_outb(d,(unsigned short *)a)
+#define inb_p(a) h8max_inb((unsigned char *)a)
+#define outsw(addr,buf,len) h8max_outsw(addr,buf,len);
+#define insw(addr,buf,len) h8max_insw(addr,buf,len);
+
+static inline void h8max_outb(unsigned short d,unsigned short *a)
+{
+	*a = d;
+}
+
+static inline unsigned char h8max_inb(unsigned char *a)
+{
+	return *(a+1);
+}
+
+static inline void h8max_outsw(void *addr, void *buf, int len)
+{
+	unsigned volatile short *ap = (unsigned volatile short *)addr;
+	unsigned short *bp = (unsigned short *)buf;
+	unsigned short d;
+	while(len--) {
+		d = *bp++;
+		*ap = (d >> 8) | (d << 8);
+	}
+}
+
+static inline void h8max_insw(void *addr, void *buf, int len)
+{
+	unsigned volatile short *ap = (unsigned volatile short *)addr;
+	unsigned short *bp = (unsigned short *)buf;
+	unsigned short d;
+	while(len--) {
+		d = *ap;
+		*bp++ = (d >> 8) | (d << 8);
+	}
+}
+
+static inline void target_ide_fix_driveid(struct hd_driveid *id)
+{
+	int c;
+	unsigned short *p = (unsigned short *)id;
+	for (c = 0; c < SECTOR_WORDS; c++, p++)
+		*p = (*p >> 8) | (*p << 8);
+}
diff -Nru a/include/asm-h8300/h8max/ne.h b/include/asm-h8300/h8max/ne.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/h8max/ne.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,71 @@
+/* H8MAX RTL8019AS Config */
+
+#define NE2000_ADDR		0x800600
+#define NE2000_IRQ              4
+#define NE2000_IRQ_VECTOR	(12 + NE2000_IRQ)
+#define	NE2000_BYTE		volatile unsigned short
+
+#define IER                     0xfee015
+#define ISR			0xfee016
+#define IRQ_MASK		(1 << NE2000_IRQ)
+/* sorry quick hack */
+#if defined(outb)
+# undef outb
+#endif
+#define outb(d,a)               h8max_outb((d),(a) - NE2000_ADDR)
+#if defined(inb)
+# undef inb
+#endif
+#define inb(a)                  h8max_inb((a) - NE2000_ADDR)
+#if defined(outb_p)
+# undef outb_p
+#endif
+#define outb_p(d,a)             h8max_outb((d),(a) - NE2000_ADDR)
+#if defined(inb_p)
+# undef inb_p
+#endif
+#define inb_p(a)                h8max_inb((a) - NE2000_ADDR)
+#if defined(outsw)
+# undef outsw
+#endif
+#define outsw(a,p,l)            h8max_outsw((a) - NE2000_ADDR,(unsigned short *)p,l)
+#if defined(insw)
+# undef insw
+#endif
+#define insw(a,p,l)             h8max_insw((a) - NE2000_ADDR,(unsigned short *)p,l)
+
+#define H8300_INIT_NE()                  \
+do {                                     \
+	wordlength = 2;                  \
+	h8max_outb(0x49, ioaddr + EN0_DCFG); \
+	SA_prom[14] = SA_prom[15] = 0x57;\
+} while(0)
+
+static inline void h8max_outb(unsigned char d,unsigned char a)
+{
+	*(unsigned short *)(NE2000_ADDR + (a << 1)) = d;
+}
+
+static inline unsigned char h8max_inb(unsigned char a)
+{
+	return *(unsigned char *)(NE2000_ADDR + (a << 1) +1);
+}
+
+static inline void h8max_outsw(unsigned char a,unsigned short *p,unsigned long l)
+{
+	unsigned short d;
+	for (; l != 0; --l, p++) {
+		d = (((*p) >> 8) & 0xff) | ((*p) << 8);
+		*(unsigned short *)(NE2000_ADDR + (a << 1)) = d;
+	}
+}
+
+static inline void h8max_insw(unsigned char a,unsigned short *p,unsigned long l)
+{
+	unsigned short d;
+	for (; l != 0; --l, p++) {
+		d = *(unsigned short *)(NE2000_ADDR + (a << 1));
+		*p = (d << 8)|((d >> 8) & 0xff);
+	}
+}
+
diff -Nru a/include/asm-h8300/hardirq.h b/include/asm-h8300/hardirq.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/hardirq.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,105 @@
+#ifndef __H8300_HARDIRQ_H
+#define __H8300_HARDIRQ_H
+
+#include <linux/kernel.h>
+#include <linux/config.h>
+#include <linux/threads.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+
+typedef struct {
+	unsigned int __softirq_pending;
+	unsigned int __syscall_count;
+	struct task_struct * __ksoftirqd_task;
+} ____cacheline_aligned irq_cpustat_t;
+
+#include <linux/irq_cpustat.h>	/* Standard mappings for irq_cpustat_t above */
+
+/*
+ * We put the hardirq and softirq counter into the preemption
+ * counter. The bitmask has the following meaning:
+ *
+ * - bits 0-7 are the preemption count (max preemption depth: 256)
+ * - bits 8-15 are the softirq count (max # of softirqs: 256)
+ * - bits 16-23 are the hardirq count (max # of hardirqs: 256)
+ *
+ * - ( bit 26 is the PREEMPT_ACTIVE flag. )
+ *
+ * PREEMPT_MASK: 0x000000ff
+ * HARDIRQ_MASK: 0x0000ff00
+ * SOFTIRQ_MASK: 0x00ff0000
+ */
+
+#define PREEMPT_BITS	8
+#define SOFTIRQ_BITS	8
+#define HARDIRQ_BITS	8
+
+#define PREEMPT_SHIFT	0
+#define SOFTIRQ_SHIFT	(PREEMPT_SHIFT + PREEMPT_BITS)
+#define HARDIRQ_SHIFT	(SOFTIRQ_SHIFT + SOFTIRQ_BITS)
+
+#define __MASK(x)	((1UL << (x))-1)
+
+#define PREEMPT_MASK	(__MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
+#define HARDIRQ_MASK	(__MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
+#define SOFTIRQ_MASK	(__MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
+
+#define hardirq_count()	(preempt_count() & HARDIRQ_MASK)
+#define softirq_count()	(preempt_count() & SOFTIRQ_MASK)
+#define irq_count()	(preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK))
+
+#define PREEMPT_OFFSET	(1UL << PREEMPT_SHIFT)
+#define SOFTIRQ_OFFSET	(1UL << SOFTIRQ_SHIFT)
+#define HARDIRQ_OFFSET	(1UL << HARDIRQ_SHIFT)
+
+/*
+ * The hardirq mask has to be large enough to have
+ * space for potentially all IRQ sources in the system
+ * nesting on a single CPU:
+ */
+#if (1 << HARDIRQ_BITS) < NR_IRQS
+# error HARDIRQ_BITS is too low!
+#endif
+
+/*
+ * Are we doing bottom half or hardware interrupt processing?
+ * Are we in a softirq context? Interrupt context?
+ */
+#define in_irq()		(hardirq_count())
+#define in_softirq()		(softirq_count())
+#define in_interrupt()		(irq_count())
+
+#define hardirq_trylock()	(!in_interrupt())
+#define hardirq_endlock()	do { } while (0)
+
+#define irq_enter()		(preempt_count() += HARDIRQ_OFFSET)
+
+#if CONFIG_PREEMPT
+# define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
+#else
+# define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
+#endif
+
+#if CONFIG_PREEMPT
+# define in_atomic()	(preempt_count() != kernel_locked())
+# define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
+#else
+# define in_atomic()	(preempt_count() != 0)
+# define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
+#endif
+
+#define irq_exit()							\
+do {									\
+		preempt_count() -= IRQ_EXIT_OFFSET;			\
+		if (!in_interrupt() && softirq_pending(smp_processor_id())) \
+			do_softirq();					\
+		preempt_enable_no_resched();				\
+} while (0)
+
+#ifndef CONFIG_SMP
+# define synchronize_irq(irq)	barrier()
+#else
+# error h8300 SMP is not available
+#endif /* CONFIG_SMP */
+
+#endif
diff -Nru a/include/asm-h8300/hdreg.h b/include/asm-h8300/hdreg.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/hdreg.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+/*
+ *  linux/include/asm-h8300/hdreg.h
+ *
+ *  Copyright (C) 1994-1996  Linus Torvalds & authors
+ */
+
+#ifndef _H8300_HDREG_H
+#define _H8300_HDREG_H
+
+typedef unsigned int   q40ide_ioreg_t;
+typedef unsigned char * ide_ioreg_t;
+
+#endif /* _H8300_HDREG_H */
diff -Nru a/include/asm-h8300/hw_irq.h b/include/asm-h8300/hw_irq.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/hw_irq.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1 @@
+/* Do Nothing */
diff -Nru a/include/asm-h8300/ide.h b/include/asm-h8300/ide.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/ide.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,161 @@
+/****************************************************************************/
+
+/*
+ *  linux/include/asm-h8300/ide.h
+ *
+ *  Copyright (C) 1994-1996  Linus Torvalds & authors
+ *  Copyright (C) 2001       Lineo Inc., davidm@snapgear.com
+ *  Copyright (C) 2002       Greg Ungerer (gerg@snapgear.com)
+ *  Copyright (C) 2002       Yoshinori Sato (ysato@users.sourceforge.jp)
+ */
+
+/****************************************************************************/
+#ifndef _H8300_IDE_H
+#define _H8300_IDE_H
+/****************************************************************************/
+#ifdef __KERNEL__
+/****************************************************************************/
+
+#include <linux/config.h>
+#include <linux/interrupt.h>
+
+#include <asm/setup.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+
+/*
+ *	Some coldfire specifics.
+ */
+
+/*
+ *	Save some space, only have 1 interface.
+ */
+#define MAX_HWIFS	1
+
+/*
+ *	Fix up things that may not have been provided.
+ */
+
+#undef SUPPORT_SLOW_DATA_PORTS
+#define SUPPORT_SLOW_DATA_PORTS 0
+
+#undef SUPPORT_VLB_SYNC
+#define SUPPORT_VLB_SYNC 0
+
+/* this definition is used only on startup .. */
+#undef HD_DATA
+#define HD_DATA NULL
+
+#define	DBGIDE(fmt,a...)
+// #define	DBGIDE(fmt,a...) printk(fmt, ##a)
+#define IDE_INLINE __inline__
+// #define IDE_INLINE
+
+#define ide__sti()	__sti()
+
+/****************************************************************************/
+
+typedef union {
+	unsigned all			: 8;	/* all of the bits together */
+	struct {
+		unsigned bit7		: 1;	/* always 1 */
+		unsigned lba		: 1;	/* using LBA instead of CHS */
+		unsigned bit5		: 1;	/* always 1 */
+		unsigned unit		: 1;	/* drive select number, 0 or 1 */
+		unsigned head		: 4;	/* always zeros here */
+	} b;
+} select_t;
+
+/*
+ *	Our list of ports/irq's for different boards.
+ */
+
+/* Such a description is OK ? */
+#define DEPEND_HEADER(target) <asm/target/ide.h> 
+#include DEPEND_HEADER(TARGET)
+
+/****************************************************************************/
+
+static IDE_INLINE int ide_default_irq(ide_ioreg_t base)
+{
+	return H8300_IDE_IRQ+12;
+}
+
+static IDE_INLINE ide_ioreg_t ide_default_io_base(int index)
+{
+	return (ide_ioreg_t)H8300_IDE_BASE;
+}
+
+/*
+ * Set up a hw structure for a specified data port, control port and IRQ.
+ * This should follow whatever the default interface uses.
+ */
+static IDE_INLINE void ide_init_hwif_ports(
+	hw_regs_t *hw,
+	ide_ioreg_t data_port,
+	ide_ioreg_t ctrl_port,
+	int *irq)
+{
+	ide_ioreg_t reg = data_port;
+	int i;
+
+	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
+		hw->io_ports[i] = reg;
+		reg += H8300_IDE_REG_OFFSET;
+	}
+	if (ctrl_port) {
+		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
+	} else {
+		hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t)H8300_IDE_CTRL;
+	}
+}
+
+
+/*
+ * This registers the standard ports for this architecture with the IDE
+ * driver.
+ */
+static IDE_INLINE void ide_init_default_hwifs(void)
+{
+	hw_regs_t hw;
+	ide_ioreg_t base;
+	int index;
+
+	for (index = 0; index < MAX_HWIFS; index++) {
+		base = ide_default_io_base(index);
+		if (!base)
+			continue;
+		memset(&hw, 0, sizeof(hw));
+		ide_init_hwif_ports(&hw, base, 0, NULL);
+		hw.irq = ide_default_irq(base);
+		ide_register_hw(&hw, NULL);
+	}
+}
+
+#define ide_request_irq(irq,hand,flg,dev,id)	request_irq((irq),(hand),(flg),(dev),(id))
+#define ide_free_irq(irq,dev_id)		free_irq((irq), (dev_id))
+#define ide_check_region(from,extent)		(0)
+#define ide_request_region(from,extent,name)	do {} while(0)
+#define ide_release_region(from,extent)		do {} while(0)
+
+/*
+ * The following are not needed for the non-m68k ports
+ */
+#define ide_ack_intr(hwif)		(1)
+#define ide_fix_driveid(id)		target_ide_fix_driveid(id)
+#define ide_release_lock(lock)		do {} while (0)
+#define ide_get_lock(lock, hdlr, data)	do {} while (0)
+
+static IDE_INLINE void ide_print_resource(char *name,hw_regs_t *hw)
+{
+	printk("%s at 0x%08x-0x%08x,0x%08x on irq %d", name,
+		(unsigned int)hw->io_ports[IDE_DATA_OFFSET],
+		(unsigned int)hw->io_ports[IDE_DATA_OFFSET]+(8*H8300_IDE_REG_OFFSET)-1,
+		(unsigned int)hw->io_ports[IDE_CONTROL_OFFSET],
+		hw->irq);
+}
+
+/****************************************************************************/
+#endif /* __KERNEL__ */
+#endif /* _H8300_IDE_H */
+/****************************************************************************/
diff -Nru a/include/asm-h8300/init.h b/include/asm-h8300/init.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/init.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,11 @@
+#ifndef _H8300_INIT_H
+#define _H8300_INIT_H
+
+#define __init __attribute__ ((__section__ (".text.init")))
+#define __initdata __attribute__ ((__section__ (".data.init")))
+/* For assembly routines */
+#define __INIT		.section	".text.init",#alloc,#execinstr
+#define __FINIT		.previous
+#define __INITDATA	.section	".data.init",#alloc,#write
+
+#endif
diff -Nru a/include/asm-h8300/io.h b/include/asm-h8300/io.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/io.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,234 @@
+#ifndef _H8300_IO_H
+#define _H8300_IO_H
+
+#ifdef __KERNEL__
+
+#include <linux/config.h>
+#include <asm/virtconvert.h>
+
+/*
+ * These are for ISA/PCI shared memory _only_ and should never be used
+ * on any other type of memory, including Zorro memory. They are meant to
+ * access the bus in the bus byte order which is little-endian!.
+ *
+ * readX/writeX() are used to access memory mapped devices. On some
+ * architectures the memory mapped IO stuff needs to be accessed
+ * differently. On the m68k architecture, we just read/write the
+ * memory location directly.
+ */
+/* ++roman: The assignments to temp. vars avoid that gcc sometimes generates
+ * two accesses to memory, which may be undesireable for some devices.
+ */
+
+/*
+ * swap functions are sometimes needed to interface little-endian hardware
+ */
+
+/*
+ * CHANGES
+ * 
+ * 020325   Added some #define's for the COBRA5272 board
+ *          (hede)
+ */
+static inline unsigned short _swapw(volatile unsigned short v)
+{
+    return ((v << 8) | (v >> 8));
+}
+
+static inline unsigned int _swapl(volatile unsigned long v)
+{
+    return ((v << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | (v >> 24));
+}
+
+#define readb(addr) \
+    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
+#define readw(addr) \
+    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
+#define readl(addr) \
+    ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
+
+#define writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b))
+#define writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b))
+#define writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
+
+/*
+ * The following are some defines we need for MTD with our
+ * COBRA5272 board.
+ * Because I don't know if they break something I have
+ * #ifdef'd them.
+ * (020325 - hede)
+ */
+#ifdef CONFIG_senTec
+#define __raw_readb readb
+#define __raw_readw readw
+#define __raw_readl readl
+#define __raw_writeb writeb
+#define __raw_writew writew
+#define __raw_writel writel
+#endif /* CONFIG_senTec */
+
+static inline void io_outsb(unsigned int addr, void *buf, int len)
+{
+	volatile unsigned char *ap = (volatile unsigned char *) addr;
+	unsigned char *bp = (unsigned char *) buf;
+	while (len--)
+		*ap = *bp++;
+}
+
+static inline void io_outsw(unsigned int addr, void *buf, int len)
+{
+	volatile unsigned short *ap = (volatile unsigned short *) addr;
+	unsigned short *bp = (unsigned short *) buf;
+	while (len--)
+		*ap = _swapw(*bp++);
+}
+
+static inline void io_outsl(unsigned int addr, void *buf, int len)
+{
+	volatile unsigned int *ap = (volatile unsigned int *) addr;
+	unsigned int *bp = (unsigned int *) buf;
+	while (len--)
+		*ap = _swapl(*bp++);
+}
+
+static inline void io_insb(unsigned int addr, void *buf, int len)
+{
+	volatile unsigned char *ap = (volatile unsigned char *) addr;
+	unsigned char *bp = (unsigned char *) buf;
+	while (len--)
+		*bp++ = *ap;
+}
+
+static inline void io_insw(unsigned int addr, void *buf, int len)
+{
+	volatile unsigned short *ap = (volatile unsigned short *) addr;
+	unsigned short *bp = (unsigned short *) buf;
+	while (len--)
+		*bp++ = _swapw(*ap);
+}
+
+static inline void io_insl(unsigned int addr, void *buf, int len)
+{
+	volatile unsigned int *ap = (volatile unsigned int *) addr;
+	unsigned int *bp = (unsigned int *) buf;
+	while (len--)
+		*bp++ = _swapl(*ap);
+}
+
+/*
+ *	make the short names macros so specific devices
+ *	can override them as required
+ */
+
+#define memset_io(a,b,c)	memset((void *)(a),(b),(c))
+#define memcpy_fromio(a,b,c)	memcpy((a),(void *)(b),(c))
+#define memcpy_toio(a,b,c)	memcpy((void *)(a),(b),(c))
+
+#define inb(addr)      readb(addr)
+#define inw(addr)    readw(addr)
+#define inl(addr)    readl(addr)
+#define outb(x,addr) ((void) writeb(x,addr))
+#define outw(x,addr) ((void) writew(x,addr))
+#define outl(x,addr) ((void) writel(x,addr))
+
+#define inb_p(addr)    inb(addr)
+#define inw_p(addr)    inw(addr)
+#define inl_p(addr)    inl(addr)
+#define outb_p(x,addr) outb(x,addr)
+#define outw_p(x,addr) outw(x,addr)
+#define outl_p(x,addr) outl(x,addr)
+
+#define outsb(a,b,l) io_outsb(a,b,l)
+#define outsw(a,b,l) io_outsw(a,b,l)
+#define outsl(a,b,l) io_outsl(a,b,l)
+
+#define insb(a,b,l) io_insb(a,b,l)
+#define insw(a,b,l) io_insw(a,b,l)
+#define insl(a,b,l) io_insl(a,b,l)
+
+#define IO_SPACE_LIMIT 0xffff
+
+
+/* Values for nocacheflag and cmode */
+#define IOMAP_FULL_CACHING		0
+#define IOMAP_NOCACHE_SER		1
+#define IOMAP_NOCACHE_NONSER		2
+#define IOMAP_WRITETHROUGH		3
+
+extern void *__ioremap(unsigned long physaddr, unsigned long size, int cacheflag);
+extern void __iounmap(void *addr, unsigned long size);
+
+extern inline void *ioremap(unsigned long physaddr, unsigned long size)
+{
+	return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
+}
+extern inline void *ioremap_nocache(unsigned long physaddr, unsigned long size)
+{
+	return __ioremap(physaddr, size, IOMAP_NOCACHE_SER);
+}
+extern inline void *ioremap_writethrough(unsigned long physaddr, unsigned long size)
+{
+	return __ioremap(physaddr, size, IOMAP_WRITETHROUGH);
+}
+extern inline void *ioremap_fullcache(unsigned long physaddr, unsigned long size)
+{
+	return __ioremap(physaddr, size, IOMAP_FULL_CACHING);
+}
+
+extern void iounmap(void *addr);
+
+/* Nothing to do */
+
+#define dma_cache_inv(_start,_size)		do { } while (0)
+#define dma_cache_wback(_start,_size)		do { } while (0)
+#define dma_cache_wback_inv(_start,_size)	do { } while (0)
+
+/* H8/300 internal I/O functions */
+static __inline__ unsigned char ctrl_inb(unsigned long addr)
+{
+	return *(volatile unsigned char*)addr;
+}
+
+static __inline__ unsigned short ctrl_inw(unsigned long addr)
+{
+	return *(volatile unsigned short*)addr;
+}
+
+static __inline__ unsigned int ctrl_inl(unsigned long addr)
+{
+	return *(volatile unsigned long*)addr;
+}
+
+static __inline__ void ctrl_outb(unsigned char b, unsigned long addr)
+{
+	*(volatile unsigned char*)addr = b;
+}
+
+static __inline__ void ctrl_outw(unsigned short b, unsigned long addr)
+{
+	*(volatile unsigned short*)addr = b;
+}
+
+static __inline__ void ctrl_outl(unsigned int b, unsigned long addr)
+{
+        *(volatile unsigned long*)addr = b;
+}
+
+/* Pages to physical address... */
+#define page_to_phys(page)      ((page - mem_map) << PAGE_SHIFT)
+#define page_to_bus(page)       ((page - mem_map) << PAGE_SHIFT)
+
+/*
+ * Macros used for converting between virtual and physical mappings.
+ */
+#define mm_ptov(vaddr)		((void *) (vaddr))
+#define mm_vtop(vaddr)		((unsigned long) (vaddr))
+#define phys_to_virt(vaddr)	((void *) (vaddr))
+#define virt_to_phys(vaddr)	((unsigned long) (vaddr))
+
+#define virt_to_bus virt_to_phys
+#define bus_to_virt phys_to_virt
+
+#endif /* __KERNEL__ */
+
+#endif /* _H8300_IO_H */
diff -Nru a/include/asm-h8300/ioctl.h b/include/asm-h8300/ioctl.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/ioctl.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,80 @@
+/* $Id: ioctl.h,v 1.1 2002/11/19 02:09:26 gerg Exp $
+ *
+ * linux/ioctl.h for Linux by H.H. Bergman.
+ */
+
+#ifndef _H8300_IOCTL_H
+#define _H8300_IOCTL_H
+
+/* ioctl command encoding: 32 bits total, command in lower 16 bits,
+ * size of the parameter structure in the lower 14 bits of the
+ * upper 16 bits.
+ * Encoding the size of the parameter structure in the ioctl request
+ * is useful for catching programs compiled with old versions
+ * and to avoid overwriting user space outside the user buffer area.
+ * The highest 2 bits are reserved for indicating the ``access mode''.
+ * NOTE: This limits the max parameter size to 16kB -1 !
+ */
+
+/*
+ * I don't really have any idea about what this should look like, so
+ * for the time being, this is heavily based on the PC definitions.
+ */
+
+/*
+ * The following is for compatibility across the various Linux
+ * platforms.  The i386 ioctl numbering scheme doesn't really enforce
+ * a type field.  De facto, however, the top 8 bits of the lower 16
+ * bits are indeed used as a type field, so we might just as well make
+ * this explicit here.  Please be sure to use the decoding macros
+ * below from now on.
+ */
+#define _IOC_NRBITS	8
+#define _IOC_TYPEBITS	8
+#define _IOC_SIZEBITS	14
+#define _IOC_DIRBITS	2
+
+#define _IOC_NRMASK	((1 << _IOC_NRBITS)-1)
+#define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1)
+#define _IOC_SIZEMASK	((1 << _IOC_SIZEBITS)-1)
+#define _IOC_DIRMASK	((1 << _IOC_DIRBITS)-1)
+
+#define _IOC_NRSHIFT	0
+#define _IOC_TYPESHIFT	(_IOC_NRSHIFT+_IOC_NRBITS)
+#define _IOC_SIZESHIFT	(_IOC_TYPESHIFT+_IOC_TYPEBITS)
+#define _IOC_DIRSHIFT	(_IOC_SIZESHIFT+_IOC_SIZEBITS)
+
+/*
+ * Direction bits.
+ */
+#define _IOC_NONE	0U
+#define _IOC_WRITE	1U
+#define _IOC_READ	2U
+
+#define _IOC(dir,type,nr,size) \
+	(((dir)  << _IOC_DIRSHIFT) | \
+	 ((type) << _IOC_TYPESHIFT) | \
+	 ((nr)   << _IOC_NRSHIFT) | \
+	 ((size) << _IOC_SIZESHIFT))
+
+/* used to create numbers */
+#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
+#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
+#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
+#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
+
+/* used to decode ioctl numbers.. */
+#define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
+#define _IOC_TYPE(nr)		(((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
+#define _IOC_NR(nr)		(((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
+#define _IOC_SIZE(nr)		(((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
+
+/* ...and for the drivers/sound files... */
+
+#define IOC_IN		(_IOC_WRITE << _IOC_DIRSHIFT)
+#define IOC_OUT		(_IOC_READ << _IOC_DIRSHIFT)
+#define IOC_INOUT	((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
+#define IOCSIZE_MASK	(_IOC_SIZEMASK << _IOC_SIZESHIFT)
+#define IOCSIZE_SHIFT	(_IOC_SIZESHIFT)
+
+#endif /* _H8300_IOCTL_H */
diff -Nru a/include/asm-h8300/ioctls.h b/include/asm-h8300/ioctls.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/ioctls.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,81 @@
+#ifndef __ARCH_H8300_IOCTLS_H__
+#define __ARCH_H8300_IOCTLS_H__
+
+#include <asm/ioctl.h>
+
+/* 0x54 is just a magic number to make these relatively unique ('T') */
+
+#define TCGETS		0x5401
+#define TCSETS		0x5402
+#define TCSETSW		0x5403
+#define TCSETSF		0x5404
+#define TCGETA		0x5405
+#define TCSETA		0x5406
+#define TCSETAW		0x5407
+#define TCSETAF		0x5408
+#define TCSBRK		0x5409
+#define TCXONC		0x540A
+#define TCFLSH		0x540B
+#define TIOCEXCL	0x540C
+#define TIOCNXCL	0x540D
+#define TIOCSCTTY	0x540E
+#define TIOCGPGRP	0x540F
+#define TIOCSPGRP	0x5410
+#define TIOCOUTQ	0x5411
+#define TIOCSTI		0x5412
+#define TIOCGWINSZ	0x5413
+#define TIOCSWINSZ	0x5414
+#define TIOCMGET	0x5415
+#define TIOCMBIS	0x5416
+#define TIOCMBIC	0x5417
+#define TIOCMSET	0x5418
+#define TIOCGSOFTCAR	0x5419
+#define TIOCSSOFTCAR	0x541A
+#define FIONREAD	0x541B
+#define TIOCINQ		FIONREAD
+#define TIOCLINUX	0x541C
+#define TIOCCONS	0x541D
+#define TIOCGSERIAL	0x541E
+#define TIOCSSERIAL	0x541F
+#define TIOCPKT		0x5420
+#define FIONBIO		0x5421
+#define TIOCNOTTY	0x5422
+#define TIOCSETD	0x5423
+#define TIOCGETD	0x5424
+#define TCSBRKP		0x5425	/* Needed for POSIX tcsendbreak() */
+#define TIOCTTYGSTRUCT	0x5426  /* For debugging only */
+#define TIOCSBRK	0x5427  /* BSD compatibility */
+#define TIOCCBRK	0x5428  /* BSD compatibility */
+#define TIOCGSID	0x5429  /* Return the session ID of FD */
+#define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
+#define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
+
+#define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
+#define FIOCLEX		0x5451
+#define FIOASYNC	0x5452
+#define TIOCSERCONFIG	0x5453
+#define TIOCSERGWILD	0x5454
+#define TIOCSERSWILD	0x5455
+#define TIOCGLCKTRMIOS	0x5456
+#define TIOCSLCKTRMIOS	0x5457
+#define TIOCSERGSTRUCT	0x5458 /* For debugging only */
+#define TIOCSERGETLSR   0x5459 /* Get line status register */
+#define TIOCSERGETMULTI 0x545A /* Get multiport config  */
+#define TIOCSERSETMULTI 0x545B /* Set multiport config */
+
+#define TIOCMIWAIT	0x545C	/* wait for a change on serial input line(s) */
+#define TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */
+#define FIOQSIZE	0x545E
+
+/* Used for packet mode */
+#define TIOCPKT_DATA		 0
+#define TIOCPKT_FLUSHREAD	 1
+#define TIOCPKT_FLUSHWRITE	 2
+#define TIOCPKT_STOP		 4
+#define TIOCPKT_START		 8
+#define TIOCPKT_NOSTOP		16
+#define TIOCPKT_DOSTOP		32
+
+#define TIOCSER_TEMT    0x01	/* Transmitter physically empty */
+
+#endif /* __ARCH_H8300_IOCTLS_H__ */
diff -Nru a/include/asm-h8300/ipc.h b/include/asm-h8300/ipc.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/ipc.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,31 @@
+#ifndef __H8300_IPC_H__
+#define __H8300_IPC_H__
+
+/* 
+ * These are used to wrap system calls on H8/300.
+ *
+ * See arch/h8300/kernel/sys_h8300.c for ugly details..
+ */
+struct ipc_kludge {
+	struct msgbuf *msgp;
+	long msgtyp;
+};
+
+#define SEMOP		 1
+#define SEMGET		 2
+#define SEMCTL		 3
+#define MSGSND		11
+#define MSGRCV		12
+#define MSGGET		13
+#define MSGCTL		14
+#define SHMAT		21
+#define SHMDT		22
+#define SHMGET		23
+#define SHMCTL		24
+
+/* Used by the DIPC package, try and avoid reusing it */
+#define DIPC		25
+
+#define IPCCALL(version,op)	((version)<<16 | (op))
+
+#endif
diff -Nru a/include/asm-h8300/ipcbuf.h b/include/asm-h8300/ipcbuf.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/ipcbuf.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,29 @@
+#ifndef __H8300_IPCBUF_H__
+#define __H8300_IPCBUF_H__
+
+/*
+ * The user_ipc_perm structure for H8/300 architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 32-bit mode_t and seq
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct ipc64_perm
+{
+	__kernel_key_t		key;
+	__kernel_uid32_t	uid;
+	__kernel_gid32_t	gid;
+	__kernel_uid32_t	cuid;
+	__kernel_gid32_t	cgid;
+	__kernel_mode_t		mode;
+	unsigned short		__pad1;
+	unsigned short		seq;
+	unsigned short		__pad2;
+	unsigned long		__unused1;
+	unsigned long		__unused2;
+};
+
+#endif /* __H8300_IPCBUF_H__ */
diff -Nru a/include/asm-h8300/irq.h b/include/asm-h8300/irq.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/irq.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,56 @@
+#ifndef _H8300_IRQ_H_
+#define _H8300_IRQ_H_
+
+#define SYS_IRQS 64
+
+#define NR_IRQS 64
+
+#include <asm/ptrace.h>
+
+/*
+ * "Generic" interrupt sources
+ */
+
+#define IRQ_SCHED_TIMER	(40)    /* interrupt source for scheduling timer */
+
+static __inline__ int irq_cannonicalize(int irq)
+{
+	return irq;
+}
+
+extern void enable_irq(unsigned int);
+extern void disable_irq(unsigned int);
+
+extern int sys_request_irq(unsigned int, 
+	void (*)(int, void *, struct pt_regs *), 
+	unsigned long, const char *, void *);
+extern void sys_free_irq(unsigned int, void *);
+
+typedef struct irq_node {
+	void		(*handler)(int, void *, struct pt_regs *);
+	unsigned long	flags;
+	void		*dev_id;
+	const char	*devname;
+	struct irq_node *next;
+} irq_node_t;
+
+/*
+ * This structure has only 4 elements for speed reasons
+ */
+typedef struct irq_handler {
+	void		(*handler)(int, void *, struct pt_regs *);
+	unsigned long	flags;
+	void		*dev_id;
+	const char	*devname;
+} irq_handler_t;
+
+/* count of spurious interrupts */
+extern volatile unsigned int num_spurious;
+
+/*
+ * Some drivers want these entry points
+ */
+#define enable_irq_nosync(x)	enable_irq(x)
+#define disable_irq_nosync(x)	disable_irq(x)
+
+#endif /* _H8300_IRQ_H_ */
diff -Nru a/include/asm-h8300/keyboard.h b/include/asm-h8300/keyboard.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/keyboard.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,33 @@
+/*
+ *  linux/include/asm-h8300/keyboard.h
+ *  Created 04 Dec 2001 by Khaled Hassounah <khassounah@mediumware.net>
+ *  This file contains the Dragonball architecture specific keyboard definitions
+ */
+
+#ifndef _H8300_KEYBOARD_H
+#define _H8300_KEYBOARD_H
+
+#include <linux/config.h>
+
+/* dummy i.e. no real keyboard */
+#define kbd_setkeycode(x...)	(-ENOSYS)
+#define kbd_getkeycode(x...)	(-ENOSYS)
+#define kbd_translate(x...)	(0)
+#define kbd_unexpected_up(x...)	(1)
+#define kbd_leds(x...)		do {;} while (0)
+#define kbd_init_hw(x...)	do {;} while (0)
+#define kbd_enable_irq(x...)	do {;} while (0)
+#define kbd_disable_irq(x...)	do {;} while (0)
+
+
+/* needed if MAGIC_SYSRQ is enabled for serial console */
+#ifndef SYSRQ_KEY
+#define SYSRQ_KEY		((unsigned char)(-1))
+#define kbd_sysrq_xlate         ((unsigned char *)NULL)
+#endif
+
+
+#endif  /* _H8300_KEYBOARD_H */
+
+
+
diff -Nru a/include/asm-h8300/kmap_types.h b/include/asm-h8300/kmap_types.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/kmap_types.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,19 @@
+#ifndef _ASM_KMAP_TYPES_H
+#define _ASM_KMAP_TYPES_H
+
+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_IRQ0,
+	KM_IRQ1,
+	KM_TYPE_NR
+};
+
+#endif
diff -Nru a/include/asm-h8300/linkage.h b/include/asm-h8300/linkage.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/linkage.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,8 @@
+#ifndef _H8300_LINKAGE_H
+#define _H8300_LINKAGE_H
+
+#undef SYMBOL_NAME_LABEL
+#undef SYMBOL_NAME
+#define SYMBOL_NAME_LABEL(_name_) _##_name_##:
+#define SYMBOL_NAME(_name_) _##_name_
+#endif
diff -Nru a/include/asm-h8300/linux_logo.h b/include/asm-h8300/linux_logo.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/linux_logo.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,11 @@
+/*
+ * include/asm-h8300/linux_logo.h: This is a linux logo
+ *                                 to be displayed on boot.
+ */
+ 
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/version.h>
+
+#define linux_logo_banner "Linux/m68knommu version " UTS_RELEASE
+
diff -Nru a/include/asm-h8300/mc146818rtc.h b/include/asm-h8300/mc146818rtc.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/mc146818rtc.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,9 @@
+/*
+ * Machine dependent access functions for RTC registers.
+ */
+#ifndef _H8300_MC146818RTC_H
+#define _H8300_MC146818RTC_H
+
+/* empty include file to satisfy the include in genrtc.c/ide-geometry.c */
+
+#endif /* _H8300_MC146818RTC_H */
diff -Nru a/include/asm-h8300/md.h b/include/asm-h8300/md.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/md.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+/* $Id: md.h,v 1.1 2002/11/19 02:09:26 gerg Exp $
+ * md.h: High speed xor_block operation for RAID4/5 
+ *
+ */
+ 
+#ifndef __ASM_MD_H
+#define __ASM_MD_H
+
+/* #define HAVE_ARCH_XORBLOCK */
+
+#define MD_XORBLOCK_ALIGNMENT	sizeof(long)
+
+#endif /* __ASM_MD_H */
diff -Nru a/include/asm-h8300/mman.h b/include/asm-h8300/mman.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/mman.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,38 @@
+#ifndef __H8300_MMAN_H__
+#define __H8300_MMAN_H__
+
+#define PROT_READ	0x1		/* page can be read */
+#define PROT_WRITE	0x2		/* page can be written */
+#define PROT_EXEC	0x4		/* page can be executed */
+#define PROT_NONE	0x0		/* page can not be accessed */
+
+#define MAP_SHARED	0x01		/* Share changes */
+#define MAP_PRIVATE	0x02		/* Changes are private */
+#define MAP_TYPE	0x0f		/* Mask for type of mapping */
+#define MAP_FIXED	0x10		/* Interpret addr exactly */
+#define MAP_ANONYMOUS	0x20		/* don't use a file */
+
+#define MAP_GROWSDOWN	0x0100		/* stack-like segment */
+#define MAP_DENYWRITE	0x0800		/* ETXTBSY */
+#define MAP_EXECUTABLE	0x1000		/* mark it as an executable */
+#define MAP_LOCKED	0x2000		/* pages are locked */
+#define MAP_NORESERVE	0x4000		/* don't check for reservations */
+
+#define MS_ASYNC	1		/* sync memory asynchronously */
+#define MS_INVALIDATE	2		/* invalidate the caches */
+#define MS_SYNC		4		/* synchronous memory sync */
+
+#define MCL_CURRENT	1		/* lock all current mappings */
+#define MCL_FUTURE	2		/* lock all future mappings */
+
+#define MADV_NORMAL	0x0		/* default page-in behavior */
+#define MADV_RANDOM	0x1		/* page-in minimum required */
+#define MADV_SEQUENTIAL	0x2		/* read-ahead aggressively */
+#define MADV_WILLNEED	0x3		/* pre-fault pages */
+#define MADV_DONTNEED	0x4		/* discard these pages */
+
+/* compatibility flags */
+#define MAP_ANON	MAP_ANONYMOUS
+#define MAP_FILE	0
+
+#endif /* __H8300_MMAN_H__ */
diff -Nru a/include/asm-h8300/mmu.h b/include/asm-h8300/mmu.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/mmu.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,22 @@
+#ifndef __MMU_H
+#define __MMU_H
+
+/* Copyright (C) 2002, David McCullough <davidm@snapgear.com> */
+
+struct mm_rblock_struct {
+	int	size;
+	int	refcount;
+	void	*kblock;
+};
+
+struct mm_tblock_struct {
+	struct mm_rblock_struct	*rblock;
+	struct mm_tblock_struct	*next;
+};
+
+typedef struct {
+	struct mm_tblock_struct	tblock;
+	unsigned long		end_brk;
+} mm_context_t;
+
+#endif
diff -Nru a/include/asm-h8300/mmu_context.h b/include/asm-h8300/mmu_context.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/mmu_context.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,32 @@
+#ifndef __H8300_MMU_CONTEXT_H
+#define __H8300_MMU_CONTEXT_H
+
+#include <linux/config.h>
+#include <asm/setup.h>
+#include <asm/page.h>
+#include <asm/pgalloc.h>
+
+static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk, unsigned cpu)
+{
+}
+
+extern inline int
+init_new_context(struct task_struct *tsk, struct mm_struct *mm)
+{
+	// mm->context = virt_to_phys(mm->pgd);
+	return(0);
+}
+
+#define destroy_context(mm)		do { } while(0)
+#define deactivate_mm(tsk,mm)           do { } while(0)
+
+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned cpu)
+{
+}
+
+extern inline void activate_mm(struct mm_struct *prev_mm,
+			       struct mm_struct *next_mm)
+{
+}
+
+#endif
diff -Nru a/include/asm-h8300/module.h b/include/asm-h8300/module.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/module.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,12 @@
+#ifndef _ASM_H8300_MODULE_H
+#define _ASM_H8300_MODULE_H
+/*
+ * This file contains the H8/300 architecture specific module code.
+ */
+
+#define module_map(x)		vmalloc(x)
+#define module_unmap(x)		vfree(x)
+#define module_arch_init(x)	(0)
+#define arch_init_modules(x)	do { } while (0)
+
+#endif /* _ASM_H8/300_MODULE_H */
diff -Nru a/include/asm-h8300/msgbuf.h b/include/asm-h8300/msgbuf.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/msgbuf.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,31 @@
+#ifndef _H8300_MSGBUF_H
+#define _H8300_MSGBUF_H
+
+/* 
+ * The msqid64_ds structure for H8/300 architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 64-bit time_t to solve y2038 problem
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct msqid64_ds {
+	struct ipc64_perm msg_perm;
+	__kernel_time_t msg_stime;	/* last msgsnd time */
+	unsigned long	__unused1;
+	__kernel_time_t msg_rtime;	/* last msgrcv time */
+	unsigned long	__unused2;
+	__kernel_time_t msg_ctime;	/* last change time */
+	unsigned long	__unused3;
+	unsigned long  msg_cbytes;	/* current number of bytes on queue */
+	unsigned long  msg_qnum;	/* number of messages in queue */
+	unsigned long  msg_qbytes;	/* max number of bytes on queue */
+	__kernel_pid_t msg_lspid;	/* pid of last msgsnd */
+	__kernel_pid_t msg_lrpid;	/* last receive pid */
+	unsigned long  __unused4;
+	unsigned long  __unused5;
+};
+
+#endif /* _H8300_MSGBUF_H */
diff -Nru a/include/asm-h8300/namei.h b/include/asm-h8300/namei.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/namei.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,17 @@
+/*
+ * linux/include/asm-h8300/namei.h
+ *
+ * Included from linux/fs/namei.c
+ */
+
+#ifndef __H8300_NAMEI_H
+#define __H8300_NAMEI_H
+
+/* This dummy routine maybe changed to something useful
+ * for /usr/gnemul/ emulation stuff.
+ * Look at asm-sparc/namei.h for details.
+ */
+
+#define __emul_prefix() NULL
+
+#endif
diff -Nru a/include/asm-h8300/page.h b/include/asm-h8300/page.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/page.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,101 @@
+#ifndef _H8300NOMMU_PAGE_H
+#define _H8300NOMMU_PAGE_H
+
+#include <linux/config.h>
+
+/* PAGE_SHIFT determines the page size */
+
+#define PAGE_SHIFT	(12)
+#define PAGE_SIZE	(4096)
+#define PAGE_MASK	(~(PAGE_SIZE-1))
+
+#ifdef __KERNEL__
+
+#include <asm/setup.h>
+
+#if !defined(CONFIG_SMALL_TASKS) && PAGE_SHIFT < 13
+#define KTHREAD_SIZE (8192)
+#else
+#define KTHREAD_SIZE PAGE_SIZE
+#endif
+ 
+#ifndef __ASSEMBLY__
+ 
+#define get_user_page(vaddr)		__get_free_page(GFP_KERNEL)
+#define free_user_page(page, addr)	free_page(addr)
+
+#define clear_page(page)	memset((page), 0, PAGE_SIZE)
+#define copy_page(to,from)	memcpy((to), (from), PAGE_SIZE)
+
+#define clear_user_page(page, vaddr, pg)	clear_page(page)
+#define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
+
+/*
+ * These are used to make use of C type-checking..
+ */
+typedef struct { unsigned long pte; } pte_t;
+typedef struct { unsigned long pmd[16]; } pmd_t;
+typedef struct { unsigned long pgd; } pgd_t;
+typedef struct { unsigned long pgprot; } pgprot_t;
+
+#define pte_val(x)	((x).pte)
+#define pmd_val(x)	((&x)->pmd[0])
+#define pgd_val(x)	((x).pgd)
+#define pgprot_val(x)	((x).pgprot)
+
+#define __pte(x)	((pte_t) { (x) } )
+#define __pmd(x)	((pmd_t) { (x) } )
+#define __pgd(x)	((pgd_t) { (x) } )
+#define __pgprot(x)	((pgprot_t) { (x) } )
+
+/* to align the pointer to the (next) page boundary */
+#define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK)
+
+/* Pure 2^n version of get_order */
+extern __inline__ int get_order(unsigned long size)
+{
+	int order;
+
+	size = (size-1) >> (PAGE_SHIFT-1);
+	order = -1;
+	do {
+		size >>= 1;
+		order++;
+	} while (size);
+	return order;
+}
+
+extern unsigned long memory_start;
+extern unsigned long memory_end;
+
+#endif /* !__ASSEMBLY__ */
+
+#include <asm/page_offset.h>
+
+#define PAGE_OFFSET		(PAGE_OFFSET_RAW)
+
+#ifndef __ASSEMBLY__
+
+#define __pa(vaddr)		virt_to_phys((void *)vaddr)
+#define __va(paddr)		phys_to_virt((unsigned long)paddr)
+
+#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)
+#define pfn_to_virt(pfn)	__va((pfn) << PAGE_SHIFT)
+
+#define MAP_NR(addr)		(((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT)
+#define virt_to_page(addr)	(mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
+#define virt_to_page(addr)	(mem_map + (((unsigned long)(addr)-PAGE_OFFSET) >> PAGE_SHIFT))
+#define page_to_virt(page)	((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET)
+#define VALID_PAGE(page)	((page - mem_map) < max_mapnr)
+
+#define pfn_to_page(pfn)	virt_to_page(pfn_to_virt(pfn))
+#define page_to_pfn(page)	virt_to_pfn(page_to_virt(page))
+
+#define	virt_addr_valid(kaddr)	(((void *)(kaddr) >= (void *)PAGE_OFFSET) && \
+				((void *)(kaddr) < (void *)memory_end))
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __KERNEL__ */
+
+#endif /* _H8300NOMMU_PAGE_H */
diff -Nru a/include/asm-h8300/page_offset.h b/include/asm-h8300/page_offset.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/page_offset.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,4 @@
+
+#include <linux/config.h>
+#define PAGE_OFFSET_RAW		0x00000000
+
diff -Nru a/include/asm-h8300/param.h b/include/asm-h8300/param.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/param.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,27 @@
+#ifndef _H8300_PARAM_H
+#define _H8300_PARAM_H
+
+#include <linux/config.h>
+
+#ifndef HZ
+#define HZ 100
+#endif
+
+#ifdef __KERNEL__
+#define	USER_HZ		HZ
+#define	CLOCKS_PER_SEC	(USER_HZ)
+#endif
+
+#define EXEC_PAGESIZE	4096
+
+#ifndef NGROUPS
+#define NGROUPS		32
+#endif
+
+#ifndef NOGROUP
+#define NOGROUP		(-1)
+#endif
+
+#define MAXHOSTNAMELEN	64	/* max length of hostname */
+
+#endif /* _H8300_PARAM_H */
diff -Nru a/include/asm-h8300/pci.h b/include/asm-h8300/pci.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/pci.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,25 @@
+#ifndef _ASM_H8300_PCI_H
+#define _ASM_H8300_PCI_H
+
+/*
+ * asm-h8300/pci.h - H8/300 specific PCI declarations.
+ *
+ * Yoshinori Sato <ysato@users.sourceforge.jp>
+ */
+
+#define pcibios_assign_all_busses()	0
+
+extern inline void pcibios_set_master(struct pci_dev *dev)
+{
+	/* No special bus mastering setup handling */
+}
+
+extern inline void pcibios_penalize_isa_irq(int irq)
+{
+	/* We don't do dynamic PCI IRQ allocation */
+}
+
+/* Return the index of the PCI controller for device PDEV. */
+#define pci_controller_num(PDEV)	(0)
+
+#endif /* _ASM_H8300_PCI_H */
diff -Nru a/include/asm-h8300/percpu.h b/include/asm-h8300/percpu.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/percpu.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,6 @@
+#ifndef __ARCH_H8300_PERCPU__
+#define __ARCH_H8300_PERCPU__
+
+#include <asm-generic/percpu.h>
+
+#endif /* __ARCH_H8300_PERCPU__ */
diff -Nru a/include/asm-h8300/pgalloc.h b/include/asm-h8300/pgalloc.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/pgalloc.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,8 @@
+#ifndef _H8300_PGALLOC_H
+#define _H8300_PGALLOC_H
+
+#include <asm/setup.h>
+
+#define check_pgt_cache()	do { } while (0)
+
+#endif /* _H8300_PGALLOC_H */
diff -Nru a/include/asm-h8300/pgtable.h b/include/asm-h8300/pgtable.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/pgtable.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,52 @@
+#ifndef _H8300_PGTABLE_H
+#define _H8300_PGTABLE_H
+
+#include <linux/config.h>
+#include <linux/slab.h>
+#include <asm/processor.h>
+#include <asm/page.h>
+#include <asm/io.h>
+
+typedef pte_t *pte_addr_t;
+
+#define pgd_present(pgd)     (1)       /* pages are always present on NO_MM */
+#define pgd_none(pgd)		(0)
+#define pgd_bad(pgd)		(0)
+#define pgd_clear(pgdp)
+#define kern_addr_valid(addr)	(1)
+#define	pmd_offset(a, b)	((void *)0)
+
+#define PAGE_NONE		__pgprot(0)    /* these mean nothing to NO_MM */
+#define PAGE_SHARED		__pgprot(0)    /* these mean nothing to NO_MM */
+#define PAGE_COPY		__pgprot(0)    /* these mean nothing to NO_MM */
+#define PAGE_READONLY	__pgprot(0)    /* these mean nothing to NO_MM */
+#define PAGE_KERNEL		__pgprot(0)    /* these mean nothing to NO_MM */
+
+extern void paging_init(void);
+#define swapper_pg_dir ((pgd_t *) 0)
+
+#define __swp_type(x)		(0)
+#define __swp_offset(x)		(0)
+#define __swp_entry(typ,off)	((swp_entry_t) { ((typ) | ((off) << 7)) })
+#define __pte_to_swp_entry(pte)	((swp_entry_t) { pte_val(pte) })
+#define __swp_entry_to_pte(x)	((pte_t) { (x).val })
+
+/*
+ * ZERO_PAGE is a global shared page that is always zero: used
+ * for zero-mapped memory areas etc..
+ */
+#define ZERO_PAGE(vaddr)	(virt_to_page(0))
+
+/*
+ * These would be in other places but having them here reduces the diffs.
+ */
+extern unsigned int kobjsize(const void *objp);
+extern int is_in_rom(unsigned long);
+
+/*
+ * No page table caches to initialise
+ */
+#define pgtable_cache_init()   do { } while (0)
+#define io_remap_page_range	remap_page_range
+
+#endif /* _H8300_PGTABLE_H */
diff -Nru a/include/asm-h8300/poll.h b/include/asm-h8300/poll.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/poll.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,22 @@
+#ifndef __H8300_POLL_H
+#define __H8300_POLL_H
+
+#define POLLIN		  1
+#define POLLPRI		  2
+#define POLLOUT		  4
+#define POLLERR		  8
+#define POLLHUP		 16
+#define POLLNVAL	 32
+#define POLLRDNORM	 64
+#define POLLWRNORM	POLLOUT
+#define POLLRDBAND	128
+#define POLLWRBAND	256
+#define POLLMSG		0x0400
+
+struct pollfd {
+	int fd;
+	short events;
+	short revents;
+};
+
+#endif
diff -Nru a/include/asm-h8300/posix_types.h b/include/asm-h8300/posix_types.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/posix_types.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,65 @@
+#ifndef __ARCH_H8300_POSIX_TYPES_H
+#define __ARCH_H8300_POSIX_TYPES_H
+
+/*
+ * This file is generally used by user-level software, so you need to
+ * be a little careful about namespace pollution etc.  Also, we cannot
+ * assume GCC is being used.
+ */
+
+typedef unsigned short	__kernel_dev_t;
+typedef unsigned long	__kernel_ino_t;
+typedef unsigned short	__kernel_mode_t;
+typedef unsigned short	__kernel_nlink_t;
+typedef long		__kernel_off_t;
+typedef int		__kernel_pid_t;
+typedef unsigned short	__kernel_ipc_pid_t;
+typedef unsigned short	__kernel_uid_t;
+typedef unsigned short	__kernel_gid_t;
+typedef unsigned int	__kernel_size_t;
+typedef int		__kernel_ssize_t;
+typedef int		__kernel_ptrdiff_t;
+typedef long		__kernel_time_t;
+typedef long		__kernel_suseconds_t;
+typedef long		__kernel_clock_t;
+typedef int		__kernel_timer_t;
+typedef int		__kernel_clockid_t;
+typedef int		__kernel_daddr_t;
+typedef char *		__kernel_caddr_t;
+typedef unsigned short	__kernel_uid16_t;
+typedef unsigned short	__kernel_gid16_t;
+typedef unsigned int	__kernel_uid32_t;
+typedef unsigned int	__kernel_gid32_t;
+
+typedef unsigned short	__kernel_old_uid_t;
+typedef unsigned short	__kernel_old_gid_t;
+
+#ifdef __GNUC__
+typedef long long	__kernel_loff_t;
+#endif
+
+typedef struct {
+#if defined(__KERNEL__) || defined(__USE_ALL)
+	int	val[2];
+#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+	int	__val[2];
+#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+} __kernel_fsid_t;
+
+#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
+
+#undef	__FD_SET
+#define	__FD_SET(d, set)	((set)->fds_bits[__FDELT(d)] |= __FDMASK(d))
+
+#undef	__FD_CLR
+#define	__FD_CLR(d, set)	((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d))
+
+#undef	__FD_ISSET
+#define	__FD_ISSET(d, set)	((set)->fds_bits[__FDELT(d)] & __FDMASK(d))
+
+#undef	__FD_ZERO
+#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp)))
+
+#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */
+
+#endif
diff -Nru a/include/asm-h8300/processor.h b/include/asm-h8300/processor.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/processor.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,121 @@
+/*
+ * include/asm-h8300/processor.h
+ *
+ * Copyright (C) 2002 Yoshinori Sato
+ *
+ * Based on: linux/asm-m68nommu/processor.h
+ *
+ * Copyright (C) 1995 Hamish Macdonald
+ */
+
+#ifndef __ASM_H8300_PROCESSOR_H
+#define __ASM_H8300_PROCESSOR_H
+
+/*
+ * Default implementation of macro that returns current
+ * instruction pointer ("program counter").
+ */
+#define current_text_addr() ({ __label__ _l; _l: &&_l;})
+
+#include <linux/config.h>
+#include <asm/segment.h>
+#include <asm/fpu.h>
+#include <asm/ptrace.h>
+#include <asm/current.h>
+
+extern inline unsigned long rdusp(void) {
+	extern unsigned int	sw_usp;
+	return(sw_usp);
+}
+
+extern inline void wrusp(unsigned long usp) {
+	extern unsigned int	sw_usp;
+	sw_usp = usp;
+}
+
+/*
+ * User space process size: 3.75GB. This is hardcoded into a few places,
+ * so don't change it unless you know what you are doing.
+ */
+#define TASK_SIZE	(0xFFFFFFFFUL)
+
+/*
+ * This decides where the kernel will search for a free chunk of vm
+ * space during mmap's. We won't be using it
+ */
+#define TASK_UNMAPPED_BASE	0
+
+/*
+ * Bus types
+ */
+#define EISA_bus 0
+#define MCA_bus 0
+
+struct thread_struct {
+	unsigned long  ksp;		/* kernel stack pointer */
+	unsigned long  usp;		/* user stack pointer */
+	unsigned short ccr;		/* saved status register */
+	unsigned long  esp0;            /* points to SR of stack frame */
+	unsigned long  vfork_ret;
+	unsigned long  debugreg[8];     /* debug info */
+} __attribute__((aligned(2),packed));
+
+#define INIT_THREAD  { \
+	sizeof(init_stack) + (unsigned long) init_stack, 0, \
+	PS_S,  0, 0, \
+}
+
+/*
+ * Do necessary setup to start up a newly executed thread.
+ *
+ * pass the data segment into user programs if it exists,
+ * it can't hurt anything as far as I can tell
+ */
+#define start_thread(_regs, _pc, _usp)			        \
+do {							        \
+	(_regs)->pc = (_pc);				        \
+	(_regs)->ccr &= ~0x10;				        \
+        *((unsigned long *)(_usp)-1) = _pc;                     \
+	wrusp((unsigned long)(_usp) - sizeof(unsigned long)*3);	\
+} while(0)
+
+/* Forward declaration, a strange C thing */
+struct task_struct;
+
+/* Free all resources held by a thread. */
+static inline void release_thread(struct task_struct *dead_task)
+{
+}
+
+extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
+
+#define copy_segments(tsk, mm)	do { } while (0)
+#define release_segments(mm)	do { } while (0)
+#define forget_segments()	do { } while (0)
+#define prepare_to_copy(tsk)	do { } while (0)
+
+/*
+ * Free current thread data structures etc..
+ */
+static inline void exit_thread(void)
+{
+}
+
+/*
+ * Return saved PC of a blocked thread.
+ */
+unsigned long thread_saved_pc(struct task_struct *tsk);
+unsigned long get_wchan(struct task_struct *p);
+
+#define	KSTK_EIP(tsk)	\
+    ({			\
+	unsigned long eip = 0;	 \
+	if ((tsk)->thread.esp0 > PAGE_SIZE && \
+	    MAP_NR((tsk)->thread.esp0) < max_mapnr) \
+	      eip = ((struct pt_regs *) (tsk)->thread.esp0)->pc; \
+	eip; })
+#define	KSTK_ESP(tsk)	((tsk) == current ? rdusp() : (tsk)->thread.usp)
+
+#define cpu_relax()    do { } while (0)
+
+#endif
diff -Nru a/include/asm-h8300/ptrace.h b/include/asm-h8300/ptrace.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/ptrace.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,56 @@
+#ifndef _H8300_PTRACE_H
+#define _H8300_PTRACE_H
+
+#ifndef __ASSEMBLY__
+
+#define PT_ER1	   0
+#define PT_ER2	   1
+#define PT_ER3	   2
+#define PT_ER4	   3
+#define PT_ER5	   4
+#define PT_ER6	   5
+#define PT_ER0	   6
+#define PT_ORIG_ER0	   7
+#define PT_CCR	   8
+#define PT_PC	   9
+#define PT_USP	   10
+
+/* this struct defines the way the registers are stored on the
+   stack during a system call. */
+
+struct pt_regs {
+	long     er3;
+	long     er2;
+	long     er1;
+	long     orig_er0;
+	unsigned short ccr;
+	long     er0;
+	long     vector;
+	unsigned long  pc;
+} __attribute__((aligned(2),packed));
+
+/*
+ * This is the extended stack used by signal handlers and the context
+ * switcher: it's pushed after the normal "struct pt_regs".
+ */
+struct switch_stack {
+	unsigned long  er6;
+	unsigned long  er5;
+	unsigned long  er4;
+	unsigned long  retpc;
+};
+
+#define PTRACE_GETREGS            12
+#define PTRACE_SETREGS            13
+
+#ifdef __KERNEL__
+#ifndef PS_S
+#define PS_S  (0x10)
+#endif
+
+#define user_mode(regs) (!((regs)->ccr & PS_S))
+#define instruction_pointer(regs) ((regs)->pc)
+extern void show_regs(struct pt_regs *);
+#endif /* __KERNEL__ */
+#endif /* __ASSEMBLY__ */
+#endif /* _H8300_PTRACE_H */
diff -Nru a/include/asm-h8300/regs306x.h b/include/asm-h8300/regs306x.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/regs306x.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,212 @@
+/* internal Peripherals Register address define */
+/* CPU: H8/306x                                 */
+
+#if !defined(__REGS_H8306x__)
+#define __REGS_H8306x__ 
+
+#if defined(__KERNEL__)
+
+#define DASTCR *(volatile unsigned char *)0xFEE01A
+#define DADR0  0xFEE09C
+#define DADR1  0xFEE09D
+#define DACR   0xFEE09E
+
+#define ADDRAH 0xFFFFE0
+#define ADDRAL 0xFFFFE1
+#define ADDRBH 0xFFFFE2
+#define ADDRBL 0xFFFFE3
+#define ADDRCH 0xFFFFE4
+#define ADDRCL 0xFFFFE5
+#define ADDRDH 0xFFFFE6
+#define ADDRDL 0xFFFFE7
+#define ADCSR  0xFFFFE8
+#define ADCR   0xFFFFE9
+
+#define BRCR   0xFEE013
+#define ADRCR  0xFEE01E
+#define CSCR   0xFEE01F
+#define ABWCR  0xFEE020
+#define ASTCR  0xFEE021
+#define WCRH   0xFEE022
+#define WCRL   0xFEE023
+#define BCR    0xFEE024
+#define DRCRA  0xFEE026
+#define DRCRB  0xFEE027
+#define RTMCSR 0xFEE028
+#define RTCNT  0xFEE029
+#define RTCOR  0xFEE02A
+
+#define MAR0AR  0xFFFF20
+#define MAR0AE  0xFFFF21
+#define MAR0AH  0xFFFF22
+#define MAR0AL  0xFFFF23
+#define ETCR0AL 0xFFFF24
+#define ETCR0AH 0xFFFF25
+#define IOAR0A  0xFFFF26
+#define DTCR0A  0xFFFF27
+#define MAR0BR  0xFFFF28
+#define MAR0BE  0xFFFF29
+#define MAR0BH  0xFFFF2A
+#define MAR0BL  0xFFFF2B
+#define ETCR0BL 0xFFFF2C
+#define ETCR0BH 0xFFFF2D
+#define IOAR0B  0xFFFF2E
+#define DTCR0B  0xFFFF2F
+#define MAR1AR  0xFFFF30
+#define MAR1AE  0xFFFF31
+#define MAR1AH  0xFFFF32
+#define MAR1AL  0xFFFF33
+#define ETCR1AL 0xFFFF34
+#define ETCR1AH 0xFFFF35
+#define IOAR1A  0xFFFF36
+#define DTCR1A  0xFFFF37
+#define MAR1BR  0xFFFF38
+#define MAR1BE  0xFFFF39
+#define MAR1BH  0xFFFF3A
+#define MAR1BL  0xFFFF3B
+#define ETCR1BL 0xFFFF3C
+#define ETCR1BH 0xFFFF3D
+#define IOAR1B  0xFFFF3E
+#define DTCR1B  0xFFFF3F
+
+#define ISCR 0xFEE014
+#define IER  0xFEE015
+#define ISR  0xFEE016
+#define IPRA 0xFEE018
+#define IPRB 0xFEE019
+
+#define P1DDR 0xFEE000
+#define P2DDR 0xFEE001
+#define P3DDR 0xFEE002
+#define P4DDR 0xFEE003
+#define P5DDR 0xFEE004
+#define P6DDR 0xFEE005
+/*#define P7DDR 0xFEE006*/
+#define P8DDR 0xFEE007
+#define P9DDR 0xFEE008
+#define PADDR 0xFEE009
+#define PBDDR 0xFEE00A
+
+#define P1DR  0xFFFFD0
+#define P2DR  0xFFFFD1
+#define P3DR  0xFFFFD2
+#define P4DR  0xFFFFD3
+#define P5DR  0xFFFFD4
+#define P6DR  0xFFFFD5
+/*#define P7DR  0xFFFFD6*/
+#define P8DR  0xFFFFD7
+#define P9DR  0xFFFFD8
+#define PADR  0xFFFFD9
+#define PBDR  0xFFFFDA
+
+#define P2CR  0xFEE03C
+#define P4CR  0xFEE03E
+#define P5CR  0xFEE03F
+
+#define SMR0  0xFFFFB0
+#define BRR0  0xFFFFB1
+#define SCR0  0xFFFFB2
+#define TDR0  0xFFFFB3
+#define SSR0  0xFFFFB4
+#define RDR0  0xFFFFB5
+#define SCMR0 0xFFFFB6
+#define SMR1  0xFFFFB8
+#define BRR1  0xFFFFB9
+#define SCR1  0xFFFFBA
+#define TDR1  0xFFFFBB
+#define SSR1  0xFFFFBC
+#define RDR1  0xFFFFBD
+#define SCMR1 0xFFFFBE
+#define SMR2  0xFFFFC0
+#define BRR2  0xFFFFC1
+#define SCR2  0xFFFFC2
+#define TDR2  0xFFFFC3
+#define SSR2  0xFFFFC4
+#define RDR2  0xFFFFC5
+#define SCMR2 0xFFFFC6
+
+#define MDCR   0xFEE000
+#define SYSCR  0xFEE001
+#define DIVCR  0xFEE01B
+#define MSTCRH 0xFEE01C
+#define MSTCRL 0xFEE01D
+#define FLMCR1 0xFEE030
+#define FLMCR2 0xFEE031
+#define EBR1   0xFEE032
+#define EBR2   0xFEE033
+#define RAMCR  0xFEE077
+
+#define TSTR   0xFFFF60
+#define TSNC   0XFFFF61
+#define TMDR   0xFFFF62
+#define TOLR   0xFFFF63
+#define TISRA  0xFFFF64
+#define TISRB  0xFFFF65
+#define TISRC  0xFFFF66
+#define TCR0   0xFFFF68
+#define TIOR0  0xFFFF69
+#define TCNT0H 0xFFFF6A
+#define TCNT0L 0xFFFF6B
+#define GRA0H  0xFFFF6C
+#define GRA0L  0xFFFF6D
+#define GRB0H  0xFFFF6E
+#define GRB0L  0xFFFF6F
+#define TCR1   0xFFFF70
+#define TIOR1  0xFFFF71
+#define TCNT1H 0xFFFF72
+#define TCNT1L 0xFFFF73
+#define GRA1H  0xFFFF74
+#define GRA1L  0xFFFF75
+#define GRB1H  0xFFFF76
+#define GRB1L  0xFFFF77
+#define TCR3   0xFFFF78
+#define TIOR3  0xFFFF79
+#define TCNT3H 0xFFFF7A
+#define TCNT3L 0xFFFF7B
+#define GRA3H  0xFFFF7C
+#define GRA3L  0xFFFF7D
+#define GRB3H  0xFFFF7E
+#define GRB3L  0xFFFF7F
+
+#define _8TCR0  0xFFFF80
+#define _8TCR1  0xFFFF81
+#define _8TCSR0 0xFFFF82
+#define _8TCSR1 0xFFFF83
+#define TCORA0 0xFFFF84
+#define TCORA1 0xFFFF85
+#define TCORB0 0xFFFF86
+#define TCORB1 0xFFFF87
+#define _8TCNT0 0xFFFF88
+#define _8TCNT1 0xFFFF89
+
+#define _8TCR2  0xFFFF90
+#define _8TCR3  0xFFFF91
+#define _8TCSR2 0xFFFF92
+#define _8TCSR3 0xFFFF93
+#define TCORA2 0xFFFF94
+#define TCORA3 0xFFFF95
+#define TCORB2 0xFFFF96
+#define TCORB3 0xFFFF97
+#define _8TCNT2 0xFFFF98
+#define _8TCNT3 0xFFFF99
+
+#define TCSR   0xFFFF8C
+#define TCNT   0xFFFF8D
+#define RSTCSR 0xFFFF8F
+
+#define TPMR  0xFFFFA0
+#define TPCR  0xFFFFA1
+#define NDERB 0xFFFFA2
+#define NDERA 0xFFFFA3
+#define NDRB1 0xFFFFA4
+#define NDRA1 0xFFFFA5
+#define NDRB2 0xFFFFA6
+#define NDRA2 0xFFFFA7
+
+#define TCSR    0xFFFF8C
+#define TCNT    0xFFFF8D
+#define RSTCSRW 0xFFFF8E
+#define RSTCSRR 0xFFFF8F
+
+#endif /* __KERNEL__ */
+#endif /* __REGS_H8306x__ */
diff -Nru a/include/asm-h8300/resource.h b/include/asm-h8300/resource.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/resource.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,47 @@
+#ifndef _H8300_RESOURCE_H
+#define _H8300_RESOURCE_H
+
+/*
+ * Resource limits
+ */
+
+#define RLIMIT_CPU	0		/* CPU time in ms */
+#define RLIMIT_FSIZE	1		/* Maximum filesize */
+#define RLIMIT_DATA	2		/* max data size */
+#define RLIMIT_STACK	3		/* max stack size */
+#define RLIMIT_CORE	4		/* max core file size */
+#define RLIMIT_RSS	5		/* max resident set size */
+#define RLIMIT_NPROC	6		/* max number of processes */
+#define RLIMIT_NOFILE	7		/* max number of open files */
+#define RLIMIT_MEMLOCK	8		/* max locked-in-memory address space */
+#define RLIMIT_AS	9		/* address space limit */
+#define RLIMIT_LOCKS	10		/* maximum file locks held */
+
+#define RLIM_NLIMITS	11
+
+/*
+ * SuS says limits have to be unsigned.
+ * Which makes a ton more sense anyway.
+ */
+#define RLIM_INFINITY	(~0UL)
+
+#ifdef __KERNEL__
+
+#define INIT_RLIMITS					\
+{							\
+	{ RLIM_INFINITY, RLIM_INFINITY },		\
+	{ RLIM_INFINITY, RLIM_INFINITY },		\
+	{ RLIM_INFINITY, RLIM_INFINITY },		\
+	{      _STK_LIM, RLIM_INFINITY },		\
+	{             0, RLIM_INFINITY },		\
+	{ RLIM_INFINITY, RLIM_INFINITY },		\
+	{             0,             0 },		\
+	{      INR_OPEN,     INR_OPEN  },		\
+	{ RLIM_INFINITY, RLIM_INFINITY },		\
+	{ RLIM_INFINITY, RLIM_INFINITY },		\
+        { RLIM_INFINITY, RLIM_INFINITY },		\
+}
+
+#endif /* __KERNEL__ */
+
+#endif /* _H8300_RESOURCE_H */
diff -Nru a/include/asm-h8300/scatterlist.h b/include/asm-h8300/scatterlist.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/scatterlist.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,13 @@
+#ifndef _H8300_SCATTERLIST_H
+#define _H8300_SCATTERLIST_H
+
+struct scatterlist {
+	struct page	*page;
+	unsigned int	offset;
+	dma_addr_t	dma_address;
+	unsigned int	length;
+};
+
+#define ISA_DMA_THRESHOLD	(0xffffffff)
+
+#endif /* !(_H8300_SCATTERLIST_H) */
diff -Nru a/include/asm-h8300/segment.h b/include/asm-h8300/segment.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/segment.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,49 @@
+#ifndef _H8300_SEGMENT_H
+#define _H8300_SEGMENT_H
+
+/* define constants */
+#define USER_DATA     (1)
+#ifndef __USER_DS
+#define __USER_DS     (USER_DATA)
+#endif
+#define USER_PROGRAM  (2)
+#define SUPER_DATA    (3)
+#ifndef __KERNEL_DS
+#define __KERNEL_DS   (SUPER_DATA)
+#endif
+#define SUPER_PROGRAM (4)
+
+#ifndef __ASSEMBLY__
+
+typedef struct {
+	unsigned long seg;
+} mm_segment_t;
+
+#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
+#define USER_DS		MAKE_MM_SEG(__USER_DS)
+#define KERNEL_DS	MAKE_MM_SEG(__KERNEL_DS)
+
+/*
+ * Get/set the SFC/DFC registers for MOVES instructions
+ */
+
+static inline mm_segment_t get_fs(void)
+{
+    return USER_DS;
+}
+
+static inline mm_segment_t get_ds(void)
+{
+    /* return the supervisor data space code */
+    return KERNEL_DS;
+}
+
+static inline void set_fs(mm_segment_t val)
+{
+}
+
+#define segment_eq(a,b)	((a).seg == (b).seg)
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* _H8300_SEGMENT_H */
diff -Nru a/include/asm-h8300/semaphore-helper.h b/include/asm-h8300/semaphore-helper.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/semaphore-helper.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,86 @@
+#ifndef _H8300_SEMAPHORE_HELPER_H
+#define _H8300_SEMAPHORE_HELPER_H
+
+/*
+ * SMP- and interrupt-safe semaphores helper functions.
+ *
+ * (C) Copyright 1996 Linus Torvalds
+ *
+ * based on
+ * m68k version by Andreas Schwab
+ */
+
+#include <linux/config.h>
+#include <linux/errno.h>
+
+/*
+ * These two _must_ execute atomically wrt each other.
+ */
+static inline void wake_one_more(struct semaphore * sem)
+{
+	atomic_inc((atomic_t *)&sem->sleepers);
+}
+
+static inline int waking_non_zero(struct semaphore *sem)
+{
+	int ret;
+	unsigned long flags;
+
+	spin_lock_irqsave(&semaphore_wake_lock, flags);
+	ret = 0;
+	if (sem->sleepers > 0) {
+		sem->sleepers--;
+		ret = 1;
+	}
+	spin_unlock_irqrestore(&semaphore_wake_lock, flags);
+	return ret;
+}
+
+/*
+ * waking_non_zero_interruptible:
+ *	1	got the lock
+ *	0	go to sleep
+ *	-EINTR	interrupted
+ */
+static inline int waking_non_zero_interruptible(struct semaphore *sem,
+						struct task_struct *tsk)
+{
+	int ret;
+	unsigned long flags;
+
+	spin_lock_irqsave(&semaphore_wake_lock, flags);
+	ret = 0;
+	if (sem->sleepers > 0) {
+		sem->sleepers--;
+		ret = 1;
+	} else if (signal_pending(tsk)) {
+		atomic_inc(&sem->count);
+		ret = -EINTR;
+	}
+	spin_unlock_irqrestore(&semaphore_wake_lock, flags);
+	return ret;
+}
+
+/*
+ * waking_non_zero_trylock:
+ *	1	failed to lock
+ *	0	got the lock
+ */
+static inline int waking_non_zero_trylock(struct semaphore *sem)
+{
+	int ret;
+	unsigned long flags;
+
+	spin_lock_irqsave(&semaphore_wake_lock, flags);
+	ret = 1;
+	if (sem->sleepers <= 0)
+		atomic_inc(&sem->count);
+	else {
+		sem->sleepers--;
+		ret = 0;
+	}
+	spin_unlock_irqrestore(&semaphore_wake_lock, flags);
+	return ret;
+}
+
+#endif
diff -Nru a/include/asm-h8300/semaphore.h b/include/asm-h8300/semaphore.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/semaphore.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,206 @@
+#ifndef _H8300_SEMAPHORE_H
+#define _H8300_SEMAPHORE_H
+
+#define RW_LOCK_BIAS		 0x01000000
+
+#ifndef __ASSEMBLY__
+
+#include <linux/linkage.h>
+#include <linux/wait.h>
+#include <linux/spinlock.h>
+#include <linux/rwsem.h>
+
+#include <asm/system.h>
+#include <asm/atomic.h>
+
+/*
+ * Interrupt-safe semaphores..
+ *
+ * (C) Copyright 1996 Linus Torvalds
+ *
+ * H8/300 version by Yoshinori Sato
+ */
+
+
+struct semaphore {
+	atomic_t count;
+	int sleepers;
+	wait_queue_head_t wait;
+#if WAITQUEUE_DEBUG
+	long __magic;
+#endif
+};
+
+#if WAITQUEUE_DEBUG
+# define __SEM_DEBUG_INIT(name) \
+		, (long)&(name).__magic
+#else
+# define __SEM_DEBUG_INIT(name)
+#endif
+
+#define __SEMAPHORE_INITIALIZER(name,count) \
+{ ATOMIC_INIT(count), 0, __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \
+	__SEM_DEBUG_INIT(name) }
+
+#define __MUTEX_INITIALIZER(name) \
+	__SEMAPHORE_INITIALIZER(name,1)
+
+#define __DECLARE_SEMAPHORE_GENERIC(name,count) \
+	struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
+
+#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
+#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
+
+extern inline void sema_init (struct semaphore *sem, int val)
+{
+	*sem = (struct semaphore)__SEMAPHORE_INITIALIZER(*sem, val);
+}
+
+static inline void init_MUTEX (struct semaphore *sem)
+{
+	sema_init(sem, 1);
+}
+
+static inline void init_MUTEX_LOCKED (struct semaphore *sem)
+{
+	sema_init(sem, 0);
+}
+
+asmlinkage void __down_failed(void /* special register calling convention */);
+asmlinkage int  __down_failed_interruptible(void  /* params in registers */);
+asmlinkage int  __down_failed_trylock(void  /* params in registers */);
+asmlinkage void __up_wakeup(void /* special register calling convention */);
+
+asmlinkage void __down(struct semaphore * sem);
+asmlinkage int  __down_interruptible(struct semaphore * sem);
+asmlinkage int  __down_trylock(struct semaphore * sem);
+asmlinkage void __up(struct semaphore * sem);
+
+extern spinlock_t semaphore_wake_lock;
+
+/*
+ * This is ugly, but we want the default case to fall through.
+ * "down_failed" is a special asm handler that calls the C
+ * routine that actually waits. See arch/m68k/lib/semaphore.S
+ */
+extern inline void down(struct semaphore * sem)
+{
+#if WAITQUEUE_DEBUG
+	CHECK_MAGIC(sem->__magic);
+#endif
+
+	__asm__ __volatile__(
+		"stc ccr,r4l\n\t"
+		"orc #0x80,ccr\n\t"
+		"mov.l @%0, er0\n\t"
+		"dec.l #1,er0\n\t"
+		"mov.l er0,@%0\n\t"
+		"bpl 1f\n\t"
+		"ldc r4l,ccr\n\t"
+		"mov.l %0,er0\n\t"
+		"jsr @___down\n"
+		"1:\n\t"
+		"ldc r4l,ccr"
+		: /* no outputs */
+		: "r" (&(sem->count))
+		: "cc", "er0", "er1", "er2", "er3", "er4", "memory");
+}
+
+extern inline int down_interruptible(struct semaphore * sem)
+{
+	register int ret __asm__("er0");
+
+#if WAITQUEUE_DEBUG
+	CHECK_MAGIC(sem->__magic);
+#endif
+
+	__asm__ __volatile__(
+		"stc ccr,r1l\n\t"
+		"orc #0x80,ccr\n\t"
+		"mov.l @%1, er2\n\t"
+		"dec.l #1,er2\n\t"
+		"mov.l er2,@%1\n\t"
+		"bpl 1f\n\t"
+		"ldc r1l,ccr\n\t"
+		"mov.l %1,er0\n\t"
+		"jsr @___down_interruptible\n\t"
+		"bra 2f\n"
+		"1:\n\t"
+		"ldc r1l,ccr\n\t"
+		"sub.l %0,%0\n\t"
+		"2:\n\t"
+		: "=r" (ret)
+		: "r" (&(sem->count))
+		: "cc", "er1", "er2", "er3", "memory");
+	return ret;
+}
+
+extern inline int down_trylock(struct semaphore * sem)
+{
+	register int result;
+
+#if WAITQUEUE_DEBUG
+	CHECK_MAGIC(sem->__magic);
+#endif
+
+	__asm__ __volatile__(
+		"stc ccr,r4l\n\t"
+		"orc #0x80,ccr\n\t"
+		"mov.l @%1,er0\n\t"
+		"dec.l #1,er0\n\t"
+		"mov.l er0,@%1\n\t"
+		"bpl 1f\n\t"
+		"ldc r4l,ccr\n\t"
+		"jmp @3f\n"
+		"1:\n\t"
+		"ldc r4l,ccr\n\t"
+		"sub.l %0,%0\n"
+		"2:\n"
+		".section .text.lock,\"ax\"\n"
+		".align 2\n"
+		"3:\n\t"
+		"mov.l %1,er0\n\t"
+		"jsr @___down_trylock\n"
+		"mov.l er0,%0\n\t"
+		"jmp @2b\n\t"
+		".previous"
+		: "=r" (result)
+		: "r" (&(sem->count))
+		: "cc", "er0","er4", "memory");
+	return result;
+}
+
+/*
+ * Note! This is subtle. We jump to wake people up only if
+ * the semaphore was negative (== somebody was waiting on it).
+ * The default case (no contention) will result in NO
+ * jumps for both down() and up().
+ */
+extern inline void up(struct semaphore * sem)
+{
+#if WAITQUEUE_DEBUG
+	CHECK_MAGIC(sem->__magic);
+#endif
+
+	__asm__ __volatile__(
+		"stc ccr,r4l\n\t"
+		"orc #0x80,ccr\n\t"
+		"mov.l @%0,er0\n\t"
+		"inc.l #1,er0\n\t"
+		"mov.l er0,@%0\n\t"
+		"bmi 1f\n\t"
+		"bne 2f\n\t"
+		"1:\n\t"
+		"ldc r4l,ccr\n\t"
+		"mov.l %0,er0\n\t"
+		"jsr @___up\n"
+		"2:\n\t"
+                "ldc r4l,ccr"
+		: /* no outputs */
+		: "r" (&(sem->count))
+		: "cc", "er0", "er4", "memory");
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif
diff -Nru a/include/asm-h8300/sembuf.h b/include/asm-h8300/sembuf.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/sembuf.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,25 @@
+#ifndef _H8300_SEMBUF_H
+#define _H8300_SEMBUF_H
+
+/* 
+ * The semid64_ds structure for m68k architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 64-bit time_t to solve y2038 problem
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct semid64_ds {
+	struct ipc64_perm sem_perm;		/* permissions .. see ipc.h */
+	__kernel_time_t	sem_otime;		/* last semop time */
+	unsigned long	__unused1;
+	__kernel_time_t	sem_ctime;		/* last change time */
+	unsigned long	__unused2;
+	unsigned long	sem_nsems;		/* no. of semaphores in array */
+	unsigned long	__unused3;
+	unsigned long	__unused4;
+};
+
+#endif /* _H8300_SEMBUF_H */
diff -Nru a/include/asm-h8300/setup.h b/include/asm-h8300/setup.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/setup.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1 @@
+/* Nothing do */
diff -Nru a/include/asm-h8300/sh_bios.h b/include/asm-h8300/sh_bios.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/sh_bios.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,29 @@
+/* eCos HAL interface header */
+
+#ifndef SH_BIOS_H
+#define SH_BIOS_H
+
+#define HAL_IF_VECTOR_TABLE 0xfffe20
+#define CALL_IF_SET_CONSOLE_COMM  13
+#define QUERY_CURRENT -1
+#define MANGLER       -3
+
+/* Checking for GDB stub active */
+/* suggestion Jonathan Larmour */
+static int sh_bios_in_gdb_mode(void)
+{
+	static int gdb_active = -1;
+	if (gdb_active == -1) {
+		int (*set_console_comm)(int);
+		set_console_comm = ((void **)HAL_IF_VECTOR_TABLE)[CALL_IF_SET_CONSOLE_COMM];
+		gdb_active = (set_console_comm(QUERY_CURRENT) == MANGLER);
+	}
+	return gdb_active;
+}
+
+static void sh_bios_gdb_detach(void)
+{
+
+}
+
+#endif
diff -Nru a/include/asm-h8300/shm.h b/include/asm-h8300/shm.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/shm.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,32 @@
+#ifndef _H8300_SHM_H
+#define _H8300_SHM_H
+
+#include <linux/config.h>
+
+/* format of page table entries that correspond to shared memory pages
+   currently out in swap space (see also mm/swap.c):
+   bits 0-1 (PAGE_PRESENT) is  = 0
+   bits 8..2 (SWP_TYPE) are = SHM_SWP_TYPE
+   bits 31..9 are used like this:
+   bits 15..9 (SHM_ID) the id of the shared memory segment
+   bits 30..16 (SHM_IDX) the index of the page within the shared memory segment
+                    (actually only bits 25..16 get used since SHMMAX is so low)
+   bit 31 (SHM_READ_ONLY) flag whether the page belongs to a read-only attach
+*/
+/* on the m68k both bits 0 and 1 must be zero */
+/* format on the sun3 is similar, but bits 30, 31 are set to zero and all
+   others are reduced by 2. --m */
+
+#ifndef CONFIG_SUN3
+#define SHM_ID_SHIFT	9
+#else
+#define SHM_ID_SHIFT	7
+#endif
+#define _SHM_ID_BITS	7
+#define SHM_ID_MASK	((1<<_SHM_ID_BITS)-1)
+
+#define SHM_IDX_SHIFT	(SHM_ID_SHIFT+_SHM_ID_BITS)
+#define _SHM_IDX_BITS	15
+#define SHM_IDX_MASK	((1<<_SHM_IDX_BITS)-1)
+
+#endif /* _H8300_SHM_H */
diff -Nru a/include/asm-h8300/shmbuf.h b/include/asm-h8300/shmbuf.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/shmbuf.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,42 @@
+#ifndef _H8300_SHMBUF_H
+#define _H8300_SHMBUF_H
+
+/* 
+ * The shmid64_ds structure for m68k architecture.
+ * Note extra padding because this structure is passed back and forth
+ * between kernel and user space.
+ *
+ * Pad space is left for:
+ * - 64-bit time_t to solve y2038 problem
+ * - 2 miscellaneous 32-bit values
+ */
+
+struct shmid64_ds {
+	struct ipc64_perm	shm_perm;	/* operation perms */
+	size_t			shm_segsz;	/* size of segment (bytes) */
+	__kernel_time_t		shm_atime;	/* last attach time */
+	unsigned long		__unused1;
+	__kernel_time_t		shm_dtime;	/* last detach time */
+	unsigned long		__unused2;
+	__kernel_time_t		shm_ctime;	/* last change time */
+	unsigned long		__unused3;
+	__kernel_pid_t		shm_cpid;	/* pid of creator */
+	__kernel_pid_t		shm_lpid;	/* pid of last operator */
+	unsigned long		shm_nattch;	/* no. of current attaches */
+	unsigned long		__unused4;
+	unsigned long		__unused5;
+};
+
+struct shminfo64 {
+	unsigned long	shmmax;
+	unsigned long	shmmin;
+	unsigned long	shmmni;
+	unsigned long	shmseg;
+	unsigned long	shmall;
+	unsigned long	__unused1;
+	unsigned long	__unused2;
+	unsigned long	__unused3;
+	unsigned long	__unused4;
+};
+
+#endif /* _H8300_SHMBUF_H */
diff -Nru a/include/asm-h8300/shmparam.h b/include/asm-h8300/shmparam.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/shmparam.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,6 @@
+#ifndef _H8300_SHMPARAM_H
+#define _H8300_SHMPARAM_H
+
+#define	SHMLBA PAGE_SIZE		 /* attach addr a multiple of this */
+
+#endif /* _H8300_SHMPARAM_H */
diff -Nru a/include/asm-h8300/sigcontext.h b/include/asm-h8300/sigcontext.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/sigcontext.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,15 @@
+#ifndef _ASM_H8300_SIGCONTEXT_H
+#define _ASM_H8300_SIGCONTEXT_H
+
+struct sigcontext {
+	unsigned long  sc_mask; 	/* old sigmask */
+	unsigned long  sc_usp;		/* old user stack pointer */
+	unsigned long  sc_er0;
+	unsigned long  sc_er1;
+	unsigned long  sc_er2;
+	unsigned long  sc_er3;
+	unsigned short sc_ccr;
+	unsigned long  sc_pc;
+};
+
+#endif
diff -Nru a/include/asm-h8300/siginfo.h b/include/asm-h8300/siginfo.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/siginfo.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,6 @@
+#ifndef _H8300_SIGINFO_H
+#define _H8300_SIGINFO_H
+
+#include <asm-generic/siginfo.h>
+
+#endif
diff -Nru a/include/asm-h8300/signal.h b/include/asm-h8300/signal.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/signal.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,183 @@
+#ifndef _H8300_SIGNAL_H
+#define _H8300_SIGNAL_H
+
+#include <linux/types.h>
+
+/* Avoid too many header ordering problems.  */
+struct siginfo;
+
+#ifdef __KERNEL__
+/* Most things should be clean enough to redefine this at will, if care
+   is taken to make libc match.  */
+
+#define _NSIG		64
+#define _NSIG_BPW	32
+#define _NSIG_WORDS	(_NSIG / _NSIG_BPW)
+
+typedef unsigned long old_sigset_t;		/* at least 32 bits */
+
+typedef struct {
+	unsigned long sig[_NSIG_WORDS];
+} sigset_t;
+
+#else
+/* Here we must cater to libcs that poke about in kernel headers.  */
+
+#define NSIG		32
+typedef unsigned long sigset_t;
+
+#endif /* __KERNEL__ */
+
+#define SIGHUP		 1
+#define SIGINT		 2
+#define SIGQUIT		 3
+#define SIGILL		 4
+#define SIGTRAP		 5
+#define SIGABRT		 6
+#define SIGIOT		 6
+#define SIGBUS		 7
+#define SIGFPE		 8
+#define SIGKILL		 9
+#define SIGUSR1		10
+#define SIGSEGV		11
+#define SIGUSR2		12
+#define SIGPIPE		13
+#define SIGALRM		14
+#define SIGTERM		15
+#define SIGSTKFLT	16
+#define SIGCHLD		17
+#define SIGCONT		18
+#define SIGSTOP		19
+#define SIGTSTP		20
+#define SIGTTIN		21
+#define SIGTTOU		22
+#define SIGURG		23
+#define SIGXCPU		24
+#define SIGXFSZ		25
+#define SIGVTALRM	26
+#define SIGPROF		27
+#define SIGWINCH	28
+#define SIGIO		29
+#define SIGPOLL		SIGIO
+/*
+#define SIGLOST		29
+*/
+#define SIGPWR		30
+#define SIGSYS		31
+#define	SIGUNUSED	31
+
+/* These should not be considered constants from userland.  */
+#define SIGRTMIN	32
+#define SIGRTMAX	(_NSIG-1)
+
+/*
+ * SA_FLAGS values:
+ *
+ * SA_ONSTACK indicates that a registered stack_t will be used.
+ * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the
+ * SA_RESTART flag to get restarting signals (which were the default long ago)
+ * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
+ * SA_RESETHAND clears the handler when the signal is delivered.
+ * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
+ * SA_NODEFER prevents the current signal from being masked in the handler.
+ *
+ * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
+ * Unix names RESETHAND and NODEFER respectively.
+ */
+#define SA_NOCLDSTOP	0x00000001
+#define SA_NOCLDWAIT	0x00000002 /* not supported yet */
+#define SA_SIGINFO	0x00000004
+#define SA_ONSTACK	0x08000000
+#define SA_RESTART	0x10000000
+#define SA_NODEFER	0x40000000
+#define SA_RESETHAND	0x80000000
+
+#define SA_NOMASK	SA_NODEFER
+#define SA_ONESHOT	SA_RESETHAND
+#define SA_INTERRUPT	0x20000000 /* dummy -- ignored */
+
+/* 
+ * sigaltstack controls
+ */
+#define SS_ONSTACK	1
+#define SS_DISABLE	2
+
+#define MINSIGSTKSZ	2048
+#define SIGSTKSZ	8192
+
+#ifdef __KERNEL__
+/*
+ * These values of sa_flags are used only by the kernel as part of the
+ * irq handling routines.
+ *
+ * SA_INTERRUPT is also used by the irq handling routines.
+ * SA_SHIRQ is for shared interrupt support on PCI and EISA.
+ */
+#define SA_PROBE		SA_ONESHOT
+#define SA_SAMPLE_RANDOM	SA_RESTART
+#define SA_SHIRQ		0x04000000
+#endif
+
+#define SIG_BLOCK          0	/* for blocking signals */
+#define SIG_UNBLOCK        1	/* for unblocking signals */
+#define SIG_SETMASK        2	/* for setting the signal mask */
+
+/* Type of a signal handler.  */
+typedef void (*__sighandler_t)(int);
+
+#define SIG_DFL	((__sighandler_t)0)	/* default signal handling */
+#define SIG_IGN	((__sighandler_t)1)	/* ignore signal */
+#define SIG_ERR	((__sighandler_t)-1)	/* error return from signal */
+
+#ifdef __KERNEL__
+struct old_sigaction {
+	__sighandler_t sa_handler;
+	old_sigset_t sa_mask;
+	unsigned long sa_flags;
+	void (*sa_restorer)(void);
+};
+
+struct sigaction {
+	__sighandler_t sa_handler;
+	unsigned long sa_flags;
+	void (*sa_restorer)(void);
+	sigset_t sa_mask;		/* mask last for extensibility */
+};
+
+struct k_sigaction {
+	struct sigaction sa;
+};
+#else
+/* Here we must cater to libcs that poke about in kernel headers.  */
+
+struct sigaction {
+	union {
+	  __sighandler_t _sa_handler;
+	  void (*_sa_sigaction)(int, struct siginfo *, void *);
+	} _u;
+	sigset_t sa_mask;
+	unsigned long sa_flags;
+	void (*sa_restorer)(void);
+};
+
+#define sa_handler	_u._sa_handler
+#define sa_sigaction	_u._sa_sigaction
+
+#endif /* __KERNEL__ */
+
+typedef struct sigaltstack {
+	void *ss_sp;
+	int ss_flags;
+	size_t ss_size;
+} stack_t;
+
+#ifdef __KERNEL__
+
+#include <asm/sigcontext.h>
+#undef __HAVE_ARCH_SIG_BITOPS
+
+#define ptrace_signal_deliver(regs, cookie) do { } while (0)
+
+#endif /* __KERNEL__ */
+
+#endif /* _H8300_SIGNAL_H */
diff -Nru a/include/asm-h8300/smp.h b/include/asm-h8300/smp.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/smp.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1 @@
+/* nothing required here yet */
diff -Nru a/include/asm-h8300/smplock.h b/include/asm-h8300/smplock.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/smplock.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,51 @@
+/*
+ * <asm/smplock.h>
+ *
+ * Default SMP lock implementation
+ */
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+
+extern spinlock_t kernel_flag;
+
+#define kernel_locked()		spin_is_locked(&kernel_flag)
+
+/*
+ * Release global kernel lock and global interrupt lock
+ */
+#define release_kernel_lock(task, cpu) \
+do { \
+	if (task->lock_depth >= 0) \
+		spin_unlock(&kernel_flag); \
+	release_irqlock(cpu); \
+	__sti(); \
+} while (0)
+
+/*
+ * Re-acquire the kernel lock
+ */
+#define reacquire_kernel_lock(task) \
+do { \
+	if (task->lock_depth >= 0) \
+		spin_lock(&kernel_flag); \
+} while (0)
+
+
+/*
+ * Getting the big kernel lock.
+ *
+ * This cannot happen asynchronously,
+ * so we only need to worry about other
+ * CPU's.
+ */
+extern __inline__ void lock_kernel(void)
+{
+	if (!++current->lock_depth)
+		spin_lock(&kernel_flag);
+}
+
+extern __inline__ void unlock_kernel(void)
+{
+	if (--current->lock_depth < 0)
+		spin_unlock(&kernel_flag);
+}
diff -Nru a/include/asm-h8300/socket.h b/include/asm-h8300/socket.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/socket.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,64 @@
+#ifndef _ASM_SOCKET_H
+#define _ASM_SOCKET_H
+
+#include <asm/sockios.h>
+
+/* For setsockoptions(2) */
+#define SOL_SOCKET	1
+
+#define SO_DEBUG	1
+#define SO_REUSEADDR	2
+#define SO_TYPE		3
+#define SO_ERROR	4
+#define SO_DONTROUTE	5
+#define SO_BROADCAST	6
+#define SO_SNDBUF	7
+#define SO_RCVBUF	8
+#define SO_KEEPALIVE	9
+#define SO_OOBINLINE	10
+#define SO_NO_CHECK	11
+#define SO_PRIORITY	12
+#define SO_LINGER	13
+#define SO_BSDCOMPAT	14
+/* To add :#define SO_REUSEPORT 15 */
+#define SO_PASSCRED	16
+#define SO_PEERCRED	17
+#define SO_RCVLOWAT	18
+#define SO_SNDLOWAT	19
+#define SO_RCVTIMEO	20
+#define SO_SNDTIMEO	21
+
+/* Security levels - as per NRL IPv6 - don't actually do anything */
+#define SO_SECURITY_AUTHENTICATION		22
+#define SO_SECURITY_ENCRYPTION_TRANSPORT	23
+#define SO_SECURITY_ENCRYPTION_NETWORK		24
+
+#define SO_BINDTODEVICE	25
+
+/* Socket filtering */
+#define SO_ATTACH_FILTER        26
+#define SO_DETACH_FILTER        27
+
+#define SO_PEERNAME             28
+#define SO_TIMESTAMP		29
+#define SCM_TIMESTAMP		SO_TIMESTAMP
+
+#define SO_ACCEPTCONN		30
+
+/* Nast libc5 fixup - bletch */
+#if defined(__KERNEL__)
+/* Socket types. */
+#define SOCK_STREAM	1		/* stream (connection) socket	*/
+#define SOCK_DGRAM	2		/* datagram (conn.less) socket	*/
+#define SOCK_RAW	3		/* raw socket			*/
+#define SOCK_RDM	4		/* reliably-delivered message	*/
+#define SOCK_SEQPACKET	5		/* sequential packet socket	*/
+#define SOCK_PACKET	10		/* linux specific way of	*/
+					/* getting packets at the dev	*/
+					/* level.  For writing rarp and	*/
+					/* other similar things on the	*/
+					/* user level.			*/
+#define	SOCK_MAX	(SOCK_PACKET+1)
+#endif
+
+#endif /* _ASM_SOCKET_H */
diff -Nru a/include/asm-h8300/sockios.h b/include/asm-h8300/sockios.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/sockios.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,12 @@
+#ifndef __ARCH_H8300_SOCKIOS__
+#define __ARCH_H8300_SOCKIOS__
+
+/* Socket-level I/O control calls. */
+#define FIOSETOWN 	0x8901
+#define SIOCSPGRP	0x8902
+#define FIOGETOWN	0x8903
+#define SIOCGPGRP	0x8904
+#define SIOCATMARK	0x8905
+#define SIOCGSTAMP	0x8906		/* Get stamp */
+
+#endif /* __ARCH_H8300_SOCKIOS__ */
diff -Nru a/include/asm-h8300/softirq.h b/include/asm-h8300/softirq.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/softirq.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,20 @@
+#ifndef __ASM_SOFTIRQ_H
+#define __ASM_SOFTIRQ_H
+
+#include <linux/preempt.h>
+#include <asm/hardirq.h>
+
+#define local_bh_disable() \
+		do { preempt_count() += SOFTIRQ_OFFSET; barrier(); } while (0)
+#define __local_bh_enable() \
+		do { barrier(); preempt_count() -= SOFTIRQ_OFFSET; } while (0)
+
+#define local_bh_enable()						\
+do {									\
+	__local_bh_enable();						\
+	if (unlikely(!in_interrupt() && softirq_pending(smp_processor_id()))) \
+		do_softirq();						\
+	preempt_check_resched();					\
+} while (0)
+
+#endif	/* __ASM_SOFTIRQ_H */
diff -Nru a/include/asm-h8300/spinlock.h b/include/asm-h8300/spinlock.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/spinlock.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,6 @@
+#ifndef __H8300_SPINLOCK_H
+#define __H8300_SPINLOCK_H
+
+#error "H8/300 doesn't do SMP yet"
+
+#endif
diff -Nru a/include/asm-h8300/stat.h b/include/asm-h8300/stat.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/stat.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,80 @@
+#ifndef _H8300_STAT_H
+#define _H8300_STAT_H
+
+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 long  st_size;
+	unsigned long  st_atime;
+	unsigned long  st_mtime;
+	unsigned long  st_ctime;
+};
+
+struct stat {
+	unsigned short st_dev;
+	unsigned short __pad1;
+	unsigned long st_ino;
+	unsigned short st_mode;
+	unsigned short st_nlink;
+	unsigned short st_uid;
+	unsigned short st_gid;
+	unsigned short st_rdev;
+	unsigned short __pad2;
+	unsigned long  st_size;
+	unsigned long  st_blksize;
+	unsigned long  st_blocks;
+	unsigned long  st_atime;
+	unsigned long  __unused1;
+	unsigned long  st_mtime;
+	unsigned long  __unused2;
+	unsigned long  st_ctime;
+	unsigned long  __unused3;
+	unsigned long  __unused4;
+	unsigned long  __unused5;
+};
+
+/* This matches struct stat64 in glibc2.1, hence the absolutely
+ * insane amounts of padding around dev_t's.
+ */
+struct stat64 {
+	unsigned char	__pad0[6];
+	unsigned short	st_dev;
+	unsigned char	__pad1[2];
+
+#define STAT64_HAS_BROKEN_ST_INO	1
+	unsigned long	__st_ino;
+
+	unsigned int	st_mode;
+	unsigned int	st_nlink;
+
+	unsigned long	st_uid;
+	unsigned long	st_gid;
+
+	unsigned char	__pad2[6];
+	unsigned short	st_rdev;
+	unsigned char	__pad3[2];
+
+	long long	st_size;
+	unsigned long	st_blksize;
+
+	unsigned long	__pad4;		/* future possible st_blocks high bits */
+	unsigned long	st_blocks;	/* Number 512-byte blocks allocated. */
+
+	unsigned long	st_atime;
+	unsigned long	st_atime_nsec;
+
+	unsigned long	st_mtime;
+	unsigned long	st_mtime_nsec;
+
+	unsigned long	st_ctime;
+	unsigned long	st_ctime_nsec;
+
+	unsigned long long	st_ino;
+};
+
+#endif /* _H8300_STAT_H */
diff -Nru a/include/asm-h8300/statfs.h b/include/asm-h8300/statfs.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/statfs.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,25 @@
+#ifndef _H8300_STATFS_H
+#define _H8300_STATFS_H
+
+#ifndef __KERNEL_STRICT_NAMES
+
+#include <linux/types.h>
+
+typedef __kernel_fsid_t	fsid_t;
+
+#endif
+
+struct statfs {
+	long f_type;
+	long f_bsize;
+	long f_blocks;
+	long f_bfree;
+	long f_bavail;
+	long f_files;
+	long f_ffree;
+	__kernel_fsid_t f_fsid;
+	long f_namelen;
+	long f_spare[6];
+};
+
+#endif /* _H8300_STATFS_H */
diff -Nru a/include/asm-h8300/string.h b/include/asm-h8300/string.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/string.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,44 @@
+#ifndef _H8300_STRING_H_
+#define _H8300_STRING_H_
+
+#ifdef __KERNEL__ /* only set these up for kernel code */
+
+#include <asm/setup.h>
+#include <asm/page.h>
+
+#define __HAVE_ARCH_MEMSET
+extern void * memset(void * s, int c, size_t count);
+
+#define __HAVE_ARCH_MEMCPY
+extern void * memcpy(void *d, const void *s, size_t count);
+
+#else /* KERNEL */
+
+/*
+ *	let user libraries deal with these,
+ *	IMHO the kernel has no place defining these functions for user apps
+ */
+
+#define __HAVE_ARCH_STRCPY 1
+#define __HAVE_ARCH_STRNCPY 1
+#define __HAVE_ARCH_STRCAT 1
+#define __HAVE_ARCH_STRNCAT 1
+#define __HAVE_ARCH_STRCMP 1
+#define __HAVE_ARCH_STRNCMP 1
+#define __HAVE_ARCH_STRNICMP 1
+#define __HAVE_ARCH_STRCHR 1
+#define __HAVE_ARCH_STRRCHR 1
+#define __HAVE_ARCH_STRSTR 1
+#define __HAVE_ARCH_STRLEN 1
+#define __HAVE_ARCH_STRNLEN 1
+#define __HAVE_ARCH_MEMSET 1
+#define __HAVE_ARCH_MEMCPY 1
+#define __HAVE_ARCH_MEMMOVE 1
+#define __HAVE_ARCH_MEMSCAN 1
+#define __HAVE_ARCH_MEMCMP 1
+#define __HAVE_ARCH_MEMCHR 1
+#define __HAVE_ARCH_STRTOK 1
+
+#endif /* KERNEL */
+
+#endif /* _M68K_STRING_H_ */
diff -Nru a/include/asm-h8300/system.h b/include/asm-h8300/system.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/system.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,156 @@
+#ifndef _H8300_SYSTEM_H
+#define _H8300_SYSTEM_H
+
+#include <linux/config.h> /* get configuration macros */
+#include <linux/kernel.h>
+#include <linux/linkage.h>
+
+#define prepare_to_switch()	do { } while(0)
+
+/*
+ * switch_to(n) should switch tasks to task ptr, first checking that
+ * ptr isn't the current task, in which case it does nothing.  This
+ * also clears the TS-flag if the task we switched to has used the
+ * math co-processor latest.
+ */
+/*
+ * switch_to() saves the extra registers, that are not saved
+ * automatically by SAVE_SWITCH_STACK in resume(), ie. d0-d5 and
+ * a0-a1. Some of these are used by schedule() and its predecessors
+ * and so we might get see unexpected behaviors when a task returns
+ * with unexpected register values.
+ *
+ * syscall stores these registers itself and none of them are used
+ * by syscall after the function in the syscall has been called.
+ *
+ * Beware that resume now expects *next to be in d1 and the offset of
+ * tss to be in a1. This saves a few instructions as we no longer have
+ * to push them onto the stack and read them back right after.
+ *
+ * 02/17/96 - Jes Sorensen (jds@kom.auc.dk)
+ *
+ * Changed 96/09/19 by Andreas Schwab
+ * pass prev in a0, next in a1, offset of tss in d1, and whether
+ * the mm structures are shared in d2 (to avoid atc flushing).
+ *
+ * H8/300 Porting 2002/09/04 Yoshinori Sato
+ */
+asmlinkage void resume(void);
+#define switch_to(prev,next,last) { \
+  void *_last;								        \
+  __asm__ __volatile__(								\
+  			"mov.l	%1, er0\n\t"					\
+			"mov.l	%2, er1\n\t"					\
+			"jsr @_resume"                                          \
+		       : "=r" (_last)						\
+		       : "r" (&(prev->thread)),				        \
+			 "r" (&(next->thread))				        \
+		       : "cc", "er0", "er1", "er2", "er3");	                \
+  (last) = _last; 								\
+}
+
+#if defined(__H8300H__)
+#define __sti() asm volatile ("andc #0x7f,ccr")
+#define __cli() asm volatile ("orc  #0x80,ccr")
+
+#define __save_flags(x) \
+       asm volatile ("sub.l er0,er0\n\tstc ccr,r0l\n\tmov.l er0,%0":"=r" (x) : : "er0")
+
+#define __restore_flags(x) \
+       asm volatile ("mov.l %0,er0\n\tldc r0l,ccr": :"r" (x) : "er0")
+#endif
+#if defined(__H8300S__)
+#define __sti() asm volatile ("andc #0xf8,exr")
+#define __cli() asm volatile ("orc  #0x07,exr")
+
+#define __save_flags(x) \
+       asm volatile ("sub.l er0,er0\n\tstc exr,r0l\n\tmov.l er0,%0":"=r" (x) : : "er0")
+
+#define __restore_flags(x) \
+       asm volatile ("mov.l %0,er0\n\tldc r0l,exr": :"r" (x) : "er0")
+#endif
+
+#define	irqs_disabled()			\
+({					\
+	unsigned long flags;		\
+	__save_flags(flags);	\
+	((flags & 0x80) == 0x80);	\
+})
+
+#define iret() __asm__ __volatile__ ("rte": : :"memory", "sp", "cc")
+
+/* For spinlocks etc */
+#define local_irq_disable()	asm volatile ("orc  #0x80,ccr")
+#define local_irq_enable()      asm volatile ("andc #0x7f,ccr")
+#define local_irq_save(x)	({ __save_flags(x); local_irq_disable(); })
+#define local_irq_restore(x)	__restore_flags(x)
+#define local_save_flags(x)     __save_flags(x)
+
+/*
+ * Force strict CPU ordering.
+ * Not really required on m68k...
+ */
+#define nop()  asm volatile ("nop"::)
+#define mb()   asm volatile (""   : : :"memory")
+#define rmb()  asm volatile (""   : : :"memory")
+#define wmb()  asm volatile (""   : : :"memory")
+#define set_rmb(var, value)    do { xchg(&var, value); } while (0)
+#define set_mb(var, value)     set_rmb(var, value)
+#define set_wmb(var, value)    do { var = value; wmb(); } while (0)
+
+#ifdef CONFIG_SMP
+#define smp_mb()	mb()
+#define smp_rmb()	rmb()
+#define smp_wmb()	wmb()
+#define smp_read_barrier_depends()	read_barrier_depends()
+#else
+#define smp_mb()	barrier()
+#define smp_rmb()	barrier()
+#define smp_wmb()	barrier()
+#define smp_read_barrier_depends()	do { } while(0)
+#endif
+
+#define xchg(ptr,x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
+#define tas(ptr) (xchg((ptr),1))
+
+struct __xchg_dummy { unsigned long a[100]; };
+#define __xg(x) ((volatile struct __xchg_dummy *)(x))
+
+static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
+{
+  unsigned long tmp, flags;
+
+  local_irq_save(flags);
+
+  switch (size) {
+  case 1:
+    __asm__ __volatile__
+    ("mov.b %2,%0\n\t"
+     "mov.b %1,%2"
+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "er0","memory");
+    break;
+  case 2:
+    __asm__ __volatile__
+    ("mov.w %2,%0\n\t"
+     "mov.w %1,%2"
+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
+    break;
+  case 4:
+    __asm__ __volatile__
+    ("mov.l %2,%0\n\t"
+     "mov.l %1,%2"
+    : "=&r" (tmp) : "r" (x), "m" (*__xg(ptr)) : "memory");
+    break;
+  default:
+    tmp = 0;	  
+  }
+  local_irq_restore(flags);
+  return tmp;
+}
+
+#define HARD_RESET_NOW() ({		\
+        local_irq_disable();		\
+        asm("jmp @@0");			\
+})
+
+#endif /* _H8300_SYSTEM_H */
diff -Nru a/include/asm-h8300/target_time.h b/include/asm-h8300/target_time.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/target_time.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,4 @@
+extern int platform_timer_setup(void (*timer_int)(int, void *, struct pt_regs *));
+extern void platform_timer_eoi(void);
+extern void platfrom_gettod(unsigned int *year, unsigned int *mon, unsigned int *day, 
+                            unsigned int *hour, unsigned int *min, unsigned int *sec);
diff -Nru a/include/asm-h8300/termbits.h b/include/asm-h8300/termbits.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/termbits.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,174 @@
+#ifndef __ARCH_H8300_TERMBITS_H__
+#define __ARCH_H8300_TERMBITS_H__
+
+#include <linux/posix_types.h>
+
+typedef unsigned char	cc_t;
+typedef unsigned int	speed_t;
+typedef unsigned int	tcflag_t;
+
+#define NCCS 19
+struct termios {
+	tcflag_t c_iflag;		/* input mode flags */
+	tcflag_t c_oflag;		/* output mode flags */
+	tcflag_t c_cflag;		/* control mode flags */
+	tcflag_t c_lflag;		/* local mode flags */
+	cc_t c_line;			/* line discipline */
+	cc_t c_cc[NCCS];		/* control characters */
+};
+
+/* c_cc characters */
+#define VINTR 0
+#define VQUIT 1
+#define VERASE 2
+#define VKILL 3
+#define VEOF 4
+#define VTIME 5
+#define VMIN 6
+#define VSWTC 7
+#define VSTART 8
+#define VSTOP 9
+#define VSUSP 10
+#define VEOL 11
+#define VREPRINT 12
+#define VDISCARD 13
+#define VWERASE 14
+#define VLNEXT 15
+#define VEOL2 16
+
+
+/* c_iflag bits */
+#define IGNBRK	0000001
+#define BRKINT	0000002
+#define IGNPAR	0000004
+#define PARMRK	0000010
+#define INPCK	0000020
+#define ISTRIP	0000040
+#define INLCR	0000100
+#define IGNCR	0000200
+#define ICRNL	0000400
+#define IUCLC	0001000
+#define IXON	0002000
+#define IXANY	0004000
+#define IXOFF	0010000
+#define IMAXBEL	0020000
+
+/* c_oflag bits */
+#define OPOST	0000001
+#define OLCUC	0000002
+#define ONLCR	0000004
+#define OCRNL	0000010
+#define ONOCR	0000020
+#define ONLRET	0000040
+#define OFILL	0000100
+#define OFDEL	0000200
+#define NLDLY	0000400
+#define   NL0	0000000
+#define   NL1	0000400
+#define CRDLY	0003000
+#define   CR0	0000000
+#define   CR1	0001000
+#define   CR2	0002000
+#define   CR3	0003000
+#define TABDLY	0014000
+#define   TAB0	0000000
+#define   TAB1	0004000
+#define   TAB2	0010000
+#define   TAB3	0014000
+#define   XTABS	0014000
+#define BSDLY	0020000
+#define   BS0	0000000
+#define   BS1	0020000
+#define VTDLY	0040000
+#define   VT0	0000000
+#define   VT1	0040000
+#define FFDLY	0100000
+#define   FF0	0000000
+#define   FF1	0100000
+
+/* c_cflag bit meaning */
+#define CBAUD	0010017
+#define  B0	0000000		/* hang up */
+#define  B50	0000001
+#define  B75	0000002
+#define  B110	0000003
+#define  B134	0000004
+#define  B150	0000005
+#define  B200	0000006
+#define  B300	0000007
+#define  B600	0000010
+#define  B1200	0000011
+#define  B1800	0000012
+#define  B2400	0000013
+#define  B4800	0000014
+#define  B9600	0000015
+#define  B19200	0000016
+#define  B38400	0000017
+#define EXTA B19200
+#define EXTB B38400
+#define CSIZE	0000060
+#define   CS5	0000000
+#define   CS6	0000020
+#define   CS7	0000040
+#define   CS8	0000060
+#define CSTOPB	0000100
+#define CREAD	0000200
+#define PARENB	0000400
+#define PARODD	0001000
+#define HUPCL	0002000
+#define CLOCAL	0004000
+#define CBAUDEX 0010000
+#define    B57600 0010001
+#define   B115200 0010002
+#define   B230400 0010003
+#define   B460800 0010004
+#define   B500000 0010005
+#define   B576000 0010006
+#define   B921600 0010007
+#define  B1000000 0010010
+#define  B1152000 0010011
+#define  B1500000 0010012
+#define  B2000000 0010013
+#define  B2500000 0010014
+#define  B3000000 0010015
+#define  B3500000 0010016
+#define  B4000000 0010017
+#define CIBAUD	  002003600000	/* input baud rate (not used) */
+#define CMSPAR	  010000000000		/* mark or space (stick) parity */
+#define CRTSCTS	  020000000000		/* flow control */
+
+/* c_lflag bits */
+#define ISIG	0000001
+#define ICANON	0000002
+#define XCASE	0000004
+#define ECHO	0000010
+#define ECHOE	0000020
+#define ECHOK	0000040
+#define ECHONL	0000100
+#define NOFLSH	0000200
+#define TOSTOP	0000400
+#define ECHOCTL	0001000
+#define ECHOPRT	0002000
+#define ECHOKE	0004000
+#define FLUSHO	0010000
+#define PENDIN	0040000
+#define IEXTEN	0100000
+
+
+/* tcflow() and TCXONC use these */
+#define	TCOOFF		0
+#define	TCOON		1
+#define	TCIOFF		2
+#define	TCION		3
+
+/* tcflush() and TCFLSH use these */
+#define	TCIFLUSH	0
+#define	TCOFLUSH	1
+#define	TCIOFLUSH	2
+
+/* tcsetattr uses these */
+#define	TCSANOW		0
+#define	TCSADRAIN	1
+#define	TCSAFLUSH	2
+
+#endif /* __ARCH_H8300_TERMBITS_H__ */
diff -Nru a/include/asm-h8300/termios.h b/include/asm-h8300/termios.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/termios.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,108 @@
+#ifndef _H8300_TERMIOS_H
+#define _H8300_TERMIOS_H
+
+#include <asm/termbits.h>
+#include <asm/ioctls.h>
+ 
+struct winsize {
+	unsigned short ws_row;
+	unsigned short ws_col;
+	unsigned short ws_xpixel;
+	unsigned short ws_ypixel;
+};
+
+#define NCC 8
+struct termio {
+	unsigned short c_iflag;		/* input mode flags */
+	unsigned short c_oflag;		/* output mode flags */
+	unsigned short c_cflag;		/* control mode flags */
+	unsigned short c_lflag;		/* local mode flags */
+	unsigned char c_line;		/* line discipline */
+	unsigned char c_cc[NCC];	/* control characters */
+};
+
+#ifdef __KERNEL__
+/*	intr=^C		quit=^|		erase=del	kill=^U
+	eof=^D		vtime=\0	vmin=\1		sxtc=\0
+	start=^Q	stop=^S		susp=^Z		eol=\0
+	reprint=^R	discard=^U	werase=^W	lnext=^V
+	eol2=\0
+*/
+#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
+#endif
+
+/* modem lines */
+#define TIOCM_LE	0x001
+#define TIOCM_DTR	0x002
+#define TIOCM_RTS	0x004
+#define TIOCM_ST	0x008
+#define TIOCM_SR	0x010
+#define TIOCM_CTS	0x020
+#define TIOCM_CAR	0x040
+#define TIOCM_RNG	0x080
+#define TIOCM_DSR	0x100
+#define TIOCM_CD	TIOCM_CAR
+#define TIOCM_RI	TIOCM_RNG
+#define TIOCM_OUT1	0x2000
+#define TIOCM_OUT2	0x4000
+#define TIOCM_LOOP	0x8000
+
+/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
+
+/* line disciplines */
+#define N_TTY		0
+#define N_SLIP		1
+#define N_MOUSE		2
+#define N_PPP		3
+#define N_STRIP		4
+#define N_AX25		5
+#define N_X25		6	/* X.25 async */
+#define N_6PACK		7
+#define N_MASC		8	/* Reserved for Mobitex module <kaz@cafe.net> */
+#define N_R3964		9	/* Reserved for Simatic R3964 module */
+#define N_PROFIBUS_FDL	10	/* Reserved for Profibus <Dave@mvhi.com> */
+#define N_IRDA		11	/* Linux IrDa - http://irda.sourceforge.net/ */
+#define N_SMSBLOCK	12	/* SMS block mode - for talking to GSM data cards about SMS messages */
+#define N_HDLC		13	/* synchronous HDLC */
+#define N_SYNC_PPP	14
+#define N_HCI		15  /* Bluetooth HCI UART */
+
+#ifdef __KERNEL__
+
+/*
+ * Translate a "termio" structure into a "termios". Ugh.
+ */
+#define user_termio_to_kernel_termios(termios, termio) \
+({ \
+	unsigned short tmp; \
+	get_user(tmp, &(termio)->c_iflag); \
+	(termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
+	get_user(tmp, &(termio)->c_oflag); \
+	(termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
+	get_user(tmp, &(termio)->c_cflag); \
+	(termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
+	get_user(tmp, &(termio)->c_lflag); \
+	(termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
+	get_user((termios)->c_line, &(termio)->c_line); \
+	copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
+})
+
+/*
+ * Translate a "termios" structure into a "termio". Ugh.
+ */
+#define kernel_termios_to_user_termio(termio, termios) \
+({ \
+	put_user((termios)->c_iflag, &(termio)->c_iflag); \
+	put_user((termios)->c_oflag, &(termio)->c_oflag); \
+	put_user((termios)->c_cflag, &(termio)->c_cflag); \
+	put_user((termios)->c_lflag, &(termio)->c_lflag); \
+	put_user((termios)->c_line,  &(termio)->c_line); \
+	copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
+})
+
+#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
+#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
+
+#endif	/* __KERNEL__ */
+
+#endif /* _H8300_TERMIOS_H */
diff -Nru a/include/asm-h8300/thread_info.h b/include/asm-h8300/thread_info.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/thread_info.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,106 @@
+/* thread_info.h: h8300 low-level thread information
+ * adapted from the i386 and PPC versions by Yoshinori Sato <ysato@users.sourceforge.jp>
+ *
+ * Copyright (C) 2002  David Howells (dhowells@redhat.com)
+ * - Incorporating suggestions made by Linus Torvalds and Dave Miller
+ */
+
+#ifndef _ASM_THREAD_INFO_H
+#define _ASM_THREAD_INFO_H
+
+#include <asm/page.h>
+
+#ifdef __KERNEL__
+
+#ifndef __ASSEMBLY__
+
+/*
+ * low level task data.
+ * If you change this, change the TI_* offsets below to match.
+ */
+struct thread_info {
+	struct task_struct *task;		/* main task structure */
+	struct exec_domain *exec_domain;	/* execution domain */
+	unsigned long	   flags;		/* low level flags */
+	int		   cpu;			/* cpu we're on */
+	int		   preempt_count;	/* 0 => preemptable, <0 => BUG*/
+	struct restart_block restart_block;
+};
+
+/*
+ * macros/functions for gaining access to the thread information structure
+ */
+#define INIT_THREAD_INFO(tsk)			\
+{						\
+	task:		&tsk,			\
+	exec_domain:	&default_exec_domain,	\
+	flags:		0,			\
+	cpu:		0,			\
+	.restart_block	= {			\
+		.fn = do_no_restart_syscall,	\
+	},					\
+}
+
+#define init_thread_info	(init_thread_union.thread_info)
+#define init_stack		(init_thread_union.stack)
+
+
+/*
+ * Size of kernel stack for each process. This must be a power of 2...
+ */
+#define THREAD_SIZE		8192	/* 2 pages */
+
+
+/* how to get the thread information struct from C */
+static inline struct thread_info *current_thread_info(void)
+{
+	struct thread_info *ti;
+	__asm__(
+		"mov.l	sp, %0 \n\t"
+		"and.l	%1, %0"
+		: "=&r"(ti)
+		: "r" (~(THREAD_SIZE-1))
+		);
+	return ti;
+}
+
+/* thread information allocation */
+#define alloc_thread_info() ((struct thread_info *) \
+				__get_free_pages(GFP_KERNEL, 1))
+#define free_thread_info(ti)	free_pages((unsigned long) (ti), 1)
+#define get_thread_info(ti)	get_task_struct((ti)->task)
+#define put_thread_info(ti)	put_task_struct((ti)->task)
+#endif /* __ASSEMBLY__ */
+
+/*
+ * Offsets in thread_info structure, used in assembly code
+ */
+#define TI_TASK		0
+#define TI_EXECDOMAIN	4
+#define TI_FLAGS	8
+#define TI_CPU		12
+
+#define	PREEMPT_ACTIVE	0x4000000
+
+/*
+ * thread information flag bit numbers
+ */
+#define TIF_SYSCALL_TRACE	0	/* syscall trace active */
+#define TIF_NOTIFY_RESUME	1	/* resumption notification requested */
+#define TIF_SIGPENDING		2	/* signal pending */
+#define TIF_NEED_RESCHED	3	/* rescheduling necessary */
+#define TIF_POLLING_NRFLAG	4	/* true if poll_idle() is polling
+					   TIF_NEED_RESCHED */
+
+/* as above, but as bit values */
+#define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
+#define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
+#define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)
+#define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
+#define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
+
+#define _TIF_WORK_MASK		0x0000FFFE	/* work to do on interrupt/exception return */
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_THREAD_INFO_H */
diff -Nru a/include/asm-h8300/timex.h b/include/asm-h8300/timex.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/timex.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,27 @@
+/*
+ * linux/include/asm-h8300/timex.h
+ *
+ * H8/300 architecture timex specifications
+ */
+#ifndef _ASM_H8300_TIMEX_H
+#define _ASM_H8300_TIMEX_H
+
+/* Such a description is OK ? */
+#define TIMEX_DEPEND_HEADER(target) <asm/target/timer_rate.h> 
+#include TIMEX_DEPEND_HEADER(TARGET)
+
+#define CLOCK_TICK_RATE H8300_TIMER_FREQ
+#define CLOCK_TICK_FACTOR	20	/* Factor of both 1000000 and CLOCK_TICK_RATE */
+#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \
+	(1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \
+		<< (SHIFT_SCALE-SHIFT_HZ)) / HZ)
+
+typedef unsigned long cycles_t;
+extern short h8300_timer_count;
+
+static inline cycles_t get_cycles(void)
+{
+	return 0;
+}
+
+#endif
diff -Nru a/include/asm-h8300/tlb.h b/include/asm-h8300/tlb.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/tlb.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1 @@
+#include <asm-generic/tlb.h>
diff -Nru a/include/asm-h8300/tlbflush.h b/include/asm-h8300/tlbflush.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/tlbflush.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,61 @@
+#ifndef _H8300_TLBFLUSH_H
+#define _H8300_TLBFLUSH_H
+
+/*
+ * Copyright (C) 2000 Lineo, David McCullough <davidm@uclinux.org>
+ * Copyright (C) 2000-2002, Greg Ungerer <gerg@snapgear.com>
+ */
+
+#include <asm/setup.h>
+
+/*
+ * flush all user-space atc entries.
+ */
+static inline void __flush_tlb(void)
+{
+	BUG();
+}
+
+static inline void __flush_tlb_one(unsigned long addr)
+{
+	BUG();
+}
+
+#define flush_tlb() __flush_tlb()
+
+/*
+ * flush all atc entries (both kernel and user-space entries).
+ */
+static inline void flush_tlb_all(void)
+{
+	BUG();
+}
+
+static inline void flush_tlb_mm(struct mm_struct *mm)
+{
+	BUG();
+}
+
+static inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
+{
+	BUG();
+}
+
+static inline void flush_tlb_range(struct mm_struct *mm,
+				   unsigned long start, unsigned long end)
+{
+	BUG();
+}
+
+extern inline void flush_tlb_kernel_page(unsigned long addr)
+{
+	BUG();
+}
+
+extern inline void flush_tlb_pgtables(struct mm_struct *mm,
+				      unsigned long start, unsigned long end)
+{
+	BUG();
+}
+
+#endif /* _H8300_TLBFLUSH_H */
diff -Nru a/include/asm-h8300/topology.h b/include/asm-h8300/topology.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/topology.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,6 @@
+#ifndef _ASM_H8300_TOPOLOGY_H
+#define _ASM_H8300_TOPOLOGY_H
+
+#include <asm-generic/topology.h>
+
+#endif /* _ASM_H8300_TOPOLOGY_H */
diff -Nru a/include/asm-h8300/traps.h b/include/asm-h8300/traps.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/traps.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,207 @@
+/*
+ *  linux/include/asm/traps.h
+ *
+ *  Copyright (C) 1993        Hamish Macdonald
+ *
+ * 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.
+ */
+
+#ifndef _H8300_TRAPS_H
+#define _H8300_TRAPS_H
+
+#if 0
+#ifndef __ASSEMBLY__
+
+typedef void (*e_vector)(void);
+
+extern e_vector vectors[];
+
+#endif
+
+#define VEC_BUSERR  (2)
+#define VEC_ADDRERR (3)
+#define VEC_ILLEGAL (4)
+#define VEC_ZERODIV (5)
+#define VEC_CHK     (6)
+#define VEC_TRAP    (7)
+#define VEC_PRIV    (8)
+#define VEC_TRACE   (9)
+#define VEC_LINE10  (10)
+#define VEC_LINE11  (11)
+#define VEC_RESV1   (12)
+#define VEC_COPROC  (13)
+#define VEC_FORMAT  (14)
+#define VEC_UNINT   (15)
+#define VEC_SPUR    (24)
+#define VEC_INT1    (25)
+#define VEC_INT2    (26)
+#define VEC_INT3    (27)
+#define VEC_INT4    (28)
+#define VEC_INT5    (29)
+#define VEC_INT6    (30)
+#define VEC_INT7    (31)
+#define VEC_SYS     (32)
+#define VEC_TRAP1   (33)
+#define VEC_TRAP2   (34)
+#define VEC_TRAP3   (35)
+#define VEC_TRAP4   (36)
+#define VEC_TRAP5   (37)
+#define VEC_TRAP6   (38)
+#define VEC_TRAP7   (39)
+#define VEC_TRAP8   (40)
+#define VEC_TRAP9   (41)
+#define VEC_TRAP10  (42)
+#define VEC_TRAP11  (43)
+#define VEC_TRAP12  (44)
+#define VEC_TRAP13  (45)
+#define VEC_TRAP14  (46)
+#define VEC_TRAP15  (47)
+#define VEC_FPBRUC  (48)
+#define VEC_FPIR    (49)
+#define VEC_FPDIVZ  (50)
+#define VEC_FPUNDER (51)
+#define VEC_FPOE    (52)
+#define VEC_FPOVER  (53)
+#define VEC_FPNAN   (54)
+#define VEC_FPUNSUP (55)
+#define	VEC_UNIMPEA (60)
+#define	VEC_UNIMPII (61)
+#define VEC_USER    (64)
+
+#define VECOFF(vec) ((vec)<<2)
+
+#ifndef __ASSEMBLY__
+
+/* Status register bits */
+#define PS_T  (0x8000)
+#define PS_S  (0x2000)
+#define PS_M  (0x1000)
+#define PS_C  (0x0001)
+
+/* bits for 68020/68030 special status word */
+
+#define FC    (0x8000)
+#define FB    (0x4000)
+#define RC    (0x2000)
+#define RB    (0x1000)
+#define DF    (0x0100)
+#define RM    (0x0080)
+#define RW    (0x0040)
+#define SZ    (0x0030)
+#define DFC   (0x0007)
+
+/* bits for 68030 MMU status register (mmusr,psr) */
+
+#define MMU_B	     (0x8000)    /* bus error */
+#define MMU_L	     (0x4000)    /* limit violation */
+#define MMU_S	     (0x2000)    /* supervisor violation */
+#define MMU_WP	     (0x0800)    /* write-protected */
+#define MMU_I	     (0x0400)    /* invalid descriptor */
+#define MMU_M	     (0x0200)    /* ATC entry modified */
+#define MMU_T	     (0x0040)    /* transparent translation */
+#define MMU_NUM      (0x0007)    /* number of levels traversed */
+
+
+/* bits for 68040 special status word */
+#define CP_040	(0x8000)
+#define CU_040	(0x4000)
+#define CT_040	(0x2000)
+#define CM_040	(0x1000)
+#define MA_040	(0x0800)
+#define ATC_040 (0x0400)
+#define LK_040	(0x0200)
+#define RW_040	(0x0100)
+#define SIZ_040 (0x0060)
+#define TT_040	(0x0018)
+#define TM_040	(0x0007)
+
+/* bits for 68040 write back status word */
+#define WBV_040   (0x80)
+#define WBSIZ_040 (0x60)
+#define WBBYT_040 (0x20)
+#define WBWRD_040 (0x40)
+#define WBLNG_040 (0x00)
+#define WBTT_040  (0x18)
+#define WBTM_040  (0x07)
+
+/* bus access size codes */
+#define BA_SIZE_BYTE    (0x20)
+#define BA_SIZE_WORD    (0x40)
+#define BA_SIZE_LONG    (0x00)
+#define BA_SIZE_LINE    (0x60)
+
+/* bus access transfer type codes */
+#define BA_TT_MOVE16    (0x08)
+
+/* structure for stack frames */
+
+struct frame {
+    struct pt_regs ptregs;
+    union {
+	    struct {
+		    unsigned long  iaddr;    /* instruction address */
+	    } fmt2;
+	    struct {
+		    unsigned long  effaddr;  /* effective address */
+	    } fmt3;
+	    struct {
+		    unsigned long  effaddr;  /* effective address */
+		    unsigned long  pc;	     /* pc of faulted instr */
+	    } fmt4;
+	    struct {
+		    unsigned long  effaddr;  /* effective address */
+		    unsigned short ssw;      /* special status word */
+		    unsigned short wb3s;     /* write back 3 status */
+		    unsigned short wb2s;     /* write back 2 status */
+		    unsigned short wb1s;     /* write back 1 status */
+		    unsigned long  faddr;    /* fault address */
+		    unsigned long  wb3a;     /* write back 3 address */
+		    unsigned long  wb3d;     /* write back 3 data */
+		    unsigned long  wb2a;     /* write back 2 address */
+		    unsigned long  wb2d;     /* write back 2 data */
+		    unsigned long  wb1a;     /* write back 1 address */
+		    unsigned long  wb1dpd0;  /* write back 1 data/push data 0*/
+		    unsigned long  pd1;      /* push data 1*/
+		    unsigned long  pd2;      /* push data 2*/
+		    unsigned long  pd3;      /* push data 3*/
+	    } fmt7;
+	    struct {
+		    unsigned long  iaddr;    /* instruction address */
+		    unsigned short int1[4];  /* internal registers */
+	    } fmt9;
+	    struct {
+		    unsigned short int1;
+		    unsigned short ssw;      /* special status word */
+		    unsigned short isc;      /* instruction stage c */
+		    unsigned short isb;      /* instruction stage b */
+		    unsigned long  daddr;    /* data cycle fault address */
+		    unsigned short int2[2];
+		    unsigned long  dobuf;    /* data cycle output buffer */
+		    unsigned short int3[2];
+	    } fmta;
+	    struct {
+		    unsigned short int1;
+		    unsigned short ssw;     /* special status word */
+		    unsigned short isc;     /* instruction stage c */
+		    unsigned short isb;     /* instruction stage b */
+		    unsigned long  daddr;   /* data cycle fault address */
+		    unsigned short int2[2];
+		    unsigned long  dobuf;   /* data cycle output buffer */
+		    unsigned short int3[4];
+		    unsigned long  baddr;   /* stage B address */
+		    unsigned short int4[2];
+		    unsigned long  dibuf;   /* data cycle input buffer */
+		    unsigned short int5[3];
+		    unsigned	   ver : 4; /* stack frame version # */
+		    unsigned	   int6:12;
+		    unsigned short int7[18];
+	    } fmtb;
+    } un;
+};
+
+#endif /* __ASSEMBLY__ */
+#endif
+
+#endif /* _H8300_TRAPS_H */
diff -Nru a/include/asm-h8300/types.h b/include/asm-h8300/types.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/types.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,58 @@
+#ifndef _H8300_TYPES_H
+#define _H8300_TYPES_H
+
+/*
+ * This file is never included by application software unless
+ * explicitly requested (e.g., via linux/types.h) in which case the
+ * application is Linux specific so (user-) name space pollution is
+ * not a major issue.  However, for interoperability, libraries still
+ * need to be careful to avoid a name clashes.
+ */
+
+typedef unsigned short umode_t;
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+#ifdef __KERNEL__
+
+typedef signed char s8;
+typedef unsigned char u8;
+
+typedef signed short s16;
+typedef unsigned short u16;
+
+typedef signed int s32;
+typedef unsigned int u32;
+
+typedef signed long long s64;
+typedef unsigned long long u64;
+
+#define BITS_PER_LONG 32
+
+/* Dma addresses are 32-bits wide.  */
+
+typedef u32 dma_addr_t;
+
+#endif /* __KERNEL__ */
+
+#endif /* _H8300_TYPES_H */
diff -Nru a/include/asm-h8300/uaccess.h b/include/asm-h8300/uaccess.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/uaccess.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,165 @@
+#ifndef __H8300_UACCESS_H
+#define __H8300_UACCESS_H
+
+/*
+ * User space memory access functions
+ */
+#include <linux/sched.h>
+#include <linux/mm.h>
+#include <asm/segment.h>
+
+#define VERIFY_READ	0
+#define VERIFY_WRITE	1
+
+/* We let the MMU do all checking */
+extern inline int access_ok(int type, const void * addr, unsigned long size)
+{
+#define	RANGE_CHECK_OK(addr, size, lower, upper) \
+	(((addr) >= (lower)) && (((addr) + (size)) < (upper)))
+
+	extern unsigned long _ramend;
+	return(RANGE_CHECK_OK((unsigned long) addr, size, 0L, (unsigned long)&_ramend));
+}
+
+extern inline int verify_area(int type, const void * addr, unsigned long size)
+{
+	return access_ok(type,addr,size)?0:-EFAULT;
+}
+
+/*
+ * The exception table consists of pairs of addresses: the first is the
+ * address of an instruction that is allowed to fault, and the second is
+ * the address at which the program should continue.  No registers are
+ * modified, so it is entirely up to the continuation code to figure out
+ * what to do.
+ *
+ * All the routines below use bits of fixup code that are out of line
+ * with the main instruction path.  This means when everything is well,
+ * we don't even have to jump over them.  Further, they do not intrude
+ * on our cache or tlb entries.
+ */
+
+struct exception_table_entry
+{
+	unsigned long insn, fixup;
+};
+
+/* Returns 0 if exception not found and fixup otherwise.  */
+extern unsigned long search_exception_table(unsigned long);
+
+
+/*
+ * These are the main single-value transfer routines.  They automatically
+ * use the right size if we just have the right pointer type.
+ */
+
+#define put_user(x, ptr)				\
+({							\
+    int __pu_err = 0;					\
+    typeof(*(ptr)) __pu_val = (x);			\
+    switch (sizeof (*(ptr))) {				\
+    case 1:						\
+    case 2:						\
+    case 4:						\
+	*(ptr) = (__pu_val);   	        		\
+	break;						\
+    case 8:						\
+	memcpy(ptr, &__pu_val, sizeof (*(ptr)));        \
+	break;						\
+    default:						\
+	__pu_err = __put_user_bad();			\
+	break;						\
+    }							\
+    __pu_err;						\
+})
+#define __put_user(x, ptr) put_user(x, ptr)
+
+extern int __put_user_bad(void);
+
+/*
+ * Tell gcc we read from memory instead of writing: this is because
+ * we do not write to any memory gcc knows about, so there are no
+ * aliasing issues.
+ */
+
+#define __ptr(x) ((unsigned long *)(x))
+
+/*
+ * Tell gcc we read from memory instead of writing: this is because
+ * we do not write to any memory gcc knows about, so there are no
+ * aliasing issues.
+ */
+
+#define get_user(x, ptr)					\
+({								\
+    int __gu_err = 0;						\
+    typeof(*(ptr)) __gu_val = 0;				\
+    switch (sizeof(*(ptr))) {					\
+    case 1:							\
+    case 2:							\
+    case 4:							\
+	__gu_val = *(ptr);	                		\
+	break;							\
+    case 8:							\
+	memcpy(&__gu_val, ptr, sizeof (*(ptr))); 		\
+	break;							\
+    default:							\
+	__gu_val = 0;						\
+	__gu_err = __get_user_bad();				\
+	break;							\
+    }								\
+    (x) = __gu_val;						\
+    __gu_err;							\
+})
+#define __get_user(x, ptr) get_user(x, ptr)
+
+extern int __get_user_bad(void);
+
+#define copy_from_user(to, from, n)		(memcpy(to, from, n), 0)
+#define copy_to_user(to, from, n)		(memcpy(to, from, n), 0)
+
+#define __copy_from_user(to, from, n) copy_from_user(to, from, n)
+#define __copy_to_user(to, from, n) copy_to_user(to, from, n)
+
+#define copy_to_user_ret(to,from,n,retval) ({ if (copy_to_user(to,from,n)) return retval; })
+
+#define copy_from_user_ret(to,from,n,retval) ({ if (copy_from_user(to,from,n)) return retval; })
+
+/*
+ * Copy a null terminated string from userspace.
+ */
+
+static inline long
+strncpy_from_user(char *dst, const char *src, long count)
+{
+	char *tmp;
+	strncpy(dst, src, count);
+	for (tmp = dst; *tmp && count > 0; tmp++, count--)
+		;
+	return(tmp - dst); /* DAVIDM should we count a NUL ?  check getname */
+}
+
+/*
+ * Return the size of a string (including the ending 0)
+ *
+ * Return 0 on exception, a value greater than N if too long
+ */
+static inline long strnlen_user(const char *src, long n)
+{
+	return(strlen(src) + 1); /* DAVIDM make safer */
+}
+
+#define strlen_user(str) strnlen_user(str, 32767)
+
+/*
+ * Zero Userspace
+ */
+
+static inline unsigned long
+clear_user(void *to, unsigned long n)
+{
+	memset(to, 0, n);
+    return(0);
+}
+
+#endif /* _H8300_UACCESS_H */
diff -Nru a/include/asm-h8300/ucontext.h b/include/asm-h8300/ucontext.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/ucontext.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,23 @@
+#ifndef _H8300_UCONTEXT_H
+#define _H8300_UCONTEXT_H
+
+typedef int greg_t;
+#define NGREG 10
+typedef greg_t gregset_t[NGREG];
+
+struct mcontext {
+	int version;
+	gregset_t gregs;
+};
+
+#define MCONTEXT_VERSION 1
+
+struct ucontext {
+	unsigned long	  uc_flags;
+	struct ucontext  *uc_link;
+	stack_t		  uc_stack;
+	struct mcontext	  uc_mcontext;
+	sigset_t	  uc_sigmask;	/* mask last for extensibility */
+};
+
+#endif
diff -Nru a/include/asm-h8300/unaligned.h b/include/asm-h8300/unaligned.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/unaligned.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,16 @@
+#ifndef __H8300_UNALIGNED_H
+#define __H8300_UNALIGNED_H
+
+#include <linux/config.h>
+
+/* Use memmove here, so gcc does not insert a __builtin_memcpy. */
+
+#define get_unaligned(ptr) \
+  ({ __typeof__(*(ptr)) __tmp; memmove(&__tmp, (ptr), sizeof(*(ptr))); __tmp; })
+
+#define put_unaligned(val, ptr)				\
+  ({ __typeof__(*(ptr)) __tmp = (val);			\
+     memmove((ptr), &__tmp, sizeof(*(ptr)));		\
+     (void)0; })
+
+#endif
diff -Nru a/include/asm-h8300/unistd.h b/include/asm-h8300/unistd.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/unistd.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,461 @@
+#ifndef _ASM_H8300_UNISTD_H_
+#define _ASM_H8300_UNISTD_H_
+
+/*
+ * This file contains the system call numbers.
+ */
+
+#define __NR_exit		  1
+#define __NR_fork		  2
+#define __NR_read		  3
+#define __NR_write		  4
+#define __NR_open		  5
+#define __NR_close		  6
+#define __NR_waitpid		  7
+#define __NR_creat		  8
+#define __NR_link		  9
+#define __NR_unlink		 10
+#define __NR_execve		 11
+#define __NR_chdir		 12
+#define __NR_time		 13
+#define __NR_mknod		 14
+#define __NR_chmod		 15
+#define __NR_chown		 16
+#define __NR_break		 17
+#define __NR_oldstat		 18
+#define __NR_lseek		 19
+#define __NR_getpid		 20
+#define __NR_mount		 21
+#define __NR_umount		 22
+#define __NR_setuid		 23
+#define __NR_getuid		 24
+#define __NR_stime		 25
+#define __NR_ptrace		 26
+#define __NR_alarm		 27
+#define __NR_oldfstat		 28
+#define __NR_pause		 29
+#define __NR_utime		 30
+#define __NR_stty		 31
+#define __NR_gtty		 32
+#define __NR_access		 33
+#define __NR_nice		 34
+#define __NR_ftime		 35
+#define __NR_sync		 36
+#define __NR_kill		 37
+#define __NR_rename		 38
+#define __NR_mkdir		 39
+#define __NR_rmdir		 40
+#define __NR_dup		 41
+#define __NR_pipe		 42
+#define __NR_times		 43
+#define __NR_prof		 44
+#define __NR_brk		 45
+#define __NR_setgid		 46
+#define __NR_getgid		 47
+#define __NR_signal		 48
+#define __NR_geteuid		 49
+#define __NR_getegid		 50
+#define __NR_acct		 51
+#define __NR_umount2		 52
+#define __NR_lock		 53
+#define __NR_ioctl		 54
+#define __NR_fcntl		 55
+#define __NR_mpx		 56
+#define __NR_setpgid		 57
+#define __NR_ulimit		 58
+#define __NR_oldolduname	 59
+#define __NR_umask		 60
+#define __NR_chroot		 61
+#define __NR_ustat		 62
+#define __NR_dup2		 63
+#define __NR_getppid		 64
+#define __NR_getpgrp		 65
+#define __NR_setsid		 66
+#define __NR_sigaction		 67
+#define __NR_sgetmask		 68
+#define __NR_ssetmask		 69
+#define __NR_setreuid		 70
+#define __NR_setregid		 71
+#define __NR_sigsuspend		 72
+#define __NR_sigpending		 73
+#define __NR_sethostname	 74
+#define __NR_setrlimit		 75
+#define __NR_getrlimit		 76
+#define __NR_getrusage		 77
+#define __NR_gettimeofday	 78
+#define __NR_settimeofday	 79
+#define __NR_getgroups		 80
+#define __NR_setgroups		 81
+#define __NR_select		 82
+#define __NR_symlink		 83
+#define __NR_oldlstat		 84
+#define __NR_readlink		 85
+#define __NR_uselib		 86
+#define __NR_swapon		 87
+#define __NR_reboot		 88
+#define __NR_readdir		 89
+#define __NR_mmap		 90
+#define __NR_munmap		 91
+#define __NR_truncate		 92
+#define __NR_ftruncate		 93
+#define __NR_fchmod		 94
+#define __NR_fchown		 95
+#define __NR_getpriority	 96
+#define __NR_setpriority	 97
+#define __NR_profil		 98
+#define __NR_statfs		 99
+#define __NR_fstatfs		100
+#define __NR_ioperm		101
+#define __NR_socketcall		102
+#define __NR_syslog		103
+#define __NR_setitimer		104
+#define __NR_getitimer		105
+#define __NR_stat		106
+#define __NR_lstat		107
+#define __NR_fstat		108
+#define __NR_olduname		109
+#define __NR_iopl		/* 110 */ not supported
+#define __NR_vhangup		111
+#define __NR_idle		/* 112 */ Obsolete
+#define __NR_vm86		/* 113 */ not supported
+#define __NR_wait4		114
+#define __NR_swapoff		115
+#define __NR_sysinfo		116
+#define __NR_ipc		117
+#define __NR_fsync		118
+#define __NR_sigreturn		119
+#define __NR_clone		120
+#define __NR_setdomainname	121
+#define __NR_uname		122
+#define __NR_cacheflush		123
+#define __NR_adjtimex		124
+#define __NR_mprotect		125
+#define __NR_sigprocmask	126
+#define __NR_create_module	127
+#define __NR_init_module	128
+#define __NR_delete_module	129
+#define __NR_get_kernel_syms	130
+#define __NR_quotactl		131
+#define __NR_getpgid		132
+#define __NR_fchdir		133
+#define __NR_bdflush		134
+#define __NR_sysfs		135
+#define __NR_personality	136
+#define __NR_afs_syscall	137 /* Syscall for Andrew File System */
+#define __NR_setfsuid		138
+#define __NR_setfsgid		139
+#define __NR__llseek		140
+#define __NR_getdents		141
+#define __NR__newselect		142
+#define __NR_flock		143
+#define __NR_msync		144
+#define __NR_readv		145
+#define __NR_writev		146
+#define __NR_getsid		147
+#define __NR_fdatasync		148
+#define __NR__sysctl		149
+#define __NR_mlock		150
+#define __NR_munlock		151
+#define __NR_mlockall		152
+#define __NR_munlockall		153
+#define __NR_sched_setparam		154
+#define __NR_sched_getparam		155
+#define __NR_sched_setscheduler		156
+#define __NR_sched_getscheduler		157
+#define __NR_sched_yield		158
+#define __NR_sched_get_priority_max	159
+#define __NR_sched_get_priority_min	160
+#define __NR_sched_rr_get_interval	161
+#define __NR_nanosleep		162
+#define __NR_mremap		163
+#define __NR_setresuid		164
+#define __NR_getresuid		165
+#define __NR_getpagesize	166
+#define __NR_query_module	167
+#define __NR_poll		168
+#define __NR_nfsservctl		169
+#define __NR_setresgid		170
+#define __NR_getresgid		171
+#define __NR_prctl		172
+#define __NR_rt_sigreturn	173
+#define __NR_rt_sigaction	174
+#define __NR_rt_sigprocmask	175
+#define __NR_rt_sigpending	176
+#define __NR_rt_sigtimedwait	177
+#define __NR_rt_sigqueueinfo	178
+#define __NR_rt_sigsuspend	179
+#define __NR_pread64		180
+#define __NR_pwrite64		181
+#define __NR_lchown		182
+#define __NR_getcwd		183
+#define __NR_capget		184
+#define __NR_capset		185
+#define __NR_sigaltstack	186
+#define __NR_sendfile		187
+#define __NR_getpmsg		188	/* some people actually want streams */
+#define __NR_putpmsg		189	/* some people actually want streams */
+#define __NR_vfork		190
+#define __NR_ugetrlimit		191
+#define __NR_mmap2		192
+#define __NR_truncate64		193
+#define __NR_ftruncate64	194
+#define __NR_stat64		195
+#define __NR_lstat64		196
+#define __NR_fstat64		197
+#define __NR_chown32		198
+#define __NR_getuid32		199
+#define __NR_getgid32		200
+#define __NR_geteuid32		201
+#define __NR_getegid32		202
+#define __NR_setreuid32		203
+#define __NR_setregid32		204
+#define __NR_getgroups32	205
+#define __NR_setgroups32	206
+#define __NR_fchown32		207
+#define __NR_setresuid32	208
+#define __NR_getresuid32	209
+#define __NR_setresgid32	210
+#define __NR_getresgid32	211
+#define __NR_lchown32		212
+#define __NR_setuid32		213
+#define __NR_setgid32		214
+#define __NR_setfsuid32		215
+#define __NR_setfsgid32		216
+#define __NR_pivot_root		217
+#define __NR_getdents64		220
+#define __NR_fcntl64		221
+#define __NR_security		223
+#define __NR_gettid		224
+#define __NR_readahead		225
+#define __NR_setxattr		226
+#define __NR_lsetxattr		227
+#define __NR_fsetxattr		228
+#define __NR_getxattr		229
+#define __NR_lgetxattr		230
+#define __NR_fgetxattr		231
+#define __NR_listxattr		232
+#define __NR_llistxattr		233
+#define __NR_flistxattr		234
+#define __NR_removexattr	235
+#define __NR_lremovexattr	236
+#define __NR_fremovexattr	237
+#define __NR_tkill		238
+#define __NR_sendfile64		239
+#define __NR_futex		240
+#define __NR_sched_setaffinity	241
+#define __NR_sched_getaffinity	242
+#define __NR_set_thread_area	243
+#define __NR_get_thread_area	244
+#define __NR_io_setup		245
+#define __NR_io_destroy		246
+#define __NR_io_getevents	247
+#define __NR_io_submit		248
+#define __NR_io_cancel		249
+#define __NR_alloc_hugepages	250
+#define __NR_free_hugepages	251
+#define __NR_exit_group		252
+#define __NR_lookup_dcookie	253
+#define __NR_sys_epoll_create	254
+#define __NR_sys_epoll_ctl	255
+#define __NR_sys_epoll_wait	256
+#define __NR_remap_file_pages	257
+#define __NR_set_tid_address	258
+#define __NR_timer_create	259
+#define __NR_timer_settime	(__NR_timer_create+1)
+#define __NR_timer_gettime	(__NR_timer_create+2)
+#define __NR_timer_getoverrun	(__NR_timer_create+3)
+#define __NR_timer_delete	(__NR_timer_create+4)
+#define __NR_clock_settime	(__NR_timer_create+5)
+#define __NR_clock_gettime	(__NR_timer_create+6)
+#define __NR_clock_getres	(__NR_timer_create+7)
+#define __NR_clock_nanosleep	(__NR_timer_create+8)
+
+#define NR_syscalls 268
+
+
+/* user-visible error numbers are in the range -1 - -122: see
+   <asm-m68k/errno.h> */
+
+#define __syscall_return(type, res) \
+do { \
+	if ((unsigned long)(res) >= (unsigned long)(-125)) { \
+	/* avoid using res which is declared to be in register d0; \
+	   errno might expand to a function call and clobber it.  */ \
+		int __err = -(res); \
+		errno = __err; \
+		res = -1; \
+	} \
+	return (type) (res); \
+} while (0)
+
+#define _syscall0(type, name)							\
+type name(void)									\
+{										\
+  register long __res __asm__("er0");						\
+  __asm__ __volatile__ ("mov.l	%1,er0\n\t"					\
+  			"trapa	#0\n\t"						\
+			: "=r" (__res)						\
+			: "ir" (__NR_##name)					\
+			: "cc");						\
+  if ((unsigned long)(__res) >= (unsigned long)(-125)) {			\
+    errno = -__res;								\
+    __res = -1;									\
+  }										\
+  return (type)__res;								\
+}
+
+#define _syscall1(type, name, atype, a)						\
+type name(atype a)								\
+{										\
+  register long __res __asm__("er0");						\
+  __asm__ __volatile__ ("mov.l	%2, er1\n\t"					\
+  			"mov.l	%1, er0\n\t"					\
+  			"trapa	#0\n\t"						\
+			: "=r" (__res)						\
+			: "ir" (__NR_##name),					\
+			  "g" ((long)a)						\
+			: "cc", "er1");					\
+  if ((unsigned long)(__res) >= (unsigned long)(-125)) {			\
+    errno = -__res;								\
+    __res = -1;									\
+  }										\
+  return (type)__res;								\
+}
+
+#define _syscall2(type, name, atype, a, btype, b)				\
+type name(atype a, btype b)							\
+{										\
+  register long __res __asm__("er0");						\
+  __asm__ __volatile__ ("mov.l	%3, er2\n\t"					\
+  			"mov.l	%2, er1\n\t"					\
+			"mov.l	%1, er0\n\t"					\
+  			"trapa	#0\n\t"						\
+			: "=r" (__res)						\
+			: "ir" (__NR_##name),					\
+			  "g" ((long)a),					\
+			  "g" ((long)b)						\
+			: "cc", "er1", "er2"); 				\
+  if ((unsigned long)(__res) >= (unsigned long)(-125)) {			\
+    errno = -__res;								\
+    __res = -1;									\
+  }										\
+  return (type)__res;								\
+}
+
+#define _syscall3(type, name, atype, a, btype, b, ctype, c)			\
+type name(atype a, btype b, ctype c)						\
+{										\
+  register long __res __asm__("er0");						\
+  __asm__ __volatile__ ("mov.l	%4, er3\n\t"					\
+			"mov.l	%3, er2\n\t"					\
+  			"mov.l	%2, er1\n\t"					\
+			"mov.l	%1, er0\n\t"					\
+  			"trapa	#0\n\t"						\
+			: "=r" (__res)						\
+			: "ir" (__NR_##name),					\
+			  "g" ((long)a),					\
+			  "g" ((long)b),					\
+			  "g" ((long)c)						\
+			: "cc", "er1", "er2", "er3");  			\
+  if ((unsigned long)(__res) >= (unsigned long)(-125)) {			\
+    errno = -__res;								\
+    __res = -1;									\
+  }										\
+  return (type)__res;								\
+}
+
+#define _syscall4(type, name, atype, a, btype, b, ctype, c, dtype, d)		\
+type name(atype a, btype b, ctype c, dtype d)					\
+{										\
+  register long __res __asm__("er0");						\
+  __asm__ __volatile__ ("mov.l	%5, er4\n\t"					\
+			"mov.l	%4, er3\n\t"					\
+			"mov.l	%3, er2\n\t"					\
+  			"mov.l	%2, er1\n\t"					\
+			"mov.l	%1, er0\n\t"					\
+  			"trapa	#0\n\t"						\
+			: "=r" (__res)						\
+			: "ir" (__NR_##name),					\
+			  "g" ((long)a),					\
+			  "g" ((long)b),					\
+			  "g" ((long)c),					\
+			  "g" ((long)d)						\
+			: "cc", "er1", "er2", "er3", "er4");			\
+  if ((unsigned long)(__res) >= (unsigned long)(-125)) {			\
+    errno = -__res;								\
+    __res = -1;									\
+  }										\
+  return (type)__res;								\
+}
+
+#define _syscall5(type, name, atype, a, btype, b, ctype, c, dtype, d, etype, e)	\
+type name(atype a, btype b, ctype c, dtype d, etype e)				\
+{										\
+  register long __res __asm__("er0");						\
+  __asm__ __volatile__ ("mov.l	%6, er5\n\t"					\
+			"mov.l	%5, er4\n\t"					\
+			"mov.l	%4, er3\n\t"					\
+			"mov.l	%3, er2\n\t"					\
+  			"mov.l	%2, er1\n\t"					\
+			"mov.l	%1, er0\n\t"					\
+  			"trapa	#0\n\t"						\
+			: "=r" (__res)						\
+			: "ir" (__NR_##name),					\
+			  "g" ((long)a),					\
+			  "g" ((long)b),					\
+			  "g" ((long)c),					\
+			  "g" ((long)d),					\
+			  "g" ((long)e)						\
+			: "cc", "er1", "er2", "er3", "er4");			\
+  if ((unsigned long)(__res) >= (unsigned long)(-125)) {		       	\
+    errno = -__res;								\
+    __res = -1;									\
+  }										\
+  return (type)__res;								\
+}
+		
+
+#ifdef __KERNEL_SYSCALLS__
+
+/*
+ * we need this inline - forking from kernel space will result
+ * in NO COPY ON WRITE (!!!), until an execve is executed. This
+ * is no problem, but for the stack. This is handled by not letting
+ * main() use the stack at all after fork(). Thus, no function
+ * calls - which means inline code for fork too, as otherwise we
+ * would use the stack upon exit from 'fork()'.
+ *
+ * Actually only pause and fork are needed inline, so that there
+ * won't be any messing with the stack from main(), but we define
+ * some others too.
+ */
+#define __NR__exit __NR_exit
+static inline _syscall0(int,pause)
+static inline _syscall0(int,sync)
+static inline _syscall0(pid_t,setsid)
+static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count)
+static inline _syscall3(int,read,int,fd,char *,buf,off_t,count)
+static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count)
+static inline _syscall1(int,dup,int,fd)
+static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp)
+static inline _syscall3(int,open,const char *,file,int,flag,int,mode)
+static inline _syscall1(int,close,int,fd)
+static inline _syscall1(int,_exit,int,exitcode)
+static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options)
+static inline _syscall1(int,delete_module,const char *,name)
+
+static inline pid_t wait(int * wait_stat)
+{
+	return waitpid(-1,wait_stat,0);
+}
+
+#endif
+
+/*
+ * "Conditional" syscalls
+ */
+#define cond_syscall(name)						\
+  asm (".weak\t_" #name "\n"				\
+       ".set\t_" #name ",_sys_ni_syscall");
+
+#endif /* _ASM_H8300_UNISTD_H_ */
diff -Nru a/include/asm-h8300/user.h b/include/asm-h8300/user.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/user.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,76 @@
+#ifndef _H8300_USER_H
+#define _H8300_USER_H
+
+#include <asm/page.h>
+
+/* Core file format: The core file is written in such a way that gdb
+   can understand it and provide useful information to the user (under
+   linux we use the 'trad-core' bfd).  There are quite a number of
+   obstacles to being able to view the contents of the floating point
+   registers, and until these are solved you will not be able to view the
+   contents of them.  Actually, you can read in the core file and look at
+   the contents of the user struct to find out what the floating point
+   registers contain.
+   The actual file contents are as follows:
+   UPAGE: 1 page consisting of a user struct that tells gdb what is present
+   in the file.  Directly after this is a copy of the task_struct, which
+   is currently not used by gdb, but it may come in useful at some point.
+   All of the registers are stored as part of the upage.  The upage should
+   always be only one page.
+   DATA: The data area is stored.  We use current->end_text to
+   current->brk to pick up all of the user variables, plus any memory
+   that may have been malloced.  No attempt is made to determine if a page
+   is demand-zero or if a page is totally unused, we just cover the entire
+   range.  All of the addresses are rounded in such a way that an integral
+   number of pages is written.
+   STACK: We need the stack information in order to get a meaningful
+   backtrace.  We need to write the data from (esp) to
+   current->start_stack, so we round each of these off in order to be able
+   to write an integer number of pages.
+   The minimum core file size is 3 pages, or 12288 bytes.
+*/
+
+/* This is the old layout of "struct pt_regs" as of Linux 1.x, and
+   is still the layout used by user (the new pt_regs doesn't have
+   all registers). */
+struct user_regs_struct {
+	long er1,er2,er3,er4,er5,er6;
+	long er0;
+	long usp;
+	long orig_er0;
+	short ccr;
+	long pc;
+};
+
+	
+/* When the kernel dumps core, it starts by dumping the user struct -
+   this will be used by gdb to figure out where the data and stack segments
+   are within the file, and what virtual addresses to use. */
+struct user{
+/* We start with the registers, to mimic the way that "memory" is returned
+   from the ptrace(3,...) function.  */
+  struct user_regs_struct regs;	/* Where the registers are actually stored */
+/* ptrace does not yet supply these.  Someday.... */
+/* The rest of this junk is to help gdb figure out what goes where */
+  unsigned long int u_tsize;	/* Text segment size (pages). */
+  unsigned long int u_dsize;	/* Data segment size (pages). */
+  unsigned long int u_ssize;	/* Stack segment size (pages). */
+  unsigned long start_code;     /* Starting virtual address of text. */
+  unsigned long start_stack;	/* Starting virtual address of stack area.
+				   This is actually the bottom of the stack,
+				   the top of the stack is always found in the
+				   esp register.  */
+  long int signal;     		/* Signal that caused the core dump. */
+  int reserved;			/* No longer used */
+  struct user_regs_struct *u_ar0;
+				/* Used by gdb to help find the values for */
+				/* the registers. */
+  unsigned long magic;		/* To uniquely identify a core file */
+  char u_comm[32];		/* User command that was responsible */
+};
+#define NBPG PAGE_SIZE
+#define UPAGES 1
+#define HOST_TEXT_START_ADDR (u.start_code)
+#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
+
+#endif
diff -Nru a/include/asm-h8300/virtconvert.h b/include/asm-h8300/virtconvert.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-h8300/virtconvert.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,23 @@
+#ifndef __H8300_VIRT_CONVERT__
+#define __H8300_VIRT_CONVERT__
+
+/*
+ * Macros used for converting between virtual and physical mappings.
+ */
+
+#ifdef __KERNEL__
+
+#include <linux/config.h>
+#include <asm/setup.h>
+#include <asm/page.h>
+
+#define mm_ptov(vaddr)		((void *) (vaddr))
+#define mm_vtop(vaddr)		((unsigned long) (vaddr))
+#define phys_to_virt(vaddr)	((void *) (vaddr))
+#define virt_to_phys(vaddr)	((unsigned long) (vaddr))
+
+#define virt_to_bus virt_to_phys
+#define bus_to_virt phys_to_virt
+
+#endif
+#endif
diff -Nru a/include/asm-i386/bitops.h b/include/asm-i386/bitops.h
--- a/include/asm-i386/bitops.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-i386/bitops.h	Sat Apr 19 19:51:49 2003
@@ -479,8 +479,12 @@
 
 #define ext2_set_bit(nr,addr) \
 	__test_and_set_bit((nr),(unsigned long*)addr)
+#define ext2_set_bit_atomic(lock,nr,addr) \
+        test_and_set_bit((nr),(unsigned long*)addr)
 #define ext2_clear_bit(nr, addr) \
 	__test_and_clear_bit((nr),(unsigned long*)addr)
+#define ext2_clear_bit_atomic(lock,nr, addr) \
+	        test_and_clear_bit((nr),(unsigned long*)addr)
 #define ext2_test_bit(nr, addr)      test_bit((nr),(unsigned long*)addr)
 #define ext2_find_first_zero_bit(addr, size) \
 	find_first_zero_bit((unsigned long*)addr, size)
diff -Nru a/include/asm-i386/cacheflush.h b/include/asm-i386/cacheflush.h
--- a/include/asm-i386/cacheflush.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-i386/cacheflush.h	Sat Apr 19 19:51:48 2003
@@ -9,7 +9,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_page(page)			do { } while (0)
 #define flush_icache_range(start, end)		do { } while (0)
 #define flush_icache_page(vma,pg)		do { } while (0)
diff -Nru a/include/asm-i386/elf.h b/include/asm-i386/elf.h
--- a/include/asm-i386/elf.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-i386/elf.h	Sat Apr 19 19:51:49 2003
@@ -100,7 +100,8 @@
  * Architecture-neutral AT_ values in 0-17, leave some room
  * for more of them, start the x86-specific ones at 32.
  */
-#define AT_SYSINFO	32
+#define AT_SYSINFO		32
+#define AT_SYSINFO_EH_FRAME	33
 
 #ifdef __KERNEL__
 #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
@@ -118,9 +119,15 @@
 #define ELF_CORE_SYNC dump_smp_unlazy_fpu
 #endif
 
-#define ARCH_DLINFO					\
-do {							\
-		NEW_AUX_ENT(AT_SYSINFO, 0xffffe000);	\
+/* Offset from the beginning of the page where the .eh_frame information
+   for the code in the vsyscall page starts.  */
+#define EH_FRAME_OFFSET 96
+
+#define ARCH_DLINFO						\
+do {								\
+		NEW_AUX_ENT(AT_SYSINFO, 0xffffe000);		\
+		NEW_AUX_ENT(AT_SYSINFO_EH_FRAME,		\
+			    0xffffe000 + EH_FRAME_OFFSET);	\
 } while (0)
 
 #endif
diff -Nru a/include/asm-i386/i387.h b/include/asm-i386/i387.h
--- a/include/asm-i386/i387.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-i386/i387.h	Sat Apr 19 19:51:49 2003
@@ -81,8 +81,8 @@
 /*
  * Signal frame handlers...
  */
-extern int save_i387( struct _fpstate *buf );
-extern int restore_i387( struct _fpstate *buf );
+extern int save_i387( struct _fpstate __user *buf );
+extern int restore_i387( struct _fpstate __user *buf );
 
 /*
  * ptrace request handers...
diff -Nru a/include/asm-i386/i8259.h b/include/asm-i386/i8259.h
--- a/include/asm-i386/i8259.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-i386/i8259.h	Sat Apr 19 19:51:29 2003
@@ -3,9 +3,9 @@
 
 extern unsigned int cached_irq_mask;
 
-#define __byte(x,y) 	(((unsigned char *) &(y))[x])
-#define cached_21	(__byte(0, cached_irq_mask))
-#define cached_A1	(__byte(1, cached_irq_mask))
+#define __byte(x,y) 		(((unsigned char *) &(y))[x])
+#define cached_master_mask	(__byte(0, cached_irq_mask))
+#define cached_slave_mask	(__byte(1, cached_irq_mask))
 
 extern spinlock_t i8259A_lock;
 
diff -Nru a/include/asm-i386/mach-default/apm.h b/include/asm-i386/mach-default/apm.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-default/apm.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,75 @@
+/*
+ *  include/asm-i386/mach-default/apm.h
+ *
+ *  Machine specific APM BIOS functions for generic.
+ *  Split out from apm.c by Osamu Tomita <tomita@cinet.co.jp>
+ */
+
+#ifndef _ASM_APM_H
+#define _ASM_APM_H
+
+#ifdef APM_ZERO_SEGS
+#	define APM_DO_ZERO_SEGS \
+		"pushl %%ds\n\t" \
+		"pushl %%es\n\t" \
+		"xorl %%edx, %%edx\n\t" \
+		"mov %%dx, %%ds\n\t" \
+		"mov %%dx, %%es\n\t" \
+		"mov %%dx, %%fs\n\t" \
+		"mov %%dx, %%gs\n\t"
+#	define APM_DO_POP_SEGS \
+		"popl %%es\n\t" \
+		"popl %%ds\n\t"
+#else
+#	define APM_DO_ZERO_SEGS
+#	define APM_DO_POP_SEGS
+#endif
+
+static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in,
+					u32 *eax, u32 *ebx, u32 *ecx,
+					u32 *edx, u32 *esi)
+{
+	/*
+	 * N.B. We do NOT need a cld after the BIOS call
+	 * because we always save and restore the flags.
+	 */
+	__asm__ __volatile__(APM_DO_ZERO_SEGS
+		"pushl %%edi\n\t"
+		"pushl %%ebp\n\t"
+		"lcall *%%cs:apm_bios_entry\n\t"
+		"setc %%al\n\t"
+		"popl %%ebp\n\t"
+		"popl %%edi\n\t"
+		APM_DO_POP_SEGS
+		: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx),
+		  "=S" (*esi)
+		: "a" (func), "b" (ebx_in), "c" (ecx_in)
+		: "memory", "cc");
+}
+
+static inline u8 apm_bios_call_simple_asm(u32 func, u32 ebx_in,
+						u32 ecx_in, u32 *eax)
+{
+	int	cx, dx, si;
+	u8	error;
+
+	/*
+	 * N.B. We do NOT need a cld after the BIOS call
+	 * because we always save and restore the flags.
+	 */
+	__asm__ __volatile__(APM_DO_ZERO_SEGS
+		"pushl %%edi\n\t"
+		"pushl %%ebp\n\t"
+		"lcall *%%cs:apm_bios_entry\n\t"
+		"setc %%bl\n\t"
+		"popl %%ebp\n\t"
+		"popl %%edi\n\t"
+		APM_DO_POP_SEGS
+		: "=a" (*eax), "=b" (error), "=c" (cx), "=d" (dx),
+		  "=S" (si)
+		: "a" (func), "b" (ebx_in), "c" (ecx_in)
+		: "memory", "cc");
+	return error;
+}
+
+#endif /* _ASM_APM_H */
diff -Nru a/include/asm-i386/mach-default/bios_ebda.h b/include/asm-i386/mach-default/bios_ebda.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-default/bios_ebda.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,15 @@
+#ifndef _MACH_BIOS_EBDA_H
+#define _MACH_BIOS_EBDA_H
+
+/*
+ * there is a real-mode segmented pointer pointing to the
+ * 4K EBDA area at 0x40E.
+ */
+static inline unsigned int get_bios_ebda(void)
+{
+	unsigned int address = *(unsigned short *)phys_to_virt(0x40E);
+	address <<= 4;
+	return address;	/* 0 means none */
+}
+
+#endif /* _MACH_BIOS_EBDA_H */
diff -Nru a/include/asm-i386/mach-default/io_ports.h b/include/asm-i386/mach-default/io_ports.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-default/io_ports.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,30 @@
+/*
+ *  arch/i386/mach-generic/io_ports.h
+ *
+ *  Machine specific IO port address definition for generic.
+ *  Written by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_IO_PORTS_H
+#define _MACH_IO_PORTS_H
+
+/* i8253A PIT registers */
+#define PIT_MODE		0x43
+#define PIT_CH0			0x40
+#define PIT_CH2			0x42
+
+/* i8259A PIC registers */
+#define PIC_MASTER_CMD		0x20
+#define PIC_MASTER_IMR		0x21
+#define PIC_MASTER_ISR		PIC_MASTER_CMD
+#define PIC_MASTER_POLL		PIC_MASTER_ISR
+#define PIC_MASTER_OCW3		PIC_MASTER_ISR
+#define PIC_SLAVE_CMD		0xa0
+#define PIC_SLAVE_IMR		0xa1
+
+/* i8259A PIC related value */
+#define PIC_CASCADE_IR		2
+#define MASTER_ICW4_DEFAULT	0x01
+#define SLAVE_ICW4_DEFAULT	0x01
+#define PIC_ICW4_AEOI		2
+
+#endif /* !_MACH_IO_PORTS_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	Sat Apr 19 19:51:29 2003
+++ b/include/asm-i386/mach-default/irq_vectors.h	Sat Apr 19 19:51:29 2003
@@ -82,4 +82,11 @@
 #define NR_IRQS 16
 #endif
 
+#define FPU_IRQ			13
+
+#define	FIRST_VM86_IRQ		3
+#define LAST_VM86_IRQ		15
+#define invalid_vm86_irq(irq)	((irq) < 3 || (irq) > 15)
+
+
 #endif /* _ASM_IRQ_VECTORS_H */
diff -Nru a/include/asm-i386/mach-default/mach_mpparse.h b/include/asm-i386/mach-default/mach_mpparse.h
--- a/include/asm-i386/mach-default/mach_mpparse.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-i386/mach-default/mach_mpparse.h	Sat Apr 19 19:51:50 2003
@@ -4,7 +4,7 @@
 static inline void mpc_oem_bus_info(struct mpc_config_bus *m, char *name, 
 				struct mpc_config_translation *translation)
 {
-	Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
+//	Dprintk("Bus #%d is %s\n", m->mpc_busid, name);
 }
 
 static inline void mpc_oem_pci_bus(struct mpc_config_bus *m, 
diff -Nru a/include/asm-i386/mach-default/mach_resources.h b/include/asm-i386/mach-default/mach_resources.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-default/mach_resources.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,110 @@
+/*
+ *  include/asm-i386/mach-default/mach_resources.h
+ *
+ *  Machine specific resource allocation for generic.
+ *  Split out from setup.c by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_RESOURCES_H
+#define _MACH_RESOURCES_H
+
+struct resource standard_io_resources[] = {
+	{ "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
+	{ "pic1", 0x20, 0x3f, IORESOURCE_BUSY },
+	{ "timer", 0x40, 0x5f, IORESOURCE_BUSY },
+	{ "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
+	{ "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
+	{ "pic2", 0xa0, 0xbf, IORESOURCE_BUSY },
+	{ "dma2", 0xc0, 0xdf, IORESOURCE_BUSY },
+	{ "fpu", 0xf0, 0xff, IORESOURCE_BUSY }
+};
+#ifdef CONFIG_MELAN
+standard_io_resources[1] = { "pic1", 0x20, 0x21, IORESOURCE_BUSY };
+standard_io_resources[5] = { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY };
+#endif
+
+#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
+
+static struct resource vram_resource = { "Video RAM area", 0xa0000, 0xbffff, IORESOURCE_BUSY };
+
+/* System ROM resources */
+#define MAXROMS 6
+static struct resource rom_resources[MAXROMS] = {
+	{ "System ROM", 0xF0000, 0xFFFFF, IORESOURCE_BUSY },
+	{ "Video ROM", 0xc0000, 0xc7fff, IORESOURCE_BUSY }
+};
+
+#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
+
+static inline void probe_video_rom(int roms)
+{
+	unsigned long base;
+	unsigned char *romstart;
+
+
+	/* Video ROM is standard at C000:0000 - C7FF:0000, check signature */
+	for (base = 0xC0000; base < 0xE0000; base += 2048) {
+		romstart = isa_bus_to_virt(base);
+		if (!romsignature(romstart))
+			continue;
+		request_resource(&iomem_resource, rom_resources + roms);
+		roms++;
+		break;
+	}
+}
+
+static inline void probe_extension_roms(int roms)
+{
+	unsigned long base;
+	unsigned char *romstart;
+
+	/* Extension roms at C800:0000 - DFFF:0000 */
+	for (base = 0xC8000; base < 0xE0000; base += 2048) {
+		unsigned long length;
+
+		romstart = isa_bus_to_virt(base);
+		if (!romsignature(romstart))
+			continue;
+		length = romstart[2] * 512;
+		if (length) {
+			unsigned int i;
+			unsigned char chksum;
+
+			chksum = 0;
+			for (i = 0; i < length; i++)
+				chksum += romstart[i];
+
+			/* Good checksum? */
+			if (!chksum) {
+				rom_resources[roms].start = base;
+				rom_resources[roms].end = base + length - 1;
+				rom_resources[roms].name = "Extension ROM";
+				rom_resources[roms].flags = IORESOURCE_BUSY;
+
+				request_resource(&iomem_resource, rom_resources + roms);
+				roms++;
+				if (roms >= MAXROMS)
+					return;
+			}
+		}
+	}
+
+	/* Final check for motherboard extension rom at E000:0000 */
+	base = 0xE0000;
+	romstart = isa_bus_to_virt(base);
+
+	if (romsignature(romstart)) {
+		rom_resources[roms].start = base;
+		rom_resources[roms].end = base + 65535;
+		rom_resources[roms].name = "Extension ROM";
+		rom_resources[roms].flags = IORESOURCE_BUSY;
+
+		request_resource(&iomem_resource, rom_resources + roms);
+	}
+}
+
+static inline void request_graphics_resource(void)
+{
+	request_resource(&iomem_resource, &vram_resource);
+}
+
+#endif /* !_MACH_RESOURCES_H */
diff -Nru a/include/asm-i386/mach-default/mach_time.h b/include/asm-i386/mach-default/mach_time.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-default/mach_time.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,122 @@
+/*
+ *  include/asm-i386/mach-default/mach_time.h
+ *
+ *  Machine specific set RTC function for generic.
+ *  Split out from time.c by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_TIME_H
+#define _MACH_TIME_H
+
+#include <linux/mc146818rtc.h>
+
+/* for check timing call set_rtc_mmss() 500ms     */
+/* used in arch/i386/time.c::do_timer_interrupt() */
+#define USEC_AFTER	500000
+#define USEC_BEFORE	500000
+
+/*
+ * In order to set the CMOS clock precisely, set_rtc_mmss has to be
+ * called 500 ms after the second nowtime has started, because when
+ * nowtime is written into the registers of the CMOS clock, it will
+ * jump to the next second precisely 500 ms later. Check the Motorola
+ * MC146818A or Dallas DS12887 data sheet for details.
+ *
+ * BUG: This routine does not handle hour overflow properly; it just
+ *      sets the minutes. Usually you'll only notice that after reboot!
+ */
+static inline int mach_set_rtc_mmss(unsigned long nowtime)
+{
+	int retval = 0;
+	int real_seconds, real_minutes, cmos_minutes;
+	unsigned char save_control, save_freq_select;
+
+	save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
+	CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
+
+	save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */
+	CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
+
+	cmos_minutes = CMOS_READ(RTC_MINUTES);
+	if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
+		BCD_TO_BIN(cmos_minutes);
+
+	/*
+	 * since we're only adjusting minutes and seconds,
+	 * don't interfere with hour overflow. This avoids
+	 * messing with unknown time zones but requires your
+	 * RTC not to be off by more than 15 minutes
+	 */
+	real_seconds = nowtime % 60;
+	real_minutes = nowtime / 60;
+	if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
+		real_minutes += 30;		/* correct for half hour time zone */
+	real_minutes %= 60;
+
+	if (abs(real_minutes - cmos_minutes) < 30) {
+		if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
+			BIN_TO_BCD(real_seconds);
+			BIN_TO_BCD(real_minutes);
+		}
+		CMOS_WRITE(real_seconds,RTC_SECONDS);
+		CMOS_WRITE(real_minutes,RTC_MINUTES);
+	} else {
+		printk(KERN_WARNING
+		       "set_rtc_mmss: can't update from %d to %d\n",
+		       cmos_minutes, real_minutes);
+		retval = -1;
+	}
+
+	/* The following flags have to be released exactly in this order,
+	 * otherwise the DS12887 (popular MC146818A clone with integrated
+	 * battery and quartz) will not reset the oscillator and will not
+	 * update precisely 500 ms later. You won't find this mentioned in
+	 * the Dallas Semiconductor data sheets, but who believes data
+	 * sheets anyway ...                           -- Markus Kuhn
+	 */
+	CMOS_WRITE(save_control, RTC_CONTROL);
+	CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
+
+	return retval;
+}
+
+static inline unsigned long mach_get_cmos_time(void)
+{
+	unsigned int year, mon, day, hour, min, sec;
+	int i;
+
+	/* The Linux interpretation of the CMOS clock register contents:
+	 * When the Update-In-Progress (UIP) flag goes from 1 to 0, the
+	 * RTC registers show the second which has precisely just started.
+	 * Let's hope other operating systems interpret the RTC the same way.
+	 */
+	/* read RTC exactly on falling edge of update flag */
+	for (i = 0 ; i < 1000000 ; i++)	/* may take up to 1 second... */
+		if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)
+			break;
+	for (i = 0 ; i < 1000000 ; i++)	/* must try at least 2.228 ms */
+		if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
+			break;
+	do { /* Isn't this overkill ? UIP above should guarantee consistency */
+		sec = CMOS_READ(RTC_SECONDS);
+		min = CMOS_READ(RTC_MINUTES);
+		hour = CMOS_READ(RTC_HOURS);
+		day = CMOS_READ(RTC_DAY_OF_MONTH);
+		mon = CMOS_READ(RTC_MONTH);
+		year = CMOS_READ(RTC_YEAR);
+	} while (sec != CMOS_READ(RTC_SECONDS));
+	if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
+	  {
+	    BCD_TO_BIN(sec);
+	    BCD_TO_BIN(min);
+	    BCD_TO_BIN(hour);
+	    BCD_TO_BIN(day);
+	    BCD_TO_BIN(mon);
+	    BCD_TO_BIN(year);
+	  }
+	if ((year += 1900) < 1970)
+		year += 100;
+
+	return mktime(year, mon, day, hour, min, sec);
+}
+
+#endif /* !_MACH_TIME_H */
diff -Nru a/include/asm-i386/mach-default/mach_timer.h b/include/asm-i386/mach-default/mach_timer.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-default/mach_timer.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,48 @@
+/*
+ *  include/asm-i386/mach-default/mach_timer.h
+ *
+ *  Machine specific calibrate_tsc() for generic.
+ *  Split out from timer_tsc.c by Osamu Tomita <tomita@cinet.co.jp>
+ */
+/* ------ Calibrate the TSC ------- 
+ * Return 2^32 * (1 / (TSC clocks per usec)) for do_fast_gettimeoffset().
+ * Too much 64-bit arithmetic here to do this cleanly in C, and for
+ * accuracy's sake we want to keep the overhead on the CTC speaker (channel 2)
+ * output busy loop as low as possible. We avoid reading the CTC registers
+ * directly because of the awkward 8-bit access mechanism of the 82C54
+ * device.
+ */
+#ifndef _MACH_TIMER_H
+#define _MACH_TIMER_H
+
+#define CALIBRATE_LATCH	(5 * LATCH)
+
+static inline void mach_prepare_counter(void)
+{
+       /* Set the Gate high, disable speaker */
+	outb((inb(0x61) & ~0x02) | 0x01, 0x61);
+
+	/*
+	 * Now let's take care of CTC channel 2
+	 *
+	 * Set the Gate high, program CTC channel 2 for mode 0,
+	 * (interrupt on terminal count mode), binary count,
+	 * load 5 * LATCH count, (LSB and MSB) to begin countdown.
+	 *
+	 * Some devices need a delay here.
+	 */
+	outb(0xb0, 0x43);			/* binary, mode 0, LSB/MSB, Ch 2 */
+	outb_p(CALIBRATE_LATCH & 0xff, 0x42);	/* LSB of count */
+	outb_p(CALIBRATE_LATCH >> 8, 0x42);       /* MSB of count */
+}
+
+static inline void mach_countup(unsigned long *count_p)
+{
+	unsigned long count = 0;
+	do {
+		count++;
+	} while ((inb_p(0x61) & 0x20) == 0);
+	*count_p = count;
+}
+
+#endif /* !_MACH_TIMER_H */
diff -Nru a/include/asm-i386/mach-default/mach_traps.h b/include/asm-i386/mach-default/mach_traps.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-default/mach_traps.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,29 @@
+/*
+ *  include/asm-i386/mach-default/mach_traps.h
+ *
+ *  Machine specific NMI handling for generic.
+ *  Split out from traps.c by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_TRAPS_H
+#define _MACH_TRAPS_H
+
+static inline void clear_mem_error(unsigned char reason)
+{
+	reason = (reason & 0xf) | 4;
+	outb(reason, 0x61);
+}
+
+static inline unsigned char get_nmi_reason(void)
+{
+	return inb(0x61);
+}
+
+static inline void reassert_nmi(void)
+{
+	outb(0x8f, 0x70);
+	inb(0x71);		/* dummy */
+	outb(0x0f, 0x70);
+	inb(0x71);		/* dummy */
+}
+
+#endif /* !_MACH_TRAPS_H */
diff -Nru a/include/asm-i386/mach-default/smpboot_hooks.h b/include/asm-i386/mach-default/smpboot_hooks.h
--- a/include/asm-i386/mach-default/smpboot_hooks.h	Sat Apr 19 19:51:30 2003
+++ b/include/asm-i386/mach-default/smpboot_hooks.h	Sat Apr 19 19:51:30 2003
@@ -6,7 +6,18 @@
 	io_apic_irqs = 0;
 }
 
-static inline void smpboot_setup_warm_reset_vector(void)
+static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
+{
+	CMOS_WRITE(0xa, 0xf);
+	local_flush_tlb();
+	Dprintk("1.\n");
+	*((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4;
+	Dprintk("2.\n");
+	*((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf;
+	Dprintk("3.\n");
+}
+
+static inline void smpboot_restore_warm_reset_vector(void)
 {
 	/*
 	 * Install writable page 0 entry to set BIOS data area.
diff -Nru a/include/asm-i386/mach-pc9800/apm.h b/include/asm-i386/mach-pc9800/apm.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/apm.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,82 @@
+/*
+ *  include/asm-i386/mach-pc9800/apm.h
+ *
+ *  Machine specific APM BIOS functions for NEC PC9800.
+ *  Split out from apm.c by Osamu Tomita <tomita@cinet.co.jp>
+ */
+
+#ifndef _ASM_APM_H
+#define _ASM_APM_H
+
+#include <linux/apm_bios.h>
+
+#ifdef APM_ZERO_SEGS
+#	define APM_DO_ZERO_SEGS \
+		"pushl %%ds\n\t" \
+		"pushl %%es\n\t" \
+		"xorl %%edx, %%edx\n\t" \
+		"mov %%dx, %%ds\n\t" \
+		"mov %%dx, %%es\n\t" \
+		"mov %%dx, %%fs\n\t" \
+		"mov %%dx, %%gs\n\t"
+#	define APM_DO_POP_SEGS \
+		"popl %%es\n\t" \
+		"popl %%ds\n\t"
+#else
+#	define APM_DO_ZERO_SEGS
+#	define APM_DO_POP_SEGS
+#endif
+
+static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in,
+					u32 *eax, u32 *ebx, u32 *ecx,
+					u32 *edx, u32 *esi)
+{
+	/*
+	 * N.B. We do NOT need a cld after the BIOS call
+	 * because we always save and restore the flags.
+	 */
+	__asm__ __volatile__(APM_DO_ZERO_SEGS
+		"pushl %%edi\n\t"
+		"pushl %%ebp\n\t"
+		"pushfl\n\t"
+		"lcall *%%cs:apm_bios_entry\n\t"
+		"setc %%al\n\t"
+		"popl %%ebp\n\t"
+		"popl %%edi\n\t"
+		APM_DO_POP_SEGS
+		: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx),
+		  "=S" (*esi)
+		: "a" (func), "b" (ebx_in), "c" (ecx_in)
+		: "memory", "cc");
+}
+
+static inline u8 apm_bios_call_simple_asm(u32 func, u32 ebx_in,
+						u32 ecx_in, u32 *eax)
+{
+	int	cx, dx, si;
+	u8	error;
+
+	/*
+	 * N.B. We do NOT need a cld after the BIOS call
+	 * because we always save and restore the flags.
+	 */
+	__asm__ __volatile__(APM_DO_ZERO_SEGS
+		"pushl %%edi\n\t"
+		"pushl %%ebp\n\t"
+		"pushfl\n\t"
+		"lcall *%%cs:apm_bios_entry\n\t"
+		"setc %%bl\n\t"
+		"popl %%ebp\n\t"
+		"popl %%edi\n\t"
+		APM_DO_POP_SEGS
+		: "=a" (*eax), "=b" (error), "=c" (cx), "=d" (dx),
+		  "=S" (si)
+		: "a" (func), "b" (ebx_in), "c" (ecx_in)
+		: "memory", "cc");
+	if (func == APM_FUNC_VERSION)
+		*eax = (*eax & 0xff00) | ((*eax & 0x00f0) >> 4);
+
+	return error;
+}
+
+#endif /* _ASM_APM_H */
diff -Nru a/include/asm-i386/mach-pc9800/bios_ebda.h b/include/asm-i386/mach-pc9800/bios_ebda.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/bios_ebda.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,14 @@
+#ifndef _MACH_BIOS_EBDA_H
+#define _MACH_BIOS_EBDA_H
+
+/*
+ * PC-9800 has no EBDA.
+ * Its BIOS uses 0x40E for other purpose,
+ * Not pointer to 4K EBDA area.
+ */
+static inline unsigned int get_bios_ebda(void)
+{
+	return 0;	/* 0 means none */
+}
+
+#endif /* _MACH_BIOS_EBDA_H */
diff -Nru a/include/asm-i386/mach-pc9800/do_timer.h b/include/asm-i386/mach-pc9800/do_timer.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/do_timer.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,82 @@
+/* defines for inline arch setup functions */
+
+#include <asm/apic.h>
+
+/**
+ * do_timer_interrupt_hook - hook into timer tick
+ * @regs:	standard registers from interrupt
+ *
+ * Description:
+ *	This hook is called immediately after the timer interrupt is ack'd.
+ *	It's primary purpose is to allow architectures that don't possess
+ *	individual per CPU clocks (like the CPU APICs supply) to broadcast the
+ *	timer interrupt as a means of triggering reschedules etc.
+ **/
+
+static inline void do_timer_interrupt_hook(struct pt_regs *regs)
+{
+	do_timer(regs);
+/*
+ * In the SMP case we use the local APIC timer interrupt to do the
+ * profiling, except when we simulate SMP mode on a uniprocessor
+ * system, in that case we have to call the local interrupt handler.
+ */
+#ifndef CONFIG_X86_LOCAL_APIC
+	x86_do_profile(regs);
+#else
+	if (!using_apic_timer)
+		smp_local_timer_interrupt(regs);
+#endif
+}
+
+
+/* you can safely undefine this if you don't have the Neptune chipset */
+
+#define BUGGY_NEPTUN_TIMER
+
+/**
+ * do_timer_overflow - process a detected timer overflow condition
+ * @count:	hardware timer interrupt count on overflow
+ *
+ * Description:
+ *	This call is invoked when the jiffies count has not incremented but
+ *	the hardware timer interrupt has.  It means that a timer tick interrupt
+ *	came along while the previous one was pending, thus a tick was missed
+ **/
+static inline int do_timer_overflow(int count)
+{
+	int i;
+
+	spin_lock(&i8259A_lock);
+	/*
+	 * This is tricky when I/O APICs are used;
+	 * see do_timer_interrupt().
+	 */
+	i = inb(0x00);
+	spin_unlock(&i8259A_lock);
+	
+	/* assumption about timer being IRQ0 */
+	if (i & 0x01) {
+		/*
+		 * We cannot detect lost timer interrupts ... 
+		 * well, that's why we call them lost, don't we? :)
+		 * [hmm, on the Pentium and Alpha we can ... sort of]
+		 */
+		count -= LATCH;
+	} else {
+#ifdef BUGGY_NEPTUN_TIMER
+		/*
+		 * for the Neptun bug we know that the 'latch'
+		 * command doesn't latch the high and low value
+		 * of the counter atomically. Thus we have to 
+		 * substract 256 from the counter 
+		 * ... funny, isnt it? :)
+		 */
+		
+		count -= 256;
+#else
+		printk("do_slow_gettimeoffset(): hardware timer problem?\n");
+#endif
+	}
+	return count;
+}
diff -Nru a/include/asm-i386/mach-pc9800/io_ports.h b/include/asm-i386/mach-pc9800/io_ports.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/io_ports.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,30 @@
+/*
+ *  arch/i386/mach-pc9800/io_ports.h
+ *
+ *  Machine specific IO port address definition for PC-9800.
+ *  Written by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_IO_PORTS_H
+#define _MACH_IO_PORTS_H
+
+/* i8253A PIT registers */
+#define PIT_MODE		0x77
+#define PIT_CH0			0x71
+#define PIT_CH2			0x75
+
+/* i8259A PIC registers */
+#define PIC_MASTER_CMD		0x00
+#define PIC_MASTER_IMR		0x02
+#define PIC_MASTER_ISR		PIC_MASTER_CMD
+#define PIC_MASTER_POLL		PIC_MASTER_ISR
+#define PIC_MASTER_OCW3		PIC_MASTER_ISR
+#define PIC_SLAVE_CMD		0x08
+#define PIC_SLAVE_IMR		0x0a
+
+/* i8259A PIC related values */
+#define PIC_CASCADE_IR		7
+#define MASTER_ICW4_DEFAULT	0x1d
+#define SLAVE_ICW4_DEFAULT	0x09
+#define PIC_ICW4_AEOI		0x02
+
+#endif /* !_MACH_IO_PORTS_H */
diff -Nru a/include/asm-i386/mach-pc9800/irq_vectors.h b/include/asm-i386/mach-pc9800/irq_vectors.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/irq_vectors.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,93 @@
+/*
+ * This file should contain #defines for all of the interrupt vector
+ * numbers used by this architecture.
+ *
+ * In addition, there are some standard defines:
+ *
+ *	FIRST_EXTERNAL_VECTOR:
+ *		The first free place for external interrupts
+ *
+ *	SYSCALL_VECTOR:
+ *		The IRQ vector a syscall makes the user to kernel transition
+ *		under.
+ *
+ *	TIMER_IRQ:
+ *		The IRQ number the timer interrupt comes in at.
+ *
+ *	NR_IRQS:
+ *		The total number of interrupt vectors (including all the
+ *		architecture specific interrupts) needed.
+ *
+ */			
+#ifndef _ASM_IRQ_VECTORS_H
+#define _ASM_IRQ_VECTORS_H
+
+/*
+ * IDT vectors usable for external interrupt sources start
+ * at 0x20:
+ */
+#define FIRST_EXTERNAL_VECTOR	0x20
+
+#define SYSCALL_VECTOR		0x80
+
+/*
+ * Vectors 0x20-0x2f are used for ISA interrupts.
+ */
+
+/*
+ * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
+ *
+ *  some of the following vectors are 'rare', they are merged
+ *  into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
+ *  TLB, reschedule and local APIC vectors are performance-critical.
+ *
+ *  Vectors 0xf0-0xfa are free (reserved for future Linux use).
+ */
+#define SPURIOUS_APIC_VECTOR	0xff
+#define ERROR_APIC_VECTOR	0xfe
+#define INVALIDATE_TLB_VECTOR	0xfd
+#define RESCHEDULE_VECTOR	0xfc
+#define CALL_FUNCTION_VECTOR	0xfb
+
+#define THERMAL_APIC_VECTOR	0xf0
+/*
+ * Local APIC timer IRQ vector is on a different priority level,
+ * to work around the 'lost local interrupt if more than 2 IRQ
+ * sources per level' errata.
+ */
+#define LOCAL_TIMER_VECTOR	0xef
+
+/*
+ * First APIC vector available to drivers: (vectors 0x30-0xee)
+ * we start at 0x31 to spread out vectors evenly between priority
+ * levels. (0x80 is the syscall vector)
+ */
+#define FIRST_DEVICE_VECTOR	0x31
+#define FIRST_SYSTEM_VECTOR	0xef
+
+#define TIMER_IRQ 0
+
+/*
+ * 16 8259A IRQ's, 208 potential APIC interrupt sources.
+ * Right now the APIC is mostly only used for SMP.
+ * 256 vectors is an architectural limit. (we can have
+ * more than 256 devices theoretically, but they will
+ * have to use shared interrupts)
+ * Since vectors 0x00-0x1f are used/reserved for the CPU,
+ * the usable vector space is 0x20-0xff (224 vectors)
+ */
+#ifdef CONFIG_X86_IO_APIC
+#define NR_IRQS 224
+#else
+#define NR_IRQS 16
+#endif
+
+#define FPU_IRQ			8
+
+#define	FIRST_VM86_IRQ		2
+#define LAST_VM86_IRQ		15
+#define invalid_vm86_irq(irq)	((irq) < 2 || (irq) == 7 || (irq) > 15)
+
+#endif /* _ASM_IRQ_VECTORS_H */
+
+
diff -Nru a/include/asm-i386/mach-pc9800/mach_resources.h b/include/asm-i386/mach-pc9800/mach_resources.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/mach_resources.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,191 @@
+/*
+ *  include/asm-i386/mach-pc9800/mach_resources.h
+ *
+ *  Machine specific resource allocation for PC-9800.
+ *  Written by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_RESOURCES_H
+#define _MACH_RESOURCES_H
+
+static char str_pic1[] = "pic1";
+static char str_dma[] = "dma";
+static char str_pic2[] = "pic2";
+static char str_calender_clock[] = "calender clock";
+static char str_system[] = "system";
+static char str_nmi_control[] = "nmi control";
+static char str_kanji_rom[] = "kanji rom";
+static char str_keyboard[] = "keyboard";
+static char str_text_gdc[] = "text gdc";
+static char str_crtc[] = "crtc";
+static char str_timer[] = "timer";
+static char str_graphic_gdc[] = "graphic gdc";
+static char str_dma_ex_bank[] = "dma ex. bank";
+static char str_beep_freq[] = "beep freq.";
+static char str_mouse_pio[] = "mouse pio";
+struct resource standard_io_resources[] = {
+	{ str_pic1, 0x00, 0x00, IORESOURCE_BUSY },
+	{ str_dma, 0x01, 0x01, IORESOURCE_BUSY },
+	{ str_pic1, 0x02, 0x02, IORESOURCE_BUSY },
+	{ str_dma, 0x03, 0x03, IORESOURCE_BUSY },
+	{ str_dma, 0x05, 0x05, IORESOURCE_BUSY },
+	{ str_dma, 0x07, 0x07, IORESOURCE_BUSY },
+	{ str_pic2, 0x08, 0x08, IORESOURCE_BUSY },
+	{ str_dma, 0x09, 0x09, IORESOURCE_BUSY },
+	{ str_pic2, 0x0a, 0x0a, IORESOURCE_BUSY },
+	{ str_dma, 0x0b, 0x0b, IORESOURCE_BUSY },
+	{ str_dma, 0x0d, 0x0d, IORESOURCE_BUSY },
+	{ str_dma, 0x0f, 0x0f, IORESOURCE_BUSY },
+	{ str_dma, 0x11, 0x11, IORESOURCE_BUSY },
+	{ str_dma, 0x13, 0x13, IORESOURCE_BUSY },
+	{ str_dma, 0x15, 0x15, IORESOURCE_BUSY },
+	{ str_dma, 0x17, 0x17, IORESOURCE_BUSY },
+	{ str_dma, 0x19, 0x19, IORESOURCE_BUSY },
+	{ str_dma, 0x1b, 0x1b, IORESOURCE_BUSY },
+	{ str_dma, 0x1d, 0x1d, IORESOURCE_BUSY },
+	{ str_dma, 0x1f, 0x1f, IORESOURCE_BUSY },
+	{ str_calender_clock, 0x20, 0x20, 0 },
+	{ str_dma, 0x21, 0x21, IORESOURCE_BUSY },
+	{ str_calender_clock, 0x22, 0x22, 0 },
+	{ str_dma, 0x23, 0x23, IORESOURCE_BUSY },
+	{ str_dma, 0x25, 0x25, IORESOURCE_BUSY },
+	{ str_dma, 0x27, 0x27, IORESOURCE_BUSY },
+	{ str_dma, 0x29, 0x29, IORESOURCE_BUSY },
+	{ str_dma, 0x2b, 0x2b, IORESOURCE_BUSY },
+	{ str_dma, 0x2d, 0x2d, IORESOURCE_BUSY },
+	{ str_system, 0x31, 0x31, IORESOURCE_BUSY },
+	{ str_system, 0x33, 0x33, IORESOURCE_BUSY },
+	{ str_system, 0x35, 0x35, IORESOURCE_BUSY },
+	{ str_system, 0x37, 0x37, IORESOURCE_BUSY },
+	{ str_nmi_control, 0x50, 0x50, IORESOURCE_BUSY },
+	{ str_nmi_control, 0x52, 0x52, IORESOURCE_BUSY },
+	{ "time stamp", 0x5c, 0x5f, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa1, 0xa1, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa3, 0xa3, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa5, 0xa5, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa7, 0xa7, IORESOURCE_BUSY },
+	{ str_kanji_rom, 0xa9, 0xa9, IORESOURCE_BUSY },
+	{ str_keyboard, 0x41, 0x41, IORESOURCE_BUSY },
+	{ str_keyboard, 0x43, 0x43, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x60, 0x60, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x62, 0x62, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x64, 0x64, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x66, 0x66, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x68, 0x68, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x6a, 0x6a, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x6c, 0x6c, IORESOURCE_BUSY },
+	{ str_text_gdc, 0x6e, 0x6e, IORESOURCE_BUSY },
+	{ str_crtc, 0x70, 0x70, IORESOURCE_BUSY },
+	{ str_crtc, 0x72, 0x72, IORESOURCE_BUSY },
+	{ str_crtc, 0x74, 0x74, IORESOURCE_BUSY },
+	{ str_crtc, 0x74, 0x74, IORESOURCE_BUSY },
+	{ str_crtc, 0x76, 0x76, IORESOURCE_BUSY },
+	{ str_crtc, 0x78, 0x78, IORESOURCE_BUSY },
+	{ str_crtc, 0x7a, 0x7a, IORESOURCE_BUSY },
+	{ str_timer, 0x71, 0x71, IORESOURCE_BUSY },
+	{ str_timer, 0x73, 0x73, IORESOURCE_BUSY },
+	{ str_timer, 0x75, 0x75, IORESOURCE_BUSY },
+	{ str_timer, 0x77, 0x77, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa0, 0xa0, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa2, 0xa2, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa4, 0xa4, IORESOURCE_BUSY },
+	{ str_graphic_gdc, 0xa6, 0xa6, IORESOURCE_BUSY },
+	{ "cpu", 0xf0, 0xf7, IORESOURCE_BUSY },
+	{ "fpu", 0xf8, 0xff, IORESOURCE_BUSY },
+	{ str_dma_ex_bank, 0x0e05, 0x0e05, 0 },
+	{ str_dma_ex_bank, 0x0e07, 0x0e07, 0 },
+	{ str_dma_ex_bank, 0x0e09, 0x0e09, 0 },
+	{ str_dma_ex_bank, 0x0e0b, 0x0e0b, 0 },
+	{ str_beep_freq, 0x3fd9, 0x3fd9, IORESOURCE_BUSY },
+	{ str_beep_freq, 0x3fdb, 0x3fdb, IORESOURCE_BUSY },
+	{ str_beep_freq, 0x3fdd, 0x3fdd, IORESOURCE_BUSY },
+	{ str_beep_freq, 0x3fdf, 0x3fdf, IORESOURCE_BUSY },
+	/* All PC-9800 have (exactly) one mouse interface.  */
+	{ str_mouse_pio, 0x7fd9, 0x7fd9, 0 },
+	{ str_mouse_pio, 0x7fdb, 0x7fdb, 0 },
+	{ str_mouse_pio, 0x7fdd, 0x7fdd, 0 },
+	{ str_mouse_pio, 0x7fdf, 0x7fdf, 0 },
+	{ "mouse timer", 0xbfdb, 0xbfdb, 0 },
+	{ "mouse irq", 0x98d7, 0x98d7, 0 },
+};
+
+#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))
+
+static struct resource tvram_resource = { "Text VRAM/CG window", 0xa0000, 0xa4fff, IORESOURCE_BUSY };
+static struct resource gvram_brg_resource = { "Graphic VRAM (B/R/G)", 0xa8000, 0xbffff, IORESOURCE_BUSY };
+static struct resource gvram_e_resource = { "Graphic VRAM (E)", 0xe0000, 0xe7fff, IORESOURCE_BUSY };
+
+/* System ROM resources */
+#define MAXROMS 6
+static struct resource rom_resources[MAXROMS] = {
+	{ "System ROM", 0xe8000, 0xfffff, IORESOURCE_BUSY }
+};
+
+static inline void probe_video_rom(int roms)
+{
+	/* PC-9800 has no video ROM */
+}
+
+static inline void probe_extension_roms(int roms)
+{
+	int i;
+	__u8 *xrom_id;
+
+	xrom_id = (__u8 *) isa_bus_to_virt(PC9800SCA_XROM_ID + 0x10);
+
+	for (i = 0; i < 16; i++) {
+		if (xrom_id[i] & 0x80) {
+			int j;
+
+			for (j = i + 1; j < 16 && (xrom_id[j] & 0x80); j++)
+				;
+			rom_resources[roms].start = 0x0d0000 + i * 0x001000;
+			rom_resources[roms].end = 0x0d0000 + j * 0x001000 - 1;
+			rom_resources[roms].name = "Extension ROM";
+			rom_resources[roms].flags = IORESOURCE_BUSY;
+
+			request_resource(&iomem_resource,
+					  rom_resources + roms);
+			if (++roms >= MAXROMS)
+				return;
+		}
+	}
+}
+
+static inline void request_graphics_resource(void)
+{
+	int i;
+
+	if (PC9800_HIGHRESO_P()) {
+		tvram_resource.start = 0xe0000;
+		tvram_resource.end   = 0xe4fff;
+		gvram_brg_resource.name  = "Graphic VRAM";
+		gvram_brg_resource.start = 0xc0000;
+		gvram_brg_resource.end   = 0xdffff;
+	}
+
+	request_resource(&iomem_resource, &tvram_resource);
+	request_resource(&iomem_resource, &gvram_brg_resource);
+	if (!PC9800_HIGHRESO_P())
+		request_resource(&iomem_resource, &gvram_e_resource);
+
+	if (PC9800_HIGHRESO_P() || PC9800_9821_P()) {
+		static char graphics[] = "graphics";
+		static struct resource graphics_resources[] = {
+			{ graphics, 0x9a0, 0x9a0, 0 },
+			{ graphics, 0x9a2, 0x9a2, 0 },
+			{ graphics, 0x9a4, 0x9a4, 0 },
+			{ graphics, 0x9a6, 0x9a6, 0 },
+			{ graphics, 0x9a8, 0x9a8, 0 },
+			{ graphics, 0x9aa, 0x9aa, 0 },
+			{ graphics, 0x9ac, 0x9ac, 0 },
+			{ graphics, 0x9ae, 0x9ae, 0 },
+		};
+
+#define GRAPHICS_RESOURCES (sizeof(graphics_resources)/sizeof(struct resource))
+
+		for (i = 0; i < GRAPHICS_RESOURCES; i++)
+			request_resource(&ioport_resource, graphics_resources + i);
+	}
+}
+
+#endif /* !_MACH_RESOURCES_H */
diff -Nru a/include/asm-i386/mach-pc9800/mach_time.h b/include/asm-i386/mach-pc9800/mach_time.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/mach_time.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,100 @@
+/*
+ *  include/asm-i386/mach-pc9800/mach_time.h
+ *
+ *  Machine specific set RTC function for PC-9800.
+ *  Written by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_TIME_H
+#define _MACH_TIME_H
+
+#include <linux/bcd.h>
+#include <linux/upd4990a.h>
+
+/* for check timing call set_rtc_mmss() */
+/* used in arch/i386/time.c::do_timer_interrupt() */
+/*
+ * Because PC-9800's RTC (NEC uPD4990A) does not allow setting
+ * time partially, we always have to read-modify-write the
+ * entire time (including year) so that set_rtc_mmss() will
+ * take quite much time to execute.  You may want to relax
+ * RTC resetting interval (currently ~11 minuts)...
+ */
+#define USEC_AFTER	1000000
+#define USEC_BEFORE	0
+
+static inline int mach_set_rtc_mmss(unsigned long nowtime)
+{
+	int retval = 0;
+	int real_seconds, real_minutes, cmos_minutes;
+	struct upd4990a_raw_data data;
+
+	upd4990a_get_time(&data, 1);
+	cmos_minutes = BCD2BIN(data.min);
+
+	/*
+	 * since we're only adjusting minutes and seconds,
+	 * don't interfere with hour overflow. This avoids
+	 * messing with unknown time zones but requires your
+	 * RTC not to be off by more than 15 minutes
+	 */
+	real_seconds = nowtime % 60;
+	real_minutes = nowtime / 60;
+	if (((abs(real_minutes - cmos_minutes) + 15) / 30) & 1)
+		real_minutes += 30;	/* correct for half hour time zone */
+	real_minutes %= 60;
+
+	if (abs(real_minutes - cmos_minutes) < 30) {
+		u8 temp_seconds = (real_seconds / 10) * 16 + real_seconds % 10;
+		u8 temp_minutes = (real_minutes / 10) * 16 + real_minutes % 10;
+
+		if (data.sec != temp_seconds || data.min != temp_minutes) {
+			data.sec = temp_seconds;
+			data.min = temp_minutes;
+			upd4990a_set_time(&data, 1);
+		}
+	} else {
+		printk(KERN_WARNING
+		       "set_rtc_mmss: can't update from %d to %d\n",
+		       cmos_minutes, real_minutes);
+		retval = -1;
+	}
+
+	/* uPD4990A users' manual says we should issue Register Hold
+	 * command after reading time, or future Time Read command
+	 * may not work.  When we have set the time, this also starts
+	 * the clock.
+	 */
+	upd4990a_serial_command(UPD4990A_REGISTER_HOLD);
+
+	return retval;
+}
+
+static inline unsigned long mach_get_cmos_time(void)
+{
+	int i;
+	u8 prev, cur;
+	unsigned int year;
+	struct upd4990a_raw_data data;
+
+	/* Connect uPD4990A's DATA OUT pin to its 1Hz reference clock. */
+	upd4990a_serial_command(UPD4990A_REGISTER_HOLD);
+
+	/* Catch rising edge of reference clock.  */
+	prev = ~UPD4990A_READ_DATA();
+	for (i = 0; i < 1800000; i++) { /* may take up to 1 second... */
+		__asm__ ("outb %%al,%0" : : "N" (0x5f)); /* 0.6usec delay */
+		cur = UPD4990A_READ_DATA();
+		if (!(prev & cur & 1))
+			break;
+		prev = ~cur;
+	}
+
+	upd4990a_get_time(&data, 0);
+
+	if ((year = BCD2BIN(data.year) + 1900) < 1995)
+		year += 100;
+	return mktime(year, data.mon, BCD2BIN(data.mday), BCD2BIN(data.hour),
+			BCD2BIN(data.min), BCD2BIN(data.sec));
+}
+
+#endif /* !_MACH_TIME_H */
diff -Nru a/include/asm-i386/mach-pc9800/mach_timer.h b/include/asm-i386/mach-pc9800/mach_timer.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/mach_timer.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,31 @@
+/*
+ *  include/asm-i386/mach-pc9800/mach_timer.h
+ *
+ *  Machine specific calibrate_tsc() for PC-9800.
+ *  Written by Osamu Tomita <tomita@cinet.co.jp>
+ */
+/* ------ Calibrate the TSC ------- 
+ * PC-9800:
+ *  CTC cannot be used because some models (especially
+ *  note-machines) may disable clock to speaker channel (#1)
+ *  unless speaker is enabled.  We use ARTIC instead.
+ */
+#ifndef _MACH_TIMER_H
+#define _MACH_TIMER_H
+
+#define CALIBRATE_LATCH	(5 * 307200/HZ) /* 0.050sec * 307200Hz = 15360 */
+
+static inline void mach_prepare_counter(void)
+{
+	/* ARTIC can't be stopped nor reset. So we wait roundup. */
+	while (inw(0x5c));
+}
+
+static inline void mach_countup(unsigned long *count)
+{
+	do {
+		*count = inw(0x5c);
+	} while (*count < CALIBRATE_LATCH);
+}
+
+#endif /* !_MACH_TIMER_H */
diff -Nru a/include/asm-i386/mach-pc9800/mach_traps.h b/include/asm-i386/mach-pc9800/mach_traps.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/mach_traps.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,27 @@
+/*
+ *  include/asm-i386/mach-pc9800/mach_traps.h
+ *
+ *  Machine specific NMI handling for PC-9800.
+ *  Written by Osamu Tomita <tomita@cinet.co.jp>
+ */
+#ifndef _MACH_TRAPS_H
+#define _MACH_TRAPS_H
+
+static inline void clear_mem_error(unsigned char reason)
+{
+	outb(0x08, 0x37);
+	outb(0x09, 0x37);
+}
+
+static inline unsigned char get_nmi_reason(void)
+{
+	return (inb(0x33) & 6) ? 0x80 : 0;
+}
+
+static inline void reassert_nmi(void)
+{
+	outb(0x09, 0x50);	/* disable NMI once */
+	outb(0x09, 0x52);	/* re-enable it */
+}
+
+#endif /* !_MACH_TRAPS_H */
diff -Nru a/include/asm-i386/mach-pc9800/mach_wakecpu.h b/include/asm-i386/mach-pc9800/mach_wakecpu.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/mach_wakecpu.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,45 @@
+#ifndef __ASM_MACH_WAKECPU_H
+#define __ASM_MACH_WAKECPU_H
+
+/* 
+ * This file copes with machines that wakeup secondary CPUs by the
+ * INIT, INIT, STARTUP sequence.
+ */
+
+#define WAKE_SECONDARY_VIA_INIT
+
+/*
+ * On PC-9800, continuation on warm reset is done by loading
+ * %ss:%sp from 0x0000:0404 and executing 'lret', so:
+ */
+#define TRAMPOLINE_LOW phys_to_virt(0x4fa)
+#define TRAMPOLINE_HIGH phys_to_virt(0x4fc)
+
+#define boot_cpu_apicid boot_cpu_physical_apicid
+
+static inline void wait_for_init_deassert(atomic_t *deassert)
+{
+	while (!atomic_read(deassert));
+	return;
+}
+
+/* Nothing to do for most platforms, since cleared by the INIT cycle */
+static inline void smp_callin_clear_local_apic(void)
+{
+}
+
+static inline void store_NMI_vector(unsigned short *high, unsigned short *low)
+{
+}
+
+static inline void restore_NMI_vector(unsigned short *high, unsigned short *low)
+{
+}
+
+#if APIC_DEBUG
+ #define inquire_remote_apic(apicid) __inquire_remote_apic(apicid)
+#else
+ #define inquire_remote_apic(apicid) {}
+#endif
+
+#endif /* __ASM_MACH_WAKECPU_H */
diff -Nru a/include/asm-i386/mach-pc9800/smpboot_hooks.h b/include/asm-i386/mach-pc9800/smpboot_hooks.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/mach-pc9800/smpboot_hooks.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,52 @@
+/* two abstractions specific to kernel/smpboot.c, mainly to cater to visws
+ * which needs to alter them. */
+
+static inline void smpboot_clear_io_apic_irqs(void)
+{
+	io_apic_irqs = 0;
+}
+
+static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
+{
+	/* reset code is stored in 8255 on PC-9800. */
+	outb(0x0e, 0x37);	/* SHUT0 = 0 */
+	local_flush_tlb();
+	Dprintk("1.\n");
+	*((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4;
+	Dprintk("2.\n");
+	*((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf;
+	Dprintk("3.\n");
+	/*
+	 * On PC-9800, continuation on warm reset is done by loading
+	 * %ss:%sp from 0x0000:0404 and executing 'lret', so:
+	 */
+	/* 0x3f0 is on unused interrupt vector and should be safe... */
+	*((volatile unsigned long *) phys_to_virt(0x404)) = 0x000003f0;
+	Dprintk("4.\n");
+}
+
+static inline void smpboot_restore_warm_reset_vector(void)
+{
+	/*
+	 * Install writable page 0 entry to set BIOS data area.
+	 */
+	local_flush_tlb();
+
+	/*
+	 * Paranoid:  Set warm reset code and vector here back
+	 * to default values.
+	 */
+	outb(0x0f, 0x37);	/* SHUT0 = 1 */
+
+	*((volatile long *) phys_to_virt(0x404)) = 0;
+}
+
+static inline void smpboot_setup_io_apic(void)
+{
+	/*
+	 * Here we can be sure that there is an IO-APIC in the system. Let's
+	 * go and set it up:
+	 */
+	if (!skip_ioapic_setup && nr_ioapics)
+		setup_IO_APIC();
+}
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	Sat Apr 19 19:51:47 2003
+++ b/include/asm-i386/mach-summit/mach_mpparse.h	Sat Apr 19 19:51:47 2003
@@ -19,6 +19,7 @@
 {
 	if (!strncmp(oem, "IBM ENSW", 8) && 
 			(!strncmp(productid, "VIGIL SMP", 9) 
+			 || !strncmp(productid, "EXA", 3)
 			 || !strncmp(productid, "RUTHLESS SMP", 12))){
 		x86_summit = 1;
 		use_cyclone = 1; /*enable cyclone-timer*/
@@ -28,7 +29,9 @@
 /* Hook from generic ACPI tables.c */
 static inline void acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 {
-	if (!strncmp(oem_id, "IBM", 3) && !strncmp(oem_table_id, "SERVIGIL", 8)){
+	if (!strncmp(oem_id, "IBM", 3) &&
+	    (!strncmp(oem_table_id, "SERVIGIL", 8)
+	     || !strncmp(oem_table_id, "EXA", 3))){
 		x86_summit = 1;
 		use_cyclone = 1; /*enable cyclone-timer*/
 	}
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	Sat Apr 19 19:51:28 2003
+++ b/include/asm-i386/mach-visws/irq_vectors.h	Sat Apr 19 19:51:28 2003
@@ -51,4 +51,10 @@
  */
 #define NR_IRQS 224
 
+#define FPU_IRQ			13
+
+#define	FIRST_VM86_IRQ		3
+#define LAST_VM86_IRQ		15
+#define invalid_vm86_irq(irq)	((irq) < 3 || (irq) > 15)
+
 #endif /* _ASM_IRQ_VECTORS_H */
diff -Nru a/include/asm-i386/mach-visws/smpboot_hooks.h b/include/asm-i386/mach-visws/smpboot_hooks.h
--- a/include/asm-i386/mach-visws/smpboot_hooks.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-i386/mach-visws/smpboot_hooks.h	Sat Apr 19 19:51:28 2003
@@ -1,10 +1,21 @@
+static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
+{
+	CMOS_WRITE(0xa, 0xf);
+	local_flush_tlb();
+	Dprintk("1.\n");
+	*((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4;
+	Dprintk("2.\n");
+	*((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf;
+	Dprintk("3.\n");
+}
+
 /* for visws do nothing for any of these */
 
 static inline void smpboot_clear_io_apic_irqs(void)
 {
 }
 
-static inline void smpboot_setup_warm_reset_vector(void)
+static inline void smpboot_restore_warm_reset_vector(void)
 {
 }
 
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	Sat Apr 19 19:51:29 2003
+++ b/include/asm-i386/mach-voyager/irq_vectors.h	Sat Apr 19 19:51:29 2003
@@ -57,6 +57,12 @@
 
 #define NR_IRQS 224
 
+#define FPU_IRQ				13
+
+#define	FIRST_VM86_IRQ		3
+#define LAST_VM86_IRQ		15
+#define invalid_vm86_irq(irq)	((irq) < 3 || (irq) > 15)
+
 #ifndef __ASSEMBLY__
 extern asmlinkage void vic_cpi_interrupt(void);
 extern asmlinkage void vic_sys_interrupt(void);
diff -Nru a/include/asm-i386/math_emu.h b/include/asm-i386/math_emu.h
--- a/include/asm-i386/math_emu.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-i386/math_emu.h	Sat Apr 19 19:51:49 2003
@@ -3,8 +3,8 @@
 
 #include <asm/sigcontext.h>
 
-int restore_i387_soft(void *s387, struct _fpstate *buf);
-int save_i387_soft(void *s387, struct _fpstate * buf);
+int restore_i387_soft(void *s387, struct _fpstate __user *buf);
+int save_i387_soft(void *s387, struct _fpstate __user *buf);
 
 /* This structure matches the layout of the data saved to the stack
    following a device-not-present interrupt, part of it saved
diff -Nru a/include/asm-i386/pc9800.h b/include/asm-i386/pc9800.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-i386/pc9800.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,27 @@
+/*
+ *  PC-9800 machine types.
+ *
+ *  Copyright (C) 1999	TAKAI Kosuke <tak@kmc.kyoto-u.ac.jp>
+ *			(Linux/98 Project)
+ */
+
+#ifndef _ASM_PC9800_H_
+#define _ASM_PC9800_H_
+
+#include <asm/pc9800_sca.h>
+#include <asm/types.h>
+
+#define __PC9800SCA(type, pa)	(*(type *) phys_to_virt(pa))
+#define __PC9800SCA_TEST_BIT(pa, n)	\
+	((__PC9800SCA(u8, pa) & (1U << (n))) != 0)
+
+#define PC9800_HIGHRESO_P()	__PC9800SCA_TEST_BIT(PC9800SCA_BIOS_FLAG, 3)
+#define PC9800_8MHz_P()		__PC9800SCA_TEST_BIT(PC9800SCA_BIOS_FLAG, 7)
+
+				/* 0x2198 is 98 21 on memory... */
+#define PC9800_9821_P()		(__PC9800SCA(u16, PC9821SCA_ROM_ID) == 0x2198)
+
+/* Note PC9821_...() are valid only when PC9800_9821_P() was true. */
+#define PC9821_IDEIF_DOUBLE_P()	__PC9800SCA_TEST_BIT(PC9821SCA_ROM_FLAG4, 4)
+
+#endif
diff -Nru a/include/asm-i386/posix_types.h b/include/asm-i386/posix_types.h
--- a/include/asm-i386/posix_types.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-i386/posix_types.h	Sat Apr 19 19:51:50 2003
@@ -33,6 +33,7 @@
 
 typedef unsigned short	__kernel_old_uid_t;
 typedef unsigned short	__kernel_old_gid_t;
+typedef unsigned short	__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long	__kernel_loff_t;
diff -Nru a/include/asm-i386/processor.h b/include/asm-i386/processor.h
--- a/include/asm-i386/processor.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-i386/processor.h	Sat Apr 19 19:51:28 2003
@@ -93,7 +93,7 @@
 #define current_cpu_data boot_cpu_data
 #endif
 
-extern char ignore_irq13;
+extern char ignore_fpu_irq;
 
 extern void identify_cpu(struct cpuinfo_x86 *);
 extern void print_cpu_info(struct cpuinfo_x86 *);
@@ -257,6 +257,7 @@
 
 /*
  * Bus types (default is ISA, but people can check others with these..)
+ * pc98 indicates PC98 systems (CBUS)
  */
 #ifdef CONFIG_EISA
 extern int EISA_bus;
@@ -264,6 +265,12 @@
 #define EISA_bus (0)
 #endif
 extern int MCA_bus;
+#ifdef CONFIG_X86_PC9800
+#define pc98 1
+#else
+#define pc98 0
+#endif
+
 
 /* from system description table in BIOS.  Mostly for MCA use, but
 others may find it useful. */
diff -Nru a/include/asm-i386/setup.h b/include/asm-i386/setup.h
--- a/include/asm-i386/setup.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-i386/setup.h	Sat Apr 19 19:51:49 2003
@@ -37,6 +37,7 @@
 #define KERNEL_START (*(unsigned long *) (PARAM+0x214))
 #define INITRD_START (*(unsigned long *) (PARAM+0x218))
 #define INITRD_SIZE (*(unsigned long *) (PARAM+0x21c))
+#define EDID_INFO   (*(struct edid_info *) (PARAM+0x440))
 #define EDD_NR     (*(unsigned char *) (PARAM+EDDNR))
 #define EDD_BUF     ((struct edd_info *) (PARAM+EDDBUF))
 #define COMMAND_LINE ((char *) (PARAM+2048))
diff -Nru a/include/asm-i386/sigcontext.h b/include/asm-i386/sigcontext.h
--- a/include/asm-i386/sigcontext.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-i386/sigcontext.h	Sat Apr 19 19:51:29 2003
@@ -1,6 +1,8 @@
 #ifndef _ASMi386_SIGCONTEXT_H
 #define _ASMi386_SIGCONTEXT_H
 
+#include <linux/compiler.h>
+
 /*
  * As documented in the iBCS2 standard..
  *
@@ -74,7 +76,7 @@
 	unsigned long eflags;
 	unsigned long esp_at_signal;
 	unsigned short ss, __ssh;
-	struct _fpstate * fpstate;
+	struct _fpstate __user * fpstate;
 	unsigned long oldmask;
 	unsigned long cr2;
 };
diff -Nru a/include/asm-i386/signal.h b/include/asm-i386/signal.h
--- a/include/asm-i386/signal.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-i386/signal.h	Sat Apr 19 19:51:28 2003
@@ -86,13 +86,13 @@
  * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
  * Unix names RESETHAND and NODEFER respectively.
  */
-#define SA_NOCLDSTOP	0x00000001
-#define SA_NOCLDWAIT	0x00000002
-#define SA_SIGINFO	0x00000004
-#define SA_ONSTACK	0x08000000
-#define SA_RESTART	0x10000000
-#define SA_NODEFER	0x40000000
-#define SA_RESETHAND	0x80000000
+#define SA_NOCLDSTOP	0x00000001u
+#define SA_NOCLDWAIT	0x00000002u
+#define SA_SIGINFO	0x00000004u
+#define SA_ONSTACK	0x08000000u
+#define SA_RESTART	0x10000000u
+#define SA_NODEFER	0x40000000u
+#define SA_RESETHAND	0x80000000u
 
 #define SA_NOMASK	SA_NODEFER
 #define SA_ONESHOT	SA_RESETHAND
diff -Nru a/include/asm-i386/string.h b/include/asm-i386/string.h
--- a/include/asm-i386/string.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-i386/string.h	Sat Apr 19 19:51:51 2003
@@ -214,49 +214,9 @@
  */
 static inline void * __constant_memcpy(void * to, const void * from, size_t n)
 {
-	switch (n) {
-		case 0:
-			return to;
-		case 1:
-			*(unsigned char *)to = *(const unsigned char *)from;
-			return to;
-		case 2:
-			*(unsigned short *)to = *(const unsigned short *)from;
-			return to;
-		case 3:
-			*(unsigned short *)to = *(const unsigned short *)from;
-			*(2+(unsigned char *)to) = *(2+(const unsigned char *)from);
-			return to;
-		case 4:
-			*(unsigned long *)to = *(const unsigned long *)from;
-			return to;
-		case 6:	/* for Ethernet addresses */
-			*(unsigned long *)to = *(const unsigned long *)from;
-			*(2+(unsigned short *)to) = *(2+(const unsigned short *)from);
-			return to;
-		case 8:
-			*(unsigned long *)to = *(const unsigned long *)from;
-			*(1+(unsigned long *)to) = *(1+(const unsigned long *)from);
-			return to;
-		case 12:
-			*(unsigned long *)to = *(const unsigned long *)from;
-			*(1+(unsigned long *)to) = *(1+(const unsigned long *)from);
-			*(2+(unsigned long *)to) = *(2+(const unsigned long *)from);
-			return to;
-		case 16:
-			*(unsigned long *)to = *(const unsigned long *)from;
-			*(1+(unsigned long *)to) = *(1+(const unsigned long *)from);
-			*(2+(unsigned long *)to) = *(2+(const unsigned long *)from);
-			*(3+(unsigned long *)to) = *(3+(const unsigned long *)from);
-			return to;
-		case 20:
-			*(unsigned long *)to = *(const unsigned long *)from;
-			*(1+(unsigned long *)to) = *(1+(const unsigned long *)from);
-			*(2+(unsigned long *)to) = *(2+(const unsigned long *)from);
-			*(3+(unsigned long *)to) = *(3+(const unsigned long *)from);
-			*(4+(unsigned long *)to) = *(4+(const unsigned long *)from);
-			return to;
-	}
+	if (n <= 128)
+		return __builtin_memcpy(to, from, n);
+
 #define COMMON(x) \
 __asm__ __volatile__( \
 	"rep ; movsl" \
diff -Nru a/include/asm-i386/system.h b/include/asm-i386/system.h
--- a/include/asm-i386/system.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-i386/system.h	Sat Apr 19 19:51:27 2003
@@ -378,8 +378,8 @@
 #define set_wmb(var, value) do { var = value; wmb(); } while (0)
 
 /* interrupt control.. */
-#define local_save_flags(x)	__asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
-#define local_irq_restore(x) 	__asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc")
+#define local_save_flags(x)	do { typecheck(unsigned long,x); __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */); } while (0)
+#define local_irq_restore(x) 	do { typecheck(unsigned long,x); __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc"); } while (0)
 #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 */
diff -Nru a/include/asm-i386/uaccess.h b/include/asm-i386/uaccess.h
--- a/include/asm-i386/uaccess.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-i386/uaccess.h	Sat Apr 19 19:51:28 2003
@@ -110,7 +110,7 @@
  *
  * See access_ok() for more details.
  */
-static inline int verify_area(int type, const void * addr, unsigned long size)
+static inline int verify_area(int type, const void __user * addr, unsigned long size)
 {
 	return access_ok(type,addr,size) ? 0 : -EFAULT;
 }
@@ -373,8 +373,8 @@
 		: "m"(__m(addr)), "i"(errret), "0"(err))
 
 
-unsigned long __copy_to_user_ll(void *to, const void *from, unsigned long n);
-unsigned long __copy_from_user_ll(void *to, const void *from, unsigned long n);
+unsigned long __copy_to_user_ll(void __user *to, const void *from, unsigned long n);
+unsigned long __copy_from_user_ll(void *to, const void __user *from, unsigned long n);
 
 /*
  * Here we special-case 1, 2 and 4-byte copy_*_user invocations.  On a fault
@@ -398,7 +398,7 @@
  * On success, this will be zero.
  */
 static inline unsigned long
-__copy_to_user(void *to, const void *from, unsigned long n)
+__copy_to_user(void __user *to, const void *from, unsigned long n)
 {
 	if (__builtin_constant_p(n)) {
 		unsigned long ret;
@@ -436,7 +436,7 @@
  * data to the requested size using zero bytes.
  */
 static inline unsigned long
-__copy_from_user(void *to, const void *from, unsigned long n)
+__copy_from_user(void *to, const void __user *from, unsigned long n)
 {
 	if (__builtin_constant_p(n)) {
 		unsigned long ret;
@@ -470,7 +470,7 @@
  * On success, this will be zero.
  */
 static inline unsigned long
-copy_to_user(void *to, const void *from, unsigned long n)
+copy_to_user(void __user *to, const void *from, unsigned long n)
 {
 	if (access_ok(VERIFY_WRITE, to, n))
 		n = __copy_to_user(to, from, n);
@@ -494,15 +494,15 @@
  * data to the requested size using zero bytes.
  */
 static inline unsigned long
-copy_from_user(void *to, const void *from, unsigned long n)
+copy_from_user(void *to, const void __user *from, unsigned long n)
 {
 	if (access_ok(VERIFY_READ, from, n))
 		n = __copy_from_user(to, from, n);
 	return n;
 }
 
-long strncpy_from_user(char *dst, const char *src, long count);
-long __strncpy_from_user(char *dst, const char *src, long count);
+long strncpy_from_user(char *dst, const char __user *src, long count);
+long __strncpy_from_user(char *dst, const char __user *src, long count);
 
 /**
  * strlen_user: - Get the size of a string in user space.
@@ -520,8 +520,8 @@
  */
 #define strlen_user(str) strnlen_user(str, ~0UL >> 1)
 
-long strnlen_user(const char *str, long n);
-unsigned long clear_user(void *mem, unsigned long len);
-unsigned long __clear_user(void *mem, unsigned long len);
+long strnlen_user(const char __user *str, long n);
+unsigned long clear_user(void __user *mem, unsigned long len);
+unsigned long __clear_user(void __user *mem, unsigned long len);
 
 #endif /* __i386_UACCESS_H */
diff -Nru a/include/asm-ia64/acpi-ext.h b/include/asm-ia64/acpi-ext.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-ia64/acpi-ext.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,32 @@
+/*
+ * ia64/platform/hp/common/hp_acpi.h
+ *
+ * Copyright (C) 2003 Hewlett-Packard
+ * Copyright (C) Alex Williamson
+ *
+ * Vendor specific extensions to ACPI.  The HP-specific extensiosn are also used by NEC.
+ */
+#ifndef _ASM_IA64_ACPI_EXT_H
+#define _ASM_IA64_ACPI_EXT_H
+
+#include <linux/types.h>
+
+#define HP_CCSR_LENGTH	0x21
+#define HP_CCSR_TYPE	0x2
+#define HP_CCSR_GUID	EFI_GUID(0x69e9adf9, 0x924f, 0xab5f, \
+				 0xf6, 0x4a, 0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad)
+
+struct acpi_hp_vendor_long {
+	u8      guid_id;
+	u8      guid[16];
+	u8      csr_base[8];
+	u8      csr_length[8];
+};
+
+extern acpi_status hp_acpi_csr_space (acpi_handle, u64 *base, u64 *length);
+extern acpi_status acpi_get_crs (acpi_handle, struct acpi_buffer *);
+extern struct acpi_resource *acpi_get_crs_next (struct acpi_buffer *, int *);
+extern union acpi_resource_data *acpi_get_crs_type (struct acpi_buffer *, int *, int);
+extern void acpi_dispose_crs (struct acpi_buffer *);
+
+#endif /* _ASM_IA64_ACPI_EXT_H */
diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h
--- a/include/asm-ia64/acpi.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ia64/acpi.h	Sat Apr 19 19:51:50 2003
@@ -100,7 +100,9 @@
 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/atomic.h b/include/asm-ia64/atomic.h
--- a/include/asm-ia64/atomic.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ia64/atomic.h	Sat Apr 19 19:51:28 2003
@@ -55,6 +55,13 @@
 	return new;
 }
 
+#define atomic_add_return(i,v)						\
+	((__builtin_constant_p(i) &&					\
+	  (   (i ==  1) || (i ==  4) || (i ==  8) || (i ==  16)		\
+	   || (i == -1) || (i == -4) || (i == -8) || (i == -16)))	\
+	 ? ia64_fetch_and_add(i, &(v)->counter)				\
+	 : ia64_atomic_add(i, v))
+
 /*
  * Atomically add I to V and return TRUE if the resulting value is
  * negative.
@@ -62,15 +69,9 @@
 static __inline__ int
 atomic_add_negative (int i, atomic_t *v)
 {
-	return ia64_atomic_add(i, v) < 0;
+	return atomic_add_return(i, v) < 0;
 }
 
-#define atomic_add_return(i,v)						\
-	((__builtin_constant_p(i) &&					\
-	  (   (i ==  1) || (i ==  4) || (i ==  8) || (i ==  16)		\
-	   || (i == -1) || (i == -4) || (i == -8) || (i == -16)))	\
-	 ? ia64_fetch_and_add(i, &(v)->counter)				\
-	 : ia64_atomic_add(i, v))
 
 #define atomic_sub_return(i,v)						\
 	((__builtin_constant_p(i) &&					\
diff -Nru a/include/asm-ia64/bitops.h b/include/asm-ia64/bitops.h
--- a/include/asm-ia64/bitops.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ia64/bitops.h	Sat Apr 19 19:51:50 2003
@@ -275,7 +275,7 @@
 }
 
 static __inline__ int
-test_bit (int nr, volatile void *addr)
+test_bit (int nr, const volatile void *addr)
 {
 	return 1 & (((const volatile __u32 *) addr)[nr >> 5] >> (nr & 31));
 }
@@ -453,7 +453,9 @@
 #define __clear_bit(nr, addr)        clear_bit(nr, addr)
 
 #define ext2_set_bit                 test_and_set_bit
+#define ext2_set_atomic(l,n,a)	     test_and_set_bit(n,a)
 #define ext2_clear_bit               test_and_clear_bit
+#define ext2_clear_atomic(l,n,a)     test_and_clear_bit(n,a)
 #define ext2_test_bit                test_bit
 #define ext2_find_first_zero_bit     find_first_zero_bit
 #define ext2_find_next_zero_bit      find_next_zero_bit
diff -Nru a/include/asm-ia64/cacheflush.h b/include/asm-ia64/cacheflush.h
--- a/include/asm-ia64/cacheflush.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ia64/cacheflush.h	Sat Apr 19 19:51:28 2003
@@ -20,7 +20,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_icache_page(vma,page)		do { } while (0)
 
 #define flush_dcache_page(page)			\
diff -Nru a/include/asm-ia64/compat.h b/include/asm-ia64/compat.h
--- a/include/asm-ia64/compat.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ia64/compat.h	Sat Apr 19 19:51:50 2003
@@ -27,6 +27,11 @@
 typedef u32		compat_caddr_t;
 typedef __kernel_fsid_t	compat_fsid_t;
 
+typedef s32		compat_int_t;
+typedef s32		compat_long_t;
+typedef u32		compat_uint_t;
+typedef u32		compat_ulong_t;
+
 struct compat_timespec {
 	compat_time_t	tv_sec;
 	s32		tv_nsec;
@@ -68,6 +73,22 @@
 	compat_pid_t	l_pid;
 };
 
+#define F_GETLK64	12
+#define F_SETLK64	13
+#define F_SETLKW64	14
+
+/*
+ * IA32 uses 4 byte alignment for 64 bit quantities,
+ * so we need to pack this structure.
+ */
+struct compat_flock64 {
+	short		l_type;
+	short		l_whence;
+	compat_loff_t	l_start;
+	compat_loff_t	l_len;
+	compat_pid_t	l_pid;
+} __attribute__((packed));
+
 struct compat_statfs {
 	int		f_type;
 	int		f_bsize;
@@ -87,5 +108,21 @@
 #define _COMPAT_NSIG_BPW	32
 
 typedef u32		compat_sigset_word;
+
+#define COMPAT_OFF_T_MAX	0x7fffffff
+#define COMPAT_LOFF_T_MAX	0x7fffffffffffffffL
+
+/*
+ * A pointer passed in from user mode. This should not be used for syscall parameters,
+ * just declare them as pointers because the syscall entry code will have appropriately
+ * comverted them already.
+ */
+typedef	u32		compat_uptr_t;
+
+static inline void *
+compat_ptr (compat_uptr_t uptr)
+{
+	return (void *) (unsigned long) uptr;
+}
 
 #endif /* _ASM_IA64_COMPAT_H */
diff -Nru a/include/asm-ia64/fcntl.h b/include/asm-ia64/fcntl.h
--- a/include/asm-ia64/fcntl.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-ia64/fcntl.h	Sat Apr 19 19:51:48 2003
@@ -78,9 +78,6 @@
 	pid_t l_pid;
 };
 
-#ifdef __KERNEL__
-# define flock64	flock
-#endif
-
 #define F_LINUX_SPECIFIC_BASE	1024
+
 #endif /* _ASM_IA64_FCNTL_H */
diff -Nru a/include/asm-ia64/fpu.h b/include/asm-ia64/fpu.h
--- a/include/asm-ia64/fpu.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ia64/fpu.h	Sat Apr 19 19:51:50 2003
@@ -2,7 +2,7 @@
 #define _ASM_IA64_FPU_H
 
 /*
- * Copyright (C) 1998, 1999, 2002 Hewlett-Packard Co
+ * Copyright (C) 1998, 1999, 2002, 2003 Hewlett-Packard Co
  *	David Mosberger-Tang <davidm@hpl.hp.com>
  */
 
@@ -57,8 +57,9 @@
 struct ia64_fpreg {
 	union {
 		unsigned long bits[2];
+		long double __dummy;	/* force 16-byte alignment */
 	} u;
-} __attribute__ ((aligned (16)));
+};
 
 # endif /* __ASSEMBLY__ */
 
diff -Nru a/include/asm-ia64/ia32.h b/include/asm-ia64/ia32.h
--- a/include/asm-ia64/ia32.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-ia64/ia32.h	Sat Apr 19 19:51:51 2003
@@ -18,10 +18,6 @@
 #define IA32_PAGE_ALIGN(addr)	(((addr) + IA32_PAGE_SIZE - 1) & IA32_PAGE_MASK)
 #define IA32_CLOCKS_PER_SEC	100	/* Cast in stone for IA32 Linux */
 
-#define F_GETLK64	12
-#define F_SETLK64	13
-#define F_SETLKW64	14
-
 /* sigcontext.h */
 /*
  * As documented in the iBCS2 standard..
@@ -214,8 +210,11 @@
 
 		/* POSIX.1b timers */
 		struct {
-			unsigned int _timer1;
-			unsigned int _timer2;
+			timer_t _tid;		/* timer id */
+			int _overrun;		/* overrun count */
+			char _pad[sizeof(unsigned int) - sizeof(int)];
+			sigval_t32 _sigval;	/* same as below */
+			int _sys_private;       /* not to be passed to user */
 		} _timer;
 
 		/* POSIX.1b signals */
diff -Nru a/include/asm-ia64/intrinsics.h b/include/asm-ia64/intrinsics.h
--- a/include/asm-ia64/intrinsics.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-ia64/intrinsics.h	Sat Apr 19 19:51:48 2003
@@ -46,14 +46,10 @@
 		IA64_FETCHADD(_tmp, _v, -8, sizeof(*(v)));				\
 	else if ((i) == -4)								\
 		IA64_FETCHADD(_tmp, _v, -4, sizeof(*(v)));				\
-	else if ((i) == -2)								\
-		IA64_FETCHADD(_tmp, _v, -2, sizeof(*(v)));				\
 	else if ((i) == -1)								\
 		IA64_FETCHADD(_tmp, _v, -1, sizeof(*(v)));				\
 	else if ((i) == 1)								\
 		IA64_FETCHADD(_tmp, _v, 1, sizeof(*(v)));				\
-	else if ((i) == 2)								\
-		IA64_FETCHADD(_tmp, _v, 2, sizeof(*(v)));				\
 	else if ((i) == 4)								\
 		IA64_FETCHADD(_tmp, _v, 4, sizeof(*(v)));				\
 	else if ((i) == 8)								\
diff -Nru a/include/asm-ia64/io.h b/include/asm-ia64/io.h
--- a/include/asm-ia64/io.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ia64/io.h	Sat Apr 19 19:51:28 2003
@@ -69,22 +69,6 @@
  */
 #define __ia64_mf_a()	__asm__ __volatile__ ("mf.a" ::: "memory")
 
-/**
- * __ia64_mmiob - I/O space memory barrier
- *
- * Acts as a memory mapped I/O barrier for platforms that queue writes to
- * I/O space.  This ensures that subsequent writes to I/O space arrive after
- * all previous writes.  For most ia64 platforms, this is a simple
- * 'mf.a' instruction, so the address is ignored.  For other platforms,
- * the address may be required to ensure proper ordering of writes to I/O space
- * since a 'dummy' read might be necessary to barrier the write operation.
- */
-static inline void
-__ia64_mmiob (void)
-{
-	__ia64_mf_a();
-}
-
 static inline const unsigned long
 __ia64_get_io_port_base (void)
 {
@@ -287,7 +271,6 @@
 #define __outb		platform_outb
 #define __outw		platform_outw
 #define __outl		platform_outl
-#define __mmiob         platform_mmiob
 
 #define inb(p)		__inb(p)
 #define inw(p)		__inw(p)
@@ -301,31 +284,35 @@
 #define outsb(p,s,c)	__outsb(p,s,c)
 #define outsw(p,s,c)	__outsw(p,s,c)
 #define outsl(p,s,c)	__outsl(p,s,c)
-#define mmiob()		__mmiob()
 
 /*
  * The address passed to these functions are ioremap()ped already.
+ *
+ * We need these to be machine vectors since some platforms don't provide
+ * DMA coherence via PIO reads (PCI drivers and the spec imply that this is
+ * a good idea).  Writes are ok though for all existing ia64 platforms (and
+ * hopefully it'll stay that way).
  */
 static inline unsigned char
-__readb (void *addr)
+__ia64_readb (void *addr)
 {
 	return *(volatile unsigned char *)addr;
 }
 
 static inline unsigned short
-__readw (void *addr)
+__ia64_readw (void *addr)
 {
 	return *(volatile unsigned short *)addr;
 }
 
 static inline unsigned int
-__readl (void *addr)
+__ia64_readl (void *addr)
 {
 	return *(volatile unsigned int *) addr;
 }
 
 static inline unsigned long
-__readq (void *addr)
+__ia64_readq (void *addr)
 {
 	return *(volatile unsigned long *) addr;
 }
@@ -353,6 +340,11 @@
 {
 	*(volatile unsigned long *) addr = val;
 }
+
+#define __readb		platform_readb
+#define __readw		platform_readw
+#define __readl		platform_readl
+#define __readq		platform_readq
 
 #define readb(a)	__readb((void *)(a))
 #define readw(a)	__readw((void *)(a))
diff -Nru a/include/asm-ia64/machvec.h b/include/asm-ia64/machvec.h
--- a/include/asm-ia64/machvec.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-ia64/machvec.h	Sat Apr 19 19:51:48 2003
@@ -43,7 +43,6 @@
 typedef void ia64_mv_pci_unmap_sg (struct pci_dev *, struct scatterlist *, int, int);
 typedef void ia64_mv_pci_dma_sync_single (struct pci_dev *, dma_addr_t, size_t, int);
 typedef void ia64_mv_pci_dma_sync_sg (struct pci_dev *, struct scatterlist *, int, int);
-typedef unsigned long ia64_mv_pci_dma_address (struct scatterlist *);
 typedef int ia64_mv_pci_dma_supported (struct pci_dev *, u64);
 
 /*
@@ -61,7 +60,10 @@
 typedef void ia64_mv_outb_t (unsigned char, unsigned long);
 typedef void ia64_mv_outw_t (unsigned short, unsigned long);
 typedef void ia64_mv_outl_t (unsigned int, unsigned long);
-typedef void ia64_mv_mmiob_t (void);
+typedef unsigned char ia64_mv_readb_t (void *);
+typedef unsigned short ia64_mv_readw_t (void *);
+typedef unsigned int ia64_mv_readl_t (void *);
+typedef unsigned long ia64_mv_readq_t (void *);
 
 extern void machvec_noop (void);
 
@@ -99,7 +101,6 @@
 #  define platform_pci_unmap_sg		ia64_mv.unmap_sg
 #  define platform_pci_dma_sync_single	ia64_mv.sync_single
 #  define platform_pci_dma_sync_sg	ia64_mv.sync_sg
-#  define platform_pci_dma_address	ia64_mv.dma_address
 #  define platform_pci_dma_supported	ia64_mv.dma_supported
 #  define platform_irq_desc		ia64_mv.irq_desc
 #  define platform_irq_to_vector	ia64_mv.irq_to_vector
@@ -110,7 +111,10 @@
 #  define platform_outb		ia64_mv.outb
 #  define platform_outw		ia64_mv.outw
 #  define platform_outl		ia64_mv.outl
-#  define platofrm_mmiob        ia64_mv.mmiob
+#  define platform_readb        ia64_mv.readb
+#  define platform_readw        ia64_mv.readw
+#  define platform_readl        ia64_mv.readl
+#  define platform_readq        ia64_mv.readq
 # endif
 
 /* __attribute__((__aligned__(16))) is required to make size of the
@@ -138,7 +142,6 @@
 	ia64_mv_pci_unmap_sg *unmap_sg;
 	ia64_mv_pci_dma_sync_single *sync_single;
 	ia64_mv_pci_dma_sync_sg *sync_sg;
-	ia64_mv_pci_dma_address *dma_address;
 	ia64_mv_pci_dma_supported *dma_supported;
 	ia64_mv_irq_desc *irq_desc;
 	ia64_mv_irq_to_vector *irq_to_vector;
@@ -149,8 +152,11 @@
 	ia64_mv_outb_t *outb;
 	ia64_mv_outw_t *outw;
 	ia64_mv_outl_t *outl;
-	ia64_mv_mmiob_t *mmiob;
-} __attribute__((__aligned__(16)));
+	ia64_mv_readb_t *readb;
+	ia64_mv_readw_t *readw;
+	ia64_mv_readl_t *readl;
+	ia64_mv_readq_t *readq;
+};
 
 #define MACHVEC_INIT(name)			\
 {						\
@@ -173,7 +179,6 @@
 	platform_pci_unmap_sg,			\
 	platform_pci_dma_sync_single,		\
 	platform_pci_dma_sync_sg,		\
-	platform_pci_dma_address,		\
 	platform_pci_dma_supported,		\
 	platform_irq_desc,			\
 	platform_irq_to_vector,			\
@@ -184,7 +189,10 @@
 	platform_outb,				\
 	platform_outw,				\
 	platform_outl,				\
-        platform_mmiob                          \
+	platform_readb,				\
+	platform_readw,				\
+	platform_readl,				\
+	platform_readq,				\
 }
 
 extern struct ia64_machine_vector ia64_mv;
@@ -206,7 +214,6 @@
 extern ia64_mv_pci_unmap_sg swiotlb_unmap_sg;
 extern ia64_mv_pci_dma_sync_single swiotlb_sync_single;
 extern ia64_mv_pci_dma_sync_sg swiotlb_sync_sg;
-extern ia64_mv_pci_dma_address swiotlb_dma_address;
 extern ia64_mv_pci_dma_supported swiotlb_pci_dma_supported;
 
 /*
@@ -267,9 +274,6 @@
 #ifndef platform_pci_dma_sync_sg
 # define platform_pci_dma_sync_sg	swiotlb_sync_sg
 #endif
-#ifndef platform_pci_dma_address
-# define  platform_pci_dma_address	swiotlb_dma_address
-#endif
 #ifndef platform_pci_dma_supported
 # define  platform_pci_dma_supported	swiotlb_pci_dma_supported
 #endif
@@ -300,8 +304,17 @@
 #ifndef platform_outl
 # define platform_outl		__ia64_outl
 #endif
-#ifndef platform_mmiob
-# define platform_mmiob         __ia64_mmiob
+#ifndef platform_readb
+# define platform_readb		__ia64_readb
+#endif
+#ifndef platform_readw
+# define platform_readw		__ia64_readw
+#endif
+#ifndef platform_readl
+# define platform_readl		__ia64_readl
+#endif
+#ifndef platform_readq
+# define platform_readq		__ia64_readq
 #endif
 
 #endif /* _ASM_IA64_MACHVEC_H */
diff -Nru a/include/asm-ia64/machvec_hpzx1.h b/include/asm-ia64/machvec_hpzx1.h
--- a/include/asm-ia64/machvec_hpzx1.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ia64/machvec_hpzx1.h	Sat Apr 19 19:51:28 2003
@@ -8,7 +8,6 @@
 extern ia64_mv_pci_unmap_single sba_unmap_single;
 extern ia64_mv_pci_map_sg sba_map_sg;
 extern ia64_mv_pci_unmap_sg sba_unmap_sg;
-extern ia64_mv_pci_dma_address sba_dma_address;
 extern ia64_mv_pci_dma_supported sba_dma_supported;
 
 /*
@@ -29,7 +28,6 @@
 #define platform_pci_unmap_sg		sba_unmap_sg
 #define platform_pci_dma_sync_single	((ia64_mv_pci_dma_sync_single *) machvec_noop)
 #define platform_pci_dma_sync_sg	((ia64_mv_pci_dma_sync_sg *) machvec_noop)
-#define platform_pci_dma_address	sba_dma_address
 #define platform_pci_dma_supported	sba_dma_supported
 
 #endif /* _ASM_IA64_MACHVEC_HPZX1_h */
diff -Nru a/include/asm-ia64/machvec_init.h b/include/asm-ia64/machvec_init.h
--- a/include/asm-ia64/machvec_init.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ia64/machvec_init.h	Sat Apr 19 19:51:28 2003
@@ -16,7 +16,6 @@
 extern ia64_mv_outb_t __ia64_outb;
 extern ia64_mv_outw_t __ia64_outw;
 extern ia64_mv_outl_t __ia64_outl;
-extern ia64_mv_mmiob_t __ia64_mmiob;
 
 #define MACHVEC_HELPER(name)									\
  struct ia64_machine_vector machvec_##name __attribute__ ((unused, __section__ (".machvec")))	\
diff -Nru a/include/asm-ia64/machvec_sn1.h b/include/asm-ia64/machvec_sn1.h
--- a/include/asm-ia64/machvec_sn1.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-ia64/machvec_sn1.h	Sat Apr 19 19:51:49 2003
@@ -44,7 +44,6 @@
 extern ia64_mv_outb_t sn1_outb;
 extern ia64_mv_outw_t sn1_outw;
 extern ia64_mv_outl_t sn1_outl;
-extern ia64_mv_mmiob_t sn_mmiob;
 extern ia64_mv_pci_alloc_consistent	sn1_pci_alloc_consistent;
 extern ia64_mv_pci_free_consistent	sn1_pci_free_consistent;
 extern ia64_mv_pci_map_single		sn1_pci_map_single;
@@ -53,7 +52,6 @@
 extern ia64_mv_pci_unmap_sg		sn1_pci_unmap_sg;
 extern ia64_mv_pci_dma_sync_single	sn1_pci_dma_sync_single;
 extern ia64_mv_pci_dma_sync_sg		sn1_pci_dma_sync_sg;
-extern ia64_mv_pci_dma_address		sn1_dma_address;
 
 /*
  * This stuff has dual use!
@@ -74,7 +72,6 @@
 #define platform_outb		sn1_outb
 #define platform_outw		sn1_outw
 #define platform_outl		sn1_outl
-#define platform_mmiob          sn_mmiob
 #define platform_pci_dma_init	machvec_noop
 #define platform_pci_alloc_consistent	sn1_pci_alloc_consistent
 #define platform_pci_free_consistent	sn1_pci_free_consistent
@@ -84,6 +81,5 @@
 #define platform_pci_unmap_sg		sn1_pci_unmap_sg
 #define platform_pci_dma_sync_single	sn1_pci_dma_sync_single
 #define platform_pci_dma_sync_sg	sn1_pci_dma_sync_sg
-#define platform_pci_dma_address	sn1_dma_address
 
 #endif /* _ASM_IA64_MACHVEC_SN1_h */
diff -Nru a/include/asm-ia64/machvec_sn2.h b/include/asm-ia64/machvec_sn2.h
--- a/include/asm-ia64/machvec_sn2.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-ia64/machvec_sn2.h	Sat Apr 19 19:51:46 2003
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2002 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2002-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 
@@ -41,13 +41,16 @@
 extern ia64_mv_irq_desc sn_irq_desc;
 extern ia64_mv_irq_to_vector sn_irq_to_vector;
 extern ia64_mv_local_vector_to_irq sn_local_vector_to_irq;
-extern ia64_mv_inb_t sn_inb;
-extern ia64_mv_inw_t sn_inw;
-extern ia64_mv_inl_t sn_inl;
-extern ia64_mv_outb_t sn_outb;
-extern ia64_mv_outw_t sn_outw;
-extern ia64_mv_outl_t sn_outl;
-extern ia64_mv_mmiob_t			sn2_mmiob;
+extern ia64_mv_inb_t __sn_inb;
+extern ia64_mv_inw_t __sn_inw;
+extern ia64_mv_inl_t __sn_inl;
+extern ia64_mv_outb_t __sn_outb;
+extern ia64_mv_outw_t __sn_outw;
+extern ia64_mv_outl_t __sn_outl;
+extern ia64_mv_readb_t __sn_readb;
+extern ia64_mv_readw_t __sn_readw;
+extern ia64_mv_readl_t __sn_readl;
+extern ia64_mv_readq_t __sn_readq;
 extern ia64_mv_pci_alloc_consistent	sn_pci_alloc_consistent;
 extern ia64_mv_pci_free_consistent	sn_pci_free_consistent;
 extern ia64_mv_pci_map_single		sn_pci_map_single;
@@ -56,7 +59,6 @@
 extern ia64_mv_pci_unmap_sg		sn_pci_unmap_sg;
 extern ia64_mv_pci_dma_sync_single	sn_pci_dma_sync_single;
 extern ia64_mv_pci_dma_sync_sg		sn_pci_dma_sync_sg;
-extern ia64_mv_pci_dma_address		sn_dma_address;
 extern ia64_mv_pci_dma_supported	sn_pci_dma_supported;
 
 /*
@@ -72,13 +74,17 @@
 #define platform_irq_init		sn_irq_init
 #define platform_send_ipi		sn2_send_IPI
 #define platform_global_tlb_purge       sn2_global_tlb_purge
-#define platform_inb			sn_inb
-#define platform_inw			sn_inw
-#define platform_inl			sn_inl
-#define platform_outb			sn_outb
-#define platform_outw			sn_outw
-#define platform_outl			sn_outl
-#define platform_mmiob			sn2_mmiob
+#define platform_pci_fixup		sn_pci_fixup
+#define platform_inb			__sn_inb
+#define platform_inw			__sn_inw
+#define platform_inl			__sn_inl
+#define platform_outb			__sn_outb
+#define platform_outw			__sn_outw
+#define platform_outl			__sn_outl
+#define platform_readb			__sn_readb
+#define platform_readw			__sn_readw
+#define platform_readl			__sn_readl
+#define platform_readq			__sn_readq
 #define platform_irq_desc		sn_irq_desc
 #define platform_irq_to_vector		sn_irq_to_vector
 #define platform_local_vector_to_irq	sn_local_vector_to_irq
@@ -91,7 +97,6 @@
 #define platform_pci_unmap_sg		sn_pci_unmap_sg
 #define platform_pci_dma_sync_single	sn_pci_dma_sync_single
 #define platform_pci_dma_sync_sg	sn_pci_dma_sync_sg
-#define platform_pci_dma_address	sn_dma_address
 #define platform_pci_dma_supported	sn_pci_dma_supported
 
 #endif /* _ASM_IA64_MACHVEC_SN2_H */
diff -Nru a/include/asm-ia64/mca.h b/include/asm-ia64/mca.h
--- a/include/asm-ia64/mca.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-ia64/mca.h	Sat Apr 19 19:51:29 2003
@@ -24,7 +24,7 @@
 	IA64_MCA_FAILURE	=	1
 };
 
-#define IA64_MCA_RENDEZ_TIMEOUT		(100 * HZ)	/* 1000 milliseconds */
+#define IA64_MCA_RENDEZ_TIMEOUT		(20 * 1000)	/* value in milliseconds - 20 seconds */
 
 #define IA64_CMC_INT_DISABLE		0
 #define IA64_CMC_INT_ENABLE		1
diff -Nru a/include/asm-ia64/module.h b/include/asm-ia64/module.h
--- a/include/asm-ia64/module.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-ia64/module.h	Sat Apr 19 19:51:46 2003
@@ -1,6 +1,34 @@
 #ifndef _ASM_IA64_MODULE_H
 #define _ASM_IA64_MODULE_H
 
-/* Module support currently broken (due to in-kernel module loader).  */
+/*
+ * IA-64-specific support for kernel module loader.
+ *
+ * Copyright (C) 2003 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ */
+
+struct elf64_shdr;			/* forward declration */
+
+struct mod_arch_specific {
+	struct elf64_shdr *core_plt;	/* core PLT section */
+	struct elf64_shdr *init_plt;	/* init PLT section */
+	struct elf64_shdr *got;		/* global offset table */
+	struct elf64_shdr *opd;		/* official procedure descriptors */
+	struct elf64_shdr *unwind;	/* unwind-table section */
+	unsigned long gp;		/* global-pointer for module */
+
+	void *unw_table;		/* unwind-table cookie returned by unwinder */
+	unsigned int next_got_entry;	/* index of next available got entry */
+};
+
+#define Elf_Shdr	Elf64_Shdr
+#define Elf_Sym		Elf64_Sym
+#define Elf_Ehdr	Elf64_Ehdr
+
+#define MODULE_PROC_FAMILY	"ia64"
+#define MODULE_ARCH_VERMAGIC	MODULE_PROC_FAMILY
+
+#define ARCH_SHF_SMALL	SHF_IA_64_SHORT
 
 #endif /* _ASM_IA64_MODULE_H */
diff -Nru a/include/asm-ia64/pci.h b/include/asm-ia64/pci.h
--- a/include/asm-ia64/pci.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ia64/pci.h	Sat Apr 19 19:51:50 2003
@@ -21,7 +21,7 @@
 #define PCIBIOS_MIN_MEM		0x10000000
 
 void pcibios_config_init(void);
-struct pci_bus * pcibios_scan_root(int bus);
+struct pci_bus * pcibios_scan_root(void *acpi_handle, int segment, int bus);
 
 struct pci_dev;
 
@@ -58,7 +58,6 @@
 #define pci_unmap_sg			platform_pci_unmap_sg
 #define pci_dma_sync_single		platform_pci_dma_sync_single
 #define pci_dma_sync_sg			platform_pci_dma_sync_sg
-#define sg_dma_address			platform_pci_dma_address
 #define pci_dma_supported		platform_pci_dma_supported
 
 /* pci_unmap_{single,page} is not a nop, thus... */
@@ -92,10 +91,22 @@
 #define pci_controller_num(PDEV)	(0)
 
 #define sg_dma_len(sg)		((sg)->dma_length)
+#define sg_dma_address(sg)	((sg)->dma_address)
 
 #define HAVE_PCI_MMAP
 extern int pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma,
 				enum pci_mmap_state mmap_state, int write_combine);
+
+struct pci_controller {
+	void *acpi_handle;
+	void *iommu;
+	int segment;
+
+	u64 mem_offset;
+};
+
+#define PCI_CONTROLLER(busdev) ((struct pci_controller *) busdev->sysdata)
+#define PCI_SEGMENT(busdev)    (PCI_CONTROLLER(busdev)->segment)
 
 /* generic pci stuff */
 #include <asm-generic/pci.h>
diff -Nru a/include/asm-ia64/pgtable.h b/include/asm-ia64/pgtable.h
--- a/include/asm-ia64/pgtable.h	Sat Apr 19 19:51:30 2003
+++ b/include/asm-ia64/pgtable.h	Sat Apr 19 19:51:30 2003
@@ -59,6 +59,9 @@
 #define _PAGE_ED		(__IA64_UL(1) << 52)	/* exception deferral */
 #define _PAGE_PROTNONE		(__IA64_UL(1) << 63)
 
+/* Valid only for a PTE with the present bit cleared: */
+#define _PAGE_FILE		(1 << 1)		/* see swap & file pte remarks below */
+
 #define _PFN_MASK		_PAGE_PPN_MASK
 #define _PAGE_CHG_MASK		(_PFN_MASK | _PAGE_A | _PAGE_D)
 
@@ -253,6 +256,7 @@
 #define pte_exec(pte)		((pte_val(pte) & _PAGE_AR_RX) != 0)
 #define pte_dirty(pte)		((pte_val(pte) & _PAGE_D) != 0)
 #define pte_young(pte)		((pte_val(pte) & _PAGE_A) != 0)
+#define pte_file(pte)		((pte_val(pte) & _PAGE_FILE) != 0)
 /*
  * Note: we convert AR_RWX to AR_RX and AR_RW to AR_R by clearing the 2nd bit in the
  * access rights:
@@ -402,11 +406,34 @@
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
 extern void paging_init (void);
 
-#define __swp_type(entry)		(((entry).val >> 1) & 0xff)
+/*
+ * Note: The macros below rely on the fact that MAX_SWAPFILES_SHIFT <= number of
+ *	 bits in the swap-type field of the swap pte.  It would be nice to
+ *	 enforce that, but we can't easily include <linux/swap.h> here.
+ *	 (Of course, better still would be to define MAX_SWAPFILES_SHIFT here...).
+ *
+ * Format of swap pte:
+ *	bit   0   : present bit (must be zero)
+ *	bit   1   : _PAGE_FILE (must be zero)
+ *	bits  2- 8: swap-type
+ *	bits  9-62: swap offset
+ *	bit  63   : _PAGE_PROTNONE bit
+ *
+ * Format of file pte:
+ *	bit   0   : present bit (must be zero)
+ *	bit   1   : _PAGE_FILE (must be one)
+ *	bits  2-62: file_offset/PAGE_SIZE
+ *	bit  63   : _PAGE_PROTNONE bit
+ */
+#define __swp_type(entry)		(((entry).val >> 2) & 0x7f)
 #define __swp_offset(entry)		(((entry).val << 1) >> 10)
-#define __swp_entry(type,offset)	((swp_entry_t) { ((type) << 1) | ((long) (offset) << 9) })
+#define __swp_entry(type,offset)	((swp_entry_t) { ((type) << 2) | ((long) (offset) << 9) })
 #define __pte_to_swp_entry(pte)		((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)		((pte_t) { (x).val })
+
+#define PTE_FILE_MAX_BITS		61
+#define pte_to_pgoff(pte)		((pte_val(pte) << 1) >> 3)
+#define pgoff_to_pte(off)		((pte_t) { ((off) << 2) | _PAGE_FILE })
 
 #define io_remap_page_range remap_page_range	/* XXX is this right? */
 
diff -Nru a/include/asm-ia64/posix_types.h b/include/asm-ia64/posix_types.h
--- a/include/asm-ia64/posix_types.h	Sat Apr 19 19:51:30 2003
+++ b/include/asm-ia64/posix_types.h	Sat Apr 19 19:51:30 2003
@@ -43,6 +43,8 @@
 typedef __kernel_uid_t __kernel_uid32_t;
 typedef __kernel_gid_t __kernel_gid32_t;
 
+typedef unsigned int	__kernel_old_dev_t;
+
 # ifdef __KERNEL__
 
 #  ifndef __GNUC__
diff -Nru a/include/asm-ia64/processor.h b/include/asm-ia64/processor.h
--- a/include/asm-ia64/processor.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-ia64/processor.h	Sat Apr 19 19:51:46 2003
@@ -379,7 +379,7 @@
 static inline unsigned long
 ia64_get_kr (unsigned long regnum)
 {
-	unsigned long r;
+	unsigned long r = 0;
 
 	switch (regnum) {
 	      case 0: asm volatile ("mov %0=ar.k0" : "=r"(r)); break;
@@ -915,13 +915,13 @@
 #define ARCH_HAS_SPINLOCK_PREFETCH
 #define PREFETCH_STRIDE 256
 
-extern inline void
+static inline void
 prefetch (const void *x)
 {
          __asm__ __volatile__ ("lfetch [%0]" : : "r"(x));
 }
 
-extern inline void
+static inline void
 prefetchw (const void *x)
 {
 	__asm__ __volatile__ ("lfetch.excl [%0]" : : "r"(x));
diff -Nru a/include/asm-ia64/sal.h b/include/asm-ia64/sal.h
--- a/include/asm-ia64/sal.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ia64/sal.h	Sat Apr 19 19:51:50 2003
@@ -36,14 +36,24 @@
 #define __SAL_CALL(result,a0,a1,a2,a3,a4,a5,a6,a7)	\
 	result = (*ia64_sal)(a0,a1,a2,a3,a4,a5,a6,a7)
 
-# define SAL_CALL(result,args...) do {			\
-	unsigned long flags;				\
-	struct ia64_fpreg fr[6];                        \
-	ia64_save_scratch_fpregs(fr);                   \
-	spin_lock_irqsave(&sal_lock, flags);		\
-	__SAL_CALL(result,args);			\
-	spin_unlock_irqrestore(&sal_lock, flags);	\
-	ia64_load_scratch_fpregs(fr);                   \
+# define SAL_CALL(result,args...) do {				\
+	unsigned long __ia64_sc_flags;				\
+	struct ia64_fpreg __ia64_sc_fr[6];			\
+	ia64_save_scratch_fpregs(__ia64_sc_fr);			\
+	spin_lock_irqsave(&sal_lock, __ia64_sc_flags);		\
+	__SAL_CALL(result, args);				\
+	spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags);	\
+	ia64_load_scratch_fpregs(__ia64_sc_fr);			\
+} while (0)
+
+# define SAL_CALL_NOLOCK(result,args...) do {		\
+	unsigned long __ia64_scn_flags;			\
+	struct ia64_fpreg __ia64_scn_fr[6];		\
+	ia64_save_scratch_fpregs(__ia64_scn_fr);	\
+	local_irq_save(__ia64_scn_flags);		\
+	__SAL_CALL(result, args);			\
+	local_irq_restore(__ia64_scn_flags);		\
+	ia64_load_scratch_fpregs(__ia64_scn_fr);	\
 } while (0)
 
 #define SAL_SET_VECTORS			0x01000000
@@ -686,13 +696,14 @@
 
 /*
  * Causes the processor to go into a spin loop within SAL where SAL awaits a wakeup from
- * the monarch processor.
+ * the monarch processor.  Must not lock, because it will not return on any cpu until the
+ * monarch processor sends a wake up.
  */
 static inline s64
 ia64_sal_mc_rendez (void)
 {
 	struct ia64_sal_retval isrv;
-	SAL_CALL(isrv, SAL_MC_RENDEZ, 0, 0, 0, 0, 0, 0, 0);
+	SAL_CALL_NOLOCK(isrv, SAL_MC_RENDEZ, 0, 0, 0, 0, 0, 0, 0);
 	return isrv.status;
 }
 
diff -Nru a/include/asm-ia64/smp.h b/include/asm-ia64/smp.h
--- a/include/asm-ia64/smp.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-ia64/smp.h	Sat Apr 19 19:51:47 2003
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1999 VA Linux Systems
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
- * Copyright (C) 2001-2002 Hewlett-Packard Co
+ * Copyright (C) 2001-2003 Hewlett-Packard Co
  *	David Mosberger-Tang <davidm@hpl.hp.com>
  */
 #ifndef _ASM_IA64_SMP_H
@@ -74,7 +74,7 @@
 	int i;
 
 	for (i = 0; i < NR_CPUS; ++i)
-		if (cpu_physical_id(i) == (__u32) cpuid)
+		if (cpu_physical_id(i) == cpuid)
 			break;
 	return i;
 }
diff -Nru a/include/asm-ia64/sn/io.h b/include/asm-ia64/sn/io.h
--- a/include/asm-ia64/sn/io.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ia64/sn/io.h	Sat Apr 19 19:51:28 2003
@@ -3,8 +3,8 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
+ * Copyright (C) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved.
  * Copyright (C) 2000 Ralf Baechle
- * Copyright (C) 2000-2001 Silicon Graphics, Inc.
  */
 #ifndef _ASM_IA64_SN_IO_H
 #define _ASM_IA64_SN_IO_H
@@ -77,5 +77,10 @@
 #include <asm/sn/sn2/shub.h>
 #include <asm/sn/sn2/shubio.h>
 #endif
+
+/*
+ * Used to ensure write ordering (like mb(), but for I/O space)
+ */
+extern void sn_mmiob(void);
 
 #endif /* _ASM_IA64_SN_IO_H */
diff -Nru a/include/asm-ia64/sn/sn2/io.h b/include/asm-ia64/sn/sn2/io.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-ia64/sn/sn2/io.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,206 @@
+/* 
+ * 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) 2000-2003 Silicon Graphics, Inc. All rights reserved.
+ */
+
+#ifndef _ASM_SN_SN2_IO_H
+#define _ASM_SN_SN2_IO_H
+
+extern void * sn_io_addr(unsigned long port); /* Forward definition */
+extern void sn_mmiob(void); /* Forward definition */
+
+#define __sn_mf_a()   __asm__ __volatile__ ("mf.a" ::: "memory")
+
+extern void sn_dma_flush(unsigned long);
+
+/*
+ * The following routines are SN Platform specific, called when
+ * a reference is made to inX/outX set macros.  SN Platform
+ * inX set of macros ensures that Posted DMA writes on the
+ * Bridge is flushed.
+ *
+ * The routines should be self explainatory.
+ */
+
+static inline unsigned int
+__sn_inb (unsigned long port)
+{
+	volatile unsigned char *addr = sn_io_addr(port);
+	unsigned char ret;
+
+	ret = *addr;
+	sn_dma_flush((unsigned long)addr);
+	__sn_mf_a();
+	return ret;
+}
+
+static inline unsigned int
+__sn_inw (unsigned long port)
+{
+	volatile unsigned short *addr = sn_io_addr(port);
+	unsigned short ret;
+
+	ret = *addr;
+	sn_dma_flush((unsigned long)addr);
+	__sn_mf_a();
+	return ret;
+}
+
+static inline unsigned int
+__sn_inl (unsigned long port)
+{
+	volatile unsigned int *addr = sn_io_addr(port);
+	unsigned int ret;
+
+	ret = *addr;
+	sn_dma_flush((unsigned long)addr);
+	__sn_mf_a();
+	return ret;
+}
+
+static inline void
+__sn_outb (unsigned char val, unsigned long port)
+{
+	volatile unsigned char *addr = sn_io_addr(port);
+
+	*addr = val;
+	sn_mmiob();
+}
+
+static inline void
+__sn_outw (unsigned short val, unsigned long port)
+{
+	volatile unsigned short *addr = sn_io_addr(port);
+
+	*addr = val;
+	sn_mmiob();
+}
+
+static inline void
+__sn_outl (unsigned int val, unsigned long port)
+{
+	volatile unsigned int *addr = sn_io_addr(port);
+
+	*addr = val;
+	sn_mmiob();
+}
+
+/*
+ * The following routines are SN Platform specific, called when 
+ * a reference is made to readX/writeX set macros.  SN Platform 
+ * readX set of macros ensures that Posted DMA writes on the 
+ * Bridge is flushed.
+ * 
+ * The routines should be self explainatory.
+ */
+
+static inline unsigned char
+__sn_readb (void *addr)
+{
+	unsigned char val;
+
+	val = *(volatile unsigned char *)addr;
+	sn_dma_flush((unsigned long)addr);
+        return val;
+}
+
+static inline unsigned short
+__sn_readw (void *addr)
+{
+	unsigned short val;
+
+	val = *(volatile unsigned short *)addr;
+	sn_dma_flush((unsigned long)addr);
+        return val;
+}
+
+static inline unsigned int
+__sn_readl (void *addr)
+{
+	unsigned int val;
+
+	val = *(volatile unsigned int *) addr;
+	sn_dma_flush((unsigned long)addr);
+        return val;
+}
+
+static inline unsigned long
+__sn_readq (void *addr)
+{
+	unsigned long val;
+
+	val = *(volatile unsigned long *) addr;
+	sn_dma_flush((unsigned long)addr);
+        return val;
+}
+
+/*
+ * For generic and SN2 kernels, we have a set of fast access
+ * PIO macros.	These macros are provided on SN Platform
+ * because the normal inX and readX macros perform an
+ * additional task of flushing Post DMA request on the Bridge.
+ *
+ * These routines should be self explainatory.
+ */
+
+static inline unsigned int
+sn_inb_fast (unsigned long port)
+{
+	volatile unsigned char *addr = (unsigned char *)port;
+	unsigned char ret;
+
+	ret = *addr;
+	__sn_mf_a();
+	return ret;
+}
+
+static inline unsigned int
+sn_inw_fast (unsigned long port)
+{
+	volatile unsigned short *addr = (unsigned short *)port;
+	unsigned short ret;
+
+	ret = *addr;
+	__sn_mf_a();
+	return ret;
+}
+
+static inline unsigned int
+sn_inl_fast (unsigned long port)
+{
+	volatile unsigned int *addr = (unsigned int *)port;
+	unsigned int ret;
+
+	ret = *addr;
+	__sn_mf_a();
+	return ret;
+}
+
+static inline unsigned char
+sn_readb_fast (void *addr)
+{
+	return *(volatile unsigned char *)addr;
+}
+
+static inline unsigned short
+sn_readw_fast (void *addr)
+{
+	return *(volatile unsigned short *)addr;
+}
+
+static inline unsigned int
+sn_readl_fast (void *addr)
+{
+	return *(volatile unsigned int *) addr;
+}
+
+static inline unsigned long
+sn_readq_fast (void *addr)
+{
+	return *(volatile unsigned long *) addr;
+}
+
+#endif
diff -Nru a/include/asm-ia64/spinlock.h b/include/asm-ia64/spinlock.h
--- a/include/asm-ia64/spinlock.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ia64/spinlock.h	Sat Apr 19 19:51:28 2003
@@ -2,7 +2,7 @@
 #define _ASM_IA64_SPINLOCK_H
 
 /*
- * Copyright (C) 1998-2002 Hewlett-Packard Co
+ * Copyright (C) 1998-2003 Hewlett-Packard Co
  *	David Mosberger-Tang <davidm@hpl.hp.com>
  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
  *
@@ -15,58 +15,6 @@
 #include <asm/bitops.h>
 #include <asm/atomic.h>
 
-#undef NEW_LOCK
-
-#ifdef NEW_LOCK
-
-typedef struct {
-	volatile unsigned int lock;
-} spinlock_t;
-
-#define SPIN_LOCK_UNLOCKED			(spinlock_t) { 0 }
-#define spin_lock_init(x)			((x)->lock = 0)
-
-/*
- * Streamlined test_and_set_bit(0, (x)).  We use test-and-test-and-set
- * rather than a simple xchg to avoid writing the cache-line when
- * there is contention.
- */
-#define _raw_spin_lock(x)								\
-{											\
-	register char *addr __asm__ ("r31") = (char *) &(x)->lock;			\
-											\
-	__asm__ __volatile__ (								\
-		"mov r30=1\n"								\
-		"mov ar.ccv=r0\n"							\
-		";;\n"									\
-		"cmpxchg4.acq r30=[%0],r30,ar.ccv\n"					\
-		";;\n"									\
-		"cmp.ne p15,p0=r30,r0\n"						\
-		"(p15) br.call.spnt.few b7=ia64_spinlock_contention\n"			\
-		";;\n"									\
-		"1:\n"				/* force a new bundle */		\
-		:: "r"(addr)								\
-		: "ar.ccv", "ar.pfs", "b7", "p15", "r28", "r29", "r30", "memory");	\
-}
-
-#define _raw_spin_trylock(x)								\
-({											\
-	register long result;								\
-											\
-	__asm__ __volatile__ (								\
-		"mov ar.ccv=r0\n"							\
-		";;\n"									\
-		"cmpxchg4.acq %0=[%2],%1,ar.ccv\n"					\
-		: "=r"(result) : "r"(1), "r"(&(x)->lock) : "ar.ccv", "memory");		\
-	(result == 0);									\
-})
-
-#define spin_is_locked(x)	((x)->lock != 0)
-#define _raw_spin_unlock(x)	do { barrier(); ((spinlock_t *) x)->lock = 0;} while (0)
-#define spin_unlock_wait(x)	do { barrier(); } while ((x)->lock)
-
-#else /* !NEW_LOCK */
-
 typedef struct {
 	volatile unsigned int lock;
 } spinlock_t;
@@ -123,8 +71,6 @@
 #define _raw_spin_trylock(x)	(cmpxchg_acq(&(x)->lock, 0, 1) == 0)
 #define spin_unlock_wait(x)	do { barrier(); } while ((x)->lock)
 
-#endif /* !NEW_LOCK */
-
 typedef struct {
 	volatile int read_counter:31;
 	volatile int write_lock:1;
@@ -136,7 +82,7 @@
 
 #define _raw_read_lock(rw)							\
 do {										\
-	int tmp = 0;								\
+	int __read_lock_tmp = 0;						\
 	__asm__ __volatile__ ("1:\tfetchadd4.acq %0 = [%1], 1\n"		\
 			      ";;\n"						\
 			      "tbit.nz p6,p0 = %0, 31\n"			\
@@ -151,15 +97,15 @@
 			      "br.cond.sptk.few 1b\n"				\
 			      ";;\n"						\
 			      ".previous\n"					\
-			      : "=&r" (tmp)					\
+			      : "=&r" (__read_lock_tmp)				\
 			      : "r" (rw) : "p6", "memory");			\
 } while(0)
 
 #define _raw_read_unlock(rw)							\
 do {										\
-	int tmp = 0;								\
+	int __read_unlock_tmp = 0;						\
 	__asm__ __volatile__ ("fetchadd4.rel %0 = [%1], -1\n"			\
-			      : "=r" (tmp)					\
+			      : "=r" (__read_unlock_tmp)			\
 			      : "r" (rw)					\
 			      : "memory");					\
 } while(0)
diff -Nru a/include/asm-ia64/system.h b/include/asm-ia64/system.h
--- a/include/asm-ia64/system.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-ia64/system.h	Sat Apr 19 19:51:46 2003
@@ -31,6 +31,7 @@
 #include <linux/types.h>
 
 struct pci_vector_struct {
+	__u16 segment;	/* PCI Segment number */
 	__u16 bus;	/* PCI Bus number */
 	__u32 pci_id;	/* ACPI split 16 bits device, 16 bits function (see section 6.1.1) */
 	__u8 pin;	/* PCI PIN (0 = A, 1 = B, 2 = C, 3 = D) */
@@ -108,7 +109,7 @@
 #define set_mb(var, value)	do { (var) = (value); mb(); } while (0)
 #define set_wmb(var, value)	do { (var) = (value); mb(); } while (0)
 
-#define safe_halt()         ia64_pal_halt(1)                /* PAL_HALT */
+#define safe_halt()         ia64_pal_halt_light()    /* PAL_HALT_LIGHT */
 
 /*
  * The group barrier in front of the rsm & ssm are necessary to ensure
diff -Nru a/include/asm-ia64/unaligned.h b/include/asm-ia64/unaligned.h
--- a/include/asm-ia64/unaligned.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ia64/unaligned.h	Sat Apr 19 19:51:50 2003
@@ -7,8 +7,8 @@
  * The main single-value unaligned transfer routines.  Derived from
  * the Linux/Alpha version.
  *
- * Copyright (C) 1998, 1999 Hewlett-Packard Co
- * Copyright (C) 1998, 1999 David Mosberger-Tang <davidm@hpl.hp.com>
+ * Copyright (C) 1998, 1999, 2003 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
  */
 #define get_unaligned(ptr) \
 	((__typeof__(*(ptr)))ia64_get_unaligned((ptr), sizeof(*(ptr))))
@@ -16,110 +16,105 @@
 #define put_unaligned(x,ptr) \
 	ia64_put_unaligned((unsigned long)(x), (ptr), sizeof(*(ptr)))
 
-/*
- * EGCS 1.1 knows about arbitrary unaligned loads.  Define some
- * packed structures to talk about such things with.
- */
 struct __una_u64 { __u64 x __attribute__((packed)); };
 struct __una_u32 { __u32 x __attribute__((packed)); };
 struct __una_u16 { __u16 x __attribute__((packed)); };
 
 static inline unsigned long
-__uldq (const unsigned long * r11)
+__uld8 (const unsigned long * addr)
 {
-	const struct __una_u64 *ptr = (const struct __una_u64 *) r11;
+	const struct __una_u64 *ptr = (const struct __una_u64 *) addr;
 	return ptr->x;
 }
 
 static inline unsigned long
-__uldl (const unsigned int * r11)
+__uld4 (const unsigned int * addr)
 {
-	const struct __una_u32 *ptr = (const struct __una_u32 *) r11;
+	const struct __una_u32 *ptr = (const struct __una_u32 *) addr;
 	return ptr->x;
 }
 
 static inline unsigned long
-__uldw (const unsigned short * r11)
+__uld2 (const unsigned short * addr)
 {
-	const struct __una_u16 *ptr = (const struct __una_u16 *) r11;
+	const struct __una_u16 *ptr = (const struct __una_u16 *) addr;
 	return ptr->x;
 }
 
 static inline void
-__ustq (unsigned long r5, unsigned long * r11)
+__ust8 (unsigned long val, unsigned long * addr)
 {
-	struct __una_u64 *ptr = (struct __una_u64 *) r11;
-	ptr->x = r5;
+	struct __una_u64 *ptr = (struct __una_u64 *) addr;
+	ptr->x = val;
 }
 
 static inline void
-__ustl (unsigned long r5, unsigned int * r11)
+__ust4 (unsigned long val, unsigned int * addr)
 {
-	struct __una_u32 *ptr = (struct __una_u32 *) r11;
-	ptr->x = r5;
+	struct __una_u32 *ptr = (struct __una_u32 *) addr;
+	ptr->x = val;
 }
 
 static inline void
-__ustw (unsigned long r5, unsigned short * r11)
+__ust2 (unsigned long val, unsigned short * addr)
 {
-	struct __una_u16 *ptr = (struct __una_u16 *) r11;
-	ptr->x = r5;
+	struct __una_u16 *ptr = (struct __una_u16 *) addr;
+	ptr->x = val;
 }
 
 
 /*
- * This function doesn't actually exist.  The idea is that when
- * someone uses the macros below with an unsupported size (datatype),
- * the linker will alert us to the problem via an unresolved reference
- * error.
+ * This function doesn't actually exist.  The idea is that when someone uses the macros
+ * below with an unsupported size (datatype), the linker will alert us to the problem via
+ * an unresolved reference error.
  */
 extern unsigned long ia64_bad_unaligned_access_length (void);
 
-#define ia64_get_unaligned(_ptr,size)				\
-({								\
-	const void *ptr = (_ptr);				\
-	unsigned long val;					\
-								\
-	switch (size) {						\
-	      case 1:						\
-		val = *(const unsigned char *) ptr;		\
-		break;						\
-	      case 2:						\
-		val = __uldw((const unsigned short *)ptr);	\
-		break;						\
-	      case 4:						\
-		val = __uldl((const unsigned int *)ptr);	\
-		break;						\
-	      case 8:						\
-		val = __uldq((const unsigned long *)ptr);	\
-		break;						\
-	      default:						\
-		val = ia64_bad_unaligned_access_length();	\
-	}							\
-	val;							\
+#define ia64_get_unaligned(_ptr,size)						\
+({										\
+	const void *__ia64_ptr = (_ptr);					\
+	unsigned long __ia64_val;						\
+										\
+	switch (size) {								\
+	      case 1:								\
+		__ia64_val = *(const unsigned char *) __ia64_ptr;		\
+		break;								\
+	      case 2:								\
+		__ia64_val = __uld2((const unsigned short *)__ia64_ptr);	\
+		break;								\
+	      case 4:								\
+		__ia64_val = __uld4((const unsigned int *)__ia64_ptr);		\
+		break;								\
+	      case 8:								\
+		__ia64_val = __uld8((const unsigned long *)__ia64_ptr);		\
+		break;								\
+	      default:								\
+		__ia64_val = ia64_bad_unaligned_access_length();		\
+	}									\
+	__ia64_val;								\
 })
 
-#define ia64_put_unaligned(_val,_ptr,size)		\
-do {							\
-	const void *ptr = (_ptr);			\
-	unsigned long val = (_val);			\
-							\
-	switch (size) {					\
-	      case 1:					\
-		*(unsigned char *)ptr = (val);		\
-	        break;					\
-	      case 2:					\
-		__ustw(val, (unsigned short *)ptr);	\
-		break;					\
-	      case 4:					\
-		__ustl(val, (unsigned int *)ptr);	\
-		break;					\
-	      case 8:					\
-		__ustq(val, (unsigned long *)ptr);	\
-		break;					\
-	      default:					\
-	    	ia64_bad_unaligned_access_length();	\
-	}						\
+#define ia64_put_unaligned(_val,_ptr,size)				\
+do {									\
+	const void *__ia64_ptr = (_ptr);				\
+	unsigned long __ia64_val = (_val);				\
+									\
+	switch (size) {							\
+	      case 1:							\
+		*(unsigned char *)__ia64_ptr = (__ia64_val);		\
+	        break;							\
+	      case 2:							\
+		__ust2(__ia64_val, (unsigned short *)__ia64_ptr);	\
+		break;							\
+	      case 4:							\
+		__ust4(__ia64_val, (unsigned int *)__ia64_ptr);		\
+		break;							\
+	      case 8:							\
+		__ust8(__ia64_val, (unsigned long *)__ia64_ptr);	\
+		break;							\
+	      default:							\
+	    	ia64_bad_unaligned_access_length();			\
+	}								\
 } while (0)
 
 #endif /* _ASM_IA64_UNALIGNED_H */
diff -Nru a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h
--- a/include/asm-m68k/bitops.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-m68k/bitops.h	Sat Apr 19 19:51:51 2003
@@ -365,6 +365,24 @@
 	return retval;
 }
 
+#define ext2_set_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_set_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
+#define ext2_clear_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_clear_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
 extern __inline__ int
 ext2_test_bit (int nr, const volatile void *vaddr)
 {
diff -Nru a/include/asm-m68k/cacheflush.h b/include/asm-m68k/cacheflush.h
--- a/include/asm-m68k/cacheflush.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-m68k/cacheflush.h	Sat Apr 19 19:51:49 2003
@@ -106,7 +106,6 @@
 
 /* Push the page at kernel virtual address and clear the icache */
 /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
-#define flush_page_to_ram(page) __flush_page_to_ram(page_address(page))
 extern inline void __flush_page_to_ram(void *vaddr)
 {
 	if (CPU_IS_040_OR_060) {
@@ -125,7 +124,7 @@
 	}
 }
 
-#define flush_dcache_page(page)			do { } while (0)
+#define flush_dcache_page(page)	__flush_page_to_ram(page_address(page))
 #define flush_icache_page(vma,pg)              do { } while (0)
 #define flush_icache_user_range(vma,pg,adr,len)	do { } while (0)
 
diff -Nru a/include/asm-m68k/page.h b/include/asm-m68k/page.h
--- a/include/asm-m68k/page.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-m68k/page.h	Sat Apr 19 19:51:51 2003
@@ -79,8 +79,14 @@
 #define copy_page(to,from)	memcpy((to), (from), PAGE_SIZE)
 #endif
 
-#define clear_user_page(page, vaddr, pg)	clear_page(page)
-#define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
+#define clear_user_page(addr, vaddr, page)	\
+	do { 	clear_page(addr);		\
+		flush_dcache_page(page);	\
+	} while (0)
+#define copy_user_page(to, from, vaddr, page)	\
+	do {	copy_page(to, from);		\
+		flush_dcache_page(page);	\
+	} while (0)
 
 /*
  * These are used to make use of C type-checking..
diff -Nru a/include/asm-m68k/posix_types.h b/include/asm-m68k/posix_types.h
--- a/include/asm-m68k/posix_types.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-m68k/posix_types.h	Sat Apr 19 19:51:28 2003
@@ -33,6 +33,7 @@
 
 typedef unsigned short	__kernel_old_uid_t;
 typedef unsigned short	__kernel_old_gid_t;
+typedef unsigned short	__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long	__kernel_loff_t;
diff -Nru a/include/asm-m68knommu/bitops.h b/include/asm-m68knommu/bitops.h
--- a/include/asm-m68knommu/bitops.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-m68knommu/bitops.h	Sat Apr 19 19:51:28 2003
@@ -402,6 +402,24 @@
 	return retval;
 }
 
+#define ext2_set_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_set_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
+#define ext2_clear_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_clear_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
 extern __inline__ int ext2_test_bit(int nr, const volatile void * addr)
 {
 	int	mask;
diff -Nru a/include/asm-m68knommu/cacheflush.h b/include/asm-m68knommu/cacheflush.h
--- a/include/asm-m68knommu/cacheflush.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-m68knommu/cacheflush.h	Sat Apr 19 19:51:50 2003
@@ -10,7 +10,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_range(start,len)		do { } while (0)
 #define flush_dcache_page(page)			do { } while (0)
 #define flush_icache_range(start,len)		__flush_cache_all()
diff -Nru a/include/asm-mips/bitops.h b/include/asm-mips/bitops.h
--- a/include/asm-mips/bitops.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-mips/bitops.h	Sat Apr 19 19:51:28 2003
@@ -824,6 +824,24 @@
 	return retval;
 }
 
+#define ext2_set_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_set_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
+#define ext2_clear_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_clear_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
 extern __inline__ int ext2_test_bit(int nr, const void * addr)
 {
 	int			mask;
@@ -890,7 +908,9 @@
 
 /* Native ext2 byte ordering, just collapse using defines. */
 #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr))
+#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr), (addr))
 #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr))
+#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr), (addr))
 #define ext2_test_bit(nr, addr) test_bit((nr), (addr))
 #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size))
 #define ext2_find_next_zero_bit(addr, size, offset) \
diff -Nru a/include/asm-mips/page.h b/include/asm-mips/page.h
--- a/include/asm-mips/page.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-mips/page.h	Sat Apr 19 19:51:46 2003
@@ -25,8 +25,15 @@
 
 #define clear_page(page)	_clear_page(page)
 #define copy_page(to, from)	_copy_page(to, from)
-#define clear_user_page(page, vaddr)	clear_page(page)
-#define copy_user_page(to, from, vaddr)	copy_page(to, from)
+
+#define clear_user_page(addr, vaddr, page)	\
+	do { 	clear_page(addr);		\
+		flush_dcache_page(page);	\
+	} while (0)
+#define copy_user_page(to, from, vaddr, page)	\
+	do {	copy_page(to, from);		\
+		flush_dcache_page(page);	\
+	} while (0)
 
 /*
  * These are used to make use of C type-checking..
diff -Nru a/include/asm-mips/pgtable.h b/include/asm-mips/pgtable.h
--- a/include/asm-mips/pgtable.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-mips/pgtable.h	Sat Apr 19 19:51:29 2003
@@ -24,7 +24,6 @@
  *  - flush_cache_mm(mm) flushes the specified mm context's cache lines
  *  - flush_cache_page(mm, vmaddr) flushes a single page
  *  - flush_cache_range(vma, start, end) flushes a range of pages
- *  - flush_page_to_ram(page) write back kernel page to ram
  *  - flush_icache_range(start, end) flush a range of instructions
  */
 extern void (*_flush_cache_all)(void);
@@ -39,15 +38,13 @@
 extern void (*_flush_icache_page)(struct vm_area_struct *vma,
                                   struct page *page);
 
-#define flush_dcache_page(page)			do { } while (0)
-
 #define flush_cache_all()		_flush_cache_all()
 #define __flush_cache_all()		___flush_cache_all()
 #define flush_cache_mm(mm)		_flush_cache_mm(mm)
 #define flush_cache_range(vma,start,end) _flush_cache_range(vma,start,end)
 #define flush_cache_page(vma,page)	_flush_cache_page(vma, page)
 #define flush_cache_sigtramp(addr)	_flush_cache_sigtramp(addr)
-#define flush_page_to_ram(page)		_flush_page_to_ram(page)
+#define flush_dcache_page(page)		_flush_page_to_ram(page)
 
 #define flush_icache_range(start, end)	_flush_icache_range(start,end)
 #define flush_icache_page(vma, page) 	_flush_icache_page(vma, page)
diff -Nru a/include/asm-mips/posix_types.h b/include/asm-mips/posix_types.h
--- a/include/asm-mips/posix_types.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-mips/posix_types.h	Sat Apr 19 19:51:49 2003
@@ -39,6 +39,7 @@
 typedef int		__kernel_gid32_t;
 typedef __kernel_uid_t	__kernel_old_uid_t;
 typedef __kernel_gid_t	__kernel_old_gid_t;
+typedef unsigned int	__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long      __kernel_loff_t;
diff -Nru a/include/asm-mips64/bitops.h b/include/asm-mips64/bitops.h
--- a/include/asm-mips64/bitops.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-mips64/bitops.h	Sat Apr 19 19:51:50 2003
@@ -531,6 +531,24 @@
 	return retval;
 }
 
+#define ext2_set_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_set_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
+#define ext2_clear_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_clear_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
 extern inline int
 ext2_test_bit(int nr, const void * addr)
 {
@@ -599,7 +617,9 @@
 
 /* Native ext2 byte ordering, just collapse using defines. */
 #define ext2_set_bit(nr, addr) test_and_set_bit((nr), (addr))
+#define ext2_set_bit_atomic(lock, nr, addr) test_and_set_bit((nr), (addr))
 #define ext2_clear_bit(nr, addr) test_and_clear_bit((nr), (addr))
+#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr), (addr))
 #define ext2_test_bit(nr, addr) test_bit((nr), (addr))
 #define ext2_find_first_zero_bit(addr, size) find_first_zero_bit((addr), (size))
 #define ext2_find_next_zero_bit(addr, size, offset) \
diff -Nru a/include/asm-mips64/page.h b/include/asm-mips64/page.h
--- a/include/asm-mips64/page.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-mips64/page.h	Sat Apr 19 19:51:27 2003
@@ -25,8 +25,15 @@
 
 #define clear_page(page)	_clear_page(page)
 #define copy_page(to, from)	_copy_page(to, from)
-#define clear_user_page(page, vaddr)	clear_page(page)
-#define copy_user_page(to, from, vaddr)	copy_page(to, from)
+
+#define clear_user_page(addr, vaddr, page)	\
+	do { 	clear_page(addr);		\
+		flush_dcache_page(page);	\
+	} while (0)
+#define copy_user_page(to, from, vaddr, page)	\
+	do {	copy_page(to, from);		\
+		flush_dcache_page(page);	\
+	} while (0)
 
 /*
  * These are used to make use of C type-checking..
diff -Nru a/include/asm-mips64/pgtable.h b/include/asm-mips64/pgtable.h
--- a/include/asm-mips64/pgtable.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-mips64/pgtable.h	Sat Apr 19 19:51:51 2003
@@ -25,7 +25,6 @@
  *  - flush_cache_mm(mm) flushes the specified mm context's cache lines
  *  - flush_cache_page(mm, vmaddr) flushes a single page
  *  - flush_cache_range(vma, start, end) flushes a range of pages
- *  - flush_page_to_ram(page) write back kernel page to ram
  */
 extern void (*_flush_cache_mm)(struct mm_struct *mm);
 extern void (*_flush_cache_range)(struct vm_area_struct *vma, unsigned long start,
@@ -34,14 +33,12 @@
 extern void (*_flush_page_to_ram)(struct page * page);
 
 #define flush_cache_all()		do { } while(0)
-#define flush_dcache_page(page)		do { } while (0)
 
 #ifndef CONFIG_CPU_R10000
 #define flush_cache_mm(mm)		_flush_cache_mm(mm)
 #define flush_cache_range(vma,start,end) _flush_cache_range(vma,start,end)
 #define flush_cache_page(vma,page)	_flush_cache_page(vma, page)
-#define flush_page_to_ram(page)		_flush_page_to_ram(page)
-
+#define flush_dcache_page(page)		_flush_page_to_ram(page)
 #define flush_icache_range(start, end)	_flush_cache_l1()
 #define flush_icache_user_range(vma, page, addr, len)	\
 					flush_icache_page((vma), (page))
@@ -66,7 +63,7 @@
 #define flush_cache_mm(mm)		do { } while(0)
 #define flush_cache_range(vma,start,end) do { } while(0)
 #define flush_cache_page(vma,page)	do { } while(0)
-#define flush_page_to_ram(page)		do { } while(0)
+#define flush_dcache_page(page)		do { } while(0)
 #define flush_icache_range(start, end)	_flush_cache_l1()
 #define flush_icache_user_range(vma, page, addr, len)	\
 					flush_icache_page((vma), (page))
diff -Nru a/include/asm-mips64/posix_types.h b/include/asm-mips64/posix_types.h
--- a/include/asm-mips64/posix_types.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-mips64/posix_types.h	Sat Apr 19 19:51:29 2003
@@ -39,6 +39,7 @@
 typedef int		__kernel_gid32_t;
 typedef __kernel_uid_t	__kernel_old_uid_t;
 typedef __kernel_gid_t	__kernel_old_gid_t;
+typedef unsigned int	__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long      __kernel_loff_t;
diff -Nru a/include/asm-parisc/bitops.h b/include/asm-parisc/bitops.h
--- a/include/asm-parisc/bitops.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-parisc/bitops.h	Sat Apr 19 19:51:27 2003
@@ -389,10 +389,14 @@
  */
 #ifdef __LP64__
 #define ext2_set_bit(nr, addr)		test_and_set_bit((nr) ^ 0x38, addr)
+#define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x38, addr)
 #define ext2_clear_bit(nr, addr)	test_and_clear_bit((nr) ^ 0x38, addr)
+#define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x38, addr)
 #else
 #define ext2_set_bit(nr, addr)		test_and_set_bit((nr) ^ 0x18, addr)
+#define ext2_set_bit_atomic(l,nr,addr)  test_and_set_bit((nr) ^ 0x18, addr)
 #define ext2_clear_bit(nr, addr)	test_and_clear_bit((nr) ^ 0x18, addr)
+#define ext2_clear_bit_atomic(l,nr,addr) test_and_clear_bit((nr) ^ 0x18, addr)
 #endif
 
 #endif	/* __KERNEL__ */
diff -Nru a/include/asm-parisc/cacheflush.h b/include/asm-parisc/cacheflush.h
--- a/include/asm-parisc/cacheflush.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-parisc/cacheflush.h	Sat Apr 19 19:51:50 2003
@@ -18,11 +18,6 @@
 #define flush_kernel_dcache_range(start,size) \
 	flush_kernel_dcache_range_asm((start), (start)+(size));
 
-static inline void
-flush_page_to_ram(struct page *page)
-{
-}
-
 extern void flush_cache_all_local(void);
 
 static inline void cacheflush_h_tmp_function(void *dummy)
diff -Nru a/include/asm-parisc/compat.h b/include/asm-parisc/compat.h
--- a/include/asm-parisc/compat.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-parisc/compat.h	Sat Apr 19 19:51:51 2003
@@ -99,6 +99,8 @@
 	s32		f_spare[6];
 };
 
+#define COMPAT_RLIM_INFINITY 0xffffffff
+
 typedef u32		compat_old_sigset_t;	/* at least 32 bits */
 
 #define _COMPAT_NSIG		64
diff -Nru a/include/asm-parisc/posix_types.h b/include/asm-parisc/posix_types.h
--- a/include/asm-parisc/posix_types.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-parisc/posix_types.h	Sat Apr 19 19:51:50 2003
@@ -45,6 +45,8 @@
 typedef unsigned long long	__kernel_ino64_t;
 #endif
 
+typedef unsigned int		__kernel_old_dev_t;
+
 typedef struct {
 #if defined(__KERNEL__) || defined(__USE_ALL)
 	int	val[2];
diff -Nru a/include/asm-parisc/rtc.h b/include/asm-parisc/rtc.h
--- a/include/asm-parisc/rtc.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-parisc/rtc.h	Sat Apr 19 19:51:47 2003
@@ -24,7 +24,7 @@
 #define RTC_AIE 0x20		/* alarm interrupt enable */
 #define RTC_UIE 0x10		/* update-finished interrupt enable */
 
-extern void gen_rtc_interrupt(unsigned long);
+#define RTC_BATT_BAD 0x100	/* battery bad */
 
 /* some dummy definitions */
 #define RTC_SQWE 0x08		/* enable square-wave output */
@@ -44,16 +44,16 @@
 	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
 };
 
-static int get_rtc_time(struct rtc_time *wtime)
+static inline unsigned int get_rtc_time(struct rtc_time *wtime)
 {
 	struct pdc_tod tod_data;
 	long int days, rem, y;
 	const unsigned short int *ip;
 
 	if(pdc_tod_read(&tod_data) < 0)
-		return -1;
+		return RTC_24H | RTC_BATT_BAD;
+
 
-	
 	// most of the remainder of this function is:
 //	Copyright (C) 1991, 1993, 1997, 1998 Free Software Foundation, Inc.
 //	This was originally a part of the GNU C Library.
@@ -69,7 +69,7 @@
 	wtime->tm_sec = rem % 60;
 
 	y = 1970;
-	
+
 #define DIV(a, b) ((a) / (b) - ((a) % (b) < 0))
 #define LEAPS_THRU_END_OF(y) (DIV (y, 4) - DIV (y, 100) + DIV (y, 400))
 
@@ -92,8 +92,8 @@
 	days -= ip[y];
 	wtime->tm_mon = y;
 	wtime->tm_mday = days + 1;
-	
-	return 0;
+
+	return RTC_24H;
 }
 
 static int set_rtc_time(struct rtc_time *wtime)
diff -Nru a/include/asm-ppc/bitops.h b/include/asm-ppc/bitops.h
--- a/include/asm-ppc/bitops.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-ppc/bitops.h	Sat Apr 19 19:51:47 2003
@@ -392,7 +392,9 @@
 
 
 #define ext2_set_bit(nr, addr)	__test_and_set_bit((nr) ^ 0x18, (unsigned long *)(addr))
+#define ext2_set_bit_atomic(lock, nr, addr)  test_and_set_bit((nr) ^ 0x18, (unsigned long *)(addr))
 #define ext2_clear_bit(nr, addr) __test_and_clear_bit((nr) ^ 0x18, (unsigned long *)(addr))
+#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 0x18, (unsigned long *)(addr))
 
 static __inline__ int ext2_test_bit(int nr, __const__ void * addr)
 {
diff -Nru a/include/asm-ppc/cacheflush.h b/include/asm-ppc/cacheflush.h
--- a/include/asm-ppc/cacheflush.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-ppc/cacheflush.h	Sat Apr 19 19:51:49 2003
@@ -23,7 +23,6 @@
 #define flush_cache_mm(mm)		do { } while (0)
 #define flush_cache_range(vma, a, b)	do { } while (0)
 #define flush_cache_page(vma, p)	do { } while (0)
-#define flush_page_to_ram(page)		do { } while (0)
 #define flush_icache_page(vma, page)	do { } while (0)
 
 extern void flush_dcache_page(struct page *page);
diff -Nru a/include/asm-ppc/posix_types.h b/include/asm-ppc/posix_types.h
--- a/include/asm-ppc/posix_types.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-ppc/posix_types.h	Sat Apr 19 19:51:47 2003
@@ -33,6 +33,7 @@
 
 typedef unsigned int	__kernel_old_uid_t;
 typedef unsigned int	__kernel_old_gid_t;
+typedef unsigned int	__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long	__kernel_loff_t;
diff -Nru a/include/asm-ppc64/bitops.h b/include/asm-ppc64/bitops.h
--- a/include/asm-ppc64/bitops.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-ppc64/bitops.h	Sat Apr 19 19:51:50 2003
@@ -338,6 +338,25 @@
 	__test_and_set_le_bit((nr),(unsigned long*)addr)
 #define ext2_clear_bit(nr, addr) \
 	__test_and_clear_le_bit((nr),(unsigned long*)addr)
+
+#define ext2_set_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_set_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
+#define ext2_clear_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_clear_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
 #define ext2_test_bit(nr, addr)      test_le_bit((nr),(unsigned long*)addr)
 #define ext2_find_first_zero_bit(addr, size) \
 	find_first_zero_le_bit((unsigned long*)addr, size)
diff -Nru a/include/asm-ppc64/cacheflush.h b/include/asm-ppc64/cacheflush.h
--- a/include/asm-ppc64/cacheflush.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-ppc64/cacheflush.h	Sat Apr 19 19:51:28 2003
@@ -13,7 +13,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_icache_page(vma, page)		do { } while (0)
 
 extern void flush_dcache_page(struct page *page);
diff -Nru a/include/asm-ppc64/compat.h b/include/asm-ppc64/compat.h
--- a/include/asm-ppc64/compat.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-ppc64/compat.h	Sat Apr 19 19:51:29 2003
@@ -93,6 +93,9 @@
 	int		f_spare[6];
 };
 
+#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
+#define COMPAT_RLIM_INFINITY		0xffffffff
+
 typedef u32		compat_old_sigset_t;
 
 #define _COMPAT_NSIG		64
diff -Nru a/include/asm-ppc64/posix_types.h b/include/asm-ppc64/posix_types.h
--- a/include/asm-ppc64/posix_types.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-ppc64/posix_types.h	Sat Apr 19 19:51:51 2003
@@ -39,6 +39,7 @@
 
 typedef unsigned int	__kernel_old_uid_t;
 typedef unsigned int	__kernel_old_gid_t;
+typedef unsigned long	__kernel_old_dev_t;
 
 typedef struct {
 	int	val[2];
diff -Nru a/include/asm-s390/bitops.h b/include/asm-s390/bitops.h
--- a/include/asm-s390/bitops.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-s390/bitops.h	Sat Apr 19 19:51:28 2003
@@ -15,6 +15,7 @@
 #include <linux/config.h>
 
 /*
+ * 32 bit bitops format:
  * bit 0 is the LSB of *addr; bit 31 is the MSB of *addr;
  * bit 32 is the LSB of *(addr+4). That combined with the
  * big endian byte order on S390 give the following bit
@@ -28,6 +29,25 @@
  * in the architecture independent code bits operations
  * of the form "flags |= (1 << bitnr)" are used INTERMIXED
  * with operation of the form "set_bit(bitnr, flags)".
+ *
+ * 64 bit bitops format:
+ * bit 0 is the LSB of *addr; bit 63 is the MSB of *addr;
+ * bit 64 is the LSB of *(addr+8). That combined with the
+ * big endian byte order on S390 give the following bit
+ * order in memory:
+ *    3f 3e 3d 3c 3b 3a 39 38 37 36 35 34 33 32 31 30
+ *    2f 2e 2d 2c 2b 2a 29 28 27 26 25 24 23 22 21 20
+ *    1f 1e 1d 1c 1b 1a 19 18 17 16 15 14 13 12 11 10
+ *    0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00
+ * after that follows the next long with bit numbers
+ *    7f 7e 7d 7c 7b 7a 79 78 77 76 75 74 73 72 71 70
+ *    6f 6e 6d 6c 6b 6a 69 68 67 66 65 64 63 62 61 60
+ *    5f 5e 5d 5c 5b 5a 59 58 57 56 55 54 53 52 51 50
+ *    4f 4e 4d 4c 4b 4a 49 48 47 46 45 44 43 42 41 40
+ * The reason for this bit ordering is the fact that
+ * in the architecture independent code bits operations
+ * of the form "flags |= (1 << bitnr)" are used INTERMIXED
+ * with operation of the form "set_bit(bitnr, flags)".
  */
 
 /* set ALIGN_CS to 1 if the SMP safe bit operations should
@@ -49,106 +69,126 @@
 extern const char _zb_findmap[];
 extern const char _sb_findmap[];
 
+#ifndef __s390x__
+
+#define __BITOPS_ALIGN		3
+#define __BITOPS_WORDSIZE	32
+#define __BITOPS_OR		"or"
+#define __BITOPS_AND		"nr"
+#define __BITOPS_XOR		"xr"
+
+#define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string)		\
+	__asm__ __volatile__("   l   %0,0(%4)\n"			\
+			     "0: lr  %1,%0\n"				\
+			     __op_string "  %1,%3\n"			\
+			     "   cs  %0,%1,0(%4)\n"			\
+			     "   jl  0b"				\
+			     : "=&d" (__old), "=&d" (__new),	       	\
+			       "=m" (*(unsigned long *) __addr)		\
+			     : "d" (__val), "a" (__addr),		\
+			       "m" (*(unsigned long *) __addr) : "cc" );
+
+#else /* __s390x__ */
+
+#define __BITOPS_ALIGN		7
+#define __BITOPS_WORDSIZE	64
+#define __BITOPS_OR		"ogr"
+#define __BITOPS_AND		"ngr"
+#define __BITOPS_XOR		"xgr"
+
+#define __BITOPS_LOOP(__old, __new, __addr, __val, __op_string)		\
+	__asm__ __volatile__("   lg  %0,0(%4)\n"			\
+			     "0: lgr %1,%0\n"				\
+			     __op_string "  %1,%3\n"			\
+			     "   csg %0,%1,0(%4)\n"			\
+			     "   jl  0b"				\
+			     : "=&d" (__old), "=&d" (__new),	       	\
+			       "=m" (*(unsigned long *) __addr)		\
+			     : "d" (__val), "a" (__addr),		\
+			       "m" (*(unsigned long *) __addr) : "cc" );
+
+#endif /* __s390x__ */
+
 #ifdef CONFIG_SMP
 /*
  * SMP safe set_bit routine based on compare and swap (CS)
  */
-static inline void set_bit_cs(int nr, volatile unsigned long *ptr)
+static inline void set_bit_cs(unsigned long nr, volatile unsigned long *ptr)
 {
         unsigned long addr, old, new, mask;
 
 	addr = (unsigned long) ptr;
 #if ALIGN_CS == 1
-	nr += (addr & 3) << 3;		/* add alignment to bit number */
-	addr ^= addr & 3;		/* align address to 4 */
+	nr += (addr & __BITOPS_ALIGN) << 3;    /* add alignment to bit number */
+	addr ^= addr & __BITOPS_ALIGN;	       /* align address to 8 */
 #endif
-	addr += (nr ^ (nr & 31)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 31);	/* make OR mask */
-	asm volatile(
-		"   l   %0,0(%4)\n"
-		"0: lr  %1,%0\n"
-		"   or  %1,%3\n"
-		"   cs  %0,%1,0(%4)\n"
-		"   jl  0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned int *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
+	/* calculate address for CS */
+	addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3;
+	/* make OR mask */
+	mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1));
+	/* Do the atomic update. */
+	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_OR);
 }
 
 /*
  * SMP safe clear_bit routine based on compare and swap (CS)
  */
-static inline void clear_bit_cs(int nr, volatile unsigned long *ptr)
+static inline void clear_bit_cs(unsigned long nr, volatile unsigned long *ptr)
 {
         unsigned long addr, old, new, mask;
 
 	addr = (unsigned long) ptr;
 #if ALIGN_CS == 1
-	nr += (addr & 3) << 3;		/* add alignment to bit number */
-	addr ^= addr & 3;		/* align address to 4 */
+	nr += (addr & __BITOPS_ALIGN) << 3;    /* add alignment to bit number */
+	addr ^= addr & __BITOPS_ALIGN;	       /* align address to 8 */
 #endif
-	addr += (nr ^ (nr & 31)) >> 3;	/* calculate address for CS */
-	mask = ~(1UL << (nr & 31));	/* make AND mask */
-	asm volatile(
-		"   l   %0,0(%4)\n"
-		"0: lr  %1,%0\n"
-		"   nr  %1,%3\n"
-		"   cs  %0,%1,0(%4)\n"
-		"   jl  0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned int *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
+	/* calculate address for CS */
+	addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3;
+	/* make AND mask */
+	mask = ~(1UL << (nr & (__BITOPS_WORDSIZE - 1)));
+	/* Do the atomic update. */
+	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_AND);
 }
 
 /*
  * SMP safe change_bit routine based on compare and swap (CS)
  */
-static inline void change_bit_cs(int nr, volatile unsigned long *ptr)
+static inline void change_bit_cs(unsigned long nr, volatile unsigned long *ptr)
 {
         unsigned long addr, old, new, mask;
 
 	addr = (unsigned long) ptr;
 #if ALIGN_CS == 1
-	nr += (addr & 3) << 3;		/* add alignment to bit number */
-	addr ^= addr & 3;		/* align address to 4 */
+	nr += (addr & __BITOPS_ALIGN) << 3;    /* add alignment to bit number */
+	addr ^= addr & __BITOPS_ALIGN;	       /* align address to 8 */
 #endif
-	addr += (nr ^ (nr & 31)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 31);	/* make XOR mask */
-	asm volatile(
-		"   l   %0,0(%4)\n"
-		"0: lr  %1,%0\n"
-		"   xr  %1,%3\n"
-		"   cs  %0,%1,0(%4)\n"
-		"   jl  0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned int *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
+	/* calculate address for CS */
+	addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3;
+	/* make XOR mask */
+	mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1));
+	/* Do the atomic update. */
+	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_XOR);
 }
 
 /*
  * SMP safe test_and_set_bit routine based on compare and swap (CS)
  */
 static inline int
-test_and_set_bit_cs(int nr, volatile unsigned long *ptr)
+test_and_set_bit_cs(unsigned long nr, volatile unsigned long *ptr)
 {
         unsigned long addr, old, new, mask;
 
 	addr = (unsigned long) ptr;
 #if ALIGN_CS == 1
-	addr ^= addr & 3;		/* align address to 4 */
-	nr += (addr & 3) << 3;		/* add alignment to bit number */
+	nr += (addr & __BITOPS_ALIGN) << 3;    /* add alignment to bit number */
+	addr ^= addr & __BITOPS_ALIGN;	       /* align address to 8 */
 #endif
-	addr += (nr ^ (nr & 31)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 31);	/* make OR/test mask */
-	asm volatile(
-		"   l   %0,0(%4)\n"
-		"0: lr  %1,%0\n"
-		"   or  %1,%3\n"
-		"   cs  %0,%1,0(%4)\n"
-		"   jl  0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned int *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
+	/* calculate address for CS */
+	addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3;
+	/* make OR/test mask */
+	mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1));
+	/* Do the atomic update. */
+	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_OR);
 	return (old & mask) != 0;
 }
 
@@ -156,26 +196,21 @@
  * SMP safe test_and_clear_bit routine based on compare and swap (CS)
  */
 static inline int
-test_and_clear_bit_cs(int nr, volatile unsigned long *ptr)
+test_and_clear_bit_cs(unsigned long nr, volatile unsigned long *ptr)
 {
         unsigned long addr, old, new, mask;
 
 	addr = (unsigned long) ptr;
 #if ALIGN_CS == 1
-	nr += (addr & 3) << 3;		/* add alignment to bit number */
-	addr ^= addr & 3;		/* align address to 4 */
+	nr += (addr & __BITOPS_ALIGN) << 3;    /* add alignment to bit number */
+	addr ^= addr & __BITOPS_ALIGN;	       /* align address to 8 */
 #endif
-	addr += (nr ^ (nr & 31)) >> 3;	/* calculate address for CS */
-	mask = ~(1UL << (nr & 31));	/* make AND mask */
-	asm volatile(
-		"   l   %0,0(%4)\n"
-		"0: lr  %1,%0\n"
-		"   nr  %1,%3\n"
-		"   cs  %0,%1,0(%4)\n"
-		"   jl  0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned int *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
+	/* calculate address for CS */
+	addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3;
+	/* make AND/test mask */
+	mask = ~(1UL << (nr & (__BITOPS_WORDSIZE - 1)));
+	/* Do the atomic update. */
+	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_AND);
 	return (old ^ new) != 0;
 }
 
@@ -183,26 +218,21 @@
  * SMP safe test_and_change_bit routine based on compare and swap (CS) 
  */
 static inline int
-test_and_change_bit_cs(int nr, volatile unsigned long *ptr)
+test_and_change_bit_cs(unsigned long nr, volatile unsigned long *ptr)
 {
         unsigned long addr, old, new, mask;
 
 	addr = (unsigned long) ptr;
 #if ALIGN_CS == 1
-	nr += (addr & 3) << 3;		/* add alignment to bit number */
-	addr ^= addr & 3;		/* align address to 4 */
+	nr += (addr & __BITOPS_ALIGN) << 3;  /* add alignment to bit number */
+	addr ^= addr & __BITOPS_ALIGN;	     /* align address to 8 */
 #endif
-	addr += (nr ^ (nr & 31)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 31);	/* make XOR mask */
-	asm volatile(
-		"   l   %0,0(%4)\n"
-		"0: lr  %1,%0\n"
-		"   xr  %1,%3\n"
-		"   cs  %0,%1,0(%4)\n"
-		"   jl  0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned int *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
+	/* calculate address for CS */
+	addr += (nr ^ (nr & (__BITOPS_WORDSIZE - 1))) >> 3;
+	/* make XOR/test mask */
+	mask = 1UL << (nr & (__BITOPS_WORDSIZE - 1));
+	/* Do the atomic update. */
+	__BITOPS_LOOP(old, new, addr, mask, __BITOPS_XOR);
 	return (old & mask) != 0;
 }
 #endif /* CONFIG_SMP */
@@ -210,55 +240,55 @@
 /*
  * fast, non-SMP set_bit routine
  */
-static inline void __set_bit(int nr, volatile unsigned long *ptr)
+static inline void __set_bit(unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 
-	addr = (unsigned long) ptr + ((nr ^ 24) >> 3);
+	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
         asm volatile("oc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
+		     : "=m" (*(char *) addr)
+		     : "a" (addr), "a" (_oi_bitmap + (nr & 7)),
+		       "m" (*(char *) addr) : "cc" );
 }
 
 static inline void 
-__constant_set_bit(const int nr, volatile unsigned long *ptr)
+__constant_set_bit(const unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 
-	addr = ((unsigned long) ptr) + ((nr >> 3) ^ 3);
+	addr = ((unsigned long) ptr) + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
 	switch (nr&7) {
 	case 0:
-		asm volatile ("oi 0(%1),0x01"
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x01" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 1:
-		asm volatile ("oi 0(%1),0x02"
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x02" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 2:
-		asm volatile ("oi 0(%1),0x04" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x04" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 3:
-		asm volatile ("oi 0(%1),0x08" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x08" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 4:
-		asm volatile ("oi 0(%1),0x10" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x10" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 5:
-		asm volatile ("oi 0(%1),0x20" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x20" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 6:
-		asm volatile ("oi 0(%1),0x40" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x40" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 7:
-		asm volatile ("oi 0(%1),0x80" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("oi 0(%1),0x80" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	}
 }
@@ -272,55 +302,55 @@
  * fast, non-SMP clear_bit routine
  */
 static inline void 
-__clear_bit(int nr, volatile unsigned long *ptr)
+__clear_bit(unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 
-	addr = (unsigned long) ptr + ((nr ^ 24) >> 3);
+	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
         asm volatile("nc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_ni_bitmap + (nr & 7))
-		     : "cc" );
+		     : "=m" (*(char *) addr)
+		     : "a" (addr), "a" (_ni_bitmap + (nr & 7)),
+		       "m" (*(char *) addr) : "cc" );
 }
 
 static inline void 
-__constant_clear_bit(const int nr, volatile unsigned long *ptr)
+__constant_clear_bit(const unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 
-	addr = ((unsigned long) ptr) + ((nr >> 3) ^ 3);
+	addr = ((unsigned long) ptr) + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
 	switch (nr&7) {
 	case 0:
-		asm volatile ("ni 0(%1),0xFE"
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0xFE" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 1:
-		asm volatile ("ni 0(%1),0xFD" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0xFD": "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 2:
-		asm volatile ("ni 0(%1),0xFB" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0xFB" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 3:
-		asm volatile ("ni 0(%1),0xF7" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0xF7" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 4:
-		asm volatile ("ni 0(%1),0xEF" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0xEF" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 5:
-		asm volatile ("ni 0(%1),0xDF" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0xDF" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 6:
-		asm volatile ("ni 0(%1),0xBF" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0xBF" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 7:
-		asm volatile ("ni 0(%1),0x7F" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("ni 0(%1),0x7F" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	}
 }
@@ -333,55 +363,55 @@
 /* 
  * fast, non-SMP change_bit routine 
  */
-static inline void __change_bit(int nr, volatile unsigned long *ptr)
+static inline void __change_bit(unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 
-	addr = (unsigned long) ptr + ((nr ^ 24) >> 3);
+	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
         asm volatile("xc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
+		     :  "=m" (*(char *) addr)
+		     : "a" (addr), "a" (_oi_bitmap + (nr & 7)),
+		       "m" (*(char *) addr) : "cc" );
 }
 
 static inline void 
-__constant_change_bit(const int nr, volatile unsigned long *ptr) 
+__constant_change_bit(const unsigned long nr, volatile unsigned long *ptr) 
 {
 	unsigned long addr;
 
-	addr = ((unsigned long) ptr) + ((nr >> 3) ^ 3);
+	addr = ((unsigned long) ptr) + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
 	switch (nr&7) {
 	case 0:
-		asm volatile ("xi 0(%1),0x01" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x01" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 1:
-		asm volatile ("xi 0(%1),0x02" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x02" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 2:
-		asm volatile ("xi 0(%1),0x04" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x04" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 3:
-		asm volatile ("xi 0(%1),0x08" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x08" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 4:
-		asm volatile ("xi 0(%1),0x10" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x10" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 5:
-		asm volatile ("xi 0(%1),0x20" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x20" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 6:
-		asm volatile ("xi 0(%1),0x40" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x40" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	case 7:
-		asm volatile ("xi 0(%1),0x80" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
+		asm volatile ("xi 0(%1),0x80" : "=m" (*(char *) addr)
+			      : "a" (addr), "m" (*(char *) addr) : "cc" );
 		break;
 	}
 }
@@ -395,17 +425,17 @@
  * fast, non-SMP test_and_set_bit routine
  */
 static inline int
-test_and_set_bit_simple(int nr, volatile unsigned long *ptr)
+test_and_set_bit_simple(unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 	unsigned char ch;
 
-	addr = (unsigned long) ptr + ((nr ^ 24) >> 3);
+	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
 	ch = *(unsigned char *) addr;
         asm volatile("oc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
+		     : "=m" (*(char *) addr)
+		     : "a" (addr), "a" (_oi_bitmap + (nr & 7)),
+		       "m" (*(char *) addr) : "cc" );
 	return (ch >> (nr & 7)) & 1;
 }
 #define __test_and_set_bit(X,Y)		test_and_set_bit_simple(X,Y)
@@ -414,17 +444,17 @@
  * fast, non-SMP test_and_clear_bit routine
  */
 static inline int
-test_and_clear_bit_simple(int nr, volatile unsigned long *ptr)
+test_and_clear_bit_simple(unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 	unsigned char ch;
 
-	addr = (unsigned long) ptr + ((nr ^ 24) >> 3);
+	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
 	ch = *(unsigned char *) addr;
         asm volatile("nc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_ni_bitmap + (nr & 7))
-		     : "cc" );
+		     : "=m" (*(char *) addr)
+		     : "a" (addr), "a" (_ni_bitmap + (nr & 7)),
+		       "m" (*(char *) addr) : "cc" );
 	return (ch >> (nr & 7)) & 1;
 }
 #define __test_and_clear_bit(X,Y)	test_and_clear_bit_simple(X,Y)
@@ -433,17 +463,17 @@
  * fast, non-SMP test_and_change_bit routine
  */
 static inline int
-test_and_change_bit_simple(int nr, volatile unsigned long *ptr)
+test_and_change_bit_simple(unsigned long nr, volatile unsigned long *ptr)
 {
 	unsigned long addr;
 	unsigned char ch;
 
-	addr = (unsigned long) ptr + ((nr ^ 24) >> 3);
+	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
 	ch = *(unsigned char *) addr;
         asm volatile("xc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
+		     : "=m" (*(char *) addr)
+		     : "a" (addr), "a" (_oi_bitmap + (nr & 7)),
+		       "m" (*(char *) addr) : "cc" );
 	return (ch >> (nr & 7)) & 1;
 }
 #define __test_and_change_bit(X,Y)	test_and_change_bit_simple(X,Y)
@@ -469,19 +499,20 @@
  * This routine doesn't need to be atomic.
  */
 
-static inline int __test_bit(int nr, const volatile unsigned long *ptr)
+static inline int __test_bit(unsigned long nr, const volatile unsigned long *ptr)
 {
 	unsigned long addr;
 	unsigned char ch;
 
-	addr = (unsigned long) ptr + ((nr ^ 24) >> 3);
+	addr = (unsigned long) ptr + ((nr ^ (__BITOPS_WORDSIZE - 8)) >> 3);
 	ch = *(unsigned char *) addr;
 	return (ch >> (nr & 7)) & 1;
 }
 
 static inline int 
-__constant_test_bit(int nr, const volatile unsigned long * addr) {
-    return (((volatile char *) addr)[(nr>>3)^3] & (1<<(nr&7))) != 0;
+__constant_test_bit(unsigned long nr, const volatile unsigned long *addr) {
+    return (((volatile char *) addr)
+	    [(nr^(__BITOPS_WORDSIZE-8))>>3] & (1<<(nr&7)));
 }
 
 #define test_bit(nr,addr) \
@@ -489,6 +520,8 @@
  __constant_test_bit((nr),(addr)) : \
  __test_bit((nr),(addr)) )
 
+#ifndef __s390x__
+
 /*
  * Find-bit routines..
  */
@@ -701,6 +734,245 @@
         return result;
 }
 
+#else /* __s390x__ */
+
+/*
+ * Find-bit routines..
+ */
+static inline unsigned long
+find_first_zero_bit(unsigned long * addr, unsigned long size)
+{
+        unsigned long res, cmp, count;
+
+        if (!size)
+                return 0;
+        __asm__("   lghi  %1,-1\n"
+                "   lgr   %2,%3\n"
+                "   slgr  %0,%0\n"
+                "   aghi  %2,63\n"
+                "   srlg  %2,%2,6\n"
+                "0: cg    %1,0(%0,%4)\n"
+                "   jne   1f\n"
+                "   aghi  %0,8\n"
+                "   brct  %2,0b\n"
+                "   lgr   %0,%3\n"
+                "   j     5f\n"
+                "1: lg    %2,0(%0,%4)\n"
+                "   sllg  %0,%0,3\n"
+                "   clr   %2,%1\n"
+		"   jne   2f\n"
+		"   aghi  %0,32\n"
+                "   srlg  %2,%2,32\n"
+		"2: lghi  %1,0xff\n"
+                "   tmll  %2,0xffff\n"
+                "   jno   3f\n"
+                "   aghi  %0,16\n"
+                "   srl   %2,16\n"
+                "3: tmll  %2,0x00ff\n"
+                "   jno   4f\n"
+                "   aghi  %0,8\n"
+                "   srl   %2,8\n"
+                "4: ngr   %2,%1\n"
+                "   ic    %2,0(%2,%5)\n"
+                "   algr  %0,%2\n"
+                "5:"
+                : "=&a" (res), "=&d" (cmp), "=&a" (count)
+		: "a" (size), "a" (addr), "a" (&_zb_findmap) : "cc" );
+        return (res < size) ? res : size;
+}
+
+static inline unsigned long
+find_first_bit(unsigned long * addr, unsigned long size)
+{
+        unsigned long res, cmp, count;
+
+        if (!size)
+                return 0;
+        __asm__("   slgr  %1,%1\n"
+                "   lgr   %2,%3\n"
+                "   slgr  %0,%0\n"
+                "   aghi  %2,63\n"
+                "   srlg  %2,%2,6\n"
+                "0: cg    %1,0(%0,%4)\n"
+                "   jne   1f\n"
+                "   aghi  %0,8\n"
+                "   brct  %2,0b\n"
+                "   lgr   %0,%3\n"
+                "   j     5f\n"
+                "1: lg    %2,0(%0,%4)\n"
+                "   sllg  %0,%0,3\n"
+                "   clr   %2,%1\n"
+		"   jne   2f\n"
+		"   aghi  %0,32\n"
+                "   srlg  %2,%2,32\n"
+		"2: lghi  %1,0xff\n"
+                "   tmll  %2,0xffff\n"
+                "   jnz   3f\n"
+                "   aghi  %0,16\n"
+                "   srl   %2,16\n"
+                "3: tmll  %2,0x00ff\n"
+                "   jnz   4f\n"
+                "   aghi  %0,8\n"
+                "   srl   %2,8\n"
+                "4: ngr   %2,%1\n"
+                "   ic    %2,0(%2,%5)\n"
+                "   algr  %0,%2\n"
+                "5:"
+                : "=&a" (res), "=&d" (cmp), "=&a" (count)
+		: "a" (size), "a" (addr), "a" (&_sb_findmap) : "cc" );
+        return (res < size) ? res : size;
+}
+
+static inline unsigned long
+find_next_zero_bit (unsigned long * addr, unsigned long size, unsigned long offset)
+{
+        unsigned long * p = ((unsigned long *) addr) + (offset >> 6);
+        unsigned long bitvec, reg;
+        unsigned long set, bit = offset & 63, res;
+
+        if (bit) {
+                /*
+                 * Look for zero in first word
+                 */
+                bitvec = (*p) >> bit;
+                __asm__("   lhi  %2,-1\n"
+                        "   slgr %0,%0\n"
+                        "   clr  %1,%2\n"
+                        "   jne  0f\n"
+                        "   aghi %0,32\n"
+                        "   srlg %1,%1,32\n"
+			"0: lghi %2,0xff\n"
+                        "   tmll %1,0xffff\n"
+                        "   jno  1f\n"
+                        "   aghi %0,16\n"
+                        "   srlg %1,%1,16\n"
+                        "1: tmll %1,0x00ff\n"
+                        "   jno  2f\n"
+                        "   aghi %0,8\n"
+                        "   srlg %1,%1,8\n"
+                        "2: ngr  %1,%2\n"
+                        "   ic   %1,0(%1,%3)\n"
+                        "   algr %0,%1"
+                        : "=&d" (set), "+a" (bitvec), "=&d" (reg)
+                        : "a" (&_zb_findmap) : "cc" );
+                if (set < (64 - bit))
+                        return set + offset;
+                offset += 64 - bit;
+                p++;
+        }
+        /*
+         * No zero yet, search remaining full words for a zero
+         */
+        res = find_first_zero_bit (p, size - 64 * (p - (unsigned long *) addr));
+        return (offset + res);
+}
+
+static inline unsigned long
+find_next_bit (unsigned long * addr, unsigned long size, unsigned long offset)
+{
+        unsigned long * p = ((unsigned long *) addr) + (offset >> 6);
+        unsigned long bitvec, reg;
+        unsigned long set, bit = offset & 63, res;
+
+        if (bit) {
+                /*
+                 * Look for zero in first word
+                 */
+                bitvec = (*p) >> bit;
+                __asm__("   slgr %0,%0\n"
+                        "   ltr  %1,%1\n"
+                        "   jnz  0f\n"
+                        "   aghi %0,32\n"
+                        "   srlg %1,%1,32\n"
+			"0: lghi %2,0xff\n"
+                        "   tmll %1,0xffff\n"
+                        "   jnz  1f\n"
+                        "   aghi %0,16\n"
+                        "   srlg %1,%1,16\n"
+                        "1: tmll %1,0x00ff\n"
+                        "   jnz  2f\n"
+                        "   aghi %0,8\n"
+                        "   srlg %1,%1,8\n"
+                        "2: ngr  %1,%2\n"
+                        "   ic   %1,0(%1,%3)\n"
+                        "   algr %0,%1"
+                        : "=&d" (set), "+a" (bitvec), "=&d" (reg)
+                        : "a" (&_sb_findmap) : "cc" );
+                if (set < (64 - bit))
+                        return set + offset;
+                offset += 64 - bit;
+                p++;
+        }
+        /*
+         * No set bit yet, search remaining full words for a bit
+         */
+        res = find_first_bit (p, size - 64 * (p - (unsigned long *) addr));
+        return (offset + res);
+}
+
+/*
+ * ffz = Find First Zero in word. Undefined if no zero exists,
+ * so code should check against ~0UL first..
+ */
+static inline unsigned long ffz(unsigned long word)
+{
+	unsigned long reg, result;
+
+        __asm__("   lhi  %2,-1\n"
+                "   slgr %0,%0\n"
+                "   clr  %1,%2\n"
+                "   jne  0f\n"
+                "   aghi %0,32\n"
+                "   srlg %1,%1,32\n"
+                "0: lghi %2,0xff\n"
+                "   tmll %1,0xffff\n"
+                "   jno  1f\n"
+                "   aghi %0,16\n"
+                "   srlg %1,%1,16\n"
+                "1: tmll %1,0x00ff\n"
+                "   jno  2f\n"
+                "   aghi %0,8\n"
+                "   srlg %1,%1,8\n"
+                "2: ngr  %1,%2\n"
+                "   ic   %1,0(%1,%3)\n"
+                "   algr %0,%1"
+                : "=&d" (result), "+a" (word), "=&d" (reg)
+                : "a" (&_zb_findmap) : "cc" );
+        return result;
+}
+
+/*
+ * __ffs = find first bit in word. Undefined if no bit exists,
+ * so code should check against 0UL first..
+ */
+static inline unsigned long __ffs (unsigned long word)
+{
+        unsigned long reg, result;
+
+        __asm__("   slgr %0,%0\n"
+                "   ltr  %1,%1\n"
+                "   jnz  0f\n"
+                "   aghi %0,32\n"
+                "   srlg %1,%1,32\n"
+                "0: lghi %2,0xff\n"
+                "   tmll %1,0xffff\n"
+                "   jnz  1f\n"
+                "   aghi %0,16\n"
+                "   srlg %1,%1,16\n"
+                "1: tmll %1,0x00ff\n"
+                "   jnz  2f\n"
+                "   aghi %0,8\n"
+                "   srlg %1,%1,8\n"
+                "2: ngr  %1,%2\n"
+                "   ic   %1,0(%1,%3)\n"
+                "   algr %0,%1"
+                : "=&d" (result), "+a" (word), "=&d" (reg)
+                : "a" (&_sb_findmap) : "cc" );
+        return result;
+}
+
+#endif /* __s390x__ */
+
 /*
  * Every architecture must define this function. It's the fastest
  * way of searching a 140-bit bitmap where the first 100 bits are
@@ -717,7 +989,6 @@
  * the libc and compiler builtin ffs routines, therefore
  * differs in spirit from the above ffz (man ffs).
  */
-
 extern inline int ffs (int x)
 {
         int r = 1;
@@ -785,7 +1056,14 @@
  * hweightN: returns the hamming weight (i.e. the number
  * of bits set) of a N-bit word
  */
-
+#define hweight64(x)						\
+({								\
+	unsigned long __x = (x);				\
+	unsigned int __w;					\
+	__w = generic_hweight32((unsigned int) __x);		\
+	__w += generic_hweight32((unsigned int) (__x>>32));	\
+	__w;							\
+})
 #define hweight32(x) generic_hweight32(x)
 #define hweight16(x) generic_hweight16(x)
 #define hweight8(x) generic_hweight8(x)
@@ -804,11 +1082,17 @@
  */
 
 #define ext2_set_bit(nr, addr)       \
-	test_and_set_bit((nr)^24, (unsigned long *)addr)
+	test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
+#define ext2_set_bit_atomic(lock, nr, addr)       \
+	test_and_set_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
 #define ext2_clear_bit(nr, addr)     \
-	test_and_clear_bit((nr)^24, (unsigned long *)addr)
+	test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
+#define ext2_clear_bit_atomic(lock, nr, addr)     \
+	test_and_clear_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
 #define ext2_test_bit(nr, addr)      \
-	test_bit((nr)^24, (unsigned long *)addr)
+	test_bit((nr)^(__BITOPS_WORDSIZE - 8), (unsigned long *)addr)
+
+#ifndef __s390x__
 
 static inline int 
 ext2_find_first_zero_bit(void *vaddr, unsigned size)
@@ -892,6 +1176,100 @@
         res = ext2_find_first_zero_bit (p, size - 32 * (p - addr));
         return (p - addr) * 32 + res;
 }
+
+#else /* __s390x__ */
+
+static inline unsigned long
+ext2_find_first_zero_bit(void *vaddr, unsigned long size)
+{
+        unsigned long res, cmp, count;
+
+        if (!size)
+                return 0;
+        __asm__("   lghi  %1,-1\n"
+                "   lgr   %2,%3\n"
+                "   aghi  %2,63\n"
+                "   srlg  %2,%2,6\n"
+                "   slgr  %0,%0\n"
+                "0: clg   %1,0(%0,%4)\n"
+                "   jne   1f\n"
+                "   aghi  %0,8\n"
+                "   brct  %2,0b\n"
+                "   lgr   %0,%3\n"
+                "   j     5f\n"
+                "1: cl    %1,0(%0,%4)\n"
+		"   jne   2f\n"
+		"   aghi  %0,4\n"
+		"2: l     %2,0(%0,%4)\n"
+                "   sllg  %0,%0,3\n"
+                "   aghi  %0,24\n"
+                "   lghi  %1,0xff\n"
+                "   tmlh  %2,0xffff\n"
+                "   jo    3f\n"
+                "   aghi  %0,-16\n"
+                "   srl   %2,16\n"
+                "3: tmll  %2,0xff00\n"
+                "   jo    4f\n"
+                "   aghi  %0,-8\n"
+                "   srl   %2,8\n"
+                "4: ngr   %2,%1\n"
+                "   ic    %2,0(%2,%5)\n"
+                "   algr  %0,%2\n"
+                "5:"
+                : "=&a" (res), "=&d" (cmp), "=&a" (count)
+		: "a" (size), "a" (vaddr), "a" (&_zb_findmap) : "cc" );
+        return (res < size) ? res : size;
+}
+
+static inline unsigned long
+ext2_find_next_zero_bit(void *vaddr, unsigned long size, unsigned long offset)
+{
+        unsigned long *addr = vaddr;
+        unsigned long *p = addr + (offset >> 6);
+        unsigned long word, reg;
+        unsigned long bit = offset & 63UL, res;
+
+        if (offset >= size)
+                return size;
+
+        if (bit) {
+                __asm__("   lrvg %0,%1" /* load reversed, neat instruction */
+                        : "=a" (word) : "m" (*p) );
+                word >>= bit;
+                res = bit;
+                /* Look for zero in first 8 byte word */
+                __asm__("   lghi %2,0xff\n"
+			"   tmll %1,0xffff\n"
+			"   jno  2f\n"
+			"   ahi  %0,16\n"
+			"   srlg %1,%1,16\n"
+                	"0: tmll %1,0xffff\n"
+                        "   jno  2f\n"
+                        "   ahi  %0,16\n"
+                        "   srlg %1,%1,16\n"
+                        "1: tmll %1,0xffff\n"
+                        "   jno  2f\n"
+                        "   ahi  %0,16\n"
+                        "   srl  %1,16\n"
+                        "2: tmll %1,0x00ff\n"
+                	"   jno  3f\n"
+                	"   ahi  %0,8\n"
+                	"   srl  %1,8\n"
+                	"3: ngr  %1,%2\n"
+                	"   ic   %1,0(%1,%3)\n"
+                	"   alr  %0,%1"
+                	: "+&d" (res), "+a" (word), "=&d" (reg)
+                  	: "a" (&_zb_findmap) : "cc" );
+                if (res < 64)
+			return (p - addr)*64 + res;
+                p++;
+        }
+        /* No zero yet, search remaining full bytes for a zero */
+        res = ext2_find_first_zero_bit (p, size - 64 * (p - addr));
+        return (p - addr) * 64 + res;
+}
+
+#endif /* __s390x__ */
 
 /* Bitmap functions for the minix filesystem.  */
 /* FIXME !!! */
diff -Nru a/include/asm-s390/byteorder.h b/include/asm-s390/byteorder.h
--- a/include/asm-s390/byteorder.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/byteorder.h	Sat Apr 19 19:51:51 2003
@@ -13,22 +13,63 @@
 
 #ifdef __GNUC__
 
+#ifdef __s390x__
+static __inline__ __const__ __u64 ___arch__swab64p(__u64 *x)
+{
+	__u64 result;
+
+	__asm__ __volatile__ (
+		"   lrvg %0,%1"
+		: "=d" (result) : "m" (*x) );
+	return result;
+}
+
+static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
+{
+	__u64 result;
+
+	__asm__ __volatile__ (
+		"   lrvgr %0,%1"
+		: "=d" (result) : "d" (x) );
+	return result;
+}
+
+static __inline__ void ___arch__swab64s(__u64 *x)
+{
+	*x = ___arch__swab64p(x);
+}
+#endif /* __s390x__ */
+
 static __inline__ __const__ __u32 ___arch__swab32p(__u32 *x)
 {
 	__u32 result;
 	
 	__asm__ __volatile__ (
+#ifndef __s390x__
 		"        icm   %0,8,3(%1)\n"
 		"        icm   %0,4,2(%1)\n"
 		"        icm   %0,2,1(%1)\n"
 		"        ic    %0,0(%1)"
 		: "=&d" (result) : "a" (x) : "cc" );
+#else /* __s390x__ */
+		"   lrv  %0,%1"
+		: "=d" (result) : "m" (*x) );
+#endif /* __s390x__ */
 	return result;
 }
 
 static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
 {
+#ifndef __s390x__
 	return ___arch__swab32p(&x);
+#else /* __s390x__ */
+	__u32 result;
+	
+	__asm__ __volatile__ (
+		"   lrvr  %0,%1"
+		: "=d" (result) : "d" (x) );
+	return result;
+#endif /* __s390x__ */
 }
 
 static __inline__ void ___arch__swab32s(__u32 *x)
@@ -41,9 +82,14 @@
 	__u16 result;
 	
 	__asm__ __volatile__ (
+#ifndef __s390x__
 		"        icm   %0,2,1(%1)\n"
 		"        ic    %0,0(%1)\n"
 		: "=&d" (result) : "a" (x) : "cc" );
+#else /* __s390x__ */
+		"   lrvh %0,%1"
+		: "=d" (result) : "m" (*x) );
+#endif /* __s390x__ */
 	return result;
 }
 
@@ -57,6 +103,11 @@
 	*x = ___arch__swab16p(x);
 }
 
+#ifdef __s390x__
+#define __arch__swab64(x) ___arch__swab64(x)
+#define __arch__swab64p(x) ___arch__swab64p(x)
+#define __arch__swab64s(x) ___arch__swab64s(x)
+#endif /* __s390x__ */
 #define __arch__swab32(x) ___arch__swab32(x)
 #define __arch__swab16(x) ___arch__swab16(x)
 #define __arch__swab32p(x) ___arch__swab32p(x)
@@ -64,10 +115,14 @@
 #define __arch__swab32s(x) ___arch__swab32s(x)
 #define __arch__swab16s(x) ___arch__swab16s(x)
 
+#ifndef __s390x__
 #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
 #  define __BYTEORDER_HAS_U64__
 #  define __SWAB_64_THRU_32__
 #endif
+#else /* __s390x__ */
+#define __BYTEORDER_HAS_U64__
+#endif /* __s390x__ */
 
 #endif /* __GNUC__ */
 
diff -Nru a/include/asm-s390/cacheflush.h b/include/asm-s390/cacheflush.h
--- a/include/asm-s390/cacheflush.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/cacheflush.h	Sat Apr 19 19:51:51 2003
@@ -9,7 +9,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_page(page)			do { } while (0)
 #define flush_icache_range(start, end)		do { } while (0)
 #define flush_icache_page(vma,pg)		do { } while (0)
diff -Nru a/include/asm-s390/ccwdev.h b/include/asm-s390/ccwdev.h
--- a/include/asm-s390/ccwdev.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-s390/ccwdev.h	Sat Apr 19 19:51:50 2003
@@ -157,6 +157,16 @@
  */
 extern int ccw_device_start(struct ccw_device *, struct ccw1 *,
 			    unsigned long, __u8, unsigned long);
+/*
+ * ccw_device_start_timeout()
+ *
+ * This function notifies the device driver if the channel program has not
+ * completed during the specified time. If a timeout occurs, the channel
+ * program is terminated via xsch(), hsch() or csch().
+ */
+extern int ccw_device_start_timeout(struct ccw_device *, struct ccw1 *,
+				    unsigned long, __u8, unsigned long, int);
+
 extern int ccw_device_resume(struct ccw_device *);
 extern int ccw_device_halt(struct ccw_device *, unsigned long);
 extern int ccw_device_clear(struct ccw_device *, unsigned long);
diff -Nru a/include/asm-s390/checksum.h b/include/asm-s390/checksum.h
--- a/include/asm-s390/checksum.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-s390/checksum.h	Sat Apr 19 19:51:27 2003
@@ -30,17 +30,29 @@
 static inline unsigned int
 csum_partial(const unsigned char * buff, int len, unsigned int sum)
 {
-	register_pair rp;
 	/*
 	 * Experiments with ethernet and slip connections show that buf
 	 * is aligned on either a 2-byte or 4-byte boundary.
 	 */
+#ifndef __s390x__
+	register_pair rp;
+
 	rp.subreg.even = (unsigned long) buff;
 	rp.subreg.odd = (unsigned long) len;
 	__asm__ __volatile__ (
 		"0:  cksm %0,%1\n"	/* do checksum on longs */
 		"    jo   0b\n"
 		: "+&d" (sum), "+&a" (rp) : : "cc" );
+#else /* __s390x__ */
+        __asm__ __volatile__ (
+                "    lgr  2,%1\n"    /* address in gpr 2 */
+                "    lgfr 3,%2\n"    /* length in gpr 3 */
+                "0:  cksm %0,2\n"    /* do checksum on longs */
+                "    jo   0b\n"
+                : "+&d" (sum)
+                : "d" (buff), "d" (len)
+                : "cc", "2", "3" );
+#endif /* __s390x__ */
 	return sum;
 }
 
@@ -50,6 +62,7 @@
 static inline unsigned int 
 csum_partial_inline(const unsigned char * buff, int len, unsigned int sum)
 {
+#ifndef __s390x__
 	register_pair rp;
 
 	rp.subreg.even = (unsigned long) buff;
@@ -58,6 +71,16 @@
 		"0:  cksm %0,%1\n"    /* do checksum on longs */
 		"    jo   0b\n"
                 : "+&d" (sum), "+&a" (rp) : : "cc" );
+#else /* __s390x__ */
+	__asm__ __volatile__ (
+		"    lgr  2,%1\n"    /* address in gpr 2 */
+		"    lgfr 3,%2\n"    /* length in gpr 3 */
+		"0:  cksm %0,2\n"    /* do checksum on longs */
+		"    jo   0b\n"
+                : "+&d" (sum)
+		: "d" (buff), "d" (len)
+                : "cc", "2", "3" );
+#endif /* __s390x__ */
 	return sum;
 }
 
@@ -100,6 +123,7 @@
 static inline unsigned short
 csum_fold(unsigned int sum)
 {
+#ifndef __s390x__
 	register_pair rp;
 
 	__asm__ __volatile__ (
@@ -110,6 +134,16 @@
 		"    alr  %0,%1\n"   /* %0 = H+L+C L+H */
 		"    srl  %0,16\n"   /* %0 = H+L+C */
 		: "+&d" (sum), "=d" (rp) : : "cc" );
+#else /* __s390x__ */
+	__asm__ __volatile__ (
+		"    sr   3,3\n"   /* %0 = H*65536 + L */
+		"    lr   2,%0\n"  /* %0 = H L, R2/R3 = H L / 0 0 */
+		"    srdl 2,16\n"  /* %0 = H L, R2/R3 = 0 H / L 0 */
+		"    alr  2,3\n"   /* %0 = H L, R2/R3 = L H / L 0 */
+		"    alr  %0,2\n"  /* %0 = H+L+C L+H */
+                "    srl  %0,16\n" /* %0 = H+L+C */
+		: "+&d" (sum) : : "cc", "2", "3");
+#endif /* __s390x__ */
 	return ((unsigned short) ~sum);
 }
 
@@ -121,8 +155,9 @@
 static inline unsigned short
 ip_fast_csum(unsigned char *iph, unsigned int ihl)
 {
-	register_pair rp;
 	unsigned long sum;
+#ifndef __s390x__
+	register_pair rp;
 
 	rp.subreg.even = (unsigned long) iph;
 	rp.subreg.odd = (unsigned long) ihl*4;
@@ -131,6 +166,17 @@
                 "0:  cksm %0,%1\n"   /* do checksum on longs */
                 "    jo   0b\n"
                 : "=&d" (sum), "+&a" (rp) : : "cc" );
+#else /* __s390x__ */
+        __asm__ __volatile__ (
+		"    slgr %0,%0\n"   /* set sum to zero */
+                "    lgr  2,%1\n"    /* address in gpr 2 */
+                "    lgfr 3,%2\n"    /* length in gpr 3 */
+                "0:  cksm %0,2\n"    /* do checksum on ints */
+                "    jo   0b\n"
+                : "=&d" (sum)
+                : "d" (iph), "d" (ihl*4)
+                : "cc", "2", "3" );
+#endif /* __s390x__ */
         return csum_fold(sum);
 }
 
@@ -143,6 +189,7 @@
                    unsigned short len, unsigned short proto,
                    unsigned int sum)
 {
+#ifndef __s390x__
 	__asm__ __volatile__ (
                 "    alr   %0,%1\n"  /* sum += saddr */
                 "    brc   12,0f\n"
@@ -163,6 +210,28 @@
 		: "+&d" (sum)
 		: "d" (((unsigned int) len<<16) + (unsigned int) proto)
 		: "cc" );
+#else /* __s390x__ */
+	__asm__ __volatile__ (
+                "    lgfr  %0,%0\n"
+                "    algr  %0,%1\n"  /* sum += saddr */
+                "    brc   12,0f\n"
+		"    aghi  %0,1\n"   /* add carry */
+		"0:  algr  %0,%2\n"  /* sum += daddr */
+                "    brc   12,1f\n"
+                "    aghi  %0,1\n"   /* add carry */
+		"1:  algfr %0,%3\n"  /* sum += (len<<16) + proto */
+		"    brc   12,2f\n"
+		"    aghi  %0,1\n"   /* add carry */
+		"2:  srlg  0,%0,32\n"
+                "    alr   %0,0\n"   /* fold to 32 bits */
+                "    brc   12,3f\n"
+                "    ahi   %0,1\n"   /* add carry */
+                "3:  llgfr %0,%0"
+		: "+&d" (sum)
+		: "d" (saddr), "d" (daddr),
+		  "d" (((unsigned int) len<<16) + (unsigned int) proto)
+		: "cc", "0" );
+#endif /* __s390x__ */
 	return sum;
 }
 
diff -Nru a/include/asm-s390/compat.h b/include/asm-s390/compat.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/asm-s390/compat.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,125 @@
+#ifndef _ASM_S390X_COMPAT_H
+#define _ASM_S390X_COMPAT_H
+/*
+ * Architecture specific compatibility types
+ */
+#include <linux/types.h>
+
+#define COMPAT_USER_HZ	100
+
+typedef u32		compat_size_t;
+typedef s32		compat_ssize_t;
+typedef s32		compat_time_t;
+typedef s32		compat_clock_t;
+typedef s32		compat_pid_t;
+typedef u16		compat_uid_t;
+typedef u16		compat_gid_t;
+typedef u16		compat_mode_t;
+typedef u32		compat_ino_t;
+typedef u16		compat_dev_t;
+typedef s32		compat_off_t;
+typedef s64		compat_loff_t;
+typedef u16		compat_nlink_t;
+typedef u16		compat_ipc_pid_t;
+typedef s32		compat_daddr_t;
+typedef u32		compat_caddr_t;
+typedef __kernel_fsid_t	compat_fsid_t;
+
+typedef s32		compat_int_t;
+typedef s32		compat_long_t;
+typedef u32		compat_uint_t;
+typedef u32		compat_ulong_t;
+
+struct compat_timespec {
+	compat_time_t	tv_sec;
+	s32		tv_nsec;
+};
+
+struct compat_timeval {
+	compat_time_t	tv_sec;
+	s32		tv_usec;
+};
+
+struct compat_stat {
+	compat_dev_t	st_dev;
+	u16		__pad1;
+	compat_ino_t	st_ino;
+	compat_mode_t	st_mode;
+	compat_nlink_t	st_nlink;
+	compat_uid_t	st_uid;
+	compat_gid_t	st_gid;
+	compat_dev_t	st_rdev;
+	u16		__pad2;
+	u32		st_size;
+	u32		st_blksize;
+	u32		st_blocks;
+	u32		st_atime;
+	u32		st_atime_nsec;
+	u32		st_mtime;
+	u32		st_mtime_nsec;
+	u32		st_ctime;
+	u32		st_ctime_nsec;
+	u32		__unused4;
+	u32		__unused5;
+};
+
+struct compat_flock {
+	short		l_type;
+	short		l_whence;
+	compat_off_t	l_start;
+	compat_off_t	l_len;
+	compat_pid_t	l_pid;
+};
+
+#define F_GETLK64       12
+#define F_SETLK64       13
+#define F_SETLKW64      14    
+
+struct compat_flock64 {
+	short		l_type;
+	short		l_whence;
+	compat_loff_t	l_start;
+	compat_loff_t	l_len;
+	compat_pid_t	l_pid;
+};
+
+struct compat_statfs {
+	s32		f_type;
+	s32		f_bsize;
+	s32		f_blocks;
+	s32		f_bfree;
+	s32		f_bavail;
+	s32		f_files;
+	s32		f_ffree;
+	compat_fsid_t	f_fsid;
+	s32		f_namelen;
+	s32		f_spare[6];
+};
+
+#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
+#define COMPAT_RLIM_INFINITY		0xffffffff
+
+typedef u32		compat_old_sigset_t;	/* at least 32 bits */
+
+#define _COMPAT_NSIG		64
+#define _COMPAT_NSIG_BPW	32
+
+typedef u32		compat_sigset_word;
+
+#define COMPAT_OFF_T_MAX	0x7fffffff
+#define COMPAT_LOFF_T_MAX	0x7fffffffffffffffL
+
+/*
+ * A pointer passed in from user mode. This should not
+ * be used for syscall parameters, just declare them
+ * as pointers because the syscall entry code will have
+ * appropriately comverted them already.
+ */
+typedef	u32		compat_uptr_t;
+
+static inline void *compat_ptr(compat_uptr_t uptr)
+{
+	return (void *)(unsigned long)(uptr & 0x7fffffffUL);
+}
+
+#endif /* _ASM_S390X_COMPAT_H */
diff -Nru a/include/asm-s390/div64.h b/include/asm-s390/div64.h
--- a/include/asm-s390/div64.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-s390/div64.h	Sat Apr 19 19:51:49 2003
@@ -1,8 +1,9 @@
 #ifndef __S390_DIV64
 #define __S390_DIV64
 
+#ifndef __s390x__
+
 /* for do_div "base" needs to be smaller than 2^31-1 */
- 
 #define do_div(n, base) ({                                      \
 	unsigned long long __n = (n);				\
 	unsigned long __r;					\
@@ -40,5 +41,15 @@
 	(n) = (__n);						\
         __r;                                                    \
 })
+
+#else /* __s390x__ */
+
+#define do_div(n,base) ({ \
+int __res; \
+__res = ((unsigned long) n) % (unsigned) base; \
+n = ((unsigned long) n) / (unsigned) base; \
+__res; })
+
+#endif /* __s390x__ */
 
 #endif
diff -Nru a/include/asm-s390/ebcdic.h b/include/asm-s390/ebcdic.h
--- a/include/asm-s390/ebcdic.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/ebcdic.h	Sat Apr 19 19:51:47 2003
@@ -21,8 +21,8 @@
 extern __u8 _ebc_tolower[]; /* EBCDIC -> lowercase */
 extern __u8 _ebc_toupper[]; /* EBCDIC -> uppercase */
 
-extern __inline__ 
-void codepage_convert(const __u8 *codepage, volatile __u8 * addr, int nr)
+extern __inline__ void
+codepage_convert(const __u8 *codepage, volatile __u8 * addr, unsigned long nr)
 {
 	if (nr-- <= 0)
 		return;
diff -Nru a/include/asm-s390/elf.h b/include/asm-s390/elf.h
--- a/include/asm-s390/elf.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-s390/elf.h	Sat Apr 19 19:51:50 2003
@@ -23,7 +23,11 @@
 /*
  * These are used to set parameters in the core dumps.
  */
+#ifndef __s390x__
 #define ELF_CLASS	ELFCLASS32
+#else /* __s390x__ */
+#define ELF_CLASS	ELFCLASS64
+#endif /* __s390x__ */
 #define ELF_DATA	ELFDATA2MSB
 #define ELF_ARCH	EM_S390
 
@@ -36,8 +40,16 @@
 
 /* For SVR4/S390 the function pointer to be registered with `atexit` is
    passed in R14. */
+#ifndef __s390x__
 #define ELF_PLAT_INIT(_r, load_addr) \
 	_r->gprs[14] = 0
+#else /* __s390x__ */
+#define ELF_PLAT_INIT(_r, load_addr) \
+	do { \
+	_r->gprs[14] = 0; \
+	clear_thread_flag(TIF_31BIT); \
+	} while(0)
+#endif /* __s390x__ */
 
 #define USE_ELF_CORE_DUMP
 #define ELF_EXEC_PAGESIZE	4096
@@ -47,9 +59,13 @@
    the loader.  We need to make sure that it is out of the way of the program
    that it will "exec", and that there is sufficient room for the brk.  */
 
+#ifndef __s390x__
 #define ELF_ET_DYN_BASE         ((TASK_SIZE & 0x80000000) \
                                 ? TASK_SIZE / 3 * 2 \
                                 : 2 * TASK_SIZE / 3)
+#else /* __s390x__ */
+#define ELF_ET_DYN_BASE         (TASK_SIZE / 3 * 2)
+#endif /* __s390x__ */
 
 /* Wow, the "main" arch needs arch dependent functions too.. :) */
 
@@ -76,7 +92,18 @@
 #define ELF_PLATFORM (NULL)
 
 #ifdef __KERNEL__
+#ifndef __s390x__
 #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
+#else /* __s390x__ */
+#define SET_PERSONALITY(ex, ibcs2)			\
+do {							\
+	if (ibcs2)					\
+		set_personality(PER_SVR4);		\
+	else if (current->personality != PER_LINUX32)	\
+		set_personality(PER_LINUX);		\
+	clear_thread_flag(TIF_31BIT);			\
+} while (0)
+#endif /* __s390x__ */
 #endif
 
 #endif
diff -Nru a/include/asm-s390/fcntl.h b/include/asm-s390/fcntl.h
--- a/include/asm-s390/fcntl.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-s390/fcntl.h	Sat Apr 19 19:51:27 2003
@@ -42,10 +42,11 @@
 #define F_SETSIG	10	/*  for sockets. */
 #define F_GETSIG	11	/*  for sockets. */
 
+#ifndef __s390x__
 #define F_GETLK64	12	/*  using 'struct flock64' */
 #define F_SETLK64	13
 #define F_SETLKW64	14
-                               
+#endif /* ! __s390x__ */
 
 /* for F_[GET|SET]FL */
 #define FD_CLOEXEC	1	/* actually anything with low bit set goes */
@@ -82,6 +83,7 @@
 	pid_t l_pid;
 };
 
+#ifndef __s390x__
 struct flock64 {
 	short  l_type;
 	short  l_whence;
@@ -89,6 +91,6 @@
 	loff_t l_len;
 	pid_t  l_pid;
 };
-
+#endif
 #define F_LINUX_SPECIFIC_BASE	1024
 #endif
diff -Nru a/include/asm-s390/gdb-stub.h b/include/asm-s390/gdb-stub.h
--- a/include/asm-s390/gdb-stub.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,22 +0,0 @@
-/*
- *  include/asm-s390/gdb-stub.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- */
-
-#ifndef __S390_GDB_STUB__
-#define __S390_GDB_STUB__
-#include <linux/config.h>
-#if CONFIG_REMOTE_DEBUG
-#include <asm/ptrace.h>
-extern int    gdb_stub_initialised;
-extern void gdb_stub_handle_exception(struct gdb_pt_regs *regs,int sigval);
-struct net_device;
-extern struct net_device *gdb_dev;
-void gdb_do_timers(void);
-extern int putDebugChar(char c);    /* write a single character      */
-extern char getDebugChar(void);     /* read and return a single char */
-#endif
-#endif
diff -Nru a/include/asm-s390/hardirq.h b/include/asm-s390/hardirq.h
--- a/include/asm-s390/hardirq.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/hardirq.h	Sat Apr 19 19:51:51 2003
@@ -80,6 +80,8 @@
 
 extern void do_call_softirq(void);
 
+#define invoke_softirq() do_call_softirq()
+
 #if CONFIG_PREEMPT
 # define in_atomic()	(in_interrupt() || preempt_count() == PREEMPT_ACTIVE)
 # define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
diff -Nru a/include/asm-s390/idals.h b/include/asm-s390/idals.h
--- a/include/asm-s390/idals.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-s390/idals.h	Sat Apr 19 19:51:28 2003
@@ -21,7 +21,7 @@
 #include <asm/cio.h>
 #include <asm/uaccess.h>
 
-#ifdef CONFIG_ARCH_S390X
+#ifdef __s390x__
 #define IDA_SIZE_LOG 12 /* 11 for 2k , 12 for 4k */
 #else
 #define IDA_SIZE_LOG 11 /* 11 for 2k , 12 for 4k */
@@ -34,7 +34,7 @@
 static inline int
 idal_is_needed(void *vaddr, unsigned int length)
 {
-#if defined(CONFIG_ARCH_S390X)
+#ifdef __s390x__
 	return ((__pa(vaddr) + length) >> 31) != 0;
 #else
 	return 0;
@@ -48,7 +48,7 @@
 static inline unsigned int
 idal_nr_words(void *vaddr, unsigned int length)
 {
-#if defined(CONFIG_ARCH_S390X)
+#ifdef __s390x__
 	if (idal_is_needed(vaddr, length))
 		return ((__pa(vaddr) & (IDA_BLOCK_SIZE-1)) + length + 
 			(IDA_BLOCK_SIZE-1)) >> IDA_SIZE_LOG;
@@ -62,7 +62,7 @@
 static inline unsigned long *
 idal_create_words(unsigned long *idaws, void *vaddr, unsigned int length)
 {
-#if defined(CONFIG_ARCH_S390X)
+#ifdef __s390x__
 	unsigned long paddr;
 	unsigned int cidaw;
 
@@ -86,7 +86,7 @@
 static inline int
 set_normalized_cda(struct ccw1 * ccw, void *vaddr)
 {
-#if defined (CONFIG_ARCH_S390X)
+#ifdef __s390x__
 	unsigned int nridaws;
 	unsigned long *idal;
 
@@ -113,7 +113,7 @@
 static inline void
 clear_normalized_cda(struct ccw1 * ccw)
 {
-#if defined(CONFIG_ARCH_S390X)
+#ifdef __s390x__
 	if (ccw->flags & CCW_FLAG_IDA) {
 		kfree((void *)(unsigned long) ccw->cda);
 		ccw->flags &= ~CCW_FLAG_IDA;
@@ -190,7 +190,7 @@
 static inline int
 __idal_buffer_is_needed(struct idal_buffer *ib)
 {
-#ifdef CONFIG_ARCH_S390X
+#ifdef __s390x__
 	return ib->size > (4096ul << ib->page_order) ||
 		idal_is_needed(ib->data[0], ib->size);
 #else
diff -Nru a/include/asm-s390/io.h b/include/asm-s390/io.h
--- a/include/asm-s390/io.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-s390/io.h	Sat Apr 19 19:51:49 2003
@@ -27,9 +27,16 @@
 extern inline unsigned long virt_to_phys(volatile void * address)
 {
 	unsigned long real_address;
-	__asm__ ("   lra    %0,0(%1)\n"
+	__asm__ (
+#ifndef __s390x__
+		 "   lra    %0,0(%1)\n"
                  "   jz     0f\n"
                  "   sr     %0,%0\n"
+#else /* __s390x__ */
+		 "   lrag   %0,0(%1)\n"
+                 "   jz     0f\n"
+                 "   slgr   %0,%0\n"
+#endif /* __s390x__ */
                  "0:"
                  : "=a" (real_address) : "a" (address) : "cc" );
         return real_address;
diff -Nru a/include/asm-s390/ipc.h b/include/asm-s390/ipc.h
--- a/include/asm-s390/ipc.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-s390/ipc.h	Sat Apr 19 19:51:50 2003
@@ -22,6 +22,7 @@
 #define SEMOP		 1
 #define SEMGET		 2
 #define SEMCTL		 3
+#define SEMTIMEDOP	 4
 #define MSGSND		11
 #define MSGRCV		12
 #define MSGGET		13
diff -Nru a/include/asm-s390/ipcbuf.h b/include/asm-s390/ipcbuf.h
--- a/include/asm-s390/ipcbuf.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/ipcbuf.h	Sat Apr 19 19:51:47 2003
@@ -21,7 +21,9 @@
 	__kernel_mode_t		mode;
 	unsigned short		__pad1;
 	unsigned short		seq;
+#ifndef __s390x__
 	unsigned short		__pad2;
+#endif /* ! __s390x__ */
 	unsigned long		__unused1;
 	unsigned long		__unused2;
 };
diff -Nru a/include/asm-s390/lowcore.h b/include/asm-s390/lowcore.h
--- a/include/asm-s390/lowcore.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/lowcore.h	Sat Apr 19 19:51:47 2003
@@ -11,6 +11,7 @@
 #ifndef _ASM_S390_LOWCORE_H
 #define _ASM_S390_LOWCORE_H
 
+#ifndef __s390x__
 #define __LC_EXT_OLD_PSW                0x018
 #define __LC_SVC_OLD_PSW                0x020
 #define __LC_PGM_OLD_PSW                0x028
@@ -21,43 +22,76 @@
 #define __LC_PGM_NEW_PSW                0x068
 #define __LC_MCK_NEW_PSW                0x070
 #define __LC_IO_NEW_PSW                 0x078
+#else /* !__s390x__ */
+#define __LC_EXT_OLD_PSW                0x0130
+#define __LC_SVC_OLD_PSW                0x0140
+#define __LC_PGM_OLD_PSW                0x0150
+#define __LC_MCK_OLD_PSW                0x0160
+#define __LC_IO_OLD_PSW                 0x0170
+#define __LC_EXT_NEW_PSW                0x01b0
+#define __LC_SVC_NEW_PSW                0x01c0
+#define __LC_PGM_NEW_PSW                0x01d0
+#define __LC_MCK_NEW_PSW                0x01e0
+#define __LC_IO_NEW_PSW                 0x01f0
+#endif /* !__s390x__ */
+
 #define __LC_EXT_PARAMS                 0x080
 #define __LC_CPU_ADDRESS                0x084
 #define __LC_EXT_INT_CODE               0x086
-#define __LC_SVC_INT_CODE               0x08B
+
+#define __LC_SVC_ILC                    0x088
+#define __LC_SVC_INT_CODE               0x08A
 #define __LC_PGM_ILC                    0x08C
 #define __LC_PGM_INT_CODE               0x08E
-#define __LC_TRANS_EXC_ADDR             0x090
+
 #define __LC_SUBCHANNEL_ID              0x0B8
 #define __LC_SUBCHANNEL_NR              0x0BA
 #define __LC_IO_INT_PARM                0x0BC
 #define __LC_IO_INT_WORD                0x0C0
 #define __LC_MCCK_CODE                  0x0E8
-#define __LC_AREGS_SAVE_AREA            0x120
-#define __LC_CREGS_SAVE_AREA            0x1C0
 
 #define __LC_RETURN_PSW                 0x200
-#define __LC_IRB			0x208
+
+#define __LC_IRB			0x210
+
+#define __LC_DIAG44_OPCODE		0x250
 
 #define __LC_SAVE_AREA                  0xC00
+
+#ifndef __s390x__
 #define __LC_KERNEL_STACK               0xC40
 #define __LC_ASYNC_STACK                0xC44
 #define __LC_CPUID                      0xC60
 #define __LC_CPUADDR                    0xC68
 #define __LC_IPLDEV                     0xC7C
-
 #define __LC_JIFFY_TIMER		0xC80
+#else /* __s390x__ */
+#define __LC_KERNEL_STACK               0xD40
+#define __LC_ASYNC_STACK                0xD48
+#define __LC_CPUID                      0xD90
+#define __LC_CPUADDR                    0xD98
+#define __LC_IPLDEV                     0xDB8
+#define __LC_JIFFY_TIMER		0xDC0
+#endif /* __s390x__ */
 
 #define __LC_PANIC_MAGIC                0xE00
 
+#ifndef __s390x__
 #define __LC_PFAULT_INTPARM             0x080
+#define __LC_AREGS_SAVE_AREA            0x120
+#define __LC_CREGS_SAVE_AREA            0x1C0
+#else /* __s390x__ */
+#define __LC_PFAULT_INTPARM             0x11B8
+#define __LC_AREGS_SAVE_AREA            0x1340
+#define __LC_CREGS_SAVE_AREA            0x1380
+#endif /* __s390x__ */
 
 #ifndef __ASSEMBLY__
 
 #include <linux/config.h>
+#include <asm/processor.h>
 #include <linux/types.h>
 #include <asm/atomic.h>
-#include <asm/processor.h>
 #include <asm/sigp.h>
 
 void restart_int_handler(void);
@@ -69,6 +103,7 @@
 
 struct _lowcore
 {
+#ifndef __s390x__
         /* prefix area: defined by architecture */
 	psw_t        restart_psw;              /* 0x000 */
 	__u32        ccw2[4];                  /* 0x008 */
@@ -142,6 +177,101 @@
 
         /* Align to the top 1k of prefix area */
 	__u8         pad12[0x1000-0xe04];      /* 0xe04 */
+#else /* !__s390x__ */
+        /* prefix area: defined by architecture */
+	__u32        ccw1[2];                  /* 0x000 */
+	__u32        ccw2[4];                  /* 0x008 */
+	__u8         pad1[0x80-0x18];          /* 0x018 */
+	__u32        ext_params;               /* 0x080 */
+	__u16        cpu_addr;                 /* 0x084 */
+	__u16        ext_int_code;             /* 0x086 */
+        __u16        svc_ilc;                  /* 0x088 */
+        __u16        svc_code;                 /* 0x08a */
+        __u16        pgm_ilc;                  /* 0x08c */
+        __u16        pgm_code;                 /* 0x08e */
+	__u32        data_exc_code;            /* 0x090 */
+	__u16        mon_class_num;            /* 0x094 */
+	__u16        per_perc_atmid;           /* 0x096 */
+	addr_t       per_address;              /* 0x098 */
+	__u8         exc_access_id;            /* 0x0a0 */
+	__u8         per_access_id;            /* 0x0a1 */
+	__u8         op_access_id;             /* 0x0a2 */
+	__u8         ar_access_id;             /* 0x0a3 */
+	__u8         pad2[0xA8-0xA4];          /* 0x0a4 */
+	addr_t       trans_exc_code;           /* 0x0A0 */
+	addr_t       monitor_code;             /* 0x09c */
+	__u16        subchannel_id;            /* 0x0b8 */
+	__u16        subchannel_nr;            /* 0x0ba */
+	__u32        io_int_parm;              /* 0x0bc */
+	__u32        io_int_word;              /* 0x0c0 */
+	__u8         pad3[0xc8-0xc4];          /* 0x0c4 */
+	__u32        stfl_fac_list;            /* 0x0c8 */
+	__u8         pad4[0xe8-0xcc];          /* 0x0cc */
+	__u32        mcck_interruption_code[2]; /* 0x0e8 */
+	__u8         pad5[0xf4-0xf0];          /* 0x0f0 */
+	__u32        external_damage_code;     /* 0x0f4 */
+	addr_t       failing_storage_address;  /* 0x0f8 */
+	__u8         pad6[0x120-0x100];        /* 0x100 */
+	psw_t        restart_old_psw;          /* 0x120 */
+	psw_t        external_old_psw;         /* 0x130 */
+	psw_t        svc_old_psw;              /* 0x140 */
+	psw_t        program_old_psw;          /* 0x150 */
+	psw_t        mcck_old_psw;             /* 0x160 */
+	psw_t        io_old_psw;               /* 0x170 */
+	__u8         pad7[0x1a0-0x180];        /* 0x180 */
+	psw_t        restart_psw;              /* 0x1a0 */
+	psw_t        external_new_psw;         /* 0x1b0 */
+	psw_t        svc_new_psw;              /* 0x1c0 */
+	psw_t        program_new_psw;          /* 0x1d0 */
+	psw_t        mcck_new_psw;             /* 0x1e0 */
+	psw_t        io_new_psw;               /* 0x1f0 */
+        psw_t        return_psw;               /* 0x200 */
+	__u8	     irb[64];		       /* 0x210 */
+	__u32        diag44_opcode;            /* 0x250 */
+        __u8         pad8[0xc00-0x254];        /* 0x254 */
+        /* System info area */
+	__u64        save_area[16];            /* 0xc00 */
+        __u8         pad9[0xd40-0xc80];        /* 0xc80 */
+ 	__u64        kernel_stack;             /* 0xd40 */
+	__u64        async_stack;              /* 0xd48 */
+	/* entry.S sensitive area start */
+	__u8         pad10[0xd80-0xd50];       /* 0xd64 */
+	struct       cpuinfo_S390 cpu_data;    /* 0xd80 */
+	__u32        ipl_device;               /* 0xdb8 */
+	__u32        pad11;                    /* 0xdbc */
+	/* entry.S sensitive area end */
+
+        /* SMP info area: defined by DJB */
+        __u64        jiffy_timer;              /* 0xdc0 */
+	__u64        ext_call_fast;            /* 0xdc8 */
+        __u8         pad12[0xe00-0xdd0];       /* 0xdd0 */
+
+        /* 0xe00 is used as indicator for dump tools */
+        /* whether the kernel died with panic() or not */
+        __u32        panic_magic;              /* 0xe00 */
+
+	__u8         pad13[0x1200-0xe04];      /* 0xe04 */
+
+        /* System info area */ 
+
+	__u64        floating_pt_save_area[16]; /* 0x1200 */
+	__u64        gpregs_save_area[16];      /* 0x1280 */
+	__u32        st_status_fixed_logout[4]; /* 0x1300 */
+	__u8         pad14[0x1318-0x1310];      /* 0x1310 */
+	__u32        prefixreg_save_area;       /* 0x1318 */
+	__u32        fpt_creg_save_area;        /* 0x131c */
+	__u8         pad15[0x1324-0x1320];      /* 0x1320 */
+	__u32        tod_progreg_save_area;     /* 0x1324 */
+	__u32        cpu_timer_save_area[2];    /* 0x1328 */
+	__u32        clock_comp_save_area[2];   /* 0x1330 */
+	__u8         pad16[0x1340-0x1338];      /* 0x1338 */ 
+	__u32        access_regs_save_area[16]; /* 0x1340 */ 
+	__u64        cregs_save_area[16];       /* 0x1380 */
+
+	/* align to the top of the prefix area */
+
+	__u8         pad17[0x2000-0x1400];      /* 0x1400 */
+#endif /* !__s390x__ */
 } __attribute__((packed)); /* End structure*/
 
 #define S390_lowcore (*((struct _lowcore *) 0))
diff -Nru a/include/asm-s390/mmu_context.h b/include/asm-s390/mmu_context.h
--- a/include/asm-s390/mmu_context.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/mmu_context.h	Sat Apr 19 19:51:47 2003
@@ -27,12 +27,20 @@
         unsigned long pgd;
 
         if (prev != next) {
+#ifndef __s390x__
 	        pgd = (__pa(next->pgd)&PAGE_MASK) | 
                       (_SEGMENT_TABLE|USER_STD_MASK);
                 /* Load page tables */
                 asm volatile("    lctl  7,7,%0\n"   /* secondary space */
                              "    lctl  13,13,%0\n" /* home space */
                              : : "m" (pgd) );
+#else /* __s390x__ */
+                pgd = (__pa(next->pgd)&PAGE_MASK) | (_REGION_TABLE|USER_STD_MASK);
+                /* Load page tables */
+                asm volatile("    lctlg 7,7,%0\n"   /* secondary space */
+                             "    lctlg 13,13,%0\n" /* home space */
+                             : : "m" (pgd) );
+#endif /* __s390x__ */
         }
 	set_bit(cpu, &next->cpu_vm_mask);
 }
diff -Nru a/include/asm-s390/module.h b/include/asm-s390/module.h
--- a/include/asm-s390/module.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-s390/module.h	Sat Apr 19 19:51:27 2003
@@ -28,7 +28,7 @@
 	struct mod_arch_syminfo *syminfo;
 };
 
-#ifdef CONFIG_ARCH_S390X
+#ifdef __s390x__
 #define ElfW(x) Elf64_ ## x
 #define ELFW(x) ELF64_ ## x
 #else
@@ -36,8 +36,11 @@
 #define ELFW(x) ELF32_ ## x
 #endif
 
+#define Elf_Addr ElfW(Addr)
+#define Elf_Rela ElfW(Rela)
 #define Elf_Shdr ElfW(Shdr)
 #define Elf_Sym ElfW(Sym)
 #define Elf_Ehdr ElfW(Ehdr)
+#define ELF_R_SYM ELFW(R_SYM)
 #define ELF_R_TYPE ELFW(R_TYPE)
 #endif /* _ASM_S390_MODULE_H */
diff -Nru a/include/asm-s390/msgbuf.h b/include/asm-s390/msgbuf.h
--- a/include/asm-s390/msgbuf.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-s390/msgbuf.h	Sat Apr 19 19:51:48 2003
@@ -14,11 +14,17 @@
 struct msqid64_ds {
 	struct ipc64_perm msg_perm;
 	__kernel_time_t msg_stime;	/* last msgsnd time */
+#ifndef __s390x__
 	unsigned long	__unused1;
+#endif /* ! __s390x__ */
 	__kernel_time_t msg_rtime;	/* last msgrcv time */
+#ifndef __s390x__
 	unsigned long	__unused2;
+#endif /* ! __s390x__ */
 	__kernel_time_t msg_ctime;	/* last change time */
+#ifndef __s390x__
 	unsigned long	__unused3;
+#endif /* ! __s390x__ */
 	unsigned long  msg_cbytes;	/* current number of bytes on queue */
 	unsigned long  msg_qnum;	/* number of messages in queue */
 	unsigned long  msg_qbytes;	/* max number of bytes on queue */
diff -Nru a/include/asm-s390/page.h b/include/asm-s390/page.h
--- a/include/asm-s390/page.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-s390/page.h	Sat Apr 19 19:51:28 2003
@@ -20,6 +20,8 @@
 #ifdef __KERNEL__
 #ifndef __ASSEMBLY__
 
+#ifndef __s390x__
+
 static inline void clear_page(void *page)
 {
 	register_pair rp;
@@ -59,6 +61,48 @@
 			      : "memory" );
 }
 
+#else /* __s390x__ */
+
+static inline void clear_page(void *page)
+{
+        asm volatile ("   lgr  2,%0\n"
+                      "   lghi 3,4096\n"
+                      "   slgr 1,1\n"
+                      "   mvcl 2,0"
+                      : : "a" ((void *) (page))
+		      : "memory", "cc", "1", "2", "3" );
+}
+
+static inline void copy_page(void *to, void *from)
+{
+        if (MACHINE_HAS_MVPG)
+		asm volatile ("   sgr  0,0\n"
+			      "   mvpg %0,%1"
+			      : : "a" ((void *)(to)), "a" ((void *)(from))
+			      : "memory", "cc", "0" );
+	else
+		asm volatile ("   mvc  0(256,%0),0(%1)\n"
+			      "   mvc  256(256,%0),256(%1)\n"
+			      "   mvc  512(256,%0),512(%1)\n"
+			      "   mvc  768(256,%0),768(%1)\n"
+			      "   mvc  1024(256,%0),1024(%1)\n"
+			      "   mvc  1280(256,%0),1280(%1)\n"
+			      "   mvc  1536(256,%0),1536(%1)\n"
+			      "   mvc  1792(256,%0),1792(%1)\n"
+			      "   mvc  2048(256,%0),2048(%1)\n"
+			      "   mvc  2304(256,%0),2304(%1)\n"
+			      "   mvc  2560(256,%0),2560(%1)\n"
+			      "   mvc  2816(256,%0),2816(%1)\n"
+			      "   mvc  3072(256,%0),3072(%1)\n"
+			      "   mvc  3328(256,%0),3328(%1)\n"
+			      "   mvc  3584(256,%0),3584(%1)\n"
+			      "   mvc  3840(256,%0),3840(%1)\n"
+			      : : "a"((void *)(to)),"a"((void *)(from)) 
+			      : "memory" );
+}
+
+#endif /* __s390x__ */
+
 #define clear_user_page(page, vaddr, pg)	clear_page(page)
 #define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
 
@@ -79,7 +123,15 @@
 /*
  * These are used to make use of C type-checking..
  */
+
+typedef struct { unsigned long pgprot; } pgprot_t;
 typedef struct { unsigned long pte; } pte_t;
+
+#define pte_val(x)      ((x).pte)
+#define pgprot_val(x)   ((x).pgprot)
+
+#ifndef __s390x__
+
 typedef struct { unsigned long pmd; } pmd_t;
 typedef struct {
         unsigned long pgd0;
@@ -87,12 +139,23 @@
         unsigned long pgd2;
         unsigned long pgd3;
         } pgd_t;
-typedef struct { unsigned long pgprot; } pgprot_t;
 
-#define pte_val(x)      ((x).pte)
 #define pmd_val(x)      ((x).pmd)
 #define pgd_val(x)      ((x).pgd0)
-#define pgprot_val(x)   ((x).pgprot)
+
+#else /* __s390x__ */
+
+typedef struct { 
+        unsigned long pmd0;
+        unsigned long pmd1; 
+        } pmd_t;
+typedef struct { unsigned long pgd; } pgd_t;
+
+#define pmd_val(x)      ((x).pmd0)
+#define pmd_val1(x)     ((x).pmd1)
+#define pgd_val(x)      ((x).pgd)
+
+#endif /* __s390x__ */
 
 #define __pte(x)        ((pte_t) { (x) } )
 #define __pmd(x)        ((pmd_t) { (x) } )
diff -Nru a/include/asm-s390/pgalloc.h b/include/asm-s390/pgalloc.h
--- a/include/asm-s390/pgalloc.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-s390/pgalloc.h	Sat Apr 19 19:51:49 2003
@@ -1,5 +1,5 @@
 /*
- *  include/asm-s390/bugs.h
+ *  include/asm-s390/pgalloc.h
  *
  *  S390 version
  *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
@@ -32,35 +32,79 @@
 	pgd_t *pgd;
 	int i;
 
+#ifndef __s390x__
 	pgd = (pgd_t *) __get_free_pages(GFP_KERNEL,1);
         if (pgd != NULL)
 		for (i = 0; i < USER_PTRS_PER_PGD; i++)
 			pmd_clear(pmd_offset(pgd + i, i*PGDIR_SIZE));
+#else /* __s390x__ */
+	pgd = (pgd_t *) __get_free_pages(GFP_KERNEL,2);
+        if (pgd != NULL)
+		for (i = 0; i < PTRS_PER_PGD; i++)
+			pgd_clear(pgd + i);
+#endif /* __s390x__ */
 	return pgd;
 }
 
 static inline void pgd_free(pgd_t *pgd)
 {
+#ifndef __s390x__
         free_pages((unsigned long) pgd, 1);
+#else /* __s390x__ */
+        free_pages((unsigned long) pgd, 2);
+#endif /* __s390x__ */
 }
 
+#ifndef __s390x__
 /*
  * page middle directory allocation/free routines.
- * We don't use pmd cache, so these are dummy routines. This
+ * We use pmd cache only on s390x, so these are dummy routines. This
  * code never triggers because the pgd will always be present.
  */
 #define pmd_alloc_one(mm,address)       ({ BUG(); ((pmd_t *)2); })
 #define pmd_free(x)                     do { } while (0)
 #define __pmd_free_tlb(tlb,x)		do { } while (0)
 #define pgd_populate(mm, pmd, pte)      BUG()
+#else /* __s390x__ */
+static inline pmd_t * pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
+{
+	pmd_t *pmd;
+        int i;
+
+	pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, 2);
+	if (pmd != NULL) {
+		for (i=0; i < PTRS_PER_PMD; i++)
+			pmd_clear(pmd+i);
+	}
+	return pmd;
+}
+
+static inline void pmd_free (pmd_t *pmd)
+{
+	free_pages((unsigned long) pmd, 2);
+}
+
+#define __pmd_free_tlb(tlb,pmd) pmd_free(pmd)
+
+static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
+{
+	pgd_val(*pgd) = _PGD_ENTRY | __pa(pmd);
+}
+
+#endif /* __s390x__ */
 
 static inline void 
 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
 {
+#ifndef __s390x__
 	pmd_val(pmd[0]) = _PAGE_TABLE + __pa(pte);
 	pmd_val(pmd[1]) = _PAGE_TABLE + __pa(pte+256);
 	pmd_val(pmd[2]) = _PAGE_TABLE + __pa(pte+512);
 	pmd_val(pmd[3]) = _PAGE_TABLE + __pa(pte+768);
+#else /* __s390x__ */
+	pmd_val(*pmd) = _PMD_ENTRY + __pa(pte);
+	pmd_val1(*pmd) = _PMD_ENTRY + __pa(pte+256);
+#endif /* __s390x__ */
 }
 
 static inline void
@@ -122,11 +166,16 @@
                                     unsigned long address, pte_t *ptep)
 {
 	pte_t pte = *ptep;
+#ifndef __s390x__
 	if (!(pte_val(pte) & _PAGE_INVALID)) {
 		/* S390 has 1mb segments, we are emulating 4MB segments */
 		pte_t *pto = (pte_t *) (((unsigned long) ptep) & 0x7ffffc00);
 		__asm__ __volatile__ ("ipte %0,%1" : : "a" (pto), "a" (address));
 	}
+#else /* __s390x__ */
+	if (!(pte_val(pte) & _PAGE_INVALID)) 
+		__asm__ __volatile__ ("ipte %0,%1" : : "a" (ptep), "a" (address));
+#endif /* __s390x__ */
 	pte_clear(ptep);
 	return pte;
 }
diff -Nru a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h
--- a/include/asm-s390/pgtable.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-s390/pgtable.h	Sat Apr 19 19:51:50 2003
@@ -14,10 +14,12 @@
 #define _ASM_S390_PGTABLE_H
 
 /*
- * The Linux memory management assumes a three-level page table setup. On
- * the S390, we use that, but "fold" the mid level into the top-level page
- * table, so that we physically have the same two-level page table as the
- * S390 mmu expects.
+ * The Linux memory management assumes a three-level page table setup. For
+ * s390 31 bit we "fold" the mid level into the top-level page table, so
+ * that we physically have the same two-level page table as the s390 mmu
+ * expects in 31 bit mode. For s390 64 bit we use three of the five levels
+ * the hardware provides (region first and region second tables are not
+ * used).
  *
  * The "pgd_xxx()" functions are trivial for a folded two-level
  * setup: the pgd is never bad, and a pmd always exists (as it's folded
@@ -50,13 +52,18 @@
 /*
  * PMD_SHIFT determines the size of the area a second-level page
  * table can map
+ * PGDIR_SHIFT determines what a third-level page table entry can map
  */
-#define PMD_SHIFT       22
+#ifndef __s390x__
+# define PMD_SHIFT	22
+# define PGDIR_SHIFT	22
+#else /* __s390x__ */
+# define PMD_SHIFT	21
+# define PGDIR_SHIFT	31
+#endif /* __s390x__ */
+
 #define PMD_SIZE        (1UL << PMD_SHIFT)
 #define PMD_MASK        (~(PMD_SIZE-1))
-
-/* PGDIR_SHIFT determines what a third-level page table entry can map */
-#define PGDIR_SHIFT     22
 #define PGDIR_SIZE      (1UL << PGDIR_SHIFT)
 #define PGDIR_MASK      (~(PGDIR_SIZE-1))
 
@@ -66,24 +73,37 @@
  * for S390 segment-table entries are combined to one PGD
  * that leads to 1024 pte per pgd
  */
-#define PTRS_PER_PTE    1024
-#define PTRS_PER_PMD    1
-#define PTRS_PER_PGD    512
+#ifndef __s390x__
+# define PTRS_PER_PTE    1024
+# define PTRS_PER_PMD    1
+# define PTRS_PER_PGD    512
+#else /* __s390x__ */
+# define PTRS_PER_PTE    512
+# define PTRS_PER_PMD    1024
+# define PTRS_PER_PGD    2048
+#endif /* __s390x__ */
 
 /*
  * pgd entries used up by user/kernel:
  */
-#define USER_PTRS_PER_PGD  512
-#define USER_PGD_PTRS      512
-#define KERNEL_PGD_PTRS    512
-#define FIRST_USER_PGD_NR  0
+#ifndef __s390x__
+# define USER_PTRS_PER_PGD  512
+# define USER_PGD_PTRS      512
+# define KERNEL_PGD_PTRS    512
+# define FIRST_USER_PGD_NR  0
+#else /* __s390x__ */
+# define USER_PTRS_PER_PGD  2048
+# define USER_PGD_PTRS      2048
+# define KERNEL_PGD_PTRS    2048
+# define FIRST_USER_PGD_NR  0
+#endif /* __s390x__ */
 
 #define pte_ERROR(e) \
-	printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
+	printk("%s:%d: bad pte %p.\n", __FILE__, __LINE__, (void *) pte_val(e))
 #define pmd_ERROR(e) \
-	printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e))
+	printk("%s:%d: bad pmd %p.\n", __FILE__, __LINE__, (void *) pmd_val(e))
 #define pgd_ERROR(e) \
-	printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
+	printk("%s:%d: bad pgd %p.\n", __FILE__, __LINE__, (void *) pgd_val(e))
 
 #ifndef __ASSEMBLY__
 /*
@@ -98,11 +118,15 @@
 #define VMALLOC_START   (((unsigned long) high_memory + VMALLOC_OFFSET) \
 			 & ~(VMALLOC_OFFSET-1))
 #define VMALLOC_VMADDR(x) ((unsigned long)(x))
-#define VMALLOC_END     (0x7fffffffL)
+#ifndef __s390x__
+# define VMALLOC_END     (0x7fffffffL)
+#else /* __s390x__ */
+# define VMALLOC_END     (0x40000000000L)
+#endif /* __s390x__ */
 
 
 /*
- * A pagetable entry of S390 has following format:
+ * A 31 bit pagetable entry of S390 has following format:
  *  |   PFRA          |    |  OS  |
  * 0                   0IP0
  * 00000000001111111111222222222233
@@ -111,7 +135,7 @@
  * I Page-Invalid Bit:    Page is not available for address-translation
  * P Page-Protection Bit: Store access not possible for page
  *
- * A segmenttable entry of S390 has following format:
+ * A 31 bit segmenttable entry of S390 has following format:
  *  |   P-table origin      |  |PTL
  * 0                         IC
  * 00000000001111111111222222222233
@@ -121,7 +145,7 @@
  * C Common-Segment Bit:     Segment is not private (PoP 3-30)
  * PTL Page-Table-Length:    Page-table length (PTL+1*16 entries -> up to 256)
  *
- * The segmenttable origin of S390 has following format:
+ * The 31 bit segmenttable origin of S390 has following format:
  *
  *  |S-table origin   |     | STL |
  * X                   **GPS
@@ -134,6 +158,46 @@
  * S Storage-Alteration:
  * STL Segment-Table-Length:  Segment-table length (STL+1*16 entries -> up to 2048)
  *
+ * A 64 bit pagetable entry of S390 has following format:
+ * |                     PFRA                         |0IP0|  OS  |
+ * 0000000000111111111122222222223333333333444444444455555555556666
+ * 0123456789012345678901234567890123456789012345678901234567890123
+ *
+ * I Page-Invalid Bit:    Page is not available for address-translation
+ * P Page-Protection Bit: Store access not possible for page
+ *
+ * A 64 bit segmenttable entry of S390 has following format:
+ * |        P-table origin                              |      TT
+ * 0000000000111111111122222222223333333333444444444455555555556666
+ * 0123456789012345678901234567890123456789012345678901234567890123
+ *
+ * I Segment-Invalid Bit:    Segment is not available for address-translation
+ * C Common-Segment Bit:     Segment is not private (PoP 3-30)
+ * P Page-Protection Bit: Store access not possible for page
+ * TT Type 00
+ *
+ * A 64 bit region table entry of S390 has following format:
+ * |        S-table origin                             |   TF  TTTL
+ * 0000000000111111111122222222223333333333444444444455555555556666
+ * 0123456789012345678901234567890123456789012345678901234567890123
+ *
+ * I Segment-Invalid Bit:    Segment is not available for address-translation
+ * TT Type 01
+ * TF
+ * TL Table lenght
+ *
+ * The 64 bit regiontable origin of S390 has following format:
+ * |      region table origon                          |       DTTL
+ * 0000000000111111111122222222223333333333444444444455555555556666
+ * 0123456789012345678901234567890123456789012345678901234567890123
+ *
+ * X Space-Switch event:
+ * G Segment-Invalid Bit:  
+ * P Private-Space Bit:    
+ * S Storage-Alteration:
+ * R Real space
+ * TL Table-Length:
+ *
  * A storage key has the following format:
  * | ACC |F|R|C|0|
  *  0   3 4 5 6 7
@@ -143,13 +207,23 @@
  * C  : changed bit
  */
 
-/* Bits in the page table entry */
-#define _PAGE_PRESENT   0x001          /* Software                         */
-#define _PAGE_MKCLEAN   0x002          /* Software                         */
-#define _PAGE_ISCLEAN   0x004	       /* Software			   */
+/* Hardware bits in the page table entry */
 #define _PAGE_RO        0x200          /* HW read-only                     */
 #define _PAGE_INVALID   0x400          /* HW invalid                       */
 
+/* Software bits in the page table entry */
+#define _PAGE_MKCLEAN   0x002
+#define _PAGE_ISCLEAN   0x004
+
+/* Mask and four different kinds of invalid pages. */
+#define _PAGE_INVALID_MASK	0x601
+#define _PAGE_INVALID_EMPTY	0x400
+#define _PAGE_INVALID_NONE	0x001
+#define _PAGE_INVALID_SWAP	0x200
+#define _PAGE_INVALID_FILE	0x201
+
+#ifndef __s390x__
+
 /* Bits in the segment table entry */
 #define _PAGE_TABLE_LEN 0xf            /* only full page-tables            */
 #define _PAGE_TABLE_COM 0x10           /* common page-table                */
@@ -166,29 +240,54 @@
 /*
  * User and Kernel pagetables are identical
  */
-#define _PAGE_TABLE     (_PAGE_TABLE_LEN )
-#define _KERNPG_TABLE   (_PAGE_TABLE_LEN )
+#define _PAGE_TABLE	_PAGE_TABLE_LEN
+#define _KERNPG_TABLE	_PAGE_TABLE_LEN
 
 /*
  * The Kernel segment-tables includes the User segment-table
  */
 
-#define _SEGMENT_TABLE  (_USER_SEG_TABLE_LEN|0x80000000|0x100)
-#define _KERNSEG_TABLE  (_KERNEL_SEG_TABLE_LEN)
+#define _SEGMENT_TABLE	(_USER_SEG_TABLE_LEN|0x80000000|0x100)
+#define _KERNSEG_TABLE	_KERNEL_SEG_TABLE_LEN
+
+#define USER_STD_MASK	0x00000080UL
+
+#else /* __s390x__ */
+
+/* Bits in the segment table entry */
+#define _PMD_ENTRY_INV   0x20          /* invalid segment table entry      */
+#define _PMD_ENTRY       0x00        
+
+/* Bits in the region third table entry */
+#define _PGD_ENTRY_INV   0x20          /* invalid region table entry       */
+#define _PGD_ENTRY       0x07
+
+/*
+ * User and kernel page directory
+ */
+#define _REGION_THIRD       0x4
+#define _REGION_THIRD_LEN   0x3 
+#define _REGION_TABLE       (_REGION_THIRD|_REGION_THIRD_LEN|0x40|0x100)
+#define _KERN_REGION_TABLE  (_REGION_THIRD|_REGION_THIRD_LEN)
+
+#define USER_STD_MASK           0x0000000000000080UL
 
-#define USER_STD_MASK           0x00000080UL
+/* Bits in the storage key */
+#define _PAGE_CHANGED    0x02          /* HW changed bit                   */
+#define _PAGE_REFERENCED 0x04          /* HW referenced bit                */
+
+#endif /* __s390x__ */
 
 /*
  * No mapping available
  */
-#define PAGE_INVALID	  __pgprot(_PAGE_INVALID)
-#define PAGE_NONE_SHARED  __pgprot(_PAGE_PRESENT|_PAGE_INVALID)
-#define PAGE_NONE_PRIVATE __pgprot(_PAGE_PRESENT|_PAGE_INVALID|_PAGE_ISCLEAN)
-#define PAGE_RO_SHARED	  __pgprot(_PAGE_PRESENT|_PAGE_RO)
-#define PAGE_RO_PRIVATE	  __pgprot(_PAGE_PRESENT|_PAGE_RO|_PAGE_ISCLEAN)
-#define PAGE_COPY	  __pgprot(_PAGE_PRESENT|_PAGE_RO|_PAGE_ISCLEAN)
-#define PAGE_SHARED	  __pgprot(_PAGE_PRESENT)
-#define PAGE_KERNEL	  __pgprot(_PAGE_PRESENT)
+#define PAGE_NONE_SHARED  __pgprot(_PAGE_INVALID_NONE)
+#define PAGE_NONE_PRIVATE __pgprot(_PAGE_INVALID_NONE|_PAGE_ISCLEAN)
+#define PAGE_RO_SHARED	  __pgprot(_PAGE_RO)
+#define PAGE_RO_PRIVATE	  __pgprot(_PAGE_RO|_PAGE_ISCLEAN)
+#define PAGE_COPY	  __pgprot(_PAGE_RO|_PAGE_ISCLEAN)
+#define PAGE_SHARED	  __pgprot(0)
+#define PAGE_KERNEL	  __pgprot(_PAGE_ISCLEAN)
 
 /*
  * The S390 can't do page protection for execute, and considers that the
@@ -236,6 +335,8 @@
 /*
  * pgd/pmd/pte query functions
  */
+#ifndef __s390x__
+
 extern inline int pgd_present(pgd_t pgd) { return 1; }
 extern inline int pgd_none(pgd_t pgd)    { return 0; }
 extern inline int pgd_bad(pgd_t pgd)     { return 0; }
@@ -247,11 +348,54 @@
 	return (pmd_val(pmd) & (~PAGE_MASK & ~_PAGE_TABLE_INV)) != _PAGE_TABLE;
 }
 
-extern inline int pte_present(pte_t pte) { return pte_val(pte) & _PAGE_PRESENT; }
+#else /* __s390x__ */
+
+extern inline int pgd_present(pgd_t pgd)
+{
+	return (pgd_val(pgd) & ~PAGE_MASK) == _PGD_ENTRY;
+}
+
+extern inline int pgd_none(pgd_t pgd)
+{
+	return pgd_val(pgd) & _PGD_ENTRY_INV;
+}
+
+extern inline int pgd_bad(pgd_t pgd)
+{
+	return (pgd_val(pgd) & (~PAGE_MASK & ~_PGD_ENTRY_INV)) != _PGD_ENTRY;
+}
+
+extern inline int pmd_present(pmd_t pmd)
+{
+	return (pmd_val(pmd) & ~PAGE_MASK) == _PMD_ENTRY;
+}
+
+extern inline int pmd_none(pmd_t pmd)
+{
+	return pmd_val(pmd) & _PMD_ENTRY_INV;
+}
+
+extern inline int pmd_bad(pmd_t pmd)
+{
+	return (pmd_val(pmd) & (~PAGE_MASK & ~_PMD_ENTRY_INV)) != _PMD_ENTRY;
+}
+
+#endif /* __s390x__ */
+
 extern inline int pte_none(pte_t pte)
 {
-	return ((pte_val(pte) & 
-                (_PAGE_INVALID | _PAGE_RO | _PAGE_PRESENT)) == _PAGE_INVALID);
+	return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_EMPTY;
+}
+
+extern inline int pte_present(pte_t pte)
+{
+	return !(pte_val(pte) & _PAGE_INVALID) ||
+		(pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_NONE;
+}
+
+extern inline int pte_file(pte_t pte)
+{
+	return (pte_val(pte) & _PAGE_INVALID_MASK) == _PAGE_INVALID_FILE;
 }
 
 #define pte_same(a,b)	(pte_val(a) == pte_val(b))
@@ -286,6 +430,9 @@
 /*
  * pgd/pmd/pte modification functions
  */
+
+#ifndef __s390x__
+
 extern inline void pgd_clear(pgd_t * pgdp)      { }
 
 extern inline void pmd_clear(pmd_t * pmdp)
@@ -296,9 +443,24 @@
 	pmd_val(pmdp[3]) = _PAGE_TABLE_INV;
 }
 
+#else /* __s390x__ */
+
+extern inline void pgd_clear(pgd_t * pgdp)
+{
+	pgd_val(*pgdp) = _PGD_ENTRY_INV | _PGD_ENTRY;
+}
+
+extern inline void pmd_clear(pmd_t * pmdp)
+{
+	pmd_val(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY;
+	pmd_val1(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY;
+}
+
+#endif /* __s390x__ */
+
 extern inline void pte_clear(pte_t *ptep)
 {
-	pte_val(*ptep) = _PAGE_INVALID; 
+	pte_val(*ptep) = _PAGE_INVALID_EMPTY;
 }
 
 /*
@@ -444,6 +606,18 @@
 	__pte;                                                            \
 })
 
+#ifdef __s390x__
+
+#define pfn_pmd(pfn, pgprot)                                              \
+({                                                                        \
+	pgprot_t __pgprot = (pgprot);                                     \
+	unsigned long __physpage = __pa((pfn) << PAGE_SHIFT);             \
+	pmd_t __pmd = __pmd(__physpage + pgprot_val(__pgprot));           \
+	__pmd;                                                            \
+})
+
+#endif /* __s390x__ */
+
 #define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT)
 #define pte_page(x) pfn_to_page(pte_pfn(x))
 
@@ -460,12 +634,23 @@
 /* to find an entry in a kernel page-table-directory */
 #define pgd_offset_k(address) pgd_offset(&init_mm, address)
 
+#ifndef __s390x__
+
 /* Find an entry in the second-level page table.. */
 extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
 {
         return (pmd_t *) dir;
 }
 
+#else /* __s390x__ */
+
+/* Find an entry in the second-level page table.. */
+#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
+#define pmd_offset(dir,addr) \
+	((pmd_t *) pgd_page_kernel(*(dir)) + pmd_index(addr))
+
+#endif /* __s390x__ */
+
 /* Find an entry in the third-level page table.. */
 #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
 #define pte_offset_kernel(pmd, address) \
@@ -476,6 +661,7 @@
 #define pte_unmap_nested(pte) do { } while (0)
 
 /*
+ * 31 bit swap entry format:
  * A page-table entry has some bits we have to treat in a special way.
  * Bits 0, 20 and bit 23 have to be zero, otherwise an specification
  * exception will occur instead of a page translation exception. The
@@ -491,17 +677,38 @@
  * 0|     offset      |0110|type |0
  * 00000000001111111111222222222233
  * 01234567890123456789012345678901
+ *
+ * 64 bit swap entry format:
+ * A page-table entry has some bits we have to treat in a special way.
+ * Bits 52 and bit 55 have to be zero, otherwise an specification
+ * exception will occur instead of a page translation exception. The
+ * specifiation exception has the bad habit not to store necessary
+ * information in the lowcore.
+ * Bit 53 and bit 54 are the page invalid bit and the page protection
+ * bit. We set both to indicate a swapped page.
+ * Bit 63 is used as the software page present bit. If a page is
+ * swapped this obviously has to be zero.
+ * This leaves the bits 0-51 and bits 56-62 to store type and offset.
+ * We use the 7 bits from 56-62 for the type and the 52 bits from 0-51
+ * for the offset.
+ * |                     offset                       |0110|type |0
+ * 0000000000111111111122222222223333333333444444444455555555556666
+ * 0123456789012345678901234567890123456789012345678901234567890123
  */
 extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
 {
 	pte_t pte;
-	pte_val(pte) = (type << 1) | (offset << 12) | _PAGE_INVALID | _PAGE_RO;
+	pte_val(pte) = (type << 1) | (offset << 12) | _PAGE_INVALID_SWAP;
+#ifndef __s390x__
 	pte_val(pte) &= 0x7ffff6fe;  /* better to be paranoid */
+#else /* __s390x__ */
+	pte_val(pte) &= 0xfffffffffffff6fe;  /* better to be paranoid */
+#endif /* __s390x__ */
 	return pte;
 }
 
 #define __swp_type(entry)	(((entry).val >> 1) & 0x3f)
-#define __swp_offset(entry)	(((entry).val >> 12) & 0x7FFFF )
+#define __swp_offset(entry)	((entry).val >> 12)
 #define __swp_entry(type,offset) ((swp_entry_t) { pte_val(mk_swap_pte((type),(offset))) })
 
 #define __pte_to_swp_entry(pte)	((swp_entry_t) { pte_val(pte) })
@@ -509,6 +716,19 @@
 
 typedef pte_t *pte_addr_t;
 
+#ifndef __s390x__
+# define PTE_FILE_MAX_BITS	26
+#else /* __s390x__ */
+# define PTE_FILE_MAX_BITS	59
+#endif /* __s390x__ */
+
+#define pte_to_pgoff(__pte) \
+	((((__pte).pte >> 12) << 7) + (((__pte).pte >> 1) & 0x7f))
+
+#define pgoff_to_pte(__off) \
+	((pte_t) { ((((__off) & 0x7f) << 1) + (((__off) >> 7) << 12)) \
+		   | _PAGE_INVALID_FILE })
+
 #endif /* !__ASSEMBLY__ */
 
 #define kern_addr_valid(addr)   (1)
@@ -517,6 +737,10 @@
  * No page table caches to initialise
  */
 #define pgtable_cache_init()	do { } while (0)
+
+#ifdef __s390x__
+# define HAVE_ARCH_UNMAPPED_AREA
+#endif /* __s390x__ */
 
 #endif /* _S390_PAGE_H */
 
diff -Nru a/include/asm-s390/posix_types.h b/include/asm-s390/posix_types.h
--- a/include/asm-s390/posix_types.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-s390/posix_types.h	Sat Apr 19 19:51:27 2003
@@ -15,34 +15,58 @@
  * assume GCC is being used.
  */
 
-typedef unsigned short  __kernel_dev_t;
-typedef unsigned long   __kernel_ino_t;
-typedef unsigned short  __kernel_mode_t;
-typedef unsigned short  __kernel_nlink_t;
 typedef long            __kernel_off_t;
 typedef int             __kernel_pid_t;
-typedef unsigned short  __kernel_ipc_pid_t;
-typedef unsigned short  __kernel_uid_t;
-typedef unsigned short  __kernel_gid_t;
 typedef unsigned long   __kernel_size_t;
-typedef int             __kernel_ssize_t;
-typedef int             __kernel_ptrdiff_t;
 typedef long            __kernel_time_t;
 typedef long            __kernel_suseconds_t;
 typedef long            __kernel_clock_t;
+typedef int		__kernel_timer_t;
+typedef int		__kernel_clockid_t;
 typedef int             __kernel_daddr_t;
 typedef char *          __kernel_caddr_t;
 typedef unsigned short	__kernel_uid16_t;
 typedef unsigned short	__kernel_gid16_t;
+
+#ifdef __GNUC__
+typedef long long       __kernel_loff_t;
+#endif
+
+#ifndef __s390x__
+
+typedef unsigned short  __kernel_dev_t;
+typedef unsigned long   __kernel_ino_t;
+typedef unsigned short  __kernel_mode_t;
+typedef unsigned short  __kernel_nlink_t;
+typedef unsigned short  __kernel_ipc_pid_t;
+typedef unsigned short  __kernel_uid_t;
+typedef unsigned short  __kernel_gid_t;
+typedef int             __kernel_ssize_t;
+typedef int             __kernel_ptrdiff_t;
 typedef unsigned int	__kernel_uid32_t;
 typedef unsigned int	__kernel_gid32_t;
-
 typedef unsigned short	__kernel_old_uid_t;
 typedef unsigned short	__kernel_old_gid_t;
+typedef unsigned short	__kernel_old_dev_t;
 
-#ifdef __GNUC__
-typedef long long       __kernel_loff_t;
-#endif
+#else /* __s390x__ */
+
+typedef unsigned int    __kernel_dev_t;
+typedef unsigned int    __kernel_ino_t;
+typedef unsigned int    __kernel_mode_t;
+typedef unsigned int    __kernel_nlink_t;
+typedef int             __kernel_ipc_pid_t;
+typedef unsigned int    __kernel_uid_t;
+typedef unsigned int    __kernel_gid_t;
+typedef long            __kernel_ssize_t;
+typedef long            __kernel_ptrdiff_t;
+typedef unsigned long   __kernel_sigset_t;      /* at least 32 bits */
+typedef __kernel_uid_t __kernel_old_uid_t;
+typedef __kernel_gid_t __kernel_old_gid_t;
+typedef __kernel_uid_t __kernel_uid32_t;
+typedef __kernel_gid_t __kernel_gid32_t;
+
+#endif /* __s390x__ */
 
 typedef struct {
 #if defined(__KERNEL__) || defined(__USE_ALL)
diff -Nru a/include/asm-s390/processor.h b/include/asm-s390/processor.h
--- a/include/asm-s390/processor.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/processor.h	Sat Apr 19 19:51:47 2003
@@ -44,6 +44,9 @@
         __u16    cpu_nr;
         unsigned long loops_per_jiffy;
         unsigned long *pgd_quick;
+#ifdef __s390x__
+        unsigned long *pmd_quick;
+#endif /* __s390x__ */
         unsigned long *pte_quick;
         unsigned long pgtable_cache_sz;
 };
@@ -54,58 +57,90 @@
 extern struct task_struct *last_task_used_math;
 
 /*
- * User space process size: 2GB (default).
+ * User space process size: 2GB for 31 bit, 4TB for 64 bit.
  */
-#define TASK_SIZE       (0x80000000)
-/* This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define TASK_UNMAPPED_BASE      (TASK_SIZE / 2)
+#ifndef __s390x__
+
+# define TASK_SIZE		(0x80000000UL)
+# define TASK_UNMAPPED_BASE	(TASK_SIZE / 2)
+
+#else /* __s390x__ */
+
+# define TASK_SIZE		(0x20000000000UL)
+# define TASK31_SIZE		(0x80000000UL)
+# define TASK_UNMAPPED_BASE	(test_thread_flag(TIF_31BIT) ? \
+					(TASK31_SIZE / 2) : (TASK_SIZE / 2))
+
+#endif /* __s390x__ */
 
 typedef struct {
         __u32 ar4;
 } mm_segment_t;
 
-/* if you change the thread_struct structure, you must
- * update the _TSS_* defines in entry.S
+/*
+ * Thread structure
  */
-
-struct thread_struct
- {
+struct thread_struct {
 	s390_fp_regs fp_regs;
-        __u32   ar2;                   /* kernel access register 2         */
-        __u32   ar4;                   /* kernel access register 4         */
-        __u32   ksp;                   /* kernel stack pointer             */
-        __u32   user_seg;              /* HSTD                             */
-        __u32   error_code;            /* error-code of last prog-excep.   */
-        __u32   prot_addr;             /* address of protection-excep.     */
-        __u32   trap_no;
-        per_struct per_info;/* Must be aligned on an 4 byte boundary*/
+	unsigned int ar2;		/* kernel access register 2         */
+        unsigned int ar4;               /* kernel access register 4         */
+        unsigned long ksp;              /* kernel stack pointer             */
+        unsigned long user_seg;         /* HSTD                             */
+        unsigned long prot_addr;        /* address of protection-excep.     */
+        unsigned int error_code;        /* error-code of last prog-excep.   */
+        unsigned int trap_no;
+        per_struct per_info;
 	/* Used to give failing instruction back to user for ieee exceptions */
-	addr_t  ieee_instruction_pointer; 
+	unsigned long ieee_instruction_pointer; 
         /* pfault_wait is used to block the process on a pfault event */
-	addr_t  pfault_wait;
+	unsigned long pfault_wait;
 };
 
 typedef struct thread_struct thread_struct;
 
-#define INIT_THREAD {{0,{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, \
-			    {0},{0},{0},{0},{0},{0}}},            \
-                     0, 0,                                        \
-                    sizeof(init_stack) + (__u32) &init_stack,     \
-              (__pa((__u32) &swapper_pg_dir[0]) + _SEGMENT_TABLE),\
-                     0,0,0,                                       \
-                     (per_struct) {{{{0,}}},0,0,0,0,{{0,}}},      \
-                     0, 0                                         \
-}
+#ifndef __s390x__
+# define __SWAPPER_PG_DIR __pa(&swapper_pg_dir[0]) + _SEGMENT_TABLE
+#else /* __s390x__ */
+# define __SWAPPER_PG_DIR __pa(&swapper_pg_dir[0]) + _REGION_TABLE
+#endif /* __s390x__ */
+
+#define INIT_THREAD {{0,{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},	       \
+			    {0},{0},{0},{0},{0},{0}}},			       \
+		     0, 0,						       \
+		     sizeof(init_stack) + (unsigned long) &init_stack,	       \
+		     __SWAPPER_PG_DIR,					       \
+		     0,0,0,						       \
+		     (per_struct) {{{{0,}}},0,0,0,0,{{0,}}},		       \
+		     0, 0						       \
+} 
+
+/*
+ * Do necessary setup to start up a new thread.
+ */
+#ifndef __s390x__
 
-/* need to define ... */
 #define start_thread(regs, new_psw, new_stackp) do {            \
         regs->psw.mask  = PSW_USER_BITS;                        \
-        regs->psw.addr  = new_psw | PSW_ADDR_AMODE31;           \
+        regs->psw.addr  = new_psw | PSW_ADDR_AMODE;             \
         regs->gprs[15]  = new_stackp ;                          \
 } while (0)
 
+#else /* __s390x__ */
+
+#define start_thread(regs, new_psw, new_stackp) do {            \
+        regs->psw.mask  = PSW_USER_BITS;                        \
+        regs->psw.addr  = new_psw;                              \
+        regs->gprs[15]  = new_stackp;                           \
+} while (0)
+
+#define start_thread31(regs, new_psw, new_stackp) do {          \
+	regs->psw.mask  = PSW_USER32_BITS;			\
+        regs->psw.addr  = new_psw;                              \
+        regs->gprs[15]  = new_stackp;                           \
+} while (0)
+
+#endif /* __s390x__ */
+
 /* Forward declaration, a strange C thing */
 struct task_struct;
 struct mm_struct;
@@ -129,11 +164,19 @@
 
 unsigned long get_wchan(struct task_struct *p);
 #define __KSTK_PTREGS(tsk) ((struct pt_regs *) \
-        (((addr_t) tsk->thread_info + THREAD_SIZE - sizeof(struct pt_regs)) & -8L))
+        (((unsigned long) tsk->thread_info + THREAD_SIZE - sizeof(struct pt_regs)) & -8L))
 #define KSTK_EIP(tsk)	(__KSTK_PTREGS(tsk)->psw.addr)
 #define KSTK_ESP(tsk)	(__KSTK_PTREGS(tsk)->gprs[15])
 
-#define cpu_relax()	barrier()
+/*
+ * Give up the time slice of the virtual PU.
+ */
+#ifndef __s390x__
+# define cpu_relax()	asm volatile ("diag 0,0,68" : : : "memory")
+#else /* __s390x__ */
+# define cpu_relax() \
+	asm volatile ("ex 0,%0" : : "i" (__LC_DIAG44_OPCODE) : "memory")
+#endif /* __s390x__ */
 
 /*
  * Set PSW mask to specified value, while leaving the
@@ -147,13 +190,22 @@
 	psw_t psw;
 	psw.mask = mask;
 
+#ifndef __s390x__
 	asm volatile (
 		"    basr %0,0\n"
 		"0:  ahi  %0,1f-0b\n"
-		"    st   %0,4(%1)\n"
+		"    st	  %0,4(%1)\n"
 		"    lpsw 0(%1)\n"
 		"1:"
 		: "=&d" (addr) : "a" (&psw) : "memory", "cc" );
+#else /* __s390x__ */
+	asm volatile (
+		"    larl  %0,1f\n"
+		"    stg   %0,8(%1)\n"
+		"    lpswe 0(%1)\n"
+		"1:"
+		: "=&d" (addr) : "a" (&psw) : "memory", "cc" );
+#endif /* __s390x__ */
 }
  
 /*
@@ -166,6 +218,7 @@
 
 	wait_psw.mask = PSW_BASE_BITS | PSW_MASK_IO | PSW_MASK_EXT |
 		PSW_MASK_MCHECK | PSW_MASK_WAIT;
+#ifndef __s390x__
 	asm volatile (
 		"    basr %0,0\n"
 		"0:  la   %0,1f-0b(%0)\n"
@@ -174,6 +227,14 @@
 		"    lpsw 0(%1)\n"
 		"1:"
 		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
+#else /* __s390x__ */
+	asm volatile (
+		"    larl  %0,0f\n"
+		"    stg   %0,8(%1)\n"
+		"    lpswe 0(%1)\n"
+		"0:"
+		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
+#endif /* __s390x__ */
 }
 
 /*
@@ -193,7 +254,7 @@
          * Store status and then load disabled wait psw,
          * the processor is dead afterwards
          */
-
+#ifndef __s390x__
         asm volatile ("    stctl 0,0,0(%1)\n"
                       "    ni    0(%1),0xef\n" /* switch off protection */
                       "    lctl  0,0,0(%1)\n"
@@ -210,6 +271,38 @@
                       "    oi    0(%1),0x10\n" /* fake protection bit */
                       "    lpsw 0(%0)"
                       : : "a" (dw_psw), "a" (&ctl_buf) : "cc" );
+#else /* __s390x__ */
+        asm volatile ("    stctg 0,0,0(%1)\n"
+                      "    ni    4(%1),0xef\n" /* switch off protection */
+                      "    lctlg 0,0,0(%1)\n"
+                      "    lghi  1,0x1000\n"
+                      "    stpt  0x328(1)\n"      /* store timer */
+                      "    stckc 0x330(1)\n"      /* store clock comparator */
+                      "    stpx  0x318(1)\n"      /* store prefix register */
+                      "    stam  0,15,0x340(1)\n" /* store access registers */
+                      "    stfpc 0x31c(1)\n"      /* store fpu control */
+                      "    std   0,0x200(1)\n"    /* store f0 */
+                      "    std   1,0x208(1)\n"    /* store f1 */
+                      "    std   2,0x210(1)\n"    /* store f2 */
+                      "    std   3,0x218(1)\n"    /* store f3 */
+                      "    std   4,0x220(1)\n"    /* store f4 */
+                      "    std   5,0x228(1)\n"    /* store f5 */
+                      "    std   6,0x230(1)\n"    /* store f6 */
+                      "    std   7,0x238(1)\n"    /* store f7 */
+                      "    std   8,0x240(1)\n"    /* store f8 */
+                      "    std   9,0x248(1)\n"    /* store f9 */
+                      "    std   10,0x250(1)\n"   /* store f10 */
+                      "    std   11,0x258(1)\n"   /* store f11 */
+                      "    std   12,0x260(1)\n"   /* store f12 */
+                      "    std   13,0x268(1)\n"   /* store f13 */
+                      "    std   14,0x270(1)\n"   /* store f14 */
+                      "    std   15,0x278(1)\n"   /* store f15 */
+                      "    stmg  0,15,0x280(1)\n" /* store general registers */
+                      "    stctg 0,15,0x380(1)\n" /* store control registers */
+                      "    oi    0x384(1),0x10\n" /* fake protection bit */
+                      "    lpswe 0(%0)"
+                      : : "a" (dw_psw), "a" (&ctl_buf) : "cc", "0", "1");
+#endif /* __s390x__ */
 }
 
 #endif
diff -Nru a/include/asm-s390/ptrace.h b/include/asm-s390/ptrace.h
--- a/include/asm-s390/ptrace.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-s390/ptrace.h	Sat Apr 19 19:51:49 2003
@@ -13,6 +13,8 @@
  * Offsets in the user_regs_struct. They are used for the ptrace
  * system call and in entry.S
  */
+#ifndef __s390x__
+
 #define PT_PSWMASK  0x00
 #define PT_PSWADDR  0x04
 #define PT_GPR0     0x08
@@ -92,18 +94,89 @@
 #define PT_LASTOFF  PT_IEEE_IP
 #define PT_ENDREGS  0x140-1
 
+#define GPR_SIZE	4
+#define CR_SIZE		4
+
+#define STACK_FRAME_OVERHEAD	96	/* size of minimum stack frame */
+
+#else /* __s390x__ */
+
+#define PT_PSWMASK  0x00
+#define PT_PSWADDR  0x08
+#define PT_GPR0     0x10
+#define PT_GPR1     0x18
+#define PT_GPR2     0x20
+#define PT_GPR3     0x28
+#define PT_GPR4     0x30
+#define PT_GPR5     0x38
+#define PT_GPR6     0x40
+#define PT_GPR7     0x48
+#define PT_GPR8     0x50
+#define PT_GPR9     0x58
+#define PT_GPR10    0x60
+#define PT_GPR11    0x68
+#define PT_GPR12    0x70
+#define PT_GPR13    0x78
+#define PT_GPR14    0x80
+#define PT_GPR15    0x88
+#define PT_ACR0     0x90
+#define PT_ACR1     0x94
+#define PT_ACR2     0x98
+#define PT_ACR3     0x9C
+#define PT_ACR4	    0xA0
+#define PT_ACR5	    0xA4
+#define PT_ACR6	    0xA8
+#define PT_ACR7	    0xAC
+#define PT_ACR8	    0xB0
+#define PT_ACR9	    0xB4
+#define PT_ACR10    0xB8
+#define PT_ACR11    0xBC
+#define PT_ACR12    0xC0
+#define PT_ACR13    0xC4
+#define PT_ACR14    0xC8
+#define PT_ACR15    0xCC
+#define PT_ORIGGPR2 0xD0
+#define PT_FPC	    0xD8
+#define PT_FPR0     0xE0
+#define PT_FPR1     0xE8
+#define PT_FPR2     0xF0
+#define PT_FPR3     0xF8
+#define PT_FPR4     0x100
+#define PT_FPR5     0x108
+#define PT_FPR6     0x110
+#define PT_FPR7     0x118
+#define PT_FPR8     0x120
+#define PT_FPR9     0x128
+#define PT_FPR10    0x130
+#define PT_FPR11    0x138
+#define PT_FPR12    0x140
+#define PT_FPR13    0x148
+#define PT_FPR14    0x150
+#define PT_FPR15    0x158
+#define PT_CR_9     0x160
+#define PT_CR_10    0x168
+#define PT_CR_11    0x170
+#define PT_IEEE_IP  0x1A8
+#define PT_LASTOFF  PT_IEEE_IP
+#define PT_ENDREGS  0x1B0-1
+
+#define GPR_SIZE	8
+#define CR_SIZE		8
+
+#define STACK_FRAME_OVERHEAD    160      /* size of minimum stack frame */
+
+#endif /* __s390x__ */
+
 #define NUM_GPRS	16
 #define NUM_FPRS	16
 #define NUM_CRS		16
 #define NUM_ACRS	16
-#define GPR_SIZE	4
+
 #define FPR_SIZE	8
 #define FPC_SIZE	4
 #define FPC_PAD_SIZE	4 /* gcc insists on aligning the fpregs */
-#define CR_SIZE		4
 #define ACR_SIZE	4
 
-#define STACK_FRAME_OVERHEAD	96	/* size of minimum stack frame */
 
 #define PTRACE_OLDSETOPTIONS         21
 
@@ -113,13 +186,39 @@
 #include <linux/types.h>
 #include <asm/setup.h>
 
+typedef union
+{
+	float   f;
+	double  d;
+        __u64   ui;
+	struct
+	{
+		__u32 hi;
+		__u32 lo;
+	} fp;
+} freg_t;
+
+typedef struct
+{
+	__u32   fpc;
+	freg_t  fprs[NUM_FPRS];              
+} s390_fp_regs;
+
+#define FPC_EXCEPTION_MASK      0xF8000000
+#define FPC_FLAGS_MASK          0x00F80000
+#define FPC_DXC_MASK            0x0000FF00
+#define FPC_RM_MASK             0x00000003
+#define FPC_VALID_MASK          0xF8F8FF03
+
 /* this typedef defines how a Program Status Word looks like */
 typedef struct 
 {
-        __u32   mask;
-        __u32   addr;
+        unsigned long mask;
+        unsigned long addr;
 } __attribute__ ((aligned(8))) psw_t;
 
+#ifndef __s390x__
+
 #define PSW_MASK_PER		0x40000000UL
 #define PSW_MASK_DAT		0x04000000UL
 #define PSW_MASK_IO		0x02000000UL
@@ -132,7 +231,7 @@
 #define PSW_MASK_CC		0x00003000UL
 #define PSW_MASK_PM		0x00000F00UL
 
-#define PSW_ADDR_AMODE31	0x80000000UL
+#define PSW_ADDR_AMODE		0x80000000UL
 #define PSW_ADDR_INSN		0x7FFFFFFFUL
 
 #define PSW_BASE_BITS		0x00080000UL
@@ -142,34 +241,41 @@
 #define PSW_ASC_SECONDARY	0x00008000UL
 #define PSW_ASC_HOME		0x0000C000UL
 
-#define PSW_KERNEL_BITS	(PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY)
-#define PSW_USER_BITS	(PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \
+#else /* __s390x__ */
+
+#define PSW_MASK_PER		0x4000000000000000UL
+#define PSW_MASK_DAT		0x0400000000000000UL
+#define PSW_MASK_IO		0x0200000000000000UL
+#define PSW_MASK_EXT		0x0100000000000000UL
+#define PSW_MASK_KEY		0x00F0000000000000UL
+#define PSW_MASK_MCHECK		0x0004000000000000UL
+#define PSW_MASK_WAIT		0x0002000000000000UL
+#define PSW_MASK_PSTATE		0x0001000000000000UL
+#define PSW_MASK_ASC		0x0000C00000000000UL
+#define PSW_MASK_CC		0x0000300000000000UL
+#define PSW_MASK_PM		0x00000F0000000000UL
+
+#define PSW_ADDR_AMODE		0x0000000000000000UL
+#define PSW_ADDR_INSN		0xFFFFFFFFFFFFFFFFUL
+
+#define PSW_BASE_BITS		0x0000000180000000UL
+#define PSW_BASE32_BITS		0x0000000080000000UL
+
+#define PSW_ASC_PRIMARY		0x0000000000000000UL
+#define PSW_ASC_ACCREG		0x0000400000000000UL
+#define PSW_ASC_SECONDARY	0x0000800000000000UL
+#define PSW_ASC_HOME		0x0000C00000000000UL
+
+#define PSW_USER32_BITS (PSW_BASE32_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \
 			 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \
 			 PSW_MASK_PSTATE)
 
-typedef union
-{
-	float   f;
-	double  d;
-        __u64   ui;
-	struct
-	{
-		__u32 hi;
-		__u32 lo;
-	} fp;
-} freg_t;
+#endif /* __s390x__ */
 
-typedef struct
-{
-	__u32   fpc;
-	freg_t  fprs[NUM_FPRS];              
-} s390_fp_regs;
-
-#define FPC_EXCEPTION_MASK      0xF8000000
-#define FPC_FLAGS_MASK          0x00F80000
-#define FPC_DXC_MASK            0x0000FF00
-#define FPC_RM_MASK             0x00000003
-#define FPC_VALID_MASK          0xF8F8FF03
+#define PSW_KERNEL_BITS	(PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY)
+#define PSW_USER_BITS	(PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \
+			 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \
+			 PSW_MASK_PSTATE)
 
 /*
  * The first entries in pt_regs and user_regs_struct
@@ -180,9 +286,9 @@
 typedef struct
 {
 	psw_t psw;
-	__u32 gprs[NUM_GPRS];
-	__u32 acrs[NUM_ACRS];
-	__u32 orig_gpr2;
+	unsigned long gprs[NUM_GPRS];
+	unsigned int  acrs[NUM_ACRS];
+	unsigned long orig_gpr2;
 } s390_regs;
 
 /*
@@ -192,24 +298,27 @@
 struct pt_regs 
 {
 	psw_t psw;
-	__u32 gprs[NUM_GPRS];
-	__u32 acrs[NUM_ACRS];
-	__u32 orig_gpr2;
-	__u32 trap;
-};
+	unsigned long gprs[NUM_GPRS];
+	unsigned int  acrs[NUM_ACRS];
+	unsigned long orig_gpr2;
+	unsigned int  trap;
+} __attribute__ ((packed));
 
 /*
  * Now for the program event recording (trace) definitions.
  */
 typedef struct
 {
-	__u32 cr[3];
+	unsigned long cr[3];
 } per_cr_words;
 
-#define PER_EM_MASK 0xE8000000
+#define PER_EM_MASK 0xE8000000UL
 
 typedef	struct
 {
+#ifdef __s390x__
+	unsigned                       : 32;
+#endif /* __s390x__ */
 	unsigned em_branching          : 1;
 	unsigned em_instruction_fetch  : 1;
 	/*
@@ -224,33 +333,34 @@
 	unsigned                       : 1;
 	unsigned storage_alt_space_ctl : 1;
 	unsigned                       : 21;
-	addr_t   starting_addr;
-	addr_t   ending_addr;
+	unsigned long starting_addr;
+	unsigned long ending_addr;
 } per_cr_bits;
 
 typedef struct
 {
-	__u16          perc_atmid;          /* 0x096 */
-	__u32          address;             /* 0x098 */
-	__u8           access_id;           /* 0x0a1 */
+	unsigned short perc_atmid;
+	unsigned long address;
+	unsigned char access_id;
 } per_lowcore_words;
 
 typedef struct
 {
-	unsigned perc_branching          : 1; /* 0x096 */
+	unsigned perc_branching          : 1;
 	unsigned perc_instruction_fetch  : 1;
 	unsigned perc_storage_alteration : 1;
 	unsigned perc_gpr_alt_unused     : 1;
 	unsigned perc_store_real_address : 1;
-	unsigned                         : 4;
+	unsigned                         : 3;
+	unsigned atmid_psw_bit_31        : 1;
 	unsigned atmid_validity_bit      : 1;
 	unsigned atmid_psw_bit_32        : 1;
 	unsigned atmid_psw_bit_5         : 1;
 	unsigned atmid_psw_bit_16        : 1;
 	unsigned atmid_psw_bit_17        : 1;
 	unsigned si                      : 2;
-	addr_t   address;                     /* 0x098 */
-	unsigned                         : 4; /* 0x0a1 */
+	unsigned long address;
+	unsigned                         : 4;
 	unsigned access_id               : 4;
 } per_lowcore_bits;
 
@@ -272,8 +382,8 @@
 	 * These addresses are copied into cr10 & cr11 if single
 	 * stepping is switched off
 	 */
-	__u32     starting_addr;
-	__u32     ending_addr;
+	unsigned long starting_addr;
+	unsigned long ending_addr;
 	union {
 		per_lowcore_words words;
 		per_lowcore_bits  bits;
@@ -282,9 +392,9 @@
 
 typedef struct
 {
-	__u32  len;
-	addr_t kernel_addr;
-	addr_t process_addr;
+	unsigned int  len;
+	unsigned long kernel_addr;
+	unsigned long process_addr;
 } ptrace_area;
 
 /*
@@ -313,9 +423,9 @@
 
 typedef struct
 {
-	addr_t           lowaddr;
-	addr_t           hiaddr;
-	ptprot_flags     prot;
+	unsigned long lowaddr;
+	unsigned long hiaddr;
+	ptprot_flags prot;
 } ptprot_area;                     
 
 /* Sequence of bytes for breakpoint illegal instruction.  */
@@ -331,9 +441,9 @@
 struct user_regs_struct
 {
 	psw_t psw;
-	__u32 gprs[NUM_GPRS];
-	__u32 acrs[NUM_ACRS];
-	__u32 orig_gpr2;
+	unsigned long gprs[NUM_GPRS];
+	unsigned int  acrs[NUM_ACRS];
+	unsigned long orig_gpr2;
 	s390_fp_regs fp_regs;
 	/*
 	 * These per registers are in here so that gdb can modify them
@@ -341,13 +451,13 @@
 	 * watchpoints. This is the way intel does it.
 	 */
 	per_struct per_info;
-	addr_t  ieee_instruction_pointer; 
+	unsigned long ieee_instruction_pointer; 
 	/* Used to give failing instruction back to user for ieee exceptions */
 };
 
 #ifdef __KERNEL__
 #define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
-#define instruction_pointer(regs) ((regs)->psw.addr & PSW_MASK_INSN)
+#define instruction_pointer(regs) ((regs)->psw.addr & PSW_ADDR_INSN)
 extern void show_regs(struct pt_regs * regs);
 #endif
 
diff -Nru a/include/asm-s390/qdio.h b/include/asm-s390/qdio.h
--- a/include/asm-s390/qdio.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-s390/qdio.h	Sat Apr 19 19:51:28 2003
@@ -20,9 +20,9 @@
 
 #define QDIO_NAME "qdio "
 
-#ifndef CONFIG_ARCH_S390X
+#ifndef __s390x__
 #define QDIO_32_BIT
-#endif /* CONFIG_ARCH_S390X */
+#endif /* __s390x__ */
 
 /**** CONSTANTS, that are relied on without using these symbols *****/
 #define QDIO_MAX_QUEUES_PER_IRQ 32 /* used in width of unsigned int */
diff -Nru a/include/asm-s390/rwsem.h b/include/asm-s390/rwsem.h
--- a/include/asm-s390/rwsem.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/rwsem.h	Sat Apr 19 19:51:47 2003
@@ -63,10 +63,17 @@
 	struct list_head	wait_list;
 };
 
+#ifndef __s390x__
 #define RWSEM_UNLOCKED_VALUE	0x00000000
 #define RWSEM_ACTIVE_BIAS	0x00000001
 #define RWSEM_ACTIVE_MASK	0x0000ffff
 #define RWSEM_WAITING_BIAS	(-0x00010000)
+#else /* __s390x__ */
+#define RWSEM_UNLOCKED_VALUE	0x0000000000000000L
+#define RWSEM_ACTIVE_BIAS	0x0000000000000001L
+#define RWSEM_ACTIVE_MASK	0x00000000ffffffffL
+#define RWSEM_WAITING_BIAS	(-0x0000000100000000L)
+#endif /* __s390x__ */
 #define RWSEM_ACTIVE_READ_BIAS	RWSEM_ACTIVE_BIAS
 #define RWSEM_ACTIVE_WRITE_BIAS	(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
 
@@ -94,11 +101,19 @@
 	signed long old, new;
 
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: lr   %1,%0\n"
 		"   ahi  %1,%3\n"
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: lgr  %1,%0\n"
+		"   aghi %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
 		: "cc", "memory" );
@@ -114,6 +129,7 @@
 	signed long old, new;
 
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: ltr  %1,%0\n"
 		"   jm   1f\n"
@@ -121,6 +137,15 @@
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b\n"
 		"1:"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: ltgr %1,%0\n"
+		"   jm   1f\n"
+		"   aghi %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b\n"
+		"1:"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
 		: "cc", "memory" );
@@ -136,11 +161,19 @@
 
 	tmp = RWSEM_ACTIVE_WRITE_BIAS;
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: lr   %1,%0\n"
 		"   a    %1,%3\n"
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: lgr  %1,%0\n"
+		"   ag   %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "m" (tmp)
 		: "cc", "memory" );
@@ -156,11 +189,19 @@
 	signed long old;
 
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%1)\n"
 		"0: ltr  %0,%0\n"
 		"   jnz  1f\n"
 		"   cs   %0,%2,0(%1)\n"
 		"   jl   0b\n"
+#else /* __s390x__ */
+		"   lg   %0,0(%1)\n"
+		"0: ltgr %0,%0\n"
+		"   jnz  1f\n"
+		"   csg  %0,%2,0(%1)\n"
+		"   jl   0b\n"
+#endif /* __s390x__ */
 		"1:"
                 : "=&d" (old)
 		: "a" (&sem->count), "d" (RWSEM_ACTIVE_WRITE_BIAS)
@@ -176,11 +217,19 @@
 	signed long old, new;
 
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: lr   %1,%0\n"
 		"   ahi  %1,%3\n"
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: lgr  %1,%0\n"
+		"   aghi %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "i" (-RWSEM_ACTIVE_READ_BIAS)
 		: "cc", "memory" );
@@ -198,11 +247,19 @@
 
 	tmp = -RWSEM_ACTIVE_WRITE_BIAS;
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: lr   %1,%0\n"
 		"   a    %1,%3\n"
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: lgr  %1,%0\n"
+		"   ag   %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "m" (tmp)
 		: "cc", "memory" );
@@ -220,11 +277,19 @@
 
 	tmp = -RWSEM_WAITING_BIAS;
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: lr   %1,%0\n"
 		"   a    %1,%3\n"
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: lgr  %1,%0\n"
+		"   ag   %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "m" (tmp)
 		: "cc", "memory" );
@@ -240,11 +305,19 @@
 	signed long old, new;
 
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: lr   %1,%0\n"
 		"   ar   %1,%3\n"
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: lgr  %1,%0\n"
+		"   agr  %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "d" (delta)
 		: "cc", "memory" );
@@ -258,11 +331,19 @@
 	signed long old, new;
 
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"   l    %0,0(%2)\n"
 		"0: lr   %1,%0\n"
 		"   ar   %1,%3\n"
 		"   cs   %0,%1,0(%2)\n"
 		"   jl   0b"
+#else /* __s390x__ */
+		"   lg   %0,0(%2)\n"
+		"0: lgr  %1,%0\n"
+		"   agr  %1,%3\n"
+		"   csg  %0,%1,0(%2)\n"
+		"   jl   0b"
+#endif /* __s390x__ */
                 : "=&d" (old), "=&d" (new)
 		: "a" (&sem->count), "d" (delta)
 		: "cc", "memory" );
diff -Nru a/include/asm-s390/sembuf.h b/include/asm-s390/sembuf.h
--- a/include/asm-s390/sembuf.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-s390/sembuf.h	Sat Apr 19 19:51:48 2003
@@ -7,16 +7,20 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
+ * - 64-bit time_t to solve y2038 problem (for !__s390x__)
  * - 2 miscellaneous 32-bit values
  */
 
 struct semid64_ds {
 	struct ipc64_perm sem_perm;		/* permissions .. see ipc.h */
 	__kernel_time_t	sem_otime;		/* last semop time */
+#ifndef __s390x__
 	unsigned long	__unused1;
+#endif /* ! __s390x__ */
 	__kernel_time_t	sem_ctime;		/* last change time */
+#ifndef __s390x__
 	unsigned long	__unused2;
+#endif /* ! __s390x__ */
 	unsigned long	sem_nsems;		/* no. of semaphores in array */
 	unsigned long	__unused3;
 	unsigned long	__unused4;
diff -Nru a/include/asm-s390/setup.h b/include/asm-s390/setup.h
--- a/include/asm-s390/setup.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-s390/setup.h	Sat Apr 19 19:51:50 2003
@@ -15,9 +15,15 @@
 
 #ifndef __ASSEMBLY__
 
+#ifndef __s390x__
 #define IPL_DEVICE        (*(unsigned long *)  (0x10404))
 #define INITRD_START      (*(unsigned long *)  (0x1040C))
 #define INITRD_SIZE       (*(unsigned long *)  (0x10414))
+#else /* __s390x__ */
+#define IPL_DEVICE        (*(unsigned long *)  (0x10400))
+#define INITRD_START      (*(unsigned long *)  (0x10408))
+#define INITRD_SIZE       (*(unsigned long *)  (0x10410))
+#endif /* __s390x__ */
 #define COMMAND_LINE      ((char *)            (0x10480))
 
 /*
@@ -26,10 +32,18 @@
 extern unsigned long machine_flags;
 
 #define MACHINE_IS_VM		(machine_flags & 1)
-#define MACHINE_HAS_IEEE	(machine_flags & 2)
 #define MACHINE_IS_P390		(machine_flags & 4)
-#define MACHINE_HAS_CSP		(machine_flags & 8)
 #define MACHINE_HAS_MVPG	(machine_flags & 16)
+#define MACHINE_HAS_DIAG44	(machine_flags & 32)
+
+#ifndef __s390x__
+#define MACHINE_HAS_IEEE	(machine_flags & 2)
+#define MACHINE_HAS_CSP		(machine_flags & 8)
+#else /* __s390x__ */
+#define MACHINE_HAS_IEEE	(1)
+#define MACHINE_HAS_CSP		(1)
+#endif /* __s390x__ */
+
 
 #define MACHINE_HAS_SCLP	(!MACHINE_IS_P390)
 
@@ -50,9 +64,15 @@
 
 #else 
 
+#ifndef __s390x__
 #define IPL_DEVICE        0x10404
 #define INITRD_START      0x1040C
 #define INITRD_SIZE       0x10414
+#else /* __s390x__ */
+#define IPL_DEVICE        0x10400
+#define INITRD_START      0x10408
+#define INITRD_SIZE       0x10410
+#endif /* __s390x__ */
 #define COMMAND_LINE      0x10480
 
 #endif
diff -Nru a/include/asm-s390/shmbuf.h b/include/asm-s390/shmbuf.h
--- a/include/asm-s390/shmbuf.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/shmbuf.h	Sat Apr 19 19:51:51 2003
@@ -7,7 +7,7 @@
  * between kernel and user space.
  *
  * Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
+ * - 64-bit time_t to solve y2038 problem (for !__s390x__)
  * - 2 miscellaneous 32-bit values
  */
 
@@ -15,11 +15,17 @@
 	struct ipc64_perm	shm_perm;	/* operation perms */
 	size_t			shm_segsz;	/* size of segment (bytes) */
 	__kernel_time_t		shm_atime;	/* last attach time */
+#ifndef __s390x__
 	unsigned long		__unused1;
+#endif /* ! __s390x__ */
 	__kernel_time_t		shm_dtime;	/* last detach time */
+#ifndef __s390x__
 	unsigned long		__unused2;
+#endif /* ! __s390x__ */
 	__kernel_time_t		shm_ctime;	/* last change time */
+#ifndef __s390x__
 	unsigned long		__unused3;
+#endif /* ! __s390x__ */
 	__kernel_pid_t		shm_cpid;	/* pid of creator */
 	__kernel_pid_t		shm_lpid;	/* pid of last operator */
 	unsigned long		shm_nattch;	/* no. of current attaches */
diff -Nru a/include/asm-s390/sigcontext.h b/include/asm-s390/sigcontext.h
--- a/include/asm-s390/sigcontext.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-s390/sigcontext.h	Sat Apr 19 19:51:49 2003
@@ -12,13 +12,24 @@
 #define __NUM_FPRS 16
 #define __NUM_ACRS 16
 
-/*
-  Has to be at least _NSIG_WORDS from asm/signal.h
- */
-#define _SIGCONTEXT_NSIG      64
-#define _SIGCONTEXT_NSIG_BPW  32
+#ifndef __s390x__
+
+/* Has to be at least _NSIG_WORDS from asm/signal.h */
+#define _SIGCONTEXT_NSIG	64
+#define _SIGCONTEXT_NSIG_BPW	32
 /* Size of stack frame allocated when calling signal handler. */
 #define __SIGNAL_FRAMESIZE	96
+
+#else /* __s390x__ */
+
+/* Has to be at least _NSIG_WORDS from asm/signal.h */
+#define _SIGCONTEXT_NSIG	64
+#define _SIGCONTEXT_NSIG_BPW	64 
+/* Size of stack frame allocated when calling signal handler. */
+#define __SIGNAL_FRAMESIZE	160
+
+#endif /* __s390x__ */
+
 #define _SIGCONTEXT_NSIG_WORDS	(_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
 #define _SIGMASK_COPY_SIZE	(sizeof(unsigned long)*_SIGCONTEXT_NSIG_WORDS)
 
diff -Nru a/include/asm-s390/signal.h b/include/asm-s390/signal.h
--- a/include/asm-s390/signal.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-s390/signal.h	Sat Apr 19 19:51:49 2003
@@ -10,6 +10,7 @@
 #define _ASMS390_SIGNAL_H
 
 #include <linux/types.h>
+#include <linux/time.h>
 
 /* Avoid too many header ordering problems.  */
 struct siginfo;
@@ -170,9 +171,15 @@
           __sighandler_t _sa_handler;
           void (*_sa_sigaction)(int, struct siginfo *, void *);
         } _u;
+#ifndef __s390x__ /* lovely */
         sigset_t sa_mask;
         unsigned long sa_flags;
         void (*sa_restorer)(void);
+#else  /* __s390x__ */
+        unsigned long sa_flags;
+        void (*sa_restorer)(void);
+	sigset_t sa_mask;
+#endif /* __s390x__ */
 };
 
 #define sa_handler      _u._sa_handler
diff -Nru a/include/asm-s390/sigp.h b/include/asm-s390/sigp.h
--- a/include/asm-s390/sigp.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/sigp.h	Sat Apr 19 19:51:47 2003
@@ -72,10 +72,17 @@
 	sigp_ccode ccode;
 
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"    sr     1,1\n"        /* parameter=0 in gpr 1 */
 		"    sigp   1,%1,0(%2)\n"
 		"    ipm    %0\n"
 		"    srl    %0,28\n"
+#else /* __s390x__ */
+		"    sgr    1,1\n"        /* parameter=0 in gpr 1 */
+		"    sigp   1,%1,0(%2)\n"
+		"    ipm    %0\n"
+		"    srl    %0,28"
+#endif /* __s390x__ */
 		: "=d" (ccode)
 		: "d" (__cpu_logical_map[cpu_addr]), "a" (order_code)
 		: "cc" , "memory", "1" );
@@ -86,15 +93,23 @@
  * Signal processor with parameter
  */
 extern __inline__ sigp_ccode
-signal_processor_p(__u32 parameter,__u16 cpu_addr,sigp_order_code order_code)
+signal_processor_p(unsigned long parameter,__u16 cpu_addr,
+		   sigp_order_code order_code)
 {
 	sigp_ccode ccode;
 	
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"    lr     1,%1\n"       /* parameter in gpr 1 */
 		"    sigp   1,%2,0(%3)\n"
 		"    ipm    %0\n"
 		"    srl    %0,28\n"
+#else /* __s390x__ */
+		"    lgr    1,%1\n"       /* parameter in gpr 1 */
+		"    sigp   1,%2,0(%3)\n"
+		"    ipm    %0\n"
+		"    srl    %0,28\n"
+#endif /* __s390x__ */
 		: "=d" (ccode)
 		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
                   "a" (order_code)
@@ -106,18 +121,27 @@
  * Signal processor with parameter and return status
  */
 extern __inline__ sigp_ccode
-signal_processor_ps(__u32 *statusptr, __u32 parameter,
+signal_processor_ps(__u32 *statusptr, unsigned long parameter,
 		    __u16 cpu_addr, sigp_order_code order_code)
 {
 	sigp_ccode ccode;
 	
 	__asm__ __volatile__(
+#ifndef __s390x__
 		"    sr     2,2\n"        /* clear status so it doesn't contain rubbish if not saved. */
 		"    lr     3,%2\n"       /* parameter in gpr 3 */
 		"    sigp   2,%3,0(%4)\n"
 		"    st     2,%1\n"
 		"    ipm    %0\n"
 		"    srl    %0,28\n"
+#else /* __s390x__ */
+		"    sgr    2,2\n"        /* clear status so it doesn't contain rubbish if not saved. */
+		"    lgr    3,%2\n"       /* parameter in gpr 3 */
+		"    sigp   2,%3,0(%4)\n"
+		"    stg    2,%1\n"
+		"    ipm    %0\n"
+		"    srl    %0,28\n"
+#endif /* __s390x__ */
 		: "=d" (ccode), "=m" (*statusptr)
 		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
                   "a" (order_code)
diff -Nru a/include/asm-s390/smp.h b/include/asm-s390/smp.h
--- a/include/asm-s390/smp.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/smp.h	Sat Apr 19 19:51:47 2003
@@ -52,7 +52,11 @@
 
 extern inline unsigned int num_online_cpus(void)
 {
+#ifndef __s390x__
 	return hweight32(cpu_online_map);
+#else /* __s390x__ */
+	return hweight64(cpu_online_map);
+#endif /* __s390x__ */
 }
 
 extern inline int any_online_cpu(unsigned int mask)
diff -Nru a/include/asm-s390/spinlock.h b/include/asm-s390/spinlock.h
--- a/include/asm-s390/spinlock.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/spinlock.h	Sat Apr 19 19:51:51 2003
@@ -11,6 +11,22 @@
 #ifndef __ASM_SPINLOCK_H
 #define __ASM_SPINLOCK_H
 
+#ifdef __s390x__
+/*
+ * Grmph, take care of %&#! user space programs that include
+ * asm/spinlock.h. The diagnose is only available in kernel
+ * context.
+ */
+#ifdef __KERNEL__
+#include <asm/lowcore.h>
+#define __DIAG44_INSN "ex"
+#define __DIAG44_OPERAND __LC_DIAG44_OPCODE
+#else
+#define __DIAG44_INSN "#"
+#define __DIAG44_OPERAND 0
+#endif
+#endif /* __s390x__ */
+
 /*
  * Simple spin lock operations.  There are two variants, one clears IRQ's
  * on the local processor, one does not.
@@ -19,8 +35,13 @@
  */
 
 typedef struct {
+#ifndef __s390x__
 	volatile unsigned long lock;
 } spinlock_t;
+#else /* __s390x__ */
+	volatile unsigned int lock;
+} __attribute__ ((aligned (4))) spinlock_t;
+#endif /* __s390x__ */
 
 #define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
 #define spin_lock_init(lp) do { (lp)->lock = 0; } while(0)
@@ -29,6 +50,7 @@
 
 extern inline void _raw_spin_lock(spinlock_t *lp)
 {
+#ifndef __s390x__
 	unsigned int reg1, reg2;
         __asm__ __volatile("    bras  %0,1f\n"
                            "0:  diag  0,0,68\n"
@@ -37,11 +59,26 @@
                            "    jl    0b\n"
                            : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock)
 			   : "a" (&lp->lock) : "cc" );
+#else /* __s390x__ */
+	unsigned long reg1, reg2;
+        __asm__ __volatile("    bras  %1,1f\n"
+                           "0:  " __DIAG44_INSN " 0,%4\n"
+                           "1:  slr   %0,%0\n"
+                           "    cs    %0,%1,0(%3)\n"
+                           "    jl    0b\n"
+                           : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock)
+                           : "a" (&lp->lock), "i" (__DIAG44_OPERAND)
+			   : "cc" );
+#endif /* __s390x__ */
 }
 
 extern inline int _raw_spin_trylock(spinlock_t *lp)
 {
+#ifndef __s390x__
 	unsigned long result, reg;
+#else /* __s390x__ */
+	unsigned int result, reg;
+#endif /* __s390x__ */
 	__asm__ __volatile("    slr   %0,%0\n"
 			   "    basr  %1,0\n"
 			   "0:  cs    %0,%1,0(%3)"
@@ -52,9 +89,11 @@
 
 extern inline void _raw_spin_unlock(spinlock_t *lp)
 {
-	__asm__ __volatile("    xc 0(4,%1),0(%1)\n"
-                           "    bcr 15,0"
-			   : "+m" (lp->lock) : "a" (&lp->lock) : "cc" );
+	unsigned int old;
+
+	__asm__ __volatile("cs %0,%3,0(%4)"
+			   : "=d" (old), "=m" (lp->lock)
+			   : "0" (lp->lock), "d" (0), "a" (lp) : "cc" );
 }
 		
 /*
@@ -78,6 +117,7 @@
 
 #define rwlock_is_locked(x) ((x)->lock != 0)
 
+#ifndef __s390x__
 #define _raw_read_lock(rw)   \
         asm volatile("   l     2,0(%1)\n"   \
                      "   j     1f\n"     \
@@ -88,7 +128,21 @@
                      "   jl    0b"       \
                      : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
 		     : "2", "3", "cc" )
+#else /* __s390x__ */
+#define _raw_read_lock(rw)   \
+        asm volatile("   lg    2,0(%1)\n"   \
+                     "   j     1f\n"     \
+                     "0: " __DIAG44_INSN " 0,%2\n" \
+                     "1: nihh  2,0x7fff\n" /* clear high (=write) bit */ \
+                     "   la    3,1(2)\n"   /* one more reader */  \
+                     "   csg   2,3,0(%1)\n" /* try to write new value */ \
+                     "   jl    0b"       \
+                     : "+m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
+		     : "2", "3", "cc" )
+#endif /* __s390x__ */
 
+#ifndef __s390x__
 #define _raw_read_unlock(rw) \
         asm volatile("   l     2,0(%1)\n"   \
                      "   j     1f\n"     \
@@ -99,7 +153,21 @@
                      "   jl    0b"       \
                      : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
 		     : "2", "3", "cc" )
+#else /* __s390x__ */
+#define _raw_read_unlock(rw) \
+        asm volatile("   lg    2,0(%1)\n"   \
+                     "   j     1f\n"     \
+                     "0: " __DIAG44_INSN " 0,%2\n" \
+                     "1: lgr   3,2\n"    \
+                     "   bctgr 3,0\n"    /* one less reader */ \
+                     "   csg   2,3,0(%1)\n" \
+                     "   jl    0b"       \
+                     : "+m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
+		     : "2", "3", "cc" )
+#endif /* __s390x__ */
 
+#ifndef __s390x__
 #define _raw_write_lock(rw) \
         asm volatile("   lhi   3,1\n"    \
                      "   sll   3,31\n"    /* new lock value = 0x80000000 */ \
@@ -110,7 +178,20 @@
                      "   jl    0b"       \
                      : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
 		     : "2", "3", "cc" )
+#else /* __s390x__ */
+#define _raw_write_lock(rw) \
+        asm volatile("   llihh 3,0x8000\n" /* new lock value = 0x80...0 */ \
+                     "   j     1f\n"       \
+                     "0: " __DIAG44_INSN " 0,%2\n"   \
+                     "1: slgr  2,2\n"      /* old lock value must be 0 */ \
+                     "   csg   2,3,0(%1)\n" \
+                     "   jl    0b"         \
+                     : "+m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
+		     : "2", "3", "cc" )
+#endif /* __s390x__ */
 
+#ifndef __s390x__
 #define _raw_write_unlock(rw) \
         asm volatile("   slr   3,3\n"     /* new lock value = 0 */ \
                      "   j     1f\n"     \
@@ -121,15 +202,34 @@
                      "   jl    0b"       \
                      : "+m" ((rw)->lock) : "a" (&(rw)->lock) \
 		     : "2", "3", "cc" )
+#else /* __s390x__ */
+#define _raw_write_unlock(rw) \
+        asm volatile("   slgr  3,3\n"      /* new lock value = 0 */ \
+                     "   j     1f\n"       \
+                     "0: " __DIAG44_INSN " 0,%2\n"   \
+                     "1: llihh 2,0x8000\n" /* old lock value must be 0x8..0 */\
+                     "   csg   2,3,0(%1)\n"   \
+                     "   jl    0b"         \
+                     : "+m" ((rw)->lock) \
+		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
+		     : "2", "3", "cc" )
+#endif /* __s390x__ */
 
 extern inline int _raw_write_trylock(rwlock_t *rw)
 {
 	unsigned int result, reg;
 	
-	__asm__ __volatile__("   lhi  %0,1\n"
+	__asm__ __volatile__(
+#ifndef __s390x__
+			     "   lhi  %0,1\n"
 			     "   sll  %0,31\n"
 			     "   basr %1,0\n"
 			     "0: cs   %0,%1,0(%3)\n"
+#else /* __s390x__ */
+			     "   llihh %0,0x8000\n"
+			     "   basr  %1,0\n"
+			     "0: csg %0,%1,0(%3)\n"
+#endif /* __s390x__ */
 			     : "=&d" (result), "=&d" (reg), "+m" (rw->lock)
 			     : "a" (&rw->lock) : "cc" );
 	return !result;
diff -Nru a/include/asm-s390/stat.h b/include/asm-s390/stat.h
--- a/include/asm-s390/stat.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-s390/stat.h	Sat Apr 19 19:51:50 2003
@@ -9,6 +9,7 @@
 #ifndef _S390_STAT_H
 #define _S390_STAT_H
 
+#ifndef __s390x__
 struct __old_kernel_stat {
         unsigned short st_dev;
         unsigned short st_ino;
@@ -46,8 +47,6 @@
         unsigned long  __unused5;
 };
 
-#define STAT_HAVE_NSEC 1
-
 /* This matches struct stat64 in glibc2.1, hence the absolutely
  * insane amounts of padding around dev_t's.
  */
@@ -75,5 +74,32 @@
         unsigned long   st_ctime_nsec;  /* will be high 32 bits of ctime someday */
         unsigned long long	st_ino;
 };
+
+#else /* __s390x__ */
+
+struct stat {
+        unsigned long  st_dev;
+        unsigned long  st_ino;
+        unsigned long  st_nlink;
+        unsigned int   st_mode;
+        unsigned int   st_uid;
+        unsigned int   st_gid;
+        unsigned int   __pad1;
+        unsigned long  st_rdev;
+        unsigned long  st_size;
+        unsigned long  st_atime;
+	unsigned long  st_atime_nsec;
+        unsigned long  st_mtime;
+	unsigned long  st_mtime_nsec;
+        unsigned long  st_ctime;
+	unsigned long  st_ctime_nsec;
+        unsigned long  st_blksize;
+        long           st_blocks;
+        unsigned long  __unused[3];
+};
+
+#endif /* __s390x__ */
+
+#define STAT_HAVE_NSEC 1
 
 #endif
diff -Nru a/include/asm-s390/statfs.h b/include/asm-s390/statfs.h
--- a/include/asm-s390/statfs.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/statfs.h	Sat Apr 19 19:51:51 2003
@@ -18,6 +18,7 @@
 #endif
 
 struct statfs {
+#ifndef __s390x__
 	long f_type;
 	long f_bsize;
 	long f_blocks;
@@ -28,6 +29,18 @@
 	__kernel_fsid_t f_fsid;
 	long f_namelen;
 	long f_spare[6];
+#else /* __s390x__ */
+	int  f_type;
+	int  f_bsize;
+	long f_blocks;
+	long f_bfree;
+	long f_bavail;
+	long f_files;
+	long f_ffree;
+	__kernel_fsid_t f_fsid;
+	int  f_namelen;
+	int  f_spare[6];
+#endif /* __s390x__ */
 };
 
 #endif
diff -Nru a/include/asm-s390/string.h b/include/asm-s390/string.h
--- a/include/asm-s390/string.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/string.h	Sat Apr 19 19:51:51 2003
@@ -49,13 +49,24 @@
 {
     void *ptr;
 
-    __asm__ __volatile__ ("   lr    0,%2\n"
+    __asm__ __volatile__ (
+#ifndef __s390x__
+                          "   lr    0,%2\n"
                           "   lr    1,%1\n"
                           "   la    %0,0(%3,%1)\n"
                           "0: srst  %0,1\n"
                           "   jo    0b\n"
                           "   brc   13,1f\n"
                           "   slr   %0,%0\n"
+#else /* __s390x__ */
+                          "   lgr   0,%2\n"
+                          "   lgr   1,%1\n"
+                          "   la    %0,0(%3,%1)\n"
+                          "0: srst  %0,1\n"
+                          "   jo    0b\n"
+                          "   brc   13,1f\n"
+                          "   slgr  %0,%0\n"
+#endif /* __s390x__ */
                           "1:"
                           : "=&a" (ptr) : "a" (cs), "d" (c), "d" (count)
                           : "cc", "0", "1" );
@@ -66,9 +77,16 @@
 {
     char *tmp = dest;
 
-    __asm__ __volatile__ ("   sr    0,0\n"
+    __asm__ __volatile__ (
+#ifndef __s390x__
+                          "   sr    0,0\n"
                           "0: mvst  %0,%1\n"
                           "   jo    0b"
+#else /* __s390x__ */
+                          "   slgr  0,0\n"
+                          "0: mvst  %0,%1\n"
+                          "   jo    0b"
+#endif /* __s390x__ */
                           : "+&a" (dest), "+&a" (src) :
                           : "cc", "memory", "0" );
     return tmp;
@@ -78,12 +96,22 @@
 {
     size_t len;
 
-    __asm__ __volatile__ ("   sr    0,0\n"
+    __asm__ __volatile__ (
+#ifndef __s390x__
+                          "   sr    0,0\n"
                           "   lr    %0,%1\n"
                           "0: srst  0,%0\n"
                           "   jo    0b\n"
                           "   lr    %0,0\n"
                           "   sr    %0,%1"
+#else /* __s390x__ */
+                          "   slgr  0,0\n"
+                          "   lgr   %0,%1\n"
+                          "0: srst  0,%0\n"
+                          "   jo    0b\n"
+                          "   lgr   %0,0\n"
+                          "   sgr   %0,%1"
+#endif /* __s390x__ */
                           : "=&a" (len) : "a" (s) 
                           : "cc", "0" );
     return len;
@@ -93,25 +121,30 @@
 {
     char *tmp = dest;
 
-    __asm__ __volatile__ ("   sr    0,0\n"
+    __asm__ __volatile__ (
+#ifndef __s390x__
+                          "   sr    0,0\n"
                           "0: srst  0,%0\n"
                           "   jo    0b\n"
                           "   lr    %0,0\n"
                           "   sr    0,0\n"
                           "1: mvst  %0,%1\n"
                           "   jo    1b"
+#else /* __s390x__ */
+                          "   slgr  0,0\n"
+                          "0: srst  0,%0\n"
+                          "   jo    0b\n"
+                          "   lgr   %0,0\n"
+                          "   slgr  0,0\n"
+                          "1: mvst  %0,%1\n"
+                          "   jo    1b"
+#endif /* __s390x__ */
                           : "+&a" (dest), "+&a" (src) :
                           : "cc", "memory", "0" );
     return tmp;
 }
 
 extern void *alloca(size_t);
-
 #endif /* __KERNEL__ */
 
 #endif /* __S390_STRING_H_ */
-
-
-
-
-
diff -Nru a/include/asm-s390/system.h b/include/asm-s390/system.h
--- a/include/asm-s390/system.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/system.h	Sat Apr 19 19:51:51 2003
@@ -23,6 +23,15 @@
 
 extern struct task_struct *resume(void *, void *);
 
+#ifdef __s390x__
+#define __FLAG_SHIFT 56
+extern void __misaligned_u16(void);
+extern void __misaligned_u32(void);
+extern void __misaligned_u64(void);
+#else /* __s390x__ */
+#define __FLAG_SHIFT 24
+#endif /* __s390x__ */
+
 static inline void save_fp_regs(s390_fp_regs *fpregs)
 {
 	asm volatile (
@@ -82,13 +91,13 @@
 		break;							     \
 	save_fp_regs(&prev->thread.fp_regs);				     \
 	restore_fp_regs(&next->thread.fp_regs);				     \
-	resume(prev,next);						     \
+	prev = resume(prev,next);					     \
 } while (0)
 
 #define nop() __asm__ __volatile__ ("nop")
 
 #define xchg(ptr,x) \
-  ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(ptr),sizeof(*(ptr))))
+  ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(void *)(ptr),sizeof(*(ptr))))
 
 static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
 {
@@ -137,6 +146,17 @@
 			: "memory", "cc", "0" );
 		x = old;
 		break;
+#ifdef __s390x__
+	case 8:
+		asm volatile (
+			"    lg  %0,0(%2)\n"
+			"0:  csg %0,%1,0(%2)\n"
+			"    jl  0b\n"
+			: "=&d" (old) : "d" (x), "a" (ptr)
+			: "memory", "cc", "0" );
+		x = old;
+		break;
+#endif /* __s390x__ */
         }
         return x;
 }
@@ -208,6 +228,14 @@
 			: "=&d" (prev) : "0" (old), "d" (new), "a" (ptr)
 			: "memory", "cc" );
 		return prev;
+#ifdef __s390x__
+	case 8:
+		asm volatile (
+			"    csg %0,%2,0(%3)\n"
+			: "=&d" (prev) : "0" (old), "d" (new), "a" (ptr)
+			: "memory", "cc" );
+		return prev;
+#endif /* __s390x__ */
         }
         return old;
 }
@@ -241,15 +269,15 @@
 
 /* interrupt control.. */
 #define local_irq_enable() ({ \
-        __u8 __dummy; \
+        unsigned long  __dummy; \
         __asm__ __volatile__ ( \
                 "stosm 0(%1),0x03" : "=m" (__dummy) : "a" (&__dummy) ); \
         })
 
 #define local_irq_disable() ({ \
-        __u32 __flags; \
+        unsigned long __flags; \
         __asm__ __volatile__ ( \
-                "stnsm 0(%1),0xFC" : "=m" (__flags) : "a" (&__flags) ); \
+                "stnsm 0(%1),0xfc" : "=m" (__flags) : "a" (&__flags) ); \
         __flags; \
         })
 
@@ -263,9 +291,70 @@
 ({					\
 	unsigned long flags;		\
 	local_save_flags(flags);	\
-        !((flags >> 24) & 3);		\
+        !((flags >> __FLAG_SHIFT) & 3);	\
 })
 
+#ifdef __s390x__
+
+#define __load_psw(psw) \
+        __asm__ __volatile__("lpswe 0(%0)" : : "a" (&psw) : "cc" );
+
+#define __ctl_load(array, low, high) ({ \
+	__asm__ __volatile__ ( \
+		"   la    1,%0\n" \
+		"   bras  2,0f\n" \
+                "   lctlg 0,0,0(1)\n" \
+		"0: ex    %1,0(2)" \
+		: : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); \
+	})
+
+#define __ctl_store(array, low, high) ({ \
+	__asm__ __volatile__ ( \
+		"   la    1,%0\n" \
+		"   bras  2,0f\n" \
+		"   stctg 0,0,0(1)\n" \
+		"0: ex    %1,0(2)" \
+		: "=m" (array) : "a" (((low)<<4)+(high)): "1", "2" ); \
+	})
+
+#define __ctl_set_bit(cr, bit) ({ \
+        __u8 __dummy[24]; \
+        __asm__ __volatile__ ( \
+                "    la    1,%0\n"       /* align to 8 byte */ \
+                "    aghi  1,7\n" \
+                "    nill  1,0xfff8\n" \
+                "    bras  2,0f\n"       /* skip indirect insns */ \
+                "    stctg 0,0,0(1)\n" \
+                "    lctlg 0,0,0(1)\n" \
+                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
+                "    lg    0,0(1)\n" \
+                "    ogr   0,%2\n"       /* set the bit */ \
+                "    stg   0,0(1)\n" \
+                "1:  ex    %1,6(2)"      /* execute lctl */ \
+                : "=m" (__dummy) : "a" (cr*17), "a" (1L<<(bit)) \
+                : "cc", "0", "1", "2"); \
+        })
+
+#define __ctl_clear_bit(cr, bit) ({ \
+        __u8 __dummy[24]; \
+        __asm__ __volatile__ ( \
+                "    la    1,%0\n"       /* align to 8 byte */ \
+                "    aghi  1,7\n" \
+                "    nill  1,0xfff8\n" \
+                "    bras  2,0f\n"       /* skip indirect insns */ \
+                "    stctg 0,0,0(1)\n" \
+                "    lctlg 0,0,0(1)\n" \
+                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
+                "    lg    0,0(1)\n" \
+                "    ngr   0,%2\n"       /* set the bit */ \
+                "    stg   0,0(1)\n" \
+                "1:  ex    %1,6(2)"      /* execute lctl */ \
+                : "=m" (__dummy) : "a" (cr*17), "a" (~(1L<<(bit))) \
+                : "cc", "0", "1", "2"); \
+        })
+
+#else /* __s390x__ */
+
 #define __load_psw(psw) \
 	__asm__ __volatile__("lpsw 0(%0)" : : "a" (&psw) : "cc" );
 
@@ -273,7 +362,7 @@
 	__asm__ __volatile__ ( \
 		"   la    1,%0\n" \
 		"   bras  2,0f\n" \
-                "   lctl  0,0,0(1)\n" \
+                "   lctl 0,0,0(1)\n" \
 		"0: ex    %1,0(2)" \
 		: : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); \
 	})
@@ -324,6 +413,7 @@
                 : "=m" (__dummy) : "a" (cr*17), "a" (~(1<<(bit))) \
                 : "cc", "0", "1", "2"); \
         })
+#endif /* __s390x__ */
 
 /* For spinlocks etc */
 #define local_irq_save(x)	((x) = local_irq_disable())
diff -Nru a/include/asm-s390/termios.h b/include/asm-s390/termios.h
--- a/include/asm-s390/termios.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-s390/termios.h	Sat Apr 19 19:51:29 2003
@@ -12,7 +12,6 @@
 #include <asm/termbits.h>
 #include <asm/ioctls.h>
 
-
 struct winsize {
 	unsigned short ws_row;
 	unsigned short ws_col;
@@ -44,7 +43,7 @@
 #define TIOCM_RI	TIOCM_RNG
 #define TIOCM_OUT1	0x2000
 #define TIOCM_OUT2	0x4000
-#define TIOCM_LOOP      0x8000
+#define TIOCM_LOOP	0x8000
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
@@ -62,7 +61,8 @@
 #define N_PROFIBUS_FDL	10	/* Reserved for Profibus <Dave@mvhi.com> */
 #define N_IRDA		11	/* Linux IR - http://irda.sourceforge.net/ */
 #define N_SMSBLOCK	12	/* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13	/* synchronous HDLC */
+#define N_HDLC		13	/* synchronous HDLC */
+#define N_SYNC_PPP	14	/* synchronous PPP */
 #define N_HCI		15  /* Bluetooth HCI UART */
 
 #ifdef __KERNEL__
@@ -78,19 +78,18 @@
 /*
  * Translate a "termio" structure into a "termios". Ugh.
  */
+#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \
+	unsigned short __tmp; \
+	get_user(__tmp,&(termio)->x); \
+	(termios)->x = (0xffff0000 & ((termios)->x)) | __tmp; \
+}
 
 #define user_termio_to_kernel_termios(termios, termio) \
 ({ \
-        unsigned short tmp; \
-        get_user(tmp, &(termio)->c_iflag); \
-        (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
-        get_user(tmp, &(termio)->c_oflag); \
-        (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
-        get_user(tmp, &(termio)->c_cflag); \
-        (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
-        get_user(tmp, &(termio)->c_lflag); \
-        (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
-        get_user((termios)->c_line, &(termio)->c_line); \
+	SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \
+	SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \
+	SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \
+	SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \
 	copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
 })
 
diff -Nru a/include/asm-s390/thread_info.h b/include/asm-s390/thread_info.h
--- a/include/asm-s390/thread_info.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-s390/thread_info.h	Sat Apr 19 19:51:49 2003
@@ -13,6 +13,7 @@
 
 #ifndef __ASSEMBLY__
 #include <asm/processor.h>
+#include <asm/lowcore.h>
 
 /*
  * low level task data that entry.S needs immediate access to
@@ -46,27 +47,36 @@
 #define init_thread_info	(init_thread_union.thread_info)
 #define init_stack		(init_thread_union.stack)
 
+/*
+ * Size of kernel stack for each process
+ */
+#ifndef __s390x__
+#define THREAD_ORDER 1
+#define ASYNC_ORDER  1
+#else /* __s390x__ */
+#define THREAD_ORDER 2
+#define ASYNC_ORDER  2
+#endif /* __s390x__ */
+
+#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER)
+#define ASYNC_SIZE  (PAGE_SIZE << ASYNC_ORDER)
+
 /* how to get the thread information struct from C */
 static inline struct thread_info *current_thread_info(void)
 {
-	return (struct thread_info *)((*(unsigned long *) 0xc40)-8192);
+	return (struct thread_info *)((*(unsigned long *) __LC_KERNEL_STACK)-THREAD_SIZE);
 }
 
 /* thread information allocation */
 #define alloc_thread_info() ((struct thread_info *) \
-	__get_free_pages(GFP_KERNEL,1))
-#define free_thread_info(ti) free_pages((unsigned long) (ti), 1)
+	__get_free_pages(GFP_KERNEL,THREAD_ORDER))
+#define free_thread_info(ti) free_pages((unsigned long) (ti),THREAD_ORDER)
 #define get_thread_info(ti) get_task_struct((ti)->task)
 #define put_thread_info(ti) put_task_struct((ti)->task)
 
 #endif
 
 /*
- * Size of kernel stack for each process
- */
-#define THREAD_SIZE (2*PAGE_SIZE)
-
-/*
  * thread information flags bit numbers
  */
 #define TIF_SYSCALL_TRACE	0	/* syscall trace active */
@@ -77,6 +87,7 @@
 #define TIF_USEDFPU		16	/* FPU was used by this task this quantum (SMP) */
 #define TIF_POLLING_NRFLAG	17	/* true if poll_idle() is polling 
 					   TIF_NEED_RESCHED */
+#define TIF_31BIT		18	/* 32bit process */ 
 
 #define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
 #define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
@@ -85,6 +96,7 @@
 #define _TIF_RESTART_SVC	(1<<TIF_RESTART_SVC)
 #define _TIF_USEDFPU		(1<<TIF_USEDFPU)
 #define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
+#define _TIF_31BIT		(1<<TIF_31BIT)
 
 #endif /* __KERNEL__ */
 
diff -Nru a/include/asm-s390/tlbflush.h b/include/asm-s390/tlbflush.h
--- a/include/asm-s390/tlbflush.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/tlbflush.h	Sat Apr 19 19:51:51 2003
@@ -28,7 +28,6 @@
 #define local_flush_tlb() \
 do {  __asm__ __volatile__("ptlb": : :"memory"); } while (0)
 
-
 #ifndef CONFIG_SMP
 
 /*
@@ -70,7 +69,13 @@
 
 static inline void global_flush_tlb(void)
 {
-	if (MACHINE_HAS_CSP) {
+#ifndef __s390x__
+	if (!MACHINE_HAS_CSP) {
+		smp_ptlb_all();
+		return;
+	}
+#endif /* __s390x__ */
+	{
 		long dummy = 0;
 		__asm__ __volatile__ (
 			"    la   4,1(%0)\n"
@@ -78,8 +83,7 @@
 			"    slr  3,3\n"
 			"    csp  2,4"
 			: : "a" (&dummy) : "cc", "2", "3", "4" );
-	} else
-		smp_ptlb_all();
+	}
 }
 
 /*
diff -Nru a/include/asm-s390/types.h b/include/asm-s390/types.h
--- a/include/asm-s390/types.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-s390/types.h	Sat Apr 19 19:51:47 2003
@@ -27,15 +27,21 @@
 typedef __signed__ int __s32;
 typedef unsigned int __u32;
 
+#ifndef __s390x__
 #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
 typedef __signed__ long long __s64;
 typedef unsigned long long __u64;
 #endif
+#else /* __s390x__ */
+typedef __signed__ long __s64;
+typedef unsigned long __u64;
+#endif
+
 /* A address type so that arithmetic can be done on it & it can be upgraded to
    64 bit when necessary 
 */
-typedef __u32  addr_t; 
-typedef __s32  saddr_t;
+typedef unsigned long addr_t; 
+typedef __signed__ long saddr_t;
 
 #endif /* __ASSEMBLY__ */
 
@@ -44,7 +50,11 @@
  */
 #ifdef __KERNEL__
 
+#ifndef __s390x__
 #define BITS_PER_LONG 32
+#else
+#define BITS_PER_LONG 64
+#endif
 
 #ifndef __ASSEMBLY__
 
@@ -57,11 +67,17 @@
 typedef signed int s32;
 typedef unsigned int u32;
 
+#ifndef __s390x__
 typedef signed long long s64;
 typedef unsigned long long u64;
+#else /* __s390x__ */
+typedef signed long s64;
+typedef unsigned  long u64;
+#endif /* __s390x__ */
 
 typedef u32 dma_addr_t;
 
+#ifndef __s390x__
 typedef union {
 	unsigned long long pair;
 	struct {
@@ -75,7 +91,7 @@
 #define HAVE_SECTOR_T
 #endif
 
-#endif /* __ASSEMBLY__ */
-
-#endif                                 /* __KERNEL__                       */
-#endif
+#endif /* ! __s390x__   */
+#endif /* __ASSEMBLY__  */
+#endif /* __KERNEL__    */
+#endif /* _S390_TYPES_H */
diff -Nru a/include/asm-s390/uaccess.h b/include/asm-s390/uaccess.h
--- a/include/asm-s390/uaccess.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-s390/uaccess.h	Sat Apr 19 19:51:28 2003
@@ -72,284 +72,261 @@
 };
 
 /*
- * These are the main single-value transfer routines.  They automatically
- * use the right size if we just have the right pointer type.
+ * Standard fixup section for uaccess inline functions.
+ * local label 0: is the fault point
+ * local label 1: is the return point
+ * %0 is the error variable
+ * %3 is the error value -EFAULT
  */
-
-extern inline int __put_user_asm_8(void *x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   lr    2,%1\n"
-				"   lr    4,%2\n"
-                                "   sacf  512\n"
-                                "0: mvc   0(8,4),0(2)\n"
-                                "   sacf  0\n"
-				"1:\n"
-				".section .fixup,\"ax\"\n"
-				"2: sacf  0\n"
-				"   lhi   %0,%h3\n"
-				"   bras  4,3f\n"
-				"   .long 1b\n"
-				"3: l     4,0(4)\n"
-				"   br    4\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 4\n"
-				"   .long  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "d" (x), "d" (ptr), "K" (-EFAULT)
-                                : "cc", "2", "4" );
-        return err;
-}
-
-extern inline int __put_user_asm_4(__u32 x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   lr    4,%2\n"
-                                "   sacf  512\n"
-                                "0: st    %1,0(4)\n"
-                                "   sacf  0\n"
-				"1:\n"
-				".section .fixup,\"ax\"\n"
-				"2: sacf  0\n"
-				"   lhi   %0,%h3\n"
-				"   bras  4,3f\n"
-				"   .long 1b\n"
-				"3: l     4,0(4)\n"
-				"   br    4\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 4\n"
-				"   .long  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "d" (x), "d" (ptr), "K" (-EFAULT)
-                                : "cc", "4" );
-        return err;
-}
-
-extern inline int __put_user_asm_2(__u16 x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   lr    4,%2\n"
-                                "   sacf  512\n"
-                                "0: sth   %1,0(4)\n"
-                                "   sacf  0\n"
-				"1:\n"
-				".section .fixup,\"ax\"\n"
-				"2: sacf  0\n"
-				"   lhi   %0,%h3\n"
-				"   bras  4,3f\n"
-				"   .long 1b\n"
-				"3: l     4,0(4)\n"
-				"   br    4\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 4\n"
-				"   .long  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "d" (x), "d" (ptr), "K" (-EFAULT)
-                                : "cc", "4" );
-        return err;
-}
-
-extern inline int __put_user_asm_1(__u8 x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   lr    4,%2\n"
-                                "   sacf  512\n"
-                                "0: stc   %1,0(4)\n"
-                                "   sacf  0\n"
-				"1:\n"
-				".section .fixup,\"ax\"\n"
-				"2: sacf  0\n"
-				"   lhi   %0,%h3\n"
-				"   bras  4,3f\n"
-				"   .long 1b\n"
-				"3: l     4,0(4)\n"
-				"   br    4\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 4\n"
-				"   .long  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "d" (x), "d" (ptr), "K" (-EFAULT)
-                                : "cc", "4" );
-        return err;
-}
+#ifndef __s390x__
+#define __uaccess_fixup \
+	".section .fixup,\"ax\"\n"	\
+	"8: sacf  0\n"			\
+	"   lhi	  %0,%h3\n"		\
+	"   bras  4,9f\n"		\
+	"   .long 1b\n"			\
+	"9: l	  4,0(4)\n"		\
+	"   br	  4\n"			\
+	".previous\n"			\
+	".section __ex_table,\"a\"\n"	\
+	"   .align 4\n"			\
+	"   .long  0b,8b\n"		\
+	".previous"
+#else /* __s390x__ */
+#define __uaccess_fixup \
+	".section .fixup,\"ax\"\n"	\
+	"9: sacf  0\n"			\
+	"   lhi	  %0,%h3\n"		\
+	"   jg	  1b\n"			\
+	".previous\n"			\
+	".section __ex_table,\"a\"\n"	\
+	"   .align 8\n"			\
+	"   .quad  0b,9b\n"		\
+	".previous"
+#endif /* __s390x__ */
 
 /*
- * (u8)(u32) ... autsch, but that the only way we can suppress the
- * warnings when compiling binfmt_elf.c
+ * These are the main single-value transfer routines.  They automatically
+ * use the right size if we just have the right pointer type.
  */
-#define __put_user(x, ptr)                                      \
-({                                                              \
-        __typeof__(*(ptr)) __x = (x);                           \
-        int __pu_err;                                           \
-        switch (sizeof (*(ptr))) {                              \
-        case 1:                                                 \
-                __pu_err = __put_user_asm_1((__u8)(__u32) __x,  \
-                                            ptr);               \
-                break;                                          \
-        case 2:                                                 \
-                __pu_err = __put_user_asm_2((__u16)(__u32) __x, \
-                                            ptr);               \
-                break;                                          \
-        case 4:                                                 \
-                __pu_err = __put_user_asm_4((__u32) __x,        \
-                                            ptr);               \
-                break;                                          \
-        case 8:                                                 \
-                __pu_err = __put_user_asm_8(&__x, ptr);         \
-                break;                                          \
-        default:                                                \
-                __pu_err = __put_user_bad();                    \
-                break;                                          \
-         }                                                      \
-        __pu_err;                                               \
+#ifndef __s390x__
+
+#define __put_user_asm_8(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  2,%2\n"				\
+		"   la	  4,%1\n"				\
+		"   sacf  512\n"				\
+		"0: mvc	  0(8,4),0(2)\n"			\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err)					\
+		: "m" (*(__u64*)(ptr)), "m" (x), "K" (-EFAULT)	\
+		: "cc", "2", "4" );				\
+})
+
+#else /* __s390x__ */
+
+#define __put_user_asm_8(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%1\n"				\
+		"   sacf  512\n"				\
+		"0: stg	  %2,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err)					\
+		: "m" (*(__u64*)(ptr)), "d" (x), "K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#endif /* __s390x__ */
+
+#define __put_user_asm_4(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%1\n"				\
+		"   sacf  512\n"				\
+		"0: st	  %2,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err)					\
+		: "m" (*(__u32*)(ptr)), "d" (x), "K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#define __put_user_asm_2(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%1\n"				\
+		"   sacf  512\n"				\
+		"0: sth	  %2,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err)					\
+		: "m" (*(__u16*)(ptr)), "d" (x), "K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#define __put_user_asm_1(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%1\n"				\
+		"   sacf  512\n"				\
+		"0: stc	  %2,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err)					\
+		: "m" (*(__u8*)(ptr)), "d" (x),	"K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#define __put_user(x, ptr) \
+({								\
+	__typeof__(*(ptr)) __x = (x);				\
+	int __pu_err;						\
+	switch (sizeof (*(ptr))) {				\
+	case 1:							\
+		__put_user_asm_1(__x, ptr, __pu_err);		\
+		break;						\
+	case 2:							\
+		__put_user_asm_2(__x, ptr, __pu_err);		\
+		break;						\
+	case 4:							\
+		__put_user_asm_4(__x, ptr, __pu_err);		\
+		break;						\
+	case 8:							\
+		__put_user_asm_8(__x, ptr, __pu_err);		\
+		break;						\
+	default:						\
+		__pu_err = __put_user_bad();			\
+		break;						\
+	 }							\
+	__pu_err;						\
 })
 
 #define put_user(x, ptr) __put_user(x, ptr)
 
 extern int __put_user_bad(void);
 
-#define __get_user_asm_8(x, ptr, err)                                      \
-({                                                                         \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                         \
-				"   la    2,%0\n"			   \
-                                "   la    4,%2\n"                          \
-                                "   sacf  512\n"                           \
-                                "0: mvc   0(8,2),0(4)\n"                   \
-                                "   sacf  0\n"                             \
-                                "1:\n"                                     \
-                                ".section .fixup,\"ax\"\n"                 \
-                                "2: sacf  0\n"                             \
-                                "   lhi   %1,%h3\n"                        \
-                                "   bras  4,3f\n"                          \
-                                "   .long 1b\n"                            \
-                                "3: l     4,0(4)\n"                        \
-                                "   br    4\n"                             \
-                                ".previous\n"                              \
-                                ".section __ex_table,\"a\"\n"              \
-                                "   .align 4\n"                            \
-                                "   .long 0b,2b\n"                         \
-                                ".previous"                                \
-                                : "=m" (x) , "=&d" (err)                   \
-                                : "m" (*(const __u64*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "2", "4" );                        \
-})
-
-#define __get_user_asm_4(x, ptr, err)                                      \
-({                                                                         \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                         \
-                                "   la    4,%2\n"                          \
-                                "   sacf  512\n"                           \
-                                "0: l     %0,0(4)\n"                       \
-                                "   sacf  0\n"                             \
-                                "1:\n"                                     \
-                                ".section .fixup,\"ax\"\n"                 \
-                                "2: sacf  0\n"                             \
-                                "   lhi   %1,%h3\n"                        \
-                                "   bras  4,3f\n"                          \
-                                "   .long 1b\n"                            \
-                                "3: l     4,0(4)\n"                        \
-                                "   br    4\n"                             \
-                                ".previous\n"                              \
-                                ".section __ex_table,\"a\"\n"              \
-                                "   .align 4\n"                            \
-                                "   .long 0b,2b\n"                         \
-                                ".previous"                                \
-                                : "=d" (x) , "=&d" (err)                   \
-                                : "m" (*(const __u32*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "4" );                             \
-})
-
-#define __get_user_asm_2(x, ptr, err)                                      \
-({                                                                         \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                         \
-                                "   la    4,%2\n"                          \
-                                "   sacf  512\n"                           \
-                                "0: lh    %0,0(4)\n"                       \
-                                "   sacf  0\n"                             \
-                                "1:\n"                                     \
-                                ".section .fixup,\"ax\"\n"                 \
-                                "2: sacf  0\n"                             \
-                                "   lhi   %1,%h3\n"                        \
-                                "   bras  4,3f\n"                          \
-                                "   .long 1b\n"                            \
-                                "3: l     4,0(4)\n"                        \
-                                "   br    4\n"                             \
-                                ".previous\n"                              \
-                                ".section __ex_table,\"a\"\n"              \
-                                "   .align 4\n"                            \
-                                "   .long 0b,2b\n"                         \
-                                ".previous"                                \
-                                : "=d" (x) , "=&d" (err)                   \
-                                : "m" (*(const __u16*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "4" );                             \
-})
-
-#define __get_user_asm_1(x, ptr, err)                                     \
-({                                                                        \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                        \
-                                "   la    4,%2\n"                         \
-                                "   sr    %0,%0\n"                        \
-                                "   sacf  512\n"                          \
-                                "0: ic    %0,0(4)\n"                      \
-                                "   sacf  0\n"                            \
-                                "1:\n"                                    \
-                                ".section .fixup,\"ax\"\n"                \
-                                "2: sacf  0\n"                            \
-                                "   lhi   %1,%h3\n"                       \
-                                "   bras  4,3f\n"                         \
-                                "   .long 1b\n"                           \
-                                "3: l     4,0(4)\n"                       \
-                                "   br    4\n"                            \
-                                ".previous\n"                             \
-                                ".section __ex_table,\"a\"\n"             \
-                                "   .align 4\n"                           \
-                                "   .long 0b,2b\n"                        \
-                                ".previous"                               \
-                                : "=d" (x) , "=&d" (err)                  \
-                                : "m" (*(const __u8*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "4" );                            \
-})
+#ifndef __s390x__
 
-#define __get_user(x, ptr)                                      \
-({                                                              \
-        __typeof__(*(ptr)) __x;                                 \
-        int __gu_err;                                           \
-        switch (sizeof(*(ptr))) {                               \
-        case 1:                                                 \
-                __get_user_asm_1(__x, ptr, __gu_err);           \
-                break;                                          \
-        case 2:                                                 \
-                __get_user_asm_2(__x, ptr, __gu_err);           \
-                break;                                          \
-        case 4:                                                 \
-                __get_user_asm_4(__x, ptr, __gu_err);           \
-                break;                                          \
-        case 8:                                                 \
-                __get_user_asm_8(__x, ptr, __gu_err);           \
-                break;                                          \
-        default:                                                \
-                __x = 0;                                        \
-                __gu_err = __get_user_bad();                    \
-                break;                                          \
-        }                                                       \
-        (x) = __x;                                              \
-        __gu_err;                                               \
+#define __get_user_asm_8(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  2,%1\n"				\
+		"   la	  4,%2\n"				\
+		"   sacf  512\n"				\
+		"0: mvc	  0(8,2),0(4)\n"			\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err), "=m" (x)				\
+		: "m" (*(const __u64*)(ptr)),"K" (-EFAULT)	\
+		: "cc", "2", "4" );				\
+})
+
+#else /* __s390x__ */
+
+#define __get_user_asm_8(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%2\n"				\
+		"   sacf  512\n"				\
+		"0: lg	  %1,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err), "=d" (x)				\
+		: "m" (*(const __u64*)(ptr)),"K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#endif /* __s390x__ */
+
+
+#define __get_user_asm_4(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%2\n"				\
+		"   sacf  512\n"				\
+		"0: l	  %1,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err), "=d" (x)				\
+		: "m" (*(const __u32*)(ptr)),"K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#define __get_user_asm_2(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%2\n"				\
+		"   sacf  512\n"				\
+		"0: lh	  %1,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err), "=d" (x)				\
+		: "m" (*(const __u16*)(ptr)),"K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#define __get_user_asm_1(x, ptr, err) \
+({								\
+	__asm__ __volatile__ (					\
+		"   sr	  %0,%0\n"				\
+		"   la	  4,%2\n"				\
+		"   sr	  %1,%1\n"				\
+		"   sacf  512\n"				\
+		"0: ic	  %1,0(4)\n"				\
+		"   sacf  0\n"					\
+		"1:\n"						\
+		__uaccess_fixup					\
+		: "=&d" (err), "=d" (x)				\
+		: "m" (*(const __u8*)(ptr)),"K" (-EFAULT)	\
+		: "cc", "4" );					\
+})
+
+#define __get_user(x, ptr)					\
+({								\
+	__typeof__(*(ptr)) __x;					\
+	int __gu_err;						\
+	switch (sizeof(*(ptr))) {				\
+	case 1:							\
+		__get_user_asm_1(__x, ptr, __gu_err);		\
+		break;						\
+	case 2:							\
+		__get_user_asm_2(__x, ptr, __gu_err);		\
+		break;						\
+	case 4:							\
+		__get_user_asm_4(__x, ptr, __gu_err);		\
+		break;						\
+	case 8:							\
+		__get_user_asm_8(__x, ptr, __gu_err);		\
+		break;						\
+	default:						\
+		__x = 0;					\
+		__gu_err = __get_user_bad();			\
+		break;						\
+	}							\
+	(x) = __x;						\
+	__gu_err;						\
 })
 
 #define get_user(x, ptr) __get_user(x, ptr)
@@ -357,7 +334,8 @@
 extern int __get_user_bad(void);
 
 /*
- * access register are set up, that 4 points to secondary (user) , 2 to primary (kernel)
+ * access register are set up, that 4 points to secondary (user),
+ * 2 to primary (kernel)
  */
 
 extern long __copy_to_user_asm(const void *from, long n, const void *to);
@@ -402,42 +380,81 @@
  * Copy a null terminated string from userspace.
  */
 
+#ifndef __s390x__
+
 static inline long
 __strncpy_from_user(char *dst, const char *src, long count)
 {
         int len;
-        __asm__ __volatile__ (  "   slr   %0,%0\n"
-				"   lr    2,%1\n"
-                                "   lr    4,%2\n"
-                                "   slr   3,3\n"
-                                "   sacf  512\n"
-                                "0: ic    3,0(%0,4)\n"
-                                "1: stc   3,0(%0,2)\n"
-                                "   ltr   3,3\n"
-                                "   jz    2f\n"
-                                "   ahi   %0,1\n"
-                                "   clr   %0,%3\n"
-                                "   jl    0b\n"
-                                "2: sacf  0\n"
-				".section .fixup,\"ax\"\n"
-                                "3: lhi   %0,%h4\n"
-				"   basr  3,0\n"
-                                "   l     3,4f-.(3)\n"
-                                "   br    3\n"
-				"4: .long 2b\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 4\n"
-				"   .long  0b,3b\n"
-                                "   .long  1b,3b\n"
-				".previous"
-                                : "=&a" (len)
-                                : "a" (dst), "d" (src), "d" (count),
-                                  "K" (-EFAULT)
-                                : "2", "3", "4", "memory", "cc" );
-        return len;
+        __asm__ __volatile__ (
+		"   slr   %0,%0\n"
+		"   lr    2,%1\n"
+                "   lr    4,%2\n"
+                "   slr   3,3\n"
+                "   sacf  512\n"
+		"0: ic	  3,0(%0,4)\n"
+		"1: stc	  3,0(%0,2)\n"
+		"   ltr	  3,3\n"
+		"   jz	  2f\n"
+		"   ahi	  %0,1\n"
+		"   clr	  %0,%3\n"
+		"   jl	  0b\n"
+		"2: sacf  0\n"
+		".section .fixup,\"ax\"\n"
+		"3: lhi	  %0,%h4\n"
+		"   basr  3,0\n"
+		"   l	  3,4f-.(3)\n"
+		"   br	  3\n"
+		"4: .long 2b\n"
+		".previous\n"
+		".section __ex_table,\"a\"\n"
+		"   .align 4\n"
+		"   .long  0b,3b\n"
+		"   .long  1b,3b\n"
+		".previous"
+		: "=&a" (len)
+		: "a" (dst), "d" (src), "d" (count), "K" (-EFAULT)
+		: "2", "3", "4", "memory", "cc" );
+	return len;
 }
 
+#else /* __s390x__ */
+
+static inline long
+__strncpy_from_user(char *dst, const char *src, long count)
+{
+	long len;
+	__asm__ __volatile__ (
+		"   slgr  %0,%0\n"
+		"   lgr	  2,%1\n"
+		"   lgr	  4,%2\n"
+		"   slr	  3,3\n"
+		"   sacf  512\n"
+		"0: ic	  3,0(%0,4)\n"
+		"1: stc	  3,0(%0,2)\n"
+		"   ltr	  3,3\n"
+		"   jz	  2f\n"
+		"   aghi  %0,1\n"
+		"   cgr	  %0,%3\n"
+		"   jl	  0b\n"
+		"2: sacf  0\n"
+		".section .fixup,\"ax\"\n"
+		"3: lghi  %0,%h4\n"
+		"   jg	  2b\n"	 
+		".previous\n"
+		".section __ex_table,\"a\"\n"
+		"   .align 8\n"
+		"   .quad  0b,3b\n"
+		"   .quad  1b,3b\n"
+		".previous"
+		: "=&a" (len)
+		: "a"  (dst), "d" (src), "d" (count), "K" (-EFAULT)
+		: "cc", "2" ,"3", "4" );
+	return len;
+}
+
+#endif /* __s390x__ */
+
 static inline long
 strncpy_from_user(char *dst, const char *src, long count)
 {
@@ -453,35 +470,92 @@
  *
  * Return 0 for error
  */
+#ifndef __s390x__
+
+static inline unsigned long
+strnlen_user(const char * src, unsigned long n)
+{
+	__asm__ __volatile__ (
+		"   alr   %0,%1\n"
+		"   slr   0,0\n"
+		"   lr    4,%1\n"
+		"   sacf  512\n"
+		"0: srst  %0,4\n"
+		"   jo    0b\n"
+		"   slr   %0,%1\n"
+		"   ahi   %0,1\n"
+		"   sacf  0\n"
+		"1:\n"
+		".section .fixup,\"ax\"\n"
+		"2: sacf  0\n"
+		"   slr   %0,%0\n"
+		"   bras  4,3f\n"
+		"   .long 1b\n"
+		"3: l     4,0(4)\n"
+		"   br    4\n"
+		".previous\n"
+		".section __ex_table,\"a\"\n"
+		"  .align 4\n"
+		"  .long  0b,2b\n"
+		".previous"
+		: "+&a" (n) : "d" (src)
+		: "cc", "0", "4" );
+	return n;
+}
+
+#else /* __s390x__ */
+
 static inline unsigned long
 strnlen_user(const char * src, unsigned long n)
 {
-	__asm__ __volatile__ ("   alr   %0,%1\n"
-			      "   slr   0,0\n"
-			      "   lr    4,%1\n"
-			      "   sacf  512\n"
-			      "0: srst  %0,4\n"
-			      "   jo    0b\n"
-			      "   slr   %0,%1\n"
-			      "   ahi   %0,1\n"
-			      "   sacf  0\n"
-                              "1:\n"
-                              ".section .fixup,\"ax\"\n"
-                              "2: sacf  0\n"
-                              "   slr   %0,%0\n"
-                              "   bras  4,3f\n"
-                              "   .long 1b\n"
-                              "3: l     4,0(4)\n"
-                              "   br    4\n"
-                              ".previous\n"
-			      ".section __ex_table,\"a\"\n"
-			      "   .align 4\n"
-			      "   .long  0b,2b\n"
-			      ".previous"
-			      : "+&a" (n) : "d" (src)
-			      : "cc", "0", "4" );
-        return n;
+#if 0
+	__asm__ __volatile__ (
+		"   algr  %0,%1\n"
+		"   slgr  0,0\n"
+		"   lgr	  4,%1\n"
+		"   sacf  512\n"
+		"0: srst  %0,4\n"
+		"   jo	0b\n"
+		"   slgr  %0,%1\n"
+		"   aghi  %0,1\n"
+		"1: sacf  0\n"
+		".section .fixup,\"ax\"\n"
+		"2: slgr  %0,%0\n"
+		"   jg	  1b\n"
+		".previous\n"
+		".section __ex_table,\"a\"\n"
+		"  .align 8\n"
+		"  .quad  0b,2b\n"
+		".previous"
+		: "+&a" (n) : "d" (src)
+		: "cc", "0", "4" );
+#else
+	__asm__ __volatile__ (
+		"   lgr	  4,%1\n"
+		"   sacf  512\n"
+		"0: cli   0(4),0x00\n"
+		"   la    4,1(4)\n"
+		"   je    1f\n"
+		"   brctg %0,0b\n"
+		"1: lgr	  %0,4\n"
+		"   slgr  %0,%1\n"
+		"2: sacf  0\n"
+		".section .fixup,\"ax\"\n"
+		"3: slgr  %0,%0\n"
+		"   jg    2b\n"  
+		".previous\n"
+		".section __ex_table,\"a\"\n"
+		"  .align 8\n"
+		"  .quad  0b,3b\n"
+		".previous"
+		: "+&a" (n) : "d" (src)
+		: "cc", "4" );
+#endif
+	return n;
 }
+
+#endif /* __s390x__ */
+
 #define strlen_user(str) strnlen_user(str, ~0UL)
 
 /*
@@ -490,18 +564,18 @@
 
 extern long __clear_user_asm(void *to, long n);
 
-#define __clear_user(to, n)                                     \
-({                                                              \
-        __clear_user_asm(to, n);                                \
+#define __clear_user(to, n)					\
+({								\
+	__clear_user_asm(to, n);				\
 })
 
 static inline unsigned long
 clear_user(void *to, unsigned long n)
 {
-        if (access_ok(VERIFY_WRITE, to, n))
-                n = __clear_user(to, n);
-        return n;
+	if (access_ok(VERIFY_WRITE, to, n))
+		n = __clear_user(to, n);
+	return n;
 }
 
 
-#endif                                 /* _S390_UACCESS_H                  */
+#endif				       /* _S390_UACCESS_H		   */
diff -Nru a/include/asm-s390/unistd.h b/include/asm-s390/unistd.h
--- a/include/asm-s390/unistd.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-s390/unistd.h	Sat Apr 19 19:51:51 2003
@@ -249,130 +249,255 @@
 #define __NR_epoll_wait		251
 #define __NR_set_tid_address	252
 #define __NR_fadvise64		253
+#define __NR_timer_create	254
+#define __NR_timer_settime	(__NR_timer_create+1)
+#define __NR_timer_gettime	(__NR_timer_create+2)
+#define __NR_timer_getoverrun	(__NR_timer_create+3)
+#define __NR_timer_delete	(__NR_timer_create+4)
+#define __NR_clock_settime	(__NR_timer_create+5)
+#define __NR_clock_gettime	(__NR_timer_create+6)
+#define __NR_clock_getres	(__NR_timer_create+7)
+#define __NR_clock_nanosleep	(__NR_timer_create+8)
+
+#define NR_syscalls 263
+
+/* 
+ * There are some system calls that are not present on 64 bit, some
+ * have a different name although they do the same (e.g. __NR_chown32
+ * is __NR_chown on 64 bit).
+ */
+#ifdef __s390x__
+#undef  __NR_time
+#undef  __NR_lchown
+#undef  __NR_setuid
+#undef  __NR_getuid
+#undef  __NR_stime
+#undef  __NR_setgid
+#undef  __NR_getgid
+#undef  __NR_geteuid
+#undef  __NR_getegid
+#undef  __NR_setreuid
+#undef  __NR_setregid
+#undef  __NR_getrlimit
+#undef  __NR_getgroups
+#undef  __NR_setgroups
+#undef  __NR_fchown
+#undef  __NR_ioperm
+#undef  __NR_setfsuid
+#undef  __NR_setfsgid
+#undef  __NR__llseek
+#undef  __NR__newselect
+#undef  __NR_setresuid
+#undef  __NR_getresuid
+#undef  __NR_setresgid
+#undef  __NR_getresgid
+#undef  __NR_chown
+#undef  __NR_ugetrlimit
+#undef  __NR_mmap2
+#undef  __NR_truncate64
+#undef  __NR_ftruncate64
+#undef  __NR_stat64
+#undef  __NR_lstat64
+#undef  __NR_fstat64
+#undef  __NR_lchown32
+#undef  __NR_getuid32
+#undef  __NR_getgid32
+#undef  __NR_geteuid32
+#undef  __NR_getegid32
+#undef  __NR_setreuid32
+#undef  __NR_setregid32
+#undef  __NR_getgroups32
+#undef  __NR_setgroups32
+#undef  __NR_fchown32
+#undef  __NR_setresuid32
+#undef  __NR_getresuid32
+#undef  __NR_setresgid32
+#undef  __NR_getresgid32
+#undef  __NR_chown32
+#undef  __NR_setuid32
+#undef  __NR_setgid32
+#undef  __NR_setfsuid32
+#undef  __NR_setfsgid32
+#undef  __NR_getdents64
+#undef  __NR_fcntl64
+#undef  __NR_sendfile64
+
+#define __NR_select		142
+#define __NR_getrlimit		191	/* SuS compliant getrlimit */
+#define __NR_lchown  		198
+#define __NR_getuid  		199
+#define __NR_getgid  		200
+#define __NR_geteuid  		201
+#define __NR_getegid  		202
+#define __NR_setreuid  		203
+#define __NR_setregid  		204
+#define __NR_getgroups  	205
+#define __NR_setgroups  	206
+#define __NR_fchown  		207
+#define __NR_setresuid  	208
+#define __NR_getresuid  	209
+#define __NR_setresgid  	210
+#define __NR_getresgid  	211
+#define __NR_chown  		212
+#define __NR_setuid  		213
+#define __NR_setgid  		214
+#define __NR_setfsuid  		215
+#define __NR_setfsgid  		216
 
+#endif
 
 /* user-visible error numbers are in the range -1 - -122: see <asm-s390/errno.h> */
 
-#define __syscall_return(type, res)                          \
-do {                                                         \
-        if ((unsigned long)(res) >= (unsigned long)(-125)) { \
-                errno = -(res);                              \
-                res = -1;                                    \
-        }                                                    \
-        return (type) (res);                                 \
+#define __syscall_return(type, res)			     \
+do {							     \
+	if ((unsigned long)(res) >= (unsigned long)(-125)) { \
+		errno = -(res);				     \
+		res = -1;				     \
+	}						     \
+	return (type) (res);				     \
 } while (0)
 
-#define _svc_clobber "cc", "memory"
+#define _svc_clobber "1", "cc", "memory"
 
-#define _syscall0(type,name)                                 \
-type name(void) {                                            \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name)                          \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
+#define _syscall0(type,name)				     \
+type name(void) {					     \
+	register long __svcres asm("2");		     \
+	long __res;					     \
+	__asm__ __volatile__ (				     \
+		"    .if %1 < 256\n"			     \
+		"    svc %b1\n"				     \
+		"    .else\n"				     \
+		"    la  %%r1,%1\n"			     \
+		"    svc 0\n"				     \
+		"    .endif"				     \
+		: "=d" (__svcres)			     \
+		: "i" (__NR_##name)			     \
+		: _svc_clobber );			     \
+	__res = __svcres;				     \
+	__syscall_return(type,__res);			     \
 }
 
-#define _syscall1(type,name,type1,arg1)                      \
-type name(type1 arg1) {                                      \
-        register type1 __arg1 asm("2") = arg1;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
+#define _syscall1(type,name,type1,arg1)			     \
+type name(type1 arg1) {					     \
+	register type1 __arg1 asm("2") = arg1;		     \
+	register long __svcres asm("2");		     \
+	long __res;					     \
+	__asm__ __volatile__ (				     \
+		"    .if %1 < 256\n"			     \
+		"    svc %b1\n"				     \
+		"    .else\n"				     \
+		"    la  %%r1,%1\n"			     \
+		"    svc 0\n"				     \
+		"    .endif"				     \
+		: "=d" (__svcres)			     \
+		: "i" (__NR_##name),			     \
+		  "0" (__arg1)				     \
+		: _svc_clobber );			     \
+	__res = __svcres;				     \
+	__syscall_return(type,__res);			     \
 }
 
-#define _syscall2(type,name,type1,arg1,type2,arg2)           \
-type name(type1 arg1, type2 arg2) {                          \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
+#define _syscall2(type,name,type1,arg1,type2,arg2)	     \
+type name(type1 arg1, type2 arg2) {			     \
+	register type1 __arg1 asm("2") = arg1;		     \
+	register type2 __arg2 asm("3") = arg2;		     \
+	register long __svcres asm("2");		     \
+	long __res;					     \
+	__asm__ __volatile__ (				     \
+		"    .if %1 < 256\n"			     \
+		"    svc %b1\n"				     \
+		"    .else\n"				     \
+		"    la %%r1,%1\n"			     \
+		"    svc 0\n"				     \
+		"    .endif"				     \
+		: "=d" (__svcres)			     \
+		: "i" (__NR_##name),			     \
+		  "0" (__arg1),				     \
+		  "d" (__arg2)				     \
+		: _svc_clobber );			     \
+	__res = __svcres;				     \
+	__syscall_return(type,__res);			     \
 }
 
 #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)\
-type name(type1 arg1, type2 arg2, type3 arg3) {              \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register type3 __arg3 asm("4") = arg3;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2),                              \
-                  "d" (__arg3)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
+type name(type1 arg1, type2 arg2, type3 arg3) {		     \
+	register type1 __arg1 asm("2") = arg1;		     \
+	register type2 __arg2 asm("3") = arg2;		     \
+	register type3 __arg3 asm("4") = arg3;		     \
+	register long __svcres asm("2");		     \
+	long __res;					     \
+	__asm__ __volatile__ (				     \
+		"    .if %1 < 256\n"			     \
+		"    svc %b1\n"				     \
+		"    .else\n"				     \
+		"    la  %%r1,%1\n"			     \
+		"    svc 0\n"				     \
+		"    .endif"				     \
+		: "=d" (__svcres)			     \
+		: "i" (__NR_##name),			     \
+		  "0" (__arg1),				     \
+		  "d" (__arg2),				     \
+		  "d" (__arg3)				     \
+		: _svc_clobber );			     \
+	__res = __svcres;				     \
+	__syscall_return(type,__res);			     \
 }
 
 #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,\
-                  type4,name4)                               \
+		  type4,name4)				     \
 type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {  \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register type3 __arg3 asm("4") = arg3;               \
-        register type4 __arg4 asm("5") = arg4;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2),                              \
-                  "d" (__arg3),                              \
-                  "d" (__arg4)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
+	register type1 __arg1 asm("2") = arg1;		     \
+	register type2 __arg2 asm("3") = arg2;		     \
+	register type3 __arg3 asm("4") = arg3;		     \
+	register type4 __arg4 asm("5") = arg4;		     \
+	register long __svcres asm("2");		     \
+	long __res;					     \
+	__asm__ __volatile__ (				     \
+		"    .if %1 < 256\n"			     \
+		"    svc %b1\n"				     \
+		"    .else\n"				     \
+		"    la  %%r1,%1\n"			     \
+		"    svc 0\n"				     \
+		"    .endif"				     \
+		: "=d" (__svcres)			     \
+		: "i" (__NR_##name),			     \
+		  "0" (__arg1),				     \
+		  "d" (__arg2),				     \
+		  "d" (__arg3),				     \
+		  "d" (__arg4)				     \
+		: _svc_clobber );			     \
+	__res = __svcres;				     \
+	__syscall_return(type,__res);			     \
 }
 
 #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,\
-                  type4,name4,type5,name5)                   \
+		  type4,name4,type5,name5)		     \
 type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
-          type5 arg5) {                                      \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register type3 __arg3 asm("4") = arg3;               \
-        register type4 __arg4 asm("5") = arg4;               \
-        register type5 __arg5 asm("6") = arg5;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2),                              \
-                  "d" (__arg3),                              \
-                  "d" (__arg4),                              \
-                  "d" (__arg5)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
+	  type5 arg5) {					     \
+	register type1 __arg1 asm("2") = arg1;		     \
+	register type2 __arg2 asm("3") = arg2;		     \
+	register type3 __arg3 asm("4") = arg3;		     \
+	register type4 __arg4 asm("5") = arg4;		     \
+	register type5 __arg5 asm("6") = arg5;		     \
+	register long __svcres asm("2");		     \
+	long __res;					     \
+	__asm__ __volatile__ (				     \
+		"    .if %1 < 256\n"			     \
+		"    svc %b1\n"				     \
+		"    .else\n"				     \
+		"    la  %%r1,%1\n"			     \
+		"    svc 0\n"				     \
+		"    .endif"				     \
+		: "=d" (__svcres)			     \
+		: "i" (__NR_##name),			     \
+		  "0" (__arg1),				     \
+		  "d" (__arg2),				     \
+		  "d" (__arg3),				     \
+		  "d" (__arg4),				     \
+		  "d" (__arg5)				     \
+		: _svc_clobber );			     \
+	__res = __svcres;				     \
+	__syscall_return(type,__res);			     \
 }
 
 #ifdef __KERNEL_SYSCALLS__
diff -Nru a/include/asm-s390x/a.out.h b/include/asm-s390x/a.out.h
--- a/include/asm-s390x/a.out.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,38 +0,0 @@
-/*
- *  include/asm-s390/a.out.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *
- *  Derived from "include/asm-i386/a.out.h"
- *    Copyright (C) 1992, Linus Torvalds
- *
- * I don't think we'll ever need a.out ...
- */
-
-#ifndef __S390_A_OUT_H__
-#define __S390_A_OUT_H__
-
-struct exec
-{
-  unsigned long 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 */
-  unsigned a_syms;		/* length of symbol table data in file, in bytes */
-  unsigned a_entry;		/* start address */
-  unsigned a_trsize;		/* length of relocation info for text, in bytes */
-  unsigned a_drsize;		/* length of relocation info for data, in bytes */
-};
-
-#define N_TRSIZE(a)	((a).a_trsize)
-#define N_DRSIZE(a)	((a).a_drsize)
-#define N_SYMSIZE(a)	((a).a_syms)
-
-#ifdef __KERNEL__
-
-#define STACK_TOP	TASK_SIZE
-
-#endif
-
-#endif /* __A_OUT_GNU_H__ */
diff -Nru a/include/asm-s390x/atomic.h b/include/asm-s390x/atomic.h
--- a/include/asm-s390x/atomic.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,168 +0,0 @@
-#ifndef __ARCH_S390_ATOMIC__
-#define __ARCH_S390_ATOMIC__
-
-/*
- *  include/asm-s390x/atomic.h
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Denis Joseph Barrow
- *
- *  Derived from "include/asm-i386/bitops.h"
- *    Copyright (C) 1992, Linus Torvalds
- *
- */
-
-/*
- * Atomic operations that C can't guarantee us.  Useful for
- * resource counting etc..
- * S390 uses 'Compare And Swap' for atomicity in SMP enviroment
- */
-
-typedef struct { volatile int counter; } __attribute__ ((aligned (4))) atomic_t;
-#define ATOMIC_INIT(i)  { (i) }
-
-#define atomic_eieio()          __asm__ __volatile__ ("BCR 15,0")
-
-#define __CS_LOOP(old_val, new_val, ptr, op_val, op_string)		\
-        __asm__ __volatile__("   l     %0,0(%3)\n"			\
-                             "0: lr    %1,%0\n"				\
-                             op_string "  %1,%4\n"			\
-                             "   cs    %0,%1,0(%3)\n"			\
-                             "   jl    0b"				\
-                             : "=&d" (old_val), "=&d" (new_val),	\
-			       "+m" (((atomic_t *)(ptr))->counter)	\
-			     : "a" (ptr), "d" (op_val) : "cc" );
-
-#define atomic_read(v)          ((v)->counter)
-#define atomic_set(v,i)         (((v)->counter) = (i))
-
-static __inline__ void atomic_add(int i, atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, i, "ar");
-}
-
-static __inline__ int atomic_add_return (int i, atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, i, "ar");
-	return new_val;
-}
-
-static __inline__ int atomic_add_negative(int i, atomic_t *v)
-{
-	int old_val, new_val;
-        __CS_LOOP(old_val, new_val, v, i, "ar");
-        return new_val < 0;
-}
-
-static __inline__ void atomic_sub(int i, atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, i, "sr");
-}
-
-static __inline__ void atomic_inc(volatile atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, 1, "ar");
-}
-
-static __inline__ int atomic_inc_return(volatile atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, 1, "ar");
-        return new_val;
-}
-
-static __inline__ int atomic_inc_and_test(volatile atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, 1, "ar");
-	return new_val != 0;
-}
-
-static __inline__ void atomic_dec(volatile atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, 1, "sr");
-}
-
-static __inline__ int atomic_dec_return(volatile atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, 1, "sr");
-	return new_val;
-}
-
-static __inline__ int atomic_dec_and_test(volatile atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, 1, "sr");
-        return new_val == 0;
-}
-
-static __inline__ void atomic_clear_mask(unsigned long mask, atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, ~mask, "nr");
-}
-
-static __inline__ void atomic_set_mask(unsigned long mask, atomic_t *v)
-{
-	int old_val, new_val;
-	__CS_LOOP(old_val, new_val, v, mask, "or");
-}
-
-/*
-  returns 0  if expected_oldval==value in *v ( swap was successful )
-  returns 1  if unsuccessful.
-*/
-static __inline__ int
-atomic_compare_and_swap(int expected_oldval,int new_val,atomic_t *v)
-{
-        int retval;
-
-        __asm__ __volatile__(
-                "  lr   %0,%3\n"
-                "  cs   %0,%4,0(%2)\n"
-                "  ipm  %0\n"
-                "  srl  %0,28\n"
-                "0:"
-                : "=&d" (retval), "+m" (v->counter)
-                : "a" (v), "d" (expected_oldval) , "d" (new_val)
-                : "cc");
-        return retval;
-}
-
-/*
-  Spin till *v = expected_oldval then swap with newval.
- */
-static __inline__ void
-atomic_compare_and_swap_spin(int expected_oldval,int new_val,atomic_t *v)
-{
-	unsigned long tmp;
-        __asm__ __volatile__(
-                "0: lr  %1,%3\n"
-                "   cs  %1,%4,0(%2)\n"
-                "   jl  0b\n"
-                : "+m" (v->counter), "=&d" (tmp)
-		: "a" (v), "d" (expected_oldval) , "d" (new_val)
-                : "cc" );
-}
-
-#define atomic_compare_and_swap_debug(where,from,to) \
-if (atomic_compare_and_swap ((from), (to), (where))) {\
-	printk (KERN_WARNING"%s/%d atomic counter:%s couldn't be changed from %d(%s) to %d(%s), was %d\n",\
-		__FILE__,__LINE__,#where,(from),#from,(to),#to,atomic_read (where));\
-        atomic_set(where,(to));\
-}
-
-#define smp_mb__before_atomic_dec()	smp_mb()
-#define smp_mb__after_atomic_dec()	smp_mb()
-#define smp_mb__before_atomic_inc()	smp_mb()
-#define smp_mb__after_atomic_inc()	smp_mb()
-
-#endif                                 /* __ARCH_S390_ATOMIC __            */
diff -Nru a/include/asm-s390x/bitops.h b/include/asm-s390x/bitops.h
--- a/include/asm-s390x/bitops.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,946 +0,0 @@
-#ifndef _S390_BITOPS_H
-#define _S390_BITOPS_H
-
-/*
- *  include/asm-s390/bitops.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/bitops.h"
- *    Copyright (C) 1992, Linus Torvalds
- *
- */
-#include <linux/config.h>
-
-/*
- * bit 0 is the LSB of *addr; bit 63 is the MSB of *addr;
- * bit 64 is the LSB of *(addr+8). That combined with the
- * big endian byte order on S390 give the following bit
- * order in memory:
- *    3f 3e 3d 3c 3b 3a 39 38 37 36 35 34 33 32 31 30
- *    2f 2e 2d 2c 2b 2a 29 28 27 26 25 24 23 22 21 20
- *    1f 1e 1d 1c 1b 1a 19 18 17 16 15 14 13 12 11 10
- *    0f 0e 0d 0c 0b 0a 09 08 07 06 05 04 03 02 01 00
- * after that follows the next long with bit numbers
- *    7f 7e 7d 7c 7b 7a 79 78 77 76 75 74 73 72 71 70
- *    6f 6e 6d 6c 6b 6a 69 68 67 66 65 64 63 62 61 60
- *    5f 5e 5d 5c 5b 5a 59 58 57 56 55 54 53 52 51 50
- *    4f 4e 4d 4c 4b 4a 49 48 47 46 45 44 43 42 41 40
- * The reason for this bit ordering is the fact that
- * in the architecture independent code bits operations
- * of the form "flags |= (1 << bitnr)" are used INTERMIXED
- * with operation of the form "set_bit(bitnr, flags)".
- */
-
-/* set ALIGN_CS to 1 if the SMP safe bit operations should
- * align the address to 4 byte boundary. It seems to work
- * without the alignment. 
- */
-#ifdef __KERNEL__
-#define ALIGN_CS 0
-#else
-#define ALIGN_CS 1
-#ifndef CONFIG_SMP
-#error "bitops won't work without CONFIG_SMP"
-#endif
-#endif
-
-/* bitmap tables from arch/S390/kernel/bitmap.S */
-extern const char _oi_bitmap[];
-extern const char _ni_bitmap[];
-extern const char _zb_findmap[];
-extern const char _sb_findmap[];
-
-#ifdef CONFIG_SMP
-/*
- * SMP safe set_bit routine based on compare and swap (CS)
- */
-static inline void set_bit_cs(unsigned long nr, volatile unsigned long *ptr)
-{
-        unsigned long addr, old, new, mask;
-
-	addr = (unsigned long) ptr;
-#if ALIGN_CS == 1
-	nr += (addr & 7) << 3;		/* add alignment to bit number */
-	addr ^= addr & 7;		/* align address to 8 */
-#endif
-	addr += (nr ^ (nr & 63)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 63);	/* make OR mask */
-	asm volatile(
-		"   lg   %0,0(%4)\n"
-		"0: lgr  %1,%0\n"
-		"   ogr  %1,%3\n"
-		"   csg  %0,%1,0(%4)\n"
-		"   jl   0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned long *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
-}
-
-/*
- * SMP safe clear_bit routine based on compare and swap (CS)
- */
-static inline void clear_bit_cs(unsigned long nr, volatile unsigned long *ptr)
-{
-        unsigned long addr, old, new, mask;
-
-	addr = (unsigned long) ptr;
-#if ALIGN_CS == 1
-	nr += (addr & 7) << 3;		/* add alignment to bit number */
-	addr ^= addr & 7;		/* align address to 8 */
-#endif
-	addr += (nr ^ (nr & 63)) >> 3;	/* calculate address for CS */
-	mask = ~(1UL << (nr & 63));	/* make AND mask */
-	asm volatile(
-		"   lg   %0,0(%4)\n"
-		"0: lgr  %1,%0\n"
-		"   ngr  %1,%3\n"
-		"   csg  %0,%1,0(%4)\n"
-		"   jl   0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned long *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
-}
-
-/*
- * SMP safe change_bit routine based on compare and swap (CS)
- */
-static inline void change_bit_cs(unsigned long nr, volatile unsigned long *ptr)
-{
-        unsigned long addr, old, new, mask;
-
-	addr = (unsigned long) ptr;
-#if ALIGN_CS == 1
-	nr += (addr & 7) << 3;		/* add alignment to bit number */
-	addr ^= addr & 7;		/* align address to 8 */
-#endif
-	addr += (nr ^ (nr & 63)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 63);	/* make XOR mask */
-	asm volatile(
-		"   lg   %0,0(%4)\n"
-		"0: lgr  %1,%0\n"
-		"   xgr  %1,%3\n"
-		"   csg  %0,%1,0(%4)\n"
-		"   jl   0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned long *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
-}
-
-/*
- * SMP safe test_and_set_bit routine based on compare and swap (CS)
- */
-static inline int
-test_and_set_bit_cs(unsigned long nr, volatile unsigned long *ptr)
-{
-        unsigned long addr, old, new, mask;
-
-	addr = (unsigned long) ptr;
-#if ALIGN_CS == 1
-	nr += (addr & 7) << 3;		/* add alignment to bit number */
-	addr ^= addr & 7;		/* align address to 8 */
-#endif
-	addr += (nr ^ (nr & 63)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 63);	/* make OR/test mask */
-	asm volatile(
-		"   lg   %0,0(%4)\n"
-		"0: lgr  %1,%0\n"
-		"   ogr  %1,%3\n"
-		"   csg  %0,%1,0(%4)\n"
-		"   jl   0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned long *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
-	return (old & mask) != 0;
-}
-
-/*
- * SMP safe test_and_clear_bit routine based on compare and swap (CS)
- */
-static inline int
-test_and_clear_bit_cs(unsigned long nr, volatile unsigned long *ptr)
-{
-        unsigned long addr, old, new, mask;
-
-	addr = (unsigned long) ptr;
-#if ALIGN_CS == 1
-	nr += (addr & 7) << 3;		/* add alignment to bit number */
-	addr ^= addr & 7;		/* align address to 8 */
-#endif
-	addr += (nr ^ (nr & 63)) >> 3;	/* calculate address for CS */
-	mask = ~(1UL << (nr & 63));	/* make AND mask */
-	asm volatile(
-		"   lg   %0,0(%4)\n"
-		"0: lgr  %1,%0\n"
-		"   ngr  %1,%3\n"
-		"   csg  %0,%1,0(%4)\n"
-		"   jl   0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned long *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
-	return (old ^ new) != 0;
-}
-
-/*
- * SMP safe test_and_change_bit routine based on compare and swap (CS) 
- */
-static inline int
-test_and_change_bit_cs(unsigned long nr, volatile unsigned long *ptr)
-{
-        unsigned long addr, old, new, mask;
-
-	addr = (unsigned long) ptr;
-#if ALIGN_CS == 1
-	nr += (addr & 7) << 3;		/* add alignment to bit number */
-	addr ^= addr & 7;		/* align address to 8 */
-#endif
-	addr += (nr ^ (nr & 63)) >> 3;	/* calculate address for CS */
-	mask = 1UL << (nr & 63);	/* make XOR mask */
-	asm volatile(
-		"   lg   %0,0(%4)\n"
-		"0: lgr  %1,%0\n"
-		"   xgr  %1,%3\n"
-		"   csg  %0,%1,0(%4)\n"
-		"   jl   0b"
-		: "=&d" (old), "=&d" (new), "+m" (*(unsigned long *) addr)
-		: "d" (mask), "a" (addr) 
-		: "cc" );
-	return (old & mask) != 0;
-}
-#endif /* CONFIG_SMP */
-
-/*
- * fast, non-SMP set_bit routine
- */
-static inline void __set_bit(unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-
-	addr = (unsigned long) ptr + ((nr ^ 56) >> 3);
-        asm volatile("oc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
-}
-
-static inline void 
-__constant_set_bit(const unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-
-	addr = ((unsigned long) ptr) + ((nr >> 3) ^ 7);
-	switch (nr&7) {
-	case 0:
-		asm volatile ("oi 0(%1),0x01"
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 1:
-		asm volatile ("oi 0(%1),0x02"
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 2:
-		asm volatile ("oi 0(%1),0x04" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 3:
-		asm volatile ("oi 0(%1),0x08" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 4:
-		asm volatile ("oi 0(%1),0x10" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 5:
-		asm volatile ("oi 0(%1),0x20" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 6:
-		asm volatile ("oi 0(%1),0x40" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 7:
-		asm volatile ("oi 0(%1),0x80" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	}
-}
-
-#define set_bit_simple(nr,addr) \
-(__builtin_constant_p((nr)) ? \
- __constant_set_bit((nr),(addr)) : \
- __set_bit((nr),(addr)) )
-
-/*
- * fast, non-SMP clear_bit routine
- */
-static inline void 
-__clear_bit(unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-
-	addr = (unsigned long) ptr + ((nr ^ 56) >> 3);
-        asm volatile("nc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_ni_bitmap + (nr & 7))
-		     : "cc" );
-}
-
-static inline void 
-__constant_clear_bit(const unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-
-	addr = ((unsigned long) ptr) + ((nr >> 3) ^ 7);
-	switch (nr&7) {
-	case 0:
-		asm volatile ("ni 0(%1),0xFE" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 1:
-		asm volatile ("ni 0(%1),0xFD"
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 2:
-		asm volatile ("ni 0(%1),0xFB" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 3:
-		asm volatile ("ni 0(%1),0xF7" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 4:
-		asm volatile ("ni 0(%1),0xEF" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 5:
-		asm volatile ("ni 0(%1),0xDF" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 6:
-		asm volatile ("ni 0(%1),0xBF" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 7:
-		asm volatile ("ni 0(%1),0x7F" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	}
-}
-
-#define clear_bit_simple(nr,addr) \
-(__builtin_constant_p((nr)) ? \
- __constant_clear_bit((nr),(addr)) : \
- __clear_bit((nr),(addr)) )
-
-/* 
- * fast, non-SMP change_bit routine 
- */
-static inline void __change_bit(unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-
-	addr = (unsigned long) ptr + ((nr ^ 56) >> 3);
-        asm volatile("xc 0(1,%1),0(%2)"
-		     :  "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
-}
-
-static inline void 
-__constant_change_bit(const unsigned long nr, volatile unsigned long *ptr) 
-{
-	unsigned long addr;
-
-	addr = ((unsigned long) ptr) + ((nr >> 3) ^ 7);
-	switch (nr&7) {
-	case 0:
-		asm volatile ("xi 0(%1),0x01" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 1:
-		asm volatile ("xi 0(%1),0x02" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 2:
-		asm volatile ("xi 0(%1),0x04" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 3:
-		asm volatile ("xi 0(%1),0x08" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 4:
-		asm volatile ("xi 0(%1),0x10" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 5:
-		asm volatile ("xi 0(%1),0x20" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 6:
-		asm volatile ("xi 0(%1),0x40" 
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	case 7:
-		asm volatile ("xi 0(%1),0x80"
-			      : "+m" (*(char *) addr) : "a" (addr) : "cc" );
-		break;
-	}
-}
-
-#define change_bit_simple(nr,addr) \
-(__builtin_constant_p((nr)) ? \
- __constant_change_bit((nr),(addr)) : \
- __change_bit((nr),(addr)) )
-
-/*
- * fast, non-SMP test_and_set_bit routine
- */
-static inline int
-test_and_set_bit_simple(unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-	unsigned char ch;
-
-	addr = (unsigned long) ptr + ((nr ^ 56) >> 3);
-	ch = *(unsigned char *) addr;
-        asm volatile("oc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
-	return (ch >> (nr & 7)) & 1;
-}
-#define __test_and_set_bit(X,Y)		test_and_set_bit_simple(X,Y)
-
-/*
- * fast, non-SMP test_and_clear_bit routine
- */
-static inline int
-test_and_clear_bit_simple(unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-	unsigned char ch;
-
-	addr = (unsigned long) ptr + ((nr ^ 56) >> 3);
-	ch = *(unsigned char *) addr;
-        asm volatile("nc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_ni_bitmap + (nr & 7))
-		     : "cc" );
-	return (ch >> (nr & 7)) & 1;
-}
-#define __test_and_clear_bit(X,Y)	test_and_clear_bit_simple(X,Y)
-
-/*
- * fast, non-SMP test_and_change_bit routine
- */
-static inline int
-test_and_change_bit_simple(unsigned long nr, volatile unsigned long *ptr)
-{
-	unsigned long addr;
-	unsigned char ch;
-
-	addr = (unsigned long) ptr + ((nr ^ 56) >> 3);
-	ch = *(unsigned char *) addr;
-        asm volatile("xc 0(1,%1),0(%2)"
-		     : "+m" (*(char *) addr)
-		     : "a" (addr), "a" (_oi_bitmap + (nr & 7))
-		     : "cc" );
-	return (ch >> (nr & 7)) & 1;
-}
-#define __test_and_change_bit(X,Y)	test_and_change_bit_simple(X,Y)
-
-#ifdef CONFIG_SMP
-#define set_bit             set_bit_cs
-#define clear_bit           clear_bit_cs
-#define change_bit          change_bit_cs
-#define test_and_set_bit    test_and_set_bit_cs
-#define test_and_clear_bit  test_and_clear_bit_cs
-#define test_and_change_bit test_and_change_bit_cs
-#else
-#define set_bit             set_bit_simple
-#define clear_bit           clear_bit_simple
-#define change_bit          change_bit_simple
-#define test_and_set_bit    test_and_set_bit_simple
-#define test_and_clear_bit  test_and_clear_bit_simple
-#define test_and_change_bit test_and_change_bit_simple
-#endif
-
-
-/*
- * This routine doesn't need to be atomic.
- */
-
-static inline int __test_bit(unsigned long nr, const volatile unsigned long *ptr)
-{
-	unsigned long addr;
-	unsigned char ch;
-
-	addr = (unsigned long) ptr + ((nr ^ 56) >> 3);
-	ch = *(unsigned char *) addr;
-	return (ch >> (nr & 7)) & 1;
-}
-
-static inline int 
-__constant_test_bit(unsigned long nr, const volatile unsigned long *addr) {
-    return (((volatile char *) addr)[(nr>>3)^7] & (1<<(nr&7))) != 0;
-}
-
-#define test_bit(nr,addr) \
-(__builtin_constant_p((nr)) ? \
- __constant_test_bit((nr),(addr)) : \
- __test_bit((nr),(addr)) )
-
-/*
- * Find-bit routines..
- */
-static inline unsigned long
-find_first_zero_bit(unsigned long * addr, unsigned long size)
-{
-        unsigned long res, cmp, count;
-
-        if (!size)
-                return 0;
-        __asm__("   lghi  %1,-1\n"
-                "   lgr   %2,%3\n"
-                "   slgr  %0,%0\n"
-                "   aghi  %2,63\n"
-                "   srlg  %2,%2,6\n"
-                "0: cg    %1,0(%0,%4)\n"
-                "   jne   1f\n"
-                "   aghi  %0,8\n"
-                "   brct  %2,0b\n"
-                "   lgr   %0,%3\n"
-                "   j     5f\n"
-                "1: lg    %2,0(%0,%4)\n"
-                "   sllg  %0,%0,3\n"
-                "   clr   %2,%1\n"
-		"   jne   2f\n"
-		"   aghi  %0,32\n"
-                "   srlg  %2,%2,32\n"
-		"2: lghi  %1,0xff\n"
-                "   tmll  %2,0xffff\n"
-                "   jno   3f\n"
-                "   aghi  %0,16\n"
-                "   srl   %2,16\n"
-                "3: tmll  %2,0x00ff\n"
-                "   jno   4f\n"
-                "   aghi  %0,8\n"
-                "   srl   %2,8\n"
-                "4: ngr   %2,%1\n"
-                "   ic    %2,0(%2,%5)\n"
-                "   algr  %0,%2\n"
-                "5:"
-                : "=&a" (res), "=&d" (cmp), "=&a" (count)
-		: "a" (size), "a" (addr), "a" (&_zb_findmap) : "cc" );
-        return (res < size) ? res : size;
-}
-
-static inline unsigned long
-find_first_bit(unsigned long * addr, unsigned long size)
-{
-        unsigned long res, cmp, count;
-
-        if (!size)
-                return 0;
-        __asm__("   slgr  %1,%1\n"
-                "   lgr   %2,%3\n"
-                "   slgr  %0,%0\n"
-                "   aghi  %2,63\n"
-                "   srlg  %2,%2,6\n"
-                "0: cg    %1,0(%0,%4)\n"
-                "   jne   1f\n"
-                "   aghi  %0,8\n"
-                "   brct  %2,0b\n"
-                "   lgr   %0,%3\n"
-                "   j     5f\n"
-                "1: lg    %2,0(%0,%4)\n"
-                "   sllg  %0,%0,3\n"
-                "   clr   %2,%1\n"
-		"   jne   2f\n"
-		"   aghi  %0,32\n"
-                "   srlg  %2,%2,32\n"
-		"2: lghi  %1,0xff\n"
-                "   tmll  %2,0xffff\n"
-                "   jnz   3f\n"
-                "   aghi  %0,16\n"
-                "   srl   %2,16\n"
-                "3: tmll  %2,0x00ff\n"
-                "   jnz   4f\n"
-                "   aghi  %0,8\n"
-                "   srl   %2,8\n"
-                "4: ngr   %2,%1\n"
-                "   ic    %2,0(%2,%5)\n"
-                "   algr  %0,%2\n"
-                "5:"
-                : "=&a" (res), "=&d" (cmp), "=&a" (count)
-		: "a" (size), "a" (addr), "a" (&_sb_findmap) : "cc" );
-        return (res < size) ? res : size;
-}
-
-static inline unsigned long
-find_next_zero_bit (unsigned long * addr, unsigned long size, unsigned long offset)
-{
-        unsigned long * p = ((unsigned long *) addr) + (offset >> 6);
-        unsigned long bitvec, reg;
-        unsigned long set, bit = offset & 63, res;
-
-        if (bit) {
-                /*
-                 * Look for zero in first word
-                 */
-                bitvec = (*p) >> bit;
-                __asm__("   lhi  %2,-1\n"
-                        "   slgr %0,%0\n"
-                        "   clr  %1,%2\n"
-                        "   jne  0f\n"
-                        "   aghi %0,32\n"
-                        "   srlg %1,%1,32\n"
-			"0: lghi %2,0xff\n"
-                        "   tmll %1,0xffff\n"
-                        "   jno  1f\n"
-                        "   aghi %0,16\n"
-                        "   srlg %1,%1,16\n"
-                        "1: tmll %1,0x00ff\n"
-                        "   jno  2f\n"
-                        "   aghi %0,8\n"
-                        "   srlg %1,%1,8\n"
-                        "2: ngr  %1,%2\n"
-                        "   ic   %1,0(%1,%3)\n"
-                        "   algr %0,%1"
-                        : "=&d" (set), "+a" (bitvec), "=&d" (reg)
-                        : "a" (&_zb_findmap) : "cc" );
-                if (set < (64 - bit))
-                        return set + offset;
-                offset += 64 - bit;
-                p++;
-        }
-        /*
-         * No zero yet, search remaining full words for a zero
-         */
-        res = find_first_zero_bit (p, size - 64 * (p - (unsigned long *) addr));
-        return (offset + res);
-}
-
-static inline unsigned long
-find_next_bit (unsigned long * addr, unsigned long size, unsigned long offset)
-{
-        unsigned long * p = ((unsigned long *) addr) + (offset >> 6);
-        unsigned long bitvec, reg;
-        unsigned long set, bit = offset & 63, res;
-
-        if (bit) {
-                /*
-                 * Look for zero in first word
-                 */
-                bitvec = (*p) >> bit;
-                __asm__("   slgr %0,%0\n"
-                        "   ltr  %1,%1\n"
-                        "   jnz  0f\n"
-                        "   aghi %0,32\n"
-                        "   srlg %1,%1,32\n"
-			"0: lghi %2,0xff\n"
-                        "   tmll %1,0xffff\n"
-                        "   jnz  1f\n"
-                        "   aghi %0,16\n"
-                        "   srlg %1,%1,16\n"
-                        "1: tmll %1,0x00ff\n"
-                        "   jnz  2f\n"
-                        "   aghi %0,8\n"
-                        "   srlg %1,%1,8\n"
-                        "2: ngr  %1,%2\n"
-                        "   ic   %1,0(%1,%3)\n"
-                        "   algr %0,%1"
-                        : "=&d" (set), "+a" (bitvec), "=&d" (reg)
-                        : "a" (&_sb_findmap) : "cc" );
-                if (set < (64 - bit))
-                        return set + offset;
-                offset += 64 - bit;
-                p++;
-        }
-        /*
-         * No set bit yet, search remaining full words for a bit
-         */
-        res = find_first_bit (p, size - 64 * (p - (unsigned long *) addr));
-        return (offset + res);
-}
-
-/*
- * ffz = Find First Zero in word. Undefined if no zero exists,
- * so code should check against ~0UL first..
- */
-static inline unsigned long ffz(unsigned long word)
-{
-	unsigned long reg, result;
-
-        __asm__("   lhi  %2,-1\n"
-                "   slgr %0,%0\n"
-                "   clr  %1,%2\n"
-                "   jne  0f\n"
-                "   aghi %0,32\n"
-                "   srlg %1,%1,32\n"
-                "0: lghi %2,0xff\n"
-                "   tmll %1,0xffff\n"
-                "   jno  1f\n"
-                "   aghi %0,16\n"
-                "   srlg %1,%1,16\n"
-                "1: tmll %1,0x00ff\n"
-                "   jno  2f\n"
-                "   aghi %0,8\n"
-                "   srlg %1,%1,8\n"
-                "2: ngr  %1,%2\n"
-                "   ic   %1,0(%1,%3)\n"
-                "   algr %0,%1"
-                : "=&d" (result), "+a" (word), "=&d" (reg)
-                : "a" (&_zb_findmap) : "cc" );
-        return result;
-}
-
-/*
- * __ffs = find first bit in word. Undefined if no bit exists,
- * so code should check against 0UL first..
- */
-static inline unsigned long __ffs (unsigned long word)
-{
-        unsigned long reg, result;
-
-        __asm__("   slgr %0,%0\n"
-                "   ltr  %1,%1\n"
-                "   jnz  0f\n"
-                "   aghi %0,32\n"
-                "   srlg %1,%1,32\n"
-                "0: lghi %2,0xff\n"
-                "   tmll %1,0xffff\n"
-                "   jnz  1f\n"
-                "   aghi %0,16\n"
-                "   srlg %1,%1,16\n"
-                "1: tmll %1,0x00ff\n"
-                "   jnz  2f\n"
-                "   aghi %0,8\n"
-                "   srlg %1,%1,8\n"
-                "2: ngr  %1,%2\n"
-                "   ic   %1,0(%1,%3)\n"
-                "   algr %0,%1"
-                : "=&d" (result), "+a" (word), "=&d" (reg)
-                : "a" (&_sb_findmap) : "cc" );
-        return result;
-}
-
-/*
- * Every architecture must define this function. It's the fastest
- * way of searching a 140-bit bitmap where the first 100 bits are
- * unlikely to be set. It's guaranteed that at least one of the 140
- * bits is cleared.
- */
-static inline int sched_find_first_bit(unsigned long *b)
-{
-	return find_first_bit(b, 140);
-}
-
-/*
- * ffs: find first bit set. This is defined the same way as
- * the libc and compiler builtin ffs routines, therefore
- * differs in spirit from the above ffz (man ffs).
- */
-extern inline int ffs (int x)
-{
-        int r = 1;
-
-        if (x == 0)
-		return 0;
-        __asm__("    tml  %1,0xffff\n"
-                "    jnz  0f\n"
-                "    srl  %1,16\n"
-                "    ahi  %0,16\n"
-                "0:  tml  %1,0x00ff\n"
-                "    jnz  1f\n"
-                "    srl  %1,8\n"
-                "    ahi  %0,8\n"
-                "1:  tml  %1,0x000f\n"
-                "    jnz  2f\n"
-                "    srl  %1,4\n"
-                "    ahi  %0,4\n"
-                "2:  tml  %1,0x0003\n"
-                "    jnz  3f\n"
-                "    srl  %1,2\n"
-                "    ahi  %0,2\n"
-                "3:  tml  %1,0x0001\n"
-                "    jnz  4f\n"
-                "    ahi  %0,1\n"
-                "4:"
-                : "=&d" (r), "+d" (x) : : "cc" );
-        return r;
-}
-
-/*
- * fls: find last bit set.
- */
-extern __inline__ int fls(int x)
-{
-	int r = 32;
-
-	if (x == 0)
-		return 0;
-	__asm__("    tmh  %1,0xffff\n"
-		"    jz   0f\n"
-		"    sll  %1,16\n"
-		"    ahi  %0,-16\n"
-		"0:  tmh  %1,0xff00\n"
-		"    jz   1f\n"
-		"    sll  %1,8\n"
-		"    ahi  %0,-8\n"
-		"1:  tmh  %1,0xf000\n"
-		"    jz   2f\n"
-		"    sll  %1,4\n"
-		"    ahi  %0,-4\n"
-		"2:  tmh  %1,0xc000\n"
-		"    jz   3f\n"
-		"    sll  %1,2\n"
-		"    ahi  %0,-2\n"
-		"3:  tmh  %1,0x8000\n"
-		"    jz   4f\n"
-		"    ahi  %0,-1\n"
-		"4:"
-		: "+d" (r), "+d" (x) : : "cc" );
-	return r;
-}
-
-/*
- * hweightN: returns the hamming weight (i.e. the number
- * of bits set) of a N-bit word
- */
-#define hweight64(x)						\
-({								\
-	unsigned long __x = (x);				\
-	unsigned int __w;					\
-	__w = generic_hweight32((unsigned int) __x);		\
-	__w += generic_hweight32((unsigned int) (__x>>32));	\
-	__w;							\
-})
-#define hweight32(x) generic_hweight32(x)
-#define hweight16(x) generic_hweight16(x)
-#define hweight8(x) generic_hweight8(x)
-
-
-#ifdef __KERNEL__
-
-/*
- * ATTENTION: intel byte ordering convention for ext2 and minix !!
- * bit 0 is the LSB of addr; bit 31 is the MSB of addr;
- * bit 32 is the LSB of (addr+4).
- * That combined with the little endian byte order of Intel gives the
- * following bit order in memory:
- *    07 06 05 04 03 02 01 00 15 14 13 12 11 10 09 08 \
- *    23 22 21 20 19 18 17 16 31 30 29 28 27 26 25 24
- */
-
-#define ext2_set_bit(nr, addr)       \
-	test_and_set_bit((nr)^56, (unsigned long *)addr)
-#define ext2_clear_bit(nr, addr)     \
-	test_and_clear_bit((nr)^56, (unsigned long *)addr)
-#define ext2_test_bit(nr, addr)      \
-	test_bit((nr)^56, (unsigned long *)addr)
-
-static inline unsigned long
-ext2_find_first_zero_bit(void *vaddr, unsigned long size)
-{
-        unsigned long res, cmp, count;
-
-        if (!size)
-                return 0;
-        __asm__("   lghi  %1,-1\n"
-                "   lgr   %2,%3\n"
-                "   aghi  %2,63\n"
-                "   srlg  %2,%2,6\n"
-                "   slgr  %0,%0\n"
-                "0: clg   %1,0(%0,%4)\n"
-                "   jne   1f\n"
-                "   aghi  %0,8\n"
-                "   brct  %2,0b\n"
-                "   lgr   %0,%3\n"
-                "   j     5f\n"
-                "1: cl    %1,0(%0,%4)\n"
-		"   jne   2f\n"
-		"   aghi  %0,4\n"
-		"2: l     %2,0(%0,%4)\n"
-                "   sllg  %0,%0,3\n"
-                "   aghi  %0,24\n"
-                "   lghi  %1,0xff\n"
-                "   tmlh  %2,0xffff\n"
-                "   jo    3f\n"
-                "   aghi  %0,-16\n"
-                "   srl   %2,16\n"
-                "3: tmll  %2,0xff00\n"
-                "   jo    4f\n"
-                "   aghi  %0,-8\n"
-                "   srl   %2,8\n"
-                "4: ngr   %2,%1\n"
-                "   ic    %2,0(%2,%5)\n"
-                "   algr  %0,%2\n"
-                "5:"
-                : "=&a" (res), "=&d" (cmp), "=&a" (count)
-		: "a" (size), "a" (vaddr), "a" (&_zb_findmap) : "cc" );
-        return (res < size) ? res : size;
-}
-
-static inline unsigned long
-ext2_find_next_zero_bit(void *vaddr, unsigned long size, unsigned long offset)
-{
-        unsigned long *addr = vaddr;
-        unsigned long *p = addr + (offset >> 6);
-        unsigned long word, reg;
-        unsigned long bit = offset & 63UL, res;
-
-        if (offset >= size)
-                return size;
-
-        if (bit) {
-                __asm__("   lrvg %0,%1" /* load reversed, neat instruction */
-                        : "=a" (word) : "m" (*p) );
-                word >>= bit;
-                res = bit;
-                /* Look for zero in first 8 byte word */
-                __asm__("   lghi %2,0xff\n"
-			"   tmll %1,0xffff\n"
-			"   jno  2f\n"
-			"   ahi  %0,16\n"
-			"   srlg %1,%1,16\n"
-                	"0: tmll %1,0xffff\n"
-                        "   jno  2f\n"
-                        "   ahi  %0,16\n"
-                        "   srlg %1,%1,16\n"
-                        "1: tmll %1,0xffff\n"
-                        "   jno  2f\n"
-                        "   ahi  %0,16\n"
-                        "   srl  %1,16\n"
-                        "2: tmll %1,0x00ff\n"
-                	"   jno  3f\n"
-                	"   ahi  %0,8\n"
-                	"   srl  %1,8\n"
-                	"3: ngr  %1,%2\n"
-                	"   ic   %1,0(%1,%3)\n"
-                	"   alr  %0,%1"
-                	: "+&d" (res), "+a" (word), "=&d" (reg)
-                  	: "a" (&_zb_findmap) : "cc" );
-                if (res < 64)
-			return (p - addr)*64 + res;
-                p++;
-        }
-        /* No zero yet, search remaining full bytes for a zero */
-        res = ext2_find_first_zero_bit (p, size - 64 * (p - addr));
-        return (p - addr) * 64 + res;
-}
-
-/* Bitmap functions for the minix filesystem.  */
-/* FIXME !!! */
-#define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
-#define minix_set_bit(nr,addr) set_bit(nr,addr)
-#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)
-
-#endif /* __KERNEL__ */
-
-#endif /* _S390_BITOPS_H */
diff -Nru a/include/asm-s390x/bug.h b/include/asm-s390x/bug.h
--- a/include/asm-s390x/bug.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,13 +0,0 @@
-#ifndef _S390_BUG_H
-#define _S390_BUG_H
-
-#define BUG() do { \
-        printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); \
-        __asm__ __volatile__(".long 0"); \
-} while (0)                                       
-
-#define PAGE_BUG(page) do { \
-        BUG(); \
-} while (0)                      
-
-#endif
diff -Nru a/include/asm-s390x/bugs.h b/include/asm-s390x/bugs.h
--- a/include/asm-s390x/bugs.h	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,22 +0,0 @@
-/*
- *  include/asm-s390/bugs.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/bugs.h"
- *    Copyright (C) 1994  Linus Torvalds
- */
-
-/*
- * This is included by init/main.c to check for architecture-dependent bugs.
- *
- * Needs:
- *      void check_bugs(void);
- */
-
-static void __init check_bugs(void)
-{
-  /* s390 has no bugs ... */
-}
diff -Nru a/include/asm-s390x/byteorder.h b/include/asm-s390x/byteorder.h
--- a/include/asm-s390x/byteorder.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,102 +0,0 @@
-#ifndef _S390_BYTEORDER_H
-#define _S390_BYTEORDER_H
-
-/*
- *  include/asm-s390/byteorder.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- */
-
-#include <asm/types.h>
-
-#ifdef __GNUC__
-
-static __inline__ __const__ __u64 ___arch__swab64p(__u64 *x)
-{
-	__u64 result;
-
-	__asm__ __volatile__ (
-		"   lrvg %0,%1"
-		: "=d" (result) : "m" (*x) );
-	return result;
-}
-
-static __inline__ __const__ __u64 ___arch__swab64(__u64 x)
-{
-	__u64 result;
-
-	__asm__ __volatile__ (
-		"   lrvgr %0,%1"
-		: "=d" (result) : "d" (x) );
-	return result;
-}
-
-static __inline__ void ___arch__swab64s(__u64 *x)
-{
-	*x = ___arch__swab64p(x);
-}
-
-static __inline__ __const__ __u32 ___arch__swab32p(__u32 *x)
-{
-	__u32 result;
-	
-	__asm__ __volatile__ (
-		"   lrv  %0,%1"
-		: "=d" (result) : "m" (*x) );
-	return result;
-}
-
-static __inline__ __const__ __u32 ___arch__swab32(__u32 x)
-{
-	__u32 result;
-	
-	__asm__ __volatile__ (
-		"   lrvr  %0,%1"
-		: "=d" (result) : "d" (x) );
-	return result;
-}
-
-static __inline__ void ___arch__swab32s(__u32 *x)
-{
-	*x = ___arch__swab32p(x);
-}
-
-static __inline__ __const__ __u16 ___arch__swab16p(__u16 *x)
-{
-	__u16 result;
-	
-	__asm__ __volatile__ (
-		"   lrvh %0,%1"
-		: "=d" (result) : "m" (*x) );
-	return result;
-}
-
-static __inline__ __const__ __u16 ___arch__swab16(__u16 x)
-{
-	return ___arch__swab16p(&x);
-}
-
-static __inline__ void ___arch__swab16s(__u16 *x)
-{
-	*x = ___arch__swab16p(x);
-}
-
-#define __arch__swab64(x) ___arch__swab64(x)
-#define __arch__swab32(x) ___arch__swab32(x)
-#define __arch__swab16(x) ___arch__swab16(x)
-#define __arch__swab64p(x) ___arch__swab64p(x)
-#define __arch__swab32p(x) ___arch__swab32p(x)
-#define __arch__swab16p(x) ___arch__swab16p(x)
-#define __arch__swab64s(x) ___arch__swab64s(x)
-#define __arch__swab32s(x) ___arch__swab32s(x)
-#define __arch__swab16s(x) ___arch__swab16s(x)
-
-#define __BYTEORDER_HAS_U64__
-
-#endif /* __GNUC__ */
-
-#include <linux/byteorder/big_endian.h>
-
-#endif /* _S390_BYTEORDER_H */
diff -Nru a/include/asm-s390x/cache.h b/include/asm-s390x/cache.h
--- a/include/asm-s390x/cache.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,18 +0,0 @@
-/*
- *  include/asm-s390/cache.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *
- *  Derived from "include/asm-i386/cache.h"
- *    Copyright (C) 1992, Linus Torvalds
- */
-
-#ifndef __ARCH_S390_CACHE_H
-#define __ARCH_S390_CACHE_H
-
-#define L1_CACHE_BYTES     256
-#define L1_CACHE_SHIFT     8
-#define L1_CACHE_SHIFT_MAX 8	/* largest L1 which this arch supports */
-
-#endif
diff -Nru a/include/asm-s390x/cacheflush.h b/include/asm-s390x/cacheflush.h
--- a/include/asm-s390x/cacheflush.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,18 +0,0 @@
-#ifndef _S390X_CACHEFLUSH_H
-#define _S390X_CACHEFLUSH_H
-
-/* Keep includes the same across arches.  */
-#include <linux/mm.h>
-
-/* Caches aren't brain-dead on the s390. */
-#define flush_cache_all()			do { } while (0)
-#define flush_cache_mm(mm)			do { } while (0)
-#define flush_cache_range(vma, start, end)	do { } while (0)
-#define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
-#define flush_dcache_page(page)			do { } while (0)
-#define flush_icache_range(start, end)		do { } while (0)
-#define flush_icache_page(vma,pg)		do { } while (0)
-#define flush_icache_user_range(vma,pg,adr,len)	do { } while (0)
-
-#endif /* _S390X_CACHEFLUSH_H */
diff -Nru a/include/asm-s390x/ccwdev.h b/include/asm-s390x/ccwdev.h
--- a/include/asm-s390x/ccwdev.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,185 +0,0 @@
-/*
- *  include/asm-s390/ccwdev.h
- *  include/asm-s390x/ccwdev.h
- *
- *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Arnd Bergmann <arndb@de.ibm.com>
- *
- *  Interface for CCW device drivers
- */
-#ifndef _S390_CCWDEV_H_
-#define _S390_CCWDEV_H_
-
-#include <linux/device.h>
-
-/* structs from asm/cio.h */
-struct irb;
-struct ccw1;
-
-/* the id is used to identify what hardware a device driver supports. It 
- * is used both by the ccw subsystem driver for probing and from
- * user space for automatic module loading.
- *
- * References:
- *   - struct usb_device_id (include/linux/usb.h)
- *   - devreg_hc_t (include/linux/s390dyn.h)
- *   - chandev_model_info (drivers/s390/misc/chandev.c)
- */
-struct ccw_device_id {
-	__u16	match_flags;	/* which fields to match against */
-
-	__u16	cu_type;	/* control unit type     */
-	__u16	dev_type;	/* device type           */
-	__u8	cu_model;	/* control unit model    */
-	__u8	dev_model;	/* device model          */
-
-	unsigned long driver_info;
-};
-
-enum match_flag {
-	CCW_DEVICE_ID_MATCH_CU_TYPE      = 0x01,
-	CCW_DEVICE_ID_MATCH_CU_MODEL     = 0x02,
-	CCW_DEVICE_ID_MATCH_DEVICE_TYPE  = 0x04,
-	CCW_DEVICE_ID_MATCH_DEVICE_MODEL = 0x08,
-	/* CCW_DEVICE_ID_MATCH_ANY	     = 0x10, */
-};
-
-/* simplified initializers for struct ccw_device:
- * CCW_DEVICE and CCW_DEVICE_DEVTYPE initialize one
- * entry in your MODULE_DEVICE_TABLE and set the match_flag correctly */
-#define CCW_DEVICE(cu, cum) 						\
-	.cu_type=(cu), .cu_model=(cum),					\
-	.match_flags=(CCW_DEVICE_ID_MATCH_CU_TYPE			\
-		   | (cum ? CCW_DEVICE_ID_MATCH_CU_MODEL : 0))
-
-#define CCW_DEVICE_DEVTYPE(cu, cum, dev, devm)				\
-	.cu_type=(cu), .cu_model=(cum), .dev_type=(dev), .dev_model=(devm),\
-	.match_flags=CCW_DEVICE_ID_MATCH_CU_TYPE			\
-		   | ((cum) ? CCW_DEVICE_ID_MATCH_CU_MODEL : 0) 	\
-		   | CCW_DEVICE_ID_MATCH_DEVICE_TYPE			\
-		   | ((devm) ? CCW_DEVICE_ID_MATCH_DEVICE_MODEL : 0)
-
-/* scan through an array of device ids and return the first
- * entry that matches the device.
- *
- * the array must end with an entry containing zero match_flags
- */
-static inline const struct ccw_device_id *
-ccw_device_id_match(const struct ccw_device_id *array,
-			const struct ccw_device_id *match)
-{
-	const struct ccw_device_id *id = array;
-
-	for (id = array; id->match_flags; id++) {
-		if ((id->match_flags & CCW_DEVICE_ID_MATCH_CU_TYPE)
-		    && (id->cu_type != match->cu_type))
-			continue;
-
-		if ((id->match_flags & CCW_DEVICE_ID_MATCH_CU_MODEL)
-		    && (id->cu_model != match->cu_model))
-			continue;
-
-		if ((id->match_flags & CCW_DEVICE_ID_MATCH_DEVICE_TYPE)
-		    && (id->dev_type != match->dev_type))
-			continue;
-
-		if ((id->match_flags & CCW_DEVICE_ID_MATCH_DEVICE_MODEL)
-		    && (id->dev_model != match->dev_model))
-			continue;
-
-		return id;
-	}
-
-	return 0;
-}
-
-/* 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 */
-struct ccw_device {
-	spinlock_t *ccwlock;
-	struct ccw_device_private *private;	/* cio private information */
-	struct ccw_device_id id;	/* id of this device, driver_info is
-					   set by ccw_find_driver */
-	struct ccw_driver *drv;		/* */
-	struct device dev;		/* */
-	int online;
-	/* This is sick, but a driver can have different interrupt handlers 
-	   for different ccw_devices (multi-subchannel drivers)... */
-	void (*handler) (struct ccw_device *, unsigned long, struct irb *);
-};
-
-
-/* Each ccw driver registers with the ccw root bus */
-struct ccw_driver {
-	struct module *owner;		/* for automatic MOD_INC_USE_COUNT   */
-	struct ccw_device_id *ids;	/* probe driver with these devs      */
-	int (*probe) (struct ccw_device *); /* ask driver to probe dev 	     */
-	int (*remove) (struct ccw_device *);
-					/* device is no longer available     */
-	int (*set_online) (struct ccw_device *);
-	int (*set_offline) (struct ccw_device *);
-	struct device_driver driver;	/* higher level structure, don't init
-					   this from your driver	     */
-	char *name;
-};
-
-extern struct ccw_device *get_ccwdev_by_busid(struct ccw_driver *cdrv,
-					      const char *bus_id);
-
-/* devices drivers call these during module load and unload.
- * When a driver is registered, its probe method is called
- * when new devices for its type pop up */
-extern int  ccw_driver_register   (struct ccw_driver *driver);
-extern void ccw_driver_unregister (struct ccw_driver *driver);
-
-struct ccw1;
-
-extern int ccw_device_set_options(struct ccw_device *, unsigned long);
-
-/* Allow for i/o completion notification after primary interrupt status. */
-#define CCWDEV_EARLY_NOTIFICATION	0x0001
-/* Report all interrupt conditions. */
-#define CCWDEV_REPORT_ALL	 	0x0002
-
-/*
- * ccw_device_start()
- *
- *  Start a S/390 channel program. When the interrupt arrives, the
- *  IRQ handler is called, either immediately, delayed (dev-end missing,
- *  or sense required) or never (no IRQ handler registered).
- *  Depending on the action taken, ccw_device_start() returns:  
- *                           0	     - Success
- *			     -EBUSY  - Device busy, or status pending
- *			     -ENODEV - Device not operational
- *                           -EINVAL - Device invalid for operation
- */
-extern int ccw_device_start(struct ccw_device *, struct ccw1 *,
-			    unsigned long, __u8, unsigned long);
-extern int ccw_device_resume(struct ccw_device *);
-extern int ccw_device_halt(struct ccw_device *, unsigned long);
-extern int ccw_device_clear(struct ccw_device *, unsigned long);
-
-extern int read_dev_chars(struct ccw_device *cdev, void **buffer, int length);
-extern int read_conf_data(struct ccw_device *cdev, void **buffer, int *length);
-
-extern void ccw_device_set_online(struct ccw_device *cdev);
-extern void ccw_device_set_offline(struct ccw_device *cdev);
-
-
-extern struct ciw *ccw_device_get_ciw(struct ccw_device *, __u32 cmd);
-extern __u8 ccw_device_get_path_mask(struct ccw_device *);
-
-#define get_ccwdev_lock(x) (x)->ccwlock
-
-#define to_ccwdev(n) container_of(n, struct ccw_device, dev)
-#define to_ccwdrv(n) container_of(n, struct ccw_driver, driver)
-
-extern struct ccw_device *ccw_device_probe_console(void);
-
-// FIXME: these have to go
-extern int _ccw_device_get_device_number(struct ccw_device *);
-extern int _ccw_device_get_subchannel_number(struct ccw_device *);
-
-#endif /* _S390_CCWDEV_H_ */
diff -Nru a/include/asm-s390x/ccwgroup.h b/include/asm-s390x/ccwgroup.h
--- a/include/asm-s390x/ccwgroup.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,44 +0,0 @@
-#ifndef S390_CCWGROUP_H
-#define S390_CCWGROUP_H
-
-struct ccw_device;
-struct ccw_driver;
-
-struct ccwgroup_device {
-	unsigned long creator_id;	/* unique number of the driver */
-	enum {
-		CCWGROUP_OFFLINE,
-		CCWGROUP_ONLINE,
-	} state;
-	unsigned int count;		/* number of attached slave devices */
-	struct device	dev;		/* master device		    */
-	struct ccw_device *cdev[0];	/* variable number, allocate as needed */
-};
-
-struct ccwgroup_driver {
-	char *name;
-	int max_slaves;
-	unsigned long driver_id;
-
-	int (*probe) (struct ccwgroup_device *);
-	int (*remove) (struct ccwgroup_device *);
-	int (*release) (struct ccwgroup_driver *);
-	int (*set_online) (struct ccwgroup_device *);
-	int (*set_offline) (struct ccwgroup_device *);
-
-	struct device_driver driver;		/* this driver */
-};
-
-extern int  ccwgroup_driver_register   (struct ccwgroup_driver *cdriver);
-extern void ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver);
-extern int ccwgroup_create (struct device *root,
-			    unsigned int creator_id,
-			    struct ccw_driver *gdrv,
-			    int argc, char *argv[]);
-
-extern int ccwgroup_probe_ccwdev(struct ccw_device *cdev);
-extern int ccwgroup_remove_ccwdev(struct ccw_device *cdev);
-
-#define to_ccwgroupdev(x) container_of((x), struct ccwgroup_device, dev)
-#define to_ccwgroupdrv(x) container_of((x), struct ccwgroup_driver, driver)
-#endif
diff -Nru a/include/asm-s390x/checksum.h b/include/asm-s390x/checksum.h
--- a/include/asm-s390x/checksum.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,195 +0,0 @@
-#ifndef _S390_CHECKSUM_H
-#define _S390_CHECKSUM_H
-
-/*
- *  include/asm-s390/checksum.h
- *    S390 fast network checksum routines
- *    see also arch/S390/lib/checksum.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Ulrich Hild        (first version)
- *               Martin Schwidefsky (heavily optimized CKSM version)
- *               D.J. Barrow        (third attempt) 
- */
-
-#include <asm/uaccess.h>
-
-/*
- * computes the checksum of a memory block at buff, length len,
- * and adds in "sum" (32-bit)
- *
- * returns a 32-bit number suitable for feeding into itself
- * or csum_tcpudp_magic
- *
- * this function must be called with even lengths, except
- * for the last fragment, which may be odd
- *
- * it's best to have buff aligned on a 32-bit boundary
- */
-static inline unsigned int
-csum_partial(const unsigned char * buff, int len, unsigned int sum)
-{
-	/*
-	 * Experiments with ethernet and slip connections show that buff
-	 * is aligned on either a 2-byte or 4-byte boundary.
-	 */
-        __asm__ __volatile__ (
-                "    lgr  2,%1\n"    /* address in gpr 2 */
-                "    lgfr 3,%2\n"    /* length in gpr 3 */
-                "0:  cksm %0,2\n"    /* do checksum on longs */
-                "    jo   0b\n"
-                : "+&d" (sum)
-                : "d" (buff), "d" (len)
-                : "cc", "2", "3" );
-        return sum;
-	
-}
-
-/*
- * csum_partial as an inline function
- */
-static inline unsigned int 
-csum_partial_inline(const unsigned char * buff, int len, unsigned int sum)
-{
-	__asm__ __volatile__ (
-		"    lgr  2,%1\n"    /* address in gpr 2 */
-		"    lgfr 3,%2\n"    /* length in gpr 3 */
-		"0:  cksm %0,2\n"    /* do checksum on longs */
-		"    jo   0b\n"
-                : "+&d" (sum)
-		: "d" (buff), "d" (len)
-                : "cc", "2", "3" );
-	return sum;
-}
-
-/*
- * the same as csum_partial_copy, but copies from user space.
- *
- * here even more important to align src and dst on a 32-bit (or even
- * better 64-bit) boundary
- *
- * Copy from userspace and compute checksum.  If we catch an exception
- * then zero the rest of the buffer.
- */
-static inline unsigned int 
-csum_partial_copy_from_user (const char *src, char *dst,
-                                          int len, unsigned int sum,
-                                          int *err_ptr)
-{
-	int missing;
-
-	missing = copy_from_user(dst, src, len);
-	if (missing) {
-		memset(dst + len - missing, 0, missing);
-		*err_ptr = -EFAULT;
-	}
-		
-	return csum_partial(dst, len, sum);
-}
-
-static inline unsigned int
-csum_partial_copy_nocheck (const char *src, char *dst, int len, unsigned int sum)
-{
-        memcpy(dst,src,len);
-        return csum_partial_inline(dst, len, sum);
-}
-
-/*
- *      Fold a partial checksum without adding pseudo headers
- */
-static inline unsigned short
-csum_fold(unsigned int sum)
-{
-	__asm__ __volatile__ (
-		"    sr   3,3\n"   /* %0 = H*65536 + L */
-		"    lr   2,%0\n"  /* %0 = H L, R2/R3 = H L / 0 0 */
-		"    srdl 2,16\n"  /* %0 = H L, R2/R3 = 0 H / L 0 */
-		"    alr  2,3\n"   /* %0 = H L, R2/R3 = L H / L 0 */
-		"    alr  %0,2\n"  /* %0 = H+L+C L+H */
-                "    srl  %0,16\n" /* %0 = H+L+C */
-		: "+&d" (sum) : : "cc", "2", "3");
-	return ((unsigned short) ~sum);
-}
-
-/*
- *	This is a version of ip_compute_csum() optimized for IP headers,
- *	which always checksum on 4 octet boundaries.
- *
- */
-static inline unsigned short
-ip_fast_csum(unsigned char *iph, unsigned int ihl)
-{
-	unsigned long sum;
-
-        __asm__ __volatile__ (
-		"    slgr %0,%0\n"   /* set sum to zero */
-                "    lgr  2,%1\n"    /* address in gpr 2 */
-                "    lgfr 3,%2\n"    /* length in gpr 3 */
-                "0:  cksm %0,2\n"    /* do checksum on ints */
-                "    jo   0b\n"
-                : "=&d" (sum)
-                : "d" (iph), "d" (ihl*4)
-                : "cc", "2", "3" );
-        return csum_fold(sum);
-}
-
-/*
- * computes the checksum of the TCP/UDP pseudo-header
- * returns a 32-bit checksum
- */
-static inline unsigned int 
-csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr,
-                   unsigned short len, unsigned short proto,
-                   unsigned int sum)
-{
-	__asm__ __volatile__ (
-                "    lgfr  %0,%0\n"
-                "    algr  %0,%1\n"  /* sum += saddr */
-                "    brc   12,0f\n"
-		"    aghi  %0,1\n"   /* add carry */
-		"0:  algr  %0,%2\n"  /* sum += daddr */
-                "    brc   12,1f\n"
-                "    aghi  %0,1\n"   /* add carry */
-		"1:  algfr %0,%3\n"  /* sum += (len<<16) + proto */
-		"    brc   12,2f\n"
-		"    aghi  %0,1\n"   /* add carry */
-		"2:  srlg  0,%0,32\n"
-                "    alr   %0,0\n"   /* fold to 32 bits */
-                "    brc   12,3f\n"
-                "    ahi   %0,1\n"   /* add carry */
-                "3:  llgfr %0,%0"
-		: "+&d" (sum)
-		: "d" (saddr), "d" (daddr),
-		  "d" (((unsigned int) len<<16) + (unsigned int) proto)
-		: "cc", "0" );
-	return sum;
-}
-
-/*
- * computes the checksum of the TCP/UDP pseudo-header
- * returns a 16-bit checksum, already complemented
- */
-
-static inline unsigned short int
-csum_tcpudp_magic(unsigned long saddr, unsigned long daddr,
-                  unsigned short len, unsigned short proto,
-                  unsigned int sum)
-{
-	return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum));
-}
-
-/*
- * this routine is used for miscellaneous IP-like checksums, mainly
- * in icmp.c
- */
-
-static inline unsigned short
-ip_compute_csum(unsigned char * buff, int len)
-{
-	return csum_fold(csum_partial_inline(buff, len, 0));
-}
-
-#endif /* _S390_CHECKSUM_H */
-
-
diff -Nru a/include/asm-s390x/cio.h b/include/asm-s390x/cio.h
--- a/include/asm-s390x/cio.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,269 +0,0 @@
-/*
- *  include/asm-s390/cio.h
- *  include/asm-s390x/cio.h
- *
- * Common interface for I/O on S/390
- */
-#ifndef _ASM_S390_CIO_H_
-#define _ASM_S390_CIO_H_
-
-#include <linux/spinlock.h>
-#include <asm/types.h>
-
-#ifdef __KERNEL__
-
-#define LPM_ANYPATH 0xff
-
-/*
- * subchannel status word
- */
-struct scsw {
-	__u32 key  : 4;		/* subchannel key */
-	__u32 sctl : 1; 	/* suspend control */
-	__u32 eswf : 1; 	/* ESW format */
-	__u32 cc   : 2; 	/* deferred condition code */
-	__u32 fmt  : 1; 	/* format */
-	__u32 pfch : 1; 	/* prefetch */
-	__u32 isic : 1; 	/* initial-status interruption control */
-	__u32 alcc : 1; 	/* address-limit checking control */
-	__u32 ssi  : 1; 	/* supress-suspended interruption */
-	__u32 zcc  : 1; 	/* zero condition code */
-	__u32 ectl : 1; 	/* extended control */
-	__u32 pno  : 1;	    	/* path not operational */
-	__u32 res  : 1;	    	/* reserved */
-	__u32 fctl : 3;	    	/* function control */
-	__u32 actl : 7;	    	/* activity control */
-	__u32 stctl : 5;    	/* status control */
-	__u32 cpa;	    	/* channel program address */
-	__u32 dstat : 8;    	/* device status */
-	__u32 cstat : 8;    	/* subchannel status */
-	__u32 count : 16;   	/* residual count */
-} __attribute__ ((packed));
-
-#define SCSW_FCTL_CLEAR_FUNC	 0x1
-#define SCSW_FCTL_HALT_FUNC	 0x2
-#define SCSW_FCTL_START_FUNC	 0x4
-
-#define SCSW_ACTL_SUSPENDED	 0x1
-#define SCSW_ACTL_DEVACT	 0x2
-#define SCSW_ACTL_SCHACT	 0x4
-#define SCSW_ACTL_CLEAR_PEND	 0x8
-#define SCSW_ACTL_HALT_PEND	 0x10
-#define SCSW_ACTL_START_PEND	 0x20
-#define SCSW_ACTL_RESUME_PEND	 0x40
-
-#define SCSW_STCTL_STATUS_PEND	 0x1
-#define SCSW_STCTL_SEC_STATUS	 0x2
-#define SCSW_STCTL_PRIM_STATUS	 0x4
-#define SCSW_STCTL_INTER_STATUS	 0x8
-#define SCSW_STCTL_ALERT_STATUS	 0x10
-
-#define DEV_STAT_ATTENTION	 0x80
-#define DEV_STAT_STAT_MOD	 0x40
-#define DEV_STAT_CU_END		 0x20
-#define DEV_STAT_BUSY		 0x10
-#define DEV_STAT_CHN_END	 0x08
-#define DEV_STAT_DEV_END	 0x04
-#define DEV_STAT_UNIT_CHECK	 0x02
-#define DEV_STAT_UNIT_EXCEP	 0x01
-
-#define SCHN_STAT_PCI		 0x80
-#define SCHN_STAT_INCORR_LEN	 0x40
-#define SCHN_STAT_PROG_CHECK	 0x20
-#define SCHN_STAT_PROT_CHECK	 0x10
-#define SCHN_STAT_CHN_DATA_CHK	 0x08
-#define SCHN_STAT_CHN_CTRL_CHK	 0x04
-#define SCHN_STAT_INTF_CTRL_CHK	 0x02
-#define SCHN_STAT_CHAIN_CHECK	 0x01
-
-/*
- * architectured values for first sense byte
- */
-#define SNS0_CMD_REJECT		0x80
-#define SNS_CMD_REJECT		SNS0_CMD_REJEC
-#define SNS0_INTERVENTION_REQ	0x40
-#define SNS0_BUS_OUT_CHECK	0x20
-#define SNS0_EQUIPMENT_CHECK	0x10
-#define SNS0_DATA_CHECK		0x08
-#define SNS0_OVERRUN		0x04
-#define SNS0_INCOMPL_DOMAIN	0x01
-
-/*
- * architectured values for second sense byte
- */
-#define SNS1_PERM_ERR		0x80
-#define SNS1_INV_TRACK_FORMAT	0x40
-#define SNS1_EOC		0x20
-#define SNS1_MESSAGE_TO_OPER	0x10
-#define SNS1_NO_REC_FOUND	0x08
-#define SNS1_FILE_PROTECTED	0x04
-#define SNS1_WRITE_INHIBITED	0x02
-#define SNS1_INPRECISE_END	0x01
-
-/*
- * architectured values for third sense byte
- */
-#define SNS2_REQ_INH_WRITE	0x80
-#define SNS2_CORRECTABLE	0x40
-#define SNS2_FIRST_LOG_ERR	0x20
-#define SNS2_ENV_DATA_PRESENT	0x10
-#define SNS2_INPRECISE_END	0x04
-
-struct ccw1 {
-	__u8  cmd_code;		/* command code */
-	__u8  flags;   		/* flags, like IDA addressing, etc. */
-	__u16 count;   		/* byte count */
-	__u32 cda;     		/* data address */
-} __attribute__ ((packed,aligned(8)));
-
-#define CCW_FLAG_DC		0x80
-#define CCW_FLAG_CC		0x40
-#define CCW_FLAG_SLI		0x20
-#define CCW_FLAG_SKIP		0x10
-#define CCW_FLAG_PCI		0x08
-#define CCW_FLAG_IDA		0x04
-#define CCW_FLAG_SUSPEND	0x02
-
-#define CCW_CMD_READ_IPL	0x02
-#define CCW_CMD_NOOP		0x03
-#define CCW_CMD_BASIC_SENSE	0x04
-#define CCW_CMD_TIC		0x08
-#define CCW_CMD_SENSE_PGID	0x34
-#define CCW_CMD_SUSPEND_RECONN	0x5B
-#define CCW_CMD_RDC		0x64
-#define CCW_CMD_SET_PGID	0xAF
-#define CCW_CMD_SENSE_ID	0xE4
-#define CCW_CMD_DCTL		0xF3
-
-#define SENSE_MAX_COUNT		0x20
-
-struct erw {
-	__u32 res0  : 3;  	/* reserved */
-	__u32 auth  : 1;	/* Authorization check */
-	__u32 pvrf  : 1;  	/* path-verification-required flag */
-	__u32 cpt   : 1;  	/* channel-path timeout */
-	__u32 fsavf : 1;  	/* Failing storage address validity flag */
-	__u32 cons  : 1;  	/* concurrent-sense */
-	__u32 scavf : 1;	/* Secondary ccw address validity flag */
-	__u32 fsaf  : 1;	/* Failing storage address format */
-	__u32 scnt  : 6;  	/* sense count if cons == 1 */
-	__u32 res16 : 16; 	/* reserved */
-} __attribute__ ((packed));
-
-/*
- * subchannel logout area
- */
-struct sublog {
-	__u32 res0  : 1;  	/* reserved */
-	__u32 esf   : 7;  	/* extended status flags */
-	__u32 lpum  : 8;  	/* last path used mask */
-	__u32 arep  : 1;  	/* ancillary report */
-	__u32 fvf   : 5;  	/* field-validity flags */
-	__u32 sacc  : 2;  	/* storage access code */
-	__u32 termc : 2;  	/* termination code */
-	__u32 devsc : 1;  	/* device-status check */
-	__u32 serr  : 1;  	/* secondary error */
-	__u32 ioerr : 1;  	/* i/o-error alert */
-	__u32 seqc  : 3;  	/* sequence code */
-} __attribute__ ((packed));
-
-/*
- * Format 0 Extended Status Word (ESW)
- */
-struct esw0 {
-	struct sublog sublog;	/* subchannel logout */
-	struct erw erw;	    	/* extended report word */
-	__u32  faddr[2];    	/* failing storage address */
-	__u32  saddr;  		/* secondary ccw address */
-} __attribute__ ((packed));
-
-/*
- * Format 1 Extended Status Word (ESW)
- */
-struct esw1 {
-	__u8  zero0;		/* reserved zeros */
-	__u8  lpum;		/* last path used mask */
-	__u16 zero16;		/* reserved zeros */
-	struct erw erw;		/* extended report word */
-	__u32 zeros[3]; 	/* 2 fullwords of zeros */
-} __attribute__ ((packed));
-
-/*
- * Format 2 Extended Status Word (ESW)
- */
-struct esw2 {
-	__u8  zero0;		/* reserved zeros */
-	__u8  lpum;		/* last path used mask */
-	__u16 dcti;		/* device-connect-time interval */
-	struct erw erw;		/* extended report word */
-	__u32 zeros[3]; 	/* 2 fullwords of zeros */
-} __attribute__ ((packed));
-
-/*
- * Format 3 Extended Status Word (ESW)
- */
-struct esw3 {
-	__u8  zero0;		/* reserved zeros */
-	__u8  lpum;		/* last path used mask */
-	__u16 res;		/* reserved */
-	struct erw erw;		/* extended report word */
-	__u32 zeros[3]; 	/* 2 fullwords of zeros */
-} __attribute__ ((packed));
-
-/*
- * interruption response block
- */
-struct irb {
-	struct scsw scsw;	/* subchannel status word */
-	union {			/* extended status word, 4 formats */
-		struct esw0 esw0;
-		struct esw1 esw1;
-		struct esw2 esw2;
-		struct esw3 esw3;
-	} esw;
-	__u8   ecw[32];		/* extended control word */
-} __attribute__ ((packed,aligned(4)));
-
-/*
- * command information word  (CIW) layout
- */
-struct ciw {
-	__u32 et       :  2; 	/* entry type */
-	__u32 reserved :  2; 	/* reserved */
-	__u32 ct       :  4; 	/* command type */
-	__u32 cmd      :  8; 	/* command */
-	__u32 count    : 16; 	/* coun */
-} __attribute__ ((packed));
-
-#define CIW_TYPE_RCD	0x0    	/* read configuration data */
-#define CIW_TYPE_SII	0x1    	/* set interface identifier */
-#define CIW_TYPE_RNI	0x2    	/* read node identifier */
-
-/*
- * Flags used as input parameters for do_IO()
- */
-#define DOIO_ALLOW_SUSPEND	 0x0001 /* allow for channel prog. suspend */
-#define DOIO_DENY_PREFETCH	 0x0002 /* don't allow for CCW prefetch */
-#define DOIO_SUPPRESS_INTER	 0x0004 /* suppress intermediate inter. */
-					/* ... for suspended CCWs */
-
-struct diag210 {
-	__u16 vrdcdvno : 16;   /* device number (input) */
-	__u16 vrdclen  : 16;   /* data block length (input) */
-	__u32 vrdcvcla : 8;    /* virtual device class (output) */
-	__u32 vrdcvtyp : 8;    /* virtual device type (output) */
-	__u32 vrdcvsta : 8;    /* virtual device status (output) */
-	__u32 vrdcvfla : 8;    /* virtual device flags (output) */
-	__u32 vrdcrccl : 8;    /* real device class (output) */
-	__u32 vrdccrty : 8;    /* real device type (output) */
-	__u32 vrdccrmd : 8;    /* real device model (output) */
-	__u32 vrdccrft : 8;    /* real device feature (output) */
-} __attribute__ ((packed,aligned(4)));
-
-extern int diag210(struct diag210 *addr);
-
-extern void wait_cons_dev(void);
-
-#endif
-
-#endif
diff -Nru a/include/asm-s390x/compat.h b/include/asm-s390x/compat.h
--- a/include/asm-s390x/compat.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,122 +0,0 @@
-#ifndef _ASM_S390X_COMPAT_H
-#define _ASM_S390X_COMPAT_H
-/*
- * Architecture specific compatibility types
- */
-#include <linux/types.h>
-
-#define COMPAT_USER_HZ	100
-
-typedef u32		compat_size_t;
-typedef s32		compat_ssize_t;
-typedef s32		compat_time_t;
-typedef s32		compat_clock_t;
-typedef s32		compat_pid_t;
-typedef u16		compat_uid_t;
-typedef u16		compat_gid_t;
-typedef u16		compat_mode_t;
-typedef u32		compat_ino_t;
-typedef u16		compat_dev_t;
-typedef s32		compat_off_t;
-typedef s64		compat_loff_t;
-typedef u16		compat_nlink_t;
-typedef u16		compat_ipc_pid_t;
-typedef s32		compat_daddr_t;
-typedef u32		compat_caddr_t;
-typedef __kernel_fsid_t	compat_fsid_t;
-
-typedef s32		compat_int_t;
-typedef s32		compat_long_t;
-typedef u32		compat_uint_t;
-typedef u32		compat_ulong_t;
-
-struct compat_timespec {
-	compat_time_t	tv_sec;
-	s32		tv_nsec;
-};
-
-struct compat_timeval {
-	compat_time_t	tv_sec;
-	s32		tv_usec;
-};
-
-struct compat_stat {
-	compat_dev_t	st_dev;
-	u16		__pad1;
-	compat_ino_t	st_ino;
-	compat_mode_t	st_mode;
-	compat_nlink_t	st_nlink;
-	compat_uid_t	st_uid;
-	compat_gid_t	st_gid;
-	compat_dev_t	st_rdev;
-	u16		__pad2;
-	u32		st_size;
-	u32		st_blksize;
-	u32		st_blocks;
-	u32		st_atime;
-	u32		st_atime_nsec;
-	u32		st_mtime;
-	u32		st_mtime_nsec;
-	u32		st_ctime;
-	u32		st_ctime_nsec;
-	u32		__unused4;
-	u32		__unused5;
-};
-
-struct compat_flock {
-	short		l_type;
-	short		l_whence;
-	compat_off_t	l_start;
-	compat_off_t	l_len;
-	compat_pid_t	l_pid;
-};
-
-#define F_GETLK64       12
-#define F_SETLK64       13
-#define F_SETLKW64      14    
-
-struct compat_flock64 {
-	short		l_type;
-	short		l_whence;
-	compat_loff_t	l_start;
-	compat_loff_t	l_len;
-	compat_pid_t	l_pid;
-};
-
-struct compat_statfs {
-	s32		f_type;
-	s32		f_bsize;
-	s32		f_blocks;
-	s32		f_bfree;
-	s32		f_bavail;
-	s32		f_files;
-	s32		f_ffree;
-	compat_fsid_t	f_fsid;
-	s32		f_namelen;
-	s32		f_spare[6];
-};
-
-typedef u32		compat_old_sigset_t;	/* at least 32 bits */
-
-#define _COMPAT_NSIG		64
-#define _COMPAT_NSIG_BPW	32
-
-typedef u32		compat_sigset_word;
-
-#define COMPAT_OFF_T_MAX	0x7fffffff
-#define COMPAT_LOFF_T_MAX	0x7fffffffffffffffL
-
-/*
- * A pointer passed in from user mode. This should not
- * be used for syscall parameters, just declare them
- * as pointers because the syscall entry code will have
- * appropriately comverted them already.
- */
-typedef	u32		compat_uptr_t;
-
-static inline void *compat_ptr(compat_uptr_t uptr)
-{
-	return (void *)(unsigned long)(uptr & 0x7fffffffUL);
-}
-
-#endif /* _ASM_S390X_COMPAT_H */
diff -Nru a/include/asm-s390x/cpcmd.h b/include/asm-s390x/cpcmd.h
--- a/include/asm-s390x/cpcmd.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,14 +0,0 @@
-/*
- *  arch/s390/kernel/cpcmd.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-#ifndef __CPCMD__
-#define __CPCMD__
-
-extern void cpcmd(char *cmd, char *response, int rlen);
-
-#endif
diff -Nru a/include/asm-s390x/current.h b/include/asm-s390x/current.h
--- a/include/asm-s390x/current.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,29 +0,0 @@
-/*
- *  include/asm-s390/current.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/current.h"
- */
-
-#ifndef _S390_CURRENT_H
-#define _S390_CURRENT_H
-
-#ifdef __KERNEL__
-
-#include <linux/thread_info.h>
-
-struct task_struct;
-
-static inline struct task_struct * get_current(void)
-{
-        return current_thread_info()->task;
-}
-
-#define current get_current()
-
-#endif
-
-#endif /* !(_S390_CURRENT_H) */
diff -Nru a/include/asm-s390x/dasd.h b/include/asm-s390x/dasd.h
--- a/include/asm-s390x/dasd.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,268 +0,0 @@
-/* 
- * File...........: linux/drivers/s390/block/dasd.c
- * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
- * Bugreports.to..: <Linux390@de.ibm.com>
- * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
- *
- * This file is the interface of the DASD device driver, which is exported to user space
- * any future changes wrt the API will result in a change of the APIVERSION reported
- * to userspace by the DASDAPIVER-ioctl
- *
- * $Revision: 1.3 $
- *
- * History of changes (starts July 2000)
- * 05/04/01 created by moving the kernel interface to drivers/s390/block/dasd_int.h
- * 12/06/01 DASD_API_VERSION 2 - binary compatible to 0 (new BIODASDINFO2)
- * 01/23/02 DASD_API_VERSION 3 - added BIODASDPSRD (and BIODASDENAPAV) IOCTL
- * 02/15/02 DASD_API_VERSION 4 - added BIODASDSATTR IOCTL
- * ##/##/## DASD_API_VERSION 5 - added boxed dasd support TOBEDONE
- * 21/06/02 DASD_API_VERSION 6 - fixed HDIO_GETGEO: geo.start is in sectors!
- *         
- */
-
-#ifndef DASD_H
-#define DASD_H
-#include <linux/ioctl.h>
-
-#define DASD_IOCTL_LETTER 'D'
-
-#define DASD_API_VERSION 6
-
-/* 
- * struct dasd_information2_t
- * represents any data about the device, which is visible to userspace.
- *  including foramt and featueres.
- */
-typedef struct dasd_information2_t {
-        unsigned int devno;         /* S/390 devno */
-        unsigned int real_devno;    /* for aliases */
-        unsigned int schid;         /* S/390 subchannel identifier */
-        unsigned int cu_type  : 16; /* from SenseID */
-        unsigned int cu_model :  8; /* from SenseID */
-        unsigned int dev_type : 16; /* from SenseID */
-        unsigned int dev_model : 8; /* from SenseID */
-        unsigned int open_count; 
-        unsigned int req_queue_len; 
-        unsigned int chanq_len;     /* length of chanq */
-        char type[4];               /* from discipline.name, 'none' for unknown */
-        unsigned int status;        /* current device level */
-        unsigned int label_block;   /* where to find the VOLSER */
-        unsigned int FBA_layout;    /* fixed block size (like AIXVOL) */
-        unsigned int characteristics_size;
-        unsigned int confdata_size;
-        char characteristics[64];   /* from read_device_characteristics */
-        char configuration_data[256]; /* from read_configuration_data */
-        unsigned int format;          /* format info like formatted/cdl/ldl/... */
-        unsigned int features;        /* dasd features like 'ro',...            */
-        unsigned int reserved0;       /* reserved for further use ,...          */
-        unsigned int reserved1;       /* reserved for further use ,...          */
-        unsigned int reserved2;       /* reserved for further use ,...          */
-        unsigned int reserved3;       /* reserved for further use ,...          */
-        unsigned int reserved4;       /* reserved for further use ,...          */
-        unsigned int reserved5;       /* reserved for further use ,...          */
-        unsigned int reserved6;       /* reserved for further use ,...          */
-        unsigned int reserved7;       /* reserved for further use ,...          */
-} dasd_information2_t;
-
-/*
- * values to be used for dasd_information_t.format
- * 0x00: NOT formatted
- * 0x01: Linux disc layout
- * 0x02: Common disc layout
- */
-#define DASD_FORMAT_NONE 0
-#define DASD_FORMAT_LDL  1
-#define DASD_FORMAT_CDL  2
-/*
- * values to be used for dasd_information_t.features
- * 0x00: default features
- * 0x01: readonly (ro)
- */
-#define DASD_FEATURE_DEFAULT  0
-#define DASD_FEATURE_READONLY 1
-
-#define DASD_PARTN_BITS 2
-
-/* 
- * struct dasd_information_t
- * represents any data about the data, which is visible to userspace
- */
-typedef struct dasd_information_t {
-        unsigned int devno;         /* S/390 devno */
-        unsigned int real_devno;    /* for aliases */
-        unsigned int schid;         /* S/390 subchannel identifier */
-        unsigned int cu_type  : 16; /* from SenseID */
-        unsigned int cu_model :  8; /* from SenseID */
-        unsigned int dev_type : 16; /* from SenseID */
-        unsigned int dev_model : 8; /* from SenseID */
-        unsigned int open_count; 
-        unsigned int req_queue_len; 
-        unsigned int chanq_len;     /* length of chanq */
-        char type[4];               /* from discipline.name, 'none' for unknown */
-        unsigned int status;        /* current device level */
-        unsigned int label_block;   /* where to find the VOLSER */
-        unsigned int FBA_layout;    /* fixed block size (like AIXVOL) */
-        unsigned int characteristics_size;
-        unsigned int confdata_size;
-        char characteristics[64];   /* from read_device_characteristics */
-        char configuration_data[256]; /* from read_configuration_data */
-} dasd_information_t;
-
-/*
- * Read Subsystem Data - Perfomance Statistics
- */ 
-typedef struct dasd_rssd_perf_stats_t {
-	unsigned char  invalid:1;
-	unsigned char  format:3;
-	unsigned char  data_format:4;
-	unsigned char  unit_address;
-	unsigned short device_status;
-	unsigned int   nr_read_normal;
-	unsigned int   nr_read_normal_hits;
-	unsigned int   nr_write_normal;
-	unsigned int   nr_write_fast_normal_hits;
-	unsigned int   nr_read_seq;
-	unsigned int   nr_read_seq_hits;
-	unsigned int   nr_write_seq;
-	unsigned int   nr_write_fast_seq_hits;
-	unsigned int   nr_read_cache;
-	unsigned int   nr_read_cache_hits;
-	unsigned int   nr_write_cache;
-	unsigned int   nr_write_fast_cache_hits;
-	unsigned int   nr_inhibit_cache;
-	unsigned int   nr_bybass_cache;
-	unsigned int   nr_seq_dasd_to_cache;
-	unsigned int   nr_dasd_to_cache;
-	unsigned int   nr_cache_to_dasd;
-	unsigned int   nr_delayed_fast_write;
-	unsigned int   nr_normal_fast_write;
-	unsigned int   nr_seq_fast_write;
-	unsigned int   nr_cache_miss;
-	unsigned char  status2;
-	unsigned int   nr_quick_write_promotes;
-	unsigned char  reserved;
-	unsigned short ssid;
-	unsigned char  reseved2[96];
-} __attribute__((packed)) dasd_rssd_perf_stats_t;
-
-/* 
- * struct profile_info_t
- * holds the profinling information 
- */
-typedef struct dasd_profile_info_t {
-        unsigned int dasd_io_reqs;	 /* number of requests processed at all */
-        unsigned int dasd_io_sects;	 /* number of sectors processed at all */
-        unsigned int dasd_io_secs[32];	 /* histogram of request's sizes */
-        unsigned int dasd_io_times[32];	 /* histogram of requests's times */
-        unsigned int dasd_io_timps[32];	 /* histogram of requests's times per sector */
-        unsigned int dasd_io_time1[32];	 /* histogram of time from build to start */
-        unsigned int dasd_io_time2[32];	 /* histogram of time from start to irq */
-        unsigned int dasd_io_time2ps[32]; /* histogram of time from start to irq */
-        unsigned int dasd_io_time3[32];	 /* histogram of time from irq to end */
-        unsigned int dasd_io_nr_req[32]; /* histogram of # of requests in chanq */
-} dasd_profile_info_t;
-
-/* 
- * struct format_data_t
- * represents all data necessary to format a dasd
- */
-typedef struct format_data_t {
-	int start_unit; /* from track */
-	int stop_unit;  /* to track */
-	int blksize;    /* sectorsize */
-        int intensity;  
-} format_data_t;
-
-/*
- * values to be used for format_data_t.intensity
- * 0/8: normal format
- * 1/9: also write record zero
- * 3/11: also write home address
- * 4/12: invalidate track
- */
-#define DASD_FMT_INT_FMT_R0 1 /* write record zero */
-#define DASD_FMT_INT_FMT_HA 2 /* write home address, also set FMT_R0 ! */
-#define DASD_FMT_INT_INVAL  4 /* invalidate tracks */
-#define DASD_FMT_INT_COMPAT 8 /* use OS/390 compatible disk layout */
-
-
-/* 
- * struct attrib_data_t
- * represents the operation (cache) bits for the device.
- * Used in DE to influence caching of the DASD.
- */
-typedef struct attrib_data_t {
-	unsigned char operation:3;     /* cache operation mode */
-	unsigned char reserved:5;      /* cache operation mode */
-	__u16         nr_cyl;          /* no of cyliners for read ahaed */
-	__u8          reserved2[29];   /* for future use */
-} __attribute__ ((packed)) attrib_data_t;
-
-/* definition of operation (cache) bits within attributes of DE */
-#define DASD_NORMAL_CACHE  0x0
-#define DASD_BYPASS_CACHE  0x1
-#define DASD_INHIBIT_LOAD  0x2
-#define DASD_SEQ_ACCESS    0x3
-#define DASD_SEQ_PRESTAGE  0x4
-#define DASD_REC_ACCESS    0x5
-
-
-/********************************************************************************
- * SECTION: Definition of IOCTLs
- *
- * Here ist how the ioctl-nr should be used:
- *    0 -   31   DASD driver itself
- *   32 -  239   still open
- *  240 -  255   reserved for EMC 
- *******************************************************************************/
-
-/* Disable the volume (for Linux) */
-#define BIODASDDISABLE _IO(DASD_IOCTL_LETTER,0) 
-/* Enable the volume (for Linux) */
-#define BIODASDENABLE  _IO(DASD_IOCTL_LETTER,1)  
-/* Issue a reserve/release command, rsp. */
-#define BIODASDRSRV    _IO(DASD_IOCTL_LETTER,2) /* reserve */
-#define BIODASDRLSE    _IO(DASD_IOCTL_LETTER,3) /* release */
-#define BIODASDSLCK    _IO(DASD_IOCTL_LETTER,4) /* steal lock */
-/* reset profiling information of a device */
-#define BIODASDPRRST   _IO(DASD_IOCTL_LETTER,5)
-
-
-/* retrieve API version number */
-#define DASDAPIVER     _IOR(DASD_IOCTL_LETTER,0,int)
-/* Get information on a dasd device */
-#define BIODASDINFO    _IOR(DASD_IOCTL_LETTER,1,dasd_information_t)
-/* retrieve profiling information of a device */
-#define BIODASDPRRD    _IOR(DASD_IOCTL_LETTER,2,dasd_profile_info_t)
-/* Get information on a dasd device (enhanced) */
-#define BIODASDINFO2   _IOR(DASD_IOCTL_LETTER,3,dasd_information2_t)
-/* Performance Statistics Read */
-#define BIODASDPSRD    _IOR(DASD_IOCTL_LETTER,4,dasd_rssd_perf_stats_t)
-
-
-/* #define BIODASDFORMAT  _IOW(IOCTL_LETTER,0,format_data_t) , deprecated */
-#define BIODASDFMT     _IOW(DASD_IOCTL_LETTER,1,format_data_t) 
-/* Set Attributes (cache operations) */
-#define BIODASDSATTR   _IOW(DASD_IOCTL_LETTER,2,attrib_data_t) 
-
-
-#endif				/* DASD_H */
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-indent-level: 4 
- * c-brace-imaginary-offset: 0
- * c-brace-offset: -4
- * c-argdecl-indent: 4
- * c-label-offset: -4
- * c-continued-statement-offset: 4
- * c-continued-brace-offset: 0
- * indent-tabs-mode: nil
- * tab-width: 8
- * End:
- */
diff -Nru a/include/asm-s390x/debug.h b/include/asm-s390x/debug.h
--- a/include/asm-s390x/debug.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,271 +0,0 @@
-/*
- *  include/asm-s390/debug.h
- *   S/390 debug facility
- *
- *    Copyright (C) 1999, 2000 IBM Deutschland Entwicklung GmbH,
- *                             IBM Corporation
- */
-
-#ifndef DEBUG_H
-#define DEBUG_H
-
-#include <linux/string.h>
-
-/* Note:
- * struct __debug_entry must be defined outside of #ifdef __KERNEL__ 
- * in order to allow a user program to analyze the 'raw'-view.
- */
-
-struct __debug_entry{
-        union {
-                struct {
-                        unsigned long long clock:52;
-                        unsigned long long exception:1;
-                        unsigned long long level:3;
-                        unsigned long long cpuid:8;
-                } fields;
-
-                unsigned long long stck;
-        } id;
-        void* caller;
-} __attribute__((packed));
-
-
-#define __DEBUG_FEATURE_VERSION      1  /* version of debug feature */
-
-#ifdef __KERNEL__
-#include <linux/version.h>
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0))
- #include <asm/spinlock.h>
-#else
- #include <linux/spinlock.h>
-#endif /* LINUX_VERSION_CODE */
-#include <linux/kernel.h>
-#include <linux/time.h>
-#include <linux/proc_fs.h>
-
-#define DEBUG_MAX_LEVEL            6  /* debug levels range from 0 to 6 */
-#define DEBUG_OFF_LEVEL            -1 /* level where debug is switched off */
-#define DEBUG_FLUSH_ALL            -1 /* parameter to flush all areas */
-#define DEBUG_MAX_VIEWS            10 /* max number of views in proc fs */
-#define DEBUG_MAX_PROCF_LEN        16 /* max length for a proc file name */
-#define DEBUG_DEFAULT_LEVEL        3  /* initial debug level */
-
-#define DEBUG_DIR_ROOT "s390dbf" /* name of debug root directory in proc fs */
-
-#define DEBUG_DATA(entry) (char*)(entry + 1) /* data is stored behind */
-                                             /* the entry information */
-
-#define STCK(x)	asm volatile ("STCK 0(%1)" : "=m" (x) : "a" (&(x)) : "cc")
-
-typedef struct __debug_entry debug_entry_t;
-
-struct debug_view;
-
-typedef struct debug_info {	
-	struct debug_info* next;
-	struct debug_info* prev;
-	atomic_t ref_count;
-	spinlock_t lock;			
-	int level;
-	int nr_areas;
-	int page_order;
-	int buf_size;
-	int entry_size;	
-	debug_entry_t** areas;
-	int active_area;
-	int *active_entry;
-	struct proc_dir_entry* proc_root_entry;
-	struct proc_dir_entry* proc_entries[DEBUG_MAX_VIEWS];
-	struct debug_view* views[DEBUG_MAX_VIEWS];	
-	char name[DEBUG_MAX_PROCF_LEN];
-} debug_info_t;
-
-typedef int (debug_header_proc_t) (debug_info_t* id,
-				   struct debug_view* view,
-				   int area,
-				   debug_entry_t* entry,
-				   char* out_buf);
-
-typedef int (debug_format_proc_t) (debug_info_t* id,
-				   struct debug_view* view, char* out_buf,
-				   const char* in_buf);
-typedef int (debug_prolog_proc_t) (debug_info_t* id,
-				   struct debug_view* view,
-				   char* out_buf);
-typedef int (debug_input_proc_t) (debug_info_t* id,
-				  struct debug_view* view,
-				  struct file* file, const char* user_buf,
-				  size_t in_buf_size, loff_t* offset);
-
-int debug_dflt_header_fn(debug_info_t* id, struct debug_view* view,
-		         int area, debug_entry_t* entry, char* out_buf);						
-				
-struct debug_view {
-	char name[DEBUG_MAX_PROCF_LEN];
-	debug_prolog_proc_t* prolog_proc;
-	debug_header_proc_t* header_proc;
-	debug_format_proc_t* format_proc;
-	debug_input_proc_t*  input_proc;
-	void*                private_data;
-};
-
-extern struct debug_view debug_hex_ascii_view;
-extern struct debug_view debug_raw_view;
-extern struct debug_view debug_sprintf_view;
-
-/* do NOT use the _common functions */
-
-debug_entry_t* debug_event_common(debug_info_t* id, int level, 
-                                  const void* data, int length);
-
-debug_entry_t* debug_exception_common(debug_info_t* id, int level, 
-                                      const void* data, int length);
-
-/* Debug Feature API: */
-
-debug_info_t* debug_register(char* name, int pages_index, int nr_areas,
-                             int buf_size);
-
-void debug_unregister(debug_info_t* id);
-
-void debug_set_level(debug_info_t* id, int new_level);
-
-extern inline debug_entry_t* 
-debug_event(debug_info_t* id, int level, void* data, int length)
-{
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_event_common(id,level,data,length);
-}
-
-extern inline debug_entry_t* 
-debug_int_event(debug_info_t* id, int level, unsigned int tag)
-{
-        unsigned int t=tag;
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_event_common(id,level,&t,sizeof(unsigned int));
-}
-
-extern inline debug_entry_t *
-debug_long_event (debug_info_t* id, int level, unsigned long tag)
-{
-        unsigned long t=tag;
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_event_common(id,level,&t,sizeof(unsigned long));
-}
-
-extern inline debug_entry_t* 
-debug_text_event(debug_info_t* id, int level, const char* txt)
-{
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_event_common(id,level,txt,strlen(txt));
-}
-
-extern debug_entry_t *
-debug_sprintf_event(debug_info_t* id,int level,char *string,...)
-	__attribute__ ((format(printf, 3, 4)));
-
-
-extern inline debug_entry_t* 
-debug_exception(debug_info_t* id, int level, void* data, int length)
-{
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_exception_common(id,level,data,length);
-}
-
-extern inline debug_entry_t* 
-debug_int_exception(debug_info_t* id, int level, unsigned int tag)
-{
-        unsigned int t=tag;
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_exception_common(id,level,&t,sizeof(unsigned int));
-}
-
-extern inline debug_entry_t * 
-debug_long_exception (debug_info_t* id, int level, unsigned long tag)
-{
-        unsigned long t=tag;
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_exception_common(id,level,&t,sizeof(unsigned long));
-}
-
-extern inline debug_entry_t* 
-debug_text_exception(debug_info_t* id, int level, const char* txt)
-{
-	if ((!id) || (level > id->level)) return NULL;
-        return debug_exception_common(id,level,txt,strlen(txt));
-}
-
-
-extern debug_entry_t *
-debug_sprintf_exception(debug_info_t* id,int level,char *string,...)
-	__attribute__ ((format(printf, 3, 4)));
-
-int debug_register_view(debug_info_t* id, struct debug_view* view);
-int debug_unregister_view(debug_info_t* id, struct debug_view* view);
-
-/*
-   define the debug levels:
-   - 0 No debugging output to console or syslog
-   - 1 Log internal errors to syslog, ignore check conditions 
-   - 2 Log internal errors and check conditions to syslog
-   - 3 Log internal errors to console, log check conditions to syslog
-   - 4 Log internal errors and check conditions to console
-   - 5 panic on internal errors, log check conditions to console
-   - 6 panic on both, internal errors and check conditions
- */
-
-#ifndef DEBUG_LEVEL
-#define DEBUG_LEVEL 4
-#endif
-
-#define INTERNAL_ERRMSG(x,y...) "E" __FILE__ "%d: " x, __LINE__, y
-#define INTERNAL_WRNMSG(x,y...) "W" __FILE__ "%d: " x, __LINE__, y
-#define INTERNAL_INFMSG(x,y...) "I" __FILE__ "%d: " x, __LINE__, y
-#define INTERNAL_DEBMSG(x,y...) "D" __FILE__ "%d: " x, __LINE__, y
-
-#if DEBUG_LEVEL > 0
-#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
-#define PRINT_INFO(x...) printk ( KERN_INFO PRINTK_HEADER x )
-#define PRINT_WARN(x...) printk ( KERN_WARNING PRINTK_HEADER x )
-#define PRINT_ERR(x...) printk ( KERN_ERR PRINTK_HEADER x )
-#define PRINT_FATAL(x...) panic ( PRINTK_HEADER x )
-#else
-#define PRINT_DEBUG(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
-#define PRINT_INFO(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
-#define PRINT_WARN(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
-#define PRINT_ERR(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
-#define PRINT_FATAL(x...) printk ( KERN_DEBUG PRINTK_HEADER x )
-#endif				/* DASD_DEBUG */
-
-#if DASD_DEBUG > 4
-#define INTERNAL_ERROR(x...) PRINT_FATAL ( INTERNAL_ERRMSG ( x ) )
-#elif DASD_DEBUG > 2
-#define INTERNAL_ERROR(x...) PRINT_ERR ( INTERNAL_ERRMSG ( x ) )
-#elif DASD_DEBUG > 0
-#define INTERNAL_ERROR(x...) PRINT_WARN ( INTERNAL_ERRMSG ( x ) )
-#else
-#define INTERNAL_ERROR(x...)
-#endif				/* DASD_DEBUG */
-
-#if DASD_DEBUG > 5
-#define INTERNAL_CHECK(x...) PRINT_FATAL ( INTERNAL_CHKMSG ( x ) )
-#elif DASD_DEBUG > 3
-#define INTERNAL_CHECK(x...) PRINT_ERR ( INTERNAL_CHKMSG ( x ) )
-#elif DASD_DEBUG > 1
-#define INTERNAL_CHECK(x...) PRINT_WARN ( INTERNAL_CHKMSG ( x ) )
-#else
-#define INTERNAL_CHECK(x...)
-#endif				/* DASD_DEBUG */
-
-#undef DEBUG_MALLOC
-#ifdef DEBUG_MALLOC
-void *b;
-#define kmalloc(x...) (PRINT_INFO(" kmalloc %p\n",b=kmalloc(x)),b)
-#define kfree(x) PRINT_INFO(" kfree %p\n",x);kfree(x)
-#define get_zeroed_page(x...) (PRINT_INFO(" gfp %p\n",b=get_zeroed_page(x)),b)
-#define __get_free_pages(x...) (PRINT_INFO(" gfps %p\n",b=__get_free_pages(x)),b)
-#endif				/* DEBUG_MALLOC */
-
-#endif				/* __KERNEL__ */
-#endif				/* DEBUG_H */
diff -Nru a/include/asm-s390x/delay.h b/include/asm-s390x/delay.h
--- a/include/asm-s390x/delay.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,22 +0,0 @@
-/*
- *  include/asm-s390/delay.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/delay.h"
- *    Copyright (C) 1993 Linus Torvalds
- *
- *  Delay routines calling functions in arch/s390x/lib/delay.c
- */
- 
-#ifndef _S390_DELAY_H
-#define _S390_DELAY_H
-
-extern void __udelay(unsigned long usecs);
-extern void __delay(unsigned long loops);
-
-#define udelay(n) __udelay(n)
-
-#endif /* defined(_S390_DELAY_H) */
diff -Nru a/include/asm-s390x/div64.h b/include/asm-s390x/div64.h
--- a/include/asm-s390x/div64.h	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,10 +0,0 @@
-#ifndef __S390_DIV64
-#define __S390_DIV64
-
-#define do_div(n,base) ({ \
-int __res; \
-__res = ((unsigned long) n) % (unsigned) base; \
-n = ((unsigned long) n) / (unsigned) base; \
-__res; })
-
-#endif
diff -Nru a/include/asm-s390x/dma-mapping.h b/include/asm-s390x/dma-mapping.h
--- a/include/asm-s390x/dma-mapping.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1 +0,0 @@
-#include <asm-generic/dma-mapping.h>
diff -Nru a/include/asm-s390x/dma.h b/include/asm-s390x/dma.h
--- a/include/asm-s390x/dma.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,18 +0,0 @@
-/*
- *  include/asm-s390x/dma.h
- *
- *  S390 version
- */
-
-#ifndef _ASM_DMA_H
-#define _ASM_DMA_H
-
-#include <asm/io.h>		/* need byte IO */
-
-/* The I/O subsystem can access only memory below 2GB.
-   We use the existing DMA zone mechanism to handle this. */
-#define MAX_DMA_ADDRESS         0x80000000
-
-#define free_dma(x)
-
-#endif /* _ASM_DMA_H */
diff -Nru a/include/asm-s390x/ebcdic.h b/include/asm-s390x/ebcdic.h
--- a/include/asm-s390x/ebcdic.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,49 +0,0 @@
-/*
- *  include/asm-s390/ebcdic.h
- *    EBCDIC -> ASCII, ASCII -> EBCDIC conversion routines.
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
- */
-
-#ifndef _EBCDIC_H
-#define _EBCDIC_H
-
-#ifndef _S390_TYPES_H
-#include <types.h>
-#endif
-
-extern __u8 _ascebc_500[];   /* ASCII -> EBCDIC 500 conversion table */
-extern __u8 _ebcasc_500[];   /* EBCDIC 500 -> ASCII conversion table */
-extern __u8 _ascebc[];   /* ASCII -> EBCDIC conversion table */
-extern __u8 _ebcasc[];   /* EBCDIC -> ASCII conversion table */
-extern __u8 _ebc_tolower[]; /* EBCDIC -> lowercase */
-extern __u8 _ebc_toupper[]; /* EBCDIC -> uppercase */
-
-extern __inline__ void
-codepage_convert(const __u8 *codepage, volatile __u8 * addr, unsigned long nr)
-{
-	if (nr-- <= 0)
-		return;
-        __asm__ __volatile__(
-		"   bras  1,1f\n"
-		"   tr    0(1,%0),0(%2)\n"
-		"0: tr    0(256,%0),0(%2)\n"
-		"   la    %0,256(%0)\n"
-		"1: ahi   %1,-256\n"
-		"   jnm   0b\n"
-		"   ex    %1,0(1)"
-		: "+&a" (addr), "+&a" (nr)
-		: "a" (codepage) : "cc", "memory", "1" );
-}
-
-#define ASCEBC(addr,nr) codepage_convert(_ascebc, addr, nr)
-#define EBCASC(addr,nr) codepage_convert(_ebcasc, addr, nr)
-#define ASCEBC_500(addr,nr) codepage_convert(_ascebc_500, addr, nr)
-#define EBCASC_500(addr,nr) codepage_convert(_ebcasc_500, addr, nr)
-#define EBC_TOLOWER(addr,nr) codepage_convert(_ebc_tolower, addr, nr)
-#define EBC_TOUPPER(addr,nr) codepage_convert(_ebc_toupper, addr, nr)
-
-#endif
-
diff -Nru a/include/asm-s390x/elf.h b/include/asm-s390x/elf.h
--- a/include/asm-s390x/elf.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,90 +0,0 @@
-/*
- *  include/asm-s390/elf.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/elf.h"
- */
-
-#ifndef __ASMS390_ELF_H
-#define __ASMS390_ELF_H
-
-/*
- * ELF register definitions..
- */
-
-#include <asm/ptrace.h>
-#include <asm/user.h>
-
-
-typedef s390_fp_regs elf_fpregset_t;
-typedef s390_regs elf_gregset_t;
-
-/*
- * These are used to set parameters in the core dumps.
- */
-#define ELF_CLASS	ELFCLASS64
-#define ELF_DATA	ELFDATA2MSB
-#define ELF_ARCH	EM_S390
-
-/*
- * This is used to ensure we don't load something for the wrong architecture.
- */
-#define elf_check_arch(x) \
-        (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \
-         && (x)->e_ident[EI_CLASS] == ELF_CLASS)
-
-/* For SVR4/S390 the function pointer to be registered with `atexit` is
-   passed in R14. */
-#define ELF_PLAT_INIT(_r, load_addr) \
-	do { \
-	_r->gprs[14] = 0; \
-	clear_thread_flag(TIF_31BIT); \
-	} while(0)
-
-#define USE_ELF_CORE_DUMP
-#define ELF_EXEC_PAGESIZE	4096
-
-/* This is the location that an ET_DYN program is loaded if exec'ed.  Typical
-   use of this is to invoke "./ld.so someprog" to test out a new version of
-   the loader.  We need to make sure that it is out of the way of the program
-   that it will "exec", and that there is sufficient room for the brk.  */
-
-#define ELF_ET_DYN_BASE         (TASK_SIZE / 3 * 2)
-
-/* Wow, the "main" arch needs arch dependent functions too.. :) */
-
-/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is
-   now struct_user_regs, they are different) */
-
-#define ELF_CORE_COPY_REGS(pr_reg, regs)	\
-	memcpy(&pr_reg,regs,sizeof(elf_gregset_t)); \
-
-
-
-/* This yields a mask that user programs can use to figure out what
-   instruction set this CPU supports. */
-
-#define ELF_HWCAP (0)
-
-/* This yields a string that ld.so will use to load implementation
-   specific libraries for optimization.  This is more specific in
-   intent than poking at uname or /proc/cpuinfo.
-
-   For the moment, we have only optimizations for the Intel generations,
-   but that could change... */
-
-#define ELF_PLATFORM (NULL)
-
-#ifdef __KERNEL__
-#define SET_PERSONALITY(ex, ibcs2)			\
-do {							\
-	if (ibcs2)					\
-		set_personality(PER_SVR4);		\
-	else if (current->personality != PER_LINUX32)	\
-		set_personality(PER_LINUX);		\
-	clear_thread_flag(TIF_31BIT);			\
-} while (0)
-#endif
-
-#endif
diff -Nru a/include/asm-s390x/errno.h b/include/asm-s390x/errno.h
--- a/include/asm-s390x/errno.h	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,12 +0,0 @@
-/*
- *  include/asm-s390/errno.h
- *
- *  S390 version
- */
-
-#ifndef _S390_ERRNO_H
-#define _S390_ERRNO_H
-
-#include <asm-generic/errno.h>
-
-#endif
diff -Nru a/include/asm-s390x/fcntl.h b/include/asm-s390x/fcntl.h
--- a/include/asm-s390x/fcntl.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,83 +0,0 @@
-/*
- *  include/asm-s390/fcntl.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/fcntl.h"
- */
-#ifndef _S390_FCNTL_H
-#define _S390_FCNTL_H
-
-/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
-   located on an ext2 file system */
-#define O_ACCMODE	   0003
-#define O_RDONLY	     00
-#define O_WRONLY	     01
-#define O_RDWR		     02
-#define O_CREAT		   0100	/* not fcntl */
-#define O_EXCL		   0200	/* not fcntl */
-#define O_NOCTTY	   0400	/* not fcntl */
-#define O_TRUNC		  01000	/* not fcntl */
-#define O_APPEND	  02000
-#define O_NONBLOCK	  04000
-#define O_NDELAY	O_NONBLOCK
-#define O_SYNC		 010000
-#define FASYNC		 020000	/* fcntl, for BSD compatibility */
-#define O_DIRECT	 040000	/* direct disk access hint */
-#define O_LARGEFILE	0100000
-#define O_DIRECTORY	0200000	/* must be a directory */
-#define O_NOFOLLOW	0400000 /* don't follow links */
-
-#define F_DUPFD		0	/* dup */
-#define F_GETFD		1	/* get close_on_exec */
-#define F_SETFD		2	/* set/clear close_on_exec */
-#define F_GETFL		3	/* get file->f_flags */
-#define F_SETFL		4	/* set file->f_flags */
-#define F_GETLK		5
-#define F_SETLK		6
-#define F_SETLKW	7
-
-#define F_SETOWN	8	/*  for sockets. */
-#define F_GETOWN	9	/*  for sockets. */
-#define F_SETSIG	10	/*  for sockets. */
-#define F_GETSIG	11	/*  for sockets. */
-
-/* for F_[GET|SET]FL */
-#define FD_CLOEXEC	1	/* actually anything with low bit set goes */
-
-/* for posix fcntl() and lockf() */
-#define F_RDLCK		0
-#define F_WRLCK		1
-#define F_UNLCK		2
-
-/* for old implementation of bsd flock () */
-#define F_EXLCK		4	/* or 3 */
-#define F_SHLCK		8	/* or 4 */
-
-/* for leases */
-#define F_INPROGRESS	16
-
-/* operations for bsd flock(), also used by the kernel implementation */
-#define LOCK_SH		1	/* shared lock */
-#define LOCK_EX		2	/* exclusive lock */
-#define LOCK_NB		4	/* or'd with one of the above to prevent
-				   blocking */
-#define LOCK_UN		8	/* remove lock */
-
-#define LOCK_MAND	32	/* This is a mandatory flock */
-#define LOCK_READ	64	/* ... Which allows concurrent read operations */
-#define LOCK_WRITE	128	/* ... Which allows concurrent write operations
-*/
-#define LOCK_RW		192	/* ... Which allows concurrent read & write ops */
-
-struct flock {
-	short l_type;
-	short l_whence;
-	__kernel_off_t l_start;
-	__kernel_off_t l_len;
-	__kernel_pid_t l_pid;
-};
-
-#define F_LINUX_SPECIFIC_BASE  1024
-
-#endif
diff -Nru a/include/asm-s390x/gdb-stub.h b/include/asm-s390x/gdb-stub.h
--- a/include/asm-s390x/gdb-stub.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,18 +0,0 @@
-/*
- *  include/asm-s390/gdb-stub.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- */
-
-#ifndef __S390_GDB_STUB__
-#define __S390_GDB_STUB__
-#include <linux/config.h>
-#if CONFIG_REMOTE_DEBUG
-#include <asm/s390-gdbregs.h>
-#include <asm/ptrace.h>
-extern int    gdb_stub_initialised;
-extern void gdb_stub_handle_exception(gdb_pt_regs *regs,int sigval);
-#endif
-#endif
diff -Nru a/include/asm-s390x/hardirq.h b/include/asm-s390x/hardirq.h
--- a/include/asm-s390x/hardirq.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,109 +0,0 @@
-/*
- *  include/asm-s390/hardirq.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- *
- *  Derived from "include/asm-i386/hardirq.h"
- */
-
-#ifndef __ASM_HARDIRQ_H
-#define __ASM_HARDIRQ_H
-
-#include <linux/config.h>
-#include <linux/threads.h>
-#include <asm/lowcore.h>
-#include <linux/sched.h>
-#include <linux/cache.h>
-
-/* entry.S is sensitive to the offsets of these fields */
-typedef struct {
-	unsigned int __softirq_pending;
-	unsigned int __syscall_count;
-	struct task_struct * __ksoftirqd_task; /* waitqueue is too large */
-} ____cacheline_aligned irq_cpustat_t;
-
-#include <linux/irq_cpustat.h>	/* Standard mappings for irq_cpustat_t above */
-
-/*
- * We put the hardirq and softirq counter into the preemption
- * counter. The bitmask has the following meaning:
- *
- * - bits 0-7 are the preemption count (max preemption depth: 256)
- * - bits 8-15 are the softirq count (max # of softirqs: 256)
- * - bits 16-23 are the hardirq count (max # of hardirqs: 256)
- *
- * - ( bit 26 is the PREEMPT_ACTIVE flag. )
- *
- * PREEMPT_MASK: 0x000000ff
- * SOFTIRQ_MASK: 0x0000ff00
- * HARDIRQ_MASK: 0x00010000
- */
-
-#define PREEMPT_BITS	8
-#define SOFTIRQ_BITS	8
-// FIXME: we have 2^16 i/o and 2^16 external interrupts...
-#define HARDIRQ_BITS	1
-
-#define PREEMPT_SHIFT	0
-#define SOFTIRQ_SHIFT	(PREEMPT_SHIFT + PREEMPT_BITS)
-#define HARDIRQ_SHIFT	(SOFTIRQ_SHIFT + SOFTIRQ_BITS)
-
-#define __MASK(x)	((1UL << (x))-1)
-
-#define PREEMPT_MASK	(__MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
-#define SOFTIRQ_MASK	(__MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
-#define HARDIRQ_MASK	(__MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
-
-#define hardirq_count()	(preempt_count() & HARDIRQ_MASK)
-#define softirq_count()	(preempt_count() & SOFTIRQ_MASK)
-#define irq_count()	(preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK))
-
-#define PREEMPT_OFFSET	(1UL << PREEMPT_SHIFT)
-#define SOFTIRQ_OFFSET	(1UL << SOFTIRQ_SHIFT)
-#define HARDIRQ_OFFSET	(1UL << HARDIRQ_SHIFT)
-
-/*
- * Are we doing bottom half or hardware interrupt processing?
- * Are we in a softirq context? Interrupt context?
- */
-#define in_irq()		(hardirq_count())
-#define in_softirq()		(softirq_count())
-#define in_interrupt()		(irq_count())
-
-
-#define hardirq_trylock()	(!in_interrupt())
-#define hardirq_endlock()	do { } while (0)
-
-#define irq_enter()		(preempt_count() += HARDIRQ_OFFSET)
-
-extern void do_call_softirq(void);
-
-#if CONFIG_PREEMPT
-# define in_atomic()	(in_interrupt() || preempt_count() == PREEMPT_ACTIVE)
-# define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
-#else
-# define in_atomic()	(preempt_count() != 0)
-# define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
-#endif
-
-#define irq_exit()							\
-do {									\
-	preempt_count() -= IRQ_EXIT_OFFSET;				\
-	if (!in_interrupt() && softirq_pending(smp_processor_id()))	\
-		/* Use the async. stack for softirq */			\
-		do_call_softirq();					\
-	preempt_enable_no_resched();					\
-} while (0)
-
-#ifndef CONFIG_SMP
-# define synchronize_irq(irq)	barrier()
-#else
-  extern void synchronize_irq(unsigned int irq);
-#endif /* CONFIG_SMP */
-
-extern void show_stack(unsigned long * esp);
-
-#endif /* __ASM_HARDIRQ_H */
diff -Nru a/include/asm-s390x/idals.h b/include/asm-s390x/idals.h
--- a/include/asm-s390x/idals.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,259 +0,0 @@
-/* 
- * File...........: linux/include/asm-s390x/idals.h
- * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
- *		    Martin Schwidefsky <schwidefsky@de.ibm.com>
- * Bugreports.to..: <Linux390@de.ibm.com>
- * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000a
- 
- * History of changes
- * 07/24/00 new file
- * 05/04/02 code restructuring.
- */
-
-#ifndef _S390_IDALS_H
-#define _S390_IDALS_H
-
-#include <linux/config.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/types.h>
-#include <linux/slab.h>
-#include <asm/cio.h>
-#include <asm/uaccess.h>
-
-#ifdef CONFIG_ARCH_S390X
-#define IDA_SIZE_LOG 12 /* 11 for 2k , 12 for 4k */
-#else
-#define IDA_SIZE_LOG 11 /* 11 for 2k , 12 for 4k */
-#endif
-#define IDA_BLOCK_SIZE (1L<<IDA_SIZE_LOG)
-
-/*
- * Test if an address/length pair needs an idal list.
- */
-static inline int
-idal_is_needed(void *vaddr, unsigned int length)
-{
-#if defined(CONFIG_ARCH_S390X)
-	return ((__pa(vaddr) + length) >> 31) != 0;
-#else
-	return 0;
-#endif
-}
-
-
-/*
- * Return the number of idal words needed for an address/length pair.
- */
-static inline unsigned int
-idal_nr_words(void *vaddr, unsigned int length)
-{
-#if defined(CONFIG_ARCH_S390X)
-	if (idal_is_needed(vaddr, length))
-		return ((__pa(vaddr) & (IDA_BLOCK_SIZE-1)) + length + 
-			(IDA_BLOCK_SIZE-1)) >> IDA_SIZE_LOG;
-#endif
-	return 0;
-}
-
-/*
- * Create the list of idal words for an address/length pair.
- */
-static inline unsigned long *
-idal_create_words(unsigned long *idaws, void *vaddr, unsigned int length)
-{
-#if defined(CONFIG_ARCH_S390X)
-	unsigned long paddr;
-	unsigned int cidaw;
-
-	paddr = __pa(vaddr);
-	cidaw = ((paddr & (IDA_BLOCK_SIZE-1)) + length + 
-		 (IDA_BLOCK_SIZE-1)) >> IDA_SIZE_LOG;
-	*idaws++ = paddr;
-	paddr &= -IDA_BLOCK_SIZE;
-	while (--cidaw > 0) {
-		paddr += IDA_BLOCK_SIZE;
-		*idaws++ = paddr;
-	}
-#endif
-	return idaws;
-}
-
-/*
- * Sets the address of the data in CCW.
- * If necessary it allocates an IDAL and sets the appropriate flags.
- */
-static inline int
-set_normalized_cda(struct ccw1 * ccw, void *vaddr)
-{
-#if defined (CONFIG_ARCH_S390X)
-	unsigned int nridaws;
-	unsigned long *idal;
-
-	if (ccw->flags & CCW_FLAG_IDA)
-		return -EINVAL;
-	nridaws = idal_nr_words(vaddr, ccw->count);
-	if (nridaws > 0) {
-		idal = kmalloc(nridaws * sizeof(unsigned long),
-			       GFP_ATOMIC | GFP_DMA );
-		if (idal == NULL)
-			return -ENOMEM;
-		idal_create_words(idal, vaddr, ccw->count);
-		ccw->flags |= CCW_FLAG_IDA;
-		vaddr = idal;
-	}
-#endif
-	ccw->cda = (__u32)(unsigned long) vaddr;
-	return 0;
-}
-
-/*
- * Releases any allocated IDAL related to the CCW.
- */
-static inline void
-clear_normalized_cda(struct ccw1 * ccw)
-{
-#if defined(CONFIG_ARCH_S390X)
-	if (ccw->flags & CCW_FLAG_IDA) {
-		kfree((void *)(unsigned long) ccw->cda);
-		ccw->flags &= ~CCW_FLAG_IDA;
-	}
-#endif
-	ccw->cda = 0;
-}
-
-/*
- * Idal buffer extension
- */
-struct idal_buffer {
-	size_t size;
-	size_t page_order;
-	void *data[0];
-};
-
-/*
- * Allocate an idal buffer
- */
-static inline struct idal_buffer *
-idal_buffer_alloc(size_t size, int page_order)
-{
-	struct idal_buffer *ib;
-	int nr_chunks, nr_ptrs, i;
-
-	nr_ptrs = (size + IDA_BLOCK_SIZE - 1) >> IDA_SIZE_LOG;
-	nr_chunks = (4096 << page_order) >> IDA_SIZE_LOG;
-	ib = kmalloc(sizeof(struct idal_buffer) + nr_ptrs*sizeof(void *),
-		     GFP_DMA | GFP_KERNEL);
-	if (ib == NULL)
-		return ERR_PTR(-ENOMEM);
-	ib->size = size;
-	ib->page_order = page_order;
-	for (i = 0; i < nr_ptrs; i++) {
-		if ((i & (nr_chunks - 1)) != 0) {
-			ib->data[i] = ib->data[i-1] + IDA_BLOCK_SIZE;
-			continue;
-		}
-		ib->data[i] = (void *)
-			__get_free_pages(GFP_KERNEL, page_order);
-		if (ib->data[i] != NULL)
-			continue;
-		// Not enough memory
-		while (i >= nr_chunks) {
-			i -= nr_chunks;
-			free_pages((unsigned long) ib->data[i],
-				   ib->page_order);
-		}
-		kfree(ib);
-		return ERR_PTR(-ENOMEM);
-	}
-	return ib;
-}
-
-/*
- * Free an idal buffer.
- */
-static inline void
-idal_buffer_free(struct idal_buffer *ib)
-{
-	int nr_chunks, nr_ptrs, i;
-
-	nr_ptrs = (ib->size + IDA_BLOCK_SIZE - 1) >> IDA_SIZE_LOG;
-	nr_chunks = (4096 << ib->page_order) >> IDA_SIZE_LOG;
-	for (i = 0; i < nr_ptrs; i += nr_chunks)
-		free_pages((unsigned long) ib->data[i], ib->page_order);
-	kfree(ib);
-}
-
-/*
- * Test if a idal list is really needed.
- */
-static inline int
-__idal_buffer_is_needed(struct idal_buffer *ib)
-{
-#ifdef CONFIG_ARCH_S390X
-	return ib->size > (4096ul << ib->page_order) ||
-		idal_is_needed(ib->data[0], ib->size);
-#else
-	return ib->size > (4096ul << ib->page_order);
-#endif
-}
-
-/*
- * Set channel data address to idal buffer.
- */
-static inline void
-idal_buffer_set_cda(struct idal_buffer *ib, struct ccw1 *ccw)
-{
-	if (__idal_buffer_is_needed(ib)) {
-		// setup idals;
-		ccw->cda = (u32)(addr_t) ib->data;
-		ccw->flags |= CCW_FLAG_IDA;
-	} else
-		// we do not need idals - use direct addressing
-		ccw->cda = (u32)(addr_t) ib->data[0];
-	ccw->count = ib->size;
-}
-
-/*
- * Copy count bytes from an idal buffer to user memory
- */
-static inline size_t
-idal_buffer_to_user(struct idal_buffer *ib, void *to, size_t count)
-{
-	size_t left;
-	int i;
-
-	if (count > ib->size)
-		BUG();
-	for (i = 0; count > IDA_BLOCK_SIZE; i++) {
-		left = copy_to_user(to, ib->data[i], IDA_BLOCK_SIZE);
-		if (left)
-			return left + count - IDA_BLOCK_SIZE;
-		(addr_t) to += IDA_BLOCK_SIZE;
-		count -= IDA_BLOCK_SIZE;
-	}
-	return copy_to_user(to, ib->data[i], count);
-}
-
-/*
- * Copy count bytes from user memory to an idal buffer
- */
-static inline size_t
-idal_buffer_from_user(struct idal_buffer *ib, const void *from, size_t count)
-{
-	size_t left;
-	int i;
-
-	if (count > ib->size)
-		BUG();
-	for (i = 0; count > IDA_BLOCK_SIZE; i++) {
-		left = copy_from_user(ib->data[i], from, IDA_BLOCK_SIZE);
-		if (left)
-			return left + count - IDA_BLOCK_SIZE;
-		(addr_t) from += IDA_BLOCK_SIZE;
-		count -= IDA_BLOCK_SIZE;
-	}
-	return copy_from_user(ib->data[i], from, count);
-}
-
-#endif
diff -Nru a/include/asm-s390x/init.h b/include/asm-s390x/init.h
--- a/include/asm-s390x/init.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,7 +0,0 @@
-/*
- *  include/asm-s390x/init.h
- *
- *  S390 version (s390x)
- */
-
-#error "<asm/init.h> should never be used - use <linux/init.h> instead"
diff -Nru a/include/asm-s390x/io.h b/include/asm-s390x/io.h
--- a/include/asm-s390x/io.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,99 +0,0 @@
-/*
- *  include/asm-s390/io.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/io.h"
- */
-
-#ifndef _S390_IO_H
-#define _S390_IO_H
-
-#ifdef __KERNEL__
-
-#include <linux/vmalloc.h>
-#include <asm/page.h>
-
-#define IO_SPACE_LIMIT 0xffffffff
-
-#define __io_virt(x)            ((void *)(PAGE_OFFSET | (unsigned long)(x)))
-
-/*
- * Change virtual addresses to physical addresses and vv.
- * These are pretty trivial
- */
-extern inline unsigned long virt_to_phys(volatile void * address)
-{
-	unsigned long real_address;
-	__asm__ ("   lrag   %0,0(%1)\n"
-                 "   jz     0f\n"
-                 "   slgr   %0,%0\n"
-                 "0:"
-                 : "=a" (real_address) : "a" (address) : "cc" );
-        return real_address;
-}
-
-extern inline void * phys_to_virt(unsigned long address)
-{
-        return __io_virt(address);
-}
-
-/*
- * Change "struct page" to physical address.
- */
-#define page_to_phys(page)	((page - mem_map) << PAGE_SHIFT)
-
-extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
-
-extern inline void * ioremap (unsigned long offset, unsigned long size)
-{
-        return __ioremap(offset, size, 0);
-}
-
-/*
- * This one maps high address device memory and turns off caching for that area.
- * it's useful if some control registers are in such an area and write combining
- * or read caching is not desirable:
- */
-extern inline void * ioremap_nocache (unsigned long offset, unsigned long size)
-{
-        return __ioremap(offset, size, 0);
-}
-
-extern void iounmap(void *addr);
-
-/*
- * IO bus memory addresses are also 1:1 with the physical address
- */
-#define virt_to_bus virt_to_phys
-#define bus_to_virt phys_to_virt
-
-/*
- * readX/writeX() are used to access memory mapped devices. On some
- * architectures the memory mapped IO stuff needs to be accessed
- * differently.
- */
-
-#define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
-#define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
-#define readl(addr) (*(volatile unsigned int *) __io_virt(addr))
-
-#define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
-#define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
-#define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))
-
-#define memset_io(a,b,c)        memset(__io_virt(a),(b),(c))
-#define memcpy_fromio(a,b,c)    memcpy((a),__io_virt(b),(c))
-#define memcpy_toio(a,b,c)      memcpy(__io_virt(a),(b),(c))
-
-#define inb_p(addr) readb(addr)
-#define inb(addr) readb(addr)
-
-#define outb(x,addr) ((void) writeb(x,addr))
-#define outb_p(x,addr) outb(x,addr)
-
-#endif /* __KERNEL__ */
-
-#endif
diff -Nru a/include/asm-s390x/ioctl.h b/include/asm-s390x/ioctl.h
--- a/include/asm-s390x/ioctl.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,78 +0,0 @@
-/*
- *  include/asm-s390/ioctl.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/ioctl.h"
- */
-
-#ifndef _S390_IOCTL_H
-#define _S390_IOCTL_H
-
-/* ioctl command encoding: 32 bits total, command in lower 16 bits,
- * size of the parameter structure in the lower 14 bits of the
- * upper 16 bits.
- * Encoding the size of the parameter structure in the ioctl request
- * is useful for catching programs compiled with old versions
- * and to avoid overwriting user space outside the user buffer area.
- * The highest 2 bits are reserved for indicating the ``access mode''.
- * NOTE: This limits the max parameter size to 16kB -1 !
- */
-
-/*
- * The following is for compatibility across the various Linux
- * platforms.  The i386 ioctl numbering scheme doesn't really enforce
- * a type field.  De facto, however, the top 8 bits of the lower 16
- * bits are indeed used as a type field, so we might just as well make
- * this explicit here.  Please be sure to use the decoding macros
- * below from now on.
- */
-#define _IOC_NRBITS	8
-#define _IOC_TYPEBITS	8
-#define _IOC_SIZEBITS	14
-#define _IOC_DIRBITS	2
-
-#define _IOC_NRMASK	((1 << _IOC_NRBITS)-1)
-#define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1)
-#define _IOC_SIZEMASK	((1 << _IOC_SIZEBITS)-1)
-#define _IOC_DIRMASK	((1 << _IOC_DIRBITS)-1)
-
-#define _IOC_NRSHIFT	0
-#define _IOC_TYPESHIFT	(_IOC_NRSHIFT+_IOC_NRBITS)
-#define _IOC_SIZESHIFT	(_IOC_TYPESHIFT+_IOC_TYPEBITS)
-#define _IOC_DIRSHIFT	(_IOC_SIZESHIFT+_IOC_SIZEBITS)
-
-/*
- * Direction bits.
- */
-#define _IOC_NONE	0U
-#define _IOC_WRITE	1U
-#define _IOC_READ	2U
-
-#define _IOC(dir,type,nr,size) \
-	(((dir)  << _IOC_DIRSHIFT) | \
-	 ((type) << _IOC_TYPESHIFT) | \
-	 ((nr)   << _IOC_NRSHIFT) | \
-	 ((size) << _IOC_SIZESHIFT))
-
-/* used to create numbers */
-#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
-#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
-#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
-#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
-
-/* used to decode ioctl numbers.. */
-#define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
-#define _IOC_TYPE(nr)		(((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
-#define _IOC_NR(nr)		(((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
-#define _IOC_SIZE(nr)		(((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
-
-/* ...and for the drivers/sound files... */
-
-#define IOC_IN		(_IOC_WRITE << _IOC_DIRSHIFT)
-#define IOC_OUT		(_IOC_READ << _IOC_DIRSHIFT)
-#define IOC_INOUT	((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
-#define IOCSIZE_MASK	(_IOC_SIZEMASK << _IOC_SIZESHIFT)
-#define IOCSIZE_SHIFT	(_IOC_SIZESHIFT)
-
-#endif /* _S390_IOCTL_H */
diff -Nru a/include/asm-s390x/ioctls.h b/include/asm-s390x/ioctls.h
--- a/include/asm-s390x/ioctls.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,88 +0,0 @@
-/*
- *  include/asm-s390/ioctls.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/ioctls.h"
- */
-
-#ifndef __ARCH_S390_IOCTLS_H__
-#define __ARCH_S390_IOCTLS_H__
-
-#include <asm/ioctl.h>
-
-/* 0x54 is just a magic number to make these relatively unique ('T') */
-
-#define TCGETS		0x5401
-#define TCSETS		0x5402
-#define TCSETSW		0x5403
-#define TCSETSF		0x5404
-#define TCGETA		0x5405
-#define TCSETA		0x5406
-#define TCSETAW		0x5407
-#define TCSETAF		0x5408
-#define TCSBRK		0x5409
-#define TCXONC		0x540A
-#define TCFLSH		0x540B
-#define TIOCEXCL	0x540C
-#define TIOCNXCL	0x540D
-#define TIOCSCTTY	0x540E
-#define TIOCGPGRP	0x540F
-#define TIOCSPGRP	0x5410
-#define TIOCOUTQ	0x5411
-#define TIOCSTI		0x5412
-#define TIOCGWINSZ	0x5413
-#define TIOCSWINSZ	0x5414
-#define TIOCMGET	0x5415
-#define TIOCMBIS	0x5416
-#define TIOCMBIC	0x5417
-#define TIOCMSET	0x5418
-#define TIOCGSOFTCAR	0x5419
-#define TIOCSSOFTCAR	0x541A
-#define FIONREAD	0x541B
-#define TIOCINQ		FIONREAD
-#define TIOCLINUX	0x541C
-#define TIOCCONS	0x541D
-#define TIOCGSERIAL	0x541E
-#define TIOCSSERIAL	0x541F
-#define TIOCPKT		0x5420
-#define FIONBIO		0x5421
-#define TIOCNOTTY	0x5422
-#define TIOCSETD	0x5423
-#define TIOCGETD	0x5424
-#define TCSBRKP		0x5425	/* Needed for POSIX tcsendbreak() */
-#define TIOCSBRK	0x5427  /* BSD compatibility */
-#define TIOCCBRK	0x5428  /* BSD compatibility */
-#define TIOCGSID	0x5429  /* Return the session ID of FD */
-#define TIOCGPTN	_IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
-#define TIOCSPTLCK	_IOW('T',0x31, int)  /* Lock/unlock Pty */
-
-#define FIONCLEX	0x5450  /* these numbers need to be adjusted. */
-#define FIOCLEX		0x5451
-#define FIOASYNC	0x5452
-#define TIOCSERCONFIG	0x5453
-#define TIOCSERGWILD	0x5454
-#define TIOCSERSWILD	0x5455
-#define TIOCGLCKTRMIOS	0x5456
-#define TIOCSLCKTRMIOS	0x5457
-#define TIOCSERGSTRUCT	0x5458 /* For debugging only */
-#define TIOCSERGETLSR   0x5459 /* Get line status register */
-#define TIOCSERGETMULTI 0x545A /* Get multiport config  */
-#define TIOCSERSETMULTI 0x545B /* Set multiport config */
-
-#define TIOCMIWAIT	0x545C	/* wait for a change on serial input line(s) */
-#define TIOCGICOUNT	0x545D	/* read serial port inline interrupt counts */
-#define FIOQSIZE	0x545E
-
-/* Used for packet mode */
-#define TIOCPKT_DATA		 0
-#define TIOCPKT_FLUSHREAD	 1
-#define TIOCPKT_FLUSHWRITE	 2
-#define TIOCPKT_STOP		 4
-#define TIOCPKT_START		 8
-#define TIOCPKT_NOSTOP		16
-#define TIOCPKT_DOSTOP		32
-
-#define TIOCSER_TEMT    0x01	/* Transmitter physically empty */
-
-#endif
diff -Nru a/include/asm-s390x/ipc.h b/include/asm-s390x/ipc.h
--- a/include/asm-s390x/ipc.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,39 +0,0 @@
-/*
- *  include/asm-s390/ipc.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/ipc.h"
- */
-
-#ifndef __s390_IPC_H__
-#define __s390_IPC_H__
-
-/* 
- * These are used to wrap system calls on S390.
- *
- * See arch/s390/kernel/sys_s390.c for ugly details..
- */
-struct ipc_kludge {
-	struct msgbuf *msgp;
-	long msgtyp;
-};
-
-#define SEMOP		 1
-#define SEMGET		 2
-#define SEMCTL		 3
-#define MSGSND		11
-#define MSGRCV		12
-#define MSGGET		13
-#define MSGCTL		14
-#define SHMAT		21
-#define SHMDT		22
-#define SHMGET		23
-#define SHMCTL		24
-
-/* Used by the DIPC package, try and avoid reusing it */
-#define DIPC            25
-
-#define IPCCALL(version,op)	((version)<<16 | (op))
-
-#endif
diff -Nru a/include/asm-s390x/ipcbuf.h b/include/asm-s390x/ipcbuf.h
--- a/include/asm-s390x/ipcbuf.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,28 +0,0 @@
-#ifndef __S390_IPCBUF_H__
-#define __S390_IPCBUF_H__
-
-/*
- * The user_ipc_perm structure for S/390 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 32-bit mode_t and seq
- * - 2 miscellaneous 32-bit values
- */
-
-struct ipc64_perm
-{
-	__kernel_key_t		key;
-	__kernel_uid32_t	uid;
-	__kernel_gid32_t	gid;
-	__kernel_uid32_t	cuid;
-	__kernel_gid32_t	cgid;
-	__kernel_mode_t		mode;
-	unsigned short		__pad1;
-	unsigned short		seq;
-	unsigned long		__unused1;
-	unsigned long		__unused2;
-};
-
-#endif /* __S390_IPCBUF_H__ */
diff -Nru a/include/asm-s390x/irq.h b/include/asm-s390x/irq.h
--- a/include/asm-s390x/irq.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,29 +0,0 @@
-#ifndef _ASM_IRQ_H
-#define _ASM_IRQ_H
-
-#ifdef __KERNEL__
-#include <asm/hardirq.h>
-
-/*
- * the definition of irqs has changed in 2.5.46:
- * NR_IRQS is no longer the number of i/o
- * interrupts (65536), but rather the number
- * of interrupt classes (6).
- */
-
-enum interruption_class {
-	EXTERNAL_INTERRUPT,
-	IO_INTERRUPT,
-	MACHINE_CHECK_INTERRUPT,
-	PROGRAM_INTERRUPT,
-	RESTART_INTERRUPT,
-	SUPERVISOR_CALL,
-
-	NR_IRQS,
-};
-
-#define touch_nmi_watchdog() do { } while(0)
-
-#endif /* __KERNEL__ */
-#endif
-
diff -Nru a/include/asm-s390x/kmap_types.h b/include/asm-s390x/kmap_types.h
--- a/include/asm-s390x/kmap_types.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,23 +0,0 @@
-#ifdef __KERNEL__
-#ifndef _ASM_KMAP_TYPES_H
-#define _ASM_KMAP_TYPES_H
-
-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_IRQ0,
-	KM_IRQ1,
-	KM_SOFTIRQ0,
-	KM_SOFTIRQ1,	
-	KM_TYPE_NR
-};
-
-#endif
-#endif /* __KERNEL__ */
diff -Nru a/include/asm-s390x/linkage.h b/include/asm-s390x/linkage.h
--- a/include/asm-s390x/linkage.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,6 +0,0 @@
-#ifndef __ASM_LINKAGE_H
-#define __ASM_LINKAGE_H
-
-/* Nothing to see here... */
-
-#endif
diff -Nru a/include/asm-s390x/lowcore.h b/include/asm-s390x/lowcore.h
--- a/include/asm-s390x/lowcore.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,184 +0,0 @@
-
-/*
- *  include/asm-s390/lowcore.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hpenner@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com),
- *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- */
-
-#ifndef _ASM_S390_LOWCORE_H
-#define _ASM_S390_LOWCORE_H
-
-#define __LC_EXT_OLD_PSW                0x0130
-#define __LC_SVC_OLD_PSW                0x0140
-#define __LC_PGM_OLD_PSW                0x0150
-#define __LC_MCK_OLD_PSW                0x0160
-#define __LC_IO_OLD_PSW                 0x0170
-#define __LC_EXT_NEW_PSW                0x01b0
-#define __LC_SVC_NEW_PSW                0x01c0
-#define __LC_PGM_NEW_PSW                0x01d0
-#define __LC_MCK_NEW_PSW                0x01e0
-#define __LC_IO_NEW_PSW                 0x01f0
-#define __LC_EXT_PARAMS                 0x080
-#define __LC_CPU_ADDRESS                0x084
-#define __LC_EXT_INT_CODE               0x086
-#define __LC_SVC_ILC                    0x088
-#define __LC_SVC_INT_CODE               0x08A
-#define __LC_PGM_ILC                    0x08C
-#define __LC_PGM_INT_CODE               0x08E
-#define __LC_TRANS_EXC_ADDR             0x0a8
-#define __LC_SUBCHANNEL_ID              0x0B8
-#define __LC_SUBCHANNEL_NR              0x0BA
-#define __LC_IO_INT_PARM                0x0BC
-#define __LC_IO_INT_WORD                0x0C0
-#define __LC_MCCK_CODE                  0x0E8
-
-#define __LC_RETURN_PSW                 0x200
-#define __LC_IRB			0x210
-#define __LC_DIAG44_OPCODE		0x250
-
-#define __LC_SAVE_AREA                  0xC00
-#define __LC_KERNEL_STACK               0xD40
-#define __LC_ASYNC_STACK                0xD48
-#define __LC_CPUID                      0xD90
-#define __LC_CPUADDR                    0xD98
-#define __LC_IPLDEV                     0xDB8
-
-#define __LC_JIFFY_TIMER		0xDC0
-
-#define __LC_PANIC_MAGIC                0xE00
-
-#define __LC_AREGS_SAVE_AREA            0x1340
-#define __LC_CREGS_SAVE_AREA            0x1380
-
-#define __LC_PFAULT_INTPARM             0x11B8
-
-#ifndef __ASSEMBLY__
-
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <linux/types.h>
-#include <asm/atomic.h>
-#include <asm/sigp.h>
-
-void restart_int_handler(void);
-void ext_int_handler(void);
-void system_call(void);
-void pgm_check_handler(void);
-void mcck_int_handler(void);
-void io_int_handler(void);
-
-struct _lowcore
-{
-        /* prefix area: defined by architecture */
-	__u32        ccw1[2];                  /* 0x000 */
-	__u32        ccw2[4];                  /* 0x008 */
-	__u8         pad1[0x80-0x18];          /* 0x018 */
-	__u32        ext_params;               /* 0x080 */
-	__u16        cpu_addr;                 /* 0x084 */
-	__u16        ext_int_code;             /* 0x086 */
-        __u16        svc_ilc;                  /* 0x088 */
-        __u16        svc_code;                 /* 0x08a */
-        __u16        pgm_ilc;                  /* 0x08c */
-        __u16        pgm_code;                 /* 0x08e */
-	__u32        data_exc_code;            /* 0x090 */
-	__u16        mon_class_num;            /* 0x094 */
-	__u16        per_perc_atmid;           /* 0x096 */
-	addr_t       per_address;              /* 0x098 */
-	__u8         exc_access_id;            /* 0x0a0 */
-	__u8         per_access_id;            /* 0x0a1 */
-	__u8         op_access_id;             /* 0x0a2 */
-	__u8         ar_access_id;             /* 0x0a3 */
-	__u8         pad2[0xA8-0xA4];          /* 0x0a4 */
-	addr_t       trans_exc_code;           /* 0x0A0 */
-	addr_t       monitor_code;             /* 0x09c */
-	__u16        subchannel_id;            /* 0x0b8 */
-	__u16        subchannel_nr;            /* 0x0ba */
-	__u32        io_int_parm;              /* 0x0bc */
-	__u32        io_int_word;              /* 0x0c0 */
-	__u8         pad3[0xc8-0xc4];          /* 0x0c4 */
-	__u32        stfl_fac_list;            /* 0x0c8 */
-	__u8         pad4[0xe8-0xcc];          /* 0x0cc */
-	__u32        mcck_interruption_code[2]; /* 0x0e8 */
-	__u8         pad5[0xf4-0xf0];          /* 0x0f0 */
-	__u32        external_damage_code;     /* 0x0f4 */
-	addr_t       failing_storage_address;  /* 0x0f8 */
-	__u8         pad6[0x120-0x100];        /* 0x100 */
-	psw_t        restart_old_psw;          /* 0x120 */
-	psw_t        external_old_psw;         /* 0x130 */
-	psw_t        svc_old_psw;              /* 0x140 */
-	psw_t        program_old_psw;          /* 0x150 */
-	psw_t        mcck_old_psw;             /* 0x160 */
-	psw_t        io_old_psw;               /* 0x170 */
-	__u8         pad7[0x1a0-0x180];        /* 0x180 */
-	psw_t        restart_psw;              /* 0x1a0 */
-	psw_t        external_new_psw;         /* 0x1b0 */
-	psw_t        svc_new_psw;              /* 0x1c0 */
-	psw_t        program_new_psw;          /* 0x1d0 */
-	psw_t        mcck_new_psw;             /* 0x1e0 */
-	psw_t        io_new_psw;               /* 0x1f0 */
-        psw_t        return_psw;               /* 0x200 */
-	__u8	     irb[64];		       /* 0x210 */
-	__u32        diag44_opcode;            /* 0x250 */
-        __u8         pad8[0xc00-0x254];        /* 0x254 */
-        /* System info area */
-	__u64        save_area[16];            /* 0xc00 */
-        __u8         pad9[0xd40-0xc80];        /* 0xc80 */
- 	__u64        kernel_stack;             /* 0xd40 */
-	__u64        async_stack;              /* 0xd48 */
-	/* entry.S sensitive area start */
-	__u8         pad10[0xd80-0xd50];       /* 0xd64 */
-	struct       cpuinfo_S390 cpu_data;    /* 0xd80 */
-	__u32        ipl_device;               /* 0xdb8 */
-	__u32        pad11;                    /* 0xdbc */
-	/* entry.S sensitive area end */
-
-        /* SMP info area: defined by DJB */
-        __u64        jiffy_timer;              /* 0xdc0 */
-	__u64        ext_call_fast;            /* 0xdc8 */
-        __u8         pad12[0xe00-0xdd0];       /* 0xdd0 */
-
-        /* 0xe00 is used as indicator for dump tools */
-        /* whether the kernel died with panic() or not */
-        __u32        panic_magic;              /* 0xe00 */
-
-	__u8         pad13[0x1200-0xe04];      /* 0xe04 */
-
-        /* System info area */ 
-
-	__u64        floating_pt_save_area[16]; /* 0x1200 */
-	__u64        gpregs_save_area[16];      /* 0x1280 */
-	__u32        st_status_fixed_logout[4]; /* 0x1300 */
-	__u8         pad14[0x1318-0x1310];      /* 0x1310 */
-	__u32        prefixreg_save_area;       /* 0x1318 */
-	__u32        fpt_creg_save_area;        /* 0x131c */
-	__u8         pad15[0x1324-0x1320];      /* 0x1320 */
-	__u32        tod_progreg_save_area;     /* 0x1324 */
-	__u32        cpu_timer_save_area[2];    /* 0x1328 */
-	__u32        clock_comp_save_area[2];   /* 0x1330 */
-	__u8         pad16[0x1340-0x1338];      /* 0x1338 */ 
-	__u32        access_regs_save_area[16]; /* 0x1340 */ 
-	__u64        cregs_save_area[16];       /* 0x1380 */
-
-	/* align to the top of the prefix area */
-
-	__u8         pad17[0x2000-0x1400];      /* 0x1400 */
-} __attribute__((packed)); /* End structure*/
-
-#define S390_lowcore (*((struct _lowcore *) 0))
-extern struct _lowcore *lowcore_ptr[];
-
-extern __inline__ void set_prefix(__u32 address)
-{
-        __asm__ __volatile__ ("spx %0" : : "m" (address) : "memory" );
-}
-
-#define __PANIC_MAGIC           0xDEADC0DE
-
-#endif
-
-#endif
-
diff -Nru a/include/asm-s390x/mman.h b/include/asm-s390x/mman.h
--- a/include/asm-s390x/mman.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,49 +0,0 @@
-/*
- *  include/asm-s390/mman.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/mman.h"
- */
-
-#ifndef __S390_MMAN_H__
-#define __S390_MMAN_H__
-
-#define PROT_READ	0x1		/* page can be read */
-#define PROT_WRITE	0x2		/* page can be written */
-#define PROT_EXEC	0x4		/* page can be executed */
-#define PROT_SEM	0x8		/* page may be used for atomic ops */
-#define PROT_NONE	0x0		/* page can not be accessed */
-
-#define MAP_SHARED	0x01		/* Share changes */
-#define MAP_PRIVATE	0x02		/* Changes are private */
-#define MAP_TYPE	0x0f		/* Mask for type of mapping */
-#define MAP_FIXED	0x10		/* Interpret addr exactly */
-#define MAP_ANONYMOUS	0x20		/* don't use a file */
-
-#define MAP_GROWSDOWN	0x0100		/* stack-like segment */
-#define MAP_DENYWRITE	0x0800		/* ETXTBSY */
-#define MAP_EXECUTABLE	0x1000		/* mark it as an executable */
-#define MAP_LOCKED	0x2000		/* pages are locked */
-#define MAP_NORESERVE	0x4000		/* don't check for reservations */
-#define MAP_POPULATE	0x8000		/* populate (prefault) pagetables */
-#define MAP_NONBLOCK	0x10000		/* do not block on IO */
-
-#define MS_ASYNC	1		/* sync memory asynchronously */
-#define MS_INVALIDATE	2		/* invalidate the caches */
-#define MS_SYNC		4		/* synchronous memory sync */
-
-#define MCL_CURRENT	1		/* lock all current mappings */
-#define MCL_FUTURE	2		/* lock all future mappings */
-
-#define MADV_NORMAL    0x0              /* default page-in behavior */
-#define MADV_RANDOM    0x1              /* page-in minimum required */
-#define MADV_SEQUENTIAL        0x2             /* read-ahead aggressively */
-#define MADV_WILLNEED  0x3              /* pre-fault pages */
-#define MADV_DONTNEED  0x4              /* discard these pages */
-
-/* compatibility flags */
-#define MAP_ANON	MAP_ANONYMOUS
-#define MAP_FILE	0
-
-#endif /* __S390_MMAN_H__ */
diff -Nru a/include/asm-s390x/mmu.h b/include/asm-s390x/mmu.h
--- a/include/asm-s390x/mmu.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,7 +0,0 @@
-#ifndef __MMU_H
-#define __MMU_H
-
-/* Default "unsigned long" context */
-typedef unsigned long mm_context_t;
-
-#endif
diff -Nru a/include/asm-s390x/mmu_context.h b/include/asm-s390x/mmu_context.h
--- a/include/asm-s390x/mmu_context.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,47 +0,0 @@
-/*
- *  include/asm-s390/mmu_context.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/mmu_context.h"
- */
-
-#ifndef __S390_MMU_CONTEXT_H
-#define __S390_MMU_CONTEXT_H
-
-/*
- * get a new mmu context.. S390 don't know about contexts.
- */
-#define init_new_context(tsk,mm)        0
-
-#define destroy_context(mm)             flush_tlb_mm(mm)
-
-static inline void enter_lazy_tlb(struct mm_struct *mm,
-                                  struct task_struct *tsk, unsigned cpu)
-{
-}
-
-static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
-                             struct task_struct *tsk, unsigned cpu)
-{
-        unsigned long pgd;
-
-        if (prev != next) {
-                pgd = (__pa(next->pgd)&PAGE_MASK) | (_REGION_TABLE|USER_STD_MASK);
-                /* Load page tables */
-                asm volatile("    lctlg 7,7,%0\n"   /* secondary space */
-                             "    lctlg 13,13,%0\n" /* home space */
-                             : : "m" (pgd) );
-        }
-	set_bit(cpu, &next->cpu_vm_mask);
-}
-
-#define deactivate_mm(tsk,mm)	do { } while (0)
-
-extern inline void activate_mm(struct mm_struct *prev,
-                               struct mm_struct *next)
-{
-        switch_mm(prev, next, current, smp_processor_id());
-}
-
-#endif
diff -Nru a/include/asm-s390x/module.h b/include/asm-s390x/module.h
--- a/include/asm-s390x/module.h	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,43 +0,0 @@
-#ifndef _ASM_S390_MODULE_H
-#define _ASM_S390_MODULE_H
-/*
- * This file contains the s390 architecture specific module code.
- */
-
-struct mod_arch_syminfo
-{
-	unsigned long got_offset;
-	unsigned long plt_offset;
-	int got_initialized;
-	int plt_initialized;
-};
-
-struct mod_arch_specific
-{
-	/* Starting offset of got in the module core memory. */
-	unsigned long got_offset;
-	/* Starting offset of plt in the module core memory. */
-	unsigned long plt_offset;
-	/* Size of the got. */
-	unsigned long got_size;
-	/* Size of the plt. */
-	unsigned long plt_size;
-	/* Number of symbols in syminfo. */
-	int nsyms;
-	/* Additional symbol information (got and plt offsets). */
-	struct mod_arch_syminfo *syminfo;
-};
-
-#ifdef CONFIG_ARCH_S390X
-#define ElfW(x) Elf64_ ## x
-#define ELFW(x) ELF64_ ## x
-#else
-#define ElfW(x) Elf32_ ## x
-#define ELFW(x) ELF64_ ## x
-#endif
-
-#define Elf_Shdr ElfW(Shdr)
-#define Elf_Sym ElfW(Sym)
-#define Elf_Ehdr ElfW(Ehdr)
-#define ELF_R_TYPE ELFW(R_TYPE)
-#endif /* _ASM_S390_MODULE_H */
diff -Nru a/include/asm-s390x/msgbuf.h b/include/asm-s390x/msgbuf.h
--- a/include/asm-s390x/msgbuf.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,27 +0,0 @@
-#ifndef _S390_MSGBUF_H
-#define _S390_MSGBUF_H
-
-/* 
- * The msqid64_ds structure for S/390 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 2 miscellaneous 64-bit values
- */
-
-struct msqid64_ds {
-	struct ipc64_perm msg_perm;
-	__kernel_time_t msg_stime;	/* last msgsnd time */
-	__kernel_time_t msg_rtime;	/* last msgrcv time */
-	__kernel_time_t msg_ctime;	/* last change time */
-	unsigned long  msg_cbytes;	/* current number of bytes on queue */
-	unsigned long  msg_qnum;	/* number of messages in queue */
-	unsigned long  msg_qbytes;	/* max number of bytes on queue */
-	__kernel_pid_t msg_lspid;	/* pid of last msgsnd */
-	__kernel_pid_t msg_lrpid;	/* last receive pid */
-	unsigned long  __unused1;
-	unsigned long  __unused2;
-};
-
-#endif /* _S390_MSGBUF_H */
diff -Nru a/include/asm-s390x/namei.h b/include/asm-s390x/namei.h
--- a/include/asm-s390x/namei.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,21 +0,0 @@
-/*
- *  include/asm-s390/namei.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/namei.h"
- *
- *  Included from linux/fs/namei.c
- */
-
-#ifndef __S390_NAMEI_H
-#define __S390_NAMEI_H
-
-/* This dummy routine maybe changed to something useful
- * for /usr/gnemul/ emulation stuff.
- * Look at asm-sparc/namei.h for details.
- */
-
-#define __emul_prefix() NULL
-
-#endif /* __S390_NAMEI_H */
diff -Nru a/include/asm-s390x/page.h b/include/asm-s390x/page.h
--- a/include/asm-s390x/page.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,120 +0,0 @@
-/*
- *  include/asm-s390/page.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hpenner@de.ibm.com)
- */
-
-#ifndef _S390_PAGE_H
-#define _S390_PAGE_H
-
-#include <asm/setup.h>
-
-/* PAGE_SHIFT determines the page size */
-#define PAGE_SHIFT      12
-#define PAGE_SIZE       (1UL << PAGE_SHIFT)
-#define PAGE_MASK       (~(PAGE_SIZE-1))
-
-#ifdef __KERNEL__
-#ifndef __ASSEMBLY__
-
-static inline void clear_page(void *page)
-{
-        asm volatile ("   lgr  2,%0\n"
-                      "   lghi 3,4096\n"
-                      "   slgr 1,1\n"
-                      "   mvcl 2,0"
-                      : : "a" ((void *) (page))
-		      : "memory", "cc", "1", "2", "3" );
-}
-
-static inline void copy_page(void *to, void *from)
-{
-        if (MACHINE_HAS_MVPG)
-		asm volatile ("   sgr  0,0\n"
-			      "   mvpg %0,%1"
-			      : : "a" ((void *)(to)), "a" ((void *)(from))
-			      : "memory", "cc", "0" );
-	else
-		asm volatile ("   mvc  0(256,%0),0(%1)\n"
-			      "   mvc  256(256,%0),256(%1)\n"
-			      "   mvc  512(256,%0),512(%1)\n"
-			      "   mvc  768(256,%0),768(%1)\n"
-			      "   mvc  1024(256,%0),1024(%1)\n"
-			      "   mvc  1280(256,%0),1280(%1)\n"
-			      "   mvc  1536(256,%0),1536(%1)\n"
-			      "   mvc  1792(256,%0),1792(%1)\n"
-			      "   mvc  2048(256,%0),2048(%1)\n"
-			      "   mvc  2304(256,%0),2304(%1)\n"
-			      "   mvc  2560(256,%0),2560(%1)\n"
-			      "   mvc  2816(256,%0),2816(%1)\n"
-			      "   mvc  3072(256,%0),3072(%1)\n"
-			      "   mvc  3328(256,%0),3328(%1)\n"
-			      "   mvc  3584(256,%0),3584(%1)\n"
-			      "   mvc  3840(256,%0),3840(%1)\n"
-			      : : "a"((void *)(to)),"a"((void *)(from)) 
-			      : "memory" );
-}
-
-#define clear_user_page(page, vaddr, pg)    clear_page(page)
-#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
-
-/* Pure 2^n version of get_order */
-extern __inline__ int get_order(unsigned long size)
-{
-        int order;
-
-        size = (size-1) >> (PAGE_SHIFT-1);
-        order = -1;
-        do {
-                size >>= 1;
-                order++;
-        } while (size);
-        return order;
-}
-
-/*
- * These are used to make use of C type-checking..
- */
-typedef struct { unsigned long pte; } pte_t;
-typedef struct { 
-        unsigned long pmd0;
-        unsigned long pmd1; 
-        } pmd_t;
-typedef struct { unsigned long pgd; } pgd_t;
-typedef struct { unsigned long pgprot; } pgprot_t;
-
-#define pte_val(x)      ((x).pte)
-#define pmd_val(x)      ((x).pmd0)
-#define pmd_val1(x)     ((x).pmd1)
-#define pgd_val(x)      ((x).pgd)
-#define pgprot_val(x)   ((x).pgprot)
-
-#define __pte(x)        ((pte_t) { (x) } )
-#define __pmd(x)        ((pmd_t) { (x) } )
-#define __pgd(x)        ((pgd_t) { (x) } )
-#define __pgprot(x)     ((pgprot_t) { (x) } )
-
-#endif                                 /* !__ASSEMBLY__                    */
-
-/* to align the pointer to the (next) page boundary */
-#define PAGE_ALIGN(addr)        (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-
-#define __PAGE_OFFSET           0x0UL
-#define PAGE_OFFSET             0x0UL
-#define __pa(x)                 (unsigned long)(x)
-#define __va(x)                 (void *)(unsigned long)(x)
-#define pfn_to_page(pfn)	(mem_map + (pfn))
-#define page_to_pfn(page)	((unsigned long)((page) - mem_map))
-#define virt_to_page(kaddr)	pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-
-#define pfn_valid(pfn)		((pfn) < max_mapnr)
-#define virt_addr_valid(kaddr)	pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-
-#define VM_DATA_DEFAULT_FLAGS	(VM_READ | VM_WRITE | VM_EXEC | \
-				 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-
-#endif                                 /* __KERNEL__                       */
-
-#endif                                 /* _S390_PAGE_H                     */
diff -Nru a/include/asm-s390x/param.h b/include/asm-s390x/param.h
--- a/include/asm-s390x/param.h	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,34 +0,0 @@
-/*
- *  include/asm-s390/param.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/param.h"
- */
-
-#ifndef _ASMS390_PARAM_H
-#define _ASMS390_PARAM_H
-
-#ifdef __KERNEL__
-# define HZ		100		/* Internal kernel timer frequency */
-# define USER_HZ	100		/* .. some user interfaces are in "ticks" */
-# define CLOCKS_PER_SEC	(USER_HZ)	/* like times() */
-#endif
-
-#ifndef HZ
-#define HZ 100
-#endif
-
-#define EXEC_PAGESIZE	4096
-
-#ifndef NGROUPS
-#define NGROUPS		32
-#endif
-
-#ifndef NOGROUP
-#define NOGROUP		(-1)
-#endif
-
-#define MAXHOSTNAMELEN	64	/* max length of hostname */
-
-#endif
diff -Nru a/include/asm-s390x/pci.h b/include/asm-s390x/pci.h
--- a/include/asm-s390x/pci.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,10 +0,0 @@
-#ifndef __ASM_S390_PCI_H
-#define __ASM_S390_PCI_H
-
-/* S/390 systems don't have a PCI bus. This file is just here because some stupid .c code
- * includes it even if CONFIG_PCI is not set.
- */
-#define PCI_DMA_BUS_IS_PHYS (1)
-
-#endif /* __ASM_S390_PCI_H */
-
diff -Nru a/include/asm-s390x/percpu.h b/include/asm-s390x/percpu.h
--- a/include/asm-s390x/percpu.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,6 +0,0 @@
-#ifndef __ARCH_S390X_PERCPU__
-#define __ARCH_S390X_PERCPU__
-
-#include <asm-generic/percpu.h>
-
-#endif /* __ARCH_S390X_PERCPU__ */
diff -Nru a/include/asm-s390x/pgalloc.h b/include/asm-s390x/pgalloc.h
--- a/include/asm-s390x/pgalloc.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,154 +0,0 @@
-/*
- *  include/asm-s390/pgalloc.h
- *
- *  S390 version
- *    Copyright (C) 1999, 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hpenner@de.ibm.com)
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/pgalloc.h"
- *    Copyright (C) 1994  Linus Torvalds
- */
-
-#ifndef _S390_PGALLOC_H
-#define _S390_PGALLOC_H
-
-#include <linux/config.h>
-#include <asm/processor.h>
-#include <linux/threads.h>
-#include <linux/gfp.h>
-#include <linux/mm.h>
-
-#define check_pgt_cache()	do { } while (0)
-
-/*
- * Allocate and free page tables. The xxx_kernel() versions are
- * used to allocate a kernel page table - this turns on ASN bits
- * if any.
- */
-
-static inline pgd_t *pgd_alloc (struct mm_struct *mm)
-{
-	pgd_t *pgd;
-	int i;
-
-	pgd = (pgd_t *) __get_free_pages(GFP_KERNEL,2);
-        if (pgd != NULL)
-		for (i = 0; i < PTRS_PER_PGD; i++)
-			pgd_clear(pgd + i);
-	return pgd;
-}
-
-static inline void pgd_free (pgd_t *pgd)
-{
-        free_pages((unsigned long) pgd, 2);
-}
-
-static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
-{
-	pgd_val(*pgd) = _PGD_ENTRY | __pa(pmd);
-}
-
-/*
- * page middle directory allocation/free routines.
- */
-static inline pmd_t * pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr)
-{
-	pmd_t *pmd;
-        int i;
-
-	pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, 2);
-	if (pmd != NULL) {
-		for (i=0; i < PTRS_PER_PMD; i++)
-			pmd_clear(pmd+i);
-	}
-	return pmd;
-}
-
-static inline void pmd_free (pmd_t *pmd)
-{
-	free_pages((unsigned long) pmd, 2);
-}
-
-#define __pmd_free_tlb(tlb,pmd) pmd_free(pmd)
-
-static inline void
-pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
-{
-	pmd_val(*pmd) = _PMD_ENTRY + __pa(pte);
-	pmd_val1(*pmd) = _PMD_ENTRY + __pa(pte+256);
-}
-
-static inline void
-pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *page)
-{
-	pmd_populate_kernel(mm, pmd, (pte_t *)((page-mem_map) << PAGE_SHIFT));
-}
-
-/*
- * page table entry allocation/free routines.
- */
-static inline pte_t *
-pte_alloc_one_kernel(struct mm_struct *mm, unsigned long vmaddr)
-{
-	pte_t *pte;
-	int count;
-        int i;
-
-	count = 0;
-	do {
-		pte = (pte_t *) __get_free_page(GFP_KERNEL);
-		if (pte != NULL) {
-			for (i=0; i < PTRS_PER_PTE; i++)
-				pte_clear(pte+i);
-		} else {
-			current->state = TASK_UNINTERRUPTIBLE;
-			schedule_timeout(HZ);
-		}
-	} while (!pte && (count++ < 10));
-	return pte;
-}
-
-static inline struct page *
-pte_alloc_one(struct mm_struct *mm, unsigned long addr)
-{
-	return virt_to_page(pte_alloc_one_kernel(mm, addr));
-}
-
-static inline void pte_free_kernel(pte_t *pte)
-{
-        free_page((unsigned long) pte);
-}
-
-static inline void pte_free(struct page *pte)
-{
-        __free_page(pte);
-}
-
-#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
-
-/*
- * This establishes kernel virtual mappings (e.g., as a result of a
- * vmalloc call).  Since s390-esame uses a separate kernel page table,
- * there is nothing to do here... :)
- */
-#define set_pgdir(vmaddr, entry)	do { } while(0)
-
-static inline pte_t ptep_invalidate(struct vm_area_struct *vma, 
-                                    unsigned long address, pte_t *ptep)
-{
-	pte_t pte = *ptep;
-	if (!(pte_val(pte) & _PAGE_INVALID)) 
-		__asm__ __volatile__ ("ipte %0,%1" : : "a" (ptep), "a" (address));
-	pte_clear(ptep);
-	return pte;
-}
-
-static inline void ptep_establish(struct vm_area_struct *vma, 
-                                  unsigned long address, pte_t *ptep, pte_t entry)
-{
-	ptep_invalidate(vma, address, ptep);
-	set_pte(ptep, entry);
-}
-
-#endif /* _S390_PGALLOC_H */
diff -Nru a/include/asm-s390x/pgtable.h b/include/asm-s390x/pgtable.h
--- a/include/asm-s390x/pgtable.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,550 +0,0 @@
-/*
- *  include/asm-s390/pgtable.h
- *
- *  S390 64bit version
- *    Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com)
- *               Ulrich Weigand (weigand@de.ibm.com)
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/pgtable.h"
- */
-
-#ifndef _ASM_S390_PGTABLE_H
-#define _ASM_S390_PGTABLE_H
-
-/*
- * The Linux memory management assumes a three-level page table setup. On
- * the S390, we use that, but "fold" the mid level into the top-level page
- * table, so that we physically have the same two-level page table as the
- * S390 mmu expects.
- *
- * This file contains the functions and defines necessary to modify and use
- * the S390 page table tree.
- */
-#ifndef __ASSEMBLY__
-#include <asm/processor.h>
-#include <linux/threads.h>
-
-extern pgd_t swapper_pg_dir[] __attribute__ ((aligned (4096)));
-extern void paging_init(void);
-
-/*
- * The S390 doesn't have any external MMU info: the kernel page
- * tables contain all the necessary information.
- */
-#define update_mmu_cache(vma, address, pte)     do { } while (0)
-
-/*
- * ZERO_PAGE is a global shared page that is always zero: used
- * for zero-mapped memory areas etc..
- */
-extern char empty_zero_page[PAGE_SIZE];
-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
-#endif /* !__ASSEMBLY__ */
-
-/*
- * PMD_SHIFT determines the size of the area a second-level page
- * table can map
- */
-#define PMD_SHIFT       21
-#define PMD_SIZE        (1UL << PMD_SHIFT)
-#define PMD_MASK        (~(PMD_SIZE-1))
-
-/* PGDIR_SHIFT determines what a third-level page table entry can map */
-#define PGDIR_SHIFT     31
-#define PGDIR_SIZE      (1UL << PGDIR_SHIFT)
-#define PGDIR_MASK      (~(PGDIR_SIZE-1))
-
-/*
- * entries per page directory level: the S390 is two to five-level,
- * currently we use a 3 level lookup
- */
-#define PTRS_PER_PTE    512
-#define PTRS_PER_PMD    1024
-#define PTRS_PER_PGD    2048
-
-/*
- * pgd entries used up by user/kernel:
- */
-#define USER_PTRS_PER_PGD  2048
-#define USER_PGD_PTRS      2048
-#define KERNEL_PGD_PTRS    2048
-#define FIRST_USER_PGD_NR  0
-
-#define pte_ERROR(e) \
-	printk("%s:%d: bad pte %016lx.\n", __FILE__, __LINE__, pte_val(e))
-#define pmd_ERROR(e) \
-	printk("%s:%d: bad pmd %016lx.\n", __FILE__, __LINE__, pmd_val(e))
-#define pgd_ERROR(e) \
-	printk("%s:%d: bad pgd %016lx.\n", __FILE__, __LINE__, pgd_val(e))
-
-#ifndef __ASSEMBLY__
-/*
- * Just any arbitrary offset to the start of the vmalloc VM area: the
- * current 8MB value just means that there will be a 8MB "hole" after the
- * physical memory until the kernel virtual memory starts.  That means that
- * any out-of-bounds memory accesses will hopefully be caught.
- * The vmalloc() routines leaves a hole of 4kB between each vmalloced
- * area for the same reason. ;)
- */
-#define VMALLOC_OFFSET  (8*1024*1024)
-#define VMALLOC_START   (((unsigned long) high_memory + VMALLOC_OFFSET) \
-                         & ~(VMALLOC_OFFSET-1))
-#define VMALLOC_VMADDR(x) ((unsigned long)(x))
-#define VMALLOC_END     (0x40000000000L)
-
-
-/*
- * A pagetable entry of S390 has following format:
- * |                     PFRA                         |0IP0|  OS  |
- * 0000000000111111111122222222223333333333444444444455555555556666
- * 0123456789012345678901234567890123456789012345678901234567890123
- *
- * I Page-Invalid Bit:    Page is not available for address-translation
- * P Page-Protection Bit: Store access not possible for page
- *
- * A segmenttable entry of S390 has following format:
- * |        P-table origin                              |      TT
- * 0000000000111111111122222222223333333333444444444455555555556666
- * 0123456789012345678901234567890123456789012345678901234567890123
- *
- * I Segment-Invalid Bit:    Segment is not available for address-translation
- * C Common-Segment Bit:     Segment is not private (PoP 3-30)
- * P Page-Protection Bit: Store access not possible for page
- * TT Type 00
- *
- * A region table entry of S390 has following format:
- * |        S-table origin                             |   TF  TTTL
- * 0000000000111111111122222222223333333333444444444455555555556666
- * 0123456789012345678901234567890123456789012345678901234567890123
- *
- * I Segment-Invalid Bit:    Segment is not available for address-translation
- * TT Type 01
- * TF
- * TL Table lenght
- *
- * The regiontable origin of S390 has following format:
- * |      region table origon                          |       DTTL
- * 0000000000111111111122222222223333333333444444444455555555556666
- * 0123456789012345678901234567890123456789012345678901234567890123
- *
- * X Space-Switch event:
- * G Segment-Invalid Bit:  
- * P Private-Space Bit:    
- * S Storage-Alteration:
- * R Real space
- * TL Table-Length:
- *
- * A storage key has the following format:
- * | ACC |F|R|C|0|
- *  0   3 4 5 6 7
- * ACC: access key
- * F  : fetch protection bit
- * R  : referenced bit
- * C  : changed bit
- */
-
-/* Bits in the page table entry */
-#define _PAGE_PRESENT   0x001          /* Software                         */
-#define _PAGE_MKCLEAN   0x002          /* Software                         */
-#define _PAGE_ISCLEAN   0x004          /* Software                         */
-#define _PAGE_RO        0x200          /* HW read-only                     */
-#define _PAGE_INVALID   0x400          /* HW invalid                       */
-
-/* Bits in the segment table entry */
-#define _PMD_ENTRY_INV   0x20          /* invalid segment table entry      */
-#define _PMD_ENTRY       0x00        
-
-/* Bits in the region third table entry */
-#define _PGD_ENTRY_INV   0x20          /* invalid region table entry       */
-#define _PGD_ENTRY       0x07
-
-/*
- * User and kernel page directory
- */
-#define _REGION_THIRD       0x4
-#define _REGION_THIRD_LEN   0x3 
-#define _REGION_TABLE       (_REGION_THIRD|_REGION_THIRD_LEN|0x40|0x100)
-#define _KERN_REGION_TABLE  (_REGION_THIRD|_REGION_THIRD_LEN)
-
-#define USER_STD_MASK           0x0000000000000080UL
-
-/* Bits in the storage key */
-#define _PAGE_CHANGED    0x02          /* HW changed bit                   */
-#define _PAGE_REFERENCED 0x04          /* HW referenced bit                */
-
-/*
- * No mapping available
- */
-#define PAGE_INVALID	  __pgprot(_PAGE_INVALID)
-#define PAGE_NONE_SHARED  __pgprot(_PAGE_PRESENT|_PAGE_INVALID)
-#define PAGE_NONE_PRIVATE __pgprot(_PAGE_PRESENT|_PAGE_INVALID|_PAGE_ISCLEAN)
-#define PAGE_RO_SHARED	  __pgprot(_PAGE_PRESENT|_PAGE_RO)
-#define PAGE_RO_PRIVATE	  __pgprot(_PAGE_PRESENT|_PAGE_RO|_PAGE_ISCLEAN)
-#define PAGE_COPY	  __pgprot(_PAGE_PRESENT|_PAGE_RO|_PAGE_ISCLEAN)
-#define PAGE_SHARED	  __pgprot(_PAGE_PRESENT)
-#define PAGE_KERNEL	  __pgprot(_PAGE_PRESENT)
-
-/*
- * The S390 can't do page protection for execute, and considers that the
- * same are read. Also, write permissions imply read permissions. This is
- * the closest we can get..
- */
-#define __P000  PAGE_NONE_PRIVATE
-#define __P001  PAGE_RO_PRIVATE
-#define __P010  PAGE_COPY
-#define __P011  PAGE_COPY
-#define __P100  PAGE_RO_PRIVATE
-#define __P101  PAGE_RO_PRIVATE
-#define __P110  PAGE_COPY
-#define __P111  PAGE_COPY
-
-#define __S000  PAGE_NONE_SHARED
-#define __S001  PAGE_RO_SHARED
-#define __S010  PAGE_SHARED
-#define __S011  PAGE_SHARED
-#define __S100  PAGE_RO_SHARED
-#define __S101  PAGE_RO_SHARED
-#define __S110  PAGE_SHARED
-#define __S111  PAGE_SHARED
-
-/*
- * Certain architectures need to do special things when PTEs
- * within a page table are directly modified.  Thus, the following
- * hook is made available.
- */
-extern inline void set_pte(pte_t *pteptr, pte_t pteval)
-{
-	if ((pte_val(pteval) & (_PAGE_MKCLEAN|_PAGE_INVALID))
-	    == _PAGE_MKCLEAN) 
-	{
-		pte_val(pteval) &= ~_PAGE_MKCLEAN;
-               
-		asm volatile ("sske %0,%1" 
-				: : "d" (0), "a" (pte_val(pteval)));
-	}
-
-	*pteptr = pteval;
-}
-
-/*
- * pgd/pmd/pte query functions
- */
-extern inline int pgd_present(pgd_t pgd)
-{
-	return (pgd_val(pgd) & ~PAGE_MASK) == _PGD_ENTRY;
-}
-
-extern inline int pgd_none(pgd_t pgd)
-{
-	return pgd_val(pgd) & _PGD_ENTRY_INV;
-}
-
-extern inline int pgd_bad(pgd_t pgd)
-{
-	return (pgd_val(pgd) & (~PAGE_MASK & ~_PGD_ENTRY_INV)) != _PGD_ENTRY;
-}
-
-extern inline int pmd_present(pmd_t pmd)
-{
-	return (pmd_val(pmd) & ~PAGE_MASK) == _PMD_ENTRY;
-}
-
-extern inline int pmd_none(pmd_t pmd)
-{
-	return pmd_val(pmd) & _PMD_ENTRY_INV;
-}
-
-extern inline int pmd_bad(pmd_t pmd)
-{
-	return (pmd_val(pmd) & (~PAGE_MASK & ~_PMD_ENTRY_INV)) != _PMD_ENTRY;
-}
-
-extern inline int pte_present(pte_t pte)
-{
-	return pte_val(pte) & _PAGE_PRESENT;
-}
-
-extern inline int pte_none(pte_t pte)
-{
-	return ((pte_val(pte) & 
-		 (_PAGE_INVALID | _PAGE_RO | _PAGE_PRESENT)) == _PAGE_INVALID);
-} 
-
-#define pte_same(a,b)	(pte_val(a) == pte_val(b))
-
-/*
- * query functions pte_write/pte_dirty/pte_young only work if
- * pte_present() is true. Undefined behaviour if not..
- */
-extern inline int pte_write(pte_t pte)
-{
-	return (pte_val(pte) & _PAGE_RO) == 0;
-}
-
-extern inline int pte_dirty(pte_t pte)
-{
-	int skey;
-
-	if (pte_val(pte) & _PAGE_ISCLEAN)
-		return 0;
-	asm volatile ("iske %0,%1" : "=d" (skey) : "a" (pte_val(pte)));
-	return skey & _PAGE_CHANGED;
-}
-
-extern inline int pte_young(pte_t pte)
-{
-	int skey;
-
-	asm volatile ("iske %0,%1" : "=d" (skey) : "a" (pte_val(pte)));
-	return skey & _PAGE_REFERENCED;
-}
-
-/*
- * pgd/pmd/pte modification functions
- */
-extern inline void pgd_clear(pgd_t * pgdp)
-{
-	pgd_val(*pgdp) = _PGD_ENTRY_INV | _PGD_ENTRY;
-}
-
-extern inline void pmd_clear(pmd_t * pmdp)
-{
-	pmd_val(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY;
-	pmd_val1(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY;
-}
-
-extern inline void pte_clear(pte_t *ptep)
-{
-	pte_val(*ptep) = _PAGE_INVALID;
-}
-
-/*
- * The following pte_modification functions only work if 
- * pte_present() is true. Undefined behaviour if not..
- */
-extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-{
-	pte_val(pte) &= PAGE_MASK | _PAGE_ISCLEAN;
-	pte_val(pte) |= pgprot_val(newprot) & ~_PAGE_ISCLEAN;
-	return pte; 
-}
-
-extern inline pte_t pte_wrprotect(pte_t pte)
-{
-	pte_val(pte) |= _PAGE_RO;
-	return pte;
-}
-
-extern inline pte_t pte_mkwrite(pte_t pte)
-{
-	pte_val(pte) &= ~(_PAGE_RO | _PAGE_ISCLEAN);
-	return pte;
-}
-
-extern inline pte_t pte_mkclean(pte_t pte)
-{
-	/* The only user of pte_mkclean is the fork() code.
-	   We must *not* clear the *physical* page dirty bit
-	   just because fork() wants to clear the dirty bit in
-	   *one* of the page's mappings.  So we just do nothing. */
-	return pte;
-}
-
-extern inline pte_t pte_mkdirty(pte_t pte)
-{ 
-	/* We do not explicitly set the dirty bit because the
-	 * sske instruction is slow. It is faster to let the
-	 * next instruction set the dirty bit.
-	 */
-	pte_val(pte) &= ~(_PAGE_MKCLEAN | _PAGE_ISCLEAN);
-	return pte;
-}
-
-extern inline pte_t pte_mkold(pte_t pte)
-{
-	asm volatile ("rrbe 0,%0" : : "a" (pte_val(pte)) : "cc" );
-	return pte;
-}
-
-extern inline pte_t pte_mkyoung(pte_t pte)
-{
-	/* To set the referenced bit we read the first word from the real
-	 * page with a special instruction: load using real address (lura).
-	 * Isn't S/390 a nice architecture ?! */
-	asm volatile ("lura 0,%0" : : "a" (pte_val(pte) & PAGE_MASK) : "0" );
-	return pte;
-}
-
-static inline int ptep_test_and_clear_young(pte_t *ptep)
-{
-	int ccode;
-
-	asm volatile ("rrbe 0,%1\n\t"
-		      "ipm  %0\n\t"
-		      "srl  %0,28\n\t"
-		      : "=d" (ccode) : "a" (pte_val(*ptep)) : "cc" );
-	return ccode & 2;
-}
-
-static inline int ptep_test_and_clear_dirty(pte_t *ptep)
-{
-	int skey;
-
-	if (pte_val(*ptep) & _PAGE_ISCLEAN)
-		return 0;
-	asm volatile ("iske %0,%1" : "=d" (skey) : "a" (*ptep));
-	if ((skey & _PAGE_CHANGED) == 0)
-		return 0;
-	/* We can't clear the changed bit atomically. For now we
-         * clear (!) the page referenced bit. */
-	asm volatile ("sske %0,%1" 
-	              : : "d" (0), "a" (*ptep));
-	return 1;
-}
-
-static inline pte_t ptep_get_and_clear(pte_t *ptep)
-{
-	pte_t pte = *ptep;
-	pte_clear(ptep);
-	return pte;
-}
-
-static inline void ptep_set_wrprotect(pte_t *ptep)
-{
-	pte_t old_pte = *ptep;
-	set_pte(ptep, pte_wrprotect(old_pte));
-}
-
-static inline void ptep_mkdirty(pte_t *ptep)
-{
-	pte_mkdirty(*ptep);
-}
-
-/*
- * Conversion functions: convert a page and protection to a page entry,
- * and a page entry and page directory to the page they refer to.
- */
-extern inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
-{
-	pte_t __pte;
-	pte_val(__pte) = physpage + pgprot_val(pgprot);
-	return __pte;
-}
-
-#define mk_pte(pg, pgprot)                                                \
-({                                                                        \
-	struct page *__page = (pg);                                       \
-	pgprot_t __pgprot = (pgprot);					  \
-	unsigned long __physpage = __pa((__page-mem_map) << PAGE_SHIFT);  \
-	pte_t __pte = mk_pte_phys(__physpage, __pgprot);                  \
- 	                                                                  \
-	if (!(pgprot_val(__pgprot) & _PAGE_ISCLEAN)) {			  \
-		int __users = !!PagePrivate(__page) + !!__page->mapping;  \
-		if (__users + page_count(__page) == 1)                    \
-			pte_val(__pte) |= _PAGE_MKCLEAN;                  \
-	}								  \
-	__pte;                                                            \
-})
-
-#define pfn_pte(pfn, pgprot)                                              \
-({                                                                        \
-	struct page *__page = mem_map+(pfn);                              \
-	pgprot_t __pgprot = (pgprot);					  \
-	unsigned long __physpage = __pa((pfn) << PAGE_SHIFT);             \
-	pte_t __pte = mk_pte_phys(__physpage, __pgprot);                  \
-	                                                                  \
-	if (!(pgprot_val(__pgprot) & _PAGE_ISCLEAN)) {			  \
-		int __users = !!PagePrivate(__page) + !!__page->mapping;  \
-		if (__users + page_count(__page) == 1)                    \
-			pte_val(__pte) |= _PAGE_MKCLEAN;                  \
-	}								  \
-	__pte;                                                            \
-})
-
-#define pfn_pmd(pfn, pgprot)                                              \
-({                                                                        \
-	pgprot_t __pgprot = (pgprot);                                     \
-	unsigned long __physpage = __pa((pfn) << PAGE_SHIFT);             \
-	pmd_t __pmd = __pmd(__physpage + pgprot_val(__pgprot));           \
-	__pmd;                                                            \
-})
-
-#define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT)
-#define pte_page(x) pfn_to_page(pte_pfn(x))
-
-#define pmd_page_kernel(pmd) (pmd_val(pmd) & PAGE_MASK)
-
-#define pmd_page(pmd) (mem_map+(pmd_val(pmd) >> PAGE_SHIFT))
-
-#define pgd_page_kernel(pgd) (pgd_val(pgd) & PAGE_MASK)
-
-/* to find an entry in a page-table-directory */
-#define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
-
-/* to find an entry in a kernel page-table-directory */
-#define pgd_offset_k(address) pgd_offset(&init_mm, address)
-
-/* Find an entry in the second-level page table.. */
-#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-#define pmd_offset(dir,addr) \
-	((pmd_t *) pgd_page_kernel(*(dir)) + pmd_index(addr))
-
-/* Find an entry in the third-level page table.. */
-#define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
-#define pte_offset_kernel(pmd, address) \
-	((pte_t *) pmd_page_kernel(*(pmd)) + pte_index(address))
-#define pte_offset_map(pmd, address) pte_offset_kernel(pmd, address)
-#define pte_offset_map_nested(pmd, address) pte_offset_kernel(pmd, address)
-#define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
-
-/*
- * A page-table entry has some bits we have to treat in a special way.
- * Bits 52 and bit 55 have to be zero, otherwise an specification
- * exception will occur instead of a page translation exception. The
- * specifiation exception has the bad habit not to store necessary
- * information in the lowcore.
- * Bit 53 and bit 54 are the page invalid bit and the page protection
- * bit. We set both to indicate a swapped page.
- * Bit 63 is used as the software page present bit. If a page is
- * swapped this obviously has to be zero.
- * This leaves the bits 0-51 and bits 56-62 to store type and offset.
- * We use the 7 bits from 56-62 for the type and the 52 bits from 0-51
- * for the offset.
- * |                     offset                       |0110|type |0
- * 0000000000111111111122222222223333333333444444444455555555556666
- * 0123456789012345678901234567890123456789012345678901234567890123
- */
-extern inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
-{
-	pte_t pte;
-	pte_val(pte) = (type << 1) | (offset << 12) | _PAGE_INVALID | _PAGE_RO;
-	pte_val(pte) &= 0xfffffffffffff6fe;  /* better to be paranoid */
-	return pte;
-}
-
-#define __swp_type(entry)	(((entry).val >> 1) & 0x3f)
-#define __swp_offset(entry)	((entry).val >> 12)
-#define __swp_entry(type,offset) ((swp_entry_t) { pte_val(mk_swap_pte((type),(offset))) })
-
-#define __pte_to_swp_entry(pte)	((swp_entry_t) { pte_val(pte) })
-#define __swp_entry_to_pte(x)	((pte_t) { (x).val })
-
-typedef pte_t *pte_addr_t;
-
-#endif /* !__ASSEMBLY__ */
-
-#define kern_addr_valid(addr)   (1)
-
-/*
- * No page table caches to initialise
- */
-#define pgtable_cache_init()	do { } while (0)
-
-#define HAVE_ARCH_UNMAPPED_AREA
-
-#endif /* _S390_PAGE_H */
-
diff -Nru a/include/asm-s390x/poll.h b/include/asm-s390x/poll.h
--- a/include/asm-s390x/poll.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,34 +0,0 @@
-/*
- *  include/asm-s390/poll.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/poll.h"
- */
-
-#ifndef __S390_POLL_H
-#define __S390_POLL_H
-
-/* These are specified by iBCS2 */
-#define POLLIN          0x0001
-#define POLLPRI         0x0002
-#define POLLOUT         0x0004
-#define POLLERR         0x0008
-#define POLLHUP         0x0010
-#define POLLNVAL        0x0020
-
-/* The rest seem to be more-or-less nonstandard. Check them! */
-#define POLLRDNORM	0x0040
-#define POLLRDBAND	0x0080
-#define POLLWRNORM	0x0100
-#define POLLWRBAND	0x0200
-#define POLLMSG		0x0400
-#define POLLREMOVE	0x1000
-
-struct pollfd {
-	int fd;
-	short events;
-	short revents;
-};
-
-#endif
diff -Nru a/include/asm-s390x/posix_types.h b/include/asm-s390x/posix_types.h
--- a/include/asm-s390x/posix_types.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,74 +0,0 @@
-/*
- *  include/asm-s390/posix_types.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/posix_types.h"
- */
-
-#ifndef __ARCH_S390_POSIX_TYPES_H
-#define __ARCH_S390_POSIX_TYPES_H
-
-/*
- * This file is generally used by user-level software, so you need to
- * be a little careful about namespace pollution etc.  Also, we cannot
- * assume GCC is being used.
- */
-
-typedef unsigned int    __kernel_dev_t;
-typedef unsigned int    __kernel_ino_t;
-typedef unsigned int    __kernel_mode_t;
-typedef unsigned int    __kernel_nlink_t;
-typedef long            __kernel_off_t;
-typedef long long       __kernel_loff_t;
-typedef int             __kernel_pid_t;
-typedef int             __kernel_ipc_pid_t;
-typedef unsigned int    __kernel_uid_t;
-typedef unsigned int    __kernel_gid_t;
-typedef unsigned long   __kernel_size_t;
-typedef long            __kernel_ssize_t;
-typedef long            __kernel_ptrdiff_t;
-typedef long            __kernel_time_t;
-typedef long            __kernel_suseconds_t;
-typedef long            __kernel_clock_t;
-typedef int             __kernel_daddr_t;
-typedef char *          __kernel_caddr_t;
-typedef unsigned long   __kernel_sigset_t;      /* at least 32 bits */
-typedef unsigned short	__kernel_uid16_t;
-typedef unsigned short	__kernel_gid16_t;
-
-typedef __kernel_uid_t __kernel_old_uid_t;
-typedef __kernel_gid_t __kernel_old_gid_t;
-typedef __kernel_uid_t __kernel_uid32_t;
-typedef __kernel_gid_t __kernel_gid32_t;
-
-typedef struct {
-#if defined(__KERNEL__) || defined(__USE_ALL)
-        int     val[2];
-#else                        /* !defined(__KERNEL__) && !defined(__USE_ALL)*/
-        int     __val[2];
-#endif                       /* !defined(__KERNEL__) && !defined(__USE_ALL)*/
-} __kernel_fsid_t;
-
-
-#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
-
-#ifndef _S390_BITOPS_H
-#include <asm/bitops.h>
-#endif
-
-#undef  __FD_SET
-#define __FD_SET(fd,fdsetp)  set_bit(fd,fdsetp->fds_bits)
-
-#undef  __FD_CLR
-#define __FD_CLR(fd,fdsetp)  clear_bit(fd,fdsetp->fds_bits)
-
-#undef  __FD_ISSET
-#define __FD_ISSET(fd,fdsetp)  test_bit(fd,fdsetp->fds_bits)
-
-#undef  __FD_ZERO
-#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp)))
-
-#endif     /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)*/
-
-#endif
diff -Nru a/include/asm-s390x/processor.h b/include/asm-s390x/processor.h
--- a/include/asm-s390x/processor.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,243 +0,0 @@
-/*
- *  include/asm-s390/processor.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/processor.h"
- *    Copyright (C) 1994, Linus Torvalds
- */
-
-#ifndef __ASM_S390_PROCESSOR_H
-#define __ASM_S390_PROCESSOR_H
-
-#include <asm/page.h>
-#include <asm/ptrace.h>
-
-#ifdef __KERNEL__
-/*
- * Default implementation of macro that returns current
- * instruction pointer ("program counter").
- */
-#define current_text_addr() ({ void *pc; __asm__("basr %0,0":"=a"(pc)); pc; })
-
-/*
- *  CPU type and hardware bug flags. Kept separately for each CPU.
- *  Members of this structure are referenced in head.S, so think twice
- *  before touching them. [mj]
- */
-
-typedef struct
-{
-        unsigned int version :  8;
-        unsigned int ident   : 24;
-        unsigned int machine : 16;
-        unsigned int unused  : 16;
-} __attribute__ ((packed)) cpuid_t;
-
-struct cpuinfo_S390
-{
-        cpuid_t  cpu_id;
-        unsigned long loops_per_jiffy;
-        unsigned long *pgd_quick;
-        unsigned long *pmd_quick;
-        unsigned long *pte_quick;
-        unsigned long pgtable_cache_sz;
-        __u16    cpu_addr;
-        __u16    cpu_nr;
-        __u16    pad[2];
-};
-
-extern void print_cpu_info(struct cpuinfo_S390 *);
-
-/* Lazy FPU handling on uni-processor */
-extern struct task_struct *last_task_used_math;
-
-/*
- * User space process size: 4TB (default).
- */
-#define TASK_SIZE       (0x20000000000UL)
-#define TASK31_SIZE     (0x80000000UL)
-
-/* This decides where the kernel will search for a free chunk of vm
- * space during mmap's.
- */
-#define TASK_UNMAPPED_BASE \
-	(test_thread_flag(TIF_31BIT) ? (TASK31_SIZE / 2) : (TASK_SIZE / 2))
-
-#define THREAD_SIZE (4*PAGE_SIZE)
-
-typedef struct {
-       __u32 ar4;
-} mm_segment_t;
-
-/* if you change the thread_struct structure, you must
- * update the _TSS_* defines in entry.S
- */
-
-struct thread_struct
- {
-	s390_fp_regs fp_regs;
-        __u32   ar2;                   /* kernel access register 2         */
-        __u32   ar4;                   /* kernel access register 4         */
-        addr_t  ksp;                   /* kernel stack pointer             */
-        addr_t  user_seg;              /* HSTD                             */
-        addr_t  prot_addr;             /* address of protection-excep.     */
-        __u32   error_code;            /* error-code of last prog-excep.   */
-        __u32   trap_no;
-        per_struct per_info;/* Must be aligned on an 4 byte boundary*/
-	/* Used to give failing instruction back to user for ieee exceptions */
-	addr_t  ieee_instruction_pointer; 
-	unsigned long flags;            /* various flags */
-        /* pfault_wait is used to block the process on a pfault event */
-	addr_t  pfault_wait;
-};
-
-typedef struct thread_struct thread_struct;
-
-#define INIT_THREAD {{0,{{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, \
-			    {0},{0},{0},{0},{0},{0}}},            \
-                     0, 0,                                        \
-                    sizeof(init_stack) + (addr_t) &init_stack,    \
-              (__pa((addr_t) &swapper_pg_dir[0]) + _REGION_TABLE),\
-                     0,0,0,                                       \
-                     (per_struct) {{{{0,}}},0,0,0,0,{{0,}}},      \
-		     0, 0, 0				          \
-} 
-
-/* need to define ... */
-#define start_thread(regs, new_psw, new_stackp) do {            \
-        regs->psw.mask  = PSW_USER_BITS;                        \
-        regs->psw.addr  = new_psw;                              \
-        regs->gprs[15]  = new_stackp;                           \
-} while (0)
-
-#define start_thread31(regs, new_psw, new_stackp) do {          \
-	regs->psw.mask  = PSW_USER32_BITS;			\
-        regs->psw.addr  = new_psw;                              \
-        regs->gprs[15]  = new_stackp;                           \
-} while (0)
-
-
-/* Forward declaration, a strange C thing */
-struct task_struct;
-struct mm_struct;
-
-/* Free all resources held by a thread. */
-extern void release_thread(struct task_struct *);
-extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-
-/* Prepare to copy thread state - unlazy all lazy status */
-#define prepare_to_copy(tsk)	do { } while (0)
-
-/*
- * Return saved PC of a blocked thread.
- */
-extern inline unsigned long thread_saved_pc(struct task_struct *t);
-
-/*
- * Print register of task into buffer. Used in fs/proc/array.c.
- */
-extern char *task_show_regs(struct task_struct *task, char *buffer);
-
-unsigned long get_wchan(struct task_struct *p);
-#define __KSTK_PTREGS(tsk) ((struct pt_regs *) \
-        (((addr_t) tsk->thread_info + THREAD_SIZE - sizeof(struct pt_regs)) & -8L))
-#define KSTK_EIP(tsk)	(__KSTK_PTREGS(tsk)->psw.addr)
-#define KSTK_ESP(tsk)	(__KSTK_PTREGS(tsk)->gprs[15])
-
-#define cpu_relax()	barrier()
-
-/*
- * Set PSW mask to specified value, while leaving the
- * PSW addr pointing to the next instruction.
- */
-
-static inline void __load_psw_mask (unsigned long mask)
-{
-	unsigned long addr;
-
-	psw_t psw;
-	psw.mask = mask;
-
-	asm volatile (
-		"    larl  %0,1f\n"
-		"    stg   %0,8(%1)\n"
-		"    lpswe 0(%1)\n"
-		"1:"
-		: "=&d" (addr) : "a" (&psw) : "memory", "cc" );
-}
-
-/*
- * Function to stop a processor until an interruption occurred
- */
-static inline void enabled_wait(void)
-{
-	unsigned long reg;
-	psw_t wait_psw;
-
-	wait_psw.mask = PSW_BASE_BITS | PSW_MASK_IO | PSW_MASK_EXT |
-		PSW_MASK_MCHECK | PSW_MASK_WAIT;
-	asm volatile (
-		"    larl  %0,0f\n"
-		"    stg   %0,8(%1)\n"
-		"    lpswe 0(%1)\n"
-		"0:"
-		: "=&a" (reg) : "a" (&wait_psw) : "memory", "cc" );
-}
-
-/*
- * Function to drop a processor into disabled wait state
- */
-
-static inline void disabled_wait(addr_t code)
-{
-        char psw_buffer[2*sizeof(psw_t)];
-        char ctl_buf[8];
-        psw_t *dw_psw = (psw_t *)(((unsigned long) &psw_buffer+sizeof(psw_t)-1)
-                                  & -sizeof(psw_t));
-
-        dw_psw->mask = PSW_BASE_BITS | PSW_MASK_WAIT;
-        dw_psw->addr = code;
-        /* 
-         * Store status and then load disabled wait psw,
-         * the processor is dead afterwards
-         */
-        asm volatile ("    stctg 0,0,0(%1)\n"
-                      "    ni    4(%1),0xef\n" /* switch off protection */
-                      "    lctlg 0,0,0(%1)\n"
-                      "    lghi  1,0x1000\n"
-                      "    stpt  0x328(1)\n"      /* store timer */
-                      "    stckc 0x330(1)\n"      /* store clock comparator */
-                      "    stpx  0x318(1)\n"      /* store prefix register */
-                      "    stam  0,15,0x340(1)\n" /* store access registers */
-                      "    stfpc 0x31c(1)\n"      /* store fpu control */
-                      "    std   0,0x200(1)\n"    /* store f0 */
-                      "    std   1,0x208(1)\n"    /* store f1 */
-                      "    std   2,0x210(1)\n"    /* store f2 */
-                      "    std   3,0x218(1)\n"    /* store f3 */
-                      "    std   4,0x220(1)\n"    /* store f4 */
-                      "    std   5,0x228(1)\n"    /* store f5 */
-                      "    std   6,0x230(1)\n"    /* store f6 */
-                      "    std   7,0x238(1)\n"    /* store f7 */
-                      "    std   8,0x240(1)\n"    /* store f8 */
-                      "    std   9,0x248(1)\n"    /* store f9 */
-                      "    std   10,0x250(1)\n"   /* store f10 */
-                      "    std   11,0x258(1)\n"   /* store f11 */
-                      "    std   12,0x260(1)\n"   /* store f12 */
-                      "    std   13,0x268(1)\n"   /* store f13 */
-                      "    std   14,0x270(1)\n"   /* store f14 */
-                      "    std   15,0x278(1)\n"   /* store f15 */
-                      "    stmg  0,15,0x280(1)\n" /* store general registers */
-                      "    stctg 0,15,0x380(1)\n" /* store control registers */
-                      "    oi    0x384(1),0x10\n" /* fake protection bit */
-                      "    lpswe 0(%0)"
-                      : : "a" (dw_psw), "a" (&ctl_buf) : "cc", "0", "1");
-}
-
-#endif
-
-#endif                                 /* __ASM_S390_PROCESSOR_H           */
-
diff -Nru a/include/asm-s390x/ptrace.h b/include/asm-s390x/ptrace.h
--- a/include/asm-s390x/ptrace.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,339 +0,0 @@
-/*
- *  include/asm-s390/ptrace.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- */
-
-#ifndef _S390_PTRACE_H
-#define _S390_PTRACE_H
-
-/*
- * Offsets in the user_regs_struct. They are used for the ptrace
- * system call and in entry.S
- */
-#define PT_PSWMASK  0x00
-#define PT_PSWADDR  0x08
-#define PT_GPR0     0x10
-#define PT_GPR1     0x18
-#define PT_GPR2     0x20
-#define PT_GPR3     0x28
-#define PT_GPR4     0x30
-#define PT_GPR5     0x38
-#define PT_GPR6     0x40
-#define PT_GPR7     0x48
-#define PT_GPR8     0x50
-#define PT_GPR9     0x58
-#define PT_GPR10    0x60
-#define PT_GPR11    0x68
-#define PT_GPR12    0x70
-#define PT_GPR13    0x78
-#define PT_GPR14    0x80
-#define PT_GPR15    0x88
-#define PT_ACR0     0x90
-#define PT_ACR1     0x94
-#define PT_ACR2     0x98
-#define PT_ACR3     0x9C
-#define PT_ACR4	    0xA0
-#define PT_ACR5	    0xA4
-#define PT_ACR6	    0xA8
-#define PT_ACR7	    0xAC
-#define PT_ACR8	    0xB0
-#define PT_ACR9	    0xB4
-#define PT_ACR10    0xB8
-#define PT_ACR11    0xBC
-#define PT_ACR12    0xC0
-#define PT_ACR13    0xC4
-#define PT_ACR14    0xC8
-#define PT_ACR15    0xCC
-#define PT_ORIGGPR2 0xD0
-#define PT_FPC	    0xD8
-#define PT_FPR0     0xE0
-#define PT_FPR1     0xE8
-#define PT_FPR2     0xF0
-#define PT_FPR3     0xF8
-#define PT_FPR4     0x100
-#define PT_FPR5     0x108
-#define PT_FPR6     0x110
-#define PT_FPR7     0x118
-#define PT_FPR8     0x120
-#define PT_FPR9     0x128
-#define PT_FPR10    0x130
-#define PT_FPR11    0x138
-#define PT_FPR12    0x140
-#define PT_FPR13    0x148
-#define PT_FPR14    0x150
-#define PT_FPR15    0x158
-#define PT_CR_9     0x160
-#define PT_CR_10    0x168
-#define PT_CR_11    0x170
-#define PT_IEEE_IP  0x1A8
-#define PT_LASTOFF  PT_IEEE_IP
-#define PT_ENDREGS  0x1B0-1
-
-#define NUM_GPRS      16
-#define NUM_FPRS      16
-#define NUM_CRS       16
-#define NUM_ACRS      16
-#define GPR_SIZE      8
-#define FPR_SIZE      8
-#define FPC_SIZE      4
-#define FPC_PAD_SIZE  4 /* gcc insists on aligning the fpregs */
-#define CR_SIZE       8
-#define ACR_SIZE      4
-
-#define STACK_FRAME_OVERHEAD    160      /* size of minimum stack frame */
-
-#define PTRACE_OLDSETOPTIONS         21
-
-#ifndef __ASSEMBLY__
-#include <linux/config.h>
-#include <linux/stddef.h>
-#include <linux/types.h>
-
-#include <asm/setup.h>
-
-/* this typedef defines how a Program Status Word looks like */
-typedef struct 
-{
-        __u64   mask;
-        __u64   addr;
-} __attribute__ ((aligned(8))) psw_t;
-
-#define PSW_MASK_PER		0x4000000000000000UL
-#define PSW_MASK_DAT		0x0400000000000000UL
-#define PSW_MASK_IO		0x0200000000000000UL
-#define PSW_MASK_EXT		0x0100000000000000UL
-#define PSW_MASK_KEY		0x00F0000000000000UL
-#define PSW_MASK_MCHECK		0x0004000000000000UL
-#define PSW_MASK_WAIT		0x0002000000000000UL
-#define PSW_MASK_PSTATE		0x0001000000000000UL
-#define PSW_MASK_ASC		0x0000C00000000000UL
-#define PSW_MASK_CC		0x0000300000000000UL
-#define PSW_MASK_PM		0x00000F0000000000UL
-
-#define PSW_BASE_BITS		0x0000000180000000UL
-#define PSW_BASE32_BITS		0x0000000080000000UL
-
-#define PSW_ASC_PRIMARY		0x0000000000000000UL
-#define PSW_ASC_ACCREG		0x0000400000000000UL
-#define PSW_ASC_SECONDARY	0x0000800000000000UL
-#define PSW_ASC_HOME		0x0000C00000000000UL
-
-#define PSW_KERNEL_BITS	(PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY)
-#define PSW_USER_BITS	(PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \
-			 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \
-			 PSW_MASK_PSTATE)
-#define PSW_USER32_BITS (PSW_BASE32_BITS | PSW_MASK_DAT | PSW_ASC_HOME | \
-			 PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK | \
-			 PSW_MASK_PSTATE)
-
-typedef union
-{
-	float   f;
-	double  d;
-	__u64   ui;
-	struct
-	{
-		__u32 hi;
-		__u32 lo;
-	} fp;
-} freg_t;
-
-typedef struct
-{
-	__u32   fpc;
-	freg_t  fprs[NUM_FPRS];              
-} s390_fp_regs;
-
-#define FPC_EXCEPTION_MASK      0xF8000000
-#define FPC_FLAGS_MASK          0x00F80000
-#define FPC_DXC_MASK            0x0000FF00
-#define FPC_RM_MASK             0x00000003
-#define FPC_VALID_MASK          0xF8F8FF03
-
-/*
- * The first entries in pt_regs and user_regs_struct
- * are common for the two structures. The s390_regs structure
- * covers the common parts. It simplifies copying the common part
- * between the three structures.
- */
-typedef struct
-{
-	psw_t psw;
-	__u64 gprs[NUM_GPRS];
-	__u32 acrs[NUM_ACRS];
-	__u64 orig_gpr2;
-} s390_regs;
-
-/*
- * The pt_regs struct defines the way the registers are stored on
- * the stack during a system call.
- */
-struct pt_regs 
-{
-	psw_t psw;
-	__u64 gprs[NUM_GPRS];
-	__u32 acrs[NUM_ACRS];
-	__u64 orig_gpr2;
-	__u32 trap;
-} __attribute__ ((packed));
-
-/*
- * Now for the program event recording (trace) definitions.
- */
-typedef struct
-{
-	__u64 cr[3];
-} per_cr_words;
-
-#define PER_EM_MASK 0x00000000E8000000UL
-
-typedef	struct
-{
-	unsigned                       : 32;
-	unsigned em_branching          : 1;
-	unsigned em_instruction_fetch  : 1;
-	/*
-	 * Switching on storage alteration automatically fixes
-	 * the storage alteration event bit in the users std.
-	 */
-	unsigned em_storage_alteration : 1;
-	unsigned em_gpr_alt_unused     : 1;
-	unsigned em_store_real_address : 1;
-	unsigned                       : 3;
-	unsigned branch_addr_ctl       : 1;
-	unsigned                       : 1;
-	unsigned storage_alt_space_ctl : 1;
-	unsigned                       : 21;
-	addr_t   starting_addr;
-	addr_t   ending_addr;
-} per_cr_bits;
-
-typedef struct
-{
-	__u16          perc_atmid;
-	addr_t         address;
-	__u8           access_id;
-} per_lowcore_words;
-
-typedef struct
-{
-	unsigned perc_branching          : 1; /* 0x096 */
-	unsigned perc_instruction_fetch  : 1;
-	unsigned perc_storage_alteration : 1;
-	unsigned perc_gpr_alt_unused     : 1;
-	unsigned perc_store_real_address : 1;
-	unsigned                         : 3;
-	unsigned atmid_psw_bit_31        : 1;
-	unsigned atmid_validity_bit      : 1;
-	unsigned atmid_psw_bit_32        : 1;
-	unsigned atmid_psw_bit_5         : 1;
-	unsigned atmid_psw_bit_16        : 1;
-	unsigned atmid_psw_bit_17        : 1;
-	unsigned si                      : 2;
-	addr_t   address;                     /* 0x098 */
-	unsigned                         : 4; /* 0x0a1 */
-	unsigned access_id               : 4;
-} per_lowcore_bits;
-
-typedef struct
-{
-	union {
-		per_cr_words   words;
-		per_cr_bits    bits;
-	} control_regs;
-	/*
-	 * Use these flags instead of setting em_instruction_fetch
-	 * directly they are used so that single stepping can be
-	 * switched on & off while not affecting other tracing
-	 */
-	unsigned  single_step       : 1;
-	unsigned  instruction_fetch : 1;
-	unsigned                    : 30;
-	/*
-	 * These addresses are copied into cr10 & cr11 if single
-	 * stepping is switched off
-	 */
-	addr_t    starting_addr;
-	addr_t    ending_addr;
-	union {
-		per_lowcore_words words;
-		per_lowcore_bits  bits;
-	} lowcore; 
-} per_struct;
-
-typedef struct
-{
-	__u32  len;
-	addr_t kernel_addr;
-	addr_t process_addr;
-} ptrace_area;
-
-/*
- * S/390 specific non posix ptrace requests. I chose unusual values so
- * they are unlikely to clash with future ptrace definitions.
- */
-#define PTRACE_PEEKUSR_AREA           0x5000
-#define PTRACE_POKEUSR_AREA           0x5001
-#define PTRACE_PEEKTEXT_AREA	      0x5002
-#define PTRACE_PEEKDATA_AREA	      0x5003
-#define PTRACE_POKETEXT_AREA	      0x5004
-#define PTRACE_POKEDATA_AREA 	      0x5005
-/*
- * PT_PROT definition is loosely based on hppa bsd definition in
- * gdb/hppab-nat.c
- */
-#define PTRACE_PROT                       21
-
-typedef enum
-{
-	ptprot_set_access_watchpoint,
-	ptprot_set_write_watchpoint,
-	ptprot_disable_watchpoint
-} ptprot_flags;
-
-typedef struct
-{
-	addr_t           lowaddr;
-	addr_t           hiaddr;
-	ptprot_flags     prot;
-} ptprot_area;                     
-
-/* Sequence of bytes for breakpoint illegal instruction.  */
-#define S390_BREAKPOINT     {0x0,0x1}
-#define S390_BREAKPOINT_U16 ((__u16)0x0001)
-#define S390_SYSCALL_OPCODE ((__u16)0x0a00)
-#define S390_SYSCALL_SIZE   2
-
-/*
- * The user_regs_struct defines the way the user registers are
- * store on the stack for signal handling.
- */
-struct user_regs_struct
-{
-	psw_t psw;
-	__u64 gprs[NUM_GPRS];
-	__u32 acrs[NUM_ACRS];
-	__u64 orig_gpr2;
-	s390_fp_regs fp_regs;
-	/*
-	 * These per registers are in here so that gdb can modify them
-	 * itself as there is no "official" ptrace interface for hardware
-	 * watchpoints. This is the way intel does it.
-	 */
-	per_struct per_info;
-	addr_t  ieee_instruction_pointer; 
-	/* Used to give failing instruction back to user for ieee exceptions */
-};
-
-#ifdef __KERNEL__
-#define user_mode(regs) (((regs)->psw.mask & PSW_MASK_PSTATE) != 0)
-#define instruction_pointer(regs) ((regs)->psw.addr)
-extern void show_regs(struct pt_regs * regs);
-#endif
-
-#endif /* __ASSEMBLY__ */
-
-#endif /* _S390X_PTRACE_H */
diff -Nru a/include/asm-s390x/qdio.h b/include/asm-s390x/qdio.h
--- a/include/asm-s390x/qdio.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,399 +0,0 @@
-/*
- * linux/include/asm/qdio.h
- *
- * Linux for S/390 QDIO base support, Hipersocket base support
- * version 2
- *
- * Copyright 2000,2002 IBM Corporation
- * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
- *
- */
-#ifndef __QDIO_H__
-#define __QDIO_H__
-
-#define VERSION_QDIO_H "$Revision: 1.57 $"
-
-/* note, that most of the typedef's are from ingo. */
-
-#include <linux/interrupt.h>
-#include <asm/cio.h>
-
-#define QDIO_NAME "qdio "
-
-#ifndef CONFIG_ARCH_S390X
-#define QDIO_32_BIT
-#endif /* CONFIG_ARCH_S390X */
-
-/**** CONSTANTS, that are relied on without using these symbols *****/
-#define QDIO_MAX_QUEUES_PER_IRQ 32 /* used in width of unsigned int */
-/************************ END of CONSTANTS **************************/
-#define QDIO_MAX_BUFFERS_PER_Q 128 /* must be a power of 2 (%x=&(x-1)*/
-#define QDIO_BUF_ORDER 7 /* 2**this == number of pages used for sbals in 1 q */
-#define QDIO_MAX_ELEMENTS_PER_BUFFER 16
-#define SBAL_SIZE 256
-
-#define QDIO_QETH_QFMT 0
-#define QDIO_ZFCP_QFMT 1
-#define QDIO_IQDIO_QFMT 2
-
-struct qdio_buffer_element{
-	unsigned int flags;
-	unsigned int length;
-#ifdef QDIO_32_BIT
-	void *reserved;
-#endif /* QDIO_32_BIT */
-	void *addr;
-} __attribute__ ((packed,aligned(16)));
-
-struct qdio_buffer{
-	volatile struct qdio_buffer_element element[16];
-} __attribute__ ((packed,aligned(256)));
-
-
-/* params are: ccw_device, status, qdio_error, siga_error,
-   queue_number, first element processed, number of elements processed,
-   int_parm */
-typedef void qdio_handler_t(struct ccw_device *,unsigned int,unsigned int,
-			    unsigned int,unsigned int,int,int,unsigned long);
-
-
-#define QDIO_STATUS_INBOUND_INT 0x01
-#define QDIO_STATUS_OUTBOUND_INT 0x02
-#define QDIO_STATUS_LOOK_FOR_ERROR 0x04
-#define QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR 0x08
-#define QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR 0x10
-#define QDIO_STATUS_ACTIVATE_CHECK_CONDITION 0x20
-
-#define QDIO_SIGA_ERROR_ACCESS_EXCEPTION 0x10
-#define QDIO_SIGA_ERROR_B_BIT_SET 0x20
-
-/* for qdio_initialize */
-#define QDIO_INBOUND_0COPY_SBALS 0x01
-#define QDIO_OUTBOUND_0COPY_SBALS 0x02
-#define QDIO_USE_OUTBOUND_PCIS 0x04
-
-/* for qdio_cleanup */
-#define QDIO_FLAG_CLEANUP_USING_CLEAR 0x01
-#define QDIO_FLAG_CLEANUP_USING_HALT 0x02
-
-struct qdio_initialize{
-	struct ccw_device *cdev;
-	unsigned char q_format;
-	unsigned char adapter_name[8];
-       	unsigned int qib_param_field_format; /*adapter dependent*/
-	/* pointer to 128 bytes or NULL, if no param field */
-	unsigned char *qib_param_field; /* adapter dependent */
-	/* pointer to no_queues*128 words of data or NULL */
-	unsigned long *input_slib_elements;
-	unsigned long *output_slib_elements;
-	unsigned int min_input_threshold;
-	unsigned int max_input_threshold;
-	unsigned int min_output_threshold;
-	unsigned int max_output_threshold;
-	unsigned int no_input_qs;
-	unsigned int no_output_qs;
-	qdio_handler_t *input_handler;
-	qdio_handler_t *output_handler;
-	unsigned long int_parm;
-	unsigned long flags;
-	void **input_sbal_addr_array; /* addr of n*128 void ptrs */
-	void **output_sbal_addr_array; /* addr of n*128 void ptrs */
-};
-extern int qdio_initialize(struct qdio_initialize *init_data);
-extern int qdio_allocate(struct qdio_initialize *init_data);
-extern int qdio_establish(struct ccw_device *);
-
-extern int qdio_activate(struct ccw_device *,int flags);
-
-#define QDIO_STATE_MUST_USE_OUTB_PCI	0x00000001
-#define QDIO_STATE_INACTIVE 		0x00000002 /* after qdio_cleanup */
-#define QDIO_STATE_ESTABLISHED 		0x00000004 /* after qdio_initialize */
-#define QDIO_STATE_ACTIVE 		0x00000008 /* after qdio_activate */
-#define QDIO_STATE_STOPPED 		0x00000010 /* after queues went down */
-extern unsigned long qdio_get_status(int irq);
-
-
-#define QDIO_FLAG_SYNC_INPUT     0x01
-#define QDIO_FLAG_SYNC_OUTPUT    0x02
-#define QDIO_FLAG_UNDER_INTERRUPT 0x04
-#define QDIO_FLAG_NO_INPUT_INTERRUPT_CONTEXT 0x08 /* no effect on
-						     adapter interrupts */
-#define QDIO_FLAG_DONT_SIGA 0x10
-
-extern int do_QDIO(struct ccw_device*, unsigned int flags, 
-		   unsigned int queue_number,
-		   unsigned int qidx,unsigned int count,
-		   struct qdio_buffer *buffers);
-
-extern int qdio_synchronize(struct ccw_device*, unsigned int flags,
-			    unsigned int queue_number);
-
-extern int qdio_cleanup(struct ccw_device*, int how);
-extern int qdio_shutdown(struct ccw_device*, int how);
-extern int qdio_free(struct ccw_device*);
-
-unsigned char qdio_get_slsb_state(struct ccw_device*, unsigned int flag,
-				  unsigned int queue_number,
-				  unsigned int qidx);
-
-extern void qdio_init_scrubber(void);
-
-struct qdesfmt0 {
-#ifdef QDIO_32_BIT
-	unsigned long res1;             /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long sliba;            /* storage-list-information-block
-					   address */
-#ifdef QDIO_32_BIT
-	unsigned long res2;             /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long sla;              /* storage-list address */
-#ifdef QDIO_32_BIT
-	unsigned long res3;             /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long slsba;            /* storage-list-state-block address */
-	unsigned int  res4;		/* reserved */
-	unsigned int  akey  :  4;       /* access key for DLIB */
-	unsigned int  bkey  :  4;       /* access key for SL */
-	unsigned int  ckey  :  4;       /* access key for SBALs */
-	unsigned int  dkey  :  4;       /* access key for SLSB */
-	unsigned int  res5  : 16;       /* reserved */
-} __attribute__ ((packed));
-
-/*
- * Queue-Description record (QDR)
- */
-struct qdr {
-	unsigned int  qfmt    :  8;     /* queue format */
-	unsigned int  pfmt    :  8;     /* impl. dep. parameter format */
-	unsigned int  res1    :  8;     /* reserved */
-	unsigned int  ac      :  8;     /* adapter characteristics */
-	unsigned int  res2    :  8;     /* reserved */
-	unsigned int  iqdcnt  :  8;     /* input-queue-descriptor count */
-	unsigned int  res3    :  8;     /* reserved */
-	unsigned int  oqdcnt  :  8;     /* output-queue-descriptor count */
-	unsigned int  res4    :  8;     /* reserved */
-	unsigned int  iqdsz   :  8;     /* input-queue-descriptor size */
-	unsigned int  res5    :  8;     /* reserved */
-	unsigned int  oqdsz   :  8;     /* output-queue-descriptor size */
-	unsigned int  res6[9];          /* reserved */
-#ifdef QDIO_32_BIT
-	unsigned long res7;		/* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long qiba;             /* queue-information-block address */
-	unsigned int  res8;             /* reserved */
-	unsigned int  qkey    :  4;     /* queue-informatio-block key */
-	unsigned int  res9    : 28;     /* reserved */
-/*	union _qd {*/ /* why this? */
-		struct qdesfmt0 qdf0[126];
-/*	} qd;*/
-} __attribute__ ((packed,aligned(4096)));
-
-
-/*
- * queue information block (QIB)
- */
-#define QIB_AC_INBOUND_PCI_SUPPORTED 0x80
-#define QIB_AC_OUTBOUND_PCI_SUPPORTED 0x40
-struct qib {
-	unsigned int  qfmt    :  8;     /* queue format */
-	unsigned int  pfmt    :  8;     /* impl. dep. parameter format */
-	unsigned int  res1    :  8;     /* reserved */
-	unsigned int  ac      :  8;     /* adapter characteristics */
-	unsigned int  res2;             /* reserved */
-#ifdef QDIO_32_BIT
-	unsigned long res3;             /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long isliba;           /* absolute address of 1st
-					   input SLIB */
-#ifdef QDIO_32_BIT
-	unsigned long res4;             /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long osliba;           /* absolute address of 1st
-					   output SLIB */
-	unsigned int  res5;             /* reserved */
-	unsigned int  res6;             /* reserved */
-	unsigned char ebcnam[8];        /* adapter identifier in EBCDIC */
-	unsigned char res7[88];         /* reserved */
-	unsigned char parm[QDIO_MAX_BUFFERS_PER_Q];
-					/* implementation dependent
-					   parameters */
-} __attribute__ ((packed,aligned(256)));
-
-
-/*
- * storage-list-information block element (SLIBE)
- */
-struct slibe {
-#ifdef QDIO_32_BIT
-	unsigned long res;              /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long parms;            /* implementation dependent
-					   parameters */
-};
-
-/*
- * storage-list-information block (SLIB)
- */
-struct slib {
-#ifdef QDIO_32_BIT
-	unsigned long res1;             /* reserved */
-#endif /* QDIO_32_BIT */
-        unsigned long nsliba;           /* next SLIB address (if any) */
-#ifdef QDIO_32_BIT
-	unsigned long res2;             /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long sla;              /* SL address */
-#ifdef QDIO_32_BIT
-	unsigned long res3;             /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long slsba;            /* SLSB address */
-	unsigned char res4[1000];       /* reserved */
-	struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q];    /* SLIB elements */
-} __attribute__ ((packed,aligned(2048)));
-
-struct sbal_flags {
-	unsigned char res1  : 1;   /* reserved */
-	unsigned char last  : 1;   /* last entry */
-	unsigned char cont  : 1;   /* contiguous storage */
-	unsigned char res2  : 1;   /* reserved */
-	unsigned char frag  : 2;   /* fragmentation (s.below) */
-	unsigned char res3  : 2;   /* reserved */
-} __attribute__ ((packed));
-
-#define SBAL_FLAGS_FIRST_FRAG	     0x04000000UL
-#define SBAL_FLAGS_MIDDLE_FRAG	     0x08000000UL
-#define SBAL_FLAGS_LAST_FRAG	     0x0c000000UL
-#define SBAL_FLAGS_LAST_ENTRY	     0x40000000UL
-#define SBAL_FLAGS_CONTIGUOUS	     0x20000000UL
-
-#define SBAL_FLAGS0_DATA_CONTINUATION 0x20UL
-
-/* Awesome OpenFCP extensions */
-#define SBAL_FLAGS0_TYPE_STATUS       0x00UL
-#define SBAL_FLAGS0_TYPE_WRITE        0x08UL
-#define SBAL_FLAGS0_TYPE_READ         0x10UL
-#define SBAL_FLAGS0_TYPE_WRITE_READ   0x18UL
-#define SBAL_FLAGS0_MORE_SBALS	      0x04UL
-#define SBAL_FLAGS0_COMMAND           0x02UL
-#define SBAL_FLAGS0_LAST_SBAL         0x00UL
-#define SBAL_FLAGS0_ONLY_SBAL         SBAL_FLAGS0_COMMAND
-#define SBAL_FLAGS0_MIDDLE_SBAL       SBAL_FLAGS0_MORE_SBALS
-#define SBAL_FLAGS0_FIRST_SBAL        SBAL_FLAGS0_MORE_SBALS | SBAL_FLAGS0_COMMAND
-/* Naught of interest beyond this point */
-
-#define SBAL_FLAGS0_PCI		0x40
-struct sbal_sbalf_0 {
-	unsigned char res1  : 1;   /* reserved */
-	unsigned char pci   : 1;   /* PCI indicator */
-	unsigned char cont  : 1;   /* data continuation */
-	unsigned char sbtype: 2;   /* storage-block type (OpenFCP) */
-	unsigned char res2  : 3;   /* reserved */
-} __attribute__ ((packed));
-
-struct sbal_sbalf_1 {
-	unsigned char res1  : 4;   /* reserved */
-	unsigned char key   : 4;   /* storage key */
-} __attribute__ ((packed));
-
-struct sbal_sbalf_14 {
-	unsigned char res1   : 4;  /* reserved */
-	unsigned char erridx : 4;  /* error index */
-} __attribute__ ((packed));
-
-struct sbal_sbalf_15 {
-	unsigned char reason;      /* reserved */
-} __attribute__ ((packed));
-
-union sbal_sbalf {
-	struct sbal_sbalf_0  i0;
-	struct sbal_sbalf_1  i1;
-	struct sbal_sbalf_14 i14;
-	struct sbal_sbalf_15 i15;
-	unsigned char value;
-};
-
-struct sbal_element {
-	union {
-		struct sbal_flags  bits;       /* flags */
-		unsigned char value;
-	} flags;
-	unsigned int  res1  : 16;   /* reserved */
-	union sbal_sbalf  sbalf;       /* SBAL flags */
-	unsigned int  res2  : 16;  /* reserved */
-	unsigned int  count : 16;  /* data count */
-#ifdef QDIO_32_BIT
-	unsigned long res3;        /* reserved */
-#endif /* QDIO_32_BIT */
-	unsigned long addr;        /* absolute data address */
-} __attribute__ ((packed,aligned(16)));
-
-/*
- * strorage-block access-list (SBAL)
- */
-struct sbal {
-	struct sbal_element element[QDIO_MAX_ELEMENTS_PER_BUFFER];
-} __attribute__ ((packed,aligned(256)));
-
-/*
- * storage-list (SL)
- */
-struct sl_element {
-#ifdef QDIO_32_BIT
-        unsigned long res;     /* reserved */
-#endif /* QDIO_32_BIT */
-        unsigned long sbal;    /* absolute SBAL address */
-} __attribute__ ((packed));
-
-struct sl {
-	struct sl_element element[QDIO_MAX_BUFFERS_PER_Q];
-} __attribute__ ((packed,aligned(1024)));
-
-/*
- * storage-list-state block (SLSB)
- */
-struct slsb_flags {
-	unsigned char owner  : 2;   /* SBAL owner */
-	unsigned char type   : 1;   /* buffer type */
-	unsigned char state  : 5;   /* processing state */
-} __attribute__ ((packed));
-
-
-struct slsb {
-	union {
-		unsigned char val[QDIO_MAX_BUFFERS_PER_Q];
-		struct slsb_flags flags[QDIO_MAX_BUFFERS_PER_Q];
-	} acc;
-} __attribute__ ((packed,aligned(256)));
-
-/*
- * SLSB values
- */
-#define SLSB_OWNER_PROG              1
-#define SLSB_OWNER_CU                2
-
-#define SLSB_TYPE_INPUT              0
-#define SLSB_TYPE_OUTPUT             1
-
-#define SLSB_STATE_NOT_INIT          0
-#define SLSB_STATE_EMPTY             1
-#define SLSB_STATE_PRIMED            2
-#define SLSB_STATE_HALTED          0xe
-#define SLSB_STATE_ERROR           0xf
-
-#define SLSB_P_INPUT_NOT_INIT     0x80
-#define SLSB_P_INPUT_PROCESSING	  0x81
-#define SLSB_CU_INPUT_EMPTY       0x41
-#define SLSB_P_INPUT_PRIMED       0x82
-#define SLSB_P_INPUT_HALTED       0x8E
-#define SLSB_P_INPUT_ERROR        0x8F
-
-#define SLSB_P_OUTPUT_NOT_INIT    0xA0
-#define SLSB_P_OUTPUT_EMPTY       0xA1
-#define SLSB_CU_OUTPUT_PRIMED     0x62
-#define SLSB_P_OUTPUT_HALTED      0xAE
-#define SLSB_P_OUTPUT_ERROR       0xAF
-
-#define SLSB_ERROR_DURING_LOOKUP  0xFF
-
-#endif /* __QDIO_H__ */
diff -Nru a/include/asm-s390x/queue.h b/include/asm-s390x/queue.h
--- a/include/asm-s390x/queue.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,170 +0,0 @@
-/*
- *  include/asm-s390/queue.h
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
- *
- *  A little set of queue utilies.
- */
-#ifndef __ASM_QUEUE_H
-#define __ASM_QUEUE_H
-#include <linux/stddef.h>
-
-typedef struct queue
-{
-	struct queue *next;	
-} queue;
-
-typedef queue list;
-
-typedef struct
-{
-	queue *head;
-	queue *tail;
-} qheader;
-
-static __inline__ void init_queue(qheader *qhead)
-{
-	memset(qhead,0,sizeof(*qhead));
-}
-
-static __inline__ void enqueue_tail(qheader *qhead,queue *member)
-{	
-	if(member)
-	{
-		queue *tail=qhead->tail;
-
-		if(tail)
-			tail->next=member;
-		else
-			
-			qhead->head=member;
-		qhead->tail=member;
-		member->next=NULL;
-	}
-} 
-
-static __inline__ queue *dequeue_head(qheader *qhead)
-{
-	queue *head=qhead->head,*next_head;
-
-	if(head)
-	{
-		next_head=head->next;
-		qhead->head=next_head;
-	        if(!next_head)
-			qhead->tail=NULL;
-	}
-	return(head);
-}
-
-static __inline__ void init_list(list **lhead)
-{
-	*lhead=NULL;
-}
-
-static __inline__ void add_to_list(list **lhead,list *member)
-{
-	member->next=*lhead;
-	*lhead=member;
-}
-
-static __inline__ list *remove_listhead(list **lhead)
-{
-	list *oldhead=*lhead;
-
-	if(oldhead)
-		*lhead=(*lhead)->next;
-	return(oldhead);
-}
-
-static __inline__ void add_to_list_tail(list **lhead,list *member)
-{
-	list *curr,*prev;
-	if(*lhead==NULL)
-		*lhead=member;
-	else
-	{
-		prev=*lhead;
-		for(curr=(*lhead)->next;curr!=NULL;curr=curr->next)
-			prev=curr;
-		prev->next=member;
-	}
-}
-static __inline__ void add_to_list_tail_null(list **lhead,list *member)
-{
-	member->next=NULL;
-	add_to_list_tail_null(lhead,member);
-}
-
-
-static __inline__ int is_in_list(list *lhead,list *member)
-{
-	list *curr;
-
-	for(curr=lhead;curr!=NULL;curr=curr->next)
-		if(curr==member)
-			return(1);
-	return(0);
-}
-
-static __inline__ int get_prev(list *lhead,list *member,list **prev)
-{
-	list *curr;
-
-	*prev=NULL;
-	for(curr=lhead;curr!=NULL;curr=curr->next)
-	{
-		if(curr==member)
-			return(1);
-		*prev=curr;
-	}
-	*prev=NULL;
-	return(0);
-}
-
-
-
-static __inline__ int remove_from_list(list **lhead,list *member)
-{
-	list *prev;
-
-	if(get_prev(*lhead,member,&prev))
-	{
-
-		if(prev)
-			prev->next=member->next;
-		else
-			*lhead=member->next;
-		return(1);
-	}
-	return(0);
-}
-
-static __inline__ int remove_from_queue(qheader *qhead,queue *member)
-{
-	queue *prev;
-
-	if(get_prev(qhead->head,(list *)member,(list **)&prev))
-	{
-
-		if(prev)
-		{
-			prev->next=member->next;
-			if(prev->next==NULL)
-				qhead->tail=prev;
-		}
-		else
-		{
-			if(qhead->head==qhead->tail)
-				qhead->tail=NULL;
-			qhead->head=member->next;
-		}
-		return(1);
-	}
-	return(0);
-}
-
-#endif /* __ASM_QUEUE_H */
-
diff -Nru a/include/asm-s390x/resource.h b/include/asm-s390x/resource.h
--- a/include/asm-s390x/resource.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,56 +0,0 @@
-/*
- *  include/asm-s390/resource.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/resources.h"
- */
-
-#ifndef _S390_RESOURCE_H
-#define _S390_RESOURCE_H
-
-/*
- * Resource limits
- */
-
-#define RLIMIT_CPU	0		/* CPU time in ms */
-#define RLIMIT_FSIZE	1		/* Maximum filesize */
-#define RLIMIT_DATA	2		/* max data size */
-#define RLIMIT_STACK	3		/* max stack size */
-#define RLIMIT_CORE	4		/* max core file size */
-#define RLIMIT_RSS	5		/* max resident set size */
-#define RLIMIT_NPROC	6		/* max number of processes */
-#define RLIMIT_NOFILE	7		/* max number of open files */
-#define RLIMIT_MEMLOCK	8		/* max locked-in-memory address space */
-#define RLIMIT_AS	9		/* address space limit */
-#define RLIMIT_LOCKS	10		/* maximum file locks held */
-
-#define RLIM_NLIMITS	11
-
-/*
- * SuS says limits have to be unsigned.
- * Which makes a ton more sense anyway.
- */
-#define RLIM_INFINITY   (~0UL)
-
-#ifdef __KERNEL__
-
-#define INIT_RLIMITS					\
-{							\
-	{ RLIM_INFINITY, RLIM_INFINITY },		\
-	{ RLIM_INFINITY, RLIM_INFINITY },		\
-	{ RLIM_INFINITY, RLIM_INFINITY },		\
-	{      _STK_LIM, RLIM_INFINITY },		\
-	{             0, RLIM_INFINITY },		\
-	{ RLIM_INFINITY, RLIM_INFINITY },		\
-	{        0,        0 },                  	\
-	{ INR_OPEN, INR_OPEN },                         \
-	{ RLIM_INFINITY, RLIM_INFINITY },		\
-	{ RLIM_INFINITY, RLIM_INFINITY },		\
-	{ RLIM_INFINITY, RLIM_INFINITY },		\
-}
-
-#endif /* __KERNEL__ */
-
-#endif
-
diff -Nru a/include/asm-s390x/rmap.h b/include/asm-s390x/rmap.h
--- a/include/asm-s390x/rmap.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,7 +0,0 @@
-#ifndef _S390X_RMAP_H
-#define _S390X_RMAP_H
-
-/* nothing to see, move along */
-#include <asm-generic/rmap.h>
-
-#endif
diff -Nru a/include/asm-s390x/rwsem.h b/include/asm-s390x/rwsem.h
--- a/include/asm-s390x/rwsem.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,273 +0,0 @@
-#ifndef _S390X_RWSEM_H
-#define _S390X_RWSEM_H
-
-/*
- *  include/asm-s390x/rwsem.h
- *
- *  S390 version
- *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Based on asm-alpha/semaphore.h and asm-i386/rwsem.h
- */
-
-/*
- *
- * The MSW of the count is the negated number of active writers and waiting
- * lockers, and the LSW is the total number of active locks
- *
- * The lock count is initialized to 0 (no active and no waiting lockers).
- *
- * When a writer subtracts WRITE_BIAS, it'll get 0xffff0001 for the case of an
- * uncontended lock. This can be determined because XADD returns the old value.
- * Readers increment by 1 and see a positive value when uncontended, negative
- * if there are writers (and maybe) readers waiting (in which case it goes to
- * sleep).
- *
- * The value of WAITING_BIAS supports up to 32766 waiting processes. This can
- * be extended to 65534 by manually checking the whole MSW rather than relying
- * on the S flag.
- *
- * The value of ACTIVE_BIAS supports up to 65535 active processes.
- *
- * This should be totally fair - if anything is waiting, a process that wants a
- * lock will go to the back of the queue. When the currently active lock is
- * released, if there's a writer at the front of the queue, then that and only
- * that will be woken up; if there's a bunch of consequtive readers at the
- * front, then they'll all be woken up, but no other readers will be.
- */
-
-#ifndef _LINUX_RWSEM_H
-#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead"
-#endif
-
-#ifdef __KERNEL__
-
-#include <linux/list.h>
-#include <linux/spinlock.h>
-
-struct rwsem_waiter;
-
-extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *);
-extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *);
-extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *);
-extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *);
-extern struct rw_semaphore *rwsem_downgrade_write(struct rw_semaphore *);
-
-/*
- * the semaphore definition
- */
-struct rw_semaphore {
-	signed long		count;
-	spinlock_t		wait_lock;
-	struct list_head	wait_list;
-};
-
-#define RWSEM_UNLOCKED_VALUE	0x0000000000000000L
-#define RWSEM_ACTIVE_BIAS	0x0000000000000001L
-#define RWSEM_ACTIVE_MASK	0x00000000ffffffffL
-#define RWSEM_WAITING_BIAS	(-0x0000000100000000L)
-#define RWSEM_ACTIVE_READ_BIAS	RWSEM_ACTIVE_BIAS
-#define RWSEM_ACTIVE_WRITE_BIAS	(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
-
-/*
- * initialisation
- */
-#define __RWSEM_INITIALIZER(name) \
-{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) }
-
-#define DECLARE_RWSEM(name) \
-	struct rw_semaphore name = __RWSEM_INITIALIZER(name)
-
-static inline void init_rwsem(struct rw_semaphore *sem)
-{
-	sem->count = RWSEM_UNLOCKED_VALUE;
-	spin_lock_init(&sem->wait_lock);
-	INIT_LIST_HEAD(&sem->wait_list);
-}
-
-/*
- * lock for reading
- */
-static inline void __down_read(struct rw_semaphore *sem)
-{
-	signed long old, new;
-
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: lgr  %1,%0\n"
-		"   aghi %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
-		: "cc", "memory" );
-	if (old < 0)
-		rwsem_down_read_failed(sem);
-}
-
-/*
- * trylock for reading -- returns 1 if successful, 0 if contention
- */
-static inline int __down_read_trylock(struct rw_semaphore *sem)
-{
-	signed long old, new;
-
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: ltgr %1,%0\n"
-		"   jm   1f\n"
-		"   aghi %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b\n"
-		"1:"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "i" (RWSEM_ACTIVE_READ_BIAS)
-		: "cc", "memory" );
-	return old >= 0 ? 1 : 0;
-}
-
-/*
- * lock for writing
- */
-static inline void __down_write(struct rw_semaphore *sem)
-{
-	signed long old, new, tmp;
-
-	tmp = RWSEM_ACTIVE_WRITE_BIAS;
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: lgr  %1,%0\n"
-		"   ag   %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "m" (tmp)
-		: "cc", "memory" );
-	if (old != 0)
-		rwsem_down_write_failed(sem);
-}
-
-/*
- * trylock for writing -- returns 1 if successful, 0 if contention
- */
-static inline int __down_write_trylock(struct rw_semaphore *sem)
-{
-	signed long old;
-
-	__asm__ __volatile__(
-		"   lg   %0,0(%1)\n"
-		"0: ltgr %0,%0\n"
-		"   jnz  1f\n"
-		"   csg  %0,%2,0(%1)\n"
-		"   jl   0b\n"
-		"1:"
-                : "=&d" (old)
-		: "a" (&sem->count), "d" (RWSEM_ACTIVE_WRITE_BIAS)
-		: "cc", "memory" );
-	return (old == RWSEM_UNLOCKED_VALUE) ? 1 : 0;
-}
-
-/*
- * unlock after reading
- */
-static inline void __up_read(struct rw_semaphore *sem)
-{
-	signed long old, new;
-
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: lgr  %1,%0\n"
-		"   aghi %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "i" (-RWSEM_ACTIVE_READ_BIAS)
-		: "cc", "memory" );
-	if (new < 0)
-		if ((new & RWSEM_ACTIVE_MASK) == 0)
-			rwsem_wake(sem);
-}
-
-/*
- * unlock after writing
- */
-static inline void __up_write(struct rw_semaphore *sem)
-{
-	signed long old, new, tmp;
-
-	tmp = -RWSEM_ACTIVE_WRITE_BIAS;
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: lgr  %1,%0\n"
-		"   ag   %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "m" (tmp)
-		: "cc", "memory" );
-	if (new < 0)
-		if ((new & RWSEM_ACTIVE_MASK) == 0)
-			rwsem_wake(sem);
-}
-
-/*
- * downgrade write lock to read lock
- */
-static inline void __downgrade_write(struct rw_semaphore *sem)
-{
-	signed long old, new, tmp;
-
-	tmp = -RWSEM_WAITING_BIAS;
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: lgr  %1,%0\n"
-		"   ag   %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "m" (tmp)
-		: "cc", "memory" );
-	if (new > 1)
-		rwsem_downgrade_wake(sem);
-}
-
-/*
- * implement atomic add functionality
- */
-static inline void rwsem_atomic_add(long delta, struct rw_semaphore *sem)
-{
-	signed long old, new;
-
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: lgr  %1,%0\n"
-		"   agr  %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "d" (delta)
-		: "cc", "memory" );
-}
-
-/*
- * implement exchange and add functionality
- */
-static inline long rwsem_atomic_update(long delta, struct rw_semaphore *sem)
-{
-	signed long old, new;
-
-	__asm__ __volatile__(
-		"   lg   %0,0(%2)\n"
-		"0: lgr  %1,%0\n"
-		"   agr  %1,%3\n"
-		"   csg  %0,%1,0(%2)\n"
-		"   jl   0b"
-                : "=&d" (old), "=&d" (new)
-		: "a" (&sem->count), "d" (delta)
-		: "cc", "memory" );
-	return new;
-}
-
-#endif /* __KERNEL__ */
-#endif /* _S390X_RWSEM_H */
diff -Nru a/include/asm-s390x/s390_ext.h b/include/asm-s390x/s390_ext.h
--- a/include/asm-s390x/s390_ext.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,34 +0,0 @@
-#ifndef _S390_EXTINT_H
-#define _S390_EXTINT_H
-
-/*
- *  include/asm-s390/s390_ext.h
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Holger Smolinski (Holger.Smolinski@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- */
-
-typedef void (*ext_int_handler_t)(struct pt_regs *regs, __u16 code);
-
-/*
- * Warning: if you change ext_int_info_t you have to change the
- * external interrupt handler in entry.S too.
- */ 
-typedef struct ext_int_info_t {
-	struct ext_int_info_t *next;
-	ext_int_handler_t handler;
-	__u16 code;
-} __attribute__ ((packed)) ext_int_info_t;
-
-extern ext_int_info_t *ext_int_hash[];
-
-int register_external_interrupt(__u16 code, ext_int_handler_t handler);
-int register_early_external_interrupt(__u16 code, ext_int_handler_t handler,
-				      ext_int_info_t *info);
-int unregister_external_interrupt(__u16 code, ext_int_handler_t handler);
-int unregister_early_external_interrupt(__u16 code, ext_int_handler_t handler,
-					ext_int_info_t *info);
-
-#endif
diff -Nru a/include/asm-s390x/scatterlist.h b/include/asm-s390x/scatterlist.h
--- a/include/asm-s390x/scatterlist.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,12 +0,0 @@
-#ifndef _ASMS390X_SCATTERLIST_H
-#define _ASMS390X_SCATTERLIST_H
-
-struct scatterlist {
-    struct page *page;
-    unsigned int offset;
-    unsigned int length;
-};
-
-#define ISA_DMA_THRESHOLD (0xffffffffffffffff)
-
-#endif /* _ASMS390X_SCATTERLIST_H */
diff -Nru a/include/asm-s390x/segment.h b/include/asm-s390x/segment.h
--- a/include/asm-s390x/segment.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,4 +0,0 @@
-#ifndef _ASM_SEGMENT_H
-#define _ASM_SEGMENT_H
-
-#endif
diff -Nru a/include/asm-s390x/semaphore.h b/include/asm-s390x/semaphore.h
--- a/include/asm-s390x/semaphore.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,103 +0,0 @@
-/*
- *  include/asm-s390x/semaphore.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *
- *  Derived from "include/asm-i386/semaphore.h"
- *    (C) Copyright 1996 Linus Torvalds
- */
-
-#ifndef _S390_SEMAPHORE_H
-#define _S390_SEMAPHORE_H
-
-#include <asm/system.h>
-#include <asm/atomic.h>
-#include <linux/wait.h>
-#include <linux/rwsem.h>
-
-struct semaphore {
-	atomic_t count;
-	wait_queue_head_t wait;
-};
-
-#define __SEMAPHORE_INITIALIZER(name,count) \
-	{ ATOMIC_INIT(count), __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) }
-
-#define __MUTEX_INITIALIZER(name) \
-	__SEMAPHORE_INITIALIZER(name,1)
-
-#define __DECLARE_SEMAPHORE_GENERIC(name,count) \
-	struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
-
-#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
-#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
-
-static inline void sema_init (struct semaphore *sem, int val)
-{
-	*sem = (struct semaphore) __SEMAPHORE_INITIALIZER((*sem),val);
-}
-
-static inline void init_MUTEX (struct semaphore *sem)
-{
-	sema_init(sem, 1);
-}
-
-static inline void init_MUTEX_LOCKED (struct semaphore *sem)
-{
-	sema_init(sem, 0);
-}
-
-asmlinkage void __down(struct semaphore * sem);
-asmlinkage int  __down_interruptible(struct semaphore * sem);
-asmlinkage int  __down_trylock(struct semaphore * sem);
-asmlinkage void __up(struct semaphore * sem);
-
-static inline void down(struct semaphore * sem)
-{
-	if (atomic_dec_return(&sem->count) < 0)
-		__down(sem);
-}
-
-static inline int down_interruptible(struct semaphore * sem)
-{
-	int ret = 0;
-
-	if (atomic_dec_return(&sem->count) < 0)
-		ret = __down_interruptible(sem);
-	return ret;
-}
-
-static inline int down_trylock(struct semaphore * sem)
-{
-	int old_val, new_val;
-
-	/*
-	 * This inline assembly atomically implements the equivalent
-	 * to the following C code:
-	 *   old_val = sem->count.counter;
-	 *   if ((new_val = old_val) > 0)
-	 *       sem->count.counter = --new_val;
-	 * In the ppc code this is called atomic_dec_if_positive.
-	 */
-	__asm__ __volatile__ (
-		"   l    %0,0(%3)\n"
-		"0: ltr  %1,%0\n"
-		"   jle  1f\n"
-		"   ahi  %1,-1\n"
-		"   cs   %0,%1,0(%3)\n"
-		"   jl   0b\n"
-		"1:"
-		: "=&d" (old_val), "=&d" (new_val),
-		  "+m" (sem->count.counter)
-		: "a" (&sem->count.counter) : "cc" );
-	return old_val <= 0;
-}
-
-static inline void up(struct semaphore * sem)
-{
-	if (atomic_inc_return(&sem->count) <= 0)
-		__up(sem);
-}
-
-#endif
diff -Nru a/include/asm-s390x/sembuf.h b/include/asm-s390x/sembuf.h
--- a/include/asm-s390x/sembuf.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,22 +0,0 @@
-#ifndef _S390_SEMBUF_H
-#define _S390_SEMBUF_H
-
-/* 
- * The semid64_ds structure for S/390 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 2 miscellaneous 32-bit values
- */
-
-struct semid64_ds {
-	struct ipc64_perm sem_perm;		/* permissions .. see ipc.h */
-	__kernel_time_t	sem_otime;		/* last semop time */
-	__kernel_time_t	sem_ctime;		/* last change time */
-	unsigned long	sem_nsems;		/* no. of semaphores in array */
-	unsigned long	__unused1;
-	unsigned long	__unused2;
-};
-
-#endif /* _S390_SEMBUF_H */
diff -Nru a/include/asm-s390x/setup.h b/include/asm-s390x/setup.h
--- a/include/asm-s390x/setup.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,59 +0,0 @@
-/*
- *  include/asm-s390/setup.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- */
-
-#ifndef _ASM_S390_SETUP_H
-#define _ASM_S390_SETUP_H
-
-#define PARMAREA		0x10400
-#define COMMAND_LINE_SIZE 	896
-#define RAMDISK_ORIGIN		0x800000
-#define RAMDISK_SIZE		0x800000
-
-#ifndef __ASSEMBLY__
-
-#define IPL_DEVICE        (*(unsigned long *)  (0x10400))
-#define INITRD_START      (*(unsigned long *)  (0x10408))
-#define INITRD_SIZE       (*(unsigned long *)  (0x10410))
-#define COMMAND_LINE      ((char *)            (0x10480))
-
-/*
- * Machine features detected in head.S
- */
-extern unsigned long machine_flags;
-
-#define MACHINE_IS_VM		(machine_flags & 1)
-#define MACHINE_IS_P390		(machine_flags & 4)
-#define MACHINE_HAS_MVPG	(machine_flags & 16)
-#define MACHINE_HAS_DIAG44	(machine_flags & 32)
-
-#define MACHINE_HAS_SCLP	(!MACHINE_IS_P390)
-
-/*
- * Console mode. Override with conmode=
- */
-extern unsigned int console_mode;
-extern unsigned int console_device;
-extern unsigned int console_irq;
-
-#define CONSOLE_IS_UNDEFINED	(console_mode == 0)
-#define CONSOLE_IS_SCLP		(console_mode == 1)
-#define CONSOLE_IS_3215		(console_mode == 2)
-#define CONSOLE_IS_3270		(console_mode == 3)
-#define SET_CONSOLE_SCLP	do { console_mode = 1; } while (0)
-#define SET_CONSOLE_3215	do { console_mode = 2; } while (0)
-#define SET_CONSOLE_3270	do { console_mode = 3; } while (0)
-
-#else 
-
-#define IPL_DEVICE        0x10400
-#define INITRD_START      0x10408
-#define INITRD_SIZE       0x10410
-#define COMMAND_LINE      0x10480
-
-#endif
-
-#endif
diff -Nru a/include/asm-s390x/shmbuf.h b/include/asm-s390x/shmbuf.h
--- a/include/asm-s390x/shmbuf.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,38 +0,0 @@
-#ifndef _S390_SHMBUF_H
-#define _S390_SHMBUF_H
-
-/* 
- * The shmid64_ds structure for S/390 architecture.
- * Note extra padding because this structure is passed back and forth
- * between kernel and user space.
- *
- * Pad space is left for:
- * - 2 miscellaneous 32-bit values
- */
-
-struct shmid64_ds {
-	struct ipc64_perm	shm_perm;	/* operation perms */
-	size_t			shm_segsz;	/* size of segment (bytes) */
-	__kernel_time_t		shm_atime;	/* last attach time */
-	__kernel_time_t		shm_dtime;	/* last detach time */
-	__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 long		shm_nattch;	/* no. of current attaches */
-	unsigned long		__unused1;
-	unsigned long		__unused2;
-};
-
-struct shminfo64 {
-	unsigned long	shmmax;
-	unsigned long	shmmin;
-	unsigned long	shmmni;
-	unsigned long	shmseg;
-	unsigned long	shmall;
-	unsigned long	__unused1;
-	unsigned long	__unused2;
-	unsigned long	__unused3;
-	unsigned long	__unused4;
-};
-
-#endif /* _S390_SHMBUF_H */
diff -Nru a/include/asm-s390x/shmparam.h b/include/asm-s390x/shmparam.h
--- a/include/asm-s390x/shmparam.h	Sat Apr 19 19:51:27 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,13 +0,0 @@
-/*
- *  include/asm-s390/shmparam.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/shmparam.h"
- */
-#ifndef _ASM_S390_SHMPARAM_H
-#define _ASM_S390_SHMPARAM_H
-
-#define SHMLBA PAGE_SIZE                 /* attach addr a multiple of this */
-
-#endif /* _ASM_S390_SHMPARAM_H */
diff -Nru a/include/asm-s390x/sigcontext.h b/include/asm-s390x/sigcontext.h
--- a/include/asm-s390x/sigcontext.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,56 +0,0 @@
-/*
- *  include/asm-s390/sigcontext.h
- *
- *  S390 version
- *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
- */
-
-#ifndef _ASM_S390_SIGCONTEXT_H
-#define _ASM_S390_SIGCONTEXT_H
-
-#define __NUM_GPRS 16
-#define __NUM_FPRS 16
-#define __NUM_ACRS 16
-
-/* Has to be at least _NSIG_WORDS from asm/signal.h */
-#define _SIGCONTEXT_NSIG	64
-#define _SIGCONTEXT_NSIG_BPW	64 
-/* Size of stack frame allocated when calling signal handler. */
-#define __SIGNAL_FRAMESIZE	160
-#define _SIGCONTEXT_NSIG_WORDS	(_SIGCONTEXT_NSIG / _SIGCONTEXT_NSIG_BPW)
-#define _SIGMASK_COPY_SIZE	(sizeof(unsigned long)*_SIGCONTEXT_NSIG_WORDS)
-
-typedef struct 
-{
-        unsigned long mask;
-        unsigned long addr;
-} __attribute__ ((aligned(8))) _psw_t;
-
-typedef struct
-{
-	_psw_t psw;
-	unsigned long gprs[__NUM_GPRS];
-	unsigned int  acrs[__NUM_ACRS];
-} _s390_regs_common;
-
-typedef struct
-{
-	unsigned int fpc;
-	double   fprs[__NUM_FPRS];
-} _s390_fp_regs;
-
-typedef struct
-{
-	_s390_regs_common regs;
-	_s390_fp_regs     fpregs;
-} _sigregs;
-
-struct sigcontext
-{
-	unsigned long	oldmask[_SIGCONTEXT_NSIG_WORDS];
-	_sigregs        *sregs;
-};
-
-
-#endif
-
diff -Nru a/include/asm-s390x/siginfo.h b/include/asm-s390x/siginfo.h
--- a/include/asm-s390x/siginfo.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,86 +0,0 @@
-/*
- *  include/asm-s390/siginfo.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/siginfo.h"
- */
-
-#ifndef _S390_SIGINFO_H
-#define _S390_SIGINFO_H
-
-#define HAVE_ARCH_SI_CODES
-
-#include <asm-generic/siginfo.h>
-
-/*
- * SIGILL si_codes
- */
-#define ILL_ILLOPC	(__SI_FAULT|1)	/* illegal opcode */
-#define ILL_ILLOPN	(__SI_FAULT|2)	/* illegal operand */
-#define ILL_ILLADR	(__SI_FAULT|3)	/* illegal addressing mode */
-#define ILL_ILLTRP	(__SI_FAULT|4)	/* illegal trap */
-#define ILL_PRVOPC	(__SI_FAULT|5)	/* privileged opcode */
-#define ILL_PRVREG	(__SI_FAULT|6)	/* privileged register */
-#define ILL_COPROC	(__SI_FAULT|7)	/* coprocessor error */
-#define ILL_BADSTK	(__SI_FAULT|8)	/* internal stack error */
-#define NSIGILL		8
-
-/*
- * SIGFPE si_codes
- */
-#define FPE_INTDIV	(__SI_FAULT|1)	/* integer divide by zero */
-#define FPE_INTOVF	(__SI_FAULT|2)	/* integer overflow */
-#define FPE_FLTDIV	(__SI_FAULT|3)	/* floating point divide by zero */
-#define FPE_FLTOVF	(__SI_FAULT|4)	/* floating point overflow */
-#define FPE_FLTUND	(__SI_FAULT|5)	/* floating point underflow */
-#define FPE_FLTRES	(__SI_FAULT|6)	/* floating point inexact result */
-#define FPE_FLTINV	(__SI_FAULT|7)	/* floating point invalid operation */
-#define FPE_FLTSUB	(__SI_FAULT|8)	/* subscript out of range */
-#define NSIGFPE		8
-
-/*
- * SIGSEGV si_codes
- */
-#define SEGV_MAPERR	(__SI_FAULT|1)	/* address not mapped to object */
-#define SEGV_ACCERR	(__SI_FAULT|2)	/* invalid permissions for mapped object */
-#define NSIGSEGV	2
-
-/*
- * SIGBUS si_codes
- */
-#define BUS_ADRALN	(__SI_FAULT|1)	/* invalid address alignment */
-#define BUS_ADRERR	(__SI_FAULT|2)	/* non-existant physical address */
-#define BUS_OBJERR	(__SI_FAULT|3)	/* object specific hardware error */
-#define NSIGBUS		3
-
-/*
- * SIGTRAP si_codes
- */
-#define TRAP_BRKPT	(__SI_FAULT|1)	/* process breakpoint */
-#define TRAP_TRACE	(__SI_FAULT|2)	/* process trace trap */
-#define NSIGTRAP	2
-
-/*
- * SIGCHLD si_codes
- */
-#define CLD_EXITED	(__SI_CHLD|1)	/* child has exited */
-#define CLD_KILLED	(__SI_CHLD|2)	/* child was killed */
-#define CLD_DUMPED	(__SI_CHLD|3)	/* child terminated abnormally */
-#define CLD_TRAPPED	(__SI_CHLD|4)	/* traced child has trapped */
-#define CLD_STOPPED	(__SI_CHLD|5)	/* child has stopped */
-#define CLD_CONTINUED	(__SI_CHLD|6)	/* stopped child has continued */
-#define NSIGCHLD	6
-
-/*
- * SIGPOLL si_codes
- */
-#define POLL_IN		(__SI_POLL|1)	/* data input available */
-#define POLL_OUT	(__SI_POLL|2)	/* output buffers available */
-#define POLL_MSG	(__SI_POLL|3)	/* input message available */
-#define POLL_ERR	(__SI_POLL|4)	/* i/o error */
-#define POLL_PRI	(__SI_POLL|5)	/* high priority input available */
-#define POLL_HUP	(__SI_POLL|6)	/* device disconnected */
-#define NSIGPOLL	6
-
-#endif
diff -Nru a/include/asm-s390x/signal.h b/include/asm-s390x/signal.h
--- a/include/asm-s390x/signal.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,190 +0,0 @@
-/*
- *  include/asm-s390/signal.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/signal.h"
- */
-
-#ifndef _ASMS390_SIGNAL_H
-#define _ASMS390_SIGNAL_H
-
-#include <linux/types.h>
-
-/* Avoid too many header ordering problems.  */
-struct siginfo;
-struct pt_regs;
-
-#ifdef __KERNEL__
-/* Most things should be clean enough to redefine this at will, if care
-   is taken to make libc match.  */
-#include <asm/sigcontext.h>
-#define _NSIG           _SIGCONTEXT_NSIG
-#define _NSIG_BPW       _SIGCONTEXT_NSIG_BPW
-#define _NSIG_WORDS     _SIGCONTEXT_NSIG_WORDS
-
-typedef unsigned long old_sigset_t;             /* at least 32 bits */
-
-typedef struct {
-        unsigned long sig[_NSIG_WORDS];
-} sigset_t;
-
-#else
-/* Here we must cater to libcs that poke about in kernel headers.  */
-
-#define NSIG            32
-typedef unsigned long sigset_t;
-
-#endif /* __KERNEL__ */
-
-#define SIGHUP           1
-#define SIGINT           2
-#define SIGQUIT          3
-#define SIGILL           4
-#define SIGTRAP          5
-#define SIGABRT          6
-#define SIGIOT           6
-#define SIGBUS           7
-#define SIGFPE           8
-#define SIGKILL          9
-#define SIGUSR1         10
-#define SIGSEGV         11
-#define SIGUSR2         12
-#define SIGPIPE         13
-#define SIGALRM         14
-#define SIGTERM         15
-#define SIGSTKFLT       16
-#define SIGCHLD         17
-#define SIGCONT         18
-#define SIGSTOP         19
-#define SIGTSTP         20
-#define SIGTTIN         21
-#define SIGTTOU         22
-#define SIGURG          23
-#define SIGXCPU         24
-#define SIGXFSZ         25
-#define SIGVTALRM       26
-#define SIGPROF         27
-#define SIGWINCH        28
-#define SIGIO           29
-#define SIGPOLL         SIGIO
-/*
-#define SIGLOST         29
-*/
-#define SIGPWR          30
-#define SIGSYS		31
-#define SIGUNUSED       31
-
-/* These should not be considered constants from userland.  */
-#define SIGRTMIN        32
-#define SIGRTMAX        (_NSIG-1)
-
-/*
- * SA_FLAGS values:
- *
- * SA_ONSTACK indicates that a registered stack_t will be used.
- * SA_INTERRUPT is a no-op, but left due to historical reasons. Use the
- * SA_RESTART flag to get restarting signals (which were the default long ago)
- * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop.
- * SA_RESETHAND clears the handler when the signal is delivered.
- * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies.
- * SA_NODEFER prevents the current signal from being masked in the handler.
- *
- * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single
- * Unix names RESETHAND and NODEFER respectively.
- */
-#define SA_NOCLDSTOP    0x00000001
-#define SA_NOCLDWAIT    0x00000002
-#define SA_SIGINFO      0x00000004
-#define SA_ONSTACK      0x08000000
-#define SA_RESTART      0x10000000
-#define SA_NODEFER      0x40000000
-#define SA_RESETHAND    0x80000000
-
-#define SA_NOMASK       SA_NODEFER
-#define SA_ONESHOT      SA_RESETHAND
-#define SA_INTERRUPT    0x20000000 /* dummy -- ignored */
-
-#define SA_RESTORER     0x04000000
-
-/*
- * sigaltstack controls
- */
-#define SS_ONSTACK      1
-#define SS_DISABLE      2
-
-#define MINSIGSTKSZ     2048
-#define SIGSTKSZ        8192
-
-#ifdef __KERNEL__
-
-/*
- * These values of sa_flags are used only by the kernel as part of the
- * irq handling routines.
- *
- * SA_INTERRUPT is also used by the irq handling routines.
- * SA_SHIRQ is for shared interrupt support on PCI and EISA.
- */
-#define SA_PROBE                SA_ONESHOT
-#define SA_SAMPLE_RANDOM        SA_RESTART
-#define SA_SHIRQ                0x04000000
-#endif
-
-#define SIG_BLOCK          0    /* for blocking signals */
-#define SIG_UNBLOCK        1    /* for unblocking signals */
-#define SIG_SETMASK        2    /* for setting the signal mask */
-
-/* Type of a signal handler.  */
-typedef void (*__sighandler_t)(int);
-
-#define SIG_DFL ((__sighandler_t)0)     /* default signal handling */
-#define SIG_IGN ((__sighandler_t)1)     /* ignore signal */
-#define SIG_ERR ((__sighandler_t)-1)    /* error return from signal */
-
-#ifdef __KERNEL__
-struct old_sigaction {
-        __sighandler_t sa_handler;
-        old_sigset_t sa_mask;
-        unsigned long sa_flags;
-        void (*sa_restorer)(void);
-};
-
-struct sigaction {
-        __sighandler_t sa_handler;
-        unsigned long sa_flags;
-        void (*sa_restorer)(void);
-        sigset_t sa_mask;               /* mask last for extensibility */
-};
-
-struct k_sigaction {
-        struct sigaction sa;
-};
-
-#define ptrace_signal_deliver(regs, cookie) do { } while (0)
-
-#else
-/* Here we must cater to libcs that poke about in kernel headers.  */
-
-struct sigaction {
-        union {
-          __sighandler_t _sa_handler;
-          void (*_sa_sigaction)(int, struct siginfo *, void *);
-        } _u;
-        unsigned long sa_flags;
-        void (*sa_restorer)(void);
-	sigset_t sa_mask;
-};
-
-#define sa_handler      _u._sa_handler
-#define sa_sigaction    _u._sa_sigaction
-
-#endif /* __KERNEL__ */
-
-typedef struct sigaltstack {
-        void *ss_sp;
-        int ss_flags;
-        size_t ss_size;
-} stack_t;
-
-
-#endif
diff -Nru a/include/asm-s390x/sigp.h b/include/asm-s390x/sigp.h
--- a/include/asm-s390x/sigp.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,132 +0,0 @@
-/*
- *  include/asm-s390/sigp.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  sigp.h by D.J. Barrow (c) IBM 1999
- *  contains routines / structures for signalling other S/390 processors in an
- *  SMP configuration.
- */
-
-#ifndef __SIGP__
-#define __SIGP__
-
-#include <asm/ptrace.h>
-#include <asm/atomic.h>
-
-/* get real cpu address from logical cpu number */
-extern volatile int __cpu_logical_map[];
-
-typedef enum
-{
-	sigp_unassigned=0x0,
-	sigp_sense,
-	sigp_external_call,
-	sigp_emergency_signal,
-	sigp_start,
-	sigp_stop,
-	sigp_restart,
-	sigp_unassigned1,
-	sigp_unassigned2,
-	sigp_stop_and_store_status,
-	sigp_unassigned3,
-	sigp_initial_cpu_reset,
-	sigp_cpu_reset,
-	sigp_set_prefix,
-	sigp_store_status_at_address,
-	sigp_store_extended_status_at_address
-} sigp_order_code;
-
-typedef __u32 sigp_status_word;
-
-typedef enum
-{
-        sigp_order_code_accepted=0,
-	sigp_status_stored,
-	sigp_busy,
-	sigp_not_operational
-} sigp_ccode;
-
-
-/*
- * Definitions for the external call
- */
-
-/* 'Bit' signals, asynchronous */
-typedef enum
-{
-	ec_schedule=0,
-	ec_call_function,
-	ec_bit_last
-} ec_bit_sig;
-
-
-/*
- * Signal processor
- */
-extern __inline__ sigp_ccode
-signal_processor(__u16 cpu_addr, sigp_order_code order_code)
-{
-	sigp_ccode ccode;
-
-	__asm__ __volatile__(
-		"    sgr    1,1\n"        /* parameter=0 in gpr 1 */
-		"    sigp   1,%1,0(%2)\n"
-		"    ipm    %0\n"
-		"    srl    %0,28"
-		: "=d" (ccode)
-		: "d" (__cpu_logical_map[cpu_addr]), "a" (order_code)
-		: "cc" , "memory", "1" );
-	return ccode;
-}
-
-/*
- * Signal processor with parameter
- */
-extern __inline__ sigp_ccode
-signal_processor_p(__u64 parameter,__u16 cpu_addr,sigp_order_code order_code)
-{
-	sigp_ccode ccode;
-	
-	__asm__ __volatile__(
-		"    lgr    1,%1\n"       /* parameter in gpr 1 */
-		"    sigp   1,%2,0(%3)\n"
-		"    ipm    %0\n"
-		"    srl    %0,28\n"
-		: "=d" (ccode)
-		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
-                  "a" (order_code)
-		: "cc" , "memory", "1" );
-	return ccode;
-}
-
-/*
- * Signal processor with parameter and return status
- */
-extern __inline__ sigp_ccode
-signal_processor_ps(__u32 *statusptr, __u64 parameter,
-		    __u16 cpu_addr, sigp_order_code order_code)
-{
-	sigp_ccode ccode;
-	
-	__asm__ __volatile__(
-		"    sgr    2,2\n"        /* clear status so it doesn't contain rubbish if not saved. */
-		"    lgr    3,%2\n"       /* parameter in gpr 3 */
-		"    sigp   2,%3,0(%4)\n"
-		"    stg    2,%1\n"
-		"    ipm    %0\n"
-		"    srl    %0,28\n"
-		: "=d" (ccode), "=m" (*statusptr)
-		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
-                  "a" (order_code)
-		: "cc" , "memory", "2" , "3"
-		);
-   return ccode;
-}
-
-#endif /* __SIGP__ */
-
-
diff -Nru a/include/asm-s390x/smp.h b/include/asm-s390x/smp.h
--- a/include/asm-s390x/smp.h	Sat Apr 19 19:51:47 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,77 +0,0 @@
-/*
- *  include/asm-s390/smp.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- */
-#ifndef __ASM_SMP_H
-#define __ASM_SMP_H
-
-#include <linux/config.h>
-#include <linux/threads.h>
-#include <linux/bitops.h>
-
-#if defined(__KERNEL__) && defined(CONFIG_SMP) && !defined(__ASSEMBLY__)
-
-#include <asm/lowcore.h>
-
-/*
-  s390 specific smp.c headers
- */
-typedef struct
-{
-	int        intresting;
-	sigp_ccode ccode; 
-	__u32      status;
-	__u16      cpu;
-} sigp_info;
-
-extern volatile unsigned long cpu_online_map;
-extern volatile unsigned long cpu_possible_map;
-
-#define NO_PROC_ID		0xFF		/* No processor magic marker */
-
-/*
- *	This magic constant controls our willingness to transfer
- *	a process across CPUs. Such a transfer incurs misses on the L1
- *	cache, and on a P6 or P5 with multiple L2 caches L2 hits. My
- *	gut feeling is this will vary by board in value. For a board
- *	with separate L2 cache it probably depends also on the RSS, and
- *	for a board with shared L2 cache it ought to decay fast as other
- *	processes are run.
- */
- 
-#define PROC_CHANGE_PENALTY	20		/* Schedule penalty */
-
-#define smp_processor_id() (current_thread_info()->cpu)
-
-#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
-#define cpu_possible(cpu) (cpu_possible_map & (1<<(cpu)))
-
-extern inline unsigned int num_online_cpus(void)
-{
-	return hweight64(cpu_online_map);
-}
-
-extern inline int any_online_cpu(unsigned int mask)
-{
-	if (mask & cpu_online_map)
-		return __ffs(mask & cpu_online_map);
-
-	return -1;
-}
-
-extern __inline__ __u16 hard_smp_processor_id(void)
-{
-        __u16 cpu_address;
- 
-        __asm__ ("stap %0\n" : "=m" (cpu_address));
-        return cpu_address;
-}
-
-#define cpu_logical_map(cpu) (cpu)
-
-#endif
-#endif
diff -Nru a/include/asm-s390x/socket.h b/include/asm-s390x/socket.h
--- a/include/asm-s390x/socket.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,71 +0,0 @@
-/*
- *  include/asm-s390/socket.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/socket.h"
- */
-
-#ifndef _ASM_SOCKET_H
-#define _ASM_SOCKET_H
-
-#include <asm/sockios.h>
-
-/* For setsockoptions(2) */
-#define SOL_SOCKET	1
-
-#define SO_DEBUG	1
-#define SO_REUSEADDR	2
-#define SO_TYPE		3
-#define SO_ERROR	4
-#define SO_DONTROUTE	5
-#define SO_BROADCAST	6
-#define SO_SNDBUF	7
-#define SO_RCVBUF	8
-#define SO_KEEPALIVE	9
-#define SO_OOBINLINE	10
-#define SO_NO_CHECK	11
-#define SO_PRIORITY	12
-#define SO_LINGER	13
-#define SO_BSDCOMPAT	14
-/* To add :#define SO_REUSEPORT 15 */
-#define SO_PASSCRED	16
-#define SO_PEERCRED	17
-#define SO_RCVLOWAT	18
-#define SO_SNDLOWAT	19
-#define SO_RCVTIMEO	20
-#define SO_SNDTIMEO	21
-
-/* Security levels - as per NRL IPv6 - don't actually do anything */
-#define SO_SECURITY_AUTHENTICATION		22
-#define SO_SECURITY_ENCRYPTION_TRANSPORT	23
-#define SO_SECURITY_ENCRYPTION_NETWORK		24
-
-#define SO_BINDTODEVICE	25
-
-/* Socket filtering */
-#define SO_ATTACH_FILTER        26
-#define SO_DETACH_FILTER        27
-
-#define SO_PEERNAME		28
-#define SO_TIMESTAMP		29
-#define SCM_TIMESTAMP		SO_TIMESTAMP
-#define SO_ACCEPTCONN  		30
-
-/* Nast libc5 fixup - bletch */
-#if defined(__KERNEL__)
-/* Socket types. */
-#define SOCK_STREAM	1		/* stream (connection) socket	*/
-#define SOCK_DGRAM	2		/* datagram (conn.less) socket	*/
-#define SOCK_RAW	3		/* raw socket			*/
-#define SOCK_RDM	4		/* reliably-delivered message	*/
-#define SOCK_SEQPACKET	5		/* sequential packet socket	*/
-#define SOCK_PACKET	10		/* linux specific way of	*/
-					/* getting packets at the dev	*/
-					/* level.  For writing rarp and	*/
-					/* other similar things on the	*/
-					/* user level.			*/
-#define	SOCK_MAX	(SOCK_PACKET+1)
-#endif
-
-#endif /* _ASM_SOCKET_H */
diff -Nru a/include/asm-s390x/sockios.h b/include/asm-s390x/sockios.h
--- a/include/asm-s390x/sockios.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,20 +0,0 @@
-/*
- *  include/asm-s390/sockios.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/sockios.h"
- */
-
-#ifndef __ARCH_S390_SOCKIOS__
-#define __ARCH_S390_SOCKIOS__
-
-/* Socket-level I/O control calls. */
-#define FIOSETOWN 	0x8901
-#define SIOCSPGRP	0x8902
-#define FIOGETOWN	0x8903
-#define SIOCGPGRP	0x8904
-#define SIOCATMARK	0x8905
-#define SIOCGSTAMP	0x8906		/* Get stamp */
-
-#endif
diff -Nru a/include/asm-s390x/spinlock.h b/include/asm-s390x/spinlock.h
--- a/include/asm-s390x/spinlock.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,155 +0,0 @@
-/*
- *  include/asm-s390/spinlock.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/spinlock.h"
- */
-
-#ifndef __ASM_SPINLOCK_H
-#define __ASM_SPINLOCK_H
-
-/*
- * Grmph, take care of %&#! user space programs that include
- * asm/spinlock.h. The diagnose is only available in kernel
- * context.
- */
-#ifdef __KERNEL__
-#include <asm/lowcore.h>
-#define __DIAG44_INSN "ex"
-#define __DIAG44_OPERAND __LC_DIAG44_OPCODE
-#else
-#define __DIAG44_INSN "#"
-#define __DIAG44_OPERAND 0
-#endif
-
-/*
- * Simple spin lock operations.  There are two variants, one clears IRQ's
- * on the local processor, one does not.
- *
- * We make no fairness assumptions. They have a cost.
- */
-
-typedef struct {
-	volatile unsigned int lock;
-} __attribute__ ((aligned (4))) spinlock_t;
-
-#define SPIN_LOCK_UNLOCKED (spinlock_t) { 0 }
-#define spin_lock_init(lp) do { (lp)->lock = 0; } while(0)
-#define spin_unlock_wait(lp)	do { barrier(); } while(((volatile spinlock_t *)(lp))->lock)
-#define spin_is_locked(x) ((x)->lock != 0)
-
-extern inline void _raw_spin_lock(spinlock_t *lp)
-{
-	unsigned long reg1, reg2;
-        __asm__ __volatile("    bras  %1,1f\n"
-                           "0:  " __DIAG44_INSN " 0,%4\n"
-                           "1:  slr   %0,%0\n"
-                           "    cs    %0,%1,0(%3)\n"
-                           "    jl    0b\n"
-                           : "=&d" (reg1), "=&d" (reg2), "+m" (lp->lock)
-                           : "a" (&lp->lock), "i" (__DIAG44_OPERAND)
-			   : "cc" );
-}
-
-extern inline int _raw_spin_trylock(spinlock_t *lp)
-{
-	unsigned int result, reg;
-	__asm__ __volatile("    slr   %0,%0\n"
-			   "    basr  %1,0\n"
-			   "0:  cs    %0,%1,0(%3)"
-			   : "=&d" (result), "=&d" (reg), "+m" (lp->lock)
-			   : "a" (&lp->lock) : "cc" );
-	return !result;
-}
-
-extern inline void _raw_spin_unlock(spinlock_t *lp)
-{
-	__asm__ __volatile("    xc 0(4,%1),0(%1)\n"
-                           "    bcr 15,0"
-			   : "+m" (lp->lock) : "a" (&lp->lock) : "cc" );
-}
-		
-/*
- * Read-write spinlocks, allowing multiple readers
- * but only one writer.
- *
- * NOTE! it is quite common to have readers in interrupts
- * but no interrupt writers. For those circumstances we
- * can "mix" irq-safe locks - any writer needs to get a
- * irq-safe write-lock, but readers can get non-irqsafe
- * read-locks.
- */
-typedef struct {
-	volatile unsigned long lock;
-	volatile unsigned long owner_pc;
-} rwlock_t;
-
-#define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0 }
-
-#define rwlock_init(x)	do { *(x) = RW_LOCK_UNLOCKED; } while(0)
-
-#define rwlock_is_locked(x) ((x)->lock != 0)
-
-#define _raw_read_lock(rw)   \
-        asm volatile("   lg    2,0(%1)\n"   \
-                     "   j     1f\n"     \
-                     "0: " __DIAG44_INSN " 0,%2\n" \
-                     "1: nihh  2,0x7fff\n" /* clear high (=write) bit */ \
-                     "   la    3,1(2)\n"   /* one more reader */  \
-                     "   csg   2,3,0(%1)\n" /* try to write new value */ \
-                     "   jl    0b"       \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
-
-#define _raw_read_unlock(rw) \
-        asm volatile("   lg    2,0(%1)\n"   \
-                     "   j     1f\n"     \
-                     "0: " __DIAG44_INSN " 0,%2\n" \
-                     "1: lgr   3,2\n"    \
-                     "   bctgr 3,0\n"    /* one less reader */ \
-                     "   csg   2,3,0(%1)\n" \
-                     "   jl    0b"       \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
-
-#define _raw_write_lock(rw) \
-        asm volatile("   llihh 3,0x8000\n" /* new lock value = 0x80...0 */ \
-                     "   j     1f\n"       \
-                     "0: " __DIAG44_INSN " 0,%2\n"   \
-                     "1: slgr  2,2\n"      /* old lock value must be 0 */ \
-                     "   csg   2,3,0(%1)\n" \
-                     "   jl    0b"         \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
-
-#define _raw_write_unlock(rw) \
-        asm volatile("   slgr  3,3\n"      /* new lock value = 0 */ \
-                     "   j     1f\n"       \
-                     "0: " __DIAG44_INSN " 0,%2\n"   \
-                     "1: llihh 2,0x8000\n" /* old lock value must be 0x8..0 */\
-                     "   csg   2,3,0(%1)\n"   \
-                     "   jl    0b"         \
-                     : "+m" ((rw)->lock) \
-		     : "a" (&(rw)->lock), "i" (__DIAG44_OPERAND) \
-		     : "2", "3", "cc" )
-
-extern inline int _raw_write_trylock(rwlock_t *rw)
-{
-	unsigned int result, reg;
-	
-	__asm__ __volatile__("   llihh %0,0x8000\n"
-			     "   basr  %1,0\n"
-			     "0: csg %0,%1,0(%3)\n"
-			     : "=&d" (result), "=&d" (reg), "+m" (rw->lock)
-			     : "a" (&rw->lock) : "cc" );
-	return !result;
-}
-
-#endif /* __ASM_SPINLOCK_H */
-
diff -Nru a/include/asm-s390x/stat.h b/include/asm-s390x/stat.h
--- a/include/asm-s390x/stat.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,35 +0,0 @@
-/*
- *  include/asm-s390x/stat.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/stat.h"
- */
-
-#ifndef _S390_STAT_H
-#define _S390_STAT_H
-
-struct stat {
-        unsigned long  st_dev;
-        unsigned long  st_ino;
-        unsigned long  st_nlink;
-        unsigned int   st_mode;
-        unsigned int   st_uid;
-        unsigned int   st_gid;
-        unsigned int   __pad1;
-        unsigned long  st_rdev;
-        unsigned long  st_size;
-        unsigned long  st_atime;
-	unsigned long  st_atime_nsec;
-        unsigned long  st_mtime;
-	unsigned long  st_mtime_nsec;
-        unsigned long  st_ctime;
-	unsigned long  st_ctime_nsec;
-        unsigned long  st_blksize;
-        long           st_blocks;
-        unsigned long  __unused[3];
-};
-
-#define STAT_HAVE_NSEC 1
-
-#endif
diff -Nru a/include/asm-s390x/statfs.h b/include/asm-s390x/statfs.h
--- a/include/asm-s390x/statfs.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,33 +0,0 @@
-/*
- *  include/asm-s390/statfs.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/statfs.h"
- */
-
-#ifndef _S390_STATFS_H
-#define _S390_STATFS_H
-
-#ifndef __KERNEL_STRICT_NAMES
-
-#include <linux/types.h>
-
-typedef __kernel_fsid_t	fsid_t;
-
-#endif
-
-struct statfs {
-	int  f_type;
-	int  f_bsize;
-	long f_blocks;
-	long f_bfree;
-	long f_bavail;
-	long f_files;
-	long f_ffree;
-	__kernel_fsid_t f_fsid;
-	int  f_namelen;
-	int  f_spare[6];
-};
-
-#endif
diff -Nru a/include/asm-s390x/string.h b/include/asm-s390x/string.h
--- a/include/asm-s390x/string.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,112 +0,0 @@
-/*
- *  include/asm-s390/string.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- */
-
-#ifndef _S390_STRING_H_
-#define _S390_STRING_H_
-
-#ifdef __KERNEL__
-
-#ifndef _LINUX_TYPES_H
-#include <linux/types.h>
-#endif
-
-#define __HAVE_ARCH_MEMCHR
-#define __HAVE_ARCH_MEMCPY
-#define __HAVE_ARCH_MEMSET
-#define __HAVE_ARCH_STRCAT
-#define __HAVE_ARCH_STRCMP
-#define __HAVE_ARCH_STRCPY
-#define __HAVE_ARCH_STRLEN
-#define __HAVE_ARCH_STRNCPY
-
-#undef __HAVE_ARCH_MEMMOVE
-#undef __HAVE_ARCH_STRNICMP
-#undef __HAVE_ARCH_STRNCAT
-#undef __HAVE_ARCH_STRNCMP
-#undef __HAVE_ARCH_STRCHR
-#undef __HAVE_ARCH_STRRCHR
-#undef __HAVE_ARCH_STRNLEN
-#undef __HAVE_ARCH_STRSPN
-#undef __HAVE_ARCH_STRPBRK
-#undef __HAVE_ARCH_STRTOK
-#undef __HAVE_ARCH_BCOPY
-#undef __HAVE_ARCH_MEMCMP
-#undef __HAVE_ARCH_MEMSCAN
-#undef __HAVE_ARCH_STRSTR
-
-extern void *memset(void *, int, size_t);
-extern void *memcpy(void *, const void *, size_t);
-extern void *memmove(void *, const void *, size_t);
-extern char *strncpy(char *, const char *, size_t);
-extern int strcmp(const char *,const char *);
-
-static inline void * memchr(const void * cs,int c,size_t count)
-{
-    void *ptr;
-
-    __asm__ __volatile__ ("   lgr   0,%2\n"
-                          "   lgr   1,%1\n"
-                          "   la    %0,0(%3,%1)\n"
-                          "0: srst  %0,1\n"
-                          "   jo    0b\n"
-                          "   brc   13,1f\n"
-                          "   slgr  %0,%0\n"
-                          "1:"
-                          : "=&a" (ptr) : "a" (cs), "d" (c), "d" (count)
-                          : "cc", "0", "1" );
-    return ptr;
-}
-
-static __inline__ char *strcpy(char *dest, const char *src)
-{
-    char *tmp = dest;
-
-    __asm__ __volatile__ ("   slgr  0,0\n"
-                          "0: mvst  %0,%1\n"
-                          "   jo    0b"
-                          : "+&a" (dest), "+&a" (src) :
-                          : "cc", "memory", "0" );
-    return tmp;
-}
-
-static __inline__ size_t strlen(const char *s)
-{
-    size_t len;
-
-    __asm__ __volatile__ ("   slgr  0,0\n"
-                          "   lgr   %0,%1\n"
-                          "0: srst  0,%0\n"
-                          "   jo    0b\n"
-                          "   lgr   %0,0\n"
-                          "   sgr   %0,%1"
-                          : "=&a" (len) : "a" (s) 
-                          : "cc", "0" );
-    return len;
-}
-
-static __inline__ char *strcat(char *dest, const char *src)
-{
-    char *tmp = dest;
-
-    __asm__ __volatile__ ("   slgr  0,0\n"
-                          "0: srst  0,%0\n"
-                          "   jo    0b\n"
-                          "   lgr   %0,0\n"
-                          "   slgr  0,0\n"
-                          "1: mvst  %0,%1\n"
-                          "   jo    1b"
-                          : "+&a" (dest), "+&a" (src) :
-                          : "cc", "memory", "0" );
-    return tmp;
-}
-
-extern void *alloca(size_t);
-#endif /* __KERNEL__ */
-
-#endif /* __S390_STRING_H_ */
-
diff -Nru a/include/asm-s390x/suspend.h b/include/asm-s390x/suspend.h
--- a/include/asm-s390x/suspend.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,5 +0,0 @@
-#ifndef __ASM_S390X_SUSPEND_H
-#define __ASM_S390X_SUSPEND_H
-
-#endif
-
diff -Nru a/include/asm-s390x/system.h b/include/asm-s390x/system.h
--- a/include/asm-s390x/system.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,360 +0,0 @@
-/*
- *  include/asm-s390/system.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
- *
- *  Derived from "include/asm-i386/system.h"
- */
-
-#ifndef __ASM_SYSTEM_H
-#define __ASM_SYSTEM_H
-
-#include <linux/config.h>
-#include <linux/kernel.h>
-#include <asm/types.h>
-#include <asm/ptrace.h>
-#include <asm/setup.h>
-
-#ifdef __KERNEL__
-
-struct task_struct;
-
-extern struct task_struct *resume(void *, void *);
-
-static inline void save_fp_regs(s390_fp_regs *fpregs)
-{
-	asm volatile (
-		"   stfpc 0(%0)\n"
-		"   std   0,8(%0)\n"
-		"   std   1,16(%0)\n"
-		"   std   2,24(%0)\n"
-		"   std   3,32(%0)\n"
-		"   std   4,40(%0)\n"
-		"   std   5,48(%0)\n"
-		"   std   6,56(%0)\n"
-		"   std   7,64(%0)\n"
-		"   std   8,72(%0)\n"
-		"   std   9,80(%0)\n"
-		"   std   10,88(%0)\n"
-		"   std   11,96(%0)\n"
-		"   std   12,104(%0)\n"
-		"   std   13,112(%0)\n"
-		"   std   14,120(%0)\n"
-		"   std   15,128(%0)\n"
-		: : "a" (fpregs) : "memory" );
-}
-
-static inline void restore_fp_regs(s390_fp_regs *fpregs)
-{
-	asm volatile (
-		"   lfpc  0(%0)\n"
-		"   ld    0,8(%0)\n"
-		"   ld    1,16(%0)\n"
-		"   ld    2,24(%0)\n"
-		"   ld    3,32(%0)\n"
-		"   ld    4,40(%0)\n"
-		"   ld    5,48(%0)\n"
-		"   ld    6,56(%0)\n"
-		"   ld    7,64(%0)\n"
-		"   ld    8,72(%0)\n"
-		"   ld    9,80(%0)\n"
-		"   ld    10,88(%0)\n"
-		"   ld    11,96(%0)\n"
-		"   ld    12,104(%0)\n"
-		"   ld    13,112(%0)\n"
-		"   ld    14,120(%0)\n"
-		"   ld    15,128(%0)\n"
-		: : "a" (fpregs));
-}
-
-#define switch_to(prev,next,last) do {					     \
-	if (prev == next)						     \
-		break;							     \
-	save_fp_regs(&prev->thread.fp_regs);				     \
-	restore_fp_regs(&next->thread.fp_regs);				     \
-	resume(prev,next);						     \
-} while (0)
-
-#define nop() __asm__ __volatile__ ("nop")
-
-#define xchg(ptr,x) \
-  ((__typeof__(*(ptr)))__xchg((unsigned long)(x),(void *)(ptr),sizeof(*(ptr))))
-
-extern void __misaligned_u16(void);
-extern void __misaligned_u32(void);
-extern void __misaligned_u64(void);
-
-static inline unsigned long __xchg(unsigned long x, void * ptr, int size)
-{
-	unsigned long addr, old;
-	int shift;
-
-        switch (size) {
-	case 1:
-		addr = (unsigned long) ptr;
-		shift = (3 ^ (addr & 3)) << 3;
-		addr ^= addr & 3;
-		asm volatile(
-			"    l   %0,0(%3)\n"
-			"0:  lr  0,%0\n"
-			"    nr  0,%2\n"
-			"    or  0,%1\n"
-			"    cs  %0,0,0(%3)\n"
-			"    jl  0b\n"
-			: "=&d" (old)
-			: "d" (x << shift), "d" (~(255 << shift)), "a" (addr)
-			: "memory", "cc", "0" );
-		x = old >> shift;
-		break;
-	case 2:
-		addr = (unsigned long) ptr;
-		shift = (2 ^ (addr & 2)) << 3;
-		addr ^= addr & 2;
-		asm volatile(
-			"    l   %0,0(%3)\n"
-			"0:  lr  0,%0\n"
-			"    nr  0,%2\n"
-			"    or  0,%1\n"
-			"    cs  %0,0,0(%3)\n"
-			"    jl  0b\n"
-			: "=&d" (old) 
-			: "d" (x << shift), "d" (~(65535 << shift)), "a" (addr)
-			: "memory", "cc", "0" );
-		x = old >> shift;
-		break;
-	case 4:
-		asm volatile (
-			"    l   %0,0(%2)\n"
-			"0:  cs  %0,%1,0(%2)\n"
-			"    jl  0b\n"
-			: "=&d" (old) : "d" (x), "a" (ptr)
-			: "memory", "cc", "0" );
-		x = old;
-		break;
-	case 8:
-		asm volatile (
-			"    lg  %0,0(%2)\n"
-			"0:  csg %0,%1,0(%2)\n"
-			"    jl  0b\n"
-			: "=&d" (old) : "d" (x), "a" (ptr)
-			: "memory", "cc", "0" );
-		x = old;
-		break;
-        }
-        return x;
-}
-
-/*
- * Atomic compare and exchange.  Compare OLD with MEM, if identical,
- * store NEW in MEM.  Return the initial value in MEM.  Success is
- * indicated by comparing RETURN with OLD.
- */
-
-#define __HAVE_ARCH_CMPXCHG 1
-
-#define cmpxchg(ptr,o,n)\
-	((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-					(unsigned long)(n),sizeof(*(ptr))))
-
-static inline unsigned long
-__cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
-{
-	unsigned long addr, prev, tmp;
-	int shift;
-
-        switch (size) {
-	case 1:
-		addr = (unsigned long) ptr;
-		shift = (3 ^ (addr & 3)) << 3;
-		addr ^= addr & 3;
-		asm volatile(
-			"    l   %0,0(%4)\n"
-			"0:  nr  %0,%5\n"
-                        "    lr  %1,%0\n"
-			"    or  %0,%2\n"
-			"    or  %1,%3\n"
-			"    cs  %0,%1,0(%4)\n"
-			"    jnl 1f\n"
-			"    xr  %1,%0\n"
-			"    nr  %1,%5\n"
-			"    jnz 0b\n"
-			"1:"
-			: "=&d" (prev), "=&d" (tmp)
-			: "d" (old << shift), "d" (new << shift), "a" (ptr),
-			  "d" (~(255 << shift))
-			: "memory", "cc" );
-		return prev >> shift;
-	case 2:
-		addr = (unsigned long) ptr;
-		shift = (2 ^ (addr & 2)) << 3;
-		addr ^= addr & 2;
-		asm volatile(
-			"    l   %0,0(%4)\n"
-			"0:  nr  %0,%5\n"
-                        "    lr  %1,%0\n"
-			"    or  %0,%2\n"
-			"    or  %1,%3\n"
-			"    cs  %0,%1,0(%4)\n"
-			"    jnl 1f\n"
-			"    xr  %1,%0\n"
-			"    nr  %1,%5\n"
-			"    jnz 0b\n"
-			"1:"
-			: "=&d" (prev), "=&d" (tmp)
-			: "d" (old << shift), "d" (new << shift), "a" (ptr),
-			  "d" (~(65535 << shift))
-			: "memory", "cc" );
-		return prev >> shift;
-	case 4:
-		asm volatile (
-			"    cs  %0,%2,0(%3)\n"
-			: "=&d" (prev) : "0" (old), "d" (new), "a" (ptr)
-			: "memory", "cc" );
-		return prev;
-	case 8:
-		asm volatile (
-			"    csg %0,%2,0(%3)\n"
-			: "=&d" (prev) : "0" (old), "d" (new), "a" (ptr)
-			: "memory", "cc" );
-		return prev;
-        }
-        return old;
-}
-
-/*
- * Force strict CPU ordering.
- * And yes, this is required on UP too when we're talking
- * to devices.
- *
- * This is very similar to the ppc eieio/sync instruction in that is
- * does a checkpoint syncronisation & makes sure that 
- * all memory ops have completed wrt other CPU's ( see 7-15 POP  DJB ).
- */
-
-#define eieio()  __asm__ __volatile__ ( "bcr 15,0" : : : "memory" ) 
-# define SYNC_OTHER_CORES(x)   eieio() 
-#define mb()    eieio()
-#define rmb()   eieio()
-#define wmb()   eieio()
-#define read_barrier_depends()	do { } while(0)
-#define smp_mb()       mb()
-#define smp_rmb()      rmb()
-#define smp_wmb()      wmb()
-#define smp_read_barrier_depends()    read_barrier_depends()
-#define smp_mb__before_clear_bit()     smp_mb()
-#define smp_mb__after_clear_bit()      smp_mb()
-
-#define set_mb(var, value)      do { var = value; mb(); } while (0)
-#define set_wmb(var, value)     do { var = value; wmb(); } while (0)
-
-/* interrupt control.. */
-#define local_irq_enable() ({ \
-        unsigned long __dummy; \
-        __asm__ __volatile__ ( \
-                "stosm 0(%1),0x03" : "=m" (__dummy) : "a" (&__dummy) ); \
-        })
-
-#define local_irq_disable() ({ \
-        unsigned long __flags; \
-        __asm__ __volatile__ ( \
-                "stnsm 0(%1),0xfc" : "=m" (__flags) : "a" (&__flags) ); \
-        __flags; \
-        })
-
-#define local_save_flags(x) \
-        __asm__ __volatile__("stosm 0(%1),0" : "=m" (x) : "a" (&x) )
-
-#define local_irq_restore(x) \
-        __asm__ __volatile__("ssm   0(%0)" : : "a" (&x) )
-
-#define irqs_disabled()			\
-({					\
-	unsigned long flags;		\
-	local_save_flags(flags);	\
-        !((flags >> 56) & 3);		\
-})
-
-#define __load_psw(psw) \
-        __asm__ __volatile__("lpswe 0(%0)" : : "a" (&psw) : "cc" );
-
-#define __ctl_load(array, low, high) ({ \
-	__asm__ __volatile__ ( \
-		"   la    1,%0\n" \
-		"   bras  2,0f\n" \
-                "   lctlg 0,0,0(1)\n" \
-		"0: ex    %1,0(2)" \
-		: : "m" (array), "a" (((low)<<4)+(high)) : "1", "2" ); \
-	})
-
-#define __ctl_store(array, low, high) ({ \
-	__asm__ __volatile__ ( \
-		"   la    1,%0\n" \
-		"   bras  2,0f\n" \
-		"   stctg 0,0,0(1)\n" \
-		"0: ex    %1,0(2)" \
-		: "=m" (array) : "a" (((low)<<4)+(high)): "1", "2" ); \
-	})
-
-#define __ctl_set_bit(cr, bit) ({ \
-        __u8 __dummy[24]; \
-        __asm__ __volatile__ ( \
-                "    la    1,%0\n"       /* align to 8 byte */ \
-                "    aghi  1,7\n" \
-                "    nill  1,0xfff8\n" \
-                "    bras  2,0f\n"       /* skip indirect insns */ \
-                "    stctg 0,0,0(1)\n" \
-                "    lctlg 0,0,0(1)\n" \
-                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
-                "    lg    0,0(1)\n" \
-                "    ogr   0,%2\n"       /* set the bit */ \
-                "    stg   0,0(1)\n" \
-                "1:  ex    %1,6(2)"      /* execute lctl */ \
-                : "=m" (__dummy) : "a" (cr*17), "a" (1L<<(bit)) \
-                : "cc", "0", "1", "2"); \
-        })
-
-#define __ctl_clear_bit(cr, bit) ({ \
-        __u8 __dummy[24]; \
-        __asm__ __volatile__ ( \
-                "    la    1,%0\n"       /* align to 8 byte */ \
-                "    aghi  1,7\n" \
-                "    nill  1,0xfff8\n" \
-                "    bras  2,0f\n"       /* skip indirect insns */ \
-                "    stctg 0,0,0(1)\n" \
-                "    lctlg 0,0,0(1)\n" \
-                "0:  ex    %1,0(2)\n"    /* execute stctl */ \
-                "    lg    0,0(1)\n" \
-                "    ngr   0,%2\n"       /* set the bit */ \
-                "    stg   0,0(1)\n" \
-                "1:  ex    %1,6(2)"      /* execute lctl */ \
-                : "=m" (__dummy) : "a" (cr*17), "a" (~(1L<<(bit))) \
-                : "cc", "0", "1", "2"); \
-        })
-
-/* For spinlocks etc */
-#define local_irq_save(x)	((x) = local_irq_disable())
-
-#ifdef CONFIG_SMP
-
-extern void smp_ctl_set_bit(int cr, int bit);
-extern void smp_ctl_clear_bit(int cr, int bit);
-#define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit)
-#define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit)
-
-#else
-
-#define ctl_set_bit(cr, bit) __ctl_set_bit(cr, bit)
-#define ctl_clear_bit(cr, bit) __ctl_clear_bit(cr, bit)
-
-#endif /* CONFIG_SMP */
-
-extern void (*_machine_restart)(char *command);
-extern void (*_machine_halt)(void);
-extern void (*_machine_power_off)(void);
-
-#endif /* __KERNEL __ */
-
-#endif
-
diff -Nru a/include/asm-s390x/tape390.h b/include/asm-s390x/tape390.h
--- a/include/asm-s390x/tape390.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,39 +0,0 @@
-/*************************************************************************
- *
- * tape390.h
- *         enables user programs to display messages on the tape device
- *
- *  S390 and zSeries version
- *         Copyright (C) 2001 IBM Corporation
- *         Author(s): Despina Papadopoulou <despina_p@de.ibm.com>
- *
- *************************************************************************/
-
-#ifndef _TAPE390_H
-#define _TAPE390_H
-
-#define TAPE390_DISPLAY _IOW('d', 1, struct display_struct)
-
-/*
- * The TAPE390_DISPLAY ioctl calls the Load Display command
- * which transfers 17 bytes of data from the channel to the subsystem:
- *     - 1 format control byte, and
- *     - two 8-byte messages
- *
- * Format control byte:
- *   0-2: New Message Overlay
- *     3: Alternate Messages
- *     4: Blink Message
- *     5: Display Low/High Message
- *     6: Reserved
- *     7: Automatic Load Request
- *
- */
-
-typedef struct display_struct {
-        char cntrl;
-        char message1[8];
-        char message2[8];
-} display_struct;
-
-#endif 
diff -Nru a/include/asm-s390x/termbits.h b/include/asm-s390x/termbits.h
--- a/include/asm-s390x/termbits.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,180 +0,0 @@
-/*
- *  include/asm-s390/termbits.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/termbits.h"
- */
-
-#ifndef __ARCH_S390_TERMBITS_H__
-#define __ARCH_S390_TERMBITS_H__
-
-#include <linux/posix_types.h>
-
-typedef unsigned char	cc_t;
-typedef unsigned int	speed_t;
-typedef unsigned int	tcflag_t;
-
-#define NCCS 19
-struct termios {
-	tcflag_t c_iflag;		/* input mode flags */
-	tcflag_t c_oflag;		/* output mode flags */
-	tcflag_t c_cflag;		/* control mode flags */
-	tcflag_t c_lflag;		/* local mode flags */
-	cc_t c_line;			/* line discipline */
-	cc_t c_cc[NCCS];		/* control characters */
-};
-
-/* c_cc characters */
-#define VINTR 0
-#define VQUIT 1
-#define VERASE 2
-#define VKILL 3
-#define VEOF 4
-#define VTIME 5
-#define VMIN 6
-#define VSWTC 7
-#define VSTART 8
-#define VSTOP 9
-#define VSUSP 10
-#define VEOL 11
-#define VREPRINT 12
-#define VDISCARD 13
-#define VWERASE 14
-#define VLNEXT 15
-#define VEOL2 16
-
-/* c_iflag bits */
-#define IGNBRK	0000001
-#define BRKINT	0000002
-#define IGNPAR	0000004
-#define PARMRK	0000010
-#define INPCK	0000020
-#define ISTRIP	0000040
-#define INLCR	0000100
-#define IGNCR	0000200
-#define ICRNL	0000400
-#define IUCLC	0001000
-#define IXON	0002000
-#define IXANY	0004000
-#define IXOFF	0010000
-#define IMAXBEL	0020000
-
-/* c_oflag bits */
-#define OPOST	0000001
-#define OLCUC	0000002
-#define ONLCR	0000004
-#define OCRNL	0000010
-#define ONOCR	0000020
-#define ONLRET	0000040
-#define OFILL	0000100
-#define OFDEL	0000200
-#define NLDLY	0000400
-#define   NL0	0000000
-#define   NL1	0000400
-#define CRDLY	0003000
-#define   CR0	0000000
-#define   CR1	0001000
-#define   CR2	0002000
-#define   CR3	0003000
-#define TABDLY	0014000
-#define   TAB0	0000000
-#define   TAB1	0004000
-#define   TAB2	0010000
-#define   TAB3	0014000
-#define   XTABS	0014000
-#define BSDLY	0020000
-#define   BS0	0000000
-#define   BS1	0020000
-#define VTDLY	0040000
-#define   VT0	0000000
-#define   VT1	0040000
-#define FFDLY	0100000
-#define   FF0	0000000
-#define   FF1	0100000
-
-/* c_cflag bit meaning */
-#define CBAUD	0010017
-#define  B0	0000000		/* hang up */
-#define  B50	0000001
-#define  B75	0000002
-#define  B110	0000003
-#define  B134	0000004
-#define  B150	0000005
-#define  B200	0000006
-#define  B300	0000007
-#define  B600	0000010
-#define  B1200	0000011
-#define  B1800	0000012
-#define  B2400	0000013
-#define  B4800	0000014
-#define  B9600	0000015
-#define  B19200	0000016
-#define  B38400	0000017
-#define EXTA B19200
-#define EXTB B38400
-#define CSIZE	0000060
-#define   CS5	0000000
-#define   CS6	0000020
-#define   CS7	0000040
-#define   CS8	0000060
-#define CSTOPB	0000100
-#define CREAD	0000200
-#define PARENB	0000400
-#define PARODD	0001000
-#define HUPCL	0002000
-#define CLOCAL	0004000
-#define CBAUDEX 0010000
-#define  B57600  0010001
-#define  B115200 0010002
-#define  B230400 0010003
-#define  B460800 0010004
-#define   B500000 0010005
-#define   B576000 0010006
-#define   B921600 0010007
-#define  B1000000 0010010
-#define  B1152000 0010011
-#define  B1500000 0010012
-#define  B2000000 0010013
-#define  B2500000 0010014
-#define  B3000000 0010015
-#define  B3500000 0010016
-#define  B4000000 0010017
-#define CIBAUD	  002003600000	/* input baud rate (not used) */
-#define CMSPAR	  010000000000		/* mark or space (stick) parity */
-#define CRTSCTS	  020000000000		/* flow control */
-
-/* c_lflag bits */
-#define ISIG	0000001
-#define ICANON	0000002
-#define XCASE	0000004
-#define ECHO	0000010
-#define ECHOE	0000020
-#define ECHOK	0000040
-#define ECHONL	0000100
-#define NOFLSH	0000200
-#define TOSTOP	0000400
-#define ECHOCTL	0001000
-#define ECHOPRT	0002000
-#define ECHOKE	0004000
-#define FLUSHO	0010000
-#define PENDIN	0040000
-#define IEXTEN	0100000
-
-/* tcflow() and TCXONC use these */
-#define	TCOOFF		0
-#define	TCOON		1
-#define	TCIOFF		2
-#define	TCION		3
-
-/* tcflush() and TCFLSH use these */
-#define	TCIFLUSH	0
-#define	TCOFLUSH	1
-#define	TCIOFLUSH	2
-
-/* tcsetattr uses these */
-#define	TCSANOW		0
-#define	TCSADRAIN	1
-#define	TCSAFLUSH	2
-
-#endif
diff -Nru a/include/asm-s390x/termios.h b/include/asm-s390x/termios.h
--- a/include/asm-s390x/termios.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,115 +0,0 @@
-/*
- *  include/asm-s390/termios.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/termios.h"
- */
-
-#ifndef _S390_TERMIOS_H
-#define _S390_TERMIOS_H
-
-#include <asm/termbits.h>
-#include <asm/ioctls.h>
-
-
-struct winsize {
-	unsigned short ws_row;
-	unsigned short ws_col;
-	unsigned short ws_xpixel;
-	unsigned short ws_ypixel;
-};
-
-#define NCC 8
-struct termio {
-	unsigned short c_iflag;		/* input mode flags */
-	unsigned short c_oflag;		/* output mode flags */
-	unsigned short c_cflag;		/* control mode flags */
-	unsigned short c_lflag;		/* local mode flags */
-	unsigned char c_line;		/* line discipline */
-	unsigned char c_cc[NCC];	/* control characters */
-};
-
-/* modem lines */
-#define TIOCM_LE	0x001
-#define TIOCM_DTR	0x002
-#define TIOCM_RTS	0x004
-#define TIOCM_ST	0x008
-#define TIOCM_SR	0x010
-#define TIOCM_CTS	0x020
-#define TIOCM_CAR	0x040
-#define TIOCM_RNG	0x080
-#define TIOCM_DSR	0x100
-#define TIOCM_CD	TIOCM_CAR
-#define TIOCM_RI	TIOCM_RNG
-#define TIOCM_OUT1	0x2000
-#define TIOCM_OUT2	0x4000
-#define TIOCM_LOOP      0x8000
-
-/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
-
-/* line disciplines */
-#define N_TTY		0
-#define N_SLIP		1
-#define N_MOUSE		2
-#define N_PPP		3
-#define N_STRIP		4
-#define N_AX25		5
-#define N_X25		6	/* X.25 async */
-#define N_6PACK		7
-#define N_MASC		8	/* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964		9	/* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL	10	/* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA		11	/* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK	12	/* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13	/* synchronous HDLC */
-#define N_HCI		15	/* Bluetooth HCI UART */
-
-#ifdef __KERNEL__
-
-/*	intr=^C		quit=^\		erase=del	kill=^U
-	eof=^D		vtime=\0	vmin=\1		sxtc=\0
-	start=^Q	stop=^S		susp=^Z		eol=\0
-	reprint=^R	discard=^U	werase=^W	lnext=^V
-	eol2=\0
-*/
-#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
-
-/*
- * Translate a "termio" structure into a "termios". Ugh.
- */
-
-#define user_termio_to_kernel_termios(termios, termio) \
-({ \
-        unsigned short tmp; \
-        get_user(tmp, &(termio)->c_iflag); \
-        (termios)->c_iflag = (0xffff0000 & ((termios)->c_iflag)) | tmp; \
-        get_user(tmp, &(termio)->c_oflag); \
-        (termios)->c_oflag = (0xffff0000 & ((termios)->c_oflag)) | tmp; \
-        get_user(tmp, &(termio)->c_cflag); \
-        (termios)->c_cflag = (0xffff0000 & ((termios)->c_cflag)) | tmp; \
-        get_user(tmp, &(termio)->c_lflag); \
-        (termios)->c_lflag = (0xffff0000 & ((termios)->c_lflag)) | tmp; \
-        get_user((termios)->c_line, &(termio)->c_line); \
-	copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \
-})
-
-/*
- * Translate a "termios" structure into a "termio". Ugh.
- */
-#define kernel_termios_to_user_termio(termio, termios) \
-({ \
-	put_user((termios)->c_iflag, &(termio)->c_iflag); \
-	put_user((termios)->c_oflag, &(termio)->c_oflag); \
-	put_user((termios)->c_cflag, &(termio)->c_cflag); \
-	put_user((termios)->c_lflag, &(termio)->c_lflag); \
-	put_user((termios)->c_line,  &(termio)->c_line); \
-	copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \
-})
-
-#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios))
-#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios))
-
-#endif	/* __KERNEL__ */
-
-#endif	/* _S390_TERMIOS_H */
diff -Nru a/include/asm-s390x/thread_info.h b/include/asm-s390x/thread_info.h
--- a/include/asm-s390x/thread_info.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,95 +0,0 @@
-/*
- *  include/asm-s390/thread_info.h
- *
- *  S390 version
- *    Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
- */
-
-#ifndef _ASM_THREAD_INFO_H
-#define _ASM_THREAD_INFO_H
-
-#ifdef __KERNEL__
-
-#ifndef __ASSEMBLY__
-#include <asm/processor.h>
-
-/*
- * low level task data that entry.S needs immediate access to
- * - this struct should fit entirely inside of one cache line
- * - this struct shares the supervisor stack pages
- * - if the contents of this structure are changed, the assembly constants must also be changed
- */
-struct thread_info {
-	struct task_struct	*task;		/* main task structure */
-	struct exec_domain	*exec_domain;	/* execution domain */
-	unsigned long		flags;		/* low level flags */
-	unsigned int		cpu;		/* current CPU */
-	unsigned int		preempt_count;  /* 0 => preemptable */
-	struct restart_block	restart_block;
-};
-
-/*
- * macros/functions for gaining access to the thread information structure
- */
-#define INIT_THREAD_INFO(tsk)			\
-{						\
-	.task		= &tsk,			\
-	.exec_domain	= &default_exec_domain,	\
-	.flags		= 0,			\
-	.cpu		= 0,			\
-	.restart_block	= {			\
-		.fn = do_no_restart_syscall,	\
-	},					\
-}
-
-#define init_thread_info	(init_thread_union.thread_info)
-#define init_stack		(init_thread_union.stack)
-
-/* how to get the thread information struct from C */
-static inline struct thread_info *current_thread_info(void)
-{
-	return (struct thread_info *)((*(unsigned long *) 0xd40)-16384);
-}
-
-/* thread information allocation */
-#define alloc_thread_info() ((struct thread_info *) \
-	__get_free_pages(GFP_KERNEL,2))
-#define free_thread_info(ti) free_pages((unsigned long) (ti), 2)
-#define get_thread_info(ti) get_task_struct((ti)->task)
-#define put_thread_info(ti) put_task_struct((ti)->task)
-
-#endif
-
-/*
- * Size of kernel stack for each process
- */
-#define THREAD_SIZE (4*PAGE_SIZE)
-
-/*
- * thread information flags bit numbers
- */
-#define TIF_SYSCALL_TRACE	0	/* syscall trace active */
-#define TIF_NOTIFY_RESUME	1	/* resumption notification requested */
-#define TIF_SIGPENDING		2	/* signal pending */
-#define TIF_NEED_RESCHED	3	/* rescheduling necessary */
-#define TIF_RESTART_SVC		4	/* restart svc with new svc number */
-#define TIF_USEDFPU		16	/* FPU was used by this task this quantum (SMP) */
-#define TIF_POLLING_NRFLAG	17	/* true if poll_idle() is polling 
-					   TIF_NEED_RESCHED */
-#define TIF_31BIT		18	/* 32bit process */ 
-
-#define _TIF_SYSCALL_TRACE	(1<<TIF_SYSCALL_TRACE)
-#define _TIF_NOTIFY_RESUME	(1<<TIF_NOTIFY_RESUME)
-#define _TIF_SIGPENDING		(1<<TIF_SIGPENDING)
-#define _TIF_NEED_RESCHED	(1<<TIF_NEED_RESCHED)
-#define _TIF_RESTART_SVC	(1<<TIF_RESTART_SVC)
-#define _TIF_USEDFPU		(1<<TIF_USEDFPU)
-#define _TIF_POLLING_NRFLAG	(1<<TIF_POLLING_NRFLAG)
-#define _TIF_31BIT		(1<<TIF_31BIT)
-
-#endif /* __KERNEL__ */
-
-#define PREEMPT_ACTIVE		0x4000000
-
-#endif /* _ASM_THREAD_INFO_H */
diff -Nru a/include/asm-s390x/timex.h b/include/asm-s390x/timex.h
--- a/include/asm-s390x/timex.h	Sat Apr 19 19:51:29 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,40 +0,0 @@
-/*
- *  include/asm-s390/timex.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *
- *  Derived from "include/asm-i386/timex.h"
- *    Copyright (C) 1992, Linus Torvalds
- */
-
-#ifndef _ASM_S390_TIMEX_H
-#define _ASM_S390_TIMEX_H
-
-#define CLOCK_TICK_RATE	1193180 /* Underlying HZ */
-#define CLOCK_TICK_FACTOR	20	/* Factor of both 1000000 and CLOCK_TICK_RATE */
-#define FINETUNE ((((((long)LATCH * HZ - CLOCK_TICK_RATE) << SHIFT_HZ) * \
-	(1000000/CLOCK_TICK_FACTOR) / (CLOCK_TICK_RATE/CLOCK_TICK_FACTOR)) \
-		<< (SHIFT_SCALE-SHIFT_HZ)) / HZ)
-
-typedef unsigned long long cycles_t;
-
-extern cycles_t cacheflush_time;
-
-static inline cycles_t get_cycles(void)
-{
-	cycles_t cycles;
-
-	__asm__("stck 0(%0)" : : "a" (&(cycles)) : "memory", "cc");
-	return cycles >> 2;
-}
-
-static inline unsigned long long get_clock (void)
-{
-	unsigned long long clock;
-
-	__asm__("stck 0(%0)" : : "a" (&(clock)) : "memory", "cc");
-	return clock;
-}
-
-#endif
diff -Nru a/include/asm-s390x/tlb.h b/include/asm-s390x/tlb.h
--- a/include/asm-s390x/tlb.h	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,20 +0,0 @@
-#ifndef _S390X_TLB_H
-#define _S390X_TLB_H
-
-/*
- * s390x doesn't need any special per-pte or
- * per-vma handling..
- */
-#define tlb_start_vma(tlb, vma) do { } while (0)
-#define tlb_end_vma(tlb, vma) do { } while (0)
-#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0)
-
-/*
- * .. because we flush the whole mm when it
- * fills up.
- */
-#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
-
-#include <asm-generic/tlb.h>
-
-#endif
diff -Nru a/include/asm-s390x/tlbflush.h b/include/asm-s390x/tlbflush.h
--- a/include/asm-s390x/tlbflush.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,138 +0,0 @@
-#ifndef _S390X_TLBFLUSH_H
-#define _S390X_TLBFLUSH_H
-
-#include <linux/config.h>
-#include <linux/mm.h>
-#include <asm/processor.h>
-
-/*
- * TLB flushing:
- *
- *  - flush_tlb() flushes the current mm struct TLBs
- *  - flush_tlb_all() flushes all processes TLBs 
- *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
- *  - flush_tlb_page(vma, vmaddr) flushes one page
- *  - flush_tlb_range(vma, start, end) flushes a range of pages
- *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
- *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
- */
-
-/*
- * S/390 has three ways of flushing TLBs
- * 'ptlb' does a flush of the local processor
- * 'csp' flushes the TLBs on all PUs of a SMP
- * 'ipte' invalidates a pte in a page table and flushes that out of
- * the TLBs of all PUs of a SMP
- */
-
-#define local_flush_tlb() \
-do {  __asm__ __volatile__("ptlb": : :"memory"); } while (0)
-
-#ifndef CONFIG_SMP
-
-/*
- * We always need to flush, since s390 does not flush tlb
- * on each context switch
- */
-
-static inline void flush_tlb(void)
-{
-	local_flush_tlb();
-}
-static inline void flush_tlb_all(void)
-{
-	local_flush_tlb();
-}
-static inline void flush_tlb_mm(struct mm_struct *mm) 
-{
-	local_flush_tlb();
-}
-static inline void flush_tlb_page(struct vm_area_struct *vma,
-				  unsigned long addr)
-{
-	local_flush_tlb();
-}
-static inline void flush_tlb_range(struct vm_area_struct *vma,
-				   unsigned long start, unsigned long end)
-{
-	local_flush_tlb();
-}
-
-#define flush_tlb_kernel_range(start, end) \
-	local_flush_tlb();
-
-#else
-
-#include <asm/smp.h>
-
-extern void smp_ptlb_all(void);
-
-static inline void global_flush_tlb(void)
-{
-	long dummy = 0;
-
-	__asm__ __volatile__ (
-                "    la   4,1(%0)\n"
-                "    slr  2,2\n"
-                "    slr  3,3\n"
-                "    csp  2,4"
-                : : "a" (&dummy) : "cc", "2", "3", "4" );
-}
-
-/*
- * We only have to do global flush of tlb if process run since last
- * flush on any other pu than current. 
- * If we have threads (mm->count > 1) we always do a global flush, 
- * since the process runs on more than one processor at the same time.
- */
-
-static inline void __flush_tlb_mm(struct mm_struct * mm)
-{
-	preempt_disable();
-	if (mm->cpu_vm_mask != (1UL << smp_processor_id())) {
-		/* mm was active on more than one cpu. */
-		if (mm == current->active_mm &&
-		    atomic_read(&mm->mm_users) == 1)
-			/* this cpu is the only one using the mm. */
-			mm->cpu_vm_mask = 1UL << smp_processor_id();
-		global_flush_tlb();
-	} else
-		local_flush_tlb();
-	preempt_enable();
-}
-
-static inline void flush_tlb(void)
-{
-	__flush_tlb_mm(current->mm);
-}
-static inline void flush_tlb_all(void)
-{
-	global_flush_tlb();
-}
-static inline void flush_tlb_mm(struct mm_struct *mm) 
-{
-	__flush_tlb_mm(mm); 
-}
-static inline void flush_tlb_page(struct vm_area_struct *vma,
-				  unsigned long addr)
-{
-	__flush_tlb_mm(vma->vm_mm);
-}
-static inline void flush_tlb_range(struct vm_area_struct *vma,
-				   unsigned long start, unsigned long end)
-{
-	__flush_tlb_mm(vma->vm_mm); 
-}
-
-#define flush_tlb_kernel_range(start, end) \
-	__flush_tlb_mm(&init_mm)
-
-#endif
-
-static inline void flush_tlb_pgtables(struct mm_struct *mm,
-                                      unsigned long start, unsigned long end)
-{
-        /* S/390 does not keep any page table caches in TLB */
-}
-
-#endif /* _S390X_TLBFLUSH_H */
diff -Nru a/include/asm-s390x/todclk.h b/include/asm-s390x/todclk.h
--- a/include/asm-s390x/todclk.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,23 +0,0 @@
-/*
- * File...........: linux/include/asm/todclk.h
- * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
- * Bugreports.to..: <Linux390@de.ibm.com>
- * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
- *
- * History of changes (starts July 2000)
- */
-
-#ifndef __ASM_TODCLK_H
-#define __ASM_TODCLK_H
-
-#ifdef __KERNEL__
-
-#define TOD_uSEC (0x1000ULL)
-#define TOD_mSEC (1000 * TOD_uSEC)
-#define TOD_SEC (1000 * TOD_mSEC)
-#define TOD_MIN (60 * TOD_SEC)
-#define TOD_HOUR (60 * TOD_MIN)
-
-#endif
-
-#endif
diff -Nru a/include/asm-s390x/topology.h b/include/asm-s390x/topology.h
--- a/include/asm-s390x/topology.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,6 +0,0 @@
-#ifndef _ASM_S390X_TOPOLOGY_H
-#define _ASM_S390X_TOPOLOGY_H
-
-#include <asm-generic/topology.h>
-
-#endif /* _ASM_S390X_TOPOLOGY_H */
diff -Nru a/include/asm-s390x/types.h b/include/asm-s390x/types.h
--- a/include/asm-s390x/types.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,69 +0,0 @@
-/*
- *  include/asm-s390/types.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/types.h"
- */
-
-#ifndef _S390_TYPES_H
-#define _S390_TYPES_H
-
-#ifndef __ASSEMBLY__
-
-typedef unsigned short umode_t;
-
-/*
- * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
- * header files exported to user space
- */
-
-typedef __signed__ char __s8;
-typedef unsigned char __u8;
-
-typedef __signed__ short __s16;
-typedef unsigned short __u16;
-
-typedef __signed__ int __s32;
-typedef unsigned int __u32;
-
-typedef __signed__ long __s64;
-typedef unsigned long __u64;
-
-/* 
- * A address type so that arithmetic can be done on it & it can be upgraded to
- * 64 bit when necessary 
- */
-
-typedef unsigned long  addr_t; 
-typedef signed long  saddr_t;
-
-#endif /* __ASSEMBLY__ */
-
-/*
- * These aren't exported outside the kernel to avoid name space clashes
- */
-#ifdef __KERNEL__
-
-#define BITS_PER_LONG 64
-
-#ifndef __ASSEMBLY__
-
-typedef signed char s8;
-typedef unsigned char u8;
-
-typedef signed short s16;
-typedef unsigned short u16;
-
-typedef signed int s32;
-typedef unsigned int u32;
-
-typedef signed long s64;
-typedef unsigned  long u64;
-
-typedef u32 dma_addr_t;
-
-#endif /* __ASSEMBLY__ */
-
-#endif                                 /* __KERNEL__                       */
-#endif
diff -Nru a/include/asm-s390x/uaccess.h b/include/asm-s390x/uaccess.h
--- a/include/asm-s390x/uaccess.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,481 +0,0 @@
-/*
- *  include/asm-s390/uaccess.h
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hpenner@de.ibm.com),
- *               Martin Schwidefsky (schwidefsky@de.ibm.com)
- *
- *  Derived from "include/asm-i386/uaccess.h"
- */
-#ifndef __S390_UACCESS_H
-#define __S390_UACCESS_H
-
-/*
- * User space memory access functions
- */
-#include <linux/sched.h>
-#include <linux/errno.h>
-
-#define VERIFY_READ     0
-#define VERIFY_WRITE    1
-
-
-/*
- * The fs value determines whether argument validity checking should be
- * performed or not.  If get_fs() == USER_DS, checking is performed, with
- * get_fs() == KERNEL_DS, checking is bypassed.
- *
- * For historical reasons, these macros are grossly misnamed.
- */
-
-#define MAKE_MM_SEG(s)	((mm_segment_t) { (s) })
-
-
-#define KERNEL_DS	MAKE_MM_SEG(0)
-#define USER_DS		MAKE_MM_SEG(1)
-
-#define get_ds()	(KERNEL_DS)
-#define get_fs()        ({ mm_segment_t __x; \
-			   asm volatile("ear   %0,4":"=a" (__x)); \
-			   __x;})
-#define set_fs(x)       ({asm volatile("sar   4,%0"::"a" ((x).ar4));})
-
-#define segment_eq(a,b)	((a).ar4 == (b).ar4)
-
-
-#define __access_ok(addr,size) (1)
-
-#define access_ok(type,addr,size) __access_ok(addr,size)
-
-extern inline int verify_area(int type, const void * addr, unsigned long size)
-{
-        return access_ok(type,addr,size)?0:-EFAULT;
-}
-
-/*
- * The exception table consists of pairs of addresses: the first is the
- * address of an instruction that is allowed to fault, and the second is
- * the address at which the program should continue.  No registers are
- * modified, so it is entirely up to the continuation code to figure out
- * what to do.
- *
- * All the routines below use bits of fixup code that are out of line
- * with the main instruction path.  This means when everything is well,
- * we don't even have to jump over them.  Further, they do not intrude
- * on our cache or tlb entries.
- */
-
-struct exception_table_entry
-{
-        unsigned long insn, fixup;
-};
-
-/*
- * These are the main single-value transfer routines.  They automatically
- * use the right size if we just have the right pointer type.
- */
-
-extern inline int __put_user_asm_8(__u64 x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   la    4,%1\n"
-                                "   sacf  512\n"
-                                "0: stg   %2,0(4)\n"
-                                "1: sacf  0\n"
-				".section .fixup,\"ax\"\n"
-				"2: lhi   %0,%h3\n"
-				"   jg    1b\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 8\n"
-				"   .quad  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "m" (*((__u64*) ptr)), "d" (x), "K" (-EFAULT)
-                                : "cc", "4" );
-        return err;
-}
-extern inline int __put_user_asm_4(__u32 x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   la    4,%1\n"
-                                "   sacf  512\n"
-                                "0: st    %2,0(4)\n"
-                                "1: sacf  0\n"
-				".section .fixup,\"ax\"\n"
-				"2: lhi   %0,%h3\n"
-				"   jg    1b\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 8\n"
-				"   .quad  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "m" (*((__u32*) ptr)), "d" (x), "K" (-EFAULT)
-                                : "cc", "4" );
-        return err;
-}
-
-extern inline int __put_user_asm_2(__u16 x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   la    4,%1\n"
-                                "   sacf  512\n"
-                                "0: sth   %2,0(4)\n"
-                                "1: sacf  0\n"
-				".section .fixup,\"ax\"\n"
-				"2: lhi   %0,%h3\n"
-				"   jg    1b\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 8\n"
-				"   .quad  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "m" (*((__u16*) ptr)), "d" (x), "K" (-EFAULT)
-                                : "cc", "4" );
-        return err;
-}
-
-extern inline int __put_user_asm_1(__u8 x, void *ptr)
-{
-        int err;
-
-        __asm__ __volatile__ (  "   sr    %0,%0\n"
-				"   la    4,%1\n"
-                                "   sacf  512\n"
-                                "0: stc   %2,0(4)\n"
-                                "1: sacf  0\n"
-				".section .fixup,\"ax\"\n"
-				"2: lhi   %0,%h3\n"
-				"   jg    1b\n"
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 8\n"
-				"   .quad  0b,2b\n"
-				".previous"
-                                : "=&d" (err)
-                                : "m" (*((__u8*) ptr)), "d" (x), "K" (-EFAULT)
-                                : "cc", "4" );
-        return err;
-}
-
-/*
- * (u?)(u64) ... autsch, but that the only way we can suppress the
- * warnings when compiling binfmt_elf.c
- */
-#define __put_user(x, ptr)                                      \
-({                                                              \
-        __typeof__(*(ptr)) __x = (x);                           \
-        int __pu_err;                                           \
-        switch (sizeof (*(ptr))) {                              \
-        case 1:                                                 \
-                __pu_err = __put_user_asm_1((__u8)(__u64)(__x), \
-                                            ptr);               \
-                break;                                          \
-        case 2:                                                 \
-                __pu_err = __put_user_asm_2((__u16)(__u64)(__x),\
-                                            ptr);               \
-                break;                                          \
-        case 4:                                                 \
-                __pu_err = __put_user_asm_4((__u32)(__u64)(__x),\
-                                            ptr);               \
-                break;                                          \
-        case 8:                                                 \
-                __pu_err = __put_user_asm_8((__u64)(__x),       \
-                                            ptr);               \
-                break;                                          \
-        default:                                                \
-                __pu_err = __put_user_bad();                    \
-                break;                                          \
-         }                                                      \
-        __pu_err;                                               \
-})
-
-#define put_user(x, ptr) __put_user(x, ptr)
-
-extern int __put_user_bad(void);
-
-#define __get_user_asm_8(x, ptr, err)                                      \
-({                                                                         \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                         \
-                                "   la    4,%2\n"                          \
-                                "   sacf  512\n"                           \
-                                "0: lg    %0,0(4)\n"                       \
-                                "1: sacf  0\n"                             \
-                                ".section .fixup,\"ax\"\n"                 \
-                                "2: lhi   %1,%h3\n"                        \
-                                "   jg    1b\n"                            \
-                                ".previous\n"                              \
-                                ".section __ex_table,\"a\"\n"              \
-                                "   .align 8\n"                            \
-                                "   .quad 0b,2b\n"                         \
-                                ".previous"                                \
-                                : "=d" (x) , "=&d" (err)                   \
-                                : "m" (*(const __u64*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "4" );                             \
-})
-#define __get_user_asm_4(x, ptr, err)                                      \
-({                                                                         \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                         \
-                                "   la    4,%2\n"                          \
-                                "   sacf  512\n"                           \
-                                "0: l     %0,0(4)\n"                       \
-                                "1: sacf  0\n"                             \
-                                ".section .fixup,\"ax\"\n"                 \
-                                "2: lhi   %1,%h3\n"                        \
-                                "   jg    1b\n"                            \
-                                ".previous\n"                              \
-                                ".section __ex_table,\"a\"\n"              \
-                                "   .align 8\n"                            \
-                                "   .quad 0b,2b\n"                         \
-                                ".previous"                                \
-                                : "=d" (x) , "=&d" (err)                   \
-                                : "m" (*(const __u32*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "4" );                             \
-})
-
-#define __get_user_asm_2(x, ptr, err)                                      \
-({                                                                         \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                         \
-                                "   la    4,%2\n"                          \
-                                "   sacf  512\n"                           \
-                                "0: lh    %0,0(4)\n"                       \
-                                "1: sacf  0\n"                             \
-                                ".section .fixup,\"ax\"\n"                 \
-                                "2: lhi   %1,%h3\n"                        \
-                                "   jg    1b\n"                            \
-                                ".previous\n"                              \
-                                ".section __ex_table,\"a\"\n"              \
-                                "   .align 8\n"                            \
-                                "   .quad 0b,2b\n"                         \
-                                ".previous"                                \
-                                : "=d" (x) , "=&d" (err)                   \
-                                : "m" (*(const __u16*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "4" );                             \
-})
-
-#define __get_user_asm_1(x, ptr, err)                                     \
-({                                                                        \
-        __asm__ __volatile__ (  "   sr    %1,%1\n"                        \
-                                "   la    4,%2\n"                         \
-                                "   sr    %0,%0\n"                        \
-                                "   sacf  512\n"                          \
-                                "0: ic    %0,0(4)\n"                      \
-                                "1: sacf  0\n"                            \
-                                ".section .fixup,\"ax\"\n"                \
-                                "2: lhi   %1,%h3\n"                       \
-                                "   jg    1b\n"                           \
-                                ".previous\n"                             \
-                                ".section __ex_table,\"a\"\n"             \
-                                "   .align 8\n"                           \
-                                "   .quad 0b,2b\n"                        \
-                                ".previous"                               \
-                                : "=d" (x) , "=&d" (err)                  \
-                                : "m" (*(const __u8*)(ptr)),"K" (-EFAULT) \
-                                : "cc", "4" );                            \
-})
-
-#define __get_user(x, ptr)                                      \
-({                                                              \
-        __typeof__(*(ptr)) __x;                                 \
-        int __gu_err;                                           \
-        switch (sizeof(*(ptr))) {                               \
-        case 1:                                                 \
-                __get_user_asm_1(__x,ptr,__gu_err);             \
-                break;                                          \
-        case 2:                                                 \
-                __get_user_asm_2(__x,ptr,__gu_err);             \
-                break;                                          \
-        case 4:                                                 \
-                __get_user_asm_4(__x,ptr,__gu_err);             \
-                break;                                          \
-        case 8:                                                 \
-                __get_user_asm_8(__x,ptr,__gu_err);             \
-                break;                                          \
-        default:                                                \
-                __x = 0;                                        \
-                __gu_err = __get_user_bad();                    \
-                break;                                          \
-        }                                                       \
-        (x) = __x;                                              \
-        __gu_err;                                               \
-})
-
-#define get_user(x, ptr) __get_user(x, ptr)
-
-extern int __get_user_bad(void);
-
-/*
- * access register are set up, that 4 points to secondary (user) , 2 to primary (kernel)
- */
-
-extern long __copy_to_user_asm(const void *from, long n, void *to);
-
-#define __copy_to_user(to, from, n)                             \
-({                                                              \
-        __copy_to_user_asm(from, n, to);                        \
-})
-
-#define copy_to_user(to, from, n)                               \
-({                                                              \
-        long err = 0;                                           \
-        __typeof__(n) __n = (n);                                \
-        if (__access_ok(to,__n)) {                              \
-                err = __copy_to_user_asm(from, __n, to);        \
-        }                                                       \
-        else                                                    \
-                err = __n;                                      \
-        err;                                                    \
-})
-
-extern long __copy_from_user_asm(void *to, long n, const void *from);
-
-#define __copy_from_user(to, from, n)                           \
-({                                                              \
-        __copy_from_user_asm(to, n, from);                      \
-})
-
-#define copy_from_user(to, from, n)                             \
-({                                                              \
-        long err = 0;                                           \
-        __typeof__(n) __n = (n);                                \
-        if (__access_ok(from,__n)) {                            \
-                err = __copy_from_user_asm(to, __n, from);      \
-        }                                                       \
-        else                                                    \
-                err = __n;                                      \
-        err;                                                    \
-})
-
-/*
- * Copy a null terminated string from userspace.
- */
-
-static inline long
-__strncpy_from_user(char *dst, const char *src, long count)
-{
-        long len;
-        __asm__ __volatile__ (  "   slgr  %0,%0\n"
-				"   lgr   2,%1\n"
-                                "   lgr   4,%2\n"
-                                "   slr   3,3\n"
-                                "   sacf  512\n"
-                                "0: ic    3,0(%0,4)\n"
-                                "1: stc   3,0(%0,2)\n"
-                                "   ltr   3,3\n"
-                                "   jz    2f\n"
-                                "   aghi  %0,1\n"
-                                "   cgr   %0,%3\n"
-                                "   jl    0b\n"
-                                "2: sacf  0\n"
-				".section .fixup,\"ax\"\n"
-				"3: lghi  %0,%h4\n"
-				"   jg    2b\n"  
-				".previous\n"
-				".section __ex_table,\"a\"\n"
-				"   .align 8\n"
-				"   .quad  0b,3b\n"
-				"   .quad  1b,3b\n"
-				".previous"
-                                : "=&a" (len)
-                                : "a"  (dst), "d" (src), "d" (count),
-                                  "K" (-EFAULT)
-                                : "cc", "2" ,"3", "4" );
-        return len;
-}
-
-static inline long
-strncpy_from_user(char *dst, const char *src, long count)
-{
-        long res = -EFAULT;
-        if (access_ok(VERIFY_READ, src, 1))
-                res = __strncpy_from_user(dst, src, count);
-        return res;
-}
-
-/*
- * Return the size of a string (including the ending 0)
- *
- * Return 0 for error
- */
-static inline unsigned long
-strnlen_user(const char * src, unsigned long n)
-{
-#if 0
-        __asm__ __volatile__ ("   algr  %0,%1\n"
-                              "   slgr  0,0\n"
-                              "   lgr   4,%1\n"
-                              "   sacf  512\n"
-                              "0: srst  %0,4\n"
-                              "   jo    0b\n"
-                              "   slgr  %0,%1\n"
-                              "   aghi  %0,1\n"
-                              "1: sacf  0\n"
-                              ".section .fixup,\"ax\"\n"
-                              "2: slgr  %0,%0\n"
-                              "   jg    1b\n"
-                              ".previous\n"
-                              ".section __ex_table,\"a\"\n"
-                              "   .align 8\n"
-                              "   .quad  0b,2b\n"
-                              ".previous"
-                              : "+&a" (n) : "d" (src)
-                              : "cc", "0", "4" );
-#else
-	__asm__ __volatile__ ("   lgr   4,%1\n"
-			      "   sacf  512\n"
-			      "0: cli   0(4),0x00\n"
-                              "   la    4,1(4)\n"
-			      "   je    1f\n"
-                              "   brctg %0,0b\n"
-			      "1: lgr   %0,4\n"
-			      "   slgr  %0,%1\n"
-			      "2: sacf  0\n"
-                              ".section .fixup,\"ax\"\n"
-                              "3: slgr  %0,%0\n"
-                              "   jg    2b\n"  
-                              ".previous\n"
-			      ".section __ex_table,\"a\"\n"
-			      "   .align 8\n"
-			      "   .quad  0b,3b\n"
-			      ".previous"
-			      : "+&a" (n) : "d" (src)
-			      : "cc", "4" );
-#endif
-        return n;
-}
-#define strlen_user(str) strnlen_user(str, ~0UL)
-
-/*
- * Zero Userspace
- */
-
-extern long __clear_user_asm(void *to, long n);
-
-#define __clear_user(to, n)                                     \
-({                                                              \
-        __clear_user_asm(to, n);                                \
-})
-
-static inline unsigned long
-clear_user(void *to, unsigned long n)
-{
-        if (access_ok(VERIFY_WRITE, to, n))
-                n = __clear_user(to, n);
-        return n;
-}
-
-#endif                                 /* _S390_UACCESS_H                  */
-
-
-
-
-
diff -Nru a/include/asm-s390x/ucontext.h b/include/asm-s390x/ucontext.h
--- a/include/asm-s390x/ucontext.h	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,20 +0,0 @@
-/*
- *  include/asm-s390/ucontext.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/ucontext.h"
- */
-
-#ifndef _ASM_S390_UCONTEXT_H
-#define _ASM_S390_UCONTEXT_H
-
-struct ucontext {
-	unsigned long	  uc_flags;
-	struct ucontext  *uc_link;
-	stack_t		  uc_stack;
-	_sigregs          uc_mcontext;
-	sigset_t	  uc_sigmask;	/* mask last for extensibility */
-};
-
-#endif /* !_ASM_S390_UCONTEXT_H */
diff -Nru a/include/asm-s390x/unaligned.h b/include/asm-s390x/unaligned.h
--- a/include/asm-s390x/unaligned.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,24 +0,0 @@
-/*
- *  include/asm-s390/unaligned.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/unaligned.h"
- */
-
-#ifndef __S390_UNALIGNED_H
-#define __S390_UNALIGNED_H
-
-/*
- * The S390 can do unaligned accesses itself. 
- *
- * The strange macros are there to make sure these can't
- * be misused in a way that makes them not work on other
- * architectures where unaligned accesses aren't as simple.
- */
-
-#define get_unaligned(ptr) (*(ptr))
-
-#define put_unaligned(val, ptr) ((void)( *(ptr) = (val) ))
-
-#endif
diff -Nru a/include/asm-s390x/unistd.h b/include/asm-s390x/unistd.h
--- a/include/asm-s390x/unistd.h	Sat Apr 19 19:51:49 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,390 +0,0 @@
-/*
- *  include/asm-s390/unistd.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/unistd.h"
- */
-
-#ifndef _ASM_S390_UNISTD_H_
-#define _ASM_S390_UNISTD_H_
-
-/*
- * This file contains the system call numbers.
- */
-
-#define __NR_exit                 1
-#define __NR_fork                 2
-#define __NR_read                 3
-#define __NR_write                4
-#define __NR_open                 5
-#define __NR_close                6
-#define __NR_restart_syscall	  7
-#define __NR_creat                8
-#define __NR_link                 9
-#define __NR_unlink              10
-#define __NR_execve              11
-#define __NR_chdir               12
-#define __NR_mknod               14
-#define __NR_chmod               15
-#define __NR_lseek               19
-#define __NR_getpid              20
-#define __NR_mount               21
-#define __NR_umount              22
-#define __NR_ptrace              26
-#define __NR_alarm               27
-#define __NR_pause               29
-#define __NR_utime               30
-#define __NR_access              33
-#define __NR_nice                34
-#define __NR_sync                36
-#define __NR_kill                37
-#define __NR_rename              38
-#define __NR_mkdir               39
-#define __NR_rmdir               40
-#define __NR_dup                 41
-#define __NR_pipe                42
-#define __NR_times               43
-#define __NR_brk                 45
-#define __NR_signal              48
-#define __NR_acct                51
-#define __NR_umount2             52
-#define __NR_ioctl               54
-#define __NR_fcntl               55
-#define __NR_setpgid             57
-#define __NR_umask               60
-#define __NR_chroot              61
-#define __NR_ustat               62
-#define __NR_dup2                63
-#define __NR_getppid             64
-#define __NR_getpgrp             65
-#define __NR_setsid              66
-#define __NR_sigaction           67
-#define __NR_sigsuspend          72
-#define __NR_sigpending          73
-#define __NR_sethostname         74
-#define __NR_setrlimit           75
-#define __NR_getrusage           77
-#define __NR_gettimeofday        78
-#define __NR_settimeofday        79
-#define __NR_symlink             83
-#define __NR_readlink            85
-#define __NR_uselib              86
-#define __NR_swapon              87
-#define __NR_reboot              88
-#define __NR_readdir             89
-#define __NR_mmap                90
-#define __NR_munmap              91
-#define __NR_truncate            92
-#define __NR_ftruncate           93
-#define __NR_fchmod              94
-#define __NR_getpriority         96
-#define __NR_setpriority         97
-#define __NR_statfs              99
-#define __NR_fstatfs            100
-#define __NR_socketcall         102
-#define __NR_syslog             103
-#define __NR_setitimer          104
-#define __NR_getitimer          105
-#define __NR_stat               106
-#define __NR_lstat              107
-#define __NR_fstat              108
-#define __NR_vhangup            111
-#define __NR_idle               112
-#define __NR_wait4              114
-#define __NR_swapoff            115
-#define __NR_sysinfo            116
-#define __NR_ipc                117
-#define __NR_fsync              118
-#define __NR_sigreturn          119
-#define __NR_clone              120
-#define __NR_setdomainname      121
-#define __NR_uname              122
-#define __NR_adjtimex           124
-#define __NR_mprotect           125
-#define __NR_sigprocmask        126
-#define __NR_create_module      127
-#define __NR_init_module        128
-#define __NR_delete_module      129
-#define __NR_get_kernel_syms    130
-#define __NR_quotactl           131
-#define __NR_getpgid            132
-#define __NR_fchdir             133
-#define __NR_bdflush            134
-#define __NR_sysfs              135
-#define __NR_personality        136
-#define __NR_afs_syscall        137 /* Syscall for Andrew File System */
-#define __NR_getdents           141
-#define __NR_select             142
-#define __NR_flock              143
-#define __NR_msync              144
-#define __NR_readv              145
-#define __NR_writev             146
-#define __NR_getsid             147
-#define __NR_fdatasync          148
-#define __NR__sysctl            149
-#define __NR_mlock              150
-#define __NR_munlock            151
-#define __NR_mlockall           152
-#define __NR_munlockall         153
-#define __NR_sched_setparam             154
-#define __NR_sched_getparam             155
-#define __NR_sched_setscheduler         156
-#define __NR_sched_getscheduler         157
-#define __NR_sched_yield                158
-#define __NR_sched_get_priority_max     159
-#define __NR_sched_get_priority_min     160
-#define __NR_sched_rr_get_interval      161
-#define __NR_nanosleep          162
-#define __NR_mremap             163
-#define __NR_query_module       167
-#define __NR_poll               168
-#define __NR_nfsservctl         169
-#define __NR_prctl              172
-#define __NR_rt_sigreturn       173
-#define __NR_rt_sigaction       174
-#define __NR_rt_sigprocmask     175
-#define __NR_rt_sigpending      176
-#define __NR_rt_sigtimedwait    177
-#define __NR_rt_sigqueueinfo    178
-#define __NR_rt_sigsuspend      179
-#define __NR_pread64            180
-#define __NR_pwrite64           181
-#define __NR_getcwd             183
-#define __NR_capget             184
-#define __NR_capset             185
-#define __NR_sigaltstack        186
-#define __NR_sendfile           187
-#define __NR_getpmsg		188
-#define __NR_putpmsg		189
-#define __NR_vfork		190
-#define __NR_getrlimit		191	/* SuS compliant getrlimit */
-#define __NR_lchown  		198
-#define __NR_getuid  		199
-#define __NR_getgid  		200
-#define __NR_geteuid  		201
-#define __NR_getegid  		202
-#define __NR_setreuid  		203
-#define __NR_setregid  		204
-#define __NR_getgroups  	205
-#define __NR_setgroups  	206
-#define __NR_fchown  		207
-#define __NR_setresuid  	208
-#define __NR_getresuid  	209
-#define __NR_setresgid  	210
-#define __NR_getresgid  	211
-#define __NR_chown  		212
-#define __NR_setuid  		213
-#define __NR_setgid  		214
-#define __NR_setfsuid  		215
-#define __NR_setfsgid  		216
-#define __NR_pivot_root         217
-#define __NR_mincore            218
-#define __NR_madvise            219
-#define __NR_readahead		222
-#define __NR_setxattr		224
-#define __NR_lsetxattr		225
-#define __NR_fsetxattr		226
-#define __NR_getxattr		227
-#define __NR_lgetxattr		228
-#define __NR_fgetxattr		229
-#define __NR_listxattr		230
-#define __NR_llistxattr		231
-#define __NR_flistxattr		232
-#define __NR_removexattr	233
-#define __NR_lremovexattr	234
-#define __NR_fremovexattr	235
-#define __NR_gettid		236
-#define __NR_tkill		237
-#define __NR_futex		238
-#define __NR_sched_setaffinity	239
-#define __NR_sched_getaffinity	240
-/*
- * Number 241 is currently unused
- */
-/*
- * Number 242 is reserved for tux
- */
-#define __NR_io_setup		243
-#define __NR_io_destroy		244
-#define __NR_io_getevents	245
-#define __NR_io_submit		246
-#define __NR_io_cancel		247
-#define __NR_exit_group		248
-#define __NR_epoll_create	249
-#define __NR_epoll_ctl		250
-#define __NR_epoll_wait		251
-#define __NR_set_tid_address	252
-#define __NR_fadvise64		253
-
-
-/* user-visible error numbers are in the range -1 - -122: see <asm-s390/errno.h> */
-
-#define __syscall_return(type, res)                          \
-do {                                                         \
-        if ((unsigned long)(res) >= (unsigned long)(-125)) { \
-                errno = -(res);                              \
-                res = -1;                                    \
-        }                                                    \
-        return (type) (res);                                 \
-} while (0)
-
-#define _svc_clobber "cc", "memory"
-
-#define _syscall0(type,name)                                 \
-type name(void) {                                            \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name)                          \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
-}
-
-#define _syscall1(type,name,type1,arg1)                      \
-type name(type1 arg1) {                                      \
-        register type1 __arg1 asm("2") = arg1;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
-}
-
-#define _syscall2(type,name,type1,arg1,type2,arg2)           \
-type name(type1 arg1, type2 arg2) {                          \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
-}
-
-#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)\
-type name(type1 arg1, type2 arg2, type3 arg3) {              \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register type3 __arg3 asm("4") = arg3;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2),                              \
-                  "d" (__arg3)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
-}
-
-#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,\
-                  type4,name4)                               \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {  \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register type3 __arg3 asm("4") = arg3;               \
-        register type4 __arg4 asm("5") = arg4;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2),                              \
-                  "d" (__arg3),                              \
-                  "d" (__arg4)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
-}
-
-#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,\
-                  type4,name4,type5,name5)                   \
-type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
-          type5 arg5) {                                      \
-        register type1 __arg1 asm("2") = arg1;               \
-        register type2 __arg2 asm("3") = arg2;               \
-        register type3 __arg3 asm("4") = arg3;               \
-        register type4 __arg4 asm("5") = arg4;               \
-        register type5 __arg5 asm("6") = arg5;               \
-        register long __svcres asm("2");                     \
-        long __res;                                          \
-        __asm__ __volatile__ (                               \
-                "    svc %b1\n"                              \
-                : "=d" (__svcres)                            \
-                : "i" (__NR_##name),                         \
-                  "0" (__arg1),                              \
-                  "d" (__arg2),                              \
-                  "d" (__arg3),                              \
-                  "d" (__arg4),                              \
-                  "d" (__arg5)                               \
-                : _svc_clobber );                            \
-	__res = __svcres;                                    \
-        __syscall_return(type,__res);                        \
-}
-
-#ifdef __KERNEL_SYSCALLS__
-
-#include <asm/stat.h>
-
-/*
- * we need this inline - forking from kernel space will result
- * in NO COPY ON WRITE (!!!), until an execve is executed. This
- * is no problem, but for the stack. This is handled by not letting
- * main() use the stack at all after fork(). Thus, no function
- * calls - which means inline code for fork too, as otherwise we
- * would use the stack upon exit from 'fork()'.
- *
- * Actually only pause and fork are needed inline, so that there
- * won't be any messing with the stack from main(), but we define
- * some others too.
- */
-#define __NR__exit __NR_exit
-static inline _syscall0(pid_t,setsid)
-static inline _syscall3(int,write,int,fd,const char *,buf,off_t,count)
-static inline _syscall3(int,read,int,fd,char *,buf,off_t,count)
-static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count)
-static inline _syscall1(int,dup,int,fd)
-static inline _syscall3(int,execve,const char *,file,char **,argv,char **,envp)
-static inline _syscall3(int,open,const char *,file,int,flag,int,mode)
-static inline _syscall1(int,close,int,fd)
-static inline _syscall1(int,_exit,int,exitcode)
-static inline _syscall2(long,stat,char *,filename,struct stat *,statbuf)
-
-struct rusage;
-extern long sys_wait4(pid_t, unsigned int *, int, struct rusage *);
-static inline pid_t waitpid(int pid, int *wait_stat, int flags)
-{
-	return sys_wait4(pid, wait_stat, flags, NULL);
-}
-
-#endif
-
-/*
- * "Conditional" syscalls
- *
- * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
- * but it doesn't work on all toolchains, so we just do it by hand
- */
-#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall");
-
-#endif /* _ASM_S390_UNISTD_H_ */
diff -Nru a/include/asm-s390x/user.h b/include/asm-s390x/user.h
--- a/include/asm-s390x/user.h	Sat Apr 19 19:51:30 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,77 +0,0 @@
-/*
- *  include/asm-s390/user.h
- *
- *  S390 version
- *
- *  Derived from "include/asm-i386/usr.h"
- */
-
-#ifndef _S390_USER_H
-#define _S390_USER_H
-
-#include <asm/page.h>
-#include <linux/ptrace.h>
-/* Core file format: The core file is written in such a way that gdb
-   can understand it and provide useful information to the user (under
-   linux we use the 'trad-core' bfd).  There are quite a number of
-   obstacles to being able to view the contents of the floating point
-   registers, and until these are solved you will not be able to view the
-   contents of them.  Actually, you can read in the core file and look at
-   the contents of the user struct to find out what the floating point
-   registers contain.
-   The actual file contents are as follows:
-   UPAGE: 1 page consisting of a user struct that tells gdb what is present
-   in the file.  Directly after this is a copy of the task_struct, which
-   is currently not used by gdb, but it may come in useful at some point.
-   All of the registers are stored as part of the upage.  The upage should
-   always be only one page.
-   DATA: The data area is stored.  We use current->end_text to
-   current->brk to pick up all of the user variables, plus any memory
-   that may have been malloced.  No attempt is made to determine if a page
-   is demand-zero or if a page is totally unused, we just cover the entire
-   range.  All of the addresses are rounded in such a way that an integral
-   number of pages is written.
-   STACK: We need the stack information in order to get a meaningful
-   backtrace.  We need to write the data from (esp) to
-   current->start_stack, so we round each of these off in order to be able
-   to write an integer number of pages.
-   The minimum core file size is 3 pages, or 12288 bytes.
-*/
-
-
-/*
- * This is the old layout of "struct pt_regs", and
- * is still the layout used by user mode (the new
- * pt_regs doesn't have all registers as the kernel
- * doesn't use the extra segment registers)
- */
-
-/* When the kernel dumps core, it starts by dumping the user struct -
-   this will be used by gdb to figure out where the data and stack segments
-   are within the file, and what virtual addresses to use. */
-struct user {
-/* We start with the registers, to mimic the way that "memory" is returned
-   from the ptrace(3,...) function.  */
-  struct user_regs_struct regs;		/* Where the registers are actually stored */
-/* The rest of this junk is to help gdb figure out what goes where */
-  size_t   u_tsize;	     /* Text segment size (pages). */
-  size_t   u_dsize;	     /* Data segment size (pages). */
-  size_t   u_ssize;	     /* Stack segment size (pages). */
-  unsigned long start_code;  /* Starting virtual address of text. */
-  unsigned long start_stack; /* Starting virtual address of stack area.
-			        This is actually the bottom of the stack,
-				the top of the stack is always found in the
-				gprs[15] register.  */
-  long int signal;     	     /* Signal that caused the core dump. */
-  struct user_regs_struct *u_ar0;
-				/* Used by gdb to help find the values for */
-				/* the registers. */
-  unsigned long magic;		/* To uniquely identify a core file */
-  char u_comm[32];		/* User command that was responsible */
-};
-#define NBPG PAGE_SIZE
-#define UPAGES 1
-#define HOST_TEXT_START_ADDR (u.start_code)
-#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
-
-#endif /* _S390_USER_H */
diff -Nru a/include/asm-s390x/vtoc.h b/include/asm-s390x/vtoc.h
--- a/include/asm-s390x/vtoc.h	Sat Apr 19 19:51:51 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,373 +0,0 @@
-#ifndef __KERNEL__
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
-#include <time.h>
-#include <fcntl.h>
-#include <unistd.h>
-
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-
-#include <linux/fs.h>
-#include <linux/types.h>
-#include <linux/hdreg.h>
-#include <linux/version.h>
-#include <asm/dasd.h>
-#endif
-
-
-#define LINE_LENGTH 80
-#define VTOC_START_CC 0x0
-#define VTOC_START_HH 0x1
-#define FIRST_USABLE_CYL 1
-#define FIRST_USABLE_TRK 2
-
-#define DASD_3380_TYPE 13148
-#define DASD_3390_TYPE 13200
-#define DASD_9345_TYPE 37701
-
-#define DASD_3380_VALUE 0xbb60
-#define DASD_3390_VALUE 0xe5a2
-#define DASD_9345_VALUE 0xbc98
-
-#define VOLSER_LENGTH 6
-#define BIG_DISK_SIZE 0x10000
-
-#define VTOC_ERROR "VTOC error:"
-
-
-typedef struct ttr 
-{
-        __u16 tt;
-        __u8  r;
-} __attribute__ ((packed)) ttr_t;
-
-typedef struct cchhb 
-{
-        __u16 cc;
-        __u16 hh;
-        __u8 b;
-} __attribute__ ((packed)) cchhb_t;
-
-typedef struct cchh 
-{
-        __u16 cc;
-        __u16 hh;
-} __attribute__ ((packed)) cchh_t;
-
-typedef struct labeldate 
-{
-        __u8  year;
-        __u16 day;
-} __attribute__ ((packed)) labeldate_t;
-
-
-typedef struct volume_label 
-{
-        char volkey[4];         /* volume key = volume label                 */
-	char vollbl[4];	        /* volume label                              */
-	char volid[6];	        /* volume identifier                         */
-	__u8 security;	        /* security byte                             */
-	cchhb_t vtoc;           /* VTOC address                              */
-	char res1[5];	        /* reserved                                  */
-        char cisize[4];	        /* CI-size for FBA,...                       */
-                                /* ...blanks for CKD                         */
-	char blkperci[4];       /* no of blocks per CI (FBA), blanks for CKD */
-	char labperci[4];       /* no of labels per CI (FBA), blanks for CKD */
-	char res2[4];	        /* reserved                                  */
-	char lvtoc[14];	        /* owner code for LVTOC                      */
-	char res3[29];	        /* reserved                                  */
-} __attribute__ ((packed)) volume_label_t;
-
-
-typedef struct extent 
-{
-        __u8  typeind;          /* extent type indicator                     */
-        __u8  seqno;            /* extent sequence number                    */
-        cchh_t llimit;          /* starting point of this extent             */
-        cchh_t ulimit;          /* ending point of this extent               */
-} __attribute__ ((packed)) extent_t;
-
-
-typedef struct dev_const 
-{
-        __u16 DS4DSCYL;           /* number of logical cyls                  */
-        __u16 DS4DSTRK;           /* number of tracks in a logical cylinder  */
-        __u16 DS4DEVTK;           /* device track length                     */
-        __u8  DS4DEVI;            /* non-last keyed record overhead          */
-        __u8  DS4DEVL;            /* last keyed record overhead              */
-        __u8  DS4DEVK;            /* non-keyed record overhead differential  */
-        __u8  DS4DEVFG;           /* flag byte                               */
-        __u16 DS4DEVTL;           /* device tolerance                        */
-        __u8  DS4DEVDT;           /* number of DSCB's per track              */
-        __u8  DS4DEVDB;           /* number of directory blocks per track    */
-} __attribute__ ((packed)) dev_const_t;
-
-
-typedef struct format1_label 
-{
-	char  DS1DSNAM[44];       /* data set name                           */
-	__u8  DS1FMTID;           /* format identifier                       */
-	char  DS1DSSN[6];         /* data set serial number                  */
-	__u16 DS1VOLSQ;           /* volume sequence number                  */
-	labeldate_t DS1CREDT;     /* creation date: ydd                      */
-	labeldate_t DS1EXPDT;     /* expiration date                         */
-	__u8  DS1NOEPV;           /* number of extents on volume             */
-        __u8  DS1NOBDB;           /* no. of bytes used in last direction blk */
-	__u8  DS1FLAG1;           /* flag 1                                  */
-	char  DS1SYSCD[13];       /* system code                             */
-	labeldate_t DS1REFD;      /* date last referenced                    */
-        __u8  DS1SMSFG;           /* system managed storage indicators       */
-        __u8  DS1SCXTF;           /* sec. space extension flag byte          */
-        __u16 DS1SCXTV;           /* secondary space extension value         */
-        __u8  DS1DSRG1;           /* data set organisation byte 1            */
-        __u8  DS1DSRG2;           /* data set organisation byte 2            */
-  	__u8  DS1RECFM;           /* record format                           */
-	__u8  DS1OPTCD;           /* option code                             */
-	__u16 DS1BLKL;            /* block length                            */
-	__u16 DS1LRECL;           /* record length                           */
-	__u8  DS1KEYL;            /* key length                              */
-	__u16 DS1RKP;             /* relative key position                   */
-	__u8  DS1DSIND;           /* data set indicators                     */
-        __u8  DS1SCAL1;           /* secondary allocation flag byte          */
-  	char DS1SCAL3[3];         /* secondary allocation quantity           */
-	ttr_t DS1LSTAR;           /* last used track and block on track      */
-	__u16 DS1TRBAL;           /* space remaining on last used track      */
-        __u16 res1;               /* reserved                                */
-	extent_t DS1EXT1;         /* first extent description                */
-	extent_t DS1EXT2;         /* second extent description               */
-	extent_t DS1EXT3;         /* third extent description                */
-	cchhb_t DS1PTRDS;         /* possible pointer to f2 or f3 DSCB       */
-} __attribute__ ((packed)) format1_label_t;
-
-
-typedef struct format4_label 
-{
-	char  DS4KEYCD[44];       /* key code for VTOC labels: 44 times 0x04 */
-        __u8  DS4IDFMT;           /* format identifier                       */
-	cchhb_t DS4HPCHR;         /* highest address of a format 1 DSCB      */
-        __u16 DS4DSREC;           /* number of available DSCB's              */
-        cchh_t DS4HCCHH;          /* CCHH of next available alternate track  */
-        __u16 DS4NOATK;           /* number of remaining alternate tracks    */
-        __u8  DS4VTOCI;           /* VTOC indicators                         */
-        __u8  DS4NOEXT;           /* number of extents in VTOC               */
-        __u8  DS4SMSFG;           /* system managed storage indicators       */
-        __u8  DS4DEVAC;           /* number of alternate cylinders. 
-                                     Subtract from first two bytes of 
-                                     DS4DEVSZ to get number of usable
-				     cylinders. can be zero. valid
-				     only if DS4DEVAV on.                    */
-        dev_const_t DS4DEVCT;     /* device constants                        */
-        char DS4AMTIM[8];         /* VSAM time stamp                         */
-        char DS4AMCAT[3];         /* VSAM catalog indicator                  */
-        char DS4R2TIM[8];         /* VSAM volume/catalog match time stamp    */
-        char res1[5];             /* reserved                                */
-        char DS4F6PTR[5];         /* pointer to first format 6 DSCB          */
-        extent_t DS4VTOCE;        /* VTOC extent description                 */
-        char res2[10];            /* reserved                                */
-        __u8 DS4EFLVL;            /* extended free-space management level    */
-        cchhb_t DS4EFPTR;         /* pointer to extended free-space info     */
-        char res3[9];             /* reserved                                */
-} __attribute__ ((packed)) format4_label_t;
-
-
-typedef struct ds5ext 
-{
-	__u16 t;                  /* RTA of the first track of free extent   */
-	__u16 fc;                 /* number of whole cylinders in free ext.  */
-	__u8  ft;                 /* number of remaining free tracks         */
-} __attribute__ ((packed)) ds5ext_t;
-
-
-typedef struct format5_label 
-{
-	char DS5KEYID[4];         /* key identifier                          */
-	ds5ext_t DS5AVEXT;        /* first available (free-space) extent.    */
-	ds5ext_t DS5EXTAV[7];     /* seven available extents                 */
-	__u8 DS5FMTID;            /* format identifier                       */
-	ds5ext_t DS5MAVET[18];    /* eighteen available extents              */
-	cchhb_t DS5PTRDS;         /* pointer to next format5 DSCB            */
-} __attribute__ ((packed)) format5_label_t;
-
-
-typedef struct ds7ext 
-{
-	__u32 a;                  /* starting RTA value                      */
-	__u32 b;                  /* ending RTA value + 1                    */
-} __attribute__ ((packed)) ds7ext_t;
-
-
-typedef struct format7_label 
-{
-	char DS7KEYID[4];         /* key identifier                          */
-	ds7ext_t DS7EXTNT[5];     /* space for 5 extent descriptions         */
-	__u8 DS7FMTID;            /* format identifier                       */
-	ds7ext_t DS7ADEXT[11];    /* space for 11 extent descriptions        */
-	char res1[2];             /* reserved                                */
-	cchhb_t DS7PTRDS;         /* pointer to next FMT7 DSCB               */
-} __attribute__ ((packed)) format7_label_t;
-
-
-char * vtoc_ebcdic_enc (
-        unsigned char source[LINE_LENGTH],
-        unsigned char target[LINE_LENGTH],
-	int l);
-char * vtoc_ebcdic_dec (
-        unsigned char source[LINE_LENGTH],
-	unsigned char target[LINE_LENGTH],
-	int l);
-void vtoc_set_extent (
-        extent_t * ext,
-        __u8 typeind,
-        __u8 seqno,
-        cchh_t * lower,
-        cchh_t * upper);
-void vtoc_set_cchh (
-        cchh_t * addr,
-	__u16 cc,
-	__u16 hh);
-void vtoc_set_cchhb (
-        cchhb_t * addr,
-        __u16 cc,
-        __u16 hh,
-        __u8 b);
-void vtoc_set_date (
-        labeldate_t * d,
-        __u8 year,
-        __u16 day);
-
-void vtoc_volume_label_init (
-	volume_label_t *vlabel);
-
-int vtoc_read_volume_label (
-        char * device,
-        unsigned long vlabel_start,
-        volume_label_t * vlabel);
-
-int vtoc_write_volume_label (
-        char *device,
-        unsigned long vlabel_start,
-        volume_label_t *vlabel);
-
-void vtoc_volume_label_set_volser (
-	volume_label_t *vlabel,
-	char *volser);
-
-char *vtoc_volume_label_get_volser (
-	volume_label_t *vlabel,
-	char *volser);
-
-void vtoc_volume_label_set_key (
-        volume_label_t *vlabel,
-        char *key);     
-
-void vtoc_volume_label_set_label (
-	volume_label_t *vlabel,
-	char *lbl);
-
-char *vtoc_volume_label_get_label (
-	volume_label_t *vlabel,
-	char *lbl);
-
-void vtoc_read_label (
-        char *device,
-        unsigned long position,
-        format1_label_t *f1,
-        format4_label_t *f4,
-        format5_label_t *f5,
-        format7_label_t *f7);
-
-void vtoc_write_label (
-        char *device,
-        unsigned long position,
-        format1_label_t *f1,
-	format4_label_t *f4,
-	format5_label_t *f5,
-	format7_label_t *f7);
-
-
-void vtoc_init_format1_label (
-        char *volid,
-        unsigned int blksize,
-        extent_t *part_extent,
-        format1_label_t *f1);
-
-
-void vtoc_init_format4_label (
-        format4_label_t *f4lbl,
-	unsigned int usable_partitions,
-	unsigned int cylinders,
-	unsigned int tracks,
-	unsigned int blocks,
-	unsigned int blksize,
-	__u16 dev_type);
-
-void vtoc_update_format4_label (
-	format4_label_t *f4,
-	cchhb_t *highest_f1,
-	__u16 unused_update);
-
-
-void vtoc_init_format5_label (
-	format5_label_t *f5);
-
-void vtoc_update_format5_label_add (
-	format5_label_t *f5,
-	int verbose,
-	int cyl,
-	int trk,
-	__u16 a, 
-	__u16 b, 
-	__u8 c);
- 
-void vtoc_update_format5_label_del (
-	format5_label_t *f5,
-	int verbose,
-	int cyl,
-	int trk,
-	__u16 a, 
-	__u16 b, 
-	__u8 c);
-
-
-void vtoc_init_format7_label (
-	format7_label_t *f7);
-
-void vtoc_update_format7_label_add (
-	format7_label_t *f7,
-	int verbose,
-	__u32 a, 
-	__u32 b);
-
-void vtoc_update_format7_label_del (
-	format7_label_t *f7, 
-	int verbose,
-	__u32 a, 
-	__u32 b);
-
-
-void vtoc_set_freespace(
-	format4_label_t *f4,
-	format5_label_t *f5,
-	format7_label_t *f7,
-	char ch,
-	int verbose,
-	__u32 start,
-	__u32 stop,
-	int cyl,
-	int trk);
-
-
-
-
-
-
-
-
-
-
-
-
diff -Nru a/include/asm-s390x/xor.h b/include/asm-s390x/xor.h
--- a/include/asm-s390x/xor.h	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1 +0,0 @@
-#include <asm-generic/xor.h>
diff -Nru a/include/asm-sh/bitops.h b/include/asm-sh/bitops.h
--- a/include/asm-sh/bitops.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-sh/bitops.h	Sat Apr 19 19:51:27 2003
@@ -344,6 +344,24 @@
 }
 #endif
 
+#define ext2_set_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_set_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
+#define ext2_clear_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_clear_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
 /* Bitmap functions for the minix filesystem.  */
 #define minix_test_and_set_bit(nr,addr) test_and_set_bit(nr,addr)
 #define minix_set_bit(nr,addr) set_bit(nr,addr)
diff -Nru a/include/asm-sh/pgtable.h b/include/asm-sh/pgtable.h
--- a/include/asm-sh/pgtable.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-sh/pgtable.h	Sat Apr 19 19:51:51 2003
@@ -26,7 +26,6 @@
  *  - flush_cache_range(vma, start, end) flushes a range of pages
  *
  *  - flush_dcache_page(pg) flushes(wback&invalidates) a page for dcache
- *  - flush_page_to_ram(page) write back kernel page to ram
  *  - flush_icache_range(start, end) flushes(invalidates) a range for icache
  *  - flush_icache_page(vma, pg) flushes(invalidates) a page for icache
  *
@@ -37,7 +36,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_page(page)			do { } while (0)
 #define flush_icache_range(start, end)		do { } while (0)
 #define flush_icache_page(vma,pg)		do { } while (0)
@@ -63,7 +61,6 @@
 extern void flush_icache_range(unsigned long start, unsigned long end);
 extern void flush_cache_sigtramp(unsigned long addr);
 
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_icache_page(vma,pg)		do { } while (0)
 #define flush_icache_user_range(vma,pg,adr,len)	do { } while (0)
 
diff -Nru a/include/asm-sh/posix_types.h b/include/asm-sh/posix_types.h
--- a/include/asm-sh/posix_types.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-sh/posix_types.h	Sat Apr 19 19:51:47 2003
@@ -31,6 +31,7 @@
 
 typedef unsigned short	__kernel_old_uid_t;
 typedef unsigned short	__kernel_old_gid_t;
+typedef unsigned short	__kernel_old_dev_t;
 
 #ifdef __GNUC__
 typedef long long	__kernel_loff_t;
diff -Nru a/include/asm-sparc/bitops.h b/include/asm-sparc/bitops.h
--- a/include/asm-sparc/bitops.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-sparc/bitops.h	Sat Apr 19 19:51:50 2003
@@ -455,6 +455,25 @@
 
 #define ext2_set_bit			__test_and_set_le_bit
 #define ext2_clear_bit			__test_and_clear_le_bit
+
+#define ext2_set_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_set_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
+#define ext2_clear_bit_atomic(lock, nr, addr)		\
+	({						\
+		int ret;				\
+		spin_lock(lock);			\
+		ret = ext2_clear_bit((nr), (addr));	\
+		spin_unlock(lock);			\
+		ret;					\
+	})
+
 #define ext2_test_bit			test_le_bit
 #define ext2_find_first_zero_bit	find_first_zero_le_bit
 #define ext2_find_next_zero_bit		find_next_zero_le_bit
diff -Nru a/include/asm-sparc/cacheflush.h b/include/asm-sparc/cacheflush.h
--- a/include/asm-sparc/cacheflush.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-sparc/cacheflush.h	Sat Apr 19 19:51:46 2003
@@ -64,7 +64,6 @@
 
 extern void sparc_flush_page_to_ram(struct page *page);
 
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_page(page)			sparc_flush_page_to_ram(page)
 
 #endif /* _SPARC_CACHEFLUSH_H */
diff -Nru a/include/asm-sparc/pci.h b/include/asm-sparc/pci.h
--- a/include/asm-sparc/pci.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-sparc/pci.h	Sat Apr 19 19:51:49 2003
@@ -137,4 +137,7 @@
 
 #endif /* __KERNEL__ */
 
+/* generic pci stuff */
+#include <asm-generic/pci.h>
+
 #endif /* __SPARC_PCI_H */
diff -Nru a/include/asm-sparc/pgtable.h b/include/asm-sparc/pgtable.h
--- a/include/asm-sparc/pgtable.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-sparc/pgtable.h	Sat Apr 19 19:51:48 2003
@@ -11,7 +11,7 @@
 
 #include <linux/config.h>
 #include <linux/spinlock.h>
-/* #include <asm/asi.h> */	/* doesn't seem like being used XXX */
+#include <asm/types.h>
 #ifdef CONFIG_SUN4
 #include <asm/pgtsun4.h>
 #else
@@ -252,6 +252,19 @@
 	return pte_val(pte) & BTFIXUP_HALF(pte_youngi);
 }
 
+/*
+ * The following only work if pte_present() is not true.
+ */
+BTFIXUPDEF_HALF(pte_filei)
+
+extern int pte_file(pte_t pte) __attribute__((const));
+extern __inline__ int pte_file(pte_t pte)
+{
+	return pte_val(pte) & BTFIXUP_HALF(pte_filei);
+}
+
+/*
+ */
 BTFIXUPDEF_HALF(pte_wrprotecti)
 BTFIXUPDEF_HALF(pte_mkcleani)
 BTFIXUPDEF_HALF(pte_mkoldi)
@@ -373,6 +386,21 @@
 #define __pte_to_swp_entry(pte)		((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)		((pte_t) { (x).val })
 
+/* file-offset-in-pte helpers */
+BTFIXUPDEF_CALL(unsigned long, pte_to_pgoff, pte_t pte);
+BTFIXUPDEF_CALL(pte_t, pgoff_to_pte, unsigned long pgoff);
+
+#define pte_to_pgoff(pte) BTFIXUP_CALL(pte_to_pgoff)(pte)
+#define pgoff_to_pte(off) BTFIXUP_CALL(pgoff_to_pte)(off)
+
+/*
+ * This is made a constant because mm/fremap.c required a constant.
+ * Note that layout of these bits is different between sun4c.c and srmmu.c.
+ */
+#define PTE_FILE_MAX_BITS 24
+
+/*
+ */
 struct ctx_list {
 	struct ctx_list *next;
 	struct ctx_list *prev;
diff -Nru a/include/asm-sparc/pgtsrmmu.h b/include/asm-sparc/pgtsrmmu.h
--- a/include/asm-sparc/pgtsrmmu.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-sparc/pgtsrmmu.h	Sat Apr 19 19:51:46 2003
@@ -62,6 +62,10 @@
 #define SRMMU_PRIV         0x1c
 #define SRMMU_PRIV_RDONLY  0x18
 
+#define SRMMU_FILE         0x40	/* Implemented in software */
+
+#define SRMMU_PTE_FILE_SHIFT     8	/* == 32-PTE_FILE_MAX_BITS */
+
 #define SRMMU_CHG_MASK    (0xffffff00 | SRMMU_REF | SRMMU_DIRTY)
 
 /* Some day I will implement true fine grained access bits for
diff -Nru a/include/asm-sparc/pgtsun4c.h b/include/asm-sparc/pgtsun4c.h
--- a/include/asm-sparc/pgtsun4c.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-sparc/pgtsun4c.h	Sat Apr 19 19:51:28 2003
@@ -53,6 +53,7 @@
 #define _SUN4C_PAGE_NOCACHE      0x10000000   /* non-cacheable page */
 #define _SUN4C_PAGE_PRESENT      0x08000000   /* implemented in software */
 #define _SUN4C_PAGE_IO           0x04000000   /* I/O page */
+#define _SUN4C_PAGE_FILE         0x02000000   /* implemented in software */
 #define _SUN4C_PAGE_READ         0x00800000   /* implemented in software */
 #define _SUN4C_PAGE_WRITE        0x00400000   /* implemented in software */
 #define _SUN4C_PAGE_ACCESSED     0x00200000   /* implemented in software */
diff -Nru a/include/asm-sparc/posix_types.h b/include/asm-sparc/posix_types.h
--- a/include/asm-sparc/posix_types.h	Sat Apr 19 19:51:30 2003
+++ b/include/asm-sparc/posix_types.h	Sat Apr 19 19:51:30 2003
@@ -31,6 +31,7 @@
 typedef unsigned int	       __kernel_gid32_t;
 typedef unsigned short	       __kernel_old_uid_t;
 typedef unsigned short	       __kernel_old_gid_t;
+typedef unsigned short	       __kernel_old_dev_t;
 typedef int                    __kernel_clockid_t;
 typedef int                    __kernel_timer_t;
 
diff -Nru a/include/asm-sparc/signal.h b/include/asm-sparc/signal.h
--- a/include/asm-sparc/signal.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-sparc/signal.h	Sat Apr 19 19:51:48 2003
@@ -118,10 +118,10 @@
 };
 
 /* Sigvec flags */
-#define SV_SSTACK    1     /* This signal handler should use sig-stack */
-#define SV_INTR      2     /* Sig return should not restart system call */
-#define SV_RESET     4     /* Set handler to SIG_DFL upon taken signal */
-#define SV_IGNCHILD  8     /* Do not send SIGCHLD */
+#define SV_SSTACK    1u    /* This signal handler should use sig-stack */
+#define SV_INTR      2u    /* Sig return should not restart system call */
+#define SV_RESET     4u    /* Set handler to SIG_DFL upon taken signal */
+#define SV_IGNCHILD  8u    /* Do not send SIGCHLD */
 
 /*
  * sa_flags values: SA_STACK is not currently supported, but will allow the
@@ -137,11 +137,11 @@
 #define SA_ONSTACK	SV_SSTACK
 #define SA_RESTART	SV_INTR
 #define SA_ONESHOT	SV_RESET
-#define SA_INTERRUPT	0x10
-#define SA_NOMASK	0x20
-#define SA_SHIRQ	0x40
-#define SA_NOCLDWAIT	0x100
-#define SA_SIGINFO	0x200
+#define SA_INTERRUPT	0x10u
+#define SA_NOMASK	0x20u
+#define SA_SHIRQ	0x40u
+#define SA_NOCLDWAIT	0x100u
+#define SA_SIGINFO	0x200u
 
 #define SIG_BLOCK          0x01	/* for blocking signals */
 #define SIG_UNBLOCK        0x02	/* for unblocking signals */
diff -Nru a/include/asm-sparc/system.h b/include/asm-sparc/system.h
--- a/include/asm-sparc/system.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-sparc/system.h	Sat Apr 19 19:51:49 2003
@@ -11,7 +11,6 @@
 
 #include <asm/segment.h>
 #include <asm/page.h>
-#include <asm/openprom.h>	/* romvec. XXX will be dealt later. Promise. */
 #include <asm/psr.h>
 #include <asm/ptrace.h>
 #include <asm/btfixup.h>
@@ -95,20 +94,12 @@
 	} while(0)
 #endif
 
-// #define prepare_arch_schedule(prev)	task_lock(prev)
-// #define finish_arch_schedule(prev)	task_unlock(prev)
-#define prepare_arch_schedule(prev)	do{ }while(0)
-#define finish_arch_schedule(prev)	do{ }while(0)
-
 /*
  * Flush windows so that the VM switch which follows
  * would not pull the stack from under us.
  *
  * SWITCH_ENTER and SWITH_DO_LAZY_FPU do not work yet (e.g. SMP does not work)
  * XXX WTF is the above comment? Found in late teen 2.4.x.
- *
- * XXX prepare_arch_switch() is much smarter than this in sparc64, are we sure?
- * XXX Cosider if doing it the flush_user_windows way is faster (by uwinmask).
  */
 #define prepare_arch_switch(rq, next) do { \
 	__asm__ __volatile__( \
@@ -133,14 +124,13 @@
 	 * - Anton & Pete
 	 */
 #define switch_to(prev, next, last) do {						\
-	__label__ here;									\
-	register unsigned long task_pc asm("o7");					\
 	SWITCH_ENTER(prev);								\
 	SWITCH_DO_LAZY_FPU(next);							\
 	next->active_mm->cpu_vm_mask |= (1 << smp_processor_id());			\
-	task_pc = ((unsigned long) &&here) - 0x8;					\
 	__asm__ __volatile__(								\
+	"sethi	%%hi(here - 0x8), %%o7\n\t"						\
 	"mov	%%g6, %%g3\n\t"								\
+	"or	%%o7, %%lo(here - 0x8), %%o7\n\t"					\
 	"rd	%%psr, %%g4\n\t"							\
 	"std	%%sp, [%%g6 + %4]\n\t"							\
 	"rd	%%wim, %%g5\n\t"							\
@@ -155,7 +145,7 @@
 	"wr	%%g4, 0x20, %%psr\n\t"							\
 	"nop\n\t"									\
 	"nop\n\t"									\
-	"nop\n\t"	/* LEON needs this: load to %sp depends on CWP. */		\
+	"nop\n\t"	/* LEON needs all 3 nops: load to %sp depends on CWP. */		\
 	"ldd	[%%g6 + %4], %%sp\n\t"							\
 	"wr	%%g5, 0x0, %%wim\n\t"							\
 	"ldd	[%%sp + 0x00], %%l0\n\t"						\
@@ -165,18 +155,18 @@
 	"nop\n\t"									\
 	"jmpl	%%o7 + 0x8, %%g0\n\t"							\
 	" ld	[%%g3 + %5], %0\n\t"							\
+	"here:\n"									\
         : "=&r" (last)									\
         : "r" (&(current_set[hard_smp_processor_id()])),	\
 	  "r" ((next)->thread_info),				\
 	  "i" (TI_KPSR),					\
 	  "i" (TI_KSP),						\
-	  "i" (TI_TASK),					\
-	  "r" (task_pc)									\
+	  "i" (TI_TASK)						\
 	:       "g1", "g2", "g3", "g4", "g5",       "g7",	\
 	  "l0", "l1",       "l3", "l4", "l5", "l6", "l7",	\
 	  "i0", "i1", "i2", "i3", "i4", "i5",			\
-	  "o0", "o1", "o2", "o3");				\
-here:;  } while(0)
+	  "o0", "o1", "o2", "o3",                   "o7");	\
+	} while(0)
 
 /*
  * Changing the IRQ level on the Sparc.
diff -Nru a/include/asm-sparc/uaccess.h b/include/asm-sparc/uaccess.h
--- a/include/asm-sparc/uaccess.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-sparc/uaccess.h	Sat Apr 19 19:51:50 2003
@@ -8,6 +8,7 @@
 #define _ASM_UACCESS_H
 
 #ifdef __KERNEL__
+#include <linux/compiler.h>
 #include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
@@ -45,7 +46,7 @@
 #define __access_ok(addr,size) (__user_ok((addr) & get_fs().seg,(size)))
 #define access_ok(type,addr,size) __access_ok((unsigned long)(addr),(size))
 
-extern inline int verify_area(int type, const void * addr, unsigned long size)
+static inline int verify_area(int type, const void __user * addr, unsigned long size)
 {
 	return access_ok(type,addr,size)?0:-EFAULT;
 }
@@ -104,7 +105,7 @@
  * doing multiple accesses to the same area (the user has to do the
  * checks by hand with "access_ok()")
  */
-#define __put_user(x,ptr) __put_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)),__typeof__(*(ptr)))
 
 struct __large_struct { unsigned long buf[100]; };
@@ -291,87 +292,87 @@
 
 extern int __get_user_bad(void);
 
-extern __kernel_size_t __copy_user(void *to, void *from, __kernel_size_t size);
+extern unsigned long __copy_user(void *to, const void *from, unsigned long size);
 
-#define copy_to_user(to,from,n) ({ \
-void *__copy_to = (void *) (to); \
-__kernel_size_t __copy_size = (__kernel_size_t) (n); \
-__kernel_size_t __copy_res; \
-if(__copy_size && __access_ok((unsigned long)__copy_to, __copy_size)) { \
-__copy_res = __copy_user(__copy_to, (void *) (from), __copy_size); \
-} else __copy_res = __copy_size; \
-__copy_res; })
-
-#define __copy_to_user(to,from,n)		\
-	__copy_user((void *)(to),		\
-		    (void *)(from), n)
-
-#define copy_from_user(to,from,n) ({ \
-void *__copy_to = (void *) (to); \
-void *__copy_from = (void *) (from); \
-__kernel_size_t __copy_size = (__kernel_size_t) (n); \
-__kernel_size_t __copy_res; \
-if(__copy_size && __access_ok((unsigned long)__copy_from, __copy_size)) { \
-__copy_res = __copy_user(__copy_to, __copy_from, __copy_size); \
-} else __copy_res = __copy_size; \
-__copy_res; })
-
-#define __copy_from_user(to,from,n)		\
-	__copy_user((void *)(to),		\
-		    (void *)(from), n)
-
-extern __inline__ __kernel_size_t __clear_user(void *addr, __kernel_size_t size)
-{
-  __kernel_size_t ret;
-  __asm__ __volatile__ (
-	".section __ex_table,#alloc\n\t"
-	".align 4\n\t"
-	".word 1f,3\n\t"
-	".previous\n\t"
-	"mov %2, %%o1\n"
-	"1:\n\t"
-	"call __bzero\n\t"
-	" mov %1, %%o0\n\t"
-	"mov %%o0, %0\n"
-	: "=r" (ret) : "r" (addr), "r" (size) :
-	"o0", "o1", "o2", "o3", "o4", "o5", "o7",
-	"g1", "g2", "g3", "g4", "g5", "g7", "cc");
-  return ret;
+static inline unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
+{
+	if (n && __access_ok((unsigned long) to, n))
+		return __copy_user((void *) to, from, n);
+	else
+		return n;
 }
 
-#define clear_user(addr,n) ({ \
-void *__clear_addr = (void *) (addr); \
-__kernel_size_t __clear_size = (__kernel_size_t) (n); \
-__kernel_size_t __clear_res; \
-if(__clear_size && __access_ok((unsigned long)__clear_addr, __clear_size)) { \
-__clear_res = __clear_user(__clear_addr, __clear_size); \
-} else __clear_res = __clear_size; \
-__clear_res; })
-
-extern int __strncpy_from_user(unsigned long dest, unsigned long src, int count);
-
-#define strncpy_from_user(dest,src,count) ({ \
-unsigned long __sfu_src = (unsigned long) (src); \
-int __sfu_count = (int) (count); \
-long __sfu_res = -EFAULT; \
-if(__access_ok(__sfu_src, __sfu_count)) { \
-__sfu_res = __strncpy_from_user((unsigned long) (dest), __sfu_src, __sfu_count); \
-} __sfu_res; })
+static inline unsigned long __copy_to_user(void __user *to, const void *from, unsigned long n)
+{
+	return __copy_user((void *)to, from, n);
+}
+
+static inline unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
+{
+	if (n && __access_ok((unsigned long) from, n))
+		return __copy_user(to, (void *) from, n);
+	else
+		return n;
+}
+
+static inline unsigned long __copy_from_user(void *to, const void __user *from, unsigned long n)
+{
+	return __copy_user(to, (void *)from, n);
+}
+
+static inline unsigned long __clear_user(void __user *addr, unsigned long size)
+{
+	unsigned long ret;
+
+	__asm__ __volatile__ (
+		".section __ex_table,#alloc\n\t"
+		".align 4\n\t"
+		".word 1f,3\n\t"
+		".previous\n\t"
+		"mov %2, %%o1\n"
+		"1:\n\t"
+		"call __bzero\n\t"
+		" mov %1, %%o0\n\t"
+		"mov %%o0, %0\n"
+		: "=r" (ret) : "r" (addr), "r" (size) :
+		"o0", "o1", "o2", "o3", "o4", "o5", "o7",
+		"g1", "g2", "g3", "g4", "g5", "g7", "cc");
+
+	return ret;
+}
+
+static inline unsigned long clear_user(void __user *addr, unsigned long n)
+{
+	if (n && __access_ok((unsigned long) addr, n))
+		return __clear_user(addr, n);
+	else
+		return n;
+}
+
+extern long __strncpy_from_user(char *dest, const char __user *src, long count);
+
+static inline long strncpy_from_user(char *dest, const char __user *src, long count)
+{
+	if (__access_ok((unsigned long) src, count))
+		return __strncpy_from_user(dest, src, count);
+	else
+		return -EFAULT;
+}
 
-extern int __strlen_user(const char *);
-extern int __strnlen_user(const char *, long len);
+extern long __strlen_user(const char __user *);
+extern long __strnlen_user(const char __user *, long len);
 
-extern __inline__ int strlen_user(const char *str)
+static inline long strlen_user(const char __user *str)
 {
-	if(!access_ok(VERIFY_READ, str, 0))
+	if (!access_ok(VERIFY_READ, str, 0))
 		return 0;
 	else
 		return __strlen_user(str);
 }
 
-extern __inline__ int strnlen_user(const char *str, long len)
+static inline long strnlen_user(const char __user *str, long len)
 {
-	if(!access_ok(VERIFY_READ, str, 0))
+	if (!access_ok(VERIFY_READ, str, 0))
 		return 0;
 	else
 		return __strnlen_user(str, len);
diff -Nru a/include/asm-sparc64/bitops.h b/include/asm-sparc64/bitops.h
--- a/include/asm-sparc64/bitops.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-sparc64/bitops.h	Sat Apr 19 19:51:28 2003
@@ -351,7 +351,9 @@
 #ifdef __KERNEL__
 
 #define ext2_set_bit(nr,addr)		test_and_set_le_bit((nr),(unsigned long *)(addr))
+#define ext2_set_bit_atomic(lock,nr,addr) test_and_set_le_bit((nr),(unsigned long *)(addr))
 #define ext2_clear_bit(nr,addr)		test_and_clear_le_bit((nr),(unsigned long *)(addr))
+#define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_le_bit((nr),(unsigned long *)(addr))
 #define ext2_test_bit(nr,addr)		test_le_bit((nr),(unsigned long *)(addr))
 #define ext2_find_first_zero_bit(addr, size) \
 	find_first_zero_le_bit((unsigned long *)(addr), (size))
diff -Nru a/include/asm-sparc64/cacheflush.h b/include/asm-sparc64/cacheflush.h
--- a/include/asm-sparc64/cacheflush.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-sparc64/cacheflush.h	Sat Apr 19 19:51:50 2003
@@ -50,7 +50,4 @@
 
 extern void flush_dcache_page(struct page *page);
 
-/* This is unnecessary on the SpitFire since D-CACHE is write-through. */
-#define flush_page_to_ram(page)			do { } while (0)
-
 #endif /* _SPARC64_CACHEFLUSH_H */
diff -Nru a/include/asm-sparc64/compat.h b/include/asm-sparc64/compat.h
--- a/include/asm-sparc64/compat.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-sparc64/compat.h	Sat Apr 19 19:51:49 2003
@@ -95,6 +95,8 @@
 	int		f_spare[6];
 };
 
+#define COMPAT_RLIM_INFINITY 0x7fffffff
+
 typedef u32		compat_old_sigset_t;
 
 #define _COMPAT_NSIG		64
diff -Nru a/include/asm-sparc64/posix_types.h b/include/asm-sparc64/posix_types.h
--- a/include/asm-sparc64/posix_types.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-sparc64/posix_types.h	Sat Apr 19 19:51:50 2003
@@ -34,6 +34,8 @@
 typedef __kernel_uid_t	       __kernel_uid32_t;
 typedef __kernel_gid_t	       __kernel_gid32_t;
 
+typedef unsigned int	       __kernel_old_dev_t;
+
 /* Note this piece of asymmetry from the v9 ABI.  */
 typedef int		       __kernel_suseconds_t;
 
diff -Nru a/include/asm-sparc64/signal.h b/include/asm-sparc64/signal.h
--- a/include/asm-sparc64/signal.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-sparc64/signal.h	Sat Apr 19 19:51:29 2003
@@ -123,10 +123,10 @@
 };
 
 /* Sigvec flags */
-#define SV_SSTACK    1     /* This signal handler should use sig-stack */
-#define SV_INTR      2     /* Sig return should not restart system call */
-#define SV_RESET     4     /* Set handler to SIG_DFL upon taken signal */
-#define SV_IGNCHILD  8     /* Do not send SIGCHLD */
+#define SV_SSTACK    1u    /* This signal handler should use sig-stack */
+#define SV_INTR      2u    /* Sig return should not restart system call */
+#define SV_RESET     4u    /* Set handler to SIG_DFL upon taken signal */
+#define SV_IGNCHILD  8u    /* Do not send SIGCHLD */
 
 /*
  * sa_flags values: SA_STACK is not currently supported, but will allow the
@@ -142,11 +142,11 @@
 #define SA_ONSTACK	SV_SSTACK
 #define SA_RESTART	SV_INTR
 #define SA_ONESHOT	SV_RESET
-#define SA_INTERRUPT	0x10
-#define SA_NOMASK	0x20
-#define SA_SHIRQ	0x40
-#define SA_NOCLDWAIT    0x100
-#define SA_SIGINFO      0x200
+#define SA_INTERRUPT	0x10u
+#define SA_NOMASK	0x20u
+#define SA_SHIRQ	0x40u
+#define SA_NOCLDWAIT    0x100u
+#define SA_SIGINFO      0x200u
 
 
 #define SIG_BLOCK          0x01	/* for blocking signals */
diff -Nru a/include/asm-sparc64/uaccess.h b/include/asm-sparc64/uaccess.h
--- a/include/asm-sparc64/uaccess.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-sparc64/uaccess.h	Sat Apr 19 19:51:46 2003
@@ -7,6 +7,7 @@
  */
 
 #ifdef __KERNEL__
+#include <linux/compiler.h>
 #include <linux/sched.h>
 #include <linux/string.h>
 #include <asm/a.out.h>
@@ -52,7 +53,7 @@
 #define __access_ok(addr,size) 1
 #define access_ok(type,addr,size) 1
 
-static inline int verify_area(int type, const void * addr, unsigned long size)
+static inline int verify_area(int type, const void __user * addr, unsigned long size)
 {
 	return 0;
 }
@@ -249,44 +250,34 @@
 
 extern int __get_user_bad(void);
 
-extern __kernel_size_t __copy_from_user(void *to, const void *from,
-					__kernel_size_t size);
+extern unsigned long __copy_from_user(void *to, const void __user *from,
+				      unsigned long size);
 
-extern __kernel_size_t __copy_to_user(void *to, const void *from,
-				      __kernel_size_t size);
+extern unsigned long __copy_to_user(void __user *to, const void *from,
+				    unsigned long size);
 
-extern __kernel_size_t __copy_in_user(void *to, const void *from,
-				      __kernel_size_t size);
+extern unsigned long __copy_in_user(void __user *to, const void __user *from,
+				    unsigned long size);
 
-#define copy_from_user(to,from,n)		\
-	__copy_from_user((void *)(to),	\
-		    (void *)(from), (__kernel_size_t)(n))
+#define copy_from_user __copy_from_user
+#define copy_to_user __copy_to_user
+#define copy_in_user __copy_in_user
 
-#define copy_to_user(to,from,n) \
-	__copy_to_user((void *)(to), \
-	(void *) (from), (__kernel_size_t)(n))
-
-#define copy_in_user(to,from,n) \
-	__copy_in_user((void *)(to), \
-	(void *) (from), (__kernel_size_t)(n))
-
-static __inline__ __kernel_size_t __clear_user(void *addr, __kernel_size_t size)
+static inline unsigned long __clear_user(void __user *addr, unsigned long size)
 {
-	extern __kernel_size_t __bzero_noasi(void *addr, __kernel_size_t size);
+	extern unsigned long __bzero_noasi(void *addr, unsigned long size);
 	
-	return __bzero_noasi(addr, size);
+	return __bzero_noasi((void *) addr, size);
 }
 
-#define clear_user(addr,n) \
-	__clear_user((void *)(addr), (__kernel_size_t)(n))
+#define clear_user __clear_user
 
-extern int __strncpy_from_user(unsigned long dest, unsigned long src, int count);
+extern long __strncpy_from_user(char *dest, const char __user *src, long count);
 
-#define strncpy_from_user(dest,src,count) \
-	__strncpy_from_user((unsigned long)(dest), (unsigned long)(src), (int)(count))
+#define strncpy_from_user __strncpy_from_user
 
-extern int __strlen_user(const char *);
-extern int __strnlen_user(const char *, long len);
+extern long __strlen_user(const char __user *);
+extern long __strnlen_user(const char __user *, long len);
 
 #define strlen_user __strlen_user
 #define strnlen_user __strnlen_user
diff -Nru a/include/asm-v850/bitops.h b/include/asm-v850/bitops.h
--- a/include/asm-v850/bitops.h	Sat Apr 19 19:51:48 2003
+++ b/include/asm-v850/bitops.h	Sat Apr 19 19:51:48 2003
@@ -252,7 +252,9 @@
 #define hweight8(x) 			generic_hweight8 (x)
 
 #define ext2_set_bit			test_and_set_bit
+#define ext2_set_bit_atomic(l,n,a)      test_and_set_bit(n,a)
 #define ext2_clear_bit			test_and_clear_bit
+#define ext2_clear_bit_atomic(l,n,a)    test_and_clear_bit(n,a)
 #define ext2_test_bit			test_bit
 #define ext2_find_first_zero_bit	find_first_zero_bit
 #define ext2_find_next_zero_bit		find_next_zero_bit
diff -Nru a/include/asm-v850/cacheflush.h b/include/asm-v850/cacheflush.h
--- a/include/asm-v850/cacheflush.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-v850/cacheflush.h	Sat Apr 19 19:51:46 2003
@@ -29,7 +29,6 @@
 #define flush_cache_mm(mm)			((void)0)
 #define flush_cache_range(vma, start, end)	((void)0)
 #define flush_cache_page(vma, vmaddr)		((void)0)
-#define flush_page_to_ram(page)			((void)0)
 #define flush_dcache_page(page)			((void)0)
 #define flush_icache()				((void)0)
 #define flush_icache_range(start, end)		((void)0)
diff -Nru a/include/asm-v850/nb85e_cache.h b/include/asm-v850/nb85e_cache.h
--- a/include/asm-v850/nb85e_cache.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-v850/nb85e_cache.h	Sat Apr 19 19:51:47 2003
@@ -2,8 +2,8 @@
  * include/asm-v850/nb85e_cache_cache.h -- Cache control for NB85E_CACHE212 and
  * 	NB85E_CACHE213 cache memories
  *
- *  Copyright (C) 2001  NEC Corporation
- *  Copyright (C) 2001  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -15,92 +15,64 @@
 #ifndef __V850_NB85E_CACHE_H__
 #define __V850_NB85E_CACHE_H__
 
+#include <asm/types.h>
+
+
 /* Cache control registers.  */
-#define NB85E_CACHE_ICC_ADDR		0xFFFFF070
-#define NB85E_CACHE_DCC_ADDR		0xFFFFF078
+#define NB85E_CACHE_BHC_ADDR	0xFFFFF06A
+#define NB85E_CACHE_BHC		(*(volatile u16 *)NB85E_CACHE_BHC_ADDR)
+#define NB85E_CACHE_ICC_ADDR	0xFFFFF070
+#define NB85E_CACHE_ICC		(*(volatile u16 *)NB85E_CACHE_ICC_ADDR)
+#define NB85E_CACHE_ISI_ADDR	0xFFFFF072
+#define NB85E_CACHE_ISI		(*(volatile u16 *)NB85E_CACHE_ISI_ADDR)
+#define NB85E_CACHE_DCC_ADDR	0xFFFFF078
+#define NB85E_CACHE_DCC		(*(volatile u16 *)NB85E_CACHE_DCC_ADDR)
 
 /* Size of a cache line in bytes.  */
-#define NB85E_CACHE_LINE_SIZE		16
-
+#define NB85E_CACHE_LINE_SIZE	16
 
-#ifndef __ASSEMBLY__
+/* For <asm/cache.h> */
+#define L1_CACHE_BYTES				NB85E_CACHE_LINE_SIZE
 
-extern inline void nb85e_cache_flush_cache (unsigned long cache_control_addr)
-{
-	/*
-	   From the NB85E Instruction/Data Cache manual, how to flush
-	   the instruction cache (ICC is the `Instruction Cache Control
-	   Register'):
-
-		mov	0x3, r2
-	  LOP0:
-		ld.h	ICC[r0], r1
-		cmp	r0, r1
-		bnz	LOP0
-		st.h	r2, ICC[r0]
-	  LOP1:				- First TAG clear
-		ld.h	ICC[r0], r1
-		cmp	r0, r1
-		bnz	LOP1
-		st.h	r2, ICC[r0]
-	  LOP2:				- Second TAG clear
-		ld.h	ICC[r0], r1
-		cmp	r0, r1
-		bnz	LOP2
-	*/
-	int cache_flush_bits, ccr_contents;
-	__asm__ __volatile__ (
-		"	mov	0x3, %1;"
-		"1:	ld.h	0[%2], %0;"
-		"	cmp	r0, %0;"
-		"	bnz	1b;"
-		"	st.h	%1, 0[%2];"
-		"2:	ld.h	0[%2], %0;"
-		"	cmp	r0, %0;"
-		"	bnz	2b;"
-		"	st.h	%1, 0[%2];"
-		"3:	ld.h	0[%2], %0;"
-		"	cmp	r0, %0;"
-		"	bnz	3b"
-		: "=&r" (ccr_contents), "=&r" (cache_flush_bits)
-		: "r" (cache_control_addr)
-		: "memory");
-}
-
-extern inline void nb85e_cache_flush_icache (void)
-{
-	nb85e_cache_flush_cache (NB85E_CACHE_ICC_ADDR);
-}
-
-extern inline void nb85e_cache_flush_dcache (void)
-{
-	nb85e_cache_flush_cache (NB85E_CACHE_DCC_ADDR);
-}
-
-extern inline void nb85e_cache_flush (void)
-{
-	nb85e_cache_flush_icache ();
-	nb85e_cache_flush_dcache ();
-}
 
-#endif /* !__ASSEMBLY__ */
+#ifndef __ASSEMBLY__
 
-
-/* Define standard definitions in terms of processor-specific ones.  */
+/* Set caching params via the BHC and DCC registers.  */
+void nb85e_cache_enable (u16 bhc, u16 dcc);
 
-/* For <asm/cache.h> */
-#define L1_CACHE_BYTES				NB85E_CACHE_LINE_SIZE
+struct page;
+struct mm_struct;
+struct vm_area_struct;
+
+extern void nb85e_cache_flush_all (void);
+extern void nb85e_cache_flush_mm (struct mm_struct *mm);
+extern void nb85e_cache_flush_range (struct mm_struct *mm,
+				     unsigned long start,
+				     unsigned long end);
+extern void nb85e_cache_flush_page (struct vm_area_struct *vma,
+				    unsigned long page_addr);
+extern void nb85e_cache_flush_dcache_page (struct page *page);
+extern void nb85e_cache_flush_icache (void);
+extern void nb85e_cache_flush_icache_range (unsigned long start,
+					    unsigned long end);
+extern void nb85e_cache_flush_icache_page (struct vm_area_struct *vma,
+					   struct page *page);
+extern void nb85e_cache_flush_icache_user_range (struct vm_area_struct *vma,
+						 struct page *page,
+						 unsigned long adr, int len);
+extern void nb85e_cache_flush_sigtramp (unsigned long addr);
+
+#define flush_cache_all		nb85e_cache_flush_all
+#define flush_cache_mm		nb85e_cache_flush_mm
+#define flush_cache_range	nb85e_cache_flush_range
+#define flush_cache_page	nb85e_cache_flush_page
+#define flush_dcache_page	nb85e_cache_flush_dcache_page
+#define flush_icache		nb85e_cache_flush_icache
+#define flush_icache_range	nb85e_cache_flush_icache_range
+#define flush_icache_page	nb85e_cache_flush_icache_page
+#define flush_icache_user_range	nb85e_cache_flush_icache_user_range
+#define flush_cache_sigtramp	nb85e_cache_flush_sigtramp
 
-/* For <asm/pgalloc.h> */
-#define flush_cache_all()			nb85e_cache_flush ()
-#define flush_cache_mm(mm)			nb85e_cache_flush ()
-#define flush_cache_range(mm, start, end)	nb85e_cache_flush ()
-#define flush_cache_page(vma, vmaddr)		nb85e_cache_flush ()
-#define flush_page_to_ram(page)			nb85e_cache_flush ()
-#define flush_dcache_page(page)			nb85e_cache_flush_dcache ()
-#define flush_icache_range(start, end)		nb85e_cache_flush_icache ()
-#define flush_icache_page(vma,pg)		nb85e_cache_flush_icache ()
-#define flush_icache()				nb85e_cache_flush_icache ()
-#define flush_cache_sigtramp(vaddr)		nb85e_cache_flush_icache ()
+#endif /* !__ASSEMBLY__ */
 
 #endif /* __V850_NB85E_CACHE_H__ */
diff -Nru a/include/asm-v850/nb85e_intc.h b/include/asm-v850/nb85e_intc.h
--- a/include/asm-v850/nb85e_intc.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-v850/nb85e_intc.h	Sat Apr 19 19:51:50 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/nb85e_intc.h -- NB85E cpu core interrupt controller (INTC)
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -26,7 +26,7 @@
    address.  */
 #define NB85E_INTC_IC_BASE_ADDR	  0xFFFFF110
 #define NB85E_INTC_IC_ADDR(irq)	  (NB85E_INTC_IC_BASE_ADDR + ((irq) << 1))
-#define NB85E_INTC_IC(irq)	  (*(char *)NB85E_INTC_IC_ADDR(irq))
+#define NB85E_INTC_IC(irq)	  (*(volatile u8 *)NB85E_INTC_IC_ADDR(irq))
 /* Encode priority PR for storing in an interrupt control register.  */
 #define NB85E_INTC_IC_PR(pr)	  (pr)
 /* Interrupt disable bit in an interrupt control register.  */
@@ -35,6 +35,13 @@
 /* Interrupt pending flag in an interrupt control register.  */
 #define NB85E_INTC_IC_IF_BIT	  7
 #define NB85E_INTC_IC_IF	  (1 << NB85E_INTC_IC_IF_BIT)
+
+/* The ISPR (In-service priority register) contains one bit for each interrupt
+   priority level, which is set to one when that level is currently being
+   serviced (and thus blocking any interrupts of equal or lesser level).  */
+#define NB85E_INTC_ISPR_ADDR	  0xFFFFF1FA
+#define NB85E_INTC_ISPR		  (*(volatile u8 *)NB85E_INTC_ISPR_ADDR)
+
 
 #ifndef __ASSEMBLY__
 
diff -Nru a/include/asm-v850/nb85e_timer_d.h b/include/asm-v850/nb85e_timer_d.h
--- a/include/asm-v850/nb85e_timer_d.h	Sat Apr 19 19:51:30 2003
+++ b/include/asm-v850/nb85e_timer_d.h	Sat Apr 19 19:51:30 2003
@@ -2,8 +2,8 @@
  * include/asm-v850/nb85e_timer_d.h -- `Timer D' component often used
  *	with the NB85E cpu core
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -27,7 +27,7 @@
 
 /* Count compare registers for timer D.  */
 #define NB85E_TIMER_D_CMD_ADDR(n) (NB85E_TIMER_D_CMD_BASE_ADDR + 0x10 * (n))
-#define NB85E_TIMER_D_CMD(n)	  (*(u16 *)NB85E_TIMER_D_CMD_ADDR(n))
+#define NB85E_TIMER_D_CMD(n)	  (*(volatile u16 *)NB85E_TIMER_D_CMD_ADDR(n))
 
 /* Control registers for timer D.  */
 #define NB85E_TIMER_D_TMCD_ADDR(n) (NB85E_TIMER_D_TMCD_BASE_ADDR + 0x10 * (n))
diff -Nru a/include/asm-v850/page.h b/include/asm-v850/page.h
--- a/include/asm-v850/page.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-v850/page.h	Sat Apr 19 19:51:49 2003
@@ -40,8 +40,14 @@
 #define clear_page(page)	memset ((void *)(page), 0, PAGE_SIZE)
 #define copy_page(to, from)	memcpy ((void *)(to), (void *)from, PAGE_SIZE)
 
-#define clear_user_page(page, vaddr, pg)	clear_page (page)
-#define copy_user_page(to, from, vaddr,pg)	copy_page (to, from)
+#define clear_user_page(addr, vaddr, page)	\
+	do { 	clear_page(addr);		\
+		flush_dcache_page(page);	\
+	} while (0)
+#define copy_user_page(to, from, vaddr, page)	\
+	do {	copy_page(to, from);		\
+		flush_dcache_page(page);	\
+	} while (0)
 
 #ifdef STRICT_MM_TYPECHECKS
 /*
diff -Nru a/include/asm-v850/posix_types.h b/include/asm-v850/posix_types.h
--- a/include/asm-v850/posix_types.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-v850/posix_types.h	Sat Apr 19 19:51:51 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/posix_types.h -- Kernel versions of standard types
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -31,6 +31,8 @@
 typedef long		__kernel_time_t;
 typedef long		__kernel_suseconds_t;
 typedef long		__kernel_clock_t;
+typedef int		__kernel_timer_t;
+typedef int		__kernel_clockid_t;
 typedef int		__kernel_daddr_t;
 typedef char *		__kernel_caddr_t;
 typedef unsigned short	__kernel_uid16_t;
@@ -40,7 +42,7 @@
 
 /* Some bogus code depends on this; we don't care.  */
 typedef __kernel_uid_t __kernel_old_uid_t;
-
+typedef unsigned int	__kernel_old_dev_t;
 
 typedef struct {
 #if defined(__KERNEL__) || defined(__USE_ALL)
diff -Nru a/include/asm-v850/processor.h b/include/asm-v850/processor.h
--- a/include/asm-v850/processor.h	Sat Apr 19 19:51:29 2003
+++ b/include/asm-v850/processor.h	Sat Apr 19 19:51:29 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/processor.h
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -91,15 +91,17 @@
 {
 }
 
-/* Return saved (kernel) PC of a blocked thread.  */
-extern inline unsigned long thread_saved_pc (struct thread_struct *t)
-{
-	struct pt_regs *r = (struct pt_regs *)(t->ksp + STATE_SAVE_PT_OFFSET);
-	/* Actually, we return the LP register, because the thread is
-	   actually blocked in switch_thread, and we're interested in
-	   the PC it will _return_ to.  */
-	return r->gpr[GPR_LP];
-}
+
+/* Return the registers saved during context-switch by the currently
+   not-running thread T.  Note that this only includes some registers!
+   See entry.S for details.  */
+#define thread_saved_regs(t) \
+   ((struct pt_regs*)((t)->thread.ksp + STATE_SAVE_PT_OFFSET))
+/* Return saved (kernel) PC of a blocked thread.  Actually, we return the
+   LP register, because the thread is actually blocked in switch_thread,
+   and we're interested in the PC it will _return_ to.  */
+#define thread_saved_pc(t)   (thread_saved_regs(t)->gpr[GPR_LP])
+
 
 unsigned long get_wchan (struct task_struct *p);
 
diff -Nru a/include/asm-v850/ptrace.h b/include/asm-v850/ptrace.h
--- a/include/asm-v850/ptrace.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-v850/ptrace.h	Sat Apr 19 19:51:51 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/ptrace.h -- Access to CPU registers
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -102,10 +102,19 @@
 #define PT_CTBP		((NUM_GPRS + 4) * _PT_REG_SIZE)
 #define PT_KERNEL_MODE	((NUM_GPRS + 5) * _PT_REG_SIZE)
 
-#define PT_SYSCALL	PT_GPR(0)
+/* Where the current syscall number is stashed; obviously only valid in
+   the kernel!  */
+#define PT_CUR_SYSCALL	PT_GPR(0)
 
 /* Size of struct pt_regs, including alignment.  */
 #define PT_SIZE		((NUM_GPRS + 6) * _PT_REG_SIZE)
+
+
+/* These are `magic' values for PTRACE_PEEKUSR that return info about where
+   a process is located in memory.  */
+#define PT_TEXT_ADDR	(PT_SIZE + 1)
+#define PT_TEXT_LEN	(PT_SIZE + 2)
+#define PT_DATA_ADDR	(PT_SIZE + 3)
 
 
 #endif /* __V850_PTRACE_H__ */
diff -Nru a/include/asm-v850/rte_cb.h b/include/asm-v850/rte_cb.h
--- a/include/asm-v850/rte_cb.h	Sat Apr 19 19:51:47 2003
+++ b/include/asm-v850/rte_cb.h	Sat Apr 19 19:51:47 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/rte_cb.h -- Midas labs RTE-CB series of evaluation boards
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -15,18 +15,6 @@
 #define __V850_RTE_CB_H__
 
 
-/* CPU addresses of GBUS memory spaces.  */
-#define GCS0_ADDR		0x05000000 /* GCS0 - Common SRAM (2MB) */
-#define GCS0_SIZE		0x00200000 /*   2MB */
-#define GCS1_ADDR		0x06000000 /* GCS1 - Flash ROM (8MB) */
-#define GCS1_SIZE		0x00800000 /*   8MB */
-#define GCS2_ADDR		0x07900000 /* GCS2 - I/O registers */
-#define GCS2_SIZE		0x00400000 /*   4MB */
-#define GCS5_ADDR		0x04000000 /* GCS5 - PCI bus space */
-#define GCS5_SIZE		0x01000000 /*   16MB */
-#define GCS6_ADDR		0x07980000 /* GCS6 - PCI control registers */
-#define GCS6_SIZE		0x00000200 /*   512B */
-
 /* The SRAM on the Mother-A motherboard.  */
 #define MB_A_SRAM_ADDR		GCS0_ADDR
 #define MB_A_SRAM_SIZE		0x00200000 /* 2MB */
@@ -78,9 +66,8 @@
 
 
 #ifndef __ASSEMBLY__
-
+extern void rte_cb_early_init (void);
 extern void rte_cb_init_irqs (void);
-
 #endif /* !__ASSEMBLY__ */
 
 
diff -Nru a/include/asm-v850/rte_ma1_cb.h b/include/asm-v850/rte_ma1_cb.h
--- a/include/asm-v850/rte_ma1_cb.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-v850/rte_ma1_cb.h	Sat Apr 19 19:51:28 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/rte_ma1_cb.h -- Midas labs RTE-V850/MA1-CB board
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -15,6 +15,19 @@
 #define __V850_RTE_MA1_CB_H__
 
 #include <asm/rte_cb.h>		/* Common defs for Midas RTE-CB boards.  */
+
+
+/* CPU addresses of GBUS memory spaces.  */
+#define GCS0_ADDR		0x05000000 /* GCS0 - Common SRAM (2MB) */
+#define GCS0_SIZE		0x00200000 /*   2MB */
+#define GCS1_ADDR		0x06000000 /* GCS1 - Flash ROM (8MB) */
+#define GCS1_SIZE		0x00800000 /*   8MB */
+#define GCS2_ADDR		0x07900000 /* GCS2 - I/O registers */
+#define GCS2_SIZE		0x00400000 /*   4MB */
+#define GCS5_ADDR		0x04000000 /* GCS5 - PCI bus space */
+#define GCS5_SIZE		0x01000000 /*   16MB */
+#define GCS6_ADDR		0x07980000 /* GCS6 - PCI control registers */
+#define GCS6_SIZE		0x00000200 /*   512B */
 
 
 /* The GBUS GINT0 - GINT4 interrupts are connected to the INTP000 - INTP011
diff -Nru a/include/asm-v850/rte_nb85e_cb.h b/include/asm-v850/rte_nb85e_cb.h
--- a/include/asm-v850/rte_nb85e_cb.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-v850/rte_nb85e_cb.h	Sat Apr 19 19:51:50 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/rte_nb85e_cb.h -- Midas labs RTE-V850/NB85E-CB board
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -16,6 +16,30 @@
 
 #include <asm/rte_cb.h>		/* Common defs for Midas RTE-CB boards.  */
 
+
+/* CPU addresses of GBUS memory spaces.  */
+#define GCS0_ADDR		0x00400000 /* GCS0 - Common SRAM (2MB) */
+#define GCS0_SIZE		0x00400000 /*   4MB */
+#define GCS1_ADDR		0x02000000 /* GCS1 - Flash ROM (8MB) */
+#define GCS1_SIZE		0x00800000 /*   8MB */
+#define GCS2_ADDR		0x03900000 /* GCS2 - I/O registers */
+#define GCS2_SIZE		0x00080000 /*   512KB */
+#define GCS3_ADDR		0x02800000 /* GCS3 - EXT-bus: memory space */
+#define GCS3_SIZE		0x00800000 /*   8MB */
+#define GCS4_ADDR		0x03A00000 /* GCS4 - EXT-bus: I/O space */
+#define GCS4_SIZE		0x00200000 /*   2MB */
+#define GCS5_ADDR		0x00800000 /* GCS5 - PCI bus space */
+#define GCS5_SIZE		0x00800000 /*   8MB */
+#define GCS6_ADDR		0x03980000 /* GCS6 - PCI control registers */
+#define GCS6_SIZE		0x00010000 /*   64KB */
+
+
+/* The GBUS GINT0 - GINT3 interrupts are connected to CPU interrupts 10-12.
+   These are shared among the GBUS interrupts.  */
+#define IRQ_GINT(n)		(10 + (n))
+#define IRQ_GINT_NUM		3
+
+
 #define PLATFORM	"rte-v850e/nb85e-cb"
 #define PLATFORM_LONG	"Midas lab RTE-V850E/NB85E-CB"
 
@@ -41,13 +65,13 @@
 
 /* The chip's real interrupt vectors are in ROM, but they jump to a
    secondary interrupt vector table in RAM.  */
-#define INTV_BASE	0x004F8000
+#define INTV_BASE		0x03CF8000
 
 /* Scratch memory used by the ROM monitor, which shouldn't be used by
    linux (except for the alternate interrupt vector area, defined
    above).  */
 #define MON_SCRATCH_ADDR	0x03CE8000
-#define MON_SCRATCH_SIZE	0x00008000 /* 32KB */
+#define MON_SCRATCH_SIZE	0x00018000 /* 96KB */
 
 #endif /* CONFIG_ROM_KERNEL */
 
@@ -58,6 +82,27 @@
 #define LED_ADDR(n)	(0x03802000 + (n))
 #define LED(n)		(*(volatile unsigned char *)LED_ADDR(n))
 #define LED_NUM_DIGITS	4
+
+
+/* Override the basic TEG UART pre-initialization so that we can
+   initialize extra stuff.  */
+#undef NB85E_UART_PRE_CONFIGURE	/* should be defined by <asm/teg.h> */
+#define NB85E_UART_PRE_CONFIGURE	rte_nb85e_cb_uart_pre_configure
+#ifndef __ASSEMBLY__
+extern void rte_nb85e_cb_uart_pre_configure (unsigned chan,
+					     unsigned cflags, unsigned baud);
+#endif
+
+/* This board supports RTS/CTS for the on-chip UART. */
+
+/* CTS is pin P00.  */
+#define NB85E_UART_CTS(chan)	(! (TEG_PORT0_IO & 0x1))
+/* RTS is pin P02.  */
+#define NB85E_UART_SET_RTS(chan, val)					      \
+   do {									      \
+	   unsigned old = TEG_PORT0_IO;					      \
+	   TEG_PORT0_IO = val ? (old & ~0x4) : (old | 0x4);		      \
+   } while (0)
 
 
 #endif /* __V850_RTE_NB85E_CB_H__ */
diff -Nru a/include/asm-v850/system.h b/include/asm-v850/system.h
--- a/include/asm-v850/system.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-v850/system.h	Sat Apr 19 19:51:49 2003
@@ -72,17 +72,10 @@
 #define set_mb(var, value)	set_rmb (var, value)
 #define set_wmb(var, value)	do { var = value; wmb (); } while (0)
 
-#ifdef CONFIG_SMP
 #define smp_mb()	mb ()
 #define smp_rmb()	rmb ()
 #define smp_wmb()	wmb ()
 #define smp_read_barrier_depends()	read_barrier_depends()
-#else
-#define smp_mb()	barrier ()
-#define smp_rmb()	barrier ()
-#define smp_wmb()	barrier ()
-#define smp_read_barrier_depends()	((void)0)
-#endif
 
 #define xchg(ptr, with) \
   ((__typeof__ (*(ptr)))__xchg ((unsigned long)(with), (ptr), sizeof (*(ptr))))
diff -Nru a/include/asm-v850/teg.h b/include/asm-v850/teg.h
--- a/include/asm-v850/teg.h	Sat Apr 19 19:51:27 2003
+++ b/include/asm-v850/teg.h	Sat Apr 19 19:51:27 2003
@@ -1,8 +1,8 @@
 /*
- * include/asm-v850/nb85e_teg.h -- NB85E-TEG cpu chip
+ * include/asm-v850/teg.h -- NB85E-TEG cpu chip
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -11,33 +11,44 @@
  * Written by Miles Bader <miles@gnu.org>
  */
 
-#ifndef __V850_NB85E_TEG_H__
-#define __V850_NB85E_TEG_H__
+#ifndef __V850_TEG_H__
+#define __V850_TEG_H__
 
-/* The NB85E_TEG uses the NB85E cpu core.  */
+
+/* The TEG uses the NB85E cpu core.  */
 #include <asm/nb85e.h>
+#include <asm/nb85e_cache.h>
+
+
+#define CPU_MODEL	"v850e/nb85e-teg"
+#define CPU_MODEL_LONG	"NEC V850E/NB85E TEG"
 
-#define CHIP		"v850e/nb85e-teg"
-#define CHIP_LONG	"NEC V850E/NB85E TEG"
 
-/* Hardware-specific interrupt numbers (in the kernel IRQ namespace).  */
-#define IRQ_INTOV(n)	(n)	/* 0-3 */
-#define IRQ_INTOV_NUM	4
-#define IRQ_INTCMD(n)	(0x1c + (n)) /* interval timer interrupts 0-3 */
-#define IRQ_INTCMD_NUM	4
-#define IRQ_INTDMA(n)	(0x20 + (n)) /* DMA interrupts 0-3 */
-#define IRQ_INTDMA_NUM	4
-#define IRQ_INTCSI(n)	(0x24 + (n)) /* CSI 0-2 transmit/receive completion */
-#define IRQ_INTCSI_NUM	3
-#define IRQ_INTSER(n)	(0x25 + (n)) /* UART 0-2 reception error */
-#define IRQ_INTSER_NUM	3
-#define IRQ_INTSR(n)	(0x26 + (n)) /* UART 0-2 reception completion */
-#define IRQ_INTSR_NUM	3
-#define IRQ_INTST(n)	(0x27 + (n)) /* UART 0-2 transmission completion */
-#define IRQ_INTST_NUM	3
+/* For <asm/entry.h> */
+/* We use on-chip RAM, for a few miscellaneous variables that must be
+   accessible using a load instruction relative to R0.  On the NB85E/TEG,
+   There's 60KB of iRAM starting at 0xFFFF0000, however we need the base
+   address to be addressable by a 16-bit signed offset, so we only use the
+   second half of it starting from 0xFFFF8000.  */
+#define R0_RAM_ADDR			0xFFFF8000
+
+
+/* Hardware-specific interrupt numbers (in the kernel IRQ namespace).
+   Some of these are parameterized even though there's only a single
+   interrupt, for compatibility with some generic code that works on other
+   processor models.  */
+#define IRQ_INTCMD(n)	6	/* interval timer interrupt */
+#define IRQ_INTCMD_NUM	1
+#define IRQ_INTSER(n)	16	/* UART reception error */
+#define IRQ_INTSER_NUM	1
+#define IRQ_INTSR(n)	17	/* UART reception completion */
+#define IRQ_INTSR_NUM	1
+#define IRQ_INTST(n)	18	/* UART transmission completion */
+#define IRQ_INTST_NUM	1
 
 /* For <asm/irq.h> */
-#define NUM_MACH_IRQS	0x30
+#define NUM_CPU_IRQS	64
+
 
 /* TEG UART details.  */
 #define NB85E_UART_BASE_ADDR(n)		(0xFFFFF600 + 0x10 * (n))
@@ -50,9 +61,41 @@
 #define NB85E_UART_RXB_ADDR(n)		(NB85E_UART_BASE_ADDR(n) + 0xC)
 #define NB85E_UART_NUM_CHANNELS		1
 #define NB85E_UART_BASE_FREQ		CPU_CLOCK_FREQ
+/* This is a function that gets called before configuring the UART.  */
+#define NB85E_UART_PRE_CONFIGURE	teg_uart_pre_configure
+#ifndef __ASSEMBLY__
+extern void teg_uart_pre_configure (unsigned chan,
+				    unsigned cflags, unsigned baud);
+#endif
+
 
 /* The TEG RTPU.  */
 #define NB85E_RTPU_BASE_ADDR		0xFFFFF210
 
 
-#endif /* __V850_NB85E_TEG_H__ */
+/* TEG series timer D details.  */
+#define NB85E_TIMER_D_BASE_ADDR		0xFFFFF210
+#define NB85E_TIMER_D_TMCD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x0)
+#define NB85E_TIMER_D_TMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x4)
+#define NB85E_TIMER_D_CMD_BASE_ADDR 	(NB85E_TIMER_D_BASE_ADDR + 0x8)
+#define NB85E_TIMER_D_BASE_FREQ		CPU_CLOCK_FREQ
+
+
+/* `Interrupt Source Select' control register.  */
+#define TEG_ISS_ADDR			0xFFFFF7FA
+#define TEG_ISS				(*(volatile u8 *)TEG_ISS_ADDR)
+
+/* Port 0 I/O register (bits 0-3 used).  */
+#define TEG_PORT0_IO_ADDR		0xFFFFF7F2
+#define TEG_PORT0_IO			(*(volatile u8 *)TEG_PORT0_IO_ADDR)
+/* Port 0 control register (bits 0-3 control mode, 0 = output, 1 = input).  */
+#define TEG_PORT0_PM_ADDR		0xFFFFF7F4
+#define TEG_PORT0_PM			(*(volatile u8 *)TEG_PORT0_PM_ADDR)
+
+
+#ifndef __ASSEMBLY__
+extern void teg_init_irqs (void);
+#endif
+
+
+#endif /* __V850_TEG_H__ */
diff -Nru a/include/asm-v850/unistd.h b/include/asm-v850/unistd.h
--- a/include/asm-v850/unistd.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-v850/unistd.h	Sat Apr 19 19:51:50 2003
@@ -1,8 +1,8 @@
 /*
  * include/asm-v850/unistd.h -- System call numbers and invocation mechanism
  *
- *  Copyright (C) 2001,02  NEC Corporation
- *  Copyright (C) 2001,02  Miles Bader <miles@gnu.org>
+ *  Copyright (C) 2001,02,03  NEC Electronics Corporation
+ *  Copyright (C) 2001,02,03  Miles Bader <miles@gnu.org>
  *
  * 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
@@ -205,8 +205,6 @@
 #define __NR_pivot_root		200
 #define __NR_gettid		201
 #define __NR_tkill		202
-/* #define __NR_mincore		203 */
-/* #define __NR_madvise		204 */
 
 
 /* Syscall protocol:
diff -Nru a/include/asm-x86_64/bitops.h b/include/asm-x86_64/bitops.h
--- a/include/asm-x86_64/bitops.h	Sat Apr 19 19:51:46 2003
+++ b/include/asm-x86_64/bitops.h	Sat Apr 19 19:51:46 2003
@@ -487,8 +487,12 @@
 
 #define ext2_set_bit(nr,addr) \
 	__test_and_set_bit((nr),(unsigned long*)addr)
+#define ext2_set_bit_atomic(lock,nr,addr) \
+	        test_and_set_bit((nr),(unsigned long*)addr)
 #define ext2_clear_bit(nr, addr) \
 	__test_and_clear_bit((nr),(unsigned long*)addr)
+#define ext2_clear_bit_atomic(lock,nr,addr) \
+	        test_and_clear_bit((nr),(unsigned long*)addr)
 #define ext2_test_bit(nr, addr)      test_bit((nr),(unsigned long*)addr)
 #define ext2_find_first_zero_bit(addr, size) \
 	find_first_zero_bit((unsigned long*)addr, size)
diff -Nru a/include/asm-x86_64/byteorder.h b/include/asm-x86_64/byteorder.h
--- a/include/asm-x86_64/byteorder.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-x86_64/byteorder.h	Sat Apr 19 19:51:49 2003
@@ -17,7 +17,7 @@
 	return x;
 }
 
-/* Do not define swab16.  Gcc is smart enought to recognize "C" version and
+/* Do not define swab16.  Gcc is smart enough to recognize "C" version and
    convert it into rotation or exhange.  */
 
 #define __arch__swab32(x) ___arch__swab32(x)
diff -Nru a/include/asm-x86_64/cacheflush.h b/include/asm-x86_64/cacheflush.h
--- a/include/asm-x86_64/cacheflush.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-x86_64/cacheflush.h	Sat Apr 19 19:51:28 2003
@@ -9,7 +9,6 @@
 #define flush_cache_mm(mm)			do { } while (0)
 #define flush_cache_range(vma, start, end)	do { } while (0)
 #define flush_cache_page(vma, vmaddr)		do { } while (0)
-#define flush_page_to_ram(page)			do { } while (0)
 #define flush_dcache_page(page)			do { } while (0)
 #define flush_icache_range(start, end)		do { } while (0)
 #define flush_icache_page(vma,pg)		do { } while (0)
diff -Nru a/include/asm-x86_64/compat.h b/include/asm-x86_64/compat.h
--- a/include/asm-x86_64/compat.h	Sat Apr 19 19:51:49 2003
+++ b/include/asm-x86_64/compat.h	Sat Apr 19 19:51:49 2003
@@ -102,6 +102,9 @@
 	int		f_spare[6];
 };
 
+#define COMPAT_RLIM_OLD_INFINITY	0x7fffffff
+#define COMPAT_RLIM_INFINITY		0xffffffff
+
 typedef u32		compat_old_sigset_t;	/* at least 32 bits */
 
 #define _COMPAT_NSIG		64
diff -Nru a/include/asm-x86_64/fixmap.h b/include/asm-x86_64/fixmap.h
--- a/include/asm-x86_64/fixmap.h	Sat Apr 19 19:51:28 2003
+++ b/include/asm-x86_64/fixmap.h	Sat Apr 19 19:51:28 2003
@@ -66,7 +66,7 @@
 
 /*
  * 'index to address' translation. If anyone tries to use the idx
- * directly without tranlation, we catch the bug with a NULL-deference
+ * directly without translation, we catch the bug with a NULL-deference
  * kernel oops. Illegal ranges of incoming indices are caught too.
  */
 extern inline unsigned long fix_to_virt(const unsigned int idx)
diff -Nru a/include/asm-x86_64/mmzone.h b/include/asm-x86_64/mmzone.h
--- a/include/asm-x86_64/mmzone.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-x86_64/mmzone.h	Sat Apr 19 19:51:50 2003
@@ -1,6 +1,6 @@
 /* K8 NUMA support */
 /* Copyright 2002,2003 by Andi Kleen, SuSE Labs */
-/* 2.5 Version losely based on the NUMAQ Code by Pat Gaughen. */
+/* 2.5 Version loosely based on the NUMAQ Code by Pat Gaughen. */
 #ifndef _ASM_X86_64_MMZONE_H
 #define _ASM_X86_64_MMZONE_H 1
 
diff -Nru a/include/asm-x86_64/posix_types.h b/include/asm-x86_64/posix_types.h
--- a/include/asm-x86_64/posix_types.h	Sat Apr 19 19:51:51 2003
+++ b/include/asm-x86_64/posix_types.h	Sat Apr 19 19:51:51 2003
@@ -22,8 +22,8 @@
 typedef long		__kernel_time_t;
 typedef long		__kernel_suseconds_t;
 typedef long		__kernel_clock_t;
-typedef int            __kernel_timer_t;
-typedef int            __kernel_clockid_t;
+typedef int		__kernel_timer_t;
+typedef int		__kernel_clockid_t;
 typedef int		__kernel_daddr_t;
 typedef char *		__kernel_caddr_t;
 typedef unsigned short	__kernel_uid16_t;
@@ -41,6 +41,8 @@
 typedef __kernel_gid_t __kernel_old_gid_t;
 typedef __kernel_uid_t __kernel_uid32_t;
 typedef __kernel_gid_t __kernel_gid32_t;
+
+typedef unsigned long	__kernel_old_dev_t;
 
 #ifdef __KERNEL__
 
diff -Nru a/include/asm-x86_64/rwsem.h b/include/asm-x86_64/rwsem.h
--- a/include/asm-x86_64/rwsem.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-x86_64/rwsem.h	Sat Apr 19 19:51:50 2003
@@ -26,7 +26,7 @@
  * This should be totally fair - if anything is waiting, a process that wants a
  * lock will go to the back of the queue. When the currently active lock is
  * released, if there's a writer at the front of the queue, then that and only
- * that will be woken up; if there's a bunch of consequtive readers at the
+ * that will be woken up; if there's a bunch of consecutive readers at the
  * front, then they'll all be woken up, but no other readers will be.
  */
 
diff -Nru a/include/asm-x86_64/system.h b/include/asm-x86_64/system.h
--- a/include/asm-x86_64/system.h	Sat Apr 19 19:51:50 2003
+++ b/include/asm-x86_64/system.h	Sat Apr 19 19:51:50 2003
@@ -40,7 +40,7 @@
 /* It would be more efficient to let the compiler clobber most of these registers.
    Clobbering all is not possible because that lets reload freak out. Even just 
    clobbering six generates wrong code with gcc 3.1 for me so do it this way for now.
-   rbp needs to be always explicitely saved because gcc cannot clobber the
+   rbp needs to be always explicitly saved because gcc cannot clobber the
    frame pointer and the scheduler is compiled with frame pointers. -AK */
 #define SAVE_CONTEXT \
 	__PUSH(rsi) __PUSH(rdi) \
diff -Nru a/include/linux/agp_backend.h b/include/linux/agp_backend.h
--- a/include/linux/agp_backend.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/agp_backend.h	Sat Apr 19 19:51:50 2003
@@ -53,7 +53,7 @@
 	INTEL_I850,
 	INTEL_I860,
 	INTEL_460GX,
-	INTEL_I7505,
+	INTEL_E7505,
 	VIA_GENERIC,
 	SIS_GENERIC,
 	AMD_GENERIC,
diff -Nru a/include/linux/binfmts.h b/include/linux/binfmts.h
--- a/include/linux/binfmts.h	Sat Apr 19 19:51:48 2003
+++ b/include/linux/binfmts.h	Sat Apr 19 19:51:48 2003
@@ -56,7 +56,7 @@
 extern int search_binary_handler(struct linux_binprm *,struct pt_regs *);
 extern int flush_old_exec(struct linux_binprm * bprm);
 extern int setup_arg_pages(struct linux_binprm * bprm);
-extern int copy_strings(int argc,char ** argv,struct linux_binprm *bprm); 
+extern int copy_strings(int argc,char __user * __user * argv,struct linux_binprm *bprm); 
 extern int copy_strings_kernel(int argc,char ** argv,struct linux_binprm *bprm);
 extern void compute_creds(struct linux_binprm *binprm);
 extern int do_coredump(long signr, int exit_code, struct pt_regs * regs);
diff -Nru a/include/linux/blockgroup_lock.h b/include/linux/blockgroup_lock.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/linux/blockgroup_lock.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,58 @@
+/*
+ * Per-blockgroup locking for ext2 and ext3.
+ *
+ * Simple hashed spinlocking.
+ */
+
+#include <linux/config.h>
+#include <linux/spinlock.h>
+#include <linux/cache.h>
+
+#ifdef CONFIG_SMP
+
+/*
+ * We want a power-of-two.  Is there a better way than this?
+ */
+
+#if NR_CPUS >= 32
+#define NR_BG_LOCKS	128
+#elif NR_CPUS >= 16
+#define NR_BG_LOCKS	64
+#elif NR_CPUS >= 8
+#define NR_BG_LOCKS	32
+#elif NR_CPUS >= 4
+#define NR_BG_LOCKS	16
+#elif NR_CPUS >= 2
+#define NR_BG_LOCKS	8
+#else
+#define NR_BG_LOCKS	4
+#endif
+
+#else	/* CONFIG_SMP */
+#define NR_BG_LOCKS	1
+#endif	/* CONFIG_SMP */
+
+struct bgl_lock {
+	spinlock_t lock;
+} ____cacheline_aligned_in_smp;
+
+struct blockgroup_lock {
+	struct bgl_lock locks[NR_BG_LOCKS];
+};
+
+static inline void bgl_lock_init(struct blockgroup_lock *bgl)
+{
+	int i;
+
+	for (i = 0; i < NR_BG_LOCKS; i++)
+		spin_lock_init(&bgl->locks[i].lock);
+}
+
+/*
+ * The accessor is a macro so we can embed a blockgroup_lock into different
+ * superblock types
+ */
+#define sb_bgl_lock(sb, block_group) \
+	(&(sb)->s_blockgroup_lock.locks[(block_group) & (NR_BG_LOCKS-1)].lock)
+
+
diff -Nru a/include/linux/bootmem.h b/include/linux/bootmem.h
--- a/include/linux/bootmem.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/bootmem.h	Sat Apr 19 19:51:50 2003
@@ -32,6 +32,8 @@
 	void *node_bootmem_map;
 	unsigned long last_offset;
 	unsigned long last_pos;
+	unsigned long last_success;	/* Previous allocation point.  To speed
+					 * up searching */
 } bootmem_data_t;
 
 extern unsigned long __init bootmem_bootmap_pages (unsigned long);
diff -Nru a/include/linux/compat.h b/include/linux/compat.h
--- a/include/linux/compat.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/compat.h	Sat Apr 19 19:51:47 2003
@@ -47,5 +47,29 @@
 	compat_size_t	iov_len;
 };
 
+struct compat_rlimit {
+	compat_ulong_t	rlim_cur;
+	compat_ulong_t	rlim_max;
+};
+
+struct compat_rusage {
+	struct compat_timeval ru_utime;
+	struct compat_timeval ru_stime;
+	compat_long_t	ru_maxrss;
+	compat_long_t	ru_ixrss;
+	compat_long_t	ru_idrss;
+	compat_long_t	ru_isrss;
+	compat_long_t	ru_minflt;
+	compat_long_t	ru_majflt;
+	compat_long_t	ru_nswap;
+	compat_long_t	ru_inblock;
+	compat_long_t	ru_oublock;
+	compat_long_t	ru_msgsnd;
+	compat_long_t	ru_msgrcv;
+	compat_long_t	ru_nsignals;
+	compat_long_t	ru_nvcsw;
+	compat_long_t	ru_nivcsw;
+};
+
 #endif /* CONFIG_COMPAT */
 #endif /* _LINUX_COMPAT_H */
diff -Nru a/include/linux/compatmac.h b/include/linux/compatmac.h
--- a/include/linux/compatmac.h	Sat Apr 19 19:51:28 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,160 +0,0 @@
-  /* 
-   * This header tries to allow you to write 2.3-compatible drivers, 
-   * but (using this header) still allows you to run them on 2.2 and 
-   * 2.0 kernels. 
-   *
-   * Sometimes, a #define replaces a "construct" that older kernels
-   * had. For example, 
-   *
-   *       DECLARE_MUTEX(name);
-   *
-   * replaces the older 
-   *
-   *       struct semaphore name = MUTEX;
-   *
-   * This file then declares the DECLARE_MUTEX macro to compile into the 
-   * older version. 
-   * 
-   * In some cases, a macro or function changes the number of arguments.
-   * In that case, there is nothing we can do except define an access 
-   * macro that provides the same functionality on both versions of Linux. 
-   * 
-   * This is the case for example with the "get_user" macro 2.0 kernels use:
-   *
-   *          a = get_user (b);
-   *  
-   * while newer kernels use 
-   * 
-   *          get_user (a,b);
-   *
-   * This is unfortunate. We therefore define "Get_user (a,b)" which looks
-   * almost the same as the 2.2+ construct, and translates into the 
-   * appropriate sequence for earlier constructs. 
-   * 
-   * Supported by this file are the 2.0 kernels, 2.2 kernels, and the 
-   * most recent 2.3 kernel. 2.3 support will be dropped as soon when 2.4
-   * comes out. 2.0 support may someday be dropped. But then again, maybe 
-   * not. 
-   *
-   * I'll try to maintain this, provided that Linus agrees with the setup. 
-   * Feel free to mail updates or suggestions. 
-   *
-   * -- R.E.Wolff@BitWizard.nl
-   *
-   */
-
-#ifndef COMPATMAC_H
-#define COMPATMAC_H
-
-#include <linux/version.h>
-
-#if LINUX_VERSION_CODE < 0x020100    /* Less than 2.1.0 */
-#define TWO_ZERO
-#else
-#if LINUX_VERSION_CODE < 0x020200   /* less than 2.2.x */
-#warning "Please use a 2.2.x kernel. "
-#else
-#if LINUX_VERSION_CODE < 0x020300   /* less than 2.3.x */
-#define TWO_TWO
-#else
-#define TWO_THREE
-#endif
-#endif
-#endif
-
-#ifdef TWO_ZERO
-
-/* Here is the section that makes the 2.2 compatible driver source 
-   work for 2.0 too! We mostly try to adopt the "new thingies" from 2.2, 
-   and provide for compatibility stuff here if possible. */
-
-/* Some 200 days (on intel) */
-#define MAX_SCHEDULE_TIMEOUT     ((long)(~0UL>>1))
-
-#include <linux/bios32.h>
-
-#define Get_user(a,b)                a = get_user(b)
-#define Put_user(a,b)                0,put_user(a,b)
-#define copy_to_user(a,b,c)          memcpy_tofs(a,b,c)
-
-static inline int copy_from_user(void *to,const void *from, int c) 
-{
-  memcpy_fromfs(to, from, c);
-  return 0;
-}
-
-#define pci_present                  pcibios_present
-#define pci_read_config_word         pcibios_read_config_word
-#define pci_read_config_dword        pcibios_read_config_dword
-
-static inline unsigned char get_irq (unsigned char bus, unsigned char fn)
-{
-	unsigned char t; 
-	pcibios_read_config_byte (bus, fn, PCI_INTERRUPT_LINE, &t);
-	return t;
-}
-
-static inline void *ioremap(unsigned long base, long length)
-{
-	if (base < 0x100000) return (void *)base;
-	return vremap (base, length);
-}
-
-#define my_iounmap(x, b)             (((long)x<0x100000)?0:vfree ((void*)x))
-
-#define tty_flip_buffer_push(tty)    schedule_delayed_work(&tty->flip.work, 1)
-#define signal_pending(current)      (current->signal & ~current->blocked)
-#define schedule_timeout(to)         do {current->timeout = jiffies + (to);schedule ();} while (0)
-#define time_after(t1,t2)            (((long)t1-t2) > 0)
-
-
-#define test_and_set_bit(nr, addr)   set_bit(nr, addr)
-#define test_and_clear_bit(nr, addr) clear_bit(nr, addr)
-
-/* Not yet implemented on 2.0 */
-#define ASYNC_SPD_SHI  -1
-#define ASYNC_SPD_WARP -1
-
-
-/* Ugly hack: the driver_name doesn't exist in 2.0.x . So we define it
-   to the "name" field that does exist. As long as the assignments are
-   done in the right order, there is nothing to worry about. */
-#define driver_name           name 
-
-/* Should be in a header somewhere. They are in tty.h on 2.2 */
-#define TTY_HW_COOK_OUT       14 /* Flag to tell ntty what we can handle */
-#define TTY_HW_COOK_IN        15 /* in hardware - output and input       */
-
-/* The return type of a "close" routine. */
-#define INT                   void
-#define NO_ERROR              /* Nothing */
-
-#else
-
-/* The 2.2.x compatibility section. */
-#include <asm/uaccess.h>
-
-
-#define Get_user(a,b)         get_user(a,b)
-#define Put_user(a,b)         put_user(a,b)
-#define get_irq(pdev)         pdev->irq
-
-#define INT                   int
-#define NO_ERROR              0
-
-#define my_iounmap(x,b)       (iounmap((char *)(b)))
-
-#endif
-
-#ifndef TWO_THREE
-/* These are new in 2.3. The source now uses 2.3 syntax, and here is 
-   the compatibility define... */
-#define wait_queue_head_t     struct wait_queue *
-#define DECLARE_MUTEX(name)   struct semaphore name = MUTEX
-#define DECLARE_WAITQUEUE(wait, current) \
-                              struct wait_queue wait = { current, NULL }
-
-#endif
-
-
-#endif
diff -Nru a/include/linux/compiler.h b/include/linux/compiler.h
--- a/include/linux/compiler.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/compiler.h	Sat Apr 19 19:51:49 2003
@@ -1,6 +1,14 @@
 #ifndef __LINUX_COMPILER_H
 #define __LINUX_COMPILER_H
 
+#ifdef __CHECKER__
+  #define __user	__attribute__((noderef, address_space(1)))
+  #define __kernel	/* default address space */
+#else
+  #define __user
+  #define __kernel
+#endif
+
 #if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
 #define inline		__inline__ __attribute__((always_inline))
 #define __inline__	__inline__ __attribute__((always_inline))
diff -Nru a/include/linux/devfs_fs_kernel.h b/include/linux/devfs_fs_kernel.h
--- a/include/linux/devfs_fs_kernel.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/devfs_fs_kernel.h	Sat Apr 19 19:51:49 2003
@@ -12,9 +12,7 @@
 #define DEVFS_SUPER_MAGIC                0x1373
 
 #define DEVFS_FL_NONE           0x000 /* This helps to make code more readable
-				       */
-#define DEVFS_FL_WAIT           0x010 /* Wait for devfsd to finish           */
-#define DEVFS_FL_CURRENT_OWNER  0x020 /* Set initial ownership to current    */
+				         no, it doesn't  --hch */
 #define DEVFS_FL_DEFAULT        DEVFS_FL_NONE
 
 
@@ -33,13 +31,14 @@
 	__attribute__((format (printf, 1, 2)));
 extern void devfs_remove(const char *fmt, ...)
 	__attribute__((format (printf, 1, 2)));
-extern int devfs_generate_path (devfs_handle_t de, char *path, int buflen);
-extern int devfs_register_tape (devfs_handle_t de);
+extern int devfs_register_tape(const char *name);
 extern void devfs_unregister_tape(int num);
 extern void devfs_create_partitions(struct gendisk *dev);
 extern void devfs_create_cdrom(struct gendisk *dev);
 extern void devfs_remove_partitions(struct gendisk *dev);
-extern void mount_devfs_fs (void);
+extern void devfs_remove_cdrom(struct gendisk *dev);
+extern void devfs_register_partition(struct gendisk *dev, int part);
+extern void mount_devfs_fs(void);
 #else  /*  CONFIG_DEVFS_FS  */
 static inline devfs_handle_t devfs_register (devfs_handle_t dir,
 					     const char *name,
@@ -66,11 +65,6 @@
 static inline void devfs_remove(const char *fmt, ...)
 {
 }
-static inline int devfs_generate_path (devfs_handle_t de, char *path,
-				       int buflen)
-{
-    return -ENOSYS;
-}
 static inline int devfs_register_tape (devfs_handle_t de)
 {
     return -1;
@@ -85,6 +79,12 @@
 {
 }
 static inline void devfs_remove_partitions(struct gendisk *dev)
+{
+}
+static inline void devfs_remove_cdrom(struct gendisk *dev)
+{
+}
+static inline void devfs_register_partition(struct gendisk *dev, int part)
 {
 }
 static inline void mount_devfs_fs (void)
diff -Nru a/include/linux/dvb/audio.h b/include/linux/dvb/audio.h
--- a/include/linux/dvb/audio.h	Sat Apr 19 19:51:29 2003
+++ b/include/linux/dvb/audio.h	Sat Apr 19 19:51:29 2003
@@ -47,10 +47,17 @@
 typedef enum {
         AUDIO_STEREO,
         AUDIO_MONO_LEFT, 
-	AUDIO_MONO_RIGHT, 
+	AUDIO_MONO_RIGHT 
 } audio_channel_select_t;
 
 
+typedef struct audio_mixer { 
+        unsigned int volume_left;
+        unsigned int volume_right;
+  // what else do we need? bass, pass-through, ...
+} audio_mixer_t;
+
+
 typedef struct audio_status { 
         int                    AV_sync_state;  /* sync audio and video? */
         int                    mute_state;     /* audio is muted */ 
@@ -58,14 +65,8 @@
         audio_stream_source_t  stream_source;  /* current stream source */
         audio_channel_select_t channel_select; /* currently selected channel */
         int                    bypass_mode;    /* pass on audio data to */
+	audio_mixer_t	       mixer_state;    /* current mixer state */
 } audio_status_t;                              /* separate decoder hardware */
-
-
-typedef struct audio_mixer { 
-        unsigned int volume_left;
-        unsigned int volume_right;
-  // what else do we need? bass, pass-through, ...
-} audio_mixer_t;
 
 
 typedef
diff -Nru a/include/linux/dvb/ca.h b/include/linux/dvb/ca.h
--- a/include/linux/dvb/ca.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/dvb/ca.h	Sat Apr 19 19:51:50 2003
@@ -21,8 +21,8 @@
  *
  */
 
-#ifndef _CA_H_
-#define _CA_H_
+#ifndef _DVBCA_H_
+#define _DVBCA_H_
 
 /* slot interface types and info */
 
@@ -33,6 +33,7 @@
 #define CA_CI            1     /* CI high level interface */
 #define CA_CI_LINK       2     /* CI link layer level interface */
 #define CA_CI_PHYS       4     /* CI physical layer level interface */
+#define CA_DESCR         8     /* built-in descrambler */
 #define CA_SC          128     /* simple smart card interface */
 
         unsigned int flags;
@@ -44,7 +45,7 @@
 /* descrambler types and info */
 
 typedef struct ca_descr_info {
-        unsigned int num;          /* number of available descramblers (keys) */ 
+        unsigned int num;          /* number of available descramblers (keys) */
         unsigned int type;         /* type of supported scrambling system */
 #define CA_ECD           1
 #define CA_NDS           2
@@ -59,19 +60,24 @@
 } ca_caps_t;
 
 /* a message to/from a CI-CAM */
-typedef struct ca_msg {   
-        unsigned int index;         
+typedef struct ca_msg {
+        unsigned int index;
         unsigned int type;
         unsigned int length;
         unsigned char msg[256];
 } ca_msg_t;
 
 typedef struct ca_descr {
-        unsigned int index;    
-        unsigned int parity;
+        unsigned int index;
+        unsigned int parity;	/* 0 == even, 1 == odd */
         unsigned char cw[8];
 } ca_descr_t;
 
+typedef struct ca_pid {
+        unsigned int pid;
+        int index;		/* -1 == disable*/
+} ca_pid_t;
+
 #define CA_RESET          _IO('o', 128)
 #define CA_GET_CAP        _IOR('o', 129, ca_caps_t)
 #define CA_GET_SLOT_INFO  _IOR('o', 130, ca_slot_info_t)
@@ -79,6 +85,7 @@
 #define CA_GET_MSG        _IOR('o', 132, ca_msg_t)
 #define CA_SEND_MSG       _IOW('o', 133, ca_msg_t)
 #define CA_SET_DESCR      _IOW('o', 134, ca_descr_t)
+#define CA_SET_PID        _IOW('o', 135, ca_pid_t)
 
 #endif
 
diff -Nru a/include/linux/dvb/dmx.h b/include/linux/dvb/dmx.h
--- a/include/linux/dvb/dmx.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/dvb/dmx.h	Sat Apr 19 19:51:50 2003
@@ -21,13 +21,14 @@
  *
  */
 
-#ifndef _DMX_H_
-#define _DMX_H_
+#ifndef _DVBDMX_H_
+#define _DVBDMX_H_
 
 #ifdef __KERNEL__
 #include <linux/types.h>
 #else
 #include <stdint.h>
+#include <time.h>
 #endif
 
 #define DMX_FILTER_SIZE 16
@@ -154,9 +155,15 @@
 	DMX_SOURCE_DVR0   = 16,
 	DMX_SOURCE_DVR1,
 	DMX_SOURCE_DVR2,
-	DMX_SOURCE_DVR3,
+	DMX_SOURCE_DVR3
 } dmx_source_t;
 
+struct dmx_stc {
+	unsigned int num;	/* input : which STC? 0..N */
+	unsigned int base;	/* output: divisor for stc to get 90 kHz clock */
+	uint64_t stc;		/* output: stc in 'base'*90 kHz units */
+};
+
 
 #define DMX_START                _IO('o',41) 
 #define DMX_STOP                 _IO('o',42)
@@ -164,9 +171,10 @@
 #define DMX_SET_PES_FILTER       _IOW('o',44,struct dmx_pes_filter_params)
 #define DMX_SET_BUFFER_SIZE      _IO('o',45)
 #define DMX_GET_EVENT            _IOR('o',46,struct dmx_event)
-#define DMX_GET_PES_PIDS         _IOR('o',47,uint16_t)
+#define DMX_GET_PES_PIDS         _IOR('o',47,uint16_t[5])
 #define DMX_GET_CAPS             _IOR('o',48,dmx_caps_t)
 #define DMX_SET_SOURCE           _IOW('o',49,dmx_source_t)
+#define DMX_GET_STC              _IOWR('o',50,struct dmx_stc)
 
-#endif /*_DMX_H_*/
+#endif /*_DVBDMX_H_*/
 
diff -Nru a/include/linux/dvb/frontend.h b/include/linux/dvb/frontend.h
--- a/include/linux/dvb/frontend.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/dvb/frontend.h	Sat Apr 19 19:51:47 2003
@@ -23,8 +23,8 @@
  *
  */
 
-#ifndef _FRONTEND_H_
-#define _FRONTEND_H_
+#ifndef _DVBFRONTEND_H_
+#define _DVBFRONTEND_H_
 
 #ifdef __KERNEL__
 #include <linux/types.h>
@@ -33,14 +33,14 @@
 #endif
 
 
-typedef enum {
+typedef enum fe_type {
         FE_QPSK,
         FE_QAM,
         FE_OFDM
 } fe_type_t;
 
 
-typedef enum {
+typedef enum fe_caps {
 	FE_IS_STUPID                  = 0,
 	FE_CAN_INVERSION_AUTO         = 0x1,
 	FE_CAN_FEC_1_2                = 0x2,
@@ -63,6 +63,8 @@
 	FE_CAN_BANDWIDTH_AUTO         = 0x40000,
 	FE_CAN_GUARD_INTERVAL_AUTO    = 0x80000,
 	FE_CAN_HIERARCHY_AUTO         = 0x100000,
+	FE_CAN_RECOVER                = 0x20000000,
+	FE_CAN_CLEAN_SETUP            = 0x40000000,
 	FE_CAN_MUTE_TS                = 0x80000000
 } fe_caps_t;
 
@@ -99,25 +101,25 @@
 };                              /*  errorcode when no message was received  */
 
 
-typedef enum {
+typedef enum fe_sec_voltage {
         SEC_VOLTAGE_13,
         SEC_VOLTAGE_18
 } fe_sec_voltage_t;
 
 
-typedef enum {
+typedef enum fe_sec_tone_mode {
         SEC_TONE_ON,
         SEC_TONE_OFF
 } fe_sec_tone_mode_t;
 
 
-typedef enum {
+typedef enum fe_sec_mini_cmd {
         SEC_MINI_A,
         SEC_MINI_B
 } fe_sec_mini_cmd_t;
 
 
-typedef enum {
+typedef enum fe_status {
 	FE_HAS_SIGNAL     = 0x01,   /*  found something above the noise level */
 	FE_HAS_CARRIER    = 0x02,   /*  found a DVB signal  */
 	FE_HAS_VITERBI    = 0x04,   /*  FEC is stable  */
@@ -125,17 +127,17 @@
 	FE_HAS_LOCK       = 0x10,   /*  everything's working... */
 	FE_TIMEDOUT       = 0x20,   /*  no lock within the last ~2 seconds */
 	FE_REINIT         = 0x40    /*  frontend was reinitialized,  */
-} fe_status_t;                      /*  application is recommned to reset */
+} fe_status_t;                      /*  application is recommended to reset */
                                     /*  DiSEqC, tone and parameters */
 
-typedef enum {
+typedef enum fe_spectral_inversion {
         INVERSION_OFF,
         INVERSION_ON,
         INVERSION_AUTO
 } fe_spectral_inversion_t;
 
 
-typedef enum {
+typedef enum fe_code_rate {
         FEC_NONE = 0,
         FEC_1_2,
         FEC_2_3,
@@ -149,7 +151,7 @@
 } fe_code_rate_t;
 
 
-typedef enum {
+typedef enum fe_modulation {
         QPSK,
         QAM_16,
         QAM_32,
@@ -160,13 +162,13 @@
 } fe_modulation_t;
 
 
-typedef enum {
+typedef enum fe_transmit_mode {
 	TRANSMISSION_MODE_2K,
 	TRANSMISSION_MODE_8K,
 	TRANSMISSION_MODE_AUTO
 } fe_transmit_mode_t;
 
-typedef enum {
+typedef enum fe_bandwidth {
 	BANDWIDTH_8_MHZ,
 	BANDWIDTH_7_MHZ,
 	BANDWIDTH_6_MHZ,
@@ -174,7 +176,7 @@
 } fe_bandwidth_t;
 
 
-typedef enum {
+typedef enum fe_guard_interval {
 	GUARD_INTERVAL_1_32,
 	GUARD_INTERVAL_1_16,
 	GUARD_INTERVAL_1_8,
@@ -183,7 +185,7 @@
 } fe_guard_interval_t;
 
 
-typedef enum {
+typedef enum fe_hierarchy {
 	HIERARCHY_NONE,
 	HIERARCHY_1,
 	HIERARCHY_2,
@@ -257,5 +259,5 @@
 #define FE_GET_EVENT               _IOR('o', 78, struct dvb_frontend_event)
 
 
-#endif /*_FRONTEND_H_*/
+#endif /*_DVBFRONTEND_H_*/
 
diff -Nru a/include/linux/dvb/net.h b/include/linux/dvb/net.h
--- a/include/linux/dvb/net.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/dvb/net.h	Sat Apr 19 19:51:28 2003
@@ -39,6 +39,7 @@
 
 #define NET_ADD_IF                 _IOWR('o', 52, struct dvb_net_if)
 #define NET_REMOVE_IF              _IO('o', 53)
+#define NET_GET_IF                 _IOWR('o', 54, struct dvb_net_if)
 
 #endif /*_DVBNET_H_*/
 
diff -Nru a/include/linux/dvb/osd.h b/include/linux/dvb/osd.h
--- a/include/linux/dvb/osd.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/dvb/osd.h	Sat Apr 19 19:51:49 2003
@@ -25,83 +25,83 @@
 #define _DVBOSD_H_
 
 typedef enum {
-	// All functions return -2 on "not open"
+  // All functions return -2 on "not open"
   OSD_Close=1,    // ()
-	// Disables OSD and releases the buffers
-	// returns 0 on success
-	OSD_Open,		// (x0,y0,x1,y1,BitPerPixel[2/4/8](color&0x0F),mix[0..15](color&0xF0))
-	// Opens OSD with this size and bit depth
-	// returns 0 on success, -1 on DRAM allocation error, -2 on "already open"
-	OSD_Show,		// ()
-	// enables OSD mode
-	// returns 0 on success
-	OSD_Hide,		// ()
-	// disables OSD mode
-	// returns 0 on success
-	OSD_Clear,		// ()
-	// Sets all pixel to color 0
-	// returns 0 on success
-	OSD_Fill,		// (color)
-	// Sets all pixel to color <col>
-	// returns 0 on success
-	OSD_SetColor,		// (color,R{x0},G{y0},B{x1},opacity{y1})
-	// set palette entry <num> to <r,g,b>, <mix> and <trans> apply
-	// R,G,B: 0..255
-	// R=Red, G=Green, B=Blue
-	// opacity=0:      pixel opacity 0% (only video pixel shows)
-	// opacity=1..254: pixel opacity as specified in header
-	// opacity=255:    pixel opacity 100% (only OSD pixel shows)
-	// returns 0 on success, -1 on error
-	OSD_SetPalette,		// (firstcolor{color},lastcolor{x0},data)
-	// Set a number of entries in the palette
-	// sets the entries "firstcolor" through "lastcolor" from the array "data"
-	// data has 4 byte for each color:
-	// R,G,B, and a opacity value: 0->transparent, 1..254->mix, 255->pixel
-	OSD_SetTrans,		// (transparency{color})
-	// Sets transparency of mixed pixel (0..15)
-	// returns 0 on success
-	OSD_SetPixel,		// (x0,y0,color)
-	// sets pixel <x>,<y> to color number <col>
-	// returns 0 on success, -1 on error
-	OSD_GetPixel,		// (x0,y0)
-	// returns color number of pixel <x>,<y>,  or -1
-	OSD_SetRow,		// (x0,y0,x1,data)
-	// fills pixels x0,y through  x1,y with the content of data[]
-	// returns 0 on success, -1 on clipping all pixel (no pixel drawn)
-	OSD_SetBlock,		// (x0,y0,x1,y1,increment{color},data)
-	// fills pixels x0,y0 through  x1,y1 with the content of data[]
-	// inc contains the width of one line in the data block,
-	// inc<=0 uses blockwidth as linewidth
-	// returns 0 on success, -1 on clipping all pixel
-	OSD_FillRow,		// (x0,y0,x1,color)
-	// fills pixels x0,y through  x1,y with the color <col>
-	// returns 0 on success, -1 on clipping all pixel
-	OSD_FillBlock,		// (x0,y0,x1,y1,color)
-	// fills pixels x0,y0 through  x1,y1 with the color <col>
-	// returns 0 on success, -1 on clipping all pixel
-	OSD_Line,		// (x0,y0,x1,y1,color)
-	// draw a line from x0,y0 to x1,y1 with the color <col>
-	// returns 0 on success
-	OSD_Query,		// (x0,y0,x1,y1,xasp{color}}), yasp=11
-	// fills parameters with the picture dimensions and the pixel aspect ratio
-	// returns 0 on success
-	OSD_Test,		// ()
-	// draws a test picture. for debugging purposes only
-	// returns 0 on success
+  // Disables OSD and releases the buffers
+  // returns 0 on success
+  OSD_Open,       // (x0,y0,x1,y1,BitPerPixel[2/4/8](color&0x0F),mix[0..15](color&0xF0))
+  // Opens OSD with this size and bit depth
+  // returns 0 on success, -1 on DRAM allocation error, -2 on "already open"
+  OSD_Show,       // ()
+  // enables OSD mode
+  // returns 0 on success
+  OSD_Hide,       // ()
+  // disables OSD mode
+  // returns 0 on success
+  OSD_Clear,      // ()
+  // Sets all pixel to color 0
+  // returns 0 on success
+  OSD_Fill,       // (color)
+  // Sets all pixel to color <col>
+  // returns 0 on success
+  OSD_SetColor,   // (color,R{x0},G{y0},B{x1},opacity{y1})
+  // set palette entry <num> to <r,g,b>, <mix> and <trans> apply
+  // R,G,B: 0..255
+  // R=Red, G=Green, B=Blue
+  // opacity=0:      pixel opacity 0% (only video pixel shows)
+  // opacity=1..254: pixel opacity as specified in header
+  // opacity=255:    pixel opacity 100% (only OSD pixel shows)
+  // returns 0 on success, -1 on error
+  OSD_SetPalette, // (firstcolor{color},lastcolor{x0},data)
+  // Set a number of entries in the palette
+  // sets the entries "firstcolor" through "lastcolor" from the array "data"
+  // data has 4 byte for each color:
+  // R,G,B, and a opacity value: 0->transparent, 1..254->mix, 255->pixel
+  OSD_SetTrans,   // (transparency{color})
+  // Sets transparency of mixed pixel (0..15)
+  // returns 0 on success
+  OSD_SetPixel,   // (x0,y0,color)
+  // sets pixel <x>,<y> to color number <col>
+  // returns 0 on success, -1 on error
+  OSD_GetPixel,   // (x0,y0)
+  // returns color number of pixel <x>,<y>,  or -1
+  OSD_SetRow,     // (x0,y0,x1,data)
+  // fills pixels x0,y through  x1,y with the content of data[]
+  // returns 0 on success, -1 on clipping all pixel (no pixel drawn)
+  OSD_SetBlock,   // (x0,y0,x1,y1,increment{color},data)
+  // fills pixels x0,y0 through  x1,y1 with the content of data[]
+  // inc contains the width of one line in the data block,
+  // inc<=0 uses blockwidth as linewidth
+  // returns 0 on success, -1 on clipping all pixel
+  OSD_FillRow,    // (x0,y0,x1,color)
+  // fills pixels x0,y through  x1,y with the color <col>
+  // returns 0 on success, -1 on clipping all pixel
+  OSD_FillBlock,  // (x0,y0,x1,y1,color)
+  // fills pixels x0,y0 through  x1,y1 with the color <col>
+  // returns 0 on success, -1 on clipping all pixel
+  OSD_Line,       // (x0,y0,x1,y1,color)
+  // draw a line from x0,y0 to x1,y1 with the color <col>
+  // returns 0 on success
+  OSD_Query,      // (x0,y0,x1,y1,xasp{color}}), yasp=11
+  // fills parameters with the picture dimensions and the pixel aspect ratio
+  // returns 0 on success
+  OSD_Test,       // ()
+  // draws a test picture. for debugging purposes only
+  // returns 0 on success
 // TODO: remove "test" in final version
-	OSD_Text,		// (x0,y0,size,color,text)
-	OSD_SetWindow,		//  (x0) set window with number 0<x0<8 as current
-	OSD_MoveWindow,		//  move current window to (x0, y0)  
+  OSD_Text,       // (x0,y0,size,color,text)
+  OSD_SetWindow, //  (x0) set window with number 0<x0<8 as current
+  OSD_MoveWindow, //  move current window to (x0, y0)  
 } OSD_Command;
 
 typedef struct osd_cmd_s {
-	OSD_Command cmd;
-	int x0;
-	int y0;
-	int x1;
-	int y1;
-	int color;
-	void *data;
+        OSD_Command cmd;
+        int x0;
+        int y0;
+        int x1;
+        int y1;
+        int color;
+        void *data;
 } osd_cmd_t;
 
 
diff -Nru a/include/linux/dvb/video.h b/include/linux/dvb/video.h
--- a/include/linux/dvb/video.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/dvb/video.h	Sat Apr 19 19:51:28 2003
@@ -28,6 +28,7 @@
 #include <linux/types.h>
 #else
 #include <stdint.h>
+#include <time.h>
 #endif
 
 
diff -Nru a/include/linux/ext2_fs_sb.h b/include/linux/ext2_fs_sb.h
--- a/include/linux/ext2_fs_sb.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/ext2_fs_sb.h	Sat Apr 19 19:51:50 2003
@@ -16,6 +16,9 @@
 #ifndef _LINUX_EXT2_FS_SB
 #define _LINUX_EXT2_FS_SB
 
+#include <linux/blockgroup_lock.h>
+#include <linux/percpu_counter.h>
+
 /*
  * second extended-fs super-block data in memory
  */
@@ -45,6 +48,10 @@
 	u32 s_next_generation;
 	unsigned long s_dir_count;
 	u8 *s_debts;
+	struct percpu_counter s_freeblocks_counter;
+	struct percpu_counter s_freeinodes_counter;
+	struct percpu_counter s_dirs_counter;
+	struct blockgroup_lock s_blockgroup_lock;
 };
 
 #endif	/* _LINUX_EXT2_FS_SB */
diff -Nru a/include/linux/fb.h b/include/linux/fb.h
--- a/include/linux/fb.h	Sat Apr 19 19:51:30 2003
+++ b/include/linux/fb.h	Sat Apr 19 19:51:30 2003
@@ -2,6 +2,7 @@
 #define _LINUX_FB_H
 
 #include <linux/tty.h>
+#include <linux/workqueue.h>
 #include <asm/types.h>
 #include <asm/io.h>
 
@@ -310,7 +311,6 @@
 #define FB_CUR_SETCMAP  0x08
 #define FB_CUR_SETSHAPE 0x10
 #define FB_CUR_SETSIZE	0x20
-#define FB_CUR_SETDEST	0x40
 #define FB_CUR_SETALL   0xFF
 
 struct fbcurpos {
@@ -322,7 +322,6 @@
 	__u16 enable;		/* cursor on/off */
 	__u16 rop;		/* bitop operation */
 	char *mask;		/* cursor mask bits */
-	char *dest;		/* destination */
 	struct fbcurpos hot;	/* cursor hot spot */
 	struct fb_image	image;	/* Cursor image */
 };
@@ -339,9 +338,9 @@
 	__u32 buf_align;                  /* byte alignment of each bitmap */
 	__u32 scan_align;                 /* alignment per scanline        */
 	__u32 flags;                      /* see FB_PIXMAP_*               */
-	void (*outbuf)(u8 dst, u8 *addr); /* access methods                */
+					  /* access methods                */
+	void (*outbuf)(u8 *dst, u8 *addr, unsigned int size); 
 	u8   (*inbuf) (u8 *addr);
-	unsigned long lock_flags;         /* flags for locking             */
 	spinlock_t lock;                  /* spinlock                      */
 	atomic_t count;
 };
@@ -406,8 +405,9 @@
    struct fb_fix_screeninfo fix;        /* Current fix */
    struct fb_monspecs monspecs;         /* Current Monitor specs */
    struct fb_cursor cursor;		/* Current cursor */	
-   struct fb_cmap cmap;                 /* Current cmap */
+   struct work_struct queue;		/* Framebuffer event queue */
    struct fb_pixmap pixmap;	        /* Current pixmap */
+   struct fb_cmap cmap;                 /* Current cmap */
    struct fb_ops *fbops;
    char *screen_base;                   /* Virtual address */
    struct vc_data *display_fg;		/* Console visible on this display */
@@ -469,9 +469,9 @@
      *  `Generic' versions of the frame buffer device operations
      */
 
-extern int fb_set_var(struct fb_var_screeninfo *var, struct fb_info *info); 
-extern int fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info); 
-extern int fb_blank(int blank, struct fb_info *info);
+extern int fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var); 
+extern int fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var); 
+extern int fb_blank(struct fb_info *info, int blank);
 extern int soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
 extern void cfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect); 
 extern void cfb_copyarea(struct fb_info *info, const struct fb_copyarea *area); 
@@ -505,12 +505,21 @@
 		       struct fb_info *info);
 extern int fb_validate_mode(struct fb_var_screeninfo *var,
 			    struct fb_info *info);
+extern int parse_edid(unsigned char *edid, struct fb_var_screeninfo *var);
+extern int fb_get_monitor_limits(unsigned char *edid, struct fb_monspecs *specs);
+extern struct fb_videomode *fb_create_modedb(unsigned char *edid, int *dbsize);
+extern void fb_destroy_modedb(struct fb_videomode *modedb);
+extern void show_edid(unsigned char *edid);
+
+/* drivers/video/modedb.c */
+#define VESA_MODEDB_SIZE 34
+extern const struct fb_videomode vesa_modes[];
 
 /* drivers/video/fbcmap.c */
 extern int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp);
 extern void fb_dealloc_cmap(struct fb_cmap *cmap);
-extern void fb_copy_cmap(struct fb_cmap *from, struct fb_cmap *to,
-			 int fsfromto);
+extern int fb_copy_cmap(struct fb_cmap *from, struct fb_cmap *to,
+			int fsfromto);
 extern int fb_set_cmap(struct fb_cmap *cmap, int kspc, struct fb_info *fb_info);
 extern struct fb_cmap *fb_default_cmap(int len);
 extern void fb_invert_cmaps(void);
diff -Nru a/include/linux/fdreg.h b/include/linux/fdreg.h
--- a/include/linux/fdreg.h	Sat Apr 19 19:51:51 2003
+++ b/include/linux/fdreg.h	Sat Apr 19 19:51:51 2003
@@ -7,8 +7,12 @@
  */
 
 #ifdef FDPATCHES
-
 #define FD_IOPORT fdc_state[fdc].address
+#else
+/* It would be a lot saner just to force fdc_state[fdc].address to always
+   be set ! FIXME */
+#define FD_IOPORT 0x3f0
+#endif
 
 /* Fd controller regs. S&C, about page 340 */
 #define FD_STATUS	(4 + FD_IOPORT )
@@ -22,16 +26,6 @@
 
 /* Diskette Control Register (write)*/
 #define FD_DCR		(7 + FD_IOPORT )
-
-#else
-
-#define FD_STATUS	0x3f4
-#define FD_DATA		0x3f5
-#define FD_DOR		0x3f2		/* Digital Output Register */
-#define FD_DIR		0x3f7		/* Digital Input Register (read) */
-#define FD_DCR		0x3f7		/* Diskette Control Register (write)*/
-
-#endif
 
 /* Bits of main status register */
 #define STATUS_BUSYMASK	0x0F		/* drive busy mask */
diff -Nru a/include/linux/file.h b/include/linux/file.h
--- a/include/linux/file.h	Sat Apr 19 19:51:27 2003
+++ b/include/linux/file.h	Sat Apr 19 19:51:27 2003
@@ -21,7 +21,7 @@
  */
 struct files_struct {
         atomic_t count;
-        rwlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */
+        spinlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */
         int max_fds;
         int max_fdset;
         int next_fd;
diff -Nru a/include/linux/fs.h b/include/linux/fs.h
--- a/include/linux/fs.h	Sat Apr 19 19:51:29 2003
+++ b/include/linux/fs.h	Sat Apr 19 19:51:29 2003
@@ -313,7 +313,7 @@
 struct address_space {
 	struct inode		*host;		/* owner: inode, block_device */
 	struct radix_tree_root	page_tree;	/* radix tree of all pages */
-	rwlock_t		page_lock;	/* and rwlock protecting it */
+	spinlock_t		page_lock;	/* and rwlock protecting it */
 	struct list_head	clean_pages;	/* list of clean pages */
 	struct list_head	dirty_pages;	/* list of dirty pages */
 	struct list_head	locked_pages;	/* list of locked pages */
@@ -321,8 +321,8 @@
 	unsigned long		nrpages;	/* number of total pages */
 	struct address_space_operations *a_ops;	/* methods */
 	struct list_head	i_mmap;		/* list of private mappings */
-	struct list_head	i_mmap_shared;	/* list of private mappings */
-	struct semaphore	i_shared_sem;	/* and sem protecting it */
+	struct list_head	i_mmap_shared;	/* list of shared mappings */
+	struct semaphore	i_shared_sem;	/* protect both above lists */
 	unsigned long		dirtied_when;	/* jiffies of first page dirtying */
 	int			gfp_mask;	/* how to allocate the pages */
 	struct backing_dev_info *backing_dev_info; /* device readahead, etc */
@@ -705,10 +705,10 @@
 struct file_operations {
 	struct module *owner;
 	loff_t (*llseek) (struct file *, loff_t, int);
-	ssize_t (*read) (struct file *, char *, size_t, loff_t *);
-	ssize_t (*aio_read) (struct kiocb *, char *, size_t, loff_t);
-	ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
-	ssize_t (*aio_write) (struct kiocb *, const char *, size_t, loff_t);
+	ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
+	ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
+	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
+	ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
 	int (*readdir) (struct file *, void *, filldir_t);
 	unsigned int (*poll) (struct file *, struct poll_table_struct *);
 	int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
@@ -738,7 +738,7 @@
 	int (*mknod) (struct inode *,struct dentry *,int,dev_t);
 	int (*rename) (struct inode *, struct dentry *,
 			struct inode *, struct dentry *);
-	int (*readlink) (struct dentry *, char *,int);
+	int (*readlink) (struct dentry *, char __user *,int);
 	int (*follow_link) (struct dentry *, struct nameidata *);
 	void (*truncate) (struct inode *);
 	int (*permission) (struct inode *, int);
@@ -752,11 +752,11 @@
 
 struct seq_file;
 
-extern ssize_t vfs_read(struct file *, char *, size_t, loff_t *);
-extern ssize_t vfs_write(struct file *, const char *, size_t, loff_t *);
-extern ssize_t vfs_readv(struct file *, const struct iovec *,
+extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
+extern ssize_t vfs_write(struct file *, const char __user *, size_t, loff_t *);
+extern ssize_t vfs_readv(struct file *, const struct iovec __user *,
 		unsigned long, loff_t *);
-extern ssize_t vfs_writev(struct file *, const struct iovec *,
+extern ssize_t vfs_writev(struct file *, const struct iovec __user *,
 		unsigned long, loff_t *);
 
 /*
@@ -1024,7 +1024,7 @@
 extern struct file *filp_open(const char *, int, int);
 extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
 extern int filp_close(struct file *, fl_owner_t id);
-extern char * getname(const char *);
+extern char * getname(const char __user *);
 
 /* fs/dcache.c */
 extern void vfs_caches_init(unsigned long);
@@ -1202,16 +1202,16 @@
 extern int generic_file_readonly_mmap(struct file *, struct vm_area_struct *);
 extern int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
 extern int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size);
-extern ssize_t generic_file_read(struct file *, char *, size_t, loff_t *);
+extern ssize_t generic_file_read(struct file *, char __user *, size_t, loff_t *);
 int generic_write_checks(struct inode *inode, struct file *file,
 			loff_t *pos, size_t *count, int isblk);
-extern ssize_t generic_file_write(struct file *, const char *, size_t, loff_t *);
+extern ssize_t generic_file_write(struct file *, const char __user *, size_t, loff_t *);
 extern ssize_t generic_file_aio_read(struct kiocb *, char *, size_t, loff_t);
 extern ssize_t generic_file_aio_write(struct kiocb *, const char *, size_t, loff_t);
 extern ssize_t generic_file_aio_write_nolock(struct kiocb *, const struct iovec *,
 				unsigned long, loff_t *);
-extern ssize_t do_sync_read(struct file *filp, char *buf, size_t len, loff_t *ppos);
-extern ssize_t do_sync_write(struct file *filp, const char *buf, size_t len, loff_t *ppos);
+extern ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos);
+extern ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos);
 ssize_t generic_file_write_nolock(struct file *file, const struct iovec *iov,
 				unsigned long nr_segs, loff_t *ppos);
 extern ssize_t generic_file_sendfile(struct file *, loff_t *, size_t, read_actor_t, void *);
@@ -1247,9 +1247,9 @@
 
 extern struct file_operations generic_ro_fops;
 
-extern int vfs_readlink(struct dentry *, char *, int, const char *);
+extern int vfs_readlink(struct dentry *, char __user *, int, const char *);
 extern int vfs_follow_link(struct nameidata *, const char *);
-extern int page_readlink(struct dentry *, char *, int);
+extern int page_readlink(struct dentry *, char __user *, int);
 extern int page_follow_link(struct dentry *, struct nameidata *);
 extern int page_symlink(struct inode *inode, const char *symname, int len);
 extern struct inode_operations page_symlink_inode_operations;
diff -Nru a/include/linux/genhd.h b/include/linux/genhd.h
--- a/include/linux/genhd.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/genhd.h	Sat Apr 19 19:51:28 2003
@@ -55,12 +55,13 @@
 } __attribute__((packed));
 
 #ifdef __KERNEL__
-#  include <linux/devfs_fs_kernel.h>
-
+#include <linux/devfs_fs_kernel.h>	/* we don't need any devfs crap
+					   here, but some of the implicitly
+					   included headers.   will clean
+					   this mess up later.	--hch */
 struct hd_struct {
 	sector_t start_sect;
 	sector_t nr_sects;
-	devfs_handle_t de;              /* primary (master) devfs entry  */
 	struct kobject kobj;
 	unsigned reads, read_sectors, writes, write_sectors;
 	int policy;
@@ -68,7 +69,6 @@
 
 #define GENHD_FL_REMOVABLE  1
 #define GENHD_FL_DRIVERFS  2
-#define GENHD_FL_DEVFS	4
 #define GENHD_FL_CD	8
 #define GENHD_FL_UP	16
 
@@ -96,9 +96,8 @@
 	sector_t capacity;
 
 	int flags;
-	int number;			/* devfs crap */
-	devfs_handle_t de;		/* more of the same */
-	devfs_handle_t disk_de;		/* piled higher and deeper */
+	char devfs_name[64];		/* devfs crap */
+	int number;			/* more of the same */
 	struct device *driverfs_dev;
 	struct kobject kobj;
 
diff -Nru a/include/linux/hdreg.h b/include/linux/hdreg.h
--- a/include/linux/hdreg.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/hdreg.h	Sat Apr 19 19:51:47 2003
@@ -355,7 +355,7 @@
 #define SETFEATURES_DIS_MSN	0x31	/* Disable Media Status Notification */
 #define SETFEATURES_DIS_RETRY	0x33	/* Disable Retry */
 #define SETFEATURES_EN_AAM	0x42	/* Enable Automatic Acoustic Management */
-#define SETFEATURES_RW_LONG	0x44	/* Set Lenght of VS bytes */
+#define SETFEATURES_RW_LONG	0x44	/* Set Length of VS bytes */
 #define SETFEATURES_SET_CACHE	0x54	/* Set Cache segments to SC Reg. Val */
 #define SETFEATURES_DIS_RLA	0x55	/* Disable read look-ahead feature */
 #define SETFEATURES_EN_RI	0x5D	/* Enable release interrupt */
diff -Nru a/include/linux/highmem.h b/include/linux/highmem.h
--- a/include/linux/highmem.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/highmem.h	Sat Apr 19 19:51:49 2003
@@ -67,7 +67,6 @@
 	kaddr = kmap_atomic(page, KM_USER0);
 	memset((char *)kaddr + offset, 0, size);
 	flush_dcache_page(page);
-	flush_page_to_ram(page);
 	kunmap_atomic(kaddr, KM_USER0);
 }
 
diff -Nru a/include/linux/hysdn_if.h b/include/linux/hysdn_if.h
--- a/include/linux/hysdn_if.h	Sat Apr 19 19:51:51 2003
+++ b/include/linux/hysdn_if.h	Sat Apr 19 19:51:51 2003
@@ -24,7 +24,7 @@
 #define ERR_BOOTSEQ_FAIL  1006 /* 2. stage boot seq handshake timeout */
 #define ERR_POF_TIMEOUT   1007 /* timeout waiting for card pof ready */
 #define ERR_NOT_BOOTED    1008 /* operation only allowed when booted */
-#define ERR_CONF_LONG     1009 /* conf line is to long */ 
+#define ERR_CONF_LONG     1009 /* conf line is too long */ 
 #define ERR_INV_CHAN      1010 /* invalid channel number */ 
 #define ERR_ASYNC_TIME    1011 /* timeout sending async data */ 
 
diff -Nru a/include/linux/i2c-dev.h b/include/linux/i2c-dev.h
--- a/include/linux/i2c-dev.h	Sat Apr 19 19:51:29 2003
+++ b/include/linux/i2c-dev.h	Sat Apr 19 19:51:29 2003
@@ -31,16 +31,16 @@
 
 /* This is the structure as used in the I2C_SMBUS ioctl call */
 struct i2c_smbus_ioctl_data {
-	char read_write;
+	__u8 read_write;
 	__u8 command;
-	int size;
+	__u32 size;
 	union i2c_smbus_data *data;
 };
 
 /* This is the structure as used in the I2C_RDWR ioctl call */
 struct i2c_rdwr_ioctl_data {
 	struct i2c_msg *msgs;	/* pointers to i2c_msgs */
-	int nmsgs;		/* number of i2c_msgs */
+	__u32 nmsgs;		/* number of i2c_msgs */
 };
 
 #endif /* _LINUX_I2C_DEV_H */
diff -Nru a/include/linux/i2c.h b/include/linux/i2c.h
--- a/include/linux/i2c.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/i2c.h	Sat Apr 19 19:51:28 2003
@@ -182,6 +182,13 @@
 	return dev_set_drvdata (&dev->dev, data);
 }
 
+#define I2C_DEVNAME(str)   .dev = { .name = str }
+
+static inline char *i2c_clientname(struct i2c_client *c)
+{
+	return c->dev.name;
+}
+
 /*
  * The following structs are for those who like to implement new bus drivers:
  * i2c_algorithm is the interface to a class of hardware solutions which can
@@ -360,15 +367,15 @@
  */
 struct i2c_msg {
 	__u16 addr;	/* slave address			*/
-	unsigned short flags;		
+ 	__u16 flags;		
 #define I2C_M_TEN	0x10	/* we have a ten bit chip address	*/
 #define I2C_M_RD	0x01
 #define I2C_M_NOSTART	0x4000
 #define I2C_M_REV_DIR_ADDR	0x2000
 #define I2C_M_IGNORE_NAK	0x1000
 #define I2C_M_NO_RD_ACK		0x0800
-	short len;		/* msg length				*/
-	char *buf;		/* pointer to msg data			*/
+ 	__u16 len;		/* msg length				*/
+ 	__u8 *buf;		/* pointer to msg data			*/
 };
 
 /* To determine what functionality is present */
diff -Nru a/include/linux/icmpv6.h b/include/linux/icmpv6.h
--- a/include/linux/icmpv6.h	Sat Apr 19 19:51:29 2003
+++ b/include/linux/icmpv6.h	Sat Apr 19 19:51:29 2003
@@ -86,6 +86,19 @@
 #define ICMPV6_MGM_REPORT       	131
 #define ICMPV6_MGM_REDUCTION    	132
 
+/* definitions for MLDv2 */
+
+#define MLD2_MODE_IS_INCLUDE	1
+#define MLD2_MODE_IS_EXCLUDE	2
+#define MLD2_CHANGE_TO_INCLUDE	3
+#define MLD2_CHANGE_TO_EXCLUDE	4
+#define MLD2_ALLOW_NEW_SOURCES	5
+#define MLD2_BLOCK_OLD_SOURCES	6
+
+/* this must be an IANA-assigned value; 206 for testing only */
+#define ICMPV6_MLD2_REPORT		206
+#define MLD2_ALL_MCR_INIT { { { 0xff,0x02,0,0,0,0,0,0,0,0,0,0,0,0,0,0x16 } } }
+
 /*
  *	Codes for Destination Unreachable
  */
diff -Nru a/include/linux/ide.h b/include/linux/ide.h
--- a/include/linux/ide.h	Sat Apr 19 19:51:46 2003
+++ b/include/linux/ide.h	Sat Apr 19 19:51:46 2003
@@ -13,7 +13,6 @@
 #include <linux/hdsmart.h>
 #include <linux/blkdev.h>
 #include <linux/proc_fs.h>
-#include <linux/devfs_fs_kernel.h>
 #include <linux/interrupt.h>
 #include <linux/bitops.h>
 #include <linux/bio.h>
@@ -699,7 +698,7 @@
 	struct hd_driveid	*id;	/* drive model identification info */
 	struct proc_dir_entry *proc;	/* /proc/ide/ directory entry */
 	struct ide_settings_s *settings;/* /proc/ide/ drive settings */
-	devfs_handle_t		de;	/* directory for device */
+	char		devfs_name[64];	/* devfs crap */
 
 	struct hwif_s		*hwif;	/* actually (ide_hwif_t *) */
 
diff -Nru a/include/linux/if.h b/include/linux/if.h
--- a/include/linux/if.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/if.h	Sat Apr 19 19:51:47 2003
@@ -50,7 +50,7 @@
 
 /* Private (from user) interface flags (netdevice->priv_flags). */
 #define IFF_802_1Q_VLAN 0x1             /* 802.1Q VLAN device.          */
-
+#define IFF_EBRIDGE	0x2		/* Ethernet bridging device.	*/
 
 #define IF_GET_IFACE	0x0001		/* for querying only */
 #define IF_GET_PROTO	0x0002
diff -Nru a/include/linux/if_bridge.h b/include/linux/if_bridge.h
--- a/include/linux/if_bridge.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/if_bridge.h	Sat Apr 19 19:51:47 2003
@@ -101,7 +101,7 @@
 struct net_bridge;
 struct net_bridge_port;
 
-extern int (*br_ioctl_hook)(unsigned long arg);
+extern void brioctl_set(int (*ioctl_hook)(unsigned long));
 extern int (*br_handle_frame_hook)(struct sk_buff *skb);
 extern int (*br_should_route_hook)(struct sk_buff **pskb);
 
diff -Nru a/include/linux/if_vlan.h b/include/linux/if_vlan.h
--- a/include/linux/if_vlan.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/if_vlan.h	Sat Apr 19 19:51:28 2003
@@ -54,8 +54,8 @@
 
 #define VLAN_VID_MASK	0xfff
 
-/* found in af_inet.c */
-extern int (*vlan_ioctl_hook)(unsigned long arg);
+/* found in socket.c */
+extern void vlan_ioctl_set(int (*hook)(unsigned long));
 
 #define VLAN_NAME "vlan"
 
diff -Nru a/include/linux/igmp.h b/include/linux/igmp.h
--- a/include/linux/igmp.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/igmp.h	Sat Apr 19 19:51:47 2003
@@ -32,13 +32,60 @@
 	__u32 group;
 };
 
+/* V3 group record types [grec_type] */
+#define IGMPV3_MODE_IS_INCLUDE		1
+#define IGMPV3_MODE_IS_EXCLUDE		2
+#define IGMPV3_CHANGE_TO_INCLUDE	3
+#define IGMPV3_CHANGE_TO_EXCLUDE	4
+#define IGMPV3_ALLOW_NEW_SOURCES	5
+#define IGMPV3_BLOCK_OLD_SOURCES	6
+
+struct igmpv3_grec {
+	__u8	grec_type;
+	__u8	grec_auxwords;
+	__u16	grec_nsrcs;
+	__u32	grec_mca;
+	__u32	grec_src[0];
+};
+
+struct igmpv3_report {
+	__u8 type;
+	__u8 resv1;
+	__u16 csum;
+	__u16 resv2;
+	__u16 ngrec;
+	struct igmpv3_grec grec[0];
+};
+
+struct igmpv3_query {
+	__u8 type;
+	__u8 code;
+	__u16 csum;
+	__u32 group;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 qrv:3,
+	     suppress:1,
+	     resv:4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+	__u8 resv:4,
+	     suppress:1,
+	     qrv:3;
+#else
+#error "Please fix <asm/byteorder.h>"
+#endif
+	__u8 qqic;
+	__u16 nsrcs;
+	__u32 srcs[0];
+};
+
 #define IGMP_HOST_MEMBERSHIP_QUERY	0x11	/* From RFC1112 */
 #define IGMP_HOST_MEMBERSHIP_REPORT	0x12	/* Ditto */
 #define IGMP_DVMRP			0x13	/* DVMRP routing */
 #define IGMP_PIM			0x14	/* PIM routing */
 #define IGMP_TRACE			0x15
-#define IGMP_HOST_NEW_MEMBERSHIP_REPORT 0x16	/* New version of 0x11 */
+#define IGMPV2_HOST_MEMBERSHIP_REPORT	0x16	/* V2 version of 0x11 */
 #define IGMP_HOST_LEAVE_MESSAGE 	0x17
+#define IGMPV3_HOST_MEMBERSHIP_REPORT	0x22	/* V3 version of 0x11 */
 
 #define IGMP_MTRACE_RESP		0x1e
 #define IGMP_MTRACE			0x1f
@@ -68,6 +115,7 @@
 
 #define IGMP_ALL_HOSTS		htonl(0xE0000001L)
 #define IGMP_ALL_ROUTER 	htonl(0xE0000002L)
+#define IGMPV3_ALL_MCR	 	htonl(0xE0000016L)
 #define IGMP_LOCAL_GROUP	htonl(0xE0000000L)
 #define IGMP_LOCAL_GROUP_MASK	htonl(0xFFFFFF00L)
 
@@ -79,6 +127,18 @@
 #include <linux/skbuff.h>
 #include <linux/in.h>
 
+struct ip_sf_socklist
+{
+	unsigned int		sl_max;
+	unsigned int		sl_count;
+	__u32			sl_addr[0];
+};
+
+#define IP_SFLSIZE(count)	(sizeof(struct ip_sf_socklist) + \
+	(count) * sizeof(__u32))
+
+#define IP_SFBLOCK	10	/* allocate this many at once */
+
 /* ip_mc_socklist is real list now. Speed is not argument;
    this list never used in fast path code
  */
@@ -88,12 +148,28 @@
 	struct ip_mc_socklist	*next;
 	int			count;
 	struct ip_mreqn		multi;
+	unsigned int		sfmode;		/* MCAST_{INCLUDE,EXCLUDE} */
+	struct ip_sf_socklist	*sflist;
+};
+
+struct ip_sf_list
+{
+	struct ip_sf_list	*sf_next;
+	__u32			sf_inaddr;
+	unsigned long		sf_count[2];	/* include/exclude counts */
+	unsigned char		sf_gsresp;	/* include in g & s response? */
+	unsigned char		sf_oldin;	/* change state */
+	unsigned char		sf_crcount;	/* retrans. left to send */
 };
 
 struct ip_mc_list
 {
 	struct in_device	*interface;
 	unsigned long		multiaddr;
+	struct ip_sf_list	*sources;
+	struct ip_sf_list	*tomb;
+	unsigned int		sfmode;
+	unsigned long		sfcount[2];
 	struct ip_mc_list	*next;
 	struct timer_list	timer;
 	int			users;
@@ -103,13 +179,31 @@
 	char			reporter;
 	char			unsolicit_count;
 	char			loaded;
+	unsigned char		gsquery;	/* check source marks? */
+	unsigned char		crcount;
 };
 
-extern int ip_check_mc(struct in_device *dev, u32 mc_addr);
+/* V3 exponential field decoding */
+#define IGMPV3_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value))
+#define IGMPV3_EXP(thresh, nbmant, nbexp, value) \
+	((value) < (thresh) ? (value) : \
+        ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant+nbexp))) << \
+         (IGMPV3_MASK((value) >> (nbmant), nbexp) + (nbexp))))
+
+#define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value)
+#define IGMPV3_MRC(value) IGMPV3_EXP(0x8000, 12, 3, value)
+
+extern int ip_check_mc(struct in_device *dev, u32 mc_addr, u32 src_addr, u16 proto);
 extern int igmp_rcv(struct sk_buff *);
 extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
 extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
 extern void ip_mc_drop_socket(struct sock *sk);
+extern int ip_mc_source(int add, int omode, struct sock *sk,
+		struct ip_mreq_source *mreqs);
+extern int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf);
+extern int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
+		struct ip_msfilter *optval, int *optlen);
+extern int ip_mc_sf_allow(struct sock *sk, u32 local, u32 rmt, int dif);
 extern void ip_mr_init(void);
 extern void ip_mc_init_dev(struct in_device *);
 extern void ip_mc_destroy_dev(struct in_device *);
diff -Nru a/include/linux/in.h b/include/linux/in.h
--- a/include/linux/in.h	Sat Apr 19 19:51:51 2003
+++ b/include/linux/in.h	Sat Apr 19 19:51:51 2003
@@ -85,6 +85,21 @@
 #define IP_MULTICAST_LOOP 		34
 #define IP_ADD_MEMBERSHIP		35
 #define IP_DROP_MEMBERSHIP		36
+#define IP_UNBLOCK_SOURCE		37
+#define IP_BLOCK_SOURCE			38
+#define IP_ADD_SOURCE_MEMBERSHIP	39
+#define IP_DROP_SOURCE_MEMBERSHIP	40
+#define IP_MSFILTER			41
+#define MCAST_JOIN_GROUP		42
+#define MCAST_BLOCK_SOURCE		43
+#define MCAST_UNBLOCK_SOURCE		44
+#define MCAST_LEAVE_GROUP		45
+#define MCAST_JOIN_SOURCE_GROUP		46
+#define MCAST_LEAVE_SOURCE_GROUP	47
+#define MCAST_MSFILTER			48
+
+#define MCAST_EXCLUDE	0
+#define MCAST_INCLUDE	1
 
 /* These need to appear somewhere around here */
 #define IP_DEFAULT_MULTICAST_TTL        1
@@ -104,6 +119,50 @@
 	struct in_addr	imr_address;		/* local IP address of interface */
 	int		imr_ifindex;		/* Interface index */
 };
+
+struct ip_mreq_source {
+	__u32		imr_multiaddr;
+	__u32		imr_interface;
+	__u32		imr_sourceaddr;
+};
+
+struct ip_msfilter {
+	__u32		imsf_multiaddr;
+	__u32		imsf_interface;
+	__u32		imsf_fmode;
+	__u32		imsf_numsrc;
+	__u32		imsf_slist[1];
+};
+
+#define IP_MSFILTER_SIZE(numsrc) \
+	(sizeof(struct ip_msfilter) - sizeof(__u32) \
+	+ (numsrc) * sizeof(__u32))
+
+struct group_req
+{
+	__u32			gr_interface;	/* interface index */
+	struct sockaddr_storage	gr_group;	/* group address */
+};
+
+struct group_source_req
+{
+	__u32			gsr_interface;	/* interface index */
+	struct sockaddr_storage	gsr_group;	/* group address */
+	struct sockaddr_storage	gsr_source;	/* source address */
+};
+
+struct group_filter
+{
+	__u32			gf_interface;	/* interface index */
+	struct sockaddr_storage	gf_group;	/* multicast address */
+	__u32			gf_fmode;	/* filter mode */
+	__u32			gf_numsrc;	/* number of sources */
+	struct sockaddr_storage	gf_slist[1];	/* interface index */
+};
+
+#define GROUP_FILTER_SIZE(numsrc) \
+	(sizeof(struct group_filter) - sizeof(struct sockaddr_storage) \
+	+ (numsrc) * sizeof(struct sockaddr_storage))
 
 struct in_pktinfo
 {
diff -Nru a/include/linux/inetdevice.h b/include/linux/inetdevice.h
--- a/include/linux/inetdevice.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/inetdevice.h	Sat Apr 19 19:51:49 2003
@@ -34,7 +34,17 @@
 	int			dead;
 	struct in_ifaddr	*ifa_list;	/* IP ifaddr chain		*/
 	struct ip_mc_list	*mc_list;	/* IP multicast filter chain    */
+	rwlock_t		mc_lock;	/* for mc_tomb */
+	struct ip_mc_list	*mc_tomb;
 	unsigned long		mr_v1_seen;
+	unsigned long		mr_v2_seen;
+	unsigned long		mr_maxdelay;
+	unsigned char		mr_qrv;
+	unsigned char		mr_gq_running;
+	unsigned char		mr_ifc_count;
+	struct timer_list	mr_gq_timer;	/* general query timer */
+	struct timer_list	mr_ifc_timer;	/* interface change timer */
+
 	struct neigh_parms	*arp_parms;
 	struct ipv4_devconf	cnf;
 };
diff -Nru a/include/linux/init_task.h b/include/linux/init_task.h
--- a/include/linux/init_task.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/init_task.h	Sat Apr 19 19:51:28 2003
@@ -6,7 +6,7 @@
 #define INIT_FILES \
 { 							\
 	.count		= ATOMIC_INIT(1), 		\
-	.file_lock	= RW_LOCK_UNLOCKED, 		\
+	.file_lock	= SPIN_LOCK_UNLOCKED, 		\
 	.max_fds	= NR_OPEN_DEFAULT, 		\
 	.max_fdset	= __FD_SETSIZE, 		\
 	.next_fd	= 0, 				\
diff -Nru a/include/linux/interrupt.h b/include/linux/interrupt.h
--- a/include/linux/interrupt.h	Sat Apr 19 19:51:48 2003
+++ b/include/linux/interrupt.h	Sat Apr 19 19:51:48 2003
@@ -77,6 +77,9 @@
 extern void FASTCALL(cpu_raise_softirq(unsigned int cpu, unsigned int nr));
 extern void FASTCALL(raise_softirq(unsigned int nr));
 
+#ifndef invoke_softirq
+#define invoke_softirq() do_softirq()
+#endif
 
 
 /* Tasklets --- multithreaded analogue of BHs.
diff -Nru a/include/linux/ip.h b/include/linux/ip.h
--- a/include/linux/ip.h	Sat Apr 19 19:51:30 2003
+++ b/include/linux/ip.h	Sat Apr 19 19:51:30 2003
@@ -79,6 +79,7 @@
 #define	IPOPT_TS_PRESPEC	3		/* specified modules only */
 
 #ifdef __KERNEL__
+#include <linux/config.h>
 #include <linux/types.h>
 #include <net/sock.h>
 #include <linux/igmp.h>
diff -Nru a/include/linux/irda.h b/include/linux/irda.h
--- a/include/linux/irda.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/irda.h	Sat Apr 19 19:51:28 2003
@@ -25,6 +25,8 @@
 #ifndef KERNEL_IRDA_H
 #define KERNEL_IRDA_H
 
+#include <linux/socket.h> /* only for sa_family_t */
+
 /* Hint bit positions for first hint byte */
 #define HINT_PNP         0x01
 #define HINT_PDA         0x02
diff -Nru a/include/linux/jbd.h b/include/linux/jbd.h
--- a/include/linux/jbd.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/jbd.h	Sat Apr 19 19:51:50 2003
@@ -274,8 +274,9 @@
 #define __journal_expect(expr, why...)					     \
 	do {								     \
 		if (!(expr)) {						     \
-			printk(KERN_ERR "EXT3-fs unexpected failure: %s;\n", # expr); \
-			printk(KERN_ERR ## why);			     \
+			printk(KERN_ERR					     \
+				"EXT3-fs unexpected failure: %s;\n",# expr); \
+			printk(KERN_ERR why);				     \
 		}							     \
 	} while (0)
 #define J_EXPECT(expr, why...)		__journal_expect(expr, ## why)
diff -Nru a/include/linux/kernel.h b/include/linux/kernel.h
--- a/include/linux/kernel.h	Sat Apr 19 19:51:27 2003
+++ b/include/linux/kernel.h	Sat Apr 19 19:51:27 2003
@@ -104,6 +104,7 @@
 
 extern void bust_spinlocks(int yes);
 extern int oops_in_progress;		/* If set, an oops, panic(), BUG() or die() is in progress */
+extern int panic_on_oops;
 
 extern int tainted;
 extern const char *print_tainted(void);
diff -Nru a/include/linux/kobject.h b/include/linux/kobject.h
--- a/include/linux/kobject.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/kobject.h	Sat Apr 19 19:51:28 2003
@@ -57,12 +57,24 @@
  *	of object; multiple ksets can belong to one subsystem. All 
  *	ksets of a subsystem share the subsystem's lock.
  *
+ *      Each kset can support hotplugging; if it does, it will be given
+ *      the opportunity to filter out specific kobjects from being
+ *      reported, as well as to add its own "data" elements to the
+ *      environment being passed to the hotplug helper.
  */
+struct kset_hotplug_ops {
+	int (*filter)(struct kset *kset, struct kobject *kobj);
+	char *(*name)(struct kset *kset, struct kobject *kobj);
+	int (*hotplug)(struct kset *kset, struct kobject *kobj, char **envp,
+			int num_envp, char *buffer, int buffer_size);
+};
+
 struct kset {
 	struct subsystem	* subsys;
 	struct kobj_type	* ktype;
 	struct list_head	list;
 	struct kobject		kobj;
+	struct kset_hotplug_ops	* hotplug_ops;
 };
 
 
@@ -86,6 +98,13 @@
 	kobject_put(&k->kobj);
 }
 
+static inline struct kobj_type * get_ktype(struct kobject * k)
+{
+	if (k->kset && k->kset->ktype)
+		return k->kset->ktype;
+	else 
+		return k->ktype;
+}
 
 extern struct kobject * kset_find_obj(struct kset *, const char *);
 
@@ -95,11 +114,12 @@
 	struct rw_semaphore	rwsem;
 };
 
-#define decl_subsys(_name,_type) \
+#define decl_subsys(_name,_type,_hotplug_ops) \
 struct subsystem _name##_subsys = { \
 	.kset = { \
 		.kobj = { .name = __stringify(_name) }, \
 		.ktype = _type, \
+		.hotplug_ops =_hotplug_ops, \
 	} \
 }
 
diff -Nru a/include/linux/linux_logo.h b/include/linux/linux_logo.h
--- a/include/linux/linux_logo.h	Sat Apr 19 19:51:29 2003
+++ b/include/linux/linux_logo.h	Sat Apr 19 19:51:29 2003
@@ -32,6 +32,6 @@
 	const unsigned char *data;
 };
 
-extern const struct linux_logo * __init fb_find_logo(int type);
+extern const struct linux_logo * __init find_logo(int depth);
 
 #endif /* _LINUX_LINUX_LOGO_H */
diff -Nru a/include/linux/loop.h b/include/linux/loop.h
--- a/include/linux/loop.h	Sat Apr 19 19:51:51 2003
+++ b/include/linux/loop.h	Sat Apr 19 19:51:51 2003
@@ -1,8 +1,6 @@
 #ifndef _LINUX_LOOP_H
 #define _LINUX_LOOP_H
 
-#include <linux/kdev_t.h>
-
 /*
  * include/linux/loop.h
  *
@@ -74,34 +72,37 @@
 #define LO_FLAGS_READ_ONLY	2
 #define LO_FLAGS_BH_REMAP	4
 
-/* 
- * Note that this structure gets the wrong offsets when directly used
- * from a glibc program, because glibc has a 32bit dev_t.
- * Prevent people from shooting in their own foot.  
- */
-#if __GLIBC__ >= 2 && !defined(dev_t)
-#error "Wrong dev_t in loop.h"
-#endif 
-
-/*
- *	This uses kdev_t because glibc currently has no appropiate
- *	conversion version for the loop ioctls. 
- * 	The situation is very unpleasant	
- */
+#include <asm/posix_types.h>	/* for __kernel_old_dev_t */
+#include <asm/types.h>		/* for __u64 */
 
+/* Backwards compatibility version */
 struct loop_info {
-	int		lo_number;	/* ioctl r/o */
-	dev_t		lo_device; 	/* ioctl r/o */
-	unsigned long	lo_inode; 	/* ioctl r/o */
-	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 long	lo_init[2];
-	char		reserved[4];
+	int		   lo_number;		/* ioctl r/o */
+	__kernel_old_dev_t lo_device; 		/* ioctl r/o */
+	unsigned long	   lo_inode; 		/* ioctl r/o */
+	__kernel_old_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 long	   lo_init[2];
+	char		   reserved[4];
+};
+
+struct loop_info64 {
+	__u64		   lo_device; 		/* ioctl r/o */
+	__u64		   lo_inode; 		/* ioctl r/o */
+	__u64		   lo_rdevice; 		/* ioctl r/o */
+	__u64		   lo_offset;
+	__u32		   lo_number;		/* ioctl r/o */
+	__u32		   lo_encrypt_type;
+	__u32		   lo_encrypt_key_size; 	/* ioctl w/o */
+	__u32		   lo_flags;			/* ioctl r/o */
+	__u8		   lo_name[LO_NAME_SIZE];
+	__u8		   lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */
+	__u64		   lo_init[2];
 };
 
 /*
@@ -125,7 +126,7 @@
 	int number; 	/* filter type */ 
 	int (*transfer)(struct loop_device *lo, int cmd, char *raw_buf,
 			char *loop_buf, int size, sector_t real_block);
-	int (*init)(struct loop_device *, struct loop_info *); 
+	int (*init)(struct loop_device *, const struct loop_info64 *); 
 	/* release is called from loop_unregister_transfer or clr_fd */
 	int (*release)(struct loop_device *); 
 	int (*ioctl)(struct loop_device *, int cmd, unsigned long arg);
@@ -134,7 +135,7 @@
 	void (*unlock)(struct loop_device *);
 }; 
 
-int  loop_register_transfer(struct loop_func_table *funcs);
+int loop_register_transfer(struct loop_func_table *funcs);
 int loop_unregister_transfer(int number); 
 
 #endif
@@ -142,9 +143,11 @@
  * IOCTL commands --- we will commandeer 0x4C ('L')
  */
 
-#define LOOP_SET_FD	0x4C00
-#define LOOP_CLR_FD	0x4C01
-#define LOOP_SET_STATUS	0x4C02
-#define LOOP_GET_STATUS	0x4C03
+#define LOOP_SET_FD		0x4C00
+#define LOOP_CLR_FD		0x4C01
+#define LOOP_SET_STATUS		0x4C02
+#define LOOP_GET_STATUS		0x4C03
+#define LOOP_SET_STATUS64	0x4C04
+#define LOOP_GET_STATUS64	0x4C05
 
 #endif
diff -Nru a/include/linux/mm.h b/include/linux/mm.h
--- a/include/linux/mm.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/mm.h	Sat Apr 19 19:51:28 2003
@@ -231,8 +231,8 @@
 static inline void put_page(struct page *page)
 {
 	if (PageCompound(page)) {
+		page = (struct page *)page->lru.next;
 		if (put_page_testzero(page)) {
-			page = (struct page *)page->lru.next;
 			if (page->lru.prev) {	/* destructor? */
 				(*(void (*)(struct page *))page->lru.prev)(page);
 			} else {
@@ -486,6 +486,8 @@
 extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
 	unsigned long * zones_size, unsigned long zone_start_pfn, 
 	unsigned long *zholes_size);
+extern void memmap_init_zone(struct page *, unsigned long, int,
+	unsigned long, unsigned long);
 extern void mem_init(void);
 extern void show_mem(void);
 extern void si_meminfo(struct sysinfo * val);
diff -Nru a/include/linux/mtd/compatmac.h b/include/linux/mtd/compatmac.h
--- a/include/linux/mtd/compatmac.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/mtd/compatmac.h	Sat Apr 19 19:51:50 2003
@@ -17,7 +17,6 @@
 #ifndef __LINUX_MTD_COMPATMAC_H__
 #define __LINUX_MTD_COMPATMAC_H__
 
-#include <linux/compatmac.h>
 #include <linux/types.h> /* used later in this header */
 #include <linux/module.h>
 #ifndef LINUX_VERSION_CODE
diff -Nru a/include/linux/namei.h b/include/linux/namei.h
--- a/include/linux/namei.h	Sat Apr 19 19:51:46 2003
+++ b/include/linux/namei.h	Sat Apr 19 19:51:46 2003
@@ -33,7 +33,7 @@
 #define LOOKUP_NOALT		32
 
 
-extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *));
+extern int FASTCALL(__user_walk(const char __user *, unsigned, struct nameidata *));
 #define user_path_walk(name,nd) \
 	__user_walk(name, LOOKUP_FOLLOW, nd)
 #define user_path_walk_link(name,nd) \
diff -Nru a/include/linux/net.h b/include/linux/net.h
--- a/include/linux/net.h	Sat Apr 19 19:51:46 2003
+++ b/include/linux/net.h	Sat Apr 19 19:51:46 2003
@@ -19,7 +19,6 @@
 #define _LINUX_NET_H
 
 #include <linux/config.h>
-#include <linux/socket.h>
 #include <linux/wait.h>
 
 struct poll_table_struct;
@@ -88,6 +87,8 @@
 struct vm_area_struct;
 struct page;
 struct kiocb;
+struct sockaddr;
+struct msghdr;
 
 struct proto_ops {
 	int		family;
@@ -135,6 +136,8 @@
 	short	encryption;
 	short	encrypt_net;
 };
+
+struct iovec;
 
 extern int	     sock_wake_async(struct socket *sk, int how, int band);
 extern int	     sock_register(struct net_proto_family *fam);
diff -Nru a/include/linux/netfilter_ipv4/ip_conntrack_amanda.h b/include/linux/netfilter_ipv4/ip_conntrack_amanda.h
--- a/include/linux/netfilter_ipv4/ip_conntrack_amanda.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/netfilter_ipv4/ip_conntrack_amanda.h	Sat Apr 19 19:51:28 2003
@@ -11,14 +11,6 @@
 
 #endif
 
-struct conn {
-	char* match;
-	int matchlen;
-};
-
-#define NUM_MSGS 	3
-
-
 struct ip_ct_amanda_expect
 {
 	u_int16_t port;		/* port number of this expectation */
diff -Nru a/include/linux/netfilter_ipv4/ip_conntrack_core.h b/include/linux/netfilter_ipv4/ip_conntrack_core.h
--- a/include/linux/netfilter_ipv4/ip_conntrack_core.h	Sat Apr 19 19:51:51 2003
+++ b/include/linux/netfilter_ipv4/ip_conntrack_core.h	Sat Apr 19 19:51:51 2003
@@ -24,9 +24,11 @@
 extern struct ip_conntrack *icmp_error_track(struct sk_buff *skb,
 					     enum ip_conntrack_info *ctinfo,
 					     unsigned int hooknum);
-extern int get_tuple(const struct iphdr *iph, size_t len,
+extern int get_tuple(const struct iphdr *iph,
+		     const struct sk_buff *skb,
+		     unsigned int dataoff,
 		     struct ip_conntrack_tuple *tuple,
-		     struct ip_conntrack_protocol *protocol);
+		     const struct ip_conntrack_protocol *protocol);
 
 /* Find a connection corresponding to a tuple. */
 struct ip_conntrack_tuple_hash *
diff -Nru a/include/linux/netfilter_ipv4/ip_conntrack_helper.h b/include/linux/netfilter_ipv4/ip_conntrack_helper.h
--- a/include/linux/netfilter_ipv4/ip_conntrack_helper.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/netfilter_ipv4/ip_conntrack_helper.h	Sat Apr 19 19:51:28 2003
@@ -25,7 +25,7 @@
 	
 	/* Function to call when data passes; return verdict, or -1 to
            invalidate. */
-	int (*help)(const struct iphdr *, size_t len,
+	int (*help)(struct sk_buff *skb,
 		    struct ip_conntrack *ct,
 		    enum ip_conntrack_info conntrackinfo);
 };
diff -Nru a/include/linux/netfilter_ipv4/ip_conntrack_irc.h b/include/linux/netfilter_ipv4/ip_conntrack_irc.h
--- a/include/linux/netfilter_ipv4/ip_conntrack_irc.h	Sat Apr 19 19:51:46 2003
+++ b/include/linux/netfilter_ipv4/ip_conntrack_irc.h	Sat Apr 19 19:51:46 2003
@@ -37,11 +37,6 @@
 
 #define IRC_PORT	6667
 
-struct dccproto {
-	char* match;
-	int matchlen;
-};
-
 /* Protects irc part of conntracks */
 DECLARE_LOCK_EXTERN(ip_irc_lock);
 
diff -Nru a/include/linux/netfilter_ipv4/ip_conntrack_protocol.h b/include/linux/netfilter_ipv4/ip_conntrack_protocol.h
--- a/include/linux/netfilter_ipv4/ip_conntrack_protocol.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/netfilter_ipv4/ip_conntrack_protocol.h	Sat Apr 19 19:51:50 2003
@@ -14,9 +14,11 @@
 	/* Protocol name */
 	const char *name;
 
-	/* Try to fill in the third arg; return true if possible. */
-	int (*pkt_to_tuple)(const void *datah, size_t datalen,
-			    struct ip_conntrack_tuple *tuple);
+	/* Try to fill in the third arg: dataoff is offset past IP
+           hdr.  Return true if possible. */
+	int (*pkt_to_tuple)(const struct sk_buff *skb,
+			   unsigned int dataoff,
+			   struct ip_conntrack_tuple *tuple);
 
 	/* Invert the per-proto part of the tuple: ie. turn xmit into reply.
 	 * Some packets can't be inverted: return 0 in that case.
@@ -34,20 +36,19 @@
 
 	/* Returns verdict for packet, or -1 for invalid. */
 	int (*packet)(struct ip_conntrack *conntrack,
-		      struct iphdr *iph, size_t len,
+		      const struct sk_buff *skb,
 		      enum ip_conntrack_info ctinfo);
 
 	/* Called when a new connection for this protocol found;
 	 * returns TRUE if it's OK.  If so, packet() called next. */
-	int (*new)(struct ip_conntrack *conntrack, struct iphdr *iph,
-		   size_t len);
+	int (*new)(struct ip_conntrack *conntrack, const struct sk_buff *skb);
 
 	/* Called when a conntrack entry is destroyed */
 	void (*destroy)(struct ip_conntrack *conntrack);
 
 	/* Has to decide if a expectation matches one packet or not */
 	int (*exp_matches_pkt)(struct ip_conntrack_expect *exp,
-			       struct sk_buff **pskb);
+			       const struct sk_buff *skb);
 
 	/* Module (if any) which this is connected to. */
 	struct module *me;
diff -Nru a/include/linux/netlink.h b/include/linux/netlink.h
--- a/include/linux/netlink.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/netlink.h	Sat Apr 19 19:51:50 2003
@@ -1,6 +1,8 @@
 #ifndef __LINUX_NETLINK_H
 #define __LINUX_NETLINK_H
 
+#include <linux/socket.h> /* for sa_family_t */
+
 #define NETLINK_ROUTE		0	/* Routing/device hook				*/
 #define NETLINK_SKIP		1	/* Reserved for ENskip  			*/
 #define NETLINK_USERSOCK	2	/* Reserved for user mode socket protocols 	*/
diff -Nru a/include/linux/nfs4.h b/include/linux/nfs4.h
--- a/include/linux/nfs4.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/nfs4.h	Sat Apr 19 19:51:47 2003
@@ -206,6 +206,10 @@
 	NFSPROC4_CLNT_READ,
 	NFSPROC4_CLNT_WRITE,
 	NFSPROC4_CLNT_COMMIT,
+	NFSPROC4_CLNT_OPEN,
+	NFSPROC4_CLNT_OPEN_CONFIRM,
+	NFSPROC4_CLNT_CLOSE,
+	NFSPROC4_CLNT_SETATTR,
 };
 
 #endif
diff -Nru a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
--- a/include/linux/nfs_fs.h	Sat Apr 19 19:51:46 2003
+++ b/include/linux/nfs_fs.h	Sat Apr 19 19:51:46 2003
@@ -155,6 +155,13 @@
 
 	wait_queue_head_t	nfs_i_wait;
 
+#ifdef CONFIG_NFS_V4
+        /* NFSv4 state */
+	struct nfs4_shareowner   *ro_owner;
+	struct nfs4_shareowner   *wo_owner;
+	struct nfs4_shareowner   *rw_owner;
+#endif /* CONFIG_NFS_V4*/
+
 	struct inode		vfs_inode;
 };
 
@@ -435,28 +442,75 @@
 #define NFS_JUKEBOX_RETRY_TIME (5 * HZ)
 
 #ifdef CONFIG_NFS_V4
+
+/*
+ * In a seqid-mutating op, this macro controls which error return
+ * values trigger incrementation of the seqid.
+ *
+ * from rfc 3010:
+ * The client MUST monotonically increment the sequence number for the
+ * CLOSE, LOCK, LOCKU, OPEN, OPEN_CONFIRM, and OPEN_DOWNGRADE
+ * operations.  This is true even in the event that the previous
+ * operation that used the sequence number received an error.  The only
+ * exception to this rule is if the previous operation received one of
+ * the following errors: NFSERR_STALE_CLIENTID, NFSERR_STALE_STATEID,
+ * NFSERR_BAD_STATEID, NFSERR_BAD_SEQID, NFSERR_BADXDR,
+ * NFSERR_RESOURCE, NFSERR_NOFILEHANDLE.
+ *
+ */
+#define seqid_mutating_err(err)       \
+(((err) != NFSERR_STALE_CLIENTID) &&  \
+ ((err) != NFSERR_STALE_STATEID)  &&  \
+ ((err) != NFSERR_BAD_STATEID)    &&  \
+ ((err) != NFSERR_BAD_SEQID)      &&  \
+ ((err) != NFSERR_BAD_XDR)        &&  \
+ ((err) != NFSERR_RESOURCE)       &&  \
+ ((err) != NFSERR_NOFILEHANDLE))
+
 struct nfs4_client {
-        atomic_t                cl_count;       /* refcount */
         u64                     cl_clientid;    /* constant */
-	 nfs4_verifier           cl_confirm;     
+	nfs4_verifier           cl_confirm;     
+
+	u32			cl_lockowner_id;
+};
 
-        /*
-         * Starts a list of lockowners, linked through lo_list.
-	 */
-        struct list_head        cl_lockowners;  /* protected by state_spinlock */
+/*
+* The ->so_sema is held during all shareowner seqid-mutating operations:
+* OPEN, OPEN_DOWNGRADE, and CLOSE.
+* Its purpose is to properly serialize so_seqid, as mandated by
+* the protocol.
+*/
+struct nfs4_shareowner {
+	u32                  so_id;      /* 32-bit identifier, unique */
+	struct semaphore     so_sema;
+	u32                  so_seqid;   /* protected by so_sema */
+	nfs4_stateid         so_stateid; /* protected by so_sema */
+	unsigned int         so_flags;   /* protected by so_sema */
 };
 
+
 /* nfs4proc.c */
 extern int nfs4_proc_renew(struct nfs_server *server);
+extern int nfs4_do_close(struct inode *inode, struct nfs4_shareowner *sp);
 
 /* nfs4renewd.c */
 extern int nfs4_init_renewd(struct nfs_server *server);
-#endif /* CONFIG_NFS_V4 */
-
-#ifdef CONFIG_NFS_V4
 
+/* nfs4state.c */
 extern struct nfs4_client *nfs4_get_client(void);
 extern void nfs4_put_client(struct nfs4_client *clp);
+extern struct nfs4_shareowner * nfs4_get_shareowner(struct inode *inode);
+void nfs4_put_shareowner(struct inode *inode, struct nfs4_shareowner *sp);
+extern int nfs4_set_inode_share(struct inode * inode,
+                     struct nfs4_shareowner *sp, unsigned int flags);
+extern void nfs4_increment_seqid(u32 status, struct nfs4_shareowner *sp);
+extern int nfs4_test_shareowner(struct inode *inode, unsigned int open_flags);
+struct nfs4_shareowner * nfs4_get_inode_share(struct inode * inode, unsigned int open_flags);
+
+
+
+
+
 
 struct nfs4_mount_data;
 static inline int
@@ -481,6 +535,7 @@
 #else
 #define create_nfsv4_state(server, data)  0
 #define destroy_nfsv4_state(server)       do { } while (0)
+#define nfs4_put_shareowner(inode, owner) do { } while (0)
 #endif
 
 #endif /* __KERNEL__ */
diff -Nru a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
--- a/include/linux/nfs_fs_sb.h	Sat Apr 19 19:51:51 2003
+++ b/include/linux/nfs_fs_sb.h	Sat Apr 19 19:51:51 2003
@@ -36,6 +36,7 @@
 	struct nfs4_client *	nfs4_state;	/* all NFSv4 state starts here */
 	unsigned long		lease_time;	/* in jiffies */
 	unsigned long		last_renewal;	/* in jiffies */
+	void                   *idmap;
 #endif
 };
 
diff -Nru a/include/linux/nfs_idmap.h b/include/linux/nfs_idmap.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/linux/nfs_idmap.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,69 @@
+/*
+ * include/linux/nfs_idmap.h
+ *
+ *  UID and GID to name mapping for clients.
+ *
+ *  Copyright (c) 2002 The Regents of the University of Michigan.
+ *  All rights reserved.
+ *
+ *  Marius Aamodt Eriksen <marius@umich.edu>
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. Neither the name of the University nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef NFS_IDMAP_H
+#define NFS_IDMAP_H
+
+/* XXX from bits/utmp.h  */
+#define IDMAP_NAMESZ  128
+
+#define IDMAP_TYPE_USER  0
+#define IDMAP_TYPE_GROUP 1
+
+#define IDMAP_CONV_IDTONAME 0
+#define IDMAP_CONV_NAMETOID 1
+
+#define IDMAP_STATUS_INVALIDMSG 0x01
+#define IDMAP_STATUS_AGAIN      0x02
+#define IDMAP_STATUS_LOOKUPFAIL 0x04
+#define IDMAP_STATUS_SUCCESS    0x08
+
+struct idmap_msg {
+	u_int8_t  im_type;
+	u_int8_t  im_conv;
+	char      im_name[IDMAP_NAMESZ];
+	u_int32_t im_id;
+	u_int8_t  im_status;
+};
+
+#ifdef __KERNEL__
+void      *nfs_idmap_new(struct nfs_server *);
+void       nfs_idmap_delete(struct nfs_server *);
+int        nfs_idmap_id(struct nfs_server *, u_int8_t, char *, u_int,  uid_t *);
+int        nfs_idmap_name(struct nfs_server *, u_int8_t, uid_t, char *, u_int *);
+#endif /* __KERNEL__ */
+
+#endif /* NFS_IDMAP_H */
diff -Nru a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
--- a/include/linux/nfs_xdr.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/nfs_xdr.h	Sat Apr 19 19:51:50 2003
@@ -88,6 +88,67 @@
 };
 
 /*
+ * Arguments to the open call.
+ */
+struct nfs_openargs {
+	struct nfs_fh *         fh;
+	__u32                   seqid;
+	__u32                   share_access;
+	__u64                   clientid;
+	__u32                   id;
+	__u32                   opentype;
+	__u32                   createmode;
+	union {
+		struct iattr *  attrs;    /* UNCHECKED, GUARDED */
+		nfs4_verifier   verifier; /* EXCLUSIVE */
+	} u;
+	struct qstr *           name;
+	struct nfs4_getattr *   f_getattr;
+	struct nfs4_getattr *   d_getattr;
+	struct nfs_server *     server;	 /* Needed for ID mapping */
+};
+
+struct nfs_openres {
+	__u32                   status;
+	nfs4_stateid            stateid;
+	struct nfs_fh           fh;
+	struct nfs4_change_info * cinfo;
+	__u32                   rflags;
+	struct nfs4_getattr *   f_getattr;
+	struct nfs4_getattr *   d_getattr;
+	struct nfs_server *     server;
+};
+
+/*
+ * Arguments to the open_confirm call.
+ */
+struct nfs_open_confirmargs {
+	struct nfs_fh *         fh;
+	nfs4_stateid            stateid;
+	__u32                   seqid;
+};
+
+struct nfs_open_confirmres {
+	__u32                   status;
+	nfs4_stateid            stateid;
+};
+
+/*
+ * Arguments to the close call.
+ */
+struct nfs_closeargs {
+	struct nfs_fh *         fh;
+	nfs4_stateid            stateid;
+	__u32                   seqid;
+};
+
+struct nfs_closeres {
+	__u32                   status;
+	nfs4_stateid            stateid;
+};
+
+
+/*
  * Arguments to the read call.
  */
 
@@ -98,6 +159,7 @@
 
 struct nfs_readargs {
 	struct nfs_fh *		fh;
+	nfs4_stateid		stateid;
 	__u64			offset;
 	__u32			count;
 	unsigned int		pgbase;
@@ -120,6 +182,7 @@
 
 struct nfs_writeargs {
 	struct nfs_fh *		fh;
+	nfs4_stateid		stateid;
 	__u64			offset;
 	__u32			count;
 	enum nfs3_stable_how	stable;
@@ -182,6 +245,19 @@
 	unsigned int		tolen;
 };
 
+struct nfs_setattrargs {
+	struct nfs_fh *                 fh;
+	nfs4_stateid                    stateid;
+	struct iattr *                  iap;
+	struct nfs4_getattr *           attr;
+	struct nfs_server *             server; /* Needed for name mapping */
+};
+
+struct nfs_setattrres {
+	struct nfs4_getattr *           attr;
+	struct nfs_server *             server;
+};
+
 struct nfs_linkargs {
 	struct nfs_fh *		fromfh;
 	struct nfs_fh *		tofh;
@@ -597,6 +673,7 @@
 	void	(*read_setup)   (struct nfs_read_data *, unsigned int count);
 	void	(*write_setup)  (struct nfs_write_data *, unsigned int count, int how);
 	void	(*commit_setup) (struct nfs_write_data *, u64 start, u32 len, int how);
+	int	(*file_open)   (struct inode *, struct file *);
 };
 
 /*
diff -Nru a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
--- a/include/linux/nfsd/nfsd.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/nfsd/nfsd.h	Sat Apr 19 19:51:50 2003
@@ -39,7 +39,7 @@
 #define MAY_LOCK		32
 #define MAY_OWNER_OVERRIDE	64
 #define	MAY_LOCAL_ACCESS	128 /* IRIX doing local access check on device special file*/
-#if (MAY_SATTR | MAY_TRUNC | MAY_LOCK | MAX_OWNER_OVERRIDE | MAY_LOCAL_ACCESS) & (MAY_READ | MAY_WRITE | MAY_EXEC | MAY_OWNER_OVERRIDE)
+#if (MAY_SATTR | MAY_TRUNC | MAY_LOCK | MAY_OWNER_OVERRIDE | MAY_LOCAL_ACCESS) & (MAY_READ | MAY_WRITE | MAY_EXEC)
 # error "please use a different value for MAY_SATTR or MAY_TRUNC or MAY_LOCK or MAY_OWNER_OVERRIDE."
 #endif
 #define MAY_CREATE		(MAY_EXEC|MAY_WRITE)
@@ -117,6 +117,17 @@
 int		nfsd_permission(struct svc_export *, struct dentry *, int);
 
 
+/* 
+ * NFSv4 State
+ */
+#ifdef CONFIG_NFSD_V4
+void nfs4_state_init(void);
+void nfs4_state_shutdown(void);
+#else
+void static inline nfs4_state_init(void){}
+void static inline nfs4_state_shutdown(void){}
+#endif
+
 /*
  * lockd binding
  */
@@ -162,6 +173,7 @@
 #define	nfserr_bad_cookie	__constant_htonl(NFSERR_BAD_COOKIE)
 #define	nfserr_same		__constant_htonl(NFSERR_SAME)
 #define	nfserr_clid_inuse	__constant_htonl(NFSERR_CLID_INUSE)
+#define	nfserr_stale_clientid	__constant_htonl(NFSERR_STALE_CLIENTID)
 #define	nfserr_resource		__constant_htonl(NFSERR_RESOURCE)
 #define	nfserr_nofilehandle	__constant_htonl(NFSERR_NOFILEHANDLE)
 #define	nfserr_minor_vers_mismatch	__constant_htonl(NFSERR_MINOR_VERS_MISMATCH)
diff -Nru a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/linux/nfsd/state.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,63 @@
+/*
+ *  linux/include/nfsd/state.h
+ *
+ *  Copyright (c) 2001 The Regents of the University of Michigan.
+ *  All rights reserved.
+ *
+ *  Kendrick Smith <kmsmith@umich.edu>
+ *  Andy Adamson <andros@umich.edu>
+ *  
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *  
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. Neither the name of the University nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef _NFSD4_STATE_H
+#define _NFSD4_STATE_H
+
+#include <linux/list.h>
+
+#define NFSD4_CLIENT_MAXNAME 1024
+
+extern int nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_setclientid *setclid);
+
+/*
+ * struct nfs4_client - one per client.  Clientids live here.
+ * 	o Each nfs4_client is hashed by clientid.
+ *
+ * 	o Each nfs4_clients is also hashed by name 
+ * 	  (the opaque quantity initially sent by the client to identify itself).
+ */
+struct nfs4_client {
+	struct list_head	cl_idhash; 	/* hash by cl_clientid.id */
+	struct list_head	cl_strhash; 	/* hash by cl_name */
+	struct xdr_netobj	cl_name; 	/* id generated by client */
+	nfs4_verifier		cl_verifier; 	/* generated by client */
+	u32			cl_addr; 	/* client ipaddress */
+	struct svc_cred		cl_cred; 	/* setclientid principal */
+	clientid_t		cl_clientid;	/* generated by server */
+	nfs4_verifier		cl_confirm;	/* generated by server */
+};
+#endif   /* NFSD4_STATE_H */
diff -Nru a/include/linux/nfsd/syscall.h b/include/linux/nfsd/syscall.h
--- a/include/linux/nfsd/syscall.h	Sat Apr 19 19:51:51 2003
+++ b/include/linux/nfsd/syscall.h	Sat Apr 19 19:51:51 2003
@@ -91,6 +91,13 @@
 		struct nfsctl_export	u_export;
 		struct nfsctl_fdparm	u_getfd;
 		struct nfsctl_fsparm	u_getfs;
+		/*
+		 * The following dummy member is needed to preserve binary compatibility
+		 * on platforms where alignof(void*)>alignof(int).  It's needed because
+		 * this union used to contain a member (u_umap) which contained a
+		 * pointer.
+		 */
+		void *u_ptr;
 	} u;
 #define ca_svc		u.u_svc
 #define ca_client	u.u_client
@@ -109,7 +116,7 @@
 /*
  * Kernel syscall implementation.
  */
-extern asmlinkage long	sys_nfsservctl(int, struct nfsctl_arg *, void *);
+extern asmlinkage long	sys_nfsservctl(int, struct nfsctl_arg __user *, void __user *);
 extern int		exp_addclient(struct nfsctl_client *ncp);
 extern int		exp_delclient(struct nfsctl_client *ncp);
 extern int		exp_export(struct nfsctl_export *nxp);
diff -Nru a/include/linux/page-flags.h b/include/linux/page-flags.h
--- a/include/linux/page-flags.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/page-flags.h	Sat Apr 19 19:51:49 2003
@@ -75,6 +75,7 @@
 #define PG_reclaim		18	/* To be reclaimed asap */
 #define PG_compound		19	/* Part of a compound page */
 
+
 /*
  * Global page accounting.  One instance per CPU.  Only unsigned longs are
  * allowed.
@@ -82,8 +83,8 @@
 struct page_state {
 	unsigned long nr_dirty;		/* Dirty writeable pages */
 	unsigned long nr_writeback;	/* Pages under writeback */
+	unsigned long nr_unstable;	/* NFS unstable pages */
 	unsigned long nr_page_table_pages;/* Pages used for pagetables */
-	unsigned long nr_reverse_maps;	/* includes PageDirect */
 	unsigned long nr_mapped;	/* mapped into pagetables */
 	unsigned long nr_slab;		/* In slab */
 #define GET_PAGE_STATE_LAST nr_slab
@@ -131,6 +132,7 @@
 
 #define inc_page_state(member)	mod_page_state(member, 1UL)
 #define dec_page_state(member)	mod_page_state(member, 0UL - 1)
+#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	Sat Apr 19 19:51:27 2003
+++ b/include/linux/pagemap.h	Sat Apr 19 19:51:27 2003
@@ -169,7 +169,7 @@
 /*
  * Fault a userspace page into pagetables.  Return non-zero on a fault.
  *
- * FIXME: this assumes that two userspace pages are always sufficient.  That's
+ * This assumes that two userspace pages are always sufficient.  That's
  * not true if PAGE_CACHE_SIZE > PAGE_SIZE.
  */
 static inline int fault_in_pages_writeable(char *uaddr, int size)
diff -Nru a/include/linux/pci_ids.h b/include/linux/pci_ids.h
--- a/include/linux/pci_ids.h	Sat Apr 19 19:51:46 2003
+++ b/include/linux/pci_ids.h	Sat Apr 19 19:51:46 2003
@@ -287,6 +287,7 @@
 #define PCI_DEVICE_ID_ATI_RADEON_Ie	0x4965
 #define PCI_DEVICE_ID_ATI_RADEON_If	0x4966
 #define PCI_DEVICE_ID_ATI_RADEON_Ig	0x4967
+#define PCI_DEVICE_ID_ATI_RADEON_QM	0x514d
 /* Radeon R300 (9700) */
 #define PCI_DEVICE_ID_ATI_RADEON_ND	0x4e44
 #define PCI_DEVICE_ID_ATI_RADEON_NE	0x4e45
@@ -1074,6 +1075,7 @@
 #define PCI_DEVICE_ID_TTI_HPT374	0x0008
 
 #define PCI_VENDOR_ID_VIA		0x1106
+#define PCI_DEVICE_ID_VIA_P4X600	0x0198
 #define PCI_DEVICE_ID_VIA_8363_0	0x0305 
 #define PCI_DEVICE_ID_VIA_8371_0	0x0391
 #define PCI_DEVICE_ID_VIA_8501_0	0x0501
@@ -1113,11 +1115,19 @@
 #define PCI_DEVICE_ID_VIA_8653_0	0x3101
 #define PCI_DEVICE_ID_VIA_8622		0x3102 
 #define PCI_DEVICE_ID_VIA_8233C_0	0x3109
-#define PCI_DEVICE_ID_VIA_8361		0x3112 
+#define PCI_DEVICE_ID_VIA_8361		0x3112
+#define PCI_DEVICE_ID_VIA_KM266		0x3116
+#define PCI_DEVICE_ID_VIA_CLE266	0x3123
+#define PCI_DEVICE_ID_VIA_8753_0	0x3128
 #define PCI_DEVICE_ID_VIA_8233A		0x3147
+#define PCI_DEVICE_ID_VIA_8752		0x3148
+#define PCI_DEVICE_ID_VIA_KN266		0x3156
 #define PCI_DEVICE_ID_VIA_8754		0x3168
 #define PCI_DEVICE_ID_VIA_8235		0x3177
+#define PCI_DEVICE_ID_VIA_P4N333	0x3178
 #define PCI_DEVICE_ID_VIA_8377_0	0x3189
+#define PCI_DEVICE_ID_VIA_KM400		0x3205
+#define PCI_DEVICE_ID_VIA_P4M400	0x3209
 #define PCI_DEVICE_ID_VIA_86C100A	0x6100
 #define PCI_DEVICE_ID_VIA_8231		0x8231
 #define PCI_DEVICE_ID_VIA_8231_4	0x8235
@@ -1742,6 +1752,9 @@
 #define PCI_VENDOR_ID_AKS		0x416c
 #define PCI_DEVICE_ID_AKS_ALADDINCARD	0x0100
 #define PCI_DEVICE_ID_AKS_CPC		0x0200
+
+#define PCI_VENDOR_ID_REDCREEK		0x4916
+#define PCI_DEVICE_ID_RC45		0x1960
 
 #define PCI_VENDOR_ID_NETVIN		0x4a14
 #define PCI_DEVICE_ID_NETVIN_NV5000SC	0x5000
diff -Nru a/include/linux/percpu_counter.h b/include/linux/percpu_counter.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/linux/percpu_counter.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,100 @@
+/*
+ * A simple "approximate counter" for use in ext2 and ext3 superblocks.
+ *
+ * WARNING: these things are HUGE.  4 kbytes per counter on 32-way P4.
+ */
+
+#include <linux/config.h>
+#include <linux/spinlock.h>
+#include <linux/smp.h>
+#include <linux/preempt.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];
+};
+
+#if NR_CPUS >= 16
+#define FBC_BATCH	(NR_CPUS*2)
+#else
+#define FBC_BATCH	(NR_CPUS*4)
+#endif
+
+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;
+}
+
+void percpu_counter_mod(struct percpu_counter *fbc, long amount);
+
+static inline long percpu_counter_read(struct percpu_counter *fbc)
+{
+	return fbc->count;
+}
+
+/*
+ * It is possible for the percpu_counter_read() to return a small negative
+ * number for some counter which should never be negative.
+ */
+static inline long percpu_counter_read_positive(struct percpu_counter *fbc)
+{
+	long ret = fbc->count;
+
+	barrier();		/* Prevent reloads of fbc->count */
+	if (ret > 0)
+		return ret;
+	return 1;
+}
+
+#else
+
+struct percpu_counter {
+	long count;
+};
+
+static inline void percpu_counter_init(struct percpu_counter *fbc)
+{
+	fbc->count = 0;
+}
+
+static inline void
+percpu_counter_mod(struct percpu_counter *fbc, long amount)
+{
+	preempt_disable();
+	fbc->count += amount;
+	preempt_enable();
+}
+
+static inline long percpu_counter_read(struct percpu_counter *fbc)
+{
+	return fbc->count;
+}
+
+static inline long percpu_counter_read_positive(struct percpu_counter *fbc)
+{
+	return fbc->count;
+}
+
+#endif	/* CONFIG_SMP */
+
+static inline void percpu_counter_inc(struct percpu_counter *fbc)
+{
+	percpu_counter_mod(fbc, 1);
+}
+
+static inline void percpu_counter_dec(struct percpu_counter *fbc)
+{
+	percpu_counter_mod(fbc, -1);
+}
diff -Nru a/include/linux/pnp.h b/include/linux/pnp.h
--- a/include/linux/pnp.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/pnp.h	Sat Apr 19 19:51:50 2003
@@ -274,12 +274,31 @@
 #define pnp_can_configure(dev)	((!(dev)->active) && ((dev)->config_mode & PNP_CONFIG_AUTO) && \
 				 ((dev)->capabilities & PNP_CONFIGURABLE))
 
+#ifdef CONFIG_ISAPNP
+extern struct pnp_protocol isapnp_protocol;
+#define pnp_device_is_isapnp(dev) ((dev)->protocol == (&isapnp_protocol))
+#else
+#define pnp_device_is_isapnp(dev) 0
+#endif
+
+#ifdef CONFIG_PNPBIOS
+extern struct pnp_protocol pnpbios_protocol;
+#define pnp_device_is_pnpbios(dev) ((dev)->protocol == (&pnpbios_protocol))
+#else
+#define pnp_device_is_pnpbios(dev) 0
+#endif
+
+
 /* status */
 #define PNP_READY		0x0000
 #define PNP_ATTACHED		0x0001
 #define PNP_BUSY		0x0002
 #define PNP_FAULTY		0x0004
 
+/* isapnp specific macros */
+
+#define isapnp_card_number(dev)	((dev)->card ? (dev)->card->number : -1)
+#define isapnp_csn_number(dev)  ((dev)->number)
 
 /*
  * Driver Management
diff -Nru a/include/linux/poll.h b/include/linux/poll.h
--- a/include/linux/poll.h	Sat Apr 19 19:51:50 2003
+++ b/include/linux/poll.h	Sat Apr 19 19:51:50 2003
@@ -67,7 +67,7 @@
  * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned.
  */
 static inline
-int get_fd_set(unsigned long nr, void *ufdset, unsigned long *fdset)
+int get_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
 {
 	nr = FDS_BYTES(nr);
 	if (ufdset) {
@@ -82,7 +82,7 @@
 }
 
 static inline
-void set_fd_set(unsigned long nr, void *ufdset, unsigned long *fdset)
+void set_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
 {
 	if (ufdset)
 		__copy_to_user(ufdset, fdset, FDS_BYTES(nr));
diff -Nru a/include/linux/quota.h b/include/linux/quota.h
--- a/include/linux/quota.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/quota.h	Sat Apr 19 19:51:49 2003
@@ -250,6 +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 *);
 };
 
 /* Operations handling requests from userspace */
@@ -303,6 +304,7 @@
 
 int register_quota_format(struct quota_format_type *fmt);
 void unregister_quota_format(struct quota_format_type *fmt);
+void init_dquot_operations(struct dquot_operations *fsdqops);
 
 #else
 
diff -Nru a/include/linux/radix-tree.h b/include/linux/radix-tree.h
--- a/include/linux/radix-tree.h	Sat Apr 19 19:51:29 2003
+++ b/include/linux/radix-tree.h	Sat Apr 19 19:51:29 2003
@@ -43,7 +43,7 @@
 
 extern int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
 extern void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
-extern int radix_tree_delete(struct radix_tree_root *, unsigned long);
+extern void *radix_tree_delete(struct radix_tree_root *, unsigned long);
 extern unsigned int
 radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
 			unsigned long first_index, unsigned int max_items);
diff -Nru a/include/linux/scc.h b/include/linux/scc.h
--- a/include/linux/scc.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/scc.h	Sat Apr 19 19:51:49 2003
@@ -244,6 +244,9 @@
 	/* Timer */
 	struct timer_list tx_t;		/* tx timer for this channel */
 	struct timer_list tx_wdog;	/* tx watchdogs */
+	
+	/* Channel lock */
+	spinlock_t	lock;		/* Channel guard lock */
 };
 
 #endif /* defined(__KERNEL__) */
diff -Nru a/include/linux/sched.h b/include/linux/sched.h
--- a/include/linux/sched.h	Sat Apr 19 19:51:28 2003
+++ b/include/linux/sched.h	Sat Apr 19 19:51:28 2003
@@ -629,7 +629,7 @@
 extern int allow_signal(int);
 extern task_t *child_reaper;
 
-extern int do_execve(char *, char **, char **, struct pt_regs *);
+extern int do_execve(char *, char __user * __user *, char __user * __user *, struct pt_regs *);
 extern struct task_struct *do_fork(unsigned long, unsigned long, struct pt_regs *, unsigned long, int *, int *);
 
 #ifdef CONFIG_SMP
@@ -686,7 +686,11 @@
 
 extern void unhash_process(struct task_struct *p);
 
-/* Protects ->fs, ->files, ->mm, and synchronises with wait4().  Nests inside tasklist_lock */
+/* Protects ->fs, ->files, ->mm, and synchronises with wait4().
+ * Nests both inside and outside of read_lock(&tasklist_lock).
+ * It must not be nested with write_lock_irq(&tasklist_lock),
+ * neither inside nor outside.
+ */
 static inline void task_lock(struct task_struct *p)
 {
 	spin_lock(&p->alloc_lock);
diff -Nru a/include/linux/sysctl.h b/include/linux/sysctl.h
--- a/include/linux/sysctl.h	Sat Apr 19 19:51:48 2003
+++ b/include/linux/sysctl.h	Sat Apr 19 19:51:48 2003
@@ -129,6 +129,7 @@
 	KERN_CADPID=54,		/* int: PID of the process to notify on CAD */
 	KERN_PIDMAX=55,		/* int: PID # limit */
   	KERN_CORE_PATTERN=56,	/* string: pattern for core-file names */
+	KERN_PANIC_ON_OOPS=57,  /* int: whether we will panic on an oops */
 };
 
 
@@ -678,8 +679,8 @@
 typedef struct ctl_table ctl_table;
 
 typedef int ctl_handler (ctl_table *table, int *name, int nlen,
-			 void *oldval, size_t *oldlenp,
-			 void *newval, size_t newlen, 
+			 void __user *oldval, size_t __user *oldlenp,
+			 void __user *newval, size_t newlen, 
 			 void **context);
 
 typedef int proc_handler (ctl_table *ctl, int write, struct file * filp,
@@ -706,8 +707,8 @@
 
 extern int do_sysctl_strategy (ctl_table *table, 
 			       int *name, int nlen,
-			       void *oldval, size_t *oldlenp,
-			       void *newval, size_t newlen, void ** context);
+			       void __user *oldval, size_t __user *oldlenp,
+			       void __user *newval, size_t newlen, void ** context);
 
 extern ctl_handler sysctl_string;
 extern ctl_handler sysctl_intvec;
diff -Nru a/include/linux/tcp.h b/include/linux/tcp.h
--- a/include/linux/tcp.h	Sat Apr 19 19:51:47 2003
+++ b/include/linux/tcp.h	Sat Apr 19 19:51:47 2003
@@ -17,6 +17,7 @@
 #ifndef _LINUX_TCP_H
 #define _LINUX_TCP_H
 
+#include <linux/config.h>
 #include <linux/skbuff.h>
 #include <asm/byteorder.h>
 #include <net/sock.h>
diff -Nru a/include/linux/time.h b/include/linux/time.h
--- a/include/linux/time.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/time.h	Sat Apr 19 19:51:49 2003
@@ -31,7 +31,7 @@
  * Have the 32 bit jiffies value wrap 5 minutes after boot
  * so jiffies wrap bugs show up earlier.
  */
-#define INITIAL_JIFFIES ((unsigned int) (-300*HZ))
+#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))
 
 /*
  * Change timeval to jiffies, trying to avoid the
diff -Nru a/include/linux/tty_driver.h b/include/linux/tty_driver.h
--- a/include/linux/tty_driver.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/tty_driver.h	Sat Apr 19 19:51:49 2003
@@ -172,6 +172,9 @@
 			  int count, int *eof, void *data);
 	int (*write_proc)(struct file *file, const char *buffer,
 			  unsigned long count, void *data);
+	int (*tiocmget)(struct tty_struct *tty, struct file *file);
+	int (*tiocmset)(struct tty_struct *tty, struct file *file,
+			unsigned int set, unsigned int clear);
 	struct list_head tty_drivers;
 };
 
diff -Nru a/include/linux/udp.h b/include/linux/udp.h
--- a/include/linux/udp.h	Sat Apr 19 19:51:29 2003
+++ b/include/linux/udp.h	Sat Apr 19 19:51:29 2003
@@ -17,6 +17,7 @@
 #ifndef _LINUX_UDP_H
 #define _LINUX_UDP_H
 
+#include <linux/config.h>
 #include <asm/byteorder.h>
 #include <net/sock.h>
 #include <linux/ip.h>
diff -Nru a/include/linux/uio.h b/include/linux/uio.h
--- a/include/linux/uio.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/uio.h	Sat Apr 19 19:51:49 2003
@@ -1,6 +1,7 @@
 #ifndef __LINUX_UIO_H
 #define __LINUX_UIO_H
 
+#include <linux/compiler.h>
 #include <linux/types.h>
 
 /*
@@ -18,7 +19,7 @@
 
 struct iovec
 {
-	void *iov_base;		/* BSD uses caddr_t (1003.1g requires void *) */
+	void __user *iov_base;	/* BSD uses caddr_t (1003.1g requires void *) */
 	__kernel_size_t iov_len; /* Must be size_t (1003.1g) */
 };
 
diff -Nru a/include/linux/workqueue.h b/include/linux/workqueue.h
--- a/include/linux/workqueue.h	Sat Apr 19 19:51:49 2003
+++ b/include/linux/workqueue.h	Sat Apr 19 19:51:49 2003
@@ -63,5 +63,15 @@
 
 extern void init_workqueues(void);
 
+/*
+ * Kill off a pending schedule_delayed_work().  Note that the work callback
+ * function may still be running on return from cancel_delayed_work().  Run
+ * flush_scheduled_work() to wait on it.
+ */
+static inline int cancel_delayed_work(struct work_struct *work)
+{
+	return del_timer_sync(&work->timer);
+}
+
 #endif
 
diff -Nru a/include/media/saa7146.h b/include/media/saa7146.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/media/saa7146.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,431 @@
+#ifndef __SAA7146__
+#define __SAA7146__
+
+#include <linux/version.h>	/* for version macros */
+#include <linux/module.h>	/* for module-version */
+#include <linux/delay.h>	/* for delay-stuff */
+#include <linux/slab.h>		/* for kmalloc/kfree */
+#include <linux/pci.h>		/* for pci-config-stuff, vendor ids etc. */
+#include <linux/wrapper.h>	/* for mem_map_reserve */
+#include <linux/init.h>		/* for "__init" */
+#include <linux/interrupt.h>	/* for IMMEDIATE_BH */
+#include <linux/kmod.h>		/* for kernel module loader */
+#include <linux/i2c.h>		/* for i2c subsystem */
+#include <asm/io.h>		/* for accessing devices */
+#include <linux/stringify.h>
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
+	#include "compat.h"
+#endif
+
+#define SAA7146_VERSION_CODE KERNEL_VERSION(0,5,0)
+
+#define saa7146_write(sxy,adr,dat)    writel((dat),(sxy->mem+(adr)))
+#define saa7146_read(sxy,adr)         readl(sxy->mem+(adr))
+
+extern unsigned int saa7146_debug;
+
+//#define DEBUG_PROLOG printk("(0x%08x)(0x%08x) %s: %s(): ",(dev==0?-1:(dev->mem==0?-1:saa7146_read(dev,RPS_ADDR0))),(dev==0?-1:(dev->mem==0?-1:saa7146_read(dev,IER))),__stringify(KBUILD_MODNAME),__FUNCTION__)
+
+#ifndef DEBUG_VARIABLE
+	#define DEBUG_VARIABLE saa7146_debug
+#endif
+
+#define DEBUG_PROLOG printk("%s: %s(): ",__stringify(KBUILD_MODNAME),__FUNCTION__)
+#define DEB_S(x)    if (0!=(DEBUG_VARIABLE&0x01)) { DEBUG_PROLOG; printk x; } /* simple debug messages */
+#define DEB_D(x)    if (0!=(DEBUG_VARIABLE&0x02)) { DEBUG_PROLOG; printk x; } /* more detailed debug messages */
+#define DEB_EE(x)   if (0!=(DEBUG_VARIABLE&0x04)) { DEBUG_PROLOG; printk x; } /* print enter and exit of functions */
+#define DEB_I2C(x)  if (0!=(DEBUG_VARIABLE&0x08)) { DEBUG_PROLOG; printk x; } /* i2c debug messages */
+#define DEB_VBI(x)  if (0!=(DEBUG_VARIABLE&0x10)) { DEBUG_PROLOG; printk x; } /* vbi debug messages */
+#define DEB_INT(x)  if (0!=(DEBUG_VARIABLE&0x20)) { DEBUG_PROLOG; printk x; } /* interrupt debug messages */
+#define DEB_CAP(x)  if (0!=(DEBUG_VARIABLE&0x40)) { DEBUG_PROLOG; printk x; } /* capture debug messages */
+
+#define ERR(x) { DEBUG_PROLOG; printk x; }
+#define INFO(x) { printk("%s: ",__stringify(KBUILD_MODNAME)); printk x; }
+
+#define IER_DISABLE(x,y) \
+	saa7146_write(x, IER, saa7146_read(x, IER) & ~(y));
+#define IER_ENABLE(x,y) \
+	saa7146_write(x, IER, saa7146_read(x, IER) | (y));
+
+struct saa7146_dev;
+struct saa7146_extension;
+struct saa7146_vv;
+
+/* saa7146 page table */
+struct saa7146_pgtable {
+	unsigned int	size;
+	u32 		*cpu;
+	dma_addr_t	dma;
+	/* used for offsets for u,v planes for planar capture modes */
+	unsigned long	offset;
+};
+
+struct saa7146_pci_extension_data {
+	struct saa7146_extension *ext;
+	void *ext_priv;			/* most likely a name string */
+};
+
+#define MAKE_EXTENSION_PCI(x_var, x_vendor, x_device)		\
+	{							\
+		.vendor    = PCI_VENDOR_ID_PHILIPS,		\
+		.device	   = PCI_DEVICE_ID_PHILIPS_SAA7146,	\
+		.subvendor = x_vendor,				\
+		.subdevice = x_device,				\
+		.driver_data = (unsigned long)& x_var,		\
+	}
+
+struct saa7146_extension
+{
+	char	name[32];		/* name of the device */
+#define SAA7146_USE_I2C_IRQ	0x1
+	int	flags;
+	
+	struct saa7146_ext_vv	*ext_vv_data;
+	
+	/* pairs of subvendor and subdevice ids for
+	   supported devices, last entry 0xffff, 0xfff */
+	struct module *module;
+	struct pci_driver driver;
+	struct pci_device_id *pci_tbl;
+	
+	/* extension functions */
+	int (*probe)(struct saa7146_dev *);
+	int (*attach)(struct saa7146_dev *, struct saa7146_pci_extension_data *);
+	int (*detach)(struct saa7146_dev*);
+
+	u32	irq_mask;	/* mask to indicate, which irq-events are handled by the extension */
+	void 	(*irq_func)(struct saa7146_dev*, u32* irq_mask);
+};
+
+struct saa7146_dev
+{
+	struct module			*module;
+
+	struct list_head		item;
+
+	/* different device locks */
+       	spinlock_t                 	slock;
+        struct semaphore           	lock;
+
+	unsigned char			*mem;		/* pointer to mapped IO memory */
+	int				revision;	/* chip revision; needed for bug-workarounds*/
+
+	/* pci-device & irq stuff*/
+	char				name[32];
+	struct pci_dev			*pci;
+	u32				int_todo;
+       	spinlock_t			int_slock;
+	
+	/* extension handling */
+	struct saa7146_extension	*ext;		/* indicates if handled by extension */
+	void				*ext_priv;	/* pointer for extension private use (most likely some private data) */
+
+	/* per device video/vbi informations (if available) */
+	struct saa7146_vv	*vv_data;
+	void (*vv_callback)(struct saa7146_dev *dev, unsigned long status);
+
+	/* i2c-stuff */
+        struct semaphore	i2c_lock;
+	u32			i2c_bitrate;
+	u32			*i2c_mem;	/* pointer to i2c memory */
+	wait_queue_head_t	i2c_wq;
+	int			i2c_op;
+	
+	/* memories */
+	u32			*rps0;
+	u32			*rps1;
+};
+
+/* from saa7146_i2c.c */
+int saa7146_i2c_adapter_prepare(struct saa7146_dev *dev, struct i2c_adapter *i2c_adapter, u32 bitrate);
+int saa7146_i2c_transfer(struct saa7146_dev *saa, const struct i2c_msg msgs[], int num,  int retries);
+
+/* from saa7146_core.c */
+extern struct list_head saa7146_devices;
+extern struct semaphore saa7146_devices_lock;
+int saa7146_register_extension(struct saa7146_extension*);
+int saa7146_unregister_extension(struct saa7146_extension*);
+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 );
+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);
+
+/* some memory sizes */
+#define SAA7146_I2C_MEM		( 1*PAGE_SIZE)
+#define SAA7146_RPS_MEM		( 1*PAGE_SIZE)
+
+/* some i2c constants */
+#define SAA7146_I2C_TIMEOUT	100	/* i2c-timeout-value in ms */
+#define SAA7146_I2C_RETRIES 	3	/* how many times shall we retry an i2c-operation? */
+#define SAA7146_I2C_DELAY 	5	/* time we wait after certain i2c-operations */
+
+/* unsorted defines */
+#define ME1    0x0000000800
+#define PV1    0x0000000008
+
+/* gpio defines */
+#define SAA7146_GPIO_INPUT 0x00
+#define SAA7146_GPIO_IRQHI 0x10
+#define SAA7146_GPIO_IRQLO 0x20
+#define SAA7146_GPIO_IRQHL 0x30
+#define SAA7146_GPIO_OUTLO 0x40
+#define SAA7146_GPIO_OUTHI 0x50
+
+/* define for the register programming sequencer (rps) */
+#define CMD_NOP		0x00000000  /* No operation */
+#define CMD_CLR_EVENT	0x00000000  /* Clear event */
+#define CMD_SET_EVENT	0x10000000  /* Set signal event */
+#define CMD_PAUSE	0x20000000  /* Pause */
+#define CMD_CHECK_LATE	0x30000000  /* Check late */
+#define CMD_UPLOAD	0x40000000  /* Upload */
+#define CMD_STOP	0x50000000  /* Stop */
+#define CMD_INTERRUPT	0x60000000  /* Interrupt */
+#define CMD_JUMP	0x80000000  /* Jump */
+#define CMD_WR_REG	0x90000000  /* Write (load) register */
+#define CMD_RD_REG	0xa0000000  /* Read (store) register */
+#define CMD_WR_REG_MASK	0xc0000000  /* Write register with mask */
+
+#define CMD_OAN		MASK_27
+#define CMD_INV		MASK_26
+#define CMD_SIG4	MASK_25
+#define CMD_SIG3	MASK_24
+#define CMD_SIG2	MASK_23
+#define CMD_SIG1	MASK_22
+#define CMD_SIG0	MASK_21
+#define CMD_O_FID_B	MASK_14
+#define CMD_E_FID_B	MASK_13
+#define CMD_O_FID_A	MASK_12
+#define CMD_E_FID_A	MASK_11
+
+/* some events and command modifiers for rps1 squarewave generator */
+#define EVT_HS          (1<<15)     // Source Line Threshold reached
+#define EVT_VBI_B       (1<<9)      // VSYNC Event
+#define RPS_OAN         (1<<27)     // 1: OR events, 0: AND events
+#define RPS_INV         (1<<26)     // Invert (compound) event
+#define GPIO3_MSK       0xFF000000  // GPIO #3 control bits
+
+/* Bit mask constants */
+#define MASK_00   0x00000001    /* Mask value for bit 0 */
+#define MASK_01   0x00000002    /* Mask value for bit 1 */
+#define MASK_02   0x00000004    /* Mask value for bit 2 */
+#define MASK_03   0x00000008    /* Mask value for bit 3 */
+#define MASK_04   0x00000010    /* Mask value for bit 4 */
+#define MASK_05   0x00000020    /* Mask value for bit 5 */
+#define MASK_06   0x00000040    /* Mask value for bit 6 */
+#define MASK_07   0x00000080    /* Mask value for bit 7 */
+#define MASK_08   0x00000100    /* Mask value for bit 8 */
+#define MASK_09   0x00000200    /* Mask value for bit 9 */
+#define MASK_10   0x00000400    /* Mask value for bit 10 */
+#define MASK_11   0x00000800    /* Mask value for bit 11 */
+#define MASK_12   0x00001000    /* Mask value for bit 12 */
+#define MASK_13   0x00002000    /* Mask value for bit 13 */
+#define MASK_14   0x00004000    /* Mask value for bit 14 */
+#define MASK_15   0x00008000    /* Mask value for bit 15 */
+#define MASK_16   0x00010000    /* Mask value for bit 16 */
+#define MASK_17   0x00020000    /* Mask value for bit 17 */
+#define MASK_18   0x00040000    /* Mask value for bit 18 */
+#define MASK_19   0x00080000    /* Mask value for bit 19 */
+#define MASK_20   0x00100000    /* Mask value for bit 20 */
+#define MASK_21   0x00200000    /* Mask value for bit 21 */
+#define MASK_22   0x00400000    /* Mask value for bit 22 */
+#define MASK_23   0x00800000    /* Mask value for bit 23 */
+#define MASK_24   0x01000000    /* Mask value for bit 24 */
+#define MASK_25   0x02000000    /* Mask value for bit 25 */
+#define MASK_26   0x04000000    /* Mask value for bit 26 */
+#define MASK_27   0x08000000    /* Mask value for bit 27 */
+#define MASK_28   0x10000000    /* Mask value for bit 28 */
+#define MASK_29   0x20000000    /* Mask value for bit 29 */
+#define MASK_30   0x40000000    /* Mask value for bit 30 */
+#define MASK_31   0x80000000    /* Mask value for bit 31 */
+
+#define MASK_B0   0x000000ff    /* Mask value for byte 0 */
+#define MASK_B1   0x0000ff00    /* Mask value for byte 1 */
+#define MASK_B2   0x00ff0000    /* Mask value for byte 2 */
+#define MASK_B3   0xff000000    /* Mask value for byte 3 */
+
+#define MASK_W0   0x0000ffff    /* Mask value for word 0 */
+#define MASK_W1   0xffff0000    /* Mask value for word 1 */
+
+#define MASK_PA   0xfffffffc    /* Mask value for physical address */
+#define MASK_PR   0xfffffffe 	/* Mask value for protection register */
+#define MASK_ER   0xffffffff    /* Mask value for the entire register */
+
+#define MASK_NONE 0x00000000    /* No mask */
+
+/* register aliases */
+#define BASE_ODD1         0x00  /* Video DMA 1 registers  */
+#define BASE_EVEN1        0x04
+#define PROT_ADDR1        0x08
+#define PITCH1            0x0C
+#define BASE_PAGE1        0x10  /* Video DMA 1 base page */
+#define NUM_LINE_BYTE1    0x14
+
+#define BASE_ODD2         0x18  /* Video DMA 2 registers */
+#define BASE_EVEN2        0x1C
+#define PROT_ADDR2        0x20
+#define PITCH2            0x24
+#define BASE_PAGE2        0x28  /* Video DMA 2 base page */
+#define NUM_LINE_BYTE2    0x2C
+
+#define BASE_ODD3         0x30  /* Video DMA 3 registers */
+#define BASE_EVEN3        0x34
+#define PROT_ADDR3        0x38
+#define PITCH3            0x3C         
+#define BASE_PAGE3        0x40  /* Video DMA 3 base page */
+#define NUM_LINE_BYTE3    0x44
+
+#define PCI_BT_V1         0x48  /* Video/FIFO 1 */
+#define PCI_BT_V2         0x49  /* Video/FIFO 2 */
+#define PCI_BT_V3         0x4A  /* Video/FIFO 3 */
+#define PCI_BT_DEBI       0x4B  /* DEBI */
+#define PCI_BT_A          0x4C  /* Audio */
+
+#define DD1_INIT          0x50  /* Init setting of DD1 interface */
+
+#define DD1_STREAM_B      0x54  /* DD1 B video data stream handling */
+#define DD1_STREAM_A      0x56  /* DD1 A video data stream handling */
+
+#define BRS_CTRL          0x58  /* BRS control register */
+#define HPS_CTRL          0x5C  /* HPS control register */
+#define HPS_V_SCALE       0x60  /* HPS vertical scale */
+#define HPS_V_GAIN        0x64  /* HPS vertical ACL and gain */
+#define HPS_H_PRESCALE    0x68  /* HPS horizontal prescale   */
+#define HPS_H_SCALE       0x6C  /* HPS horizontal scale */
+#define BCS_CTRL          0x70  /* BCS control */
+#define CHROMA_KEY_RANGE  0x74
+#define CLIP_FORMAT_CTRL  0x78  /* HPS outputs formats & clipping */
+
+#define DEBI_CONFIG       0x7C
+#define DEBI_COMMAND      0x80
+#define DEBI_PAGE         0x84
+#define DEBI_AD           0x88	
+
+#define I2C_TRANSFER      0x8C	
+#define I2C_STATUS        0x90	
+
+#define BASE_A1_IN        0x94	/* Audio 1 input DMA */
+#define PROT_A1_IN        0x98
+#define PAGE_A1_IN        0x9C
+  
+#define BASE_A1_OUT       0xA0  /* Audio 1 output DMA */
+#define PROT_A1_OUT       0xA4
+#define PAGE_A1_OUT       0xA8
+
+#define BASE_A2_IN        0xAC  /* Audio 2 input DMA */
+#define PROT_A2_IN        0xB0
+#define PAGE_A2_IN        0xB4
+
+#define BASE_A2_OUT       0xB8  /* Audio 2 output DMA */
+#define PROT_A2_OUT       0xBC
+#define PAGE_A2_OUT       0xC0
+
+#define RPS_PAGE0         0xC4  /* RPS task 0 page register */
+#define RPS_PAGE1         0xC8  /* RPS task 1 page register */
+
+#define RPS_THRESH0       0xCC  /* HBI threshold for task 0 */
+#define RPS_THRESH1       0xD0  /* HBI threshold for task 1 */
+
+#define RPS_TOV0          0xD4  /* RPS timeout for task 0 */
+#define RPS_TOV1          0xD8  /* RPS timeout for task 1 */
+
+#define IER               0xDC  /* Interrupt enable register */
+
+#define GPIO_CTRL         0xE0  /* GPIO 0-3 register */
+
+#define EC1SSR            0xE4  /* Event cnt set 1 source select */
+#define EC2SSR            0xE8  /* Event cnt set 2 source select */
+#define ECT1R             0xEC  /* Event cnt set 1 thresholds */
+#define ECT2R             0xF0  /* Event cnt set 2 thresholds */
+
+#define ACON1             0xF4
+#define ACON2             0xF8
+
+#define MC1               0xFC   /* Main control register 1 */
+#define MC2               0x100  /* Main control register 2  */
+
+#define RPS_ADDR0         0x104  /* RPS task 0 address register */
+#define RPS_ADDR1         0x108  /* RPS task 1 address register */
+
+#define ISR               0x10C  /* Interrupt status register */                                                             
+#define PSR               0x110  /* Primary status register */
+#define SSR               0x114  /* Secondary status register */
+
+#define EC1R              0x118  /* Event counter set 1 register */
+#define EC2R              0x11C  /* Event counter set 2 register */         
+
+#define PCI_VDP1          0x120  /* Video DMA pointer of FIFO 1 */
+#define PCI_VDP2          0x124  /* Video DMA pointer of FIFO 2 */
+#define PCI_VDP3          0x128  /* Video DMA pointer of FIFO 3 */
+#define PCI_ADP1          0x12C  /* Audio DMA pointer of audio out 1 */
+#define PCI_ADP2          0x130  /* Audio DMA pointer of audio in 1 */
+#define PCI_ADP3          0x134  /* Audio DMA pointer of audio out 2 */
+#define PCI_ADP4          0x138  /* Audio DMA pointer of audio in 2 */
+#define PCI_DMA_DDP       0x13C  /* DEBI DMA pointer */
+
+#define LEVEL_REP         0x140,
+#define A_TIME_SLOT1      0x180,  /* from 180 - 1BC */
+#define A_TIME_SLOT2      0x1C0,  /* from 1C0 - 1FC */
+
+/* isr masks */
+#define SPCI_PPEF       0x80000000  /* PCI parity error */
+#define SPCI_PABO       0x40000000  /* PCI access error (target or master abort) */
+#define SPCI_PPED       0x20000000  /* PCI parity error on 'real time data' */
+#define SPCI_RPS_I1     0x10000000  /* Interrupt issued by RPS1 */
+#define SPCI_RPS_I0     0x08000000  /* Interrupt issued by RPS0 */
+#define SPCI_RPS_LATE1  0x04000000  /* RPS task 1 is late */
+#define SPCI_RPS_LATE0  0x02000000  /* RPS task 0 is late */
+#define SPCI_RPS_E1     0x01000000  /* RPS error from task 1 */
+#define SPCI_RPS_E0     0x00800000  /* RPS error from task 0 */
+#define SPCI_RPS_TO1    0x00400000  /* RPS timeout task 1 */
+#define SPCI_RPS_TO0    0x00200000  /* RPS timeout task 0 */
+#define SPCI_UPLD       0x00100000  /* RPS in upload */
+#define SPCI_DEBI_S     0x00080000  /* DEBI status */
+#define SPCI_DEBI_E     0x00040000  /* DEBI error */
+#define SPCI_IIC_S      0x00020000  /* I2C status */
+#define SPCI_IIC_E      0x00010000  /* I2C error */
+#define SPCI_A2_IN      0x00008000  /* Audio 2 input DMA protection / limit */
+#define SPCI_A2_OUT     0x00004000  /* Audio 2 output DMA protection / limit */
+#define SPCI_A1_IN      0x00002000  /* Audio 1 input DMA protection / limit */
+#define SPCI_A1_OUT     0x00001000  /* Audio 1 output DMA protection / limit */
+#define SPCI_AFOU       0x00000800  /* Audio FIFO over- / underflow */
+#define SPCI_V_PE       0x00000400  /* Video protection address */
+#define SPCI_VFOU       0x00000200  /* Video FIFO over- / underflow */
+#define SPCI_FIDA       0x00000100  /* Field ID video port A */
+#define SPCI_FIDB       0x00000080  /* Field ID video port B */
+#define SPCI_PIN3       0x00000040  /* GPIO pin 3 */
+#define SPCI_PIN2       0x00000020  /* GPIO pin 2 */
+#define SPCI_PIN1       0x00000010  /* GPIO pin 1 */
+#define SPCI_PIN0       0x00000008  /* GPIO pin 0 */
+#define SPCI_ECS        0x00000004  /* Event counter 1, 2, 4, 5 */
+#define SPCI_EC3S       0x00000002  /* Event counter 3 */
+#define SPCI_EC0S       0x00000001  /* Event counter 0 */
+
+/* i2c */
+#define	SAA7146_I2C_ABORT	(1<<7)
+#define	SAA7146_I2C_SPERR	(1<<6)
+#define	SAA7146_I2C_APERR	(1<<5)
+#define	SAA7146_I2C_DTERR	(1<<4)
+#define	SAA7146_I2C_DRERR	(1<<3)
+#define	SAA7146_I2C_AL		(1<<2)
+#define	SAA7146_I2C_ERR		(1<<1)
+#define	SAA7146_I2C_BUSY	(1<<0)
+
+#define	SAA7146_I2C_START	(0x3)
+#define	SAA7146_I2C_CONT	(0x2)
+#define	SAA7146_I2C_STOP	(0x1)
+#define	SAA7146_I2C_NOP		(0x0)
+
+#define SAA7146_I2C_BUS_BIT_RATE_6400	(0x500)
+#define SAA7146_I2C_BUS_BIT_RATE_3200	(0x100)
+#define SAA7146_I2C_BUS_BIT_RATE_480	(0x400)
+#define SAA7146_I2C_BUS_BIT_RATE_320	(0x600)
+#define SAA7146_I2C_BUS_BIT_RATE_240	(0x700)
+#define SAA7146_I2C_BUS_BIT_RATE_120	(0x000)
+#define SAA7146_I2C_BUS_BIT_RATE_80	(0x200)
+#define SAA7146_I2C_BUS_BIT_RATE_60	(0x300)
+
+#endif
+
diff -Nru a/include/media/saa7146_vv.h b/include/media/saa7146_vv.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/media/saa7146_vv.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,269 @@
+#ifndef __SAA7146_VV__
+#define __SAA7146_VV__
+
+#include <linux/videodev2.h>
+
+#include <media/saa7146.h>
+#include <media/video-buf.h>
+
+#define MAX_SAA7146_CAPTURE_BUFFERS	32	/* arbitrary */
+#define BUFFER_TIMEOUT     (HZ/2)  /* 0.5 seconds */
+
+struct	saa7146_video_dma {
+	u32 base_odd;
+	u32 base_even;
+	u32 prot_addr;
+	u32 pitch;
+	u32 base_page;
+	u32 num_line_byte;
+};
+
+struct saa7146_format {
+	char	*name;
+	int   	pixelformat;
+	u32	trans;
+	u8	depth;
+	int	swap;
+};
+
+struct saa7146_standard
+{
+	char          *name;
+	v4l2_std_id   id;
+
+	int v_offset;
+	int v_field;
+	int v_calc;
+	
+	int h_offset;
+	int h_pixels;
+	int h_calc;
+	
+	int v_max_out;
+	int h_max_out;
+};
+
+/* buffer for one video/vbi frame */
+struct saa7146_buf {
+	/* common v4l buffer stuff -- must be first */
+	struct videobuf_buffer vb;
+
+	/* saa7146 specific */
+	struct v4l2_pix_format  *fmt;
+	int (*activate)(struct saa7146_dev *dev,
+			struct saa7146_buf *buf,
+			struct saa7146_buf *next);
+
+	/* page tables */
+	struct saa7146_pgtable  pt[3];
+};
+
+struct saa7146_dmaqueue {
+	struct saa7146_dev	*dev;
+	struct saa7146_buf	*curr;
+	struct list_head	queue;
+	struct timer_list	timeout;
+};
+
+struct saa7146_overlay {
+	struct saa7146_fh	*fh;
+	struct v4l2_window	win;
+	struct v4l2_clip	clips[16];
+	int			nclips;
+};
+
+/* per open data */
+struct saa7146_fh {
+	struct saa7146_dev	*dev;
+	/* if this is a vbi or capture open */
+	enum v4l2_buf_type	type;
+
+	/* video overlay */
+	struct saa7146_overlay	ov;
+	
+	/* video capture */
+	struct videobuf_queue	video_q;
+	struct v4l2_pix_format	video_fmt;
+
+	/* vbi capture */
+	struct videobuf_queue	vbi_q;
+	struct v4l2_vbi_format	vbi_fmt;
+	struct timer_list	vbi_read_timeout;
+};
+
+struct saa7146_vv
+{
+	int vbi_minor;
+
+	/* vbi capture */
+	struct saa7146_dmaqueue		vbi_q;
+	/* vbi workaround interrupt queue */
+        wait_queue_head_t		vbi_wq;
+	int				vbi_fieldcount;
+	struct saa7146_fh		*vbi_streaming;
+
+	int video_minor;
+
+	/* video overlay */
+	struct v4l2_framebuffer		ov_fb;
+	struct saa7146_format		*ov_fmt;
+	struct saa7146_overlay		*ov_data;
+
+	/* video capture */
+	struct saa7146_dmaqueue		video_q;
+	struct saa7146_fh		*streaming;
+
+	/* common: fixme? shouldn't this be in saa7146_fh?
+	   (this leads to a more complicated question: shall the driver
+	   store the different settings (for example S_INPUT) for every open
+	   and restore it appropriately, or should all settings be common for
+	   all opens? currently, we do the latter, like all other
+	   drivers do... */
+	struct saa7146_standard	*standard;
+	
+	int	vflip;
+	int 	hflip;
+	int 	current_hps_source;
+	int 	current_hps_sync;
+
+	u32	*clipping;	/* pointer to clipping memory */
+};
+
+#define SAA7146_EXCLUSIVE	0x1
+#define SAA7146_BEFORE		0x2
+#define SAA7146_AFTER		0x4
+
+struct saa7146_extension_ioctls
+{
+	unsigned int	cmd;
+	int		flags;	
+};
+
+/* flags */
+#define SAA7146_EXT_SWAP_ODD_EVEN       0x1     /* needs odd/even fields swapped */
+
+struct saa7146_ext_vv
+{
+	/* informations about the video capabilities of the device */
+	int	inputs;			
+	int	audios;			
+	u32	capabilities;
+	int 	flags;
+
+	/* additionally supported transmission standards */
+	struct saa7146_standard *stds;
+	int num_stds;
+	int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *);
+		
+	struct saa7146_extension_ioctls *ioctls;
+	int (*ioctl)(struct saa7146_dev*, unsigned int cmd, void *arg);
+};
+
+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 (*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 */
+int saa7146_register_device(struct video_device *vid, struct saa7146_dev* dev, char *name, int type);
+int saa7146_unregister_device(struct video_device *vid, struct saa7146_dev* dev);
+void saa7146_buffer_finish(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, int state);
+void saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q,int vbi);
+int saa7146_buffer_queue(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, struct saa7146_buf *buf);
+void saa7146_buffer_timeout(unsigned long data);
+void saa7146_dma_free(struct saa7146_dev *dev,struct saa7146_buf *buf);
+
+int saa7146_vv_init(struct saa7146_dev* dev);
+int saa7146_vv_release(struct saa7146_dev* dev);
+
+
+/* from saa7146_hlp.c */
+void saa7146_set_overlay(struct saa7146_dev *dev, struct saa7146_fh *fh, int v);
+void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next);
+void saa7146_write_out_dma(struct saa7146_dev* dev, int which, struct saa7146_video_dma* vdma) ;
+void saa7146_set_hps_source_and_sync(struct saa7146_dev *saa, int source, int sync);
+void saa7146_set_gpio(struct saa7146_dev *saa, u8 pin, u8 data);
+
+/* from saa7146_video.c */
+extern struct saa7146_use_ops saa7146_video_uops;
+
+/* from saa7146_vbi.c */
+extern struct saa7146_use_ops saa7146_vbi_uops;
+
+/* saa7146 source inputs */
+#define SAA7146_HPS_SOURCE_PORT_A	0x00
+#define SAA7146_HPS_SOURCE_PORT_B	0x01
+#define SAA7146_HPS_SOURCE_YPB_CPA	0x02
+#define SAA7146_HPS_SOURCE_YPA_CPB	0x03
+
+/* sync inputs */
+#define SAA7146_HPS_SYNC_PORT_A		0x00
+#define SAA7146_HPS_SYNC_PORT_B		0x01
+
+/* number of vertical active lines */
+#define V_ACTIVE_LINES_PAL	576
+#define V_ACTIVE_LINES_NTSC	480
+#define V_ACTIVE_LINES_SECAM	576
+
+/* number of lines in a field for HPS to process */
+#define V_FIELD_PAL	288
+#define V_FIELD_NTSC	240
+#define V_FIELD_SECAM	288
+
+/* number of lines of vertical offset before processing */
+#define V_OFFSET_PAL	0x17
+#define V_OFFSET_NTSC	0x16
+#define V_OFFSET_SECAM	0x14
+
+/* number of horizontal pixels to process */
+#define H_PIXELS_PAL	680
+#define H_PIXELS_NTSC	708
+#define H_PIXELS_SECAM	720
+
+/* horizontal offset of processing window */
+#define H_OFFSET_PAL	0x14
+#define H_OFFSET_NTSC	0x06
+#define H_OFFSET_SECAM	0x14
+
+#define SAA7146_PAL_VALUES 	V_OFFSET_PAL, V_FIELD_PAL, V_ACTIVE_LINES_PAL, H_OFFSET_PAL, H_PIXELS_PAL, H_PIXELS_PAL+1, V_ACTIVE_LINES_PAL, 768
+#define SAA7146_NTSC_VALUES	V_OFFSET_NTSC, V_FIELD_NTSC, V_ACTIVE_LINES_NTSC, H_OFFSET_NTSC, H_PIXELS_NTSC, H_PIXELS_NTSC+1, V_ACTIVE_LINES_NTSC, 640
+#define SAA7146_SECAM_VALUES	V_OFFSET_SECAM, V_FIELD_SECAM, V_ACTIVE_LINES_SECAM, H_OFFSET_SECAM, H_PIXELS_SECAM, H_PIXELS_SECAM+1, V_ACTIVE_LINES_SECAM, 768
+
+/* some memory sizes */
+#define SAA7146_CLIPPING_MEM	(14*PAGE_SIZE)
+
+/* some defines for the various clipping-modes */
+#define SAA7146_CLIPPING_RECT		0x4
+#define SAA7146_CLIPPING_RECT_INVERTED	0x5
+#define SAA7146_CLIPPING_MASK		0x6
+#define SAA7146_CLIPPING_MASK_INVERTED	0x7
+
+/* output formats: each entry holds four informations */
+#define RGB08_COMPOSED	0x0217 /* composed is used in the sense of "not-planar" */
+/* this means: planar?=0, yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 7 */
+#define RGB15_COMPOSED	0x0213
+#define RGB16_COMPOSED	0x0210
+#define RGB24_COMPOSED	0x0201
+#define RGB32_COMPOSED	0x0202
+
+#define Y8			0x0006
+#define YUV411_COMPOSED		0x0003
+#define YUV422_COMPOSED		0x0000
+/* this means: planar?=1, yuv2rgb-conversion-mode=0, dither=no(=0), format-mode = b */
+#define YUV411_DECOMPOSED	0x100b
+#define YUV422_DECOMPOSED	0x1009
+#define YUV420_DECOMPOSED	0x100a
+
+#define IS_PLANAR(x) (x & 0xf000)
+
+/* misc defines */
+#define SAA7146_NO_SWAP		(0x0)
+#define SAA7146_TWO_BYTE_SWAP 	(0x1)
+#define SAA7146_FOUR_BYTE_SWAP	(0x2)
+
+#endif
diff -Nru a/include/net/addrconf.h b/include/net/addrconf.h
--- a/include/net/addrconf.h	Sat Apr 19 19:51:50 2003
+++ b/include/net/addrconf.h	Sat Apr 19 19:51:50 2003
@@ -76,49 +76,38 @@
 /*
  *	multicast prototypes (mcast.c)
  */
-extern int			ipv6_sock_mc_join(struct sock *sk, 
-						  int ifindex, 
-						  struct in6_addr *addr);
-extern int			ipv6_sock_mc_drop(struct sock *sk,
-						  int ifindex, 
-						  struct in6_addr *addr);
-extern void			ipv6_sock_mc_close(struct sock *sk);
-extern int			inet6_mc_check(struct sock *sk, struct in6_addr *addr);
+extern int ipv6_sock_mc_join(struct sock *sk, int ifindex, 
+		  struct in6_addr *addr);
+extern int ipv6_sock_mc_drop(struct sock *sk, int ifindex, 
+		  struct in6_addr *addr);
+extern void ipv6_sock_mc_close(struct sock *sk);
+extern int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
+		struct in6_addr *src_addr);
 
-extern int			ipv6_dev_mc_inc(struct net_device *dev,
-						struct in6_addr *addr);
-extern int			ipv6_dev_mc_dec(struct net_device *dev,
-						struct in6_addr *addr);
-extern void			ipv6_mc_up(struct inet6_dev *idev);
-extern void			ipv6_mc_down(struct inet6_dev *idev);
-extern void			ipv6_mc_init_dev(struct inet6_dev *idev);
-extern void			ipv6_mc_destroy_dev(struct inet6_dev *idev);
-extern void			addrconf_dad_failure(struct inet6_ifaddr *ifp);
+extern int ipv6_dev_mc_inc(struct net_device *dev, struct in6_addr *addr);
+extern int ipv6_dev_mc_dec(struct net_device *dev, struct in6_addr *addr);
+extern void ipv6_mc_up(struct inet6_dev *idev);
+extern void ipv6_mc_down(struct inet6_dev *idev);
+extern void ipv6_mc_init_dev(struct inet6_dev *idev);
+extern void ipv6_mc_destroy_dev(struct inet6_dev *idev);
+extern void addrconf_dad_failure(struct inet6_ifaddr *ifp);
 
-extern int			ipv6_chk_mcast_addr(struct net_device *dev,
-						    struct in6_addr *addr);
+extern int ipv6_chk_mcast_addr(struct net_device *dev, struct in6_addr *group,
+		struct in6_addr *src_addr);
 
-extern void			addrconf_prefix_rcv(struct net_device *dev,
-						    u8 *opt, int len);
+extern void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len);
 
 /*
  *	anycast prototypes (anycast.c)
  */
-extern int			ipv6_sock_ac_join(struct sock *sk, 
-						  int ifindex, 
-						  struct in6_addr *addr);
-extern int			ipv6_sock_ac_drop(struct sock *sk,
-						  int ifindex, 
-						  struct in6_addr *addr);
-extern void			ipv6_sock_ac_close(struct sock *sk);
-extern int			inet6_ac_check(struct sock *sk, struct in6_addr *addr, int ifindex);
+extern int ipv6_sock_ac_join(struct sock *sk,int ifindex,struct in6_addr *addr);
+extern int ipv6_sock_ac_drop(struct sock *sk,int ifindex,struct in6_addr *addr);
+extern void ipv6_sock_ac_close(struct sock *sk);
+extern int inet6_ac_check(struct sock *sk, struct in6_addr *addr, int ifindex);
 
-extern int			ipv6_dev_ac_inc(struct net_device *dev,
-						struct in6_addr *addr);
-extern int			ipv6_dev_ac_dec(struct net_device *dev,
-						struct in6_addr *addr);
-extern int			ipv6_chk_acast_addr(struct net_device *dev,
-						struct in6_addr *addr);
+extern int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr);
+extern int ipv6_dev_ac_dec(struct net_device *dev, struct in6_addr *addr);
+extern int ipv6_chk_acast_addr(struct net_device *dev, struct in6_addr *addr);
 
 
 /* Device notifier */
diff -Nru a/include/net/dn.h b/include/net/dn.h
--- a/include/net/dn.h	Sat Apr 19 19:51:49 2003
+++ b/include/net/dn.h	Sat Apr 19 19:51:49 2003
@@ -171,17 +171,17 @@
 	int iif;
 };
 
-static __inline__ dn_address dn_eth2dn(unsigned char *ethaddr)
+static inline dn_address dn_eth2dn(unsigned char *ethaddr)
 {
 	return ethaddr[4] | (ethaddr[5] << 8);
 }
 
-static __inline__ dn_address dn_saddr2dn(struct sockaddr_dn *saddr)
+static inline dn_address dn_saddr2dn(struct sockaddr_dn *saddr)
 {
 	return *(dn_address *)saddr->sdn_nodeaddr;
 }
 
-static __inline__ void dn_dn2eth(unsigned char *ethaddr, dn_address addr)
+static inline void dn_dn2eth(unsigned char *ethaddr, dn_address addr)
 {
 	ethaddr[0] = 0xAA;
 	ethaddr[1] = 0x00;
@@ -190,6 +190,19 @@
 	ethaddr[4] = (unsigned char)(addr & 0xff);
 	ethaddr[5] = (unsigned char)(addr >> 8);
 }
+
+static inline void dn_sk_ports_copy(struct flowi *fl, struct dn_scp *scp)
+{
+	fl->uli_u.dnports.sport = scp->addrloc;
+	fl->uli_u.dnports.dport = scp->addrrem;
+	fl->uli_u.dnports.objnum = scp->addr.sdn_objnum;
+	if (fl->uli_u.dnports.objnum == 0) {
+		fl->uli_u.dnports.objnamel = scp->addr.sdn_objnamel;
+		memcpy(fl->uli_u.dnports.objname, scp->addr.sdn_objname, 16);
+	}
+}
+
+extern unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu);
 
 #define DN_MENUVER_ACC 0x01
 #define DN_MENUVER_USR 0x02
diff -Nru a/include/net/dn_dev.h b/include/net/dn_dev.h
--- a/include/net/dn_dev.h	Sat Apr 19 19:51:27 2003
+++ b/include/net/dn_dev.h	Sat Apr 19 19:51:27 2003
@@ -8,6 +8,7 @@
 	struct dn_ifaddr *ifa_next;
 	struct dn_dev    *ifa_dev;
 	dn_address       ifa_local;
+	dn_address       ifa_address;
 	unsigned char    ifa_flags;
 	unsigned char    ifa_scope;
 	char             ifa_label[IFNAMSIZ];
@@ -171,7 +172,10 @@
 extern struct net_device *dn_dev_get_default(void);
 extern int dn_dev_bind_default(dn_address *addr);
 
-static __inline__ int dn_dev_islocal(struct net_device *dev, dn_address addr)
+extern int register_dnaddr_notifier(struct notifier_block *nb);
+extern int unregister_dnaddr_notifier(struct notifier_block *nb);
+
+static inline int dn_dev_islocal(struct net_device *dev, dn_address addr)
 {
 	struct dn_dev *dn_db = dev->dn_ptr;
 	struct dn_ifaddr *ifa;
diff -Nru a/include/net/dn_fib.h b/include/net/dn_fib.h
--- a/include/net/dn_fib.h	Sat Apr 19 19:51:47 2003
+++ b/include/net/dn_fib.h	Sat Apr 19 19:51:47 2003
@@ -1,12 +1,6 @@
 #ifndef _NET_DN_FIB_H
 #define _NET_DN_FIB_H
 
-#include <linux/config.h>
-
-#ifdef CONFIG_DECNET_ROUTER
-
-#include <linux/rtnetlink.h>
-
 struct dn_kern_rta
 {
         void            *rta_dst;
@@ -23,15 +17,6 @@
         struct rta_cacheinfo *rta_ci;
 };
 
-struct dn_fib_key {
-	dn_address src;
-	dn_address dst;
-	int iif;
-	int oif;
-	u32 fwmark;
-	unsigned char scope;
-};
-
 struct dn_fib_res {
 	struct dn_fib_rule *r;
 	struct dn_fib_info *fi;
@@ -60,16 +45,23 @@
 	unsigned		fib_flags;
 	int			fib_protocol;
 	dn_address		fib_prefsrc;
-	u32			fib_priority;
+	__u32			fib_priority;
+	__u32			fib_metrics[RTAX_MAX];
+#define dn_fib_mtu  fib_metrics[RTAX_MTU-1]
+#define dn_fib_window fib_metrics[RTAX_WINDOW-1]
+#define dn_fib_rtt fib_metrics[RTAX_RTT-1]
+#define dn_fib_advmss fib_metrics[RTAX_ADVMSS-1]
 	int			fib_nhs;
 	int			fib_power;
 	struct dn_fib_nh	fib_nh[0];
-#define fib_dev		fib_nh[0].nh_dev
+#define dn_fib_dev		fib_nh[0].nh_dev
 };
 
 
-#define DN_FIB_RES_NH(res)	((res).fi->fib_nh[(res).nh_sel])
 #define DN_FIB_RES_RESET(res)	((res).nh_sel = 0)
+#define DN_FIB_RES_NH(res)	((res).fi->fib_nh[(res).nh_sel])
+
+#define DN_FIB_RES_PREFSRC(res)	((res).fi->fib_prefsrc ? : __dn_fib_res_prefsrc(&res))
 #define DN_FIB_RES_GW(res)	(DN_FIB_RES_NH(res).nh_gw)
 #define DN_FIB_RES_DEV(res)	(DN_FIB_RES_NH(res).nh_dev)
 #define DN_FIB_RES_OIF(res)	(DN_FIB_RES_NH(res).nh_oif)
@@ -106,7 +98,7 @@
 	int (*delete)(struct dn_fib_table *t, struct rtmsg *r,
 			struct dn_kern_rta *rta, struct nlmsghdr *n,
 			struct netlink_skb_parms *req);
-	int (*lookup)(struct dn_fib_table *t, const struct dn_fib_key *key, 
+	int (*lookup)(struct dn_fib_table *t, const struct flowi *fl,
 			struct dn_fib_res *res);
 	int (*flush)(struct dn_fib_table *t);
 #ifdef CONFIG_PROC_FS
@@ -118,7 +110,7 @@
 	unsigned char data[0];
 };
 
-
+#ifdef CONFIG_DECNET_ROUTER
 /*
  * dn_fib.c
  */
@@ -132,11 +124,12 @@
 				struct dn_kern_rta *rta, 
 				const struct nlmsghdr *nlh, int *errp);
 extern int dn_fib_semantic_match(int type, struct dn_fib_info *fi, 
-			const struct dn_fib_key *key, struct dn_fib_res *res);
+			const struct flowi *fl,
+			struct dn_fib_res *res);
 extern void dn_fib_release_info(struct dn_fib_info *fi);
 extern u16 dn_fib_get_attr16(struct rtattr *attr, int attrlen, int type);
 extern void dn_fib_flush(void);
-extern void dn_fib_select_multipath(const struct dn_fib_key *key, 
+extern void dn_fib_select_multipath(const struct flowi *fl,
 					struct dn_fib_res *res);
 extern int dn_fib_sync_down(dn_address local, struct net_device *dev, 
 				int force);
@@ -156,7 +149,9 @@
 extern void dn_fib_rules_init(void);
 extern void dn_fib_rules_cleanup(void);
 extern void dn_fib_rule_put(struct dn_fib_rule *);
-extern int dn_fib_lookup(struct dn_fib_key *key, struct dn_fib_res *res);
+extern __u16 dn_fib_rules_policy(__u16 saddr, struct dn_fib_res *res, unsigned *flags);
+extern unsigned dnet_addr_type(__u16 addr);
+extern int dn_fib_lookup(const struct flowi *fl, struct dn_fib_res *res);
 
 /*
  * rtnetlink interface
@@ -169,21 +164,15 @@
 extern int dn_fib_rtm_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
 extern int dn_fib_dump_rules(struct sk_buff *skb, struct netlink_callback *cb);
 
-#define DN_NUM_TABLES 255
-#define DN_MIN_TABLE 1
-#define DN_DEFAULT_TABLE 1
-#define DN_L1_TABLE 1
-#define DN_L2_TABLE 2
-
 extern void dn_fib_free_info(struct dn_fib_info *fi);
 
-static __inline__ void dn_fib_info_put(struct dn_fib_info *fi)
+static inline void dn_fib_info_put(struct dn_fib_info *fi)
 {
 	if (atomic_dec_and_test(&fi->fib_clntref))
 		dn_fib_free_info(fi);
 }
 
-static __inline__ void dn_fib_res_put(struct dn_fib_res *res)
+static inline void dn_fib_res_put(struct dn_fib_res *res)
 {
 	if (res->fi)
 		dn_fib_info_put(res->fi);
@@ -191,13 +180,23 @@
 		dn_fib_rule_put(res->r);
 }
 
-static __inline__ u16 dnet_make_mask(int n)
+extern struct dn_fib_table *dn_fib_tables[];
+
+#else /* Endnode */
+
+#define dn_fib_lookup(fl, res) (-ESRCH)
+#define dn_fib_info_put(fi) do { } while(0)
+#define dn_fib_select_multipath(fl, res) do { } while(0)
+#define dn_fib_rules_policy(saddr,res,flags) (0)
+#define dn_fib_res_put(res) do { } while(0)
+
+#endif /* CONFIG_DECNET_ROUTER */
+
+static inline u16 dnet_make_mask(int n)
 {
         if (n)
                 return htons(~((1<<(16-n))-1));
         return 0;
 }
-
-#endif /* CONFIG_DECNET_ROUTER */
 
 #endif /* _NET_DN_FIB_H */
diff -Nru a/include/net/dn_neigh.h b/include/net/dn_neigh.h
--- a/include/net/dn_neigh.h	Sat Apr 19 19:51:47 2003
+++ b/include/net/dn_neigh.h	Sat Apr 19 19:51:47 2003
@@ -18,7 +18,7 @@
 
 extern void dn_neigh_init(void);
 extern void dn_neigh_cleanup(void);
-extern struct neighbour *dn_neigh_lookup(struct neigh_table *tbl, void *ptr);
+extern struct neighbour *dn_neigh_lookup(struct neigh_table *tbl, const void *ptr);
 extern int dn_neigh_router_hello(struct sk_buff *skb);
 extern int dn_neigh_endnode_hello(struct sk_buff *skb);
 extern void dn_neigh_pointopoint_hello(struct sk_buff *skb);
diff -Nru a/include/net/dn_nsp.h b/include/net/dn_nsp.h
--- a/include/net/dn_nsp.h	Sat Apr 19 19:51:50 2003
+++ b/include/net/dn_nsp.h	Sat Apr 19 19:51:50 2003
@@ -204,4 +204,6 @@
         return atomic_read(&sk->rmem_alloc) > (sk->rcvbuf >> 1);
 }
 
+#define DN_MAX_NSP_DATA_HEADER (11)
+
 #endif /* _NET_DN_NSP_H */
diff -Nru a/include/net/dn_route.h b/include/net/dn_route.h
--- a/include/net/dn_route.h	Sat Apr 19 19:51:28 2003
+++ b/include/net/dn_route.h	Sat Apr 19 19:51:28 2003
@@ -16,7 +16,7 @@
 *******************************************************************************/
 
 extern struct sk_buff *dn_alloc_skb(struct sock *sk, int size, int pri);
-extern int dn_route_output(struct dst_entry **pprt, dn_address dst, dn_address src, int flags);
+extern int dn_route_output_sock(struct dst_entry **pprt, struct flowi *, struct sock *sk, int flags);
 extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb);
 extern int dn_cache_getroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
 extern void dn_rt_cache_flush(int delay);
@@ -59,10 +59,10 @@
 #define DN_RT_INFO_BLKR 0x40 /* Blocking Requested            */
 
 /*
- * The key structure is what we used to look up the route.
+ * The fl structure is what we used to look up the route.
  * The rt_saddr & rt_daddr entries are the same as key.saddr & key.daddr
- * except for local input routes, where the rt_saddr = key.daddr and
- * rt_daddr = key.saddr to allow the route to be used for returning
+ * except for local input routes, where the rt_saddr = fl.fld_dst and
+ * rt_daddr = fl.fld_src to allow the route to be used for returning
  * packets to the originating host.
  */
 struct dn_route {
@@ -70,19 +70,18 @@
 		struct dst_entry dst;
 		struct dn_route *rt_next;
 	} u;
-	struct {
-		unsigned short saddr;
-		unsigned short daddr;
-		int iif;
-		int oif;
-		u32 fwmark;
-	} key;
-	unsigned short rt_saddr;
-	unsigned short rt_daddr;
-	unsigned char rt_type;
-	unsigned char rt_scope;
-	unsigned char rt_protocol;
-	unsigned char rt_table;
+
+	__u16 rt_saddr;
+	__u16 rt_daddr;
+	__u16 rt_gateway;
+	__u16 __padding;
+	__u16 rt_src_map;
+	__u16 rt_dst_map;
+
+	unsigned rt_flags;
+	unsigned rt_type;
+
+	struct flowi fl;
 };
 
 extern void dn_route_init(void);
@@ -108,34 +107,6 @@
 		dn_rt_send(skb);
 	else
 		kfree_skb(skb);
-}
-
-static inline void dn_nsp_send(struct sk_buff *skb)
-{
-	struct sock *sk = skb->sk;
-	struct dn_scp *scp = DN_SK(sk);
-	struct dst_entry *dst;
-
-	skb->h.raw = skb->data;
-	scp->stamp = jiffies;
-
-	if ((dst = sk->dst_cache) && !dst->obsolete) {
-try_again:
-		skb->dst = dst_clone(dst);
-		dst_output(skb);
-		return;
-	}
-
-	dst_release(xchg(&sk->dst_cache, NULL));
-
-	if (dn_route_output(&sk->dst_cache, dn_saddr2dn(&scp->peer), dn_saddr2dn(&scp->addr), 0) == 0) {
-		dst = sk->dst_cache;
-		goto try_again;
-	}
-
-	sk->err = EHOSTUNREACH;
-	if (!test_bit(SOCK_DEAD, &sk->flags))
-		sk->state_change(sk);
 }
 
 #endif /* _NET_DN_ROUTE_H */
diff -Nru a/include/net/dst.h b/include/net/dst.h
--- a/include/net/dst.h	Sat Apr 19 19:51:50 2003
+++ b/include/net/dst.h	Sat Apr 19 19:51:50 2003
@@ -11,6 +11,7 @@
 #include <linux/config.h>
 #include <linux/rtnetlink.h>
 #include <linux/rcupdate.h>
+#include <linux/jiffies.h>
 #include <net/neighbour.h>
 #include <asm/processor.h>
 
@@ -208,7 +209,7 @@
 	if (expires == 0)
 		expires = 1;
 
-	if (dst->expires == 0 || (long)(dst->expires - expires) > 0)
+	if (dst->expires == 0 || time_before(expires, dst->expires))
 		dst->expires = expires;
 }
 
diff -Nru a/include/net/flow.h b/include/net/flow.h
--- a/include/net/flow.h	Sat Apr 19 19:51:50 2003
+++ b/include/net/flow.h	Sat Apr 19 19:51:50 2003
@@ -25,7 +25,18 @@
 			struct in6_addr *	saddr;
 			__u32			flowlabel;
 		} ip6_u;
+
+		struct {
+			__u16			daddr;
+			__u16			saddr;
+			__u32			fwmark;
+			__u8			scope;
+		} dn_u;
 	} nl_u;
+#define fld_dst		nl_u.dn_u.daddr
+#define fld_src		nl_u.dn_u.saddr
+#define fld_fwmark	nl_u.dn_u.fwmark
+#define fld_scope	nl_u.dn_u.scope
 #define fl6_dst		nl_u.ip6_u.daddr
 #define fl6_src		nl_u.ip6_u.saddr
 #define fl6_flowlabel	nl_u.ip6_u.flowlabel
@@ -48,8 +59,20 @@
 			__u8	code;
 		} icmpt;
 
+		struct {
+			__u16	sport;
+			__u16	dport;
+			__u8	objnum;
+			__u8	objnamel; /* Not 16 bits since max val is 16 */
+			__u8	objname[16]; /* Not zero terminated */
+		} dnports;
+
 		__u32		spi;
 	} uli_u;
+#define fl_ip_sport	uli_u.ports.sport
+#define fl_ip_dport	uli_u.ports.dport
+#define fl_icmp_type	uli_u.icmpt.type
+#define fl_icmp_code	uli_u.icmpt.code
+#define fl_ipsec_spi	uli_u.spi
 };
-
 #endif
diff -Nru a/include/net/icmp.h b/include/net/icmp.h
--- a/include/net/icmp.h	Sat Apr 19 19:51:50 2003
+++ b/include/net/icmp.h	Sat Apr 19 19:51:50 2003
@@ -18,6 +18,7 @@
 #ifndef _ICMP_H
 #define	_ICMP_H
 
+#include <linux/config.h>
 #include <linux/icmp.h>
 #include <linux/skbuff.h>
 
diff -Nru a/include/net/if_inet6.h b/include/net/if_inet6.h
--- a/include/net/if_inet6.h	Sat Apr 19 19:51:50 2003
+++ b/include/net/if_inet6.h	Sat Apr 19 19:51:50 2003
@@ -52,27 +52,58 @@
 	int			dead;
 };
 
+struct ip6_sf_socklist
+{
+	unsigned int		sl_max;
+	unsigned int		sl_count;
+	struct in6_addr		sl_addr[0];
+};
+
+#define IP6_SFLSIZE(count)	(sizeof(struct ip6_sf_socklist) + \
+	(count) * sizeof(struct in6_addr))
+
+#define IP6_SFBLOCK	10	/* allocate this many at once */
+
 struct ipv6_mc_socklist
 {
 	struct in6_addr		addr;
 	int			ifindex;
 	struct ipv6_mc_socklist *next;
+	unsigned int		sfmode;		/* MCAST_{INCLUDE,EXCLUDE} */
+	struct ip6_sf_socklist	*sflist;
+};
+
+struct ip6_sf_list
+{
+	struct ip6_sf_list	*sf_next;
+	struct in6_addr		sf_addr;
+	unsigned long		sf_count[2];	/* include/exclude counts */
+	unsigned char		sf_gsresp;	/* include in g & s response? */
+	unsigned char		sf_oldin;	/* change state */
+	unsigned char		sf_crcount;	/* retrans. left to send */
 };
 
 #define MAF_TIMER_RUNNING	0x01
 #define MAF_LAST_REPORTER	0x02
 #define MAF_LOADED		0x04
+#define MAF_NOREPORT		0x08
+#define MAF_GSQUERY		0x10
 
 struct ifmcaddr6
 {
 	struct in6_addr		mca_addr;
 	struct inet6_dev	*idev;
 	struct ifmcaddr6	*next;
+	struct ip6_sf_list	*mca_sources;
+	struct ip6_sf_list	*mca_tomb;
+	unsigned int		mca_sfmode;
+	unsigned long		mca_sfcount[2];
 	struct timer_list	mca_timer;
 	unsigned		mca_flags;
 	int			mca_users;
 	atomic_t		mca_refcnt;
 	spinlock_t		mca_lock;
+	unsigned char		mca_crcount;
 };
 
 /* Anycast stuff */
@@ -126,7 +157,18 @@
 	struct net_device		*dev;
 
 	struct inet6_ifaddr	*addr_list;
+
 	struct ifmcaddr6	*mc_list;
+	struct ifmcaddr6	*mc_tomb;
+	rwlock_t		mc_lock;
+	unsigned long		mc_v1_seen;
+	unsigned long		mc_maxdelay;
+	unsigned char		mc_qrv;
+	unsigned char		mc_gq_running;
+	unsigned char		mc_ifc_count;
+	struct timer_list	mc_gq_timer;	/* general query timer */
+	struct timer_list	mc_ifc_timer;	/* interface change timer */
+
 	struct ifacaddr6	*ac_list;
 	rwlock_t		lock;
 	atomic_t		refcnt;
diff -Nru a/include/net/ip.h b/include/net/ip.h
--- a/include/net/ip.h	Sat Apr 19 19:51:49 2003
+++ b/include/net/ip.h	Sat Apr 19 19:51:49 2003
@@ -79,6 +79,7 @@
 extern void		ip_mc_dropsocket(struct sock *);
 extern void		ip_mc_dropdevice(struct net_device *dev);
 extern int		ip_mc_procinfo(char *, char **, off_t, int);
+extern int		ip_mcf_procinfo(char *, char **, off_t, int);
 
 /*
  *	Functions provided by ip.c
diff -Nru a/include/net/ip6_fib.h b/include/net/ip6_fib.h
--- a/include/net/ip6_fib.h	Sat Apr 19 19:51:49 2003
+++ b/include/net/ip6_fib.h	Sat Apr 19 19:51:49 2003
@@ -72,6 +72,8 @@
 
 	struct rt6key			rt6i_dst;
 	struct rt6key			rt6i_src;
+
+	u8				rt6i_protocol;
 };
 
 struct fib6_walker_t
@@ -160,11 +162,14 @@
 extern int			fib6_walk_continue(struct fib6_walker_t *w);
 
 extern int			fib6_add(struct fib6_node *root,
-					 struct rt6_info *rt);
+					 struct rt6_info *rt,
+					 struct nlmsghdr *nlh);
 
-extern int			fib6_del(struct rt6_info *rt);
+extern int			fib6_del(struct rt6_info *rt,
+					 struct nlmsghdr *nlh);
 
-extern void			inet6_rt_notify(int event, struct rt6_info *rt);
+extern void			inet6_rt_notify(int event, struct rt6_info *rt,
+						struct nlmsghdr *nlh);
 
 extern void			fib6_run_gc(unsigned long dummy);
 
diff -Nru a/include/net/ip6_route.h b/include/net/ip6_route.h
--- a/include/net/ip6_route.h	Sat Apr 19 19:51:29 2003
+++ b/include/net/ip6_route.h	Sat Apr 19 19:51:29 2003
@@ -37,8 +37,10 @@
 
 extern int			ipv6_route_ioctl(unsigned int cmd, void *arg);
 
-extern int			ip6_route_add(struct in6_rtmsg *rtmsg);
-extern int			ip6_del_rt(struct rt6_info *);
+extern int			ip6_route_add(struct in6_rtmsg *rtmsg,
+					      struct nlmsghdr *);
+extern int			ip6_del_rt(struct rt6_info *,
+					   struct nlmsghdr *);
 
 extern int			ip6_rt_addr_add(struct in6_addr *addr,
 						struct net_device *dev);
diff -Nru a/include/net/protocol.h b/include/net/protocol.h
--- a/include/net/protocol.h	Sat Apr 19 19:51:46 2003
+++ b/include/net/protocol.h	Sat Apr 19 19:51:46 2003
@@ -44,15 +44,17 @@
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
 struct inet6_protocol 
 {
-	int	(*handler)(struct sk_buff **skbp);
+	int	(*handler)(struct sk_buff **skb, unsigned int *nhoffp);
 
 	void	(*err_handler)(struct sk_buff *skb,
 			       struct inet6_skb_parm *opt,
 			       int type, int code, int offset,
 			       __u32 info);
-	int	no_policy;
+	unsigned int	flags;	/* INET6_PROTO_xxx */
 };
 
+#define INET6_PROTO_NOPOLICY	0x1
+#define INET6_PROTO_FINAL	0x2
 #endif
 
 /* This is used to register socket interfaces for IP protocols.  */
diff -Nru a/include/net/route.h b/include/net/route.h
--- a/include/net/route.h	Sat Apr 19 19:51:27 2003
+++ b/include/net/route.h	Sat Apr 19 19:51:27 2003
@@ -173,13 +173,13 @@
 static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport,
 				    struct sock *sk)
 {
-	if (sport != (*rp)->fl.uli_u.ports.sport ||
-	    dport != (*rp)->fl.uli_u.ports.dport) {
+	if (sport != (*rp)->fl.fl_ip_sport ||
+	    dport != (*rp)->fl.fl_ip_dport) {
 		struct flowi fl;
 
 		memcpy(&fl, &(*rp)->fl, sizeof(fl));
-		fl.uli_u.ports.sport = sport;
-		fl.uli_u.ports.dport = dport;
+		fl.fl_ip_sport = sport;
+		fl.fl_ip_dport = dport;
 		ip_rt_put(*rp);
 		*rp = NULL;
 		return ip_route_output_flow(rp, &fl, sk, 0);
diff -Nru a/include/net/sock.h b/include/net/sock.h
--- a/include/net/sock.h	Sat Apr 19 19:51:49 2003
+++ b/include/net/sock.h	Sat Apr 19 19:51:49 2003
@@ -453,7 +453,7 @@
 extern void sock_init_data(struct socket *sock, struct sock *sk);
 
 /**
- *	__sk_filter - run a packet through a socket filter
+ *	sk_filter - run a packet through a socket filter
  *	@sk: sock associated with &sk_buff
  *	@skb: buffer to filter
  *	@needlock: set to 1 if the sock is not locked by caller.
@@ -464,14 +464,16 @@
  * wrapper to sk_run_filter. It returns 0 if the packet should
  * be accepted or -EPERM if the packet should be tossed.
  *
- * This function should not be called directly, use sk_filter instead
- * to ensure that the LSM security check is also performed.
  */
 
-static inline int __sk_filter(struct sock *sk, struct sk_buff *skb, int needlock)
+static inline int sk_filter(struct sock *sk, struct sk_buff *skb, int needlock)
 {
-	int err = 0;
-
+	int err;
+	
+	err = security_sock_rcv_skb(sk, skb);
+	if (err)
+		return err;
+	
 	if (sk->filter) {
 		struct sk_filter *filter;
 		
@@ -518,17 +520,6 @@
 	atomic_add(sk_filter_len(fp), &sk->omem_alloc);
 }
 
-static inline int sk_filter(struct sock *sk, struct sk_buff *skb, int needlock)
-{
-	int err;
-	
-	err = security_sock_rcv_skb(sk, skb);
-	if (err)
-		return err;
-	
-	return __sk_filter(sk, skb, needlock);
-}
-
 /*
  * Socket reference counting postulates.
  *
@@ -868,6 +859,9 @@
  * 	schedule();
  * SOCK_SLEEP_POST(sk)
  *
+ * N.B. These are now obsolete and were, afaik, only ever used in DECnet
+ * and when the last use of them in DECnet has gone, I'm intending to
+ * remove them.
  */
 
 #define SOCK_SLEEP_PRE(sk) 	{ struct task_struct *tsk = current; \
diff -Nru a/include/net/tcp.h b/include/net/tcp.h
--- a/include/net/tcp.h	Sat Apr 19 19:51:28 2003
+++ b/include/net/tcp.h	Sat Apr 19 19:51:28 2003
@@ -31,6 +31,7 @@
 #include <linux/percpu.h>
 #include <net/checksum.h>
 #include <net/sock.h>
+#include <net/snmp.h>
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
 #include <linux/ipv6.h>
 #endif
@@ -639,6 +640,8 @@
 #define TCP_INC_STATS_BH(field)		SNMP_INC_STATS_BH(tcp_statistics, field)
 #define TCP_INC_STATS_USER(field) 	SNMP_INC_STATS_USER(tcp_statistics, field)
 #define TCP_DEC_STATS(field)		SNMP_DEC_STATS(tcp_statistics, field)
+#define TCP_ADD_STATS_BH(field, val)	SNMP_ADD_STATS_BH(tcp_statistics, field, val)
+#define TCP_ADD_STATS_USER(field, val)	SNMP_ADD_STATS_USER(tcp_statistics, field, val)
 
 extern __inline__ void		tcp_put_port(struct sock *sk);
 extern void			tcp_inherit_port(struct sock *sk, struct sock *child);
@@ -1398,6 +1401,9 @@
 		break;
 
 	case TCP_CLOSE:
+		if (oldstate == TCP_CLOSE_WAIT || oldstate == TCP_ESTABLISHED)
+			TCP_INC_STATS(TcpEstabResets);
+
 		sk->prot->unhash(sk);
 		if (sk->prev && !(sk->userlocks&SOCK_BINDPORT_LOCK))
 			tcp_put_port(sk);
@@ -1876,6 +1882,15 @@
 	return (sysctl_tcp_frto && tp->send_head &&
 		!after(TCP_SKB_CB(tp->send_head)->end_seq,
 		       tp->snd_una + tp->snd_wnd));
+}
+
+static inline void tcp_mib_init(void)
+{
+	/* See RFC 2012 */
+	TCP_ADD_STATS_USER(TcpRtoAlgorithm, 1);
+	TCP_ADD_STATS_USER(TcpRtoMin, TCP_RTO_MIN*1000/HZ);
+	TCP_ADD_STATS_USER(TcpRtoMax, TCP_RTO_MAX*1000/HZ);
+	TCP_ADD_STATS_USER(TcpMaxConn, -1);
 }
 
 #endif	/* _TCP_H */
diff -Nru a/include/net/xfrm.h b/include/net/xfrm.h
--- a/include/net/xfrm.h	Sat Apr 19 19:51:50 2003
+++ b/include/net/xfrm.h	Sat Apr 19 19:51:50 2003
@@ -84,6 +84,7 @@
 /* Full description of state of transformer. */
 struct xfrm_state
 {
+	/* Note: bydst is re-used during gc */
 	struct list_head	bydst;
 	struct list_head	byspi;
 
@@ -294,11 +295,11 @@
 
 static inline u32 __flow_hash4(struct flowi *fl)
 {
-	u32 hash = fl->fl4_src ^ fl->uli_u.ports.sport;
+	u32 hash = fl->fl4_src ^ fl->fl_ip_sport;
 
 	hash = ((hash & 0xF0F0F0F0) >> 4) | ((hash & 0x0F0F0F0F) << 4);
 
-	hash ^= fl->fl4_dst ^ fl->uli_u.ports.dport;
+	hash ^= fl->fl4_dst ^ fl->fl_ip_dport;
 	hash ^= (hash >> 10);
 	hash ^= (hash >> 20);
 	return hash & (XFRM_FLOWCACHE_HASH_SIZE-1);
@@ -308,13 +309,13 @@
 {
 	u32 hash = fl->fl6_src->s6_addr32[2] ^
 		   fl->fl6_src->s6_addr32[3] ^ 
-		   fl->uli_u.ports.sport;
+		   fl->fl_ip_sport;
 
 	hash = ((hash & 0xF0F0F0F0) >> 4) | ((hash & 0x0F0F0F0F) << 4);
 
 	hash ^= fl->fl6_dst->s6_addr32[2] ^
 		fl->fl6_dst->s6_addr32[3] ^ 
-		fl->uli_u.ports.dport;
+		fl->fl_ip_dport;
 	hash ^= (hash >> 10);
 	hash ^= (hash >> 20);
 	return hash & (XFRM_FLOWCACHE_HASH_SIZE-1);
@@ -453,8 +454,8 @@
 {
 	return  addr_match(&fl->fl4_dst, &sel->daddr, sel->prefixlen_d) &&
 		addr_match(&fl->fl4_src, &sel->saddr, sel->prefixlen_s) &&
-		!((fl->uli_u.ports.dport^sel->dport)&sel->dport_mask) &&
-		!((fl->uli_u.ports.sport^sel->sport)&sel->sport_mask) &&
+		!((fl->fl_ip_dport^sel->dport)&sel->dport_mask) &&
+		!((fl->fl_ip_sport^sel->sport)&sel->sport_mask) &&
 		(fl->proto == sel->proto || !sel->proto) &&
 		(fl->oif == sel->ifindex || !sel->ifindex);
 }
@@ -464,8 +465,8 @@
 {
 	return  addr_match(fl->fl6_dst, &sel->daddr, sel->prefixlen_d) &&
 		addr_match(fl->fl6_src, &sel->saddr, sel->prefixlen_s) &&
-		!((fl->uli_u.ports.dport^sel->dport)&sel->dport_mask) &&
-		!((fl->uli_u.ports.sport^sel->sport)&sel->sport_mask) &&
+		!((fl->fl_ip_dport^sel->dport)&sel->dport_mask) &&
+		!((fl->fl_ip_sport^sel->sport)&sel->sport_mask) &&
 		(fl->proto == sel->proto || !sel->proto) &&
 		(fl->oif == sel->ifindex || !sel->ifindex);
 }
@@ -722,6 +723,12 @@
 	struct sadb_alg desc;
 };
 
+/* XFRM tunnel handlers.  */
+struct xfrm_tunnel {
+	int (*handler)(struct sk_buff *skb);
+	void (*err_handler)(struct sk_buff *skb, void *info);
+};
+
 extern void xfrm_init(void);
 extern void xfrm4_init(void);
 extern void xfrm4_fini(void);
@@ -751,7 +758,9 @@
 extern int xfrm_check_selectors(struct xfrm_state **x, int n, struct flowi *fl);
 extern int xfrm4_rcv(struct sk_buff *skb);
 extern int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type);
-extern int xfrm6_rcv(struct sk_buff **pskb);
+extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler);
+extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler);
+extern int xfrm6_rcv(struct sk_buff **pskb, unsigned int *nhoffp);
 extern int xfrm6_clear_mutable_options(struct sk_buff *skb, u16 *nh_offset, int dir);
 extern int xfrm_user_policy(struct sock *sk, int optname, u8 *optval, int optlen);
 
diff -Nru a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h
--- a/include/sound/ac97_codec.h	Sat Apr 19 19:51:48 2003
+++ b/include/sound/ac97_codec.h	Sat Apr 19 19:51:48 2003
@@ -223,6 +223,13 @@
 #define AC97_YMF753_DIT_CTRL2	0x66	/* DIT Control 2 */
 #define AC97_YMF753_3D_MODE_SEL	0x68	/* 3D Mode Select */
 
+/* specific - C-Media */
+#define AC97_CM9738_VENDOR_CTRL	0x5a
+#define AC97_CM9739_MULTI_CHAN	0x64
+#define AC97_CM9739_SPDIF_IN_STATUS	0x68 /* 32bit */
+#define AC97_CM9739_SPDIF_CTRL	0x6c
+
+
 /* ac97->scaps */
 #define AC97_SCAP_AUDIO		(1<<0)	/* audio AC'97 codec */
 #define AC97_SCAP_MODEM		(1<<1)	/* modem AC'97 codec */
@@ -259,6 +266,9 @@
 	void (*private_free) (ac97_t *ac97);
 	/* --- */
 	snd_card_t *card;
+	struct pci_dev *pci;	/* assigned PCI device - used for quirks */
+	unsigned short subsystem_vendor;
+	unsigned short subsystem_device;
 	spinlock_t reg_lock;
 	unsigned short num;	/* number of codec: 0 = primary, 1 = secondary */
 	unsigned short addr;	/* physical address of codec [0-3] */
@@ -280,6 +290,7 @@
 			unsigned short chained[3];	// 0 = C34, 1 = C79, 2 = C69
 			unsigned short id[3];		// codec IDs (lower 16-bit word)
 			unsigned short pcmreg[3];	// PCM registers
+			unsigned short codec_cfg[3];	// CODEC_CFG bits
 			struct semaphore mutex;
 		} ad18xx;
 	} spec;
@@ -327,6 +338,6 @@
 	int type;
 };
 
-int snd_ac97_tune_hardware(ac97_t *ac97, struct pci_dev *pci, struct ac97_quirk *quirk);
+int snd_ac97_tune_hardware(ac97_t *ac97, struct ac97_quirk *quirk);
 
 #endif /* __SOUND_AC97_CODEC_H */
diff -Nru a/include/sound/asound.h b/include/sound/asound.h
--- a/include/sound/asound.h	Sat Apr 19 19:51:49 2003
+++ b/include/sound/asound.h	Sat Apr 19 19:51:49 2003
@@ -681,7 +681,7 @@
  *                                                                          *
  ****************************************************************************/
 
-#define SNDRV_CTL_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 1)
+#define SNDRV_CTL_VERSION		SNDRV_PROTOCOL_VERSION(2, 0, 2)
 
 struct sndrv_ctl_card_info {
 	int card;			/* card number */
@@ -726,7 +726,8 @@
 #define SNDRV_CTL_ELEM_ACCESS_INACTIVE		(1<<8)	/* control does actually nothing, but may be updated */
 #define SNDRV_CTL_ELEM_ACCESS_LOCK		(1<<9)	/* write lock */
 #define SNDRV_CTL_ELEM_ACCESS_OWNER		(1<<10)	/* write lock owner */
-#define SNDRV_CTL_ELEM_ACCESS_INDIRECT		(1<<31)	/* indirect access */
+#define SNDRV_CTL_ELEM_ACCESS_DINDIRECT		(1<<30)	/* indirect access for matrix dimensions in the info structure */
+#define SNDRV_CTL_ELEM_ACCESS_INDIRECT		(1<<31)	/* indirect access for element value in the value structure */
 
 /* for further details see the ACPI and PCI power management specification */
 #define SNDRV_CTL_POWER_D0		0x0000	/* full On */
@@ -778,7 +779,11 @@
 		} enumerated;
 		unsigned char reserved[128];
 	} value;
-	unsigned char reserved[64];
+	union {
+		unsigned short d[4];		/* dimensions */
+		unsigned short *d_ptr;		/* indirect */
+	} dimen;
+	unsigned char reserved[64-4*sizeof(unsigned short)];
 };
 
 struct sndrv_ctl_elem_value {
diff -Nru a/include/sound/control.h b/include/sound/control.h
--- a/include/sound/control.h	Sat Apr 19 19:51:47 2003
+++ b/include/sound/control.h	Sat Apr 19 19:51:47 2003
@@ -49,24 +49,30 @@
 	unsigned char *name;		/* ASCII name of item */
 	unsigned int index;		/* index of item */
 	unsigned int access;		/* access rights */
+	unsigned int count;		/* count of same elements */
 	snd_kcontrol_info_t *info;
 	snd_kcontrol_get_t *get;
 	snd_kcontrol_put_t *put;
 	unsigned long private_value;
 } snd_kcontrol_new_t;
 
+typedef struct _snd_kcontrol_volatile {
+	snd_ctl_file_t *owner;	/* locked */
+	pid_t owner_pid;
+	unsigned int access;	/* access rights */
+} snd_kcontrol_volatile_t;
+
 struct _snd_kcontrol {
 	struct list_head list;		/* list of controls */
 	snd_ctl_elem_id_t id;
-	snd_ctl_file_t *owner;		/* locked */
-	pid_t owner_pid;
-	unsigned int access;		/* access rights */
+	unsigned int count;		/* count of same elements */
 	snd_kcontrol_info_t *info;
 	snd_kcontrol_get_t *get;
 	snd_kcontrol_put_t *put;
 	unsigned long private_value;
 	void *private_data;
 	void (*private_free)(snd_kcontrol_t *kcontrol);
+	snd_kcontrol_volatile_t vd[0];	/* volatile data */
 };
 
 #define snd_kcontrol(n) list_entry(n, snd_kcontrol_t, list)
@@ -100,7 +106,7 @@
 
 void snd_ctl_notify(snd_card_t * card, unsigned int mask, snd_ctl_elem_id_t * id);
 
-snd_kcontrol_t *snd_ctl_new(snd_kcontrol_t * kcontrol);
+snd_kcontrol_t *snd_ctl_new(snd_kcontrol_t * kcontrol, unsigned int access);
 snd_kcontrol_t *snd_ctl_new1(snd_kcontrol_new_t * kcontrolnew, void * private_data);
 void snd_ctl_free_one(snd_kcontrol_t * kcontrol);
 int snd_ctl_add(snd_card_t * card, snd_kcontrol_t * kcontrol);
@@ -116,5 +122,34 @@
 int snd_ctl_unregister(snd_card_t *card);
 int snd_ctl_register_ioctl(snd_kctl_ioctl_func_t fcn);
 int snd_ctl_unregister_ioctl(snd_kctl_ioctl_func_t fcn);
+
+static inline unsigned int snd_ctl_get_ioffnum(snd_kcontrol_t *kctl, snd_ctl_elem_id_t *id)
+{
+	return id->numid - kctl->id.numid;
+}
+
+static inline unsigned int snd_ctl_get_ioffidx(snd_kcontrol_t *kctl, snd_ctl_elem_id_t *id)
+{
+	return id->index - kctl->id.index;
+}
+
+static inline unsigned int snd_ctl_get_ioff(snd_kcontrol_t *kctl, snd_ctl_elem_id_t *id)
+{
+	if (id->numid) {
+		return snd_ctl_get_ioffnum(kctl, id);
+	} else {
+		return snd_ctl_get_ioffidx(kctl, id);
+	}
+}
+
+static inline snd_ctl_elem_id_t *snd_ctl_build_ioff(snd_ctl_elem_id_t *dst_id,
+						    snd_kcontrol_t *src_kctl,
+						    unsigned int offset)
+{
+	*dst_id = src_kctl->id;
+	dst_id->index += offset;
+	dst_id->numid += offset;
+	return dst_id;
+}
 
 #endif	/* __SOUND_CONTROL_H */
diff -Nru a/include/sound/cs46xx.h b/include/sound/cs46xx.h
--- a/include/sound/cs46xx.h	Sat Apr 19 19:51:30 2003
+++ b/include/sound/cs46xx.h	Sat Apr 19 19:51:30 2003
@@ -1730,6 +1730,7 @@
 	void (*amplifier_ctrl)(cs46xx_t *, int);
 	void (*active_ctrl)(cs46xx_t *, int);
   	void (*mixer_init)(cs46xx_t *);
+
 	struct pci_dev *acpi_dev;
 	int acpi_port;
 	snd_kcontrol_t *eapd_switch; /* for amplifier hack */
@@ -1749,6 +1750,7 @@
 	dsp_spos_instance_t * dsp_spos_instance;
 
 	snd_pcm_t *pcm_rear;
+	snd_pcm_t *pcm_center_lfe;
 	snd_pcm_t *pcm_iec958;
 #else /* for compatibility */
 	cs46xx_pcm_t *playback_pcm;
@@ -1764,6 +1766,7 @@
 int snd_cs46xx_pcm(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
 int snd_cs46xx_pcm_rear(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
 int snd_cs46xx_pcm_iec958(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
+int snd_cs46xx_pcm_center_lfe(cs46xx_t *chip, int device, snd_pcm_t **rpcm);
 int snd_cs46xx_mixer(cs46xx_t *chip);
 int snd_cs46xx_midi(cs46xx_t *chip, int device, snd_rawmidi_t **rmidi);
 int snd_cs46xx_start_dsp(cs46xx_t *chip);
diff -Nru a/include/sound/cs46xx_dsp_scb_types.h b/include/sound/cs46xx_dsp_scb_types.h
--- a/include/sound/cs46xx_dsp_scb_types.h	Sat Apr 19 19:51:47 2003
+++ b/include/sound/cs46xx_dsp_scb_types.h	Sat Apr 19 19:51:47 2003
@@ -27,6 +27,18 @@
 #ifndef __CS46XX_DSP_SCB_TYPES_H__
 #define __CS46XX_DSP_SCB_TYPES_H__
 
+#include <asm/byteorder.h>
+
+#ifndef ___DSP_DUAL_16BIT_ALLOC
+#if   defined(__LITTLE_ENDIAN)
+#define ___DSP_DUAL_16BIT_ALLOC(a,b) u16 a; u16 b;
+#elif defined(__BIG_ENDIAN)
+#define ___DSP_DUAL_16BIT_ALLOC(a,b) u16 b; u16 a;
+#else
+#error Not __LITTLE_ENDIAN and not __BIG_ENDIAN, then what ???
+#endif
+#endif
+
 /* This structs are used internally by the SP */
 
 typedef struct _basic_dma_req_t {
@@ -60,11 +72,14 @@
 } scatter_gather_ext_t;
 
 typedef struct _volume_control_t {
-	u16 rightTarg;     /* Target volume for left & right channels */
-	u16 leftTarg;
-
-	u16 rightVol;       /* Current left & right channel volumes */
-	u16 leftVol;
+	___DSP_DUAL_16BIT_ALLOC(
+	   rightTarg,  /* Target volume for left & right channels */
+	   leftTarg
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	   rightVol,   /* Current left & right channel volumes */
+	   leftVol
+	)
 } volume_control_t;
 
 /* Generic stream control block (SCB) structure definition */
@@ -95,15 +110,17 @@
 	/* Sublist pointer & next stream control block (SCB) link.
 	   Initialized & modified by the host R/O for the DSP task
 	*/
-	u16 next_scb;     /* REQUIRED */
-	u16 sub_list_ptr; /* REQUIRED */
-
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,     /* REQUIRED */
+	    sub_list_ptr  /* REQUIRED */
+	)
   
 	/* Pointer to this tasks parameter block & stream function pointer 
 	   Initialized by the host  R/O for the DSP task */
-	u16 entry_point;  /* REQUIRED */
-	u16 this_spb;     /* REQUIRED */
-
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,  /* REQUIRED */
+	    this_spb      /* REQUIRED */
+	)
 
 	/* rsConfig register for stream buffer (rsDMA reg. 
 	   is loaded from basicReq.daw for incoming streams, or 
@@ -176,59 +193,78 @@
 		    This rule does not apply to one off boot time initialisation prior to starting the SP
 	*/
 
- 
+
+	___DSP_DUAL_16BIT_ALLOC( 
 	/* First element on the Hyper forground task tree */
-	u16 hfg_tree_root_ptr;   /* HOST */			    
+	    hfg_tree_root_ptr,  /* HOST */			    
 	/* First 3 dwords are written by the host and read-only on the DSP */
-	u16 hfg_stack_base;     /* HOST */
+	    hfg_stack_base      /* HOST */
+	)
 
+	___DSP_DUAL_16BIT_ALLOC(
 	/* Point to this data structure to enable easy access */
-	u16 spos_cb_ptr;		   /* SP */
-	u16 prev_task_tree_ptr;  /* SP && HOST */
-
+	    spos_cb_ptr,	 /* SP */
+	    prev_task_tree_ptr   /* SP && HOST */
+	)
 
+	___DSP_DUAL_16BIT_ALLOC(
 	/* Currently Unused */
-	u16 xxinterval_timer_period;   
+	    xxinterval_timer_period,
 	/* Enable extension of SPOS data structure */
-	u16 HFGSPB_ptr;
+	    HFGSPB_ptr
+	)
 
 
-	u16 xxnum_HFG_ticks_thisInterval; 
+	___DSP_DUAL_16BIT_ALLOC(
+	    xxnum_HFG_ticks_thisInterval,
 	/* Modified by the DSP */
-	u16 xxnum_tntervals;
+	    xxnum_tntervals
+	)
 
 
 	/* Set by DSP upon encountering a trap (breakpoint) or a spurious
 	   interrupt.  The host must clear this dword after reading it
 	   upon receiving spInt1. */
-	u16 spurious_int_flag;	 /* (Host & SP) Nature of the spurious interrupt */
-	u16 trap_flag;             /* (Host & SP) Nature of detected Trap */
-
-
-	u16 unused2;					
-	u16 invalid_IP_flag;       /* (Host & SP ) Indicate detection of invalid instruction pointer */
-
+	___DSP_DUAL_16BIT_ALLOC(
+	    spurious_int_flag,	 /* (Host & SP) Nature of the spurious interrupt */
+	    trap_flag            /* (Host & SP) Nature of detected Trap */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused2,					
+	    invalid_IP_flag        /* (Host & SP ) Indicate detection of invalid instruction pointer */
+	)
 
+	___DSP_DUAL_16BIT_ALLOC(
 	/* pointer to forground task tree header for use in next task search */
-	u16 fg_task_tree_hdr_ptr;	  /* HOST */		
+	    fg_task_tree_hdr_ptr,	  /* HOST */		
 	/* Data structure for controlling synchronous link update */
-	u16  hfg_sync_update_ptr;   /* HOST */
+	    hfg_sync_update_ptr           /* HOST */
+	)
   
-	u16  begin_foreground_FCNT;  /* SP */
+	___DSP_DUAL_16BIT_ALLOC(
+	     begin_foreground_FCNT,  /* SP */
 	/* Place holder for holding sleep timing */
-	u16  last_FCNT_before_sleep; /* SP */
+	     last_FCNT_before_sleep  /* SP */
+	)
 
-	u16 unused7;           /* SP */
-	u16 next_task_treePtr; /* SP */
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused7,           /* SP */
+	    next_task_treePtr  /* SP */
+	)
 
-	u32  nused5;        
+	u32 unused5;        
 
-	u16 active_flags;	   /* SP */
+	___DSP_DUAL_16BIT_ALLOC(
+	    active_flags,   /* SP */
 	/* State flags, used to assist control of execution of Hyper Forground */
-	u16 HFG_flags;       /* SP */
+	    HFG_flags       /* SP */
+	)
 
-	u16 unused9;
-	u16 unused8;
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused9,
+	    unused8
+	)
                               
 	/* Space for saving enough context so that we can set up enough 
 	   to save some more context.
@@ -261,16 +297,21 @@
 	/* First 12 dwords from generic_scb_t */
 	basic_dma_req_t  basic_req;  /* Optional */
 	scatter_gather_ext_t sg_ext;  /* Optional */
-	u16 next_scb;     /* REQUIRED */
-	u16 sub_list_ptr; /* REQUIRED */
-
-	u16 entry_point;  /* REQUIRED */
-	u16 this_spb;     /* REQUIRED */
-
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,     /* REQUIRED */
+	    sub_list_ptr  /* REQUIRED */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,  /* REQUIRED */
+	    this_spb      /* REQUIRED */
+	)
 
+	___DSP_DUAL_16BIT_ALLOC(
 	/* Initial values are 0000:xxxx */
-	u16 reserved;  
-	u16 extra_sample_accum;
+ 	    reserved,
+	    extra_sample_accum
+	)
 
   
 	/* Initial values are xxxx:0000
@@ -281,9 +322,10 @@
 	       resynchronize the FIFO pointer
 	       upon start/restart) 
 	*/
-	u16 codec_FIFO_syncd; 
-	u16 codec_FIFO_ptr;
-
+	___DSP_DUAL_16BIT_ALLOC(
+	    codec_FIFO_syncd, 
+	    codec_FIFO_ptr
+	)
   
 	/* Init. 8000:0005 for 44.1k
                  8000:0001 for 48k
@@ -292,8 +334,10 @@
 	       processed in the current group of
 	       frames
 	*/
-	u16 frac_samp_accum_qm1;
-	u16 TM_frms_left_in_group; 
+	___DSP_DUAL_16BIT_ALLOC(
+	    frac_samp_accum_qm1,
+	    TM_frms_left_in_group
+	) 
 
 	/* Init. 0001:0005 for 44.1k
                  0000:0001 for 48k
@@ -303,8 +347,10 @@
 	       nsamp_per_frm_q15
 	   lo: Number of frames in the group
 	*/
-	u16 frac_samp_correction_qm1;
-	u16 TM_frm_group_length; 
+	___DSP_DUAL_16BIT_ALLOC(
+	    frac_samp_correction_qm1,
+	    TM_frm_group_length  
+	)
 
 	/* Init. 44.1k*65536/8k = 0x00058333 for 44.1k
                  48k*65536/8k = 0x00060000 for 48k
@@ -319,13 +365,18 @@
 	/* First 13 dwords from generic_scb_t */
 	basic_dma_req_t  basic_req;  /* Optional */
 	scatter_gather_ext_t sg_ext;  /* Optional */
-	u16 next_scb;       /* REQUIRED */
-	u16 sub_list_ptr;   /* REQUIRED */
-
-	u16 entry_point;    /* REQUIRED */
-	u16 this_spb;       /* REQUIRED */
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,       /* REQUIRED */
+	    sub_list_ptr    /* REQUIRED */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,    /* REQUIRED */
+	    this_spb        /* REQUIRED */
+	)
 
 	u32 strm_rs_config; /* REQUIRED */
+
 	u32 strm_buf_ptr;   /* REQUIRED */
 
 	/* NOTE: The CODEC output task reads samples from the first task on its
@@ -347,8 +398,10 @@
 	       to which the right-channel samples
 	       are to be written.
 	*/
-	u16 left_chan_base_IO_addr;
-	u16 right_chan_IO_disp; 
+	___DSP_DUAL_16BIT_ALLOC(
+	    left_chan_base_IO_addr,
+	    right_chan_IO_disp
+	)
 
 
 	/* Init: 0x0080:0004 for non-AC-97
@@ -359,12 +412,16 @@
 	       16-bit input sample to obtain the
 	       32-bit output word
 	*/
-	u16 CO_scale_shift_count; 
-	u16 CO_exp_vol_change_rate;
+	___DSP_DUAL_16BIT_ALLOC(
+	    CO_scale_shift_count, 
+	    CO_exp_vol_change_rate
+	)
 
 	/* Pointer to SCB at end of input chain */
-	u16 reserved;
-	u16 last_sub_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    reserved,
+	    last_sub_ptr
+	)
 } codec_output_scb_t;
 
 /* SCB for CODEC input algorithm */
@@ -372,11 +429,15 @@
 	/* First 13 dwords from generic_scb_t */
 	basic_dma_req_t  basic_req;  /* Optional */
 	scatter_gather_ext_t sg_ext;  /* Optional */
-	u16 next_scb;       /* REQUIRED */
-	u16 sub_list_ptr;   /* REQUIRED */
-
-	u16 entry_point;    /* REQUIRED */
-	u16 this_spb;       /* REQUIRED */
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,       /* REQUIRED */
+	    sub_list_ptr    /* REQUIRED */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,    /* REQUIRED */
+	    this_spb        /* REQUIRED */
+	)
 
 	u32 strm_rs_config; /* REQUIRED */
 	u32 strm_buf_ptr;   /* REQUIRED */
@@ -402,17 +463,20 @@
 	       to which the right-channel samples
 	       are to be written.
 	*/
-	u16 rightChanINdisp; 
-	u16 left_chan_base_IN_addr;
-
+	___DSP_DUAL_16BIT_ALLOC(
+	    rightChanINdisp, 
+	    left_chan_base_IN_addr
+	)
 	/* Init. ?:fffc
 	   lo: Negative shift count to shift the
 	       32-bit input dword to obtain the
 	       16-bit sample msb-aligned (count
 	       is negative to shift left)
 	*/
-	u16 scaleShiftCount; 
-	u16 reserver1;
+	___DSP_DUAL_16BIT_ALLOC(
+	    scaleShiftCount, 
+	    reserver1
+	)
 
 	u32  reserved2;
 } codec_input_scb_t;
@@ -422,11 +486,15 @@
 	/* First 13 dwords from generic_scb_t */
 	basic_dma_req_t  basic_req;  /* Optional */
 	scatter_gather_ext_t sg_ext;  /* Optional */
-	u16 next_scb;       /* REQUIRED */
-	u16 sub_list_ptr;   /* REQUIRED */
-
-	u16 entry_point;    /* REQUIRED */
-	u16 this_spb;       /* REQUIRED */
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,       /* REQUIRED */
+	    sub_list_ptr    /* REQUIRED */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,    /* REQUIRED */
+	    this_spb        /* REQUIRED */
+	)
 
 	u32 strm_buf_ptr;   /* REQUIRED */
 	u32 strm_rs_config; /* REQUIRED */
@@ -438,8 +506,10 @@
 	   lo: Flag indicating the link to the CODEC
 	       input task is to be initialized
 	*/
-	u16 init_codec_input_link; 
-	u16 codec_input_buf_scb;
+	___DSP_DUAL_16BIT_ALLOC(
+	    init_codec_input_link,
+	    codec_input_buf_scb
+	)
 
 	/* Initialized by the host (host updates target volumes) */
 	volume_control_t psi_vol_ctrl;   
@@ -447,36 +517,54 @@
 } pcm_serial_input_scb_t;
 
 typedef struct _src_task_scb_t {
-	u16 frames_left_in_gof;
-	u16 gofs_left_in_sec;
-
-	u16 const2_thirds;
-	u16 num_extra_tnput_samples;
+	___DSP_DUAL_16BIT_ALLOC(
+	    frames_left_in_gof,
+	    gofs_left_in_sec
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    const2_thirds,
+	    num_extra_tnput_samples
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    cor_per_gof,
+	    correction_per_sec 
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    output_buf_producer_ptr,  
+	    junk_DMA_MID
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    gof_length,  
+	    gofs_per_sec
+	)
 
-	u16 cor_per_gof;
-	u16 correction_per_sec;
-
-	u16 output_buf_producer_ptr;  
-	u16 junk_DMA_MID;
-
-	u16 gof_length;  
-	u16 gofs_per_sec;
-  
 	u32 input_buf_strm_config;
 
-	u16 reserved_for_SRC_use;
-	u16 input_buf_consumer_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    reserved_for_SRC_use,
+	    input_buf_consumer_ptr
+	)
 
 	u32 accum_phi;
 
-	u16 exp_src_vol_change_rate;
-	u16 input_buf_producer_ptr;
-  
-	u16 src_next_scb;
-	u16 src_sub_list_ptr;
-
-	u16 src_entry_point;
-	u16 src_this_sbp;
+	___DSP_DUAL_16BIT_ALLOC(
+	    exp_src_vol_change_rate,
+	    input_buf_producer_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    src_next_scb,
+	    src_sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    src_entry_point,
+	    src_this_sbp
+	)
 
 	u32  src_strm_rs_config;
 	u32  src_strm_buf_ptr;
@@ -490,26 +578,34 @@
 	/* decimationFactor = 2, 4, or 8 (larger factors waste too much memory
 	                                  when compared to cascading decimators)
 	*/
-	u16 dec2_coef_base_ptr;
-	u16 dec2_coef_increment;
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_coef_base_ptr,
+	    dec2_coef_increment
+	)
+
 	/* coefIncrement = 128 / decimationFactor (for our ROM filter)
 	   coefBasePtr = 0x8000 (for our ROM filter)
 	*/
-
-	u16 dec2_in_samples_per_out_triplet;
-	u16 dec2_extra_in_samples;
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_in_samples_per_out_triplet,
+	    dec2_extra_in_samples
+	)
 	/* extraInSamples: # of accumulated, unused input samples (init. to 0)
 	   inSamplesPerOutTriplet = 3 * decimationFactor
 	*/
 
-	u16 dec2_const2_thirds;
-	u16 dec2_half_num_taps_mp5;
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_const2_thirds,
+	    dec2_half_num_taps_mp5
+	)
 	/* halfNumTapsM5: (1/2 number of taps in decimation filter) minus 5
 	   const2thirds: constant 2/3 in 16Q0 format (sign.15)
 	*/
 
-	u16 dec2_output_buf_producer_ptr;
-	u16 dec2_junkdma_mid;
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_output_buf_producer_ptr,
+	    dec2_junkdma_mid
+	)
 
 	u32  dec2_reserved2;
 
@@ -518,26 +614,34 @@
 	   (buffer size = decimationFactor * 32 dwords)
 	*/
 
-	u16 dec2_phi_incr;
-	u16 dec2_input_buf_consumer_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_phi_incr,
+	    dec2_input_buf_consumer_ptr
+	)
 	/* inputBufConsumerPtr: Input buffer read pointer (into SRC filter)
 	   phiIncr = decimationFactor * 4
 	*/
 
 	u32 dec2_reserved3;
 
-	u16 dec2_exp_vol_change_rate;
-	u16 dec2_input_buf_producer_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_exp_vol_change_rate,
+	    dec2_input_buf_producer_ptr
+	)
 	/* inputBufProducerPtr: Input buffer write pointer
 	   expVolChangeRate: Exponential volume change rate for possible
 	                     future mixer on input streams
 	*/
 
-	u16 dec2_next_scb;
-	u16 dec2_sub_list_ptr;
-
-	u16 dec2_entry_point;
-	u16 dec2_this_spb;
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_next_scb,
+	    dec2_sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    dec2_entry_point,
+	    dec2_this_spb
+	)
 
 	u32  dec2_strm_rs_config;
 	u32  dec2_strm_buf_ptr;
@@ -548,23 +652,32 @@
 } decimate_by_pow2_scb_t;
 
 typedef struct _vari_decimate_scb_t {
-	u16 vdec_frames_left_in_gof;
-	u16 vdec_gofs_left_in_sec;
-
-	u16 vdec_const2_thirds;
-	u16 vdec_extra_in_samples;
+	___DSP_DUAL_16BIT_ALLOC(
+	    vdec_frames_left_in_gof,
+	    vdec_gofs_left_in_sec
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    vdec_const2_thirds,
+	    vdec_extra_in_samples
+	)
 	/* extraInSamples: # of accumulated, unused input samples (init. to 0)
 	   const2thirds: constant 2/3 in 16Q0 format (sign.15) */
 
-	u16 vdec_cor_per_gof;
-	u16 vdec_correction_per_sec;
-
-	u16 vdec_output_buf_producer_ptr;
-	u16 vdec_input_buf_consumer_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    vdec_cor_per_gof,
+	    vdec_correction_per_sec
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    vdec_output_buf_producer_ptr,
+	    vdec_input_buf_consumer_ptr
+	)
 	/* inputBufConsumerPtr: Input buffer read pointer (into SRC filter) */
-
-	u16 vdec_gof_length;
-	u16 vdec_gofs_per_sec;
+	___DSP_DUAL_16BIT_ALLOC(
+	    vdec_gof_length,
+	    vdec_gofs_per_sec
+	)
 
 	u32  vdec_input_buf_strm_config;
 	/* inputBufStrmConfig: rsConfig for the input buffer to the decimator
@@ -575,17 +688,23 @@
 	u32  vdec_accumphi;
 	/* accumPhi: accumulated fractional phase increment (6.26) */
 
-	u16 vdec_exp_vol_change_rate;
-	u16 vdec_input_buf_producer_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+ 	    vdec_exp_vol_change_rate,
+	    vdec_input_buf_producer_ptr
+	)
 	/* inputBufProducerPtr: Input buffer write pointer
 	   expVolChangeRate: Exponential volume change rate for possible
 	   future mixer on input streams */
 
-	u16 vdec_next_scb;
-	u16 vdec_sub_list_ptr;
-
-	u16 vdec_entry_point;
-	u16 vdec_this_spb;
+	___DSP_DUAL_16BIT_ALLOC(
+	    vdec_next_scb,
+	    vdec_sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    vdec_entry_point,
+	    vdec_this_spb
+	)
 
 	u32 vdec_strm_rs_config;
 	u32 vdec_strm_buf_ptr;
@@ -601,11 +720,15 @@
 	/* First 13 dwords from generic_scb_t */
 	basic_dma_req_t  basic_req;  /* Optional */
 	scatter_gather_ext_t sg_ext;  /* Optional */
-	u16 next_scb;       /* REQUIRED */
-	u16 sub_list_ptr;   /* REQUIRED */
-
-	u16 entry_point;    /* REQUIRED */
-	u16 this_spb;       /* REQUIRED */
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,       /* REQUIRED */
+	    sub_list_ptr    /* REQUIRED */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,    /* REQUIRED */
+	    this_spb        /* REQUIRED */
+	)
 
 	u32 strm_rs_config; /* REQUIRED */
 	u32 strm_buf_ptr;   /* REQUIRED */
@@ -617,18 +740,24 @@
 	       processed in the current group of
 	       frames
 	*/
-	u16 frames_left_in_group;
-	u16 accum_input_triplets;
+	___DSP_DUAL_16BIT_ALLOC(
+	    frames_left_in_group,
+	    accum_input_triplets
+	)
 
 	/* hi: Exponential volume change rate
 	       for mixer on input streams
 	   lo: Number of frames in the group
 	*/
-	u16 frame_group_length;
-	u16 exp_vol_change_rate;
-  
-	u16 const_FFFF;
-	u16 const_zero;
+	___DSP_DUAL_16BIT_ALLOC(
+	    frame_group_length,
+	    exp_vol_change_rate
+	)
+  
+	___DSP_DUAL_16BIT_ALLOC(
+	    const_FFFF,
+	    const_zero
+	)
 } mix2_ostream_scb_t;
 
 
@@ -637,11 +766,15 @@
 	/* First 13 dwords from generic_scb_t */
 	basic_dma_req_t  basic_req;  /* Optional */
 	scatter_gather_ext_t sg_ext;  /* Optional */
-	u16 next_scb;       /* REQUIRED */
-	u16 sub_list_ptr;   /* REQUIRED */
-
-	u16 entry_point;    /* REQUIRED */
-	u16 this_spb;       /* REQUIRED */
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,       /* REQUIRED */
+	    sub_list_ptr    /* REQUIRED */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,    /* REQUIRED */
+	    this_spb        /* REQUIRED */
+	)
 
 	u32 strm_rs_config; /* REQUIRED */
 	u32 strm_buf_ptr;   /* REQUIRED */
@@ -668,30 +801,40 @@
 	u32  ostrm_rs_config;
 	u32  ostrm_buf_ptr;
   
-	u16 io_sclks_per_lr_clk;
-	u16 io_io_enable;
+	___DSP_DUAL_16BIT_ALLOC(
+	    io_sclks_per_lr_clk,
+	    io_io_enable
+	)
 
 	u32  io_free4;
-  
-	u16 io_next_scb;
-	u16 io_sub_list_ptr;
 
-	u16 io_entry_point;
-	u16 io_this_spb;
+	___DSP_DUAL_16BIT_ALLOC(  
+	    io_next_scb,
+	    io_sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    io_entry_point,
+	    io_this_spb
+	)
 
 	u32 istrm_rs_config;
 	u32 istrm_buf_ptr;
 
 	/* Init. 0000:8042: for ASER1
                  0000:8044: for ASER2  */
-	u16 io_stat_reg_addr;
-	u16 iofifo_pointer;
+	___DSP_DUAL_16BIT_ALLOC(
+	    io_stat_reg_addr,
+	    iofifo_pointer
+	)
 
 	/* Init 1 stero:100 ASER1
 	   Init 0 mono:110 ASER2 
 	*/
-	u16 ififo_base_addr;            
-	u16 ist_mo_format;
+	___DSP_DUAL_16BIT_ALLOC(
+	    ififo_base_addr,            
+	    ist_mo_format
+	)
 
 	u32 i_free;
 } async_codec_input_scb_t;
@@ -699,43 +842,59 @@
 
 /* SCB for the SP/DIF CODEC input and output */
 typedef struct _spdifiscb_t {
-	u16 status_ptr;     
-	u16 status_start_ptr;
-  
+	___DSP_DUAL_16BIT_ALLOC(
+	    status_ptr,     
+	    status_start_ptr
+	)
+
 	u32 current_total;
 	u32 previous_total;
 
-	u16 count;
-	u16 count_limit;
-  
+	___DSP_DUAL_16BIT_ALLOC(
+	    count,
+	    count_limit
+	)
+
 	u32 status_data;
-  
-	u16 status;
-	u16 free4;
+
+	___DSP_DUAL_16BIT_ALLOC(  
+	    status,
+	    free4
+	)
 
 	u32 free3;
-  
-	u16 free2;
-	u16 bit_count;
+
+	___DSP_DUAL_16BIT_ALLOC(  
+	    free2,
+	    bit_count
+	)
 
 	u32  temp_status;
   
-	u16 next_SCB;
-	u16 sub_list_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_SCB,
+	    sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,
+	    this_spb
+	)
 
-	u16 entry_point;
-	u16 this_spb;
-  
 	u32  strm_rs_config;
 	u32  strm_buf_ptr;
   
-	u16 stat_reg_addr; 
-	u16 fifo_pointer;
-  
-	u16 fifo_base_addr; 
-	u16 st_mo_format;
-  
-	u32  Free1;
+	___DSP_DUAL_16BIT_ALLOC(
+	    stat_reg_addr, 
+	    fifo_pointer
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    fifo_base_addr, 
+	    st_mo_format
+	)
+
+	u32  free1;
 } spdifiscb_t;
 
 
@@ -751,93 +910,132 @@
 	u32 strm_rs_config;
                                
 	u32 strm_buf_ptr;
-  
-	u16 status;
-	u16 free5;
+
+	___DSP_DUAL_16BIT_ALLOC(  
+	    status,
+	    free5
+	)
 
 	u32 free4;
-  
-	u16 next_scb;
-	u16 sub_list_ptr;
 
-	u16 entry_point;
-	u16 this_spb;
-  
+	___DSP_DUAL_16BIT_ALLOC(  
+	    next_scb,
+	    sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,
+	    this_spb
+	)
+
 	u32 free6[2];
   
-	u16 stat_reg_addr; 
-	u16 fifo_pointer;
-  
-	u16 fifo_base_addr;
-	u16 st_mo_format;
-  
+	___DSP_DUAL_16BIT_ALLOC(
+	    stat_reg_addr, 
+	    fifo_pointer
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    fifo_base_addr,
+	    st_mo_format
+	)
+
 	u32  free1;                                         
 } spdifoscb_t;
 
 
 
 typedef struct _asynch_fg_rx_scb_t {
+	___DSP_DUAL_16BIT_ALLOC(
+	    bot_buf_mask,
+	    buf_Mask
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    max,
+	    min
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    old_producer_pointer,
+	    hfg_scb_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    delta,
+	    adjust_count
+	)
 
-	u16 bot_buf_mask;
-	u16 buf_Mask;
-
-	u16 max;
-	u16 min;
-  
-	u16 old_producer_pointer;
-	u16 hfg_scb_ptr;
-	
-	u16 delta;
-	u16 adjust_count;
-     
 	u32 unused2[5];  
-  
-	u16 sibling_ptr;  
-	u16 child_ptr;
-  
-	u16 code_ptr;
-	u16 this_ptr;
-  
+
+	___DSP_DUAL_16BIT_ALLOC(  
+	    sibling_ptr,  
+	    child_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    code_ptr,
+	    this_ptr
+	)
+
 	u32 strm_rs_config; 
 
 	u32 strm_buf_ptr;
   
 	u32 unused_phi_incr;
   
-	u16 righttarg;   
-	u16 left_targ;
-
-	u16 rightVol;
-	u16 leftVol;
+	___DSP_DUAL_16BIT_ALLOC(
+	    right_targ,   
+	    left_targ
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    right_vol,
+	    left_vol
+	)
 } asynch_fg_rx_scb_t;
 
 
 
 typedef struct _asynch_fg_tx_scb_t {
-	u16 not_buf_mask;
-	u16 buf_mask;
-
-	u16 Max;                   
-	u16 min;
-
-	u16 unused1;
-	u16 hfg_scb_ptr;
-
-	u16 delta;
-	u16 adjust_count;
+	___DSP_DUAL_16BIT_ALLOC(
+	    not_buf_mask,
+	    buf_mask
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    max,
+	    min
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused1,
+	    hfg_scb_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    delta,
+	    adjust_count
+	)
 
 	u32 accum_phi;
 
-	u16 unused2;
-	u16 const_one_third;
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused2,
+	    const_one_third
+	)
 
 	u32 unused3[3];
 
-	u16 sibling_ptr;
-	u16 child_ptr;
-
-	u16 codePtr;
-	u16 this_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    sibling_ptr,
+	    child_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    codePtr,
+	    this_ptr
+	)
 
 	u32 strm_rs_config;
 
@@ -845,11 +1043,15 @@
 
 	u32 phi_incr;
 
-	u16 unused_right_targ;
-	u16 unused_left_targ;
-
-	u16 unused_right_vol;
-	u16 unused_left_vol;
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused_right_targ,
+	    unused_left_targ
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused_right_vol,
+	    unused_left_vol
+	)
 } asynch_fg_tx_scb_t;
 
 
@@ -857,49 +1059,67 @@
 	/* First 13 dwords from generic_scb_t */
 	basic_dma_req_t  basic_req;  /* Optional */
 	scatter_gather_ext_t sg_ext;  /* Optional */
-	u16 next_scb;       /* REQUIRED */
-	u16 sub_list_ptr;   /* REQUIRED */
-
-	u16 entry_point;    /* REQUIRED */
-	u16 this_spb;       /* REQUIRED */
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,       /* REQUIRED */
+	    sub_list_ptr    /* REQUIRED */
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,    /* REQUIRED */
+	    this_spb        /* REQUIRED */
+	)
 
 	u32 strm_rs_config; /* REQUIRED */
 	u32 strm_buf_ptr;   /* REQUIRED */
 
-	u16 init_snoop_input_link;
-	u16 snoop_child_input_scb;
+	___DSP_DUAL_16BIT_ALLOC(
+	    init_snoop_input_link,
+	    snoop_child_input_scb
+	)
 
 	u32 snoop_input_buf_ptr;
 
-	u16 reserved;
-	u16 input_scb;
+	___DSP_DUAL_16BIT_ALLOC(
+	    reserved,
+	    input_scb
+	)
 } output_snoop_scb_t;
 
 typedef struct _spio_write_scb_t {
-	u16 address1;
-	u16 address2;
+	___DSP_DUAL_16BIT_ALLOC(
+	    address1,
+	    address2
+	)
 
 	u32 data1;
 
 	u32 data2;
 
-	u16 address3;
-	u16 address4;
+	___DSP_DUAL_16BIT_ALLOC(
+	    address3,
+	    address4
+	)
 
 	u32 data3;
 
 	u32 data4;
 
-	u16 unused1;
-	u16 data_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    unused1,
+	    data_ptr
+	)
 
 	u32 unused2[2];
 
-	u16 sibling_ptr;
-	u16 child_ptr;
-
-	u16 entry_point;
-	u16 this_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    sibling_ptr,
+	    child_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,
+	    this_ptr
+	)
 
 	u32 unused3[5];
 } spio_write_scb_t;
@@ -920,11 +1140,15 @@
 
 	u32 i7;
 
-	u16 next_scb;
-	u16 sub_list_ptr;
-
-	u16 entry_point;
-	u16 this_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    next_scb,
+	    sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    entry_point,
+	    this_ptr
+	)
 
 	u32 strm_buf_config;
 	u32 strm_buf_ptr2;
@@ -933,4 +1157,60 @@
 
 	volume_control_t vdec_vol_ctrl;
 } magic_snoop_task_t;
+
+
+typedef struct _filter_scb_t {
+	___DSP_DUAL_16BIT_ALLOC(
+	      a0_right,          /* 0x00 */
+	      a0_left
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	      a1_right,          /* 0x01 */
+	      a1_left
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	      a2_right,          /* 0x02 */
+	      a2_left
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	      output_buf_ptr,    /* 0x03 */
+	      init
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	      filter_unused3,    /* 0x04 */
+	      filter_unused2
+	)
+
+	u32 prev_sample_output1; /* 0x05 */
+	u32 prev_sample_output2; /* 0x06 */
+	u32 prev_sample_input1;  /* 0x07 */
+	u32 prev_sample_input2;  /* 0x08 */
+
+	___DSP_DUAL_16BIT_ALLOC(
+	      next_scb_ptr,      /* 0x09 */
+	      sub_list_ptr
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	      entry_point,       /* 0x0A */
+	      spb_ptr
+	)
+
+	u32  strm_rs_config;     /* 0x0B */
+	u32  strm_buf_ptr;       /* 0x0C */
+
+	___DSP_DUAL_16BIT_ALLOC(
+              b0_right,          /* 0x0D */
+	      b0_left
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+              b1_right,          /* 0x0E */
+	      b1_left
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+              b2_right,          /* 0x0F */
+	      b2_left
+	)
+} filter_scb_t;
 #endif /* __DSP_SCB_TYPES_H__ */
diff -Nru a/include/sound/cs46xx_dsp_spos.h b/include/sound/cs46xx_dsp_spos.h
--- a/include/sound/cs46xx_dsp_spos.h	Sat Apr 19 19:51:48 2003
+++ b/include/sound/cs46xx_dsp_spos.h	Sat Apr 19 19:51:48 2003
@@ -52,17 +52,18 @@
 #define DSP_MAX_TASK_DESC   50
 
 #define DSP_MAX_PCM_CHANNELS 32
-#define DSP_MAX_SRC_NR       6
+#define DSP_MAX_SRC_NR       14
 
-#define DSP_PCM_MAIN_CHANNEL    1
-#define DSP_PCM_REAR_CHANNEL    2
-#define DSP_PCM_CENTER_CHANNEL  3
-#define DSP_PCM_LFE_CHANNEL     4
-#define DSP_IEC958_CHANNEL      5
-
-#define DSP_SPDIF_STATUS_OUTPUT_ENABLED 1
-#define DSP_SPDIF_STATUS_PLAYBACK_OPEN  2
-#define DSP_SPDIF_STATUS_HW_ENABLED     4
+#define DSP_PCM_MAIN_CHANNEL        1
+#define DSP_PCM_REAR_CHANNEL        2
+#define DSP_PCM_CENTER_LFE_CHANNEL  3
+#define DSP_PCM_S71_CHANNEL         4 /* surround 7.1 */
+#define DSP_IEC958_CHANNEL          5
+
+#define DSP_SPDIF_STATUS_OUTPUT_ENABLED       1
+#define DSP_SPDIF_STATUS_PLAYBACK_OPEN        2
+#define DSP_SPDIF_STATUS_HW_ENABLED           4
+#define DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED   8
 
 struct _dsp_module_desc_t;
 
@@ -157,8 +158,11 @@
 	u16 dac_volume_right;
 	u16 dac_volume_left;
 
-	/* Rear PCM playback mixer */
+	/* Rear/surround PCM playback mixer */
 	dsp_scb_descriptor_t * rear_mix_scb;
+
+	/* Center/LFE mixer */
+	dsp_scb_descriptor_t * center_lfe_mix_scb;
 
 	int npcm_channels;
 	int nsrc_scb;
diff -Nru a/include/sound/cs46xx_dsp_task_types.h b/include/sound/cs46xx_dsp_task_types.h
--- a/include/sound/cs46xx_dsp_task_types.h	Sat Apr 19 19:51:50 2003
+++ b/include/sound/cs46xx_dsp_task_types.h	Sat Apr 19 19:51:50 2003
@@ -27,6 +27,8 @@
 #ifndef __CS46XX_DSP_TASK_TYPES_H__
 #define __CS46XX_DSP_TASK_TYPES_H__
 
+#include "cs46xx_dsp_scb_types.h"
+
 /*********************************************************************************************
 Example hierarchy of stream control blocks in the SP
 
@@ -54,7 +56,7 @@
 #define		HFG_CONTEXT_SWITCH_MODE			0x0002
 #define		HFG_CONTEXT_SWITCH_MODE_BIT		1
 
-#define MAX_FG_STACK_SIZE 	32				// THESE NEED TO BE COMPUTED PROPERLY
+#define MAX_FG_STACK_SIZE 	32			/* THESE NEED TO BE COMPUTED PROPERLY */
 #define MAX_MG_STACK_SIZE 	16
 #define MAX_BG_STACK_SIZE 	9
 #define MAX_HFG_STACK_SIZE	4
@@ -74,64 +76,84 @@
 	u32	r54_save;
 	u32	r98_save;
 
-	u16 status_save;
-	u16 ind_save;
-
-	u16 rci1_save;
-	u16 rci0_save;
+	___DSP_DUAL_16BIT_ALLOC(
+	    status_save,
+	    ind_save
+	)
+
+	___DSP_DUAL_16BIT_ALLOC(
+	    rci1_save,
+	    rci0_save
+	)
 
 	u32	r32_save;
 	u32	r76_save;
 	u32	rsd2_save;
 
-	u16   rsi2_save;	  /* See TaskTreeParameterBlock for 
+       	___DSP_DUAL_16BIT_ALLOC(
+	      rsi2_save,	  /* See TaskTreeParameterBlock for 
 				     remainder of registers  */
-	u16	rsa2Save;
+	      rsa2Save
+	)
 	/* saved as part of HFG context  */
 } hf_save_area_t;
 
 
 /* Task link data structure */
 typedef struct _tree_link_t {
+	___DSP_DUAL_16BIT_ALLOC(
 	/* Pointer to sibling task control block */
-	u16 next_scb;
+	    next_scb,
 	/* Pointer to child task control block */
-	u16 sub_ptr;
+	    sub_ptr
+	)
   
+	___DSP_DUAL_16BIT_ALLOC(
 	/* Pointer to code entry point */
-	u16 entry_point; 
+	    entry_point, 
 	/* Pointer to local data */
-	u16 this_spb;
+	    this_spb
+	)
 } tree_link_t;
 
 
 typedef struct _task_tree_data_t {
+	___DSP_DUAL_16BIT_ALLOC(
 	/* Initial tock count; controls task tree execution rate */
-	u16 tock_count_limit;
+	    tock_count_limit,
 	/* Tock down counter */
-	u16 tock_count;
-  
+	    tock_count
+	)
+
 	/* Add to ActiveCount when TockCountLimit reached: 
 	   Subtract on task tree termination */
-	u16 active_tncrement;		
+	___DSP_DUAL_16BIT_ALLOC(
+	    active_tncrement,		
 	/* Number of pending activations for task tree */
-	u16 active_count;
+	    active_count
+	)
 
+        ___DSP_DUAL_16BIT_ALLOC(
 	/* BitNumber to enable modification of correct bit in ActiveTaskFlags */
-	u16 active_bit;	    
+	    active_bit,	    
 	/* Pointer to OS location for indicating current activity on task level */
-	u16 active_task_flags_ptr;
+	    active_task_flags_ptr
+	)
 
 	/* Data structure for controlling movement of memory blocks:- 
 	   currently unused */
-	u16 mem_upd_ptr;
+	___DSP_DUAL_16BIT_ALLOC(
+	    mem_upd_ptr,
 	/* Data structure for controlling synchronous link update */
-	u16 link_upd_ptr;
+	    link_upd_ptr
+	)
   
+	___DSP_DUAL_16BIT_ALLOC(
 	/* Save area for remainder of full context. */
-	u16 save_area;  
+	    save_area,
 	/* Address of start of local stack for data storage */
-	u16 data_stack_base_ptr;
+	    data_stack_base_ptr
+	)
 
 } task_tree_data_t;
 
@@ -140,12 +162,16 @@
 typedef struct _interval_timer_data_t
 {
 	/* These data items have the same relative locations to those */
-	u16  interval_timer_period;
-	u16  itd_unused;
+	___DSP_DUAL_16BIT_ALLOC(
+	     interval_timer_period,
+	     itd_unused
+	)
 
 	/* used for this data in the SPOS control block for SPOS 1.0 */
-	u16  num_FG_ticks_this_interval;        
-	u16  num_intervals;
+	___DSP_DUAL_16BIT_ALLOC(
+	     num_FG_ticks_this_interval,        
+	     num_intervals
+	)
 } interval_timer_data_t;    
 
 
@@ -155,24 +181,36 @@
 	/* Up to 10 values are saved onto the stack.  8 for the task tree, 1 for
 	   The access to the context switch (call or interrupt), and 1 spare that
 	   users should never use.  This last may be required by the system */
-	u16       stack1;		
-	u16		stack0;
-	u16       stack3;		
-	u16		stack2;
-	u16       stack5;		
-	u16		stack4;
-	u16       stack7;
-	u16		stack6;
-	u16       stack9;
-	u16		stack8;
+	___DSP_DUAL_16BIT_ALLOC(
+	     stack1,
+	     stack0
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	     stack3,
+	     stack2
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	     stack5,
+	     stack4
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	     stack7,
+	     stack6
+	)
+	___DSP_DUAL_16BIT_ALLOC(
+	     stack9,
+	     stack8
+	)
 
-	u32		saverfe;					
+	u32	  saverfe;					
 
 	/* Value may be overwriten by stack save algorithm.
 	   Retain the size of the stack data saved here if used */
-	u16       reserved1;	
-	u16		stack_size;
-	u32		saverba;		  /* (HFG) */
+	___DSP_DUAL_16BIT_ALLOC(
+             reserved1,	
+  	     stack_size
+	)
+	u32		saverba;	  /* (HFG) */
 	u32		saverdc;
 	u32		savers_config_23; /* (HFG) */
 	u32		savers_DMA23;	  /* (HFG) */
@@ -205,8 +243,8 @@
 
 typedef struct _task_tree_control_block_t	{
 	hf_save_area_t		 	context;
-	tree_link_t				links;
-	task_tree_data_t			data;
+	tree_link_t			links;
+	task_tree_data_t		data;
 	task_tree_context_block_t	context_blk;
 	interval_timer_data_t		int_timer;
 } task_tree_control_block_t;
diff -Nru a/include/sound/driver.h b/include/sound/driver.h
--- a/include/sound/driver.h	Sat Apr 19 19:51:46 2003
+++ b/include/sound/driver.h	Sat Apr 19 19:51:46 2003
@@ -27,7 +27,6 @@
 #endif
 
 #include <linux/config.h>
-#include <linux/version.h>
 
 #define SNDRV_CARDS		8	/* number of supported soundcards - don't change - minor numbers */
 
diff -Nru a/include/sound/emu10k1.h b/include/sound/emu10k1.h
--- a/include/sound/emu10k1.h	Sat Apr 19 19:51:29 2003
+++ b/include/sound/emu10k1.h	Sat Apr 19 19:51:29 2003
@@ -49,8 +49,8 @@
 #define NUM_G           64              /* use all channels */
 #define NUM_FXSENDS     4
 
-#define EMU10K1_DMA_MASK	0x1fffffffUL
-#define AUDIGY_DMA_MASK		0xffffffffUL
+#define EMU10K1_DMA_MASK	0x7fffffffUL	/* 31bit */
+#define AUDIGY_DMA_MASK		0xffffffffUL	/* 32bit */
 
 #define TMEMSIZE        256*1024
 #define TMEMSIZEREG     4
@@ -818,9 +818,6 @@
 	unsigned char send_routing[3][8];
 	unsigned char send_volume[3][8];
 	unsigned short attn[3];
-	snd_kcontrol_t *ctl_send_routing;
-	snd_kcontrol_t *ctl_send_volume;
-	snd_kcontrol_t *ctl_attn;
 	emu10k1_pcm_t *epcm;
 } emu10k1_pcm_mixer_t;
 
@@ -980,6 +977,9 @@
 
 	emu10k1_voice_t voices[64];
 	emu10k1_pcm_mixer_t pcm_mixer[32];
+	snd_kcontrol_t *ctl_send_routing;
+	snd_kcontrol_t *ctl_send_volume;
+	snd_kcontrol_t *ctl_attn;
 
 	void (*hwvol_interrupt)(emu10k1_t *emu, unsigned int status);
 	void (*capture_interrupt)(emu10k1_t *emu, unsigned int status);
diff -Nru a/include/sound/hdsp.h b/include/sound/hdsp.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/sound/hdsp.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,92 @@
+#ifndef __SOUND_HDSP_H
+#define __SOUND_HDSP_H
+
+/*
+ *   Copyright (C) 2003 Thomas Charbonnel (thomas@undata.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.
+ */
+
+#define HDSP_MATRIX_MIXER_SIZE 2048
+
+typedef enum {
+	Digiface,
+	Multiface,
+	Undefined,
+} HDSP_IO_Type;
+
+typedef struct _snd_hdsp_peak_rms hdsp_peak_rms_t;
+
+struct _snd_hdsp_peak_rms {
+	unsigned int playback_peaks[26];
+	unsigned int input_peaks[26];
+	unsigned int output_peaks[28];
+	unsigned long long playback_rms[26];
+	unsigned long long input_rms[26];
+};
+
+#define SNDRV_HDSP_IOCTL_GET_PEAK_RMS _IOR('H', 0x40, hdsp_peak_rms_t)
+
+typedef struct _snd_hdsp_config_info hdsp_config_info_t;
+
+struct _snd_hdsp_config_info {
+	unsigned char pref_sync_ref;
+	unsigned char wordclock_sync_check;
+	unsigned char spdif_sync_check;
+	unsigned char adatsync_sync_check;
+	unsigned char adat_sync_check[3];
+	unsigned char spdif_in;
+	unsigned char spdif_out;
+	unsigned char spdif_professional;
+	unsigned char spdif_emphasis;
+	unsigned char spdif_nonaudio;
+	unsigned int spdif_sample_rate;
+	unsigned int system_sample_rate;
+	unsigned int autosync_sample_rate;
+	unsigned char system_clock_mode;
+	unsigned char clock_source;
+	unsigned char autosync_ref;
+	unsigned char line_out;
+	unsigned char passthru; 
+};
+
+#define SNDRV_HDSP_IOCTL_GET_CONFIG_INFO _IOR('H', 0x41, hdsp_config_info_t)
+
+typedef struct _snd_hdsp_firmware hdsp_firmware_t;
+
+struct _snd_hdsp_firmware {
+	unsigned long firmware_data[24413];
+};
+
+#define SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE _IOW('H', 0x42, hdsp_firmware_t)
+
+typedef struct _snd_hdsp_version hdsp_version_t;
+
+struct _snd_hdsp_version {
+	HDSP_IO_Type io_type;
+	unsigned short firmware_rev;
+};
+
+#define SNDRV_HDSP_IOCTL_GET_VERSION _IOR('H', 0x43, hdsp_version_t)
+
+typedef struct _snd_hdsp_mixer hdsp_mixer_t;
+
+struct _snd_hdsp_mixer {
+	unsigned short matrix[HDSP_MATRIX_MIXER_SIZE];
+};
+
+#define SNDRV_HDSP_IOCTL_GET_MIXER _IOR('H', 0x44, hdsp_mixer_t)
+
+#endif /* __SOUND_HDSP_H */
diff -Nru a/include/sound/initval.h b/include/sound/initval.h
--- a/include/sound/initval.h	Sat Apr 19 19:51:27 2003
+++ b/include/sound/initval.h	Sat Apr 19 19:51:27 2003
@@ -25,7 +25,7 @@
 #ifdef MODULE
 #define MODULE_GENERIC_STRING(name, string) \
 static const char __module_generic_string_##name [] \
-  __attribute__ ((section(".modstring"))) = #name "=" string;
+  __attribute__ ((unused, __section__(".modstring"))) = #name "=" string;
 #else
 #define MODULE_GENERIC_STRING(name, string)
 #endif
diff -Nru a/include/sound/memalloc.h b/include/sound/memalloc.h
--- a/include/sound/memalloc.h	Sat Apr 19 19:51:28 2003
+++ b/include/sound/memalloc.h	Sat Apr 19 19:51:28 2003
@@ -174,20 +174,4 @@
 }
 #endif /* CONFIG_PCI */
 
-
-/*
- * wrappers
- */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
-#ifdef CONFIG_PCI
-#if defined(__i386__) || defined(__ppc__) || defined(__x86_64__)
-#define HACK_PCI_ALLOC_CONSISTENT
-/* a hack for 2.4/5 kernels for better allocation of large buffers */
-void *snd_pci_hack_alloc_consistent(struct pci_dev *hwdev, size_t size,
-				    dma_addr_t *dma_handle);
-#endif /* arch */
-#endif /* CONFIG_PCI */
-#endif /* LINUX >= 2.4.0 */
-
-
 #endif /* __SOUND_MEMALLOC_H */
diff -Nru a/include/sound/opl3.h b/include/sound/opl3.h
--- a/include/sound/opl3.h	Sat Apr 19 19:51:28 2003
+++ b/include/sound/opl3.h	Sat Apr 19 19:51:28 2003
@@ -230,7 +230,8 @@
 #define OPL3_HW_OPL3_FM801	0x0303	/* FM801 */
 #define OPL3_HW_OPL3_CS4281	0x0304	/* CS4281 */
 #define OPL3_HW_OPL3_PC98	0x0305	/* PC9800 */
-#define OPL3_HW_OPL4		0x0400
+#define OPL3_HW_OPL4		0x0400	/* YMF278B/YMF295 */
+#define OPL3_HW_OPL4_ML		0x0401	/* YMF704/YMF721 */
 #define OPL3_HW_MASK		0xff00
 
 #define MAX_OPL2_VOICES		9
diff -Nru a/include/sound/snd_wavefront.h b/include/sound/snd_wavefront.h
--- a/include/sound/snd_wavefront.h	Sat Apr 19 19:51:28 2003
+++ b/include/sound/snd_wavefront.h	Sat Apr 19 19:51:28 2003
@@ -98,12 +98,12 @@
 
 struct _snd_wavefront_card {
 	snd_wavefront_t wavefront;
-#ifdef __ISAPNP__
-	struct isapnp_dev *wss;
-	struct isapnp_dev *ctrl;
-	struct isapnp_dev *mpu;
-	struct isapnp_dev *synth;
-#endif /* CONFIG_ISAPNP */
+#ifdef CONFIG_PNP
+	struct pnp_dev *wss;
+	struct pnp_dev *ctrl;
+	struct pnp_dev *mpu;
+	struct pnp_dev *synth;
+#endif /* CONFIG_PNP */
 };
 
 extern void snd_wavefront_internal_interrupt (snd_wavefront_card_t *card);
diff -Nru a/include/sound/trident.h b/include/sound/trident.h
--- a/include/sound/trident.h	Sat Apr 19 19:51:48 2003
+++ b/include/sound/trident.h	Sat Apr 19 19:51:48 2003
@@ -403,10 +403,6 @@
 	unsigned char rvol;		/* rear volume */
 	unsigned char cvol;		/* center volume */
 	unsigned char pad;
-	snd_kcontrol_t *ctl_vol;	/* front volume */
-	snd_kcontrol_t *ctl_pan;	/* pan */
-	snd_kcontrol_t *ctl_rvol;	/* rear volume */
-	snd_kcontrol_t *ctl_cvol;	/* center volume */
 };
 
 struct _snd_trident {
@@ -458,6 +454,10 @@
 
 	unsigned int musicvol_wavevol;
 	snd_trident_pcm_mixer_t pcm_mixer[32];
+	snd_kcontrol_t *ctl_vol;	/* front volume */
+	snd_kcontrol_t *ctl_pan;	/* pan */
+	snd_kcontrol_t *ctl_rvol;	/* rear volume */
+	snd_kcontrol_t *ctl_cvol;	/* center volume */
 
 	spinlock_t reg_lock;
 
diff -Nru a/include/sound/ymfpci.h b/include/sound/ymfpci.h
--- a/include/sound/ymfpci.h	Sat Apr 19 19:51:46 2003
+++ b/include/sound/ymfpci.h	Sat Apr 19 19:51:46 2003
@@ -174,6 +174,28 @@
 #define YDSXG_CAPTURE_VOICES		2
 #define YDSXG_EFFECT_VOICES		5
 
+#define YMFPCI_LEGACY_SBEN	(1 << 0)	/* soundblaster enable */
+#define YMFPCI_LEGACY_FMEN	(1 << 1)	/* OPL3 enable */
+#define YMFPCI_LEGACY_JPEN	(1 << 2)	/* joystick enable */
+#define YMFPCI_LEGACY_MEN	(1 << 3)	/* MPU401 enable */
+#define YMFPCI_LEGACY_MIEN	(1 << 4)	/* MPU RX irq enable */
+#define YMFPCI_LEGACY_IOBITS	(1 << 5)	/* i/o bits range, 0 = 16bit, 1 =10bit */
+#define YMFPCI_LEGACY_SDMA	(3 << 6)	/* SB DMA select */
+#define YMFPCI_LEGACY_SBIRQ	(7 << 8)	/* SB IRQ select */
+#define YMFPCI_LEGACY_MPUIRQ	(7 << 11)	/* MPU IRQ select */
+#define YMFPCI_LEGACY_SIEN	(1 << 14)	/* serialized IRQ */
+#define YMFPCI_LEGACY_LAD	(1 << 15)	/* legacy audio disable */
+
+#define YMFPCI_LEGACY2_FMIO	(3 << 0)	/* OPL3 i/o address (724/740) */
+#define YMFPCI_LEGACY2_SBIO	(3 << 2)	/* SB i/o address (724/740) */
+#define YMFPCI_LEGACY2_MPUIO	(3 << 4)	/* MPU401 i/o address (724/740) */
+#define YMFPCI_LEGACY2_JSIO	(3 << 6)	/* joystick i/o address (724/740) */
+#define YMFPCI_LEGACY2_MAIM	(1 << 8)	/* MPU401 ack intr mask */
+#define YMFPCI_LEGACY2_SMOD	(3 << 11)	/* SB DMA mode */
+#define YMFPCI_LEGACY2_SBVER	(3 << 13)	/* SB version select */
+#define YMFPCI_LEGACY2_IMOD	(1 << 15)	/* legacy IRQ mode */
+/* SIEN:IMOD 0:0 = legacy irq, 0:1 = INTA, 1:0 = serialized IRQ */
+
 /*
  *
  */
@@ -283,6 +305,8 @@
 	unsigned long reg_area_phys;
 	unsigned long reg_area_virt;
 	struct resource *res_reg_area;
+	struct resource *fm_res;
+	struct resource *mpu_res;
 
 	unsigned short old_legacy_ctrl;
 	unsigned int joystick_port;
diff -Nru a/include/video/edid.h b/include/video/edid.h
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/include/video/edid.h	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,27 @@
+#ifndef __linux_video_edid_h__
+#define __linux_video_edid_h__
+
+#ifdef __KERNEL__
+
+#include <linux/config.h>
+#ifdef CONFIG_ALL_PPC
+#include <linux/pci.h>
+#endif
+
+#ifdef CONFIG_X86
+struct edid_info {
+	unsigned char dummy[128];
+};
+
+extern struct edid_info edid_info;
+extern char *get_EDID_from_BIOS(void *);
+
+#endif /* CONFIG_X86 */
+
+#ifdef CONFIG_ALL_PPC
+extern char *get_EDID_from_OF(struct pci_dev *pdev);
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* __linux_video_edid_h__ */
diff -Nru a/init/main.c b/init/main.c
--- a/init/main.c	Sat Apr 19 19:51:28 2003
+++ b/init/main.c	Sat Apr 19 19:51:28 2003
@@ -60,7 +60,7 @@
  * To avoid associated bogus bug reports, we flatly refuse to compile
  * with a gcc that is known to be too old from the very beginning.
  */
-#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 91)
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 95)
 #error Sorry, your GCC is too old. It builds incorrect kernels.
 #endif
 
diff -Nru a/kernel/compat.c b/kernel/compat.c
--- a/kernel/compat.c	Sat Apr 19 19:51:47 2003
+++ b/kernel/compat.c	Sat Apr 19 19:51:47 2003
@@ -226,3 +226,200 @@
 	}
 	return do_futex((unsigned long)uaddr, op, val, timeout);
 }
+
+asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit *rlim);
+
+asmlinkage long compat_sys_setrlimit(unsigned int resource, struct compat_rlimit *rlim)
+{
+	struct rlimit r;
+	int ret;
+	mm_segment_t old_fs = get_fs ();
+
+	if (resource >= RLIM_NLIMITS) 
+		return -EINVAL;	
+
+	if (!access_ok(VERIFY_READ, rlim, sizeof(*rlim)) ||
+	    __get_user(r.rlim_cur, &rlim->rlim_cur) ||
+	    __get_user(r.rlim_max, &rlim->rlim_max))
+		return -EFAULT;
+
+	if (r.rlim_cur == COMPAT_RLIM_INFINITY)
+		r.rlim_cur = RLIM_INFINITY;
+	if (r.rlim_max == COMPAT_RLIM_INFINITY)
+		r.rlim_max = RLIM_INFINITY;
+	set_fs(KERNEL_DS);
+	ret = sys_setrlimit(resource, &r);
+	set_fs(old_fs);
+	return ret;
+}
+
+#ifdef COMPAT_RLIM_OLD_INFINITY
+asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit *rlim);
+
+asmlinkage long compat_sys_old_getrlimit(unsigned int resource, struct compat_rlimit *rlim)
+{
+	struct rlimit r;
+	int ret;
+	mm_segment_t old_fs = get_fs();
+
+	set_fs(KERNEL_DS);
+	ret = sys_old_getrlimit(resource, &r);
+	set_fs(old_fs);
+
+	if (!ret) {
+		if (r.rlim_cur > COMPAT_RLIM_OLD_INFINITY)
+			r.rlim_cur = COMPAT_RLIM_INFINITY;
+		if (r.rlim_max > COMPAT_RLIM_OLD_INFINITY)
+			r.rlim_max = COMPAT_RLIM_INFINITY;
+
+		if (!access_ok(VERIFY_WRITE, rlim, sizeof(*rlim)) ||
+		    __put_user(r.rlim_cur, &rlim->rlim_cur) ||
+		    __put_user(r.rlim_max, &rlim->rlim_max))
+			return -EFAULT;
+	}
+	return ret;
+}
+#endif
+
+asmlinkage long sys_getrlimit (unsigned int resource, struct rlimit *rlim);
+
+asmlinkage long compat_sys_getrlimit (unsigned int resource, struct compat_rlimit *rlim)
+{
+	struct rlimit r;
+	int ret;
+	mm_segment_t old_fs = get_fs();
+
+	set_fs(KERNEL_DS);
+	ret = sys_getrlimit(resource, &r);
+	set_fs(old_fs);
+	if (!ret) {
+		if (r.rlim_cur > COMPAT_RLIM_INFINITY)
+			r.rlim_cur = COMPAT_RLIM_INFINITY;
+		if (r.rlim_max > COMPAT_RLIM_INFINITY)
+			r.rlim_max = COMPAT_RLIM_INFINITY;
+
+		if (!access_ok(VERIFY_WRITE, rlim, sizeof(*rlim)) ||
+		    __put_user(r.rlim_cur, &rlim->rlim_cur) ||
+		    __put_user(r.rlim_max, &rlim->rlim_max))
+			return -EFAULT;
+	}
+	return ret;
+}
+
+static long put_compat_rusage (struct compat_rusage *ru, struct rusage *r)
+{
+	if (!access_ok(VERIFY_WRITE, ru, sizeof(*ru)) ||
+	    __put_user(r->ru_utime.tv_sec, &ru->ru_utime.tv_sec) ||
+	    __put_user(r->ru_utime.tv_usec, &ru->ru_utime.tv_usec) ||
+	    __put_user(r->ru_stime.tv_sec, &ru->ru_stime.tv_sec) ||
+	    __put_user(r->ru_stime.tv_usec, &ru->ru_stime.tv_usec) ||
+	    __put_user(r->ru_maxrss, &ru->ru_maxrss) ||
+	    __put_user(r->ru_ixrss, &ru->ru_ixrss) ||
+	    __put_user(r->ru_idrss, &ru->ru_idrss) ||
+	    __put_user(r->ru_isrss, &ru->ru_isrss) ||
+	    __put_user(r->ru_minflt, &ru->ru_minflt) ||
+	    __put_user(r->ru_majflt, &ru->ru_majflt) ||
+	    __put_user(r->ru_nswap, &ru->ru_nswap) ||
+	    __put_user(r->ru_inblock, &ru->ru_inblock) ||
+	    __put_user(r->ru_oublock, &ru->ru_oublock) ||
+	    __put_user(r->ru_msgsnd, &ru->ru_msgsnd) ||
+	    __put_user(r->ru_msgrcv, &ru->ru_msgrcv) ||
+	    __put_user(r->ru_nsignals, &ru->ru_nsignals) ||
+	    __put_user(r->ru_nvcsw, &ru->ru_nvcsw) ||
+	    __put_user(r->ru_nivcsw, &ru->ru_nivcsw))
+		return -EFAULT;
+	return 0;
+}
+
+asmlinkage long sys_getrusage(int who, struct rusage *ru);
+
+asmlinkage long compat_sys_getrusage(int who, struct compat_rusage *ru)
+{
+	struct rusage r;
+	int ret;
+	mm_segment_t old_fs = get_fs();
+		
+	set_fs(KERNEL_DS);
+	ret = sys_getrusage(who, &r);
+	set_fs(old_fs);
+
+	return ret || put_compat_rusage(ru, &r);
+}
+
+asmlinkage long
+compat_sys_wait4(compat_pid_t pid, compat_uint_t * stat_addr, int options,
+	struct compat_rusage *ru)
+{
+	if (!ru) {
+		return sys_wait4(pid, stat_addr, options, NULL);
+	} else {
+		struct rusage r;
+		int ret;
+		unsigned int status;
+		mm_segment_t old_fs = get_fs();
+
+		set_fs (KERNEL_DS);
+		ret = sys_wait4(pid, stat_addr ? &status : NULL, options, &r);
+		set_fs (old_fs);
+
+		if (!ret)
+		{
+			if (put_compat_rusage(ru, &r)) 
+				return -EFAULT;
+			if (stat_addr && put_user(status, stat_addr))
+				return -EFAULT;
+		}
+		return ret;
+	}
+}
+
+extern asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len,
+					    unsigned long *user_mask_ptr);
+
+asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid, 
+					     unsigned int len,
+					     compat_ulong_t *user_mask_ptr)
+{
+	unsigned long kernel_mask;
+	mm_segment_t old_fs;
+	int ret;
+
+	if (get_user(kernel_mask, user_mask_ptr))
+		return -EFAULT;
+
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	ret = sys_sched_setaffinity(pid,
+				    sizeof(kernel_mask),
+				    &kernel_mask);
+	set_fs(old_fs);
+
+	return ret;
+}
+
+extern asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len,
+					    unsigned long *user_mask_ptr);
+
+asmlinkage int compat_sys_sched_getaffinity(compat_pid_t pid, unsigned int len,
+					    compat_ulong_t *user_mask_ptr)
+{
+	unsigned long kernel_mask;
+	mm_segment_t old_fs;
+	int ret;
+
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	ret = sys_sched_getaffinity(pid,
+				    sizeof(kernel_mask),
+				    &kernel_mask);
+	set_fs(old_fs);
+
+	if (ret > 0) {
+		if (put_user(kernel_mask, user_mask_ptr))
+			ret = -EFAULT;
+		ret = sizeof(compat_ulong_t);
+	}
+
+	return ret;
+}
+
diff -Nru a/kernel/extable.c b/kernel/extable.c
--- a/kernel/extable.c	Sat Apr 19 19:51:46 2003
+++ b/kernel/extable.c	Sat Apr 19 19:51:46 2003
@@ -20,7 +20,7 @@
 
 extern const struct exception_table_entry __start___ex_table[];
 extern const struct exception_table_entry __stop___ex_table[];
-extern char _stext[], _etext[];
+extern char _stext[], _etext[], _sinittext[], _einittext[];
 
 /* Given an address, look for it in the exception tables. */
 const struct exception_table_entry *search_exception_tables(unsigned long addr)
@@ -37,6 +37,10 @@
 {
 	if (addr >= (unsigned long)_stext &&
 	    addr <= (unsigned long)_etext)
+		return 1;
+
+	if (addr >= (unsigned long)_sinittext &&
+	    addr <= (unsigned long)_einittext)
 		return 1;
 
 	return module_text_address(addr) != NULL;
diff -Nru a/kernel/fork.c b/kernel/fork.c
--- a/kernel/fork.c	Sat Apr 19 19:51:28 2003
+++ b/kernel/fork.c	Sat Apr 19 19:51:28 2003
@@ -603,7 +603,7 @@
 
 	atomic_set(&newf->count, 1);
 
-	newf->file_lock	    = RW_LOCK_UNLOCKED;
+	newf->file_lock	    = SPIN_LOCK_UNLOCKED;
 	newf->next_fd	    = 0;
 	newf->max_fds	    = NR_OPEN_DEFAULT;
 	newf->max_fdset	    = __FD_SETSIZE;
@@ -616,13 +616,13 @@
 	size = oldf->max_fdset;
 	if (size > __FD_SETSIZE) {
 		newf->max_fdset = 0;
-		write_lock(&newf->file_lock);
+		spin_lock(&newf->file_lock);
 		error = expand_fdset(newf, size-1);
-		write_unlock(&newf->file_lock);
+		spin_unlock(&newf->file_lock);
 		if (error)
 			goto out_release;
 	}
-	read_lock(&oldf->file_lock);
+	spin_lock(&oldf->file_lock);
 
 	open_files = count_open_files(oldf, size);
 
@@ -633,15 +633,15 @@
 	 */
 	nfds = NR_OPEN_DEFAULT;
 	if (open_files > nfds) {
-		read_unlock(&oldf->file_lock);
+		spin_unlock(&oldf->file_lock);
 		newf->max_fds = 0;
-		write_lock(&newf->file_lock);
+		spin_lock(&newf->file_lock);
 		error = expand_fd_array(newf, open_files-1);
-		write_unlock(&newf->file_lock);
+		spin_unlock(&newf->file_lock);
 		if (error) 
 			goto out_release;
 		nfds = newf->max_fds;
-		read_lock(&oldf->file_lock);
+		spin_lock(&oldf->file_lock);
 	}
 
 	old_fds = oldf->fd;
@@ -656,7 +656,7 @@
 			get_file(f);
 		*new_fds++ = f;
 	}
-	read_unlock(&oldf->file_lock);
+	spin_unlock(&oldf->file_lock);
 
 	/* compute the remainder to be cleared */
 	size = (newf->max_fds - open_files) * sizeof(struct file *);
@@ -873,7 +873,8 @@
 		goto bad_fork_cleanup_sighand;
 	if (copy_mm(clone_flags, p))
 		goto bad_fork_cleanup_signal;
-	if (copy_namespace(clone_flags, p))
+	retval = copy_namespace(clone_flags, p);
+	if (retval)
 		goto bad_fork_cleanup_mm;
 	retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
 	if (retval)
diff -Nru a/kernel/futex.c b/kernel/futex.c
--- a/kernel/futex.c	Sat Apr 19 19:51:29 2003
+++ b/kernel/futex.c	Sat Apr 19 19:51:29 2003
@@ -448,7 +448,7 @@
 	return ret;
 }
 
-asmlinkage long sys_futex(u32 *uaddr, int op, int val, struct timespec *utime)
+asmlinkage long sys_futex(u32 __user *uaddr, int op, int val, struct timespec __user *utime)
 {
 	struct timespec t;
 	unsigned long timeout = MAX_SCHEDULE_TIMEOUT;
diff -Nru a/kernel/itimer.c b/kernel/itimer.c
--- a/kernel/itimer.c	Sat Apr 19 19:51:47 2003
+++ b/kernel/itimer.c	Sat Apr 19 19:51:47 2003
@@ -48,7 +48,7 @@
 }
 
 /* SMP: Only we modify our itimer values. */
-asmlinkage long sys_getitimer(int which, struct itimerval *value)
+asmlinkage long sys_getitimer(int which, struct itimerval __user *value)
 {
 	int error = -EFAULT;
 	struct itimerval get_buffer;
@@ -120,8 +120,9 @@
 /* SMP: Again, only we play with our itimers, and signals are SMP safe
  *      now so that is not an issue at all anymore.
  */
-asmlinkage long sys_setitimer(int which, struct itimerval *value,
-			      struct itimerval *ovalue)
+asmlinkage long sys_setitimer(int which,
+			      struct itimerval __user *value,
+			      struct itimerval __user *ovalue)
 {
 	struct itimerval set_buffer, get_buffer;
 	int error;
diff -Nru a/kernel/kallsyms.c b/kernel/kallsyms.c
--- a/kernel/kallsyms.c	Sat Apr 19 19:51:50 2003
+++ b/kernel/kallsyms.c	Sat Apr 19 19:51:50 2003
@@ -15,7 +15,22 @@
 extern char kallsyms_names[] __attribute__((weak));
 
 /* Defined by the linker script. */
-extern char _stext[], _etext[];
+extern char _stext[], _etext[], _sinittext[], _einittext[];
+
+static inline int is_kernel_inittext(unsigned long addr)
+{
+	if (addr >= (unsigned long)_sinittext
+	    && addr <= (unsigned long)_einittext)
+		return 1;
+	return 0;
+}
+
+static inline int is_kernel_text(unsigned long addr)
+{
+	if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext)
+		return 1;
+	return 0;
+}
 
 /* Lookup an address.  modname is set to NULL if it's in the kernel. */
 const char *kallsyms_lookup(unsigned long addr,
@@ -31,7 +46,7 @@
 	namebuf[127] = 0;
 	namebuf[0] = 0;
 
-	if (addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) {
+	if (is_kernel_text(addr) || is_kernel_inittext(addr)) {
 		unsigned long symbol_end;
 		char *name = kallsyms_names;
 
@@ -52,6 +67,8 @@
 		/* Base symbol size on next symbol. */
 		if (best + 1 < kallsyms_num_syms)
 			symbol_end = kallsyms_addresses[best + 1];
+		else if (is_kernel_inittext(addr))
+			symbol_end = (unsigned long)_einittext;
 		else
 			symbol_end = (unsigned long)_etext;
 
diff -Nru a/kernel/ksyms.c b/kernel/ksyms.c
--- a/kernel/ksyms.c	Sat Apr 19 19:51:27 2003
+++ b/kernel/ksyms.c	Sat Apr 19 19:51:27 2003
@@ -58,6 +58,7 @@
 #include <linux/ptrace.h>
 #include <linux/time.h>
 #include <linux/backing-dev.h>
+#include <linux/percpu_counter.h>
 #include <asm/checksum.h>
 
 #if defined(CONFIG_PROC_FS)
@@ -100,6 +101,7 @@
 #ifdef CONFIG_SMP
 EXPORT_SYMBOL(kmalloc_percpu);
 EXPORT_SYMBOL(kfree_percpu);
+EXPORT_SYMBOL(percpu_counter_mod);
 #endif
 EXPORT_SYMBOL(vfree);
 EXPORT_SYMBOL(__vmalloc);
diff -Nru a/kernel/module.c b/kernel/module.c
--- a/kernel/module.c	Sat Apr 19 19:51:49 2003
+++ b/kernel/module.c	Sat Apr 19 19:51:49 2003
@@ -165,7 +165,7 @@
 		if (gplok) {
 			for (i = 0; i < mod->num_gpl_syms; i++) {
 				if (strcmp(mod->gpl_syms[i].name, name) == 0) {
-					*crc = symversion(mod->crcs, i);
+					*crc = symversion(mod->gpl_crcs, i);
 					return mod->gpl_syms[i].value;
 				}
 			}
@@ -462,7 +462,7 @@
 EXPORT_SYMBOL(cleanup_module);
 
 asmlinkage long
-sys_delete_module(const char *name_user, unsigned int flags)
+sys_delete_module(const char __user *name_user, unsigned int flags)
 {
 	struct module *mod;
 	char name[MODULE_NAME_LEN];
@@ -670,7 +670,7 @@
 	return 0;
 }
 
-extern int set_obsolete(const char *val, struct kernel_param *kp)
+int set_obsolete(const char *val, struct kernel_param *kp)
 {
 	unsigned int min, max;
 	unsigned int size, maxsize;
@@ -1082,9 +1082,9 @@
 
 /* Allocate and load the module: note that size of section 0 is always
    zero, and we rely on this for optional sections. */
-static struct module *load_module(void *umod,
+static struct module *load_module(void __user *umod,
 				  unsigned long len,
-				  const char *uargs)
+				  const char __user *uargs)
 {
 	Elf_Ehdr *hdr;
 	Elf_Shdr *sechdrs;
@@ -1360,9 +1360,9 @@
 
 /* This is where the real work happens */
 asmlinkage long
-sys_init_module(void *umod,
+sys_init_module(void __user *umod,
 		unsigned long len,
-		const char *uargs)
+		const char __user *uargs)
 {
 	struct module *mod;
 	int ret;
diff -Nru a/kernel/panic.c b/kernel/panic.c
--- a/kernel/panic.c	Sat Apr 19 19:51:50 2003
+++ b/kernel/panic.c	Sat Apr 19 19:51:50 2003
@@ -20,6 +20,8 @@
 asmlinkage void sys_sync(void);	/* it's really int */
 
 int panic_timeout;
+int panic_on_oops;
+int tainted;
 
 struct notifier_block *panic_notifier_list;
 
@@ -28,7 +30,6 @@
 	panic_timeout = simple_strtoul(str, NULL, 0);
 	return 1;
 }
-
 __setup("panic=", panic_setup);
 
 /**
@@ -51,7 +52,7 @@
 
 	bust_spinlocks(1);
 	va_start(args, fmt);
-	vsprintf(buf, fmt, args);
+	vsnprintf(buf, sizeof(buf), fmt, args);
 	va_end(args);
 	printk(KERN_EMERG "Kernel panic: %s\n",buf);
 	if (in_interrupt())
@@ -123,5 +124,3 @@
 		snprintf(buf, sizeof(buf), "Not tainted");
 	return(buf);
 }
-
-int tainted = 0;
diff -Nru a/kernel/posix-timers.c b/kernel/posix-timers.c
--- a/kernel/posix-timers.c	Sat Apr 19 19:51:47 2003
+++ b/kernel/posix-timers.c	Sat Apr 19 19:51:47 2003
@@ -77,6 +77,18 @@
 # define timer_active(tmr) BARFY	// error to use outside of SMP
 # define set_timer_inactive(tmr) do { } while (0)
 #endif
+
+/*
+ * For some reason mips/mips64 define the SIGEV constants plus 128.
+ * Here we define a mask to get rid of the common bits.	 The
+ * optimizer should make this costless to all but mips.
+ */
+#define MIPS_SIGEV ~(SIGEV_NONE & \
+		      SIGEV_SIGNAL & \
+		      SIGEV_THREAD &  \
+		      SIGEV_THREAD_ID)
+
+#define REQUEUE_PENDING 1
 /*
  * The timer ID is turned into a timer address by idr_find().
  * Verifying a valid ID consists of:
@@ -225,10 +237,9 @@
 	struct now_struct now;
 
 	/* Set up the timer for the next interval (if there is one) */
-	if (!timr->it_incr) {
-		set_timer_inactive(timr);
+	if (!timr->it_incr) 
 		return;
-	}
+
 	posix_get_now(&now);
 	do {
 		posix_bump_timer(timr);
@@ -236,7 +247,7 @@
 
 	timr->it_overrun_last = timr->it_overrun;
 	timr->it_overrun = -1;
-	timr->it_requeue_pending = 0;
+	++timr->it_requeue_pending;
 	add_timer(&timr->it_timer);
 }
 
@@ -258,7 +269,7 @@
 
 	timr = lock_timer(info->si_tid, &flags);
 
-	if (!timr || !timr->it_requeue_pending)
+	if (!timr || timr->it_requeue_pending != info->si_sys_private)
 		goto exit;
 
 	schedule_next_timer(timr);
@@ -276,6 +287,16 @@
  * indicating that the signal was either not queued or was queued
  * without an info block.  In this case, we will not get a call back to
  * do_schedule_next_timer() so we do it here.  This should be rare...
+
+ * An interesting problem can occur if, while a signal, and thus a call
+ * back is pending, the timer is rearmed, i.e. stopped and restarted.
+ * We then need to sort out the call back and do the right thing.  What
+ * we do is to put a counter in the info block and match it with the
+ * timers copy on the call back.  If they don't match, we just ignore
+ * the call back.  The counter is local to the timer and we use odd to
+ * indicate a call back is pending.  Note that we do allow the timer to 
+ * be deleted while a signal is pending.  The standard says we can
+ * allow that signal to be delivered, and we do. 
  */
 
 static void timer_notify_task(struct k_itimer *timr)
@@ -291,12 +312,14 @@
 	info.si_code = SI_TIMER;
 	info.si_tid = timr->it_id;
 	info.si_value = timr->it_sigev_value;
-	if (!timr->it_incr)
-		set_timer_inactive(timr);
-	else
-		timr->it_requeue_pending = info.si_sys_private = 1;
+	if (timr->it_incr)
+		info.si_sys_private = ++timr->it_requeue_pending;
 
-	ret = send_sig_info(info.si_signo, &info, timr->it_process);
+	if (timr->it_sigev_notify & SIGEV_THREAD_ID & MIPS_SIGEV)
+		ret = send_sig_info(info.si_signo, &info, timr->it_process);
+	else
+		ret = send_group_sig_info(info.si_signo, &info, 
+					  timr->it_process);
 	switch (ret) {
 
 	default:
@@ -332,23 +355,11 @@
 	unsigned long flags;
 
 	spin_lock_irqsave(&timr->it_lock, flags);
+ 	set_timer_inactive(timr);
 	timer_notify_task(timr);
 	unlock_timer(timr, flags);
 }
 
-/*
- * For some reason mips/mips64 define the SIGEV constants plus 128.
- * Here we define a mask to get rid of the common bits.	 The
- * optimizer should make this costless to all but mips.
- */
-#if (ARCH == mips) || (ARCH == mips64)
-#define MIPS_SIGEV ~(SIGEV_NONE & \
-		      SIGEV_SIGNAL & \
-		      SIGEV_THREAD &  \
-		      SIGEV_THREAD_ID)
-#else
-#define MIPS_SIGEV (int)-1
-#endif
 
 static inline struct task_struct * good_sigevent(sigevent_t * event)
 {
@@ -402,7 +413,8 @@
 
 asmlinkage long
 sys_timer_create(clockid_t which_clock,
-		 struct sigevent *timer_event_spec, timer_t * created_timer_id)
+		 struct sigevent __user *timer_event_spec,
+		 timer_t __user * created_timer_id)
 {
 	int error = 0;
 	struct k_itimer *new_timer = NULL;
@@ -602,7 +614,7 @@
 			posix_time_before(&timr->it_timer, &now))
 		timr->it_timer.expires = expires = 0;
 	if (expires) {
-		if (timr->it_requeue_pending ||
+		if (timr->it_requeue_pending & REQUEUE_PENDING ||
 		    (timr->it_sigev_notify & SIGEV_NONE))
 			while (posix_time_before(&timr->it_timer, &now))
 				posix_bump_timer(timr);
@@ -623,7 +635,7 @@
 
 /* Get the time remaining on a POSIX.1b interval timer. */
 asmlinkage long
-sys_timer_gettime(timer_t timer_id, struct itimerspec *setting)
+sys_timer_gettime(timer_t timer_id, struct itimerspec __user *setting)
 {
 	struct k_itimer *timr;
 	struct itimerspec cur_setting;
@@ -764,7 +776,8 @@
 #else
 	del_timer(&timr->it_timer);
 #endif
-	timr->it_requeue_pending = 0;
+	timr->it_requeue_pending = (timr->it_requeue_pending + 2) & 
+		~REQUEUE_PENDING;
 	timr->it_overrun_last = 0;
 	timr->it_overrun = -1;
 	/*
@@ -801,8 +814,8 @@
 /* Set a POSIX.1b interval timer */
 asmlinkage long
 sys_timer_settime(timer_t timer_id, int flags,
-		  const struct itimerspec *new_setting,
-		  struct itimerspec *old_setting)
+		  const struct itimerspec __user *new_setting,
+		  struct itimerspec __user *old_setting)
 {
 	struct k_itimer *timr;
 	struct itimerspec new_spec, old_spec;
@@ -847,8 +860,7 @@
 {
 	timer->it_incr = 0;
 #ifdef CONFIG_SMP
-	if (timer_active(timer) &&
-	    !del_timer(&timer->it_timer) && !timer->it_requeue_pending)
+	if (timer_active(timer) && !del_timer(&timer->it_timer))
 		/*
 		 * It can only be active if on an other cpu.  Since
 		 * we have cleared the interval stuff above, it should
@@ -985,7 +997,7 @@
 }
 
 asmlinkage long
-sys_clock_settime(clockid_t which_clock, const struct timespec *tp)
+sys_clock_settime(clockid_t which_clock, const struct timespec __user *tp)
 {
 	struct timespec new_tp;
 
@@ -1002,7 +1014,7 @@
 }
 
 asmlinkage long
-sys_clock_gettime(clockid_t which_clock, struct timespec *tp)
+sys_clock_gettime(clockid_t which_clock, struct timespec __user *tp)
 {
 	struct timespec rtn_tp;
 	int error = 0;
@@ -1021,7 +1033,7 @@
 }
 
 asmlinkage long
-sys_clock_getres(clockid_t which_clock, struct timespec *tp)
+sys_clock_getres(clockid_t which_clock, struct timespec __user *tp)
 {
 	struct timespec rtn_tp;
 
@@ -1074,7 +1086,7 @@
 #ifdef FOLD_NANO_SLEEP_INTO_CLOCK_NANO_SLEEP
 
 asmlinkage long
-sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp)
+sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
 {
 	struct timespec t;
 	long ret;
@@ -1096,7 +1108,8 @@
 
 asmlinkage long
 sys_clock_nanosleep(clockid_t which_clock, int flags,
-		    const struct timespec *rqtp, struct timespec *rmtp)
+		    const struct timespec __user *rqtp,
+		    struct timespec __user *rmtp)
 {
 	struct timespec t;
 	int ret;
@@ -1218,7 +1231,7 @@
 	int ret = do_clock_nanosleep(restart_block->arg0, 0, &t);
 
 	if ((ret == -ERESTART_RESTARTBLOCK) && restart_block->arg1 &&
-	    copy_to_user((struct timespec *)(restart_block->arg1), &t,
+	    copy_to_user((struct timespec __user *)(restart_block->arg1), &t,
 			 sizeof (t)))
 		return -EFAULT;
 	return ret;
diff -Nru a/kernel/printk.c b/kernel/printk.c
--- a/kernel/printk.c	Sat Apr 19 19:51:51 2003
+++ b/kernel/printk.c	Sat Apr 19 19:51:51 2003
@@ -155,7 +155,7 @@
  *	8 -- Set level of messages printed to console
  *	9 -- Return number of unread characters in the log buffer
  */
-int do_syslog(int type, char * buf, int len)
+int do_syslog(int type, char __user * buf, int len)
 {
 	unsigned long i, j, limit, count;
 	int do_clear = 0;
@@ -276,7 +276,7 @@
 	return error;
 }
 
-asmlinkage long sys_syslog(int type, char * buf, int len)
+asmlinkage long sys_syslog(int type, char __user * buf, int len)
 {
 	return do_syslog(type, buf, len);
 }
diff -Nru a/kernel/ptrace.c b/kernel/ptrace.c
--- a/kernel/ptrace.c	Sat Apr 19 19:51:51 2003
+++ b/kernel/ptrace.c	Sat Apr 19 19:51:51 2003
@@ -179,14 +179,18 @@
 
 		flush_cache_page(vma, addr);
 
+		/*
+		 * FIXME!  We used to have flush_page_to_ram() in here, but
+		 * that was wrong.  davem says we need a new per-arch primitive
+		 * to handle this correctly.
+		 */
+
 		maddr = kmap(page);
 		if (write) {
 			memcpy(maddr + offset, buf, bytes);
-			flush_page_to_ram(page);
 			flush_icache_user_range(vma, page, addr, bytes);
 		} else {
 			memcpy(buf, maddr + offset, bytes);
-			flush_page_to_ram(page);
 		}
 		kunmap(page);
 		page_cache_release(page);
@@ -200,7 +204,7 @@
 	return buf - old_buf;
 }
 
-int ptrace_readdata(struct task_struct *tsk, unsigned long src, char *dst, int len)
+int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len)
 {
 	int copied = 0;
 
@@ -225,7 +229,7 @@
 	return copied;
 }
 
-int ptrace_writedata(struct task_struct *tsk, char * src, unsigned long dst, int len)
+int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len)
 {
 	int copied = 0;
 
@@ -278,19 +282,18 @@
 	return (data & ~PTRACE_O_MASK) ? -EINVAL : 0;
 }
 
-static int ptrace_getsiginfo(struct task_struct *child, long data)
+static int ptrace_getsiginfo(struct task_struct *child, siginfo_t __user * data)
 {
 	if (child->last_siginfo == NULL)
 		return -EINVAL;
-	return copy_siginfo_to_user ((siginfo_t *) data, child->last_siginfo);
+	return copy_siginfo_to_user(data, child->last_siginfo);
 }
 
-static int ptrace_setsiginfo(struct task_struct *child, long data)
+static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * data)
 {
 	if (child->last_siginfo == NULL)
 		return -EINVAL;
-	if (copy_from_user (child->last_siginfo, (siginfo_t *) data,
-			    sizeof (siginfo_t)) != 0)
+	if (copy_from_user(child->last_siginfo, data, sizeof (siginfo_t)) != 0)
 		return -EFAULT;
 	return 0;
 }
@@ -308,13 +311,13 @@
 		ret = ptrace_setoptions(child, data);
 		break;
 	case PTRACE_GETEVENTMSG:
-		ret = put_user(child->ptrace_message, (unsigned long *) data);
+		ret = put_user(child->ptrace_message, (unsigned long __user *) data);
 		break;
 	case PTRACE_GETSIGINFO:
-		ret = ptrace_getsiginfo(child, data);
+		ret = ptrace_getsiginfo(child, (siginfo_t __user *) data);
 		break;
 	case PTRACE_SETSIGINFO:
-		ret = ptrace_setsiginfo(child, data);
+		ret = ptrace_setsiginfo(child, (siginfo_t __user *) data);
 		break;
 	default:
 		break;
diff -Nru a/kernel/sched.c b/kernel/sched.c
--- a/kernel/sched.c	Sat Apr 19 19:51:50 2003
+++ b/kernel/sched.c	Sat Apr 19 19:51:50 2003
@@ -1427,9 +1427,6 @@
 {
 	unsigned long flags;
 
-	if (unlikely(!q))
-		return;
-
 	spin_lock_irqsave(&q->lock, flags);
 	__wake_up_common(q, mode, nr_exclusive, 0);
 	spin_unlock_irqrestore(&q->lock, flags);
@@ -1711,7 +1708,7 @@
 /*
  * setscheduler - change the scheduling policy and/or RT priority of a thread.
  */
-static int setscheduler(pid_t pid, int policy, struct sched_param *param)
+static int setscheduler(pid_t pid, int policy, struct sched_param __user *param)
 {
 	struct sched_param lp;
 	int retval = -EINVAL;
@@ -1804,7 +1801,7 @@
  * @param: structure containing the new RT priority.
  */
 asmlinkage long sys_sched_setscheduler(pid_t pid, int policy,
-				      struct sched_param *param)
+				      struct sched_param __user *param)
 {
 	return setscheduler(pid, policy, param);
 }
@@ -1814,7 +1811,7 @@
  * @pid: the pid in question.
  * @param: structure containing the new RT priority.
  */
-asmlinkage long sys_sched_setparam(pid_t pid, struct sched_param *param)
+asmlinkage long sys_sched_setparam(pid_t pid, struct sched_param __user *param)
 {
 	return setscheduler(pid, -1, param);
 }
@@ -1850,7 +1847,7 @@
  * @pid: the pid in question.
  * @param: structure containing the RT priority.
  */
-asmlinkage long sys_sched_getparam(pid_t pid, struct sched_param *param)
+asmlinkage long sys_sched_getparam(pid_t pid, struct sched_param __user *param)
 {
 	struct sched_param lp;
 	int retval = -EINVAL;
@@ -1892,7 +1889,7 @@
  * @user_mask_ptr: user-space pointer to the new cpu mask
  */
 asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len,
-				      unsigned long *user_mask_ptr)
+				      unsigned long __user *user_mask_ptr)
 {
 	unsigned long new_mask;
 	int retval;
@@ -1944,7 +1941,7 @@
  * @user_mask_ptr: user-space pointer to hold the current cpu mask
  */
 asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len,
-				      unsigned long *user_mask_ptr)
+				      unsigned long __user *user_mask_ptr)
 {
 	unsigned int real_len;
 	unsigned long mask;
@@ -2110,7 +2107,7 @@
  * this syscall writes the default timeslice value of a given process
  * into the user-space timespec buffer. A value of '0' means infinity.
  */
-asmlinkage long sys_sched_rr_get_interval(pid_t pid, struct timespec *interval)
+asmlinkage long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval)
 {
 	int retval = -EINVAL;
 	struct timespec t;
@@ -2343,7 +2340,8 @@
  */
 static int migration_thread(void * data)
 {
-	struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+	/* Marking "param" __user is ok, since we do a set_fs(KERNEL_DS); */
+	struct sched_param __user param = { .sched_priority = MAX_RT_PRIO-1 };
 	int cpu = (long) data;
 	runqueue_t *rq;
 	int ret;
diff -Nru a/kernel/signal.c b/kernel/signal.c
--- a/kernel/signal.c	Sat Apr 19 19:51:46 2003
+++ b/kernel/signal.c	Sat Apr 19 19:51:46 2003
@@ -1720,7 +1720,7 @@
 }
 
 asmlinkage long
-sys_rt_sigprocmask(int how, sigset_t *set, sigset_t *oset, size_t sigsetsize)
+sys_rt_sigprocmask(int how, sigset_t __user *set, sigset_t __user *oset, size_t sigsetsize)
 {
 	int error = -EINVAL;
 	sigset_t old_set, new_set;
@@ -1755,7 +1755,7 @@
 	return error;
 }
 
-long do_sigpending(void *set, unsigned long sigsetsize)
+long do_sigpending(void __user *set, unsigned long sigsetsize)
 {
 	long error = -EINVAL;
 	sigset_t pending;
@@ -1780,14 +1780,14 @@
 }	
 
 asmlinkage long
-sys_rt_sigpending(sigset_t *set, size_t sigsetsize)
+sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize)
 {
 	return do_sigpending(set, sigsetsize);
 }
 
 #ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER
 
-int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
+int copy_siginfo_to_user(siginfo_t __user *to, siginfo_t *from)
 {
 	int err;
 
@@ -1850,8 +1850,10 @@
 #endif
 
 asmlinkage long
-sys_rt_sigtimedwait(const sigset_t *uthese, siginfo_t *uinfo,
-		    const struct timespec *uts, size_t sigsetsize)
+sys_rt_sigtimedwait(const sigset_t __user *uthese,
+		    siginfo_t __user *uinfo,
+		    const struct timespec __user *uts,
+		    size_t sigsetsize)
 {
 	int ret, sig;
 	sigset_t these;
@@ -1980,7 +1982,7 @@
 }
 
 asmlinkage long
-sys_rt_sigqueueinfo(int pid, int sig, siginfo_t *uinfo)
+sys_rt_sigqueueinfo(int pid, int sig, siginfo_t __user *uinfo)
 {
 	siginfo_t info;
 
@@ -2069,7 +2071,7 @@
 }
 
 int 
-do_sigaltstack (const stack_t *uss, stack_t *uoss, unsigned long sp)
+do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long sp)
 {
 	stack_t oss;
 	int error;
@@ -2133,7 +2135,7 @@
 }
 
 asmlinkage long
-sys_sigpending(old_sigset_t *set)
+sys_sigpending(old_sigset_t __user *set)
 {
 	return do_sigpending(set, sizeof(*set));
 }
@@ -2142,7 +2144,7 @@
 /* Alpha has its own versions with special arguments.  */
 
 asmlinkage long
-sys_sigprocmask(int how, old_sigset_t *set, old_sigset_t *oset)
+sys_sigprocmask(int how, old_sigset_t __user *set, old_sigset_t __user *oset)
 {
 	int error;
 	old_sigset_t old_set, new_set;
@@ -2192,7 +2194,9 @@
 
 #ifndef __sparc__
 asmlinkage long
-sys_rt_sigaction(int sig, const struct sigaction *act, struct sigaction *oact,
+sys_rt_sigaction(int sig,
+		 const struct sigaction __user *act,
+		 struct sigaction __user *oact,
 		 size_t sigsetsize)
 {
 	struct k_sigaction new_sa, old_sa;
diff -Nru a/kernel/softirq.c b/kernel/softirq.c
--- a/kernel/softirq.c	Sat Apr 19 19:51:29 2003
+++ b/kernel/softirq.c	Sat Apr 19 19:51:29 2003
@@ -51,7 +51,7 @@
 		wake_up_process(tsk);
 }
 
-asmlinkage void do_softirq()
+asmlinkage void do_softirq(void)
 {
 	__u32 pending;
 	unsigned long flags;
@@ -102,10 +102,10 @@
 void local_bh_enable(void)
 {
 	__local_bh_enable();
-	BUG_ON(irqs_disabled());
+	WARN_ON(irqs_disabled());
 	if (unlikely(!in_interrupt() &&
 		     local_softirq_pending()))
-		do_softirq();
+		invoke_softirq();
 	preempt_check_resched();
 }
 EXPORT_SYMBOL(local_bh_enable);
@@ -296,7 +296,7 @@
 	.next		= NULL,
 };
 
-void __init softirq_init()
+void __init softirq_init(void)
 {
 	open_softirq(TASKLET_SOFTIRQ, tasklet_action, NULL);
 	open_softirq(HI_SOFTIRQ, tasklet_hi_action, NULL);
diff -Nru a/kernel/sys.c b/kernel/sys.c
--- a/kernel/sys.c	Sat Apr 19 19:51:28 2003
+++ b/kernel/sys.c	Sat Apr 19 19:51:28 2003
@@ -377,7 +377,7 @@
  *
  * reboot doesn't sync: do that yourself before calling this.
  */
-asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void * arg)
+asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user * arg)
 {
 	char buffer[256];
 
@@ -430,7 +430,7 @@
 		break;
 
 	case LINUX_REBOOT_CMD_RESTART2:
-		if (strncpy_from_user(&buffer[0], (char *)arg, sizeof(buffer) - 1) < 0) {
+		if (strncpy_from_user(&buffer[0], arg, sizeof(buffer) - 1) < 0) {
 			unlock_kernel();
 			return -EFAULT;
 		}
@@ -877,7 +877,7 @@
 	return old_fsgid;
 }
 
-asmlinkage long sys_times(struct tms * tbuf)
+asmlinkage long sys_times(struct tms __user * tbuf)
 {
 	/*
 	 *	In the SMP world we might just be unlucky and have one of
@@ -1058,7 +1058,7 @@
 /*
  * Supplementary group IDs
  */
-asmlinkage long sys_getgroups(int gidsetsize, gid_t *grouplist)
+asmlinkage long sys_getgroups(int gidsetsize, gid_t __user *grouplist)
 {
 	int i;
 	
@@ -1084,7 +1084,7 @@
  *	without another task interfering.
  */
  
-asmlinkage long sys_setgroups(int gidsetsize, gid_t *grouplist)
+asmlinkage long sys_setgroups(int gidsetsize, gid_t __user *grouplist)
 {
 	gid_t groups[NGROUPS];
 	int retval;
@@ -1093,7 +1093,7 @@
 		return -EPERM;
 	if ((unsigned) gidsetsize > NGROUPS)
 		return -EINVAL;
-	if(copy_from_user(groups, grouplist, gidsetsize * sizeof(gid_t)))
+	if (copy_from_user(groups, grouplist, gidsetsize * sizeof(gid_t)))
 		return -EFAULT;
 	retval = security_task_setgroups(gidsetsize, groups);
 	if (retval)
@@ -1140,7 +1140,7 @@
 
 DECLARE_RWSEM(uts_sem);
 
-asmlinkage long sys_newuname(struct new_utsname * name)
+asmlinkage long sys_newuname(struct new_utsname __user * name)
 {
 	int errno = 0;
 
@@ -1151,7 +1151,7 @@
 	return errno;
 }
 
-asmlinkage long sys_sethostname(char *name, int len)
+asmlinkage long sys_sethostname(char __user *name, int len)
 {
 	int errno;
 
@@ -1169,7 +1169,7 @@
 	return errno;
 }
 
-asmlinkage long sys_gethostname(char *name, int len)
+asmlinkage long sys_gethostname(char __user *name, int len)
 {
 	int i, errno;
 
@@ -1190,7 +1190,7 @@
  * Only setdomainname; getdomainname can be implemented by calling
  * uname()
  */
-asmlinkage long sys_setdomainname(char *name, int len)
+asmlinkage long sys_setdomainname(char __user *name, int len)
 {
 	int errno;
 
@@ -1209,7 +1209,7 @@
 	return errno;
 }
 
-asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit *rlim)
+asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit __user *rlim)
 {
 	if (resource >= RLIM_NLIMITS)
 		return -EINVAL;
@@ -1224,7 +1224,7 @@
  *	Back compatibility for getrlimit. Needed for some apps.
  */
  
-asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit *rlim)
+asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit __user *rlim)
 {
 	struct rlimit x;
 	if (resource >= RLIM_NLIMITS)
@@ -1240,7 +1240,7 @@
 
 #endif
 
-asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit *rlim)
+asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim)
 {
 	struct rlimit new_rlim, *old_rlim;
 	int retval;
@@ -1286,7 +1286,7 @@
  *
  * FIXME! Get the fault counts properly!
  */
-int getrusage(struct task_struct *p, int who, struct rusage *ru)
+int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
 {
 	struct rusage r;
 
@@ -1317,7 +1317,7 @@
 	return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
 }
 
-asmlinkage long sys_getrusage(int who, struct rusage *ru)
+asmlinkage long sys_getrusage(int who, struct rusage __user *ru)
 {
 	if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN)
 		return -EINVAL;
@@ -1350,7 +1350,7 @@
 			current->pdeath_signal = sig;
 			break;
 		case PR_GET_PDEATHSIG:
-			error = put_user(current->pdeath_signal, (int *)arg2);
+			error = put_user(current->pdeath_signal, (int __user *)arg2);
 			break;
 		case PR_GET_DUMPABLE:
 			if (current->mm->dumpable)
diff -Nru a/kernel/sysctl.c b/kernel/sysctl.c
--- a/kernel/sysctl.c	Sat Apr 19 19:51:28 2003
+++ b/kernel/sysctl.c	Sat Apr 19 19:51:28 2003
@@ -263,6 +263,8 @@
 #endif
 	{KERN_PIDMAX, "pid_max", &pid_max, sizeof (int),
 	 0600, NULL, &proc_dointvec},
+	{KERN_PANIC_ON_OOPS,"panic_on_oops",
+	 &panic_on_oops,sizeof(int),0644,NULL,&proc_dointvec},
 	{0}
 };
 
@@ -401,7 +403,7 @@
 	return -ENOTDIR;
 }
 
-extern asmlinkage long sys_sysctl(struct __sysctl_args *args)
+asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
 {
 	struct __sysctl_args tmp;
 	int error;
@@ -442,8 +444,8 @@
 }
 
 static int parse_table(int *name, int nlen,
-		       void *oldval, size_t *oldlenp,
-		       void *newval, size_t newlen,
+		       void __user *oldval, size_t __user *oldlenp,
+		       void __user *newval, size_t newlen,
 		       ctl_table *table, void **context)
 {
 	int n;
@@ -483,8 +485,8 @@
 /* Perform the actual read/write of a sysctl table entry. */
 int do_sysctl_strategy (ctl_table *table, 
 			int *name, int nlen,
-			void *oldval, size_t *oldlenp,
-			void *newval, size_t newlen, void **context)
+			void __user *oldval, size_t __user *oldlenp,
+			void __user *newval, size_t newlen, void **context)
 {
 	int op = 0, rc;
 	size_t len;
@@ -785,10 +787,11 @@
  * Returns 0 on success.
  */
 int proc_dostring(ctl_table *table, int write, struct file *filp,
-		  void *buffer, size_t *lenp)
+		  void __user *buffer, size_t *lenp)
 {
 	size_t len;
-	char *p, c;
+	char __user *p;
+	char c;
 	
 	if (!table->data || !table->maxlen || !*lenp ||
 	    (filp->f_pos && !write)) {
@@ -838,7 +841,7 @@
  */
  
 static int proc_doutsstring(ctl_table *table, int write, struct file *filp,
-		  void *buffer, size_t *lenp)
+		  void __user *buffer, size_t *lenp)
 {
 	int r;
 
@@ -861,7 +864,7 @@
 #define OP_MIN	4
 
 static int do_proc_dointvec(ctl_table *table, int write, struct file *filp,
-		  void *buffer, size_t *lenp, int conv, int op)
+		  void __user *buffer, size_t *lenp, int conv, int op)
 {
 	int *i, vleft, first=1, neg, val;
 	size_t left, len;
@@ -883,12 +886,12 @@
 		if (write) {
 			while (left) {
 				char c;
-				if(get_user(c,(char *) buffer))
+				if (get_user(c,(char __user *) buffer))
 					return -EFAULT;
 				if (!isspace(c))
 					break;
 				left--;
-				((char *) buffer)++;
+				buffer++;
 			}
 			if (!left)
 				break;
@@ -977,7 +980,7 @@
  * Returns 0 on success.
  */
 int proc_dointvec(ctl_table *table, int write, struct file *filp,
-		     void *buffer, size_t *lenp)
+		     void __user *buffer, size_t *lenp)
 {
     return do_proc_dointvec(table,write,filp,buffer,lenp,1,OP_SET);
 }
@@ -987,7 +990,7 @@
  */
  
 int proc_dointvec_bset(ctl_table *table, int write, struct file *filp,
-			void *buffer, size_t *lenp)
+			void __user *buffer, size_t *lenp)
 {
 	if (!capable(CAP_SYS_MODULE)) {
 		return -EPERM;
@@ -1013,7 +1016,7 @@
  * Returns 0 on success.
  */
 int proc_dointvec_minmax(ctl_table *table, int write, struct file *filp,
-		  void *buffer, size_t *lenp)
+		  void __user *buffer, size_t *lenp)
 {
 	int *i, *min, *max, vleft, first=1, neg, val;
 	size_t len, left;
@@ -1041,7 +1044,7 @@
 				if (!isspace(c))
 					break;
 				left--;
-				((char *) buffer)++;
+				buffer++;
 			}
 			if (!left)
 				break;
@@ -1111,7 +1114,7 @@
 
 static int do_proc_doulongvec_minmax(ctl_table *table, int write,
 				     struct file *filp,
-				     void *buffer, size_t *lenp,
+				     void __user *buffer, size_t *lenp,
 				     unsigned long convmul,
 				     unsigned long convdiv)
 {
@@ -1137,12 +1140,12 @@
 		if (write) {
 			while (left) {
 				char c;
-				if(get_user(c, (char *) buffer))
+				if (get_user(c, (char __user *) buffer))
 					return -EFAULT;
 				if (!isspace(c))
 					break;
 				left--;
-				((char *) buffer)++;
+				buffer++;
 			}
 			if (!left)
 				break;
@@ -1150,7 +1153,7 @@
 			len = left;
 			if (len > TMPBUFLEN-1)
 				len = TMPBUFLEN-1;
-			if(copy_from_user(buf, buffer, len))
+			if (copy_from_user(buf, buffer, len))
 				return -EFAULT;
 			buf[len] = 0;
 			p = buf;
@@ -1230,7 +1233,7 @@
  * Returns 0 on success.
  */
 int proc_doulongvec_minmax(ctl_table *table, int write, struct file *filp,
-			   void *buffer, size_t *lenp)
+			   void __user *buffer, size_t *lenp)
 {
     return do_proc_doulongvec_minmax(table, write, filp, buffer, lenp, 1l, 1l);
 }
@@ -1254,7 +1257,7 @@
  */
 int proc_doulongvec_ms_jiffies_minmax(ctl_table *table, int write,
 				      struct file *filp,
-				      void *buffer, size_t *lenp)
+				      void __user *buffer, size_t *lenp)
 {
     return do_proc_doulongvec_minmax(table, write, filp, buffer,
 				     lenp, HZ, 1000l);
@@ -1277,7 +1280,7 @@
  * Returns 0 on success.
  */
 int proc_dointvec_jiffies(ctl_table *table, int write, struct file *filp,
-			  void *buffer, size_t *lenp)
+			  void __user *buffer, size_t *lenp)
 {
     return do_proc_dointvec(table,write,filp,buffer,lenp,HZ,OP_SET);
 }
@@ -1343,8 +1346,8 @@
 
 /* The generic string strategy routine: */
 int sysctl_string(ctl_table *table, int *name, int nlen,
-		  void *oldval, size_t *oldlenp,
-		  void *newval, size_t newlen, void **context)
+		  void __user *oldval, size_t __user *oldlenp,
+		  void __user *newval, size_t newlen, void **context)
 {
 	size_t l, len;
 	
@@ -1451,7 +1454,7 @@
 #else /* CONFIG_SYSCTL */
 
 
-extern asmlinkage long sys_sysctl(struct __sysctl_args *args)
+extern asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
 {
 	return -ENOSYS;
 }
diff -Nru a/kernel/time.c b/kernel/time.c
--- a/kernel/time.c	Sat Apr 19 19:51:29 2003
+++ b/kernel/time.c	Sat Apr 19 19:51:29 2003
@@ -90,7 +90,7 @@
 
 #endif
 
-asmlinkage long sys_gettimeofday(struct timeval *tv, struct timezone *tz)
+asmlinkage long sys_gettimeofday(struct timeval __user *tv, struct timezone __user *tz)
 {
 	if (likely(tv != NULL)) {
 		struct timeval ktv;
@@ -166,7 +166,7 @@
 	return 0;
 }
 
-asmlinkage long sys_settimeofday(struct timeval *tv, struct timezone *tz)
+asmlinkage long sys_settimeofday(struct timeval __user *tv, struct timezone __user *tz)
 {
 	struct timeval	new_tv;
 	struct timezone new_tz;
@@ -387,7 +387,7 @@
 	return(result);
 }
 
-asmlinkage long sys_adjtimex(struct timex *txc_p)
+asmlinkage long sys_adjtimex(struct timex __user *txc_p)
 {
 	struct timex txc;		/* Local copy of parameter */
 	int ret;
diff -Nru a/kernel/timer.c b/kernel/timer.c
--- a/kernel/timer.c	Sat Apr 19 19:51:50 2003
+++ b/kernel/timer.c	Sat Apr 19 19:51:50 2003
@@ -397,7 +397,8 @@
 
 	spin_lock_irq(&base->lock);
 	while (time_after_eq(jiffies, base->timer_jiffies)) {
-		struct list_head *head;
+		struct list_head work_list = LIST_HEAD_INIT(work_list);
+		struct list_head *head = &work_list;
  		int index = base->timer_jiffies & TVR_MASK;
  
 		/*
@@ -409,8 +410,8 @@
 					!cascade(base, &base->tv4, INDEX(2)))
 			cascade(base, &base->tv5, INDEX(3));
 		++base->timer_jiffies; 
+		list_splice_init(base->tv1.vec + index, &work_list);
 repeat:
-		head = base->tv1.vec + index;
 		if (!list_empty(head)) {
 			void (*fn)(unsigned long);
 			unsigned long data;
@@ -1091,7 +1092,7 @@
 /*
  * sys_sysinfo - fill in sysinfo struct
  */ 
-asmlinkage long sys_sysinfo(struct sysinfo *info)
+asmlinkage long sys_sysinfo(struct sysinfo __user *info)
 {
 	struct sysinfo val;
 	u64 uptime;
diff -Nru a/kernel/uid16.c b/kernel/uid16.c
--- a/kernel/uid16.c	Sat Apr 19 19:51:48 2003
+++ b/kernel/uid16.c	Sat Apr 19 19:51:48 2003
@@ -107,7 +107,7 @@
 	return sys_setfsgid((gid_t)gid);
 }
 
-asmlinkage long sys_getgroups16(int gidsetsize, old_gid_t *grouplist)
+asmlinkage long sys_getgroups16(int gidsetsize, old_gid_t __user *grouplist)
 {
 	old_gid_t groups[NGROUPS];
 	int i,j;
@@ -126,7 +126,7 @@
 	return i;
 }
 
-asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t *grouplist)
+asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t __user *grouplist)
 {
 	old_gid_t groups[NGROUPS];
 	gid_t new_groups[NGROUPS];
diff -Nru a/kernel/workqueue.c b/kernel/workqueue.c
--- a/kernel/workqueue.c	Sat Apr 19 19:51:51 2003
+++ b/kernel/workqueue.c	Sat Apr 19 19:51:51 2003
@@ -27,13 +27,21 @@
 #include <linux/slab.h>
 
 /*
- * The per-CPU workqueue:
+ * The per-CPU workqueue.
+ *
+ * The sequence counters are for flush_scheduled_work().  It wants to wait
+ * until until all currently-scheduled works are completed, but it doesn't
+ * want to be livelocked by new, incoming ones.  So it waits until
+ * remove_sequence is >= the insert_sequence which pertained when
+ * flush_scheduled_work() was called.
  */
 struct cpu_workqueue_struct {
 
 	spinlock_t lock;
 
-	atomic_t nr_queued;
+	long remove_sequence;	/* Least-recently added (next to run) */
+	long insert_sequence;	/* Next to add */
+
 	struct list_head worklist;
 	wait_queue_head_t more_work;
 	wait_queue_head_t work_done;
@@ -71,10 +79,9 @@
 
 		spin_lock_irqsave(&cwq->lock, flags);
 		list_add_tail(&work->entry, &cwq->worklist);
-		atomic_inc(&cwq->nr_queued);
-		spin_unlock_irqrestore(&cwq->lock, flags);
-
+		cwq->insert_sequence++;
 		wake_up(&cwq->more_work);
+		spin_unlock_irqrestore(&cwq->lock, flags);
 		ret = 1;
 	}
 	put_cpu();
@@ -93,11 +100,13 @@
 	 */
 	spin_lock_irqsave(&cwq->lock, flags);
 	list_add_tail(&work->entry, &cwq->worklist);
+	cwq->insert_sequence++;
 	wake_up(&cwq->more_work);
 	spin_unlock_irqrestore(&cwq->lock, flags);
 }
 
-int queue_delayed_work(struct workqueue_struct *wq, struct work_struct *work, unsigned long delay)
+int queue_delayed_work(struct workqueue_struct *wq,
+			struct work_struct *work, unsigned long delay)
 {
 	int ret = 0, cpu = get_cpu();
 	struct timer_list *timer = &work->timer;
@@ -107,18 +116,11 @@
 		BUG_ON(timer_pending(timer));
 		BUG_ON(!list_empty(&work->entry));
 
-		/*
-		 * Increase nr_queued so that the flush function
-		 * knows that there's something pending.
-		 */
-		atomic_inc(&cwq->nr_queued);
 		work->wq_data = cwq;
-
 		timer->expires = jiffies + delay;
 		timer->data = (unsigned long)work;
 		timer->function = delayed_work_timer_fn;
 		add_timer(timer);
-
 		ret = 1;
 	}
 	put_cpu();
@@ -135,7 +137,8 @@
 	 */
 	spin_lock_irqsave(&cwq->lock, flags);
 	while (!list_empty(&cwq->worklist)) {
-		struct work_struct *work = list_entry(cwq->worklist.next, struct work_struct, entry);
+		struct work_struct *work = list_entry(cwq->worklist.next,
+						struct work_struct, entry);
 		void (*f) (void *) = work->func;
 		void *data = work->data;
 
@@ -146,14 +149,9 @@
 		clear_bit(0, &work->pending);
 		f(data);
 
-		/*
-		 * We only wake up 'work done' waiters (flush) when
-		 * the last function has been fully processed.
-		 */
-		if (atomic_dec_and_test(&cwq->nr_queued))
-			wake_up(&cwq->work_done);
-
 		spin_lock_irqsave(&cwq->lock, flags);
+		cwq->remove_sequence++;
+		wake_up(&cwq->work_done);
 	}
 	spin_unlock_irqrestore(&cwq->lock, flags);
 }
@@ -223,37 +221,41 @@
  * Forces execution of the workqueue and blocks until its completion.
  * This is typically used in driver shutdown handlers.
  *
- * NOTE: if work is being added to the queue constantly by some other
- * context then this function might block indefinitely.
+ * This function will sample each workqueue's current insert_sequence number and
+ * will sleep until the head sequence is greater than or equal to that.  This
+ * means that we sleep until all works which were queued on entry have been
+ * handled, but we are not livelocked by new incoming ones.
+ *
+ * This function used to run the workqueues itself.  Now we just wait for the
+ * helper threads to do it.
  */
 void flush_workqueue(struct workqueue_struct *wq)
 {
 	struct cpu_workqueue_struct *cwq;
 	int cpu;
 
+	might_sleep();
+
 	for (cpu = 0; cpu < NR_CPUS; cpu++) {
+		DEFINE_WAIT(wait);
+		long sequence_needed;
+
 		if (!cpu_online(cpu))
 			continue;
 		cwq = wq->cpu_wq + cpu;
 
-		if (atomic_read(&cwq->nr_queued)) {
-			DECLARE_WAITQUEUE(wait, current);
-
-			if (!list_empty(&cwq->worklist))
-				run_workqueue(cwq);
+		spin_lock_irq(&cwq->lock);
+		sequence_needed = cwq->insert_sequence;
 
-			/*
-			 * Wait for helper thread(s) to finish up
-			 * the queue:
-			 */
-			set_task_state(current, TASK_INTERRUPTIBLE);
-			add_wait_queue(&cwq->work_done, &wait);
-			if (atomic_read(&cwq->nr_queued))
-				schedule();
-			else
-				set_task_state(current, TASK_RUNNING);
-			remove_wait_queue(&cwq->work_done, &wait);
+		while (sequence_needed - cwq->remove_sequence > 0) {
+			prepare_to_wait(&cwq->work_done, &wait,
+					TASK_UNINTERRUPTIBLE);
+			spin_unlock_irq(&cwq->lock);
+			schedule();
+			spin_lock_irq(&cwq->lock);
 		}
+		finish_wait(&cwq->work_done, &wait);
+		spin_unlock_irq(&cwq->lock);
 	}
 }
 
@@ -279,7 +281,8 @@
 		spin_lock_init(&cwq->lock);
 		cwq->wq = wq;
 		cwq->thread = NULL;
-		atomic_set(&cwq->nr_queued, 0);
+		cwq->insert_sequence = 0;
+		cwq->remove_sequence = 0;
 		INIT_LIST_HEAD(&cwq->worklist);
 		init_waitqueue_head(&cwq->more_work);
 		init_waitqueue_head(&cwq->work_done);
diff -Nru a/lib/Makefile b/lib/Makefile
--- a/lib/Makefile	Sat Apr 19 19:51:28 2003
+++ b/lib/Makefile	Sat Apr 19 19:51:28 2003
@@ -14,6 +14,7 @@
 
 obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
 obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
+obj-$(CONFIG_SMP) += percpu_counter.o
 
 ifneq ($(CONFIG_HAVE_DEC_LOCK),y) 
   obj-y += dec_and_lock.o
diff -Nru a/lib/kobject.c b/lib/kobject.c
--- a/lib/kobject.c	Sat Apr 19 19:51:50 2003
+++ b/lib/kobject.c	Sat Apr 19 19:51:50 2003
@@ -11,14 +11,6 @@
 
 static spinlock_t kobj_lock = SPIN_LOCK_UNLOCKED;
 
-static inline struct kobj_type * get_ktype(struct kobject * k)
-{
-	if (k->kset && k->kset->ktype)
-		return k->kset->ktype;
-	else 
-		return k->ktype;
-}
-
 /**
  *	populate_dir - populate directory with attributes.
  *	@kobj:	object we're working on.
@@ -67,6 +59,136 @@
 }
 
 
+#ifdef CONFIG_HOTPLUG
+static int get_kobj_path_length(struct kset *kset, struct kobject *kobj)
+{
+	int length = 1;
+	struct kobject * parent = kobj;
+
+	/* walk up the ancestors until we hit the one pointing to the 
+	 * root.
+	 * Add 1 to strlen for leading '/' of each level.
+	 */
+	do {
+		length += strlen (parent->name) + 1;
+		parent = parent->parent;
+	} while (parent);
+	return length;
+}
+
+static void fill_kobj_path(struct kset *kset, struct kobject *kobj, char *path, int length)
+{
+	struct kobject * parent;
+
+	--length;
+	for (parent = kobj; parent; parent = parent->parent) {
+		int cur = strlen (parent->name);
+		/* back up enough to print this name with '/' */
+		length -= cur;
+		strncpy (path + length, parent->name, cur);
+		*(path + --length) = '/';
+	}
+
+	pr_debug("%s: path = '%s'\n",__FUNCTION__,path);
+}
+
+#define BUFFER_SIZE	1024	/* should be enough memory for the env */
+#define NUM_ENVP	32	/* number of env pointers */
+static void kset_hotplug(const char *action, struct kset *kset,
+			 struct kobject *kobj)
+{
+	char *argv [3];
+	char **envp = NULL;
+	char *buffer = NULL;
+	char *scratch;
+	int i = 0;
+	int retval;
+	int kobj_path_length;
+	char *kobj_path = NULL;
+	char *name = NULL;
+
+	/* If the kset has a filter operation, call it. If it returns
+	   failure, no hotplug event is required. */
+	if (kset->hotplug_ops->filter) {
+		if (!kset->hotplug_ops->filter(kset, kobj))
+			return;
+	}
+
+	pr_debug ("%s\n", __FUNCTION__);
+
+	if (!hotplug_path[0])
+		return;
+
+	envp = kmalloc(NUM_ENVP * sizeof (char *), GFP_KERNEL);
+	if (!envp)
+		return;
+	memset (envp, 0x00, NUM_ENVP * sizeof (char *));
+
+	buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);
+	if (!buffer)
+		goto exit;
+
+	if (kset->hotplug_ops->name)
+		name = kset->hotplug_ops->name(kset, kobj);
+	if (name == NULL)
+		name = kset->kobj.name;
+
+	argv [0] = hotplug_path;
+	argv [1] = name;
+	argv [2] = 0;
+
+	/* minimal command environment */
+	envp [i++] = "HOME=/";
+	envp [i++] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
+
+	scratch = buffer;
+
+	envp [i++] = scratch;
+	scratch += sprintf(scratch, "ACTION=%s", action) + 1;
+
+	kobj_path_length = get_kobj_path_length (kset, kobj);
+	kobj_path = kmalloc (kobj_path_length, GFP_KERNEL);
+	if (!kobj_path)
+		goto exit;
+	memset (kobj_path, 0x00, kobj_path_length);
+	fill_kobj_path (kset, kobj, kobj_path, kobj_path_length);
+
+	envp [i++] = scratch;
+	scratch += sprintf (scratch, "DEVPATH=%s", kobj_path) + 1;
+
+	if (kset->hotplug_ops->hotplug) {
+		/* have the kset specific function add its stuff */
+		retval = kset->hotplug_ops->hotplug (kset, kobj,
+				  &envp[i], NUM_ENVP - i, scratch,
+				  BUFFER_SIZE - (scratch - buffer));
+		if (retval) {
+			pr_debug ("%s - hotplug() returned %d\n",
+				  __FUNCTION__, retval);
+			goto exit;
+		}
+	}
+
+	pr_debug ("%s: %s %s %s %s %s %s\n", __FUNCTION__, argv[0], argv[1],
+		  envp[0], envp[1], envp[2], envp[3]);
+	retval = call_usermodehelper (argv[0], argv, envp, 0);
+	if (retval)
+		pr_debug ("%s - call_usermodehelper returned %d\n",
+			  __FUNCTION__, retval);
+
+exit:
+	kfree(kobj_path);
+	kfree(buffer);
+	kfree(envp);
+	return;
+}
+#else
+static void kset_hotplug(const char *action, struct kset *kset,
+			 struct kobject *kobj)
+{
+	return;
+}
+#endif	/* CONFIG_HOTPLUG */
+
 /**
  *	kobject_init - initialize object.
  *	@kobj:	object in question.
@@ -111,6 +233,7 @@
 {
 	int error = 0;
 	struct kobject * parent;
+	struct kobject * top_kobj;
 
 	if (!(kobj = kobject_get(kobj)))
 		return -ENOENT;
@@ -134,6 +257,19 @@
 	error = create_dir(kobj);
 	if (error)
 		unlink(kobj);
+	else {
+		/* If this kobj does not belong to a kset,
+		   try to find a parent that does. */
+		top_kobj = kobj;
+		if (!top_kobj->kset && top_kobj->parent) {
+			do {
+				top_kobj = top_kobj->parent;
+			} while (!top_kobj->kset && top_kobj->parent);
+		}
+	
+		if (top_kobj->kset && top_kobj->kset->hotplug_ops)
+			kset_hotplug("add", top_kobj->kset, kobj);
+	}
 	return error;
 }
 
@@ -162,6 +298,20 @@
 
 void kobject_del(struct kobject * kobj)
 {
+	struct kobject * top_kobj;
+
+	/* If this kobj does not belong to a kset,
+	   try to find a parent that does. */
+	top_kobj = kobj;
+	if (!top_kobj->kset && top_kobj->parent) {
+		do {
+			top_kobj = top_kobj->parent;
+		} while (!top_kobj->kset && top_kobj->parent);
+	}
+
+	if (top_kobj->kset && top_kobj->kset->hotplug_ops)
+		kset_hotplug("remove", top_kobj->kset, kobj);
+
 	sysfs_remove_dir(kobj);
 	unlink(kobj);
 }
diff -Nru a/lib/percpu_counter.c b/lib/percpu_counter.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/lib/percpu_counter.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,18 @@
+
+#include <linux/percpu_counter.h>
+
+void percpu_counter_mod(struct percpu_counter *fbc, long amount)
+{
+	int cpu = get_cpu();
+	long count = fbc->counters[cpu].count;
+
+	count += 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;
+	put_cpu();
+}
diff -Nru a/lib/radix-tree.c b/lib/radix-tree.c
--- a/lib/radix-tree.c	Sat Apr 19 19:51:29 2003
+++ b/lib/radix-tree.c	Sat Apr 19 19:51:29 2003
@@ -349,15 +349,18 @@
  *	@index:		index key
  *
  *	Remove the item at @index from the radix tree rooted at @root.
+ *
+ *	Returns the address of the deleted item, or NULL if it was not present.
  */
-int radix_tree_delete(struct radix_tree_root *root, unsigned long index)
+void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
 {
 	struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path;
 	unsigned int height, shift;
+	void *ret = NULL;
 
 	height = root->height;
 	if (index > radix_tree_maxindex(height))
-		return -ENOENT;
+		goto out;
 
 	shift = (height-1) * RADIX_TREE_MAP_SHIFT;
 	pathp->node = NULL;
@@ -365,7 +368,7 @@
 
 	while (height > 0) {
 		if (*pathp->slot == NULL)
-			return -ENOENT;
+			goto out;
 
 		pathp[1].node = *pathp[0].slot;
 		pathp[1].slot = (struct radix_tree_node **)
@@ -375,8 +378,9 @@
 		height--;
 	}
 
-	if (*pathp[0].slot == NULL)
-		return -ENOENT;
+	ret = *pathp[0].slot;
+	if (ret == NULL)
+		goto out;
 
 	*pathp[0].slot = NULL;
 	while (pathp[0].node && --pathp[0].node->count == 0) {
@@ -387,8 +391,8 @@
 
 	if (root->rnode == NULL)
 		root->height = 0;  /* Empty tree, we can reset the height */
-
-	return 0;
+out:
+	return ret;
 }
 EXPORT_SYMBOL(radix_tree_delete);
 
diff -Nru a/mm/bootmem.c b/mm/bootmem.c
--- a/mm/bootmem.c	Sat Apr 19 19:51:30 2003
+++ b/mm/bootmem.c	Sat Apr 19 19:51:30 2003
@@ -115,6 +115,9 @@
 	if (end > bdata->node_low_pfn)
 		BUG();
 
+	if (addr < bdata->last_success)
+		bdata->last_success = addr;
+
 	/*
 	 * Round up the beginning of the address.
 	 */
@@ -135,26 +138,23 @@
  * is not a problem.
  *
  * On low memory boxes we get it right in 100% of the cases.
- */
-
-/*
+ *
  * alignment has to be a power of 2 value.
+ *
+ * NOTE:  This function is _not_ reenetrant.
  */
-static void * __init __alloc_bootmem_core (bootmem_data_t *bdata, 
-	unsigned long size, unsigned long align, unsigned long goal)
+static void * __init
+__alloc_bootmem_core(struct bootmem_data *bdata, unsigned long size,
+		unsigned long align, unsigned long goal)
 {
-	unsigned long i, start = 0;
+	unsigned long offset, remaining_size, areasize, preferred;
+	unsigned long i, start = 0, incr, eidx;
 	void *ret;
-	unsigned long offset, remaining_size;
-	unsigned long areasize, preferred, incr;
-	unsigned long eidx = bdata->node_low_pfn - (bdata->node_boot_start >>
-							PAGE_SHIFT);
 
-	if (!size) BUG();
-
-	if (align & (align-1))
-		BUG();
+	BUG_ON(!size);
+	BUG_ON(align & (align-1));
 
+	eidx = bdata->node_low_pfn - (bdata->node_boot_start >> PAGE_SHIFT);
 	offset = 0;
 	if (align &&
 	    (bdata->node_boot_start & (align - 1UL)) != 0)
@@ -166,8 +166,11 @@
 	 * first, then we try to allocate lower pages.
 	 */
 	if (goal && (goal >= bdata->node_boot_start) && 
-			((goal >> PAGE_SHIFT) < bdata->node_low_pfn)) {
+	    ((goal >> PAGE_SHIFT) < bdata->node_low_pfn)) {
 		preferred = goal - bdata->node_boot_start;
+
+		if (bdata->last_success >= preferred)
+			preferred = bdata->last_success;
 	} else
 		preferred = 0;
 
@@ -179,6 +182,8 @@
 restart_scan:
 	for (i = preferred; i < eidx; i += incr) {
 		unsigned long j;
+		i = find_next_zero_bit(bdata->node_bootmem_map, eidx, i);
+		i = (i + incr - 1) & -incr;
 		if (test_bit(i, bdata->node_bootmem_map))
 			continue;
 		for (j = i + 1; j < i + areasize; ++j) {
@@ -189,31 +194,33 @@
 		}
 		start = i;
 		goto found;
-	fail_block:;
+	fail_block:
+		;
 	}
+
 	if (preferred) {
 		preferred = offset;
 		goto restart_scan;
 	}
 	return NULL;
+
 found:
-	if (start >= eidx)
-		BUG();
+	bdata->last_success = start << PAGE_SHIFT;
+	BUG_ON(start >= eidx);
 
 	/*
 	 * Is the next page of the previous allocation-end the start
 	 * of this allocation's buffer? If yes then we can 'merge'
 	 * the previous partial page with this allocation.
 	 */
-	if (align < PAGE_SIZE
-	    && bdata->last_offset && bdata->last_pos+1 == start) {
+	if (align < PAGE_SIZE &&
+	    bdata->last_offset && bdata->last_pos+1 == start) {
 		offset = (bdata->last_offset+align-1) & ~(align-1);
-		if (offset > PAGE_SIZE)
-			BUG();
+		BUG_ON(offset > PAGE_SIZE);
 		remaining_size = PAGE_SIZE-offset;
 		if (size < remaining_size) {
 			areasize = 0;
-			// last_pos unchanged
+			/* last_pos unchanged */
 			bdata->last_offset = offset+size;
 			ret = phys_to_virt(bdata->last_pos*PAGE_SIZE + offset +
 						bdata->node_boot_start);
@@ -231,11 +238,12 @@
 		bdata->last_offset = size & ~PAGE_MASK;
 		ret = phys_to_virt(start * PAGE_SIZE + bdata->node_boot_start);
 	}
+
 	/*
 	 * Reserve the area now:
 	 */
 	for (i = start; i < start+areasize; i++)
-		if (test_and_set_bit(i, bdata->node_bootmem_map))
+		if (unlikely(test_and_set_bit(i, bdata->node_bootmem_map)))
 			BUG();
 	memset(ret, 0, size);
 	return ret;
@@ -256,21 +264,21 @@
 	map = bdata->node_bootmem_map;
 	for (i = 0; i < idx; ) {
 		unsigned long v = ~map[i / BITS_PER_LONG];
-		if (v) { 
+		if (v) {
 			unsigned long m;
-			for (m = 1; m && i < idx; m<<=1, page++, i++) { 
+			for (m = 1; m && i < idx; m<<=1, page++, i++) {
 				if (v & m) {
-			count++;
-			ClearPageReserved(page);
-			set_page_count(page, 1);
-			__free_page(page);
-		}
-	}
+					count++;
+					ClearPageReserved(page);
+					set_page_count(page, 1);
+					__free_page(page);
+				}
+			}
 		} else {
 			i+=BITS_PER_LONG;
-			page+=BITS_PER_LONG; 
-		} 	
-	}	
+			page += BITS_PER_LONG;
+		}
+	}
 	total += count;
 
 	/*
diff -Nru a/mm/fadvise.c b/mm/fadvise.c
--- a/mm/fadvise.c	Sat Apr 19 19:51:46 2003
+++ b/mm/fadvise.c	Sat Apr 19 19:51:46 2003
@@ -33,8 +33,10 @@
 
 	inode = file->f_dentry->d_inode;
 	mapping = inode->i_mapping;
-	if (!mapping)
-		return -EINVAL;
+	if (!mapping) {
+		ret = -EINVAL;
+		goto out;
+	}
 
 	bdi = mapping->backing_dev_info;
 
@@ -69,6 +71,7 @@
 	default:
 		ret = -EINVAL;
 	}
+out:
 	fput(file);
 	return ret;
 }
diff -Nru a/mm/filemap.c b/mm/filemap.c
--- a/mm/filemap.c	Sat Apr 19 19:51:46 2003
+++ b/mm/filemap.c	Sat Apr 19 19:51:46 2003
@@ -99,9 +99,9 @@
 	if (unlikely(!PageLocked(page)))
 		PAGE_BUG(page);
 
-	write_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	__remove_from_page_cache(page);
-	write_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 }
 
 static inline int sync_page(struct page *page)
@@ -133,9 +133,9 @@
 	if (mapping->backing_dev_info->memory_backed)
 		return 0;
 
-	write_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	list_splice_init(&mapping->dirty_pages, &mapping->io_pages);
-	write_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	ret = do_writepages(mapping, &wbc);
 	return ret;
 }
@@ -166,7 +166,7 @@
 
 restart:
 	progress = 0;
-	write_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
         while (!list_empty(&mapping->locked_pages)) {
 		struct page *page;
 
@@ -180,7 +180,7 @@
 		if (!PageWriteback(page)) {
 			if (++progress > 32) {
 				if (need_resched()) {
-					write_unlock(&mapping->page_lock);
+					spin_unlock(&mapping->page_lock);
 					__cond_resched();
 					goto restart;
 				}
@@ -190,16 +190,16 @@
 
 		progress = 0;
 		page_cache_get(page);
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 
 		wait_on_page_writeback(page);
 		if (PageError(page))
 			ret = -EIO;
 
 		page_cache_release(page);
-		write_lock(&mapping->page_lock);
+		spin_lock(&mapping->page_lock);
 	}
-	write_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	return ret;
 }
 
@@ -227,7 +227,7 @@
 
 	if (error == 0) {
 		page_cache_get(page);
-		write_lock(&mapping->page_lock);
+		spin_lock(&mapping->page_lock);
 		error = radix_tree_insert(&mapping->page_tree, offset, page);
 		if (!error) {
 			SetPageLocked(page);
@@ -235,7 +235,7 @@
 		} else {
 			page_cache_release(page);
 		}
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 		radix_tree_preload_end();
 	}
 	return error;
@@ -364,11 +364,11 @@
 	 * We scan the hash list read-only. Addition to and removal from
 	 * the hash-list needs a held write-lock.
 	 */
-	read_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	page = radix_tree_lookup(&mapping->page_tree, offset);
 	if (page)
 		page_cache_get(page);
-	read_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	return page;
 }
 
@@ -379,11 +379,11 @@
 {
 	struct page *page;
 
-	read_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	page = radix_tree_lookup(&mapping->page_tree, offset);
 	if (page && TestSetPageLocked(page))
 		page = NULL;
-	read_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	return page;
 }
 
@@ -403,15 +403,15 @@
 {
 	struct page *page;
 
-	read_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 repeat:
 	page = radix_tree_lookup(&mapping->page_tree, offset);
 	if (page) {
 		page_cache_get(page);
 		if (TestSetPageLocked(page)) {
-			read_unlock(&mapping->page_lock);
+			spin_unlock(&mapping->page_lock);
 			lock_page(page);
-			read_lock(&mapping->page_lock);
+			spin_lock(&mapping->page_lock);
 
 			/* Has the page been truncated while we slept? */
 			if (page->mapping != mapping || page->index != offset) {
@@ -421,7 +421,7 @@
 			}
 		}
 	}
-	read_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	return page;
 }
 
@@ -491,12 +491,12 @@
 	unsigned int i;
 	unsigned int ret;
 
-	read_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	ret = radix_tree_gang_lookup(&mapping->page_tree,
 				(void **)pages, start, nr_pages);
 	for (i = 0; i < ret; i++)
 		page_cache_get(pages[i]);
-	read_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	return ret;
 }
 
@@ -1008,11 +1008,9 @@
 
 success:
 	/*
-	 * Found the page and have a reference on it, need to check sharing
-	 * and possibly copy it over to another page..
+	 * Found the page and have a reference on it.
 	 */
 	mark_page_accessed(page);
-	flush_page_to_ram(page);
 	return page;
 
 no_cached_page:
@@ -1124,12 +1122,9 @@
 
 success:
 	/*
-	 * Found the page and have a reference on it, need to check sharing
-	 * and possibly copy it over to another page..
+	 * Found the page and have a reference on it.
 	 */
 	mark_page_accessed(page);
-	flush_page_to_ram(page);
-
 	return page;
 
 no_cached_page:
diff -Nru a/mm/fremap.c b/mm/fremap.c
--- a/mm/fremap.c	Sat Apr 19 19:51:27 2003
+++ b/mm/fremap.c	Sat Apr 19 19:51:27 2003
@@ -78,7 +78,6 @@
 	flush = zap_pte(mm, vma, addr, pte);
 
 	mm->rss++;
-	flush_page_to_ram(page);
 	flush_icache_page(vma, page);
 	set_pte(pte, mk_pte(page, prot));
 	pte_chain = page_add_rmap(page, pte, pte_chain);
diff -Nru a/mm/memory.c b/mm/memory.c
--- a/mm/memory.c	Sat Apr 19 19:51:47 2003
+++ b/mm/memory.c	Sat Apr 19 19:51:47 2003
@@ -292,13 +292,11 @@
 				 * and not mapped via rmap - duplicate the
 				 * mapping as is.
 				 */
-				if (!pfn_valid(pfn)) {
+				page = pfn_to_page(pfn);
+				if (!pfn_valid(pfn) || PageReserved(page)) {
 					set_pte(dst_pte, pte);
 					goto cont_copy_pte_range_noset;
 				}
-				page = pfn_to_page(pfn);
-				if (PageReserved(page))
-					goto cont_copy_pte_range;
 
 				/*
 				 * If it's a COW mapping, write protect it both
@@ -319,7 +317,6 @@
 				get_page(page);
 				dst->rss++;
 
-cont_copy_pte_range:
 				set_pte(dst_pte, pte);
 				pte_chain = page_add_rmap(page, dst_pte,
 							pte_chain);
@@ -601,7 +598,6 @@
 
 	lru_add_drain();
 	spin_lock(&mm->page_table_lock);
-	flush_cache_range(vma, address, end);
 	tlb = tlb_gather_mmu(mm, 0);
 	unmap_vmas(&tlb, mm, vma, address, end, &nr_accounted);
 	tlb_finish_mmu(tlb, address, end);
@@ -916,7 +912,6 @@
 		pte_t *page_table)
 {
 	invalidate_vcache(address, vma->vm_mm, new_page);
-	flush_page_to_ram(new_page);
 	flush_cache_page(vma, address);
 	establish_pte(vma, address, page_table, pte_mkwrite(pte_mkdirty(mk_pte(new_page, vma->vm_page_prot))));
 }
@@ -1206,7 +1201,6 @@
 		pte = pte_mkdirty(pte_mkwrite(pte));
 	unlock_page(page);
 
-	flush_page_to_ram(page);
 	flush_icache_page(vma, page);
 	set_pte(page_table, pte);
 	pte_chain = page_add_rmap(page, page_table, pte_chain);
@@ -1271,7 +1265,6 @@
 			goto out;
 		}
 		mm->rss++;
-		flush_page_to_ram(page);
 		entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
 		lru_cache_add_active(page);
 		mark_page_accessed(page);
@@ -1365,7 +1358,6 @@
 	/* Only go through if we didn't race with anybody else... */
 	if (pte_none(*page_table)) {
 		++mm->rss;
-		flush_page_to_ram(new_page);
 		flush_icache_page(vma, new_page);
 		entry = mk_pte(new_page, vma->vm_page_prot);
 		if (write_access)
diff -Nru a/mm/msync.c b/mm/msync.c
--- a/mm/msync.c	Sat Apr 19 19:51:46 2003
+++ b/mm/msync.c	Sat Apr 19 19:51:46 2003
@@ -125,11 +125,13 @@
 /*
  * MS_SYNC syncs the entire file - including mappings.
  *
- * MS_ASYNC initiates writeout of just the dirty mapped data.
- * This provides no guarantee of file integrity - things like indirect
- * blocks may not have started writeout.  MS_ASYNC is primarily useful
- * where the application knows that it has finished with the data and
- * wishes to intelligently schedule its own I/O traffic.
+ * MS_ASYNC does not start I/O (it used to, up to 2.5.67).  Instead, it just
+ * marks the relevant pages dirty.  The application may now run fsync() to
+ * write out the dirty pages and wait on the writeout and check the result.
+ * Or the application may run fadvise(FADV_DONTNEED) against the fd to start
+ * async writeout immediately.
+ * So my _not_ starting I/O in MS_ASYNC we provide complete flexibility to
+ * applications.
  */
 static int msync_interval(struct vm_area_struct * vma,
 	unsigned long start, unsigned long end, int flags)
@@ -143,22 +145,20 @@
 	if (file && (vma->vm_flags & VM_SHARED)) {
 		ret = filemap_sync(vma, start, end-start, flags);
 
-		if (!ret && (flags & (MS_SYNC|MS_ASYNC))) {
-			struct inode * inode = file->f_dentry->d_inode;
+		if (!ret && (flags & MS_SYNC)) {
+			struct inode *inode = file->f_dentry->d_inode;
 			int err;
 
 			down(&inode->i_sem);
 			ret = filemap_fdatawrite(inode->i_mapping);
-			if (flags & MS_SYNC) {
-				if (file->f_op && file->f_op->fsync) {
-					err = file->f_op->fsync(file, file->f_dentry, 1);
-					if (err && !ret)
-						ret = err;
-				}
-				err = filemap_fdatawait(inode->i_mapping);
-				if (!ret)
+			if (file->f_op && file->f_op->fsync) {
+				err = file->f_op->fsync(file,file->f_dentry,1);
+				if (err && !ret)
 					ret = err;
 			}
+			err = filemap_fdatawait(inode->i_mapping);
+			if (!ret)
+				ret = err;
 			up(&inode->i_sem);
 		}
 	}
diff -Nru a/mm/page-writeback.c b/mm/page-writeback.c
--- a/mm/page-writeback.c	Sat Apr 19 19:51:49 2003
+++ b/mm/page-writeback.c	Sat Apr 19 19:51:49 2003
@@ -138,6 +138,7 @@
 void balance_dirty_pages(struct address_space *mapping)
 {
 	struct page_state ps;
+	long nr_reclaimable;
 	long background_thresh;
 	long dirty_thresh;
 	unsigned long pages_written = 0;
@@ -145,8 +146,7 @@
 
 	struct backing_dev_info *bdi = mapping->backing_dev_info;
 
-	get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
-	while (ps.nr_dirty + ps.nr_writeback > dirty_thresh) {
+	for (;;) {
 		struct writeback_control wbc = {
 			.bdi		= bdi,
 			.sync_mode	= WB_SYNC_NONE,
@@ -154,24 +154,37 @@
 			.nr_to_write	= write_chunk,
 		};
 
+		get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
+		nr_reclaimable = ps.nr_dirty + ps.nr_unstable;
+		if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
+			break;
+
 		dirty_exceeded = 1;
 
-		if (ps.nr_dirty)
+		/* Note: nr_reclaimable denotes nr_dirty + nr_unstable.
+		 * Unstable writes are a feature of certain networked
+		 * filesystems (i.e. NFS) in which data may have been
+		 * written to the server's write cache, but has not yet
+		 * been flushed to permanent storage.
+		 */
+		if (nr_reclaimable) {
 			writeback_inodes(&wbc);
-
-		get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
-		if (ps.nr_dirty + ps.nr_writeback <= dirty_thresh)
-			break;
-		pages_written += write_chunk - wbc.nr_to_write;
-		if (pages_written >= write_chunk)
-			break;		/* We've done our duty */
+			get_dirty_limits(&ps, &background_thresh,
+					&dirty_thresh);
+			nr_reclaimable = ps.nr_dirty + ps.nr_unstable;
+			if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
+				break;
+			pages_written += write_chunk - wbc.nr_to_write;
+			if (pages_written >= write_chunk)
+				break;		/* We've done our duty */
+		}
 		blk_congestion_wait(WRITE, HZ/10);
 	}
 
-	if (ps.nr_dirty + ps.nr_writeback <= dirty_thresh)
+	if (nr_reclaimable + ps.nr_writeback <= dirty_thresh)
 		dirty_exceeded = 0;
 
-	if (!writeback_in_progress(bdi) && ps.nr_dirty > background_thresh)
+	if (!writeback_in_progress(bdi) && nr_reclaimable > background_thresh)
 		pdflush_operation(background_writeout, 0);
 }
 
@@ -231,7 +244,8 @@
 		long dirty_thresh;
 
 		get_dirty_limits(&ps, &background_thresh, &dirty_thresh);
-		if (ps.nr_dirty < background_thresh && min_pages <= 0)
+		if (ps.nr_dirty + ps.nr_unstable < background_thresh
+				&& min_pages <= 0)
 			break;
 		wbc.encountered_congestion = 0;
 		wbc.nr_to_write = MAX_WRITEBACK_PAGES;
@@ -302,7 +316,7 @@
 	oldest_jif = jiffies - (dirty_expire_centisecs * HZ) / 100;
 	start_jif = jiffies;
 	next_jif = start_jif + (dirty_writeback_centisecs * HZ) / 100;
-	nr_to_write = ps.nr_dirty;
+	nr_to_write = ps.nr_dirty + ps.nr_unstable;
 	while (nr_to_write > 0) {
 		wbc.encountered_congestion = 0;
 		wbc.nr_to_write = MAX_WRITEBACK_PAGES;
@@ -425,12 +439,12 @@
 	if (wait && PageWriteback(page))
 		wait_on_page_writeback(page);
 
-	write_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	list_del(&page->list);
 	if (test_clear_page_dirty(page)) {
 		list_add(&page->list, &mapping->locked_pages);
 		page_cache_get(page);
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 		ret = mapping->a_ops->writepage(page, &wbc);
 		if (ret == 0 && wait) {
 			wait_on_page_writeback(page);
@@ -440,7 +454,7 @@
 		page_cache_release(page);
 	} else {
 		list_add(&page->list, &mapping->clean_pages);
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 		unlock_page(page);
 	}
 	return ret;
@@ -513,14 +527,14 @@
 	spin_unlock(&mapping->private_lock);
 
 	if (!TestSetPageDirty(page)) {
-		write_lock(&mapping->page_lock);
+		spin_lock(&mapping->page_lock);
 		if (page->mapping) {	/* Race with truncate? */
 			if (!mapping->backing_dev_info->memory_backed)
 				inc_page_state(nr_dirty);
 			list_del(&page->list);
 			list_add(&page->list, &mapping->dirty_pages);
 		}
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 		__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
 	}
 	
@@ -550,7 +564,7 @@
 		struct address_space *mapping = page->mapping;
 
 		if (mapping) {
-			write_lock(&mapping->page_lock);
+			spin_lock(&mapping->page_lock);
 			if (page->mapping) {	/* Race with truncate? */
 				BUG_ON(page->mapping != mapping);
 				if (!mapping->backing_dev_info->memory_backed)
@@ -558,7 +572,7 @@
 				list_del(&page->list);
 				list_add(&page->list, &mapping->dirty_pages);
 			}
-			write_unlock(&mapping->page_lock);
+			spin_unlock(&mapping->page_lock);
 			__mark_inode_dirty(mapping->host, I_DIRTY_PAGES);
 		}
 	}
diff -Nru a/mm/page_alloc.c b/mm/page_alloc.c
--- a/mm/page_alloc.c	Sat Apr 19 19:51:28 2003
+++ b/mm/page_alloc.c	Sat Apr 19 19:51:28 2003
@@ -936,11 +936,13 @@
 		K(nr_free_pages()),
 		K(nr_free_highpages()));
 
-	printk("Active:%lu inactive:%lu dirty:%lu writeback:%lu free:%u\n",
+	printk("Active:%lu inactive:%lu dirty:%lu writeback:%lu "
+		"unstable:%lu free:%u\n",
 		active,
 		inactive,
 		ps.nr_dirty,
 		ps.nr_writeback,
+		ps.nr_unstable,
 		nr_free_pages());
 
 	for_each_zone(zone) {
@@ -1142,6 +1144,35 @@
 }
 
 /*
+ * Initially all pages are reserved - free ones are freed
+ * up by free_all_bootmem() once the early boot process is
+ * done. Non-atomic initialization, single-pass.
+ */
+void __init memmap_init_zone(struct page *start, unsigned long size, int nid,
+		unsigned long zone, unsigned long start_pfn)
+{
+	struct page *page;
+
+	for (page = start; page < (start + size); page++) {
+		set_page_zone(page, nid * MAX_NR_ZONES + zone);
+		set_page_count(page, 0);
+		SetPageReserved(page);
+		INIT_LIST_HEAD(&page->list);
+#ifdef WANT_PAGE_VIRTUAL
+		/* The shift won't overflow because ZONE_NORMAL is below 4G. */
+		if (zone != ZONE_HIGHMEM)
+			set_page_address(page, __va(start_pfn << PAGE_SHIFT));
+#endif
+		start_pfn++;
+	}
+}
+
+#ifndef __HAVE_ARCH_MEMMAP_INIT
+#define memmap_init(start, size, nid, zone, start_pfn) \
+	memmap_init_zone((start), (size), (nid), (zone), (start_pfn))
+#endif
+
+/*
  * Set up the zone data structures:
  *   - mark all pages reserved
  *   - mark all memory queues empty
@@ -1151,7 +1182,6 @@
 		unsigned long *zones_size, unsigned long *zholes_size)
 {
 	unsigned long i, j;
-	unsigned long local_offset;
 	const unsigned long zone_required_alignment = 1UL << (MAX_ORDER-1);
 	int cpu, nid = pgdat->node_id;
 	struct page *lmem_map = pgdat->node_mem_map;
@@ -1160,7 +1190,6 @@
 	pgdat->nr_zones = 0;
 	init_waitqueue_head(&pgdat->kswapd_wait);
 	
-	local_offset = 0;                /* offset within lmem_map */
 	for (j = 0; j < MAX_NR_ZONES; j++) {
 		struct zone *zone = pgdat->node_zones + j;
 		unsigned long mask;
@@ -1246,36 +1275,17 @@
 		zone->pages_low = mask*2;
 		zone->pages_high = mask*3;
 
-		zone->zone_mem_map = lmem_map + local_offset;
+		zone->zone_mem_map = lmem_map;
 		zone->zone_start_pfn = zone_start_pfn;
 
 		if ((zone_start_pfn) & (zone_required_alignment-1))
 			printk("BUG: wrong zone alignment, it will crash\n");
 
-		/*
-		 * Initially all pages are reserved - free ones are freed
-		 * up by free_all_bootmem() once the early boot process is
-		 * done. Non-atomic initialization, single-pass.
-		 */
-		for (i = 0; i < size; i++) {
-			struct page *page = lmem_map + local_offset + i;
-			set_page_zone(page, nid * MAX_NR_ZONES + j);
-			set_page_count(page, 0);
-			SetPageReserved(page);
-			INIT_LIST_HEAD(&page->list);
-#ifdef WANT_PAGE_VIRTUAL
-			if (j != ZONE_HIGHMEM)
-				/*
-				 * The shift left won't overflow because the
-				 * ZONE_NORMAL is below 4G.
-				 */
-				set_page_address(page,
-					__va(zone_start_pfn << PAGE_SHIFT));
-#endif
-			zone_start_pfn++;
-		}
+		memmap_init(lmem_map, size, nid, j, zone_start_pfn);
+
+		zone_start_pfn += size;
+		lmem_map += size;
 
-		local_offset += size;
 		for (i = 0; ; i++) {
 			unsigned long bitmap_size;
 
@@ -1431,8 +1441,8 @@
 static char *vmstat_text[] = {
 	"nr_dirty",
 	"nr_writeback",
+	"nr_unstable",
 	"nr_page_table_pages",
-	"nr_reverse_maps",
 	"nr_mapped",
 	"nr_slab",
 
diff -Nru a/mm/readahead.c b/mm/readahead.c
--- a/mm/readahead.c	Sat Apr 19 19:51:28 2003
+++ b/mm/readahead.c	Sat Apr 19 19:51:28 2003
@@ -217,7 +217,7 @@
 	/*
 	 * Preallocate as many pages as we will need.
 	 */
-	read_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	for (page_idx = 0; page_idx < nr_to_read; page_idx++) {
 		unsigned long page_offset = offset + page_idx;
 		
@@ -228,16 +228,16 @@
 		if (page)
 			continue;
 
-		read_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 		page = page_cache_alloc_cold(mapping);
-		read_lock(&mapping->page_lock);
+		spin_lock(&mapping->page_lock);
 		if (!page)
 			break;
 		page->index = page_offset;
 		list_add(&page->list, &page_pool);
 		ret++;
 	}
-	read_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 
 	/*
 	 * Now start the IO.  We ignore I/O errors - if the page is not
diff -Nru a/mm/rmap.c b/mm/rmap.c
--- a/mm/rmap.c	Sat Apr 19 19:51:50 2003
+++ b/mm/rmap.c	Sat Apr 19 19:51:50 2003
@@ -14,8 +14,8 @@
 /*
  * Locking:
  * - the page->pte.chain is protected by the PG_chainlock bit,
- *   which nests within the zone->lru_lock, then the
- *   mm->page_table_lock, and then the page lock.
+ *   which nests within the the mm->page_table_lock,
+ *   which nests within the page lock.
  * - because swapout locking is opposite to the locking order
  *   in the page fault path, the swapout path uses trylocks
  *   on the mm->page_table_lock
@@ -46,15 +46,40 @@
  * We use an array of pte pointers in this structure to minimise cache misses
  * while traversing reverse maps.
  */
-#define NRPTE ((L1_CACHE_BYTES - sizeof(void *))/sizeof(pte_addr_t))
+#define NRPTE ((L1_CACHE_BYTES - sizeof(unsigned long))/sizeof(pte_addr_t))
 
+/*
+ * next_and_idx encodes both the address of the next pte_chain and the
+ * offset of the highest-index used pte in ptes[].
+ */
 struct pte_chain {
-	struct pte_chain *next;
+	unsigned long next_and_idx;
 	pte_addr_t ptes[NRPTE];
 } ____cacheline_aligned;
 
 kmem_cache_t	*pte_chain_cache;
 
+static inline struct pte_chain *pte_chain_next(struct pte_chain *pte_chain)
+{
+	return (struct pte_chain *)(pte_chain->next_and_idx & ~NRPTE);
+}
+
+static inline struct pte_chain *pte_chain_ptr(unsigned long pte_chain_addr)
+{
+	return (struct pte_chain *)(pte_chain_addr & ~NRPTE);
+}
+
+static inline int pte_chain_idx(struct pte_chain *pte_chain)
+{
+	return pte_chain->next_and_idx & NRPTE;
+}
+
+static inline unsigned long
+pte_chain_encode(struct pte_chain *pte_chain, int idx)
+{
+	return (unsigned long)pte_chain | idx;
+}
+
 /*
  * pte_chain list management policy:
  *
@@ -89,7 +114,7 @@
  */
 int page_referenced(struct page * page)
 {
-	struct pte_chain * pc;
+	struct pte_chain *pc;
 	int referenced = 0;
 
 	if (TestClearPageReferenced(page))
@@ -104,7 +129,7 @@
 		int nr_chains = 0;
 
 		/* Check all the page tables mapping this page. */
-		for (pc = page->pte.chain; pc; pc = pc->next) {
+		for (pc = page->pte.chain; pc; pc = pte_chain_next(pc)) {
 			int i;
 
 			for (i = NRPTE-1; i >= 0; i--) {
@@ -144,44 +169,12 @@
 {
 	pte_addr_t pte_paddr = ptep_to_paddr(ptep);
 	struct pte_chain *cur_pte_chain;
-	int i;
-
-#ifdef DEBUG_RMAP
-	if (!page || !ptep)
-		BUG();
-	if (!pte_present(*ptep))
-		BUG();
-	if (!ptep_to_mm(ptep))
-		BUG();
-#endif
 
 	if (!pfn_valid(page_to_pfn(page)) || PageReserved(page))
 		return pte_chain;
 
 	pte_chain_lock(page);
 
-#ifdef DEBUG_RMAP
-	/*
-	 * This stuff needs help to get up to highmem speed.
-	 */
-	{
-		struct pte_chain * pc;
-		if (PageDirect(page)) {
-			if (page->pte.direct == pte_paddr)
-				BUG();
-		} else {
-			for (pc = page->pte.chain; pc; pc = pc->next) {
-				for (i = 0; i < NRPTE; i++) {
-					pte_addr_t p = pc->ptes[i];
-
-					if (p && p == pte_paddr)
-						BUG();
-				}
-			}
-		}
-	}
-#endif
-
 	if (page->pte.direct == 0) {
 		page->pte.direct = pte_paddr;
 		SetPageDirect(page);
@@ -194,6 +187,7 @@
 		ClearPageDirect(page);
 		pte_chain->ptes[NRPTE-1] = page->pte.direct;
 		pte_chain->ptes[NRPTE-2] = pte_paddr;
+		pte_chain->next_and_idx = pte_chain_encode(NULL, NRPTE-2);
 		page->pte.direct = 0;
 		page->pte.chain = pte_chain;
 		pte_chain = NULL;	/* We consumed it */
@@ -202,25 +196,17 @@
 
 	cur_pte_chain = page->pte.chain;
 	if (cur_pte_chain->ptes[0]) {	/* It's full */
-		pte_chain->next = cur_pte_chain;
+		pte_chain->next_and_idx = pte_chain_encode(cur_pte_chain,
+								NRPTE - 1);
 		page->pte.chain = pte_chain;
 		pte_chain->ptes[NRPTE-1] = pte_paddr;
 		pte_chain = NULL;	/* We consumed it */
 		goto out;
 	}
-
-	BUG_ON(!cur_pte_chain->ptes[NRPTE-1]);
-
-	for (i = NRPTE-2; i >= 0; i--) {
-		if (!cur_pte_chain->ptes[i]) {
-			cur_pte_chain->ptes[i] = pte_paddr;
-			goto out;
-		}
-	}
-	BUG();
+	cur_pte_chain->ptes[pte_chain_idx(cur_pte_chain) - 1] = pte_paddr;
+	cur_pte_chain->next_and_idx--;
 out:
 	pte_chain_unlock(page);
-	inc_page_state(nr_reverse_maps);
 	return pte_chain;
 }
 
@@ -234,80 +220,61 @@
  * the page.
  * Caller needs to hold the mm->page_table_lock.
  */
-void page_remove_rmap(struct page * page, pte_t * ptep)
+void page_remove_rmap(struct page *page, pte_t *ptep)
 {
 	pte_addr_t pte_paddr = ptep_to_paddr(ptep);
 	struct pte_chain *pc;
 
-	if (!page || !ptep)
-		BUG();
 	if (!pfn_valid(page_to_pfn(page)) || PageReserved(page))
 		return;
-	if (!page_mapped(page))
-		return;		/* remap_page_range() from a driver? */
 
 	pte_chain_lock(page);
 
+	if (!page_mapped(page))
+		goto out_unlock;	/* remap_page_range() from a driver? */
+
 	if (PageDirect(page)) {
 		if (page->pte.direct == pte_paddr) {
 			page->pte.direct = 0;
-			dec_page_state(nr_reverse_maps);
 			ClearPageDirect(page);
 			goto out;
 		}
 	} else {
 		struct pte_chain *start = page->pte.chain;
+		struct pte_chain *next;
 		int victim_i = -1;
 
-		for (pc = start; pc; pc = pc->next) {
+		for (pc = start; pc; pc = next) {
 			int i;
 
-			if (pc->next)
-				prefetch(pc->next);
-			for (i = 0; i < NRPTE; i++) {
+			next = pte_chain_next(pc);
+			if (next)
+				prefetch(next);
+			for (i = pte_chain_idx(pc); i < NRPTE; i++) {
 				pte_addr_t pa = pc->ptes[i];
 
-				if (!pa)
-					continue;
 				if (victim_i == -1)
 					victim_i = i;
 				if (pa != pte_paddr)
 					continue;
 				pc->ptes[i] = start->ptes[victim_i];
-				dec_page_state(nr_reverse_maps);
 				start->ptes[victim_i] = 0;
 				if (victim_i == NRPTE-1) {
 					/* Emptied a pte_chain */
-					page->pte.chain = start->next;
+					page->pte.chain = pte_chain_next(start);
 					__pte_chain_free(start);
 				} else {
-					/* Do singleton->PageDirect here */
+					start->next_and_idx++;
 				}
 				goto out;
 			}
 		}
 	}
-#ifdef DEBUG_RMAP
-	/* Not found. This should NEVER happen! */
-	printk(KERN_ERR "page_remove_rmap: pte_chain %p not present.\n", ptep);
-	printk(KERN_ERR "page_remove_rmap: only found: ");
-	if (PageDirect(page)) {
-		printk("%llx", (u64)page->pte.direct);
-	} else {
-		for (pc = page->pte.chain; pc; pc = pc->next) {
-			int i;
-			for (i = 0; i < NRPTE; i++)
-				printk(" %d:%llx", i, (u64)pc->ptes[i]);
-		}
-	}
-	printk("\n");
-	printk(KERN_ERR "page_remove_rmap: driver cleared PG_reserved ?\n");
-#endif
-
 out:
-	pte_chain_unlock(page);
 	if (!page_mapped(page))
 		dec_page_state(nr_mapped);
+out_unlock:
+	pte_chain_unlock(page);
 	return;
 }
 
@@ -320,9 +287,8 @@
  * table entry mapping a page. Because locking order here is opposite
  * to the locking order used by the page fault path, we use trylocks.
  * Locking:
- *	zone->lru_lock			page_launder()
- *	    page lock			page_launder(), trylock
- *		pte_chain_lock		page_launder()
+ *	    page lock			shrink_list(), trylock
+ *		pte_chain_lock		shrink_list()
  *		    mm->page_table_lock	try_to_unmap_one(), trylock
  */
 static int FASTCALL(try_to_unmap_one(struct page *, pte_addr_t));
@@ -409,8 +375,8 @@
  * @page: the page to get unmapped
  *
  * Tries to remove all the page table entries which are mapping this
- * page, used in the pageout path.  Caller must hold zone->lru_lock
- * and the page lock.  Return values are:
+ * page, used in the pageout path.  Caller must hold the page lock
+ * and its pte chain lock.  Return values are:
  *
  * SWAP_SUCCESS	- we succeeded in removing all mappings
  * SWAP_AGAIN	- we missed a trylock, try again later
@@ -435,7 +401,6 @@
 		ret = try_to_unmap_one(page, page->pte.direct);
 		if (ret == SWAP_SUCCESS) {
 			page->pte.direct = 0;
-			dec_page_state(nr_reverse_maps);
 			ClearPageDirect(page);
 		}
 		goto out;
@@ -445,10 +410,10 @@
 	for (pc = start; pc; pc = next_pc) {
 		int i;
 
-		next_pc = pc->next;
+		next_pc = pte_chain_next(pc);
 		if (next_pc)
 			prefetch(next_pc);
-		for (i = 0; i < NRPTE; i++) {
+		for (i = pte_chain_idx(pc); i < NRPTE; i++) {
 			pte_addr_t pte_paddr = pc->ptes[i];
 
 			if (!pte_paddr)
@@ -466,13 +431,14 @@
 				 */
 				pc->ptes[i] = start->ptes[victim_i];
 				start->ptes[victim_i] = 0;
-				dec_page_state(nr_reverse_maps);
 				victim_i++;
 				if (victim_i == NRPTE) {
-					page->pte.chain = start->next;
+					page->pte.chain = pte_chain_next(start);
 					__pte_chain_free(start);
 					start = page->pte.chain;
 					victim_i = 0;
+				} else {
+					start->next_and_idx++;
 				}
 				break;
 			case SWAP_AGAIN:
@@ -514,8 +480,8 @@
 	int cpu = get_cpu();
 	struct pte_chain **pte_chainp;
 
-	if (pte_chain->next)
-		pte_chain->next = NULL;
+	if (pte_chain->next_and_idx)
+		pte_chain->next_and_idx = 0;
 	pte_chainp = &per_cpu(local_pte_chain, cpu);
 	if (*pte_chainp)
 		kmem_cache_free(pte_chain_cache, *pte_chainp);
@@ -560,7 +526,7 @@
 	pte_chain_cache = kmem_cache_create(	"pte_chain",
 						sizeof(struct pte_chain),
 						0,
-						0,
+						SLAB_MUST_HWCACHE_ALIGN,
 						pte_chain_ctor,
 						NULL);
 
diff -Nru a/mm/shmem.c b/mm/shmem.c
--- a/mm/shmem.c	Sat Apr 19 19:51:47 2003
+++ b/mm/shmem.c	Sat Apr 19 19:51:47 2003
@@ -832,7 +832,6 @@
 			shmem_swp_unmap(entry);
 			delete_from_swap_cache(swappage);
 			spin_unlock(&info->lock);
-			flush_page_to_ram(swappage);
 			copy_highpage(filepage, swappage);
 			unlock_page(swappage);
 			page_cache_release(swappage);
@@ -953,7 +952,6 @@
 		return (error == -ENOMEM)? NOPAGE_OOM: NOPAGE_SIGBUS;
 
 	mark_page_accessed(page);
-	flush_page_to_ram(page);
 	return page;
 }
 
@@ -981,7 +979,6 @@
 			return err;
 		if (page) {
 			mark_page_accessed(page);
-			flush_page_to_ram(page);
 			err = install_page(mm, vma, addr, page, prot);
 			if (err) {
 				page_cache_release(page);
diff -Nru a/mm/slab.c b/mm/slab.c
--- a/mm/slab.c	Sat Apr 19 19:51:50 2003
+++ b/mm/slab.c	Sat Apr 19 19:51:50 2003
@@ -383,18 +383,20 @@
 } malloc_sizes[] = {
 #define CACHE(x) { .cs_size = (x) },
 #include <linux/kmalloc_sizes.h>
+	{ 0, }
 #undef CACHE
 };
 
 /* Must match cache_sizes above. Out of line to keep cache footprint low. */
-static struct { 
-	char *name; 
+static struct cache_names {
+	char *name;
 	char *name_dma;
-} cache_names[] = { 
+} cache_names[] = {
 #define CACHE(x) { .name = "size-" #x, .name_dma = "size-" #x "(DMA)" },
 #include <linux/kmalloc_sizes.h>
+	{ 0, }
 #undef CACHE
-}; 
+};
 
 struct arraycache_init initarray_cache __initdata = { { 0, BOOT_CPUCACHE_ENTRIES, 1, 0} };
 struct arraycache_init initarray_generic __initdata = { { 0, BOOT_CPUCACHE_ENTRIES, 1, 0} };
@@ -595,7 +597,9 @@
  */
 void __init kmem_cache_sizes_init(void)
 {
-	int i;
+	struct cache_sizes *sizes = malloc_sizes;
+	struct cache_names *names = cache_names;
+
 	/*
 	 * Fragmentation resistance on low memory - only use bigger
 	 * page orders on machines with more than 32MB of memory.
@@ -603,15 +607,14 @@
 	if (num_physpages > (32 << 20) >> PAGE_SHIFT)
 		slab_break_gfp_order = BREAK_GFP_ORDER_HI;
 
-	for (i = 0; i < ARRAY_SIZE(malloc_sizes); i++) {
-		struct cache_sizes *sizes = malloc_sizes + i;
+	while (sizes->cs_size) {
 		/* For performance, all the general caches are L1 aligned.
 		 * This should be particularly beneficial on SMP boxes, as it
 		 * eliminates "false sharing".
 		 * Note for systems short on memory removing the alignment will
 		 * allow tighter packing of the smaller caches. */
 		sizes->cs_cachep = kmem_cache_create(
-			cache_names[i].name, sizes->cs_size,
+			names->name, sizes->cs_size,
 			0, SLAB_HWCACHE_ALIGN, NULL, NULL);
 		if (!sizes->cs_cachep)
 			BUG();
@@ -623,10 +626,13 @@
 		}
 
 		sizes->cs_dmacachep = kmem_cache_create(
-			cache_names[i].name_dma, sizes->cs_size,
+			names->name_dma, sizes->cs_size,
 			0, SLAB_CACHE_DMA|SLAB_HWCACHE_ALIGN, NULL, NULL);
 		if (!sizes->cs_dmacachep)
 			BUG();
+
+		sizes++;
+		names++;
 	}
 	/*
 	 * The generic caches are running - time to kick out the
diff -Nru a/mm/swap_state.c b/mm/swap_state.c
--- a/mm/swap_state.c	Sat Apr 19 19:51:47 2003
+++ b/mm/swap_state.c	Sat Apr 19 19:51:47 2003
@@ -34,7 +34,7 @@
 
 struct address_space swapper_space = {
 	.page_tree	= RADIX_TREE_INIT(GFP_ATOMIC),
-	.page_lock	= RW_LOCK_UNLOCKED,
+	.page_lock	= SPIN_LOCK_UNLOCKED,
 	.clean_pages	= LIST_HEAD_INIT(swapper_space.clean_pages),
 	.dirty_pages	= LIST_HEAD_INIT(swapper_space.dirty_pages),
 	.io_pages	= LIST_HEAD_INIT(swapper_space.io_pages),
@@ -191,9 +191,9 @@
   
 	entry.val = page->index;
 
-	write_lock(&swapper_space.page_lock);
+	spin_lock(&swapper_space.page_lock);
 	__delete_from_swap_cache(page);
-	write_unlock(&swapper_space.page_lock);
+	spin_unlock(&swapper_space.page_lock);
 
 	swap_free(entry);
 	page_cache_release(page);
@@ -204,8 +204,8 @@
 	struct address_space *mapping = page->mapping;
 	int err;
 
-	write_lock(&swapper_space.page_lock);
-	write_lock(&mapping->page_lock);
+	spin_lock(&swapper_space.page_lock);
+	spin_lock(&mapping->page_lock);
 
 	err = radix_tree_insert(&swapper_space.page_tree, entry.val, page);
 	if (!err) {
@@ -213,8 +213,8 @@
 		___add_to_page_cache(page, &swapper_space, entry.val);
 	}
 
-	write_unlock(&mapping->page_lock);
-	write_unlock(&swapper_space.page_lock);
+	spin_unlock(&mapping->page_lock);
+	spin_unlock(&swapper_space.page_lock);
 
 	if (!err) {
 		if (!swap_duplicate(entry))
@@ -240,8 +240,8 @@
 
 	entry.val = page->index;
 
-	write_lock(&swapper_space.page_lock);
-	write_lock(&mapping->page_lock);
+	spin_lock(&swapper_space.page_lock);
+	spin_lock(&mapping->page_lock);
 
 	err = radix_tree_insert(&mapping->page_tree, index, page);
 	if (!err) {
@@ -249,8 +249,8 @@
 		___add_to_page_cache(page, mapping, index);
 	}
 
-	write_unlock(&mapping->page_lock);
-	write_unlock(&swapper_space.page_lock);
+	spin_unlock(&mapping->page_lock);
+	spin_unlock(&swapper_space.page_lock);
 
 	if (!err) {
 		swap_free(entry);
diff -Nru a/mm/swapfile.c b/mm/swapfile.c
--- a/mm/swapfile.c	Sat Apr 19 19:51:28 2003
+++ b/mm/swapfile.c	Sat Apr 19 19:51:28 2003
@@ -248,10 +248,10 @@
 		/* Is the only swap cache user the cache itself? */
 		if (p->swap_map[swp_offset(entry)] == 1) {
 			/* Recheck the page count with the pagecache lock held.. */
-			read_lock(&swapper_space.page_lock);
+			spin_lock(&swapper_space.page_lock);
 			if (page_count(page) - !!PagePrivate(page) == 2)
 				retval = 1;
-			read_unlock(&swapper_space.page_lock);
+			spin_unlock(&swapper_space.page_lock);
 		}
 		swap_info_put(p);
 	}
@@ -319,13 +319,13 @@
 	retval = 0;
 	if (p->swap_map[swp_offset(entry)] == 1) {
 		/* Recheck the page count with the pagecache lock held.. */
-		write_lock(&swapper_space.page_lock);
+		spin_lock(&swapper_space.page_lock);
 		if ((page_count(page) == 2) && !PageWriteback(page)) {
 			__delete_from_swap_cache(page);
 			SetPageDirty(page);
 			retval = 1;
 		}
-		write_unlock(&swapper_space.page_lock);
+		spin_unlock(&swapper_space.page_lock);
 	}
 	swap_info_put(p);
 
@@ -377,41 +377,33 @@
  * share this swap entry, so be cautious and let do_wp_page work out
  * what to do if a write is requested later.
  */
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
+/* vma->vm_mm->page_table_lock is held */
 static void
 unuse_pte(struct vm_area_struct *vma, unsigned long address, pte_t *dir,
 	swp_entry_t entry, struct page *page, struct pte_chain **pte_chainp)
 {
-	pte_t pte = *dir;
-
-	if (pte_file(pte))
-		return;
-	if (likely(pte_to_swp_entry(pte).val != entry.val))
-		return;
-	if (unlikely(pte_none(pte) || pte_present(pte)))
-		return;
+	vma->vm_mm->rss++;
 	get_page(page);
 	set_pte(dir, pte_mkold(mk_pte(page, vma->vm_page_prot)));
 	*pte_chainp = page_add_rmap(page, dir, *pte_chainp);
 	swap_free(entry);
-	++vma->vm_mm->rss;
 }
 
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
-static void unuse_pmd(struct vm_area_struct * vma, pmd_t *dir,
+/* vma->vm_mm->page_table_lock is held */
+static int unuse_pmd(struct vm_area_struct * vma, pmd_t *dir,
 	unsigned long address, unsigned long size, unsigned long offset,
-	swp_entry_t entry, struct page* page)
+	swp_entry_t entry, struct page *page, struct pte_chain **pte_chainp)
 {
 	pte_t * pte;
 	unsigned long end;
-	struct pte_chain *pte_chain = NULL;
+	pte_t swp_pte = swp_entry_to_pte(entry);
 
 	if (pmd_none(*dir))
-		return;
+		return 0;
 	if (pmd_bad(*dir)) {
 		pmd_ERROR(*dir);
 		pmd_clear(dir);
-		return;
+		return 0;
 	}
 	pte = pte_offset_map(dir, address);
 	offset += address & PMD_MASK;
@@ -421,33 +413,36 @@
 		end = PMD_SIZE;
 	do {
 		/*
-		 * FIXME: handle pte_chain_alloc() failures
+		 * swapoff spends a _lot_ of time in this loop!
+		 * Test inline before going to call unuse_pte.
 		 */
-		if (pte_chain == NULL)
-			pte_chain = pte_chain_alloc(GFP_ATOMIC);
-		unuse_pte(vma, offset+address-vma->vm_start,
-				pte, entry, page, &pte_chain);
+		if (unlikely(pte_same(*pte, swp_pte))) {
+			unuse_pte(vma, offset + address, pte,
+					entry, page, pte_chainp);
+			pte_unmap(pte);
+			return 1;
+		}
 		address += PAGE_SIZE;
 		pte++;
 	} while (address && (address < end));
 	pte_unmap(pte - 1);
-	pte_chain_free(pte_chain);
+	return 0;
 }
 
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
-static void unuse_pgd(struct vm_area_struct * vma, pgd_t *dir,
+/* vma->vm_mm->page_table_lock is held */
+static int unuse_pgd(struct vm_area_struct * vma, pgd_t *dir,
 	unsigned long address, unsigned long size,
-	swp_entry_t entry, struct page* page)
+	swp_entry_t entry, struct page *page, struct pte_chain **pte_chainp)
 {
 	pmd_t * pmd;
 	unsigned long offset, end;
 
 	if (pgd_none(*dir))
-		return;
+		return 0;
 	if (pgd_bad(*dir)) {
 		pgd_ERROR(*dir);
 		pgd_clear(dir);
-		return;
+		return 0;
 	}
 	pmd = pmd_offset(dir, address);
 	offset = address & PGDIR_MASK;
@@ -458,32 +453,42 @@
 	if (address >= end)
 		BUG();
 	do {
-		unuse_pmd(vma, pmd, address, end - address, offset, entry,
-			  page);
+		if (unuse_pmd(vma, pmd, address, end - address,
+				offset, entry, page, pte_chainp))
+			return 1;
 		address = (address + PMD_SIZE) & PMD_MASK;
 		pmd++;
 	} while (address && (address < end));
+	return 0;
 }
 
-/* mmlist_lock and vma->vm_mm->page_table_lock are held */
-static void unuse_vma(struct vm_area_struct * vma, pgd_t *pgdir,
-			swp_entry_t entry, struct page* page)
+/* vma->vm_mm->page_table_lock is held */
+static int unuse_vma(struct vm_area_struct * vma, pgd_t *pgdir,
+	swp_entry_t entry, struct page *page, struct pte_chain **pte_chainp)
 {
 	unsigned long start = vma->vm_start, end = vma->vm_end;
 
 	if (start >= end)
 		BUG();
 	do {
-		unuse_pgd(vma, pgdir, start, end - start, entry, page);
+		if (unuse_pgd(vma, pgdir, start, end - start,
+				entry, page, pte_chainp))
+			return 1;
 		start = (start + PGDIR_SIZE) & PGDIR_MASK;
 		pgdir++;
 	} while (start && (start < end));
+	return 0;
 }
 
-static void unuse_process(struct mm_struct * mm,
+static int unuse_process(struct mm_struct * mm,
 			swp_entry_t entry, struct page* page)
 {
 	struct vm_area_struct* vma;
+	struct pte_chain *pte_chain;
+
+	pte_chain = pte_chain_alloc(GFP_KERNEL);
+	if (!pte_chain)
+		return -ENOMEM;
 
 	/*
 	 * Go through process' page directory.
@@ -491,10 +496,12 @@
 	spin_lock(&mm->page_table_lock);
 	for (vma = mm->mmap; vma; vma = vma->vm_next) {
 		pgd_t * pgd = pgd_offset(mm, vma->vm_start);
-		unuse_vma(vma, pgd, entry, page);
+		if (unuse_vma(vma, pgd, entry, page, &pte_chain))
+			break;
 	}
 	spin_unlock(&mm->page_table_lock);
-	return;
+	pte_chain_free(pte_chain);
+	return 0;
 }
 
 /*
@@ -634,40 +641,57 @@
 		shmem = 0;
 		swcount = *swap_map;
 		if (swcount > 1) {
-			flush_page_to_ram(page);
 			if (start_mm == &init_mm)
 				shmem = shmem_unuse(entry, page);
 			else
-				unuse_process(start_mm, entry, page);
+				retval = unuse_process(start_mm, entry, page);
 		}
 		if (*swap_map > 1) {
 			int set_start_mm = (*swap_map >= swcount);
 			struct list_head *p = &start_mm->mmlist;
 			struct mm_struct *new_start_mm = start_mm;
+			struct mm_struct *prev_mm = start_mm;
 			struct mm_struct *mm;
 
+			atomic_inc(&new_start_mm->mm_users);
+			atomic_inc(&prev_mm->mm_users);
 			spin_lock(&mmlist_lock);
-			while (*swap_map > 1 &&
+			while (*swap_map > 1 && !retval &&
 					(p = p->next) != &start_mm->mmlist) {
 				mm = list_entry(p, struct mm_struct, mmlist);
+				atomic_inc(&mm->mm_users);
+				spin_unlock(&mmlist_lock);
+				mmput(prev_mm);
+				prev_mm = mm;
+
+				cond_resched();
+
 				swcount = *swap_map;
-				if (mm == &init_mm) {
+				if (swcount <= 1)
+					;
+				else if (mm == &init_mm) {
 					set_start_mm = 1;
-					spin_unlock(&mmlist_lock);
 					shmem = shmem_unuse(entry, page);
-					spin_lock(&mmlist_lock);
 				} else
-					unuse_process(mm, entry, page);
+					retval = unuse_process(mm, entry, page);
 				if (set_start_mm && *swap_map < swcount) {
+					mmput(new_start_mm);
+					atomic_inc(&mm->mm_users);
 					new_start_mm = mm;
 					set_start_mm = 0;
 				}
+				spin_lock(&mmlist_lock);
 			}
-			atomic_inc(&new_start_mm->mm_users);
 			spin_unlock(&mmlist_lock);
+			mmput(prev_mm);
 			mmput(start_mm);
 			start_mm = new_start_mm;
 		}
+		if (retval) {
+			unlock_page(page);
+			page_cache_release(page);
+			break;
+		}
 
 		/*
 		 * How could swap count reach 0x7fff when the maximum
@@ -691,7 +715,7 @@
 
 		/*
 		 * If a reference remains (rare), we would like to leave
-		 * the page in the swap cache; but try_to_swap_out could
+		 * the page in the swap cache; but try_to_unmap could
 		 * then re-duplicate the entry once we drop page lock,
 		 * so we might loop indefinitely; also, that page could
 		 * not be swapped out to other storage meanwhile.  So:
@@ -727,7 +751,7 @@
 		/*
 		 * So we could skip searching mms once swap count went
 		 * to 1, we did not mark any present ptes as dirty: must
-		 * mark page dirty so try_to_swap_out will preserve it.
+		 * mark page dirty so shrink_list will preserve it.
 		 */
 		SetPageDirty(page);
 		unlock_page(page);
@@ -970,7 +994,7 @@
 }
 #endif
 
-asmlinkage long sys_swapoff(const char * specialfile)
+asmlinkage long sys_swapoff(const char __user * specialfile)
 {
 	struct swap_info_struct * p = NULL;
 	unsigned short *swap_map;
@@ -1174,7 +1198,7 @@
  *
  * The swapon system call
  */
-asmlinkage long sys_swapon(const char * specialfile, int swap_flags)
+asmlinkage long sys_swapon(const char __user * specialfile, int swap_flags)
 {
 	struct swap_info_struct * p;
 	char *name = NULL;
diff -Nru a/mm/truncate.c b/mm/truncate.c
--- a/mm/truncate.c	Sat Apr 19 19:51:50 2003
+++ b/mm/truncate.c	Sat Apr 19 19:51:50 2003
@@ -73,13 +73,13 @@
 	if (PagePrivate(page) && !try_to_release_page(page, 0))
 		return 0;
 
-	write_lock(&mapping->page_lock);
+	spin_lock(&mapping->page_lock);
 	if (PageDirty(page)) {
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 		return 0;
 	}
 	__remove_from_page_cache(page);
-	write_unlock(&mapping->page_lock);
+	spin_unlock(&mapping->page_lock);
 	ClearPageUptodate(page);
 	page_cache_release(page);	/* pagecache ref */
 	return 1;
diff -Nru a/mm/vmscan.c b/mm/vmscan.c
--- a/mm/vmscan.c	Sat Apr 19 19:51:28 2003
+++ b/mm/vmscan.c	Sat Apr 19 19:51:28 2003
@@ -325,7 +325,7 @@
 				goto keep_locked;
 			if (!may_write_to_queue(mapping->backing_dev_info))
 				goto keep_locked;
-			write_lock(&mapping->page_lock);
+			spin_lock(&mapping->page_lock);
 			if (test_clear_page_dirty(page)) {
 				int res;
 				struct writeback_control wbc = {
@@ -336,7 +336,7 @@
 				};
 
 				list_move(&page->list, &mapping->locked_pages);
-				write_unlock(&mapping->page_lock);
+				spin_unlock(&mapping->page_lock);
 
 				SetPageReclaim(page);
 				res = mapping->a_ops->writepage(page, &wbc);
@@ -351,7 +351,7 @@
 				}
 				goto keep;
 			}
-			write_unlock(&mapping->page_lock);
+			spin_unlock(&mapping->page_lock);
 		}
 
 		/*
@@ -385,7 +385,7 @@
 		if (!mapping)
 			goto keep_locked;	/* truncate got there first */
 
-		write_lock(&mapping->page_lock);
+		spin_lock(&mapping->page_lock);
 
 		/*
 		 * The non-racy check for busy page.  It is critical to check
@@ -393,7 +393,7 @@
 		 * not in use by anybody. 	(pagecache + us == 2)
 		 */
 		if (page_count(page) != 2 || PageDirty(page)) {
-			write_unlock(&mapping->page_lock);
+			spin_unlock(&mapping->page_lock);
 			goto keep_locked;
 		}
 
@@ -401,7 +401,7 @@
 		if (PageSwapCache(page)) {
 			swp_entry_t swap = { .val = page->index };
 			__delete_from_swap_cache(page);
-			write_unlock(&mapping->page_lock);
+			spin_unlock(&mapping->page_lock);
 			swap_free(swap);
 			__put_page(page);	/* The pagecache ref */
 			goto free_it;
@@ -409,7 +409,7 @@
 #endif /* CONFIG_SWAP */
 
 		__remove_from_page_cache(page);
-		write_unlock(&mapping->page_lock);
+		spin_unlock(&mapping->page_lock);
 		__put_page(page);
 
 free_it:
diff -Nru a/net/8021q/vlan.c b/net/8021q/vlan.c
--- a/net/8021q/vlan.c	Sat Apr 19 19:51:50 2003
+++ b/net/8021q/vlan.c	Sat Apr 19 19:51:50 2003
@@ -29,7 +29,6 @@
 #include <net/p8022.h>
 #include <net/arp.h>
 #include <linux/rtnetlink.h>
-#include <linux/brlock.h>
 #include <linux/notifier.h>
 
 #include <linux/if_vlan.h>
@@ -50,6 +49,8 @@
 static char vlan_buggyright[] = "David S. Miller <davem@redhat.com>";
 
 static int vlan_device_event(struct notifier_block *, unsigned long, void *);
+static int vlan_ioctl_handler(unsigned long);
+static int unregister_vlan_dev(struct net_device *, unsigned short );
 
 struct notifier_block vlan_notifier_block = {
 	.notifier_call = vlan_device_event,
@@ -68,7 +69,6 @@
 	.dev =NULL,
 	.func = vlan_skb_recv, /* VLAN receive method */
 	.data = (void *)(-1),  /* Set here '(void *)1' when this code can SHARE SKBs */
-	.next = NULL
 };
 
 /* End of global variables definitions. */
@@ -102,11 +102,32 @@
 	/* Register us to receive netdevice events */
 	register_netdevice_notifier(&vlan_notifier_block);
 
-	vlan_ioctl_hook = vlan_ioctl_handler;
+	vlan_ioctl_set(vlan_ioctl_handler);
 
 	return 0;
 }
 
+/* Cleanup all vlan devices 
+ * Note: devices that have been registered that but not
+ * brought up will exist but have no module ref count.
+ */
+static void __exit vlan_cleanup_devices(void)
+{
+	struct net_device *dev, *nxt;
+
+	rtnl_lock();
+	for (dev = dev_base; dev; dev = nxt) {
+		nxt = dev->next;
+		if (dev->priv_flags & IFF_802_1Q_VLAN) {
+			unregister_vlan_dev(VLAN_DEV_INFO(dev)->real_dev,
+					    VLAN_DEV_INFO(dev)->vlan_id);
+
+			unregister_netdevice(dev);
+		}
+	}
+	rtnl_unlock();
+}
+
 /*
  *     Module 'remove' entry point.
  *     o delete /proc/net/router directory and static entries.
@@ -115,6 +136,14 @@
 {
 	int i;
 
+	vlan_ioctl_set(NULL);
+
+	/* Un-register us from receiving netdevice events */
+	unregister_netdevice_notifier(&vlan_notifier_block);
+
+	dev_remove_pack(&vlan_packet_type);
+	vlan_cleanup_devices();
+
 	/* This table must be empty if there are no module
 	 * references left.
 	 */
@@ -122,13 +151,9 @@
 		if (vlan_group_hash[i] != NULL)
 			BUG();
 	}
-
-	/* Un-register us from receiving netdevice events */
-	unregister_netdevice_notifier(&vlan_notifier_block);
-
-	dev_remove_pack(&vlan_packet_type);
 	vlan_proc_cleanup();
-	vlan_ioctl_hook = NULL;
+
+	synchronize_net();
 }
 
 module_init(vlan_proto_init);
@@ -231,9 +256,8 @@
 				real_dev->vlan_rx_kill_vid(real_dev, vlan_id);
 			}
 
-			br_write_lock(BR_NETPROTO_LOCK);
 			grp->vlan_devices[vlan_id] = NULL;
-			br_write_unlock(BR_NETPROTO_LOCK);
+			synchronize_net();
 
 
 			/* Caller unregisters (and if necessary, puts)
@@ -265,8 +289,6 @@
 
 				ret = 1;
 			}
-
-			MOD_DEC_USE_COUNT;
 		}
 	}
 
@@ -433,6 +455,7 @@
 	/* set up method calls */
 	new_dev->init = vlan_dev_init;
 	new_dev->destructor = vlan_dev_destruct;
+	new_dev->owner = THIS_MODULE;
 	    
 	/* new_dev->ifindex = 0;  it will be set when added to
 	 * the global list.
@@ -503,6 +526,9 @@
 	       real_dev->ifindex);
 #endif
 	    
+	if (register_netdevice(new_dev))
+		goto out_free_newdev_priv;
+
 	/* So, got the sucker initialized, now lets place
 	 * it into our local structure.
 	 */
@@ -516,7 +542,7 @@
 	if (!grp) { /* need to add a new group */
 		grp = kmalloc(sizeof(struct vlan_group), GFP_KERNEL);
 		if (!grp)
-			goto out_free_newdev_priv;
+			goto out_free_unregister;
 					
 		/* printk(KERN_ALERT "VLAN REGISTER:  Allocated new group.\n"); */
 		memset(grp, 0, sizeof(struct vlan_group));
@@ -537,19 +563,17 @@
 	if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
 		real_dev->vlan_rx_add_vid(real_dev, VLAN_ID);
 
-	register_netdevice(new_dev);
-
 	rtnl_unlock();
-	    
-	/* NOTE:  We have a reference to the real device,
-	 * so hold on to the reference.
-	 */
-	MOD_INC_USE_COUNT; /* Add was a success!! */
+
+
 #ifdef VLAN_DEBUG
 	printk(VLAN_DBG "Allocated new device successfully, returning.\n");
 #endif
 	return new_dev;
 
+out_free_unregister:
+	unregister_netdev(new_dev);
+
 out_free_newdev_priv:
 	kfree(new_dev->priv);
 
@@ -651,7 +675,7 @@
  *	o execute requested action or pass command to the device driver
  *   arg is really a void* to a vlan_ioctl_args structure.
  */
-int vlan_ioctl_handler(unsigned long arg)
+static int vlan_ioctl_handler(unsigned long arg)
 {
 	int err = 0;
 	struct vlan_ioctl_args args;
diff -Nru a/net/8021q/vlan.h b/net/8021q/vlan.h
--- a/net/8021q/vlan.h	Sat Apr 19 19:51:49 2003
+++ b/net/8021q/vlan.h	Sat Apr 19 19:51:49 2003
@@ -30,8 +30,6 @@
 
 extern unsigned short vlan_name_type;
 
-int vlan_ioctl_handler(unsigned long arg);
-
 #define VLAN_GRP_HASH_SHIFT	5
 #define VLAN_GRP_HASH_SIZE	(1 << VLAN_GRP_HASH_SHIFT)
 #define VLAN_GRP_HASH_MASK	(VLAN_GRP_HASH_SIZE - 1)
diff -Nru a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
--- a/net/8021q/vlan_dev.c	Sat Apr 19 19:51:50 2003
+++ b/net/8021q/vlan_dev.c	Sat Apr 19 19:51:50 2003
@@ -31,7 +31,6 @@
 #include <net/datalink.h>
 #include <net/p8022.h>
 #include <net/arp.h>
-#include <linux/brlock.h>
 
 #include "vlan.h"
 #include "vlanproc.h"
diff -Nru a/net/bridge/br.c b/net/bridge/br.c
--- a/net/bridge/br.c	Sat Apr 19 19:51:28 2003
+++ b/net/bridge/br.c	Sat Apr 19 19:51:28 2003
@@ -21,7 +21,6 @@
 #include <linux/etherdevice.h>
 #include <linux/init.h>
 #include <linux/if_bridge.h>
-#include <linux/brlock.h>
 #include <asm/uaccess.h>
 #include "br_private.h"
 
@@ -31,16 +30,6 @@
 
 int (*br_should_route_hook) (struct sk_buff **pskb) = NULL;
 
-void br_dec_use_count()
-{
-	module_put(THIS_MODULE);
-}
-
-void br_inc_use_count()
-{
-	try_module_get(THIS_MODULE);
-}
-
 static int __init br_init(void)
 {
 	printk(KERN_INFO "NET4: Ethernet Bridge 008 for NET4.0\n");
@@ -49,8 +38,9 @@
 	if (br_netfilter_init())
 		return 1;
 #endif
+	brioctl_set(br_ioctl_deviceless_stub);
 	br_handle_frame_hook = br_handle_frame;
-	br_ioctl_hook = br_ioctl_deviceless_stub;
+
 #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
 	br_fdb_get_hook = br_fdb_get;
 	br_fdb_put_hook = br_fdb_put;
@@ -60,27 +50,23 @@
 	return 0;
 }
 
-static void __br_clear_ioctl_hook(void)
-{
-	br_ioctl_hook = NULL;
-}
-
 static void __exit br_deinit(void)
 {
 #ifdef CONFIG_NETFILTER
 	br_netfilter_fini();
 #endif
 	unregister_netdevice_notifier(&br_device_notifier);
-	br_call_ioctl_atomic(__br_clear_ioctl_hook);
-
-	br_write_lock_bh(BR_NETPROTO_LOCK);
+	brioctl_set(NULL);
 	br_handle_frame_hook = NULL;
-	br_write_unlock_bh(BR_NETPROTO_LOCK);
 
 #if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
 	br_fdb_get_hook = NULL;
 	br_fdb_put_hook = NULL;
 #endif
+
+	br_cleanup_bridges();
+
+	synchronize_net();
 }
 
 EXPORT_SYMBOL(br_should_route_hook);
diff -Nru a/net/bridge/br_device.c b/net/bridge/br_device.c
--- a/net/bridge/br_device.c	Sat Apr 19 19:51:27 2003
+++ b/net/bridge/br_device.c	Sat Apr 19 19:51:27 2003
@@ -16,6 +16,7 @@
 #include <linux/kernel.h>
 #include <linux/netdevice.h>
 #include <linux/if_bridge.h>
+#include <linux/module.h>
 #include <asm/uaccess.h>
 #include "br_private.h"
 
@@ -91,9 +92,9 @@
 	netif_start_queue(dev);
 
 	br = dev->priv;
-	read_lock(&br->lock);
+	write_lock(&br->lock);
 	br_stp_enable_bridge(br);
-	read_unlock(&br->lock);
+	write_unlock(&br->lock);
 
 	return 0;
 }
@@ -107,9 +108,9 @@
 	struct net_bridge *br;
 
 	br = dev->priv;
-	read_lock(&br->lock);
+	write_lock(&br->lock);
 	br_stp_disable_bridge(br);
-	read_unlock(&br->lock);
+	write_unlock(&br->lock);
 
 	netif_stop_queue(dev);
 
@@ -121,6 +122,11 @@
 	return -1;
 }
 
+static void br_dev_destruct(struct net_device *dev) 
+{
+	kfree(dev->priv);
+}
+
 void br_dev_setup(struct net_device *dev)
 {
 	memset(dev->dev_addr, 0, ETH_ALEN);
@@ -130,6 +136,8 @@
 	dev->hard_start_xmit = br_dev_xmit;
 	dev->open = br_dev_open;
 	dev->set_multicast_list = br_dev_set_multicast_list;
+	dev->destructor = br_dev_destruct;
+	dev->owner = THIS_MODULE;
 	dev->stop = br_dev_stop;
 	dev->accept_fastpath = br_dev_accept_fastpath;
 	dev->tx_queue_len = 0;
diff -Nru a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
--- a/net/bridge/br_fdb.c	Sat Apr 19 19:51:28 2003
+++ b/net/bridge/br_fdb.c	Sat Apr 19 19:51:28 2003
@@ -94,6 +94,7 @@
 {
 	struct net_bridge *br;
 	int i;
+	int newhash = br_mac_hash(newaddr);
 
 	br = p->br;
 	write_lock_bh(&br->hash_lock);
@@ -103,9 +104,11 @@
 		f = br->hash[i];
 		while (f != NULL) {
 			if (f->dst == p && f->is_local) {
-				__hash_unlink(f);
 				memcpy(f->addr.addr, newaddr, ETH_ALEN);
-				__hash_link(br, f, br_mac_hash(newaddr));
+				if (newhash != i) {
+					__hash_unlink(f);
+					__hash_link(br, f, newhash);
+				}
 				write_unlock_bh(&br->hash_lock);
 				return;
 			}
@@ -212,21 +215,15 @@
 	for (i=0;i<BR_HASH_SIZE;i++) {
 		struct net_bridge_fdb_entry *f;
 
-		f = br->hash[i];
-		while (f != NULL && num < maxnum) {
+		for (f = br->hash[i]; f != NULL && num < maxnum;
+		     f = f->next_hash) {
 			struct __fdb_entry ent;
-			int err;
-			struct net_bridge_fdb_entry *g;
-			struct net_bridge_fdb_entry **pp; 
 
-			if (has_expired(br, f)) {
-				f = f->next_hash;
+			if (has_expired(br, f)) 
 				continue;
-			}
 
 			if (offset) {
 				offset--;
-				f = f->next_hash;
 				continue;
 			}
 
@@ -234,37 +231,33 @@
 
 			atomic_inc(&f->use_count);
 			read_unlock_bh(&br->hash_lock);
-			err = copy_to_user(walk, &ent, sizeof(struct __fdb_entry));
-			read_lock_bh(&br->hash_lock);
-
-			g = f->next_hash;
-			pp = f->pprev_hash;
-			br_fdb_put(f);
+			
+			if (copy_to_user(walk, &ent, sizeof(struct __fdb_entry)))
+				return -EFAULT;
 
-			if (err)
-				goto out_fault;
+			read_lock_bh(&br->hash_lock);
+			
+			/* entry was deleted during copy_to_user */
+			if (atomic_dec_and_test(&f->use_count)) {
+				kfree(f);
+				num = -EAGAIN;
+				goto out;
+			}
 
-			if (g == NULL && pp == NULL)
-				goto out_disappeared;
+			/* entry changed address hash while copying */
+			if (br_mac_hash(f->addr.addr) != i) {
+				num = -EAGAIN;
+				goto out;
+			}
 
 			num++;
 			walk++;
-
-			f = g;
 		}
 	}
 
  out:
 	read_unlock_bh(&br->hash_lock);
 	return num;
-
- out_disappeared:
-	num = -EAGAIN;
-	goto out;
-
- out_fault:
-	num = -EFAULT;
-	goto out;
 }
 
 static __inline__ void __fdb_possibly_replace(struct net_bridge_fdb_entry *fdb,
diff -Nru a/net/bridge/br_forward.c b/net/bridge/br_forward.c
--- a/net/bridge/br_forward.c	Sat Apr 19 19:51:30 2003
+++ b/net/bridge/br_forward.c	Sat Apr 19 19:51:30 2003
@@ -33,6 +33,7 @@
 int br_dev_queue_push_xmit(struct sk_buff *skb)
 {
 #ifdef CONFIG_NETFILTER
+	/* FIXME: skb bas not been linearized: is this valid?? --RR */
 	if (skb->nf_bridge)
 		memcpy(skb->data - 16, skb->nf_bridge->hh, 16);
 #endif
diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c
--- a/net/bridge/br_if.c	Sat Apr 19 19:51:51 2003
+++ b/net/bridge/br_if.c	Sat Apr 19 19:51:51 2003
@@ -17,13 +17,13 @@
 #include <linux/if_arp.h>
 #include <linux/if_bridge.h>
 #include <linux/inetdevice.h>
+#include <linux/module.h>
 #include <linux/rtnetlink.h>
 #include <linux/brlock.h>
+#include <net/sock.h>
 #include <asm/uaccess.h>
 #include "br_private.h"
 
-static struct net_bridge *bridge_list;
-
 static int br_initial_port_cost(struct net_device *dev)
 {
 	if (!strncmp(dev->name, "lec", 3))
@@ -69,22 +69,6 @@
 	return 0;
 }
 
-static struct net_bridge **__find_br(char *name)
-{
-	struct net_bridge **b;
-	struct net_bridge *br;
-
-	b = &bridge_list;
-	while ((br = *b) != NULL) {
-		if (!strncmp(br->dev.name, name, IFNAMSIZ))
-			return b;
-
-		b = &(br->next);
-	}
-
-	return NULL;
-}
-
 static void del_ifs(struct net_bridge *br)
 {
 	br_write_lock_bh(BR_NETPROTO_LOCK);
@@ -95,7 +79,7 @@
 	br_write_unlock_bh(BR_NETPROTO_LOCK);
 }
 
-static struct net_bridge *new_nb(char *name)
+static struct net_bridge *new_nb(const char *name)
 {
 	struct net_bridge *br;
 	struct net_device *dev;
@@ -110,6 +94,7 @@
 
 	strncpy(dev->name, name, IFNAMSIZ);
 	dev->priv = br;
+	dev->priv_flags = IFF_EBRIDGE;
 	ether_setup(dev);
 	br_dev_setup(dev);
 
@@ -176,49 +161,47 @@
 	return p;
 }
 
-int br_add_bridge(char *name)
+int br_add_bridge(const char *name)
 {
 	struct net_bridge *br;
+	int ret;
 
-	if ((br = new_nb(name)) == NULL)
+	if ((br = new_nb(name)) == NULL) 
 		return -ENOMEM;
 
-	if (__dev_get_by_name(name) != NULL) {
+	ret = register_netdev(&br->dev);
+	if (ret)
 		kfree(br);
-		return -EEXIST;
-	}
-
-	br->next = bridge_list;
-	bridge_list = br;
-
-	br_inc_use_count();
-	register_netdev(&br->dev);
-
-	return 0;
+	return ret;
 }
 
-int br_del_bridge(char *name)
+int br_del_bridge(const char *name)
 {
-	struct net_bridge **b;
-	struct net_bridge *br;
-
-	if ((b = __find_br(name)) == NULL)
-		return -ENXIO;
-
-	br = *b;
-
-	if (br->dev.flags & IFF_UP)
-		return -EBUSY;
-
-	del_ifs(br);
+	struct net_device *dev;
+	int ret = 0;
 
-	*b = br->next;
+	dev = dev_get_by_name(name);
+	if (dev == NULL) 
+		return -ENXIO; 	/* Could not find device */
+
+	if (!(dev->priv_flags & IFF_EBRIDGE)) {
+		/* Attempt to delete non bridge device! */
+		ret = -EPERM;
+	}
 
-	unregister_netdev(&br->dev);
-	kfree(br);
-	br_dec_use_count();
+	else if (dev->flags & IFF_UP) {
+		/* Not shutdown yet. */
+		ret = -EBUSY;
+	} 
+
+	else {
+		del_ifs((struct net_bridge *) dev->priv);
+	
+		unregister_netdev(dev);
+	}
 
-	return 0;
+	dev_put(dev);
+	return ret;
 }
 
 int br_add_if(struct net_bridge *br, struct net_device *dev)
@@ -269,29 +252,49 @@
 
 int br_get_bridge_ifindices(int *indices, int num)
 {
-	struct net_bridge *br;
-	int i;
-
-	br = bridge_list;
-	for (i=0;i<num;i++) {
-		if (br == NULL)
-			break;
+	struct net_device *dev;
+	int i = 0;
 
-		indices[i] = br->dev.ifindex;
-		br = br->next;
+	rtnl_shlock();
+	for (dev = dev_base; dev && i < num; dev = dev->next) {
+		if (dev->priv_flags & IFF_EBRIDGE) 
+			indices[i++] = dev->ifindex;
 	}
+	rtnl_shunlock();
 
 	return i;
 }
 
-/* called under ioctl_lock */
 void br_get_port_ifindices(struct net_bridge *br, int *ifindices)
 {
 	struct net_bridge_port *p;
 
+	read_lock(&br->lock);
 	p = br->port_list;
 	while (p != NULL) {
 		ifindices[p->port_no] = p->dev->ifindex;
 		p = p->next;
 	}
+	read_unlock(&br->lock);
+}
+
+
+void __exit br_cleanup_bridges(void)
+{
+	struct net_device *dev, *nxt;
+
+	rtnl_lock();
+	for (dev = dev_base; dev; dev = nxt) {
+		nxt = dev->next;
+		if ((dev->priv_flags & IFF_EBRIDGE)
+		    && dev->owner == THIS_MODULE) {
+			pr_debug("cleanup %s\n", dev->name);
+
+			del_ifs((struct net_bridge *) dev->priv);
+			
+			unregister_netdevice(dev);
+		}
+	}
+	rtnl_unlock();
+
 }
diff -Nru a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c
--- a/net/bridge/br_ioctl.c	Sat Apr 19 19:51:28 2003
+++ b/net/bridge/br_ioctl.c	Sat Apr 19 19:51:28 2003
@@ -53,6 +53,7 @@
 	{
 		struct __bridge_info b;
 
+	        read_lock(&br->lock);
 		memset(&b, 0, sizeof(struct __bridge_info));
 		memcpy(&b.designated_root, &br->designated_root, 8);
 		memcpy(&b.bridge_id, &br->bridge_id, 8);
@@ -73,6 +74,7 @@
 		b.tcn_timer_value = br_timer_get_residue(&br->tcn_timer);
 		b.topology_change_timer_value = br_timer_get_residue(&br->topology_change_timer);
 		b.gc_timer_value = br_timer_get_residue(&br->gc_timer);
+	        read_unlock(&br->lock);
 
 		if (copy_to_user((void *)arg0, &b, sizeof(b)))
 			return -EFAULT;
@@ -82,35 +84,44 @@
 
 	case BRCTL_GET_PORT_LIST:
 	{
-		int i;
-		int indices[256];
+		int *indices;
+		int ret = 0;
 
-		for (i=0;i<256;i++)
-			indices[i] = 0;
+		indices = kmalloc(256*sizeof(int), GFP_KERNEL);
+		if (indices == NULL)
+			return -ENOMEM;
+
+		memset(indices, 0, 256*sizeof(int));
 
 		br_get_port_ifindices(br, indices);
 		if (copy_to_user((void *)arg0, indices, 256*sizeof(int)))
-			return -EFAULT;
-
-		return 0;
+			ret =  -EFAULT;
+		kfree(indices);
+		return ret;
 	}
 
 	case BRCTL_SET_BRIDGE_FORWARD_DELAY:
+		write_lock(&br->lock);
 		br->bridge_forward_delay = arg0;
 		if (br_is_root_bridge(br))
 			br->forward_delay = arg0;
+		write_unlock(&br->lock);
 		return 0;
 
 	case BRCTL_SET_BRIDGE_HELLO_TIME:
+		write_lock(&br->lock);
 		br->bridge_hello_time = arg0;
 		if (br_is_root_bridge(br))
 			br->hello_time = arg0;
+		write_unlock(&br->lock);
 		return 0;
 
 	case BRCTL_SET_BRIDGE_MAX_AGE:
+		write_lock(&br->lock);
 		br->bridge_max_age = arg0;
 		if (br_is_root_bridge(br))
 			br->max_age = arg0;
+		write_unlock(&br->lock);
 		return 0;
 
 	case BRCTL_SET_AGEING_TIME:
@@ -126,6 +137,7 @@
 		struct __port_info p;
 		struct net_bridge_port *pt;
 
+		read_lock(&br->lock);
 		if ((pt = br_get_port(br, arg1)) == NULL)
 			return -EINVAL;
 
@@ -143,6 +155,8 @@
 		p.forward_delay_timer_value = br_timer_get_residue(&pt->forward_delay_timer);
 		p.hold_timer_value = br_timer_get_residue(&pt->hold_timer);
 
+		read_unlock(&br->lock);
+
 		if (copy_to_user((void *)arg0, &p, sizeof(p)))
 			return -EFAULT;
 
@@ -154,16 +168,20 @@
 		return 0;
 
 	case BRCTL_SET_BRIDGE_PRIORITY:
+		write_lock(&br->lock);
 		br_stp_set_bridge_priority(br, arg0);
+		write_unlock(&br->lock);
 		return 0;
 
 	case BRCTL_SET_PORT_PRIORITY:
 	{
 		struct net_bridge_port *p;
 
+		write_lock(&br->lock);
 		if ((p = br_get_port(br, arg0)) == NULL)
 			return -EINVAL;
 		br_stp_set_port_priority(p, arg1);
+		write_unlock(&br->lock);
 		return 0;
 	}
 
@@ -171,9 +189,11 @@
 	{
 		struct net_bridge_port *p;
 
+		write_lock(&br->lock);
 		if ((p = br_get_port(br, arg0)) == NULL)
 			return -EINVAL;
 		br_stp_set_path_cost(p, arg1);
+		write_unlock(&br->lock);
 		return 0;
 	}
 
@@ -195,19 +215,24 @@
 
 	case BRCTL_GET_BRIDGES:
 	{
-		int i;
-		int indices[64];
-
-		for (i=0;i<64;i++)
-			indices[i] = 0;
+		int *indices;
+		int ret = 0;
 
 		if (arg1 > 64)
 			arg1 = 64;
+
+		indices = kmalloc(arg1*sizeof(int), GFP_KERNEL);
+		if (indices == NULL)
+			return -ENOMEM;
+
+		memset(indices, 0, arg1*sizeof(int));
 		arg1 = br_get_bridge_ifindices(indices, arg1);
-		if (copy_to_user((void *)arg0, indices, arg1*sizeof(int)))
-			return -EFAULT;
 
-		return arg1;
+		ret = copy_to_user((void *)arg0, indices, arg1*sizeof(int))
+			? -EFAULT : arg1;
+
+		kfree(indices);
+		return ret;
 	}
 
 	case BRCTL_ADD_BRIDGE:
@@ -230,11 +255,9 @@
 	return -EOPNOTSUPP;
 }
 
-static DECLARE_MUTEX(ioctl_mutex);
 
 int br_ioctl_deviceless_stub(unsigned long arg)
 {
-	int err;
 	unsigned long i[3];
 
 	if (!capable(CAP_NET_ADMIN))
@@ -243,11 +266,7 @@
 	if (copy_from_user(i, (void *)arg, 3*sizeof(unsigned long)))
 		return -EFAULT;
 
-	down(&ioctl_mutex);
-	err = br_ioctl_deviceless(i[0], i[1], i[2]);
-	up(&ioctl_mutex);
-
-	return err;
+	return br_ioctl_deviceless(i[0], i[1], i[2]);
 }
 
 int br_ioctl(struct net_bridge *br, unsigned int cmd, unsigned long arg0, unsigned long arg1, unsigned long arg2)
@@ -257,18 +276,9 @@
 	if (!capable(CAP_NET_ADMIN))
 		return -EPERM;
 
-	down(&ioctl_mutex);
 	err = br_ioctl_deviceless(cmd, arg0, arg1);
 	if (err == -EOPNOTSUPP)
 		err = br_ioctl_device(br, cmd, arg0, arg1, arg2);
-	up(&ioctl_mutex);
 
 	return err;
-}
-
-void br_call_ioctl_atomic(void (*fn)(void))
-{
-	down(&ioctl_mutex);
-	fn();
-	up(&ioctl_mutex);
 }
diff -Nru a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
--- a/net/bridge/br_netfilter.c	Sat Apr 19 19:51:50 2003
+++ b/net/bridge/br_netfilter.c	Sat Apr 19 19:51:50 2003
@@ -467,6 +467,7 @@
 	struct sk_buff *skb = *pskb;
 	struct nf_bridge_info *nf_bridge = (*pskb)->nf_bridge;
 
+	/* FIXME: skb as not been linearized.  Is this still true? --RR */
 	/* Be very paranoid.  */
 	if (skb->mac.raw < skb->head || skb->mac.raw + ETH_HLEN > skb->data) {
 		printk(KERN_CRIT "br_netfilter: Argh!! br_nf_post_routing: "
diff -Nru a/net/bridge/br_notify.c b/net/bridge/br_notify.c
--- a/net/bridge/br_notify.c	Sat Apr 19 19:51:28 2003
+++ b/net/bridge/br_notify.c	Sat Apr 19 19:51:28 2003
@@ -21,15 +21,14 @@
 
 struct notifier_block br_device_notifier =
 {
-	br_device_event,
-	NULL,
-	0
+	.notifier_call = br_device_event
 };
 
 static int br_device_event(struct notifier_block *unused, unsigned long event, void *ptr)
 {
 	struct net_device *dev;
 	struct net_bridge_port *p;
+	struct net_bridge *br;
 
 	dev = ptr;
 	p = dev->br_port;
@@ -37,13 +36,15 @@
 	if (p == NULL)
 		return NOTIFY_DONE;
 
-	switch (event)
+	br = p->br;
+
+	switch (event) 
 	{
 	case NETDEV_CHANGEADDR:
-		read_lock(&p->br->lock);
+		write_lock_bh(&br->lock);
 		br_fdb_changeaddr(p, dev->dev_addr);
-		br_stp_recalculate_bridge_id(p->br);
-		read_unlock(&p->br->lock);
+		br_stp_recalculate_bridge_id(br);
+		write_unlock_bh(&br->lock);
 		break;
 
 	case NETDEV_GOING_DOWN:
@@ -51,23 +52,23 @@
 		break;
 
 	case NETDEV_DOWN:
-		if (p->br->dev.flags & IFF_UP) {
-			read_lock(&p->br->lock);
-			br_stp_disable_port(dev->br_port);
-			read_unlock(&p->br->lock);
+		if (br->dev.flags & IFF_UP) {
+			write_lock_bh(&br->lock);
+			br_stp_disable_port(p);
+			write_unlock_bh(&br->lock);
 		}
 		break;
 
 	case NETDEV_UP:
-		if (p->br->dev.flags & IFF_UP) {
-			read_lock(&p->br->lock);
-			br_stp_enable_port(dev->br_port);
-			read_unlock(&p->br->lock);
+		if (!(br->dev.flags & IFF_UP)) {
+			write_lock_bh(&br->lock);
+			br_stp_enable_port(p);
+			write_unlock_bh(&br->lock);
 		}
 		break;
 
 	case NETDEV_UNREGISTER:
-		br_del_if(dev->br_port->br, dev);
+		br_del_if(br, dev);
 		break;
 	}
 
diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h
--- a/net/bridge/br_private.h	Sat Apr 19 19:51:29 2003
+++ b/net/bridge/br_private.h	Sat Apr 19 19:51:29 2003
@@ -79,7 +79,6 @@
 
 struct net_bridge
 {
-	struct net_bridge		*next;
 	rwlock_t			lock;
 	struct net_bridge_port		*port_list;
 	struct net_device		dev;
@@ -115,10 +114,6 @@
 extern struct notifier_block br_device_notifier;
 extern unsigned char bridge_ula[6];
 
-/* br.c */
-extern void br_dec_use_count(void);
-extern void br_inc_use_count(void);
-
 /* br_device.c */
 extern void br_dev_setup(struct net_device *dev);
 extern int br_dev_xmit(struct sk_buff *skb, struct net_device *dev);
@@ -156,8 +151,9 @@
 		      int clone);
 
 /* br_if.c */
-extern int br_add_bridge(char *name);
-extern int br_del_bridge(char *name);
+extern int br_add_bridge(const char *name);
+extern int br_del_bridge(const char *name);
+extern void br_cleanup_bridges(void);
 extern int br_add_if(struct net_bridge *br,
 	      struct net_device *dev);
 extern int br_del_if(struct net_bridge *br,
@@ -172,7 +168,6 @@
 extern int br_handle_frame(struct sk_buff *skb);
 
 /* br_ioctl.c */
-extern void br_call_ioctl_atomic(void (*fn)(void));
 extern int br_ioctl(struct net_bridge *br,
 	     unsigned int cmd,
 	     unsigned long arg0,
diff -Nru a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c
--- a/net/bridge/br_stp_if.c	Sat Apr 19 19:51:50 2003
+++ b/net/bridge/br_stp_if.c	Sat Apr 19 19:51:50 2003
@@ -85,7 +85,7 @@
 		p = p->next;
 	}
 
-	del_timer(&br->tick);
+	del_timer_sync(&br->tick);
 }
 
 /* called under bridge lock */
diff -Nru a/net/bridge/netfilter/ebtable_broute.c b/net/bridge/netfilter/ebtable_broute.c
--- a/net/bridge/netfilter/ebtable_broute.c	Sat Apr 19 19:51:27 2003
+++ b/net/bridge/netfilter/ebtable_broute.c	Sat Apr 19 19:51:27 2003
@@ -14,7 +14,6 @@
 #include <linux/netfilter_bridge/ebtables.h>
 #include <linux/module.h>
 #include <linux/if_bridge.h>
-#include <linux/brlock.h>
 
 /* EBT_ACCEPT means the frame will be bridged
  * EBT_DROP means the frame will be routed
@@ -70,18 +69,15 @@
 	ret = ebt_register_table(&broute_table);
 	if (ret < 0)
 		return ret;
-	br_write_lock_bh(BR_NETPROTO_LOCK);
 	/* see br_input.c */
 	br_should_route_hook = ebt_broute;
-	br_write_unlock_bh(BR_NETPROTO_LOCK);
 	return ret;
 }
 
 static void __exit fini(void)
 {
-	br_write_lock_bh(BR_NETPROTO_LOCK);
 	br_should_route_hook = NULL;
-	br_write_unlock_bh(BR_NETPROTO_LOCK);
+	synchronize_net();
 	ebt_unregister_table(&broute_table);
 }
 
diff -Nru a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c
--- a/net/bridge/netfilter/ebtables.c	Sat Apr 19 19:51:46 2003
+++ b/net/bridge/netfilter/ebtables.c	Sat Apr 19 19:51:46 2003
@@ -175,6 +175,10 @@
 	char *base;
 	struct ebt_table_info *private = table->private;
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	read_lock_bh(&table->lock);
 	cb_base = COUNTER_BASE(private->counters, private->nentries,
 	   smp_processor_id());
diff -Nru a/net/core/datagram.c b/net/core/datagram.c
--- a/net/core/datagram.c	Sat Apr 19 19:51:49 2003
+++ b/net/core/datagram.c	Sat Apr 19 19:51:49 2003
@@ -220,7 +220,7 @@
 int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset,
 			    struct iovec *to, int len)
 {
-	int start = skb->len - skb->data_len;
+	int start = skb_headlen(skb);
 	int i, copy = start - offset;
 
 	/* Copy header. */
@@ -295,7 +295,7 @@
 int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset,
 			       u8 *to, int len, unsigned int *csump)
 {
-	int start = skb->len - skb->data_len;
+	int start = skb_headlen(skb);
 	int pos = 0;
 	int i, copy = start - offset;
 
diff -Nru a/net/core/dev.c b/net/core/dev.c
--- a/net/core/dev.c	Sat Apr 19 19:51:47 2003
+++ b/net/core/dev.c	Sat Apr 19 19:51:47 2003
@@ -1433,9 +1433,8 @@
 	}
 }
 
-#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
+#if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE)
 int (*br_handle_frame_hook)(struct sk_buff *skb) = NULL;
-#endif
 
 static __inline__ int handle_bridge(struct sk_buff *skb,
 				     struct packet_type *pt_prev)
@@ -1454,6 +1453,7 @@
 	return ret;
 }
 
+#endif
 
 #ifdef CONFIG_NET_DIVERT
 static inline int handle_diverter(struct sk_buff *skb)
@@ -1510,12 +1510,13 @@
 #endif /* CONFIG_NET_DIVERT */
 
 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
-	if (skb->dev->br_port && br_handle_frame_hook) {
+	if (skb->dev->br_port) {
 		int ret;
 
 		ret = handle_bridge(skb, pt_prev);
-		if (br_handle_frame_hook(skb) == 0)
+		if (br_handle_frame_hook(skb) == 0) 
 			return ret;
+
 		pt_prev = NULL;
 	}
 #endif
@@ -2815,7 +2816,7 @@
 extern void dv_init(void);
 #endif /* CONFIG_NET_DIVERT */
 
-static decl_subsys(net,NULL);
+static decl_subsys(net,NULL,NULL);
 
 
 /*
diff -Nru a/net/core/netfilter.c b/net/core/netfilter.c
--- a/net/core/netfilter.c	Sat Apr 19 19:51:47 2003
+++ b/net/core/netfilter.c	Sat Apr 19 19:51:47 2003
@@ -477,11 +477,6 @@
 	unsigned int verdict;
 	int ret = 0;
 
-	/* This stopgap cannot be removed until all the hooks are audited. */
-	if (skb_is_nonlinear(skb) && skb_linearize(skb, GFP_ATOMIC) != 0) {
-		kfree_skb(skb);
-		return -ENOMEM;
-	}
 	if (skb->ip_summed == CHECKSUM_HW) {
 		if (outdev == NULL) {
 			skb->ip_summed = CHECKSUM_NONE;
diff -Nru a/net/core/skbuff.c b/net/core/skbuff.c
--- a/net/core/skbuff.c	Sat Apr 19 19:51:49 2003
+++ b/net/core/skbuff.c	Sat Apr 19 19:51:49 2003
@@ -932,7 +932,7 @@
 int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len)
 {
 	int i, copy;
-	int start = skb->len - skb->data_len;
+	int start = skb_headlen(skb);
 
 	if (offset > (int)skb->len - len)
 		goto fault;
@@ -1009,7 +1009,7 @@
 unsigned int skb_checksum(const struct sk_buff *skb, int offset,
 			  int len, unsigned int csum)
 {
-	int start = skb->len - skb->data_len;
+	int start = skb_headlen(skb);
 	int i, copy = start - offset;
 	int pos = 0;
 
@@ -1085,7 +1085,7 @@
 unsigned int skb_copy_and_csum_bits(const struct sk_buff *skb, int offset,
 				    u8 *to, int len, unsigned int csum)
 {
-	int start = skb->len - skb->data_len;
+	int start = skb_headlen(skb);
 	int i, copy = start - offset;
 	int pos = 0;
 
@@ -1170,9 +1170,9 @@
 	if (skb->ip_summed == CHECKSUM_HW)
 		csstart = skb->h.raw - skb->data;
 	else
-		csstart = skb->len - skb->data_len;
+		csstart = skb_headlen(skb);
 
-	if (csstart > skb->len - skb->data_len)
+	if (csstart > skb_headlen(skb))
 		BUG();
 
 	memcpy(to, skb->data, csstart);
diff -Nru a/net/core/wireless.c b/net/core/wireless.c
--- a/net/core/wireless.c	Sat Apr 19 19:51:50 2003
+++ b/net/core/wireless.c	Sat Apr 19 19:51:50 2003
@@ -54,6 +54,7 @@
 #include <linux/rtnetlink.h>		/* rtnetlink stuff */
 #include <linux/seq_file.h>
 #include <linux/wireless.h>		/* Pretty obvious */
+#include <linux/init.h>			/* for __init */
 
 #include <net/iw_handler.h>		/* New driver API */
 
diff -Nru a/net/decnet/TODO b/net/decnet/TODO
--- a/net/decnet/TODO	Sat Apr 19 19:51:49 2003
+++ b/net/decnet/TODO	Sat Apr 19 19:51:49 2003
@@ -26,25 +26,16 @@
  o Start to hack together user level software and add more DECnet support
    in ifconfig for example. 
 
- o Test adding/deleting of routes
-
- o Test route lookup
-
- o Test /proc/net/decnet_route route listing works correctly (maybe I'll
-   change the format of this file... atm its very similar to the IPv4 route
-   file)
-
  o Find all the commonality between DECnet and IPv4 routing code and extract 
    it into a small library of routines. [probably a project for 2.7.xx]
 
- o Test ip_gre tunneling works... it did the last time I tested it and it
-   will have to if I'm to test routing properly.
-
  o Add the routing message grabbing netfilter module [written, tested,
    awaiting merge]
 
- o Add perfect socket hashing - an idea suggested by Paul Koning [part written,
-   awaiting debugging and merge]
+ o Add perfect socket hashing - an idea suggested by Paul Koning. Currently
+   we have a half-way house scheme which seems to work reasonably well, but
+   the full scheme is still worth implementing, its not not top of my list
+   right now.
 
  o Add session control message flow control
 
@@ -53,4 +44,6 @@
  o DECnet sendpages() function
 
  o AIO for DECnet
+
+ o Eliminate dn_db->parms.blksize
 
diff -Nru a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
--- a/net/decnet/af_decnet.c	Sat Apr 19 19:51:48 2003
+++ b/net/decnet/af_decnet.c	Sat Apr 19 19:51:48 2003
@@ -118,6 +118,7 @@
 #include <linux/netfilter.h>
 #include <net/sock.h>
 #include <net/tcp.h>
+#include <net/flow.h>
 #include <asm/system.h>
 #include <asm/ioctls.h>
 #include <linux/mm.h>
@@ -146,6 +147,7 @@
 #define DN_SK_HASH_SIZE (1 << DN_SK_HASH_SHIFT)
 #define DN_SK_HASH_MASK (DN_SK_HASH_SIZE - 1)
 
+
 static kmem_cache_t *dn_sk_cachep;
 static struct proto_ops dn_proto_ops;
 static rwlock_t dn_hash_lock = RW_LOCK_UNLOCKED;
@@ -273,7 +275,7 @@
 
 	if (hash == 0) {
 		hash = addr->sdn_objnamel;
-		for(i = 0; i < addr->sdn_objnamel; i++) {
+		for(i = 0; i < dn_ntohs(addr->sdn_objnamel); i++) {
 			hash ^= addr->sdn_objname[i];
 			hash ^= (hash << 3);
 		}
@@ -512,8 +514,7 @@
 	scp->services_loc = 1 | NSP_FC_NONE;
 	scp->info_rem = 0;
 	scp->info_loc = 0x03; /* NSP version 4.1 */
-	scp->segsize_rem = 230; /* Default: Updated by remote segsize */
-	scp->segsize_loc = 1450; /* Best guess for ethernet */
+	scp->segsize_rem = 230 - DN_MAX_NSP_DATA_HEADER; /* Default: Updated by remote segsize */
 	scp->nonagle = 0;
 	scp->multi_ireq = 1;
 	scp->accept_mode = ACC_IMMED;
@@ -788,8 +789,8 @@
 		return -EINVAL;
 
 #if 1
-	if ((!capable(CAP_NET_BIND_SERVICE) && saddr->sdn_objnum) ||
-	    (saddr->sdn_flags & SDF_WILD))
+	if (!capable(CAP_NET_BIND_SERVICE) && (saddr->sdn_objnum ||
+	    (saddr->sdn_flags & SDF_WILD)))
 		return -EACCES;
 #else
 	/*
@@ -877,18 +878,18 @@
 static int dn_confirm_accept(struct sock *sk, long *timeo, int allocation)
 {
 	struct dn_scp *scp = DN_SK(sk);
-	DECLARE_WAITQUEUE(wait, current);
+	DEFINE_WAIT(wait);
 	int err;
 
 	if (scp->state != DN_CR)
 		return -EINVAL;
 
 	scp->state = DN_CC;
+	scp->segsize_loc = dst_path_metric(__sk_dst_get(sk), RTAX_ADVMSS);
 	dn_send_conn_conf(sk, allocation);
 
-	add_wait_queue(sk->sleep, &wait);
+	prepare_to_wait(sk->sleep, &wait, TASK_INTERRUPTIBLE);
 	for(;;) {
-		set_current_state(TASK_INTERRUPTIBLE);
 		release_sock(sk);
 		if (scp->state == DN_CC)
 			*timeo = schedule_timeout(*timeo);
@@ -905,16 +906,21 @@
 		err = -EAGAIN;
 		if (!*timeo)
 			break;
+		prepare_to_wait(sk->sleep, &wait, TASK_INTERRUPTIBLE);
+	}
+	finish_wait(sk->sleep, &wait);
+	if (err == 0) {
+		sk->socket->state = SS_CONNECTED;
+	} else if (scp->state != DN_CC) {
+		sk->socket->state = SS_UNCONNECTED;
 	}
-	remove_wait_queue(sk->sleep, &wait);
-	current->state = TASK_RUNNING;
 	return err;
 }
 
 static int dn_wait_run(struct sock *sk, long *timeo)
 {
 	struct dn_scp *scp = DN_SK(sk);
-	DECLARE_WAITQUEUE(wait, current);
+	DEFINE_WAIT(wait);
 	int err = 0;
 
 	if (scp->state == DN_RUN)
@@ -923,9 +929,8 @@
 	if (!*timeo)
 		return -EALREADY;
 
-	add_wait_queue(sk->sleep, &wait);
+	prepare_to_wait(sk->sleep, &wait, TASK_INTERRUPTIBLE);
 	for(;;) {
-		set_current_state(TASK_INTERRUPTIBLE);
 		release_sock(sk);
 		if (scp->state == DN_CI || scp->state == DN_CC)
 			*timeo = schedule_timeout(*timeo);
@@ -942,12 +947,14 @@
 		err = -ETIMEDOUT;
 		if (!*timeo)
 			break;
+		prepare_to_wait(sk->sleep, &wait, TASK_INTERRUPTIBLE);
 	}
-	remove_wait_queue(sk->sleep, &wait);
-	current->state = TASK_RUNNING;
+	finish_wait(sk->sleep, &wait);
 out:
 	if (err == 0) {
 		sk->socket->state = SS_CONNECTED;
+	} else if (scp->state != DN_CI && scp->state != DN_CC) {
+		sk->socket->state = SS_UNCONNECTED;
 	}
 	return err;
 }
@@ -957,6 +964,7 @@
 	struct socket *sock = sk->socket;
 	struct dn_scp *scp = DN_SK(sk);
 	int err = -EISCONN;
+	struct flowi fl;
 
 	if (sock->state == SS_CONNECTED)
 		goto out;
@@ -995,12 +1003,17 @@
 	memcpy(&scp->peer, addr, sizeof(struct sockaddr_dn));
 
 	err = -EHOSTUNREACH;
-	if (dn_route_output(&sk->dst_cache, dn_saddr2dn(&scp->peer),
-			    dn_saddr2dn(&scp->addr), flags & MSG_TRYHARD) < 0)
+	memset(&fl, 0, sizeof(fl));
+	fl.oif = sk->bound_dev_if;
+	fl.fld_dst = dn_saddr2dn(&scp->peer);
+	fl.fld_src = dn_saddr2dn(&scp->addr);
+	dn_sk_ports_copy(&fl, scp);
+	if (dn_route_output_sock(&sk->dst_cache, &fl, sk, flags) < 0)
 		goto out;
-
+	sk->route_caps = sk->dst_cache->dev->features;
 	sock->state = SS_CONNECTING;
 	scp->state = DN_CI;
+	scp->segsize_loc = dst_path_metric(sk->dst_cache, RTAX_ADVMSS);
 
 	dn_nsp_send_conninit(sk, NSP_CI);
 	err = -EINPROGRESS;
@@ -1077,13 +1090,12 @@
 
 static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
 {
-	DECLARE_WAITQUEUE(wait, current);
+	DEFINE_WAIT(wait);
 	struct sk_buff *skb = NULL;
 	int err = 0;
 
-	add_wait_queue_exclusive(sk->sleep, &wait);
+	prepare_to_wait(sk->sleep, &wait, TASK_INTERRUPTIBLE);
 	for(;;) {
-		set_current_state(TASK_INTERRUPTIBLE);
 		release_sock(sk);
 		skb = skb_dequeue(&sk->receive_queue);
 		if (skb == NULL) {
@@ -1102,9 +1114,10 @@
 		err = -EAGAIN;
 		if (!*timeo)
 			break;
+		prepare_to_wait(sk->sleep, &wait, TASK_INTERRUPTIBLE);
 	}
-	remove_wait_queue(sk->sleep, &wait);
-	current->state = TASK_RUNNING;
+	finish_wait(sk->sleep, &wait);
+
 	return skb == NULL ? ERR_PTR(err) : skb;
 }
 
@@ -1276,12 +1289,6 @@
 		release_sock(sk);
 		return val;
 
-#ifdef CONFIG_DECNET_ROUTER
-	case SIOCADDRT:
-	case SIOCDELRT:
-		return dn_fib_ioctl(sock, cmd, arg);
-#endif /* CONFIG_DECNET_ROUTER */
-
 	case TIOCOUTQ:
 		amount = sk->sndbuf - atomic_read(&sk->wmem_alloc);
 		if (amount < 0)
@@ -1888,6 +1895,64 @@
 	return 0;
 }
 
+/*
+ * The DECnet spec requires the the "routing layer" accepts packets which
+ * are at least 230 bytes in size. This excludes any headers which the NSP
+ * layer might add, so we always assume that we'll be using the maximal
+ * length header on data packets. The variation in length is due to the
+ * inclusion (or not) of the two 16 bit acknowledgement fields so it doesn't
+ * make much practical difference.
+ */
+unsigned dn_mss_from_pmtu(struct net_device *dev, int mtu)
+{
+	unsigned mss = 230 - DN_MAX_NSP_DATA_HEADER;
+	if (dev) {
+		struct dn_dev *dn_db = dev->dn_ptr;
+		mtu -= LL_RESERVED_SPACE(dev);
+		if (dn_db->use_long)
+			mtu -= 21;
+		else
+			mtu -= 6;
+		mtu -= DN_MAX_NSP_DATA_HEADER;
+	} else {
+		/*
+		 * 21 = long header, 16 = guess at MAC header length
+		 */
+		mtu -= (21 + DN_MAX_NSP_DATA_HEADER + 16);
+	}
+	if (mtu > mss)
+		mss = mtu;
+	return mss;
+}
+
+static inline unsigned int dn_current_mss(struct sock *sk, int flags)
+{
+	struct dst_entry *dst = __sk_dst_get(sk);
+	struct dn_scp *scp = DN_SK(sk);
+	int mss_now = min_t(int, scp->segsize_loc, scp->segsize_rem);
+
+	/* Other data messages are limited to 16 bytes per packet */
+	if (flags & MSG_OOB)
+		return 16;
+
+	/* This works out the maximum size of segment we can send out */
+	if (dst) {
+		u32 mtu = dst_pmtu(dst);
+		mss_now = min_t(int, dn_mss_from_pmtu(dst->dev, mtu), mss_now);
+	}
+
+	return mss_now;
+}
+
+static int dn_error(struct sock *sk, int flags, int err)
+{
+	if (err == -EPIPE)
+		err = sock_error(sk) ? : -EPIPE;
+	if (err == -EPIPE && !(flags & MSG_NOSIGNAL))
+		send_sig(SIGPIPE, current, 0);
+	return err;
+}
+
 static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
 	   struct msghdr *msg, int size)
 {
@@ -1902,9 +1967,6 @@
 	struct sockaddr_dn *addr = (struct sockaddr_dn *)msg->msg_name;
 	struct sk_buff *skb = NULL;
 	struct dn_skb_cb *cb;
-	unsigned char msgflg;
-	unsigned char *ptr;
-	unsigned short ack;
 	int len;
 	unsigned char fctype;
 	long timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT);
@@ -1915,17 +1977,26 @@
 	if (addr_len && (addr_len != sizeof(struct sockaddr_dn)))
 		return -EINVAL;
 
+	/*
+	 * The only difference between stream sockets and sequenced packet
+	 * sockets is that the stream sockets always behave as if MSG_EOR
+	 * has been set.
+	 */
+	if (sock->type == SOCK_STREAM) {
+		if (flags & MSG_EOR)
+			return -EINVAL;
+		flags |= MSG_EOR;
+	}
+
 	lock_sock(sk);
 
 	err = dn_check_state(sk, addr, addr_len, &timeo, flags);
 	if (err)
-		goto out;
+		goto out_err;
 
 	if (sk->shutdown & SEND_SHUTDOWN) {
-		if (!(flags & MSG_NOSIGNAL))
-			send_sig(SIGPIPE, current, 0);
 		err = -EPIPE;
-		goto out;
+		goto out_err;
 	}
 
 	if ((flags & MSG_TRYHARD) && sk->dst_cache)
@@ -1934,20 +2005,9 @@
 	mss = scp->segsize_rem;
 	fctype = scp->services_rem & NSP_FC_MASK;
 
-	if (sk->dst_cache && sk->dst_cache->neighbour) {
-		struct dn_neigh *dn = (struct dn_neigh *)sk->dst_cache->neighbour;
-		if (dn->blksize < (mss + 11))
-			mss = dn->blksize - 11;
-	}
-
-	/*
-	 * The only difference between SEQPACKET & STREAM sockets under DECnet
-	 * is that SEQPACKET sockets set the MSG_EOR flag for the last
-	 * session control message segment. 
-	 */
+	mss = dn_current_mss(sk, flags);
 
 	if (flags & MSG_OOB) {
-		mss = 16;
 		queue = &scp->other_xmit_queue;
 		if (size > mss) {
 			err = -EMSGSIZE;
@@ -2008,7 +2068,7 @@
 
 		cb = DN_SKB_CB(skb);
 
-		ptr = skb_put(skb, 9);
+		skb_reserve(skb, DN_MAX_NSP_DATA_HEADER);
 
 		if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
 			err = -EFAULT;
@@ -2016,45 +2076,26 @@
 		}
 
 		if (flags & MSG_OOB) {
-			cb->segnum = scp->numoth;
-			seq_add(&scp->numoth, 1);
-			msgflg = 0x30;
-			ack = (scp->numoth_rcv & 0x0FFF) | 0x8000;
-			scp->ackxmt_oth = scp->numoth_rcv;
+			cb->nsp_flags = 0x30;
 			if (fctype != NSP_FC_NONE)
 				scp->flowrem_oth--;
 		} else {
-			cb->segnum = scp->numdat;
-			seq_add(&scp->numdat, 1);
-			msgflg = 0x00;
-			if (sock->type == SOCK_STREAM)
-				msgflg = 0x60;
+			cb->nsp_flags = 0x00;
 			if (scp->seg_total == 0)
-				msgflg |= 0x20;
+				cb->nsp_flags |= 0x20;
 
 			scp->seg_total += len;
 		
 			if (((sent + len) == size) && (flags & MSG_EOR)) {
-				msgflg |= 0x40;
+				cb->nsp_flags |= 0x40;
 				scp->seg_total = 0;
 				if (fctype == NSP_FC_SCMC)
 					scp->flowrem_dat--;
 			}
-			ack = (scp->numdat_rcv & 0x0FFF) | 0x8000;
-			scp->ackxmt_dat = scp->numdat_rcv;
 			if (fctype == NSP_FC_SRC)
 				scp->flowrem_dat--;
 		}
 
-		*ptr++ = msgflg;
-		*(__u16 *)ptr = scp->addrrem;
-		ptr += 2;
-		*(__u16 *)ptr = scp->addrloc;
-		ptr += 2;
-		*(__u16 *)ptr = dn_htons(ack);
-		ptr += 2;
-		*(__u16 *)ptr = dn_htons(cb->segnum);
-
 		sent += len;
 		dn_nsp_queue_xmit(sk, skb, sk->allocation, flags & MSG_OOB);
 		skb = NULL;
@@ -2070,6 +2111,11 @@
 	release_sock(sk);
 
 	return sent ? sent : err;
+
+out_err:
+	err = dn_error(sk, flags, err);
+	release_sock(sk);
+	return err;
 }
 
 static int dn_device_event(struct notifier_block *this, unsigned long event,
@@ -2215,10 +2261,8 @@
 	.sendpage =	sock_no_sendpage,
 };
 
-#ifdef CONFIG_SYSCTL
 void dn_register_sysctl(void);
 void dn_unregister_sysctl(void);
-#endif
 
 
 MODULE_DESCRIPTION("The Linux DECnet Network Protocol");
@@ -2226,7 +2270,7 @@
 MODULE_LICENSE("GPL");
 
 
-static char banner[] __initdata = KERN_INFO "NET4: DECnet for Linux: V.2.5.40s (C) 1995-2002 Linux DECnet Project Team\n";
+static char banner[] __initdata = KERN_INFO "NET4: DECnet for Linux: V.2.5.67s (C) 1995-2003 Linux DECnet Project Team\n";
 
 static int __init decnet_init(void)
 {
@@ -2253,9 +2297,7 @@
 	dn_fib_init();
 #endif /* CONFIG_DECNET_ROUTER */
 
-#ifdef CONFIG_SYSCTL
 	dn_register_sysctl();
-#endif /* CONFIG_SYSCTL */
 
 	/*
 	 * Prevent DECnet module unloading until its fixed properly.
@@ -2273,9 +2315,7 @@
 	sock_unregister(AF_DECnet);
 	dev_remove_pack(&dn_dix_packet_type);
 
-#ifdef CONFIG_SYSCTL
 	dn_unregister_sysctl();
-#endif /* CONFIG_SYSCTL */
 
 	unregister_netdevice_notifier(&dn_dev_notifier);
 
diff -Nru a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c
--- a/net/decnet/dn_dev.c	Sat Apr 19 19:51:46 2003
+++ b/net/decnet/dn_dev.c	Sat Apr 19 19:51:46 2003
@@ -36,9 +36,11 @@
 #include <linux/skbuff.h>
 #include <linux/rtnetlink.h>
 #include <linux/sysctl.h>
+#include <linux/notifier.h>
 #include <asm/uaccess.h>
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 #include <net/dn.h>
 #include <net/dn_dev.h>
 #include <net/dn_route.h>
@@ -61,6 +63,7 @@
 
 static rwlock_t dndev_lock = RW_LOCK_UNLOCKED;
 static struct net_device *decnet_default_device;
+static struct notifier_block *dnaddr_chain;
 
 static struct dn_dev *dn_dev_create(struct net_device *dev, int *err);
 static void dn_dev_delete(struct net_device *dev);
@@ -478,7 +481,7 @@
 	}
 
 	rtmsg_ifa(RTM_DELADDR, ifa1);
-
+	notifier_call_chain(&dnaddr_chain, NETDEV_DOWN, ifa1);
 	if (destroy) {
 		dn_dev_free_ifa(ifa1);
 
@@ -513,6 +516,7 @@
 	dn_db->ifa_list = ifa;
 
 	rtmsg_ifa(RTM_NEWADDR, ifa);
+	notifier_call_chain(&dnaddr_chain, NETDEV_UP, ifa);
 
 	return 0;
 }
@@ -609,7 +613,7 @@
 				dn_dev_del_ifa(dn_db, ifap, 0);
 			}
 
-			ifa->ifa_local = dn_saddr2dn(sdn);
+			ifa->ifa_local = ifa->ifa_address = dn_saddr2dn(sdn);
 
 			ret = dn_dev_set_ifa(dev, ifa);
 	}
@@ -686,7 +690,10 @@
 	if ((ifa = dn_dev_alloc_ifa()) == NULL)
 		return -ENOBUFS;
 
+	if (!rta[IFA_ADDRESS - 1])
+		rta[IFA_ADDRESS - 1] = rta[IFA_LOCAL - 1];
 	memcpy(&ifa->ifa_local, RTA_DATA(rta[IFA_LOCAL-1]), 2);
+	memcpy(&ifa->ifa_address, RTA_DATA(rta[IFA_ADDRESS-1]), 2);
 	ifa->ifa_flags = ifm->ifa_flags;
 	ifa->ifa_scope = ifm->ifa_scope;
 	ifa->ifa_dev = dn_db;
@@ -716,7 +723,10 @@
 	ifm->ifa_flags = ifa->ifa_flags | IFA_F_PERMANENT;
 	ifm->ifa_scope = ifa->ifa_scope;
 	ifm->ifa_index = ifa->ifa_dev->dev->ifindex;
-	RTA_PUT(skb, IFA_LOCAL, 2, &ifa->ifa_local);
+	if (ifa->ifa_address)
+		RTA_PUT(skb, IFA_ADDRESS, 2, &ifa->ifa_address);
+	if (ifa->ifa_local)
+		RTA_PUT(skb, IFA_LOCAL, 2, &ifa->ifa_local);
 	if (ifa->ifa_label[0])
 		RTA_PUT(skb, IFA_LABEL, IFNAMSIZ, &ifa->ifa_label);
 	nlh->nlmsg_len = skb->tail - b;
@@ -758,10 +768,7 @@
 	s_idx = cb->args[0];
 	s_dn_idx = dn_idx = cb->args[1];
 	read_lock(&dev_base_lock);
-	for(dev = dev_base, idx = 0; dev; dev = dev->next) {
-		if ((dn_db = dev->dn_ptr) == NULL)
-			continue;
-		idx++;
+	for(dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
 		if (idx < s_idx)
 			continue;
 		if (idx > s_idx)
@@ -773,7 +780,10 @@
 			if (dn_idx < s_dn_idx)
 				continue;
 
-			if (dn_dev_fill_ifaddr(skb, ifa, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, RTM_NEWADDR) <= 0)
+			if (dn_dev_fill_ifaddr(skb, ifa,
+					       NETLINK_CB(cb->skb).pid,
+					       cb->nlh->nlmsg_seq,
+					       RTM_NEWADDR) <= 0)
 				goto done;
 		}
 	}
@@ -872,8 +882,6 @@
 }
 
 
-#ifdef CONFIG_DECNET_ROUTER
-
 #define DRDELAY (5 * HZ)
 
 static int dn_am_i_a_router(struct dn_neigh *dn, struct dn_dev *dn_db, struct dn_ifaddr *ifa)
@@ -981,12 +989,6 @@
 	else
 		dn_send_router_hello(dev, ifa);
 }
-#else
-static void dn_send_brd_hello(struct net_device *dev, struct dn_ifaddr *ifa)
-{
-	dn_send_endnode_hello(dev, ifa);
-}
-#endif
 
 #if 0
 static void dn_send_ptp_hello(struct net_device *dev, struct dn_ifaddr *ifa)
@@ -1175,7 +1177,7 @@
 	if ((ifa = dn_dev_alloc_ifa()) == NULL)
 		return;
 
-	ifa->ifa_local = addr;
+	ifa->ifa_local = ifa->ifa_address = addr;
 	ifa->ifa_flags = 0;
 	ifa->ifa_scope = RT_SCOPE_UNIVERSE;
 	strcpy(ifa->ifa_label, dev->name);
@@ -1274,6 +1276,15 @@
 	rtnl_unlock();
 }
 
+int register_dnaddr_notifier(struct notifier_block *nb)
+{
+	return notifier_chain_register(&dnaddr_chain, nb);
+}
+
+int unregister_dnaddr_notifier(struct notifier_block *nb)
+{
+	return notifier_chain_unregister(&dnaddr_chain, nb);
+}
 
 #ifdef CONFIG_DECNET_SIOCGIFCONF
 /*
@@ -1390,43 +1401,21 @@
 
 static struct rtnetlink_link dnet_rtnetlink_table[RTM_MAX-RTM_BASE+1] = 
 {
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-
-	{ dn_dev_rtm_newaddr,	NULL,			},
-	{ dn_dev_rtm_deladdr,	NULL,			},
-	{ NULL,			dn_dev_dump_ifaddr,	},
-	{ NULL,			NULL,			},
+	 [4] = { .doit   = dn_dev_rtm_newaddr,	},
+	 [5] = { .doit   = dn_dev_rtm_deladdr,	},
+	 [6] = { .dumpit = dn_dev_dump_ifaddr,	},
 
 #ifdef CONFIG_DECNET_ROUTER
-	{ dn_fib_rtm_newroute,	NULL,			},
-	{ dn_fib_rtm_delroute,	NULL,			},
-	{ dn_cache_getroute,	dn_fib_dump,		},
-	{ NULL,			NULL,			},
+	 [8] = { .doit   = dn_fib_rtm_newroute,	},
+	 [9] = { .doit   = dn_fib_rtm_delroute,	},
+	[10] = { .doit   = dn_cache_getroute, .dumpit = dn_fib_dump, },
+	[16] = { .doit   = dn_fib_rtm_newrule, },
+	[17] = { .doit   = dn_fib_rtm_delrule, },
+	[18] = { .dumpit = dn_fib_dump_rules,  },
 #else
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-	{ dn_cache_getroute,	dn_cache_dump,		},
-	{ NULL,			NULL,			},
+	[10] = { .doit   = dn_cache_getroute, .dumpit = dn_cache_dump, },
 #endif
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
 
-#ifdef CONFIG_DECNET_ROUTER
-	{ dn_fib_rtm_newrule,	NULL,			},
-	{ dn_fib_rtm_delrule,	NULL,			},
-	{ NULL,			dn_fib_dump_rules,	},
-	{ NULL,			NULL,			}
-#else
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			},
-	{ NULL,			NULL,			}
-#endif
 };
 
 #ifdef MODULE
diff -Nru a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c
--- a/net/decnet/dn_fib.c	Sat Apr 19 19:51:51 2003
+++ b/net/decnet/dn_fib.c	Sat Apr 19 19:51:51 2003
@@ -12,6 +12,9 @@
  *              Alexey Kuznetsov : SMP locking changes
  *              Steve Whitehouse : Rewrote it... Well to be more correct, I
  *                                 copied most of it from the ipv4 fib code.
+ *              Steve Whitehouse : Updated it in style and fixed a few bugs
+ *                                 which were fixed in the ipv4 code since
+ *                                 this code was copied from it.
  *
  */
 #include <linux/config.h>
@@ -31,12 +34,14 @@
 #include <asm/uaccess.h>
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 #include <net/dn.h>
 #include <net/dn_route.h>
 #include <net/dn_fib.h>
 #include <net/dn_neigh.h>
 #include <net/dn_dev.h>
 
+#define RT_MIN_TABLE 1
 
 #define for_fib_info() { struct dn_fib_info *fi;\
 	for(fi = dn_fib_info_list; fi; fi = fi->fib_next)
@@ -52,7 +57,7 @@
 
 extern int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb);
 
-
+static spinlock_t dn_fib_multipath_lock = SPIN_LOCK_UNLOCKED;
 static struct dn_fib_info *dn_fib_info_list;
 static rwlock_t dn_fib_info_lock = RW_LOCK_UNLOCKED;
 int dn_fib_info_cnt;
@@ -62,18 +67,18 @@
 	int error;
 	u8 scope;
 } dn_fib_props[RTA_MAX+1] = {
-	{ 0, RT_SCOPE_NOWHERE },		/* RTN_UNSPEC */
-	{ 0, RT_SCOPE_UNIVERSE },		/* RTN_UNICAST */
-	{ 0, RT_SCOPE_HOST },			/* RTN_LOCAL */
-	{ -EINVAL, RT_SCOPE_NOWHERE },		/* RTN_BROADCAST */
-	{ -EINVAL, RT_SCOPE_NOWHERE },		/* RTN_ANYCAST */
-	{ -EINVAL, RT_SCOPE_NOWHERE },		/* RTN_MULTICAST */
-	{ -EINVAL, RT_SCOPE_UNIVERSE },		/* RTN_BLACKHOLE */
-	{ -EHOSTUNREACH, RT_SCOPE_UNIVERSE },	/* RTN_UNREACHABLE */
-	{ -EACCES, RT_SCOPE_UNIVERSE },		/* RTN_PROHIBIT */
-	{ -EAGAIN, RT_SCOPE_UNIVERSE },		/* RTN_THROW */
-	{ -EINVAL, RT_SCOPE_NOWHERE },		/* RTN_NAT */
-	{ -EINVAL, RT_SCOPE_NOWHERE }		/* RTN_XRESOLVE */
+	{ .error = 0, .scope = RT_SCOPE_NOWHERE },	  /* RTN_UNSPEC */
+	{ .error = 0, .scope = RT_SCOPE_UNIVERSE },	  /* RTN_UNICAST */
+	{ .error = 0, .scope = RT_SCOPE_HOST },		  /* RTN_LOCAL */
+	{ .error = -EINVAL, .scope = RT_SCOPE_NOWHERE },  /* RTN_BROADCAST */
+	{ .error = -EINVAL, .scope = RT_SCOPE_NOWHERE },  /* RTN_ANYCAST */
+	{ .error = -EINVAL, .scope = RT_SCOPE_NOWHERE },  /* RTN_MULTICAST */
+	{ .error = -EINVAL, .scope = RT_SCOPE_UNIVERSE }, /* RTN_BLACKHOLE */
+	{ .error = -EHOSTUNREACH, .scope = RT_SCOPE_UNIVERSE },	/* RTN_UNREACHABLE */
+	{ .error = -EACCES, .scope = RT_SCOPE_UNIVERSE }, /* RTN_PROHIBIT */
+	{ .error = -EAGAIN, .scope = RT_SCOPE_UNIVERSE }, /* RTN_THROW */
+	{ .error = 0, .scope = RT_SCOPE_NOWHERE },  /* RTN_NAT */
+	{ .error = -EINVAL, .scope = RT_SCOPE_NOWHERE }	  /* RTN_XRESOLVE */
 };
 
 void dn_fib_free_info(struct dn_fib_info *fi)
@@ -108,7 +113,7 @@
 	write_unlock(&dn_fib_info_lock);
 }
 
-static __inline__ int dn_fib_nh_comp(const struct dn_fib_info *fi, const struct dn_fib_info *ofi)
+static inline int dn_fib_nh_comp(const struct dn_fib_info *fi, const struct dn_fib_info *ofi)
 {
 	const struct dn_fib_nh *onh = ofi->fib_nh;
 
@@ -124,7 +129,7 @@
 	return 0;
 }
 
-static __inline__ struct dn_fib_info *dn_fib_find_info(const struct dn_fib_info *nfi)
+static inline struct dn_fib_info *dn_fib_find_info(const struct dn_fib_info *nfi)
 {
 	for_fib_info() {
 		if (fi->fib_nhs != nfi->fib_nhs)
@@ -132,6 +137,7 @@
 		if (nfi->fib_protocol == fi->fib_protocol &&
 			nfi->fib_prefsrc == fi->fib_prefsrc &&
 			nfi->fib_priority == fi->fib_priority &&
+			memcmp(nfi->fib_metrics, fi->fib_metrics, sizeof(fi->fib_metrics)) == 0 &&
 			((nfi->fib_flags^fi->fib_flags)&~RTNH_F_DEAD) == 0 &&
 			(nfi->fib_nhs == 0 || dn_fib_nh_comp(fi, nfi) == 0))
 				return fi;
@@ -195,14 +201,18 @@
 	int err;
 
 	if (nh->nh_gw) {
-		struct dn_fib_key key;
+		struct flowi fl;
 		struct dn_fib_res res;
 
+		memset(&fl, 0, sizeof(fl));
+
 		if (nh->nh_flags&RTNH_F_ONLINK) {
 			struct net_device *dev;
 
 			if (r->rtm_scope >= RT_SCOPE_LINK)
 				return -EINVAL;
+			if (dnet_addr_type(nh->nh_gw) != RTN_UNICAST)
+				return -EINVAL;
 			if ((dev = __dev_get_by_index(nh->nh_oif)) == NULL)
 				return -ENODEV;
 			if (!(dev->flags&IFF_UP))
@@ -213,23 +223,33 @@
 			return 0;
 		}
 
-		memset(&key, 0, sizeof(key));
-		key.dst = nh->nh_gw;
-		key.oif = nh->nh_oif;
-		key.scope = r->rtm_scope + 1;
+		memset(&fl, 0, sizeof(fl));
+		fl.fld_dst = nh->nh_gw;
+		fl.oif = nh->nh_oif;
+		fl.fld_scope = r->rtm_scope + 1;
 
-		if (key.scope < RT_SCOPE_LINK)
-			key.scope = RT_SCOPE_LINK;
+		if (fl.fld_scope < RT_SCOPE_LINK)
+			fl.fld_scope = RT_SCOPE_LINK;
 
-		if ((err = dn_fib_lookup(&key, &res)) != 0)
+		if ((err = dn_fib_lookup(&fl, &res)) != 0)
 			return err;
 
+		err = -EINVAL;
+		if (res.type != RTN_UNICAST && res.type != RTN_LOCAL)
+			goto out;
 		nh->nh_scope = res.scope;
 		nh->nh_oif = DN_FIB_RES_OIF(res);
 		nh->nh_dev = DN_FIB_RES_DEV(res);
-		if (nh->nh_dev)
-			atomic_inc(&nh->nh_dev->refcnt);
+		if (nh->nh_dev == NULL)
+			goto out;
+		atomic_inc(&nh->nh_dev->refcnt);
+		err = -ENETDOWN;
+		if (!(nh->nh_dev->flags & IFF_UP))
+			goto out;
+		err = 0;
+out:
 		dn_fib_res_put(&res);
+		return err;
 	} else {
 		struct net_device *dev;
 
@@ -277,6 +297,20 @@
 	fi->fib_flags = r->rtm_flags;
 	if (rta->rta_priority)
 		fi->fib_priority = *rta->rta_priority;
+	if (rta->rta_mx) {
+		int attrlen = RTA_PAYLOAD(rta->rta_mx);
+		struct rtattr *attr = RTA_DATA(rta->rta_mx);
+
+		while(RTA_OK(attr, attrlen)) {
+			unsigned flavour = attr->rta_type;
+			if (flavour) {
+				if (flavour > RTAX_MAX)
+					goto err_inval;
+				fi->fib_metrics[flavour-1] = *(unsigned*)RTA_DATA(attr);
+			}
+			attr = RTA_NEXT(attr, attrlen);
+		}
+	}
 	if (rta->rta_prefsrc)
 		memcpy(&fi->fib_prefsrc, rta->rta_prefsrc, 2);
 
@@ -297,6 +331,13 @@
 		nh->nh_weight = 1;
 	}
 
+	if (r->rtm_type == RTN_NAT) {
+		if (rta->rta_gw == NULL || nhs != 1 || rta->rta_oif)
+			goto err_inval;
+		memcpy(&fi->fib_nh->nh_gw, rta->rta_gw, 2);
+		goto link_it;
+	}
+
 	if (dn_fib_props[r->rtm_type].error) {
 		if (rta->rta_gw || rta->rta_oif || rta->rta_mp)
 			goto err_inval;
@@ -324,14 +365,12 @@
 		} endfor_nexthops(fi)
 	}
 
-#if I_GET_AROUND_TO_FIXING_PREFSRC
 	if (fi->fib_prefsrc) {
 		if (r->rtm_type != RTN_LOCAL || rta->rta_dst == NULL ||
 		    memcmp(&fi->fib_prefsrc, rta->rta_dst, 2))
-			if (dn_addr_type(fi->fib_prefsrc) != RTN_LOCAL)
+			if (dnet_addr_type(fi->fib_prefsrc) != RTN_LOCAL)
 				goto err_inval;
 	}
-#endif
 
 link_it:
 	if ((ofi = dn_fib_find_info(fi)) != NULL) {
@@ -366,12 +405,53 @@
 	return NULL;
 }
 
+int dn_fib_semantic_match(int type, struct dn_fib_info *fi, const struct flowi *fl, struct dn_fib_res *res)
+{
+	int err = dn_fib_props[type].error;
+
+	if (err == 0) {
+		if (fi->fib_flags & RTNH_F_DEAD)
+			return 1;
+
+		res->fi = fi;
+
+		switch(type) {
+			case RTN_NAT:
+				DN_FIB_RES_RESET(*res);
+				atomic_inc(&fi->fib_clntref);
+				return 0;
+			case RTN_UNICAST:
+			case RTN_LOCAL:
+				for_nexthops(fi) {
+					if (nh->nh_flags & RTNH_F_DEAD)
+						continue;
+					if (!fl->oif || fl->oif == nh->nh_oif)
+						break;
+				}
+				if (nhsel < fi->fib_nhs) {
+					res->nh_sel = nhsel;
+					atomic_inc(&fi->fib_clntref);
+					return 0;
+				}
+				endfor_nexthops(fi);
+				res->fi = NULL;
+				return 1;
+			default:
+				if (net_ratelimit())
+					 printk("DECnet: impossible routing event : dn_fib_semantic_match type=%d\n", type);
+				res->fi = NULL;
+				return -EINVAL;
+		}
+	}
+	return err;
+}
 
-void dn_fib_select_multipath(const struct dn_fib_key *key, struct dn_fib_res *res)
+void dn_fib_select_multipath(const struct flowi *fl, struct dn_fib_res *res)
 {
 	struct dn_fib_info *fi = res->fi;
 	int w;
 
+	spin_lock_bh(&dn_fib_multipath_lock);
 	if (fi->fib_power <= 0) {
 		int power = 0;
 		change_nexthops(fi) {
@@ -381,6 +461,11 @@
 			}
 		} endfor_nexthops(fi);
 		fi->fib_power = power;
+		if (power < 0) {
+			spin_unlock_bh(&dn_fib_multipath_lock);
+			res->nh_sel = 0;
+			return;
+		}
 	}
 
 	w = jiffies % fi->fib_power;
@@ -391,16 +476,16 @@
 				nh->nh_power--;
 				fi->fib_power--;
 				res->nh_sel = nhsel;
+				spin_unlock_bh(&dn_fib_multipath_lock);
 				return;
 			}
 		}
 	} endfor_nexthops(fi);
-
-	printk(KERN_DEBUG "DECnet: BUG! dn_fib_select_multipath\n");
+	res->nh_sel = 0;
+	spin_unlock_bh(&dn_fib_multipath_lock);
 }
 
 
-
 /*
  * Punt to user via netlink for example, but for now
  * we just drop it.
@@ -475,9 +560,9 @@
 
 	s_t = cb->args[0];
 	if (s_t == 0)
-		s_t = cb->args[0] = DN_MIN_TABLE;
+		s_t = cb->args[0] = RT_MIN_TABLE;
 
-	for(t = s_t; t < DN_NUM_TABLES; t++) {
+	for(t = s_t; t <= RT_TABLE_MAX; t++) {
 		if (t < s_t)
 			continue;
 		if (t > s_t)
@@ -494,6 +579,125 @@
 	return skb->len;
 }
 
+static void fib_magic(int cmd, int type, __u16 dst, int dst_len, struct dn_ifaddr *ifa)
+{
+	struct dn_fib_table *tb;
+	struct {
+		struct nlmsghdr nlh;
+		struct rtmsg rtm;
+	} req;
+	struct dn_kern_rta rta;
+
+	memset(&req.rtm, 0, sizeof(req.rtm));
+	memset(&rta, 0, sizeof(rta));
+
+	if (type == RTN_UNICAST)
+		tb = dn_fib_get_table(RT_MIN_TABLE, 1);
+	else
+		tb = dn_fib_get_table(RT_TABLE_LOCAL, 1);
+
+	if (tb == NULL)
+		return;
+
+	req.nlh.nlmsg_len = sizeof(req);
+	req.nlh.nlmsg_type = cmd;
+	req.nlh.nlmsg_flags = NLM_F_REQUEST|NLM_F_CREATE|NLM_F_APPEND;
+	req.nlh.nlmsg_pid = 0;
+	req.nlh.nlmsg_seq = 0;
+
+	req.rtm.rtm_dst_len = dst_len;
+	req.rtm.rtm_table = tb->n;
+	req.rtm.rtm_protocol = RTPROT_KERNEL;
+	req.rtm.rtm_scope = (type != RTN_LOCAL ? RT_SCOPE_LINK : RT_SCOPE_HOST);
+	req.rtm.rtm_type = type;
+
+	rta.rta_dst = &dst;
+	rta.rta_prefsrc = &ifa->ifa_local;
+	rta.rta_oif = &ifa->ifa_dev->dev->ifindex;
+
+	if (cmd == RTM_NEWROUTE)
+		tb->insert(tb, &req.rtm, &rta, &req.nlh, NULL);
+	else
+		tb->delete(tb, &req.rtm, &rta, &req.nlh, NULL);
+}
+
+static void dn_fib_add_ifaddr(struct dn_ifaddr *ifa)
+{
+
+	fib_magic(RTM_NEWROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa);
+
+#if 0
+	if (!(dev->flags&IFF_UP))
+		return;
+	/* In the future, we will want to add default routes here */
+
+#endif
+}
+
+static void dn_fib_del_ifaddr(struct dn_ifaddr *ifa)
+{
+	int found_it = 0;
+	struct net_device *dev;
+	struct dn_dev *dn_db;
+	struct dn_ifaddr *ifa2;
+
+	ASSERT_RTNL();
+
+	/* Scan device list */
+	read_lock(&dev_base_lock);
+	for(dev = dev_base; dev; dev = dev->next) {
+		dn_db = dev->dn_ptr;
+		if (dn_db == NULL)
+			continue;
+		for(ifa2 = dn_db->ifa_list; ifa2; ifa2 = ifa2->ifa_next) {
+			if (ifa2->ifa_local == ifa->ifa_local) {
+				found_it = 1;
+				break;
+			}
+		}
+	}
+	read_unlock(&dev_base_lock);
+
+	if (found_it == 0) {
+		fib_magic(RTM_DELROUTE, RTN_LOCAL, ifa->ifa_local, 16, ifa);
+
+		if (dnet_addr_type(ifa->ifa_local) != RTN_LOCAL) {
+			if (dn_fib_sync_down(ifa->ifa_local, NULL, 0))
+				dn_fib_flush();
+		}
+	}
+}
+
+static void dn_fib_disable_addr(struct net_device *dev, int force)
+{
+	if (dn_fib_sync_down(0, dev, force))
+		dn_fib_flush();
+	dn_rt_cache_flush(0);
+	neigh_ifdown(&dn_neigh_table, dev);
+}
+
+static int dn_fib_dnaddr_event(struct notifier_block *this, unsigned long event, void *ptr)
+{
+	struct dn_ifaddr *ifa = (struct dn_ifaddr *)ptr;
+
+	switch(event) {
+		case NETDEV_UP:
+			dn_fib_add_ifaddr(ifa);
+			dn_fib_sync_up(ifa->ifa_dev->dev);
+			dn_rt_cache_flush(-1);
+			break;
+		case NETDEV_DOWN:
+			dn_fib_del_ifaddr(ifa);
+			if (ifa->ifa_dev && ifa->ifa_dev->ifa_list == NULL) {
+				dn_fib_disable_addr(ifa->ifa_dev->dev, 1);
+			} else {
+				dn_rt_cache_flush(-1);
+			}
+			break;
+	}
+	return NOTIFY_DONE;
+}
+
 int dn_fib_sync_down(dn_address local, struct net_device *dev, int force)
 {
         int ret = 0;
@@ -520,9 +724,11 @@
                                         dead++;
                                 else if (nh->nh_dev == dev &&
                                                 nh->nh_scope != scope) {
+					spin_lock_bh(&dn_fib_multipath_lock);
                                         nh->nh_flags |= RTNH_F_DEAD;
                                         fi->fib_power -= nh->nh_power;
                                         nh->nh_power = 0;
+					spin_unlock_bh(&dn_fib_multipath_lock);
                                         dead++;
                                 }
                         } endfor_nexthops(fi)
@@ -556,11 +762,13 @@
                         if (nh->nh_dev != dev || dev->dn_ptr == NULL)
                                 continue;
                         alive++;
+			spin_lock_bh(&dn_fib_multipath_lock);
                         nh->nh_power = 0;
                         nh->nh_flags &= ~RTNH_F_DEAD;
+			spin_unlock_bh(&dn_fib_multipath_lock);
                 } endfor_nexthops(fi);
 
-                if (alive == fi->fib_nhs) {
+                if (alive > 0) {
                         fi->fib_flags &= ~RTNH_F_DEAD;
                         ret++;
                 }
@@ -574,7 +782,7 @@
         struct dn_fib_table *tb;
         int id;
 
-        for(id = DN_NUM_TABLES; id > 0; id--) {
+        for(id = RT_TABLE_MAX; id > 0; id--) {
                 if ((tb = dn_fib_get_table(id, 0)) == NULL)
                         continue;
                 flushed += tb->flush(tb);
@@ -584,21 +792,6 @@
                 dn_rt_cache_flush(-1);
 }
 
-int dn_fib_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
-{
-
-	if (!capable(CAP_NET_ADMIN))
-		return -EPERM;
-
-	switch(cmd) {
-		case SIOCADDRT:
-		case SIOCDELRT:
-			return 0;
-	}
-
-	return -EINVAL;
-}
-
 #ifdef CONFIG_PROC_FS
 
 static int decnet_rt_get_info(char *buffer, char **start, off_t offset, int length)
@@ -620,7 +813,7 @@
         }
 
 
-        for(i = DN_MIN_TABLE; (i <= DN_NUM_TABLES) && (count > 0); i++) {
+        for(i = RT_MIN_TABLE; (i <= RT_TABLE_MAX) && (count > 0); i++) {
                 if ((tb = dn_fib_get_table(i, 0)) != NULL) {
                         int n = tb->get_info(tb, ptr, first, count);
                         count -= n;
@@ -638,12 +831,18 @@
 }
 #endif /* CONFIG_PROC_FS */
 
+static struct notifier_block dn_fib_dnaddr_notifier = {
+	.notifier_call = dn_fib_dnaddr_event,
+};
+
 void __exit dn_fib_cleanup(void)
 {
 	proc_net_remove("decnet_route");
 
 	dn_fib_table_cleanup();
 	dn_fib_rules_cleanup();
+
+	unregister_dnaddr_notifier(&dn_fib_dnaddr_notifier);
 }
 
 
@@ -656,6 +855,8 @@
 
 	dn_fib_table_init();
 	dn_fib_rules_init();
+
+	register_dnaddr_notifier(&dn_fib_dnaddr_notifier);
 }
 
 
diff -Nru a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c
--- a/net/decnet/dn_neigh.c	Sat Apr 19 19:51:49 2003
+++ b/net/decnet/dn_neigh.c	Sat Apr 19 19:51:49 2003
@@ -20,6 +20,7 @@
  *     Steve Whitehouse     : Fixed neighbour states (for now anyway).
  *     Steve Whitehouse     : Made error_report functions dummies. This
  *                            is not the right place to return skbs.
+ *     Steve Whitehouse     : Convert to seq_file
  *
  */
 
@@ -33,9 +34,11 @@
 #include <linux/string.h>
 #include <linux/netfilter_decnet.h>
 #include <linux/spinlock.h>
+#include <linux/seq_file.h>
 #include <asm/atomic.h>
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 #include <net/dn.h>
 #include <net/dn_dev.h>
 #include <net/dn_neigh.h>
@@ -160,7 +163,20 @@
 		return -EINVAL;
 	}
 
-	dn->blksize = 230;
+	/*
+	 * Make an estimate of the remote block size by assuming that its
+	 * two less then the device mtu, which it true for ethernet (and
+	 * other things which support long format headers) since there is
+	 * an extra length field (of 16 bits) which isn't part of the
+	 * ethernet headers and which the DECnet specs won't admit is part
+	 * of the DECnet routing headers either.
+	 *
+	 * If we over estimate here its no big deal, the NSP negotiations
+	 * will prevent us from sending packets which are too large for the
+	 * remote node to handle. In any case this figure is normally updated
+	 * by a hello message in most cases.
+	 */
+	dn->blksize = dev->mtu - 2;
 
 	return 0;
 }
@@ -330,7 +346,7 @@
  * basically does a neigh_lookup(), but without comparing the device
  * field. This is required for the On-Ethernet cache
  */
-struct neighbour *dn_neigh_lookup(struct neigh_table *tbl, void *ptr)
+struct neighbour *dn_neigh_lookup(struct neigh_table *tbl, const void *ptr)
 {
 	struct neighbour *neigh;
 	u32 hash_val;
@@ -466,8 +482,6 @@
 	return 0;
 }
 
-
-#ifdef CONFIG_DECNET_ROUTER
 static char *dn_find_slot(char *base, int max, int priority)
 {
 	int i;
@@ -526,78 +540,200 @@
 
 	return t;
 }
-#endif /* CONFIG_DECNET_ROUTER */
-
 
 
 #ifdef CONFIG_PROC_FS
-static int dn_neigh_get_info(char *buffer, char **start, off_t offset, int length)
+
+struct dn_neigh_iter_state {
+	int bucket;
+};
+
+static struct neighbour *neigh_get_first(struct seq_file *seq)
 {
-        int len     = 0;
-        off_t pos   = 0;
-        off_t begin = 0;
-	struct neighbour *n;
-	int i;
-	char buf[DN_ASCBUF_LEN];
+	struct dn_neigh_iter_state *state = seq->private;
+	struct neighbour *n = NULL;
+
+	for(state->bucket = 0;
+	    state->bucket <= NEIGH_HASHMASK;
+	    ++state->bucket) {
+		n = dn_neigh_table.hash_buckets[state->bucket];
+		if (n)
+			break;
+	}
 
-	len += sprintf(buffer + len, "Addr    Flags State Use Blksize Dev\n");
+	return n;
+}
 
-	for(i=0;i <= NEIGH_HASHMASK; i++) {
-		read_lock_bh(&dn_neigh_table.lock);
-		n = dn_neigh_table.hash_buckets[i];
-		for(; n != NULL; n = n->next) {
-			struct dn_neigh *dn = (struct dn_neigh *)n;
-
-			read_lock(&n->lock);
-			len += sprintf(buffer+len, "%-7s %s%s%s   %02x    %02d  %07ld %-8s\n",
-					dn_addr2asc(dn_ntohs(dn->addr), buf),
-					(dn->flags&DN_NDFLAG_R1) ? "1" : "-",
-					(dn->flags&DN_NDFLAG_R2) ? "2" : "-",
-					(dn->flags&DN_NDFLAG_P3) ? "3" : "-",
-					dn->n.nud_state,
-					atomic_read(&dn->n.refcnt),
-					dn->blksize,
-					(dn->n.dev) ? dn->n.dev->name : "?");
-			read_unlock(&n->lock);
-
-			pos = begin + len;
-
-                	if (pos < offset) {
-                        	len = 0;
-                        	begin = pos;
-                	}
-
-                	if (pos > offset + length) {
-				read_unlock_bh(&dn_neigh_table.lock);
-                       		goto done;
-			}
-		}
+static struct neighbour *neigh_get_next(struct seq_file *seq,
+					struct neighbour *n)
+{
+	struct dn_neigh_iter_state *state = seq->private;
+
+	n = n->next;
+try_again:
+	if (n)
+		goto out;
+	if (++state->bucket > NEIGH_HASHMASK)
+		goto out;
+	n = dn_neigh_table.hash_buckets[state->bucket];
+	goto try_again;
+out:
+	return n;
+}
+
+static struct neighbour *neigh_get_idx(struct seq_file *seq, loff_t *pos)
+{
+	struct neighbour *n = neigh_get_first(seq);
+
+	if (n)
+		while(*pos && (n = neigh_get_next(seq, n)))
+			--*pos;
+	return *pos ? NULL : n;
+}
+
+static void *dn_neigh_get_idx(struct seq_file *seq, loff_t pos)
+{
+	void *rc;
+	read_lock_bh(&dn_neigh_table.lock);
+	rc = neigh_get_idx(seq, &pos);
+	if (!rc) {
 		read_unlock_bh(&dn_neigh_table.lock);
 	}
+	return rc;
+}
 
-done:
+static void *dn_neigh_seq_start(struct seq_file *seq, loff_t *pos)
+{
+	return *pos ? dn_neigh_get_idx(seq, *pos - 1) : (void*)1;
+}
+
+static void *dn_neigh_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+{
+	void *rc;
 
-        *start = buffer + (offset - begin);
-        len   -= offset - begin;
 
-        if (len > length) len = length;
+	if (v == (void*)1) {
+		rc = dn_neigh_get_idx(seq, 0);
+		goto out;
+	}
 
-        return len;
+	rc = neigh_get_next(seq, v);
+	if (rc)
+		goto out;
+	read_unlock_bh(&dn_neigh_table.lock);
+out:
+	++*pos;
+	return rc;
+}
+
+static void dn_neigh_seq_stop(struct seq_file *seq, void *v)
+{
+	if (v && v != (void*)1)
+		read_unlock_bh(&dn_neigh_table.lock);
 }
 
+static inline void dn_neigh_format_entry(struct seq_file *seq,
+					 struct neighbour *n)
+{
+	struct dn_neigh *dn = (struct dn_neigh *)n;
+	char buf[DN_ASCBUF_LEN];
+
+	read_lock(&n->lock);
+	seq_printf(seq, "%-7s %s%s%s   %02x    %02d  %07ld %-8s\n",
+		   dn_addr2asc(dn_ntohs(dn->addr), buf),
+		   (dn->flags&DN_NDFLAG_R1) ? "1" : "-",
+		   (dn->flags&DN_NDFLAG_R2) ? "2" : "-",
+		   (dn->flags&DN_NDFLAG_P3) ? "3" : "-",
+		   dn->n.nud_state,
+		   atomic_read(&dn->n.refcnt),
+		   dn->blksize,
+		   (dn->n.dev) ? dn->n.dev->name : "?");
+	read_unlock(&n->lock);
+}
+
+static int dn_neigh_seq_show(struct seq_file *seq, void *v)
+{
+	if (v == (void*)1) {
+		seq_puts(seq, "Addr    Flags State Use Blksize Dev\n");
+	} else {
+		dn_neigh_format_entry(seq, v);
+	}
+
+	return 0;
+}
+
+static struct seq_operations dn_neigh_seq_ops = {
+	.start = dn_neigh_seq_start,
+	.next  = dn_neigh_seq_next,
+	.stop  = dn_neigh_seq_stop,
+	.show  = dn_neigh_seq_show,
+};
+
+static int dn_neigh_seq_open(struct inode *inode, struct file *file)
+{
+	struct seq_file *seq;
+	int rc = -ENOMEM;
+	struct dn_neigh_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL);
+
+	if (!s)
+		goto out;
+
+	rc = seq_open(file, &dn_neigh_seq_ops);
+	if (rc)
+		goto out_kfree;
+
+	seq          = file->private_data;
+	seq->private = s;
+	memset(s, 0, sizeof(*s));
+out:
+	return rc;
+out_kfree:
+	kfree(s);
+	goto out;
+}
+
+static int dn_seq_release(struct inode *inode, struct file *file)
+{
+	struct seq_file *seq  = (struct seq_file *)file->private_data;
+
+	kfree(seq->private);
+	seq->private = NULL;
+	return seq_release(inode, file);
+}
+
+static struct file_operations dn_neigh_seq_fops = {
+	.open		= dn_neigh_seq_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= dn_seq_release,
+};
+
+static int __init dn_neigh_proc_init(void)
+{
+	int rc = 0;
+	struct proc_dir_entry *p = create_proc_entry("decnet_neigh", S_IRUGO, proc_net);
+	if (p)
+		p->proc_fops = &dn_neigh_seq_fops;
+	else
+		rc = -ENOMEM;
+	return rc;
+}
+
+#else
+static int __init dn_neigh_proc_init(void)
+{
+	return 0;
+}
 #endif
 
 void __init dn_neigh_init(void)
 {
 	neigh_table_init(&dn_neigh_table);
 
-#ifdef CONFIG_PROC_FS
-	proc_net_create("decnet_neigh",0,dn_neigh_get_info);
-#endif /* CONFIG_PROC_FS */
+	dn_neigh_proc_init();
 }
 
 void __exit dn_neigh_cleanup(void)
 {
-	proc_net_remove("decnet_neigh");
 	neigh_table_clear(&dn_neigh_table);
 }
diff -Nru a/net/decnet/dn_nsp_in.c b/net/decnet/dn_nsp_in.c
--- a/net/decnet/dn_nsp_in.c	Sat Apr 19 19:51:46 2003
+++ b/net/decnet/dn_nsp_in.c	Sat Apr 19 19:51:46 2003
@@ -434,7 +434,15 @@
 		sk->state_change(sk);
 	}
 
-	dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, GFP_ATOMIC);
+	/* 
+	 * It appears that its possible for remote machines to send disc
+	 * init messages with no port identifier if we are in the CI and
+	 * possibly also the CD state. Obviously we shouldn't reply with
+	 * a message if we don't know what the end point is.
+	 */
+	if (scp->addrrem) {
+		dn_nsp_send_disc(sk, NSP_DISCCONF, NSP_REASON_DC, GFP_ATOMIC);
+	}
 	scp->persist_fxn = dn_destroy_timer;
 	scp->persist = dn_nsp_persist(sk);
 
diff -Nru a/net/decnet/dn_nsp_out.c b/net/decnet/dn_nsp_out.c
--- a/net/decnet/dn_nsp_out.c	Sat Apr 19 19:51:50 2003
+++ b/net/decnet/dn_nsp_out.c	Sat Apr 19 19:51:50 2003
@@ -21,6 +21,7 @@
  *         Paul Koning:  Connect Confirm message fix.
  *      Eduardo Serrat:  Fix to stop dn_nsp_do_disc() sending malformed packets.
  *    Steve Whitehouse:  dn_nsp_output() and friends needed a spring clean
+ *    Steve Whitehouse:  Moved dn_nsp_send() in here from route.h
  */
 
 /******************************************************************************
@@ -63,6 +64,7 @@
 #include <linux/if_packet.h>
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 #include <net/dn.h>
 #include <net/dn_nsp.h>
 #include <net/dn_dev.h>
@@ -71,6 +73,41 @@
 
 static int nsp_backoff[NSP_MAXRXTSHIFT + 1] = { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };
 
+static void dn_nsp_send(struct sk_buff *skb)
+{
+	struct sock *sk = skb->sk;
+	struct dn_scp *scp = DN_SK(sk);
+	struct dst_entry *dst;
+	struct flowi fl;
+
+	skb->h.raw = skb->data;
+	scp->stamp = jiffies;
+
+	dst = sk_dst_check(sk, 0);
+	if (dst) {
+try_again:
+		skb->dst = dst;
+		dst_output(skb);
+		return;
+	}
+
+	memset(&fl, 0, sizeof(fl));
+	fl.oif = sk->bound_dev_if;
+	fl.fld_src = dn_saddr2dn(&scp->addr);
+	fl.fld_dst = dn_saddr2dn(&scp->peer);
+	dn_sk_ports_copy(&fl, scp);
+	if (dn_route_output_sock(&sk->dst_cache, &fl, sk, 0) == 0) {
+		dst = sk_dst_get(sk);
+		sk->route_caps = dst->dev->features;
+		goto try_again;
+	}
+
+	sk->err = EHOSTUNREACH;
+	if (!test_bit(SOCK_DEAD, &sk->flags))
+		sk->state_change(sk);
+}
+
+
 /*
  * If sk == NULL, then we assume that we are supposed to be making
  * a routing layer skb. If sk != NULL, then we are supposed to be
@@ -356,12 +393,33 @@
 	return ptr;
 }
 
+static unsigned short *dn_nsp_mk_data_header(struct sock *sk, struct sk_buff *skb, int oth)
+{
+	struct dn_scp *scp = DN_SK(sk);
+	struct dn_skb_cb *cb = DN_SKB_CB(skb);
+	unsigned short *ptr = dn_mk_ack_header(sk, skb, cb->nsp_flags, 11, oth);
+
+	if (unlikely(oth)) {
+		cb->segnum = scp->numoth;
+		seq_add(&scp->numoth, 1);
+	} else {
+		cb->segnum = scp->numdat;
+		seq_add(&scp->numdat, 1);
+	}
+	*(ptr++) = dn_htons(cb->segnum);
+
+	return ptr;
+}
+
 void dn_nsp_queue_xmit(struct sock *sk, struct sk_buff *skb, int gfp, int oth)
 {
 	struct dn_scp *scp = DN_SK(sk);
 	struct dn_skb_cb *cb = DN_SKB_CB(skb);
 	unsigned long t = ((scp->nsp_srtt >> 2) + scp->nsp_rttvar) >> 1;
 
+	cb->xmit_count = 0;
+	dn_nsp_mk_data_header(sk, skb, oth);
+
 	/*
 	 * Slow start: If we have been idle for more than
 	 * one RTT, then reset window to min size.
@@ -369,10 +427,6 @@
 	if ((jiffies - scp->stamp) > t)
 		scp->snd_window = NSP_MIN_WINDOW;
 
-	/* printk(KERN_DEBUG "Window: %lu\n", scp->snd_window); */
-
-	cb->xmit_count = 0;
-
 	if (oth)
 		skb_queue_tail(&scp->other_xmit_queue, skb);
 	else
@@ -630,19 +684,15 @@
 {
 	struct dn_scp *scp = DN_SK(sk);
 	struct sk_buff *skb;
-	unsigned short *segnum;
 	unsigned char *ptr;
 	int gfp = GFP_ATOMIC;
 
-	if ((skb = dn_alloc_skb(sk, 13, gfp)) == NULL)
+	if ((skb = dn_alloc_skb(sk, DN_MAX_NSP_DATA_HEADER + 2, gfp)) == NULL)
 		return;
 
-	skb_reserve(skb, 13);
-	segnum = dn_mk_ack_header(sk, skb, 0x10, 13, 1);
-	*segnum = dn_htons(scp->numoth);
-        DN_SKB_CB(skb)->segnum = scp->numoth;
-	seq_add(&scp->numoth, 1);
-	ptr = (unsigned char *)(segnum + 1);
+	skb_reserve(skb, DN_MAX_NSP_DATA_HEADER);
+	ptr = skb_put(skb, 2);
+	DN_SKB_CB(skb)->nsp_flags = 0x10;
 	*ptr++ = lsflags;
 	*ptr = fcval;
 
diff -Nru a/net/decnet/dn_route.c b/net/decnet/dn_route.c
--- a/net/decnet/dn_route.c	Sat Apr 19 19:51:50 2003
+++ b/net/decnet/dn_route.c	Sat Apr 19 19:51:50 2003
@@ -37,7 +37,8 @@
  *                                 backlog congestion level return codes.
  *		Steve Whitehouse : Fixed bug where routes were set up with
  *                                 no ref count on net devices.
- *                                 
+ *              Steve Whitehouse : RCU for the route cache
+ *              Steve Whitehouse : Preparations for the flow cache
  */
 
 /******************************************************************************
@@ -65,17 +66,19 @@
 #include <linux/netdevice.h>
 #include <linux/inet.h>
 #include <linux/route.h>
+#include <linux/in_route.h>
 #include <net/sock.h>
-#include <linux/fcntl.h>
 #include <linux/mm.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
 #include <linux/rtnetlink.h>
 #include <linux/string.h>
 #include <linux/netfilter_decnet.h>
+#include <linux/rcupdate.h>
 #include <asm/errno.h>
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 #include <net/dn.h>
 #include <net/dn_dev.h>
 #include <net/dn_nsp.h>
@@ -86,7 +89,7 @@
 struct dn_rt_hash_bucket
 {
 	struct dn_route *chain;
-	rwlock_t lock;
+	spinlock_t lock;
 } __attribute__((__aligned__(8)));
 
 extern struct neigh_table dn_neigh_table;
@@ -134,6 +137,18 @@
 	return dn_rt_hash_mask & (unsigned)tmp;
 }
 
+static inline void dnrt_free(struct dn_route *rt)
+{
+	call_rcu(&rt->u.dst.rcu_head, (void (*)(void *))dst_free, &rt->u.dst);
+}
+
+static inline void dnrt_drop(struct dn_route *rt)
+{
+	if (rt)
+		dst_release(&rt->u.dst);
+	call_rcu(&rt->u.dst.rcu_head, (void (*)(void *))dst_free, &rt->u.dst);
+}
+
 static void SMP_TIMER_NAME(dn_dst_check_expire)(unsigned long dummy)
 {
 	int i;
@@ -144,7 +159,7 @@
 	for(i = 0; i <= dn_rt_hash_mask; i++) {
 		rtp = &dn_rt_hash_table[i].chain;
 
-		write_lock(&dn_rt_hash_table[i].lock);
+		spin_lock(&dn_rt_hash_table[i].lock);
 		while((rt=*rtp) != NULL) {
 			if (atomic_read(&rt->u.dst.__refcnt) ||
 					(now - rt->u.dst.lastuse) < expire) {
@@ -153,9 +168,9 @@
 			}
 			*rtp = rt->u.rt_next;
 			rt->u.rt_next = NULL;
-			dst_free(&rt->u.dst);
+			dnrt_free(rt);
 		}
-		write_unlock(&dn_rt_hash_table[i].lock);
+		spin_unlock(&dn_rt_hash_table[i].lock);
 
 		if ((jiffies - now) > 0)
 			break;
@@ -175,7 +190,7 @@
 
 	for(i = 0; i <= dn_rt_hash_mask; i++) {
 
-		write_lock_bh(&dn_rt_hash_table[i].lock);
+		spin_lock_bh(&dn_rt_hash_table[i].lock);
 		rtp = &dn_rt_hash_table[i].chain;
 
 		while((rt=*rtp) != NULL) {
@@ -186,10 +201,10 @@
 			}
 			*rtp = rt->u.rt_next;
 			rt->u.rt_next = NULL;
-			dst_free(&rt->u.dst);
+			dnrt_drop(rt);
 			break;
 		}
-		write_unlock_bh(&dn_rt_hash_table[i].lock);
+		spin_unlock_bh(&dn_rt_hash_table[i].lock);
 	}
 
 	return 0;
@@ -216,19 +231,53 @@
 	return;
 }
 
-static void dn_insert_route(struct dn_route *rt, unsigned hash)
+static inline int compare_keys(struct flowi *fl1, struct flowi *fl2)
 {
+	return memcmp(&fl1->nl_u.dn_u, &fl2->nl_u.dn_u, sizeof(fl1->nl_u.dn_u)) == 0 &&
+		fl1->oif == fl2->oif &&
+		fl1->iif == fl2->iif;
+}
+
+static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route **rp)
+{
+	struct dn_route *rth, **rthp;
 	unsigned long now = jiffies;
 
-	write_lock_bh(&dn_rt_hash_table[hash].lock);
+	rthp = &dn_rt_hash_table[hash].chain;
+
+	spin_lock_bh(&dn_rt_hash_table[hash].lock);
+	while((rth = *rthp) != NULL) {
+		if (compare_keys(&rth->fl, &rt->fl)) {
+			/* Put it first */
+			*rthp = rth->u.rt_next;
+			smp_wmb();
+			rth->u.rt_next = dn_rt_hash_table[hash].chain;
+			smp_wmb();
+			dn_rt_hash_table[hash].chain = rth;
+
+			rth->u.dst.__use++;
+			dst_hold(&rth->u.dst);
+			rth->u.dst.lastuse = now;
+			spin_unlock_bh(&dn_rt_hash_table[hash].lock);
+
+			dnrt_drop(rt);
+			*rp = rth;
+			return 0;
+		}
+		rthp = &rth->u.rt_next;
+	}
+
+	smp_wmb();
 	rt->u.rt_next = dn_rt_hash_table[hash].chain;
+	smp_wmb();
 	dn_rt_hash_table[hash].chain = rt;
 	
 	dst_hold(&rt->u.dst);
 	rt->u.dst.__use++;
 	rt->u.dst.lastuse = now;
-
-	write_unlock_bh(&dn_rt_hash_table[hash].lock);
+	spin_unlock_bh(&dn_rt_hash_table[hash].lock);
+	*rp = rt;
+	return 0;
 }
 
 void SMP_TIMER_NAME(dn_run_flush)(unsigned long dummy)
@@ -237,7 +286,7 @@
 	struct dn_route *rt, *next;
 
 	for(i = 0; i < dn_rt_hash_mask; i++) {
-		write_lock_bh(&dn_rt_hash_table[i].lock);
+		spin_lock_bh(&dn_rt_hash_table[i].lock);
 
 		if ((rt = xchg(&dn_rt_hash_table[i].chain, NULL)) == NULL)
 			goto nothing_to_declare;
@@ -249,7 +298,7 @@
 		}
 
 nothing_to_declare:
-		write_unlock_bh(&dn_rt_hash_table[i].lock);
+		spin_unlock_bh(&dn_rt_hash_table[i].lock);
 	}
 }
 
@@ -628,51 +677,50 @@
 	return err;
 }
 
-#ifdef CONFIG_DECNET_ROUTER
 static int dn_forward(struct sk_buff *skb)
 {
 	struct dn_skb_cb *cb = DN_SKB_CB(skb);
 	struct dst_entry *dst = skb->dst;
-	struct neighbour *neigh;
+	struct dn_dev *dn_db = dst->dev->dn_ptr;
+	struct dn_route *rt;
+	struct neighbour *neigh = dst->neighbour;
+	int header_len;
 #ifdef CONFIG_NETFILTER
 	struct net_device *dev = skb->dev;
 #endif
-	int err = -EINVAL;
 
-	if ((neigh = dst->neighbour) == NULL)
-		goto error;
+	if (skb->pkt_type != PACKET_HOST)
+		goto drop;
+
+	/* Ensure that we have enough space for headers */
+	rt = (struct dn_route *)skb->dst;
+	header_len = dn_db->use_long ? 21 : 6;
+	if (skb_cow(skb, LL_RESERVED_SPACE(rt->u.dst.dev)+header_len))
+		goto drop;
 
 	/*
 	 * Hop count exceeded.
 	 */
-	err = NET_RX_DROP;
 	if (++cb->hops > 30)
 		goto drop;
 
-	skb->dev = dst->dev;
+	skb->dev = rt->u.dst.dev;
 
 	/*
 	 * If packet goes out same interface it came in on, then set
 	 * the Intra-Ethernet bit. This has no effect for short
 	 * packets, so we don't need to test for them here.
 	 */
-	if (cb->iif == dst->dev->ifindex)
+	cb->rt_flags &= ~DN_RT_F_IE;
+	if (rt->rt_flags | RTCF_DOREDIRECT)
 		cb->rt_flags |= DN_RT_F_IE;
-	else
-		cb->rt_flags &= ~DN_RT_F_IE;
 
 	return NF_HOOK(PF_DECnet, NF_DN_FORWARD, skb, dev, skb->dev, neigh->output);
 
-
-error:
-	if (net_ratelimit())
-		printk(KERN_DEBUG "dn_forward: This should not happen\n");
 drop:
 	kfree_skb(skb);
-
-	return err;
+	return NET_RX_DROP;
 }
-#endif
 
 /*
  * Drop packet. This is used for endnodes and for
@@ -703,182 +751,450 @@
 	return NET_RX_BAD;
 }
 
-static int dn_route_output_slow(struct dst_entry **pprt, dn_address dst, dn_address src, int flags)
+static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res)
 {
+	struct dn_fib_info *fi = res->fi;
+	struct net_device *dev = rt->u.dst.dev;
+	struct neighbour *n;
+	unsigned mss;
+
+	if (fi) {
+		if (DN_FIB_RES_GW(*res) &&
+		    DN_FIB_RES_NH(*res).nh_scope == RT_SCOPE_LINK)
+			rt->rt_gateway = DN_FIB_RES_GW(*res);
+		memcpy(rt->u.dst.metrics, fi->fib_metrics,
+		       sizeof(rt->u.dst.metrics));
+	}
+	rt->rt_type = res->type;
+
+	if (dev != NULL && rt->u.dst.neighbour == NULL) {
+		n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev);
+		if (IS_ERR(n))
+			return PTR_ERR(n);
+		rt->u.dst.neighbour = n;
+	}
+
+	if (rt->u.dst.metrics[RTAX_MTU-1] == 0 || 
+            rt->u.dst.metrics[RTAX_MTU-1] > rt->u.dst.dev->mtu)
+		rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu;
+	mss = dn_mss_from_pmtu(dev, dst_pmtu(&rt->u.dst));
+	if (rt->u.dst.metrics[RTAX_ADVMSS-1] == 0 ||
+	    rt->u.dst.metrics[RTAX_ADVMSS-1] > mss)
+		rt->u.dst.metrics[RTAX_ADVMSS-1] = mss;
+	return 0;
+}
+
+static inline int dn_match_addr(__u16 addr1, __u16 addr2)
+{
+	__u16 tmp = dn_ntohs(addr1) ^ dn_ntohs(addr2);
+	int match = 16;
+	while(tmp)
+		tmp >>= 1, match--;
+	return match;
+}
+
+static __u16 dnet_select_source(const struct net_device *dev, __u16 daddr, int scope)
+{
+	__u16 saddr = 0;
+	struct dn_dev *dn_db = dev->dn_ptr;
+	struct dn_ifaddr *ifa;
+	int best_match = 0;
+	int ret;
+
+	read_lock(&dev_base_lock);
+	for(ifa = dn_db->ifa_list; ifa; ifa = ifa->ifa_next) {
+		if (ifa->ifa_scope > scope)
+			continue;
+		if (!daddr) {
+			saddr = ifa->ifa_local;
+			break;
+		}
+		ret = dn_match_addr(daddr, ifa->ifa_local);
+		if (ret > best_match)
+			saddr = ifa->ifa_local;
+		if (best_match == 0)
+			saddr = ifa->ifa_local;
+	}
+	read_unlock(&dev_base_lock);
+
+	return saddr;
+}
+
+static inline __u16 __dn_fib_res_prefsrc(struct dn_fib_res *res)
+{
+	return dnet_select_source(DN_FIB_RES_DEV(*res), DN_FIB_RES_GW(*res), res->scope);
+}
+
+static inline __u16 dn_fib_rules_map_destination(__u16 daddr, struct dn_fib_res *res)
+{
+	__u16 mask = dnet_make_mask(res->prefixlen);
+	return (daddr&~mask)|res->fi->fib_nh->nh_gw;
+}
+
+static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *oldflp, int try_hard)
+{
+	struct flowi fl = { .nl_u = { .dn_u = 
+				      { .daddr = oldflp->fld_dst,
+					.saddr = oldflp->fld_src,
+					.scope = RT_SCOPE_UNIVERSE,
+#ifdef CONFIG_DECNET_ROUTE_FWMARK
+					.fwmark = oldflp->fld_fwmark
+#endif
+				     } },
+			    .iif = loopback_dev.ifindex,
+			    .oif = oldflp->oif };
 	struct dn_route *rt = NULL;
-	struct net_device *dev = NULL;
+	struct net_device *dev_out = NULL;
 	struct neighbour *neigh = NULL;
-	struct dn_dev *dn_db;
 	unsigned hash;
-
-#ifdef CONFIG_DECNET_ROUTER
-	struct dn_fib_key key;
-	struct dn_fib_res res;
+	unsigned flags = 0;
+	struct dn_fib_res res = { .fi = NULL, .type = RTN_UNICAST };
 	int err;
+	int free_res = 0;
+	__u16 gateway = 0;
 
-	key.src = src;
-	key.dst = dst;
-	key.iif = 0;
-	key.oif = 0;
-	key.fwmark = 0;
-	key.scope = RT_SCOPE_UNIVERSE;
-
-	if ((err = dn_fib_lookup(&key, &res)) == 0) {
-		switch(res.type) {
-			case RTN_UNICAST:
-				/*
-				 * This method of handling multipath
-				 * routes is a hack and will change.
-				 * It works for now though.
-				 */
-				if (res.fi->fib_nhs)
-					dn_fib_select_multipath(&key, &res);
-				neigh = __neigh_lookup(&dn_neigh_table, &DN_FIB_RES_GW(res), DN_FIB_RES_DEV(res), 1);
-				err = -ENOBUFS;
-				if (!neigh)
-					break;
-				err = 0;
-				break;
-			case RTN_UNREACHABLE:
-				err = -EHOSTUNREACH;
-				break;
-			default:
-				err = -EINVAL;
+	if (decnet_debug_level & 16)
+		printk(KERN_DEBUG
+		       "dn_route_output_slow: dst=%04x src=%04x mark=%d"
+		       " iif=%d oif=%d\n", oldflp->fld_dst, oldflp->fld_src,
+                       oldflp->fld_fwmark, loopback_dev.ifindex, oldflp->oif);
+
+	/* If we have an output interface, verify its a DECnet device */
+	if (oldflp->oif) {
+		dev_out = dev_get_by_index(oldflp->oif);
+		err = -ENODEV;
+		if (dev_out && dev_out->dn_ptr == NULL) {
+			dev_put(dev_out);
+			dev_out = NULL;
 		}
-		dn_fib_res_put(&res);
-		if (err < 0)
-			return err;
-		goto got_route;
+		if (dev_out == NULL)
+			goto out;
 	}
 
-	if (err != -ESRCH)
-		return err;
-#endif 
+	/* If we have a source address, verify that its a local address */
+	if (oldflp->fld_src) {
+		err = -EADDRNOTAVAIL;
+
+		if (dev_out) {
+			if (dn_dev_islocal(dev_out, oldflp->fld_src))
+				goto source_ok;
+			dev_put(dev_out);
+			goto out;
+		}
+		read_lock(&dev_base_lock);
+		for(dev_out = dev_base; dev_out; dev_out = dev_out->next) {
+			if (!dev_out->dn_ptr)
+				continue;
+			if (dn_dev_islocal(dev_out, oldflp->fld_src))
+				break;
+		}
+		read_unlock(&dev_base_lock);
+		if (dev_out == NULL)
+			goto out;
+		dev_hold(dev_out);
+source_ok:
+	}
 
-	/* Look in On-Ethernet cache first */
-	if (!(flags & MSG_TRYHARD)) {
-		if ((neigh = dn_neigh_lookup(&dn_neigh_table, &dst)) != NULL)
-			goto got_route;
+	/* No destination? Assume its local */
+	if (!fl.fld_dst) {
+		fl.fld_dst = fl.fld_src;
+#if 0
+		if (!fl.fld_dst)
+			/* grab an address from loopback? */
+#endif
+		err = -EADDRNOTAVAIL;
+		if (dev_out)
+			dev_put(dev_out);
+		if (!fl.fld_dst)
+			goto out;
+		dev_out = &loopback_dev;
+		dev_hold(dev_out);
+		fl.oif = loopback_dev.ifindex;
+		res.type = RTN_LOCAL;
+		goto make_route;
 	}
 
-	dev = dn_dev_get_default();
-	if (dev == NULL)
-		return -EINVAL;
+	if (decnet_debug_level & 16)
+		printk(KERN_DEBUG
+		       "dn_route_output_slow: initial checks complete."
+		       " dst=%o4x src=%04x oif=%d try_hard=%d\n", fl.fld_dst,
+		       fl.fld_src, fl.oif, try_hard);
 
-	dn_db = dev->dn_ptr;
+	/*
+	 * N.B. If the kernel is compiled without router support then
+	 * dn_fib_lookup() will evaluate to non-zero so this if () block
+	 * will always be executed.
+	 */
+	err = -ESRCH;
+	if (try_hard || (err = dn_fib_lookup(&fl, &res)) != 0) {
+		struct dn_dev *dn_db;
+		if (err != -ESRCH)
+			goto out;
+		/*
+	 	 * Here the fallback is basically the standard algorithm for 
+		 * routing in endnodes which is described in the DECnet routing
+		 * docs
+		 *
+		 * If we are not trying hard, look in neighbour cache.
+		 * The result is tested to ensure that if a specific output
+		 * device/source address was requested, then we honour that 
+		 * here
+		 */
+		if (!try_hard) {
+			neigh = dn_neigh_lookup(&dn_neigh_table, &fl.fld_dst);
+			if (neigh) {
+				if ((oldflp->oif && 
+				    (neigh->dev->ifindex != oldflp->oif)) ||
+				    (oldflp->fld_src &&
+				    (!dn_dev_islocal(neigh->dev,
+						      oldflp->fld_src)))) {
+					neigh_release(neigh);
+					neigh = NULL;
+				} else {
+					if (dev_out)
+						dev_put(dev_out);
+					if (dn_dev_islocal(neigh->dev, fl.fld_dst)) {
+						dev_out = &loopback_dev;
+						res.type = RTN_LOCAL;
+					} else {
+						dev_out = neigh->dev;
+					}
+					dev_hold(dev_out);
+					goto select_source;
+				}
+			}
+		}
 
-	/* Check to see if its one of our own local addresses */
-	if (dn_dev_islocal(dev, dst)) {
-		struct net_device *lo = &loopback_dev;
-		if (lo->dn_ptr) {
-			neigh = __neigh_lookup(&dn_neigh_table, &dst, lo, 1);
-			if (neigh)
-				goto got_route;
-		}
-		if (net_ratelimit())
-			printk("dn_route_output_slow: Dest is local interface address, but loopback device is not up\n");
-		dev_put(dev);
-		return -EINVAL;
+		/* Not there? Perhaps its a local address */
+		if (dev_out == NULL)
+			dev_out = dn_dev_get_default();
+		err = -ENODEV;
+		if (dev_out == NULL)
+			goto out;
+		dn_db = dev_out->dn_ptr;
+		/* Possible improvement - check all devices for local addr */
+		if (dn_dev_islocal(dev_out, fl.fld_dst)) {
+			dev_put(dev_out);
+			dev_out = &loopback_dev;
+			dev_hold(dev_out);
+			res.type = RTN_LOCAL;
+			goto select_source;
+		}
+		/* Not local either.... try sending it to the default router */
+		neigh = neigh_clone(dn_db->router);
+		BUG_ON(neigh && neigh->dev != dev_out);
+
+		/* Ok then, we assume its directly connected and move on */
+select_source:
+		if (neigh)
+			gateway = ((struct dn_neigh *)neigh)->addr;
+		if (gateway == 0)
+			gateway = fl.fld_dst;
+		if (fl.fld_src == 0) {
+			fl.fld_src = dnet_select_source(dev_out, gateway,
+							 res.type == RTN_LOCAL ?
+							 RT_SCOPE_HOST : 
+							 RT_SCOPE_LINK);
+			if (fl.fld_src == 0 && res.type != RTN_LOCAL)
+				goto e_addr;
+		}
+		fl.oif = dev_out->ifindex;
+		goto make_route;
 	}
+	free_res = 1;
 
-	/* Try default router */
-	if ((neigh = neigh_clone(dn_db->router)) != NULL)
-		goto got_route;
-
-	/* Send to default device (and hope for the best) if above fail */
-	if ((neigh = __neigh_lookup(&dn_neigh_table, &dst, dev, 1)) != NULL)
-		goto got_route;
-
-	dev_put(dev);
-	return -EINVAL;
-
-got_route:
-	if (dev)
-		dev_put(dev);
+	if (res.type == RTN_NAT)
+		goto e_inval;
 
-	if ((rt = dst_alloc(&dn_dst_ops)) == NULL) {
-		neigh_release(neigh);
-		return -EINVAL;
-	}
+	if (res.type == RTN_LOCAL) {
+		if (!fl.fld_src)
+			fl.fld_src = fl.fld_dst;
+		if (dev_out)
+			dev_put(dev_out);
+		dev_out = &loopback_dev;
+		dev_hold(dev_out);
+		fl.oif = dev_out->ifindex;
+		if (res.fi)
+			dn_fib_info_put(res.fi);
+		res.fi = NULL;
+		goto make_route;
+	}
+
+	if (res.fi->fib_nhs > 1 && fl.oif == 0)
+		dn_fib_select_multipath(&fl, &res);
+
+	/* 
+	 * We could add some logic to deal with default routes here and
+	 * get rid of some of the special casing above.
+	 */
 
-	dn_db = (struct dn_dev *)neigh->dev->dn_ptr;
+	if (!fl.fld_src)
+		fl.fld_src = DN_FIB_RES_PREFSRC(res);
 	
-	rt->key.saddr  = src;
-	rt->rt_saddr   = src;
-	rt->key.daddr  = dst;
-	rt->rt_daddr   = dst;
-	rt->key.oif    = neigh ? neigh->dev->ifindex : -1;
-	rt->key.iif    = 0;
-	rt->key.fwmark = 0;
+	if (dev_out)
+		dev_put(dev_out);
+	dev_out = DN_FIB_RES_DEV(res);
+	dev_hold(dev_out);
+	fl.oif = dev_out->ifindex;
+	gateway = DN_FIB_RES_GW(res);
+
+make_route:
+	if (dev_out->flags & IFF_LOOPBACK)
+		flags |= RTCF_LOCAL;
+
+	rt = dst_alloc(&dn_dst_ops);
+	if (rt == NULL)
+		goto e_nobufs;
+
+	atomic_set(&rt->u.dst.__refcnt, 1);
+	rt->u.dst.flags   = DST_HOST;
+
+	rt->fl.fld_src    = oldflp->fld_src;
+	rt->fl.fld_dst    = oldflp->fld_dst;
+	rt->fl.oif        = oldflp->oif;
+	rt->fl.iif        = 0;
+#ifdef CONFIG_DECNET_ROUTE_FWMARK
+	rt->fl.fld_fwmark = flp->fld_fwmark;
+#endif
+
+	rt->rt_saddr      = fl.fld_src;
+	rt->rt_daddr      = fl.fld_dst;
+	rt->rt_gateway    = gateway ? gateway : fl.fld_dst;
+
+	rt->rt_dst_map    = fl.fld_dst;
+	rt->rt_src_map    = fl.fld_src;
 
+	rt->u.dst.dev = dev_out;
+	dev_hold(dev_out);
 	rt->u.dst.neighbour = neigh;
-	rt->u.dst.dev = neigh ? neigh->dev : NULL;
-	if (rt->u.dst.dev)
-		dev_hold(rt->u.dst.dev);
-	rt->u.dst.lastuse = jiffies;
-	rt->u.dst.output = dn_output;
-	rt->u.dst.input  = dn_rt_bug;
+	neigh = NULL;
 
-	if (neigh->dev->flags & IFF_LOOPBACK)
-		rt->u.dst.input = dn_nsp_rx;
+	rt->u.dst.lastuse = jiffies;
+	rt->u.dst.output  = dn_output;
+	rt->u.dst.input   = dn_rt_bug;
+	rt->rt_flags      = flags;
+	if (flags & RTCF_LOCAL)
+		rt->u.dst.output = dn_nsp_rx;
+
+	if (dn_rt_set_next_hop(rt, &res))
+		goto e_neighbour;
+
+	hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst);
+	dn_insert_route(rt, hash, (struct dn_route **)pprt);
+	err = 0;
 
-	hash = dn_hash(rt->key.saddr, rt->key.daddr);
-	dn_insert_route(rt, hash);
-	*pprt = &rt->u.dst;
+done:
+	if (neigh)
+		neigh_release(neigh);
+	if (free_res)
+		dn_fib_res_put(&res);
+	if (dev_out)
+		dev_put(dev_out);
+out:
+	return err;
 
-	return 0;
+e_addr:
+        err = -EADDRNOTAVAIL;
+        goto done;
+e_inval:
+	err = -EINVAL;
+	goto done;
+e_nobufs:
+	err = -ENOBUFS;
+	goto done;
+e_neighbour:
+	dst_free(&rt->u.dst);
+	goto e_nobufs;
 }
 
-int dn_route_output(struct dst_entry **pprt, dn_address dst, dn_address src, int flags)
+
+/*
+ * N.B. The flags may be moved into the flowi at some future stage.
+ */
+static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *flp, int flags)
 {
-	unsigned hash = dn_hash(src, dst);
+	unsigned hash = dn_hash(flp->fld_src, flp->fld_dst);
 	struct dn_route *rt = NULL;
 
 	if (!(flags & MSG_TRYHARD)) {
-		read_lock_bh(&dn_rt_hash_table[hash].lock);
+		rcu_read_lock();
 		for(rt = dn_rt_hash_table[hash].chain; rt; rt = rt->u.rt_next) {
-			if ((dst == rt->key.daddr) &&
-					(src == rt->key.saddr) &&
-					(rt->key.iif == 0) &&
-					(rt->key.oif != 0)) {
+			read_barrier_depends();
+			if ((flp->fld_dst == rt->fl.fld_dst) &&
+			    (flp->fld_src == rt->fl.fld_src) &&
+#ifdef CONFIG_DECNET_ROUTE_FWMARK
+			    (flp->fld_fwmark == rt->fl.fld_fwmark) &&
+#endif
+			    (rt->fl.iif == 0) &&
+			    (rt->fl.oif == flp->oif)) {
 				rt->u.dst.lastuse = jiffies;
 				dst_hold(&rt->u.dst);
 				rt->u.dst.__use++;
-				read_unlock_bh(&dn_rt_hash_table[hash].lock);
+				rcu_read_unlock();
 				*pprt = &rt->u.dst;
 				return 0;
 			}
 		}
-		read_unlock_bh(&dn_rt_hash_table[hash].lock);
+		rcu_read_unlock();
+	}
+
+	return dn_route_output_slow(pprt, flp, flags);
+}
+
+static int dn_route_output_key(struct dst_entry **pprt, struct flowi *flp, int flags)
+{
+	int err;
+
+	err = __dn_route_output_key(pprt, flp, flags);
+	if (err == 0 && flp->proto) {
+		err = xfrm_lookup(pprt, flp, NULL, 0);
 	}
+	return err;
+}
+
+int dn_route_output_sock(struct dst_entry **pprt, struct flowi *fl, struct sock *sk, int flags)
+{
+	int err;
 
-	return dn_route_output_slow(pprt, dst, src, flags);
+	err = __dn_route_output_key(pprt, fl, flags & MSG_TRYHARD);
+	if (err == 0 && fl->proto) {
+		err = xfrm_lookup(pprt, fl, sk, !(flags & MSG_DONTWAIT));
+	}
+	return err;
 }
 
 static int dn_route_input_slow(struct sk_buff *skb)
 {
 	struct dn_route *rt = NULL;
 	struct dn_skb_cb *cb = DN_SKB_CB(skb);
-	struct net_device *dev = skb->dev;
+	struct net_device *in_dev = skb->dev;
+	struct net_device *out_dev = NULL;
 	struct dn_dev *dn_db;
 	struct neighbour *neigh = NULL;
-	int (*dnrt_input)(struct sk_buff *skb);
-	int (*dnrt_output)(struct sk_buff *skb);
-	u32 fwmark = 0;
 	unsigned hash;
-	dn_address saddr = cb->src;
-	dn_address daddr = cb->dst;
-#ifdef CONFIG_DECNET_ROUTER
-	struct dn_fib_key key;
-	struct dn_fib_res res;
-	int err;
+	int flags = 0;
+	__u16 gateway = 0;
+	struct flowi fl = { .nl_u = { .dn_u = 
+				     { .daddr = cb->dst,
+				       .saddr = cb->src,
+				       .scope = RT_SCOPE_UNIVERSE,
+#ifdef CONFIG_DECNET_ROUTE_FWMARK
+				       .fwmark = skb->fwmark
 #endif
+				    } },
+			    .iif = skb->dev->ifindex };
+	struct dn_fib_res res = { .fi = NULL, .type = RTN_UNREACHABLE };
+	int err = -EINVAL;
+	int free_res = 0;
 
-	if (dev == NULL)
-		return -EINVAL;
+	dev_hold(in_dev);
 
-	if ((dn_db = dev->dn_ptr) == NULL)
-		return -EINVAL;
+	if ((dn_db = in_dev->dn_ptr) == NULL)
+		goto out;
+
+	/* Zero source addresses are not allowed */
+	if (fl.fld_src == 0)
+		goto out;
 
 	/*
 	 * In this case we've just received a packet from a source
@@ -887,122 +1203,183 @@
 	 * other nasties. Loopback packets already have the dst attached
 	 * so this only affects packets which have originated elsewhere.
 	 */
-	if (dn_dev_islocal(dev, cb->src))
-		return -ENOTUNIQ;
-
-	/*
-	 * Default is to create a drop everything entry
-	 */
-	dnrt_input  = dn_blackhole;
-	dnrt_output = dn_rt_bug;
-
-	/*
-	 * Is the destination us ?
-	 */
-	if (!dn_dev_islocal(dev, cb->dst))
-		goto non_local_input;
-
-	/*
-	 * Local input... find source of skb
-	 */
-	dnrt_input  = dn_nsp_rx;
-	dnrt_output = dn_output;
-	saddr = cb->dst;
-	daddr = cb->src;
-
-	if ((neigh = neigh_lookup(&dn_neigh_table, &cb->src, dev)) != NULL)
-		goto add_entry;
-
-	if (dn_db->router && ((neigh = neigh_clone(dn_db->router)) != NULL))
-		goto add_entry;
-
-	neigh = neigh_create(&dn_neigh_table, &cb->src, dev);
-	if (!IS_ERR(neigh)) {
-		if (dev->type == ARPHRD_ETHER)
-			memcpy(neigh->ha, skb->mac.ethernet->h_source, ETH_ALEN);
-		goto add_entry;
-	}
-
-	return PTR_ERR(neigh);
+	err  = -ENOTUNIQ;
+	if (dn_dev_islocal(in_dev, cb->src))
+		goto out;
 
-non_local_input:
+	err = dn_fib_lookup(&fl, &res);
+	if (err) {
+		if (err != -ESRCH)
+			goto out;
+		/*
+		 * Is the destination us ?
+		 */
+		if (!dn_dev_islocal(in_dev, cb->dst))
+			goto e_inval;
 
-#ifdef CONFIG_DECNET_ROUTER
-	/*
-	 * Destination is another node... find next hop in
-	 * routing table here.
-	 */
+		res.type = RTN_LOCAL;
+		flags |= RTCF_DIRECTSRC;
+	} else {
+		__u16 src_map = fl.fld_src;
+		free_res = 1;
 
-	key.src = cb->src;
-	key.dst = cb->dst;
-	key.iif = dev->ifindex;
-	key.oif = 0;
-	key.scope = RT_SCOPE_UNIVERSE;
+		out_dev = DN_FIB_RES_DEV(res);
+		if (out_dev == NULL) {
+			if (net_ratelimit())
+				printk(KERN_CRIT "Bug in dn_route_input_slow() "
+						 "No output device\n");
+			goto e_inval;
+		}
+		dev_hold(out_dev);
 
-#ifdef CONFIG_DECNET_ROUTE_FWMARK
-	key.fwmark = skb->nfmark;
-#else
-	key.fwmark = 0;
-#endif
+		if (res.r)
+			src_map = dn_fib_rules_policy(fl.fld_src, &res, &flags);
 
-	if ((err = dn_fib_lookup(&key, &res)) == 0) {
-		switch(res.type) {
-			case RTN_UNICAST:
-				if (res.fi->fib_nhs)
-					dn_fib_select_multipath(&key, &res);
-				neigh = __neigh_lookup(&dn_neigh_table, &DN_FIB_RES_GW(res), DN_FIB_RES_DEV(res), 1);
-				err = -ENOBUFS;
-				if (!neigh)
-					break;
-				err = 0;
-				dnrt_input = dn_forward;
-				fwmark = key.fwmark;
-				break;
-			case RTN_UNREACHABLE:
-				dnrt_input = dn_blackhole;
-				fwmark = key.fwmark;
-				break;
-			default:
-				err = -EINVAL;
+		gateway = DN_FIB_RES_GW(res);
+		if (res.type == RTN_NAT) {
+			fl.fld_dst = dn_fib_rules_map_destination(fl.fld_dst, &res);
+			dn_fib_res_put(&res);
+			free_res = 0;
+			if (dn_fib_lookup(&fl, &res))
+				goto e_inval;
+			free_res = 1;
+			if (res.type != RTN_UNICAST)
+				goto e_inval;
+			flags |= RTCF_DNAT;
+			gateway = fl.fld_dst;
 		}
-		dn_fib_res_put(&res);
-		if (err < 0)
-			return err;
-		goto add_entry;
+		fl.fld_src = src_map;
 	}
 
-	return err;
-
-#endif /* CONFIG_DECNET_ROUTER */
-
-add_entry:
+	switch(res.type) {
+	case RTN_UNICAST:
+		/*
+		 * Forwarding check here, we only check for forwarding
+		 * being turned off, if you want to only forward intra
+		 * area, its up to you to set the routing tables up
+		 * correctly.
+		 */
+		if (dn_db->parms.forwarding == 0)
+			goto e_inval;
+
+		if (res.fi->fib_nhs > 1 && fl.oif == 0)
+			dn_fib_select_multipath(&fl, &res);
+
+		/* 
+		 * Check for out_dev == in_dev. We use the RTCF_DOREDIRECT
+		 * flag as a hint to set the intra-ethernet bit when
+		 * forwarding. If we've got NAT in operation, we don't do
+		 * this optimisation.
+		 */
+		if (out_dev == in_dev && !(flags & RTCF_NAT))
+			flags |= RTCF_DOREDIRECT;
+
+	case RTN_BLACKHOLE:
+	case RTN_UNREACHABLE:
+		break;
+	case RTN_LOCAL:
+		flags |= RTCF_LOCAL;
+		fl.fld_src = cb->dst;
+		fl.fld_dst = cb->src;
+
+		/* Routing tables gave us a gateway */
+		if (gateway)
+			goto make_route;
+
+		/* Packet was intra-ethernet, so we know its on-link */
+		if (cb->rt_flags | DN_RT_F_IE) {
+			gateway = cb->src;
+			flags |= RTCF_DIRECTSRC;
+			goto make_route;
+		}
 
-	if ((rt = dst_alloc(&dn_dst_ops)) == NULL) {
-                neigh_release(neigh);
-                return -EINVAL;
-        }
+		/* Use the default router if there is one */
+		neigh = neigh_clone(dn_db->router);
+		if (neigh) {
+			gateway = ((struct dn_neigh *)neigh)->addr;
+			goto make_route;
+		}
 
-	rt->key.saddr  = cb->src;
-	rt->rt_saddr   = saddr;
-	rt->key.daddr  = cb->dst;
-	rt->rt_daddr   = daddr;
-	rt->key.oif    = 0;
-	rt->key.iif    = dev->ifindex;
-	rt->key.fwmark = fwmark;
+		/* Close eyes and pray */
+		gateway = cb->src;
+		flags |= RTCF_DIRECTSRC;
+		goto make_route;
+	default:
+		goto e_inval;
+	}
+
+make_route:
+	rt = dst_alloc(&dn_dst_ops);
+	if (rt == NULL)
+		goto e_nobufs;
+
+	rt->rt_saddr      = fl.fld_src;
+	rt->rt_daddr      = fl.fld_dst;
+	rt->rt_gateway    = fl.fld_dst;
+	if (gateway)
+		rt->rt_gateway = gateway;
+	rt->rt_dst_map    = fl.fld_dst;
+	rt->rt_src_map    = fl.fld_src;
+
+	rt->fl.fld_src    = cb->src;
+	rt->fl.fld_dst    = cb->dst;
+	rt->fl.oif        = 0;
+	rt->fl.iif        = in_dev->ifindex;
+	rt->fl.fld_fwmark = fl.fld_fwmark;
 
+	rt->u.dst.flags = DST_HOST;
 	rt->u.dst.neighbour = neigh;
-	rt->u.dst.dev = neigh ? neigh->dev : NULL;
+	rt->u.dst.dev = out_dev;
+	rt->u.dst.lastuse = jiffies;
+	rt->u.dst.output = dn_rt_bug;
+	switch(res.type) {
+		case RTN_UNICAST:
+			rt->u.dst.input = dn_forward;
+			break;
+		case RTN_LOCAL:
+			rt->u.dst.output = dn_output;
+			rt->u.dst.input = dn_nsp_rx;
+			rt->u.dst.dev = in_dev;
+			flags |= RTCF_LOCAL;
+			break;
+		default:
+		case RTN_UNREACHABLE:
+		case RTN_BLACKHOLE:
+			rt->u.dst.input = dn_blackhole;
+	}
+	rt->rt_flags = flags;
 	if (rt->u.dst.dev)
 		dev_hold(rt->u.dst.dev);
-	rt->u.dst.lastuse = jiffies;
-	rt->u.dst.output = dnrt_output;
-	rt->u.dst.input = dnrt_input;
 
-	hash = dn_hash(rt->key.saddr, rt->key.daddr);
-	dn_insert_route(rt, hash);
-	skb->dst = (struct dst_entry *)rt;
+	if (dn_rt_set_next_hop(rt, &res))
+		goto e_neighbour;
 
-	return 0;
+	hash = dn_hash(rt->fl.fld_src, rt->fl.fld_dst);
+	dn_insert_route(rt, hash, (struct dn_route **)&skb->dst);
+	err = 0;
+
+done:
+	if (neigh)
+		neigh_release(neigh);
+	if (free_res)
+		dn_fib_res_put(&res);
+	dev_put(in_dev);
+	if (out_dev)
+		dev_put(out_dev);
+out:
+	return err;
+
+e_inval:
+	err = -EINVAL;
+	goto done;
+
+e_nobufs:
+	err = -ENOBUFS;
+	goto done;
+
+e_neighbour:
+	dst_free(&rt->u.dst);
+	goto done;
 }
 
 int dn_route_input(struct sk_buff *skb)
@@ -1014,24 +1391,25 @@
 	if (skb->dst)
 		return 0;
 
-	read_lock(&dn_rt_hash_table[hash].lock);
+	rcu_read_lock();
 	for(rt = dn_rt_hash_table[hash].chain; rt != NULL; rt = rt->u.rt_next) {
-		if ((rt->key.saddr == cb->src) &&
-				(rt->key.daddr == cb->dst) &&
-				(rt->key.oif == 0) &&
+		read_barrier_depends();
+		if ((rt->fl.fld_src == cb->src) &&
+	 	    (rt->fl.fld_dst == cb->dst) &&
+		    (rt->fl.oif == 0) &&
 #ifdef CONFIG_DECNET_ROUTE_FWMARK
-				(rt->key.fwmark == skb->nfmark) &&
+		    (rt->fl.fld_fwmark == skb->nfmark) &&
 #endif
-				(rt->key.iif == cb->iif)) {
+		    (rt->fl.iif == cb->iif)) {
 			rt->u.dst.lastuse = jiffies;
 			dst_hold(&rt->u.dst);
 			rt->u.dst.__use++;
-			read_unlock(&dn_rt_hash_table[hash].lock);
+			rcu_read_unlock();
 			skb->dst = (struct dst_entry *)rt;
 			return 0;
 		}
 	}
-	read_unlock(&dn_rt_hash_table[hash].lock);
+	rcu_read_unlock();
 
 	return dn_route_input_slow(skb);
 }
@@ -1042,29 +1420,51 @@
 	struct rtmsg *r;
 	struct nlmsghdr *nlh;
 	unsigned char *b = skb->tail;
+	struct rta_cacheinfo ci;
 
 	nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r));
 	r = NLMSG_DATA(nlh);
-	nlh->nlmsg_flags = nowait ? NLM_F_MULTI : 0;
+	nlh->nlmsg_flags = (nowait && pid) ? NLM_F_MULTI : 0;
 	r->rtm_family = AF_DECnet;
 	r->rtm_dst_len = 16;
-	r->rtm_src_len = 16;
+	r->rtm_src_len = 0;
 	r->rtm_tos = 0;
-	r->rtm_table = 0;
-	r->rtm_type = 0;
-	r->rtm_flags = 0;
+	r->rtm_table = RT_TABLE_MAIN;
+	r->rtm_type = rt->rt_type;
+	r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED;
 	r->rtm_scope = RT_SCOPE_UNIVERSE;
 	r->rtm_protocol = RTPROT_UNSPEC;
+	if (rt->rt_flags & RTCF_NOTIFY)
+		r->rtm_flags |= RTM_F_NOTIFY;
 	RTA_PUT(skb, RTA_DST, 2, &rt->rt_daddr);
-	RTA_PUT(skb, RTA_SRC, 2, &rt->rt_saddr);
+	if (rt->fl.fld_src) {
+		r->rtm_src_len = 16;
+		RTA_PUT(skb, RTA_SRC, 2, &rt->fl.fld_src);
+	}
 	if (rt->u.dst.dev)
 		RTA_PUT(skb, RTA_OIF, sizeof(int), &rt->u.dst.dev->ifindex);
-	if (dst_metric(&rt->u.dst, RTAX_WINDOW))
-		RTA_PUT(skb, RTAX_WINDOW, sizeof(unsigned),
-			&rt->u.dst.metrics[RTAX_WINDOW - 1]);
-	if (dst_metric(&rt->u.dst, RTAX_RTT))
-		RTA_PUT(skb, RTAX_RTT, sizeof(unsigned),
-			&rt->u.dst.metrics[RTAX_RTT]);
+	/*
+	 * Note to self - change this if input routes reverse direction when
+	 * they deal only with inputs and not with replies like they do
+	 * currently.
+	 */
+	RTA_PUT(skb, RTA_PREFSRC, 2, &rt->rt_saddr);
+	if (rt->rt_daddr != rt->rt_gateway)
+		RTA_PUT(skb, RTA_GATEWAY, 2, &rt->rt_gateway);
+	if (rtnetlink_put_metrics(skb, rt->u.dst.metrics) < 0)
+		goto rtattr_failure;
+	ci.rta_lastuse = jiffies - rt->u.dst.lastuse;
+	ci.rta_used     = rt->u.dst.__use;
+	ci.rta_clntref  = atomic_read(&rt->u.dst.__refcnt);
+	if (rt->u.dst.expires)
+		ci.rta_expires = rt->u.dst.expires - jiffies;
+	else
+		ci.rta_expires = 0;
+	ci.rta_error    = rt->u.dst.error;
+	ci.rta_id       = ci.rta_ts = ci.rta_tsage = 0;
+	RTA_PUT(skb, RTA_CACHEINFO, sizeof(ci), &ci);
+	if (rt->fl.iif)
+		RTA_PUT(skb, RTA_IIF, sizeof(int), &rt->fl.iif);
 
 	nlh->nlmsg_len = skb->tail - b;
 	return skb->len;
@@ -1081,13 +1481,14 @@
 int dn_cache_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, void *arg)
 {
 	struct rtattr **rta = arg;
+	struct rtmsg *rtm = NLMSG_DATA(nlh);
 	struct dn_route *rt = NULL;
 	struct dn_skb_cb *cb;
-	dn_address dst = 0;
-	dn_address src = 0;
-	int iif = 0;
 	int err;
 	struct sk_buff *skb;
+	struct flowi fl;
+
+	memset(&fl, 0, sizeof(fl));
 
 	skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
 	if (skb == NULL)
@@ -1096,15 +1497,15 @@
 	cb = DN_SKB_CB(skb);
 
 	if (rta[RTA_SRC-1])
-		memcpy(&src, RTA_DATA(rta[RTA_SRC-1]), 2);
+		memcpy(&fl.fld_src, RTA_DATA(rta[RTA_SRC-1]), 2);
 	if (rta[RTA_DST-1])
-		memcpy(&dst, RTA_DATA(rta[RTA_DST-1]), 2);
+		memcpy(&fl.fld_dst, RTA_DATA(rta[RTA_DST-1]), 2);
 	if (rta[RTA_IIF-1])
-		memcpy(&iif, RTA_DATA(rta[RTA_IIF-1]), sizeof(int));
+		memcpy(&fl.iif, RTA_DATA(rta[RTA_IIF-1]), sizeof(int));
 
-	if (iif) {
+	if (fl.iif) {
 		struct net_device *dev;
-		if ((dev = dev_get_by_index(iif)) == NULL) {
+		if ((dev = dev_get_by_index(fl.iif)) == NULL) {
 			kfree_skb(skb);
 			return -ENODEV;
 		}
@@ -1115,25 +1516,31 @@
 		}
 		skb->protocol = __constant_htons(ETH_P_DNA_RT);
 		skb->dev = dev;
-		cb->src = src;
-		cb->dst = dst;
+		cb->src = fl.fld_src;
+		cb->dst = fl.fld_dst;
 		local_bh_disable();
 		err = dn_route_input(skb);
 		local_bh_enable();
 		memset(cb, 0, sizeof(struct dn_skb_cb));
 		rt = (struct dn_route *)skb->dst;
+		if (!err && -rt->u.dst.error)
+			err = rt->u.dst.error;
 	} else {
-		err = dn_route_output((struct dst_entry **)&rt, dst, src, 0);
+		int oif = 0;
+		if (rta[RTA_OIF - 1])
+			memcpy(&oif, RTA_DATA(rta[RTA_OIF - 1]), sizeof(int));
+		fl.oif = oif;
+		err = dn_route_output_key((struct dst_entry **)&rt, &fl, 0);
 	}
 
-	if (!err && rt->u.dst.error)
-		err = rt->u.dst.error;
 	if (skb->dev)
 		dev_put(skb->dev);
 	skb->dev = NULL;
 	if (err)
 		goto out_free;
 	skb->dst = &rt->u.dst;
+	if (rtm->rtm_flags & RTM_F_NOTIFY)
+		rt->rt_flags |= RTCF_NOTIFY;
 
 	NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid;
 
@@ -1177,20 +1584,21 @@
 			continue;
 		if (h > s_h)
 			s_idx = 0;
-		read_lock_bh(&dn_rt_hash_table[h].lock);
+		rcu_read_lock();
 		for(rt = dn_rt_hash_table[h].chain, idx = 0; rt; rt = rt->u.rt_next, idx++) {
+			read_barrier_depends();
 			if (idx < s_idx)
 				continue;
 			skb->dst = dst_clone(&rt->u.dst);
 			if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid,
 					cb->nlh->nlmsg_seq, RTM_NEWROUTE, 1) <= 0) {
 				dst_release(xchg(&skb->dst, NULL));
-				read_unlock_bh(&dn_rt_hash_table[h].lock);
+				rcu_read_unlock();
 				goto done;
 			}
 			dst_release(xchg(&skb->dst, NULL));
 		}
-		read_unlock_bh(&dn_rt_hash_table[h].lock);
+		rcu_read_unlock();
 	}
 
 done:
@@ -1211,9 +1619,10 @@
 	char buf1[DN_ASCBUF_LEN], buf2[DN_ASCBUF_LEN];
 
 	for(i = 0; i <= dn_rt_hash_mask; i++) {
-		read_lock_bh(&dn_rt_hash_table[i].lock);
+		rcu_read_lock();
 		rt = dn_rt_hash_table[i].chain;
 		for(; rt != NULL; rt = rt->u.rt_next) {
+			read_barrier_depends();
 			len += sprintf(buffer + len, "%-8s %-7s %-7s %04d %04d %04d\n",
 					rt->u.dst.dev ? rt->u.dst.dev->name : "*",
 					dn_addr2asc(dn_ntohs(rt->rt_daddr), buf1),
@@ -1234,7 +1643,7 @@
               		if (pos > offset + length)
                 	        break;
 		}
-		read_unlock_bh(&dn_rt_hash_table[i].lock);
+		rcu_read_unlock();
 		if (pos > offset + length)
 			break;
 	}
@@ -1298,7 +1707,7 @@
 
 	dn_rt_hash_mask--;
         for(i = 0; i <= dn_rt_hash_mask; i++) {
-                dn_rt_hash_table[i].lock = RW_LOCK_UNLOCKED;
+                dn_rt_hash_table[i].lock = SPIN_LOCK_UNLOCKED;
                 dn_rt_hash_table[i].chain = NULL;
         }
 
diff -Nru a/net/decnet/dn_rules.c b/net/decnet/dn_rules.c
--- a/net/decnet/dn_rules.c	Sat Apr 19 19:51:49 2003
+++ b/net/decnet/dn_rules.c	Sat Apr 19 19:51:49 2003
@@ -26,10 +26,12 @@
 #include <linux/netdevice.h>
 #include <linux/timer.h>
 #include <linux/spinlock.h>
+#include <linux/in_route.h>
 #include <asm/atomic.h>
 #include <asm/uaccess.h>
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 #include <net/dn.h>
 #include <net/dn_fib.h>
 #include <net/dn_neigh.h>
@@ -48,6 +50,7 @@
 	dn_address		r_srcmask;
 	dn_address		r_dst;
 	dn_address		r_dstmask;
+	dn_address		r_srcmap;
 	u8			r_flags;
 #ifdef CONFIG_DECNET_ROUTE_FWMARK
 	u32			r_fwmark;
@@ -60,7 +63,7 @@
 static struct dn_fib_rule default_rule = {
 	.r_clntref =		ATOMIC_INIT(2),
 	.r_preference =		0x7fff,
-	.r_table =		DN_DEFAULT_TABLE,
+	.r_table =		RT_TABLE_MAIN,
 	.r_action =		RTN_UNICAST
 };
 
@@ -150,6 +153,8 @@
 		memcpy(&new_r->r_src, RTA_DATA(rta[RTA_SRC-1]), 2);
 	if (rta[RTA_DST-1])
 		memcpy(&new_r->r_dst, RTA_DATA(rta[RTA_DST-1]), 2);
+	if (rta[RTA_GATEWAY-1])
+		memcpy(&new_r->r_srcmap, RTA_DATA(rta[RTA_GATEWAY-1]), 2);
 	new_r->r_src_len = rtm->rtm_src_len;
 	new_r->r_dst_len = rtm->rtm_dst_len;
 	new_r->r_srcmask = dnet_make_mask(rtm->rtm_src_len);
@@ -198,12 +203,12 @@
 }
 
 
-int dn_fib_lookup(struct dn_fib_key *key, struct dn_fib_res *res)
+int dn_fib_lookup(const struct flowi *flp, struct dn_fib_res *res)
 {
 	struct dn_fib_rule *r, *policy;
 	struct dn_fib_table *tb;
-	dn_address saddr = key->src;
-	dn_address daddr = key->dst;
+	dn_address saddr = flp->fld_src;
+	dn_address daddr = flp->fld_dst;
 	int err;
 
 	read_lock(&dn_fib_rules_lock);
@@ -211,13 +216,14 @@
 		if (((saddr^r->r_src) & r->r_srcmask) ||
 		    ((daddr^r->r_dst) & r->r_dstmask) ||
 #ifdef CONFIG_DECNET_ROUTE_FWMARK
-		    (r->r_fwmark && r->r_fwmark != key->fwmark) ||
+		    (r->r_fwmark && r->r_fwmark != flp->fld_fwmark) ||
 #endif
-		    (r->r_ifindex && r->r_ifindex != key->iif))
+		    (r->r_ifindex && r->r_ifindex != flp->iif))
 			continue;
 
 		switch(r->r_action) {
 			case RTN_UNICAST:
+			case RTN_NAT:
 				policy = r;
 				break;
 			case RTN_UNREACHABLE:
@@ -234,7 +240,7 @@
 
 		if ((tb = dn_fib_get_table(r->r_table, 0)) == NULL)
 			continue;
-		err = tb->lookup(tb, key, res);
+		err = tb->lookup(tb, flp, res);
 		if (err == 0) {
 			res->r = policy;
 			if (policy)
@@ -252,6 +258,42 @@
 	return -ESRCH;
 }
 
+unsigned dnet_addr_type(__u16 addr)
+{
+	struct flowi fl = { .nl_u = { .dn_u = { .daddr = addr } } };
+	struct dn_fib_res res;
+	unsigned ret = RTN_UNICAST;
+	struct dn_fib_table *tb = dn_fib_tables[RT_TABLE_LOCAL];
+
+	res.r = NULL;
+
+	if (tb) {
+		if (!tb->lookup(tb, &fl, &res)) {
+			ret = res.type;
+			dn_fib_res_put(&res);
+		}
+	}
+	return ret;
+}
+
+__u16 dn_fib_rules_policy(__u16 saddr, struct dn_fib_res *res, unsigned *flags)
+{
+	struct dn_fib_rule *r = res->r;
+
+	if (r->r_action == RTN_NAT) {
+		int addrtype = dnet_addr_type(r->r_srcmap);
+
+		if (addrtype == RTN_NAT) {
+			saddr = (saddr&~r->r_srcmask)|r->r_srcmap;
+			*flags |= RTCF_SNAT;
+		} else if (addrtype == RTN_LOCAL || r->r_srcmap == 0) {
+			saddr = r->r_srcmap;
+			*flags |= RTCF_MASQ;
+		}
+	}
+	return saddr;
+}
+
 static void dn_fib_rules_detach(struct net_device *dev)
 {
 	struct dn_fib_rule *r;
@@ -330,6 +372,8 @@
 		RTA_PUT(skb, RTA_IIF, IFNAMSIZ, &r->r_ifname);
 	if (r->r_preference)
 		RTA_PUT(skb, RTA_PRIORITY, 4, &r->r_preference);
+	if (r->r_srcmap)
+		RTA_PUT(skb, RTA_GATEWAY, 2, &r->r_srcmap);
 	nlh->nlmsg_len = skb->tail - b;
 	return skb->len;
 
diff -Nru a/net/decnet/dn_table.c b/net/decnet/dn_table.c
--- a/net/decnet/dn_table.c	Sat Apr 19 19:51:29 2003
+++ b/net/decnet/dn_table.c	Sat Apr 19 19:51:29 2003
@@ -30,6 +30,7 @@
 #include <linux/route.h> /* RTF_xxx */
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 #include <net/dn.h>
 #include <net/dn_route.h>
 #include <net/dn_fib.h>
@@ -45,7 +46,7 @@
 	u32			dz_hashmask;
 #define DZ_HASHMASK(dz)	((dz)->dz_hashmask)
 	int			dz_order;
-	u32			dz_mask;
+	u16			dz_mask;
 #define DZ_MASK(dz)	((dz)->dz_mask)
 };
 
@@ -73,53 +74,53 @@
 #define DN_FIB_SCAN_KEY(f, fp, key) \
 for( ; ((f) = *(fp)) != NULL && dn_key_eq((f)->fn_key, (key)); (fp) = &(f)->fn_next)
 
+#define RT_TABLE_MIN 1
 
 static rwlock_t dn_fib_tables_lock = RW_LOCK_UNLOCKED;
-static struct dn_fib_table *dn_fib_tables[DN_NUM_TABLES + 1];
+struct dn_fib_table *dn_fib_tables[RT_TABLE_MAX + 1];
 
 static kmem_cache_t *dn_hash_kmem;
 static int dn_fib_hash_zombies;
 
-static __inline__ dn_fib_idx_t dn_hash(dn_fib_key_t key, struct dn_zone *dz)
+static inline dn_fib_idx_t dn_hash(dn_fib_key_t key, struct dn_zone *dz)
 {
-	u32 h = ntohs(key.datum)>>(16 - dz->dz_order);
+	u16 h = ntohs(key.datum)>>(16 - dz->dz_order);
 	h ^= (h >> 10);
 	h ^= (h >> 6);
-	h ^= (h >> 3);
 	h &= DZ_HASHMASK(dz);
 	return *(dn_fib_idx_t *)&h;
 }
 
-static __inline__ dn_fib_key_t dz_key(u16 dst, struct dn_zone *dz)
+static inline dn_fib_key_t dz_key(u16 dst, struct dn_zone *dz)
 {
 	dn_fib_key_t k;
 	k.datum = dst & DZ_MASK(dz);
 	return k;
 }
 
-static __inline__ struct dn_fib_node **dn_chain_p(dn_fib_key_t key, struct dn_zone *dz)
+static inline struct dn_fib_node **dn_chain_p(dn_fib_key_t key, struct dn_zone *dz)
 {
 	return &dz->dz_hash[dn_hash(key, dz).datum];
 }
 
-static __inline__ struct dn_fib_node *dz_chain(dn_fib_key_t key, struct dn_zone *dz)
+static inline struct dn_fib_node *dz_chain(dn_fib_key_t key, struct dn_zone *dz)
 {
 	return dz->dz_hash[dn_hash(key, dz).datum];
 }
 
-static __inline__ int dn_key_eq(dn_fib_key_t a, dn_fib_key_t b)
+static inline int dn_key_eq(dn_fib_key_t a, dn_fib_key_t b)
 {
 	return a.datum == b.datum;
 }
 
-static __inline__ int dn_key_leq(dn_fib_key_t a, dn_fib_key_t b)
+static inline int dn_key_leq(dn_fib_key_t a, dn_fib_key_t b)
 {
 	return a.datum <= b.datum;
 }
 
-static __inline__ void dn_rebuild_zone(struct dn_zone *dz,
-					struct dn_fib_node **old_ht,
-					int old_divisor)
+static inline void dn_rebuild_zone(struct dn_zone *dz,
+				   struct dn_fib_node **old_ht,
+				   int old_divisor)
 {
 	int i;
 	struct dn_fib_node *f, **fp, *next;
@@ -290,6 +291,8 @@
         rtm->rtm_protocol = fi->fib_protocol;
         if (fi->fib_priority)
                 RTA_PUT(skb, RTA_PRIORITY, 4, &fi->fib_priority);
+	if (rtnetlink_put_metrics(skb, fi->fib_metrics) < 0)
+		goto rtattr_failure;
         if (fi->fib_nhs == 1) {
                 if (fi->fib_nh->nh_gw)
                         RTA_PUT(skb, RTA_GATEWAY, 2, &fi->fib_nh->nh_gw);
@@ -654,7 +657,7 @@
         return -ESRCH;
 }
 
-static __inline__ int dn_flush_list(struct dn_fib_node **fp, int z, struct dn_hash *table)
+static inline int dn_flush_list(struct dn_fib_node **fp, int z, struct dn_hash *table)
 {
 	int found = 0;
 	struct dn_fib_node *f;
@@ -696,8 +699,7 @@
 	return found;
 }
 
-static int dn_fib_table_lookup(struct dn_fib_table *tb, const struct dn_fib_key *
-key, struct dn_fib_res *res)
+static int dn_fib_table_lookup(struct dn_fib_table *tb, const struct flowi *flp, struct dn_fib_res *res)
 {
         int err;
 	struct dn_zone *dz;
@@ -706,25 +708,29 @@
 	read_lock(&dn_fib_tables_lock);
 	for(dz = t->dh_zone_list; dz; dz = dz->dz_next) {
 		struct dn_fib_node *f;
-		dn_fib_key_t k = dz_key(key->dst, dz);
+		dn_fib_key_t k = dz_key(flp->fld_dst, dz);
 
 		for(f = dz_chain(k, dz); f; f = f->fn_next) {
-			if (!dn_key_leq(k, f->fn_key))
-				break;
-			else
-				continue;
+			if (!dn_key_eq(k, f->fn_key)) {
+				if (dn_key_leq(k, f->fn_key))
+					break;
+				else
+					continue;
+			}
 
 			f->fn_state |= DN_S_ACCESSED;
 
 			if (f->fn_state&DN_S_ZOMBIE)
 				continue;
-			if (f->fn_scope < key->scope)
+
+			if (f->fn_scope < flp->fld_scope)
 				continue;
 
-			err = dn_fib_semantic_match(f->fn_type, DN_FIB_INFO(f), key, res);
+			err = dn_fib_semantic_match(f->fn_type, DN_FIB_INFO(f), flp, res);
+
 			if (err == 0) {
 				res->type = f->fn_type;
-				res->scope = f->fn_scope;
+				res->scope = f->fn_scope; 
 				res->prefixlen = dz->dz_order;
 				goto out;
 			}
@@ -763,7 +769,7 @@
 
 	if (fi) {
 		len = sprintf(buffer, "%s\t%04x\t%04x\t%04x\t%d\t%u\t%d\t%04x\t%d\t%u\t%u",
-				fi->fib_dev ? fi->fib_dev->name : "*", prefix,
+				fi->dn_fib_dev ? fi->dn_fib_dev->name : "*", prefix,
 				fi->fib_nh->nh_gw, flags, 0, 0, fi->fib_priority,
 				mask, 0, 0, 0);
 	} else {
@@ -823,10 +829,10 @@
 {
         struct dn_fib_table *t;
 
-        if (n < DN_MIN_TABLE)
+        if (n < RT_TABLE_MIN)
                 return NULL;
 
-        if (n > DN_NUM_TABLES)
+        if (n > RT_TABLE_MAX)
                 return NULL;
 
         if (dn_fib_tables[n]) 
@@ -839,7 +845,7 @@
                 printk(KERN_DEBUG "DECnet: BUG! Attempt to create routing table from interrupt\n"); 
                 return NULL;
         }
-        if ((t = kmalloc(sizeof(struct dn_fib_table), GFP_KERNEL)) == NULL)
+        if ((t = kmalloc(sizeof(struct dn_fib_table) + sizeof(struct dn_hash), GFP_KERNEL)) == NULL)
                 return NULL;
 
         memset(t, 0, sizeof(struct dn_fib_table));
@@ -853,6 +859,7 @@
 	t->get_info = dn_fib_table_get_info;
 #endif
         t->dump = dn_fib_table_dump;
+	memset(t->data, 0, sizeof(struct dn_hash));
         dn_fib_tables[n] = t;
 
         return t;
@@ -876,7 +883,7 @@
 {
         int id;
 
-        for(id = DN_MIN_TABLE; id <= DN_NUM_TABLES; id++)
+        for(id = RT_TABLE_MIN; id <= RT_TABLE_MAX; id++)
                 if (dn_fib_tables[id] == NULL)
                         return dn_fib_get_table(id, 1);
         return NULL;
@@ -894,7 +901,7 @@
 {
 	int i;
 
-	for (i = 0; i < DN_NUM_TABLES + 1; ++i)
+	for (i = RT_TABLE_MIN; i <= RT_TABLE_MAX; ++i)
 		dn_fib_del_tree(i);
 
 	return;
diff -Nru a/net/decnet/dn_timer.c b/net/decnet/dn_timer.c
--- a/net/decnet/dn_timer.c	Sat Apr 19 19:51:48 2003
+++ b/net/decnet/dn_timer.c	Sat Apr 19 19:51:48 2003
@@ -23,6 +23,7 @@
 #include <linux/spinlock.h>
 #include <net/sock.h>
 #include <asm/atomic.h>
+#include <net/flow.h>
 #include <net/dn.h>
 
 /*
diff -Nru a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c
--- a/net/decnet/sysctl_net_decnet.c	Sat Apr 19 19:51:29 2003
+++ b/net/decnet/sysctl_net_decnet.c	Sat Apr 19 19:51:29 2003
@@ -20,6 +20,7 @@
 #include <linux/string.h>
 #include <net/neighbour.h>
 #include <net/dst.h>
+#include <net/flow.h>
 
 #include <asm/uaccess.h>
 
diff -Nru a/net/ipv4/Kconfig b/net/ipv4/Kconfig
--- a/net/ipv4/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/Kconfig	Sat Apr 19 19:51:50 2003
@@ -362,5 +362,13 @@
 
 	  If unsure, say Y.
 
+config INET_IPCOMP
+	tristate "IP: IPComp transformation"
+	---help---
+	  Support for IP Paylod Compression (RFC3173), typically needed
+	  for IPsec.
+	  
+	  If unsure, say Y.
+
 source "net/ipv4/netfilter/Kconfig"
 
diff -Nru a/net/ipv4/Makefile b/net/ipv4/Makefile
--- a/net/ipv4/Makefile	Sat Apr 19 19:51:29 2003
+++ b/net/ipv4/Makefile	Sat Apr 19 19:51:29 2003
@@ -18,7 +18,8 @@
 obj-$(CONFIG_SYN_COOKIES) += syncookies.o
 obj-$(CONFIG_INET_AH) += ah.o
 obj-$(CONFIG_INET_ESP) += esp.o
+obj-$(CONFIG_INET_IPCOMP) += ipcomp.o
 obj-$(CONFIG_IP_PNP) += ipconfig.o
 obj-$(CONFIG_NETFILTER)	+= netfilter/
 
-obj-y += xfrm4_policy.o xfrm4_state.o xfrm4_input.o
+obj-y += xfrm4_policy.o xfrm4_state.o xfrm4_input.o xfrm4_tunnel.o
diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
--- a/net/ipv4/af_inet.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv4/af_inet.c	Sat Apr 19 19:51:28 2003
@@ -1108,6 +1108,8 @@
 		}
 	}
 
+	(void) tcp_mib_init();
+
 	return 0;
 }
 
diff -Nru a/net/ipv4/ah.c b/net/ipv4/ah.c
--- a/net/ipv4/ah.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/ah.c	Sat Apr 19 19:51:50 2003
@@ -314,12 +314,14 @@
 		crypto_free_tfm(ahp->tfm);
 		ahp->tfm = NULL;
 	}
+	kfree(ahp);
 }
 
 
 static struct xfrm_type ah_type =
 {
 	.description	= "AH4",
+	.owner		= THIS_MODULE,
 	.proto	     	= IPPROTO_AH,
 	.init_state	= ah_init_state,
 	.destructor	= ah_destroy,
@@ -335,7 +337,6 @@
 
 static int __init ah4_init(void)
 {
-	SET_MODULE_OWNER(&ah_type);
 	if (xfrm_register_type(&ah_type, AF_INET) < 0) {
 		printk(KERN_INFO "ip ah init: can't add xfrm type\n");
 		return -EAGAIN;
diff -Nru a/net/ipv4/esp.c b/net/ipv4/esp.c
--- a/net/ipv4/esp.c	Sat Apr 19 19:51:48 2003
+++ b/net/ipv4/esp.c	Sat Apr 19 19:51:48 2003
@@ -452,6 +452,7 @@
 		kfree(esp->auth.work_icv);
 		esp->auth.work_icv = NULL;
 	}
+	kfree(esp);
 }
 
 int esp_init_state(struct xfrm_state *x, void *args)
@@ -552,6 +553,7 @@
 static struct xfrm_type esp_type =
 {
 	.description	= "ESP4",
+	.owner		= THIS_MODULE,
 	.proto	     	= IPPROTO_ESP,
 	.init_state	= esp_init_state,
 	.destructor	= esp_destroy,
diff -Nru a/net/ipv4/igmp.c b/net/ipv4/igmp.c
--- a/net/ipv4/igmp.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/igmp.c	Sat Apr 19 19:51:51 2003
@@ -68,6 +68,8 @@
  *		Alan Cox:		Forget to enable FDDI support earlier.
  *		Alexey Kuznetsov:	Fixed leaving groups on device down.
  *		Alexey Kuznetsov:	Accordance to igmp-v2-06 draft.
+ *		David L Stevens:	IGMPv3 support, with help from
+ *					Vinay Kulkarni
  */
 
 
@@ -101,12 +103,10 @@
 
 #define IP_MAX_MEMBERSHIPS 20
 
-#ifdef CONFIG_IP_MULTICAST
-
-
 /* Parameter names and values are taken from igmp-v2-06 draft */
 
 #define IGMP_V1_Router_Present_Timeout		(400*HZ)
+#define IGMP_V2_Router_Present_Timeout		(400*HZ)
 #define IGMP_Unsolicited_Report_Interval	(10*HZ)
 #define IGMP_Query_Response_Interval		(10*HZ)
 #define IGMP_Unsolicited_Report_Count		2
@@ -121,9 +121,21 @@
  * contradict to specs provided this delay is small enough.
  */
 
-#define IGMP_V1_SEEN(in_dev) ((in_dev)->mr_v1_seen && (long)(jiffies - (in_dev)->mr_v1_seen) < 0)
+#define IGMP_V1_SEEN(in_dev) ((in_dev)->mr_v1_seen && \
+		time_before(jiffies, (in_dev)->mr_v1_seen))
+#define IGMP_V2_SEEN(in_dev) ((in_dev)->mr_v2_seen && \
+		time_before(jiffies, (in_dev)->mr_v2_seen))
 
+#ifdef CONFIG_MULTICAST
+static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im);
 #endif
+static void igmpv3_del_delrec(struct in_device *in_dev, __u32 multiaddr);
+static void igmpv3_clear_delrec(struct in_device *in_dev);
+static int sf_setstate(struct ip_mc_list *pmc);
+static void sf_markstate(struct ip_mc_list *pmc);
+static void ip_mc_clear_src(struct ip_mc_list *pmc);
+int ip_mc_add_src(struct in_device *in_dev, __u32 *pmca, int sfmode,
+	int sfcount, __u32 *psfsrc, int delta);
 
 static void ip_ma_put(struct ip_mc_list *im)
 {
@@ -160,6 +172,23 @@
 		atomic_inc(&im->refcnt);
 }
 
+static void igmp_gq_start_timer(struct in_device *in_dev)
+{
+	int tv = net_random() % in_dev->mr_maxdelay;
+
+	in_dev->mr_gq_running = 1;
+	if (!mod_timer(&in_dev->mr_gq_timer, jiffies+tv+2))
+		atomic_inc(&in_dev->refcnt);
+}
+
+static void igmp_ifc_start_timer(struct in_device *in_dev, int delay)
+{
+	int tv = net_random() % delay;
+
+	if (!mod_timer(&in_dev->mr_ifc_timer, jiffies+tv+2))
+		atomic_inc(&in_dev->refcnt);
+}
+
 static void igmp_mod_timer(struct ip_mc_list *im, int max_delay)
 {
 	spin_lock_bh(&im->lock);
@@ -184,20 +213,396 @@
 
 #define IGMP_SIZE (sizeof(struct igmphdr)+sizeof(struct iphdr)+4)
 
-static int igmp_send_report(struct net_device *dev, u32 group, int type)
+
+static int is_in(struct ip_mc_list *pmc, struct ip_sf_list *psf, int type,
+	int gdeleted, int sdeleted)
+{
+	switch (type) {
+	case IGMPV3_MODE_IS_INCLUDE:
+	case IGMPV3_MODE_IS_EXCLUDE:
+		if (gdeleted || sdeleted)
+			return 0;
+		return !(pmc->gsquery && !psf->sf_gsresp);
+	case IGMPV3_CHANGE_TO_INCLUDE:
+		if (gdeleted || sdeleted)
+			return 0;
+		return psf->sf_count[MCAST_INCLUDE] != 0;
+	case IGMPV3_CHANGE_TO_EXCLUDE:
+		if (gdeleted || sdeleted)
+			return 0;
+		if (pmc->sfcount[MCAST_EXCLUDE] == 0 ||
+		    psf->sf_count[MCAST_INCLUDE])
+			return 0;
+		return pmc->sfcount[MCAST_EXCLUDE] ==
+			psf->sf_count[MCAST_EXCLUDE];
+	case IGMPV3_ALLOW_NEW_SOURCES:
+		if (gdeleted || !psf->sf_crcount)
+			return 0;
+		return (pmc->sfmode == MCAST_INCLUDE) ^ sdeleted;
+	case IGMPV3_BLOCK_OLD_SOURCES:
+		if (pmc->sfmode == MCAST_INCLUDE)
+			return gdeleted || (psf->sf_crcount && sdeleted);
+		return psf->sf_crcount && !gdeleted && !sdeleted;
+	}
+	return 0;
+}
+
+static int
+igmp_scount(struct ip_mc_list *pmc, int type, int gdeleted, int sdeleted)
+{
+	struct ip_sf_list *psf;
+	int scount = 0;
+
+	for (psf=pmc->sources; psf; psf=psf->sf_next) {
+		if (!is_in(pmc, psf, type, gdeleted, sdeleted))
+			continue;
+		scount++;
+	}
+	return scount;
+}
+
+static struct sk_buff *igmpv3_newpack(struct net_device *dev, int size)
+{
+	struct sk_buff *skb;
+	struct rtable *rt;
+	struct iphdr *pip;
+	struct igmpv3_report *pig;
+
+	skb = alloc_skb(size + dev->hard_header_len + 15, GFP_ATOMIC);
+	if (skb == NULL)
+		return 0;
+
+	{
+		struct flowi fl = { .oif = dev->ifindex,
+				    .nl_u = { .ip4_u = {
+				    .daddr = IGMPV3_ALL_MCR } },
+				    .proto = IPPROTO_IGMP };
+		if (ip_route_output_key(&rt, &fl))
+			return 0;
+	}
+	if (rt->rt_src == 0) {
+		ip_rt_put(rt);
+		return 0;
+	}
+
+	skb->dst = &rt->u.dst;
+	skb->dev = dev;
+
+	skb_reserve(skb, (dev->hard_header_len+15)&~15);
+
+	skb->nh.iph = pip =(struct iphdr *)skb_put(skb, sizeof(struct iphdr)+4);
+
+	pip->version  = 4;
+	pip->ihl      = (sizeof(struct iphdr)+4)>>2;
+	pip->tos      = 0xc0;
+	pip->frag_off = htons(IP_DF);
+	pip->ttl      = 1;
+	pip->daddr    = rt->rt_dst;
+	pip->saddr    = rt->rt_src;
+	pip->protocol = IPPROTO_IGMP;
+	pip->tot_len  = 0;	/* filled in later */
+	ip_select_ident(pip, &rt->u.dst, NULL);
+	((u8*)&pip[1])[0] = IPOPT_RA;
+	((u8*)&pip[1])[1] = 4;
+	((u8*)&pip[1])[2] = 0;
+	((u8*)&pip[1])[3] = 0;
+
+	pig =(struct igmpv3_report *)skb_put(skb, sizeof(*pig));
+	skb->h.igmph = (struct igmphdr *)pig;
+	pig->type = IGMPV3_HOST_MEMBERSHIP_REPORT;
+	pig->resv1 = 0;
+	pig->csum = 0;
+	pig->resv2 = 0;
+	pig->ngrec = 0;
+	return skb;
+}
+
+static int igmpv3_sendpack(struct sk_buff *skb)
+{
+	struct iphdr *pip = skb->nh.iph;
+	struct igmphdr *pig = skb->h.igmph;
+	int iplen, igmplen;
+
+	iplen = skb->tail - (unsigned char *)skb->nh.iph;
+	pip->tot_len = htons(iplen);
+	ip_send_check(pip);
+
+	igmplen = skb->tail - (unsigned char *)skb->h.igmph;
+	pig->csum = ip_compute_csum((void *)skb->h.igmph, igmplen);
+
+	return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, skb->dev,
+		       dst_output);
+}
+
+static int grec_size(struct ip_mc_list *pmc, int type, int gdel, int sdel)
+{
+	return sizeof(struct igmpv3_grec) + 4*igmp_scount(pmc,type,gdel,sdel);
+}
+
+static struct sk_buff *add_grhead(struct sk_buff *skb, struct ip_mc_list *pmc,
+	int type, struct igmpv3_grec **ppgr)
+{
+	struct net_device *dev = pmc->interface->dev;
+	struct igmpv3_report *pih;
+	struct igmpv3_grec *pgr;
+
+	if (!skb)
+		skb = igmpv3_newpack(dev, dev->mtu);
+	if (!skb)
+		return 0;
+	pgr = (struct igmpv3_grec *)skb_put(skb, sizeof(struct igmpv3_grec));
+	pgr->grec_type = type;
+	pgr->grec_auxwords = 0;
+	pgr->grec_nsrcs = 0;
+	pgr->grec_mca = pmc->multiaddr;
+	pih = (struct igmpv3_report *)skb->h.igmph;
+	pih->ngrec = htons(ntohs(pih->ngrec)+1);
+	*ppgr = pgr;
+	return skb;
+}
+
+#define AVAILABLE(skb) ((skb) ? ((skb)->dev ? (skb)->dev->mtu - (skb)->len : \
+	skb_tailroom(skb)) : 0)
+
+static struct sk_buff *add_grec(struct sk_buff *skb, struct ip_mc_list *pmc,
+	int type, int gdeleted, int sdeleted)
+{
+	struct net_device *dev = pmc->interface->dev;
+	struct igmpv3_report *pih;
+	struct igmpv3_grec *pgr = 0;
+	struct ip_sf_list *psf, *psf_next, *psf_prev, *psf_list;
+	int scount, first, isquery, truncate;
+
+	if (pmc->multiaddr == IGMP_ALL_HOSTS)
+		return skb;
+
+	isquery = type == IGMPV3_MODE_IS_INCLUDE ||
+		  type == IGMPV3_MODE_IS_EXCLUDE;
+	truncate = type == IGMPV3_MODE_IS_EXCLUDE ||
+		    type == IGMPV3_CHANGE_TO_EXCLUDE;
+
+	psf_list = sdeleted ? pmc->tomb : pmc->sources;
+
+	if (!psf_list) {
+		if (type == IGMPV3_ALLOW_NEW_SOURCES ||
+		    type == IGMPV3_BLOCK_OLD_SOURCES)
+			return skb;
+		if (pmc->crcount || isquery)
+			skb = add_grhead(skb, pmc, type, &pgr);
+		return skb;
+	}
+	pih = skb ? (struct igmpv3_report *)skb->h.igmph : 0;
+
+	/* EX and TO_EX get a fresh packet, if needed */
+	if (truncate) {
+		if (pih && pih->ngrec &&
+		    AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
+			if (skb)
+				igmpv3_sendpack(skb);
+			skb = igmpv3_newpack(dev, dev->mtu);
+		}
+	}
+	first = 1;
+	scount = 0;
+	psf_prev = 0;
+	for (psf=psf_list; psf; psf=psf_next) {
+		u32 *psrc;
+
+		psf_next = psf->sf_next;
+
+		if (!is_in(pmc, psf, type, gdeleted, sdeleted)) {
+			psf_prev = psf;
+			continue;
+		}
+
+		/* clear marks on query responses */
+		if (isquery)
+			psf->sf_gsresp = 0;
+
+		if (AVAILABLE(skb) < sizeof(u32) +
+		    first*sizeof(struct igmpv3_grec)) {
+			if (truncate && !first)
+				break;	 /* truncate these */
+			if (pgr)
+				pgr->grec_nsrcs = htons(scount);
+			if (skb)
+				igmpv3_sendpack(skb);
+			skb = igmpv3_newpack(dev, dev->mtu);
+			first = 1;
+			scount = 0;
+		}
+		if (first) {
+			skb = add_grhead(skb, pmc, type, &pgr);
+			first = 0;
+		}
+		psrc = (u32 *)skb_put(skb, sizeof(u32));
+		*psrc = psf->sf_inaddr;
+		scount++;
+		if ((type == IGMPV3_ALLOW_NEW_SOURCES ||
+		     type == IGMPV3_BLOCK_OLD_SOURCES) && psf->sf_crcount) {
+			psf->sf_crcount--;
+			if ((sdeleted || gdeleted) && psf->sf_crcount == 0) {
+				if (psf_prev)
+					psf_prev->sf_next = psf->sf_next;
+				else
+					pmc->tomb = psf->sf_next;
+				kfree(psf);
+				continue;
+			}
+		}
+		psf_prev = psf;
+	}
+	if (pgr)
+		pgr->grec_nsrcs = htons(scount);
+
+	if (isquery)
+		pmc->gsquery = 0;	/* clear query state on report */
+	return skb;
+}
+
+static int igmpv3_send_report(struct in_device *in_dev, struct ip_mc_list *pmc)
+{
+	struct sk_buff *skb = 0;
+	int type;
+
+	if (!pmc) {
+		read_lock(&in_dev->lock);
+		for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
+			if (pmc->multiaddr == IGMP_ALL_HOSTS)
+				continue;
+			spin_lock_bh(&pmc->lock);
+			if (pmc->sfcount[MCAST_EXCLUDE])
+				type = IGMPV3_MODE_IS_EXCLUDE;
+			else
+				type = IGMPV3_MODE_IS_INCLUDE;
+			skb = add_grec(skb, pmc, type, 0, 0);
+			spin_unlock_bh(&pmc->lock);
+		}
+		read_unlock(&in_dev->lock);
+	} else {
+		spin_lock_bh(&pmc->lock);
+		if (pmc->sfcount[MCAST_EXCLUDE])
+			type = IGMPV3_MODE_IS_EXCLUDE;
+		else
+			type = IGMPV3_MODE_IS_INCLUDE;
+		skb = add_grec(skb, pmc, type, 0, 0);
+		spin_unlock_bh(&pmc->lock);
+	}
+	if (!skb)
+		return 0;
+	return igmpv3_sendpack(skb);
+}
+
+/*
+ * remove zero-count source records from a source filter list
+ */
+static void igmpv3_clear_zeros(struct ip_sf_list **ppsf)
+{
+	struct ip_sf_list *psf_prev, *psf_next, *psf;
+
+	psf_prev = 0;
+	for (psf=*ppsf; psf; psf = psf_next) {
+		psf_next = psf->sf_next;
+		if (psf->sf_crcount == 0) {
+			if (psf_prev)
+				psf_prev->sf_next = psf->sf_next;
+			else
+				*ppsf = psf->sf_next;
+			kfree(psf);
+		} else
+			psf_prev = psf;
+	}
+}
+
+static void igmpv3_send_cr(struct in_device *in_dev)
+{
+	struct ip_mc_list *pmc, *pmc_prev, *pmc_next;
+	struct sk_buff *skb = 0;
+	int type, dtype;
+
+	read_lock(&in_dev->lock);
+	write_lock_bh(&in_dev->mc_lock);
+
+	/* deleted MCA's */
+	pmc_prev = 0;
+	for (pmc=in_dev->mc_tomb; pmc; pmc=pmc_next) {
+		pmc_next = pmc->next;
+		if (pmc->sfmode == MCAST_INCLUDE) {
+			type = IGMPV3_BLOCK_OLD_SOURCES;
+			dtype = IGMPV3_BLOCK_OLD_SOURCES;
+			skb = add_grec(skb, pmc, type, 1, 0);
+			skb = add_grec(skb, pmc, dtype, 1, 1);
+		}
+		if (pmc->crcount) {
+			pmc->crcount--;
+			if (pmc->sfmode == MCAST_EXCLUDE) {
+				type = IGMPV3_CHANGE_TO_INCLUDE;
+				skb = add_grec(skb, pmc, type, 1, 0);
+			}
+			if (pmc->crcount == 0) {
+				igmpv3_clear_zeros(&pmc->tomb);
+				igmpv3_clear_zeros(&pmc->sources);
+			}
+		}
+		if (pmc->crcount == 0 && !pmc->tomb && !pmc->sources) {
+			if (pmc_prev)
+				pmc_prev->next = pmc_next;
+			else
+				in_dev->mc_tomb = pmc_next;
+			in_dev_put(pmc->interface);
+			kfree(pmc);
+		} else
+			pmc_prev = pmc;
+	}
+	write_unlock_bh(&in_dev->mc_lock);
+
+	/* change recs */
+	for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
+		spin_lock_bh(&pmc->lock);
+		if (pmc->sfcount[MCAST_EXCLUDE]) {
+			type = IGMPV3_BLOCK_OLD_SOURCES;
+			dtype = IGMPV3_ALLOW_NEW_SOURCES;
+		} else {
+			type = IGMPV3_ALLOW_NEW_SOURCES;
+			dtype = IGMPV3_BLOCK_OLD_SOURCES;
+		}
+		skb = add_grec(skb, pmc, type, 0, 0);
+		skb = add_grec(skb, pmc, dtype, 0, 1);	/* deleted sources */
+
+		/* filter mode changes */
+		if (pmc->crcount) {
+			pmc->crcount--;
+			if (pmc->sfmode == MCAST_EXCLUDE)
+				type = IGMPV3_CHANGE_TO_EXCLUDE;
+			else
+				type = IGMPV3_CHANGE_TO_INCLUDE;
+			skb = add_grec(skb, pmc, type, 0, 0);
+		}
+		spin_unlock_bh(&pmc->lock);
+	}
+	read_unlock(&in_dev->lock);
+	if (!skb)
+		return;
+	(void) igmpv3_sendpack(skb);
+}
+
+static int igmp_send_report(struct in_device *in_dev, struct ip_mc_list *pmc,
+	int type)
 {
 	struct sk_buff *skb;
 	struct iphdr *iph;
 	struct igmphdr *ih;
 	struct rtable *rt;
+	struct net_device *dev = in_dev->dev;
+	u32	group = pmc ? pmc->multiaddr : 0;
 	u32	dst;
 
-	/* According to IGMPv2 specs, LEAVE messages are
-	 * sent to all-routers group.
-	 */
-	dst = group;
-	if (type == IGMP_HOST_LEAVE_MESSAGE)
+	if (type == IGMPV3_HOST_MEMBERSHIP_REPORT)
+		return igmpv3_send_report(in_dev, pmc);
+	else if (type == IGMP_HOST_LEAVE_MESSAGE)
 		dst = IGMP_ALL_ROUTER;
+	else
+		dst = group;
 
 	{
 		struct flowi fl = { .oif = dev->ifindex,
@@ -225,7 +630,7 @@
 
 	iph->version  = 4;
 	iph->ihl      = (sizeof(struct iphdr)+4)>>2;
-	iph->tos      = 0;
+	iph->tos      = 0xc0;
 	iph->frag_off = htons(IP_DF);
 	iph->ttl      = 1;
 	iph->daddr    = dst;
@@ -250,6 +655,34 @@
 		       dst_output);
 }
 
+static void igmp_gq_timer_expire(unsigned long data)
+{
+	struct in_device *in_dev = (struct in_device *)data;
+
+	in_dev->mr_gq_running = 0;
+	igmpv3_send_report(in_dev, 0);
+}
+
+static void igmp_ifc_timer_expire(unsigned long data)
+{
+	struct in_device *in_dev = (struct in_device *)data;
+
+	igmpv3_send_cr(in_dev);
+	if (in_dev->mr_ifc_count) {
+		in_dev->mr_ifc_count--;
+		igmp_ifc_start_timer(in_dev, IGMP_Unsolicited_Report_Interval);
+	}
+}
+
+static void igmp_ifc_event(struct in_device *in_dev)
+{
+	if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
+		return;
+	in_dev->mr_ifc_count = in_dev->mr_qrv ? in_dev->mr_qrv : 
+		IGMP_Unsolicited_Report_Count;
+	igmp_ifc_start_timer(in_dev, 1);
+}
+
 
 static void igmp_timer_expire(unsigned long data)
 {
@@ -267,13 +700,33 @@
 	spin_unlock(&im->lock);
 
 	if (IGMP_V1_SEEN(in_dev))
-		igmp_send_report(in_dev->dev, im->multiaddr, IGMP_HOST_MEMBERSHIP_REPORT);
+		igmp_send_report(in_dev, im, IGMP_HOST_MEMBERSHIP_REPORT);
+	else if (IGMP_V2_SEEN(in_dev))
+		igmp_send_report(in_dev, im, IGMPV2_HOST_MEMBERSHIP_REPORT);
 	else
-		igmp_send_report(in_dev->dev, im->multiaddr, IGMP_HOST_NEW_MEMBERSHIP_REPORT);
+		igmp_send_report(in_dev, im, IGMPV3_HOST_MEMBERSHIP_REPORT);
 
 	ip_ma_put(im);
 }
 
+static void igmp_marksources(struct ip_mc_list *pmc, int nsrcs, __u32 *srcs)
+{
+	struct ip_sf_list *psf;
+	int i, scount;
+
+	scount = 0;
+	for (psf=pmc->sources; psf; psf=psf->sf_next) {
+		if (scount == nsrcs)
+			break;
+		for (i=0; i<nsrcs; i++)
+			if (srcs[i] == psf->sf_inaddr) {
+				psf->sf_gsresp = 1;
+				scount++;
+				break;
+			}
+	}
+}
+
 static void igmp_heard_report(struct in_device *in_dev, u32 group)
 {
 	struct ip_mc_list *im;
@@ -293,20 +746,46 @@
 	read_unlock(&in_dev->lock);
 }
 
-static void igmp_heard_query(struct in_device *in_dev, unsigned char max_resp_time,
-			     u32 group)
+static void igmp_heard_query(struct in_device *in_dev, struct igmphdr *ih,
+	int len)
 {
+	struct igmpv3_query *ih3 = (struct igmpv3_query *)ih;
 	struct ip_mc_list	*im;
+	u32			group = ih->group;
 	int			max_delay;
+	int			mark = 0;
 
-	max_delay = max_resp_time*(HZ/IGMP_TIMER_SCALE);
 
-	if (max_resp_time == 0) {
-		/* Alas, old v1 router presents here. */
-
-		max_delay = IGMP_Query_Response_Interval;
-		in_dev->mr_v1_seen = jiffies + IGMP_V1_Router_Present_Timeout;
-		group = 0;
+	if (len == 8) {
+		if (ih->code == 0) {
+			/* Alas, old v1 router presents here. */
+	
+			max_delay = IGMP_Query_Response_Interval;
+			in_dev->mr_v1_seen = jiffies +
+				IGMP_V1_Router_Present_Timeout;
+			group = 0;
+		} else {
+			/* v2 router present */
+			max_delay = ih->code*(HZ/IGMP_TIMER_SCALE);
+			in_dev->mr_v2_seen = jiffies +
+				IGMP_V2_Router_Present_Timeout;
+		}
+		igmpv3_clear_delrec(in_dev);
+	} else if (len < 12) {
+		return;	/* ignore bogus packet; freed by caller */
+	} else { /* v3 */
+		max_delay = IGMPV3_MRC(ih3->code)*(HZ/IGMP_TIMER_SCALE);
+		in_dev->mr_maxdelay = max_delay;
+		if (ih3->qrv)
+			in_dev->mr_qrv = ih3->qrv;
+		if (!group) { /* general query */
+			if (ih3->nsrcs)
+				return;	/* no sources allowed */
+			igmp_gq_start_timer(in_dev);
+			return;
+		}
+		/* mark sources to include, if group & source-specific */
+		mark = ih3->nsrcs != 0;
 	}
 
 	/*
@@ -325,6 +804,14 @@
 			continue;
 		if (im->multiaddr == IGMP_ALL_HOSTS)
 			continue;
+		spin_lock_bh(&im->lock);
+		if (im->tm_running)
+			im->gsquery = im->gsquery && mark;
+		else
+			im->gsquery = mark;
+		if (im->gsquery)
+			igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs);
+		spin_unlock_bh(&im->lock);
 		igmp_mod_timer(im, max_delay);
 	}
 	read_unlock(&in_dev->lock);
@@ -358,10 +845,11 @@
 
 	switch (ih->type) {
 	case IGMP_HOST_MEMBERSHIP_QUERY:
-		igmp_heard_query(in_dev, ih->code, ih->group);
+		igmp_heard_query(in_dev, ih, len);
 		break;
 	case IGMP_HOST_MEMBERSHIP_REPORT:
-	case IGMP_HOST_NEW_MEMBERSHIP_REPORT:
+	case IGMPV2_HOST_MEMBERSHIP_REPORT:
+	case IGMPV3_HOST_MEMBERSHIP_REPORT:
 		/* Is it our report looped back? */
 		if (((struct rtable*)skb->dst)->fl.iif == 0)
 			break;
@@ -422,15 +910,105 @@
 		dev_mc_delete(dev,buf,dev->addr_len,0);
 }
 
+#ifdef CONFIG_IP_MULTICAST
+/*
+ * deleted ip_mc_list manipulation
+ */
+static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im)
+{
+	struct ip_mc_list *pmc;
+
+	/* this is an "ip_mc_list" for convenience; only the fields below
+	 * are actually used. In particular, the refcnt and users are not
+	 * used for management of the delete list. Using the same structure
+	 * for deleted items allows change reports to use common code with
+	 * non-deleted or query-response MCA's.
+	 */
+	pmc = (struct ip_mc_list *)kmalloc(sizeof(*pmc), GFP_KERNEL);
+	if (!pmc)
+		return;
+	memset(pmc, 0, sizeof(*pmc));
+	spin_lock_bh(&im->lock);
+	pmc->interface = im->interface;
+	in_dev_hold(in_dev);
+	pmc->multiaddr = im->multiaddr;
+	pmc->crcount = in_dev->mr_qrv ? in_dev->mr_qrv :
+		IGMP_Unsolicited_Report_Count;
+	pmc->sfmode = im->sfmode;
+	if (pmc->sfmode == MCAST_INCLUDE) {
+		struct ip_sf_list *psf;
+
+		pmc->tomb = im->tomb;
+		pmc->sources = im->sources;
+		im->tomb = im->sources = 0;
+		for (psf=pmc->sources; psf; psf=psf->sf_next)
+			psf->sf_crcount = pmc->crcount;
+	}
+	spin_unlock_bh(&im->lock);
+
+	write_lock_bh(&in_dev->mc_lock);
+	pmc->next = in_dev->mc_tomb;
+	in_dev->mc_tomb = pmc;
+	write_unlock_bh(&in_dev->mc_lock);
+}
+#endif
+
+static void igmpv3_del_delrec(struct in_device *in_dev, __u32 multiaddr)
+{
+	struct ip_mc_list *pmc, *pmc_prev;
+	struct ip_sf_list *psf, *psf_next;
+
+	write_lock_bh(&in_dev->mc_lock);
+	pmc_prev = 0;
+	for (pmc=in_dev->mc_tomb; pmc; pmc=pmc->next) {
+		if (pmc->multiaddr == multiaddr)
+			break;
+		pmc_prev = pmc;
+	}
+	if (pmc) {
+		if (pmc_prev)
+			pmc_prev->next = pmc->next;
+		else
+			in_dev->mc_tomb = pmc->next;
+	}
+	write_unlock_bh(&in_dev->mc_lock);
+	if (pmc) {
+		for (psf=pmc->tomb; psf; psf=psf_next) {
+			psf_next = psf->sf_next;
+			kfree(psf);
+		}
+		in_dev_put(pmc->interface);
+		kfree(pmc);
+	}
+}
+
+static void igmpv3_clear_delrec(struct in_device *in_dev)
+{
+	struct ip_mc_list *pmc, *nextpmc;
+
+	write_lock_bh(&in_dev->mc_lock);
+	pmc = in_dev->mc_tomb;
+	in_dev->mc_tomb = 0;
+	write_unlock_bh(&in_dev->mc_lock);
+
+	for (; pmc; pmc = nextpmc) {
+		nextpmc = pmc->next;
+		ip_mc_clear_src(pmc);
+		in_dev_put(pmc->interface);
+		kfree(pmc);
+	}
+}
+
 static void igmp_group_dropped(struct ip_mc_list *im)
 {
+	struct in_device *in_dev = im->interface;
 #ifdef CONFIG_IP_MULTICAST
 	int reporter;
 #endif
 
 	if (im->loaded) {
 		im->loaded = 0;
-		ip_mc_filter_del(im->interface, im->multiaddr);
+		ip_mc_filter_del(in_dev, im->multiaddr);
 	}
 
 #ifdef CONFIG_IP_MULTICAST
@@ -440,25 +1018,46 @@
 	reporter = im->reporter;
 	igmp_stop_timer(im);
 
-	if (reporter && !IGMP_V1_SEEN(im->interface))
-		igmp_send_report(im->interface->dev, im->multiaddr, IGMP_HOST_LEAVE_MESSAGE);
+	if (IGMP_V1_SEEN(in_dev))
+		goto done;
+	if (IGMP_V2_SEEN(in_dev)) {
+		if (reporter)
+			igmp_send_report(in_dev, im, IGMP_HOST_LEAVE_MESSAGE);
+		goto done;
+	}
+	/* IGMPv3 */
+	igmpv3_add_delrec(in_dev, im);
+
+	igmp_ifc_event(in_dev);
+done:
+	ip_mc_clear_src(im);
 #endif
 }
 
 static void igmp_group_added(struct ip_mc_list *im)
 {
+	struct in_device *in_dev = im->interface;
+
 	if (im->loaded == 0) {
 		im->loaded = 1;
-		ip_mc_filter_add(im->interface, im->multiaddr);
+		ip_mc_filter_add(in_dev, im->multiaddr);
 	}
 
 #ifdef CONFIG_IP_MULTICAST
 	if (im->multiaddr == IGMP_ALL_HOSTS)
 		return;
 
-	spin_lock_bh(&im->lock);
-	igmp_start_timer(im, IGMP_Initial_Report_Delay);
-	spin_unlock_bh(&im->lock);
+	if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev)) {
+		spin_lock_bh(&im->lock);
+		igmp_start_timer(im, IGMP_Initial_Report_Delay);
+		spin_unlock_bh(&im->lock);
+		return;
+	}
+	/* else, v3 */
+
+	im->crcount = in_dev->mr_qrv ? in_dev->mr_qrv :
+		IGMP_Unsolicited_Report_Count;
+	igmp_ifc_event(in_dev);
 #endif
 }
 
@@ -481,6 +1080,7 @@
 	for (im=in_dev->mc_list; im; im=im->next) {
 		if (im->multiaddr == addr) {
 			im->users++;
+			ip_mc_add_src(in_dev, &addr, MCAST_EXCLUDE, 0, 0, 0);
 			goto out;
 		}
 	}
@@ -493,6 +1093,13 @@
 	im->interface=in_dev;
 	in_dev_hold(in_dev);
 	im->multiaddr=addr;
+	/* initial mode is (EX, empty) */
+	im->sfmode = MCAST_EXCLUDE;
+	im->sfcount[MCAST_INCLUDE] = 0;
+	im->sfcount[MCAST_EXCLUDE] = 1;
+	im->sources = 0;
+	im->tomb = 0;
+	im->crcount = 0;
 	atomic_set(&im->refcnt, 1);
 	spin_lock_init(&im->lock);
 #ifdef  CONFIG_IP_MULTICAST
@@ -502,12 +1109,14 @@
 	im->timer.function=&igmp_timer_expire;
 	im->unsolicit_count = IGMP_Unsolicited_Report_Count;
 	im->reporter = 0;
+	im->gsquery = 0;
 #endif
 	im->loaded = 0;
 	write_lock_bh(&in_dev->lock);
 	im->next=in_dev->mc_list;
 	in_dev->mc_list=im;
 	write_unlock_bh(&in_dev->lock);
+	igmpv3_del_delrec(in_dev, im->multiaddr);
 	igmp_group_added(im);
 	if (in_dev->dev->flags & IFF_UP)
 		ip_rt_multicast_event(in_dev);
@@ -552,9 +1161,20 @@
 
 	ASSERT_RTNL();
 
+#ifdef CONFIG_IP_MULTICAST
+	in_dev->mr_ifc_count = 0;
+	if (del_timer(&in_dev->mr_ifc_timer))
+		atomic_dec(&in_dev->refcnt);
+	in_dev->mr_gq_running = 0;
+	if (del_timer(&in_dev->mr_gq_timer))
+		atomic_dec(&in_dev->refcnt);
+#endif
+
 	for (i=in_dev->mc_list; i; i=i->next)
 		igmp_group_dropped(i);
 
+	igmpv3_clear_delrec(in_dev);
+
 	ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS);
 }
 
@@ -566,6 +1186,20 @@
 
 	ASSERT_RTNL();
 
+#ifdef CONFIG_IP_MULTICAST
+	in_dev->mr_gq_running = 0;
+	init_timer(&in_dev->mr_gq_timer);
+	in_dev->mr_gq_timer.data=(unsigned long) in_dev;
+	in_dev->mr_gq_timer.function=&igmp_gq_timer_expire;
+	in_dev->mc_tomb = 0;
+	in_dev->mr_ifc_count = 0;
+	init_timer(&in_dev->mr_ifc_timer);
+	in_dev->mr_ifc_timer.data=(unsigned long) in_dev;
+	in_dev->mr_ifc_timer.function=&igmp_ifc_timer_expire;
+	in_dev->mr_qrv = IGMP_Unsolicited_Report_Count;
+#endif
+
+	in_dev->mc_lock = RW_LOCK_UNLOCKED;
 	ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);
 
 	for (i=in_dev->mc_list; i; i=i->next)
@@ -626,6 +1260,262 @@
  */
 int sysctl_igmp_max_memberships = IP_MAX_MEMBERSHIPS;
 
+
+static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,
+	__u32 *psfsrc)
+{
+	struct ip_sf_list *psf, *psf_prev;
+	int rv = 0;
+
+	psf_prev = 0;
+	for (psf=pmc->sources; psf; psf=psf->sf_next) {
+		if (psf->sf_inaddr == *psfsrc)
+			break;
+		psf_prev = psf;
+	}
+	if (!psf || psf->sf_count[sfmode] == 0) {
+		/* source filter not found, or count wrong =>  bug */
+		return -ESRCH;
+	}
+	psf->sf_count[sfmode]--;
+	if (psf->sf_count[sfmode] == 0) {
+		ip_rt_multicast_event(pmc->interface);
+	}
+	if (!psf->sf_count[MCAST_INCLUDE] && !psf->sf_count[MCAST_EXCLUDE]) {
+		struct in_device *in_dev = pmc->interface;
+
+		/* no more filters for this source */
+		if (psf_prev)
+			psf_prev->sf_next = psf->sf_next;
+		else
+			pmc->sources = psf->sf_next;
+		if (psf->sf_oldin &&
+		    !IGMP_V1_SEEN(in_dev) && !IGMP_V2_SEEN(in_dev)) {
+			psf->sf_crcount = in_dev->mr_qrv ? in_dev->mr_qrv : 
+				IGMP_Unsolicited_Report_Count;
+			psf->sf_next = pmc->tomb;
+			pmc->tomb = psf;
+			rv = 1;
+		} else
+			kfree(psf);
+	}
+	return rv;
+}
+
+#ifndef CONFIG_IP_MULTICAST
+#define igmp_ifc_event(x)	do { } while (0)
+#endif
+
+int ip_mc_del_src(struct in_device *in_dev, __u32 *pmca, int sfmode,
+	int sfcount, __u32 *psfsrc, int delta)
+{
+	struct ip_mc_list *pmc;
+	int	changerec = 0;
+	int	i, err;
+
+	if (!in_dev)
+		return -ENODEV;
+	read_lock(&in_dev->lock);
+	for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
+		if (*pmca == pmc->multiaddr)
+			break;
+	}
+	if (!pmc) {
+		/* MCA not found?? bug */
+		read_unlock(&in_dev->lock);
+		return -ESRCH;
+	}
+	spin_lock_bh(&pmc->lock);
+	read_unlock(&in_dev->lock);
+	sf_markstate(pmc);
+	if (!delta) {
+		if (!pmc->sfcount[sfmode])
+			return -EINVAL;
+		pmc->sfcount[sfmode]--;
+	}
+	err = 0;
+	for (i=0; i<sfcount; i++) {
+		int rv = ip_mc_del1_src(pmc, sfmode, &psfsrc[i]);
+
+		changerec |= rv > 0;
+		if (!err && rv < 0)
+			err = rv;
+	}
+	if (pmc->sfmode == MCAST_EXCLUDE &&
+	    pmc->sfcount[MCAST_EXCLUDE] == 0 &&
+	    pmc->sfcount[MCAST_INCLUDE]) {
+		struct ip_sf_list *psf;
+
+		/* filter mode change */
+		pmc->sfmode = MCAST_INCLUDE;
+		pmc->crcount = in_dev->mr_qrv ? in_dev->mr_qrv : 
+			IGMP_Unsolicited_Report_Count;
+		in_dev->mr_ifc_count = pmc->crcount;
+		for (psf=pmc->sources; psf; psf = psf->sf_next)
+			psf->sf_crcount = 0;
+		igmp_ifc_event(pmc->interface);
+	} else if (sf_setstate(pmc) || changerec) {
+		igmp_ifc_event(pmc->interface);
+	}
+	spin_unlock_bh(&pmc->lock);
+	return err;
+}
+
+/*
+ * Add multicast single-source filter to the interface list
+ */
+static int ip_mc_add1_src(struct ip_mc_list *pmc, int sfmode,
+	__u32 *psfsrc, int delta)
+{
+	struct ip_sf_list *psf, *psf_prev;
+
+	psf_prev = 0;
+	for (psf=pmc->sources; psf; psf=psf->sf_next) {
+		if (psf->sf_inaddr == *psfsrc)
+			break;
+		psf_prev = psf;
+	}
+	if (!psf) {
+		psf = (struct ip_sf_list *)kmalloc(sizeof(*psf), GFP_ATOMIC);
+		if (!psf)
+			return -ENOBUFS;
+		memset(psf, 0, sizeof(*psf));
+		psf->sf_inaddr = *psfsrc;
+		if (psf_prev) {
+			psf_prev->sf_next = psf;
+		} else
+			pmc->sources = psf;
+	}
+	psf->sf_count[sfmode]++;
+	if (psf->sf_count[sfmode] == 1) {
+		ip_rt_multicast_event(pmc->interface);
+	}
+	return 0;
+}
+
+static void sf_markstate(struct ip_mc_list *pmc)
+{
+	struct ip_sf_list *psf;
+	int mca_xcount = pmc->sfcount[MCAST_EXCLUDE];
+
+	for (psf=pmc->sources; psf; psf=psf->sf_next)
+		if (pmc->sfcount[MCAST_EXCLUDE]) {
+			psf->sf_oldin = mca_xcount ==
+				psf->sf_count[MCAST_EXCLUDE] &&
+				!psf->sf_count[MCAST_INCLUDE];
+		} else
+			psf->sf_oldin = psf->sf_count[MCAST_INCLUDE] != 0;
+}
+
+static int sf_setstate(struct ip_mc_list *pmc)
+{
+	struct ip_sf_list *psf;
+	int mca_xcount = pmc->sfcount[MCAST_EXCLUDE];
+	int qrv = pmc->interface->mr_qrv;
+	int new_in, rv;
+
+	rv = 0;
+	for (psf=pmc->sources; psf; psf=psf->sf_next) {
+		if (pmc->sfcount[MCAST_EXCLUDE]) {
+			new_in = mca_xcount == psf->sf_count[MCAST_EXCLUDE] &&
+				!psf->sf_count[MCAST_INCLUDE];
+		} else
+			new_in = psf->sf_count[MCAST_INCLUDE] != 0;
+		if (new_in != psf->sf_oldin) {
+			psf->sf_crcount = qrv;
+			rv++;
+		}
+	}
+	return rv;
+}
+
+/*
+ * Add multicast source filter list to the interface list
+ */
+int ip_mc_add_src(struct in_device *in_dev, __u32 *pmca, int sfmode,
+	int sfcount, __u32 *psfsrc, int delta)
+{
+	struct ip_mc_list *pmc;
+	int	isexclude;
+	int	i, err;
+
+	if (!in_dev)
+		return -ENODEV;
+	read_lock(&in_dev->lock);
+	for (pmc=in_dev->mc_list; pmc; pmc=pmc->next) {
+		if (*pmca == pmc->multiaddr)
+			break;
+	}
+	if (!pmc) {
+		/* MCA not found?? bug */
+		read_unlock(&in_dev->lock);
+		return -ESRCH;
+	}
+	spin_lock_bh(&pmc->lock);
+	read_unlock(&in_dev->lock);
+
+	sf_markstate(pmc);
+	isexclude = pmc->sfmode == MCAST_EXCLUDE;
+	if (!delta)
+		pmc->sfcount[sfmode]++;
+	err = 0;
+	for (i=0; i<sfcount; i++) {
+		err = ip_mc_add1_src(pmc, sfmode, &psfsrc[i], delta);
+		if (err)
+			break;
+	}
+	if (err) {
+		int j;
+
+		pmc->sfcount[sfmode]--;
+		for (j=0; j<i; j++)
+			(void) ip_mc_del1_src(pmc, sfmode, &psfsrc[i]);
+	} else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) {
+		struct in_device *in_dev = pmc->interface;
+		struct ip_sf_list *psf;
+
+		/* filter mode change */
+		if (pmc->sfcount[MCAST_EXCLUDE])
+			pmc->sfmode = MCAST_EXCLUDE;
+		else if (pmc->sfcount[MCAST_INCLUDE])
+			pmc->sfmode = MCAST_INCLUDE;
+		/* else no filters; keep old mode for reports */
+
+		pmc->crcount = in_dev->mr_qrv ? in_dev->mr_qrv : 
+			IGMP_Unsolicited_Report_Count;
+		in_dev->mr_ifc_count = pmc->crcount;
+		for (psf=pmc->sources; psf; psf = psf->sf_next)
+			psf->sf_crcount = 0;
+		igmp_ifc_event(in_dev);
+	} else if (sf_setstate(pmc))
+		igmp_ifc_event(in_dev);
+	spin_unlock_bh(&pmc->lock);
+	return err;
+}
+
+static void ip_mc_clear_src(struct ip_mc_list *pmc)
+{
+	struct ip_sf_list *psf, *nextpsf;
+
+	for (psf=pmc->tomb; psf; psf=nextpsf) {
+		nextpsf = psf->sf_next;
+		kfree(psf);
+	}
+	pmc->tomb = 0;
+	for (psf=pmc->sources; psf; psf=nextpsf) {
+		nextpsf = psf->sf_next;
+		kfree(psf);
+	}
+	pmc->sources = 0;
+	pmc->sfmode = MCAST_EXCLUDE;
+	pmc->sfcount[MCAST_EXCLUDE] = 0;
+	pmc->sfcount[MCAST_EXCLUDE] = 1;
+}
+
+
+/*
+ * Join a multicast group
+ */
 int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr)
 {
 	int err;
@@ -674,6 +1564,8 @@
 	memcpy(&iml->multi, imr, sizeof(*imr));
 	iml->next = inet->mc_list;
 	iml->count = 1;
+	iml->sflist = NULL;
+	iml->sfmode = MCAST_EXCLUDE;
 	inet->mc_list = iml;
 	ip_mc_inc_group(in_dev, addr);
 	iml = NULL;
@@ -686,6 +1578,24 @@
 	return err;
 }
 
+int ip_mc_leave_src(struct sock *sk, struct ip_mc_socklist *iml,
+	struct in_device *in_dev)
+{
+	int err;
+
+	if (iml->sflist == 0) {
+		/* any-source empty exclude case */
+		return ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr,
+			iml->sfmode, 0, 0, 0);
+	}
+	err = ip_mc_del_src(in_dev, &iml->multi.imr_multiaddr.s_addr,
+			iml->sfmode, iml->sflist->sl_count,
+			iml->sflist->sl_addr, 0);
+	sock_kfree_s(sk, iml->sflist, IP_SFLSIZE(iml->sflist->sl_max));
+	iml->sflist = 0;
+	return err;
+}
+
 /*
  *	Ask a socket to leave a group.
  */
@@ -701,14 +1611,19 @@
 		    iml->multi.imr_address.s_addr==imr->imr_address.s_addr &&
 		    (!imr->imr_ifindex || iml->multi.imr_ifindex==imr->imr_ifindex)) {
 			struct in_device *in_dev;
+
+			in_dev = inetdev_by_index(iml->multi.imr_ifindex);
+			if (in_dev)
+				(void) ip_mc_leave_src(sk, iml, in_dev);
 			if (--iml->count) {
 				rtnl_unlock();
+				if (in_dev)
+					in_dev_put(in_dev);
 				return 0;
 			}
 
 			*imlp = iml->next;
 
-			in_dev = inetdev_by_index(iml->multi.imr_ifindex);
 			if (in_dev) {
 				ip_mc_dec_group(in_dev, imr->imr_multiaddr.s_addr);
 				in_dev_put(in_dev);
@@ -722,6 +1637,283 @@
 	return -EADDRNOTAVAIL;
 }
 
+int ip_mc_source(int add, int omode, struct sock *sk, struct
+	ip_mreq_source *mreqs)
+{
+	int err;
+	struct ip_mreqn	imr;
+	u32 addr = mreqs->imr_multiaddr;
+	struct ip_mc_socklist *pmc;
+	struct in_device *in_dev;
+	struct inet_opt *inet = inet_sk(sk);
+	struct ip_sf_socklist *psl;
+	int i, j, rv;
+
+	if (!MULTICAST(addr))
+		return -EINVAL;
+
+	rtnl_shlock();
+
+	imr.imr_multiaddr.s_addr = mreqs->imr_multiaddr;
+	imr.imr_address.s_addr = mreqs->imr_interface;
+	imr.imr_ifindex = 0;
+	in_dev = ip_mc_find_dev(&imr);
+
+	if (!in_dev) {
+		err = -ENODEV;
+		goto done;
+	}
+	err = -EADDRNOTAVAIL;
+
+	for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
+		if (memcmp(&pmc->multi, mreqs, 2*sizeof(__u32)) == 0)
+			break;
+	}
+	if (!pmc)		/* must have a prior join */
+		goto done;
+	/* if a source filter was set, must be the same mode as before */
+	if (pmc->sflist) {
+		if (pmc->sfmode != omode)
+			goto done;
+	} else if (pmc->sfmode != omode) {
+		/* allow mode switches for empty-set filters */
+		ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0, 
+			0, 0);
+		pmc->sfmode = omode;
+		ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0, 
+			0, 0);
+	}
+
+	psl = pmc->sflist;
+	if (!add) {
+		if (!psl)
+			goto done;
+		rv = !0;
+		for (i=0; i<psl->sl_count; i++) {
+			rv = memcmp(&psl->sl_addr, &mreqs->imr_multiaddr,
+				sizeof(__u32));
+			if (rv >= 0)
+				break;
+		}
+		if (!rv)	/* source not found */
+			goto done;
+
+		/* update the interface filter */
+		ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, omode, 1, 
+			&mreqs->imr_sourceaddr, 1);
+
+		for (j=i+1; j<psl->sl_count; j++)
+			psl->sl_addr[j-1] = psl->sl_addr[j];
+		psl->sl_count--;
+		err = 0;
+		goto done;
+	}
+	/* else, add a new source to the filter */
+
+	if (!psl || psl->sl_count == psl->sl_max) {
+		struct ip_sf_socklist *newpsl;
+		int count = IP_SFBLOCK;
+
+		if (psl)
+			count += psl->sl_max;
+		newpsl = (struct ip_sf_socklist *)sock_kmalloc(sk,
+			IP_SFLSIZE(count), GFP_KERNEL);
+		if (!newpsl) {
+			err = -ENOBUFS;
+			goto done;
+		}
+		newpsl->sl_max = count;
+		newpsl->sl_count = count - IP_SFBLOCK;
+		if (psl) {
+			for (i=0; i<psl->sl_count; i++)
+				newpsl->sl_addr[i] = psl->sl_addr[i];
+			sock_kfree_s(sk, psl, IP_SFLSIZE(psl->sl_max));
+		}
+		pmc->sflist = psl = newpsl;
+	}
+	rv = 1;	/* > 0 for insert logic below if sl_count is 0 */
+	for (i=0; i<psl->sl_count; i++) {
+		rv = memcmp(&psl->sl_addr, &mreqs->imr_multiaddr,
+			sizeof(__u32));
+		if (rv >= 0)
+			break;
+	}
+	if (rv == 0)		/* address already there is an error */
+		goto done;
+	for (j=psl->sl_count-1; j>=i; j--)
+		psl->sl_addr[j+1] = psl->sl_addr[j];
+	psl->sl_addr[i] = mreqs->imr_sourceaddr;
+	psl->sl_count++;
+	err = 0;
+	/* update the interface list */
+	ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1, 
+		&mreqs->imr_sourceaddr, 1);
+done:
+	rtnl_shunlock();
+	return err;
+}
+
+int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf)
+{
+	int err;
+	struct ip_mreqn	imr;
+	u32 addr = msf->imsf_multiaddr;
+	struct ip_mc_socklist *pmc;
+	struct in_device *in_dev;
+	struct inet_opt *inet = inet_sk(sk);
+	struct ip_sf_socklist *newpsl, *psl;
+
+	if (!MULTICAST(addr))
+		return -EINVAL;
+	if (msf->imsf_fmode != MCAST_INCLUDE &&
+	    msf->imsf_fmode != MCAST_EXCLUDE)
+		return -EINVAL;
+
+	rtnl_shlock();
+
+	imr.imr_multiaddr.s_addr = msf->imsf_multiaddr;
+	imr.imr_address.s_addr = msf->imsf_interface;
+	imr.imr_ifindex = 0;
+	in_dev = ip_mc_find_dev(&imr);
+
+	if (!in_dev) {
+		err = -ENODEV;
+		goto done;
+	}
+	err = -EADDRNOTAVAIL;
+
+	for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
+		if (memcmp(&pmc->multi, &imr, sizeof(imr)) == 0)
+			break;
+	}
+	if (!pmc)		/* must have a prior join */
+		goto done;
+	if (msf->imsf_numsrc) {
+		newpsl = (struct ip_sf_socklist *)sock_kmalloc(sk,
+				IP_SFLSIZE(msf->imsf_numsrc), GFP_KERNEL);
+		if (!newpsl) {
+			err = -ENOBUFS;
+			goto done;
+		}
+		newpsl->sl_max = newpsl->sl_count = msf->imsf_numsrc;
+		memcpy(newpsl->sl_addr, msf->imsf_slist,
+			msf->imsf_numsrc * sizeof(msf->imsf_slist[0]));
+		err = ip_mc_add_src(in_dev, &msf->imsf_multiaddr,
+			msf->imsf_fmode, newpsl->sl_count, newpsl->sl_addr, 0);
+		if (err) {
+			sock_kfree_s(sk, newpsl, IP_SFLSIZE(newpsl->sl_max));
+			goto done;
+		}
+	} else
+		newpsl = 0;
+	psl = pmc->sflist;
+	if (psl) {
+		(void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
+			psl->sl_count, psl->sl_addr, 0);
+		sock_kfree_s(sk, psl, IP_SFLSIZE(psl->sl_max));
+	} else
+		(void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
+			0, 0, 0);
+	pmc->sflist = newpsl;
+	pmc->sfmode = msf->imsf_fmode;
+done:
+	rtnl_shunlock();
+	return err;
+}
+
+int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
+	struct ip_msfilter *optval, int *optlen)
+{
+	int err, len, count, copycount;
+	struct ip_mreqn	imr;
+	u32 addr = msf->imsf_multiaddr;
+	struct ip_mc_socklist *pmc;
+	struct in_device *in_dev;
+	struct inet_opt *inet = inet_sk(sk);
+	struct ip_sf_socklist *psl;
+
+	if (!MULTICAST(addr))
+		return -EINVAL;
+	if (msf->imsf_fmode != MCAST_INCLUDE &&
+	    msf->imsf_fmode != MCAST_EXCLUDE)
+		return -EINVAL;
+
+	rtnl_shlock();
+
+	imr.imr_multiaddr.s_addr = msf->imsf_multiaddr;
+	imr.imr_address.s_addr = msf->imsf_interface;
+	imr.imr_ifindex = 0;
+	in_dev = ip_mc_find_dev(&imr);
+
+	if (!in_dev) {
+		err = -ENODEV;
+		goto done;
+	}
+	err = -EADDRNOTAVAIL;
+
+	for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
+		if (memcmp(&pmc->multi, &imr, sizeof(imr)) == 0)
+			break;
+	}
+	if (!pmc)		/* must have a prior join */
+		goto done;
+	msf->imsf_fmode = pmc->sfmode;
+	psl = pmc->sflist;
+	rtnl_shunlock();
+	if (!psl) {
+		len = 0;
+		count = 0;
+	} else {
+		count = psl->sl_count;
+	}
+	copycount = count < msf->imsf_numsrc ? count : msf->imsf_numsrc;
+	len = copycount * sizeof(psl->sl_addr[0]);
+	msf->imsf_numsrc = count;
+	if (put_user(IP_MSFILTER_SIZE(copycount), optlen) ||
+	    copy_to_user((void *)optval, msf, IP_MSFILTER_SIZE(0))) {
+		return -EFAULT;
+	}
+	if (len &&
+	    copy_to_user((void *)&optval->imsf_slist[0], psl->sl_addr, len))
+		return -EFAULT;
+	return 0;
+done:
+	rtnl_shunlock();
+	return err;
+}
+
+/*
+ * check if a multicast source filter allows delivery for a given <src,dst,intf>
+ */
+int ip_mc_sf_allow(struct sock *sk, u32 loc_addr, u32 rmt_addr, int dif)
+{
+	struct inet_opt *inet = inet_sk(sk);
+	struct ip_mc_socklist *pmc;
+	struct ip_sf_socklist *psl;
+	int i;
+
+	for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
+		if (pmc->multi.imr_multiaddr.s_addr == loc_addr &&
+		    pmc->multi.imr_ifindex == dif)
+			break;
+	}
+	if (!pmc)
+		return 0;
+	psl = pmc->sflist;
+	if (!psl)
+		return pmc->sfmode == MCAST_EXCLUDE;
+
+	for (i=0; i<psl->sl_count; i++) {
+		if (psl->sl_addr[i] == rmt_addr)
+			break;
+	}
+	if (pmc->sfmode == MCAST_INCLUDE && i < psl->sl_count)
+		return 1;
+	if (pmc->sfmode == MCAST_EXCLUDE && i >= psl->sl_count)
+		return 1;
+	return 0;
+}
+
 /*
  *	A socket is closing.
  */
@@ -740,6 +1932,7 @@
 		inet->mc_list = iml->next;
 
 		if ((in_dev = inetdev_by_index(iml->multi.imr_ifindex)) != NULL) {
+			(void) ip_mc_leave_src(sk, iml, in_dev);
 			ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr);
 			in_dev_put(in_dev);
 		}
@@ -749,19 +1942,33 @@
 	rtnl_unlock();
 }
 
-int ip_check_mc(struct in_device *in_dev, u32 mc_addr)
+int ip_check_mc(struct in_device *in_dev, u32 mc_addr, u32 src_addr, u16 proto)
 {
 	struct ip_mc_list *im;
+	struct ip_sf_list *psf;
+	int rv = 0;
 
 	read_lock(&in_dev->lock);
 	for (im=in_dev->mc_list; im; im=im->next) {
-		if (im->multiaddr == mc_addr) {
-			read_unlock(&in_dev->lock);
-			return 1;
+		if (im->multiaddr == mc_addr)
+			break;
+	}
+	if (im && proto == IPPROTO_IGMP) {
+		rv = 1;
+	} else if (im) {
+		for (psf=im->sources; psf; psf=psf->sf_next) {
+			if (psf->sf_inaddr == src_addr)
+				break;
 		}
+		if (psf)
+			rv = psf->sf_count[MCAST_INCLUDE] ||
+				psf->sf_count[MCAST_EXCLUDE] !=
+				im->sfcount[MCAST_EXCLUDE];
+		else
+			rv = im->sfcount[MCAST_EXCLUDE] != 0;
 	}
 	read_unlock(&in_dev->lock);
-	return 0;
+	return rv;
 }
 
 
@@ -822,5 +2029,101 @@
 		len=0;
 	return len;
 }
+
+int ip_mcf_procinfo(char *buffer, char **start, off_t offset, int length)
+{
+	off_t pos=0, begin=0;
+	int len=0;
+	int first = 1;
+	struct net_device *dev;
+
+	read_lock(&dev_base_lock);
+	for(dev=dev_base; dev; dev=dev->next) {
+		struct in_device *in_dev = in_dev_get(dev);
+		struct ip_mc_list *imc;
+
+		if (in_dev == NULL)
+			continue;
+
+		read_lock(&in_dev->lock);
+
+		for (imc=in_dev->mc_list; imc; imc=imc->next) {
+			struct ip_sf_list *psf;
+			unsigned long icount, xcount;
+
+			spin_lock_bh(&imc->lock);
+			icount = imc->sfcount[MCAST_INCLUDE];
+			xcount = imc->sfcount[MCAST_EXCLUDE];
+			for (psf=imc->sources; psf; psf=psf->sf_next) {
+				if (first) {
+					len += sprintf(buffer+len, "%3s %6s "
+						"%10s %10s %6s %6s\n", "Idx",
+						"Device", "MCA", "SRC", "INC",
+						"EXC");
+					first = 0;
+				}
+				len += sprintf(buffer+len, "%3d %6.6s 0x%08x "
+					"0x%08x %6lu %6lu\n", dev->ifindex,
+					dev->name, ntohl(imc->multiaddr),
+					ntohl(psf->sf_inaddr),
+					psf->sf_count[MCAST_INCLUDE],
+					psf->sf_count[MCAST_EXCLUDE]);
+				pos=begin+len;
+				if(pos<offset)
+				{
+					len=0;
+					begin=pos;
+				}
+				if(pos>offset+length) {
+					spin_unlock_bh(&imc->lock);
+					read_unlock(&in_dev->lock);
+					in_dev_put(in_dev);
+					goto done;
+				}
+				icount -= psf->sf_count[MCAST_INCLUDE];
+				xcount -= psf->sf_count[MCAST_EXCLUDE];
+			}
+			if (icount > 0 || xcount > 0) {
+				if (first) {
+					len += sprintf(buffer+len, "%3s %6s "
+						"%10s %10s %6s %6s\n", "Idx",
+						"Device", "MCA", "SRC", "INC",
+						"EXC");
+					first = 0;
+				}
+				len += sprintf(buffer+len, "%3d %6.6s 0x%08x "
+					"%10s %6lu %6lu\n", dev->ifindex,
+					dev->name, ntohl(imc->multiaddr),
+					"NONE", icount, xcount);
+				pos=begin+len;
+				if(pos<offset)
+				{
+					len=0;
+					begin=pos;
+				}
+				if(pos>offset+length) {
+					spin_unlock_bh(&imc->lock);
+					read_unlock(&in_dev->lock);
+					in_dev_put(in_dev);
+					goto done;
+				}
+			}
+			spin_unlock_bh(&imc->lock);
+		}
+		read_unlock(&in_dev->lock);
+		in_dev_put(in_dev);
+	}
+done:
+	read_unlock(&dev_base_lock);
+
+	*start=buffer+(offset-begin);
+	len-=(offset-begin);
+	if(len>length)
+		len=length;
+	if(len<0)
+		len=0;
+	return len;
+}
+
 #endif
 
diff -Nru a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
--- a/net/ipv4/ip_gre.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv4/ip_gre.c	Sat Apr 19 19:51:49 2003
@@ -262,12 +262,10 @@
 	if (!create)
 		return NULL;
 
-	MOD_INC_USE_COUNT;
 	dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL);
-	if (dev == NULL) {
-		MOD_DEC_USE_COUNT;
+	if (dev == NULL)
 		return NULL;
-	}
+
 	memset(dev, 0, sizeof(*dev) + sizeof(*t));
 	dev->priv = (void*)(dev+1);
 	nt = (struct ip_tunnel*)dev->priv;
@@ -287,6 +285,7 @@
 			goto failed;
 		memcpy(nt->parms.name, dev->name, IFNAMSIZ);
 	}
+	SET_MODULE_OWNER(dev);
 	if (register_netdevice(dev) < 0)
 		goto failed;
 
@@ -297,16 +296,13 @@
 
 failed:
 	kfree(dev);
-	MOD_DEC_USE_COUNT;
 	return NULL;
 }
 
 static void ipgre_tunnel_destructor(struct net_device *dev)
 {
-	if (dev != &ipgre_fb_tunnel_dev) {
+	if (dev != &ipgre_fb_tunnel_dev)
 		kfree(dev);
-		MOD_DEC_USE_COUNT;
-	}
 }
 
 static void ipgre_tunnel_uninit(struct net_device *dev)
@@ -920,8 +916,6 @@
 	struct ip_tunnel_parm p;
 	struct ip_tunnel *t;
 
-	MOD_INC_USE_COUNT;
-
 	switch (cmd) {
 	case SIOCGETTUNNEL:
 		t = NULL;
@@ -1035,7 +1029,6 @@
 	}
 
 done:
-	MOD_DEC_USE_COUNT;
 	return err;
 }
 
@@ -1115,7 +1108,6 @@
 {
 	struct ip_tunnel *t = (struct ip_tunnel*)dev->priv;
 
-	MOD_INC_USE_COUNT;
 	if (MULTICAST(t->parms.iph.daddr)) {
 		struct flowi fl = { .oif = t->parms.link,
 				    .nl_u = { .ip4_u =
@@ -1124,16 +1116,12 @@
 						.tos = RT_TOS(t->parms.iph.tos) } },
 				    .proto = IPPROTO_GRE };
 		struct rtable *rt;
-		if (ip_route_output_key(&rt, &fl)) {
-			MOD_DEC_USE_COUNT;
+		if (ip_route_output_key(&rt, &fl))
 			return -EADDRNOTAVAIL;
-		}
 		dev = rt->u.dst.dev;
 		ip_rt_put(rt);
-		if (__in_dev_get(dev) == NULL) {
-			MOD_DEC_USE_COUNT;
+		if (__in_dev_get(dev) == NULL)
 			return -EADDRNOTAVAIL;
-		}
 		t->mlink = dev->ifindex;
 		ip_mc_inc_group(__in_dev_get(dev), t->parms.iph.daddr);
 	}
@@ -1150,7 +1138,6 @@
 			in_dev_put(in_dev);
 		}
 	}
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
@@ -1244,30 +1231,12 @@
 	return 0;
 }
 
-#ifdef MODULE
-static int ipgre_fb_tunnel_open(struct net_device *dev)
-{
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-static int ipgre_fb_tunnel_close(struct net_device *dev)
-{
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-#endif
-
 int __init ipgre_fb_tunnel_init(struct net_device *dev)
 {
 	struct ip_tunnel *tunnel = (struct ip_tunnel*)dev->priv;
 	struct iphdr *iph;
 
 	ipgre_tunnel_init_gen(dev);
-#ifdef MODULE
-	dev->open		= ipgre_fb_tunnel_open;
-	dev->stop		= ipgre_fb_tunnel_close;
-#endif
 
 	iph = &ipgre_fb_tunnel.parms.iph;
 	iph->version		= 4;
@@ -1291,11 +1260,7 @@
  *	And now the modules code and kernel interface.
  */
 
-#ifdef MODULE
-int init_module(void) 
-#else
 int __init ipgre_init(void)
-#endif
 {
 	printk(KERN_INFO "GRE over IPv4 tunneling driver\n");
 
@@ -1305,13 +1270,12 @@
 	}
 
 	ipgre_fb_tunnel_dev.priv = (void*)&ipgre_fb_tunnel;
+	SET_MODULE_OWNER(&ipgre_fb_tunnel_dev);
 	register_netdev(&ipgre_fb_tunnel_dev);
 	return 0;
 }
 
-#ifdef MODULE
-
-void cleanup_module(void)
+void ipgre_fini(void)
 {
 	if (inet_del_protocol(&ipgre_protocol, IPPROTO_GRE) < 0)
 		printk(KERN_INFO "ipgre close: can't remove protocol\n");
@@ -1319,5 +1283,8 @@
 	unregister_netdev(&ipgre_fb_tunnel_dev);
 }
 
+#ifdef MODULE
+module_init(ipgre_init);
 #endif
+module_exit(ipgre_fini);
 MODULE_LICENSE("GPL");
diff -Nru a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
--- a/net/ipv4/ip_output.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/ip_output.c	Sat Apr 19 19:51:50 2003
@@ -1312,5 +1312,6 @@
 
 #ifdef CONFIG_IP_MULTICAST
 	proc_net_create("igmp", 0, ip_mc_procinfo);
+	proc_net_create("mcfilter", 0, ip_mcf_procinfo);
 #endif
 }
diff -Nru a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
--- a/net/ipv4/ip_sockglue.c	Sat Apr 19 19:51:30 2003
+++ b/net/ipv4/ip_sockglue.c	Sat Apr 19 19:51:30 2003
@@ -610,9 +610,67 @@
 			}
 
 			if (optname == IP_ADD_MEMBERSHIP)
-				err = ip_mc_join_group(sk,&mreq);
+				err = ip_mc_join_group(sk, &mreq);
 			else
-				err = ip_mc_leave_group(sk,&mreq);
+				err = ip_mc_leave_group(sk, &mreq);
+			break;
+		}
+		case IP_MSFILTER:
+		{
+			struct ip_msfilter *msf;
+
+			if (optlen < IP_MSFILTER_SIZE(0))
+				goto e_inval;
+			msf = (struct ip_msfilter *)kmalloc(optlen, GFP_KERNEL);
+			if (msf == 0) {
+				err = -ENOBUFS;
+				break;
+			}
+			err = -EFAULT;
+			if (copy_from_user(msf, optval, optlen)) {
+				kfree(msf);
+				break;
+			}
+			err = ip_mc_msfilter(sk, msf);
+			kfree(msf);
+			break;
+		}
+		case IP_BLOCK_SOURCE:
+		case IP_UNBLOCK_SOURCE:
+		case IP_ADD_SOURCE_MEMBERSHIP:
+		case IP_DROP_SOURCE_MEMBERSHIP:
+		{
+			struct ip_mreq_source mreqs;
+			int omode, add;
+
+			if (optlen != sizeof(struct ip_mreq_source))
+				goto e_inval;
+			if (copy_from_user(&mreqs, optval, sizeof(mreqs))) {
+				err = -EFAULT;
+				break;
+			}
+			if (optname == IP_BLOCK_SOURCE) {
+				omode = MCAST_EXCLUDE;
+				add = 1;
+			} else if (optname == IP_UNBLOCK_SOURCE) {
+				omode = MCAST_EXCLUDE;
+				add = 0;
+			} else if (optname == IP_ADD_SOURCE_MEMBERSHIP) {
+				struct ip_mreqn mreq;
+
+				mreq.imr_multiaddr.s_addr = mreqs.imr_multiaddr;
+				mreq.imr_address.s_addr = mreqs.imr_interface;
+				mreq.imr_ifindex = 0;
+				err = ip_mc_join_group(sk, &mreq);
+				if (err)
+					break;
+				omode = MCAST_INCLUDE;
+				add = 1;
+			} else /*IP_DROP_SOURCE_MEMBERSHIP */ {
+				omode = MCAST_INCLUDE;
+				add = 0;
+			}
+			err = ip_mc_source(add, omode, sk, &mreqs);
 			break;
 		}
 		case IP_ROUTER_ALERT:	
@@ -762,6 +820,20 @@
 			if(copy_to_user((void *)optval, &addr, len))
 				return -EFAULT;
 			return 0;
+		}
+		case IP_MSFILTER:
+		{
+			struct ip_msfilter msf;
+			int err;
+
+			if (len < IP_MSFILTER_SIZE(0))
+				return -EINVAL;
+			if (copy_from_user(&msf, optval, IP_MSFILTER_SIZE(0)))
+				return -EFAULT;
+			err = ip_mc_msfget(sk, &msf,
+				(struct ip_msfilter *)optval, optlen);
+			release_sock(sk);
+			return err;
 		}
 		case IP_PKTOPTIONS:		
 		{
diff -Nru a/net/ipv4/ipcomp.c b/net/ipv4/ipcomp.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/net/ipv4/ipcomp.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,371 @@
+/*
+ * IP Payload Compression Protocol (IPComp) - RFC3713.
+ *
+ * Copyright (c) 2003 James Morris <jmorris@intercode.com.au>
+ *
+ * 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.
+ *
+ * Todo:
+ *   - Tunable compression parameters.
+ *   - Compression stats.
+ *   - Adaptive compression.
+ */
+#include <linux/config.h>
+#include <linux/module.h>
+#include <asm/scatterlist.h>
+#include <linux/crypto.h>
+#include <linux/pfkeyv2.h>
+#include <net/ip.h>
+#include <net/xfrm.h>
+#include <net/icmp.h>
+#include <net/esp.h>
+
+#define IPCOMP_SCRATCH_SIZE	65400
+
+struct ipcomp_hdr {
+	u8 nexthdr;
+	u8 flags;
+	u16 cpi;
+};
+
+struct ipcomp_data {
+	u16 threshold;
+	u8 *scratch;
+	struct crypto_tfm *tfm;
+};
+
+static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb)
+{
+	int err, plen, dlen;
+	struct iphdr *iph;
+	struct ipcomp_data *ipcd = x->data;
+	u8 *start, *scratch = ipcd->scratch;
+	
+	plen = skb->len;
+	dlen = IPCOMP_SCRATCH_SIZE;
+	start = skb->data;
+
+	err = crypto_comp_decompress(ipcd->tfm, start, plen, scratch, &dlen);
+	if (err)
+		goto out;
+
+	if (dlen < (plen + sizeof(struct ipcomp_hdr))) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	err = pskb_expand_head(skb, 0, dlen - plen, GFP_ATOMIC);
+	if (err)
+		goto out;
+		
+	skb_put(skb, dlen - plen);
+	memcpy(skb->data, scratch, dlen);
+	iph = skb->nh.iph;
+	iph->tot_len = htons(dlen + iph->ihl * 4);
+out:	
+	return err;
+}
+
+static int ipcomp_input(struct xfrm_state *x,
+                        struct xfrm_decap_state *decap, struct sk_buff *skb)
+{
+	u8 nexthdr;
+	int err = 0;
+	struct iphdr *iph;
+	union {
+		struct iphdr	iph;
+		char 		buf[60];
+	} tmp_iph;
+
+
+	if ((skb_is_nonlinear(skb) || skb_cloned(skb)) &&
+	    skb_linearize(skb, GFP_ATOMIC) != 0) {
+	    	err = -ENOMEM;
+	    	goto out;
+	}
+
+	skb->ip_summed = CHECKSUM_NONE;
+
+	/* Remove ipcomp header and decompress original payload */	
+	iph = skb->nh.iph;
+	memcpy(&tmp_iph, iph, iph->ihl * 4);
+	nexthdr = *(u8 *)skb->data;
+	skb_pull(skb, sizeof(struct ipcomp_hdr));
+	memcpy(skb->nh.raw, &tmp_iph, tmp_iph.iph.ihl * 4);
+	iph->tot_len = htons(ntohs(iph->tot_len) - sizeof(struct ipcomp_hdr));
+	iph->protocol = nexthdr;
+	skb->h.raw = skb->data;
+	err = ipcomp_decompress(x, skb);
+
+out:	
+	return err;
+}
+
+static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb)
+{
+	int err, plen, dlen, ihlen;
+	struct iphdr *iph = skb->nh.iph;
+	struct ipcomp_data *ipcd = x->data;
+	u8 *start, *scratch = ipcd->scratch;
+	
+	ihlen = iph->ihl * 4;
+	plen = skb->len - ihlen;
+	dlen = IPCOMP_SCRATCH_SIZE;
+	start = skb->data + ihlen;
+
+	err = crypto_comp_compress(ipcd->tfm, start, plen, scratch, &dlen);
+	if (err)
+		goto out;
+
+	if ((dlen + sizeof(struct ipcomp_hdr)) >= plen) {
+		err = -EMSGSIZE;
+		goto out;
+	}
+	
+	memcpy(start, scratch, dlen);
+	pskb_trim(skb, ihlen + dlen);
+	
+out:	
+	return err;
+}
+
+static void ipcomp_tunnel_encap(struct xfrm_state *x, struct sk_buff *skb)
+{
+	struct dst_entry *dst = skb->dst;
+	struct iphdr *iph, *top_iph;
+
+	iph = skb->nh.iph;
+	top_iph = (struct iphdr *)skb_push(skb, sizeof(struct iphdr));
+	top_iph->ihl = 5;
+	top_iph->version = 4;
+	top_iph->tos = iph->tos;
+	top_iph->tot_len = htons(skb->len);
+	if (!(iph->frag_off&htons(IP_DF)))
+		__ip_select_ident(top_iph, dst, 0);
+	top_iph->ttl = iph->ttl;
+	top_iph->check = 0;
+	top_iph->saddr = x->props.saddr.a4;
+	top_iph->daddr = x->id.daddr.a4;
+	top_iph->frag_off = iph->frag_off&~htons(IP_MF|IP_OFFSET);
+	memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
+	skb->nh.raw = skb->data;
+}
+
+static int ipcomp_output(struct sk_buff *skb)
+{
+	int err;
+	struct dst_entry *dst = skb->dst;
+	struct xfrm_state *x = dst->xfrm;
+	struct iphdr *iph, *top_iph;
+	struct ipcomp_hdr *ipch;
+	struct ipcomp_data *ipcd = x->data;
+	union {
+		struct iphdr	iph;
+		char 		buf[60];
+	} tmp_iph;
+
+	if (skb->ip_summed == CHECKSUM_HW && skb_checksum_help(skb) == NULL) {
+		err = -EINVAL;
+		goto error_nolock;
+	}
+
+	spin_lock_bh(&x->lock);
+	
+	if ((err = xfrm_state_check_expire(x)) != 0)
+		goto error;
+	if ((err = xfrm_state_check_space(x, skb)) != 0)
+		goto error;
+
+	/* Don't bother compressing */
+	if (skb->len < ipcd->threshold) {
+		if (x->props.mode) {
+			ipcomp_tunnel_encap(x, skb);
+			iph = skb->nh.iph;
+			iph->protocol = IPPROTO_IPIP;
+			ip_send_check(iph);
+		}
+		goto out_ok;
+	}
+
+	if (x->props.mode) 
+		ipcomp_tunnel_encap(x, skb);
+
+	if ((skb_is_nonlinear(skb) || skb_cloned(skb)) &&
+	    skb_linearize(skb, GFP_ATOMIC) != 0) {
+	    	err = -ENOMEM;
+	    	goto error;
+	}
+	
+	err = ipcomp_compress(x, skb);
+	if (err) {
+		if (err == -EMSGSIZE) {
+			if (x->props.mode) {
+				iph = skb->nh.iph;
+				iph->protocol = IPPROTO_IPIP;
+				ip_send_check(iph);
+			}
+			goto out_ok;
+		}
+		goto error;
+	}
+
+	/* Install ipcomp header, convert into ipcomp datagram. */
+	iph = skb->nh.iph;
+	memcpy(&tmp_iph, iph, iph->ihl * 4);
+	top_iph = (struct iphdr *)skb_push(skb, sizeof(struct ipcomp_hdr));
+	memcpy(top_iph, &tmp_iph, iph->ihl * 4);
+	iph = top_iph;
+	iph->tot_len = htons(skb->len);
+	iph->protocol = IPPROTO_COMP;
+	iph->check = 0;
+	ipch = (struct ipcomp_hdr *)((char *)iph + iph->ihl * 4);
+	ipch->nexthdr = x->props.mode ? IPPROTO_IPIP : tmp_iph.iph.protocol;
+	ipch->flags = 0;
+	ipch->cpi = htons((u16 )ntohl(x->id.spi));
+	ip_send_check(iph);
+	skb->nh.raw = skb->data;
+
+out_ok:
+	x->curlft.bytes += skb->len;
+	x->curlft.packets++;
+	spin_unlock_bh(&x->lock);
+	
+	if ((skb->dst = dst_pop(dst)) == NULL) {
+		err = -EHOSTUNREACH;
+		goto error_nolock;
+	}
+	err = NET_XMIT_BYPASS;
+
+out_exit:
+	return err;
+error:
+	spin_unlock_bh(&x->lock);
+error_nolock:
+	kfree_skb(skb);
+	goto out_exit;
+}
+
+static void ipcomp4_err(struct sk_buff *skb, u32 info)
+{
+	u32 spi;
+	struct iphdr *iph = (struct iphdr *)skb->data;
+	struct ipcomp_hdr *ipch = (struct ipcomp_hdr *)(skb->data+(iph->ihl<<2));
+	struct xfrm_state *x;
+
+	if (skb->h.icmph->type != ICMP_DEST_UNREACH ||
+	    skb->h.icmph->code != ICMP_FRAG_NEEDED)
+		return;
+
+	spi = ntohl(ntohs(ipch->cpi));
+	x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr,
+	                      spi, IPPROTO_COMP, AF_INET);
+	if (!x)
+		return;
+	printk(KERN_DEBUG "pmtu discvovery on SA IPCOMP/%08x/%u.%u.%u.%u\n",
+	       spi, NIPQUAD(iph->daddr));
+	xfrm_state_put(x);
+}
+
+static void ipcomp_free_data(struct ipcomp_data *ipcd)
+{
+	if (ipcd->tfm)
+		crypto_free_tfm(ipcd->tfm);
+	if (ipcd->scratch)
+		kfree(ipcd->scratch);	
+}
+
+static void ipcomp_destroy(struct xfrm_state *x)
+{
+	struct ipcomp_data *ipcd = x->data;
+	ipcomp_free_data(ipcd);
+	kfree(ipcd);
+}
+
+static int ipcomp_init_state(struct xfrm_state *x, void *args)
+{
+	int err = -ENOMEM;
+	struct ipcomp_data *ipcd;
+	struct xfrm_algo_desc *calg_desc;
+
+	ipcd = kmalloc(sizeof(*ipcd), GFP_KERNEL);
+	if (!ipcd)
+		goto error;
+
+	memset(ipcd, 0, sizeof(*ipcd));
+	x->props.header_len = sizeof(struct ipcomp_hdr);
+	if (x->props.mode)
+		x->props.header_len += sizeof(struct iphdr);
+	x->data = ipcd;
+
+	ipcd->scratch = kmalloc(IPCOMP_SCRATCH_SIZE, GFP_KERNEL);
+	if (!ipcd->scratch)
+		goto error;
+	
+	ipcd->tfm = crypto_alloc_tfm(x->calg->alg_name, 0);
+	if (!ipcd->tfm)
+		goto error;
+
+	calg_desc = xfrm_calg_get_byname(x->calg->alg_name);
+	BUG_ON(!calg_desc);
+	ipcd->threshold = calg_desc->uinfo.comp.threshold;
+	err = 0;
+out:
+	return err;
+
+error:
+	if (ipcd) {
+		ipcomp_free_data(ipcd);
+		kfree(ipcd);
+	}
+	goto out;
+}
+
+static struct xfrm_type ipcomp_type =
+{
+	.description	= "IPCOMP4",
+	.proto	     	= IPPROTO_COMP,
+	.init_state	= ipcomp_init_state,
+	.destructor	= ipcomp_destroy,
+	.input		= ipcomp_input,
+	.output		= ipcomp_output
+};
+
+static struct inet_protocol ipcomp4_protocol = {
+	.handler	=	xfrm4_rcv,
+	.err_handler	=	ipcomp4_err,
+	.no_policy	=	1,
+};
+
+static int __init ipcomp4_init(void)
+{
+	SET_MODULE_OWNER(&ipcomp_type);
+	if (xfrm_register_type(&ipcomp_type, AF_INET) < 0) {
+		printk(KERN_INFO "ipcomp init: can't add xfrm type\n");
+		return -EAGAIN;
+	}
+	if (inet_add_protocol(&ipcomp4_protocol, IPPROTO_COMP) < 0) {
+		printk(KERN_INFO "ipcomp init: can't add protocol\n");
+		xfrm_unregister_type(&ipcomp_type, AF_INET);
+		return -EAGAIN;
+	}
+	return 0;
+}
+
+static void __exit ipcomp4_fini(void)
+{
+	if (inet_del_protocol(&ipcomp4_protocol, IPPROTO_COMP) < 0)
+		printk(KERN_INFO "ip ipcomp close: can't remove protocol\n");
+	if (xfrm_unregister_type(&ipcomp_type, AF_INET) < 0)
+		printk(KERN_INFO "ip ipcomp close: can't remove xfrm type\n");
+}
+
+module_init(ipcomp4_init);
+module_exit(ipcomp4_fini);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("IP Payload Compression Protocol (IPComp) - RFC3713");
+MODULE_AUTHOR("James Morris <jmorris@intercode.com.au>");
+
diff -Nru a/net/ipv4/ipip.c b/net/ipv4/ipip.c
--- a/net/ipv4/ipip.c	Sat Apr 19 19:51:51 2003
+++ b/net/ipv4/ipip.c	Sat Apr 19 19:51:51 2003
@@ -115,6 +115,7 @@
 #include <net/protocol.h>
 #include <net/ipip.h>
 #include <net/inet_ecn.h>
+#include <net/xfrm.h>
 
 #define HASH_SIZE  16
 #define HASH(addr) ((addr^(addr>>4))&0xF)
@@ -207,7 +208,7 @@
 	write_unlock_bh(&ipip_lock);
 }
 
-struct ip_tunnel * ipip_tunnel_locate(struct ip_tunnel_parm *parms, int create)
+static struct ip_tunnel * ipip_tunnel_locate(struct ip_tunnel_parm *parms, int create)
 {
 	u32 remote = parms->iph.daddr;
 	u32 local = parms->iph.saddr;
@@ -231,12 +232,10 @@
 	if (!create)
 		return NULL;
 
-	MOD_INC_USE_COUNT;
 	dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL);
-	if (dev == NULL) {
-		MOD_DEC_USE_COUNT;
+	if (dev == NULL)
 		return NULL;
-	}
+
 	memset(dev, 0, sizeof(*dev) + sizeof(*t));
 	dev->priv = (void*)(dev+1);
 	nt = (struct ip_tunnel*)dev->priv;
@@ -256,6 +255,7 @@
 			goto failed;
 		memcpy(nt->parms.name, dev->name, IFNAMSIZ);
 	}
+	SET_MODULE_OWNER(dev);
 	if (register_netdevice(dev) < 0)
 		goto failed;
 
@@ -266,16 +266,13 @@
 
 failed:
 	kfree(dev);
-	MOD_DEC_USE_COUNT;
 	return NULL;
 }
 
 static void ipip_tunnel_destructor(struct net_device *dev)
 {
-	if (dev != &ipip_fb_tunnel_dev) {
+	if (dev != &ipip_fb_tunnel_dev)
 		kfree(dev);
-		MOD_DEC_USE_COUNT;
-	}
 }
 
 static void ipip_tunnel_uninit(struct net_device *dev)
@@ -289,7 +286,7 @@
 	dev_put(dev);
 }
 
-void ipip_err(struct sk_buff *skb, u32 info)
+static void ipip_err(struct sk_buff *skb, void *__unused)
 {
 #ifndef I_WISH_WORLD_WERE_PERFECT
 
@@ -472,14 +469,16 @@
 #endif
 }
 
-static inline void ipip_ecn_decapsulate(struct iphdr *iph, struct sk_buff *skb)
+static inline void ipip_ecn_decapsulate(struct iphdr *outer_iph, struct sk_buff *skb)
 {
-	if (INET_ECN_is_ce(iph->tos) &&
-	    INET_ECN_is_not_ce(skb->nh.iph->tos))
-		IP_ECN_set_ce(iph);
+	struct iphdr *inner_iph = skb->nh.iph;
+
+	if (INET_ECN_is_ce(outer_iph->tos) &&
+	    INET_ECN_is_not_ce(inner_iph->tos))
+		IP_ECN_set_ce(inner_iph);
 }
 
-int ipip_rcv(struct sk_buff *skb)
+static int ipip_rcv(struct sk_buff *skb)
 {
 	struct iphdr *iph;
 	struct ip_tunnel *tunnel;
@@ -515,10 +514,8 @@
 	}
 	read_unlock(&ipip_lock);
 
-	icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PROT_UNREACH, 0);
 out:
-	kfree_skb(skb);
-	return 0;
+	return -1;
 }
 
 /*
@@ -682,8 +679,6 @@
 	struct ip_tunnel_parm p;
 	struct ip_tunnel *t;
 
-	MOD_INC_USE_COUNT;
-
 	switch (cmd) {
 	case SIOCGETTUNNEL:
 		t = NULL;
@@ -782,7 +777,6 @@
 	}
 
 done:
-	MOD_DEC_USE_COUNT;
 	return err;
 }
 
@@ -858,29 +852,11 @@
 	return 0;
 }
 
-#ifdef MODULE
-static int ipip_fb_tunnel_open(struct net_device *dev)
-{
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-static int ipip_fb_tunnel_close(struct net_device *dev)
-{
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-#endif
-
-int __init ipip_fb_tunnel_init(struct net_device *dev)
+static int __init ipip_fb_tunnel_init(struct net_device *dev)
 {
 	struct iphdr *iph;
 
 	ipip_tunnel_init_gen(dev);
-#ifdef MODULE
-	dev->open		= ipip_fb_tunnel_open;
-	dev->stop		= ipip_fb_tunnel_close;
-#endif
 
 	iph = &ipip_fb_tunnel.parms.iph;
 	iph->version		= 4;
@@ -892,7 +868,7 @@
 	return 0;
 }
 
-static struct inet_protocol ipip_protocol = {
+static struct xfrm_tunnel ipip_handler = {
 	.handler	=	ipip_rcv,
 	.err_handler	=	ipip_err,
 };
@@ -904,20 +880,21 @@
 {
 	printk(banner);
 
-	if (inet_add_protocol(&ipip_protocol, IPPROTO_IPIP) < 0) {
-		printk(KERN_INFO "ipip init: can't add protocol\n");
+	if (xfrm4_tunnel_register(&ipip_handler) < 0) {
+		printk(KERN_INFO "ipip init: can't register tunnel\n");
 		return -EAGAIN;
 	}
 
 	ipip_fb_tunnel_dev.priv = (void*)&ipip_fb_tunnel;
+	SET_MODULE_OWNER(&ipip_fb_tunnel_dev);
 	register_netdev(&ipip_fb_tunnel_dev);
 	return 0;
 }
 
 static void __exit ipip_fini(void)
 {
-	if (inet_del_protocol(&ipip_protocol, IPPROTO_IPIP) < 0)
-		printk(KERN_INFO "ipip close: can't remove protocol\n");
+	if (xfrm4_tunnel_deregister(&ipip_handler) < 0)
+		printk(KERN_INFO "ipip close: can't deregister tunnel\n");
 
 	unregister_netdev(&ipip_fb_tunnel_dev);
 }
diff -Nru a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
--- a/net/ipv4/netfilter/arp_tables.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/netfilter/arp_tables.c	Sat Apr 19 19:51:50 2003
@@ -253,6 +253,10 @@
 	const char *indev, *outdev;
 	void *table_base;
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	indev = in ? in->name : nulldevname;
 	outdev = out ? out->name : nulldevname;
 
diff -Nru a/net/ipv4/netfilter/ip_conntrack_amanda.c b/net/ipv4/netfilter/ip_conntrack_amanda.c
--- a/net/ipv4/netfilter/ip_conntrack_amanda.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv4/netfilter/ip_conntrack_amanda.c	Sat Apr 19 19:51:49 2003
@@ -37,14 +37,8 @@
 MODULE_PARM_DESC(master_timeout, "timeout for the master connection");
 
 DECLARE_LOCK(ip_amanda_lock);
-struct module *ip_conntrack_amanda = THIS_MODULE;
 
-#define MAXMATCHLEN	6
-struct conn conns[NUM_MSGS] = {
-	{"DATA ", 5},
-	{"MESG ", 5},
-	{"INDEX ", 6},
-};
+char *conns[] = { "DATA ", "MESG ", "INDEX " };
 
 #if 0
 #define DEBUGP printk
@@ -52,18 +46,15 @@
 #define DEBUGP(format, args...)
 #endif
 
+/* This is slow, but it's simple. --RR */
+static char amanda_buffer[65536];
 
-/* FIXME: This should be in userspace.  Later. */
-static int help(const struct iphdr *iph, size_t len,
+static int help(struct sk_buff *skb,
 		struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
 {
-	struct udphdr *udph = (void *)iph + iph->ihl * 4;
-	u_int32_t udplen = len - iph->ihl * 4;
-	u_int32_t datalen = udplen - sizeof(struct udphdr);
-	char *data = (char *)udph + sizeof(struct udphdr);
-	char *datap = data;
-	char *data_limit = (char *) data + datalen;
+	char *data, *data_limit;
 	int dir = CTINFO2DIR(ctinfo);
+	unsigned int dataoff, i;
 	struct ip_ct_amanda *info =
 				(struct ip_ct_amanda *)&ct->help.ct_ftp_info;
 
@@ -79,121 +70,121 @@
 	if (dir == IP_CT_DIR_ORIGINAL)
 		return NF_ACCEPT;
 
-	/* Not whole UDP header? */
-	if (udplen < sizeof(struct udphdr)) {
-		printk("ip_conntrack_amanda_help: udplen = %u\n",
-		       (unsigned)udplen);
+	/* No data? */
+	dataoff = skb->nh.iph->ihl*4 + sizeof(struct udphdr);
+	if (dataoff >= skb->len) {
+		if (net_ratelimit())
+			printk("ip_conntrack_amanda_help: skblen = %u\n",
+			       (unsigned)skb->len);
 		return NF_ACCEPT;
 	}
 
-	/* Checksum invalid?  Ignore. */
-	if (csum_tcpudp_magic(iph->saddr, iph->daddr, udplen, IPPROTO_UDP,
-			      csum_partial((char *)udph, udplen, 0))) {
-		DEBUGP("ip_ct_talk_help: bad csum: %p %u %u.%u.%u.%u "
-		       "%u.%u.%u.%u\n",
-		       udph, udplen, NIPQUAD(iph->saddr),
-		       NIPQUAD(iph->daddr));
-		return NF_ACCEPT;
-	}
-	
+	LOCK_BH(&ip_amanda_lock);
+	skb_copy_bits(skb, dataoff, amanda_buffer, skb->len - dataoff);
+	data = amanda_buffer;
+	data_limit = amanda_buffer + skb->len - dataoff;
+	*data_limit = '\0';
+
 	/* Search for the CONNECT string */
-	while (data < data_limit) {
-		if (!memcmp(data, "CONNECT ", 8)) {
-			break;
-		}
-		data++;
-	}
-	if (memcmp(data, "CONNECT ", 8))
-		return NF_ACCEPT;
+	data = strstr(data, "CONNECT ");
+	if (!data)
+		goto out;
 
 	DEBUGP("ip_conntrack_amanda_help: CONNECT found in connection "
 		   "%u.%u.%u.%u:%u %u.%u.%u.%u:%u\n",
 		   NIPQUAD(iph->saddr), htons(udph->source),
 		   NIPQUAD(iph->daddr), htons(udph->dest));
-	data += 8;
-	while (*data != 0x0a && data < data_limit) {
+	data += strlen("CONNECT ");
 
-		int i;
-
-		for (i = 0; i < NUM_MSGS; i++) {
-			if (!memcmp(data, conns[i].match,
-				   conns[i].matchlen)) {
-
-				char *portchr;
-				struct ip_conntrack_expect expect;
-				struct ip_ct_amanda_expect
-				    *exp_amanda_info =
-					&expect.help.exp_amanda_info;
-
-				memset(&expect, 0, sizeof(expect));
-
-				data += conns[i].matchlen;
-				/* this is not really tcp, but let's steal an
-				 * idea from a tcp stream helper :-)
+	/* Only search first line. */	
+	if (strchr(data, '\n'))
+		*strchr(data, '\n') = '\0';
+
+	for (i = 0; i < ARRAY_SIZE(conns); i++) {
+		char *match = strstr(data, conns[i]);
+		if (match) {
+			char *portchr;
+			struct ip_conntrack_expect expect;
+			struct ip_ct_amanda_expect *exp_amanda_info =
+				&expect.help.exp_amanda_info;
+
+			memset(&expect, 0, sizeof(expect));
+
+			data += strlen(conns[i]);
+			/* this is not really tcp, but let's steal an
+			 * idea from a tcp stream helper :-) */
+			// XXX expect.seq = data - amanda_buffer;
+			exp_amanda_info->offset = data - amanda_buffer;
+// XXX DEBUGP("expect.seq = %p - %p = %d\n", data, amanda_buffer, expect.seq);
+DEBUGP("exp_amanda_info->offset = %p - %p = %d\n", data, amanda_buffer, exp_amanda_info->offset);
+			portchr = data;
+			exp_amanda_info->port = simple_strtoul(data, &data,10);
+			exp_amanda_info->len = data - portchr;
+
+			/* eat whitespace */
+			while (*data == ' ')
+				data++;
+			DEBUGP("ip_conntrack_amanda_help: "
+			       "CONNECT %s request with port "
+			       "%u found\n", conns[i],
+			       exp_amanda_info->port);
+
+			expect.tuple = ((struct ip_conntrack_tuple)
+				{ { ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip,
+				    { 0 } },
+				  { ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip,
+				    { htons(exp_amanda_info->port) },
+				    IPPROTO_TCP }});
+			expect.mask = ((struct ip_conntrack_tuple)
+				{ { 0, { 0 } },
+				  { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }});
+
+			expect.expectfn = NULL;
+
+			DEBUGP ("ip_conntrack_amanda_help: "
+				"expect_related: %u.%u.%u.%u:%u - "
+				"%u.%u.%u.%u:%u\n",
+				NIPQUAD(expect.tuple.src.ip),
+				ntohs(expect.tuple.src.u.tcp.port),
+				NIPQUAD(expect.tuple.dst.ip),
+				ntohs(expect.tuple.dst.u.tcp.port));
+			if (ip_conntrack_expect_related(ct, &expect)
+			    == -EEXIST) {
+				;
+				/* this must be a packet being resent */
+				/* XXX - how do I get the
+				 *       ip_conntrack_expect that
+				 *       already exists so that I can
+				 *       update the .seq so that the
+				 *       nat module rewrites the port
+				 *       numbers?
+				 *       Perhaps I should use the
+				 *       exp_amanda_info instead of
+				 *       .seq.
 				 */
-				// XXX expect.seq = data - datap;
-				exp_amanda_info->offset = data - datap;
-// XXX DEBUGP("expect.seq = %p - %p = %d\n", data, datap, expect.seq);
-DEBUGP("exp_amanda_info->offset = %p - %p = %d\n", data, datap, exp_amanda_info->offset);
-				portchr = data;
-				exp_amanda_info->port =
-				    simple_strtoul(data, &data, 10);
-				exp_amanda_info->len = data - portchr;
-
-				/* eat whitespace */
-				while (*data == ' ')
-					data++;
-				DEBUGP ("ip_conntrack_amanda_help: "
-					"CONNECT %s request with port "
-					"%u found\n", conns[i].match,
-					exp_amanda_info->port);
-
-				LOCK_BH(&ip_amanda_lock);
-
-				expect.tuple = ((struct ip_conntrack_tuple)
-						{ { ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip,
-						  { 0 } },
-				  		{ ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip,
-						  { htons(exp_amanda_info->port) },
-				    	  IPPROTO_TCP }});
-				expect.mask = ((struct ip_conntrack_tuple)
-							   { { 0, { 0 } },
-				  				 { 0xFFFFFFFF, { 0xFFFF }, 0xFFFF }});
-
-				expect.expectfn = NULL;
-
-				DEBUGP ("ip_conntrack_amanda_help: "
-					"expect_related: %u.%u.%u.%u:%u - "
-					"%u.%u.%u.%u:%u\n",
-					NIPQUAD(expect.tuple.src.ip),
-					ntohs(expect.tuple.src.u.tcp.port),
-					NIPQUAD(expect.tuple.dst.ip),
-					ntohs(expect.tuple.dst.u.tcp.port));
-				if (ip_conntrack_expect_related(ct, &expect) ==
-				    -EEXIST) {
-					;
-					/* this must be a packet being resent */
-					/* XXX - how do I get the
-					 *       ip_conntrack_expect that
-					 *       already exists so that I can
-					 *       update the .seq so that the
-					 *       nat module rewrites the port
-					 *       numbers?
-					 *       Perhaps I should use the
-					 *       exp_amanda_info instead of
-					 *       .seq.
-					 */
-				}
-				UNLOCK_BH(&ip_amanda_lock);
-			} /* if memcmp(conns) */
-		} /* for .. NUM_MSGS */
-		data++;
-	} /* while (*data != 0x0a && data < data_limit) */
-
+			}
+		}
+	}
+ out:
+	UNLOCK_BH(&ip_amanda_lock);
 	return NF_ACCEPT;
 }
 
-static struct ip_conntrack_helper amanda_helper;
+static struct ip_conntrack_helper amanda_helper = {
+	.max_expected = ARRAY_SIZE(conns),
+	.timeout = 180,
+	.flags = IP_CT_HELPER_F_REUSE_EXPECT,
+	.me = THIS_MODULE,
+	.help = help,
+	.name = "amanda",
+
+	.tuple = { .src = { .u = { __constant_htons(10080) } },
+		   .dst = { .protonum = IPPROTO_UDP },
+	},
+	.mask = { .src = { .u = { 0xFFFF } },
+		 .dst = { .protonum = 0xFFFF },
+	},
+};
 
 static void fini(void)
 {
@@ -205,20 +196,7 @@
 {
 	int ret;
 
-	memset(&amanda_helper, 0, sizeof(struct ip_conntrack_helper));
-	amanda_helper.tuple.src.u.udp.port = htons(10080);
-	amanda_helper.tuple.dst.protonum = IPPROTO_UDP;
-	amanda_helper.mask.src.u.udp.port = 0xFFFF;
-	amanda_helper.mask.dst.protonum = 0xFFFF;
-	amanda_helper.max_expected = NUM_MSGS;
-	amanda_helper.timeout = 180;
-	amanda_helper.flags = IP_CT_HELPER_F_REUSE_EXPECT;
-	amanda_helper.me = ip_conntrack_amanda;
-	amanda_helper.help = help;
-	amanda_helper.name = "amanda";
-
 	DEBUGP("ip_ct_amanda: registering helper for port 10080\n");
-
 	ret = ip_conntrack_helper_register(&amanda_helper);
 
 	if (ret) {
diff -Nru a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c
--- a/net/ipv4/netfilter/ip_conntrack_core.c	Sat Apr 19 19:51:27 2003
+++ b/net/ipv4/netfilter/ip_conntrack_core.c	Sat Apr 19 19:51:27 2003
@@ -120,31 +120,25 @@
 		% ip_conntrack_htable_size;
 }
 
-inline int
-get_tuple(const struct iphdr *iph, size_t len,
+int
+get_tuple(const struct iphdr *iph,
+	  const struct sk_buff *skb,
+	  unsigned int dataoff,
 	  struct ip_conntrack_tuple *tuple,
-	  struct ip_conntrack_protocol *protocol)
+	  const struct ip_conntrack_protocol *protocol)
 {
-	int ret;
-
 	/* Never happen */
 	if (iph->frag_off & htons(IP_OFFSET)) {
 		printk("ip_conntrack_core: Frag of proto %u.\n",
 		       iph->protocol);
 		return 0;
 	}
-	/* Guarantee 8 protocol bytes: if more wanted, use len param */
-	else if (iph->ihl * 4 + 8 > len)
-		return 0;
 
 	tuple->src.ip = iph->saddr;
 	tuple->dst.ip = iph->daddr;
 	tuple->dst.protonum = iph->protocol;
 
-	ret = protocol->pkt_to_tuple((u_int32_t *)iph + iph->ihl,
-				     len - 4*iph->ihl,
-				     tuple);
-	return ret;
+	return protocol->pkt_to_tuple(skb, dataoff, tuple);
 }
 
 static int
@@ -273,6 +267,8 @@
 		 * the un-established ones only */
 		if (exp->sibling) {
 			DEBUGP("remove_expectations: skipping established %p of %p\n", exp->sibling, ct);
+			/* Indicate that this expectations parent is dead */
+			exp->expectant = NULL;
 			continue;
 		}
 
@@ -324,6 +320,9 @@
 		ip_conntrack_destroyed(ct);
 
 	WRITE_LOCK(&ip_conntrack_lock);
+	/* Delete us from our own list to prevent corruption later */
+	list_del(&ct->sibling_list);
+
 	/* Delete our master expectation */
 	if (ct->master) {
 		/* can't call __unexpect_related here,
@@ -491,54 +490,40 @@
 		 enum ip_conntrack_info *ctinfo,
 		 unsigned int hooknum)
 {
-	const struct iphdr *iph;
-	struct icmphdr *hdr;
 	struct ip_conntrack_tuple innertuple, origtuple;
-	struct iphdr *inner;
-	size_t datalen;
+	struct {
+		struct icmphdr icmp;
+		struct iphdr ip;
+	} inside;
 	struct ip_conntrack_protocol *innerproto;
 	struct ip_conntrack_tuple_hash *h;
+	int dataoff;
 
-	IP_NF_ASSERT(iph->protocol == IPPROTO_ICMP);
 	IP_NF_ASSERT(skb->nfct == NULL);
 
-	iph = skb->nh.iph;
-	hdr = (struct icmphdr *)((u_int32_t *)iph + iph->ihl);
-	inner = (struct iphdr *)(hdr + 1);
-	datalen = skb->len - iph->ihl*4 - sizeof(*hdr);
-
-	if (skb->len < iph->ihl * 4 + sizeof(*hdr) + sizeof(*iph)) {
-		DEBUGP("icmp_error_track: too short\n");
+	/* Not enough header? */
+	if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &inside, sizeof(inside))!=0)
 		return NULL;
-	}
 
-	if (hdr->type != ICMP_DEST_UNREACH
-	    && hdr->type != ICMP_SOURCE_QUENCH
-	    && hdr->type != ICMP_TIME_EXCEEDED
-	    && hdr->type != ICMP_PARAMETERPROB
-	    && hdr->type != ICMP_REDIRECT)
+	if (inside.icmp.type != ICMP_DEST_UNREACH
+	    && inside.icmp.type != ICMP_SOURCE_QUENCH
+	    && inside.icmp.type != ICMP_TIME_EXCEEDED
+	    && inside.icmp.type != ICMP_PARAMETERPROB
+	    && inside.icmp.type != ICMP_REDIRECT)
 		return NULL;
 
 	/* Ignore ICMP's containing fragments (shouldn't happen) */
-	if (inner->frag_off & htons(IP_OFFSET)) {
+	if (inside.ip.frag_off & htons(IP_OFFSET)) {
 		DEBUGP("icmp_error_track: fragment of proto %u\n",
-		       inner->protocol);
-		return NULL;
-	}
-
-	/* Ignore it if the checksum's bogus. */
-	if (ip_compute_csum((unsigned char *)hdr, sizeof(*hdr) + datalen)) {
-		DEBUGP("icmp_error_track: bad csum\n");
+		       inside.ip.protocol);
 		return NULL;
 	}
 
-	innerproto = ip_ct_find_proto(inner->protocol);
+	innerproto = ip_ct_find_proto(inside.ip.protocol);
+	dataoff = skb->nh.iph->ihl*4 + sizeof(inside.icmp) + inside.ip.ihl*4;
 	/* Are they talking about one of our connections? */
-	if (inner->ihl * 4 + 8 > datalen
-	    || !get_tuple(inner, datalen, &origtuple, innerproto)) {
-		DEBUGP("icmp_error: ! get_tuple p=%u (%u*4+%u dlen=%u)\n",
-		       inner->protocol, inner->ihl, 8,
-		       datalen);
+	if (!get_tuple(&inside.ip, skb, dataoff, &origtuple, innerproto)) {
+		DEBUGP("icmp_error: ! get_tuple p=%u", inside.ip.protocol);
 		return NULL;
 	}
 
@@ -674,7 +659,7 @@
 	for (i=0; i < IP_CT_NUMBER; i++)
 		conntrack->infos[i].master = &conntrack->ct_general;
 
-	if (!protocol->new(conntrack, skb->nh.iph, skb->len)) {
+	if (!protocol->new(conntrack, skb)) {
 		kmem_cache_free(ip_conntrack_cachep, conntrack);
 		return NULL;
 	}
@@ -743,7 +728,7 @@
 
 	IP_NF_ASSERT((skb->nh.iph->frag_off & htons(IP_OFFSET)) == 0);
 
-	if (!get_tuple(skb->nh.iph, skb->len, &tuple, proto))
+	if (!get_tuple(skb->nh.iph, skb, skb->nh.iph->ihl*4, &tuple, proto))
 		return NULL;
 
 	/* look for tuple match */
@@ -842,7 +827,7 @@
 
 	IP_NF_ASSERT((*pskb)->nfct);
 
-	ret = proto->packet(ct, (*pskb)->nh.iph, (*pskb)->len, ctinfo);
+	ret = proto->packet(ct, *pskb, ctinfo);
 	if (ret == -1) {
 		/* Invalid */
 		nf_conntrack_put((*pskb)->nfct);
@@ -851,8 +836,7 @@
 	}
 
 	if (ret != NF_DROP && ct->helper) {
-		ret = ct->helper->help((*pskb)->nh.iph, (*pskb)->len,
-				       ct, ctinfo);
+		ret = ct->helper->help(*pskb, ct, ctinfo);
 		if (ret == -1) {
 			/* Invalid */
 			nf_conntrack_put((*pskb)->nfct);
diff -Nru a/net/ipv4/netfilter/ip_conntrack_ftp.c b/net/ipv4/netfilter/ip_conntrack_ftp.c
--- a/net/ipv4/netfilter/ip_conntrack_ftp.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/netfilter/ip_conntrack_ftp.c	Sat Apr 19 19:51:50 2003
@@ -11,6 +11,9 @@
 #include <linux/netfilter_ipv4/ip_conntrack_helper.h>
 #include <linux/netfilter_ipv4/ip_conntrack_ftp.h>
 
+/* This is slow, but it's simple. --RR */
+static char ftp_buffer[65536];
+
 DECLARE_LOCK(ip_ftp_lock);
 struct module *ip_conntrack_ftp = THIS_MODULE;
 
@@ -228,18 +231,14 @@
 	return 1;
 }
 
-/* FIXME: This should be in userspace.  Later. */
-static int help(const struct iphdr *iph, size_t len,
+static int help(struct sk_buff *skb,
 		struct ip_conntrack *ct,
 		enum ip_conntrack_info ctinfo)
 {
-	/* tcplen not negative guaranteed by ip_conntrack_tcp.c */
-	struct tcphdr *tcph = (void *)iph + iph->ihl * 4;
-	const char *data = (const char *)tcph + tcph->doff * 4;
-	unsigned int tcplen = len - iph->ihl * 4;
-	unsigned int datalen = tcplen - tcph->doff * 4;
+	unsigned int dataoff, datalen;
+	struct tcphdr tcph;
 	u_int32_t old_seq_aft_nl;
-	int old_seq_aft_nl_set;
+	int old_seq_aft_nl_set, ret;
 	u_int32_t array[6] = { 0 };
 	int dir = CTINFO2DIR(ctinfo);
 	unsigned int matchlen, matchoff;
@@ -257,45 +256,42 @@
 		return NF_ACCEPT;
 	}
 
-	/* Not whole TCP header? */
-	if (tcplen < sizeof(struct tcphdr) || tcplen < tcph->doff*4) {
-		DEBUGP("ftp: tcplen = %u\n", (unsigned)tcplen);
+	if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) != 0)
 		return NF_ACCEPT;
-	}
 
-	/* Checksum invalid?  Ignore. */
-	/* FIXME: Source route IP option packets --RR */
-	if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
-			 csum_partial((char *)tcph, tcplen, 0))) {
-		DEBUGP("ftp_help: bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
-		       tcph, tcplen, NIPQUAD(iph->saddr),
-		       NIPQUAD(iph->daddr));
+	dataoff = skb->nh.iph->ihl*4 + tcph.doff*4;
+	/* No data? */
+	if (dataoff >= skb->len) {
+		DEBUGP("ftp: skblen = %u\n", skb->len);
 		return NF_ACCEPT;
 	}
+	datalen = skb->len - dataoff;
 
 	LOCK_BH(&ip_ftp_lock);
+	skb_copy_bits(skb, dataoff, ftp_buffer, skb->len - dataoff);
+
 	old_seq_aft_nl_set = ct_ftp_info->seq_aft_nl_set[dir];
 	old_seq_aft_nl = ct_ftp_info->seq_aft_nl[dir];
 
 	DEBUGP("conntrack_ftp: datalen %u\n", datalen);
-	if ((datalen > 0) && (data[datalen-1] == '\n')) {
+	if (ftp_buffer[datalen - 1] == '\n') {
 		DEBUGP("conntrack_ftp: datalen %u ends in \\n\n", datalen);
 		if (!old_seq_aft_nl_set
-		    || after(ntohl(tcph->seq) + datalen, old_seq_aft_nl)) {
+		    || after(ntohl(tcph.seq) + datalen, old_seq_aft_nl)) {
 			DEBUGP("conntrack_ftp: updating nl to %u\n",
-			       ntohl(tcph->seq) + datalen);
+			       ntohl(tcph.seq) + datalen);
 			ct_ftp_info->seq_aft_nl[dir] = 
-						ntohl(tcph->seq) + datalen;
+						ntohl(tcph.seq) + datalen;
 			ct_ftp_info->seq_aft_nl_set[dir] = 1;
 		}
 	}
-	UNLOCK_BH(&ip_ftp_lock);
 
 	if(!old_seq_aft_nl_set ||
-			(ntohl(tcph->seq) != old_seq_aft_nl)) {
+			(ntohl(tcph.seq) != old_seq_aft_nl)) {
 		DEBUGP("ip_conntrack_ftp_help: wrong seq pos %s(%u)\n",
 		       old_seq_aft_nl_set ? "":"(UNSET) ", old_seq_aft_nl);
-		return NF_ACCEPT;
+		ret = NF_ACCEPT;
+		goto out;
 	}
 
 	/* Initialize IP array to expected address (it's not mentioned
@@ -308,7 +304,7 @@
 	for (i = 0; i < sizeof(search) / sizeof(search[0]); i++) {
 		if (search[i].dir != dir) continue;
 
-		found = find_pattern(data, datalen,
+		found = find_pattern(ftp_buffer, skb->len - dataoff,
 				     search[i].pattern,
 				     search[i].plen,
 				     search[i].skip,
@@ -326,22 +322,24 @@
 		if (net_ratelimit())
 			printk("conntrack_ftp: partial %s %u+%u\n",
 			       search[i].pattern,
-			       ntohl(tcph->seq), datalen);
-		return NF_DROP;
-	} else if (found == 0) /* No match */
-		return NF_ACCEPT;
+			       ntohl(tcph.seq), datalen);
+		ret = NF_DROP;
+		goto out;
+	} else if (found == 0) { /* No match */
+		ret = NF_ACCEPT;
+		goto out;
+	}
 
 	DEBUGP("conntrack_ftp: match `%.*s' (%u bytes at %u)\n",
 	       (int)matchlen, data + matchoff,
-	       matchlen, ntohl(tcph->seq) + matchoff);
+	       matchlen, ntohl(tcph.seq) + matchoff);
 	       
 	memset(&expect, 0, sizeof(expect));
 
 	/* Update the ftp info */
-	LOCK_BH(&ip_ftp_lock);
 	if (htonl((array[0] << 24) | (array[1] << 16) | (array[2] << 8) | array[3])
 	    == ct->tuplehash[dir].tuple.src.ip) {
-		exp->seq = ntohl(tcph->seq) + matchoff;
+		exp->seq = ntohl(tcph.seq) + matchoff;
 		exp_ftp_info->len = matchlen;
 		exp_ftp_info->ftptype = search[i].ftptype;
 		exp_ftp_info->port = array[4] << 8 | array[5];
@@ -358,7 +356,10 @@
 		   <lincoln@cesar.org.br> for reporting this potential
 		   problem (DMZ machines opening holes to internal
 		   networks, or the packet filter itself). */
-		if (!loose) goto out;
+		if (!loose) {
+			ret = NF_ACCEPT;
+			goto out;
+		}
 	}
 
 	exp->tuple = ((struct ip_conntrack_tuple)
@@ -376,10 +377,10 @@
 
 	/* Ignore failure; should only happen with NAT */
 	ip_conntrack_expect_related(ct, &expect);
+	ret = NF_ACCEPT;
  out:
 	UNLOCK_BH(&ip_ftp_lock);
-
-	return NF_ACCEPT;
+	return ret;
 }
 
 static struct ip_conntrack_helper ftp[MAX_PORTS];
diff -Nru a/net/ipv4/netfilter/ip_conntrack_irc.c b/net/ipv4/netfilter/ip_conntrack_irc.c
--- a/net/ipv4/netfilter/ip_conntrack_irc.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/netfilter/ip_conntrack_irc.c	Sat Apr 19 19:51:50 2003
@@ -38,6 +38,8 @@
 static int ports_c = 0;
 static int max_dcc_channels = 8;
 static unsigned int dcc_timeout = 300;
+/* This is slow, but it's simple. --RR */
+static char irc_buffer[65536];
 
 MODULE_AUTHOR("Harald Welte <laforge@gnumonks.org>");
 MODULE_DESCRIPTION("IRC (DCC) connection tracking module");
@@ -51,14 +53,7 @@
 MODULE_PARM_DESC(dcc_timeout, "timeout on for unestablished DCC channels");
 #endif
 
-#define NUM_DCCPROTO 	5
-struct dccproto dccprotos[NUM_DCCPROTO] = {
-	{"SEND ", 5},
-	{"CHAT ", 5},
-	{"MOVE ", 5},
-	{"TSEND ", 6},
-	{"SCHAT ", 6}
-};
+static char *dccprotos[] = { "SEND ", "CHAT ", "MOVE ", "TSEND ", "SCHAT " };
 #define MAXMATCHLEN	6
 
 DECLARE_LOCK(ip_irc_lock);
@@ -102,18 +97,12 @@
 	return 0;
 }
 
-
-/* FIXME: This should be in userspace.  Later. */
-static int help(const struct iphdr *iph, size_t len,
+static int help(struct sk_buff *skb,
 		struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
 {
-	/* tcplen not negative guaranteed by ip_conntrack_tcp.c */
-	struct tcphdr *tcph = (void *) iph + iph->ihl * 4;
-	const char *data = (const char *) tcph + tcph->doff * 4;
-	const char *_data = data;
-	char *data_limit;
-	u_int32_t tcplen = len - iph->ihl * 4;
-	u_int32_t datalen = tcplen - tcph->doff * 4;
+	unsigned int dataoff;
+	struct tcphdr tcph;
+	char *data, *data_limit;
 	int dir = CTINFO2DIR(ctinfo);
 	struct ip_conntrack_expect expect, *exp = &expect;
 	struct ip_ct_irc_expect *exp_irc_info = &exp->help.exp_irc_info;
@@ -136,23 +125,20 @@
 		return NF_ACCEPT;
 	}
 
-	/* Not whole TCP header? */
-	if (tcplen < sizeof(struct tcphdr) || tcplen < tcph->doff * 4) {
-		DEBUGP("tcplen = %u\n", (unsigned) tcplen);
+	/* Not a full tcp header? */
+	if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) != 0)
 		return NF_ACCEPT;
-	}
 
-	/* Checksum invalid?  Ignore. */
-	/* FIXME: Source route IP option packets --RR */
-	if (tcp_v4_check(tcph, tcplen, iph->saddr, iph->daddr,
-			 csum_partial((char *) tcph, tcplen, 0))) {
-		DEBUGP("bad csum: %p %u %u.%u.%u.%u %u.%u.%u.%u\n",
-		     tcph, tcplen, NIPQUAD(iph->saddr),
-		     NIPQUAD(iph->daddr));
+	/* No data? */
+	dataoff = skb->nh.iph->ihl*4 + tcph.doff*4;
+	if (dataoff >= skb->len)
 		return NF_ACCEPT;
-	}
 
-	data_limit = (char *) data + datalen;
+	LOCK_BH(&ip_irc_lock);
+	skb_copy_bits(skb, dataoff, irc_buffer, skb->len - dataoff);
+
+	data = irc_buffer;
+	data_limit = irc_buffer + skb->len - dataoff;
 	while (data < (data_limit - (22 + MAXMATCHLEN))) {
 		if (memcmp(data, "\1DCC ", 5)) {
 			data++;
@@ -162,19 +148,18 @@
 		data += 5;
 
 		DEBUGP("DCC found in master %u.%u.%u.%u:%u %u.%u.%u.%u:%u...\n",
-			NIPQUAD(iph->saddr), ntohs(tcph->source),
-			NIPQUAD(iph->daddr), ntohs(tcph->dest));
+			NIPQUAD(iph->saddr), ntohs(tcph.source),
+			NIPQUAD(iph->daddr), ntohs(tcph.dest));
 
-		for (i = 0; i < NUM_DCCPROTO; i++) {
-			if (memcmp(data, dccprotos[i].match,
-				   dccprotos[i].matchlen)) {
+		for (i = 0; i < ARRAY_SIZE(dccprotos); i++) {
+			if (memcmp(data, dccprotos[i], strlen(dccprotos[i]))) {
 				/* no match */
 				continue;
 			}
 
-			DEBUGP("DCC %s detected\n", dccprotos[i].match);
-			data += dccprotos[i].matchlen;
-			if (parse_dcc((char *) data, data_limit, &dcc_ip,
+			DEBUGP("DCC %s detected\n", dccprotos[i]);
+			data += strlen(dccprotos[i]);
+			if (parse_dcc((char *)data, data_limit, &dcc_ip,
 				       &dcc_port, &addr_beg_p, &addr_end_p)) {
 				/* unable to parse */
 				DEBUGP("unable to parse dcc command\n");
@@ -196,12 +181,10 @@
 			
 			memset(&expect, 0, sizeof(expect));
 
-			LOCK_BH(&ip_irc_lock);
-
 			/* save position of address in dcc string,
 			 * necessary for NAT */
-			DEBUGP("tcph->seq = %u\n", tcph->seq);
-			exp->seq = ntohl(tcph->seq) + (addr_beg_p - _data);
+			DEBUGP("tcph->seq = %u\n", tcph.seq);
+			exp->seq = ntohl(tcph.seq) + (addr_beg_p - irc_buffer);
 			exp_irc_info->len = (addr_end_p - addr_beg_p);
 			exp_irc_info->port = dcc_port;
 			DEBUGP("wrote info seq=%u (ofs=%u), len=%d\n",
@@ -224,12 +207,13 @@
 				ntohs(exp->tuple.dst.u.tcp.port));
 
 			ip_conntrack_expect_related(ct, &expect);
-			UNLOCK_BH(&ip_irc_lock);
 
-			return NF_ACCEPT;
+			goto out;
 		} /* for .. NUM_DCCPROTO */
 	} /* while data < ... */
 
+ out:
+	UNLOCK_BH(&ip_irc_lock);
 	return NF_ACCEPT;
 }
 
diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_generic.c b/net/ipv4/netfilter/ip_conntrack_proto_generic.c
--- a/net/ipv4/netfilter/ip_conntrack_proto_generic.c	Sat Apr 19 19:51:46 2003
+++ b/net/ipv4/netfilter/ip_conntrack_proto_generic.c	Sat Apr 19 19:51:46 2003
@@ -6,7 +6,8 @@
 
 #define GENERIC_TIMEOUT (600*HZ)
 
-static int generic_pkt_to_tuple(const void *datah, size_t datalen,
+static int generic_pkt_to_tuple(const struct sk_buff *skb,
+				unsigned int dataoff,
 				struct ip_conntrack_tuple *tuple)
 {
 	tuple->src.u.all = 0;
@@ -39,17 +40,16 @@
 }
 
 /* Returns verdict for packet, or -1 for invalid. */
-static int established(struct ip_conntrack *conntrack,
-		       struct iphdr *iph, size_t len,
-		       enum ip_conntrack_info conntrackinfo)
+static int packet(struct ip_conntrack *conntrack,
+		  const struct sk_buff *skb,
+		  enum ip_conntrack_info conntrackinfo)
 {
 	ip_ct_refresh(conntrack, GENERIC_TIMEOUT);
 	return NF_ACCEPT;
 }
 
 /* Called when a new connection for this protocol found. */
-static int
-new(struct ip_conntrack *conntrack, struct iphdr *iph, size_t len)
+static int new(struct ip_conntrack *conntrack, const struct sk_buff *skb)
 {
 	return 1;
 }
@@ -57,5 +57,5 @@
 struct ip_conntrack_protocol ip_conntrack_generic_protocol
 = { { NULL, NULL }, 0, "unknown",
     generic_pkt_to_tuple, generic_invert_tuple, generic_print_tuple,
-    generic_print_conntrack, established, new, NULL, NULL, NULL };
+    generic_print_conntrack, packet, new, NULL, NULL, NULL };
 
diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c
--- a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c	Sat Apr 19 19:51:27 2003
+++ b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c	Sat Apr 19 19:51:27 2003
@@ -14,14 +14,18 @@
 #define DEBUGP(format, args...)
 #endif
 
-static int icmp_pkt_to_tuple(const void *datah, size_t datalen,
+static int icmp_pkt_to_tuple(const struct sk_buff *skb,
+			     unsigned int dataoff,
 			     struct ip_conntrack_tuple *tuple)
 {
-	const struct icmphdr *hdr = datah;
+	struct icmphdr hdr;
 
-	tuple->dst.u.icmp.type = hdr->type;
-	tuple->src.u.icmp.id = hdr->un.echo.id;
-	tuple->dst.u.icmp.code = hdr->code;
+	if (skb_copy_bits(skb, dataoff, &hdr, sizeof(hdr)) != 0)
+		return 0;
+
+	tuple->dst.u.icmp.type = hdr.type;
+	tuple->src.u.icmp.id = hdr.un.echo.id;
+	tuple->dst.u.icmp.code = hdr.code;
 
 	return 1;
 }
@@ -69,7 +73,7 @@
 
 /* Returns verdict for packet, or -1 for invalid. */
 static int icmp_packet(struct ip_conntrack *ct,
-		       struct iphdr *iph, size_t len,
+		       const struct sk_buff *skb,
 		       enum ip_conntrack_info ctinfo)
 {
 	/* Try to delete connection immediately after all replies:
@@ -90,7 +94,7 @@
 
 /* Called when a new connection for this protocol found. */
 static int icmp_new(struct ip_conntrack *conntrack,
-		    struct iphdr *iph, size_t len)
+		    const struct sk_buff *skb)
 {
 	static u_int8_t valid_new[]
 		= { [ICMP_ECHO] = 1,
diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c
--- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c	Sat Apr 19 19:51:51 2003
+++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c	Sat Apr 19 19:51:51 2003
@@ -96,13 +96,18 @@
 	}
 };
 
-static int tcp_pkt_to_tuple(const void *datah, size_t datalen,
-			    struct ip_conntrack_tuple *tuple)
+static int tcp_pkt_to_tuple(const struct sk_buff *skb,
+			     unsigned int dataoff,
+			     struct ip_conntrack_tuple *tuple)
 {
-	const struct tcphdr *hdr = datah;
+	struct tcphdr hdr;
 
-	tuple->src.u.tcp.port = hdr->source;
-	tuple->dst.u.tcp.port = hdr->dest;
+	/* Actually only need first 8 bytes. */
+	if (skb_copy_bits(skb, dataoff, &hdr, 8) != 0)
+		return 0;
+
+	tuple->src.u.tcp.port = hdr.source;
+	tuple->dst.u.tcp.port = hdr.dest;
 
 	return 1;
 }
@@ -148,30 +153,26 @@
 
 /* Returns verdict for packet, or -1 for invalid. */
 static int tcp_packet(struct ip_conntrack *conntrack,
-		      struct iphdr *iph, size_t len,
+		      const struct sk_buff *skb,
 		      enum ip_conntrack_info ctinfo)
 {
 	enum tcp_conntrack newconntrack, oldtcpstate;
-	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph + iph->ihl);
+	struct tcphdr tcph;
 
-	/* We're guaranteed to have the base header, but maybe not the
-           options. */
-	if (len < (iph->ihl + tcph->doff) * 4) {
-		DEBUGP("ip_conntrack_tcp: Truncated packet.\n");
+	if (skb_copy_bits(skb, skb->nh.iph->ihl * 4, &tcph, sizeof(tcph)) != 0)
 		return -1;
-	}
 
 	WRITE_LOCK(&tcp_lock);
 	oldtcpstate = conntrack->proto.tcp.state;
 	newconntrack
 		= tcp_conntracks
 		[CTINFO2DIR(ctinfo)]
-		[get_conntrack_index(tcph)][oldtcpstate];
+		[get_conntrack_index(&tcph)][oldtcpstate];
 
 	/* Invalid */
 	if (newconntrack == TCP_CONNTRACK_MAX) {
 		DEBUGP("ip_conntrack_tcp: Invalid dir=%i index=%u conntrack=%u\n",
-		       CTINFO2DIR(ctinfo), get_conntrack_index(tcph),
+		       CTINFO2DIR(ctinfo), get_conntrack_index(&tcph),
 		       conntrack->proto.tcp.state);
 		WRITE_UNLOCK(&tcp_lock);
 		return -1;
@@ -182,15 +183,15 @@
 	/* Poor man's window tracking: record SYN/ACK for handshake check */
 	if (oldtcpstate == TCP_CONNTRACK_SYN_SENT
 	    && CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY
-	    && tcph->syn && tcph->ack)
+	    && tcph.syn && tcph.ack)
 		conntrack->proto.tcp.handshake_ack
-			= htonl(ntohl(tcph->seq) + 1);
+			= htonl(ntohl(tcph.seq) + 1);
 
 	/* If only reply is a RST, we can consider ourselves not to
 	   have an established connection: this is a fairly common
 	   problem case, so we can delete the conntrack
 	   immediately.  --RR */
-	if (!test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status) && tcph->rst) {
+	if (!test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status) && tcph.rst) {
 		WRITE_UNLOCK(&tcp_lock);
 		if (del_timer(&conntrack->timeout))
 			conntrack->timeout.function((unsigned long)conntrack);
@@ -198,8 +199,8 @@
 		/* Set ASSURED if we see see valid ack in ESTABLISHED after SYN_RECV */
 		if (oldtcpstate == TCP_CONNTRACK_SYN_RECV
 		    && CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL
-		    && tcph->ack && !tcph->syn
-		    && tcph->ack_seq == conntrack->proto.tcp.handshake_ack)
+		    && tcph.ack && !tcph.syn
+		    && tcph.ack_seq == conntrack->proto.tcp.handshake_ack)
 			set_bit(IPS_ASSURED_BIT, &conntrack->status);
 
 		WRITE_UNLOCK(&tcp_lock);
@@ -210,15 +211,17 @@
 }
 
 /* Called when a new connection for this protocol found. */
-static int tcp_new(struct ip_conntrack *conntrack,
-		   struct iphdr *iph, size_t len)
+static int tcp_new(struct ip_conntrack *conntrack, const struct sk_buff *skb)
 {
 	enum tcp_conntrack newconntrack;
-	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph + iph->ihl);
+	struct tcphdr tcph;
+
+	if (skb_copy_bits(skb, skb->nh.iph->ihl * 4, &tcph, sizeof(tcph)) != 0)
+		return -1;
 
 	/* Don't need lock here: this conntrack not in circulation yet */
 	newconntrack
-		= tcp_conntracks[0][get_conntrack_index(tcph)]
+		= tcp_conntracks[0][get_conntrack_index(&tcph)]
 		[TCP_CONNTRACK_NONE];
 
 	/* Invalid: delete conntrack */
@@ -232,15 +235,17 @@
 }
 
 static int tcp_exp_matches_pkt(struct ip_conntrack_expect *exp,
-			       struct sk_buff **pskb)
+			       const struct sk_buff *skb)
 {
-	struct iphdr *iph = (*pskb)->nh.iph;
-	struct tcphdr *tcph = (struct tcphdr *)((u_int32_t *)iph + iph->ihl);
+	const struct iphdr *iph = skb->nh.iph;
+	struct tcphdr tcph;
 	unsigned int datalen;
 
-	datalen = (*pskb)->len - iph->ihl*4 - tcph->doff*4;
+	if (skb_copy_bits(skb, skb->nh.iph->ihl * 4, &tcph, sizeof(tcph)) != 0)
+		return 0;
+	datalen = skb->len - iph->ihl*4 - tcph.doff*4;
 
-	return between(exp->seq, ntohl(tcph->seq), ntohl(tcph->seq) + datalen);
+	return between(exp->seq, ntohl(tcph.seq), ntohl(tcph.seq) + datalen);
 }
 
 struct ip_conntrack_protocol ip_conntrack_protocol_tcp
diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_udp.c b/net/ipv4/netfilter/ip_conntrack_proto_udp.c
--- a/net/ipv4/netfilter/ip_conntrack_proto_udp.c	Sat Apr 19 19:51:27 2003
+++ b/net/ipv4/netfilter/ip_conntrack_proto_udp.c	Sat Apr 19 19:51:27 2003
@@ -9,13 +9,18 @@
 #define UDP_TIMEOUT (30*HZ)
 #define UDP_STREAM_TIMEOUT (180*HZ)
 
-static int udp_pkt_to_tuple(const void *datah, size_t datalen,
-			    struct ip_conntrack_tuple *tuple)
+static int udp_pkt_to_tuple(const struct sk_buff *skb,
+			     unsigned int dataoff,
+			     struct ip_conntrack_tuple *tuple)
 {
-	const struct udphdr *hdr = datah;
+	struct udphdr hdr;
 
-	tuple->src.u.udp.port = hdr->source;
-	tuple->dst.u.udp.port = hdr->dest;
+	/* Actually only need first 8 bytes. */
+	if (skb_copy_bits(skb, dataoff, &hdr, 8) != 0)
+		return 0;
+
+	tuple->src.u.udp.port = hdr.source;
+	tuple->dst.u.udp.port = hdr.dest;
 
 	return 1;
 }
@@ -46,7 +51,7 @@
 
 /* Returns verdict for packet, and may modify conntracktype */
 static int udp_packet(struct ip_conntrack *conntrack,
-		      struct iphdr *iph, size_t len,
+		      const struct sk_buff *skb,
 		      enum ip_conntrack_info conntrackinfo)
 {
 	/* If we've seen traffic both ways, this is some kind of UDP
@@ -62,8 +67,7 @@
 }
 
 /* Called when a new connection for this protocol found. */
-static int udp_new(struct ip_conntrack *conntrack,
-			     struct iphdr *iph, size_t len)
+static int udp_new(struct ip_conntrack *conntrack, const struct sk_buff *skb)
 {
 	return 1;
 }
diff -Nru a/net/ipv4/netfilter/ip_conntrack_tftp.c b/net/ipv4/netfilter/ip_conntrack_tftp.c
--- a/net/ipv4/netfilter/ip_conntrack_tftp.c	Sat Apr 19 19:51:30 2003
+++ b/net/ipv4/netfilter/ip_conntrack_tftp.c	Sat Apr 19 19:51:30 2003
@@ -35,15 +35,18 @@
 #define DEBUGP(format, args...)
 #endif
 
-static int tftp_help(const struct iphdr *iph, size_t len,
-	struct ip_conntrack *ct,
-	enum ip_conntrack_info ctinfo)
+static int tftp_help(struct sk_buff *skb,
+		     struct ip_conntrack *ct,
+		     enum ip_conntrack_info ctinfo)
 {
-	struct udphdr *udph = (void *)iph + iph->ihl * 4;
-	struct tftphdr *tftph = (void *)udph + 8;
+	struct tftphdr tftph;
 	struct ip_conntrack_expect exp;
-	
-	switch (ntohs(tftph->opcode)) {
+
+	if (skb_copy_bits(skb, skb->nh.iph->ihl * 4 + sizeof(struct udphdr),
+			  &tftph, sizeof(tftph)) != 0)
+		return -1;
+
+	switch (ntohs(tftph.opcode)) {
 	/* RRQ and WRQ works the same way */
 	case TFTP_OPCODE_READ:
 	case TFTP_OPCODE_WRITE:
diff -Nru a/net/ipv4/netfilter/ip_fw_compat.c b/net/ipv4/netfilter/ip_fw_compat.c
--- a/net/ipv4/netfilter/ip_fw_compat.c	Sat Apr 19 19:51:46 2003
+++ b/net/ipv4/netfilter/ip_fw_compat.c	Sat Apr 19 19:51:46 2003
@@ -75,6 +75,10 @@
 	int ret = FW_BLOCK;
 	u_int16_t redirpt;
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* Assume worse case: any hook could change packet */
 	(*pskb)->nfcache |= NFC_UNKNOWN | NFC_ALTERED;
 	if ((*pskb)->ip_summed == CHECKSUM_HW)
@@ -189,6 +193,10 @@
 			       const struct net_device *out,
 			       int (*okfn)(struct sk_buff *))
 {
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	return ip_conntrack_confirm(*pskb);
 }
 
diff -Nru a/net/ipv4/netfilter/ip_fw_compat_masq.c b/net/ipv4/netfilter/ip_fw_compat_masq.c
--- a/net/ipv4/netfilter/ip_fw_compat_masq.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/netfilter/ip_fw_compat_masq.c	Sat Apr 19 19:51:50 2003
@@ -146,6 +146,12 @@
 			   server here (== DNAT).  Do SNAT icmp manips
 			   in POST_ROUTING handling. */
 			if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
+				/* FIXME: Remove once NAT handled non-linear.
+				 */
+				if (skb_is_nonlinear(*pskb)
+				    && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+					return NF_DROP;
+
 				icmp_reply_translation(*pskb, ct,
 						       NF_IP_PRE_ROUTING,
 						       CTINFO2DIR(ctinfo));
@@ -160,7 +166,7 @@
 	case IPPROTO_UDP:
 		IP_NF_ASSERT(((*pskb)->nh.iph->frag_off & htons(IP_OFFSET)) == 0);
 
-		if (!get_tuple(iph, (*pskb)->len, &tuple, protocol)) {
+		if (!get_tuple(iph, *pskb, iph->ihl*4, &tuple, protocol)) {
 			if (net_ratelimit())
 				printk("ip_fw_compat_masq: Can't get tuple\n");
 			return NF_ACCEPT;
diff -Nru a/net/ipv4/netfilter/ip_nat_core.c b/net/ipv4/netfilter/ip_nat_core.c
--- a/net/ipv4/netfilter/ip_nat_core.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv4/netfilter/ip_nat_core.c	Sat Apr 19 19:51:28 2003
@@ -730,15 +730,15 @@
 }
 
 static inline int exp_for_packet(struct ip_conntrack_expect *exp,
-			         struct sk_buff **pskb)
+			         struct sk_buff *skb)
 {
 	struct ip_conntrack_protocol *proto;
 	int ret = 1;
 
 	MUST_BE_READ_LOCKED(&ip_conntrack_lock);
-	proto = __ip_ct_find_proto((*pskb)->nh.iph->protocol);
+	proto = __ip_ct_find_proto(skb->nh.iph->protocol);
 	if (proto->exp_matches_pkt)
-		ret = proto->exp_matches_pkt(exp, pskb);
+		ret = proto->exp_matches_pkt(exp, skb);
 
 	return ret;
 }
@@ -813,7 +813,7 @@
 			if (exp->sibling)
 				continue;
 
-			if (exp_for_packet(exp, pskb)) {
+			if (exp_for_packet(exp, *pskb)) {
 				/* FIXME: May be true multiple times in the case of UDP!! */
 				DEBUGP("calling nat helper (exp=%p) for packet\n",
 					exp);
diff -Nru a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c
--- a/net/ipv4/netfilter/ip_nat_standalone.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/netfilter/ip_nat_standalone.c	Sat Apr 19 19:51:50 2003
@@ -71,6 +71,10 @@
 	/* maniptype == SRC for postrouting. */
 	enum ip_nat_manip_type maniptype = HOOK2MANIP(hooknum);
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* We never see fragments: conntrack defrags on pre-routing
 	   and local-out, and ip_nat_out protects post-routing. */
 	IP_NF_ASSERT(!((*pskb)->nh.iph->frag_off
@@ -170,6 +174,10 @@
 	   const struct net_device *out,
 	   int (*okfn)(struct sk_buff *))
 {
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
 	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr))
@@ -204,6 +212,10 @@
 {
 	u_int32_t saddr, daddr;
 	unsigned int ret;
+
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
 
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
diff -Nru a/net/ipv4/netfilter/ip_nat_tftp.c b/net/ipv4/netfilter/ip_nat_tftp.c
--- a/net/ipv4/netfilter/ip_nat_tftp.c	Sat Apr 19 19:51:30 2003
+++ b/net/ipv4/netfilter/ip_nat_tftp.c	Sat Apr 19 19:51:30 2003
@@ -153,7 +153,7 @@
 
 static int __init init(void)
 {
-	int i, ret;
+	int i, ret = 0;
 	char *tmpname;
 
 	if (!ports[0])
diff -Nru a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
--- a/net/ipv4/netfilter/ip_tables.c	Sat Apr 19 19:51:29 2003
+++ b/net/ipv4/netfilter/ip_tables.c	Sat Apr 19 19:51:29 2003
@@ -271,6 +271,10 @@
 	void *table_base;
 	struct ipt_entry *e, *back;
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* Initialization */
 	ip = (*pskb)->nh.iph;
 	protohdr = (u_int32_t *)ip + ip->ihl;
diff -Nru a/net/ipv4/netfilter/ipt_owner.c b/net/ipv4/netfilter/ipt_owner.c
--- a/net/ipv4/netfilter/ipt_owner.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/netfilter/ipt_owner.c	Sat Apr 19 19:51:50 2003
@@ -26,16 +26,16 @@
 		task_lock(p);
 		files = p->files;
 		if(files) {
-			read_lock(&files->file_lock);
+			spin_lock(&files->file_lock);
 			for (i=0; i < files->max_fds; i++) {
 				if (fcheck_files(files, i) == skb->sk->socket->file) {
-					read_unlock(&files->file_lock);
+					spin_unlock(&files->file_lock);
 					task_unlock(p);
 					read_unlock(&tasklist_lock);
 					return 1;
 				}
 			}
-			read_unlock(&files->file_lock);
+			spin_unlock(&files->file_lock);
 		}
 		task_unlock(p);
 	} while_each_thread(g, p);
@@ -57,16 +57,16 @@
 	task_lock(p);
 	files = p->files;
 	if(files) {
-		read_lock(&files->file_lock);
+		spin_lock(&files->file_lock);
 		for (i=0; i < files->max_fds; i++) {
 			if (fcheck_files(files, i) == skb->sk->socket->file) {
-				read_unlock(&files->file_lock);
+				spin_unlock(&files->file_lock);
 				task_unlock(p);
 				read_unlock(&tasklist_lock);
 				return 1;
 			}
 		}
-		read_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 	}
 	task_unlock(p);
 out:
@@ -90,14 +90,14 @@
 		task_lock(p);
 		files = p->files;
 		if (files) {
-			read_lock(&files->file_lock);
+			spin_lock(&files->file_lock);
 			for (i=0; i < files->max_fds; i++) {
 				if (fcheck_files(files, i) == file) {
 					found = 1;
 					break;
 				}
 			}
-			read_unlock(&files->file_lock);
+			spin_unlock(&files->file_lock);
 		}
 		task_unlock(p);
 		if (found)
diff -Nru a/net/ipv4/netfilter/iptable_filter.c b/net/ipv4/netfilter/iptable_filter.c
--- a/net/ipv4/netfilter/iptable_filter.c	Sat Apr 19 19:51:46 2003
+++ b/net/ipv4/netfilter/iptable_filter.c	Sat Apr 19 19:51:46 2003
@@ -107,6 +107,10 @@
 		   const struct net_device *out,
 		   int (*okfn)(struct sk_buff *))
 {
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
 	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
diff -Nru a/net/ipv4/netfilter/iptable_mangle.c b/net/ipv4/netfilter/iptable_mangle.c
--- a/net/ipv4/netfilter/iptable_mangle.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv4/netfilter/iptable_mangle.c	Sat Apr 19 19:51:50 2003
@@ -145,6 +145,10 @@
 	u_int32_t saddr, daddr;
 	unsigned long nfmark;
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* root is playing with raw sockets. */
 	if ((*pskb)->len < sizeof(struct iphdr)
 	    || (*pskb)->nh.iph->ihl * 4 < sizeof(struct iphdr)) {
diff -Nru a/net/ipv4/proc.c b/net/ipv4/proc.c
--- a/net/ipv4/proc.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv4/proc.c	Sat Apr 19 19:51:28 2003
@@ -143,9 +143,15 @@
 			"InSegs OutSegs RetransSegs InErrs OutRsts\nTcp:");
 
 	for (i = 0;
-	     i < offsetof(struct tcp_mib, __pad) / sizeof(unsigned long); i++)
-		seq_printf(seq, " %lu",
-			   fold_field((void **) tcp_statistics, i));
+	     i < offsetof(struct tcp_mib, __pad) / sizeof(unsigned long); i++) {
+		if (i == (offsetof(struct tcp_mib, TcpMaxConn) / sizeof(unsigned long)))
+			/* MaxConn field is negative, RFC 2012 */
+			seq_printf(seq, " %ld", 
+				   fold_field((void **) tcp_statistics, i));
+		else
+			seq_printf(seq, " %lu", 
+				   fold_field((void **) tcp_statistics, i));
+	}
 
 	seq_printf(seq, "\nUdp: InDatagrams NoPorts InErrors OutDatagrams\n"
 			"Udp:");
diff -Nru a/net/ipv4/route.c b/net/ipv4/route.c
--- a/net/ipv4/route.c	Sat Apr 19 19:51:51 2003
+++ b/net/ipv4/route.c	Sat Apr 19 19:51:51 2003
@@ -1790,7 +1790,8 @@
 
 		read_lock(&inetdev_lock);
 		if ((in_dev = __in_dev_get(dev)) != NULL) {
-			int our = ip_check_mc(in_dev, daddr);
+			int our = ip_check_mc(in_dev, daddr, saddr,
+				skb->nh.iph->protocol);
 			if (our
 #ifdef CONFIG_IP_MROUTE
 			    || (!LOCAL_MCAST(daddr) && IN_DEV_MFORWARD(in_dev))
@@ -2020,7 +2021,7 @@
 		}
 	} else if (res.type == RTN_MULTICAST) {
 		flags |= RTCF_MULTICAST|RTCF_LOCAL;
-		if (!ip_check_mc(in_dev, oldflp->fl4_dst))
+		if (!ip_check_mc(in_dev, oldflp->fl4_dst, oldflp->fl4_src, oldflp->proto))
 			flags &= ~RTCF_LOCAL;
 		/* If multicast route do not exist use
 		   default one, but do not gateway in this case.
diff -Nru a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
--- a/net/ipv4/tcp_output.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv4/tcp_output.c	Sat Apr 19 19:51:49 2003
@@ -354,7 +354,7 @@
 static void skb_split(struct sk_buff *skb, struct sk_buff *skb1, u32 len)
 {
 	int i;
-	int pos = skb->len - skb->data_len;
+	int pos = skb_headlen(skb);
 
 	if (len < pos) {
 		/* Split line is inside header. */
diff -Nru a/net/ipv4/udp.c b/net/ipv4/udp.c
--- a/net/ipv4/udp.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv4/udp.c	Sat Apr 19 19:51:28 2003
@@ -298,6 +298,8 @@
 		    ipv6_only_sock(s)					||
 		    (s->bound_dev_if && s->bound_dev_if != dif))
 			continue;
+		if (!ip_mc_sf_allow(sk, loc_addr, rmt_addr, dif))
+			continue;
 		break;
   	}
   	return s;
diff -Nru a/net/ipv4/xfrm4_input.c b/net/ipv4/xfrm4_input.c
--- a/net/ipv4/xfrm4_input.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv4/xfrm4_input.c	Sat Apr 19 19:51:28 2003
@@ -48,6 +48,9 @@
 		if (x->props.replay_window && xfrm_replay_check(x, seq))
 			goto drop_unlock;
 
+		if (xfrm_state_check_expire(x))
+			goto drop_unlock;
+
 		xfrm_vec[xfrm_nr].decap.decap_type = encap_type;
 		if (x->type->input(x, &(xfrm_vec[xfrm_nr].decap), skb))
 			goto drop_unlock;
diff -Nru a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
--- a/net/ipv4/xfrm4_policy.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv4/xfrm4_policy.c	Sat Apr 19 19:51:49 2003
@@ -180,8 +180,8 @@
 			if (pskb_may_pull(skb, xprth + 4 - skb->data)) {
 				u16 *ports = (u16 *)xprth;
 
-				fl->uli_u.ports.sport = ports[0];
-				fl->uli_u.ports.dport = ports[1];
+				fl->fl_ip_sport = ports[0];
+				fl->fl_ip_dport = ports[1];
 			}
 			break;
 
@@ -189,7 +189,7 @@
 			if (pskb_may_pull(skb, xprth + 4 - skb->data)) {
 				u32 *ehdr = (u32 *)xprth;
 
-				fl->uli_u.spi = ehdr[0];
+				fl->fl_ipsec_spi = ehdr[0];
 			}
 			break;
 
@@ -197,12 +197,19 @@
 			if (pskb_may_pull(skb, xprth + 8 - skb->data)) {
 				u32 *ah_hdr = (u32*)xprth;
 
-				fl->uli_u.spi = ah_hdr[1];
+				fl->fl_ipsec_spi = ah_hdr[1];
 			}
 			break;
 
+		case IPPROTO_COMP:
+			if (pskb_may_pull(skb, xprth + 4 - skb->data)) {
+				u16 *ipcomp_hdr = (u16 *)xprth;
+
+				fl->fl_ipsec_spi = ntohl(ntohs(ipcomp_hdr[1]));
+			}
+			break;
 		default:
-			fl->uli_u.spi = 0;
+			fl->fl_ipsec_spi = 0;
 			break;
 		};
 	} else {
diff -Nru a/net/ipv4/xfrm4_state.c b/net/ipv4/xfrm4_state.c
--- a/net/ipv4/xfrm4_state.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv4/xfrm4_state.c	Sat Apr 19 19:51:28 2003
@@ -20,9 +20,9 @@
 {
 	x->sel.daddr.a4 = fl->fl4_dst;
 	x->sel.saddr.a4 = fl->fl4_src;
-	x->sel.dport = fl->uli_u.ports.dport;
+	x->sel.dport = fl->fl_ip_dport;
 	x->sel.dport_mask = ~0;
-	x->sel.sport = fl->uli_u.ports.sport;
+	x->sel.sport = fl->fl_ip_sport;
 	x->sel.sport_mask = ~0;
 	x->sel.prefixlen_d = 32;
 	x->sel.prefixlen_s = 32;
diff -Nru a/net/ipv4/xfrm4_tunnel.c b/net/ipv4/xfrm4_tunnel.c
--- /dev/null	Wed Dec 31 16:00:00 1969
+++ b/net/ipv4/xfrm4_tunnel.c	Sat Apr 19 19:51:51 2003
@@ -0,0 +1,225 @@
+/* xfrm4_tunnel.c: Generic IP tunnel transformer.
+ *
+ * Copyright (C) 2003 David S. Miller (davem@redhat.com)
+ */
+
+#include <linux/skbuff.h>
+#include <net/xfrm.h>
+#include <net/ip.h>
+#include <net/icmp.h>
+#include <net/inet_ecn.h>
+
+static int ipip_output(struct sk_buff *skb)
+{
+	struct dst_entry *dst = skb->dst;
+	struct xfrm_state *x = dst->xfrm;
+	struct iphdr *iph, *top_iph;
+	int tos;
+
+	iph = skb->nh.iph;
+
+	spin_lock_bh(&x->lock);
+
+	tos = iph->tos;
+
+	top_iph = (struct iphdr *) skb_push(skb, x->props.header_len);
+	top_iph->ihl = 5;
+	top_iph->version = 4;
+	top_iph->tos = INET_ECN_encapsulate(tos, iph->tos);
+	top_iph->tot_len = htons(skb->len);
+	top_iph->frag_off = iph->frag_off & ~htons(IP_MF|IP_OFFSET);
+	if (!(iph->frag_off & htons(IP_DF)))
+		__ip_select_ident(top_iph, dst, 0);
+	top_iph->ttl = iph->ttl;
+	top_iph->protocol = IPPROTO_IPIP;
+	top_iph->check = 0;
+	top_iph->saddr = x->props.saddr.a4;
+	top_iph->daddr = x->id.daddr.a4;
+	memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
+	ip_send_check(top_iph);
+
+	skb->nh.raw = skb->data;
+	x->curlft.bytes += skb->len;
+	x->curlft.packets++;
+
+	spin_unlock_bh(&x->lock);
+
+	if ((skb->dst = dst_pop(dst)) == NULL) {
+		kfree_skb(skb);
+		return -EHOSTUNREACH;
+	}
+	return NET_XMIT_BYPASS;
+}
+
+static inline void ipip_ecn_decapsulate(struct iphdr *outer_iph, struct sk_buff *skb)
+{
+	struct iphdr *inner_iph = skb->nh.iph;
+
+	if (INET_ECN_is_ce(outer_iph->tos) &&
+	    INET_ECN_is_not_ce(inner_iph->tos))
+		IP_ECN_set_ce(inner_iph);
+}
+
+static int ipip_xfrm_rcv(struct xfrm_state *x, struct xfrm_decap_state *decap, struct sk_buff *skb)
+{
+	struct iphdr *outer_iph = skb->nh.iph;
+
+	if (!pskb_may_pull(skb, sizeof(struct iphdr)))
+		return -EINVAL;
+	skb->mac.raw = skb->nh.raw;
+	skb->nh.raw = skb->data;
+	memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
+	dst_release(skb->dst);
+	skb->dst = NULL;
+	skb->protocol = htons(ETH_P_IP);
+	skb->pkt_type = PACKET_HOST;
+	ipip_ecn_decapsulate(outer_iph, skb);
+	netif_rx(skb);
+
+	return 0;
+}
+
+static struct xfrm_tunnel *ipip_handler;
+static DECLARE_MUTEX(xfrm4_tunnel_sem);
+
+int xfrm4_tunnel_register(struct xfrm_tunnel *handler)
+{
+	int ret;
+
+	down(&xfrm4_tunnel_sem);
+	ret = 0;
+	if (ipip_handler != NULL)
+		ret = -EINVAL;
+	if (!ret)
+		ipip_handler = handler;
+	up(&xfrm4_tunnel_sem);
+
+	return ret;
+}
+
+int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler)
+{
+	int ret;
+
+	down(&xfrm4_tunnel_sem);
+	ret = 0;
+	if (ipip_handler != handler)
+		ret = -EINVAL;
+	if (!ret)
+		ipip_handler = NULL;
+	up(&xfrm4_tunnel_sem);
+
+	synchronize_net();
+
+	return ret;
+}
+
+static int ipip_rcv(struct sk_buff *skb)
+{
+	struct xfrm_tunnel *handler = ipip_handler;
+	struct xfrm_state *x = NULL;
+	int err;
+
+	/* Tunnel devices take precedence.  */
+	if (handler) {
+		err = handler->handler(skb);
+		if (!err)
+			goto out;
+	}
+
+	x = xfrm_state_lookup((xfrm_address_t *)&skb->nh.iph->daddr,
+			      skb->nh.iph->saddr,
+			      IPPROTO_IPIP, AF_INET);
+
+	if (x) {
+		spin_lock(&x->lock);
+
+		if (unlikely(x->km.state != XFRM_STATE_VALID))
+			goto drop_unlock;
+	}
+
+	err = ipip_xfrm_rcv(x, NULL, skb);
+	if (err)
+		goto drop_unlock;
+
+	if (x) {
+		x->curlft.bytes += skb->len;
+		x->curlft.packets++;
+
+		spin_unlock(&x->lock);
+
+		xfrm_state_put(x);
+	}
+
+	return 0;
+
+drop_unlock:
+	if (x) {
+		spin_unlock(&x->lock);
+		xfrm_state_put(x);
+	}
+	kfree_skb(skb);
+out:
+	return 0;
+}
+
+static void ipip_err(struct sk_buff *skb, u32 info)
+{
+	struct xfrm_tunnel *handler = ipip_handler;
+	u32 arg = info;
+
+	if (handler)
+		handler->err_handler(skb, &arg);
+}
+
+static int ipip_init_state(struct xfrm_state *x, void *args)
+{
+	x->props.header_len = sizeof(struct iphdr);
+
+	return 0;
+}
+
+static void ipip_destroy(struct xfrm_state *x)
+{
+}
+
+static struct xfrm_type ipip_type = {
+	.description	= "IPIP",
+	.proto	     	= IPPROTO_IPIP,
+	.init_state	= ipip_init_state,
+	.destructor	= ipip_destroy,
+	.input		= ipip_xfrm_rcv,
+	.output		= ipip_output
+};
+
+static struct inet_protocol ipip_protocol = {
+	.handler	=	ipip_rcv,
+	.err_handler	=	ipip_err,
+};
+
+static int __init ipip_init(void)
+{
+	SET_MODULE_OWNER(&ipip_type);
+	if (xfrm_register_type(&ipip_type, AF_INET) < 0) {
+		printk(KERN_INFO "ipip init: can't add xfrm type\n");
+		return -EAGAIN;
+	}
+	if (inet_add_protocol(&ipip_protocol, IPPROTO_IPIP) < 0) {
+		printk(KERN_INFO "ipip init: can't add protocol\n");
+		xfrm_unregister_type(&ipip_type, AF_INET);
+		return -EAGAIN;
+	}
+	return 0;
+}
+
+static void __exit ipip_fini(void)
+{
+	if (inet_del_protocol(&ipip_protocol, IPPROTO_IPIP) < 0)
+		printk(KERN_INFO "ipip close: can't remove protocol\n");
+	if (xfrm_unregister_type(&ipip_type, AF_INET) < 0)
+		printk(KERN_INFO "ipip close: can't remove xfrm type\n");
+}
+
+module_init(ipip_init);
+module_exit(ipip_fini);
+MODULE_LICENSE("GPL");
diff -Nru a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
--- a/net/ipv6/addrconf.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv6/addrconf.c	Sat Apr 19 19:51:50 2003
@@ -1202,7 +1202,7 @@
 	if (dev->type == ARPHRD_SIT && (dev->flags&IFF_POINTOPOINT))
 		rtmsg.rtmsg_flags |= RTF_NONEXTHOP;
 
-	ip6_route_add(&rtmsg);
+	ip6_route_add(&rtmsg, NULL);
 }
 
 /* Create "default" multicast route to the interface */
@@ -1219,7 +1219,7 @@
 	rtmsg.rtmsg_ifindex = dev->ifindex;
 	rtmsg.rtmsg_flags = RTF_UP|RTF_ADDRCONF;
 	rtmsg.rtmsg_type = RTMSG_NEWROUTE;
-	ip6_route_add(&rtmsg);
+	ip6_route_add(&rtmsg, NULL);
 }
 
 static void sit_route_add(struct net_device *dev)
@@ -1236,7 +1236,7 @@
 	rtmsg.rtmsg_flags	= RTF_UP|RTF_NONEXTHOP;
 	rtmsg.rtmsg_ifindex	= dev->ifindex;
 
-	ip6_route_add(&rtmsg);
+	ip6_route_add(&rtmsg, NULL);
 }
 
 static void addrconf_add_lroute(struct net_device *dev)
@@ -1328,7 +1328,7 @@
 	if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) {
 		if (rt->rt6i_flags&RTF_EXPIRES) {
 			if (pinfo->onlink == 0 || valid_lft == 0) {
-				ip6_del_rt(rt);
+				ip6_del_rt(rt, NULL);
 				rt = NULL;
 			} else {
 				rt->rt6i_expires = rt_expires;
@@ -1952,7 +1952,7 @@
 
 		rtmsg.rtmsg_ifindex = ifp->idev->dev->ifindex;
 
-		ip6_route_add(&rtmsg);
+		ip6_route_add(&rtmsg, NULL);
 	}
 
 out:
diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c
--- a/net/ipv6/af_inet6.c	Sat Apr 19 19:51:48 2003
+++ b/net/ipv6/af_inet6.c	Sat Apr 19 19:51:48 2003
@@ -111,7 +111,7 @@
 #ifdef INET_REFCNT_DEBUG
 	atomic_dec(&inet6_sock_nr);
 #endif
-	MOD_DEC_USE_COUNT;
+	module_put(THIS_MODULE);
 }
 
 static __inline__ kmem_cache_t *inet6_sk_slab(int protocol)
@@ -242,7 +242,10 @@
 	atomic_inc(&inet6_sock_nr);
 	atomic_inc(&inet_sock_nr);
 #endif
-	MOD_INC_USE_COUNT;
+	if (!try_module_get(THIS_MODULE)) {
+		inet_sock_release(sk);
+		return -EBUSY;
+	}
 
 	if (inet->num) {
 		/* It assumes that any protocol which allows
@@ -255,7 +258,7 @@
 	if (sk->prot->init) {
 		int err = sk->prot->init(sk);
 		if (err != 0) {
-			MOD_DEC_USE_COUNT;
+			module_put(THIS_MODULE);
 			inet_sock_release(sk);
 			return err;
 		}
@@ -802,7 +805,6 @@
 	sit_init();
 
 	/* Init v6 extension headers. */
-	ipv6_hopopts_init();
 	ipv6_rthdr_init();
 	ipv6_frag_init();
 	ipv6_nodata_init();
diff -Nru a/net/ipv6/ah6.c b/net/ipv6/ah6.c
--- a/net/ipv6/ah6.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv6/ah6.c	Sat Apr 19 19:51:49 2003
@@ -313,11 +313,13 @@
 		crypto_free_tfm(ahp->tfm);
 		ahp->tfm = NULL;
 	}
+	kfree(ahp);
 }
 
 static struct xfrm_type ah6_type =
 {
 	.description	= "AH6",
+	.owner		= THIS_MODULE,
 	.proto	     	= IPPROTO_AH,
 	.init_state	= ah6_init_state,
 	.destructor	= ah6_destroy,
@@ -328,13 +330,11 @@
 static struct inet6_protocol ah6_protocol = {
 	.handler	=	xfrm6_rcv,
 	.err_handler	=	ah6_err,
-	.no_policy	=	1,
+	.flags		=	INET6_PROTO_NOPOLICY,
 };
 
 int __init ah6_init(void)
 {
-	SET_MODULE_OWNER(&ah6_type);
-
 	if (xfrm_register_type(&ah6_type, AF_INET6) < 0) {
 		printk(KERN_INFO "ipv6 ah init: can't add xfrm type\n");
 		return -EAGAIN;
diff -Nru a/net/ipv6/datagram.c b/net/ipv6/datagram.c
--- a/net/ipv6/datagram.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv6/datagram.c	Sat Apr 19 19:51:28 2003
@@ -91,7 +91,7 @@
 	serr->ee.ee_info = info;
 	serr->ee.ee_data = 0;
 	serr->addr_offset = (u8*)&iph->daddr - skb->nh.raw;
-	serr->port = fl->uli_u.ports.dport;
+	serr->port = fl->fl_ip_dport;
 
 	skb->h.raw = skb->tail;
 	__skb_pull(skb, skb->tail - skb->data);
diff -Nru a/net/ipv6/esp6.c b/net/ipv6/esp6.c
--- a/net/ipv6/esp6.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv6/esp6.c	Sat Apr 19 19:51:49 2003
@@ -406,6 +406,7 @@
 		kfree(esp->auth.work_icv);
 		esp->auth.work_icv = NULL;
 	}
+	kfree(esp);
 }
 
 int esp6_init_state(struct xfrm_state *x, void *args)
@@ -488,6 +489,7 @@
 static struct xfrm_type esp6_type =
 {
 	.description	= "ESP6",
+	.owner	     	= THIS_MODULE,
 	.proto	     	= IPPROTO_ESP,
 	.init_state	= esp6_init_state,
 	.destructor	= esp6_destroy,
@@ -499,12 +501,11 @@
 static struct inet6_protocol esp6_protocol = {
 	.handler 	=	xfrm6_rcv,
 	.err_handler	=	esp6_err,
-	.no_policy	=	1,
+	.flags		=	INET6_PROTO_NOPOLICY,
 };
 
 int __init esp6_init(void)
 {
-	SET_MODULE_OWNER(&esp6_type);
 	if (xfrm_register_type(&esp6_type, AF_INET6) < 0) {
 		printk(KERN_INFO "ipv6 esp init: can't add xfrm type\n");
 		return -EAGAIN;
diff -Nru a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
--- a/net/ipv6/exthdrs.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv6/exthdrs.c	Sat Apr 19 19:51:28 2003
@@ -18,9 +18,9 @@
 /* Changes:
  *	yoshfuji		: ensure not to overrun while parsing 
  *				  tlv options.
- *	Mitsuru KANDA @USAGI	: Remove ipv6_parse_exthdrs().
- *				: Register inbound extention header
- *				: handlers as inet6_protocol{}.
+ *	Mitsuru KANDA @USAGI and: Remove ipv6_parse_exthdrs().
+ *	YOSHIFUJI Hideaki @USAGI  Register inbound extention header
+ *				  handlers as inet6_protocol{}.
  */
 
 #include <linux/errno.h>
@@ -153,38 +153,37 @@
 	{-1,			NULL}
 };
 
-static int ipv6_destopt_rcv(struct sk_buff **skbp) 
+static int ipv6_destopt_rcv(struct sk_buff **skbp, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *skbp;
 	struct inet6_skb_parm *opt = (struct inet6_skb_parm *)skb->cb;
-	u8 nexthdr = 0;
 
 	if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) ||
 	    !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) {
 		kfree_skb(skb);
-		return 0;
+		return -1;
 	}
 
-	nexthdr = ((struct ipv6_destopt_hdr *)skb->h.raw)->nexthdr;
-	
 	opt->dst1 = skb->h.raw - skb->nh.raw;
 
 	if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) {
 		skb->h.raw += ((skb->h.raw[1]+1)<<3);
-		return -nexthdr;
+		*nhoffp = opt->dst1;
+		return 1;
 	}
-						
-	return 0;
+
+	return -1;
 }
 
 static struct inet6_protocol destopt_protocol =
 {
-	.handler 	= 	ipv6_destopt_rcv,
+	.handler	=	ipv6_destopt_rcv,
+	.flags		=	INET6_PROTO_NOPOLICY,
 };
 
 void __init ipv6_destopt_init(void)
 {
-	if (inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS) < 0) 
+	if (inet6_add_protocol(&destopt_protocol, IPPROTO_DSTOPTS) < 0)
 		printk(KERN_ERR "ipv6_destopt_init: Could not register protocol\n");
 }
 
@@ -192,7 +191,7 @@
   NONE header. No data in packet.
  ********************************/
 
-static int ipv6_nodata_rcv(struct sk_buff **skbp)
+static int ipv6_nodata_rcv(struct sk_buff **skbp, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *skbp;
 
@@ -203,6 +202,7 @@
 static struct inet6_protocol nodata_protocol =
 {
 	.handler	=	ipv6_nodata_rcv,
+	.flags		=	INET6_PROTO_NOPOLICY,
 };
 
 void __init ipv6_nodata_init(void)
@@ -215,7 +215,7 @@
   Routing header.
  ********************************/
 
-static int ipv6_rthdr_rcv(struct sk_buff **skbp)
+static int ipv6_rthdr_rcv(struct sk_buff **skbp, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *skbp;
 	struct inet6_skb_parm *opt = (struct inet6_skb_parm *)skb->cb;
@@ -223,7 +223,6 @@
 	struct in6_addr daddr;
 	int addr_type;
 	int n, i;
-	u8 nexthdr = 0;
 
 	struct ipv6_rt_hdr *hdr;
 	struct rt0_hdr *rthdr;
@@ -232,16 +231,15 @@
 	    !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) {
 		IP6_INC_STATS_BH(Ip6InHdrErrors);
 		kfree_skb(skb);
-		return 0;
+		return -1;
 	}
 
 	hdr = (struct ipv6_rt_hdr *) skb->h.raw;
-	nexthdr = hdr->nexthdr;
 
 	if ((ipv6_addr_type(&skb->nh.ipv6h->daddr)&IPV6_ADDR_MULTICAST) ||
 	    skb->pkt_type != PACKET_HOST) {
 		kfree_skb(skb);
-		return 0;
+		return -1;
 	}
 
 looped_back:
@@ -250,12 +248,13 @@
 		skb->h.raw += (hdr->hdrlen + 1) << 3;
 		opt->dst0 = opt->dst1;
 		opt->dst1 = 0;
-		return -nexthdr;
+		*nhoffp = (&hdr->nexthdr) - skb->nh.raw;
+		return 1;
 	}
 
 	if (hdr->type != IPV6_SRCRT_TYPE_0 || (hdr->hdrlen & 0x01)) {
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, hdr->type != IPV6_SRCRT_TYPE_0 ? 2 : 1);
-		return 0;
+		return -1;
 	}
 
 	/*
@@ -267,7 +266,7 @@
 
 	if (hdr->segments_left > n) {
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->segments_left) - skb->nh.raw);
-		return 0;
+		return -1;
 	}
 
 	/* We are about to mangle packet header. Be careful!
@@ -277,7 +276,7 @@
 		struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
 		kfree_skb(skb);
 		if (skb2 == NULL)
-			return 0;
+			return -1;
 		*skbp = skb = skb2;
 		opt = (struct inet6_skb_parm *)skb2->cb;
 		hdr = (struct ipv6_rt_hdr *) skb2->h.raw;
@@ -296,7 +295,7 @@
 
 	if (addr_type&IPV6_ADDR_MULTICAST) {
 		kfree_skb(skb);
-		return 0;
+		return -1;
 	}
 
 	ipv6_addr_copy(&daddr, addr);
@@ -307,26 +306,27 @@
 	ip6_route_input(skb);
 	if (skb->dst->error) {
 		dst_input(skb);
-		return 0;
+		return -1;
 	}
 	if (skb->dst->dev->flags&IFF_LOOPBACK) {
 		if (skb->nh.ipv6h->hop_limit <= 1) {
 			icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT,
 				    0, skb->dev);
 			kfree_skb(skb);
-			return 0;
+			return -1;
 		}
 		skb->nh.ipv6h->hop_limit--;
 		goto looped_back;
 	}
 
 	dst_input(skb);
-	return 0;
+	return -1;
 }
 
 static struct inet6_protocol rthdr_protocol =
 {
 	.handler	=	ipv6_rthdr_rcv,
+	.flags		=	INET6_PROTO_NOPOLICY,
 };
 
 void __init ipv6_rthdr_init(void)
@@ -468,34 +468,6 @@
 	if (ip6_parse_tlv(tlvprochopopt_lst, skb))
 		return sizeof(struct ipv6hdr);
 	return -1;
-}
-
-/* This is fake. We have already parsed hopopts in ipv6_rcv(). -mk */
-static int ipv6_hopopts_rcv(struct sk_buff **skbp)
-{
-	struct sk_buff *skb = *skbp;
-	u8 nexthdr = 0;
-
-	if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) ||
-	    !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) {
-		kfree_skb(skb);
-		return 0;
-	}
-	nexthdr = ((struct ipv6_hopopt_hdr *)skb->h.raw)->nexthdr;
-	skb->h.raw += (skb->h.raw[1]+1)<<3;
-
-       return -nexthdr;
-}
-
-static struct inet6_protocol hopopts_protocol =
-{
-	.handler	=	ipv6_hopopts_rcv,
-};
-
-void __init ipv6_hopopts_init(void)
-{
-	if (inet6_add_protocol(&hopopts_protocol, IPPROTO_HOPOPTS) < 0)
-		printk(KERN_ERR "ipv6_hopopts_init: Could not register protocol\n");
 }
 
 /*
diff -Nru a/net/ipv6/icmp.c b/net/ipv6/icmp.c
--- a/net/ipv6/icmp.c	Sat Apr 19 19:51:30 2003
+++ b/net/ipv6/icmp.c	Sat Apr 19 19:51:30 2003
@@ -74,10 +74,11 @@
 static struct socket *__icmpv6_socket[NR_CPUS];
 #define icmpv6_socket	__icmpv6_socket[smp_processor_id()]
 
-static int icmpv6_rcv(struct sk_buff **pskb);
+static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp);
 
 static struct inet6_protocol icmpv6_protocol = {
 	.handler	=	icmpv6_rcv,
+	.flags		=	INET6_PROTO_FINAL,
 };
 
 struct icmpv6_msg {
@@ -312,12 +313,12 @@
 	}
 
 	fl.proto = IPPROTO_ICMPV6;
-	fl.nl_u.ip6_u.daddr = &hdr->saddr;
-	fl.nl_u.ip6_u.saddr = saddr;
+	fl.fl6_dst = &hdr->saddr;
+	fl.fl6_src = saddr;
 	fl.oif = iif;
 	fl.fl6_flowlabel = 0;
-	fl.uli_u.icmpt.type = type;
-	fl.uli_u.icmpt.code = code;
+	fl.fl_icmp_type = type;
+	fl.fl_icmp_code = code;
 
 	icmpv6_xmit_lock();
 
@@ -386,12 +387,12 @@
 	msg.daddr =  &skb->nh.ipv6h->saddr;
 
 	fl.proto = IPPROTO_ICMPV6;
-	fl.nl_u.ip6_u.daddr = msg.daddr;
-	fl.nl_u.ip6_u.saddr = saddr;
+	fl.fl6_dst = msg.daddr;
+	fl.fl6_src = saddr;
 	fl.oif = skb->dev->ifindex;
 	fl.fl6_flowlabel = 0;
-	fl.uli_u.icmpt.type = ICMPV6_ECHO_REPLY;
-	fl.uli_u.icmpt.code = 0;
+	fl.fl_icmp_type = ICMPV6_ECHO_REPLY;
+	fl.fl_icmp_code = 0;
 
 	icmpv6_xmit_lock();
 
@@ -459,7 +460,7 @@
  *	Handle icmp messages
  */
 
-static int icmpv6_rcv(struct sk_buff **pskb)
+static int icmpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *pskb;
 	struct net_device *dev = skb->dev;
diff -Nru a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
--- a/net/ipv6/ip6_fib.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv6/ip6_fib.c	Sat Apr 19 19:51:50 2003
@@ -423,7 +423,8 @@
  *	Insert routing information in a node.
  */
 
-static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt)
+static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
+    struct nlmsghdr *nlh)
 {
 	struct rt6_info *iter = NULL;
 	struct rt6_info **ins;
@@ -480,7 +481,7 @@
 	*ins = rt;
 	rt->rt6i_node = fn;
 	atomic_inc(&rt->rt6i_ref);
-	inet6_rt_notify(RTM_NEWROUTE, rt);
+	inet6_rt_notify(RTM_NEWROUTE, rt, nlh);
 	rt6_stats.fib_rt_entries++;
 
 	if ((fn->fn_flags & RTN_RTINFO) == 0) {
@@ -504,7 +505,7 @@
  *	with source addr info in sub-trees
  */
 
-int fib6_add(struct fib6_node *root, struct rt6_info *rt)
+int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nlmsghdr *nlh)
 {
 	struct fib6_node *fn;
 	int err = -ENOMEM;
@@ -577,7 +578,7 @@
 	}
 #endif
 
-	err = fib6_add_rt2node(fn, rt);
+	err = fib6_add_rt2node(fn, rt, nlh);
 
 	if (err == 0) {
 		fib6_start_gc(rt);
@@ -885,7 +886,8 @@
 	}
 }
 
-static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp)
+static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
+    struct nlmsghdr *nlh)
 {
 	struct fib6_walker_t *w;
 	struct rt6_info *rt = *rtp;
@@ -940,11 +942,11 @@
 		if (atomic_read(&rt->rt6i_ref) != 1) BUG();
 	}
 
-	inet6_rt_notify(RTM_DELROUTE, rt);
+	inet6_rt_notify(RTM_DELROUTE, rt, nlh);
 	rt6_release(rt);
 }
 
-int fib6_del(struct rt6_info *rt)
+int fib6_del(struct rt6_info *rt, struct nlmsghdr *nlh)
 {
 	struct fib6_node *fn = rt->rt6i_node;
 	struct rt6_info **rtp;
@@ -969,7 +971,7 @@
 
 	for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->u.next) {
 		if (*rtp == rt) {
-			fib6_del_route(fn, rtp);
+			fib6_del_route(fn, rtp, nlh);
 			return 0;
 		}
 	}
@@ -1098,7 +1100,7 @@
 		res = c->func(rt, c->arg);
 		if (res < 0) {
 			w->leaf = rt;
-			res = fib6_del(rt);
+			res = fib6_del(rt, NULL);
 			if (res) {
 #if RT6_DEBUG >= 2
 				printk(KERN_DEBUG "fib6_clean_node: del failed: rt=%p@%p err=%d\n", rt, rt->rt6i_node, res);
diff -Nru a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
--- a/net/ipv6/ip6_input.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv6/ip6_input.c	Sat Apr 19 19:51:49 2003
@@ -17,7 +17,8 @@
  */
 /* Changes
  *
- * 	Mitsuru KANDA @USAGI	: Remove ipv6_parse_exthdrs().
+ * 	Mitsuru KANDA @USAGI and
+ * 	YOSHIFUJI Hideaki @USAGI: Remove ipv6_parse_exthdrs().
  */
 
 #include <linux/errno.h>
@@ -128,22 +129,34 @@
 
 static inline int ip6_input_finish(struct sk_buff *skb)
 {
-	struct ipv6hdr *hdr = skb->nh.ipv6h;
 	struct inet6_protocol *ipprot;
 	struct sock *raw_sk;
-	int nexthdr = hdr->nexthdr;
+	unsigned int nhoff;
+	int nexthdr;
 	u8 hash;
+	int cksum_sub = 0;
 
 	skb->h.raw = skb->nh.raw + sizeof(struct ipv6hdr);
 
-	if (!pskb_pull(skb, skb->h.raw - skb->data))
-		goto discard;
+	/*
+	 *	Parse extension headers
+	 */
 
-	if (skb->ip_summed == CHECKSUM_HW)
-		skb->csum = csum_sub(skb->csum,
-				     csum_partial(skb->nh.raw, skb->h.raw-skb->nh.raw, 0));
+	nexthdr = skb->nh.ipv6h->nexthdr;
+	nhoff = offsetof(struct ipv6hdr, nexthdr);
+
+	/* Skip  hop-by-hop options, they are already parsed. */
+	if (nexthdr == NEXTHDR_HOP) {
+		nhoff = sizeof(struct ipv6hdr);
+		nexthdr = skb->h.raw[0];
+		skb->h.raw += (skb->h.raw[1]+1)<<3;
+	}
 
 resubmit:
+	if (!pskb_pull(skb, skb->h.raw - skb->data))
+		goto discard;
+	nexthdr = skb->nh.raw[nhoff];
+
 	raw_sk = raw_v6_htable[nexthdr & (MAX_INET_PROTOS - 1)];
 	if (raw_sk)
 		ipv6_raw_deliver(skb, nexthdr);
@@ -152,23 +165,29 @@
 	if ((ipprot = inet6_protos[hash]) != NULL) {
 		int ret;
 		
-		if (!ipprot->no_policy &&
+		if (ipprot->flags & INET6_PROTO_FINAL) {
+			if (!cksum_sub && skb->ip_summed == CHECKSUM_HW) {
+				skb->csum = csum_sub(skb->csum,
+						     csum_partial(skb->nh.raw, skb->h.raw-skb->nh.raw, 0));
+				cksum_sub++;
+			}
+		}
+		if (!(ipprot->flags & INET6_PROTO_NOPOLICY) &&
 		    !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
 			kfree_skb(skb);
 			return 0;
 		}
-		ret = ipprot->handler(&skb);
-		if (ret < 0) {
-			nexthdr = -ret;
+		
+		ret = ipprot->handler(&skb, &nhoff);
+		if (ret > 0)
 			goto resubmit;
-		}
-		IP6_INC_STATS_BH(Ip6InDelivers);
+		else if (ret == 0)
+			IP6_INC_STATS_BH(Ip6InDelivers);
 	} else {
 		if (!raw_sk) {
 			if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
 				IP6_INC_STATS_BH(Ip6InUnknownProtos);
-				icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR,
-						  offsetof(struct ipv6hdr, nexthdr));
+				icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, nhoff);
 			}
 		} else {
 			IP6_INC_STATS_BH(Ip6InDelivers);
@@ -198,7 +217,7 @@
 	IP6_INC_STATS_BH(Ip6InMcastPkts);
 
 	hdr = skb->nh.ipv6h;
-	if (ipv6_chk_mcast_addr(skb->dev, &hdr->daddr))
+	if (ipv6_chk_mcast_addr(skb->dev, &hdr->daddr, &hdr->saddr))
 		deliver = 1;
 
 	/*
diff -Nru a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
--- a/net/ipv6/ip6_output.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv6/ip6_output.c	Sat Apr 19 19:51:28 2003
@@ -110,7 +110,8 @@
 		struct ipv6_pinfo* np = skb->sk ? inet6_sk(skb->sk) : NULL;
 
 		if (!(dev->flags & IFF_LOOPBACK) && (!np || np->mc_loop) &&
-		    ipv6_chk_mcast_addr(dev, &skb->nh.ipv6h->daddr)) {
+		    ipv6_chk_mcast_addr(dev, &skb->nh.ipv6h->daddr,
+				&skb->nh.ipv6h->saddr)) {
 			struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
 
 			/* Do not check for IFF_ALLMULTI; multicast routing
@@ -146,14 +147,15 @@
 	fl.fl6_src = &iph->saddr;
 	fl.oif = skb->sk ? skb->sk->bound_dev_if : 0;
 	fl.fl6_flowlabel = 0;
-	fl.uli_u.ports.dport = 0;
-	fl.uli_u.ports.sport = 0;
+	fl.fl_ip_dport = 0;
+	fl.fl_ip_sport = 0;
 
 	dst = ip6_route_output(skb->sk, &fl);
 
 	if (dst->error) {
 		if (net_ratelimit())
 			printk(KERN_DEBUG "ip6_route_me_harder: No more route.\n");
+		dst_release(dst);
 		return -EINVAL;
 	}
 
@@ -186,7 +188,7 @@
 	     struct ipv6_txoptions *opt)
 {
 	struct ipv6_pinfo *np = sk ? inet6_sk(sk) : NULL;
-	struct in6_addr *first_hop = fl->nl_u.ip6_u.daddr;
+	struct in6_addr *first_hop = fl->fl6_dst;
 	struct dst_entry *dst = skb->dst;
 	struct ipv6hdr *hdr;
 	u8  proto = fl->proto;
@@ -241,7 +243,7 @@
 	hdr->nexthdr = proto;
 	hdr->hop_limit = hlimit;
 
-	ipv6_addr_copy(&hdr->saddr, fl->nl_u.ip6_u.saddr);
+	ipv6_addr_copy(&hdr->saddr, fl->fl6_src);
 	ipv6_addr_copy(&hdr->daddr, first_hop);
 
 	mtu = dst_pmtu(dst);
@@ -306,8 +308,8 @@
 	hdr->hop_limit = hlimit;
 	hdr->nexthdr = fl->proto;
 
-	ipv6_addr_copy(&hdr->saddr, fl->nl_u.ip6_u.saddr);
-	ipv6_addr_copy(&hdr->daddr, fl->nl_u.ip6_u.daddr);
+	ipv6_addr_copy(&hdr->saddr, fl->fl6_src);
+	ipv6_addr_copy(&hdr->daddr, fl->fl6_dst);
 	return hdr;
 }
 
@@ -524,7 +526,7 @@
 		fl->fl6_dst = rt0->addr;
 	}
 
-	if (!fl->oif && ipv6_addr_is_multicast(fl->nl_u.ip6_u.daddr))
+	if (!fl->oif && ipv6_addr_is_multicast(fl->fl6_dst))
 		fl->oif = np->mcast_oif;
 
 	dst = __sk_dst_check(sk, np->dst_cookie);
@@ -701,7 +703,7 @@
 	 *	cleanup
 	 */
 out:
-	ip6_dst_store(sk, dst, fl->nl_u.ip6_u.daddr == &np->daddr ? &np->daddr : NULL);
+	ip6_dst_store(sk, dst, fl->fl6_dst == &np->daddr ? &np->daddr : NULL);
 	if (err > 0)
 		err = np->recverr ? net_xmit_errno(err) : 0;
 	return err;
diff -Nru a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c
--- a/net/ipv6/ipv6_sockglue.c	Sat Apr 19 19:51:28 2003
+++ b/net/ipv6/ipv6_sockglue.c	Sat Apr 19 19:51:28 2003
@@ -19,6 +19,10 @@
  *	o	Return -EINVAL for setsockopt of short lengths
  *	o	Truncate getsockopt returns
  *	o	Return an optlen of the truncated length if need be
+ *
+ *	Changes:
+ *	David L Stevens <dlstevens@us.ibm.com>:
+ *		- added multicast source filtering API for MLDv2
  */
 
 #include <linux/module.h>
@@ -196,7 +200,7 @@
 #ifdef INET_REFCNT_DEBUG
 			atomic_dec(&inet6_sock_nr);
 #endif
-			MOD_DEC_USE_COUNT;
+			module_put(THIS_MODULE);
 			retv = 0;
 			break;
 		}
@@ -375,6 +379,89 @@
 			retv = ipv6_sock_ac_drop(sk, mreq.ipv6mr_ifindex, &mreq.ipv6mr_acaddr);
 		break;
 	}
+	case MCAST_JOIN_GROUP:
+	case MCAST_LEAVE_GROUP:
+	{
+		struct group_req greq;
+		struct sockaddr_in6 *psin6;
+
+		retv = -EFAULT;
+		if (copy_from_user(&greq, optval, sizeof(struct group_req)))
+			break;
+		if (greq.gr_group.ss_family != AF_INET6) {
+			retv = -EADDRNOTAVAIL;
+			break;
+		}
+		psin6 = (struct sockaddr_in6 *)&greq.gr_group;
+		if (optname == IPV6_ADD_MEMBERSHIP)
+			retv = ipv6_sock_mc_join(sk, greq.gr_interface,
+				&psin6->sin6_addr);
+		else
+			retv = ipv6_sock_mc_drop(sk, greq.gr_interface,
+				&psin6->sin6_addr);
+	}
+	case MCAST_JOIN_SOURCE_GROUP:
+	case MCAST_LEAVE_SOURCE_GROUP:
+	case MCAST_BLOCK_SOURCE:
+	case MCAST_UNBLOCK_SOURCE:
+	{
+		struct group_source_req greqs;
+		int omode, add;
+
+		if (optlen != sizeof(struct group_source_req))
+			goto e_inval;
+		if (copy_from_user(&greqs, optval, sizeof(greqs))) {
+			retv = -EFAULT;
+			break;
+		}
+		if (greqs.gsr_group.ss_family != AF_INET6) {
+			retv = -EADDRNOTAVAIL;
+			break;
+		}
+		if (optname == MCAST_BLOCK_SOURCE) {
+			omode = MCAST_EXCLUDE;
+			add = 1;
+		} else if (optname == MCAST_UNBLOCK_SOURCE) {
+			omode = MCAST_EXCLUDE;
+			add = 0;
+		} else if (optname == MCAST_JOIN_SOURCE_GROUP) {
+			struct sockaddr_in6 *psin6;
+
+			psin6 = (struct sockaddr_in6 *)&greqs.gsr_group;
+			retv = ipv6_sock_mc_join(sk, greqs.gsr_interface,
+				&psin6->sin6_addr);
+			if (retv)
+				break;
+			omode = MCAST_INCLUDE;
+			add = 1;
+		} else /*IP_DROP_SOURCE_MEMBERSHIP */ {
+			omode = MCAST_INCLUDE;
+			add = 0;
+		}
+		retv = ip6_mc_source(add, omode, sk, &greqs);
+		break;
+	}
+	case MCAST_MSFILTER:
+	{
+		struct group_filter *gsf;
+
+		if (optlen < GROUP_FILTER_SIZE(0))
+			goto e_inval;
+		gsf = (struct group_filter *)kmalloc(optlen,GFP_KERNEL);
+		if (gsf == 0) {
+			retv = -ENOBUFS;
+			break;
+		}
+		retv = -EFAULT;
+		if (copy_from_user(gsf, optval, optlen)) {
+			kfree(gsf);
+			break;
+		}
+		retv = ip6_mc_msfilter(sk, gsf);
+		kfree(gsf);
+
+		break;
+	}
 	case IPV6_ROUTER_ALERT:
 		retv = ip6_ra_control(sk, val, NULL);
 		break;
@@ -448,6 +535,21 @@
 			return -ENOTCONN;
 		val = sk->family;
 		break;
+	case MCAST_MSFILTER:
+	{
+		struct group_filter gsf;
+		int err;
+
+		if (len < GROUP_FILTER_SIZE(0))
+			return -EINVAL;
+		if (copy_from_user(&gsf, optval, GROUP_FILTER_SIZE(0)))
+			return -EFAULT;
+		lock_sock(sk);
+		err = ip6_mc_msfget(sk, &gsf,
+			(struct group_filter *)optval, optlen);
+		release_sock(sk);
+		return err;
+	}
 
 	case IPV6_PKTOPTIONS:
 	{
diff -Nru a/net/ipv6/mcast.c b/net/ipv6/mcast.c
--- a/net/ipv6/mcast.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv6/mcast.c	Sat Apr 19 19:51:50 2003
@@ -24,6 +24,8 @@
  *	YOSHIFUJI Hideaki @USAGI:
  *		- Ignore Queries for invalid addresses.
  *		- MLD for link-local addresses.
+ *	David L Stevens <dlstevens@us.ibm.com>:
+ *		- MLDv2 support
  */
 
 #include <linux/config.h>
@@ -35,6 +37,7 @@
 #include <linux/sockios.h>
 #include <linux/jiffies.h>
 #include <linux/net.h>
+#include <linux/in.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
@@ -63,6 +66,58 @@
 #define MDBG(x)
 #endif
 
+/*
+ *  These header formats should be in a separate include file, but icmpv6.h
+ *  doesn't have in6_addr defined in all cases, there is no __u128, and no
+ *  other files reference these.
+ *
+ *  			+-DLS 4/14/03
+ */
+
+/* Multicast Listener Discovery version 2 headers */
+
+struct mld2_grec {
+	__u8		grec_type;
+	__u8		grec_auxwords;
+	__u16		grec_nsrcs;
+	struct in6_addr	grec_mca;
+	struct in6_addr	grec_src[0];
+};
+
+struct mld2_report {
+	__u8	type;
+	__u8	resv1;
+	__u16	csum;
+	__u16	resv2;
+	__u16	ngrec;
+	struct mld2_grec grec[0];
+};
+
+struct mld2_query {
+	__u8 type;
+	__u8 code;
+	__u16 csum;
+	__u16 mrc;
+	__u16 resv1;
+	struct in6_addr mca;
+#if defined(__LITTLE_ENDIAN_BITFIELD)
+	__u8 qrv:3,
+	     suppress:1,
+	     resv2:4;
+#elif defined(__BIG_ENDIAN_BITFIELD)
+	__u8 resv2:4,
+	     suppress:1,
+	     qrv:3;
+#else
+#error "Please fix <asm/byteorder.h>"
+#endif
+	__u8 qqic;
+	__u16 nsrcs;
+	struct in6_addr srcs[0];
+};
+
+struct in6_addr mld2_all_mcr = MLD2_ALL_MCR_INIT;
+
 /* Big mc list lock for all the sockets */
 static rwlock_t ipv6_sk_mc_lock = RW_LOCK_UNLOCKED;
 
@@ -72,7 +127,37 @@
 static void igmp6_leave_group(struct ifmcaddr6 *ma);
 static void igmp6_timer_handler(unsigned long data);
 
+static void mld_gq_timer_expire(unsigned long data);
+static void mld_ifc_timer_expire(unsigned long data);
+static void mld_ifc_event(struct inet6_dev *idev);
+static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
+static void mld_del_delrec(struct inet6_dev *idev, struct in6_addr *addr);
+static void mld_clear_delrec(struct inet6_dev *idev);
+static int sf_setstate(struct ifmcaddr6 *pmc);
+static void sf_markstate(struct ifmcaddr6 *pmc);
+static void ip6_mc_clear_src(struct ifmcaddr6 *pmc);
+int ip6_mc_del_src(struct inet6_dev *idev, struct in6_addr *pmca, int sfmode,
+	int sfcount, struct in6_addr *psfsrc, int delta);
+int ip6_mc_add_src(struct inet6_dev *idev, struct in6_addr *pmca, int sfmode,
+	int sfcount, struct in6_addr *psfsrc, int delta);
+int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml,
+	struct inet6_dev *idev);
+
+
 #define IGMP6_UNSOLICITED_IVAL	(10*HZ)
+#define MLD_QRV_DEFAULT		2
+
+#define MLD_V1_SEEN(idev) ((idev)->mc_v1_seen && \
+		time_before(jiffies, (idev)->mc_v1_seen))
+
+#define MLDV2_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value))
+#define MLDV2_EXP(thresh, nbmant, nbexp, value) \
+	((value) < (thresh) ? (value) : \
+	((MLDV2_MASK(value, nbmant) | (1<<(nbmant+nbexp))) << \
+	(MLDV2_MASK((value) >> (nbmant), nbexp) + (nbexp))))
+
+#define MLDV2_QQIC(value) MLDV2_EXP(0x80, 4, 3, value)
+#define MLDV2_MRC(value) MLDV2_EXP(0x8000, 12, 3, value)
 
 /*
  *	socket join on multicast group
@@ -113,6 +198,8 @@
 	}
 
 	mc_lst->ifindex = dev->ifindex;
+	mc_lst->sfmode = MCAST_EXCLUDE;
+	mc_lst->sflist = 0;
 
 	/*
 	 *	now add/increase the group membership on the device
@@ -154,6 +241,12 @@
 			write_unlock_bh(&ipv6_sk_mc_lock);
 
 			if ((dev = dev_get_by_index(mc_lst->ifindex)) != NULL) {
+				struct inet6_dev *idev = in6_dev_get(dev);
+
+				if (idev) {
+					(void) ip6_mc_leave_src(sk,mc_lst,idev);
+					in6_dev_put(idev);
+				}
 				ipv6_dev_mc_dec(dev, &mc_lst->addr);
 				dev_put(dev);
 			}
@@ -166,6 +259,40 @@
 	return -ENOENT;
 }
 
+struct inet6_dev *ip6_mc_find_dev(struct in6_addr *group, int ifindex)
+{
+	struct net_device *dev = 0;
+	struct inet6_dev *idev = 0;
+
+	if (ifindex == 0) {
+		struct rt6_info *rt;
+
+		rt = rt6_lookup(group, NULL, 0, 0);
+		if (rt) {
+			dev = rt->rt6i_dev;
+			dev_hold(dev);
+			dst_release(&rt->u.dst);
+		}
+	} else
+		dev = dev_get_by_index(ifindex);
+
+	if (!dev)
+		return 0;
+	idev = in6_dev_get(dev);
+	if (!idev) {
+		dev_put(dev);
+		return 0;
+	}
+	read_lock_bh(&idev->lock);
+	if (idev->dead) {
+		read_unlock_bh(&idev->lock);
+		in6_dev_put(idev);
+		dev_put(dev);
+		return 0;
+	}
+	return idev;
+}
+
 void ipv6_sock_mc_close(struct sock *sk)
 {
 	struct ipv6_pinfo *np = inet6_sk(sk);
@@ -180,6 +307,12 @@
 
 		dev = dev_get_by_index(mc_lst->ifindex);
 		if (dev) {
+			struct inet6_dev *idev = in6_dev_get(dev);
+
+			if (idev) {
+				(void) ip6_mc_leave_src(sk, mc_lst, idev);
+				in6_dev_put(idev);
+			}
 			ipv6_dev_mc_dec(dev, &mc_lst->addr);
 			dev_put(dev);
 		}
@@ -191,21 +324,291 @@
 	write_unlock_bh(&ipv6_sk_mc_lock);
 }
 
-int inet6_mc_check(struct sock *sk, struct in6_addr *addr)
+int ip6_mc_source(int add, int omode, struct sock *sk,
+	struct group_source_req *pgsr)
+{
+	struct in6_addr *source, *group;
+	struct ipv6_mc_socklist *pmc;
+	struct net_device *dev;
+	struct inet6_dev *idev;
+	struct ipv6_pinfo *inet6 = inet6_sk(sk);
+	struct ip6_sf_socklist *psl;
+	int i, j, rv;
+	int err;
+
+	if (pgsr->gsr_group.ss_family != AF_INET6 ||
+	    pgsr->gsr_source.ss_family != AF_INET6)
+		return -EINVAL;
+
+	source = &((struct sockaddr_in6 *)&pgsr->gsr_source)->sin6_addr;
+	group = &((struct sockaddr_in6 *)&pgsr->gsr_group)->sin6_addr;
+
+	if (!(ipv6_addr_type(group) & IPV6_ADDR_MULTICAST))
+		return -EINVAL;
+
+	idev = ip6_mc_find_dev(group, pgsr->gsr_interface);
+	if (!idev)
+		return -ENODEV;
+	dev = idev->dev;
+
+	err = -EADDRNOTAVAIL;
+
+	for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) {
+		if (pmc->ifindex != pgsr->gsr_interface)
+			continue;
+		if (ipv6_addr_cmp(&pmc->addr, group) == 0)
+			break;
+	}
+	if (!pmc)		/* must have a prior join */
+		goto done;
+	/* if a source filter was set, must be the same mode as before */
+	if (pmc->sflist) {
+		if (pmc->sfmode != omode)
+			goto done;
+	} else if (pmc->sfmode != omode) {
+		/* allow mode switches for empty-set filters */
+		ip6_mc_del_src(idev, group, pmc->sfmode, 0, 0, 0);
+		pmc->sfmode = omode;
+		ip6_mc_del_src(idev, group, pmc->sfmode, 0, 0, 0);
+	}
+
+	psl = pmc->sflist;
+	if (!add) {
+		if (!psl)
+			goto done;
+		rv = !0;
+		for (i=0; i<psl->sl_count; i++) {
+			rv = memcmp(&psl->sl_addr, group,
+				sizeof(struct in6_addr));
+			if (rv >= 0)
+				break;
+		}
+		if (!rv)	/* source not found */
+			goto done;
+
+		/* update the interface filter */
+		ip6_mc_del_src(idev, group, omode, 1, source, 1);
+
+		for (j=i+1; j<psl->sl_count; j++)
+			psl->sl_addr[j-1] = psl->sl_addr[j];
+		psl->sl_count--;
+		err = 0;
+		goto done;
+	}
+	/* else, add a new source to the filter */
+
+	if (!psl || psl->sl_count == psl->sl_max) {
+		struct ip6_sf_socklist *newpsl;
+		int count = IP6_SFBLOCK;
+
+		if (psl)
+			count += psl->sl_max;
+		newpsl = (struct ip6_sf_socklist *)sock_kmalloc(sk,
+			IP6_SFLSIZE(count), GFP_ATOMIC);
+		if (!newpsl) {
+			err = -ENOBUFS;
+			goto done;
+		}
+		newpsl->sl_max = count;
+		newpsl->sl_count = count - IP6_SFBLOCK;
+		if (psl) {
+			for (i=0; i<psl->sl_count; i++)
+				newpsl->sl_addr[i] = psl->sl_addr[i];
+			sock_kfree_s(sk, psl, IP6_SFLSIZE(psl->sl_max));
+		}
+		pmc->sflist = psl = newpsl;
+	}
+	rv = 1;	/* > 0 for insert logic below if sl_count is 0 */
+	for (i=0; i<psl->sl_count; i++) {
+		rv = memcmp(&psl->sl_addr, group, sizeof(struct in6_addr));
+		if (rv >= 0)
+			break;
+	}
+	if (rv == 0)		/* address already there is an error */
+		goto done;
+	for (j=psl->sl_count-1; j>=i; j--)
+		psl->sl_addr[j+1] = psl->sl_addr[j];
+	psl->sl_addr[i] = *source;
+	psl->sl_count++;
+	err = 0;
+	/* update the interface list */
+	ip6_mc_add_src(idev, group, omode, 1, source, 1);
+done:
+	read_unlock_bh(&idev->lock);
+	in6_dev_put(idev);
+	dev_put(dev);
+	return err;
+}
+
+int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf)
+{
+	struct in6_addr *group;
+	struct ipv6_mc_socklist *pmc;
+	struct net_device *dev;
+	struct inet6_dev *idev;
+	struct ipv6_pinfo *inet6 = inet6_sk(sk);
+	struct ip6_sf_socklist *newpsl, *psl;
+	int i, err;
+
+	group = &((struct sockaddr_in6 *)&gsf->gf_group)->sin6_addr;
+
+	if (!(ipv6_addr_type(group) & IPV6_ADDR_MULTICAST))
+		return -EINVAL;
+	if (gsf->gf_fmode != MCAST_INCLUDE &&
+	    gsf->gf_fmode != MCAST_EXCLUDE)
+		return -EINVAL;
+
+	idev = ip6_mc_find_dev(group, gsf->gf_interface);
+
+	if (!idev)
+		return -ENODEV;
+	dev = idev->dev;
+	err = -EADDRNOTAVAIL;
+
+	for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) {
+		if (pmc->ifindex != gsf->gf_interface)
+			continue;
+		if (ipv6_addr_cmp(&pmc->addr, group) == 0)
+			break;
+	}
+	if (!pmc)		/* must have a prior join */
+		goto done;
+	if (gsf->gf_numsrc) {
+		newpsl = (struct ip6_sf_socklist *)sock_kmalloc(sk,
+				IP6_SFLSIZE(gsf->gf_numsrc), GFP_ATOMIC);
+		if (!newpsl) {
+			err = -ENOBUFS;
+			goto done;
+		}
+		newpsl->sl_max = newpsl->sl_count = gsf->gf_numsrc;
+		for (i=0; i<newpsl->sl_count; ++i) {
+			struct sockaddr_in6 *psin6;
+
+			psin6 = (struct sockaddr_in6 *)&gsf->gf_slist[i];
+			newpsl->sl_addr[i] = psin6->sin6_addr;
+		}
+		err = ip6_mc_add_src(idev, group, gsf->gf_fmode,
+			newpsl->sl_count, newpsl->sl_addr, 0);
+		if (err) {
+			sock_kfree_s(sk, newpsl, IP6_SFLSIZE(newpsl->sl_max));
+			goto done;
+		}
+	} else
+		newpsl = 0;
+	psl = pmc->sflist;
+	if (psl) {
+		(void) ip6_mc_del_src(idev, group, pmc->sfmode,
+			psl->sl_count, psl->sl_addr, 0);
+		sock_kfree_s(sk, psl, IP6_SFLSIZE(psl->sl_max));
+	} else
+		(void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, 0, 0);
+	pmc->sflist = newpsl;
+	pmc->sfmode = gsf->gf_fmode;
+done:
+	read_unlock_bh(&idev->lock);
+	in6_dev_put(idev);
+	dev_put(dev);
+	return err;
+}
+
+int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
+	struct group_filter *optval, int *optlen)
+{
+	int err, i, count, copycount;
+	struct in6_addr *group;
+	struct ipv6_mc_socklist *pmc;
+	struct inet6_dev *idev;
+	struct net_device *dev;
+	struct ipv6_pinfo *inet6 = inet6_sk(sk);
+	struct ip6_sf_socklist *psl;
+
+	group = &((struct sockaddr_in6 *)&gsf->gf_group)->sin6_addr;
+
+	if (!(ipv6_addr_type(group) & IPV6_ADDR_MULTICAST))
+		return -EINVAL;
+
+	idev = ip6_mc_find_dev(group, gsf->gf_interface);
+
+	if (!idev)
+		return -ENODEV;
+
+	dev = idev->dev;
+
+	err = -EADDRNOTAVAIL;
+
+	for (pmc=inet6->ipv6_mc_list; pmc; pmc=pmc->next) {
+		if (pmc->ifindex != gsf->gf_interface)
+			continue;
+		if (ipv6_addr_cmp(group, &pmc->addr) == 0)
+			break;
+	}
+	if (!pmc)		/* must have a prior join */
+		goto done;
+	gsf->gf_fmode = pmc->sfmode;
+	psl = pmc->sflist;
+	count = psl ? psl->sl_count : 0;
+	read_unlock_bh(&idev->lock);
+	in6_dev_put(idev);
+	dev_put(dev);
+
+	copycount = count < gsf->gf_numsrc ? count : gsf->gf_numsrc;
+	gsf->gf_numsrc = count;
+	if (put_user(GROUP_FILTER_SIZE(copycount), optlen) ||
+	    copy_to_user((void *)optval, gsf, GROUP_FILTER_SIZE(0))) {
+		return -EFAULT;
+	}
+	for (i=0; i<copycount; i++) {
+		struct sockaddr_in6 *psin6;
+		struct sockaddr_storage ss;
+
+		psin6 = (struct sockaddr_in6 *)&ss;
+		memset(&ss, 0, sizeof(ss));
+		psin6->sin6_family = AF_INET6;
+		psin6->sin6_addr = psl->sl_addr[i];
+	    	if (copy_to_user((void *)&optval->gf_slist[i], &ss, sizeof(ss)))
+			return -EFAULT;
+	}
+	return 0;
+done:
+	read_unlock_bh(&idev->lock);
+	in6_dev_put(idev);
+	dev_put(dev);
+	return err;
+}
+
+int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
+	struct in6_addr *src_addr)
 {
 	struct ipv6_pinfo *np = inet6_sk(sk);
 	struct ipv6_mc_socklist *mc;
+	struct ip6_sf_socklist *psl;
+	int rv = 0;
 
 	read_lock(&ipv6_sk_mc_lock);
 	for (mc = np->ipv6_mc_list; mc; mc = mc->next) {
-		if (ipv6_addr_cmp(&mc->addr, addr) == 0) {
-			read_unlock(&ipv6_sk_mc_lock);
-			return 1;
+		if (ipv6_addr_cmp(&mc->addr, mc_addr) == 0)
+			break;
+	}
+	if (!mc) {
+		read_unlock(&ipv6_sk_mc_lock);
+		return 0;
+	}
+	psl = mc->sflist;
+	if (!psl) {
+		rv = mc->sfmode == MCAST_EXCLUDE;
+	} else {
+		int i;
+
+		for (i=0; i<psl->sl_count; i++) {
+			if (ipv6_addr_cmp(&psl->sl_addr[i], src_addr) == 0)
+				break;
 		}
+		rv = (mc->sfmode == MCAST_INCLUDE && i < psl->sl_count);
+		rv |= (mc->sfmode == MCAST_EXCLUDE && i >= psl->sl_count);
 	}
 	read_unlock(&ipv6_sk_mc_lock);
 
-	return 0;
+	return rv;
 }
 
 static void ma_put(struct ifmcaddr6 *mc)
@@ -216,7 +619,7 @@
 	}
 }
 
-static int igmp6_group_added(struct ifmcaddr6 *mc)
+static void igmp6_group_added(struct ifmcaddr6 *mc)
 {
 	struct net_device *dev = mc->idev->dev;
 	char buf[MAX_ADDR_LEN];
@@ -229,12 +632,20 @@
 	}
 	spin_unlock_bh(&mc->mca_lock);
 
-	if (dev->flags&IFF_UP)
+	if (!(dev->flags & IFF_UP) || (mc->mca_flags & MAF_NOREPORT))
+		return;
+
+	if (MLD_V1_SEEN(mc->idev)) {
 		igmp6_join_group(mc);
-	return 0;
+		return;
+	}
+	/* else v2 */
+
+	mc->mca_crcount = mc->idev->mc_qrv;
+	mld_ifc_event(mc->idev);
 }
 
-static int igmp6_group_dropped(struct ifmcaddr6 *mc)
+static void igmp6_group_dropped(struct ifmcaddr6 *mc)
 {
 	struct net_device *dev = mc->idev->dev;
 	char buf[MAX_ADDR_LEN];
@@ -247,9 +658,122 @@
 	}
 	spin_unlock_bh(&mc->mca_lock);
 
+	if (mc->mca_flags & MAF_NOREPORT)
+		goto done;
+
 	if (dev->flags&IFF_UP)
 		igmp6_leave_group(mc);
-	return 0;
+
+	spin_lock_bh(&mc->mca_lock);
+	if (del_timer(&mc->mca_timer))
+		atomic_dec(&mc->mca_refcnt);
+	spin_unlock_bh(&mc->mca_lock);
+
+done:
+	ip6_mc_clear_src(mc);
+}
+
+/*
+ * deleted ifmcaddr6 manipulation
+ */
+static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im)
+{
+	struct ifmcaddr6 *pmc;
+
+	/* this is an "ifmcaddr6" for convenience; only the fields below
+	 * are actually used. In particular, the refcnt and users are not
+	 * used for management of the delete list. Using the same structure
+	 * for deleted items allows change reports to use common code with
+	 * non-deleted or query-response MCA's.
+	 */
+	pmc = (struct ifmcaddr6 *)kmalloc(sizeof(*pmc), GFP_ATOMIC);
+	if (!pmc)
+		return;
+	memset(pmc, 0, sizeof(*pmc));
+	spin_lock_bh(&im->mca_lock);
+	pmc->mca_lock = SPIN_LOCK_UNLOCKED;
+	pmc->idev = im->idev;
+	in6_dev_hold(idev);
+	pmc->mca_addr = im->mca_addr;
+	pmc->mca_crcount = idev->mc_qrv;
+	pmc->mca_sfmode = im->mca_sfmode;
+	if (pmc->mca_sfmode == MCAST_INCLUDE) {
+		struct ip6_sf_list *psf;
+
+		pmc->mca_tomb = im->mca_tomb;
+		pmc->mca_sources = im->mca_sources;
+		im->mca_tomb = im->mca_sources = 0;
+		for (psf=pmc->mca_sources; psf; psf=psf->sf_next)
+			psf->sf_crcount = pmc->mca_crcount;
+	}
+	spin_unlock_bh(&im->mca_lock);
+
+	write_lock_bh(&idev->mc_lock);
+	pmc->next = idev->mc_tomb;
+	idev->mc_tomb = pmc;
+	write_unlock_bh(&idev->mc_lock);
+}
+
+static void mld_del_delrec(struct inet6_dev *idev, struct in6_addr *pmca)
+{
+	struct ifmcaddr6 *pmc, *pmc_prev;
+	struct ip6_sf_list *psf, *psf_next;
+
+	write_lock_bh(&idev->mc_lock);
+	pmc_prev = 0;
+	for (pmc=idev->mc_tomb; pmc; pmc=pmc->next) {
+		if (ipv6_addr_cmp(&pmc->mca_addr, pmca) == 0)
+			break;
+		pmc_prev = pmc;
+	}
+	if (pmc) {
+		if (pmc_prev)
+			pmc_prev->next = pmc->next;
+		else
+			idev->mc_tomb = pmc->next;
+	}
+	write_unlock_bh(&idev->mc_lock);
+	if (pmc) {
+		for (psf=pmc->mca_tomb; psf; psf=psf_next) {
+			psf_next = psf->sf_next;
+			kfree(psf);
+		}
+		in6_dev_put(pmc->idev);
+		kfree(pmc);
+	}
+}
+
+static void mld_clear_delrec(struct inet6_dev *idev)
+{
+	struct ifmcaddr6 *pmc, *nextpmc;
+
+	write_lock_bh(&idev->mc_lock);
+	pmc = idev->mc_tomb;
+	idev->mc_tomb = 0;
+	write_unlock_bh(&idev->mc_lock);
+
+	for (; pmc; pmc = nextpmc) {
+		nextpmc = pmc->next;
+		ip6_mc_clear_src(pmc);
+		in6_dev_put(pmc->idev);
+		kfree(pmc);
+	}
+
+	/* clear dead sources, too */
+	read_lock_bh(&idev->lock);
+	for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
+		struct ip6_sf_list *psf, *psf_next;
+
+		spin_lock_bh(&pmc->mca_lock);
+		psf = pmc->mca_tomb;
+		pmc->mca_tomb = 0;
+		spin_unlock_bh(&pmc->mca_lock);
+		for (psf=pmc->mca_tomb; psf; psf=psf_next) {
+			psf_next = psf->sf_next;
+			kfree(psf);
+		}
+	}
+	read_unlock_bh(&idev->lock);
 }
 
 
@@ -277,6 +801,8 @@
 		if (ipv6_addr_cmp(&mc->mca_addr, addr) == 0) {
 			mc->mca_users++;
 			write_unlock_bh(&idev->lock);
+			ip6_mc_add_src(idev, &mc->mca_addr, MCAST_EXCLUDE, 0,
+				0, 0);
 			in6_dev_put(idev);
 			return 0;
 		}
@@ -305,10 +831,19 @@
 	atomic_set(&mc->mca_refcnt, 2);
 	mc->mca_lock = SPIN_LOCK_UNLOCKED;
 
+	/* initial mode is (EX, empty) */
+	mc->mca_sfmode = MCAST_EXCLUDE;
+	mc->mca_sfcount[MCAST_EXCLUDE] = 1;
+
+	if (ipv6_addr_is_ll_all_nodes(&mc->mca_addr) ||
+	    IPV6_ADDR_MC_SCOPE(&mc->mca_addr) < IPV6_ADDR_SCOPE_LINKLOCAL)
+		mc->mca_flags |= MAF_NOREPORT;
+
 	mc->next = idev->mc_list;
 	idev->mc_list = mc;
 	write_unlock_bh(&idev->lock);
 
+	mld_del_delrec(idev, &mc->mca_addr);
 	igmp6_group_added(mc);
 	ma_put(mc);
 	return 0;
@@ -353,25 +888,57 @@
 /*
  *	check if the interface/address pair is valid
  */
-int ipv6_chk_mcast_addr(struct net_device *dev, struct in6_addr *addr)
+int ipv6_chk_mcast_addr(struct net_device *dev, struct in6_addr *group,
+	struct in6_addr *src_addr)
 {
 	struct inet6_dev *idev;
 	struct ifmcaddr6 *mc;
+	int rv = 0;
 
 	idev = in6_dev_get(dev);
 	if (idev) {
 		read_lock_bh(&idev->lock);
 		for (mc = idev->mc_list; mc; mc=mc->next) {
-			if (ipv6_addr_cmp(&mc->mca_addr, addr) == 0) {
-				read_unlock_bh(&idev->lock);
-				in6_dev_put(idev);
-				return 1;
+			if (ipv6_addr_cmp(&mc->mca_addr, group) == 0)
+				break;
+		}
+		if (mc) {
+			struct ip6_sf_list *psf;
+
+			spin_lock_bh(&mc->mca_lock);
+			for (psf=mc->mca_sources; psf; psf=psf->sf_next) {
+				if (ipv6_addr_cmp(&psf->sf_addr, src_addr) == 0)
+					break;
 			}
+			if (psf)
+				rv = psf->sf_count[MCAST_INCLUDE] ||
+					psf->sf_count[MCAST_EXCLUDE] !=
+					mc->mca_sfcount[MCAST_EXCLUDE];
+			else
+				rv = mc->mca_sfcount[MCAST_EXCLUDE] != 0;
+			spin_unlock_bh(&mc->mca_lock);
 		}
 		read_unlock_bh(&idev->lock);
 		in6_dev_put(idev);
 	}
-	return 0;
+	return rv;
+}
+
+static void mld_gq_start_timer(struct inet6_dev *idev)
+{
+	int tv = net_random() % idev->mc_maxdelay;
+
+	idev->mc_gq_running = 1;
+	if (!mod_timer(&idev->mc_gq_timer, jiffies+tv+2))
+		atomic_inc(&idev->refcnt);
+}
+
+static void mld_ifc_start_timer(struct inet6_dev *idev, int delay)
+{
+	int tv = net_random() % delay;
+
+	if (!mod_timer(&idev->mc_ifc_timer, jiffies+tv+2))
+		atomic_inc(&idev->refcnt);
 }
 
 /*
@@ -386,7 +953,6 @@
 	if (ipv6_addr_type(&ma->mca_addr)&(IPV6_ADDR_LINKLOCAL|IPV6_ADDR_LOOPBACK))
 		return;
 
-	spin_lock(&ma->mca_lock);
 	if (del_timer(&ma->mca_timer)) {
 		atomic_dec(&ma->mca_refcnt);
 		delay = ma->mca_timer.expires - jiffies;
@@ -398,60 +964,137 @@
 		else
 			delay = 1;
 	}
-
 	ma->mca_timer.expires = jiffies + delay;
 	if (!mod_timer(&ma->mca_timer, jiffies + delay))
 		atomic_inc(&ma->mca_refcnt);
-	spin_unlock(&ma->mca_lock);
+}
+
+static void mld_marksources(struct ifmcaddr6 *pmc, int nsrcs,
+	struct in6_addr *srcs)
+{
+	struct ip6_sf_list *psf;
+	int i, scount;
+
+	scount = 0;
+	for (psf=pmc->mca_sources; psf; psf=psf->sf_next) {
+		if (scount == nsrcs)
+			break;
+		for (i=0; i<nsrcs; i++)
+			if (ipv6_addr_cmp(&srcs[i], &psf->sf_addr) == 0) {
+				psf->sf_gsresp = 1;
+				scount++;
+				break;
+			}
+	}
 }
 
 int igmp6_event_query(struct sk_buff *skb)
 {
+	struct mld2_query *mlh2 = (struct mld2_query *) skb->h.raw;
 	struct ifmcaddr6 *ma;
-	struct in6_addr *addrp;
-	unsigned long resptime;
+	struct in6_addr *group;
+	unsigned long max_delay;
 	struct inet6_dev *idev;
 	struct icmp6hdr *hdr;
-	int addr_type;
+	int group_type;
+	int mark = 0;
+	int len;
 
 	if (!pskb_may_pull(skb, sizeof(struct in6_addr)))
 		return -EINVAL;
 
-	hdr = (struct icmp6hdr*) skb->h.raw;
+	len = ntohs(skb->nh.ipv6h->payload_len);
 
 	/* Drop queries with not link local source */
 	if (!(ipv6_addr_type(&skb->nh.ipv6h->saddr)&IPV6_ADDR_LINKLOCAL))
 		return -EINVAL;
 
-	resptime = ntohs(hdr->icmp6_maxdelay);
-	/* Translate milliseconds to jiffies */
-	resptime = (resptime<<10)/(1024000/HZ);
-
-	addrp = (struct in6_addr *) (hdr + 1);
-	addr_type = ipv6_addr_type(addrp);
-
-	if (addr_type != IPV6_ADDR_ANY &&
-	    !(addr_type&IPV6_ADDR_MULTICAST))
-		return -EINVAL;
-
 	idev = in6_dev_get(skb->dev);
 
 	if (idev == NULL)
 		return 0;
 
-	read_lock(&idev->lock);
-	if (addr_type == IPV6_ADDR_ANY) {
-		for (ma = idev->mc_list; ma; ma=ma->next)
-			igmp6_group_queried(ma, resptime);
+	hdr = (struct icmp6hdr *) skb->h.raw;
+	group = (struct in6_addr *) (hdr + 1);
+	group_type = ipv6_addr_type(group);
+
+	if (group_type != IPV6_ADDR_ANY &&
+	    !(group_type&IPV6_ADDR_MULTICAST)) {
+		in6_dev_put(idev);
+		return -EINVAL;
+	}
+
+	if (len == 24) {
+		int switchback;
+		/* MLDv1 router present */
+
+		/* Translate milliseconds to jiffies */
+		max_delay = ntohs(hdr->icmp6_maxdelay)*(HZ/10);
+
+		switchback = (idev->mc_qrv + 1) * max_delay;
+		idev->mc_v1_seen = jiffies + switchback;
+
+		/* cancel the interface change timer */
+		idev->mc_ifc_count = 0;
+		if (del_timer(&idev->mc_ifc_timer))
+			atomic_dec(&idev->refcnt);
+		/* clear deleted report items */
+		mld_clear_delrec(idev);
+	} else if (len >= 28) {
+		max_delay = MLDV2_MRC(ntohs(mlh2->mrc))*(HZ/10);
+		idev->mc_maxdelay = max_delay;
+		if (mlh2->qrv)
+			idev->mc_qrv = mlh2->qrv;
+		if (group_type == IPV6_ADDR_ANY) { /* general query */
+			if (mlh2->nsrcs) {
+				in6_dev_put(idev);
+				return -EINVAL; /* no sources allowed */
+			}
+			mld_gq_start_timer(idev);
+			in6_dev_put(idev);
+			return 0;
+		}
+		/* mark sources to include, if group & source-specific */
+		mark = mlh2->nsrcs != 0;
 	} else {
+		in6_dev_put(idev);
+		return -EINVAL;
+	}
+
+	read_lock_bh(&idev->lock);
+	if (group_type == IPV6_ADDR_ANY) {
 		for (ma = idev->mc_list; ma; ma=ma->next) {
-			if (ipv6_addr_cmp(addrp, &ma->mca_addr) == 0) {
-				igmp6_group_queried(ma, resptime);
-				break;
+			spin_lock_bh(&ma->mca_lock);
+			igmp6_group_queried(ma, max_delay);
+			spin_unlock_bh(&ma->mca_lock);
+		}
+	} else {
+		for (ma = idev->mc_list; ma; ma=ma->next) {
+			if (group_type != IPV6_ADDR_ANY &&
+			    ipv6_addr_cmp(group, &ma->mca_addr) != 0)
+				continue;
+			spin_lock_bh(&ma->mca_lock);
+			if (ma->mca_flags & MAF_TIMER_RUNNING) {
+				/* gsquery <- gsquery && mark */
+				if (!mark)
+					ma->mca_flags &= ~MAF_GSQUERY;
+			} else {
+				/* gsquery <- mark */
+				if (mark)
+					ma->mca_flags |= MAF_GSQUERY;
+				else
+					ma->mca_flags &= ~MAF_GSQUERY;
 			}
+			if (ma->mca_flags & MAF_GSQUERY)
+				mld_marksources(ma, ntohs(mlh2->nsrcs),
+					mlh2->srcs);
+			igmp6_group_queried(ma, max_delay);
+			spin_unlock_bh(&ma->mca_lock);
+			if (group_type != IPV6_ADDR_ANY)
+				break;
 		}
 	}
-	read_unlock(&idev->lock);
+	read_unlock_bh(&idev->lock);
 	in6_dev_put(idev);
 
 	return 0;
@@ -491,7 +1134,7 @@
 	 *	Cancel the timer for this group
 	 */
 
-	read_lock(&idev->lock);
+	read_lock_bh(&idev->lock);
 	for (ma = idev->mc_list; ma; ma=ma->next) {
 		if (ipv6_addr_cmp(&ma->mca_addr, addrp) == 0) {
 			spin_lock(&ma->mca_lock);
@@ -502,11 +1145,376 @@
 			break;
 		}
 	}
-	read_unlock(&idev->lock);
+	read_unlock_bh(&idev->lock);
 	in6_dev_put(idev);
 	return 0;
 }
 
+static int is_in(struct ifmcaddr6 *pmc, struct ip6_sf_list *psf, int type,
+	int gdeleted, int sdeleted)
+{
+	switch (type) {
+	case MLD2_MODE_IS_INCLUDE:
+	case MLD2_MODE_IS_EXCLUDE:
+		if (gdeleted || sdeleted)
+			return 0;
+		return !((pmc->mca_flags & MAF_GSQUERY) && !psf->sf_gsresp);
+	case MLD2_CHANGE_TO_INCLUDE:
+		if (gdeleted || sdeleted)
+			return 0;
+		return psf->sf_count[MCAST_INCLUDE] != 0;
+	case MLD2_CHANGE_TO_EXCLUDE:
+		if (gdeleted || sdeleted)
+			return 0;
+		if (pmc->mca_sfcount[MCAST_EXCLUDE] == 0 ||
+		    psf->sf_count[MCAST_INCLUDE])
+			return 0;
+		return pmc->mca_sfcount[MCAST_EXCLUDE] ==
+			psf->sf_count[MCAST_EXCLUDE];
+	case MLD2_ALLOW_NEW_SOURCES:
+		if (gdeleted || !psf->sf_crcount)
+			return 0;
+		return (pmc->mca_sfmode == MCAST_INCLUDE) ^ sdeleted;
+	case MLD2_BLOCK_OLD_SOURCES:
+		if (pmc->mca_sfmode == MCAST_INCLUDE)
+			return gdeleted || (psf->sf_crcount && sdeleted);
+		return psf->sf_crcount && !gdeleted && !sdeleted;
+	}
+	return 0;
+}
+
+static int
+mld_scount(struct ifmcaddr6 *pmc, int type, int gdeleted, int sdeleted)
+{
+	struct ip6_sf_list *psf;
+	int scount = 0;
+
+	for (psf=pmc->mca_sources; psf; psf=psf->sf_next) {
+		if (!is_in(pmc, psf, type, gdeleted, sdeleted))
+			continue;
+		scount++;
+	}
+	return scount;
+}
+
+static struct sk_buff *mld_newpack(struct net_device *dev, int size)
+{
+	struct sock *sk = igmp6_socket->sk;
+	struct sk_buff *skb;
+	struct mld2_report *pmr;
+	struct in6_addr addr_buf;
+	int err;
+	u8 ra[8] = { IPPROTO_ICMPV6, 0,
+		     IPV6_TLV_ROUTERALERT, 2, 0, 0,
+		     IPV6_TLV_PADN, 0 };
+
+	skb = sock_alloc_send_skb(sk, size + dev->hard_header_len+15, 0, &err);
+
+	if (skb == 0)
+		return 0;
+
+	skb_reserve(skb, (dev->hard_header_len + 15) & ~15);
+	if (dev->hard_header) {
+		unsigned char ha[MAX_ADDR_LEN];
+
+		ndisc_mc_map(&mld2_all_mcr, ha, dev, 1);
+		if (dev->hard_header(skb, dev, ETH_P_IPV6,ha,NULL,size) < 0) {
+			kfree_skb(skb);
+			return 0;
+		}
+	}
+
+	if (ipv6_get_lladdr(dev, &addr_buf)) {
+		/* <draft-ietf-magma-mld-source-02.txt>:
+		 * use unspecified address as the source address 
+		 * when a valid link-local address is not available.
+		 */
+		memset(&addr_buf, 0, sizeof(addr_buf));
+	}
+
+	ip6_nd_hdr(sk, skb, dev, &addr_buf, &mld2_all_mcr, NEXTHDR_HOP, 0);
+
+	memcpy(skb_put(skb, sizeof(ra)), ra, sizeof(ra));
+
+	pmr =(struct mld2_report *)skb_put(skb, sizeof(*pmr));
+	skb->h.raw = (unsigned char *)pmr;
+	pmr->type = ICMPV6_MLD2_REPORT;
+	pmr->resv1 = 0;
+	pmr->csum = 0;
+	pmr->resv2 = 0;
+	pmr->ngrec = 0;
+	return skb;
+}
+
+static void mld_sendpack(struct sk_buff *skb)
+{
+	struct ipv6hdr *pip6 = skb->nh.ipv6h;
+	struct mld2_report *pmr = (struct mld2_report *)skb->h.raw;
+	int payload_len, mldlen;
+
+	payload_len = skb->tail - (unsigned char *)skb->nh.ipv6h -
+		sizeof(struct ipv6hdr);
+	mldlen = skb->tail - skb->h.raw;
+	pip6->payload_len = htons(payload_len);
+
+	pmr->csum = csum_ipv6_magic(&pip6->saddr, &pip6->daddr, mldlen,
+		IPPROTO_ICMPV6, csum_partial(skb->h.raw, mldlen, 0));
+	dev_queue_xmit(skb);
+	ICMP6_INC_STATS(Icmp6OutMsgs);
+}
+
+static int grec_size(struct ifmcaddr6 *pmc, int type, int gdel, int sdel)
+{
+	return sizeof(struct mld2_grec) + 4*mld_scount(pmc,type,gdel,sdel);
+}
+
+static struct sk_buff *add_grhead(struct sk_buff *skb, struct ifmcaddr6 *pmc,
+	int type, struct mld2_grec **ppgr)
+{
+	struct net_device *dev = pmc->idev->dev;
+	struct mld2_report *pmr;
+	struct mld2_grec *pgr;
+
+	if (!skb)
+		skb = mld_newpack(dev, dev->mtu);
+	if (!skb)
+		return 0;
+	pgr = (struct mld2_grec *)skb_put(skb, sizeof(struct mld2_grec));
+	pgr->grec_type = type;
+	pgr->grec_auxwords = 0;
+	pgr->grec_nsrcs = 0;
+	pgr->grec_mca = pmc->mca_addr;	/* structure copy */
+	pmr = (struct mld2_report *)skb->h.raw;
+	pmr->ngrec = htons(ntohs(pmr->ngrec)+1);
+	*ppgr = pgr;
+	return skb;
+}
+
+#define AVAILABLE(skb) ((skb) ? ((skb)->dev ? (skb)->dev->mtu - (skb)->len : \
+	skb_tailroom(skb)) : 0)
+
+static struct sk_buff *add_grec(struct sk_buff *skb, struct ifmcaddr6 *pmc,
+	int type, int gdeleted, int sdeleted)
+{
+	struct net_device *dev = pmc->idev->dev;
+	struct mld2_report *pmr;
+	struct mld2_grec *pgr = 0;
+	struct ip6_sf_list *psf, *psf_next, *psf_prev, *psf_list;
+	int scount, first, isquery, truncate;
+
+	if (pmc->mca_flags & MAF_NOREPORT)
+		return skb;
+
+	isquery = type == MLD2_MODE_IS_INCLUDE ||
+		  type == MLD2_MODE_IS_EXCLUDE;
+	truncate = type == MLD2_MODE_IS_EXCLUDE ||
+		    type == MLD2_CHANGE_TO_EXCLUDE;
+
+	psf_list = sdeleted ? pmc->mca_tomb : pmc->mca_sources;
+
+	if (!psf_list) {
+		if (type == MLD2_ALLOW_NEW_SOURCES ||
+		    type == MLD2_BLOCK_OLD_SOURCES)
+			return skb;
+		if (pmc->mca_crcount || isquery)
+			skb = add_grhead(skb, pmc, type, &pgr);
+		return skb;
+	}
+	pmr = skb ? (struct mld2_report *)skb->h.raw : 0;
+
+	/* EX and TO_EX get a fresh packet, if needed */
+	if (truncate) {
+		if (pmr && pmr->ngrec &&
+		    AVAILABLE(skb) < grec_size(pmc, type, gdeleted, sdeleted)) {
+			if (skb)
+				mld_sendpack(skb);
+			skb = mld_newpack(dev, dev->mtu);
+		}
+	}
+	first = 1;
+	scount = 0;
+	psf_prev = 0;
+	for (psf=psf_list; psf; psf=psf_next) {
+		struct in6_addr *psrc;
+
+		psf_next = psf->sf_next;
+
+		if (!is_in(pmc, psf, type, gdeleted, sdeleted)) {
+			psf_prev = psf;
+			continue;
+		}
+
+		/* clear marks on query responses */
+		if (isquery)
+			psf->sf_gsresp = 0;
+
+		if (AVAILABLE(skb) < sizeof(*psrc) +
+		    first*sizeof(struct mld2_grec)) {
+			if (truncate && !first)
+				break;	 /* truncate these */
+			if (pgr)
+				pgr->grec_nsrcs = htons(scount);
+			if (skb)
+				mld_sendpack(skb);
+			skb = mld_newpack(dev, dev->mtu);
+			first = 1;
+			scount = 0;
+		}
+		if (first) {
+			skb = add_grhead(skb, pmc, type, &pgr);
+			first = 0;
+		}
+		psrc = (struct in6_addr *)skb_put(skb, sizeof(*psrc));
+		*psrc = psf->sf_addr;
+		scount++;
+		if ((type == MLD2_ALLOW_NEW_SOURCES ||
+		     type == MLD2_BLOCK_OLD_SOURCES) && psf->sf_crcount) {
+			psf->sf_crcount--;
+			if ((sdeleted || gdeleted) && psf->sf_crcount == 0) {
+				if (psf_prev)
+					psf_prev->sf_next = psf->sf_next;
+				else
+					pmc->mca_tomb = psf->sf_next;
+				kfree(psf);
+				continue;
+			}
+		}
+		psf_prev = psf;
+	}
+	if (pgr)
+		pgr->grec_nsrcs = htons(scount);
+
+	if (isquery)
+		pmc->mca_flags &= ~MAF_GSQUERY;	/* clear query state */
+	return skb;
+}
+
+static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc)
+{
+	struct sk_buff *skb = 0;
+	int type;
+
+	if (!pmc) {
+		read_lock_bh(&idev->lock);
+		for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
+			if (pmc->mca_flags & MAF_NOREPORT)
+				continue;
+			spin_lock_bh(&pmc->mca_lock);
+			if (pmc->mca_sfcount[MCAST_EXCLUDE])
+				type = MLD2_MODE_IS_EXCLUDE;
+			else
+				type = MLD2_MODE_IS_INCLUDE;
+			skb = add_grec(skb, pmc, type, 0, 0);
+			spin_unlock_bh(&pmc->mca_lock);
+		}
+		read_unlock_bh(&idev->lock);
+	} else {
+		spin_lock_bh(&pmc->mca_lock);
+		if (pmc->mca_sfcount[MCAST_EXCLUDE])
+			type = MLD2_MODE_IS_EXCLUDE;
+		else
+			type = MLD2_MODE_IS_INCLUDE;
+		skb = add_grec(skb, pmc, type, 0, 0);
+		spin_unlock_bh(&pmc->mca_lock);
+	}
+	if (skb)
+		mld_sendpack(skb);
+}
+
+/*
+ * remove zero-count source records from a source filter list
+ */
+static void mld_clear_zeros(struct ip6_sf_list **ppsf)
+{
+	struct ip6_sf_list *psf_prev, *psf_next, *psf;
+
+	psf_prev = 0;
+	for (psf=*ppsf; psf; psf = psf_next) {
+		psf_next = psf->sf_next;
+		if (psf->sf_crcount == 0) {
+			if (psf_prev)
+				psf_prev->sf_next = psf->sf_next;
+			else
+				*ppsf = psf->sf_next;
+			kfree(psf);
+		} else
+			psf_prev = psf;
+	}
+}
+
+static void mld_send_cr(struct inet6_dev *idev)
+{
+	struct ifmcaddr6 *pmc, *pmc_prev, *pmc_next;
+	struct sk_buff *skb = 0;
+	int type, dtype;
+
+	read_lock_bh(&idev->lock);
+	write_lock_bh(&idev->mc_lock);
+
+	/* deleted MCA's */
+	pmc_prev = 0;
+	for (pmc=idev->mc_tomb; pmc; pmc=pmc_next) {
+		pmc_next = pmc->next;
+		if (pmc->mca_sfmode == MCAST_INCLUDE) {
+			type = MLD2_BLOCK_OLD_SOURCES;
+			dtype = MLD2_BLOCK_OLD_SOURCES;
+			skb = add_grec(skb, pmc, type, 1, 0);
+			skb = add_grec(skb, pmc, dtype, 1, 1);
+		}
+		if (pmc->mca_crcount) {
+			pmc->mca_crcount--;
+			if (pmc->mca_sfmode == MCAST_EXCLUDE) {
+				type = MLD2_CHANGE_TO_INCLUDE;
+				skb = add_grec(skb, pmc, type, 1, 0);
+			}
+			if (pmc->mca_crcount == 0) {
+				mld_clear_zeros(&pmc->mca_tomb);
+				mld_clear_zeros(&pmc->mca_sources);
+			}
+		}
+		if (pmc->mca_crcount == 0 && !pmc->mca_tomb &&
+		    !pmc->mca_sources) {
+			if (pmc_prev)
+				pmc_prev->next = pmc_next;
+			else
+				idev->mc_tomb = pmc_next;
+			in6_dev_put(pmc->idev);
+			kfree(pmc);
+		} else
+			pmc_prev = pmc;
+	}
+	write_unlock_bh(&idev->mc_lock);
+
+	/* change recs */
+	for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
+		spin_lock_bh(&pmc->mca_lock);
+		if (pmc->mca_sfcount[MCAST_EXCLUDE]) {
+			type = MLD2_BLOCK_OLD_SOURCES;
+			dtype = MLD2_ALLOW_NEW_SOURCES;
+		} else {
+			type = MLD2_ALLOW_NEW_SOURCES;
+			dtype = MLD2_BLOCK_OLD_SOURCES;
+		}
+		skb = add_grec(skb, pmc, type, 0, 0);
+		skb = add_grec(skb, pmc, dtype, 0, 1);	/* deleted sources */
+
+		/* filter mode changes */
+		if (pmc->mca_crcount) {
+			pmc->mca_crcount--;
+			if (pmc->mca_sfmode == MCAST_EXCLUDE)
+				type = MLD2_CHANGE_TO_EXCLUDE;
+			else
+				type = MLD2_CHANGE_TO_INCLUDE;
+			skb = add_grec(skb, pmc, type, 0, 0);
+		}
+		spin_unlock_bh(&pmc->mca_lock);
+	}
+	read_unlock_bh(&idev->lock);
+	if (!skb)
+		return;
+	(void) mld_sendpack(skb);
+}
+
 static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
 {
 	struct sock *sk = igmp6_socket->sk;
@@ -579,12 +1587,251 @@
 	kfree_skb(skb);
 }
 
+static int ip6_mc_del1_src(struct ifmcaddr6 *pmc, int sfmode,
+	struct in6_addr *psfsrc)
+{
+	struct ip6_sf_list *psf, *psf_prev;
+	int rv = 0;
+
+	psf_prev = 0;
+	for (psf=pmc->mca_sources; psf; psf=psf->sf_next) {
+		if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) == 0)
+			break;
+		psf_prev = psf;
+	}
+	if (!psf || psf->sf_count[sfmode] == 0) {
+		/* source filter not found, or count wrong =>  bug */
+		return -ESRCH;
+	}
+	psf->sf_count[sfmode]--;
+	if (!psf->sf_count[MCAST_INCLUDE] && !psf->sf_count[MCAST_EXCLUDE]) {
+		struct inet6_dev *idev = pmc->idev;
+
+		/* no more filters for this source */
+		if (psf_prev)
+			psf_prev->sf_next = psf->sf_next;
+		else
+			pmc->mca_sources = psf->sf_next;
+		if (psf->sf_oldin && !(pmc->mca_flags & MAF_NOREPORT) &&
+		    !MLD_V1_SEEN(idev)) {
+			psf->sf_crcount = idev->mc_qrv;
+			psf->sf_next = pmc->mca_tomb;
+			pmc->mca_tomb = psf;
+			rv = 1;
+		} else
+			kfree(psf);
+	}
+	return rv;
+}
+
+int ip6_mc_del_src(struct inet6_dev *idev, struct in6_addr *pmca, int sfmode,
+	int sfcount, struct in6_addr *psfsrc, int delta)
+{
+	struct ifmcaddr6 *pmc;
+	int	changerec = 0;
+	int	i, err;
+
+	if (!idev)
+		return -ENODEV;
+	read_lock_bh(&idev->lock);
+	for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
+		if (ipv6_addr_cmp(pmca, &pmc->mca_addr) == 0)
+			break;
+	}
+	if (!pmc) {
+		/* MCA not found?? bug */
+		read_unlock_bh(&idev->lock);
+		return -ESRCH;
+	}
+	spin_lock_bh(&pmc->mca_lock);
+	read_unlock_bh(&idev->lock);
+	sf_markstate(pmc);
+	if (!delta) {
+		if (!pmc->mca_sfcount[sfmode]) {
+			spin_unlock_bh(&pmc->mca_lock);
+			return -EINVAL;
+		}
+		pmc->mca_sfcount[sfmode]--;
+	}
+	err = 0;
+	for (i=0; i<sfcount; i++) {
+		int rv = ip6_mc_del1_src(pmc, sfmode, &psfsrc[i]);
+
+		changerec |= rv > 0;
+		if (!err && rv < 0)
+			err = rv;
+	}
+	if (pmc->mca_sfmode == MCAST_EXCLUDE &&
+	    pmc->mca_sfcount[MCAST_EXCLUDE] == 0 &&
+	    pmc->mca_sfcount[MCAST_INCLUDE]) {
+		struct ip6_sf_list *psf;
+
+		/* filter mode change */
+		pmc->mca_sfmode = MCAST_INCLUDE;
+		pmc->mca_crcount = idev->mc_qrv;
+		idev->mc_ifc_count = pmc->mca_crcount;
+		for (psf=pmc->mca_sources; psf; psf = psf->sf_next)
+			psf->sf_crcount = 0;
+		mld_ifc_event(pmc->idev);
+	} else if (sf_setstate(pmc) || changerec)
+		mld_ifc_event(pmc->idev);
+	spin_unlock_bh(&pmc->mca_lock);
+	return err;
+}
+
+/*
+ * Add multicast single-source filter to the interface list
+ */
+static int ip6_mc_add1_src(struct ifmcaddr6 *pmc, int sfmode,
+	struct in6_addr *psfsrc, int delta)
+{
+	struct ip6_sf_list *psf, *psf_prev;
+
+	psf_prev = 0;
+	for (psf=pmc->mca_sources; psf; psf=psf->sf_next) {
+		if (ipv6_addr_cmp(&psf->sf_addr, psfsrc) == 0)
+			break;
+		psf_prev = psf;
+	}
+	if (!psf) {
+		psf = (struct ip6_sf_list *)kmalloc(sizeof(*psf), GFP_ATOMIC);
+		if (!psf)
+			return -ENOBUFS;
+		memset(psf, 0, sizeof(*psf));
+		psf->sf_addr = *psfsrc;
+		if (psf_prev) {
+			psf_prev->sf_next = psf;
+		} else
+			pmc->mca_sources = psf;
+	}
+	psf->sf_count[sfmode]++;
+	return 0;
+}
+
+static void sf_markstate(struct ifmcaddr6 *pmc)
+{
+	struct ip6_sf_list *psf;
+	int mca_xcount = pmc->mca_sfcount[MCAST_EXCLUDE];
+
+	for (psf=pmc->mca_sources; psf; psf=psf->sf_next)
+		if (pmc->mca_sfcount[MCAST_EXCLUDE]) {
+			psf->sf_oldin = mca_xcount ==
+				psf->sf_count[MCAST_EXCLUDE] &&
+				!psf->sf_count[MCAST_INCLUDE];
+		} else
+			psf->sf_oldin = psf->sf_count[MCAST_INCLUDE] != 0;
+}
+
+static int sf_setstate(struct ifmcaddr6 *pmc)
+{
+	struct ip6_sf_list *psf;
+	int mca_xcount = pmc->mca_sfcount[MCAST_EXCLUDE];
+	int qrv = pmc->idev->mc_qrv;
+	int new_in, rv;
+
+	rv = 0;
+	for (psf=pmc->mca_sources; psf; psf=psf->sf_next) {
+		if (pmc->mca_sfcount[MCAST_EXCLUDE]) {
+			new_in = mca_xcount == psf->sf_count[MCAST_EXCLUDE] &&
+				!psf->sf_count[MCAST_INCLUDE];
+		} else
+			new_in = psf->sf_count[MCAST_INCLUDE] != 0;
+		if (new_in != psf->sf_oldin) {
+			psf->sf_crcount = qrv;
+			rv++;
+		}
+	}
+	return rv;
+}
+
+/*
+ * Add multicast source filter list to the interface list
+ */
+int ip6_mc_add_src(struct inet6_dev *idev, struct in6_addr *pmca, int sfmode,
+	int sfcount, struct in6_addr *psfsrc, int delta)
+{
+	struct ifmcaddr6 *pmc;
+	int	isexclude;
+	int	i, err;
+
+	if (!idev)
+		return -ENODEV;
+	read_lock_bh(&idev->lock);
+	for (pmc=idev->mc_list; pmc; pmc=pmc->next) {
+		if (ipv6_addr_cmp(pmca, &pmc->mca_addr) == 0)
+			break;
+	}
+	if (!pmc) {
+		/* MCA not found?? bug */
+		read_unlock_bh(&idev->lock);
+		return -ESRCH;
+	}
+	spin_lock_bh(&pmc->mca_lock);
+	read_unlock_bh(&idev->lock);
+
+	sf_markstate(pmc);
+	isexclude = pmc->mca_sfmode == MCAST_EXCLUDE;
+	if (!delta)
+		pmc->mca_sfcount[sfmode]++;
+	err = 0;
+	for (i=0; i<sfcount; i++) {
+		err = ip6_mc_add1_src(pmc, sfmode, &psfsrc[i], delta);
+		if (err)
+			break;
+	}
+	if (err) {
+		int j;
+
+		pmc->mca_sfcount[sfmode]--;
+		for (j=0; j<i; j++)
+			(void) ip6_mc_del1_src(pmc, sfmode, &psfsrc[i]);
+	} else if (isexclude != (pmc->mca_sfcount[MCAST_EXCLUDE] != 0)) {
+		struct inet6_dev *idev = pmc->idev;
+		struct ip6_sf_list *psf;
+
+		/* filter mode change */
+		if (pmc->mca_sfcount[MCAST_EXCLUDE])
+			pmc->mca_sfmode = MCAST_EXCLUDE;
+		else if (pmc->mca_sfcount[MCAST_INCLUDE])
+			pmc->mca_sfmode = MCAST_INCLUDE;
+		/* else no filters; keep old mode for reports */
+
+		pmc->mca_crcount = idev->mc_qrv;
+		idev->mc_ifc_count = pmc->mca_crcount;
+		for (psf=pmc->mca_sources; psf; psf = psf->sf_next)
+			psf->sf_crcount = 0;
+		mld_ifc_event(idev);
+	} else if (sf_setstate(pmc))
+		mld_ifc_event(idev);
+	spin_unlock_bh(&pmc->mca_lock);
+	return err;
+}
+
+static void ip6_mc_clear_src(struct ifmcaddr6 *pmc)
+{
+	struct ip6_sf_list *psf, *nextpsf;
+
+	for (psf=pmc->mca_tomb; psf; psf=nextpsf) {
+		nextpsf = psf->sf_next;
+		kfree(psf);
+	}
+	pmc->mca_tomb = 0;
+	for (psf=pmc->mca_sources; psf; psf=nextpsf) {
+		nextpsf = psf->sf_next;
+		kfree(psf);
+	}
+	pmc->mca_sources = 0;
+	pmc->mca_sfmode = MCAST_EXCLUDE;
+	pmc->mca_sfcount[MCAST_EXCLUDE] = 0;
+	pmc->mca_sfcount[MCAST_EXCLUDE] = 1;
+}
+
+
 static void igmp6_join_group(struct ifmcaddr6 *ma)
 {
 	unsigned long delay;
 
-	if (IPV6_ADDR_MC_SCOPE(&ma->mca_addr) < IPV6_ADDR_SCOPE_LINKLOCAL ||
-	    ipv6_addr_is_ll_all_nodes(&ma->mca_addr))
+	if (ma->mca_flags & MAF_NOREPORT)
 		return;
 
 	igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT);
@@ -603,26 +1850,71 @@
 	spin_unlock_bh(&ma->mca_lock);
 }
 
+int ip6_mc_leave_src(struct sock *sk, struct ipv6_mc_socklist *iml,
+	struct inet6_dev *idev)
+{
+	int err;
+
+	if (iml->sflist == 0) {
+		/* any-source empty exclude case */
+		return ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, 0, 0);
+	}
+	err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode,
+		iml->sflist->sl_count, iml->sflist->sl_addr, 0);
+	sock_kfree_s(sk, iml->sflist, IP6_SFLSIZE(iml->sflist->sl_max));
+	iml->sflist = 0;
+	return err;
+}
+
 static void igmp6_leave_group(struct ifmcaddr6 *ma)
 {
-	if (IPV6_ADDR_MC_SCOPE(&ma->mca_addr) < IPV6_ADDR_SCOPE_LINKLOCAL ||
-	    ipv6_addr_is_ll_all_nodes(&ma->mca_addr))
-		return;
+	if (MLD_V1_SEEN(ma->idev)) {
+		if (ma->mca_flags & MAF_LAST_REPORTER)
+			igmp6_send(&ma->mca_addr, ma->idev->dev,
+				ICMPV6_MGM_REDUCTION);
+	} else {
+		mld_add_delrec(ma->idev, ma);
+		mld_ifc_event(ma->idev);
+	}
+}
 
-	if (ma->mca_flags & MAF_LAST_REPORTER)
-		igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REDUCTION);
+static void mld_gq_timer_expire(unsigned long data)
+{
+	struct inet6_dev *idev = (struct inet6_dev *)data;
 
-	spin_lock_bh(&ma->mca_lock);
-	if (del_timer(&ma->mca_timer))
-		atomic_dec(&ma->mca_refcnt);
-	spin_unlock_bh(&ma->mca_lock);
+	idev->mc_gq_running = 0;
+	mld_send_report(idev, 0);
+}
+
+static void mld_ifc_timer_expire(unsigned long data)
+{
+	struct inet6_dev *idev = (struct inet6_dev *)data;
+
+	mld_send_cr(idev);
+	if (idev->mc_ifc_count) {
+		idev->mc_ifc_count--;
+		if (idev->mc_ifc_count)
+			mld_ifc_start_timer(idev, idev->mc_maxdelay);
+	}
+}
+
+static void mld_ifc_event(struct inet6_dev *idev)
+{
+	if (MLD_V1_SEEN(idev))
+		return;
+	idev->mc_ifc_count = idev->mc_qrv;
+	mld_ifc_start_timer(idev, 1);
 }
 
+
 static void igmp6_timer_handler(unsigned long data)
 {
 	struct ifmcaddr6 *ma = (struct ifmcaddr6 *) data;
 
-	igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT);
+	if (MLD_V1_SEEN(ma->idev))
+		igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT);
+	else
+		mld_send_report(ma->idev, ma);
 
 	spin_lock(&ma->mca_lock);
 	ma->mca_flags |=  MAF_LAST_REPORTER;
@@ -640,9 +1932,18 @@
 	/* Withdraw multicast list */
 
 	read_lock_bh(&idev->lock);
+	idev->mc_ifc_count = 0;
+	if (del_timer(&idev->mc_ifc_timer))
+		atomic_dec(&idev->refcnt);
+	idev->mc_gq_running = 0;
+	if (del_timer(&idev->mc_gq_timer))
+		atomic_dec(&idev->refcnt);
+
 	for (i = idev->mc_list; i; i=i->next)
 		igmp6_group_dropped(i);
 	read_unlock_bh(&idev->lock);
+
+	mld_clear_delrec(idev);
 }
 
 
@@ -666,6 +1967,22 @@
 {
 	struct in6_addr maddr;
 
+	write_lock_bh(&idev->lock);
+	idev->mc_lock = RW_LOCK_UNLOCKED;
+	idev->mc_gq_running = 0;
+	init_timer(&idev->mc_gq_timer);
+	idev->mc_gq_timer.data = (unsigned long) idev;
+	idev->mc_gq_timer.function = &mld_gq_timer_expire;
+	idev->mc_tomb = 0;
+	idev->mc_ifc_count = 0;
+	init_timer(&idev->mc_ifc_timer);
+	idev->mc_ifc_timer.data = (unsigned long) idev;
+	idev->mc_ifc_timer.function = &mld_ifc_timer_expire;
+	idev->mc_qrv = MLD_QRV_DEFAULT;
+	idev->mc_maxdelay = IGMP6_UNSOLICITED_IVAL;
+	idev->mc_v1_seen = 0;
+	write_unlock_bh(&idev->lock);
+
 	/* Add all-nodes address. */
 	ipv6_addr_all_nodes(&maddr);
 	ipv6_dev_mc_inc(idev->dev, &maddr);
@@ -755,6 +2072,113 @@
 		len=0;
 	return len;
 }
+
+static int ip6_mcf_read_proc(char *buffer, char **start, off_t offset,
+			   int length, int *eof, void *data)
+{
+	off_t pos=0, begin=0;
+	int len=0;
+	int first=1;
+	struct net_device *dev;
+	
+	read_lock(&dev_base_lock);
+	for (dev=dev_base; dev; dev=dev->next) {
+		struct inet6_dev *idev = in6_dev_get(dev);
+		struct ifmcaddr6 *imc;
+
+		if (idev == NULL)
+			continue;
+
+		read_lock_bh(&idev->lock);
+
+		for (imc=idev->mc_list; imc; imc=imc->next) {
+			struct ip6_sf_list *psf;
+			unsigned long icount, xcount, i;
+
+			spin_lock_bh(&imc->mca_lock);
+			icount = imc->mca_sfcount[MCAST_INCLUDE];
+			xcount = imc->mca_sfcount[MCAST_EXCLUDE];
+			for (psf=imc->mca_sources; psf; psf=psf->sf_next) {
+				if (first) {
+					len += sprintf(buffer+len, "%3s %6s "
+						"%32s %32s %6s %6s\n", "Idx",
+						"Device", "Multicast Address",
+						"Source Address", "INC", "EXC");
+					first = 0;
+				}
+				len += sprintf(buffer+len,"%3d %6.6s ",
+					dev->ifindex, dev->name);
+
+				for (i=0; i<16; i++)
+					len += sprintf(buffer+len, "%02x",
+						imc->mca_addr.s6_addr[i]);
+				buffer[len++] = ' ';
+				for (i=0; i<16; i++)
+					len += sprintf(buffer+len, "%02x",
+						psf->sf_addr.s6_addr[i]);
+				len += sprintf(buffer+len, " %6lu %6lu\n",
+					psf->sf_count[MCAST_INCLUDE],
+					psf->sf_count[MCAST_EXCLUDE]);
+				pos = begin+len;
+				if (pos < offset) {
+					len=0;
+					begin=pos;
+				}
+				if (pos > offset+length) {
+					spin_unlock_bh(&imc->mca_lock);
+					read_unlock_bh(&idev->lock);
+					in6_dev_put(idev);
+					goto done;
+				}
+				icount -= psf->sf_count[MCAST_INCLUDE];
+				xcount -= psf->sf_count[MCAST_EXCLUDE];
+			}
+			if (icount > 0 || xcount > 0) {
+				if (first) {
+					len += sprintf(buffer+len, "%3s %6s "
+						"%32s %32s %6s %6s\n", "Idx",
+						"Device", "Multicast Address",
+						"Source Address", "INC", "EXC");
+					first = 0;
+				}
+				len += sprintf(buffer+len,"%3d %6.6s ",
+					dev->ifindex, dev->name);
+
+				for (i=0; i<16; i++)
+					len += sprintf(buffer+len, "%02x",
+						imc->mca_addr.s6_addr[i]);
+				len += sprintf(buffer+len, " %32s %6lu %6lu\n",
+					"NONE", icount, xcount);
+				pos = begin+len;
+				if (pos < offset) {
+					len=0;
+					begin=pos;
+				}
+				if (pos > offset+length) {
+					spin_unlock_bh(&imc->mca_lock);
+					read_unlock_bh(&idev->lock);
+					in6_dev_put(idev);
+					goto done;
+				}
+			}
+			spin_unlock_bh(&imc->mca_lock);
+		}
+		read_unlock_bh(&idev->lock);
+		in6_dev_put(idev);
+	}
+	*eof = 1;
+
+done:
+	read_unlock(&dev_base_lock);
+
+	*start=buffer+(offset-begin);
+	len-=(offset-begin);
+	if(len>length)
+		len=length;
+	if (len<0)
+		len=0;
+	return len;
+}
 #endif
 
 int __init igmp6_init(struct net_proto_family *ops)
@@ -780,6 +2204,7 @@
 	np->hop_limit = 1;
 #ifdef CONFIG_PROC_FS
 	create_proc_read_entry("net/igmp6", 0, 0, igmp6_read_proc, NULL);
+	create_proc_read_entry("net/mcfilter6", 0, 0, ip6_mcf_read_proc, NULL);
 #endif
 
 	return 0;
diff -Nru a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
--- a/net/ipv6/ndisc.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv6/ndisc.c	Sat Apr 19 19:51:49 2003
@@ -405,8 +405,8 @@
 	fl->fl6_src		= saddr;
 	fl->fl6_dst	 	= daddr;
 	fl->proto	 	= IPPROTO_ICMPV6;
-	fl->uli_u.icmpt.type	= type;
-	fl->uli_u.icmpt.code	= 0;
+	fl->fl_icmp_type	= type;
+	fl->fl_icmp_code	= 0;
 }
 
 static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
@@ -462,7 +462,7 @@
 	}
 
 	skb = sock_alloc_send_skb(sk, MAX_HEADER + len + dev->hard_header_len + 15,
-				  0, &err);
+				  1, &err);
 
 	if (skb == NULL) {
 		ND_PRINTK1("send_na: alloc skb failed\n");
@@ -546,7 +546,7 @@
 		len += NDISC_OPT_SPACE(dev->addr_len);
 
 	skb = sock_alloc_send_skb(sk, MAX_HEADER + len + dev->hard_header_len + 15,
-				  0, &err);
+				  1, &err);
 	if (skb == NULL) {
 		ND_PRINTK1("send_ns: alloc skb failed\n");
 		return;
@@ -616,7 +616,7 @@
 		len += NDISC_OPT_SPACE(dev->addr_len);
 
         skb = sock_alloc_send_skb(sk, MAX_HEADER + len + dev->hard_header_len + 15,
-				  0, &err);
+				  1, &err);
 	if (skb == NULL) {
 		ND_PRINTK1("send_ns: alloc skb failed\n");
 		return;
@@ -961,7 +961,7 @@
 				struct rt6_info *rt;
 				rt = rt6_get_dflt_router(saddr, dev);
 				if (rt)
-					ip6_del_rt(rt);
+					ip6_del_rt(rt, NULL);
 			}
 		} else {
 			if (msg->icmph.icmp6_router)
@@ -1035,7 +1035,7 @@
 	rt = rt6_get_dflt_router(&skb->nh.ipv6h->saddr, skb->dev);
 
 	if (rt && lifetime == 0) {
-		ip6_del_rt(rt);
+		ip6_del_rt(rt, NULL);
 		rt = NULL;
 	}
 
@@ -1328,7 +1328,7 @@
 	len += rd_len;
 
 	buff = sock_alloc_send_skb(sk, MAX_HEADER + len + dev->hard_header_len + 15,
-				   0, &err);
+				   1, &err);
 	if (buff == NULL) {
 		ND_PRINTK1("ndisc_send_redirect: alloc_skb failed\n");
 		return;
diff -Nru a/net/ipv6/netfilter/Makefile b/net/ipv6/netfilter/Makefile
--- a/net/ipv6/netfilter/Makefile	Sat Apr 19 19:51:48 2003
+++ b/net/ipv6/netfilter/Makefile	Sat Apr 19 19:51:48 2003
@@ -21,4 +21,4 @@
 obj-$(CONFIG_IP6_NF_TARGET_MARK) += ip6t_MARK.o
 obj-$(CONFIG_IP6_NF_QUEUE) += ip6_queue.o
 obj-$(CONFIG_IP6_NF_TARGET_LOG) += ip6t_LOG.o
-obj-$(CONFIG_IP_NF_MATCH_HL) += ip6t_hl.o
+obj-$(CONFIG_IP6_NF_MATCH_HL) += ip6t_hl.o
diff -Nru a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
--- a/net/ipv6/netfilter/ip6_tables.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv6/netfilter/ip6_tables.c	Sat Apr 19 19:51:50 2003
@@ -343,6 +343,10 @@
 	void *table_base;
 	struct ip6t_entry *e, *back;
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* Initialization */
 	ipv6 = (*pskb)->nh.ipv6h;
 	protohdr = (u_int32_t *)((char *)ipv6 + IPV6_HDR_LEN);
diff -Nru a/net/ipv6/netfilter/ip6t_owner.c b/net/ipv6/netfilter/ip6t_owner.c
--- a/net/ipv6/netfilter/ip6t_owner.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv6/netfilter/ip6t_owner.c	Sat Apr 19 19:51:50 2003
@@ -29,16 +29,16 @@
 	task_lock(p);
 	files = p->files;
 	if(files) {
-		read_lock(&files->file_lock);
+		spin_lock(&files->file_lock);
 		for (i=0; i < files->max_fds; i++) {
 			if (fcheck_files(files, i) == skb->sk->socket->file) {
-				read_unlock(&files->file_lock);
+				spin_unlock(&files->file_lock);
 				task_unlock(p);
 				read_unlock(&tasklist_lock);
 				return 1;
 			}
 		}
-		read_unlock(&files->file_lock);
+		spin_unlock(&files->file_lock);
 	}
 	task_unlock(p);
 out:
@@ -62,14 +62,14 @@
 		task_lock(p);
 		files = p->files;
 		if (files) {
-			read_lock(&files->file_lock);
+			spin_lock(&files->file_lock);
 			for (i=0; i < files->max_fds; i++) {
 				if (fcheck_files(files, i) == file) {
 					found = 1;
 					break;
 				}
 			}
-			read_unlock(&files->file_lock);
+			spin_unlock(&files->file_lock);
 		}
 		task_unlock(p);
 		if (found)
diff -Nru a/net/ipv6/netfilter/ip6table_mangle.c b/net/ipv6/netfilter/ip6table_mangle.c
--- a/net/ipv6/netfilter/ip6table_mangle.c	Sat Apr 19 19:51:46 2003
+++ b/net/ipv6/netfilter/ip6table_mangle.c	Sat Apr 19 19:51:46 2003
@@ -154,6 +154,10 @@
 	}
 #endif
 
+	/* FIXME: Push down to extensions --RR */
+	if (skb_is_nonlinear(*pskb) && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+		return NF_DROP;
+
 	/* save source/dest address, nfmark, hoplimit, flowlabel, priority,  */
 	memcpy(&saddr, &(*pskb)->nh.ipv6h->saddr, sizeof(saddr));
 	memcpy(&daddr, &(*pskb)->nh.ipv6h->daddr, sizeof(daddr));
diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c
--- a/net/ipv6/raw.c	Sat Apr 19 19:51:46 2003
+++ b/net/ipv6/raw.c	Sat Apr 19 19:51:46 2003
@@ -99,7 +99,7 @@
 				if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr))
 					break;
 				if ((addr_type & IPV6_ADDR_MULTICAST) &&
-				    inet6_mc_check(s, loc_addr))
+				    inet6_mc_check(s, loc_addr, rmt_addr))
 					break;
 				continue;
 			}
@@ -622,8 +622,8 @@
 	fl.fl6_dst = daddr;
 	if (fl.fl6_src == NULL && !ipv6_addr_any(&np->saddr))
 		fl.fl6_src = &np->saddr;
-	fl.uli_u.icmpt.type = 0;
-	fl.uli_u.icmpt.code = 0;
+	fl.fl_icmp_type = 0;
+	fl.fl_icmp_code = 0;
 	
 	if (raw_opt->checksum) {
 		struct rawv6_fakehdr hdr;
diff -Nru a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c
--- a/net/ipv6/reassembly.c	Sat Apr 19 19:51:30 2003
+++ b/net/ipv6/reassembly.c	Sat Apr 19 19:51:30 2003
@@ -520,13 +520,13 @@
  *	the last and the first frames arrived and all the bits are here.
  */
 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
+			  unsigned int *nhoffp,
 			  struct net_device *dev)
 {
 	struct sk_buff *fp, *head = fq->fragments;
 	int    remove_fraghdr = 0;
 	int    payload_len;
-	int    nhoff;
-	u8     nexthdr = 0;
+	unsigned int nhoff;
 
 	fq_kill(fq);
 
@@ -537,8 +537,6 @@
 	payload_len = (head->data - head->nh.raw) - sizeof(struct ipv6hdr) + fq->len;
 	nhoff = head->h.raw - head->nh.raw;
 
-	nexthdr = ((struct frag_hdr*)head->h.raw)->nexthdr;
-
 	if (payload_len > 65535) {
 		payload_len -= 8;
 		if (payload_len > 65535)
@@ -613,12 +611,10 @@
 	if (head->ip_summed == CHECKSUM_HW)
 		head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum);
 
-	if (!pskb_pull(head, head->h.raw - head->data))
-		goto out_fail;
-
 	IP6_INC_STATS_BH(Ip6ReasmOKs);
 	fq->fragments = NULL;
-	return nexthdr;
+	*nhoffp = nhoff;
+	return 1;
 
 out_oversize:
 	if (net_ratelimit())
@@ -629,18 +625,16 @@
 		printk(KERN_DEBUG "ip6_frag_reasm: no memory for reassembly\n");
 out_fail:
 	IP6_INC_STATS_BH(Ip6ReasmFails);
-	return 0;
+	return -1;
 }
 
-static int ipv6_frag_rcv(struct sk_buff **skbp)
+static int ipv6_frag_rcv(struct sk_buff **skbp, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *skbp; 
 	struct net_device *dev = skb->dev;
 	struct frag_hdr *fhdr;
 	struct frag_queue *fq;
 	struct ipv6hdr *hdr;
-	int nhoff = skb->h.raw - skb->nh.raw;
-	u8 nexthdr = 0;
 
 	hdr = skb->nh.ipv6h;
 
@@ -649,23 +643,23 @@
 	/* Jumbo payload inhibits frag. header */
 	if (hdr->payload_len==0) {
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw);
-		goto discard;
+		return -1;
 	}
 	if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+sizeof(struct frag_hdr))) {
 		icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw);
-		goto discard;
+		return -1;
 	}
 
 	hdr = skb->nh.ipv6h;
 	fhdr = (struct frag_hdr *)skb->h.raw;
-	nexthdr = fhdr->nexthdr;
 
 	if (!(fhdr->frag_off & htons(0xFFF9))) {
 		/* It is not a fragmented frame */
 		skb->h.raw += sizeof(struct frag_hdr);
 		IP6_INC_STATS_BH(Ip6ReasmOKs);
 
-		return (u8*)fhdr - skb->nh.raw;
+		*nhoffp = (u8*)fhdr - skb->nh.raw;
+		return 1;
 	}
 
 	if (atomic_read(&ip6_frag_mem) > sysctl_ip6frag_high_thresh)
@@ -676,26 +670,26 @@
 
 		spin_lock(&fq->lock);
 
-		ip6_frag_queue(fq, skb, fhdr, nhoff);
+		ip6_frag_queue(fq, skb, fhdr, *nhoffp);
 
 		if (fq->last_in == (FIRST_IN|LAST_IN) &&
 		    fq->meat == fq->len)
-			ret = ip6_frag_reasm(fq, skbp, dev);
+			ret = ip6_frag_reasm(fq, skbp, nhoffp, dev);
 
 		spin_unlock(&fq->lock);
 		fq_put(fq);
-		return -ret;
+		return ret;
 	}
 
-discard:
 	IP6_INC_STATS_BH(Ip6ReasmFails);
 	kfree_skb(skb);
-	return 0;
+	return -1;
 }
 
 static struct inet6_protocol frag_protocol =
 {
 	.handler	=	ipv6_frag_rcv,
+	.flags		=	INET6_PROTO_NOPOLICY,
 };
 
 void __init ipv6_frag_init(void)
diff -Nru a/net/ipv6/route.c b/net/ipv6/route.c
--- a/net/ipv6/route.c	Sat Apr 19 19:51:49 2003
+++ b/net/ipv6/route.c	Sat Apr 19 19:51:49 2003
@@ -318,12 +318,12 @@
    be destroyed.
  */
 
-static int rt6_ins(struct rt6_info *rt)
+static int rt6_ins(struct rt6_info *rt, struct nlmsghdr *nlh)
 {
 	int err;
 
 	write_lock_bh(&rt6_lock);
-	err = fib6_add(&ip6_routing_table, rt);
+	err = fib6_add(&ip6_routing_table, rt, nlh);
 	write_unlock_bh(&rt6_lock);
 
 	return err;
@@ -366,7 +366,7 @@
 
 		dst_hold(&rt->u.dst);
 
-		err = rt6_ins(rt);
+		err = rt6_ins(rt, NULL);
 		if (err == 0)
 			return rt;
 
@@ -449,13 +449,12 @@
 	int strict;
 	int attempts = 3;
 
-	strict = ipv6_addr_type(fl->nl_u.ip6_u.daddr) & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL);
+	strict = ipv6_addr_type(fl->fl6_dst) & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL);
 
 relookup:
 	read_lock_bh(&rt6_lock);
 
-	fn = fib6_lookup(&ip6_routing_table, fl->nl_u.ip6_u.daddr,
-			 fl->nl_u.ip6_u.saddr);
+	fn = fib6_lookup(&ip6_routing_table, fl->fl6_dst, fl->fl6_src);
 
 restart:
 	rt = fn->leaf;
@@ -477,9 +476,8 @@
 	if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) {
 		read_unlock_bh(&rt6_lock);
 
-		rt = rt6_cow(rt, fl->nl_u.ip6_u.daddr,
-			     fl->nl_u.ip6_u.saddr);
-			
+		rt = rt6_cow(rt, fl->fl6_dst, fl->fl6_src);
+
 		if (rt->u.dst.error != -EEXIST || --attempts <= 0)
 			goto out2;
 
@@ -522,7 +520,7 @@
 
 	if (rt) {
 		if (rt->rt6i_flags & RTF_CACHE)
-			ip6_del_rt(rt);
+			ip6_del_rt(rt, NULL);
 		else
 			dst_release(dst);
 	}
@@ -625,9 +623,10 @@
  *
  */
 
-int ip6_route_add(struct in6_rtmsg *rtmsg)
+int ip6_route_add(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh)
 {
 	int err;
+	struct rtmsg *r;
 	struct rt6_info *rt;
 	struct net_device *dev = NULL;
 	int addr_type;
@@ -648,6 +647,11 @@
 
 	rt->u.dst.obsolete = -1;
 	rt->rt6i_expires = rtmsg->rtmsg_info;
+	if (nlh && (r = NLMSG_DATA(nlh))) {
+		rt->rt6i_protocol = r->rtm_protocol;
+	} else {
+		rt->rt6i_protocol = RTPROT_BOOT;
+	}
 
 	addr_type = ipv6_addr_type(&rtmsg->rtmsg_dst);
 
@@ -772,7 +776,7 @@
 	if (dst_metric(&rt->u.dst, RTAX_ADVMSS) > 65535-20)
 		rt->u.dst.metrics[RTAX_ADVMSS-1] = 65535;
 	rt->u.dst.dev = dev;
-	return rt6_ins(rt);
+	return rt6_ins(rt, nlh);
 
 out:
 	if (dev)
@@ -781,7 +785,7 @@
 	return err;
 }
 
-int ip6_del_rt(struct rt6_info *rt)
+int ip6_del_rt(struct rt6_info *rt, struct nlmsghdr *nlh)
 {
 	int err;
 
@@ -793,13 +797,13 @@
 
 	dst_release(&rt->u.dst);
 
-	err = fib6_del(rt);
+	err = fib6_del(rt, nlh);
 	write_unlock_bh(&rt6_lock);
 
 	return err;
 }
 
-static int ip6_route_del(struct in6_rtmsg *rtmsg)
+static int ip6_route_del(struct in6_rtmsg *rtmsg, struct nlmsghdr *nlh)
 {
 	struct fib6_node *fn;
 	struct rt6_info *rt;
@@ -826,7 +830,7 @@
 			dst_hold(&rt->u.dst);
 			read_unlock_bh(&rt6_lock);
 
-			return ip6_del_rt(rt);
+			return ip6_del_rt(rt, nlh);
 		}
 	}
 	read_unlock_bh(&rt6_lock);
@@ -928,11 +932,11 @@
 		nrt->u.dst.metrics[RTAX_ADVMSS-1] = 65535;
 	nrt->rt6i_hoplimit = ipv6_get_hoplimit(neigh->dev);
 
-	if (rt6_ins(nrt))
+	if (rt6_ins(nrt, NULL))
 		goto out;
 
 	if (rt->rt6i_flags&RTF_CACHE) {
-		ip6_del_rt(rt);
+		ip6_del_rt(rt, NULL);
 		return;
 	}
 
@@ -1018,7 +1022,7 @@
 		dst_set_expires(&nrt->u.dst, ip6_rt_mtu_expires);
 		nrt->rt6i_flags |= RTF_DYNAMIC|RTF_CACHE|RTF_EXPIRES;
 		nrt->u.dst.metrics[RTAX_MTU-1] = pmtu;
-		rt6_ins(nrt);
+		rt6_ins(nrt, NULL);
 	}
 
 out:
@@ -1091,7 +1095,7 @@
 
 	rtmsg.rtmsg_ifindex = dev->ifindex;
 
-	ip6_route_add(&rtmsg);
+	ip6_route_add(&rtmsg, NULL);
 	return rt6_get_dflt_router(gwaddr, dev);
 }
 
@@ -1117,7 +1121,7 @@
 
 			read_unlock_bh(&rt6_lock);
 
-			ip6_del_rt(rt);
+			ip6_del_rt(rt, NULL);
 
 			goto restart;
 		}
@@ -1143,10 +1147,10 @@
 		rtnl_lock();
 		switch (cmd) {
 		case SIOCADDRT:
-			err = ip6_route_add(&rtmsg);
+			err = ip6_route_add(&rtmsg, NULL);
 			break;
 		case SIOCDELRT:
-			err = ip6_route_del(&rtmsg);
+			err = ip6_route_del(&rtmsg, NULL);
 			break;
 		default:
 			err = -EINVAL;
@@ -1203,7 +1207,7 @@
 
 	ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
 	rt->rt6i_dst.plen = 128;
-	rt6_ins(rt);
+	rt6_ins(rt, NULL);
 
 	return 0;
 }
@@ -1220,7 +1224,7 @@
 	rt = rt6_lookup(addr, NULL, loopback_dev.ifindex, 1);
 	if (rt) {
 		if (rt->rt6i_dst.plen == 128)
-			err = ip6_del_rt(rt);
+			err = ip6_del_rt(rt, NULL);
 		else
 			dst_release(&rt->u.dst);
 	}
@@ -1350,7 +1354,7 @@
 
 	if (inet6_rtm_to_rtmsg(r, arg, &rtmsg))
 		return -EINVAL;
-	return ip6_route_del(&rtmsg);
+	return ip6_route_del(&rtmsg, nlh);
 }
 
 int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
@@ -1360,7 +1364,7 @@
 
 	if (inet6_rtm_to_rtmsg(r, arg, &rtmsg))
 		return -EINVAL;
-	return ip6_route_add(&rtmsg);
+	return ip6_route_add(&rtmsg, nlh);
 }
 
 struct rt6_rtnl_dump_arg
@@ -1373,13 +1377,18 @@
 			 struct in6_addr *dst,
 			 struct in6_addr *src,
 			 int iif,
-			 int type, u32 pid, u32 seq)
+			 int type, u32 pid, u32 seq,
+			 struct nlmsghdr *in_nlh)
 {
 	struct rtmsg *rtm;
 	struct nlmsghdr  *nlh;
 	unsigned char	 *b = skb->tail;
 	struct rta_cacheinfo ci;
 
+	if (!pid && in_nlh) {
+		pid = in_nlh->nlmsg_pid;
+	}
+
 	nlh = NLMSG_PUT(skb, pid, seq, type, sizeof(*rtm));
 	rtm = NLMSG_DATA(nlh);
 	rtm->rtm_family = AF_INET6;
@@ -1395,7 +1404,7 @@
 		rtm->rtm_type = RTN_UNICAST;
 	rtm->rtm_flags = 0;
 	rtm->rtm_scope = RT_SCOPE_UNIVERSE;
-	rtm->rtm_protocol = RTPROT_BOOT;
+	rtm->rtm_protocol = rt->rt6i_protocol;
 	if (rt->rt6i_flags&RTF_DYNAMIC)
 		rtm->rtm_protocol = RTPROT_REDIRECT;
 	else if (rt->rt6i_flags&(RTF_ADDRCONF|RTF_ALLONLINK))
@@ -1458,7 +1467,8 @@
 	struct rt6_rtnl_dump_arg *arg = (struct rt6_rtnl_dump_arg *) p_arg;
 
 	return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE,
-			     NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq);
+		     NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq,
+		     NULL);
 }
 
 static int fib6_dump_node(struct fib6_walker_t *w)
@@ -1573,15 +1583,11 @@
 	skb->mac.raw = skb->data;
 	skb_reserve(skb, MAX_HEADER + sizeof(struct ipv6hdr));
 
-	fl.proto = 0;
-	fl.nl_u.ip6_u.daddr = NULL;
-	fl.nl_u.ip6_u.saddr = NULL;
-	fl.uli_u.icmpt.type = 0;
-	fl.uli_u.icmpt.code = 0;
+	memset(&fl, 0, sizeof(fl));
 	if (rta[RTA_SRC-1])
-		fl.nl_u.ip6_u.saddr = (struct in6_addr*)RTA_DATA(rta[RTA_SRC-1]);
+		fl.fl6_src = (struct in6_addr*)RTA_DATA(rta[RTA_SRC-1]);
 	if (rta[RTA_DST-1])
-		fl.nl_u.ip6_u.daddr = (struct in6_addr*)RTA_DATA(rta[RTA_DST-1]);
+		fl.fl6_dst = (struct in6_addr*)RTA_DATA(rta[RTA_DST-1]);
 
 	if (rta[RTA_IIF-1])
 		memcpy(&iif, RTA_DATA(rta[RTA_IIF-1]), sizeof(int));
@@ -1605,10 +1611,10 @@
 
 	NETLINK_CB(skb).dst_pid = NETLINK_CB(in_skb).pid;
 	err = rt6_fill_node(skb, rt, 
-			    fl.nl_u.ip6_u.daddr,
-			    fl.nl_u.ip6_u.saddr,
+			    fl.fl6_dst, fl.fl6_src,
 			    iif,
-			    RTM_NEWROUTE, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq);
+			    RTM_NEWROUTE, NETLINK_CB(in_skb).pid,
+			    nlh->nlmsg_seq, nlh);
 	if (err < 0) {
 		err = -EMSGSIZE;
 		goto out_free;
@@ -1624,7 +1630,7 @@
 	goto out;	
 }
 
-void inet6_rt_notify(int event, struct rt6_info *rt)
+void inet6_rt_notify(int event, struct rt6_info *rt, struct nlmsghdr *nlh)
 {
 	struct sk_buff *skb;
 	int size = NLMSG_SPACE(sizeof(struct rtmsg)+256);
@@ -1634,7 +1640,7 @@
 		netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, ENOBUFS);
 		return;
 	}
-	if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0) < 0) {
+	if (rt6_fill_node(skb, rt, NULL, NULL, 0, event, 0, 0, nlh) < 0) {
 		kfree_skb(skb);
 		netlink_set_err(rtnl, 0, RTMGRP_IPV6_ROUTE, EINVAL);
 		return;
diff -Nru a/net/ipv6/sit.c b/net/ipv6/sit.c
--- a/net/ipv6/sit.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv6/sit.c	Sat Apr 19 19:51:50 2003
@@ -170,12 +170,10 @@
 	if (!create)
 		return NULL;
 
-	MOD_INC_USE_COUNT;
 	dev = kmalloc(sizeof(*dev) + sizeof(*t), GFP_KERNEL);
-	if (dev == NULL) {
-		MOD_DEC_USE_COUNT;
+	if (dev == NULL)
 		return NULL;
-	}
+
 	memset(dev, 0, sizeof(*dev) + sizeof(*t));
 	dev->priv = (void*)(dev+1);
 	nt = (struct ip_tunnel*)dev->priv;
@@ -195,6 +193,7 @@
 			goto failed;
 		memcpy(nt->parms.name, dev->name, IFNAMSIZ);
 	}
+	SET_MODULE_OWNER(dev);
 	if (register_netdevice(dev) < 0)
 		goto failed;
 
@@ -205,16 +204,13 @@
 
 failed:
 	kfree(dev);
-	MOD_DEC_USE_COUNT;
 	return NULL;
 }
 
 static void ipip6_tunnel_destructor(struct net_device *dev)
 {
-	if (dev != &ipip6_fb_tunnel_dev) {
+	if (dev != &ipip6_fb_tunnel_dev)
 		kfree(dev);
-		MOD_DEC_USE_COUNT;
-	}
 }
 
 static void ipip6_tunnel_uninit(struct net_device *dev)
@@ -622,8 +618,6 @@
 	struct ip_tunnel_parm p;
 	struct ip_tunnel *t;
 
-	MOD_INC_USE_COUNT;
-
 	switch (cmd) {
 	case SIOCGETTUNNEL:
 		t = NULL;
@@ -721,7 +715,6 @@
 	}
 
 done:
-	MOD_DEC_USE_COUNT;
 	return err;
 }
 
@@ -798,29 +791,11 @@
 	return 0;
 }
 
-#ifdef MODULE
-static int ipip6_fb_tunnel_open(struct net_device *dev)
-{
-	MOD_INC_USE_COUNT;
-	return 0;
-}
-
-static int ipip6_fb_tunnel_close(struct net_device *dev)
-{
-	MOD_DEC_USE_COUNT;
-	return 0;
-}
-#endif
-
 int __init ipip6_fb_tunnel_init(struct net_device *dev)
 {
 	struct iphdr *iph;
 
 	ipip6_tunnel_init_gen(dev);
-#ifdef MODULE
-	dev->open		= ipip6_fb_tunnel_open;
-	dev->stop		= ipip6_fb_tunnel_close;
-#endif
 
 	iph = &ipip6_fb_tunnel.parms.iph;
 	iph->version		= 4;
@@ -857,6 +832,7 @@
 
 	ipip6_fb_tunnel_dev.priv = (void*)&ipip6_fb_tunnel;
 	strcpy(ipip6_fb_tunnel_dev.name, ipip6_fb_tunnel.parms.name);
+	SET_MODULE_OWNER(&ipip6_fb_tunnel_dev);
 	register_netdev(&ipip6_fb_tunnel_dev);
 	return 0;
 }
diff -Nru a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
--- a/net/ipv6/tcp_ipv6.c	Sat Apr 19 19:51:48 2003
+++ b/net/ipv6/tcp_ipv6.c	Sat Apr 19 19:51:48 2003
@@ -670,12 +670,12 @@
 	fl.fl6_dst = &np->daddr;
 	fl.fl6_src = saddr;
 	fl.oif = sk->bound_dev_if;
-	fl.uli_u.ports.dport = usin->sin6_port;
-	fl.uli_u.ports.sport = inet->sport;
+	fl.fl_ip_dport = usin->sin6_port;
+	fl.fl_ip_sport = inet->sport;
 
 	if (np->opt && np->opt->srcrt) {
 		struct rt0_hdr *rt0 = (struct rt0_hdr *)np->opt->srcrt;
-		fl.nl_u.ip6_u.daddr = rt0->addr;
+		fl.fl6_dst = rt0->addr;
 	}
 
 	if (!fl.fl6_src)
@@ -796,11 +796,11 @@
 			   for now.
 			 */
 			fl.proto = IPPROTO_TCP;
-			fl.nl_u.ip6_u.daddr = &np->daddr;
-			fl.nl_u.ip6_u.saddr = &np->saddr;
+			fl.fl6_dst = &np->daddr;
+			fl.fl6_src = &np->saddr;
 			fl.oif = sk->bound_dev_if;
-			fl.uli_u.ports.dport = inet->dport;
-			fl.uli_u.ports.sport = inet->sport;
+			fl.fl_ip_dport = inet->dport;
+			fl.fl_ip_sport = inet->sport;
 
 			dst = ip6_route_output(sk, &fl);
 		} else
@@ -881,12 +881,12 @@
 	int err = -1;
 
 	fl.proto = IPPROTO_TCP;
-	fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr;
-	fl.nl_u.ip6_u.saddr = &req->af.v6_req.loc_addr;
+	fl.fl6_dst = &req->af.v6_req.rmt_addr;
+	fl.fl6_src = &req->af.v6_req.loc_addr;
 	fl.fl6_flowlabel = 0;
 	fl.oif = req->af.v6_req.iif;
-	fl.uli_u.ports.dport = req->rmt_port;
-	fl.uli_u.ports.sport = inet_sk(sk)->sport;
+	fl.fl_ip_dport = req->rmt_port;
+	fl.fl_ip_sport = inet_sk(sk)->sport;
 
 	if (dst == NULL) {
 		opt = np->opt;
@@ -901,7 +901,7 @@
 
 		if (opt && opt->srcrt) {
 			struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
-			fl.nl_u.ip6_u.daddr = rt0->addr;
+			fl.fl6_dst = rt0->addr;
 		}
 
 		dst = ip6_route_output(sk, &fl);
@@ -917,7 +917,7 @@
 					 &req->af.v6_req.loc_addr, &req->af.v6_req.rmt_addr,
 					 csum_partial((char *)th, skb->len, skb->csum));
 
-		fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr;
+		fl.fl6_dst = &req->af.v6_req.rmt_addr;
 		err = ip6_xmit(sk, skb, &fl, opt);
 		if (err == NET_XMIT_CN)
 			err = 0;
@@ -1019,19 +1019,18 @@
 
 	buff->csum = csum_partial((char *)t1, sizeof(*t1), 0);
 
-	fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr;
-	fl.nl_u.ip6_u.saddr = &skb->nh.ipv6h->daddr;
+	fl.fl6_dst = &skb->nh.ipv6h->saddr;
+	fl.fl6_src = &skb->nh.ipv6h->daddr;
 	fl.fl6_flowlabel = 0;
 
-	t1->check = csum_ipv6_magic(fl.nl_u.ip6_u.saddr,
-				    fl.nl_u.ip6_u.daddr, 
+	t1->check = csum_ipv6_magic(fl.fl6_src, fl.fl6_dst, 
 				    sizeof(*t1), IPPROTO_TCP,
 				    buff->csum);
 
 	fl.proto = IPPROTO_TCP;
 	fl.oif = tcp_v6_iif(skb);
-	fl.uli_u.ports.dport = t1->dest;
-	fl.uli_u.ports.sport = t1->source;
+	fl.fl_ip_dport = t1->dest;
+	fl.fl_ip_sport = t1->source;
 
 	/* sk = NULL, but it is safe for now. RST socket required. */
 	buff->dst = ip6_route_output(NULL, &fl);
@@ -1084,19 +1083,18 @@
 
 	buff->csum = csum_partial((char *)t1, tot_len, 0);
 
-	fl.nl_u.ip6_u.daddr = &skb->nh.ipv6h->saddr;
-	fl.nl_u.ip6_u.saddr = &skb->nh.ipv6h->daddr;
+	fl.fl6_dst = &skb->nh.ipv6h->saddr;
+	fl.fl6_src = &skb->nh.ipv6h->daddr;
 	fl.fl6_flowlabel = 0;
 
-	t1->check = csum_ipv6_magic(fl.nl_u.ip6_u.saddr,
-				    fl.nl_u.ip6_u.daddr, 
+	t1->check = csum_ipv6_magic(fl.fl6_src, fl.fl6_dst, 
 				    tot_len, IPPROTO_TCP,
 				    buff->csum);
 
 	fl.proto = IPPROTO_TCP;
 	fl.oif = tcp_v6_iif(skb);
-	fl.uli_u.ports.dport = t1->dest;
-	fl.uli_u.ports.sport = t1->source;
+	fl.fl_ip_dport = t1->dest;
+	fl.fl_ip_sport = t1->source;
 
 	buff->dst = ip6_route_output(NULL, &fl);
 
@@ -1335,16 +1333,16 @@
 
 	if (dst == NULL) {
 		fl.proto = IPPROTO_TCP;
-		fl.nl_u.ip6_u.daddr = &req->af.v6_req.rmt_addr;
+		fl.fl6_dst = &req->af.v6_req.rmt_addr;
 		if (opt && opt->srcrt) {
 			struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
-			fl.nl_u.ip6_u.daddr = rt0->addr;
+			fl.fl6_dst = rt0->addr;
 		}
-		fl.nl_u.ip6_u.saddr = &req->af.v6_req.loc_addr;
+		fl.fl6_src = &req->af.v6_req.loc_addr;
 		fl.fl6_flowlabel = 0;
 		fl.oif = sk->bound_dev_if;
-		fl.uli_u.ports.dport = req->rmt_port;
-		fl.uli_u.ports.sport = inet_sk(sk)->sport;
+		fl.fl_ip_dport = req->rmt_port;
+		fl.fl_ip_sport = inet_sk(sk)->sport;
 
 		dst = ip6_route_output(sk, &fl);
 	}
@@ -1591,7 +1589,7 @@
 	return 0;
 }
 
-static int tcp_v6_rcv(struct sk_buff **pskb)
+static int tcp_v6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *pskb;
 	struct tcphdr *th;	
@@ -1657,7 +1655,7 @@
 	bh_unlock_sock(sk);
 
 	sock_put(sk);
-	return ret;
+	return ret ? -1 : 0;
 
 no_tcp_socket:
 	if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
@@ -1732,16 +1730,16 @@
 		struct flowi fl;
 
 		fl.proto = IPPROTO_TCP;
-		fl.nl_u.ip6_u.daddr = &np->daddr;
-		fl.nl_u.ip6_u.saddr = &np->saddr;
+		fl.fl6_dst = &np->daddr;
+		fl.fl6_src = &np->saddr;
 		fl.fl6_flowlabel = np->flow_label;
 		fl.oif = sk->bound_dev_if;
-		fl.uli_u.ports.dport = inet->dport;
-		fl.uli_u.ports.sport = inet->sport;
+		fl.fl_ip_dport = inet->dport;
+		fl.fl_ip_sport = inet->sport;
 
 		if (np->opt && np->opt->srcrt) {
 			struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
-			fl.nl_u.ip6_u.daddr = rt0->addr;
+			fl.fl6_dst = rt0->addr;
 		}
 
 		dst = ip6_route_output(sk, &fl);
@@ -1774,12 +1772,12 @@
 	fl.fl6_flowlabel = np->flow_label;
 	IP6_ECN_flow_xmit(sk, fl.fl6_flowlabel);
 	fl.oif = sk->bound_dev_if;
-	fl.uli_u.ports.sport = inet->sport;
-	fl.uli_u.ports.dport = inet->dport;
+	fl.fl_ip_sport = inet->sport;
+	fl.fl_ip_dport = inet->dport;
 
 	if (np->opt && np->opt->srcrt) {
 		struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
-		fl.nl_u.ip6_u.daddr = rt0->addr;
+		fl.fl6_dst = rt0->addr;
 	}
 
 	dst = __sk_dst_check(sk, np->dst_cookie);
@@ -1799,7 +1797,7 @@
 	skb->dst = dst_clone(dst);
 
 	/* Restore final destination back after routing done */
-	fl.nl_u.ip6_u.daddr = &np->daddr;
+	fl.fl6_dst = &np->daddr;
 
 	return ip6_xmit(sk, skb, &fl, np->opt);
 }
@@ -2193,7 +2191,7 @@
 static struct inet6_protocol tcpv6_protocol = {
 	.handler	=	tcp_v6_rcv,
 	.err_handler	=	tcp_v6_err,
-	.no_policy	=	1,
+	.flags		=	INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
 };
 
 extern struct proto_ops inet6_stream_ops;
diff -Nru a/net/ipv6/udp.c b/net/ipv6/udp.c
--- a/net/ipv6/udp.c	Sat Apr 19 19:51:50 2003
+++ b/net/ipv6/udp.c	Sat Apr 19 19:51:50 2003
@@ -352,8 +352,8 @@
 	fl.fl6_dst = &np->daddr;
 	fl.fl6_src = &saddr;
 	fl.oif = sk->bound_dev_if;
-	fl.uli_u.ports.dport = inet->dport;
-	fl.uli_u.ports.sport = inet->sport;
+	fl.fl_ip_dport = inet->dport;
+	fl.fl_ip_sport = inet->sport;
 
 	if (!fl.oif && (addr_type&IPV6_ADDR_MULTICAST))
 		fl.oif = np->mcast_oif;
@@ -592,7 +592,7 @@
 				if (!ipv6_addr_cmp(&np->rcv_saddr, loc_addr))
 					return s;
 			}
-			if(!inet6_mc_check(s, loc_addr))
+			if(!inet6_mc_check(s, loc_addr, rmt_addr))
 				continue;
 			return s;
 		}
@@ -640,7 +640,7 @@
 	read_unlock(&udp_hash_lock);
 }
 
-static int udpv6_rcv(struct sk_buff **pskb)
+static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *pskb;
 	struct sock *sk;
@@ -936,8 +936,8 @@
 	fl.fl6_dst = daddr;
 	if (fl.fl6_src == NULL && !ipv6_addr_any(&np->saddr))
 		fl.fl6_src = &np->saddr;
-	fl.uli_u.ports.dport = udh.uh.dest;
-	fl.uli_u.ports.sport = udh.uh.source;
+	fl.fl_ip_dport = udh.uh.dest;
+	fl.fl_ip_sport = udh.uh.source;
 
 	err = ip6_build_xmit(sk, udpv6_getfrag, &udh, &fl, len, opt, hlimit,
 			     msg->msg_flags);
@@ -954,7 +954,7 @@
 static struct inet6_protocol udpv6_protocol = {
 	.handler	=	udpv6_rcv,
 	.err_handler	=	udpv6_err,
-	.no_policy	=	1,
+	.flags		=	INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
 };
 
 #define LINE_LEN 190
diff -Nru a/net/ipv6/xfrm6_input.c b/net/ipv6/xfrm6_input.c
--- a/net/ipv6/xfrm6_input.c	Sat Apr 19 19:51:51 2003
+++ b/net/ipv6/xfrm6_input.c	Sat Apr 19 19:51:51 2003
@@ -123,7 +123,7 @@
 	return nexthdr;
 }
 
-int xfrm6_rcv(struct sk_buff **pskb)
+int xfrm6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
 {
 	struct sk_buff *skb = *pskb;
 	int err;
@@ -172,6 +172,9 @@
 		if (x->props.replay_window && xfrm_replay_check(x, seq))
 			goto drop_unlock;
 
+		if (xfrm_state_check_expire(x))
+			goto drop_unlock;
+
 		nexthdr = x->type->input(x, &(xfrm_vec[xfrm_nr].decap), skb);
 		if (nexthdr <= 0)
 			goto drop_unlock;
@@ -230,6 +233,7 @@
 
 	memcpy(skb->sp->x+skb->sp->len, xfrm_vec, xfrm_nr*sizeof(struct sec_decap_state));
 	skb->sp->len += xfrm_nr;
+	skb->ip_summed = CHECKSUM_NONE;
 
 	if (decaps) {
 		if (!(skb->dev->flags&IFF_LOOPBACK)) {
@@ -237,9 +241,10 @@
 			skb->dst = NULL;
 		}
 		netif_rx(skb);
-		return 0;
+		return -1;
 	} else {
-		return -nexthdr;
+		*nhoffp = nh_offset;
+		return 1;
 	}
 
 drop_unlock:
@@ -250,7 +255,7 @@
 	while (--xfrm_nr >= 0)
 		xfrm_state_put(xfrm_vec[xfrm_nr].xvec);
 	kfree_skb(skb);
-	return 0;
+	return -1;
 }
 
 void __init xfrm6_input_init(void)
diff -Nru a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
--- a/net/ipv6/xfrm6_policy.c	Sat Apr 19 19:51:29 2003
+++ b/net/ipv6/xfrm6_policy.c	Sat Apr 19 19:51:29 2003
@@ -195,16 +195,17 @@
 			if (pskb_may_pull(skb, skb->nh.raw + offset + 4 - skb->data)) {
 				u16 *ports = (u16 *)exthdr;
 
-				fl->uli_u.ports.sport = ports[0];
-				fl->uli_u.ports.dport = ports[1];
+				fl->fl_ip_sport = ports[0];
+				fl->fl_ip_dport = ports[1];
 			}
 			return;
 
 		/* XXX Why are there these headers? */
 		case IPPROTO_AH:
 		case IPPROTO_ESP:
+		case IPPROTO_COMP:
 		default:
-			fl->uli_u.spi = 0;
+			fl->fl_ipsec_spi = 0;
 			return;
 		};
 	}
diff -Nru a/net/ipv6/xfrm6_state.c b/net/ipv6/xfrm6_state.c
--- a/net/ipv6/xfrm6_state.c	Sat Apr 19 19:51:46 2003
+++ b/net/ipv6/xfrm6_state.c	Sat Apr 19 19:51:46 2003
@@ -27,9 +27,9 @@
 	 * to current session. */
 	memcpy(&x->sel.daddr, fl->fl6_dst, sizeof(struct in6_addr));
 	memcpy(&x->sel.saddr, fl->fl6_src, sizeof(struct in6_addr));
-	x->sel.dport = fl->uli_u.ports.dport;
+	x->sel.dport = fl->fl_ip_dport;
 	x->sel.dport_mask = ~0;
-	x->sel.sport = fl->uli_u.ports.sport;
+	x->sel.sport = fl->fl_ip_sport;
 	x->sel.sport_mask = ~0;
 	x->sel.prefixlen_d = 128;
 	x->sel.prefixlen_s = 128;
diff -Nru a/net/irda/discovery.c b/net/irda/discovery.c
--- a/net/irda/discovery.c	Sat Apr 19 19:51:29 2003
+++ b/net/irda/discovery.c	Sat Apr 19 19:51:29 2003
@@ -140,7 +140,7 @@
 /*
  * Function irlmp_expire_discoveries (log, saddr, force)
  *
- *    Go through all discoveries and expire all that has stayed to long
+ *    Go through all discoveries and expire all that has stayed too long
  *
  * Note : this assume that IrLAP won't change its saddr, which
  * currently is a valid assumption...
diff -Nru a/net/irda/iriap.c b/net/irda/iriap.c
--- a/net/irda/iriap.c	Sat Apr 19 19:51:29 2003
+++ b/net/irda/iriap.c	Sat Apr 19 19:51:29 2003
@@ -944,7 +944,7 @@
 /*
  * Function iriap_watchdog_timer_expired (data)
  *
- *    Query has taken to long time, so abort
+ *    Query has taken too long time, so abort
  *
  */
 void iriap_watchdog_timer_expired(void *data)
diff -Nru a/net/irda/irlap_event.c b/net/irda/irlap_event.c
--- a/net/irda/irlap_event.c	Sat Apr 19 19:51:49 2003
+++ b/net/irda/irlap_event.c	Sat Apr 19 19:51:49 2003
@@ -1038,7 +1038,7 @@
 				 * we send 2000B packets, we may wait another
 				 * 1000B until our turnaround expire. That's
 				 * why we need to be proactive in avoiding
-				 * comming here. - Jean II
+				 * coming here. - Jean II
 				 */
 				return -EPROTO;
 			}
diff -Nru a/net/irda/irlmp.c b/net/irda/irlmp.c
--- a/net/irda/irlmp.c	Sat Apr 19 19:51:50 2003
+++ b/net/irda/irlmp.c	Sat Apr 19 19:51:50 2003
@@ -925,7 +925,7 @@
 	 * Now, check all discovered devices (if any), and notify client
 	 * only about the services that the client is interested in
 	 * We also notify only about the new devices unless the caller
-	 * explicity request a dump of the log. Jean II
+	 * explicitly request a dump of the log. Jean II
 	 */
 	discoveries = irlmp_copy_discoveries(log, &number,
 					     client->hint_mask.word,
diff -Nru a/net/netsyms.c b/net/netsyms.c
--- a/net/netsyms.c	Sat Apr 19 19:51:46 2003
+++ b/net/netsyms.c	Sat Apr 19 19:51:46 2003
@@ -228,14 +228,14 @@
 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 EXPORT_SYMBOL(dev_change_flags);
 #endif
-EXPORT_SYMBOL(vlan_ioctl_hook);
+EXPORT_SYMBOL(vlan_ioctl_set);
 
 EXPORT_SYMBOL(scm_detach_fds);
 
 #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
 EXPORT_SYMBOL(br_handle_frame_hook);
+EXPORT_SYMBOL(brioctl_set);
 #endif
-EXPORT_SYMBOL(br_ioctl_hook);
 
 #ifdef CONFIG_NET_DIVERT
 EXPORT_SYMBOL(alloc_divert_blk);
@@ -318,6 +318,8 @@
 EXPORT_SYMBOL(xfrm_get_acqseq);
 EXPORT_SYMBOL(xfrm_parse_spi);
 EXPORT_SYMBOL(xfrm4_rcv);
+EXPORT_SYMBOL(xfrm4_tunnel_register);
+EXPORT_SYMBOL(xfrm4_tunnel_deregister);
 EXPORT_SYMBOL(xfrm_register_type);
 EXPORT_SYMBOL(xfrm_unregister_type);
 EXPORT_SYMBOL(xfrm_get_type);
diff -Nru a/net/rxrpc/krxtimod.c b/net/rxrpc/krxtimod.c
--- a/net/rxrpc/krxtimod.c	Sat Apr 19 19:51:28 2003
+++ b/net/rxrpc/krxtimod.c	Sat Apr 19 19:51:28 2003
@@ -98,18 +98,18 @@
 		spin_lock(&krxtimod_lock);
 		if (list_empty(&krxtimod_list)) {
 			timeout = MAX_SCHEDULE_TIMEOUT;
-		}
-		else {
-			timer = list_entry(krxtimod_list.next,rxrpc_timer_t,link);
-			timeout = timer->timo_jif;
+		} else {
+			unsigned long tmo;
+
+			timer = list_entry(krxtimod_list.next,
+					   rxrpc_timer_t, link);
+			tmo = timer->timo_jif;
 			jif = jiffies;
 
-			if (time_before_eq(timeout,jif))
+			if (time_before_eq(tmo,jif))
 				goto immediate;
 
-			else {
-				timeout = (long)timeout - (long)jiffies;
-			}
+			timeout = (long)tmo - (long)jiffies;
 		}
 		spin_unlock(&krxtimod_lock);
 
diff -Nru a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h
--- a/net/sched/cls_rsvp.h	Sat Apr 19 19:51:28 2003
+++ b/net/sched/cls_rsvp.h	Sat Apr 19 19:51:28 2003
@@ -149,11 +149,6 @@
 	struct iphdr *nhptr = skb->nh.iph;
 #endif
 
-#if !defined( __i386__) && !defined(__mc68000__)
-	if ((unsigned long)nhptr & 3)
-		return -1;
-#endif
-
 restart:
 
 #if RSVP_DST_LEN == 4
diff -Nru a/net/sched/cls_u32.c b/net/sched/cls_u32.c
--- a/net/sched/cls_u32.c	Sat Apr 19 19:51:30 2003
+++ b/net/sched/cls_u32.c	Sat Apr 19 19:51:30 2003
@@ -112,11 +112,6 @@
 	int sel = 0;
 	int i;
 
-#if !defined(__i386__) && !defined(__mc68000__)
-	if ((unsigned long)ptr & 3)
-		return -1;
-#endif
-
 next_ht:
 	n = ht->ht[sel];
 
diff -Nru a/net/sched/sch_csz.c b/net/sched/sch_csz.c
--- a/net/sched/sch_csz.c	Sat Apr 19 19:51:48 2003
+++ b/net/sched/sch_csz.c	Sat Apr 19 19:51:48 2003
@@ -749,6 +749,14 @@
 static void
 csz_destroy(struct Qdisc* sch)
 {
+	struct csz_sched_data *q = (struct csz_sched_data *)sch->data;
+	struct tcf_proto *tp;
+
+	while ((tp = q->filter_list) != NULL) {
+		q->filter_list = tp->next;
+		tp->ops->destroy(tp);
+	}
+
 	MOD_DEC_USE_COUNT;
 }
 
diff -Nru a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c
--- a/net/sched/sch_dsmark.c	Sat Apr 19 19:51:28 2003
+++ b/net/sched/sch_dsmark.c	Sat Apr 19 19:51:28 2003
@@ -193,6 +193,7 @@
 
 	D2PRINTK("dsmark_enqueue(skb %p,sch %p,[qdisc %p])\n",skb,sch,p);
 	if (p->set_tc_index) {
+		/* FIXME: Safe with non-linear skbs? --RR */
 		switch (skb->protocol) {
 			case __constant_htons(ETH_P_IP):
 				skb->tc_index = ipv4_get_dsfield(skb->nh.iph);
diff -Nru a/net/sched/sch_htb.c b/net/sched/sch_htb.c
--- a/net/sched/sch_htb.c	Sat Apr 19 19:51:49 2003
+++ b/net/sched/sch_htb.c	Sat Apr 19 19:51:49 2003
@@ -102,7 +102,9 @@
 #define HTB_PASSQ q,
 #define HTB_ARGQ struct htb_sched *q,
 #define static
+#undef __inline__
 #define __inline__
+#undef inline
 #define inline
 #define HTB_CMAGIC 0xFEFAFEF1
 #define htb_safe_rb_erase(N,R) do { BUG_TRAP((N)->rb_color != -1); \
diff -Nru a/net/sched/sch_ingress.c b/net/sched/sch_ingress.c
--- a/net/sched/sch_ingress.c	Sat Apr 19 19:51:50 2003
+++ b/net/sched/sch_ingress.c	Sat Apr 19 19:51:50 2003
@@ -222,6 +222,11 @@
 */
 
 	if (dev->qdisc_ingress) {
+		/* FIXME: Push down to ->enqueue functions --RR */
+		if (skb_is_nonlinear(*pskb)
+		    && skb_linearize(*pskb, GFP_ATOMIC) != 0)
+			return NF_DROP;
+
 		spin_lock(&dev->queue_lock);
 		if ((q = dev->qdisc_ingress) != NULL)
 			fwres = q->enqueue(skb, q);
diff -Nru a/net/sched/sch_prio.c b/net/sched/sch_prio.c
--- a/net/sched/sch_prio.c	Sat Apr 19 19:51:46 2003
+++ b/net/sched/sch_prio.c	Sat Apr 19 19:51:46 2003
@@ -158,6 +158,12 @@
 {
 	int prio;
 	struct prio_sched_data *q = (struct prio_sched_data *)sch->data;
+	struct tcf_proto *tp;
+
+	while ((tp = q->filter_list) != NULL) {
+		q->filter_list = tp->next;
+		tp->ops->destroy(tp);
+	}
 
 	for (prio=0; prio<q->bands; prio++) {
 		qdisc_destroy(q->queues[prio]);
diff -Nru a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
--- a/net/sched/sch_sfq.c	Sat Apr 19 19:51:50 2003
+++ b/net/sched/sch_sfq.c	Sat Apr 19 19:51:50 2003
@@ -131,10 +131,6 @@
 	return h & 0x3FF;
 }
 
-#ifndef IPPROTO_ESP
-#define IPPROTO_ESP 50
-#endif
-
 static unsigned sfq_hash(struct sfq_sched_data *q, struct sk_buff *skb)
 {
 	u32 h, h2;
diff -Nru a/net/sctp/ipv6.c b/net/sctp/ipv6.c
--- a/net/sctp/ipv6.c	Sat Apr 19 19:51:49 2003
+++ b/net/sctp/ipv6.c	Sat Apr 19 19:51:49 2003
@@ -165,8 +165,8 @@
 		fl.oif = transport->saddr.v6.sin6_scope_id;
 	else
 		fl.oif = sk->bound_dev_if;
-	fl.uli_u.ports.sport = inet_sk(sk)->sport;
-	fl.uli_u.ports.dport = transport->ipaddr.v6.sin6_port;
+	fl.fl_ip_sport = inet_sk(sk)->sport;
+	fl.fl_ip_dport = transport->ipaddr.v6.sin6_port;
 
 	if (np->opt && np->opt->srcrt) {
 		struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt;
@@ -776,18 +776,18 @@
 	.ops           = &inet6_seqpacket_ops,
 	.capability    = -1,
 	.no_check      = 0,
-	.flags         = SCTP_PROTOSW_FLAG
+	.flags         = SCTP_PROTOSW_FLAG,
 };
 
-static int sctp6_rcv(struct sk_buff **pskb)
+static int sctp6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
 {
-	return sctp_rcv(*pskb);
+	return sctp_rcv(*pskb) ? -1 : 0;
 }
 
 static struct inet6_protocol sctpv6_protocol = {
 	.handler      = sctp6_rcv,
 	.err_handler  = sctp_v6_err,
-	.no_policy    = 1,
+	.flags        = INET6_PROTO_NOPOLICY | INET6_PROTO_FINAL,
 };
 
 static struct sctp_af sctp_ipv6_specific = {
diff -Nru a/net/socket.c b/net/socket.c
--- a/net/socket.c	Sat Apr 19 19:51:46 2003
+++ b/net/socket.c	Sat Apr 19 19:51:46 2003
@@ -71,6 +71,7 @@
 #include <linux/wanrouter.h>
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
+#include <linux/if_bridge.h>
 #include <linux/init.h>
 #include <linux/poll.h>
 #include <linux/cache.h>
@@ -712,8 +713,31 @@
 				 file, vector, count, tot_len);
 }
 
-int (*br_ioctl_hook)(unsigned long arg);
-int (*vlan_ioctl_hook)(unsigned long arg);
+
+/*
+ * Atomic setting of ioctl hooks to avoid race
+ * with module unload.
+ */
+
+static DECLARE_MUTEX(br_ioctl_mutex);
+static int (*br_ioctl_hook)(unsigned long arg) = NULL;
+
+void brioctl_set(int (*hook)(unsigned long))
+{
+	down(&br_ioctl_mutex);
+	br_ioctl_hook = hook;
+	up(&br_ioctl_mutex);
+}
+
+static DECLARE_MUTEX(vlan_ioctl_mutex);
+static int (*vlan_ioctl_hook)(unsigned long arg);
+
+void vlan_ioctl_set(int (*hook)(unsigned long))
+{
+	down(&vlan_ioctl_mutex);
+	vlan_ioctl_hook = hook;
+	up(&vlan_ioctl_mutex);
+}
 
 #ifdef CONFIG_DLCI
 extern int dlci_ioctl(unsigned int, void *);
@@ -759,12 +783,16 @@
 		case SIOCGIFBR:
 		case SIOCSIFBR:
 			err = -ENOPKG;
+			
 #ifdef CONFIG_KMOD
 			if (!br_ioctl_hook)
 				request_module("bridge");
 #endif
-			if (br_ioctl_hook)
+
+			down(&br_ioctl_mutex);
+			if (br_ioctl_hook) 
 				err = br_ioctl_hook(arg);
+			up(&br_ioctl_mutex);
 			break;
 		case SIOCGIFVLAN:
 		case SIOCSIFVLAN:
@@ -773,8 +801,10 @@
 			if (!vlan_ioctl_hook)
 				request_module("8021q");
 #endif
+			down(&vlan_ioctl_mutex);
 			if (vlan_ioctl_hook)
 				err = vlan_ioctl_hook(arg);
+			up(&vlan_ioctl_mutex);
 			break;
 		case SIOCGIFDIVERT:
 		case SIOCSIFDIVERT:
diff -Nru a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
--- a/net/sunrpc/xprt.c	Sat Apr 19 19:51:49 2003
+++ b/net/sunrpc/xprt.c	Sat Apr 19 19:51:49 2003
@@ -625,7 +625,8 @@
 {
 	if (len > desc->count)
 		len = desc->count;
-	skb_copy_bits(desc->skb, desc->offset, to, len);
+	if (skb_copy_bits(desc->skb, desc->offset, to, len))
+		return 0;
 	desc->count -= len;
 	desc->offset += len;
 	return len;
@@ -669,11 +670,15 @@
 		csum2 = skb_checksum(skb, desc.offset, skb->len - desc.offset, 0);
 		desc.csum = csum_block_add(desc.csum, csum2, desc.offset);
 	}
+	if (desc.count)
+		return -1;
 	if ((unsigned short)csum_fold(desc.csum))
 		return -1;
 	return 0;
 no_checksum:
 	xdr_partial_copy_from_skb(xdr, 0, &desc, skb_read_bits);
+	if (desc.count)
+		return -1;
 	return 0;
 }
 
@@ -750,7 +755,8 @@
 {
 	if (len > desc->count)
 		len = desc->count;
-	skb_copy_bits(desc->skb, desc->offset, p, len);
+	if (skb_copy_bits(desc->skb, desc->offset, p, len))
+		return 0;
 	desc->offset += len;
 	desc->count -= len;
 	return len;
diff -Nru a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c
--- a/net/xfrm/xfrm_algo.c	Sat Apr 19 19:51:46 2003
+++ b/net/xfrm/xfrm_algo.c	Sat Apr 19 19:51:46 2003
@@ -445,7 +445,7 @@
 void skb_icv_walk(const struct sk_buff *skb, struct crypto_tfm *tfm,
 		  int offset, int len, icv_update_fn_t icv_update)
 {
-	int start = skb->len - skb->data_len;
+	int start = skb_headlen(skb);
 	int i, copy = start - offset;
 	struct scatterlist sg;
 
@@ -521,7 +521,7 @@
 int
 skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
 {
-	int start = skb->len - skb->data_len;
+	int start = skb_headlen(skb);
 	int i, copy = start - offset;
 	int elt = 0;
 
diff -Nru a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
--- a/net/xfrm/xfrm_policy.c	Sat Apr 19 19:51:47 2003
+++ b/net/xfrm/xfrm_policy.c	Sat Apr 19 19:51:47 2003
@@ -963,6 +963,8 @@
 			 * are implied between each two transformations.
 			 */
 			for (i = pol->xfrm_nr-1, k = 0; i >= 0; i--) {
+				if (pol->xfrm_vec[i].optional)
+					continue;
 				k = xfrm_policy_ok(pol->xfrm_vec+i, sp, k, family);
 				if (k < 0)
 					goto reject;
diff -Nru a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
--- a/net/xfrm/xfrm_state.c	Sat Apr 19 19:51:49 2003
+++ b/net/xfrm/xfrm_state.c	Sat Apr 19 19:51:49 2003
@@ -13,6 +13,7 @@
  * 	
  */
 
+#include <linux/workqueue.h>
 #include <net/xfrm.h>
 #include <linux/pfkeyv2.h>
 #include <linux/ipsec.h>
@@ -41,8 +42,48 @@
 static rwlock_t xfrm_state_afinfo_lock = RW_LOCK_UNLOCKED;
 static struct xfrm_state_afinfo *xfrm_state_afinfo[NPROTO];
 
+static struct work_struct xfrm_state_gc_work;
+static struct list_head xfrm_state_gc_list = LIST_HEAD_INIT(xfrm_state_gc_list);
+static spinlock_t xfrm_state_gc_lock = SPIN_LOCK_UNLOCKED;
+
 static void __xfrm_state_delete(struct xfrm_state *x);
 
+static void xfrm_state_gc_destroy(struct xfrm_state *x)
+{
+	if (del_timer(&x->timer))
+		BUG();
+	if (x->aalg)
+		kfree(x->aalg);
+	if (x->ealg)
+		kfree(x->ealg);
+	if (x->calg)
+		kfree(x->calg);
+	if (x->encap)
+		kfree(x->encap);
+	if (x->type) {
+		x->type->destructor(x);
+		xfrm_put_type(x->type);
+	}
+	kfree(x);
+	wake_up(&km_waitq);
+}
+
+static void xfrm_state_gc_task(void *data)
+{
+	struct xfrm_state *x;
+	struct list_head *entry, *tmp;
+	struct list_head gc_list = LIST_HEAD_INIT(gc_list);
+
+	spin_lock_bh(&xfrm_state_gc_lock);
+	list_splice_init(&xfrm_state_gc_list, &gc_list);
+	spin_unlock_bh(&xfrm_state_gc_lock);
+
+	list_for_each_safe(entry, tmp, &gc_list) {
+		x = list_entry(entry, struct xfrm_state, bydst);
+		xfrm_state_gc_destroy(x);
+	}
+}
+
 static inline unsigned long make_jiffies(long secs)
 {
 	if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ)
@@ -149,28 +190,17 @@
 void __xfrm_state_destroy(struct xfrm_state *x)
 {
 	BUG_TRAP(x->km.state == XFRM_STATE_DEAD);
-	if (del_timer(&x->timer))
-		BUG();
-	if (x->aalg)
-		kfree(x->aalg);
-	if (x->ealg)
-		kfree(x->ealg);
-	if (x->calg)
-		kfree(x->calg);
-	if (x->encap)
-		kfree(x->encap);
-	if (x->type)
-		xfrm_put_type(x->type);
-	kfree(x);
+
+	spin_lock_bh(&xfrm_state_gc_lock);
+	list_add(&x->bydst, &xfrm_state_gc_list);
+	spin_unlock_bh(&xfrm_state_gc_lock);
+	schedule_work(&xfrm_state_gc_work);
 }
 
 static void __xfrm_state_delete(struct xfrm_state *x)
 {
-	int kill = 0;
-
 	if (x->km.state != XFRM_STATE_DEAD) {
 		x->km.state = XFRM_STATE_DEAD;
-		kill = 1;
 		spin_lock(&xfrm_state_lock);
 		list_del(&x->bydst);
 		atomic_dec(&x->refcnt);
@@ -189,22 +219,17 @@
 		 */
 		if (atomic_read(&x->refcnt) > 2)
 			xfrm_flush_bundles(x);
-	}
-
-	/* All xfrm_state objects are created by one of two possible
-	 * paths:
-	 *
-	 * 1) xfrm_state_alloc --> xfrm_state_insert
-	 * 2) xfrm_state_lookup --> xfrm_state_insert
-	 *
-	 * The xfrm_state_lookup or xfrm_state_alloc call gives a
-	 * reference, and that is what we are dropping here.
-	 */
-	atomic_dec(&x->refcnt);
 
-	if (kill && x->type)
-		x->type->destructor(x);
-	wake_up(&km_waitq);
+		/* All xfrm_state objects are created by one of two possible
+		 * paths:
+		 *
+		 * 2) xfrm_state_lookup --> xfrm_state_insert
+		 *
+		 * The xfrm_state_lookup or xfrm_state_alloc call gives a
+		 * reference, and that is what we are dropping here.
+		 */
+		atomic_dec(&x->refcnt);
+	}
 }
 
 void xfrm_state_delete(struct xfrm_state *x)
@@ -773,5 +798,6 @@
 		INIT_LIST_HEAD(&xfrm_state_bydst[i]);
 		INIT_LIST_HEAD(&xfrm_state_byspi[i]);
 	}
+	INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task, NULL);
 }
 
diff -Nru a/scripts/kallsyms.c b/scripts/kallsyms.c
--- a/scripts/kallsyms.c	Sat Apr 19 19:51:51 2003
+++ b/scripts/kallsyms.c	Sat Apr 19 19:51:51 2003
@@ -21,7 +21,7 @@
 
 static struct sym_entry *table;
 static int size, cnt;
-static unsigned long long _stext, _etext;
+static unsigned long long _stext, _etext, _sinittext, _einittext;
 
 static void
 usage(void)
@@ -51,10 +51,8 @@
 static int
 symbol_valid(struct sym_entry *s)
 {
-	if (s->addr < _stext)
-		return 0;
-
-	if (s->addr > _etext)
+	if ((s->addr < _stext || s->addr > _etext)
+	    && (s->addr < _sinittext || s->addr > _einittext))
 		return 0;
 
 	if (strstr(s->sym, "_compiled."))
@@ -85,6 +83,10 @@
 			_stext = table[i].addr;
 		if (strcmp(table[i].sym, "_etext") == 0)
 			_etext = table[i].addr;
+		if (strcmp(table[i].sym, "_sinittext") == 0)
+			_sinittext = table[i].addr;
+		if (strcmp(table[i].sym, "_einittext") == 0)
+			_einittext = table[i].addr;
 	}
 }
 
diff -Nru a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
--- a/scripts/kconfig/gconf.c	Sat Apr 19 19:51:50 2003
+++ b/scripts/kconfig/gconf.c	Sat Apr 19 19:51:50 2003
@@ -64,7 +64,7 @@
 enum {
 	COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE,
 	COL_MENU, COL_COLOR, COL_EDIT, COL_PIXBUF,
-	COL_PIXVIS, COL_BTNVIS, COL_BTNACT, COL_BTNINC,
+	COL_PIXVIS, COL_BTNVIS, COL_BTNACT, COL_BTNINC, COL_BTNRAD,
 	COL_NUMBER
 };
 
@@ -295,7 +295,8 @@
 					  G_TYPE_POINTER, GDK_TYPE_COLOR,
 					  G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,
 					  G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
-					  G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
+					  G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
+					  G_TYPE_BOOLEAN);
 	model2 = GTK_TREE_MODEL(tree2);
 
 	for (parents[0] = NULL, i = 1; i < 256; i++)
@@ -308,7 +309,8 @@
 				   G_TYPE_POINTER, GDK_TYPE_COLOR,
 				   G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF,
 				   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
-				   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
+				   G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
+				   G_TYPE_BOOLEAN);
 	model1 = GTK_TREE_MODEL(tree1);
 }
 
@@ -370,7 +372,8 @@
 					    renderer,
 					    "active", COL_BTNACT,
 					    "inconsistent", COL_BTNINC,
-					    "visible", COL_BTNVIS, NULL);
+					    "visible", COL_BTNVIS, 
+					    "radio", COL_BTNRAD, NULL);
 	/*g_signal_connect(G_OBJECT(renderer), "toggled",
 	   G_CALLBACK(renderer_toggled), NULL); */
 	renderer = gtk_cell_renderer_text_new();
@@ -1219,6 +1222,8 @@
 		struct symbol *def_sym = sym_get_choice_value(sym);
 		struct menu *def_menu = NULL;
 
+		row[COL_BTNVIS] = GINT_TO_POINTER(FALSE);
+
 		for (child = menu->list; child; child = child->next) {
 			if (menu_is_visible(child)
 			    && child->sym == def_sym)
@@ -1229,6 +1234,8 @@
 			row[COL_VALUE] =
 			    g_strdup(menu_get_prompt(def_menu));
 	}
+	if(sym->flags & SYMBOL_CHOICEVAL)
+		row[COL_BTNRAD] = GINT_TO_POINTER(TRUE);
 
 	stype = sym_get_type(sym);
 	switch (stype) {
@@ -1307,6 +1314,7 @@
 			   COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]),
 			   COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]),
 			   COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]),
+			   COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]),
 			   -1);
 
 	g_object_unref(pix);
diff -Nru a/scripts/per-cpu-check.awk b/scripts/per-cpu-check.awk
--- a/scripts/per-cpu-check.awk	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,19 +0,0 @@
-/ __per_cpu_start$$/ {
-	IN_PER_CPU=1
-}
-
-/ __per_cpu_end$$/ {
-	IN_PER_CPU=0
-}
-
-/__per_cpu$$/ && ! ( / __ksymtab_/ || / __kstrtab_/ || / __kcrctab_/ || / __crc_/ ) {
-	if (!IN_PER_CPU) {
-		print $$3 " not in per-cpu section" > "/dev/stderr";
-		FOUND=1;
-	}
-}
-
-END {
-	exit FOUND;
-}
-
diff -Nru a/sound/core/Makefile b/sound/core/Makefile
--- a/sound/core/Makefile	Sat Apr 19 19:51:49 2003
+++ b/sound/core/Makefile	Sat Apr 19 19:51:49 2003
@@ -17,7 +17,7 @@
 
 snd-page-alloc-objs := memalloc.o
 ifeq ($(CONFIG_PCI),y)
-snd-page-alloc-objs += sgbuf.o memory_wrapper.o
+snd-page-alloc-objs += sgbuf.o
 endif
 
 snd-rawmidi-objs  := rawmidi.o
diff -Nru a/sound/core/control.c b/sound/core/control.c
--- a/sound/core/control.c	Sat Apr 19 19:51:28 2003
+++ b/sound/core/control.c	Sat Apr 19 19:51:28 2003
@@ -106,6 +106,7 @@
 	snd_card_t *card;
 	snd_ctl_file_t *ctl;
 	snd_kcontrol_t *control;
+	unsigned int idx;
 
 	ctl = snd_magic_cast(snd_ctl_file_t, file->private_data, return -ENXIO);
 	fasync_helper(-1, file, 0, &ctl->fasync);
@@ -117,8 +118,9 @@
 	down_write(&card->controls_rwsem);
 	list_for_each(list, &card->controls) {
 		control = snd_kcontrol(list);
-		if (control->owner == ctl)
-			control->owner = NULL;
+		for (idx = 0; idx < control->count; idx++)
+			if (control->vd[idx].owner == ctl)
+				control->vd[idx].owner = NULL;
 	}
 	up_write(&card->controls_rwsem);
 	snd_ctl_empty_read_queue(ctl);
@@ -163,8 +165,8 @@
 		}
 	_found:
 		wake_up(&ctl->change_sleep);
-		kill_fasync(&ctl->fasync, SIGIO, POLL_IN);
 		spin_unlock_irqrestore(&ctl->read_lock, flags);
+		kill_fasync(&ctl->fasync, SIGIO, POLL_IN);
 	}
 	read_unlock(&card->ctl_files_rwlock);
 }
@@ -172,21 +174,28 @@
 /**
  * snd_ctl_new - create a control instance from the template
  * @control: the control template
+ * @access: the default control access
  *
  * Allocates a new snd_kcontrol_t instance and copies the given template 
- * to the new instance.
+ * to the new instance. It does not copy volatile data (access).
  *
  * Returns the pointer of the new instance, or NULL on failure.
  */
-snd_kcontrol_t *snd_ctl_new(snd_kcontrol_t * control)
+snd_kcontrol_t *snd_ctl_new(snd_kcontrol_t * control, unsigned int access)
 {
 	snd_kcontrol_t *kctl;
+	unsigned int idx;
 	
 	snd_runtime_check(control != NULL, return NULL);
-	kctl = (snd_kcontrol_t *)snd_magic_kmalloc(snd_kcontrol_t, 0, GFP_KERNEL);
+	snd_runtime_check(control->count > 0, return NULL);
+	kctl = (snd_kcontrol_t *)snd_magic_kcalloc(snd_kcontrol_t,
+						   sizeof(snd_kcontrol_volatile_t) * control->count,
+						   GFP_KERNEL);
 	if (kctl == NULL)
 		return NULL;
 	*kctl = *control;
+	for (idx = 0; idx < kctl->count; idx++)
+		kctl->vd[idx].access = access;
 	return kctl;
 }
 
@@ -197,13 +206,14 @@
  *
  * Allocates a new snd_kcontrol_t instance and initialize from the given 
  * template.  When the access field of ncontrol is 0, it's assumed as
- * READWRITE access.
+ * READWRITE access. When the count field is 0, it's assumes as one.
  *
  * Returns the pointer of the newly generated instance, or NULL on failure.
  */
 snd_kcontrol_t *snd_ctl_new1(snd_kcontrol_new_t * ncontrol, void *private_data)
 {
 	snd_kcontrol_t kctl;
+	unsigned int access;
 	
 	snd_runtime_check(ncontrol != NULL, return NULL);
 	snd_assert(ncontrol->info != NULL, return NULL);
@@ -214,14 +224,16 @@
 	if (ncontrol->name)
 		strncpy(kctl.id.name, ncontrol->name, sizeof(kctl.id.name)-1);
 	kctl.id.index = ncontrol->index;
-	kctl.access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
-		      (ncontrol->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE|SNDRV_CTL_ELEM_ACCESS_INACTIVE|SNDRV_CTL_ELEM_ACCESS_INDIRECT));
+	kctl.count = ncontrol->count ? ncontrol->count : 1;
+	access = ncontrol->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
+		 (ncontrol->access & (SNDRV_CTL_ELEM_ACCESS_READWRITE|SNDRV_CTL_ELEM_ACCESS_INACTIVE|
+		 		      SNDRV_CTL_ELEM_ACCESS_DINDIRECT|SNDRV_CTL_ELEM_ACCESS_INDIRECT));
 	kctl.info = ncontrol->info;
 	kctl.get = ncontrol->get;
 	kctl.put = ncontrol->put;
 	kctl.private_value = ncontrol->private_value;
 	kctl.private_data = private_data;
-	return snd_ctl_new(&kctl);
+	return snd_ctl_new(&kctl, access);
 }
 
 /**
@@ -253,16 +265,20 @@
  */
 int snd_ctl_add(snd_card_t * card, snd_kcontrol_t * kcontrol)
 {
+	snd_ctl_elem_id_t id;
+	unsigned int idx;
+
 	snd_runtime_check(card != NULL && kcontrol != NULL, return -EINVAL);
 	snd_assert(kcontrol->info != NULL, return -EINVAL);
-	snd_assert(!(kcontrol->access & SNDRV_CTL_ELEM_ACCESS_READ) || kcontrol->get != NULL, return -EINVAL);
-	snd_assert(!(kcontrol->access & SNDRV_CTL_ELEM_ACCESS_WRITE) || kcontrol->put != NULL, return -EINVAL);
 	down_write(&card->controls_rwsem);
 	list_add_tail(&kcontrol->list, &card->controls);
-	card->controls_count++;
-	kcontrol->id.numid = ++card->last_numid;
+	card->controls_count += kcontrol->count;
+	kcontrol->id.numid = card->last_numid + 1;
+	card->last_numid += kcontrol->count;
 	up_write(&card->controls_rwsem);
-	snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &kcontrol->id);
+	id = kcontrol->id;
+	for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++)
+		snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_ADD, &id);
 	return 0;
 }
 
@@ -278,12 +294,17 @@
  */
 int snd_ctl_remove(snd_card_t * card, snd_kcontrol_t * kcontrol)
 {
+	snd_ctl_elem_id_t id;
+	unsigned int idx;
+
 	snd_runtime_check(card != NULL && kcontrol != NULL, return -EINVAL);
 	down_write(&card->controls_rwsem);
 	list_del(&kcontrol->list);
-	card->controls_count--;
+	card->controls_count -= kcontrol->count;
 	up_write(&card->controls_rwsem);
-	snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_REMOVE, &kcontrol->id);
+	id = kcontrol->id;
+	for (idx = 0; idx < kcontrol->count; idx++, id.index++, id.numid++)
+		snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_REMOVE, &id);
 	snd_ctl_free_one(kcontrol);
 	return 0;
 }
@@ -308,7 +329,8 @@
 	return snd_ctl_remove(card, kctl);
 }
 
-static snd_kcontrol_t *_ctl_find_id(snd_card_t * card, snd_ctl_elem_id_t *id); /* w/o lock */
+static snd_kcontrol_t *_ctl_find_id
+(snd_card_t * card, snd_ctl_elem_id_t *id); /* w/o lock */
 
 /**
  * snd_ctl_rename_id - replace the id of a control on the card
@@ -332,7 +354,8 @@
 		return -ENOENT;
 	}
 	kctl->id = *dst_id;
-	kctl->id.numid = ++card->last_numid;
+	kctl->id.numid = card->last_numid + 1;
+	card->last_numid += kctl->count;
 	up_write(&card->controls_rwsem);
 	return 0;
 }
@@ -345,7 +368,7 @@
 	snd_runtime_check(card != NULL && numid != 0, return NULL);
 	list_for_each(list, &card->controls) {
 		kctl = snd_kcontrol(list);
-		if (kctl->id.numid == numid)
+		if (kctl->id.numid <= numid && kctl->id.numid + kctl->count > numid)
 			return kctl;
 	}
 	return NULL;
@@ -369,8 +392,14 @@
 			continue;
 		if (strncmp(kctl->id.name, id->name, sizeof(kctl->id.name)))
 			continue;
-		if (kctl->id.index != id->index)
+		if (kctl->id.index > id->index)
+			continue;
+		if (kctl->id.index + kctl->count <= id->index)
+			continue;
+		if (kctl->id.index != id->index) {
+			printk("BOOOR: %i, %i, %i\n", kctl->id.index, kctl->count, id->index);
 			continue;
+		}
 		return kctl;
 	}
 	return NULL;
@@ -438,12 +467,13 @@
 	snd_ctl_elem_list_t list;
 	snd_kcontrol_t *kctl;
 	snd_ctl_elem_id_t *dst, *id;
-	int offset, space;
+	unsigned int offset, space, first, jidx;
 	
 	if (copy_from_user(&list, _list, sizeof(list)))
 		return -EFAULT;
 	offset = list.offset;
 	space = list.space;
+	first = 0;
 	/* try limit maximum space */
 	if (space > 16384)
 		return -ENOMEM;
@@ -455,17 +485,27 @@
 		down_read(&card->controls_rwsem);
 		list.count = card->controls_count;
 		plist = card->controls.next;
-		while (offset-- > 0 && plist != &card->controls)
+		while (plist != &card->controls) {
+			if (offset == 0)
+				break;
+			kctl = snd_kcontrol(plist);
+			if (offset < kctl->count)
+				break;
+			offset -= kctl->count;
 			plist = plist->next;
+		}
 		list.used = 0;
 		id = dst;
 		while (space > 0 && plist != &card->controls) {
 			kctl = snd_kcontrol(plist);
-			memcpy(id, &kctl->id, sizeof(snd_ctl_elem_id_t));
-			id++;
+			for (jidx = offset; space > 0 && jidx < kctl->count; jidx++) {
+				snd_ctl_build_ioff(id, kctl, jidx);
+				id++;
+				space--;
+				list.used++;
+			}
 			plist = plist->next;
-			space--;
-			list.used++;
+			offset = 0;
 		}
 		up_read(&card->controls_rwsem);
 		if (list.used > 0 && copy_to_user(list.pids, dst, list.used * sizeof(snd_ctl_elem_id_t)))
@@ -486,6 +526,8 @@
 	snd_card_t *card = ctl->card;
 	snd_ctl_elem_info_t info;
 	snd_kcontrol_t *kctl;
+	snd_kcontrol_volatile_t *vd;
+	unsigned int index_offset;
 	int result;
 	
 	if (copy_from_user(&info, _info, sizeof(info)))
@@ -502,13 +544,15 @@
 	result = kctl->info(kctl, &info);
 	if (result >= 0) {
 		snd_assert(info.access == 0, );
-		info.id = kctl->id;
-		info.access = kctl->access;
-		if (kctl->owner) {
+		index_offset = snd_ctl_get_ioff(kctl, &info.id);
+		vd = &kctl->vd[index_offset];
+		snd_ctl_build_ioff(&info.id, kctl, index_offset);
+		info.access = vd->access;
+		if (vd->owner) {
 			info.access |= SNDRV_CTL_ELEM_ACCESS_LOCK;
-			if (kctl->owner == ctl)
+			if (vd->owner == ctl)
 				info.access |= SNDRV_CTL_ELEM_ACCESS_OWNER;
-			info.owner = kctl->owner_pid;
+			info.owner = vd->owner_pid;
 		} else {
 			info.owner = -1;
 		}
@@ -522,8 +566,11 @@
 
 static int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t *_control)
 {
+
 	snd_ctl_elem_value_t *control;
 	snd_kcontrol_t *kctl;
+	snd_kcontrol_volatile_t *vd;
+	unsigned int index_offset;
 	int result, indirect;
 	
 	control = kmalloc(sizeof(*control), GFP_KERNEL);
@@ -536,16 +583,18 @@
 	if (kctl == NULL) {
 		result = -ENOENT;
 	} else {
-		indirect = kctl->access & SNDRV_CTL_ELEM_ACCESS_INDIRECT ? 1 : 0;
+		index_offset = snd_ctl_get_ioff(kctl, &control->id);
+		vd = &kctl->vd[index_offset];
+		indirect = vd->access & SNDRV_CTL_ELEM_ACCESS_INDIRECT ? 1 : 0;
 		if (control->indirect != indirect) {
 			result = -EACCES;
 		} else {
-			if ((kctl->access & SNDRV_CTL_ELEM_ACCESS_READ) && kctl->get != NULL) {
+			if ((vd->access & SNDRV_CTL_ELEM_ACCESS_READ) && kctl->get != NULL) {
+				snd_ctl_build_ioff(&control->id, kctl, index_offset);
 				result = kctl->get(kctl, control);
-				if (result >= 0)
-					control->id = kctl->id;
-			} else
+			} else {
 				result = -EPERM;
+			}
 		}
 	}
 	up_read(&card->controls_rwsem);
@@ -561,6 +610,8 @@
 	snd_card_t *card = file->card;
 	snd_ctl_elem_value_t *control;
 	snd_kcontrol_t *kctl;
+	snd_kcontrol_volatile_t *vd;
+	unsigned int index_offset;
 	int result, indirect;
 
 	control = kmalloc(sizeof(*control), GFP_KERNEL);
@@ -573,22 +624,23 @@
 	if (kctl == NULL) {
 		result = -ENOENT;
 	} else {
-		indirect = kctl->access & SNDRV_CTL_ELEM_ACCESS_INDIRECT ? 1 : 0;
+		index_offset = snd_ctl_get_ioff(kctl, &control->id);
+		vd = &kctl->vd[index_offset];
+		indirect = vd->access & SNDRV_CTL_ELEM_ACCESS_INDIRECT ? 1 : 0;
 		if (control->indirect != indirect) {
 			result = -EACCES;
 		} else {
-			if (!(kctl->access & SNDRV_CTL_ELEM_ACCESS_WRITE) ||
+			if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_WRITE) ||
 			    kctl->put == NULL ||
-			    (kctl->owner != NULL && kctl->owner != file)) {
+			    (vd->owner != NULL && vd->owner != file)) {
 				result = -EPERM;
 			} else {
+				snd_ctl_build_ioff(&control->id, kctl, index_offset);
 				result = kctl->put(kctl, control);
-				if (result >= 0)
-					control->id = kctl->id;
 			}
 			if (result > 0) {
 				up_read(&card->controls_rwsem);
-				snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &kctl->id);
+				snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &control->id);
 				result = 0;
 				goto __unlocked;
 			}
@@ -608,6 +660,7 @@
 	snd_card_t *card = file->card;
 	snd_ctl_elem_id_t id;
 	snd_kcontrol_t *kctl;
+	snd_kcontrol_volatile_t *vd;
 	int result;
 	
 	if (copy_from_user(&id, _id, sizeof(id)))
@@ -617,11 +670,12 @@
 	if (kctl == NULL) {
 		result = -ENOENT;
 	} else {
-		if (kctl->owner != NULL)
+		vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)];
+		if (vd->owner != NULL)
 			result = -EBUSY;
 		else {
-			kctl->owner = file;
-			kctl->owner_pid = current->pid;
+			vd->owner = file;
+			vd->owner_pid = current->pid;
 			result = 0;
 		}
 	}
@@ -634,6 +688,7 @@
 	snd_card_t *card = file->card;
 	snd_ctl_elem_id_t id;
 	snd_kcontrol_t *kctl;
+	snd_kcontrol_volatile_t *vd;
 	int result;
 	
 	if (copy_from_user(&id, _id, sizeof(id)))
@@ -643,13 +698,14 @@
 	if (kctl == NULL) {
 		result = -ENOENT;
 	} else {
-		if (kctl->owner == NULL)
+		vd = &kctl->vd[snd_ctl_get_ioff(kctl, &id)];
+		if (vd->owner == NULL)
 			result = -EINVAL;
-		else if (kctl->owner != file)
+		else if (vd->owner != file)
 			result = -EPERM;
 		else {
-			kctl->owner = NULL;
-			kctl->owner_pid = 0;
+			vd->owner = NULL;
+			vd->owner_pid = 0;
 			result = 0;
 		}
 	}
diff -Nru a/sound/core/info.c b/sound/core/info.c
--- a/sound/core/info.c	Sat Apr 19 19:51:50 2003
+++ b/sound/core/info.c	Sat Apr 19 19:51:50 2003
@@ -20,6 +20,7 @@
  */
 
 #include <sound/driver.h>
+#include <linux/version.h>
 #include <linux/init.h>
 #include <linux/vmalloc.h>
 #include <linux/time.h>
@@ -1032,6 +1033,7 @@
 static inline void snd_info_device_entry_prepare(struct proc_dir_entry *de, snd_info_entry_t *entry)
 {
 	de->fill_inode = snd_info_device_fill_inode;
+	de->ops = &snd_info_device_inode_operations;
 }
 #else
 static inline void snd_info_device_entry_prepare(struct proc_dir_entry *de, snd_info_entry_t *entry)
@@ -1067,9 +1069,6 @@
 	p = create_proc_entry(entry->name, entry->mode, snd_proc_dev);
 	if (p) {
 		snd_info_device_entry_prepare(p, entry);
-#ifdef LINUX_2_2
-		p->ops = &snd_info_device_inode_operations;
-#endif
 	} else {
 		up(&info_mutex);
 		snd_info_free_entry(entry);
diff -Nru a/sound/core/memalloc.c b/sound/core/memalloc.c
--- a/sound/core/memalloc.c	Sat Apr 19 19:51:50 2003
+++ b/sound/core/memalloc.c	Sat Apr 19 19:51:50 2003
@@ -36,6 +36,20 @@
 MODULE_LICENSE("GPL");
 
 
+/* so far, pre-defined allocation is only for hammerfall cards... */
+/* #define ENABLE_PREALLOC */
+
+
+#ifdef ENABLE_PREALLOC
+#ifndef SNDRV_CARDS
+#define SNDRV_CARDS	8
+#endif
+static int enable[8] = {[0 ... (SNDRV_CARDS-1)] = 1};
+MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(enable, "Enable cards to allocate buffers.");
+#endif
+
+
 /*
  */
 
@@ -50,6 +64,8 @@
 	struct list_head list;
 };
 
+/* id for pre-allocated buffers */
+#define SNDRV_DMA_DEVICE_UNUSED (unsigned int)-1
 
 #ifdef CONFIG_SND_DEBUG
 #define __ASTRING__(x) #x
@@ -63,23 +79,74 @@
 #define snd_assert(expr, args...) /**/
 #endif
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 0)
+#ifdef CONFIG_PCI
+#if defined(__i386__) || defined(__ppc__) || defined(__x86_64__)
+#define HACK_PCI_ALLOC_CONSISTENT
+
+/*
+ * A hack to allocate large buffers via pci_alloc_consistent()
+ *
+ * since pci_alloc_consistent always tries GFP_DMA when the requested
+ * pci memory region is below 32bit, it happens quite often that even
+ * 2 order of pages cannot be allocated.
+ *
+ * so in the following, we allocate at first without dma_mask, so that
+ * allocation will be done without GFP_DMA.  if the area doesn't match
+ * with the requested region, then realloate with the original dma_mask
+ * again.
+ */
+
+void *snd_pci_hack_alloc_consistent(struct pci_dev *hwdev, size_t size,
+				    dma_addr_t *dma_handle)
+{
+	void *ret;
+	u64 dma_mask;
+	unsigned long rmask;
+
+	if (hwdev == NULL)
+		return pci_alloc_consistent(hwdev, size, dma_handle);
+	dma_mask = hwdev->dma_mask;
+	rmask = ~((unsigned long)dma_mask);
+	hwdev->dma_mask = 0xffffffff; /* do without masking */
+	ret = pci_alloc_consistent(hwdev, size, dma_handle);
+	hwdev->dma_mask = dma_mask; /* restore */
+	if (ret) {
+		/* obtained address is out of range? */
+		if (((unsigned long)*dma_handle + size - 1) & rmask) {
+			/* reallocate with the proper mask */
+			pci_free_consistent(hwdev, size, ret, *dma_handle);
+			ret = pci_alloc_consistent(hwdev, size, dma_handle);
+		}
+	} else {
+		/* wish to success now with the proper mask... */
+		if (dma_mask != 0xffffffff)
+			ret = pci_alloc_consistent(hwdev, size, dma_handle);
+	}
+	return ret;
+}
+
 /* redefine pci_alloc_consistent for some architectures */
-#ifdef HACK_PCI_ALLOC_CONSISTENT
 #undef pci_alloc_consistent
 #define pci_alloc_consistent snd_pci_hack_alloc_consistent
-#endif
+
+#endif /* arch */
+#endif /* CONFIG_PCI */
+#endif /* LINUX >= 2.4.0 */
 
 
 /*
  * compare the two devices
  * returns non-zero if matched.
  */
-static int compare_device(const struct snd_dma_device *a, const struct snd_dma_device *b)
+static int compare_device(const struct snd_dma_device *a, const struct snd_dma_device *b, int allow_unused)
 {
 	if (a->type != b->type)
 		return 0;
-	if (a->id != b->id)
-		return 0;
+	if (a->id != b->id) {
+		if (! allow_unused || (a->id != SNDRV_DMA_DEVICE_UNUSED && b->id != SNDRV_DMA_DEVICE_UNUSED))
+			return 0;
+	}
 	switch (a->type) {
 	case SNDRV_DMA_TYPE_CONTINUOUS:
 #ifdef CONFIG_ISA
@@ -193,14 +260,14 @@
 /*
  * search for the device
  */
-static struct snd_mem_list *mem_list_find(const struct snd_dma_device *dev)
+static struct snd_mem_list *mem_list_find(const struct snd_dma_device *dev, int allow_unused)
 {
 	struct list_head *p;
 	struct snd_mem_list *mem;
 
 	list_for_each(p, &mem_list_head) {
 		mem = list_entry(p, struct snd_mem_list, list);
-		if (compare_device(&mem->dev, dev))
+		if (compare_device(&mem->dev, dev, allow_unused))
 			return mem;
 	}
 	return NULL;
@@ -224,9 +291,10 @@
 	snd_assert(dev && dmab, return 0);
 
 	down(&list_mutex);
-	mem = mem_list_find(dev);
+	mem = mem_list_find(dev, 1);
 	if (mem) {
 		mem->used = 1;
+		mem->dev = *dev;
 		*dmab = mem->buffer;
 		up(&list_mutex);
 		return dmab->bytes;
@@ -250,7 +318,7 @@
 
 	snd_assert(dev, return -EINVAL);
 	down(&list_mutex);
-	mem = mem_list_find(dev);
+	mem = mem_list_find(dev, 0);
 	if (mem)
 		mem->used = 0;
 	up(&list_mutex);
@@ -277,7 +345,7 @@
 
 	snd_assert(dev, return -EINVAL);
 	down(&list_mutex);
-	mem = mem_list_find(dev);
+	mem = mem_list_find(dev, 0);
 	if (mem) {
 		snd_dma_free_pages(dev, &mem->buffer);
 		if (! dmab || ! dmab->bytes) {
@@ -293,6 +361,10 @@
 			return 0;
 		}
 		mem = kmalloc(sizeof(*mem), GFP_KERNEL);
+		if (! mem) {
+			up(&list_mutex);
+			return -ENOMEM;
+		}
 		mem->dev = *dev;
 		list_add(&mem->list, &mem_list_head);
 	}
@@ -712,6 +784,85 @@
 #endif /* CONFIG_SBUS */
 
 
+#ifdef ENABLE_PREALLOC
+/*
+ * allocation of buffers for pre-defined devices
+ */
+
+/* FIXME: for pci only - other bus? */
+struct prealloc_dev {
+	unsigned short vendor;
+	unsigned short device;
+	unsigned long dma_mask;
+	unsigned int size;
+	unsigned int buffers;
+};
+
+#define HAMMERFALL_BUFFER_SIZE    (16*1024*4*(26+1))
+
+static struct prealloc_dev prealloc_devices[] __initdata = {
+	{
+		/* hammerfall */
+		.vendor = 0x10ee,
+		.device = 0x3fc4,
+		.dma_mask = 0xffffffff,
+		.size = HAMMERFALL_BUFFER_SIZE,
+		.buffers = 2
+	},
+	{
+		/* HDSP */
+		.vendor = 0x10ee,
+		.device = 0x3fc5,
+		.dma_mask = 0xffffffff,
+		.size = HAMMERFALL_BUFFER_SIZE,
+		.buffers = 2
+	},
+	{ }, /* terminator */
+};
+
+static void __init preallocate_cards(void)
+{
+	struct pci_dev *pci;
+	int card;
+
+	card = 0;
+
+	pci_for_each_dev(pci) {
+		struct prealloc_dev *dev;
+		if (card >= SNDRV_CARDS)
+			break;
+		for (dev = prealloc_devices; dev->vendor; dev++) {
+			unsigned int i;
+			if (dev->vendor != pci->vendor || dev->device != pci->device)
+				continue;
+			if (! enable[card++])
+				continue;
+			
+			if (pci_set_dma_mask(pci, dev->dma_mask) < 0) {
+				printk(KERN_ERR "snd-page-alloc: cannot set DMA mask %lx for pci %04x:%04x\n", dev->dma_mask, dev->vendor, dev->device);
+				continue;
+			}
+
+			for (i = 0; i < dev->buffers; i++) {
+				struct snd_dma_device dma;
+				struct snd_dma_buffer buf;
+				snd_dma_device_pci(&dma, pci, SNDRV_DMA_DEVICE_UNUSED);
+				memset(&buf, 0, sizeof(buf));
+				snd_dma_alloc_pages(&dma, dev->size, &buf);
+				if (buf.bytes) {
+					if (snd_dma_set_reserved(&dma, &buf) < 0) {
+						printk(KERN_WARNING "snd-page-alloc: cannot reserve buffer\n");
+						snd_dma_free_pages(&dma, &buf);
+					}
+				} else
+					printk(KERN_WARNING "snd-page-alloc: cannot allocate buffer pages (size = %d)\n", dev->size);
+			}
+		}
+	}
+}
+#endif
+
+
 #ifdef CONFIG_PROC_FS
 /*
  * proc file interface
@@ -735,6 +886,9 @@
 static int __init snd_mem_init(void)
 {
 	create_proc_read_entry("driver/snd-page-alloc", 0, 0, snd_mem_proc_read, NULL);
+#ifdef ENABLE_PREALLOC
+	preallocate_cards();
+#endif
 	return 0;
 }
 
@@ -774,9 +928,6 @@
 EXPORT_SYMBOL(snd_free_pci_pages);
 EXPORT_SYMBOL(snd_malloc_sgbuf_pages);
 EXPORT_SYMBOL(snd_free_sgbuf_pages);
-#ifdef HACK_PCI_ALLOC_CONSISTENT
-EXPORT_SYMBOL(snd_pci_hack_alloc_consistent);
-#endif 
 #endif
 #ifdef CONFIG_SBUS
 EXPORT_SYMBOL(snd_malloc_sbus_pages);
diff -Nru a/sound/core/memory_wrapper.c b/sound/core/memory_wrapper.c
--- a/sound/core/memory_wrapper.c	Sat Apr 19 19:51:50 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
- *                   Takashi Iwai <tiwai@suse.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
- *
- */
-
-#include <linux/config.h>
-#include <linux/version.h>
-#include <linux/pci.h>
-#include <sound/memalloc.h>
-
-
-#ifdef HACK_PCI_ALLOC_CONSISTENT
-/*
- * A dirty hack... when the kernel code is fixed this should be removed.
- *
- * since pci_alloc_consistent always tries GFP_DMA when the requested
- * pci memory region is below 32bit, it happens quite often that even
- * 2 order of pages cannot be allocated.
- *
- * so in the following, we allocate at first without dma_mask, so that
- * allocation will be done without GFP_DMA.  if the area doesn't match
- * with the requested region, then realloate with the original dma_mask
- * again.
- */
-
-void *snd_pci_hack_alloc_consistent(struct pci_dev *hwdev, size_t size,
-				    dma_addr_t *dma_handle)
-{
-	void *ret;
-	u64 dma_mask;
-	unsigned long rmask;
-
-	if (hwdev == NULL)
-		return pci_alloc_consistent(hwdev, size, dma_handle);
-	dma_mask = hwdev->dma_mask;
-	rmask = ~((unsigned long)dma_mask);
-	hwdev->dma_mask = 0xffffffff; /* do without masking */
-	ret = pci_alloc_consistent(hwdev, size, dma_handle);
-	hwdev->dma_mask = dma_mask; /* restore */
-	if (ret) {
-		/* obtained address is out of range? */
-		if (((unsigned long)*dma_handle + size - 1) & rmask) {
-			/* reallocate with the proper mask */
-			pci_free_consistent(hwdev, size, ret, *dma_handle);
-			ret = pci_alloc_consistent(hwdev, size, dma_handle);
-		}
-	} else {
-		/* wish to success now with the proper mask... */
-		if (dma_mask != 0xffffffff)
-			ret = pci_alloc_consistent(hwdev, size, dma_handle);
-	}
-	return ret;
-}
-
-#endif /* HACK_PCI_ALLOC_CONSISTENT */
diff -Nru a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c
--- a/sound/core/oss/mixer_oss.c	Sat Apr 19 19:51:49 2003
+++ b/sound/core/oss/mixer_oss.c	Sat Apr 19 19:51:49 2003
@@ -204,6 +204,8 @@
 static int snd_mixer_oss_set_recsrc(snd_mixer_oss_file_t *fmixer, int recsrc)
 {
 	snd_mixer_oss_t *mixer = fmixer->mixer;
+	snd_mixer_oss_slot_t *pslot;
+	int chn, active;
 	int result = 0;
 
 	if (mixer == NULL)
@@ -214,16 +216,15 @@
 		mixer->put_recsrc(fmixer, ffz(~recsrc));
 		mixer->get_recsrc(fmixer, &result);
 		result = 1 << result;
-	} else {
-		snd_mixer_oss_slot_t *pslot;
-		int chn, active;
-		for (chn = 0; chn < 31; chn++) {
-			pslot = &mixer->slots[chn];
-			if (pslot->put_recsrc) {
-				active = (recsrc & (1 << chn)) ? 1 : 0;
-				pslot->put_recsrc(fmixer, pslot, active);
-			}
+	}
+	for (chn = 0; chn < 31; chn++) {
+		pslot = &mixer->slots[chn];
+		if (pslot->put_recsrc) {
+			active = (recsrc & (1 << chn)) ? 1 : 0;
+			pslot->put_recsrc(fmixer, pslot, active);
 		}
+	}
+	if (! result) {
 		for (chn = 0; chn < 31; chn++) {
 			pslot = &mixer->slots[chn];
 			if (pslot->get_recsrc) {
diff -Nru a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
--- a/sound/core/oss/pcm_oss.c	Sat Apr 19 19:51:50 2003
+++ b/sound/core/oss/pcm_oss.c	Sat Apr 19 19:51:50 2003
@@ -24,6 +24,7 @@
 #endif
 
 #include <sound/driver.h>
+#include <linux/version.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/time.h>
@@ -930,8 +931,8 @@
 		runtime = substream->runtime;
 		if (rate < 1000)
 			rate = 1000;
-		else if (rate > 48000)
-			rate = 48000;
+		else if (rate > 192000)
+			rate = 192000;
 		if (runtime->oss.rate != rate) {
 			runtime->oss.params = 1;
 			runtime->oss.rate = rate;
diff -Nru a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
--- a/sound/core/pcm_lib.c	Sat Apr 19 19:51:46 2003
+++ b/sound/core/pcm_lib.c	Sat Apr 19 19:51:46 2003
@@ -1711,7 +1711,7 @@
  * snd_pcm_hw_param_choose
  *
  * Choose one configuration from configuration space defined by PARAMS
- * The configuration choosen is that obtained fixing in this order:
+ * The configuration chosen is that obtained fixing in this order:
  * first access, first format, first subformat, min channels,
  * min rate, min period time, max buffer size, min tick time
  */
@@ -2119,6 +2119,7 @@
 				spin_lock_irq(&runtime->lock);
 				switch (runtime->status->state) {
 				case SNDRV_PCM_STATE_XRUN:
+				case SNDRV_PCM_STATE_DRAINING:
 					state = ERROR;
 					goto _end_loop;
 				case SNDRV_PCM_STATE_SUSPENDED:
@@ -2377,6 +2378,7 @@
 		snd_pcm_uframes_t cont;
 		if (runtime->sleep_min == 0 && runtime->status->state == SNDRV_PCM_STATE_RUNNING)
 			snd_pcm_update_hw_ptr(substream);
+	      __draining:
 		avail = snd_pcm_capture_avail(runtime);
 		if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) {
 			if (avail < runtime->xfer_align) {
@@ -2418,6 +2420,8 @@
 				case SNDRV_PCM_STATE_SUSPENDED:
 					state = SUSPENDED;
 					goto _end_loop;
+				case SNDRV_PCM_STATE_DRAINING:
+					goto __draining;
 				default:
 					break;
 				}
diff -Nru a/sound/core/pcm_native.c b/sound/core/pcm_native.c
--- a/sound/core/pcm_native.c	Sat Apr 19 19:51:46 2003
+++ b/sound/core/pcm_native.c	Sat Apr 19 19:51:46 2003
@@ -20,6 +20,7 @@
  */
 
 #include <sound/driver.h>
+#include <linux/version.h>
 #include <linux/mm.h>
 #include <linux/file.h>
 #include <linux/slab.h>
diff -Nru a/sound/core/rtctimer.c b/sound/core/rtctimer.c
--- a/sound/core/rtctimer.c	Sat Apr 19 19:51:50 2003
+++ b/sound/core/rtctimer.c	Sat Apr 19 19:51:50 2003
@@ -31,11 +31,7 @@
 
 #if defined(CONFIG_RTC) || defined(CONFIG_RTC_MODULE)
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 12)	/* FIXME: which 2.2.x kernel? */
-#include <linux/rtc.h>
-#else
 #include <linux/mc146818rtc.h>
-#endif
 
 #define RTC_FREQ	1024		/* default frequency */
 #define NANO_SEC	1000000000L	/* 10^9 in sec */
diff -Nru a/sound/core/seq/instr/ainstr_iw.c b/sound/core/seq/instr/ainstr_iw.c
--- a/sound/core/seq/instr/ainstr_iw.c	Sat Apr 19 19:51:47 2003
+++ b/sound/core/seq/instr/ainstr_iw.c	Sat Apr 19 19:51:47 2003
@@ -78,7 +78,7 @@
 	while (1) {
 		if (*len < (long)sizeof(__u32))
 			return -EINVAL;
-		if (copy_from_user(&stype, data, sizeof(stype)))
+		if (copy_from_user(&stype, *data, sizeof(stype)))
 			return -EFAULT;
 		if (stype == IWFFFF_STRU_WAVE)
 			return 0;
diff -Nru a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c
--- a/sound/core/seq/oss/seq_oss_midi.c	Sat Apr 19 19:51:27 2003
+++ b/sound/core/seq/oss/seq_oss_midi.c	Sat Apr 19 19:51:27 2003
@@ -593,6 +593,7 @@
 		break;
 	}
 	
+	snd_seq_oss_readq_put_timestamp(dp->readq, ev->time.tick, dp->seq_mode);
 	snd_seq_oss_readq_put_event(dp->readq, &ossev);
 
 	return 0;
diff -Nru a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c
--- a/sound/core/seq/seq_memory.c	Sat Apr 19 19:51:28 2003
+++ b/sound/core/seq/seq_memory.c	Sat Apr 19 19:51:28 2003
@@ -235,14 +235,14 @@
 	while (pool->free == NULL && ! nonblock && ! pool->closing) {
 
 		spin_unlock(&pool->lock);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)
+#ifdef LINUX_2_2
 		/* change semaphore to allow other clients
 		   to access device file */
 		if (file)
 			up(&semaphore_of(file));
 #endif
 		interruptible_sleep_on(&pool->output_sleep);
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)
+#ifdef LINUX_2_2
 		/* restore semaphore again */
 		if (file)
 			down(&semaphore_of(file));
diff -Nru a/sound/core/seq/seq_midi.c b/sound/core/seq/seq_midi.c
--- a/sound/core/seq/seq_midi.c	Sat Apr 19 19:51:50 2003
+++ b/sound/core/seq/seq_midi.c	Sat Apr 19 19:51:50 2003
@@ -200,6 +200,7 @@
 		snd_rawmidi_kernel_release(&msynth->input_rfile);
 		return err;
 	}
+	snd_midi_event_reset_encode(msynth->parser);
 	runtime->event = snd_midi_input_event;
 	runtime->private_data = msynth;
 	snd_rawmidi_kernel_read(msynth->input_rfile.input, NULL, 0);
@@ -236,6 +237,7 @@
 		snd_rawmidi_kernel_release(&msynth->output_rfile);
 		return err;
 	}
+	snd_midi_event_reset_decode(msynth->parser);
 	return 0;
 }
 
diff -Nru a/sound/core/seq/seq_midi_emul.c b/sound/core/seq/seq_midi_emul.c
--- a/sound/core/seq/seq_midi_emul.c	Sat Apr 19 19:51:50 2003
+++ b/sound/core/seq/seq_midi_emul.c	Sat Apr 19 19:51:50 2003
@@ -561,7 +561,7 @@
 
 		} else if (buf[5] == 0x00 && buf[6] == 0x04) {
 			/* master volume */
-			parsed = SNDRV_MIDI_SYSEX_GS_REVERB_MODE;
+			parsed = SNDRV_MIDI_SYSEX_GS_MASTER_VOLUME;
 			chset->gs_master_volume = buf[7];
 
 		}
diff -Nru a/sound/core/sound.c b/sound/core/sound.c
--- a/sound/core/sound.c	Sat Apr 19 19:51:49 2003
+++ b/sound/core/sound.c	Sat Apr 19 19:51:49 2003
@@ -20,6 +20,7 @@
  */
 
 #include <sound/driver.h>
+#include <linux/version.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/time.h>
@@ -345,6 +346,8 @@
 #ifdef CONFIG_DEVFS_FS
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
 	devfs_handle = devfs_mk_dir(NULL, "snd", 3, NULL);
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,5,67)
+	devfs_handle = devfs_mk_dir(NULL, "snd", NULL);
 #else
 	devfs_handle = devfs_mk_dir("snd");
 #endif
diff -Nru a/sound/core/wrappers.c b/sound/core/wrappers.c
--- a/sound/core/wrappers.c	Sat Apr 19 19:51:28 2003
+++ b/sound/core/wrappers.c	Sat Apr 19 19:51:28 2003
@@ -19,7 +19,6 @@
  *
  */
 
-#include <linux/version.h>
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/slab.h>
diff -Nru a/sound/drivers/dummy.c b/sound/drivers/dummy.c
--- a/sound/drivers/dummy.c	Sat Apr 19 19:51:50 2003
+++ b/sound/drivers/dummy.c	Sat Apr 19 19:51:50 2003
@@ -19,6 +19,7 @@
  */
 
 #include <sound/driver.h>
+#include <linux/version.h>
 #include <linux/init.h>
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0)
 #include <linux/jiffies.h>
diff -Nru a/sound/drivers/opl3/opl3_lib.c b/sound/drivers/opl3/opl3_lib.c
--- a/sound/drivers/opl3/opl3_lib.c	Sat Apr 19 19:51:29 2003
+++ b/sound/drivers/opl3/opl3_lib.c	Sat Apr 19 19:51:29 2003
@@ -470,7 +470,7 @@
 	case OPL3_HW_OPL4:
 		opl3->max_voices = MAX_OPL3_VOICES;
 		snd_assert(opl3->r_port != 0, snd_opl3_free(opl3); return -ENODEV);
-		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_MODE, 0x00);	/* Enter OPL2 mode */
+		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_MODE, OPL3_OPL3_ENABLE);	/* Enter OPL3 mode */
 	}
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, opl3, &ops)) < 0) {
 		snd_opl3_free(opl3);
diff -Nru a/sound/drivers/opl3/opl3_seq.c b/sound/drivers/opl3/opl3_seq.c
--- a/sound/drivers/opl3/opl3_seq.c	Sat Apr 19 19:51:49 2003
+++ b/sound/drivers/opl3/opl3_seq.c	Sat Apr 19 19:51:49 2003
@@ -70,8 +70,6 @@
 	opl3->use_time = 0;
 	opl3->connection_reg = 0x00;
 	if (opl3->hardware >= OPL3_HW_OPL3) {
-		/* Enter OPL3 mode */
-		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_MODE, OPL3_OPL3_ENABLE);
 		/* Clear 4-op connections */
 		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_CONNECTION_SELECT,
 				 opl3->connection_reg);
@@ -197,7 +195,7 @@
 	callbacks.private_data = opl3;
 
 	opl_ver = (opl3->hardware & OPL3_HW_MASK) >> 8;
-	sprintf(name, "OPL%i Port", opl_ver);
+	sprintf(name, "OPL%i FM Port", opl_ver);
 
 	opl3->chset->client = opl3->seq_client;
 	opl3->chset->port = snd_seq_event_port_attach(opl3->seq_client, &callbacks,
diff -Nru a/sound/drivers/opl3/opl3_synth.c b/sound/drivers/opl3/opl3_synth.c
--- a/sound/drivers/opl3/opl3_synth.c	Sat Apr 19 19:51:28 2003
+++ b/sound/drivers/opl3/opl3_synth.c	Sat Apr 19 19:51:28 2003
@@ -220,9 +220,6 @@
 		opl3->command(opl3, opl3_reg, 0x00);	/* Note off */
 	}
 
-	if (opl3->hardware >= OPL3_HW_OPL3)
-		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_MODE, 0x00);	/* Enter OPL2 mode */
-
 	opl3->max_voices = MAX_OPL2_VOICES;
 	opl3->fm_mode = SNDRV_DM_FM_MODE_OPL2;
 
@@ -426,14 +423,9 @@
 	if ((mode == SNDRV_DM_FM_MODE_OPL3) && (opl3->hardware < OPL3_HW_OPL3))
 		return -EINVAL;
 
-	if (mode == SNDRV_DM_FM_MODE_OPL3) {
-		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_MODE, OPL3_OPL3_ENABLE);	/* Enter OPL3 mode */
-		opl3->fm_mode = SNDRV_DM_FM_MODE_OPL3;
+	opl3->fm_mode = mode;
+	if (opl3->hardware >= OPL3_HW_OPL3)
 		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_CONNECTION_SELECT, 0x00);	/* Clear 4-op connections */
-	} else {
-		opl3->command(opl3, OPL3_RIGHT | OPL3_REG_MODE, 0x00);		/* Enter OPL2 mode */
-		opl3->fm_mode = SNDRV_DM_FM_MODE_OPL2;
-	}
 
 	return 0;
 }
diff -Nru a/sound/i2c/cs8427.c b/sound/i2c/cs8427.c
--- a/sound/i2c/cs8427.c	Sat Apr 19 19:51:27 2003
+++ b/sound/i2c/cs8427.c	Sat Apr 19 19:51:27 2003
@@ -425,7 +425,7 @@
 	chip = snd_magic_cast(cs8427_t, cs8427->private_data, return -ENXIO);
 	if (active)
 		memcpy(chip->playback.pcm_status, chip->playback.def_status, 24);
-	chip->playback.pcm_ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	chip->playback.pcm_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(cs8427->bus->card, SNDRV_CTL_EVENT_MASK_VALUE |
 					  SNDRV_CTL_EVENT_MASK_INFO, &chip->playback.pcm_ctl->id);
 	return 0;
diff -Nru a/sound/i2c/l3/uda1341.c b/sound/i2c/l3/uda1341.c
--- a/sound/i2c/l3/uda1341.c	Sat Apr 19 19:51:47 2003
+++ b/sound/i2c/l3/uda1341.c	Sat Apr 19 19:51:47 2003
@@ -17,7 +17,7 @@
  * 2002-05-12   Tomas Kasparek  another code cleanup
  */
 
-/* $Id: uda1341.c,v 1.7 2003/02/13 19:19:19 perex Exp $ */
+/* $Id: uda1341.c,v 1.8 2003/03/20 16:45:59 perex Exp $ */
 
 #include <sound/driver.h>
 #include <linux/module.h>
diff -Nru a/sound/isa/Kconfig b/sound/isa/Kconfig
--- a/sound/isa/Kconfig	Sat Apr 19 19:51:50 2003
+++ b/sound/isa/Kconfig	Sat Apr 19 19:51:50 2003
@@ -41,9 +41,10 @@
 
 config SND_PC98_CS4232
 	tristate "NEC PC9800 CS4232 driver"
-	depends on SND
+	depends on SND && PC9800
 	help
-	  Say 'Y' or 'M' to include support for NEC PC-9801/PC-9821 sound cards
+	  Say 'Y' or 'M' to include support for NEC PC-9801/PC-9821 on-board
+	  soundchip based on CS4232.
 
 config SND_ES968
 	tristate "Generic ESS ES968 driver"
diff -Nru a/sound/isa/ad1816a/ad1816a.c b/sound/isa/ad1816a/ad1816a.c
--- a/sound/isa/ad1816a/ad1816a.c	Sat Apr 19 19:51:29 2003
+++ b/sound/isa/ad1816a/ad1816a.c	Sat Apr 19 19:51:29 2003
@@ -22,11 +22,7 @@
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/wait.h>
-#ifndef LINUX_ISAPNP_H
-#include <linux/isapnp.h>
-#define isapnp_card pci_bus
-#define isapnp_dev pci_dev
-#endif
+#include <linux/pnp.h>
 #include <sound/core.h>
 #define SNDRV_GET_ID
 #include <sound/initval.h>
@@ -93,152 +89,111 @@
 MODULE_PARM_SYNTAX(dma2, SNDRV_DMA_DESC);
 
 struct snd_card_ad1816a {
-#ifdef __ISAPNP__
-	struct isapnp_dev *dev;
-	struct isapnp_dev *devmpu;
-#endif	/* __ISAPNP__ */
+	struct pnp_dev *dev;
+	struct pnp_dev *devmpu;
 };
 
-static snd_card_t *snd_ad1816a_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-
-#ifdef __ISAPNP__
-
-static struct isapnp_card *snd_ad1816a_isapnp_cards[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
-static const struct isapnp_card_id *snd_ad1816a_isapnp_id[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
-
-#define ISAPNP_AD1816A(_va, _vb, _vc, _device, _fa, _fb, _fc, _audio, _mpu401) \
-	{ \
-		ISAPNP_CARD_ID(_va, _vb, _vc, _device), \
-		.devs = { ISAPNP_DEVICE_ID(_fa, _fb, _fc, _audio), \
-			  ISAPNP_DEVICE_ID(_fa, _fb, _fc, _mpu401), } \
-	}
-
-static struct isapnp_card_id snd_ad1816a_pnpids[] __devinitdata = {
-	/* Highscreen Sound-Boostar 16 3D */
-	ISAPNP_AD1816A('M','D','K',0x1605,'A','D','S',0x7180,0x7181),
-	/* Highscreen Sound-Boostar 16 3D - added by Stefan Behnel */
-	ISAPNP_AD1816A('L','W','C',0x1061,'A','D','S',0x7180,0x7181),
+static struct pnp_card_device_id snd_ad1816a_pnpids[] __devinitdata = {
 	/* Analog Devices AD1815 */
-	ISAPNP_AD1816A('A','D','S',0x7150,'A','D','S',0x7150,0x7151),
+	{ .id = "ADS7150", .devs = { { .id = "ADS7150" }, { .id = "ADS7151" } } },
 	/* Analog Devices AD1816A - added by Kenneth Platz <kxp@atl.hp.com> */
-	ISAPNP_AD1816A('A','D','S',0x7181,'A','D','S',0x7180,0x7181),
-	/* Analog Devices AD1816A - Terratec Base 64 */
-	ISAPNP_AD1816A('T','E','R',0x1411,'A','D','S',0x7180,0x7181),
-	/* Analog Devices AD1816A - Terratec AudioSystem EWS64S */
-	ISAPNP_AD1816A('T','E','R',0x1112,'A','D','S',0x7180,0x7181),
+	{ .id = "ADS7181", .devs = { { .id = "ADS7180" }, { .id = "ADS7181" } } },
 	/* Analog Devices AD1816A - Aztech/Newcom SC-16 3D */
-	ISAPNP_AD1816A('A','Z','T',0x1022,'A','Z','T',0x1018,0x2002),
+	{ .id = "AZT1022", .devs = { { .id = "AZT1018" }, { .id = "AZT2002" } } },
+	/* Highscreen Sound-Boostar 16 3D - added by Stefan Behnel */
+	{ .id = "LWC1061", .devs = { { .id = "ADS7180" }, { .id = "ADS7181" } } },
+	/* Highscreen Sound-Boostar 16 3D */
+	{ .id = "MDK1605", .devs = { { .id = "ADS7180" }, { .id = "ADS7181" } } },
 	/* Shark Predator ISA - added by Ken Arromdee */
-	ISAPNP_AD1816A('S','M','M',0x7180,'A','D','S',0x7180,0x7181),
-	{ ISAPNP_CARD_END, }
+	{ .id = "SMM7180", .devs = { { .id = "ADS7180" }, { .id = "ADS7181" } } },
+	/* Analog Devices AD1816A - Terratec AudioSystem EWS64S */
+	{ .id = "TER1112", .devs = { { .id = "ADS7180" }, { .id = "ADS7181" } } },
+	/* Analog Devices AD1816A - Terratec Base 64 */
+	{ .id = "TER1411", .devs = { { .id = "ADS7180" }, { .id = "ADS7181" } } },
+	/* end */
+	{ .id = "" }
 };
 
-ISAPNP_CARD_TABLE(snd_ad1816a_pnpids);
+MODULE_DEVICE_TABLE(pnp_card, snd_ad1816a_pnpids);
 
-#endif	/* __ISAPNP__ */
 
 #define	DRIVER_NAME	"snd-card-ad1816a"
 
 
-#ifdef __ISAPNP__
-static int __init snd_card_ad1816a_isapnp(int dev,
-					  struct snd_card_ad1816a *acard)
+static int __devinit snd_card_ad1816a_pnp(int dev, struct snd_card_ad1816a *acard,
+					  struct pnp_card_link *card,
+					  const struct pnp_card_device_id *id)
 {
-	const struct isapnp_card_id *id = snd_ad1816a_isapnp_id[dev];
-	struct isapnp_card *card = snd_ad1816a_isapnp_cards[dev];
-	struct isapnp_dev *pdev;
-
-	acard->dev = isapnp_find_dev(card, id->devs[0].vendor, id->devs[0].function, NULL);
-	if (acard->dev->active) {
-		acard->dev = NULL;
+	struct pnp_dev *pdev;
+	struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL);
+	int err;
+
+	acard->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
+	if (acard->dev == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
-	acard->devmpu = isapnp_find_dev(card, id->devs[1].vendor, id->devs[1].function, NULL);
-	if (acard->devmpu->active) {
-		acard->dev = acard->devmpu = NULL;
+	acard->devmpu = pnp_request_card_device(card, id->devs[1].id, NULL);
+	if (acard->devmpu == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
 
 	pdev = acard->dev;
-	if (pdev->prepare(pdev) < 0)
-		return -EAGAIN;
+	pnp_init_resource_table(cfg);
 
 	if (port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[2], port[dev], 16);
+		pnp_resource_change(&cfg->port_resource[2], port[dev], 16);
 	if (fm_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[1], fm_port[dev], 4);
+		pnp_resource_change(&cfg->port_resource[1], fm_port[dev], 4);
 	if (dma1[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], dma1[dev],
-			1);
+		pnp_resource_change(&cfg->dma_resource[0], dma1[dev], 1);
 	if (dma2[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[1], dma2[dev],
-			1);
+		pnp_resource_change(&cfg->dma_resource[1], dma2[dev], 1);
 	if (irq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], irq[dev], 1);
+		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
 
-	if (pdev->activate(pdev) < 0) {
-		printk(KERN_ERR PFX "AUDIO isapnp configure failure\n");
+	if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		printk(KERN_ERR PFX "AUDIO PnP configure failure\n");
+		kfree(cfg);
 		return -EBUSY;
 	}
 
-	port[dev] = pdev->resource[2].start;
-	fm_port[dev] = pdev->resource[1].start;
-	dma1[dev] = pdev->dma_resource[0].start;
-	dma2[dev] = pdev->dma_resource[1].start;
-	irq[dev] = pdev->irq_resource[0].start;
+	port[dev] = pnp_port_start(pdev, 2);
+	fm_port[dev] = pnp_port_start(pdev, 1);
+	dma1[dev] = pnp_dma(pdev, 0);
+	dma2[dev] = pnp_dma(pdev, 1);
+	irq[dev] = pnp_irq(pdev, 0);
 
 	pdev = acard->devmpu;
-	if (pdev == NULL || pdev->prepare(pdev) < 0) {
-		mpu_port[dev] = -1;
-		acard->devmpu = NULL;
-		return 0;
-	}
+	pnp_init_resource_table(cfg);
 
 	if (mpu_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], mpu_port[dev],
-			2);
+		pnp_resource_change(&cfg->port_resource[0], mpu_port[dev], 2);
 	if (mpu_irq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], mpu_irq[dev],
-			1);
+		pnp_resource_change(&cfg->irq_resource[0], mpu_irq[dev], 1);
 
-	if (pdev->activate(pdev) < 0) {
-		/* not fatal error */
-		printk(KERN_ERR PFX "MPU-401 isapnp configure failure\n");
+	if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		printk(KERN_ERR PFX "MPU401 PnP configure failure\n");
 		mpu_port[dev] = -1;
 		acard->devmpu = NULL;
 	} else {
-		mpu_port[dev] = pdev->resource[0].start;
-		mpu_irq[dev] = pdev->irq_resource[0].start;
+		mpu_port[dev] = pnp_port_start(pdev, 0);
+		mpu_irq[dev] = pnp_irq(pdev, 0);
 	}
 
+	kfree(cfg);
 	return 0;
 }
 
-static void snd_card_ad1816a_deactivate(struct snd_card_ad1816a *acard)
-{
-	if (acard->dev) {
-		acard->dev->deactivate(acard->dev);
-		acard->dev = NULL;
-	}
-	if (acard->devmpu) {
-		acard->devmpu->deactivate(acard->devmpu);
-		acard->devmpu = NULL;
-	}
-}
-#endif	/* __ISAPNP__ */
-
-static void snd_card_ad1816a_free(snd_card_t *card)
-{
-	struct snd_card_ad1816a *acard = (struct snd_card_ad1816a *)card->private_data;
-
-	if (acard) {
-#ifdef __ISAPNP__
-		snd_card_ad1816a_deactivate(acard);
-#endif	/* __ISAPNP__ */
-	}
-}
-
-static int __init snd_card_ad1816a_probe(int dev)
+static int __devinit snd_card_ad1816a_probe(int dev, struct pnp_card_link *pcard,
+					    const struct pnp_card_device_id *pid)
 {
 	int error;
 	snd_card_t *card;
@@ -250,17 +205,11 @@
 				 sizeof(struct snd_card_ad1816a))) == NULL)
 		return -ENOMEM;
 	acard = (struct snd_card_ad1816a *)card->private_data;
-	card->private_free = snd_card_ad1816a_free;
 
-#ifdef __ISAPNP__
-	if ((error = snd_card_ad1816a_isapnp(dev, acard))) {
+	if ((error = snd_card_ad1816a_pnp(dev, acard, pcard, pid))) {
 		snd_card_free(card);
 		return error;
 	}
-#else
-	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
-	return -ENOSYS;
-#endif	/* __ISAPNP__ */
 
 	if ((error = snd_ad1816a_create(card, port[dev],
 					irq[dev],
@@ -314,13 +263,12 @@
 		snd_card_free(card);
 		return error;
 	}
-	snd_ad1816a_cards[dev] = card;
+	pnp_set_card_drvdata(pcard, card);
 	return 0;
 }
 
-#ifdef __ISAPNP__
-static int __init snd_ad1816a_isapnp_detect(struct isapnp_card *card,
-					    const struct isapnp_card_id *id)
+static int __devinit snd_ad1816a_pnp_detect(struct pnp_card_link *card,
+					    const struct pnp_card_device_id *id)
 {
 	static int dev;
 	int res;
@@ -328,9 +276,7 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev])
 			continue;
-		snd_ad1816a_isapnp_cards[dev] = card;
-		snd_ad1816a_isapnp_id[dev] = id;
-		res = snd_card_ad1816a_probe(dev);
+		res = snd_card_ad1816a_probe(dev, card, id);
 		if (res < 0)
 			return res;
 		dev++;
@@ -338,17 +284,28 @@
 	}
         return -ENODEV;
 }
-#endif
+
+static void __devexit snd_ad1816a_pnp_remove(struct pnp_card_link * pcard)
+{
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
+}
+
+static struct pnp_card_driver ad1816a_pnpc_driver = {
+	.flags		= PNP_DRIVER_RES_DISABLE,
+	.name		= "ad1816a",
+	.id_table	= snd_ad1816a_pnpids,
+	.probe		= snd_ad1816a_pnp_detect,
+	.remove		= __devexit_p(snd_ad1816a_pnp_remove),
+};
 
 static int __init alsa_card_ad1816a_init(void)
 {
 	int cards = 0;
 
-#ifdef __ISAPNP__
-	cards += isapnp_probe_cards(snd_ad1816a_pnpids, snd_ad1816a_isapnp_detect);
-#else
-	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
-#endif
+	cards += pnp_register_card_driver(&ad1816a_pnpc_driver);
 #ifdef MODULE
 	if (!cards)
 		printk(KERN_ERR "no AD1816A based soundcards found.\n");
@@ -358,10 +315,7 @@
 
 static void __exit alsa_card_ad1816a_exit(void)
 {
-	int dev;
-
-	for (dev = 0; dev < SNDRV_CARDS; dev++)
-		snd_card_free(snd_ad1816a_cards[dev]);
+	pnp_unregister_card_driver(&ad1816a_pnpc_driver);
 }
 
 module_init(alsa_card_ad1816a_init)
diff -Nru a/sound/isa/als100.c b/sound/isa/als100.c
--- a/sound/isa/als100.c	Sat Apr 19 19:51:28 2003
+++ b/sound/isa/als100.c	Sat Apr 19 19:51:28 2003
@@ -100,15 +100,15 @@
 
 static struct pnp_card_device_id snd_als100_pnpids[] __devinitdata = {
 	/* ALS100 - PRO16PNP */
-	{ .id = "ALS0001", .devs = { { "@@@0001" }, { "@X@0001" }, { "@H@0001" }, } },
+	{ .id = "ALS0001", .devs = { { "@@@0001" }, { "@X@0001" }, { "@H@0001" } } },
 	/* ALS110 - MF1000 - Digimate 3D Sound */
-	{ .id = "ALS0110", .devs = { { "@@@1001" }, { "@X@1001" }, { "@H@1001" }, } },
+	{ .id = "ALS0110", .devs = { { "@@@1001" }, { "@X@1001" }, { "@H@1001" } } },
 	/* ALS120 */
-	{ .id = "ALS0120", .devs = { { "@@@2001" }, { "@X@2001" }, { "@H@2001" }, } },
+	{ .id = "ALS0120", .devs = { { "@@@2001" }, { "@X@2001" }, { "@H@2001" } } },
 	/* ALS200 */
-	{ .id = "ALS0200", .devs = { { "@@@0020" }, { "@X@0020" }, { "@H@0001" }, } },
+	{ .id = "ALS0200", .devs = { { "@@@0020" }, { "@X@0020" }, { "@H@0001" } } },
 	/* RTL3000 */
-	{ .id = "RTL3000", .devs = { { "@@@2001" }, { "@X@2001" }, { "@H@2001" }, } },
+	{ .id = "RTL3000", .devs = { { "@@@2001" }, { "@X@2001" }, { "@H@2001" } } },
 	{ .id = "", } /* end */
 };
 
@@ -116,13 +116,14 @@
 
 #define DRIVER_NAME	"snd-card-als100"
 
-static int __devinit snd_card_als100_isapnp(int dev, struct snd_card_als100 *acard,
-					    struct pnp_card_link *card,
-					    const struct pnp_card_device_id *id)
+static int __devinit snd_card_als100_pnp(int dev, struct snd_card_als100 *acard,
+					 struct pnp_card_link *card,
+					 const struct pnp_card_device_id *id)
 {
 	struct pnp_dev *pdev;
 	struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL);
 	int err;
+
 	if (!cfg)
 		return -ENOMEM;
 	acard->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
@@ -146,11 +147,11 @@
 		pnp_resource_change(&cfg->dma_resource[1], dma16[dev], 1);
 	if (irq[dev] != SNDRV_AUTO_IRQ)
 		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
-	if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-		printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
+	if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
 	err = pnp_activate_dev(pdev);
 	if (err < 0) {
-		printk(KERN_ERR PFX "AUDIO pnp configure failure\n");
+		snd_printk(KERN_ERR PFX "AUDIO pnp configure failure\n");
 		kfree(cfg);
 		return err;
 	}
@@ -167,7 +168,7 @@
 		if (mpu_irq[dev] != SNDRV_AUTO_IRQ)
 			pnp_resource_change(&cfg->irq_resource[0], mpu_irq[dev], 1);
 		if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-			printk(KERN_ERR PFX "MPU401 the requested resources are invalid, using auto config\n");
+			snd_printk(KERN_ERR PFX "MPU401 the requested resources are invalid, using auto config\n");
 		err = pnp_activate_dev(pdev);
 		if (err < 0)
 			goto __mpu_error;
@@ -177,7 +178,7 @@
 	     __mpu_error:
 	     	if (pdev) {
 		     	pnp_release_card_device(pdev);
-	     		printk(KERN_ERR PFX "MPU401 pnp configure failure, skipping\n");
+	     		snd_printk(KERN_ERR PFX "MPU401 pnp configure failure, skipping\n");
 	     	}
 	     	acard->devmpu = NULL;
 	     	mpu_port[dev] = -1;
@@ -189,7 +190,7 @@
 		if (fm_port[dev] != SNDRV_AUTO_PORT)
 			pnp_resource_change(&cfg->port_resource[0], fm_port[dev], 4);
 		if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-			printk(KERN_ERR PFX "OPL3 the requested resources are invalid, using auto config\n");
+			snd_printk(KERN_ERR PFX "OPL3 the requested resources are invalid, using auto config\n");
 		err = pnp_activate_dev(pdev);
 		if (err < 0)
 			goto __fm_error;
@@ -198,7 +199,7 @@
 	      __fm_error:
 	     	if (pdev) {
 		     	pnp_release_card_device(pdev);
-	     		printk(KERN_ERR PFX "OPL3 pnp configure failure, skipping\n");
+	     		snd_printk(KERN_ERR PFX "OPL3 pnp configure failure, skipping\n");
 	     	}
 	     	acard->devopl = NULL;
 	     	fm_port[dev] = -1;
@@ -223,7 +224,7 @@
 		return -ENOMEM;
 	acard = (struct snd_card_als100 *)card->private_data;
 
-	if ((error = snd_card_als100_isapnp(dev, acard, pcard, pid))) {
+	if ((error = snd_card_als100_pnp(dev, acard, pcard, pid))) {
 		snd_card_free(card);
 		return error;
 	}
@@ -253,15 +254,15 @@
 					mpu_port[dev], 0, 
 					mpu_irq[dev], SA_INTERRUPT,
 					NULL) < 0)
-			printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]);
+			snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]);
 	}
 
 	if (fm_port[dev] > 0) {
 		if (snd_opl3_create(card,
 				    fm_port[dev], fm_port[dev] + 2,
 				    OPL3_HW_AUTO, 0, &opl3) < 0) {
-			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
-				fm_port[dev], fm_port[dev] + 2);
+			snd_printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
+				   fm_port[dev], fm_port[dev] + 2);
 		} else {
 			if ((error = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
 				snd_card_free(card);
@@ -328,7 +329,7 @@
 	cards += pnp_register_card_driver(&als100_pnpc_driver);
 #ifdef MODULE
 	if (!cards)
-		printk(KERN_ERR "no ALS100 based soundcards found\n");
+		snd_printk(KERN_ERR "no ALS100 based soundcards found\n");
 #endif
 	return cards ? 0 : -ENODEV;
 }
diff -Nru a/sound/isa/azt2320.c b/sound/isa/azt2320.c
--- a/sound/isa/azt2320.c	Sat Apr 19 19:51:50 2003
+++ b/sound/isa/azt2320.c	Sat Apr 19 19:51:50 2003
@@ -132,9 +132,9 @@
 
 #define	DRIVER_NAME	"snd-card-azt2320"
 
-static int __init snd_card_azt2320_isapnp(int dev, struct snd_card_azt2320 *acard,
-							     struct pnp_card_link *card,
-							     const struct pnp_card_device_id *id)
+static int __devinit snd_card_azt2320_pnp(int dev, struct snd_card_azt2320 *acard,
+					  struct pnp_card_link *card,
+					  const struct pnp_card_device_id *id)
 {
 	struct pnp_dev *pdev;
 	struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL);
@@ -168,11 +168,11 @@
 	if (irq[dev] != SNDRV_AUTO_IRQ)
 		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
 	if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-		printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
+		snd_printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
 
 	err = pnp_activate_dev(pdev);
 	if (err < 0) {
-		printk(KERN_ERR PFX "AUDIO pnp configure failure\n");
+		snd_printk(KERN_ERR PFX "AUDIO pnp configure failure\n");
 		kfree(cfg);
 		return err;
 	}
@@ -191,7 +191,7 @@
 		if (mpu_irq[dev] != SNDRV_AUTO_IRQ)
 			pnp_resource_change(&cfg->irq_resource[0], mpu_irq[dev], 1);
 		if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-			printk(KERN_ERR PFX "MPU401 the requested resources are invalid, using auto config\n");
+			snd_printk(KERN_ERR PFX "MPU401 the requested resources are invalid, using auto config\n");
 		err = pnp_activate_dev(pdev);
 		if (err < 0)
 			goto __mpu_error;
@@ -201,7 +201,7 @@
 	     __mpu_error:
 	     	if (pdev) {
 		     	pnp_release_card_device(pdev);
-	     		printk(KERN_ERR PFX "MPU401 pnp configure failure, skipping\n");
+	     		snd_printk(KERN_ERR PFX "MPU401 pnp configure failure, skipping\n");
 	     	}
 	     	acard->devmpu = NULL;
 	     	mpu_port[dev] = -1;
@@ -212,13 +212,13 @@
 }
 
 /* same of snd_sbdsp_command by Jaroslav Kysela */
-static int __init snd_card_azt2320_command(unsigned long port, unsigned char val)
+static int __devinit snd_card_azt2320_command(unsigned long port, unsigned char val)
 {
 	int i;
 	unsigned long limit;
 
 	limit = jiffies + HZ / 10;
-	for (i = 50000; i && (limit - jiffies) > 0; i--)
+	for (i = 50000; i && time_after(limit, jiffies); i--)
 		if (!(inb(port + 0x0c) & 0x80)) {
 			outb(val, port + 0x0c);
 			return 0;
@@ -226,7 +226,7 @@
 	return -EBUSY;
 }
 
-static int __init snd_card_azt2320_enable_wss(unsigned long port)
+static int __devinit snd_card_azt2320_enable_wss(unsigned long port)
 {
 	int error;
 
@@ -239,9 +239,9 @@
 	return 0;
 }
 
-static int __init snd_card_azt2320_probe(int dev,
-							   struct pnp_card_link *pcard,
-							   const struct pnp_card_device_id *pid)
+static int __devinit snd_card_azt2320_probe(int dev,
+					    struct pnp_card_link *pcard,
+					    const struct pnp_card_device_id *pid)
 {
 	int error;
 	snd_card_t *card;
@@ -254,7 +254,7 @@
 		return -ENOMEM;
 	acard = (struct snd_card_azt2320 *)card->private_data;
 
-	if ((error = snd_card_azt2320_isapnp(dev, acard, pcard, pid))) {
+	if ((error = snd_card_azt2320_pnp(dev, acard, pcard, pid))) {
 		snd_card_free(card);
 		return error;
 	}
@@ -291,16 +291,15 @@
 				mpu_port[dev], 0,
 				mpu_irq[dev], SA_INTERRUPT,
 				NULL) < 0)
-			printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n",
-				mpu_port[dev]);
+			snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx\n", mpu_port[dev]);
 	}
 
 	if (fm_port[dev] > 0) {
 		if (snd_opl3_create(card,
 				    fm_port[dev], fm_port[dev] + 2,
 				    OPL3_HW_AUTO, 0, &opl3) < 0) {
-			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
-				fm_port[dev], fm_port[dev] + 2);
+			snd_printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
+				   fm_port[dev], fm_port[dev] + 2);
 		} else {
 			if ((error = snd_opl3_timer_new(opl3, 1, 2)) < 0) {
 				snd_card_free(card);
@@ -326,8 +325,8 @@
 	return 0;
 }
 
-static int __init snd_azt2320_pnp_detect(struct pnp_card_link *card,
-                                            const struct pnp_card_device_id *id)
+static int __devinit snd_azt2320_pnp_detect(struct pnp_card_link *card,
+					    const struct pnp_card_device_id *id)
 {
 	static int dev;
 	int res;
@@ -335,7 +334,7 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev])
 			continue;
-		res = snd_card_azt2320_probe(dev,card,id);
+		res = snd_card_azt2320_probe(dev, card, id);
 		if (res < 0)
 			return res;
 		dev++;
@@ -364,15 +363,10 @@
 {
 	int cards = 0;
 
-#ifdef __ISAPNP__
-	cards += isapnp_probe_cards(snd_azt2320_pnpids, snd_azt2320_isapnp_detect);
-#else
-	printk(KERN_ERR PFX "you have to enable ISA PnP support.\n");
-#endif
 	cards += pnp_register_card_driver(&azt2320_pnpc_driver);
 #ifdef MODULE
 	if (!cards)
-		printk(KERN_ERR "no AZT2320 based soundcards found\n");
+		snd_printk(KERN_ERR "no AZT2320 based soundcards found\n");
 #endif
 	return cards ? 0 : -ENODEV;
 }
diff -Nru a/sound/isa/cmi8330.c b/sound/isa/cmi8330.c
--- a/sound/isa/cmi8330.c	Sat Apr 19 19:51:28 2003
+++ b/sound/isa/cmi8330.c	Sat Apr 19 19:51:28 2003
@@ -46,11 +46,7 @@
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
-#ifndef LINUX_ISAPNP_H
-#include <linux/isapnp.h>
-#define isapnp_card pci_bus
-#define isapnp_dev pci_dev
-#endif
+#include <linux/pnp.h>
 #include <sound/core.h>
 #include <sound/ad1848.h>
 #include <sound/sb.h>
@@ -73,7 +69,7 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
 #endif
 static long sbport[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
@@ -93,9 +89,9 @@
 MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
-MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
+MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
 
@@ -156,9 +152,9 @@
 typedef int (*snd_pcm_open_callback_t)(snd_pcm_substream_t *);
 
 struct snd_cmi8330 {
-#ifdef __ISAPNP__
-	struct isapnp_dev *cap;
-	struct isapnp_dev *play;
+#ifdef CONFIG_PNP
+	struct pnp_dev *cap;
+	struct pnp_dev *play;
 #endif
 	snd_card_t *card;
 	ad1848_t *wss;
@@ -172,27 +168,16 @@
 	} streams[2];
 };
 
-static snd_card_t *snd_cmi8330_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-
-#ifdef __ISAPNP__
+static snd_card_t *snd_cmi8330_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
-static struct isapnp_card *snd_cmi8330_isapnp_cards[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
-static const struct isapnp_card_id *snd_cmi8330_isapnp_id[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
+#ifdef CONFIG_PNP
 
-#define ISAPNP_CMI8330(_va, _vb, _vc, _device, _audio1, _audio2) \
-	{ \
-		ISAPNP_CARD_ID(_va, _vb, _vc, _device), \
-		.devs = { ISAPNP_DEVICE_ID('@', '@', '@', _audio1), \
-			  ISAPNP_DEVICE_ID('@', 'X', '@', _audio2), } \
-	}
-
-static struct isapnp_card_id snd_cmi8330_pnpids[] __devinitdata =
-{
-	ISAPNP_CMI8330('C','M','I',0x0001,0x0001,0x0001),
-	{ ISAPNP_CARD_END, }
+static struct pnp_card_device_id snd_cmi8330_pnpids[] __devinitdata = {
+	{ .id = "CMI0001", .devs = { { "@@@0001" }, { "@X@0001" } } },
+	{ .id = "" }
 };
 
-ISAPNP_CARD_TABLE(snd_cmi8330_pnpids);
+MODULE_DEVICE_TABLE(pnp_card, snd_cmi8330_pnpids);
 
 #endif
 
@@ -258,7 +243,7 @@
 };
 
 
-static int __init cmi8330_add_sb_mixers(sb_t *chip)
+static int __devinit cmi8330_add_sb_mixers(sb_t *chip)
 {
 	int idx, err;
 	unsigned long flags;
@@ -283,7 +268,7 @@
 }
 #endif
 
-static int __init snd_cmi8330_mixer(snd_card_t *card, struct snd_cmi8330 *acard)
+static int __devinit snd_cmi8330_mixer(snd_card_t *card, struct snd_cmi8330 *acard)
 {
 	unsigned int idx;
 	int err;
@@ -302,82 +287,78 @@
 	return 0;
 }
 
-#ifdef __ISAPNP__
-static int __init snd_cmi8330_isapnp(int dev, struct snd_cmi8330 *acard)
+#ifdef CONFIG_PNP
+static int __devinit snd_cmi8330_pnp(int dev, struct snd_cmi8330 *acard,
+				     struct pnp_card_link *card,
+				     const struct pnp_card_device_id *id)
 {
-	const struct isapnp_card_id *id = snd_cmi8330_isapnp_id[dev];
-	struct isapnp_card *card = snd_cmi8330_isapnp_cards[dev];
-	struct isapnp_dev *pdev;
-
-	acard->cap = isapnp_find_dev(card, id->devs[0].vendor, id->devs[0].function, NULL);
-	if (acard->cap->active) {
-		acard->cap = NULL;
+	struct pnp_dev *pdev;
+	struct pnp_resource_table * cfg = kmalloc(GFP_ATOMIC, sizeof(struct pnp_resource_table));
+	int err;
+
+	acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL);
+	if (acard->cap == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
-	acard->play = isapnp_find_dev(card, id->devs[1].vendor, id->devs[1].function, NULL);
-	if (acard->play->active) {
-		acard->cap = acard->play = NULL;
+	acard->play = pnp_request_card_device(card, id->devs[1].id, NULL);
+	if (acard->play == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
 
 	pdev = acard->cap;
-	if (pdev->prepare(pdev)<0)
-		return -EAGAIN;
+	pnp_init_resource_table(cfg);
 	/* allocate AD1848 resources */
 	if (wssport[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], wssport[dev], 8);
+		pnp_resource_change(&cfg->port_resource[0], wssport[dev], 8);
 	if (wssdma[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], wssdma[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[0], wssdma[dev], 1);
 	if (wssirq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], wssirq[dev], 1);
+		pnp_resource_change(&cfg->irq_resource[0], wssirq[dev], 1);
 
-	if (pdev->activate(pdev)<0) {
-		snd_printk("(AD1848) PnP configure failure\n");
+	err = pnp_manual_config_dev(pdev, cfg, 0);
+	if (err < 0)
+		snd_printk(KERN_ERR "CMI8330/C3D (AD1848) PnP manual resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		snd_printk(KERN_ERR "CMI8330/C3D (AD1848) PnP configure failure\n");
+		kfree(cfg);
 		return -EBUSY;
 	}
-	wssport[dev] = pdev->resource[0].start;
-	wssdma[dev] = pdev->dma_resource[0].start;
-	wssirq[dev] = pdev->irq_resource[0].start;
+	wssport[dev] = pnp_port_start(pdev, 0);
+	wssdma[dev] = pnp_dma(pdev, 0);
+	wssirq[dev] = pnp_irq(pdev, 0);
 
 	/* allocate SB16 resources */
 	pdev = acard->play;
-	if (pdev->prepare(pdev)<0) {
-		acard->cap->deactivate(acard->cap);
-		return -EAGAIN;
-	}
+	pnp_init_resource_table(cfg);
 	if (sbport[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], sbport[dev], 16);
+		pnp_resource_change(&cfg->port_resource[0], sbport[dev], 16);
 	if (sbdma8[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], sbdma8[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[0], sbdma8[dev], 1);
 	if (sbdma16[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[1], sbdma16[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[1], sbdma16[dev], 1);
 	if (sbirq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], sbirq[dev], 1);
+		pnp_resource_change(&cfg->irq_resource[0], sbirq[dev], 1);
 
-	if (pdev->activate(pdev)<0) {
-		snd_printk("CMI8330/C3D (SB16) PnP configure failure\n");
-		acard->cap->deactivate(acard->cap);
+	err = pnp_manual_config_dev(pdev, cfg, 0);
+	if (err < 0)
+		snd_printk(KERN_ERR "CMI8330/C3D (SB16) PnP manual resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		snd_printk(KERN_ERR "CMI8330/C3D (SB16) PnP configure failure\n");
+		kfree(cfg);
 		return -EBUSY;
 	}
-	sbport[dev] = pdev->resource[0].start;
-	sbdma8[dev] = pdev->dma_resource[0].start;
-	sbdma16[dev] = pdev->dma_resource[1].start;
-	sbirq[dev] = pdev->irq_resource[0].start;
+	sbport[dev] = pnp_port_start(pdev, 0);
+	sbdma8[dev] = pnp_dma(pdev, 0);
+	sbdma16[dev] = pnp_dma(pdev, 1);
+	sbirq[dev] = pnp_irq(pdev, 0);
 
+	kfree(cfg);
 	return 0;
 }
-
-static void snd_cmi8330_deactivate(struct snd_cmi8330 *acard)
-{
-	if (acard->cap) {
-		acard->cap->deactivate(acard->cap);
-		acard->cap = NULL;
-	}
-	if (acard->play) {
-		acard->play->deactivate(acard->play);
-		acard->play = NULL;
-	}
-}
 #endif
 
 /*
@@ -424,7 +405,7 @@
 	snd_pcm_lib_preallocate_free_for_all(pcm);
 }
 
-static int __init snd_cmi8330_pcm(snd_card_t *card, struct snd_cmi8330 *chip)
+static int __devinit snd_cmi8330_pcm(snd_card_t *card, struct snd_cmi8330 *chip)
 {
 	snd_pcm_t *pcm;
 	const snd_pcm_ops_t *ops;
@@ -467,25 +448,16 @@
 /*
  */
 
-static void snd_cmi8330_free(snd_card_t *card)
-{
-	struct snd_cmi8330 *acard = (struct snd_cmi8330 *)card->private_data;
-
-	if (acard) {
-#ifdef __ISAPNP__
-		snd_cmi8330_deactivate(acard);
-#endif
-	}
-}
-
-static int __init snd_cmi8330_probe(int dev)
+static int __devinit snd_cmi8330_probe(int dev,
+				       struct pnp_card_link *pcard,
+				       const struct pnp_card_device_id *pid)
 {
 	snd_card_t *card;
 	struct snd_cmi8330 *acard;
 	unsigned long flags;
 	int i, err;
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (!isapnp[dev]) {
 #endif
 		if (wssport[dev] == SNDRV_AUTO_PORT) {
@@ -496,7 +468,7 @@
 			snd_printk("specify sbport\n");
 			return -EINVAL;
 		}
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	}
 #endif
 	card = snd_card_new(index[dev], id[dev], THIS_MODULE,
@@ -507,10 +479,9 @@
 	}
 	acard = (struct snd_cmi8330 *)card->private_data;
 	acard->card = card;
-	card->private_free = snd_cmi8330_free;
 
-#ifdef __ISAPNP__
-	if (isapnp[dev] && (err = snd_cmi8330_isapnp(dev, acard)) < 0) {
+#ifdef CONFIG_PNP
+	if (isapnp[dev] && (err = snd_cmi8330_pnp(dev, acard, pcard, pid)) < 0) {
 		snd_printk("PnP detection failed\n");
 		snd_card_free(card);
 		return err;
@@ -580,21 +551,16 @@
 		return err;
 	}
 
-	snd_cmi8330_cards[dev] = card;
+	if (pcard)
+		pnp_set_card_drvdata(pcard, card);
+	else
+		snd_cmi8330_legacy[dev] = card;
 	return 0;
 }
 
-static void __exit alsa_card_cmi8330_exit(void)
-{
-	int i;
-
-	for (i = 0; i < SNDRV_CARDS; i++)
-		snd_card_free(snd_cmi8330_cards[i]);
-}
-
-#ifdef __ISAPNP__
-static int __init snd_cmi8330_isapnp_detect(struct isapnp_card *card,
-                                            const struct isapnp_card_id *id)
+#ifdef CONFIG_PNP
+static int __devinit snd_cmi8330_pnp_detect(struct pnp_card_link *card,
+					    const struct pnp_card_device_id *id)
 {
 	static int dev;
 	int res;
@@ -602,9 +568,7 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev] || !isapnp[dev])
 			continue;
-		snd_cmi8330_isapnp_cards[dev] = card;
-		snd_cmi8330_isapnp_id[dev] = id;
-		res = snd_cmi8330_probe(dev);
+		res = snd_cmi8330_probe(dev, card, id);
 		if (res < 0)
 			return res;
 		dev++;
@@ -612,7 +576,23 @@
 	}
 	return -ENODEV;
 }
-#endif /* __ISAPNP__ */
+
+static void __devexit snd_cmi8330_pnp_remove(struct pnp_card_link * pcard)
+{
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
+}
+
+static struct pnp_card_driver cmi8330_pnpc_driver = {
+	.flags = PNP_DRIVER_RES_DISABLE,
+	.name = "cmi8330",
+	.id_table = snd_cmi8330_pnpids,
+	.probe = snd_cmi8330_pnp_detect,
+	.remove = __devexit_p(snd_cmi8330_pnp_remove),
+};
+#endif /* CONFIG_PNP */
 
 static int __init alsa_card_cmi8330_init(void)
 {
@@ -621,26 +601,38 @@
 	for (dev = 0; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev])
 			continue;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 		if (isapnp[dev])
 			continue;
 #endif
-		if (snd_cmi8330_probe(dev) >= 0)
+		if (snd_cmi8330_probe(dev, NULL, NULL) >= 0)
 			cards++;
 	}
-#ifdef __ISAPNP__
-	cards += isapnp_probe_cards(snd_cmi8330_pnpids, snd_cmi8330_isapnp_detect);
+#ifdef CONFIG_PNP
+	cards += pnp_register_card_driver(&cmi8330_pnpc_driver);
 #endif
 
 	if (!cards) {
 #ifdef MODULE
-		printk(KERN_ERR "CMI8330 not found or device busy\n");
+		snd_printk(KERN_ERR "CMI8330 not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
 	return 0;
 }
 
+static void __exit alsa_card_cmi8330_exit(void)
+{
+	int i;
+
+#ifdef CONFIG_PNP
+	/* PnP cards first */
+	pnp_unregister_card_driver(&cmi8330_pnpc_driver);
+#endif
+	for (i = 0; i < SNDRV_CARDS; i++)
+		snd_card_free(snd_cmi8330_legacy[i]);
+}
+
 module_init(alsa_card_cmi8330_init)
 module_exit(alsa_card_cmi8330_exit)
 
@@ -670,7 +662,7 @@
 	       get_option(&str,(int *)&wssport[nr_dev]) == 2 &&
 	       get_option(&str,&wssirq[nr_dev]) == 2 &&
 	       get_option(&str,&wssdma[nr_dev]) == 2);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (pnp != INT_MAX)
 		isapnp[nr_dev] = pnp;
 #endif
diff -Nru a/sound/isa/cs423x/cs4236.c b/sound/isa/cs423x/cs4236.c
--- a/sound/isa/cs423x/cs4236.c	Sat Apr 19 19:51:28 2003
+++ b/sound/isa/cs423x/cs4236.c	Sat Apr 19 19:51:28 2003
@@ -22,11 +22,7 @@
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/slab.h>
-#ifndef LINUX_ISAPNP_H
-#include <linux/isapnp.h>
-#define isapnp_card pci_bus
-#define isapnp_dev pci_dev
-#endif
+#include <linux/pnp.h>
 #include <sound/core.h>
 #include <sound/cs4231.h>
 #include <sound/mpu401.h>
@@ -87,7 +83,7 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
 #endif
 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* PnP setup */
@@ -109,7 +105,7 @@
 MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(enable, "Enable " IDENT " soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
@@ -144,19 +140,16 @@
 
 struct snd_card_cs4236 {
 	struct resource *res_sb_port;
-#ifdef __ISAPNP__
-	struct isapnp_dev *wss;
-	struct isapnp_dev *ctrl;
-	struct isapnp_dev *mpu;
+#ifdef CONFIG_PNP
+	struct pnp_dev *wss;
+	struct pnp_dev *ctrl;
+	struct pnp_dev *mpu;
 #endif
 };
 
-static snd_card_t *snd_cs4236_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-
-#ifdef __ISAPNP__
+static snd_card_t *snd_cs4236_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
-static struct isapnp_card *snd_cs4236_isapnp_cards[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
-static const struct isapnp_card_id *snd_cs4236_isapnp_id[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
+#ifdef CONFIG_PNP
 
 #define ISAPNP_CS4232(_va, _vb, _vc, _device, _wss, _ctrl, _mpu401) \
 	{ \
@@ -181,156 +174,162 @@
 
 
 #ifdef CS4232
-static struct isapnp_card_id snd_card_pnpids[] __devinitdata = {
+static struct pnp_card_device_id snd_cs423x_pnpids[] __devinitdata = {
 	/* Philips PCA70PS */
-	ISAPNP_CS4232_1('C','S','C',0x0d32,0x0000,0x0010,0xb006),
+	{ .id = "CSC0d32", .devs = { { "CSC0000" }, { "CSC0010" }, { "PNPb006" } } },
 	/* TerraTec Maestro 32/96 (CS4232) */
-	ISAPNP_CS4232('C','S','C',0x1a32,0x0000,0x0010,0x0003),
+	{ .id = "CSC1a32", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* HP Omnibook 5500 onboard */
-	ISAPNP_CS4232('C','S','C',0x4232,0x0000,0x0002,0x0003),
+	{ .id = "CSC4232", .devs = { { "CSC0000" }, { "CSC0002" }, { "CSC0003" } } },
 	/* Unnamed CS4236 card (Made in Taiwan) */
-	ISAPNP_CS4232('C','S','C',0x4236,0x0000,0x0010,0x0003),
+	{ .id = "CSC4236", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Turtle Beach TBS-2000 (CS4232) */
-	ISAPNP_CS4232('C','S','C',0x7532,0x0000,0x0010,0xb006),
+	{ .id = "CSC7532", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSCb006" } } },
 	/* Turtle Beach Tropez Plus (CS4232) */
-	ISAPNP_CS4232_1('C','S','C',0x7632,0x0000,0x0010,0xb006),
+	{ .id = "CSC7632", .devs = { { "CSC0000" }, { "CSC0010" }, { "PNPb006" } } },
 	/* SIC CrystalWave 32 (CS4232) */
-	ISAPNP_CS4232('C','S','C',0xf032,0x0000,0x0010,0x0003),
+	{ .id = "CSCf032", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* --- */
-	{ ISAPNP_CARD_END, }	/* end */
+	{ .id = "" }	/* end */
 };
 #else /* CS4236 */
-static struct isapnp_card_id snd_card_pnpids[] __devinitdata = {
+static struct pnp_card_device_id snd_cs423x_pnpids[] __devinitdata = {
 	/* Intel Marlin Spike Motherboard - CS4235 */
-	ISAPNP_CS4232('C','S','C',0x0225,0x0000,0x0010,0x0003),
+	{ .id = "CSC0225", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Intel Marlin Spike Motherboard (#2) - CS4235 */
-	ISAPNP_CS4232('C','S','C',0x0225,0x0100,0x0110,0x0103),
+	{ .id = "CSC0225", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC0103" } } },
 	/* Genius Sound Maker 3DJ - CS4237B */
-	ISAPNP_CS4232('C','S','C',0x0437,0x0000,0x0010,0x0003),
+	{ .id = "CSC0437", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Digital PC 5000 Onboard - CS4236B */
-	ISAPNP_CS4232_WOMPU('C','S','C',0x0735,0x0000,0x0010),
+	{ .id = "CSC0735", .devs = { { "CSC0000" }, { "CSC0010" } } },
 	/* some uknown CS4236B */
-	ISAPNP_CS4232('C','S','C',0x0b35,0x0000,0x0010,0x0003),
+	{ .id = "CSC0b35", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Intel PR440FX Onboard sound */
-	ISAPNP_CS4232('C','S','C',0x0b36,0x0000,0x0010,0x0003),
+	{ .id = "CSC0b36", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* CS4235 on mainboard without MPU */
-	ISAPNP_CS4232_WOMPU('C','S','C',0x1425,0x0100,0x0110),
+	{ .id = "CSC1425", .devs = { { "CSC0100" }, { "CSC0110" } } },
 	/* Gateway E1000 Onboard CS4236B */
-	ISAPNP_CS4232('C','S','C',0x1335,0x0000,0x0010,0x0003),
+	{ .id = "CSC1335", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* HP 6330 Onboard sound */
-	ISAPNP_CS4232('C','S','C',0x1525,0x0100,0x0110,0x0103),
+	{ .id = "CSC1525", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC0103" } } },
 	/* Crystal Computer TidalWave128 */
-	ISAPNP_CS4232('C','S','C',0x1e37,0x0000,0x0010,0x0003),
+	{ .id = "CSC1e37", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* ACER AW37 - CS4235 */
-	ISAPNP_CS4232('C','S','C',0x4236,0x0000,0x0010,0x0003),
+	{ .id = "CSC4236", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* build-in soundcard in EliteGroup P5TX-LA motherboard - CS4237B */
-	ISAPNP_CS4232('C','S','C',0x4237,0x0000,0x0010,0x0003),
+	{ .id = "CSC4237", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Crystal 3D - CS4237B */
-	ISAPNP_CS4232('C','S','C',0x4336,0x0000,0x0010,0x0003),
+	{ .id = "CSC4336", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Typhoon Soundsystem PnP - CS4236B */
-	ISAPNP_CS4232('C','S','C',0x4536,0x0000,0x0010,0x0003),
+	{ .id = "CSC4536", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Crystal CX4235-XQ3 EP - CS4235 */
-	ISAPNP_CS4232('C','S','C',0x4625,0x0100,0x0110,0x0103),
-	/* TerraTec AudioSystem EWS64XL - CS4236B */
-	ISAPNP_CS4232('C','S','C',0xa836,0xa800,0xa810,0xa803),
-	/* TerraTec AudioSystem EWS64XL - CS4236B */
-	ISAPNP_CS4232_WOMPU('C','S','C',0xa836,0xa800,0xa810),
+	{ .id = "CSC4625", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC0103" } } },
 	/* Crystal Semiconductors CS4237B */
-	ISAPNP_CS4232('C','S','C',0x4637,0x0000,0x0010,0x0003),
+	{ .id = "CSC4637", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* NewClear 3D - CX4237B-XQ3 */
-	ISAPNP_CS4232('C','S','C',0x4837,0x0000,0x0010,0x0003),
+	{ .id = "CSC4837", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Dell Optiplex GX1 - CS4236B */
-	ISAPNP_CS4232('C','S','C',0x6835,0x0000,0x0010,0x0003),
+	{ .id = "CSC6835", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Dell P410 motherboard - CS4236B */
-	ISAPNP_CS4232_WOMPU('C','S','C',0x6835,0x0000,0x0010),
+	{ .id = "CSC6835", .devs = { { "CSC0000" }, { "CSC0010" } } },
 	/* Dell Workstation 400 Onboard - CS4236B */
-	ISAPNP_CS4232('C','S','C',0x6836,0x0000,0x0010,0x0003),
+	{ .id = "CSC6836", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Turtle Beach Malibu - CS4237B */
-	ISAPNP_CS4232('C','S','C',0x7537,0x0000,0x0010,0x0003),
+	{ .id = "CSC7537", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* CS4235 - onboard */
-	ISAPNP_CS4232('C','S','C',0x8025,0x0100,0x0110,0x0103),
-	/* IBM PC 300PL Onboard - CS4236B */
-	ISAPNP_CS4232_WOMPU('C','S','C',0xe836,0x0000,0x0010),
+	{ .id = "CSC8025", .devs = { { "CSC0100" }, { "CSC0110" }, { "CSC0103" } } },
 	/* IBM Aptiva 2137 E24 Onboard - CS4237B */
-	ISAPNP_CS4232('C','S','C',0x8037,0x0000,0x0010,0x0003),
+	{ .id = "CSC8037", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* IBM IntelliStation M Pro motherboard */
-	ISAPNP_CS4232_WOMPU('C','S','C',0xc835,0x0000,0x0010),
+	{ .id = "CSCc835", .devs = { { "CSC0000" }, { "CSC0010" } } },
 	/* Guillemot MaxiSound 16 PnP - CS4236B */
-	ISAPNP_CS4232('C','S','C',0x9836,0x0000,0x0010,0x0003),
+	{ .id = "CSC9836", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* Gallant SC-70P */
-	ISAPNP_CS4232('C','S','C',0x9837,0x0000,0x0010,0x0003),
+	{ .id = "CSC9837", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
+	/* TerraTec AudioSystem EWS64XL - CS4236B */
+	{ .id = "CSCa836", .devs = { { "CSCa800" }, { "CSCa810" }, { "CSCa803" } } },
+	/* TerraTec AudioSystem EWS64XL - CS4236B */
+	{ .id = "CSCa836", .devs = { { "CSCa800" }, { "CSCa810" } } },
 	/* ACER AW37/Pro - CS4235 */
-	ISAPNP_CS4232('C','S','C',0xd925,0x0000,0x0010,0x0003),
+	{ .id = "CSCd925", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* ACER AW35/Pro - CS4237B */
-	ISAPNP_CS4232('C','S','C',0xd937,0x0000,0x0010,0x0003),
+	{ .id = "CSCd937", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* CS4235 without MPU401 */
-	ISAPNP_CS4232_WOMPU('C','S','C',0xe825,0x0100,0x0110),
+	{ .id = "CSCe825", .devs = { { "CSC0100" }, { "CSC0110" } } },
 	/* IBM IntelliStation M Pro 6898 11U - CS4236B */
-	ISAPNP_CS4232_WOMPU('C','S','C',0xe835,0x0000,0x0010),
+	{ .id = "CSCe835", .devs = { { "CSC0000" }, { "CSC0010" } } },
+	/* IBM PC 300PL Onboard - CS4236B */
+	{ .id = "CSCe836", .devs = { { "CSC0000" }, { "CSC0010" } } },
 	/* Some noname CS4236 based card */
-	ISAPNP_CS4232('C','S','C',0xe936,0x0000,0x0010,0x0003),
+	{ .id = "CSCe936", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* CS4236B */
-	ISAPNP_CS4232('C','S','C',0xf235,0x0000,0x0010,0x0003),
+	{ .id = "CSCf235", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* CS4236B */
-	ISAPNP_CS4232('C','S','C',0xf238,0x0000,0x0010,0x0003),
+	{ .id = "CSCf238", .devs = { { "CSC0000" }, { "CSC0010" }, { "CSC0003" } } },
 	/* --- */
-	{ ISAPNP_CARD_END, }	/* end */
+	{ .id = "" }	/* end */
 };
 #endif
 
-ISAPNP_CARD_TABLE(snd_card_pnpids);
+MODULE_DEVICE_TABLE(pnp_card, snd_cs423x_pnpids);
 
-static int __init snd_card_cs4236_isapnp(int dev, struct snd_card_cs4236 *acard)
+static int __devinit snd_card_cs4236_pnp(int dev, struct snd_card_cs4236 *acard,
+					 struct pnp_card_link *card,
+					 const struct pnp_card_device_id *id)
 {
-	const struct isapnp_card_id *id = snd_cs4236_isapnp_id[dev];
-	struct isapnp_card *card = snd_cs4236_isapnp_cards[dev];
-	struct isapnp_dev *pdev;
-	
-	acard->wss = isapnp_find_dev(card, id->devs[0].vendor, id->devs[0].function, NULL);
-	if (acard->wss->active) {
-		acard->wss = NULL;
+	struct pnp_dev *pdev;
+	struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL);
+	int err;
+
+	acard->wss = pnp_request_card_device(card, id->devs[0].id, NULL);
+	if (acard->wss == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
-	acard->ctrl = isapnp_find_dev(card, id->devs[1].vendor, id->devs[1].function, NULL);
-	if (acard->ctrl->active) {
-		acard->wss = acard->ctrl = NULL;
+	acard->ctrl = pnp_request_card_device(card, id->devs[1].id, NULL);
+	if (acard->ctrl == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
-	if (id->devs[2].vendor && id->devs[2].function) {
-		acard->mpu = isapnp_find_dev(card, id->devs[2].vendor, id->devs[2].function, NULL);
-		if (acard->mpu->active) {
-			acard->wss = acard->ctrl = acard->mpu = NULL;
+	if (id->devs[2].id[0]) {
+		acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
+		if (acard->mpu == NULL) {
+			kfree(cfg);
 			return -EBUSY;
 		}
 	}
 
 	/* WSS initialization */
 	pdev = acard->wss;
-	if (pdev->prepare(pdev) < 0)
-		return -EAGAIN;
+	pnp_init_resource_table(cfg);
 	if (port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], port[dev], 4);
+		pnp_resource_change(&cfg->port_resource[0], port[dev], 4);
 	if (fm_port[dev] != SNDRV_AUTO_PORT && fm_port[dev] >= 0)
-		isapnp_resource_change(&pdev->resource[1], fm_port[dev], 4);
+		pnp_resource_change(&cfg->port_resource[1], fm_port[dev], 4);
 	if (sb_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[2], sb_port[dev], 16);
+		pnp_resource_change(&cfg->port_resource[2], sb_port[dev], 16);
 	if (irq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], irq[dev], 1);
+		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
 	if (dma1[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], dma1[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[0], dma1[dev], 1);
 	if (dma2[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[1], dma2[dev] < 0 ? 4 : dma2[dev], 1);
-	if (pdev->activate(pdev)<0) {
-		printk(KERN_ERR IDENT " isapnp configure failed for WSS (out of resources?)\n");
+		pnp_resource_change(&cfg->dma_resource[1], dma2[dev] < 0 ? 4 : dma2[dev], 1);
+	err = pnp_manual_config_dev(pdev, cfg, 0);
+	if (err < 0)
+		snd_printk(KERN_ERR IDENT " WSS PnP manual resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		kfree(cfg);
+		printk(KERN_ERR IDENT " WSS PnP configure failed for WSS (out of resources?)\n");
 		return -EBUSY;
 	}
-	port[dev] = pdev->resource[0].start;
+	port[dev] = pnp_port_start(pdev, 0);
 	if (fm_port[dev] >= 0)
-		fm_port[dev] = pdev->resource[1].start;
-	sb_port[dev] = pdev->resource[2].start;
-	irq[dev] = pdev->irq_resource[0].start;
-	dma1[dev] = pdev->dma_resource[0].start;
-	dma2[dev] = pdev->dma_resource[1].start == 4 ? -1 : (int)pdev->dma_resource[1].start;
+		fm_port[dev] = pnp_port_start(pdev, 1);
+	sb_port[dev] = pnp_port_start(pdev, 2);
+	irq[dev] = pnp_irq(pdev, 0);
+	dma1[dev] = pnp_dma(pdev, 0);
+	dma2[dev] = pnp_dma(pdev, 1) == 4 ? -1 : (int)pnp_dma(pdev, 1);
 	snd_printdd("isapnp WSS: wss port=0x%lx, fm port=0x%lx, sb port=0x%lx\n",
 			port[dev], fm_port[dev], sb_port[dev]);
 	snd_printdd("isapnp WSS: irq=%i, dma1=%i, dma2=%i\n",
@@ -338,65 +337,51 @@
 	/* CTRL initialization */
 	if (acard->ctrl && cport[dev] >= 0) {
 		pdev = acard->ctrl;
-		if (pdev->prepare(pdev) < 0) {
-			acard->wss->deactivate(acard->wss);
-			return -EAGAIN;
-		}
+		pnp_init_resource_table(cfg);
 		if (cport[dev] != SNDRV_AUTO_PORT)
-			isapnp_resource_change(&pdev->resource[0], cport[dev], 8);
-		if (pdev->activate(pdev)<0) {
-			printk(KERN_ERR IDENT " isapnp configure failed for control (out of resources?)\n");
-			acard->wss->deactivate(acard->wss);
+			pnp_resource_change(&cfg->port_resource[0], cport[dev], 8);
+		err = pnp_manual_config_dev(pdev, cfg, 0);
+		if (err < 0)
+			snd_printk(KERN_ERR IDENT " CTRL PnP manual resources are invalid, using auto config\n");
+		err = pnp_activate_dev(pdev);
+		if (err < 0) {
+			kfree(cfg);
+			printk(KERN_ERR IDENT " CTRL PnP configure failed for WSS (out of resources?)\n");
 			return -EBUSY;
 		}
-		cport[dev] = pdev->resource[0].start;
+		cport[dev] = pnp_port_start(pdev, 0);
 		snd_printdd("isapnp CTRL: control port=0x%lx\n", cport[dev]);
 	}
 	/* MPU initialization */
 	if (acard->mpu && mpu_port[dev] >= 0) {
 		pdev = acard->mpu;
-		if (pdev->prepare(pdev) < 0) {
-			acard->wss->deactivate(acard->wss);
-			acard->ctrl->deactivate(acard->ctrl);
-			return -EAGAIN;
-		}
+		pnp_init_resource_table(cfg);
 		if (mpu_port[dev] != SNDRV_AUTO_PORT)
-			isapnp_resource_change(&pdev->resource[0], mpu_port[dev], 2);
+			pnp_resource_change(&cfg->port_resource[0], mpu_port[dev], 2);
 		if (mpu_irq[dev] != SNDRV_AUTO_IRQ && mpu_irq[dev] >= 0)
-			isapnp_resource_change(&pdev->irq_resource[0], mpu_irq[dev], 1);
-		if (pdev->activate(pdev)<0) {
+			pnp_resource_change(&cfg->irq_resource[0], mpu_irq[dev], 1);
+		err = pnp_manual_config_dev(pdev, cfg, 0);
+		if (err < 0)
+			snd_printk(KERN_ERR IDENT " MPU401 PnP manual resources are invalid, using auto config\n");
+		err = pnp_activate_dev(pdev);
+		if (err < 0) {
+			kfree(cfg);
+			printk(KERN_ERR IDENT " MPU401 PnP configure failed for WSS (out of resources?)\n");
 			mpu_port[dev] = SNDRV_AUTO_PORT;
 			mpu_irq[dev] = SNDRV_AUTO_IRQ;
-			printk(KERN_ERR IDENT " isapnp configure failed for MPU (out of resources?)\n");
 		} else {
-			mpu_port[dev] = pdev->resource[0].start;
-			if ((pdev->irq_resource[0].flags & IORESOURCE_IRQ) &&
-			    mpu_irq[dev] >= 0) {
-				mpu_irq[dev] = pdev->irq_resource[0].start;
+			mpu_port[dev] = pnp_port_start(pdev, 0);
+			if (pnp_irq_valid(pdev, 0) && pnp_irq(pdev, 0) >= 0) {
+				mpu_irq[dev] = pnp_irq(pdev, 0);
 			} else {
 				mpu_irq[dev] = -1;	/* disable interrupt */
 			}
 		}
 		snd_printdd("isapnp MPU: port=0x%lx, irq=%i\n", mpu_port[dev], mpu_irq[dev]);
 	}
+	kfree(cfg);
 	return 0;
 }
-
-static void snd_card_cs4236_deactivate(struct snd_card_cs4236 *acard)
-{
-	if (acard->wss) {
-		acard->wss->deactivate(acard->wss);
-		acard->wss = NULL;
-	}
-	if (acard->ctrl) {
-		acard->ctrl->deactivate(acard->ctrl);
-		acard->ctrl = NULL;
-	}
-	if (acard->mpu) {
-		acard->mpu->deactivate(acard->mpu);
-		acard->mpu = NULL;
-	}
-}
 #endif
 
 static void snd_card_cs4236_free(snd_card_t *card)
@@ -404,9 +389,6 @@
 	struct snd_card_cs4236 *acard = (struct snd_card_cs4236 *)card->private_data;
 
 	if (acard) {
-#ifdef __ISAPNP__
-		snd_card_cs4236_deactivate(acard);
-#endif
 		if (acard->res_sb_port) {
 			release_resource(acard->res_sb_port);
 			kfree_nocheck(acard->res_sb_port);
@@ -414,7 +396,8 @@
 	}
 }
 
-static int __init snd_card_cs4236_probe(int dev)
+static int __devinit snd_card_cs423x_probe(int dev, struct pnp_card_link *pcard,
+					   const struct pnp_card_device_id *pid)
 {
 	snd_card_t *card;
 	struct snd_card_cs4236 *acard;
@@ -423,7 +406,7 @@
 	opl3_t *opl3;
 	int err;
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (!isapnp[dev]) {
 #endif
 		if (port[dev] == SNDRV_AUTO_PORT) {
@@ -434,7 +417,7 @@
 			snd_printk("specify cport\n");
 			return -EINVAL;
 		}
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	}
 #endif
 	card = snd_card_new(index[dev], id[dev], THIS_MODULE,
@@ -443,8 +426,8 @@
 		return -ENOMEM;
 	acard = (struct snd_card_cs4236 *)card->private_data;
 	card->private_free = snd_card_cs4236_free;
-#ifdef __ISAPNP__
-	if (isapnp[dev] && (err = snd_card_cs4236_isapnp(dev, acard))<0) {
+#ifdef CONFIG_PNP
+	if (isapnp[dev] && (err = snd_card_cs4236_pnp(dev, acard, pcard, pid))<0) {
 		printk(KERN_ERR "isapnp detection failed and probing for " IDENT " is not supported\n");
 		snd_card_free(card);
 		return -ENXIO;
@@ -546,13 +529,16 @@
 		snd_card_free(card);
 		return err;
 	}
-	snd_cs4236_cards[dev] = card;
+	if (pcard)
+		pnp_set_card_drvdata(pcard, card);
+	else
+		snd_cs4236_legacy[dev] = card;
 	return 0;
 }
 
-#ifdef __ISAPNP__
-static int __init snd_cs4236_isapnp_detect(struct isapnp_card *card,
-                                           const struct isapnp_card_id *id)
+#ifdef CONFIG_PNP
+static int __devinit snd_cs423x_pnp_detect(struct pnp_card_link *card,
+					   const struct pnp_card_device_id *id)
 {
 	static int dev;
 	int res;
@@ -560,9 +546,7 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev])
 			continue;
-		snd_cs4236_isapnp_cards[dev] = card;
-		snd_cs4236_isapnp_id[dev] = id;
-		res = snd_card_cs4236_probe(dev);
+		res = snd_card_cs423x_probe(dev, card, id);
 		if (res < 0)
 			return res;
 		dev++;
@@ -570,7 +554,23 @@
 	}
 	return -ENODEV;
 }
-#endif /* __ISAPNP__ */
+
+static void __devexit snd_cs423x_pnp_remove(struct pnp_card_link * pcard)
+{
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+        
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
+}
+                        
+static struct pnp_card_driver cs423x_pnpc_driver = {
+	.flags = PNP_DRIVER_RES_DISABLE,
+	.name = "cs423x",
+	.id_table = snd_cs423x_pnpids,
+	.probe = snd_cs423x_pnp_detect,
+	.remove = __devexit_p(snd_cs423x_pnp_remove),
+};
+#endif /* CONFIG_PNP */
 
 static int __init alsa_card_cs423x_init(void)
 {
@@ -579,15 +579,15 @@
 	for (dev = 0; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev])
 			continue;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 		if (isapnp[dev])
 			continue;
 #endif
-		if (snd_card_cs4236_probe(dev) >= 0)
+		if (snd_card_cs423x_probe(dev, NULL, NULL) >= 0)
 			cards++;
 	}
-#ifdef __ISAPNP__
-	cards += isapnp_probe_cards(snd_card_pnpids, snd_cs4236_isapnp_detect);
+#ifdef CONFIG_PNP
+	cards += pnp_register_card_driver(&cs423x_pnpc_driver);
 #endif
 	if (!cards) {
 #ifdef MODULE
@@ -602,8 +602,12 @@
 {
 	int idx;
 
+#ifdef CONFIG_PNP
+	/* PnP cards first */
+	pnp_unregister_card_driver(&cs423x_pnpc_driver);
+#endif
 	for (idx = 0; idx < SNDRV_CARDS; idx++)
-		snd_card_free(snd_cs4236_cards[idx]);
+		snd_card_free(snd_cs4236_legacy[idx]);
 }
 
 module_init(alsa_card_cs423x_init)
@@ -638,7 +642,7 @@
 	       get_option(&str,&mpu_irq[nr_dev]) == 2 &&
 	       get_option(&str,&dma1[nr_dev]) == 2 &&
 	       get_option(&str,&dma2[nr_dev]) == 2);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (pnp != INT_MAX)
 		isapnp[nr_dev] = pnp;
 #endif
diff -Nru a/sound/isa/cs423x/pc98.c b/sound/isa/cs423x/pc98.c
--- a/sound/isa/cs423x/pc98.c	Sat Apr 19 19:51:46 2003
+++ b/sound/isa/cs423x/pc98.c	Sat Apr 19 19:51:46 2003
@@ -3,6 +3,7 @@
  *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>
  *                   Osamu Tomita <tomita@cinet.co.jp>
  *                   Takashi Iwai <tiwai@suse.de>
+ *                   Hideaki Okubo <okubo@msh.biglobe.ne.jp>
  *
  *
  *   This program is free software; you can redistribute it and/or modify
@@ -290,8 +291,13 @@
 		snd_printk(KERN_ERR IDENT ": Bad DMA %d\n", dma2[dev]);
 		return -EINVAL;
 	}
-	if (dma1[dev] != dma2[dev] && dma2[dev] >= 0)
+
+	outb(dma1[dev], 0x29);		/* dma1 boundary 64KB */
+	if (dma1[dev] != dma2[dev] && dma2[dev] >= 0) {
+		outb(0, 0x5f);		/* wait */
+		outb(dma2[dev], 0x29);	/* dma2 boundary 64KB */
 		intr_bits |= 0x04;
+	}
 
 	if (PC9800_SOUND_ID() == PC9800_SOUND_ID_118) {
 		/* Set up CanBe control registers. */
diff -Nru a/sound/isa/dt019x.c b/sound/isa/dt019x.c
--- a/sound/isa/dt019x.c	Sat Apr 19 19:51:46 2003
+++ b/sound/isa/dt019x.c	Sat Apr 19 19:51:46 2003
@@ -102,9 +102,9 @@
 #define DRIVER_NAME	"snd-card-dt019x"
 
 
-static int __init snd_card_dt019x_isapnp(int dev, struct snd_card_dt019x *acard,
-							   struct pnp_card_link *card,
-							   const struct pnp_card_device_id *pid)
+static int __devinit snd_card_dt019x_pnp(int dev, struct snd_card_dt019x *acard,
+					 struct pnp_card_link *card,
+					 const struct pnp_card_device_id *pid)
 {
 	struct pnp_dev *pdev;
 	struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL);
@@ -133,10 +133,10 @@
 		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
 
 	if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-		printk(KERN_ERR PFX "DT-019X AUDIO the requested resources are invalid, using auto config\n");
+		snd_printk(KERN_ERR PFX "DT-019X AUDIO the requested resources are invalid, using auto config\n");
 	err = pnp_activate_dev(pdev);
 	if (err < 0) {
-		printk(KERN_ERR PFX "DT-019X AUDIO pnp configure failure\n");
+		snd_printk(KERN_ERR PFX "DT-019X AUDIO pnp configure failure\n");
 		kfree(cfg);
 		return err;
 	}
@@ -155,11 +155,11 @@
 			pnp_resource_change(&cfg->port_resource[0], mpu_port[dev], 2);
 		if (mpu_irq[dev] != SNDRV_AUTO_IRQ)
 			pnp_resource_change(&cfg->irq_resource[0], mpu_irq[dev], 1);
-			if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-			printk(KERN_ERR PFX "DT-019X MPU401 the requested resources are invalid, using auto config\n");
-			err = pnp_activate_dev(pdev);
-			if (err < 0)
-				goto __mpu_error;
+		if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
+			snd_printk(KERN_ERR PFX "DT-019X MPU401 the requested resources are invalid, using auto config\n");
+		err = pnp_activate_dev(pdev);
+		if (err < 0)
+			goto __mpu_error;
 		mpu_port[dev] = pnp_port_start(pdev, 0);
 		mpu_irq[dev] = pnp_irq(pdev, 0);
 		snd_printdd("dt019x: found MPU-401: port=0x%lx, irq=0x%lx\n",
@@ -168,7 +168,7 @@
 		__mpu_error:
 		if (pdev) {
 			pnp_release_card_device(pdev);
-			printk(KERN_ERR PFX "DT-019X MPU401 pnp configure failure, skipping\n");
+			snd_printk(KERN_ERR PFX "DT-019X MPU401 pnp configure failure, skipping\n");
 		}
 		acard->devmpu = NULL;
 		mpu_port[dev] = -1;
@@ -180,7 +180,7 @@
 		if (fm_port[dev] != SNDRV_AUTO_PORT)
 			pnp_resource_change(&cfg->port_resource[0], fm_port[dev], 4);
 		if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-			printk(KERN_ERR PFX "DT-019X OPL3 the requested resources are invalid, using auto config\n");
+			snd_printk(KERN_ERR PFX "DT-019X OPL3 the requested resources are invalid, using auto config\n");
 		err = pnp_activate_dev(pdev);
 		if (err < 0)
 			goto __fm_error;
@@ -190,7 +190,7 @@
 		__fm_error:
 		if (pdev) {
 			pnp_release_card_device(pdev);
-			printk(KERN_ERR PFX "DT-019X OPL3 pnp configure failure, skipping\n");
+			snd_printk(KERN_ERR PFX "DT-019X OPL3 pnp configure failure, skipping\n");
 		}
 		acard->devopl = NULL;
 		fm_port[dev] = -1;
@@ -200,7 +200,7 @@
 	return 0;
 }
 
-static int __init snd_card_dt019x_probe(int dev, struct pnp_card_link *pcard, const struct pnp_card_device_id *pid)
+static int __devinit snd_card_dt019x_probe(int dev, struct pnp_card_link *pcard, const struct pnp_card_device_id *pid)
 {
 	int error;
 	sb_t *chip;
@@ -213,7 +213,7 @@
 		return -ENOMEM;
 	acard = (struct snd_card_dt019x *)card->private_data;
 
-	if ((error = snd_card_dt019x_isapnp(dev, acard, pcard, pid))) {
+	if ((error = snd_card_dt019x_pnp(dev, acard, pcard, pid))) {
 		snd_card_free(card);
 		return error;
 	}
@@ -246,8 +246,7 @@
 					mpu_irq[dev],
 					SA_INTERRUPT,
 					NULL) < 0)
-			printk(KERN_ERR PFX "no MPU-401 device at 0x%lx ?\n",
-				mpu_port[dev]);
+			snd_printk(KERN_ERR PFX "no MPU-401 device at 0x%lx ?\n", mpu_port[dev]);
 	}
 
 	if (fm_port[dev] > 0) {
@@ -255,8 +254,8 @@
 				    fm_port[dev],
 				    fm_port[dev] + 2,
 				    OPL3_HW_AUTO, 0, &opl3) < 0) {
-			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx ?\n",
-				fm_port[dev], fm_port[dev] + 2);
+			snd_printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx ?\n",
+				   fm_port[dev], fm_port[dev] + 2);
 		} else {
 			if ((error = snd_opl3_timer_new(opl3, 0, 1)) < 0) {
 				snd_card_free(card);
@@ -282,8 +281,8 @@
 	return 0;
 }
 
-static int __init snd_dt019x_pnp_probe(struct pnp_card_link *card,
-					    const struct pnp_card_device_id *pid)
+static int __devinit snd_dt019x_pnp_probe(struct pnp_card_link *card,
+					  const struct pnp_card_device_id *pid)
 {
 	static int dev;
 	int res;
@@ -323,7 +322,7 @@
 
 #ifdef MODULE
 	if (!cards)
-		printk(KERN_ERR "no DT-019X / ALS-007 based soundcards found\n");
+		snd_printk(KERN_ERR "no DT-019X / ALS-007 based soundcards found\n");
 #endif
 	return cards ? 0 : -ENODEV;
 }
diff -Nru a/sound/isa/es18xx.c b/sound/isa/es18xx.c
--- a/sound/isa/es18xx.c	Sat Apr 19 19:51:46 2003
+++ b/sound/isa/es18xx.c	Sat Apr 19 19:51:46 2003
@@ -70,11 +70,8 @@
 #include <linux/init.h>
 #include <linux/pm.h>
 #include <linux/slab.h>
-#ifndef LINUX_ISAPNP_H
+#include <linux/pnp.h>
 #include <linux/isapnp.h>
-#define isapnp_card pci_bus
-#define isapnp_dev pci_dev
-#endif
 #include <sound/core.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
@@ -1263,7 +1260,7 @@
 };
 
 #if 0
-static int __init snd_es18xx_config_read(es18xx_t *chip, unsigned char reg)
+static int __devinit snd_es18xx_config_read(es18xx_t *chip, unsigned char reg)
 {
 	int data;
 	unsigned long flags;
@@ -1275,8 +1272,8 @@
 }
 #endif
 
-static void __init snd_es18xx_config_write(es18xx_t *chip, 
-					   unsigned char reg, unsigned char data)
+static void __devinit snd_es18xx_config_write(es18xx_t *chip, 
+					      unsigned char reg, unsigned char data)
 {
 	/* No need for spinlocks, this function is used only in
 	   otherwise protected init code */
@@ -1287,7 +1284,7 @@
 #endif
 }
 
-static int __init snd_es18xx_initialize(es18xx_t *chip)
+static int __devinit snd_es18xx_initialize(es18xx_t *chip)
 {
 	int mask = 0;
 
@@ -1436,7 +1433,7 @@
         return 0;
 }
 
-static int __init snd_es18xx_identify(es18xx_t *chip)
+static int __devinit snd_es18xx_identify(es18xx_t *chip)
 {
 	int hi,lo;
 
@@ -1500,10 +1497,10 @@
 	return 0;
 }
 
-static int __init snd_es18xx_probe(es18xx_t *chip)
+static int __devinit snd_es18xx_probe(es18xx_t *chip)
 {
 	if (snd_es18xx_identify(chip) < 0) {
-		printk(KERN_ERR PFX "[0x%lx] ESS chip not found\n", chip->port);
+		snd_printk(KERN_ERR PFX "[0x%lx] ESS chip not found\n", chip->port);
                 return -ENODEV;
 	}
 
@@ -1569,7 +1566,7 @@
 	snd_pcm_lib_preallocate_free_for_all(pcm);
 }
 
-int __init snd_es18xx_pcm(es18xx_t *chip, int device, snd_pcm_t ** rpcm)
+int __devinit snd_es18xx_pcm(es18xx_t *chip, int device, snd_pcm_t ** rpcm)
 {
         snd_pcm_t *pcm;
 	char str[16];
@@ -1714,12 +1711,12 @@
 	return snd_es18xx_free(chip);
 }
 
-static int __init snd_es18xx_new_device(snd_card_t * card,
-					unsigned long port,
-					unsigned long mpu_port,
-					unsigned long fm_port,
-					int irq, int dma1, int dma2,
-					es18xx_t ** rchip)
+static int __devinit snd_es18xx_new_device(snd_card_t * card,
+					   unsigned long port,
+					   unsigned long mpu_port,
+					   unsigned long fm_port,
+					   int irq, int dma1, int dma2,
+					   es18xx_t ** rchip)
 {
         es18xx_t *chip;
 	static snd_device_ops_t ops = {
@@ -1746,27 +1743,27 @@
 
 	if ((chip->res_port = request_region(port, 16, "ES18xx")) == NULL) {
 		snd_es18xx_free(chip);
-		printk(KERN_ERR PFX "unable to grap ports 0x%lx-0x%lx\n", port, port + 16 - 1);
+		snd_printk(KERN_ERR PFX "unable to grap ports 0x%lx-0x%lx\n", port, port + 16 - 1);
 		return -EBUSY;
 	}
 
 	if (request_irq(irq, snd_es18xx_interrupt, SA_INTERRUPT, "ES18xx", (void *) chip)) {
 		snd_es18xx_free(chip);
-		printk(KERN_ERR PFX "unable to grap IRQ %d\n", irq);
+		snd_printk(KERN_ERR PFX "unable to grap IRQ %d\n", irq);
 		return -EBUSY;
 	}
 	chip->irq = irq;
 
 	if (request_dma(dma1, "ES18xx DMA 1")) {
 		snd_es18xx_free(chip);
-		printk(KERN_ERR PFX "unable to grap DMA1 %d\n", dma1);
+		snd_printk(KERN_ERR PFX "unable to grap DMA1 %d\n", dma1);
 		return -EBUSY;
 	}
 	chip->dma1 = dma1;
 
 	if (dma2 != dma1 && request_dma(dma2, "ES18xx DMA 2")) {
 		snd_es18xx_free(chip);
-		printk(KERN_ERR PFX "unable to grap DMA2 %d\n", dma2);
+		snd_printk(KERN_ERR PFX "unable to grap DMA2 %d\n", dma2);
 		return -EBUSY;
 	}
 	chip->dma2 = dma2;
@@ -1783,7 +1780,7 @@
         return 0;
 }
 
-static int __init snd_es18xx_mixer(es18xx_t *chip)
+static int __devinit snd_es18xx_mixer(es18xx_t *chip)
 {
 	snd_card_t *card;
 	int err;
@@ -1886,11 +1883,11 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
 #endif
 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* 0x220,0x240,0x260,0x280 */
-#ifndef __ISAPNP__
+#ifndef CONFIG_PNP_
 static long mpu_port[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
 #else
 static long mpu_port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;
@@ -1909,9 +1906,9 @@
 MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(enable, "Enable ES18xx soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
-MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
+MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
 MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
@@ -1934,138 +1931,115 @@
 MODULE_PARM_SYNTAX(dma2, SNDRV_ENABLED ",allows:{{0},{1},{3},{5}},dialog:list,prefers:{0}");
 
 struct snd_audiodrive {
-#ifdef __ISAPNP__
-	struct isapnp_dev *dev;
-	struct isapnp_dev *devc;
+#ifdef CONFIG_PNP
+	struct pnp_dev *dev;
+	struct pnp_dev *devc;
 #endif
 };
 
-static snd_card_t *snd_audiodrive_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-
-#ifdef __ISAPNP__
+static snd_card_t *snd_audiodrive_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
-static struct isapnp_card *snd_audiodrive_isapnp_cards[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
-static const struct isapnp_card_id *snd_audiodrive_isapnp_id[SNDRV_CARDS] __devinitdata = SNDRV_DEFAULT_PTR;
-
-#define ISAPNP_ES18XX(_va, _vb, _vc, _device, _audio, _control) \
-        { \
-                ISAPNP_CARD_ID(_va, _vb, _vc, _device), \
-                .devs = { ISAPNP_DEVICE_ID(_va, _vb, _vc, _audio), \
-                          ISAPNP_DEVICE_ID(_va, _vb, _vc, _control) } \
-        }
+#ifdef CONFIG_PNP
 
-static struct isapnp_card_id snd_audiodrive_pnpids[] __devinitdata = {
+static struct pnp_card_device_id snd_audiodrive_pnpids[] __devinitdata = {
 	/* ESS 1868 (integrated on Compaq dual P-Pro motherboard and Genius 18PnP 3D) */
-	ISAPNP_ES18XX('E','S','S',0x1868,0x1868,0x0000),
+	{ .id = "ESS1868", .devs = { { "ESS1868" }, { "ESS0000" } } },
 	/* ESS 1868 (integrated on Maxisound Cards) */
-	ISAPNP_ES18XX('E','S','S',0x1868,0x8601,0x8600),
+	{ .id = "ESS1868", .devs = { { "ESS8601" }, { "ESS8600" } } },
 	/* ESS 1868 (integrated on Maxisound Cards) */
-	ISAPNP_ES18XX('E','S','S',0x1868,0x8611,0x8610),
+	{ .id = "ESS1868", .devs = { { "ESS8611" }, { "ESS8610" } } },
 	/* ESS ES1869 Plug and Play AudioDrive */
-	ISAPNP_ES18XX('E','S','S',0x0003,0x1869,0x0006),
+	{ .id = "ESS0003", .devs = { { "ESS1869" }, { "ESS0006" } } },
 	/* ESS 1869 */
-	ISAPNP_ES18XX('E','S','S',0x1869,0x1869,0x0006),
+	{ .id = "ESS1869", .devs = { { "ESS1869" }, { "ESS0006" } } },
 	/* ESS 1878 */
-	ISAPNP_ES18XX('E','S','S',0x1878,0x1878,0x0004),
+	{ .id = "ESS1878", .devs = { { "ESS1878" }, { "ESS0004" } } },
 	/* ESS 1879 */
-	ISAPNP_ES18XX('E','S','S',0x1879,0x1879,0x0009),
+	{ .id = "ESS1879", .devs = { { "ESS1879" }, { "ESS0009" } } },
 	/* --- */
-	{ ISAPNP_CARD_END, } /* end */
+	{ .id = "" } /* end */
 };
 
-ISAPNP_CARD_TABLE(snd_audiodrive_pnpids);
+MODULE_DEVICE_TABLE(pnp_card, snd_audiodrive_pnpids);
 
-static int __init snd_audiodrive_isapnp(int dev, struct snd_audiodrive *acard)
+static int __devinit snd_audiodrive_pnp(int dev, struct snd_audiodrive *acard,
+					struct pnp_card_link *card,
+					const struct pnp_card_device_id *id)
 {
-	const struct isapnp_card_id *id = snd_audiodrive_isapnp_id[dev];
-	struct isapnp_card *card = snd_audiodrive_isapnp_cards[dev];
-	struct isapnp_dev *pdev;
+	struct pnp_dev *pdev;
+	struct pnp_resource_table * cfg = kmalloc(GFP_ATOMIC, sizeof(struct pnp_resource_table));
+	int err;
 
-	acard->dev = isapnp_find_dev(card, id->devs[0].vendor, id->devs[0].function, NULL);
-	if (acard->dev->active) {
-		acard->dev = NULL;
+	if (!cfg)
+		return -ENOMEM;
+	acard->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
+	if (acard->dev == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
-	acard->devc = isapnp_find_dev(card, id->devs[1].vendor, id->devs[1].function, NULL);
-	if (acard->devc->active) {
-		acard->dev = acard->devc = NULL;
+	acard->devc = pnp_request_card_device(card, id->devs[1].id, NULL);
+	if (acard->devc == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
 	/* Control port initialization */
-	if (acard->devc->prepare(acard->devc)<0)
-		return -EAGAIN;
-	if (acard->devc->activate(acard->devc)<0) {
-		printk(KERN_ERR PFX "isapnp control configure failure (out of resources?)\n");
+	err = pnp_activate_dev(acard->devc);
+	if (err < 0) {
+		snd_printk(KERN_ERR PFX "PnP control configure failure (out of resources?)\n");
 		return -EAGAIN;
 	}
-	snd_printdd("isapnp: port=0x%lx\n", acard->devc->resource[0].start);
+	snd_printdd("pnp: port=0x%lx\n", pnp_port_start(acard->devc, 0));
 	/* PnP initialization */
 	pdev = acard->dev;
-	if (pdev->prepare(pdev)<0) {
-		acard->devc->deactivate(acard->devc);
-		return -EAGAIN;
-	}
+	pnp_init_resource_table(cfg);
 	if (port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], port[dev], 16);
+		pnp_resource_change(&cfg->port_resource[0], port[dev], 16);
 	if (fm_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[1], fm_port[dev], 4);
+		pnp_resource_change(&cfg->port_resource[1], fm_port[dev], 4);
 	if (mpu_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[2], mpu_port[dev], 2);
+		pnp_resource_change(&cfg->port_resource[2], mpu_port[dev], 2);
 	if (dma1[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], dma1[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[0], dma1[dev], 1);
 	if (dma2[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[1], dma2[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[1], dma2[dev], 1);
 	if (irq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], irq[dev], 1);
-	if (pdev->activate(pdev)<0) {
-		printk(KERN_ERR PFX "isapnp configure failure (out of resources?)\n");
-		acard->devc->deactivate(acard->devc);
+		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
+	err = pnp_manual_config_dev(pdev, cfg, 0);
+	if (err < 0)
+		snd_printk(KERN_ERR PFX "PnP manual resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		snd_printk(KERN_ERR PFX "PnP configure failure (out of resources?)\n");
+		kfree(cfg);
 		return -EBUSY;
 	}
 	/* ok. hack using Vendor-Defined Card-Level registers */
 	/* skip csn and logdev initialization - already done in isapnp_configure */
-	isapnp_cfg_begin(pdev->bus->number, pdev->devfn);
-	isapnp_write_byte(0x27, pdev->irq_resource[0].start);	/* Hardware Volume IRQ Number */
-	if (mpu_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_write_byte(0x28, pdev->irq);		/* MPU-401 IRQ Number */
-	isapnp_write_byte(0x72, pdev->irq_resource[0].start);	/* second IRQ */
-	isapnp_cfg_end();
-	port[dev] = pdev->resource[0].start;
-	fm_port[dev] = pdev->resource[1].start;
-	mpu_port[dev] = pdev->resource[2].start;
-	dma1[dev] = pdev->dma_resource[0].start;
-	dma2[dev] = pdev->dma_resource[1].start;
-	irq[dev] = pdev->irq_resource[0].start;
-	snd_printdd("isapnp ES18xx: port=0x%lx, fm port=0x%lx, mpu port=0x%lx\n", port[dev], fm_port[dev], mpu_port[dev]);
-	snd_printdd("isapnp ES18xx: dma1=%i, dma2=%i, irq=%i\n", dma1[dev], dma2[dev], irq[dev]);
-	return 0;
-}
-
-static void snd_audiodrive_deactivate(struct snd_audiodrive *acard)
-{
-	if (acard->devc) {
-		acard->devc->deactivate(acard->devc);
-		acard->devc = NULL;
-	}
-	if (acard->dev) {
-		acard->dev->deactivate(acard->dev);
-		acard->dev = NULL;
-	}
-}
-#endif /* __ISAPNP__ */
-
-static void snd_audiodrive_free(snd_card_t *card)
-{
-	struct snd_audiodrive *acard = (struct snd_audiodrive *)card->private_data;
-
-	if (acard) {
-#ifdef __ISAPNP__
-		snd_audiodrive_deactivate(acard);
-#endif
+	if (pnp_device_is_isapnp(pdev)) {
+		isapnp_cfg_begin(isapnp_card_number(pdev), isapnp_csn_number(pdev));
+		isapnp_write_byte(0x27, pnp_irq(pdev, 0));	/* Hardware Volume IRQ Number */
+		if (mpu_port[dev] != SNDRV_AUTO_PORT)
+			isapnp_write_byte(0x28, pnp_irq(pdev, 0)); /* MPU-401 IRQ Number */
+		isapnp_write_byte(0x72, pnp_irq(pdev, 0));	/* second IRQ */
+		isapnp_cfg_end();
+	} else {
+		snd_printk(KERN_ERR PFX "unable to install ISA PnP hack, expect malfunction\n");
 	}
+	port[dev] = pnp_port_start(pdev, 0);
+	fm_port[dev] = pnp_port_start(pdev, 1);
+	mpu_port[dev] = pnp_port_start(pdev, 2);
+	dma1[dev] = pnp_dma(pdev, 0);
+	dma2[dev] = pnp_dma(pdev, 1);
+	irq[dev] = pnp_irq(pdev, 0);
+	snd_printdd("PnP ES18xx: port=0x%lx, fm port=0x%lx, mpu port=0x%lx\n", port[dev], fm_port[dev], mpu_port[dev]);
+	snd_printdd("PnP ES18xx: dma1=%i, dma2=%i, irq=%i\n", dma1[dev], dma2[dev], irq[dev]);
+	kfree(cfg);
+	return 0;
 }
+#endif /* CONFIG_PNP_ */
 
-static int __init snd_audiodrive_probe(int dev)
+static int __devinit snd_audiodrive_probe(int dev, struct pnp_card_link *pcard,
+					  const struct pnp_card_device_id *pid)
 {
 	static int possible_irqs[] = {5, 9, 10, 7, 11, 12, -1};
 	static int possible_dmas[] = {1, 0, 3, 5, -1};
@@ -2082,9 +2056,8 @@
 	if (card == NULL)
 		return -ENOMEM;
 	acard = (struct snd_audiodrive *)card->private_data;
-	card->private_free = snd_audiodrive_free;
-#ifdef __ISAPNP__
-	if (isapnp[dev] && (err = snd_audiodrive_isapnp(dev, acard)) < 0) {
+#ifdef CONFIG_PNP
+	if (isapnp[dev] && (err = snd_audiodrive_pnp(dev, acard, pcard, pid)) < 0) {
 		snd_card_free(card);
 		return err;
 	}
@@ -2135,7 +2108,7 @@
 
 	if (fm_port[dev] > 0 && fm_port[dev] != SNDRV_AUTO_PORT) {
 		if (snd_opl3_create(card, chip->fm_port, chip->fm_port + 2, OPL3_HW_OPL3, 0, &opl3) < 0) {
-			printk(KERN_ERR PFX "opl3 not detected at 0x%lx\n", chip->fm_port);
+			snd_printk(KERN_ERR PFX "opl3 not detected at 0x%lx\n", chip->fm_port);
 		} else {
 			if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
 				snd_card_free(card);
@@ -2181,11 +2154,14 @@
 		snd_card_free(card);
 		return err;
 	}
-	snd_audiodrive_cards[dev] = card;
+	if (pcard)
+		pnp_set_card_drvdata(pcard, card);
+	else
+		snd_audiodrive_legacy[dev] = card;
 	return 0;
 }
 
-static int __init snd_audiodrive_probe_legacy_port(unsigned long xport)
+static int __devinit snd_audiodrive_probe_legacy_port(unsigned long xport)
 {
 	static int dev;
 	int res;
@@ -2193,12 +2169,12 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT)
 			continue;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 		if (isapnp[dev])
 			continue;
 #endif
 		port[dev] = xport;
-		res = snd_audiodrive_probe(dev);
+		res = snd_audiodrive_probe(dev, NULL, NULL);
 		if (res < 0)
 			port[dev] = SNDRV_AUTO_PORT;
 		return res;
@@ -2207,9 +2183,9 @@
 }
 
 
-#ifdef __ISAPNP__
-static int __init snd_audiodrive_isapnp_detect(struct isapnp_card *card,
-					       const struct isapnp_card_id *id)
+#ifdef CONFIG_PNP
+static int __devinit snd_audiodrive_pnp_detect(struct pnp_card_link *card,
+					       const struct pnp_card_device_id *id)
 {
 	static int dev;
 	int res;
@@ -2217,9 +2193,7 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev] || !isapnp[dev])
 			continue;
-		snd_audiodrive_isapnp_cards[dev] = card;
-                snd_audiodrive_isapnp_id[dev] = id;
-                res = snd_audiodrive_probe(dev);
+                res = snd_audiodrive_probe(dev, card, id);
 		if (res < 0)
 			return res;
 		dev++;
@@ -2228,7 +2202,23 @@
 
         return -ENODEV;
 }
-#endif /* __ISAPNP__ */
+
+static void __devexit snd_audiodrive_pnp_remove(struct pnp_card_link * pcard)
+{
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
+}
+
+static struct pnp_card_driver es18xx_pnpc_driver = {
+	.flags = PNP_DRIVER_RES_DISABLE,
+	.name = "es18xx",
+	.id_table = snd_audiodrive_pnpids,
+	.probe = snd_audiodrive_pnp_detect,
+	.remove = __devexit_p(snd_audiodrive_pnp_remove),
+};
+#endif /* CONFIG_PNP */
 
 static int __init alsa_card_es18xx_init(void)
 {
@@ -2239,22 +2229,22 @@
 	for (dev = 0; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT)
 			continue;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 		if (isapnp[dev])
 			continue;
 #endif
-		if (snd_audiodrive_probe(dev) >= 0)
+		if (snd_audiodrive_probe(dev, NULL, NULL) >= 0)
 			cards++;
 	}
 	/* legacy auto configured cards */
 	cards += snd_legacy_auto_probe(possible_ports, snd_audiodrive_probe_legacy_port);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	/* ISA PnP cards at last */
-	cards += isapnp_probe_cards(snd_audiodrive_pnpids, snd_audiodrive_isapnp_detect);
+	cards += pnp_register_card_driver(&es18xx_pnpc_driver);
 #endif
 	if(!cards) {
 #ifdef MODULE
-		printk(KERN_ERR "ESS AudioDrive ES18xx soundcard not found or device busy\n");
+		snd_printk(KERN_ERR "ESS AudioDrive ES18xx soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
@@ -2265,13 +2255,18 @@
 {
 	int idx;
 
+#ifdef CONFIG_PNP
+	/* PnP cards first */
+	pnp_unregister_card_driver(&es18xx_pnpc_driver);
+#endif
 	for(idx = 0; idx < SNDRV_CARDS; idx++)
-		snd_card_free(snd_audiodrive_cards[idx]);
+		snd_card_free(snd_audiodrive_legacy[idx]);
 }
 
 module_init(alsa_card_es18xx_init)
 module_exit(alsa_card_es18xx_exit)
 
+
 #ifndef MODULE
 
 /* format is: snd-es18xx=enable,index,id,isapnp,
@@ -2295,7 +2290,7 @@
 	       get_option(&str,&irq[nr_dev]) == 2 &&
 	       get_option(&str,&dma1[nr_dev]) == 2 &&
 	       get_option(&str,&dma2[nr_dev]) == 2);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (pnp != INT_MAX)
 		isapnp[nr_dev] = pnp;
 #endif
diff -Nru a/sound/isa/gus/interwave.c b/sound/isa/gus/interwave.c
--- a/sound/isa/gus/interwave.c	Sat Apr 19 19:51:48 2003
+++ b/sound/isa/gus/interwave.c	Sat Apr 19 19:51:48 2003
@@ -27,11 +27,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/slab.h>
-#ifndef LINUX_ISAPNP_H
-#include <linux/isapnp.h>
-#define isapnp_card pci_bus
-#define isapnp_dev pci_dev
-#endif
+#include <linux/pnp.h>
 #include <sound/core.h>
 #include <sound/gus.h>
 #include <sound/cs4231.h>
@@ -62,7 +58,7 @@
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_ISAPNP; /* Enable this card */
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 static int isapnp[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
 #endif
 static long port[SNDRV_CARDS] = SNDRV_DEFAULT_PORT;	/* 0x210,0x220,0x230,0x240,0x250,0x260 */
@@ -130,56 +126,41 @@
 #endif
 	unsigned short gus_status_reg;
 	unsigned short pcm_status_reg;
-#ifdef __ISAPNP__
-	struct isapnp_dev *dev;
+#ifdef CONFIG_PNP
+	struct pnp_dev *dev;
 #ifdef SNDRV_STB
-	struct isapnp_dev *devtc;
+	struct pnp_dev *devtc;
 #endif
 #endif
 };
 
-static snd_card_t *snd_interwave_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-
-#ifdef __ISAPNP__
+static snd_card_t *snd_interwave_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
-static struct isapnp_card *snd_interwave_isapnp_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-static const struct isapnp_card_id *snd_interwave_isapnp_id[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
+#ifdef CONFIG_PNP
 
-#define ISAPNP_INTERWAVE(_va, _vb, _vc, _device, _audio) \
-	{ \
-		ISAPNP_CARD_ID(_va, _vb, _vc, _device), \
-		.devs = { ISAPNP_DEVICE_ID(_va, _vb, _vc, _audio), } \
-	}
-#define ISAPNP_INTERWAVE_STB(_va, _vb, _vc, _device, _audio, _tone) \
-	{ \
-		ISAPNP_CARD_ID(_va, _vb, _vc, _device), \
-		.devs = { ISAPNP_DEVICE_ID(_va, _vb, _vc, _audio), \
-			 ISAPNP_DEVICE_ID(_va, _vb, _vc, _tone), } \
-	}
-
-static struct isapnp_card_id snd_interwave_pnpids[] __devinitdata = {
+static struct pnp_card_device_id snd_interwave_pnpids[] __devinitdata = {
 #ifndef SNDRV_STB
 	/* Gravis UltraSound Plug & Play */
-	ISAPNP_INTERWAVE('G','R','V',0x0001,0x0000),
+	{ .id = "GRV0001", .devs = { { .id = "GRV0000" } } },
 	/* STB SoundRage32 */
-	ISAPNP_INTERWAVE('S','T','B',0x011a,0x0010),
+	{ .id = "STB011a", .devs = { { .id = "STB0010" } } },
 	/* MED3210 */
-	ISAPNP_INTERWAVE('D','X','P',0x3201,0x0010),
+	{ .id = "DXP3201", .devs = { { .id = "DXP0010" } } },
 	/* Dynasonic Pro */
 	/* This device also have CDC1117:DynaSonix Pro Audio Effects Processor */
-	ISAPNP_INTERWAVE('C','D','C',0x1111,0x1112),
+	{ .id = "CDC1111", .devs = { { .id = "CDC1112" } } },
 	/* Panasonic PCA761AW Audio Card */
-	ISAPNP_INTERWAVE('A','D','V',0x55ff,0x0010),
+	{ .id = "ADV55ff", .devs = { { .id = "ADV0010" } } },
 #else
 	/* InterWave STB with TEA6330T */
-	ISAPNP_INTERWAVE_STB('A','D','V',0x550a,0x0010,0x0015),
+	{ .id = "ADV550a", .devs = { { .id = "ADV0010" }, { .id = "ADV0015" } } },
 #endif
-	{ ISAPNP_CARD_END, }
+	{ .id = "" }
 };
 
-ISAPNP_CARD_TABLE(snd_interwave_pnpids);
+MODULE_DEVICE_TABLE(pnp_card, snd_interwave_pnpids);
 
-#endif /* __ISAPNP__ */
+#endif /* CONFIG_PNP */
 
 
 #ifdef SNDRV_STB
@@ -226,9 +207,9 @@
 	.getdata  = snd_interwave_i2c_getdataline,
 };
 
-static int __init snd_interwave_detect_stb(struct snd_interwave *iwcard,
-					   snd_gus_card_t * gus, int dev,
-					   snd_i2c_bus_t **rbus)
+static int __devinit snd_interwave_detect_stb(struct snd_interwave *iwcard,
+					      snd_gus_card_t * gus, int dev,
+					      snd_i2c_bus_t **rbus)
 {
 	unsigned long port;
 	snd_i2c_bus_t *bus;
@@ -266,13 +247,13 @@
 }
 #endif
 
-static int __init snd_interwave_detect(struct snd_interwave *iwcard,
-				       snd_gus_card_t * gus,
-				       int dev
+static int __devinit snd_interwave_detect(struct snd_interwave *iwcard,
+				          snd_gus_card_t * gus,
+				          int dev
 #ifdef SNDRV_STB
-				       , snd_i2c_bus_t **rbus
+				          , snd_i2c_bus_t **rbus
 #endif
-				       )
+				          )
 {
 	unsigned long flags;
 	unsigned char rev1, rev2;
@@ -349,7 +330,7 @@
 	} while (loop && --max > 0);
 }
 
-static void __init snd_interwave_reset(snd_gus_card_t * gus)
+static void __devinit snd_interwave_reset(snd_gus_card_t * gus)
 {
 	snd_gf1_write8(gus, SNDRV_GF1_GB_RESET, 0x00);
 	udelay(160);
@@ -357,7 +338,7 @@
 	udelay(160);
 }
 
-static void __init snd_interwave_bank_sizes(snd_gus_card_t * gus, int *sizes)
+static void __devinit snd_interwave_bank_sizes(snd_gus_card_t * gus, int *sizes)
 {
 	unsigned int idx;
 	unsigned int local;
@@ -406,7 +387,7 @@
 	/* 511 */ unsigned char csum;
 };
 
-static void __init snd_interwave_detect_memory(snd_gus_card_t * gus)
+static void __devinit snd_interwave_detect_memory(snd_gus_card_t * gus)
 {
 	static unsigned int lmc[13] =
 	{
@@ -509,7 +490,7 @@
 		snd_interwave_reset(gus);
 }
 
-static void __init snd_interwave_init(int dev, snd_gus_card_t * gus)
+static void __devinit snd_interwave_init(int dev, snd_gus_card_t * gus)
 {
 	unsigned long flags;
 
@@ -540,7 +521,7 @@
 CS4231_DOUBLE("Mic Playback Volume", 0, CS4231_LEFT_MIC_INPUT, CS4231_RIGHT_MIC_INPUT, 0, 0, 31, 1)
 };
 
-static int __init snd_interwave_mixer(cs4231_t *chip)
+static int __devinit snd_interwave_mixer(cs4231_t *chip)
 {
 	snd_card_t *card = chip->card;
 	snd_ctl_elem_id_t id1, id2;
@@ -588,98 +569,89 @@
 	return 0;
 }
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 
-static int __init snd_interwave_isapnp(int dev, struct snd_interwave *iwcard)
+static int __devinit snd_interwave_pnp(int dev, struct snd_interwave *iwcard,
+				       struct pnp_card_link *card,
+				       const struct pnp_card_device_id *id)
 {
-	const struct isapnp_card_id *id = snd_interwave_isapnp_id[dev];
-	struct isapnp_card *card = snd_interwave_isapnp_cards[dev];
-	struct isapnp_dev *pdev;
+	struct pnp_dev *pdev;
+	struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL);
+	int err;
 
-	iwcard->dev = isapnp_find_dev(card, id->devs[0].vendor, id->devs[0].function, NULL);
-	if (iwcard->dev->active) {
-		iwcard->dev = NULL;
+	iwcard->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
+	if (iwcard->dev == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
 #ifdef SNDRV_STB
-	iwcard->devtc = isapnp_find_dev(card, id->devs[1].vendor, id->devs[1].function, NULL);
-	if (iwcard->devtc->active) {
-		iwcard->dev = iwcard->devtc = NULL;
+	iwcard->devtc = pnp_request_card_device(card, id->devs[1].id, NULL);
+	if (iwcard->devtc == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
 #endif
 	/* Synth & Codec initialization */
 	pdev = iwcard->dev;
-	if (pdev->prepare(pdev)<0)
-		return -EAGAIN;
+	pnp_init_resource_table(cfg);
 	if (port[dev] != SNDRV_AUTO_PORT) {
-		isapnp_resource_change(&pdev->resource[0], port[dev], 16);
-		isapnp_resource_change(&pdev->resource[1], port[dev] + 0x100, 12);
-		isapnp_resource_change(&pdev->resource[2], port[dev] + 0x10c, 4);
+		pnp_resource_change(&cfg->port_resource[0], port[dev], 16);
+		pnp_resource_change(&cfg->port_resource[1], port[dev] + 0x100, 12);
+		pnp_resource_change(&cfg->port_resource[2], port[dev] + 0x10c, 4);
 	}
 	if (dma1[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], dma1[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[0], dma1[dev], 1);
 	if (dma2[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[1], dma2[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[1], dma2[dev], 1);
 	if (dma2[dev] < 0)
-		isapnp_resource_change(&pdev->dma_resource[1], 4, 1);
+		pnp_resource_change(&cfg->dma_resource[1], 4, 1);
 	if (irq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], irq[dev], 1);
-	if (pdev->activate(pdev)<0) {
-		snd_printk("isapnp configure failure (out of resources?)\n");
-		return -EBUSY;
+		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
+        if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR "InterWave - Synth - the requested resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		kfree(cfg);
+		snd_printk(KERN_ERR "InterWave PnP configure failure (out of resources?)\n");
+		return err;
 	}
-	if (pdev->resource[0].start + 0x100 != pdev->resource[1].start ||
-	    pdev->resource[0].start + 0x10c != pdev->resource[2].start) {
-		snd_printk("isapnp configure failure (wrong ports)\n");
-		pdev->deactivate(pdev);
+	if (pnp_port_start(pdev, 0) + 0x100 != pnp_port_start(pdev, 1) ||
+	    pnp_port_start(pdev, 0) + 0x10c != pnp_port_start(pdev, 2)) {
+		kfree(cfg);
+		snd_printk(KERN_ERR "PnP configure failure (wrong ports)\n");
 		return -ENOENT;
 	}
-	port[dev] = pdev->resource[0].start;
-	dma1[dev] = pdev->dma_resource[0].start;
+	port[dev] = pnp_port_start(pdev, 0);
+	dma1[dev] = pnp_dma(pdev, 1);
 	if (dma2[dev] >= 0)
-		dma2[dev] = pdev->dma_resource[1].start;
-	irq[dev] = pdev->irq_resource[0].start;
+		dma2[dev] = pnp_dma(pdev, 1);
+	irq[dev] = pnp_irq(pdev, 0);
 	snd_printdd("isapnp IW: sb port=0x%lx, gf1 port=0x%lx, codec port=0x%lx\n",
-				pdev->resource[0].start,
-				pdev->resource[1].start,
-				pdev->resource[2].start);
+				pnp_port_start(pdev, 0),
+				pnp_port_start(pdev, 1),
+				pnp_port_start(pdev, 2));
 	snd_printdd("isapnp IW: dma1=%i, dma2=%i, irq=%i\n", dma1[dev], dma2[dev], irq[dev]);
 #ifdef SNDRV_STB
 	/* Tone Control initialization */
 	pdev = iwcard->devtc;
-	if (pdev->prepare(pdev)<0) {
-		iwcard->dev->deactivate(iwcard->dev);
-		return -EAGAIN;
-	}
+	pnp_init_resource_table(cfg);
 	if (port_tc[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], port_tc[dev], 1);
-	if (pdev->activate(pdev)<0) {
-		snd_printk("Tone Control isapnp configure failure (out of resources?)\n");
-		iwcard->dev->deactivate(iwcard->dev);
-		return -EBUSY;
+		pnp_resource_change(&cfg->port_resource[0], port_tc[dev], 1);
+        if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR "InterWave - ToneControl - the requested resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		kfree(cfg);
+		snd_printk(KERN_ERR "InterWave ToneControl PnP configure failure (out of resources?)\n");
+		return err;
 	}
-	port_tc[dev] = pdev->resource[0].start;
+	port_tc[dev] = pnp_port_start(pdev, 0);
 	snd_printdd("isapnp IW: tone control port=0x%lx\n", port_tc[dev]);
 #endif
+	kfree(cfg);
 	return 0;
 }
-
-static void snd_interwave_deactivate(struct snd_interwave *iwcard)
-{
-	if (iwcard->dev) {
-		iwcard->dev->deactivate(iwcard->dev);
-		iwcard->dev = NULL;
-	}
-#ifdef SNDRV_STB
-	if (iwcard->devtc) {
-		iwcard->devtc->deactivate(iwcard->devtc);
-		iwcard->devtc = NULL;
-	}
-#endif
-}
-
-#endif /* __ISAPNP__ */
+#endif /* CONFIG_PNP */
 
 static void snd_interwave_free(snd_card_t *card)
 {
@@ -687,9 +659,6 @@
 
 	if (iwcard == NULL)
 		return;
-#ifdef __ISAPNP__
-	snd_interwave_deactivate(iwcard);
-#endif
 #ifdef SNDRV_STB
 	if (iwcard->i2c_res) {
 		release_resource(iwcard->i2c_res);
@@ -700,7 +669,8 @@
 		free_irq(iwcard->irq, (void *)iwcard);
 }
 
-static int __init snd_interwave_probe(int dev)
+static int __devinit snd_interwave_probe(int dev, struct pnp_card_link *pcard,
+				         const struct pnp_card_device_id *pid)
 {
 	static int possible_irqs[] = {5, 11, 12, 9, 7, 15, 3, -1};
 	static int possible_dmas[] = {0, 1, 3, 5, 6, 7, -1};
@@ -724,8 +694,8 @@
 	iwcard->card = card;
 	iwcard->irq = -1;
 	card->private_free = snd_interwave_free;
-#ifdef __ISAPNP__
-	if (isapnp[dev] && snd_interwave_isapnp(dev, iwcard)) {
+#ifdef CONFIG_PNP
+	if (isapnp[dev] && snd_interwave_pnp(dev, iwcard, pcard, pid)) {
 		snd_card_free(card);
 		return -ENODEV;
 	}
@@ -879,11 +849,14 @@
 	
 	iwcard->cs4231 = cs4231;
 	iwcard->gus = gus;
-	snd_interwave_cards[dev++] = card;
+	if (pcard)
+		pnp_set_card_drvdata(pcard, card);
+	else
+		snd_interwave_legacy[dev++] = card;
 	return 0;
 }
 
-static int __init snd_interwave_probe_legacy_port(unsigned long xport)
+static int __devinit snd_interwave_probe_legacy_port(unsigned long xport)
 {
 	static int dev;
 	int res;
@@ -891,12 +864,12 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev] || port[dev] != SNDRV_AUTO_PORT)
                         continue;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 		if (isapnp[dev])
 			continue;
 #endif
 		port[dev] = xport;
-		res = snd_interwave_probe(dev);
+		res = snd_interwave_probe(dev, NULL, NULL);
 		if (res < 0)
 			port[dev] = SNDRV_AUTO_PORT;
 		return res;
@@ -904,10 +877,10 @@
 	return -ENODEV;
 }
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 
-static int __init snd_interwave_isapnp_detect(struct isapnp_card *card,
-					      const struct isapnp_card_id *id)
+static int __devinit snd_interwave_pnp_detect(struct pnp_card_link *card,
+					   const struct pnp_card_device_id *id)
 {
 	static int dev;
 	int res;
@@ -915,9 +888,7 @@
 	for ( ; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev] || !isapnp[dev])
 			continue;
-		snd_interwave_isapnp_cards[dev] = card;
-		snd_interwave_isapnp_id[dev] = id;
-		res = snd_interwave_probe(dev);
+		res = snd_interwave_probe(dev, card, id);
 		if (res < 0)
 			return res;
 		dev++;
@@ -927,7 +898,23 @@
         return -ENODEV;
 }
 
-#endif /* __ISAPNP__ */
+static void __devexit snd_interwave_pnp_remove(struct pnp_card_link * pcard)
+{
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
+}
+
+static struct pnp_card_driver interwave_pnpc_driver = {
+	.flags = PNP_DRIVER_RES_DISABLE,
+	.name = "interwave",
+	.id_table = snd_interwave_pnpids,
+	.probe = snd_interwave_pnp_detect,
+	.remove = __devexit_p(snd_interwave_pnp_remove),
+};
+
+#endif /* CONFIG_PNP */
 
 static int __init alsa_card_interwave_init(void)
 {
@@ -938,11 +925,11 @@
 	for (dev = 0; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev] || port[dev] == SNDRV_AUTO_PORT)
 			continue;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 		if (isapnp[dev])
 			continue;
 #endif
-		if (!snd_interwave_probe(dev)) {
+		if (!snd_interwave_probe(dev, NULL, NULL)) {
 			cards++;
 			continue;
 		}
@@ -952,9 +939,9 @@
 	}
 	/* legacy auto configured cards */
 	cards += snd_legacy_auto_probe(possible_ports, snd_interwave_probe_legacy_port);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
         /* ISA PnP cards */
-        cards += isapnp_probe_cards(snd_interwave_pnpids, snd_interwave_isapnp_detect);
+        cards += pnp_register_card_driver(&interwave_pnpc_driver);
 #endif
 
 	if (!cards) {
@@ -970,8 +957,12 @@
 {
 	int dev;
 
+#ifdef CONFIG_PNP
+	/* PnP cards first */
+	pnp_unregister_card_driver(&interwave_pnpc_driver);
+#endif
 	for (dev = 0; dev < SNDRV_CARDS; dev++)
-		snd_card_free(snd_interwave_cards[dev]);
+		snd_card_free(snd_interwave_legacy[dev]);
 }
 
 module_init(alsa_card_interwave_init)
@@ -1007,7 +998,7 @@
 	       get_option(&str,&midi[nr_dev]) == 2 &&
 	       get_option(&str,&pcm_channels[nr_dev]) == 2 &&
 	       get_option(&str,&effect[nr_dev]) == 2);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (pnp != INT_MAX)
 		isapnp[nr_dev] = pnp;
 #endif
diff -Nru a/sound/isa/opl3sa2.c b/sound/isa/opl3sa2.c
--- a/sound/isa/opl3sa2.c	Sat Apr 19 19:51:50 2003
+++ b/sound/isa/opl3sa2.c	Sat Apr 19 19:51:50 2003
@@ -71,7 +71,7 @@
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
 MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
-MODULE_PARM_DESC(isapnp, "ISA PnP detection for specified soundcard.");
+MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
 MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
@@ -157,27 +157,24 @@
 #endif
 };
 
-static snd_card_t *snd_opl3sa2_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
+static snd_card_t *snd_opl3sa2_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
 #ifdef CONFIG_PNP
 
-static struct pnp_card *snd_opl3sa2_isapnp_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-static const struct pnp_card_id *snd_opl3sa2_isapnp_id[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-
-static struct pnp_card_id snd_opl3sa2_pnpids[] = {
+static struct pnp_card_device_id snd_opl3sa2_pnpids[] __devinitdata = {
 	/* Yamaha YMF719E-S (Genius Sound Maker 3DX) */
-	{.id = "YMH0020", .driver_data = 0, devs : { {.id="YMH0021"}, } },
+	{ .id = "YMH0020", .devs = { { "YMH0021" } } },
 	/* Yamaha OPL3-SA3 (integrated on Intel's Pentium II AL440LX motherboard) */
-	{.id = "YMH0030", .driver_data = 0, devs : { {.id="YMH0021"}, } },
+	{ .id = "YMH0030", .devs = { { "YMH0021" } } },
 	/* Yamaha OPL3-SA2 */
-	{.id = "YMH0800", .driver_data = 0, devs : { {.id="YMH0021"}, } },
+	{ .id = "YMH0800", .devs = { { "YMH0021" } } },
 	/* NeoMagic MagicWave 3DX */
-	{.id = "NMX2200", .driver_data = 0, devs : { {.id="NMX2210"}, } },
+	{ .id = "NMX2200", .devs = { { "YMH2210" } } },
 	/* --- */
-	{.id = "", } /* end */
+	{ .id = "" }	/* end */
 };
 
-/*PNP_CARD_TABLE(snd_opl3sa2_pnpids);*/
+MODULE_DEVICE_TABLE(pnp_card, snd_opl3sa2_pnpids);
 
 #endif /* CONFIG_PNP */
 
@@ -268,7 +265,7 @@
 		snd_printd("OPL3-SA [0x%lx] detect (1) = 0x%x (0x%x)\n", port, tmp, tmp1);
 		return -ENODEV;
 	}
-	/* try if the MIC register is accessible */
+	/* try if the MIC register is accesible */
 	tmp = snd_opl3sa2_read(chip, OPL3SA2_MIC);
 	snd_opl3sa2_write(chip, OPL3SA2_MIC, 0x8a);
 	if (((tmp1 = snd_opl3sa2_read(chip, OPL3SA2_MIC)) & 0x9f) != 0x8a) {
@@ -496,7 +493,8 @@
 	snd_card_t *card = chip->card;
 	snd_ctl_elem_id_t id1, id2;
 	snd_kcontrol_t *kctl;
-	int idx, err;
+	unsigned int idx;
+	int err;
 
 	memset(&id1, 0, sizeof(id1));
 	memset(&id2, 0, sizeof(id2));
@@ -542,9 +540,8 @@
 {
 	snd_card_t *card = chip->card;
 
-	snd_power_lock(card);
 	if (card->power_state == SNDRV_CTL_POWER_D3hot)
-		goto __skip;
+		return;
 
 	/* FIXME: is this order ok? */
 	chip->cs4231_suspend(chip->cs4231);
@@ -554,8 +551,6 @@
 	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D3);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
-      __skip:
-      	snd_power_unlock(card);
 }
 
 static void snd_opl3sa2_resume(opl3sa2_t *chip)
@@ -563,9 +558,8 @@
 	snd_card_t *card = chip->card;
 	int i;
 
-	snd_power_lock(card);
 	if (card->power_state == SNDRV_CTL_POWER_D0)
-		goto __skip;
+		return;
 
 	/* power up */
 	snd_opl3sa2_write(chip, OPL3SA2_PM_CTRL, OPL3SA2_PM_D0);
@@ -583,8 +577,6 @@
 	chip->cs4231_resume(chip->cs4231);
 
 	snd_power_change_state(card, SNDRV_CTL_POWER_D0);
-      __skip:
-      	snd_power_unlock(card);
 }
 
 /* callback for control API */
@@ -625,40 +617,66 @@
 #endif /* CONFIG_PM */
 
 #ifdef CONFIG_PNP
-static int __init snd_opl3sa2_isapnp(int dev, opl3sa2_t *chip)
+static int __init snd_opl3sa2_pnp(int dev, opl3sa2_t *chip,
+				  struct pnp_card_link *card,
+				  const struct pnp_card_device_id *id)
 {
-        const struct pnp_card_id *id = snd_opl3sa2_isapnp_id[dev];
-        struct pnp_card *card = snd_opl3sa2_isapnp_cards[dev];
 	struct pnp_dev *pdev;
+	struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL);
+	int err;
 
-	chip->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
-	pdev = chip->dev;
-	if (!pdev){
-		snd_printdd("isapnp OPL3-SA: a card was found but it did not contain the needed devices\n");
-		return -ENODEV;
+	if (!cfg)
+		return -ENOMEM;
+	pdev = chip->dev = pnp_request_card_device(card, id->devs[0].id, NULL);
+	if (chip->dev == NULL) {
+		kfree(cfg);
+		return -EBUSY;
 	}
-	sb_port[dev] = pdev->resource[0].start;
-	wss_port[dev] = pdev->resource[1].start;
-	fm_port[dev] = pdev->resource[2].start;
-	midi_port[dev] = pdev->resource[3].start;
-	port[dev] = pdev->resource[4].start;
-	dma1[dev] = pdev->dma_resource[0].start;
-	dma2[dev] = pdev->dma_resource[1].start;
-	irq[dev] = pdev->irq_resource[0].start;
-	snd_printdd("isapnp OPL3-SA: sb port=0x%lx, wss port=0x%lx, fm port=0x%lx, midi port=0x%lx\n",
+	/* PnP initialization */
+	pnp_init_resource_table(cfg);
+	if (sb_port[dev] != SNDRV_AUTO_PORT)
+		pnp_resource_change(&cfg->port_resource[0], sb_port[dev], 16);
+		pnp_resource_change(&cfg->port_resource[1], wss_port[dev], 8);
+	if (fm_port[dev] != SNDRV_AUTO_PORT)
+		pnp_resource_change(&cfg->port_resource[2], fm_port[dev], 4);
+	if (midi_port[dev] != SNDRV_AUTO_PORT)
+		pnp_resource_change(&cfg->port_resource[3], midi_port[dev], 2);
+	if (port[dev] != SNDRV_AUTO_PORT)
+		pnp_resource_change(&cfg->port_resource[4], port[dev], 2);
+	if (dma1[dev] != SNDRV_AUTO_DMA)
+		pnp_resource_change(&cfg->dma_resource[0], dma1[dev], 1);
+	if (dma2[dev] != SNDRV_AUTO_DMA)
+		pnp_resource_change(&cfg->dma_resource[1], dma2[dev], 1);
+	if (irq[dev] != SNDRV_AUTO_IRQ)
+		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
+	err = pnp_manual_config_dev(pdev, cfg, 0);
+	if (err < 0)
+		snd_printk(KERN_ERR "PnP manual resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		kfree(cfg);
+		snd_printk(KERN_ERR "PnP configure failure (out of resources?)\n");
+		return -EBUSY;
+	}
+	sb_port[dev] = pnp_port_start(pdev, 0);
+	wss_port[dev] = pnp_port_start(pdev, 1);
+	fm_port[dev] = pnp_port_start(pdev, 2);
+	midi_port[dev] = pnp_port_start(pdev, 3);
+	port[dev] = pnp_port_start(pdev, 4);
+	dma1[dev] = pnp_dma(pdev, 0);
+	dma2[dev] = pnp_dma(pdev, 1);
+	irq[dev] = pnp_irq(pdev, 0);
+	snd_printdd("PnP OPL3-SA: sb port=0x%lx, wss port=0x%lx, fm port=0x%lx, midi port=0x%lx\n",
 		sb_port[dev], wss_port[dev], fm_port[dev], midi_port[dev]);
-	snd_printdd("isapnp OPL3-SA: control port=0x%lx, dma1=%i, dma2=%i, irq=%i\n",
+	snd_printdd("PnP OPL3-SA: control port=0x%lx, dma1=%i, dma2=%i, irq=%i\n",
 		port[dev], dma1[dev], dma2[dev], irq[dev]);
+	kfree(cfg);
 	return 0;
 }
-
 #endif /* CONFIG_PNP */
 
 static int snd_opl3sa2_free(opl3sa2_t *chip)
 {
-#ifdef CONFIG_PNP
-	chip->dev = NULL;
-#endif
 #ifdef CONFIG_PM
 	if (chip->pm_dev)
 		pm_unregister(chip->pm_dev);
@@ -679,7 +697,9 @@
 	return snd_opl3sa2_free(chip);
 }
 
-static int __init snd_opl3sa2_probe(int dev)
+static int __devinit snd_opl3sa2_probe(int dev,
+				       struct pnp_card_link *pcard,
+				       const struct pnp_card_device_id *pid)
 {
 	int xirq, xdma1, xdma2;
 	snd_card_t *card;
@@ -727,7 +747,7 @@
 	if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0)
 		goto __error;
 #ifdef CONFIG_PNP
-	if (isapnp[dev] && (err = snd_opl3sa2_isapnp(dev, chip)) < 0)
+	if (isapnp[dev] && (err = snd_opl3sa2_pnp(dev, chip, pcard, pid)) < 0)
 		goto __error;
 #endif
 	chip->ymode = opl3sa3_ymode[dev] & 0x03 ; /* initialise this card from supplied (or default) parameter*/ 
@@ -806,7 +826,10 @@
 	if ((err = snd_card_register(card)) < 0)
 		goto __error;
 
-	snd_opl3sa2_cards[dev] = card;
+	if (pcard)
+		pnp_set_card_drvdata(pcard, card);
+	else
+		snd_opl3sa2_legacy[dev] = card;
 	return 0;
 
  __error:
@@ -815,18 +838,16 @@
 }
 
 #ifdef CONFIG_PNP
-static int __init snd_opl3sa2_isapnp_detect(struct pnp_card *card,
-					    const struct pnp_card_id *id)
+static int __devinit snd_opl3sa2_pnp_detect(struct pnp_card_link *card,
+					    const struct pnp_card_device_id *id)
 {
         static int dev;
         int res;
 
         for ( ; dev < SNDRV_CARDS; dev++) {
-                if (!enable[dev])
+                if (!enable[dev] && !isapnp[dev])
                         continue;
-                snd_opl3sa2_isapnp_cards[dev] = card;
-                snd_opl3sa2_isapnp_id[dev] = id;
-                res = snd_opl3sa2_probe(dev);
+                res = snd_opl3sa2_probe(dev, card, id);
                 if (res < 0)
                         return res;
                 dev++;
@@ -835,18 +856,21 @@
         return -ENODEV;
 }
 
-static void snd_opl3sa2_isapnp_remove(struct pnp_card * card)
+static void __devexit snd_opl3sa2_pnp_remove(struct pnp_card_link * pcard)
 {
-/* FIXME */
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+        
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
 }
 
-static struct pnpc_driver opl3sa2_pnpc_driver = {
-	.name		= "opl3sa2",
-	.id_table	= snd_opl3sa2_pnpids,
-	.probe		= snd_opl3sa2_isapnp_detect,
-	.remove		= snd_opl3sa2_isapnp_remove,
+static struct pnp_card_driver opl3sa2_pnpc_driver = {
+	.flags = PNP_DRIVER_RES_DISABLE,
+	.name = "opl3sa2",
+	.id_table = snd_opl3sa2_pnpids,
+	.probe = snd_opl3sa2_pnp_detect,
+	.remove = __devexit_p(snd_opl3sa2_pnp_remove),
 };
-
 #endif /* CONFIG_PNP */
 
 static int __init alsa_card_opl3sa2_init(void)
@@ -860,15 +884,15 @@
 		if (isapnp[dev])
 			continue;
 #endif
-		if (snd_opl3sa2_probe(dev) >= 0)
+		if (snd_opl3sa2_probe(dev, NULL, NULL) >= 0)
 			cards++;
 	}
 #ifdef CONFIG_PNP
-	cards += pnpc_register_driver(&opl3sa2_pnpc_driver);
+	cards += pnp_register_card_driver(&opl3sa2_pnpc_driver);
 #endif
 	if (!cards) {
 #ifdef MODULE
-		printk(KERN_ERR "Yamaha OPL3-SA soundcard not found or device busy\n");
+		snd_printk(KERN_ERR "Yamaha OPL3-SA soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
@@ -879,8 +903,12 @@
 {
 	int idx;
 
+#ifdef CONFIG_PNP
+	/* PnP cards first */
+	pnp_unregister_card_driver(&opl3sa2_pnpc_driver);
+#endif
 	for (idx = 0; idx < SNDRV_CARDS; idx++)
-		snd_card_free(snd_opl3sa2_cards[idx]);
+		snd_card_free(snd_opl3sa2_legacy[idx]);
 }
 
 module_init(alsa_card_opl3sa2_init)
diff -Nru a/sound/isa/opti9xx/opti92x-ad1848.c b/sound/isa/opti9xx/opti92x-ad1848.c
--- a/sound/isa/opti9xx/opti92x-ad1848.c	Sat Apr 19 19:51:28 2003
+++ b/sound/isa/opti9xx/opti92x-ad1848.c	Sat Apr 19 19:51:28 2003
@@ -29,11 +29,7 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/slab.h>
-#ifndef LINUX_ISAPNP_H
-#include <linux/isapnp.h>
-#define isapnp_card pci_bus
-#define isapnp_dev pci_dev
-#endif
+#include <linux/pnp.h>
 #include <sound/core.h>
 #ifdef CS4231
 #include <sound/cs4231.h>
@@ -47,6 +43,11 @@
 #endif	/* CS4231 */
 #include <sound/mpu401.h>
 #include <sound/opl3.h>
+#ifdef USE_OPL4
+#ifndef OPTi93X
+#include "opl4.h" /* <sound/opl4.h> */
+#endif
+#endif
 #define SNDRV_LEGACY_FIND_FREE_IRQ
 #define SNDRV_LEGACY_FIND_FREE_DMA
 #define SNDRV_GET_ID
@@ -267,23 +268,16 @@
 	long mpu_port;
 	int mpu_irq;
 
-#if defined(OPTi93X)
-	opti93x_t *opti93x;
-#elif defined(CS4231)
-	cs4231_t *cs4231;
-#else
-	ad1848_t *ad1848;
-#endif	/* AD1848 */
-	snd_rawmidi_t *rmidi;
-#ifdef __ISAPNP__
-	struct isapnp_dev *dev;
-	struct isapnp_dev *devmpu;
-#endif	/* __ISAPNP__ */
+#ifdef CONFIG_PNP
+	struct pnp_dev *dev;
+	struct pnp_dev *devmpu;
+#endif	/* CONFIG_PNP */
 };
 
-static snd_card_t *snd_opti9xx_card = SNDRV_DEFAULT_PTR1;
+static int snd_opti9xx_first_hit = 1;
+static snd_card_t *snd_opti9xx_legacy = SNDRV_DEFAULT_PTR1;
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 
 #define ISAPNP_OPTI9XX(_va, _vb, _vc, _device, _fa, _fb, _fc, _audio, _mpu401) \
 	{ \
@@ -292,22 +286,22 @@
 			ISAPNP_DEVICE_ID(_fa, _fb, _fc, _mpu401), } \
 	}
 
-static struct isapnp_card_id snd_card_opti9xx_pnpids[] = {
+static struct pnp_card_device_id snd_opti9xx_pnpids[] = {
 #ifndef OPTi93X
 	/* OPTi 82C924 */
-	ISAPNP_OPTI9XX('O','P','T',0x0924,'O','P','T',0x0000,0x0002),
+	{ .id = "OPT0924", .devs = { { "OPT0000" }, { "OPT0002" } }, .driver_data = 0x0924 },
 	/* OPTi 82C925 */
-	ISAPNP_OPTI9XX('O','P','T',0x0925,'O','P','T',0x9250,0x0002),
+	{ .id = "OPT0925", .devs = { { "OPT9250" }, { "OPT0002" } }, .driver_data = 0x0925 },
 #else
 	/* OPTi 82C931/3 */
-	ISAPNP_OPTI9XX('O','P','T',0x0931,'O','P','T',0x9310,0x0002),
+	{ .id = "OPT0931", .devs = { { "OPT9310" }, { "OPT0002" } }, .driver_data = 0x0931 },
 #endif	/* OPTi93X */
-	{ ISAPNP_CARD_END, }
+	{ .id = "" }
 };
 
-ISAPNP_CARD_TABLE(snd_card_opti9xx_pnpids);
+MODULE_DEVICE_TABLE(pnp_card, snd_opti9xx_pnpids);
 
-#endif	/* __ISAPNP__ */
+#endif	/* CONFIG_PNP */
 
 #ifdef OPTi93X
 #define DRIVER_NAME	"snd-card-opti93x"
@@ -326,14 +320,14 @@
 static long snd_legacy_find_free_ioport(long *port_table, long size)
 {
 	while (*port_table != -1) {
-		if (request_region(*port_table, size, "opti92x-ad1848"))
+		if (!check_region(*port_table, size))
 			return *port_table;
 		port_table++;
 	}
-	return SNDRV_AUTO_PORT;
+	return -1;
 }
 
-static int __init snd_opti9xx_init(opti9xx_t *chip, unsigned short hardware)
+static int __devinit snd_opti9xx_init(opti9xx_t *chip, unsigned short hardware)
 {
 	static int opti9xx_mc_size[] = {7, 7, 10, 10, 2, 2, 2};
 
@@ -478,7 +472,7 @@
 		(snd_opti9xx_read(chip, reg) & ~(mask)) | ((value) & (mask)))
 
 
-static int __init snd_opti9xx_configure(opti9xx_t *chip)
+static int __devinit snd_opti9xx_configure(opti9xx_t *chip)
 {
 	unsigned char wss_base_bits;
 	unsigned char irq_bits;
@@ -1669,7 +1663,7 @@
 
 #endif /* OPTi93X */
 
-static int __init snd_card_opti9xx_detect(snd_card_t *card, opti9xx_t *chip)
+static int __devinit snd_card_opti9xx_detect(snd_card_t *card, opti9xx_t *chip)
 {
 	int i, err;
 
@@ -1715,112 +1709,100 @@
 	return -ENODEV;
 }
 
-#ifdef __ISAPNP__
-static int __init snd_card_opti9xx_isapnp(opti9xx_t *chip)
+#ifdef CONFIG_PNP
+static int __devinit snd_card_opti9xx_pnp(opti9xx_t *chip, struct pnp_card_link *card,
+					  const struct pnp_card_device_id *pid)
 {
-	struct isapnp_dev *pdev = NULL;
-	const struct isapnp_card_id *pid = snd_card_opti9xx_pnpids-1;
-	static struct isapnp_card *card = NULL;
-
-      __again:
-	while (1) {
-		pid++;
-		if (pid->card_vendor == 0)
-			return -ENODEV;
-		if ((card = isapnp_find_card(pid->card_vendor, pid->card_device, card)))
-			break;
-	}
-	if (card == NULL)
-		return -ENODEV;
-
-	chip->dev = isapnp_find_dev(card, pid->devs[0].vendor, pid->devs[0].function, NULL);
-	if (chip->dev == NULL)
-		goto __again;
+	struct pnp_dev *pdev;
+	struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL);
+	int err;
 
-	chip->devmpu = isapnp_find_dev(card, pid->devs[1].vendor, pid->devs[1].function, NULL);
+	chip->dev = pnp_request_card_device(card, pid->devs[0].id, NULL);
+	if (chip->dev == NULL) {
+		kfree(cfg);
+		return -EBUSY;
+	}
+	chip->devmpu = pnp_request_card_device(card, pid->devs[1].id, NULL);
 
 	pdev = chip->dev;
-	if (pdev->prepare(pdev) < 0)
-		return -EAGAIN;
+	pnp_init_resource_table(cfg);
 
 #ifdef OPTi93X
 	if (port != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], port + 4, 4);
+		pnp_resource_change(&cfg->port_resource[0], port + 4, 4);
 #else
-	if ((pid->card_device != ISAPNP_DEVICE(0x0924)) && (port != SNDRV_AUTO_PORT))
-		isapnp_resource_change(&pdev->resource[1], port, 4);
+	if (pid->driver_data != 0x0924 && port != SNDRV_AUTO_PORT)
+		pnp_resource_change(&cfg->port_resource[1], port, 4);
 #endif	/* OPTi93X */
 	if (irq != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], irq, 1);
+		pnp_resource_change(&cfg->irq_resource[0], irq, 1);
 	if (dma1 != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], dma1, 1);
+		pnp_resource_change(&cfg->dma_resource[0], dma1, 1);
 #if defined(CS4231) || defined(OPTi93X)
 	if (dma2 != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[1], dma2, 1);
+		pnp_resource_change(&cfg->dma_resource[1], dma2, 1);
 #endif	/* CS4231 || OPTi93X */
 	if (fm_port != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[1], fm_port, 4);
+		pnp_resource_change(&cfg->port_resource[1], fm_port, 4);
 
-	if (pdev->activate(pdev) < 0) {
-		snd_printk("AUDIO isapnp configure failure\n");
-		return -EBUSY;
+	if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR "AUDIO the requested resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		snd_printk(KERN_ERR "AUDIO pnp configure failure\n");
+		kfree(cfg);
+		return err;
 	}
 
 #ifdef OPTi93X
-	port = pdev->resource[0].start - 4;
-	fm_port = pdev->resource[1].start;
+	port = pnp_port_start(pdev, 0) - 4;
+	fm_port = pnp_port_start(pdev, 1);
 #else
-	if (pid->card_device != ISAPNP_DEVICE(0x0924))
-		port = pdev->resource[1].start;
-	fm_port = pdev->resource[2].start;
+	if (pid->driver_data != 0x0924)
+		port = pnp_port_start(pdev, 1);
+	fm_port = pnp_port_start(pdev, 2);
 #endif	/* OPTi93X */
-	irq = pdev->irq_resource[0].start;
-	dma1 = pdev->dma_resource[0].start;
+	irq = pnp_irq(pdev, 0);
+	dma1 = pnp_dma(pdev, 0);
 #if defined(CS4231) || defined(OPTi93X)
-	dma2 = pdev->dma_resource[1].start;
+	dma2 = pnp_dma(pdev, 1);
 #endif	/* CS4231 || OPTi93X */
 
 	pdev = chip->devmpu;
-	if (pdev == NULL || pdev->prepare(pdev) < 0) {
-		mpu_port = -1;
-		chip->devmpu = NULL;
-		return pid->card_device;
-	}
-
-	if (mpu_port != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], mpu_port, 2);
-	if (mpu_irq != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], mpu_irq, 1);
+	if (pdev) {
+		pnp_init_resource_table(cfg);
 
-	if (pdev->activate(pdev) < 0) {
-		snd_printk("MPU-401 isapnp configure failure\n");
-		mpu_port = -1;
-		chip->devmpu = NULL;
-	} else {
-		mpu_port = pdev->resource[0].start;
-		mpu_irq = pdev->irq_resource[0].start;
+		if (mpu_port != SNDRV_AUTO_PORT)
+			pnp_resource_change(&cfg->port_resource[0], mpu_port, 2);
+		if (mpu_irq != SNDRV_AUTO_IRQ)
+			pnp_resource_change(&cfg->irq_resource[0], mpu_irq, 1);
+
+		if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+			snd_printk(KERN_ERR "AUDIO the requested resources are invalid, using auto config\n");
+		err = pnp_activate_dev(pdev);
+		if (err < 0) {
+			snd_printk(KERN_ERR "AUDIO pnp configure failure\n");
+			mpu_port = -1;
+			chip->devmpu = NULL;
+		} else {
+			mpu_port = pnp_port_start(pdev, 0);
+			mpu_irq = pnp_irq(pdev, 0);
+		}
 	}
-	return pid->card_device;
+	kfree(cfg);
+	return pid->driver_data;
 }
-
-static void snd_card_opti9xx_deactivate(opti9xx_t *chip)
-{
-	if (chip->dev)
-		chip->dev->deactivate(chip->dev);
-	if (chip->devmpu)
-		chip->devmpu->deactivate(chip->devmpu);
-}
-#endif	/* __ISAPNP__ */
+#endif	/* CONFIG_PNP */
 
 #if 0
-static int __init snd_card_opti9xx_resources(struct snd_card_opti9xx *chip,
-					     snd_card_t *card)
+static int __devinit snd_card_opti9xx_resources(struct snd_card_opti9xx *chip,
+						snd_card_t *card)
 {
 	int error, i, pnp = 0;
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	pnp = chip->dev != NULL;
-#endif	/* __ISAPNP__ */
+#endif	/* CONFIG_PNP */
 
 #ifndef OPTi93X
 	if (chip->chip->hardware == OPTi9XX_HW_82C928)
@@ -1914,13 +1896,6 @@
 	opti9xx_t *chip = (opti9xx_t *)card->private_data;
         
 	if (chip) {
-#ifdef __ISAPNP__
-		snd_card_opti9xx_deactivate(chip);
-#endif	/* __ISAPNP__ */
-		if (chip->wss_base != SNDRV_AUTO_PORT)
-			release_region(chip->wss_base, 4);
-		if (chip->mpu_port != SNDRV_AUTO_PORT)
-			release_region(chip->mpu_port, 2);
 		if (chip->res_mc_base) {
 			release_resource(chip->res_mc_base);
 			kfree_nocheck(chip->res_mc_base);
@@ -1928,7 +1903,8 @@
 	}
 }
 
-static int __init snd_card_opti9xx_probe(void)
+static int __devinit snd_card_opti9xx_probe(struct pnp_card_link *pcard,
+					    const struct pnp_card_device_id *pid)
 {
 	static long possible_ports[] = {0x530, 0xe80, 0xf40, 0x604, -1};
 	static long possible_mpu_ports[] = {0x300, 0x310, 0x320, 0x330, -1};
@@ -1956,36 +1932,28 @@
 	snd_pcm_t *pcm;
 	snd_rawmidi_t *rmidi;
 	snd_hwdep_t *synth;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	int hw;
-#endif	/* __ISAPNP__ */
+#endif	/* CONFIG_PNP */
 
+	if (pcard && !snd_opti9xx_first_hit)
+		return -EBUSY;
 	if (!(card = snd_card_new(index, id, THIS_MODULE,
 				  sizeof(opti9xx_t))))
 		return -ENOMEM;
 	card->private_free = snd_card_opti9xx_free;
 	chip = (opti9xx_t *)card->private_data;
 
-	chip->wss_base = port;
-	chip->fm_port = fm_port;
-	chip->mpu_port = mpu_port;
-	chip->irq = irq;
-	chip->mpu_irq = mpu_irq;
-	chip->dma1 = dma1;
-#if defined(CS4231) || defined(OPTi93X)
-	chip->dma2 = dma2;
-#endif
-
-#ifdef __ISAPNP__
-	if (isapnp && (hw = snd_card_opti9xx_isapnp(chip)) > 0) {
+#ifdef CONFIG_PNP
+	if (isapnp && (hw = snd_card_opti9xx_pnp(chip, pcard, pid)) > 0) {
 		switch (hw) {
-		case ISAPNP_DEVICE(0x0924):
+		case 0x0924:
 			hw = OPTi9XX_HW_82C924;
 			break;
-		case ISAPNP_DEVICE(0x0925):
+		case 0x0925:
 			hw = OPTi9XX_HW_82C925;
 			break;
-		case ISAPNP_DEVICE(0x0931):
+		case 0x0931:
 			hw = OPTi9XX_HW_82C931;
 			break;
 		default:
@@ -2000,32 +1968,42 @@
 		if (hw <= OPTi9XX_HW_82C930)
 			chip->mc_base -= 0x80;
 	} else {
-#endif	/* __ISAPNP__ */
+#endif	/* CONFIG_PNP */
 		if ((error = snd_card_opti9xx_detect(card, chip)) < 0) {
 			snd_card_free(card);
 			return error;
 		}
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	}
-#endif	/* __ISAPNP__ */
+#endif	/* CONFIG_PNP */
 
 	if ((chip->res_mc_base = request_region(chip->mc_base, chip->mc_base_size, "OPTi9xx MC")) == NULL) {
 		snd_card_free(card);
 		return -ENOMEM;
 	}
 
-#ifdef __ISAPNP__
+	chip->wss_base = port;
+	chip->fm_port = fm_port;
+	chip->mpu_port = mpu_port;
+	chip->irq = irq;
+	chip->mpu_irq = mpu_irq;
+	chip->dma1 = dma1;
+#if defined(CS4231) || defined(OPTi93X)
+	chip->dma2 = dma2;
+#endif
+
+#ifdef CONFIG_PNP
 	if (!isapnp) {
 #endif
 	if (chip->wss_base == SNDRV_AUTO_PORT) {
-		if ((chip->wss_base = snd_legacy_find_free_ioport(possible_ports, 4)) == SNDRV_AUTO_PORT) {
+		if ((chip->wss_base = snd_legacy_find_free_ioport(possible_ports, 4)) < 0) {
 			snd_card_free(card);
 			snd_printk("unable to find a free WSS port\n");
 			return -EBUSY;
 		}
 	}
 	if (chip->mpu_port == SNDRV_AUTO_PORT) {
-		if ((chip->mpu_port = snd_legacy_find_free_ioport(possible_mpu_ports, 2)) == SNDRV_AUTO_PORT) {
+		if ((chip->mpu_port = snd_legacy_find_free_ioport(possible_mpu_ports, 2)) < 0) {
 			snd_card_free(card);
 			snd_printk("unable to find a free MPU401 port\n");
 			return -EBUSY;
@@ -2062,7 +2040,7 @@
         }
 #endif
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	}
 #endif
 
@@ -2131,14 +2109,35 @@
 			snd_printk("no MPU-401 device at 0x%lx?\n", chip->mpu_port);
 
 	if (chip->fm_port > 0) {
-		opl3_t *opl3;
-		if (snd_opl3_create(card,
-				    chip->fm_port,
-				    chip->fm_port + 2,
-				    OPL3_HW_AUTO, 0, &opl3) < 0) {
+		opl3_t *opl3 = NULL;
+#ifdef USE_OPL4
+#ifndef OPTi93X
+		if (chip->hardware == OPTi9XX_HW_82C928 ||
+		    chip->hardware == OPTi9XX_HW_82C929 ||
+		    chip->hardware == OPTi9XX_HW_82C924) {
+			opl4_t *opl4;
+			/* assume we have an OPL4 */
+			snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(2),
+					       0x20, 0x20);
+			if (snd_opl4_create(card,
+					    chip->fm_port,
+					    chip->fm_port - 8,
+					    2, &opl3, &opl4) < 0) {
+				/* no luck, use OPL3 instead */
+				snd_opti9xx_write_mask(chip, OPTi9XX_MC_REG(2),
+						       0x00, 0x20);
+			}
+		}
+#endif	/* !OPTi93X */
+#endif
+		if (!opl3 && snd_opl3_create(card,
+					     chip->fm_port,
+					     chip->fm_port + 2,
+					     OPL3_HW_AUTO, 0, &opl3) < 0) {
 			snd_printk("no OPL device at 0x%lx-0x%lx\n",
-				chip->fm_port, chip->fm_port + 4 - 1);
-		} else {
+				   chip->fm_port, chip->fm_port + 4 - 1);
+		}
+		if (opl3) {
 			if ((error = snd_opl3_timer_new(opl3,
 #ifdef CS4231
 							1, 2)) < 0) {
@@ -2170,15 +2169,39 @@
 		snd_card_free(card);
 		return error;
 	}
-	snd_opti9xx_card = card;
+	snd_opti9xx_first_hit = 0;
+	if (pcard)
+		pnp_set_card_drvdata(pcard, card);
+	else
+		snd_opti9xx_legacy = card;
 	return 0;
 }
 
+#ifdef CONFIG_PNP
+static void __devexit snd_opti9xx_pnp_remove(struct pnp_card_link * pcard)
+{
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
+	snd_opti9xx_first_hit = 0;
+}
+
+static struct pnp_card_driver opti9xx_pnpc_driver = {
+	.flags		= PNP_DRIVER_RES_DISABLE,
+	.name		= "opti9xx",
+	.id_table	= snd_opti9xx_pnpids,
+	.probe		= snd_card_opti9xx_probe,
+	.remove		= __devexit_p(snd_opti9xx_pnp_remove),
+};
+#endif
+
 static int __init alsa_card_opti9xx_init(void)
 {
-	int error;
+	int cards, error;
 
-	if ((error = snd_card_opti9xx_probe())) {
+	cards = pnp_register_card_driver(&opti9xx_pnpc_driver);
+	if (cards == 0 && (error = snd_card_opti9xx_probe(NULL, NULL)) < 0) {
 #ifdef MODULE
 #ifdef OPTi93X
 		printk(KERN_ERR "no OPTi 82C93x soundcard found\n");
@@ -2193,8 +2216,11 @@
 
 static void __exit alsa_card_opti9xx_exit(void)
 {
-	if (snd_opti9xx_card)
-		snd_card_free(snd_opti9xx_card);
+#ifdef CONFIG_PNP
+	pnp_unregister_card_driver(&opti9xx_pnpc_driver);
+#endif
+	if (snd_opti9xx_legacy)
+		snd_card_free(snd_opti9xx_legacy);
 }
 
 module_init(alsa_card_opti9xx_init)
@@ -2227,7 +2253,7 @@
 	       get_option(&str,&dma2) == 2
 #endif
 	       );
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (pnp != INT_MAX)
 		isapnp = pnp;
 #endif
diff -Nru a/sound/isa/sb/es968.c b/sound/isa/sb/es968.c
--- a/sound/isa/sb/es968.c	Sat Apr 19 19:51:47 2003
+++ b/sound/isa/sb/es968.c	Sat Apr 19 19:51:47 2003
@@ -90,7 +90,7 @@
 	}
 }
 
-static int __devinit snd_card_es968_isapnp(int dev, struct snd_card_es968 *acard,
+static int __devinit snd_card_es968_pnp(int dev, struct snd_card_es968 *acard,
 					struct pnp_card_link *card,
 					const struct pnp_card_device_id *id)
 {
@@ -117,10 +117,10 @@
 	if (irq[dev] != SNDRV_AUTO_IRQ)
 		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
 	if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0)
-		printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
+		snd_printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n");
 	err = pnp_activate_dev(pdev);
 	if (err < 0) {
-		printk(KERN_ERR PFX "AUDIO pnp configure failure\n");
+		snd_printk(KERN_ERR PFX "AUDIO pnp configure failure\n");
 		return err;
 	}
 	port[dev] = pnp_port_start(pdev, 0);
@@ -144,7 +144,7 @@
 				 sizeof(struct snd_card_es968))) == NULL)
 		return -ENOMEM;
 	acard = (struct snd_card_es968 *)card->private_data;
-	if ((error = snd_card_es968_isapnp(dev, acard, pcard, pid))) {
+	if ((error = snd_card_es968_pnp(dev, acard, pcard, pid))) {
 		snd_card_free(card);
 		return error;
 	}
@@ -223,7 +223,12 @@
 
 static int __init alsa_card_es968_init(void)
 {
-	return (pnp_register_card_driver(&es968_pnpc_driver) ? 0 : -ENODEV);
+	int res = pnp_register_card_driver(&es968_pnpc_driver);
+#ifdef MODULE
+	if (res == 0)
+		snd_printk(KERN_ERR "no ES968 based soundcards found\n");
+#endif
+	return res < 0 ? res : 0;
 }
 
 static void __exit alsa_card_es968_exit(void)
diff -Nru a/sound/isa/sb/sb16.c b/sound/isa/sb/sb16.c
--- a/sound/isa/sb/sb16.c	Sat Apr 19 19:51:50 2003
+++ b/sound/isa/sb/sb16.c	Sat Apr 19 19:51:50 2003
@@ -103,9 +103,9 @@
 MODULE_PARM_DESC(enable, "Enable SoundBlaster 16 soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
 #ifdef CONFIG_PNP
-MODULE_PARM(pnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
-MODULE_PARM_DESC(pnp, "PnP detection for specified soundcard.");
-MODULE_PARM_SYNTAX(pnp, SNDRV_ISAPNP_DESC);
+MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
+MODULE_PARM_DESC(isapnp, "PnP detection for specified soundcard.");
+MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
 #endif
 MODULE_PARM(port, "1-" __MODULE_STRING(SNDRV_CARDS) "l");
 MODULE_PARM_DESC(port, "Port # for SB16 driver.");
@@ -261,7 +261,7 @@
 				       const struct pnp_card_device_id *id)
 {
 	struct pnp_dev *pdev;
-	struct pnp_resource_table * cfg = kmalloc(GFP_ATOMIC, sizeof(struct pnp_resource_table));
+	struct pnp_resource_table * cfg = kmalloc(sizeof(struct pnp_resource_table), GFP_KERNEL);
 	int err;
 
 	if (!cfg) 
@@ -293,11 +293,11 @@
 		pnp_resource_change(&cfg->dma_resource[1], dma16[dev], 1);
 	if (irq[dev] != SNDRV_AUTO_IRQ)
 		pnp_resource_change(&cfg->irq_resource[0], irq[dev], 1);
-	if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0) 
-		printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n"); 
+	if (pnp_manual_config_dev(pdev, cfg, 0) < 0) 
+		snd_printk(KERN_ERR PFX "AUDIO the requested resources are invalid, using auto config\n"); 
 	err = pnp_activate_dev(pdev); 
 	if (err < 0) { 
-		printk(KERN_ERR PFX "AUDIO pnp configure failure\n"); 
+		snd_printk(KERN_ERR PFX "AUDIO pnp configure failure\n"); 
 		kfree(cfg);
 		return err; 
 	} 
@@ -325,18 +325,18 @@
 			pnp_resource_change(&cfg->port_resource[2], awe_port[dev] + 0x800, 4);
 		}
 		if ((pnp_manual_config_dev(pdev, cfg, 0)) < 0) 
-			printk(KERN_ERR PFX "WaveTable the requested resources are invalid, using auto config\n"); 
+			snd_printk(KERN_ERR PFX "WaveTable the requested resources are invalid, using auto config\n"); 
 		err = pnp_activate_dev(pdev); 
 		if (err < 0) { 
 			goto __wt_error; 
 		} 
 		awe_port[dev] = pnp_port_start(pdev, 0);
-		snd_printdd("pnp SB16: wavetable port=0x%lx\n", pdev->resource[0].start);
+		snd_printdd("pnp SB16: wavetable port=0x%lx\n", pnp_port_start(pdev, 0));
 	} else {
 __wt_error:
 		if (pdev) {
 			pnp_release_card_device(pdev);
-			printk(KERN_ERR PFX "WaveTable pnp configure failure\n");
+			snd_printk(KERN_ERR PFX "WaveTable pnp configure failure\n");
 		}
 		acard->devwt = NULL;
 		awe_port[dev] = -1;
@@ -386,21 +386,21 @@
 	if (xirq == SNDRV_AUTO_IRQ) {
 		if ((xirq = snd_legacy_find_free_irq(possible_irqs)) < 0) {
 			snd_card_free(card);
-			printk(KERN_ERR PFX "unable to find a free IRQ\n");
+			snd_printk(KERN_ERR PFX "unable to find a free IRQ\n");
 			return -EBUSY;
 		}
 	}
 	if (xdma8 == SNDRV_AUTO_DMA) {
 		if ((xdma8 = snd_legacy_find_free_dma(possible_dmas8)) < 0) {
 			snd_card_free(card);
-			printk(KERN_ERR PFX "unable to find a free 8-bit DMA\n");
+			snd_printk(KERN_ERR PFX "unable to find a free 8-bit DMA\n");
 			return -EBUSY;
 		}
 	}
 	if (xdma16 == SNDRV_AUTO_DMA) {
 		if ((xdma16 = snd_legacy_find_free_dma(possible_dmas16)) < 0) {
 			snd_card_free(card);
-			printk(KERN_ERR PFX "unable to find a free 16-bit DMA\n");
+			snd_printk(KERN_ERR PFX "unable to find a free 16-bit DMA\n");
 			return -EBUSY;
 		}
 	}
@@ -460,7 +460,7 @@
 		if (snd_opl3_create(card, fm_port[dev], fm_port[dev] + 2,
 				    OPL3_HW_OPL3, fm_port[dev] == port[dev],
 				    &opl3) < 0) {
-			printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
+			snd_printk(KERN_ERR PFX "no OPL device at 0x%lx-0x%lx\n",
 				   fm_port[dev], fm_port[dev] + 2);
 		} else {
 #ifdef SNDRV_SBAWE_EMU8000
@@ -488,7 +488,7 @@
 			chip->csp = xcsp->private_data;
 			chip->hardware = SB_HW_16CSP;
 		} else {
-			printk(KERN_INFO PFX "warning - CSP chip not detected on soundcard #%i\n", dev + 1);
+			snd_printk(KERN_INFO PFX "warning - CSP chip not detected on soundcard #%i\n", dev + 1);
 		}
 	}
 #endif
@@ -496,7 +496,7 @@
 	if (awe_port[dev] > 0) {
 		if (snd_emu8000_new(card, 1, awe_port[dev],
 				    seq_ports[dev], NULL) < 0) {
-			printk(KERN_ERR PFX "fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", awe_port[dev]);
+			snd_printk(KERN_ERR PFX "fatal error - EMU-8000 synthesizer not detected at 0x%lx\n", awe_port[dev]);
 			snd_card_free(card);
 			return -ENXIO;
 		}
@@ -578,8 +578,6 @@
 	return -ENODEV;
 }
 
-#endif
-
 static void __devexit snd_sb16_pnp_remove(struct pnp_card_link * pcard)
 {
 	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
@@ -596,6 +594,8 @@
 	.remove = __devexit_p(snd_sb16_pnp_remove),
 };
 
+#endif /* CONFIG_PNP */
+
 static int __init alsa_card_sb16_init(void)
 {
 	int dev, cards = 0;
@@ -614,7 +614,7 @@
 			continue;
 		}
 #ifdef MODULE
-		printk(KERN_ERR "Sound Blaster 16+ soundcard #%i not found at 0x%lx or device busy\n", dev, port[dev]);
+		snd_printk(KERN_ERR "Sound Blaster 16+ soundcard #%i not found at 0x%lx or device busy\n", dev, port[dev]);
 #endif
 	}
 	/* legacy auto configured cards */
@@ -626,11 +626,11 @@
 
 	if (!cards) {
 #ifdef MODULE
-		printk(KERN_ERR "Sound Blaster 16 soundcard not found or device busy\n");
+		snd_printk(KERN_ERR "Sound Blaster 16 soundcard not found or device busy\n");
 #ifdef SNDRV_SBAWE_EMU8000
-		printk(KERN_ERR "In case, if you have non-AWE card, try snd-sb16 module\n");
+		snd_printk(KERN_ERR "In case, if you have non-AWE card, try snd-sb16 module\n");
 #else
-		printk(KERN_ERR "In case, if you have AWE card, try snd-sbawe module\n");
+		snd_printk(KERN_ERR "In case, if you have AWE card, try snd-sbawe module\n");
 #endif
 #endif
 		return -ENODEV;
@@ -655,7 +655,7 @@
 
 #ifndef MODULE
 
-/* format is: snd-sb16=enable,index,id,pnp,
+/* format is: snd-sb16=enable,index,id,isapnp,
 		       port,mpu_port,fm_port,
 		       irq,dma8,dma16,
 		       mic_agc,csp,
diff -Nru a/sound/isa/sb/sb8.c b/sound/isa/sb/sb8.c
--- a/sound/isa/sb/sb8.c	Sat Apr 19 19:51:49 2003
+++ b/sound/isa/sb/sb8.c	Sat Apr 19 19:51:49 2003
@@ -143,13 +143,13 @@
 		if ((err = snd_opl3_create(card, chip->port + 8, 0,
 					   OPL3_HW_AUTO, 1,
 					   &opl3)) < 0) {
-			printk(KERN_ERR "sb8: no OPL device at 0x%lx\n", chip->port + 8);
+			snd_printk(KERN_ERR "sb8: no OPL device at 0x%lx\n", chip->port + 8);
 		}
 	} else {
 		if ((err = snd_opl3_create(card, chip->port, chip->port + 2,
 					   OPL3_HW_AUTO, 1,
 					   &opl3)) < 0) {
-			printk(KERN_ERR "sb8: no OPL device at 0x%lx-0x%lx\n",
+			snd_printk(KERN_ERR "sb8: no OPL device at 0x%lx-0x%lx\n",
 				   chip->port, chip->port + 2);
 		}
 	}
@@ -210,7 +210,7 @@
 	cards += snd_legacy_auto_probe(possible_ports, snd_card_sb8_legacy_auto_probe);
 	if (!cards) {
 #ifdef MODULE
-		printk(KERN_ERR "Sound Blaster soundcard not found or device busy\n");
+		snd_printk(KERN_ERR "Sound Blaster soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff -Nru a/sound/isa/sgalaxy.c b/sound/isa/sgalaxy.c
--- a/sound/isa/sgalaxy.c	Sat Apr 19 19:51:51 2003
+++ b/sound/isa/sgalaxy.c	Sat Apr 19 19:51:51 2003
@@ -306,7 +306,7 @@
 	}
 	if (!cards) {
 #ifdef MODULE
-		printk(KERN_ERR "Sound Galaxy soundcard not found or device busy\n");
+		snd_printk(KERN_ERR "Sound Galaxy soundcard not found or device busy\n");
 #endif
 		return -ENODEV;
 	}
diff -Nru a/sound/isa/wavefront/wavefront.c b/sound/isa/wavefront/wavefront.c
--- a/sound/isa/wavefront/wavefront.c	Sat Apr 19 19:51:49 2003
+++ b/sound/isa/wavefront/wavefront.c	Sat Apr 19 19:51:49 2003
@@ -23,11 +23,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/slab.h>
-#ifndef LINUX_ISAPNP_H
-#include <linux/isapnp.h>
-#define isapnp_card pci_bus
-#define isapnp_dev pci_dev
-#endif
+#include <linux/pnp.h>
 #include <sound/core.h>
 #define SNDRV_GET_ID
 #include <sound/initval.h>
@@ -66,7 +62,7 @@
 MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(enable, "Enable WaveFront soundcard.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 MODULE_PARM(isapnp, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(isapnp, "ISA PnP detection for WaveFront soundcards.");
 MODULE_PARM_SYNTAX(isapnp, SNDRV_ISAPNP_DESC);
@@ -102,48 +98,38 @@
 MODULE_PARM_DESC(use_cs4232_midi, "Use CS4232 MPU-401 interface (inaccessibly located inside your computer)");
 MODULE_PARM_SYNTAX(use_cs4232_midi, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
 
-static snd_card_t *snd_wavefront_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-
-#ifdef __ISAPNP__
+static snd_card_t *snd_wavefront_legacy[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
-static struct isapnp_card *snd_wavefront_isapnp_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
-static const struct isapnp_card_id *snd_wavefront_isapnp_id[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
+#ifdef CONFIG_PNP
 
-static struct isapnp_card_id snd_wavefront_pnpids[] __devinitdata = {
-	{
-		ISAPNP_CARD_ID('C','S','C',0x7532),	/* Tropez */
-		.devs = { ISAPNP_DEVICE_ID('C','S','C',0x0000),	/* WSS */
-			ISAPNP_DEVICE_ID('C','S','C',0x0010),	/* CTRL */
-			ISAPNP_DEVICE_ID('P','n','P',0xb006),	/* MPU */
-			ISAPNP_DEVICE_ID('C','S','C',000004), }, /* SYNTH */
-	},
-	{
-		ISAPNP_CARD_ID('C','S','C',0x7632),	/* Tropez+ */
-		.devs = { ISAPNP_DEVICE_ID('C','S','C',0x0000),	/* WSS */
-			ISAPNP_DEVICE_ID('C','S','C',0x0010),	/* CTRL */
-			ISAPNP_DEVICE_ID('P','n','P',0xb006),	/* MPU */
-			ISAPNP_DEVICE_ID('C','S','C',000004), }, /* SYNTH */
-	},
-	{ ISAPNP_CARD_END, }
+static struct pnp_card_device_id snd_wavefront_pnpids[] __devinitdata = {
+	/* Tropez */
+	{ .id = "CSC7532", .devs = { { "CSC0000" }, { "CSC0010" }, { "PnPb006" }, { "CSC0004" } } },
+	/* Tropez+ */
+	{ .id = "CSC7632", .devs = { { "CSC0000" }, { "CSC0010" }, { "PnPb006" }, { "CSC0004" } } },
+	{ .id = "" }
 };
 
-ISAPNP_CARD_TABLE(snd_wavefront_pnpids);
+MODULE_DEVICE_TABLE(pnp_card, snd_wavefront_pnpids);
 
-static int __init
-snd_wavefront_isapnp (int dev, snd_wavefront_card_t *acard)
+static int __devinit
+snd_wavefront_pnp (int dev, snd_wavefront_card_t *acard, struct pnp_card_link *card,
+		   const struct pnp_card_device_id *id)
 {
-	const struct isapnp_card_id *id = snd_wavefront_isapnp_id[dev];
-	struct isapnp_card *card = snd_wavefront_isapnp_cards[dev];
-	struct isapnp_dev *pdev;
-	int tmp;
+	struct pnp_dev *pdev;
+	struct pnp_resource_table *cfg = kmalloc(sizeof(*cfg), GFP_KERNEL);
+	int err;
+
+	if (!cfg)
+		return -ENOMEM;
 
 	/* Check for each logical device. */
 
 	/* CS4232 chip (aka "windows sound system") is logical device 0 */
 
-	acard->wss = isapnp_find_dev(card, id->devs[0].vendor, id->devs[0].function, NULL);
-	if (acard->wss->active) {
-		acard->wss = NULL;
+	acard->wss = pnp_request_card_device(card, id->devs[0].id, NULL);
+	if (acard->wss == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
 
@@ -159,18 +145,18 @@
 	*/
 
 	if (use_cs4232_midi[dev]) {
-		acard->mpu = isapnp_find_dev(card, id->devs[2].vendor, id->devs[2].function, NULL);
-		if (acard->mpu->active) {
-			acard->wss = acard->synth = acard->mpu = NULL;
+		acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
+		if (acard->mpu == NULL) {
+			kfree(cfg);
 			return -EBUSY;
 		}
 	}
 
 	/* The ICS2115 synth is logical device 4 */
 
-	acard->synth = isapnp_find_dev(card, id->devs[3].vendor, id->devs[3].function, NULL);
-	if (acard->synth->active) {
-		acard->wss = acard->synth = NULL;
+	acard->synth = pnp_request_card_device(card, id->devs[3].id, NULL);
+	if (acard->synth == NULL) {
+		kfree(cfg);
 		return -EBUSY;
 	}
 
@@ -178,15 +164,7 @@
 
 	pdev = acard->wss;
 
-	if ((tmp = pdev->prepare (pdev)) < 0) {
-		if (tmp == -EBUSY) {
-			snd_printk ("ISA PnP configuration appears to have "
-				    "been done. Restart the isapnp module.\n");
-			return 0;
-		}
-		snd_printk ("isapnp WSS preparation failed\n");
-		return -EAGAIN;
-	}
+	pnp_init_resource_table(cfg);
 
 	/* An interesting note from the Tropez+ FAQ:
 
@@ -201,56 +179,55 @@
 	*/
 
 	if (cs4232_pcm_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[0], cs4232_pcm_port[dev], 4);
 	if (fm_port[dev] != SNDRV_AUTO_PORT)
-		isapnp_resource_change(&pdev->resource[1], fm_port[dev], 4);
+		pnp_resource_change(&cfg->port_resource[1], fm_port[dev], 4);
 	if (dma1[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[0], dma1[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[0], dma1[dev], 1);
 	if (dma2[dev] != SNDRV_AUTO_DMA)
-		isapnp_resource_change(&pdev->dma_resource[1], dma2[dev], 1);
+		pnp_resource_change(&cfg->dma_resource[1], dma2[dev], 1);
 	if (cs4232_pcm_irq[dev] != SNDRV_AUTO_IRQ)
-		isapnp_resource_change(&pdev->irq_resource[0], cs4232_pcm_irq[dev], 1);
+		pnp_resource_change(&cfg->irq_resource[0], cs4232_pcm_irq[dev], 1);
 
-	if (pdev->activate(pdev)<0) {
-		snd_printk ("isapnp WSS activation failed\n");
-		return -EBUSY;
+	if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR "PnP WSS the requested resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		snd_printk(KERN_ERR "PnP WSS pnp configure failure\n");
+		kfree(cfg);
+		return err;
 	}
 
-	cs4232_pcm_port[dev] = pdev->resource[0].start;
-	fm_port[dev] = pdev->resource[1].start;
-	dma1[dev] = pdev->dma_resource[0].start;
-	dma2[dev] = pdev->dma_resource[1].start;
-	cs4232_pcm_irq[dev] = pdev->irq_resource[0].start;
+	cs4232_pcm_port[dev] = pnp_port_start(pdev, 0);
+	fm_port[dev] = pnp_port_start(pdev, 1);
+	dma1[dev] = pnp_dma(pdev, 0);
+	dma2[dev] = pnp_dma(pdev, 1);
+	cs4232_pcm_irq[dev] = pnp_irq(pdev, 0);
 
 	/* Synth initialization */
 
 	pdev = acard->synth;
 	
-	if ((tmp = pdev->prepare(pdev))<0) {
-		if (tmp == -EBUSY) {
-			snd_printk ("ISA PnP configuration appears to have "
-				    "been done. Restart the isapnp module.\n");
-		}
-		acard->wss->deactivate(acard->wss);
-		snd_printk ("ICS2115 synth preparation failed\n");
-		return -EAGAIN;
-	}
+	pnp_init_resource_table(cfg);
+
 	if (ics2115_port[dev] != SNDRV_AUTO_PORT) {
-		isapnp_resource_change(&pdev->resource[0], ics2115_port[dev], 16);
+		pnp_resource_change(&cfg->port_resource[0], ics2115_port[dev], 16);
 	}
 		
 	if (ics2115_port[dev] != SNDRV_AUTO_IRQ) {
-		isapnp_resource_change(&pdev->irq_resource[0], ics2115_irq[dev], 1);
+		pnp_resource_change(&cfg->irq_resource[0], ics2115_irq[dev], 1);
 	}
 
-	if (pdev->activate(pdev)<0) {
-		snd_printk("isapnp activation for ICS2115 failed\n");
-		acard->wss->deactivate(acard->wss);
-		return -EBUSY;
+	if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+		snd_printk(KERN_ERR "PnP ICS2115 the requested resources are invalid, using auto config\n");
+	err = pnp_activate_dev(pdev);
+	if (err < 0) {
+		snd_printk(KERN_ERR "PnP ICS2115 pnp configure failure\n");
+		kfree(cfg);
+		return err;
 	}
 
-	ics2115_port[dev] = pdev->resource[0].start;
-	ics2115_irq[dev] = pdev->irq_resource[0].start;
+	ics2115_port[dev] = pnp_port_start(pdev, 0);
+	ics2115_irq[dev] = pnp_irq(pdev, 0);
 
 	/* CS4232 MPU initialization. Configure this only if
 	   explicitly requested, since its physically inaccessible and
@@ -261,25 +238,22 @@
 
 		pdev = acard->mpu;
 
-		if (pdev->prepare(pdev)<0) {
-			acard->wss->deactivate(acard->wss);
-			if (acard->synth)
-				acard->synth->deactivate(acard->synth);
-			snd_printk ("CS4232 MPU preparation failed\n");
-			return -EAGAIN;
-		}
+		pnp_init_resource_table(cfg);
 
 		if (cs4232_mpu_port[dev] != SNDRV_AUTO_PORT)
-			isapnp_resource_change(&pdev->resource[0], cs4232_mpu_port[dev], 2);
+			pnp_resource_change(&cfg->port_resource[0], cs4232_mpu_port[dev], 2);
 		if (cs4232_mpu_irq[dev] != SNDRV_AUTO_IRQ)
-			isapnp_resource_change(&pdev->resource[0], cs4232_mpu_irq[dev], 1);
+			pnp_resource_change(&cfg->port_resource[0], cs4232_mpu_irq[dev], 1);
 
-		if (pdev->activate(pdev)<0) {
-			snd_printk("isapnp CS4232 MPU activation failed\n");
+		if (pnp_manual_config_dev(pdev, cfg, 0) < 0)
+			snd_printk(KERN_ERR "PnP MPU401 the requested resources are invalid, using auto config\n");
+		err = pnp_activate_dev(pdev);
+		if (err < 0) {
+			snd_printk(KERN_ERR "PnP MPU401 pnp configure failure\n");
 			cs4232_mpu_port[dev] = SNDRV_AUTO_PORT;
 		} else {
-			cs4232_mpu_port[dev] = pdev->resource[0].start;
-			cs4232_mpu_irq[dev] = pdev->irq_resource[0].start;
+			cs4232_mpu_port[dev] = pnp_port_start(pdev, 0);
+			cs4232_mpu_irq[dev] = pnp_irq(pdev, 0);
 		}
 
 		snd_printk ("CS4232 MPU: port=0x%lx, irq=%i\n", 
@@ -296,32 +270,11 @@
 		    ics2115_port[dev], 
 		    ics2115_irq[dev]);
 	
+	kfree(cfg);
 	return 0;
 }
 
-static void 
-snd_wavefront_deactivate (snd_wavefront_card_t *acard)
-{
-	snd_printk ("deactivating PnP devices\n");
-	if (acard->wss) {
-		acard->wss->deactivate(acard->wss);
-		acard->wss = NULL;
-	}
-	if (acard->ctrl) {
-		acard->ctrl->deactivate(acard->ctrl);
-		acard->ctrl = NULL;
-	}
-	if (acard->mpu) {
-		acard->mpu->deactivate(acard->mpu);
-		acard->mpu = NULL;
-	}
-	if (acard->synth) {
-		acard->synth->deactivate(acard->synth);
-		acard->synth = NULL;
-	}
-}
-
-#endif /* __ISAPNP__ */
+#endif /* CONFIG_PNP */
 
 static void snd_wavefront_ics2115_interrupt(int irq, 
 					    void *dev_id, 
@@ -341,7 +294,7 @@
 	}
 }
 
-snd_hwdep_t * __init
+snd_hwdep_t * __devinit
 snd_wavefront_new_synth (snd_card_t *card,
 			 int hw_dev,
 			 snd_wavefront_card_t *acard)
@@ -367,7 +320,7 @@
 	return wavefront_synth;
 }
 
-snd_hwdep_t * __init
+snd_hwdep_t * __devinit
 snd_wavefront_new_fx (snd_card_t *card,
 		      int hw_dev,
 		      snd_wavefront_card_t *acard,
@@ -394,7 +347,7 @@
 static snd_wavefront_mpu_id internal_id = internal_mpu;
 static snd_wavefront_mpu_id external_id = external_mpu;
 
-snd_rawmidi_t * __init
+snd_rawmidi_t * __devinit
 snd_wavefront_new_midi (snd_card_t *card,
 			int midi_dev,
 			snd_wavefront_card_t *acard,
@@ -441,9 +394,6 @@
 	snd_wavefront_card_t *acard = (snd_wavefront_card_t *)card->private_data;
 	
 	if (acard) {
-#ifdef __ISAPNP__
-		snd_wavefront_deactivate(acard);
-#endif
 		if (acard->wavefront.res_base != NULL) {
 			release_resource(acard->wavefront.res_base);
 			kfree_nocheck(acard->wavefront.res_base);
@@ -453,8 +403,9 @@
 	}
 }
 
-static int __init
-snd_wavefront_probe (int dev)
+static int __devinit
+snd_wavefront_probe (int dev, struct pnp_card_link *pcard,
+		     const struct pnp_card_device_id *pid)
 {
 	snd_card_t *card;
 	snd_wavefront_card_t *acard;
@@ -472,7 +423,7 @@
 	if (ics2115_port[dev] < 0)
 		ics2115_port[dev] = SNDRV_AUTO_PORT;
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	if (!isapnp[dev]) {
 #endif
 		if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) {
@@ -483,7 +434,7 @@
 			snd_printk("specify ICS2115 port\n");
 			return -ENODEV;
 		}
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 	}
 #endif
 	card = snd_card_new (index[dev], 
@@ -502,15 +453,15 @@
 	spin_lock_init(&acard->wavefront.midi.virtual);
 	card->private_free = snd_wavefront_free;
 
-#ifdef __ISAPNP__
-	if (isapnp[dev] && snd_wavefront_isapnp (dev, acard) < 0) {
+#ifdef CONFIG_PNP
+	if (isapnp[dev] && snd_wavefront_pnp (dev, acard, pcard, pid) < 0) {
 		if (cs4232_pcm_port[dev] == SNDRV_AUTO_PORT) {
 			snd_printk ("isapnp detection failed\n");
 			snd_card_free (card);
 			return -ENODEV;
 		}
 	}
-#endif /* __ISAPNP__ */
+#endif /* CONFIG_PNP */
 
 	/* --------- PCM --------------- */
 
@@ -694,14 +645,17 @@
 		snd_card_free(card);
 		return err;
 	}
-	snd_wavefront_cards[dev] = card;
+	if (pcard)
+		pnp_set_card_drvdata(pcard, card);
+	else
+		snd_wavefront_legacy[dev] = card;
 	return 0;
 }	
 
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 
-static int __init snd_wavefront_isapnp_detect(struct isapnp_card *card,
-                                              const struct isapnp_card_id *id)
+static int __devinit snd_wavefront_pnp_detect(struct pnp_card_link *card,
+                                              const struct pnp_card_device_id *id)
 {
         static int dev;
         int res;
@@ -709,9 +663,7 @@
         for ( ; dev < SNDRV_CARDS; dev++) {
                 if (!enable[dev] || !isapnp[dev])
                         continue;
-                snd_wavefront_isapnp_cards[dev] = card;
-                snd_wavefront_isapnp_id[dev] = id;
-                res = snd_wavefront_probe(dev);
+                res = snd_wavefront_probe(dev, card, id);
                 if (res < 0)
                         return res;
                 dev++;
@@ -721,7 +673,23 @@
         return -ENODEV;
 }
 
-#endif /* __ISAPNP__ */
+static void __devexit snd_wavefront_pnp_remove(struct pnp_card_link * pcard)
+{
+	snd_card_t *card = (snd_card_t *) pnp_get_card_drvdata(pcard);
+
+	snd_card_disconnect(card);
+	snd_card_free_in_thread(card);
+}
+
+static struct pnp_card_driver wavefront_pnpc_driver = {
+	.flags		= PNP_DRIVER_RES_DISABLE,
+	.name		= "wavefront",
+	.id_table	= snd_wavefront_pnpids,
+	.probe		= snd_wavefront_pnp_detect,
+	.remove		= __devexit_p(snd_wavefront_pnp_remove),
+};
+
+#endif /* CONFIG_PNP */
 
 static int __init alsa_card_wavefront_init(void)
 {
@@ -730,15 +698,15 @@
 	for (dev = 0; dev < SNDRV_CARDS; dev++) {
 		if (!enable[dev])
 			continue;
-#ifdef __ISAPNP__
+#ifdef CONFIG_PNP
 		if (isapnp[dev])
 			continue;
 #endif
-		if (snd_wavefront_probe(dev) >= 0)
+		if (snd_wavefront_probe(dev, NULL, NULL) >= 0)
 			cards++;
 	}
-#ifdef __ISAPNP__
-	cards += isapnp_probe_cards(snd_wavefront_pnpids, snd_wavefront_isapnp_detect);
+#ifdef CONFIG_PNP
+	cards += pnp_register_card_driver(&wavefront_pnpc_driver);
 #endif
 	if (!cards) {
 #ifdef MODULE
@@ -753,8 +721,9 @@
 {
 	int idx;
 
+	pnp_unregister_card_driver(&wavefront_pnpc_driver);
 	for (idx = 0; idx < SNDRV_CARDS; idx++)
-		snd_card_free(snd_wavefront_cards[idx]);
+		snd_card_free(snd_wavefront_legacy[idx]);
 }
 
 module_init(alsa_card_wavefront_init)
diff -Nru a/sound/oss/ac97_codec.c b/sound/oss/ac97_codec.c
--- a/sound/oss/ac97_codec.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/ac97_codec.c	Sat Apr 19 19:51:28 2003
@@ -43,7 +43,6 @@
  *	Isolated from trident.c to support multiple ac97 codec
  */
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/errno.h>
diff -Nru a/sound/oss/aci.c b/sound/oss/aci.c
--- a/sound/oss/aci.c	Sat Apr 19 19:51:48 2003
+++ b/sound/oss/aci.c	Sat Apr 19 19:51:48 2003
@@ -584,9 +584,9 @@
 
 static struct mixer_operations aci_mixer_operations =
 {
-	owner: THIS_MODULE,
-	id:    "ACI",
-	ioctl: aci_mixer_ioctl
+	.owner = THIS_MODULE,
+	.id    = "ACI",
+	.ioctl = aci_mixer_ioctl
 };
 
 /*
diff -Nru a/sound/oss/ad1816.c b/sound/oss/ad1816.c
--- a/sound/oss/ad1816.c	Sat Apr 19 19:51:50 2003
+++ b/sound/oss/ad1816.c	Sat Apr 19 19:51:50 2003
@@ -518,20 +518,20 @@
 
 static struct audio_driver ad1816_audio_driver =
 {
-	owner:		THIS_MODULE,
-	open:		ad1816_open,
-	close:		ad1816_close,
-	output_block:	ad1816_output_block,
-	start_input:	ad1816_start_input,
-	prepare_for_input:	ad1816_prepare_for_input,
-	prepare_for_output:	ad1816_prepare_for_output,
-	halt_io:		ad1816_halt,
-	halt_input:	ad1816_halt_input,
-	halt_output:	ad1816_halt_output,
-	trigger:	ad1816_trigger,
-	set_speed:	ad1816_set_speed,
-	set_bits:	ad1816_set_bits,
-	set_channels:	ad1816_set_channels,
+	.owner			= THIS_MODULE,
+	.open			= ad1816_open,
+	.close			= ad1816_close,
+	.output_block		= ad1816_output_block,
+	.start_input		= ad1816_start_input,
+	.prepare_for_input	= ad1816_prepare_for_input,
+	.prepare_for_output	= ad1816_prepare_for_output,
+	.halt_io		= ad1816_halt,
+	.halt_input		= ad1816_halt_input,
+	.halt_output		= ad1816_halt_output,
+	.trigger		= ad1816_trigger,
+	.set_speed		= ad1816_set_speed,
+	.set_bits		= ad1816_set_bits,
+	.set_channels		= ad1816_set_channels,
 };
 
 
@@ -970,10 +970,10 @@
 /* Mixer structure */
 
 static struct mixer_operations ad1816_mixer_operations = {
-	owner:	THIS_MODULE,
-	id:	"AD1816",
-	name:	"AD1816 Mixer",
-	ioctl:	ad1816_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "AD1816",
+	.name	= "AD1816 Mixer",
+	.ioctl	= ad1816_mixer_ioctl
 };
 
 
diff -Nru a/sound/oss/ad1848.c b/sound/oss/ad1848.c
--- a/sound/oss/ad1848.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/ad1848.c	Sat Apr 19 19:51:49 2003
@@ -943,28 +943,28 @@
 
 static struct audio_driver ad1848_audio_driver =
 {
-	owner:		THIS_MODULE,
-	open:		ad1848_open,
-	close:		ad1848_close,
-	output_block:	ad1848_output_block,
-	start_input:	ad1848_start_input,
-	prepare_for_input:	ad1848_prepare_for_input,
-	prepare_for_output:	ad1848_prepare_for_output,
-	halt_io:	ad1848_halt,
-	halt_input:	ad1848_halt_input,
-	halt_output:	ad1848_halt_output,
-	trigger:	ad1848_trigger,
-	set_speed:	ad1848_set_speed,
-	set_bits:	ad1848_set_bits,
-	set_channels:	ad1848_set_channels
+	.owner			= THIS_MODULE,
+	.open			= ad1848_open,
+	.close			= ad1848_close,
+	.output_block		= ad1848_output_block,
+	.start_input		= ad1848_start_input,
+	.prepare_for_input	= ad1848_prepare_for_input,
+	.prepare_for_output	= ad1848_prepare_for_output,
+	.halt_io		= ad1848_halt,
+	.halt_input		= ad1848_halt_input,
+	.halt_output		= ad1848_halt_output,
+	.trigger		= ad1848_trigger,
+	.set_speed		= ad1848_set_speed,
+	.set_bits		= ad1848_set_bits,
+	.set_channels		= ad1848_set_channels
 };
 
 static struct mixer_operations ad1848_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"SOUNDPORT",
-	name:	"AD1848/CS4248/CS4231",
-	ioctl:	ad1848_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "SOUNDPORT",
+	.name	= "AD1848/CS4248/CS4231",
+	.ioctl	= ad1848_mixer_ioctl
 };
 
 static int ad1848_open(int dev, int mode)
diff -Nru a/sound/oss/awe_wave.c b/sound/oss/awe_wave.c
--- a/sound/oss/awe_wave.c	Sat Apr 19 19:51:46 2003
+++ b/sound/oss/awe_wave.c	Sat Apr 19 19:51:46 2003
@@ -493,28 +493,28 @@
 
 static struct synth_operations awe_operations =
 {
-	owner:		THIS_MODULE,
-	id:		"EMU8K",
-	info:		&awe_info,
-	midi_dev:	0,
-	synth_type:	SYNTH_TYPE_SAMPLE,
-	synth_subtype:	SAMPLE_TYPE_AWE32,
-	open:		awe_open,
-	close:		awe_close,
-	ioctl:		awe_ioctl,
-	kill_note:	awe_kill_note,
-	start_note:	awe_start_note,
-	set_instr:	awe_set_instr_2,
-	reset:		awe_reset,
-	hw_control:	awe_hw_control,
-	load_patch:	awe_load_patch,
-	aftertouch:	awe_aftertouch,
-	controller:	awe_controller,
-	panning:	awe_panning,
-	volume_method:	awe_volume_method,
-	bender:		awe_bender,
-	alloc_voice:	awe_alloc,
-	setup_voice:	awe_setup_voice
+	.owner		= THIS_MODULE,
+	.id		= "EMU8K",
+	.info		= &awe_info,
+	.midi_dev	= 0,
+	.synth_type	= SYNTH_TYPE_SAMPLE,
+	.synth_subtype	= SAMPLE_TYPE_AWE32,
+	.open		= awe_open,
+	.close		= awe_close,
+	.ioctl		= awe_ioctl,
+	.kill_note	= awe_kill_note,
+	.start_note	= awe_start_note,
+	.set_instr	= awe_set_instr_2,
+	.reset		= awe_reset,
+	.hw_control	= awe_hw_control,
+	.load_patch	= awe_load_patch,
+	.aftertouch	= awe_aftertouch,
+	.controller	= awe_controller,
+	.panning	= awe_panning,
+	.volume_method	= awe_volume_method,
+	.bender		= awe_bender,
+	.alloc_voice	= awe_alloc,
+	.setup_voice	= awe_setup_voice
 };
 
 
@@ -4287,10 +4287,10 @@
 static int my_mixerdev = -1;
 
 static struct mixer_operations awe_mixer_operations = {
-	owner:	THIS_MODULE,
-	id:	"AWE",
-	name:	"AWE32 Equalizer",
-	ioctl:	awe_mixer_ioctl,
+	.owner	= THIS_MODULE,
+	.id	= "AWE",
+	.name	= "AWE32 Equalizer",
+	.ioctl	= awe_mixer_ioctl,
 };
 
 static void __init attach_mixer(void)
@@ -5232,13 +5232,13 @@
 
 static struct midi_operations awe_midi_operations =
 {
-	owner:		THIS_MODULE,
-	info:		{"AWE Midi Emu", 0, 0, SNDCARD_SB},
-	in_info:	{0},
-	open:		awe_midi_open, /*open*/
-	close:		awe_midi_close, /*close*/
-	ioctl:		awe_midi_ioctl, /*ioctl*/
-	outputc:	awe_midi_outputc, /*outputc*/
+	.owner		= THIS_MODULE,
+	.info		= {"AWE Midi Emu", 0, 0, SNDCARD_SB},
+	.in_info	= {0},
+	.open		= awe_midi_open, /*open*/
+	.close		= awe_midi_close, /*close*/
+	.ioctl		= awe_midi_ioctl, /*ioctl*/
+	.outputc	= awe_midi_outputc, /*outputc*/
 };
 
 static int my_mididev = -1;
diff -Nru a/sound/oss/btaudio.c b/sound/oss/btaudio.c
--- a/sound/oss/btaudio.c	Sat Apr 19 19:51:29 2003
+++ b/sound/oss/btaudio.c	Sat Apr 19 19:51:29 2003
@@ -19,7 +19,6 @@
 
 */
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/errno.h>
 #include <linux/pci.h>
@@ -426,11 +425,11 @@
 }
 
 static struct file_operations btaudio_mixer_fops = {
-	owner:   THIS_MODULE,
-	llseek:  no_llseek,
-	open:    btaudio_mixer_open,
-	release: btaudio_mixer_release,
-	ioctl:   btaudio_mixer_ioctl,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.open		= btaudio_mixer_open,
+	.release	= btaudio_mixer_release,
+	.ioctl		= btaudio_mixer_ioctl,
 };
 
 /* -------------------------------------------------------------- */
@@ -791,25 +790,25 @@
 }
 
 static struct file_operations btaudio_digital_dsp_fops = {
-	owner:   THIS_MODULE,
-	llseek:  no_llseek,
-	open:    btaudio_dsp_open_digital,
-	release: btaudio_dsp_release,
-	read:    btaudio_dsp_read,
-	write:   btaudio_dsp_write,
-	ioctl:   btaudio_dsp_ioctl,
-	poll:    btaudio_dsp_poll,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.open		= btaudio_dsp_open_digital,
+	.release	= btaudio_dsp_release,
+	.read		= btaudio_dsp_read,
+	.write		= btaudio_dsp_write,
+	.ioctl		= btaudio_dsp_ioctl,
+	.poll		= btaudio_dsp_poll,
 };
 
 static struct file_operations btaudio_analog_dsp_fops = {
-	owner:   THIS_MODULE,
-	llseek:  no_llseek,
-	open:    btaudio_dsp_open_analog,
-	release: btaudio_dsp_release,
-	read:    btaudio_dsp_read,
-	write:   btaudio_dsp_write,
-	ioctl:   btaudio_dsp_ioctl,
-	poll:    btaudio_dsp_poll,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.open		= btaudio_dsp_open_analog,
+	.release	= btaudio_dsp_release,
+	.read		= btaudio_dsp_read,
+	.write		= btaudio_dsp_write,
+	.ioctl		= btaudio_dsp_ioctl,
+	.poll		= btaudio_dsp_poll,
 };
 
 /* -------------------------------------------------------------- */
@@ -882,12 +881,12 @@
 
 static struct cardinfo cards[] = {
 	[0] = {
-		name: "default",
-		rate: 32000,
+		.name	= "default",
+		.rate	= 32000,
 	},
 	[BTA_OSPREY200] = {
-		name: "Osprey 200",
-		rate: 44100,
+		.name	= "Osprey 200",
+		.rate	= 44100,
 	},
 };
 
@@ -1062,31 +1061,31 @@
 
 static struct pci_device_id btaudio_pci_tbl[] __devinitdata = {
         {
-		vendor:       PCI_VENDOR_ID_BROOKTREE,
-		device:       0x0878,
-		subvendor:    0x0070,
-		subdevice:    0xff01,
-		driver_data:  BTA_OSPREY200,
+		.vendor		= PCI_VENDOR_ID_BROOKTREE,
+		.device		= 0x0878,
+		.subvendor	= 0x0070,
+		.subdevice	= 0xff01,
+		.driver_data	= BTA_OSPREY200,
 	},{
-		vendor:       PCI_VENDOR_ID_BROOKTREE,
-		device:       0x0878,
-		subvendor:    PCI_ANY_ID,
-		subdevice:    PCI_ANY_ID,
+		.vendor		= PCI_VENDOR_ID_BROOKTREE,
+		.device		= 0x0878,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
 	},{
-		vendor:       PCI_VENDOR_ID_BROOKTREE,
-		device:       0x0878,
-		subvendor:    PCI_ANY_ID,
-		subdevice:    PCI_ANY_ID,
+		.vendor		= PCI_VENDOR_ID_BROOKTREE,
+		.device		= 0x0878,
+		.subvendor	= PCI_ANY_ID,
+		.subdevice	= PCI_ANY_ID,
         },{
 		/* --- end of list --- */
 	}
 };
 
 static struct pci_driver btaudio_pci_driver = {
-        name:     "btaudio",
-        id_table: btaudio_pci_tbl,
-        probe:    btaudio_probe,
-        remove:   __devexit_p(btaudio_remove),
+        .name		= "btaudio",
+        .id_table	= btaudio_pci_tbl,
+        .probe		= btaudio_probe,
+        .remove		=  __devexit_p(btaudio_remove),
 };
 
 static int btaudio_init_module(void)
diff -Nru a/sound/oss/cmpci.c b/sound/oss/cmpci.c
--- a/sound/oss/cmpci.c	Sat Apr 19 19:51:48 2003
+++ b/sound/oss/cmpci.c	Sat Apr 19 19:51:48 2003
@@ -87,7 +87,6 @@
  */
 /*****************************************************************************/
       
-#include <linux/version.h>
 #include <linux/config.h>
 #include <linux/module.h>
 #include <linux/string.h>
diff -Nru a/sound/oss/cs4232.c b/sound/oss/cs4232.c
--- a/sound/oss/cs4232.c	Sat Apr 19 19:51:48 2003
+++ b/sound/oss/cs4232.c	Sat Apr 19 19:51:48 2003
@@ -313,7 +313,7 @@
 	}
 }
 
-static void __exit unload_cs4232(struct address_info *hw_config)
+static void __devexit unload_cs4232(struct address_info *hw_config)
 {
 	int base = hw_config->io_base, irq = hw_config->irq;
 	int dma1 = hw_config->dma, dma2 = hw_config->dma2;
@@ -428,7 +428,7 @@
 	return 0;
 }
 
-static void cs4232_pnp_remove(struct pnp_dev *dev)
+static void __devexit cs4232_pnp_remove(struct pnp_dev *dev)
 {
 	struct address_info *cfg = pnp_get_drvdata(dev);
 	if (cfg) {
@@ -441,7 +441,7 @@
 	.name		= "cs4232",
 	.id_table	= cs4232_pnp_table,
 	.probe		= cs4232_pnp_probe,
-	.remove		= cs4232_pnp_remove,
+	.remove		= __devexit_p(cs4232_pnp_remove),
 };
 
 static int __init init_cs4232(void)
diff -Nru a/sound/oss/cs4281/cs4281m.c b/sound/oss/cs4281/cs4281m.c
--- a/sound/oss/cs4281/cs4281m.c	Sat Apr 19 19:51:51 2003
+++ b/sound/oss/cs4281/cs4281m.c	Sat Apr 19 19:51:51 2003
@@ -58,7 +58,6 @@
 //#define NOT_CS4281_PM 1 
 
 #include <linux/list.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
diff -Nru a/sound/oss/cs46xx.c b/sound/oss/cs46xx.c
--- a/sound/oss/cs46xx.c	Sat Apr 19 19:51:27 2003
+++ b/sound/oss/cs46xx.c	Sat Apr 19 19:51:27 2003
@@ -77,7 +77,6 @@
  
 #include <linux/interrupt.h>
 #include <linux/list.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
diff -Nru a/sound/oss/dmasound/dmasound_atari.c b/sound/oss/dmasound/dmasound_atari.c
--- a/sound/oss/dmasound/dmasound_atari.c	Sat Apr 19 19:51:30 2003
+++ b/sound/oss/dmasound/dmasound_atari.c	Sat Apr 19 19:51:30 2003
@@ -767,39 +767,39 @@
 
 
 static TRANS transTTNormal = {
-	ct_ulaw:	ata_ct_law,
-	ct_alaw:	ata_ct_law,
-	ct_s8:		ata_ct_s8,
-	ct_u8:		ata_ct_u8,
+	.ct_ulaw	= ata_ct_law,
+	.ct_alaw	= ata_ct_law,
+	.ct_s8		= ata_ct_s8,
+	.ct_u8		= ata_ct_u8,
 };
 
 static TRANS transTTExpanding = {
-	ct_ulaw:	ata_ctx_law,
-	ct_alaw:	ata_ctx_law,
-	ct_s8:		ata_ctx_s8,
-	ct_u8:		ata_ctx_u8,
+	.ct_ulaw	= ata_ctx_law,
+	.ct_alaw	= ata_ctx_law,
+	.ct_s8		= ata_ctx_s8,
+	.ct_u8		= ata_ctx_u8,
 };
 
 static TRANS transFalconNormal = {
-	ct_ulaw:	ata_ct_law,
-	ct_alaw:	ata_ct_law,
-	ct_s8:		ata_ct_s8,
-	ct_u8:		ata_ct_u8,
-	ct_s16be:	ata_ct_s16be,
-	ct_u16be:	ata_ct_u16be,
-	ct_s16le:	ata_ct_s16le,
-	ct_u16le:	ata_ct_u16le
+	.ct_ulaw	= ata_ct_law,
+	.ct_alaw	= ata_ct_law,
+	.ct_s8		= ata_ct_s8,
+	.ct_u8		= ata_ct_u8,
+	.ct_s16be	= ata_ct_s16be,
+	.ct_u16be	= ata_ct_u16be,
+	.ct_s16le	= ata_ct_s16le,
+	.ct_u16le	= ata_ct_u16le
 };
 
 static TRANS transFalconExpanding = {
-	ct_ulaw:	ata_ctx_law,
-	ct_alaw:	ata_ctx_law,
-	ct_s8:		ata_ctx_s8,
-	ct_u8:		ata_ctx_u8,
-	ct_s16be:	ata_ctx_s16be,
-	ct_u16be:	ata_ctx_u16be,
-	ct_s16le:	ata_ctx_s16le,
-	ct_u16le:	ata_ctx_u16le,
+	.ct_ulaw	= ata_ctx_law,
+	.ct_alaw	= ata_ctx_law,
+	.ct_s8		= ata_ctx_s8,
+	.ct_u8		= ata_ctx_u8,
+	.ct_s16be	= ata_ctx_s16be,
+	.ct_u16be	= ata_ctx_u16be,
+	.ct_s16le	= ata_ctx_s16le,
+	.ct_u16le	= ata_ctx_u16le,
 };
 
 
@@ -1495,81 +1495,81 @@
 /*** Machine definitions *****************************************************/
 
 static SETTINGS def_hard_falcon = {
-	format: AFMT_S8,
-	stereo: 0,
-	size: 8,
-	speed: 8195
+	.format		= AFMT_S8,
+	.stereo		= 0,
+	.size		= 8,
+	.speed		= 8195
 } ;
 
 static SETTINGS def_hard_tt = {
-	format: AFMT_S8,
-	stereo: 0,
-	size: 8,
-	speed: 12517
+	.format	= AFMT_S8,
+	.stereo	= 0,
+	.size	= 8,
+	.speed	= 12517
 } ;
 
 static SETTINGS def_soft = {
-	format: AFMT_U8,
-	stereo: 0,
-	size: 8,
-	speed: 8000
+	.format	= AFMT_U8,
+	.stereo	= 0,
+	.size	= 8,
+	.speed	= 8000
 } ;
 
 static MACHINE machTT = {
-	name:		"Atari",
-	name2:		"TT",
-	open:		AtaOpen,
-	release:	AtaRelease,
-	dma_alloc:	AtaAlloc,
-	dma_free:	AtaFree,
-	irqinit:	AtaIrqInit,
+	.name		= "Atari",
+	.name2		= "TT",
+	.open		= AtaOpen,
+	.release	= AtaRelease,
+	.dma_alloc	= AtaAlloc,
+	.dma_free	= AtaFree,
+	.irqinit	= AtaIrqInit,
 #ifdef MODULE
-	irqcleanup:	AtaIrqCleanUp,
+	.irqcleanup	= AtaIrqCleanUp,
 #endif /* MODULE */
-	init:		TTInit,
-	silence:	TTSilence,
-	setFormat:	TTSetFormat,
-	setVolume:	TTSetVolume,
-	setBass:	AtaSetBass,
-	setTreble:	AtaSetTreble,
-	setGain:	TTSetGain,
-	play:		AtaPlay,
-	mixer_init:	TTMixerInit,
-	mixer_ioctl:	TTMixerIoctl,
-	write_sq_setup:	AtaWriteSqSetup,
-	sq_open:	AtaSqOpen,
-	state_info:	TTStateInfo,
-	min_dsp_speed:	6258,
-	version:	((DMASOUND_ATARI_REVISION<<8) | DMASOUND_ATARI_EDITION),
-	hardware_afmts:	AFMT_S8,  /* h'ware-supported formats *only* here */
-	capabilities:	 DSP_CAP_BATCH	/* As per SNDCTL_DSP_GETCAPS */
+	.init		= TTInit,
+	.silence	= TTSilence,
+	.setFormat	= TTSetFormat,
+	.setVolume	= TTSetVolume,
+	.setBass	= AtaSetBass,
+	.setTreble	= AtaSetTreble,
+	.setGain	= TTSetGain,
+	.play		= AtaPlay,
+	.mixer_init	= TTMixerInit,
+	.mixer_ioctl	= TTMixerIoctl,
+	.write_sq_setup	= AtaWriteSqSetup,
+	.sq_open	= AtaSqOpen,
+	.state_info	= TTStateInfo,
+	.min_dsp_speed	= 6258,
+	.version	= ((DMASOUND_ATARI_REVISION<<8) | DMASOUND_ATARI_EDITION),
+	.hardware_afmts	= AFMT_S8,  /* h'ware-supported formats *only* here */
+	.capabilities	=  DSP_CAP_BATCH	/* As per SNDCTL_DSP_GETCAPS */
 };
 
 static MACHINE machFalcon = {
-	name:		"Atari",
-	name2:		"FALCON",
-	dma_alloc:	AtaAlloc,
-	dma_free:	AtaFree,
-	irqinit:	AtaIrqInit,
+	.name		= "Atari",
+	.name2		= "FALCON",
+	.dma_alloc	= AtaAlloc,
+	.dma_free	= AtaFree,
+	.irqinit	= AtaIrqInit,
 #ifdef MODULE
-	irqcleanup:	AtaIrqCleanUp,
+	.irqcleanup	= AtaIrqCleanUp,
 #endif /* MODULE */
-	init:		FalconInit,
-	silence:	FalconSilence,
-	setFormat:	FalconSetFormat,
-	setVolume:	FalconSetVolume,
-	setBass:	AtaSetBass,
-	setTreble:	AtaSetTreble,
-	play:		AtaPlay,
-	mixer_init:	FalconMixerInit,
-	mixer_ioctl:	FalconMixerIoctl,
-	write_sq_setup:	AtaWriteSqSetup,
-	sq_open:	AtaSqOpen,
-	state_info:	FalconStateInfo,
-	min_dsp_speed:	8195,
-	version:	((DMASOUND_ATARI_REVISION<<8) | DMASOUND_ATARI_EDITION),
-	hardware_afmts:	(AFMT_S8 | AFMT_S16_BE), /* h'ware-supported formats *only* here */
-	capabilities:	 DSP_CAP_BATCH	/* As per SNDCTL_DSP_GETCAPS */
+	.init		= FalconInit,
+	.silence	= FalconSilence,
+	.setFormat	= FalconSetFormat,
+	.setVolume	= FalconSetVolume,
+	.setBass	= AtaSetBass,
+	.setTreble	= AtaSetTreble,
+	.play		= AtaPlay,
+	.mixer_init	= FalconMixerInit,
+	.mixer_ioctl	= FalconMixerIoctl,
+	.write_sq_setup	= AtaWriteSqSetup,
+	.sq_open	= AtaSqOpen,
+	.state_info	= FalconStateInfo,
+	.min_dsp_speed	= 8195,
+	.version	= ((DMASOUND_ATARI_REVISION<<8) | DMASOUND_ATARI_EDITION),
+	.hardware_afmts	= (AFMT_S8 | AFMT_S16_BE), /* h'ware-supported formats *only* here */
+	.capabilities	=  DSP_CAP_BATCH	/* As per SNDCTL_DSP_GETCAPS */
 };
 
 
diff -Nru a/sound/oss/dmasound/dmasound_awacs.c b/sound/oss/dmasound/dmasound_awacs.c
--- a/sound/oss/dmasound/dmasound_awacs.c	Sat Apr 19 19:51:46 2003
+++ b/sound/oss/dmasound/dmasound_awacs.c	Sat Apr 19 19:51:46 2003
@@ -2405,45 +2405,45 @@
 /*** Machine definitions *****************************************************/
 
 static SETTINGS def_hard = {
-	format: AFMT_S16_BE,
-	stereo: 1,
-	size: 16,
-	speed: 44100
+	.format	= AFMT_S16_BE,
+	.stereo	= 1,
+	.size	= 16,
+	.speed	= 44100
 } ;
 
 static SETTINGS def_soft = {
-	format: AFMT_S16_BE,
-	stereo: 1,
-	size: 16,
-	speed: 44100
+	.format	= AFMT_S16_BE,
+	.stereo	= 1,
+	.size	= 16,
+	.speed	= 44100
 } ;
 
 static MACHINE machPMac = {
-	name:		awacs_name,
-	name2:		"PowerMac Built-in Sound",
-	open:		PMacOpen,
-	release:	PMacRelease,
-	dma_alloc:	PMacAlloc,
-	dma_free:	PMacFree,
-	irqinit:	PMacIrqInit,
+	.name		= awacs_name,
+	.name2		= "PowerMac Built-in Sound",
+	.open		= PMacOpen,
+	.release	= PMacRelease,
+	.dma_alloc	= PMacAlloc,
+	.dma_free	= PMacFree,
+	.irqinit	= PMacIrqInit,
 #ifdef MODULE
-	irqcleanup:	PMacIrqCleanup,
+	.irqcleanup	= PMacIrqCleanup,
 #endif /* MODULE */
-	init:		PMacInit,
-	silence:	PMacSilence,
-	setFormat:	PMacSetFormat,
-	setVolume:	PMacSetVolume,
-	play:		PMacPlay,
-	record:		NULL,		/* default to no record */
-	mixer_init:	PMacMixerInit,
-	mixer_ioctl:	PMacMixerIoctl,
-	write_sq_setup:	PMacWriteSqSetup,
-	read_sq_setup:	PMacReadSqSetup,
-	state_info:	PMacStateInfo,
-	abort_read:	PMacAbortRead,
-	min_dsp_speed:	7350,
-	max_dsp_speed:	44100,
-	version:	((DMASOUND_AWACS_REVISION<<8) + DMASOUND_AWACS_EDITION)
+	.init		= PMacInit,
+	.silence	= PMacSilence,
+	.setFormat	= PMacSetFormat,
+	.setVolume	= PMacSetVolume,
+	.play		= PMacPlay,
+	.record		= NULL,		/* default to no record */
+	.mixer_init	= PMacMixerInit,
+	.mixer_ioctl	= PMacMixerIoctl,
+	.write_sq_setup	= PMacWriteSqSetup,
+	.read_sq_setup	= PMacReadSqSetup,
+	.state_info	= PMacStateInfo,
+	.abort_read	= PMacAbortRead,
+	.min_dsp_speed	= 7350,
+	.max_dsp_speed	= 44100,
+	.version	= ((DMASOUND_AWACS_REVISION<<8) + DMASOUND_AWACS_EDITION)
 };
 
 
diff -Nru a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c
--- a/sound/oss/dmasound/dmasound_core.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/dmasound/dmasound_core.c	Sat Apr 19 19:51:28 2003
@@ -367,11 +367,11 @@
 
 static struct file_operations mixer_fops =
 {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		mixer_ioctl,
-	open:		mixer_open,
-	release:	mixer_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= mixer_ioctl,
+	.open		= mixer_open,
+	.release	= mixer_release,
 };
 
 static void __init mixer_init(void)
@@ -1325,15 +1325,15 @@
 
 static struct file_operations sq_fops =
 {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	write:		sq_write,
-	poll:		sq_poll,
-	ioctl:		sq_ioctl,
-	open:		sq_open,
-	release:	sq_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.write		= sq_write,
+	.poll		= sq_poll,
+	.ioctl		= sq_ioctl,
+	.open		= sq_open,
+	.release	= sq_release,
 #ifdef HAS_RECORD
-	read:		NULL	/* default to no read for compat mode */
+	.read		= NULL	/* default to no read for compat mode */
 #endif
 };
 
@@ -1548,11 +1548,11 @@
 }
 
 static struct file_operations state_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		state_read,
-	open:		state_open,
-	release:	state_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= state_read,
+	.open		= state_open,
+	.release	= state_release,
 };
 
 static int __init state_init(void)
diff -Nru a/sound/oss/dmasound/dmasound_paula.c b/sound/oss/dmasound/dmasound_paula.c
--- a/sound/oss/dmasound/dmasound_paula.c	Sat Apr 19 19:51:27 2003
+++ b/sound/oss/dmasound/dmasound_paula.c	Sat Apr 19 19:51:27 2003
@@ -298,14 +298,14 @@
 
 
 static TRANS transAmiga = {
-	ct_ulaw:	ami_ct_ulaw,
-	ct_alaw:	ami_ct_alaw,
-	ct_s8:		ami_ct_s8,
-	ct_u8:		ami_ct_u8,
-	ct_s16be:	ami_ct_s16be,
-	ct_u16be:	ami_ct_u16be,
-	ct_s16le:	ami_ct_s16le,
-	ct_u16le:	ami_ct_u16le,
+	.ct_ulaw	= ami_ct_ulaw,
+	.ct_alaw	= ami_ct_alaw,
+	.ct_s8		= ami_ct_s8,
+	.ct_u8		= ami_ct_u8,
+	.ct_s16be	= ami_ct_s16be,
+	.ct_u16be	= ami_ct_u16be,
+	.ct_s16le	= ami_ct_s16le,
+	.ct_u16le	= ami_ct_u16le,
 };
 
 /*** Low level stuff *********************************************************/
@@ -681,44 +681,44 @@
 /*** Machine definitions *****************************************************/
 
 static SETTINGS def_hard = {
-	format: AFMT_S8,
-	stereo: 0,
-	size: 8,
-	speed: 8000
+	.format	= AFMT_S8,
+	.stereo	= 0,
+	.size	= 8,
+	.speed	= 8000
 } ;
 
 static SETTINGS def_soft = {
-	format: AFMT_U8,
-	stereo: 0,
-	size: 8,
-	speed: 8000
+	.format	= AFMT_U8,
+	.stereo	= 0,
+	.size	= 8,
+	.speed	= 8000
 } ;
 
 static MACHINE machAmiga = {
-	name:		"Amiga",
-	name2:		"AMIGA",
-	open:		AmiOpen,
-	release:	AmiRelease,
-	dma_alloc:	AmiAlloc,
-	dma_free:	AmiFree,
-	irqinit:	AmiIrqInit,
+	.name		= "Amiga",
+	.name2		= "AMIGA",
+	.open		= AmiOpen,
+	.release	= AmiRelease,
+	.dma_alloc	= AmiAlloc,
+	.dma_free	= AmiFree,
+	.irqinit	= AmiIrqInit,
 #ifdef MODULE
-	irqcleanup:	AmiIrqCleanUp,
+	.irqcleanup	= AmiIrqCleanUp,
 #endif /* MODULE */
-	init:		AmiInit,
-	silence:	AmiSilence,
-	setFormat:	AmiSetFormat,
-	setVolume:	AmiSetVolume,
-	setTreble:	AmiSetTreble,
-	play:		AmiPlay,
-	mixer_init:	AmiMixerInit,
-	mixer_ioctl:	AmiMixerIoctl,
-	write_sq_setup:	AmiWriteSqSetup,
-	state_info:	AmiStateInfo,
-	min_dsp_speed:	8000,
-	version:	((DMASOUND_PAULA_REVISION<<8) | DMASOUND_PAULA_EDITION),
-	hardware_afmts:	(AFMT_S8 | AFMT_S16_BE), /* h'ware-supported formats *only* here */
-        capabilities:   DSP_CAP_BATCH          /* As per SNDCTL_DSP_GETCAPS */
+	.init		= AmiInit,
+	.silence	= AmiSilence,
+	.setFormat	= AmiSetFormat,
+	.setVolume	= AmiSetVolume,
+	.setTreble	= AmiSetTreble,
+	.play		= AmiPlay,
+	.mixer_init	= AmiMixerInit,
+	.mixer_ioctl	= AmiMixerIoctl,
+	.write_sq_setup	= AmiWriteSqSetup,
+	.state_info	= AmiStateInfo,
+	.min_dsp_speed	= 8000,
+	.version	= ((DMASOUND_PAULA_REVISION<<8) | DMASOUND_PAULA_EDITION),
+	.hardware_afmts	= (AFMT_S8 | AFMT_S16_BE), /* h'ware-supported formats *only* here */
+	.capabilities	= DSP_CAP_BATCH          /* As per SNDCTL_DSP_GETCAPS */
 };
 
 
diff -Nru a/sound/oss/dmasound/dmasound_q40.c b/sound/oss/dmasound/dmasound_q40.c
--- a/sound/oss/dmasound/dmasound_q40.c	Sat Apr 19 19:51:27 2003
+++ b/sound/oss/dmasound/dmasound_q40.c	Sat Apr 19 19:51:27 2003
@@ -584,39 +584,39 @@
 /*** Machine definitions *****************************************************/
 
 static SETTINGS def_hard = {
-	format: AFMT_U8,
-	stereo: 0,
-	size: 8,
-	speed: 10000
+	.format	= AFMT_U8,
+	.stereo	= 0,
+	.size	= 8,
+	.speed	= 10000
 } ;
 
 static SETTINGS def_soft = {
-	format: AFMT_U8,
-	stereo: 0,
-	size: 8,
-	speed: 8000
+	.format	= AFMT_U8,
+	.stereo	= 0,
+	.size	= 8,
+	.speed	= 8000
 } ;
 
 static MACHINE machQ40 = {
-	name:		"Q40",
-	name2:		"Q40",
-	open:		Q40Open,
-	release:	Q40Release,
-	dma_alloc:	Q40Alloc,
-	dma_free:	Q40Free,
-	irqinit:	Q40IrqInit,
+	.name		= "Q40",
+	.name2		= "Q40",
+	.open		= Q40Open,
+	.release	= Q40Release,
+	.dma_alloc	= Q40Alloc,
+	.dma_free	= Q40Free,
+	.irqinit	= Q40IrqInit,
 #ifdef MODULE
-	irqcleanup:	Q40IrqCleanUp,
+	.irqcleanup	= Q40IrqCleanUp,
 #endif /* MODULE */
-	init:		Q40Init,
-	silence:	Q40Silence,
-	setFormat:	Q40SetFormat,
-	setVolume:	Q40SetVolume,
-	play:		Q40Play,
- 	min_dsp_speed:	10000,
-	version:	((DMASOUND_Q40_REVISION<<8) | DMASOUND_Q40_EDITION),
-	hardware_afmts:	AFMT_U8, /* h'ware-supported formats *only* here */
-        capabilities:	DSP_CAP_BATCH  /* As per SNDCTL_DSP_GETCAPS */
+	.init		= Q40Init,
+	.silence	= Q40Silence,
+	.setFormat	= Q40SetFormat,
+	.setVolume	= Q40SetVolume,
+	.play		= Q40Play,
+ 	.min_dsp_speed	= 10000,
+	.version	= ((DMASOUND_Q40_REVISION<<8) | DMASOUND_Q40_EDITION),
+	.hardware_afmts	= AFMT_U8, /* h'ware-supported formats *only* here */
+	.capabilities	= DSP_CAP_BATCH  /* As per SNDCTL_DSP_GETCAPS */
 };
 
 
diff -Nru a/sound/oss/emu10k1/audio.c b/sound/oss/emu10k1/audio.c
--- a/sound/oss/emu10k1/audio.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/emu10k1/audio.c	Sat Apr 19 19:51:28 2003
@@ -33,7 +33,6 @@
 #include <linux/module.h>
 #include <linux/poll.h>
 #include <linux/slab.h>
-#include <linux/version.h>
 #include <linux/bitops.h>
 #include <asm/io.h>
 #include <linux/sched.h>
@@ -1020,7 +1019,7 @@
 }
 
 struct vm_operations_struct emu10k1_mm_ops = {
-	nopage:         emu10k1_mm_nopage,
+	.nopage         = emu10k1_mm_nopage,
 };
 
 static int emu10k1_audio_mmap(struct file *file, struct vm_area_struct *vma)
@@ -1558,13 +1557,13 @@
 }
 
 struct file_operations emu10k1_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		emu10k1_audio_read,
-	write:		emu10k1_audio_write,
-	poll:		emu10k1_audio_poll,
-	ioctl:		emu10k1_audio_ioctl,
-	mmap:		emu10k1_audio_mmap,
-	open:		emu10k1_audio_open,
-	release:	emu10k1_audio_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= emu10k1_audio_read,
+	.write		= emu10k1_audio_write,
+	.poll		= emu10k1_audio_poll,
+	.ioctl		= emu10k1_audio_ioctl,
+	.mmap		= emu10k1_audio_mmap,
+	.open		= emu10k1_audio_open,
+	.release	= emu10k1_audio_release,
 };
diff -Nru a/sound/oss/emu10k1/main.c b/sound/oss/emu10k1/main.c
--- a/sound/oss/emu10k1/main.c	Sat Apr 19 19:51:50 2003
+++ b/sound/oss/emu10k1/main.c	Sat Apr 19 19:51:50 2003
@@ -86,7 +86,6 @@
  *********************************************************************/
 
 /* These are only included once per module */
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/init.h>
@@ -1144,10 +1143,10 @@
 MODULE_LICENSE("GPL");
 
 static struct pci_driver emu10k1_pci_driver = {
-	name:		"emu10k1",
-	id_table:	emu10k1_pci_tbl,
-	probe:		emu10k1_probe,
-	remove:		__devexit_p(emu10k1_remove),
+	.name		= "emu10k1",
+	.id_table	= emu10k1_pci_tbl,
+	.probe		= emu10k1_probe,
+	.remove		= __devexit_p(emu10k1_remove),
 };
 
 static int __init emu10k1_init_module(void)
diff -Nru a/sound/oss/emu10k1/midi.c b/sound/oss/emu10k1/midi.c
--- a/sound/oss/emu10k1/midi.c	Sat Apr 19 19:51:51 2003
+++ b/sound/oss/emu10k1/midi.c	Sat Apr 19 19:51:51 2003
@@ -32,7 +32,6 @@
 #include <linux/module.h>
 #include <linux/poll.h>
 #include <linux/slab.h>
-#include <linux/version.h>
 #include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <asm/uaccess.h>
@@ -465,12 +464,12 @@
 
 /* MIDI file operations */
 struct file_operations emu10k1_midi_fops = {
-	owner:		THIS_MODULE,
-	read:		emu10k1_midi_read,
-	write:		emu10k1_midi_write,
-	poll:		emu10k1_midi_poll,
-	open:		emu10k1_midi_open,
-	release:	emu10k1_midi_release,
+	.owner		= THIS_MODULE,
+	.read		= emu10k1_midi_read,
+	.write		= emu10k1_midi_write,
+	.poll		= emu10k1_midi_poll,
+	.open		= emu10k1_midi_open,
+	.release	= emu10k1_midi_release,
 };
 
 
diff -Nru a/sound/oss/emu10k1/mixer.c b/sound/oss/emu10k1/mixer.c
--- a/sound/oss/emu10k1/mixer.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/emu10k1/mixer.c	Sat Apr 19 19:51:49 2003
@@ -31,7 +31,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/version.h>
 #include <asm/uaccess.h>
 #include <linux/fs.h>
 
@@ -675,9 +674,9 @@
 }
 
 struct file_operations emu10k1_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		emu10k1_mixer_ioctl,
-	open:		emu10k1_mixer_open,
-	release:	emu10k1_mixer_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= emu10k1_mixer_ioctl,
+	.open		= emu10k1_mixer_open,
+	.release	= emu10k1_mixer_release,
 };
diff -Nru a/sound/oss/emu10k1/passthrough.c b/sound/oss/emu10k1/passthrough.c
--- a/sound/oss/emu10k1/passthrough.c	Sat Apr 19 19:51:47 2003
+++ b/sound/oss/emu10k1/passthrough.c	Sat Apr 19 19:51:47 2003
@@ -32,7 +32,6 @@
 #include <linux/module.h>
 #include <linux/poll.h>
 #include <linux/slab.h>
-#include <linux/version.h>
 #include <linux/bitops.h>
 #include <asm/io.h>
 #include <linux/sched.h>
diff -Nru a/sound/oss/es1370.c b/sound/oss/es1370.c
--- a/sound/oss/es1370.c	Sat Apr 19 19:51:51 2003
+++ b/sound/oss/es1370.c	Sat Apr 19 19:51:51 2003
@@ -140,7 +140,6 @@
 
 /*****************************************************************************/
       
-#include <linux/version.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/string.h>
@@ -1054,11 +1053,11 @@
 }
 
 static /*const*/ struct file_operations es1370_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		es1370_ioctl_mixdev,
-	open:		es1370_open_mixdev,
-	release:	es1370_release_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= es1370_ioctl_mixdev,
+	.open		= es1370_open_mixdev,
+	.release	= es1370_release_mixdev,
 };
 
 /* --------------------------------------------------------------------- */
@@ -1816,15 +1815,15 @@
 }
 
 static /*const*/ struct file_operations es1370_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		es1370_read,
-	write:		es1370_write,
-	poll:		es1370_poll,
-	ioctl:		es1370_ioctl,
-	mmap:		es1370_mmap,
-	open:		es1370_open,
-	release:	es1370_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= es1370_read,
+	.write		= es1370_write,
+	.poll		= es1370_poll,
+	.ioctl		= es1370_ioctl,
+	.mmap		= es1370_mmap,
+	.open		= es1370_open,
+	.release	= es1370_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2240,14 +2239,14 @@
 }
 
 static /*const*/ struct file_operations es1370_dac_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	write:		es1370_write_dac,
-	poll:		es1370_poll_dac,
-	ioctl:		es1370_ioctl_dac,
-	mmap:		es1370_mmap_dac,
-	open:		es1370_open_dac,
-	release:	es1370_release_dac,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.write		= es1370_write_dac,
+	.poll		= es1370_poll_dac,
+	.ioctl		= es1370_ioctl_dac,
+	.mmap		= es1370_mmap_dac,
+	.open		= es1370_open_dac,
+	.release	= es1370_release_dac,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2513,13 +2512,13 @@
 }
 
 static /*const*/ struct file_operations es1370_midi_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		es1370_midi_read,
-	write:		es1370_midi_write,
-	poll:		es1370_midi_poll,
-	open:		es1370_midi_open,
-	release:	es1370_midi_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= es1370_midi_read,
+	.write		= es1370_midi_write,
+	.poll		= es1370_midi_poll,
+	.open		= es1370_midi_open,
+	.release	= es1370_midi_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2732,10 +2731,10 @@
 MODULE_DEVICE_TABLE(pci, id_table);
 
 static struct pci_driver es1370_driver = {
-	name: "es1370",
-	id_table: id_table,
-	probe: es1370_probe,
-	remove: es1370_remove
+	.name		= "es1370",
+	.id_table	= id_table,
+	.probe		= es1370_probe,
+	.remove		= 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	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/es1371.c	Sat Apr 19 19:51:49 2003
@@ -109,7 +109,6 @@
 
 /*****************************************************************************/
       
-#include <linux/version.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/string.h>
@@ -1243,11 +1242,11 @@
 }
 
 static /*const*/ struct file_operations es1371_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		es1371_ioctl_mixdev,
-	open:		es1371_open_mixdev,
-	release:	es1371_release_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= es1371_ioctl_mixdev,
+	.open		= es1371_open_mixdev,
+	.release	= es1371_release_mixdev,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2004,15 +2003,15 @@
 }
 
 static /*const*/ struct file_operations es1371_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		es1371_read,
-	write:		es1371_write,
-	poll:		es1371_poll,
-	ioctl:		es1371_ioctl,
-	mmap:		es1371_mmap,
-	open:		es1371_open,
-	release:	es1371_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= es1371_read,
+	.write		= es1371_write,
+	.poll		= es1371_poll,
+	.ioctl		= es1371_ioctl,
+	.mmap		= es1371_mmap,
+	.open		= es1371_open,
+	.release	= es1371_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2418,14 +2417,14 @@
 }
 
 static /*const*/ struct file_operations es1371_dac_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	write:		es1371_write_dac,
-	poll:		es1371_poll_dac,
-	ioctl:		es1371_ioctl_dac,
-	mmap:		es1371_mmap_dac,
-	open:		es1371_open_dac,
-	release:	es1371_release_dac,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.write		= es1371_write_dac,
+	.poll		= es1371_poll_dac,
+	.ioctl		= es1371_ioctl_dac,
+	.mmap		= es1371_mmap_dac,
+	.open		= es1371_open_dac,
+	.release	= es1371_release_dac,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2690,13 +2689,13 @@
 }
 
 static /*const*/ struct file_operations es1371_midi_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		es1371_midi_read,
-	write:		es1371_midi_write,
-	poll:		es1371_midi_poll,
-	open:		es1371_midi_open,
-	release:	es1371_midi_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= es1371_midi_read,
+	.write		= es1371_midi_write,
+	.poll		= es1371_midi_poll,
+	.open		= es1371_midi_open,
+	.release	= es1371_midi_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -3036,10 +3035,10 @@
 MODULE_DEVICE_TABLE(pci, id_table);
 
 static struct pci_driver es1371_driver = {
-	name: "es1371",
-	id_table: id_table,
-	probe: es1371_probe,
-	remove: es1371_remove
+	.name		= "es1371",
+	.id_table	= id_table,
+	.probe		= es1371_probe,
+	.remove		= 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	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/esssolo1.c	Sat Apr 19 19:51:28 2003
@@ -87,7 +87,6 @@
 
 /*****************************************************************************/
       
-#include <linux/version.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/string.h>
@@ -951,11 +950,11 @@
 }
 
 static /*const*/ struct file_operations solo1_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		solo1_ioctl_mixdev,
-	open:		solo1_open_mixdev,
-	release:	solo1_release_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= solo1_ioctl_mixdev,
+	.open		= solo1_open_mixdev,
+	.release	= solo1_release_mixdev,
 };
 
 /* --------------------------------------------------------------------- */
@@ -1650,15 +1649,15 @@
 }
 
 static /*const*/ struct file_operations solo1_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		solo1_read,
-	write:		solo1_write,
-	poll:		solo1_poll,
-	ioctl:		solo1_ioctl,
-	mmap:		solo1_mmap,
-	open:		solo1_open,
-	release:	solo1_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= solo1_read,
+	.write		= solo1_write,
+	.poll		= solo1_poll,
+	.ioctl		= solo1_ioctl,
+	.mmap		= solo1_mmap,
+	.open		= solo1_open,
+	.release	= solo1_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2001,13 +2000,13 @@
 }
 
 static /*const*/ struct file_operations solo1_midi_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		solo1_midi_read,
-	write:		solo1_midi_write,
-	poll:		solo1_midi_poll,
-	open:		solo1_midi_open,
-	release:	solo1_midi_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= solo1_midi_read,
+	.write		= solo1_midi_write,
+	.poll		= solo1_midi_poll,
+	.open		= solo1_midi_open,
+	.release	= solo1_midi_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2189,11 +2188,11 @@
 }
 
 static /*const*/ struct file_operations solo1_dmfm_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		solo1_dmfm_ioctl,
-	open:		solo1_dmfm_open,
-	release:	solo1_dmfm_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= solo1_dmfm_ioctl,
+	.open		= solo1_dmfm_open,
+	.release	= solo1_dmfm_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2449,12 +2448,12 @@
 MODULE_DEVICE_TABLE(pci, id_table);
 
 static struct pci_driver solo1_driver = {
-	name: "ESS Solo1",
-	id_table: id_table,
-	probe: solo1_probe,
-	remove: solo1_remove,
-	suspend: solo1_suspend,
-	resume: solo1_resume
+	.name		= "ESS Solo1",
+	.id_table	= id_table,
+	.probe		= solo1_probe,
+	.remove		= solo1_remove,
+	.suspend	= solo1_suspend,
+	.resume		= solo1_resume,
 };
 
 
diff -Nru a/sound/oss/gus_midi.c b/sound/oss/gus_midi.c
--- a/sound/oss/gus_midi.c	Sat Apr 19 19:51:51 2003
+++ b/sound/oss/gus_midi.c	Sat Apr 19 19:51:51 2003
@@ -26,7 +26,6 @@
 static int      my_dev;
 static int      output_used = 0;
 static volatile unsigned char gus_midi_control;
-static spinlock_t lock=SPIN_LOCK_UNLOCKED;
 static void     (*midi_input_intr) (int dev, unsigned char data);
 
 static unsigned char tmp_queue[256];
@@ -35,6 +34,7 @@
 static volatile unsigned char qhead, qtail;
 extern int      gus_base, gus_irq, gus_dma;
 extern int     *gus_osp;
+extern spinlock_t gus_lock;
 
 static int GUS_MIDI_STATUS(void)
 {
@@ -76,7 +76,7 @@
 
 	output_used = 1;
 
-	spin_lock_irqsave(&lock, flags);
+	spin_lock_irqsave(&gus_lock, flags);
 
 	if (GUS_MIDI_STATUS() & MIDI_XMIT_EMPTY)
 	{
@@ -92,7 +92,7 @@
 		outb((gus_midi_control), u_MidiControl);
 	}
 
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 	return ok;
 }
 
@@ -113,14 +113,14 @@
 	/*
 	 * Drain the local queue first
 	 */
-	spin_lock_irqsave(&lock, flags);
+	spin_lock_irqsave(&gus_lock, flags);
 
 	while (qlen && dump_to_midi(tmp_queue[qhead]))
 	{
 		qlen--;
 		qhead++;
 	}
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 
 	/*
 	 *	Output the byte if the local queue is empty.
@@ -140,13 +140,13 @@
 		return 0;	/*
 				 * Local queue full
 				 */
-	spin_lock_irqsave(&lock, flags);
+	spin_lock_irqsave(&gus_lock, flags);
 
 	tmp_queue[qtail] = midi_byte;
 	qlen++;
 	qtail++;
 
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 	return 1;
 }
 
@@ -171,14 +171,14 @@
 	if (!output_used)
 		return 0;
 
-	spin_lock_irqsave(&lock, flags);
+	spin_lock_irqsave(&gus_lock, flags);
 
 	if (qlen && dump_to_midi(tmp_queue[qhead]))
 	{
 		qlen--;
 		qhead++;
 	}
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 	return (qlen > 0) || !(GUS_MIDI_STATUS() & MIDI_XMIT_EMPTY);
 }
 
@@ -188,17 +188,17 @@
 
 static struct midi_operations gus_midi_operations =
 {
-	owner:		THIS_MODULE,
-	info:		{"Gravis UltraSound Midi", 0, 0, SNDCARD_GUS},
-	converter:	&std_midi_synth,
-	in_info:	{0},
-	open:		gus_midi_open,
-	close:		gus_midi_close,
-	outputc:	gus_midi_out,
-	start_read:	gus_midi_start_read,
-	end_read:	gus_midi_end_read,
-	kick:		gus_midi_kick,
-	buffer_status:	gus_midi_buffer_status,
+	.owner		= THIS_MODULE,
+	.info		= {"Gravis UltraSound Midi", 0, 0, SNDCARD_GUS},
+	.converter	= &std_midi_synth,
+	.in_info	= {0},
+	.open		= gus_midi_open,
+	.close		= gus_midi_close,
+	.outputc	= gus_midi_out,
+	.start_read	= gus_midi_start_read,
+	.end_read	= gus_midi_end_read,
+	.kick		= gus_midi_kick,
+	.buffer_status	= gus_midi_buffer_status,
 };
 
 void __init gus_midi_init(struct address_info *hw_config)
@@ -224,7 +224,7 @@
 	volatile unsigned char stat, data;
 	int timeout = 10;
 
-	spin_lock(&lock);
+	spin_lock(&gus_lock);
 
 	while (timeout-- > 0 && (stat = GUS_MIDI_STATUS()) & (MIDI_RCV_FULL | MIDI_XMIT_EMPTY))
 	{
@@ -252,5 +252,5 @@
 			}
 		}
 	}
-	spin_unlock(&lock);
+	spin_unlock(&gus_lock);
 }
diff -Nru a/sound/oss/gus_wave.c b/sound/oss/gus_wave.c
--- a/sound/oss/gus_wave.c	Sat Apr 19 19:51:29 2003
+++ b/sound/oss/gus_wave.c	Sat Apr 19 19:51:29 2003
@@ -139,7 +139,7 @@
 static unsigned long pcm_current_buf;
 static int      pcm_current_count;
 static int      pcm_current_intrflag;
-static spinlock_t lock=SPIN_LOCK_UNLOCKED;
+spinlock_t gus_lock=SPIN_LOCK_UNLOCKED;
 
 extern int     *gus_osp;
 
@@ -469,7 +469,7 @@
 {
 	unsigned long   flags;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 	gus_voice_volume(0);
 	gus_voice_off();
@@ -478,7 +478,7 @@
 	gus_write8(0x0d, 0x03);	/* Ramping off */
 	voice_alloc->map[voice] = 0;
 	voice_alloc->alloc_times[voice] = 0;
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 
 }
 
@@ -512,10 +512,10 @@
 
 	if (voices[voice].mode & WAVE_SUSTAIN_ON && voices[voice].env_phase == 2)
 	{
-		spin_lock_irqsave(&lock,flags);
+		spin_lock_irqsave(&gus_lock,flags);
 		gus_select_voice(voice);
 		gus_rampoff();
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		return;
 		/*
 		 * Sustain phase begins. Continue envelope after receiving note off.
@@ -533,7 +533,7 @@
 	vol = voices[voice].initial_volume * voices[voice].env_offset[phase] / 255;
 	rate = voices[voice].env_rate[phase];
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 
 	gus_voice_volume(prev_vol);
@@ -545,7 +545,7 @@
 
 	if (((vol - prev_vol) / 64) == 0)	/* No significant volume change */
 	{
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		step_envelope(voice);		/* Continue the envelope on the next step */
 		return;
 	}
@@ -564,7 +564,7 @@
 		gus_rampon(0x60);	/* Decreasing volume, with IRQ */
 	}
 	voices[voice].current_volume = vol;
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 static void init_envelope(int voice)
@@ -595,14 +595,14 @@
 	int instr_no = sample_map[voice], is16bits;
 	long int flags;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 
 	if (instr_no < 0 || instr_no > MAX_SAMPLE)
 	{
 		gus_write8(0x00, 0x03);	/* Hard stop */
 		voice_alloc->map[voice] = 0;
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		return;
 	}
 	is16bits = (samples[instr_no].mode & WAVE_16_BITS) ? 1 : 0;	/* 8 or 16 bits */
@@ -610,7 +610,7 @@
 	if (voices[voice].mode & WAVE_ENVELOPES)
 	{
 		start_release(voice);
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		return;
 	}
 	/*
@@ -621,14 +621,14 @@
 		gus_voice_off();
 		gus_rampoff();
 		gus_voice_init(voice);
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		return;
 	}
 	gus_ramp_range(65, 4030);
 	gus_ramp_rate(2, 4);
 	gus_rampon(0x40 | 0x20);	/* Down, once, with IRQ */
 	voices[voice].volume_irq_mode = VMODE_HALT;
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 static void gus_reset(void)
@@ -660,7 +660,7 @@
 		0, 1, 0, 2, 0, 3, 4, 5
 	};
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_write8(0x4c, 0);	/* Reset GF1 */
 	gus_delay();
 	gus_delay();
@@ -799,7 +799,7 @@
 
 	if (iw_mode)
 		gus_write8(0x19, gus_read8(0x19) | 0x01);
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 
@@ -1108,16 +1108,16 @@
 {
 	unsigned long flags;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	/* voice_alloc->map[voice] = 0xffff; */
 	if (voices[voice].volume_irq_mode == VMODE_START_NOTE)
 	{
 		voices[voice].kill_pending = 1;
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 	}
 	else
 	{
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		gus_voice_fade(voice);
 	}
 
@@ -1175,7 +1175,7 @@
 	compute_volume(voice, volume);
 	voices[voice].current_volume = voices[voice].initial_volume;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	/*
 	 * CAUTION! Interrupts disabled. Enable them before returning
 	 */
@@ -1189,7 +1189,7 @@
 	{
 		gus_rampoff();
 		gus_voice_volume(target);
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		return;
 	}
 	if (ramp_time == FAST_RAMP)
@@ -1202,7 +1202,7 @@
 	{
 		gus_rampoff();
 		gus_voice_volume(target);
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 		return;
 	}
 	if (target > curr)
@@ -1220,7 +1220,7 @@
 		gus_ramp_range(target, curr);
 		gus_rampon(0x40);	/* Ramp down, once, no irq */
 	}
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 static void dynamic_volume_change(int voice)
@@ -1228,10 +1228,10 @@
 	unsigned char status;
 	unsigned long flags;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 	status = gus_read8(0x00);	/* Get voice status */
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 
 	if (status & 0x03)
 		return;		/* Voice was not running */
@@ -1246,10 +1246,10 @@
 	 * Voice is running and has envelopes.
 	 */
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 	status = gus_read8(0x0d);	/* Ramping status */
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 
 	if (status & 0x03)	/* Sustain phase? */
 	{
@@ -1281,10 +1281,10 @@
 				freq = compute_finetune(voices[voice].orig_freq, value, voices[voice].bender_range, 0);
 				voices[voice].current_freq = freq;
 
-				spin_lock_irqsave(&lock,flags);
+				spin_lock_irqsave(&gus_lock,flags);
 				gus_select_voice(voice);
 				gus_voice_freq(freq);
-				spin_unlock_irqrestore(&lock,flags);
+				spin_unlock_irqrestore(&gus_lock,flags);
 			}
 			break;
 
@@ -1441,12 +1441,12 @@
 			((sample_ptrs[sample] + samples[sample].len) / GUS_BANK_SIZE))
 				printk(KERN_ERR "GUS: Sample address error\n");
 	}
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 	gus_voice_off();
 	gus_rampoff();
 
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 
 	if (voices[voice].mode & WAVE_ENVELOPES)
 	{
@@ -1458,7 +1458,7 @@
 		compute_and_set_volume(voice, volume, 0);
 	}
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 
 	if (samples[sample].mode & WAVE_LOOP_BACK)
@@ -1498,7 +1498,7 @@
 	gus_voice_freq(freq);
 	gus_voice_balance(pan);
 	gus_voice_on(mode);
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 
 	return 0;
 }
@@ -1515,7 +1515,7 @@
 	int mode;
 	int ret_val = 0;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	if (note_num == 255)
 	{
 		if (voices[voice].volume_irq_mode == VMODE_START_NOTE)
@@ -1541,10 +1541,10 @@
 
 		if (voices[voice].sample_pending >= 0)
 		{
-			spin_unlock_irqrestore(&lock,flags);	/* Run temporarily with interrupts enabled */
+			spin_unlock_irqrestore(&gus_lock,flags);	/* Run temporarily with interrupts enabled */
 			guswave_set_instr(voices[voice].dev_pending, voice, voices[voice].sample_pending);
 			voices[voice].sample_pending = -1;
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);	/* Reselect the voice (just to be sure) */
 		}
 		if ((mode & 0x01) || (int) ((gus_read16(0x09) >> 4) < (unsigned) 2065))
@@ -1564,7 +1564,7 @@
 			gus_rampon(0x20 | 0x40);	/* Ramp down, once, irq */
 		}
 	}
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 	return ret_val;
 }
 
@@ -1807,7 +1807,7 @@
 					   blk_sz))
 				return -EFAULT;
 
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_write8(0x41, 0);	/* Disable GF1 DMA */
 			DMAbuf_start_dma(gus_devnum, audio_devs[gus_devnum]->dmap_out->raw_buf_phys,
 				blk_sz, DMA_MODE_WRITE);
@@ -1864,7 +1864,7 @@
 			active_device = GUS_DEV_WAVE;
 			gus_write8(0x41, dma_command);	/* Lets go luteet (=bugs) */
 
-			spin_unlock_irqrestore(&lock,flags); /* opens a race */
+			spin_unlock_irqrestore(&gus_lock,flags); /* opens a race */
 			if (!interruptible_sleep_on_timeout(&dram_sleeper, HZ))
 				printk("GUS: DMA Transfer timed out\n");
 		}
@@ -1905,10 +1905,10 @@
 	switch (cmd)
 	{
 		case _GUS_NUMVOICES:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_select_max_voices(p1);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOICESAMPLE:
@@ -1916,18 +1916,18 @@
 			break;
 
 		case _GUS_VOICEON:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			p1 &= ~0x20;	/* Don't allow interrupts */
 			gus_voice_on(p1);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOICEOFF:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_voice_off();
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOICEFADE:
@@ -1935,32 +1935,32 @@
 			break;
 
 		case _GUS_VOICEMODE:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			p1 &= ~0x20;	/* Don't allow interrupts */
 			gus_voice_mode(p1);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOICEBALA:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_voice_balance(p1);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOICEFREQ:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_voice_freq(plong);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOICEVOL:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_voice_volume(p1);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOICEVOL2:	/* Just update the software voice level */
@@ -1970,48 +1970,48 @@
 		case _GUS_RAMPRANGE:
 			if (voices[voice].mode & WAVE_ENVELOPES)
 				break;	/* NO-NO */
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_ramp_range(p1, p2);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_RAMPRATE:
 			if (voices[voice].mode & WAVE_ENVELOPES)
 				break;	/* NJET-NJET */
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_ramp_rate(p1, p2);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_RAMPMODE:
 			if (voices[voice].mode & WAVE_ENVELOPES)
 				break;	/* NO-NO */
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			p1 &= ~0x20;	/* Don't allow interrupts */
 			gus_ramp_mode(p1);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_RAMPON:
 			if (voices[voice].mode & WAVE_ENVELOPES)
 				break;	/* EI-EI */
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			p1 &= ~0x20;	/* Don't allow interrupts */
 			gus_rampon(p1);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_RAMPOFF:
 			if (voices[voice].mode & WAVE_ENVELOPES)
 				break;	/* NEJ-NEJ */
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_rampoff();
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		case _GUS_VOLUME_SCALE:
@@ -2020,10 +2020,10 @@
 			break;
 
 		case _GUS_VOICE_POS:
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_set_voice_pos(voice, plong);
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			break;
 
 		default:
@@ -2214,12 +2214,12 @@
 	if (pcm_active && pcm_opened)
 		for (voice = 0; voice < gus_audio_channels; voice++)
 		{
-			spin_lock_irqsave(&lock,flags);
+			spin_lock_irqsave(&gus_lock,flags);
 			gus_select_voice(voice);
 			gus_rampoff();
 			gus_voice_volume(1530 + (25 * gus_pcm_volume));
 			gus_ramp_range(65, 1530 + (25 * gus_pcm_volume));
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 		}
 }
 
@@ -2267,7 +2267,7 @@
 			if (chn == 0)
 				ramp_mode[chn] = 0x04;	/* Enable rollover bit */
 		}
-		spin_lock_irqsave(&lock,flags);
+		spin_lock_irqsave(&gus_lock,flags);
 		gus_select_voice(chn);
 		gus_voice_freq(speed);
 
@@ -2304,17 +2304,17 @@
 					 0, is16bits);	/* Loop end location */
 		else
 			mode[chn] |= 0x08;	/* Enable looping */
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 	}
 	for (chn = 0; chn < gus_audio_channels; chn++)
 	{
-		spin_lock_irqsave(&lock,flags);
+		spin_lock_irqsave(&gus_lock,flags);
 		gus_select_voice(chn);
 		gus_write8(0x0d, ramp_mode[chn]);
 		if (iw_mode)
 			gus_write8(0x15, 0x00);	/* Reset voice deactivate bit of SMSI */
 		gus_voice_on(mode[chn]);
-		spin_unlock_irqrestore(&lock,flags);
+		spin_unlock_irqrestore(&gus_lock,flags);
 	}
 	pcm_active = 1;
 }
@@ -2336,7 +2336,7 @@
 	unsigned char dma_command;
 	unsigned long address, hold_address;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 
 	count = total_count / gus_audio_channels;
 
@@ -2401,7 +2401,7 @@
 		active_device = GUS_DEV_PCM_CONTINUE;
 	}
 
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 static void gus_uninterleave8(char *buf, int l)
@@ -2463,7 +2463,7 @@
 	unsigned long flags;
 	unsigned char mode;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 
 	DMAbuf_start_dma(dev, buf, count, DMA_MODE_READ);
 	mode = 0xa0;		/* DMA IRQ enabled, invert MSB */
@@ -2475,7 +2475,7 @@
 	mode |= 0x01;		/* DMA enable */
 
 	gus_write8(0x49, mode);
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 static int gus_audio_prepare_for_input(int dev, int bsize, int bcount)
@@ -2535,16 +2535,16 @@
 
 static struct audio_driver gus_audio_driver =
 {
-	owner:		THIS_MODULE,
-	open:		gus_audio_open,
-	close:		gus_audio_close,
-	output_block:	gus_audio_output_block,
-	start_input:	gus_audio_start_input,
-	ioctl:		gus_audio_ioctl,
-	prepare_for_input:	gus_audio_prepare_for_input,
-	prepare_for_output:	gus_audio_prepare_for_output,
-	halt_io:	gus_audio_reset,
-	local_qlen:	gus_local_qlen,
+	.owner			= THIS_MODULE,
+	.open			= gus_audio_open,
+	.close			= gus_audio_close,
+	.output_block		= gus_audio_output_block,
+	.start_input		= gus_audio_start_input,
+	.ioctl			= gus_audio_ioctl,
+	.prepare_for_input	= gus_audio_prepare_for_input,
+	.prepare_for_output	= gus_audio_prepare_for_output,
+	.halt_io		= gus_audio_reset,
+	.local_qlen		= gus_local_qlen,
 };
 
 static void guswave_setup_voice(int dev, int voice, int chn)
@@ -2571,10 +2571,10 @@
 	freq = compute_finetune(voices[voice].orig_freq, value - 8192, voices[voice].bender_range, 0);
 	voices[voice].current_freq = freq;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	gus_select_voice(voice);
 	gus_voice_freq(freq);
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 static int guswave_alloc(int dev, int chn, int note, struct voice_alloc_info *alloc)
@@ -2623,28 +2623,28 @@
 
 static struct synth_operations guswave_operations =
 {
-	owner:		THIS_MODULE,
-	id:		"GUS",
-	info:		&gus_info,
-	midi_dev:	0,
-	synth_type:	SYNTH_TYPE_SAMPLE,
-	synth_subtype:	SAMPLE_TYPE_GUS,
-	open:		guswave_open,
-	close:		guswave_close,
-	ioctl:		guswave_ioctl,
-	kill_note:	guswave_kill_note,
-	start_note:	guswave_start_note,
-	set_instr:	guswave_set_instr,
-	reset:		guswave_reset,
-	hw_control:	guswave_hw_control,
-	load_patch:	guswave_load_patch,
-	aftertouch:	guswave_aftertouch,
-	controller:	guswave_controller,
-	panning:	guswave_panning,
-	volume_method:	guswave_volume_method,
-	bender:		guswave_bender,
-	alloc_voice:	guswave_alloc,
-	setup_voice:	guswave_setup_voice
+	.owner		= THIS_MODULE,
+	.id		= "GUS",
+	.info		= &gus_info,
+	.midi_dev	= 0,
+	.synth_type	= SYNTH_TYPE_SAMPLE,
+	.synth_subtype	= SAMPLE_TYPE_GUS,
+	.open		= guswave_open,
+	.close		= guswave_close,
+	.ioctl		= guswave_ioctl,
+	.kill_note	= guswave_kill_note,
+	.start_note	= guswave_start_note,
+	.set_instr	= guswave_set_instr,
+	.reset		= guswave_reset,
+	.hw_control	= guswave_hw_control,
+	.load_patch	= guswave_load_patch,
+	.aftertouch	= guswave_aftertouch,
+	.controller	= guswave_controller,
+	.panning	= guswave_panning,
+	.volume_method	= guswave_volume_method,
+	.bender		= guswave_bender,
+	.alloc_voice	= guswave_alloc,
+	.setup_voice	= guswave_setup_voice
 };
 
 static void set_input_volumes(void)
@@ -2655,7 +2655,7 @@
 	if (have_gus_max)	/* Don't disturb GUS MAX */
 		return;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 
 	/*
 	 *    Enable channels having vol > 10%
@@ -2681,7 +2681,7 @@
 	mix_image |= mask & 0x07;
 	outb((mix_image), u_Mixer);
 
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 #define MIX_DEVS	(SOUND_MASK_MIC|SOUND_MASK_LINE| \
@@ -2815,10 +2815,10 @@
 
 static struct mixer_operations gus_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"GUS",
-	name:	"Gravis Ultrasound",
-	ioctl:	gus_default_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "GUS",
+	.name	= "Gravis Ultrasound",
+	.ioctl	= gus_default_mixer_ioctl
 };
 
 static int __init gus_default_mixer_init(void)
@@ -2890,10 +2890,10 @@
 	 *  Versions < 3.6 don't have the digital ASIC. Try to probe it first.
 	 */
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 	outb((0x20), gus_base + 0x0f);
 	val = inb(gus_base + 0x0f);
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 
 	if (gus_pnp_flag || (val != 0xff && (val & 0x06)))	/* Should be 0x02?? */
 	{
@@ -3124,7 +3124,7 @@
 	unsigned char   tmp;
 	int             mode, parm;
 
-	spin_lock(&lock);
+	spin_lock(&gus_lock);
 	gus_select_voice(voice);
 
 	tmp = gus_read8(0x00);
@@ -3200,7 +3200,7 @@
 		default:
 			break;
 	}
-	spin_unlock(&lock);
+	spin_unlock(&gus_lock);
 }
 
 static void do_volume_irq(int voice)
@@ -3209,7 +3209,7 @@
 	int mode, parm;
 	unsigned long flags;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&gus_lock,flags);
 
 	gus_select_voice(voice);
 	tmp = gus_read8(0x0d);
@@ -3227,18 +3227,18 @@
 		case VMODE_HALT:	/* Decay phase finished */
 			if (iw_mode)
 				gus_write8(0x15, 0x02);	/* Set voice deactivate bit of SMSI */
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			gus_voice_init(voice);
 			break;
 
 		case VMODE_ENVELOPE:
 			gus_rampoff();
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			step_envelope(voice);
 			break;
 
 		case VMODE_START_NOTE:
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 			guswave_start_note2(voices[voice].dev_pending, voice,
 				      voices[voice].note_pending, voices[voice].volume_pending);
 			if (voices[voice].kill_pending)
@@ -3254,7 +3254,7 @@
 			break;
 
 		default:
-			spin_unlock_irqrestore(&lock,flags);
+			spin_unlock_irqrestore(&gus_lock,flags);
 	}
 }
 /* called in irq context */
diff -Nru a/sound/oss/i810_audio.c b/sound/oss/i810_audio.c
--- a/sound/oss/i810_audio.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/i810_audio.c	Sat Apr 19 19:51:49 2003
@@ -79,7 +79,6 @@
  */
  
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/string.h>
 #include <linux/ctype.h>
 #include <linux/ioport.h>
@@ -2554,15 +2553,15 @@
 }
 
 static /*const*/ struct file_operations i810_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		i810_read,
-	write:		i810_write,
-	poll:		i810_poll,
-	ioctl:		i810_ioctl,
-	mmap:		i810_mmap,
-	open:		i810_open,
-	release:	i810_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= i810_read,
+	.write		= i810_write,
+	.poll		= i810_poll,
+	.ioctl		= i810_ioctl,
+	.mmap		= i810_mmap,
+	.open		= i810_open,
+	.release	= i810_release,
 };
 
 /* Write AC97 codec registers */
@@ -2690,10 +2689,10 @@
 }
 
 static /*const*/ struct file_operations i810_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		i810_ioctl_mixdev,
-	open:		i810_open_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= i810_ioctl_mixdev,
+	.open		= i810_open_mixdev,
 };
 
 /* AC97 codec initialisation.  These small functions exist so we don't
@@ -3430,13 +3429,13 @@
 #define I810_MODULE_NAME "intel810_audio"
 
 static struct pci_driver i810_pci_driver = {
-	name:		I810_MODULE_NAME,
-	id_table:	i810_pci_tbl,
-	probe:		i810_probe,
-	remove:		__devexit_p(i810_remove),
+	.name		= I810_MODULE_NAME,
+	.id_table	= i810_pci_tbl,
+	.probe		= i810_probe,
+	.remove		= __devexit_p(i810_remove),
 #ifdef CONFIG_PM
-	suspend:	i810_pm_suspend,
-	resume:		i810_pm_resume,
+	.suspend	= i810_pm_suspend,
+	.resume		= i810_pm_resume,
 #endif /* CONFIG_PM */
 };
 
diff -Nru a/sound/oss/ics2101.c b/sound/oss/ics2101.c
--- a/sound/oss/ics2101.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/ics2101.c	Sat Apr 19 19:51:28 2003
@@ -29,7 +29,7 @@
 
 extern int     *gus_osp;
 extern int      gus_base;
-extern spinlock_t lock;
+extern spinlock_t gus_lock;
 static int      volumes[ICS_MIXDEVS];
 static int      left_fix[ICS_MIXDEVS] =
 {1, 1, 1, 2, 1, 2};
@@ -87,12 +87,12 @@
 		attn_addr |= 0x03;
 	}
 
-	spin_lock_irqsave(&lock, flags);
+	spin_lock_irqsave(&gus_lock, flags);
 	outb((ctrl_addr), u_MixSelect);
 	outb((selector[dev]), u_MixData);
 	outb((attn_addr), u_MixSelect);
 	outb(((unsigned char) vol), u_MixData);
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&gus_lock,flags);
 }
 
 static int set_volumes(int dev, int vol)
@@ -209,10 +209,10 @@
 
 static struct mixer_operations ics2101_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"ICS2101",
-	name:	"ICS2101 Multimedia Mixer",
-	ioctl:	ics2101_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "ICS2101",
+	.name	= "ICS2101 Multimedia Mixer",
+	.ioctl	= ics2101_mixer_ioctl
 };
 
 int __init ics2101_mixer_init(void)
diff -Nru a/sound/oss/ite8172.c b/sound/oss/ite8172.c
--- a/sound/oss/ite8172.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/ite8172.c	Sat Apr 19 19:51:28 2003
@@ -51,7 +51,6 @@
  *  Revision history
  *    02.08.2001  0.1   Initial release
  */
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
@@ -863,11 +862,11 @@
 }
 
 static /*const*/ struct file_operations it8172_mixer_fops = {
-    owner:	THIS_MODULE,
-    llseek:	no_llseek,
-    ioctl:	it8172_ioctl_mixdev,
-    open:	it8172_open_mixdev,
-    release:	it8172_release_mixdev,
+    .owner	= THIS_MODULE,
+    .llseek	= no_llseek,
+    .ioctl	= it8172_ioctl_mixdev,
+    .open	= it8172_open_mixdev,
+    .release	= it8172_release_mixdev,
 };
 
 /* --------------------------------------------------------------------- */
@@ -1630,15 +1629,15 @@
 }
 
 static /*const*/ struct file_operations it8172_audio_fops = {
-    owner:	THIS_MODULE,
-    llseek:	no_llseek,
-    read:	it8172_read,
-    write:	it8172_write,
-    poll:	it8172_poll,
-    ioctl:	it8172_ioctl,
-    mmap:	it8172_mmap,
-    open:	it8172_open,
-    release:	it8172_release,
+    .owner	= THIS_MODULE,
+    .llseek	= no_llseek,
+    .read	= it8172_read,
+    .write	= it8172_write,
+    .poll	= it8172_poll,
+    .ioctl	= it8172_ioctl,
+    .mmap	= it8172_mmap,
+    .open	= it8172_open,
+    .release	= it8172_release,
 };
 
 
@@ -1931,10 +1930,10 @@
 MODULE_DEVICE_TABLE(pci, id_table);
 
 static struct pci_driver it8172_driver = {
-    name: IT8172_MODULE_NAME,
-    id_table: id_table,
-    probe: it8172_probe,
-    remove: it8172_remove
+	.name		= IT8172_MODULE_NAME,
+	.id_table	= id_table,
+	.probe		= it8172_probe,
+	.remove		= it8172_remove,
 };
 
 static int __init init_it8172(void)
diff -Nru a/sound/oss/mad16.c b/sound/oss/mad16.c
--- a/sound/oss/mad16.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/mad16.c	Sat Apr 19 19:51:49 2003
@@ -537,7 +537,7 @@
 
 	for (i = 0xf8d; i <= 0xf93; i++) {
 		if (!c924pnp)
-			DDB(printk("port %03x = %02x\n", i, mad_read(i)))
+			DDB(printk("port %03x = %02x\n", i, mad_read(i)));
 		else
 			DDB(printk("port %03x = %02x\n", i-0x80, mad_read(i)));
 	}
@@ -600,7 +600,7 @@
 
 	for (i = 0xf8d; i <= 0xf93; i++) {
 		if (!c924pnp)
-			DDB(printk("port %03x after init = %02x\n", i, mad_read(i)))
+			DDB(printk("port %03x after init = %02x\n", i, mad_read(i)));
 		else
 			DDB(printk("port %03x after init = %02x\n", i-0x80, mad_read(i)));
 	}
diff -Nru a/sound/oss/maestro.c b/sound/oss/maestro.c
--- a/sound/oss/maestro.c	Sat Apr 19 19:51:50 2003
+++ b/sound/oss/maestro.c	Sat Apr 19 19:51:50 2003
@@ -205,7 +205,6 @@
 
 /*****************************************************************************/
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/sched.h>
 #include <linux/smp_lock.h>
@@ -2170,11 +2169,11 @@
 }
 
 static /*const*/ struct file_operations ess_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:         no_llseek,
-	ioctl:          ess_ioctl_mixdev,
-	open:           ess_open_mixdev,
-	release:        ess_release_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= ess_ioctl_mixdev,
+	.open		= ess_open_mixdev,
+	.release	= ess_release_mixdev,
 };
 
 /* --------------------------------------------------------------------- */
@@ -3106,15 +3105,15 @@
 }
 
 static struct file_operations ess_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:         no_llseek,
-	read:           ess_read,
-	write:          ess_write,
-	poll:           ess_poll,
-	ioctl:          ess_ioctl,
-	mmap:           ess_mmap,
-	open:           ess_open,
-	release:        ess_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= ess_read,
+	.write		= ess_write,
+	.poll		= ess_poll,
+	.ioctl		= ess_ioctl,
+	.mmap		= ess_mmap,
+	.open		= ess_open,
+	.release	= ess_release,
 };
 
 static int
diff -Nru a/sound/oss/midi_synth.h b/sound/oss/midi_synth.h
--- a/sound/oss/midi_synth.h	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/midi_synth.h	Sat Apr 19 19:51:28 2003
@@ -22,26 +22,26 @@
 
 static struct synth_operations std_midi_synth =
 {
-	owner:		THIS_MODULE,
-	id:		"MIDI",
-	info:		&std_synth_info,
-	midi_dev:	0,
-	synth_type:	SYNTH_TYPE_MIDI,
-	synth_subtype:	0,
-	open:		midi_synth_open,
-	close:		midi_synth_close,
-	ioctl:		midi_synth_ioctl,
-	kill_note:	midi_synth_kill_note,
-	start_note:	midi_synth_start_note,
-	set_instr:	midi_synth_set_instr,
-	reset:		midi_synth_reset,
-	hw_control:	midi_synth_hw_control,
-	load_patch:	midi_synth_load_patch,
-	aftertouch:	midi_synth_aftertouch,
-	controller:	midi_synth_controller,
-	panning:	midi_synth_panning,
-	bender:		midi_synth_bender,
-	setup_voice:	midi_synth_setup_voice,
-	send_sysex:	midi_synth_send_sysex
+	.owner		= THIS_MODULE,
+	.id		= "MIDI",
+	.info		= &std_synth_info,
+	.midi_dev	= 0,
+	.synth_type	= SYNTH_TYPE_MIDI,
+	.synth_subtype	= 0,
+	.open		= midi_synth_open,
+	.close		= midi_synth_close,
+	.ioctl		= midi_synth_ioctl,
+	.kill_note	= midi_synth_kill_note,
+	.start_note	= midi_synth_start_note,
+	.set_instr	= midi_synth_set_instr,
+	.reset		= midi_synth_reset,
+	.hw_control	= midi_synth_hw_control,
+	.load_patch	= midi_synth_load_patch,
+	.aftertouch	= midi_synth_aftertouch,
+	.controller	= midi_synth_controller,
+	.panning		= midi_synth_panning,
+	.bender		= midi_synth_bender,
+	.setup_voice	= midi_synth_setup_voice,
+	.send_sysex	= midi_synth_send_sysex
 };
 #endif
diff -Nru a/sound/oss/mpu401.c b/sound/oss/mpu401.c
--- a/sound/oss/mpu401.c	Sat Apr 19 19:51:50 2003
+++ b/sound/oss/mpu401.c	Sat Apr 19 19:51:50 2003
@@ -888,45 +888,45 @@
 
 static struct synth_operations mpu401_synth_proto =
 {
-	owner:		THIS_MODULE,
-	id:		"MPU401",
-	info:		NULL,
-	midi_dev:	0,
-	synth_type:	SYNTH_TYPE_MIDI,
-	synth_subtype:	0,
-	open:		mpu_synth_open,
-	close:		mpu_synth_close,
-	ioctl:		mpu_synth_ioctl,
-	kill_note:	midi_synth_kill_note,
-	start_note:	midi_synth_start_note,
-	set_instr:	midi_synth_set_instr,
-	reset:		midi_synth_reset,
-	hw_control:	midi_synth_hw_control,
-	load_patch:	midi_synth_load_patch,
-	aftertouch:	midi_synth_aftertouch,
-	controller:	midi_synth_controller,
-	panning:	midi_synth_panning,
-	bender:		midi_synth_bender,
-	setup_voice:	midi_synth_setup_voice,
-	send_sysex:	midi_synth_send_sysex
+	.owner		= THIS_MODULE,
+	.id		= "MPU401",
+	.info		= NULL,
+	.midi_dev	= 0,
+	.synth_type	= SYNTH_TYPE_MIDI,
+	.synth_subtype	= 0,
+	.open		= mpu_synth_open,
+	.close		= mpu_synth_close,
+	.ioctl		= mpu_synth_ioctl,
+	.kill_note	= midi_synth_kill_note,
+	.start_note	= midi_synth_start_note,
+	.set_instr	= midi_synth_set_instr,
+	.reset		= midi_synth_reset,
+	.hw_control	= midi_synth_hw_control,
+	.load_patch	= midi_synth_load_patch,
+	.aftertouch	= midi_synth_aftertouch,
+	.controller	= midi_synth_controller,
+	.panning	= midi_synth_panning,
+	.bender		= midi_synth_bender,
+	.setup_voice	= midi_synth_setup_voice,
+	.send_sysex	= midi_synth_send_sysex
 };
 
 static struct synth_operations *mpu401_synth_operations[MAX_MIDI_DEV];
 
 static struct midi_operations mpu401_midi_proto =
 {
-	owner:		THIS_MODULE,
-	info:		{"MPU-401 Midi", 0, MIDI_CAP_MPU401, SNDCARD_MPU401},
-	in_info:	{0},
-	open:		mpu401_open,
-	close:		mpu401_close,
-	ioctl:		mpu401_ioctl,
-	outputc:	mpu401_out,
-	start_read:	mpu401_start_read,
-	end_read:	mpu401_end_read,
-	kick:		mpu401_kick,
-	buffer_status:	mpu401_buffer_status,
-	prefix_cmd:	mpu401_prefix_cmd
+	.owner		= THIS_MODULE,
+	.info		= {"MPU-401 Midi", 0, MIDI_CAP_MPU401, SNDCARD_MPU401},
+	.in_info	= {0},
+	.open		= mpu401_open,
+	.close		= mpu401_close,
+	.ioctl		= mpu401_ioctl,
+	.outputc	= mpu401_out,
+	.start_read	= mpu401_start_read,
+	.end_read	= mpu401_end_read,
+	.kick		= mpu401_kick,
+	.buffer_status	= mpu401_buffer_status,
+	.prefix_cmd	= mpu401_prefix_cmd
 };
 
 static struct midi_operations mpu401_midi_operations[MAX_MIDI_DEV];
@@ -1619,16 +1619,16 @@
 
 static struct sound_timer_operations mpu_timer =
 {
-	owner:		THIS_MODULE,
-	info:		{"MPU-401 Timer", 0},
-	priority:	10,	/* Priority */
-	devlink:	0,	/* Local device link */
-	open:		mpu_timer_open,
-	close:		mpu_timer_close,
-	event:		mpu_timer_event,
-	get_time:	mpu_timer_get_time,
-	ioctl:		mpu_timer_ioctl,
-	arm_timer:	mpu_timer_arm
+	.owner		= THIS_MODULE,
+	.info		= {"MPU-401 Timer", 0},
+	.priority	= 10,	/* Priority */
+	.devlink	= 0,	/* Local device link */
+	.open		= mpu_timer_open,
+	.close		= mpu_timer_close,
+	.event		= mpu_timer_event,
+	.get_time	= mpu_timer_get_time,
+	.ioctl		= mpu_timer_ioctl,
+	.arm_timer	= mpu_timer_arm
 };
 
 static void mpu_timer_interrupt(void)
diff -Nru a/sound/oss/msnd_pinnacle.c b/sound/oss/msnd_pinnacle.c
--- a/sound/oss/msnd_pinnacle.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/msnd_pinnacle.c	Sat Apr 19 19:51:49 2003
@@ -40,7 +40,6 @@
 
 #include <linux/kernel.h>
 #include <linux/config.h>
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/types.h>
@@ -1081,12 +1080,12 @@
 }
 
 static struct file_operations dev_fileops = {
-	owner:		THIS_MODULE,
-	read:		dev_read,
-	write:		dev_write,
-	ioctl:		dev_ioctl,
-	open:		dev_open,
-	release:	dev_release,
+	.owner		= THIS_MODULE,
+	.read		= dev_read,
+	.write		= dev_write,
+	.ioctl		= dev_ioctl,
+	.open		= dev_open,
+	.release	= dev_release,
 };
 
 static int reset_dsp(void)
diff -Nru a/sound/oss/nec_vrc5477.c b/sound/oss/nec_vrc5477.c
--- a/sound/oss/nec_vrc5477.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/nec_vrc5477.c	Sat Apr 19 19:51:49 2003
@@ -61,7 +61,6 @@
  *    02.08.2001  0.1   Initial release
  */
 
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
@@ -896,11 +895,11 @@
 }
 
 static /*const*/ struct file_operations vrc5477_ac97_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		vrc5477_ac97_ioctl_mixdev,
-	open:		vrc5477_ac97_open_mixdev,
-	release:	vrc5477_ac97_release_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= vrc5477_ac97_ioctl_mixdev,
+	.open		= vrc5477_ac97_open_mixdev,
+	.release	= vrc5477_ac97_release_mixdev,
 };
 
 /* --------------------------------------------------------------------- */
@@ -1658,15 +1657,15 @@
 }
 
 static /*const*/ struct file_operations vrc5477_ac97_audio_fops = {
-	owner:	THIS_MODULE,
-	llseek:		no_llseek,
-	read:		vrc5477_ac97_read,
-	write:		vrc5477_ac97_write,
-	poll:		vrc5477_ac97_poll,
-	ioctl:		vrc5477_ac97_ioctl,
-	// mmap:	vrc5477_ac97_mmap,
-	open:		vrc5477_ac97_open,
-	release:	vrc5477_ac97_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= vrc5477_ac97_read,
+	.write		= vrc5477_ac97_write,
+	.poll		= vrc5477_ac97_poll,
+	.ioctl		= vrc5477_ac97_ioctl,
+	// .mmap	= vrc5477_ac97_mmap,
+	.open		= vrc5477_ac97_open,
+	.release	= vrc5477_ac97_release,
 };
 
 
@@ -1995,10 +1994,10 @@
 MODULE_DEVICE_TABLE(pci, id_table);
 
 static struct pci_driver vrc5477_ac97_driver = {
-	name: VRC5477_AC97_MODULE_NAME,
-	id_table: id_table,
-	probe: vrc5477_ac97_probe,
-	remove: vrc5477_ac97_remove
+	.name		= VRC5477_AC97_MODULE_NAME,
+	.id_table	= id_table,
+	.probe		= vrc5477_ac97_probe,
+	.remove		= vrc5477_ac97_remove,
 };
 
 static int __init init_vrc5477_ac97(void)
diff -Nru a/sound/oss/nm256_audio.c b/sound/oss/nm256_audio.c
--- a/sound/oss/nm256_audio.c	Sat Apr 19 19:51:47 2003
+++ b/sound/oss/nm256_audio.c	Sat Apr 19 19:51:47 2003
@@ -925,10 +925,10 @@
 }
 
 static struct mixer_operations nm256_mixer_operations = {
-    owner:	THIS_MODULE,
-    id:		"NeoMagic",
-    name:	"NM256AC97Mixer",
-    ioctl:	nm256_default_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "NeoMagic",
+	.name	= "NM256AC97Mixer",
+	.ioctl	= nm256_default_mixer_ioctl
 };
 
 /*
@@ -1632,16 +1632,16 @@
 
 static struct audio_driver nm256_audio_driver =
 {
-    owner:		THIS_MODULE,
-    open:		nm256_audio_open,
-    close:		nm256_audio_close,
-    output_block:	nm256_audio_output_block,
-    start_input:	nm256_audio_start_input,
-    ioctl:		nm256_audio_ioctl,
-    prepare_for_input:	nm256_audio_prepare_for_input,
-    prepare_for_output:nm256_audio_prepare_for_output,
-    halt_io:		nm256_audio_reset,
-    local_qlen:		nm256_audio_local_qlen,
+	.owner			= THIS_MODULE,
+	.open			= nm256_audio_open,
+	.close			= nm256_audio_close,
+	.output_block		= nm256_audio_output_block,
+	.start_input		= nm256_audio_start_input,
+	.ioctl			= nm256_audio_ioctl,
+	.prepare_for_input	= nm256_audio_prepare_for_input,
+	.prepare_for_output	= nm256_audio_prepare_for_output,
+	.halt_io		= nm256_audio_reset,
+	.local_qlen		= nm256_audio_local_qlen,
 };
 
 static struct pci_device_id nm256_pci_tbl[] __devinitdata = {
@@ -1656,10 +1656,10 @@
 
 
 struct pci_driver nm256_pci_driver = {
-	name:"nm256_audio",
-	id_table:nm256_pci_tbl,
-	probe:nm256_probe,
-	remove:nm256_remove,
+	.name		= "nm256_audio",
+	.id_table	= nm256_pci_tbl,
+	.probe		= nm256_probe,
+	.remove		= nm256_remove,
 };
 
 MODULE_PARM (usecache, "i");
diff -Nru a/sound/oss/opl3.c b/sound/oss/opl3.c
--- a/sound/oss/opl3.c	Sat Apr 19 19:51:48 2003
+++ b/sound/oss/opl3.c	Sat Apr 19 19:51:48 2003
@@ -1078,28 +1078,28 @@
 
 static struct synth_operations opl3_operations =
 {
-	owner:		THIS_MODULE,
-	id:		"OPL",
-	info:		NULL,
-	midi_dev:	0,
-	synth_type:	SYNTH_TYPE_FM,
-	synth_subtype:	FM_TYPE_ADLIB,
-	open:		opl3_open,
-	close:		opl3_close,
-	ioctl:		opl3_ioctl,
-	kill_note:	opl3_kill_note,
-	start_note:	opl3_start_note,
-	set_instr:	opl3_set_instr,
-	reset:		opl3_reset,
-	hw_control:	opl3_hw_control,
-	load_patch:	opl3_load_patch,
-	aftertouch:	opl3_aftertouch,
-	controller:	opl3_controller,
-	panning:	opl3_panning,
-	volume_method:	opl3_volume_method,
-	bender:		opl3_bender,
-	alloc_voice:	opl3_alloc_voice,
-	setup_voice:	opl3_setup_voice
+	.owner		= THIS_MODULE,
+	.id		= "OPL",
+	.info		= NULL,
+	.midi_dev	= 0,
+	.synth_type	= SYNTH_TYPE_FM,
+	.synth_subtype	= FM_TYPE_ADLIB,
+	.open		= opl3_open,
+	.close		= opl3_close,
+	.ioctl		= opl3_ioctl,
+	.kill_note	= opl3_kill_note,
+	.start_note	= opl3_start_note,
+	.set_instr	= opl3_set_instr,
+	.reset		= opl3_reset,
+	.hw_control	= opl3_hw_control,
+	.load_patch	= opl3_load_patch,
+	.aftertouch	= opl3_aftertouch,
+	.controller	= opl3_controller,
+	.panning	= opl3_panning,
+	.volume_method	= opl3_volume_method,
+	.bender		= opl3_bender,
+	.alloc_voice	= opl3_alloc_voice,
+	.setup_voice	= opl3_setup_voice
 };
 
 int opl3_init(int ioaddr, int *osp, struct module *owner)
diff -Nru a/sound/oss/opl3sa2.c b/sound/oss/opl3sa2.c
--- a/sound/oss/opl3sa2.c	Sat Apr 19 19:51:27 2003
+++ b/sound/oss/opl3sa2.c	Sat Apr 19 19:51:27 2003
@@ -58,6 +58,10 @@
  * Zwane Mwaikambo	   Added PM support. (Dec 4 2001)
  *
  * Adam Belay              Converted driver to new PnP Layer (Oct 12, 2002)
+ * Zwane Mwaikambo	   Code, data structure cleanups. (Feb 15 2002)
+ * Zwane Mwaikambo	   Free resources during auxiliary device probe
+ * 			   failures (Apr 29 2002)
+ *   
  */
 
 #include <linux/config.h>
@@ -71,6 +75,9 @@
 #include "ad1848.h"
 #include "mpu401.h"
 
+#define OPL3SA2_MODULE_NAME	"opl3sa2"
+#define PFX			OPL3SA2_MODULE_NAME ": "
+
 /* Useful control port indexes: */
 #define OPL3SA2_PM	     0x01
 #define OPL3SA2_SYS_CTRL     0x02
@@ -91,9 +98,11 @@
 #define DEFAULT_TIMBRE 0
 
 /* Power saving modes */
-#define OPL3SA2_PM_MODE1	0x05
-#define OPL3SA2_PM_MODE2	0x04
-#define OPL3SA2_PM_MODE3	0x03
+#define OPL3SA2_PM_MODE0	0x00
+#define OPL3SA2_PM_MODE1	0x04	/* PSV */
+#define OPL3SA2_PM_MODE2	0x05	/* PSV | PDX */
+#define OPL3SA2_PM_MODE3	0x27	/* ADOWN | PSV | PDN | PDX */
+
 
 /* For checking against what the card returns: */
 #define VERSION_UNKNOWN 0
@@ -107,6 +116,7 @@
 #define CHIPSET_UNKNOWN -1
 #define CHIPSET_OPL3SA2 0
 #define CHIPSET_OPL3SA3 1
+static const char *CHIPSET_TABLE[] = {"OPL3-SA2", "OPL3-SA3"};
 
 #ifdef CONFIG_PNP
 #define OPL3SA2_CARDS_MAX 4
@@ -117,40 +127,41 @@
 /* This should be pretty obvious */
 static int opl3sa2_cards_num; /* = 0 */
 
-/* What's my version(s)? */
-static int chipset[OPL3SA2_CARDS_MAX] = { CHIPSET_UNKNOWN };
-
-/* Oh well, let's just cache the name(s) */
-static char chipset_name[OPL3SA2_CARDS_MAX][12];
-
-/* Where's my mixer(s)? */
-static int opl3sa2_mixer[OPL3SA2_CARDS_MAX] = { -1 };
-
-/* Bag o' mixer data */
-typedef struct opl3sa2_mixerdata_tag {
+typedef struct {
+	/* device resources */
 	unsigned short cfg_port;
-	unsigned short padding;
-	unsigned char  reg;
-	unsigned int   in_suspend;
-	struct pm_dev  *pmdev;
-	unsigned int   card;
-	unsigned int   volume_l;
-	unsigned int   volume_r;
-	unsigned int   mic;
-	unsigned int   bass_l;
-	unsigned int   bass_r;
-	unsigned int   treble_l;
-	unsigned int   treble_r;
-	unsigned int   wide_l;
-	unsigned int   wide_r;
-} opl3sa2_mixerdata;
-static opl3sa2_mixerdata opl3sa2_data[OPL3SA2_CARDS_MAX];
-
-static struct address_info cfg[OPL3SA2_CARDS_MAX];
-static struct address_info cfg_mss[OPL3SA2_CARDS_MAX];
-static struct address_info cfg_mpu[OPL3SA2_CARDS_MAX];
+	struct address_info cfg;
+	struct address_info cfg_mss;
+	struct address_info cfg_mpu;
+#ifdef CONFIG_PNP
+	/* PnP Stuff */
+	struct pnp_dev* pdev;
+	int activated;			/* Whether said devices have been activated */
+#endif
+#ifdef CONFIG_PM
+	unsigned int	in_suspend;
+	struct pm_dev	*pmdev;
+#endif
+	unsigned int	card;
+	int		chipset;	/* What's my version(s)? */
+	char		*chipset_name;
+
+	/* mixer data */
+	int		mixer;
+	unsigned int	volume_l;
+	unsigned int	volume_r;
+	unsigned int	mic;
+	unsigned int	bass_l;
+	unsigned int	bass_r;
+	unsigned int	treble_l;
+	unsigned int	treble_r;
+	unsigned int	wide_l;
+	unsigned int	wide_r;
+} opl3sa2_state_t;
+static opl3sa2_state_t opl3sa2_state[OPL3SA2_CARDS_MAX];
 
-static spinlock_t	lock=SPIN_LOCK_UNLOCKED;
+static spinlock_t opl3sa2_lock = SPIN_LOCK_UNLOCKED;
+	
 
 /* Our parameters */
 static int __initdata io	= -1;
@@ -241,7 +252,7 @@
  * All of the mixer functions...
  */
 
-static void opl3sa2_set_volume(opl3sa2_mixerdata* devc, int left, int right)
+static void opl3sa2_set_volume(opl3sa2_state_t* devc, int left, int right)
 {
 	static unsigned char scale[101] = {
 		0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
@@ -276,7 +287,7 @@
 }
 
 
-static void opl3sa2_set_mic(opl3sa2_mixerdata* devc, int level)
+static void opl3sa2_set_mic(opl3sa2_state_t* devc, int level)
 {
 	unsigned char vol = 0x1F;
 
@@ -291,7 +302,7 @@
 }
 
 
-static void opl3sa3_set_bass(opl3sa2_mixerdata* devc, int left, int right)
+static void opl3sa3_set_bass(opl3sa2_state_t* devc, int left, int right)
 {
 	unsigned char bass;
 
@@ -302,7 +313,7 @@
 }
 
 
-static void opl3sa3_set_treble(opl3sa2_mixerdata* devc, int left, int right)
+static void opl3sa3_set_treble(opl3sa2_state_t* devc, int left, int right)
 {	
 	unsigned char treble;
 
@@ -313,7 +324,7 @@
 }
 
 
-static void opl3sa3_set_wide(opl3sa2_mixerdata* devc, int left, int right)
+static void opl3sa3_set_wide(opl3sa2_state_t* devc, int left, int right)
 {	
 	unsigned char wide;
 
@@ -324,16 +335,16 @@
 }
 
 
-static void opl3sa2_mixer_reset(opl3sa2_mixerdata* devc, int card)
+static void opl3sa2_mixer_reset(opl3sa2_state_t* devc)
 {
-	if(devc) {
+	if (devc) {
 		opl3sa2_set_volume(devc, DEFAULT_VOLUME, DEFAULT_VOLUME);
 		devc->volume_l = devc->volume_r = DEFAULT_VOLUME;
 
 		opl3sa2_set_mic(devc, DEFAULT_MIC);
 		devc->mic = DEFAULT_MIC;
 
-		if(chipset[card] == CHIPSET_OPL3SA3) {
+		if (devc->chipset == CHIPSET_OPL3SA3) {
 			opl3sa3_set_bass(devc, DEFAULT_TIMBRE, DEFAULT_TIMBRE);
 			devc->bass_l = devc->bass_r = DEFAULT_TIMBRE;
 			opl3sa3_set_treble(devc, DEFAULT_TIMBRE, DEFAULT_TIMBRE);
@@ -343,13 +354,13 @@
 }
 
 
-static void opl3sa2_mixer_restore(opl3sa2_mixerdata* devc, int card)
+static void opl3sa2_mixer_restore(opl3sa2_state_t* devc)
 {
 	if (devc) {
 		opl3sa2_set_volume(devc, devc->volume_l, devc->volume_r);
 		opl3sa2_set_mic(devc, devc->mic);
 
-		if (chipset[card] == CHIPSET_OPL3SA3) {
+		if (devc->chipset == CHIPSET_OPL3SA3) {
 			opl3sa3_set_bass(devc, devc->bass_l, devc->bass_r);
 			opl3sa3_set_treble(devc, devc->treble_l, devc->treble_r);
 		}
@@ -391,9 +402,9 @@
 {
 	int cmdf = cmd & 0xff;
 
-	opl3sa2_mixerdata* devc = (opl3sa2_mixerdata*) mixer_devs[dev]->devc;
+	opl3sa2_state_t* devc = &opl3sa2_state[dev];
 	
-	switch(cmdf) {
+	switch (cmdf) {
 		case SOUND_MIXER_VOLUME:
 		case SOUND_MIXER_MIC:
 		case SOUND_MIXER_DEVMASK:
@@ -407,10 +418,10 @@
 			return -EINVAL;
 	}
 	
-	if(((cmd >> 8) & 0xff) != 'M')
+	if (((cmd >> 8) & 0xff) != 'M')
 		return -EINVAL;
 		
-	if(_SIOC_DIR (cmd) & _SIOC_WRITE) {
+	if (_SIOC_DIR (cmd) & _SIOC_WRITE) {
 		switch (cmdf) {
 			case SOUND_MIXER_VOLUME:
 				arg_to_vol_stereo(*(unsigned int*)arg,
@@ -474,9 +485,9 @@
 {
 	int cmdf = cmd & 0xff;
 
-	opl3sa2_mixerdata* devc = (opl3sa2_mixerdata*) mixer_devs[dev]->devc;
+	opl3sa2_state_t* devc = &opl3sa2_state[dev];
 
-	switch(cmdf) {
+	switch (cmdf) {
 		case SOUND_MIXER_BASS:
 		case SOUND_MIXER_TREBLE:
 		case SOUND_MIXER_DIGITAL1:
@@ -488,10 +499,10 @@
 			return opl3sa2_mixer_ioctl(dev, cmd, arg);
 	}
 
-	if(((cmd >> 8) & 0xff) != 'M')
+	if (((cmd >> 8) & 0xff) != 'M')
 		return -EINVAL;
 		
-	if(_SIOC_DIR (cmd) & _SIOC_WRITE) {
+	if (_SIOC_DIR (cmd) & _SIOC_WRITE) {
 		switch (cmdf) {
 			case SOUND_MIXER_BASS:
 				arg_to_vol_stereo(*(unsigned int*)arg,
@@ -557,18 +568,18 @@
 
 static struct mixer_operations opl3sa2_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"OPL3-SA2",
-	name:	"Yamaha OPL3-SA2",
-	ioctl:	opl3sa2_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "OPL3-SA2",
+	.name	= "Yamaha OPL3-SA2",
+	.ioctl	= opl3sa2_mixer_ioctl
 };
 
 static struct mixer_operations opl3sa3_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"OPL3-SA3",
-	name:	"Yamaha OPL3-SA3",
-	ioctl:	opl3sa3_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "OPL3-SA3",
+	.name	= "Yamaha OPL3-SA3",
+	.ioctl	= opl3sa3_mixer_ioctl
 };
 
 /* End of mixer-related stuff */
@@ -584,9 +595,9 @@
 }
 
 
-static inline void __init attach_opl3sa2_mpu(struct address_info* hw_config)
+static inline int __init attach_opl3sa2_mpu(struct address_info* hw_config)
 {
-	attach_mpu401(hw_config, THIS_MODULE);
+	return attach_mpu401(hw_config, THIS_MODULE);
 }
 
 
@@ -608,7 +619,7 @@
 
 	initial_mixers = num_mixers;
 	attach_ms_sound(hw_config, THIS_MODULE);	/* Slot 0 */
-	if(hw_config->slots[0] != -1) {
+	if (hw_config->slots[0] != -1) {
 		/* Did the MSS driver install? */
 		if(num_mixers == (initial_mixers + 1)) {
 			/* The MSS mixer is installed, reroute mixers appropiately */
@@ -617,7 +628,7 @@
 			AD1848_REROUTE(SOUND_MIXER_LINE3, SOUND_MIXER_LINE);
 		}
 		else {
-			printk(KERN_ERR "opl3sa2: MSS mixer not installed?\n");
+			printk(KERN_ERR PFX "MSS mixer not installed?\n");
 		}
 	}
 }
@@ -634,15 +645,14 @@
 	unsigned char misc;
 	unsigned char tmp;
 	unsigned char version;
-	char tag;
 
 	/*
-	 * Verify that the I/O port range is free.
+	 * Try and allocate our I/O port range.
 	 */
-	if(check_region(hw_config->io_base, 2)) {
-		printk(KERN_ERR "opl3sa2: Control I/O port %#x not free\n",
+	if (!request_region(hw_config->io_base, 2, OPL3SA2_MODULE_NAME)) {
+		printk(KERN_ERR PFX "Control I/O port %#x not free\n",
 		       hw_config->io_base);
-		return 0;
+		goto out_nodev;
 	}
 
 	/*
@@ -653,9 +663,9 @@
 	opl3sa2_write(hw_config->io_base, OPL3SA2_MISC, misc ^ 0x07);
 	opl3sa2_read(hw_config->io_base, OPL3SA2_MISC, &tmp);
 	if(tmp != misc) {
-		printk(KERN_ERR "opl3sa2: Control I/O port %#x is not a YMF7xx chipset!\n",
+		printk(KERN_ERR PFX "Control I/O port %#x is not a YMF7xx chipset!\n",
 		       hw_config->io_base);
-		return 0;
+		goto out_region;
 	}
 
 	/*
@@ -666,9 +676,9 @@
 	opl3sa2_read(hw_config->io_base, OPL3SA2_MIC, &tmp);
 	if((tmp & 0x9f) != 0x8a) {
 		printk(KERN_ERR
-		       "opl3sa2: Control I/O port %#x is not a YMF7xx chipset!\n",
+		       PFX "Control I/O port %#x is not a YMF7xx chipset!\n",
 		       hw_config->io_base);
-		return 0;
+		goto out_region;
 	}
 	opl3sa2_write(hw_config->io_base, OPL3SA2_MIC, tmp);
 
@@ -679,57 +689,54 @@
 	 * of the miscellaneous register.
 	 */
 	version = misc & 0x07;
-	printk(KERN_DEBUG "opl3sa2: chipset version = %#x\n", version);
-	switch(version) {
+	printk(KERN_DEBUG PFX "Chipset version = %#x\n", version);
+	switch (version) {
 		case 0:
-			chipset[card] = CHIPSET_UNKNOWN;
-			tag = '?'; /* silence compiler warning */
+			opl3sa2_state[card].chipset = CHIPSET_UNKNOWN;
 			printk(KERN_ERR
-			       "opl3sa2: Unknown Yamaha audio controller version\n");
+			       PFX "Unknown Yamaha audio controller version\n");
 			break;
 
 		case VERSION_YMF711:
-			chipset[card] = CHIPSET_OPL3SA2;
-			tag = '2';
-			printk(KERN_INFO "opl3sa2: Found OPL3-SA2 (YMF711)\n");
+			opl3sa2_state[card].chipset = CHIPSET_OPL3SA2;
+			printk(KERN_INFO PFX "Found OPL3-SA2 (YMF711)\n");
 			break;
 
 		case VERSION_YMF715:
-			chipset[card] = CHIPSET_OPL3SA3;
-			tag = '3';
+			opl3sa2_state[card].chipset = CHIPSET_OPL3SA3;
 			printk(KERN_INFO
-			       "opl3sa2: Found OPL3-SA3 (YMF715 or YMF719)\n");
+			       PFX "Found OPL3-SA3 (YMF715 or YMF719)\n");
 			break;
 
 		case VERSION_YMF715B:
-			chipset[card] = CHIPSET_OPL3SA3;
-			tag = '3';
+			opl3sa2_state[card].chipset = CHIPSET_OPL3SA3;
 			printk(KERN_INFO
-			       "opl3sa2: Found OPL3-SA3 (YMF715B or YMF719B)\n");
+			       PFX "Found OPL3-SA3 (YMF715B or YMF719B)\n");
 			break;
 
 		case VERSION_YMF715E:
 		default:
-			chipset[card] = CHIPSET_OPL3SA3;
-			tag = '3';
+			opl3sa2_state[card].chipset = CHIPSET_OPL3SA3;
 			printk(KERN_INFO
-			       "opl3sa2: Found OPL3-SA3 (YMF715E or YMF719E)\n");
+			       PFX "Found OPL3-SA3 (YMF715E or YMF719E)\n");
 			break;
 	}
 
-	if(chipset[card] != CHIPSET_UNKNOWN) {
+	if (opl3sa2_state[card].chipset != CHIPSET_UNKNOWN) {
 		/* Generate a pretty name */
-		sprintf(chipset_name[card], "OPL3-SA%c", tag);
-		return 1;
+		opl3sa2_state[card].chipset_name = (char *)CHIPSET_TABLE[opl3sa2_state[card].chipset];
+		return 0;
 	}
-	return 0;
+
+out_region:
+	release_region(hw_config->io_base, 2);
+out_nodev:
+	return -ENODEV;
 }
 
 
 static void __init attach_opl3sa2(struct address_info* hw_config, int card)
 {
-   	request_region(hw_config->io_base, 2, chipset_name[card]);
-
 	/* Initialize IRQ configuration to IRQ-B: -, IRQ-A: WSS+MPU+OPL3 */
 	opl3sa2_write(hw_config->io_base, OPL3SA2_IRQ_CONFIG, 0x0d);
 
@@ -748,30 +755,29 @@
 static void __init attach_opl3sa2_mixer(struct address_info *hw_config, int card)
 {
 	struct mixer_operations* mixer_operations;
-	opl3sa2_mixerdata* devc;
+	opl3sa2_state_t* devc = &opl3sa2_state[card];
 
 	/* Install master mixer */
-	if(chipset[card] == CHIPSET_OPL3SA3) {
+	if (devc->chipset == CHIPSET_OPL3SA3) {
 		mixer_operations = &opl3sa3_mixer_operations;
 	}
 	else {
 		mixer_operations = &opl3sa2_mixer_operations;
 	}
 
-	if((devc = &opl3sa2_data[card])) {
-		devc->cfg_port = hw_config->io_base;
+	devc->cfg_port = hw_config->io_base;
+	devc->mixer = sound_install_mixer(MIXER_DRIVER_VERSION,
+					  mixer_operations->name,
+					  mixer_operations,
+					  sizeof(struct mixer_operations),
+					  devc);
+	if(devc->mixer < 0) {
+		printk(KERN_ERR PFX "Could not install %s master mixer\n",
+			 mixer_operations->name);
+	}
+	else {
+			opl3sa2_mixer_reset(devc);
 
-		opl3sa2_mixer[card] = sound_install_mixer(MIXER_DRIVER_VERSION,
-							  mixer_operations->name,
-							  mixer_operations,
-							  sizeof(struct mixer_operations),
-							  devc);
-		if(opl3sa2_mixer[card] < 0) {
-			printk(KERN_ERR "opl3sa2: Could not install %s master mixer\n",
-				 mixer_operations->name);
-		}
-		else
-			opl3sa2_mixer_reset(devc, card);
 	}
 }
 
@@ -805,7 +811,7 @@
 		opl3sa2_write(hw_config->io_base, OPL3SA2_SYS_CTRL, sys_ctrl);
 	}
 	else {
-		printk(KERN_ERR "opl3sa2: not setting ymode, it must be one of 0,1,2,3\n");
+		printk(KERN_ERR PFX "not setting ymode, it must be one of 0,1,2,3\n");
 	}
 }
 
@@ -820,7 +826,7 @@
 		opl3sa2_write(hw_config->io_base, OPL3SA2_MISC, misc);
 	}
 	else {
-		printk(KERN_ERR "opl3sa2: not setting loopback, it must be either 0 or 1\n");
+		printk(KERN_ERR PFX "not setting loopback, it must be either 0 or 1\n");
 	}
 }
 
@@ -831,8 +837,9 @@
 	release_region(hw_config->io_base, 2);
 
 	/* Unload mixer */
-	if(opl3sa2_mixer[card] >= 0)
-		sound_unload_mixerdev(opl3sa2_mixer[card]);
+	if(opl3sa2_state[card].mixer >= 0)
+		sound_unload_mixerdev(opl3sa2_state[card].mixer);
+
 }
 
 #ifdef CONFIG_PNP
@@ -846,35 +853,40 @@
 static int opl3sa2_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
 {
 	int card = opl3sa2_cards_num;
+
+	/* we don't actually want to return an error as the user may have specified
+	 * no multiple card search
+	 */
+
 	if (opl3sa2_cards_num == OPL3SA2_CARDS_MAX)
 		return 0;
 	opl3sa2_activated[card] = 1;
 
 	/* Our own config: */
-	cfg[card].io_base = pnp_port_start(dev, 4);
-	cfg[card].irq     = pnp_irq(dev, 0);
-	cfg[card].dma     = pnp_dma(dev, 0);
-	cfg[card].dma2    = pnp_dma(dev, 1);
+	opl3sa2_state[card].cfg.io_base = pnp_port_start(dev, 4);
+	opl3sa2_state[card].cfg.irq     = pnp_irq(dev, 0);
+	opl3sa2_state[card].cfg.dma     = pnp_dma(dev, 0);
+	opl3sa2_state[card].cfg.dma2    = pnp_dma(dev, 1);
 
 	/* The MSS config: */
-	cfg_mss[card].io_base      = pnp_port_start(dev, 1);
-	cfg_mss[card].irq          = pnp_irq(dev, 0);
-	cfg_mss[card].dma          = pnp_dma(dev, 0);
-	cfg_mss[card].dma2         = pnp_dma(dev, 1);
-	cfg_mss[card].card_subtype = 1; /* No IRQ or DMA setup */
-
-	cfg_mpu[card].io_base       = pnp_port_start(dev, 3);
-	cfg_mpu[card].irq           = pnp_irq(dev, 0);
-	cfg_mpu[card].dma           = -1;
-	cfg_mpu[card].dma2          = -1;
-	cfg_mpu[card].always_detect = 1; /* It's there, so use shared IRQs */
+	opl3sa2_state[card].cfg_mss.io_base      = pnp_port_start(dev, 1);
+	opl3sa2_state[card].cfg_mss.irq          = pnp_irq(dev, 0);
+	opl3sa2_state[card].cfg_mss.dma          = pnp_dma(dev, 0);
+	opl3sa2_state[card].cfg_mss.dma2         = pnp_dma(dev, 1);
+	opl3sa2_state[card].cfg_mss.card_subtype = 1; /* No IRQ or DMA setup */
+
+	opl3sa2_state[card].cfg_mpu.io_base       = pnp_port_start(dev, 3);
+	opl3sa2_state[card].cfg_mpu.irq           = pnp_irq(dev, 0);
+	opl3sa2_state[card].cfg_mpu.dma           = -1;
+	opl3sa2_state[card].cfg_mpu.dma2          = -1;
+	opl3sa2_state[card].cfg_mpu.always_detect = 1; /* It's there, so use shared IRQs */
 
 	/* Call me paranoid: */
-	opl3sa2_clear_slots(&cfg[card]);
-	opl3sa2_clear_slots(&cfg_mss[card]);
-	opl3sa2_clear_slots(&cfg_mpu[card]);
+	opl3sa2_clear_slots(&opl3sa2_state[card].cfg);
+	opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mss);
+	opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mpu);
 
-	opl3sa2_dev[card] = dev;
+	opl3sa2_state[card].pdev = dev;
 	opl3sa2_cards_num++;
 
 	return 0;
@@ -890,19 +902,19 @@
 
 /* End of component functions */
 
+#ifdef CONFIG_PM
 /* Power Management support functions */
-static int opl3sa2_suspend(struct pm_dev *pdev, unsigned char pm_mode)
+static int opl3sa2_suspend(struct pm_dev *pdev, unsigned int pm_mode)
 {
 	unsigned long flags;
-	opl3sa2_mixerdata *p;
+	opl3sa2_state_t *p;
 
 	if (!pdev)
 		return -EINVAL;
 
-	spin_lock_irqsave(&lock,flags);
+	spin_lock_irqsave(&opl3sa2_lock,flags);
 
-	p = (opl3sa2_mixerdata *) pdev->data;
-	p->in_suspend = 1;
+	p = (opl3sa2_state_t *) pdev->data;
 	switch (pm_mode) {
 	case 1:
 		pm_mode = OPL3SA2_PM_MODE1;
@@ -914,37 +926,42 @@
 		pm_mode = OPL3SA2_PM_MODE3;
 		break;
 	default:
-		pm_mode = OPL3SA2_PM_MODE3;
-		break;
+		/* we don't know howto handle this... */
+		spin_unlock_irqrestore(&opl3sa2_lock, flags);
+		return -EBUSY;
 	}
 
+	p->in_suspend = 1;
+
 	/* its supposed to automute before suspending, so we won't bother */
-	opl3sa2_read(p->cfg_port, OPL3SA2_PM, &p->reg);
-	opl3sa2_write(p->cfg_port, OPL3SA2_PM, p->reg | pm_mode);
+	opl3sa2_write(p->cfg_port, OPL3SA2_PM, pm_mode);
+	/* wait a while for the clock oscillator to stabilise */
+	mdelay(10);
 
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&opl3sa2_lock,flags);
 	return 0;
 }
 
 static int opl3sa2_resume(struct pm_dev *pdev)
 {
 	unsigned long flags;
-	opl3sa2_mixerdata *p;
+	opl3sa2_state_t *p;
 
-	if (!pdev)
-		return -EINVAL;
+ 	if (!pdev)
+ 		return -EINVAL;
 
-	p = (opl3sa2_mixerdata *) pdev->data;
-	spin_lock_irqsave(&lock,flags);	
+	p = (opl3sa2_state_t *) pdev->data;
+	spin_lock_irqsave(&opl3sa2_lock,flags);
 
-	/* I don't think this is necessary */
-	opl3sa2_write(p->cfg_port, OPL3SA2_PM, p->reg);
-	opl3sa2_mixer_restore(p, p->card);
-	p->in_suspend = 0;
+ 	/* I don't think this is necessary */
+	opl3sa2_write(p->cfg_port, OPL3SA2_PM, OPL3SA2_PM_MODE0);
+	opl3sa2_mixer_restore(p);
+ 	p->in_suspend = 0;
 
-	spin_unlock_irqrestore(&lock,flags);
+	spin_unlock_irqrestore(&opl3sa2_lock,flags);
 	return 0;
 }
+#endif /* CONFIG_PM */
 
 static int opl3sa2_pm_callback(struct pm_dev *pdev, pm_request_t rqst, void *data)
 {
@@ -967,8 +984,7 @@
  */
 static int __init init_opl3sa2(void)
 {
-        int card;
-	int max;
+	int card, max;
 
 	/* Sanitize isapnp and multiple settings */
 	isapnp = isapnp != 0 ? 1 : 0;
@@ -980,64 +996,69 @@
 	if (isapnp){
 		pnp_register_driver(&opl3sa2_driver);
 		if(!opl3sa2_cards_num){
-			printk(KERN_INFO "opl3sa2: No PnP cards found\n");
+			printk(KERN_INFO PFX "No PnP cards found\n");
 			isapnp = 0;
 		}
 		max = opl3sa2_cards_num;
 	}
 #endif
 
-	for(card = 0; card < max; card++) {
+	for (card = 0; card < max; card++) {
 		/* If a user wants an I/O then assume they meant it */
 		
-		if(!isapnp) {
-			if(io == -1 || irq == -1 || dma == -1 ||
-			   dma2 == -1 || mss_io == -1) {
+		if (!isapnp) {
+			if (io == -1 || irq == -1 || dma == -1 ||
+			    dma2 == -1 || mss_io == -1) {
 				printk(KERN_ERR
-				       "opl3sa2: io, mss_io, irq, dma, and dma2 must be set\n");
+				       PFX "io, mss_io, irq, dma, and dma2 must be set\n");
 				return -EINVAL;
-				opl3sa2_cards_num++;
 			}
+			opl3sa2_cards_num++;
 
 			/*
 			 * Our own config:
 			 * (NOTE: IRQ and DMA aren't used, so they're set to
 			 *  give pretty output from conf_printf. :)
 			 */
-			cfg[card].io_base = io;
-			cfg[card].irq     = irq;
-			cfg[card].dma     = dma;
-			cfg[card].dma2    = dma2;
+			opl3sa2_state[card].cfg.io_base = io;
+			opl3sa2_state[card].cfg.irq     = irq;
+			opl3sa2_state[card].cfg.dma     = dma;
+			opl3sa2_state[card].cfg.dma2    = dma2;
 	
 			/* The MSS config: */
-			cfg_mss[card].io_base      = mss_io;
-			cfg_mss[card].irq          = irq;
-			cfg_mss[card].dma          = dma;
-			cfg_mss[card].dma2         = dma2;
-			cfg_mss[card].card_subtype = 1; /* No IRQ or DMA setup */
-
-			cfg_mpu[card].io_base       = mpu_io;
-			cfg_mpu[card].irq           = irq;
-			cfg_mpu[card].dma           = -1;
-			cfg_mpu[card].always_detect = 1; /* Use shared IRQs */
+			opl3sa2_state[card].cfg_mss.io_base      = mss_io;
+			opl3sa2_state[card].cfg_mss.irq          = irq;
+			opl3sa2_state[card].cfg_mss.dma          = dma;
+			opl3sa2_state[card].cfg_mss.dma2         = dma2;
+			opl3sa2_state[card].cfg_mss.card_subtype = 1; /* No IRQ or DMA setup */
+
+			opl3sa2_state[card].cfg_mpu.io_base       = mpu_io;
+			opl3sa2_state[card].cfg_mpu.irq           = irq;
+			opl3sa2_state[card].cfg_mpu.dma           = -1;
+			opl3sa2_state[card].cfg_mpu.always_detect = 1; /* Use shared IRQs */
 
 			/* Call me paranoid: */
-			opl3sa2_clear_slots(&cfg[card]);
-			opl3sa2_clear_slots(&cfg_mss[card]);
-			opl3sa2_clear_slots(&cfg_mpu[card]);
+			opl3sa2_clear_slots(&opl3sa2_state[card].cfg);
+			opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mss);
+			opl3sa2_clear_slots(&opl3sa2_state[card].cfg_mpu);
 		}
 
-		if(!probe_opl3sa2(&cfg[card], card) ||
-		   !probe_opl3sa2_mss(&cfg_mss[card])) {
+		if (probe_opl3sa2(&opl3sa2_state[card].cfg, card))
+			return -ENODEV;
+
+
+		if (!probe_opl3sa2_mss(&opl3sa2_state[card].cfg_mss)) {
 			/*
 			 * If one or more cards are already registered, don't
 			 * return an error but print a warning.  Note, this
 			 * should never really happen unless the hardware or
 			 * ISA PnP screwed up.
 			 */
-			if(opl3sa2_cards_num) {
+			release_region(opl3sa2_state[card].cfg.io_base, 2);
+
+			if (opl3sa2_cards_num) {
 				printk(KERN_WARNING
-				       "opl3sa2: There was a problem probing one "
+				       PFX "There was a problem probing one "
 				       " of the ISA PNP cards, continuing\n");
 				opl3sa2_cards_num--;
 				continue;
@@ -1045,47 +1066,53 @@
 				return -ENODEV;
 		}
 
-		attach_opl3sa2(&cfg[card], card);
-		conf_printf(chipset_name[card], &cfg[card]);
-		attach_opl3sa2_mss(&cfg_mss[card]);
-		attach_opl3sa2_mixer(&cfg[card], card);
-
-		opl3sa2_data[card].card = card;
+		attach_opl3sa2(&opl3sa2_state[card].cfg, card);
+		conf_printf(opl3sa2_state[card].chipset_name, &opl3sa2_state[card].cfg);
+		attach_opl3sa2_mixer(&opl3sa2_state[card].cfg, card);
+		attach_opl3sa2_mss(&opl3sa2_state[card].cfg_mss);
+
+		/* ewww =) */
+		opl3sa2_state[card].card = card;
+#ifdef CONFIG_PM
 		/* register our power management capabilities */
-		opl3sa2_data[card].pmdev = pm_register(PM_ISA_DEV, card, opl3sa2_pm_callback);
-		if (opl3sa2_data[card].pmdev)
-			opl3sa2_data[card].pmdev->data = &opl3sa2_data[card];
+		opl3sa2_state[card].pmdev = pm_register(PM_ISA_DEV, card, opl3sa2_pm_callback);
+		if (opl3sa2_state[card].pmdev)
+			opl3sa2_state[card].pmdev->data = &opl3sa2_state[card];
+#endif /* CONFIG_PM */
 
 		/*
 		 * Set the Yamaha 3D enhancement mode (aka Ymersion) if asked to and
 		 * it's supported.
 		 */
-		if(ymode != -1) {
-			if(chipset[card] == CHIPSET_OPL3SA2) {
+		if (ymode != -1) {
+			if (opl3sa2_state[card].chipset == CHIPSET_OPL3SA2) {
 				printk(KERN_ERR
-				       "opl3sa2: ymode not supported on OPL3-SA2\n");
+				       PFX "ymode not supported on OPL3-SA2\n");
 			}
 			else {
-				opl3sa2_set_ymode(&cfg[card], ymode);
+				opl3sa2_set_ymode(&opl3sa2_state[card].cfg, ymode);
 			}
 		}
 
 
 		/* Set A/D input to Mono loopback if asked to. */
-		if(loopback != -1) {
-			opl3sa2_set_loopback(&cfg[card], loopback);
+		if (loopback != -1) {
+			opl3sa2_set_loopback(&opl3sa2_state[card].cfg, loopback);
 		}
 		
-		/* Attach MPU if we've been asked to do so */
-		if(cfg_mpu[card].io_base != -1) {
-			if(probe_opl3sa2_mpu(&cfg_mpu[card])) {
-				attach_opl3sa2_mpu(&cfg_mpu[card]);
+		/* Attach MPU if we've been asked to do so, failure isn't fatal */
+		if (opl3sa2_state[card].cfg_mpu.io_base != -1) {
+			if (probe_opl3sa2_mpu(&opl3sa2_state[card].cfg_mpu)) {
+				if (attach_opl3sa2_mpu(&opl3sa2_state[card].cfg_mpu)) {
+					printk(KERN_ERR PFX "failed to attach MPU401\n");
+					opl3sa2_state[card].cfg_mpu.slots[1] = -1;
+				}
 			}
 		}
 	}
 
-	if(isapnp) {
-		printk(KERN_NOTICE "opl3sa2: %d PnP card(s) found.\n", opl3sa2_cards_num);
+	if (isapnp) {
+		printk(KERN_NOTICE PFX "%d PnP card(s) found.\n", opl3sa2_cards_num);
 	}
 
 	return 0;
@@ -1100,15 +1127,14 @@
 	int card;
 
 	for(card = 0; card < opl3sa2_cards_num; card++) {
-		if (opl3sa2_data[card].pmdev)
-			pm_unregister(opl3sa2_data[card].pmdev);
-
-	        if(cfg_mpu[card].slots[1] != -1) {
-			unload_opl3sa2_mpu(&cfg_mpu[card]);
-		}
-		unload_opl3sa2_mss(&cfg_mss[card]);
-		unload_opl3sa2(&cfg[card], card);
+		if (opl3sa2_state[card].pmdev)
+			pm_unregister(opl3sa2_state[card].pmdev);
 
+	        if(opl3sa2_state[card].cfg_mpu.slots[1] != -1) {
+			unload_opl3sa2_mpu(&opl3sa2_state[card].cfg_mpu);
+ 		}
+		unload_opl3sa2_mss(&opl3sa2_state[card].cfg_mss);
+		unload_opl3sa2(&opl3sa2_state[card].cfg, card);
 #ifdef CONFIG_PNP
 		pnp_unregister_driver(&opl3sa2_driver);
 #endif
diff -Nru a/sound/oss/pas2_midi.c b/sound/oss/pas2_midi.c
--- a/sound/oss/pas2_midi.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/pas2_midi.c	Sat Apr 19 19:51:49 2003
@@ -194,17 +194,17 @@
 
 static struct midi_operations pas_midi_operations =
 {
-	owner:		THIS_MODULE,
-	info:		{"Pro Audio Spectrum", 0, 0, SNDCARD_PAS},
-	converter:	&std_midi_synth,
-	in_info:	{0},
-	open:		pas_midi_open,
-	close:		pas_midi_close,
-	outputc:	pas_midi_out,
-	start_read:	pas_midi_start_read,
-	end_read:	pas_midi_end_read,
-	kick:		pas_midi_kick,
-	buffer_status:	pas_buffer_status,
+	.owner		= THIS_MODULE,
+	.info		= {"Pro Audio Spectrum", 0, 0, SNDCARD_PAS},
+	.converter	= &std_midi_synth,
+	.in_info	= {0},
+	.open		= pas_midi_open,
+	.close		= pas_midi_close,
+	.outputc	= pas_midi_out,
+	.start_read	= pas_midi_start_read,
+	.end_read	= pas_midi_end_read,
+	.kick		= pas_midi_kick,
+	.buffer_status	= pas_buffer_status,
 };
 
 void __init pas_midi_init(void)
diff -Nru a/sound/oss/pas2_mixer.c b/sound/oss/pas2_mixer.c
--- a/sound/oss/pas2_mixer.c	Sat Apr 19 19:51:46 2003
+++ b/sound/oss/pas2_mixer.c	Sat Apr 19 19:51:46 2003
@@ -311,10 +311,10 @@
 
 static struct mixer_operations pas_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"PAS16",
-	name:	"Pro Audio Spectrum 16",
-	ioctl:	pas_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "PAS16",
+	.name	= "Pro Audio Spectrum 16",
+	.ioctl	= pas_mixer_ioctl
 };
 
 int __init
diff -Nru a/sound/oss/pas2_pcm.c b/sound/oss/pas2_pcm.c
--- a/sound/oss/pas2_pcm.c	Sat Apr 19 19:51:29 2003
+++ b/sound/oss/pas2_pcm.c	Sat Apr 19 19:51:29 2003
@@ -372,16 +372,16 @@
 
 static struct audio_driver pas_audio_driver =
 {
-	owner:		THIS_MODULE,
-	open:		pas_audio_open,
-	close:		pas_audio_close,
-	output_block:	pas_audio_output_block,
-	start_input:	pas_audio_start_input,
-	ioctl:		pas_audio_ioctl,
-	prepare_for_input:	pas_audio_prepare_for_input,
-	prepare_for_output:	pas_audio_prepare_for_output,
-	halt_io:		pas_audio_reset,
-	trigger:	pas_audio_trigger
+	.owner			= THIS_MODULE,
+	.open			= pas_audio_open,
+	.close			= pas_audio_close,
+	.output_block		= pas_audio_output_block,
+	.start_input		= pas_audio_start_input,
+	.ioctl			= pas_audio_ioctl,
+	.prepare_for_input	= pas_audio_prepare_for_input,
+	.prepare_for_output	= pas_audio_prepare_for_output,
+	.halt_io		= pas_audio_reset,
+	.trigger		= pas_audio_trigger
 };
 
 void __init pas_pcm_init(struct address_info *hw_config)
diff -Nru a/sound/oss/pss.c b/sound/oss/pss.c
--- a/sound/oss/pss.c	Sat Apr 19 19:51:51 2003
+++ b/sound/oss/pss.c	Sat Apr 19 19:51:51 2003
@@ -601,10 +601,10 @@
 
 static struct mixer_operations pss_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"SOUNDPORT",
-	name:	"PSS-AD1848",
-	ioctl:	pss_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "SOUNDPORT",
+	.name	= "PSS-AD1848",
+	.ioctl	= pss_mixer_ioctl
 };
 
 void disable_all_emulations(void)
diff -Nru a/sound/oss/sb_audio.c b/sound/oss/sb_audio.c
--- a/sound/oss/sb_audio.c	Sat Apr 19 19:51:50 2003
+++ b/sound/oss/sb_audio.c	Sat Apr 19 19:51:50 2003
@@ -927,100 +927,100 @@
 
 static struct audio_driver sb1_audio_driver =	/* SB1.x */
 {
-	owner:		THIS_MODULE,
-	open:		sb_audio_open,
-	close:		sb_audio_close,
-	output_block:	sb_set_output_parms,
-	start_input:	sb_set_input_parms,
-	prepare_for_input:	sb1_audio_prepare_for_input,
-	prepare_for_output:	sb1_audio_prepare_for_output,
-	halt_io:	sb1_audio_halt_xfer,
-	trigger:	sb1_audio_trigger,
-	set_speed:	sb1_audio_set_speed,
-	set_bits:	sb1_audio_set_bits,
-	set_channels:	sb1_audio_set_channels
+	.owner			= THIS_MODULE,
+	.open			= sb_audio_open,
+	.close			= sb_audio_close,
+	.output_block		= sb_set_output_parms,
+	.start_input		= sb_set_input_parms,
+	.prepare_for_input	= sb1_audio_prepare_for_input,
+	.prepare_for_output	= sb1_audio_prepare_for_output,
+	.halt_io		= sb1_audio_halt_xfer,
+	.trigger		= sb1_audio_trigger,
+	.set_speed		= sb1_audio_set_speed,
+	.set_bits		= sb1_audio_set_bits,
+	.set_channels		= sb1_audio_set_channels
 };
 
 static struct audio_driver sb20_audio_driver =	/* SB2.0 */
 {
-	owner:		THIS_MODULE,
-	open:		sb_audio_open,
-	close:		sb_audio_close,
-	output_block:	sb_set_output_parms,
-	start_input:	sb_set_input_parms,
-	prepare_for_input:	sb1_audio_prepare_for_input,
-	prepare_for_output:	sb1_audio_prepare_for_output,
-	halt_io:	sb1_audio_halt_xfer,
-	trigger:	sb20_audio_trigger,
-	set_speed:	sb1_audio_set_speed,
-	set_bits:	sb1_audio_set_bits,
-	set_channels:	sb1_audio_set_channels
+	.owner			= THIS_MODULE,
+	.open			= sb_audio_open,
+	.close			= sb_audio_close,
+	.output_block		= sb_set_output_parms,
+	.start_input		= sb_set_input_parms,
+	.prepare_for_input	= sb1_audio_prepare_for_input,
+	.prepare_for_output	= sb1_audio_prepare_for_output,
+	.halt_io		= sb1_audio_halt_xfer,
+	.trigger		= sb20_audio_trigger,
+	.set_speed		= sb1_audio_set_speed,
+	.set_bits		= sb1_audio_set_bits,
+	.set_channels		= sb1_audio_set_channels
 };
 
 static struct audio_driver sb201_audio_driver =		/* SB2.01 */
 {
-	owner:		THIS_MODULE,
-	open:		sb_audio_open,
-	close:		sb_audio_close,
-	output_block:	sb_set_output_parms,
-	start_input:	sb_set_input_parms,
-	prepare_for_input:	sb1_audio_prepare_for_input,
-	prepare_for_output:	sb1_audio_prepare_for_output,
-	halt_io:	sb1_audio_halt_xfer,
-	trigger:	sb20_audio_trigger,
-	set_speed:	sb201_audio_set_speed,
-	set_bits:	sb1_audio_set_bits,
-	set_channels:	sb1_audio_set_channels
+	.owner			= THIS_MODULE,
+	.open			= sb_audio_open,
+	.close			= sb_audio_close,
+	.output_block		= sb_set_output_parms,
+	.start_input		= sb_set_input_parms,
+	.prepare_for_input	= sb1_audio_prepare_for_input,
+	.prepare_for_output	= sb1_audio_prepare_for_output,
+	.halt_io		= sb1_audio_halt_xfer,
+	.trigger		= sb20_audio_trigger,
+	.set_speed		= sb201_audio_set_speed,
+	.set_bits		= sb1_audio_set_bits,
+	.set_channels		= sb1_audio_set_channels
 };
 
 static struct audio_driver sbpro_audio_driver =		/* SB Pro */
 {
-	owner:		THIS_MODULE,
-	open:		sb_audio_open,
-	close:		sb_audio_close,
-	output_block:	sb_set_output_parms,
-	start_input:	sb_set_input_parms,
-	prepare_for_input:	sbpro_audio_prepare_for_input,
-	prepare_for_output:	sbpro_audio_prepare_for_output,
-	halt_io:	sb1_audio_halt_xfer,
-	trigger:	sb20_audio_trigger,
-	set_speed:	sbpro_audio_set_speed,
-	set_bits:	sb1_audio_set_bits,
-	set_channels:	sbpro_audio_set_channels
+	.owner			= THIS_MODULE,
+	.open			= sb_audio_open,
+	.close			= sb_audio_close,
+	.output_block		= sb_set_output_parms,
+	.start_input		= sb_set_input_parms,
+	.prepare_for_input	= sbpro_audio_prepare_for_input,
+	.prepare_for_output	= sbpro_audio_prepare_for_output,
+	.halt_io		= sb1_audio_halt_xfer,
+	.trigger		= sb20_audio_trigger,
+	.set_speed		= sbpro_audio_set_speed,
+	.set_bits		= sb1_audio_set_bits,
+	.set_channels		= sbpro_audio_set_channels
 };
 
 static struct audio_driver jazz16_audio_driver =	/* Jazz16 and SM Wave */
 {
-	owner:		THIS_MODULE,
-	open:		sb_audio_open,
-	close:		sb_audio_close,
-	output_block:	sb_set_output_parms,
-	start_input:	sb_set_input_parms,
-	prepare_for_input:	sbpro_audio_prepare_for_input,
-	prepare_for_output:	sbpro_audio_prepare_for_output,
-	halt_io:	sb1_audio_halt_xfer,
-	trigger:	sb20_audio_trigger,
-	set_speed:	jazz16_audio_set_speed,
-	set_bits:	sb16_audio_set_bits,
-	set_channels:	sbpro_audio_set_channels
+	.owner			= THIS_MODULE,
+	.open			= sb_audio_open,
+	.close			= sb_audio_close,
+	.output_block		= sb_set_output_parms,
+	.start_input		= sb_set_input_parms,
+	.prepare_for_input	= sbpro_audio_prepare_for_input,
+	.prepare_for_output	= sbpro_audio_prepare_for_output,
+	.halt_io		= sb1_audio_halt_xfer,
+	.trigger		= sb20_audio_trigger,
+	.set_speed		= jazz16_audio_set_speed,
+	.set_bits		= sb16_audio_set_bits,
+	.set_channels		= sbpro_audio_set_channels
 };
 
 static struct audio_driver sb16_audio_driver =	/* SB16 */
 {
-	owner:		THIS_MODULE,
-	open:		sb_audio_open,
-	close:		sb_audio_close,
-	output_block:	sb_set_output_parms,
-	start_input:	sb_set_input_parms,
-	prepare_for_input:	sb16_audio_prepare_for_input,
-	prepare_for_output:	sb16_audio_prepare_for_output,
-	halt_io:	sb1_audio_halt_xfer,
-	copy_user:	sb16_copy_from_user,
-	trigger:	sb16_audio_trigger,
-	set_speed:	sb16_audio_set_speed,
-	set_bits:	sb16_audio_set_bits,
-	set_channels:	sbpro_audio_set_channels,
-	mmap:		sb16_audio_mmap
+	.owner			= THIS_MODULE,
+	.open			= sb_audio_open,
+	.close			= sb_audio_close,
+	.output_block		= sb_set_output_parms,
+	.start_input		= sb_set_input_parms,
+	.prepare_for_input	= sb16_audio_prepare_for_input,
+	.prepare_for_output	= sb16_audio_prepare_for_output,
+	.halt_io		= sb1_audio_halt_xfer,
+	.copy_user		= sb16_copy_from_user,
+	.trigger		= sb16_audio_trigger,
+	.set_speed		= sb16_audio_set_speed,
+	.set_bits		= sb16_audio_set_bits,
+	.set_channels		= sbpro_audio_set_channels,
+	.mmap			= sb16_audio_mmap
 };
 
 void sb_audio_init(sb_devc * devc, char *name, struct module *owner)
diff -Nru a/sound/oss/sb_ess.c b/sound/oss/sb_ess.c
--- a/sound/oss/sb_ess.c	Sat Apr 19 19:51:46 2003
+++ b/sound/oss/sb_ess.c	Sat Apr 19 19:51:46 2003
@@ -718,18 +718,18 @@
 
 static struct audio_driver ess_audio_driver =   /* ESS ES688/1688 */
 {
-	owner:			THIS_MODULE,
-	open:			sb_audio_open,
-	close:			sb_audio_close,
-	output_block:	ess_set_output_parms,
-	start_input:	ess_set_input_parms,
-	prepare_for_input:	ess_audio_prepare_for_input,
-	prepare_for_output:	ess_audio_prepare_for_output,
-	halt_io:		ess_audio_halt_xfer,
-	trigger:		ess_audio_trigger,
-	set_speed:		ess_audio_set_speed,
-	set_bits:		ess_audio_set_bits,
-	set_channels:	ess_audio_set_channels
+	.owner			= THIS_MODULE,
+	.open			= sb_audio_open,
+	.close			= sb_audio_close,
+	.output_block		= ess_set_output_parms,
+	.start_input		= ess_set_input_parms,
+	.prepare_for_input	= ess_audio_prepare_for_input,
+	.prepare_for_output	= ess_audio_prepare_for_output,
+	.halt_io		= ess_audio_halt_xfer,
+	.trigger		= ess_audio_trigger,
+	.set_speed		= ess_audio_set_speed,
+	.set_bits		= ess_audio_set_bits,
+	.set_channels		= ess_audio_set_channels
 };
 
 /*
diff -Nru a/sound/oss/sb_midi.c b/sound/oss/sb_midi.c
--- a/sound/oss/sb_midi.c	Sat Apr 19 19:51:27 2003
+++ b/sound/oss/sb_midi.c	Sat Apr 19 19:51:27 2003
@@ -146,16 +146,16 @@
 
 static struct midi_operations sb_midi_operations =
 {
-	owner:		THIS_MODULE,
-	info:		{"Sound Blaster", 0, 0, SNDCARD_SB},
-	converter:	&std_midi_synth,
-	in_info:	{0},
-	open:		sb_midi_open,
-	close:		sb_midi_close,
-	ioctl:		sb_midi_ioctl,
-	outputc:	sb_midi_out,
-	start_read:	sb_midi_start_read,
-	end_read:	sb_midi_end_read,
+	.owner		= THIS_MODULE,
+	.info		= {"Sound Blaster", 0, 0, SNDCARD_SB},
+	.converter	= &std_midi_synth,
+	.in_info	= {0},
+	.open		= sb_midi_open,
+	.close		= sb_midi_close,
+	.ioctl		= sb_midi_ioctl,
+	.outputc	= sb_midi_out,
+	.start_read	= sb_midi_start_read,
+	.end_read	= sb_midi_end_read,
 };
 
 void sb_dsp_midi_init(sb_devc * devc, struct module *owner)
diff -Nru a/sound/oss/sb_mixer.c b/sound/oss/sb_mixer.c
--- a/sound/oss/sb_mixer.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/sb_mixer.c	Sat Apr 19 19:51:28 2003
@@ -626,18 +626,18 @@
 
 static struct mixer_operations sb_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"SB",
-	name:	"Sound Blaster",
-	ioctl:	sb_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "SB",
+	.name	= "Sound Blaster",
+	.ioctl	= sb_mixer_ioctl
 };
 
 static struct mixer_operations als007_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"ALS007",
-	name:	"Avance ALS-007",
-	ioctl:	sb_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "ALS007",
+	.name	= "Avance ALS-007",
+	.ioctl	= sb_mixer_ioctl
 };
 
 static void sb_mixer_reset(sb_devc * devc)
diff -Nru a/sound/oss/sonicvibes.c b/sound/oss/sonicvibes.c
--- a/sound/oss/sonicvibes.c	Sat Apr 19 19:51:47 2003
+++ b/sound/oss/sonicvibes.c	Sat Apr 19 19:51:47 2003
@@ -100,7 +100,6 @@
 
 /*****************************************************************************/
       
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
@@ -1267,11 +1266,11 @@
 }
 
 static /*const*/ struct file_operations sv_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		sv_ioctl_mixdev,
-	open:		sv_open_mixdev,
-	release:	sv_release_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= sv_ioctl_mixdev,
+	.open		= sv_open_mixdev,
+	.release	= sv_release_mixdev,
 };
 
 /* --------------------------------------------------------------------- */
@@ -1978,15 +1977,15 @@
 }
 
 static /*const*/ struct file_operations sv_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		sv_read,
-	write:		sv_write,
-	poll:		sv_poll,
-	ioctl:		sv_ioctl,
-	mmap:		sv_mmap,
-	open:		sv_open,
-	release:	sv_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= sv_read,
+	.write		= sv_write,
+	.poll		= sv_poll,
+	.ioctl		= sv_ioctl,
+	.mmap		= sv_mmap,
+	.open		= sv_open,
+	.release	= sv_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2260,13 +2259,13 @@
 }
 
 static /*const*/ struct file_operations sv_midi_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		sv_midi_read,
-	write:		sv_midi_write,
-	poll:		sv_midi_poll,
-	open:		sv_midi_open,
-	release:	sv_midi_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= sv_midi_read,
+	.write		= sv_midi_write,
+	.poll		= sv_midi_poll,
+	.open		= sv_midi_open,
+	.release	= sv_midi_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2435,11 +2434,11 @@
 }
 
 static /*const*/ struct file_operations sv_dmfm_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		sv_dmfm_ioctl,
-	open:		sv_dmfm_open,
-	release:	sv_dmfm_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= sv_dmfm_ioctl,
+	.open		= sv_dmfm_open,
+	.release	= sv_dmfm_release,
 };
 
 /* --------------------------------------------------------------------- */
@@ -2716,10 +2715,10 @@
 MODULE_DEVICE_TABLE(pci, id_table);
 
 static struct pci_driver sv_driver = {
-       name: "sonicvibes",
-       id_table: id_table,
-       probe: sv_probe,
-       remove: sv_remove
+       .name		= "sonicvibes",
+       .id_table	= id_table,
+       .probe		= sv_probe,
+       .remove		= sv_remove,
 };
  
 static int __init init_sonicvibes(void)
diff -Nru a/sound/oss/sound_timer.c b/sound/oss/sound_timer.c
--- a/sound/oss/sound_timer.c	Sat Apr 19 19:51:48 2003
+++ b/sound/oss/sound_timer.c	Sat Apr 19 19:51:48 2003
@@ -264,16 +264,16 @@
 
 static struct sound_timer_operations sound_timer =
 {
-	owner:		THIS_MODULE,
-	info:		{"Sound Timer", 0},
-	priority:	1,	/* Priority */
-	devlink:	0,	/* Local device link */
-	open:		timer_open,
-	close:		timer_close,
-	event:		timer_event,
-	get_time:	timer_get_time,
-	ioctl:		timer_ioctl,
-	arm_timer:	timer_arm
+	.owner		= THIS_MODULE,
+	.info		= {"Sound Timer", 0},
+	.priority	= 1,	/* Priority */
+	.devlink	= 0,	/* Local device link */
+	.open		= timer_open,
+	.close		= timer_close,
+	.event		= timer_event,
+	.get_time	= timer_get_time,
+	.ioctl		= timer_ioctl,
+	.arm_timer	= timer_arm
 };
 
 void sound_timer_interrupt(void)
diff -Nru a/sound/oss/soundcard.c b/sound/oss/soundcard.c
--- a/sound/oss/soundcard.c	Sat Apr 19 19:51:47 2003
+++ b/sound/oss/soundcard.c	Sat Apr 19 19:51:47 2003
@@ -491,15 +491,15 @@
 }
 
 struct file_operations oss_sound_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		sound_read,
-	write:		sound_write,
-	poll:		sound_poll,
-	ioctl:		sound_ioctl,
-	mmap:		sound_mmap,
-	open:		sound_open,
-	release:	sound_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= sound_read,
+	.write		= sound_write,
+	.poll		= sound_poll,
+	.ioctl		= sound_ioctl,
+	.mmap		= sound_mmap,
+	.open		= sound_open,
+	.release	= sound_release,
 };
 
 /*
diff -Nru a/sound/oss/sys_timer.c b/sound/oss/sys_timer.c
--- a/sound/oss/sys_timer.c	Sat Apr 19 19:51:47 2003
+++ b/sound/oss/sys_timer.c	Sat Apr 19 19:51:47 2003
@@ -275,14 +275,14 @@
 
 struct sound_timer_operations default_sound_timer =
 {
-	owner:		THIS_MODULE,
-	info:		{"System clock", 0},
-	priority:	0,	/* Priority */
-	devlink:	0,	/* Local device link */
-	open:		def_tmr_open,
-	close:		def_tmr_close,
-	event:		def_tmr_event,
-	get_time:	def_tmr_get_time,
-	ioctl:		def_tmr_ioctl,
-	arm_timer:	def_tmr_arm
+	.owner		= THIS_MODULE,
+	.info		= {"System clock", 0},
+	.priority	= 0,	/* Priority */
+	.devlink	= 0,	/* Local device link */
+	.open		= def_tmr_open,
+	.close		= def_tmr_close,
+	.event		= def_tmr_event,
+	.get_time	= def_tmr_get_time,
+	.ioctl		= def_tmr_ioctl,
+	.arm_timer	= def_tmr_arm
 };
diff -Nru a/sound/oss/trident.c b/sound/oss/trident.c
--- a/sound/oss/trident.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/trident.c	Sat Apr 19 19:51:50 2003
@@ -181,7 +181,6 @@
 
 #include <linux/config.h>
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/string.h>
 #include <linux/ctype.h>
 #include <linux/ioport.h>
@@ -2772,15 +2771,15 @@
 }
 
 static /*const*/ struct file_operations trident_audio_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		trident_read,
-	write:		trident_write,
-	poll:		trident_poll,
-	ioctl:		trident_ioctl,
-	mmap:		trident_mmap,
-	open:		trident_open,
-	release:	trident_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= trident_read,
+	.write		= trident_write,
+	.poll		= trident_poll,
+	.ioctl		= trident_ioctl,
+	.mmap		= trident_mmap,
+	.open		= trident_open,
+	.release	= trident_release,
 };
 
 /* trident specific AC97 functions */
@@ -3894,10 +3893,10 @@
 }
 
 static /*const*/ struct file_operations trident_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		trident_ioctl_mixdev,
-	open:		trident_open_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= trident_ioctl_mixdev,
+	.open		= trident_open_mixdev,
 };
 
 static int ali_reset_5451(struct trident_card *card)
@@ -4376,12 +4375,12 @@
 #define TRIDENT_MODULE_NAME "trident"
 
 static struct pci_driver trident_pci_driver = {
-	name:		TRIDENT_MODULE_NAME,
-	id_table:	trident_pci_tbl,
-	probe:		trident_probe,
-	remove:		__devexit_p(trident_remove),
-	suspend:	trident_suspend,
-	resume:		trident_resume
+	.name		= TRIDENT_MODULE_NAME,
+	.id_table	= trident_pci_tbl,
+	.probe		= trident_probe,
+	.remove		= __devexit_p(trident_remove),
+	.suspend	= trident_suspend,
+	.resume		= trident_resume
 };
 
 static int __init trident_init_module (void)
diff -Nru a/sound/oss/uart401.c b/sound/oss/uart401.c
--- a/sound/oss/uart401.c	Sat Apr 19 19:51:50 2003
+++ b/sound/oss/uart401.c	Sat Apr 19 19:51:50 2003
@@ -204,17 +204,17 @@
 
 static const struct midi_operations uart401_operations =
 {
-	owner:		THIS_MODULE,
-	info:		{"MPU-401 (UART) MIDI", 0, 0, SNDCARD_MPU401},
-	converter:	&std_midi_synth,
-	in_info:	{0},
-	open:		uart401_open,
-	close:		uart401_close,
-	outputc:	uart401_out,
-	start_read:	uart401_start_read,
-	end_read:	uart401_end_read,
-	kick:		uart401_kick,
-	buffer_status:	uart401_buffer_status,
+	.owner		= THIS_MODULE,
+	.info		= {"MPU-401 (UART) MIDI", 0, 0, SNDCARD_MPU401},
+	.converter	= &std_midi_synth,
+	.in_info	= {0},
+	.open		= uart401_open,
+	.close		= uart401_close,
+	.outputc	= uart401_out,
+	.start_read	= uart401_start_read,
+	.end_read	= uart401_end_read,
+	.kick		= uart401_kick,
+	.buffer_status	= uart401_buffer_status,
 };
 
 static void enter_uart_mode(uart401_devc * devc)
diff -Nru a/sound/oss/uart6850.c b/sound/oss/uart6850.c
--- a/sound/oss/uart6850.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/uart6850.c	Sat Apr 19 19:51:49 2003
@@ -231,18 +231,18 @@
 
 static struct midi_operations uart6850_operations =
 {
-	owner:		THIS_MODULE,
-	info:		{"6850 UART", 0, 0, SNDCARD_UART6850},
-	converter:	&std_midi_synth,
-	in_info:	{0},
-	open:		uart6850_open,
-	close:		uart6850_close,
-	outputc:	uart6850_out,
-	start_read:	uart6850_start_read,
-	end_read:	uart6850_end_read,
-	kick:		uart6850_kick,
-	command:	uart6850_command,
-	buffer_status:	uart6850_buffer_status
+	.owner		= THIS_MODULE,
+	.info		= {"6850 UART", 0, 0, SNDCARD_UART6850},
+	.converter	= &std_midi_synth,
+	.in_info	= {0},
+	.open		= uart6850_open,
+	.close		= uart6850_close,
+	.outputc	= uart6850_out,
+	.start_read	= uart6850_start_read,
+	.end_read	= uart6850_end_read,
+	.kick		= uart6850_kick,
+	.command	= uart6850_command,
+	.buffer_status	= uart6850_buffer_status
 };
 
 
diff -Nru a/sound/oss/v_midi.c b/sound/oss/v_midi.c
--- a/sound/oss/v_midi.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/v_midi.c	Sat Apr 19 19:51:28 2003
@@ -133,30 +133,30 @@
 
 static struct midi_operations v_midi_operations =
 {
-	owner:		THIS_MODULE,
-	info:		{"Loopback MIDI Port 1", 0, 0, SNDCARD_VMIDI},
-	converter:	&std_midi_synth,
-	in_info:	{0},
-	open:		v_midi_open,
-	close:		v_midi_close,
-	ioctl:		v_midi_ioctl,
-	outputc:	v_midi_out,
-	start_read:	v_midi_start_read,
-	end_read:	v_midi_end_read,
+	.owner		= THIS_MODULE,
+	.info		= {"Loopback MIDI Port 1", 0, 0, SNDCARD_VMIDI},
+	.converter	= &std_midi_synth,
+	.in_info	= {0},
+	.open		= v_midi_open,
+	.close		= v_midi_close,
+	.ioctl		= v_midi_ioctl,
+	.outputc	= v_midi_out,
+	.start_read	= v_midi_start_read,
+	.end_read	= v_midi_end_read,
 };
 
 static struct midi_operations v_midi_operations2 =
 {
-	owner:		THIS_MODULE,
-	info:		{"Loopback MIDI Port 2", 0, 0, SNDCARD_VMIDI},
-	converter:	&std_midi_synth,
-	in_info:	{0},
-	open:		v_midi_open,
-	close:		v_midi_close,
-	ioctl:		v_midi_ioctl,
-	outputc:	v_midi_out,
-	start_read:	v_midi_start_read,
-	end_read:	v_midi_end_read,
+	.owner		= THIS_MODULE,
+	.info		= {"Loopback MIDI Port 2", 0, 0, SNDCARD_VMIDI},
+	.converter	= &std_midi_synth,
+	.in_info	= {0},
+	.open		= v_midi_open,
+	.close		= v_midi_close,
+	.ioctl		= v_midi_ioctl,
+	.outputc	= v_midi_out,
+	.start_read	= v_midi_start_read,
+	.end_read	= v_midi_end_read,
 };
 
 /*
diff -Nru a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c
--- a/sound/oss/via82cxxx_audio.c	Sat Apr 19 19:51:30 2003
+++ b/sound/oss/via82cxxx_audio.c	Sat Apr 19 19:51:30 2003
@@ -360,10 +360,10 @@
 
 
 static struct pci_driver via_driver = {
-	name:		VIA_MODULE_NAME,
-	id_table:	via_pci_tbl,
-	probe:		via_init_one,
-	remove:		__devexit_p(via_remove_one),
+	.name		= VIA_MODULE_NAME,
+	.id_table	= via_pci_tbl,
+	.probe		= via_init_one,
+	.remove		= __devexit_p(via_remove_one),
 };
 
 
@@ -1412,10 +1412,10 @@
 
 
 static struct file_operations via_mixer_fops = {
-	owner:		THIS_MODULE,
-	open:		via_mixer_open,
-	llseek:		no_llseek,
-	ioctl:		via_mixer_ioctl,
+	.owner		= THIS_MODULE,
+	.open		= via_mixer_open,
+	.llseek		= no_llseek,
+	.ioctl		= via_mixer_ioctl,
 };
 
 
@@ -1783,15 +1783,15 @@
  */
 
 static struct file_operations via_dsp_fops = {
-	owner:		THIS_MODULE,
-	open:		via_dsp_open,
-	release:	via_dsp_release,
-	read:		via_dsp_read,
-	write:		via_dsp_write,
-	poll:		via_dsp_poll,
-	llseek: 	no_llseek,
-	ioctl:		via_dsp_ioctl,
-	mmap:		via_dsp_mmap,
+	.owner		= THIS_MODULE,
+	.open		= via_dsp_open,
+	.release	= via_dsp_release,
+	.read		= via_dsp_read,
+	.write		= via_dsp_write,
+	.poll		= via_dsp_poll,
+	.llseek		= no_llseek,
+	.ioctl		= via_dsp_ioctl,
+	.mmap		= via_dsp_mmap,
 };
 
 
@@ -1902,10 +1902,10 @@
 
 
 struct vm_operations_struct via_mm_ops = {
-	nopage:		via_mm_nopage,
+	.nopage		= via_mm_nopage,
 
 #ifndef VM_RESERVED
-	swapout:	via_mm_swapout,
+	.swapout	= via_mm_swapout,
 #endif
 };
 
diff -Nru a/sound/oss/vidc.c b/sound/oss/vidc.c
--- a/sound/oss/vidc.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/vidc.c	Sat Apr 19 19:51:28 2003
@@ -366,26 +366,26 @@
 
 static struct audio_driver vidc_audio_driver =
 {
-	owner:			THIS_MODULE,
-	open:			vidc_audio_open,
-	close:			vidc_audio_close,
-	output_block:		vidc_audio_output_block,
-	start_input:		vidc_audio_start_input,
-	prepare_for_input:	vidc_audio_prepare_for_input,
-	prepare_for_output:	vidc_audio_prepare_for_output,
-	halt_io:		vidc_audio_reset,
-	local_qlen:		vidc_audio_local_qlen,
-	trigger:		vidc_audio_trigger,
-	set_speed:		vidc_audio_set_speed,
-	set_bits:		vidc_audio_set_format,
-	set_channels:		vidc_audio_set_channels
+	.owner			= THIS_MODULE,
+	.open			= vidc_audio_open,
+	.close			= vidc_audio_close,
+	.output_block		= vidc_audio_output_block,
+	.start_input		= vidc_audio_start_input,
+	.prepare_for_input	= vidc_audio_prepare_for_input,
+	.prepare_for_output	= vidc_audio_prepare_for_output,
+	.halt_io		= vidc_audio_reset,
+	.local_qlen		= vidc_audio_local_qlen,
+	.trigger		= vidc_audio_trigger,
+	.set_speed		= vidc_audio_set_speed,
+	.set_bits		= vidc_audio_set_format,
+	.set_channels		= vidc_audio_set_channels
 };
 
 static struct mixer_operations vidc_mixer_operations = {
-	owner:		THIS_MODULE,
-	id:		"VIDC",
-	name:		"VIDCsound",
-	ioctl:		vidc_mixer_ioctl
+	.owner		= THIS_MODULE,
+	.id		= "VIDC",
+	.name		= "VIDCsound",
+	.ioctl		= vidc_mixer_ioctl
 };
 
 void vidc_update_filler(int format, int channels)
diff -Nru a/sound/oss/waveartist.c b/sound/oss/waveartist.c
--- a/sound/oss/waveartist.c	Sat Apr 19 19:51:46 2003
+++ b/sound/oss/waveartist.c	Sat Apr 19 19:51:46 2003
@@ -815,21 +815,21 @@
 }
 
 static struct audio_driver waveartist_audio_driver = {
-	owner:			THIS_MODULE,
-	open:			waveartist_open,
-	close:			waveartist_close,
-	output_block:		waveartist_output_block,
-	start_input:		waveartist_start_input,
-	ioctl:			waveartist_ioctl,
-	prepare_for_input:	waveartist_prepare_for_input,
-	prepare_for_output:	waveartist_prepare_for_output,
-	halt_io:		waveartist_halt,
-	halt_input:		waveartist_halt_input,
-	halt_output:		waveartist_halt_output,
-	trigger:		waveartist_trigger,
-	set_speed:		waveartist_set_speed,
-	set_bits:		waveartist_set_bits,
-	set_channels:		waveartist_set_channels
+	.owner			= THIS_MODULE,
+	.open			= waveartist_open,
+	.close			= waveartist_close,
+	.output_block		= waveartist_output_block,
+	.start_input		= waveartist_start_input,
+	.ioctl			= waveartist_ioctl,
+	.prepare_for_input	= waveartist_prepare_for_input,
+	.prepare_for_output	= waveartist_prepare_for_output,
+	.halt_io		= waveartist_halt,
+	.halt_input		= waveartist_halt_input,
+	.halt_output		= waveartist_halt_output,
+	.trigger		= waveartist_trigger,
+	.set_speed		= waveartist_set_speed,
+	.set_bits		= waveartist_set_bits,
+	.set_channels		= waveartist_set_channels
 };
 
 
@@ -1062,15 +1062,15 @@
 }
 
 static const struct waveartist_mixer_info waveartist_mixer = {
-	supported_devs:	SUPPORTED_MIXER_DEVICES | SOUND_MASK_IGAIN,
-	recording_devs:	SOUND_MASK_LINE  | SOUND_MASK_MIC   |
+	.supported_devs	= SUPPORTED_MIXER_DEVICES | SOUND_MASK_IGAIN,
+	.recording_devs	= SOUND_MASK_LINE  | SOUND_MASK_MIC   |
 			SOUND_MASK_LINE1 | SOUND_MASK_LINE2 |
 			SOUND_MASK_IMIX,
-	stereo_devs:	(SUPPORTED_MIXER_DEVICES | SOUND_MASK_IGAIN) & ~
+	.stereo_devs	= (SUPPORTED_MIXER_DEVICES | SOUND_MASK_IGAIN) & ~
 			(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX),
-	select_input:	waveartist_select_input,
-	decode_mixer:	waveartist_decode_mixer,
-	get_mixer:	waveartist_get_mixer,
+	.select_input	= waveartist_select_input,
+	.decode_mixer	= waveartist_decode_mixer,
+	.get_mixer	= waveartist_get_mixer,
 };
 
 static void
@@ -1203,10 +1203,10 @@
 
 static struct mixer_operations waveartist_mixer_operations =
 {
-	owner:	THIS_MODULE,
-	id:	"WaveArtist",
-	name:	"WaveArtist",
-	ioctl:	waveartist_mixer_ioctl
+	.owner	= THIS_MODULE,
+	.id	= "WaveArtist",
+	.name	= "WaveArtist",
+	.ioctl	= waveartist_mixer_ioctl
 };
 
 static void
@@ -1692,24 +1692,24 @@
  * Waveartist specific mixer information.
  */
 static const struct waveartist_mixer_info netwinder_mixer = {
-	supported_devs:	SOUND_MASK_VOLUME  | SOUND_MASK_SYNTH   |
+	.supported_devs	= SOUND_MASK_VOLUME  | SOUND_MASK_SYNTH   |
 			SOUND_MASK_PCM     | SOUND_MASK_SPEAKER |
 			SOUND_MASK_LINE    | SOUND_MASK_MIC     |
 			SOUND_MASK_IMIX    | SOUND_MASK_LINE1   |
 			SOUND_MASK_PHONEIN | SOUND_MASK_PHONEOUT|
 			SOUND_MASK_IGAIN,
 
-	recording_devs:	SOUND_MASK_LINE    | SOUND_MASK_MIC     |
+	.recording_devs	= SOUND_MASK_LINE    | SOUND_MASK_MIC     |
 			SOUND_MASK_IMIX    | SOUND_MASK_LINE1   |
 			SOUND_MASK_PHONEIN,
 
-	stereo_devs:	SOUND_MASK_VOLUME  | SOUND_MASK_SYNTH   |
+	.stereo_devs	= SOUND_MASK_VOLUME  | SOUND_MASK_SYNTH   |
 			SOUND_MASK_PCM     | SOUND_MASK_LINE    |
 			SOUND_MASK_IMIX    | SOUND_MASK_IGAIN,
 
-	select_input:	netwinder_select_input,
-	decode_mixer:	netwinder_decode_mixer,
-	get_mixer:	netwinder_get_mixer,
+	.select_input	= netwinder_select_input,
+	.decode_mixer	= netwinder_decode_mixer,
+	.get_mixer	= netwinder_get_mixer,
 };
 
 static void
diff -Nru a/sound/oss/wavfront.c b/sound/oss/wavfront.c
--- a/sound/oss/wavfront.c	Sat Apr 19 19:51:48 2003
+++ b/sound/oss/wavfront.c	Sat Apr 19 19:51:48 2003
@@ -1961,11 +1961,11 @@
 }
 
 static /*const*/ struct file_operations wavefront_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		wavefront_ioctl,
-	open:		wavefront_open,
-	release:	wavefront_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= wavefront_ioctl,
+	.open		= wavefront_open,
+	.release	= wavefront_release,
 };
 
 
@@ -2078,25 +2078,25 @@
 
 static struct synth_operations wavefront_operations =
 {
-	owner:		THIS_MODULE,
-	id:		"WaveFront",
-	info:		&wavefront_info,
-	midi_dev:	0,
-	synth_type:	SYNTH_TYPE_SAMPLE,
-	synth_subtype:	SAMPLE_TYPE_WAVEFRONT,
-	open:		wavefront_oss_open,
-	close:		wavefront_oss_close,
-	ioctl:		wavefront_oss_ioctl,
-	kill_note:	midi_synth_kill_note,
-	start_note:	midi_synth_start_note,
-	set_instr:	midi_synth_set_instr,
-	reset:		midi_synth_reset,
-	load_patch:	midi_synth_load_patch,
-	aftertouch:	midi_synth_aftertouch,
-	controller:	midi_synth_controller,
-	panning:	midi_synth_panning,
-	bender:		midi_synth_bender,
-	setup_voice:	midi_synth_setup_voice
+	.owner		= THIS_MODULE,
+	.id		= "WaveFront",
+	.info		= &wavefront_info,
+	.midi_dev	= 0,
+	.synth_type	= SYNTH_TYPE_SAMPLE,
+	.synth_subtype	= SAMPLE_TYPE_WAVEFRONT,
+	.open		= wavefront_oss_open,
+	.close		= wavefront_oss_close,
+	.ioctl		= wavefront_oss_ioctl,
+	.kill_note	= midi_synth_kill_note,
+	.start_note	= midi_synth_start_note,
+	.set_instr	= midi_synth_set_instr,
+	.reset		= midi_synth_reset,
+	.load_patch	= midi_synth_load_patch,
+	.aftertouch	= midi_synth_aftertouch,
+	.controller	= midi_synth_controller,
+	.panning	= midi_synth_panning,
+	.bender		= midi_synth_bender,
+	.setup_voice	= midi_synth_setup_voice
 };
 #endif /* OSS_SUPPORT_SEQ */
 
diff -Nru a/sound/oss/wf_midi.c b/sound/oss/wf_midi.c
--- a/sound/oss/wf_midi.c	Sat Apr 19 19:51:28 2003
+++ b/sound/oss/wf_midi.c	Sat Apr 19 19:51:28 2003
@@ -552,16 +552,16 @@
 
 static struct midi_operations wf_mpu_midi_proto =
 {
-	owner:		THIS_MODULE,
-	info:		{"WF-MPU MIDI", 0, MIDI_CAP_MPU401, SNDCARD_MPU401},
-	in_info:	{0},   /* in_info */
-	open:		wf_mpu_open,
-	close:		wf_mpu_close,
-	ioctl:		wf_mpu_ioctl,
-	outputc:	wf_mpu_out,
-	start_read:	wf_mpu_start_read,
-	end_read:	wf_mpu_end_read,
-	buffer_status:	wf_mpu_buffer_status,
+	.owner		= THIS_MODULE,
+	.info		= {"WF-MPU MIDI", 0, MIDI_CAP_MPU401, SNDCARD_MPU401},
+	.in_info	= {0},   /* in_info */
+	.open		= wf_mpu_open,
+	.close		= wf_mpu_close,
+	.ioctl		= wf_mpu_ioctl,
+	.outputc	= wf_mpu_out,
+	.start_read	= wf_mpu_start_read,
+	.end_read	= wf_mpu_end_read,
+	.buffer_status	= wf_mpu_buffer_status,
 };
 
 static struct synth_info wf_mpu_synth_info_proto =
@@ -668,27 +668,27 @@
 
 static struct synth_operations wf_mpu_synth_proto =
 {
-	owner:		THIS_MODULE,
-	id:		"WaveFront (ICS2115)",
-	info:		NULL,  /* info field, filled in during configuration */
-	midi_dev:	0,     /* MIDI dev XXX should this be -1 ? */
-	synth_type:	SYNTH_TYPE_MIDI,
-	synth_subtype:	SAMPLE_TYPE_WAVEFRONT,
-	open:		wf_mpu_synth_open,
-	close:		wf_mpu_synth_close,
-	ioctl:		wf_mpu_synth_ioctl,
-	kill_note:	midi_synth_kill_note,
-	start_note:	midi_synth_start_note,
-	set_instr:	midi_synth_set_instr,
-	reset:		midi_synth_reset,
-	hw_control:	midi_synth_hw_control,
-	load_patch:	midi_synth_load_patch,
-	aftertouch:	midi_synth_aftertouch,
-	controller:	midi_synth_controller,
-	panning:	midi_synth_panning,
-	bender:		midi_synth_bender,
-	setup_voice:	midi_synth_setup_voice,
-	send_sysex:	midi_synth_send_sysex
+	.owner		= THIS_MODULE,
+	.id		= "WaveFront (ICS2115)",
+	.info		= NULL,  /* info field, filled in during configuration */
+	.midi_dev	= 0,     /* MIDI dev XXX should this be -1 ? */
+	.synth_type	= SYNTH_TYPE_MIDI,
+	.synth_subtype	= SAMPLE_TYPE_WAVEFRONT,
+	.open		= wf_mpu_synth_open,
+	.close		= wf_mpu_synth_close,
+	.ioctl		= wf_mpu_synth_ioctl,
+	.kill_note	= midi_synth_kill_note,
+	.start_note	= midi_synth_start_note,
+	.set_instr	= midi_synth_set_instr,
+	.reset		= midi_synth_reset,
+	.hw_control	= midi_synth_hw_control,
+	.load_patch	= midi_synth_load_patch,
+	.aftertouch	= midi_synth_aftertouch,
+	.controller	= midi_synth_controller,
+	.panning	= midi_synth_panning,
+	.bender		= midi_synth_bender,
+	.setup_voice	= midi_synth_setup_voice,
+	.send_sysex	= midi_synth_send_sysex
 };
 
 static int
diff -Nru a/sound/oss/ymfpci.c b/sound/oss/ymfpci.c
--- a/sound/oss/ymfpci.c	Sat Apr 19 19:51:49 2003
+++ b/sound/oss/ymfpci.c	Sat Apr 19 19:51:49 2003
@@ -2038,23 +2038,23 @@
 }
 
 static /*const*/ struct file_operations ymf_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	read:		ymf_read,
-	write:		ymf_write,
-	poll:		ymf_poll,
-	ioctl:		ymf_ioctl,
-	mmap:		ymf_mmap,
-	open:		ymf_open,
-	release:	ymf_release,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.read		= ymf_read,
+	.write		= ymf_write,
+	.poll		= ymf_poll,
+	.ioctl		= ymf_ioctl,
+	.mmap		= ymf_mmap,
+	.open		= ymf_open,
+	.release	= ymf_release,
 };
 
 static /*const*/ struct file_operations ymf_mixer_fops = {
-	owner:		THIS_MODULE,
-	llseek:		no_llseek,
-	ioctl:		ymf_ioctl_mixdev,
-	open:		ymf_open_mixdev,
-	release:	ymf_release_mixdev,
+	.owner		= THIS_MODULE,
+	.llseek		= no_llseek,
+	.ioctl		= ymf_ioctl_mixdev,
+	.open		= ymf_open_mixdev,
+	.release	= ymf_release_mixdev,
 };
 
 /*
@@ -2650,12 +2650,12 @@
 MODULE_LICENSE("GPL");
 
 static struct pci_driver ymfpci_driver = {
-	name:		"ymfpci",
-	id_table:	ymf_id_tbl,
-	probe:		ymf_probe_one,
-	remove:		__devexit_p(ymf_remove_one),
-	suspend:	ymf_suspend,
-	resume:		ymf_resume
+	.name		= "ymfpci",
+	.id_table	= ymf_id_tbl,
+	.probe		= ymf_probe_one,
+	.remove		= __devexit_p(ymf_remove_one),
+	.suspend	= ymf_suspend,
+	.resume		= ymf_resume
 };
 
 static int __init ymf_init_module(void)
diff -Nru a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
--- a/sound/pci/ac97/ac97_codec.c	Sat Apr 19 19:51:46 2003
+++ b/sound/pci/ac97/ac97_codec.c	Sat Apr 19 19:51:46 2003
@@ -113,7 +113,7 @@
 { 0x414c4740, 0xfffffff0, "ALC202",		NULL,		NULL },
 { 0x414c4750, 0xfffffff0, "ALC250",		NULL,		NULL },
 { 0x434d4941, 0xffffffff, "CMI9738",		NULL,		NULL },
-{ 0x434d4961, 0xffffffff, "CMI9739",		NULL,		NULL },
+{ 0x434d4961, 0xffffffff, "CMI9739",		patch_cm9739,	NULL },
 { 0x43525900, 0xfffffff8, "CS4297",		NULL,		NULL },
 { 0x43525910, 0xfffffff8, "CS4297A",		patch_cirrus_spdif,	NULL },
 { 0x43525920, 0xfffffff8, "CS4294/4298",	NULL,		NULL },
@@ -1056,15 +1056,13 @@
 	return snd_ac97_update_bits(ac97, AC97_AD_SERIAL_CFG, 0x0004, val);
 }
 
-static const snd_kcontrol_new_t snd_ac97_ad1980_spdif_source =
-	{
-		iface: SNDRV_CTL_ELEM_IFACE_MIXER,
-		name: SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
-		info: snd_ac97_ad1980_spdif_source_info,
-		get: snd_ac97_ad1980_spdif_source_get,
-		put: snd_ac97_ad1980_spdif_source_put,
-	};
-
+static const snd_kcontrol_new_t snd_ac97_ad1980_spdif_source = {
+	.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,
+	.name	= SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
+	.info	= snd_ac97_ad1980_spdif_source_info,
+	.get	= snd_ac97_ad1980_spdif_source_get,
+	.put	= snd_ac97_ad1980_spdif_source_put,
+};
 
 /*
  * ALC650
@@ -1243,6 +1241,70 @@
 	AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",NONE,NONE) "Mute", AC97_YMF753_DIT_CTRL2, 2, 1, 1)
 };
 
+
+/*
+ * C-Media codecs
+ */
+
+static int snd_ac97_cmedia_spdif_playback_source_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	static char *texts[] = { "Analog", "Digital" };
+
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 2;
+	if (uinfo->value.enumerated.item > 1)
+		uinfo->value.enumerated.item = 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_ac97_cmedia_spdif_playback_source_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+	unsigned short val;
+
+	val = ac97->regs[AC97_CM9739_SPDIF_CTRL];
+	ucontrol->value.enumerated.item[0] = (val >> 1) & 0x01;
+	return 0;
+}
+
+static int snd_ac97_cmedia_spdif_playback_source_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	ac97_t *ac97 = snd_kcontrol_chip(kcontrol);
+
+	return snd_ac97_update_bits(ac97, AC97_CM9739_SPDIF_CTRL,
+				    0x01 << 1, 
+				    (ucontrol->value.enumerated.item[0] & 0x01) << 1);
+}
+
+static const snd_kcontrol_new_t snd_ac97_cm9739_controls_spdif[] = {
+	/* BIT 0: SPDI_EN - always true */
+	{ /* BIT 1: SPDIFS */
+		.iface	= SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name	= SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "Source",
+		.info	= snd_ac97_cmedia_spdif_playback_source_info,
+		.get	= snd_ac97_cmedia_spdif_playback_source_get,
+		.put	= snd_ac97_cmedia_spdif_playback_source_put,
+	},
+	/* BIT 2: IG_SPIV */
+	AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,NONE) "Valid Switch", AC97_CM9739_SPDIF_CTRL, 2, 1, 0),
+	/* BIT 3: SPI2F */
+	AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,NONE) "Monitor", AC97_CM9739_SPDIF_CTRL, 3, 1, 0), 
+	/* BIT 4: SPI2SDI */
+	AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",CAPTURE,SWITCH), AC97_CM9739_SPDIF_CTRL, 4, 1, 0),
+	/* BIT 8: SPD32 - 32bit SPDIF - not supported yet */
+};
+
+static const snd_kcontrol_new_t snd_ac97_cm9739_controls[] = {
+	AC97_SINGLE("Line-In As Surround", AC97_CM9739_MULTI_CHAN, 10, 1, 0),
+};
+
+static const snd_kcontrol_new_t snd_ac97_cm9738_controls[] = {
+	AC97_SINGLE("Line-In As Surround", AC97_CM9738_VENDOR_CTRL, 10, 1, 0),
+	AC97_SINGLE("Duplicate Front", AC97_CM9738_VENDOR_CTRL, 13, 1, 0),
+};
+
 /*
  *
  */
@@ -1572,12 +1634,18 @@
 			ac97->spec.ad18xx.pcmreg[2] = 0x9f1f;
 		}
 	} else {
+		/* FIXME: C-Media chips have no PCM volume!! */
+		if (/*ac97->id == 0x434d4941 ||*/
+		    ac97->id == 0x434d4942 ||
+		    ac97->id == 0x434d4961)
+			goto no_pcm;
 		for (idx = 0; idx < 2; idx++)
 			if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_pcm[idx], ac97))) < 0)
 				return err;
 	}
 	snd_ac97_write_cache(ac97, AC97_PCM, 0x9f1f);
 
+ no_pcm:
 	/* build Capture controls */
 	for (idx = 0; idx < 3; idx++)
 		if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_capture[idx], ac97))) < 0)
@@ -1721,13 +1789,21 @@
 			for (idx = 0; idx < 5; idx++)
 				if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_spdif[idx], ac97))) < 0)
 					return err;
-			if (ac97->id == AC97_ID_YMF753) {
+			switch (ac97->id) {
+			case AC97_ID_YMF753:
 				for (idx = 0; idx < 3; idx++)
 					if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_ymf753_controls_spdif[idx], ac97))) < 0)
 						return err;
-			} else if (ac97->id == AC97_ID_AD1980) {
+				break;
+			case AC97_ID_AD1980:
 				if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_ad1980_spdif_source, ac97))) < 0)
 					return err;
+				break;
+			case AC97_ID_CM9739:
+				for (idx = 0; idx < ARRAY_SIZE(snd_ac97_cm9739_controls_spdif); idx++)
+					if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_cm9739_controls_spdif[idx], ac97))) < 0)
+						return err;
+				break;
 			}
 			/* set default PCM S/PDIF params */
 			/* consumer,PCM audio,no copyright,no preemphasis,PCM coder,original,48000Hz */
@@ -1770,6 +1846,16 @@
 			if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_vt1616[idx], ac97))) < 0)
 				return err;
 		break;
+	case AC97_ID_CM9739:
+		for (idx = 1; idx < ARRAY_SIZE(snd_ac97_cm9739_controls); idx++)
+			if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_cm9739_controls[idx], ac97))) < 0)
+				return err;
+		break;
+	case AC97_ID_CM9738:
+		for (idx = 1; idx < ARRAY_SIZE(snd_ac97_cm9738_controls); idx++)
+			if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_cm9738_controls[idx], ac97))) < 0)
+				return err;
+		break;
 	default:
 		/* nothing */
 		break;
@@ -2029,7 +2115,12 @@
 	}
 	if (ac97->ext_id & AC97_EI_SPDIF) {
 		/* codec specific code (patch) should override these values */
-		ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000 |
+		if (ac97->flags & AC97_CS_SPDIF)
+			ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_44100;
+		else if (ac97->id == AC97_ID_CM9739)
+			ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000;
+		else
+			ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000 |
 						SNDRV_PCM_RATE_44100 |
 						SNDRV_PCM_RATE_32000;
 	}
@@ -2149,6 +2240,12 @@
 	ac97->card = card;
 	spin_lock_init(&ac97->reg_lock);
 
+	ac97->pci = _ac97->pci;
+	if (ac97->pci) {
+		pci_read_config_word(ac97->pci, PCI_SUBSYSTEM_VENDOR_ID, &ac97->subsystem_vendor);
+		pci_read_config_word(ac97->pci, PCI_SUBSYSTEM_ID, &ac97->subsystem_device);
+	}
+
 	if (ac97->reset) {
 		ac97->reset(ac97);
 		goto __access_ok;
@@ -2537,7 +2634,7 @@
 
 static int set_spdif_rate(ac97_t *ac97, unsigned short rate)
 {
-	unsigned short old, bits, reg;
+	unsigned short old, bits, reg, mask;
 
 	if (! (ac97->ext_id & AC97_EI_SPDIF))
 		return -ENODEV;
@@ -2551,7 +2648,12 @@
 			return -EINVAL;
 		}
 		reg = AC97_CSR_SPDIF;
+		mask = 1 << AC97_SC_SPSR_SHIFT;
 	} else {
+		if (ac97->id == AC97_ID_CM9739 && rate != 48000) {
+			snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0);
+			return -EINVAL;
+		}
 		switch (rate) {
 		case 44100: bits = AC97_SC_SPSR_44K; break;
 		case 48000: bits = AC97_SC_SPSR_48K; break;
@@ -2561,14 +2663,15 @@
 			return -EINVAL;
 		}
 		reg = AC97_SPDIF;
+		mask = AC97_SC_SPSR_MASK;
 	}
 
 	spin_lock(&ac97->reg_lock);
-	old = ac97->regs[reg] & ~AC97_SC_SPSR_MASK;
+	old = ac97->regs[reg] & ~mask;
 	spin_unlock(&ac97->reg_lock);
 	if (old != bits) {
 		snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0);
-		snd_ac97_update_bits(ac97, reg, AC97_SC_SPSR_MASK, bits);
+		snd_ac97_update_bits(ac97, reg, mask, bits);
 	}
 	snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF);
 	return 0;
@@ -2660,7 +2763,7 @@
  */
 void snd_ac97_resume(ac97_t *ac97)
 {
-	int i;
+	int i, is_ad18xx, codec;
 
 	if (ac97->reset) {
 		ac97->reset(ac97);
@@ -2685,6 +2788,20 @@
 	if (ac97->init)
 		ac97->init(ac97);
 
+	is_ad18xx = (ac97->id & 0xffffff40) == AC97_ID_AD1881;
+	if (is_ad18xx) {
+		/* restore the AD18xx codec configurations */
+		for (codec = 0; codec < 3; codec++) {
+			if (! ac97->spec.ad18xx.id[codec])
+				continue;
+			/* select single codec */
+			ac97->write(ac97, AC97_AD_SERIAL_CFG, ac97->spec.ad18xx.unchained[codec] | ac97->spec.ad18xx.chained[codec]);
+			ac97->write(ac97, AC97_AD_CODEC_CFG, ac97->spec.ad18xx.codec_cfg[codec]);
+		}
+		/* select all codecs */
+		ac97->write(ac97, AC97_AD_SERIAL_CFG, 0x7000);
+	}
+
 	/* restore ac97 status */
 	for (i = 2; i < 0x7c ; i += 2) {
 		if (i == AC97_POWERDOWN || i == AC97_EXTENDED_ID)
@@ -2693,8 +2810,42 @@
 		 * some chip (e.g. nm256) may hang up when unsupported registers
 		 * are accessed..!
 		 */
-		if (test_bit(i, ac97->reg_accessed))
+		if (test_bit(i, ac97->reg_accessed)) {
+			if (is_ad18xx) {
+				/* handle multi codecs for AD18xx */
+				if (i == AC97_PCM) {
+					for (codec = 0; codec < 3; codec++) {
+						if (! ac97->spec.ad18xx.id[codec])
+							continue;
+						/* select single codec */
+						ac97->write(ac97, AC97_AD_SERIAL_CFG, ac97->spec.ad18xx.unchained[codec] | ac97->spec.ad18xx.chained[codec]);
+						/* update PCM bits */
+						ac97->write(ac97, AC97_PCM, ac97->spec.ad18xx.pcmreg[codec]);
+					}
+					/* select all codecs */
+					ac97->write(ac97, AC97_AD_SERIAL_CFG, 0x7000);
+					continue;
+				} else if (i == AC97_AD_TEST ||
+					   i == AC97_AD_CODEC_CFG ||
+					   i == AC97_AD_SERIAL_CFG)
+					continue; /* ignore */
+			}
 			snd_ac97_write(ac97, i, ac97->regs[i]);
+			snd_ac97_read(ac97, i);
+		}
+	}
+
+	if (ac97->ext_id & AC97_EI_SPDIF) {
+		if (ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_SPDIF) {
+			/* reset spdif status */
+			snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0);
+			snd_ac97_write(ac97, AC97_EXTENDED_STATUS, ac97->regs[AC97_EXTENDED_STATUS]);
+			if (ac97->flags & AC97_CS_SPDIF)
+				snd_ac97_write(ac97, AC97_CSR_SPDIF, ac97->regs[AC97_CSR_SPDIF]);
+			else
+				snd_ac97_write(ac97, AC97_SPDIF, ac97->regs[AC97_SPDIF]);
+			snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */
+		}
 	}
 }
 #endif
@@ -2742,7 +2893,6 @@
 /**
  * snd_ac97_tune_hardware - tune up the hardware
  * @ac97: the ac97 instance
- * @pci: pci device
  * @quirk: quirk list
  *
  * Do some workaround for each pci device, such as renaming of the
@@ -2752,18 +2902,13 @@
  * Returns zero if successful, or a negative error code on failure.
  */
 
-int snd_ac97_tune_hardware(ac97_t *ac97, struct pci_dev *pci, struct ac97_quirk *quirk)
+int snd_ac97_tune_hardware(ac97_t *ac97, struct ac97_quirk *quirk)
 {
-	unsigned short vendor, device;
-
 	snd_assert(quirk, return -EINVAL);
 
-	pci_read_config_word(pci, PCI_SUBSYSTEM_VENDOR_ID, &vendor);
-	pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &device);
-
 	for (; quirk->vendor; quirk++) {
-		if (quirk->vendor == vendor && quirk->device == device) {
-			snd_printdd("ac97 quirk for %s (%04x:%04x)\n", quirk->name, vendor, device);
+		if (quirk->vendor == ac97->subsystem_vendor && quirk->device == ac97->subsystem_device) {
+			snd_printdd("ac97 quirk for %s (%04x:%04x)\n", quirk->name, ac97->subsystem_vendor, ac97->subsystem_device);
 			switch (quirk->type) {
 			case AC97_TUNE_HP_ONLY:
 				return swap_headphone(ac97, 1);
diff -Nru a/sound/pci/ac97/ac97_id.h b/sound/pci/ac97/ac97_id.h
--- a/sound/pci/ac97/ac97_id.h	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/ac97/ac97_id.h	Sat Apr 19 19:51:50 2003
@@ -48,3 +48,5 @@
 #define AC97_ID_ALC650		0x414c4720
 #define AC97_ID_YMF753		0x594d4803
 #define AC97_ID_VT1616		0x49434551
+#define AC97_ID_CM9738		0x434d4941
+#define AC97_ID_CM9739		0x434d4961
diff -Nru a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c
--- a/sound/pci/ac97/ac97_patch.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/ac97/ac97_patch.c	Sat Apr 19 19:51:50 2003
@@ -221,6 +221,7 @@
 		return 0;
 	ac97->spec.ad18xx.unchained[idx] = mask;
 	ac97->spec.ad18xx.id[idx] = val;
+	ac97->spec.ad18xx.codec_cfg[idx] = 0x0000;
 	return mask;
 }
 
@@ -238,6 +239,7 @@
 		snd_ac97_write_cache(ac97, AC97_AD_CODEC_CFG, codec_bits);
 	ac97->spec.ad18xx.chained[idx] = cfg_bits[idx];
 	ac97->spec.ad18xx.id[idx] = val;
+	ac97->spec.ad18xx.codec_cfg[idx] = codec_bits ? codec_bits : 0x0004;
 	return 1;
 }
 
@@ -253,6 +255,7 @@
 	// test for chained codecs
 	snd_ac97_write_cache(ac97, AC97_AD_SERIAL_CFG, ac97->spec.ad18xx.unchained[unchained_idx]);
 	snd_ac97_write_cache(ac97, AC97_AD_CODEC_CFG, 0x0002);		// ID1C
+	ac97->spec.ad18xx.codec_cfg[unchained_idx] = 0x0002;
 	if (cidx1 >= 0) {
 		if (patch_ad1881_chained1(ac97, cidx1, 0x0006))		// SDIE | ID1C
 			patch_ad1881_chained1(ac97, cidx2, 0);
@@ -306,6 +309,9 @@
 	if (num == 1) {
 		/* ok, deselect all ID bits */
 		snd_ac97_write_cache(ac97, AC97_AD_CODEC_CFG, 0x0000);
+		ac97->spec.ad18xx.codec_cfg[0] = 
+			ac97->spec.ad18xx.codec_cfg[1] = 
+			ac97->spec.ad18xx.codec_cfg[2] = 0x0000;
 	}
 	/* required for AD1886/AD1885 combination */
 	ac97->ext_id = snd_ac97_read(ac97, AC97_EXTENDED_ID);
@@ -373,3 +379,31 @@
 	snd_ac97_write_cache(ac97, AC97_ALC650_LFE_DAC_VOL, 0x0808);
 	return 0;
 }
+
+int patch_cm9739(ac97_t * ac97)
+{
+	unsigned short val;
+
+	/* check spdif */
+	val = snd_ac97_read(ac97, AC97_EXTENDED_STATUS);
+	if (val & AC97_EA_SPCV) {
+		/* enable spdif in */
+		snd_ac97_write_cache(ac97, AC97_CM9739_SPDIF_CTRL,
+				     snd_ac97_read(ac97, AC97_CM9739_SPDIF_CTRL) | 0x01);
+	} else {
+		ac97->ext_id &= ~AC97_EI_SPDIF; /* disable extended-id */
+	}
+
+	/* set-up multi channel */
+	/* bit 13: enable internal vref output for mic */
+	/* bit 12: enable center/lfe */
+	/* bit 14: 0 = SPDIF, 1 = EAPD */
+	snd_ac97_write_cache(ac97, AC97_CM9739_MULTI_CHAN, 0x3000);
+
+	/* FIXME: set up GPIO */
+	snd_ac97_write_cache(ac97, 0x70, 0x0100);
+	snd_ac97_write_cache(ac97, 0x72, 0x0020);
+
+	return 0;
+}
+
diff -Nru a/sound/pci/ac97/ac97_patch.h b/sound/pci/ac97/ac97_patch.h
--- a/sound/pci/ac97/ac97_patch.h	Sat Apr 19 19:51:27 2003
+++ b/sound/pci/ac97/ac97_patch.h	Sat Apr 19 19:51:27 2003
@@ -40,3 +40,4 @@
 int patch_ad1886(ac97_t * ac97);
 int patch_ad1980(ac97_t * ac97);
 int patch_alc650(ac97_t * ac97);
+int patch_cm9739(ac97_t * ac97);
diff -Nru a/sound/pci/ali5451/ali5451.c b/sound/pci/ali5451/ali5451.c
--- a/sound/pci/ali5451/ali5451.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/ali5451/ali5451.c	Sat Apr 19 19:51:50 2003
@@ -375,24 +375,27 @@
 				unsigned int port,
 				int sched )
 {
-	signed long end_time;
+	unsigned long end_time;
+	unsigned int res;
 	
 	end_time = jiffies + 10 * (HZ >> 2);
 	do {
-		if (!(snd_ali_5451_peek(codec,port) & 0x8000))
+		res = snd_ali_5451_peek(codec,port);
+		if (! (res & 0x8000))
 			return 0;
 		if (sched) {
 			set_current_state(TASK_UNINTERRUPTIBLE);
 			schedule_timeout(1);
 		}
-	} while (end_time - (signed long)jiffies >= 0);
-	snd_printk("ali_codec_ready: codec is not ready.\n ");
+	} while (time_after_eq(end_time, jiffies));
+	snd_ali_5451_poke(codec, port, res & ~0x8000);
+	snd_printdd("ali_codec_ready: codec is not ready.\n ");
 	return -EIO;
 }
 
 static int snd_ali_stimer_ready(ali_t *codec, int sched)
 {
-	signed long end_time;
+	unsigned long end_time;
 	unsigned long dwChk1,dwChk2;
 	
 	dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER);
@@ -407,7 +410,7 @@
 			set_current_state(TASK_UNINTERRUPTIBLE);
 			schedule_timeout(1);
 		}
-	} while (end_time - (signed long)jiffies >= 0);
+	} while (time_after_eq(end_time, jiffies));
 	snd_printk("ali_stimer_read: stimer is not ready.\n");
 	return -EIO;
 }
diff -Nru a/sound/pci/cmipci.c b/sound/pci/cmipci.c
--- a/sound/pci/cmipci.c	Sat Apr 19 19:51:49 2003
+++ b/sound/pci/cmipci.c	Sat Apr 19 19:51:49 2003
@@ -1443,7 +1443,7 @@
 					ctl->put(ctl, &val); /* toggle */
 					event |= SNDRV_CTL_EVENT_MASK_VALUE;
 				}
-				ctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+				ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 				snd_ctl_notify(cm->card, event, &ctl->id);
 			}
 		}
@@ -1466,7 +1466,7 @@
 				int event;
 
 				memset(&val, 0, sizeof(val));
-				ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+				ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 				ctl->get(ctl, &val);
 				event = SNDRV_CTL_EVENT_MASK_INFO;
 				if (val.value.integer.value[0] != cm->mixer_res_status[i]) {
diff -Nru a/sound/pci/cs4281.c b/sound/pci/cs4281.c
--- a/sound/pci/cs4281.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/cs4281.c	Sat Apr 19 19:51:50 2003
@@ -534,7 +534,7 @@
 {
 	if (delay > 999) {
 		if (can_schedule) {
-			signed long end_time;
+			unsigned long end_time;
 			delay = (delay * HZ) / 1000000;
 			if (delay < 1)
 				delay = 1;
@@ -542,7 +542,7 @@
 			do {
 				set_current_state(TASK_UNINTERRUPTIBLE);
 				schedule_timeout(1);
-			} while (end_time - (signed long)jiffies >= 0);
+			} while (time_after_eq(end_time, jiffies));
 		} else {
 			delay += 999;
 			delay /= 1000;
diff -Nru a/sound/pci/cs46xx/cs46xx.c b/sound/pci/cs46xx/cs46xx.c
--- a/sound/pci/cs46xx/cs46xx.c	Sat Apr 19 19:51:51 2003
+++ b/sound/pci/cs46xx/cs46xx.c	Sat Apr 19 19:51:51 2003
@@ -124,6 +124,14 @@
 		snd_card_free(card);
 		return err;
 	}
+#ifdef CONFIG_SND_CS46XX_NEW_DSP
+	if (chip->nr_ac97_codecs ==2) {
+		if ((err = snd_cs46xx_pcm_center_lfe(chip,3,NULL)) < 0) {
+			snd_card_free(card);
+			return err;
+		}
+	}
+#endif
 	if ((err = snd_cs46xx_midi(chip, 0, NULL)) < 0) {
 		snd_card_free(card);
 		return err;
diff -Nru a/sound/pci/cs46xx/cs46xx_lib.c b/sound/pci/cs46xx/cs46xx_lib.c
--- a/sound/pci/cs46xx/cs46xx_lib.c	Sat Apr 19 19:51:28 2003
+++ b/sound/pci/cs46xx/cs46xx_lib.c	Sat Apr 19 19:51:28 2003
@@ -1014,6 +1014,8 @@
 			substream->ops = &snd_cs46xx_playback_ops;
 		} else if (cpcm->pcm_channel_id == DSP_PCM_REAR_CHANNEL) {
 			substream->ops = &snd_cs46xx_playback_rear_ops;
+		} else if (cpcm->pcm_channel_id == DSP_PCM_CENTER_LFE_CHANNEL) {
+			substream->ops = &snd_cs46xx_playback_clfe_ops;
 		} else if (cpcm->pcm_channel_id == DSP_IEC958_CHANNEL) {
 			substream->ops = &snd_cs46xx_playback_iec958_ops;
 		} else {
@@ -1041,6 +1043,8 @@
 			substream->ops = &snd_cs46xx_playback_indirect_ops;
 		} else if (cpcm->pcm_channel_id == DSP_PCM_REAR_CHANNEL) {
 			substream->ops = &snd_cs46xx_playback_indirect_rear_ops;
+		} else if (cpcm->pcm_channel_id == DSP_PCM_CENTER_LFE_CHANNEL) {
+			substream->ops = &snd_cs46xx_playback_indirect_clfe_ops;
 		} else if (cpcm->pcm_channel_id == DSP_IEC958_CHANNEL) {
 			substream->ops = &snd_cs46xx_playback_indirect_iec958_ops;
 		} else {
@@ -1423,6 +1427,13 @@
 	return _cs46xx_playback_open_channel(substream,DSP_PCM_REAR_CHANNEL);
 }
 
+static int snd_cs46xx_playback_open_clfe(snd_pcm_substream_t * substream)
+{
+	snd_printdd("open center - LFE channel\n");
+
+	return _cs46xx_playback_open_channel(substream,DSP_PCM_CENTER_LFE_CHANNEL);
+}
+
 static int snd_cs46xx_playback_open_iec958(snd_pcm_substream_t * substream)
 {
 	cs46xx_t *chip = snd_pcm_substream_chip(substream);
@@ -1541,6 +1552,29 @@
 	.ack =			snd_cs46xx_playback_transfer,
 };
 
+snd_pcm_ops_t snd_cs46xx_playback_clfe_ops = {
+	.open =			snd_cs46xx_playback_open_clfe,
+	.close =		snd_cs46xx_playback_close,
+	.ioctl =		snd_pcm_lib_ioctl,
+	.hw_params =		snd_cs46xx_playback_hw_params,
+	.hw_free =		snd_cs46xx_playback_hw_free,
+	.prepare =		snd_cs46xx_playback_prepare,
+	.trigger =		snd_cs46xx_playback_trigger,
+	.pointer =		snd_cs46xx_playback_direct_pointer,
+};
+
+snd_pcm_ops_t snd_cs46xx_playback_indirect_clfe_ops = {
+	.open =			snd_cs46xx_playback_open_clfe,
+	.close =		snd_cs46xx_playback_close,
+	.ioctl =		snd_pcm_lib_ioctl,
+	.hw_params =		snd_cs46xx_playback_hw_params,
+	.hw_free =		snd_cs46xx_playback_hw_free,
+	.prepare =		snd_cs46xx_playback_prepare,
+	.trigger =		snd_cs46xx_playback_trigger,
+	.pointer =		snd_cs46xx_playback_indirect_pointer,
+	.ack =			snd_cs46xx_playback_transfer,
+};
+
 snd_pcm_ops_t snd_cs46xx_playback_iec958_ops = {
 	.open =			snd_cs46xx_playback_open_iec958,
 	.close =		snd_cs46xx_playback_close_iec958,
@@ -1627,6 +1661,13 @@
 	snd_pcm_lib_preallocate_free_for_all(pcm);
 }
 
+static void snd_cs46xx_pcm_center_lfe_free(snd_pcm_t *pcm)
+{
+	cs46xx_t *chip = snd_magic_cast(cs46xx_t, pcm->private_data, return);
+	chip->pcm_center_lfe = NULL;
+	snd_pcm_lib_preallocate_free_for_all(pcm);
+}
+
 static void snd_cs46xx_pcm_iec958_free(snd_pcm_t *pcm)
 {
 	cs46xx_t *chip = snd_magic_cast(cs46xx_t, pcm->private_data, return);
@@ -1699,6 +1740,35 @@
 	return 0;
 }
 
+int __devinit snd_cs46xx_pcm_center_lfe(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
+{
+	snd_pcm_t *pcm;
+	int err;
+
+	if (rpcm)
+		*rpcm = NULL;
+
+	if ((err = snd_pcm_new(chip->card, "CS46xx - Center LFE", device, MAX_PLAYBACK_CHANNELS, 0, &pcm)) < 0)
+		return err;
+
+	pcm->private_data = chip;
+	pcm->private_free = snd_cs46xx_pcm_center_lfe_free;
+
+	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs46xx_playback_clfe_ops);
+
+	/* global setup */
+	pcm->info_flags = 0;
+	strcpy(pcm->name, "CS46xx - Center LFE");
+	chip->pcm_center_lfe = pcm;
+
+	snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, 64*1024, 256*1024);
+
+	if (rpcm)
+		*rpcm = pcm;
+
+	return 0;
+}
+
 int __devinit snd_cs46xx_pcm_iec958(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
 {
 	snd_pcm_t *pcm;
@@ -1812,6 +1882,7 @@
 	return change;
 }
 
+#if 0
 static int snd_cs46xx_vol_iec958_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
@@ -1836,6 +1907,7 @@
 
 	return change;
 }
+#endif
 
 static int snd_mixer_boolean_info(snd_kcontrol_t *kcontrol, 
 				  snd_ctl_elem_info_t *uinfo)
@@ -2234,6 +2306,8 @@
 	.put = snd_cs46xx_iec958_put,
 	.private_value = CS46XX_MIXER_SPDIF_INPUT_ELEMENT,
 },
+#if 0
+/* Input IEC958 volume does not work for the moment. (Benny) */
 {
 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 	.name = "IEC958 Input Volume",
@@ -2242,6 +2316,7 @@
 	.put = snd_cs46xx_vol_iec958_put,
 	.private_value = (ASYNCRX_SCB_ADDR + 0xE) << 2,
 },
+#endif
 {
 	.iface = SNDRV_CTL_ELEM_IFACE_PCM,
 	.name =  SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
@@ -2314,16 +2389,25 @@
 };
 
 
-static void snd_cs46xx_sec_codec_reset (ac97_t * ac97)
+static void snd_cs46xx_codec_reset (ac97_t * ac97)
 {
 	unsigned long end_time;
 	int err;
+	cs46xx_t * chip = snd_magic_cast(cs46xx_t,ac97->private_data,return /* -ENXIO */);
 
 	/* reset to defaults */
 	snd_ac97_write(ac97, AC97_RESET, 0);	
 
-	/* set codec in extended mode */
-	snd_cs46xx_ac97_write(ac97,AC97_CSR_ACMODE,0x3);
+	/* set the desired CODEC mode */
+	if (chip->nr_ac97_codecs == 0) {
+		snd_printdd("cs46xx: CODOEC1 mode %04x\n",0x0);
+		snd_cs46xx_ac97_write(ac97,AC97_CSR_ACMODE,0x0);
+	} else if (chip->nr_ac97_codecs == 1) {
+		snd_printdd("cs46xx: CODOEC2 mode %04x\n",0x3);
+		snd_cs46xx_ac97_write(ac97,AC97_CSR_ACMODE,0x3);
+	} else {
+		snd_assert(0); /* should never happen ... */
+	}
 
 	udelay(50);
 
@@ -2372,7 +2456,9 @@
 	ac97.read = snd_cs46xx_ac97_read;
 	ac97.private_data = chip;
 	ac97.private_free = snd_cs46xx_mixer_free_ac97;
-
+#ifdef CONFIG_SND_CS46XX_NEW_DSP
+	ac97.reset = snd_cs46xx_codec_reset;
+#endif
 	chip->ac97[CS46XX_PRIMARY_CODEC_INDEX] = &ac97;
 
 	snd_cs46xx_ac97_write(&ac97, AC97_MASTER, 0x8000);
@@ -2432,7 +2518,7 @@
 
 	/* use custom reset to set secondary codec in
 	   extended mode */
-	ac97.reset = snd_cs46xx_sec_codec_reset;
+	ac97.reset = snd_cs46xx_codec_reset;
 
 	if ((err = snd_ac97_mixer(card, &ac97, &chip->ac97[CS46XX_SECONDARY_CODEC_INDEX])) < 0)
 		return err;
@@ -2870,6 +2956,7 @@
 		kfree(chip->gameport);
 	}
 #endif
+
 	if (chip->amplifier_ctrl)
 		chip->amplifier_ctrl(chip, -chip->amplifier); /* force to off */
 	
@@ -2892,10 +2979,14 @@
 
 	if (chip->active_ctrl)
 		chip->active_ctrl(chip, -chip->amplifier);
-
+	
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-	cs46xx_dsp_spos_destroy(chip);
+	if (chip->dsp_spos_instance) {
+		cs46xx_dsp_spos_destroy(chip);
+		chip->dsp_spos_instance = NULL;
+	}
 #endif
+	
 	snd_magic_kfree(chip);
 	return 0;
 }
@@ -3104,8 +3195,21 @@
 		}
 	}
 
+#ifndef CONFIG_SND_CS46XX_NEW_DSP
 	snd_printk("create - never read ISV3 & ISV4 from AC'97\n");
 	return -EIO;
+#else
+	/* This may happen on a cold boot with a Terratec SiXPack 5.1.
+	   Reloading the driver may help, if there's other soundcards 
+	   with the same problem I would like to know. (Benny) */
+
+	snd_printk("ERROR: snd-cs46xx: never read ISV3 & ISV4 from AC'97\n");
+	snd_printk("       Try reloading the ALSA driver, if you find something\n");
+        snd_printk("       broken or not working on your soundcard upon\n");
+	snd_printk("       this message please report to alsa-devel@lists.sourceforge.net\n");
+
+	return -EIO;
+#endif
  ok2:
 
 	/*
@@ -3113,8 +3217,7 @@
 	 *  commense the transfer of digital audio data to the AC97 codec.
 	 */
 
-	snd_cs46xx_pokeBA0(chip, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4 | 
-			   ACOSV_SLV7 | ACOSV_SLV8);
+	snd_cs46xx_pokeBA0(chip, BA0_ACOSV, ACOSV_SLV3 | ACOSV_SLV4);
 
 
 	/*
@@ -3224,21 +3327,7 @@
 	tmp |=  0x00000001;
 	snd_cs46xx_poke(chip, BA1_CIE, tmp);	/* capture interrupt enable */
 	
-#ifdef CONFIG_SND_CS46XX_NEW_DSP
-	/* set the attenuation to 0dB */ 
-	/* snd_cs46xx_poke(chip, (MASTERMIX_SCB_ADDR + 0xE) << 2, 0x80008000); 
-	   snd_cs46xx_poke(chip, (VARIDECIMATE_SCB_ADDR + 0xE) << 2, 0x80008000); */
-
-	/*
-	 * Initialize cs46xx SPDIF controller
-	 */
-
-	/* time countdown enable */
-	cs46xx_poke_via_dsp (chip,SP_ASER_COUNTDOWN, 0x80000000);
-
-	/* SPDIF input MASTER ENABLE */
-	cs46xx_poke_via_dsp (chip,SP_SPDIN_CONTROL, 0x800003ff);
-#else
+#ifndef CONFIG_SND_CS46XX_NEW_DSP
 	/* set the attenuation to 0dB */ 
 	snd_cs46xx_poke(chip, BA1_PVOL, 0x80008000);
 	snd_cs46xx_poke(chip, BA1_CVOL, 0x80008000);
@@ -3312,7 +3401,8 @@
 
 	logic_type = snd_cs46xx_codec_read(chip, AC97_GPIO_POLARITY,
 					   CS46XX_SECONDARY_CODEC_INDEX);
-	logic_type &=0x27F;
+	logic_type &=0x27F; 
+
 	snd_cs46xx_codec_write (chip, AC97_GPIO_POLARITY, logic_type,
 				CS46XX_SECONDARY_CODEC_INDEX);
 
@@ -3592,55 +3682,62 @@
 		.id = 0x3357,
 		.name = "Voyetra",
 		.amp = amp_voyetra,
-		.mixer_init = voyetra_mixer_init
+		.mixer_init = voyetra_mixer_init,
 	},
 	{
 		.vendor = 0x1071,
 		.id = 0x6003,
 		.name = "Mitac MI6020/21",
-		.amp = amp_voyetra
+		.amp = amp_voyetra,
 	},
 	{
 		.vendor = 0x14AF,
 		.id = 0x0050,
 		.name = "Hercules Game Theatre XP",
 		.amp = amp_hercules,
-		.mixer_init = hercules_mixer_init
+		.mixer_init = hercules_mixer_init,
 	},
 	{
 		.vendor = 0x1681,
 		.id = 0x0050,
 		.name = "Hercules Game Theatre XP",
 		.amp = amp_hercules,
-		.mixer_init = hercules_mixer_init
+		.mixer_init = hercules_mixer_init,
 	},
 	{
 		.vendor = 0x1681,
 		.id = 0x0051,
 		.name = "Hercules Game Theatre XP",
 		.amp = amp_hercules,
-		.mixer_init = hercules_mixer_init
+		.mixer_init = hercules_mixer_init,
+
 	},
 	{
 		.vendor = 0x1681,
 		.id = 0x0052,
 		.name = "Hercules Game Theatre XP",
 		.amp = amp_hercules,
-		.mixer_init = hercules_mixer_init
+		.mixer_init = hercules_mixer_init,
 	},
 	{
 		.vendor = 0x1681,
 		.id = 0x0053,
 		.name = "Hercules Game Theatre XP",
 		.amp = amp_hercules,
-		.mixer_init = hercules_mixer_init
+		.mixer_init = hercules_mixer_init,
 	},
 	{
 		.vendor = 0x1681,
 		.id = 0x0054,
 		.name = "Hercules Game Theatre XP",
 		.amp = amp_hercules,
-		.mixer_init = hercules_mixer_init
+		.mixer_init = hercules_mixer_init,
+	},
+	/* Teratec */
+	{
+		.vendor = 0x153b,
+		.id = 0x1136,
+		.name = "Terratec SiXPack 5.1",
 	},
 	/* Not sure if the 570 needs the clkrun hack */
 	{
@@ -3648,19 +3745,19 @@
 		.id = 0x0132,
 		.name = "Thinkpad 570",
 		.init = clkrun_init,
-		.active = clkrun_hack
+		.active = clkrun_hack,
 	},
 	{
 		.vendor = PCI_VENDOR_ID_IBM,
 		.id = 0x0153,
 		.name = "Thinkpad 600X/A20/T20",
 		.init = clkrun_init,
-		.active = clkrun_hack
+		.active = clkrun_hack,
 	},
 	{
 		.vendor = PCI_VENDOR_ID_IBM,
 		.id = 0x1010,
-		.name = "Thinkpad 600E (unsupported)"
+		.name = "Thinkpad 600E (unsupported)",
 	},
 	{} /* terminator */
 };
@@ -3823,10 +3920,12 @@
 
 	for (cp = &cards[0]; cp->name; cp++) {
 		if (cp->vendor == ss_vendor && cp->id == ss_card) {
-			snd_printd ("hack for %s enabled\n", cp->name);
+			snd_printdd ("hack for %s enabled\n", cp->name);
+
 			chip->amplifier_ctrl = cp->amp;
 			chip->active_ctrl = cp->active;
 			chip->mixer_init = cp->mixer_init;
+
 			if (cp->init)
 				cp->init(chip);
 			break;
@@ -3867,6 +3966,7 @@
 			return -ENOMEM;
 		}
 	}
+
 	if (request_irq(pci->irq, snd_cs46xx_interrupt, SA_INTERRUPT|SA_SHIRQ, "CS46XX", (void *) chip)) {
 		snd_printk("unable to grab IRQ %d\n", pci->irq);
 		snd_cs46xx_free(chip);
diff -Nru a/sound/pci/cs46xx/cs46xx_lib.h b/sound/pci/cs46xx/cs46xx_lib.h
--- a/sound/pci/cs46xx/cs46xx_lib.h	Sat Apr 19 19:51:28 2003
+++ b/sound/pci/cs46xx/cs46xx_lib.h	Sat Apr 19 19:51:28 2003
@@ -63,6 +63,8 @@
 extern snd_pcm_ops_t snd_cs46xx_playback_indirect_rear_ops;
 extern snd_pcm_ops_t snd_cs46xx_playback_iec958_ops;
 extern snd_pcm_ops_t snd_cs46xx_playback_indirect_iec958_ops;
+extern snd_pcm_ops_t snd_cs46xx_playback_clfe_ops;
+extern snd_pcm_ops_t snd_cs46xx_playback_indirect_clfe_ops;
 
 
 /*
diff -Nru a/sound/pci/cs46xx/dsp_spos.c b/sound/pci/cs46xx/dsp_spos.c
--- a/sound/pci/cs46xx/dsp_spos.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/cs46xx/dsp_spos.c	Sat Apr 19 19:51:50 2003
@@ -291,11 +291,14 @@
 
 	if (ins->code.data)
 		kfree(ins->code.data);
+
 	if (ins->symbol_table.symbols)
 		vfree(ins->symbol_table.symbols);
+
 	if (ins->modules)
 		kfree(ins->modules);
-	kfree(ins);  
+	
+	kfree(ins);
 	up(&chip->spos_mutex);
 }
 
@@ -630,7 +633,7 @@
 
 	snd_iprintf(buffer,"\nSRC_TASK_SCB1:\n");
 	col = 0;
-	for (i = 0x2580 ; i < 0x2580 + 0x40 ; i += sizeof(u32),col ++) {
+	for (i = 0x2480 ; i < 0x2480 + 0x40 ; i += sizeof(u32),col ++) {
 		if (col == 4) {
 			snd_iprintf(buffer,"\n");
 			col = 0;
@@ -1030,7 +1033,6 @@
 	return desc;
 }
 
-
 int cs46xx_dsp_scb_and_task_init (cs46xx_t *chip)
 {
 	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
@@ -1049,8 +1051,11 @@
 	dsp_scb_descriptor_t * record_mix_scb;
 	dsp_scb_descriptor_t * write_back_scb;
 	dsp_scb_descriptor_t * vari_decimate_scb;
-	dsp_scb_descriptor_t * sec_codec_out_scb;
+	dsp_scb_descriptor_t * rear_codec_out_scb;
+	dsp_scb_descriptor_t * clfe_codec_out_scb;
 	dsp_scb_descriptor_t * magic_snoop_scb;
+	
+	int fifo_addr,fifo_span,valid_slots;
 
 	spos_control_block_t sposcb = {
 		/* 0 */ HFG_TREE_SCB,HFG_STACK,
@@ -1335,28 +1340,78 @@
 
 	if (!record_mix_scb) goto _fail_end;
 
-	/* create secondary CODEC output */
-	sec_codec_out_scb = cs46xx_dsp_create_codec_out_scb(chip,"CodecOutSCB_II",0x0010,0x0040,
-							    REAR_MIXER_SCB_ADDR,
-							    SEC_CODECOUT_SCB_ADDR,codec_in_scb,
-							    SCB_ON_PARENT_NEXT_SCB);
-	if (!sec_codec_out_scb) goto _fail_end;
+	valid_slots = snd_cs46xx_peekBA0(chip, BA0_ACOSV);
+
+	snd_assert (chip->nr_ac97_codecs == 1 || chip->nr_ac97_codecs == 2);
 
+	if (chip->nr_ac97_codecs == 1) {
+		/* output on slot 5 and 11 
+		   on primary CODEC */
+		fifo_addr = 0x20;
+		fifo_span = 0x60;
 
+		/* enable slot 5 and 11 */
+		valid_slots |= ACOSV_SLV5 | ACOSV_SLV11;
+	} else {
+		/* output on slot 7 and 8 
+		   on secondary CODEC */
+		fifo_addr = 0x40;
+		fifo_span = 0x10;
+
+		/* enable slot 7 and 8 */
+		valid_slots |= ACOSV_SLV7 | ACOSV_SLV8;
+	}
+	/* create CODEC tasklet for rear speakers output*/
+	rear_codec_out_scb = cs46xx_dsp_create_codec_out_scb(chip,"CodecOutSCB_Rear",fifo_span,fifo_addr,
+							     REAR_MIXER_SCB_ADDR,
+							     REAR_CODECOUT_SCB_ADDR,codec_in_scb,
+							     SCB_ON_PARENT_NEXT_SCB);
+	if (!rear_codec_out_scb) goto _fail_end;
+	
+	
 	/* create the rear PCM channel  mixer SCB */
 	rear_mix_scb = cs46xx_dsp_create_mix_only_scb(chip,"RearMixerSCB",
 						      MIX_SAMPLE_BUF3,
 						      REAR_MIXER_SCB_ADDR,
-						      sec_codec_out_scb,
+						      rear_codec_out_scb,
 						      SCB_ON_PARENT_SUBLIST_SCB);
 	ins->rear_mix_scb = rear_mix_scb;
 	if (!rear_mix_scb) goto _fail_end;
+	
+	if (chip->nr_ac97_codecs == 2) {
+		/* create CODEC tasklet for rear Center/LFE output 
+		   slot 6 and 9 on seconadry CODEC */
+		clfe_codec_out_scb = cs46xx_dsp_create_codec_out_scb(chip,"CodecOutSCB_CLFE",0x0030,0x0030,
+								     CLFE_MIXER_SCB_ADDR,
+								     CLFE_CODEC_SCB_ADDR,
+								     rear_codec_out_scb,
+								     SCB_ON_PARENT_NEXT_SCB);
+		if (!clfe_codec_out_scb) goto _fail_end;
+		
+		
+		/* create the rear PCM channel  mixer SCB */
+		ins->center_lfe_mix_scb = cs46xx_dsp_create_mix_only_scb(chip,"CLFEMixerSCB",
+									 MIX_SAMPLE_BUF4,
+									 CLFE_MIXER_SCB_ADDR,
+									 clfe_codec_out_scb,
+									 SCB_ON_PARENT_SUBLIST_SCB);
+		if (!ins->center_lfe_mix_scb) goto _fail_end;
+
+		/* enable slot 6 and 9 */
+		valid_slots |= ACOSV_SLV6 | ACOSV_SLV9;
+	} else {
+		clfe_codec_out_scb = rear_codec_out_scb;
+		ins->center_lfe_mix_scb = rear_mix_scb;
+	}
+
+	/* enable slots depending on CODEC configuration */
+	snd_cs46xx_pokeBA0(chip, BA0_ACOSV, valid_slots);
 
 	/* the magic snooper */
 	magic_snoop_scb = cs46xx_dsp_create_magic_snoop_scb (chip,"MagicSnoopSCB_I",OUTPUTSNOOP_SCB_ADDR,
 							     OUTPUT_SNOOP_BUFFER,
 							     codec_out_scb,
-							     sec_codec_out_scb,
+							     clfe_codec_out_scb,
 							     SCB_ON_PARENT_NEXT_SCB);
 
     
@@ -1375,10 +1430,9 @@
 						      SRC_OUTPUT_BUF1,
 						      SRC_DELAY_BUF1,SRCTASK_SCB_ADDR,
 						      master_mix_scb,
-						      SCB_ON_PARENT_SUBLIST_SCB,0);
+						      SCB_ON_PARENT_SUBLIST_SCB,1);
 
 	if (!src_task_scb) goto _fail_end;
-
 	cs46xx_src_unlink(chip,src_task_scb);
 
 	/* NOTE: when we now how to detect the SPDIF input
@@ -1453,12 +1507,12 @@
 			/* 0 */ DSP_SPOS_UULO,DSP_SPOS_UUHI,
 			/* 1 */ 0,
 			/* 2 */ 0,
-			/* 3 */ 1,4000,         
-			/* 4 */ DSP_SPOS_UUUU, 
-			/* 5 */ DSP_SPOS_UULO,DSP_SPOS_UUHI,
-			/* 6 */ DSP_SPOS_UUUU, 
-			/* 7 */ DSP_SPOS_UU,DSP_SPOS_DC, 
-			/* 8 */ DSP_SPOS_UUUU,			
+			/* 3 */ 1,4000,        /* SPDIFICountLimit SPDIFICount */ 
+			/* 4 */ DSP_SPOS_UUUU, /* SPDIFIStatusData */
+			/* 5 */ 0,DSP_SPOS_UUHI, /* StatusData, Free4 */
+			/* 6 */ DSP_SPOS_UUUU,  /* Free3 */
+			/* 7 */ DSP_SPOS_UU,DSP_SPOS_DC,  /* Free2 BitCount*/
+			/* 8 */ DSP_SPOS_UUUU,	/* TempStatus */
 			/* 9 */ SPDIFO_SCB_INST, NULL_SCB_ADDR,
 			/* A */ spdifi_task->address,
 			SPDIFI_SCB_INST + SPDIFIFIFOPointer,
@@ -1470,7 +1524,7 @@
 			/* C */ (SPDIFI_IP_OUTPUT_BUFFER1 << 0x10) | 0xFFFC,
 			/* D */ 0x8048,0,
 			/* E */ 0x01f0,0x0001,
-			/* F */ DSP_SPOS_UUUU
+			/* F */ DSP_SPOS_UUUU /* SPDIN_STATUS monitor */
 		};
 
 		/* 0xBA0 */
@@ -1579,6 +1633,9 @@
 	/*cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, ins->spdif_csuv_default);*/
 	cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV, 0x0);
 
+	/* clear fifo pointer */
+	cs46xx_poke_via_dsp (chip,SP_SPDIN_FIFOPTR, 0x0);
+
 	/* monitor state */
 	ins->spdif_status_out &= ~DSP_SPDIF_STATUS_HW_ENABLED;
 }
@@ -1618,6 +1675,20 @@
 	snd_assert (ins->spdif_in_src != NULL,return -EINVAL);
 
 	down(&chip->spos_mutex);
+
+	if ( ! (ins->spdif_status_out & DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED) ) {
+		/* time countdown enable */
+		cs46xx_poke_via_dsp (chip,SP_ASER_COUNTDOWN, 0x80000005);
+		/* NOTE: 80000005 value is just magic. With all values
+		   that I've tested this one seem to give the best result.
+		   Got no explication why. (Benny) */
+
+		/* SPDIF input MASTER ENABLE */
+		cs46xx_poke_via_dsp (chip,SP_SPDIN_CONTROL, 0x800003ff);
+
+		ins->spdif_status_out |= DSP_SPDIF_STATUS_INPUT_CTRL_ENABLED;
+	}
+
 	/* create and start the asynchronous receiver SCB */
 	ins->asynch_rx_scb = cs46xx_dsp_create_asynch_fg_rx_scb(chip,"AsynchFGRxSCB",
 								ASYNCRX_SCB_ADDR,
@@ -1629,11 +1700,11 @@
 	spin_lock_irq(&chip->reg_lock);
 
 	/* reset SPDIF input sample buffer pointer */
-	snd_cs46xx_poke (chip, (SPDIFI_SCB_INST + 0x0c) << 2,
-			 (SPDIFI_IP_OUTPUT_BUFFER1 << 0x10) | 0xFFFC);
+	/*snd_cs46xx_poke (chip, (SPDIFI_SCB_INST + 0x0c) << 2,
+	  (SPDIFI_IP_OUTPUT_BUFFER1 << 0x10) | 0xFFFC);*/
 
 	/* reset FIFO ptr */
-	cs46xx_poke_via_dsp (chip,SP_SPDIN_FIFOPTR, 0x0);
+	/*cs46xx_poke_via_dsp (chip,SP_SPDIN_FIFOPTR, 0x0);*/
 	cs46xx_src_link(chip,ins->spdif_in_src);
 
 	/* unmute SRC volume */
@@ -1657,9 +1728,10 @@
 	dsp_spos_instance_t * ins = chip->dsp_spos_instance;
 
 	snd_assert (ins->asynch_rx_scb != NULL, return -EINVAL);
-	snd_assert (ins->spdif_in_src != NULL,return -EINVAL);
+	snd_assert (ins->spdif_in_src != NULL,return -EINVAL);	
 
 	down(&chip->spos_mutex);
+
 	/* Remove the asynchronous receiver SCB */
 	cs46xx_dsp_remove_scb (chip,ins->asynch_rx_scb);
 	ins->asynch_rx_scb = NULL;
@@ -1727,10 +1799,10 @@
 
 	snd_assert (ins->adc_input != NULL,return -EINVAL);
 
-    down(&chip->spos_mutex);
+	down(&chip->spos_mutex);
 	cs46xx_dsp_remove_scb (chip,ins->adc_input);
 	ins->adc_input = NULL;
-    up(&chip->spos_mutex);
+	up(&chip->spos_mutex);
 
 	return 0;
 }
diff -Nru a/sound/pci/cs46xx/dsp_spos.h b/sound/pci/cs46xx/dsp_spos.h
--- a/sound/pci/cs46xx/dsp_spos.h	Sat Apr 19 19:51:27 2003
+++ b/sound/pci/cs46xx/dsp_spos.h	Sat Apr 19 19:51:27 2003
@@ -73,9 +73,9 @@
 #define SPDIFI_IP_OUTPUT_BUFFER1 0x0E00
 #define SPDIFO_IP_OUTPUT_BUFFER1 0x1000
 #define MIX_SAMPLE_BUF1          0x1400
-#define MIX_SAMPLE_BUF2          0x2D00
-#define MIX_SAMPLE_BUF3          0x2E00
-#define MIX_SAMPLE_BUF4          0x2F00
+#define MIX_SAMPLE_BUF2          0x2E80
+#define MIX_SAMPLE_BUF3          0x2F00
+#define MIX_SAMPLE_BUF4          0x2F80
 #define MIX_SAMPLE_BUF5          0x3000
 
 /* Task stack address */
@@ -103,12 +103,13 @@
 #define OUTPUTSNOOP_SCB_ADDR     0x110
 #define PCMSERIALINII_SCB_ADDR   0x120
 #define SPIOWRITE_SCB_ADDR       0x130
-#define SEC_CODECOUT_SCB_ADDR    0x140
+#define REAR_CODECOUT_SCB_ADDR   0x140
 #define OUTPUTSNOOPII_SCB_ADDR   0x150
 #define PCMSERIALIN_PCM_SCB_ADDR 0x160
 #define RECORD_MIXER_SCB_ADDR    0x170
 #define REAR_MIXER_SCB_ADDR      0x180
-#define SPDIF_MIXER_SCB_ADDR     0x190
+#define CLFE_MIXER_SCB_ADDR      0x190
+#define CLFE_CODEC_SCB_ADDR      0x1A0
 
 /* hyperforground SCB's*/
 #define HFG_TREE_SCB             0xBA0
diff -Nru a/sound/pci/cs46xx/dsp_spos_scb_lib.c b/sound/pci/cs46xx/dsp_spos_scb_lib.c
--- a/sound/pci/cs46xx/dsp_spos_scb_lib.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/cs46xx/dsp_spos_scb_lib.c	Sat Apr 19 19:51:50 2003
@@ -681,6 +681,54 @@
 	return scb;
 }
 
+dsp_scb_descriptor_t * 
+cs46xx_dsp_create_filter_scb(cs46xx_t * chip,char * scb_name,
+			     u16 buffer_addr,u32 dest,
+			     dsp_scb_descriptor_t * parent_scb,
+			     int scb_child_type) {
+	dsp_scb_descriptor_t * scb;
+	
+	filter_scb_t filter_scb = {
+		.a0_right            = 0x41a9,
+		.a0_left             = 0x41a9,
+		.a1_right            = 0xb8e4,
+		.a1_left             = 0xb8e4,
+		.a2_right            = 0x3e55,
+		.a2_left             = 0x3e55,
+		
+		.filter_unused3      = 0x0000,
+		.filter_unused2      = 0x0000,
+
+		.output_buf_ptr      = buffer_addr,
+		.init                = 0x000,
+
+		.prev_sample_output1 = 0x00000000,
+		.prev_sample_output2 = 0x00000000,
+
+		.prev_sample_input1  = 0x00000000,
+		.prev_sample_input2  = 0x00000000,
+
+		.next_scb_ptr        = 0x0000,
+		.sub_list_ptr        = 0x0000,
+
+		.entry_point         = 0x0000,
+		.spb_ptr             = 0x0000,
+
+		.b0_right            = 0x0e38,
+		.b0_left             = 0x0e38,
+		.b1_right            = 0x1c71,
+		.b1_left             = 0x1c71,
+		.b2_right            = 0x0e38,
+		.b2_left             = 0x0e38,
+	};
+
+
+	scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&filter_scb,
+					    dest,"FILTERTASK",parent_scb,
+					    scb_child_type);
+
+ 	return scb;
+}
 
 dsp_scb_descriptor_t * 
 cs46xx_dsp_create_mix_only_scb(cs46xx_t * chip,char * scb_name,
@@ -705,8 +753,8 @@
 		},
 		/* 9 */ 0,0,
 		/* A */ 0,0,
-		/* B */ RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_64,
-		/* C */ (mix_buffer_addr  + (32 * 4)) << 0x10, 
+		/* B */ RSCONFIG_SAMPLE_16STEREO + RSCONFIG_MODULO_32,
+		/* C */ (mix_buffer_addr  + (16 * 4)) << 0x10, 
 		/* D */ 0,
 		{
 			/* E */ 0x8000,0x8000,
@@ -768,7 +816,8 @@
 
 
 	scb = cs46xx_dsp_create_generic_scb(chip,scb_name,(u32 *)&mix2_ostream_scb,
-					    dest,"S16_MIX_TO_OSTREAM",parent_scb,
+				
+	    dest,"S16_MIX_TO_OSTREAM",parent_scb,
 					    scb_child_type);
   
 	return scb;
@@ -1120,24 +1169,39 @@
 };
 
 static u32 src_output_buffer_addr[DSP_MAX_SRC_NR] = {
-	0x2580,
-	0x2680,
-	0x2780,
-	0x2980,  
-	0x2A80,  
-	0x2B80,  
+	0x2B80,
+	0x2BA0,
+	0x2BC0,
+	0x2BE0,
+	0x2D00,  
+	0x2D20,  
+	0x2D40,  
+	0x2D60,
+	0x2D80,
+	0x2DA0,
+	0x2DC0,
+	0x2DE0,
+	0x2E00,
+	0x2E20
 };
 
 static u32 src_delay_buffer_addr[DSP_MAX_SRC_NR] = {
+	0x2480,
+	0x2500,
+	0x2580,
 	0x2600,
+	0x2680,
 	0x2700,
+	0x2780,
 	0x2800,
+	0x2880,
 	0x2900,
+	0x2980,
 	0x2A00,
-	0x2B00,
+	0x2A80,
+	0x2B00
 };
 
-
 pcm_channel_descriptor_t * cs46xx_dsp_create_pcm_channel (cs46xx_t * chip,
                                                           u32 sample_rate, void * private_data, 
                                                           u32 hw_dma_addr,
@@ -1159,11 +1223,10 @@
 	case DSP_PCM_REAR_CHANNEL:
 		mixer_scb = ins->rear_mix_scb;
 		break;
-	case DSP_PCM_CENTER_CHANNEL:
-		/* TODO */
-		snd_assert(0);
+	case DSP_PCM_CENTER_LFE_CHANNEL:
+		mixer_scb = ins->center_lfe_mix_scb;
 		break;
-	case DSP_PCM_LFE_CHANNEL:
+	case DSP_PCM_S71_CHANNEL:
 		/* TODO */
 		snd_assert(0);
 		break;
diff -Nru a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
--- a/sound/pci/emu10k1/emu10k1_main.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/emu10k1/emu10k1_main.c	Sat Apr 19 19:51:50 2003
@@ -240,8 +240,13 @@
 	}
 	
 	if (!emu->APS) {	/* enable analog output */
-		unsigned int reg = inl(emu->port + HCFG);
-		outl(reg | HCFG_GPOUT0, emu->port + HCFG);
+		if (!emu->audigy) {
+			unsigned int reg = inl(emu->port + HCFG);
+			outl(reg | HCFG_GPOUT0, emu->port + HCFG);
+		} else {
+			unsigned int reg = inl(emu->port + A_IOCFG);
+			outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
+		}
 	}
 
 	/*
diff -Nru a/sound/pci/emu10k1/emufx.c b/sound/pci/emu10k1/emufx.c
--- a/sound/pci/emu10k1/emufx.c	Sat Apr 19 19:51:48 2003
+++ b/sound/pci/emu10k1/emufx.c	Sat Apr 19 19:51:48 2003
@@ -1271,7 +1271,8 @@
 	/* Wave Playback */
 	A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
 	A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
-	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, 100);
+	snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr,
+					emu->revision == 4 ? 50 : 100);
 	gpr += 2;
 
 	/* Wave Surround Playback */
@@ -1502,8 +1503,11 @@
 	A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
 
 	/* analog speakers */
-	//A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
-	A_PUT_STEREO_OUTPUT(A_EXTOUT_AC97_L, A_EXTOUT_AC97_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
+	if (emu->audigy && emu->revision == 4) { /* audigy2 */
+		A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
+	} else {
+		A_PUT_STEREO_OUTPUT(A_EXTOUT_AC97_L, A_EXTOUT_AC97_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
+	}
 	A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
 	A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
 	A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
diff -Nru a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
--- a/sound/pci/emu10k1/emumixer.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/emu10k1/emumixer.c	Sat Apr 19 19:51:50 2003
@@ -45,7 +45,7 @@
                                  snd_ctl_elem_value_t * ucontrol)
 {
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
-	int idx = kcontrol->private_value;
+	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 	unsigned long flags;
 
 	spin_lock_irqsave(&emu->reg_lock, flags);
@@ -71,7 +71,8 @@
                                  snd_ctl_elem_value_t * ucontrol)
 {
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
-	int idx = kcontrol->private_value, change;
+	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
+	int change;
 	unsigned int val;
 	unsigned long flags;
 
@@ -94,6 +95,7 @@
 	.access =	SNDRV_CTL_ELEM_ACCESS_READ,
         .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
         .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK),
+	.count =	4,
         .info =         snd_emu10k1_spdif_info,
         .get =          snd_emu10k1_spdif_get_mask
 };
@@ -102,6 +104,7 @@
 {
         .iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
         .name =         SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
+	.count =	4,
         .info =         snd_emu10k1_spdif_info,
         .get =          snd_emu10k1_spdif_get,
         .put =          snd_emu10k1_spdif_put
@@ -150,8 +153,8 @@
                                         snd_ctl_elem_value_t * ucontrol)
 {
 	unsigned long flags;
-	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
 	int voice, idx;
 	int num_efx = emu->audigy ? 8 : 4;
 	int mask = emu->audigy ? 0x3f : 0x0f;
@@ -169,8 +172,8 @@
                                         snd_ctl_elem_value_t * ucontrol)
 {
 	unsigned long flags;
-	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
 	int change = 0, voice, idx, val;
 	int num_efx = emu->audigy ? 8 : 4;
 	int mask = emu->audigy ? 0x3f : 0x0f;
@@ -204,6 +207,7 @@
 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
         .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
         .name =         "EMU10K1 PCM Send Routing",
+	.count =	32,
         .info =         snd_emu10k1_send_routing_info,
         .get =          snd_emu10k1_send_routing_get,
         .put =          snd_emu10k1_send_routing_put
@@ -223,8 +227,8 @@
                                        snd_ctl_elem_value_t * ucontrol)
 {
 	unsigned long flags;
-	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
 	int idx;
 	int num_efx = emu->audigy ? 8 : 4;
 
@@ -239,8 +243,8 @@
                                        snd_ctl_elem_value_t * ucontrol)
 {
 	unsigned long flags;
-	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
 	int change = 0, idx, val;
 	int num_efx = emu->audigy ? 8 : 4;
 
@@ -272,6 +276,7 @@
 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
         .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
         .name =         "EMU10K1 PCM Send Volume",
+	.count =	32,
         .info =         snd_emu10k1_send_volume_info,
         .get =          snd_emu10k1_send_volume_get,
         .put =          snd_emu10k1_send_volume_put
@@ -289,8 +294,8 @@
 static int snd_emu10k1_attn_get(snd_kcontrol_t * kcontrol,
                                 snd_ctl_elem_value_t * ucontrol)
 {
-	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
 	unsigned long flags;
 	int idx;
 
@@ -305,8 +310,8 @@
 				snd_ctl_elem_value_t * ucontrol)
 {
 	unsigned long flags;
-	emu10k1_pcm_mixer_t *mix = (emu10k1_pcm_mixer_t *)kcontrol->private_value;
 	emu10k1_t *emu = snd_kcontrol_chip(kcontrol);
+	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[snd_ctl_get_ioffidx(kcontrol, &ucontrol->id)];
 	int change = 0, idx, val;
 
 	spin_lock_irqsave(&emu->reg_lock, flags);
@@ -334,6 +339,7 @@
 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
         .iface =        SNDRV_CTL_ELEM_IFACE_MIXER,
         .name =         "EMU10K1 PCM Volume",
+	.count =	32,
         .info =         snd_emu10k1_attn_info,
         .get =          snd_emu10k1_attn_get,
         .put =          snd_emu10k1_attn_put
@@ -420,7 +426,7 @@
 int __devinit snd_emu10k1_mixer(emu10k1_t *emu)
 {
 	ac97_t ac97;
-	int err, pcm, idx;
+	int err, pcm;
 	snd_kcontrol_t *kctl;
 	snd_card_t *card = emu->card;
 
@@ -436,6 +442,19 @@
 		strcpy(emu->card->mixername, "EMU APS");
 	}
 
+	if ((kctl = emu->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, kctl)))
+		return err;
+	if ((kctl = emu->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, kctl)))
+		return err;
+	if ((kctl = emu->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, kctl)))
+		return err;
+
 	for (pcm = 0; pcm < 32; pcm++) {
 		emu10k1_pcm_mixer_t *mix;
 		int v;
@@ -443,50 +462,26 @@
 		mix = &emu->pcm_mixer[pcm];
 		mix->epcm = NULL;
 
-		if ((kctl = mix->ctl_send_routing = snd_ctl_new1(&snd_emu10k1_send_routing_control, emu)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = (long)mix;
-		kctl->id.index = pcm;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
 		for (v = 0; v < 4; v++)
 			mix->send_routing[0][v] = 
 				mix->send_routing[1][v] = 
 				mix->send_routing[2][v] = v;
 		
-		if ((kctl = mix->ctl_send_volume = snd_ctl_new1(&snd_emu10k1_send_volume_control, emu)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = (long)mix;
-		kctl->id.index = pcm;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
 		memset(&mix->send_volume, 0, sizeof(mix->send_volume));
 		mix->send_volume[0][0] = mix->send_volume[0][1] =
 		mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
 		
-		if ((kctl = mix->ctl_attn = snd_ctl_new1(&snd_emu10k1_attn_control, emu)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = (long)mix;
-		kctl->id.index = pcm;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
 		mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
 	}
 	
-	for (idx = 0; idx < 3; idx++) {
-		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = idx;
-		kctl->id.index = idx;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
-		if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = idx;
-		kctl->id.index = idx;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
-	}
+	if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_mask_control, emu)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, kctl)))
+		return err;
+	if ((kctl = snd_ctl_new1(&snd_emu10k1_spdif_control, emu)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, kctl)))
+		return err;
 
 	if (emu->audigy) {
 		if ((kctl = snd_ctl_new1(&snd_audigy_shared_spdif, emu)) == NULL)
diff -Nru a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
--- a/sound/pci/emu10k1/emupcm.c	Sat Apr 19 19:51:27 2003
+++ b/sound/pci/emu10k1/emupcm.c	Sat Apr 19 19:51:27 2003
@@ -740,22 +740,25 @@
  *
  */
 
-static void snd_emu10k1_pcm_mixer_notify1(snd_card_t *card, snd_kcontrol_t *kctl, int activate)
+static void snd_emu10k1_pcm_mixer_notify1(emu10k1_t *emu, snd_kcontrol_t *kctl, int idx, int activate)
 {
+	snd_ctl_elem_id_t id;
+
 	snd_runtime_check(kctl != NULL, return);
 	if (activate)
-		kctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+		kctl->vd[idx].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	else
-		kctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
-	snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE |
-		       SNDRV_CTL_EVENT_MASK_INFO, &kctl->id);
+		kctl->vd[idx].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE |
+		       SNDRV_CTL_EVENT_MASK_INFO,
+		       snd_ctl_build_ioff(&id, kctl, idx));
 }
 
-static void snd_emu10k1_pcm_mixer_notify(snd_card_t *card, emu10k1_pcm_mixer_t *mix, int activate)
+static void snd_emu10k1_pcm_mixer_notify(emu10k1_t *emu, int idx, int activate)
 {
-	snd_emu10k1_pcm_mixer_notify1(card, mix->ctl_send_routing, activate);
-	snd_emu10k1_pcm_mixer_notify1(card, mix->ctl_send_volume, activate);
-	snd_emu10k1_pcm_mixer_notify1(card, mix->ctl_attn, activate);
+	snd_emu10k1_pcm_mixer_notify1(emu, emu->ctl_send_routing, idx, activate);
+	snd_emu10k1_pcm_mixer_notify1(emu, emu->ctl_send_volume, idx, activate);
+	snd_emu10k1_pcm_mixer_notify1(emu, emu->ctl_attn, idx, activate);
 }
 
 static void snd_emu10k1_pcm_free_substream(snd_pcm_runtime_t *runtime)
@@ -799,7 +802,7 @@
 	mix->send_volume[1][0] = mix->send_volume[2][1] = 255;
 	mix->attn[0] = mix->attn[1] = mix->attn[2] = 0xffff;
 	mix->epcm = epcm;
-	snd_emu10k1_pcm_mixer_notify(emu->card, mix, 1);
+	snd_emu10k1_pcm_mixer_notify(emu, substream->number, 1);
 	return 0;
 }
 
@@ -809,7 +812,7 @@
 	emu10k1_pcm_mixer_t *mix = &emu->pcm_mixer[substream->number];
 
 	mix->epcm = NULL;
-	snd_emu10k1_pcm_mixer_notify(emu->card, mix, 0);
+	snd_emu10k1_pcm_mixer_notify(emu, substream->number, 0);
 	return 0;
 }
 
diff -Nru a/sound/pci/ens1370.c b/sound/pci/ens1370.c
--- a/sound/pci/ens1370.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/ens1370.c	Sat Apr 19 19:51:50 2003
@@ -551,7 +551,7 @@
 {
 	ensoniq_t *ensoniq = snd_magic_cast(ensoniq_t, ak4531->private_data, return);
 	unsigned long flags;
-	signed long end_time = jiffies + HZ / 10;
+	unsigned long end_time = jiffies + HZ / 10;
 
 #if 0
 	printk("CODEC WRITE: reg = 0x%x, val = 0x%x (0x%x), creg = 0x%x\n", reg, val, ES_1370_CODEC_WRITE(reg, val), ES_REG(ensoniq, 1370_CODEC));
@@ -568,7 +568,7 @@
 		set_current_state(TASK_UNINTERRUPTIBLE);
 		schedule_timeout(1);
 #endif
-	} while ((signed long)(end_time - jiffies) > 0);
+	} while (time_after(end_time, jiffies));
 	snd_printk("codec write timeout, status = 0x%x\n", inl(ES_REG(ensoniq, STATUS)));
 }
 
diff -Nru a/sound/pci/es1938.c b/sound/pci/es1938.c
--- a/sound/pci/es1938.c	Sat Apr 19 19:51:49 2003
+++ b/sound/pci/es1938.c	Sat Apr 19 19:51:49 2003
@@ -829,11 +829,14 @@
 	pos <<= chip->dma1_shift;
 	count <<= chip->dma1_shift;
 	snd_assert(pos + count <= chip->dma1_size, return -EINVAL);
-	if (pos + count < chip->dma1_size)
-		memcpy(dst, runtime->dma_area + pos + 1, count);
-	else {
-		memcpy(dst, runtime->dma_area + pos + 1, count - 1);
-		((unsigned char *)dst)[count - 1] = runtime->dma_area[0];
+	if (pos + count < chip->dma1_size) {
+		if (copy_to_user(dst, runtime->dma_area + pos + 1, count))
+			return -EFAULT;
+	} else {
+		if (copy_to_user(dst, runtime->dma_area + pos + 1, count - 1))
+			return -EFAULT;
+		if (put_user(runtime->dma_area[0], ((unsigned char *)dst) + count - 1))
+			return -EFAULT;
 	}
 	return 0;
 }
diff -Nru a/sound/pci/fm801.c b/sound/pci/fm801.c
--- a/sound/pci/fm801.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/fm801.c	Sat Apr 19 19:51:50 2003
@@ -921,7 +921,7 @@
 	fm801_t *chip;
 	unsigned char rev, id;
 	unsigned short cmdw;
-	signed long timeout;
+	unsigned long timeout;
 	int err;
 	static snd_device_ops_t ops = {
 		.dev_free =	snd_fm801_dev_free,
@@ -969,7 +969,7 @@
 			goto __ac97_secondary;
 		set_current_state(TASK_UNINTERRUPTIBLE);
 		schedule_timeout(1);
-	} while ((timeout - (signed long)jiffies) > 0);
+	} while (time_after(timeout, jiffies));
 	snd_printk("Primary AC'97 codec not found\n");
 	snd_fm801_free(chip);
 	return -EIO;
@@ -980,8 +980,7 @@
 	for (id = 3; id > 0; id--) {	/* my card has the secondary codec */
 					/* at address #3, so the loop is inverted */
 
-		if ((timeout - (signed long)jiffies) < HZ / 20)
-			timeout = jiffies + HZ / 20;
+		timeout = jiffies + HZ / 20;
 
 		outw((1<<7) | (id << FM801_AC97_ADDR_SHIFT) | AC97_VENDOR_ID1, FM801_REG(chip, AC97_CMD));
 		udelay(5);
@@ -996,7 +995,7 @@
 			}
 			set_current_state(TASK_UNINTERRUPTIBLE);
 			schedule_timeout(1);
-		} while ((timeout - (signed long)jiffies) > 0);
+		} while (time_after(timeout, jiffies));
 	}
 
 	/* the recovery phase, it seems that probing for non-existing codec might */
@@ -1010,7 +1009,7 @@
 			goto __ac97_ok;
 		set_current_state(TASK_UNINTERRUPTIBLE);
 		schedule_timeout(1);
-	} while ((timeout - (signed long)jiffies) > 0);
+	} while (time_after(timeout, jiffies));
 	snd_printk("Primary AC'97 codec not responding\n");
 	snd_fm801_free(chip);
 	return -EIO;
diff -Nru a/sound/pci/ice1712/ak4524.c b/sound/pci/ice1712/ak4524.c
--- a/sound/pci/ice1712/ak4524.c	Sat Apr 19 19:51:48 2003
+++ b/sound/pci/ice1712/ak4524.c	Sat Apr 19 19:51:48 2003
@@ -433,8 +433,8 @@
 			strcpy(ctl.id.name, "DAC Volume");
 			ctl.id.index = idx + ak->idx_offset * 2;
 			ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+			ctl.count = 1;
 			ctl.info = snd_ice1712_akm4xxx_volume_info;
-			ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 			ctl.get = snd_ice1712_akm4xxx_volume_get;
 			ctl.put = snd_ice1712_akm4xxx_volume_put;
 			switch (ak->type) {
@@ -459,7 +459,7 @@
 				return -EINVAL;
 			}
 			ctl.private_data = ak;
-			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl))) < 0)
+			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 				return err;
 		}
 		for (idx = 0; idx < ak->num_adcs && ak->type == SND_AK4524; ++idx) {
@@ -468,25 +468,25 @@
 			strcpy(ctl.id.name, "ADC Volume");
 			ctl.id.index = idx;
 			ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+			ctl.count = 1;
 			ctl.info = snd_ice1712_akm4xxx_volume_info;
-			ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 			ctl.get = snd_ice1712_akm4xxx_volume_get;
 			ctl.put = snd_ice1712_akm4xxx_volume_put;
 			ctl.private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127); /* register 4 & 5 */
 			ctl.private_data = ak;
-			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl))) < 0)
+			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 				return err;
 			memset(&ctl, 0, sizeof(ctl));
 			strcpy(ctl.id.name, "IPGA Analog Capture Volume");
 			ctl.id.index = idx;
 			ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+			ctl.count = 1;
 			ctl.info = snd_ice1712_akm4xxx_ipga_gain_info;
-			ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 			ctl.get = snd_ice1712_akm4xxx_ipga_gain_get;
 			ctl.put = snd_ice1712_akm4xxx_ipga_gain_put;
 			ctl.private_value = AK_COMPOSE(idx/2, (idx%2) + 4, 0, 0); /* register 4 & 5 */
 			ctl.private_data = ak;
-			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl))) < 0)
+			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 				return err;
 		}
 		for (idx = 0; idx < ak->num_dacs/2; idx++) {
@@ -495,8 +495,8 @@
 			strcpy(ctl.id.name, "Deemphasis");
 			ctl.id.index = idx + ak->idx_offset;
 			ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+			ctl.count = 1;
 			ctl.info = snd_ice1712_akm4xxx_deemphasis_info;
-			ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 			ctl.get = snd_ice1712_akm4xxx_deemphasis_get;
 			ctl.put = snd_ice1712_akm4xxx_deemphasis_put;
 			switch (ak->type) {
@@ -517,11 +517,9 @@
 				break;
 			}
 			ctl.private_data = ak;
-			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl))) < 0)
+			if ((err = snd_ctl_add(ice->card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 				return err;
 		}
 	}
 	return 0;
 }
-
-
diff -Nru a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
--- a/sound/pci/ice1712/ice1712.c	Sat Apr 19 19:51:46 2003
+++ b/sound/pci/ice1712/ice1712.c	Sat Apr 19 19:51:46 2003
@@ -1373,25 +1373,25 @@
 		strcpy(ctl.id.name, "Multi Playback Switch");
 		ctl.id.index = idx;
 		ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+		ctl.count = 1;
 		ctl.info = snd_ice1712_pro_mixer_switch_info;
-		ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 		ctl.get = snd_ice1712_pro_mixer_switch_get;
 		ctl.put = snd_ice1712_pro_mixer_switch_put;
 		ctl.private_value = idx;
 		ctl.private_data = ice;
-		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl))) < 0)
+		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 			return err;
 		memset(&ctl, 0, sizeof(ctl));
 		strcpy(ctl.id.name, "Multi Playback Volume");
 		ctl.id.index = idx;
 		ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+		ctl.count = 1;
 		ctl.info = snd_ice1712_pro_mixer_volume_info;
-		ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 		ctl.get = snd_ice1712_pro_mixer_volume_get;
 		ctl.put = snd_ice1712_pro_mixer_volume_put;
 		ctl.private_value = idx;
 		ctl.private_data = ice;
-		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl))) < 0)
+		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 			return err;
 	}
 
@@ -1401,25 +1401,25 @@
 		strcpy(ctl.id.name, "Multi Capture Switch");
 		ctl.id.index = idx;
 		ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+		ctl.count = 1;
 		ctl.info = snd_ice1712_pro_mixer_switch_info;
-		ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 		ctl.get = snd_ice1712_pro_mixer_switch_get;
 		ctl.put = snd_ice1712_pro_mixer_switch_put;
 		ctl.private_value = idx + 10;
 		ctl.private_data = ice;
-		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl))) < 0)
+		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 			return err;
 		memset(&ctl, 0, sizeof(ctl));
 		strcpy(ctl.id.name, "Multi Capture Volume");
 		ctl.id.index = idx;
 		ctl.id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
+		ctl.count = 1;
 		ctl.info = snd_ice1712_pro_mixer_volume_info;
-		ctl.access = SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE;
 		ctl.get = snd_ice1712_pro_mixer_volume_get;
 		ctl.put = snd_ice1712_pro_mixer_volume_put;
 		ctl.private_value = idx + 10;
 		ctl.private_data = ice;
-		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl))) < 0)
+		if ((err = snd_ctl_add(card, snd_ctl_new(&ctl, SNDRV_CTL_ELEM_ACCESS_READ|SNDRV_CTL_ELEM_ACCESS_WRITE))) < 0)
 			return err;
 	}
 	
diff -Nru a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
--- a/sound/pci/intel8x0.c	Sat Apr 19 19:51:49 2003
+++ b/sound/pci/intel8x0.c	Sat Apr 19 19:51:49 2003
@@ -199,6 +199,7 @@
 #define   ICH_SIS_PCM_6		0x00000080	/* 6 channels (SIS7012) */
 #define   ICH_SIS_PCM_4		0x00000040	/* 4 channels (SIS7012) */
 #define   ICH_SIS_PCM_2		0x00000000	/* 2 channels (SIS7012) */
+#define   ICH_TRIE		0x00000040	/* tertiary resume interrupt enable */
 #define   ICH_SRIE		0x00000020	/* secondary resume interrupt enable */
 #define   ICH_PRIE		0x00000010	/* primary resume interrupt enable */
 #define   ICH_ACLINK		0x00000008	/* AClink shut off */
@@ -1609,10 +1610,11 @@
 			udelay(1);
 		}
 	}
+	ac97.pci = chip->pci;
 	if ((err = snd_ac97_mixer(chip->card, &ac97, &x97)) < 0)
 		return err;
 	chip->ac97[0] = x97;
-	snd_ac97_tune_hardware(chip->ac97[0], chip->pci, ac97_quirks);
+	snd_ac97_tune_hardware(chip->ac97[0], ac97_quirks);
 	chip->ichd[ICHD_PCMOUT].ac97 = x97;
 	chip->ichd[ICHD_PCMIN].ac97 = x97;
 	if (x97->ext_id & AC97_EI_VRM)
diff -Nru a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c
--- a/sound/pci/korg1212/korg1212.c	Sat Apr 19 19:51:27 2003
+++ b/sound/pci/korg1212/korg1212.c	Sat Apr 19 19:51:27 2003
@@ -149,9 +149,9 @@
 #define MAILBOX1_OFFSET      0x44	// location of mailbox 1 relative to base address
 #define MAILBOX2_OFFSET      0x48	// location of mailbox 2 relative to base address
 #define MAILBOX3_OFFSET      0x4c	// location of mailbox 3 relative to base address
-#define OUT_DOORBELL_OFFSET  0x60	// location of PCI to local doorbell "
-#define IN_DOORBELL_OFFSET   0x64	// location of local to PCI doorbell "
-#define STATUS_REG_OFFSET    0x68	// location of interrupt control/status register "
+#define OUT_DOORBELL_OFFSET  0x60	// location of PCI to local doorbell
+#define IN_DOORBELL_OFFSET   0x64	// location of local to PCI doorbell
+#define STATUS_REG_OFFSET    0x68	// location of interrupt control/status register
 #define PCI_CONTROL_OFFSET   0x6c	// location of the EEPROM, PCI, User I/O, init control
 					//    register
 #define SENS_CONTROL_OFFSET  0x6e	// location of the input sensitivity setting register.
@@ -329,6 +329,10 @@
         int irq;
 
         spinlock_t    lock;
+	struct semaphore open_mutex;
+
+	struct timer_list timer;	/* timer callback for checking ack of stop request */
+	int stop_pending_cnt;		/* counter for stop pending check */
 
         wait_queue_head_t wait;
 
@@ -602,66 +606,79 @@
 	return rc;
 }
 
-static void snd_korg1212_WaitForCardStopAck(korg1212_t *korg1212)
+/* spinlock already held */
+static void snd_korg1212_SendStop(korg1212_t *korg1212)
 {
-        u32 endtime = jiffies + 2 * HZ;
-
-#if K1212_DEBUG_LEVEL > 0
-        K1212_DEBUG_PRINTK("K1212_DEBUG: WaitForCardStopAck.in [%s] %lu %lu\n", stateName[korg1212->cardState], jiffies, korg1212->inIRQ);
-#endif
+	if (! korg1212->stop_pending_cnt) {
+		writel(0xffffffff, &korg1212->sharedBufferPtr->cardCommand);
+		/* program the timer */
+		korg1212->stop_pending_cnt = HZ;
+		korg1212->timer.expires = jiffies + 1;
+		add_timer(&korg1212->timer);
+	}
+}
 
-        if (korg1212->inIRQ)
-                return;
+static void snd_korg1212_SendStopAndWait(korg1212_t *korg1212)
+{
+	unsigned long flags;
+	spin_lock_irqsave(&korg1212->lock, flags);
+	snd_korg1212_SendStop(korg1212);
+	spin_unlock_irqrestore(&korg1212->lock, flags);
+	sleep_on_timeout(&korg1212->wait, (HZ * 3) / 2);
+}
 
-        do {
-                if (readl(&korg1212->sharedBufferPtr->cardCommand) == 0) {
-#if K1212_DEBUG_LEVEL > 0
-        		K1212_DEBUG_PRINTK("K1212_DEBUG: WaitForCardStopAck.out [%s] %lu %lu\n", stateName[korg1212->cardState], jiffies, korg1212->inIRQ);
+/* timer callback for checking the ack of stop request */
+static void snd_korg1212_timer_func(unsigned long data)
+{
+        korg1212_t *korg1212 = snd_magic_cast(korg1212_t, (void*)data, return);
+	
+	spin_lock(&korg1212->lock);
+	if (readl(&korg1212->sharedBufferPtr->cardCommand) == 0) {
+		/* ack'ed */
+		korg1212->stop_pending_cnt = 0;
+		wake_up(&korg1212->wait);
+#if K1212_DEBUG_LEVEL > 1
+		K1212_DEBUG_PRINTK("K1212_DEBUG: Stop ack'ed [%s]\n", stateName[korg1212->cardState]);
 #endif
-                        return;
-		}
-                if (!korg1212->inIRQ)
-                        schedule();
-        } while (time_before(jiffies, endtime));
-
+	} else {
+		if (--korg1212->stop_pending_cnt > 0) {
+			/* reprogram timer */
+			korg1212->timer.expires = jiffies + 1;
+			add_timer(&korg1212->timer);
+		} else {
+			snd_printd("korg1212_timer_func timeout\n");
+			writel(0, &korg1212->sharedBufferPtr->cardCommand);
+			wake_up(&korg1212->wait);
 #if K1212_DEBUG_LEVEL > 0
-        K1212_DEBUG_PRINTK("K1212_DEBUG: WaitForCardStopAck.out TO [%s] %lu %lu\n", stateName[korg1212->cardState], jiffies, korg1212->inIRQ);
+			K1212_DEBUG_PRINTK("K1212_DEBUG: Stop timeout [%s]\n", stateName[korg1212->cardState]);
 #endif
-        writel(0, &korg1212->sharedBufferPtr->cardCommand);
+		}
+	}
+	spin_unlock(&korg1212->lock);
 }
 
 static void snd_korg1212_TurnOnIdleMonitor(korg1212_t *korg1212)
 {
+	unsigned long flags;
+
         udelay(INTERCOMMAND_DELAY);
+	spin_lock_irqsave(&korg1212->lock, flags);
         korg1212->idleMonitorOn = 1;
         rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_SelectPlayMode,
-                        K1212_MODE_MonitorOn, 0, 0, 0);
+					  K1212_MODE_MonitorOn, 0, 0, 0);
+        spin_unlock_irqrestore(&korg1212->lock, flags);
 }
 
 static void snd_korg1212_TurnOffIdleMonitor(korg1212_t *korg1212)
 {
         if (korg1212->idleMonitorOn) {
-                writel(0xffffffff, &korg1212->sharedBufferPtr->cardCommand);
-                snd_korg1212_WaitForCardStopAck(korg1212);
+		snd_korg1212_SendStopAndWait(korg1212);
                 korg1212->idleMonitorOn = 0;
         }
 }
 
-static void snd_korg1212_setCardState(korg1212_t * korg1212, CardState csState)
+static inline void snd_korg1212_setCardState(korg1212_t * korg1212, CardState csState)
 {
-        switch (csState) {
-                case K1212_STATE_READY:
-                        snd_korg1212_TurnOnIdleMonitor(korg1212);
-                        break;
-
-                case K1212_STATE_OPEN:
-                        snd_korg1212_TurnOffIdleMonitor(korg1212);
-                        break;
-
-                default:
-                        break;
-        }
-
         korg1212->cardState = csState;
 }
 
@@ -670,8 +687,13 @@
 #if K1212_DEBUG_LEVEL > 0
 	K1212_DEBUG_PRINTK("K1212_DEBUG: OpenCard [%s] %d\n", stateName[korg1212->cardState], korg1212->opencnt);
 #endif
-        if (korg1212->opencnt++ == 0)
+	down(&korg1212->open_mutex);
+        if (korg1212->opencnt++ == 0) {
+		snd_korg1212_TurnOffIdleMonitor(korg1212);
 		snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN);
+	}
+
+	up(&korg1212->open_mutex);
         return 1;
 }
 
@@ -681,8 +703,11 @@
 	K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard [%s] %d\n", stateName[korg1212->cardState], korg1212->opencnt);
 #endif
 
-	if (--(korg1212->opencnt))
+	down(&korg1212->open_mutex);
+	if (--(korg1212->opencnt)) {
+		up(&korg1212->open_mutex);
 		return 0;
+	}
 
         if (korg1212->cardState == K1212_STATE_SETUP) {
                 rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_SelectPlayMode,
@@ -691,19 +716,24 @@
 	if (rc) K1212_DEBUG_PRINTK("K1212_DEBUG: CloseCard - RC = %d [%s]\n", rc, stateName[korg1212->cardState]);
 #endif
 
-                if (rc != K1212_CMDRET_Success)
+		if (rc != K1212_CMDRET_Success) {
+			up(&korg1212->open_mutex);
                         return 0;
+		}
         } else if (korg1212->cardState > K1212_STATE_SETUP) {
-                writel(0xffffffff, &korg1212->sharedBufferPtr->cardCommand);
-                snd_korg1212_WaitForCardStopAck(korg1212);
+		snd_korg1212_SendStopAndWait(korg1212);
         }
 
-        if (korg1212->cardState > K1212_STATE_READY)
+        if (korg1212->cardState > K1212_STATE_READY) {
+		snd_korg1212_TurnOnIdleMonitor(korg1212);
                 snd_korg1212_setCardState(korg1212, K1212_STATE_READY);
+	}
 
+	up(&korg1212->open_mutex);
         return 0;
 }
 
+/* spinlock already held */
 static int snd_korg1212_SetupForPlay(korg1212_t * korg1212)
 {
 #if K1212_DEBUG_LEVEL > 0
@@ -726,6 +756,7 @@
         return 0;
 }
 
+/* spinlock already held */
 static int snd_korg1212_TriggerPlay(korg1212_t * korg1212)
 {
 #if K1212_DEBUG_LEVEL > 0
@@ -748,6 +779,7 @@
         return 0;
 }
 
+/* spinlock already held */
 static int snd_korg1212_StopPlay(korg1212_t * korg1212)
 {
 #if K1212_DEBUG_LEVEL > 0
@@ -759,11 +791,10 @@
 
 	korg1212->setcnt = 0;
 
-        if (korg1212->cardState != K1212_STATE_ERRORSTOP) {
-                writel(0xffffffff, &korg1212->sharedBufferPtr->cardCommand);
-                snd_korg1212_WaitForCardStopAck(korg1212);
-        }
-        snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN);
+        if (korg1212->cardState != K1212_STATE_ERRORSTOP)
+		snd_korg1212_SendStop(korg1212);
+
+	snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN);
         return 0;
 }
 
@@ -789,8 +820,7 @@
                         if (korg1212->cardState != K1212_STATE_MONITOR) {
                                 return 0;
                         } else {
-                                writel(0xffffffff, &korg1212->sharedBufferPtr->cardCommand);
-                                snd_korg1212_WaitForCardStopAck(korg1212);
+				snd_korg1212_SendStopAndWait(korg1212);
                                 snd_korg1212_setCardState(korg1212, K1212_STATE_OPEN);
                         }
                         break;
@@ -884,6 +914,7 @@
         u16       controlValue;    // this keeps the current value to be written to
                                    //  the card's eeprom control register.
         u16       count;
+	unsigned long flags;
 
 #if K1212_DEBUG_LEVEL > 0
 	K1212_DEBUG_PRINTK("K1212_DEBUG: WriteADCSensivity [%s]\n", stateName[korg1212->cardState]);
@@ -900,12 +931,13 @@
         // make sure the card is not in monitor mode when we do this update.
         // ----------------------------------------------------------------------------
         if (korg1212->cardState == K1212_STATE_MONITOR || korg1212->idleMonitorOn) {
-                writel(0xffffffff, &korg1212->sharedBufferPtr->cardCommand);
                 monModeSet = 1;
-                snd_korg1212_WaitForCardStopAck(korg1212);
+		snd_korg1212_SendStopAndWait(korg1212);
         } else
                 monModeSet = 0;
 
+	spin_lock_irqsave(&korg1212->lock, flags);
+
         // ----------------------------------------------------------------------------
         // we are about to send new values to the card, so clear the new values queued
         // flag.  Also, clear out mailbox 3, so we don't lockup.
@@ -1016,6 +1048,8 @@
 
         }
 
+	spin_unlock_irqrestore(&korg1212->lock, flags);
+
         return 1;
 }
 
@@ -1089,13 +1123,14 @@
 	if (rc) K1212_DEBUG_PRINTK("K1212_DEBUG: Set Clock Source Selector - RC = %d [%s]\n", rc, stateName[korg1212->cardState]);
 #endif
 
+	snd_korg1212_TurnOnIdleMonitor(korg1212);
 	snd_korg1212_setCardState(korg1212, K1212_STATE_READY);
 
 #if K1212_DEBUG_LEVEL > 0
 	if (rc) K1212_DEBUG_PRINTK("K1212_DEBUG: Set Monitor On - RC = %d [%s]\n", rc, stateName[korg1212->cardState]);
 #endif
 
-        wake_up_interruptible(&korg1212->wait);
+	snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_COMPLETE);
 }
 
 static void snd_korg1212_interrupt(int irq, void *dev_id, struct pt_regs *regs)
@@ -1111,6 +1146,8 @@
         if (!doorbellValue)
 		return;
 
+	spin_lock(&korg1212->lock);
+
 	writel(doorbellValue, korg1212->inDoorbellPtr);
 
         korg1212->irqcount++;
@@ -1123,10 +1160,8 @@
 #if K1212_DEBUG_LEVEL > 0
                         K1212_DEBUG_PRINTK("K1212_DEBUG: IRQ DNLD count - %ld, %x, [%s].\n", korg1212->irqcount, doorbellValue, stateName[korg1212->cardState]);
 #endif
-                        if (korg1212->cardState == K1212_STATE_DSP_IN_PROCESS) {
-                                        snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_COMPLETE);
-                                        snd_korg1212_OnDSPDownloadComplete(korg1212);
-                        }
+                        if (korg1212->cardState == K1212_STATE_DSP_IN_PROCESS)
+				wake_up(&korg1212->wait);
                         break;
 
                 // ------------------------------------------------------------------------
@@ -1166,17 +1201,23 @@
                                         break;
 
                                 if (korg1212->capture_substream) {
+					spin_unlock(&korg1212->lock);
                                         snd_pcm_period_elapsed(korg1212->capture_substream);
+					spin_lock(&korg1212->lock);
                                 }
 
                                 if (korg1212->playback_substream) {
+					spin_unlock(&korg1212->lock);
                                         snd_pcm_period_elapsed(korg1212->playback_substream);
+					spin_lock(&korg1212->lock);
                                 }
                         }
                         break;
         }
 
 	korg1212->inIRQ--;
+
+	spin_unlock(&korg1212->lock);
 }
 
 static int snd_korg1212_downloadDSPCode(korg1212_t *korg1212)
@@ -1205,7 +1246,10 @@
 	if (rc) K1212_DEBUG_PRINTK("K1212_DEBUG: Start DSP Download RC = %d [%s]\n", rc, stateName[korg1212->cardState]);
 #endif
 
-        interruptible_sleep_on_timeout(&korg1212->wait, HZ * 4);
+	if (! sleep_on_timeout(&korg1212->wait, HZ * 4))
+		return -EBUSY; /* timeout */
+
+	snd_korg1212_OnDSPDownloadComplete(korg1212);
 
         return 0;
 }
@@ -1363,14 +1407,14 @@
 
         snd_pcm_set_sync(substream);    // ???
 
-        spin_lock_irqsave(&korg1212->lock, flags);
-
 	snd_korg1212_OpenCard(korg1212);
 
         runtime->hw = snd_korg1212_playback_info;
 	runtime->dma_area = (char *) korg1212->playDataBufsPtr;
 	runtime->dma_bytes = K1212_BUF_SIZE;
 
+        spin_lock_irqsave(&korg1212->lock, flags);
+
         korg1212->playback_substream = substream;
         korg1212->periodsize = K1212_PERIODS;
 	korg1212->channels = K1212_CHANNELS;
@@ -1394,14 +1438,14 @@
 
         snd_pcm_set_sync(substream);    // ???
 
-        spin_lock_irqsave(&korg1212->lock, flags);
-
 	snd_korg1212_OpenCard(korg1212);
 
         runtime->hw = snd_korg1212_capture_info;
 	runtime->dma_area = (char *) korg1212->recordDataBufsPtr;
 	runtime->dma_bytes = K1212_BUF_SIZE;
 
+        spin_lock_irqsave(&korg1212->lock, flags);
+
         korg1212->capture_substream = substream;
         korg1212->periodsize = K1212_PERIODS;
 	korg1212->channels = K1212_CHANNELS;
@@ -1428,9 +1472,9 @@
         korg1212->playback_substream = NULL;
         korg1212->periodsize = 0;
 
-	snd_korg1212_CloseCard(korg1212);
-
         spin_unlock_irqrestore(&korg1212->lock, flags);
+
+	snd_korg1212_CloseCard(korg1212);
         return 0;
 }
 
@@ -1448,9 +1492,9 @@
         korg1212->capture_substream = NULL;
         korg1212->periodsize = 0;
 
-	snd_korg1212_CloseCard(korg1212);
-
         spin_unlock_irqrestore(&korg1212->lock, flags);
+
+	snd_korg1212_CloseCard(korg1212);
         return 0;
 }
 
@@ -1508,19 +1552,33 @@
 static int snd_korg1212_prepare(snd_pcm_substream_t *substream)
 {
         korg1212_t *korg1212 = _snd_pcm_substream_chip(substream);
-        unsigned long flags;
 	int rc;
 
 #if K1212_DEBUG_LEVEL > 0
 		K1212_DEBUG_PRINTK("K1212_DEBUG: snd_korg1212_prepare [%s]\n", stateName[korg1212->cardState]);
 #endif
 
-        spin_lock_irqsave(&korg1212->lock, flags);
+        spin_lock(&korg1212->lock);
+
+	/* FIXME: we should wait for ack! */
+	if (korg1212->stop_pending_cnt > 0) {
+#if K1212_DEBUG_LEVEL > 0
+		K1212_DEBUG_PRINTK("K1212_DEBUG: snd_korg1212_prepare - Stop is pending... [%s]\n", stateName[korg1212->cardState]);
+#endif
+        	spin_unlock(&korg1212->lock);
+		return -EAGAIN;
+		/*
+		writel(0, &korg1212->sharedBufferPtr->cardCommand);
+		del_timer(&korg1212->timer);
+		korg1212->stop_pending_cnt = 0;
+		*/
+	}
 
         rc = snd_korg1212_SetupForPlay(korg1212);
+
         korg1212->currentBuffer = 0;
 
-        spin_unlock_irqrestore(&korg1212->lock, flags);
+        spin_unlock(&korg1212->lock);
 
 	return rc ? -EINVAL : 0;
 }
@@ -1535,6 +1593,7 @@
 		K1212_DEBUG_PRINTK("K1212_DEBUG: snd_korg1212_trigger [%s] cmd=%d\n", stateName[korg1212->cardState], cmd);
 #endif
 
+	spin_lock(&korg1212->lock);
         switch (cmd) {
                 case SNDRV_PCM_TRIGGER_START:
 /*
@@ -1566,6 +1625,7 @@
 			rc = 1;
 			break;
         }
+	spin_unlock(&korg1212->lock);
         return rc ? -EINVAL : 0;
 }
 
@@ -1894,11 +1954,11 @@
                 change = 1;
         }
 
+	spin_unlock_irqrestore(&korg1212->lock, flags);
+
         if (change)
                 snd_korg1212_WriteADCSensitivity(korg1212);
 
-	spin_unlock_irqrestore(&korg1212->lock, flags);
-
         return change;
 }
 
@@ -2151,6 +2211,10 @@
 
         init_waitqueue_head(&korg1212->wait);
         spin_lock_init(&korg1212->lock);
+	init_MUTEX(&korg1212->open_mutex);
+	init_timer(&korg1212->timer);
+	korg1212->timer.function = snd_korg1212_timer_func;
+	korg1212->timer.data = (unsigned long)korg1212;
 
         korg1212->irq = -1;
         korg1212->clkSource = K1212_CLKIDX_Local;
diff -Nru a/sound/pci/maestro3.c b/sound/pci/maestro3.c
--- a/sound/pci/maestro3.c	Sat Apr 19 19:51:48 2003
+++ b/sound/pci/maestro3.c	Sat Apr 19 19:51:49 2003
@@ -949,6 +949,13 @@
 	},
 	/* FIXME: Inspiron 8100 id should probably be here, too
 	 * (8200 irrelevant: has intel8x0 with CS4205) */
+	/* NEC LM800J/7 */
+	{
+		.name = "NEC LM800J/7",
+		.vendor = 0x1033,
+		.device = 0x80f1,
+		.amp_gpio = 0x03,
+	},
 	/* END */
 	{ 0 }
 };
diff -Nru a/sound/pci/rme32.c b/sound/pci/rme32.c
--- a/sound/pci/rme32.c	Sat Apr 19 19:51:51 2003
+++ b/sound/pci/rme32.c	Sat Apr 19 19:51:51 2003
@@ -904,7 +904,7 @@
 				   &hw_constraints_period_bytes);
 
 	rme32->wcreg_spdif_stream = rme32->wcreg_spdif;
-	rme32->spdif_ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	rme32->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(rme32->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &rme32->spdif_ctl->id);
 	return 0;
@@ -1037,7 +1037,7 @@
 	spdif = (rme32->wcreg & RME32_WCR_ADAT) == 0;
 	spin_unlock_irqrestore(&rme32->lock, flags);
 	if (spdif) {
-		rme32->spdif_ctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+		rme32->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 		snd_ctl_notify(rme32->card, SNDRV_CTL_EVENT_MASK_VALUE |
 			       SNDRV_CTL_EVENT_MASK_INFO,
 			       &rme32->spdif_ctl->id);
diff -Nru a/sound/pci/rme96.c b/sound/pci/rme96.c
--- a/sound/pci/rme96.c	Sat Apr 19 19:51:46 2003
+++ b/sound/pci/rme96.c	Sat Apr 19 19:51:46 2003
@@ -1226,7 +1226,7 @@
 	snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, &hw_constraints_period_bytes);
 
 	rme96->wcreg_spdif_stream = rme96->wcreg_spdif;
-	rme96->spdif_ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	rme96->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(rme96->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &rme96->spdif_ctl->id);
 	return 0;
@@ -1361,7 +1361,7 @@
 	spdif = (rme96->wcreg & RME96_WCR_ADAT) == 0;
 	spin_unlock_irqrestore(&rme96->lock, flags);
 	if (spdif) {
-		rme96->spdif_ctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+		rme96->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 		snd_ctl_notify(rme96->card, SNDRV_CTL_EVENT_MASK_VALUE |
 			       SNDRV_CTL_EVENT_MASK_INFO, &rme96->spdif_ctl->id);
 	}
diff -Nru a/sound/pci/rme9652/digiface_firmware.dat b/sound/pci/rme9652/digiface_firmware.dat
--- a/sound/pci/rme9652/digiface_firmware.dat	Sat Apr 19 19:51:48 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,4072 +0,0 @@
-/* stored in little-endian */
-static u32 digiface_firmware[24413] __devinitdata = {
-0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000,
-0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000,
-0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a,
-0x00044800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00800000,
-0x00000120, 0x00000000, 0x00044800, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x40800000, 0x00000120, 0x00000000, 0x00024001, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000,
-0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000100, 0x00000000, 0x00004008, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000900, 0x00000000, 0x0000c008, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000320, 0x00000000,
-0x00004801, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000120, 0x00000000, 0x438048f6, 0x78011e00, 0x8005e001, 0x015c001f,
-0x11e000f8, 0x9e004f80, 0xe005f801, 0x002f8019, 0x057801be, 0x778005e0,
-0xd800fe00, 0xbc0f6002, 0x00000123, 0x00000000, 0x040fb003, 0x03cd803f,
-0x3cc40fb2, 0xfc20ff00, 0xc00ff083, 0x20ff083f, 0x0f3003ec, 0xff0837ca,
-0xf003fc00, 0x113e820f, 0x0bcc40fb, 0x0fc0c311, 0x00000e00, 0x00000000,
-0x00870001, 0x0844a03f, 0x044001f1, 0x74000e08, 0x4201f000, 0x001d0007,
-0x01500074, 0x1d100740, 0xd0007400, 0x01854143, 0x0bc40051, 0x0440c1b0,
-0x00000c20, 0x00000000, 0x0043a011, 0x0a24000d, 0x304808d0, 0x1420cd20,
-0x400cd003, 0x00c10013, 0x0c158314, 0xc5001340, 0xd0033440, 0x04915004,
-0x1b060049, 0x44404019, 0x00000e80, 0x00000000, 0x09058803, 0x81643155,
-0x04410550, 0x76201d00, 0x4001d900, 0x001d9827, 0x01590034, 0x1c002700,
-0xd8007600, 0x00275009, 0x030608c1, 0x0c402414, 0x00000620, 0x00000000,
-0x0037a802, 0x0166011d, 0x54d00d90, 0x7c001f02, 0xc201f080, 0x33df0027,
-0x0110006c, 0x5f0277c2, 0xf0807428, 0x0026c209, 0x034c52db, 0x02d01910,
-0x00000e20, 0x00000000, 0x003d8007, 0x02d4202f, 0x6f8803f2, 0xfc00f720,
-0xc00f7003, 0x083f101f, 0x0fb003f8, 0xbf100fc0, 0xf003fc01, 0x0818c006,
-0x83fd80ff, 0x1ec093f0, 0x00000602, 0x00000000, 0x00150802, 0x904e8397,
-0x17c089b0, 0x7c001f01, 0xc0417020, 0x00db0107, 0x01f0007c, 0x5f0117c8,
-0x30007c18, 0x0804c001, 0x034c00d3, 0x08c06bb0, 0x00000420, 0x00000000,
-0x0c14a013, 0x0b4c21dd, 0x2740a514, 0x6001d601, 0x803d1003, 0x09152077,
-0xbdd10774, 0x9d006748, 0x402b7c42, 0x04fe400f, 0x03c400d1, 0x4c913910,
-0x00000200, 0x00000000, 0x00428007, 0x07048085, 0x63403510, 0x0405cd00,
-0x421c901b, 0x220120b3, 0x0cd04f34, 0x8920e340, 0x90073443, 0x0972580c,
-0x032400c1, 0x1c403410, 0x00000a00, 0x00000000, 0x00488004, 0x24a409ad,
-0x5b408a10, 0x94312508, 0x411290a4, 0x91e10249, 0x92d0a4b4, 0x6d0c5b40,
-0xd0140425, 0x000a0010, 0x07a400c1, 0x1a409e14, 0x00000200, 0x00000000,
-0x00300012, 0x62460097, 0x23c00034, 0x7d00cf00, 0x400cf403, 0x04034417,
-0x0cf0433c, 0x8f2043c1, 0xb0673400, 0x0314c004, 0x036c48c3, 0x48c08130,
-0x00000040, 0x00000000, 0x003da802, 0x21dc20ff, 0x17c0cf70, 0xec883f00,
-0x80037200, 0x00f7a82f, 0x03f2007c, 0x7f203fc2, 0x70807c84, 0x016dc88b,
-0x0bdc0cbf, 0x09c08771, 0x00000660, 0x00000000, 0x0027aa15, 0x014c049f,
-0x05401530, 0x5c001300, 0xc0113004, 0x00170024, 0x01300044, 0x1f0024d0,
-0xf0005c00, 0x0027c0e9, 0x236c00df, 0x54c01f10, 0x00000e00, 0x00000000,
-0x10298812, 0x02ec08fd, 0x38600a10, 0x3c00eb28, 0xc40eb303, 0x00eb0012,
-0x0fb00384, 0xf90018c0, 0xd103bc00, 0x005b4146, 0x038440ad, 0x48400c12,
-0x00000620, 0x00000000, 0x00790003, 0x048400ad, 0x40401283, 0xb4012508,
-0x40109004, 0x01210048, 0x12900404, 0x2d004a40, 0xd0048441, 0x024b4052,
-0x173401ed, 0x0d411e13, 0x00000402, 0x00000000, 0x04b32012, 0x030449cd,
-0x31400c90, 0x3448cd10, 0x452c984b, 0x00c98232, 0x2c900f04, 0xc9203061,
-0xd8cb0512, 0x8033601d, 0x031403cd, 0x49403c10, 0x00000c20, 0x00000000,
-0x01dda017, 0x09c4827f, 0x14d005b4, 0x5c035702, 0x4865b019, 0x40510054,
-0x65903545, 0x5d1016c2, 0xf0195402, 0x0113e055, 0x017c117f, 0x5dd03730,
-0x00000620, 0x00000000, 0x20030012, 0x407c301f, 0x8ac80373, 0xdc063b10,
-0xc023f208, 0x023e008f, 0x03f008bc, 0x3b000fc0, 0xf000fe02, 0x000fea23,
-0x0024001f, 0x4a0061f4, 0x00000c00, 0x00000000, 0x00270010, 0x020c0883,
-0x67c04930, 0x7c419300, 0xc0599016, 0x05830161, 0x4830066c, 0x8720a0c0,
-0x308a2e41, 0x3824cc59, 0x026d5097, 0x43c01930, 0x00000c20, 0x00000000,
-0x38662801, 0x16540091, 0x27644950, 0x5c009500, 0x40499012, 0x839500e7,
-0x7952165c, 0x9510e540, 0x520e5403, 0x00244009, 0x02640091, 0x07407950,
-0x00000800, 0x00000000, 0x0224a018, 0x12440091, 0x2f400912, 0xe488b902,
-0x400bd082, 0x00bd002f, 0x0b1822c4, 0xb1102c40, 0x1002c408, 0x902e002b,
-0x0245008d, 0x63444910, 0x00000200, 0x00000000, 0x48202010, 0x0a140281,
-0xab402a50, 0x8402ad00, 0x442a910a, 0xc2a528ab, 0x2a528a94, 0xa538b944,
-0x520b9402, 0x022a528a, 0x12040089, 0x43408850, 0x00000080, 0x00000000,
-0x0506b01d, 0x504e0013, 0x17400030, 0x7c205b20, 0xc001f000, 0x004b2017,
-0x0130004e, 0x570004c0, 0x30006c00, 0x0d8ec161, 0x2c6c1e0f, 0x77c16130,
-0x00000ac0, 0x00000000, 0x002f9019, 0x02fc42ff, 0xa7c029f1, 0x70029720,
-0xc029f00a, 0x029f10b7, 0x29f00a5c, 0x9f00a7c2, 0xf00a7c82, 0x0125c049,
-0x267c81b7, 0x67c24bb4, 0x00000e60, 0x00000000, 0x012fa818, 0x0a4c14bf,
-0x24c129b0, 0x4c089e05, 0x89693222, 0x149325a4, 0x29321246, 0x93022480,
-0xb04a6802, 0x002fc94b, 0x026c009d, 0x67c10bf0, 0x00000e00, 0x00000000,
-0x8087081c, 0x006c461d, 0x86c02110, 0x6c421d30, 0xc461b008, 0x42111186,
-0x01113844, 0x1b938440, 0x1100ec80, 0x01074060, 0x28440e17, 0x734021e0,
-0x00000c22, 0x00000000, 0x00a3a010, 0x1284108d, 0x2b604a50, 0x8606ad84,
-0x600ad81a, 0x10a58028, 0x6a584296, 0xad802942, 0x98129446, 0x04a24908,
-0x5224108d, 0x434148d0, 0x00000e80, 0x00000000, 0x01a5a018, 0x0224009d,
-0x2f440b10, 0xa400bd00, 0x420bd002, 0x60b5182a, 0x0a5103c4, 0xb91c2d40,
-0x1002f420, 0x00276409, 0x82640095, 0x63414950, 0x00000620, 0x00000000,
-0x00a7a005, 0x064c029d, 0x25c009b4, 0x4c009f00, 0xc009f402, 0x00974024,
-0x09540255, 0x9d00a5d0, 0xb0025420, 0x0126c909, 0x026c049f, 0x17c039d0,
-0x00000e20, 0x00000000, 0x00258014, 0x0e7c029f, 0x26c099f0, 0x7c008f00,
-0xc4093082, 0x009b3827, 0x09b3026c, 0x9b0026c0, 0xf0026c00, 0x0427e809,
-0x025c0587, 0x53c019f0, 0x00000600, 0x00000000, 0x00050014, 0x00cc0217,
-0x0cc30238, 0xcc103340, 0xc4023000, 0x8037048f, 0x03f280cc, 0x2b0088c0,
-0xf000f800, 0x2084c001, 0x80480213, 0x53c021d2, 0x00000420, 0x00000000,
-0x0014a814, 0x0145015d, 0x95431558, 0x54025100, 0x44355021, 0x1b570017,
-0x85d18970, 0x5d201540, 0xd001f40a, 0x009c4007, 0x01440055, 0x530067d0,
-0x00000200, 0x00000000, 0x0032a014, 0x038401dd, 0xba601e12, 0xb628e904,
-0x43ae90a3, 0x23fd20bb, 0x0e904fe4, 0xed0c7860, 0xd087d48a, 0x08b3420c,
-0x830400c9, 0x53413cd0, 0x00000a00, 0x00000000, 0x10388005, 0x038402ed,
-0xfb400c50, 0x3400e900, 0x400ed203, 0x00e5003a, 0x2ed00bb4, 0xed843940,
-0xd00ba440, 0x0043421e, 0x138404ed, 0x17400ed0, 0x00000200, 0x00000000,
-0x00681015, 0x070c81ff, 0x7ec01e18, 0xbc01cb18, 0xc01eb007, 0x21c7007b,
-0x1cf187ac, 0xeb0078c0, 0xf0079c01, 0x007bc01e, 0x178e01fb, 0x57c01af0,
-0x00000040, 0x00000000, 0x0035b010, 0x007c00df, 0x05c001f0, 0x5c001710,
-0xc0016000, 0x001f0017, 0x01f0005c, 0x1f1007c8, 0xf0007c00, 0x0804c00d,
-0x1b7d0ad7, 0x43c003f0, 0x00000660, 0x00000000, 0x007ba000, 0x07c804f3,
-0x7c801f30, 0xc801f300, 0xc01fb007, 0x09da0274, 0x1fe007dc, 0xf2027f80,
-0xf087f809, 0x005cc09d, 0x4f5403df, 0x0bc097f0, 0x00000e00, 0x00000000,
-0x00398815, 0x138410ab, 0x3ac04e10, 0x8444f100, 0x440ef113, 0x27ef0078,
-0x0ef023b4, 0xeb10b9c0, 0xd0033408, 0x0408441e, 0x079421fd, 0x57c00ad0,
-0x00000620, 0x00000000, 0x00290000, 0x83040081, 0x38400e12, 0xa400e102,
-0x400e9843, 0x08ed0138, 0x0ed003b4, 0xe9003b40, 0xd047b400, 0x001a408c,
-0x038700ed, 0x236006d0, 0x00000400, 0x00000000, 0x30332804, 0x8c240099,
-0xc260a010, 0x340a0120, 0x40315a08, 0x420d1210, 0xe0402834, 0x01428540,
-0xd004344e, 0x0040489c, 0x030413dd, 0x194020d0, 0x00000c20, 0x00000000,
-0x0035a815, 0x634c01d1, 0xf4c83d10, 0x6d03d349, 0x507d900b, 0x92d90064,
-0x3dd00f5e, 0xd900f7c0, 0xd0077c03, 0x00c4c00d, 0x03dd12ff, 0x57400dd0,
-0x00000620, 0x00000000, 0x28260001, 0x015c00df, 0xb7c02df0, 0x4c00df00,
-0xc02df10b, 0xc2d700a7, 0x2df0037c, 0xdf08b7c4, 0xf2037c42, 0x0497d00c,
-0x037400df, 0x27007ff2, 0x00000c00, 0x00000000, 0x006b0880, 0x02a400f3,
-0x7ec10c30, 0xfc11ff04, 0xc19ff057, 0x15f7046c, 0x9ff0c3c4, 0xf3043e00,
-0x7063cc42, 0x000cc103, 0x03cd00f3, 0x04c01af1, 0x00000c20, 0x00000000,
-0x00262081, 0x034400d1, 0x85404110, 0x74041d10, 0x4031d10c, 0x401e2404,
-0x51d00874, 0x1110c740, 0x10045401, 0x43514031, 0x034080d5, 0x254059d0,
-0x00000802, 0x00000000, 0x02342001, 0x1b5400d1, 0x04404110, 0x74081d06,
-0x41015840, 0x201c2204, 0x01d0a044, 0x01020640, 0x500224b0, 0x0024538d,
-0x834000d1, 0x044085d0, 0x00000200, 0x00000000, 0x00202010, 0x01140081,
-0x01400010, 0x34000c00, 0x5000d800, 0x24090100, 0x00d10036, 0x01400340,
-0x10023400, 0x0010410c, 0x030404c1, 0x404004d2, 0x00000080, 0x00000000,
-0x00269000, 0x025c0093, 0x00c00110, 0x7c801f08, 0xc8007080, 0x011f0844,
-0x01f2004e, 0x120202c2, 0x70826c80, 0x0024c011, 0x17cc01f3, 0x04c001f0,
-0x00000ac0, 0x00000000, 0x802fb005, 0x03cc00bf, 0x3fc40fd0, 0xfc00ff10,
-0xc00ff103, 0x08f7022f, 0x0ff003fc, 0xff097fc0, 0xf045dc00, 0x001fc403,
-0xa3fc08ff, 0x17c003f0, 0x00000e40, 0x00000000, 0x000fa003, 0x23fc00ff,
-0x3cc00f31, 0xcc00fd30, 0xc00ff003, 0x40ff002d, 0x0f7803cc, 0xfa003fc4,
-0xf081cc80, 0x083fc00f, 0x03cc04f3, 0x0cc06f74, 0x00000e00, 0x00000000,
-0x04870801, 0x0274121d, 0x054001b8, 0x6c801f00, 0x4001d200, 0xc0170807,
-0x01520044, 0x05280740, 0xd0026c80, 0x00b7400d, 0x03948ae1, 0x04404e10,
-0x00000c20, 0x00000000, 0x0303a011, 0x01160ccd, 0x02460090, 0x04800d00,
-0x44005800, 0x000d0001, 0x00900005, 0x05200140, 0x50022420, 0x60b14008,
-0x033400c9, 0x44406c10, 0x00000e80, 0x00000000, 0x0005a803, 0x0336289d,
-0x07428110, 0x6400152c, 0x4241d080, 0x20151207, 0x81504054, 0x15000646,
-0xd1826420, 0x0037420d, 0x033400d9, 0x0c400d12, 0x00000620, 0x00000000,
-0x0637a802, 0x077c00df, 0x06c82190, 0x4c0b1d08, 0xc131f01c, 0x041f0145,
-0x21b3084c, 0x1704c7c4, 0xf0046c49, 0x0237c00d, 0x037c00db, 0x08c00d10,
-0x00000e20, 0x00000000, 0x003d8007, 0x0efca07e, 0x3dc80ff2, 0xfc21ff0a,
-0xc01ff013, 0x04ff1027, 0x0df023ec, 0xf500bb80, 0xf027fc00, 0x0077400f,
-0x03dc60f7, 0x1fc00f80, 0x00000600, 0x00000000, 0x10350802, 0x017c08df,
-0x37c02cf0, 0x7c02c300, 0xc00df083, 0x20d70027, 0x2df00b3c, 0xc34236c0,
-0xb1034c80, 0x0437c04d, 0x035c00c3, 0x08c00db4, 0x00000420, 0x00000000,
-0x0ef4a213, 0x03460bd9, 0x37400dd0, 0x6403d5a0, 0xc10dd007, 0x18d50c24,
-0x5de0c364, 0xd0087542, 0x500f4401, 0x00b7043d, 0x03c407f1, 0x4c400f50,
-0x00000200, 0x00000000, 0x0022a007, 0x2014230d, 0x034000d0, 0x342501a0,
-0x6330d06c, 0x011104d2, 0x00904824, 0x05048141, 0x116c0413, 0x40b7402c,
-0x030513c9, 0x1c400d10, 0x00000a00, 0x00000000, 0x00688004, 0x07844129,
-0x73401ed1, 0xb499e520, 0x645ed007, 0x01e50178, 0xded007a4, 0xe5027940,
-0x53170411, 0x147b415e, 0x27a481e9, 0x10401e50, 0x00000200, 0x00000000,
-0x00301012, 0x0b140a1f, 0x33c28cf1, 0x3c02c100, 0xc00cf023, 0x00c70033,
-0x6cf0333c, 0xc72035c0, 0x30030d0c, 0x00238008, 0x031c80cb, 0x48c00c32,
-0x00000040, 0x00000000, 0x003db802, 0x23dc00bb, 0x3fc20ff0, 0xec20ff00,
-0xc24ff0a3, 0x00de0136, 0x4f70a3ec, 0xfb003dc0, 0x73177c28, 0x002fc24f,
-0x83dc40f7, 0x0bc00f71, 0x00000660, 0x00000000, 0x0027a015, 0x007c001f,
-0x05c201f0, 0x4d001f00, 0xc2013100, 0x001b0054, 0x11f2007c, 0x1b0804c8,
-0x30047c00, 0x0834c01d, 0x434485d1, 0x54c13d34, 0x00000e00, 0x00000000,
-0x00298812, 0x03b4006c, 0x39c00ed0, 0x8400e320, 0x400e9803, 0x80e12038,
-0x0ec803b4, 0xeb083040, 0xb003b400, 0x2038440f, 0x138414fb, 0x49404e50,
-0x00000620, 0x00000000, 0x00f90003, 0x07b4012d, 0x79401e50, 0x8401ed00,
-0x401e1007, 0x01e10078, 0x1ed007b4, 0xe408f848, 0x50473401, 0x2061401e,
-0x27850ce1, 0x0c549c50, 0x00000400, 0x00000000, 0x01b30812, 0x03b600cd,
-0xbd407ed0, 0x8407f500, 0x401e904f, 0x8ae100b8, 0x1ed02fb4, 0xed08f844,
-0xd003b440, 0x0021501c, 0x030400c9, 0x49400c58, 0x00000c20, 0x00000000,
-0x005da817, 0x0174117f, 0xd5c11470, 0x4c115f04, 0xd1953049, 0x015b4094,
-0x65f00d7c, 0x570014d0, 0x7001f405, 0x0015c115, 0x014c0053, 0x5cc00550,
-0x00000620, 0x00000000, 0x10830012, 0x08fe001f, 0x0dc403f2, 0xfc423304,
-0xc022b188, 0x063f210f, 0x63f148f4, 0x3ba08fc4, 0x9008fc02, 0x1006c001,
-0x007c821b, 0x4ac001a2, 0x00000c00, 0x00000000, 0x00270810, 0x061c0293,
-0x26c00970, 0x4c019300, 0xc019b0a6, 0x059f0024, 0x5930163c, 0x9304a7c0,
-0xf0227c99, 0x0223c009, 0x020c0583, 0x43c009b4, 0x00000c20, 0x00000000,
-0x00260001, 0x1a4c0091, 0x25c08950, 0x44129520, 0x01b9140e, 0x279d0025,
-0x49529e74, 0x9101a748, 0xd00a7403, 0x00e74009, 0x02440495, 0x0740091c,
-0x00000800, 0x00000000, 0x8024a018, 0x22540089, 0x2c400f10, 0x8404b120,
-0x000b1242, 0x00bd022c, 0x0b1002f4, 0xf0002b46, 0xd082f490, 0x04270089,
-0x02444091, 0x63400914, 0x00000200, 0x00000000, 0x42302010, 0x22a40281,
-0xa9480a50, 0x8502a500, 0x422a100a, 0x02ad00a9, 0x2a500ab4, 0xa140aa40,
-0xd10bb402, 0x05a34028, 0x12040685, 0x43404812, 0x00000080, 0x00000000,
-0x0586b01d, 0x085e8013, 0x04c00170, 0x4c000300, 0xc8003000, 0x801f0810,
-0x0030807c, 0x120007c0, 0xf000fc00, 0x0107c005, 0x2c0c0113, 0x77c0b134,
-0x00000ac0, 0x00000000, 0x012fb819, 0x1a4c02bf, 0xa5c029f0, 0x7c429f00,
-0xc429f10a, 0x029f00a7, 0x29f10a7c, 0x9f00a7c0, 0xf20a7c02, 0x002fc00b,
-0x267c289d, 0x67c099f0, 0x00000e60, 0x00000000, 0x01afa818, 0x1a6c06b7,
-0xa4c04b70, 0x4c869e01, 0x4009b032, 0x109f0027, 0x6930124c, 0x9f2327c0,
-0xb0027000, 0x09254489, 0x1a7c8093, 0x63c00932, 0x00000e00, 0x00000000,
-0x0183081c, 0x184c8617, 0x84c021d0, 0x5c021b21, 0xc0417008, 0x44170014,
-0x05a20144, 0x1f001740, 0x10a8742a, 0x03874000, 0x90740a31, 0x7341e110,
-0x00000c20, 0x00000000, 0x00a30010, 0x1a260285, 0xa2502850, 0x8602ad10,
-0x412a911a, 0x10ad04ab, 0x2a825a85, 0xad01ab48, 0x1442b494, 0x442b444a,
-0x1a3414a1, 0x43400854, 0x00000e80, 0x00000000, 0x01258018, 0x43440295,
-0x254109d0, 0xd4009590, 0x630b5022, 0xa0a50a2c, 0x8b102284, 0xb52a2f48,
-0x1142f4d0, 0x283b600b, 0x027400b1, 0x63400950, 0x00000620, 0x00000000,
-0x0027a005, 0x0e6c0097, 0x64c03970, 0x4c189d01, 0xc039b046, 0x079f2027,
-0x0994024c, 0x9d00e7c0, 0xb2027420, 0x1065c209, 0x027c4091, 0x17420970,
-0x00000e20, 0x00000000, 0x00258014, 0x135c009f, 0x24c088f0, 0x5c019b32,
-0xc08970c2, 0x84970026, 0x09f2426c, 0x9c8027c1, 0xf0267c19, 0x0926c029,
-0x027c009b, 0x53c00920, 0x00000600, 0x00000000, 0x00050014, 0x007c000b,
-0x87c001f0, 0xcc003b80, 0xc0033000, 0x5033000c, 0x03b000cc, 0x3c000cc0,
-0xf108cc02, 0x020ed003, 0x003c003b, 0x50c00130, 0x00000420, 0x00000000,
-0x001ca814, 0x6d440071, 0x174005d0, 0x54005f20, 0x4015b019, 0x035b00d5,
-0x05f0096c, 0x5d0017c0, 0xd2215413, 0x20144225, 0x01740175, 0x50400500,
-0x00000200, 0x00000000, 0x0072a014, 0x031410c1, 0x33400cd0, 0xa400f100,
-0x61ae500b, 0x2be103fa, 0x0e102bb4, 0xe9333840, 0xd007e402, 0x8cf842fe,
-0x033481e1, 0x50500c00, 0x00000a00, 0x00000000, 0x20f88005, 0x038400c1,
-0x72400ed8, 0x3400cd08, 0x6c1cd107, 0x00e9007b, 0x3ed203a4, 0xed203a40,
-0xd0439401, 0x0030481e, 0x13b442e5, 0x14405e10, 0x00000200, 0x00000000,
-0x40781015, 0x279c01a1, 0xfb401ad0, 0xa401e104, 0xc01e7007, 0x61c30072,
-0x1c3407d8, 0xfa1078cc, 0xf1078c81, 0x08788a1e, 0x073c01e3, 0x54c05c36,
-0x00000040, 0x00000000, 0x0015b010, 0x134c0097, 0xb7c009d0, 0x5c001901,
-0xcc01b000, 0x001f0005, 0x0530006c, 0x1d0807c6, 0xf1007c20, 0x0805c001,
-0x2b7c0017, 0x43c0edf1, 0x00000660, 0x00000000, 0x906fa200, 0x07fc0573,
-0x7ec01f70, 0xcc01f700, 0x001f3407, 0x41f7427f, 0x1bfa377c, 0xff027cd0,
-0x7427fc81, 0x027fc09f, 0x0fcc41f3, 0x03c03f32, 0x00000e00, 0x00000000,
-0x003c8815, 0x02bc006b, 0x3de00eb0, 0xd410f12a, 0xc00e7083, 0x20e1033d,
-0x6bd817b4, 0xed02b941, 0x100bb400, 0x0b3b44ce, 0x23d440ef, 0x57404eb0,
-0x00000620, 0x00000000, 0x00290000, 0x01340621, 0x3a408a90, 0x8400e500,
-0x410e1063, 0x08e1003b, 0x0a5203a4, 0xed0a3840, 0x1203b400, 0x803b480e,
-0x038401e5, 0x03600e90, 0x00000400, 0x00000000, 0x08132804, 0x08140001,
-0x71481811, 0x14010100, 0x4001104c, 0x60010241, 0x00d00034, 0x0d090040,
-0x1028340b, 0x00034200, 0x0354600d, 0x13400c80, 0x00000c20, 0x00000000,
-0x3015a815, 0x65744091, 0xbec1b914, 0x4c43d522, 0xc2bd1107, 0x53d720b7,
-0x2d784b74, 0xdd04f4c0, 0x708f7c8a, 0x0037804d, 0x03cc00d3, 0x57c00f9c,
-0x00000620, 0x00000000, 0x08270201, 0x097c015f, 0x37c209f0, 0x3c905f22,
-0xc80d7083, 0xd0df21b7, 0x0df0137c, 0xdd00b7c1, 0xf10b7c02, 0x00b7c02d,
-0x037c00da, 0x07c00df0, 0x00000c00, 0x00000000, 0x009b0880, 0x0cfc00b3,
-0x3fc80bf0, 0xec00bb10, 0xc21fb20f, 0x03ef017c, 0x0ff023cc, 0xee013f48,
-0xf047cc00, 0x0074c08f, 0x03f801df, 0x03c00ff8, 0x00000c22, 0x00000000,
-0x84c62081, 0x00740051, 0x374019d2, 0x4c40d518, 0x40117094, 0x021d00c5,
-0x25d04854, 0x1d204740, 0xd0005426, 0x00454310, 0x03742017, 0x07400d50,
-0x00000802, 0x00000000, 0x0804a001, 0x01748191, 0x33484990, 0x7486d900,
-0x40615200, 0x501d0885, 0x01d08054, 0x14000640, 0xd0204604, 0x09064001,
-0x0374649d, 0x07400dd8, 0x00000200, 0x00000000, 0x00202010, 0x00240141,
-0x32400898, 0x04004100, 0x4000d100, 0x40082000, 0x00824014, 0x0d000248,
-0xd0001400, 0x00014001, 0x03340085, 0x43400c18, 0x00000080, 0x00000000,
-0x4006b000, 0x007c0091, 0x3fc009f0, 0x7c209b00, 0xd0017200, 0x801e0005,
-0x01d0945c, 0x1e9007c0, 0xe2000c00, 0x00048401, 0x03fc009f, 0x03c00ff0,
-0x00000ac0, 0x00000000, 0x000f9005, 0x00fc407f, 0x3fc40be1, 0xdc20ff00,
-0xc40f7083, 0x80fe083f, 0x0bf003fc, 0xff003fc8, 0xf003fc00, 0x003fc20f,
-0x03fc0077, 0x17c00ff0, 0x00000e60, 0x00000000, 0x010fa803, 0x03ec04ff,
-0x3fc00ff0, 0xfc00ff00, 0xc20ff003, 0x00df0037, 0x0fb003ec, 0xf70037c0,
-0xf003fc60, 0x006fc015, 0x236c079f, 0x0cd08fb0, 0x00000e00, 0x00000000,
-0x05a70801, 0x0044321d, 0x05c001d2, 0x74000700, 0x4201d000, 0x001d0007,
-0x01140044, 0x1d200740, 0xd1007420, 0x0292c085, 0x9b84825d, 0x04486f10,
-0x00000c20, 0x00000000, 0x0213a011, 0x82248c0d, 0x134008d1, 0x3400cd00,
-0x400cd003, 0x20cd2012, 0x0c100114, 0xcd083344, 0xd0013400, 0x20034004,
-0xa304868d, 0x44446c10, 0x00000e80, 0x00000000, 0x3225a003, 0x417400cd,
-0x274005d8, 0x74001d00, 0x4001d800, 0x000d0027, 0x01030254, 0x1d040740,
-0xd0027422, 0x00354005, 0x0364005d, 0x0c400c14, 0x00000620, 0x00000000,
-0x2147a002, 0x036c00df, 0x37c805f0, 0x7412df00, 0xc53df04b, 0x005f2237,
-0x0130075d, 0x970277c0, 0xf0077c82, 0x000f400f, 0x036d00bf, 0x00c00db2,
-0x00000e20, 0x00000000, 0x006d8007, 0x00c8803d, 0x0d800bd0, 0xfc183702,
-0xc083f0a0, 0x08bf044f, 0x0ff010ec, 0x7f204fc0, 0xf220fc00, 0x003ec00f,
-0x83dc006e, 0x1fc80ff0, 0x00000602, 0x00000000, 0x40150002, 0x465c2413,
-0x17c10170, 0x6c02df08, 0xc12d700b, 0x205f2214, 0x01b0310c, 0x9d0037c0,
-0xf3014c10, 0x4406c8cd, 0x034c0093, 0x09c00d70, 0x00000420, 0x00000000,
-0x2024a013, 0x014400d1, 0x67425d18, 0x44011d09, 0x4821d088, 0x0b9d00a5,
-0x5dd08244, 0x59008746, 0xd0064c01, 0x0034402d, 0x03c40051, 0x4c40af10,
-0x00000200, 0x00000000, 0x0202a807, 0x811422c1, 0xa3400c50, 0x04210d04,
-0x40a0d030, 0x238c0822, 0x2c900e06, 0x4d048341, 0xd0622400, 0x08404014,
-0x03440080, 0x1c409c10, 0x00000a00, 0x00000000, 0x11508004, 0x26840121,
-0x5a401290, 0x8611ed01, 0x401ed007, 0x956d015a, 0x92d00586, 0xa9047b40,
-0x920584e1, 0x01784c56, 0x07840541, 0x18401c10, 0x00000200, 0x00000000,
-0x00101012, 0x201c0013, 0x43c04878, 0x0d000f21, 0x50417200, 0x019f2042,
-0x8cb2b00d, 0x5f2343c0, 0xf2002914, 0x8480d055, 0x070d0583, 0x49c28c70,
-0x00000040, 0x00000000, 0x011db802, 0x23be00ff, 0x3fc00770, 0xdc00ff00,
-0xc00ff223, 0x407f003d, 0x81f0a37c, 0xbb0037c0, 0xf027fcc0, 0x013dc007,
-0x23fc097f, 0x0bc00ff4, 0x00000660, 0x00000000, 0x0067a815, 0x814c81d3,
-0x65c00570, 0x7c001300, 0xc001f800, 0x001f0027, 0x11f0027c, 0x1f0004c2,
-0xf0827c20, 0x2007c00d, 0x0b4b0193, 0x57c0adf0, 0x00000e00, 0x00000000,
-0x10398812, 0x02ac0001, 0x18400a10, 0x9c00e100, 0xc20ed803, 0x00ed001b,
-0x0ed001b4, 0xe7003840, 0xd001b400, 0x1033480e, 0xcbac006b, 0x4b410ed0,
-0x00000620, 0x00000000, 0x00790003, 0x04840121, 0x49401250, 0xb4a12900,
-0x4812d884, 0x012d204b, 0x32d084b4, 0x2d20484a, 0xd284b4a1, 0x004b601e,
-0x87840081, 0x0f405ed1, 0x00000402, 0x00000000, 0x00332012, 0x032440c1,
-0x30402c10, 0x5400c900, 0x400cd003, 0x00cd0037, 0x3cd20336, 0xc5083041,
-0xd0033421, 0x2433486c, 0x03040049, 0x4b400cd8, 0x00000c20, 0x00000000,
-0x401d8017, 0x01440071, 0x15c02450, 0x7c005b40, 0xc005f001, 0x405f0017,
-0x05f0017c, 0x5f0014d0, 0xf081fc04, 0x0017c025, 0x01440073, 0x5fc005f0,
-0x00000620, 0x00000000, 0x00c70012, 0x00fc001f, 0x8ec103f8, 0xfc003700,
-0xc403f000, 0x063f000d, 0x23f000fe, 0x3f108fc4, 0xf000bc00, 0x000fc420,
-0x007c003f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x02670010, 0x021c019f,
-0x66c059b1, 0x7c009f00, 0xc0093102, 0xc2930027, 0x19300a7e, 0x9f00e7c0,
-0x31027c04, 0x0060c019, 0x020c0083, 0x40c00830, 0x00000c20, 0x00000000,
-0x10262001, 0x0274419d, 0xe4401931, 0x74189d20, 0x4009120e, 0x03912027,
-0x39110e74, 0x9d002742, 0x142a7403, 0x00e4c039, 0x02442095, 0x04500950,
-0x00000800, 0x00000000, 0x0424a818, 0x0674049d, 0x2e400b10, 0xf400bd01,
-0x406b501a, 0x00b111af, 0x8b9002b4, 0xbd902f40, 0x108af490, 0x062c40a9,
-0x024400b1, 0x60408910, 0x00000200, 0x00000000, 0x02202010, 0x06b4038d,
-0xa8400a90, 0xb602ad00, 0x402a500a, 0x02a110ab, 0x2a900bb4, 0xad80bb40,
-0x100ab402, 0x00a84028, 0x920400a5, 0x4048d850, 0x00000080, 0x00000000,
-0x8d82b01d, 0x007c941f, 0x12c001b4, 0x7c801f00, 0xc8017400, 0x80524007,
-0x04b40070, 0x1f0007c2, 0x3000fc00, 0x0004d001, 0x2c4e2033, 0x74c03130,
-0x00000ac0, 0x00000000, 0x012fb819, 0x0a3c00bf, 0xb7c82878, 0x7c229f08,
-0xc229b20a, 0x029f00a7, 0x29720a7c, 0x9f10a7c0, 0xf08a7c42, 0x00a5c429,
-0x267c169f, 0x67c0c9f0, 0x00000e60, 0x00000000, 0x002fa018, 0x02cc20bf,
-0x27c24b30, 0x4c089f05, 0xc149f0b2, 0x089f2b24, 0xc9f0c25e, 0x932824c1,
-0x00227004, 0x0167c059, 0x124c0591, 0x67c14b30, 0x00000e00, 0x00000000,
-0x2487081c, 0x206c901d, 0x07400114, 0x14881f01, 0x4841d000, 0x82172300,
-0x21d2585c, 0x01078140, 0x30187484, 0x248dc921, 0x58440211, 0x736141b0,
-0x00000c22, 0x00000000, 0x0b23a010, 0x0224008c, 0x2b408810, 0x8480ad05,
-0x494ad232, 0x0cad1129, 0x0ad102b4, 0xa1112944, 0x961aa436, 0x00ab426a,
-0x32241689, 0x43400810, 0x00000e80, 0x00000000, 0x80258818, 0x0264409d,
-0x27600910, 0xd400bd00, 0x400ed002, 0x00b5002d, 0x0bd242f4, 0xb1002d40,
-0x1042f400, 0x202d400b, 0x02640099, 0x63600990, 0x00000620, 0x00000000,
-0x0a67a805, 0x064c339f, 0x27c00930, 0x4c009f08, 0xd009fa02, 0x009f04a5,
-0x09f00a7c, 0x93c025c8, 0xb8026c00, 0x4127c809, 0x026c009a, 0x17400930,
-0x00000e20, 0x00000000, 0x14258014, 0x223c058f, 0x27c039f0, 0x7c009700,
-0xc009b002, 0x009f0026, 0x09f0025c, 0x9f0827c0, 0xf0023c40, 0x0025c809,
-0x025c0097, 0x53c009f0, 0x00000600, 0x00000000, 0x00050814, 0x004c0217,
-0x8fc80134, 0xfc803340, 0xc8033400, 0x6c33448f, 0x03f000dc, 0x33240fc2,
-0x7088cd04, 0x000dc2c3, 0x003c0003, 0x53c101f0, 0x00000420, 0x00000000,
-0x049ca014, 0x85c43177, 0x17408711, 0x74055320, 0x49251201, 0x20541c97,
-0x25d03d5c, 0x51105743, 0x100d4401, 0x001f4025, 0x01740051, 0x534037d0,
-0x00000200, 0x00000000, 0x00f2a014, 0x030400c5, 0x3b420c12, 0xb407f100,
-0x407e9837, 0x03e1003b, 0x7fd08f96, 0xe100ff00, 0x11138441, 0x407d600e,
-0x033400c1, 0x53408cd0, 0x00000a00, 0x00000000, 0x08288005, 0x0b040065,
-0x7b400a10, 0xb400e120, 0x400e9007, 0x00e9007b, 0x0ed003a4, 0xe9143a44,
-0x10438403, 0x043b420e, 0x23b405e5, 0x17480ad0, 0x00000200, 0x00000000,
-0x00781015, 0x878c0107, 0x7f4c1e32, 0xbc01e310, 0xc01e3007, 0x81e3007b,
-0x1ef1079c, 0xe3407bc8, 0x7407cc81, 0x0871c41e, 0x07bc02e3, 0x57c016f0,
-0x00000040, 0x00000000, 0x00359810, 0x017d001f, 0x07c20dd1, 0x7c001700,
-0xc4017000, 0x00150007, 0x01f0015c, 0x170807c0, 0xf1007c00, 0x0007c001,
-0xcb7c01db, 0x43c003f0, 0x00000660, 0x00000000, 0x005f8800, 0x07cc01b3,
-0x7ec09732, 0x4881f300, 0xc09f9007, 0x01f30174, 0x1f3006dc, 0xfb127cc0,
-0xf0074c05, 0x093ec09f, 0x07cd01f3, 0x0bc01f30, 0x00000e00, 0x00000000,
-0x00899815, 0x03844a21, 0x30400ab0, 0x840aeb02, 0x408eb007, 0x02e90078,
-0x0e115694, 0xe30a7840, 0xf0578404, 0x003ac0ae, 0x038400fb, 0x57400a10,
-0x00000620, 0x00000000, 0x02290000, 0x23040021, 0x30610410, 0x0410c100,
-0x450c1803, 0x18cd0633, 0x0c103284, 0xc1893041, 0xd023a45c, 0x0070440e,
-0x039400e9, 0x23400610, 0x00000400, 0x00000000, 0x24e72004, 0x15041801,
-0xc0401c18, 0x04200109, 0x4120901c, 0x25098083, 0x60110854, 0x0112c040,
-0x51402400, 0x00c04000, 0x031002c1, 0x1b000110, 0x00000c20, 0x00000000,
-0x44b5a015, 0x154c01d0, 0xb4c01d11, 0x4c00d104, 0xc02d304b, 0x81d30a77,
-0x2d310b4c, 0xd302f4c0, 0xd0036c02, 0x04f4540d, 0x03dd0ff9, 0x77400d34,
-0x00000620, 0x00000000, 0x80270001, 0x037d025f, 0x15c021f0, 0x7c04df00,
-0xc00d7203, 0x20d210b4, 0x2df2436c, 0xdf0037c8, 0xf00b5c02, 0x0137c00c,
-0x036c00cf, 0x87c007f8, 0x00000c00, 0x00000000, 0x80170080, 0x058c2183,
-0x28c70a30, 0x8e01eb00, 0xc20e3023, 0x20e30038, 0x2e32035c, 0xeb0078c8,
-0x3217cc19, 0x00b8c05f, 0x034c00fb, 0x04c01bf0, 0x00000c20, 0x00000000,
-0x00962081, 0x0d440097, 0xf442b110, 0x44031100, 0x4411100c, 0x42150444,
-0x11f04968, 0x1108c6c0, 0x10005423, 0x0046c021, 0x034480db, 0x04c021d2,
-0x00000802, 0x00000000, 0x0014a001, 0x194508d9, 0xb4402510, 0x44041101,
-0x40411040, 0x08112204, 0x01100044, 0x11018441, 0x10401410, 0x10244001,
-0x834420d1, 0x0440add0, 0x00000200, 0x00000000, 0x00002010, 0x0304804d,
-0x10600010, 0x04400102, 0x40001040, 0x00011100, 0x00140004, 0x01210244,
-0x10001440, 0x80224000, 0x230408c9, 0x424008d0, 0x00000080, 0x00000000,
-0x0006b000, 0x014c00db, 0x24400132, 0x44001900, 0xc0013014, 0x08130b44,
-0x01101454, 0x1320c4c0, 0x34144480, 0x4024c280, 0x03cd00d3, 0x04e005f2,
-0x00000ac0, 0x00000000, 0x800fb805, 0x00fc00f7, 0x7fc003f0, 0xec00f701,
-0xc00fd203, 0x85ff037f, 0x0ff00a7c, 0xff05f5c0, 0xf00bec00, 0x001fc05f,
-0x17fc45ff, 0x15c003f1, 0x00000e60, 0x00000000, 0x040f9003, 0x10fc0433,
-0x0fc00ff0, 0xc400f300, 0xc00f3003, 0x00f30036, 0x0b3003cc, 0xfb003cc0,
-0xb003cc00, 0x003fc00f, 0x23cc0873, 0x0cc14371, 0x00000e00, 0x00000000,
-0x00870001, 0x08740811, 0xb0484fd8, 0x4d009f02, 0x4001b400, 0x00110004,
-0x01140044, 0x11400440, 0x10004500, 0x24074001, 0x83c44491, 0x04492110,
-0x00000c20, 0x00000000, 0x0523a011, 0x20340001, 0x15410cd0, 0x26004120,
-0x40009000, 0x00014000, 0x00d00006, 0x01800258, 0x10002400, 0x01034000,
-0x13240089, 0x45404c10, 0x00000e80, 0x00000000, 0x0025a803, 0x01740051,
-0x34400dd2, 0x2410c502, 0x40811060, 0x08110000, 0x01d0a806, 0x09000141,
-0x10086408, 0x22074001, 0x03640099, 0x0c400d14, 0x00000620, 0x00000000,
-0x0047a802, 0x007c4113, 0x81c00dd0, 0x4c83d100, 0xd0319108, 0x13130206,
-0x31f1084d, 0x1b0086c0, 0xb4286c04, 0x4107c0f1, 0x036d0019, 0x09c3b130,
-0x00000e20, 0x00000000, 0x08cd8007, 0x0efc04ff, 0x1f880ef2, 0xdc09bf00,
-0x800ed207, 0x61ee007f, 0x8b3007f8, 0xf7023ec0, 0xf0039c01, 0x007bc01f,
-0x035c84e7, 0x1fc012b2, 0x00000600, 0x00000000, 0x00310802, 0x077c8097,
-0x97208d32, 0x6c025700, 0xc00d302b, 0x60d302b7, 0x69301b7c, 0xd900b5c0,
-0x70035c08, 0x2234c0ad, 0x037c00de, 0x08c02f30, 0x00000420, 0x00000000,
-0x02b4a013, 0x03740add, 0x1f601f14, 0x6d02d100, 0x405d1487, 0x05d12077,
-0x0915177e, 0xd1017440, 0x14174501, 0x0076d01d, 0x03f480dd, 0x4c41ad14,
-0x00000200, 0x00000000, 0x0012a007, 0x00240009, 0xd3410c10, 0x04470111,
-0x4070581c, 0x070101c3, 0x35820c34, 0x0181c044, 0x101c0407, 0x01c24070,
-0x0374000d, 0x1c403090, 0x00000a00, 0x00000000, 0x20788004, 0x05b4012d,
-0x7b405e10, 0xb411e144, 0x401e5007, 0x01e1007b, 0x1c900794, 0xe1287041,
-0x10078401, 0x007a401e, 0x37b401ed, 0x10401290, 0x00000200, 0x00000000,
-0x00100012, 0x206c0047, 0x13400c39, 0x4c0cd710, 0xc0ac7023, 0x00c30377,
-0x0cb12370, 0xd34231d0, 0x70335c08, 0x0232c0cd, 0x133c00cf, 0x48d001b0,
-0x00000040, 0x00000000, 0x003da802, 0x01fc007f, 0x3fe04ff0, 0xcc08ff00,
-0xc00fb023, 0x00dfc037, 0x8f7003fc, 0xf7003fc0, 0xf023fc00, 0x023dc08f,
-0x13fc01fd, 0x0bc00370, 0x00000660, 0x00000000, 0x0007a015, 0x917c045f,
-0x30c1adf0, 0x7c801342, 0xc001e000, 0x401f0007, 0x0572007c, 0x170007c2,
-0xf0007c00, 0x0007c001, 0x1b4c001f, 0x57c00f30, 0x00000e00, 0x00000000,
-0x00298812, 0xa3b408ed, 0x78680ed0, 0xb400e100, 0x480e7203, 0x00ed103b,
-0x0ed003bc, 0xed203b40, 0xd203b400, 0x203bc00e, 0x4bac00ed, 0x4b400e10,
-0x00000620, 0x00000000, 0x00d90003, 0x07b681ed, 0x7c401ed3, 0xb401e900,
-0x411ed007, 0x21ed207b, 0x1ed007b4, 0xe5047b40, 0xd007b401, 0x007b403e,
-0x170411ed, 0x0f411e94, 0x00000400, 0x00000000, 0x00772812, 0x1b3400dd,
-0xb0440cd0, 0xb400e900, 0x400e500b, 0x12fd013b, 0x0ed10794, 0xed01bb44,
-0xd00fb400, 0x08b9404e, 0x032421fd, 0x4b422c90, 0x00000c20, 0x00000000,
-0x201da817, 0x117c265d, 0x9cd805d0, 0x7c005b00, 0xc015f041, 0x045f1417,
-0x25700170, 0x570857c0, 0xf0617418, 0x01d76625, 0x014cc17f, 0x5fc417b2,
-0x00000620, 0x00000000, 0x00070012, 0x807c121f, 0x87c020f2, 0xbc003700,
-0xc843f210, 0x003f000f, 0x43f030fc, 0x3f200fc6, 0xf000fc00, 0x098fe003,
-0x007c003f, 0x4bc12172, 0x00000c00, 0x00000000, 0x00270810, 0x036c05d3,
-0x60f049f0, 0x4c808b44, 0xc0093002, 0x00930060, 0x08b0020c, 0x830020c4,
-0xf3024c00, 0x1026c808, 0x825c009f, 0x43c00931, 0x00000c20, 0x00000000,
-0x42a62001, 0x02450791, 0x246829d0, 0x44009106, 0x44091002, 0x40911024,
-0x0910025d, 0x91102440, 0xd0024400, 0x10a54009, 0x0254009d, 0x07412910,
-0x00000800, 0x00000000, 0x0434a018, 0x02440091, 0x340709d0, 0xc4009980,
-0x500a1802, 0x00b0023c, 0x0b1002e4, 0xb1803c40, 0xd002c400, 0x102c400b,
-0x021400bd, 0x63420918, 0x00000200, 0x00000000, 0x12202010, 0x23040881,
-0xa04088d0, 0x8402a101, 0x402a140a, 0x02a150a8, 0x2a140aa4, 0xa100a858,
-0xd00a8502, 0x08a8502a, 0x120400ad, 0x43408818, 0x00000080, 0x00000000,
-0xa586b01d, 0x584c1613, 0x444020f0, 0x4d001b00, 0xc8013100, 0x40132004,
-0x0132006e, 0x534004c0, 0xf0004c80, 0x0016c401, 0x2c5c8a2f, 0x77c16132,
-0x00000ac0, 0x00000000, 0x012fb819, 0x127c049f, 0x2fc069f0, 0x7c029f22,
-0xc029f00a, 0x029f00a7, 0x2d700a5e, 0x9f80a7c0, 0xf08a7c02, 0x00a7e429,
-0x267c039f, 0x67c04bf4, 0x00000e60, 0x00000000, 0x012fa018, 0x32fc06bf,
-0xa4c429c0, 0x7c049f04, 0xc0093022, 0x009b0027, 0x29f00a6c, 0x9f0227c0,
-0x30027c02, 0x05a4c029, 0x5a7c009f, 0x63c00bb5, 0x00000e00, 0x00000000,
-0x0503081c, 0x08344657, 0x84aa61d0, 0x74001d00, 0x404112a8, 0x041d2107,
-0x00d0804e, 0x17128740, 0x10107400, 0x11ccc001, 0x8864141d, 0x73404110,
-0x00000c20, 0x00000000, 0x0323a010, 0x1a34028d, 0x284888d0, 0xb016ad20,
-0x452a9412, 0x12ad04ab, 0x2ad00ab4, 0xad012b40, 0x544ab402, 0x002a402a,
-0x1234028d, 0x43413890, 0x00000e80, 0x00000000, 0x0025a818, 0x42740895,
-0x264809d1, 0xe486bd08, 0x40af910a, 0x30bd0c2f, 0x0bd002f4, 0xb50c2e00,
-0x5002b400, 0x002e522a, 0x0274069d, 0x63400910, 0x00000620, 0x00000000,
-0x04a78805, 0x0a7c029f, 0x245009f2, 0x7c419f28, 0xc2099026, 0x039b00e7,
-0x19d04676, 0x9f00e784, 0x706e7c0e, 0x26e6c099, 0x027c009f, 0x174219b0,
-0x00000e20, 0x00000000, 0x01658014, 0x927c0097, 0x25cc0cf0, 0x3c019f01,
-0xc0197206, 0x089e3227, 0x89f01248, 0x9f2227c8, 0xb0067800, 0x2065c019,
-0x026c009f, 0x53c159f0, 0x00000600, 0x00000000, 0x01850814, 0x0c7c1013,
-0x0fc20134, 0xcc023f20, 0xc423f108, 0x4037000d, 0x033000ec, 0x37000dc0,
-0x3008cc00, 0x008cc023, 0x000c0013, 0x52c00131, 0x00000420, 0x00000000,
-0x00dca014, 0x91f40371, 0x17e01510, 0x44805d00, 0x4005d001, 0x00510014,
-0x0510095c, 0x5d101550, 0x10015400, 0x08154405, 0x01440055, 0x50501714,
-0x00000200, 0x00000000, 0x80f2a014, 0x073403c1, 0x33440c90, 0x0620cd00,
-0x480c9803, 0x24c90030, 0x0c101b04, 0xcd003062, 0x10030400, 0x0030600c,
-0x030400c0, 0x50401c10, 0x00000a00, 0x00000000, 0x80d88005, 0x06b41061,
-0x09410e10, 0x86012d00, 0x4012d000, 0x01210048, 0x121284a4, 0x2d100860,
-0x10009401, 0x01480002, 0x23040de1, 0x14411e10, 0x00000200, 0x00000000,
-0x40681015, 0x85bc81e3, 0x4b401e30, 0x8d01cf00, 0xd01cb187, 0x01c74061,
-0x1e34070d, 0x470078c0, 0x34070d01, 0x40d0d01c, 0x878d0dc3, 0x54c01c32,
-0x00000040, 0x00000000, 0x1005b810, 0x007c00df, 0x37c501e1, 0x7c201f00,
-0xc401d800, 0x001f1017, 0x01f0005c, 0x9f0007c0, 0xb0006c00, 0x0067c001,
-0x0b7c04df, 0x41c007f0, 0x00000660, 0x00000000, 0x007fa000, 0xa7cc29ff,
-0x7fc49ff8, 0xfc81f362, 0xc21ff087, 0x697f827e, 0x1ff005dc, 0xf3007ec0,
-0xf007fc01, 0x013fc01f, 0x0fcc01f3, 0x00c01330, 0x00000e00, 0x00000000,
-0x00398815, 0x32ac006d, 0x0f428e70, 0xb4002b00, 0x4803d080, 0x0cad1308,
-0x02d02286, 0x21048f40, 0xf000b400, 0x040fc102, 0x039400f1, 0x54400610,
-0x00000620, 0x00000000, 0x00190000, 0x01a4800d, 0x0b400ed0, 0xb400e108,
-0x400ed063, 0x606d2429, 0x0ed00184, 0x61003b41, 0xd003b418, 0x005b400e,
-0x238400e1, 0x00400a10, 0x00000400, 0x00000000, 0x00932804, 0xb804040d,
-0xb7420050, 0x300b094a, 0x52a0d00c, 0x088d01d0, 0x30d08a04, 0x8140c244,
-0x506c3401, 0x00e54030, 0x031426c1, 0x10400411, 0x00000c20, 0x00000000,
-0x0035a815, 0x0f65049e, 0x77c205f0, 0x70401320, 0xc231d004, 0x0b9f2096,
-0x21f00244, 0x93008780, 0xd2047c83, 0x40ef40a1, 0x03cc06f3, 0x54d00d34,
-0x00000620, 0x00000000, 0x0c170001, 0x033c001f, 0x07c20570, 0x7c42d708,
-0xc00df04b, 0x405f00a7, 0x6df0e169, 0x5f0137c0, 0xf0037010, 0x0417c02d,
-0x033c00df, 0x07c00bf3, 0x00000c00, 0x00000000, 0x006b0880, 0x13dc05f3,
-0x0fc00731, 0xec303304, 0xc323f208, 0x02bf000f, 0x23f006fc, 0x3f004fc0,
-0xf088fc02, 0x004fc023, 0x035c00f3, 0x03c00f70, 0x00000c22, 0x00000000,
-0x10062081, 0x134401d1, 0x3744b151, 0x7400d740, 0x401dd007, 0x01590037,
-0x3dd02574, 0xdd02f6e0, 0x920f7401, 0x027f421d, 0x037c00d5, 0x07420150,
-0x00000802, 0x00000000, 0x02248001, 0x00548081, 0x37482190, 0x74181900,
-0x4001d040, 0x001d0417, 0x21d00064, 0x9d000740, 0xd0887400, 0x28274101,
-0x034400c9, 0x07421150, 0x00000200, 0x00000000, 0x40202010, 0x00040001,
-0x03440011, 0x2600c100, 0x440c9103, 0x00c92823, 0x0cd20334, 0x4d183144,
-0x90033400, 0x0013400c, 0x032000cd, 0x43400010, 0x00000080, 0x00000000,
-0x0006b000, 0x005c2013, 0x07c00134, 0x74001b40, 0xc001f000, 0x000f0287,
-0x01f1007c, 0x1f000740, 0xf0007800, 0x0007c001, 0x03dc00fb, 0x03c00870,
-0x00000ac0, 0x00000000, 0x000fb805, 0x00fc403f, 0x3fc003f0, 0xfc00ff00,
-0xc00ff203, 0x00fb007f, 0x0ff003fc, 0xff003ec0, 0xf203fc00, 0x003fc00f,
-0x03fc00f7, 0x17c003f0, 0x00000e60, 0x00000000, 0x203fa003, 0x03fc00f1,
-0x3ec80fb2, 0xdc00dd00, 0x880ff203, 0x80dd0035, 0x0ff203f8, 0xff203f40,
-0x9001fc80, 0x001cc04b, 0x00cc003f, 0x0cc007b4, 0x00000e00, 0x00000000,
-0x00050801, 0x00740017, 0x07400170, 0x76801d00, 0x00019000, 0x001c0007,
-0x01d10074, 0x0d200740, 0x10017454, 0x801442e9, 0x137d00dd, 0x04510510,
-0x00000c20, 0x00000000, 0x00332011, 0x0714008d, 0x73481c50, 0x2601cd20,
-0x481c9007, 0x41cd1071, 0x1cd00134, 0xcd207148, 0x50003601, 0x00115908,
-0x4014800d, 0x445684d0, 0x00000e80, 0x00000000, 0x0805a807, 0x8074005d,
-0x07420152, 0x70001d00, 0x4001d000, 0x201d0807, 0x01d00674, 0x1d200740,
-0x10817400, 0x00154019, 0x835440dd, 0x0c4005d0, 0x00000620, 0x00000000,
-0x00a7a802, 0x027c005b, 0x26c009f0, 0x7e009f00, 0xc009d002, 0x009f0025,
-0x09f0037c, 0x9f0025c2, 0x308d7c20, 0x183dc119, 0x00d4003d, 0x08c425f0,
-0x00000e20, 0x00000000, 0x201d8003, 0x01fc80b3, 0x1fc007f0, 0xfc007f04,
-0xc807b001, 0x007f841f, 0x07f000fc, 0x7f001fc0, 0xf4156000, 0x003ec008,
-0x03bc00ef, 0x1fc00630, 0x00000600, 0x00000000, 0x80250802, 0x425c101f,
-0x27c28970, 0x7c049f00, 0xc009b002, 0x009f0025, 0x09f0017c, 0x9b8427c0,
-0xf0014d00, 0x0134c04d, 0x005c001f, 0x08c10374, 0x00000420, 0x00000000,
-0x00948013, 0x197412dd, 0x1640a570, 0x74045d01, 0x4005f105, 0x015d1097,
-0xa5d02e74, 0x5d04d740, 0xb003442a, 0x00f4553d, 0x836c40dd, 0x4c413530,
-0x00000200, 0x00000000, 0x0412a007, 0x093403c9, 0x13402450, 0x34004d80,
-0x4044d035, 0x0d4d0013, 0x24988224, 0x4d009340, 0x10016400, 0x1291480c,
-0x0014200d, 0x1c500450, 0x00000a00, 0x00000000, 0x02688004, 0x06b4012d,
-0x6a401a50, 0xb401ad00, 0x411ad006, 0x01ad006b, 0x9ad065b4, 0xad106b01,
-0x9005a401, 0x025a601e, 0x072409cd, 0x10409411, 0x00000200, 0x00000000,
-0x04101012, 0x011c008d, 0x13c00470, 0x3c014f10, 0xc004b011, 0x094d0751,
-0x04b0143c, 0x49001340, 0x30192c20, 0x0210c484, 0x001c080f, 0x48c02470,
-0x00000040, 0x00000000, 0x282cb802, 0x02fc007f, 0x2e400bf8, 0x7c08bf00,
-0xc00b7002, 0x089f0027, 0x0be103fc, 0xbf1027c2, 0xf001dc09, 0x8a1dc08d,
-0x037c08df, 0x0bc00770, 0x00000660, 0x00000000, 0x4007a815, 0x007c8053,
-0x44d00124, 0x4d001340, 0x9001f200, 0x801f0004, 0x0124066c, 0x1f0004d0,
-0xb0017c00, 0x0037c001, 0x044d0011, 0x54c00570, 0x00000e00, 0x00000000,
-0x003d9812, 0x03de00a3, 0x3c400f38, 0x8400fb00, 0xc00fd003, 0x80ed0038,
-0x0f1001f6, 0xed203840, 0x1003b400, 0x503b4802, 0x038400c1, 0x484806d0,
-0x00000620, 0x00000000, 0x00490003, 0x04b4412d, 0x4b4012d0, 0xb4012900,
-0x44121004, 0x012d0049, 0x129004b4, 0x25804848, 0x9805f481, 0x807b401e,
-0x00840121, 0x0d401850, 0x00000400, 0x00000000, 0x0a730012, 0x031402c1,
-0x30600c50, 0x1400c100, 0x400cd003, 0x00cd0031, 0x0c900334, 0xcd203040,
-0x10233400, 0x89b3400c, 0x034400c1, 0x495014d0, 0x00000c20, 0x00000000,
-0x0055a017, 0x01760253, 0x14c00570, 0x5c205900, 0xc0057001, 0x205f2815,
-0x05b00164, 0x7f0014c0, 0xb009bc20, 0x0097ec17, 0x014c0053, 0x5dc07770,
-0x00000620, 0x00000000, 0x008b0012, 0x00dc1037, 0x8fc02332, 0xe0003f00,
-0xc002f008, 0x022e200c, 0x037200fc, 0x3f900fc8, 0xf0047c00, 0x0003e081,
-0x00fc003f, 0x4ac101f2, 0x00000c00, 0x00000000, 0x00270010, 0x022c0083,
-0x64c00830, 0x0c018f00, 0xc0197082, 0x009f0026, 0x08f02648, 0x9b0024c0,
-0x70827c85, 0x2025c928, 0x024c0493, 0x40c018f0, 0x00000c20, 0x00000000,
-0x50a60005, 0x025d0091, 0x66d52914, 0x45009d02, 0x5009144a, 0x029d0024,
-0x29d00245, 0x9c10a450, 0x10827401, 0x01678109, 0x02540081, 0x04101914,
-0x00000800, 0x00000000, 0x0034a01c, 0x02c400b1, 0x2d400b10, 0xc408bd00,
-0x408b9002, 0x10bd002c, 0x0bda02c4, 0xbd00ac42, 0x50027420, 0x02264409,
-0x02c410b0, 0x60408910, 0x00000200, 0x00000000, 0x00b80010, 0x0aa402a1,
-0xab402a18, 0x8482ad28, 0x422a500a, 0x02ad20a8, 0x2ad80a94, 0xad90a840,
-0x125a7408, 0x112341c8, 0x329404a1, 0x40509810, 0x00000080, 0x00000000,
-0x00063019, 0x004c2013, 0x15c00130, 0x4c001f00, 0xc0017000, 0x401f0006,
-0x05f00042, 0x3b0004c0, 0x70107c02, 0x4045c061, 0x0ccc0113, 0x74d16170,
-0x00000ac0, 0x00000000, 0x00a7b819, 0x0a5c029f, 0xa4c029f0, 0x7c029f00,
-0xc029300a, 0x029f00a7, 0x29f08a6c, 0x9f00a7c0, 0xf202bc06, 0x2221c04f,
-0x327c089f, 0x67c04b70, 0x00000e60, 0x00000000, 0x04a7a818, 0x034c049b,
-0xb5c14df0, 0x5404d324, 0x408df213, 0x20d32434, 0x0d30426c, 0xf32437c0,
-0x301a4412, 0x016cc00b, 0x260c01b9, 0x63c06b30, 0x00000e00, 0x00000000,
-0x41871818, 0x384c0615, 0x076061d0, 0x74021140, 0x50a11008, 0x0a114084,
-0xa1b41845, 0x15008f44, 0x50284526, 0x02844861, 0x086c4211, 0x71ca6010,
-0x00000c20, 0x00000000, 0x802ba010, 0x428512a5, 0x29490ad0, 0x8412a110,
-0x644a144a, 0x54a12d28, 0x4a924294, 0x8d052b61, 0x10120404, 0x08214928,
-0x1a040289, 0x4340c858, 0x00000e80, 0x00000000, 0x0025a018, 0x02c600fd,
-0x2f600bd2, 0xf680f100, 0x600f1a02, 0x00b1802c, 0x0b1003d4, 0xdd002f48,
-0x54024400, 0x00254019, 0x02640091, 0x61402950, 0x00000620, 0x00000000,
-0x00278005, 0x024e0893, 0x25c009f0, 0x5c409100, 0x40095002, 0x00931024,
-0x09901a4c, 0x9f1027c0, 0x34424c00, 0x00255038, 0x024c009b, 0x17c8197c,
-0x00000e20, 0x00000000, 0x00218010, 0x027c8093, 0x23e209f0, 0x7c409f00,
-0xe4087002, 0x008f0823, 0x09f0020c, 0x836027ca, 0xf4227c00, 0x0026c009,
-0x027c009f, 0x53c059bc, 0x00000600, 0x00000000, 0x100d0014, 0x00dc0837,
-0x0fcc03f0, 0xfe003f08, 0x8003e000, 0x8037080f, 0x03f200cc, 0x132a0fc8,
-0x30007c00, 0x0241c021, 0x001c101f, 0x50c18130, 0x00000420, 0x00000000,
-0x0014a014, 0x017c005d, 0x15c115d1, 0x74005d00, 0x4005d101, 0x80511017,
-0x05d00144, 0x71405dc0, 0xb0817420, 0x009c4027, 0x01d4836d, 0x50503715,
-0x00000200, 0x00000000, 0x80328014, 0x4b3401dd, 0x32400cd0, 0x7480cd88,
-0x400c9103, 0x00c9d4b1, 0x0cd80311, 0xc5003720, 0x90037400, 0x087060fc,
-0x031508cd, 0x50401cd0, 0x00000a00, 0x00000000, 0x08088005, 0x08b4002d,
-0x0b400290, 0xb4002d00, 0x40029200, 0x8029200a, 0x02d00094, 0xec200100,
-0x9033b400, 0x0838104c, 0x139400cd, 0x14481e98, 0x00000200, 0x00000000,
-0x00581015, 0x879c81ef, 0x4bc416f0, 0xb401af00, 0xc01af085, 0x0179007f,
-0x16f3068c, 0xe7005bc0, 0xb017fc21, 0x0079c43a, 0x0f9c012f, 0x44c612b0,
-0x00000040, 0x00000000, 0x9024b810, 0x005c401f, 0x35c009f0, 0x7c005f20,
-0xc005f102, 0x80930807, 0x09f20164, 0xd3002780, 0x74837c00, 0x0035c01d,
-0x036c001f, 0x43c00373, 0x00000660, 0x00000000, 0x013fa000, 0x24ce49bf,
-0x7cc01b30, 0xfc89f300, 0x409f2027, 0x01fb225f, 0x1d3027f8, 0xff206dc0,
-0x3007c801, 0x0a7cca9f, 0x0fcc817f, 0x00c09f20, 0x00000e00, 0x00000000,
-0x02098815, 0x238c0867, 0x08040670, 0x84082100, 0xc28270b4, 0x102b146b,
-0x5230a00c, 0xe1061840, 0xb043ec00, 0x021ac0ce, 0x2384906d, 0x5440ce10,
-0x00000600, 0x00000000, 0x02190000, 0x0004808d, 0x03400051, 0x04488100,
-0x400adb21, 0x08611113, 0x44922234, 0xc1004260, 0x91838408, 0x8038460a,
-0x038400cd, 0x01402210, 0x00000420, 0x00000000, 0x00a30804, 0x0b050a4d,
-0xb2502c54, 0x05624148, 0x0024142a, 0x238140e1, 0x28140904, 0xd550b350,
-0x10034511, 0x0032512d, 0x070405cd, 0x00420114, 0x00000c20, 0x00000000,
-0x03e58815, 0x3f4e0a5f, 0xf6c0fd00, 0x4c0f5303, 0x44f5902a, 0x819122e7,
-0xf9823d7c, 0xdf02f7c0, 0x8c03c404, 0x0034c00f, 0x1bc403dd, 0x45400d34,
-0x00000620, 0x00000000, 0x10170001, 0x005c0297, 0x05c00130, 0x7c029f08,
-0xc029e081, 0x105f0017, 0x05700a70, 0x530004c0, 0xf0037c00, 0x00b5c00d,
-0x137c82df, 0x07c817f0, 0x00000c00, 0x00000000, 0x008f0880, 0x03cc4073,
-0x0fc00730, 0xce003300, 0xc003f200, 0x833b00ec, 0x033000cc, 0xb3801cca,
-0x2443cc02, 0x007d0219, 0x03fc00bf, 0x00c00d30, 0x00000c22, 0x00000000,
-0x00362081, 0x007c0291, 0x35400970, 0x4602d100, 0x422d3003, 0x01d10055,
-0x0d100b44, 0x119025c2, 0x10035c00, 0x00a440cd, 0x0334129d, 0x15400110,
-0x00000802, 0x00000000, 0x0020a001, 0x80040009, 0x30400810, 0x04004100,
-0x40041222, 0x00858000, 0x88100134, 0xd5082240, 0x50034420, 0x06354009,
-0x037400d9, 0x04401d10, 0x00000200, 0x00000000, 0x00102010, 0x032480c9,
-0x00400490, 0x04408100, 0x44085081, 0x00450330, 0x44110215, 0x40201008,
-0x58030480, 0x00316804, 0x033000c9, 0x51401c10, 0x00000080, 0x00000000,
-0x4006b000, 0x004d0019, 0x05d00134, 0x450a1340, 0x50017404, 0x02174044,
-0x1134004c, 0x924004d0, 0x70034d00, 0x0035c00d, 0x03be40db, 0x00c00130,
-0x00000a80, 0x00000000, 0x203fb805, 0x03dc00f7, 0x3fc00f70, 0x7c81ff00,
-0xc20f3023, 0x95fb2277, 0x8ff957ec, 0x37003dc8, 0xb803dc80, 0x003ec00f,
-0x03fc00ff, 0x17c003f0, 0x00000e20, 0x00000000, 0x823fa003, 0x20ec002f,
-0x3bc08fd2, 0xf000ff00, 0xc20ff203, 0x80f9003f, 0x0fc0038c, 0xf7003fc0,
-0xf023fc00, 0x003fc00f, 0x13cc00e3, 0x0cc54b90, 0x00000e00, 0x00000000,
-0x90b30801, 0x10440017, 0x074041d0, 0x74001308, 0x4001d000, 0x80113007,
-0x01d10074, 0x17200740, 0xd0107440, 0x40374001, 0x2bd444f1, 0x054069b0,
-0x00000c20, 0x00000000, 0x0233a011, 0x1026214d, 0x314040d0, 0x3600cd00,
-0x400cd003, 0x00c91031, 0x0cd00316, 0x4d803340, 0xd0033600, 0x0032400c,
-0x030410c1, 0x44410890, 0x00000e80, 0x00000000, 0x0035a803, 0x0044011d,
-0x07400dd0, 0x64001500, 0x4001d000, 0x00110007, 0x01d90874, 0x9d800640,
-0xd0006600, 0x00374001, 0x035400d1, 0x0d400990, 0x00000620, 0x00000000,
-0x0837a802, 0x446c808d, 0x27c00df0, 0x7c001f01, 0xc009f001, 0xa09b0021,
-0x49f00a5c, 0x9f0007c0, 0xd0127c00, 0x0037c049, 0x034c40d3, 0x08c089a1,
-0x00000e20, 0x00000000, 0x043d8007, 0x25fc00b5, 0x1fc003e0, 0xfc00f300,
-0xc207f00a, 0x407f141f, 0x07f001fc, 0x76003fc0, 0xf001f800, 0x003fc007,
-0x03fc20ff, 0x1ec00bf1, 0x00000600, 0x00000000, 0x00350802, 0x0a4c805b,
-0x27c011f0, 0x7c101700, 0xc009f001, 0x00971026, 0x0930425c, 0x1b0307c0,
-0xf0025c00, 0x0837c609, 0x034c40df, 0x0bc019f1, 0x00000420, 0x00000000,
-0x003ca013, 0x07441011, 0x17400dd0, 0x7012d100, 0x4205d006, 0x035d1897,
-0x05b01974, 0xd810f740, 0xd0017400, 0x007f4405, 0x03c420fd, 0x4f400992,
-0x00000200, 0x00000000, 0x0032a007, 0x03050101, 0x13400c90, 0x3403c504,
-0x4004d006, 0x0c450213, 0x04900934, 0xc800f360, 0xd0011400, 0x84344004,
-0x034481dd, 0x1f400958, 0x00000a00, 0x00000000, 0x24788004, 0x56840131,
-0x6b4012d1, 0xb4012188, 0x401ad045, 0x01ad016b, 0x9a9006b4, 0x29104b44,
-0xd006b421, 0x047b401a, 0x030401ed, 0x13403a18, 0x00000200, 0x00000000,
-0x00301012, 0x030cc003, 0x13c080b8, 0x3c00c500, 0xc044f002, 0x84470013,
-0x04b1213e, 0x4b1033e8, 0xf0011c00, 0x1033a804, 0x230c10cf, 0x4bc008f1,
-0x00000040, 0x00000000, 0x043db802, 0x92d00877, 0x2fc20ff0, 0xfc003f00,
-0xe80bf201, 0x00bf012f, 0x0974027c, 0xbf000fc2, 0xf002fc00, 0x203ec01b,
-0x13fc80ff, 0x0bc00bf0, 0x00000660, 0x00000000, 0x3077a015, 0x054e001b,
-0x05c00db0, 0x7c011f00, 0xc0017000, 0x00130047, 0x00f0005c, 0x931004c4,
-0x31007c00, 0x3274c001, 0x1b7e44d3, 0x54c01bf0, 0x00000e00, 0x00000000,
-0x21798812, 0x01840020, 0x39c00210, 0xb420ed00, 0xc00eb003, 0x00eb0033,
-0x0ed0038c, 0x6b003940, 0xb0033600, 0x103ec00c, 0x33b4aaeb, 0x4ac00af0,
-0x00000620, 0x00000000, 0x08710003, 0x878601b8, 0xc9401210, 0x34002500,
-0x40321004, 0xc12510cb, 0x32d904b4, 0x2580c840, 0x100cb403, 0x017a4032,
-0x279485ed, 0x0c401cd1, 0x00000400, 0x00000000, 0x00332812, 0x0b0404c1,
-0x31000c10, 0x3401cd00, 0x400cd01b, 0x01cd0033, 0x0cd00704, 0xd981b140,
-0x90037400, 0x0032420c, 0x033600cd, 0x4a5008d0, 0x00000c20, 0x00000000,
-0x0015a817, 0x15cd007b, 0x55c005b4, 0x34035f10, 0xc0153009, 0x05570057,
-0x14f0415c, 0x5700d0c0, 0x30057c01, 0x0014c017, 0x017c005f, 0x5cc005f0,
-0x00000620, 0x00000000, 0x00870012, 0x187c021f, 0x8fc003f0, 0xf8183f00,
-0xc0039208, 0x0039000d, 0x03f000dc, 0x3e200fc0, 0xf000fc00, 0x0087c003,
-0x007c021a, 0x49c00170, 0x00000c00, 0x00000000, 0x00270810, 0x166c039f,
-0x67c059f0, 0x4c009f80, 0xc809b006, 0x208f0067, 0x99f0064c, 0x9f0064c0,
-0x30027c00, 0x00e4c009, 0x027c009f, 0x43c00934, 0x00000c20, 0x00000000,
-0x01262001, 0x0e443299, 0xe74a09d0, 0x44809d06, 0x40a9300e, 0x419d2027,
-0x19700e54, 0x95102548, 0x51025400, 0x20654009, 0x0274009d, 0x07400951,
-0x00000800, 0x00000000, 0x1024a018, 0x0a64008d, 0x2e4009d0, 0xc400a900,
-0x430f9022, 0x04fd023f, 0x0bd052c4, 0xb1292c40, 0x1012c400, 0x0024400a,
-0x0234009d, 0x63400990, 0x00000200, 0x00000000, 0x07202210, 0x2204088d,
-0x2a408ad0, 0x8428ad00, 0x620a1083, 0x00ad082b, 0x0a500294, 0xa5002940,
-0x50029402, 0x0021402a, 0x1234088d, 0x434088d0, 0x00000080, 0x00000000,
-0x1186b01d, 0x582c021d, 0x07c021f1, 0x4c021d00, 0xc001b000, 0x001f0007,
-0x01f2004c, 0x1f0004c0, 0x30005c00, 0x0514c803, 0x2c7c025f, 0x77c161b0,
-0x00000ac0, 0x00000000, 0x2127b819, 0x12fc04ab, 0xa7c069f0, 0x7c069f00,
-0xc029f00a, 0x028d00a7, 0x29700a74, 0x9f00a3c0, 0xf05a7c02, 0x0527c029,
-0x267e269f, 0x67c04b70, 0x00000e60, 0x00000000, 0x01ada018, 0x326c02a3,
-0x2cc44bf0, 0xc410b300, 0xc14b3002, 0x34bf052c, 0x0b3002cc, 0x93002bc0,
-0x3062fcc2, 0x04afe049, 0x224c02bf, 0x63c14f30, 0x00000e00, 0x00000000,
-0x0007081c, 0x30440411, 0x06c301d0, 0x6c061b00, 0xc021b028, 0x021d1086,
-0x01b2806c, 0x1b0a8740, 0xb0907c24, 0x0085c0e1, 0x1844041d, 0x73406114,
-0x00000c20, 0x00000000, 0x02332010, 0x12040481, 0xa34868d0, 0x04508020,
-0x40081002, 0x808d0020, 0x28590a04, 0x8d202340, 0x18122646, 0x00234108,
-0x0a240685, 0x43410810, 0x00000e80, 0x00000000, 0x8025a818, 0x02440091,
-0x264009d2, 0x64809920, 0x48098003, 0x009d0826, 0x09900264, 0x9d002740,
-0x90825402, 0x00254009, 0x022620dd, 0x63420910, 0x00000620, 0x00000000,
-0x40278805, 0x124c1193, 0x2744e9e0, 0x4c009300, 0xc4092202, 0xa09f1024,
-0x09700244, 0x970027c0, 0x30026420, 0x20274009, 0x026d009f, 0x17c01930,
-0x00000e20, 0x00000000, 0x04218014, 0x035c089f, 0x274009f0, 0x7c009f10,
-0xc009d002, 0x409d0027, 0x09e0027c, 0x9b0027c0, 0xf0023c20, 0x0027c009,
-0x025c008f, 0x53c039f0, 0x00000600, 0x00000000, 0x00040814, 0x284c001f,
-0x01c80030, 0x3c000281, 0xc000f080, 0x100f2044, 0x01f02030, 0x170041c0,
-0x30007c00, 0x0007c001, 0x004c041f, 0x53c01130, 0x00000420, 0x00000000,
-0x089ca014, 0x2d55007d, 0xdce41511, 0xf4107594, 0x42a7d009, 0x607d909d,
-0x157001f4, 0x51109d45, 0xb0015480, 0x0a1dc205, 0x01540079, 0x53400750,
-0x00000200, 0x00000000, 0x80b2a014, 0x0304125d, 0xf3441c58, 0x3440c110,
-0x603cd04b, 0x02cd0000, 0x1cd09334, 0xc8002040, 0x90030400, 0x00f3420c,
-0x032408cd, 0x53400c90, 0x00000a00, 0x00000000, 0x00388005, 0x0714033d,
-0x32402ed0, 0xb6002500, 0x610cd003, 0x00ed0019, 0x1e5003a0, 0xe9003940,
-0x90039401, 0x00ab400e, 0x33b400e9, 0x17402ed0, 0x00000200, 0x00000000,
-0x00781015, 0x058d08af, 0x7bc01f74, 0xbc01e100, 0xc016f007, 0x01ed0058,
-0x1cf007b4, 0xcf0039c0, 0xb006dc15, 0x006bc83e, 0x172c03ef, 0x57c01eb0,
-0x00000040, 0x00000000, 0x0015b810, 0x097c009f, 0x35c00d30, 0x7c001f10,
-0x4205f102, 0x009f1017, 0x0df0017c, 0xd70037c0, 0xf0025c06, 0x2024c14d,
-0x0b5c40cf, 0x43c00f70, 0x00000660, 0x00000000, 0x024fa000, 0x8fc901a3,
-0x7bc01fb0, 0xcc09bb80, 0xc69a7007, 0x09e30068, 0x1f3007bc, 0xff006fc0,
-0x3027d411, 0x027c429f, 0x2ffc05f3, 0x03c01730, 0x00000e00, 0x00000000,
-0x023d8815, 0x128412a1, 0x1b408a10, 0xac08318a, 0xc0cab023, 0x086b2a1a,
-0x0eb023ac, 0xef209b42, 0x1033ec00, 0x008ac80f, 0x33dc00ab, 0x5749aa10,
-0x00000620, 0x00000000, 0x88090000, 0x010408b1, 0x0b400e18, 0x8400a900,
-0x600ed001, 0x08e10038, 0x8e100296, 0xed023b40, 0x53028408, 0x083a440e,
-0x03b404e1, 0x03400618, 0x00000400, 0x00000000, 0x00132804, 0x00042081,
-0x43401810, 0x24010100, 0x401c1000, 0x01090052, 0x1c900c14, 0xc5005340,
-0x58062401, 0x002641ac, 0x03140089, 0x13080810, 0x00000c20, 0x00000000,
-0x4035a815, 0x134c0183, 0xb7483d30, 0x44435b04, 0xc031d048, 0x031300c4,
-0x3d300754, 0xfd00f7c0, 0x740e4c03, 0x0006c03f, 0x03fc00f3, 0x57801914,
-0x00000620, 0x00000000, 0x00270001, 0x0b7c029f, 0x37c0cd70, 0x7c0c1f09,
-0xc0e1f011, 0x0cdf0307, 0xcdf02a64, 0xdf03b700, 0xa0327c0c, 0x0027c00d,
-0x035c02cf, 0x07c807f0, 0x00000c00, 0x00000000, 0x013f0880, 0x04cc00bf,
-0x7cc00af1, 0xcc006f01, 0xc0037002, 0x00330108, 0x1e3147bc, 0xe310f8c0,
-0xf006cc80, 0x0024c00e, 0x038c00f1, 0x00c08b30, 0x00000c22, 0x00000000,
-0x00462081, 0x0c54009d, 0x354089d0, 0x5c001d00, 0x4130d006, 0x10950005,
-0x8d500064, 0xd500b540, 0xd02654a0, 0x08ed500d, 0x035402d5, 0x044025b0,
-0x00000802, 0x00000000, 0x1004a001, 0x51440895, 0x26400dd8, 0x44101d00,
-0x4041d990, 0x041100a4, 0x0d102974, 0xd5003440, 0xd0024400, 0x0054480d,
-0x034400d5, 0x04400010, 0x00000200, 0x00000000, 0x00202210, 0x8014009d,
-0x01400890, 0x34000908, 0x4000d801, 0x00450021, 0x0c508026, 0xc5003140,
-0x90021440, 0x4000400c, 0x03040081, 0x40500090, 0x00000080, 0x00000000,
-0x0006b000, 0x004c00b7, 0x06c009f0, 0x4c001f00, 0xc401fb80, 0x00130024,
-0x0930007c, 0xe50034c0, 0xf1024c00, 0x2034c00f, 0x03cd0057, 0x00c60130,
-0x00000ac0, 0x00000000, 0x080f9805, 0x00fc00bf, 0x0fc00bf0, 0x9c003f00,
-0xc003d000, 0x003f002f, 0x0bf003fc, 0xf7003fc0, 0xf002fc00, 0x002fc00f,
-0x03fc003f, 0x17c003f0, 0x00000e60, 0x00000000, 0x003fa003, 0x03cc00f3,
-0x37c00ff0, 0xfc00f700, 0xc02df003, 0x00fb20bf, 0x2df023ec, 0xff003fc0,
-0xe003b842, 0x023fc94f, 0x00ec10f3, 0x0cd08ff0, 0x00000e00, 0x00000000,
-0x04050801, 0x4044101b, 0x07400150, 0x74001120, 0x4000d000, 0x14150004,
-0x01d00044, 0x1d810744, 0x91004444, 0x213f4021, 0x0a4422d3, 0x0c4029d0,
-0x00000c20, 0x00000000, 0x01012011, 0x133404c1, 0x21400052, 0x1400c500,
-0x40485001, 0x00c10131, 0x4c120114, 0xcd051144, 0x50031404, 0x0131400c,
-0x0b2481c9, 0x4c40ccd1, 0x00000e80, 0x00000000, 0x0837a803, 0x00250009,
-0x17420d10, 0x74001100, 0x4005d002, 0x00058004, 0x01d08245, 0x1d002740,
-0xd0004060, 0x10374001, 0x036400d1, 0x0c4009d0, 0x00000620, 0x00000000,
-0x1836a882, 0x017c0051, 0x37c00df0, 0x78001401, 0xc005f003, 0x201b0123,
-0x01f0027c, 0x9d0827c0, 0xf0927c04, 0x4037e429, 0x016c01db, 0x08c808d2,
-0x00000e22, 0x00000000, 0x00018007, 0x0ecc83bf, 0x0fc001f0, 0x7c00ff00,
-0xc40af010, 0x00df081f, 0x0ff001ec, 0x6f101fc0, 0xb281fc00, 0x003fc805,
-0x03dc04ef, 0x1fc80db0, 0x00000600, 0x00000000, 0x00050802, 0x017c0053,
-0x24c041f0, 0x7c081700, 0xc0c1b001, 0x00130025, 0x0130004c, 0x9d4007c0,
-0x70027c00, 0x8033c029, 0x034c31db, 0x29c119d0, 0x00000420, 0x00000000,
-0x0234a013, 0x82640095, 0x15413d50, 0x7400d900, 0xc00d5006, 0x00db0416,
-0x0db40b54, 0x5702f660, 0x1001443a, 0x007c4077, 0x136c03db, 0x4d422dd1,
-0x00000200, 0x00000000, 0x0032a007, 0x42340089, 0x14603c10, 0x2400c904,
-0x402c1006, 0x00c90050, 0x0c501324, 0x41803340, 0x10010500, 0x06314044,
-0x94040005, 0x5f420cd0, 0x00000a00, 0x00000000, 0x02488004, 0x05240165,
-0x29401258, 0xb4012d11, 0x40125045, 0x4529022b, 0xd202a494, 0xa9254a40,
-0x10069401, 0x0278401a, 0x06a449ad, 0x37401ad1, 0x00000200, 0x00000000,
-0x00001012, 0x0234408b, 0x44c00052, 0x3c00c40b, 0xc0181000, 0x0dc30351,
-0x5c40014c, 0x578a5740, 0x70011c08, 0x02358224, 0x230c00d7, 0x4bc20cf0,
-0x00000040, 0x00000000, 0x083db802, 0x01fc0077, 0x3fc00f70, 0x7c001303,
-0xc4077003, 0x201f0122, 0x83f002dc, 0xb7002ec0, 0xf4024c00, 0x02bd401b,
-0x03fc00fb, 0x08c00bf0, 0x00000660, 0x00000000, 0x00752014, 0x005c0013,
-0x10c40c62, 0x74001100, 0xe005f006, 0x001d0007, 0x01908274, 0x1d002642,
-0x14004400, 0x2137c001, 0x016c4093, 0x54c009e0, 0x00000e00, 0x00000000,
-0x0009091a, 0x038400fb, 0x2ac002d0, 0xb420e100, 0x420a2081, 0x00ed003b,
-0x0e5001f4, 0xe9201840, 0x1003b400, 0x20bb601e, 0x038400bf, 0x4c500e91,
-0x00000624, 0x00000000, 0x00410000, 0x04b50121, 0x484002d0, 0xb4012900,
-0x40125084, 0x012d004b, 0x129004b4, 0x2d004840, 0x10048401, 0x817b4092,
-0x87a6a1e1, 0x064018d0, 0x00000400, 0x00000000, 0x08312812, 0x034480c9,
-0x30480cd0, 0x340dc180, 0x602c9883, 0x02dd8a73, 0xdc180334, 0xcd003050,
-0x10033480, 0xa033400c, 0x030680d5, 0x4a400cd1, 0x00000c20, 0x00000000,
-0x0015a837, 0x017c0052, 0x144005f0, 0x7c005b00, 0x40055001, 0x045d0017,
-0x05b01174, 0x5d0116c0, 0x00114804, 0x001b2045, 0x45ec0271, 0x5e4107d0,
-0x00000620, 0x00000000, 0x108f0012, 0x00fc022f, 0x0fc002f0, 0xfc003f48,
-0xc1037000, 0x903f208f, 0x037208fc, 0x3b000fc0, 0xf000fc00, 0x00074003,
-0x807c011f, 0x49c801b1, 0x00000400, 0x00000000, 0x02670830, 0x424c129f,
-0x61e089b0, 0x4c008911, 0xc029f002, 0x00970261, 0x08300e0c, 0x970024c0,
-0x30027c00, 0x4126c009, 0x025c0193, 0x41c008f0, 0x00000c20, 0x00000000,
-0x04262001, 0x0254119d, 0x25400910, 0x54009d00, 0x44399042, 0x099d0027,
-0x29d0166c, 0x95402540, 0x10020580, 0x01244808, 0x0244a999, 0x054029d0,
-0x00000080, 0x00000000, 0x0024a018, 0x02c400bd, 0x2c400b94, 0xc404b500,
-0x400bd002, 0x00b1042f, 0x0b1202f4, 0xad002845, 0x1002d400, 0x0024608b,
-0x0654009d, 0x614029d8, 0x00000200, 0x00000000, 0x02282010, 0x229408ad,
-0xa9480a10, 0x9600a500, 0x488ed002, 0x08a5022b, 0x0ad222a4, 0xa1802940,
-0x100a8400, 0x8020408a, 0x26040489, 0x414088d8, 0x00000080, 0x00000000,
-0x0086b01d, 0x084c021f, 0x054401b0, 0x4c801f10, 0xc021f100, 0x02172087,
-0xa030087e, 0x1e0284c0, 0x32003c0a, 0x8502d167, 0x585c0b15, 0x75c161f0,
-0x00000ac0, 0x00000000, 0x01a7b911, 0x1a7c269f, 0xa7c429f4, 0x3c029f00,
-0xc069b10a, 0x069f01a7, 0x39701a4f, 0x9f00e7c0, 0xf40a6c03, 0x05278849,
-0x12fc09b7, 0x66e04bf8, 0x00000e64, 0x00000000, 0x012fa018, 0x02cc00b7,
-0x2f400a20, 0xf810b300, 0x4309e042, 0x80bf042c, 0x2930d2e8, 0x9320a680,
-0x70527014, 0x012ec14b, 0x1afc0cb3, 0x60c06bf0, 0x00000e00, 0x00000000,
-0x0097081c, 0xa86c2a01, 0x05c001b0, 0x74001b01, 0xc041d001, 0x0a100186,
-0xf010895c, 0x3a02d740, 0xb0186c17, 0x46854031, 0x04740e11, 0x71484190,
-0x00000c20, 0x00000000, 0x00a3a012, 0x02040085, 0xa3402858, 0x34008104,
-0x4108d002, 0x00852420, 0x08500200, 0xa5012b44, 0x10422400, 0x10204148,
-0x2234008d, 0x484868d2, 0x00000e80, 0x00000000, 0x0021a818, 0x02640091,
-0x25610dd0, 0x76009900, 0x6089d002, 0x00810036, 0x09548214, 0xb9802f40,
-0xd0024600, 0x00256001, 0x44740094, 0x61400990, 0x00000620, 0x00000000,
-0x02e7a805, 0x824c6097, 0x67462971, 0x74009100, 0x4019d00a, 0x009f0024,
-0x09500a44, 0x9500a7c4, 0x48026400, 0x00240a01, 0x0c7c079f, 0x14c009f1,
-0x00000e20, 0x00000000, 0x00658016, 0x023c108f, 0x65c049b0, 0x7c209f06,
-0xc01df102, 0x009f1027, 0x09b0027c, 0x9f0023c0, 0xb0022c00, 0x0021a100,
-0x007c099b, 0x5bc809f2, 0x00000600, 0x00000000, 0x00050814, 0x2064001b,
-0x02ca2170, 0x6c001f00, 0xc000f008, 0x001f0c07, 0x01f0087c, 0x3f008dc0,
-0x31007c00, 0x0005c401, 0x08481013, 0x50d01130, 0x00000420, 0x00000000,
-0x001ca014, 0x25d40071, 0x9c4027d0, 0xc6005d00, 0x41b51019, 0x3b7d009f,
-0x05d005f4, 0x510014e0, 0x3001c400, 0x001f4003, 0x6cec0178, 0x50482710,
-0x00000200, 0x00000000, 0x00322014, 0x0b2402c9, 0x72411c50, 0x0601cd80,
-0x480c1143, 0x00c90007, 0x0c100704, 0xc5103344, 0x54031400, 0x0831403c,
-0x033480c4, 0x51400d90, 0x00000a00, 0x00000000, 0x201a0005, 0x01a400e1,
-0xb8411ed0, 0x8411ed01, 0x400e1006, 0x80ed010b, 0x1ed041a4, 0x21280840,
-0x50238601, 0x411f410e, 0x273411e5, 0x14000390, 0x00000200, 0x00000000,
-0x00421015, 0x07ac012b, 0xeac01e70, 0x8481ef01, 0xc8166207, 0x01ad804b,
-0x167004bc, 0xf7007f42, 0x7047dc01, 0x00f9c09e, 0x07bc01f7, 0x55c016b0,
-0x00000040, 0x00000000, 0x0025b810, 0x015c001f, 0x24c00df0, 0x1c008f08,
-0xc1255002, 0x209f8247, 0x05d0027c, 0x37100ec0, 0x321b5c00, 0x0853c0cd,
-0x436d40d9, 0x43c00870, 0x00000660, 0x00000000, 0x007fa000, 0x24dc017f,
-0x7f009f72, 0xfc09bf12, 0xc41ff025, 0x013b024f, 0x1d30064c, 0xff0a7fc0,
-0xf007d809, 0x0276409e, 0x275c0dd3, 0x02c01f30, 0x00000e00, 0x00000000,
-0x061d8815, 0x02848061, 0x1a40c610, 0xbc01e116, 0xc382f00d, 0x101d0d43,
-0x9eb06494, 0x2f030342, 0xd003841c, 0x015c408e, 0x07848dbf, 0x54408210,
-0x00000620, 0x00000000, 0x00090000, 0x009400a5, 0x39600e52, 0xb400a500,
-0x4006d003, 0x0869020b, 0x06110184, 0xcc003b48, 0xd003b600, 0x2138638e,
-0x0b0400e5, 0x02500610, 0x00000400, 0x00000000, 0x00a72804, 0x4e041381,
-0x92493410, 0x14938124, 0x4020504f, 0x024d0c81, 0x34104b14, 0x05068341,
-0xd00b2412, 0x0010002c, 0x03040094, 0x10401852, 0x00000c20, 0x00000000,
-0x1a67a815, 0x4a5c1297, 0xddc12570, 0x7412df00, 0x409dd14b, 0x095900ff,
-0x2d120f44, 0xdd20f7c5, 0xf01ff403, 0x483e5aad, 0x0b4402d1, 0x56c01034,
-0x00000620, 0x00000000, 0x30058001, 0x007c0097, 0xb6c025f4, 0x3c00cf08,
-0xc00de00a, 0x004f0023, 0x0ef1813c, 0x3f000bc2, 0xf0131c00, 0x0011c00d,
-0x0b6d0458, 0x07c0a1b2, 0x00000c00, 0x00000000, 0x025d0880, 0x02fc0273,
-0x4fc007f0, 0xc400fd02, 0x80037009, 0x403300bf, 0x07b080cc, 0xf3003c80,
-0x3003fc00, 0x011fc00f, 0x03dc20fb, 0x01d001f0, 0x00000c22, 0x00000000,
-0x00760081, 0x24748051, 0xa5c8b5d0, 0x54009d04, 0x40115084, 0x001500f7,
-0x07508254, 0x35000d40, 0x50037400, 0x0027440d, 0x1b440351, 0x054041f1,
-0x00000800, 0x00000000, 0x0024a001, 0x01740011, 0x07000dd0, 0x54409d00,
-0x448d1100, 0x02910017, 0x0d100264, 0xd1003540, 0x90037400, 0x00b7401d,
-0x13541155, 0x054019d0, 0x00000200, 0x00000000, 0x80002010, 0x03248001,
-0x01440490, 0x1404c900, 0x40004010, 0x00850002, 0x4c501014, 0x05900142,
-0xd0833600, 0x0113621c, 0x13040481, 0x414000d1, 0x00000080, 0x00000000,
-0x0016b000, 0x013c00c3, 0x87c00df0, 0x5c019f02, 0xc0a16014, 0x8ad323f7,
-0x1531052c, 0xd10235c0, 0xb003fc00, 0x8557e00d, 0x075c1517, 0x01c001f2,
-0x00000ac0, 0x00000000, 0x003fb825, 0x03fc00fd, 0x49c003f0, 0x7c089f01,
-0xc013e320, 0x45ff8277, 0x977023fc, 0x3f014fc1, 0x7183fe00, 0x802fc00f,
-0x0bfc00b7, 0x16c00b70, 0x00000e60, 0x00000000, 0x030fa003, 0x02ec00fb,
-0x0cc043b0, 0xfc202300, 0xc00fb013, 0x00ff303f, 0x0ff103cc, 0xff002fc0,
-0xf003ed80, 0x400ec80f, 0x238c0021, 0x0cc00731, 0x00000e00, 0x00000000,
-0x01970801, 0x80c500f5, 0x26502510, 0xc4009140, 0x40057003, 0x401d3037,
-0x0dd10344, 0xfd002f40, 0xd0034400, 0x0007400f, 0x03ec8a93, 0x04490512,
-0x00000c20, 0x00000000, 0x2083a011, 0x023540c1, 0x32408499, 0x2400d100,
-0x400cd18b, 0x001d0033, 0x0cd00334, 0xcd002140, 0xd0030400, 0x0023400c,
-0x131555d1, 0x56408410, 0x00000e80, 0x00000000, 0x0031a803, 0x446400d5,
-0x36402d10, 0x6400d000, 0x400d5003, 0x045d0037, 0x0dd00364, 0xdd002744,
-0xd0134400, 0x0427400d, 0x037500d1, 0x1e418500, 0x00000620, 0x00000000,
-0x4087a802, 0x077c40d3, 0x14c001b0, 0x7c011300, 0xc009b003, 0x331f0037,
-0x0df0076c, 0xdf0027c2, 0xf0064c00, 0x4087c00d, 0x035c80d3, 0x02d03d34,
-0x00000e20, 0x00000000, 0x20dd8007, 0x038c20f3, 0x3dc00f70, 0xdc98bf00,
-0xc007f003, 0x00bf04ff, 0x9ff08bcd, 0xef082fc8, 0xd186fc00, 0x008f420f,
-0x43e800f3, 0x0dc01de0, 0x00000602, 0x00000000, 0x00050802, 0x0f6c00d3,
-0x34c025f0, 0x5c08df28, 0xc06d3023, 0x32df2034, 0x0d30037c, 0xd30026c0,
-0x30026c00, 0x0230d00d, 0x23cc80df, 0x09d02f34, 0x00000420, 0x00000000,
-0x84f4a013, 0x056407f1, 0xb4408fd0, 0xc402c104, 0x402db003, 0x01cd00f4,
-0x0d102370, 0xff00ac40, 0x100e4450, 0x026c440f, 0x0b8400cb, 0x4c400d30,
-0x00000200, 0x00000000, 0x2162a007, 0x020450d1, 0x044011d0, 0x14014511,
-0x448c914b, 0x890d1032, 0xc890ab34, 0xc511a044, 0x916f0447, 0x40c0444c,
-0x8f04a68d, 0x1d4005d0, 0x00000a00, 0x00000000, 0x20208004, 0x848400e1,
-0x6c50d6d0, 0x8401f900, 0x505e1417, 0x09ed006a, 0x1a9407b4, 0xe4426810,
-0x94878501, 0x600a001e, 0x078409b9, 0x18601e50, 0x00000200, 0x00000000,
-0x02001012, 0x222c08d1, 0x30c14df0, 0x5c00c708, 0xc00d9003, 0x088f0432,
-0x8d90137c, 0xd40424c0, 0xb0034c00, 0x0004810d, 0x030c08cf, 0x49c000f8,
-0x00000040, 0x00000000, 0x012cb802, 0x00fc14ff, 0x3bc24ff0, 0xfc00f702,
-0xc44ff013, 0x28ff003d, 0x8f70037c, 0xfb082dc0, 0x79237408, 0x00adc00f,
-0x23fc28ff, 0x0bc087b0, 0x00000660, 0x00000000, 0x3037a015, 0x926c16df,
-0x14c159f0, 0x4d005f00, 0xd0193477, 0x01534034, 0x09500749, 0xd30927c0,
-0x38075c17, 0x000700cd, 0x33cc40cb, 0x44c01d30, 0x00000e00, 0x00000000,
-0x00398812, 0xc08c04ed, 0x38402ed0, 0x8620ff00, 0x400e1013, 0x00e10038,
-0x0a100bac, 0xe5832340, 0x10038486, 0x400b408e, 0x438400e1, 0x48400e10,
-0x00000620, 0x00000000, 0x00590003, 0x07b401e5, 0x7a0c1e50, 0x8401ed04,
-0x403e5017, 0x01f18078, 0x1e1057a4, 0xe1036b4a, 0x10078441, 0x025b401e,
-0x078491f1, 0x0c400818, 0x00000402, 0x00000000, 0x22332812, 0x095400cd,
-0x72700cd0, 0x0400c500, 0x400c1003, 0x01c10234, 0x0c140704, 0xc5002340,
-0x14230500, 0x0233400c, 0x030440c1, 0x48400c10, 0x00000c20, 0x00000000,
-0x005da817, 0x65fc0057, 0x5ec22570, 0x4c007d00, 0xc0071001, 0x03730014,
-0x05300064, 0x538017c0, 0x10054400, 0x0057c005, 0x014c0273, 0x5cd02734,
-0x00000620, 0x00000000, 0x00070012, 0x004c001f, 0x05c301d0, 0x7c001f00,
-0xc021f008, 0x1a1f0087, 0x01f0886c, 0x1fc807c6, 0xf0087c02, 0x0007c001,
-0x003d0317, 0x4bc100f0, 0x00000c00, 0x00000000, 0x00270810, 0x166c0097,
-0x27c00d70, 0x4c009f11, 0xc439f186, 0x429300e7, 0x39f0147c, 0x930024c0,
-0xf0867481, 0x0130d009, 0x024c8181, 0x40c00934, 0x00000c20, 0x00000000,
-0x00a62001, 0x0274009d, 0x27404910, 0x45009d19, 0x40099002, 0x03914027,
-0x39d21274, 0x90402458, 0xd0027400, 0x08a40039, 0x0a540895, 0x04401930,
-0x00000800, 0x00000000, 0x00b4a018, 0x0244108d, 0x27408950, 0x44068d10,
-0x400d5022, 0x00910027, 0x08d00274, 0x990a2041, 0xd0225408, 0x00244088,
-0x0a44029d, 0x60401910, 0x00000200, 0x00000000, 0x02202010, 0x2214088d,
-0xa3402810, 0x04028d00, 0x402cd21b, 0x028100b3, 0x28d20a34, 0x8900b040,
-0xd00a3416, 0x80b06428, 0x0214048d, 0x40408810, 0x00000080, 0x00000000,
-0x3586b01d, 0x586c160f, 0x07c14070, 0x0c001f00, 0xc000f004, 0x20530003,
-0x01f0503c, 0x480004c0, 0xf0011c04, 0x0004c405, 0xa84c0b1f, 0x74c36130,
-0x00000ac0, 0x00000000, 0x012fb819, 0x13fc049f, 0x2fc809f2, 0x7c00bf00,
-0xc00b9822, 0x80af002f, 0x0bf200fc, 0x9700afc0, 0xf802fc00, 0x00b3c029,
-0x0e3c09b7, 0x67c04b70, 0x00000e60, 0x00000000, 0x00afa018, 0x1acc02bb,
-0x27c189f0, 0x7c829b00, 0xc2090032, 0x029f2022, 0x29308674, 0x9701a3c0,
-0xf00a7c00, 0x012cc089, 0x62cc06a1, 0x67440b30, 0x00000e00, 0x00000000,
-0x4007081c, 0x10450411, 0x070821d0, 0x74801321, 0xc9457208, 0x800d2105,
-0x01305064, 0x11208748, 0xd2107484, 0x0582c043, 0x08548015, 0x73404154,
-0x00000c22, 0x00000000, 0x00a3a010, 0x1a140681, 0x2f004ad0, 0xb400a904,
-0x400a5032, 0x00ad042b, 0x0a9082f4, 0xa5022b40, 0xd002a410, 0x4220402a,
-0x12042681, 0x43612c90, 0x00000e80, 0x00000000, 0x00a5a818, 0x12748091,
-0x2f4909d0, 0xf480b104, 0x488b5082, 0x42bd002d, 0x4b1202e4, 0xb5002f40,
-0xd002f400, 0x8036400b, 0x02540295, 0x634009d8, 0x00000620, 0x00000000,
-0x00a7a805, 0x865d0093, 0xe3c039f0, 0x7c1b9b00, 0xc0393802, 0x029f8027,
-0x09b0023c, 0x95002744, 0xf0027c00, 0x02a4c009, 0x024c0292, 0x17c059b2,
-0x00000e20, 0x00000000, 0x00258014, 0x024c1097, 0x27c089f0, 0x7c019b05,
-0xc009f002, 0x049f00e5, 0x0970266c, 0x9b0023c0, 0xf0027c00, 0x10630009,
-0x0238049f, 0x53c03930, 0x00000600, 0x00000000, 0x01850814, 0x006c0007,
-0x8cc20331, 0xfc023d00, 0x60032000, 0x0033410f, 0x03f080cc, 0x3a040fc8,
-0xf000fc08, 0x0004c002, 0x904c0913, 0x53c00130, 0x00000420, 0x00000000,
-0x015ca014, 0x0545227d, 0xd4500550, 0x74065d00, 0xc015502d, 0x00510817,
-0x75f08140, 0x51001740, 0xd0094c0b, 0x001d4007, 0x0dc4027f, 0x53400510,
-0x00000200, 0x00000000, 0x0076a014, 0x03040245, 0x78480e10, 0xb404ed80,
-0x404e9003, 0x52e1027b, 0x3ed13794, 0xe000bb4b, 0xd06bb402, 0x0132400e,
-0x0704001d, 0x53400c90, 0x00000a00, 0x00000000, 0x10388005, 0x0f840a6d,
-0x38401ed0, 0x3400e904, 0x410e500f, 0x01e1007c, 0x0e500795, 0xe1043f40,
-0xd0038400, 0x002b610c, 0x6384002d, 0x17400e90, 0x00000200, 0x00000000,
-0x00581015, 0x06c601c7, 0x78c01f30, 0xbc41ed00, 0x401eb007, 0x01e3007b,
-0x1ed0039c, 0xea407bc8, 0xf007bc41, 0xa07ac01e, 0x17cc816f, 0x57c81eb0,
-0x00000040, 0x00000000, 0xa015b810, 0x825400df, 0x07c00172, 0x7c001f08,
-0xc001c000, 0x005f0007, 0x01f0006c, 0x170007c0, 0xe0006c00, 0x882d4201,
-0x017d005f, 0x43c00f74, 0x00000660, 0x00000000, 0x027fa000, 0x26c8417f,
-0x7ec0df30, 0xdc01f302, 0xc09eb007, 0x29fe027c, 0x1ff007cc, 0xf3007fc0,
-0xf027dc81, 0x03dda49f, 0x07cc01f3, 0x08d01b30, 0x00000e00, 0x00000000,
-0x00098815, 0xb384046d, 0x38418eb2, 0xb488e102, 0xc28e7123, 0x0cff0b3a,
-0x0ef20384, 0xe1823b40, 0x7023ac08, 0x022b40ce, 0x119d00fb, 0x56c00a10,
-0x00000620, 0x00000000, 0x10390200, 0x828480ed, 0x38484e50, 0x9400e100,
-0x480fd003, 0x00ed203a, 0x8ed043a6, 0xc1003f40, 0xd203b400, 0x0139481e,
-0x832408e9, 0x60410f50, 0x00000400, 0x00000000, 0x00c32804, 0x020400cd,
-0x824010d0, 0x34000170, 0x40b05000, 0x83450202, 0x00500024, 0x01800340,
-0x50000480, 0x00274200, 0x831400c9, 0x18413c5c, 0x00000c20, 0x00000000,
-0x0425a815, 0x8b4c00ef, 0x34c0bc50, 0x5c00d200, 0xc03d9003, 0x069d0034,
-0x0dd20768, 0xd34037c0, 0xf0037400, 0x0275c00d, 0x02ec0a0b, 0x54481d74,
-0x00000620, 0x00000000, 0x04370001, 0x133c005f, 0xb5c825a0, 0x3c90df00,
-0xc84d700b, 0x909f2037, 0x2df20b5d, 0xdf20b7c8, 0xf20b7c80, 0x80e7c80d,
-0x037c001f, 0x27c00d90, 0x00000c00, 0x00000000, 0x000b0880, 0x024c22d3,
-0x3cc01930, 0xfc05ff0d, 0xc00fb007, 0x00bf013e, 0x1ff007fc, 0xf3007cc8,
-0xb003fc00, 0x402fc00f, 0x229c0075, 0x07c21a30, 0x00000c20, 0x00000000,
-0x00162081, 0x02540251, 0x05400d50, 0x74041d00, 0x40405000, 0x031d0105,
-0xc0d0605c, 0x11060140, 0x50283401, 0x40e74081, 0x016c0055, 0x04401934,
-0x00000802, 0x00000000, 0x0064a001, 0x02441099, 0x04406d90, 0x74001504,
-0x40411160, 0x141d0006, 0x01500070, 0x11000448, 0x90085438, 0x00764409,
-0x035480d5, 0x05404990, 0x00000200, 0x00000000, 0x40002010, 0x031400c1,
-0x01600550, 0x34000d30, 0x40015800, 0x000d0003, 0x01900016, 0x00600540,
-0x10006400, 0x80034008, 0x002401c5, 0x40400813, 0x00000080, 0x00000000,
-0x0026b000, 0x024c0093, 0x00400930, 0x7c001700, 0xc0013000, 0x001f0006,
-0x01f1007c, 0x10400448, 0xb0007c00, 0x002bc009, 0x035c00d7, 0x05c009b0,
-0x00000ac0, 0x00000000, 0x200fb805, 0x02fc00ff, 0x3fc00ff0, 0xfc00ff00,
-0xc00f7003, 0x20bf003c, 0x0ff003dc, 0xff003bc0, 0xd003fc00, 0x502fc007,
-0x02fc007f, 0x15c00af0, 0x00000e60, 0x00000000, 0x001fb003, 0x01dc20f7,
-0xbe408f70, 0xdc083301, 0xc08ff003, 0x4cfb0d3e, 0x0d30904c, 0xf60837c0,
-0xf202ec48, 0x1104e04f, 0x011c0c4f, 0x0cd08f70, 0x00000e00, 0x00000000,
-0x20a70001, 0x00c40201, 0x3c404f30, 0x6c041b40, 0x400dd1b3, 0x06510081,
-0xcf112850, 0xfd013dc1, 0x54124c04, 0x2985c08f, 0x0154025d, 0x04406810,
-0x00000c20, 0x00000000, 0x0217a211, 0x01140245, 0xb1400c14, 0x34004101,
-0x404c9041, 0x88414000, 0x0c185004, 0xcd043340, 0x10432404, 0x0710400c,
-0x0104228d, 0x45406810, 0x00000e80, 0x00000000, 0x0005a803, 0x09540095,
-0x35480d10, 0x44021100, 0x400dd041, 0x04c10035, 0x0d118010, 0xdd003540,
-0x50036400, 0x0c15400d, 0xc15000dd, 0x0d400910, 0x00000620, 0x00000000,
-0x0256a802, 0x055c0097, 0x35d00d30, 0x74029100, 0xc00dd002, 0x019a0036,
-0x0d340f4c, 0xcf0037c0, 0x30026c00, 0x0804c00d, 0x0c08124f, 0x09c00d34,
-0x00000e20, 0x00000000, 0x102d8007, 0x086c007a, 0x3ec00fb1, 0xfc207f20,
-0xc50ef026, 0x213f500b, 0x0ff00ffc, 0xff003fc2, 0xf0039c40, 0x0087c40f,
-0xc8fc147f, 0x9ec08ab0, 0x00000600, 0x00000000, 0x00350802, 0x091c081f,
-0x32c08cb0, 0x7c00df01, 0xe20d7408, 0x001f0107, 0x0df04f5c, 0xd30435c0,
-0xf0035c10, 0x2014c20c, 0x214c0097, 0x08c08930, 0x00000420, 0x00000000,
-0x03a0a013, 0x45440bd1, 0x7f402f90, 0x74105d01, 0x412f112c, 0x0a9111b7,
-0x1fd00b6c, 0xf1003ec0, 0xd0077d03, 0x0094402f, 0x09ec02f1, 0x4c40a910,
-0x00000200, 0x00000000, 0x0042a007, 0x113400d5, 0xb3490c90, 0x34d01900,
-0x401c4000, 0x088d0032, 0x8cd00004, 0xc1023261, 0x90060520, 0x118042dc,
-0x0d3000cd, 0x0c501890, 0x00000a00, 0x00000000, 0x00788004, 0x21a40921,
-0x7b401e94, 0x2401ad11, 0x401e1054, 0x8521024b, 0x5ed804a4, 0xc1003a40,
-0xd046b419, 0x11584c1f, 0x05f40df9, 0x00401e9c, 0x00000200, 0x00000000,
-0x00000012, 0x213c0047, 0x33400cb1, 0x34084e02, 0x440c7096, 0x001f0143,
-0x1df1271c, 0xc30b7664, 0xb0171d00, 0x0140c80c, 0x853c0dcf, 0x58d04cb0,
-0x00000040, 0x00000000, 0x2019a802, 0x11cc00bf, 0x37c00f70, 0xfc08be03,
-0xc00df022, 0x04bb203f, 0x0df0036c, 0xff3f3ec0, 0xf1137c00, 0x2025c00e,
-0xb1ec20f7, 0x0bc00f70, 0x00000660, 0x00000000, 0x0007a015, 0x434c009b,
-0x35c00df0, 0x5c00930c, 0xc00d3001, 0x00db0037, 0x4df0004c, 0xd32d37c8,
-0x72024c9d, 0x1006c12d, 0xa50d00df, 0x57c00938, 0x00000e08, 0x00000000,
-0x08398812, 0x03852041, 0x38412ed0, 0xb400e101, 0x400e1201, 0x004b000f,
-0xaed000ac, 0xf3313b40, 0x51038444, 0x1019424e, 0x03ac43fd, 0x4b400eb0,
-0x00000620, 0x00000000, 0x006d0003, 0x05844129, 0x7b405ed0, 0xb403e902,
-0x429e1407, 0x0161904b, 0x5ed007a0, 0xe9107b48, 0xd0873484, 0x0048449c,
-0x15c401ed, 0x0f441e14, 0x00000400, 0x00000000, 0x00332812, 0x030600c1,
-0x34400cd0, 0x3601c940, 0x680c1103, 0x01c92037, 0x0cd00744, 0xc1103344,
-0xd0073500, 0x0231440c, 0x0f0400dd, 0x5b400c90, 0x00000c20, 0x00000000,
-0x189da817, 0x01cc017b, 0x17c005f0, 0xfc037b00, 0xc4051041, 0x1073001f,
-0x05f01de1, 0x4b0013c0, 0xf0117c00, 0x005e0207, 0x21c0807f, 0x5fc40530,
-0x00000620, 0x00000000, 0x20070012, 0x007c0a1f, 0x07c601f0, 0x7c041700,
-0xc001f008, 0x001f0007, 0x01f1487c, 0x1f0007e0, 0x32084400, 0x0005e001,
-0x207c001f, 0x4bc02130, 0x00000c00, 0x00000000, 0x04230810, 0x460c008b,
-0x25c00834, 0x3c229310, 0xc0091022, 0x008f0024, 0x0932024c, 0x9b0127c4,
-0x30064c00, 0x3026c009, 0x82688197, 0x40c409f2, 0x00000c20, 0x00000000,
-0x40262001, 0x26458091, 0x24400910, 0x74409100, 0x4089144e, 0x00951025,
-0x09100a45, 0x91106740, 0x514e0440, 0x10254028, 0x02540197, 0x055129d0,
-0x00000800, 0x00000000, 0x0064a018, 0x02440091, 0x25400990, 0x54409100,
-0x4008d002, 0x10990024, 0x09100364, 0x91802540, 0x98226402, 0x20e44009,
-0x02740495, 0x604008d8, 0x00000200, 0x00000000, 0x00202010, 0x02240281,
-0x20400890, 0x34088902, 0x40085022, 0x088500a1, 0x08107300, 0x8d422360,
-0xd8226400, 0x1221448c, 0x42040885, 0x414088d9, 0x00000080, 0x00000000,
-0x0502b01d, 0x504c1453, 0x81c000b0, 0x1c001305, 0xc08172d8, 0x161f0504,
-0xe114186e, 0x1b0587c1, 0xb2586c9c, 0x0586e161, 0x047c9017, 0x74c161f2,
-0x00000ac0, 0x00000000, 0x002fb819, 0x02dc00b7, 0x27c92970, 0xfc04b769,
-0xc069b013, 0x04bb002f, 0x19f012fc, 0x93012380, 0x7012dc04, 0x012ff049,
-0x02fc00bf, 0x66c04bf0, 0x00000e60, 0x00000000, 0x002fa018, 0x025c009f,
-0x27c00970, 0x5c009f05, 0xcb69b00a, 0x009d0227, 0x69f04274, 0xbb132d44,
-0x3042dc06, 0x142cc04b, 0x12ec12bb, 0x63c009f0, 0x00000e00, 0x00000000,
-0x0007081c, 0x00440017, 0x87c06110, 0x44041d01, 0x40019000, 0xa0110107,
-0x43700874, 0x11000440, 0x50582c84, 0x4187c001, 0x006c065f, 0x734040d1,
-0x00000c20, 0x00000000, 0x002ba010, 0x0e9410ad, 0x2b418a50, 0x9410b904,
-0x400ad002, 0x00a9912a, 0x6ad052b0, 0x8101a140, 0x58023586, 0x24604568,
-0x0a040481, 0x414528d1, 0x00000e80, 0x00000000, 0x0425a818, 0x06c602b5,
-0x2f440f10, 0xc400bd10, 0x400bd002, 0x80b10c2f, 0x0b5002f6, 0x91002400,
-0x50926420, 0x40676809, 0x2264089d, 0x634019d0, 0x00000620, 0x00000000,
-0x00a78805, 0x025c029d, 0x27400970, 0x5c098f00, 0xc009f002, 0x109f40a7,
-0x09f19274, 0x914025c0, 0x70027c00, 0x20e44008, 0x064c0093, 0x15c209f0,
-0x00000e20, 0x00000000, 0x00248014, 0x027c0097, 0x25c009f0, 0x3c019f00,
-0xc2093002, 0x009f10e7, 0x0970267c, 0x970027c4, 0xf2067c00, 0x0027c009,
-0x027e008f, 0x53c00df8, 0x00000600, 0x00000000, 0x008d0814, 0x008c0223,
-0x0ce00330, 0xcc103f08, 0xc0033000, 0x403f000a, 0x027008f4, 0x072c0340,
-0x10005c88, 0x00464801, 0xe04c881b, 0x50c01130, 0x00000420, 0x00000000,
-0x0854a014, 0x01440051, 0x57e00550, 0x44005d00, 0x40051001, 0x01592017,
-0x0510014c, 0x7d201c40, 0x10a9fc00, 0x08984007, 0x05c40175, 0x50400510,
-0x00000200, 0x00000000, 0x4252a014, 0x00340901, 0x004a0012, 0x14000d08,
-0x40001800, 0x00055803, 0x10180014, 0x4d003240, 0xd0834430, 0x0030400c,
-0x070431cd, 0x50500c90, 0x00000a00, 0x00000000, 0x20708205, 0x033404c1,
-0x39401e50, 0x9408fd0c, 0x408e1203, 0x07c1013b, 0x4c405704, 0x4d213841,
-0xd003a100, 0x03185006, 0x068420f1, 0x14411290, 0x00000200, 0x00000000,
-0x00581015, 0x05bd01a3, 0x48405330, 0xdc056f0d, 0x48963047, 0x33ae144e,
-0x3234169c, 0x67217a80, 0xf1079c27, 0x014cc41f, 0x078800af, 0x54d016b4,
-0x00000040, 0x00000000, 0x0035b810, 0x024c2a5f, 0xb7c02df0, 0x6d468f22,
-0xc869f430, 0x065b0337, 0x1db0417c, 0x5e0827c8, 0x30827400, 0x0045c145,
-0x823c498f, 0x43c02970, 0x00000660, 0x00000000, 0x005fa000, 0x049c037f,
-0x5dc13330, 0x5c03bf00, 0xc213f104, 0x855a1046, 0x17d245fc, 0xfba67ec0,
-0xb227cd8d, 0x1078c81d, 0x244c01d3, 0x00c03b30, 0x00000e20, 0x00000000,
-0x01398815, 0x93ac20ad, 0xa9c04e10, 0x04046f00, 0x002fd017, 0x09ab0070,
-0x7bd0028c, 0xa3001842, 0xf0073c0c, 0x0fdbc076, 0x1eac0d6d, 0x54408610,
-0x00000660, 0x00000000, 0x00190200, 0x09d400ed, 0x1b40021a, 0xb410ed02,
-0x50065093, 0x00c90008, 0x56d003a6, 0x61003144, 0xd041844c, 0x010e404e,
-0x10e400a9, 0x00400210, 0x00000400, 0x00000000, 0x02b32804, 0x0204120d,
-0x23600d1c, 0x24000500, 0x4009d800, 0x120904f0, 0x08d00004, 0x01000040,
-0x42003440, 0x00c14005, 0x0224010d, 0x10420c10, 0x00000c00, 0x00000000,
-0x00b5a815, 0x0254113f, 0x2fc00f10, 0xfc003d00, 0xc00b7000, 0x823a217e,
-0x0bf080ec, 0xf3000dd4, 0xd0834c00, 0x002e4205, 0x016c81e3, 0x54f00d30,
-0x00000600, 0x00000000, 0x21170001, 0x0d7c00cf, 0x95c001f0, 0x5c00df00,
-0xc005f003, 0x80d70887, 0x05f2032c, 0x971035c4, 0xf1037d00, 0x0027c021,
-0x007d08d7, 0x07c011f5, 0x00000c00, 0x00000000, 0x023b08a0, 0x038c0093,
-0x28d29fb0, 0xfc307300, 0xc00ff003, 0x80b5007e, 0x0b3102ec, 0x43000bc0,
-0xa003ac00, 0x54dcd04f, 0x419000d3, 0x00c00530, 0x00000c02, 0x00000000,
-0x00162081, 0x10444051, 0x94403150, 0x74009500, 0x4421d100, 0x00550185,
-0x05108174, 0x1b006740, 0x50024438, 0x00d04021, 0x2c5410d5, 0x045009f0,
-0x00000802, 0x00000000, 0x00b4a001, 0x02440051, 0x34400d94, 0x74009500,
-0x4009d000, 0x80510231, 0x0d900174, 0xd122876c, 0x54836400, 0x00045205,
-0x015688d1, 0x06400892, 0x00000200, 0x00000000, 0x40102010, 0x01042081,
-0x00480011, 0x24004100, 0x4004d013, 0x04850001, 0x40950234, 0x01001240,
-0x50430500, 0x11004040, 0x600618c1, 0x42401c92, 0x00000080, 0x00000000,
-0x0036b000, 0x034d00f3, 0x3cc00fb4, 0xfc40e700, 0xc40fd037, 0x05f701f8,
-0xfdb023fc, 0x510207c5, 0x703d6c00, 0x2754c15e, 0x15582593, 0x02c401b0,
-0x00000ac0, 0x00000000, 0x100fb805, 0x00fc003f, 0x0fc003f0, 0xfc003f00,
-0xc003f0a4, 0x0837074d, 0x113004fc, 0x3f894fc0, 0xf0947840, 0x0057c003,
-0x14bc05bf, 0x15c00ff0, 0x00000e60, 0x00000000, 0x003f8003, 0x02f4003f,
-0x3cc00f50, 0xfc00ff00, 0xc80f3803, 0x00b1403f, 0x0f3003fc, 0xfd103fc0,
-0xb123fc00, 0x018acc27, 0x51fc90a2, 0x0cc02f34, 0x00000e00, 0x00000000,
-0x103f0801, 0x02748011, 0x05400911, 0x3c001d00, 0x48011200, 0x00110007,
-0x01520074, 0x1d000740, 0x10147400, 0x2364c858, 0x49740095, 0x04500f10,
-0x00000c20, 0x00000000, 0x0033a011, 0x02140001, 0x00600451, 0x36000d20,
-0x40001400, 0x40090003, 0x00940024, 0x0d000340, 0xd0101480, 0x80324008,
-0x11140009, 0x44404c90, 0x00000e80, 0x00000000, 0x0035a803, 0x02740211,
-0x05400d18, 0x74101d00, 0x40811020, 0x90190007, 0x01902034, 0x1d820740,
-0xd0083424, 0x10244049, 0x4174009d, 0x0c400d10, 0x00000620, 0x00000000,
-0x4037a802, 0x027c2313, 0x04cc2850, 0x78021f10, 0xc001100c, 0xa05b0047,
-0x21b0146c, 0x1f04c7c0, 0xf0245c41, 0x0806c011, 0x213c249b, 0x08c20d32,
-0x00000e20, 0x00000000, 0x08398007, 0x02bc4573, 0xffc00ff2, 0xdc09ff08,
-0xc01ff107, 0x80f700bf, 0x3f7007fc, 0xff007fc0, 0x3003fc00, 0x120dc00f,
-0x057c00f7, 0x1fc00fc0, 0x00000600, 0x00000000, 0x00350806, 0x437c021f,
-0xb5d505f0, 0x7c02db00, 0xc22d3083, 0x00d340b4, 0x2df21b7c, 0xdf00b7e8,
-0xf00b7c02, 0x0035828d, 0x094c00d3, 0x0bc08d30, 0x00000420, 0x00000000,
-0x013ca013, 0x8374005d, 0x35490d10, 0x4c0add01, 0x41ad100f, 0x0fd122f5,
-0x0dd00b74, 0xd1103740, 0xd0037400, 0x012c44ad, 0x0d6c00fb, 0x4f420f10,
-0x00000200, 0x00000000, 0x0072a003, 0x8e24010d, 0x835c3410, 0x74000d09,
-0x50001440, 0x00010004, 0x00d82034, 0x05000340, 0xd0002480, 0x04954011,
-0x41040089, 0x1f410d14, 0x00000a00, 0x00000000, 0x20788000, 0xb6b411ad,
-0x7b409a14, 0x8401ed00, 0x421e1107, 0x05a00c7a, 0x1ed087b4, 0xe9007b40,
-0x9027b421, 0x213c401e, 0x04a400b9, 0x13401e10, 0x00000200, 0x00000000,
-0x18301016, 0x527c000f, 0xb3ca8c74, 0x3c00cf20, 0xc82d3043, 0x008320b4,
-0x0cd3933e, 0xcf023744, 0xf0032c22, 0x1a31c00c, 0x510c088b, 0x4bc20c3a,
-0x00000040, 0x00000000, 0x04bdb802, 0x92fc00bd, 0x3dc08e70, 0xdc08ff00,
-0xc08f7003, 0x049f0035, 0x0ff803fc, 0xf7383fc0, 0xf003fc00, 0x003fc01f,
-0x00fc08bf, 0x0bc10ff8, 0x00000660, 0x00000000, 0x00b7a015, 0x827c2113,
-0x04c81130, 0x7c001700, 0xc001b000, 0x40532007, 0x01300440, 0x1f0007c0,
-0x30047c00, 0x2a57c001, 0x074c088b, 0x57c16d30, 0x00000e00, 0x00000000,
-0x00318812, 0x02bc402b, 0x38400eb0, 0xb400ed00, 0x400e1403, 0x00f1403f,
-0x0e9003c4, 0xed103b40, 0x1003b400, 0x011b400e, 0x02ec01e1, 0x4b484e11,
-0x00000620, 0x00000000, 0x80790003, 0x0f340061, 0x78411e10, 0xb411ed04,
-0x401e1007, 0x21e1007b, 0x1e908786, 0xed007b41, 0x1107b6d1, 0x003b401e,
-0x079407f9, 0x0f401e90, 0x00000400, 0x00000000, 0xa0332812, 0x035481c9,
-0x78401e98, 0xf403ed00, 0x442e1007, 0x12e1007b, 0x0e900386, 0xed80bb40,
-0x1407b402, 0x04b3600e, 0x023413d1, 0x4b400c90, 0x00000c20, 0x00000000,
-0x0015a817, 0x05740473, 0x94d00530, 0x74005700, 0xc9051045, 0x115316d7,
-0x8534094d, 0x5d22d7c8, 0x30417c81, 0x001fc057, 0x21dc017b, 0x5fc005b4,
-0x00000620, 0x00000000, 0x00030012, 0x087c101f, 0x0fc403f0, 0xfc003f00,
-0xc1037280, 0x003f000f, 0x037260ec, 0x3f020fc0, 0xf010fc02, 0x0007e003,
-0x806c801f, 0x4bc02172, 0x00000c00, 0x00000000, 0x01270810, 0x224c0083,
-0x23e00932, 0x6c109b04, 0xc4093042, 0x00930024, 0x09f0026c, 0x9f0067c0,
-0xf0024c12, 0x1022c009, 0x024d809b, 0x43c009f0, 0x00000c20, 0x00000000,
-0x20262001, 0x42442091, 0x27680910, 0x45009340, 0x50091102, 0x00914024,
-0x09d0024d, 0x8d226740, 0xd00a4c01, 0x10245009, 0x02440091, 0x074129d0,
-0x00000800, 0x00000000, 0x00248018, 0x82442191, 0x2f4e0d10, 0xc400a100,
-0x400a1c03, 0x20a10028, 0x0fd802c4, 0xb5802f42, 0xd042c400, 0x0024602a,
-0x02640091, 0x634009d8, 0x00000200, 0x00000000, 0x02202010, 0x22040081,
-0x2b400a10, 0x8408a100, 0x508a1022, 0x08a10228, 0x0ad82284, 0xed0a2b40,
-0xd00a8400, 0x10a0402a, 0x0a240081, 0x434008d8, 0x00000080, 0x00000000,
-0x0586b01d, 0x584e1413, 0x17400134, 0x0c021300, 0x48213008, 0x02130084,
-0x01f0084c, 0x170087c0, 0xf0000d00, 0x0500c003, 0x006c1e13, 0x77c3e1f0,
-0x00000ac0, 0x00000000, 0x4127b819, 0x12fe00ff, 0xa7c228f0, 0x5c069f20,
-0xc069b21a, 0x269f11a7, 0x29f01b5c, 0xdf01b7c0, 0xf00b5c02, 0x002fc029,
-0x0adc01b7, 0x67c019f0, 0x00000e60, 0x00000000, 0x022fa018, 0x1acc049f,
-0x24404a32, 0x4c309300, 0xc0693002, 0x009309a6, 0x4b30124c, 0xa3022c80,
-0x30124c04, 0x1927c089, 0x12cc0291, 0x60c16bf8, 0x00000e00, 0x00000000,
-0x0087081c, 0x90440a1d, 0x04500112, 0x05050140, 0x5071143c, 0x030140c0,
-0x01101cc5, 0x11428450, 0x14c44502, 0x054f40b1, 0x50440445, 0x72c001d0,
-0x00000c20, 0x00000000, 0x01a3a010, 0x9a24008d, 0xa0488810, 0x84108108,
-0x40ca5042, 0x16a50229, 0x28146284, 0x81012040, 0x110a0408, 0x01ab400a,
-0x32240681, 0x406008d8, 0x00000e80, 0x00000000, 0x0025a818, 0x8264809d,
-0x24410914, 0xc4109104, 0x406b5002, 0x82b501ad, 0x291022c6, 0x91002440,
-0x10224400, 0x042f426b, 0x02640095, 0x624009d2, 0x00000620, 0x00000000,
-0x0027a805, 0x266c029f, 0xe4cc3930, 0x4c029300, 0xc029706e, 0x619780e5,
-0x0930864c, 0x930024c0, 0x30024c00, 0x40e7c239, 0x026d0293, 0x14d009d0,
-0x00000e20, 0x00000000, 0x00258014, 0x025c49df, 0x77c049f0, 0x7c099f02,
-0xc019b006, 0x059b2066, 0x29f0067c, 0x9f00a7c0, 0xe0067c02, 0x00a7c009,
-0x425c089b, 0x53c109f2, 0x00000600, 0x00000000, 0x2a050814, 0x207c800f,
-0x80c03080, 0x8c020f02, 0xc0223008, 0x4023008b, 0x00f0008c, 0x0f0000c0,
-0xf0080c00, 0x000cc443, 0x005c8013, 0x50c000b4, 0x00000420, 0x00000000,
-0x0014a014, 0x2df4205d, 0xd4412750, 0x44005d90, 0x00053001, 0x20550017,
-0x05700155, 0x7d001540, 0xd0014400, 0x001c5005, 0x09c48051, 0x52c01711,
-0x00000200, 0x00000000, 0x0072a014, 0x0374004d, 0x324c1890, 0x0500cd04,
-0x400c8403, 0x40c02033, 0x1cd00324, 0x4d027040, 0xd0030400, 0x0014422c,
-0x2e1400d1, 0x52403c10, 0x00000a00, 0x00000000, 0x20288005, 0x0334032d,
-0x3a400e10, 0x84006d10, 0x44021000, 0x0025100b, 0x2e5000a4, 0x6d003942,
-0xd0038400, 0x302a4010, 0x050404e1, 0x1641ce10, 0x00000200, 0x00000000,
-0x00681015, 0x26bc002d, 0x7ad21ab0, 0x8c41ed10, 0xc01eb107, 0x81e3407b,
-0x1ef007ac, 0x6f0078c0, 0xf0058501, 0x405cc81e, 0x069c05e3, 0x56c01630,
-0x00000040, 0x00000000, 0x0025b810, 0x037c061f, 0x95c00df0, 0x7c405f00,
-0xc401f000, 0x001b1007, 0x0cf0005c, 0x5f0037c0, 0xf2017020, 0x0025c001,
-0x017c42df, 0x43c00470, 0x00000660, 0x00000000, 0x007fa000, 0x07fc2372,
-0xfcc0df34, 0xc801f322, 0xc09f3007, 0x41f3207c, 0x1b3007d8, 0x73027cc0,
-0x3027cc01, 0x0058c01f, 0x85cc93f3, 0x00c01f34, 0x00000e00, 0x00000000,
-0x02398815, 0x23f4002b, 0x284186b0, 0x94846b00, 0x41821010, 0x04210108,
-0x8a100084, 0x61003840, 0xb0238490, 0x202ac042, 0x11c410fb, 0x56c00210,
-0x00000620, 0x00000000, 0x00210000, 0x00b40221, 0x3a0a4e50, 0xb410e124,
-0x480e9803, 0x40e1243a, 0x0a900386, 0x610c2840, 0x11018400, 0x005c610c,
-0x819402e1, 0x00400650, 0x00000400, 0x00000000, 0x00272804, 0x82340909,
-0x02561490, 0x37034900, 0x58119604, 0x03114002, 0x88940447, 0x41642050,
-0x14450513, 0x01a05001, 0x210401c9, 0x12400050, 0x00000c20, 0x00000000,
-0x0035a815, 0x027c0250, 0xb6c01d70, 0x6401d100, 0xc03db06b, 0x84d102b6,
-0x29a06b5c, 0x4300e4c0, 0x101f4c80, 0x04d4401d, 0x061d01f3, 0x54c00b70,
-0x00000620, 0x00000000, 0x00270001, 0x0278001f, 0x35c00df2, 0x4c045f04,
-0xc0417080, 0x001f0005, 0x4970006c, 0x5f0827c0, 0xf0037c20, 0x0027c101,
-0x017c00df, 0x07c009a0, 0x00000c00, 0x00000000, 0x806f0880, 0x02fc0833,
-0x3ce15db0, 0x4500df10, 0xc00df003, 0x10df0036, 0x5930034d, 0x9f0037c0,
-0xf0014c00, 0x001cc00f, 0x02cc00e3, 0x00c00230, 0x00000c22, 0x00000000,
-0x80662081, 0x46740015, 0x146a0c10, 0xc4007d01, 0x40037100, 0x003d000c,
-0x19f000c8, 0x9d027744, 0xd001c403, 0x502d5043, 0x015400d1, 0x05409114,
-0x00000802, 0x00000000, 0x2124a001, 0x06340011, 0x14480d90, 0x5680cd00,
-0x600dd103, 0x00dd0034, 0x09900340, 0x5d002740, 0x90034006, 0x0010400d,
-0x014400d1, 0x04400910, 0x00000200, 0x00000000, 0x08202010, 0x82348005,
-0x00600410, 0x14004d30, 0x50005900, 0x40090000, 0x08980004, 0x4d002340,
-0xd0030520, 0x40204000, 0x015440c1, 0x41400010, 0x00000080, 0x00000000,
-0x0026b000, 0x02fc0011, 0x14500db2, 0x5e00dd20, 0xc00df203, 0x00df0034,
-0x09b0034c, 0x9f0027c0, 0xb0014c00, 0x0014c005, 0x014c20f3, 0x00c40130,
-0x00000ac0, 0x00000000, 0x002fb805, 0x02fc003f, 0x0bc007f0, 0xec007f80,
-0xc0034200, 0x003f000f, 0x0bf000dc, 0xbf102fc0, 0xf001fc00, 0x002fc40b,
-0x01fc40ff, 0x17c002f2, 0x00000e60, 0x00000000, 0x010f8003, 0x70ec08ff,
-0x3dc18330, 0x5c043f00, 0xc0cfb04b, 0x84d7a006, 0x0f3011dc, 0x270236c0,
-0xb000dc00, 0x003fc009, 0x034c301f, 0x0cc00ff0, 0x00000e00, 0x00000000,
-0x1aa30801, 0x080c06fd, 0xbf426190, 0xc40e5f02, 0x04eea003, 0x10f12597,
-0x4fd02155, 0x15103440, 0x1201140a, 0x0034400b, 0x8bd4021d, 0x04402fb0,
-0x00000c20, 0x00000000, 0x8503a011, 0x902608cd, 0x31484094, 0x16108d05,
-0x120c9893, 0x02c50080, 0x0c500104, 0x01013261, 0x90221400, 0x00334004,
-0x232420cd, 0x444028d8, 0x00000e80, 0x00000000, 0x28258803, 0x126400cd,
-0x37418198, 0x4400d500, 0x440d9003, 0x00d10014, 0x0d500154, 0x01487440,
-0x10025002, 0x0034511d, 0x037400dc, 0x0c4009c0, 0x00000620, 0x00000000,
-0x02478802, 0x006c00df, 0x35c23110, 0x541b1d00, 0xd00db103, 0x00d526c6,
-0x0d74444c, 0x57007280, 0xb2085421, 0x8877c83d, 0x036c009f, 0x08c41de0,
-0x00000e20, 0x00000000, 0x042d8007, 0x85dc00df, 0x3fc01772, 0x7c005f00,
-0xc00e3043, 0x00f7005b, 0x0fe017bc, 0x3f003fc0, 0xf001bc85, 0x027dc00c,
-0x03dc09af, 0x1fc09e30, 0x00000600, 0x00000000, 0x00950802, 0x106c00d7,
-0x34d02930, 0x4c088301, 0xd00db003, 0x84d70885, 0x0d72007c, 0x534077c0,
-0x70034c02, 0x4036c0ad, 0x037c00d3, 0x08c00920, 0x00000420, 0x00000000,
-0x01f4a013, 0x0b443bf1, 0xbcc00d92, 0xdc00df01, 0x800fb103, 0x03e1001e,
-0x5f3203fc, 0x1b0036c4, 0x1003ec03, 0x12f440bd, 0x1bdc0ed1, 0x4c41a9b0,
-0x00000200, 0x00000000, 0x1092a007, 0x034403cd, 0x70400c18, 0x64840100,
-0x400c180b, 0x01c51020, 0x1d500326, 0x0581b141, 0x10001453, 0x0032400c,
-0x1324004d, 0x1c4218c8, 0x00000a00, 0x00000000, 0x80588204, 0x048701e9,
-0x7e401e91, 0x86012502, 0x409e1037, 0x1de5007c, 0x1e5007f6, 0x69407800,
-0x1037b631, 0x057940ce, 0x0794096d, 0x104018d1, 0x00000200, 0x00000000,
-0x00b01012, 0x830408cd, 0x70404d38, 0x05080101, 0x429c1027, 0x45c7a160,
-0x4c70073c, 0x01037148, 0x300c1800, 0x0176c0dc, 0x077c85cf, 0xc8c04cb4,
-0x00000040, 0x00000000, 0x003db002, 0x02de30f7, 0xb9c00f72, 0xfe003c25,
-0xc02fb023, 0x20eb222b, 0x0cb823bc, 0x7f4032c0, 0xf482ec80, 0x0236d08f,
-0x037c80d3, 0x0bc01f30, 0x00000660, 0x00000000, 0x0007a015, 0x837c04df,
-0xb6c00134, 0x7c00d340, 0xc02db813, 0x34db0046, 0x7db0067c, 0x5b0836c0,
-0x30004c00, 0x2034c16d, 0x974c00d3, 0x54c04970, 0x00000e00, 0x00000000,
-0x18098012, 0x01b408ed, 0x3c400610, 0x3400e909, 0x404c524b, 0x02c1101c,
-0x4c100fc4, 0x2d813941, 0x10138480, 0x0038500f, 0x231400c1, 0x48410a50,
-0x00000620, 0x00000000, 0x04790003, 0x479405ed, 0x79441a10, 0xb481e900,
-0x429e1017, 0x85e10208, 0x9e925394, 0xc9027800, 0x10358481, 0x0479411e,
-0xa79401e5, 0x0d401c18, 0x00000400, 0x00000000, 0x00332812, 0x073400cd,
-0x31013c14, 0x3402c900, 0x500d5803, 0x00c90490, 0x0c100304, 0xdd003140,
-0x14070401, 0x0061413c, 0x031400c5, 0x49400c5a, 0x00000c20, 0x00000000,
-0x001da817, 0x01dc005f, 0x1f503730, 0xbc117100, 0xe0053681, 0x005b001c,
-0x05b025dc, 0x79804c80, 0x1045cc03, 0x4815d027, 0x015c0075, 0x5dd00530,
-0x00000620, 0x00000000, 0x00070012, 0x007c020f, 0x00c081f0, 0x7c101700,
-0xc001b000, 0x00170205, 0x2178004c, 0x1f0205c2, 0xf0007d8c, 0x0006c001,
-0x0074101b, 0x4ac001f0, 0x00000c00, 0x00000000, 0x00270810, 0x026c009f,
-0x26c00870, 0x4c029308, 0xc009b202, 0x01870025, 0x5930024d, 0x9f0007c0,
-0xb0020d00, 0x0025c009, 0x024c0093, 0x41c009b0, 0x00000c20, 0x00000000,
-0x00a60001, 0x0a54029d, 0x26c00914, 0x74009500, 0x50091406, 0x09910020,
-0x29120204, 0x99208740, 0x720a4400, 0x40245009, 0x02450091, 0x045009d0,
-0x00000800, 0x00000000, 0x80a4a018, 0x43050095, 0x64400950, 0x54009900,
-0x40090012, 0x00910026, 0x09180254, 0x99006742, 0x10424500, 0x00234808,
-0x02640081, 0x614008d0, 0x00000200, 0x00000000, 0x02202810, 0x7204028d,
-0x2251c890, 0x7414c100, 0x40681023, 0x80810224, 0x8c101a54, 0x8d026348,
-0x50220408, 0x02224c88, 0x32240881, 0x404088d0, 0x00000080, 0x00000000,
-0x3586a01d, 0x180c1457, 0x04cc6070, 0x5c041b05, 0xe041b0d8, 0x7e110187,
-0x2130105c, 0x5f0507c0, 0x30d80c16, 0x00838161, 0x0c6c9613, 0x75c161b1,
-0x00000ac0, 0x00000000, 0x012fa819, 0x12fc009f, 0x24c04b70, 0x7c14bf45,
-0xc069f012, 0x219f032f, 0x69f00aec, 0xfb012fc0, 0xf012fd04, 0x012dc24b,
-0x325c04bf, 0x67c24bf0, 0x00000e60, 0x00000000, 0x812fa818, 0x0aec00b3,
-0x2fc229b0, 0xfc30bf00, 0xc029f00a, 0x06af0126, 0x2af0824c, 0xa301eec2,
-0xf05a1c02, 0x00a6c489, 0x1a44829f, 0x60c029b2, 0x00000e00, 0x00000000,
-0x4507081c, 0xb9442413, 0x07420152, 0x74000f09, 0x44217010, 0x401d1581,
-0xa1f0083c, 0x1b418442, 0xd01c4400, 0x01455075, 0x0444051d, 0x7040f310,
-0x00000c20, 0x00000000, 0x0323a010, 0x1206168d, 0xa3402850, 0x34108d14,
-0x4268d28a, 0x068d0220, 0x08d04a16, 0x8921a240, 0x50022402, 0x012b502a,
-0x1aa406ad, 0x40404a10, 0x00000e80, 0x00000000, 0x0025a018, 0x02460095,
-0x27422954, 0x74029508, 0x54085002, 0x009d1025, 0x09510274, 0x94023440,
-0xd0026400, 0x012d420b, 0x02e400bd, 0x60408b10, 0x00000620, 0x00000000,
-0x01652005, 0x0a440095, 0x27440930, 0x74009d00, 0x4009d102, 0x009d2224,
-0x09d0864d, 0x890826c0, 0xf04a7c03, 0x0027c039, 0x026d1b9e, 0x14d01934,
-0x00000e20, 0x00000000, 0x01258014, 0x025c009b, 0x27c00930, 0x7c009f00,
-0xc0097802, 0x509f0024, 0x09f1267c, 0x9b0067c1, 0xf00e5d03, 0x0067c039,
-0x025c009f, 0x53c019f0, 0x00000600, 0x00000000, 0x00850014, 0x083c0013,
-0x07c00134, 0x4c101101, 0xe801f000, 0x00130004, 0x80b0006d, 0x13004580,
-0x30086c06, 0x200ec002, 0x00cd023f, 0x50d00230, 0x00000420, 0x00000000,
-0x201ca814, 0x05f40771, 0x5f480500, 0xc4007404, 0x64079085, 0x0265201c,
-0x3750017c, 0x71109c48, 0x12017c23, 0x00144205, 0x0144005d, 0x50400554,
-0x00000200, 0x00000000, 0x0236a014, 0x063404d9, 0x73440c10, 0x0402c100,
-0x480cd887, 0x42c12030, 0x2c500334, 0xcc103540, 0x10032402, 0xa832640c,
-0x036420dd, 0x52400c50, 0x00000a00, 0x00000000, 0x00308005, 0xc03401e1,
-0x62440e10, 0x8401e140, 0x408e9043, 0x02250078, 0x4e1027b4, 0x65a90844,
-0x1007f442, 0x00095002, 0x00240029, 0x16400258, 0x00000200, 0x00000000,
-0x40581015, 0x06bc006b, 0x7b407e32, 0x8d01e300, 0x501cf005, 0x01e32578,
-0x1e7017ad, 0xeb416dc6, 0x3005ad01, 0x007ac01c, 0x07ac01ff, 0x56c01c30,
-0x00000040, 0x00000000, 0x9015b010, 0x027c0057, 0x27e56df0, 0x7c201f08,
-0xc02db101, 0x895b01b7, 0x9d77137c, 0xd90277c8, 0xf1817c06, 0x0004c201,
-0x005c001f, 0x41c201f0, 0x00000660, 0x00000000, 0x007f8000, 0x37e4293f,
-0x7d801f70, 0x4d295f00, 0xc03fb007, 0x01db0674, 0x9fb02fec, 0x73087ac0,
-0x30a73503, 0x007ed01f, 0x07fc09f3, 0x00c21f32, 0x00000e00, 0x00000000,
-0x01298835, 0x21fc00e7, 0x13c00eb1, 0x84017d01, 0xc04cf017, 0x8531047a,
-0xca1a9710, 0x29034948, 0x11472c08, 0x02054042, 0x34b40121, 0x545003b0,
-0x00000620, 0x00000000, 0x20190000, 0x13b4402d, 0x29410c11, 0xa414ed80,
-0x420ed010, 0x08a10038, 0x069053a4, 0x61090e40, 0x1201f400, 0x0438400c,
-0x033404e1, 0x00400e90, 0x00000400, 0x00000000, 0x01832804, 0x435680c5,
-0x01401c10, 0x24010c00, 0x440dd100, 0x00011070, 0x00900345, 0x05001300,
-0x10052401, 0x00010060, 0x00340001, 0x10400190, 0x00000c20, 0x00000000,
-0x00a58815, 0x0f74009d, 0x15401f14, 0x6c009f00, 0x440f9202, 0x00e3807c,
-0x0fb003ee, 0xc3005ed2, 0x310f7c31, 0x4034e22d, 0x037c00d1, 0x54c20d92,
-0x00000620, 0x00000000, 0x98810001, 0x217c009f, 0x26c00df8, 0x5c009f00,
-0xc80d7088, 0x009f0037, 0x0470035c, 0x5b0204c4, 0xfc037d00, 0x0005c001,
-0x007c001f, 0x07c001f1, 0x00000c00, 0x00000000, 0x002f0880, 0x03fc293b,
-0x1fc80ff0, 0xfc89f320, 0xd20ff023, 0x00ff003c, 0x19b0c3ec, 0xf3000fc0,
-0xf041cc00, 0x003ec00e, 0x03cc00f0, 0x01c00f35, 0x00000c22, 0x00000000,
-0x12442081, 0x07740113, 0xa7400df0, 0x74801100, 0xc40d1199, 0x22dd0036,
-0x31100344, 0xd1001041, 0xd001ec80, 0x08084803, 0x80c42031, 0x044003b0,
-0x00000802, 0x00000000, 0x8434a001, 0x13740011, 0x91680d50, 0x34001500,
-0x400d1002, 0xd0550034, 0x4d150356, 0x55081440, 0xd0034400, 0x0035400d,
-0x030400c5, 0x05480d10, 0x00000200, 0x00000000, 0x00002010, 0x012400c9,
-0x12400c90, 0x34000142, 0x462c5600, 0xa4090430, 0x00101304, 0x11100448,
-0xd0432720, 0x40057020, 0x40051005, 0x40400098, 0x00000080, 0x00000000,
-0x4036b000, 0x0374201b, 0x05c00f70, 0x7c01d700, 0x482f301e, 0x091e21fc,
-0x01300fbd, 0x616345d0, 0xf02d4c00, 0x22b5c22d, 0x0f4c0bd7, 0x01800d39,
-0x00000ac0, 0x00000000, 0x800fb005, 0x03fc00f7, 0x4fc00f70, 0xfc083f01,
-0xc05e9074, 0x8d3e257b, 0x0ff0774c, 0x3d00d5c0, 0xf015dc00, 0x014ec013,
-0x547c851b, 0x97c003f0, 0x00000e60, 0x00000000, 0x050f8003, 0x02dc0033,
-0x1b800bf0, 0xac007300, 0xc0029100, 0x0073400c, 0x0e3023fc, 0xe3030fc0,
-0x3002ec08, 0x000cc007, 0x02fc006b, 0x0ed00a37, 0x00000680, 0x00000000,
-0x20070801, 0x036c6013, 0x17420b34, 0x54004101, 0x400d1003, 0x00d50084,
-0x0db083e4, 0xd9030740, 0x5002ec00, 0x04346105, 0x43741091, 0x04400d30,
-0x00000c20, 0x00000000, 0x0003a011, 0x021600c9, 0x13440855, 0x04004104,
-0x40009000, 0x00412203, 0x0c511334, 0xc9010342, 0x18020484, 0x11054044,
-0x12140401, 0x44400950, 0x00000c80, 0x00000000, 0x0031a803, 0x0b6448d9,
-0x164019d1, 0x50004410, 0x200d1003, 0x24d10405, 0x0d920374, 0xd9006740,
-0x520e6403, 0x08354004, 0x027430d1, 0x0c408d51, 0x00000620, 0x00000000,
-0x0a07a802, 0x015d031b, 0x07c01975, 0xcc047240, 0xc003b000, 0x001102b1,
-0x0d70837c, 0xd34067c0, 0x300f4c00, 0x00054005, 0x061c005b, 0x0ac13170,
-0x00000e20, 0x00000000, 0x002d8007, 0x83bd0067, 0x5fc40b30, 0xfc407b02,
-0xf00f7203, 0x01bf045e, 0x2ff003ac, 0xe3102bc4, 0xf003bc00, 0x483ef807,
-0x267c00bf, 0x1fc81730, 0x00000600, 0x00000000, 0x00550802, 0x196c009f,
-0x17040934, 0x5c305301, 0xc1007014, 0x001b40a4, 0x8d30235c, 0xdf2224c9,
-0xf00a6c00, 0x4004d005, 0x024c0213, 0x08c02130, 0x00000420, 0x00000000,
-0x0034a013, 0x0b4413dd, 0xd7442900, 0x6c025100, 0x405d1083, 0x139b04ce,
-0x0d5107f4, 0xfc02a440, 0xd0024400, 0x02704005, 0x224512d1, 0x4c401450,
-0x00000200, 0x00000000, 0x0002a007, 0x0a24138d, 0x97430000, 0x5400c508,
-0x40301008, 0x07c52001, 0x08100714, 0x0d004040, 0xd04a3400, 0x8083000c,
-0x020411c5, 0x1c409cd0, 0x00000a00, 0x00000000, 0x18588004, 0x27a4098d,
-0x5b401a19, 0xa401e501, 0x401e1087, 0x81ec0069, 0x1e502734, 0xfd024840,
-0xd0068401, 0x0479401f, 0x2784ad31, 0x10400fd2, 0x00000200, 0x00000000,
-0x00001012, 0x226c08cf, 0x13c08816, 0x1c00c70c, 0xc0007000, 0x00c74015,
-0x4c31031c, 0x0f0210c0, 0xd0033c04, 0x0307e04c, 0x230c0c83, 0x48c084a0,
-0x00000040, 0x00000000, 0x00bdb802, 0x23dc88fe, 0x1fc00bb0, 0xec08fb41,
-0xc08ff003, 0x40dba636, 0x0ff003fc, 0xff023fd4, 0xf003fc00, 0x023ec00e,
-0x23fc2d7f, 0x0bc04730, 0x00000660, 0x00000000, 0x0097a815, 0x034c009f,
-0x17481970, 0x6c00d605, 0xc811f004, 0x00d71034, 0x6d701b48, 0xd70025c0,
-0xb0130c01, 0x0004d00d, 0x034c00df, 0x57c40530, 0x00000e00, 0x00000000,
-0x00399812, 0x032c00ad, 0x1f488e10, 0x8400e100, 0x840fd003, 0x00bb417e,
-0x8eb04b2c, 0xf6002b40, 0x1143ac04, 0x0038400e, 0x0385002d, 0x4b480612,
-0x00000620, 0x00000000, 0x00d90003, 0x078401ed, 0xda400ed8, 0x8601e510,
-0x4012d000, 0x41e5107a, 0x1e121784, 0xec00e949, 0x9007d408, 0x0048401e,
-0x070641ad, 0x0f401610, 0x00000400, 0x00000000, 0x00f32012, 0x032400dd,
-0x5344cc14, 0x0400c500, 0x480cd003, 0x81890336, 0x0c900364, 0xc1007340,
-0x10452400, 0x0030400c, 0x0705004d, 0x4b400410, 0x00000c20, 0x00000000,
-0x0015a017, 0x61cc007d, 0x52c027f4, 0x6d005700, 0xc005f001, 0x0177005e,
-0x15720144, 0x6f009dc8, 0xb041dc00, 0x0014c005, 0x014d005f, 0x5fc02734,
-0x00000620, 0x00000000, 0x20070012, 0x087c0a1f, 0x07c001f4, 0xfc001a00,
-0xc023f800, 0x081f0007, 0x01f0007c, 0x140407c0, 0x70087801, 0x000fc001,
-0x287c003f, 0x4bc011b0, 0x00000c00, 0x00000000, 0x04370010, 0x260c4197,
-0x74c00830, 0x14049361, 0xc8096002, 0x059b00e7, 0x4d30026c, 0x93202348,
-0x30020000, 0x5024d409, 0x020c0093, 0x43c00930, 0x00000c20, 0x00000000,
-0x00a62001, 0x4644029d, 0xe4400915, 0x54809180, 0x412910a6, 0x008141e7,
-0x79b00244, 0x95002760, 0x100a4400, 0x20204009, 0x0a6c0081, 0x07408910,
-0x00000800, 0x00000000, 0x00a4a018, 0x02450add, 0x24410d14, 0xd400810c,
-0x480b1002, 0x40d91027, 0x09120264, 0x91822760, 0x10024400, 0x002d400c,
-0xa24400b1, 0x63400910, 0x00000200, 0x00000000, 0x02202010, 0x2204088d,
-0x24400810, 0x94088102, 0x402a1022, 0x02901523, 0x08902204, 0x95192340,
-0x10821400, 0x00ad4028, 0x0a2402b1, 0x43480810, 0x00000080, 0x00000000,
-0x0586b01d, 0x584c160f, 0x84c94130, 0x5c164100, 0xc1433258, 0x001a0107,
-0x0130086c, 0x130ac340, 0x34514c0a, 0x0005c000, 0x014c8023, 0x77c00134,
-0x00000ac0, 0x00000000, 0x2137b819, 0x12fc44bf, 0x27c80bf4, 0x7c049f21,
-0xc009b012, 0x00bf052f, 0x09d01a58, 0xbf027fc2, 0xf102ec23, 0x20268809,
-0x0add209f, 0x67c00bf0, 0x00000e60, 0x00000000, 0x012fa818, 0x32cc0cb3,
-0x2f404930, 0xcc03bf00, 0xc019300e, 0x00bb222f, 0x0b30dac4, 0xdf01a4c0,
-0x7012c806, 0x4026c029, 0x52cd0093, 0x60c00b70, 0x00000e00, 0x00000000,
-0x4507081c, 0x38040e1b, 0x0742a114, 0x440a0d05, 0x48015038, 0x14110287,
-0x01b0086c, 0x13008444, 0x11086806, 0x01474011, 0x18440121, 0x71000170,
-0x00000c20, 0x00000000, 0x0323a010, 0x02240081, 0x23480811, 0x20048d00,
-0x01289002, 0x00890123, 0x08109204, 0x8d01a144, 0x500e1082, 0x042f4048,
-0xc20494a1, 0x404009d0, 0x00000e80, 0x00000000, 0x0225a818, 0x02655091,
-0x67600914, 0x64009d00, 0x40091202, 0x00910027, 0x09900264, 0x91012450,
-0x10026400, 0x802f4009, 0x024400b1, 0x61400950, 0x00000620, 0x00000000,
-0x00e78005, 0x02640191, 0x674b0930, 0x6d009f08, 0xc0093002, 0x009b4067,
-0x0830024c, 0x9f0065c0, 0x720a1c00, 0x0023c009, 0x264c4193, 0x14c04878,
-0x00000e20, 0x00000000, 0x04258014, 0x025c149f, 0x27c14df0, 0x1c409f00,
-0xc50df602, 0x109f0163, 0x89f0022c, 0x852077c2, 0xf00e7c00, 0x0027c009,
-0x067c049f, 0x53c00970, 0x00000600, 0x00000000, 0x00010014, 0x404c2217,
-0x07c021f4, 0x4c0c0f02, 0xc401f040, 0x001f0004, 0x4171004c, 0x1b0084c0,
-0x70807c00, 0x480fc001, 0x804c8033, 0x53c02130, 0x00000420, 0x00000000,
-0x089ca014, 0x01c4037d, 0x5dc00510, 0xd4007d10, 0x4005d019, 0xa171041d,
-0x1711056c, 0x51005400, 0x1005f400, 0x10174205, 0x05d40051, 0x53400510,
-0x00000200, 0x00000000, 0x02f2a014, 0x0744099d, 0x63022cd4, 0x0400cd00,
-0x502cd003, 0x83d51060, 0x38508204, 0xc8007000, 0x50253440, 0x0031400c,
-0x4f1400d9, 0x53400c54, 0x00000a00, 0x00000000, 0x18388005, 0x0984006d,
-0x39400e10, 0x94816d02, 0x409cd801, 0x0a711039, 0x2b100ba4, 0xe100d060,
-0x1001b40c, 0x100b480e, 0x47940029, 0x17400a10, 0x00000200, 0x00000000,
-0x00781015, 0x878c018f, 0x7b4016f0, 0x8c206f10, 0xc71ef007, 0x05ef007c,
-0x1a7006cc, 0xeb0078c0, 0x70053c15, 0x007dc01e, 0x04dd01eb, 0x57c01a70,
-0x00000040, 0x00000000, 0x0035b010, 0x1b7d127f, 0x574145f5, 0x7c105f00,
-0xc045d001, 0x004f0016, 0x0cd0837c, 0xdf0197d4, 0xf0036c06, 0x100fc00d,
-0x006c0037, 0x43c009f0, 0x00000660, 0x00000000, 0x004fa800, 0x2fde01b3,
-0x7ec4cfb1, 0xdc017f00, 0xc01f3007, 0x0163006d, 0x1af006e8, 0xff00fcc0,
-0x3005dc01, 0x427f401f, 0x07cc8df3, 0x00c01f30, 0x00000e00, 0x00000000,
-0x028d8015, 0x3384006b, 0x38400eb0, 0x94826900, 0xd10eb043, 0x006b0028,
-0x8af00394, 0xeb191844, 0xb0018400, 0x470b600e, 0x03c55c31, 0x56c00a30,
-0x00000620, 0x00000000, 0x00090000, 0x43340021, 0x38400412, 0x34082d00,
-0x408e9023, 0x0821002e, 0x0ad00284, 0xe50c3b41, 0x10019400, 0x2039400e,
-0x41840ce9, 0x00400b90, 0x00000400, 0x00000000, 0x00c30804, 0x0f240001,
-0x10404494, 0x34001980, 0x4234980b, 0x05090080, 0x1c428314, 0xc000d240,
-0x900b0403, 0x2483400c, 0x05041219, 0x12401818, 0x00000c20, 0x00000000,
-0x44358015, 0x0f580091, 0x38803110, 0x7c001f04, 0xc4bfb007, 0x45f302a3,
-0x09d00344, 0xf502f7c8, 0x34091c06, 0x00f5c005, 0x034c03db, 0x54c04cb4,
-0x00000620, 0x00000000, 0x04270001, 0x035c280f, 0x15c019f0, 0x1c021b00,
-0xc828f0c2, 0x001f0037, 0x09f0031c, 0xdf1005d0, 0xf0037c10, 0x080fc007,
-0x037c0037, 0x07c009f0, 0x00000c00, 0x00000000, 0x001f0080, 0x42ec00bf,
-0x7ed01330, 0xcc003300, 0xc81d3103, 0x03f2103c, 0x1b318bec, 0xe3006fc0,
-0x344d4e80, 0x003fc207, 0x058c00f3, 0x00c00b30, 0x00000c22, 0x00000000,
-0x00c62081, 0x460c111d, 0x1444003b, 0x6c031b04, 0x4001b00f, 0x010f0014,
-0x45b00744, 0xdb400700, 0xb40b5480, 0x000e4027, 0x85440031, 0x07c009b0,
-0x00000802, 0x00000000, 0x12348001, 0x0744219d, 0x34404910, 0x44411521,
-0x40651047, 0x00550024, 0x49500364, 0xd1023300, 0x50086480, 0x08314425,
-0x1b4400d5, 0x04400d10, 0x00000200, 0x00000000, 0x00202010, 0x0306000d,
-0x12401892, 0x24000d00, 0x40001c03, 0x00051024, 0x08910204, 0xc1000340,
-0xd0023400, 0x60024004, 0x01050001, 0x43400890, 0x00000080, 0x00000000,
-0x0016a000, 0x03cc00ad, 0x34c00114, 0x4c002540, 0xd0051003, 0x00151024,
-0x0970036c, 0xe10033c0, 0x74006400, 0x0033c205, 0x014c00d7, 0x00c00930,
-0x00000ac0, 0x00000000, 0x000f9805, 0x03e0003f, 0x1dd20350, 0xfc003b00,
-0xc003e103, 0x003f000b, 0x0bf802fc, 0xff101fc0, 0xb102dc00, 0x000fc007,
-0x81fc803f, 0x15c00af0, 0x00000e60, 0x00000000, 0x048fa803, 0x30ec00b2,
-0x3dc08370, 0x7c601300, 0xc00ef053, 0x04df083c, 0x43600bfc, 0x2c301fc0,
-0x74135e44, 0x013cc02f, 0x00cc14f3, 0x0e820f30, 0x00000e00, 0x00000000,
-0x00971005, 0x084c029b, 0x36484118, 0xf4001100, 0x400dd00b, 0x02f12c34,
-0x6d110bc5, 0x1d141749, 0x1023dc02, 0x20bd406f, 0x200102f3, 0x0c410ff0,
-0x00000c20, 0x00000000, 0x9103a011, 0x08240215, 0x22480510, 0x14544500,
-0x481d9003, 0x08c52075, 0x20501b04, 0x01311340, 0x10032002, 0x0232402c,
-0x503400c5, 0x4f400c50, 0x00000e80, 0x00000000, 0x81958007, 0x04540015,
-0x36400554, 0x74001500, 0x401dd003, 0x00d12075, 0x0d110344, 0x99005740,
-0x50835404, 0x0035400d, 0x107040d1, 0x0c400d50, 0x00000620, 0x00000000,
-0x4027a800, 0x406cc095, 0xb4d00911, 0x58a41444, 0xc00d8003, 0x00df0035,
-0x09710368, 0x9a0917c4, 0x71034c40, 0x4034800d, 0x187d00d7, 0x0ac00d50,
-0x00000e22, 0x00000000, 0x103d8087, 0x01cc09bb, 0x3dc40bb0, 0xf8141b01,
-0xd00fd803, 0x10ff003e, 0x4ff0037c, 0xef003f84, 0xb003bc21, 0x0037c80f,
-0x808c00f7, 0x3fc00ff0, 0x00000600, 0x00000000, 0x00210802, 0x085c401b,
-0x37c089f1, 0x7c021300, 0xc90d3043, 0x00db4036, 0x09f1033c, 0x1f0097c0,
-0x32137c40, 0x0036c80c, 0x495c20d3, 0x0bc80d34, 0x00000420, 0x00000000,
-0x0134a013, 0x03c411a1, 0x64400ed0, 0xc4027320, 0x420c1017, 0x03ef2030,
-0x0d1003d4, 0xfd003740, 0x104bc40a, 0x00ba420f, 0x014400f1, 0x6f408f90,
-0x00000200, 0x00000000, 0x0002a007, 0x01562088, 0x77405090, 0x14030502,
-0x40bcd50f, 0x20c10032, 0x04900314, 0x4921b340, 0x92072700, 0x24f3420c,
-0x2d0000d1, 0x1f600d90, 0x00000a00, 0x00000000, 0x02488804, 0x058441a1,
-0x7a4012d1, 0x940d2d42, 0x401e1087, 0x19e9287a, 0x1e900794, 0x6d005b40,
-0x9017c541, 0x057b429e, 0x058429e9, 0x37441e91, 0x00000200, 0x00000000,
-0x00240012, 0x011c000b, 0x27c005d0, 0x1c1d4700, 0xc00cf017, 0x2dd32036,
-0x14f0233c, 0x4f0373e0, 0xb4172c00, 0x0073c00c, 0x050d05d2, 0x4bc00c20,
-0x00000040, 0x00000000, 0x002da802, 0x01fc0027, 0xadd007f0, 0x0c307308,
-0xc90f3863, 0xc8f7023d, 0x0f300bcc, 0xfe0017c0, 0x70638c08, 0x063cc00c,
-0x016c28d7, 0x0bc10f70, 0x00000660, 0x00000000, 0x1017a011, 0x017c009b,
-0xb64081f0, 0x5c920f00, 0xec5c0103, 0x93df01b5, 0x1df00b60, 0xbf2035c0,
-0x34cb1000, 0x2136c0ad, 0x006c04d9, 0x57402df2, 0x00000e00, 0x00000000,
-0x801d8812, 0x05bc02a0, 0x30404a10, 0xa8a42b00, 0x0cce3033, 0x42ec9538,
-0x0e701384, 0xed813942, 0x50139601, 0x0238408f, 0x00840ec1, 0xcf414ed0,
-0x00000624, 0x00000000, 0x00790083, 0x25240121, 0x6b501250, 0x04256120,
-0x421e1017, 0xa5c90379, 0x1c90a784, 0x3d077a40, 0x1407c403, 0x4979405e,
-0x069481e1, 0x07481ed0, 0x00000400, 0x00000000, 0xd2372812, 0x055440c1,
-0x85413c10, 0x0406c90c, 0x41ac9203, 0x00c904f0, 0x2c500314, 0xdd04b340,
-0x50031410, 0x0031400c, 0x173400c1, 0x4b400cd0, 0x00000c20, 0x00000000,
-0x00dda817, 0x0de05373, 0xd7c07770, 0xc5075101, 0x44231001, 0x005900cd,
-0x0790014c, 0x7f00ce42, 0x31019403, 0x2015c806, 0x11dc005b, 0x5fc004f0,
-0x00000620, 0x00000000, 0x01070012, 0x247c0117, 0x04d00174, 0x3e001f00,
-0xe0213080, 0x001f0207, 0x01f1804c, 0x1f8005c1, 0xb0007c80, 0x20845021,
-0x00488017, 0x4bc001f0, 0x00000c00, 0x00000000, 0x00270810, 0x027c059b,
-0x34c00930, 0x5000d100, 0x4011b002, 0x209d0007, 0x09f0027e, 0x9d300744,
-0x90225405, 0x1025c099, 0x224c0091, 0x40c009f0, 0x00000c20, 0x00000000,
-0x00260005, 0x82740091, 0x24c0a910, 0x7c009100, 0x44015102, 0x00910002,
-0x09d20274, 0x9d080744, 0x100a4f00, 0x01a6c009, 0x46440091, 0x07c02970,
-0x00000800, 0x00000000, 0x4024a01c, 0x02540091, 0x24400c14, 0x44008540,
-0x4061901a, 0x00990007, 0x09d00274, 0x99002740, 0x50025440, 0x00224009,
-0x02448085, 0x604009d1, 0x00000200, 0x00000000, 0x00202010, 0x1a240081,
-0x20600810, 0x34148502, 0x428810a2, 0x02c110a7, 0x88d12234, 0x8d022340,
-0x54227408, 0x02224008, 0x22060285, 0x43508c50, 0x00000080, 0x00000000,
-0x0706b019, 0x105e1413, 0x04c0a430, 0x4c041724, 0x4961b058, 0x541f1507,
-0x61f05874, 0x1d0d87e1, 0xf0595456, 0x0503c1c5, 0x584d1417, 0x74d161f0,
-0x00000ac0, 0x00000000, 0x013f9019, 0x1afc20bf, 0x66106bf0, 0x5c909b00,
-0xc84b7012, 0x209b112e, 0x4bf0127c, 0xaf012fc0, 0xb0124c04, 0x4927c049,
-0x12fc449b, 0x67c049f0, 0x00000e64, 0x00000000, 0x29afa818, 0x627654b3,
-0x2cc14af0, 0xbc02b300, 0xc01bf012, 0x06bf0067, 0x29f01a4c, 0xa7116fc0,
-0x30128c07, 0x052cc02a, 0x12ec0c93, 0x60c04af0, 0x00000e00, 0x00000000,
-0x01870898, 0x10740011, 0x00c32110, 0x74045144, 0x4051d014, 0x041d0503,
-0x81d0103c, 0x110d8740, 0x10744482, 0x04844071, 0x5054020b, 0x72c001f0,
-0x00000c20, 0x00000000, 0x0323a010, 0x123400c1, 0x20644851, 0x34048102,
-0x4328d04a, 0x068d00a3, 0x48d21a14, 0x95232500, 0x10020446, 0x68234029,
-0x1a052881, 0x486028d0, 0x00000e80, 0x00000000, 0x0025a018, 0x02748091,
-0xa0420d10, 0x70019100, 0x4001d000, 0x009d1027, 0x09d00274, 0x91002740,
-0x12004402, 0x00234009, 0x02540091, 0x62400950, 0x00000620, 0x00000000,
-0x40a70005, 0x4a741193, 0x645019f0, 0x74039320, 0x45b1d000, 0x009f06a7,
-0x09f0024c, 0x850063c0, 0x34004500, 0x0025b009, 0x326c0091, 0x14f009d0,
-0x00000e20, 0x00000000, 0x00250010, 0x027c039f, 0xa5c049f0, 0x7c009f00,
-0xc411f000, 0x009f0027, 0x09f0026c, 0x9f026740, 0xf0407810, 0x0024e009,
-0x066c008f, 0x59e009f0, 0x00000600, 0x00000000, 0x00850014, 0x085c0213,
-0x06e04170, 0x4c001300, 0x40613010, 0x20130085, 0x01f0004c, 0x130004c0,
-0x30002408, 0x0006c401, 0x084d0017, 0x50c01070, 0x00000420, 0x00000000,
-0x40540814, 0x01748051, 0x16e037b0, 0xc4027108, 0x40333100, 0x82610017,
-0x0510014c, 0x7d405c40, 0x1004d480, 0x001c45b6, 0x01c40055, 0x50403750,
-0x00000200, 0x00000000, 0x0236a014, 0x03540081, 0x30461910, 0x1606c1a0,
-0x603c1403, 0x04c90031, 0x0c980304, 0xc1027040, 0x112f2602, 0x0031600c,
-0x030600c1, 0x52401c18, 0x00000a00, 0x00000000, 0x80288004, 0x03f400a1,
-0x28410791, 0x94013900, 0x40ae988f, 0x00a9007b, 0xde100784, 0x6d083c40,
-0x90139540, 0x2229400e, 0x07c404e1, 0x16414658, 0x00000200, 0x00000000,
-0x007c1034, 0x179c01a1, 0x78501670, 0x9e41e342, 0xc89e3017, 0x254b4079,
-0x1ff0178c, 0xe30078c0, 0x340fac81, 0x0173c00e, 0x878c8be7, 0x56d01670,
-0x00000040, 0x00000000, 0x0025b010, 0x073c209f, 0xa7c009f1, 0x6f000701,
-0xc26d706b, 0x081700b7, 0x2df0437c, 0x570033e0, 0x70c35e86, 0x0006c01f,
-0x803c04df, 0x41c085f0, 0x00000660, 0x00000000, 0x007fa002, 0x47f801bf,
-0x77d01f38, 0xfc01ff00, 0xc29df007, 0x0df784ff, 0xbdf0477c, 0xf7017dc0,
-0x71076c03, 0x1276c01f, 0x07cc01f6, 0x00c21b30, 0x00000e00, 0x00000000,
-0x00298815, 0x039c00af, 0x68444f18, 0x9c14a900, 0x001e7023, 0x01a1023f,
-0x1cd007b4, 0x6100f040, 0x1017ac82, 0x0067489e, 0x474405c3, 0x56c00210,
-0x00000620, 0x00000000, 0x02390000, 0x23b400ad, 0x38400e10, 0xa440ed20,
-0x41ce9003, 0x2069043b, 0x0e9083a4, 0xa10b3841, 0x12132408, 0x0038400e,
-0x338404ed, 0x00400210, 0x00000400, 0x00000000, 0x00632806, 0x07541285,
-0xe0458c10, 0x14038900, 0x400c5103, 0x00090032, 0x0cd00364, 0x01007440,
-0x14033400, 0x8003400c, 0x000400c1, 0x12000010, 0x00000c20, 0x00000000,
-0x0075a815, 0x1bfc009d, 0xa4501930, 0x2c001f82, 0xc02d9a83, 0x803840bf,
-0x3f9203ec, 0x4126b448, 0x32032c98, 0x002ec00e, 0x074d00ff, 0xd4500b30,
-0x00000620, 0x00000000, 0x02270001, 0x135c019f, 0x34c00df4, 0x5c021b22,
-0xc44df083, 0x02172137, 0x0cf0037c, 0x5f0097d0, 0xf0034c00, 0x00b5c02d,
-0x037c00df, 0x04e020f0, 0x00000c00, 0x00000000, 0x007b0880, 0x036c40ab,
-0x2cc00eb0, 0xfe103302, 0xc00f7007, 0x013d003e, 0x0f3103d4, 0x72207c41,
-0x1113f420, 0x00cc4215, 0x03d400f7, 0x000089f0, 0x00000c22, 0x00000000,
-0x00262081, 0x83440095, 0x35402910, 0x74721110, 0x400cb0a7, 0x120d0035,
-0x0d10036c, 0x5b08d6c0, 0x100f5400, 0x21b44185, 0x004440d7, 0x044201d1,
-0x00000800, 0x00000000, 0x0224a001, 0x03640191, 0x20400d90, 0x76081140,
-0x401d1043, 0x28192034, 0x0d108364, 0xdd022540, 0x508b6600, 0x00214c05,
-0x8344e0c1, 0x054025d0, 0x00000200, 0x00000000, 0x00300010, 0x03040085,
-0x31400410, 0x76000141, 0x405d16a3, 0x000d2031, 0x4c141324, 0x5d130340,
-0x500b1620, 0x11316105, 0x0b1410c1, 0x415004d0, 0x00000080, 0x00000000,
-0x00263000, 0x036c0091, 0x6c4805b0, 0x740a1301, 0xc41d180b, 0x471f003e,
-0x1e1087ec, 0xaf0861e2, 0x741f6c80, 0x0345d051, 0x0f5c0fe7, 0x01e005f2,
-0x00000ac0, 0x00000000, 0x203fb805, 0x03f000f7, 0x3fc00ff0, 0xfc05380a,
-0xc08ff007, 0x9d9f003f, 0x9fc1a3ec, 0x3b01c6c1, 0xb10ffc00, 0x4b7ec001,
-0x346c05d6, 0x16c407f0, 0x00000e60, 0x00000000, 0x020fa003, 0x03bc003b,
-0x2cc083f0, 0xfc003700, 0xc647f803, 0x00fb003f, 0xcf300bcd, 0xb7000ed2,
-0xf0008e00, 0x000fc00b, 0x00ccc033, 0x0fc06f30, 0x00000e00, 0x00000000,
-0x80071801, 0x53740811, 0x90404570, 0x74801300, 0x0025d083, 0x62d103b3,
-0xed900b44, 0x81002c40, 0xd0285400, 0x30344009, 0x81c420d1, 0x0f402d30,
-0x00000c20, 0x00000000, 0x2023a011, 0x83140001, 0x224800d0, 0x34000902,
-0x40245082, 0x22090433, 0x4c921804, 0x85202660, 0x50810600, 0x20354008,
-0x02248005, 0x4f40cc90, 0x00000e80, 0x00000000, 0x08b5a003, 0x03740211,
-0x16402450, 0x74061900, 0x4025d003, 0x00191437, 0x8d900144, 0xd1082460,
-0xd0015481, 0x0034400d, 0x476500d5, 0x1f421d10, 0x00000620, 0x00000000,
-0x40c7a886, 0x037c0011, 0xe6d029f0, 0x7c021b02, 0xc021f001, 0x10db8887,
-0x0d300b4d, 0x970246c8, 0xf0094401, 0x0435801d, 0x056c00d7, 0x23e009a4,
-0x00000e22, 0x00000000, 0x81498007, 0x03fc0077, 0x1dc00bf0, 0xfc003340,
-0x8007f003, 0x00e7400f, 0x0f6003bc, 0xef002fc0, 0xf001fc00, 0x083dc02f,
-0x01d800eb, 0x0fc20bf0, 0x00000602, 0x00000000, 0x01250802, 0x027c0a5f,
-0x23c08d30, 0x7c001700, 0xc025f003, 0x42570091, 0x0c34085c, 0x9f0425c0,
-0x308b6c02, 0x0136c009, 0x0b7c80df, 0x2bc00934, 0x00000420, 0x00000000,
-0x0034a013, 0x02764057, 0x17400d12, 0x74001502, 0xc727d007, 0x00510456,
-0x0d104144, 0xdf0020d0, 0x1483cc0b, 0x0130405c, 0x2f7402dd, 0x4f000914,
-0x00000200, 0x00000000, 0x00922003, 0x2724000d, 0xa3420092, 0x34100408,
-0x4054d003, 0xa0c1c031, 0x00101717, 0x8d028241, 0x10002408, 0x08c34018,
-0x27740e0c, 0x1f420858, 0x00000a00, 0x00000000, 0x004a0800, 0x07f40125,
-0x6b401690, 0xb4012504, 0x4016d007, 0x21c18178, 0x94100704, 0xad006842,
-0x1000e481, 0x1059441a, 0x27b4a9e9, 0x3f403a50, 0x00000200, 0x00000000,
-0x02121016, 0x0334080f, 0xa3c00834, 0x34880700, 0x6404d0c2, 0x00871031,
-0x20300a1c, 0xcf0021d0, 0x34292c02, 0x0013c00c, 0x017c080f, 0x4bc00870,
-0x00000040, 0x00000000, 0x101d8802, 0x23fc2837, 0x3fc80f70, 0xfc203f00,
-0xc006f003, 0x00bf013f, 0x35f0237c, 0xf7022fc0, 0xf011dc40, 0x001ec00e,
-0x01fc08ff, 0x1bc00bb0, 0x00000660, 0x00000000, 0x0037a010, 0x075c021f,
-0x27c00130, 0x7c809720, 0xc001b885, 0x00d30027, 0x2935036c, 0xd70110c0,
-0x3405cc00, 0x0017c01d, 0xcb4c00df, 0x47c40d34, 0x00000e00, 0x00000000,
-0x00299912, 0x039c10ed, 0x0f480210, 0xf400a100, 0x40461003, 0x00e11023,
-0x0c100384, 0xf1043850, 0x1019ec00, 0x001b400e, 0x038400ed, 0x4f400ef0,
-0x00000624, 0x00000000, 0x00790004, 0x06b483ed, 0x6b403e58, 0xb401ad00,
-0x40969007, 0x01c1007b, 0x1a900624, 0x64007c50, 0x12078601, 0x005b400e,
-0x070400ed, 0x07401e90, 0x00000402, 0x00000000, 0x00330012, 0x021450cd,
-0x33400c50, 0x3400c901, 0x448c1007, 0x08d100f3, 0x2c820304, 0x41003040,
-0x10812407, 0x0053400c, 0x03041acd, 0x4b400cd4, 0x00000c20, 0x00000000,
-0x009f8817, 0x155c015f, 0x1fc03756, 0xfc077f00, 0xc036b16d, 0x01514617,
-0x04b0016c, 0x77011cc0, 0x3049cc05, 0x00dfc115, 0xc98c037f, 0x5fc005b8,
-0x00000620, 0x00000000, 0x24058012, 0x005c020f, 0x87c901b0, 0x7c831700,
-0xc011f000, 0x001f2007, 0x0170003d, 0x1f0007c9, 0xf2847c00, 0x0247c001,
-0x407c000f, 0x4bc021f0, 0x00000c00, 0x00000000, 0x00e50810, 0x065c89d3,
-0x20c018f0, 0x7c019300, 0xe049f002, 0x00930260, 0x5935024c, 0x8b0021d0,
-0xf0024c04, 0x00e44008, 0x0a4c429f, 0x40c018b8, 0x00000c20, 0x00000000,
-0x00262001, 0x266c1391, 0x24400970, 0x74329501, 0xc009d006, 0x00910026,
-0x19500a54, 0x91002540, 0xd0027c72, 0x00246009, 0x0244009d, 0x06c42912,
-0x00000800, 0x00000000, 0x0020a01c, 0x02440099, 0x244089c0, 0x74089180,
-0x4009d006, 0x00b10025, 0x0b1006c4, 0x99002748, 0xd0024400, 0x20274009,
-0x0244029d, 0x60446990, 0x00000200, 0x00000000, 0x42302814, 0x22254089,
-0x205088d0, 0x342085c2, 0x4149d022, 0x16a1472b, 0xce105394, 0x89002341,
-0xd00a1408, 0x20a04008, 0x0a45028d, 0x42408804, 0x00000080, 0x00000000,
-0x0586b01d, 0x0814141b, 0x84c161f0, 0x7c001305, 0x4041f108, 0x04130185,
-0x6322104c, 0x1b2817c0, 0xf0d04416, 0x2805c001, 0x004c800f, 0x74c161b5,
-0x00000ac0, 0x00000000, 0x112fa919, 0x12dc0097, 0x2fc04b70, 0xfc00bf09,
-0xc00bf012, 0x809f0126, 0x49f0527c, 0xb700adc4, 0xf002fc24, 0x002ec02b,
-0x0afc22bf, 0x67c04bf4, 0x00000e64, 0x00000000, 0x062fa818, 0x227c00b7,
-0xa7c809f0, 0xfc00b305, 0xc00af00a, 0x18970227, 0x4b3052cc, 0xbb002ce1,
-0x7012e810, 0x0820c34b, 0x12cc00af, 0x64c06f30, 0x00000e00, 0x00000000,
-0x8087081c, 0x00740a11, 0x8741e1d0, 0x74001b01, 0x40a5d010, 0x82050387,
-0x21301854, 0x1b028464, 0x10086c00, 0x10044021, 0x08044017, 0x72c00110,
-0x00000c22, 0x00000000, 0x01210012, 0x1236018d, 0x234008d0, 0x34008981,
-0x4008d002, 0x848d0023, 0x0814c214, 0x81002061, 0x508a0410, 0x0d214008,
-0x0a24148d, 0x48422810, 0x00000e80, 0x00000000, 0x00e52818, 0x02760199,
-0x270229d0, 0x74019901, 0x4009d022, 0x008d4127, 0x09110254, 0xd8002442,
-0x10426402, 0x0d255a09, 0x02240095, 0x62400d10, 0x00000620, 0x00000000,
-0x0027a005, 0x2274039d, 0xa7c019f0, 0x74019b01, 0xc029f01a, 0x1b9d0027,
-0x08326e5c, 0x9304a010, 0x700a4c23, 0x0065c009, 0x1269009f, 0x14c00934,
-0x00000e20, 0x00000000, 0x00258012, 0x037c0097, 0x37c05df1, 0x7c009f00,
-0xc099f002, 0x00970037, 0x0970027c, 0x8f0027c0, 0xf0963c04, 0x0076c039,
-0x025c109f, 0x5bc208f8, 0x00000600, 0x00000000, 0x0e010010, 0x207c0417,
-0x01c001f0, 0x7c001308, 0xc441f008, 0x20130000, 0x1130004c, 0x130006c8,
-0x30a04c00, 0x2004c001, 0x084c0003, 0x50c01130, 0x00000420, 0x00000000,
-0x001ca014, 0x0174127d, 0x154815d0, 0x74117502, 0x60079015, 0x00510414,
-0x271001d4, 0x77001d40, 0x10016c22, 0x04140314, 0x15ec0275, 0x51402710,
-0x00000200, 0x00000000, 0x0032a014, 0x0724018d, 0xb14004d0, 0x3411c900,
-0x482cd203, 0x00c14050, 0x18140746, 0x85207150, 0x10070485, 0x2030401c,
-0x07150241, 0x50480c10, 0x00000a00, 0x00000000, 0x00388001, 0x03b480ad,
-0x184436d0, 0xb440ed04, 0x401e9203, 0x0ce10010, 0x68110994, 0x65041940,
-0x1a03a402, 0x004c140e, 0x83b51065, 0x15400410, 0x00000200, 0x00000000,
-0x00781011, 0x07bc81af, 0x5dc114f2, 0xbc01eb42, 0x401ed207, 0x21e30058,
-0x7e34040c, 0xb7007140, 0x3807cc49, 0x2268801e, 0x079d11e3, 0x54c01234,
-0x00000040, 0x00000000, 0x0035b810, 0x4a7c409f, 0x17c065f0, 0x7800d711,
-0xd009b003, 0x14df0187, 0x0df0007c, 0x9f0035c0, 0xf4037c84, 0x0007c00c,
-0x036d04df, 0x43c001f0, 0x00000660, 0x00000000, 0x027da800, 0x27cc09b3,
-0x6fc01730, 0x8c09e324, 0xc61f3027, 0x01f300dd, 0x1f3007cc, 0xf7007ec0,
-0x30078c01, 0x007dc0de, 0x12cc04ff, 0x08c41f30, 0x00000e00, 0x00000000,
-0x041d1815, 0x03ac08a3, 0x0f4006b0, 0x84406704, 0x41063003, 0x28f1001a,
-0x0f1800ac, 0xfb081941, 0x10139400, 0x001840ce, 0x828404bd, 0x554007b0,
-0x00000620, 0x00000000, 0x10290000, 0x03843029, 0x0b400218, 0xc480f100,
-0x402e1103, 0x00e9421b, 0x0e1400a4, 0xe5003340, 0x1203e410, 0x002960ce,
-0x021442ed, 0x21408a90, 0x00000400, 0x00000000, 0x00412004, 0x03240109,
-0xc3448091, 0x0600c504, 0x4010103b, 0x00c91002, 0x1c022424, 0x89003140,
-0x90032420, 0x2491400c, 0x0214008d, 0x19400010, 0x00000c20, 0x00000000,
-0x00752015, 0x024c0191, 0xbfc0053a, 0x4d01d300, 0xc41d300f, 0x00f90015,
-0x17120364, 0x550032c0, 0x34a36c01, 0x0035c00d, 0x025c035f, 0x75c00190,
-0x00000620, 0x00000000, 0x00b70001, 0x027c0697, 0x87c001f0, 0x7c01d700,
-0xc00d7083, 0x00c70011, 0x05f0837c, 0x5f0107c0, 0x70035c02, 0x10564219,
-0x856c81dd, 0x074029f0, 0x00000c00, 0x00000000, 0x801d0084, 0x23fc03bf,
-0xdfc05730, 0xfc00ff08, 0xc00df803, 0x20f34017, 0x5e40000c, 0x63009dd0,
-0xe00bcc00, 0x082dc01f, 0x078c00a3, 0x04d00380, 0x00000c20, 0x00000000,
-0x04960085, 0x8264859d, 0x85c01140, 0x5e08dd00, 0x44097002, 0x00d90006,
-0x0df00444, 0x1b0447c0, 0xd0074401, 0x1a164419, 0x0444419b, 0x24402054,
-0x00000800, 0x00000000, 0x0034a001, 0x0224009d, 0x87400500, 0x6400dd28,
-0x400dd007, 0x00d90107, 0x05500e45, 0xd1002741, 0xd0024401, 0x0033484d,
-0x1a6403d1, 0x04408158, 0x00000200, 0x00000000, 0x88102810, 0x0224408d,
-0x00420014, 0x14804900, 0x40045003, 0x00c90003, 0x04140204, 0xc9000250,
-0xd0020400, 0x2002400c, 0x01258089, 0x40400854, 0x00000080, 0x00000000,
-0x0006b000, 0x032c00dd, 0x07c00131, 0x74009d00, 0xc00dd003, 0x00f31007,
-0x0552004c, 0xf38005c8, 0xf0024c00, 0x2025c00d, 0x036c80f3, 0x04c00174,
-0x00000ac0, 0x00000000, 0x000f8805, 0x03ec00af, 0x0dc403f0, 0xfc00bf10,
-0xc0037003, 0x00f3100e, 0x0ff880fe, 0xbf000dc0, 0xf002fc00, 0x000fc00f,
-0x00dc00bf, 0x17c80b70, 0x00000e60, 0x00000000, 0x023f8003, 0x03ac00ff,
-0x34c40fb0, 0xfc08f300, 0xc00c300b, 0x42eb003c, 0x0f700b7c, 0xf3003ed0,
-0xf0237000, 0x00bfc02f, 0x73cc00fb, 0x0cd003b0, 0x00000e00, 0x00000000,
-0x00071801, 0x004c201d, 0x06c80112, 0x34001b01, 0x44415000, 0x00150105,
-0x01700074, 0x1520044c, 0xd0007484, 0x01074201, 0x0bc40011, 0x04420110,
-0x00000c60, 0x00000000, 0x1133a011, 0x030414cd, 0x30420410, 0x3404c504,
-0x430c1013, 0x04410411, 0x04509334, 0x41083040, 0xd0012410, 0x00334044,
-0x13241441, 0x444005d0, 0x00000e80, 0x00000000, 0x00858007, 0x8064201d,
-0x04428910, 0x74241541, 0x42215000, 0x00958025, 0x09d01874, 0x95080442,
-0xd0027400, 0x00034049, 0x03250498, 0x0c428154, 0x00000600, 0x00000000,
-0x00afa882, 0x21cc287f, 0x5c501f34, 0xfcd1f500, 0xc02b3021, 0x88f3402d,
-0x0a720ffc, 0xb30a1cc0, 0xf002ec00, 0x24bf401f, 0x834c01fb, 0x08e001f0,
-0x00000e22, 0x00000000, 0x001d8007, 0x869d01ae, 0x27c802f0, 0xb8003b00,
-0xc006c006, 0x0137081f, 0x077284fc, 0x7f106fc0, 0xf001fc00, 0x420f4803,
-0x03dc2037, 0x1fc001a0, 0x00000600, 0x00000000, 0x00a50802, 0x314c0053,
-0x154005f0, 0x4c0ad300, 0xc0093001, 0x00530004, 0x41f0034c, 0x1f0016c0,
-0x30805c00, 0x01b6c005, 0x035c185f, 0x09c481f1, 0x00000420, 0x00000000,
-0x0014a013, 0x0e440191, 0x20600911, 0x6c001b00, 0x40051582, 0x609b0175,
-0x2dc0806d, 0xdd202440, 0xf00b7405, 0x00044209, 0x07c5018d, 0x4c42b620,
-0x00000200, 0x00000000, 0x40122003, 0x8e140085, 0x21440851, 0x24810900,
-0x40045802, 0x80890036, 0x1cd00024, 0xcd002640, 0x104b1401, 0x00006208,
-0x67040389, 0x0d403050, 0x00000800, 0x00000000, 0x0a620804, 0x05840141,
-0x58445412, 0xa609c902, 0x405a1105, 0x2169104a, 0x12d007a4, 0x2d825841,
-0x9014b401, 0x00784016, 0x0784896d, 0x10401214, 0x00000820, 0x00000000,
-0x00121012, 0x021c1087, 0x61500050, 0x2c080301, 0xc4143006, 0x08094016,
-0x45f2140c, 0x4d0062c0, 0x32955c00, 0x0700d051, 0x175c091f, 0x49c00470,
-0x00000840, 0x00000000, 0x002da002, 0x01fc007f, 0x1fc04f70, 0x7428df20,
-0xc00bf011, 0x00df122d, 0x0bf023cc, 0xbf021dc0, 0xf0027c00, 0x023de08f,
-0x23fc01ff, 0x0bc007f0, 0x00000620, 0x00000000, 0x0047a014, 0x004d8117,
-0x06c01934, 0x4c001340, 0xd001b000, 0x209f0024, 0x0932007c, 0x9f0007c0,
-0xd2026d80, 0x00044a19, 0x4b49019f, 0x43404130, 0x00000e00, 0x00000000,
-0x20399932, 0x030400f1, 0x30400610, 0x8400f108, 0x400c1003, 0xc061001c,
-0x061003f0, 0x41003f40, 0xd0018400, 0x00384606, 0x1b84006f, 0x4b40e218,
-0x00000664, 0x00000000, 0x40090000, 0x04a40125, 0x48401010, 0xa4812900,
-0x40121c04, 0x0125004a, 0x12d00496, 0x25104b40, 0xd2848401, 0x20484012,
-0x1704410d, 0x13481650, 0x00000400, 0x00000000, 0x08732036, 0x0b2490c1,
-0xb0420c12, 0x2400d924, 0x401d9203, 0x40c50072, 0x1cd88334, 0xd1003340,
-0xd0070401, 0x0030400c, 0x030420c5, 0x5b400c50, 0x00000c00, 0x00000000,
-0x0017a817, 0x01648057, 0x14d00530, 0x65005b00, 0x4005b009, 0x00570016,
-0x05f0017c, 0x550217c0, 0xf1014ca0, 0x0014c005, 0x0146007d, 0x5fc10570,
-0x00000e20, 0x00000000, 0x220d8012, 0x40dc823f, 0x8dc003f2, 0xdc403700,
-0xc0837a10, 0x0033120d, 0xa31200fc, 0x37000fc4, 0xf020dc08, 0x200ee003,
-0x087c803f, 0x4bc021a0, 0x00000600, 0x00000000, 0x00210810, 0x023c0093,
-0x27e00930, 0x6c019300, 0xc0093202, 0x00830a24, 0x0830020c, 0x930022c0,
-0x30025c00, 0x0867c009, 0x827c009f, 0xc3c10d31, 0x00000420, 0x00000000,
-0x00262001, 0x82748291, 0xe7000910, 0x140f9303, 0xc4091702, 0x009b9025,
-0x2950025c, 0x9d082540, 0xa0024400, 0x00674009, 0x0a740097, 0x05c08900,
-0x00000800, 0x00000000, 0x4024801c, 0x02f402b1, 0x2b400b10, 0xe600b100,
-0x400b1882, 0x20b10028, 0xab1002c4, 0xb9102d40, 0x11029400, 0x022f400b,
-0x421400bd, 0x73440d14, 0x00000200, 0x00000000, 0x00282814, 0x02b408a9,
-0x2b402a10, 0x9408a100, 0x400a1802, 0x88a92229, 0x2a522294, 0xad002940,
-0x80228480, 0x023b408a, 0x0a3409a1, 0x51414c14, 0x000000a0, 0x00000000,
-0x0802b01d, 0x00740213, 0x07400114, 0x2c001342, 0xc2813080, 0x82114004,
-0x0110084e, 0x131007c0, 0x3008540a, 0x0087c020, 0xd07c803f, 0x77c0e120,
-0x00000ac0, 0x00000000, 0x04a7a119, 0x0a7c0697, 0xa7c069f0, 0x7c069f11,
-0xc469f04a, 0x069f00a7, 0x29f01a5c, 0x9784e7c0, 0xf01a7c06, 0x11a7c069,
-0x127c069f, 0x67c049f0, 0x00000e24, 0x00000000, 0x41efa018, 0x16ec05b3,
-0x6dc63930, 0x4c01b301, 0xc0d9301e, 0x0393056c, 0x5900064c, 0xb30167c0,
-0x3016cc05, 0x036cc079, 0x5aec03b3, 0x63c029f1, 0x00000e00, 0x00000000,
-0x0087101c, 0x80440401, 0x05c0e1b0, 0x54821f00, 0x40005008, 0x001b0584,
-0xa110503e, 0x15078740, 0x10004c14, 0x00044001, 0x184c0011, 0x734041f8,
-0x00000c60, 0x00000000, 0x02210812, 0x0a051681, 0xa0400814, 0x05168105,
-0x40681022, 0x86850020, 0x081e0a05, 0x81102340, 0x144a1702, 0x01a07068,
-0x02050681, 0x4b4008d0, 0x00000400, 0x00000000, 0x2025a018, 0x02440091,
-0x264a0990, 0x54009500, 0x40091002, 0x20990024, 0x09100254, 0x95002740,
-0x10025400, 0x00244009, 0x02660091, 0x63401950, 0x00000400, 0x00000000,
-0x00278805, 0x02440093, 0x24c30930, 0x4c009100, 0xc0093002, 0x129504a4,
-0x29300244, 0x930027c1, 0x104a5c12, 0x00244129, 0x024c1293, 0x17c449d2,
-0x00000e20, 0x00000000, 0x40258032, 0x021c008f, 0x25d00970, 0x3c108f00,
-0xd008f402, 0x209f4023, 0x0df2023c, 0x8f0027c1, 0xf0020c00, 0x4023c008,
-0x425c409b, 0x4bc00db0, 0x00000600, 0x00000000, 0x02010810, 0x004c2013,
-0x00c00030, 0x4c001324, 0xc0017000, 0x02030084, 0xa138004e, 0x130000c4,
-0x30084d02, 0x0007c421, 0x007c0603, 0x43c06134, 0x00000420, 0x00000000,
-0x00548014, 0x05c50271, 0xdcc00530, 0xc40071a0, 0x60075001, 0x007f0014,
-0x353801ec, 0x51301c40, 0xb16dec01, 0x201dc005, 0x05f41073, 0x53410530,
-0x00000200, 0x00000000, 0x4032a014, 0x1d0486c9, 0x32500c90, 0x0409414a,
-0x500cde03, 0xc0c14030, 0x3c900304, 0xc1c03050, 0x50032600, 0x0033680c,
-0x0a3400c9, 0x53403090, 0x00000a00, 0x00000000, 0x40308001, 0x408420e9,
-0x30400c12, 0x84006100, 0x408ed033, 0x04e51028, 0x54102380, 0xe1093048,
-0xd2032630, 0x0039408e, 0x47b404e1, 0x07400a12, 0x00000620, 0x00000000,
-0x00780011, 0x058c01eb, 0x4a405e94, 0x0d017100, 0x405ef117, 0x07f10060,
-0x56901784, 0xf10178c4, 0x7207ac81, 0x007fc0de, 0x04fc03eb, 0x47c09e32,
-0x00000040, 0x00000000, 0x08b5a810, 0x003800d3, 0x06c12d60, 0x78005f00,
-0xc02d30db, 0x50df00b7, 0xc1f4137c, 0xdf0237c1, 0xb0037480, 0x0007402d,
-0x036c005f, 0x43c42df5, 0x00000620, 0x00000000, 0x00eda000, 0x04fc01f3,
-0x6cc11f30, 0xcc017f00, 0xc03f3007, 0x09f300fe, 0x11b00fec, 0xbb0275c4,
-0x3113cc25, 0x0374c09f, 0x11cc01bf, 0x03c09b31, 0x00000600, 0x00000000,
-0x06291815, 0x009c00e1, 0x28418f30, 0x144b6004, 0x490f1143, 0x01e50629,
-0x52111394, 0xab067141, 0xb0159404, 0x0479420c, 0x2304000d, 0x57400e10,
-0x00000460, 0x00000000, 0x40690000, 0x00340861, 0x28400e10, 0xa4806502,
-0x408e5803, 0x60e50068, 0x405083a4, 0x81013a40, 0x1213264c, 0x103a480e,
-0x230400ad, 0x03420e90, 0x00000408, 0x00000000, 0x00652004, 0x28148a40,
-0x60401c90, 0x640a4119, 0x404c140b, 0x09c500b0, 0x30102b04, 0x8180f348,
-0x1029300c, 0x008340ac, 0x0346008d, 0x93400c94, 0x00000400, 0x00000000,
-0x40e5a815, 0x007c4a53, 0xd4c03f14, 0xed405500, 0xd03f100f, 0x20f340f4,
-0xb77003ec, 0xd1107ec2, 0x10036c02, 0x0076400f, 0x034d45bd, 0x57c029b1,
-0x00000620, 0x00000000, 0x21270001, 0x403c000f, 0x15c24d70, 0x5c104720,
-0xc00cf013, 0x10db2125, 0x0410433c, 0x9f0431c0, 0xf8431c00, 0x0c31c10c,
-0x826c109f, 0x07c13d70, 0x00000c00, 0x00000000, 0x402f0884, 0x00cc02fb,
-0x6ec00fb0, 0xcc007300, 0x400f3003, 0x00eb402c, 0x133003cc, 0xeb003cc0,
-0x3217ec01, 0x003cc00d, 0x03cc01b3, 0x10c00f30, 0x00000c22, 0x00000000,
-0x02662085, 0x08440391, 0x66420d10, 0x54025b00, 0xc00d9403, 0x00db0037,
-0x85b00344, 0x91003440, 0x90076c01, 0x0006c00d, 0x00450013, 0x15404d10,
-0x00000802, 0x00000000, 0x40348001, 0x18640259, 0x30440c10, 0x46085102,
-0x400d9003, 0x00d90031, 0x21900344, 0x91803440, 0xd0024408, 0x0034600d,
-0x07442481, 0x04481894, 0x00000200, 0x00000000, 0x00302810, 0x02340001,
-0x71500c14, 0x05444102, 0x400c9203, 0x04c91021, 0x40950b05, 0xc1413164,
-0x97402620, 0xd132500c, 0x05042249, 0x41400898, 0x000000a0, 0x00000000,
-0x403ab000, 0x0065005b, 0xa2c00f10, 0xcc01d100, 0x42af300b, 0x01eb0028,
-0x11900bc4, 0x9312f4d0, 0x723e4c00, 0x9174c22f, 0x234c0083, 0x00c00db0,
-0x00000ac0, 0x00000000, 0x003fa025, 0x02cc003f, 0x6ec00f38, 0xbc028f80,
-0xc05f70d7, 0x02df003f, 0x23f087ac, 0xff00fac0, 0x60147c00, 0x020de15f,
-0x07fc05f7, 0x17c20f70, 0x00000e20, 0x00000000, 0x020fb003, 0x59cc08af,
-0x0ec04bf0, 0xec00b343, 0xc402b003, 0x00a7023e, 0x0b300acc, 0xff000ec1,
-0x3002fc04, 0x4008c2cf, 0x33cc0cf3, 0x0cc00b30, 0x00000e00, 0x00000000,
-0x00070003, 0x1344009c, 0x84494930, 0x95025302, 0x420df200, 0x2491203d,
-0x25120344, 0x9d010448, 0x10024440, 0x000440cd, 0x331406c3, 0x0c400950,
-0x00000c20, 0x00000000, 0x0033a013, 0x135444cd, 0x00546c5c, 0x4482dd10,
-0x40005803, 0x30950132, 0x08101304, 0xcd040050, 0x50032482, 0x0003400c,
-0x020408c1, 0x4c501110, 0x00000e80, 0x00000000, 0x0805a803, 0x075400dd,
-0x05500c54, 0x4400d912, 0x420c5240, 0x00d10030, 0x04140344, 0x9d021740,
-0x11037440, 0x0637401d, 0x025400d1, 0x0c401959, 0x00000620, 0x00000000,
-0x0107a880, 0x045d019f, 0x04d09d70, 0x48c2cb00, 0x80055003, 0x00971036,
-0x2d31074c, 0x5f0046c9, 0x54036c06, 0x00a6c00c, 0x23480093, 0x00c00830,
-0x00000e22, 0x00000000, 0x001d8087, 0x02ec05bf, 0x5ec00fb0, 0xdc407300,
-0xc00ff04b, 0x50bf0037, 0x0ff013fc, 0xef804c00, 0xe00bcc05, 0x006cc00f,
-0x07fc40e7, 0x1fc009f0, 0x00000602, 0x00000000, 0x2035080a, 0x035d00df,
-0x15c44ff0, 0x5c02d3c0, 0xc025340b, 0xa0930035, 0x0d20035c, 0x570836c0,
-0xb4037c00, 0x0095c409, 0x034c0093, 0x28c80170, 0x00000420, 0x00000000,
-0x0014a013, 0x030440dd, 0x94402d90, 0x0700f182, 0xc8bdb04b, 0x01c5003e,
-0xafb00d04, 0xf10246c2, 0x10814480, 0x0074404d, 0x034400d5, 0x4ec00b10,
-0x00000200, 0x00000000, 0x0002a007, 0x03240099, 0x456008d0, 0x04008102,
-0x4808d403, 0x02810830, 0x08902714, 0xc5004340, 0x10924700, 0x4017410c,
-0x037400c1, 0x1c4008d0, 0x00000a00, 0x00000000, 0x0468801d, 0x07b441bd,
-0x58419e90, 0x8409f10a, 0x419ed027, 0x01a4007a, 0x1f920f80, 0xe1004a4a,
-0x00278401, 0x005a421e, 0x27b400e5, 0x7e401a93, 0x00000200, 0x00000000,
-0x00300012, 0x0b34088d, 0x15c089f0, 0x0402c102, 0xc008f203, 0x90830130,
-0x0834035c, 0xd70406c0, 0x20435408, 0x2d23c00d, 0x023c88c3, 0x48c048f1,
-0x00000040, 0x00000000, 0x302da802, 0x03cc00bf, 0x1e408fb0, 0xec90ef02,
-0xc20fb28b, 0x00ff003e, 0x0ef0037c, 0xfa001ec0, 0x58035c52, 0x003d400f,
-0x02cc04ff, 0x0bc00b70, 0x00000660, 0x00000000, 0x0007a015, 0x025c00df,
-0x04c14904, 0x5d80c300, 0xc00c709f, 0x21832330, 0x0db0034c, 0xdf0484c4,
-0x32067c00, 0x2034c00d, 0x03cc009b, 0x54c08830, 0x00000e00, 0x00000000,
-0x00398913, 0x02b400e7, 0x1c440c30, 0xc405e102, 0x400e1003, 0x20a10538,
-0x2e1003ec, 0xec000840, 0x1003dc04, 0x003ec00f, 0x03d400e5, 0x4c400e50,
-0x00000624, 0x00000000, 0x00790081, 0x069661ed, 0x5a4d1a90, 0xa605e900,
-0x523f5803, 0x01a1007a, 0x6f900785, 0xec207840, 0x9007b405, 0x1078400e,
-0x06841189, 0x04405b10, 0x00000402, 0x00000000, 0x00332812, 0x033688cd,
-0x12401c10, 0x0540c100, 0x400d183b, 0x00c12034, 0x1d508104, 0xcd005047,
-0x9415340c, 0x00b0401c, 0x061401c5, 0x48408c53, 0x00000c20, 0x00000000,
-0x001da817, 0x41dc015f, 0x16c005b0, 0xdc846b41, 0xc007700d, 0x00730014,
-0x27b005c4, 0x4f00d4c0, 0x9001f400, 0x04580105, 0x4544405b, 0x5cd41610,
-0x00000620, 0x00000000, 0x20070012, 0x007c8017, 0x05d00072, 0x1c001740,
-0xe401f000, 0x401f5807, 0x01b0307c, 0x1f2607c0, 0x70205c00, 0x0107c401,
-0x007d001f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x01270810, 0x027c0093,
-0x34c80d70, 0x4c009700, 0xc0193026, 0x00931024, 0x19b0027a, 0xdf0034e0,
-0xf0024c00, 0x1124c009, 0x023c0083, 0x40d00930, 0x00000c20, 0x00000000,
-0x01e62001, 0x02740091, 0x24400918, 0x4d009b40, 0x5019300e, 0x089b0024,
-0x19100236, 0x9d002454, 0xd1064400, 0x40a5c068, 0x027c0091, 0x04400911,
-0x00000800, 0x00000000, 0x00208018, 0x02140091, 0x20600950, 0x64c095c0,
-0x40ad1002, 0xc0952024, 0x49100274, 0x9d862450, 0xd0064400, 0x44244019,
-0x02440091, 0x60440910, 0x00000200, 0x00000000, 0x62202010, 0x22360081,
-0x20608850, 0x04148982, 0x40881023, 0x088d0120, 0x88100664, 0x9d022040,
-0xd0230434, 0x40a34089, 0x02348081, 0x40408910, 0x00000080, 0x00000000,
-0x0587b01d, 0x581c0011, 0x84d16150, 0x4c841705, 0xc0213058, 0x221702c4,
-0x61342874, 0x1f208441, 0xf2584c8e, 0x0004e961, 0xf85c1e13, 0x74c02130,
-0x00000ac0, 0x00000000, 0x012f9919, 0x12fc14bf, 0x27c049b1, 0xfc00bf41,
-0x644b7012, 0x04bb0267, 0x4a7006fc, 0x9f0127d0, 0xd012f901, 0x00ade04b,
-0x06fc01bf, 0x67c06bfe, 0x00000e64, 0x00000000, 0x2037a018, 0x0a7c8893,
-0xa6816950, 0xd490b701, 0xe08b7092, 0x02a3132c, 0x0a300aec, 0x93002cc1,
-0x7042cc00, 0x04ace06b, 0x524c1293, 0x64c06930, 0x00000e00, 0x00000000,
-0x0287089c, 0x3d344010, 0xccc03110, 0x04025500, 0x40017000, 0x44114904,
-0x2130805c, 0x01080540, 0x10814420, 0x00856461, 0x58542411, 0x72900458,
-0x00000c22, 0x00000000, 0x0523a012, 0x02340481, 0x2a400a11, 0x5400850a,
-0x6048905a, 0x00c100a0, 0x49901334, 0x88252041, 0x50422516, 0x00704028,
-0x02340489, 0x48402810, 0x00000e80, 0x00000000, 0x21258818, 0x02340891,
-0x2c400a10, 0x44089500, 0x02095202, 0x84912024, 0x09101270, 0x88042540,
-0x10822400, 0x00654009, 0x82740099, 0x62480850, 0x00000620, 0x00000000,
-0x44a52805, 0x2a7c0093, 0x66c08934, 0x5c039502, 0x5009b202, 0x81924024,
-0x09b41e74, 0x9b00e0c4, 0x702a6420, 0x08e44009, 0x027c409b, 0x14e42911,
-0x00000e20, 0x00000000, 0x20310016, 0x067e619f, 0x25c019f0, 0x7c008f00,
-0xc0097042, 0x019f2023, 0x09f2065c, 0x970667c0, 0xf0065c00, 0x0027c039,
-0x165c0087, 0x59c009f0, 0x00000600, 0x00000000, 0x88850814, 0x087c001f,
-0x0cd00334, 0x5c001320, 0xc88170a0, 0x011f0007, 0x41f20c52, 0x1f208448,
-0xf0406c00, 0x0004c001, 0x005c001f, 0x50c001b0, 0x00000420, 0x00000000,
-0x81942014, 0x017c005d, 0x15400510, 0x84005300, 0xc217b201, 0x027d0015,
-0x06d009cc, 0x5d005d40, 0xd209c400, 0x001fc116, 0x0144005d, 0x50400510,
-0x00000200, 0x00000000, 0x14328014, 0x032440cd, 0x34600c11, 0x1488c180,
-0x401d580f, 0x00c90823, 0x0cd00354, 0xcd008044, 0xd0072400, 0x0836420c,
-0x035020cd, 0x50400c1a, 0x00000a00, 0x00000000, 0x00388004, 0x039604ed,
-0x09600210, 0x8480c9c0, 0x44029080, 0x09ec212b, 0x06d010a4, 0xed80d848,
-0xd0438400, 0x107b040e, 0x031408ed, 0x14404e10, 0x00000200, 0x00000000,
-0x04581014, 0x07a443ed, 0x7c501f32, 0x9c81e300, 0xc0167405, 0x81ea056b,
-0x1ef01594, 0xef0028c1, 0xf026ac01, 0x083a901e, 0x2f9c35ff, 0x54d15e34,
-0x00000040, 0x00000000, 0x0095b810, 0x037c01df, 0x07d401f1, 0x6c00d740,
-0xc921f001, 0x20df0225, 0x45f1205c, 0xde0037da, 0xd0137c0a, 0x0027c00c,
-0x036c06db, 0x43c0ad70, 0x00000660, 0x00000000, 0x007fa002, 0x07cc21ff,
-0x7fc01f30, 0xfc81bb00, 0xc01f300e, 0x01f7226c, 0x167006ec, 0xfb024cc0,
-0x7004cc03, 0x013ec01e, 0x07cc01f3, 0x08c01ff0, 0x00000e00, 0x00000000,
-0x04298815, 0x038840fc, 0x0b484210, 0x9c04a001, 0x4402f020, 0x00710029,
-0x465000fc, 0xfd040940, 0xb002a408, 0x043ad00e, 0x839408f1, 0x54400fd0,
-0x00000620, 0x00000000, 0x00190000, 0x038408ed, 0x33000e10, 0xb410a924,
-0x40061001, 0x00ed9022, 0x27500084, 0xed001a42, 0x90222510, 0x0030400e,
-0x038400e1, 0x60400ed0, 0x00000400, 0x00000000, 0x00c32806, 0x9f0440cd,
-0x43409010, 0x14008100, 0x48a0d429, 0x01490823, 0x04500014, 0xcd00d340,
-0x824a2427, 0x04a0040c, 0x031408c1, 0x1840bcd0, 0x00000c20, 0x00000000,
-0x0075a815, 0x4d4d00ff, 0x77c00d34, 0x34839b10, 0xc03d3407, 0x10fe002e,
-0x05740ac4, 0xff1012c0, 0x30024d01, 0x0024501d, 0x83cc01f2, 0x74c21fd8,
-0x00000620, 0x00000000, 0x00330001, 0x017c00df, 0x07c000f0, 0x7c009f00,
-0xc041f410, 0xc0d70021, 0x15f00c7c, 0xdf0415e0, 0xb0055c40, 0x0027ca3d,
-0x037c00df, 0x07c90df1, 0x00000c00, 0x00000000, 0x044f0880, 0x01bc00fb,
-0x3cc00f30, 0x7c14a300, 0xd097b000, 0x80fb002c, 0x023040dc, 0xfb100cc4,
-0xf002fc00, 0x0008000e, 0x039c00f3, 0x04c00f30, 0x00000c20, 0x00000000,
-0x03062001, 0x09f400d5, 0x0c500351, 0x54019700, 0x40005004, 0x40cb0024,
-0xb1b22415, 0xd1463441, 0xd00f7400, 0x00c6c015, 0x035480db, 0x04440d50,
-0x00000800, 0x00000000, 0x00168001, 0x097400d1, 0x30400d10, 0x64009140,
-0x400d100e, 0x21d9a024, 0x05104044, 0xd1000750, 0xd20c7400, 0x00f5403d,
-0x035400c9, 0x04420c11, 0x00000200, 0x00000000, 0x00000010, 0x013400c5,
-0x00520050, 0x44008140, 0x40015002, 0x00590020, 0x04100104, 0xc1800748,
-0xd0003400, 0x00334008, 0x031440c8, 0x40400c40, 0x00000080, 0x00000000,
-0x00061000, 0x013c00d3, 0x34c80d14, 0xfc009140, 0xc403b000, 0x00db002c,
-0x03100054, 0xfb0017c0, 0xe002fc00, 0x0015c00d, 0x03dc00fb, 0x04c00f38,
-0x00000ac0, 0x00000000, 0x000fb805, 0x81fc40ff, 0x0fc003f0, 0xfc40be08,
-0xc002f000, 0x003e202f, 0x03f001fc, 0xff001cd2, 0xf202fc00, 0x000ec007,
-0x03fc00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x402f8003, 0x43fc00bb,
-0x3cd08f30, 0xec80f200, 0xc02b9003, 0x20e7213f, 0x0d30038c, 0xff003bc4,
-0xf003dc20, 0x013dc08f, 0x004c081b, 0x0dc80fb0, 0x00000e00, 0x00000000,
-0x04a70001, 0x0bc400db, 0xb4440db0, 0x7420d141, 0x400d0203, 0x00d1023f,
-0x0d900344, 0xfd0d3640, 0xd073ed20, 0x06b4446f, 0x00440411, 0x04410f10,
-0x00000c20, 0x00000000, 0x01b7a011, 0x031400c5, 0xb2505cdc, 0x4400c10c,
-0x4044da07, 0x20d10032, 0x0c508754, 0xcd007140, 0xd0031402, 0x0831482c,
-0x00140089, 0x46404851, 0x00000e80, 0x00000000, 0x0405a803, 0x834401d1,
-0x76401d14, 0x7020d100, 0x491d5007, 0x06d04037, 0xadc00744, 0xd9007742,
-0xd18364a0, 0x0224400d, 0x00550891, 0x0e400910, 0x00000620, 0x00000000,
-0x00a3a802, 0x033c1151, 0x76c001d0, 0x2c02d308, 0xc01db883, 0x82c72033,
-0x1d74031c, 0xdf0037c0, 0xf1035c00, 0x0075ca0d, 0x1154011a, 0x02c009e4,
-0x00000e20, 0x00000000, 0x002d8007, 0x03dc00ef, 0x3dd001f0, 0xfc05ff00,
-0xc00f3003, 0x01ff003f, 0x1f3003cd, 0xff083ec0, 0xf003fc00, 0x0063c00f,
-0x81ac019f, 0x1dd00bf0, 0x00000602, 0x00000000, 0x00f50802, 0x137c04df,
-0x14c008b0, 0x5c12d310, 0xc02df4c3, 0x06d34337, 0x0db0435c, 0xd34037c9,
-0x30035ca8, 0x4034c00d, 0x214d0093, 0x08c00df0, 0x00000420, 0x00000000,
-0x0014a013, 0x43f683d1, 0x75441b14, 0x4c23d100, 0xc20d000f, 0x83d100fe,
-0x0d10034c, 0xe30837c0, 0xb283c400, 0x0826c00f, 0x015c0091, 0x4c420c30,
-0x00000200, 0x00000000, 0x1022a007, 0x0f3400c9, 0x34500098, 0x040bcd10,
-0x420c18af, 0x03cd00b3, 0x8c54a326, 0xc9003360, 0x10033410, 0x0030420d,
-0x16240055, 0x1c404c11, 0x00000a00, 0x00000000, 0x02c88004, 0xa73401e1,
-0xe840b210, 0xc705fd00, 0x401f1117, 0x05e90072, 0x5e502795, 0xe1007900,
-0x8027a429, 0x006a401c, 0x26940965, 0x18409c51, 0x00000200, 0x00000000,
-0x02340012, 0x033410cf, 0x244108b0, 0x0487cf06, 0xc04c5017, 0x11cd0133,
-0x1c70a314, 0xd8013340, 0x30037c00, 0x0030c00c, 0x164c05c7, 0x48c00870,
-0x00000040, 0x00000000, 0x0a2db802, 0x03fc00ff, 0x37c20b70, 0xae10e308,
-0xc00c500b, 0x00f3003d, 0x0d306b6c, 0xff24bfc1, 0xf0435c00, 0x0037c00f,
-0x02fd28fa, 0x0bc02bb0, 0x00000660, 0x00000000, 0x0027a815, 0x137c00d3,
-0x24448d30, 0x3c12dc10, 0xc40db027, 0x03cb41f2, 0x2d301b0c, 0xdb0037c5,
-0x70534c46, 0x2035a41d, 0x4f4c4053, 0x54c069b0, 0x00000e00, 0x00000000,
-0x10018812, 0x53f400e1, 0x38400c90, 0x9e04ef00, 0x400f0213, 0x10e112b8,
-0x4e100384, 0xe5013f40, 0x10138412, 0x1838414e, 0x03c420e1, 0x4ac00a10,
-0x00000620, 0x00000000, 0x00790003, 0x37b401e1, 0x48505e95, 0xb485ed00,
-0x401e5507, 0x79e1017d, 0x7ed40fa5, 0xc508fb62, 0x58070585, 0x0879409e,
-0x07a401e9, 0x0c521cdc, 0x00000402, 0x00000000, 0x20372012, 0x03740fc1,
-0x34400d90, 0x3400c511, 0x40bc5003, 0x00c10031, 0x3cd10f16, 0xc5007340,
-0x10030400, 0x0030400c, 0x232410c9, 0x4a401c50, 0x00000c20, 0x00000000,
-0x445da017, 0x01740271, 0x1cc00711, 0xfc1b3d20, 0x5017706c, 0x0333201d,
-0x03f200ac, 0x5b008fc0, 0x70014c00, 0x0455c005, 0x056c005b, 0x5cc055f0,
-0x00000620, 0x00000000, 0x40070012, 0x087c001f, 0x07c01170, 0x5c001f00,
-0x4441b200, 0x00171004, 0x41209060, 0x1f000740, 0xf0007c00, 0x4007c001,
-0x005c2007, 0x49e020a0, 0x00000c00, 0x00000000, 0x00270010, 0x227c029f,
-0x25c00934, 0x5c021b00, 0xd009b208, 0x14170926, 0x8132206c, 0x960404c0,
-0x30026c00, 0x0022c009, 0x024c0097, 0x41c019d0, 0x00000c20, 0x00000000,
-0x40262801, 0x8e740391, 0xa4400910, 0x5c031102, 0x4009d00c, 0x071701e4,
-0x20100874, 0x89000040, 0x10024401, 0x00274e09, 0x4a540091, 0x144189d0,
-0x00000800, 0x00000000, 0x0064a018, 0x02740091, 0xa4508910, 0x54001900,
-0x4008d008, 0x80150824, 0x01184074, 0x99200441, 0x10022488, 0x00264009,
-0x22e40095, 0x70400992, 0x00000200, 0x00000000, 0x02602010, 0x122410c1,
-0x2040d811, 0x1408c144, 0x6048d022, 0x08850a20, 0x88102274, 0xcd022050,
-0x14220406, 0x85224088, 0x32a50ca1, 0xc05068d2, 0x00000080, 0x00000000,
-0x0c06b01d, 0x317c0017, 0x05d14111, 0x5c161b00, 0xc041b058, 0x96170584,
-0x6134586c, 0x174584c1, 0x10586c04, 0x0102c340, 0x50ec4607, 0x65d051f0,
-0x000008c0, 0x00000000, 0x002f9019, 0x327c00b7, 0x2fc24bf4, 0xfc04bf04,
-0xc12bf012, 0x04bf0127, 0x4ff012fc, 0x93012fc0, 0xf0127c02, 0x042fc009,
-0x125c2c9f, 0x67c46bf0, 0x00000ce0, 0x00000000, 0x00afa818, 0x229c00bb,
-0xbc450fb0, 0xdc0da704, 0xc509d036, 0x13bd00af, 0x1bd046ec, 0xb32c60c1,
-0xf0325c04, 0x00a6c409, 0x129c009f, 0x64e06b30, 0x00000e00, 0x00000000,
-0x4087081c, 0x00440211, 0x94404010, 0x440f5840, 0xc821d13d, 0x871d03c5,
-0x11900444, 0x150d1400, 0xd0004402, 0x02845040, 0x086c0e19, 0x604061b0,
-0x00000c22, 0x00000000, 0x40e3a030, 0x1a340395, 0x23450811, 0x14008d01,
-0x41485a02, 0x409d0022, 0x49c24224, 0x85082045, 0xd01a161c, 0x00204128,
-0x5a04108d, 0x41406894, 0x00000e80, 0x00000000, 0x1025a018, 0x02640099,
-0x264a0910, 0x44a81909, 0x0009d980, 0x461d8005, 0x01900044, 0xd5222070,
-0xd0024440, 0x02244009, 0x02450298, 0x60400990, 0x00000620, 0x00000000,
-0x00278005, 0x0274029b, 0x24c10934, 0x5c030700, 0xc139f004, 0x231e0007,
-0x00c21c6c, 0x9600e4c2, 0xf0025c80, 0x0066c009, 0x0244009f, 0x055099b4,
-0x00000e20, 0x00000000, 0x12658014, 0x021c0397, 0x21d80970, 0x7c011740,
-0xc849f020, 0x411f0005, 0x31b0506c, 0x9b4067c0, 0xf0027c40, 0x0027c009,
-0x027c008f, 0x43c018f0, 0x00000600, 0x00000000, 0x00050014, 0x407e801f,
-0x84c02174, 0x4c421301, 0x4021f898, 0x221f0205, 0x21f0007c, 0x170887c4,
-0x30804c08, 0x0005c001, 0x902c0013, 0x53c10130, 0x00000420, 0x00000000,
-0x029ca814, 0x1df4016d, 0x1cc00651, 0xc6423104, 0xc0056214, 0x1b2d200c,
-0x73700cf4, 0x60201fc0, 0x10014401, 0x00144005, 0x09cc0071, 0x53400710,
-0x00000200, 0x00000000, 0x0016a014, 0x013405c9, 0xe0601c50, 0x0412c900,
-0x440c1003, 0xc0cd04f3, 0x7cd00320, 0xc9203340, 0x90032541, 0x0830480d,
-0x050440c5, 0xd3440c10, 0x00000a00, 0x00000000, 0x04188005, 0x03b402ed,
-0x28414a10, 0x8410f900, 0x009c1213, 0x00ed0239, 0x0ed043b4, 0xed013d40,
-0x9407a484, 0x4178408e, 0x098400e5, 0x17400615, 0x00000200, 0x00000000,
-0x00581011, 0x05b401ed, 0x7cd05e71, 0x8427e940, 0xc81e7107, 0x05ef037b,
-0xfef007bc, 0x4f417b40, 0xb0272c05, 0x41fdc15e, 0x058d8dc7, 0x57801a30,
-0x00000040, 0x00000000, 0x0015b010, 0x017c60df, 0x36d489f4, 0x7d34d300,
-0x410d512b, 0x60db00b6, 0x2d703b74, 0x9322b7c0, 0x700b5c48, 0x05b7f20d,
-0x007c06da, 0x43c009f0, 0x00000660, 0x00000000, 0x005fa800, 0x05f041ff,
-0x6ec0cb41, 0x7c21fb20, 0xc05fb0af, 0x1bf3027c, 0x1ef10ffc, 0xa300f1c0,
-0xf067df01, 0x407cc01f, 0x13cc11f3, 0x08c89734, 0x00000e00, 0x00000000,
-0x10198811, 0x19b400ef, 0x68c24a10, 0x3400c917, 0xc1dfd097, 0x08c1003a,
-0x5e6087b8, 0xeb017840, 0xd0078c04, 0x0079400e, 0x018404e3, 0x56c00614,
-0x00000620, 0x00000000, 0x00990000, 0x01b400ed, 0x99440b50, 0xb408e181,
-0x6c0ed003, 0x58e9303a, 0x4fd003a4, 0x25023d40, 0xd013b600, 0x2038400e,
-0x018420ed, 0x00420290, 0x00000400, 0x00000000, 0x00332800, 0x017613c5,
-0x30400c10, 0x3444c920, 0x503cd1c3, 0x00c90030, 0x3c500714, 0x8d80f102,
-0xd2030420, 0x0031400c, 0x010420c0, 0x1a460090, 0x00000c20, 0x00000000,
-0x0055a031, 0x017401dd, 0xf0c40f50, 0x7c84c308, 0x002f9003, 0x03d96032,
-0x1cd01b74, 0xf74e3dc1, 0xd103f400, 0x003c400f, 0x014c08ff, 0x74a009b1,
-0x00000620, 0x00000000, 0x00530001, 0x087c0a9f, 0x27c001f0, 0x7c02d700,
-0xc04df02b, 0x20d70037, 0x0de08374, 0x51003681, 0xf0037c80, 0x0237c00d,
-0x897c00cf, 0x07e00170, 0x00000c00, 0x00000000, 0x001f0080, 0x254c00f3,
-0x3dc006b4, 0xec00fb40, 0xc80ff003, 0x10f34034, 0x0ff3c3fc, 0x7f003cd0,
-0xe003ec00, 0x003de00d, 0x258c00ff, 0x04d82a32, 0x00000c20, 0x00000000,
-0x00162085, 0x014410c1, 0x76402990, 0x0403d108, 0xc80d904b, 0x00d10034,
-0x0dd10374, 0x0d003448, 0xd0035c20, 0x0037440d, 0x055420dd, 0x84400954,
-0x00000802, 0x00000000, 0x0054a001, 0x014404d9, 0x66522910, 0x74b4d900,
-0x480c9223, 0x21d18874, 0x1d580754, 0x99003640, 0xd1036580, 0x0035400d,
-0x094500dd, 0x04480194, 0x00000200, 0x00000000, 0x00102014, 0x810400c1,
-0x26400010, 0x1408c189, 0x430cd0c3, 0x41c10070, 0x5cd89734, 0x4d013244,
-0xd0031400, 0x0033000c, 0x011402cd, 0x400000d0, 0x00000080, 0x00000000,
-0x0016b000, 0x014500d3, 0x55c001b0, 0x7c02db04, 0x501ff21f, 0x02d31034,
-0xddf0175c, 0x1e207ec0, 0xf117ee00, 0x1179c00f, 0x214c02ff, 0x04c000b0,
-0x00000ac0, 0x00000000, 0x002fb805, 0x01fc007f, 0x31c00ef4, 0xec41ff40,
-0xc00d3057, 0x15ff803d, 0x3df0a37c, 0x3f123dc0, 0xf0235c00, 0x00b7c00f,
-0x85bc45ef, 0x17c00373, 0x00000e60, 0x00000000, 0x000fa003, 0x00fc103b,
-0x1f440330, 0xcd043300, 0xc0c33220, 0x00fb4438, 0x8f3703dc, 0xfb003fc0,
-0x35a3cd00, 0x001cc083, 0x22c804f7, 0x0cc16f30, 0x00000e00, 0x00000000,
-0x00070801, 0x02740013, 0x97400d10, 0x4408d102, 0x40c1541b, 0x00d100bd,
-0x41100144, 0xd5002744, 0x30004400, 0x2b946009, 0x125408d1, 0x04402d52,
-0x00000c20, 0x00000000, 0x4203a011, 0x00301001, 0x11400410, 0x14800108,
-0x40405120, 0x00558000, 0x4c100214, 0x05101340, 0x12030400, 0x44125800,
-0x822400c9, 0x44604c52, 0x00000e80, 0x00000000, 0x28158803, 0x1a7400d9,
-0x17404d10, 0x5400d104, 0x66155003, 0x00558405, 0x05100244, 0x10041640,
-0x10020400, 0x08026000, 0x027600d9, 0x0c410550, 0x00000620, 0x00000000,
-0x0c478802, 0x017c0013, 0x9fc01d34, 0xdc003340, 0xc0017000, 0x454f0264,
-0x2130425c, 0x9b1087c1, 0x301f4c00, 0x00164801, 0x026c40f9, 0x08d0a971,
-0x00000e20, 0x00000000, 0x017d8007, 0x03bc03b7, 0x1fc01ff0, 0xac00ff08,
-0x8003f003, 0x095b006b, 0x03f0203c, 0xa7000bc0, 0x70117c88, 0x101dc003,
-0x0a9c00c3, 0x1fc01bf0, 0x00000600, 0x00000000, 0x01810802, 0x017c005f,
-0x90c00df0, 0x4d000720, 0xc4041020, 0x015f4007, 0xa5302244, 0x970094c4,
-0x70434c02, 0x4114c081, 0x025c00db, 0x0bc020f1, 0x00000420, 0x00000000,
-0x20b48013, 0x037405dd, 0x16c02d70, 0x4000db04, 0x4a05502b, 0x40710027,
-0x05b02a6c, 0x91005442, 0x100344a5, 0x00ec5001, 0x126c40f3, 0x4f4011d0,
-0x00000200, 0x00000000, 0x0002a007, 0x1836120d, 0x70506cd0, 0x340f0500,
-0x4090c500, 0x00800033, 0x1c100904, 0x41007040, 0x10080400, 0x00134130,
-0x023412c0, 0x1f441098, 0x00000a00, 0x00000000, 0x02488004, 0x05b4016d,
-0x78401f50, 0xa409c100, 0x40169027, 0x09e1207b, 0x181005a4, 0x41066850,
-0x10248409, 0x04594052, 0x87a401e1, 0x134012d2, 0x00000200, 0x00000000,
-0x00101012, 0x003c000f, 0x34482cf0, 0x3c000500, 0xc080f020, 0x08830023,
-0x0c13030c, 0x43023040, 0x34220d08, 0x0017c201, 0x023c00c3, 0x4bc108e9,
-0x00000040, 0x00000000, 0x009db802, 0x01fc00ff, 0x3e800ef0, 0x9c00ff02,
-0xc08771a3, 0x08d70047, 0x0ff623fc, 0x7b023bc0, 0xf0a2fc28, 0x040cc063,
-0x03dc10ff, 0x0bc08bf0, 0x00000660, 0x00000000, 0x40f7a015, 0x027c0453,
-0x37c00d30, 0x4d001300, 0xc0453480, 0x099f0137, 0x09f0014c, 0xd30024c8,
-0x30194c01, 0x00169021, 0x02ee01d3, 0x54c05530, 0x00000e00, 0x00000000,
-0x803d8812, 0x03b408e1, 0x33400e10, 0x2c00c180, 0x40861003, 0x00cd043b,
-0x08d00184, 0xe5002050, 0x1021c480, 0x015a4203, 0x02c605e1, 0x48410412,
-0x00000620, 0x00000000, 0x00f90003, 0x06f40169, 0x79411e14, 0x94012100,
-0x44169004, 0x05ad007b, 0x1ed007a6, 0xe900f860, 0x98879411, 0x00104012,
-0x868401e1, 0x0c401e94, 0x00000400, 0x00000000, 0x00732812, 0x07340dc9,
-0x37401c12, 0x2400c100, 0x40849003, 0x04cd00b3, 0x3cd02726, 0xcd007040,
-0x9c275402, 0x01244020, 0x224500c1, 0x4840ac12, 0x00000c20, 0x00000000,
-0x0055a817, 0x4dfc035b, 0x17c02630, 0x5c005348, 0xc405b001, 0x005f045f,
-0x45f00165, 0x5b409442, 0xb0015d00, 0x209ec424, 0x056c0053, 0x5cd01530,
-0x00000620, 0x00000000, 0x20070012, 0x403cc217, 0x87c011f3, 0xf4002f00,
-0xc0017008, 0x001f0183, 0x01f0001e, 0x136007c1, 0x70006490, 0x0007c101,
-0x007c001f, 0x4bc101f0, 0x00000c00, 0x00000000, 0x04370810, 0x027c01df,
-0x25c09934, 0x4c019302, 0xc21db202, 0x00930227, 0x0830927c, 0x9b0420c0,
-0x32867c05, 0x0264c22d, 0x027c0093, 0x43c00d30, 0x00000c20, 0x00000000,
-0x00260001, 0x02740c9d, 0xa7e02910, 0x04099504, 0x4019104a, 0x009110e7,
-0x09120e4c, 0x91002440, 0x10227401, 0x00244009, 0x02740291, 0x07400951,
-0x00000800, 0x00000000, 0x8124a018, 0x0274409d, 0x24510912, 0xc400b120,
-0x40899006, 0x019140a7, 0x0b1442d4, 0xf1022e40, 0x1c0af400, 0x4024400d,
-0x02740391, 0x63400914, 0x00000200, 0x00000000, 0x82202010, 0x0234088d,
-0x20400910, 0x8500e502, 0x40881922, 0x08810523, 0x0a1402a4, 0xa1c02850,
-0x1422b400, 0x02204489, 0x22344081, 0x43408810, 0x00000080, 0x00000000,
-0x0586b01d, 0x503c161f, 0x85440130, 0xcc141335, 0xc161b058, 0x16130107,
-0x4130505c, 0x1b0506e1, 0x3058fc14, 0x0584d021, 0x587c0013, 0x77c16130,
-0x00000ac0, 0x00000000, 0x0127b819, 0x02fc049f, 0x27c00bd0, 0x7c809f01,
-0xc049f012, 0x04bf052f, 0x49f0024e, 0x8f2027c1, 0xf2127c00, 0x012fc049,
-0x12fc028f, 0x67c049f0, 0x00000e60, 0x00000000, 0x022fa018, 0x027c1c9f,
-0x2dc809f0, 0xcc009302, 0xc029315a, 0x0033052f, 0xcb70c2bc, 0x9c202cd0,
-0x11527c14, 0x0124d029, 0x52cc01bb, 0x60c06b30, 0x00000e00, 0x00000000,
-0x0287081c, 0x2874800d, 0x04c003d0, 0x44003101, 0x40605018, 0x01110187,
-0xe110086c, 0x5d028440, 0x11197e82, 0x019cc040, 0x18040211, 0x70400110,
-0x00000c20, 0x00000000, 0x0123a010, 0x02b6448d, 0xa9400bd0, 0x2402a100,
-0x40281012, 0x02c50423, 0x08100214, 0x8d102048, 0x5442b400, 0x462a401a,
-0x420402c1, 0x40422810, 0x00000e80, 0x00000000, 0x2025a818, 0x0374809d,
-0x36400bd0, 0x6400b100, 0x40494802, 0x40950427, 0x49500a44, 0x9c012440,
-0x50021400, 0x2028400a, 0x02040091, 0x60400910, 0x00000620, 0x00000000,
-0x00678805, 0x027c1a9f, 0x25c088d0, 0x6d009320, 0xc4190402, 0x06974067,
-0x09340255, 0x9d0124c0, 0x700a7402, 0x0066c809, 0x024d009b, 0x14d0693c,
-0x00000e20, 0x00000000, 0x22658014, 0x027c00df, 0x25c019f0, 0x5c208f40,
-0xc00df002, 0xe01b0167, 0x08b0123c, 0xdf0027c0, 0xb0027c04, 0x0265c109,
-0x027c008f, 0x53c009f8, 0x00000600, 0x00000000, 0x00050814, 0x004c0a1f,
-0x03c101f1, 0x3c041302, 0xc001b000, 0x02030980, 0x0110007c, 0x170004c0,
-0x34087c02, 0x0484d001, 0x00480113, 0x50840130, 0x00000420, 0x00000000,
-0x11dca014, 0x0146015d, 0x54c125c0, 0xf4115500, 0xc005b009, 0x001b00de,
-0x551035f4, 0x5d015440, 0x10017401, 0x00145025, 0x01440071, 0x50400510,
-0x00000200, 0x00000000, 0x01f2a014, 0x012481cd, 0x536010d0, 0x36000100,
-0x4004543f, 0x00c90230, 0x1c100634, 0xcd007044, 0x10473409, 0x0230600c,
-0x03040041, 0x50401d90, 0x00000a00, 0x00000000, 0x00388005, 0x03a401ed,
-0x08400ad0, 0x3400e500, 0x4036d021, 0x00e9003e, 0x081001a4, 0xed003840,
-0x1041a400, 0x000c600e, 0x0284a061, 0x14402e94, 0x00000200, 0x00000000,
-0x00781015, 0x05a501ed, 0x73c81ed0, 0xbc81e344, 0xc0967417, 0x05eb0058,
-0x1e3106bc, 0xaf0078c0, 0x30073c01, 0x4078c81a, 0x078c0123, 0x54d01fb4,
-0x00000040, 0x00000000, 0x0035b810, 0x035c021f, 0x26440df1, 0x7c009f40,
-0x0821b005, 0x00df1013, 0x09f4837c, 0xdf0837d0, 0xf0037c02, 0x0093c40d,
-0x5a7d000f, 0x43c00d70, 0x00000660, 0x00000000, 0x027fa000, 0xa5fc0bff,
-0x5dc09ef0, 0xdc81f301, 0xc0173107, 0x99e3006f, 0x1b1206cc, 0xff006cc0,
-0x3206cc03, 0x02fcc417, 0x07fc0133, 0x00c01b30, 0x00000e00, 0x00000000,
-0x02198815, 0x63b40ced, 0x18800ed0, 0xac006141, 0x4006b041, 0x30e1412b,
-0x4e1403bc, 0xef003850, 0x10128400, 0x0338404f, 0x22b408a1, 0x54400ab0,
-0x00000620, 0x00000000, 0x22290000, 0x01b600ed, 0x270807d3, 0x0400e103,
-0x40061003, 0x00e1201b, 0x08100224, 0xed003844, 0x91030408, 0x003e6402,
-0x07b400a1, 0x00400810, 0x00000400, 0x00000000, 0x10c22804, 0x0b34060d,
-0x20413cd0, 0x640dc110, 0x40101015, 0x00c10417, 0x2d100b12, 0xc5023040,
-0x906f0400, 0x01f2404d, 0x06740081, 0x10502890, 0x00000c20, 0x00000000,
-0x0345a815, 0x077c025f, 0x37482df0, 0xdc82d320, 0xc455160f, 0x00c30037,
-0x6d300324, 0xdd003440, 0xb4074d00, 0x41f2c02d, 0x167c0053, 0x54c0ad30,
-0x00000620, 0x00000000, 0x00070001, 0x017c084f, 0xa5c085f0, 0x7c00df00,
-0xc005f009, 0x40df00b7, 0x0df0037c, 0xcf0037c0, 0x70017c00, 0x00a5c42d,
-0x037c005f, 0x07c00874, 0x00000c00, 0x00000000, 0x30cf0880, 0x43cc0873,
-0x5fc04ff0, 0xcc804300, 0xc097a003, 0x00f70067, 0x8f3043ec, 0xdf007cc1,
-0x30038d01, 0x003cc05f, 0x22fc0033, 0x00c00f30, 0x00000c22, 0x00000000,
-0x00c62081, 0x01442311, 0xc7411dd0, 0x440fd500, 0x4011b029, 0x01d10027,
-0x1d100e55, 0xdd007452, 0x50034401, 0x41b5424d, 0x03740115, 0x05400910,
-0x00000802, 0x00000000, 0x00b0a001, 0x03441011, 0x334009d0, 0x44009122,
-0x4001d00b, 0x84d52627, 0x0d106344, 0xd5293640, 0x18234428, 0x0034420d,
-0x02740851, 0x04404910, 0x00000200, 0x00000000, 0x00102010, 0x01050001,
-0x33400890, 0x0500c500, 0x4000d001, 0x00c50023, 0x0c100304, 0xcd803000,
-0x19030400, 0x0034400c, 0x032400c1, 0x41400c14, 0x00000080, 0x00000000,
-0x0026b000, 0x034c0011, 0x1fc00df0, 0x4d00d300, 0xc001f001, 0x40d70007,
-0x0d30034c, 0xdf003680, 0x34034c00, 0x0034c00d, 0x02bc0093, 0x00c00930,
-0x00000ac0, 0x00000000, 0x000fb805, 0x01fc003f, 0x1fc007f0, 0xfc003f00,
-0xc203a000, 0x00fb000f, 0x0ff003fc, 0xff003fc0, 0xf003fc00, 0x003bc00f,
-0x03fc00bf, 0x17c00ff0, 0x00000e60, 0x00000000, 0x113ba003, 0xa3ac0023,
-0x3ec08fb0, 0x7c003f00, 0xc04ff080, 0x44f9203e, 0x0f9013ec, 0xbf011fc0,
-0xf012ec00, 0x013ec04f, 0x03cc00ff, 0x0cc00fb0, 0x00000e00, 0x00000000,
-0x03370801, 0x1bf40411, 0x30c0ef10, 0x44004d00, 0x402e1080, 0x0af1203c,
-0x2f500bcc, 0x41021040, 0x10090402, 0x25bc40af, 0x035400dd, 0x04400c10,
-0x00000c20, 0x00000000, 0x0433a031, 0x0b341001, 0x32400cd0, 0x24400500,
-0x408c9001, 0x00c92032, 0x2cd10b24, 0x09103240, 0x920a2488, 0x08b2480c,
-0x034401cd, 0x44414d90, 0x00000e80, 0x00000000, 0x0075a803, 0x03760011,
-0x74400d10, 0x44905d10, 0x400d12c1, 0x00d18835, 0x0d500344, 0xd1003442,
-0x10014400, 0x8036400d, 0x035401dd, 0x0c401d11, 0x00000620, 0x00000000,
-0x0147a802, 0x037c0111, 0x36c00df0, 0x68021700, 0xc40db008, 0x80db0036,
-0x0db1036c, 0x3b101ec8, 0xb002ec02, 0x1036c20d, 0x070c00dd, 0x08d01db0,
-0x00000e20, 0x00000000, 0x00098007, 0x03fc05bf, 0x2fc00db0, 0x4c00ff00,
-0xe00fb080, 0x40ff043e, 0x0fb043fc, 0xfb001ec4, 0xb001fc00, 0x083dc00f,
-0x4bfc70ff, 0x1fc00ff0, 0x00000600, 0x00000000, 0x00250802, 0x137d001f,
-0x24c00d70, 0x5c821703, 0xc90d3049, 0x00d30235, 0x0d30036c, 0x1d0036c0,
-0x70127c00, 0x1334c00d, 0x035c00db, 0x09c20d72, 0x00000420, 0x00000000,
-0xc0b4a013, 0x83d409d1, 0xe5400e12, 0x4401d120, 0x682fb009, 0x85f120bc,
-0x1f101be4, 0xd500b442, 0x10494c03, 0x00fc50bf, 0x1f4403c8, 0x4c400c92,
-0x00000200, 0x00000000, 0x2232a007, 0xa7742305, 0xb0400c50, 0x54109580,
-0x443d110a, 0x93d10035, 0x2d100b44, 0x15015445, 0x400a5410, 0x00b0400d,
-0x031403c1, 0x1d400cd0, 0x00000a00, 0x00000000, 0x2af88004, 0x07a40131,
-0x79401e12, 0x942de111, 0x405e91c6, 0x01f1007c, 0x5f1027c4, 0xe1105862,
-0x10058421, 0x0038421c, 0x27c43df1, 0x10401e90, 0x00000200, 0x00000000,
-0x02301012, 0x033d1005, 0x30c20c70, 0x1c1c8700, 0x435c3017, 0x00c32831,
-0x1c30a72e, 0x070630c1, 0x70021c10, 0x0374c1cc, 0x0b1c0ccb, 0x49c00c70,
-0x00000040, 0x00000000, 0x4a3db802, 0x03dc0037, 0x3fc10ff0, 0xec0cfd21,
-0xc00ff013, 0x18e7063b, 0x0ef203bc, 0xf70035c0, 0xe025fc80, 0x13b7c18f,
-0x033c2ecf, 0x0bc80f70, 0x00000660, 0x00000000, 0x10272015, 0x135c0013,
-0x31426d70, 0x4c009300, 0x80cd1212, 0xc4db0132, 0xed70436c, 0x1b2016c0,
-0x33024d01, 0x00f7c44d, 0x2f0c08d3, 0x57040d32, 0x00000e00, 0x00000000,
-0x00290812, 0x4bb400a0, 0x2ac14c10, 0x1420c100, 0x410ce042, 0x14c51438,
-0x0e100b8d, 0xc9001849, 0xb0010c20, 0x1933414e, 0x538504eb, 0x4a402e50,
-0x00000620, 0x00000000, 0x28610003, 0x07343120, 0x7f401ed0, 0xa441a908,
-0x445e9087, 0x85e1217e, 0x5ed10704, 0x2d007b44, 0xd806a401, 0x0279405e,
-0x578491e9, 0x0f401e12, 0x00000400, 0x00000000, 0x10632812, 0x03340181,
-0x20400c90, 0x3412c900, 0x400c1003, 0x00c50030, 0x0c910304, 0xcd003240,
-0xd0010400, 0x0033400c, 0x030400c9, 0x4a401d50, 0x00000c20, 0x00000000,
-0x415d8817, 0x017c0361, 0x5f4005f0, 0x6d025b84, 0xc0058401, 0x4073001e,
-0x06f201c8, 0x5f0017c0, 0xf001ec02, 0x801dc007, 0x00cc0039, 0x5fc50330,
-0x00000620, 0x00000000, 0x00470012, 0x083c011f, 0x87c80170, 0x5c000740,
-0xc820f000, 0x40170885, 0x2172085c, 0x3b0085c8, 0xb100fe24, 0x1087c800,
-0x887c4217, 0x4ac801f0, 0x00000c00, 0x00000000, 0x00230810, 0x066c0193,
-0x65c01930, 0x0c009351, 0xc2395002, 0x248710e2, 0x0936020c, 0x9f0064c2,
-0x12023c00, 0x20249809, 0x405c101f, 0x40c001f0, 0x00000c20, 0x00000000,
-0x08262001, 0x46440a91, 0x2040a834, 0x6c1b9300, 0x4019706e, 0x07914024,
-0x0930424c, 0x9d1626d0, 0x30027600, 0x14244809, 0x6c4c1307, 0x06c00170,
-0x00000800, 0x00000000, 0x00648018, 0x12642291, 0x25400919, 0xd4009984,
-0x40099002, 0x00958026, 0x49101254, 0xfd202440, 0xd01af406, 0x01244269,
-0x0054041d, 0x604409d2, 0x00000200, 0x00000000, 0x08202010, 0x42040891,
-0xa444c818, 0xb606a100, 0x406c150a, 0x228000b0, 0x6d100a05, 0xa900a040,
-0x540ab442, 0x02204228, 0x2204089d, 0x42408843, 0x00000080, 0x00000000,
-0x4386b01d, 0x286c0211, 0x05404530, 0xd4241900, 0xc1413010, 0x10150006,
-0x4010404c, 0x1d000440, 0xf000f480, 0x0504c841, 0x585c161e, 0x74c161e0,
-0x00000ac0, 0x00000000, 0x432f9819, 0x127c04bf, 0x2f8889d0, 0x64029f08,
-0xc409f222, 0x009f20a7, 0x89700270, 0x9f00a7c0, 0xb00a7c02, 0x11278289,
-0x12dc04a6, 0x67c04bf0, 0x00000e60, 0x00000000, 0x01afa018, 0x42ec02b3,
-0x27c14b30, 0x4c009f00, 0xc0c97132, 0x169b0424, 0x49709a4c, 0x9c2165c8,
-0x301e5c07, 0x08a4c089, 0x1ebc01b3, 0x62c199e0, 0x00000e00, 0x00000000,
-0x0117081c, 0x08450411, 0x04406111, 0x140c1709, 0x44215000, 0x46010100,
-0xe1301804, 0x19039450, 0xb0287e0a, 0x014c4000, 0x14741515, 0x704021d0,
-0x00000c20, 0x00000000, 0x01a3a010, 0x52040085, 0x29030850, 0x8490ad04,
-0x40ca1832, 0x04a96428, 0x0a503284, 0xad042851, 0x12028400, 0x81af486a,
-0x1a34028d, 0x424049d0, 0x00000e80, 0x00000000, 0x0025a818, 0x03440091,
-0x24400952, 0xd420fd00, 0x400b5012, 0x40b1002c, 0x0b9103d4, 0xb9102c40,
-0x9002f450, 0xc02f400b, 0x0074801d, 0x604009d0, 0x00000620, 0x00000000,
-0x42a7a805, 0x02440093, 0x65400944, 0x4c809d02, 0x50097002, 0x009b0024,
-0x09700245, 0x9d00a4c0, 0x10024402, 0x2027d009, 0x6c7c041b, 0x16c018f0,
-0x00000e20, 0x00000000, 0x00618014, 0x021c059f, 0x25c009b0, 0x7c208700,
-0xc008f002, 0x408f8027, 0x0930826c, 0x9b0826ce, 0xf4022c80, 0x2824c008,
-0x007c4413, 0x53c089f0, 0x00000600, 0x00000000, 0x40840814, 0x04741013,
-0x0ce441b1, 0xbc003300, 0xc0037010, 0x0037290b, 0x427a00b8, 0x23418cc0,
-0x3000fc18, 0x000dc083, 0xc87c0013, 0x52c00130, 0x00000420, 0x00000000,
-0x221ca014, 0x09f41171, 0x16512713, 0x74095110, 0x45855041, 0x095100d7,
-0x0510094c, 0x5100d551, 0x12057402, 0x005008a5, 0x44f40a33, 0x50420510,
-0x00000200, 0x00000000, 0x0072a014, 0x013402d1, 0x3b401dd0, 0xb422e100,
-0x403ed00f, 0x43e500fb, 0x3e504b94, 0xe1007a48, 0x144bb621, 0x0039401e,
-0x0334c1cd, 0x50400c90, 0x00000a00, 0x00000000, 0x00988005, 0x13b400e1,
-0x7f4c8c50, 0xb422e140, 0x400ed203, 0x70e1043b, 0x0c1003b4, 0xe1047a40,
-0x1243b600, 0x00b0400e, 0x17b406e5, 0x14488f90, 0x00000200, 0x00000000,
-0x407c1015, 0x0d3c0163, 0x78405ef0, 0xbe41e300, 0xc01ef107, 0x01e7007b,
-0x1e52079c, 0xe20072c0, 0x34073c01, 0x3079c01e, 0x5fbc13ee, 0x54905eb0,
-0x00000040, 0x00000000, 0x0805b810, 0x057c009f, 0x00000d20, 0x7c001f10,
-0xc0012000, 0x001f0007, 0x01f00140, 0x1f0805c0, 0xf0007c00, 0x004fc001,
-0x837cc6db, 0x41c46c77, 0x00000660, 0x00000000, 0x026ba000, 0x05fc01b3,
-0x7fc01730, 0xcc09fb00, 0xc21f3207, 0x05db007f, 0x1eb007bc, 0xf3007cc0,
-0x3027d401, 0x0278c0de, 0x27fc81f3, 0x00c03ef0, 0x00000e00, 0x00000000,
-0x37298835, 0x01f40020, 0x3f408610, 0x9408e102, 0x400c5023, 0xa5ed013b,
-0x1c109334, 0xeb0938c8, 0xb073ac82, 0x2870408e, 0x0fb405e1, 0x54404ed0,
-0x00000620, 0x00000000, 0x082d0000, 0x01b41060, 0x3a400e10, 0x0600e900,
-0x408e9003, 0x24e9203b, 0x0f1303e4, 0xe1103240, 0x13030400, 0x007c444f,
-0x53b414ed, 0x00680fd3, 0x00000400, 0x00000000, 0x10372804, 0x01340301,
-0x03400c10, 0x14010102, 0x4000d000, 0x800d0003, 0x00100134, 0x09000040,
-0x90082405, 0xa8004000, 0x0f3423cd, 0x10420cd0, 0x00000c20, 0x00000000,
-0x0075a815, 0x01fc22d3, 0x76c00f34, 0x4419db00, 0x420d9203, 0x00db0037,
-0x0d10027c, 0xd10036c0, 0x320f4c13, 0x0038c40d, 0x037c80dd, 0x54d31ff0,
-0x00000620, 0x00000000, 0x10b70001, 0x887c00df, 0x17c02cf0, 0x7c42df00,
-0xc02d700b, 0x00cf08b7, 0x0d720274, 0xdf0037c8, 0xf2137c00, 0x0037c00d,
-0x0b7c00d3, 0x07c00df1, 0x00000c00, 0x00000000, 0x803f0880, 0x04cc1073,
-0x2dc03ff0, 0x8e01c300, 0xc09e7023, 0x09ff203e, 0x0ef202c8, 0xcc08bc18,
-0x3007ac01, 0x093cc00e, 0x57fc31f1, 0x03c00ff0, 0x00000c22, 0x00000000,
-0x04f62081, 0x24440091, 0x30405dd0, 0x44021106, 0x4061b1c0, 0x061d0245,
-0x01d02444, 0x1d000442, 0xb0404401, 0x004450e1, 0x0b7442d1, 0x07400dd0,
-0x00000802, 0x00000000, 0x4074a001, 0x01448089, 0x376409d0, 0x64081108,
-0x40011080, 0x001d0406, 0x61d28054, 0x1d088540, 0x12104404, 0x68264801,
-0x037406d5, 0x07440dd0, 0x00000200, 0x00000000, 0x00302010, 0x80040009,
-0x166008d0, 0x04000140, 0x4000da08, 0x000d0001, 0x00d32015, 0x0d000141,
-0x90000420, 0x80264000, 0x033400c5, 0xc3480cd0, 0x00000080, 0x00000000,
-0x0036b000, 0x004c0059, 0x25c00df0, 0x6d001300, 0xc8817008, 0x011d0006,
-0xf1f80858, 0x1f0005c0, 0x30006d00, 0x02668001, 0x877c01d7, 0x03c00ff0,
-0x00000ac0, 0x00000000, 0x003fb805, 0x00fc0037, 0x3dc00fd0, 0xfc00ff00,
-0xe81fb817, 0x08ff083e, 0x1df006ec, 0xff803ec2, 0xf003fc00, 0x0255c80f,
-0x237c08db, 0x17c20ff0, 0x00000e60, 0x00000000, 0x000f8003, 0x03ec20f3,
-0x3cc00eb0, 0xfc043300, 0xc002f002, 0x0433023e, 0x0f3203cc, 0xff0038c0,
-0xf000ec08, 0x007cc01f, 0x17cc01e3, 0x0cc00f30, 0x00000e00, 0x00000000,
-0x00070001, 0x03c400e1, 0x34400d90, 0x748a1100, 0x4061d003, 0x0011023c,
-0x0f10eb45, 0xfd003441, 0xd0084506, 0x009440a9, 0x21440211, 0x04482f10,
-0x00000c20, 0x00000000, 0x0003a011, 0x031400c9, 0x32400016, 0x34000d00,
-0x4120d103, 0x08052021, 0x4c910314, 0xcd002160, 0xd0080408, 0x02304208,
-0x060408c1, 0x44502c10, 0x00000e80, 0x00000000, 0x0005a803, 0x475500c9,
-0x36400590, 0x74015d00, 0x4009d007, 0x00150025, 0x0d900254, 0xdd00a540,
-0xd0084600, 0x44045105, 0x04440251, 0x0c400d90, 0x00000620, 0x00000000,
-0x04c7a802, 0x0f7c20db, 0x36c12db0, 0x7c201f40, 0xc101f003, 0x0517007d,
-0x0db4035c, 0xdf0255d0, 0xf0006c40, 0x0024d005, 0x034c09d3, 0x08c40d30,
-0x00000e20, 0x00000000, 0x10c58007, 0x024c10f7, 0x7dc85f70, 0xf4007301,
-0xd20bf383, 0x054b9278, 0x0e7027ec, 0xef003ed0, 0xf011fc00, 0x027bc249,
-0x02bd21ef, 0x1f000d76, 0x00000600, 0x00000000, 0x00b10802, 0x0b6d00d3,
-0x24c089b0, 0x4d001f00, 0xc125f003, 0x08d30024, 0x0df0024c, 0xd301e4c0,
-0x300a6c08, 0x0084c040, 0x014c0053, 0x08c00df0, 0x00000420, 0x00000000,
-0x0034a013, 0x2f4402f1, 0xb440ad10, 0x6c2b5d0b, 0x002cd013, 0x01d00424,
-0x1fd02a40, 0xfb006444, 0x1003450a, 0x02844055, 0x28441111, 0x4c400fd0,
-0x00000200, 0x00000000, 0x0032a007, 0x034488c9, 0x34401d91, 0x04000d00,
-0x4800d013, 0x01090060, 0xbcd00744, 0xc100a241, 0x90040401, 0x08b04008,
-0x030401c1, 0x1c400dd2, 0x00000a00, 0x00000000, 0x00788804, 0x078401e9,
-0x78405f18, 0xa4112d00, 0x5012d027, 0x01691060, 0x1cd10784, 0xc9086a40,
-0x92008409, 0x0070501a, 0x068401a1, 0x10400ed1, 0x00000200, 0x00000000,
-0x40000012, 0x410c04cb, 0x30c00cb0, 0x0d005f20, 0xc048d003, 0x00cb0830,
-0x0cf2720d, 0xc30032c0, 0xb0624e20, 0x0000c000, 0x010c0003, 0x48c08cf0,
-0x00000040, 0x00000000, 0x000da802, 0x2bde00f7, 0x3fc04ff0, 0xfe027f00,
-0xc00bf00b, 0x00d70277, 0x8ff022fc, 0xff001dc1, 0x7012dc02, 0x401fc08b,
-0x00fc003f, 0x0bc04ff0, 0x00000660, 0x00000000, 0x0077a015, 0x137c04d7,
-0x34c00c30, 0x3c005f00, 0xc0083003, 0x01130124, 0x0df0034c, 0xdf0024c0,
-0x30004d0a, 0x0034c009, 0x437c0092, 0x57c04df0, 0x00000e00, 0x00000000,
-0x20398812, 0x038412f1, 0x38400e90, 0xb4006720, 0x400ab003, 0x00214428,
-0xced003ac, 0xcd002844, 0xb001ec24, 0x40084002, 0x01b44021, 0x4b410ed0,
-0x00000620, 0x00000000, 0x00790003, 0x059405e5, 0x78401f90, 0xb4016d00,
-0x481e1807, 0x01818070, 0x5cd00684, 0xed007940, 0x900f8461, 0x00684012,
-0x06b401e1, 0x0f409ed0, 0x00000400, 0x00000000, 0x02b32812, 0x071400c1,
-0x30400c90, 0x3401450a, 0x409c9003, 0x0b810030, 0x0dd02766, 0xcd019540,
-0x90072500, 0x01c84002, 0x00b40321, 0x4b400cd0, 0x00000c20, 0x00000000,
-0x001da817, 0x41fd0057, 0x54d02734, 0x7c005f00, 0xd0373001, 0x00734014,
-0x05f0014c, 0x5f009dd0, 0xb00dcc00, 0x0154d025, 0x017e1253, 0x5fc005f0,
-0x00000620, 0x00000000, 0x24070012, 0x006c001f, 0x07c00170, 0x7c081f08,
-0xc011f008, 0x041f0003, 0x21f0087c, 0x1f008680, 0xf2047c00, 0x0007c101,
-0x047c101f, 0x4bc801f0, 0x00000c00, 0x00000000, 0x00270810, 0x024c009f,
-0x244109f0, 0x4c00d100, 0xc0083413, 0x00934024, 0x8932027c, 0x834026c0,
-0x70060c00, 0x0020d009, 0x023c0093, 0x43c00930, 0x00000c20, 0x00000000,
-0x08262001, 0x0244009d, 0x24500915, 0x05009140, 0xc0b91002, 0x08910025,
-0x29120a74, 0x9100e445, 0x10064508, 0x00a44108, 0x0a740091, 0x07400914,
-0x00000800, 0x00000000, 0x0024a018, 0x0204008d, 0x21400812, 0x44208500,
-0x40091002, 0x00910026, 0x09900274, 0x91006640, 0xd0124400, 0x00ac4009,
-0x0af408b1, 0x63400910, 0x00000200, 0x00000000, 0x02202010, 0x2204088d,
-0x21408898, 0x06088502, 0x40881003, 0x00816221, 0x88957234, 0x8100a040,
-0x9022040c, 0x0028400a, 0x02b400a1, 0x43404810, 0x00000080, 0x00000000,
-0x0582301d, 0x5804021f, 0x85c22170, 0x4c161700, 0xc1653000, 0x14130586,
-0x61b0197c, 0x130016c1, 0xf2584c03, 0x4004c401, 0x80fc0013, 0x77c0b130,
-0x00000ac0, 0x00000000, 0x012db819, 0x92fd069f, 0x2ec04b70, 0x7c049b01,
-0xc04bf202, 0x80bf012f, 0x497012fc, 0x9f002fc0, 0x7212fc0c, 0x00a3c028,
-0x0a7c029f, 0x67c099f0, 0x00000e60, 0x00000000, 0x0027a018, 0x527c109f,
-0x20c209b0, 0xfc049b0a, 0xc10bb003, 0x04b300ef, 0x6b7042cc, 0xbf002cc0,
-0xf002fc04, 0x0024c00b, 0x034c0093, 0x60c0c930, 0x00000e00, 0x00000000,
-0x22c7081c, 0x0d64431d, 0x44411012, 0x741f3100, 0x40211000, 0x001100c7,
-0x01100844, 0x070006c0, 0xd0007440, 0x40044001, 0x00448011, 0x70400114,
-0x00000c20, 0x00000000, 0x0423a010, 0x42d650ad, 0x2b420a10, 0x3404a100,
-0x41489002, 0x038101a3, 0x28d05224, 0x8d056048, 0xd04a3402, 0x00204008,
-0x82058081, 0x42406810, 0x00000e80, 0x00000000, 0x08258818, 0x02f600bd,
-0x2f426a14, 0x7600b101, 0x40099202, 0x40910127, 0x09960264, 0x95006640,
-0xd0027400, 0x04244009, 0x02441091, 0x62400810, 0x00000620, 0x00000000,
-0x01e7a805, 0x0e5c209f, 0x27c00930, 0x3c099340, 0xc1a9b006, 0x83934027,
-0x08f4262c, 0x9f0024c0, 0xd0127c00, 0x02e4d139, 0x464c0a93, 0x16500930,
-0x00000e20, 0x00000000, 0x3d650014, 0x0a4c009f, 0x64d00971, 0x7c019f00,
-0xc0097026, 0x059f0027, 0x0970025c, 0x9f0027c0, 0xf00e7c00, 0x0477c088,
-0x137c00cf, 0x51c009f0, 0x00000600, 0x00000000, 0x30850814, 0x08fc002f,
-0x0cc82334, 0x4c003340, 0xc0813000, 0x00030003, 0x1130004d, 0x1f0a44d0,
-0xb0284c10, 0x4000c021, 0x100c0013, 0x50c00130, 0x00000420, 0x00000000,
-0x00942014, 0x0134005d, 0x14100518, 0xc4005300, 0x40075001, 0x01730017,
-0x271001c4, 0x7d009c50, 0x30054600, 0x08944427, 0x09440051, 0x50c00510,
-0x00000200, 0x00000000, 0x00b2a014, 0x031480cd, 0x34400c12, 0x2400c500,
-0x401c1005, 0x00890073, 0x0c104e04, 0xcd003248, 0x90061401, 0x00304938,
-0x00060081, 0x50400c14, 0x00000a00, 0x00000000, 0x00388005, 0x00b4402d,
-0x0c400210, 0xa4012108, 0x40065009, 0x11e100bb, 0x4e100e84, 0xad023a40,
-0x9006c403, 0x00304028, 0x028402e0, 0x16404e10, 0x00000200, 0x00000000,
-0x00781015, 0x07dc41ef, 0x78c01e10, 0xad01c720, 0xc0163006, 0x00c94073,
-0x3c3402cc, 0xef007ad0, 0xb1069501, 0x0078c012, 0x060c01c3, 0x54d05f30,
-0x00000040, 0x00000000, 0x0035b810, 0x807c001f, 0x07c001f0, 0x1ca01700,
-0xc005f000, 0x20df0036, 0x1df0027c, 0xdb1035c0, 0x70023c00, 0x01b7d009,
-0x1a7d06df, 0x41c16df0, 0x00000660, 0x00000000, 0x005fa000, 0x87dc01f3,
-0x7cc01f70, 0x8c81f300, 0xc09f7004, 0x01f3007c, 0x1f3007cc, 0x3f007cc0,
-0xf007cc01, 0x21bcc01b, 0x0ccc03f7, 0x00c11ff0, 0x00000e00, 0x00000000,
-0x02198815, 0x40840021, 0x08400334, 0x84002100, 0x40273011, 0x10a34128,
-0x2fb141c4, 0xed000840, 0xd022ac04, 0x02b8420a, 0x628408ed, 0x56c00ed0,
-0x00000620, 0x00000000, 0x00190000, 0x231400c1, 0x38418e50, 0xb400e906,
-0x48025002, 0x00a18038, 0x06d00184, 0x2d003940, 0xd002a400, 0x04384008,
-0x028400e5, 0x00400cd0, 0x00000400, 0x00000000, 0x88132804, 0x1c140001,
-0x00480110, 0x34410900, 0x41001020, 0x00892024, 0x04d20504, 0x8d008140,
-0xd8262480, 0x00f04208, 0x0a040acd, 0x12400cd0, 0x00000c20, 0x00000000,
-0x4035a815, 0x0b5c80d3, 0x74d00d70, 0x3d10db40, 0xe2247005, 0x00938824,
-0x0ff2024c, 0xcf003dd0, 0xf0070c00, 0x0074c1b0, 0x0c4d00d7, 0x54c00ff0,
-0x00000620, 0x00000000, 0x00370001, 0x006c001f, 0x07c40170, 0x4c001720,
-0xe0057001, 0x20d78027, 0x2ca0037c, 0x1f00b640, 0xf0037c00, 0x24b3d025,
-0x107c30cf, 0x07c00df0, 0x00000c00, 0x00000000, 0x003f0880, 0x038c00e3,
-0x3cc00fb0, 0xf400ff00, 0xc8333306, 0x00f34224, 0x5f30028c, 0xbf040ec0,
-0x300fec00, 0x003cc083, 0x00cc00db, 0x00c00e30, 0x00000c22, 0x00000000,
-0x003e2081, 0x00d40031, 0x0c500310, 0x74003900, 0x500110a0, 0x80c1002c,
-0x29500744, 0x1d000440, 0x50075c00, 0x00b54135, 0x080009d0, 0x06c00d10,
-0x00000802, 0x00000000, 0x4010a001, 0x036400d1, 0x34400d90, 0x7400dd90,
-0x40051001, 0x00d90024, 0x0d120754, 0x1d00f440, 0x10034406, 0x00344005,
-0x084400d1, 0x04400d10, 0x00000200, 0x00000000, 0x00102010, 0x00340001,
-0x00480010, 0x74000980, 0x40051101, 0x00894030, 0x04500104, 0x4d000050,
-0x5a035400, 0x40314004, 0x020500c1, 0x42400c14, 0x00000080, 0x00000000,
-0x0012b000, 0x034c00d3, 0x30c00db0, 0x7c00cf00, 0x40013002, 0x009b0024,
-0x0532015c, 0x5f0004d0, 0x30034400, 0x2034c005, 0x024c00d3, 0x00c00f30,
-0x00000ac0, 0x00000000, 0x001fb805, 0x00dc203f, 0x0fc203f0, 0xfc003f00,
-0xc203f100, 0x00a7203f, 0x0bf001fc, 0x6f000fc0, 0xf003fc00, 0x001fc007,
-0x02fc00f7, 0x17c00ff0, 0x00000e60, 0x00000000, 0x003f8003, 0x5bcc1033,
-0x2cc04f70, 0xdc003701, 0xc203f013, 0x40eb023e, 0x0e7183c4, 0x331038c0,
-0x9023ec08, 0x083ce40f, 0x03dc00ef, 0x0fc00ff1, 0x00000e00, 0x00000000,
-0x00330001, 0x0bc40601, 0xb4416e10, 0xe8001b02, 0x4001d00b, 0x0a510134,
-0x0d100344, 0x1109bd48, 0xd09b9404, 0x2034500d, 0x034422fd, 0x07414c10,
-0x00000c20, 0x00000000, 0x0537a011, 0x120410c5, 0x10408c51, 0x04000500,
-0x4000d223, 0x80490133, 0x1cd20704, 0x8904b042, 0xd00b0400, 0x0871401c,
-0x036408dd, 0x47401c90, 0x00000e80, 0x00000000, 0x0065a803, 0x02041815,
-0x34400d10, 0x45801500, 0x4081d003, 0x08512034, 0x1d980744, 0x99203542,
-0xd0035408, 0x0075401d, 0x036100dd, 0x0f401d12, 0x00000620, 0x00000000,
-0x0033a802, 0x074d0317, 0x44d00d50, 0x44039502, 0xc731f003, 0x115b2037,
-0x0cf0034d, 0x5b403444, 0xf0034442, 0x0035400c, 0x6f2e00df, 0x03c00db2,
-0x00000e20, 0x00000000, 0x402d8027, 0x27fc013b, 0x5bc00ef0, 0xec09bb00,
-0xc406f083, 0x11bf003f, 0x0f7003fc, 0x77203bc8, 0xf003dc01, 0x003ec00f,
-0x03cca0ff, 0x1fc00fb0, 0x00000602, 0x00000000, 0x02350802, 0x024d02c7,
-0xb4d00d34, 0x5c085f00, 0xc1013023, 0x0a5f0034, 0x8d71235c, 0xd3103644,
-0x32035c02, 0x0037c8cd, 0xc34c00d3, 0x08c40d70, 0x00000420, 0x00000000,
-0x0064a013, 0x02440a11, 0x3c400f10, 0xfc0a7108, 0xc05b102b, 0x021d013e,
-0xad102b04, 0xb1003c40, 0x1003ec00, 0x00f7463d, 0x0f4507e1, 0x4ec20d10,
-0x00000200, 0x00000000, 0x0072a007, 0x82240005, 0x22400c90, 0x04015500,
-0x401c1007, 0x039d21f4, 0x1cd00714, 0x11003248, 0x10031460, 0x4433442c,
-0x231404c9, 0x1c400c50, 0x00000a00, 0x00000000, 0x00788004, 0x262401e1,
-0x7e481e12, 0xe6057188, 0x54181027, 0x013d0078, 0x1fd007c4, 0x31027842,
-0x14079401, 0x127f401e, 0x078409e9, 0x1a401e10, 0x00000200, 0x00000000,
-0x02300012, 0x232400c7, 0x92c04cb0, 0x0c028700, 0x400c3203, 0x008e0030,
-0xcce0031c, 0x034032c0, 0x30031002, 0x0573c00c, 0x231c00ca, 0x48c00c71,
-0x00000040, 0x00000000, 0x002db802, 0x27cc08ff, 0xb9c02ff0, 0x3c24a700,
-0xc187f4c3, 0x00bf003e, 0xaf2023bc, 0xaf38b7c0, 0xf003ec08, 0x003bc02d,
-0x433c00d7, 0x0bc0aff0, 0x00000660, 0x00000000, 0x0037a015, 0x126c001f,
-0x75c03d70, 0x481cd300, 0x450db113, 0x00572034, 0x6d70137c, 0x1328b7c4,
-0x32136c00, 0x0977c88d, 0x134c10c3, 0x54c0adf0, 0x00000e00, 0x00000000,
-0x00398812, 0x220400ed, 0x78404f10, 0x0404f101, 0x404e1233, 0x00a100bd,
-0x4e1133bc, 0x23013f40, 0x505ba440, 0x04bb404e, 0x238502e3, 0x48400fd0,
-0x00000600, 0x00000000, 0x00790003, 0x078401cd, 0x79409e50, 0xa505e903,
-0x021e9007, 0x03e51178, 0xbe5077a4, 0xb9427b40, 0x50179418, 0x407e411e,
-0x17a401f1, 0x0e405ed0, 0x00000402, 0x00000000, 0x00632812, 0x030400dd,
-0x31400c10, 0x2482c970, 0x409d9003, 0x01810030, 0x0c900314, 0x81003340,
-0x50031401, 0x0033403c, 0x032440c1, 0x4a401cd0, 0x00000c20, 0x00000000,
-0x0015a817, 0x014dc07f, 0x55c40575, 0xec015b03, 0xd885b001, 0x0275101c,
-0x037000f4, 0x790817c0, 0x70017c03, 0x060fc033, 0x60e00073, 0x5ed183d2,
-0x00000620, 0x00000000, 0x12070012, 0x005c001f, 0x06c001f4, 0x5c0c1780,
-0xc0017200, 0x411f0087, 0x4173007c, 0x170007c8, 0xf2006c01, 0x0087c021,
-0x005c0017, 0x49d001f0, 0x00000400, 0x00000000, 0x40a70810, 0x020c0093,
-0x35c40930, 0x4c00df00, 0xc00db002, 0x05970164, 0x8172607c, 0x93402742,
-0x70020c00, 0x0007c111, 0x084d008e, 0x40d00150, 0x00000c20, 0x00000000,
-0x00a20001, 0x02450091, 0xa5c00914, 0x45009d00, 0xc0090402, 0x029511e0,
-0x31100c34, 0x95002744, 0x30026c00, 0x00c5c231, 0x0004039d, 0x04480011,
-0x00000080, 0x00000000, 0x00a42018, 0x02440191, 0x25400914, 0x14008d04,
-0x40095002, 0x82950026, 0x01504076, 0x8d002341, 0xd0025400, 0x010760a1,
-0x0065069d, 0x62400150, 0x00000200, 0x00000000, 0x0a242010, 0x32040881,
-0x21406894, 0x16048d00, 0x406850a2, 0x088120a0, 0x88102274, 0x81012342,
-0x10a2340c, 0x02214088, 0x2304088c, 0x42480952, 0x00000080, 0x00000000,
-0x0086901d, 0x10441613, 0x01c44130, 0x5c481f04, 0x40407050, 0x30148946,
-0x61705876, 0x1f8307c5, 0x70501c15, 0x0597c161, 0x586c121d, 0x76c3c170,
-0x00000a80, 0x00000000, 0x012fb819, 0x0afc04bf, 0x27c26972, 0x6c2c9d04,
-0xd069b092, 0x80bf0327, 0x4b5112be, 0xafb32740, 0xf0126c04, 0x012bc24b,
-0x92fc049f, 0x65c04bb0, 0x00000e60, 0x00000000, 0x802fa018, 0x227c10bf,
-0x25c08938, 0x7c109702, 0xc8893012, 0x00bf152c, 0x5bf216dc, 0x9301a4c1,
-0xf0a25c86, 0x256cc11b, 0x46cc00bf, 0x64c099b0, 0x00000e00, 0x00000000,
-0x0007081c, 0xa874021d, 0x8440a110, 0x74221108, 0x48a39400, 0x041d0d84,
-0x51d05445, 0x19010140, 0x90285604, 0x01c46031, 0x1d448b1d, 0x70400110,
-0x00000c22, 0x00000000, 0x0423a010, 0x1234148d, 0xa1404810, 0xf034a501,
-0x404a104a, 0x12cc2021, 0x48d03204, 0x8901a241, 0xd1122406, 0x0c225149,
-0x4244149d, 0xc04068d0, 0x00000e80, 0x00000000, 0x0025a818, 0x1234009d,
-0x20600910, 0xf400b124, 0x400b9002, 0x009d0824, 0x25d00044, 0x89082742,
-0x90027400, 0x28064001, 0x0047001c, 0x60418850, 0x00000620, 0x00000000,
-0x0227a805, 0x027c129d, 0xe5420930, 0x7c1b9720, 0x90592002, 0x869f8025,
-0x01d1105c, 0x934026c8, 0xf202740c, 0x11066241, 0x0444001d, 0x14d029f1,
-0x00000e20, 0x00000000, 0x00258014, 0x027c099f, 0x27c00974, 0x7c019f02,
-0xc0997002, 0xc08f2427, 0x41f0107c, 0x970021c8, 0xb1025c01, 0x0145c541,
-0x247c001f, 0x53c019b0, 0x00000600, 0x00000000, 0x01050814, 0x007c0413,
-0x06ca00b0, 0xcc023f08, 0xc002f000, 0x00170205, 0x01f0107c, 0x130007c1,
-0x30005220, 0x2387c801, 0x006c841b, 0x50c001f0, 0x00000420, 0x00000000,
-0x001ca014, 0x01740271, 0x14400510, 0x04005d00, 0x4005d001, 0x0071001c,
-0x52d100f4, 0x51001f42, 0x10014c00, 0x00cf4922, 0x64840121, 0x52c007d0,
-0x00000200, 0x00000000, 0x00b2a014, 0x033401c1, 0x32400c90, 0x0400cd00,
-0x420cd003, 0x00cd2070, 0x1cd80f14, 0xc5003340, 0x10033400, 0x0033403c,
-0x0b0503cd, 0x40600cd0, 0x00000a00, 0x00000000, 0x00688005, 0x23b41061,
-0x38400c10, 0x84000d00, 0x5000d000, 0x40690270, 0x8ed00bb4, 0xc5233a40,
-0x10078404, 0x007b408e, 0x038410e5, 0x06404fd0, 0x00000200, 0x00000000,
-0x407c1035, 0x07fc01a3, 0x5ac85eb4, 0x8c00ef10, 0x401ef087, 0x21ef0178,
-0x5ef00fbc, 0xe7007bc3, 0x30171007, 0x157b815e, 0x1f8c01cf, 0x44c4fef0,
-0x00000040, 0x00000000, 0x0025b810, 0x5b7cc01f, 0x15c0ad70, 0x7c001f00,
-0xc401f000, 0x00d70076, 0x4de0537c, 0xdb4437c0, 0xf02b7c62, 0x11b3c06d,
-0x035d06db, 0x43c00cf0, 0x00000660, 0x00000000, 0x005fa000, 0x17fca1f3,
-0x7cc03f30, 0xfc01f700, 0xc09fb007, 0x01f3007a, 0x9ff207cc, 0xf3007ec0,
-0x322f4c03, 0x2474c21f, 0x2fcc1bef, 0x08c01ff2, 0x00000e20, 0x00000000,
-0x10898815, 0x13bc88e1, 0x3ac00f10, 0xb4002b00, 0x40c21020, 0x086b0198,
-0x8ed00384, 0xf1003f4a, 0xb007c400, 0x0570400e, 0x03840ce1, 0x54400ed0,
-0x00000660, 0x00000000, 0x001d0000, 0x333400a9, 0x18400e50, 0xb400e500,
-0x440c9003, 0x10e1082e, 0x0ed00384, 0xe9003b42, 0x98038408, 0x0138500f,
-0x03a480f5, 0x00400ed0, 0x00000400, 0x00000000, 0x00432804, 0x03141389,
-0xd0400c10, 0x74801102, 0x4280d000, 0x91c10000, 0xacd16b05, 0xc9403340,
-0x10034400, 0x20f0423c, 0x6f2400c1, 0x48400cd0, 0x00000c00, 0x00000000,
-0x0435a815, 0x03f400db, 0x34500f60, 0x7840d510, 0xc00db003, 0x0180003a,
-0x3cf00744, 0xf9003fc0, 0x9603c502, 0x00f4401c, 0x0b6600c7, 0x44c1bfe1,
-0x00000600, 0x00000000, 0x50b70001, 0x037c0857, 0x37c80df4, 0x7c001f01,
-0xc1003000, 0x00df80a7, 0x2df2037c, 0xd70033c0, 0xf0837c0c, 0x1137c0cd,
-0x035d20d7, 0x27c00df0, 0x00000c00, 0x00000000, 0x004f0880, 0x03bc01ff,
-0x1ec00fb0, 0x4c00ff00, 0x800f3003, 0x40bf005c, 0x1fb003e0, 0xe3403ec1,
-0x9003cc00, 0x203ec80f, 0x07cc00ff, 0x94400ff0, 0x00000c00, 0x00000000,
-0x20060081, 0x0374205d, 0x14c00d10, 0x45001d00, 0x40011400, 0x01910245,
-0x9dd00354, 0xd1003540, 0x10036c00, 0x0034400d, 0x4b5500dd, 0x14400cd0,
-0x00000802, 0x00000000, 0x8234a001, 0x0374181d, 0x36400c90, 0x5400dd08,
-0x400d1003, 0x03950035, 0x0dd00754, 0xd1003640, 0xd0036400, 0x0074401d,
-0x134621dd, 0x05400dd0, 0x00000200, 0x00000000, 0x80302010, 0x0334000d,
-0x32400c10, 0x04000908, 0x40001000, 0x00910001, 0x0dd80714, 0xc1003040,
-0x10132420, 0x2570501c, 0x0304a1c9, 0x51400cda, 0x00000080, 0x00000000,
-0x0006b000, 0x03fc001f, 0x12c40fb1, 0x5c00df10, 0x400d3003, 0x40970005,
-0x0db0037e, 0xf3403ec8, 0xf007ec00, 0x0976c80d, 0x034c00df, 0x05c00ff0,
-0x00000ac0, 0x00000000, 0x000bb805, 0x03fc003f, 0x1de00ff0, 0xfc003f00,
-0xc003f000, 0x20a7003f, 0x0ff003dc, 0xff003fc0, 0xf20bfc00, 0x057be00e,
-0x03fc00ff, 0x06c80ef0, 0x00000e40, 0x00000000, 0x000fa003, 0x10fc243f,
-0x1fc00330, 0xcc003301, 0xc46f2070, 0x0033023c, 0x033000cc, 0xb3583cc4,
-0xb010cc40, 0x052fc00b, 0x03cc067f, 0x0cc08f30, 0x00000e00, 0x00000000,
-0x00070803, 0x28742a1d, 0x174005b0, 0x445ad102, 0x4089b01b, 0x40114231,
-0x0c100244, 0x91003040, 0x10281400, 0x04a74029, 0x13d4065d, 0x05404e10,
-0x00000c20, 0x00000000, 0x0003a013, 0x0210000d, 0x11600810, 0x05040148,
-0x404c1100, 0x00c12030, 0x0c100314, 0x85001140, 0x18001400, 0x09314028,
-0x4324024d, 0x44404c50, 0x00000e80, 0x00000000, 0x0115a803, 0x0574301d,
-0x17608d90, 0x4500d100, 0x640d9803, 0x00d100b5, 0x00100154, 0x85003550,
-0x10034404, 0x0037401d, 0x0374635d, 0x0d400c50, 0x00000620, 0x00000000,
-0x28a78882, 0x043c031f, 0x1dc12130, 0xcc003301, 0xe20d3400, 0x00932094,
-0x0534235c, 0x9704b5c0, 0xb04d5e00, 0x0227c009, 0x032c015f, 0x08c00d74,
-0x00000e20, 0x00000000, 0x0025800f, 0x01fc02ff, 0x1fc407d0, 0xbc00ff00,
-0xe00af043, 0x05af003f, 0x0ff0076c, 0xbb38bec0, 0xf421fd01, 0x042fc00b,
-0x03dc00ff, 0x1fc00fb1, 0x00000600, 0x00000000, 0x40850802, 0x005c00d3,
-0x13c009f0, 0x7c000700, 0xc40d7000, 0x02d34030, 0xad34023c, 0x970634c1,
-0xb4017c98, 0x4077c109, 0x035c43d3, 0x09c00d30, 0x00000420, 0x00000000,
-0x2014a01b, 0x097600d0, 0x95c05dd0, 0x7404d112, 0x405db003, 0x00f12036,
-0x05106274, 0x91c02440, 0x30817400, 0x00b74049, 0x6bc401d1, 0x4c400fb0,
-0x00000200, 0x00000000, 0x8212a007, 0x40241001, 0x730010d2, 0x34200980,
-0x401cd220, 0x06c10131, 0x18170d34, 0x81207700, 0x10126402, 0x0022442c,
-0x07140051, 0x1d480c16, 0x00000a00, 0x00000000, 0x0048800d, 0x04b409e1,
-0x714012d0, 0xb409e910, 0x401a9227, 0x21e1087b, 0x1e1007b4, 0xa1127a40,
-0x9006b401, 0x006b401e, 0x878409e1, 0x10401e95, 0x00000200, 0x00000000,
-0x01b01012, 0x011c00c1, 0x33c044f0, 0x3c000f44, 0xc08cf020, 0x02810031,
-0x4c31833c, 0x850233c2, 0x30123c00, 0x0027c00c, 0x031c00d3, 0x49c00c30,
-0x00000040, 0x00000000, 0x203db802, 0x01fc20ff, 0x3fc807f0, 0xbc00f702,
-0xc00ff023, 0x00bf023e, 0x09f0017c, 0xbf123dd0, 0x3002fe00, 0x002ec00f,
-0x03be20ff, 0x0bc10ff4, 0x00000660, 0x00000000, 0x1077a015, 0x016e0013,
-0x37c40970, 0x4c001f00, 0xc00d3000, 0x01532137, 0x6d300358, 0x9b8034c0,
-0x32034c01, 0x0030180d, 0x136c001b, 0x57c10d34, 0x00000e00, 0x00000000,
-0x08218913, 0x01ad00e1, 0x33000a10, 0x2c20c110, 0x400ab003, 0x0261023b,
-0x0e100384, 0xa3403c41, 0x1003c500, 0x5039400e, 0x330420a1, 0x4b424e10,
-0x00000620, 0x00000000, 0x00790001, 0x058481e1, 0x7b401e50, 0xa4012580,
-0x401e1004, 0x0589007b, 0x1c104784, 0xe1007a50, 0x18078401, 0x08fa4a1e,
-0x37b60181, 0x0f401e10, 0x00000400, 0x00000000, 0x00b32812, 0x81260ac1,
-0x37446c50, 0x6400c500, 0x400c9003, 0x028101b3, 0x0c1c0706, 0xc900f240,
-0x101b0501, 0x0077401c, 0x03540589, 0x4b400c14, 0x00000c20, 0x00000000,
-0x401da817, 0x11cc0b73, 0x17c82770, 0x6c005f00, 0xc0053001, 0x0a5b4097,
-0x05300d4c, 0x53005ec8, 0x3419cc21, 0x0016c005, 0x017c077b, 0x5fc00530,
-0x00000620, 0x00000000, 0x00870012, 0x487c021f, 0x07c40180, 0xfc002a00,
-0xc001f008, 0x001f0003, 0xa1f0406d, 0x170205c0, 0xf0087c08, 0x0005c081,
-0x006c0017, 0x4bc001f4, 0x00000c00, 0x00000000, 0x04270810, 0x024c008f,
-0x24c00830, 0x44009311, 0x80093002, 0x00930037, 0x0930027c, 0x924424d8,
-0x30263c00, 0x0024c008, 0x025c0083, 0x40d00830, 0x00000c20, 0x00000000,
-0x89262001, 0x0a04029d, 0xe4441950, 0x44009141, 0x4499b002, 0x109b2427,
-0x29120a76, 0x91a02440, 0xb0027403, 0x40a6c209, 0x02448091, 0x044009b4,
-0x00000800, 0x00000000, 0x2064a018, 0x4344109d, 0x24404910, 0xd608b100,
-0x40091002, 0x00912027, 0x0e1442b4, 0x95202040, 0x10025418, 0x00644009,
-0x02540091, 0x60400910, 0x00000200, 0x00000000, 0x02202010, 0x8204008d,
-0x20408850, 0x9408a102, 0x40889022, 0x08800223, 0x8e1022b4, 0x85223040,
-0x90223408, 0x82224088, 0x0a040281, 0x40404890, 0x00000080, 0x00000000,
-0x0586b01d, 0x504d141d, 0x84d16110, 0xdd161325, 0xc1613059, 0x16114583,
-0x63315834, 0x050084c1, 0x30d95c02, 0x0594c160, 0x005c8013, 0x74c0b134,
-0x00000ac0, 0x00000000, 0x012fb119, 0x03bc20af, 0x27c84bf0, 0x6c849f01,
-0xc44be012, 0x04bf0127, 0x49f2137c, 0xb9012fc0, 0xf012fc86, 0x012fc04b,
-0x0a7c02bf, 0x67c099f0, 0x00000e60, 0x00000000, 0x062fa018, 0x127c049b,
-0x6cc12b30, 0x8c059301, 0xc1493006, 0x209b01a7, 0x893212c8, 0x92002040,
-0x111a4c02, 0x01acc029, 0x02fc10bf, 0x60c00930, 0x00000e00, 0x00000000,
-0x4087081c, 0x08740211, 0x85006111, 0x44161141, 0x41411058, 0x14510183,
-0x01105044, 0x11050440, 0x1030440a, 0x01044063, 0x0074021d, 0x7041e172,
-0x00000c20, 0x00000000, 0x0123a012, 0x22340881, 0xa0604c12, 0x14028104,
-0x4008541a, 0x02950363, 0x3a920a14, 0xa1012c44, 0x90128400, 0x01a040ca,
-0xc234348d, 0x40500810, 0x00000e80, 0x00000000, 0x0860a818, 0x027434d1,
-0x24400910, 0x54809100, 0x44095002, 0xc4950023, 0x1b901245, 0xb1042c48,
-0x900a8404, 0x2064400b, 0x0274e29d, 0x60400950, 0x00000620, 0x00000000,
-0x01a7a805, 0x027c8293, 0x24d12934, 0x5d009340, 0xc0097002, 0x03874027,
-0x09b20e5c, 0x9302a4d0, 0xb4024d00, 0x9064f019, 0x027c829f, 0x14c00932,
-0x00000e20, 0x00000000, 0x04258016, 0x0f3c20d7, 0x27c099f0, 0x6d00df00,
-0xc09db002, 0x21d30037, 0x0870026c, 0x9f4066c1, 0x700e7c00, 0x0027c049,
-0x0274009f, 0x53c00970, 0x00000600, 0x00000000, 0x08850814, 0x007c041f,
-0x03c20034, 0x0c000f04, 0xc0017084, 0x02134407, 0x01b0084d, 0x134184c0,
-0x34484c40, 0x0045c101, 0x041c021f, 0x50c00034, 0x00000420, 0x00000000,
-0x01dca014, 0x0170825d, 0x9e400555, 0xc5005d00, 0x41155049, 0x08500097,
-0x3510615c, 0x5100d040, 0x100d4400, 0x149f4135, 0x0dc4415d, 0x50400530,
-0x00000200, 0x00000000, 0x00f2a014, 0x133402cd, 0xb3400c50, 0x05804d02,
-0x40140006, 0x00c10003, 0x3c900e44, 0xd100f040, 0x100b2401, 0x0031603d,
-0x8314018d, 0x50400c90, 0x00000a00, 0x00000000, 0x00288005, 0x03f400ed,
-0x0b400e50, 0x90104d00, 0x40065013, 0x00e1200b, 0x0a102794, 0xe100ac41,
-0x1041a402, 0x002b400a, 0x600411ad, 0x14404e10, 0x00000200, 0x00000000,
-0x00781015, 0x07bc91ef, 0x7b401e74, 0x8d016f20, 0xc116300e, 0x01c3022b,
-0x14b2108c, 0x710058d0, 0x3007ed01, 0x0059c01e, 0x179c01bf, 0x54d03cb0,
-0x00000040, 0x00000000, 0x0025b810, 0x133c06dc, 0x36c00df0, 0x6c021f00,
-0xc041f003, 0x02de0127, 0x09f1032c, 0xdf0027d0, 0xf0015c40, 0x20374009,
-0x847c009f, 0x43c16df0, 0x00000660, 0x00000000, 0x005fa000, 0x8ffc01f3,
-0x7fc01ff1, 0xcc037302, 0x80173007, 0x03f3004f, 0x1f3006cc, 0xbb037cc0,
-0x3006cc01, 0x007fc03f, 0x04ec01f3, 0x00c01f30, 0x00000e00, 0x00000000,
-0x201d8815, 0x0bb408e3, 0x08400fd0, 0xac106b00, 0x4006100b, 0x00ef000b,
-0x4bd002c4, 0xf1422840, 0x70528400, 0x000bc00e, 0x818444b5, 0x54400e54,
-0x00000600, 0x00000000, 0x00290000, 0x03940061, 0x01400ed0, 0x34086980,
-0x41061023, 0x00c900ab, 0x26900094, 0x21051958, 0x18030400, 0x001b400e,
-0x203422e1, 0x00400e10, 0x00000400, 0x00000000, 0x20232804, 0x0b3446c1,
-0x00441cd0, 0x34010900, 0x40001007, 0x00c91023, 0x01d04814, 0x81000540,
-0x50450400, 0x0013400d, 0x01340085, 0x10400d50, 0x00000c20, 0x00000000,
-0x4075a815, 0x0b5c03d3, 0x35c00df0, 0xfc035b00, 0xc0153047, 0x00dbc817,
-0x0d3102dd, 0xd30075c8, 0x300f4d00, 0x0017c915, 0x03fc00d3, 0x54d00f34,
-0x00000620, 0x00000000, 0x02270001, 0x2b7c03c7, 0x05c08df0, 0x6c045f00,
-0xc405f043, 0x00d70013, 0x1d70036c, 0xd70136e0, 0xf0017c00, 0x0095c401,
-0x004c80df, 0x07c00df0, 0x00000c00, 0x00000000, 0x001f0880, 0x43cc00f3,
-0x3fc00fb0, 0xac405300, 0xe4173203, 0x00f3023c, 0x573000ec, 0x63015dc0,
-0x7003cc00, 0x0154c007, 0x039c01e3, 0x01c00d30, 0x00000c22, 0x00000000,
-0x01862001, 0x030400d5, 0x37400d10, 0x44001100, 0xc091b023, 0x06d500b6,
-0x0d160344, 0x51403454, 0x10016c50, 0x54114021, 0x806c09d1, 0x04400db0,
-0x00000802, 0x00000000, 0x0010a001, 0x034400d1, 0x33401d90, 0x46880180,
-0x40005103, 0x00c10094, 0x0d100224, 0x91003540, 0x90220480, 0x201440ad,
-0x005460d1, 0x05400d10, 0x00000200, 0x00000000, 0x00102010, 0x030520c5,
-0x03600810, 0x04000100, 0x4000d001, 0x00c54032, 0x08508204, 0xc1002040,
-0x15022400, 0x00016000, 0x012400c1, 0x40400c90, 0x00000080, 0x00000000,
-0x0006b000, 0x014400d1, 0x07c00db0, 0x4d001340, 0x40017403, 0x00d34030,
-0x0530006c, 0x11001148, 0x71024c00, 0x0814c80d, 0x005c20d3, 0x01c00f30,
-0x00000a80, 0x00000000, 0x000fb805, 0x03fc00ff, 0x0fc00ff0, 0xf4203f00,
-0x8003b003, 0x007f003f, 0x03b200fc, 0x3f000fc4, 0xf000fc80, 0x181f8203,
-0x01fc40ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x003ba003, 0x02cc08fb,
-0x0ec04fb4, 0xfc003f00, 0xc00eb000, 0x08392039, 0x0fb2539c, 0xe3083fc0,
-0x700bcc00, 0x013cc04f, 0x01e81cf3, 0x0cc08f30, 0x00000e00, 0x00000000,
-0x00370801, 0x6a4502d1, 0x07448d11, 0x44044f10, 0x400d1b00, 0x0e110034,
-0x0d120bd4, 0xf702bf41, 0x1020c500, 0x25bd406f, 0xab4c02f5, 0x04404d52,
-0x00000c20, 0x00000000, 0x0037a011, 0x126486c1, 0x02440810, 0x15100d00,
-0x440c5000, 0x24090073, 0x4800d325, 0xc100324a, 0x50134580, 0x0230418c,
-0x036424c9, 0xc4401c50, 0x00000e80, 0x00000000, 0x4135a803, 0x006401d5,
-0x07400910, 0x4402d500, 0x440d5400, 0x80510076, 0x0d100344, 0xd9003741,
-0x00114400, 0x0035400d, 0x234400dd, 0x0c401c50, 0x00000620, 0x00000000,
-0x0033a802, 0x032407d3, 0x46ca19b0, 0x5c021d20, 0xc53dd422, 0x125b3037,
-0x3d34037c, 0xd30037c0, 0x60044d80, 0x0034c20d, 0x0f2c00db, 0x08d00d50,
-0x00000e20, 0x00000000, 0x003d8007, 0x82dd00d3, 0x4fc19b70, 0x7d107f01,
-0xc08f30c6, 0x00a7043d, 0x3ff083fc, 0xf74037c2, 0xf001dc00, 0x003fc00f,
-0x07fc00e7, 0x1fc00ff0, 0x00000600, 0x00000000, 0x00350802, 0x076c02d3,
-0x07c08930, 0x3d001340, 0xc42d2082, 0x025b0036, 0x8930033c, 0xc74033c0,
-0xf0014c04, 0x0034c00d, 0x0b4c00d3, 0x09c00df0, 0x00000420, 0x00000000,
-0x0034a013, 0x014400d1, 0x84402912, 0x5403d101, 0x441c500e, 0x06f100b4,
-0x391003c4, 0xf5203f40, 0xd0010482, 0x003c400f, 0x07c440f1, 0x4c420d10,
-0x00000200, 0x00000000, 0x0032a007, 0x020405d1, 0xc2603892, 0x14009101,
-0x419c5401, 0x138d1076, 0x0c100314, 0xc1003361, 0xd0030401, 0x0034400d,
-0x030400c1, 0x1d400c50, 0x00000a00, 0x00000000, 0x406c8004, 0x0c0519a9,
-0x4840da10, 0x8401e100, 0x409e50c5, 0x0135207c, 0x9e102784, 0xe1907b00,
-0xd1058511, 0x907c041f, 0xc7d401f1, 0x10401f10, 0x00000200, 0x00000000,
-0x00301032, 0x220d0803, 0x02e04d30, 0x1c908300, 0xc00c7401, 0x008f0432,
-0x0c32033c, 0xc74033c0, 0xf2090c00, 0x0130c00c, 0x1a0c00c3, 0x49c00c70,
-0x00000040, 0x00000000, 0x203db802, 0x82dc08b7, 0x0ac44f74, 0x5c88ff02,
-0xc00fa021, 0x006b143f, 0x0bb043fc, 0xff043fc2, 0xf0215c08, 0x003bc08e,
-0x43ac02ef, 0x0bc02e72, 0x00000660, 0x00000000, 0x0027a015, 0x034c009f,
-0x24c00df0, 0x5d009f00, 0xc99db04b, 0x04db00b7, 0x7c32176c, 0xd78936c8,
-0xf0114c13, 0x0934844d, 0x030808d3, 0x54c0ddb0, 0x00000e00, 0x00000000,
-0x00298812, 0x008400ed, 0x38400ed0, 0x0400ed00, 0x044e1003, 0x11a1053f,
-0x8e1033c4, 0xff023040, 0x10413402, 0x0531414c, 0x179c04f5, 0x48400f50,
-0x00000620, 0x00000000, 0x00690003, 0x47a6016d, 0x69401cd0, 0xb4018d0c,
-0x401f0007, 0x09e90179, 0x3a1407a4, 0xe8497a40, 0xd005b425, 0x037840de,
-0xc78401e1, 0x0f705ed2, 0x00000400, 0x00000000, 0x00632812, 0x076409dd,
-0x61401cd1, 0x2400cd00, 0x410c9003, 0x83c10032, 0x30180304, 0xc9003048,
-0x10397480, 0x4031480c, 0x031400c5, 0x4b400c50, 0x00000c20, 0x00000000,
-0x0115a817, 0x01ed007f, 0x99d905f0, 0x7c805f00, 0xc433b409, 0x124b06c9,
-0x8530016c, 0x570016c0, 0xe005dc00, 0x001c8007, 0x01cc0073, 0x5fc003f0,
-0x00000620, 0x00000000, 0x00070012, 0x805c001f, 0x46c001f0, 0x5c021f00,
-0xc8813048, 0x00170085, 0x21f0005c, 0x17a007c2, 0xf0005400, 0x2007c001,
-0x005c001f, 0x488011f0, 0x00000c00, 0x00000000, 0x00270810, 0x024c019f,
-0x24d05830, 0x6c858300, 0xc021b002, 0x11d90046, 0x1db0025c, 0x930026c0,
-0x30027c20, 0x08248408, 0x42480093, 0x43c00171, 0x00000c20, 0x00000000,
-0x00262001, 0x0254119d, 0xa4401912, 0x04079314, 0x4031150e, 0x05930307,
-0x09d00254, 0x91182740, 0x10027408, 0x0026c009, 0x86040093, 0x07400110,
-0x00000800, 0x00000000, 0x00248018, 0x0745089d, 0x34440914, 0xe6009161,
-0x40015012, 0x44950007, 0x89d28254, 0x95502342, 0x10027400, 0x00234009,
-0x12540081, 0x63400150, 0x00000200, 0x00000000, 0x00a02010, 0x3604048d,
-0x26406814, 0x8508a100, 0x408c1062, 0x00858227, 0x88d00204, 0x81842340,
-0x10323004, 0x202340c8, 0x02140881, 0x43408810, 0x00000080, 0x00000000,
-0x0006b01d, 0x504c8c1f, 0x04c04514, 0xec101300, 0xc9617009, 0x0e171507,
-0x05d1b854, 0x131007c1, 0x34507c2c, 0x4387c061, 0x505d1413, 0x77c16170,
-0x00000ac0, 0x00000000, 0x002fb819, 0x12fc0caf, 0x2dcc6bf0, 0x7c209e00,
-0xc04af012, 0x0c8b412f, 0x09b0327d, 0x9d0467c0, 0xf212fc8c, 0x03260469,
-0x02eca09f, 0x67c04bf0, 0x00000e60, 0x00000000, 0x0027a818, 0x72cc08bf,
-0x2fd14bf0, 0xcc12b700, 0xc07bb882, 0x54aa236d, 0x0bf91a4c, 0xb7032ec2,
-0xb00a6c04, 0x00a5c029, 0x42ec0093, 0x63c05c30, 0x00000e00, 0x00000000,
-0x0407081c, 0x09440a1d, 0x04406110, 0x6c000da0, 0x4015187c, 0x26150017,
-0x61d80046, 0x11800141, 0x103c4404, 0x0886c821, 0x084c0201, 0x734001b1,
-0x00000c20, 0x00000000, 0x0923a210, 0x1224848d, 0x25510840, 0x04049d00,
-0x40681402, 0x508121a1, 0x28d29a14, 0x8141a042, 0x10022412, 0x01a24068,
-0x02261681, 0x43417898, 0x00000e80, 0x00000000, 0x0025a018, 0x0264009d,
-0x34400910, 0x6000dd40, 0x60815100, 0x209d1227, 0x18d00255, 0x85002540,
-0x11224400, 0x00264009, 0x43440091, 0x63401998, 0x00000620, 0x00000000,
-0x0067a005, 0x0e6d119d, 0x23c00870, 0x4c069500, 0xe0311000, 0x01832021,
-0x59d00254, 0x910024c0, 0x34126c00, 0x4026d009, 0x0e6c0093, 0x17c009bc,
-0x00000e20, 0x00000000, 0x00a58034, 0x265c048f, 0x64c03970, 0x7c009702,
-0xc3113000, 0x24970067, 0x09f2026c, 0x9b9027e4, 0xf0023c00, 0x0020c008,
-0x263c009f, 0x53c00978, 0x00000600, 0x00000000, 0x00050014, 0x084c501f,
-0x07c08134, 0x6c8e1f00, 0xc0213410, 0x00130887, 0x01320054, 0x174007c1,
-0x30087400, 0x0007c801, 0x8c7c8004, 0x51c20130, 0x00000420, 0x00000000,
-0x0014a814, 0x11c5137f, 0x1f408710, 0x84007d00, 0x41131048, 0x007b205f,
-0x273081c4, 0x71101744, 0xb2017400, 0x10174005, 0x09c40051, 0x50400750,
-0x00000200, 0x00000000, 0x0032a014, 0x0544028d, 0xf3401c12, 0x34019d01,
-0x401cd10b, 0x00c10453, 0x2c100335, 0xcc0a7540, 0x18033400, 0x0033600c,
-0x221400c5, 0x51400c90, 0x00000a00, 0x00000000, 0x09388005, 0x01a500ad,
-0x3b400e10, 0x96006d04, 0x604e1003, 0x04e9041b, 0x02801714, 0x61003b4c,
-0x9a033420, 0x003340ce, 0x020408e1, 0x14405f90, 0x00000200, 0x00000000,
-0x00f81015, 0x050c81ff, 0x7bc01e10, 0x2c81ed00, 0xc29e7457, 0x4321085f,
-0x1a240798, 0xef247bc0, 0x3007be11, 0x28fbc15e, 0x029c21e7, 0x55c03eb0,
-0x00000040, 0x00000000, 0x01b59010, 0x01504057, 0x27c00df0, 0x6c00df10,
-0xc06d3103, 0x011f0017, 0x0173736c, 0x1f0037c4, 0xf007fc00, 0x2437c86d,
-0x025c02df, 0x43c12d70, 0x00000660, 0x00000000, 0x00ffa200, 0x05fc41b3,
-0x7dc09f30, 0xfc017b00, 0xc19e7047, 0x01fb007d, 0x97b087ec, 0xfb406ec8,
-0xf087d401, 0x037cc01f, 0x05c40bf3, 0x00c01fc0, 0x00000e00, 0x00000000,
-0x02398815, 0x19b600ab, 0x38400e10, 0x8404ed00, 0x488e3003, 0x02fd001c,
-0x021013ed, 0x61012948, 0xd053ac08, 0x023dc00e, 0x50840cf3, 0x54404ef0,
-0x00000620, 0x00000000, 0x00390000, 0x013412e9, 0x3a640e10, 0x10008502,
-0x008f1023, 0x0821021b, 0x081903a4, 0xe5802840, 0xd0838400, 0xa13a408c,
-0x00a400e9, 0x00410ed0, 0x00000400, 0x00000000, 0x20772804, 0x093080c1,
-0x72000c10, 0x0402cc00, 0x644c1183, 0x07042112, 0x30100324, 0x05002545,
-0xd2071440, 0xc031400c, 0x082400c1, 0x90403c50, 0x00000c20, 0x00000000,
-0x417ca815, 0x057003c9, 0x76500d14, 0x5d879701, 0x484d1c03, 0x07eb0117,
-0x5db083ed, 0x5f0024c0, 0xf82bc500, 0x003ec00f, 0x086d00fb, 0x54c03fd0,
-0x00000620, 0x00000000, 0x00370001, 0x4d3c809f, 0xb4c80df0, 0x5c00cf20,
-0xc00db003, 0x021f1085, 0x01f4035c, 0x930025c2, 0xf9036c00, 0x0035c00d,
-0x005c00df, 0x07c00df0, 0x00000c00, 0x00000000, 0x003f0880, 0x15cc00f3,
-0x7cc00c30, 0xad10f300, 0xc80f3a0f, 0x01fa021f, 0x0b7083dd, 0x67206ec0,
-0xf003cc08, 0x083cca0f, 0x44bc00f6, 0x00c30f30, 0x00000c22, 0x00000000,
-0x40360081, 0x0b450151, 0x70d01d10, 0x44025100, 0x400d300f, 0x03110112,
-0x01300364, 0xd3006740, 0xd0034412, 0x0036c40d, 0x047400d1, 0x04420cb0,
-0x00000802, 0x00000000, 0x8034a001, 0x81550191, 0x36483d91, 0x6780d102,
-0x481d5443, 0x28dd0017, 0x05d28335, 0x550a3762, 0x50036500, 0x0030400c,
-0x107600d5, 0x04400d10, 0x00000200, 0x00000000, 0x20302010, 0x01140091,
-0x32400412, 0x0400c040, 0x601c9403, 0x00058012, 0x00500324, 0x89003340,
-0xd0030100, 0x0032400c, 0x003480c5, 0x40400c90, 0x00000080, 0x00000000,
-0x883ab000, 0x015c00d1, 0x36c00db4, 0x6d001100, 0xc00d1003, 0x00df0017,
-0x097003d4, 0x65403ac0, 0xf0036d00, 0x083cc00f, 0x007c00f7, 0x00c00f30,
-0x00000ac0, 0x00000000, 0x803fb805, 0x02ed00ff, 0x1de00b70, 0xf800ff00,
-0xc20f7403, 0x003b001f, 0x033003dd, 0xf5003fc4, 0xf083fc00, 0x003fc00f,
-0x00fc00fb, 0x17c00ef0, 0x00000e60, 0x00000000, 0x023fa003, 0x53cfc0ff,
-0x3b400ff3, 0xecc03300, 0xc483d200, 0x483b233c, 0x8370a0c5, 0x37020cc0,
-0x31008d48, 0x003cc003, 0x00cd8423, 0x0cd40b35, 0x00000e00, 0x00000000,
-0x01370801, 0x934410fd, 0x374005d0, 0x44009100, 0x400d9003, 0x061302bc,
-0x01100044, 0x11002444, 0x10004400, 0x003ec541, 0x01444855, 0x04400910,
-0x00000c20, 0x00000000, 0x2033a011, 0x532404c4, 0x67460cd0, 0x14004500,
-0x4008d202, 0x08c50130, 0x44500344, 0x85613048, 0x50000444, 0x00324008,
-0x01140001, 0x44400c50, 0x00000e80, 0x00000000, 0x8035a803, 0x036400dd,
-0x17400dd0, 0x7520c500, 0x502d9003, 0x00d40034, 0x45100244, 0x11083041,
-0x50504404, 0x88364009, 0x03140045, 0x0c400c10, 0x00000620, 0x00000000,
-0x0037a802, 0x036400cf, 0x77c81df0, 0x6c62d700, 0xc094f069, 0x0217006c,
-0x3d70480c, 0xd70014d0, 0x740f4d01, 0x0034d105, 0x015c0553, 0x08c01d70,
-0x00000e20, 0x00000000, 0x043d8007, 0x83dc00ff, 0x3fc027f0, 0x4500fb42,
-0xc40fb006, 0x2333026b, 0x14f000fc, 0xef080fc0, 0xb007fc21, 0x0031c046,
-0xa3ec027d, 0x1fc09f92, 0x00000600, 0x00000000, 0x00350802, 0x037c00df,
-0x37c00df1, 0x4d029b00, 0xc12d3003, 0x00db4164, 0x2db01f6c, 0xd74134c0,
-0x30293c10, 0x0036d029, 0x014c10d3, 0x08c10d34, 0x00000420, 0x00000000,
-0x0074a013, 0x43f400fd, 0xba404fd0, 0x4400b100, 0xc02d1002, 0x00e100a6,
-0xa5100244, 0xd100f6c0, 0x10857411, 0x003c4019, 0x2f7c00f1, 0x4c404d10,
-0x00000200, 0x00000000, 0x00b2a007, 0x073408cd, 0x13400cd0, 0x04008909,
-0x400c161b, 0x00050020, 0x08900a24, 0x4d000050, 0x14073400, 0x0031400c,
-0x01040249, 0x1c402c10, 0x00000a00, 0x00000000, 0x00788004, 0x07b409ed,
-0x5a4032d0, 0x85012100, 0x60121105, 0x01f50062, 0x1a100404, 0x292c6840,
-0x1806b605, 0x0079411e, 0x45b41979, 0x10401e10, 0x00000200, 0x00000000,
-0x06301012, 0x033488cf, 0x13c088f8, 0x0502db00, 0xc00c3003, 0x02c74120,
-0x48b1032c, 0xcf003440, 0x30033c00, 0x4131c80d, 0x014c004a, 0x48d00d30,
-0x00000040, 0x00000000, 0x003db802, 0x43fc3aff, 0x3ec80bf0, 0xfe007f00,
-0xc00afa03, 0x00e3106f, 0x0bf0027c, 0x37203fc0, 0xf0227484, 0x003c808f,
-0x03fc0077, 0x0bc08ff0, 0x00000660, 0x00000000, 0x0037a015, 0x034c02df,
-0x77c08d30, 0x6c00d700, 0xc92d3403, 0x00130137, 0x0df0024c, 0xdb0014c0,
-0x38036c40, 0x23b4c005, 0x014c01d3, 0x54c01d30, 0x00000e00, 0x00000000,
-0x00398812, 0x138404ef, 0x3b400618, 0x2400f101, 0x40061001, 0x07e1023b,
-0x0cd000ac, 0xe1200840, 0x1a030400, 0x24384104, 0x038402e1, 0x48400e10,
-0x00000620, 0x00000000, 0x00790003, 0x170401cd, 0x7b405e10, 0x8409a503,
-0x481e9007, 0x05f11873, 0x1ed20786, 0xe9007870, 0x1007a441, 0x0078441e,
-0x058605e1, 0x0c401e10, 0x00000400, 0x00000000, 0x10332812, 0x034440c5,
-0x33408c14, 0x24098100, 0x409c9007, 0x00d10273, 0xacd00226, 0xd9007441,
-0x11172408, 0x4830401c, 0x070704c1, 0x48409c14, 0x00000c20, 0x00000000,
-0x0015a817, 0x0145004d, 0x9fc01732, 0x6c025701, 0xc015b215, 0x00734017,
-0x15f0014c, 0x5b0614d0, 0x35156d43, 0x0014d025, 0x1dcc1173, 0x5cd00530,
-0x00000620, 0x00000000, 0x20070012, 0x007c001f, 0xc7c001f0, 0x1d001f00,
-0xc0007000, 0x001f0003, 0x01f0003c, 0x170087c0, 0xf0005c00, 0x0003e0e1,
-0x047d001f, 0x4bc801f0, 0x00000c00, 0x00000000, 0x00670810, 0x024c009f,
-0x24e09930, 0x4c109f00, 0x80493002, 0x05934024, 0x0938026d, 0x970024c0,
-0x30060c10, 0x5024c019, 0x027c0093, 0x43c00930, 0x00000c20, 0x00000000,
-0x0a260001, 0x0244029d, 0xa6e03810, 0x44008d00, 0x4009100a, 0x809b0124,
-0x0910024c, 0x9100a450, 0x11064100, 0x00a55098, 0x0274009b, 0x07400914,
-0x00000800, 0x00000000, 0x8024a018, 0x0245029d, 0xa4440910, 0xc7009d08,
-0x400b180a, 0x00910065, 0x0a100244, 0xb520ac40, 0x1012c400, 0x0424400b,
-0x02340091, 0x63400910, 0x00000200, 0x00000000, 0x82302010, 0x2204088d,
-0x20401810, 0x84089d00, 0x508a1c22, 0x00890221, 0x2a142204, 0xa190a840,
-0x10028722, 0x00a1408a, 0x0a340289, 0x43402810, 0x00000080, 0x00000000,
-0x0086b01d, 0x584c961f, 0x04414114, 0x4c561f05, 0xc1633058, 0x14130585,
-0x4112584c, 0x070500c1, 0x34504c14, 0x4500c967, 0x003c0003, 0x77c00030,
-0x00000ac0, 0x00000000, 0x0127b819, 0x127e049f, 0x2bd00bf0, 0x7c24bf00,
-0xc049f092, 0x14a7012e, 0x09f012dc, 0x9f0827c0, 0xf0027c00, 0x0026c049,
-0x02fc02ff, 0x67c00bf0, 0x00000e60, 0x00000000, 0x022fa818, 0x52cc10bf,
-0x25c14bf0, 0x4c1c9345, 0xd00b3022, 0x04bb4368, 0x295022dc, 0x9314a6c0,
-0xb0426c30, 0x0024c02b, 0x0a4c0697, 0x60c02930, 0x00000e00, 0x00000000,
-0x0107081c, 0x186d021f, 0x05c021d0, 0x44061100, 0x40211428, 0x06110004,
-0x50100044, 0x3100c440, 0xd0014437, 0x05c040a5, 0x04440911, 0x70401211,
-0x00000c20, 0x00000000, 0x0023a010, 0x4204148d, 0x214008d0, 0x04048100,
-0x41689212, 0x199101a0, 0x28501a14, 0xa9012a40, 0xd0022400, 0x00a04048,
-0x12a404b5, 0x40424a14, 0x00000e80, 0x00000000, 0x1825a018, 0x82440095,
-0x254289d8, 0x45009106, 0x402d920a, 0x01911024, 0x88100a44, 0xb8812c42,
-0xd0026400, 0x80204009, 0x52e000b1, 0x60000b11, 0x00000620, 0x00000000,
-0x0027a005, 0x0245009d, 0xa1c049f0, 0x4c019300, 0xc009b002, 0x008b0024,
-0x0970065c, 0x9b0126c0, 0xb1026830, 0x0024d0b9, 0x026c0297, 0x14d01938,
-0x00000e20, 0x00000000, 0x00258014, 0x027c109f, 0x75c219f0, 0x3c049f00,
-0xc1087003, 0x309e0027, 0x19d0227c, 0x975467c2, 0xf0035c00, 0x0027c018,
-0x065c009f, 0x53c059f8, 0x00000600, 0x00000000, 0x03050014, 0x004c000f,
-0x87c031f0, 0x4c001304, 0xc001f040, 0x00130040, 0x0130000c, 0x332889c0,
-0xf0086c00, 0x0004d021, 0x08cc0233, 0x50d003f0, 0x00000420, 0x00000000,
-0x005ca014, 0x0144027d, 0x974027d2, 0x45005100, 0x41177009, 0x0271009c,
-0x05b001c4, 0x71001540, 0xd0114500, 0x00144197, 0x01440043, 0x504005d0,
-0x00000200, 0x00000000, 0x0072a814, 0x030403cd, 0xb3400cd0, 0x0400d100,
-0x400cd00b, 0x00c10030, 0x0c100624, 0x5540b140, 0xd0071400, 0x00304228,
-0x035400c9, 0x51400dd0, 0x00000a00, 0x00000000, 0x00388005, 0x038402ad,
-0x33420ad0, 0x8404e100, 0x60065003, 0x04e10028, 0x061009a4, 0xa9000940,
-0xd0039400, 0x0038400e, 0x00940121, 0x154002d0, 0x00000200, 0x00000000,
-0x00781015, 0x078d014d, 0x7bc01ef0, 0x8c23c124, 0xd01cf007, 0x05b34068,
-0x1e1406ed, 0x474071c2, 0xf0079c01, 0x4058c01c, 0x079d00fb, 0x55c01ef8,
-0x00000040, 0x00000000, 0x0015b810, 0x037c801f, 0x37c80df0, 0x7d86df40,
-0xc005f01b, 0x099f0027, 0x05f001dc, 0x970006c0, 0xb00b4d00, 0x0017c009,
-0x006d001f, 0x42c001f0, 0x00000660, 0x00000000, 0x407fb000, 0x27cc0133,
-0x7cc09ef0, 0xdc03f700, 0xc017f02f, 0x0177007c, 0x1f3207dc, 0x73007c80,
-0x300fec01, 0x407cc017, 0x07cd01f3, 0x03c01f30, 0x00000e00, 0x00000000,
-0x00ad8015, 0x0380006b, 0x3840aaf0, 0x8408e101, 0x4087d043, 0x0061022d,
-0x06a040fc, 0xab208850, 0x10038400, 0x00384003, 0x00c40025, 0x57400210,
-0x00000620, 0x00000000, 0x00390000, 0x038400a1, 0x38700fd2, 0x9400e500,
-0x4102d103, 0x0025000a, 0x8c1003a4, 0x61423840, 0x1003a401, 0x0010400e,
-0x0b8418e1, 0x03400e10, 0x00000400, 0x00000000, 0x00032804, 0x030420d1,
-0xb0403c52, 0x0402c104, 0x4030d00f, 0x00050003, 0x24904c34, 0x8900c043,
-0x10072403, 0x50104408, 0x2004000d, 0x13400010, 0x00000c20, 0x00000000,
-0x0035a815, 0x02450051, 0xf4c12dd0, 0x5c00f704, 0xc015f20b, 0x0c370036,
-0x2d300e6c, 0x536274c0, 0x34466d2b, 0x0834c009, 0x070d00d3, 0x57c00d34,
-0x00000620, 0x00000000, 0x00b70001, 0x037c801f, 0xb7c00df0, 0x7c10df00,
-0xc045f203, 0x001b0005, 0x05f00a5c, 0x970287c0, 0xf1035c08, 0x0037c409,
-0x007c0017, 0x07c001f0, 0x00000c00, 0x00000000, 0x006f0880, 0x0acc0053,
-0x3ec13ef0, 0xcd20db00, 0x8032b043, 0x00234028, 0x0e3c02cc, 0x714030c0,
-0xf0076c00, 0x001bc00b, 0x03cc40c3, 0x00c00f30, 0x00000c22, 0x00000000,
-0x20062081, 0x03541011, 0x90401dd0, 0x4400d100, 0x4031100b, 0x0e110404,
-0x07540614, 0xb1208c40, 0xd0074400, 0x001f4419, 0x00c5003b, 0x04400214,
-0x00000802, 0x00000000, 0x0210a001, 0x02440011, 0xb6400dd0, 0x0500c900,
-0x6005900b, 0x00150035, 0x0d104644, 0x45103550, 0xd0136400, 0x00374811,
-0x034400d1, 0x04400d50, 0x00000200, 0x00000000, 0x00002010, 0x03140041,
-0x31400cd0, 0x0500c100, 0x40041203, 0x00050001, 0x04500214, 0x81000140,
-0xd0030600, 0x40334400, 0x00440009, 0x40400110, 0x00000080, 0x00000000,
-0x0006a000, 0x024c8013, 0x36c005f8, 0x4c20fb00, 0xd001b003, 0x00170005,
-0x0d10024c, 0x470015c0, 0xf0036c80, 0x4017c009, 0x034c00d3, 0x00d00d30,
-0x00000ac0, 0x00000000, 0x800fa805, 0x03fe207f, 0x3ac00ff0, 0xfc00ff00,
-0xc003f001, 0x002b000e, 0x07f002fc, 0xbf002ec0, 0xf003f820, 0x001fc00b,
-0x00fc003f, 0x17c003f0, 0x00000e60, 0x00000000, 0x003fa003, 0x03dc4073,
-0x0dc8c370, 0xcc183d03, 0xc982b040, 0x0033030c, 0x0f3003ec, 0xfd002ec9,
-0x3083ec98, 0x023cd003, 0x23cc00f3, 0x0cc00ff9, 0x00000e00, 0x00000000,
-0x803f0801, 0x03c400d1, 0x2440c910, 0x64069d03, 0x4061101b, 0x46911384,
-0x2f0103c4, 0xf1002440, 0x100bf406, 0x01b44041, 0x030410f1, 0x04404dd0,
-0x00000c20, 0x00000000, 0x4033a011, 0x032480c5, 0x10404050, 0x24000d01,
-0x40409040, 0x12492101, 0x0c105326, 0xc9002240, 0x548a3404, 0x30b24100,
-0x130404c1, 0x44415cd2, 0x00000e80, 0x00000000, 0x7035a807, 0x036400c1,
-0x345a0910, 0x64009d04, 0x41040000, 0x10910000, 0x0d008306, 0xd1042440,
-0x50227400, 0x02164108, 0x934480d5, 0x0c401dd2, 0x00000620, 0x00000000,
-0x0037a800, 0x036106d5, 0xc4803570, 0x4d0a5e00, 0xd029b000, 0x801340b5,
-0x0c30036c, 0xdb00a6c8, 0x70033400, 0x40768835, 0x034d00d1, 0x00c00cd0,
-0x00000e20, 0x00000000, 0x083c8083, 0x039c00ff, 0x8fc092f0, 0x9c00ef20,
-0xc24bf013, 0x00ff10bf, 0x0ff703fc, 0xff012bc4, 0xb003fe00, 0x4055e83f,
-0x07fc20fb, 0x1fc00ff2, 0x00000602, 0x00000000, 0x40310802, 0x036c02d3,
-0x94d025f0, 0x5c421f20, 0xc0217000, 0x024f80a6, 0x0d70035c, 0xd70025c0,
-0x70227c20, 0x4130c801, 0x074c04c7, 0x08c40d39, 0x00000420, 0x00000000,
-0x03bca013, 0x3bc404d1, 0x9440b110, 0x44009d03, 0x42051000, 0x00dd0024,
-0x4f1003dc, 0xf1402440, 0xb0027400, 0x01b44009, 0x074411f1, 0x4ec00db1,
-0x00000200, 0x00000000, 0x0032a007, 0x0b3400c1, 0xc34010d0, 0x14400d00,
-0x4004d080, 0x000d0000, 0x7c500316, 0xc5811140, 0x40023400, 0x00b14000,
-0x030402c5, 0x1c400c90, 0x00000a00, 0x00000000, 0x02788004, 0x071401c1,
-0x7b421e10, 0x94010d01, 0x00165807, 0x012d0048, 0x1c100714, 0xe1215044,
-0x92063401, 0x0269501b, 0x878509f5, 0x1a081f90, 0x00000200, 0x00000000,
-0x00341012, 0x033c00c3, 0x034161f2, 0x5c004f00, 0xe0087013, 0xa0cd0832,
-0x0c71031c, 0xc50011c0, 0x72033400, 0x2231c000, 0x030c08c7, 0x48c00cb0,
-0x00000040, 0x00000000, 0x003db002, 0x43ce80ff, 0x34e80ff8, 0xec007f01,
-0xc08db003, 0x00bf003f, 0x8fb82bfc, 0xff011fc0, 0xf007fc00, 0x020ec00a,
-0x43fd08eb, 0x0bc18ef0, 0x00000660, 0x00000000, 0x0137a015, 0x1b7c12db,
-0x24c01d34, 0x7c00d300, 0xc00da800, 0x00130016, 0xccf0037c, 0xd40024c3,
-0x301a4d05, 0x20340805, 0x1b6c06db, 0x54c12df0, 0x00000e00, 0x00000000,
-0x02398812, 0x23b400e1, 0x3c600c10, 0xb420eb08, 0x400e1003, 0x00601010,
-0x0ed003b0, 0xe1402840, 0x5022840e, 0x0001400e, 0x338412f1, 0x48404ed0,
-0x00000620, 0x00000000, 0x02710083, 0x17b401e1, 0x68401e12, 0xb401e900,
-0x40181007, 0x81e81078, 0x1fd227b6, 0xed807a42, 0x9007a481, 0x287a4014,
-0x07a425e9, 0x0c405ed0, 0x00000402, 0x00000000, 0x40332832, 0x0370e0d9,
-0xb0406c11, 0x3001d100, 0x080c1003, 0x01d10074, 0x0cd00336, 0xc1003650,
-0x50030600, 0x802340bd, 0x0f0400c1, 0x48400dd0, 0x00000c20, 0x00000000,
-0x0015a817, 0x0170025b, 0x1cd04730, 0xf4877940, 0x90271401, 0x057b01de,
-0x06d0017c, 0x5f019ec0, 0x30016c00, 0x009ee6a7, 0x04ec606b, 0x5cd403f0,
-0x00000620, 0x00000000, 0x40070012, 0x087c1217, 0x07c401f3, 0x7c101f01,
-0xc9007000, 0x001f4407, 0x01f0007c, 0x132485c0, 0xf0007c00, 0x0405e001,
-0x287c021f, 0x4bc011f0, 0x00000c00, 0x00000000, 0x00270810, 0x164c05db,
-0x23e03930, 0x4c009301, 0xc0093402, 0x00930024, 0x59f2026c, 0x9f0024c8,
-0x70023c00, 0x30e25009, 0x404c4193, 0x40d001f0, 0x00000c20, 0x00000000,
-0x40a60001, 0x1e440791, 0x27e03910, 0x04009100, 0x40091002, 0x00918024,
-0x39d0024c, 0x9b202440, 0xb0127400, 0x00e44009, 0x00440091, 0x044001d0,
-0x00000800, 0x00000000, 0xc420a018, 0x02640091, 0xa74a0990, 0x4400d1c0,
-0x50091003, 0x00910834, 0x09d00244, 0x91802441, 0x50127400, 0x00a46009,
-0x41450891, 0x604001d8, 0x00000200, 0x00000000, 0x02202010, 0x22050881,
-0x21488c15, 0x061c8182, 0x41c81822, 0x1c810720, 0x89d02207, 0x89852040,
-0x90523488, 0x052143c8, 0x22040891, 0x404888d8, 0x00000080, 0x00000000,
-0x0586b01d, 0x082c9613, 0x87436130, 0x0d061305, 0xc0611058, 0x06114184,
-0x61f0084c, 0x030114d1, 0x70107c16, 0x4106c861, 0x584c1653, 0x74d161f0,
-0x00000ac0, 0x00000000, 0x0127b819, 0x1a7e0497, 0x2fc04bf0, 0xfe84bf01,
-0xc04bf812, 0x04bf012f, 0x49f01a58, 0x9c052bc4, 0xf002bc04, 0x052ec44f,
-0x13fd049f, 0x67c04af0, 0x00000e60, 0x00000000, 0x022fa018, 0x324c0293,
-0x2f8d0bb0, 0x7c189f21, 0xc049721a, 0x0c9f2324, 0x2bf05a7e, 0x93022f88,
-0x3012ac00, 0x012cc069, 0x36ac04b3, 0x67c65df8, 0x00000e00, 0x00000000,
-0x0285089c, 0x08c40211, 0x07654110, 0x74001d05, 0x40e59018, 0x025d0394,
-0x71d00874, 0x190a8740, 0x51204404, 0x438442e1, 0x08444401, 0x736040d0,
-0x00000c22, 0x00000000, 0x21232010, 0x328486a5, 0xa3480818, 0x14008d08,
-0x4148101a, 0x2c8c1020, 0x6cd01236, 0x89012040, 0x14022416, 0x04204048,
-0x32241281, 0x434138d0, 0x00000e80, 0x00000000, 0x0025a818, 0x02c402b5,
-0x27480912, 0x74009d02, 0x40099082, 0x049d0224, 0x01d80274, 0x99202740,
-0x50026440, 0x00344009, 0x12644091, 0x634019d0, 0x00000620, 0x00000000,
-0x40252805, 0x024d0097, 0x674009b4, 0x5c409f20, 0xd0193412, 0x029f00a4,
-0x01f00274, 0x930026c8, 0x20226c20, 0x0124f009, 0x0a6c0091, 0x174009d0,
-0x00000e20, 0x00000000, 0x00210014, 0x027c009b, 0x27c809f0, 0x7c489f00,
-0xcc393016, 0x209f0027, 0x01f1027c, 0x970527c0, 0xf0065c00, 0x0027c038,
-0x025c009f, 0x53c009f2, 0x00000600, 0x00000000, 0x00050814, 0x007c0413,
-0x07c801f0, 0x3c001f01, 0xc001f008, 0x0213c087, 0x1172004d, 0x038205c2,
-0xb4047800, 0x0885c021, 0x005c0007, 0x50c00172, 0x00000420, 0x00000000,
-0x00142014, 0x01740251, 0xdf402710, 0xf4005d00, 0x4007d001, 0x005b8017,
-0x0310014c, 0x51c09d40, 0xb44d8400, 0x029c4005, 0x01c40071, 0x50500730,
-0x00000200, 0x00000000, 0x0022a014, 0x037400d1, 0x73412c58, 0x3600cd00,
-0x4c0dc803, 0x40c11033, 0x0cd40304, 0xc1803560, 0xd0001400, 0x0035400c,
-0x031600c5, 0xd0440c50, 0x00000a00, 0x00000000, 0x01188004, 0x02b400a1,
-0x1b400e10, 0xb440ed14, 0x400ed213, 0x01c10173, 0x1e900704, 0xc1005140,
-0xd0018404, 0x00304c4f, 0x07c400e1, 0x14405e10, 0x00000200, 0x00000000,
-0x00e81014, 0x073c01e3, 0x7b401e50, 0xbc89ef00, 0xc81ef037, 0x17e1017b,
-0x5ef0478c, 0xe10839c0, 0xf0079c53, 0x4049c75e, 0x079c41e7, 0x54d05e70,
-0x00000040, 0x00000000, 0x4031b010, 0x1b7c00df, 0x07c00170, 0x7c04df00,
-0xc02df003, 0x00df05b7, 0xac70137c, 0xdf001641, 0xb0035c04, 0x1017c02c,
-0x037c001f, 0x43c18d70, 0x00000660, 0x00000000, 0x006fa002, 0x0fce8173,
-0x6fc01730, 0xec91f300, 0x813fb047, 0x01f7147c, 0x1f3047fc, 0xff206cc8,
-0x3005cda1, 0x911ec11f, 0x07cc01e3, 0x08c01f30, 0x00000e00, 0x00000000,
-0x00198011, 0x92860021, 0x39c20600, 0xb400e102, 0x500ed003, 0x00ec0838,
-0x0e1007f4, 0xfd000852, 0x50018400, 0x003c400e, 0xcbc404e3, 0x54400e51,
-0x00000620, 0x00000000, 0x00210000, 0x83a400e1, 0x0b410e90, 0xa400e100,
-0x400e9063, 0x08ed0038, 0x0e1033b4, 0xed022a40, 0x10019400, 0x042e408e,
-0x23a400f9, 0x40410f10, 0x00000400, 0x00000000, 0x00332806, 0x032500c1,
-0xc1403010, 0x3402c002, 0x401cd203, 0x0bc90030, 0x0d100334, 0xc9200240,
-0x54010400, 0x1034400c, 0x0f240005, 0x18403c50, 0x00000c20, 0x00000000,
-0x103da815, 0x016402d1, 0xb7c019b4, 0xe40af242, 0xc00f9023, 0x01ff003c,
-0x0d3003fc, 0xff0036c0, 0x38815400, 0x0836c00f, 0x0f6c00d9, 0x74500f30,
-0x00000620, 0x00000000, 0x40230201, 0x035c00df, 0x11c00d70, 0x7c00df00,
-0xc08df103, 0x10df0037, 0x0df0033e, 0xdf1095c0, 0xf0017c00, 0x00a7e00d,
-0x1a5d00db, 0x07c00df0, 0x00000c00, 0x00000000, 0x023f0a80, 0x23fc15f3,
-0x3cc10b70, 0xcc00f300, 0xc80fb103, 0x00fb003f, 0x0d3203ec, 0xff201cc8,
-0xb021dc00, 0x142fc70d, 0x05dc00ec, 0x04c10ff0, 0x00000c20, 0x00000000,
-0x0c862081, 0x08741291, 0x044491d0, 0x6c80d308, 0x400dd083, 0x80dd0037,
-0x0d100344, 0xdd0456c0, 0x101d3440, 0x2067480d, 0x2c442011, 0x04480cd0,
-0x00000802, 0x00000000, 0x40368001, 0x097480d1, 0x264000d0, 0x4440c900,
-0x400dd003, 0x00c50037, 0x1d100344, 0xdd207440, 0x10017400, 0x0077480d,
-0x035400d5, 0x04400dd0, 0x00000200, 0x00000000, 0x40200030, 0x033600c1,
-0x304004d0, 0x0600c160, 0x400cd003, 0x00cd0033, 0x1d121315, 0xcd001240,
-0x10013440, 0x4023400c, 0x020600c5, 0x40500cd0, 0x00000080, 0x00000000,
-0x40360000, 0x033c0043, 0x00d00979, 0xc500fb00, 0xc00ff803, 0x00fb003f,
-0x0d3417ec, 0xff203480, 0xb4017e00, 0x2027c00f, 0x015c00d7, 0x04c00ff1,
-0x00000ac0, 0x00000000, 0xc00f9825, 0x00fe003f, 0x0fc203f0, 0xf480ff00,
-0xc40ef003, 0x00ff003f, 0x0ff0a36c, 0xff001f80, 0xf001b400, 0x002fc00f,
-0x00fc0033, 0x17c00ef0, 0x00000e60, 0x00000000, 0x003f8003, 0x13de003f,
-0x3ec20f30, 0xcc00fb40, 0xc08bf002, 0x08f3033c, 0x0bf102cc, 0x7f202fc0,
-0x7000ec08, 0x401cc003, 0x038c2073, 0x0cd00330, 0x00000e00, 0x00000000,
-0x88371801, 0x03442a9f, 0x344c0510, 0x040e9122, 0x408ad003, 0x84d50230,
-0x0dd82244, 0x5d003740, 0x10034c44, 0x1214400d, 0x83440041, 0x04502110,
-0x00000c20, 0x00000000, 0x0033a211, 0xa234408d, 0x30548880, 0x0450c140,
-0x4008d003, 0x04c90136, 0x0cd00304, 0x4d003140, 0x510004c0, 0x08044400,
-0x83040909, 0x44402010, 0x00000e80, 0x00000000, 0x2035a003, 0x03660195,
-0x34480d94, 0x44c1d902, 0x4408d100, 0x00dd0036, 0x4dd00344, 0x5d003740,
-0x10036620, 0x0a145a0d, 0x03200049, 0x0c400110, 0x00000620, 0x00000000,
-0x0037a882, 0x0174118d, 0xf4c00db0, 0x4c05da00, 0xc01df002, 0x00db02b6,
-0x09d0024d, 0xdf0137c0, 0x70004d00, 0x0054c201, 0x074c805b, 0x08c0b531,
-0x00000e20, 0x00000000, 0x043d8007, 0x01d410ff, 0x31c00671, 0xfc802510,
-0xc23ff00a, 0x00f7107d, 0x0ff0027c, 0xff003e84, 0xf203dc00, 0x007fc80e,
-0x17dd0077, 0x1fc017f0, 0x00000600, 0x00000000, 0x00350802, 0x82ad229f,
-0x3cf04b30, 0x4c10d341, 0xc60d3003, 0x00d740b4, 0x0d30024c, 0xcf04b7c0,
-0xb0004c04, 0x0004c101, 0x234c1013, 0x08c00530, 0x00000420, 0x00000000,
-0x04f4a013, 0x434400dd, 0xb4403d10, 0x6c12d100, 0x440d1001, 0x00f140b4,
-0x2d10026c, 0xdda83740, 0x100b0403, 0x02b0431d, 0x07440055, 0x4ec1a732,
-0x00000200, 0x00000000, 0x00f22003, 0x4b0400cd, 0x00400c94, 0x0403c502,
-0x42081003, 0x00d144a4, 0x4c100204, 0x4d20e240, 0x90c82449, 0x00004020,
-0x83140241, 0x1c422990, 0x00000a00, 0x00000000, 0x007a0a04, 0x070401fd,
-0x58419490, 0xa409a500, 0x401e1437, 0x41f12248, 0x1e1006a4, 0x6d017b40,
-0x1027a509, 0x0448489c, 0x07d60165, 0x12401b10, 0x00000200, 0x00000000,
-0x08321012, 0x820e18cf, 0xa04408b0, 0x0c08c701, 0xc08c3013, 0x00d38280,
-0x8c34030c, 0x4d0c33c0, 0xb8806400, 0x0004c080, 0x031c0003, 0x48c028b0,
-0x00000040, 0x00000000, 0x003da802, 0x03dc60ef, 0x3fc00f70, 0xfc08eb10,
-0xc08bf011, 0x00df0207, 0x0ff023fc, 0x6f011fc2, 0xf003dc00, 0x401fc08f,
-0x03ed08fb, 0x0bc00af0, 0x00000660, 0x00000000, 0x0077a010, 0x81fe00db,
-0x0dc00d70, 0x4c01d340, 0xc04d3003, 0x00d34407, 0x0d7082fc, 0xd30037c0,
-0x30004c00, 0x0014d001, 0x034c20d7, 0x54c001f0, 0x00000e00, 0x00000000,
-0x00399912, 0x01b400e1, 0x104004b2, 0x8400e140, 0x410a1003, 0x06eb0003,
-0x0e1002f4, 0xf1003b40, 0x14038000, 0x0038500e, 0x028400e1, 0x494032d0,
-0x00000620, 0x00000000, 0x00790004, 0x063401e9, 0x69401a50, 0xc401e100,
-0x401a1007, 0x05e1004b, 0x1e5006b4, 0xe1047b40, 0x54040400, 0x04484010,
-0x0784010d, 0x0c4018d0, 0x00000400, 0x00000000, 0x20332016, 0x0b3409c1,
-0x30400c51, 0x4412c100, 0x480c1005, 0x00c90083, 0x0c102674, 0xc1007346,
-0x50030400, 0x0c70400d, 0x074400c9, 0x494088d0, 0x00000c20, 0x00000000,
-0x0017a817, 0x09f4037b, 0x1dc00750, 0xcd847348, 0xc2053401, 0x00530017,
-0x0571017c, 0x53409fc0, 0x70014c02, 0x005cc605, 0x054d227f, 0x5cc037f0,
-0x00000620, 0x00000000, 0x00058012, 0x407c001f, 0x03c001b0, 0x7ca01f00,
-0xc401f220, 0x001f2003, 0x01f0007c, 0x0f0047c0, 0xb000bc10, 0x0007d003,
-0x287c0317, 0x4bc101f0, 0x00000c00, 0x00000000, 0x00250810, 0x023c109f,
-0x24c00830, 0x70029340, 0xc8090402, 0x05830434, 0x5930824c, 0x930027c0,
-0x34067c05, 0x0026c229, 0x064c0093, 0x40800934, 0x00000c20, 0x00000000,
-0x38262001, 0x0270209d, 0x24440911, 0x74009100, 0x42091002, 0xa1911024,
-0x29500254, 0x910a2340, 0x10064400, 0x50245009, 0x6a440391, 0x04408910,
-0x00000800, 0x00000000, 0x0464a01c, 0x0274009d, 0x24540910, 0x74009160,
-0x40085202, 0x00910024, 0x09100244, 0x91002740, 0x1022e400, 0x8022400b,
-0x02441881, 0x61400818, 0x00000200, 0x00000000, 0x00202814, 0x5234008d,
-0x20414810, 0x34148105, 0x51485002, 0x28814230, 0x18500a14, 0x81203740,
-0x10228408, 0x0220408e, 0x22050881, 0x41508810, 0x00000080, 0x00000000,
-0x0006b01d, 0x107e141f, 0x04c24130, 0x7c040301, 0xc0417028, 0x02130584,
-0x0130504c, 0x134007c0, 0x30586c16, 0x0d82c163, 0x084c1613, 0x75c16130,
-0x00000ac0, 0x00000000, 0x0023a919, 0x82fc00ff, 0x2fd40bf4, 0xbc14ff30,
-0xc54bb007, 0x869f0127, 0x0bf002fc, 0x9f002bc0, 0xf1126c04, 0x012fc249,
-0x12fc04bb, 0x66c04bf0, 0x00000e60, 0x00000000, 0x802fa018, 0x027c049f,
-0x25c14930, 0x4c00b300, 0xcb2d3022, 0x00b31024, 0x0af0027c, 0xa3002cc2,
-0x3002cc00, 0x0526c089, 0x024c409f, 0x60c00970, 0x00000e00, 0x00000000,
-0x0007181c, 0x087c021f, 0x0c482110, 0x5d161108, 0x44411000, 0x1f130280,
-0x01d00074, 0x111016d0, 0x10000404, 0x01844000, 0x0045001d, 0x7140a2d0,
-0x00000c20, 0x00000000, 0x00210012, 0x0eb402ad, 0xeb401a94, 0x04428900,
-0x40089212, 0x04890462, 0x08d05a34, 0x81002442, 0x10420430, 0x0428404a,
-0x52a416ad, 0x40414a50, 0x00000e80, 0x00000000, 0x00252018, 0x02d40095,
-0x2e408b90, 0x14048948, 0x44499082, 0x80910026, 0x49d01274, 0x91002440,
-0x18034400, 0x083c400b, 0x12e400bd, 0x61400bd0, 0x00000620, 0x00000000,
-0x0027a805, 0x0a74029d, 0xa7c029b0, 0x4c029b00, 0xd009a002, 0x009b4026,
-0x18f0067c, 0x9340a440, 0x30024c20, 0x0064c009, 0x066c0d9f, 0x14c12970,
-0x00000e20, 0x00000000, 0x00258012, 0x0e78009f, 0x25c01872, 0x5c209748,
-0xc0087412, 0x009f0035, 0x09f1067c, 0x9f1227c0, 0xf4023d00, 0x00a5d009,
-0x065c108f, 0x53c008f0, 0x00000600, 0x00000000, 0x00450810, 0x00bc423f,
-0x08c00338, 0x4c001300, 0xc0013000, 0x00134040, 0x11f0004c, 0x034044c0,
-0xb0004c00, 0x0306c000, 0x804c8013, 0x50c061f2, 0x00000420, 0x00000000,
-0x009ca014, 0x0174005d, 0x15500510, 0x44847100, 0x40051001, 0x005b0014,
-0x67d10144, 0x71109846, 0x142d4604, 0x00944205, 0x2d449051, 0x52c005d2,
-0x00000200, 0x00000000, 0x0032a014, 0x033400cd, 0x30500c10, 0x0484c950,
-0x400c5403, 0x21c10830, 0x1cd00304, 0xc1083042, 0x942f0580, 0x40f2420c,
-0x070403c1, 0x52402cd8, 0x00000a00, 0x00000000, 0x04388801, 0x00b4002d,
-0x41500210, 0x84002940, 0x404ed003, 0x03e91038, 0x0ed10384, 0xe1103840,
-0x90038408, 0x0058480a, 0xc38600f1, 0x16400ed0, 0x00000200, 0x00000000,
-0x00781011, 0x073c01ef, 0x38c01c10, 0xcd01eb00, 0xd03f741f, 0x01f30878,
-0x1ef0178d, 0xa30078d0, 0xb00f8405, 0x007ec01e, 0x078d01e3, 0x56d01af0,
-0x00000040, 0x00000000, 0x0015a810, 0x007c001f, 0x07d001c4, 0x7c000700,
-0xc16d305b, 0x00df00b7, 0x05f0237c, 0xdf0033c0, 0x70037c20, 0x0017c20d,
-0x037c00cd, 0x43c029f0, 0x00000660, 0x00000000, 0x005d2000, 0x87cc01ef,
-0x7cc21f30, 0x8d21f328, 0xc01fb007, 0x01b300fc, 0x1f3007cc, 0xff005fc0,
-0x7507fc01, 0x007ec01f, 0x86cc8177, 0x00c03730, 0x00000e00, 0x00000000,
-0x00191815, 0x0084082f, 0x08408208, 0x8400a100, 0x400e9003, 0x00af0238,
-0x06b103ac, 0xef003b44, 0x1063840a, 0x021e508a, 0x02d510e1, 0x544006b0,
-0x00000620, 0x00000000, 0x00090000, 0x030510ed, 0x3a400c10, 0xc400a102,
-0x410c1063, 0x00a10030, 0x0a1003a4, 0xcd043b40, 0x50031400, 0x0038500c,
-0x63a4087d, 0x00400310, 0x00000400, 0x00000000, 0x00112004, 0x00040205,
-0x02422014, 0x04018100, 0x401c140f, 0x009d0130, 0x10100324, 0xc501f340,
-0x10030400, 0x0112400c, 0x06340259, 0x10400090, 0x00000c20, 0x00000000,
-0x0025a815, 0x074402dd, 0x76c09d30, 0xcd32c330, 0xd01fb083, 0x00d340b4,
-0x551003ec, 0x7d0077c0, 0x700ddc00, 0x00a4c075, 0x856c099f, 0x54d00d34,
-0x00000620, 0x00000000, 0x00370001, 0x047c101f, 0x45c011f0, 0x7c101f00,
-0xc80df043, 0x00df0037, 0x25f1037c, 0xcf2037c4, 0xf0415c82, 0x02b5d041,
-0x015c0097, 0x07c02d70, 0x00000c00, 0x00000000, 0x022f0884, 0x038c00eb,
-0x32c00e30, 0xcc00f300, 0xc00fb403, 0x0193003f, 0x4338030c, 0x7f003fc0,
-0xb0008e01, 0x00a8c02f, 0x01c908b2, 0x00801e30, 0x00000c22, 0x00000000,
-0x20122085, 0x00440011, 0x05480154, 0x41001500, 0x420d1003, 0x01b10037,
-0x31500344, 0xdd08e640, 0x10004401, 0x00b44131, 0x0144009b, 0x06c01910,
-0x00000802, 0x00000000, 0x0014a201, 0x034000d9, 0x36580d11, 0x04a0d110,
-0x400d1883, 0x04910833, 0x25100344, 0x550d3748, 0x90934444, 0x00244204,
-0x42170055, 0x05406d10, 0x00000200, 0x00000000, 0x00102810, 0x00044001,
-0x01400050, 0x04208500, 0x400c1803, 0x00810053, 0x04500305, 0xcd003340,
-0x10010400, 0x00004000, 0x021500cd, 0x43400416, 0x00000080, 0x00000000,
-0x0006b000, 0x034d00db, 0x36c00d30, 0xcd008320, 0xc00fb003, 0x00d30037,
-0x0110034c, 0x5f8037c8, 0xb0034400, 0x0824d00d, 0x015c0017, 0x01c00d30,
-0x00000ac0, 0x00000000, 0x001fa805, 0x00fc003f, 0x0fc003f4, 0xfc00bf60,
-0xc00ff003, 0x00ff003f, 0x03f003fc, 0xff002ec0, 0xf401fd00, 0x000fc203,
-0x00ec002b, 0x16c002f0, 0x00000e60, 0x00000000, 0x003fa003, 0x33dc0cf7,
-0x0ce80330, 0xf450f301, 0xc02ff040, 0xb4ef010f, 0x4f3010dc, 0xf3060cc0,
-0x3000fc10, 0x013ac003, 0x03844cfb, 0x0cc00f30, 0x00000e00, 0x00000000,
-0x203f0801, 0x3a4c0e41, 0x8440a110, 0x7416e180, 0x4a2fd149, 0x82fd2182,
-0xef100844, 0xf1098441, 0x10387412, 0x02bc40e1, 0x03440ee1, 0x04402f50,
-0x00000c20, 0x00000000, 0x0033a011, 0x030500c5, 0x20414014, 0x3400c107,
-0x406cd010, 0x00cd0603, 0x0d100814, 0xc1002040, 0x10c03404, 0x00304104,
-0x036400c9, 0x44402d10, 0x00000e80, 0x00000000, 0x08358803, 0x4244a051,
-0x25410010, 0x7600d105, 0x400dd000, 0x00dd0017, 0x0d130044, 0xd0000542,
-0x10013400, 0x18344904, 0xa36400d1, 0x0c400d50, 0x00000620, 0x00000000,
-0x0037a802, 0x2c44a017, 0x14500d30, 0x7c00d040, 0xc00df20a, 0x00df1137,
-0x0d10015c, 0xd34094e2, 0x340b7c00, 0x0034d009, 0x036d00db, 0x08d00d30,
-0x00000e20, 0x00000000, 0x00358007, 0x42fe082f, 0x5ac09ff1, 0x7c00ff00,
-0xc80ff017, 0x00ff303e, 0x0ff4657c, 0xff0096c0, 0xf1007c00, 0x143fe00f,
-0x03d800ff, 0x1fc00df2, 0x00000600, 0x00000000, 0x00350802, 0x080c1097,
-0xa4c02df1, 0x5c04db10, 0x840d3408, 0x08d30007, 0x4d30036c, 0xd740a4c0,
-0x340b7c00, 0x0037c029, 0x035c20c7, 0x08c00df1, 0x00000420, 0x00000000,
-0x003ca013, 0x0a4c0091, 0x24400dd2, 0x4423f300, 0x400f1014, 0x02e10817,
-0x2e108304, 0xf1000441, 0x1281740a, 0x04bb480d, 0x630400f1, 0x4c507e30,
-0x00000200, 0x00000000, 0x00368007, 0x01060285, 0x014000d1, 0x1400c500,
-0x440c501c, 0x10c10003, 0x1c100224, 0xc1000440, 0x10003400, 0x00724000,
-0x0f1400c5, 0x9c404c50, 0x00000a00, 0x00000000, 0x00788004, 0x45a51161,
-0x49541cd0, 0xa409e500, 0x461e1105, 0x21e1004b, 0x1f100684, 0xe1106840,
-0x1006b401, 0x017b4012, 0x07842de1, 0x10405e12, 0x00000200, 0x00000000,
-0x00301012, 0x010e0487, 0x15c000f0, 0x1c10c740, 0xc00c300b, 0x00c34023,
-0x0c34612c, 0xc100b0c0, 0x30083c00, 0x0032c08c, 0x031c04c7, 0x48c00c70,
-0x00000040, 0x00000000, 0x043db802, 0x21dc007d, 0x1ec00ff0, 0xdc00fa02,
-0xc48ff003, 0x00fd103f, 0x0ef001fc, 0xfb003fc1, 0xf003fc00, 0x013fc40f,
-0x23fe24df, 0x0bc14f70, 0x00000660, 0x00000000, 0x0d37a015, 0x004c0117,
-0x37c00134, 0x4d13df08, 0xc18d7002, 0x10de0036, 0x4df0024c, 0xd10814c8,
-0xf0037c14, 0x0d33c001, 0x434c12d3, 0x54c10d72, 0x00000e00, 0x00000000,
-0x01398812, 0x03c40071, 0x3b400e10, 0x8406fd00, 0x400ed003, 0x80e9003b,
-0x4fd00284, 0xe1003041, 0xd002b482, 0x003b4006, 0x939402f1, 0x48404ed0,
-0x00000620, 0x00000000, 0x00710003, 0x048401a5, 0x7b401210, 0x8401ed00,
-0x405ed007, 0x09cd206b, 0x5ed00786, 0xe1007840, 0xd007b445, 0xc27f403a,
-0x278405e1, 0x0e401ed0, 0x00000400, 0x00000000, 0x10332812, 0x070521c1,
-0x73401d10, 0x0420cd02, 0x400dd00b, 0x00c900f7, 0x0cd00f04, 0xd1023050,
-0xd0077400, 0x0033401d, 0x171400c0, 0x4a420cd0, 0x00000c20, 0x00000000,
-0x0015a837, 0x1dcc0777, 0x9fc07730, 0xcc005f00, 0xc4057001, 0x005f015f,
-0x07f015cc, 0x53005cc0, 0xf01dfc00, 0x001fc037, 0x488c0061, 0x5ed006f8,
-0x00000620, 0x00000000, 0x00070012, 0x407c101f, 0x07c101f0, 0x7c801f04,
-0xc001f000, 0x000b0407, 0x01f0405d, 0x1f4007c0, 0xf0407c00, 0x0007c101,
-0x007c001f, 0x49c001f0, 0x00000c00, 0x00000000, 0x00270810, 0x8e3c409b,
-0x24c00930, 0x7e009f10, 0xc2093042, 0x00930024, 0x39d0024c, 0x9b0024c0,
-0x70024c05, 0x2020c009, 0x004c0093, 0x40c009f2, 0x00000c20, 0x00000000,
-0x00262001, 0x0e740091, 0x24480910, 0x74829d00, 0x4009100a, 0x00910024,
-0x39d28264, 0x910026c0, 0x10024503, 0x10a44009, 0x046c8091, 0x04400910,
-0x00000800, 0x00000000, 0x0020a018, 0x42740099, 0x24440910, 0x34029d00,
-0x4009100a, 0x00910024, 0x08d00365, 0x91002051, 0x108244c2, 0x41244009,
-0x19450099, 0x60601950, 0x00000200, 0x00000000, 0x00a02010, 0x0a340281,
-0x2141c810, 0x34808d17, 0x50881052, 0x00818720, 0x08d05224, 0x81672040,
-0x18720400, 0x022051c8, 0x22240891, 0x40489810, 0x00000080, 0x00000000,
-0x0006b01d, 0x007cc01b, 0x84d06130, 0x74141f11, 0xc1613410, 0x14134184,
-0x41f0104c, 0x13018441, 0x34184c14, 0x9594c061, 0x584c5613, 0x74d16172,
-0x00000ac0, 0x00000000, 0x00a7b819, 0x8afc62bf, 0x2ec84bf4, 0xf4149f01,
-0xc0497152, 0x009f012f, 0x49f002dc, 0x9f092fc3, 0xf012fc14, 0x2127c84b,
-0x12dd849f, 0x67c04870, 0x00000e60, 0x00000000, 0x01a7a018, 0x4afc06b3,
-0x27c029f0, 0xdc10bf85, 0xc1293042, 0x04932127, 0x2bf0123c, 0xbf08270e,
-0x30424c86, 0x01afc009, 0x168c109b, 0x60c12bf0, 0x00000e00, 0x00000000,
-0x0107081c, 0x10342659, 0x8344a1d8, 0x55001d11, 0x40605408, 0x42110597,
-0x019100e6, 0x19038640, 0x12004504, 0x004740a5, 0x544c0217, 0x704071d0,
-0x00000c20, 0x00000000, 0x0322a010, 0x02340889, 0x230048d0, 0x04108d04,
-0x40485052, 0x08a90223, 0x28c00ab4, 0x8d042340, 0x90420402, 0x91b74108,
-0x0a243481, 0x40404cd0, 0x00000e80, 0x00000000, 0x0025a818, 0x02748099,
-0x274009d0, 0x44209900, 0x4409102a, 0xa0990227, 0x09d046f4, 0x9d01a740,
-0x94064400, 0x20074049, 0x50440095, 0x604801d0, 0x00000620, 0x00000000,
-0x40278805, 0x027c0293, 0x274809d2, 0x5c209d01, 0xc0097002, 0x00994027,
-0x09f88274, 0x9f0827e0, 0xb0024400, 0x0007c029, 0x00640093, 0x14d001d0,
-0x00000e20, 0x00000000, 0x00258014, 0x027c0097, 0x67c209f0, 0x7c009f02,
-0xc009f042, 0x00971023, 0x09b0026c, 0x9b1066c0, 0x70027c00, 0x8007c009,
-0x007d009f, 0x53c001f0, 0x00000600, 0x00000000, 0x20010814, 0x907c0212,
-0x87a00130, 0x7c400300, 0xc001f288, 0x00330004, 0x813108fc, 0x0f1007c0,
-0xf0003c00, 0x0044d021, 0x88440013, 0x50c01072, 0x00000420, 0x00000000,
-0x0014a014, 0x89f43071, 0x17e2051d, 0xf6007100, 0x4005d00d, 0x40530014,
-0x1710015c, 0x7d0017c0, 0xd0817401, 0x000c4005, 0x08ec0051, 0x50400330,
-0x00000208, 0x00000000, 0x8032a014, 0x833412c1, 0x33420c50, 0x7409c908,
-0x400cc80f, 0x00c50030, 0x0c140334, 0xcd003340, 0xd8033401, 0x0034620c,
-0x170400d9, 0x50400c51, 0x00000a00, 0x00000000, 0x00308005, 0x04b40021,
-0x79444e52, 0xb480e111, 0x481ed043, 0x802d2338, 0x0e9004b4, 0x6d003908,
-0xd003b410, 0x013040dc, 0x77e580c9, 0x14404e90, 0x00000200, 0x00000000,
-0x01781015, 0x07bc01e3, 0x7b409e50, 0xb441eb45, 0xd11ef005, 0x81e74570,
-0x163007bc, 0xad127b40, 0xf027bc01, 0x4378c05e, 0x278d01eb, 0x54d03c70,
-0x00000040, 0x00000000, 0x1135b810, 0x0274001f, 0x37808da1, 0x7c005f00,
-0xc0adf001, 0x00130837, 0x0d70005c, 0x1f02b7c0, 0xf0837c00, 0x13b7c10d,
-0x1b5c5ed7, 0x43c16d70, 0x00000660, 0x00000000, 0x04bfa000, 0x85fe09bf,
-0x7fc2cff0, 0xe981ff24, 0xc81ff007, 0x01ff107d, 0x1f7007fc, 0xfb087cc8,
-0xe067cc21, 0x007cc01f, 0x07c409f9, 0x00c01ff0, 0x00000e00, 0x00000000,
-0x02398815, 0x109c00ad, 0x3b440ec0, 0x8400ad10, 0x400ec000, 0x00292038,
-0x0e1000b4, 0x65003c10, 0xd0238482, 0x0038424e, 0x5b868ce1, 0x54408ed2,
-0x00000620, 0x00000000, 0x02390000, 0x01b600ad, 0x3b608ed1, 0x8400e900,
-0x400ed043, 0x00ed0438, 0x06500324, 0xa1003c40, 0xda0b8400, 0x4232450c,
-0x038400e1, 0x02400ed0, 0x00000400, 0x00000000, 0x00332804, 0x1a10018d,
-0x33402cc0, 0x00000d80, 0x480cd000, 0x400d9830, 0x08100034, 0x05043042,
-0xd1030400, 0x0032401c, 0x0f4500c1, 0x12440cd0, 0x00000c20, 0x00000000,
-0x003da815, 0x0a74005f, 0x3fc0afd0, 0x4c001b00, 0xd00ff006, 0x00df007c,
-0x0d70036c, 0xd1003c80, 0xc003cd00, 0x4032e01f, 0x8f4c00f3, 0x56900cf0,
-0x00000620, 0x00000000, 0x20370001, 0x205c180f, 0x33c41df0, 0x1c00df00,
-0xc00cf002, 0x001b0037, 0x04f0007c, 0xd70836c0, 0xf2077c00, 0x0035c00d,
-0x1b6c00cf, 0x05c00df0, 0x00000c00, 0x00000000, 0x803f0880, 0x03ec097f,
-0x3ec00ef0, 0xfc251330, 0xc00d3020, 0x40ff003c, 0x45f003fc, 0x5f003cc0,
-0xf003cc02, 0x203fc00f, 0x07cc00f3, 0x00c00d30, 0x00000c22, 0x00000000,
-0x00362081, 0x2744531d, 0x34600dd0, 0x74025108, 0x440db000, 0x20170034,
-0x15d00074, 0x5f003440, 0xd0034403, 0x0035c00d, 0x034400d1, 0x04400db0,
-0x00000802, 0x00000000, 0x0034a001, 0x0064005d, 0x34400dd2, 0x74021150,
-0x400d5803, 0x00dd0035, 0x0dd00374, 0x8d003441, 0xd0035480, 0x0077400d,
-0x234500d9, 0x04601d10, 0x00000200, 0x00000000, 0x00302010, 0x800480cd,
-0x32400cd1, 0x36008180, 0x500c1400, 0x00050031, 0x04c00034, 0x85003050,
-0xd0031000, 0x0075000c, 0x034400c0, 0x40501d90, 0x00000080, 0x00000000,
-0x003eb000, 0x016e005d, 0x3cd00fd0, 0x7c601300, 0xc00f1003, 0x40df203d,
-0x05f00374, 0x1d003cc4, 0xf003dc00, 0x0037c00f, 0x034c00eb, 0x00d00d30,
-0x00000ac0, 0x00000000, 0x003fb805, 0x03fc00ff, 0x3dc00ff8, 0xfc403f00,
-0xc00ff000, 0x0036003e, 0x07f000fc, 0x3f803fc4, 0xf003ec00, 0x503fc00f,
-0x03fc00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x102fa203, 0x83bc0873,
-0x1fc14f30, 0xce003328, 0xc06b3088, 0x02f70a3f, 0x0ff003cc, 0xf7080fc6,
-0x7080ee04, 0x081fc02f, 0x03cc003f, 0x0cc043f0, 0x00000e00, 0x00000000,
-0x06b70801, 0x03f42081, 0xaf482d14, 0x44520100, 0x406bb000, 0x24f1003f,
-0x01d003c5, 0xd9422300, 0xb2007000, 0x0837424d, 0xc344401d, 0x0440a5d0,
-0x00000c20, 0x00000000, 0x2123a011, 0x03344481, 0x93400c10, 0x040c0100,
-0x4028d013, 0x04c51133, 0x1cd00304, 0xcd604340, 0x18d20402, 0x2013404c,
-0x8334005d, 0x455014d0, 0x00000e80, 0x00000000, 0x0135a803, 0x03761091,
-0x67601d11, 0x44205508, 0x4009d083, 0x00d10037, 0x11d18344, 0xdd206744,
-0x90023400, 0x0017624d, 0x0160625c, 0x0c4005d0, 0x00000620, 0x00000000,
-0x0027a802, 0x037c40d3, 0x53c01d30, 0xc5011301, 0xc089f0c3, 0x00d72037,
-0x05f0034c, 0xd70847c0, 0x7006ec00, 0x2017812d, 0x0f7c005f, 0x09c48cf0,
-0x00000e20, 0x00000000, 0x40398007, 0x83f403ff, 0x2fc805f0, 0x3c453b00,
-0xc009b00f, 0x00ff0037, 0x0bf003f4, 0xf1002fc2, 0xf00f7800, 0x801e821f,
-0x8bdd007f, 0x1fc20fe0, 0x00000600, 0x00000000, 0x00250802, 0x034c81df,
-0x14d00d34, 0x4c014b00, 0xd0093083, 0x00d3c030, 0x0db0037c, 0xdb4007c0,
-0xb0834c00, 0x0094c01d, 0x0f4c0a53, 0x08c10df0, 0x00000420, 0x00000000,
-0x0034a013, 0x1b80019d, 0x24400d10, 0xc4005000, 0x01094003, 0x00f1003c,
-0x1b5003fc, 0xf1002704, 0xb10fe88a, 0x0044881d, 0x876c6041, 0x4e803fd0,
-0x00000200, 0x00000000, 0x0022a007, 0x932500cd, 0x72498810, 0x04200900,
-0x033c1003, 0x00d10031, 0x1c180334, 0xc8101702, 0x9044048a, 0x01d3612c,
-0x02140185, 0x1c4294d2, 0x00000a00, 0x00000000, 0x00788004, 0x27a409ad,
-0x62401e10, 0x84016120, 0x401e5807, 0x21e10279, 0x1a402794, 0xe1c05b41,
-0x91458401, 0x4459401f, 0x0fb50925, 0x124016d1, 0x00000200, 0x00000000,
-0x00301012, 0x032c00cf, 0x12402832, 0x0c000b04, 0x42083083, 0x00c12031,
-0x8cb00374, 0xcb400340, 0xb0010424, 0x0093c00c, 0x0b1c4057, 0x48c08cf0,
-0x00000040, 0x00000000, 0x003db802, 0x0bdc00bf, 0x2dc08ff0, 0xfd407f80,
-0xc80bf003, 0x00df0c36, 0x0bf04bfc, 0xee023fc0, 0xe003fd00, 0x221ad80e,
-0x03ec007b, 0x0bc20ef0, 0x00000660, 0x00000000, 0x0827a015, 0x072d80cf,
-0xb4c20b32, 0x4c035384, 0xc0593203, 0x38d32134, 0x05300b4d, 0xd7000fc0,
-0xb0007c00, 0x2014c05d, 0x066c005f, 0x57c00d30, 0x00000e00, 0x00000000,
-0x00398812, 0x1b8400ed, 0x39080e15, 0xc6306110, 0x408b1003, 0x04f10338,
-0x4e1013fc, 0xe9003f08, 0xb503dc04, 0x801ac54f, 0x03ac007d, 0x4b406e32,
-0x00000620, 0x00000000, 0x00790003, 0x97e401fd, 0x78001812, 0xa4416188,
-0x401e14c3, 0x05e14870, 0xbe100384, 0xed084b0a, 0x10059409, 0x805840de,
-0x0796016d, 0x0f401e94, 0x00000400, 0x00000000, 0x08332812, 0x030608cd,
-0x30400c12, 0x24414148, 0x581c110f, 0x00d18030, 0x2c100374, 0xc9003744,
-0x94071400, 0x2882433c, 0x0324014d, 0x4b401c10, 0x00000c20, 0x00000000,
-0x0015a817, 0x01ec007f, 0xdcc02630, 0xac455324, 0xc055300d, 0x00530014,
-0x3730014c, 0x57411fc0, 0x300ddc80, 0x805ce635, 0x09dc097f, 0x5fc437b0,
-0x00000620, 0x00000000, 0x10070012, 0x007c921f, 0x87d001f1, 0x5d001f04,
-0xc201f000, 0x801f1007, 0x01f0007c, 0x170047c4, 0xf02c7c00, 0x1207e081,
-0x407d081f, 0x4bc091f1, 0x00000c00, 0x00000000, 0x00270810, 0x024d009f,
-0x64c109f8, 0x7c01d300, 0xc0093042, 0x00930027, 0x49b0026c, 0x930027c1,
-0x34227c00, 0x14274005, 0x024c019f, 0x43c059f0, 0x00000c20, 0x00000000,
-0x00262001, 0x0264228d, 0xe05009d9, 0x74219111, 0x40291082, 0x809b0027,
-0x29100255, 0x91502740, 0x100e7402, 0x00274001, 0x064c018d, 0x074019d0,
-0x00000800, 0x00000000, 0x0024a018, 0x0264809d, 0x244009d0, 0x76049112,
-0x41891002, 0x00912023, 0x09900264, 0x91c02740, 0x18033490, 0x022540a1,
-0x06402895, 0x634009d8, 0x00000200, 0x00000000, 0x02202010, 0x0224089d,
-0x205149d0, 0x76158105, 0x41481782, 0x08890123, 0x18102215, 0x81c22340,
-0x10233400, 0x00234088, 0x2624288d, 0x436008d9, 0x00000080, 0x00000000,
-0x0586b01d, 0x004e025f, 0x04d441d0, 0x7c040301, 0xc0413278, 0x021302c7,
-0x41b0586c, 0x13058741, 0x30587e34, 0x2017c169, 0x084d165f, 0x77c141f2,
-0x00000ac0, 0x00000000, 0x012fb819, 0x0a5e04be, 0x2bd00bf2, 0xfc149f40,
-0xc34be006, 0x269f0267, 0x0bf0127c, 0x9f512fc4, 0xd012fc00, 0x003ec449,
-0x129c04bf, 0x67c20ff0, 0x00000e60, 0x00000000, 0x0127a018, 0x424d22bf,
-0x2cc109b0, 0x0c909304, 0xc90b3036, 0x149301a7, 0x4b300adc, 0xb30326c0,
-0x3056ce04, 0x002ec01a, 0x02cc00bf, 0x63c04b30, 0x00000e00, 0x00000000,
-0x0107081c, 0x0044841d, 0x04520310, 0x44001b20, 0xc0011100, 0x02111107,
-0x21109078, 0x11008440, 0x10014c42, 0x2007c001, 0x8054951d, 0x734021b2,
-0x00000c20, 0x00000000, 0x04a3a010, 0x0284048d, 0x20400a12, 0x3510c100,
-0x4908d032, 0x208120a3, 0x28101a11, 0x8901a040, 0x10422442, 0x00204418,
-0x0614018d, 0x43408810, 0x00000e80, 0x00000000, 0x0825a818, 0x0244409d,
-0x24450b10, 0x24848900, 0x4819d002, 0x20910027, 0x29120274, 0xd940a450,
-0x14020580, 0x00274019, 0x0654019d, 0x63404990, 0x00000620, 0x00000000,
-0x0227a805, 0x824c059f, 0x24c00930, 0x6c009301, 0xc809f016, 0x00930027,
-0x0834025c, 0x8b02e4c2, 0x32026400, 0x00a4c009, 0x025c239f, 0x17c20930,
-0x00000e20, 0x00000000, 0x00658014, 0x027c049f, 0x27c40870, 0x5c00df34,
-0xc0093526, 0x009f4025, 0x09f00265, 0x970065c0, 0xf0527c40, 0x0227c009,
-0x0274009f, 0x53c009f0, 0x00000600, 0x00000000, 0x00050814, 0x00bc0813,
-0x00d023f2, 0x7c001300, 0xc0113400, 0x00131003, 0x31f0000c, 0x134004d0,
-0x30007c00, 0x0484c011, 0x244c0113, 0x50c021f0, 0x00000420, 0x00000000,
-0x0014a014, 0x01744071, 0x9c4405d0, 0x74005100, 0xc0171201, 0x00513815,
-0x27d0056c, 0x75001440, 0x5001dc02, 0x081ec427, 0x8dc5037b, 0x504007d0,
-0x00000200, 0x00000000, 0x0032a014, 0x033410d1, 0x10480cd0, 0x3400c120,
-0x400c0003, 0x00d54833, 0x0cd00704, 0x45003440, 0x100c3484, 0x02304281,
-0x034000d1, 0x50400cd0, 0x00000a00, 0x00000000, 0x01788005, 0x04b400e1,
-0x104002d0, 0xf400a100, 0x402a1023, 0x08e50031, 0x2fd84394, 0xa5033104,
-0x5043f400, 0x004e04c2, 0x938442c9, 0x144014d0, 0x00000200, 0x00000000,
-0x417c1015, 0x03b401e3, 0x78401ef0, 0xbc016300, 0x40123037, 0x01f7007b,
-0x16d00785, 0x670338c0, 0x3007bc81, 0x0048c056, 0x8d8c4123, 0x54c41af0,
-0x00000040, 0x00000000, 0x0275b810, 0x007c00df, 0x37c000f0, 0x7c661f40,
-0xc005d20b, 0x01db10b5, 0x04f0036c, 0x9f0136c0, 0xb5011e00, 0x2003c411,
-0x877c001f, 0x43c005f2, 0x00000660, 0x00000000, 0x007fa000, 0x87fc01ff,
-0x7cc01f70, 0xcc03f700, 0xc897f027, 0x0df70cfc, 0x13b006cc, 0xf7607fc0,
-0x3004dc29, 0x024cc8d3, 0x07cc0d73, 0x00c48e30, 0x00000e00, 0x00000000,
-0x02398815, 0x00b600ad, 0x380c4212, 0xac00a146, 0x500ad033, 0x08e1023d,
-0x021002bc, 0xa1103b40, 0x1002d400, 0x0b09c4c3, 0x0ac48c71, 0x5440c6b0,
-0x00000620, 0x00000000, 0x00390000, 0x03b4086d, 0x38050e50, 0x84006500,
-0x000cd003, 0x04cd0038, 0x86100280, 0xed443b40, 0x5043b020, 0x008e40e2,
-0x21960ca1, 0x01448b10, 0x00000400, 0x00000000, 0x00772804, 0x0036800d,
-0xf0407010, 0x24200100, 0x4000d003, 0x00c92030, 0x40100224, 0x8940b340,
-0x5a0d0480, 0x00014001, 0x06544281, 0x10401490, 0x00000c20, 0x00000000,
-0x013da815, 0x037c11df, 0xb0d01d70, 0xcc015700, 0xc001f003, 0x00ff003c,
-0x3134024c, 0x9f00bfe1, 0x70045e40, 0x01c6c003, 0x8bdc28a3, 0x55d04534,
-0x00000620, 0x00000000, 0x20370001, 0x007c44df, 0xa7c001f2, 0x7c885f40,
-0xc00df203, 0x00d70033, 0x2170023c, 0xd7083740, 0xa4017e00, 0x4087c011,
-0x6b6900df, 0x078205f2, 0x00000c00, 0x00000000, 0x003f0880, 0x037c01f3,
-0x3cc00ef2, 0xce003306, 0xc00f3003, 0x00e3003d, 0x5630024c, 0x83143cc0,
-0x32c18c02, 0x080c4803, 0x00cc003f, 0x03c00330, 0x00000c22, 0x00000000,
-0x08362081, 0x007403d1, 0x344001d0, 0x44181100, 0x40015083, 0x00d50034,
-0x31102650, 0xd1603781, 0x50015483, 0x0007c029, 0x8a402939, 0x074125b0,
-0x00000802, 0x00000000, 0x0034a001, 0x83740a11, 0x34500dd0, 0x10000104,
-0x411c1203, 0x20d10036, 0x01138344, 0x91503142, 0x10084480, 0x21854031,
-0x0544005d, 0x07400510, 0x00000200, 0x00000000, 0x00302010, 0x00340001,
-0x204000d2, 0x04200100, 0x40085003, 0x00c50032, 0x001a0314, 0x41803340,
-0x50021420, 0x08034000, 0x80054049, 0x43400492, 0x00000088, 0x00000000,
-0x0036b000, 0x037c0013, 0x34c00df0, 0xd4800340, 0xc0053083, 0x00d3003c,
-0x05340344, 0x910039c0, 0x30034e80, 0x0005c401, 0x004c009f, 0x03c00132,
-0x00000ac0, 0x00000000, 0x003fb805, 0x00fc003f, 0x3bd002f0, 0xfd203b00,
-0xc403c003, 0x00ff003d, 0x03e203fc, 0xff003dc0, 0xf001fc00, 0x000bc003,
-0x00fc00bf, 0x17c007f0, 0x00000e60, 0x00000000, 0x003fa003, 0x23fc4cff,
-0x3ec043b8, 0xf884f301, 0xc44ff003, 0x2c730b0f, 0x0f3011fc, 0xf3260fc9,
-0x3102fc00, 0x023cc48b, 0x038c0c33, 0x0cc08fb0, 0x00000e00, 0x00000000,
-0x003b0801, 0x20740ed1, 0xbc41c9b0, 0x84bcf124, 0x49cf1203, 0x06450183,
-0x6f104930, 0xf1088741, 0x10387408, 0x423d48ad, 0x0bc40201, 0x1c406f10,
-0x00000c20, 0x00000000, 0x0032a011, 0x13140005, 0x30440414, 0x0400c983,
-0x420c5203, 0x0c410303, 0x0c901934, 0xc1000140, 0x10c23414, 0x41344848,
-0x23040801, 0x4c402d90, 0x00000e80, 0x00000000, 0x08358803, 0x2074b811,
-0x3040ad10, 0x0400c900, 0x420d1003, 0x02552087, 0x0d908174, 0xd1201340,
-0x10067480, 0x0035404c, 0x03460011, 0x1c4a0d90, 0x00000620, 0x00000000,
-0x0037a800, 0x855c2095, 0x34c00110, 0x4d00db40, 0xc40d7203, 0x01d30237,
-0x0db0097c, 0xd340b5c2, 0x30077440, 0x0834c009, 0x034d0253, 0x00c00db1,
-0x00000e22, 0x00000000, 0x083d8087, 0x84fc0097, 0x3dd80bf0, 0xfc20f720,
-0xc10f7003, 0x08ff007f, 0x0d7089fc, 0xff1007c0, 0xf101bc20, 0x0c3fc70b,
-0x03fc093f, 0x1fc00f70, 0x00000602, 0x00000000, 0x00310802, 0x030c0017,
-0x34c821f8, 0x7c40d322, 0xd00d3103, 0x22d380b0, 0x0d340b0c, 0xd340b4d0,
-0xb4037c40, 0x0037c019, 0x034d02d3, 0x28c00d70, 0x00000420, 0x00000000,
-0x003ca013, 0x22444011, 0x7c4409d2, 0xf441f340, 0x403f1003, 0x00db8034,
-0x1f108344, 0xf3081440, 0xf2037412, 0x00fb4029, 0x33840091, 0x4c400e10,
-0x00000200, 0x00000000, 0x0032a003, 0x0a042f45, 0x724001d0, 0x3648c900,
-0x481c5003, 0x00052800, 0x0c100204, 0xc9080064, 0x94023411, 0x00f34828,
-0x0b260091, 0x1c400c50, 0x00000a00, 0x00000000, 0x08788000, 0x048481e1,
-0x7f4010d2, 0xb601e100, 0x411c1303, 0x21650058, 0x1e100784, 0xe1306861,
-0xd407f401, 0x047f421e, 0x07a629e1, 0x74401f10, 0x00000200, 0x00000000,
-0x00301016, 0x030c0007, 0x32c08cd0, 0x3800cb02, 0xc00c1023, 0x00c54020,
-0x0c302b0d, 0xcb008080, 0xb4223c80, 0x0133c008, 0x032c0a83, 0x48c00c70,
-0x00000040, 0x00000000, 0x0435b800, 0x017d009f, 0x30c08df0, 0x7810d704,
-0xc18df073, 0x00db0037, 0x0df0836c, 0xdf0037c0, 0xf4033c18, 0x00b3c00d,
-0x035c28df, 0x0bc0acf0, 0x00000660, 0x00000000, 0x0037a015, 0x00644057,
-0xb6c4053a, 0x4d13cf04, 0xc95d304b, 0x005f0006, 0xedf0017c, 0xd71037c0,
-0xf0024c91, 0x2034d21c, 0x734c0053, 0x44c00d30, 0x00000e00, 0x00000000,
-0x133d8810, 0x80ac00c1, 0x3b400630, 0xc400ed01, 0x4a4e3093, 0x006d0018,
-0x4ed001b4, 0xcd002bc3, 0x70038404, 0x00b0400e, 0x83840061, 0x4c404c10,
-0x00000624, 0x00000000, 0x017900a3, 0x07040165, 0x7b401e91, 0x8401fd00,
-0x445e9303, 0x01ed0068, 0x1e1007b4, 0xed007b40, 0xd006a401, 0x4178401f,
-0x070401e1, 0x0440de14, 0x00000402, 0x00000000, 0x20332812, 0x436028c1,
-0x33400c94, 0x0400cd08, 0x420c9003, 0x0bcd00f4, 0x0cd00734, 0xcd207740,
-0x50072480, 0x0032401c, 0x03040ac1, 0xc84c0d10, 0x00000c20, 0x00000000,
-0x0015a816, 0x01cc4177, 0x1fc44730, 0x44207d00, 0xd0053001, 0x017f095c,
-0x063045fc, 0x7701dfc0, 0xf015ec80, 0x001cc017, 0x01cc0973, 0x5c500730,
-0x00000620, 0x00000000, 0x00070012, 0x007c001f, 0x87c00170, 0x7c821f00,
-0xc8217000, 0x101f0407, 0x21f0407c, 0x1f0405c0, 0xf0005d00, 0xa005c081,
-0x083d001f, 0x4bd001f0, 0x00000c00, 0x00000000, 0x00270810, 0x024c089f,
-0x66c20830, 0x7c009f02, 0xc049a102, 0x00830027, 0x0930020c, 0x930024c0,
-0xf0026c20, 0x1027c009, 0x264c0093, 0x41c00934, 0x00000c20, 0x00000000,
-0x18262000, 0x0e440091, 0xe4400915, 0x74129d00, 0x42399082, 0x00910827,
-0x29120244, 0x911826d1, 0xd0027400, 0x10a74209, 0x1a4c0081, 0x04400931,
-0x00000800, 0x00000000, 0x0020a018, 0x2244008d, 0x24400910, 0x34009d04,
-0x4109d802, 0x00910027, 0x09900244, 0x94002440, 0xd0036401, 0x00234089,
-0x02440099, 0x614009d0, 0x00000200, 0x00000000, 0x10a02010, 0x8a040281,
-0x215bc818, 0x34408d00, 0x4208d00a, 0x3c812723, 0x09147205, 0x81072040,
-0xd0723400, 0x00234148, 0x22041c89, 0x40408810, 0x00000080, 0x00000000,
-0x0004301c, 0x014d001f, 0x04c26130, 0x74141f95, 0xc140b000, 0x06134187,
-0x4130184c, 0x11418441, 0xf0186c14, 0x4517c041, 0x584c061b, 0x75c161b0,
-0x00000ac0, 0x00000000, 0x08a7b039, 0x0bfc22bf, 0x26c04bf0, 0x7c949f05,
-0xc149320a, 0x04bf012f, 0x497092fc, 0x9f112fc1, 0xf012fc34, 0x2527c54b,
-0x125d04a7, 0x67c049f0, 0x00000e64, 0x00000000, 0x01a7a218, 0x42cc06bf,
-0xafc029f2, 0x7412bf01, 0xc06bf01a, 0x049f0127, 0x2bf0127c, 0xbf0424c1,
-0xf01a4c02, 0x04afc04b, 0x5acc269f, 0x63c02914, 0x00000e00, 0x00000000,
-0x0186089c, 0x00440651, 0x874421d0, 0x1c461d21, 0x44411098, 0x021d0517,
-0x00700074, 0x1d018444, 0xd0014504, 0x01874161, 0x1c44005d, 0x73400010,
-0x00000c22, 0x00000000, 0x00a1a010, 0xc205228d, 0xa34068d0, 0x36008920,
-0x4468d00a, 0x188d00a3, 0x09905a34, 0x99042054, 0xd01a0406, 0x01214088,
-0x1244028d, 0x4b402810, 0x00000e80, 0x00000000, 0x00252818, 0x226468d1,
-0x274429d0, 0x74209d00, 0x40091102, 0x429d0027, 0x09500a74, 0xdd082540,
-0xd0024440, 0x00276409, 0x0045009d, 0x63400918, 0x00000620, 0x00000000,
-0x0027a801, 0x0a4c009f, 0x27c019f0, 0x7c009f00, 0x4009f002, 0x019f10a7,
-0x09f0067c, 0x9f2024c0, 0xf0024800, 0x8825e409, 0x0044028f, 0x17c00912,
-0x00000c20, 0x00000000, 0x00218014, 0x065c4197, 0x27c049f0, 0x5c109f14,
-0xc0097802, 0x099f0027, 0x09f2227c, 0x9f0266c9, 0xf0027c10, 0x1027c109,
-0x407c409f, 0x5bc009f4, 0x00000400, 0x00000000, 0x00050814, 0x207c0a17,
-0x04c001e0, 0x4c801308, 0xc4015100, 0x00134084, 0x0170006d, 0x1b0804c0,
-0x30884d00, 0x0006d001, 0x006d0213, 0x50d201b0, 0x00000420, 0x00000000,
-0x1014a014, 0x05f48075, 0x9f4405d0, 0x44027100, 0x40071801, 0x00510014,
-0x36d20144, 0x6b0016e0, 0x10014412, 0x081c4027, 0x048c0071, 0x50400510,
-0x00000000, 0x00000000, 0x1032a014, 0x033413dd, 0xf0420cd0, 0x6403c100,
-0x401c5003, 0x00c19031, 0xbcd00304, 0xc5103040, 0x50033400, 0x0070402c,
-0x0f0400c1, 0x50400c10, 0x00000a00, 0x00000000, 0x02788205, 0x01b64025,
-0xe3404ed2, 0xa4038000, 0x443c1803, 0x05e10071, 0x0ec01394, 0xe9027e42,
-0x5417b400, 0x00f14818, 0x430404c1, 0x10405e10, 0x00000200, 0x00000000,
-0x033c1015, 0x84bc41a7, 0x78c37ef0, 0xa501e340, 0xd01a502f, 0x87c30179,
-0x1e709fac, 0xb3007c40, 0x710ffc01, 0x4078c01e, 0x178897e3, 0x50c43e30,
-0x00000040, 0x00000000, 0x0035b010, 0x007c001f, 0x37c40df2, 0x5c009f00,
-0xc005f11b, 0x02df20b6, 0x0df00b6c, 0x9f05b7c0, 0xb0034c00, 0x0014c40d,
-0x337c86df, 0x43c06d74, 0x00000660, 0x00000000, 0x007fa002, 0x06fc01f7,
-0x7fc09f36, 0xec01f703, 0x021ff007, 0x87ff24ff, 0xdbf23bfe, 0x7f007cc2,
-0xf08fcc81, 0x013cc017, 0x3f8c81ff, 0x08c03f30, 0x00000e00, 0x00000000,
-0x00388815, 0x209c006b, 0x29e08e30, 0xa448a122, 0x404a9003, 0x40ed013b,
-0x8a7103be, 0x2d013848, 0xd0038400, 0x0328400b, 0x238480ed, 0x44400e10,
-0x00000620, 0x00000000, 0x00390008, 0x40b400a5, 0x03448e90, 0x04004111,
-0x440a5023, 0x04ed083b, 0x409223b4, 0x6d0c3848, 0xd0238408, 0x823a4006,
-0x13c400cd, 0x00400e15, 0x00000400, 0x00000000, 0x80332816, 0x0c141241,
-0x05402c10, 0x04201100, 0x40011003, 0x09dd1073, 0x01502754, 0x0d203060,
-0xd0070600, 0x8006401c, 0x034400dd, 0x18400c18, 0x00000c20, 0x00000000,
-0x003da815, 0x0f7c0255, 0x1740afb0, 0xed805740, 0x4005f083, 0x20ffa17f,
-0x05d103f4, 0xdd003cd2, 0xf01fc400, 0x0006d11d, 0x034d01fd, 0x54500f34,
-0x00000620, 0x00000000, 0x28370009, 0x097c001f, 0x07c80df0, 0x7c005f00,
-0xc005f083, 0x00df0037, 0x0171037c, 0x5f0033c0, 0xf0937d02, 0x0035cc21,
-0x0b7c08df, 0x07c00df0, 0x00000c00, 0x00000000, 0x10370801, 0x47fc0037,
-0x3cc00f70, 0x8c08f300, 0x880b3803, 0x80ff003c, 0x8f3003cc, 0x930c3cc0,
-0x3003ccc0, 0x004fc00b, 0x0fcc00f3, 0x00c00e30, 0x00000c22, 0x00000000,
-0x08362081, 0x0374021d, 0xb4600dd0, 0x7c73d30c, 0x41255003, 0x80dd2034,
-0x3990036c, 0x1b0836c1, 0x10834400, 0x0cd5c241, 0x076c20d9, 0x04400db2,
-0x00000802, 0x00000000, 0x00348000, 0x9a7400dd, 0x14440cd0, 0x44801900,
-0x40055103, 0x00dd0035, 0x05900354, 0xcd003442, 0x14031400, 0x22074445,
-0x0b4400d9, 0x04400d10, 0x00000a00, 0x00000000, 0x00302010, 0x003480cd,
-0x01400cd0, 0x14000110, 0x44005003, 0xa0cd0031, 0x00960315, 0x01003040,
-0x10031400, 0x00214000, 0x036400d9, 0x40400c90, 0x00000080, 0x00000000,
-0x003eb000, 0x033c009f, 0x04500f70, 0xc5001b40, 0xd0091083, 0x80ff003d,
-0x053803d4, 0xd1403c50, 0x3203dd00, 0x4007c001, 0x034c00f2, 0x00d00e30,
-0x00000044, 0x00000000, 0x083f9004, 0x83fc00ff, 0x0ec00ff0, 0xec003f00,
-0xc003f103, 0x00ff103e, 0x037803ec, 0x3f003fc4, 0xf083ec00, 0x000dc203,
-0x03fc00f7, 0x17e80ff0, 0x00000e60, 0x00000000, 0x003fa003, 0x00fc1433,
-0x1ac00f30, 0xfc08ff00, 0xc84f7123, 0x04f100bd, 0x4b70d0ec, 0x3b053d80,
-0xf241dc80, 0x040ad40b, 0x03cc00f3, 0x0fc5c734, 0x00000e00, 0x00000000,
-0x20330801, 0x10748651, 0x25480f11, 0x7400dd00, 0x44edd013, 0x1af103bc,
-0xc8100855, 0x1100b450, 0xd0594424, 0x0094c00b, 0x030402eb, 0x07402511,
-0x00000c20, 0x00000000, 0xa033a011, 0x60341001, 0x20040c12, 0x3604cd00,
-0x410cd003, 0x00c19031, 0x04500004, 0x81003441, 0xd0010410, 0x05306888,
-0x830402c1, 0x47404414, 0x00000e80, 0x00000000, 0x20358803, 0x80740851,
-0x34580d10, 0x7400dd10, 0x400dd003, 0x00d18034, 0x09108514, 0x9540b440,
-0xd1074400, 0x00364009, 0x034400d9, 0x0f408512, 0x00000620, 0x00000000,
-0x4077a800, 0x03340093, 0x34c80c34, 0x7cb0df00, 0xc009f047, 0x00d34035,
-0x19700c4c, 0x1b2030c0, 0xf0075d09, 0x9034c808, 0x034d00d3, 0x0bc23530,
-0x00000e20, 0x00000000, 0x027d8087, 0x007c80ff, 0xadc80ff0, 0xf8a0fd20,
-0xc00ed08b, 0x40ee003b, 0x2bf082dc, 0x3b027fc4, 0xd0037c01, 0x003dc00b,
-0x83f800ff, 0x1fc015e0, 0x00000600, 0x00000000, 0x00350802, 0x236d0893,
-0x27c00d34, 0x7e01d320, 0xc0093003, 0x00d31034, 0x45b0024c, 0x930cb4c0,
-0x30127c01, 0x0033c009, 0x034d00d3, 0x08c06130, 0x00000420, 0x00000000,
-0x21f4a013, 0x8dc401d1, 0xa6480f10, 0x7401db03, 0x420d1082, 0x00fb003c,
-0x29108355, 0x910836c0, 0xb087742b, 0x0037424b, 0x03ee00f1, 0x4c502151,
-0x00000200, 0x00000000, 0x01e6a007, 0x84040109, 0x13400c10, 0x3400c100,
-0x500c1049, 0x00c90030, 0x09d00004, 0x11001060, 0x500d3482, 0x42234008,
-0x036400d5, 0x1c422c10, 0x00000a00, 0x00000000, 0x02688006, 0x1c844149,
-0x7b409e10, 0xf6016912, 0x491f1005, 0x4dc92278, 0x1a520694, 0x61427040,
-0xd055b401, 0x027b409a, 0x07a001e5, 0x10009e40, 0x00000200, 0x00000000,
-0x42201012, 0x800c060b, 0x23e80c10, 0x3400c320, 0xc88c3403, 0x04c98034,
-0x2cf0034c, 0xc3023040, 0x70013c00, 0x0233c008, 0x030c04c6, 0x48c00430,
-0x00000040, 0x00000000, 0x0a2db802, 0x90dc00b6, 0x3ec10ff0, 0xbc407f20,
-0xc00eb003, 0x05ff003f, 0x89b0237c, 0xff023fd8, 0xb013fc08, 0x023fc20b,
-0x63dc00fb, 0x0bc00ff4, 0x00000660, 0x00000000, 0x0037a015, 0x077c0093,
-0x34ed2d30, 0x7c84d300, 0xc009f001, 0x18db00b7, 0x0d30804c, 0x532005c4,
-0x30037c12, 0x2034c019, 0x034c04d3, 0x54c0093c, 0x00000e00, 0x00000000,
-0x00398812, 0x14b400e1, 0x38400f12, 0xb490e100, 0x400ed003, 0x01c1053b,
-0x0c1002ec, 0x61003bc4, 0x1003b400, 0x2038512a, 0x83d48af1, 0x48400e14,
-0x00000620, 0x00000000, 0x00790083, 0x27f40361, 0x68404e10, 0xb401e120,
-0x401ad007, 0x00e1427b, 0x1e100784, 0xe58c6d40, 0x90473401, 0x00f8404a,
-0x178405e1, 0x0c451210, 0x00000400, 0x00000000, 0x0a372812, 0x893440c1,
-0x74400c00, 0x34424140, 0x421cd187, 0x00c10033, 0x9c114324, 0xc5007240,
-0x90073401, 0x00704008, 0x031400c9, 0x48506010, 0x00000c20, 0x00000000,
-0x4055a817, 0x4dfc8173, 0x9cc00536, 0xfc485321, 0xc047f00d, 0x00530017,
-0x073409cc, 0x570859f0, 0xa52dfc05, 0x40dcc805, 0x014c0053, 0x5cc03734,
-0x00000620, 0x00000000, 0x00070012, 0x407c901f, 0x47c801f2, 0x7c001f08,
-0xc001f22c, 0x00170807, 0x01f0807d, 0x1a4007c0, 0x70007c02, 0x0007c000,
-0x007c0017, 0x4bc001f2, 0x00000c00, 0x00000000, 0x02270810, 0x067c4993,
-0x24c009f0, 0x7c01db00, 0xc059f012, 0x80830023, 0x0938024d, 0xd30064c8,
-0x20023c80, 0x0520d009, 0x020c8093, 0x40c00930, 0x00000c20, 0x00000000,
-0x00a62001, 0x22742091, 0xa50009d8, 0x76019140, 0x4809d012, 0x009b0027,
-0x2850026d, 0x93002474, 0x10027400, 0x00644019, 0x026c009b, 0x04402950,
-0x00000800, 0x00000000, 0x00a4a018, 0x02748091, 0x244008d0, 0x56089904,
-0x4009d802, 0x80910027, 0xa9120304, 0x91412440, 0x5482540a, 0x00344049,
-0x02440081, 0x6040ac10, 0x00000200, 0x00000000, 0x4a202010, 0x22340881,
-0x214828d0, 0x34008102, 0x61ccd002, 0x00890123, 0x89500224, 0x81003042,
-0x50233408, 0x022040c8, 0xa2240489, 0x40508850, 0x00000080, 0x00000000,
-0x0082b01d, 0x597c1613, 0x804001d0, 0x5c801b00, 0xc061d100, 0x1e1312c7,
-0x6110784d, 0x13450441, 0x70585c02, 0x0580c031, 0x084c0b13, 0x74d16030,
-0x00000ac0, 0x00000000, 0x212fb819, 0x92bc04ff, 0x2fc029f0, 0xfc149f01,
-0xc04bf052, 0x019d0263, 0x4bf006fc, 0x97003bc0, 0xb012fc04, 0x112fc0ca,
-0x1a7c099f, 0x67c04bf0, 0x00000e60, 0x00000000, 0x002fa019, 0x22bc6cb3,
-0xacc10870, 0x7c029700, 0xc14bf002, 0x029301a4, 0x8bb00a4d, 0xb3012cc0,
-0xf032fc00, 0x002cc183, 0x324c0c93, 0x60c14b30, 0x00000e00, 0x00000000,
-0x4107089c, 0x18740e11, 0x06400130, 0x74001511, 0x40217250, 0x80111180,
-0x8550006c, 0x13000450, 0xd0301c04, 0x14045071, 0x08144a11, 0x70506514,
-0x00000c20, 0x00000000, 0x0423a010, 0x0a340081, 0x62610850, 0x34208501,
-0x4149d012, 0x008180a0, 0x08100a44, 0x89022440, 0xd0123414, 0x02224008,
-0x1a240089, 0x40410814, 0x00000e80, 0x00000000, 0x0021a818, 0x82760091,
-0x22480991, 0x74009100, 0x08095062, 0x00810024, 0x89501264, 0x91002540,
-0xd00b5614, 0x04264009, 0x02342099, 0x60404814, 0x00000620, 0x00000000,
-0x0027a805, 0x227c0393, 0x64c00872, 0x7c049740, 0xc009f002, 0x80934024,
-0x0930164c, 0x9b40a0c8, 0xe0a27c01, 0x0062d008, 0x026c809b, 0x14c02934,
-0x00000e20, 0x00000000, 0x00258014, 0x823c029f, 0x65d00970, 0x7c00df11,
-0xd0097003, 0x009f1027, 0x09f0027c, 0x970026c0, 0xf0065c80, 0xc165c001,
-0x025c0097, 0x53c009f0, 0x00000600, 0x00000000, 0x00050814, 0x104c001f,
-0x04c20132, 0x7c001308, 0xc8113000, 0x00131003, 0x01b0086c, 0x1b0244c0,
-0x30004c10, 0x1006c401, 0x004c4003, 0x50d06130, 0x00000420, 0x00000000,
-0x801ca014, 0x05c4805d, 0x1c400712, 0x74055100, 0x6076b00d, 0x0051401f,
-0x375001fc, 0x7100dcc2, 0xb001dc83, 0x115c4013, 0x017c0051, 0x51501714,
-0x00000200, 0x00000000, 0x0062a014, 0x072501cd, 0x12520c10, 0x34004100,
-0x401c1048, 0x00c90033, 0xad900364, 0xc9807269, 0x50072601, 0x0870601c,
-0x030400c1, 0x50403012, 0x00000a00, 0x00000000, 0x0c288005, 0x43e403ed,
-0x2e404e12, 0xb4006100, 0x400a900e, 0x00e9023b, 0x0e542334, 0xa1001840,
-0xdb0e9603, 0x5020554c, 0x13b001c1, 0x15490210, 0x00000200, 0x00000000,
-0x00481015, 0x06ac81bd, 0x7a413e34, 0xf4016300, 0x48163017, 0x01c8417b,
-0x1cb417ac, 0xfb207250, 0x7407ad01, 0x007ac00e, 0x178c04e3, 0x54d01f34,
-0x00000040, 0x00000000, 0x202db810, 0x005800df, 0x21c00df0, 0x7c065f44,
-0xc007f0af, 0x00d70137, 0x0df00b6c, 0x9f0017d0, 0xa0026c00, 0x00a7c81d,
-0x2b6c02df, 0x42c00df4, 0x00000660, 0x00000000, 0x027fa002, 0x06fc41f3,
-0x5dc01fb0, 0xcc037300, 0xc097300d, 0x13f320fd, 0x1fb00fec, 0xf3206dc0,
-0xf006fc01, 0x03fec11f, 0x0fcc13f3, 0x00c01f30, 0x00000e00, 0x00000000,
-0x02398815, 0x01f404e1, 0x28c48e11, 0xc4806110, 0x41873089, 0x00f1013c,
-0x4e1013ed, 0xab002ac0, 0xd002b480, 0x022a400e, 0x03c440f1, 0x54400f52,
-0x00000620, 0x00000000, 0x200d0208, 0x42b400e1, 0x79400c90, 0xa4006900,
-0x4a86902b, 0x08e10839, 0x06128384, 0xa1003d44, 0xd002a400, 0x8120400f,
-0x038400e1, 0x004006d0, 0x00000400, 0x00000000, 0x00372806, 0x0c3421c1,
-0x24400c10, 0x04124940, 0x40041003, 0x00c10030, 0x7c102324, 0x8900f242,
-0xd00e3408, 0x0224420c, 0x030400c1, 0x1040a4d4, 0x00000c20, 0x00000000,
-0x0005a81d, 0x8f7c0fd3, 0x05c00fb0, 0xec005b00, 0xc009b01d, 0x00f3403d,
-0x4d3403cc, 0xd304f5c0, 0xf00a3c01, 0x6076f00c, 0x03cd40f3, 0x54d010f8,
-0x00000620, 0x00000000, 0x60070001, 0x037c809f, 0x35c00df2, 0x5c401702,
-0xc00df409, 0x00df0033, 0x0c70137c, 0x9f0417cc, 0xf22a7c00, 0x2027c80d,
-0x037c00df, 0x07c02364, 0x00000c00, 0x00000000, 0x002f0801, 0x428c03a3,
-0x2ec20e30, 0xcc007306, 0xc857f003, 0x00e3003c, 0x2f3c03ec, 0xf3001cc0,
-0x304efc00, 0x017ec00f, 0x03cc00e3, 0x00c10330, 0x00000c22, 0x00000000,
-0x18262089, 0x1e446091, 0x34400d50, 0x44005110, 0xd004d02f, 0x00da0036,
-0x1d100315, 0x9b025144, 0x50005c43, 0x0065401d, 0x035440df, 0x04509914,
-0x00000802, 0x00000000, 0x0414a001, 0x07450091, 0x06400d10, 0x44040180,
-0x4005d081, 0x00d10034, 0x0d580366, 0x1920b440, 0x50027423, 0x0034401d,
-0x030400d5, 0x0440251b, 0x00000200, 0x00000000, 0x40102010, 0x03048081,
-0x30400c50, 0x06000140, 0x4004d101, 0x00c90030, 0x0c520315, 0x89003140,
-0x52021400, 0x28214a0c, 0x031420cd, 0x40480d1a, 0x00000080, 0x00000000,
-0x0026b001, 0x02440093, 0x2ac20f12, 0x4c804300, 0x4005d002, 0x00f3003c,
-0x005003ec, 0x930014c0, 0x71027c00, 0x003ec00d, 0x03cc00f7, 0x00c00534,
-0x00000ac0, 0x00000000, 0x003bb805, 0x80fc80bf, 0x3fc00ff8, 0xfc607f08,
-0xc007f002, 0x00ff083f, 0x0bb003fc, 0xb7001bc0, 0xf080dc00, 0x082f800e,
-0x03fc40ff, 0x17c007f0, 0x00000e60, 0x00000000, 0xc080a300, 0x0833020e,
-0x839820e8, 0x3b038ec0, 0xb020ec08, 0x820ec083, 0x20ec0838, 0x0ec083b0,
-0xa8083b02, 0xc083b228, 0x083b020e, 0x03b020ec, 0x0000008c, 0x00000000,
-0xa022a200, 0x0232808e, 0x23a808ea, 0x3a808ea0, 0xa808ea02, 0x008ea023,
-0x08ea023a, 0x8ea023a8, 0xea023a80, 0xa023a808, 0x023a808e, 0x03a808ea,
-0x00000a88, 0x00000000, 0x80420100, 0x04120104, 0x41201048, 0x12010480,
-0x20104804, 0x01048041, 0x10480412, 0x04804120, 0x48051201, 0x80412018,
-0x04120104, 0x01201048, 0x00000004, 0x00000000, 0x80002100, 0x401a0006,
-0x01a2006a, 0x18108600, 0xa0006800, 0x80068001, 0x0068001a, 0x068001a0,
-0x6a401a00, 0x8001a110, 0x001a0006, 0x01a00068, 0x00000004, 0x00000000,
-0xa0128200, 0x013a884e, 0x138004e2, 0x3a884e20, 0xa804ea01, 0x004ea013,
-0x04ea013a, 0x4e2013a8, 0xea203a80, 0xa013a804, 0x0138804e, 0x03a804ea,
-0x00000a8c, 0x00000000, 0x0000a300, 0x00180006, 0x01800060, 0x18080602,
-0x80006080, 0x00060001, 0x00600018, 0x06000180, 0x60001800, 0x00018080,
-0x00180806, 0x01800060, 0x0000008c, 0x00000000, 0x2012a300, 0x00108044,
-0x11000442, 0x10804420, 0x08044201, 0x00442011, 0x04420110, 0x44201108,
-0x42001080, 0x20110804, 0x01108044, 0x01080442, 0x0000008c, 0x00000000,
-0xa052a200, 0x04088142, 0x50881420, 0x0a8342a0, 0x88142a05, 0x0142a050,
-0x1422050a, 0x42a050a8, 0x28070a81, 0xa050a814, 0x050a8142, 0x00a8142a,
-0x00000a8c, 0x00000000, 0x80300100, 0x032800ca, 0x3aa00ca8, 0x2200ea80,
-0xa00ca803, 0x00ca8032, 0x0ca8032a, 0xca8032a0, 0xa8032a00, 0x8032a00e,
-0x030200ea, 0x02a00ca8, 0x00000004, 0x00000000, 0x00000100, 0x01080002,
-0x00800020, 0x20000200, 0x80002080, 0x00020000, 0x00200008, 0x02080080,
-0x20070800, 0x00008000, 0x00080002, 0x80800020, 0x00000004, 0x00000000,
-0x4006a200, 0x40410010, 0x04100104, 0x61101040, 0x10010400, 0x00104004,
-0x01040040, 0x10400410, 0x04404100, 0x40041101, 0x00410010, 0x80100104,
-0x00000a8c, 0x00000000, 0xa002a300, 0x001a8006, 0x09a00066, 0x1a8026a0,
-0xa8006a00, 0x8006a001, 0x006a001b, 0x06a001a8, 0x6e801a80, 0xa001a802,
-0x001a8026, 0x01a8006a, 0x0000008c, 0x00000000, 0xc002a300, 0x01190006,
-0x01b80060, 0x1b0006c0, 0xb0006000, 0x0006c001, 0x006c001b, 0x06c00190,
-0x60001b00, 0xc001b000, 0x001b0006, 0x01b0006c, 0x0000008c, 0x00000000,
-0x2842a300, 0x0430910c, 0x431810c2, 0x30910c20, 0x0810c004, 0xa10c2043,
-0x10c20430, 0x0c004308, 0xc2443081, 0x20430a10, 0x0430810c, 0x030810c2,
-0x00000a88, 0x00000000, 0x00000100, 0x0030000c, 0x030000c0, 0x30080c02,
-0x00008000, 0x000c0003, 0x00c00030, 0x0c000300, 0xc0003000, 0x00030080,
-0x0030080c, 0x030000c0, 0x00000208, 0x00000000, 0x80400100, 0x0c32010c,
-0x432010ca, 0x32010c80, 0x2010c804, 0x010c8043, 0x10c80432, 0x0c804320,
-0xca0c3201, 0x80432010, 0x0432010c, 0x032010c8, 0x00000004, 0x00000000,
-0x2042a300, 0x0c1a8106, 0x4180106a, 0x1a810620, 0x88106204, 0x8106a041,
-0x106a041a, 0x06a041a8, 0x6a0c1a81, 0xa041a810, 0x041a8106, 0x01a8106a,
-0x00000a8c, 0x00000000, 0x0042a300, 0x04100104, 0x410010c0, 0x10010400,
-0x00104084, 0x01040041, 0x10400410, 0x04004100, 0xc0041001, 0x00410210,
-0x04100104, 0x01001040, 0x0000008c, 0x00000000, 0x2042a200, 0x04188126,
-0x418010c2, 0x18812620, 0x88106204, 0x81062041, 0x10620418, 0x06204188,
-0xc2049881, 0x20418810, 0x04188106, 0x01881062, 0x00000088, 0x00000000,
-0xa006a200, 0x006a801a, 0x06800180, 0x6a801aa0, 0xa801a200, 0x801aa006,
-0x01aa006a, 0x1a2006a8, 0x88006a80, 0xa006a801, 0x0068801a, 0x02a801aa,
-0x00000a8c, 0x00000000, 0x80600000, 0x060a0182, 0x60a01828, 0x0a018280,
-0xa0182806, 0x01828060, 0x18280608, 0x820060a0, 0x28060a01, 0x0060a018,
-0x060a0182, 0x00a01828, 0x00000004, 0x00000000, 0x80400000, 0x04020120,
-0x40201008, 0x02012080, 0x20100804, 0x01008040, 0x10080402, 0x00804020,
-0x08048201, 0x80402010, 0x04020100, 0x00201008, 0x00000004, 0x00000000,
-0xc062a300, 0x262b018a, 0x62b018ac, 0x2b098ac0, 0xb018a806, 0x018ac062,
-0x18ac062b, 0x888062b0, 0xac262b01, 0xc062b098, 0x062b018a, 0x02b018ac,
-0x00000a88, 0x00000000, 0xa062a300, 0x063a918e, 0x638818ee, 0x3a918ea0,
-0xa818e706, 0x818ea063, 0x18ea0638, 0x8ca063a8, 0xe6463881, 0x2063a818,
-0x063a818e, 0x03a818ea, 0x0000008c, 0x00000000, 0xc062a200, 0x063b018a,
-0x63b018e8, 0x33818e40, 0xb018ec06, 0x018ec063, 0x18e40632, 0x8ee063b8,
-0xe2863901, 0xc063b018, 0x063b018e, 0x03b018ec, 0x00000088, 0x00000000,
-0xa062a200, 0x063a818e, 0x63a818e2, 0x32898ea2, 0xa818ea06, 0x018ea863,
-0x18e20632, 0x8ea863a8, 0xca063a81, 0x2063a098, 0x863a898e, 0x03a818ea,
-0x00000a88, 0x00000000, 0x80400000, 0x04120104, 0x412010c8, 0x12010480,
-0x20104804, 0x01048041, 0x10480412, 0x04804120, 0x68041201, 0x80412010,
-0x04120104, 0x01201048, 0x00000800, 0x00000000, 0x80622000, 0x061a0186,
-0x61a0186a, 0x1a818680, 0xa0186886, 0x01868861, 0x1848061a, 0x86a061a8,
-0x6a061a01, 0x8061a018, 0x061a0184, 0x01a01868, 0x00000008, 0x00000000,
-0xa002a200, 0x003a800e, 0x038800ea, 0x38800ea0, 0xa800ea00, 0x800ea003,
-0x00ea003a, 0x0e8003a0, 0xe8001280, 0xa0038800, 0x0038800e, 0x03a800e2,
-0x00000a80, 0x00000000, 0x0042a200, 0x04180106, 0x41801060, 0x18010600,
-0x80102004, 0x01060041, 0x10600418, 0x06004180, 0x60041801, 0x00418010,
-0x04180106, 0x01801060, 0x00000280, 0x00000000, 0x2040a000, 0x04108104,
-0x41081042, 0x10810420, 0x08100204, 0x81042041, 0x10420410, 0x04004100,
-0x40041081, 0x20410810, 0x04108104, 0x01081042, 0x00000088, 0x00000000,
-0xa042a200, 0x040a8102, 0x40a81020, 0x0a0102a0, 0xa8102a04, 0x8102a040,
-0x102a040a, 0x02804080, 0x28040a81, 0xa040aa10, 0x040a8102, 0x00a8102a,
-0x00000a88, 0x00000000, 0x80c28000, 0x0c2a030a, 0xc2a030a8, 0x2a010a80,
-0xa030a80c, 0x030a80c2, 0x30a80c2a, 0x0a80c2a0, 0xa80c2a03, 0x00c2a030,
-0x0c28030a, 0x02a030a8, 0x00000000, 0x00000000, 0x0012a200, 0x01080042,
-0x10800420, 0x08004200, 0x80042001, 0x00420010, 0x04200108, 0x42081080,
-0x20010800, 0x00108004, 0x01080042, 0x00800420, 0x00000000, 0x00000000,
-0x4042a200, 0x04010100, 0x40101004, 0x01010040, 0x10100404, 0x01004040,
-0x10040400, 0x00404010, 0x04040101, 0x40400010, 0x04010100, 0x00101004,
-0x00000a88, 0x00000000, 0xa0022200, 0x001a8006, 0x01a8006e, 0x180006a0,
-0xa8006800, 0xc0068001, 0x0062001b, 0x06a001a8, 0x6e001a80, 0xa001ac00,
-0x001aa006, 0x01a8006a, 0x00000088, 0x00000000, 0x4002a300, 0x00190006,
-0x019000e2, 0x0b000680, 0xb0002c00, 0xa006c001, 0x00640019, 0x068001b0,
-0xe8001b00, 0xc001b000, 0x001b0006, 0x01b0006c, 0x00000000, 0x00000000,
-0x20000000, 0x0030800c, 0x03080062, 0x30800c00, 0x0800c280, 0x800c2003,
-0x00c20030, 0x0c000308, 0x62003080, 0x20030a00, 0x0010800c, 0x030800c2,
-0x00000000, 0x00000000, 0x00000000, 0x00b0000c, 0x23000040, 0x30002c00,
-0x0000c000, 0x000c0003, 0x00c00030, 0x0c000300, 0x4000b000, 0x0003001a,
-0x0030000c, 0x030000c0, 0x00000000, 0x00000000, 0x80a00000, 0x0a30028c,
-0xa32028c8, 0x32008c80, 0x2028c80a, 0x828c80a3, 0x28c80a32, 0x8c80a320,
-0xca0a3202, 0x80a32028, 0x8a12028c, 0x032028c8, 0x00000000, 0x00000000,
-0xa0c40000, 0x0c588316, 0xe5883168, 0x5a8316a0, 0xa8316a0c, 0x0316a0c5,
-0x316a0c5a, 0x16a0c5a8, 0x6a0c5a83, 0x20c5a839, 0x0c5a8316, 0x01a8316a,
-0x00000000, 0x00000000, 0x00000000, 0x00900004, 0x81000040, 0x10002400,
-0x00004000, 0x00040001, 0x00400010, 0x04000100, 0x40009000, 0x00010002,
-0x00100004, 0x01000040, 0x00000000, 0x00000000, 0x22100000, 0x21188846,
-0x11888460, 0x18804626, 0x88846221, 0x08462211, 0x84622118, 0x46221188,
-0x62211888, 0x22118804, 0x21188046, 0x01888462, 0x00000000, 0x00000000,
-0x22000000, 0xa028800a, 0x02a880a8, 0x2a880aa2, 0xa880a220, 0x080aa202,
-0x80a22028, 0x0a220288, 0xa8002888, 0x22028880, 0x202a880a, 0x02a880a2,
-0x00000000, 0x00000000, 0x84100000, 0x41081042, 0x1081042a, 0x0a104204,
-0xa1042841, 0x10420410, 0x0428410a, 0x428410a1, 0x20410a10, 0x8410a004,
-0x410a1042, 0x00a10428, 0x00000000, 0x00000000, 0x80500000, 0x05020140,
-0x50201408, 0x021940a0, 0x20140885, 0x01408050, 0x14080502, 0x40805020,
-0x08050201, 0x80502014, 0x05020140, 0x00201408, 0x00000000, 0x00000000,
-0xc0300000, 0x032b00ca, 0x32b00cac, 0x2b08ca80, 0xb00cac03, 0x00cac032,
-0x0cac032b, 0xca8032b0, 0xac032b00, 0xc032b00c, 0x032b00ca, 0x02b00cac,
-0x00000000, 0x00000000, 0xa0100000, 0x013a804e, 0x13a004ee, 0x3a804ea8,
-0xaa04ea01, 0x804ea013, 0x04ea013a, 0x4e601388, 0xe6013880, 0xa013a804,
-0x013a804e, 0x03a804e8, 0x00000000, 0x00000000, 0x18c40000, 0x8c484312,
-0xc0863120, 0x48030218, 0x8631218c, 0x631218c4, 0x31218c48, 0x1218c486,
-0x200c4863, 0x18c48230, 0x8c486302, 0x00863121, 0x00000000, 0x00000000,
-0xfffc0000, 0xffcbfff2, 0xfcbfff2f, 0xcbfff2ff, 0xbfff2fff, 0xfff2fffc,
-0xff2fffcb, 0xf2fffcbf, 0x2fffcbff, 0xfffcbfff, 0xffcbfff2, 0x00bfff2f,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xdb340000, 0xb3437ed0,
-0x7c36cd0d, 0x4bedf0db, 0x36cd0db3, 0x6cd0db34, 0xcd0db343, 0xd0db3436,
-0x0dfb436c, 0xdb34bedf, 0xb3436df0, 0x0036cd0d, 0x00000000, 0x00000000,
-0x3ccc0000, 0xccc8ff32, 0xfc8f3323, 0xcbf3f23c, 0x8f3323cc, 0xf3323ccc,
-0x3323ccc8, 0x323ccc8f, 0x23fcc8f3, 0x3cccbf3f, 0xccc8f3f2, 0x008f3323,
-0x00000000, 0x00000000, 0x7edc0000, 0xedc9fb72, 0xdc9fb721, 0xc9e3727e,
-0x9fb727ed, 0xfb727edc, 0xb727edc9, 0x727edc9f, 0x21edc9fb, 0x7edc9fb7,
-0xedc9fb72, 0x009fb727, 0x00000000, 0x00000000, 0x40800000, 0x0839020e,
-0x839020e4, 0x39020e40, 0x9020e608, 0x020e4083, 0x20e40839, 0x0e608390,
-0xe0083902, 0x40839028, 0x0839020e, 0x038020e6, 0x00000000, 0x00000000,
-0xa0200000, 0x023a808e, 0x23a808ea, 0x3a808ea0, 0xa808ea02, 0x808ea023,
-0x08ea023a, 0x8ea023a8, 0xee023a80, 0xa023a808, 0x023a808e, 0x03a808ee,
-0x00000000, 0x00000000, 0x80400000, 0x04120104, 0x41201048, 0x12010480,
-0x20104804, 0x01048041, 0x00480412, 0x04804120, 0x48051201, 0x80412018,
-0x04120104, 0x01201048, 0x00000000, 0x00000000, 0x08000000, 0x00180006,
-0x01800060, 0x18118600, 0x80006000, 0x00060001, 0x10600018, 0x06000181,
-0x60401800, 0x00018100, 0x00180006, 0x01890060, 0x00000000, 0x00000000,
-0x22100000, 0x0138884e, 0x138804e2, 0x38884e20, 0x8804e001, 0x804e2013,
-0x04e20138, 0x4e001388, 0xe2203880, 0x20138814, 0x2138804e, 0x038884e0,
-0x00000000, 0x00000000, 0x00000000, 0x00180006, 0x01800060, 0x18080602,
-0x80006000, 0x00060201, 0x80608018, 0x06000180, 0x60281800, 0x00018000,
-0x00180006, 0x01800060, 0x00000000, 0x00000000, 0x20100000, 0x01108044,
-0x11080442, 0x10806420, 0x08044001, 0x80442011, 0x06420110, 0x44001108,
-0x42009080, 0x20110806, 0x03108044, 0x01080240, 0x00000000, 0x00000000,
-0x20140000, 0x05488152, 0x54881522, 0x48815220, 0x88152205, 0x81522054,
-0x15220548, 0x52205488, 0x20054881, 0x20548815, 0x05488152, 0x00801920,
-0x00000000, 0x00000000, 0x00700310, 0x032800ca, 0x32800ca0, 0x0200ca00,
-0x800ca003, 0x00ca0032, 0x0ca00328, 0xca003280, 0x80032800, 0x0032800c,
-0x072800ca, 0x02801ca0, 0x00000000, 0x00000000, 0x00200310, 0x00000002,
-0x00800020, 0x08002200, 0x80002000, 0x00020000, 0x02200008, 0x02000080,
-0x82008800, 0x00008002, 0x02080002, 0x00800620, 0x0000000c, 0x00000000,
-0x40020310, 0x00010000, 0x00100004, 0x01100040, 0x10000400, 0x00004000,
-0x00040001, 0x00400011, 0x84400100, 0x40001100, 0x00010000, 0x00110004,
-0x0000000c, 0x00000000, 0x00020310, 0x00128006, 0x01880062, 0x18800620,
-0x88006000, 0x80062001, 0x00620018, 0x06000188, 0x62801880, 0x20018800,
-0x00188006, 0x01980062, 0x0000000c, 0x00000000, 0x40028008, 0x00180006,
-0x019a0064, 0x19000640, 0x90006400, 0x80064001, 0x00640019, 0x06400190,
-0x60001900, 0x40019800, 0x00190006, 0x41800464, 0x00000000, 0x00000000,
-0x2442a202, 0x0430110c, 0x430810c2, 0x30910c20, 0x0810c204, 0x810c2043,
-0x10c20430, 0x0c204308, 0xc6443081, 0x20431810, 0x4430810c, 0x030910c2,
-0x00000a88, 0x00000000, 0x00008002, 0x0030000c, 0x030000c0, 0x30080c02,
-0x0000c000, 0x000c0203, 0x80c00030, 0x0c000300, 0xc0203000, 0x00030000,
-0x0030000c, 0x030000c0, 0x00000000, 0x00000000, 0x00402002, 0x0430010c,
-0x430010c0, 0x30010c00, 0x0010c004, 0x010c0043, 0x10c00430, 0x0c004300,
-0xc00d3001, 0x00430010, 0x0430010c, 0x030830c0, 0x00000000, 0x00000000,
-0x2042a202, 0x04188106, 0x41801062, 0x18810620, 0x88106204, 0x01062041,
-0x10620418, 0x06204188, 0xe20c1881, 0x20418010, 0x04188106, 0x01883062,
-0x00000a88, 0x00000000, 0x00408002, 0x04100104, 0x41001040, 0x10010400,
-0x00104004, 0x01040041, 0x10400410, 0x04004100, 0x60041001, 0x00410010,
-0x04100104, 0x03001040, 0x00000000, 0x00000000, 0x2042800a, 0x04188106,
-0x41801062, 0x18810620, 0x88106204, 0x01062041, 0x10620418, 0x06204188,
-0x42041881, 0x20418010, 0x04188106, 0x03081062, 0x00000000, 0x00000000,
-0x2002a202, 0x8028800a, 0x028800a2, 0x28800a20, 0x8800a200, 0x800a2002,
-0x00a20028, 0x0a200288, 0x80002880, 0x20028000, 0x0028800a, 0x420000a2,
-0x00000a88, 0x00000000, 0x00600012, 0x06080182, 0x60801820, 0x08018200,
-0x80182006, 0x01820060, 0x18200608, 0x82006080, 0x20060801, 0x00608018,
-0x06080182, 0x00801820, 0x00000000, 0x00000000, 0x80408212, 0x04028100,
-0x40201008, 0x02010088, 0x20100804, 0x01008040, 0x10080402, 0x00804020,
-0x0a040201, 0x80402010, 0x04020100, 0x00201008, 0x00000000, 0x00000000,
-0xc062a202, 0x062a018a, 0x62b018ac, 0x2b098ac0, 0xb018ac06, 0x018ac062,
-0x98ac062b, 0x8ac062b0, 0xac262b01, 0xc062b098, 0x062b018a, 0x02b098ac,
-0x00000a88, 0x00000000, 0x24628200, 0x0638918e, 0x638018e2, 0x38918e20,
-0x8818e206, 0x018e2063, 0x18e20638, 0x8e206388, 0xe2463881, 0x20638818,
-0x4638818e, 0x039918e2, 0x00000000, 0x00000000, 0x40628002, 0x0639018e,
-0x639018e4, 0x39018e60, 0x9018e406, 0x018e4063, 0x18e40639, 0x8e406390,
-0xe8063901, 0x40639018, 0x0638018e, 0x03a018e4, 0x00000000, 0x00000000,
-0xa062a20a, 0x063a818e, 0x63a818ea, 0x3a898ee2, 0xa818ea06, 0x818ea263,
-0x98ea063a, 0x8ea063a8, 0xe6263a81, 0xa063a818, 0x063a018e, 0x438818ea,
-0x00000a88, 0x00000000, 0x80480002, 0x04120124, 0x41201048, 0x12012480,
-0x20104804, 0x01048041, 0x10480412, 0x04804120, 0x48049201, 0x80412010,
-0x04920104, 0x03201248, 0x00000000, 0x00000000, 0x00608002, 0x06180186,
-0x61801860, 0x18018600, 0x80186006, 0x01860061, 0x18600618, 0x86006180,
-0x40061801, 0x00618018, 0x06180186, 0x01881860, 0x00000000, 0x00000000,
-0x2006a000, 0x0078801e, 0x078801e2, 0x78801e00, 0x8801e200, 0x801e2007,
-0x01e20078, 0x1e200788, 0xe2007880, 0x20078801, 0x0078801e, 0x038801e2,
-0x00000a88, 0x00000000, 0x004a8002, 0x04180126, 0x41801060, 0x18012600,
-0x80106004, 0x21060841, 0x10600418, 0x06004180, 0x60049801, 0x00418010,
-0x04980106, 0x01801260, 0x00000000, 0x00000000, 0x20428002, 0x04108104,
-0x41081042, 0x10810400, 0x08104204, 0x81042041, 0x10420410, 0x04204108,
-0x42041081, 0x20410810, 0x04108104, 0x01081042, 0x00000000, 0x00000000,
-0x2042a202, 0x04088102, 0x40881022, 0x08810200, 0x88102204, 0x81022040,
-0x10220408, 0x02204088, 0x20040881, 0x20408810, 0x04088102, 0x00801022,
-0x00000a88, 0x00000000, 0x00c00002, 0x0c28030a, 0xc28030a0, 0x28030a00,
-0x8030a00c, 0x030a00c2, 0x30a00c28, 0x0a00c280, 0xa0040203, 0x00c28030,
-0x0c28030a, 0x028030a0, 0x00000000, 0x00000000, 0x00100002, 0x01082042,
-0x10800420, 0x08004200, 0x80042001, 0x00420010, 0x04200108, 0x42001080,
-0x22010800, 0x00108004, 0x01088042, 0x00800420, 0x00000000, 0x00000000,
-0x4042a202, 0x04010100, 0x40101004, 0x01010040, 0x10100404, 0x01004040,
-0x10040401, 0x00404010, 0x04040101, 0x40401010, 0x04000100, 0x00101004,
-0x00000a88, 0x00000000, 0x20028002, 0x00188006, 0x01880062, 0x18800620,
-0x88006200, 0x80062001, 0x00620018, 0x06200188, 0x62001880, 0x20018800,
-0x0018c006, 0x01980062, 0x00000000, 0x00000000, 0x40008002, 0x80198006,
-0x09900066, 0x19002640, 0x90006400, 0x00064009, 0x02640019, 0x06400190,
-0x40009900, 0x40019000, 0x00190006, 0x03800064, 0x00000000, 0x00000000,
-0x2006a202, 0x0070801c, 0x070801c2, 0x70801c20, 0x0801c200, 0x801c2007,
-0x01c20070, 0x1c200708, 0x46007080, 0x20070801, 0x0070801c, 0x018801c2,
-0x00000a88, 0x00000000, 0x0080200a, 0x0830020c, 0x830020c0, 0x30028c00,
-0x0020c008, 0x020c00e3, 0x28c00830, 0x0c008300, 0x400a3002, 0x00830020,
-0x0830020c, 0x010020c0, 0x00000000, 0x00000000, 0x00a00002, 0x0a30828c,
-0xab0028c2, 0x3003ac00, 0x0028c00a, 0x028c00ab, 0x2ac00a30, 0x8c00a300,
-0x4006b002, 0x00a30028, 0x0a30028c, 0x430828c0, 0x00000200, 0x00000000,
-0x20c2a002, 0x0c120306, 0xc1883060, 0x18838620, 0x8830620c, 0x830620c1,
-0x38620c18, 0x0620c188, 0x620e1883, 0x20c18830, 0x0c188306, 0x01883062,
-0x00000a88, 0x00000000, 0x00020002, 0x00100004, 0x01000040, 0x10000400,
-0x00004000, 0x00040021, 0x00400010, 0x04000100, 0x40001000, 0x00010000,
-0x00100004, 0x01000040, 0x00000000, 0x00000000, 0x22128002, 0x21100846,
-0x11888460, 0x18804620, 0x88846221, 0x88462011, 0x04622118, 0x46221188,
-0x62011888, 0x22118884, 0x21188846, 0x01888462, 0x00000000, 0x00000000,
-0x2002a202, 0x2028200a, 0x028880a0, 0x28800a22, 0x8880a220, 0x880a2202,
-0xa0a22028, 0x0a220288, 0xa0202888, 0x22028880, 0x0028880a, 0x028000a2,
-0x00000a88, 0x00000000, 0x04100002, 0x41081042, 0x10810420, 0x08004204,
-0x81042041, 0x10420410, 0x04204108, 0x42041080, 0x20410810, 0x04108004,
-0x41081042, 0x00810420, 0x00000008, 0x00000000, 0x80508000, 0x05020140,
-0x50201408, 0x02014080, 0x20140805, 0x01408050, 0x14080502, 0x40805020,
-0x0a050201, 0x80502014, 0x05020140, 0x00201408, 0x00000000, 0x00000000,
-0xc0b2a002, 0x0b2b02ca, 0xb2b02cac, 0x2b02cac0, 0xb02cac0b, 0x02cac0b2,
-0x2cac0b2b, 0xcac0b2b0, 0xac0b2b02, 0xc0b2b02c, 0x0b2b02ca, 0x02b02cac,
-0x00000a88, 0x00000000, 0x20120002, 0x0138804e, 0x138804e2, 0x38804e20,
-0x8804e201, 0x804e2013, 0x04e20038, 0x4e20138a, 0xe2003880, 0x20138804,
-0x0138804e, 0x039804e2, 0x00000000, 0x00000000, 0x10c40000, 0x8c484312,
-0xc0863121, 0x48030218, 0x8631218c, 0x631218c0, 0x30218c48, 0x1218c482,
-0x200c0863, 0x18c48231, 0x0c486312, 0x00803121, 0x00000000, 0x00000000,
-0xfffc0000, 0xffcbfff2, 0xfcbfff2f, 0xcbfff2ff, 0xbfff2fff, 0xfff2fffc,
-0xff2fffcb, 0xf2fffcbf, 0x2fffcbff, 0xfffcbfff, 0xffcbfff2, 0x00bfff2f,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xdfb40000, 0xb3437ed0,
-0x7c36cd0d, 0x4bfff0db, 0x36cd0db3, 0x6cd0db7c, 0xdf0db343, 0xd0db34be,
-0x0db7c36c, 0xdb34becd, 0xfb436cd0, 0x0037ed0d, 0x00000000, 0x00000000,
-0x3fcc0000, 0xccc8ff32, 0xfc8f3323, 0xcbfff23c, 0x8f3323cc, 0xf3323cfc,
-0x3f23ccc8, 0x323cccbf, 0x23cfc8f3, 0x3cccbf33, 0xfcc8f332, 0x008ff323,
-0x00000000, 0x00000000, 0x7edc0000, 0xedc9fb72, 0xdc9fb727, 0xc9fb727e,
-0x9fb727ed, 0xfb727edc, 0xb727edc9, 0x727edc9f, 0x218dc9fb, 0x7edc9fb7,
-0xedc9fb72, 0x0087b727, 0x00000000, 0x00000000, 0x21c00000, 0x24d18020,
-0x42100002, 0x02850061, 0x0a004034, 0x85002140, 0x51060433, 0x08c34208,
-0x82143395, 0xc14008d0, 0x14218508, 0x00085002, 0x00000000, 0x00000000,
-0xa0004000, 0x00528820, 0x0828900a, 0x410060a0, 0x08004804, 0x802c2001,
-0x000a0040, 0x20208118, 0x44005080, 0x20000002, 0x00128020, 0x00080202,
-0x00000120, 0x00000000, 0x61000000, 0x40109504, 0x1138940e, 0x128c5061,
-0x08c6ce31, 0x845c2312, 0xc4061180, 0x54231828, 0x46118084, 0x23180044,
-0x10b08454, 0x00284002, 0x00000000, 0x00000000, 0x20900800, 0x01308144,
-0x1038340e, 0xd0006060, 0x08960e01, 0x8068201e, 0x04060133, 0x64201828,
-0x0201b380, 0x20100006, 0x01318064, 0x00280602, 0x00000000, 0x00000000,
-0x01124000, 0x25131454, 0x13004048, 0x10044401, 0x00e44031, 0x04400110,
-0x84003133, 0x40031000, 0x00110004, 0x410020c4, 0x10800400, 0x00004000,
-0x00000900, 0x00000000, 0x04400010, 0x20300100, 0x4020000c, 0x20010c00,
-0x00108400, 0x01000042, 0x10000400, 0x00004000, 0x80040201, 0x80402010,
-0x04000108, 0x00001000, 0x00000000, 0x00000000, 0x81110010, 0x11900474,
-0x1832044c, 0x102c7c01, 0x00c44831, 0x04600319, 0xc4001100, 0x50031002,
-0x40118104, 0x43103044, 0x11800454, 0x40004540, 0x00000800, 0x00000000,
-0x80100000, 0x05130244, 0x1030844c, 0x80004000, 0x00a60801, 0x00400018,
-0x040001b3, 0x40001000, 0x00018000, 0x00103004, 0x01800054, 0x40000540,
-0x00000000, 0x00000000, 0x2a102010, 0x11e2844c, 0x53088486, 0x00855821,
-0x08048281, 0x85702b53, 0xd7ceb533, 0x4823580a, 0x02153185, 0x615a08d7,
-0x15008540, 0x40085402, 0x00000080, 0x00000000, 0xa2100010, 0x01028064,
-0x5538844a, 0x90806c20, 0x18064201, 0x80602053, 0x04020190, 0x6420d818,
-0x42019280, 0xa05b0804, 0x01808064, 0x00080642, 0x00000000, 0x00000000,
-0xc1000010, 0x2411841c, 0x0620804c, 0xa08c0c21, 0x28d28a20, 0x84002305,
-0xc04210a0, 0x28230828, 0x0210708c, 0x630b0840, 0x10408408, 0x40084002,
-0x00000000, 0x00000000, 0xa0080800, 0x20a3801c, 0x021883c2, 0x13801c22,
-0x08018a04, 0x80102803, 0x01ce0033, 0x14e00b38, 0x82002380, 0xa0020800,
-0x0033801c, 0x43380082, 0x00000020, 0x00000000, 0x61000010, 0x14d08000,
-0x0028408e, 0x63840ca1, 0x08c00610, 0x8400234b, 0xc00e3053, 0x0c234108,
-0x8e1063a4, 0x210028c2, 0x10608400, 0x40084282, 0x00000000, 0x00000000,
-0x80480000, 0x00200908, 0x0030118a, 0xb2831ca0, 0x00808800, 0x81040003,
-0x10460410, 0x0c000100, 0x02040081, 0x00011010, 0x04120100, 0x00001040,
-0x00000000, 0x00000000, 0x41480000, 0x14122004, 0x0d304042, 0x838c0421,
-0x20c24410, 0x8408030b, 0x02c40040, 0x0c000f00, 0x4210508c, 0x030c2042,
-0x10410400, 0x00004280, 0x00000000, 0x00000000, 0x40070800, 0x00120824,
-0x093000cc, 0x13800806, 0x20110004, 0x00280809, 0x01402020, 0x28000500,
-0x8c002300, 0x000a2001, 0x00200020, 0x00000100, 0x00000420, 0x00000000,
-0x0808000c, 0x00000001, 0x0b000000, 0x02000008, 0x00000004, 0x0000080b,
-0x00000000, 0x000c0b00, 0x00000000, 0x080b0000, 0x00000000, 0x33000000,
-0x00000000, 0x00000000, 0x0308040c, 0x00000501, 0x09090c0a, 0x00010107,
-0x08000800, 0x01010709, 0x00080402, 0x010b0908, 0x08040201, 0x03090800,
-0x04020103, 0x31080008, 0x00000010, 0x00000000, 0x385be000, 0xc4030910,
-0xffe52fe7, 0x01019a03, 0x980c0264, 0x00020001, 0x90019003, 0x01000001,
-0x00000300, 0x00000004, 0x0c030001, 0x00019c00, 0x00000f80, 0x00000000,
-0x70c80000, 0x6401322e, 0x00774532, 0x00000000, 0x00000208, 0x00000000,
-0x00000001, 0x01000002, 0x00080000, 0x00000008, 0x00010000, 0x00000800,
-0x00000000, 0x00000000, 0x42280000, 0x29138111, 0x02802a14, 0x44000000,
-0x01000000, 0x00000000, 0x00010044, 0x00000000, 0x01004400, 0x00000100,
-0x00440000, 0x00010001, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0xfc000000, 0x03ff7eff, 0x00000000, 0xf76cff7c, 0x00000002, 0xeefffc00,
-0x000003fd, 0x7cfc0000, 0x00037ff6, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0x7c000000, 0x03e77beb, 0x00000000, 0xfef7fffc,
-0x00000003, 0xf7fef400, 0x000003ff, 0x7efc0000, 0x0003fffe, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xf8000000, 0x03f3fbf3,
-0x00000000, 0xedf2fdf8, 0x00000003, 0xf6f9f400, 0x000002ff, 0xfcfc0000,
-0x0002fef7, 0x00000000, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0x3c000000, 0x03df7fcf, 0x00000000, 0xfffddefc, 0x00000003, 0xfffefc00,
-0x000003ff, 0xfffc0000, 0x0003ffff, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0xfc000000, 0x03dfdeff, 0x00000000, 0xffff7ffc,
-0x00000003, 0xfe7f3c00, 0x000003ff, 0xfffc0000, 0x0003ffff, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xdc000000, 0x03ffffff,
-0x00000000, 0xffffffbc, 0x00000003, 0x7ffebc00, 0x000003ff, 0xbf7c0000,
-0x0003feff, 0x00000000, 0x00000000, 0x00000000, 0xa3400000, 0x14528804,
-0x41085006, 0xc0840421, 0x08514214, 0x85002140, 0x514234a2, 0x00210108,
-0x06148085, 0xe14328d0, 0x14e08528, 0x00085002, 0x00000000, 0x00000000,
-0xe2400000, 0x84028000, 0x4228000e, 0x40800820, 0x00004201, 0x80402011,
-0x00828102, 0x60200208, 0x8a004080, 0x20091804, 0x00708060, 0x00080402,
-0x00000000, 0x00000000, 0xa0000000, 0x5953a824, 0x1918440e, 0x00854423,
-0x00444211, 0x8440211a, 0x44420191, 0x00234908, 0x42101084, 0x23032840,
-0x10108404, 0x00084002, 0x00000000, 0x00000000, 0x62100000, 0x41838164,
-0x1808040a, 0x80807420, 0x0004c201, 0x80702018, 0x040221a2, 0x40205908,
-0x06015080, 0xe01b0807, 0x01208048, 0x00080702, 0x00000000, 0x00000000,
-0x42400000, 0x55102060, 0x41004400, 0x10042801, 0x00408810, 0x04640102,
-0x44083180, 0x68c11000, 0x00100004, 0x011020c4, 0x11100450, 0x01004440,
-0x00000000, 0x00000000, 0x80000010, 0x00132108, 0x02301088, 0x20010400,
-0x10100804, 0x01080041, 0x10000410, 0x00004000, 0x00040001, 0x80401010,
-0x04200100, 0x40001080, 0x00000000, 0x00000000, 0xc0100010, 0x19d20164,
-0x11306440, 0x90046c03, 0x20464411, 0x04640112, 0x864811b0, 0x64031100,
-0x40115004, 0x43192046, 0x11100464, 0x41004540, 0x00000000, 0x00000000,
-0x80100010, 0x01130060, 0x18000444, 0x00005c00, 0x00048801, 0x0050001a,
-0x84480190, 0x68c01900, 0x40011000, 0x001d2004, 0x01800044, 0x41000400,
-0x00000000, 0x00000000, 0xe0100010, 0x55418944, 0x50284442, 0x10856021,
-0x08548615, 0x85606153, 0x54821500, 0x5c215108, 0x42152385, 0x615008d4,
-0x15208560, 0x40085442, 0x00000000, 0x00000000, 0xe0100010, 0x01a28248,
-0x111804ca, 0x50804420, 0x08054a01, 0x8040a013, 0x05422100, 0x6c201308,
-0xca019080, 0x60100805, 0x01b08064, 0x400806c2, 0x00000000, 0x00000000,
-0xa3000010, 0x08108014, 0x0628e0ce, 0x508c0021, 0x08428610, 0x84046107,
-0x41821040, 0x0c230b28, 0x46107084, 0x83000841, 0x18708424, 0x400842c2,
-0x00000000, 0x00000000, 0xe0480810, 0x0001a008, 0x0b1810ca, 0xa0801820,
-0x38024e00, 0x8014600a, 0x020280b3, 0x04e00d28, 0x86000380, 0xa00b3800,
-0x00138038, 0x4338000e, 0x00000020, 0x00000000, 0x20000010, 0x08928814,
-0x0528414a, 0xb0840c21, 0x28400210, 0x84002108, 0x420e1081, 0x24210108,
-0x02100084, 0x410128c0, 0x10b08404, 0x40084042, 0x00000000, 0x00000000,
-0x08400000, 0x04030928, 0x4a303004, 0x70011400, 0x3010c004, 0x01000044,
-0x104a2443, 0x0c004600, 0x8004a001, 0xa04d1013, 0x04100114, 0x00001000,
-0x00000000, 0x00000000, 0x02040000, 0x10930404, 0x0130d348, 0x100c2c01,
-0x30434010, 0x04200100, 0x42c62002, 0x04000100, 0x40109004, 0x43092040,
-0x10300404, 0x01004140, 0x00000000, 0x00000000, 0x02090800, 0x00402000,
-0x01002048, 0x30000000, 0x00028000, 0x00100000, 0x01002001, 0x28000100,
-0x40004000, 0x20032000, 0x00b0000c, 0x01000140, 0x00000420, 0x00000000,
-0x08080000, 0x04000401, 0x0b000801, 0x00040008, 0x00000004, 0x0802000b,
-0x00010801, 0x02000b00, 0x01080108, 0x000b0000, 0x08010802, 0x03000001,
-0x00000000, 0x00000000, 0x03083c3c, 0x00000901, 0x09090809, 0x00010107,
-0x08000800, 0x01010309, 0x00080000, 0x01030908, 0x08000001, 0x03090800,
-0x00000101, 0xf1080008, 0x000000f0, 0x00000000, 0xa1240000, 0x1402b696,
-0x02482655, 0x02019a98, 0x00000000, 0x00030000, 0x08019c03, 0x02000000,
-0x00000200, 0x00000190, 0x0c000000, 0x00000c00, 0x00000000, 0x00000000,
-0x1a980000, 0x00017333, 0x0229620b, 0x00000100, 0x00880008, 0x00000000,
-0x08000001, 0x00000002, 0x00080000, 0x00000000, 0x08010001, 0x00000800,
-0x00000000, 0x00000000, 0x84100000, 0x41132183, 0x00218040, 0x44000000,
-0x00000100, 0x00000000, 0x00020044, 0x00000000, 0x01004400, 0x00000100,
-0x00440000, 0x00010003, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0xfc000000, 0x03ffffff, 0x00000000, 0x7fff7ffc, 0x00000003, 0xf7fefc00,
-0x000003ff, 0xdefc0000, 0x0001fff7, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0xfc000000, 0x03ffffff, 0x00000000, 0x7fff7ffc,
-0x00000001, 0xfffffc00, 0x0000007f, 0xfffc0000, 0x0002fffe, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xfc000000, 0x03ffffff,
-0x00000000, 0xfffdfefc, 0x00000003, 0xfdfffc00, 0x000003ff, 0xfffc0000,
-0x0003ffff, 0x00000000, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0xfc000000, 0x03ef7f7f, 0x00000000, 0x9ffffffc, 0x00000003, 0xfffffc00,
-0x000003fc, 0xfffc0000, 0x0003ffff, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0xfc000000, 0x03ffffff, 0x00000000, 0xfdddfdfc,
-0x00000003, 0xffff7c00, 0x000003fd, 0xfffc0000, 0x0003ffff, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xfc000000, 0x03ffbfff,
-0x00000000, 0xfffefffc, 0x00000003, 0x7ffffc00, 0x000003ff, 0xff7c0000,
-0x0003feff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x8004000c, 0x00000040, 0x71c2000c, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x8004000c, 0x00004040, 0x01c2000c, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x8000000c, 0xefcf0000, 0x8001000c, 0xc0000000, 0x7002000c, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x8001000c, 0xa0000000, 0x8005000c, 0x00000000, 0x8000000c,
-0xe9d60000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-};
diff -Nru a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
--- a/sound/pci/rme9652/hdsp.c	Sat Apr 19 19:51:46 2003
+++ b/sound/pci/rme9652/hdsp.c	Sat Apr 19 19:51:46 2003
@@ -3,6 +3,7 @@
  *
  *      Copyright (c) 2002  Paul Davis
  *                          Marcus Andersson
+ *                          Thomas Charbonnel
  *
  *   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
@@ -23,7 +24,6 @@
 #include <sound/driver.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/pci.h>
 
@@ -33,22 +33,20 @@
 #include <sound/info.h>
 #include <sound/asoundef.h>
 #include <sound/rawmidi.h>
+#include <sound/hwdep.h>
 #define SNDRV_GET_ID
 #include <sound/initval.h>
+#include <sound/hdsp.h>
 
 #include <asm/byteorder.h>
 #include <asm/current.h>
 #include <asm/io.h>
 
-#include "multiface_firmware.dat"
-#include "digiface_firmware.dat"
-
 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;	/* Index 0-MAX */
 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;	/* ID for this card */
 static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;	/* Enable this card */
 static int precise_ptr[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0 }; /* Enable precise pointer */
 static int line_outs_monitor[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0}; /* Send all inputs/playback to line outs */
-static int force_firmware[SNDRV_CARDS] = { [0 ... (SNDRV_CARDS-1)] = 0}; /* Force firmware reload */
 
 MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(index, "Index value for RME Hammerfall DSP interface.");
@@ -65,19 +63,12 @@
 MODULE_PARM(line_outs_monitor,"1-" __MODULE_STRING(SNDRV_CARDS) "i");
 MODULE_PARM_DESC(line_outs_monitor, "Send all input and playback streams to line outs by default.");
 MODULE_PARM_SYNTAX(line_outs_monitor, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_PARM(force_firmware,"1-" __MODULE_STRING(SNDRV_CARDS) "i");
-MODULE_PARM_DESC(force_firmware, "Force a reload of the I/O box firmware");
-MODULE_PARM_SYNTAX(force_firmware, SNDRV_ENABLED "," SNDRV_BOOLEAN_FALSE_DESC);
-MODULE_AUTHOR("Paul Davis <pbd@op.net>");
+MODULE_AUTHOR("Paul Davis <paul@linuxaudiosystems.com>, Marcus Andersson, Thomas Charbonnel <thomas@undata.org>");
 MODULE_DESCRIPTION("RME Hammerfall DSP");
 MODULE_LICENSE("GPL");
 MODULE_CLASSES("{sound}");
-MODULE_DEVICES("{{RME,Hammerfall-DSP}}");
-
-typedef enum {
-	Digiface,
-	Multiface
-} HDSP_Type;
+MODULE_DEVICES("{{RME Hammerfall-DSP},"
+	        "{RME HDSP-9652}}");
 
 #define HDSP_MAX_CHANNELS        26
 #define DIGIFACE_SS_CHANNELS     26
@@ -123,9 +114,9 @@
 
 #define HDSP_playbackPeakLevel  4096  /* 26 * 32 bit values */
 #define HDSP_inputPeakLevel     4224  /* 26 * 32 bit values */
-#define HDSP_outputPeakLevel    4100  /* 26 * 32 bit values */
+#define HDSP_outputPeakLevel    4352  /* (26+2) * 32 bit values */
 #define HDSP_playbackRmsLevel   4612  /* 26 * 64 bit values */
-#define HDSP_inputRmsLevel      4884  /* 26 * 64 bit values */
+#define HDSP_inputRmsLevel      4868  /* 26 * 64 bit values */
 
 #define HDSP_IO_EXTENT     5192
 
@@ -148,19 +139,19 @@
 
 /* Control Register bits */
 
-#define HDSP_Start                (1<<0)  // start engine
-#define HDSP_Latency0             (1<<1)  // buffer size = 2^n where n is defined by Latency{2,1,0}
-#define HDSP_Latency1             (1<<2)  // [ see above ]
-#define HDSP_Latency2             (1<<3)  // ] see above ]
-#define HDSP_ClockModeMaster      (1<<4)  // 1=Master, 0=Slave/Autosync
-#define HDSP_AudioInterruptEnable (1<<5)  // what do you think ?
-#define HDSP_Frequency0           (1<<6)  // 0=44.1kHz/88.2kHz 1=48kHz/96kHz
-#define HDSP_Frequency1           (1<<7)  // 0=32kHz/64kHz
-#define HDSP_DoubleSpeed          (1<<8)  // 0=normal speed, 1=double speed
-#define HDSP_SPDIFProfessional    (1<<9)  // 0=consumer, 1=professional
-#define HDSP_SPDIFEmphasis        (1<<10) // 0=none, 1=on
-#define HDSP_SPDIFNonAudio        (1<<11) // 0=off, 1=on
-#define HDSP_SPDIFOpticalOut      (1<<12) // 1=use 1st ADAT connector for SPDIF, 0=do not
+#define HDSP_Start                (1<<0)  /* start engine */
+#define HDSP_Latency0             (1<<1)  /* buffer size = 2^n where n is defined by Latency{2,1,0} */
+#define HDSP_Latency1             (1<<2)  /* [ see above ] */
+#define HDSP_Latency2             (1<<3)  /* ] see above ] */
+#define HDSP_ClockModeMaster      (1<<4)  /* 1=Master, 0=Slave/Autosync */
+#define HDSP_AudioInterruptEnable (1<<5)  /* what do you think ? */
+#define HDSP_Frequency0           (1<<6)  /* 0=44.1kHz/88.2kHz 1=48kHz/96kHz */
+#define HDSP_Frequency1           (1<<7)  /* 0=32kHz/64kHz */
+#define HDSP_DoubleSpeed          (1<<8)  /* 0=normal speed, 1=double speed */
+#define HDSP_SPDIFProfessional    (1<<9)  /* 0=consumer, 1=professional */
+#define HDSP_SPDIFEmphasis        (1<<10) /* 0=none, 1=on */
+#define HDSP_SPDIFNonAudio        (1<<11) /* 0=off, 1=on */
+#define HDSP_SPDIFOpticalOut      (1<<12) /* 1=use 1st ADAT connector for SPDIF, 0=do not */
 #define HDSP_SyncRef2             (1<<13) 
 #define HDSP_SPDIFInputSelect0    (1<<14) 
 #define HDSP_SPDIFInputSelect1    (1<<15) 
@@ -186,15 +177,40 @@
 #define HDSP_SyncRef_WORD       (HDSP_SyncRef2)
 #define HDSP_SyncRef_ADAT_SYNC  (HDSP_SyncRef0|HDSP_SyncRef2)
 
-/* Preferred sync source choices - used by "sync_pref" control switch */
+/* Sample Clock Sources */
 
-#define HDSP_SYNC_FROM_SELF      0
-#define HDSP_SYNC_FROM_WORD      1
-#define HDSP_SYNC_FROM_ADAT_SYNC 2
-#define HDSP_SYNC_FROM_SPDIF     3
-#define HDSP_SYNC_FROM_ADAT1     4
-#define HDSP_SYNC_FROM_ADAT2     5
-#define HDSP_SYNC_FROM_ADAT3     6
+#define HDSP_CLOCK_SOURCE_AUTOSYNC         0
+#define HDSP_CLOCK_SOURCE_INTERNAL_32KHZ   1
+#define HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ 2
+#define HDSP_CLOCK_SOURCE_INTERNAL_48KHZ   3
+#define HDSP_CLOCK_SOURCE_INTERNAL_64KHZ   4
+#define HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ 5
+#define HDSP_CLOCK_SOURCE_INTERNAL_96KHZ   6
+
+/* Preferred sync reference choices - used by "pref_sync_ref" control switch */
+
+#define HDSP_SYNC_FROM_WORD      0
+#define HDSP_SYNC_FROM_ADAT_SYNC 1
+#define HDSP_SYNC_FROM_SPDIF     2
+#define HDSP_SYNC_FROM_ADAT1     3
+#define HDSP_SYNC_FROM_ADAT2     4
+#define HDSP_SYNC_FROM_ADAT3     5
+
+/* SyncCheck status */
+
+#define HDSP_SYNC_CHECK_NO_LOCK 0
+#define HDSP_SYNC_CHECK_LOCK    1
+#define HDSP_SYNC_CHECK_SYNC	2
+
+/* AutoSync references - used by "autosync_ref" control switch */
+
+#define HDSP_AUTOSYNC_FROM_WORD      0
+#define HDSP_AUTOSYNC_FROM_ADAT_SYNC 1
+#define HDSP_AUTOSYNC_FROM_SPDIF     2
+#define HDSP_AUTOSYNC_FROM_NONE	     3
+#define HDSP_AUTOSYNC_FROM_ADAT1     4
+#define HDSP_AUTOSYNC_FROM_ADAT2     5
+#define HDSP_AUTOSYNC_FROM_ADAT3     6
 
 /* Possible sources of S/PDIF input */
 
@@ -242,13 +258,13 @@
 
 #define HDSP_spdifFrequencyMask    (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2)
 
-#define HDSP_spdifFrequency32KHz   (HDSP_spdifFrequency0|HDSP_spdifFrequency1|HDSP_spdifFrequency2)
-#define HDSP_spdifFrequency44_1KHz (HDSP_spdifFrequency2|HDSP_spdifFrequency1)
-#define HDSP_spdifFrequency48KHz   (HDSP_spdifFrequency0|HDSP_spdifFrequency2)
-
-#define HDSP_spdifFrequency64KHz    0
-#define HDSP_spdifFrequency88_2KHz (HDSP_spdifFrequency2)
-#define HDSP_spdifFrequency96KHz   (HDSP_spdifFrequency0|HDSP_spdifFrequency1)
+#define HDSP_spdifFrequency32KHz   (HDSP_spdifFrequency0)
+#define HDSP_spdifFrequency44_1KHz (HDSP_spdifFrequency1)
+#define HDSP_spdifFrequency48KHz   (HDSP_spdifFrequency0|HDSP_spdifFrequency1)
+
+#define HDSP_spdifFrequency64KHz   (HDSP_spdifFrequency2)
+#define HDSP_spdifFrequency88_2KHz (HDSP_spdifFrequency0|HDSP_spdifFrequency2)
+#define HDSP_spdifFrequency96KHz   (HDSP_spdifFrequency2|HDSP_spdifFrequency1)
 
 /* Status2 Register bits */
 
@@ -282,15 +298,17 @@
 #define HDSP_SelSyncRef_WORD       (HDSP_SelSyncRef2)
 #define HDSP_SelSyncRef_ADAT_SYNC  (HDSP_SelSyncRef0|HDSP_SelSyncRef2)
 
-/* FIFO wait times, defined in terms of loops on readl() */
+/* Card state flags */
 
-#define HDSP_LONG_WAIT	 40000
-#define HDSP_SHORT_WAIT  100
+#define HDSP_InitializationComplete  (1<<0)
+#define HDSP_FirmwareLoaded	     (1<<1)
+#define HDSP_FirmwareCached	     (1<<2)
 
-/* Computing addresses for adjusting gains */
+/* FIFO wait times, defined in terms of 1/10ths of msecs */
+
+#define HDSP_LONG_WAIT	 5000
+#define HDSP_SHORT_WAIT  30
 
-#define INPUT_TO_OUTPUT_KEY(in,out)     ((64 * (out)) + (in))
-#define PLAYBACK_TO_OUTPUT_KEY(chn,out) ((64 * (out)) + 32 + (chn))
 #define UNITY_GAIN                       32768
 #define MINUS_INFINITY_GAIN              0
 
@@ -318,10 +336,8 @@
 #define HDSP_DMA_AREA_BYTES ((HDSP_MAX_CHANNELS+1) * HDSP_CHANNEL_BUFFER_BYTES)
 #define HDSP_DMA_AREA_KILOBYTES (HDSP_DMA_AREA_BYTES/1024)
 
-#define HDSP_MATRIX_MIXER_SIZE 2048
-
-typedef struct _hdsp      hdsp_t;
-typedef struct _hdsp_midi hdsp_midi_t;
+typedef struct _hdsp          hdsp_t;
+typedef struct _hdsp_midi     hdsp_midi_t;
 
 struct _hdsp_midi {
     hdsp_t                  *hdsp;
@@ -332,45 +348,54 @@
     char                     istimer; /* timer in use */
     struct timer_list	     timer;
     spinlock_t               lock;
+    int			     pending;
 };
 
 struct _hdsp {
-	spinlock_t lock;
-	snd_pcm_substream_t *capture_substream;
-	snd_pcm_substream_t *playback_substream;
-        hdsp_midi_t midi[2];
-	int precise_ptr;
-	u32 control_register;	         /* cached value */
-	u32 creg_spdif;
-	u32 creg_spdif_stream;
-	char *card_name;		 /* digiface/multiface */
-        HDSP_Type type;                  /* ditto, but for code use */
-	size_t period_bytes;		 /* guess what this is */
-	unsigned char ds_channels;
-	unsigned char ss_channels;	 /* different for multiface/digiface */
-	void *capture_buffer_unaligned;	 /* original buffer addresses */
-	void *playback_buffer_unaligned; /* original buffer addresses */
-	unsigned char *capture_buffer;	 /* suitably aligned address */
-	unsigned char *playback_buffer;	 /* suitably aligned address */
-	dma_addr_t capture_buffer_addr;
-	dma_addr_t playback_buffer_addr;
-	pid_t capture_pid;
-	pid_t playback_pid;
-	int running;
-        int passthru;                   /* non-zero if doing pass-thru */
-	int last_spdif_sample_rate;	/* so that we can catch externally ... */
-	int last_adat_sample_rate;	/* ... induced rate changes            */
-        char *channel_map;
-	int dev;
-	int irq;
-	unsigned long port;
-	struct resource *res_port;
-        unsigned long iobase;
-	snd_card_t *card;
-	snd_pcm_t *pcm;
-	struct pci_dev *pci;
-	snd_kcontrol_t *spdif_ctl;
-        unsigned short mixer_matrix[HDSP_MATRIX_MIXER_SIZE];
+	spinlock_t            lock;
+	snd_pcm_substream_t  *capture_substream;
+	snd_pcm_substream_t  *playback_substream;
+        hdsp_midi_t           midi[2];
+	struct tasklet_struct midi_tasklet;
+	int                   precise_ptr;
+	u32                   control_register;	         /* cached value */
+	u32                   creg_spdif;
+	u32                   creg_spdif_stream;
+	char                 *card_name;		    /* digiface/multiface */
+	HDSP_IO_Type          io_type;               /* ditto, but for code use */
+        unsigned short        firmware_rev;
+	unsigned short	      state;		     /* stores state bits */
+	u32		      firmware_cache[24413]; /* this helps recover from accidental iobox power failure */
+	size_t                period_bytes; 	    /* guess what this is */
+	unsigned char         ds_channels;
+	unsigned char         ss_channels;	    /* different for multiface/digiface */
+	void                 *capture_buffer_unaligned;	 /* original buffer addresses */
+	void                 *playback_buffer_unaligned; /* original buffer addresses */
+	unsigned char        *capture_buffer;	    /* suitably aligned address */
+	unsigned char        *playback_buffer;	    /* suitably aligned address */
+	dma_addr_t            capture_buffer_addr;
+	dma_addr_t            playback_buffer_addr;
+	pid_t                 capture_pid;
+	pid_t                 playback_pid;
+	int                   running;
+        int                   passthru;              /* non-zero if doing pass-thru */
+	int                   last_spdif_sample_rate;/* for information reporting */
+	int                   last_external_sample_rate;
+        int                   last_internal_sample_rate;
+	int                   system_sample_rate;
+	char                 *channel_map;
+	int                   dev;
+	int                   irq;
+	unsigned long         port;
+	struct resource      *res_port;
+        unsigned long         iobase;
+	snd_card_t           *card;
+	snd_pcm_t            *pcm;
+	snd_hwdep_t          *hwdep;
+	struct pci_dev       *pci;
+	snd_kcontrol_t       *spdif_ctl;
+	snd_kcontrol_t       *playback_mixer_ctls[HDSP_MAX_CHANNELS];
+        unsigned short        mixer_matrix[HDSP_MATRIX_MIXER_SIZE];
 };
 
 /* These tables map the ALSA channels 1..N to the channels that we
@@ -387,7 +412,7 @@
 };
 
 static char channel_map_mf_ss[HDSP_MAX_CHANNELS] = { /* Multiface */
-	/* ADAT 0 */
+	/* Analog */
 	0, 1, 2, 3, 4, 5, 6, 7, 
 	/* ADAT 2 */
 	16, 17, 18, 19, 20, 21, 22, 23, 
@@ -414,8 +439,8 @@
 
 static struct pci_device_id snd_hdsp_ids[] __devinitdata = {
 	{
-		.vendor	   = PCI_VENDOR_ID_XILINX,
-		.device	   = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP, 
+		.vendor = PCI_VENDOR_ID_XILINX,
+		.device = PCI_DEVICE_ID_XILINX_HAMMERFALL_DSP, 
 		.subvendor = PCI_ANY_ID,
 		.subdevice = PCI_ANY_ID,
 	}, /* RME Hammerfall-DSP */
@@ -424,6 +449,49 @@
 
 MODULE_DEVICE_TABLE(pci, snd_hdsp_ids);
 
+/* prototypes */
+static int __devinit snd_hdsp_create_alsa_devices(snd_card_t *card, hdsp_t *hdsp);
+static int __devinit snd_hdsp_create_pcm(snd_card_t *card, hdsp_t *hdsp);
+static inline int snd_hdsp_initialize_input_enable (hdsp_t *hdsp);
+static inline void snd_hdsp_initialize_midi_flush (hdsp_t *hdsp);
+static inline void snd_hdsp_initialize_channels (hdsp_t *hdsp);
+static inline int hdsp_fifo_wait(hdsp_t *hdsp, int count, int timeout);
+static int hdsp_update_simple_mixer_controls(hdsp_t *hdsp);
+static int hdsp_autosync_ref(hdsp_t *hdsp);
+static int snd_hdsp_set_defaults(hdsp_t *hdsp);
+
+static inline int hdsp_is_9652 (hdsp_t *hdsp)
+{
+	switch (hdsp->firmware_rev) {
+	case 0x64:
+	case 0x65:
+	case 0x68:
+		return 1;
+	default:
+		return 0;
+	}
+}
+
+static inline int hdsp_playback_to_output_key (hdsp_t *hdsp, int in, int out)
+{
+	switch (hdsp->firmware_rev) {
+	case 0xa:
+		return (64 * out) + (32 + (in));
+	default:
+		return (52 * out) + (26 + (in));
+	}
+}
+
+static inline int hdsp_input_to_output_key (hdsp_t *hdsp, int in, int out)
+{
+	switch (hdsp->firmware_rev) {
+	case 0xa:
+		return (64 * out) + in;
+	default:
+		return (52 * out) + in;
+	}
+}
+
 static inline void hdsp_write(hdsp_t *hdsp, int reg, int val)
 {
 	writel(val, hdsp->iobase + reg);
@@ -434,24 +502,124 @@
 	return readl (hdsp->iobase + reg);
 }
 
-static inline unsigned long long hdsp_read64 (hdsp_t *hdsp, int reg)
+static inline int hdsp_check_for_iobox (hdsp_t *hdsp)
 {
-	unsigned long long val;
-	val = hdsp_read(hdsp, reg);
-	val = (val<<32)|hdsp_read(hdsp, reg + 4);
+	if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) {
+		snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n");
+		hdsp->state &= ~HDSP_FirmwareLoaded;
+		return -EIO;
+	}
+	return 0;
+}
 
-	return val;
+static int snd_hdsp_load_firmware_from_cache(hdsp_t *hdsp) {
+
+	int i;
+	unsigned long flags;
+
+	if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
+		
+		snd_printk ("loading firmware\n");
+
+		hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_PROGRAM);
+		hdsp_write (hdsp, HDSP_fifoData, 0);
+		
+		if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
+			snd_printk ("timeout waiting for download preparation\n");
+			return -EIO;
+		}
+		
+		hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
+		
+		for (i = 0; i < 24413; ++i) {
+			hdsp_write(hdsp, HDSP_fifoData, hdsp->firmware_cache[i]);
+			if (hdsp_fifo_wait (hdsp, 127, HDSP_LONG_WAIT)) {
+				snd_printk ("timeout during firmware loading\n");
+				return -EIO;
+			}
+		}
+		
+		if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
+			snd_printk ("timeout at end of firmware loading\n");
+		    	return -EIO;
+		}
+
+		hdsp_write (hdsp, HDSP_jtagReg, 0);
+		snd_printk ("finished firmware loading\n");
+		
+		if ((1000 / HZ) < 3000) {
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout((3000 * HZ + 999) / 1000);
+		} else {
+			mdelay(3000);
+		}
+	}
+	if (hdsp->state & HDSP_InitializationComplete) {
+		snd_printk("firmware loaded from cache, restoring defaults\n");
+		spin_lock_irqsave(&hdsp->lock, flags);
+		snd_hdsp_set_defaults(hdsp);
+		spin_unlock_irqrestore(&hdsp->lock, flags); 
+	}
+	
+	hdsp->state |= HDSP_FirmwareLoaded;
+
+	return 0;
 }
 
-static inline int hdsp_check_for_iobox (hdsp_t *hdsp)
+static inline int hdsp_get_iobox_version (hdsp_t *hdsp)
 {
-	if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_ConfigError) {
-		snd_printk ("Hammerfall-DSP: no Digiface or Multiface connected!\n");
+	int err;
+	
+	if (hdsp_check_for_iobox (hdsp)) {
+		return -EIO;
+	}
+
+	if ((err = snd_hdsp_initialize_input_enable(hdsp)) < 0) {
+		return err;
+	}
+		
+	if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
+	
+		hdsp_write (hdsp, HDSP_jtagReg, HDSP_PROGRAM);
+		hdsp_write (hdsp, HDSP_fifoData, 0);
+		if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) {
+			return -EIO;
+		}
+
+		hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
+		hdsp_write (hdsp, HDSP_fifoData, 0);
+
+		if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT)) {
+			hdsp->io_type = Multiface;
+			hdsp_write (hdsp, HDSP_jtagReg, HDSP_VERSION_BIT);
+			hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
+			hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT);
+		} else {
+			hdsp->io_type = Digiface;
+		} 
+	} else {
+		/* firmware was already loaded, get iobox type */
+		if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) {
+			hdsp->io_type = Multiface;
+		} else {
+			hdsp->io_type = Digiface;
+		}
+	}
+	return 0;
+}
+
+
+static inline int hdsp_check_for_firmware (hdsp_t *hdsp)
+{
+	if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
+		snd_printk("firmware not present.\n");
+		hdsp->state &= ~HDSP_FirmwareLoaded;
 		return -EIO;
 	}
 	return 0;
 }
 
+
 static inline int hdsp_fifo_wait(hdsp_t *hdsp, int count, int timeout)
 {    
 	int i;
@@ -460,10 +628,18 @@
 	   are available in the command FIFO.
 	*/
 	
-	for (i = 0; i < timeout; i++)
+	for (i = 0; i < timeout; i++) {
+
 		if ((int)(hdsp_read (hdsp, HDSP_fifoStatus) & 0xff) <= count)
 			return 0;
 
+		/* not very friendly, but we only do this during a firmware
+		   load and changing the mixer, so we just put up with it.
+		*/
+
+		udelay (100);
+	}
+
 	snd_printk ("wait for FIFO status <= %d failed after %d iterations\n",
 		    count, timeout);
 	return -1;
@@ -481,16 +657,46 @@
 {
 	unsigned int ad;
 
-	if (addr >= HDSP_MATRIX_MIXER_SIZE)
-		return -1;
+	if (hdsp_is_9652 (hdsp)) {
 
-	ad = data + addr * 65536;
+		if ((ad = addr/2) < 676) {
+
+			/* from martin björnsen:
+
+			   "You can only write dwords to the
+			   mixer memory which contain two
+			   mixer values in the low and high
+			   word. So if you want to change
+			   value 0 you have to read value 1
+			   from the cache and write both to
+			   the first dword in the mixer
+			   memory."
+			*/
+
+			hdsp->mixer_matrix[addr] = data;
+			hdsp_write (hdsp, 1024 + ad, 
+				    (hdsp->mixer_matrix[(addr&0x7fe)+1] << 16) + 
+				    hdsp->mixer_matrix[addr&0x7fe]);
+			return 0;
+		} else {
+			return -1;
+		}
+		
+
+	} else {
+		if (addr >= HDSP_MATRIX_MIXER_SIZE)
+			return -1;
+		
+		ad = (addr << 16) + data;
+		
+		if (hdsp_fifo_wait(hdsp, 127, HDSP_LONG_WAIT)) {
+			return -1;
+		}
+
+		hdsp_write (hdsp, HDSP_fifoData, ad);
+		hdsp->mixer_matrix[addr] = data;
 
-	if (hdsp_fifo_wait(hdsp, 127, HDSP_LONG_WAIT)) {
-		return -1;
 	}
-	hdsp_write (hdsp, HDSP_fifoData, ad);
-	hdsp->mixer_matrix[addr] = data;
 
 	return 0;
 }
@@ -509,7 +715,7 @@
 	return ret;
 }
 
-static inline int hdsp_system_sample_rate (hdsp_t *hdsp)
+static inline int hdsp_external_sample_rate (hdsp_t *hdsp)
 {
 	unsigned int status2 = hdsp_read(hdsp, HDSP_status2Register);
 	unsigned int rate_bits = status2 & HDSP_systemFrequencyMask;
@@ -521,7 +727,8 @@
 	case HDSP_systemFrequency64:   return 64000;
 	case HDSP_systemFrequency88_2: return 88200;
 	case HDSP_systemFrequency96:   return 96000;
-	default:                       return 0;
+	default:
+		return 0;
 	}
 }
 
@@ -533,7 +740,7 @@
 	if (status & HDSP_SPDIFErrorFlag) {
 		return 0;
 	}
-
+	
 	switch (rate_bits) {
 	case HDSP_spdifFrequency32KHz: return 32000;
 	case HDSP_spdifFrequency44_1KHz: return 44100;
@@ -542,7 +749,7 @@
 	case HDSP_spdifFrequency88_2KHz: return 88200;
 	case HDSP_spdifFrequency96KHz: return 96000;
 	default:
-		snd_printk ("unknown frequency status; bits = 0x%x, status = 0x%x", rate_bits, status);
+		snd_printk ("unknown spdif frequency status; bits = 0x%x, status = 0x%x\n", rate_bits, status);
 		return 0;
 	}
 }
@@ -571,17 +778,7 @@
 
 static inline void hdsp_reset_hw_pointer(hdsp_t *hdsp)
 {
-#if 0
-	/* reset the hw pointer to zero. We do this by writing to 8
-	   registers, each of which is a 32bit wide register, and set
-	   them all to zero. 
-	*/
-
-	for (i = 0; i < 8; ++i) {
-		hdsp_write(hdsp, i, 0);
-		udelay(10);
-	}
-#endif
+	hdsp_write (hdsp, HDSP_resetPointer, 0);
 }
 
 static inline void hdsp_start_audio(hdsp_t *s)
@@ -626,16 +823,33 @@
 	return 0;
 }
 
-static int hdsp_set_rate(hdsp_t *hdsp, int rate)
+static int hdsp_set_rate(hdsp_t *hdsp, int rate, int called_internally)
 {
 	int reject_if_open = 0;
 	int current_rate;
+	int rate_bits;
 
-	if (!(hdsp->control_register & HDSP_ClockModeMaster)) {
-		snd_printk ("device is not running as a clock master: cannot set sample rate.\n");
-		return -1;
+	if (!(hdsp->control_register & HDSP_ClockModeMaster)) {	
+		if (called_internally) {
+			/* request from ctl or card initialization */
+			snd_printk("device is not running as a clock master: cannot set sample rate.\n");
+			return -1;
+		} else {		
+			/* hw_param request while in AutoSync mode */
+			int external_freq = hdsp_external_sample_rate(hdsp);
+			int spdif_freq = hdsp_spdif_sample_rate(hdsp);
+		
+			if ((spdif_freq == external_freq*2) && (hdsp_autosync_ref(hdsp) >= HDSP_AUTOSYNC_FROM_ADAT1)) {
+				snd_printk("Detected ADAT in double speed mode\n");
+			} else if (rate != external_freq) {
+				snd_printk("No AutoSync source for requested rate\n");
+				return -1;
+			}		
+		}	
 	}
 
+	current_rate = hdsp->system_sample_rate;
+
 	/* Changing from a "single speed" to a "double speed" rate is
 	   not allowed if any substreams are open. This is because
 	   such a change causes a shift in the location of 
@@ -644,48 +858,46 @@
 
 	   Note that a similar but essentially insoluble problem
 	   exists for externally-driven rate changes. All we can do
-	   is to flag rate changes in the read/write routines.
-	 */
+	   is to flag rate changes in the read/write routines.  */
 
 	spin_lock_irq(&hdsp->lock);
-	current_rate = hdsp_system_sample_rate(hdsp);
 
 	switch (rate) {
 	case 32000:
 		if (current_rate > 48000) {
 			reject_if_open = 1;
 		}
-		rate = HDSP_Frequency32KHz;
+		rate_bits = HDSP_Frequency32KHz;
 		break;
 	case 44100:
 		if (current_rate > 48000) {
 			reject_if_open = 1;
 		}
-		rate = HDSP_Frequency44_1KHz;
+		rate_bits = HDSP_Frequency44_1KHz;
 		break;
 	case 48000:
 		if (current_rate > 48000) {
 			reject_if_open = 1;
 		}
-		rate = HDSP_Frequency48KHz;
+		rate_bits = HDSP_Frequency48KHz;
 		break;
 	case 64000:
-		if (current_rate < 48000) {
+		if (current_rate <= 48000) {
 			reject_if_open = 1;
 		}
-		rate = HDSP_Frequency64KHz;
+		rate_bits = HDSP_Frequency64KHz;
 		break;
 	case 88200:
-		if (current_rate < 48000) {
+		if (current_rate <= 48000) {
 			reject_if_open = 1;
 		}
-		rate = HDSP_Frequency88_2KHz;
+		rate_bits = HDSP_Frequency88_2KHz;
 		break;
 	case 96000:
-		if (current_rate < 48000) {
+		if (current_rate <= 48000) {
 			reject_if_open = 1;
 		}
-		rate = HDSP_Frequency96KHz;
+		rate_bits = HDSP_Frequency96KHz;
 		break;
 	default:
 		spin_unlock_irq(&hdsp->lock);
@@ -701,21 +913,30 @@
 	}
 
 	hdsp->control_register &= ~HDSP_FrequencyMask;
-	hdsp->control_register |= rate;
+	hdsp->control_register |= rate_bits;
 	hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
 
 	if (rate > 48000) {
 		hdsp->channel_map = channel_map_ds;
 	} else {
-		switch (hdsp->type) {
+		switch (hdsp->io_type) {
 		case Multiface:
 			hdsp->channel_map = channel_map_mf_ss;
 			break;
 		case Digiface:
 			hdsp->channel_map = channel_map_df_ss;
 			break;
+		default:
+			/* should never happen */
+			break;
 		}
 	}
+	
+	hdsp->system_sample_rate = rate;
+	
+	if (reject_if_open) {
+		hdsp_update_simple_mixer_controls (hdsp);
+	}
 
 	spin_unlock_irq(&hdsp->lock);
 	return 0;
@@ -734,11 +955,11 @@
 
 		if (enable) {
 			for (i = 0; i < 26; i++) {
-				hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY(i,i), UNITY_GAIN);
+				hdsp_write_gain (hdsp, hdsp_input_to_output_key(hdsp,i,i), UNITY_GAIN);
 			}
 		} else {
 			for (i = 0; i < 26; i++) {
-				hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY(i,i), MINUS_INFINITY_GAIN);
+				hdsp_write_gain (hdsp, hdsp_input_to_output_key(hdsp,i,i), MINUS_INFINITY_GAIN);
 			}
 		}
 
@@ -752,9 +973,9 @@
 		snd_assert(mapped_channel > -1, return);
 
 		if (enable) {
-			hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY(mapped_channel,mapped_channel), UNITY_GAIN);
+			hdsp_write_gain (hdsp, hdsp_input_to_output_key(hdsp,mapped_channel,mapped_channel), UNITY_GAIN);
 		} else {
-			hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY(mapped_channel,mapped_channel), MINUS_INFINITY_GAIN);
+			hdsp_write_gain (hdsp, hdsp_input_to_output_key(hdsp,mapped_channel,mapped_channel), MINUS_INFINITY_GAIN);
 		}
 	}
 }
@@ -851,7 +1072,6 @@
 	/* Output is not interrupt driven */
 		
 	spin_lock_irqsave (&hmidi->lock, flags);
-
 	if (hmidi->output) {
 		if (!snd_rawmidi_transmit_empty (hmidi->output)) {
 			if ((n_pending = snd_hdsp_midi_output_possible (hmidi->hdsp, hmidi->id)) > 0) {
@@ -865,7 +1085,6 @@
 			}
 		}
 	}
-
 	spin_unlock_irqrestore (&hmidi->lock, flags);
 	return 0;
 }
@@ -878,7 +1097,6 @@
 	int i;
 
 	spin_lock_irqsave (&hmidi->lock, flags);
-
 	if ((n_pending = snd_hdsp_midi_input_available (hmidi->hdsp, hmidi->id)) > 0) {
 		if (hmidi->input) {
 			if (n_pending > (int)sizeof (buf)) {
@@ -896,7 +1114,14 @@
 				snd_hdsp_midi_read_byte (hmidi->hdsp, hmidi->id);
 			}
 		}
-	} 
+	}
+	hmidi->pending = 0;
+	if (hmidi->id) {
+		hmidi->hdsp->control_register |= HDSP_Midi1InterruptEnable;
+	} else {
+		hmidi->hdsp->control_register |= HDSP_Midi0InterruptEnable;
+	}
+	hdsp_write(hmidi->hdsp, HDSP_controlRegister, hmidi->hdsp->control_register);
 	spin_unlock_irqrestore (&hmidi->lock, flags);
 	return snd_hdsp_midi_output_write (hmidi);
 }
@@ -1056,6 +1281,7 @@
 	hdsp->midi[id].output = NULL;
 	hdsp->midi[id].hdsp = hdsp;
 	hdsp->midi[id].istimer = 0;
+	hdsp->midi[id].pending = 0;
 	spin_lock_init (&hdsp->midi[id].lock);
 
 	sprintf (buf, "%s MIDI %d", card->shortname, id+1);
@@ -1178,9 +1404,12 @@
 }
 
 #define HDSP_SPDIF_IN(xname, xindex) \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \
+{ .iface = SNDRV_CTL_ELEM_IFACE_PCM,  \
+  .name = xname, \
+  .index = xindex, \
   .info = snd_hdsp_info_spdif_in, \
-  .get = snd_hdsp_get_spdif_in, .put = snd_hdsp_put_spdif_in }
+  .get = snd_hdsp_get_spdif_in, \
+  .put = snd_hdsp_put_spdif_in }
 
 static unsigned int hdsp_spdif_in(hdsp_t *hdsp)
 {
@@ -1211,11 +1440,8 @@
 static int snd_hdsp_get_spdif_in(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	unsigned long flags;
 	
-	spin_lock_irqsave(&hdsp->lock, flags);
 	ucontrol->value.enumerated.item[0] = hdsp_spdif_in(hdsp);
-	spin_unlock_irqrestore(&hdsp->lock, flags);
 	return 0;
 }
 
@@ -1238,8 +1464,8 @@
 }
 
 #define HDSP_SPDIF_OUT(xname, xindex) \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \
-  .info = snd_hdsp_info_spdif_out, \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
+  .info = snd_hdsp_info_spdif_bits, \
   .get = snd_hdsp_get_spdif_out, .put = snd_hdsp_put_spdif_out }
 
 static int hdsp_spdif_out(hdsp_t *hdsp)
@@ -1258,7 +1484,7 @@
 	return 0;
 }
 
-static int snd_hdsp_info_spdif_out(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+static int snd_hdsp_info_spdif_bits(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
 	uinfo->count = 1;
@@ -1270,11 +1496,8 @@
 static int snd_hdsp_get_spdif_out(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	unsigned long flags;
 	
-	spin_lock_irqsave(&hdsp->lock, flags);
 	ucontrol->value.integer.value[0] = hdsp_spdif_out(hdsp);
-	spin_unlock_irqrestore(&hdsp->lock, flags);
 	return 0;
 }
 
@@ -1295,20 +1518,436 @@
 	return change;
 }
 
-#define HDSP_SYNC_PREF(xname, xindex) \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \
-  .info = snd_hdsp_info_sync_pref, \
-  .get = snd_hdsp_get_sync_pref, .put = snd_hdsp_put_sync_pref }
+#define HDSP_SPDIF_PROFESSIONAL(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
+  .info = snd_hdsp_info_spdif_bits, \
+  .get = snd_hdsp_get_spdif_professional, .put = snd_hdsp_put_spdif_professional }
 
-static int hdsp_sync_pref(hdsp_t *hdsp)
+static int hdsp_spdif_professional(hdsp_t *hdsp)
 {
-	/* Notice that this looks at the requested sync source,
-	   not the one actually in use.
-	*/
+	return (hdsp->control_register & HDSP_SPDIFProfessional) ? 1 : 0;
+}
+
+static int hdsp_set_spdif_professional(hdsp_t *hdsp, int val)
+{
+	if (val) {
+		hdsp->control_register |= HDSP_SPDIFProfessional;
+	} else {
+		hdsp->control_register &= ~HDSP_SPDIFProfessional;
+	}
+	hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
+	return 0;
+}
+
+static int snd_hdsp_get_spdif_professional(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	ucontrol->value.integer.value[0] = hdsp_spdif_professional(hdsp);
+	return 0;
+}
+
+static int snd_hdsp_put_spdif_professional(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	unsigned long flags;
+	int change;
+	unsigned int val;
+	
+	if (!snd_hdsp_use_is_exclusive(hdsp))
+		return -EBUSY;
+	val = ucontrol->value.integer.value[0] & 1;
+	spin_lock_irqsave(&hdsp->lock, flags);
+	change = (int)val != hdsp_spdif_professional(hdsp);
+	hdsp_set_spdif_professional(hdsp, val);
+	spin_unlock_irqrestore(&hdsp->lock, flags);
+	return change;
+}
+
+#define HDSP_SPDIF_EMPHASIS(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
+  .info = snd_hdsp_info_spdif_bits, \
+  .get = snd_hdsp_get_spdif_emphasis, .put = snd_hdsp_put_spdif_emphasis }
+
+static int hdsp_spdif_emphasis(hdsp_t *hdsp)
+{
+	return (hdsp->control_register & HDSP_SPDIFEmphasis) ? 1 : 0;
+}
+
+static int hdsp_set_spdif_emphasis(hdsp_t *hdsp, int val)
+{
+	if (val) {
+		hdsp->control_register |= HDSP_SPDIFEmphasis;
+	} else {
+		hdsp->control_register &= ~HDSP_SPDIFEmphasis;
+	}
+	hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
+	return 0;
+}
+
+static int snd_hdsp_get_spdif_emphasis(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	ucontrol->value.integer.value[0] = hdsp_spdif_emphasis(hdsp);
+	return 0;
+}
+
+static int snd_hdsp_put_spdif_emphasis(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	unsigned long flags;
+	int change;
+	unsigned int val;
+	
+	if (!snd_hdsp_use_is_exclusive(hdsp))
+		return -EBUSY;
+	val = ucontrol->value.integer.value[0] & 1;
+	spin_lock_irqsave(&hdsp->lock, flags);
+	change = (int)val != hdsp_spdif_emphasis(hdsp);
+	hdsp_set_spdif_emphasis(hdsp, val);
+	spin_unlock_irqrestore(&hdsp->lock, flags);
+	return change;
+}
+
+#define HDSP_SPDIF_NON_AUDIO(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, .name = xname, .index = xindex, \
+  .info = snd_hdsp_info_spdif_bits, \
+  .get = snd_hdsp_get_spdif_nonaudio, .put = snd_hdsp_put_spdif_nonaudio }
+
+static int hdsp_spdif_nonaudio(hdsp_t *hdsp)
+{
+	return (hdsp->control_register & HDSP_SPDIFNonAudio) ? 1 : 0;
+}
+
+static int hdsp_set_spdif_nonaudio(hdsp_t *hdsp, int val)
+{
+	if (val) {
+		hdsp->control_register |= HDSP_SPDIFNonAudio;
+	} else {
+		hdsp->control_register &= ~HDSP_SPDIFNonAudio;
+	}
+	hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
+	return 0;
+}
+
+static int snd_hdsp_get_spdif_nonaudio(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	ucontrol->value.integer.value[0] = hdsp_spdif_nonaudio(hdsp);
+	return 0;
+}
+
+static int snd_hdsp_put_spdif_nonaudio(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	unsigned long flags;
+	int change;
+	unsigned int val;
+	
+	if (!snd_hdsp_use_is_exclusive(hdsp))
+		return -EBUSY;
+	val = ucontrol->value.integer.value[0] & 1;
+	spin_lock_irqsave(&hdsp->lock, flags);
+	change = (int)val != hdsp_spdif_nonaudio(hdsp);
+	hdsp_set_spdif_nonaudio(hdsp, val);
+	spin_unlock_irqrestore(&hdsp->lock, flags);
+	return change;
+}
+
+#define HDSP_SPDIF_SAMPLE_RATE(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
+  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
+  .info = snd_hdsp_info_spdif_sample_rate, \
+  .get = snd_hdsp_get_spdif_sample_rate \
+}
+
+static int snd_hdsp_info_spdif_sample_rate(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	static char *texts[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None"};
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 7 ;
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_hdsp_get_spdif_sample_rate(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
 	
+	switch (hdsp_spdif_sample_rate(hdsp)) {
+	case 32000:
+		ucontrol->value.enumerated.item[0] = 0;
+		break;
+	case 44100:
+		ucontrol->value.enumerated.item[0] = 1;
+		break;
+	case 48000:
+		ucontrol->value.enumerated.item[0] = 2;
+		break;
+	case 64000:
+		ucontrol->value.enumerated.item[0] = 3;
+		break;
+	case 88200:
+		ucontrol->value.enumerated.item[0] = 4;
+		break;
+	case 96000:
+		ucontrol->value.enumerated.item[0] = 5;
+		break;
+	default:
+		ucontrol->value.enumerated.item[0] = 6;		
+	}
+	return 0;
+}
+
+#define HDSP_SYSTEM_SAMPLE_RATE(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
+  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
+  .info = snd_hdsp_info_system_sample_rate, \
+  .get = snd_hdsp_get_system_sample_rate \
+}
+
+static int snd_hdsp_info_system_sample_rate(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+	uinfo->count = 1;
+	return 0;
+}
+
+static int snd_hdsp_get_system_sample_rate(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	ucontrol->value.enumerated.item[0] = hdsp->system_sample_rate;
+	return 0;
+}
+
+#define HDSP_AUTOSYNC_SAMPLE_RATE(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
+  .name = xname, \
+  .index = xindex, \
+  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
+  .info = snd_hdsp_info_autosync_sample_rate, \
+  .get = snd_hdsp_get_autosync_sample_rate \
+}
+
+static int snd_hdsp_info_autosync_sample_rate(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	static char *texts[] = {"32000", "44100", "48000", "64000", "88200", "96000", "None"};	
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 7 ;
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_hdsp_get_autosync_sample_rate(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	switch (hdsp_external_sample_rate(hdsp)) {
+	case 32000:
+		ucontrol->value.enumerated.item[0] = 0;
+		break;
+	case 44100:
+		ucontrol->value.enumerated.item[0] = 1;
+		break;
+	case 48000:
+		ucontrol->value.enumerated.item[0] = 2;
+		break;
+	case 64000:
+		ucontrol->value.enumerated.item[0] = 3;
+		break;
+	case 88200:
+		ucontrol->value.enumerated.item[0] = 4;
+		break;
+	case 96000:
+		ucontrol->value.enumerated.item[0] = 5;
+		break;
+	default:
+		ucontrol->value.enumerated.item[0] = 6;		
+	}
+	return 0;
+}
+
+#define HDSP_SYSTEM_CLOCK_MODE(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
+  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
+  .info = snd_hdsp_info_system_clock_mode, \
+  .get = snd_hdsp_get_system_clock_mode \
+}
+
+static int hdsp_system_clock_mode(hdsp_t *hdsp)
+{
+	if (hdsp->control_register & HDSP_ClockModeMaster) {
+		return 0;
+	} else if (hdsp_external_sample_rate(hdsp) != hdsp->system_sample_rate) {
+			return 0;
+	}
+	return 1;
+}
+
+static int snd_hdsp_info_system_clock_mode(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	static char *texts[] = {"Master", "Slave" };
+	
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 2;
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_hdsp_get_system_clock_mode(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	ucontrol->value.enumerated.item[0] = hdsp_system_clock_mode(hdsp);
+	return 0;
+}
+
+#define HDSP_CLOCK_SOURCE(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
+  .name = xname, \
+  .index = xindex, \
+  .info = snd_hdsp_info_clock_source, \
+  .get = snd_hdsp_get_clock_source, \
+  .put = snd_hdsp_put_clock_source \
+}
+
+static int hdsp_clock_source(hdsp_t *hdsp)
+{
 	if (hdsp->control_register & HDSP_ClockModeMaster) {
-		return HDSP_SYNC_FROM_SELF;
+		switch (hdsp->system_sample_rate) {
+		case 32000:
+			return 1;
+		case 44100:
+			return 2;
+		case 48000:
+			return 3;
+		case 64000:
+			return 4;
+		case 88200:
+			return 5;
+		case 96000:
+			return 6;
+		default:
+			return 3;	
+		}
+	} else {
+		return 0;
+	}
+}
+
+static int hdsp_set_clock_source(hdsp_t *hdsp, int mode)
+{
+	int rate;
+	switch (mode) {
+	case HDSP_CLOCK_SOURCE_AUTOSYNC:
+		if (hdsp_external_sample_rate(hdsp) != 0) {
+		    hdsp->control_register &= ~HDSP_ClockModeMaster;		
+		    hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
+		    return 0;
+		}
+		return -1;
+	case HDSP_CLOCK_SOURCE_INTERNAL_32KHZ:
+		rate = 32000;
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ:
+		rate = 44100;
+		break;	    
+	case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ:
+		rate = 48000;
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_64KHZ:
+		rate = 64000;
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ:
+		rate = 88200;
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_96KHZ:
+		rate = 96000;
+		break;
+	default:
+		rate = 48000;
+	}
+	hdsp->control_register |= HDSP_ClockModeMaster;
+	hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
+	hdsp_set_rate(hdsp, rate, 1);
+	return 0;
+}
+
+static int snd_hdsp_info_clock_source(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	static char *texts[] = {"AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz", "Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz", "Internal 96.0 kHz" };
+	
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 7;
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_hdsp_get_clock_source(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	ucontrol->value.enumerated.item[0] = hdsp_clock_source(hdsp);
+	return 0;
+}
+
+static int snd_hdsp_put_clock_source(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	unsigned long flags;
+	int change;
+	int val;
+	
+	if (!snd_hdsp_use_is_exclusive(hdsp))
+		return -EBUSY;
+	val = ucontrol->value.enumerated.item[0];
+	if (val < 0) val = 0;
+	if (val > 6) val = 6;
+	spin_lock_irqsave(&hdsp->lock, flags);
+	if (val != hdsp_clock_source(hdsp)) {
+		change = (hdsp_set_clock_source(hdsp, val) == 0) ? 1 : 0;
+	} else {
+		change = 0;
 	}
+	spin_unlock_irqrestore(&hdsp->lock, flags);
+	return change;
+}
+
+#define HDSP_PREF_SYNC_REF(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
+  .info = snd_hdsp_info_pref_sync_ref, \
+  .get = snd_hdsp_get_pref_sync_ref, \
+  .put = snd_hdsp_put_pref_sync_ref \
+}
+
+static int hdsp_pref_sync_ref(hdsp_t *hdsp)
+{
+	/* Notice that this looks at the requested sync source,
+	   not the one actually in use.
+	*/
 
 	switch (hdsp->control_register & HDSP_SyncRefMask) {
 	case HDSP_SyncRef_ADAT1:
@@ -1324,42 +1963,33 @@
 	case HDSP_SyncRef_ADAT_SYNC:
 		return HDSP_SYNC_FROM_ADAT_SYNC;
 	default:
-		return HDSP_SYNC_FROM_SELF;
+		return HDSP_SYNC_FROM_WORD;
 	}
 	return 0;
 }
 
-static int hdsp_set_sync_pref(hdsp_t *hdsp, int pref)
+static int hdsp_set_pref_sync_ref(hdsp_t *hdsp, int pref)
 {
 	hdsp->control_register &= ~HDSP_SyncRefMask;
 	switch (pref) {
 	case HDSP_SYNC_FROM_ADAT1:
-		hdsp->control_register &= ~HDSP_ClockModeMaster;
 		hdsp->control_register &= ~HDSP_SyncRefMask; /* clear SyncRef bits */
 		break;
 	case HDSP_SYNC_FROM_ADAT2:
-		hdsp->control_register &= ~HDSP_ClockModeMaster;
 		hdsp->control_register |= HDSP_SyncRef_ADAT2;
 		break;
 	case HDSP_SYNC_FROM_ADAT3:
-		hdsp->control_register &= ~HDSP_ClockModeMaster;
 		hdsp->control_register |= HDSP_SyncRef_ADAT3;
 		break;
 	case HDSP_SYNC_FROM_SPDIF:
-		hdsp->control_register &= ~HDSP_ClockModeMaster;
 		hdsp->control_register |= HDSP_SyncRef_SPDIF;
 		break;
 	case HDSP_SYNC_FROM_WORD:
-		hdsp->control_register &= ~HDSP_ClockModeMaster;
 		hdsp->control_register |= HDSP_SyncRef_WORD;
 		break;
 	case HDSP_SYNC_FROM_ADAT_SYNC:
-		hdsp->control_register &= ~HDSP_ClockModeMaster;
 		hdsp->control_register |= HDSP_SyncRef_ADAT_SYNC;
 		break;
-	case HDSP_SYNC_FROM_SELF:
-		hdsp->control_register |= HDSP_ClockModeMaster;
-		break;
 	default:
 		return -1;
 	}
@@ -1367,32 +1997,29 @@
 	return 0;
 }
 
-static int snd_hdsp_info_sync_pref(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+static int snd_hdsp_info_pref_sync_ref(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
-	static char *texts[] = {"Internal", "Word", "ADAT Sync", "IEC958", "ADAT1", "ADAT2", "ADAT3" };
+	static char *texts[] = {"Word", "ADAT Sync", "IEC958", "ADAT1", "ADAT2", "ADAT3" };
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
 	
 	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
 	uinfo->count = 1;
-	uinfo->value.enumerated.items = (hdsp->type == Digiface) ? 7 : 6;
+	uinfo->value.enumerated.items = (hdsp->io_type == Digiface) ? 6 : 4;
 	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
 		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
 	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
 	return 0;
 }
 
-static int snd_hdsp_get_sync_pref(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_hdsp_get_pref_sync_ref(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	unsigned long flags;
 	
-	spin_lock_irqsave(&hdsp->lock, flags);
-	ucontrol->value.enumerated.item[0] = hdsp_sync_pref(hdsp);
-	spin_unlock_irqrestore(&hdsp->lock, flags);
+	ucontrol->value.enumerated.item[0] = hdsp_pref_sync_ref(hdsp);
 	return 0;
 }
 
-static int snd_hdsp_put_sync_pref(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_hdsp_put_pref_sync_ref(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
 	unsigned long flags;
@@ -1401,20 +2028,79 @@
 	
 	if (!snd_hdsp_use_is_exclusive(hdsp))
 		return -EBUSY;
-	max = hdsp->ss_channels == (hdsp->type == Digiface) ? 7 : 6;
+	max = (hdsp->io_type == Digiface) ? 6 : 4;
 	val = ucontrol->value.enumerated.item[0] % max;
 	spin_lock_irqsave(&hdsp->lock, flags);
-	change = (int)val != hdsp_sync_pref(hdsp);
-	hdsp_set_sync_pref(hdsp, val);
+	change = (int)val != hdsp_pref_sync_ref(hdsp);
+	hdsp_set_pref_sync_ref(hdsp, val);
 	spin_unlock_irqrestore(&hdsp->lock, flags);
 	return change;
 }
 
+#define HDSP_AUTOSYNC_REF(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
+  .access = SNDRV_CTL_ELEM_ACCESS_READ, \
+  .info = snd_hdsp_info_autosync_ref, \
+  .get = snd_hdsp_get_autosync_ref, \
+}
+
+static int hdsp_autosync_ref(hdsp_t *hdsp)
+{
+	/* This looks at the autosync selected sync reference */
+	unsigned int status2 = hdsp_read(hdsp, HDSP_status2Register);
+
+	switch (status2 & HDSP_SelSyncRefMask) {
+	case HDSP_SelSyncRef_WORD:
+		return HDSP_AUTOSYNC_FROM_WORD;
+	case HDSP_SelSyncRef_ADAT_SYNC:
+		return HDSP_AUTOSYNC_FROM_ADAT_SYNC;
+	case HDSP_SelSyncRef_SPDIF:
+		return HDSP_AUTOSYNC_FROM_SPDIF;
+	case HDSP_SelSyncRefMask:
+		return HDSP_AUTOSYNC_FROM_NONE;	
+	case HDSP_SelSyncRef_ADAT1:
+		return HDSP_AUTOSYNC_FROM_ADAT1;
+	case HDSP_SelSyncRef_ADAT2:
+		return HDSP_AUTOSYNC_FROM_ADAT2;
+	case HDSP_SelSyncRef_ADAT3:
+		return HDSP_AUTOSYNC_FROM_ADAT3;
+	default:
+		return HDSP_AUTOSYNC_FROM_WORD;
+	}
+	return 0;
+}
+
+static int snd_hdsp_info_autosync_ref(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+{
+	static char *texts[] = {"Word", "ADAT Sync", "IEC958", "None", "ADAT1", "ADAT2", "ADAT3" };
+	
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 7;
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
+	return 0;
+}
+
+static int snd_hdsp_get_autosync_ref(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+{
+	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
+	
+	ucontrol->value.enumerated.item[0] = hdsp_pref_sync_ref(hdsp);
+	return 0;
+}
+
 #define HDSP_PASSTHRU(xname, xindex) \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
   .info = snd_hdsp_info_passthru, \
   .put = snd_hdsp_put_passthru, \
-  .get = snd_hdsp_get_passthru }
+  .get = snd_hdsp_get_passthru \
+}
 
 static int snd_hdsp_info_passthru(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
 {
@@ -1457,9 +2143,13 @@
 }
 
 #define HDSP_LINE_OUT(xname, xindex) \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
   .info = snd_hdsp_info_line_out, \
-  .get = snd_hdsp_get_line_out, .put = snd_hdsp_put_line_out }
+  .get = snd_hdsp_get_line_out, \
+  .put = snd_hdsp_put_line_out \
+}
 
 static int hdsp_line_out(hdsp_t *hdsp)
 {
@@ -1515,9 +2205,15 @@
 }
 
 #define HDSP_MIXER(xname, xindex) \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = xname, .index = xindex, \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
+  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
+		 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
   .info = snd_hdsp_info_mixer, \
-  .get = snd_hdsp_get_mixer, .put = snd_hdsp_put_mixer }
+  .get = snd_hdsp_get_mixer, \
+  .put = snd_hdsp_put_mixer \
+}
 
 static int snd_hdsp_info_mixer(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
@@ -1541,13 +2237,13 @@
 	destination = ucontrol->value.integer.value[1];
 
 	if (source > 25) {
-		addr = PLAYBACK_TO_OUTPUT_KEY(source-26,destination);
+		addr = hdsp_playback_to_output_key(hdsp,source-26,destination);
 	} else {
-		addr = INPUT_TO_OUTPUT_KEY(source, destination);
+		addr = hdsp_input_to_output_key(hdsp,source, destination);
 	}
 	
 	spin_lock_irqsave(&hdsp->lock, flags);
-	ucontrol->value.integer.value[0] = hdsp_read_gain (hdsp, addr);
+	ucontrol->value.integer.value[2] = hdsp_read_gain (hdsp, addr);
 	spin_unlock_irqrestore(&hdsp->lock, flags);
 	return 0;
 }
@@ -1569,9 +2265,9 @@
 	destination = ucontrol->value.integer.value[1];
 
 	if (source > 25) {
-		addr = PLAYBACK_TO_OUTPUT_KEY(source-26, destination);
+		addr = hdsp_playback_to_output_key(hdsp,source-26, destination);
 	} else {
-		addr = INPUT_TO_OUTPUT_KEY(source, destination);
+		addr = hdsp_input_to_output_key(hdsp,source, destination);
 	}
 
 	gain = ucontrol->value.integer.value[2];
@@ -1594,7 +2290,9 @@
   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_WRITE | \
 		 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
   .info = snd_hdsp_info_playback_mixer, \
-  .get = snd_hdsp_get_playback_mixer, .put = snd_hdsp_put_playback_mixer }
+  .get = snd_hdsp_get_playback_mixer, \
+  .put = snd_hdsp_put_playback_mixer \
+}
 
 static int snd_hdsp_info_playback_mixer(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
@@ -1622,7 +2320,7 @@
 		return -EINVAL;
 	}
 
-	addr = PLAYBACK_TO_OUTPUT_KEY(mapped_channel, mapped_channel);
+	addr = hdsp_playback_to_output_key(hdsp,mapped_channel, mapped_channel);
 
 	spin_lock_irqsave(&hdsp->lock, flags);
 	ucontrol->value.integer.value[0] = hdsp_read_gain (hdsp, addr);
@@ -1651,7 +2349,7 @@
 		return -EINVAL;
 	}
 
-	addr = PLAYBACK_TO_OUTPUT_KEY(mapped_channel, mapped_channel);
+	addr = hdsp_playback_to_output_key(hdsp,mapped_channel, mapped_channel);
 	gain = ucontrol->value.integer.value[0];
 
 
@@ -1663,114 +2361,143 @@
 	return change;
 }
 
-#define HDSP_PEAK_PLAYBACK \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
+#define HDSP_WC_SYNC_CHECK(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
-  .info = snd_hdsp_info_peak_playback, \
-  .get = snd_hdsp_get_peak_playback \
-}
-
-static int snd_hdsp_info_peak_playback(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
-{
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-	uinfo->count = 2;
-	return 0;
+  .info = snd_hdsp_info_sync_check, \
+  .get = snd_hdsp_get_wc_sync_check \
 }
 
-static int snd_hdsp_get_peak_playback(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_hdsp_info_sync_check(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
 {
-	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	unsigned int peakval = hdsp_read (hdsp, HDSP_playbackPeakLevel + (4 * (ucontrol->id.index-1)));
-	ucontrol->value.integer.value[0] = peakval & 0xffffff00;  /* peak */
-	ucontrol->value.integer.value[1] = peakval & 0xf;         /* overs */
+	static char *texts[] = {"No Lock", "Lock", "Sync" };	
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 3;
+	if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
+		uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
+	strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
 	return 0;
 }
 
-#define HDSP_PEAK_INPUT \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
-  .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
-  .info = snd_hdsp_info_peak_input, \
-  .get = snd_hdsp_get_peak_input \
-}
-
-static int snd_hdsp_info_peak_input(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+static int hdsp_wc_sync_check(hdsp_t *hdsp)
 {
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-	uinfo->count = 2;
+	int status2 = hdsp_read(hdsp, HDSP_status2Register);
+	if (status2 & HDSP_wc_lock) {
+		if (status2 & HDSP_wc_sync) {
+			return 2;
+		} else {
+			 return 1;
+		}
+	} else {		
+		return 0;
+	}
 	return 0;
 }
 
-static int snd_hdsp_get_peak_input(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_hdsp_get_wc_sync_check(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	unsigned int peakval = hdsp_read (hdsp, HDSP_inputPeakLevel + (4 * (ucontrol->id.index-1)));
-	ucontrol->value.integer.value[0] = peakval & 0xffffff00;  /* peak */
-	ucontrol->value.integer.value[1] = peakval & 0xf;         /* overs */
+
+	ucontrol->value.enumerated.item[0] = hdsp_wc_sync_check(hdsp);
 	return 0;
 }
 
-#define HDSP_PEAK_OUTPUT \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
+#define HDSP_SPDIF_SYNC_CHECK(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
-  .info = snd_hdsp_info_peak_output, \
-  .get = snd_hdsp_get_peak_output \
+  .info = snd_hdsp_info_sync_check, \
+  .get = snd_hdsp_get_spdif_sync_check \
 }
 
-static int snd_hdsp_info_peak_output(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+static int hdsp_spdif_sync_check(hdsp_t *hdsp)
 {
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-	uinfo->count = 2;
+	int status = hdsp_read(hdsp, HDSP_statusRegister);
+	if (status & HDSP_SPDIFErrorFlag) {
+		return 0;
+	} else {	
+		if (status & HDSP_SPDIFSync) {
+			return 2;
+		} else {
+			return 1;
+		}
+	}
 	return 0;
 }
 
-static int snd_hdsp_get_peak_output(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_hdsp_get_spdif_sync_check(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	unsigned int peakval = hdsp_read (hdsp, HDSP_outputPeakLevel + (4 * (ucontrol->id.index-1)));
-	ucontrol->value.integer.value[0] = peakval & 0xffffff00;  /* peak */
-	ucontrol->value.integer.value[1] = peakval & 0xf;         /* overs */
+
+	ucontrol->value.enumerated.item[0] = hdsp_spdif_sync_check(hdsp);
 	return 0;
 }
 
-#define HDSP_RMS_INPUT \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
+#define HDSP_ADATSYNC_SYNC_CHECK(xname, xindex) \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
+  .name = xname, \
+  .index = xindex, \
   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
-  .info = snd_hdsp_info_rms_input, \
-  .get = snd_hdsp_get_rms_input \
+  .info = snd_hdsp_info_sync_check, \
+  .get = snd_hdsp_get_adatsync_sync_check \
 }
 
-static int snd_hdsp_info_rms_input(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+static int hdsp_adatsync_sync_check(hdsp_t *hdsp)
 {
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER64;
-	uinfo->count = 1;
-	return 0;
-}
+	int status = hdsp_read(hdsp, HDSP_statusRegister);
+	if (status & HDSP_TimecodeLock) {
+		if (status & HDSP_TimecodeSync) {
+			return 2;
+		} else {
+			return 1;
+		}
+	} else {
+		return 0;
+	}
+}	
 
-static int snd_hdsp_get_rms_input(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_hdsp_get_adatsync_sync_check(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	ucontrol->value.integer64.value[0] = hdsp_read64 (hdsp, HDSP_inputRmsLevel + (8 * (ucontrol->id.index-1)));
+
+	ucontrol->value.enumerated.item[0] = hdsp_adatsync_sync_check(hdsp);
 	return 0;
 }
 
-#define HDSP_RMS_PLAYBACK \
-{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, \
+#define HDSP_ADAT_SYNC_CHECK \
+{ .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, \
   .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
-  .info = snd_hdsp_info_rms_playback, \
-  .get = snd_hdsp_get_rms_playback \
+  .info = snd_hdsp_info_sync_check, \
+  .get = snd_hdsp_get_adat_sync_check \
 }
 
-static int snd_hdsp_info_rms_playback(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
-{
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER64;
-	uinfo->count = 1;
-	return 0;
-}
+static int hdsp_adat_sync_check(hdsp_t *hdsp, int idx)
+{	
+	int status = hdsp_read(hdsp, HDSP_statusRegister);
+	
+	if (status & (HDSP_Lock0>>idx)) {
+		if (status & (HDSP_Sync0>>idx)) {
+			return 2;
+		} else {
+			return 1;		
+		}
+	} else {
+		return 0;
+	}		
+} 
 
-static int snd_hdsp_get_rms_playback(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_hdsp_get_adat_sync_check(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
+	int offset;
 	hdsp_t *hdsp = _snd_kcontrol_chip(kcontrol);
-	ucontrol->value.integer64.value[0] = hdsp_read64 (hdsp, HDSP_playbackRmsLevel + (8 * (ucontrol->id.index-1)));
+
+	offset = ucontrol->id.index - 1;
+	snd_assert(offset >= 0 || offset < ((hdsp->io_type == Digiface) ? 3 : 1), return -EINVAL);
+	ucontrol->value.enumerated.item[0] = hdsp_adat_sync_check(hdsp, offset);
 	return 0;
 }
 
@@ -1797,8 +2524,8 @@
 	.info =		snd_hdsp_control_spdif_mask_info,
 	.get =		snd_hdsp_control_spdif_mask_get,
 	.private_value = IEC958_AES0_NONAUDIO |
-			IEC958_AES0_PROFESSIONAL |
-			IEC958_AES0_CON_EMPHASIS,	                                                                                      
+  			 IEC958_AES0_PROFESSIONAL |
+			 IEC958_AES0_CON_EMPHASIS,	                                                                                      
 },
 {
 	.access =	SNDRV_CTL_ELEM_ACCESS_READ,
@@ -1807,13 +2534,27 @@
 	.info =		snd_hdsp_control_spdif_mask_info,
 	.get =		snd_hdsp_control_spdif_mask_get,
 	.private_value = IEC958_AES0_NONAUDIO |
-			IEC958_AES0_PROFESSIONAL |
-			IEC958_AES0_PRO_EMPHASIS,
+			 IEC958_AES0_PROFESSIONAL |
+			 IEC958_AES0_PRO_EMPHASIS,
 },
 HDSP_MIXER("Mixer", 0),
 HDSP_SPDIF_IN("IEC958 Input Connector", 0),
 HDSP_SPDIF_OUT("IEC958 Output also on ADAT1", 0),
-HDSP_SYNC_PREF("Preferred Sync Source", 0),
+HDSP_SPDIF_PROFESSIONAL("IEC958 Professional Bit", 0),
+HDSP_SPDIF_EMPHASIS("IEC958 Emphasis Bit", 0),
+HDSP_SPDIF_NON_AUDIO("IEC958 Non-audio Bit", 0),
+/* 'Sample Clock Source' complies with the alsa control naming scheme */ 
+HDSP_CLOCK_SOURCE("Sample Clock Source", 0),
+HDSP_SYSTEM_CLOCK_MODE("System Clock Mode", 0),
+HDSP_PREF_SYNC_REF("Preferred Sync Reference", 0),
+HDSP_AUTOSYNC_REF("AutoSync Reference", 0),
+HDSP_SPDIF_SAMPLE_RATE("SPDIF Sample Rate", 0),
+HDSP_SYSTEM_SAMPLE_RATE("System Sample Rate", 0),
+/* 'External Rate' complies with the alsa control naming scheme */
+HDSP_AUTOSYNC_SAMPLE_RATE("External Rate", 0),
+HDSP_WC_SYNC_CHECK("Word Clock Lock Status", 0),
+HDSP_SPDIF_SYNC_CHECK("SPDIF Lock Status", 0),
+HDSP_ADATSYNC_SYNC_CHECK("ADAT Sync Lock Status", 0),
 HDSP_PASSTHRU("Passthru", 0),
 HDSP_LINE_OUT("Line Out", 0),
 };
@@ -1821,11 +2562,29 @@
 #define HDSP_CONTROLS (sizeof(snd_hdsp_controls)/sizeof(snd_kcontrol_new_t))
 
 static snd_kcontrol_new_t snd_hdsp_playback_mixer = HDSP_PLAYBACK_MIXER;
-static snd_kcontrol_new_t snd_hdsp_input_peak = HDSP_PEAK_INPUT;
-static snd_kcontrol_new_t snd_hdsp_output_peak = HDSP_PEAK_OUTPUT;
-static snd_kcontrol_new_t snd_hdsp_playback_peak = HDSP_PEAK_PLAYBACK;
-static snd_kcontrol_new_t snd_hdsp_input_rms = HDSP_RMS_INPUT;
-static snd_kcontrol_new_t snd_hdsp_playback_rms = HDSP_RMS_PLAYBACK;
+static snd_kcontrol_new_t snd_hdsp_adat_sync_check = HDSP_ADAT_SYNC_CHECK;
+
+
+static int hdsp_update_simple_mixer_controls(hdsp_t *hdsp)
+{
+    int i;
+
+    for (i = hdsp->ds_channels; i < hdsp->ss_channels; ++i) {
+	    if (hdsp->system_sample_rate > 48000) {
+		    hdsp->playback_mixer_ctls[i]->vd[0].access = SNDRV_CTL_ELEM_ACCESS_INACTIVE |
+							    SNDRV_CTL_ELEM_ACCESS_READ |
+							     SNDRV_CTL_ELEM_ACCESS_VOLATILE;
+	    } else {
+		    hdsp->playback_mixer_ctls[i]->vd[0].access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
+							     SNDRV_CTL_ELEM_ACCESS_VOLATILE;
+	    }
+	    snd_ctl_notify(hdsp->card, SNDRV_CTL_EVENT_MASK_VALUE | 
+			    SNDRV_CTL_EVENT_MASK_INFO, &hdsp->playback_mixer_ctls[i]->id);
+    }
+
+    return 0;
+}
+
 
 int snd_hdsp_create_controls(snd_card_t *card, hdsp_t *hdsp)
 {
@@ -1840,49 +2599,40 @@
 			hdsp->spdif_ctl = kctl;
 	}
 
-	if (hdsp->type == Digiface) {
+	snd_hdsp_playback_mixer.name = "Chn";
+	snd_hdsp_adat_sync_check.name = "ADAT Lock Status";
+
+	if (hdsp->io_type == Digiface) {
 		limit = DIGIFACE_SS_CHANNELS;
 	} else {
 		limit = MULTIFACE_SS_CHANNELS;
 	}
-
+	
 	/* The index values are one greater than the channel ID so that alsamixer
 	   will display them correctly. We want to use the index for fast lookup
 	   of the relevant channel, but if we use it at all, most ALSA software
 	   does the wrong thing with it ...
 	*/
 
-	snd_hdsp_playback_mixer.name = "Chn";
-	snd_hdsp_input_peak.name = "Input Peak";
-	snd_hdsp_output_peak.name = "Output Peak";
-	snd_hdsp_playback_peak.name = "Playback Peak";
-	snd_hdsp_playback_rms.name = "Playback RMS";
-	snd_hdsp_input_rms.name = "Input RMS";
-
 	for (idx = 0; idx < limit; ++idx) {
 		snd_hdsp_playback_mixer.index = idx+1;
 		if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_playback_mixer, hdsp)))) {
 			return err;
 		}
-		snd_hdsp_input_peak.index = idx+1;
-		if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_input_peak, hdsp)))) {
-			return err;
-		}
-		snd_hdsp_output_peak.index = idx+1;
-		if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_output_peak, hdsp)))) {
-			return err;
-		}
-		snd_hdsp_playback_peak.index = idx+1;
-		if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_playback_peak, hdsp)))) {
-			return err;
-		}
-		snd_hdsp_playback_rms.index = idx+1;
-		if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_playback_rms, hdsp)))) {
-			return err;
-		}
-		snd_hdsp_input_rms.index = idx+1;
-		if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_input_rms, hdsp)))) {
-			return err;
+		hdsp->playback_mixer_ctls[idx] = kctl;
+	}
+	
+	/* ADAT SyncCheck status */
+	snd_hdsp_adat_sync_check.index = 1;
+	if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_adat_sync_check, hdsp)))) {
+		return err;
+	}	
+	if (hdsp->io_type == Digiface) {
+		for (idx = 1; idx < 3; ++idx) {
+			snd_hdsp_adat_sync_check.index = idx+1;
+			if ((err = snd_ctl_add (card, kctl = snd_ctl_new1(&snd_hdsp_adat_sync_check, hdsp)))) {
+				return err;
+			}
 		}
 	}
 
@@ -1899,13 +2649,29 @@
 	hdsp_t *hdsp = (hdsp_t *) entry->private_data;
 	unsigned int status;
 	unsigned int status2;
-	char *requested_sync_ref;
+	char *pref_sync_ref;
+	char *autosync_ref;
+	char *system_clock_mode;
+	char *clock_source;
 	int x;
 
 	if (hdsp_check_for_iobox (hdsp)) {
+		snd_iprintf(buffer, "No I/O box connected.\nPlease connect one and upload firmware.\n");
 		return;
 	}
 
+	if (hdsp_check_for_firmware(hdsp)) {
+		if (hdsp->state & HDSP_FirmwareCached) {
+			if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
+				snd_iprintf(buffer, "Firmware loading from cache failed, please upload manually.\n");
+				return;
+			}
+		} else {
+			snd_iprintf(buffer, "No firmware loaded nor cached, please upload firmware.\n");
+			return;
+		}
+	}
+	
 	status = hdsp_read(hdsp, HDSP_statusRegister);
 	status2 = hdsp_read(hdsp, HDSP_status2Register);
 
@@ -1928,69 +2694,108 @@
 
 	x = 1 << (6 + hdsp_decode_latency(hdsp->control_register & HDSP_LatencyMask));
 
-	snd_iprintf(buffer, "Latency: %d samples (2 periods of %lu bytes)\n", x, (unsigned long) hdsp->period_bytes);
+	snd_iprintf(buffer, "Buffer Size (Latency): %d samples (2 periods of %lu bytes)\n", x, (unsigned long) hdsp->period_bytes);
 	snd_iprintf(buffer, "Hardware pointer (frames): %ld\n", hdsp_hw_pointer(hdsp));
 	snd_iprintf(buffer, "Passthru: %s\n", hdsp->passthru ? "yes" : "no");
 	snd_iprintf(buffer, "Line out: %s\n", (hdsp->control_register & HDSP_LineOut) ? "on" : "off");
 
 	snd_iprintf(buffer, "Firmware version: %d\n", (status2&HDSP_version0)|(status2&HDSP_version1)<<1|(status2&HDSP_version2)<<2);
 
-	switch (hdsp_sync_pref (hdsp)) {
+	snd_iprintf(buffer, "\n");
+
+
+	switch (hdsp_clock_source(hdsp)) {
+	case HDSP_CLOCK_SOURCE_AUTOSYNC:
+		clock_source = "AutoSync";
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_32KHZ:
+		clock_source = "Internal 32 kHz";
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_44_1KHZ:
+		clock_source = "Internal 44.1 kHz";
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_48KHZ:
+		clock_source = "Internal 48 kHz";
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_64KHZ:
+		clock_source = "Internal 64 kHz";
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_88_2KHZ:
+		clock_source = "Internal 88.2 kHz";
+		break;
+	case HDSP_CLOCK_SOURCE_INTERNAL_96KHZ:
+		clock_source = "Internal 96 kHz";
+		break;
+	default:
+		clock_source = "Error";		
+	}
+	snd_iprintf (buffer, "Sample Clock Source: %s\n", clock_source);
+			
+	if (hdsp_system_clock_mode(hdsp)) {
+		system_clock_mode = "Slave";
+	} else {
+		system_clock_mode = "Master";
+	}
+	
+	switch (hdsp_pref_sync_ref (hdsp)) {
 	case HDSP_SYNC_FROM_WORD:
-		requested_sync_ref = "Word";
+		pref_sync_ref = "Word Clock";
 		break;
 	case HDSP_SYNC_FROM_ADAT_SYNC:
-		requested_sync_ref = "ADAT Sync";
+		pref_sync_ref = "ADAT Sync";
 		break;
 	case HDSP_SYNC_FROM_SPDIF:
-		requested_sync_ref = "SPDIF";
+		pref_sync_ref = "SPDIF";
 		break;
 	case HDSP_SYNC_FROM_ADAT1:
-		requested_sync_ref = "ADAT1";
+		pref_sync_ref = "ADAT1";
 		break;
 	case HDSP_SYNC_FROM_ADAT2:
-		requested_sync_ref = "ADAT2";
+		pref_sync_ref = "ADAT2";
 		break;
 	case HDSP_SYNC_FROM_ADAT3:
-		requested_sync_ref = "ADAT3";
+		pref_sync_ref = "ADAT3";
 		break;
-	case HDSP_SYNC_FROM_SELF:
 	default:
-		requested_sync_ref = "Master";
+		pref_sync_ref = "Word Clock";
 		break;
 	}
-
-	if ((hdsp->control_register & HDSP_ClockModeMaster)) {
-		snd_iprintf (buffer, "Sync reference: %s/Master (chosen)\n", requested_sync_ref);
-	} else if (hdsp_system_sample_rate(hdsp) == 0) {
-		snd_iprintf (buffer, "Sync reference: %s/Master (forced)\n", requested_sync_ref);
-	} else {
-		switch (status2 & HDSP_SelSyncRefMask) {
-		case HDSP_SelSyncRef_ADAT1:
-			snd_iprintf (buffer, "Sync reference: %s/ADAT1\n", requested_sync_ref);
-			break;
-		case HDSP_SelSyncRef_ADAT2:
-			snd_iprintf (buffer, "Sync reference: %s/ADAT2\n", requested_sync_ref);
-			break;
-		case HDSP_SelSyncRef_ADAT3:
-			snd_iprintf (buffer, "Sync reference: %s/ADAT3\n", requested_sync_ref);
-			break;
-		case HDSP_SelSyncRef_SPDIF:
-			snd_iprintf (buffer, "Sync reference: %s/SPDIF\n", requested_sync_ref);
-			break;
-		case HDSP_SelSyncRef_WORD:
-			snd_iprintf (buffer, "Sync reference: %s/WORD\n", requested_sync_ref);
-			break;
-		case HDSP_SelSyncRef_ADAT_SYNC:
-			snd_iprintf (buffer, "Sync reference: %s/ADAT Sync\n", requested_sync_ref);
-			break;
-		default:
-			snd_iprintf (buffer, "Sync reference: %s/Master (fallback)\n", requested_sync_ref);
-			break;
-		}
+	snd_iprintf (buffer, "Preferred Sync Reference: %s\n", pref_sync_ref);
+	
+	switch (hdsp_autosync_ref (hdsp)) {
+	case HDSP_AUTOSYNC_FROM_WORD:
+		autosync_ref = "Word Clock";
+		break;
+	case HDSP_AUTOSYNC_FROM_ADAT_SYNC:
+		autosync_ref = "ADAT Sync";
+		break;
+	case HDSP_AUTOSYNC_FROM_SPDIF:
+		autosync_ref = "SPDIF";
+		break;
+	case HDSP_AUTOSYNC_FROM_NONE:
+		autosync_ref = "None";
+		break;	
+	case HDSP_AUTOSYNC_FROM_ADAT1:
+		autosync_ref = "ADAT1";
+		break;
+	case HDSP_AUTOSYNC_FROM_ADAT2:
+		autosync_ref = "ADAT2";
+		break;
+	case HDSP_AUTOSYNC_FROM_ADAT3:
+		autosync_ref = "ADAT3";
+		break;
+	default:
+		autosync_ref = "---";
+		break;
 	}
-	snd_iprintf (buffer, "Sample rate: %d\n", hdsp_system_sample_rate(hdsp));
+	snd_iprintf (buffer, "AutoSync Reference: %s\n", autosync_ref);
+	
+	snd_iprintf (buffer, "AutoSync Frequency: %d\n", hdsp_external_sample_rate(hdsp));
+	
+	snd_iprintf (buffer, "System Clock Mode: %s\n", system_clock_mode);
 
+	snd_iprintf (buffer, "System Clock Frequency: %d\n", hdsp->system_sample_rate);
+		
 	snd_iprintf(buffer, "\n");
 
 	switch ((hdsp->control_register & HDSP_SPDIFInputMask) >> 14) {
@@ -2031,9 +2836,6 @@
 	} else {
 		snd_iprintf(buffer, "IEC958 NonAudio: off\n");
 	}
-
-	snd_iprintf(buffer, "\n");
-
 	if ((x = hdsp_spdif_sample_rate (hdsp)) != 0) {
 		snd_iprintf (buffer, "IEC958 sample rate: %d\n", x);
 	} else {
@@ -2050,20 +2852,44 @@
 		snd_iprintf(buffer, "ADAT1: No Lock\n");
 	}
 
-	x = status & HDSP_Sync1;
-	if (status & HDSP_Lock1) {
-		snd_iprintf(buffer, "ADAT2: %s\n", x ? "Sync" : "Lock");
-	} else {
-		snd_iprintf(buffer, "ADAT2: No Lock\n");
-	}
-
-	if (hdsp->type == Digiface) {
+	switch (hdsp->io_type) {
+	case Digiface:
+		x = status & HDSP_Sync1;
+		if (status & HDSP_Lock1) {
+			snd_iprintf(buffer, "ADAT2: %s\n", x ? "Sync" : "Lock");
+		} else {
+			snd_iprintf(buffer, "ADAT2: No Lock\n");
+		}
 		x = status & HDSP_Sync2;
 		if (status & HDSP_Lock2) {
 			snd_iprintf(buffer, "ADAT3: %s\n", x ? "Sync" : "Lock");
 		} else {
 			snd_iprintf(buffer, "ADAT3: No Lock\n");
 		}
+	default:
+		/* relax */
+		break;
+	}
+
+	x = status & HDSP_SPDIFSync;
+	if (status & HDSP_SPDIFErrorFlag) {
+		snd_iprintf (buffer, "SPDIF: No Lock\n");
+	} else {
+		snd_iprintf (buffer, "SPDIF: %s\n", x ? "Sync" : "Lock");
+	}
+	
+	x = status2 & HDSP_wc_sync;
+	if (status2 & HDSP_wc_lock) {
+		snd_iprintf (buffer, "Word Clock: %s\n", x ? "Sync" : "Lock");
+	} else {
+		snd_iprintf (buffer, "Word Clock: No Lock\n");
+	}
+	
+	x = status & HDSP_TimecodeSync;
+	if (status & HDSP_TimecodeLock) {
+		snd_iprintf(buffer, "ADAT Sync: %s\n", x ? "Sync" : "Lock");
+	} else {
+		snd_iprintf(buffer, "ADAT Sync: No Lock\n");
 	}
 
 	snd_iprintf(buffer, "\n");
@@ -2166,7 +2992,7 @@
 	return 0;
 }
 
-static void snd_hdsp_set_defaults(hdsp_t *hdsp)
+static int snd_hdsp_set_defaults(hdsp_t *hdsp)
 {
 	unsigned int i;
 
@@ -2199,10 +3025,13 @@
 		hdsp->mixer_matrix[i] = MINUS_INFINITY_GAIN;
 	}
 
-	for (i = 0; i < 2048; i++)
-		hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN);
-
-	if (line_outs_monitor[hdsp->dev]) {
+	for (i = 0; i < (hdsp_is_9652(hdsp) ? 1352 : HDSP_MATRIX_MIXER_SIZE); i++) {
+		if (hdsp_write_gain (hdsp, i, MINUS_INFINITY_GAIN)) {
+			return -EIO;
+		}
+	}
+	
+	if (!hdsp_is_9652(hdsp) && line_outs_monitor[hdsp->dev]) {
 		
 		snd_printk ("sending all inputs and playback streams to line outs.\n");
 
@@ -2212,11 +3041,15 @@
 		
 		for (i = 0; i < HDSP_MAX_CHANNELS; i++) {
 			if (i & 1) { 
-				hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY (i, 26), UNITY_GAIN);
-				hdsp_write_gain (hdsp, PLAYBACK_TO_OUTPUT_KEY (i, 26), UNITY_GAIN);
+				if (hdsp_write_gain (hdsp, hdsp_input_to_output_key (hdsp, i, 26), UNITY_GAIN) ||
+				    hdsp_write_gain (hdsp, hdsp_playback_to_output_key (hdsp, i, 26), UNITY_GAIN)) {
+				    return -EIO;
+				}    
 			} else {
-				hdsp_write_gain (hdsp, INPUT_TO_OUTPUT_KEY (i, 27), UNITY_GAIN);
-				hdsp_write_gain (hdsp, PLAYBACK_TO_OUTPUT_KEY (i, 27), UNITY_GAIN);
+				if (hdsp_write_gain (hdsp, hdsp_input_to_output_key (hdsp, i, 27), UNITY_GAIN) ||
+				    hdsp_write_gain (hdsp, hdsp_playback_to_output_key (hdsp, i, 27), UNITY_GAIN)) {
+				    return -EIO;
+				}
 			}
 		}
 	}
@@ -2226,9 +3059,23 @@
 	/* set a default rate so that the channel map is set up.
 	 */
 
-	hdsp_set_rate(hdsp, 48000);
+	hdsp_set_rate(hdsp, 48000, 1);
+
+	return 0;
 }
 
+void hdsp_midi_tasklet(unsigned long arg)
+{
+	hdsp_t *hdsp = (hdsp_t *)arg;
+	
+	if (hdsp->midi[0].pending) {
+		snd_hdsp_midi_input_read (&hdsp->midi[0]);
+	}
+	if (hdsp->midi[1].pending) {
+		snd_hdsp_midi_input_read (&hdsp->midi[1]);
+	}
+} 
+
 void snd_hdsp_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
 	hdsp_t *hdsp = (hdsp_t *) dev_id;
@@ -2238,7 +3085,8 @@
 	int midi1;
 	unsigned int midi0status;
 	unsigned int midi1status;
-
+	int schedule = 0;
+	
 	status = hdsp_read(hdsp, HDSP_statusRegister);
 
 	audio = status & HDSP_audioIRQPending;
@@ -2253,7 +3101,7 @@
 
 	midi0status = hdsp_read (hdsp, HDSP_midiStatusIn0) & 0xff;
 	midi1status = hdsp_read (hdsp, HDSP_midiStatusIn1) & 0xff;
-
+	
 	if (audio) {
 		if (hdsp->capture_substream) {
 			snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream);
@@ -2263,15 +3111,23 @@
 			snd_pcm_period_elapsed(hdsp->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream);
 		}
 	}
-
-	/* note: snd_hdsp_midi_input_read() calls output_write() because
-	   output is not interrupt-driven ...
-	*/
-
-	if (midi0status)
-		snd_hdsp_midi_input_read (&hdsp->midi[0]);
-	if (midi1status)
-		snd_hdsp_midi_input_read (&hdsp->midi[1]);
+	
+	if (midi0 && midi0status) {
+		/* we disable interrupts for this input until processing is done */
+		hdsp->control_register &= ~HDSP_Midi0InterruptEnable;
+		hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
+		hdsp->midi[0].pending = 1;
+		schedule = 1;
+	}
+	if (midi1 && midi1status) {
+		/* we disable interrupts for this input until processing is done */
+		hdsp->control_register &= ~HDSP_Midi1InterruptEnable;
+		hdsp_write(hdsp, HDSP_controlRegister, hdsp->control_register);
+		hdsp->midi[1].pending = 1;
+		schedule = 1;
+	}
+	if (schedule)
+	    tasklet_hi_schedule(&hdsp->midi_tasklet);
 }
 
 static snd_pcm_uframes_t snd_hdsp_hw_pointer(snd_pcm_substream_t *substream)
@@ -2310,8 +3166,7 @@
 
 	channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel);
 	snd_assert(channel_buf != NULL, return -EIO);
-	if (copy_from_user(channel_buf + pos * 4, src, count * 4))
-		return -EFAULT;
+	copy_from_user(channel_buf + pos * 4, src, count * 4);
 	return count;
 }
 
@@ -2325,8 +3180,7 @@
 
 	channel_buf = hdsp_channel_buffer_location (hdsp, substream->pstr->stream, channel);
 	snd_assert(channel_buf != NULL, return -EIO);
-	if (copy_to_user(dst, channel_buf + pos * 4, count * 4))
-		return -EFAULT;
+	copy_to_user(dst, channel_buf + pos * 4, count * 4);
 	return count;
 }
 
@@ -2381,6 +3235,17 @@
 		return -EIO;
 	}
 
+	if (hdsp_check_for_firmware(hdsp)) {
+		if (hdsp->state & HDSP_FirmwareCached) {
+			if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
+				snd_printk("Firmware loading from cache failed, please upload manually.\n");
+			}
+		} else {
+			snd_printk("No firmware loaded nor cached, please upload firmware.\n");
+		}
+		return -EIO;
+	}
+
 	spin_lock_irq(&hdsp->lock);
 
 	if (substream->pstr->stream == SNDRV_PCM_STREAM_PLAYBACK) {
@@ -2400,7 +3265,7 @@
 		   that matter are the same.
 		 */
 
-		if ((int)params_rate(params) != hdsp_system_sample_rate(hdsp)) {
+		if (params_rate(params) != hdsp->system_sample_rate) {
 			spin_unlock_irq(&hdsp->lock);
 			_snd_pcm_hw_param_setempty(params, SNDRV_PCM_HW_PARAM_RATE);
 			return -EBUSY;
@@ -2424,7 +3289,7 @@
 	/* how to make sure that the rate matches an externally-set one ?
 	 */
 
-	if ((err = hdsp_set_rate(hdsp, params_rate(params))) < 0) {
+	if ((err = hdsp_set_rate(hdsp, params_rate(params), 0)) < 0) {
 		_snd_pcm_hw_param_setempty(params, SNDRV_PCM_HW_PARAM_RATE);
 		return err;
 	}
@@ -2485,6 +3350,17 @@
 		return -EIO;
 	}
 
+	if (hdsp_check_for_firmware(hdsp)) {
+		if (hdsp->state & HDSP_FirmwareCached) {
+			if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
+				snd_printk("Firmware loading from cache failed, please upload manually.\n");
+			}
+		} else {
+			snd_printk("No firmware loaded nor cached, please upload firmware.\n");
+		}
+		return -EIO;
+	}
+
 	spin_lock(&hdsp->lock);
 	running = hdsp->running;
 	switch (cmd) {
@@ -2551,6 +3427,17 @@
 		return -EIO;
 	}
 
+	if (hdsp_check_for_firmware(hdsp)) {
+		if (hdsp->state & HDSP_FirmwareCached) {
+			if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
+				snd_printk("Firmware loading from cache failed, please upload manually.\n");
+			}
+		} else {
+			snd_printk("No firmware loaded nor cached, please upload firmware.\n");
+		}
+		return -EIO;
+	}
+
 	spin_lock_irq(&hdsp->lock);
 	if (!hdsp->running)
 		hdsp_reset_hw_pointer(hdsp);
@@ -2577,11 +3464,11 @@
 	.channels_min =		14,
 	.channels_max =		HDSP_MAX_CHANNELS,
 	.buffer_bytes_max =	HDSP_CHANNEL_BUFFER_BYTES * HDSP_MAX_CHANNELS,
-	.period_bytes_min =	(64 * 4) *10,
+	.period_bytes_min =	(64 * 4) * 10,
 	.period_bytes_max =	(8192 * 4) * HDSP_MAX_CHANNELS,
 	.periods_min =		2,
 	.periods_max =		2,
-	.fifo_size =		0,
+	.fifo_size =		0
 };
 
 static snd_pcm_hardware_t snd_hdsp_capture_subinfo =
@@ -2606,7 +3493,7 @@
 	.period_bytes_max =	(8192 * 4) * HDSP_MAX_CHANNELS,
 	.periods_min =		2,
 	.periods_max =		2,
-	.fifo_size =		0,
+	.fifo_size =		0
 };
 
 static unsigned int period_sizes[] = { 64, 128, 256, 512, 1024, 2048, 4096, 8192 };
@@ -2638,7 +3525,7 @@
 		snd_interval_t t = {
 			.min = hdsp->ds_channels,
 			.max = hdsp->ds_channels,
-			.integer = 1,
+			integer: 1,
 		};
 		return snd_interval_refine(c, &t);
 	} else if (r->max < 64000) {
@@ -2662,7 +3549,7 @@
 		snd_interval_t t = {
 			.min = 32000,
 			.max = 48000,
-			.integer = 1,
+			integer: 1,
 		};
 		return snd_interval_refine(r, &t);
 	} else if (c->max <= hdsp->ds_channels) {
@@ -2686,6 +3573,17 @@
 		return -EIO;
 	}
 
+	if (hdsp_check_for_firmware(hdsp)) {
+		if (hdsp->state & HDSP_FirmwareCached) {
+			if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
+				snd_printk("Firmware loading from cache failed, please upload manually.\n");
+			}
+		} else {
+			snd_printk("No firmware loaded nor cached, please upload firmware.\n");
+		}
+		return -EIO;
+	}
+
 	spin_lock_irqsave(&hdsp->lock, flags);
 
 	snd_pcm_set_sync(substream);
@@ -2717,7 +3615,7 @@
 			     SNDRV_PCM_HW_PARAM_CHANNELS, -1);
 
 	hdsp->creg_spdif_stream = hdsp->creg_spdif;
-	hdsp->spdif_ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	hdsp->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(hdsp->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &hdsp->spdif_ctl->id);
 	return 0;
@@ -2735,7 +3633,7 @@
 
 	spin_unlock_irqrestore(&hdsp->lock, flags);
 
-	hdsp->spdif_ctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	hdsp->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(hdsp->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &hdsp->spdif_ctl->id);
 	return 0;
@@ -2752,6 +3650,17 @@
 		return -EIO;
 	}
 
+	if (hdsp_check_for_firmware(hdsp)) {
+		if (hdsp->state & HDSP_FirmwareCached) {
+			if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) {
+				snd_printk("Firmware loading from cache failed, please upload manually.\n");
+			}
+		} else {
+			snd_printk("No firmware loaded nor cached, please upload firmware.\n");
+		}
+		return -EIO;
+	}
+
 	spin_lock_irqsave(&hdsp->lock, flags);
 
 	snd_pcm_set_sync(substream);
@@ -2798,6 +3707,136 @@
 	return 0;
 }
 
+static int snd_hdsp_hwdep_dummy_op(snd_hwdep_t *hw, struct file *file)
+{
+    /* we have nothing to initialize but the call is required */
+    return 0;
+}
+
+
+static int snd_hdsp_hwdep_ioctl(snd_hwdep_t *hw, struct file *file, unsigned int cmd, unsigned long arg)
+{
+	hdsp_t *hdsp = (hdsp_t *)hw->private_data;	
+	hdsp_peak_rms_t *peak_rms;
+	hdsp_firmware_t *firmware;
+	hdsp_mixer_t	*mixer;
+	hdsp_config_info_t info;
+	hdsp_version_t hdsp_version;
+	int i;
+	int err;
+	unsigned long flags;
+	
+	switch (cmd) {
+	case SNDRV_HDSP_IOCTL_GET_PEAK_RMS:
+		if (!(hdsp->state & HDSP_FirmwareLoaded)) {
+			snd_printk("firmware needs to be uploaded to the card.\n");	
+			return -EINVAL;
+		}
+		peak_rms = (hdsp_peak_rms_t *)arg;
+		if (copy_to_user_fromio((void *)peak_rms->playback_peaks, hdsp->iobase+HDSP_playbackPeakLevel, 26*4) != 0) {
+			return -EFAULT;
+		}
+		if (copy_to_user_fromio((void *)peak_rms->input_peaks, hdsp->iobase+HDSP_inputPeakLevel, 26*4) != 0) {
+			return -EFAULT;
+		}
+		if (copy_to_user_fromio((void *)peak_rms->output_peaks, hdsp->iobase+HDSP_outputPeakLevel, 28*4) != 0) {
+			return -EFAULT;
+		}
+		if (copy_to_user_fromio((void *)peak_rms->playback_rms, hdsp->iobase+HDSP_playbackRmsLevel, 26*8) != 0) {
+			return -EFAULT;
+		}
+		if (copy_to_user_fromio((void *)peak_rms->input_rms, hdsp->iobase+HDSP_inputRmsLevel, 26*8) != 0) {
+			return -EFAULT;
+		}
+		break;
+	case SNDRV_HDSP_IOCTL_GET_CONFIG_INFO:
+		if (!(hdsp->state & HDSP_FirmwareLoaded)) {
+			snd_printk("Firmware needs to be uploaded to the card.\n");	
+			return -EINVAL;
+		}
+		spin_lock_irqsave(&hdsp->lock, flags);
+		info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp);
+		info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp);
+		info.adatsync_sync_check = (unsigned char)hdsp_adatsync_sync_check(hdsp);
+		info.spdif_sync_check = (unsigned char)hdsp_spdif_sync_check(hdsp);
+		for (i = 0; i < ((hdsp->io_type != Multiface) ? 3 : 1); ++i) {
+			info.adat_sync_check[i] = (unsigned char)hdsp_adat_sync_check(hdsp, i);
+		}
+		info.spdif_in = (unsigned char)hdsp_spdif_in(hdsp);
+		info.spdif_out = (unsigned char)hdsp_spdif_out(hdsp);
+		info.spdif_professional = (unsigned char)hdsp_spdif_professional(hdsp);
+		info.spdif_emphasis = (unsigned char)hdsp_spdif_emphasis(hdsp);
+		info.spdif_nonaudio = (unsigned char)hdsp_spdif_nonaudio(hdsp);
+		info.spdif_sample_rate = hdsp_spdif_sample_rate(hdsp);
+		info.system_sample_rate = hdsp->system_sample_rate;
+		info.autosync_sample_rate = hdsp_external_sample_rate(hdsp);
+		info.system_clock_mode = (unsigned char)hdsp_system_clock_mode(hdsp);
+		info.clock_source = (unsigned char)hdsp_clock_source(hdsp);
+		info.autosync_ref = (unsigned char)hdsp_autosync_ref(hdsp);
+		info.line_out = (unsigned char)hdsp_line_out(hdsp);
+		info.passthru = (unsigned char)hdsp->passthru;
+		spin_unlock_irqrestore(&hdsp->lock, flags);
+		if (copy_to_user((void *)arg, &info, sizeof(info)))
+			return -EFAULT;
+		break;
+	case SNDRV_HDSP_IOCTL_GET_VERSION:
+		if (hdsp_is_9652(hdsp)) return -EINVAL;
+		if (hdsp->io_type == Undefined) {
+			if ((err = hdsp_get_iobox_version(hdsp)) < 0) {
+				return err;
+			}
+		}
+		hdsp_version.io_type = hdsp->io_type;
+		hdsp_version.firmware_rev = hdsp->firmware_rev;
+		if ((err = copy_to_user((void *)arg, &hdsp_version, sizeof(hdsp_version)))) {
+		    	return -EFAULT;
+		}
+		break;
+	case SNDRV_HDSP_IOCTL_UPLOAD_FIRMWARE:
+		if (hdsp_is_9652(hdsp)) return -EINVAL;
+		/* SNDRV_HDSP_IOCTL_GET_VERSION must have been called */
+		if (hdsp->io_type == Undefined) return -EINVAL;
+
+		snd_printk("initializing firmware upload\n");
+		firmware = (hdsp_firmware_t *)arg;
+
+		if (hdsp_check_for_iobox (hdsp)) {
+			return -EIO;
+		}
+
+		if (copy_from_user(hdsp->firmware_cache, firmware->firmware_data, sizeof(unsigned long)*24413) != 0) {
+			return -EFAULT;
+		}
+		
+		hdsp->state |= HDSP_FirmwareCached;
+
+		if ((err = snd_hdsp_load_firmware_from_cache(hdsp)) < 0) {
+			return err;
+		}
+		
+		
+		if (!(hdsp->state & HDSP_InitializationComplete)) {
+			snd_hdsp_initialize_channels(hdsp);
+		
+			snd_hdsp_initialize_midi_flush(hdsp);
+	    
+			if ((err = snd_hdsp_create_alsa_devices(hdsp->card, hdsp)) < 0) {
+				snd_printk("error creating alsa devices\n");
+			    return err;
+			}
+		}
+		break;
+	case SNDRV_HDSP_IOCTL_GET_MIXER:
+		mixer = (hdsp_mixer_t *)arg;
+		if (copy_to_user(mixer->matrix, hdsp->mixer_matrix, sizeof(unsigned short)*HDSP_MATRIX_MIXER_SIZE))
+			return -EFAULT;
+		break;
+	default:
+		return -EINVAL;
+	}
+	return 0;
+}
+
 static snd_pcm_ops_t snd_hdsp_playback_ops = {
 	.open =		snd_hdsp_playback_open,
 	.close =	snd_hdsp_playback_release,
@@ -2821,6 +3860,26 @@
 	.copy =		snd_hdsp_capture_copy,
 };
 
+static int __devinit snd_hdsp_create_hwdep(snd_card_t *card,
+					   hdsp_t *hdsp)
+{
+	snd_hwdep_t *hw;
+	int err;
+	
+	if ((err = snd_hwdep_new(card, "HDSP hwdep", 0, &hw)) < 0)
+		return err;
+		
+	hdsp->hwdep = hw;
+	hw->private_data = hdsp;
+	strcpy(hw->name, "HDSP hwdep interface");
+
+	hw->ops.open = snd_hdsp_hwdep_dummy_op;
+	hw->ops.ioctl = snd_hdsp_hwdep_ioctl;
+	hw->ops.release = snd_hdsp_hwdep_dummy_op;
+		
+	return 0;
+}
+
 static int __devinit snd_hdsp_create_pcm(snd_card_t *card,
 					 hdsp_t *hdsp)
 {
@@ -2842,114 +3901,93 @@
 	return 0;
 }
 
-static int __devinit snd_hdsp_initialize_firmware (hdsp_t *hdsp)
+static inline int snd_hdsp_initialize_input_enable (hdsp_t *hdsp)
 {
 	int i;
-	u32 *firmware_ptr;
-
-	if (hdsp_check_for_iobox (hdsp)) {
-		return -EIO;
-	}
-
+	
 	if (hdsp_fifo_wait (hdsp, 0, 100)) {
 		return -EIO;
 	}
 	
-	/* enable all channels */
-
 	for (i = 0; i < HDSP_MAX_CHANNELS; ++i) {
 		hdsp_write (hdsp, HDSP_inputEnable + (4 * i), 1);
 		hdsp_write (hdsp, HDSP_outputEnable + (4 * i), 1);
 	}
+	
+	return 0;
+}
 
-	if (force_firmware[hdsp->dev] || (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
-
-		snd_printk ("loading firmware\n");
-
-		hdsp_write (hdsp, HDSP_jtagReg, HDSP_PROGRAM);
-		hdsp_write (hdsp, HDSP_fifoData, 0);
-		if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT) < 0) {
-			snd_printk ("timeout waiting for firmware setup\n");
-			return -EIO;
-		}
-
-		hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
-		hdsp_write (hdsp, HDSP_fifoData, 0);
-
-		if (hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT)) {
-			hdsp->type = Multiface;
-			hdsp_write (hdsp, HDSP_jtagReg, HDSP_VERSION_BIT);
-			hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
-			hdsp_fifo_wait (hdsp, 0, HDSP_SHORT_WAIT);
-		} else {
-			hdsp->type = Digiface;
-		} 
-
-		hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_PROGRAM);
-		hdsp_write (hdsp, HDSP_fifoData, 0);
-		
-		if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
-			snd_printk ("timeout waiting for download preparation\n");
-			return -EIO;
-		}
-		
-		hdsp_write (hdsp, HDSP_jtagReg, HDSP_S_LOAD);
-		
-		if (hdsp->type == Digiface) {
-			firmware_ptr = (u32 *) digiface_firmware;
-		} else {
-			firmware_ptr = (u32 *) multiface_firmware;
-		}
-		
-		for (i = 0; i < 24413; ++i) {
-			hdsp_write(hdsp, HDSP_fifoData, firmware_ptr[i]);
-			if (hdsp_fifo_wait (hdsp, 127, HDSP_LONG_WAIT)) {
-				snd_printk ("timeout during firmware loading\n");
-				return -EIO;
-			}
-		}
-		
-		if (hdsp_fifo_wait (hdsp, 0, HDSP_LONG_WAIT)) {
-			snd_printk ("timeout at end of firmware loading\n");
-			return -EIO;
-		}
-
-		hdsp_write (hdsp, HDSP_jtagReg, 0);
-		snd_printk ("finished firmware loading\n");
-		mdelay(3000);
-
-	} else {
-
-		/* firmware already loaded, but we need to know what type
-		   of I/O box is connected.
-		*/
-
-		if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) {
-			hdsp->type = Multiface;
-		} else {
-			hdsp->type = Digiface;
-		}
-	}
-
-	if (hdsp->type == Digiface) {
-		snd_printk ("I/O Box is a Digiface\n");
-		hdsp->card_name = "RME Hammerfall DSP (Digiface)";
+static inline void snd_hdsp_initialize_channels(hdsp_t *hdsp)
+{
+	if (hdsp->io_type == Digiface) {
+		hdsp->card_name = "RME Hammerfall DSP + Digiface";
 		hdsp->ss_channels = DIGIFACE_SS_CHANNELS;
 		hdsp->ds_channels = DIGIFACE_DS_CHANNELS;
 	} else {
-		snd_printk ("I/O Box is a Multiface\n");
-		hdsp->card_name = "RME Hammerfall DSP (Multiface)";
+		hdsp->card_name = "RME Hammerfall DSP + Multiface";
 		hdsp->ss_channels = MULTIFACE_SS_CHANNELS;
 		hdsp->ds_channels = MULTIFACE_DS_CHANNELS;
 	}
-	
+}
+
+static inline void snd_hdsp_initialize_midi_flush (hdsp_t *hdsp)
+{
 	snd_hdsp_flush_midi_input (hdsp, 0);
 	snd_hdsp_flush_midi_input (hdsp, 1);
 
 #ifdef SNDRV_BIG_ENDIAN
 	hdsp_write(hdsp, HDSP_jtagReg, HDSP_BIGENDIAN_MODE);
 #endif
+}
+
+static int __devinit snd_hdsp_create_alsa_devices(snd_card_t *card, hdsp_t *hdsp)
+{
+	int err;
+	
+	if ((err = snd_hdsp_create_pcm(card, hdsp)) < 0) {
+		return err;
+	}
+	
+	if ((err = snd_hdsp_create_midi(card, hdsp, 0)) < 0) {
+		return err;
+	}
 
+	if ((err = snd_hdsp_create_midi(card, hdsp, 1)) < 0) {
+		return err;
+	}
+
+	if ((err = snd_hdsp_create_controls(card, hdsp)) < 0) {
+		return err;
+	}
+
+	snd_hdsp_proc_init(hdsp);
+
+	hdsp->last_spdif_sample_rate = -1;
+	hdsp->system_sample_rate = -1;
+	hdsp->last_external_sample_rate = -1;
+	hdsp->last_internal_sample_rate = -1;
+	hdsp->playback_pid = -1;
+	hdsp->capture_pid = -1;
+	hdsp->capture_substream = NULL;
+	hdsp->playback_substream = NULL;
+
+	if ((err = snd_hdsp_set_defaults(hdsp)) < 0) {
+		return err;
+	}
+	
+	hdsp_update_simple_mixer_controls(hdsp);
+	
+	if (!(hdsp->state & HDSP_InitializationComplete)) {
+		sprintf(card->longname, "%s at 0x%lx, irq %d", hdsp->card_name, 
+			hdsp->port, hdsp->irq);
+	    
+		if ((err = snd_card_register(card)) < 0) {
+			snd_printk("error registering card\n");
+			return err;
+		}
+		hdsp->state |= HDSP_InitializationComplete;
+	}
+	
 	return 0;
 }
 
@@ -2959,9 +3997,10 @@
 {
 	struct pci_dev *pci = hdsp->pci;
 	int err;
-	unsigned short rev;
+	int i;
 
 	hdsp->irq = -1;
+	hdsp->state = 0;
 	hdsp->midi[0].rmidi = 0;
 	hdsp->midi[1].rmidi = 0;
 	hdsp->midi[0].input = 0;
@@ -2972,23 +4011,30 @@
 	spin_lock_init(&hdsp->midi[1].lock);
 	hdsp->iobase = 0;
 	hdsp->res_port = 0;
+	hdsp->io_type = Undefined;
+	for (i = 0; i < HDSP_MAX_CHANNELS; ++i)
+		hdsp->playback_mixer_ctls[i] = 0;
 
 	hdsp->card = card;
 	
 	spin_lock_init(&hdsp->lock);
 
-	pci_read_config_word(hdsp->pci, PCI_CLASS_REVISION, &rev);
+	tasklet_init(&hdsp->midi_tasklet, hdsp_midi_tasklet, (unsigned long)hdsp);
+	
+	pci_read_config_word(hdsp->pci, PCI_CLASS_REVISION, &hdsp->firmware_rev);
 	strcpy(card->driver, "H-DSP");
 	strcpy(card->mixername, "Xilinx FPGA");
 	
-	switch (rev & 0xff) {
+	switch (hdsp->firmware_rev & 0xff) {
 	case 0xa:
 	case 0xb:
-	case 0x64:
-		/* hdsp_initialize_firmware() will reset this */
 		hdsp->card_name = "RME Hammerfall DSP";
 		break;
-
+	case 0x64:
+	case 0x65:
+	case 0x68:
+		hdsp->card_name = "RME HDSP 9652";
+		break;
 	default:
 		return -ENODEV;
 	}
@@ -3021,39 +4067,72 @@
 	if ((err = snd_hdsp_initialize_memory(hdsp)) < 0) {
 		return err;
 	}
+	
+	if (hdsp_is_9652(hdsp)) {
+		
+		if ((err = snd_hdsp_initialize_input_enable(hdsp)) != 0) {
+			return err;
+		}
 
-	if ((err = snd_hdsp_initialize_firmware(hdsp)) < 0) {
-		return err;
-	}
+		hdsp->io_type = Digiface;		
+	
+		hdsp->ss_channels = DIGIFACE_SS_CHANNELS;
+		hdsp->ds_channels = DIGIFACE_DS_CHANNELS;
+	
+		snd_hdsp_initialize_midi_flush(hdsp);
+	
+		if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) {
+			return err;
+		}
 
-	if ((err = snd_hdsp_create_pcm(card, hdsp)) < 0) {
-		return err;
-	}
+	} else {
+	
+		if (hdsp_check_for_iobox (hdsp)) {
+			/* no iobox connected, we defer initialization */
+			snd_printk("card initialization pending : waiting for firmware\n");
+			if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) {
+				return err;
+			}
+			return 0;
+		}
 
-	if ((err = snd_hdsp_create_midi(card, hdsp, 0)) < 0) {
-		return err;
-	}
+		if ((err = snd_hdsp_initialize_input_enable(hdsp)) != 0) {
+			return err;
+		}
+		
+		if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
+			snd_printk("card initialization pending : waiting for firmware\n");
+			if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) {
+				return err;
+			}
+		return 0;
+		} 
+		
+		snd_printk("Firmware already loaded, initializing card.\n");
 
-	if ((err = snd_hdsp_create_midi(card, hdsp, 1)) < 0) {
-		return err;
+		if (hdsp_read(hdsp, HDSP_status2Register) & HDSP_version1) {
+			hdsp->io_type = Multiface;
+		} else {
+			hdsp->io_type = Digiface;
+		}
+		
+		if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) {
+			return err;
+		}
+		
+		snd_hdsp_initialize_channels(hdsp);
+		
+		snd_hdsp_initialize_midi_flush(hdsp);
+		
 	}
-
-	if ((err = snd_hdsp_create_controls(card, hdsp)) < 0) {
+	
+	hdsp->state |= HDSP_FirmwareLoaded;	
+	
+	if ((err = snd_hdsp_create_alsa_devices(card, hdsp)) < 0) {
 		return err;
 	}
-
-	snd_hdsp_proc_init(hdsp);
-
-	hdsp->last_spdif_sample_rate = -1;
-	hdsp->last_adat_sample_rate = -1;
-	hdsp->playback_pid = -1;
-	hdsp->capture_pid = -1;
-	hdsp->capture_substream = NULL;
-	hdsp->playback_substream = NULL;
-
-	snd_hdsp_set_defaults(hdsp);
-
-	return 0;
+	
+	return 0;	
 }
 
 static int snd_hdsp_free(hdsp_t *hdsp)
@@ -3136,10 +4215,10 @@
 }
 
 static struct pci_driver driver = {
-	.name	  = "RME Hammerfall DSP",
+	.name =     "RME Hammerfall DSP",
 	.id_table = snd_hdsp_ids,
-	.probe	  = snd_hdsp_probe,
-	.remove	  = __devexit_p(snd_hdsp_remove),
+	.probe =    snd_hdsp_probe,
+	.remove = __devexit_p(snd_hdsp_remove),
 };
 
 static int __init alsa_card_hdsp_init(void)
diff -Nru a/sound/pci/rme9652/multiface_firmware.dat b/sound/pci/rme9652/multiface_firmware.dat
--- a/sound/pci/rme9652/multiface_firmware.dat	Sat Apr 19 19:51:46 2003
+++ /dev/null	Wed Dec 31 16:00:00 1969
@@ -1,4072 +0,0 @@
-/* stored in little-endian */
-static u32 multiface_firmware[24413] __devinitdata = {
-0xffffffff, 0x66aa9955, 0x8001000c, 0xe0000000, 0x8006800c, 0xb0000000,
-0x8004800c, 0xb4fc0100, 0x8003000c, 0x00000000, 0x8001000c, 0x90000000,
-0x8004000c, 0x00000000, 0x8001000c, 0x80000000, 0x0002000c, 0x581a000a,
-0x00044800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00800000,
-0x00000120, 0x00000000, 0x00044800, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x04800000, 0x00000120, 0x00000000, 0x00024001, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000,
-0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000100, 0x00000000, 0x00004004, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000900, 0x00000000, 0x0000c004, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000320, 0x00000000,
-0x00004801, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000120, 0x00000000, 0x038048fa, 0x38000e00, 0x8014e001, 0x012e0053,
-0x15c00538, 0x9e006f80, 0xe0027800, 0x00078001, 0x0070009e, 0x6f0001c0,
-0x70009e00, 0xf811c000, 0x00000123, 0x00000000, 0x023fa003, 0x0bfe08ff,
-0x0fe003b0, 0xfc403723, 0xc00f3008, 0x00ff0034, 0x0f3003fc, 0xbf003e80,
-0xf003cc00, 0x003ec00f, 0x03fc20ff, 0x0fc407b0, 0x00000e00, 0x00000000,
-0x00370801, 0x9b74021d, 0x87440510, 0x2c4099a1, 0x40091400, 0x801d0804,
-0x01108074, 0x1d000448, 0xd0004400, 0x20064001, 0x0074001d, 0x07400910,
-0x00000c20, 0x00000000, 0x0033a011, 0x0834260d, 0x83440091, 0x34004d29,
-0x40041011, 0x000d2000, 0x00108034, 0x05080042, 0xd1002400, 0x00034000,
-0x0014000d, 0x47400800, 0x00000e80, 0x00000000, 0x0035a803, 0x0174001d,
-0x37400591, 0x0420d900, 0x440d1001, 0xc81d0004, 0x80170074, 0x1d310450,
-0xd0006400, 0x08074001, 0x1874001d, 0x0f400900, 0x00000620, 0x00000000,
-0x0037a802, 0x127400df, 0x474011b0, 0x748b1f02, 0xc0013062, 0x011f0484,
-0x1132307c, 0x5f00c6c0, 0xf00c6c22, 0x00c7c031, 0x0c7c031f, 0x0b4011a0,
-0x00000e20, 0x00000000, 0x003d8007, 0x02f8043f, 0x2fc09370, 0xfc80bf00,
-0xc00ff006, 0x11fe013f, 0x0fe003f4, 0xff003fc0, 0xf00f5500, 0x20fec83f,
-0x87fc03ff, 0x1fc02df4, 0x00000600, 0x00000000, 0x00750802, 0x805c021f,
-0x170029f0, 0x4c005f08, 0xc00d300b, 0x00df2037, 0x6df0034c, 0xdf0837c0,
-0x008b7c02, 0x00b7c0ad, 0x0b7c04df, 0x0ac00df1, 0x00000420, 0x00000000,
-0x02b4a013, 0x1144001d, 0x7740a9d0, 0x4500dd00, 0x447db083, 0x13dd0077,
-0x4dd02f44, 0xd9113740, 0x50477405, 0x0137400d, 0x037403dd, 0x4d404d90,
-0x00000200, 0x00000000, 0x0032a007, 0x115490cd, 0x43000890, 0x0400c900,
-0x431d1080, 0x210d1143, 0x20d08c45, 0x1d0c8242, 0x10903413, 0x0cc34320,
-0xc8742b0d, 0x1c4320d0, 0x00000a00, 0x00000000, 0x00788004, 0x2584010d,
-0x5a605ed0, 0x8401ed08, 0x409a9007, 0x09ed057b, 0x9ed01794, 0xa9027a40,
-0x5007b401, 0x007b401e, 0x57b401ed, 0x11401e90, 0x00000200, 0x00000000,
-0x02301012, 0x001c10cd, 0x03e208f0, 0x0c0ecf04, 0xc0043800, 0xe0df8173,
-0x2cf0670c, 0x8f00b3c0, 0x33233c00, 0x0033c00c, 0x033c00cf, 0x48cc0cf0,
-0x00000040, 0x00000000, 0x003db802, 0x01f600ff, 0x3fe84fe0, 0xfc08ef00,
-0xc00ff183, 0x80ff023f, 0x0ff113ec, 0xb80037c2, 0xf083fc00, 0x003fc80f,
-0x93fc00ff, 0x09c01ff0, 0x00000660, 0x00000000, 0x0037a015, 0x827c01df,
-0x14c005b0, 0x5c20df01, 0xc401b000, 0x00130004, 0x0132044c, 0x53280448,
-0xb0807c00, 0x0004c001, 0x004c0013, 0x57c00130, 0x00000e00, 0x00000000,
-0x08398012, 0x02b4002d, 0x38400600, 0xb400ed04, 0xce0e1903, 0x40eb503e,
-0x0eb103ac, 0xeb003ac4, 0xb103b440, 0x103ac40e, 0x03ac40eb, 0x4b000eb1,
-0x00000620, 0x00000000, 0x00790003, 0x02b4a0ed, 0x5a403e11, 0x9601ed00,
-0x401c9004, 0x01c50478, 0x1c910704, 0xe1087040, 0xd0479601, 0x1070401c,
-0x470461c5, 0x0f021e18, 0x00000400, 0x00000000, 0x00372812, 0x833600cd,
-0xb2403d10, 0x7440cd00, 0x484f1003, 0x80e0007a, 0x6f902ba4, 0xe980ba08,
-0x5013b64d, 0x013a400e, 0x13a400ed, 0x4b401e99, 0x00000c20, 0x00000000,
-0x0015a817, 0x15fce07f, 0x96d807b3, 0xdc007f03, 0xc045b029, 0x98542a14,
-0x45b02d4c, 0x5301d480, 0xd20d7c00, 0x0094c455, 0x014c4b57, 0x5fc11730,
-0x00000620, 0x00000000, 0x10070012, 0x407c201f, 0x85c061f0, 0x7c001f00,
-0xc803f280, 0x403f008f, 0x23f008fc, 0x3f248fc0, 0xb008fc02, 0x128fcc03,
-0x08fc8a3b, 0x4bc003f0, 0x00000c00, 0x00000000, 0x00a70810, 0x020c0083,
-0x74c05978, 0x4c819f01, 0xd0093082, 0x01934164, 0x19f08e4d, 0x934065c0,
-0x34164d09, 0x4064d129, 0x26510593, 0x43c01935, 0x00000c20, 0x00000000,
-0x50262001, 0x06440090, 0xa4504918, 0x45028d00, 0xe229b002, 0xa2970926,
-0x09d00e44, 0x91002446, 0x101e6c40, 0x00e44039, 0x1244e091, 0x06403910,
-0x00000800, 0x00000000, 0x0024a018, 0x524480d0, 0xa4600d50, 0x44089d00,
-0x00891002, 0x18e11028, 0x8bd082c4, 0xe10a2844, 0x10838410, 0x0238400e,
-0x028420e1, 0x63418b10, 0x00000200, 0x00000000, 0x02302810, 0x0a040281,
-0x20408810, 0x04008d82, 0x402e9422, 0x42a920a8, 0x2ad00b84, 0xa100a840,
-0x100aa402, 0x00a8402e, 0x0a8402a1, 0x43400a10, 0x00000080, 0x00000000,
-0x0886a01d, 0x00042011, 0x84c16050, 0x0c005f05, 0x40013008, 0x00130004,
-0x05f0004c, 0x130015c0, 0x30004c00, 0x0014c001, 0x005c0053, 0x77c00330,
-0x00000ac0, 0x00000000, 0x0127a819, 0x0afc02ff, 0x27c04bf0, 0xfe00bf01,
-0xc029f092, 0x829700a7, 0x29f00a7c, 0xdf00a790, 0xf08b5c02, 0x00a7c02d,
-0x0a7c829f, 0x66c029f0, 0x00000e60, 0x00000000, 0x00afa018, 0x32fc0cbf,
-0x27c00bb0, 0xfc00bf02, 0xc009b002, 0x049f0024, 0x49341a7c, 0x9f01a7e4,
-0x059a7c0c, 0x41a4d069, 0x0a7c8493, 0x63c009d0, 0x00000e00, 0x00000000,
-0x2007081c, 0x3874ae0d, 0x07490130, 0x74001d02, 0x44011000, 0xa01d2204,
-0x45120074, 0x1d2297e4, 0x10987404, 0x00844821, 0x08748e51, 0x734027d2,
-0x00000c20, 0x00000000, 0x0023a010, 0x0236808d, 0x23408810, 0x34008d00,
-0x41ca9002, 0x1cad0d28, 0x2a180a94, 0xad002b41, 0x111ab682, 0x11a8406a,
-0x0ab430a5, 0x43402ad1, 0x00000e80, 0x00000000, 0x8025a818, 0x0274009d,
-0x27400998, 0x74209d00, 0x4aa81292, 0x90fd242c, 0x0f101bb4, 0xfd0a2d42,
-0x1002f620, 0x01ac400b, 0x82f400b5, 0x63408bd9, 0x00000620, 0x00000000,
-0x0027a805, 0x127c009f, 0x27c24938, 0x74009f11, 0xc029b802, 0x009f2024,
-0x1932067c, 0x9f002740, 0x31027c00, 0x00244409, 0x627c0897, 0x17c039f0,
-0x00000e20, 0x00000000, 0x00258014, 0x0e7c039f, 0x77c00970, 0x7c099f21,
-0xd809f002, 0x089b0267, 0x49f0466c, 0x9f0827c0, 0xf00a7802, 0x0427c039,
-0x027c019b, 0x53c019f2, 0x00000600, 0x00000000, 0x00050814, 0x48140617,
-0x84c02170, 0x7c001f02, 0xc8233000, 0x0432238f, 0x03e028fc, 0x33100fc0,
-0xf000fc10, 0x000fc723, 0x00cc123f, 0x53c023f0, 0x00000420, 0x00000000,
-0x005c8014, 0x09c4077d, 0x14401770, 0xf6207d08, 0xc0051061, 0x025500d5,
-0x15d0015c, 0x530095c5, 0xd0817420, 0x00974005, 0x8144805d, 0x534005d0,
-0x00000200, 0x00000000, 0x0072a014, 0x033401cd, 0xb0689c50, 0x7600cd21,
-0x410e100f, 0x03e1003b, 0x4ed003b4, 0xe94c7a40, 0x9033f400, 0x08ff401f,
-0x638500ed, 0x53421ed0, 0x00000a00, 0x00000000, 0x04088005, 0x04a4012d,
-0x38401450, 0xf400ed80, 0x400e1803, 0x02e51079, 0x0ed003b4, 0xe100f940,
-0x9003b440, 0x00bb402e, 0x838411ed, 0x17402ed0, 0x00000200, 0x00000000,
-0x00781015, 0x01b421e7, 0x78501e70, 0xb401ef02, 0xc81e1007, 0x01e38073,
-0x1ef007bc, 0xeb187fe4, 0xf007bc01, 0x187bc61e, 0x878c01ff, 0x57ce1ef0,
-0x00000040, 0x00000000, 0x0035b810, 0x015c201f, 0xa7c80df1, 0x3400df01,
-0xc201e503, 0x001f0807, 0x01f0805c, 0x5f0807c0, 0xf0007c20, 0x0007c201,
-0x807c001f, 0x43c001f1, 0x00000660, 0x00000000, 0x807fb000, 0x27fc09f3,
-0x5cc05ff1, 0xcc01f308, 0xc41f3804, 0x29f3007c, 0x1f3007cc, 0xf5007cc0,
-0x30a7cc01, 0x027c089f, 0x27c08df3, 0x00c09f30, 0x00000e00, 0x00000000,
-0x02098015, 0x02b40ea1, 0xd840f6d1, 0xac00e120, 0xc0d61004, 0x01eb02ba,
-0x8eb2232c, 0xeb223ac5, 0xb003ac2d, 0x223ac48e, 0x63ac8ceb, 0x56c08eb1,
-0x00000620, 0x00000000, 0x00290000, 0x41b480e1, 0x106008d1, 0xc400f900,
-0x404c1010, 0x0cc9003a, 0x0c104304, 0xc1003240, 0x124304ac, 0x1030408c,
-0x83061cc1, 0x00411c13, 0x00000400, 0x00000000, 0x00232804, 0x07345b91,
-0xc05808d0, 0x2402c903, 0x40d8120c, 0x020d2802, 0x10904c24, 0x49004242,
-0x98082413, 0x12022010, 0x00264209, 0x12400098, 0x00000c20, 0x00000000,
-0x00358815, 0x067c0113, 0x74c019f0, 0x4c00cb40, 0xc83d10a0, 0x01d90876,
-0x1d310f4c, 0x9308b682, 0x300b4c10, 0x00f4c02d, 0x0f4c03d3, 0x54c02d30,
-0x00000620, 0x00000000, 0x00870001, 0x007c001f, 0x37c0a1f0, 0x7c06d700,
-0xc00df228, 0x0cdb03b7, 0x2df0037c, 0x9f1337c1, 0xf0037c02, 0x0137c4ed,
-0x437c80df, 0x07c04df0, 0x00000c00, 0x00000000, 0x081f0880, 0x00dc003f,
-0x5fc057f0, 0xec253300, 0xc05bf004, 0x05ff0135, 0x9ff00bfc, 0xaf017fc0,
-0xf0c7cc01, 0x013f009f, 0x23fc14ff, 0x03c08ff0, 0x00000c22, 0x00000000,
-0x24962081, 0x05440b1d, 0x474025b0, 0x55841100, 0x4405d148, 0x001d0047,
-0x31f10074, 0x1d110748, 0xd1005401, 0x04874821, 0x1874521d, 0x074001d2,
-0x00000802, 0x00000000, 0x0034a001, 0x1274005d, 0x034009d0, 0x4400d182,
-0x400dd023, 0x20150007, 0x01d80074, 0x1d000740, 0xd0184428, 0x20074821,
-0x0074001d, 0x074009d1, 0x00000200, 0x00000000, 0x00002010, 0x820400cd,
-0x034040d0, 0x0420d190, 0x4444d013, 0x240d1003, 0x00d80834, 0x0d000340,
-0xd0001400, 0x00024000, 0x0034000d, 0x434408c0, 0x00000080, 0x00000000,
-0x0002a000, 0x005c005f, 0x47c051f0, 0x4c001140, 0xc359f857, 0x55170805,
-0x01f0007c, 0x1f1007c2, 0xf0004c25, 0x2007c201, 0x807c001f, 0x03c409e0,
-0x00000ac0, 0x00000000, 0x000fa805, 0x03fc00ff, 0x07c08130, 0x3c002f02,
-0xc00df003, 0x40df057f, 0x0f7007fc, 0x9f003fc0, 0xf003fc02, 0x003fc80f,
-0x03fc80ff, 0x17c007f0, 0x00000e60, 0x00000000, 0x820f8003, 0x20fc00ff,
-0x04e00dd0, 0x5c04ff00, 0xc00d3000, 0x00df0034, 0x0f3003cc, 0xd30034c0,
-0x3003dc00, 0x003cc00f, 0x03cc00f3, 0x0cc00f30, 0x00000e00, 0x00000000,
-0x02070801, 0x187400dd, 0x8444add0, 0x4508dd00, 0x40017010, 0x401d0004,
-0x01100044, 0x11000440, 0x10007440, 0x20044001, 0x00440011, 0x04400111,
-0x00000c20, 0x00000000, 0x0023a011, 0x183400cd, 0x834000d0, 0x2400cd00,
-0x50001842, 0x00cd0030, 0x08940315, 0x81401050, 0x57031400, 0x4032500c,
-0x020500c1, 0x44500c14, 0x00000e80, 0x00000000, 0x8525a803, 0x237440dd,
-0x875001d0, 0x2408dd00, 0x600d5202, 0x040d0004, 0x04920034, 0x51002040,
-0x58003400, 0x00024000, 0x01440001, 0x0c400090, 0x00000620, 0x00000000,
-0x10878802, 0x0c7480dd, 0xc74201f0, 0x64611f00, 0xc00d3061, 0x205f3924,
-0x05b1015c, 0x530234c0, 0x70005c00, 0x08064801, 0x01440013, 0x08c00130,
-0x00000e20, 0x00000000, 0x040d8007, 0x45fc80fd, 0x1c4000f0, 0xcc113f31,
-0xc901f205, 0x41bf201f, 0x0b7026cc, 0xbf000fc0, 0xb003fc00, 0x003dc00f,
-0x02fc00fe, 0x1fc00f60, 0x00000600, 0x00000000, 0x00950802, 0x087c20d7,
-0x96c00df0, 0x7c420f20, 0xc481b00b, 0x185f0024, 0x01f0214c, 0x1f0017c3,
-0x70407c00, 0x0205c081, 0x207c081f, 0x0bc081f0, 0x00000420, 0x00000000,
-0x00d4a013, 0x0f7404dc, 0x56c01dd1, 0x5c831d04, 0x402d1403, 0x439d01d4,
-0x1dd00645, 0xdd04a744, 0xd04b7407, 0x0274509d, 0x277409dd, 0x4f409dd0,
-0x00000200, 0x00000000, 0x00d2a007, 0x003446cc, 0x42490cda, 0x30010d20,
-0x422d1000, 0x008d0c12, 0xacd04204, 0xcd046340, 0x40873410, 0x00b0402c,
-0x0b7402cd, 0x1f402cd0, 0x00000a00, 0x00000000, 0x8c588004, 0x44b441ed,
-0x5a609ed1, 0xb4092d00, 0x44121824, 0x414d116a, 0x12d11584, 0x2d115b42,
-0xd114b441, 0x10484410, 0x04b6412d, 0x124012d1, 0x00000200, 0x00000000,
-0x90301012, 0x3b3c08cf, 0x72c150f0, 0x3c170f01, 0xd0103905, 0xa98f2952,
-0xd8f0160c, 0x8f0243c0, 0x70033c01, 0x0031c08c, 0x223c60cf, 0x4bc00cf0,
-0x00000040, 0x00000000, 0x023db802, 0x23fc80ff, 0x3f8083f0, 0x9c003f02,
-0xc00f7021, 0x007f022d, 0x05f121fc, 0x5f2037c0, 0xf1107c40, 0x000fc003,
-0x01fc403f, 0x0bc013f0, 0x00000660, 0x00000000, 0x2027a015, 0x097c80db,
-0x60c011f0, 0x2c20d101, 0xc00d2006, 0x001f0004, 0x05f0007c, 0x5f002700,
-0x30047c00, 0x0007c001, 0x017c001f, 0x57c001f0, 0x00000e00, 0x00000000,
-0x98298812, 0x41bc00e1, 0x38c00270, 0x8500e104, 0x44021202, 0x00ed1038,
-0x0ad003b4, 0xad001b40, 0x10032400, 0x003b400e, 0x02b400ed, 0x4b400ed0,
-0x00000620, 0x00000000, 0x04700003, 0x87b401e5, 0x7b601ed8, 0x8431c900,
-0x40109007, 0x012d004a, 0x12d084b4, 0x2d104b64, 0x1204b601, 0x004b6012,
-0x84b4012d, 0x0f4012d0, 0x00000400, 0x00000000, 0xa0f30812, 0x2714a0c5,
-0xb1407c5a, 0x2440c902, 0x700c9547, 0x92cd0874, 0x6cd04b34, 0xcd003340,
-0x146b3412, 0x0cf3413c, 0x4b3413cd, 0x4b41acd0, 0x00000c20, 0x00000000,
-0x40dda817, 0x0174c057, 0x554017d1, 0xcc007b20, 0xc0059805, 0xc25d0054,
-0x25f1897c, 0x5f0017c0, 0x300d7402, 0x01d7c075, 0x097c075f, 0x5fc035f0,
-0x00000620, 0x00000000, 0x10070012, 0x087e001b, 0x04c08170, 0x5c000701,
-0xc0037020, 0x023f228f, 0x22f008fc, 0x3f100f40, 0xf000ec02, 0x008fc023,
-0x08fc023f, 0x4bc023f0, 0x00000c00, 0x00000000, 0x04e70810, 0x077c009b,
-0x37c08960, 0x4d109f00, 0xc008f002, 0x00930024, 0x0970027c, 0x9f0824c0,
-0xf0027c80, 0x0027c009, 0x027c009f, 0x43c009f0, 0x00000c20, 0x00000000,
-0x00662001, 0x0e5c0891, 0x274439d0, 0x44489d00, 0x5409d002, 0x029140a4,
-0x29d10a74, 0x9d0024d0, 0xd1027402, 0x10a5c429, 0x0a74a29d, 0x074029d0,
-0x00000800, 0x00000000, 0x0020a018, 0x1a548090, 0x256009d0, 0x46009d80,
-0x4019d802, 0x00b8802c, 0x0bd002f4, 0xbd802c60, 0xd002f600, 0x002f400b,
-0x02f400bd, 0x63400bd0, 0x00000200, 0x00000000, 0x42202010, 0x22344881,
-0x23420cd0, 0x06008d80, 0x403ad022, 0x02e180b8, 0x2ed00bb4, 0xed80a860,
-0xd00ab402, 0x00b9402e, 0x0bb402ed, 0x43402ed0, 0x00000080, 0x00000000,
-0x0586b01d, 0x585c8213, 0x05c141f8, 0x44141f05, 0xc001f008, 0x80132004,
-0x01700074, 0x1f0014c0, 0xf0007c00, 0x0007c001, 0x007c001f, 0x77c003f0,
-0x00000ac0, 0x00000000, 0x012fb819, 0x125c849f, 0x37c00af0, 0xfc00bf00,
-0xc029f112, 0x029f10a7, 0x29d00a7c, 0x9f00b5c0, 0xf00a7c82, 0x00a5c029,
-0x0a7c029f, 0x67c009f0, 0x00000e60, 0x00000000, 0x01afa818, 0x826c08bf,
-0x2fc00bf8, 0x8c20af00, 0xc149700a, 0x28930024, 0xc9320a4c, 0x9300a705,
-0x30326c06, 0x00254089, 0x0a4c0093, 0x60c02930, 0x00000e00, 0x00000000,
-0x1187081c, 0x2836800d, 0x044001d0, 0x6c001d00, 0x4461b000, 0x04154104,
-0x61140045, 0x11008640, 0x1028444e, 0x00874021, 0x00451611, 0x70400310,
-0x00000c20, 0x00000000, 0x0323a010, 0x5224048d, 0xa16008d2, 0x66008d20,
-0x411ad202, 0x02ad04a8, 0x0a109a84, 0xa9c1a940, 0x14128500, 0x45a9406a,
-0x0a8422a1, 0x40504a14, 0x00000e80, 0x00000000, 0x0525a818, 0x4274009d,
-0x244109d0, 0x44009c00, 0x42191302, 0x20b1082c, 0x0b1002c4, 0xb1002e04,
-0x5802e480, 0x002f400b, 0x02c400b1, 0x60400b10, 0x00000620, 0x00000000,
-0x00278005, 0x0e64009f, 0xa54009d0, 0x44009e10, 0xd409c012, 0x00938024,
-0x1930024c, 0x9300a780, 0x30824c00, 0x0025c209, 0x024c0093, 0x14c00930,
-0x00000e20, 0x00000000, 0x00258014, 0x277c009f, 0xe5c099f0, 0x7d308f00,
-0xc009f00e, 0x408f1023, 0x39f1027c, 0x8f1026c0, 0xb0c21c04, 0x0027c009,
-0x123c408f, 0x53c009f0, 0x00000600, 0x00000000, 0x00850014, 0x884c101f,
-0x86c46070, 0x6c00131a, 0xc0023000, 0x0033000c, 0x033000cc, 0x33108fc0,
-0x3000cc00, 0x080cc003, 0x00fc003f, 0x53c003f0, 0x00000420, 0x00000000,
-0x021ca014, 0x0140807d, 0x14c01750, 0x04827140, 0x50051001, 0x00514814,
-0x05140145, 0x51e01744, 0x16094500, 0x00145005, 0x0174005d, 0x534007d0,
-0x00000200, 0x00000000, 0x80b2a014, 0x470402cd, 0x30403c90, 0x260ac500,
-0x400cd002, 0x00c10230, 0x0c900354, 0xc1123740, 0x10230420, 0x0034400c,
-0x033608cd, 0x53400dd0, 0x00000a00, 0x00000000, 0x00388005, 0x478401ed,
-0x78410e10, 0xc4006500, 0x40005012, 0x20218008, 0x02108094, 0x21000340,
-0x91008400, 0x00084210, 0x80b4a02d, 0x174002d0, 0x00000200, 0x00000000,
-0x90781015, 0x478c21af, 0x70d01474, 0xac81e700, 0xc012f136, 0x41733050,
-0x1630051e, 0x42005bc0, 0x3007cc01, 0x0058c016, 0x05bc016f, 0x57c016f0,
-0x00000040, 0x00000000, 0x2025b810, 0x007da0df, 0x37e20d70, 0x4c805b20,
-0xc80db01a, 0x009d0027, 0x09f0026c, 0x970027c8, 0x72007c80, 0x2027c009,
-0x027c009f, 0x43c009f0, 0x00000660, 0x00000000, 0x007fa000, 0x05cd0d73,
-0x64c01f71, 0xce01df00, 0xd01f7066, 0x01d24b64, 0x1f3427fc, 0xf3426ed0,
-0xf104dd89, 0x407c909f, 0x07cd09b3, 0x03c01f34, 0x00000e00, 0x00000000,
-0x02198815, 0x11840871, 0x6a805610, 0xc60d4d05, 0x40821006, 0x892b0358,
-0x91102424, 0x31005841, 0x90178409, 0x020840c3, 0x20840861, 0x57408210,
-0x00000620, 0x00000000, 0x00310000, 0x01060421, 0x28404410, 0x8404ed03,
-0x40025582, 0x40610008, 0x061011b4, 0x61010060, 0xd0108404, 0x00104406,
-0x01841001, 0x03401610, 0x00000400, 0x00000000, 0x00072804, 0x00040041,
-0x60400010, 0x04004d80, 0x401c1002, 0x13810070, 0x28100e24, 0x8104f040,
-0x9a4f0402, 0x04e04138, 0x4e0413d1, 0x13413810, 0x00000c20, 0x00000000,
-0x00058815, 0x6344c0d1, 0x34520c1d, 0xc500cf10, 0xc03d7002, 0xb29110f4,
-0x99324a7c, 0x9104b6c2, 0xf04b4411, 0x04a4c129, 0x4a4c43d3, 0x57c12930,
-0x00000620, 0x00000000, 0x00370001, 0x037c001f, 0x27c00d30, 0x7c02df00,
-0xc0c1f102, 0x005f0307, 0x05f2016c, 0x5f0007c0, 0xb0006c80, 0x0017c005,
-0x013c001f, 0x07c005f0, 0x00000c00, 0x00000000, 0x00cf0880, 0x23fc01b3,
-0xfcc007f0, 0xcc03df00, 0xc002f002, 0x403f001c, 0x12f04474, 0x3f001cc0,
-0xf003cc11, 0x004bc013, 0x04cc0073, 0x03c01330, 0x00000c22, 0x00000000,
-0x04e62081, 0x00740315, 0x65400d71, 0x7c13dd00, 0x400dd002, 0x89dd2024,
-0x1dd00774, 0xdd002450, 0xd0004580, 0x1077400d, 0x07440091, 0x07401d14,
-0x00000802, 0x00000000, 0x0804a001, 0x00740ad0, 0x34400dd1, 0x44005d00,
-0x400dd002, 0x009c0024, 0x49d01274, 0x8d002440, 0xd1004404, 0x41274049,
-0x12440091, 0x07404910, 0x00000200, 0x00000000, 0x00102210, 0x00240001,
-0x214044d0, 0x24064900, 0x5220d002, 0x004d0110, 0x04d00134, 0x4d111040,
-0xd0030400, 0x00134004, 0x01040041, 0x43400410, 0x00000080, 0x00000000,
-0x4006b000, 0x007c8093, 0x74c235f8, 0xcc375f21, 0xc020f03e, 0x0b1f0340,
-0xf1f23c7c, 0x1f02c4c0, 0xf0144c07, 0x0007c001, 0x000d0013, 0x03c00130,
-0x00000ac0, 0x00000000, 0x000f9805, 0x00fc003f, 0xefc1d178, 0x7e053f04,
-0xc01ff00e, 0x09ff0b7f, 0x9df0377c, 0xdf027740, 0xf0237c17, 0x003fc00f,
-0x03fc20ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x000fa003, 0x20e804ff,
-0x0fc083f0, 0xec263c08, 0xc20fb053, 0x00f3003e, 0x0f3003cc, 0xb3003fc0,
-0x3003ec80, 0x083ec00f, 0x83ec20ff, 0x0cc007f0, 0x00000e00, 0x00000000,
-0x02070801, 0x2844369d, 0x274a81d0, 0x44c61d00, 0x4009100b, 0x00110004,
-0x01140045, 0x11000740, 0x10004400, 0x00044601, 0x0045001d, 0x07c809d1,
-0x00000c20, 0x00000000, 0x0013a011, 0x122408cd, 0x01604451, 0x04020d00,
-0x50049003, 0x00014800, 0x00808014, 0x01480340, 0x16000500, 0x20005800,
-0x0004800d, 0x446408d1, 0x00000e80, 0x00000000, 0x0055a803, 0x0466408d,
-0x07400dd0, 0x44201d21, 0x440c1013, 0x08110004, 0x41902014, 0x01000340,
-0x10004410, 0x00044081, 0x0064101d, 0x0f4009d1, 0x00000620, 0x00000000,
-0x0007a802, 0x0c6c095f, 0x07c041f0, 0x6d001f00, 0xc04db007, 0x231304c6,
-0x01b0145c, 0x530307c0, 0x30186c00, 0x0006c051, 0x086c001f, 0x00c401f3,
-0x00000e20, 0x00000000, 0x000d8007, 0x005c003f, 0x67c007f0, 0xbc057f08,
-0xc05bf107, 0x01ff027f, 0x1f6007e4, 0xff103fc0, 0xf227fc00, 0x017fc00f,
-0x27dc05fb, 0x1e403ef0, 0x00000602, 0x00000000, 0x00a50802, 0x0a7c00df,
-0x35c00170, 0x7c104300, 0xc125f063, 0x40df2834, 0x2df08b7c, 0xdf00b7c0,
-0xf00b7c02, 0x00b7c02d, 0x0b7c1ac3, 0x0bc20df0, 0x00000420, 0x00000000,
-0x1464a013, 0x1044009d, 0xf7400d10, 0x74025101, 0x445db007, 0x26dd01f4,
-0x2dd00b74, 0xdd02b741, 0xd20b7487, 0x60b7492d, 0x4b7481d1, 0x4f41add0,
-0x00000200, 0x00000000, 0x0022a007, 0x0214060d, 0xd2680810, 0x24030104,
-0x4030100b, 0x111d1404, 0x10d06434, 0x0d22c245, 0x90646410, 0x06434111,
-0x44240209, 0x1f4810d0, 0x00000a00, 0x00000000, 0x00688004, 0x0684212d,
-0x7b409214, 0xb4116100, 0x501c9807, 0x81ed0878, 0x9ed087b4, 0xad007b42,
-0x9007b421, 0x0073401e, 0x07b421e9, 0x1b401ed0, 0x00000200, 0x00000000,
-0x82301012, 0x221c0a5d, 0x43e08c70, 0x7c8c4340, 0xe88c7403, 0x02cf3230,
-0x0cf0033c, 0x8f0133c0, 0xf0233c00, 0x0233c00c, 0x233c00cb, 0x4bc08cf0,
-0x00000040, 0x00000000, 0x083db802, 0x23dc007f, 0x0fce8ff0, 0xfc0a7f00,
-0xc60ff003, 0x00ff023f, 0x0ff803fe, 0xbf803fc2, 0xf283fc00, 0x003fc40f,
-0x83fc00f5, 0x0bc01ff0, 0x00000660, 0x00000000, 0x0017a015, 0x027c811f,
-0x56c209f2, 0x7c001300, 0xe0013423, 0x801f0007, 0x01f2007c, 0x531044c0,
-0xf2807e80, 0x0007c801, 0x805c001f, 0x57c001f0, 0x00000e00, 0x00000000,
-0x00198812, 0x03b4002d, 0x384004d0, 0xf4006b00, 0x600e5013, 0x00ed003b,
-0x0ed003b4, 0xe1183042, 0xd003b400, 0x003b400e, 0x839c00ed, 0x4b4a0ed1,
-0x00000600, 0x00000000, 0x00f90003, 0x46b400e5, 0x7a411ad0, 0xb6236100,
-0x4a1e100f, 0x11ed2079, 0x1ed107b4, 0xe5007a40, 0xd18fb401, 0x087b4a1e,
-0x0f9403ed, 0x0f401ed0, 0x00000402, 0x00000000, 0x10f32812, 0x033402cd,
-0xb0400dd2, 0x34015912, 0x420e5403, 0x40ed03fb, 0x3ed10bb4, 0xe5043a50,
-0xd04bb412, 0x00bb402e, 0x4b9401ed, 0x4b000ed0, 0x00000c20, 0x00000000,
-0x00dda817, 0x05fc007f, 0x5ec007f0, 0xbc015300, 0xc0051004, 0x035f0017,
-0x55f0117c, 0x570496c0, 0xf1017c01, 0x0417c525, 0x015c005f, 0x5fc107f8,
-0x00000620, 0x00000000, 0x01070012, 0x007c101f, 0x07c801d0, 0x7c021f04,
-0xc003f000, 0x403b200f, 0x03f148fc, 0x3a408dc1, 0xf000bc08, 0x118fc003,
-0x00fc043f, 0x4bc823f0, 0x00000c00, 0x00000000, 0x02270810, 0x064c088f,
-0x24c209f1, 0x4c41df20, 0xc0093404, 0x109f0027, 0x08f0024c, 0x9f0064c0,
-0xf0027c00, 0x0027c109, 0x027c009f, 0x43c009f0, 0x00000c20, 0x00000000,
-0x00262001, 0x2a44019d, 0xa44009d0, 0x44209d00, 0x40091082, 0x809d0027,
-0x09d00245, 0x9c03e458, 0x10827420, 0x00274009, 0x0274809d, 0x074129f0,
-0x00000800, 0x00000000, 0x0034a018, 0x4344009d, 0xa44009d0, 0x44089d00,
-0x40091022, 0x00a5082f, 0x0fd082c4, 0xbd002c48, 0x1402f000, 0x003e640b,
-0x03f600b9, 0x63400bd0, 0x00000200, 0x00000000, 0x00202010, 0x2204028d,
-0x2051c8d0, 0x4508cd02, 0x422a100a, 0x02ad00ab, 0x2ad00a84, 0xad00a84c,
-0x100ab442, 0x00ab482a, 0x02b602ad, 0x43400ad0, 0x00000080, 0x00000000,
-0x0506b01d, 0x584c001f, 0x80c061f0, 0x4c161f05, 0xc0013850, 0x00170007,
-0x00f0014c, 0x1d0004c4, 0xf0007c40, 0x0017c001, 0x007c801f, 0x77c203f0,
-0x00000a80, 0x00000000, 0x002fb819, 0x13fc02ff, 0x2f804bf0, 0xf8249f01,
-0xca29f000, 0x029f00a7, 0x29f00a7c, 0x9f00a7cc, 0xf00a7c22, 0x00a7c029,
-0x0a7c029f, 0x67c02970, 0x00000e60, 0x00000000, 0x002fa018, 0xc2cc04bb,
-0xacc06930, 0x4c06b301, 0xc1093016, 0x04930227, 0x09300a4c, 0x930427c0,
-0x301a4c04, 0x00a4c069, 0x024c009b, 0x67c00930, 0x00000e00, 0x00000000,
-0x0297081c, 0x0044341d, 0x84424510, 0x6e861141, 0x40611018, 0x16110287,
-0xe1140145, 0x51408748, 0x10104114, 0x03944045, 0x00440411, 0x72400714,
-0x00000c22, 0x00000000, 0x0023a010, 0x4224428d, 0xa0486810, 0x84028100,
-0x410a5c4a, 0x48a1492b, 0x0a100a84, 0xa1052b41, 0x141a8402, 0x4128506a,
-0x0aa532a1, 0x43402a10, 0x00000e80, 0x00000000, 0x0125a818, 0x0264089d,
-0x25444814, 0x2400c100, 0x430b5082, 0x10b1042b, 0x6b1002c4, 0xb108af4a,
-0x101a8400, 0x0028404e, 0x42e426a1, 0x63408b12, 0x00000620, 0x00000000,
-0x08e7a805, 0x0a6c0299, 0x24902930, 0x44009301, 0xc0297002, 0x00930027,
-0x3930064c, 0x930027c0, 0x300e4c01, 0x00e4c019, 0x026c009b, 0x17c03930,
-0x00000e20, 0x00000000, 0x00258014, 0x0e5c409c, 0x26c209f1, 0x7c189f01,
-0x8129b00e, 0x088f0167, 0x19f00e7c, 0x9f0127c4, 0xf2027803, 0x0127c019,
-0x221c009f, 0x52c009f0, 0x00000600, 0x00000000, 0x40850814, 0x187c0003,
-0x04d021f0, 0xfc001f20, 0xc4237100, 0x1033000c, 0x23f000fc, 0x33000cc1,
-0x3048cc00, 0x000cc003, 0x80cca23f, 0x530003f2, 0x00000420, 0x00000000,
-0x1154a014, 0x49f44271, 0x1d4005d0, 0x76927d21, 0x5405d001, 0x00514014,
-0x05d00174, 0x514016d2, 0x16014580, 0x00145005, 0x014d005d, 0x534005d2,
-0x00000200, 0x00000000, 0x0072a014, 0x07740cc1, 0x35400cd0, 0x3441cd01,
-0x420c4283, 0x00c10230, 0x0cd00374, 0xd1003440, 0x10030408, 0x0230400c,
-0x032400cd, 0x53440cd0, 0x00000a00, 0x00000000, 0x00608005, 0x03b481e1,
-0x38400cd0, 0xb400ed00, 0x4010d000, 0x20210800, 0x12d000b6, 0x01000042,
-0x10000420, 0x18084000, 0x0084200d, 0x174402d0, 0x00000200, 0x00000000,
-0x00781015, 0x85bc20a3, 0x59c33ef0, 0xb481ef20, 0xc01e7206, 0x01e30078,
-0x1cf085bc, 0xe3004846, 0x31078c01, 0x0058c01e, 0x07ac01ef, 0x57c016f0,
-0x00000040, 0x00000000, 0x0825b810, 0x007c0098, 0x17c40df0, 0x7c009f00,
-0xc801f001, 0x001f2007, 0x01f2027c, 0x1f2037c0, 0xf0007c80, 0x0027c801,
-0x007c001e, 0x43c209f8, 0x00000660, 0x00000000, 0x007bb000, 0x06fc8973,
-0x7f041ff1, 0xfc01ff02, 0xc0973027, 0x097f026c, 0x973007cc, 0xbf107cc0,
-0xf125cd09, 0x026cd01f, 0x07c801f3, 0x0bc01f30, 0x00000e00, 0x00000000,
-0x02398015, 0x82b408eb, 0x03400ed0, 0xf4006d00, 0x42cb1008, 0x08ad0318,
-0xcb102084, 0x6d020840, 0xd0b2840c, 0x021c4182, 0x60844831, 0x57480210,
-0x00000620, 0x00000000, 0x00290000, 0x60b63821, 0x3b408ed0, 0xb418ed10,
-0x44065082, 0x084d0028, 0x06100104, 0x8d000840, 0xd0018400, 0x0208400c,
-0x030400e1, 0x63401610, 0x00000400, 0x00000000, 0x10232804, 0x08360089,
-0x83400cd1, 0x34010c00, 0x54984081, 0x108d0010, 0x98102204, 0x4d02b050,
-0xd00e0483, 0x42f04030, 0x08050a01, 0x1b403810, 0x00000c20, 0x00000000,
-0x0035a815, 0x067c2113, 0xa7c82ff0, 0x3c21df00, 0xc0996401, 0x019f1414,
-0x19102a4c, 0x5f0074c0, 0xf04a4c10, 0x00744201, 0x0c4c0313, 0x77c10910,
-0x00000620, 0x00000000, 0x10230001, 0x4a70021f, 0x23011df0, 0x7c22df00,
-0xc005b006, 0x085f0023, 0x05f4017d, 0x9f1407c1, 0xf0117c12, 0x0407c90d,
-0x1b7c02df, 0x07c104f4, 0x00000c00, 0x00000000, 0x003f0880, 0x82fc0833,
-0x0fc20ff8, 0xfc857304, 0xc21a3000, 0x01b3041c, 0x5b3084bc, 0x7f000fc0,
-0xf006fc00, 0x001bc013, 0x04fc1033, 0x04c013f0, 0x00000c20, 0x00000000,
-0x00262081, 0x06740111, 0x47400dd0, 0x74231102, 0x40951003, 0x015b4024,
-0x05140774, 0x9d083740, 0xd0017424, 0x0827420d, 0x177404d1, 0x05460dd0,
-0x00000802, 0x00000000, 0x0034a001, 0x0e749051, 0x37400dd0, 0x74809100,
-0x04011001, 0x04110084, 0x01101274, 0x1d183740, 0x90107000, 0x08274241,
-0x10744811, 0x044249d0, 0x00000200, 0x00000000, 0x00302010, 0x023400c1,
-0x02400cd0, 0x74000108, 0x400c1002, 0x00c90030, 0x0c128134, 0xcd080340,
-0xd0033420, 0x0813400c, 0x032420c1, 0x41400490, 0x00000080, 0x00000000,
-0x0026a000, 0x007c0053, 0xb7c00fd0, 0x7c001340, 0xc0013000, 0x60130004,
-0x0131007c, 0x1f0007c4, 0xf0007c00, 0x0007c001, 0x007c0013, 0x04c401f0,
-0x00000ac0, 0x00000000, 0x002fa805, 0x00fc80ff, 0x4fc80ff0, 0xfc003f15,
-0xc00ff103, 0x40f7003f, 0x0ff003fc, 0xff003fc0, 0xf003fc00, 0x583fc00f,
-0x03fc00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x030f8003, 0x03cc0833,
-0x3fc08114, 0x4c00f308, 0xc00f381b, 0x00ff003f, 0x0df0837c, 0x9f0034c0,
-0xf0037c00, 0x003f400f, 0x03fc00ff, 0x0cc007f0, 0x00000e80, 0x00000000,
-0x00970801, 0x2a442e01, 0xb8400110, 0xc402f194, 0x40091023, 0x401d2807,
-0x01900074, 0x1d000450, 0xd0007400, 0x00074201, 0x0074a019, 0x06c009d1,
-0x00000420, 0x00000000, 0x21a3a011, 0x03142081, 0x30604852, 0x3402c163,
-0x48045213, 0x800d1002, 0x00d00014, 0x0d000140, 0xd0003620, 0x00034000,
-0x0034a00d, 0x444008d0, 0x00000c80, 0x00000000, 0x0025a803, 0x02442011,
-0x34748950, 0x5540d010, 0x690d5083, 0x201d2007, 0x01d00074, 0x1d080540,
-0xd2007400, 0x06074a81, 0x8074b01d, 0x0e4089d2, 0x00000620, 0x00000000,
-0x4007a802, 0x215c8153, 0x36c03570, 0x5c20d110, 0xc00d5403, 0x041f2887,
-0x81e0087c, 0x5f0605c1, 0xf00c7c10, 0x00c7c011, 0x007c011f, 0x08c211f0,
-0x00000e20, 0x00000000, 0x001d8007, 0x00ad09af, 0x3ac307b0, 0xac40ff00,
-0xc08bb203, 0x08ff30bf, 0x1fb013ec, 0xff007ec0, 0xf117fc20, 0x047fc11f,
-0x0ffc09fb, 0x1fc11ef0, 0x00000600, 0x00000000, 0x00b10802, 0x094c04d3,
-0x35e02530, 0x6c80d700, 0xc045f203, 0x18d304b4, 0xec714b4c, 0xd301b7c0,
-0x30237c08, 0x12b4c68d, 0x034c0cd3, 0x0bc40d30, 0x00000420, 0x00000000,
-0x0834a013, 0x14540091, 0x3f420510, 0xec0ae100, 0x420d1003, 0x03d51c74,
-0x2d104b44, 0xd104f7c8, 0x10877002, 0x00b4402d, 0x2f4400d1, 0x4f402d10,
-0x00000200, 0x00000000, 0x0222a007, 0x8024a001, 0x30480192, 0x0482c108,
-0x40301003, 0x43011082, 0x20110c04, 0x0100c344, 0x00103446, 0x10424410,
-0x08244301, 0x1f441011, 0x00000a00, 0x00000000, 0x20788004, 0x05340961,
-0x7b419290, 0x248dc501, 0x511c1007, 0x01c14072, 0x1e141705, 0xa1507342,
-0x14073401, 0x4872501c, 0xc72701c1, 0x13401e14, 0x00000200, 0x00000000,
-0x01a41012, 0x102c1883, 0x71ca5cb0, 0x0409c342, 0xc01c3817, 0x09c333f2,
-0x9c300f0c, 0x830373c0, 0x10273c01, 0x8132c02c, 0x032c00c3, 0x4bc10c30,
-0x00000040, 0x00000000, 0x402db802, 0x01dc087f, 0x3fc00f70, 0xdc48db00,
-0xc00f742b, 0x28ff003d, 0x0db2037c, 0xbf003dc2, 0xf083f808, 0x003dc08f,
-0x03dc08ff, 0x0bc01ff0, 0x00000660, 0x00000000, 0x0067a015, 0x024c0053,
-0x36900936, 0x5c04df00, 0xc201302b, 0x001f1807, 0x0130007c, 0x5fa007e0,
-0xf0004c01, 0x0007c001, 0x004c011f, 0x57c001f0, 0x00000e00, 0x00000000,
-0x30398812, 0x030400c1, 0x38400a10, 0xc490ed0b, 0x400e1203, 0x80e7003b,
-0x0e1203b4, 0xcd203b40, 0xd00384a0, 0x203b480e, 0x038480fd, 0x4b480ed2,
-0x00000620, 0x00000000, 0x00790003, 0x068403e1, 0x78401e10, 0xb409ed02,
-0x621e1097, 0x03ed007b, 0x1e1047b4, 0xed007b48, 0xd2078441, 0x00fb421e,
-0x078621ed, 0x0f401ed0, 0x00000400, 0x00000000, 0x02332812, 0x0b0413d1,
-0x30401c10, 0x4440cd00, 0x640e1003, 0x00f5023b, 0x2e148ff4, 0xed0c3f40,
-0xd003c421, 0x00bf483f, 0x23c742ed, 0x4b409fd2, 0x00000c20, 0x00000000,
-0x405da817, 0x09c50373, 0x16c07730, 0x7c805f08, 0xc2053001, 0x095f02d7,
-0x9530097c, 0x5f0897c6, 0xf0494d12, 0x0057c0a5, 0x8d4c045f, 0x5fc007f0,
-0x00000620, 0x00000000, 0x00870012, 0x487c821f, 0x07c841f2, 0x5c001f00,
-0xc023f000, 0x8037808f, 0xa3f048fc, 0x3f028fc8, 0xd290fc86, 0x008fc8a3,
-0x08fc063f, 0x4bc023f0, 0x00000c00, 0x00000000, 0x00270810, 0x024c019f,
-0x24c009b1, 0x4c818300, 0xc0493202, 0x809f0167, 0x9932064c, 0x931264c0,
-0x31027c41, 0x2c24c219, 0x427c0493, 0x40c01930, 0x00000c20, 0x00000000,
-0x00a62001, 0x0204069d, 0x24400910, 0x440a9130, 0x40091482, 0x039d21e7,
-0x09146e45, 0x9140a458, 0x140e74a0, 0x406451b9, 0x02700391, 0x0451a914,
-0x00000800, 0x00000000, 0x0024a018, 0x4344049d, 0x20500c90, 0x44109140,
-0x47091002, 0x18bd002f, 0x0a1182c4, 0xb1002c49, 0x1123f408, 0x062c400b,
-0x13f400b1, 0x60400b10, 0x00000200, 0x00000000, 0x02202010, 0x0204088d,
-0x20488812, 0x05808102, 0x422a1122, 0x02ad00ab, 0x2a100a84, 0xa100b848,
-0x100ab402, 0x20a8402a, 0x0ab442e1, 0x40402a10, 0x00000080, 0x00000000,
-0x0592b01d, 0x504d161f, 0x84d020b0, 0x4c941325, 0xc0013058, 0x801f0807,
-0x0130000c, 0x53200482, 0x30817c00, 0x0004c001, 0x017c0013, 0x74c00330,
-0x00000ac0, 0x00000000, 0x012fb819, 0x02fc04ff, 0x27c04bf0, 0x7c008f11,
-0xc229f012, 0x229f00a7, 0x29f08a7c, 0x9f00a7c8, 0xf00a7c02, 0x00a7c829,
-0x0a7c029f, 0x67c229f0, 0x00000e60, 0x00000000, 0x00afa018, 0x02fc02bf,
-0x24c00a70, 0x4c00b310, 0x4049321a, 0x82930524, 0x29300a4c, 0x930024c1,
-0x30a24c12, 0x9024c889, 0x024c049f, 0x63c06930, 0x00000e00, 0x00000000,
-0x1087081c, 0x0074021d, 0x04400510, 0x04001101, 0x50615008, 0x00114184,
-0x01142845, 0x11010450, 0x102944c0, 0xa78450a1, 0x584d141d, 0x73686314,
-0x00000c20, 0x00000000, 0x01a3a010, 0x0234068d, 0xa0400850, 0x0402c154,
-0x418a140a, 0x02a10428, 0x0a100284, 0xa144a842, 0x14128500, 0x0028404a,
-0x0aa402ad, 0x4340ca10, 0x00000e80, 0x00000000, 0xa425a818, 0x8274009d,
-0x24500910, 0x04009100, 0x41885002, 0x82b91028, 0x0b1002c4, 0xa1002c41,
-0x1103c490, 0x043c410b, 0x42c410fd, 0x63400b10, 0x00000620, 0x00000000,
-0x0027a805, 0x027c029f, 0x24c00970, 0x4d009300, 0xc0293002, 0x83930464,
-0x3930e244, 0x9306e4c0, 0x10064c0a, 0x00a4c039, 0x0e6c029d, 0x17404930,
-0x00000e20, 0x00000000, 0x02658014, 0x027c009f, 0x27c289f0, 0x7c008f00,
-0xc009b202, 0x85872967, 0x89f0023c, 0x9f0c63c0, 0xf0a63c20, 0x0567c298,
-0x263c058f, 0x53c059f0, 0x00000600, 0x00000000, 0x04850814, 0xa07c801f,
-0x02c021f0, 0x4c001300, 0xc1033000, 0x003f010c, 0x03f0c0fc, 0x3f008cc0,
-0xd100cc02, 0x008fc823, 0x88fcb23b, 0x50c023f0, 0x00000420, 0x00000000,
-0x00dca014, 0x2db4007d, 0x144007d1, 0x44207100, 0x50351001, 0x4b5d0414,
-0xa5d00574, 0x5d001450, 0xd0094502, 0x44d74075, 0x2d740351, 0x514017d0,
-0x00000200, 0x00000000, 0x02f2a014, 0x073410cd, 0x32400dd0, 0x3400c100,
-0x42be1003, 0x02ed1838, 0x0fd00394, 0xeda07840, 0xd0478490, 0x003b404e,
-0x07b401e1, 0x50421ed2, 0x00000a00, 0x00000000, 0x00288005, 0x03b400ed,
-0x384203d0, 0xb400e10b, 0x400c1413, 0x10ed0038, 0x0cd00bb4, 0xcd10b841,
-0xd00b84a0, 0x0073400e, 0x43b410e1, 0x15411ed0, 0x00000200, 0x00000000,
-0x00781015, 0x05bc012f, 0x7ec01ef3, 0xbc010341, 0xc01e303f, 0x41ee2078,
-0x1ef007be, 0xef0078c0, 0xf0878c41, 0x207bc41e, 0x07bc01e3, 0x54c01cf0,
-0x00000040, 0x00000000, 0x0025b810, 0x017c00df, 0xb74001f0, 0x4d201f05,
-0xc801f803, 0x001f2007, 0x01f0007c, 0x5f0007c0, 0xf0007c80, 0x0007c001,
-0x807c0017, 0x43c001f0, 0x00000660, 0x00000000, 0x007fa000, 0x06fc01ff,
-0x75c89cf0, 0x7c49f32a, 0xc01d3007, 0x81d30074, 0x1ff207fc, 0xd31877c4,
-0x30277c45, 0x007c409f, 0x27cc09f3, 0x00c21f30, 0x00000e00, 0x00000000,
-0x00398815, 0x02b4006d, 0x704092d0, 0xb481c102, 0x40555007, 0x0fc10074,
-0x5ed03784, 0xe106fb42, 0x1227b415, 0x203849ae, 0x2b8480e1, 0x54488e12,
-0x00000620, 0x00000000, 0x00190000, 0x02b4002d, 0x31404fd0, 0xb4042140,
-0x404a1013, 0x2ce1043a, 0x4e922384, 0xe9123b44, 0x5233b484, 0x203a608e,
-0x238400e1, 0x00401e18, 0x00000400, 0x00000000, 0x00132804, 0x0234034d,
-0x304201d2, 0x34000100, 0x561c9003, 0x06015482, 0x30d06c05, 0x59640344,
-0x16043491, 0x46427100, 0x04050901, 0x1051101c, 0x00000c20, 0x00000000,
-0x0155a815, 0x03708edf, 0x3dc001f0, 0xfc40d330, 0xc00d3003, 0x80d300b6,
-0x2db00b5e, 0x9b8077c0, 0x504b7c41, 0x0836c01d, 0x4f4c01d3, 0x54c10d30,
-0x00000620, 0x00000000, 0x00070001, 0x227c009f, 0x37c02df0, 0x3c025f00,
-0xc08d7203, 0x08df0035, 0xadfb0b5e, 0x930037c0, 0xb04b7c02, 0x0835e00d,
-0x1b7c00df, 0x07c00df0, 0x00000c00, 0x00000000, 0x001b0880, 0x15bc0933,
-0x38d01334, 0x7c01fb00, 0xc90e7003, 0x00f30038, 0x9ff117fc, 0xbd217fc9,
-0xf107c881, 0x003fc80f, 0x03f093ff, 0x03c00ff2, 0x00000c22, 0x00000000,
-0x04c62081, 0x88740191, 0x35009d12, 0x74185500, 0x40010003, 0x09115684,
-0x01d00074, 0x1d10074c, 0xd00c449a, 0x0ac74681, 0x2864621d, 0x074091d1,
-0x00000802, 0x00000000, 0x0224a001, 0x097400d1, 0x36002110, 0x74009900,
-0x420dc003, 0x00110004, 0x01d08854, 0x15000741, 0xd0105500, 0x08074001,
-0x0074201d, 0x074209d0, 0x00000200, 0x00000000, 0x08202010, 0x00240001,
-0x30444c10, 0x34000101, 0x40441ac3, 0x10010880, 0x80d01836, 0x0d950342,
-0xd0201440, 0x00034000, 0x0024000d, 0x434008d0, 0x00000080, 0x00000000,
-0x4006b000, 0x017e2013, 0xfcc0b130, 0xfc059b02, 0xc0f97007, 0x21030844,
-0x71f0147c, 0x1f0043c1, 0xf01c1c1b, 0x0003c000, 0x003c000f, 0x03c008f0,
-0x00000ac0, 0x00000000, 0x080fb805, 0x00fe003f, 0x7f40dff0, 0xfc131f02,
-0xc89fb147, 0x15ff00ff, 0x5df01f74, 0xbf047fc0, 0xf237ec05, 0x003fc00f,
-0x03fc40ff, 0x17c007f0, 0x00000e60, 0x00000000, 0x0b0f8003, 0x33cc8c3f,
-0x2bc003f0, 0xfc063342, 0xc00fb033, 0x00ff003f, 0x0ff003cc, 0xbf003cc0,
-0x3003fc00, 0x003dc00f, 0x03cc00f3, 0x0cc007f0, 0x00000e00, 0x00000000,
-0x03070801, 0x324c0e5d, 0xaf40e1d0, 0x74061100, 0x4809100b, 0x800d0007,
-0x01d28064, 0x1d000450, 0x14007420, 0x00045001, 0x00440011, 0x044009d0,
-0x00000c20, 0x00000000, 0x0123a011, 0x1124000d, 0xa1490050, 0x34820521,
-0x4004908b, 0x800d2001, 0x00d20025, 0x0d000160, 0x92003480, 0x60004200,
-0x00270009, 0x445008d0, 0x00000e80, 0x00000000, 0x0005a807, 0x0044041d,
-0x276001d0, 0x74005100, 0x000d1003, 0x021d0507, 0x61d80064, 0x1d000440,
-0x90007620, 0x00844001, 0x00640819, 0x0c0009d0, 0x00000620, 0x00000000,
-0x00c7a802, 0x326d031d, 0x27c0d5f0, 0x7c801700, 0x847db003, 0x081f00c7,
-0x01f0144c, 0x1f0105c0, 0x90687c02, 0x0084c051, 0x386c011b, 0x08c281f2,
-0x00000e20, 0x00000000, 0x02158003, 0x02fc016f, 0x2ec01ff0, 0xa0083f00,
-0xc049f00b, 0x01ff0077, 0x1df00f5c, 0x9f0277c0, 0x70077c08, 0x0936c09d,
-0x075c00d3, 0x1fc01dd0, 0x00000600, 0x00000000, 0x44a50802, 0x004c089f,
-0x23c40530, 0x7c005304, 0xd005b807, 0x0ec340b4, 0x2d34035c, 0x934034d0,
-0x740b4d00, 0x4034d00d, 0x034d02d3, 0x08d00d34, 0x00000420, 0x00000000,
-0x00d48017, 0x10450890, 0x2c400db0, 0x5c055108, 0x42bd1807, 0x02d10af4,
-0xbd102f45, 0x9b0af400, 0x10af442b, 0x02f442bd, 0xaf440bd0, 0x4c40bd10,
-0x00000200, 0x00000000, 0x0212a007, 0x11040381, 0xa0400811, 0x24000100,
-0x40001083, 0x81010001, 0x01920004, 0x41000200, 0x10006400, 0x08044001,
-0x00240010, 0x1d400110, 0x00000a00, 0x00000000, 0x00688004, 0x058401e1,
-0x6c481898, 0xd4016100, 0x410e1007, 0x81e11479, 0x1e904786, 0xe9047a41,
-0x1047a411, 0x0478411e, 0xc7a431e1, 0x11419e10, 0x00000200, 0x00000000,
-0x80b01012, 0x214c4c53, 0x21c24c30, 0x3c080300, 0xe80c1003, 0x88c32031,
-0x4cb0031c, 0xc30132c0, 0x70132c02, 0x0230c00c, 0x132c02c3, 0x49c00c30,
-0x00000040, 0x00000000, 0x002db802, 0x01fc0874, 0xadc00fe0, 0xbc205f44,
-0xe00f7043, 0x08fe023e, 0x0d70037c, 0xf7003de0, 0xf003dc08, 0x203fc08f,
-0x03dc00ff, 0x0ac21ff8, 0x00000660, 0x00000000, 0x4017b011, 0x027c009b,
-0xa7ca01f0, 0x3c945b00, 0xd0013407, 0x00130804, 0x0134007c, 0x534007c0,
-0xf2804d80, 0x0007c001, 0x007c001f, 0x54d001f0, 0x00000e00, 0x00000000,
-0x803d8012, 0x03b420e3, 0x2f440ad0, 0x9c006101, 0x400f1013, 0x20e1003c,
-0x0e1003b4, 0xf1803b40, 0x70038400, 0x003b420e, 0x03a400ed, 0x48400ed0,
-0x00000620, 0x00000000, 0x00790003, 0x0eb401e5, 0x6b4016d0, 0xf4016100,
-0x401e1007, 0x01e5007a, 0x1e5887b4, 0xe9887b40, 0xd0078621, 0x007b401e,
-0x07b401ed, 0x0c401ed0, 0x00000400, 0x00000000, 0x80332812, 0x1f3640c5,
-0x23401dd8, 0x14004940, 0x400e1003, 0x1be544b8, 0x1e103bb4, 0xe900bb40,
-0x500b8012, 0x243b404e, 0x0ba40bed, 0x48400ed0, 0x00000c20, 0x00000000,
-0x081da817, 0x0df40277, 0x1740d7d0, 0xf4855b00, 0xe0053000, 0x025701d4,
-0xc570017c, 0x5b041740, 0xf0154400, 0x24174125, 0x1d7c005f, 0x5cc107f0,
-0x00000620, 0x00000000, 0x00070012, 0x007c9010, 0x07c001b0, 0x5c001700,
-0xe002f200, 0x003b008b, 0x22d008bc, 0x27210bca, 0x7010bc80, 0x000bc002,
-0xc0b0102f, 0x4bc022f2, 0x00000c00, 0x00000000, 0x02270810, 0x021c2593,
-0x25c20970, 0x7c00d300, 0xc009f000, 0x20932026, 0x0930027c, 0x932165ca,
-0x31026c00, 0x0024c009, 0x824c0093, 0x40c00938, 0x00000c20, 0x00000000,
-0x00662001, 0x0a744195, 0xe0480910, 0x5c499100, 0x5009d802, 0x209140a4,
-0x29144a74, 0x9b406459, 0x14024580, 0x4024d809, 0x02450491, 0x045d2904,
-0x00000800, 0x00000000, 0x0820a018, 0x427400d9, 0x24600958, 0x74009145,
-0x4219d0a2, 0x00b1002c, 0x0b1002f6, 0xb1882c40, 0x1002c400, 0x802e400b,
-0x02c400b1, 0x62400b90, 0x00000200, 0x00000000, 0x02202210, 0x0a3408c5,
-0x2441c810, 0x34088100, 0x403ad022, 0x02a100b8, 0x2a100ab4, 0xa980a840,
-0x100a8402, 0x00aa402a, 0x0a8482a1, 0x42402a18, 0x00000080, 0x00000000,
-0xa586a01d, 0x005c161b, 0x05d06170, 0x7c561305, 0xc001d0d8, 0x00130004,
-0x01300034, 0x130001c0, 0x32004c00, 0x0006e001, 0x814c0013, 0x76c20230,
-0x00000ac0, 0x00000000, 0x212f8819, 0x0afc04bf, 0x2fc04bf1, 0xdc049f0d,
-0x4029f010, 0x029f00a5, 0x29f20a7c, 0xd720a7c0, 0xe20a7c02, 0x00b5c02d,
-0x0a7c029f, 0x65c029f0, 0x00000e60, 0x00000000, 0x133faa18, 0x0afc10bf,
-0xa8c06978, 0xdc029301, 0xc049301d, 0x629f0224, 0x69f0027c, 0x9f8627c1,
-0xf0327c0c, 0x2827ca49, 0x0a7c209f, 0x63c009f0, 0x00000e00, 0x00000000,
-0x0307001c, 0x0874001d, 0x046441d0, 0x64001140, 0x5061101c, 0x421d0294,
-0x21d29874, 0x1d218748, 0xd0917484, 0x00074141, 0x0834021d, 0x734143d0,
-0x00000c20, 0x00000000, 0xa123a010, 0x1a34908d, 0xa2406850, 0x14068100,
-0x418a108a, 0x06ad0128, 0x4ad04ab4, 0xa5002b60, 0xd00ab402, 0x05ab402a,
-0x0ab416ad, 0x43402ad0, 0x00000e80, 0x00000000, 0xa425a818, 0x8274009d,
-0x264208d0, 0x64409110, 0x42491102, 0x00bd002c, 0x0bd802f4, 0xbd212f6b,
-0xd012f600, 0x002f440b, 0x8af410bd, 0x63404bd0, 0x00000620, 0x00000000,
-0x0027a005, 0x127cb09f, 0x26500970, 0x5c009300, 0xc1293402, 0x1b9f02e4,
-0x39f06e7c, 0x9f0127c4, 0xd08e7c03, 0x0267c899, 0x027c039d, 0x17c049f0,
-0x00000e20, 0x00000000, 0x00258014, 0x027c459f, 0x21c099f0, 0x6c08df00,
-0xc009f020, 0x009f0067, 0x99f0027c, 0x9f0067c8, 0xf0027c02, 0x0827c309,
-0x167c229f, 0x53c009f0, 0x00000600, 0x00000000, 0x00850014, 0x007c801f,
-0x07c80172, 0x6d001300, 0xd003f200, 0x0037000c, 0x233000cc, 0x33048fc0,
-0xf000fc00, 0x200fc003, 0x08fc023f, 0x53c02330, 0x00000420, 0x00000000,
-0x001ca014, 0x41dc007d, 0x1f400510, 0x44405106, 0x4005d084, 0x005c0814,
-0x05148145, 0x55401748, 0xd1817400, 0x08170605, 0x0174605d, 0x53400714,
-0x00000200, 0x00000000, 0x01328014, 0x032408cd, 0xf3400c50, 0x44894100,
-0x400dd007, 0x08c50230, 0x0c900324, 0xc1003364, 0xd023341a, 0x0233408c,
-0x233400cd, 0x53400c10, 0x00000a00, 0x00000000, 0x00388805, 0x049440ad,
-0x3f404e10, 0x84016140, 0x4002d073, 0x212d0008, 0x029004a4, 0x21004b62,
-0x9000b400, 0x000b4002, 0x84b4002d, 0x17400210, 0x00000200, 0x00000000,
-0x00780015, 0x073c016f, 0x5bc01e7a, 0x8c894300, 0xc013f207, 0x01f70058,
-0x16b005ec, 0xe3006fc0, 0xf007bc01, 0x007bc01e, 0x05bc016f, 0x57c01632,
-0x00000040, 0x00000000, 0x2025a810, 0x025c001f, 0x17e16de0, 0x5c005f00,
-0xc80df003, 0x801f2027, 0x0970025c, 0x1f2017c8, 0xf2007c80, 0x0007c801,
-0x027c809f, 0x43c009f0, 0x00000660, 0x00000000, 0x027fa000, 0x06ca49ff,
-0x7fc11ff0, 0xbc017f00, 0xc01f3007, 0x09bb426c, 0x9ff017fc, 0x3f025fc0,
-0xf026fc09, 0x026fc093, 0x36cd09ff, 0x03c01f34, 0x00000e00, 0x00000000,
-0x00198015, 0x188620ed, 0x1bc00ed8, 0xb4802d02, 0x40031003, 0x0c610018,
-0x829000b4, 0xed232a40, 0xd101b408, 0x001b440e, 0x31ec002d, 0x574802b0,
-0x00000620, 0x00000000, 0x08390200, 0xc284002d, 0x2b400ed0, 0xf4086d00,
-0x41021003, 0x00a10008, 0x86d811b4, 0x2d000960, 0x5002b408, 0x042b4102,
-0x3096006d, 0x034016d0, 0x00000400, 0x00000000, 0x24032804, 0x0604210d,
-0x01402cd0, 0x34000c00, 0x402c1003, 0x004500f0, 0xb8902234, 0xcd023260,
-0xd00d3403, 0x00d3403c, 0x0f160d8d, 0x13403850, 0x00000c20, 0x00000000,
-0x2805a815, 0x054405dd, 0x27400fd0, 0x7c055c00, 0xd09d3d17, 0x81530274,
-0x19f02a7c, 0xdf02f5c0, 0xf0497410, 0x0057401d, 0x4f54009f, 0x57c0a9d0,
-0x00000620, 0x00000000, 0x22330001, 0x017c020d, 0x27c10df2, 0x7c005f10,
-0xc801f003, 0x08930207, 0x05c0017c, 0x1f200748, 0xf01a7404, 0x28a7c001,
-0x0064805f, 0x07808580, 0x00000c00, 0x00000000, 0x020f0880, 0x05ec20fb,
-0x0cc40e72, 0xcc003300, 0xc003f003, 0x106f101c, 0x03f004cc, 0xff002c43,
-0x3281fc00, 0x041cc30f, 0x41fc0033, 0x03c213f0, 0x00000c22, 0x00000000,
-0x00a62081, 0x0f450411, 0x04400d10, 0x4d091110, 0x500dd003, 0x129d2024,
-0x9dd20745, 0x1d0014d0, 0x16124580, 0x4124d001, 0x025c48d5, 0x07401dd1,
-0x00000802, 0x00000000, 0x0084a001, 0x100400d1, 0x30400d50, 0x44804102,
-0x400cd293, 0x001d0024, 0x08d01244, 0x0d801540, 0x10000400, 0x00024000,
-0x02740091, 0x074049d0, 0x00000200, 0x00000000, 0x40102010, 0x01040041,
-0x10500c10, 0x04000100, 0x4000d003, 0x20cd8810, 0x04d00104, 0xcd902140,
-0x18030420, 0x0032420c, 0x81042041, 0x43400498, 0x00000080, 0x00000000,
-0x0006a000, 0x004c2083, 0x24c00f70, 0x44001340, 0xc001f003, 0x001f0000,
-0x01f00044, 0x1f000540, 0x32005c00, 0x0006e001, 0x007c0003, 0x03c001f0,
-0x00000ac0, 0x00000000, 0x800f9805, 0x03dc803f, 0x0fc00ff8, 0xdc003f00,
-0x400ff103, 0x00fc003f, 0x0ff003fc, 0xff003cc2, 0xf003de00, 0x003dc00f,
-0x03dc00ff, 0x17c00ff1, 0x00000e40, 0x00000000, 0x000fa003, 0x00fc083f,
-0x8fe003f0, 0xed801300, 0xc003f000, 0x003f000c, 0x01f0007c, 0xff203f80,
-0xf100f400, 0x006cc057, 0x03cc01bb, 0x0cc403f3, 0x00000e00, 0x00000000,
-0x00370801, 0x037400dd, 0x37410df0, 0x4400d500, 0x080dd003, 0x20cd0030,
-0x0dd00374, 0xdd003640, 0xd0002400, 0x20154005, 0x03540a55, 0x054005d0,
-0x00000c20, 0x00000000, 0x0013a011, 0x0234000d, 0x134048d0, 0x24000501,
-0x5200d003, 0x004d0012, 0x04d20034, 0xcd303360, 0x92003420, 0x02004284,
-0x0304808d, 0x446001d8, 0x00000e80, 0x00000000, 0x0035a803, 0x017400dd,
-0x27400550, 0x4402d518, 0x422cd000, 0x009d0826, 0x09908b64, 0xdd803641,
-0xd2a06480, 0x00354005, 0x83500055, 0x0d4101da, 0x00000620, 0x00000000,
-0x0077a802, 0x017c00df, 0x274605d0, 0x6c005718, 0xc401f800, 0x041f0026,
-0x01f0017c, 0xdf003740, 0xb3407c89, 0x008cc047, 0x024c00bf, 0x08802cf0,
-0x00000e20, 0x00000000, 0x00dd8007, 0x02fc003f, 0x1fc80bf0, 0xfc20bf00,
-0xc02ff803, 0x00ff101d, 0x0ff082fc, 0xff143fc4, 0xf000ec31, 0x003bc907,
-0x02fc204f, 0x1f810ff0, 0x00000600, 0x00000000, 0x00350802, 0x037c00db,
-0x36c04df0, 0x7c025b20, 0xc0e1f003, 0x12530437, 0xe5f0694c, 0xdf1036c0,
-0x31097c00, 0x0307c084, 0x034d0c97, 0x0bc00df0, 0x00000420, 0x00000000,
-0x0014a013, 0x80742d11, 0x874021d0, 0x74009c08, 0x401dd000, 0x82914047,
-0x29d00a45, 0xdd00fd52, 0x14057660, 0x00b74025, 0x43440251, 0x4dc23d71,
-0x00000200, 0x00000000, 0x0212a007, 0x1c240009, 0x076000d0, 0x34009d01,
-0x402cd000, 0x4a812083, 0x28d00604, 0xcd023140, 0x111434c0, 0x8043441c,
-0x1f340181, 0x1f4018d0, 0x00000a00, 0x00000000, 0x20788004, 0x47b401e1,
-0x7b405ed0, 0xb4016d04, 0x4212d01f, 0x0d61007b, 0x56d02584, 0xed107940,
-0x1034b409, 0x0833481e, 0x87a44161, 0x114c1e50, 0x00000200, 0x00000000,
-0x01141012, 0x023c000b, 0x53c058f0, 0x3c018f03, 0xc0dcf017, 0x0dc30653,
-0xddf0160c, 0xcd0371c0, 0x30573419, 0x0203c00c, 0x033c0083, 0x4bc300f8,
-0x00000040, 0x00000000, 0x403db802, 0x01f400ff, 0x27c087f0, 0xfc005f10,
-0xc003f000, 0x001e1027, 0x93f801fc, 0xff053cc8, 0xf123fc40, 0x013fc08f,
-0x23dc017f, 0x0be403f0, 0x00000660, 0x00000000, 0x1037a015, 0x017c80d3,
-0x27c005f0, 0x5c00d700, 0xc00df000, 0x019c0027, 0x0934034d, 0xd3407784,
-0x32064f21, 0x6044d21d, 0x86490093, 0x54901d3c, 0x00000e08, 0x00000000,
-0x00118812, 0x02b40021, 0x1b420ad0, 0xac003d08, 0x0402d283, 0x207d201b,
-0x061000c4, 0xe10139c0, 0x10828600, 0x003c400f, 0x02c40071, 0x48600f38,
-0x00000620, 0x00000000, 0x047d0003, 0x07b401e1, 0x7b403ed0, 0xb611ed00,
-0x401ed007, 0x01e9007b, 0x1e910784, 0xe1007b48, 0x1207c411, 0x0048401e,
-0x079401ad, 0x0c4c1e10, 0x00000400, 0x00000000, 0x04d72812, 0x24341201,
-0x874001d0, 0x24001d01, 0x4001d800, 0x200d0003, 0x00902004, 0x81003140,
-0x102f0601, 0x09b0420c, 0x27040049, 0x48408c12, 0x00000c20, 0x00000000,
-0x4095a817, 0x057c1053, 0x97c015f0, 0x7c005700, 0xc005fa01, 0x605b1017,
-0x05b0854c, 0x530017c4, 0x0001cc00, 0x00944005, 0x015c207b, 0x5c403730,
-0x00000620, 0x00000000, 0x000f0012, 0x00fc403f, 0x0fc403f1, 0xfc003f00,
-0xc023f808, 0x003f000f, 0x237108fc, 0x1f108740, 0xf5486c80, 0x100fcc21,
-0x08604227, 0x4bc10170, 0x00000c00, 0x00000000, 0x02670810, 0x027c009b,
-0x24c019f0, 0x6c209b00, 0xc219f00e, 0x039f04e4, 0x1930267c, 0x9f00e70a,
-0xf0027c22, 0x0027c259, 0x164c059f, 0x42c009f0, 0x00000c20, 0x00000000,
-0x00262001, 0x02741091, 0xa44aa9d8, 0x44009300, 0x5479d04a, 0x039f00e4,
-0x09140274, 0x9d10e64a, 0x70367c00, 0x00e74049, 0x1244849d, 0x05c039d0,
-0x00000800, 0x00000000, 0x00248018, 0x12f400b9, 0xac402bd3, 0xe640b100,
-0x404bd002, 0x22bd042c, 0x8b1042b4, 0x9d102762, 0xd0827480, 0xb1bf4809,
-0x024400bd, 0x624069d0, 0x00000200, 0x00000000, 0x02282010, 0x02b408a1,
-0x28608ad0, 0x8428a102, 0x422ad002, 0x02a588a8, 0x2a120ab4, 0xcd00b248,
-0x500a1422, 0x00ab4028, 0x8a0402ad, 0x434028d0, 0x00000080, 0x00000000,
-0x0086b01d, 0x017c221b, 0x84d021d0, 0x6c021300, 0x4201f000, 0x001d0804,
-0x0730007c, 0x0f000380, 0xe0807480, 0x2007c001, 0x004d003f, 0x76e001f2,
-0x00000ac0, 0x00000000, 0x012fb819, 0x027c049f, 0x27c049f0, 0x7c049f41,
-0xc409f002, 0x009f2027, 0x09e0027c, 0xbf00a7c0, 0x6082bc20, 0x00a7c029,
-0x82fc829f, 0x65c00bf0, 0x00000e60, 0x00000000, 0x002fa018, 0x02bc02b3,
-0x2cc00b70, 0xec089310, 0xc0093002, 0x809608a7, 0x29c0027c, 0x8f11a748,
-0xf0823c00, 0x00e4c499, 0x024c0793, 0x638029f0, 0x00000e00, 0x00000000,
-0x0107081c, 0x00740011, 0x00400170, 0x44001500, 0xc1411001, 0x40100105,
-0x41920074, 0x17000740, 0x92117640, 0x03044001, 0x50440411, 0x720047d2,
-0x00000c20, 0x00000000, 0x0423a010, 0x03348081, 0x205008d1, 0x25048100,
-0x440a1102, 0x14a1692b, 0x4ad052b4, 0xad222b64, 0x9042b490, 0x0128406a,
-0x02a4ccad, 0x43404ad0, 0x00000e80, 0x00000000, 0x4025a818, 0x82740091,
-0x244008d0, 0x46009500, 0x48091c02, 0x04f1002f, 0x0b9102f4, 0xb5003f02,
-0x9003f408, 0x082c400b, 0x12f440f9, 0x62448bd0, 0x00000620, 0x00000000,
-0x0027a805, 0x427c0093, 0x64c109f0, 0x2c809328, 0xc0093006, 0x00930067,
-0x19f0827c, 0x9f0827c0, 0xb0067400, 0x0424d009, 0x026c009b, 0x178009f0,
-0x00000e20, 0x00000000, 0x00e58014, 0x027c009f, 0x27c00970, 0x7c009f02,
-0xc009f212, 0x409f1125, 0x89b0027c, 0x970027c0, 0xb0ca7c40, 0x0027c009,
-0x424c0097, 0x52c009f0, 0x00000600, 0x00000000, 0x00050814, 0x005c5013,
-0x04c001b0, 0x6c001300, 0xc003f008, 0x843f100f, 0x43f000fc, 0x33000fc4,
-0xa180cc00, 0x248bc0c2, 0x00c00823, 0x53c003f2, 0x00000420, 0x00000000,
-0x0014a014, 0x21c41071, 0x1c4c0711, 0xc4005100, 0x4005d04d, 0xc25d0057,
-0x05d00974, 0x51509740, 0x50095413, 0x00d5c005, 0x09440b51, 0x534217d0,
-0x00000200, 0x00000000, 0x0036a014, 0x8b1483c1, 0x74500c90, 0x0480d100,
-0x420ed04f, 0x0be5013f, 0x3ed063b4, 0xe1863b22, 0x90878410, 0x403b402e,
-0x079501e1, 0x53400ed0, 0x00000a00, 0x00000000, 0x40288005, 0x078401a1,
-0x08440610, 0x8400e144, 0x420ed003, 0x00ed043b, 0x2ed003b4, 0xf1207b44,
-0x000fd481, 0x0479400e, 0x0b9401e1, 0x17410ed0, 0x00000200, 0x00000000,
-0x006c1015, 0x079c0173, 0x58d013b0, 0x8d05f300, 0xc01ef004, 0xe1ef007b,
-0x1ef907b4, 0xe3007fc0, 0xb1078e81, 0x1033c81e, 0x879c00c3, 0x57c01ef2,
-0x00000040, 0x00000000, 0x0025b810, 0x0174001f, 0x27c009f0, 0x5c60df08,
-0x4401f000, 0x001f0007, 0x01f8007c, 0x5f000780, 0xe0007c00, 0x0807c001,
-0x806c201d, 0x43c001b8, 0x00000660, 0x00000000, 0x407fa000, 0x05fc01f3,
-0x6fc01df0, 0x4c59ff00, 0xc09ff027, 0x29f3227f, 0x1df1a77c, 0x97107704,
-0xb6277c09, 0x407cd21f, 0x07cd01f3, 0x00d01f34, 0x00000e00, 0x00000000,
-0x022d8015, 0x21bc0021, 0x538054d0, 0x2c81fd01, 0x40dcd105, 0x0dc727f2,
-0x1ed02fa6, 0x81017341, 0xb0177c19, 0x003ac00e, 0x23ac00e3, 0x54400eb0,
-0x00000620, 0x00000000, 0x00290800, 0x03b400e1, 0x0b40c2d0, 0x8404ed02,
-0x424ed853, 0x24e5823b, 0x0ed933b4, 0xa5013b44, 0x1023b404, 0x0038400e,
-0x038400e9, 0x00401e10, 0x00000400, 0x00000000, 0x00632804, 0x19101101,
-0x3140a8d0, 0x2504dd10, 0x4020d001, 0x03050083, 0x10d22c24, 0x11000340,
-0x10001401, 0x02c00000, 0x00000b01, 0x10401010, 0x00000c20, 0x00000000,
-0x01f5a815, 0x033001d3, 0xb74a29f0, 0x0c83ff00, 0xc02df103, 0x53d70277,
-0xbdf0a37c, 0xd71837c0, 0x10033401, 0x00b4020d, 0x034002da, 0x54c04c10,
-0x00000620, 0x00000000, 0x01270001, 0x077c08df, 0x07c441f0, 0x7d08df06,
-0xc1a5f213, 0x22df00b6, 0x2df0836c, 0xdf8037e0, 0xf00b7c42, 0x01b7c02d,
-0x0b7c44df, 0x07c00df0, 0x00000c00, 0x00000000, 0x802f0880, 0x03cd0273,
-0x1cc04730, 0xfc80f320, 0xc05bb200, 0x11ff00bf, 0x0ff017fc, 0xf310b242,
-0x300fcd40, 0x083bc05f, 0x07cc01e3, 0x00c00f30, 0x00000c22, 0x00000000,
-0x20222081, 0x01440155, 0x24400d50, 0x4400db00, 0x487d3000, 0x0a1d2047,
-0x11d00874, 0x55200450, 0x50004410, 0x03c74471, 0x40144211, 0x06c29151,
-0x00000802, 0x00000000, 0x00348001, 0x05464081, 0x20400810, 0x7400d108,
-0x400d9012, 0x001d8007, 0xa0d00074, 0x11000542, 0x18004400, 0x00074001,
-0x10440411, 0x04400911, 0x00000200, 0x00000000, 0x00242010, 0x01060005,
-0x10506050, 0x0480c901, 0x49041110, 0x040d1803, 0x00d02034, 0x05030140,
-0x50584464, 0x40024000, 0x00450001, 0x42400950, 0x00000080, 0x00000000,
-0x0026a000, 0x034e0091, 0xc4c07530, 0x7c07d300, 0xc0f9b0ae, 0x091f03c7,
-0x31f00c7c, 0x130047c0, 0x301c440b, 0x1003c000, 0x800c0003, 0x00c00830,
-0x00000ac0, 0x00000000, 0x002fa805, 0x00fc003f, 0xf7c89ff0, 0xfc97dd05,
-0xc01d721c, 0x0ddf2277, 0x9ff137fc, 0xbf08fec1, 0xf987fc07, 0x003fe40f,
-0x03fe00ff, 0x17c007f8, 0x00000e60, 0x00000000, 0x003fa003, 0x03cc08f3,
-0x3f440f70, 0xcc00ff00, 0xc00ff183, 0xc0ff303f, 0x0fb103c4, 0xf6183c80,
-0x3003fc40, 0x003cc00f, 0x03bcc0f3, 0x0ed40f81, 0x00000e00, 0x00000000,
-0x10070801, 0x00450411, 0x070001b0, 0x54001d00, 0xc001d000, 0x001d0005,
-0x00500054, 0x15080548, 0x12007400, 0x00044801, 0x03f40011, 0x04410f50,
-0x00000c20, 0x00000000, 0x40210015, 0x001080c1, 0x32480810, 0x0480cd20,
-0x0008d203, 0x80cd2023, 0x0c520314, 0xc1202148, 0x10033080, 0x0030400c,
-0x033400c9, 0x45404c50, 0x00000e80, 0x00000000, 0x2017a807, 0x83540011,
-0x07600510, 0x54041d00, 0x40059000, 0x001d0014, 0x41500054, 0x15101540,
-0x14106400, 0x40045001, 0x83742019, 0x0c400d50, 0x00000620, 0x00000000,
-0x001fa882, 0x03dc82b3, 0x1ec00714, 0xcc007f08, 0xc007e000, 0x003f001f,
-0x077000dc, 0x37001dc0, 0x3001fc40, 0x025cc097, 0x037c897b, 0x0bc00cb4,
-0x00000e20, 0x00000000, 0x00298007, 0x006c006f, 0xafc00bb3, 0xfc41bf00,
-0xc00bf003, 0x00ff102f, 0x1af003fc, 0xff002fc4, 0xf006fc00, 0x002fc009,
-0x03fc00b7, 0x1fc00fb1, 0x00000600, 0x00000000, 0x00050802, 0x101c4593,
-0x17c04130, 0x4c044301, 0xc041f010, 0x04030104, 0x45b0100c, 0x131100c0,
-0x30114c04, 0x0214c045, 0x233c0c5f, 0x0bc40db0, 0x00000420, 0x00000000,
-0x0174a013, 0x07440051, 0x67401d90, 0x44039100, 0xc01dd007, 0x01d10076,
-0x19100744, 0xd0007440, 0x10064401, 0x08e44019, 0x03f4209d, 0x4f400fa0,
-0x00000200, 0x00000000, 0x0072a007, 0x0b240041, 0xa2402c90, 0x34028500,
-0x402cd08b, 0x02c900b0, 0x28100b04, 0xc800b240, 0x100a4402, 0x01e44029,
-0x4334038d, 0x1e424c10, 0x00000a00, 0x00000000, 0x00408004, 0x24a401a1,
-0x5b401294, 0xa4016140, 0x4210d004, 0x0929004a, 0x161c0484, 0x29024a40,
-0x10010501, 0x00584006, 0x07a4016d, 0x13401e90, 0x00000200, 0x00000000,
-0x40201012, 0x40348453, 0x26c14834, 0x3c109704, 0xc108f043, 0x18db0424,
-0x0830434c, 0xd90626c1, 0x30720c10, 0x0020c188, 0x033c008f, 0x4bc04c30,
-0x00000040, 0x00000000, 0x001db802, 0x83dd00bf, 0x1fc00750, 0xdd807f00,
-0xc807f000, 0x2837421f, 0x057000fd, 0x174215d0, 0xf0117c08, 0x001fc047,
-0x03fc417e, 0x0bc12ff0, 0x00000660, 0x00000000, 0x40512810, 0x034d0013,
-0x44c00530, 0x4c001300, 0xc0053800, 0x00100014, 0x0130004c, 0x130015d0,
-0x32006c00, 0x2844c811, 0x0b740013, 0x56801df0, 0x00000e00, 0x00000000,
-0x0029091a, 0x008400c1, 0x38480a11, 0x8440e100, 0x480a0003, 0x00e3002a,
-0x0e120384, 0xe1202842, 0x10038480, 0x0038400e, 0x33b400e1, 0x48404fd0,
-0x00000600, 0x00000000, 0x00490000, 0x04a4112d, 0x4a401290, 0xa4612900,
-0x4012d204, 0xa1298049, 0x109084a4, 0x2d004a40, 0x10049401, 0x00484012,
-0xb7b4a121, 0x0e405ed0, 0x00000400, 0x00000000, 0x00b12812, 0x030401cd,
-0xb2406d90, 0x6406c901, 0x406dd01f, 0x07c101b1, 0x6d901f24, 0xc104b240,
-0x101b1407, 0x01b0406c, 0x033406c1, 0x48400cd0, 0x00000c20, 0x00000000,
-0x00158017, 0x016d005f, 0x96e025b8, 0x64425b00, 0xc025f00d, 0x035b0095,
-0x25b00d6c, 0x5f009640, 0x30095c43, 0x0094c025, 0x017c0273, 0x5ec005d0,
-0x00000620, 0x00000000, 0x200f0812, 0x80dc0233, 0x8dd42376, 0xdd023750,
-0x50232420, 0x083f600e, 0x037420dd, 0x3c608cc0, 0xf400e10a, 0x400fd003,
-0x087c003f, 0x4bc001d0, 0x00000c00, 0x00000000, 0x06270810, 0x020c058f,
-0x64c29930, 0x4e008f00, 0xc0093002, 0x40870860, 0x0930020c, 0x832020c0,
-0x31060c00, 0x0027c019, 0x063c009f, 0x43c00930, 0x00000c20, 0x00000000,
-0x00260001, 0x0244049d, 0x64e0293c, 0x6e009f02, 0xc129b002, 0x009b0266,
-0x09b0026c, 0x9b04a4c0, 0xb0266c12, 0x00274099, 0x2274009d, 0x07400910,
-0x00000800, 0x00000000, 0x00248018, 0x82c600fd, 0x2e500b90, 0xc450bd20,
-0x400b1002, 0x00b5002c, 0x0b1002c4, 0xb1002c40, 0x9002c400, 0x002f400b,
-0x027480b9, 0x63400910, 0x00000200, 0x00000000, 0x00282010, 0x0a8508ad,
-0xa8402e18, 0xa422a500, 0x402a100a, 0x02a100a8, 0x2a900aa4, 0xa920aa44,
-0x900aa402, 0x00ab482a, 0x023480ad, 0x43482814, 0x000000a0, 0x00000000,
-0x0006b01d, 0x0004021d, 0x12400090, 0x04000d00, 0x40001000, 0x00050000,
-0x0130000c, 0x030000c0, 0xb0000c00, 0x0003c000, 0x017c003f, 0x77c20130,
-0x00000a80, 0x00000000, 0x00a79911, 0x0a7c269f, 0xa7c029f0, 0x7c029f00,
-0xd029f40a, 0x029f10a7, 0x29f00a78, 0x9f10a5d4, 0xf00a7e02, 0x00a7c029,
-0x0a7c029f, 0x67c029f8, 0x00000e20, 0x00000000, 0x016fa018, 0x1e4c0db7,
-0x64c05930, 0x7c079301, 0xc059301e, 0x05930167, 0x79f0164c, 0x9f8167c0,
-0xf0164c05, 0x0167c059, 0x02cc0593, 0x60d06b78, 0x00000e00, 0x00000000,
-0x1287081c, 0x28400e1d, 0x8540a100, 0x5c0a1502, 0x40a15028, 0x0a152287,
-0xa1d02844, 0x1d028448, 0xd0005e0a, 0x00074001, 0x08440031, 0x704041d8,
-0x00000c20, 0x00000000, 0x0023a012, 0x12a5048d, 0x28410a14, 0xb404a144,
-0x410a1012, 0x10a5042b, 0x4a504295, 0xad042a40, 0x904a9410, 0x04ab412a,
-0x0a0502a1, 0x40406850, 0x00000e80, 0x00000000, 0x0025a818, 0x0a44009d,
-0x2d440b18, 0xf400b500, 0x404b5002, 0x00b5012e, 0x0bd202d4, 0xbd012c40,
-0xd002d400, 0x002f400b, 0x824000b1, 0x604009d8, 0x00000620, 0x00000000,
-0x00278805, 0x026c809f, 0x24c40914, 0x7c009300, 0x40093002, 0x00970027,
-0x0970025c, 0x9d0026c0, 0xb0025c00, 0x0027c009, 0x024c0093, 0x14c00970,
-0x00000e20, 0x00000000, 0x02658016, 0x167c808f, 0x23c058f2, 0x58009f00,
-0xc009f002, 0x009f0027, 0x09f0026c, 0x9f0026c1, 0xf0027c00, 0x6027c009,
-0x427c008f, 0x53c008f0, 0x00000600, 0x00000000, 0x00050814, 0x088c0013,
-0x0cc00338, 0x8c083340, 0xc0033000, 0x00230008, 0x023010fc, 0x23200fc8,
-0x2380ec00, 0x0008c203, 0x007c003f, 0x50c601f0, 0x00000420, 0x00000000,
-0x01148014, 0x11440071, 0x16c00530, 0x44015100, 0x40051001, 0x00510014,
-0x05100174, 0x51001740, 0x10015400, 0x00144005, 0x11e4005d, 0x504027d0,
-0x00000200, 0x00000000, 0xc0622014, 0x4f0400c1, 0x30500c90, 0x0500c120,
-0x500c144b, 0x80c954b0, 0x0c1e0334, 0xc1403340, 0x174b0580, 0x04b0512c,
-0x073412c9, 0x504138d0, 0x00000a00, 0x00000000, 0x08620005, 0x00848021,
-0x0a400010, 0x86012100, 0x40121240, 0x02291008, 0x02180434, 0x21104b40,
-0x11048400, 0x00084012, 0x03a4002d, 0x144022d0, 0x00000200, 0x00000000,
-0x006a1015, 0x07cd01c3, 0x40c012b6, 0x0c014320, 0xc2143007, 0x01eb0060,
-0x1e3007bc, 0x430053c0, 0x30860e81, 0x0078ca18, 0x87bc01ef, 0x54d01bf1,
-0x00000040, 0x00000000, 0x0025b810, 0x007400dd, 0x37400df1, 0x7c609f08,
-0xc009f080, 0x20171015, 0x01f0807c, 0x9f0827c0, 0xf0015c00, 0x0007c805,
-0x807c001f, 0x43c001f0, 0x00000660, 0x00000000, 0x006fa000, 0x04fc01f3,
-0x7cc09f30, 0xfe09bf00, 0xc01f3004, 0x49bf005c, 0x17f005fc, 0xff007fc0,
-0xf005f801, 0x025f0417, 0x07fc017f, 0x00c017f0, 0x00000e00, 0x00000000,
-0x06298815, 0x03fc0020, 0x0905c210, 0xb40c6d02, 0xc0825213, 0x486d222b,
-0x8ad062b0, 0x2d220b40, 0xd022b408, 0x0a2a448a, 0x23b480af, 0x56d006d2,
-0x00000620, 0x00000000, 0x00290000, 0x00b400e9, 0x08000010, 0xa6402d00,
-0x40065000, 0x00ad0008, 0x06d00190, 0x6d001b40, 0xd000b400, 0x181b4002,
-0x03b4016d, 0x004004d0, 0x00000400, 0x00000000, 0x50e32804, 0x03540cc9,
-0xb1443c10, 0x3403cd82, 0x4038510f, 0x014d02f3, 0x28d00e24, 0x8d02e340,
-0xc0af340b, 0x026208bc, 0x00308a85, 0x124204d0, 0x00000c20, 0x00000000,
-0x02e7a815, 0x177422db, 0x34401d34, 0x6413df00, 0xc139704f, 0x115d00b4,
-0xf9f0067c, 0x9f00a7c0, 0xd00b7402, 0x00a7002d, 0x0330009d, 0x54c00dd0,
-0x00000620, 0x00000000, 0x00218001, 0x407c0217, 0x03c100f0, 0x7c041f14,
-0xc045e010, 0x129f0105, 0x04f0413c, 0x5f0117c0, 0xf0107c04, 0x0116c041,
-0x037c104f, 0x05c005f0, 0x00000c00, 0x00000000, 0x00e50880, 0x03ec0133,
-0x0cc00330, 0x0c006300, 0xc0003003, 0x00630028, 0x0b300ecc, 0x2380c8c0,
-0x30028c03, 0x0028c00a, 0x03cc00b3, 0x03c00f30, 0x00000c22, 0x00000000,
-0x00260081, 0x00440b14, 0x36c20d40, 0x44009100, 0x420d0000, 0x12990014,
-0x05100564, 0xd1007442, 0x10814421, 0x08144205, 0x60448051, 0x074015f2,
-0x00000802, 0x00000000, 0x0024a001, 0x006482c0, 0x34400d10, 0x44209100,
-0x40891000, 0x001d0014, 0x81100064, 0x91002440, 0x10016400, 0x02044005,
-0x00640811, 0x07404510, 0x00000200, 0x00000000, 0x80202010, 0x03146001,
-0x02500014, 0x04604140, 0x40041003, 0x00c94020, 0x0c140324, 0x41401040,
-0x14020500, 0x40305008, 0x000500c1, 0x43400490, 0x00000080, 0x00000000,
-0x4026b000, 0x006c8013, 0x04c00134, 0x4d001300, 0xd0013400, 0x00170004,
-0x0130004d, 0x110004d0, 0x38806c00, 0x0004e201, 0x004e8013, 0x03c40530,
-0x00000ac0, 0x00000000, 0x003fb805, 0x03ee003e, 0x3fc00ff0, 0xfc00ff00,
-0xc00fc003, 0x00f7003f, 0x0ff003dc, 0xfc003fc0, 0xf803fe00, 0x003fe00f,
-0x03fe00ff, 0x17c007f8, 0x00000e60, 0x00000000, 0x050da003, 0x60bc20ff,
-0x36c103b0, 0xfc881307, 0xc801f273, 0x18d30337, 0x0f700bcc, 0xf3023fc0,
-0x3003c400, 0x003dc00f, 0x02cc00f3, 0x0c400bf0, 0x00000e00, 0x00000000,
-0x00870801, 0x1b7400c7, 0xbf402110, 0x74041108, 0x4005d11b, 0x02f52307,
-0x4f100bc4, 0x11003f40, 0xf0034000, 0x02bc420f, 0x83450055, 0x054009d0,
-0x00000c20, 0x00000000, 0x00032011, 0x003414cd, 0x31614012, 0x34040500,
-0x40005013, 0x00c10103, 0x0c949b14, 0x11413349, 0x91030500, 0x0030400c,
-0x03260041, 0x465608d0, 0x00000e80, 0x00000000, 0x8085a803, 0x537400d5,
-0x33606190, 0x760a9100, 0x4805d807, 0x00c11037, 0x0d908347, 0x91003744,
-0xd1034674, 0x0034600d, 0x136400d5, 0x0f4009d9, 0x00000620, 0x00000000,
-0x00e78802, 0x007c40df, 0x36c23db4, 0x7c031510, 0x81b97103, 0x00d14037,
-0x0df20346, 0x030037c0, 0xb0034801, 0x0030d40c, 0x076c1a93, 0x02c009f0,
-0x00000e20, 0x00000000, 0x013d8007, 0x06bc00ff, 0x36401f72, 0x6c013f40,
-0xc80ff083, 0x00ff000f, 0x0f7003bc, 0x7f0037c0, 0xb003ae81, 0x003ec20f,
-0x03dc003f, 0x1dc008f0, 0x00000602, 0x00000000, 0x00250802, 0x104c00d7,
-0x35c12db0, 0x5d005300, 0xc089b103, 0x00da0007, 0x0db0037c, 0xd74032c0,
-0x34037c02, 0x0234c00d, 0x034c008f, 0x08d019f0, 0x00000420, 0x00000000,
-0x0034a013, 0x0a440add, 0x3dc03d10, 0x4400d100, 0x401d1903, 0x00fd0037,
-0x0f1203f4, 0xdb003c42, 0x1003f400, 0x007c19af, 0x3f4481dd, 0x4c400bd0,
-0x00000200, 0x00000000, 0x8012a007, 0x000409c1, 0x33608098, 0x2600c100,
-0x42701603, 0x80cd1035, 0x0cd08324, 0x05003240, 0x18033625, 0x0832180c,
-0x0f2401cd, 0x0c4008d0, 0x00000a00, 0x00000000, 0x80488004, 0x05a501ed,
-0x79405a10, 0xa401e100, 0x401a5807, 0x41ed034b, 0xdc002734, 0xed527840,
-0x1137b415, 0x007a009c, 0x07a401cd, 0x08409ad0, 0x00000200, 0x00000000,
-0x01301012, 0x000c00c3, 0x71c614b0, 0x2c251340, 0xc0501007, 0x45cf0843,
-0x5ce1173c, 0x470372c0, 0x32177c0d, 0x0032d00c, 0x232c104f, 0x58d008f0,
-0x00000040, 0x00000000, 0x002db802, 0x01dc80fe, 0x37e00db2, 0x5c08bf02,
-0xc0893023, 0x08df0037, 0x0fd023fc, 0xdb0a37c0, 0xf0037c00, 0x00bdc02f,
-0x03dc02fd, 0x0bc00bf0, 0x00000660, 0x00000000, 0x8017a015, 0x037c20df,
-0xb7c001f0, 0x4c01cb01, 0xe0057003, 0x40d22034, 0x2d00234c, 0x9305b4c3,
-0x74037800, 0x0334c04d, 0x4b4c00db, 0x54c099f0, 0x00000e00, 0x00000000,
-0x00198812, 0x039c80ed, 0x39c00a70, 0xce80ed04, 0x040e100b, 0x0ce00808,
-0x2e102384, 0xe1003fc0, 0x500bcc00, 0x0132c04c, 0x038500f1, 0x59400ad0,
-0x00000620, 0x00000000, 0x00790003, 0x479441ed, 0x796016d8, 0x84017502,
-0x60165007, 0x09c91040, 0x5c101724, 0xe10a7844, 0x1017b041, 0x007a409e,
-0x0f8541a9, 0x0c4048d0, 0x00000402, 0x00000000, 0x00b32812, 0x075400dd,
-0x3148fc5a, 0x4408cd00, 0x603c1003, 0x40c9c034, 0x0c100324, 0xc1203740,
-0x51030413, 0x0032420c, 0x030400d9, 0x494008d1, 0x00000c20, 0x00000000,
-0x009da817, 0x09dc005f, 0x15c007d0, 0xcc017e08, 0xc0467000, 0x005b001c,
-0x053001ec, 0x62001462, 0x10017c07, 0x0016c005, 0x054c0c5b, 0x5ce204f0,
-0x00000620, 0x00000000, 0x10070012, 0x405c001f, 0x05c00170, 0x5c021f00,
-0xc001f800, 0x00170007, 0x01f0801c, 0x1f0006e8, 0xf0006c00, 0x0007c001,
-0x087d0217, 0x4bc001f0, 0x00000c00, 0x00000000, 0x14230810, 0x024c009f,
-0x25c04970, 0x6c219f00, 0x0109b004, 0x009300a5, 0x08700244, 0x9b1024c0,
-0x30026c08, 0x0220c008, 0x074800d3, 0x40c009f0, 0x00000c20, 0x00000000,
-0x00262201, 0x0a450091, 0x24482910, 0x74039d00, 0xc0495026, 0x80915066,
-0x09100244, 0x91482540, 0x14025403, 0x20645009, 0x1a441a9b, 0x044019d0,
-0x00000800, 0x00000000, 0x0024a018, 0x0a448191, 0x24402810, 0x54049d10,
-0x40091002, 0x00810424, 0x09500254, 0x91002440, 0x10020402, 0x40244089,
-0x12550091, 0x604419d2, 0x00000200, 0x00000000, 0x40202010, 0x22040881,
-0x20508814, 0x34088982, 0x40095022, 0x28810222, 0x88122215, 0x81022140,
-0x100a1400, 0x2320600c, 0x02140889, 0x404088d0, 0x00000080, 0x00000000,
-0x2506b01d, 0x58442217, 0x85c16170, 0x5c025f05, 0xc0013058, 0x16130584,
-0x2142585c, 0x1b0584e0, 0x32004c80, 0x00c4d001, 0x005d1613, 0x74c021f0,
-0x00000ac0, 0x00000000, 0x002fb819, 0x92fc049f, 0x27c04bf8, 0xfc04bf11,
-0xc20af110, 0x049f012e, 0x69e0126c, 0xbf012780, 0xfc0a7c00, 0x4327c029,
-0x026c0496, 0x67c06bf0, 0x00000e60, 0x00000000, 0x80379018, 0x02fc02bf,
-0x24418b30, 0xcc00bf00, 0xc80b10c7, 0x0293002d, 0x8990326c, 0xbb0124c1,
-0x30e27400, 0x40a0c04b, 0x028d06b3, 0x64c143f0, 0x00000e00, 0x00000000,
-0x1007001c, 0x0874001d, 0x04d02114, 0x04000d11, 0x08015008, 0x0a114000,
-0x01140804, 0x55008540, 0xb4006440, 0x03854021, 0x00440653, 0x704031d0,
-0x00000c22, 0x00000000, 0x00a3a010, 0x0a34008d, 0xa24048d0, 0x46009d24,
-0x40090202, 0x80918021, 0x48101a64, 0x89872040, 0x91123620, 0x10204888,
-0x02240289, 0x405008d0, 0x00000e80, 0x00000000, 0x20a5a818, 0x0274009d,
-0x244049d2, 0x44009d00, 0x46091802, 0x80910020, 0x08100264, 0x95002564,
-0x94826400, 0x20254009, 0x12640491, 0x604209d0, 0x00000620, 0x00000000,
-0x0027a805, 0x027c809d, 0x26c009f4, 0x45188d00, 0xe0081206, 0x00919125,
-0x0920026e, 0x9b2024e0, 0xb2027c03, 0x0024d009, 0x026c029b, 0x14c009f0,
-0x00000e20, 0x00000000, 0x00258014, 0x027c009f, 0x27c00930, 0x5c019f00,
-0xc009f512, 0x009f0127, 0x0970025e, 0x9f5023c0, 0xf0022c44, 0x0033c109,
-0x425c009f, 0x53c000f0, 0x00000600, 0x00000000, 0x00050814, 0x005c041f,
-0x04c04170, 0x6c821220, 0xc001b000, 0x001b1007, 0x0132005c, 0x1f000480,
-0x32004c86, 0x0004d000, 0x004c0213, 0x50c00130, 0x00000420, 0x00000000,
-0x0014a014, 0x05f4117d, 0x144067d0, 0x8c807110, 0x40171209, 0x0051011f,
-0x05100104, 0x75001546, 0xf0014540, 0x04555007, 0x09c48871, 0x52c00110,
-0x00000200, 0x00000000, 0x0032a014, 0x077401cd, 0x30502d10, 0x2409c180,
-0x420cd81b, 0x00d10133, 0x0c510306, 0xc5103260, 0x10032402, 0x806242bc,
-0x0b040a91, 0x50400c10, 0x00000a00, 0x00000000, 0x00388005, 0x41b4006d,
-0x7a400cd8, 0xa400e101, 0x402e1103, 0x04e1003b, 0x8e508384, 0xf1013340,
-0x9013a411, 0x002b400c, 0x838400a1, 0x1640ac10, 0x00000200, 0x00000000,
-0x00780015, 0x079c21af, 0x7ce41672, 0xac812340, 0xc416f106, 0x09f1404b,
-0x5c72078c, 0xe723fac1, 0x3017e401, 0x407ac81e, 0x038d01f3, 0x54c05e30,
-0x00000040, 0x00000000, 0x0035a810, 0x817c405f, 0xb56209f8, 0x5c801f07,
-0xc0057202, 0x0ed50007, 0x6d900b78, 0xc50035c0, 0xf45b5c00, 0x24b5c00d,
-0x037d009f, 0x43c00df0, 0x00000660, 0x00000000, 0x007fa000, 0x26fa81f3,
-0x7cc09b32, 0xdc019202, 0xc09e3015, 0xc9f3004d, 0x1d306f4c, 0xf3007dc8,
-0xb067cc01, 0x007cd01f, 0x078c01ff, 0x0bc81f30, 0x00000e20, 0x00000000,
-0x00398815, 0x209c022b, 0x7ac054b0, 0x0441bb02, 0x40da116d, 0x41f00048,
-0x1d502744, 0x81027040, 0x50172c01, 0x003ac006, 0x2bac04fd, 0x57408eb0,
-0x00000620, 0x00000000, 0x00310000, 0x423408a1, 0x3a400010, 0x94006c20,
-0x49c61000, 0x00e1043b, 0x0e9003a5, 0x61813948, 0x10138430, 0x0038400a,
-0x43c4006d, 0x23400e10, 0x00000400, 0x00000000, 0xa0732804, 0x00144009,
-0x32402091, 0x04024000, 0x40001100, 0x00c10072, 0x0cc20324, 0x01403060,
-0xd2032600, 0x20325200, 0x0724100d, 0x1b400c90, 0x00000c00, 0x00000000,
-0x0435a815, 0x0a7c00d1, 0x3cc02d30, 0x54885c40, 0x40193104, 0x40f34077,
-0x0fbd03ec, 0xd1103d40, 0xb003cc00, 0x0024c00c, 0x870401df, 0x57800d30,
-0x00000600, 0x00000000, 0x00370001, 0x1a5c00df, 0x33c24df0, 0x7cc05f10,
-0xc041f808, 0x00cf2031, 0x0d70035c, 0x5f0033c2, 0x72037c86, 0x0037c029,
-0x037c01df, 0x27c00df0, 0x00000c00, 0x00000000, 0x003f0880, 0x20fc00b7,
-0x3fc007f0, 0xcd00b300, 0x821bf801, 0x00f70406, 0x0ef003cc, 0xb7003ec0,
-0x2003fc03, 0x003cc055, 0x07cd00f3, 0x04c03e30, 0x00000c00, 0x00000000,
-0x08362081, 0x0c7400dd, 0x374009d0, 0x44469500, 0x4031d889, 0x80d14007,
-0x0dd20354, 0x1b403448, 0x50037006, 0x00354021, 0x0e540185, 0x84501d50,
-0x00000802, 0x00000000, 0x0034a001, 0x4354005d, 0x37420990, 0x44200980,
-0x414dd012, 0x00d10004, 0x0dd00346, 0xd5003648, 0x50032400, 0x0230402d,
-0x1345c1d1, 0x04400d10, 0x00000220, 0x00000000, 0x00302010, 0x0334000d,
-0x3340c4d0, 0x04040143, 0x4880d012, 0x2cc56803, 0x0cd81b16, 0x0908b002,
-0x59133010, 0x00314000, 0x011400c5, 0x40400c50, 0x00000080, 0x00000000,
-0x0036b000, 0x015c0017, 0x7bc051f0, 0x0c07db00, 0xc11dd02f, 0x01f302f6,
-0xdff217cc, 0x1781fac9, 0x703fbc2f, 0x0034c001, 0x034c0053, 0x04c00d30,
-0x00000ac0, 0x00000000, 0x003fb805, 0x01fc403f, 0x77c0d1f0, 0x7c1dff8b,
-0xc051f19f, 0x0ddb08f7, 0x1ff01ffc, 0xcf09f7c0, 0xf0277c05, 0x003fc00f,
-0x02fc803f, 0x17c00ff0, 0x00000e60, 0x00000000, 0x002f8003, 0x18ec00ff,
-0x0fc14330, 0xfc08ff00, 0xc00fb003, 0x00f3203c, 0x0f3003ec, 0xf3003fc0,
-0x7003cc00, 0x183cc00f, 0x03dc00fb, 0x0cc00f30, 0x00000e00, 0x00000000,
-0x08270801, 0x314450dd, 0x34402110, 0x74041d00, 0x40011100, 0x00114004,
-0x01140045, 0x11400744, 0x11804500, 0x00045001, 0x00450011, 0x04400f10,
-0x00000c20, 0x00000000, 0x0023a011, 0x002004cd, 0x02400050, 0x34044d00,
-0x400cd000, 0x00890021, 0x08500214, 0xc1002340, 0x14021400, 0x40304a08,
-0x012400c5, 0x45640c14, 0x00000e80, 0x00000000, 0x2425a803, 0x084400dd,
-0x14400154, 0x74009d00, 0x60015303, 0x22490010, 0x05504114, 0x01341340,
-0x52011420, 0x00004804, 0x8224a005, 0x0d400c12, 0x00000620, 0x00000000,
-0x0067a802, 0x006c00df, 0x46c8dd70, 0x7c01df11, 0xd015f003, 0x22db0cb5,
-0x05700b7c, 0x5310b7c8, 0x30015c01, 0x0004c005, 0x276c129f, 0x09500d30,
-0x00000e20, 0x00000000, 0x016d8007, 0x237c20cf, 0x7ec00bb0, 0x7c081f12,
-0xc489b000, 0x00172007, 0x09b00064, 0x9f1007c9, 0xb0426c08, 0x0437c509,
-0x044c005b, 0x1ec10ff0, 0x00000600, 0x00000000, 0x00650802, 0x000c40df,
-0x07c00530, 0x4c005304, 0xc0453000, 0x129304a4, 0x0130127c, 0x530124c2,
-0x30004c00, 0x0804c481, 0x014c0293, 0x0ac08d30, 0x00000420, 0x00000000,
-0x10a4a013, 0x464404fd, 0x17400110, 0x6c119140, 0xc109b003, 0x025b0456,
-0x3db0156c, 0x9b0496c1, 0xb0136c09, 0x04f6c02d, 0x066c045b, 0x4c422fb0,
-0x00000200, 0x00000000, 0x0102a007, 0x020407cd, 0x02400191, 0x64008102,
-0x04391003, 0x0a490092, 0x0c900904, 0x8900d040, 0x10032401, 0x0072400c,
-0x4a341141, 0x1c400c10, 0x00000a00, 0x00000000, 0x00488004, 0x058501ed,
-0x6b621698, 0xa6016180, 0x60169824, 0x21a9806a, 0x1298a6a6, 0x69826a60,
-0x9804a609, 0x024a6092, 0xc5a409a9, 0x10401c90, 0x00000200, 0x00000000,
-0x00001012, 0x230420cd, 0x27400894, 0x24000102, 0x40081020, 0x04091002,
-0x08900014, 0x89000040, 0x30022c10, 0x0032c008, 0x103c0043, 0x48d08c30,
-0x00000040, 0x00000000, 0x000db802, 0x01fd00ff, 0x2fc00f70, 0xfc00ff02,
-0xc087f023, 0x00ff023f, 0x07f003fc, 0x7f0037c0, 0xf001fc00, 0x000fc007,
-0x07fc00bf, 0x09c08ff0, 0x00000660, 0x00000000, 0x0007a015, 0x824d00df,
-0x16c01df1, 0x6c019f20, 0xc0013007, 0x015b0014, 0x1530054c, 0x1b0856c0,
-0x30054c41, 0x0044c015, 0x064c0113, 0x57c04d30, 0x00000e00, 0x00000000,
-0x20098812, 0x038402ed, 0x38500fd0, 0x14004d00, 0x400c5000, 0x008d0029,
-0x08500214, 0xc5002140, 0x50021400, 0x00314008, 0x011400c5, 0x4b092e50,
-0x00000620, 0x00000000, 0x00690003, 0x078405ed, 0x79401ed0, 0x84012d80,
-0x60125004, 0x012d0048, 0x12500484, 0x25004840, 0x10049401, 0x00494012,
-0x04840125, 0x0f025e10, 0x00000400, 0x00000000, 0x00332812, 0x0b4400dd,
-0x31402cd0, 0x1400cd00, 0x640c5003, 0x00cd0031, 0x0c500314, 0xc5083140,
-0x50031400, 0x1071400c, 0x031601c5, 0x4b400c50, 0x00000c20, 0x00000000,
-0x009da817, 0x81cc005f, 0x1fc137f0, 0x6c005f01, 0xc8857001, 0x005d0014,
-0x8570014c, 0x5f0816c0, 0x30215c08, 0x0615c085, 0x01cc1057, 0x5fc60530,
-0x00000620, 0x00000000, 0x20c70012, 0x407c021f, 0x064101f0, 0xdc003f00,
-0xc003d000, 0x003f000b, 0x03e000fc, 0x3f008fc0, 0xf008fc80, 0x000fc003,
-0x00fc023f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x00270810, 0x064c009f,
-0x27c00970, 0x7c019f00, 0xc049f102, 0x00932024, 0x19f0027c, 0x9f0067c0,
-0xf0267c00, 0x00a7c029, 0x1674089f, 0x43c409f2, 0x00000c20, 0x00000000,
-0x04a62001, 0x0644079d, 0x27400910, 0x74089d00, 0x5129d002, 0x1b9b06e4,
-0x19d06e74, 0x9d00a641, 0xd0027402, 0x00274009, 0x0a74249d, 0x0740a9d0,
-0x00000800, 0x00000000, 0x0024a018, 0x9244889d, 0x27400950, 0xf6009d00,
-0x400ad002, 0x00b1002c, 0x4bd002f4, 0xb901af40, 0xd042f418, 0x002f400b,
-0x42e400bd, 0x634029d0, 0x00000200, 0x00000000, 0x00202010, 0x2204488d,
-0x33408812, 0xb488ad02, 0x402ad0a2, 0x42a900a8, 0x2ad00ab4, 0xad30aa40,
-0xd00ab402, 0x00bb402e, 0x0ab402ad, 0x434028d0, 0x00000080, 0x00000000,
-0x0006b01d, 0x584d020f, 0x87c56150, 0x7c021f05, 0xc001f008, 0x00130004,
-0x01f0007c, 0x1f0007c0, 0xf0007c00, 0x0007c001, 0x00fc001f, 0x77c001f0,
-0x00000ac0, 0x00000000, 0x002fb819, 0x12fc069f, 0x2f404bd0, 0x7c869d01,
-0x4429d01a, 0x029d00a7, 0x29d00a74, 0x9d00a740, 0xd00a7402, 0x00a74029,
-0x0a7c829f, 0x67c029f0, 0x00000e60, 0x00000000, 0x003fa018, 0x52cc04ba,
-0x2c0589f2, 0xfc049302, 0xc069f012, 0x849f1024, 0x29f0125c, 0x9f01a4c0,
-0xf01a7c06, 0x0427c029, 0x027c549f, 0x60c049f0, 0x00000e00, 0x00000000,
-0x0007081c, 0x0844061d, 0x844001d0, 0x74001102, 0x4061d118, 0x161d2584,
-0x61d05074, 0x1d018440, 0xd0187406, 0x00074061, 0x5874161d, 0x704143d0,
-0x00000c20, 0x00000000, 0x0063a010, 0xc2041289, 0x204048d1, 0x36568101,
-0x402a5062, 0x08ad00a9, 0x6ad00ab4, 0xad032850, 0xd00ab408, 0x042b402a,
-0x0ab400ad, 0x40402ad0, 0x00000e80, 0x00000000, 0x0025a818, 0x0245009d,
-0x240609d0, 0x74009100, 0x4009d002, 0xa0bd002d, 0x0ed002f4, 0xbd002c40,
-0xd002f480, 0x002f400b, 0x03f400fd, 0x60400bd0, 0x00000620, 0x00000000,
-0x02e7a805, 0x024c009b, 0x249049f0, 0x7c109341, 0xd009706a, 0x289f2025,
-0x19f0225c, 0x9f1224c0, 0xf0067ca0, 0x0027c019, 0x4274009f, 0x14d009f0,
-0x00000e20, 0x00000000, 0x00658014, 0x127c008f, 0x23c208f0, 0x7c00df00,
-0xc009f002, 0x009f10e6, 0x49f0027c, 0x9f0427c2, 0xf0127c00, 0x0027c049,
-0x027c809f, 0x53c009f0, 0x00000600, 0x00000000, 0x03050814, 0x104c201f,
-0x06c001f0, 0x7c201f00, 0xc0037008, 0x003f000f, 0x83f000fc, 0x3f020fc2,
-0xf000fc00, 0x010fc003, 0x00fc183f, 0x505003f0, 0x00000420, 0x00000000,
-0x005ca014, 0x09c5007d, 0x5c4005d0, 0x74015d04, 0x00151001, 0x035d0117,
-0x05d00574, 0x5d001740, 0xd0097403, 0x001740a5, 0x1d74035d, 0x504007d0,
-0x00000200, 0x00000000, 0x0012a014, 0x030510cd, 0x33400cd0, 0x34004d00,
-0x401f5002, 0x0ded04bb, 0x2ed013b4, 0xed007b41, 0xd063b413, 0x02bb408e,
-0x1bb401ed, 0x50409fd0, 0x00000a00, 0x00000000, 0x00088005, 0x038400cd,
-0x39404ed1, 0xb4426d00, 0x442e1206, 0x00ed003b, 0x0ed043b4, 0xed203b40,
-0xd003b430, 0x003b400e, 0x03b400ed, 0x14400cd0, 0x00000200, 0x00000000,
-0x00581015, 0x078c012f, 0x5bc01ff1, 0xfc016f00, 0xc01e601e, 0x01ef007b,
-0x1ef007bc, 0xef007bc0, 0xf007bc01, 0x207bc01e, 0x07bc81ef, 0x54c01ef0,
-0x00000040, 0x00000000, 0x0005b810, 0x027c00df, 0x36c08df0, 0x7c121f00,
-0xc001f002, 0x001f0007, 0x01f0007c, 0x5f0007c0, 0xf0007c00, 0x0007c801,
-0x007c001f, 0x43c601f0, 0x00000660, 0x00000000, 0x004ba000, 0x07ec01f3,
-0x7cc21f30, 0x8c097340, 0xc01f3206, 0x01ff207f, 0x1ff007fc, 0xbf007fc0,
-0xf227fc01, 0x027fc09f, 0x07fc01ff, 0x03401ff0, 0x00000e00, 0x00000000,
-0x22098815, 0x83844061, 0x28420eb0, 0x84006100, 0x400e1402, 0x00ed023b,
-0x8ed003b4, 0xad003b41, 0xd003b408, 0x083b402e, 0x23a400ed, 0x57400ed0,
-0x00000620, 0x00000000, 0x040d0000, 0x03a40021, 0x18400c10, 0x80406100,
-0x400a1002, 0x00ed003b, 0x0ed003b4, 0xad003b40, 0xd103b400, 0x103b480e,
-0x43b400ed, 0x03401ed0, 0x00000400, 0x00000000, 0x00232804, 0x32042041,
-0x60421d90, 0x44070110, 0x40f51066, 0x111d03c7, 0x01d04474, 0x1d01c641,
-0xd0087411, 0x01874071, 0x18641b1d, 0x134000d0, 0x00000c20, 0x00000000,
-0x0005a815, 0x036800d3, 0xe4c05f30, 0xcd005200, 0xc01d300e, 0x40df2077,
-0x0df10b7c, 0xdf0037c4, 0xf1037c02, 0x0137c00d, 0x0b7801df, 0x57c00df0,
-0x00000620, 0x00000000, 0x00070001, 0x037c009f, 0x13c00df0, 0x7c085f02,
-0xc005f002, 0x0adf00b7, 0x2df02b7c, 0xdf0237c0, 0xf0bb7c0a, 0x00b7c08d,
-0x0b6cc0df, 0x07c00df0, 0x00000c00, 0x00000000, 0x00cf0880, 0x03dd0903,
-0x0dc00ff0, 0xfc007304, 0xc00f7002, 0x05f3013c, 0x4f3027cc, 0xf3003cc0,
-0x3007cc00, 0x003cc00f, 0x23cc03f3, 0x03c00f30, 0x00000c22, 0x00000000,
-0x00422081, 0x02440191, 0x55400dd0, 0x74081102, 0x40691002, 0x031100c4,
-0x21101c44, 0x5100c440, 0x10044446, 0x02044011, 0x88442211, 0x07409111,
-0x00000802, 0x00000000, 0x0004a001, 0x895400d1, 0x25420dd0, 0x74001100,
-0x400d5002, 0x02110c04, 0x01100044, 0x11028440, 0x12504400, 0x04044881,
-0x00440011, 0x07400910, 0x00000200, 0x00000000, 0x20002010, 0x01040001,
-0x40500cd0, 0x34000100, 0x42041002, 0x00010000, 0x00100004, 0x01000048,
-0x10000400, 0x00004000, 0x00040001, 0x43400810, 0x00000080, 0x00000000,
-0x0006b000, 0x011c0013, 0x01c00df0, 0x7c000340, 0xc0097002, 0x00130004,
-0x0131004c, 0x130004c0, 0x32004c00, 0x0004c401, 0x004c0013, 0x03c00930,
-0x00000ac0, 0x00000000, 0x002fb805, 0x00fc003f, 0x0fc00ff0, 0xfc003f00,
-0xc00ff002, 0x00ff003f, 0x0ff003fc, 0xbf203fc0, 0xf003fc00, 0x003fc00f,
-0x03fc00ff, 0x17c007f0, 0x00000e60, 0x00000000, 0x000fa003, 0x10fcc433,
-0x35c001b0, 0x7c5cff07, 0xc04d7272, 0x00d32337, 0xc33070cc, 0xdb40b4c1,
-0xf0137c08, 0x003dc003, 0x01c8003f, 0x0cc00bf0, 0x00000e00, 0x00000000,
-0x43170801, 0x5b741201, 0x3c448510, 0xf406fd10, 0x41ec041a, 0x06f103b7,
-0x21500a44, 0xd5103d40, 0xd0237462, 0x00334809, 0x0144005d, 0x045009d0,
-0x00000c20, 0x00000000, 0x0423a011, 0x20140c81, 0x30400810, 0x5444cc20,
-0x400c0082, 0x12c10137, 0x4c100004, 0xc1113144, 0xd0833406, 0x08334000,
-0x0324000d, 0x444209d0, 0x00000e80, 0x00000000, 0x0035a803, 0x0b341891,
-0x34480512, 0x7400dd18, 0x400d1402, 0x00d10077, 0x8d500244, 0xd5003548,
-0xd0037400, 0x00374009, 0x2b64039d, 0x0c4009d0, 0x00000620, 0x00000000,
-0x0287a802, 0x047c0353, 0x34d011b4, 0x3c80df00, 0xc09d3002, 0x00d30037,
-0x1930074d, 0xd35034c0, 0xf0037c20, 0x0035c015, 0x0c6d035f, 0x08c008f0,
-0x00000e20, 0x00000000, 0x0c458007, 0x17fc117f, 0x3ec08af2, 0x7c00ff00,
-0xc00fb102, 0x00cf083f, 0x0bf027bc, 0xff003bc0, 0xf003fc50, 0x003fe05f,
-0x44dc006f, 0x1fc00bf0, 0x00000600, 0x00000000, 0x40850802, 0x405d0313,
-0x35f00970, 0x5d00df18, 0xc00d7c02, 0x00d30035, 0x0cf0034c, 0xd34037c0,
-0x30037c00, 0x0234c005, 0x025d0213, 0x08c009f0, 0x00000420, 0x00000000,
-0x0044a013, 0x1b440011, 0xbc400950, 0xe480fd02, 0x400db802, 0x0af10030,
-0x0dd00344, 0xfb103f4a, 0x5003f400, 0x02fd400d, 0x4644651b, 0x4ec00bd0,
-0x00000200, 0x00000000, 0x0006a007, 0x0c040201, 0x30400010, 0x24c0cd00,
-0x400c9082, 0x80c10031, 0x04d10104, 0xc1003348, 0x50033480, 0x80704000,
-0x05042081, 0x1c4008d1, 0x00000a00, 0x00000000, 0x00588004, 0x24040921,
-0x7a60d650, 0xa409ed00, 0x405e1036, 0x15e10278, 0x16d007a6, 0xe90a7340,
-0x5087b429, 0x0079401a, 0x05810069, 0x12401ad0, 0x00000200, 0x00000000,
-0x06a01012, 0x021c08c1, 0x71e09970, 0x1c45df03, 0xc01cd006, 0x01c30371,
-0x5cd0150c, 0xc34373c0, 0x70077405, 0x0030e041, 0x021e08d3, 0x48c009f0,
-0x00000040, 0x00000000, 0x103db802, 0x02fc28ff, 0x3dcc05f0, 0x5c00ff00,
-0xc50ff8a2, 0x8afe0c3b, 0xcdf02358, 0xdf0237c0, 0xf0037c28, 0x003fc00f,
-0x02fd60ff, 0x0bc00bf0, 0x00000660, 0x00000000, 0x0037a015, 0x014c00df,
-0x34ca0530, 0x4c04df05, 0xc00d3012, 0x02d33037, 0x0d30076d, 0xd30534c2,
-0x31034c41, 0x2037c005, 0x004c41df, 0x57c009f0, 0x00000e00, 0x00000000,
-0x00398812, 0x01c480ed, 0xb8600f10, 0xc516ed00, 0x400eb02a, 0x06c1213b,
-0x0f108314, 0xe1013848, 0x101bc424, 0x103b410e, 0x0084006d, 0x4b402ad0,
-0x00000620, 0x00000000, 0x00f90003, 0x078601c5, 0x78411e10, 0x8405cd01,
-0x405e1096, 0x81e1187b, 0x1e904784, 0xe1027840, 0x9007840d, 0x027b4012,
-0x0c8400cd, 0x0f401ad0, 0x00000400, 0x00000000, 0x00f32812, 0x230402dd,
-0x34400d15, 0x0400cd20, 0x400c9002, 0x00c10033, 0x0c104304, 0xc1003040,
-0x91030400, 0x2033420c, 0x1004014d, 0x4b4008d0, 0x00000c20, 0x00000000,
-0x00dda817, 0x05cd057f, 0x14d42732, 0xcc005f00, 0xc0013001, 0x4053400f,
-0x87b301cc, 0x534014c2, 0xb0014c00, 0x1017c805, 0x05cc027f, 0x5fc005f0,
-0x00000620, 0x00000000, 0x01070012, 0x807c001f, 0x07c101f0, 0x3c201f00,
-0xc001f000, 0x001f0007, 0x01f0005c, 0x1f0003c0, 0x75007c02, 0x0006c081,
-0x087c8c1f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x00270810, 0x0a0c109f,
-0x64d00930, 0x4c009302, 0xc000b002, 0x00934000, 0x09f0024c, 0x930026ca,
-0x71023c02, 0x0267c00d, 0x024c088f, 0x40c008f0, 0x00000c20, 0x00000000,
-0x04262001, 0x0a44019d, 0xa5400912, 0x44409150, 0x40091002, 0x00912024,
-0x09d00244, 0x91002448, 0x10027403, 0x20274009, 0x1a44419d, 0x054009d0,
-0x00000800, 0x00000000, 0x0024a018, 0x42440a9d, 0xa5400910, 0x64408120,
-0x40099202, 0x00812024, 0x08d00244, 0x91002640, 0x10027400, 0x20a74209,
-0x2264009c, 0x604009d0, 0x00000200, 0x00000000, 0x02202010, 0x2205288d,
-0x2151c814, 0x25888100, 0x50881022, 0x08810820, 0x88d02207, 0x81022040,
-0x18a23408, 0x15234028, 0x0225088d, 0x414008d0, 0x00000080, 0x00000000,
-0x2586b01d, 0x584c361f, 0x05d06131, 0x6c361305, 0xc361b0d8, 0x16130500,
-0x61f0584c, 0x434582c1, 0x74587c16, 0x0107c941, 0x006c161f, 0x74c001f0,
-0x00000ac0, 0x00000000, 0x012fb819, 0x12fc04bf, 0x27c04bf2, 0xdc049f05,
-0xc843f012, 0x849f050f, 0x4bf012fc, 0x9f0127c0, 0xf3127c04, 0x0527c009,
-0x02dc04bf, 0x67c16bf0, 0x00000e60, 0x00000000, 0x00af2018, 0x02fc02b3,
-0xaec049f0, 0x4c849301, 0x403f3202, 0x02b3007c, 0x69f0024c, 0xb31627c9,
-0xf012cc0c, 0x40a6c129, 0x024c12b3, 0x60c14930, 0x00000e00, 0x00000000,
-0x0007081c, 0x1874001b, 0x044000d2, 0x6c061141, 0x50201050, 0x04110084,
-0x60d2a854, 0x15008740, 0xd008540e, 0x00044061, 0x00440211, 0x70502114,
-0x00000c20, 0x00000000, 0x00a32010, 0x4a340281, 0xa24968d0, 0x04988121,
-0x4428000a, 0x468124a0, 0x48d04204, 0x81412340, 0xd8720400, 0x80224048,
-0x026500c1, 0x40400910, 0x00000e80, 0x00000000, 0x0025a818, 0x8a740299,
-0x244029d0, 0x64409100, 0x40191482, 0x00d18064, 0x09d00254, 0x9500274b,
-0xd0025400, 0x00244009, 0x02640491, 0x60400910, 0x00000620, 0x00000000,
-0x04a7a805, 0x027c0093, 0x26c029f0, 0x4d009300, 0xc0191002, 0x00934064,
-0x39f0024c, 0x93002742, 0xd0024c00, 0x0026c009, 0x162c0593, 0x14c00830,
-0x00000e20, 0x00000000, 0x00258014, 0x027c199f, 0x27c009f0, 0x5c008f00,
-0xc009f002, 0x009f0027, 0x99f0027c, 0x8f4023c0, 0xf0027c80, 0x0033c099,
-0x0f5c018f, 0x53c009f0, 0x00000600, 0x00000000, 0x00810814, 0x007c021f,
-0x01c220f0, 0x0c001f04, 0xc0013100, 0x001f0004, 0x2130005c, 0x130004c0,
-0xb2804400, 0x2407c800, 0x084c021d, 0x50c001f0, 0x00000420, 0x00000000,
-0x015ca014, 0x41f4017d, 0x5d4805d0, 0x44005d00, 0xc0051001, 0x057d2017,
-0x0510014c, 0x71001440, 0x10014411, 0x04174605, 0x4544005d, 0x514005d0,
-0x00000200, 0x00000000, 0x0032a014, 0x1b340bcd, 0x71500cd0, 0x0400cd90,
-0x40095803, 0x00dd0024, 0x0c100324, 0xc1003042, 0x10a20400, 0x00b3400c,
-0x040400cd, 0x52400cd0, 0x00000a00, 0x00000000, 0x10388005, 0x02b400ad,
-0x19404ed0, 0xc400ed04, 0x444a1033, 0x20ed002b, 0x5e100784, 0xc1093848,
-0x10060400, 0x001b400e, 0x008480cd, 0x17400cd1, 0x00000200, 0x00000000,
-0x00581015, 0x85b421ef, 0x6942bef0, 0x8c81cf20, 0xc05a7207, 0x01cf00e8,
-0x7e3407ed, 0xe340fcc0, 0x30068c21, 0x926bc01e, 0x048cc1ef, 0x56c01ef0,
-0x00000040, 0x00000000, 0x2035b810, 0x007c001f, 0x07c06df0, 0x3c02df00,
-0xc029d483, 0x00df0526, 0x2de07b78, 0x5f05b7c0, 0x73827c20, 0x0137c08d,
-0x187d00df, 0x41c08df0, 0x00000660, 0x00000000, 0x006fb000, 0x07f80977,
-0x74081ff0, 0xcc1bd302, 0xc1b93007, 0x01df1065, 0xbf4027fc, 0xf3427cc4,
-0xa027cc49, 0x405cc09f, 0x0c8c01f3, 0x00c21f30, 0x00000e00, 0x00000000,
-0x00298015, 0x01b4086d, 0x78545fd0, 0x8401d102, 0x401b1007, 0x0dad0b68,
-0x1d380734, 0xf5007840, 0xd0279449, 0x009ac00f, 0x018400e1, 0x54400e30,
-0x00000620, 0x00000000, 0x00090000, 0x22a600a5, 0x0850ced0, 0xc4c0e103,
-0x404a9003, 0x04ed0028, 0x0e5023b4, 0xa1023040, 0xd8038400, 0x003a400e,
-0x00c40aa1, 0x00400f90, 0x00000400, 0x00000000, 0x00632804, 0x0034400d,
-0x00400cd0, 0x0400c100, 0x4088d003, 0x008d1060, 0x0c128334, 0x05503040,
-0xd0031400, 0x1032419d, 0x00040091, 0x10400c10, 0x00000c20, 0x00000000,
-0x0035a815, 0x0b6c00d7, 0x34c02ff0, 0x8d40f340, 0xd01b8003, 0x00df3469,
-0x0f500bfc, 0xd3003cd0, 0xb1034420, 0x1036c80f, 0x014d0092, 0x54c00fb4,
-0x00000620, 0x00000000, 0x02070001, 0x327c408f, 0x17c18df0, 0x7c00cf00,
-0xc0093003, 0x825f0027, 0x0d70437c, 0xdf0033c0, 0xf0037c20, 0x0097c00d,
-0x0a7c01df, 0x07c00df0, 0x00000c00, 0x00000000, 0x005f0880, 0x01cc00f3,
-0x74d40ff0, 0xcf00f300, 0xc00b3003, 0x00f3002f, 0x0e1403f4, 0xfb003cc0,
-0xf007f420, 0x0076c00f, 0x04c4019f, 0x03c00f30, 0x00000c22, 0x00000000,
-0x06060081, 0x00444011, 0x57d00dd1, 0x4480d500, 0x42095003, 0x02510027,
-0x0d100374, 0x550036c0, 0xd0037400, 0x00bd400d, 0x101401dd, 0x07400d50,
-0x00000802, 0x00000000, 0x8030a001, 0x03440051, 0x22400cd2, 0x4400d501,
-0x40095003, 0x40d13027, 0x0d500334, 0xd9403640, 0xc1237400, 0x0236440d,
-0x215508dd, 0x07400d10, 0x00000200, 0x00000000, 0x00002010, 0x01040041,
-0xa2506cd0, 0x4408c511, 0x00481813, 0x120100a7, 0xcc101334, 0xc5033240,
-0xd0033090, 0x0011400c, 0x031500cd, 0x43400c50, 0x00000080, 0x00000000,
-0x0016a000, 0x024c0093, 0xc4d07ff2, 0x4401f700, 0x85fb7877, 0x87d340ef,
-0x3f7097bc, 0x9b057ec1, 0xf00f784f, 0x2036c00d, 0x005d009f, 0x03c00d30,
-0x00000ac0, 0x00000000, 0x200fa805, 0x00fc003f, 0xcfc29df0, 0x3c0dff00,
-0xc05bf097, 0x053f026f, 0x1de0e774, 0x1f2177c8, 0xf05f7c25, 0x003fc00f,
-0x00fc00bf, 0x17c00ef0, 0x00000e60, 0x00000000, 0x802fa803, 0x23fc08f3,
-0x8fc143f0, 0xdc003f00, 0xc00ff053, 0x00f7003c, 0x0fb003cc, 0xf7003ec0,
-0x30c5fc00, 0x046cc01b, 0x11ec00f3, 0x0fc00f30, 0x00000e00, 0x00000000,
-0x00270801, 0x0a748251, 0x324825d0, 0xa4021700, 0x400fd00b, 0x22e10038,
-0x0f108394, 0xc1003042, 0x10894400, 0x009040a5, 0x094400c1, 0x07480f10,
-0x00000c20, 0x00000000, 0x0023a011, 0x193486c1, 0x314540d0, 0x14020d01,
-0x400cd003, 0x48c50030, 0x0c900314, 0xc5103248, 0x50013400, 0x00224400,
-0x212400c1, 0x47400c50, 0x00000e80, 0x00000000, 0x4065a003, 0x01760051,
-0x376011d0, 0x64845d00, 0x480dd003, 0x00d12034, 0x0d110354, 0xd1203400,
-0x50016420, 0x2016480c, 0x414400d1, 0x0f400d50, 0x00000620, 0x00000000,
-0x0037a002, 0x077c0213, 0x05c029f2, 0x5c001f10, 0xd00dd006, 0x00d70034,
-0x0db2035c, 0xd71036c8, 0x7403fc00, 0x402ed003, 0x0d6c00d3, 0x0bc00d70,
-0x00000e20, 0x00000000, 0x003d8007, 0x22fc0237, 0x3ec005f0, 0xfc007700,
-0xc00ff04e, 0x00ff003b, 0x0ef003bc, 0xef203bc0, 0xb003dcc0, 0x0019c00f,
-0x253c00ef, 0x1fc00fb6, 0x00000600, 0x00000000, 0x00750002, 0x214c2017,
-0x36d02930, 0x4c001300, 0xe10c3402, 0x00c34035, 0x0d30034d, 0xd30037c0,
-0xf0030d00, 0x4025c001, 0x094d00d3, 0x0bc00d70, 0x00000420, 0x00000000,
-0x00b4a013, 0x09540011, 0x74400150, 0x450f5100, 0x400f1002, 0x11f1047f,
-0x1f1047c4, 0xf1117c41, 0xd0474401, 0x0454411d, 0x054411f1, 0x4f420f10,
-0x00000200, 0x00000000, 0x0426a807, 0x1024808d, 0x41400090, 0x00000120,
-0x400c1006, 0x12c104b1, 0x2c104b04, 0xc104b141, 0xd0490412, 0x04a04120,
-0x490412c1, 0x1f400cd1, 0x00000a00, 0x00000000, 0x40788004, 0x043403c1,
-0x78401ed0, 0x84012100, 0x411e1026, 0x01e1107b, 0x9c182784, 0xe1027940,
-0xd0858401, 0x0259401e, 0x058401e5, 0x12401e90, 0x00000200, 0x00000000,
-0x00241012, 0x202c828f, 0x31c6a4b1, 0x0c085304, 0xc00c3042, 0x08c30031,
-0x8c34030c, 0xc34031c0, 0xf0010c10, 0x0221d0a1, 0x520c08c3, 0x4bc00cf0,
-0x00000040, 0x00000000, 0x003db802, 0x81dc00f5, 0x3dc00f58, 0xfc007f02,
-0xc08fb006, 0x00ff003f, 0x8ff8c3fc, 0xff003cc1, 0xf001fc80, 0x0a5ec80f,
-0x02fc80fb, 0x0bc02f71, 0x00000660, 0x00000000, 0x0037a015, 0x027c0017,
-0x07c009f0, 0x7c125f00, 0xc10d3083, 0x06d701b7, 0x4cb0537c, 0xdb0a74d0,
-0xf0036c01, 0x4027c801, 0x017c00d3, 0x57c08df8, 0x00000e00, 0x00000000,
-0x00398812, 0x02b480ed, 0x3b400ed0, 0x34006d08, 0x402e7023, 0x16e105b3,
-0xce1013b4, 0xe1213840, 0xd0038482, 0x0013400e, 0x01b422e1, 0x4b404ed0,
-0x00000620, 0x00000000, 0x00790003, 0x06b40121, 0x7b401ed0, 0xb4016d00,
-0x405e900f, 0x01ed007b, 0x1f900734, 0xc9007140, 0xd807a401, 0x106b4012,
-0x06b401e1, 0x0f441ed8, 0x00000400, 0x00000000, 0x80732812, 0x0b3400cd,
-0x33400cd8, 0x34094d00, 0x400c5007, 0x80c90033, 0x0c100334, 0xc1003148,
-0xd2032400, 0x0013402c, 0x023400c1, 0x4b400cd0, 0x00000c20, 0x00000000,
-0x0115a817, 0x29f48073, 0x1b4027d0, 0x7c015f00, 0xc005b005, 0x005f0017,
-0x07b1017c, 0x5b001dc0, 0xf0096c00, 0x401fc085, 0x01fc0053, 0x5fc005f0,
-0x00000620, 0x00000000, 0x00070012, 0x087c011f, 0x07e101f0, 0x7c800f00,
-0xc001f080, 0x00170003, 0x01f0803c, 0x1f0006c0, 0xf0485c20, 0x008bc002,
-0x087c001f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x00230810, 0x020c0097,
-0x67800930, 0x2c00d301, 0xc4093002, 0x00870024, 0x0970024c, 0x9f002480,
-0x30027c00, 0x0024c009, 0x025c0083, 0x43c009f0, 0x00000c20, 0x00000000,
-0x10660005, 0x0a540291, 0x26c00952, 0x45809100, 0x40095102, 0x00910024,
-0x0910027c, 0x9c002440, 0x104a7400, 0x04a54009, 0x4a448095, 0x074009d0,
-0x00000800, 0x00000000, 0xc224a01c, 0x03448185, 0x27400910, 0x44009140,
-0x40181002, 0x01950064, 0x18d00640, 0x9d006540, 0x10063401, 0x006c401b,
-0x06540191, 0x634009d0, 0x00000200, 0x00000000, 0x80e02010, 0x0b140281,
-0x26440850, 0x0408c102, 0x5028505a, 0x868180a0, 0x28100a34, 0x8d00a150,
-0x140a3602, 0x00a9402a, 0x0a040285, 0x434028d0, 0x00000080, 0x00000000,
-0x0006b019, 0x004c0057, 0x87614130, 0x4c161310, 0xc0013110, 0x01170004,
-0x0170004c, 0x1f0005c0, 0x30007c00, 0x000cc001, 0x005c0013, 0x77c001f0,
-0x00000ac0, 0x00000000, 0x40afb019, 0x0afc02bf, 0x2cc54bf0, 0xfc049f01,
-0xc029f002, 0x089f00a7, 0x29f30a6c, 0x9f00a6c0, 0xf00a7c02, 0x08a7c02d,
-0x0afc829f, 0x67c029f0, 0x00000e60, 0x00000000, 0x052fa018, 0x32fc02fb,
-0xa5c149f0, 0x7c40bf00, 0xc029f05a, 0x069b01a4, 0xc9b0327c, 0x9701a6c0,
-0x301e6c14, 0x0164c079, 0x0a4c1293, 0x60d489f2, 0x00000e00, 0x00000000,
-0x01870818, 0x385c0011, 0x164021d0, 0x760a1d00, 0x4001d818, 0x04110385,
-0xe1103874, 0x11038440, 0xb0184402, 0x15054041, 0x80840411, 0x704821d0,
-0x00000c20, 0x00000000, 0x0423a010, 0x02300289, 0x236008d2, 0xb4148d00,
-0x406ad012, 0x02a92028, 0x0a900294, 0xa5092a40, 0x1022a410, 0x40aa502a,
-0x1e8400a1, 0x404068d0, 0x00000e80, 0x00000000, 0x0025a818, 0x82542099,
-0x266009d8, 0x74809d02, 0x400bd003, 0x00b1002d, 0x0b1802f6, 0xb1002c40,
-0x9002e400, 0x002f400b, 0x02c400b1, 0x604009d2, 0x00000620, 0x00000000,
-0x1027a805, 0x467c009b, 0xe7c689f0, 0x74099f10, 0xc009d002, 0x009b0024,
-0x09b0025c, 0x970026c0, 0x30026c00, 0x0026c029, 0x064c2093, 0x14c409f0,
-0x00000e20, 0x00000000, 0x00218210, 0x567c1097, 0x35c009f0, 0x7c019f00,
-0xe009f002, 0x009f0023, 0x0970023c, 0x8f0023c0, 0xf0025c00, 0x0021c008,
-0x927d209f, 0x53c009f0, 0x00000600, 0x00000000, 0x02050814, 0x004c0813,
-0x07c001f0, 0xfc201f00, 0xc0023100, 0x0437010f, 0x02b010fc, 0x33010cc0,
-0x30008c04, 0x000cc043, 0x00fc0433, 0x50c40130, 0x00000420, 0x00000000,
-0x201ca014, 0x01d48171, 0x174805d2, 0x74117d04, 0x48051001, 0x00512017,
-0x05108164, 0x57001444, 0x10014400, 0x00144005, 0x01f40051, 0x50400510,
-0x00000200, 0x00000000, 0x0072a014, 0x2b0402c9, 0x53600d90, 0x3400cd20,
-0x400c5003, 0x00c54033, 0x2c100334, 0xc9403041, 0x10030400, 0x0030500c,
-0x033400d1, 0x50440d90, 0x00000a00, 0x00000000, 0x40308005, 0x00b401c1,
-0x1b608e90, 0xb400ed00, 0x4802520c, 0x0021000b, 0x021000b4, 0x25000840,
-0x10008400, 0x00094002, 0x04b48021, 0x14400e90, 0x00000200, 0x00000000,
-0x00681015, 0x078e4163, 0x5bc41ef2, 0xfc016f10, 0xc01a5407, 0x01a70063,
-0x1b3406fe, 0xbb806cd0, 0x3404cd01, 0x404cc018, 0x04bc01a3, 0x54d01cb4,
-0x00000040, 0x00000000, 0x4025b010, 0x005c805f, 0x87c00df0, 0x7c005f00,
-0xc005b000, 0x005f8817, 0x0570016c, 0x5b0017c0, 0xf0037c00, 0x0036c205,
-0x037c005f, 0x43c1ed70, 0x00000660, 0x00000000, 0x007fa000, 0x25cc81bb,
-0xdcc01fb0, 0xfc01f310, 0xc41f7006, 0x0173105c, 0x17b005cc, 0x73005ac0,
-0x3007fc01, 0x007cc217, 0x07ec8173, 0x00c01f31, 0x00000e20, 0x00000000,
-0x00298815, 0x00ec9431, 0x1ac20eb0, 0xb000a100, 0x40031001, 0x00bf002c,
-0x0a100294, 0xab002940, 0x5000b640, 0x0009c00a, 0x80c420ab, 0x54488e10,
-0x00000620, 0x00000000, 0x00290000, 0x038640a1, 0x1e408c10, 0x14006100,
-0x400a5022, 0x0029020a, 0x02900024, 0x21000e40, 0x90003400, 0x00084000,
-0x04a40821, 0x00400e10, 0x00000400, 0x00000000, 0x00272804, 0x22200301,
-0x80601c90, 0x30810000, 0x40041001, 0x80c11032, 0x0c920324, 0xc9203044,
-0xd0033480, 0x033148ac, 0x030480c9, 0x10500c10, 0x00000c00, 0x00000000,
-0x0075a815, 0x06480093, 0x96423f30, 0x7c049341, 0xd0057001, 0x00d94036,
-0x0db1036d, 0xd30036c0, 0xb0037c00, 0x00b4c02d, 0x032c00d3, 0x54c00f34,
-0x00000600, 0x00000000, 0x40570001, 0x007c409f, 0x17c0cdf2, 0x7c805f00,
-0xc029f00a, 0x401f0001, 0x0170005c, 0x170007c0, 0x70003e00, 0x0005c441,
-0x006c001f, 0x07c00df0, 0x00000c00, 0x00000000, 0x00070880, 0x02fc107f,
-0x5fc00fb0, 0x8e05bf05, 0xc002b001, 0x00b7002e, 0x087002bc, 0xaf002dc0,
-0x3100dc00, 0x0000c00a, 0x00dc0083, 0x00c00d34, 0x00000c02, 0x00000000,
-0x04462081, 0xa4740955, 0x06420d53, 0x44005d00, 0x412d100a, 0x00510014,
-0x05b20174, 0x5d2016c0, 0x50034400, 0x00354005, 0x034c805b, 0x04400d10,
-0x00000822, 0x00000000, 0x0064a001, 0x01340095, 0x07600d11, 0x44028d00,
-0x40059000, 0x80550016, 0x05500170, 0x5c001540, 0x10035400, 0x00344805,
-0x03540051, 0x05400c51, 0x00000200, 0x00000000, 0x08002010, 0x01340001,
-0x03440c50, 0x06000d08, 0x40081003, 0x00810020, 0x08100234, 0x8d102040,
-0x50000400, 0x00014008, 0x00440089, 0x40400c10, 0x00000080, 0x00000000,
-0x0006b000, 0x037c80d7, 0x07c40d30, 0x44009d00, 0xc001b000, 0x00170006,
-0x0150007c, 0x1f200548, 0x30005c20, 0x0004c001, 0x005c0013, 0x00d00f32,
-0x00000ac0, 0x00000000, 0x000fb005, 0x03fc007f, 0x0ac00ff0, 0xec003f00,
-0xc80ff203, 0x00ff203f, 0x0ff003fc, 0xff003fc0, 0xf003fc00, 0x083fc00f,
-0x03dc80ff, 0x17c00ff0, 0x00000e40, 0x00000000, 0x840fa003, 0x10cd943f,
-0xbfe44190, 0x7c3c3301, 0xe34ff28b, 0x14ff092c, 0x2df0234c, 0xd300b6c6,
-0x30034c04, 0x003cc04f, 0x02cc00e7, 0x0ce00f30, 0x00000e00, 0x00000000,
-0x00b70801, 0x5a6c021d, 0x3de16110, 0xde061102, 0x416fd10b, 0x16f11624,
-0x0fd01bd4, 0xe140bc40, 0x542bc502, 0x403d502c, 0x02440051, 0x06c00c14,
-0x00000c20, 0x00000000, 0x0003a011, 0x2114144d, 0x33048010, 0x14044501,
-0x400cd01b, 0x00cd0920, 0x4cd08b04, 0xc101b170, 0x10830508, 0x0030408c,
-0x030480d5, 0x44400c10, 0x00000e80, 0x00000000, 0x0235a803, 0x8314048d,
-0x35400590, 0x74015560, 0x500cd003, 0x00d10024, 0x0dd00345, 0xd1083540,
-0x50034400, 0x4035400d, 0x034408d5, 0x0e000d10, 0x00000620, 0x00000000,
-0x0047a802, 0x2854019d, 0x37402db4, 0x5c121700, 0x480df003, 0x80df4024,
-0x0dd0834c, 0xd30035c0, 0x34034c00, 0x4034c80d, 0x134c02d5, 0x08000d30,
-0x00000e20, 0x00000000, 0x104d8007, 0x806c813f, 0x3dc40572, 0xdc001b00,
-0xc00df103, 0x00d70023, 0x0df2037c, 0xef003ec0, 0xf0033c80, 0x003bc00e,
-0x0bfd11fb, 0x1fc00ef4, 0x00000600, 0x00000000, 0x40250802, 0x1d7c40d3,
-0x32d029fc, 0x6c809f10, 0xd00d7083, 0x80c7a064, 0x0c32034c, 0xd70032c0,
-0x74234c00, 0x1034c00d, 0x034c00db, 0x08c80d30, 0x00000420, 0x00000000,
-0x00248013, 0x01740091, 0x3c40a5b8, 0xc4019d00, 0x400f1083, 0x20fb806c,
-0x0f1103c4, 0xf1003d40, 0xf007d500, 0x403c412f, 0x2f4413c3, 0x4c40ef10,
-0x00000200, 0x00000000, 0x0002a007, 0x08248f09, 0x31440010, 0x04288d00,
-0x480c1003, 0x00c50020, 0x0c108305, 0xc1003148, 0x521f0480, 0x5030413c,
-0x0f4583c9, 0x1d600c10, 0x00000a00, 0x00000000, 0x00708004, 0x06b40161,
-0x79605a92, 0x8605ad00, 0x401e10b7, 0x09e10368, 0xde101784, 0xe1017940,
-0xd4079609, 0x5270501e, 0x478449f9, 0x11601e11, 0x00000200, 0x00000000,
-0x00001012, 0x083c084b, 0x71c0f050, 0x4d014f00, 0xc05c3027, 0x05c50960,
-0x5c10070c, 0xc30075c4, 0x60070c05, 0x4230c80c, 0x034e80cb, 0x49d08c30,
-0x00000040, 0x00000000, 0x003db802, 0x02fc00ff, 0x3cc00f70, 0xdc005f06,
-0xc08fe023, 0x08ff122f, 0x8df0237c, 0xff023d03, 0xb00ffc08, 0x023fc00f,
-0x01fe20f7, 0x0ac20ff0, 0x00000660, 0x00000000, 0x2017b015, 0x037c409f,
-0x37c00d70, 0x7c80d325, 0xc44d30b3, 0x16df8224, 0x4df0634c, 0xd30334d0,
-0xf60b4c08, 0x4334da8d, 0x034c01d3, 0x57800df2, 0x00000e00, 0x00000000,
-0x08198012, 0x03b4606d, 0x3b420ed0, 0xb420e148, 0x44cc11c3, 0x06f64168,
-0xced08384, 0xc10c3840, 0xf4170408, 0x0338401e, 0x038400a1, 0x4b404ed0,
-0x00000620, 0x00000000, 0x00790003, 0x07b401ed, 0x7b401ad0, 0xb403e101,
-0x40de1017, 0x01ed0160, 0x5ed197a4, 0xe9017240, 0x90278405, 0x0170405e,
-0x078501e1, 0x0f029ed0, 0x00000400, 0x00000000, 0x00732812, 0x237412cd,
-0x33403d90, 0x3402c100, 0x400c1003, 0x00c90020, 0x0cd00324, 0xc9003240,
-0xd0030400, 0x0030400c, 0x030453c1, 0x4b400cd2, 0x00000c20, 0x00000000,
-0x009da817, 0x05fc007f, 0x17c1a7f0, 0x7c007300, 0x10073001, 0x005f001c,
-0x05f0016c, 0x5b0016c0, 0xf0014c00, 0x4014c005, 0x49cc8373, 0x5fc005f0,
-0x00000620, 0x00000000, 0x02070012, 0x487c001f, 0x07c001f0, 0x3c100f00,
-0xc001f400, 0x00170007, 0x01f0004c, 0x175005c2, 0xf0007c00, 0x0007c201,
-0x0c7c881f, 0x4bc021f0, 0x00000c00, 0x00000000, 0x04270810, 0x067c029f,
-0x20c03970, 0x4c809300, 0xc009b202, 0x00974020, 0x0934020e, 0x930024c0,
-0x30020c00, 0x4024c008, 0x02680093, 0x40c009f0, 0x00000c20, 0x00000000,
-0x00262001, 0x3e74009d, 0x24501911, 0x44009110, 0x40091002, 0x00950064,
-0x09100244, 0x91002440, 0x30025400, 0x0a24dc09, 0x2a60c291, 0x045129d0,
-0x00000800, 0x00000000, 0x0024a018, 0x0274009d, 0x24400910, 0x44019100,
-0x40089202, 0x00850064, 0x08100244, 0x81002050, 0x14824480, 0x48204a29,
-0x026400d1, 0x604008d0, 0x00000200, 0x00000000, 0x00202010, 0x2234088d,
-0x20008810, 0x045c8102, 0x50881022, 0x28850220, 0x88102206, 0x814a2060,
-0x04221402, 0x02304088, 0x22240881, 0x414088d0, 0x00000080, 0x00000000,
-0x0506a01d, 0x587c161f, 0x80c16174, 0x0d061305, 0xc561b058, 0x16152584,
-0x20305845, 0x130584c0, 0x20584c54, 0x0584c160, 0x096c0243, 0x74c021f2,
-0x00000ac0, 0x00000000, 0x002fa819, 0x92fc04bf, 0x27c04bf8, 0x7804bf41,
-0xc049e012, 0x049f012f, 0x69f0127c, 0x9f012700, 0x70927c40, 0x0125c049,
-0x12fc04bf, 0x66c069f0, 0x00000e60, 0x00000000, 0x0127a018, 0x02fc06b3,
-0x2cc00bf0, 0x4c043313, 0xc0693052, 0x0093008d, 0x0970224c, 0x931524e0,
-0x710acc90, 0x01a6c209, 0x0a4c0093, 0x60c16936, 0x00000e00, 0x00000000,
-0x0007001c, 0x18748011, 0x045141d2, 0x0c151140, 0x40411050, 0x10111044,
-0xc1142014, 0x112102c1, 0x12105506, 0x0007c041, 0x00054451, 0x70400310,
-0x00000c20, 0x00000000, 0x00a3a010, 0x4a348681, 0xa04028d8, 0x06028120,
-0x40681002, 0x48810131, 0x48500204, 0x81052040, 0x50122414, 0x00aa510a,
-0x82c490a1, 0x40400a10, 0x00000e80, 0x00000000, 0x0425a818, 0x82740091,
-0x244008d0, 0x44349100, 0x40091002, 0x00910024, 0x09100244, 0x91002646,
-0x10027080, 0x402f400b, 0x42c408a1, 0x60400b10, 0x00000620, 0x00000000,
-0x0027a805, 0x267c0493, 0x244409f2, 0x4c009300, 0xc0093402, 0x00934025,
-0x0970024d, 0x93402440, 0x71026c00, 0x0026c009, 0x06480393, 0x14d00930,
-0x00000e20, 0x00000000, 0x48218014, 0x067c049f, 0x27c089f0, 0x1d201f00,
-0xc008f402, 0x009f2007, 0x09f0027c, 0x9f0023c0, 0xd1025c00, 0x0027c008,
-0x127d209f, 0x53d009f0, 0x00000600, 0x00000000, 0x00850814, 0x005c061f,
-0x07c001f0, 0x5c021300, 0xc0013000, 0x00038004, 0x0030000c, 0x130004c0,
-0x34404c80, 0x0106c001, 0x084d0213, 0x50408130, 0x00000420, 0x00000000,
-0x2014a014, 0x01d4807d, 0x174017d0, 0x74013100, 0x40051401, 0x005f0004,
-0x05100144, 0x51001542, 0xf0092c40, 0x00d6c045, 0x01040151, 0x51403514,
-0x00000200, 0x00000000, 0x0032a014, 0x4b0000cd, 0x27451cd2, 0x1401d100,
-0x400c1083, 0x20c10034, 0x0c500304, 0xd1003060, 0x100a3400, 0x00f6401c,
-0x031401c1, 0x50413d10, 0x00000a00, 0x00000000, 0x00388805, 0x0284818d,
-0x2b4106d2, 0xb498e100, 0x480e1003, 0x04c58230, 0x8e191384, 0xe1013960,
-0xd0023404, 0x04324008, 0x039410e1, 0x15400011, 0x00000200, 0x00000000,
-0x00780015, 0x859d01ef, 0xefc81ed2, 0x9c05e315, 0x503f3007, 0x01e10178,
-0x5c701784, 0xc301f8c0, 0x3406b891, 0x407ac81e, 0x049c0173, 0x54c11e34,
-0x00000040, 0x00000000, 0x0035a810, 0x027c009f, 0x27c005f0, 0x7c00df00,
-0xc96de10b, 0x4adf0037, 0x0db18b7c, 0xde00b7c5, 0xf0026c08, 0x4037c009,
-0x016c00df, 0x43c009f0, 0x00000660, 0x00000000, 0x007fb000, 0x07c881ff,
-0x64c099f0, 0x4c01f303, 0xc01d304f, 0x0bdb1874, 0x1f306fcc, 0xd302f448,
-0xb1064c01, 0x004dc01f, 0x07cc81b3, 0x03801f30, 0x00000e00, 0x00000000,
-0x02398015, 0x0084302d, 0x604052d0, 0xc409c100, 0x401d3037, 0x01d21071,
-0x1f5007c4, 0xf1027c40, 0x54368401, 0x000c500b, 0x038400b1, 0x57408210,
-0x00000620, 0x00000000, 0x00390000, 0x218408cd, 0x2840a8d0, 0x9408e022,
-0x400e9003, 0x00e1003c, 0x4e108384, 0xe1003a44, 0x94120440, 0x0029400e,
-0x00a41821, 0x03400e10, 0x00000400, 0x00000000, 0x04b32804, 0x0804021d,
-0x204090d0, 0x1400c100, 0x400c1003, 0x00c90031, 0x0c500304, 0xc1203250,
-0x54020500, 0x00204008, 0x09241291, 0x13400010, 0x00000c20, 0x00000000,
-0x04f5a815, 0x234c005f, 0x28500df0, 0xd500d348, 0xc00eb503, 0x00f10030,
-0x0f3403cd, 0xf3403ec0, 0xb0014c00, 0x4035c005, 0x0b6d83d1, 0x57c00d34,
-0x00000620, 0x00000000, 0x10370001, 0x033c105f, 0x27c00df0, 0x2c00df00,
-0xc00df003, 0x00d70037, 0x0df0837c, 0xdf0031c0, 0xf0007c00, 0x2033c005,
-0x0b5c02df, 0x07c805f0, 0x00000c00, 0x00000000, 0x003f0880, 0x20dc003f,
-0x2dc00b31, 0xdc05f300, 0xc00f3003, 0x00fb003c, 0x0ef003cc, 0xf3003cc4,
-0xb00dfc00, 0x003cc03e, 0x46cc0873, 0x00c08f20, 0x00000c22, 0x00000000,
-0x00360081, 0x0644e01d, 0x25c00910, 0x7420d100, 0x400d1503, 0x00d10034,
-0x0dd08354, 0xd1083540, 0x10007440, 0x02f54025, 0x14058251, 0x04401d10,
-0x00000802, 0x00000000, 0x8034a001, 0x03440add, 0x27401510, 0x7400d158,
-0x400d1003, 0x00c10074, 0x0dd00344, 0xd1003448, 0x90433400, 0x40944025,
-0x134602d1, 0x04400c50, 0x00000200, 0x00000000, 0x80302010, 0x0104004d,
-0xa3489410, 0x2404c100, 0x400d1043, 0x04c18234, 0x0cd03314, 0xc1403141,
-0x14303480, 0x40114000, 0x03460081, 0x40400050, 0x00000080, 0x00000000,
-0x0036a000, 0x005d009f, 0xebcc5130, 0xfc4bd301, 0xc0df30b7, 0x49f32174,
-0x1ff01fcc, 0xf3237cc0, 0xb0877c2f, 0x4004c80d, 0x020c0053, 0x00d00d74,
-0x00000ac0, 0x00000000, 0x083fa805, 0x00fc803f, 0x6de2d3f4, 0xfc0dce02,
-0xc2dff017, 0x07ff037b, 0x5df2277c, 0xff037fc1, 0xf01cfc09, 0x400fc003,
-0x00fc003f, 0x17c003b0, 0x00000e40, 0x00000000, 0x003fa003, 0x70fc0437,
-0x0fc1c3f0, 0xde023f02, 0xc00f70a0, 0x0cfb083e, 0x0fb003fc, 0xf7003ac0,
-0x3000cc04, 0x000cc00b, 0x00e440f3, 0x0cc40fb0, 0x00000e20, 0x00000000,
-0x00370801, 0x096c0a01, 0x874469d1, 0x44441d02, 0x400fd008, 0x88e5033c,
-0x0d009234, 0xfd003440, 0x50015408, 0x0034400d, 0x034402f5, 0x0d400d50,
-0x00000c20, 0x00000000, 0x0033a011, 0x82340015, 0x21404450, 0x04c04d09,
-0x614cd030, 0x20c92432, 0x0c904330, 0xcd007240, 0x11000400, 0x0031420c,
-0x002402c1, 0x4d440c94, 0x00000e80, 0x00000000, 0x0035a803, 0x03751111,
-0x270009d8, 0x44600c00, 0x400dd091, 0x00d90034, 0x0d109274, 0xdd007441,
-0x500454a0, 0x0035440d, 0x074440d5, 0x0d400d40, 0x00000620, 0x00000000,
-0x0133a802, 0x087c03d7, 0x15c021f0, 0x45049e06, 0xc00d7818, 0x00db0036,
-0x3cb0037c, 0xdf0036c0, 0x30874c00, 0x0005d008, 0x076c00d3, 0x89c00da0,
-0x00000e02, 0x00000000, 0x003d8007, 0xa16d007f, 0x57c021f0, 0xec007d08,
-0xc00ef006, 0x00f7103b, 0x8fe007fc, 0xff003fc0, 0xf003bc00, 0x003ac00f,
-0x81bc00ef, 0x1fd80ef2, 0x00000600, 0x00000000, 0x00b50802, 0x485c025b,
-0xb45035b4, 0x7e30d700, 0xc00df001, 0x80d70037, 0x0d710354, 0xd78837c0,
-0x11225e00, 0x2237c00d, 0x036d0cd3, 0x09400d92, 0x00000400, 0x00000000,
-0x02b4a013, 0x09440441, 0x3540a190, 0x72035102, 0x420fd203, 0x00f1203f,
-0xbd180344, 0xfa06f4c0, 0x10064480, 0x02b740ad, 0x034400fb, 0x6ec00fb2,
-0x00000200, 0x00000000, 0x0032a007, 0x00140449, 0x01400050, 0x348b0100,
-0x420cd000, 0x20c50833, 0x8c500354, 0xd1003140, 0x10061400, 0x30434008,
-0x010403c1, 0x1e420c10, 0x00000a00, 0x00000000, 0x007c8004, 0x04840161,
-0x48401e50, 0xb401a500, 0x001ed105, 0x09e10073, 0x1e108786, 0xc9007c40,
-0x10038401, 0x0073401e, 0x278441e9, 0x36409e94, 0x00000200, 0x00000000,
-0x00301012, 0x1b1c044b, 0x11c024f2, 0x34084740, 0x804cd000, 0x28c70033,
-0x0c50031c, 0xc10031c0, 0x30225400, 0x0033c08c, 0x014c08c3, 0x4bc00d30,
-0x00000040, 0x00000000, 0x1039b802, 0x03fc007f, 0x1fc20fb0, 0xfc009b00,
-0xc02ff209, 0x28ff003f, 0x0cd1237c, 0xfc103fcc, 0xf013fc00, 0x003f800f,
-0x03de38ee, 0x0bc00ff1, 0x00000660, 0x00000000, 0x0497a015, 0x067c005f,
-0x24c009b0, 0x7c009f00, 0xc8ed7013, 0x42df0037, 0x4df8035c, 0xdb2033c8,
-0xf0034c08, 0x0007c009, 0x037c12df, 0x54c00d38, 0x00000e00, 0x00000000,
-0x00398812, 0x02b4006d, 0x28680cb0, 0xb400ed00, 0x424ed003, 0x14cf043b,
-0x2ed003ac, 0xe42539c1, 0xf0039088, 0x003b400e, 0x019c00ed, 0x4d404e50,
-0x00000624, 0x00000000, 0x00790003, 0x07b6016d, 0x78401e90, 0xb4a1ed00,
-0x601e5007, 0x09ed037b, 0x5ed00784, 0xe1267b41, 0xd0078605, 0x007b401e,
-0x07b405ed, 0x04409c10, 0x00000400, 0x00000000, 0x08b32812, 0x0334424d,
-0xf1402d92, 0x3400dd00, 0x400cd033, 0x40c51033, 0x0cd02734, 0xc5083140,
-0xd02b1640, 0x0033400c, 0x071400cd, 0x49000d50, 0x00000c20, 0x00000000,
-0x22918817, 0x21fc1a7f, 0x5cd087b2, 0x7c027f01, 0x40057001, 0x405d0017,
-0x03d001c4, 0x51100b40, 0xd005cc00, 0x001f4405, 0x05f4005d, 0x5cc00510,
-0x00000620, 0x00000000, 0x10070012, 0x0870c01d, 0x06c02170, 0x7c101f04,
-0xc000f100, 0x001f0807, 0x01f00068, 0x170007c0, 0x70005c00, 0x8007c001,
-0xa07c020f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x00370810, 0x067c0097,
-0x64c019f8, 0x4c089300, 0xc409b003, 0x408f8025, 0x41b1024e, 0x930505c1,
-0x30426c00, 0x0020c008, 0x425c4393, 0x40c00970, 0x00000c20, 0x00000000,
-0x04262001, 0x62740291, 0xa4585978, 0x44419112, 0x4009d002, 0x809fa024,
-0x7012022c, 0x9101c448, 0x36060c40, 0x6026d809, 0x02448091, 0x04400910,
-0x00000800, 0x00000000, 0x0024a018, 0x02748295, 0xa04089d1, 0x44009100,
-0x4809d002, 0x009d3025, 0x01900244, 0x85400540, 0x94077400, 0x00244009,
-0x02160091, 0x60400950, 0x00000200, 0x00000000, 0x00242010, 0x22342881,
-0x20408850, 0x07088142, 0x4008d002, 0x0c8d0220, 0x89182264, 0x81022464,
-0x900a4640, 0x90224008, 0x0a0604c1, 0x40542812, 0x00000080, 0x00000000,
-0x0006b01d, 0x583c1617, 0x844161d0, 0x4c961305, 0x4801b350, 0x031d8585,
-0x61b80846, 0x078585e1, 0xb8007c9e, 0x8004e001, 0x001e0113, 0x74c00178,
-0x00000ac0, 0x00000000, 0x0037b819, 0x12fc04fe, 0x2fc04bf0, 0x7c04bf01,
-0xe169e252, 0x8c970127, 0x4be012f8, 0x9f012fc0, 0x780adc01, 0x00afc02b,
-0x0afc089d, 0x67c029f0, 0x00000e64, 0x00000000, 0x0027a018, 0x42cc88b7,
-0x2dc10bb8, 0x4c08f305, 0xc049f00a, 0x149b0126, 0x1b30222c, 0x93206fc1,
-0x3132dc80, 0x0023c009, 0x0a482093, 0x60c329b0, 0x00000e00, 0x00000000,
-0x1007081c, 0x48450a11, 0x84482110, 0x440a1141, 0x40a1d000, 0x14130504,
-0x31109044, 0x1502c740, 0x10384404, 0x00074401, 0x08440a31, 0x70402150,
-0x00000c20, 0x00000000, 0x0027a010, 0x12240485, 0x21414810, 0x16248504,
-0x4008d022, 0x008d0322, 0x48101264, 0x810d2341, 0x54021412, 0x006b4008,
-0x1e05c0a5, 0x48404890, 0x00000e80, 0x00000000, 0x0825a818, 0x0b648091,
-0x24480812, 0x56049501, 0x4809d8a2, 0x00990020, 0x01140244, 0x95040701,
-0x10024480, 0x002f4009, 0x024400b5, 0x60400950, 0x00000620, 0x00000000,
-0x00a7a805, 0x066c0297, 0x25801918, 0x5d009704, 0xc009e102, 0x009f0026,
-0x0130026c, 0x93000340, 0x70065c00, 0xc0a7c019, 0x024c0096, 0x14c009b0,
-0x00000e20, 0x00000000, 0x28358014, 0x0a5c009f, 0x27804974, 0x6c008b08,
-0xc009f086, 0x00970027, 0x81f0027c, 0x9f0107c0, 0xf00e1c40, 0x8927c459,
-0x023c009b, 0x5bd008f0, 0x00000600, 0x00000000, 0x01050814, 0x084c0013,
-0x87c881f2, 0x5c001f02, 0xc0007000, 0x40060006, 0x01b0005c, 0x1f0005cc,
-0x60007c20, 0x000fc001, 0x807c0033, 0x50c00132, 0x00000420, 0x00000000,
-0x80908014, 0x11c40075, 0x1f400770, 0x74107c20, 0x4005b001, 0x00510014,
-0xa3100104, 0x5d028c44, 0x14154000, 0x40134005, 0x01740041, 0x50400514,
-0x00000200, 0x00000000, 0x20b2a014, 0x034401d1, 0x37401cd0, 0x1401cd00,
-0x400c9003, 0x00c50032, 0x8c900314, 0xdd223140, 0x50071040, 0x0033400c,
-0x03340045, 0x50500c10, 0x00000a00, 0x00000000, 0x003c8005, 0x038442c5,
-0x3b4c02d0, 0xb400ed00, 0x400c8117, 0x08e10038, 0x5f1823c4, 0xcd013944,
-0x1003c400, 0x000b4006, 0x133400a5, 0x14400c10, 0x00000200, 0x00000000,
-0x00781015, 0x078d0161, 0x4bc41ef3, 0x1c01ef00, 0xc41eaa07, 0x8df705fe,
-0x9eb1379c, 0xef0079c0, 0x70079c01, 0x087bc01e, 0x37bc01a7, 0x54c01e30,
-0x00000040, 0x00000000, 0x0131b810, 0x017c00df, 0x27c00d70, 0x7ea09f00,
-0xc00db023, 0x22df10b7, 0xecc08b74, 0xdf31b64e, 0xf0031c0a, 0x00070005,
-0x237c005b, 0x43c00df1, 0x00000660, 0x00000000, 0x00ffa000, 0x27f401f9,
-0x7fc01fe0, 0xfc01ff00, 0xc11fb01f, 0x01fe007c, 0x1ff007cc, 0xff06ffc0,
-0xf007cc03, 0x007fc01f, 0x07fc017f, 0x00c19f30, 0x00000e00, 0x00000000,
-0x00398015, 0x23b604a1, 0x3b4082d0, 0xb480ed00, 0xc04f1053, 0x04ed003a,
-0x4ed003ac, 0xf9103b44, 0xd0038404, 0x000b4006, 0x13b400ad, 0x5550cf54,
-0x00000620, 0x00000000, 0x00390000, 0x82b4406d, 0x1b400ad0, 0xb408e500,
-0x640ed133, 0x00ed0038, 0x0ed00386, 0xed203b4c, 0xd0028600, 0x023b400e,
-0x4bb401ad, 0x00700e12, 0x00000400, 0x00000000, 0x00132804, 0x04361085,
-0x334038c0, 0x70108d00, 0x400c5003, 0x00cd0032, 0x0cd00726, 0xc9003340,
-0xd0020400, 0x00030004, 0x0734404d, 0x11400d50, 0x00000c20, 0x00000000,
-0x2235a815, 0x407c809f, 0x37c13df0, 0xf443df00, 0x400ff80f, 0x00fd003c,
-0x8dd01384, 0xfd063741, 0xd2074500, 0x0077041d, 0x07b4005d, 0x54400f14,
-0x00000620, 0x00000000, 0x00b70001, 0x083c005b, 0x93c061e0, 0x7c484f20,
-0xc00cb813, 0x00df0037, 0x2df0037c, 0xdf0037c0, 0xf0227c00, 0x0443c815,
-0x037c209f, 0x07c00df0, 0x00000c00, 0x00000000, 0x003f0880, 0x03fc003b,
-0x8fc00730, 0xcc01f300, 0xd00f3603, 0x00df003c, 0x1f3003fc, 0xff003fc0,
-0xf007fc00, 0x003fc00f, 0x035e80b3, 0x00d00f30, 0x00000c22, 0x00000000,
-0x01322081, 0x2d740051, 0x87402552, 0x44111100, 0x420d1083, 0x80dd2034,
-0x4d120374, 0xdd203748, 0xd2037480, 0x60074805, 0x03748051, 0x04400df2,
-0x00000800, 0x00000000, 0x0034a001, 0x00740399, 0xa7410d10, 0x44089100,
-0x400d5103, 0x00dd0034, 0x4d140374, 0xdd007740, 0xd0237400, 0x0037440d,
-0x03740051, 0x04400d12, 0x00000200, 0x00000000, 0x00302810, 0x00340001,
-0x03400010, 0x04000108, 0x400c1003, 0x00cd0030, 0x0c100374, 0xcd007340,
-0xd0023420, 0x00026004, 0x03740081, 0x40500cd0, 0x00000080, 0x00000000,
-0x0036a000, 0x027c001b, 0x07c00134, 0x8c009300, 0xe20d3003, 0x00ff883c,
-0x0d3803fe, 0xfd8037e0, 0xf8027e00, 0x8037e00d, 0x03de0093, 0x00e00d38,
-0x00000ac0, 0x00000000, 0x003ba825, 0x00fc803f, 0x0fc003f0, 0xfc003f00,
-0xc00ff003, 0x00ff003f, 0x0ff003f8, 0xff003fc0, 0xf002fc00, 0x100f8007,
-0x03fc007d, 0x17c00ff0, 0x00000e60, 0x00000000, 0x003fa003, 0x40fc002b,
-0x3fc423b8, 0xcec09522, 0xc24fb033, 0x0c33133f, 0xc1704b7c, 0xf300bcc1,
-0x2093fca0, 0x411cc08f, 0x00fc08b3, 0x0ce06f30, 0x00000e00, 0x00000000,
-0x08331801, 0x091c8013, 0xbdc26514, 0xcc16b100, 0x40cf1033, 0x02c101bf,
-0x6c100bc4, 0xf100bc40, 0x100b7410, 0x0494c04d, 0x005c44d1, 0x0c40ad10,
-0x00000c20, 0x00000000, 0x0023a011, 0x52340045, 0x33606012, 0x14888102,
-0x410c5113, 0x06d58333, 0x40100326, 0xc521b048, 0x10237444, 0x0306440c,
-0x007400c1, 0x4c404c10, 0x00000e80, 0x00000000, 0x0225a007, 0x23541015,
-0x31628510, 0x54009180, 0x400dda83, 0x00d50037, 0x1d140306, 0xd5003440,
-0x10037400, 0x0014408d, 0x095408d1, 0x0c440d10, 0x00000620, 0x00000000,
-0x0077a882, 0x147c0917, 0x37c00910, 0x5c409300, 0xc00d7403, 0x00154037,
-0x0878036c, 0xd74034c0, 0x30037860, 0x0056c030, 0x097c0093, 0x00400d30,
-0x00000e22, 0x00000000, 0x607d8007, 0x04fc813b, 0x3fc40f73, 0x2d00af20,
-0xc00f3003, 0x20fb383b, 0x0ff3036c, 0xfb003bd0, 0xf4037c00, 0x015fc01b,
-0x01dc01ff, 0x1fc80df4, 0x00000602, 0x00000000, 0x40250802, 0x0a6c0253,
-0x37c809b4, 0x4c009700, 0xc80db083, 0x08db2037, 0x0934036d, 0xd30034c0,
-0xb0134c00, 0x0025c021, 0x097c00df, 0x08c04d30, 0x00000420, 0x00000000,
-0x2024a013, 0x02441110, 0xff413d10, 0xc50bbd02, 0x41af1003, 0x00d302bf,
-0x0d1083e8, 0xf0003c40, 0x10039400, 0x0112c009, 0x133400dd, 0x0d402f10,
-0x00000200, 0x00000000, 0x00262003, 0x00641189, 0x33613012, 0x04088502,
-0x401c1003, 0x801110b3, 0x04000304, 0xc1003040, 0x90031400, 0x00114808,
-0x483400cd, 0x1c400d10, 0x00000a00, 0x00000000, 0x006a0804, 0x058509b1,
-0x7b401210, 0x8601bd00, 0x405e1017, 0x05e92173, 0x9e000784, 0xc1017040,
-0x10079401, 0x105a4496, 0x04f401ed, 0x7d409e14, 0x00000200, 0x00000000,
-0x00321012, 0x802c2003, 0x33423813, 0x0e018721, 0xc01c3827, 0x01c30173,
-0x54201704, 0xc30070c0, 0xb0071c05, 0x0011c629, 0x023c68cf, 0x48c08c30,
-0x00000040, 0x00000000, 0x003da802, 0x01fc207f, 0x37c08b72, 0xfc148f00,
-0x880d70ab, 0x00d740b7, 0x8ff263fc, 0xff02bfd2, 0xf143fc04, 0x003fc007,
-0x23bc40ff, 0x0bc18ff0, 0x00000660, 0x00000000, 0x00278014, 0x074c000f,
-0x37e00530, 0x4c029f04, 0xd04df02b, 0x401f12b4, 0x0d70937c, 0xdf12b4c4,
-0xf0034e06, 0x00149003, 0x017c80df, 0x54c00df0, 0x00000e00, 0x00000000,
-0x00299912, 0x03ac002d, 0x39c80630, 0x84148d21, 0x432c7003, 0x00ef0038,
-0x0f103334, 0xed003844, 0xd3079c08, 0x00184208, 0x01b400ed, 0x4c504ed0,
-0x00000624, 0x00000000, 0x00790000, 0x072401ad, 0x7b601e55, 0xb401ad12,
-0x405ed017, 0x01ed017a, 0x1e1017b4, 0xcd017844, 0xd107a409, 0x08ea4832,
-0x87b401ed, 0x06501ed0, 0x00000402, 0x00000000, 0x10332016, 0x432640cd,
-0x35400c50, 0x35409d00, 0x400d5003, 0x00cd0032, 0x0c100334, 0xcd003040,
-0xd0031400, 0x00724008, 0x233400dd, 0x4a4c0cd0, 0x00000c20, 0x00000000,
-0x80178817, 0x11c4027d, 0x17400750, 0x7c807f00, 0x4805f001, 0x007f0016,
-0x0712017c, 0x5f8014c8, 0xf001ec00, 0x009ec037, 0x0df4005f, 0x5ed005d0,
-0x00000620, 0x00000000, 0x00058012, 0x007c101f, 0x05c04138, 0x0c001f80,
-0xc0217000, 0x02170005, 0x11a0007c, 0x1f8007c0, 0xf0005c00, 0x0045c001,
-0x047c001f, 0x49c001f0, 0x00000c00, 0x00000000, 0x00210810, 0x024d009b,
-0x27ca0970, 0x4c029308, 0xc009b002, 0x00930260, 0x0830023c, 0x8f2024c0,
-0x30820c20, 0x0024d108, 0x224c009f, 0x40c018f2, 0x00000c20, 0x00000000,
-0x00260001, 0x42448083, 0xa7c02971, 0x45039b40, 0x51291202, 0x02950164,
-0x09b10274, 0x9d002440, 0x500e5400, 0x00644009, 0x0644009d, 0x06c019d0,
-0x00000800, 0x00000000, 0x0024801c, 0x02440099, 0xa74029d0, 0x46109100,
-0x48091402, 0x00910024, 0x09920276, 0x95002440, 0x10224400, 0x00746009,
-0x02440095, 0x604089d0, 0x00000200, 0x00000000, 0x82202814, 0x22040089,
-0x234088d0, 0x04808108, 0x40081022, 0x08c50220, 0x88902234, 0x8d022050,
-0x50021408, 0x82206428, 0x0205088d, 0x424088d0, 0x00000080, 0x00000000,
-0x1586b01d, 0x584c001b, 0x07c161f9, 0x4c141105, 0xe141b058, 0x56130584,
-0x61b0587c, 0x1f0584c5, 0x32514402, 0x2584c941, 0x814e021f, 0x74c161f8,
-0x00000ac0, 0x00000000, 0x012fa919, 0x12fc00b7, 0x25c04b70, 0x7c34bf05,
-0xc149f412, 0x04bf0127, 0x4bb0127c, 0x9f0127c8, 0xf0027c06, 0x013fc00b,
-0x03fca4bf, 0x67c048f2, 0x00000e64, 0x00000000, 0x00a7a018, 0x0adc00bf,
-0x2cc02ff0, 0x7c4cb701, 0xc90b320a, 0x00bf00af, 0x69f0127c, 0x9314a4c9,
-0x3012cc10, 0x01acc049, 0x02cc0093, 0x64c02bf0, 0x00000e00, 0x00000000,
-0x2003181c, 0x086d001d, 0x84d00078, 0x5c0e1147, 0x4021b008, 0x001d0187,
-0x20d01064, 0x11008442, 0x18287406, 0x01044271, 0x00445411, 0x704821d0,
-0x00000c22, 0x00000000, 0x00a10012, 0x1a34009d, 0x200828d0, 0x36008100,
-0x4548509a, 0x168d81a3, 0x08d04a34, 0x85812040, 0x10026410, 0x01a24188,
-0x02040091, 0x484068d0, 0x00000e80, 0x00000000, 0x00252018, 0x0364009d,
-0x344029d0, 0x1420d008, 0x40095d02, 0x109d1027, 0x09d00264, 0x85102042,
-0x10027480, 0x00664209, 0x12450891, 0x604009d0, 0x00000620, 0x00000000,
-0x0067a805, 0x127c1b9f, 0x24c009d0, 0x7c809300, 0x40095902, 0x219f3027,
-0x08f80274, 0x974024c0, 0x10024c00, 0x00a6c009, 0x0e4c0083, 0x14d009f0,
-0x00000e20, 0x00000000, 0x01258012, 0x027d009f, 0x27c00970, 0x5c009f28,
-0xc009b002, 0x049f0027, 0x09f0027c, 0x9b4027d0, 0xf4025c00, 0x4025c009,
-0x027c009f, 0x5bc009f0, 0x00000600, 0x00000000, 0x00050810, 0x084c0213,
-0x00e0a170, 0x7c001300, 0xc001b000, 0x12130007, 0x01f0006c, 0x131004c0,
-0x31004c00, 0x4084c000, 0x044c0013, 0x50c001f0, 0x00000420, 0x00000000,
-0x0014a014, 0x01c43361, 0x5d4007d0, 0x74007d30, 0x40174081, 0x0371001f,
-0x07920168, 0x51001448, 0x10019400, 0x00545007, 0x09c40051, 0x505007d0,
-0x00000200, 0x00000000, 0x0032a014, 0x630406c9, 0x70451d93, 0x3400c108,
-0x601c1003, 0x0bc90033, 0x0c500304, 0xc8083040, 0x10030600, 0x4034440c,
-0x030400c1, 0x504189d0, 0x00000a00, 0x00000000, 0x01788801, 0x03858029,
-0x19600e90, 0xb4426d04, 0x41025013, 0x41e9005b, 0x8e9203a4, 0xe9083040,
-0x14019404, 0x0420405e, 0x838404e1, 0x144002d0, 0x00000200, 0x00000000,
-0x43781011, 0x858c81e3, 0x786216f0, 0xfc41a300, 0xc01e341f, 0x01cb0073,
-0x5ee0078c, 0xcb0278c0, 0x32048c07, 0x0078e02c, 0x078d05f3, 0x54c01ff0,
-0x00000040, 0x00000000, 0x0235a810, 0x017d0007, 0x17c00df0, 0x7c005f00,
-0xc009305b, 0x80d70037, 0x2db02b7c, 0xd713b7c4, 0xf0003c50, 0x0027c01d,
-0x037c09df, 0x43c007f2, 0x00000660, 0x00000000, 0x007d2000, 0x27fe0137,
-0x7cc05df2, 0x4c09f902, 0xc01f7027, 0x01f3027c, 0xfd320f4c, 0xd30374c0,
-0x30170c01, 0x007dc01f, 0x05bc01f3, 0x08c89f30, 0x00000e00, 0x00000000,
-0x02391815, 0x238c0863, 0x4ac01030, 0x0c0d2102, 0x40105207, 0x018f0054,
-0x9f1007c4, 0xcb007441, 0x50250c61, 0x423c408f, 0x23b400e1, 0x5440ce10,
-0x00000620, 0x00000000, 0x00390000, 0xa114003d, 0x38438610, 0xa448a101,
-0x600ed003, 0x0c601039, 0x0e121384, 0xe5c23860, 0x9000b424, 0x0028400e,
-0x03b410e1, 0x20400a10, 0x00000400, 0x00000000, 0x80312004, 0x01040041,
-0x00400091, 0x04000100, 0x40089003, 0x01150031, 0x3c100304, 0xd9003040,
-0xd4801440, 0x00a0402c, 0x0b3400c1, 0x18500810, 0x00000c20, 0x00000000,
-0x003d8815, 0x435c1117, 0x24500938, 0xec00d340, 0xd00df003, 0x06d10025,
-0x0f3403cc, 0xf7203cd0, 0xb0037c80, 0x00b4d05f, 0x0f7c01f3, 0x54c00934,
-0x00000620, 0x00000000, 0x00370001, 0x035c8297, 0xb7c00c30, 0x7c02d708,
-0x40057003, 0x04df2006, 0x4cf0037c, 0xdc1033c0, 0x70014c40, 0x0167c10d,
-0x077c00df, 0x27c001f0, 0x00000c00, 0x00000000, 0x80330884, 0x23cd0933,
-0x04c001f0, 0xcc003e00, 0xc055f103, 0x00d3187c, 0x0f3003c4, 0xf3203ce0,
-0x3401cc00, 0x003cc00e, 0x43fc00f3, 0x07c009e0, 0x00000c20, 0x00000000,
-0x00360085, 0x0f558485, 0x96c09d70, 0x44024900, 0xc225f003, 0x40db0036,
-0x0d15036c, 0xd1103440, 0x10010500, 0x0020400f, 0x065c00db, 0x874011d0,
-0x00000800, 0x00000000, 0x0034a001, 0x80440011, 0x254009d0, 0x4440dd82,
-0x4028d003, 0x00d10120, 0x0d100314, 0xd1003440, 0x10074600, 0x0034400d,
-0x237400d1, 0x074019d0, 0x00000200, 0x00000000, 0x88302810, 0x00140005,
-0x236060d0, 0x04109901, 0x4100d883, 0x10890202, 0x6c10c334, 0xc1043040,
-0x10410410, 0x0034500c, 0x071400c9, 0x434008d0, 0x00000080, 0x00000000,
-0x003eb000, 0x00440011, 0x455031d9, 0x8c0b0f00, 0xc091f137, 0x41532174,
-0x3f10a7dc, 0xe301fc50, 0x303d4c8f, 0x0024c00d, 0x037c00d3, 0x07c009f0,
-0x00000ac0, 0x00000000, 0x003fa805, 0x00fd002f, 0x84023370, 0xec011f00,
-0xc0517037, 0x111f0377, 0x3ff017ec, 0xff457fc8, 0xf015fd05, 0x002fc00f,
-0x02dc00ff, 0x17c00bf0, 0x00000e60, 0x00000000, 0x002fa003, 0x00fc003b,
-0x0fc00fb0, 0xfcc43302, 0xc08ff030, 0x003b001e, 0x0fb010ec, 0xfb003bc0,
-0x3002fc04, 0x003ec003, 0x00ec00f3, 0x0cc00f30, 0x00000e00, 0x00000000,
-0x20270801, 0x00748081, 0x84480f10, 0x74c81102, 0x404fd020, 0x12d11194,
-0x0d502354, 0xf10435c0, 0x34023408, 0x02bd4601, 0x024400d5, 0x05400f10,
-0x00000c60, 0x00000000, 0x0023a011, 0x82348889, 0x32500c90, 0x14a04109,
-0x404cd010, 0x060d0492, 0x0c100024, 0xc9013340, 0x10001400, 0x00304208,
-0x022400c1, 0x44440c10, 0x00000e80, 0x00000000, 0x0025a803, 0x43740391,
-0x34440d10, 0x7406d102, 0x400dd013, 0x00c10010, 0x0d510344, 0xd1083740,
-0x900664a0, 0x0035430d, 0x036400d5, 0x0d400d10, 0x00000600, 0x00000000,
-0x00278802, 0x087c839b, 0xc6c00db2, 0x7c201300, 0xc80df084, 0x803b011e,
-0xad3400ec, 0xdb02b7c0, 0x300e7c40, 0x0036c025, 0x256c00d3, 0x08400d30,
-0x00000e22, 0x00000000, 0x01298007, 0x15fc00bf, 0x4e400ef0, 0xf401bf44,
-0xc00ef083, 0x00fd001f, 0x1ff003fc, 0xdf107cc8, 0x7003bc00, 0x0037c03e,
-0x079c00ef, 0x1fc00ef2, 0x00000600, 0x00000000, 0x00250802, 0x0a0c00df,
-0xb4c00d70, 0x4c025f08, 0xc00df100, 0x003f001e, 0x0db020bc, 0xd340b6c0,
-0x700a5c40, 0x2030c101, 0x025d00d7, 0x08d00d30, 0x00000420, 0x00000000,
-0x0024a013, 0x034400dd, 0xf6c02f10, 0x4507dd00, 0x400fd003, 0x00dd0017,
-0x7d100340, 0xf1003740, 0x10136c00, 0x083c481d, 0x034400f1, 0x4c400f1a,
-0x00000200, 0x00000000, 0x0022a007, 0x000405cd, 0x05411c50, 0x14074d10,
-0x420c9000, 0x000d2033, 0x7cd04010, 0xc5403640, 0x10060400, 0x003044a0,
-0x011400cd, 0x0d400c10, 0x00000a80, 0x00000000, 0x00788004, 0x048401ed,
-0x4b509c10, 0x84096d04, 0x401ed004, 0x41ed007b, 0x1e103784, 0xe5007b40,
-0x1003a601, 0x00780000, 0x270481e9, 0x10401c10, 0x00000820, 0x00000000,
-0x02201012, 0x004c10cf, 0x81c18c70, 0x1c00df00, 0x480cf00b, 0x041f8033,
-0x0cf0101c, 0xc700b2c0, 0x702a1c20, 0x0030c08c, 0x221c00df, 0x48c08c10,
-0x00000040, 0x00000000, 0x002db802, 0x20fc08ff, 0x0ec08ff0, 0xfc00ff00,
-0x410ff003, 0xc0ff003f, 0xadf0139c, 0xdb0037c0, 0xf0136c02, 0x023fc04f,
-0xa3fc00f7, 0x0bc00ff2, 0x00000620, 0x00000000, 0x0027a015, 0x044d00d3,
-0x35c08d30, 0x4d00df00, 0xc07df013, 0x00330036, 0x4c3400cd, 0xd30230c0,
-0xf002fc02, 0x01b4c00d, 0x847c00d3, 0x43c04d32, 0x00000e00, 0x00000000,
-0x00398812, 0x000400f7, 0x38c08c10, 0x8400cd08, 0x40ccd043, 0x00c10830,
-0x4e100304, 0xf5023840, 0xd0038404, 0x033c500e, 0x02b440e5, 0x4b414e50,
-0x00000664, 0x00000000, 0x00f90003, 0x048401e5, 0x7b405e10, 0x8481ed00,
-0x405ed08f, 0x0121007a, 0x9f100484, 0xe5017c40, 0xd004b409, 0x0278401e,
-0x06340de1, 0x13429e10, 0x00000400, 0x00000000, 0x20772812, 0x00042ac5,
-0xb1400c10, 0x0404cd01, 0x400cd003, 0x00c14034, 0x2c100305, 0xd5203040,
-0xd0070400, 0x0030406d, 0x033400c5, 0x5b400c50, 0x00000c00, 0x00000000,
-0x005d8817, 0x45cc0173, 0x9fc00534, 0x4c007d10, 0xc005f005, 0x00530016,
-0x0231014c, 0x57160cd1, 0xf045fc00, 0x0014c077, 0x41f40053, 0x5fc00534,
-0x00000e20, 0x00000000, 0x00070012, 0x007c921d, 0x868420f0, 0x7ca01f00,
-0xc001f240, 0x203f0007, 0x21f008fc, 0x1f0007c0, 0xf0407c00, 0x0007c021,
-0x007c001f, 0x4bc801f0, 0x00000600, 0x00000000, 0x00270810, 0x024c008b,
-0x20e409f0, 0x4c009300, 0xc009b003, 0x40870027, 0x01360e4c, 0x970004c1,
-0x74021c00, 0x0825c059, 0x024c0097, 0x43c009f0, 0x00000420, 0x00000000,
-0x00260001, 0x06540091, 0xa4e0c970, 0x54009100, 0x4409d002, 0x00910027,
-0x91100a2c, 0x91000440, 0x52064400, 0x00244019, 0x82440091, 0x174009d0,
-0x00000800, 0x00000000, 0x0024a018, 0x06440098, 0x265409d0, 0x44018100,
-0x40099202, 0x00b50027, 0x055202c4, 0x95080040, 0xd0225400, 0x10234809,
-0x02440085, 0x734009d0, 0x00000200, 0x00000000, 0x12202010, 0x721408c1,
-0x21400850, 0x1408c102, 0x4008d202, 0x2ca10323, 0x8c1032a4, 0x81022050,
-0xd00a0402, 0x0122402c, 0x0a040085, 0x534028d0, 0x000000a0, 0x00000000,
-0x0586b01d, 0x184c161b, 0x964141f0, 0x4c161345, 0xc001a050, 0x031700c7,
-0x61700dcc, 0x170584c1, 0xf0005c14, 0x02c7c001, 0x004d1e17, 0x67c001f0,
-0x00000ac0, 0x00000000, 0x092fb819, 0x12fc04bf, 0x3ec009f2, 0x7c04bf01,
-0xc169f052, 0x0c9f0327, 0x4bf03278, 0x9f012fc0, 0x740afc00, 0x0265442a,
-0x0afc819b, 0x67c029f0, 0x00000e24, 0x00000000, 0x0227a018, 0x42fc08bf,
-0x3cc14930, 0x7c10bf00, 0xc109f042, 0x01930067, 0x5a3016cc, 0x930663c1,
-0xf0324c20, 0x0424c34a, 0x027c049b, 0x60c049b0, 0x00000e00, 0x00000000,
-0x0387081c, 0x00740a1d, 0x805021b0, 0x5c021d0a, 0x4021d000, 0x1e114087,
-0x7150146c, 0x15008740, 0xd039453e, 0x00854061, 0x00740211, 0x60414110,
-0x00000c60, 0x00000000, 0x0023a010, 0x5234048d, 0x20400810, 0x34148d14,
-0x4008d002, 0x008105a3, 0x08904a04, 0x81012741, 0xd0020400, 0x05204518,
-0x52341c89, 0x48402890, 0x00000400, 0x00000000, 0x0825a818, 0x0274009d,
-0x24400990, 0x54109d01, 0x4009d282, 0x00910027, 0x01d00064, 0x95042740,
-0xd2824440, 0x00254009, 0x2a742095, 0x60400910, 0x00000600, 0x00000000,
-0x3067a805, 0x1e7c139f, 0xa4c00930, 0x74289f00, 0xc409f24e, 0x00934027,
-0x41b0004c, 0x830023c0, 0xf08a4c00, 0x0024c009, 0x0a7c009b, 0x149009b0,
-0x00000e20, 0x00000000, 0x00a58014, 0x127c049c, 0x27c00df0, 0x5c019f00,
-0xc009f026, 0x009f0027, 0x9170007c, 0x9f1227c8, 0xf2437c00, 0x0827c139,
-0x067c009b, 0x4bc009f0, 0x00000600, 0x00000000, 0x00050814, 0x807c021f,
-0x860240f0, 0x7c201301, 0xc001f008, 0x40030801, 0x2132100c, 0x131004d0,
-0x30085c00, 0x0006c801, 0x887c2013, 0x43c001f0, 0x00000420, 0x00000000,
-0x0014a014, 0x4574007d, 0x5d4815d0, 0x74007101, 0x4005d001, 0x005b0014,
-0xa3100cc5, 0x75001c41, 0x160d4400, 0x00144017, 0x01748051, 0x534005d0,
-0x00000200, 0x00000000, 0x0032a014, 0x037401c9, 0x32400cd0, 0x3480c110,
-0x400cd883, 0x00c10031, 0x1c100305, 0xc1003040, 0x10071400, 0x08365425,
-0x037400c1, 0x53400dd8, 0x00000a00, 0x00000000, 0x08388005, 0x03b442ad,
-0x79502ed0, 0xb400e100, 0x405cd013, 0x04c90138, 0x1f122b14, 0xe5023848,
-0x1446c488, 0x1038502e, 0x23b400e1, 0x07404ed8, 0x00000220, 0x00000000,
-0x00781015, 0x06bc01ef, 0x7ac01cd0, 0xbc012300, 0xc01ef01f, 0x01e32071,
-0x1e34478d, 0xf34378c1, 0x30a79c05, 0x417ed016, 0x07bc01e3, 0x47c0bef0,
-0x00000040, 0x00000000, 0x0235b810, 0x827c001f, 0x17c269f0, 0x7c80df40,
-0x408df003, 0x84df0137, 0xcdf29364, 0xdb00b7c0, 0xf2033c00, 0x07b7c00d,
-0x037c22df, 0x43c02df0, 0x00000620, 0x00000000, 0x007ba800, 0x26cc01f3,
-0x5fc03ff2, 0xfc81ff00, 0xc01f7027, 0x13f304fd, 0x1f3007cc, 0xf3007fc0,
-0x3004cc01, 0x087fc09f, 0x87cc93f3, 0x00c01f30, 0x00000400, 0x00000000,
-0x08399015, 0x828408ab, 0x2840aed0, 0xf400ed02, 0x400f10c3, 0x10e10038,
-0x4e501384, 0xe1213b40, 0x10008404, 0x013b40ce, 0x038c00fb, 0x54680e14,
-0x00000460, 0x00000000, 0x063d0000, 0x428400e1, 0x184006d8, 0xb4002d00,
-0x400e5003, 0x00e10031, 0x0e110384, 0xe1203b40, 0x9020a420, 0x083b440a,
-0x03a400e1, 0x00400e10, 0x00000400, 0x00000000, 0x10332004, 0x02040201,
-0x004000d0, 0x3406cd00, 0x440c1007, 0x45c14030, 0x3c521704, 0xc100f340,
-0x92012540, 0x00334208, 0x0b0000c9, 0x10400c11, 0x00000400, 0x00000000,
-0x0079a035, 0x074d0041, 0x24d00df0, 0xfc00df00, 0xc00f7003, 0x03f3003d,
-0x8d344f4d, 0xf3063fc1, 0xb0036c00, 0x003fc235, 0x1fed00f3, 0x54d00f20,
-0x00000620, 0x00000000, 0x00370001, 0x037c00df, 0x31c024f0, 0x3c001f00,
-0xc40cf003, 0x20cf0037, 0x0df0037c, 0xcf0037c0, 0x72475c00, 0x0037c059,
-0x031c00df, 0x07c00df0, 0x00000c00, 0x00000000, 0x803f0080, 0x02cc1173,
-0x2cc03ff0, 0xcc002300, 0xc00f0043, 0x00df003d, 0x0f38030c, 0xff003cc0,
-0xf2131c00, 0x0037c00f, 0x434c00f3, 0x13c00f30, 0x00000c22, 0x00000000,
-0x00362081, 0x02540351, 0x554011d0, 0x440b1102, 0x400db003, 0x00dd0834,
-0x0c100344, 0xdd083440, 0x10024400, 0x0037411d, 0x036c80db, 0x17400d10,
-0x00000802, 0x00000000, 0x0034a001, 0x07440611, 0x044009d0, 0x4402d110,
-0x400d5003, 0x00dd2035, 0x1d520774, 0xdd083440, 0x90005600, 0x0033401d,
-0x034400c1, 0x07400d10, 0x00000200, 0x00000000, 0x00342810, 0x03140091,
-0x204000d0, 0x04200500, 0x400cd003, 0x00cd0030, 0x1c100735, 0xcd003052,
-0x10010400, 0x00334008, 0x032600c9, 0x43400c10, 0x000000a0, 0x00000000,
-0x0036a000, 0x024c0001, 0x04c001f0, 0x4d001340, 0xc00d7003, 0x00ff003d,
-0x0d54037c, 0xdf083c40, 0xf0005c00, 0x003fc009, 0x034c40f3, 0x03c00e34,
-0x00000ac0, 0x00000000, 0x003fa805, 0x02fc003f, 0x0fd002f0, 0xfc003b00,
-0x800fb003, 0x40ff103f, 0x0ff003cc, 0xef003bc0, 0xf100fc00, 0x003fc00b,
-0x03fc00ff, 0x17c00ff0, 0x00000e20, 0x00000000, 0x023fa003, 0x50ed003f,
-0x37c083f0, 0xfc04d300, 0xc2cdb002, 0x06df01bf, 0x0f3019fc, 0xf3003cc0,
-0xf023dc04, 0x023cd08e, 0x12fc04ff, 0x0cc04b31, 0x00000e00, 0x00000000,
-0x01370801, 0x1845021d, 0xbb4081d2, 0x7402fb22, 0x40cf7032, 0x8edd00bf,
-0x0d100874, 0xf106b440, 0xd003441e, 0x0130404d, 0x227402dd, 0x0c402d10,
-0x00000c20, 0x00000000, 0x0033a011, 0x4134020d, 0x334000d0, 0x3416c10d,
-0x400cd140, 0x00cd0333, 0x1c101914, 0xc1813444, 0xd0131404, 0x0030600c,
-0x023408cd, 0x4c428c12, 0x00000e80, 0x00000000, 0x0035a803, 0x0154081d,
-0x374401d0, 0x7440d910, 0x400dd006, 0x40dd0037, 0x1d100174, 0xd1003442,
-0xd0034400, 0x0035410d, 0x027400dd, 0x0c404d11, 0x00000620, 0x00000000,
-0x0037a802, 0x0b7d101f, 0x37c03df0, 0x7c00d300, 0xc00db047, 0x00dd0037,
-0x0c310938, 0xd30034d0, 0xf0035c00, 0x0034d08c, 0x027c00df, 0x08c00934,
-0x00000e22, 0x00000000, 0x203d8007, 0x036c817f, 0x3fc09df2, 0xfc00ff00,
-0xc20d5203, 0x80ff003f, 0x0ff000fc, 0xdf003fc0, 0xf00bfc00, 0x003ec01f,
-0x163c00df, 0x1fc21ef8, 0x00000600, 0x00000000, 0x02350802, 0x096c009f,
-0x31d02134, 0x7c80d308, 0xd00d3401, 0x00d70034, 0x4db0095c, 0xd70037c0,
-0xf0435c00, 0x4034c80d, 0x024c00d3, 0x08d00d30, 0x00000420, 0x00000000,
-0x087ca013, 0x294500dd, 0x3c40a110, 0x7400f100, 0x000f1003, 0x00f5003c,
-0x0d100144, 0xfd103b40, 0xd1034491, 0x003c500d, 0x025400f1, 0x6c40ad10,
-0x00000200, 0x00000000, 0x0072a007, 0x000440dd, 0x30400090, 0x3400c100,
-0x409c1002, 0x20c50030, 0x2c908104, 0xd5003340, 0xd00b1401, 0x0032500c,
-0x830080c5, 0x1c402c10, 0x00000a00, 0x00000000, 0x00788004, 0x048409cd,
-0xf8409290, 0xf409e102, 0x409e1037, 0x8de51070, 0x5e1024c4, 0xec007b41,
-0xd2878405, 0x007a429e, 0x279421e5, 0x74001e14, 0x00000200, 0x00000000,
-0x00301012, 0x2b0c00cf, 0x71c0fcb0, 0x3c85c301, 0xc05c3406, 0x01d70030,
-0x9cb0290c, 0xc70173c0, 0xf21f1c01, 0x2832c88c, 0x030c00c7, 0x48c00830,
-0x00000040, 0x00000000, 0x003db802, 0x03dc00ff, 0x37e00d70, 0x3c0aff42,
-0xc08df083, 0x38df00b7, 0x0ff0a3ae, 0xde0237c0, 0xf0237c10, 0x023dc08f,
-0x03fc10fb, 0x0bc00af0, 0x00000660, 0x00000000, 0x0037a015, 0x034c001f,
-0x36c00df0, 0x6c08d301, 0xc04d3082, 0x00df033c, 0x2db0034c, 0xd30237c0,
-0x311b4c06, 0x0034c04c, 0x02fc01d3, 0x57c00d30, 0x00000e00, 0x00000000,
-0x00b98812, 0x03ac006d, 0xb8000ed0, 0x8404c105, 0x42cc1003, 0x04ed1138,
-0x0e100094, 0xc1013f41, 0x1053c40c, 0x00bd40ce, 0x02b405e1, 0x4f400e10,
-0x00000624, 0x00000000, 0x00790003, 0x0f8503ad, 0x71401ed0, 0x0401e100,
-0x40de1046, 0x05ed007a, 0x9e1007c4, 0xe1007b40, 0x5037a401, 0x007a40ff,
-0x063400e1, 0x07401a10, 0x00000400, 0x00000000, 0x00332812, 0x436400cd,
-0x31400dd0, 0x0400c100, 0x400c1403, 0x00cd0036, 0x4c100314, 0xc1003340,
-0x50132440, 0x1037445d, 0x223400c1, 0x4b400810, 0x00000c20, 0x00000000,
-0x0015a817, 0x01cc007f, 0x17d0f7f0, 0xac005300, 0xc0053005, 0x005f0016,
-0x333409cc, 0x63001fc1, 0x704ced00, 0x40168033, 0x053c0053, 0x5fc00538,
-0x00000620, 0x00000000, 0x00070012, 0x007c041f, 0x02c001f0, 0x7c801f00,
-0xc001f000, 0x401f0005, 0x2170047c, 0x1f0007c4, 0x90005e00, 0x0005c001,
-0x007c001f, 0x4bc021f4, 0x00000c00, 0x00000000, 0x00230810, 0x0a4c0083,
-0x24c00930, 0x4c008300, 0xc0283402, 0x00930026, 0x31b0020c, 0x9b2023c0,
-0x30804c05, 0x0024c401, 0x024c0083, 0x40d00870, 0x00000c20, 0x00000000,
-0x40a62001, 0x0a440091, 0x24540914, 0x44009110, 0x40091002, 0x80910024,
-0x01300244, 0x91002744, 0x10004400, 0x00244001, 0x0a440091, 0x04407910,
-0x00000800, 0x00000000, 0x00a4a018, 0x0a440091, 0x64401910, 0x44489100,
-0x68091002, 0x00810026, 0x01900244, 0x99002740, 0x10040500, 0x00244001,
-0x22440091, 0x60404950, 0x00000200, 0x00000000, 0x02202010, 0x22058881,
-0x20408810, 0x44048100, 0x40881072, 0x88816320, 0x0c102204, 0x91022340,
-0x14220608, 0x02204088, 0x02040081, 0x40400810, 0x00000080, 0x00000000,
-0x2586b01d, 0x584c5603, 0x04cb6030, 0x4d011105, 0xc1613018, 0x160320c6,
-0x41b0584d, 0x1b0587c1, 0x32584c16, 0x4084d161, 0x514c1413, 0x74c14170,
-0x00000ac0, 0x00000000, 0x0927b819, 0x12fc04bf, 0x27c04ff0, 0xfc1c9f45,
-0xc249f012, 0xa49f0327, 0x0b7012bc, 0x9e0127c8, 0xf012fc04, 0x01a7c04b,
-0x02fc009f, 0x67c00bf0, 0x00000e64, 0x00000000, 0x00afa018, 0x8acdc29f,
-0x2fc04bf0, 0x6c3cb308, 0xc86b321a, 0x849f00a7, 0x1bf2224c, 0xa320afc1,
-0x301ec014, 0x00a4c879, 0x02fc00b0, 0x63c00b30, 0x00000e00, 0x00000000,
-0x0807081c, 0x0844020d, 0x874161d0, 0x04461115, 0x40211000, 0x841d0283,
-0x01d0102c, 0x11010340, 0xb0184402, 0x11845000, 0x08740a1b, 0x71c02114,
-0x00000c20, 0x00000000, 0x01a3a010, 0x9a04028d, 0xb34088d0, 0x64008100,
-0x40685c1a, 0x128d0123, 0x18d00a14, 0x8100a760, 0x5a364414, 0x01a04078,
-0x0a340081, 0x4b402c10, 0x00000e80, 0x00000000, 0x0025a818, 0x4245028d,
-0x274009d0, 0x44209100, 0x4009500a, 0x009d0027, 0x19d00a74, 0x91202760,
-0x99064420, 0x00244019, 0x02740099, 0x61401910, 0x00000620, 0x00000000,
-0x0027a805, 0x064d009f, 0x27c039f0, 0x6c809340, 0xc0097402, 0x009f0027,
-0x09f0065c, 0x930027c0, 0x70020f00, 0x0024c808, 0x023c0093, 0x17c00930,
-0x00000e20, 0x00000000, 0x00258014, 0x167d009f, 0x23c039f0, 0x7c009f10,
-0xc009b002, 0x008f0027, 0x09f0266c, 0x9f4027c0, 0xf0427c00, 0x0023c009,
-0x427c009f, 0x59c009f0, 0x00000600, 0x00000000, 0x01050814, 0x006c001f,
-0x07c06130, 0x7c000704, 0xc0013008, 0x00130006, 0x4130007c, 0x030005c0,
-0xf0006c04, 0x0004d001, 0x006c801b, 0x53c01130, 0x00000420, 0x00000000,
-0x005ca014, 0x01c4005d, 0x1f403711, 0x34015100, 0x40050401, 0x00510015,
-0x071081f0, 0x71019840, 0x7009c402, 0x00144007, 0x09f41151, 0x53400714,
-0x00000200, 0x00000000, 0x0072a014, 0x072500cd, 0xb3000c12, 0x3409c580,
-0x400c9003, 0x00c10030, 0x28100334, 0xc1013340, 0xd0032408, 0x8032400c,
-0x212401c9, 0x53400410, 0x00000a00, 0x00000000, 0x0c388005, 0x0d8404ed,
-0x3f402610, 0xb440e100, 0x401a9003, 0x04e10079, 0x161837b4, 0xa1003a60,
-0x10038400, 0x0132404e, 0x013400e1, 0x17400610, 0x00000200, 0x00000000,
-0x00581015, 0x072c05ef, 0x7fc01a34, 0xbc01a710, 0xc41cb017, 0x07e1007a,
-0x1a3007bc, 0xe3007bc0, 0xf007ac01, 0x04fac03e, 0x04ac01eb, 0x57c01e30,
-0x00000040, 0x00000000, 0x2015b810, 0x017d38df, 0x37c001f0, 0x7c009f00,
-0xc00d714b, 0x02df42b7, 0x00f00b7c, 0xdf0035c0, 0xf0037c00, 0x01b5c04d,
-0x007c00df, 0x43c005f0, 0x00000660, 0x00000000, 0x006fa000, 0x86ec4df3,
-0x4fc01f30, 0xac81d340, 0xc01f2c47, 0x03f302fc, 0x91202f4c, 0x7f237cc0,
-0xf007c801, 0x007cc03f, 0x04fc09b1, 0x03c01ff0, 0x00000e00, 0x00000000,
-0x20b98015, 0x80ad08f1, 0x0f400c11, 0x0409e101, 0x484b5003, 0x00f1007d,
-0x144007c4, 0x0d007043, 0xf0150404, 0x1038410e, 0x10b400a1, 0x574006d0,
-0x00000620, 0x00000000, 0x02090000, 0x02a454e9, 0x0b408e90, 0xe408a020,
-0x440e5003, 0x08e10038, 0x4b1803a4, 0x6d203a40, 0xd0638600, 0x0038400e,
-0x02b480a1, 0x03400ad0, 0x00000400, 0x00000000, 0x80172804, 0x002500c9,
-0x03400c90, 0x44009100, 0x400c582f, 0x00c10031, 0x20582b24, 0x4d003240,
-0xd0850400, 0x0030402c, 0x02340081, 0x134000d0, 0x00000c20, 0x00000000,
-0x4035a815, 0x036d21fb, 0x37c00db4, 0xec00d300, 0xc00d700b, 0x00f3403c,
-0x28342fed, 0x5d0036c0, 0xf0070d00, 0x403cd02f, 0x017c0083, 0x57c005f0,
-0x00000620, 0x00000000, 0x28a70001, 0x037c00d7, 0x17e00470, 0x7c00df00,
-0xc009e403, 0x00df0837, 0x05f0035c, 0x1f0035c0, 0x70137c00, 0x0037c00d,
-0x017c009b, 0x07c085f0, 0x00000c00, 0x00000000, 0x003f0880, 0x08cd00f3,
-0xecc01bf0, 0xcc43df30, 0xc00f3043, 0x00fb003b, 0x0b3003bc, 0x132038c1,
-0x3012fc01, 0x0038c10f, 0x088d00b3, 0x00d05b30, 0x00000c22, 0x00000000,
-0x00e60081, 0x005400d1, 0x86c421d0, 0x6c00d909, 0x400d1083, 0x00d10037,
-0x01120374, 0x1b013440, 0x50027403, 0x0036c00c, 0x88440095, 0x04402010,
-0x00000800, 0x00000000, 0x4204a001, 0x0b4400c1, 0x344141d0, 0x44009d00,
-0x400d1003, 0x40d91037, 0x01100374, 0x51820440, 0x10037434, 0x0034400d,
-0x0b440491, 0x04402d14, 0x00000200, 0x00000000, 0x00002010, 0x031580c1,
-0x124000d0, 0x24508900, 0x40081003, 0x00c10433, 0x45504334, 0x09030040,
-0x50117400, 0x0032400d, 0x03040085, 0x40400410, 0x00000080, 0x00000000,
-0x0002a000, 0x000c00f3, 0xa4c001f0, 0xcc0b9f02, 0xc40d1403, 0x00fb007f,
-0xd93407f4, 0x538544c9, 0x30367c08, 0x0038c00e, 0x024c0093, 0x00c00130,
-0x00000ac0, 0x00000000, 0x000f9805, 0x00fc00ff, 0x4cc113f0, 0xdd41bb01,
-0xc11ff047, 0x11ff0037, 0x52b003fc, 0x7f0147c4, 0xf0347c05, 0x003fc00f,
-0x02fc00bf, 0x17c003f0, 0x00000e60, 0x00000000, 0x000fa803, 0x02bc00ff,
-0x2fc00bb0, 0xfc006300, 0xc04f32a0, 0x20bf022d, 0x02f003cc, 0xef003ec0,
-0x7011fc00, 0x010cc003, 0x03cd0473, 0x0fc00fb0, 0x00000e00, 0x00000000,
-0x00270801, 0x004400fd, 0x36400810, 0x7400d108, 0x408d1403, 0x009d2033,
-0x491013c5, 0xdd003440, 0xd2097400, 0x00b5422d, 0x03540251, 0x07400d10,
-0x00000c20, 0x00000000, 0x0803a211, 0x021400c5, 0x314208d2, 0x34800100,
-0x400c1013, 0x008d0023, 0x04504304, 0xcd007363, 0x50093401, 0x02015080,
-0x03240841, 0x47400c90, 0x00000e80, 0x00000000, 0x0045a803, 0x104400dd,
-0x364049d0, 0x74009142, 0x420d1011, 0x00dd0037, 0x45500344, 0xdd887540,
-0xd0017021, 0x0035400d, 0x03740811, 0x0f400d90, 0x00000620, 0x00000000,
-0x00c78002, 0x1a5400d7, 0x33c409f0, 0x7c21d200, 0xc00d3003, 0x408f0015,
-0x0d74034c, 0xdf0037c0, 0x7003fc00, 0x400dc203, 0x036c0253, 0x0bc00db0,
-0x00000e20, 0x00000000, 0x000d8007, 0x069800df, 0x7fc00b20, 0xf8037f00,
-0xc00df007, 0x02bf101f, 0x1f3083fc, 0xff203cc2, 0xf003fc20, 0x003bc00e,
-0x038c015f, 0x1fc00f72, 0x00000600, 0x00000000, 0x00450002, 0x2a6c84d3,
-0x75c049b1, 0x5c00df00, 0xd00d300a, 0x00930054, 0x2530039c, 0xdf1136c0,
-0x7047cc00, 0x000fc103, 0x034c225f, 0x08c00d70, 0x00000420, 0x00000000,
-0x4014a013, 0x064440f1, 0x76c06d50, 0x450e5d00, 0x400fb003, 0x20d14854,
-0x050003c4, 0xdd003400, 0x100b441b, 0x0037405d, 0x03ec001d, 0x4c410fb0,
-0x00000200, 0x00000000, 0x0012a007, 0x072402d1, 0xb0602800, 0x44400d01,
-0x409c1003, 0x52810000, 0x0d100314, 0xcd00f050, 0x90091700, 0x04034020,
-0x0304095d, 0x1c401c10, 0x00000a00, 0x00000000, 0x0a788004, 0x068401e1,
-0x7a401a51, 0x8401ed10, 0x401e9006, 0x81e10258, 0x1e9007e4, 0xed807840,
-0x18059481, 0x007b421e, 0x07a609ed, 0x10400e90, 0x00000200, 0x00000000,
-0x00801012, 0x212c10c1, 0x31c0c830, 0x5c080f00, 0xc00c301b, 0x00830080,
-0x0430031c, 0xcd043040, 0xb0011c00, 0x0003c000, 0x034c02cf, 0x48c08d70,
-0x00000040, 0x00000000, 0x0029b802, 0x20fc00fe, 0x3fe08f70, 0xfc00ff00,
-0xc00ff003, 0x00ef401f, 0x0772039c, 0xfd0035c0, 0xf001ac42, 0x003fc00f,
-0x43fc00ff, 0x0bc04ff0, 0x00000660, 0x00000000, 0x0053a015, 0x035c88d3,
-0xb38009f1, 0x7c009300, 0xc00df801, 0x00934053, 0x1db013fc, 0xc70037c0,
-0x30034c0a, 0x600fc003, 0x834c00d3, 0x57c00df2, 0x00000e00, 0x00000000,
-0x00398012, 0x03840cfb, 0x3b400ad0, 0xb4406102, 0x405ed003, 0x00e1081b,
-0x0e814bf4, 0xed03bb40, 0x50030400, 0x003b400e, 0x138480e5, 0x4b402ed0,
-0x00000620, 0x00000000, 0x04490003, 0x059625e1, 0x7b403a50, 0xb401a100,
-0x449ed007, 0x01a1005f, 0x061013b4, 0xed007b60, 0x10079507, 0x00434012,
-0x078401c1, 0x0f401e50, 0x00000400, 0x00000000, 0x00332812, 0x091420d9,
-0x73441cd0, 0x74124942, 0x4a0cd010, 0x00c10413, 0x14100374, 0xcd003340,
-0x501b1400, 0x0037400c, 0x030402d5, 0x4b400cd0, 0x00000c20, 0x00000000,
-0x001da817, 0x0ddc0051, 0x13c01572, 0x74135300, 0xc005f80d, 0x005330df,
-0x27b001fc, 0x2f040bc0, 0x10095c00, 0x0017c005, 0x014c0273, 0x5fc00570,
-0x00000620, 0x00000000, 0x01070012, 0x3024001f, 0x87c021d0, 0x7c401700,
-0xc001f020, 0x001f1207, 0x91f0007c, 0x1f0007c0, 0xf0002804, 0x000fc002,
-0x007d101f, 0x4bc801f0, 0x00000c00, 0x00000000, 0x00270810, 0x024c0097,
-0x75c08870, 0x4c008300, 0xc0293102, 0x019f0227, 0x0930026c, 0x134405c0,
-0x30064c00, 0x0064d019, 0x024d0093, 0x43c00970, 0x00000c20, 0x00000000,
-0x00262001, 0x2254029d, 0xe4405910, 0x6c0191c0, 0xc0191002, 0x818d0025,
-0x09b00245, 0x1106c444, 0x10066c20, 0x02644019, 0x02440195, 0x074009b0,
-0x00000800, 0x00000000, 0x0064a018, 0x0245109d, 0x256809d0, 0xc6049502,
-0x40091002, 0x089d0027, 0x0c180244, 0x11800440, 0x10224406, 0x002c408b,
-0x02040491, 0x63404950, 0x00000200, 0x00000000, 0x02202010, 0x0314088d,
-0x30408810, 0xa400a100, 0x41481422, 0x008d0021, 0x88902204, 0x91022040,
-0x10062488, 0x00a8402a, 0x0a040285, 0x43408890, 0x00000080, 0x00000000,
-0x0586a01d, 0x5044021f, 0x05c161f1, 0xcc141510, 0x40413008, 0x005f0287,
-0x2130084c, 0x110585c0, 0x34004c16, 0x000cc001, 0x804c0013, 0x77c02170,
-0x00000ac0, 0x00000000, 0x092f9819, 0x02fc869f, 0x27c04bf2, 0x7c00bf00,
-0xc009f012, 0x00bf006f, 0x4bf01a7c, 0xbf012f40, 0xf00a7c04, 0x00a7c029,
-0x0a7c02bf, 0x67c069f0, 0x00000e60, 0x00000000, 0x050ba018, 0x02ec18ab,
-0x2cc14b30, 0x4c14bf00, 0xc9083022, 0x00a30027, 0x2830025c, 0xa200ecc0,
-0xf016fc15, 0x04e8c059, 0x1a4c44b3, 0x63c0cbb0, 0x00000e00, 0x00000000,
-0x00c7081c, 0x00444211, 0x06c06110, 0x44021d00, 0x40211000, 0x00112103,
-0x01101044, 0x11004440, 0xd1087407, 0x01854160, 0x00440015, 0x73400110,
-0x00000c20, 0x00000000, 0x4023a010, 0x0f240481, 0x20410850, 0x24009d00,
-0x40081416, 0x20814c23, 0x48024a14, 0x8900a540, 0xd10a3410, 0x01205028,
-0x1a241689, 0x43406890, 0x00000e80, 0x00000000, 0x2125a818, 0x02440091,
-0x26621954, 0x64009d10, 0x40091a02, 0x01910023, 0x09920244, 0x51040553,
-0xd0827604, 0x10254009, 0x0264009d, 0x63400998, 0x00000620, 0x00000000,
-0x0467a805, 0x0a6c0093, 0x24c01976, 0x6c819f08, 0xe2093102, 0x00930027,
-0xa834025c, 0x1b4001c0, 0xf8027c12, 0x0024c209, 0x026c049b, 0x17c009b2,
-0x00000e20, 0x00000000, 0x00458014, 0x025c0097, 0x27c00830, 0x5d438f02,
-0xcc0df092, 0x109f0037, 0x1970025c, 0x1f0206ca, 0xf0027c01, 0x4027d00d,
-0x025c0597, 0x53c00970, 0x00000600, 0x00000000, 0x40850814, 0x047c0003,
-0x47c081f0, 0x4d011f00, 0xc001f000, 0x001b0004, 0x21b0006c, 0x194106c4,
-0x30004c32, 0x4400c180, 0x004c0013, 0x53c001f0, 0x00000420, 0x00000000,
-0x0048a014, 0x09840571, 0x1f4027d0, 0x44067d00, 0x4105d001, 0x05615054,
-0x07100144, 0x31080c00, 0x5001ec80, 0x041c5015, 0x01441151, 0x534005d0,
-0x00000200, 0x00000000, 0x0032a014, 0x013440c1, 0x33412cd0, 0x4401cd00,
-0x401cd003, 0x03c90070, 0x0c980344, 0xc500f240, 0x9403240b, 0x0030400c,
-0x034400d1, 0x534008d0, 0x00000a00, 0x00000000, 0x15388005, 0x018400e1,
-0x3b420ed0, 0x8400ed24, 0x401ed203, 0x00f95438, 0x0f121304, 0xf501bc40,
-0x9806a601, 0x00380006, 0x23840181, 0x17400ad0, 0x00000200, 0x00000000,
-0x01f81011, 0x05bd01e3, 0x7bc01ef0, 0x8d01ef00, 0x409ef017, 0x01eb0078,
-0x3eb10f8d, 0xe7157ac1, 0xb0072c41, 0x1068c01a, 0x078d00e3, 0x57e01ef2,
-0x00000040, 0x00000000, 0x0035b010, 0x815c00df, 0x37c005f1, 0x7c00cf20,
-0xd26df003, 0x00d701b7, 0x2d70075c, 0xd21133c0, 0x72017808, 0x0027d921,
-0x037c009f, 0x43c00bf0, 0x00000660, 0x00000000, 0x007ba000, 0x07fd01fc,
-0x7fc097b0, 0xcc09ff20, 0xc01f7047, 0x217300ff, 0x1f3007fc, 0xff0c7cc0,
-0xb007fc0b, 0x226dc0db, 0x0fcc01ff, 0x03c01bf0, 0x00000e00, 0x00000000,
-0x04398815, 0x03ac06fb, 0x3b4086b0, 0xc41ced10, 0x400e4003, 0x00e1022b,
-0x4e1003f4, 0xe9243840, 0x1002b44c, 0x0308408e, 0x039400bd, 0x57400a7a,
-0x00000620, 0x00000000, 0x00390000, 0x019400e1, 0x3b600610, 0x8600ed00,
-0x400e100b, 0x00e1003b, 0x0e5003b4, 0xed003800, 0x1003b400, 0x0028414a,
-0x038400ed, 0x03400ed0, 0x00000400, 0x00000000, 0x10732820, 0x092400d9,
-0x53420090, 0x0402cd00, 0x42085007, 0x40c10263, 0x2c500334, 0xcd8c7040,
-0x90013402, 0x00006008, 0x031442cd, 0x13400840, 0x00000c20, 0x00000000,
-0x00f5a811, 0x2f5c00d3, 0x17400531, 0xcd01df00, 0xc00d7003, 0x00534057,
-0x2e7403fc, 0xdf00f4c0, 0xb0037c18, 0x01f4c011, 0x03c41bcf, 0x57c009d0,
-0x00000620, 0x00000000, 0x04370001, 0x0f3d025f, 0x17c035f0, 0x7c02df02,
-0xc00de023, 0x085f2007, 0x0d92033c, 0xdb0037d0, 0x740b7c22, 0x0137d101,
-0x037c809f, 0x07c00970, 0x00000c00, 0x00000000, 0x003b0880, 0x074d01f3,
-0x1c800f30, 0xcc50fd00, 0xc00ef003, 0x0073001c, 0x0fb003c4, 0xf3407ec3,
-0x3015fc20, 0x002fc053, 0x03cd01f3, 0x00d00af0, 0x00000c22, 0x00000000,
-0x00362085, 0x036501d5, 0x95481550, 0x4402cd14, 0x400dd003, 0x02411091,
-0x0d100344, 0xd104b040, 0x10023402, 0x00234121, 0x03440195, 0x04401990,
-0x00000802, 0x00000000, 0x0074a001, 0x62650491, 0x5540a410, 0x4403dd80,
-0x408dd003, 0x065100d4, 0x0d900354, 0xd1013640, 0x1c0b6408, 0x00274801,
-0x034404d1, 0x044089d0, 0x00000200, 0x00000000, 0x00302014, 0x03240045,
-0x11400450, 0x04204d20, 0x400cc003, 0x00510005, 0x0d100314, 0xc1083040,
-0x10033640, 0x40034000, 0x03040091, 0x40400890, 0x00000088, 0x00000000,
-0x0036b000, 0x036c0093, 0x15c00531, 0x4d00df00, 0xc00df003, 0x00130010,
-0x0fb0035d, 0xd30036c0, 0x30017c00, 0x2027c000, 0x03cc0093, 0x00c009f9,
-0x00000ac0, 0x00000000, 0x003fb805, 0x03dc00ff, 0x0f8007f0, 0xfc002f00,
-0xc00ff003, 0x003f001f, 0x0ef003ec, 0xff003fc0, 0xf002bc00, 0x000fc603,
-0x83fe00bf, 0x97c00bf0, 0x00000e60, 0x00000000, 0x003da003, 0x20cc002b,
-0x3ec08330, 0xfc08f310, 0xc40f7053, 0x00f7023c, 0x8e3053cc, 0xf3023cc0,
-0xf0034c08, 0x333cc00f, 0x73fc08fb, 0x0cd003b0, 0x00000e00, 0x00000000,
-0x20330801, 0x18040011, 0xbcc88530, 0xf424f105, 0x48cd10cb, 0x56f1013c,
-0x0d100bc4, 0xf10037c0, 0x92535424, 0x11bc480d, 0x0b7484d5, 0x04410110,
-0x00000c20, 0x00000000, 0x40332011, 0x091414c1, 0x33620050, 0x1600c122,
-0x410c1413, 0x08c42032, 0x5d110305, 0xc5113048, 0xd0072404, 0xd1b0401d,
-0x033404c1, 0x44404190, 0x00000e80, 0x00000000, 0xa035a803, 0x00550011,
-0x364465d0, 0x7600d120, 0x430d1003, 0x00d51036, 0x1d180344, 0xd508b740,
-0x90077400, 0x0034401d, 0x037400dd, 0x0c400910, 0x00000620, 0x00000000,
-0x00378802, 0x4e5c8013, 0x36403170, 0x5e40d340, 0xd03d3003, 0x60d70036,
-0x0c34034c, 0xd74074c0, 0xf0036c00, 0x0034d00c, 0x037c00db, 0x08c011b0,
-0x00000e20, 0x00000000, 0x003d8007, 0x24ac103f, 0x3dc01730, 0x7c00ff04,
-0xc886b303, 0x00fb0035, 0x0ff003fc, 0xfb0a3ec0, 0xf003dd00, 0x0037c00f,
-0x03bc00f2, 0x1fc033f0, 0x00000600, 0x00000000, 0x00350802, 0x035c0017,
-0x37c00930, 0x2c01df20, 0xc02d3413, 0x00c34030, 0x0d30435c, 0xd300b5c0,
-0xb0237c00, 0x4037c80d, 0x037c00db, 0x0bc001f0, 0x00000420, 0x00000000,
-0x00348013, 0x004406d9, 0xfe80bd71, 0xc500fd00, 0x4005000f, 0x08f3403c,
-0x0d108b84, 0xfb083440, 0xd0877420, 0x003f40dd, 0x03f400f1, 0x4f4008d0,
-0x00000200, 0x00000000, 0x0036a007, 0x40250019, 0xf404a890, 0x1400c900,
-0x400c1003, 0x00c90033, 0x0c900716, 0xd1003640, 0xd0873400, 0x0037400c,
-0x033400c1, 0x1f4000d0, 0x00000a00, 0x00000000, 0x02788004, 0x07a50139,
-0x7a441b50, 0x8409cd24, 0x401c5247, 0x05c1027a, 0x1e9067c4, 0xe9027f50,
-0xc087b401, 0x027b421e, 0x07b401e1, 0x134012d0, 0x00000200, 0x00000000,
-0x00301012, 0x013d00c3, 0x31c28990, 0x1e00cf00, 0xd00c1023, 0x40cb0033,
-0x0cb0031c, 0xc30232c0, 0xb0073c00, 0x0033c20c, 0x033c00c3, 0x4bc004f0,
-0x00000040, 0x00000000, 0x483db802, 0x23dc8837, 0x3fc889f0, 0x5c00ff06,
-0xc08fb043, 0x24ff003d, 0x0d70033c, 0xdf0230c8, 0xf00b7808, 0x003fc00f,
-0x23fc10f7, 0x0bc08ff0, 0x00000660, 0x00000000, 0x0037a015, 0x064c0003,
-0x77c20530, 0x4d04db04, 0xc001f01b, 0x12db0134, 0x4d30730c, 0xd20134c0,
-0x320f4c04, 0x0034807d, 0x034c00d3, 0x54c001f0, 0x00000e00, 0x00000000,
-0x003d8812, 0x03050021, 0x3b020610, 0x8412f100, 0x500ad053, 0x04e103bc,
-0x2e100394, 0xe144b841, 0xb01b8510, 0x0332c0ce, 0x039400e1, 0x4bc003d0,
-0x00000620, 0x00000000, 0x00790003, 0x87840131, 0x7b421e58, 0xa405e101,
-0x6400d007, 0x09e98878, 0x5e9407e4, 0xc1297b40, 0x9887c4ad, 0x0378409e,
-0x27b405c1, 0x0c4016d0, 0x00000400, 0x00000000, 0x10332812, 0x030433c1,
-0x33412c58, 0x2400c110, 0x4109d203, 0x00cd8030, 0x0d900334, 0xc101b340,
-0x98030400, 0x0032400c, 0x033400c1, 0x4b400dd0, 0x00000c20, 0x00000000,
-0x0015a817, 0xa9cd0763, 0x17407774, 0x6c005b40, 0xd237d001, 0x007b0014,
-0x03b001ec, 0x6301cfc0, 0xb000cd00, 0x0014c003, 0x017c4053, 0x5cc007f0,
-0x00000620, 0x00000000, 0x60070012, 0x007c001f, 0x87c001b3, 0x5c000f00,
-0xc881f000, 0x00111003, 0x1170001c, 0x1f000450, 0xf0847e00, 0x4003c011,
-0x0050001f, 0x4ac001f0, 0x00000c00, 0x00000000, 0x00270810, 0x064d0193,
-0x27c809f0, 0x6c009f00, 0xc009f006, 0x43830026, 0x0134024c, 0x931007c0,
-0xf0004c20, 0x0027c001, 0x824c0083, 0x40c409f3, 0x00000c20, 0x00000000,
-0x00262001, 0x06444191, 0xa74009d0, 0x44029d00, 0x4009d026, 0x01918024,
-0x01102e54, 0x9b000040, 0x30004400, 0x00274001, 0x02540091, 0x050009d0,
-0x00000800, 0x00000000, 0x0020a018, 0x12454499, 0xa7420950, 0x66109d00,
-0x4009d002, 0x00916026, 0x01100244, 0x99080660, 0x50005400, 0x00274011,
-0x02460091, 0x604009d0, 0x00000200, 0x00000000, 0x02202010, 0x22040899,
-0x234088d0, 0x040c8d02, 0x41c8d002, 0x0c818120, 0x88102216, 0x99022440,
-0x18220404, 0x02234098, 0x32140881, 0x414088d0, 0x00000080, 0x00000000,
-0x0086b01d, 0xd84c021b, 0x83c36172, 0x6c031f05, 0xc061d050, 0x030102c6,
-0x6130594c, 0x1b0586c5, 0x60585c0b, 0x4587c161, 0x0c4c0213, 0x74c021f0,
-0x00000ac0, 0x00000000, 0x6127b819, 0x12fc04b7, 0x27c04bf0, 0x7c0c9f01,
-0xc04bf052, 0x2c9f0a67, 0x4af0127c, 0x9f012ad0, 0x3012bd09, 0x0127c04a,
-0x327c069f, 0x67c04bf0, 0x00000e60, 0x00000000, 0x00a7a018, 0x0acc02a3,
-0x2cc04bf0, 0xcc5cbf03, 0xc0c9f00a, 0x0cb70326, 0x9d3012e8, 0x9101e4c1,
-0x3117cc14, 0x01a4c07f, 0x524c0893, 0x634008f0, 0x00000680, 0x00000000,
-0x4003001c, 0x08448011, 0x0451e1d0, 0x04420d01, 0x4060d088, 0x46110184,
-0x20100c44, 0x11010440, 0x50004c06, 0x01004051, 0x10440811, 0x734041d0,
-0x00000c20, 0x00000000, 0x0123a010, 0x1a1444c1, 0xa04008d0, 0x04048d00,
-0x5088d01a, 0x028500a0, 0x48105b24, 0x8100e040, 0x105a2410, 0x41a0407d,
-0x42040481, 0x434118d0, 0x00000c80, 0x00000000, 0x4021a818, 0x02540181,
-0x246008d0, 0x44009d00, 0x4009d002, 0x20910024, 0x28100044, 0x91006040,
-0x501a0400, 0x00244011, 0x02440091, 0x634009d0, 0x00000620, 0x00000000,
-0x0027a805, 0x065d0693, 0x24c049f0, 0x4d009f00, 0xd009f002, 0x00970024,
-0x0934002c, 0x93402490, 0x30026d00, 0x0024d001, 0x02450093, 0x17c019f0,
-0x00000e20, 0x00000000, 0x00258014, 0x226c009f, 0x27c009f0, 0x7c008f08,
-0xc009f042, 0x008f0021, 0x99f0007c, 0x8f0027c4, 0xf0027c20, 0x0023c001,
-0x827c009f, 0x53c039f1, 0x00000600, 0x00000000, 0x00050814, 0x104c0313,
-0x04c121f0, 0x4c041f02, 0xc0003000, 0x081f0004, 0x2132044c, 0x1f0004c0,
-0xf1104c00, 0x4005c011, 0x004c0013, 0x50c001f0, 0x00000420, 0x00000000,
-0x4014a014, 0x19c40071, 0x5c4007d0, 0xc4007d00, 0x4005100d, 0x03790015,
-0x071000c4, 0x5d001c40, 0xd201c500, 0x00174002, 0x01540051, 0x504005d0,
-0x00000200, 0x00000000, 0x0032a014, 0x070500c1, 0x32402cd0, 0x0400cd00,
-0x400c100f, 0x10cd0030, 0x0c100304, 0xcd003340, 0xd00b0500, 0x0031400c,
-0x030400d1, 0x50400cd0, 0x00000a00, 0x00000000, 0x21388805, 0x038480b1,
-0x3a400cd0, 0x8402ad00, 0x401e100f, 0x00fd0139, 0x4e101304, 0xed013b40,
-0x90038400, 0x013b404e, 0x039404c1, 0x14409fd0, 0x00000200, 0x00000000,
-0x45780015, 0x078c01e3, 0x5ad01ef0, 0x8d01ef10, 0xc04e3007, 0x01ef08f8,
-0x5e34178c, 0xcf02fbd0, 0xd0078c05, 0x00f9c01e, 0x178c05e3, 0x54d05ef0,
-0x00000040, 0x00000000, 0x03b5a810, 0x837d009f, 0x35c00df0, 0x7c009f00,
-0xc02df483, 0x00cb0037, 0xedf42b7d, 0xdf0034c0, 0xf0037c68, 0x0037c14d,
-0x277c08df, 0x43c01df0, 0x00000660, 0x00000000, 0x407fa000, 0x04cc01e3,
-0x6cd01730, 0xdc01f300, 0xc5bd3005, 0x01e3007c, 0x3f300fcc, 0xf3007cc0,
-0x3027dc01, 0x00ffc11f, 0x13fc01f3, 0x03c01f30, 0x00000e00, 0x00000000,
-0x003d8815, 0x00ecca61, 0x38c18710, 0xc400e100, 0x401f1001, 0x00610238,
-0x0e100384, 0xf1063850, 0xf023ec00, 0x023bc10e, 0x03fc00e1, 0x57400eb0,
-0x00000620, 0x00000000, 0x00390000, 0x009410b1, 0x02400610, 0x94086100,
-0x400e9001, 0x00b10030, 0x0e100304, 0xe1003a40, 0x1803b400, 0x003b400e,
-0x03b400e1, 0x03400e10, 0x00000400, 0x00000000, 0x40372804, 0x0c340301,
-0x30400414, 0x24004120, 0x400c9001, 0x00110034, 0x8c100304, 0xc100b240,
-0x500f2480, 0x8035403c, 0x031400d1, 0x13412d10, 0x00000c20, 0x00000000,
-0x003da815, 0x475c0153, 0x36400d30, 0x5c005300, 0xd00fb403, 0x00d3403c,
-0x0e34030c, 0xf3407ed0, 0x10273c00, 0x403f402c, 0x03f400f3, 0x57c02f10,
-0x00000620, 0x00000000, 0x00370001, 0x096c121f, 0x07c020f0, 0x5c001f20,
-0xc10d7081, 0x00df0037, 0x0df0037d, 0xcf0435c3, 0xf0227c00, 0x0037c00d,
-0x037c00df, 0x07c80df0, 0x00000c00, 0x00000000, 0x003f0880, 0x46cc0073,
-0x58c00ff0, 0xcc004300, 0xc00ef007, 0x00f6003c, 0x0f3407cc, 0xf3003cc0,
-0x300fcd00, 0x003cc10f, 0x03cc00f3, 0x00c00ff0, 0x00000c22, 0x00000000,
-0x00362081, 0x60556001, 0xc44191d2, 0x450a1102, 0x420d7024, 0x00db8834,
-0x0d104f6c, 0xd1083140, 0x311e4420, 0x0035400d, 0x035400db, 0x05400dd0,
-0x00000802, 0x00000000, 0x0034a001, 0x034440d1, 0x24400dd0, 0x40029104,
-0x400dd003, 0x00d12034, 0x0d161344, 0xd1003444, 0x10014620, 0x0034401d,
-0x034400d5, 0x04400dd0, 0x00000200, 0x00000000, 0x00302010, 0x01140051,
-0x004000d0, 0x04408120, 0x510c5085, 0x00490030, 0x0d100364, 0xc1003160,
-0x10804400, 0x0030401c, 0x030400c9, 0x41000cd0, 0x00000080, 0x00000000,
-0x003eb000, 0x024c0091, 0x04400dd0, 0x4c001300, 0xc05ff003, 0x00910034,
-0x0f10034c, 0xd34038c0, 0x31294c00, 0x2038d00d, 0x034d00d7, 0x00c40df0,
-0x00000ac0, 0x00000000, 0x403fb805, 0x00fc003f, 0x0fc003f0, 0xfc003f00,
-0xc20ff081, 0x003b003f, 0x0ef003fc, 0xff003f80, 0x7004fc00, 0x003fc00f,
-0x03fc00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x030b8003, 0x10cc0433,
-0x1fc00a38, 0xfc043301, 0xc00f3030, 0x0473000b, 0x0f3000cc, 0x33400ec0,
-0x3003bc80, 0x001fc28f, 0x02ec007f, 0x0ec00fb0, 0x00000e00, 0x00000000,
-0x02870801, 0xab6c0ad1, 0x97400d18, 0x34b8d104, 0x400d501b, 0x02d10087,
-0xad100144, 0x91243440, 0x1003f400, 0x0017404f, 0x024428dd, 0x04400c10,
-0x00000c20, 0x00000000, 0x8103a011, 0x00040001, 0x12400810, 0x34040103,
-0x400c1020, 0x08c10203, 0x0c500204, 0x45001640, 0x50033400, 0x0013404c,
-0x0224c01d, 0x47400c90, 0x00000e80, 0x00000000, 0x0005a803, 0x036400d1,
-0x17420d10, 0x7400d500, 0x000d5003, 0x00d14047, 0x0d514304, 0x95003440,
-0x50037428, 0x0117400d, 0x0644301d, 0x0d400d90, 0x00000620, 0x00000000,
-0x402fa802, 0x008c0033, 0x1ec09510, 0xfc003301, 0x400d3400, 0x0b530147,
-0x0d740e4c, 0x170086c0, 0x74037c03, 0x0407c00d, 0x4e6c014f, 0x0bc00db0,
-0x00000e20, 0x00000000, 0x002d8007, 0x03fc10ff, 0x1fc10ff0, 0xfc00fb28,
-0xc00ff003, 0x004f000b, 0x0cb017fc, 0xbb083fc0, 0xb043fc00, 0x043fc00f,
-0x02bc087f, 0x1ec00e70, 0x00000600, 0x00000000, 0x01610802, 0x005c0013,
-0x10c61d32, 0x1c001300, 0xc00d3020, 0x00530024, 0x0d340a4c, 0x570014d0,
-0x30030c08, 0x0007c00d, 0x0865005f, 0x09c00d34, 0x00000420, 0x00000000,
-0x00a4a013, 0x474420d1, 0x14403d12, 0x6c0ad100, 0x400f100b, 0x005104a4,
-0x2f112f44, 0x91017041, 0xb003c001, 0x0037400f, 0x2c540bdd, 0x4c40af10,
-0x00000200, 0x00000000, 0x0002a007, 0x48340019, 0x30402c99, 0x06000000,
-0x409c5044, 0x20c10121, 0x1c100305, 0x0449c041, 0x000b0406, 0x0213400c,
-0x0204004d, 0x0d408c10, 0x00000a00, 0x00000000, 0x024c8004, 0x87a401e9,
-0x70481e14, 0xa611c100, 0x401e1007, 0x21a10269, 0x1e107784, 0x61005c40,
-0x90878405, 0x025b401e, 0x468419ed, 0x00401e10, 0x00000200, 0x00000000,
-0x00001012, 0x003c041b, 0x30c00cb1, 0x1c000300, 0xc00c7000, 0x00c10021,
-0x4c30334c, 0x471810c0, 0x30030c00, 0x1213e80c, 0x024c001f, 0x59c00c30,
-0x00000040, 0x00000000, 0x080db802, 0x239c00f7, 0x3f800f72, 0xfc80ff00,
-0xd10ef003, 0x00bf082e, 0x0ff033fc, 0x6f021bc0, 0xf003fd04, 0x021fc10f,
-0x02dc20bf, 0x0bc18ff0, 0x00000660, 0x00000000, 0x1027aa15, 0x006d0013,
-0x37c405b4, 0x4c001300, 0xc00db000, 0x005f4037, 0x0d32034c, 0x930004c0,
-0xf0136c01, 0x0024c07d, 0x024d2013, 0x54c00d34, 0x00000e00, 0x00000000,
-0x002d8812, 0x038400e1, 0x3b420e14, 0x9500e100, 0x400e5403, 0x80210038,
-0x5e1003c4, 0xe1003850, 0xd04b8540, 0x002ec14f, 0x038400a1, 0x48404f10,
-0x00000620, 0x00000000, 0x40690003, 0x04250101, 0x7b601e14, 0x84012100,
-0x405c9104, 0x01650061, 0xde900784, 0xf1005862, 0xd017a401, 0x00f8401e,
-0x05040101, 0x8e401e10, 0x00000400, 0x00000000, 0x00232812, 0x030600c1,
-0x33681c14, 0x1400c140, 0x400c5403, 0x200104b0, 0x0d900305, 0xc1003460,
-0xd0032400, 0x0072400c, 0x07040081, 0x4a420c10, 0x00000c20, 0x00000000,
-0x0095a017, 0x816c8053, 0x17c02734, 0x4c405300, 0xc005b001, 0x0275009d,
-0x05b409cc, 0x73001cd0, 0xf0016e28, 0x40d8c005, 0x49cc0373, 0x5ed00530,
-0x00000620, 0x00000000, 0x04030012, 0x00bc002f, 0x03c18174, 0xfc003f00,
-0xc001f000, 0x01170087, 0x0170407c, 0x1f4107c0, 0xe0005c00, 0x0047c001,
-0x407c091f, 0x49c801f0, 0x00000400, 0x00000000, 0x00270010, 0x0e5c8997,
-0x27c00930, 0x2d009340, 0xc0083002, 0x00930062, 0x0930025d, 0x932824c0,
-0xf0027c41, 0x0027c009, 0x024c0097, 0x40c00930, 0x00000c20, 0x00000000,
-0x50662001, 0x06440791, 0xa740a910, 0x45009120, 0x4019b002, 0x828142e4,
-0x09140244, 0x9100a440, 0xd00274c1, 0x00274009, 0x02450091, 0x04500914,
-0x00000080, 0x00000000, 0x0224a018, 0x42d400b5, 0x27600910, 0xc420a144,
-0x40891002, 0x10d18426, 0x09500214, 0xd101b540, 0xd0027448, 0x00274009,
-0x02040085, 0x60400810, 0x00000200, 0x00000000, 0x12202010, 0x028408a1,
-0x23601810, 0x8408a102, 0x40089022, 0x04910120, 0x08d00204, 0xc1022150,
-0xc0023008, 0x00274028, 0x42040881, 0x40404810, 0x00000080, 0x00000000,
-0x0584301d, 0x50dc9615, 0x83c40130, 0xac960305, 0xc1413058, 0x0b030046,
-0xe070285c, 0x134585c1, 0xf0517c02, 0x0287c541, 0x004c5015, 0x74c0d130,
-0x00000ac0, 0x00000000, 0x212fb019, 0x027c849f, 0x27400be4, 0x7c049f41,
-0xc009f012, 0x09bf822f, 0x193106fc, 0xaf212ac0, 0xf0027e04, 0x012fc009,
-0x42fc00bf, 0x67c0c9f0, 0x00000e60, 0x00000000, 0x056f8018, 0x06cc09af,
-0x27c00b30, 0x4e029306, 0xc04bb41a, 0x0093053f, 0x69300a4c, 0xb3052fc0,
-0xf052fc02, 0x0224c129, 0x0a7c069f, 0x63c02930, 0x00000e00, 0x00000000,
-0x0487001c, 0x8044201d, 0x43400130, 0xfd0b1100, 0x4081100c, 0x15010084,
-0x52140444, 0x11410740, 0xd0087401, 0x01004071, 0x08740e1d, 0x7340a3b1,
-0x00000c20, 0x00000000, 0x0023a010, 0x0a0502cd, 0x23400810, 0x8500a101,
-0x400814a2, 0x08810061, 0xca1002c4, 0x85452340, 0xd0023600, 0x00284048,
-0x1ab404ad, 0x43404a10, 0x00000e80, 0x00000000, 0x1025a818, 0x024480dd,
-0x27402910, 0xf580b100, 0x40091002, 0x20818824, 0x0b1042c5, 0x95002748,
-0xd2827480, 0x02244009, 0x0af408bd, 0x63400b90, 0x00000620, 0x00000000,
-0x0827a805, 0x024d009f, 0x27c80934, 0x44009340, 0xc009b002, 0xa49340e5,
-0x0930820c, 0x170027c0, 0xf1027640, 0x0024d009, 0x2e7c139f, 0x17c00930,
-0x00000e20, 0x00000000, 0x00258214, 0x027c009f, 0x27c20970, 0x1d008f00,
-0xc008f402, 0x809f0121, 0x09f0027c, 0x1b08a3c8, 0xf0027c02, 0x0027c009,
-0x063c009f, 0x53c409f0, 0x00000600, 0x00000000, 0x01050814, 0x002c8003,
-0x03c01134, 0xfc003700, 0xc001b000, 0x02130306, 0x033408cc, 0x132004c0,
-0x74047c98, 0x000cc000, 0x00fc0237, 0x53c003f0, 0x00000420, 0x00000000,
-0x0c1ca014, 0x01c50871, 0x17002710, 0x4d005100, 0x40271001, 0x0053205c,
-0x05100144, 0x30201c40, 0x100dd501, 0x00144005, 0x01740051, 0x534005d0,
-0x00000200, 0x00000000, 0x00f2a034, 0x212400c1, 0x33001c1a, 0x1580c500,
-0x41081483, 0x00c100a2, 0x0c500304, 0xc1027040, 0x50071420, 0x0030400c,
-0x033400c5, 0x53400cd0, 0x00000a00, 0x00000000, 0x00788005, 0x03840061,
-0x3b402218, 0xa4002180, 0x400c1000, 0x00e10020, 0x125000c4, 0xf1000c40,
-0x10c58005, 0x0048404e, 0x00b42021, 0x174002d0, 0x00000200, 0x00000000,
-0x40600015, 0x072c81e3, 0x5bc01614, 0x1d01f720, 0xc01a3007, 0x0163086a,
-0x1e72078d, 0xe32058d0, 0x74079c81, 0x0078d05f, 0x07bc01e7, 0x57c01ef2,
-0x00000040, 0x00000000, 0x0035b810, 0x027c005f, 0x17c001e1, 0x5d001f00,
-0xc2097000, 0x005f4827, 0x01b0003c, 0x4f6013c0, 0xf0011c40, 0x4007c09d,
-0x007c001f, 0x43c001f0, 0x00000660, 0x00000000, 0x406fa000, 0x05cc01b3,
-0x7fc49772, 0xec01f300, 0xc01b3007, 0x21ff006c, 0x1f3007cc, 0x73406cc0,
-0x3026ec91, 0x087c881f, 0x07fc01ff, 0x03c01fe0, 0x00000e00, 0x00000000,
-0x003d8815, 0x1b848821, 0x3b402210, 0x84082141, 0x400e1220, 0x00ed0029,
-0x031000c4, 0xe1000850, 0x10308404, 0x0008400e, 0x40b4082d, 0x574002d0,
-0x00000620, 0x00000000, 0x00290000, 0x028400a1, 0x1b480612, 0xa400e180,
-0x400a1003, 0x106d0228, 0x0e904384, 0x61001a40, 0x1080a500, 0x0038400c,
-0x03b400ed, 0x03400ed0, 0x00000400, 0x00000000, 0x10332804, 0x0a040001,
-0x1348201a, 0x450a0160, 0x40081028, 0x474d0021, 0x01900424, 0x41205248,
-0x10000405, 0x03c4400c, 0x4c34100d, 0x134000c0, 0x00000c20, 0x00000000,
-0x0035a815, 0x17452553, 0x37c04130, 0x6c00d300, 0x400d308b, 0x03cf0064,
-0x0db0074d, 0xc30152c0, 0x34006c07, 0x0034c00f, 0x0b7c80cd, 0x57400de0,
-0x00000620, 0x00000000, 0x00370001, 0x433c324f, 0x37c021f0, 0x7c100f00,
-0xc00df010, 0x00df00e7, 0x0170005c, 0xdf0415c0, 0xf0083c80, 0x0007c00d,
-0x007c801f, 0x07c001f0, 0x00000c00, 0x00000000, 0x403f0880, 0x03cc0097,
-0x1fc10370, 0x4400f310, 0xc09f7003, 0x005b003b, 0x0f3003cd, 0xf70144c0,
-0xb0024c00, 0x003cc00e, 0x038c00fb, 0x83c00f30, 0x00000c22, 0x00000000,
-0x41f22081, 0x0a442311, 0x1f40b112, 0xc4003160, 0x411d1480, 0x007100b7,
-0x031000c4, 0x5b21c448, 0x112c4c01, 0x0004440f, 0x00548011, 0x07400110,
-0x00000802, 0x00000000, 0x4064a001, 0x03440195, 0x33400550, 0x5500d900,
-0x40055103, 0x20d10627, 0x0d180304, 0x55000440, 0x10094408, 0x4834400d,
-0x034400d1, 0x07400d10, 0x00000200, 0x00000000, 0x00102010, 0x03040001,
-0x33400014, 0x15000900, 0x40041000, 0x00d00003, 0x00100004, 0xc9000440,
-0x10012500, 0x0000400c, 0x00160011, 0x43400010, 0x00000080, 0x00000000,
-0x0026b000, 0x024c0097, 0x13c00170, 0x5c80cb00, 0x40055403, 0x00530037,
-0x0d30034c, 0x574004d0, 0xb4014e20, 0x8034c80d, 0x034c00d3, 0x03e00d32,
-0x00000ac0, 0x00000000, 0x101fb805, 0x82bc003f, 0x1fc003f0, 0xed003608,
-0xc006f000, 0x007f602f, 0x03f000fc, 0x6f000fc0, 0xf001dc00, 0x000fc00f,
-0x00fc0037, 0x17c003f0, 0x00000e60, 0x00000000, 0x023fa003, 0x20ec023b,
-0x3bc023f0, 0x8c0c3700, 0xc00f3022, 0x0073012f, 0x4fd000cd, 0xf3401fc0,
-0xb003ec0c, 0x083cc88f, 0x02cc0073, 0x0cc00ff0, 0x00000e00, 0x00000000,
-0x21370801, 0x1844025d, 0x3748a5d0, 0x444edb00, 0x480d5009, 0x121b04a7,
-0x8fd0024c, 0xd100b440, 0x50abc488, 0x2475405e, 0x564515d1, 0x04400cd0,
-0x00000c20, 0x00000000, 0x1033a011, 0x1804460c, 0x17404850, 0x24000500,
-0x414c1009, 0x26458323, 0x0cd02330, 0xc1021344, 0x90032484, 0x0131504c,
-0x022400c9, 0x44400cd0, 0x00000e80, 0x00000000, 0x0835a803, 0x0044104d,
-0x174005d0, 0x6400c901, 0x402d5081, 0x00190063, 0x0dd10344, 0xc0011448,
-0xd0034400, 0x0131400d, 0x426480c9, 0x0c400dd2, 0x00000620, 0x00000000,
-0x0037a802, 0x164c029b, 0x478025f0, 0x6d071700, 0x80a93001, 0x88c30047,
-0x0df1016c, 0xd30153c2, 0xb0036c00, 0x4035c40d, 0x086404db, 0x08d00df0,
-0x00000e20, 0x00000000, 0x003d8007, 0x09dd40bf, 0x4fc005f0, 0xdc04df00,
-0xc01fd003, 0x411f400f, 0x0eb103d0, 0xdf080fc0, 0x7003fc00, 0x007fc10f,
-0x02dc00f7, 0x1fc00ef0, 0x00000600, 0x00000000, 0x00350802, 0x025c025f,
-0x24d0adb0, 0x5c0c1300, 0xc00d3003, 0x06ff0027, 0x0df0a34c, 0xd300d4c9,
-0x70030c20, 0x0034c00c, 0x084c00df, 0x08800d32, 0x00000420, 0x00000000,
-0x0134a013, 0x0174025d, 0x2040a511, 0x4401d500, 0x444d1083, 0x059903a7,
-0x5fd08f4c, 0xfb2806c0, 0x1003ec00, 0x0134405f, 0x3a4400dd, 0x4c400f10,
-0x00000200, 0x00000000, 0x0072a007, 0x0134500d, 0x21401012, 0x64010180,
-0x400c9102, 0x02cd2822, 0x2cd04c34, 0xc5040140, 0x50030400, 0x04f0401c,
-0x060407cd, 0x1e400c10, 0x00000a00, 0x00000000, 0x00788004, 0x07b4056d,
-0x6d401e10, 0xe4012500, 0x401e9005, 0x496d007b, 0x9cc00684, 0xed206f40,
-0x1107a401, 0x0078101e, 0x06c411ed, 0x12401e11, 0x00000200, 0x00000000,
-0x02301012, 0x015c008f, 0x0140a832, 0x35000310, 0x40048401, 0x22cf0022,
-0x0cf0233c, 0xc70001c0, 0x70034c0c, 0x0030c00c, 0x100d00df, 0x4ac04c30,
-0x00000040, 0x00000000, 0x003db802, 0x23fc24ff, 0x0ee20f70, 0xdc003f00,
-0xc00f7301, 0x00fb003f, 0x0ff003fc, 0xfa000ac0, 0xf003fc38, 0x003fd00f,
-0x00bc00ff, 0x09c00ff0, 0x00000660, 0x00000000, 0x0037a015, 0x064c219f,
-0x15c00530, 0x4c00df00, 0xc00df201, 0x00530005, 0x0de0014d, 0xdf2014c0,
-0xb0337c40, 0x64b7c14d, 0x487c12db, 0x54c00d30, 0x00000e00, 0x00000000,
-0x00398812, 0x030640ad, 0x1b400e30, 0xb400ed00, 0x400ed003, 0x0001001f,
-0x6ed00384, 0xed003ac1, 0xb043b404, 0x803f400e, 0x02b400e1, 0x48403e10,
-0x00000620, 0x00000000, 0x80790003, 0x068401cd, 0x7b681e98, 0xb401e510,
-0x601ed007, 0x0161407b, 0x1ed00785, 0xed005840, 0x90073405, 0x007b409e,
-0x04b641e1, 0x0c405e90, 0x00000400, 0x00000000, 0x00332812, 0x130610cd,
-0x33609c10, 0x348acd00, 0x401dd00b, 0x07011023, 0x0cd02704, 0xcd008240,
-0x90037400, 0x0227400d, 0x083412c9, 0x48400c90, 0x00000c20, 0x00000000,
-0x0015a817, 0x05cd057f, 0x1bc007b4, 0xec017f00, 0xc067f005, 0x1373001f,
-0x07d005cc, 0x5f0098c0, 0xb0017c00, 0x2057c007, 0x017c0253, 0x5cd005b4,
-0x00000620, 0x00000000, 0x00070012, 0x207c001f, 0x47c00170, 0x7c901f00,
-0xc011f020, 0x000f0287, 0x00f0007c, 0x1f0407c8, 0xf0007c00, 0x0087c001,
-0x187c0217, 0x4bc00170, 0x00000c00, 0x00000000, 0x01270810, 0x067c029f,
-0x27c009f0, 0x7c009300, 0xc0893442, 0x019304e4, 0x09b0020c, 0x9300e5c0,
-0x34027c00, 0x0036c009, 0x074c08d3, 0x40c00930, 0x00000c20, 0x00000000,
-0x00a62001, 0x3274039d, 0x274029d2, 0x3c029500, 0x40191002, 0x01914024,
-0x0910026c, 0x95006440, 0x10827400, 0x01654029, 0x26440091, 0x06c00914,
-0x00000800, 0x00000000, 0x0424a018, 0x02540299, 0x26402990, 0x74029180,
-0x40091002, 0x08910020, 0x19901a44, 0x91002540, 0x10027400, 0x91265009,
-0x02050081, 0x60400818, 0x00000200, 0x00000000, 0x02202010, 0x2234088d,
-0x274088d8, 0x74088580, 0x50081052, 0x08c50230, 0xd8102224, 0x85006440,
-0x10123604, 0x80a1502c, 0x0a040281, 0x42416810, 0x00000080, 0x00000000,
-0x0086b01d, 0x585c161f, 0x074161f0, 0x7c161300, 0xc0013010, 0x16130584,
-0x31b0584d, 0x130505c0, 0x302c740b, 0x0006c141, 0x010c0053, 0x74d00032,
-0x00000ac0, 0x00000000, 0x01279819, 0x12fc04bf, 0x2fc04ff0, 0xdc24bf00,
-0xc14bf053, 0x04bb012f, 0xc8f012dc, 0x9f282fc0, 0xf0267c09, 0x4026c009,
-0x027c009f, 0x67c009f0, 0x00000e60, 0x00000000, 0x822fa018, 0x8afc02b3,
-0x30c00b30, 0x4c22b300, 0xc00bf01a, 0x00b300ac, 0x0bd032dc, 0x9f0834c0,
-0x300a6c02, 0x0024c049, 0x024c0093, 0x60d049f0, 0x00000e00, 0x00000000,
-0x0107081c, 0x08740e1b, 0x06514110, 0x490e1b00, 0x4141f008, 0x0e1b2084,
-0xb1d02c44, 0x1d108540, 0x12084402, 0x40004001, 0x01c40011, 0x714000d0,
-0x00000c20, 0x00000000, 0x0023a010, 0x1a340481, 0x266028d2, 0x24008528,
-0x601cd932, 0x108121a0, 0x48d01216, 0x8d00a241, 0x901a2406, 0x0828502a,
-0x02a400a1, 0x424028d0, 0x00000e80, 0x00000000, 0x0021a818, 0x02740299,
-0x264009d1, 0x44009d00, 0x4049d012, 0x00990034, 0x01d00444, 0x9d002740,
-0x90020400, 0x002c4008, 0x02e402b1, 0x634009d0, 0x00000620, 0x00000000,
-0x0027a805, 0x027c0393, 0xa6c029f4, 0x64009701, 0xd009f90e, 0x109344e4,
-0x01f0445c, 0x9f0466c0, 0xb4026c20, 0x0024c009, 0x0a6d0093, 0x16d009f2,
-0x00000e20, 0x00000000, 0x00258014, 0x023c449f, 0x25c00930, 0x7c009b00,
-0xc0097006, 0x009f0127, 0x00f0007c, 0x9f00b5c0, 0x70027c40, 0x0267c109,
-0x025c109f, 0x51c009f0, 0x00000600, 0x00000000, 0x01050814, 0x844c8217,
-0x07c121f0, 0x7c001300, 0xc0013008, 0x12130004, 0x01f0c04e, 0x130884c9,
-0x30007c00, 0x1004c001, 0x084c0013, 0x50c00134, 0x00000420, 0x00000000,
-0x085ca014, 0x01c4047d, 0x134037d1, 0x74407400, 0x40051001, 0x107106dc,
-0x13d00ccd, 0x5f011540, 0xf081f400, 0x0296c005, 0x01449251, 0x50400510,
-0x00000200, 0x00000000, 0x0232a014, 0x230401cd, 0x33600d90, 0x3400d010,
-0x400d9003, 0x021140c6, 0x3cd02726, 0xd5001040, 0x91033480, 0x000c4012,
-0x3c840331, 0x50400d10, 0x00000a00, 0x00000000, 0x08288005, 0x038441ed,
-0x3f430ad0, 0xb400e500, 0x400b9817, 0x0061083a, 0x4ed01384, 0xedc05d49,
-0x9007b408, 0x042a4900, 0x06840031, 0x14404e10, 0x00000200, 0x00000000,
-0x00781015, 0x078d01c7, 0x7b4016f1, 0xfc016300, 0xd01e9417, 0x0141004e,
-0xdef05fa4, 0xe70268c0, 0xb403fc0d, 0x0058c012, 0x24cc2163, 0x54d0be32,
-0x00000040, 0x00000000, 0x0025b810, 0x037c005f, 0x37c009f0, 0x7c00df00,
-0xc00c7027, 0x005f0035, 0x0cf1037c, 0xdb0003c0, 0x705b7c02, 0x4017c001,
-0x1b7d008c, 0x43c00df0, 0x00000660, 0x00000000, 0x007fa000, 0x25fc01bf,
-0x78c01ff2, 0xce01f720, 0xc01f7007, 0x01b7205c, 0x1ec007c9, 0xf30048c1,
-0xb047cc01, 0x0848c016, 0x85cc01b3, 0x00c01f34, 0x00000e00, 0x00000000,
-0x02398815, 0x01b440a7, 0x384086d0, 0x8c0aeb00, 0xc00b0013, 0x04ed0218,
-0x4ed00384, 0xff001ac0, 0x12239400, 0x0098400a, 0x00cc0861, 0x54400e10,
-0x00000620, 0x00000000, 0x00090000, 0x40b400ad, 0x3c4006d8, 0x24004d00,
-0x400e5143, 0x202d000a, 0x0fd00b84, 0xe1002c40, 0x50038400, 0x400c400f,
-0x038400e1, 0x00400e10, 0x00000400, 0x00000000, 0x00072804, 0x10360815,
-0x304004d8, 0x0408c940, 0x402d1043, 0x2b4d0070, 0x0cd00304, 0xcd04c040,
-0x10031420, 0x00304000, 0x0b0400d1, 0x10400c10, 0x00000c20, 0x00000000,
-0x0015a815, 0x0e7c015f, 0x34d07df0, 0xcc01df00, 0xd02d7007, 0x009f2466,
-0x0cf08b4c, 0xf3449450, 0x7203cc80, 0x0144c008, 0x08450213, 0x54d00f30,
-0x00000620, 0x00000000, 0x00070001, 0x027c0057, 0x37c108f0, 0x5c461f00,
-0xc019f003, 0x045f0017, 0x0df0033c, 0xdb4007c0, 0xf2037c00, 0x0037c021,
-0x005c101f, 0x07c00df0, 0x00000c00, 0x00000000, 0x003f0880, 0x01cc00b3,
-0x3cc037f0, 0xfc017300, 0x010ff003, 0x05430029, 0x0f3003cd, 0xf31088c0,
-0x3003dc00, 0x006cc053, 0x53c804b3, 0x00c00ef0, 0x00000c22, 0x00000000,
-0x00262081, 0x25442111, 0x30501910, 0x74001500, 0xc60dd003, 0x03510016,
-0x0db00345, 0xd1408440, 0x10032c00, 0x40354039, 0x1e440751, 0x05400dd0,
-0x00000802, 0x00000000, 0x0414a001, 0x0a041851, 0x34400910, 0x7404d100,
-0x4019d003, 0x02910014, 0x1d100754, 0xc0041440, 0x50034400, 0x02204109,
-0x00540051, 0x04400dd0, 0x00000200, 0x00000000, 0x40102010, 0x02050041,
-0x34400010, 0x36000580, 0x520cd003, 0x00c10010, 0x1d900715, 0xc1200050,
-0x11032400, 0x0021400d, 0x03140081, 0x41400cd0, 0x00000080, 0x00000000,
-0x00043000, 0x00440093, 0x34c00074, 0x7c005100, 0x400df003, 0x00534024,
-0x0d30035c, 0xf30004d0, 0x3003dc40, 0x0014c009, 0x015d00c3, 0x00c00ef0,
-0x00000ac0, 0x00000000, 0x000fb005, 0x00fc003f, 0x3fc003f0, 0xfc003f00,
-0xc00ff003, 0x007f001e, 0x0fb003ec, 0xff000fc0, 0xf003bc00, 0x003ec00f,
-0x03ec00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x133fa003, 0x02cc00bf,
-0x0cc00ff0, 0xcc607f00, 0xc0cff081, 0x00f3023c, 0x0ff003ec, 0x63003fc0,
-0x30028c04, 0x223cc00b, 0x53cc08fb, 0x0fc0cf30, 0x00000e00, 0x00000000,
-0x03270801, 0x004400dd, 0x054004d0, 0x44205d08, 0x406dd103, 0x00d100b4,
-0x0dd00944, 0x5b053f41, 0x10094412, 0x03b6c024, 0x0b6c04c1, 0x0740c914,
-0x00000c20, 0x00000000, 0x0033a011, 0x060400cd, 0x01400cd0, 0x1400dd00,
-0x408cd007, 0x00cd01a0, 0x0cd00f24, 0x41013364, 0x5e201402, 0x20304088,
-0x830484c9, 0x47440c10, 0x00000e80, 0x00000000, 0x0035a803, 0x024400dd,
-0x054005d0, 0x5400dd00, 0x4005d103, 0x00dd0024, 0x0dd00344, 0x59003760,
-0x50035480, 0x30364005, 0x036420d1, 0x0f408d10, 0x00000620, 0x00000000,
-0x0067a802, 0x034c12cf, 0x64d04df1, 0x5c00df01, 0xd069f002, 0x00ff006c,
-0x0df0026c, 0xf30037c0, 0x7208dd00, 0x0034e20b, 0x034c00db, 0x03c00d30,
-0x00000e20, 0x00000000, 0x026d8007, 0x03fc80ff, 0x6ec08ff0, 0xed00ff01,
-0xc003f001, 0x00e34267, 0x0ff002fc, 0xff0037c0, 0xb003ac00, 0x0033c407,
-0x033c00ff, 0x1fc01bf1, 0x00000602, 0x00000000, 0x02250802, 0x037c03df,
-0x07c0acf0, 0x7c084f00, 0xd028f003, 0x04d34034, 0x0df0077c, 0xc34034d0,
-0x30084c00, 0xc034c018, 0x134800db, 0x0bc00d34, 0x00000420, 0x00000000,
-0x0024a013, 0x037409dd, 0x44400fd0, 0x74005d02, 0x4401d022, 0x06f10134,
-0x0fd00344, 0xd1603c40, 0x10036c0a, 0x003c4005, 0x1bec00f1, 0x4f400d10,
-0x00000200, 0x00000000, 0x0032a007, 0x0234200d, 0x01400cd0, 0x34014d00,
-0x406cd00b, 0x03c90024, 0x0cd00334, 0x41003640, 0x90002402, 0x00324008,
-0x0b0400d1, 0x1f400c10, 0x00000a00, 0x00000000, 0x00688004, 0x06b401ed,
-0x48441ed0, 0xb4016d10, 0x4014d007, 0x01e90068, 0x1ed02785, 0x61827a40,
-0x9007a401, 0x087a4026, 0x07a400e1, 0x1b409a10, 0x00000200, 0x00000000,
-0x01301012, 0xa23c084f, 0x01c20cf0, 0x3c00cf14, 0x504cf021, 0x00db4120,
-0x8df0233c, 0x43003240, 0xb4082c00, 0x0232c088, 0x030c08c3, 0x4bc00c30,
-0x00000040, 0x00000000, 0x00bdb802, 0x0afc08ff, 0x0fc08ff0, 0xfc48df02,
-0xc007f003, 0x00f7202f, 0x0df0a37c, 0x7f003dc0, 0x7003fc80, 0x083dc0d7,
-0x03fc80ff, 0x0bc00bf0, 0x00000660, 0x00000000, 0x0037a015, 0x0b7c00d3,
-0x60c009f0, 0x5800d300, 0xc049f002, 0x00d30034, 0x0d30020c, 0xdb0135c0,
-0x26004c00, 0x2034c009, 0x034ca0df, 0x54c01ff2, 0x00000e00, 0x00000000,
-0x10318812, 0x03b400e1, 0x285028d0, 0xbc00e100, 0x4502d003, 0x00f10038,
-0x4e100285, 0xc302b9c0, 0xb0032c00, 0x017ac006, 0x17ac04fd, 0x48400bd0,
-0x00000620, 0x00000000, 0x00790003, 0x47b401e5, 0x6e415ad0, 0xb4016100,
-0x401ad007, 0x01e10078, 0x9e100785, 0xe9017b40, 0xd204a401, 0x027a6018,
-0xa7840ded, 0x0d521ed2, 0x00000402, 0x00000000, 0x00332812, 0x033400c5,
-0x706008da, 0x34004100, 0x4090d120, 0x00c10274, 0x0c100704, 0xc1003740,
-0xd00b2480, 0x00324004, 0x032420cd, 0x494008d0, 0x00000c20, 0x00000000,
-0x4015a817, 0x0d7c1077, 0xded027f0, 0x1c024341, 0xd435f005, 0x00534014,
-0x05349dcc, 0x5b0017c0, 0xf0016c02, 0x8816c007, 0x014c005f, 0x5dc005f0,
-0x000004a0, 0x00000000, 0x00030012, 0x107c0119, 0x47c041f0, 0x5c521f00,
-0xc101f004, 0x001f0007, 0x01f0047c, 0x1f0005c8, 0x9000bc10, 0x0007c002,
-0x007c001f, 0x4a4001f0, 0x00000c00, 0x00000000, 0x00370810, 0x037c0097,
-0x27c008f0, 0x6c259f00, 0xc00d3022, 0x00830024, 0x09b0020c, 0x970025c0,
-0x30424c01, 0x0024c009, 0x025c008f, 0x43c009f0, 0x00000420, 0x00000000,
-0x20262001, 0x1a740191, 0x264019d1, 0x4c009d00, 0x44291116, 0x04912024,
-0x09100244, 0x81202740, 0xb002540a, 0x0026c009, 0x2244009d, 0x07400970,
-0x00000800, 0x00000000, 0x0064a018, 0x02740195, 0x25408950, 0xc4029d01,
-0x40281002, 0x04910024, 0x09900645, 0x95002540, 0x1202c410, 0x0026601b,
-0x0274009d, 0x634009d0, 0x00000200, 0x00000000, 0x02202010, 0x023400c1,
-0x224088d0, 0x8700ad00, 0x40881902, 0x00814a20, 0x08101204, 0x81012340,
-0x90229400, 0x0322509a, 0x2624208d, 0x43408850, 0x00000080, 0x00000000,
-0x0d86b01d, 0x007c4017, 0x15c16170, 0xcc801f20, 0xd1603400, 0x9e110580,
-0xe1b00444, 0x1522c1c1, 0x30084c0a, 0x0186c023, 0xc0740e1f, 0x77c161f0,
-0x00000ac0, 0x00000000, 0x21279819, 0x027c00bf, 0x3dc04bf0, 0x7c00df00,
-0xc049f103, 0x019f012f, 0x19f022fc, 0x9f0267c0, 0xf01a7c03, 0x01a7c069,
-0x025c099f, 0x67c04b70, 0x00000e60, 0x00000000, 0x40b7a018, 0x82fca0b3,
-0x2cc029f0, 0xbc80bf00, 0xd069f002, 0x01bb00ec, 0x89f042dc, 0xb30024c1,
-0x30164c07, 0x01a4c05b, 0x1afc049f, 0x67c0c930, 0x00000e00, 0x00000000,
-0x0083081c, 0x00740011, 0x044040d0, 0x74001d00, 0x5060d000, 0x02130044,
-0x01d0094c, 0x1b150440, 0x1038440a, 0x01844000, 0x1074240d, 0x73400110,
-0x00000c22, 0x00000000, 0x20a3a010, 0x86348085, 0x205029d0, 0x36008d00,
-0x4028d002, 0x168120a0, 0x48d00216, 0x8100a150, 0x14420400, 0x03204168,
-0x1a34128d, 0x43406810, 0x00000e80, 0x00000000, 0x0021a818, 0x027404d5,
-0x646009d0, 0x74409d00, 0x4108d102, 0x80992020, 0x09d00264, 0x99002040,
-0x128a4400, 0x00244009, 0x0276009d, 0x63400910, 0x00000620, 0x00000000,
-0x0227a805, 0x8a7c0197, 0xe4c008f0, 0x7c009f00, 0xc809f006, 0x00934064,
-0x09f0065c, 0x830025c0, 0x30024d00, 0x9024c009, 0x827c009f, 0x17c01930,
-0x00000e20, 0x00000000, 0x00358034, 0x027c009b, 0x27c00df0, 0x7c009f10,
-0xd00df066, 0x00870127, 0x08f0265c, 0x9f0027c0, 0xf0023c00, 0x0027d109,
-0x027c009f, 0x53c099f4, 0x00000600, 0x00000000, 0x80050814, 0x107c0113,
-0x04c001f0, 0x7c021f00, 0xd0213208, 0x00130004, 0x01b0084c, 0x130007c0,
-0x30804c01, 0x0004c000, 0x004c0017, 0x50c001f0, 0x00000420, 0x00000000,
-0x4414a014, 0x19f40370, 0x1d6805d0, 0xf4007d14, 0x4885b011, 0x0c712014,
-0x0510014c, 0x71001740, 0x1001c402, 0x00154017, 0x45d40051, 0x505005d0,
-0x00000200, 0x00000000, 0x0072a014, 0x063409c1, 0x724084d0, 0x3408cd00,
-0x400c100b, 0x03c10070, 0x0c900325, 0xc5003340, 0x54030400, 0x0030401c,
-0x076400c5, 0x50500cd0, 0x00000a00, 0x00000000, 0x00388005, 0x02b40021,
-0x3b4006d0, 0xb420ed10, 0x480e9007, 0x00e100a8, 0x4e100704, 0xe5013b40,
-0x50038400, 0x0179002a, 0x03b009e1, 0x14401cd0, 0x00000200, 0x00000000,
-0x04781015, 0x06bc01a1, 0x7a4016f0, 0xbc016f00, 0xc01e3007, 0x01f3407c,
-0x3eb086ac, 0xf740f3c0, 0x701fcc01, 0x00fcc01a, 0x05ac0de7, 0x54c07ef0,
-0x00000040, 0x00000000, 0x01b5b810, 0x027c801f, 0x35c045f0, 0x7c801f00,
-0xc22df001, 0x001f2427, 0x1df0037c, 0xdb05b7c0, 0xb0037d00, 0x0077c80d,
-0x035c02df, 0x43c00ff0, 0x00000660, 0x00000000, 0x007fa000, 0x27bc0133,
-0x7c003730, 0xcc09fd02, 0xc03ff007, 0x01f3006c, 0x1ff017dc, 0xf3007cc0,
-0x3207cc01, 0x007dc01f, 0x07fc01ff, 0x0bc01ff0, 0x00000e00, 0x00000000,
-0x28398815, 0x03b41021, 0x38504210, 0x8408ed00, 0x402e7011, 0x04710038,
-0x0fd00390, 0xe1023ac2, 0xb0039400, 0x0139400f, 0x23b404ed, 0xd7414ed0,
-0x00000620, 0x00000000, 0x04310000, 0x01f40021, 0x38400412, 0x84086d00,
-0x408cd002, 0x80e90068, 0x0ed01294, 0xc9003840, 0x50038400, 0x1038408e,
-0x01b640ed, 0x43600ed0, 0x00000400, 0x00000000, 0x00632804, 0x41341001,
-0x20400010, 0x04000d00, 0x400c5020, 0x00894030, 0x0cd00b04, 0x49003240,
-0xd0331400, 0x0031409c, 0x033400cd, 0x1b401cd0, 0x00000c20, 0x00000000,
-0x0065a815, 0x0b7c0293, 0x74d02510, 0x4c005f00, 0xd02df02f, 0x00db4034,
-0x0ff0231c, 0xdb403cd0, 0x700bcc00, 0x003dc02d, 0x027c00ff, 0x77c01ff0,
-0x00000620, 0x00000000, 0x002f0001, 0x837c029f, 0xf7c105f4, 0x7d025f00,
-0xc06df003, 0x00d70027, 0x0df0037c, 0xd70031c0, 0xb0033c82, 0x0037c04d,
-0x027c80df, 0x07c00df0, 0x00000c00, 0x00000000, 0x023f0880, 0x03fc0033,
-0x1fc00330, 0xfc017f00, 0xc00ff202, 0x00f30038, 0x0f3002fc, 0xb30037c0,
-0x30034c05, 0x003cc01e, 0x02cc00ef, 0x07c00f10, 0x00000c20, 0x00000000,
-0x08362081, 0x07340011, 0x37409110, 0x74411d08, 0x402dd004, 0x0111002c,
-0x0d10037c, 0x850035c0, 0x50035401, 0x0037c07d, 0x060400dd, 0x07440d14,
-0x00000802, 0x00000000, 0x0020a001, 0x23740411, 0xb7480510, 0x74941d00,
-0x400cd0a3, 0x01d11024, 0x0d900374, 0xd5003740, 0x10034410, 0x0034404d,
-0x476400dd, 0x07400d50, 0x00000200, 0x00000000, 0x40202010, 0x03340001,
-0x33400010, 0x34000d00, 0x4004d001, 0x00012031, 0x0c940354, 0xc5003140,
-0x50031400, 0x00335004, 0x022400cd, 0x43400c10, 0x00000080, 0x00000000,
-0x0036b000, 0x017c0013, 0x17400134, 0x74001f00, 0xc00df002, 0x00d34028,
-0x0db00274, 0x97003fc0, 0x30034c00, 0x0034c005, 0x026c00ff, 0x07c00d70,
-0x00000ac0, 0x00000000, 0x002fb805, 0x01fc003f, 0x2fc003f2, 0xfc402f00,
-0xc00fd000, 0x00bf003e, 0x0f7003fc, 0xbf003fc0, 0xf003fc00, 0x003fc40f,
-0x02dd00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x003f8003, 0x33fc1c33,
-0x3fc08ff0, 0xad00f300, 0xc00f3001, 0x0033200f, 0x0fb083c4, 0x7f053cc1,
-0x3212fc00, 0x133cc84b, 0x33c40c73, 0x0cc00ff0, 0x00000e00, 0x00000000,
-0x12b70801, 0x33740251, 0x3740edd0, 0x4400d140, 0x400d1201, 0x00510007,
-0x2f900344, 0x5d00b440, 0x5021744a, 0x00b54085, 0x0b440291, 0x04400dd0,
-0x00000c00, 0x00000000, 0x0833a011, 0x03140481, 0x33420c50, 0x4400c100,
-0x480c1501, 0x0045c007, 0x0c108305, 0x4d103048, 0x10003440, 0x0b344008,
-0x0a240c11, 0x44400cd0, 0x00000e80, 0x00000000, 0x2835a803, 0x03760091,
-0x37400dd0, 0x4401d100, 0x400d1001, 0x00450c07, 0x0d901304, 0x5d003440,
-0x50037410, 0x00354005, 0x03640ad1, 0x0c400dd0, 0x00000620, 0x00000000,
-0x4037a802, 0x037c2213, 0x37c00df0, 0x2c019300, 0xc01d3001, 0x03d700e7,
-0x0d34134c, 0x7f0034d0, 0x3018fc02, 0x0034c00b, 0x036c0043, 0x08d00cf0,
-0x00000e20, 0x00000000, 0x00318007, 0x03fc247f, 0x3fc00ff2, 0xfc108f00,
-0xc49ff063, 0x42fb015f, 0x0d7007fc, 0x7f003fc0, 0xf003bc00, 0x003fc004,
-0x03dd01ff, 0x1fc00ff0, 0x00000600, 0x00000000, 0x00350802, 0x037c409b,
-0x37c00df0, 0x5c029300, 0xc00d7401, 0x46d340b4, 0x0c30034c, 0x534035c0,
-0xb0085c02, 0x0035d009, 0x124d8213, 0x0bc00d72, 0x00000420, 0x00000000,
-0x203ca013, 0x13f40091, 0x3f400fd0, 0x6c009140, 0x400d1001, 0x02d10070,
-0x0f164344, 0x5b007c48, 0xb0176c00, 0x20384205, 0x8a440091, 0x4f400f10,
-0x00000200, 0x00000000, 0x0032a007, 0x07240009, 0x36600c90, 0x04094100,
-0x480c1101, 0x004c0020, 0x6c100614, 0xc1a1b140, 0x90001100, 0x00314008,
-0x0b040041, 0x1f400c54, 0x00000a00, 0x00000000, 0x00788004, 0x87b405e1,
-0x7b401ed8, 0xa401e108, 0x401e1005, 0x01e90458, 0x1e1027a7, 0xc906784c,
-0x90072429, 0x007c4016, 0x0784c131, 0x13401e10, 0x00000200, 0x00000000,
-0x00301012, 0x033c884b, 0x37c08cfa, 0x1c04c302, 0x404c5021, 0x025d0034,
-0x0c30005c, 0xc30035c0, 0xb0001c08, 0x0031c008, 0x024c8083, 0x4bc00c74,
-0x00000000, 0x00000000, 0x003db802, 0x43fc0cff, 0x37c20ffa, 0xfc00df00,
-0xd00cf001, 0x08f70237, 0x8ff203dc, 0xff0c3fc0, 0xf003fc08, 0x003bc017,
-0x23fc08ef, 0x0bc00ff0, 0x00000660, 0x00000000, 0x0037a015, 0x036c011f,
-0x36c08df0, 0x4c20df22, 0xc01df001, 0x01c30064, 0x2dbc036c, 0xd30034c0,
-0xa4004c00, 0x3074d009, 0x034c0013, 0x54c00db2, 0x00000e00, 0x00000000,
-0x00f98812, 0x038400fd, 0x3b404ed0, 0x8400ed00, 0x400ad083, 0x00e10018,
-0xae500384, 0xc1013840, 0x10030400, 0x11fc4006, 0x03c40031, 0x48504f14,
-0x00000620, 0x00000000, 0x01790003, 0x17840165, 0x7b4c1ed0, 0x8401cd21,
-0x401ed005, 0x01f90078, 0x5e100f84, 0xe1007850, 0x90048501, 0x01784018,
-0x068400e1, 0x0c409ed4, 0x00000400, 0x00000000, 0x20332812, 0x030480cd,
-0x33400dd2, 0x0400cd00, 0x501cd104, 0x01c14070, 0x0cd00704, 0xd1403040,
-0x10030400, 0x20304004, 0x020401c1, 0x48400c50, 0x00000c20, 0x00000000,
-0x0015a817, 0x014d007f, 0x16c005f0, 0x8d046f00, 0xd005f049, 0x127b00dc,
-0x07b10d8d, 0x530014c0, 0xb0090d00, 0x001cc007, 0x054c0173, 0x5cc005f0,
-0x00000620, 0x00000000, 0x08070012, 0x087c401f, 0x07c201f0, 0x7c101f08,
-0xc081f00c, 0x811f0247, 0x0070485c, 0x1f0007c0, 0xf040fc00, 0x4007c802,
-0x287c080f, 0x4bc021a0, 0x00000c00, 0x00000000, 0x00270810, 0x063c009f,
-0x24c00970, 0x4d009f00, 0xc0893816, 0x019f2027, 0x0930027c, 0x930024c6,
-0x70064c00, 0x0025c009, 0x020ca09f, 0x40c00871, 0x00000c20, 0x00000000,
-0x10262001, 0x9674409d, 0x24400910, 0x44429d00, 0x40291002, 0x809d00a7,
-0x29101274, 0x9b08a458, 0x04266c40, 0x00244009, 0x0a44009d, 0x04512910,
-0x00000800, 0x00000000, 0x0024a018, 0x927400dd, 0x26500950, 0x4402dd20,
-0x43091002, 0x869d0427, 0x49100274, 0x91052040, 0x1002c400, 0x0025400b,
-0x0244009d, 0x60400950, 0x00000200, 0x00000000, 0x07202010, 0x7234008d,
-0x20400810, 0x05149d02, 0x40885802, 0x288d0223, 0x881c2274, 0x89222040,
-0x1002a408, 0x0220508a, 0x0a05088d, 0x40402810, 0x00000080, 0x00000000,
-0x0186b01d, 0x987c941f, 0x84c14170, 0x4c041f05, 0x40201081, 0x021f0083,
-0x6430083c, 0x131580c1, 0x74004c02, 0x0585c023, 0x014c561f, 0x74c00170,
-0x00000ac0, 0x00000000, 0x2127b819, 0x127c14bf, 0x27c149f0, 0xfc00bf21,
-0x404bb402, 0x04bf012f, 0x49f012fc, 0x9f0927c0, 0xf00a7c06, 0x0127c069,
-0x8afc24bf, 0x67c029f0, 0x00000e60, 0x00000000, 0x0527a018, 0x0acc0093,
-0xa7c049f0, 0x8c048f01, 0xc00b3002, 0x08930024, 0xc9308a7c, 0x9f0324c1,
-0x3006cc0d, 0x042ec119, 0x12f40093, 0x60d02ab0, 0x00000e00, 0x00000000,
-0x2187081c, 0x08440411, 0x834941d0, 0x45021d01, 0x0340b000, 0x00110d04,
-0x21000074, 0x0d0008c0, 0xb1285402, 0x08844141, 0x90749515, 0x71404110,
-0x00000c20, 0x00000000, 0x4423a010, 0x0a041281, 0x234028d0, 0x44088d03,
-0x40091002, 0x04a10028, 0x4a0102b4, 0x8d01a950, 0x1402040c, 0x05224008,
-0x4a344081, 0x40484890, 0x00000e80, 0x00000000, 0x0025a818, 0x02640291,
-0x274009d0, 0x44209d00, 0x58099042, 0x00b1402c, 0x0b108af4, 0x8d082d40,
-0x92025400, 0x00244009, 0x02744495, 0x61500910, 0x00000620, 0x00000000,
-0x0027a805, 0x024d0193, 0x27c009f0, 0x0c129f00, 0xc008302e, 0x40932124,
-0x0934027c, 0x9f1825c0, 0x30424c00, 0x4026c809, 0x267c8493, 0x14d009b4,
-0x00000e20, 0x00000000, 0x00258014, 0x025c099f, 0x27c009f0, 0x7d00cf00,
-0xc099f042, 0xe89f0667, 0x08f0027c, 0x9f0024c0, 0xf0027c00, 0x0027c009,
-0x463c009f, 0x53d009f4, 0x00000600, 0x00000000, 0x00050814, 0x104c0003,
-0x07c00134, 0x4c001300, 0xc1013c00, 0x001f0084, 0x01f0084c, 0x130004c0,
-0x30084c00, 0x0004c800, 0x007c0213, 0x50c011f0, 0x00000420, 0x00000000,
-0x0014a014, 0x05c40051, 0x17400510, 0xc4085100, 0x40051041, 0x535d0094,
-0x05d04144, 0x5b081400, 0xb0010400, 0x10544005, 0x4df40055, 0x504076d1,
-0x00000200, 0x00000000, 0x0036a014, 0x0f0500c1, 0x33400c10, 0x25000100,
-0x403c1007, 0x13cd0234, 0x1cd04744, 0xc1003060, 0x10030400, 0x2074540c,
-0x023000c1, 0x50400cd0, 0x00000a00, 0x00000000, 0x01308005, 0x478404e1,
-0x7b408e10, 0xa4006101, 0x442e1003, 0x016d1028, 0x2ed00284, 0xe9206860,
-0x94028404, 0x0438404e, 0x02b440e5, 0x14400ed1, 0x00000200, 0x00000000,
-0x41781015, 0x07cc03f3, 0x7bc25e31, 0xac11a341, 0xd0161006, 0x01fd0058,
-0x17f2078c, 0xe32458d0, 0x30078d05, 0x007ce47c, 0x06bc41e3, 0x54d016f0,
-0x00000040, 0x00000000, 0x0235b810, 0x027c00df, 0xb7c00df0, 0x5c06df02,
-0xc005f002, 0x00df0007, 0x0dd0027d, 0xdf0037c0, 0xf002241c, 0x0037c00d,
-0x007c01fe, 0x43c005f0, 0x00000660, 0x00000000, 0x007fb000, 0x06cc0dff,
-0xffc01f30, 0x9c012300, 0xc81f2007, 0x21fa027f, 0x1b3007cd, 0xf2007cc0,
-0x34078c01, 0x006fc21f, 0x07fc01f3, 0x03801332, 0x00000e00, 0x00000000,
-0x00398015, 0x028418ed, 0x3b400e10, 0x950a6100, 0x044eb0a3, 0x0061002b,
-0x2a3402c4, 0xf100a840, 0x5002bc00, 0x002b400e, 0x23b400e1, 0x56408210,
-0x00000620, 0x00000000, 0x02390000, 0x018604ed, 0x3b408e90, 0xd400b100,
-0x09021003, 0x12e1043b, 0x06904384, 0xe1001a40, 0x1003a400, 0x002b400e,
-0x03b418e1, 0x03400214, 0x00000400, 0x00000000, 0x00332804, 0x000606cd,
-0x33400c90, 0x1406c100, 0x44109023, 0x015100e3, 0x0c100204, 0xc1003040,
-0x54363400, 0x0027402d, 0x017406c1, 0x12400010, 0x00000c20, 0x00000000,
-0x003da815, 0x014d03ff, 0x3fc00fb4, 0x1d021340, 0xc00d300f, 0x41934077,
-0x0cb00d4c, 0xf30034f0, 0x300b6d00, 0x4037c07f, 0x077c01f3, 0x57c00930,
-0x00000620, 0x00000000, 0x00370001, 0x017c00df, 0x37c20d70, 0x7c005f00,
-0xc00df41b, 0x80170037, 0x2df0417c, 0xdf20a7c0, 0xf0037c00, 0x1037c04d,
-0x077c00df, 0x06c009f0, 0x00000c00, 0x00000000, 0x003f0880, 0x01fc00df,
-0x34c00ef0, 0xcd00a300, 0xe01f3002, 0x08b6061f, 0x173201cc, 0xf32050c0,
-0x70028c00, 0x0134c00f, 0x037c00f3, 0x03c00371, 0x00000c22, 0x00000000,
-0x00362081, 0x007400dd, 0x35400dd0, 0x6c02d100, 0x601d5108, 0x00910017,
-0x35100904, 0xd108c440, 0x10027c00, 0x0034400d, 0x057400df, 0x07400110,
-0x00000802, 0x00000000, 0x0034a001, 0x027400dd, 0x30400dd8, 0x64009120,
-0x498d1043, 0x00d100b3, 0x89192b44, 0xc1223440, 0x50234400, 0x0034400d,
-0x057420d1, 0x07401550, 0x00000200, 0x00000000, 0x00302010, 0x063400cd,
-0x31400cd0, 0x65004100, 0x400c5003, 0x00410823, 0x09180245, 0xc1002040,
-0x14033700, 0x0030400c, 0x053400cd, 0x43400410, 0x00000080, 0x00000000,
-0x0036a000, 0x013c00df, 0x3cc00df0, 0x4c009300, 0x40053003, 0x80834013,
-0x0014014c, 0xf30014c0, 0x72024c00, 0x0034d00d, 0x017c00d3, 0x03c00570,
-0x00000ac0, 0x00000000, 0x003f8805, 0x00fc00ff, 0x3fc00fd0, 0xfc00ff20,
-0xc007f003, 0x003b000f, 0x039000fc, 0xff000f80, 0xf002fc00, 0x083fc00f,
-0x01fc20fc, 0x17c007f0, 0x00000e60, 0x00000000, 0x002f8003, 0x008c4033,
-0x0fc003d2, 0xfc20ff02, 0xc00f3410, 0x80f3043d, 0x8fb013ec, 0x3b053ec0,
-0x7000dc28, 0x403fc007, 0x83cc0073, 0x0fc08ff2, 0x00000e00, 0x00000000,
-0x24170801, 0x80440051, 0x174105d0, 0x7418df00, 0x400d1148, 0x10f500b4,
-0x6e103bc4, 0x11013c40, 0x10004404, 0x0437400d, 0x13c40051, 0x07404dd0,
-0x00000c20, 0x00000000, 0x0103a011, 0x00340009, 0x13400050, 0x7404cd00,
-0x400c9030, 0x48c50031, 0x2c104324, 0x8d053240, 0x50003400, 0x4137480c,
-0x43140051, 0x47404cd0, 0x00000e80, 0x00000000, 0x0875a803, 0x04750019,
-0x974005d0, 0x7400d510, 0x400d9042, 0x00c50034, 0x0d900364, 0x95003040,
-0x14006400, 0x0117400d, 0x03561050, 0x0f400dd0, 0x00000620, 0x00000000,
-0x44b7a802, 0x447c058b, 0x07c8c1f0, 0x7c009d10, 0xc08db000, 0x00d70035,
-0x0da4036c, 0x1f0036c0, 0x700c7c01, 0x0037c09d, 0x03590052, 0x0bc20df2,
-0x00000e20, 0x00000000, 0x201d8007, 0x00cc0277, 0x3fc007f2, 0x7c00bf10,
-0xc00f7000, 0x80ff103f, 0x0f70031c, 0x9b0037c0, 0xf0249c09, 0x087fc80b,
-0x03ec023f, 0x1fc00ff2, 0x00000600, 0x00000000, 0x00b50802, 0x007c009f,
-0xb5c08970, 0x4d00df00, 0xc01db04b, 0x00df1037, 0x0d70434c, 0x8b4035c0,
-0x34284c00, 0x0035c00d, 0x034c025f, 0x0b400d30, 0x00000420, 0x00000000,
-0x02b4a013, 0x28740a1d, 0x34400d50, 0x0800dd00, 0x400c500b, 0x00fd043f,
-0x0f100fc4, 0x90003ec0, 0x10804400, 0x03b0400d, 0x03ec00cd, 0x4f440f10,
-0x00000200, 0x00000000, 0x0026a007, 0x0834000d, 0x03413840, 0x2400cd08,
-0x48089000, 0x00cc0077, 0x0d502704, 0x41003140, 0x10070400, 0x00a1400c,
-0x0334094d, 0x1f400c10, 0x00000a00, 0x00000000, 0x00788004, 0x04a481ed,
-0x7a481812, 0x8421ed00, 0x40be1006, 0x49cd007b, 0x9e502784, 0x61027844,
-0x10070401, 0x0068601e, 0x2734017d, 0x13401e10, 0x00000200, 0x00000000,
-0x00101032, 0x003c084f, 0x33c00c70, 0x2400df02, 0xc00cb000, 0x00cf0033,
-0x0c70030c, 0xcb003140, 0x301b0c00, 0x0091c00d, 0x033c004f, 0x4bc08c34,
-0x00000040, 0x00000000, 0x003db002, 0x03fc20ff, 0x3dc00ffa, 0xf400ff02,
-0xc00ff002, 0x10ff003f, 0x0db04bfd, 0xff0437c3, 0xf0037d08, 0x021fc08f,
-0x03ec006f, 0x0bc30ff0, 0x00000660, 0x00000000, 0x0037a015, 0x0074409f,
-0x07c001f0, 0x7c009e05, 0xc00cf002, 0x04d3403c, 0x0d700f6c, 0x530936c1,
-0x32135c00, 0x4037c00d, 0x334c0041, 0x57c00db0, 0x00000e20, 0x00000000,
-0x84398812, 0x00b420ed, 0x3b4402d0, 0xb400ad00, 0x480ef002, 0x10f1007c,
-0x4e011304, 0xe5033040, 0x10438400, 0x003b440e, 0x43c40065, 0x4b404e10,
-0x00000620, 0x00000000, 0x94790003, 0x469401ed, 0x7b401ed0, 0xb401ed00,
-0x401ed007, 0x05e10078, 0x1c4103a4, 0xc1017b40, 0x90071401, 0x005b401e,
-0x13a58169, 0x0f401e51, 0x00000400, 0x00000000, 0x80732812, 0x963404cd,
-0xb3402cd0, 0x3401cd04, 0x528c40a7, 0x00c10034, 0x0c100304, 0xc5003140,
-0x90030412, 0x1057407c, 0x0324424d, 0x4b400c50, 0x00000c20, 0x00000000,
-0x00d5a817, 0x05bc027f, 0x97c007f0, 0xfc105f00, 0xc014d00d, 0x40533014,
-0x0570016c, 0x530017c0, 0xb6015d00, 0x51dfc037, 0x016c106b, 0x5fc005f0,
-0x00000600, 0x00000000, 0x04870012, 0x007c400f, 0x07c041f0, 0x7c001f00,
-0xc001f20c, 0x000f0007, 0x01f0007c, 0x1f0000c8, 0x74003c00, 0x00c7c081,
-0x005c3017, 0x4bc001a0, 0x00000c00, 0x00000000, 0x00770810, 0x025c0893,
-0x34c01870, 0x7c009f08, 0xc009f006, 0x00930024, 0x08300a5c, 0x870024f0,
-0x30026c00, 0x0024c809, 0x020c0591, 0x43c00930, 0x00000c00, 0x00000000,
-0x43262001, 0x22540391, 0x24405950, 0x74209d00, 0x4009d00a, 0x00935024,
-0x09101a04, 0x91002444, 0x10024400, 0x01654008, 0x026c4095, 0x07400910,
-0x00000800, 0x00000000, 0x0020a018, 0x02541091, 0x24408950, 0x74009d00,
-0x5019d062, 0x00910024, 0x09100254, 0x95002440, 0x1002e500, 0x0064500d,
-0x02440095, 0x63400910, 0x00000200, 0x00000000, 0x02202010, 0x02040081,
-0x20508810, 0x34088d02, 0x4018d022, 0x08810020, 0x48104204, 0xa1032040,
-0x10029406, 0x90204089, 0x32260491, 0x43400814, 0x00000080, 0x00000000,
-0x0086b01d, 0x505c1413, 0x84c16153, 0x7c561f00, 0xc141f058, 0x10130384,
-0xc130005c, 0x17050440, 0x1010ec04, 0x4004c001, 0x0c4c0417, 0x77c1e130,
-0x000008c0, 0x00000000, 0x0137b819, 0x02fc00bf, 0x27c24bf0, 0xfc04bf01,
-0xc00bf012, 0x009f0327, 0xc9f04274, 0x9f0127c0, 0xf4226426, 0x042bc01b,
-0x327c08bf, 0x67c019f0, 0x00000ce0, 0x00000000, 0x18afa018, 0x02cc009f,
-0xa6c92bf0, 0xcc029f10, 0xd60bf01a, 0x009b0368, 0x49b052cc, 0x9b00a4c1,
-0x3042ec00, 0x082bc809, 0x027c14b3, 0x60c2c9b0, 0x00000e00, 0x00000000,
-0x0007081c, 0x00442a1d, 0x044021d0, 0x44021d01, 0x4021d001, 0x04050184,
-0x61501844, 0x51208040, 0x10084406, 0x01174441, 0x00740251, 0x70406150,
-0x00000c20, 0x00000000, 0x0123a010, 0x0a24008d, 0x204008d0, 0x24228d00,
-0x4028501a, 0x128140b0, 0x08904234, 0x8820a041, 0x50022532, 0x04234108,
-0x0a340081, 0x40402810, 0x00000e80, 0x00000000, 0x0125a818, 0x5264209d,
-0x264028d2, 0x64009d14, 0x4009d002, 0x00950024, 0x08100244, 0x81002440,
-0x50024400, 0x00274069, 0x02742895, 0x60400950, 0x00000620, 0x00000000,
-0x00a7a805, 0x8265009f, 0xe6d019f1, 0x6d089f20, 0xc088f00e, 0x00930024,
-0x09b1025d, 0x9b0024d0, 0x54026c02, 0x40e7c009, 0x027c0193, 0x14d009b4,
-0x00000e20, 0x00000000, 0x00658014, 0x025c08cf, 0x25c029f0, 0x5c008f22,
-0xc019f012, 0x008f2027, 0x09f0027c, 0x9f0023c0, 0xb0025c00, 0x0167c009,
-0x023c009b, 0x53c009f1, 0x00000600, 0x00000000, 0x44850814, 0x047c1013,
-0x04c10150, 0x4d001f00, 0xc0013020, 0x00130044, 0x01f0404c, 0x170005e0,
-0x31006d02, 0x0087cc01, 0x004c0013, 0x50c00130, 0x00000420, 0x00000000,
-0x105ca014, 0x09f40051, 0x14423750, 0xc4005d10, 0x40071029, 0x0051001c,
-0x05900dd4, 0x51c01442, 0x00110400, 0x24df4005, 0x016c1051, 0x504005b0,
-0x00000200, 0x00000000, 0x0032a014, 0x243400c1, 0x32402c50, 0x2400cd00,
-0x50041007, 0x80c10034, 0x0cd00144, 0xc1003148, 0x90072400, 0x0487480c,
-0x030401c1, 0xd2400d10, 0x00000a00, 0x00000000, 0x04588005, 0x04240061,
-0x38402e50, 0x8400ed22, 0x490c1005, 0x08e10038, 0x4ed00984, 0xe1013840,
-0x14028404, 0x801f40ce, 0x13a401f1, 0x16404e90, 0x00000200, 0x00000000,
-0x005c1015, 0x05bc1123, 0x78d01c72, 0x8c85ff00, 0xc0163405, 0x05e30078,
-0x7cf0058c, 0xc1017940, 0xb0072c07, 0x505bc01e, 0x0fcc01a3, 0x56d05f30,
-0x00000040, 0x00000000, 0x0815b810, 0x817c061f, 0x35e20df0, 0x3408df00,
-0xe005f001, 0x10df4036, 0x2db1097d, 0xdf0637d0, 0xf0027d02, 0x0817c00d,
-0x077c00cf, 0x41c29df0, 0x00000660, 0x00000000, 0x006fa000, 0x07fc09fb,
-0x7bc01fb0, 0xcc01f300, 0xc0133005, 0x01f3005f, 0x3f320dcc, 0xf3207ec0,
-0xf206ec03, 0x006fc01f, 0x07fc01f3, 0x00c01f30, 0x00000e00, 0x00000000,
-0x01298811, 0x09bc00e1, 0x3b4006f0, 0xa400f100, 0x408e1001, 0x00f1480b,
-0x4f1001c4, 0xf1003c40, 0x10028400, 0x001f400e, 0x03f400eb, 0x55400e10,
-0x00000620, 0x00000000, 0x90b90000, 0x03b60021, 0xbf400ad0, 0x8400e100,
-0x40061001, 0x00e9001b, 0x0e900184, 0xe1023842, 0x50021400, 0x008b400e,
-0x03b410a1, 0x00400e10, 0x00000400, 0x00000000, 0x00332804, 0x49140301,
-0x37409150, 0x6400c100, 0x40041011, 0x00c90003, 0x0c900005, 0xd1403448,
-0x10021502, 0x0017408c, 0x033403c1, 0x11400c10, 0x00000c20, 0x00000000,
-0x4021a815, 0x11740613, 0x3f400dd0, 0x4d00f340, 0xc0003403, 0x00f90017,
-0x0fb4014c, 0xf1003cd2, 0x70037d02, 0x0087403e, 0x03fc03d1, 0x54c00f34,
-0x00000620, 0x00000000, 0x00670001, 0x097c021f, 0x77c009f0, 0x5c00df00,
-0xc019f001, 0x00d70007, 0x0d70097c, 0xdf0035c0, 0x70026c90, 0x0017c10d,
-0x033c30df, 0x07c40df0, 0x00000c00, 0x00000000, 0x00cf0880, 0x01fc1933,
-0x3cc84770, 0xfa00f300, 0xe02370a4, 0x00e70014, 0x0f7001dc, 0xf7003fc0,
-0xb0038c00, 0x000cc00f, 0x03c000e3, 0x03c00d30, 0x00000c22, 0x00000000,
-0x00062081, 0x0d740311, 0x354131d1, 0x7400d100, 0x50011000, 0x00dd8004,
-0x0d100144, 0xd10037c0, 0x50026c00, 0x0054400d, 0x036c00d1, 0x07480d10,
-0x00000802, 0x00000000, 0x0c24a001, 0x11741011, 0x34400dd0, 0x7440d100,
-0x40015000, 0x00dd2074, 0x0d545114, 0xd5003740, 0x90024400, 0x00c4400d,
-0x03540891, 0x07400d10, 0x00000200, 0x00000000, 0x00242010, 0x01340001,
-0x30500090, 0x2400c100, 0x40081000, 0x00cd8070, 0x0c100304, 0xd1003140,
-0x90022400, 0x0010400d, 0x033600c1, 0x43400c14, 0x00000080, 0x00000000,
-0x0022b000, 0x017c0013, 0x34c00170, 0x7400d340, 0x48017200, 0x20ff2034,
-0x0f7002dc, 0xf7003f40, 0xb0024c00, 0x0004c00d, 0x035c0093, 0x03c00d30,
-0x00000ac0, 0x00000000, 0x002fb805, 0x01fc003f, 0x3fc003f0, 0xbc00ff10,
-0xc003f000, 0x00ff003f, 0x0ff003fc, 0xff003fc0, 0x7002fc00, 0x001fc00f,
-0x03ec00fd, 0x17c00ff0, 0x00000e48, 0x00000000, 0x001fa003, 0x23fc00f3,
-0x3cc40f70, 0xbc08ff02, 0xc007b003, 0x003f000d, 0x033000fc, 0xf3400cc0,
-0x3013fc00, 0x003cc402, 0x02ed0033, 0x0cc04f30, 0x00000e00, 0x00000000,
-0x00170801, 0x035c0adb, 0x36c00fd8, 0x7684dd00, 0xc40dd203, 0x001d2806,
-0x01300074, 0xd1083442, 0x100b7410, 0x00344001, 0x0304005b, 0x06c20c10,
-0x00000c00, 0x00000000, 0x4033a011, 0x103400c5, 0x31480cd3, 0x14444d01,
-0x4000d003, 0x00451011, 0x08100234, 0xc1100142, 0x540b3408, 0x00304005,
-0x03448041, 0x44502c10, 0x00000e80, 0x00000000, 0x0035a803, 0x427400d5,
-0xa5600dd1, 0x7400dd00, 0x410dc082, 0x085d0415, 0x09900270, 0xd1063540,
-0x50077400, 0x40704105, 0x03440051, 0x0c400d10, 0x00000620, 0x00000000,
-0x20b38802, 0x0a7c20d5, 0xf4500d78, 0x7c01df10, 0x402db007, 0x059f00f5,
-0xad340b38, 0xd31045d0, 0x70037c40, 0x0074d095, 0x260c0151, 0x084c0d34,
-0x00000e20, 0x00000000, 0x003d8007, 0x8edc00db, 0x3e880ff1, 0xfc04ff09,
-0xc10fe122, 0x819d023e, 0x0d7057fc, 0xfe0046c0, 0xb003bc00, 0x003fc007,
-0x03fc09ff, 0x1fc00ef2, 0x00000608, 0x00000000, 0x00750802, 0x025d00db,
-0x36c80cf0, 0x7c01df08, 0xc0093403, 0x08970094, 0xac300b4d, 0xd74100c0,
-0x70027c00, 0x0034c00d, 0x036c005b, 0x08c00d30, 0x00000420, 0x00000000,
-0x20748013, 0x8a4400f1, 0xb4c00ff0, 0x7402dd00, 0x400c1082, 0x01910054,
-0x0d100b44, 0xf1000440, 0xe2037400, 0x02b6c20c, 0x2b440ad1, 0x4c40af10,
-0x00000200, 0x00000000, 0xc192a007, 0x120400c1, 0x20404c90, 0x3406cd02,
-0x40345023, 0x27c50060, 0x14500914, 0xc100b062, 0xd0033400, 0x0030400c,
-0x23260951, 0x1c408c90, 0x00000a00, 0x00000000, 0x00788004, 0x268401e1,
-0xea489cd0, 0xf481ed20, 0x511c5005, 0x81e1066c, 0x16502511, 0xe102786c,
-0xd00fb401, 0x007a401f, 0x0784a1f1, 0x10401e90, 0x00000200, 0x00000000,
-0x00b01012, 0x621c00c3, 0x20d00cf0, 0x3c084f20, 0xc2007003, 0x6445aa34,
-0x00700014, 0xc70030d0, 0x70033800, 0x4030c00c, 0x032c0243, 0x48d00cb4,
-0x00000000, 0x00000000, 0x00b9b802, 0x22fc08f7, 0x1dc00d71, 0x7e28ff02,
-0xc80db221, 0x007f8a37, 0x03b480ec, 0xdf203fe0, 0x72037c00, 0x043bc00f,
-0x23fc08e7, 0x0bc08f70, 0x00000660, 0x00000000, 0x00f7b015, 0x027c00d3,
-0x71c32d38, 0x3c809b00, 0xc005a003, 0x00d30824, 0x0d30035c, 0xd34037c0,
-0xf0037c81, 0x0034c00d, 0x034c005f, 0x54c00d31, 0x00000e00, 0x00000000,
-0x00398012, 0x02f405e1, 0x38402f1a, 0xb400a100, 0xc00e1003, 0x00c10822,
-0x0e108380, 0xe1043f40, 0xd803b402, 0x0079400f, 0x03c400ed, 0x48485f10,
-0x00000620, 0x00000000, 0x00790003, 0x079409e1, 0x7d425e14, 0xb481e900,
-0x48129847, 0x03e18078, 0x1e100705, 0xe900fb40, 0x5007b480, 0x0178401e,
-0x0784116d, 0x0c40de10, 0x00000400, 0x00000000, 0x00322812, 0x073420d1,
-0x10600c10, 0x340fd100, 0x410c114f, 0x10c10432, 0x9c140704, 0xc900f740,
-0xd0033420, 0x0a71404d, 0x830441cd, 0x48400c11, 0x00000c20, 0x00000000,
-0x0095a817, 0x09dc0051, 0x1dc00532, 0xfc827b04, 0xc025b005, 0x415350d0,
-0x25301d5d, 0x5b30d7c0, 0xf0117c40, 0x000cc107, 0x014d027f, 0x5cd00534,
-0x00000620, 0x00000000, 0x41070012, 0x247c001f, 0x07c001f0, 0x7c001f00,
-0xc021f200, 0x020f0207, 0x01f0007c, 0x170187c9, 0xf0087c00, 0x2007c401,
-0x007c011f, 0x4bc001f2, 0x00000c00, 0x00000000, 0x00370810, 0x8e4c809f,
-0x24c08850, 0x5cc09f00, 0xc009300e, 0x01930064, 0x0930420c, 0x800027c0,
-0x30024c00, 0x0004c019, 0x024c0093, 0x40c00930, 0x00000c20, 0x00000000,
-0x02662001, 0x0604409d, 0x64400910, 0x04019d20, 0x42281002, 0x05930065,
-0x09120a44, 0x91412700, 0x111a0480, 0x4027c889, 0x02450091, 0x04540914,
-0x00000800, 0x00000000, 0x0024a018, 0x0245009d, 0xe4400910, 0x56019d00,
-0x40095003, 0x04b0022c, 0x8f1043c4, 0x95002f00, 0x10024400, 0x00204009,
-0x02040081, 0x60400810, 0x00000200, 0x00000000, 0x00202010, 0x03441c8d,
-0x20508c54, 0x04018d08, 0x400c5402, 0x00a10029, 0x0a100284, 0x81822b40,
-0x10024408, 0x40a34088, 0x0a040281, 0x40402810, 0x00000080, 0x00000000,
-0x0006a01d, 0x804c261f, 0x04c16152, 0x5c001f00, 0xc1417001, 0x14130d04,
-0x41345044, 0x17058fc5, 0x30504c16, 0x0504c021, 0x004c0003, 0x74c00130,
-0x00000ac0, 0x00000000, 0x0823a819, 0x52fc049f, 0x2fc849b0, 0xfc14bf0d,
-0xc00ab002, 0x00d74027, 0x09f0027d, 0x9a0127c0, 0xfc02fc04, 0x000fc04b,
-0x02fc00bf, 0x67c029f0, 0x00000e60, 0x00000000, 0x002fa018, 0x0abc149f,
-0x2cc02bf0, 0xfc40bb02, 0xc04bd002, 0x04a3012c, 0x083212fc, 0x9300afc0,
-0x30520c00, 0x006cc02b, 0x224c009f, 0x63c40932, 0x00000e00, 0x00000000,
-0x8017081c, 0x0074861d, 0x06e021d0, 0x74941101, 0x40a1d200, 0x02110005,
-0xa1102870, 0x110187c0, 0x10085400, 0x00454001, 0x0445011d, 0x73487312,
-0x00000c20, 0x00000000, 0x0023a010, 0x1234108d, 0x244028d0, 0x34008900,
-0x4208d002, 0x088900a0, 0x08100234, 0x8101a340, 0x10024400, 0x05a04408,
-0x128614ad, 0x43412a10, 0x00000e80, 0x00000000, 0x2025a818, 0x4274009d,
-0x244009d0, 0x74049100, 0x4049d002, 0x00990524, 0x09100274, 0x91002540,
-0x10025400, 0x10654029, 0x02c400bd, 0x63400b11, 0x00000620, 0x00000000,
-0x0027a805, 0x0a7c009d, 0xa45009d0, 0x7c059b01, 0xc009f002, 0x439b4024,
-0xd934167c, 0x93402740, 0x30060c00, 0x0024c009, 0x024c009f, 0x17c00934,
-0x00000e20, 0x00000000, 0x00258014, 0x4e7c809f, 0xe7c109f0, 0x7c809f08,
-0xd019f012, 0x45970063, 0x0df0527c, 0x9f0027c0, 0xfc277c00, 0x0027c059,
-0x267c059f, 0x53c009f0, 0x00000600, 0x00000000, 0x00850814, 0x007c801f,
-0x04c00034, 0x7c021700, 0xc040f020, 0x03130005, 0x0130004c, 0x1f0200c0,
-0x30007c00, 0x2004c081, 0x00cc003f, 0x50d00330, 0x00000420, 0x00000000,
-0x001ca014, 0x45e4005d, 0xd8400710, 0xf4387100, 0x4037d10d, 0x02714114,
-0x05140585, 0x59001c43, 0x10297400, 0x2016c005, 0x0144005d, 0x51400510,
-0x00000200, 0x00000000, 0x01b2a014, 0x0b2400cd, 0xf0403c10, 0x3442c526,
-0x4038d04f, 0x01c90071, 0x0c100d24, 0xdd807040, 0x10003400, 0x0020401d,
-0x036400dd, 0x50400c10, 0x00000a00, 0x00000000, 0x00288005, 0x06f40ced,
-0x384a2410, 0xb480e100, 0x4027d003, 0x11e10020, 0x1e1041b4, 0xe9881840,
-0x1600f400, 0x200a400e, 0x00a4402d, 0x15401010, 0x00000200, 0x00000000,
-0x00781015, 0x07bc85ef, 0x7cd01234, 0xbc01e720, 0xc013f007, 0x01e30079,
-0x1a320724, 0xef0058d0, 0x3044bc15, 0x0068e01f, 0x07ed01ff, 0x54d01e34,
-0x00000040, 0x00000000, 0x0035b810, 0x036c00df, 0x37c001f0, 0x7c00df20,
-0xc005f003, 0x009f0037, 0x2df0034c, 0xdb0017c0, 0xf0187c8e, 0x0007e00d,
-0x005c001f, 0x42c001f0, 0x00000660, 0x00000000, 0x007fb000, 0x068c01f3,
-0x78c213f0, 0xfc49f320, 0xc0dbc004, 0x01f3007c, 0x3f3006cc, 0xf3007cc0,
-0xf024dc81, 0x006cc01e, 0x07fc01f3, 0x00c21ff2, 0x00000e20, 0x00000000,
-0x00a98015, 0x228408e1, 0x1ac28a10, 0x9c88e106, 0x418ad041, 0x00630038,
-0x0e100284, 0xe1021c40, 0xd0308400, 0x0008400e, 0x00b4102b, 0x544083d0,
-0x00000620, 0x00000000, 0x02390000, 0x03d500e1, 0x0c400650, 0xb600e940,
-0x4040d020, 0x00e10238, 0x0e900284, 0xe1001a40, 0xd000b400, 0x002c400a,
-0x63b400e1, 0x00400ed0, 0x00000400, 0x00000000, 0x40332804, 0x410400c1,
-0x90700410, 0x16848900, 0x4000d004, 0x00010030, 0x0c900204, 0xc1421242,
-0xd2002400, 0x00004009, 0x80344409, 0x104000d1, 0x00000c20, 0x00000000,
-0x00a5a815, 0x824480f1, 0x64400c70, 0x3c008b02, 0xd029f00c, 0x80535034,
-0x0db4024d, 0xf30016d0, 0xf0447c00, 0x0024c00d, 0x077c00d3, 0x54d00df0,
-0x00000600, 0x00000000, 0x00070001, 0x027c00df, 0xa7c005f2, 0x7c009700,
-0xc045f040, 0x00572033, 0x0c70027c, 0xdf0415c0, 0xf1085c00, 0x2047d00d,
-0x007c001f, 0x07c001f0, 0x00000c00, 0x00000000, 0x04ff0880, 0x0ffc20d3,
-0x2cc003b0, 0xcc00bb00, 0xc0033003, 0x04d30074, 0x4df0164c, 0xd3005cc0,
-0x7000cc00, 0x002cc00b, 0x03cc00f3, 0x00c00f30, 0x00000c02, 0x00000000,
-0x00d22081, 0x073400d1, 0x64500110, 0x44059d04, 0xc004100b, 0x03811876,
-0x1dd00244, 0xd142d050, 0x10082c00, 0x00084009, 0x00c5003b, 0x04400310,
-0x00000802, 0x00000000, 0x0024a001, 0x027440d1, 0x64400190, 0x54819900,
-0x5009102a, 0x90194234, 0x0dd04344, 0xc1008460, 0x50084400, 0x0024404d,
-0x030400c5, 0x04400c10, 0x00000200, 0x00000000, 0x00202010, 0x033400c1,
-0x20400810, 0x44009d00, 0x40091402, 0x00010030, 0x0cd00304, 0xc1000040,
-0x10022400, 0x0004500c, 0x0004000d, 0x40400014, 0x00000080, 0x00000000,
-0x0036a000, 0x037400d3, 0x04c005b0, 0x5d009b00, 0x40013001, 0x00930034,
-0x0dd0014d, 0xf30004c0, 0x70804c00, 0x1024c009, 0x034c00d7, 0x00d00d30,
-0x00000ac0, 0x00000000, 0xc03ba805, 0x81fe00ff, 0x0fc006f0, 0xfc003f08,
-0xc003f081, 0x003f403f, 0x0ff003fc, 0xff000fc0, 0xf000fc00, 0x000bc00b,
-0x00fc003b, 0x17c003f1, 0x00000e60, 0x00000000, 0x401fa003, 0x008c003b,
-0x2cd00bb0, 0xfc00f300, 0xc00f1103, 0x80f7003c, 0x0f3093fc, 0x33309cc0,
-0x3000cc48, 0x1038d02b, 0x03e4c8f3, 0x0cc40ff2, 0x00000e00, 0x00000000,
-0x08170801, 0x034640d1, 0x2c440911, 0x7402c140, 0x440d1000, 0x00d0103c,
-0x8f512bf0, 0xc1001050, 0x50432c04, 0x40b44024, 0x03440a81, 0x04420fd0,
-0x00000c20, 0x00000000, 0x0013a011, 0x00240009, 0x20420cd2, 0x7402c140,
-0x480c1203, 0x40c12030, 0x0c100330, 0x01011040, 0x10002400, 0x60b540c4,
-0x03040481, 0x44400cd0, 0x00000e80, 0x00000000, 0x0415a803, 0x036420d1,
-0x64500d90, 0x7000d100, 0x40181042, 0x00d12834, 0x0d500374, 0xd1001440,
-0x50036400, 0x44754005, 0x03440081, 0x0c400dd0, 0x00000620, 0x00000000,
-0x009aa802, 0x80e1003b, 0x64c809f0, 0x3800d340, 0xd03d300f, 0x21d72034,
-0x0d30037c, 0x13403484, 0x30006c00, 0x20f5c01d, 0x036d0093, 0x00d00de0,
-0x00000e20, 0x00000000, 0x401d8007, 0x03df00ef, 0x3bc08b70, 0xfc80ff00,
-0xc00ff411, 0x89ff103b, 0x0ef2037c, 0xff003fc4, 0xf003fc00, 0x003ec857,
-0x03fd00ff, 0x1fc00ff0, 0x0000060a, 0x00000000, 0x00950802, 0x006c0013,
-0xa4404d21, 0x4c00d704, 0xc005300b, 0x48d30034, 0x0d72234c, 0x074033c8,
-0x70001c00, 0x2234c015, 0x034d00d3, 0x09c00c10, 0x00000420, 0x00000000,
-0x0114a013, 0x0b4c00d1, 0xf4402d10, 0x4400f104, 0x40a5106b, 0x0ad106bc,
-0x0f102bc4, 0xd1003740, 0x10834420, 0x00704014, 0x03c400db, 0x4c400f10,
-0x00000200, 0x00000000, 0x00728007, 0x48540001, 0x60408d14, 0x1440c540,
-0x480c1007, 0x01c14870, 0x0c500744, 0x05001348, 0x50001400, 0x08724804,
-0x030400c1, 0x1d400c54, 0x00000a00, 0x00000000, 0x00708004, 0x87b401e1,
-0x78409e11, 0xd401e100, 0x431f1007, 0x05e01070, 0x1e102784, 0xe1025b40,
-0x1007860d, 0x00ca4016, 0x278401a9, 0x18401e50, 0x00000200, 0x00000000,
-0x00301012, 0x001c0003, 0xa4c88d30, 0x1c00c740, 0xc00c3603, 0x00d20030,
-0x0c50030d, 0x070013c0, 0x70001c04, 0x4022c064, 0x034c0083, 0x49c00d70,
-0x00000040, 0x00000000, 0x023db802, 0x03cd80ef, 0x3fd08ff0, 0xad00ff02,
-0x000ef023, 0x24ff003f, 0x0ff083fc, 0xfe281f40, 0xf023fc04, 0x001dd007,
-0xc3fc00bf, 0x0bc00fb0, 0x00000648, 0x00000000, 0x0037a015, 0x044c0013,
-0x22c00d30, 0x4c00d304, 0xc20d3003, 0x409323b4, 0x0db0134c, 0x130037e1,
-0x34004c00, 0x0024c005, 0x834c009f, 0x57c12db6, 0x00000e00, 0x00000000,
-0x00318832, 0x03c500c1, 0x38500e12, 0x8401e100, 0x520e1083, 0x00e1253c,
-0x2e135304, 0xe10033c0, 0x10030400, 0x00285006, 0x03c400ed, 0x4b402e10,
-0x00000620, 0x00000000, 0x08790203, 0x04840121, 0x4e401c11, 0xa409e100,
-0x501c9007, 0x01e14178, 0x1e9027a4, 0x29087b40, 0x90048421, 0x00784116,
-0x178401cd, 0x0f405e10, 0x00000402, 0x00000000, 0x00372812, 0x032400c1,
-0xb2500c16, 0x2520c100, 0x409c9007, 0x09c10030, 0x0c100324, 0xc9403540,
-0x90834400, 0x00304414, 0x030500dd, 0x4b480c90, 0x00000c20, 0x00000000,
-0x4015a817, 0x014c0043, 0x5ec00510, 0xec805353, 0xc027b585, 0x00510014,
-0x05b00165, 0x5b009740, 0x98014d00, 0x221cc017, 0x0144415f, 0x5fc005b0,
-0x00000620, 0x00000000, 0x00870012, 0x80dc203f, 0x05c021f0, 0x5c001f00,
-0xc5017020, 0x001f0007, 0x0070005c, 0x270407c0, 0x7a00fc40, 0x0007c021,
-0x007c081f, 0x4bc00170, 0x00000c00, 0x00000000, 0x00270810, 0x024c0093,
-0x24d888f0, 0x4c009340, 0xc0093002, 0x00930024, 0x0930024c, 0x930024c0,
-0x73024c00, 0x0164d009, 0x020c009f, 0x43c00930, 0x00000c20, 0x00000000,
-0x40262001, 0x8a448091, 0x244239d0, 0x44029b00, 0x5809b402, 0x00934024,
-0x0915024d, 0x9b002440, 0x10026c40, 0x10244429, 0x0244009d, 0x07400910,
-0x00000800, 0x00000000, 0x00648018, 0x1ac600b1, 0x205009d2, 0x04308140,
-0x400c1202, 0x00890820, 0x09100204, 0xb1102660, 0x5902c400, 0x20244018,
-0x0244009d, 0x63400914, 0x00000080, 0x00000000, 0x02202010, 0x228400a1,
-0x205888d0, 0x06188902, 0x40881022, 0x08890320, 0xc8182204, 0xa9002460,
-0x180aa408, 0x1220400c, 0x2205108d, 0x43402810, 0x00000080, 0x00000000,
-0x0596b01d, 0x58cd1411, 0x945165d2, 0x0c020305, 0x41611008, 0x020b4184,
-0x3132484c, 0x030706e8, 0x7850cc14, 0x241448e0, 0x084e001f, 0x77c00130,
-0x00000a40, 0x00000000, 0x0127b819, 0x127c009f, 0x2fc84bf8, 0xfd049f41,
-0xc04bf012, 0x04b781a7, 0xc9f0927e, 0x9f0127f0, 0xf0127c24, 0x002fc0cf,
-0x1a7e30bf, 0x67c029f0, 0x00000e60, 0x00000000, 0x016f8018, 0x16cc01b3,
-0x2cc14bb0, 0x6c069302, 0xc0c9f00a, 0x088b8324, 0x29300a7c, 0x9300a4c0,
-0x30226800, 0x003cc00b, 0x0a4c00b3, 0x67c029f0, 0x00000e00, 0x00000000,
-0x0307081c, 0x00448013, 0x14444190, 0x440f1103, 0x40351014, 0x011392c4,
-0xa01104f4, 0x11000440, 0x50004404, 0x01044041, 0x1c440411, 0x734060d0,
-0x00000c22, 0x00000000, 0x0523a010, 0x4b050281, 0x20414810, 0x84008101,
-0x40ca5102, 0x04a10128, 0x48101ab4, 0x81002050, 0x10122410, 0x44a04128,
-0x0a051281, 0x434068d0, 0x00000e80, 0x00000000, 0x00258818, 0x02448099,
-0x24504910, 0xc5009100, 0x404b1042, 0x00b9202c, 0x081082f0, 0x91002442,
-0x50024460, 0x0924520c, 0x02442091, 0x634009d0, 0x00000620, 0x00000000,
-0x0023a805, 0x024c8093, 0x24c019b4, 0x6c009340, 0xc829f002, 0x21914024,
-0x0934027c, 0x934024c8, 0x30026c00, 0x2024c089, 0x024d0193, 0x17c009f0,
-0x00000e20, 0x00000000, 0x44258014, 0x027c0087, 0x23c009f6, 0x7c008f40,
-0xd008f002, 0x05970027, 0x09f0023c, 0x9f0027c0, 0xf4023c00, 0x0463c019,
-0x027c049f, 0x53c009f0, 0x00000600, 0x00000000, 0x08050814, 0x040c001e,
-0x05d1813a, 0xfc001300, 0xd023f008, 0x0033000c, 0x013000cc, 0x170000c0,
-0x30004c00, 0x2004cd01, 0x004d0013, 0x50c00130, 0x00000420, 0x00000000,
-0x049c8014, 0x01ec005d, 0xdc402738, 0x5c005b04, 0x4005d001, 0x00530814,
-0x05100144, 0x51001440, 0xb0016c00, 0x005c4137, 0x01440051, 0x50400510,
-0x00000200, 0x00000000, 0x00f28014, 0x8004c8cd, 0x3140319a, 0x7600c141,
-0x400cd003, 0x00c14034, 0x0c1c8314, 0xd5003060, 0x10030500, 0x4270403c,
-0x030409d1, 0x50400c94, 0x00000a00, 0x00000000, 0x00388005, 0x022600ed,
-0x38440810, 0x9600e900, 0x4002d000, 0x01390000, 0x4e180094, 0xe1003840,
-0x90132404, 0x0030400c, 0x078400c1, 0x14405e90, 0x00000200, 0x00000000,
-0x00581015, 0x078c81ef, 0x71d01a94, 0xbc016300, 0x401ff007, 0x01e12078,
-0x5e30071d, 0xc70bfcd1, 0x30478c05, 0x0078c812, 0x07cc01e3, 0x54d05eb0,
-0x00000040, 0x00000000, 0x2015b810, 0x037c40cf, 0x37c00bf0, 0x7c005f00,
-0xd001f000, 0x00170007, 0xedf0006c, 0xdf01b740, 0xf0337c02, 0x0037d001,
-0x037c10df, 0x43c8ad70, 0x00000660, 0x00000000, 0x004fa000, 0x26fc09b3,
-0x7cc01bb0, 0xcc01fb00, 0xc01f3007, 0x01fb007c, 0x1f3007fc, 0xf3007cd0,
-0x3007cc13, 0x087cc01b, 0x07cd01b3, 0x08c03ff0, 0x00000e00, 0x00000000,
-0x020d8815, 0x32b40ca1, 0x28402a12, 0xc400e102, 0x40821400, 0x4020400c,
-0x0f1000b4, 0xf1003c40, 0x50438400, 0x0038400e, 0x039400a1, 0x54400ed0,
-0x00000620, 0x00000000, 0x00090000, 0x829400a5, 0x30400a90, 0x84006940,
-0x400e1003, 0x10e10038, 0x0e9003b4, 0xe1423a40, 0x90230400, 0x0438508a,
-0x038401a1, 0x00400ed0, 0x00000400, 0x00000000, 0x08072804, 0x06340a81,
-0xa4500812, 0x05204102, 0x40001004, 0x00110000, 0x0c900074, 0xc1003240,
-0xd213040b, 0x00f44018, 0x03550891, 0x18400cd0, 0x00000c20, 0x00000000,
-0x4035a815, 0x4e7c0097, 0xf4c00db0, 0x4c20db40, 0x500d3047, 0x01d30034,
-0x0fb40374, 0xf3003ec0, 0xb00fcd02, 0x40749055, 0x03cc0093, 0x54d00ff0,
-0x00000620, 0x00000000, 0x00370001, 0x127c108f, 0x37c02df0, 0x7c00df00,
-0xc081f010, 0x001f0007, 0x0d72807c, 0xdf0031c0, 0x70037c04, 0x01b7c265,
-0x037c009f, 0xa7c00df1, 0x00000c00, 0x00000000, 0x011f0880, 0x038c05b3,
-0x1c800930, 0xcc004346, 0xd00c3003, 0x00f3803c, 0x0f3003cc, 0xe3003cc0,
-0x32038c00, 0x0034c008, 0x03cc08b3, 0x07c00d30, 0x00000c20, 0x00000000,
-0x10462081, 0x03440091, 0xf4403810, 0xc4007100, 0x40031000, 0x0031000c,
-0x0d1500c5, 0xdb003440, 0xb2036c00, 0x00f44029, 0x83ec0091, 0x07400d14,
-0x00000802, 0x00000000, 0x4004a001, 0x02440091, 0xb7401d10, 0x0400d100,
-0x420d1203, 0x00d10030, 0x0c100344, 0xd1003444, 0x10034400, 0x04765009,
-0x034400d1, 0x07400d10, 0x00000200, 0x00000000, 0x00002010, 0x06050081,
-0x33500810, 0x0400c110, 0x40000200, 0x00012000, 0x0c180006, 0xc9003040,
-0x98032500, 0x4012400c, 0x032500c1, 0x43400c10, 0x00000080, 0x00000000,
-0x0006b000, 0x024c2093, 0x37c00934, 0x4c005340, 0x480d1403, 0x40d14034,
-0x0f30030e, 0xf3403c48, 0x3003cc00, 0x1036d009, 0x034d00e3, 0x07c00f30,
-0x00000ac0, 0x00000000, 0x000fb805, 0x02bc00bf, 0x3cc00bf0, 0xfce07f00,
-0xe203f200, 0x003f000f, 0x0ff000fc, 0xff003fc0, 0xd003fc80, 0x002dc00b,
-0x03fc00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x000f8003, 0x0bcc20b3,
-0x3cc40fb4, 0xec00f300, 0xc00f7081, 0x04b3412d, 0x0331538c, 0x37100fc0,
-0x30218c00, 0x010fc14e, 0x00fc00a3, 0x0cc00bf0, 0x00000e00, 0x00000000,
-0x00071801, 0x2b441019, 0xb4496d30, 0x4402d020, 0x440d1203, 0x0a9b00a4,
-0x09500bc4, 0x91251740, 0x100b6430, 0x0007402d, 0x00740091, 0x06c009d0,
-0x00000c20, 0x00000000, 0x0013a011, 0x13240409, 0xb2488c10, 0x2442c100,
-0x440cd001, 0x01810221, 0x08910374, 0x41016346, 0x54226420, 0x0203400c,
-0x02340981, 0x444008d0, 0x00000e80, 0x00000000, 0x0115a007, 0x01640019,
-0x36400914, 0x54005104, 0x401d9007, 0x01590225, 0x29d00374, 0xd1407740,
-0x50076480, 0x0087400d, 0x037401d1, 0x0c4009d0, 0x00000620, 0x00000000,
-0x01538882, 0x476c0193, 0xb6d03d32, 0x2c01d340, 0xc02cf01d, 0x01934025,
-0x25b0037c, 0xd72037c0, 0x70070d02, 0x80c7800d, 0x247c2193, 0x084009f0,
-0x00000e20, 0x00000000, 0x245d8007, 0x0f5c0237, 0x59c09ff1, 0x4c09ff01,
-0xc00f7003, 0x000f006e, 0x8f7003cc, 0xef003fc4, 0xb003dd04, 0x214b880f,
-0x00fc00bf, 0x1fd00bf0, 0x00000600, 0x00000000, 0x00950802, 0x033c881f,
-0xb4d024b2, 0x4c018b00, 0xc01d3029, 0x059f8024, 0x2db0034c, 0xd32437c0,
-0x34034d00, 0x0284c10d, 0x034c081f, 0x08c009f0, 0x00000420, 0x00000000,
-0x0834a013, 0x0174421d, 0x56d11110, 0x68009104, 0x40ad1003, 0x02dd0024,
-0x2d502bc0, 0xd1403740, 0xb43f4402, 0x0056c04f, 0x174480dd, 0x4ec00dd0,
-0x00000200, 0x00000000, 0x80122003, 0x0334139d, 0x70401c18, 0x0400c920,
-0x04041000, 0x42cd24a4, 0x2c500750, 0xc10a3745, 0x80852410, 0x8001423c,
-0x8024908d, 0x1c4009d0, 0x00000a00, 0x00000000, 0x085a0804, 0x06b4016d,
-0x6a42dc18, 0xa42bc100, 0x40971024, 0x01ad0268, 0x16506794, 0x410a7b62,
-0x9437e009, 0x006b401e, 0x04a441ad, 0x12401ad0, 0x00000200, 0x00000000,
-0x00121012, 0x033c000f, 0x34d06c34, 0x0c08cb00, 0xc08c3020, 0x00cd1230,
-0x8cf00315, 0xc3023780, 0xb0332502, 0x0011c04c, 0x932c208f, 0x48c009f0,
-0x00000040, 0x00000000, 0x001da802, 0x02fc007f, 0x2fc04f72, 0x7c887f02,
-0xc08ef822, 0x00ff223f, 0x0ff04b6c, 0x7f023fc0, 0xf033dc20, 0x003ec10f,
-0x03dc00ff, 0x0bc08bf0, 0x00000660, 0x00000000, 0x0013a014, 0x037c8493,
-0x34c01df1, 0x0c04d300, 0xc00d7101, 0x00d30024, 0x0934030d, 0x934007c0,
-0x33034c12, 0x2024c81c, 0x484c009f, 0x54c019f2, 0x00000e00, 0x00000000,
-0x00399912, 0x839c4863, 0x30c20ef1, 0x9410e520, 0xc40a1403, 0x0021102e,
-0x02309384, 0xa1001b40, 0x12038500, 0x0028404e, 0x00ad00ad, 0x49400b70,
-0x00000620, 0x00000000, 0x40d90000, 0x07b40125, 0x79441cd0, 0xc621c100,
-0x601f5105, 0x01c50078, 0x1a1017c4, 0xe1006340, 0x1007c403, 0x0078401e,
-0x078403cd, 0x0c401ad0, 0x00000400, 0x00000000, 0x00332016, 0xa7140105,
-0xb0404c51, 0x1686c502, 0x78081013, 0x04c50032, 0x88100304, 0xd1003340,
-0x123b0422, 0x1230400c, 0x030400cd, 0x49400c50, 0x00000c20, 0x00000000,
-0x009ba817, 0x017c0057, 0x55d025d0, 0xcd075340, 0xd0267009, 0x00776014,
-0x0530018c, 0x532017c2, 0x348dcc01, 0x009cd005, 0x8144036f, 0x5cd055f0,
-0x00000620, 0x00000000, 0x00c58012, 0x001c0813, 0x05c001f1, 0x7c000f21,
-0xc011f100, 0x001b0007, 0x0170007c, 0x1f00c380, 0xf4007c10, 0x0047c001,
-0x007c101f, 0x4bc00170, 0x00000c00, 0x00000000, 0x40650810, 0x024d00d3,
-0x63c00930, 0x4c089300, 0xc0093602, 0x08830060, 0x09300244, 0x930024c0,
-0x30024c09, 0x00a7c089, 0x034c009f, 0x43c00932, 0x00000c20, 0x00000000,
-0x01262001, 0x02440081, 0x67400914, 0x04019108, 0x40291002, 0x40910ae4,
-0x08500244, 0x9100e440, 0x140a4512, 0x00e74209, 0x0a040e9d, 0x07400910,
-0x00000800, 0x00000000, 0x0124a01c, 0x02440091, 0x2f480b10, 0x4400b102,
-0x581d1002, 0x009100a4, 0x29100654, 0xb1012c50, 0x10020400, 0x0c274809,
-0x0a45809d, 0x63400910, 0x00000200, 0x00000000, 0x20202814, 0x52840080,
-0x2b414a10, 0x0415a145, 0x40191053, 0x15814520, 0x89502615, 0xa1422840,
-0x10220408, 0x00234018, 0x0204008d, 0x43408814, 0x00000080, 0x00000000,
-0x0006b01d, 0x104c0012, 0x07c04130, 0x4d043301, 0xc0013010, 0x04130104,
-0x6130585c, 0x230594c5, 0x34594c16, 0x0507c541, 0x004c141f, 0x77c02130,
-0x00000ac0, 0x00000000, 0x002fa919, 0x5374149d, 0x27c149d0, 0xfc409f05,
-0xc00ef003, 0x00bf052f, 0x4bf0126c, 0x9f0127c8, 0xf012bd84, 0x002fc009,
-0x027c80bd, 0x67c06bf2, 0x00000e60, 0x00000000, 0x002f8018, 0x8a4c22a3,
-0x2dc06b70, 0xcc04b303, 0xc00f3013, 0x00b700ac, 0x29300acc, 0x930137c0,
-0x50124c84, 0x012cc04a, 0x03fc04bf, 0x60c669f0, 0x00000e00, 0x00000000,
-0x1007181c, 0x18460411, 0x044021b1, 0x54221121, 0xc0013108, 0x02114186,
-0x25100c6c, 0x014d8340, 0xb100c400, 0x00044001, 0x0074001d, 0x704041d0,
-0x00000c20, 0x00000000, 0x00250012, 0x1a240499, 0xa340c8d0, 0x24028100,
-0x40099022, 0x028108a0, 0x68140a44, 0xa1022b40, 0x515aa416, 0x08a24228,
-0x0634228d, 0x404028d0, 0x00000e80, 0x00000000, 0x00e50018, 0x02640499,
-0x26482951, 0x74029100, 0x50091402, 0x03910026, 0x09100064, 0xa100b740,
-0x1613e500, 0x00665c09, 0x067000dd, 0x604019d2, 0x00000620, 0x00000000,
-0x00e78805, 0x0a65129b, 0x274839d0, 0x6c429340, 0xc829a10a, 0x01974024,
-0x2930004c, 0x930027c0, 0x50126c01, 0x0066c009, 0x0e78069f, 0x14c009f0,
-0x00000e20, 0x00000000, 0x40258012, 0x025c2097, 0x21c059a0, 0x1c189f00,
-0xc2097002, 0x008f0127, 0x0df0007c, 0x9f0827c0, 0xf0021c04, 0x0025c008,
-0x027c499f, 0x53d009f0, 0x00000600, 0x00000000, 0x02450810, 0x084c021f,
-0x04d021b2, 0x4c020310, 0xc2113000, 0x00130004, 0x2130107c, 0x130004d0,
-0x31284c80, 0x0204c801, 0x204c0b13, 0x50d001f0, 0x00000420, 0x00000000,
-0x0898a014, 0x0144056d, 0x16d01550, 0xec907b00, 0x40261045, 0x0a71011c,
-0x855404b4, 0x51601440, 0x10854523, 0x005c4087, 0x05c40371, 0x505005d0,
-0x00000200, 0x00000000, 0x0072a014, 0x0346514d, 0x32421d98, 0x3401c100,
-0x400c5005, 0x0ac12134, 0x0c100734, 0xc1003540, 0x10032491, 0x00304228,
-0x971500c1, 0x50400dd0, 0x00000a00, 0x00000000, 0x80388801, 0x138600ad,
-0x2a41085c, 0x3600e910, 0x50075001, 0x00e10010, 0x1e5053b4, 0x61403940,
-0x1101a402, 0x107c4006, 0x029401c1, 0x14404ed0, 0x00000200, 0x00000000,
-0x00781011, 0x0fcd016e, 0x72d01eb2, 0xbc014300, 0xc8167005, 0x01a34068,
-0x1c30373c, 0xe30049c0, 0x2407ec01, 0x0878d016, 0x079c01a3, 0x54c03ff0,
-0x00000040, 0x00000000, 0x0035a810, 0x077c009f, 0x37c009d0, 0x6c00df20,
-0xc004b401, 0x009f2007, 0x2df0037c, 0xdf0036c0, 0xf0135c00, 0x4023c005,
-0x026c005f, 0x43c00df0, 0x00000660, 0x00000000, 0x005d2000, 0x07fc01bf,
-0x7cc01b30, 0x8c21e300, 0xc0167005, 0x0973004c, 0x3f30478c, 0xf3007cc0,
-0x302fbc01, 0x007bc013, 0x07fc01f3, 0x00c01ff0, 0x00000e00, 0x00000000,
-0x02391815, 0x03b400ed, 0x28c00b10, 0x8406e502, 0x08061000, 0x00230008,
-0x2e100394, 0xe1023840, 0x1131a400, 0x02bb4006, 0x4bb418e1, 0x54408ed0,
-0x00000620, 0x00000000, 0x00b90000, 0x233400ad, 0x38400a54, 0xc440e100,
-0x41075001, 0x10290008, 0x8c1003c4, 0xe1000840, 0x58c3f400, 0x003f4006,
-0x03b400e9, 0x00400ed0, 0x00000400, 0x00000000, 0x20312004, 0x2f3407dd,
-0xb0400850, 0x0410c500, 0x40141118, 0x03410000, 0x0c100314, 0xd1003042,
-0x500f6402, 0x46334004, 0x07340149, 0x10400dd0, 0x00000c20, 0x00000000,
-0x00b5a815, 0x0ffc03df, 0xf4d01d74, 0x0c02d300, 0xc01c700a, 0x08db4034,
-0x2d34034c, 0x935174d0, 0x70867c02, 0x00b7c009, 0x033c005b, 0x54d05ff0,
-0x00000620, 0x00000000, 0x00370001, 0x437c0adf, 0x27c08ca0, 0x7c02df06,
-0xd005f20a, 0x00df0017, 0x6df0037c, 0x1f00b3c0, 0xb00b7c00, 0x0037c005,
-0x027c0257, 0x07c40df0, 0x00000c00, 0x00000000, 0x003f0884, 0x038c00ff,
-0x20c05f30, 0xcc05b302, 0xc81f3004, 0x01d34014, 0x0f302788, 0xf30034c0,
-0x3042cc10, 0x001cc006, 0x07fc1033, 0x00c00d30, 0x00000c22, 0x00000000,
-0x01360085, 0x034507dd, 0x26c00d10, 0x4400cb08, 0x4071b040, 0x0b410250,
-0x2d508f54, 0xd102b6c0, 0x122f4409, 0x00804e05, 0x0a740251, 0x06c00d12,
-0x00000802, 0x00000000, 0x82348001, 0x034601dd, 0x34480914, 0x4400d100,
-0x404d1113, 0x42510404, 0x0c100b54, 0xd1003440, 0x11034400, 0xe0344001,
-0x217420d1, 0x04400d10, 0x00000200, 0x00000000, 0x00302810, 0x030620cd,
-0x22400c12, 0x0400c908, 0x40049002, 0x80410000, 0x0c500314, 0xc1403242,
-0x10030400, 0x00304004, 0x007420c1, 0x42400c10, 0x00000080, 0x00000000,
-0x0026b000, 0x034c00dd, 0x24c00930, 0x4400d300, 0xc00d3001, 0x00530004,
-0x0d30035c, 0xd30034c0, 0x34034500, 0x0014c405, 0x037c00d3, 0x00d00d34,
-0x00000ac0, 0x00000000, 0x002fa805, 0x03f000ff, 0x2fc00ff4, 0xfc00ff00,
-0xd003e100, 0x007f000f, 0x07d003fc, 0xff003fc0, 0xf003fd00, 0x001fd007,
-0x02fc007f, 0x17c00ff0, 0x00000e60, 0x00000000, 0x492fa003, 0x02cd0033,
-0x3cc00730, 0xcc203301, 0xc00ff000, 0x003f023c, 0x07f001fc, 0x3f000cc0,
-0xf020ec00, 0x000ec083, 0x0bcc02f3, 0x0fc04730, 0x00000e08, 0x00000000,
-0x02270801, 0x02840a91, 0xb4480512, 0x44281500, 0x400fd000, 0x001140b0,
-0x05d20174, 0xdd203549, 0xd0034480, 0x1034444d, 0x03d400f5, 0x07402550,
-0x00000c20, 0x00000000, 0x0023a011, 0x022494c1, 0xb0400011, 0x24000100,
-0x4008c100, 0x80cd01b0, 0x44d08134, 0x0d000000, 0xd0102400, 0x00024000,
-0x932484c1, 0x47408410, 0x00000e80, 0x00000000, 0x0025a803, 0x226440d1,
-0x34400114, 0x44041500, 0x5249d010, 0x40516434, 0x05d00174, 0xd9003502,
-0xd0034400, 0x0034600d, 0x037400d5, 0x1f408550, 0x00000620, 0x00000000,
-0x0067a802, 0x036c0053, 0x34d12534, 0x6d009300, 0xc80cf001, 0x121f40b4,
-0x27f0017c, 0x3f000c40, 0xd000ec00, 0x200ec003, 0x036c00d3, 0x0bc01538,
-0x00000e20, 0x00000000, 0x00a58007, 0x039c80ef, 0x37c00ef0, 0xfc813f20,
-0xc01df005, 0x053f013f, 0x07f021fc, 0xef003fc8, 0xf203fc00, 0x8037c80e,
-0x035c00ff, 0x0fc017f0, 0x00000600, 0x00000000, 0x00350802, 0x027c00d3,
-0x35800132, 0x4c009309, 0xd009b200, 0x025742b4, 0x35b0a14c, 0x130004d0,
-0x70005404, 0x4007c001, 0x034c00d3, 0x08d00534, 0x00000420, 0x00000000,
-0x4034a013, 0x1b7400d1, 0x78451d10, 0x45018104, 0x4029d80d, 0x2b5142f4,
-0x05110144, 0xdb003440, 0x10834483, 0x0073400d, 0x03cd00f1, 0x4c400110,
-0x00000200, 0x00000000, 0x0036a007, 0x1e340001, 0xf1432410, 0x14090108,
-0x4138d21c, 0x00454014, 0x0d900305, 0x01000140, 0x5800140a, 0x20034000,
-0x036480d1, 0x1c400410, 0x00000a00, 0x00000000, 0x02788004, 0x26b401a1,
-0x78405614, 0x84090160, 0x411ad044, 0x11712058, 0x9c1005c4, 0xc9007840,
-0x1007040d, 0x047b401e, 0x078429e1, 0x90401610, 0x00000200, 0x00000000,
-0x00301012, 0x023c08c3, 0x31c00030, 0x1c000308, 0xc80cd228, 0x08474020,
-0x2cb0010c, 0x03100540, 0x70101c04, 0x1003c800, 0x032c00d3, 0x48c00531,
-0x00000040, 0x00000000, 0x003db802, 0x02f400ff, 0x3fc24af0, 0xfc003f10,
-0xc08ff000, 0x006d403f, 0x0ff000b4, 0xff003ec4, 0xd003f804, 0x003f400f,
-0x03fc10ff, 0x0bc003f2, 0x00000660, 0x00000000, 0x0037a015, 0x127c0057,
-0x34ca04b0, 0x4c00d300, 0xc069f018, 0x80530034, 0x0df0817c, 0x134846c0,
-0x30004401, 0x4046c001, 0x374c14d3, 0x47c00fb2, 0x00000e00, 0x00000000,
-0x003d8812, 0x433400e1, 0x78440e14, 0x84006501, 0x0508d021, 0x80610038,
-0x0fd001b4, 0xf1003940, 0x10039400, 0x0030420f, 0x239400f1, 0x4b400e10,
-0x00000620, 0x00000000, 0x00790003, 0x0eb401e5, 0x78401390, 0x8601f102,
-0x081ed005, 0x01690062, 0x1ed005b4, 0x21804040, 0x11842401, 0x004a4012,
-0x178405e9, 0x0f421e90, 0x00000400, 0x00000000, 0x00372812, 0x833000d1,
-0x30448c10, 0x0400c500, 0x400cd007, 0x02490136, 0x0cd00834, 0xc1003060,
-0x18037640, 0x0030400c, 0x031600c9, 0x4b400c90, 0x00000c20, 0x00000000,
-0x0055a817, 0x017c1175, 0x145027b0, 0x4c407300, 0xd005f01d, 0x007b401e,
-0x05f029fc, 0x532014c2, 0x35816c00, 0x0016c005, 0x014c005b, 0x5fc077b0,
-0x00000620, 0x00000000, 0x02070012, 0x087c001f, 0x07c101f6, 0x7d011f20,
-0xc001f240, 0x00175805, 0x00f0007c, 0x3f000dd0, 0xf000dd40, 0x200fc802,
-0x007c0007, 0x4be01170, 0x00000c00, 0x00000000, 0x00270830, 0x024c0197,
-0x20800834, 0x4f009300, 0xe008f017, 0x12930024, 0x0930024c, 0x9f0024c0,
-0x70027c40, 0x0026c009, 0x024c009f, 0x41c008f0, 0x00000c20, 0x00000000,
-0x00262001, 0x0a440291, 0x24400912, 0x44028100, 0x4009d006, 0x02814224,
-0x09340604, 0x9d0024c0, 0x30025c02, 0x00244009, 0x0244009d, 0x044009d0,
-0x00000800, 0x00000000, 0x00242018, 0x0a040a95, 0x25400910, 0x44819100,
-0x4829d042, 0x00910024, 0x19100745, 0xbd002c50, 0x5202d410, 0x002c400b,
-0x0245009d, 0x61400dd0, 0x00000200, 0x00000000, 0x02202010, 0x22040881,
-0x21500810, 0x04008108, 0x4048d002, 0x0081c230, 0x88110204, 0xad202860,
-0x10229408, 0x0028502a, 0x9204048d, 0x404008d8, 0x00000080, 0x00000000,
-0x0586901d, 0x584d5617, 0x05c14130, 0x44105101, 0x5051f000, 0x94514504,
-0x6131004c, 0x1f3504c1, 0x70505c56, 0x050cc141, 0x2c0c0b1f, 0x75c1e1f0,
-0x00000ac0, 0x00000000, 0x812fb819, 0x12f404bf, 0x22c00bf2, 0x7c00af42,
-0xc08bf042, 0x00be012f, 0x49f002fc, 0x9f0425c0, 0x70125c04, 0x0027c249,
-0x267c099f, 0x67c40bf0, 0x00000e60, 0x00000000, 0x01a7a018, 0x1acc02b7,
-0x26c10830, 0x7c10f301, 0xc04bf002, 0x00b7042c, 0x5bf002cc, 0xb304e4c1,
-0x30264c19, 0x016c0419, 0x42441493, 0x63c04930, 0x00000e00, 0x00000000,
-0x0187081c, 0x18440611, 0x0c400118, 0x74021100, 0x4021d050, 0x00110584,
-0x01d10044, 0x11018440, 0x10004402, 0x080442c1, 0x08440611, 0x73414110,
-0x00000c20, 0x00000000, 0x00a3a010, 0x0b240285, 0xaa400b10, 0x34008100,
-0x4088d002, 0x0185c060, 0x48d00604, 0x81092049, 0x141a0404, 0x42204108,
-0x52051081, 0x43402814, 0x00000e80, 0x00000000, 0x0125a818, 0x86640091,
-0x2c484910, 0x74009148, 0x408dd00a, 0x60912064, 0x09d00345, 0x91402400,
-0x10824400, 0x08244209, 0x0264a081, 0x63401910, 0x00000620, 0x00000000,
-0x00678805, 0x026c0797, 0x26806914, 0x74109300, 0xd019f006, 0x02974024,
-0x09f10a44, 0x930024d0, 0x30024c00, 0x2024c009, 0x024c2093, 0x17c00930,
-0x00000e20, 0x00000000, 0x00658014, 0x025d049f, 0x22c009f6, 0x7c009f00,
-0xc118f00b, 0x098f0023, 0x09f00a7c, 0x8f0023c0, 0xf1023d00, 0x1023d008,
-0x025c009f, 0x53c009f0, 0x00000600, 0x00000000, 0x00050814, 0x047c0407,
-0x0c400330, 0x7c2a1310, 0xd0013000, 0x00132004, 0x01f0a47c, 0x112004c2,
-0xf0006d00, 0x1007c001, 0x004c001f, 0x53c00130, 0x00000420, 0x00000000,
-0x0014a014, 0x01f40371, 0x16c00410, 0x74097100, 0x4507102d, 0x0971001c,
-0x05d109dc, 0x71001452, 0xd0016d11, 0x00574005, 0x0144005d, 0x53400510,
-0x00000200, 0x00000000, 0x8036a014, 0x037400c5, 0x31400c10, 0x3442c120,
-0x400c1824, 0x41c904a0, 0x0dd80334, 0xc1403140, 0xd0032406, 0x0073600c,
-0x034400cd, 0x53400c10, 0x00000a00, 0x00000000, 0x02388005, 0x03b482e1,
-0x03480214, 0xf480a100, 0x400a1006, 0x1029401c, 0x0ad00394, 0xe9103940,
-0xd003a440, 0x043b40ce, 0x13044ced, 0x17408e10, 0x00000200, 0x00000000,
-0x007c1015, 0x073c81e7, 0x79421e30, 0xbc016308, 0x40143407, 0x012b1858,
-0x1bf006bc, 0xf301f1c4, 0xf007ac01, 0x007bc05e, 0x178d05cf, 0x57c05e34,
-0x00000040, 0x00000000, 0x0035b810, 0x037c00dd, 0x06c201f0, 0x3c405f40,
-0xd001f003, 0x00170033, 0x0df1037c, 0xd70036d0, 0xf1277d00, 0x0037c00d,
-0x2b7c16df, 0x43c00df0, 0x00000660, 0x00000000, 0x007fa000, 0x07cd01f3,
-0x7cc2df32, 0xfc013300, 0xc012f00e, 0x01330869, 0x1ff005fc, 0xfd107cc0,
-0x1007e809, 0x007f849f, 0x0fcc01f3, 0x02c01f20, 0x00000e00, 0x00000000,
-0xa03d8815, 0x03c40aeb, 0x08418214, 0xb4002100, 0x4002d013, 0x02212038,
-0x4bd001a0, 0xfd013848, 0x1003c41c, 0x002a418e, 0x038400e1, 0x44400e10,
-0x00000620, 0x00000000, 0x40390000, 0x23840021, 0x38044e10, 0xb4002102,
-0x4002d843, 0x0029023c, 0x0ad061b4, 0xe9303a60, 0x90038400, 0x0033408e,
-0x032500e1, 0x02400e10, 0x00000400, 0x00000000, 0x00332804, 0x05000401,
-0x01403010, 0x34020100, 0x4000d003, 0x00094030, 0x0dd00134, 0xcd00b242,
-0x942b0402, 0x0322402c, 0x032400c1, 0x10400c10, 0x00000c20, 0x00000000,
-0x003da815, 0x474802d1, 0x34900d30, 0x7c02d300, 0xd00cf006, 0x0a1b0034,
-0x0de00c3c, 0xdb21fec2, 0xb003cc4b, 0x40b7c0bf, 0x03e400f1, 0x56c00e34,
-0x00000620, 0x00000000, 0x00370001, 0x837c20df, 0x06c801f0, 0x7c429f40,
-0xc029f002, 0x42170227, 0x09f0106c, 0xcf0131c0, 0x70431d02, 0x0036c00c,
-0x035d00df, 0x07c01df0, 0x00000c00, 0x00000000, 0x003f0880, 0x07bc40ff,
-0x34c10c30, 0xfe30ff20, 0xc0073057, 0x44338038, 0x0b1084fc, 0xfb003ce2,
-0xb003cc00, 0x017c800f, 0x03cc00df, 0x00d00df0, 0x00000c22, 0x00000000,
-0x00362081, 0x077422dd, 0x04400114, 0x7402dd08, 0x4001104f, 0x031b0634,
-0x0d100874, 0xd10036c0, 0x30034441, 0x0034420d, 0x036c80d7, 0x04400dd0,
-0x00000802, 0x00000000, 0x0034a001, 0x2374211d, 0x34400d14, 0x34021d00,
-0x40011003, 0x00111034, 0x0d501274, 0xd9103450, 0x50034403, 0x0035400d,
-0x034400cd, 0x04400dd0, 0x00000200, 0x00000000, 0x00302010, 0x0234000d,
-0x00400010, 0x36000d00, 0x40001402, 0x80012000, 0x08560234, 0x01003040,
-0x1c030600, 0x0031640c, 0x032600cd, 0x40400dd0, 0x00000080, 0x00000000,
-0x1036b000, 0x037c000f, 0x34c00d14, 0x74801f00, 0xd0013003, 0x00110014,
-0x0954027c, 0xdb003440, 0x30034d00, 0x0035d00d, 0x03cc00ff, 0x00c00df0,
-0x00000ac0, 0x00000000, 0x203fb205, 0x00fc003c, 0x0fc403f1, 0xfc003f00,
-0xc20bf003, 0x003f203f, 0x0fb102fc, 0xbf003fd0, 0x7003fc00, 0x003ec00f,
-0x03fc00f7, 0x17c00ff0, 0x00000e60, 0x00000000, 0x000ba003, 0x03cc82e3,
-0x3fc00f34, 0x8c04f308, 0xc0033000, 0x34b320bf, 0x4f3203cc, 0x33003fc0,
-0x3073ec04, 0x030cc023, 0x73cc083f, 0x0fc28f30, 0x00000e00, 0x00000000,
-0x20070801, 0x0b442051, 0x97400d10, 0x452ad11a, 0x420d1103, 0x029b003f,
-0x4d143b44, 0x11203349, 0x100bf428, 0x03a54c01, 0x1b54449d, 0x07484d14,
-0x00000c20, 0x00000000, 0x4203a011, 0x23148491, 0x33480c58, 0x0400c100,
-0x40001000, 0x808d0133, 0xcc104351, 0x01403340, 0x10132400, 0x00214049,
-0x0304004d, 0x47400c55, 0x00000e80, 0x00000000, 0x1045a803, 0x03560611,
-0x37423d5c, 0x5600d100, 0x400d5003, 0x03dc0037, 0x0d100344, 0x51003344,
-0x10037424, 0x10254029, 0x0354081d, 0x0f400d50, 0x00000620, 0x00000000,
-0x0047a802, 0x071d0113, 0x27c62d70, 0x4d005300, 0xc4013000, 0x019f0037,
-0x0d30035c, 0x130037c0, 0x32036c05, 0x2025d020, 0x014c201f, 0x0bc00d74,
-0x00000e20, 0x00000000, 0x082d8007, 0x936c01bf, 0x17880fb2, 0xec894f08,
-0xc30fb003, 0x008a203f, 0x0ff083fc, 0x3f083fc0, 0xf003fc00, 0x212fcb33,
-0x0bfe01bf, 0x1fc00fb2, 0x00000600, 0x00000000, 0x00050802, 0x234d0013,
-0x28c05d30, 0x4c00f302, 0xc01131a0, 0x069b0037, 0x0d30035c, 0xd34036c0,
-0x32034c02, 0x0024d02d, 0x034d0153, 0x0bc00d30, 0x00000420, 0x00000000,
-0x20308013, 0xaf400081, 0xb4002d24, 0x050ad102, 0x403d1007, 0x0250403f,
-0x0f340390, 0xd1003c42, 0x1003c5a0, 0x0064001d, 0x03542391, 0x4f400d00,
-0x00000200, 0x00000000, 0x0022a007, 0x0e240001, 0x70422c10, 0x22088100,
-0x48200080, 0x00c50037, 0x0c900304, 0x01003200, 0x10034448, 0x03804004,
-0x13448415, 0x1f400c00, 0x00000a00, 0x00000000, 0x60488004, 0x27a441b1,
-0x58401614, 0xa485e100, 0x601e120f, 0x0165427b, 0x9e108794, 0x40407840,
-0x10070405, 0x02604016, 0x261481a5, 0x13001e10, 0x00000200, 0x00000000,
-0x02a01012, 0x022c20c3, 0x30c00c30, 0x2c008100, 0xc0003020, 0x208f4037,
-0x0db0234c, 0x830032c0, 0x32030c00, 0x0220d14d, 0x230c8257, 0x4bc04c34,
-0x00000040, 0x00000000, 0x200db802, 0x03dc00ff, 0x3fc80af0, 0xdc04ff40,
-0xc80fd083, 0x407b00bf, 0x0ff003fc, 0xbf203fc1, 0xd003fc84, 0x223fc00f,
-0xa3fc80bb, 0x0bc00ff4, 0x00000660, 0x00000000, 0x0027a015, 0x025c01df,
-0x2dc20d70, 0x4c201340, 0xd011f000, 0x21d30af5, 0x1df0034c, 0x530037c0,
-0xf3134c01, 0x0024c80c, 0x014c0013, 0x57c20d30, 0x00000e00, 0x00000000,
-0x00298812, 0x038400fd, 0x18600e14, 0x86004108, 0x400e9103, 0x00e1003c,
-0x0ed00384, 0x4101bc40, 0xd0c38400, 0x102c400e, 0x02c480b1, 0x4b400e50,
-0x00000620, 0x00000000, 0x00790003, 0x0694816d, 0x61401f51, 0x8401a120,
-0x4012d004, 0x8181813a, 0x5cd83784, 0xa1007940, 0xd8278451, 0x006b401f,
-0x07848321, 0x0f401e58, 0x00000400, 0x00000000, 0x88332812, 0x030682cd,
-0x30400850, 0x0424c100, 0x420c9003, 0x10c18032, 0x0cd10305, 0x81403040,
-0xd0030423, 0x0037413c, 0x13450191, 0x4b400c50, 0x00000c20, 0x00000000,
-0x015da817, 0x015c047f, 0x1dc02670, 0x4dc07301, 0xc005f081, 0x02730017,
-0x05f001cc, 0x730015c0, 0xf0014d00, 0x001fd106, 0x01cc0273, 0x5fc00570,
-0x00000620, 0x00000000, 0x00470012, 0x007c041f, 0x07c011a0, 0xfc001f10,
-0xc203f000, 0x021f5005, 0x01f0007c, 0x1f0005c0, 0xf0007c00, 0x44044421,
-0x007c011f, 0x4bc001d0, 0x00000c00, 0x00000000, 0x00670810, 0x023c009f,
-0x20c00934, 0x44008300, 0xc009e002, 0x00930223, 0x8900023c, 0x930027e0,
-0x20023c10, 0x08a4c009, 0x024c029b, 0x43c20931, 0x00000c20, 0x00000000,
-0x22662001, 0x0274009d, 0x24400910, 0x45009140, 0x4029d002, 0x06918827,
-0x09340274, 0x91002740, 0xf0027400, 0x08e55849, 0x0a6c0391, 0x074009b0,
-0x00000800, 0x00000000, 0x0024a018, 0x2a74009d, 0x24400914, 0x54009548,
-0x600bd002, 0x00910027, 0x09500274, 0x91002340, 0x50027440, 0x04246009,
-0x06448099, 0x63600910, 0x00000200, 0x00000000, 0x25202010, 0x5234208d,
-0x20400910, 0x95148505, 0x621ad002, 0x14810023, 0x48502234, 0x81022341,
-0x90123400, 0x02216089, 0x26244981, 0x43402890, 0x00000080, 0x00000000,
-0x0106b01d, 0x107c401f, 0x04c00131, 0x5c041501, 0xc002f000, 0x04110007,
-0x4170587c, 0x11058740, 0x70047c14, 0x0584c021, 0xd84c821b, 0x77c20130,
-0x00000ac0, 0x00000000, 0x082fb819, 0x02bc14bf, 0x2f500af4, 0x6c00bb20,
-0xc149f002, 0x00bf05a7, 0x4930127c, 0xbf4127c1, 0xf1727c20, 0x492f404b,
-0x12fc84bf, 0x67c009f2, 0x00000e60, 0x00000000, 0x012da018, 0x02fc029f,
-0x25c00870, 0x4c049301, 0xc02bf082, 0x04bf01af, 0x6b304a7c, 0xb30127c0,
-0xf0124c04, 0x00a8c00b, 0x4acc00b3, 0x63c62930, 0x00000e00, 0x00000000,
-0x0087081c, 0x0874045d, 0x84420112, 0xc4021118, 0x4001d000, 0x001d0107,
-0x41100874, 0x11158744, 0xd2104402, 0x21044041, 0x8854b411, 0x73400110,
-0x00000c20, 0x00000000, 0x02332010, 0x0a36008d, 0x69400b50, 0x8409a112,
-0x4048d002, 0x038d00a3, 0x28141234, 0x81422340, 0xd04a0509, 0x21e07108,
-0x12248081, 0x4340081c, 0x00000e80, 0x00000000, 0x2225a818, 0x0274019d,
-0x2c586910, 0xc000b120, 0x4009d002, 0x049d0027, 0x09100274, 0x91002740,
-0xd0824420, 0x00644209, 0x0a741891, 0x63400918, 0x00000620, 0x00000000,
-0x0027a805, 0x023c029f, 0xa5c02870, 0x4d029340, 0xc009e002, 0x009f0027,
-0x0930027c, 0x934027c0, 0xf1024c2a, 0x4024c109, 0x066c0093, 0x17c20930,
-0x00000e20, 0x00000000, 0x00258014, 0x027c009f, 0x27c009f0, 0x7c409e00,
-0xc009f002, 0x009f0027, 0x09f0027c, 0x8f0027c0, 0xf0027c01, 0x0427c039,
-0x0a5c819f, 0x53c009f0, 0x00000600, 0x00000000, 0x00050814, 0x404c821b,
-0x08c00331, 0xcd002340, 0xc001f000, 0x00130004, 0x01f2004c, 0x130007c2,
-0xf0007c00, 0x0000d001, 0x404cba13, 0x53c00130, 0x00000420, 0x00000000,
-0x229ca014, 0x01c42051, 0x14420510, 0x45005100, 0x4007d001, 0x00714014,
-0x05d0016c, 0x51001740, 0xd2017401, 0x301cc017, 0x05d4c271, 0x53400510,
-0x00000200, 0x00000000, 0x00b2a014, 0x032400c9, 0x30600c14, 0x1400c100,
-0x500cd003, 0x01c10020, 0x0cd00344, 0x81003740, 0xd0033401, 0x00724129,
-0x0f4402d1, 0x53400c90, 0x00000a00, 0x00000000, 0x00788005, 0x032405e1,
-0x08420318, 0x94002100, 0x411ad800, 0x03410068, 0x0ed01384, 0xe1803340,
-0xd013b410, 0x443c410a, 0x43940021, 0x17408e91, 0x00000200, 0x00000000,
-0x00781015, 0x07ad05fb, 0x70501e30, 0x9c01c300, 0xc017f007, 0x0163007c,
-0x1ef10f85, 0xa3407bc0, 0xf00fbc01, 0x087ac01b, 0x06cc81f3, 0x57c01eb4,
-0x00000040, 0x00000000, 0x0031b810, 0x005c89df, 0x07c001f0, 0x6e001f00,
-0xc009f000, 0x00df2037, 0x0df0037c, 0xdf07b7c0, 0x90077c00, 0x0017c001,
-0x027c003f, 0x43c00d70, 0x00000660, 0x00000000, 0x007fb000, 0x17fc01ff,
-0x7cc01f70, 0x8c01f340, 0xc01b3007, 0x01f7006c, 0x1f3007cc, 0xf3007fc0,
-0x3007cc01, 0x087cc01f, 0x07cd01ff, 0x03c21f34, 0x00000e00, 0x00000000,
-0x00398015, 0x11b480ed, 0x08418210, 0x86082102, 0x480b1000, 0x84610028,
-0x0e100390, 0xa3003b48, 0x1003c400, 0x00395006, 0x4bc4002d, 0x57400e10,
-0x00000620, 0x00000000, 0x00290000, 0x73b400ed, 0x30400e50, 0xc500c100,
-0x40021003, 0x20650030, 0x0e100380, 0xe9003b40, 0xd0238400, 0x0618400f,
-0x008408fd, 0x03400e50, 0x00000400, 0x00000000, 0x04e32804, 0x003400cd,
-0x00400012, 0x04000100, 0x40281000, 0x40c10034, 0x0c100314, 0x81403742,
-0xd0030421, 0x00914404, 0x0c04025d, 0x13400d50, 0x00000c20, 0x00000000,
-0x00b5a815, 0x073c00ff, 0xf4d0ac70, 0x4c01d300, 0xc07d310b, 0x09870034,
-0x0934038c, 0xdb003fc0, 0xf403cd24, 0x00b4c009, 0x0b4f909f, 0x57c00f70,
-0x00000620, 0x00000000, 0x02370001, 0x027c10df, 0x43c001f0, 0x7c011f04,
-0xc04df404, 0x039f0037, 0x09f0037c, 0x9f0037c4, 0x10037c00, 0x2027c00d,
-0x017c001f, 0x07c00d80, 0x00000c00, 0x00000000, 0x003b0880, 0x037c80f3,
-0x3cc00f31, 0xc500e300, 0xc8073043, 0x0593107c, 0x0f30034e, 0xc3003fc0,
-0xf003cd03, 0x043cc00b, 0x42cc903f, 0x00c20f30, 0x00000c22, 0x00000000,
-0x04b60081, 0x047440d1, 0x06c00110, 0x04001170, 0x400d1000, 0x90950234,
-0x1d120344, 0x91003744, 0xd1034400, 0x0057d414, 0x0c04411d, 0x05400d10,
-0x00000802, 0x00000000, 0x8014a001, 0x237400d1, 0x34420d11, 0x5500d100,
-0x40181003, 0x40d14034, 0x89100344, 0xd1803540, 0xd2034400, 0x0074401d,
-0x0644019d, 0x04400d10, 0x00000200, 0x00000000, 0x00102010, 0x003400c1,
-0x02400110, 0x54000100, 0x40081000, 0x00c50030, 0x08100344, 0x81103340,
-0xd0030400, 0x08335004, 0x0044410d, 0x41400c10, 0x00000080, 0x00000000,
-0x4006a000, 0x037c00d3, 0x34c00d34, 0x5c00d300, 0xc8013003, 0x00d31034,
-0x0d320344, 0xd34039c4, 0xf0034c00, 0x2014d00d, 0x004d009f, 0x00c00d34,
-0x00000ac0, 0x00000000, 0x200fa805, 0x00fc00ff, 0x0fc002f0, 0xec003f00,
-0xc00bb080, 0x00ff003f, 0x0ff083fc, 0xb9003fc0, 0xf203fc00, 0x001fc006,
-0x00fc002f, 0x17c00ff2, 0x00000e60, 0x00000000, 0x002ba003, 0x0084807b,
-0x2ec00f21, 0xec00f348, 0xc00f1501, 0x003300bf, 0x0b3410cc, 0x33040cd0,
-0x3023cc00, 0x00bcc02f, 0x03cc06f3, 0x0cc10f30, 0x00000e00, 0x00000000,
-0x04a70821, 0x034490dd, 0x24420b10, 0x5400d104, 0x400d1008, 0x140102a3,
-0x29100844, 0x1105b4c0, 0x50134416, 0x203d480f, 0x43c402f1, 0x04402d50,
-0x00000c20, 0x00000000, 0x0323a011, 0x0025048d, 0x26400c90, 0x6400c101,
-0x400c1023, 0x80010923, 0x61902020, 0x41400041, 0x90030408, 0x4930404c,
-0x03250cc9, 0x44400c90, 0x00000e80, 0x00000000, 0x0125a803, 0x236400dd,
-0x27401d91, 0x7400d180, 0x480d1000, 0x14011033, 0x05900064, 0x41063640,
-0xd0034400, 0x0035400c, 0x036400d9, 0x0c400cd0, 0x00000220, 0x00000000,
-0x0037a800, 0x4c6c019f, 0x22900db1, 0x6c40d300, 0xc00d3000, 0x00930027,
-0x21b83c2d, 0x1300c0c1, 0xb003cd02, 0x0030c00d, 0x034c00db, 0x08c00db0,
-0x00000e20, 0x00000000, 0x003d8087, 0x07dc15ff, 0x6cc40a70, 0xdc00ff02,
-0xc00fe001, 0x003f002f, 0x0b7000dc, 0x7f080dc8, 0x70033c09, 0x003fc00d,
-0x03d800f7, 0x1fc10f72, 0x00000600, 0x00000000, 0x00350802, 0x405cc093,
-0x25c08d70, 0x5c00d300, 0xd00d3000, 0x001b2034, 0x3130a04c, 0xbb008ec0,
-0xb0034d02, 0x0034d00d, 0x031c00cf, 0x08d00d70, 0x00000420, 0x00000000,
-0x0874a013, 0x03444791, 0x24481d10, 0x0400f100, 0x400f1003, 0x301100b4,
-0x04100044, 0x5d003440, 0x1083c402, 0x003eca0f, 0x03c400fd, 0x4c402f10,
-0x00000200, 0x00000000, 0x11e2a003, 0x045403d1, 0x21400cd1, 0x1400d140,
-0x400c1101, 0x000d04b0, 0x00904005, 0x8d800240, 0x90030418, 0x2030400c,
-0x031400cd, 0x1c400c50, 0x00000a00, 0x00000000, 0x46688000, 0x548401f1,
-0x6940bc90, 0x8401e900, 0x401e1004, 0x01212368, 0xb29404c4, 0xad0a7864,
-0x12078401, 0x007a401e, 0x078429ed, 0x10501e10, 0x00000200, 0x00000000,
-0x00201016, 0x001c0a83, 0x25c48cf2, 0x5c08d300, 0xc00d3403, 0x080f0120,
-0x09b00005, 0xdf0202c0, 0xb0130c0e, 0x0030c04c, 0x035c00df, 0x48c00d70,
-0x00000040, 0x00000000, 0x4835b200, 0x117c60cd, 0x26c2ad60, 0x7c30d700,
-0xc08df200, 0x001f4137, 0x0d70223c, 0xdf023780, 0xf0037c28, 0x0037c00d,
-0x237c60df, 0x0bc18dd0, 0x00000660, 0x00000000, 0x0077a015, 0x007400d3,
-0x34d02c21, 0x7c00df00, 0xc00db000, 0x80134023, 0x013000fc, 0x33007ec2,
-0xf0037c00, 0x033484cd, 0x334d1cd1, 0x54c00df2, 0x00000e00, 0x00000000,
-0x00298810, 0x00f480e1, 0x38400e10, 0xb424ed00, 0x4c4e1001, 0x0061002b,
-0x025000b4, 0xa1003d00, 0xd083b400, 0x043c42cf, 0x539400e5, 0x48405ed0,
-0x00000620, 0x00000000, 0x00710083, 0x04b401a1, 0x78401f10, 0xf041ed00,
-0x449e9904, 0x0121047f, 0x131005b4, 0xe1004840, 0xd007b401, 0x0138401e,
-0x078485c1, 0x0c501ed0, 0x00000400, 0x00000000, 0x40732812, 0x813400c1,
-0x34420c10, 0x7400cd02, 0x400c103f, 0x21010073, 0x0c100634, 0xc101f040,
-0xd0033407, 0x0030420c, 0x031400c5, 0x48400cd0, 0x00000c20, 0x00000000,
-0x045da816, 0x01fc1171, 0x54c00634, 0xfc007f00, 0xc005b009, 0x9373201f,
-0x273485fc, 0x7341dcc0, 0xf0817c07, 0x0014d005, 0x014c0053, 0x5cc005f0,
-0x00000620, 0x00000000, 0x00070012, 0x007c921f, 0x07c021f2, 0x7c001f00,
-0xc001f000, 0x011f0007, 0x11f0287c, 0x0f0005d0, 0xf1007c02, 0x0007c000,
-0x003e001f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x02260810, 0x067c009f,
-0x24c40920, 0x7c009340, 0xc8093002, 0x009b0027, 0x1830027c, 0x9f0026c0,
-0xf2024c01, 0x0020c009, 0x024c0093, 0x40d09872, 0x00000c20, 0x00000000,
-0x01a62000, 0x2634009d, 0x24420910, 0x74009b08, 0x40091002, 0x80910027,
-0xb9b06e34, 0x9d082442, 0xd0024451, 0x08244009, 0x82440091, 0x04403910,
-0x00000800, 0x00000000, 0x00248018, 0x0274189d, 0x24401951, 0x74009100,
-0x40091002, 0x80990063, 0x09100274, 0x9d002760, 0xd0024404, 0x40245409,
-0x02440081, 0x60400950, 0x00000200, 0x00000000, 0x02202010, 0x2676088d,
-0x20400850, 0x34088102, 0x44881022, 0x08812263, 0x98902234, 0x8d002048,
-0xd0020548, 0x01204048, 0x32040481, 0x40408812, 0x00000080, 0x00000000,
-0x0586b01c, 0x087c821f, 0x84d14574, 0x7c161100, 0xc1613458, 0x221b0587,
-0x6134587c, 0x1f3787c1, 0xf2784c36, 0x22c4c8b1, 0x0c4d0b13, 0x74c16470,
-0x00000ac0, 0x00000000, 0x012fb839, 0x12fc04bf, 0x2fc00bb0, 0xbc049f01,
-0x8849f113, 0x84bf412f, 0x4a7012bc, 0xbf106fc0, 0xf0867c24, 0x0267c099,
-0x327c099f, 0x67c049f0, 0x00000e60, 0x00000000, 0x01afa018, 0x02c402b3,
-0xa4c04b20, 0x0c269348, 0x40693012, 0x02b30227, 0x2be0123c, 0xb111a7c0,
-0xf1367c04, 0x0023c009, 0x4a4c1493, 0x60c06a30, 0x00000e00, 0x00000000,
-0x0987089c, 0x00440451, 0x0460a112, 0x44261109, 0x40611058, 0x00114283,
-0x24710e64, 0x11018700, 0xd0207414, 0x038748a1, 0x18540601, 0x70404110,
-0x00000c20, 0x00000000, 0x40a7a010, 0x42240099, 0x22520990, 0x25029100,
-0x4028100a, 0x80811127, 0x68d02234, 0x81032340, 0xd0123402, 0x04234148,
-0x12241081, 0x40406890, 0x00000e80, 0x00000000, 0x0935a818, 0x02648899,
-0x26400994, 0x64009100, 0x40091002, 0x20910827, 0x09512864, 0x91562240,
-0xd2027494, 0x08274009, 0x0274a091, 0x62400990, 0x00000620, 0x00000000,
-0x0027a801, 0x866d039b, 0x264019b1, 0x6c009300, 0xc0093402, 0x18930067,
-0x09f0007c, 0x9300a7c2, 0xf0027c00, 0x4027c809, 0x026c0093, 0x14d009b4,
-0x00000e20, 0x00000000, 0x10658014, 0x0a5d0097, 0x25c44970, 0x1c009f10,
-0xc009f102, 0x009f0237, 0x39f0056c, 0x9f0067c0, 0xf2027c20, 0x2023c009,
-0x021c009f, 0x51d00870, 0x00000600, 0x00000000, 0x04050814, 0x107c821f,
-0x06c40131, 0x7c001f00, 0xd0013008, 0x02130404, 0x6130406c, 0x134084c0,
-0x60007c2a, 0x0004c001, 0x004c0003, 0x50c00130, 0x00000420, 0x00000000,
-0x0498a014, 0x01f4236d, 0x14500610, 0xf6004d00, 0x44051401, 0x00512090,
-0x07101d44, 0x71001ec0, 0x10017400, 0x401c4005, 0x816c2051, 0x504207b0,
-0x00000200, 0x00000000, 0x00b2a014, 0x03749bcd, 0x34400c11, 0x3400cd20,
-0x400c9003, 0x00c100f2, 0x1c140324, 0xc1003040, 0x50033407, 0x0030400c,
-0x030400c1, 0x50440492, 0x00000a00, 0x00000000, 0x00288005, 0x02f400ed,
-0x38410f10, 0xb404ed11, 0x401c9203, 0x01b100ba, 0x3e102784, 0xe1013040,
-0x10073400, 0x0138601e, 0x032501e1, 0x14400e90, 0x00000200, 0x00000000,
-0x00781015, 0x07bc81ef, 0x78c41634, 0xb403ef00, 0xc01eb017, 0x01e3404a,
-0x1e3027ac, 0x21027850, 0x7017bc01, 0x00f8c15c, 0x1f8c02e3, 0x54c09ab0,
-0x00000040, 0x00000000, 0x1005b810, 0x003c001f, 0x35c000f1, 0x7c00df02,
-0xc88d5023, 0x028e0885, 0x0ff01b7c, 0x3f0b37c8, 0xf0237c00, 0x01b7d0ed,
-0x075c14df, 0x43d069f0, 0x00000660, 0x00000000, 0x406fa202, 0x37cc0973,
-0x7f401f21, 0xc801f302, 0xc01ff007, 0x03f300ec, 0x1b7027cc, 0xf3207cc0,
-0x100fcc21, 0x40fcc0df, 0x07cc01f3, 0x00c017f0, 0x00000e00, 0x00000000,
-0x000d8815, 0xb0848aa1, 0x3f444e10, 0x9400e000, 0x400ed003, 0x84a10128,
-0x07507384, 0xe1013941, 0x10038400, 0x0138488e, 0x039400f5, 0x54408ed0,
-0x00000620, 0x00000000, 0x00390018, 0x33c60861, 0x3a41061a, 0x8400e150,
-0x400ed003, 0xc1e0441a, 0x0b400384, 0x61003840, 0x10038410, 0x9038444e,
-0x038400e1, 0x00501ad0, 0x00000400, 0x00000000, 0x00032806, 0x04050101,
-0x33401410, 0x0400c100, 0x000cd007, 0x12910012, 0x38100b44, 0x01427140,
-0xd0034413, 0x0830400c, 0x031500c4, 0x104008c0, 0x00000c20, 0x00000000,
-0x1875a81d, 0x4a448591, 0x3ec01d05, 0xcd00f300, 0xd20ff01f, 0x93934016,
-0x15700f4d, 0xd300bcc2, 0x3403cd03, 0x003cd00f, 0x03cc00f3, 0x54c001d0,
-0x00000620, 0x00000000, 0x00670001, 0x027c229f, 0x37c42df1, 0x7ca0df00,
-0xc00df003, 0x00df0015, 0x2ff0837c, 0xff0033c1, 0x30037c02, 0x2033c20c,
-0x032c00df, 0x07c009f0, 0x00000c00, 0x00000000, 0x103f0801, 0x43cc187f,
-0x3cd40330, 0xbc00df00, 0xc00c3043, 0x08b30024, 0x2730434c, 0x93043fc0,
-0x3003f801, 0x003cc80d, 0x03cc00f3, 0x00c08f30, 0x00000c22, 0x00000000,
-0x00e62081, 0x0404030d, 0x34409812, 0x7420dda0, 0x400d1003, 0x00d104a4,
-0x65b0e344, 0x11003742, 0x10837405, 0x0034400d, 0x036c00d1, 0x04400d10,
-0x00000802, 0x00000000, 0x0074a000, 0x064420dd, 0x34422d10, 0x7480dd00,
-0x400d5203, 0x00910800, 0x01100344, 0x11003740, 0x10036408, 0x1034400d,
-0x8344a0c1, 0x04400010, 0x00000200, 0x00000000, 0x00202010, 0x0044009d,
-0x30400c10, 0x3480cd00, 0x400c5103, 0x00c10820, 0x00900341, 0xc1483340,
-0x12033480, 0x0030400c, 0x032480c1, 0x40500810, 0x00000080, 0x00000000,
-0x0836b000, 0x034d004f, 0x34c00534, 0x7c80dd00, 0xd00d7403, 0x00a34034,
-0x0130034d, 0x13003f40, 0x3403ac00, 0x4038d00f, 0x034c00f3, 0x00c00e34,
-0x00000ac0, 0x00000000, 0x000fb804, 0x80bc003f, 0x3fc20fd8, 0xfc20ff00,
-0xc20fb003, 0x00ff083f, 0x03f083fc, 0x3f003bc2, 0xe003fc00, 0x403fc00f,
-0x03fc00ff, 0x17c00ff0, 0x00000e60, 0x00000000, 0x000ba003, 0x98cc02bf,
-0x3cc20ff0, 0xcc88bf20, 0xc00f3032, 0x00f7103c, 0x033003fc, 0xfb203dc0,
-0xf002ccc0, 0x012fc00f, 0x03cc04b3, 0x0cc4cbf0, 0x00000e00, 0x00000000,
-0x08350801, 0x004482ed, 0x36c825c0, 0x54469d10, 0x400d5033, 0x40c10039,
-0x01110274, 0xe9003048, 0xd0024480, 0x02974a0d, 0x01444a91, 0x0440cbd0,
-0x00000c20, 0x00000000, 0x00332011, 0x1811068d, 0x21482c58, 0x16868d20,
-0x400c1002, 0x80c58832, 0x01100374, 0xc9003140, 0xd0023400, 0x0033400c,
-0x03070081, 0x444008d0, 0x00000e88, 0x00000000, 0x00b5a803, 0x085440dd,
-0x36401dd0, 0x16018d00, 0x400d5046, 0x00d11037, 0x0d160274, 0xd9003400,
-0xd2036440, 0x0037440d, 0x014620d0, 0x0c4089d0, 0x00000620, 0x00000000,
-0x0057a800, 0x045c009f, 0x74c01c70, 0x4c879f00, 0xc00f310f, 0xa0d70036,
-0xb130007c, 0xdb0035c0, 0xe0227d00, 0x1033c00f, 0x014c0853, 0x08d01df1,
-0x00000e20, 0x00000000, 0x00fd8087, 0x15e404ee, 0x7fc40ff0, 0xf8009e21,
-0x800ee003, 0x02ff003d, 0x0ff203f8, 0xff10bf44, 0xf002dc40, 0x401fc00f,
-0x17fc00ff, 0x1fc01bf0, 0x00000600, 0x00000000, 0x00350802, 0x014c00db,
-0x14c10df1, 0x4c021f01, 0xc04d700a, 0x40d34037, 0x61f0024c, 0xd32034c8,
-0xf0824c04, 0x20b7c00d, 0x034d00c3, 0x08d00cf0, 0x00000420, 0x00000000,
-0x23b4a013, 0x2dc00091, 0x34501dc0, 0x44019d00, 0x423f1082, 0x4491007b,
-0x3cd00304, 0xf00aa440, 0xd0034400, 0x0037400f, 0x034401d1, 0x4c420dd0,
-0x00000200, 0x00000000, 0x0032a007, 0x22048089, 0xb24008d0, 0x04418d08,
-0x443c1041, 0x13cd0033, 0x00d04b04, 0xd0003148, 0xd0830402, 0x0023400c,
-0x0224488d, 0x1e4008d0, 0x00000a00, 0x00000000, 0x407c8006, 0x058409e9,
-0x7a4097d1, 0xe501ad00, 0x411e1127, 0x09ed067b, 0x12d00680, 0xe1027900,
-0xd0068419, 0x6273401e, 0x06a4098d, 0x12409ad0, 0x00000208, 0x00000000,
-0x02301012, 0x010c00ca, 0x32c188f0, 0x0c3c8f00, 0xc0cc3420, 0x00cf2233,
-0x0df0030c, 0xc34231d1, 0xf0030d00, 0x02b3c48c, 0x222c088f, 0x4ac289ea,
-0x00000040, 0x00000000, 0xa03db802, 0x43fd00b7, 0x35408ec0, 0x9e089f12,
-0xc28db1a2, 0x20f30237, 0x0ff120f1, 0xff023ec0, 0xf103fc00, 0x023fc00f,
-0xa2dc68f3, 0x09c08bf0, 0x00000660, 0x00000000, 0x0037a015, 0x024c009f,
-0xb4c81bf0, 0x5c009301, 0xc00d3403, 0x20d36437, 0x0d30024c, 0xd30130d0,
-0xf0034c03, 0x0037c00f, 0x044c0013, 0x54c04df2, 0x00000e00, 0x00000000,
-0x00398812, 0x118488ed, 0x3ac40ed1, 0xb480e584, 0x486eb003, 0x00e1003b,
-0x0e1083c4, 0xe1043840, 0xd002840c, 0x0033405e, 0x03840085, 0x48450ed0,
-0x00000620, 0x00000000, 0x00790083, 0x05a421ad, 0xda4018d0, 0xb401a100,
-0x405e1806, 0x11f1027b, 0x1e100684, 0xe1007e44, 0xd0078408, 0x007b429e,
-0x02a403a1, 0x0c401cd1, 0x00000400, 0x00000000, 0x00730812, 0x074421cd,
-0x32406cd2, 0x74028524, 0x480c900a, 0x00c90033, 0x1c144504, 0xc1027240,
-0xd8030520, 0x0073400c, 0x472503c5, 0x48408cd0, 0x00000c20, 0x00000000,
-0x015da817, 0x05cc015f, 0x96d007e2, 0xfc067300, 0xc0073411, 0x0172001f,
-0x77340dcc, 0x534016c0, 0xf0014c00, 0x015fc005, 0x1de58373, 0x5cd015f0,
-0x00000620, 0x00000000, 0x00870012, 0x287d081f, 0x07c001e0, 0x78041f00,
-0xc021f810, 0x00170087, 0x31f0207d, 0x1f0005c0, 0xf0007c00, 0x5003c001,
-0x005c040f, 0x4bc001f0, 0x00000c00, 0x00000000, 0x00a70810, 0x164c009f,
-0x37c01930, 0x4c499b08, 0xc8493002, 0x009b0827, 0x3930064c, 0x8300b4c0,
-0xf0024c01, 0x2024d009, 0x024c0193, 0x40c02930, 0x00000c20, 0x00000000,
-0x01262001, 0x164c009d, 0x23403914, 0x6c839100, 0x40495002, 0x009108a7,
-0x09100644, 0x914026c8, 0x70024083, 0x40244008, 0x024c0a91, 0x04502910,
-0x00000800, 0x00000000, 0x0024a018, 0x02440085, 0x27498910, 0x44828100,
-0x60091002, 0x00814023, 0x0c102305, 0x91002050, 0x50024414, 0x40244009,
-0x03060091, 0x60410810, 0x00000200, 0x00000000, 0x00202010, 0xd204148d,
-0x23414818, 0x24148140, 0x60085552, 0x08810223, 0x8c142204, 0x81022060,
-0x500a0408, 0x02204028, 0x0a270181, 0x40408810, 0x00000080, 0x00000000,
-0x2006b01d, 0x104c4407, 0x17c84130, 0x06041340, 0xc1413110, 0x02110093,
-0x2032084c, 0x03108440, 0x71004c02, 0x1584c141, 0x004c9413, 0x74c16130,
-0x00000ac0, 0x00000000, 0x082f9819, 0x52d914bf, 0x33c60bf0, 0xfc14bf20,
-0xc009f452, 0x04a701a7, 0x4ff012fc, 0x9f0127c0, 0x7002f806, 0x012fc409,
-0x03dc40bf, 0x67c04bf0, 0x00000e60, 0x00000000, 0x002f8019, 0x1acc0c93,
-0x25c04b31, 0xcc069300, 0xd059300a, 0x029301ac, 0x29300a6c, 0x9300a4c0,
-0xf0020c80, 0x0324c018, 0x0a4c00b3, 0x60c0cb30, 0x00000e00, 0x00000000,
-0x0007089c, 0xa8400e11, 0x0452a110, 0x044a0120, 0x40011008, 0x04110384,
-0x01100044, 0x31000440, 0xd1104416, 0x43844061, 0x106d0a15, 0x7040e110,
-0x00000c20, 0x00000000, 0x0067a010, 0x12144085, 0x25401910, 0x24219580,
-0x4029101a, 0x04a50127, 0x4a101285, 0xa1012840, 0xd0422422, 0x20204128,
-0x12644089, 0x40400810, 0x00000e80, 0x00000000, 0x6065a818, 0x0a540481,
-0x24400918, 0x44209551, 0x40090002, 0x00a10026, 0x0b100a84, 0xb1002c40,
-0xd0066400, 0x04245409, 0x0264009d, 0x60404810, 0x00000620, 0x00000000,
-0x00e7a805, 0x0a5d0197, 0xe5802934, 0x6d009720, 0xc0092402, 0x01970027,
-0x2934026c, 0x93402490, 0xf0026c00, 0x4024c809, 0x0a2c069b, 0x14d01934,
-0x00000e20, 0x00000000, 0x00258214, 0x666c209f, 0x37c009f1, 0x3c09db00,
-0xc10df026, 0x429f4025, 0x59f0027c, 0x9f0e67c0, 0xf0825c00, 0x0227c008,
-0x027c0997, 0x53c009f0, 0x00000600, 0x00000000, 0x24050814, 0x080c001f,
-0xc4c00118, 0x4c881f00, 0xc0013404, 0x10130004, 0x0130004c, 0x0f0004d0,
-0x30007c04, 0x4000c001, 0x007c0303, 0x50c101f0, 0x00000420, 0x00000000,
-0x09d88214, 0x81c4005d, 0x14505630, 0xec415c00, 0x4004f015, 0x055b00d0,
-0x15140545, 0x5d209440, 0x50017402, 0x401c4007, 0x01740671, 0x505077d0,
-0x00000200, 0x00000000, 0x00b2a014, 0x0f0000cd, 0x37604c98, 0x0441dd00,
-0x50205007, 0x03c106f0, 0x0d103704, 0xcd02f740, 0x10033400, 0x0030500c,
-0x033401c1, 0x50400cd0, 0x00000a00, 0x00000000, 0x08388005, 0x080404ed,
-0x3b400c10, 0xa400ed00, 0x4103d003, 0x00e9003c, 0x0e100384, 0xed001b41,
-0x4007f401, 0x0038424e, 0x13b480e1, 0x14400cd0, 0x00000200, 0x00000000,
-0x00781015, 0x048d03fd, 0x7bc01e94, 0x8c116f10, 0xc0127007, 0x01f3007c,
-0x1f3106cc, 0x2f007bc0, 0x3047bc90, 0x007cc13e, 0x1fbc0123, 0x54c01ef0,
-0x00000040, 0x00000000, 0x0015b010, 0x837c16df, 0xb4d80970, 0xfc205f01,
-0xc068f403, 0x00df0037, 0x0df0027c, 0x1f0014c0, 0xb0137404, 0x0237c00d,
-0x0b7c205f, 0x43c00df0, 0x00000660, 0x00000000, 0x1a7fa002, 0x04cc41ff,
-0xfcc01730, 0xfc01f302, 0xc0333005, 0x01e7006f, 0x1b3007cc, 0xf3426fc0,
-0x7243fc01, 0x207cc41f, 0x0fcc817b, 0x03c01f30, 0x00000e00, 0x00000000,
-0x12398815, 0x1b8404ed, 0x3ac00e10, 0xf482a102, 0x48221003, 0x50e1003b,
-0x0a104384, 0xe1000f48, 0xb023f400, 0x403ac00f, 0x03cc0061, 0x57400eb0,
-0x00000620, 0x00000000, 0x2a190008, 0x038490cd, 0xba400e18, 0xb4002510,
-0x40021001, 0x00f50223, 0x0a1402c5, 0x21142b40, 0x5023b400, 0x0038408e,
-0x03a40001, 0x03400e10, 0x00000400, 0x00000000, 0x04032816, 0x0c0400cd,
-0x32490c10, 0x74010500, 0x4000100b, 0x00d10033, 0x2c120204, 0x91200342,
-0xc0033400, 0x0032400c, 0x0b042001, 0x13409d90, 0x00000c20, 0x00000000,
-0x0075a805, 0x034d01ff, 0x32c00c34, 0x7c611740, 0xc601300a, 0x00170017,
-0x1430014c, 0xd31037c9, 0x7003f800, 0x003cc20f, 0x1fad0513, 0x57c01d30,
-0x00000620, 0x00000000, 0x02b70001, 0xb97c80df, 0x77c01df0, 0xfc081a00,
-0xc001f022, 0x021f0017, 0x45f0017c, 0xdf0097c0, 0x22077c00, 0x0477c00d,
-0x437c105f, 0x07c00df0, 0x00000c00, 0x00000000, 0x003f0801, 0x07cc00f3,
-0x3cc80db0, 0xfc143300, 0xc0833042, 0x283b0018, 0x073040cc, 0x3f027cc0,
-0xb003cc02, 0x2038c00f, 0x03cd0033, 0x00c09f30, 0x00000c22, 0x00000000,
-0x00122081, 0x0d0400d1, 0x34500d10, 0x74031100, 0x4028f002, 0x02110094,
-0x2d104844, 0x5d001440, 0x10034481, 0x4035400d, 0x03440641, 0x04402d10,
-0x00000802, 0x00000000, 0x0c34a001, 0x224500c1, 0x34608593, 0x76005110,
-0x40011005, 0x10190084, 0x21101104, 0xdd142540, 0x90030400, 0x0034400c,
-0x03542119, 0x04610d10, 0x00000200, 0x00000000, 0x20102210, 0x004400c1,
-0x54620d90, 0x34000100, 0x4800d203, 0x00c12010, 0x01120305, 0xcd002140,
-0x91030440, 0x0031480c, 0x03440001, 0x40400c10, 0x00000080, 0x00000000,
-0x0016b001, 0x020c80f1, 0x34c80db1, 0x7c001340, 0xd0013201, 0x001b0024,
-0x0134014d, 0x1f0035c4, 0xb103cd00, 0x0034c00f, 0x03dc0013, 0x00d00132,
-0x00000ac0, 0x00000000, 0x002fb805, 0x00fc00ff, 0x3bd00f70, 0xfc003f00,
-0xc00ff483, 0x20ff103f, 0x0ff083bc, 0xff003ed4, 0x7183fc00, 0x403bc40f,
-0x03fc803f, 0x17c003f0, 0x00000e60, 0x00000000, 0x8080a300, 0x0839020e,
-0x83b820ec, 0x3b038ec0, 0xb020ec08, 0x820e80e3, 0x20ec083a, 0x0ec083a0,
-0xec0a3b02, 0xc083a828, 0x083b020e, 0x03b020ec, 0x0000008c, 0x00000000,
-0x8022a200, 0x023a808e, 0x23b808ea, 0x2a808ea0, 0xa808ea82, 0x808e8023,
-0x08ea023a, 0x8ea023a8, 0xea023a80, 0xa0232808, 0x023a808e, 0x03a808ea,
-0x00000a88, 0x00000000, 0x80402100, 0x04120104, 0x41201048, 0x12018480,
-0x20104804, 0x01048061, 0x10480412, 0x04804120, 0x48041201, 0x80410018,
-0x04120104, 0x01201048, 0x0000020c, 0x00000000, 0x80008100, 0x001a0006,
-0x01a00068, 0x1a100680, 0xa0006800, 0x10068401, 0x0068001a, 0x060001a9,
-0x68461a00, 0x80018900, 0x00180006, 0x01a00068, 0x00000004, 0x00000000,
-0xa012a300, 0x013a804e, 0x13a004e2, 0x3a884e20, 0xa804ea01, 0x004ea013,
-0x04e2013a, 0x4ea013a8, 0xea293a80, 0xa013a014, 0x013a804e, 0x03a804ea,
-0x00000a88, 0x00000000, 0x0002a100, 0x00180006, 0x01800060, 0x18080600,
-0x80006000, 0x00060201, 0x80602018, 0x06020180, 0x60a01800, 0x00018080,
-0x00180006, 0x01800060, 0x0000008c, 0x00000000, 0x2012a300, 0x01108044,
-0x11000442, 0x10804420, 0x08044201, 0x00042011, 0x00420110, 0x44201108,
-0x42011080, 0x20110004, 0x01108044, 0x01080442, 0x0000008c, 0x00000000,
-0xa052a300, 0x050a8142, 0x50a0142a, 0x0a8342a0, 0xa8142a05, 0x8102a050,
-0x102a050a, 0x42a050a0, 0x2a070881, 0xa050a014, 0x05088142, 0x00a8142a,
-0x00000a8c, 0x00000000, 0x80300100, 0x032a00ca, 0x32a00ca8, 0x2200ea80,
-0xa00ca803, 0x00ca803a, 0x0ea80baa, 0xca802aa0, 0xa803aa00, 0x8032a00e,
-0x032a00ca, 0x02a00ca8, 0x00000804, 0x00000000, 0x28000100, 0x00080002,
-0x00820020, 0x20000200, 0x80002000, 0x00422000, 0x04200008, 0x02000082,
-0x20020800, 0x00008800, 0x00080002, 0x80800020, 0x00000004, 0x00000000,
-0x0006a200, 0x00410010, 0x04100104, 0x61101040, 0x10010400, 0x10100404,
-0x01040841, 0x10401411, 0x04404100, 0x40041101, 0x00410010, 0x80100104,
-0x00000a8c, 0x00000000, 0xa002a300, 0x001a8006, 0x01a0006a, 0x1a8026a0,
-0xa8006a00, 0x4006a009, 0x026a009b, 0x06a8099a, 0x6a009a80, 0xa001a802,
-0x001a8006, 0x01a8006a, 0x0000008c, 0x00000000, 0x8002a300, 0x001b0006,
-0x01b0006c, 0x1b0006c0, 0xb0006c00, 0x0046c001, 0x046c001a, 0x06c001a0,
-0x6c001b00, 0xc001b000, 0x001b0006, 0x01b0006e, 0x0000008c, 0x00000000,
-0x0042a300, 0x0430810c, 0x430810c2, 0x30910c20, 0x0810c204, 0x810c2043,
-0x10c20430, 0x0c204308, 0xc2443081, 0x20430810, 0x0430810c, 0x030810c2,
-0x00000a8c, 0x00000000, 0x20000100, 0x0030000c, 0x030000c0, 0x30080c00,
-0x0000c000, 0x000c0203, 0x80c02030, 0x0c020300, 0xc0203000, 0x00030080,
-0x0030000c, 0x030000c0, 0x00000004, 0x00000000, 0x80400100, 0x0432010c,
-0x432010c8, 0x32010c80, 0x2010c804, 0x830c8043, 0x30c80432, 0x0c804328,
-0xc8043201, 0x80432010, 0x0432010c, 0x032010ca, 0x00000204, 0x00000000,
-0xa042a200, 0x041a8106, 0x41a8106a, 0x1a8106a0, 0xa8106a04, 0x8306a041,
-0x306a041a, 0x06a04188, 0x6a041a81, 0xa041a810, 0x041a8106, 0x01a81060,
-0x00000a88, 0x00000000, 0x0042a300, 0x04100104, 0x41001040, 0x10210400,
-0x00104004, 0x01040041, 0x10400430, 0x04004300, 0x40041001, 0x00410010,
-0x04100104, 0x01001040, 0x00000084, 0x00000000, 0x2042a200, 0x04188106,
-0x41881062, 0x18812620, 0x88106204, 0x81062041, 0x10620430, 0x06204308,
-0x62049881, 0x20418810, 0x04188106, 0x01881060, 0x00000088, 0x00000000,
-0x2006a300, 0x0068801a, 0x06a801aa, 0x6a801aa0, 0xa801a200, 0x001aa006,
-0x01aa0062, 0x1aa00620, 0xaa006a80, 0xa006a801, 0x006a801a, 0x02a801a0,
-0x00000a88, 0x00000000, 0x80600100, 0x060a0182, 0x60a01828, 0x08018280,
-0xa0182806, 0x01828060, 0x1828060a, 0x82006080, 0x20060801, 0x80608018,
-0x06080182, 0x00a01828, 0x00000004, 0x00000000, 0x80400000, 0x04020100,
-0x40221008, 0x02012080, 0x20100804, 0x01008040, 0x10080402, 0x00804020,
-0x08048201, 0x80402210, 0x04020100, 0x00201008, 0x00000004, 0x00000000,
-0x8062a300, 0x062b018a, 0x62b018ac, 0x2b098ac0, 0xb018ac06, 0x098ac262,
-0x98ac062b, 0x8ac062b0, 0xac262b01, 0xc062b098, 0x062b018a, 0x02b018ac,
-0x00000a8c, 0x00000000, 0xa062a200, 0x063a818e, 0x63a818ea, 0x3a918ea0,
-0xa818ea06, 0x818ea063, 0x18ea063b, 0x8e8063b8, 0xea463a81, 0xa0638818,
-0x063a818e, 0x03a818ea, 0x00000088, 0x00000000, 0xc062a200, 0x063b018e,
-0x63b018e4, 0x39018ec0, 0xb0186c06, 0x018ec063, 0x18ec063a, 0x8ec063a8,
-0xec063b81, 0xc063b018, 0x063b018e, 0x03b018e4, 0x00000088, 0x00000000,
-0xa062a200, 0x063a818e, 0x63a818ea, 0x3a898ea0, 0xa818ca06, 0x818ea263,
-0x98eaa630, 0x8ea26308, 0xea263b81, 0xa063a898, 0x063a818e, 0x03a818ea,
-0x00000a88, 0x00000000, 0x80400000, 0x04120104, 0x41201048, 0x12010480,
-0x20104804, 0x01048041, 0x1048043a, 0x048043a0, 0x48041201, 0x80412010,
-0x04120104, 0x01201048, 0x00000000, 0x00000000, 0x80600000, 0x061a0186,
-0x61a01868, 0x1a018680, 0xa0186806, 0x81860061, 0x18680618, 0x860061a0,
-0x68061a01, 0x8061a018, 0x061a0186, 0x01a01868, 0x00000000, 0x00000000,
-0xa002a200, 0x003a800e, 0x038800ea, 0x3a800ea0, 0x8800e200, 0x800ca003,
-0x00ca003a, 0x0ea003a8, 0xea003a00, 0xa0032800, 0x003a800e, 0x03a800e2,
-0x00000a88, 0x00000000, 0x0042a200, 0x04180106, 0x41801060, 0x18010600,
-0x80106004, 0x010400c1, 0x10400418, 0x06004180, 0x60041801, 0x00410010,
-0x04180106, 0x01801060, 0x00000088, 0x00000000, 0x2042a200, 0x04108104,
-0x41081042, 0x10810420, 0x08104204, 0x81062041, 0x10620410, 0x04204108,
-0x42041001, 0x20418810, 0x04108104, 0x01081042, 0x00000088, 0x00000000,
-0x2042a200, 0x040a8102, 0x4088102a, 0x088102a0, 0xa8102204, 0x010a2040,
-0x10aa0c0a, 0x02a040a8, 0x2a040a01, 0xa042a830, 0x040a8102, 0x00a8102a,
-0x00000a88, 0x00000000, 0x80c00000, 0x0c2a030a, 0xc2a030a8, 0x2a010a80,
-0xa030a80c, 0x030a80c2, 0x30a80c2a, 0x0a80c2a0, 0xa80c2a03, 0x80c2a030,
-0x0c2a030a, 0x02a030a8, 0x00000000, 0x00000000, 0x00120000, 0x01080042,
-0x10800420, 0x08004200, 0x80042001, 0x00420000, 0x04208008, 0x42001080,
-0x20010800, 0x00108000, 0x01080042, 0x00800420, 0x00000000, 0x00000000,
-0x4042a200, 0x04010100, 0x40101004, 0x01010040, 0x10100404, 0x01004050,
-0x10040501, 0x00404010, 0x04040101, 0x40401014, 0x04010100, 0x00101004,
-0x00000a88, 0x00000000, 0xa000a200, 0x001a8006, 0x01a8006a, 0x1a0006a0,
-0xa0006a00, 0x8006a001, 0x0062001b, 0x06a001b8, 0x6a001a80, 0xa001a800,
-0x001a8006, 0x01a8006a, 0x00000088, 0x00000000, 0xc002a300, 0x001b0006,
-0x01b0006c, 0x1b8006c0, 0xb0006c00, 0x8006c001, 0x006c003a, 0x06c003a0,
-0x6c001b00, 0xc001b000, 0x00130006, 0x01b0006c, 0x00000000, 0x00000000,
-0x20000000, 0x0030800c, 0x030800c2, 0x30800c20, 0x0800c200, 0x800c2003,
-0x00c20018, 0x0c200188, 0xc2003080, 0x20030800, 0x0030800c, 0x030800c2,
-0x00000000, 0x00000000, 0x00000000, 0x0030000c, 0x030000c0, 0x30002c00,
-0x0000c000, 0x002c000b, 0x0ac00010, 0x0c002100, 0xc002b000, 0x00030002,
-0x0010000c, 0x030000c0, 0x00000000, 0x00000000, 0x00a00000, 0x0a32028c,
-0xa32028c8, 0x32808c80, 0x2028c80a, 0x028c80a3, 0x38c80a32, 0x8c80a328,
-0xc80a3202, 0x80a32028, 0x0a32028c, 0x032028c8, 0x00000000, 0x00000000,
-0xa0c40000, 0x0c588316, 0xc5a8316a, 0x5a8316a0, 0xa8316a0c, 0x8316a0c5,
-0x316a0c5a, 0x16a0c5a8, 0x6a0c5a83, 0xa0c5a831, 0x0c5a8316, 0x01a8316a,
-0x00000000, 0x00000000, 0x00000000, 0x00100004, 0x01000040, 0x10002400,
-0x00004000, 0x00240019, 0x0a400110, 0x04002100, 0x40029000, 0x00010006,
-0x00100004, 0x01000040, 0x00000000, 0x00000000, 0x22100000, 0x21188846,
-0x11888462, 0x18804622, 0x88846221, 0x88462201, 0x04622018, 0x46201188,
-0x62011888, 0x22118880, 0x21188846, 0x01888462, 0x00000000, 0x00000000,
-0xa2000000, 0x2028880a, 0x028880a2, 0x28080aa2, 0xa880aa20, 0x880aa202,
-0x80aa202a, 0x0aa222a0, 0xaa022888, 0x2202a880, 0x202a880a, 0x02a880aa,
-0x00000000, 0x00000000, 0x84100000, 0x410a1042, 0x10a10428, 0x0a184284,
-0xa1042041, 0x104a8010, 0x04a8410a, 0x42841081, 0x20010a10, 0x8412a004,
-0x410a1042, 0x00a10428, 0x00000000, 0x00000000, 0x80500000, 0x05020140,
-0x50201408, 0x02014080, 0x20140805, 0x01400050, 0x14000502, 0x40805020,
-0x08050201, 0x80500014, 0x05020140, 0x00201408, 0x00000000, 0x00000000,
-0xc0300000, 0x032b00ca, 0x32b00cac, 0x2b00cac0, 0xb00cac03, 0x00c84032,
-0x0c84032b, 0xcac032b0, 0xac032b00, 0xc032100c, 0x032b00ca, 0x02b00cac,
-0x00000000, 0x00000000, 0xa0100000, 0x013a804e, 0x13a004ea, 0x3a804ea0,
-0xa804ea01, 0x804ea013, 0x04ea013b, 0x4ea013b8, 0xea013a80, 0xa013a804,
-0x013a804e, 0x03a804ea, 0x00000000, 0x00000000, 0x18c40000, 0x8c486312,
-0xc4863121, 0x48030218, 0x8631218c, 0x231208c0, 0x30218c08, 0x1218c082,
-0x200c0863, 0x18c48230, 0x8c486312, 0x00863121, 0x00000000, 0x00000000,
-0xfffc0000, 0xffcbfff2, 0xfcbfff2f, 0xcbfff2ff, 0xbfff2fff, 0xfff2fffc,
-0xff2fffcb, 0xf2fffcbf, 0x2fffcbff, 0xfffcbfff, 0xffcbfff2, 0x00bfff2f,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xdb340000, 0xb3436cd0,
-0x3436cd0d, 0x4bedf0db, 0x36cd0db3, 0x6cd2fb34, 0xdf0db343, 0xd0db7c36,
-0x2fffc36c, 0xdb34becd, 0xb3436cd0, 0x0036cd0d, 0x00000000, 0x00000000,
-0x3ccc0000, 0xccc8f332, 0xcc8f3323, 0xcbf3f23c, 0x8f3323cc, 0xf332fccc,
-0x3f23ccc8, 0x323cfc8f, 0x2fffc8f3, 0x3cccbf33, 0xccc8f332, 0x008f3323,
-0x00000000, 0x00000000, 0x7edc0000, 0xedc9fb72, 0xdc9fb727, 0xc9e3727e,
-0x9fb727ed, 0x7b727ec4, 0xb727ec48, 0x727edc87, 0x27edc9fb, 0x7edc9fb1,
-0xedc9fb72, 0x009fb727, 0x00000000, 0x00000000, 0x40800000, 0x0839020e,
-0xa39020e4, 0x39020e60, 0x9028e408, 0x020e40a3, 0x20e60839, 0x0e408380,
-0xe4083902, 0x60839028, 0x0833020e, 0x038020e4, 0x00000000, 0x00000000,
-0xa0200000, 0x023aa08e, 0x63a808ea, 0x3a808ea0, 0xa808ea02, 0x808ea063,
-0x08ea023a, 0x8ea023a0, 0xea823a80, 0xa023a808, 0x0232808e, 0x03a808ea,
-0x00000000, 0x00000000, 0x80400000, 0x00120104, 0x61201048, 0x12010480,
-0x20104804, 0x01048041, 0x10480412, 0x44804120, 0x48041201, 0x80412018,
-0x04120104, 0x01201048, 0x00000000, 0x00000000, 0x00000000, 0x44180006,
-0x01800060, 0x18100604, 0x81086000, 0x10060421, 0x00620018, 0x06000180,
-0x60001800, 0x20018110, 0x80180006, 0x01890060, 0x00000000, 0x00000000,
-0x22100000, 0x0138884e, 0x138804e2, 0x38804e00, 0x8814e201, 0x804e2013,
-0x04e00138, 0x0e201388, 0xe2213880, 0x00138804, 0x2938804e, 0x038884e2,
-0x00000000, 0x00000000, 0x00000000, 0x00180086, 0x01800060, 0x18080600,
-0x80006080, 0x00060201, 0x80600018, 0x06020180, 0x60001800, 0x00018080,
-0x00180806, 0x01800060, 0x00000000, 0x00000000, 0x20300000, 0x01908044,
-0x19080442, 0x10806400, 0x08064201, 0x80642019, 0x04400110, 0x44201108,
-0x42011080, 0x00110806, 0x03108044, 0x01080242, 0x00000000, 0x00000000,
-0x20540000, 0x054881d2, 0x54881522, 0x48815220, 0x88152205, 0x81522054,
-0x15200548, 0x52205488, 0x220d4881, 0x00548815, 0x05488152, 0x00801922,
-0x00000000, 0x00000000, 0x00300310, 0x032800ca, 0x32800ca0, 0x2800ca00,
-0x800ca003, 0x00ca00b2, 0x0ca00328, 0xca003280, 0x80032800, 0x0032800c,
-0x032800ca, 0x02800ca0, 0x00000000, 0x00000000, 0x00600310, 0x00880082,
-0x08800020, 0x08002200, 0x80022000, 0x00220008, 0x00200008, 0x02000080,
-0x80000800, 0x00008002, 0x02080002, 0x01801620, 0x0000000c, 0x00000000,
-0x40020310, 0x40010000, 0x00100004, 0x01100044, 0x11000400, 0x10004480,
-0x00040001, 0x00400000, 0x84000100, 0x40001100, 0x00010000, 0x00110004,
-0x0000000c, 0x00000000, 0x20020310, 0x00188006, 0x018a0062, 0x18800600,
-0x88006200, 0x80062001, 0x00610018, 0x06200198, 0x628018a0, 0x20018800,
-0x00188006, 0x01980060, 0x0000000c, 0x00000000, 0x40028008, 0x00190006,
-0x01900064, 0x19800600, 0x98006400, 0x00064001, 0x00640019, 0x06400190,
-0x60001900, 0x40019000, 0x00130006, 0x41800464, 0x00000000, 0x00000000,
-0x2442a202, 0x0430910c, 0x430810c2, 0x30810c00, 0x0810c204, 0x810c2043,
-0x10c20430, 0x0c204308, 0xc0443081, 0x20430810, 0x4430810c, 0x030910c2,
-0x00000a88, 0x00000000, 0x00000002, 0x0030000c, 0x030000c0, 0x30080c00,
-0x0000c000, 0x000c0203, 0x80c00030, 0x0c020300, 0xc0003000, 0x00030080,
-0x0010080c, 0x030000c0, 0x00000000, 0x00000000, 0x00400002, 0x0430210c,
-0x430010c0, 0x30810c00, 0x0010c004, 0x010c0043, 0x10c00430, 0x0c004300,
-0xc0043001, 0x00430010, 0x0430010c, 0x030830c0, 0x00000000, 0x00000000,
-0x2042a202, 0x04188106, 0x41881062, 0x18010620, 0x80106204, 0x81062041,
-0x10620418, 0x06204188, 0x62041881, 0x20418810, 0x04188106, 0x01883062,
-0x00000a88, 0x00000000, 0x00428002, 0x04100104, 0x41001040, 0x10010400,
-0x00104004, 0x01040041, 0x10400410, 0x04004100, 0x40041001, 0x00410010,
-0x04100104, 0x03001040, 0x00000000, 0x00000000, 0x2040800a, 0x04188106,
-0x41881062, 0x18010620, 0x80106204, 0x81062041, 0x10620418, 0x06204188,
-0x62041881, 0x20418810, 0x04188106, 0x03081062, 0x00000200, 0x00000000,
-0x2002a202, 0x0028800a, 0x028800a2, 0x28000a20, 0x8000a200, 0x800a2002,
-0x00a20028, 0x0a200288, 0xa2002880, 0x20028800, 0x0028800a, 0x420000a2,
-0x00000a88, 0x00000000, 0x00602012, 0x06080182, 0x60801820, 0x08018200,
-0x88182006, 0x01820060, 0x18200608, 0x82006080, 0x20060801, 0x00608018,
-0x06080182, 0x00801820, 0x00000008, 0x00000000, 0x80400012, 0x84020100,
-0x40201008, 0x02010080, 0x20100804, 0x01008040, 0x10080402, 0x00804020,
-0x08040201, 0x80402010, 0x04022100, 0x00201008, 0x00000000, 0x00000000,
-0xc062a202, 0x262b018a, 0x62b018ac, 0x2b098a82, 0xb098ac06, 0x098ac262,
-0x188c062b, 0x8ac062b0, 0xa8062b01, 0xc062b098, 0x062b018a, 0x02b098ac,
-0x00000a88, 0x00000000, 0x24628000, 0x0638118e, 0x638818e2, 0x38818e70,
-0x8818e286, 0x818e2063, 0x18ca0638, 0x8e206388, 0xe6463881, 0x20638818,
-0x4638818e, 0x039918e2, 0x00000000, 0x00000000, 0x40628002, 0x0639018e,
-0x639018e4, 0x3b818e40, 0x9018e406, 0x018e6063, 0x18e40639, 0x8e406398,
-0xe4063901, 0x40639018, 0x0639818e, 0x038018e4, 0x00000000, 0x00000000,
-0xa062a20a, 0x063a818e, 0x63a818ea, 0x13898ea0, 0xa818ea06, 0x818ea263,
-0x98ea063a, 0x8ea263a8, 0xea063a81, 0xa063a898, 0x063a898e, 0x430818ea,
-0x00000a88, 0x00000000, 0x80480002, 0x04120124, 0x41201048, 0x12010480,
-0x20104804, 0x01048041, 0x10480412, 0x04804120, 0x48049201, 0x80412010,
-0x04920104, 0x03a01248, 0x00000200, 0x00000000, 0x00608002, 0x06180186,
-0x61801860, 0x18018600, 0x80186006, 0x01862061, 0x18600618, 0x86006180,
-0x60061801, 0x00618018, 0x06188186, 0x01881860, 0x00000080, 0x00000000,
-0x20068200, 0x0078801e, 0x0788014a, 0x78001e20, 0x8801e200, 0x801c0007,
-0x01e20078, 0x1e200700, 0xe2007880, 0x20078801, 0x0078001e, 0x038801e2,
-0x00000a08, 0x00000000, 0x00488002, 0x04180126, 0x41801060, 0x18010600,
-0x80106004, 0x01040041, 0x10600418, 0x06004100, 0x60049801, 0x00418010,
-0x04980106, 0x01801260, 0x00000000, 0x00000000, 0x20428002, 0x04108104,
-0x41081042, 0x10010420, 0x08104204, 0x81060041, 0x10420410, 0x04204180,
-0x42041081, 0x20410810, 0x04100104, 0x01081042, 0x00000000, 0x00000000,
-0x2042a202, 0x04088102, 0x40881022, 0x08010220, 0x88102204, 0x810a00c0,
-0x30220408, 0x02204288, 0x22040881, 0x20408810, 0x04080102, 0x00801022,
-0x00000a88, 0x00000000, 0x00c00002, 0x0c28030a, 0xc28030a0, 0x28030a00,
-0x8030a00c, 0x030a00c2, 0x30a00c28, 0x0a00c280, 0xa0042803, 0x00c28030,
-0x0c28030a, 0x028030a0, 0x00000000, 0x00000000, 0x00100202, 0x01080042,
-0x10800420, 0x08204200, 0x80042001, 0x00420000, 0x00200108, 0x42001080,
-0x60010800, 0x00108004, 0x01080042, 0x00800420, 0x00000000, 0x00000000,
-0x4042a202, 0x04010100, 0x40101004, 0x01010040, 0x10100404, 0x01004050,
-0x14040401, 0x00404010, 0x04040101, 0x40401010, 0x04010100, 0x00101004,
-0x00000a88, 0x00000000, 0x20028202, 0x00188006, 0x01880060, 0x18000620,
-0x88006200, 0x80062001, 0x00620018, 0x06200180, 0x62001880, 0x20018800,
-0x00188006, 0x01980062, 0x00000000, 0x00000000, 0x48028002, 0x00190006,
-0x01900066, 0x19002640, 0x90006400, 0x00060009, 0x02640019, 0x06400998,
-0x64001900, 0x40019002, 0x00198026, 0x03800064, 0x00000000, 0x00000000,
-0x2006a202, 0x0070801c, 0x070801c2, 0x70801c20, 0x0801c200, 0x801c0807,
-0x01c20070, 0x1c200708, 0xc2007080, 0x20070801, 0x0070801c, 0x018801c2,
-0x00000a88, 0x00000000, 0x0080000a, 0x0830020c, 0x830020c0, 0x30020c00,
-0x0020c008, 0x020c0083, 0x20c00830, 0x0c00a300, 0xc0083002, 0x00830038,
-0x0830028c, 0x010020c0, 0x00000000, 0x00000000, 0x00a0a002, 0x0a30028c,
-0xa30028c2, 0x3002ac00, 0x0028c00a, 0x028c00ab, 0x2ac00a30, 0x8c00ab00,
-0xc0023002, 0x00a3002a, 0x0a3082ac, 0x430828c0, 0x00000000, 0x00000000,
-0x20c2a202, 0x0c188306, 0xc1883060, 0x18830620, 0x8830620c, 0x830620c1,
-0x30620c18, 0x0620e180, 0x620c1883, 0x20c18830, 0x0c180386, 0x01883062,
-0x00000a88, 0x00000000, 0x00028002, 0x00100004, 0x01000040, 0x10008400,
-0x02004000, 0x00040011, 0x04400010, 0x04000100, 0x40001000, 0x00010008,
-0x00100004, 0x01000040, 0x00000000, 0x00000000, 0x2210a002, 0x21188846,
-0x11888460, 0x1880c622, 0x88846221, 0x88462201, 0x80622118, 0x46201180,
-0x62211888, 0x22118804, 0x211800c6, 0x01888462, 0x00000000, 0x00000000,
-0x2002a202, 0xa028800a, 0x028880a0, 0x28880a2a, 0x8880a220, 0x880a2202,
-0x80a22028, 0x0a228288, 0xa2a02888, 0x22028880, 0x0028080a, 0x028000a2,
-0x00000a88, 0x00000000, 0x04120002, 0x01081042, 0x10810420, 0x08004200,
-0x80042040, 0x004a0010, 0x04204108, 0x42041281, 0x20410810, 0x04108004,
-0x41081042, 0x00810420, 0x00000000, 0x00000000, 0x80508200, 0x05020140,
-0x50201408, 0x02014080, 0x20140805, 0x01400050, 0x14080502, 0x40805020,
-0x08050201, 0x80502014, 0x05020140, 0x00201408, 0x00000000, 0x00000000,
-0xc0b2a202, 0x0b2b02ca, 0xb2b02cac, 0x2b02cac0, 0xb02cac0b, 0x02c800b2,
-0x2cac0b2b, 0xcac0b290, 0xac0b2b02, 0xc0b2b02c, 0x0b2302ca, 0x02b02cac,
-0x00000a88, 0x00000000, 0x20120002, 0x0138804e, 0x138800e2, 0x38404e20,
-0x8804e200, 0x804e6013, 0x04e20138, 0x0e2013a0, 0xe2003880, 0x20138804,
-0x0132804e, 0x039804e2, 0x00000000, 0x00000000, 0x10c40000, 0x8c484312,
-0xc4863120, 0x48230208, 0x8231218c, 0x231208c0, 0x30218c48, 0x1218c086,
-0x210c4863, 0x18c48230, 0x0c486302, 0x00803121, 0x00000000, 0x00000000,
-0xfffc0000, 0xffcbfff2, 0xfcbfff2f, 0xcbfff2ff, 0xbfff2fff, 0xfff2fffc,
-0xff2fffcb, 0xf2fffcbf, 0x2fffcbff, 0xfffcbfff, 0xffcbfff2, 0x00bfff2f,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xdfb40000, 0xb3437ed0,
-0x3436cd2f, 0x4bedf2fb, 0xbecd0db3, 0xecd2fb34, 0xcd0db34b, 0xd0db7c36,
-0x0db3436c, 0xdb34bedf, 0xfb436df0, 0x0037ed0d, 0x00000000, 0x00000000,
-0x3fcc0000, 0xccc8ff32, 0xcc8f332f, 0xcbf3f2fc, 0xbf3323cc, 0xf332fccc,
-0x3323cccb, 0x323cfc8f, 0x23ccc8f3, 0x3cccbf3f, 0xfcc8f3f2, 0x008ff323,
-0x00000000, 0x00000000, 0x7edc0000, 0xedc9fb72, 0xdc9fb727, 0xc9fb727e,
-0x9fb727ed, 0xfb727ec4, 0xb127edc9, 0x727edc9f, 0x278dc9fb, 0x7edc9fb7,
-0xedc9fb72, 0x0087b727, 0x00000000, 0x00000000, 0x65000000, 0x10508c20,
-0x422ac04a, 0x00843021, 0x08504a14, 0x84202140, 0x50821010, 0x00214018,
-0x02100185, 0x61423850, 0x14508120, 0x00085002, 0x00000000, 0x00000000,
-0xa0024000, 0x00618818, 0x0108208e, 0x00800820, 0x08008220, 0x80482011,
-0x04420162, 0x58201228, 0x02012280, 0xa0100804, 0x05308848, 0x00080682,
-0x00000920, 0x00000000, 0xe3000000, 0x20128c24, 0x032ac04a, 0x908d1423,
-0x08c64a10, 0x8d342302, 0x42422011, 0x24230118, 0x4234518c, 0x21010842,
-0x30708c34, 0x00084042, 0x00000000, 0x00000000, 0xe0100800, 0x21128060,
-0x1f28040e, 0x90814420, 0x08040a01, 0x8140201c, 0x06c22150, 0x64201d18,
-0x4205c180, 0x601e3806, 0x01b08004, 0x00080642, 0x00000000, 0x00000000,
-0x01004000, 0x14202c40, 0x00200008, 0x40080401, 0x0040c400, 0x04080100,
-0x40001100, 0x40010100, 0x40110004, 0x01113044, 0x15000444, 0x01004400,
-0x00000900, 0x00000000, 0x40400010, 0x40032900, 0x423010c4, 0x02010000,
-0x00104804, 0x01048040, 0x10800400, 0x00804000, 0x80040001, 0x00430010,
-0x00000108, 0x00001000, 0x00000000, 0x00000000, 0x83100010, 0x19920d44,
-0x112014c8, 0x010c6403, 0x0005c421, 0x0c784318, 0x44401580, 0x40031100,
-0x4031800c, 0x01130046, 0x21d00c64, 0x41004640, 0x00000000, 0x00000000,
-0x80100000, 0x41830044, 0x18300480, 0x41004400, 0x0005c021, 0x00480014,
-0x06000140, 0x60401800, 0x40010000, 0x00183004, 0x21100060, 0x41000440,
-0x00000000, 0x00000000, 0x21102010, 0x1501854c, 0x50085442, 0xa0854021,
-0x08540615, 0x85402151, 0x54021511, 0x40615008, 0x4215d085, 0x61510854,
-0x25238540, 0x40085482, 0x00000080, 0x00000000, 0xa0100010, 0x2183a05c,
-0x1b2a048a, 0x92807420, 0x0806ca01, 0x80402015, 0x040201f2, 0x60a01008,
-0x82010080, 0xa0130805, 0x0130804c, 0x020805c2, 0x00000000, 0x00000000,
-0x62400010, 0x5043881c, 0x09184042, 0x118c2021, 0x2840c210, 0x84242103,
-0x41421011, 0x20610908, 0x42101084, 0x61090842, 0x00708424, 0x410842c2,
-0x00000000, 0x00000000, 0xe2040800, 0x00b28004, 0x0a180246, 0xb1800820,
-0x28034e00, 0x80042001, 0x03420030, 0x2ca00908, 0x8e003388, 0x200b0802,
-0x00938008, 0x433800ce, 0x00000020, 0x00000000, 0xa1000010, 0x5802a000,
-0x0918408e, 0x63841821, 0x08400e10, 0x84206108, 0x40821010, 0x00210e08,
-0x04108084, 0x210f0840, 0x10608418, 0x4008408e, 0x00000000, 0x00000000,
-0x80440000, 0x24e02100, 0x4430108e, 0x90810c00, 0x00104204, 0x01188042,
-0x10400490, 0x00004300, 0x0a042201, 0x00410010, 0x0410012c, 0x0000128a,
-0x00000000, 0x00000000, 0xc1400000, 0x10120410, 0x0132834a, 0x30801401,
-0x0040c210, 0x04044101, 0x40801010, 0x10010300, 0x46101008, 0x81030043,
-0x30700404, 0x00004246, 0x00000000, 0x00000000, 0x80030800, 0x00122010,
-0x0130018c, 0x10000800, 0x00024000, 0x00044009, 0x02000070, 0x20000300,
-0x42009100, 0x80030002, 0x00300008, 0x000002c8, 0x00000420, 0x00000000,
-0x0808000c, 0x04020002, 0x0b000800, 0x02080200, 0x00000104, 0x0801000b,
-0x00010000, 0x00040b00, 0x01000008, 0x000b0000, 0x00000800, 0x33000001,
-0x00000000, 0x00000000, 0x0308040c, 0x00000101, 0x09080808, 0x0001010b,
-0x08000800, 0x05010b09, 0x000a0000, 0x01030908, 0x0a000005, 0x03090800,
-0x00000503, 0x3108000a, 0x00000010, 0x00000000, 0xced7e000, 0xf8014f19,
-0x9a481a7f, 0x02000201, 0x00080194, 0x00030000, 0x0c000c03, 0x03000000,
-0x000c0300, 0x9800000c, 0x0c020000, 0x00000c00, 0x00000f80, 0x00000000,
-0x0da00000, 0x280303b1, 0x01402208, 0x00000100, 0x02000000, 0x00000000,
-0x08000800, 0x00000000, 0x00000100, 0x00000088, 0x00010000, 0x00000000,
-0x00000000, 0x00000000, 0x82280000, 0x11118713, 0x01414081, 0x44000000,
-0x00000100, 0x00000000, 0x00030044, 0x00000002, 0x01004400, 0x00000000,
-0x00440000, 0x00020002, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0xf4000000, 0x03ffffff, 0x00000000, 0xfffffffc, 0x00000001, 0xfbfffc00,
-0x000000ff, 0xfffc0000, 0x0000fffe, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0xf4000000, 0x03efffff, 0x00000000, 0xfef7fbfc,
-0x00000003, 0xfffffc00, 0x000001fe, 0xfffc0000, 0x0003fdff, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xf8000000, 0x03fbfffb,
-0x00000000, 0xfbfffffc, 0x00000003, 0xfffffc00, 0x000003f3, 0xf7fc0000,
-0x0003f3ff, 0x00000000, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0xfc000000, 0x03bfdfef, 0x00000000, 0xefe7fffc, 0x00000003, 0xf7fffc00,
-0x000003df, 0xfffc0000, 0x0003fcf7, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0xfc000000, 0x03ffffbf, 0x00000000, 0xfffdfffc,
-0x00000003, 0xfffffc00, 0x000003ff, 0xfffc0000, 0x00037fff, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xfc000000, 0x03ffffff,
-0x00000000, 0xfffffffc, 0x00000003, 0xfffffc00, 0x000003ff, 0xfffc0000,
-0x00037fff, 0x00000000, 0x00000000, 0x00000000, 0x62000000, 0x14308420,
-0x4138800e, 0x238c3021, 0x08104234, 0x8534e341, 0xd182b410, 0x10214408,
-0x0614808d, 0x20440850, 0x14530518, 0x00089002, 0x00000000, 0x00000000,
-0xe2000000, 0x00a28000, 0x0038000a, 0xb3805020, 0x18028200, 0x80542012,
-0x04420020, 0x40200208, 0x0a01a080, 0x22000802, 0x01708004, 0x00080202,
-0x00000000, 0x00000000, 0xa1100000, 0x11538464, 0x1928544e, 0x308d4421,
-0x28c44211, 0x84402319, 0x44823010, 0x00210108, 0x4631508c, 0x230008c0,
-0x10108400, 0x00080002, 0x00000000, 0x00000000, 0x60100000, 0x01a08164,
-0x1928144a, 0x33884422, 0x08044201, 0x8844e019, 0x06820140, 0x40201908,
-0x460110a0, 0x20180806, 0x01808040, 0x00080602, 0x00000000, 0x00000000,
-0x02000000, 0x10100428, 0x01008040, 0x500c0401, 0x00c04030, 0x04000310,
-0x80003041, 0x50010100, 0x0811010c, 0x41112044, 0x11100454, 0x00004400,
-0x00000000, 0x00000000, 0x82400010, 0x04230104, 0x4210904c, 0x01010840,
-0x00108004, 0x01048040, 0x90000402, 0x00004200, 0x00040201, 0x80421010,
-0x04000108, 0x40001000, 0x00000000, 0x00000000, 0x41500010, 0x2112014c,
-0x11209444, 0x920d7481, 0x20c74011, 0x06704318, 0x47003181, 0x70011900,
-0x4821800c, 0x431122c7, 0x11900474, 0x4100c700, 0x00000000, 0x00000000,
-0x00100010, 0x21830044, 0x1020844c, 0x12085002, 0x20040001, 0x08580010,
-0x04000180, 0x50001000, 0x40210000, 0x00102004, 0x01000054, 0x41000400,
-0x00000000, 0x00000000, 0x20100010, 0x11028448, 0x5608440a, 0x028c4c21,
-0x08d44631, 0x8444e153, 0x55023520, 0x44235238, 0x0e55d084, 0x21580855,
-0x15e38d48, 0x41085502, 0x00000000, 0x00000000, 0x62100010, 0x05018174,
-0x1d28144e, 0x72816c00, 0x0804ca21, 0x80642017, 0x04420112, 0x6c201708,
-0x4201a081, 0x20180884, 0x01a08064, 0x42080602, 0x00000000, 0x00000000,
-0xa1000010, 0x24828510, 0x0118508a, 0x500d0c23, 0x0ac24230, 0x8d082307,
-0xc0021071, 0x0c230b08, 0xc030108d, 0x21080a40, 0x10100000, 0x41084002,
-0x00000000, 0x00000000, 0xe0480810, 0x20b3812c, 0x0b08128e, 0xa08808c0,
-0x38008600, 0x8104e00a, 0x00820010, 0x10e00038, 0xc2003380, 0xe0033800,
-0x0000a014, 0x423800ce, 0x00000020, 0x00000000, 0x22000010, 0x14028024,
-0x04380006, 0x118d1c21, 0x08c00630, 0x84002102, 0x42023072, 0x00230508,
-0x02108185, 0x61040842, 0x10008c10, 0x40084242, 0x00000000, 0x00000000,
-0xc2400000, 0x00210000, 0x4a20008c, 0x73802c00, 0x12120820, 0x81300041,
-0x10000402, 0x1000c900, 0x000c0200, 0x80481080, 0x04020104, 0x00001180,
-0x00000000, 0x00000000, 0x81440000, 0x14520424, 0x0920434c, 0x508c0c03,
-0x20c04430, 0x8c040305, 0xc24010c0, 0x00030300, 0x4030000c, 0x01012042,
-0x10410c00, 0x00004240, 0x00000000, 0x00000000, 0x40050800, 0x04900114,
-0x01200244, 0x13890800, 0x00014004, 0x00040007, 0x01400032, 0x00000300,
-0x40008000, 0x40010011, 0x00810008, 0x00000000, 0x00000420, 0x00000000,
-0x08080000, 0x00000802, 0x0b000401, 0x00000000, 0x00000000, 0x0800000b,
-0x00010000, 0x00000b00, 0x01000008, 0x000b0000, 0x00000800, 0x03000001,
-0x00000000, 0x00000000, 0x03083c3c, 0x00000501, 0x0908080a, 0x00050303,
-0x08000a00, 0x05030309, 0x000a0000, 0x010f0908, 0x0a000005, 0x0b090800,
-0x00000503, 0xf108000a, 0x000000f0, 0x00000000, 0x7b1c0000, 0xdc00fb8d,
-0x01f35c9c, 0x03980300, 0x01900000, 0x00030000, 0x0c000403, 0x03000000,
-0x00000300, 0x00000000, 0x0c030001, 0x00000c00, 0x00000000, 0x00000000,
-0x82e80000, 0x5002a165, 0x0030cc35, 0x01000000, 0x00800008, 0x00010000,
-0x08000001, 0x01000000, 0x02080100, 0x00000008, 0x08010001, 0x00008800,
-0x00000000, 0x00000000, 0x24180000, 0x15101b22, 0x01142921, 0x44000000,
-0x00000100, 0x00000000, 0x00010044, 0x00000001, 0x00004400, 0x00000200,
-0x00440000, 0x00000001, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0x78000000, 0x03ef7be7, 0x00000000, 0x7ffffff8, 0x00000003, 0x677e7c00,
-0x0000026f, 0x6bfc0000, 0x0002fff5, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0x78000000, 0x03eb7fef, 0x00000000, 0xe7e66e7c,
-0x00000003, 0x777ffc00, 0x000003fd, 0x5cfc0000, 0x0003fefe, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xf8000000, 0x03fbfbf7,
-0x00000000, 0xf3f1f9f4, 0x00000003, 0xfdf3f800, 0x000003f2, 0xfdf80000,
-0x0003fefd, 0x00000000, 0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff,
-0xfc000000, 0x035fffff, 0x00000000, 0xfffffffc, 0x00000003, 0xfffffc00,
-0x000003ff, 0xfffc0000, 0x0000fff7, 0x00000000, 0x00000000, 0x00000000,
-0xfffc0000, 0x0003ffff, 0x9c000000, 0x03bfffdf, 0x00000000, 0xfffffffc,
-0x00000001, 0xffbffc00, 0x000003ff, 0xfffc0000, 0x0003ffff, 0x00000000,
-0x00000000, 0x00000000, 0xfffc0000, 0x0003ffff, 0xfc000000, 0x03bfffff,
-0x00000000, 0xffffbffc, 0x00000003, 0xfffffc00, 0x000003ff, 0xfffc0000,
-0x0003ffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x8004000c, 0x00000040, 0x71c2000c, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x8004000c, 0x00004040, 0x01c2000c, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x8000000c, 0x18c80000, 0x8001000c, 0xc0000000, 0x7002000c, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-0x00000000, 0x8001000c, 0xa0000000, 0x8005000c, 0x00000000, 0x8000000c,
-0xe9d60000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
-};
diff -Nru a/sound/pci/rme9652/rme9652.c b/sound/pci/rme9652/rme9652.c
--- a/sound/pci/rme9652/rme9652.c	Sat Apr 19 19:51:47 2003
+++ b/sound/pci/rme9652/rme9652.c	Sat Apr 19 19:51:47 2003
@@ -2403,7 +2403,7 @@
 			     SNDRV_PCM_HW_PARAM_CHANNELS, -1);
 
 	rme9652->creg_spdif_stream = rme9652->creg_spdif;
-	rme9652->spdif_ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	rme9652->spdif_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(rme9652->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &rme9652->spdif_ctl->id);
 	return 0;
@@ -2421,7 +2421,7 @@
 
 	spin_unlock_irqrestore(&rme9652->lock, flags);
 
-	rme9652->spdif_ctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	rme9652->spdif_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(rme9652->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &rme9652->spdif_ctl->id);
 	return 0;
diff -Nru a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c
--- a/sound/pci/trident/trident_main.c	Sat Apr 19 19:51:49 2003
+++ b/sound/pci/trident/trident_main.c	Sat Apr 19 19:51:49 2003
@@ -1881,7 +1881,7 @@
 		runtime->hw = snd_trident_spdif_7018;
 	}
 
-	trident->spdif_pcm_ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	trident->spdif_pcm_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(trident->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &trident->spdif_pcm_ctl->id);
 
@@ -1920,7 +1920,7 @@
 		outl(temp, TRID_REG(trident, SI_SERIAL_INTF_CTRL));
 	}
 	spin_unlock_irq(&trident->reg_lock);
-	trident->spdif_pcm_ctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	trident->spdif_pcm_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(trident->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &trident->spdif_pcm_ctl->id);
 	return 0;
@@ -2677,7 +2677,7 @@
 					   snd_ctl_elem_value_t * ucontrol)
 {
 	trident_t *trident = snd_kcontrol_chip(kcontrol);
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 
 	if (trident->device == TRIDENT_DEVICE_ID_SI7018) {
 		ucontrol->value.integer.value[0] = 1023 - mix->vol;
@@ -2692,7 +2692,7 @@
 {
 	unsigned long flags;
 	trident_t *trident = snd_kcontrol_chip(kcontrol);
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 	unsigned int val;
 	int change = 0;
 
@@ -2715,6 +2715,7 @@
 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
 	.name =         "PCM Front Playback Volume",
 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
+	.count =	32,
 	.info =		snd_trident_pcm_vol_control_info,
 	.get =		snd_trident_pcm_vol_control_get,
 	.put =		snd_trident_pcm_vol_control_put,
@@ -2738,7 +2739,8 @@
 static int snd_trident_pcm_pan_control_get(snd_kcontrol_t * kcontrol,
 					   snd_ctl_elem_value_t * ucontrol)
 {
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	trident_t *trident = snd_kcontrol_chip(kcontrol);
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 
 	ucontrol->value.integer.value[0] = mix->pan;
 	if (ucontrol->value.integer.value[0] & 0x40) {
@@ -2754,7 +2756,7 @@
 {
 	unsigned long flags;
 	trident_t *trident = snd_kcontrol_chip(kcontrol);
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 	unsigned char val;
 	int change = 0;
 
@@ -2776,6 +2778,7 @@
 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
 	.name =         "PCM Pan Playback Control",
 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
+	.count =	32,
 	.info =		snd_trident_pcm_pan_control_info,
 	.get =		snd_trident_pcm_pan_control_get,
 	.put =		snd_trident_pcm_pan_control_put,
@@ -2799,7 +2802,8 @@
 static int snd_trident_pcm_rvol_control_get(snd_kcontrol_t * kcontrol,
 					    snd_ctl_elem_value_t * ucontrol)
 {
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	trident_t *trident = snd_kcontrol_chip(kcontrol);
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 
 	ucontrol->value.integer.value[0] = 127 - mix->rvol;
 	return 0;
@@ -2810,7 +2814,7 @@
 {
 	unsigned long flags;
 	trident_t *trident = snd_kcontrol_chip(kcontrol);
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 	unsigned short val;
 	int change = 0;
 
@@ -2829,6 +2833,7 @@
 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
 	.name =         "PCM Reverb Playback Volume",
 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
+	.count = 	32,
 	.info =		snd_trident_pcm_rvol_control_info,
 	.get =		snd_trident_pcm_rvol_control_get,
 	.put =		snd_trident_pcm_rvol_control_put,
@@ -2852,7 +2857,8 @@
 static int snd_trident_pcm_cvol_control_get(snd_kcontrol_t * kcontrol,
 					    snd_ctl_elem_value_t * ucontrol)
 {
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	trident_t *trident = snd_kcontrol_chip(kcontrol);
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 
 	ucontrol->value.integer.value[0] = 127 - mix->cvol;
 	return 0;
@@ -2863,7 +2869,7 @@
 {
 	unsigned long flags;
 	trident_t *trident = snd_kcontrol_chip(kcontrol);
-	snd_trident_pcm_mixer_t *mix = (snd_trident_pcm_mixer_t *)kcontrol->private_value;
+	snd_trident_pcm_mixer_t *mix = &trident->pcm_mixer[snd_ctl_get_ioffnum(kcontrol, &ucontrol->id)];
 	unsigned short val;
 	int change = 0;
 
@@ -2882,28 +2888,32 @@
 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
 	.name =         "PCM Chorus Playback Volume",
 	.access =	SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_INACTIVE,
+	.count =	32,
 	.info =		snd_trident_pcm_cvol_control_info,
 	.get =		snd_trident_pcm_cvol_control_get,
 	.put =		snd_trident_pcm_cvol_control_put,
 };
 
-static void snd_trident_notify_pcm_change1(snd_card_t * card, snd_kcontrol_t *kctl, int activate)
+static void snd_trident_notify_pcm_change1(snd_card_t * card, snd_kcontrol_t *kctl, int num, int activate)
 {
+	snd_ctl_elem_id_t id;
+
 	snd_runtime_check(kctl != NULL, return);
 	if (activate)
-		kctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+		kctl->vd[num].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	else
-		kctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+		kctl->vd[num].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE |
-		       SNDRV_CTL_EVENT_MASK_INFO, &kctl->id);
+		       SNDRV_CTL_EVENT_MASK_INFO,
+		       snd_ctl_build_ioff(&id, kctl, num));
 }
 
-static void snd_trident_notify_pcm_change(snd_card_t * card, snd_trident_pcm_mixer_t * tmix, int activate)
+static void snd_trident_notify_pcm_change(trident_t *trident, snd_trident_pcm_mixer_t *tmix, int num, int activate)
 {
-	snd_trident_notify_pcm_change1(card, tmix->ctl_vol, activate);
-	snd_trident_notify_pcm_change1(card, tmix->ctl_pan, activate);
-	snd_trident_notify_pcm_change1(card, tmix->ctl_rvol, activate);
-	snd_trident_notify_pcm_change1(card, tmix->ctl_cvol, activate);
+	snd_trident_notify_pcm_change1(trident->card, trident->ctl_vol, num, activate);
+	snd_trident_notify_pcm_change1(trident->card, trident->ctl_pan, num, activate);
+	snd_trident_notify_pcm_change1(trident->card, trident->ctl_rvol, num, activate);
+	snd_trident_notify_pcm_change1(trident->card, trident->ctl_cvol, num, activate);
 }
 
 static int snd_trident_pcm_mixer_build(trident_t *trident, snd_trident_voice_t *voice, snd_pcm_substream_t *substream)
@@ -2917,7 +2927,7 @@
 	tmix->pan = T4D_DEFAULT_PCM_PAN;
 	tmix->rvol = T4D_DEFAULT_PCM_RVOL;
 	tmix->cvol = T4D_DEFAULT_PCM_CVOL;
-	snd_trident_notify_pcm_change(trident->card, tmix, 1);
+	snd_trident_notify_pcm_change(trident, tmix, substream->number, 1);
 	return 0;
 }
 
@@ -2928,7 +2938,7 @@
 	snd_assert(trident != NULL && substream != NULL, return -EINVAL);
 	tmix = &trident->pcm_mixer[substream->number];
 	tmix->voice = NULL;
-	snd_trident_notify_pcm_change(trident->card, tmix, 0);
+	snd_trident_notify_pcm_change(trident, tmix, substream->number, 0);
 	return 0;
 }
 
@@ -3007,34 +3017,26 @@
 		
 		tmix = &trident->pcm_mixer[idx];
 		tmix->voice = NULL;
-		if ((kctl = tmix->ctl_vol = snd_ctl_new1(&snd_trident_pcm_vol_control, trident)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = (long)tmix;
-		kctl->id.index = idx;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
+	}
+	if ((trident->ctl_vol = snd_ctl_new1(&snd_trident_pcm_vol_control, trident)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, trident->ctl_vol)))
+		return err;
 		
-		if ((kctl = tmix->ctl_pan = snd_ctl_new1(&snd_trident_pcm_pan_control, trident)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = (long)tmix;
-		kctl->id.index = idx;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
+	if ((trident->ctl_pan = snd_ctl_new1(&snd_trident_pcm_pan_control, trident)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, trident->ctl_pan)))
+		return err;
 
-		if ((kctl = tmix->ctl_rvol = snd_ctl_new1(&snd_trident_pcm_rvol_control, trident)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = (long)tmix;
-		kctl->id.index = idx;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
+	if ((trident->ctl_rvol = snd_ctl_new1(&snd_trident_pcm_rvol_control, trident)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, trident->ctl_rvol)))
+		return err;
 
-		if ((kctl = tmix->ctl_cvol = snd_ctl_new1(&snd_trident_pcm_cvol_control, trident)) == NULL)
-			return -ENOMEM;
-		kctl->private_value = (long)tmix;
-		kctl->id.index = idx;
-		if ((err = snd_ctl_add(card, kctl)))
-			return err;
-	}
+	if ((trident->ctl_cvol = snd_ctl_new1(&snd_trident_pcm_cvol_control, trident)) == NULL)
+		return -ENOMEM;
+	if ((err = snd_ctl_add(card, trident->ctl_cvol)))
+		return err;
 
 	if (trident->device == TRIDENT_DEVICE_ID_NX) {
 		if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_trident_ac97_rear_control, trident))) < 0)
@@ -3187,7 +3189,7 @@
 
 static int snd_trident_sis_reset(trident_t *trident)
 {
-	signed long end_time;
+	unsigned long end_time;
 	unsigned int i;
 	int r;
 
@@ -3364,7 +3366,7 @@
 static int snd_trident_4d_dx_init(trident_t *trident)
 {
 	struct pci_dev *pci = trident->pci;
-	signed long end_time;
+	unsigned long end_time;
 
 	/* reset the legacy configuration and whole audio/wavetable block */
 	pci_write_config_dword(pci, 0x40, 0);	/* DDMA */
@@ -3404,7 +3406,7 @@
 static int snd_trident_4d_nx_init(trident_t *trident)
 {
 	struct pci_dev *pci = trident->pci;
-	signed long end_time;
+	unsigned long end_time;
 
 	/* reset the legacy configuration and whole audio/wavetable block */
 	pci_write_config_dword(pci, 0x40, 0);	/* DDMA */
diff -Nru a/sound/pci/via82xx.c b/sound/pci/via82xx.c
--- a/sound/pci/via82xx.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/via82xx.c	Sat Apr 19 19:51:50 2003
@@ -208,13 +208,11 @@
 #define   VIA8233_REG_SGD_STAT_EOL	(1<<1)
 #define   VIA8233_REG_SGD_STAT_STOP	(1<<2)
 #define   VIA8233_REG_SGD_STAT_ACTIVE	(1<<3)
-#define   VIA8233_REG_SGD_SDX0_SHIFT	0
-#define   VIA8233_REG_SGD_SDX1_SHIFT	4
-#define   VIA8233_REG_SGD_SDX2_SHIFT	8
-#define   VIA8233_REG_SGD_SDX3_SHIFT	12
-#define   VIA8233_REG_SGD_MCHAN_SHIFT	16
-#define   VIA8233_REG_SGD_REC0_SHIFT	24
-#define   VIA8233_REG_SGD_REC1_SHIFT	28
+#define VIA8233_INTR_MASK(chan) ((VIA8233_REG_SGD_STAT_FLAG|VIA8233_REG_SGD_STAT_EOL) << ((chan) * 4))
+#define   VIA8233_REG_SGD_CHAN_SDX	0
+#define   VIA8233_REG_SGD_CHAN_MULTI	4
+#define   VIA8233_REG_SGD_CHAN_REC	6
+#define   VIA8233_REG_SGD_CHAN_REC1	7
 
 #define VIA_REG_GPI_STATUS		0x88
 #define VIA_REG_GPI_INTR		0x8c
@@ -230,7 +228,7 @@
 #define   VIA_REG_MULTPLAY_FMT_8BIT	0x00
 #define   VIA_REG_MULTPLAY_FMT_16BIT	0x80
 #define   VIA_REG_MULTPLAY_FMT_CH_MASK	0x70	/* # channels << 4 (valid = 1,2,4,6) */
-#define VIA_REG_OFS_CAPTURE_FIFO	0x62	/* byte - bit 6 = fifo  enable */
+#define VIA_REG_OFS_CAPTURE_FIFO	0x02	/* byte - bit 6 = fifo  enable */
 #define   VIA_REG_CAPTURE_FIFO_ENABLE	0x40
 
 #define VIA_REG_CAPTURE_CHANNEL		0x63	/* byte - input select */
@@ -419,13 +417,14 @@
 
 	unsigned long port;
 	struct resource *res_port;
+	struct resource *mpu_res;
 	int chip_type;
 	unsigned char revision;
 
 	unsigned char old_legacy;
 	unsigned char old_legacy_cfg;
 
-	unsigned char playback_volume[2]; /* for VIA8233/C/8235; default = 0 */
+	unsigned char playback_volume[4][2]; /* for VIA8233/C/8235; default = 0 */
 
 	unsigned int intr_mask; /* SGD_SHADOW mask to check interrupts */
 
@@ -582,6 +581,11 @@
 	unsigned int i;
 
 	spin_lock(&chip->reg_lock);
+#if 0
+	/* FIXME: does it work on via823x? */
+	if (chip->chip_type != TYPE_VIA686)
+		goto _skip_sgd;
+#endif
 	status = inl(VIAREG(chip, SGD_SHADOW));
 	if (! (status & chip->intr_mask)) {
 		spin_unlock(&chip->reg_lock);
@@ -590,20 +594,21 @@
 			snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs);
 		return;
 	}
+// _skip_sgd:
 
 	/* check status for each stream */
 	for (i = 0; i < chip->num_devs; i++) {
 		viadev_t *viadev = &chip->devs[i];
-		unsigned char status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
-		status &= (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG);
-		if (! status)
+		unsigned char c_status = inb(VIADEV_REG(viadev, OFFSET_STATUS));
+		c_status &= (VIA_REG_STAT_EOL|VIA_REG_STAT_FLAG|VIA_REG_STAT_STOPPED);
+		if (! c_status)
 			continue;
 		if (viadev->substream && viadev->running) {
 			spin_unlock(&chip->reg_lock);
 			snd_pcm_period_elapsed(viadev->substream);
 			spin_lock(&chip->reg_lock);
 		}
-		outb(status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
+		outb(c_status, VIADEV_REG(viadev, OFFSET_STATUS)); /* ack */
 	}
 	spin_unlock(&chip->reg_lock);
 }
@@ -843,12 +848,11 @@
 	int changed = 0;
 
 	spin_lock(&rec->lock);
-	if (rec->rate) {
-		if (rec->rate != rate && rec->used > 1) {
+	if (rec->rate != rate) {
+		if (rec->rate && rec->used > 1) { /* already set */
 			spin_unlock(&rec->lock);
 			return -EINVAL;
 		}
-	} else {
 		rec->rate = rate;
 		changed = 1;
 	}
@@ -873,12 +877,15 @@
 		snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate);
 		snd_ac97_set_rate(chip->ac97, AC97_SPDIF, runtime->rate);
 	}
-	rbits = (0xfffff / 48000) * runtime->rate + ((0xfffff % 48000) * runtime->rate) / 48000;
+	if (chip->chip_type == TYPE_VIA8233A)
+		rbits = 0;
+	else
+		rbits = (0xfffff / 48000) * runtime->rate + ((0xfffff % 48000) * runtime->rate) / 48000;
 	snd_assert((rbits & ~0xfffff) == 0, return -EINVAL);
 	snd_via82xx_channel_reset(chip, viadev);
 	snd_via82xx_set_table_ptr(chip, viadev);
-	outb(chip->playback_volume[0], VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_L));
-	outb(chip->playback_volume[1], VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_R));
+	outb(chip->playback_volume[viadev->reg_offset / 0x10][0], VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_L));
+	outb(chip->playback_volume[viadev->reg_offset / 0x10][1], VIADEV_REG(viadev, OFS_PLAYBACK_VOLUME_R));
 	outl((runtime->format == SNDRV_PCM_FORMAT_S16_LE ? VIA8233_REG_TYPE_16BIT : 0) | /* format */
 	     (runtime->channels > 1 ? VIA8233_REG_TYPE_STEREO : 0) | /* stereo */
 	     rbits | /* rate */
@@ -912,16 +919,20 @@
 	fmt = (runtime->format == SNDRV_PCM_FORMAT_S16_LE) ? VIA_REG_MULTPLAY_FMT_16BIT : VIA_REG_MULTPLAY_FMT_8BIT;
 	fmt |= runtime->channels << 4;
 	outb(fmt, VIADEV_REG(viadev, OFS_MULTPLAY_FORMAT));
-	/* set sample number to slot 3, 4, 7, 8, 6, 9 (for VIA8233/C,8235) */
-	/* corresponding to FL, FR, RL, RR, C, LFE ?? */
-	switch (runtime->channels) {
-	case 1: slots = (1<<0) | (1<<4); break;
-	case 2: slots = (1<<0) | (2<<4); break;
-	case 3: slots = (1<<0) | (2<<4) | (5<<8); break;
-	case 4: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12); break;
-	case 5: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16); break;
-	case 6: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16) | (6<<20); break;
-	default: slots = 0; break;
+	if (chip->chip_type == TYPE_VIA8233A)
+		slots = 0;
+	else {
+		/* set sample number to slot 3, 4, 7, 8, 6, 9 (for VIA8233/C,8235) */
+		/* corresponding to FL, FR, RL, RR, C, LFE ?? */
+		switch (runtime->channels) {
+		case 1: slots = (1<<0) | (1<<4); break;
+		case 2: slots = (1<<0) | (2<<4); break;
+		case 3: slots = (1<<0) | (2<<4) | (5<<8); break;
+		case 4: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12); break;
+		case 5: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16); break;
+		case 6: slots = (1<<0) | (2<<4) | (3<<8) | (4<<12) | (5<<16) | (6<<20); break;
+		default: slots = 0; break;
+		}
 	}
 	/* STOP index is never reached */
 	outl(0xff000000 | slots, VIADEV_REG(viadev, OFFSET_STOP_IDX));
@@ -1398,31 +1409,39 @@
 static int snd_via8233_dxs_volume_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
 {
 	via82xx_t *chip = snd_kcontrol_chip(kcontrol);
-	ucontrol->value.integer.value[0] = 0xff - chip->playback_volume[0];
-	ucontrol->value.integer.value[1] = 0xff - chip->playback_volume[1];
+	unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
+	ucontrol->value.integer.value[0] = 0xff - chip->playback_volume[idx][0];
+	ucontrol->value.integer.value[1] = 0xff - chip->playback_volume[idx][1];
 	return 0;
 }
 
 static int snd_via8233_dxs_volume_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
 {
 	via82xx_t *chip = snd_kcontrol_chip(kcontrol);
+	unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id);
+	unsigned long port = chip->port + 0x10 * idx;
 	unsigned char val;
 	int change;
 
 	val = 0xff - ucontrol->value.integer.value[0];
-	change = val != chip->playback_volume[0];
-	if (val)
-		chip->playback_volume[0] = val;
+	change = val != chip->playback_volume[idx][0];
+	if (change) {
+		chip->playback_volume[idx][0] = val;
+		outb(val, port + VIA_REG_OFS_PLAYBACK_VOLUME_L);
+	}
 	val = 0xff - ucontrol->value.integer.value[1];
-	change |= val != chip->playback_volume[1];
-	if (val)
-		chip->playback_volume[1] = val;
+	change |= val != chip->playback_volume[idx][1];
+	if (change) {
+		chip->playback_volume[idx][1] = val;
+		outb(val, port + VIA_REG_OFS_PLAYBACK_VOLUME_R);
+	}
 	return change;
 }
 
 static snd_kcontrol_new_t snd_via8233_dxs_volume_control __devinitdata = {
 	.name = "VIA DXS Playback Volume",
 	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+	.count = 4,
 	.info = snd_via8233_dxs_volume_info,
 	.get = snd_via8233_dxs_volume_get,
 	.put = snd_via8233_dxs_volume_put,
@@ -1454,10 +1473,11 @@
 	ac97.private_data = chip;
 	ac97.private_free = snd_via82xx_mixer_free_ac97;
 	ac97.clock = chip->ac97_clock;
+	ac97.pci = chip->pci;
 	if ((err = snd_ac97_mixer(chip->card, &ac97, &chip->ac97)) < 0)
 		return err;
 
-	snd_ac97_tune_hardware(chip->ac97, chip->pci, ac97_quirks);
+	snd_ac97_tune_hardware(chip->ac97, ac97_quirks);
 
 	if (chip->chip_type != TYPE_VIA686) {
 		/* use slot 10/11 */
@@ -1533,9 +1553,11 @@
 	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs3_spdif_control, chip));
 	if (err < 0)
 		return err;
-	err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
-	if (err < 0)
-		return err;
+	if (chip->chip_type != TYPE_VIA8233A) {
+		err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip));
+		if (err < 0)
+			return err;
+	}
 
 	/* select spdif data slot 10/11 */
 	pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val);
@@ -1556,25 +1578,20 @@
 	legacy &= ~VIA_FUNC_ENABLE_GAME;	/* disable joystick */
 	if (chip->revision >= VIA_REV_686_H) {
 		rev_h = 1;
-		if (check_region(pci_resource_start(chip->pci, 2), 4))
-			legacy &= ~VIA_FUNC_MIDI_PNP;	/* disable PCI I/O 2 */
-		else
-			legacy |= VIA_FUNC_MIDI_PNP;	/* enable PCI I/O 2 */
-	}
-	pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, legacy);
-	pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, legacy_cfg);
-	if (rev_h) {
 		if (mpu_port[dev] >= 0x200) {	/* force MIDI */
-			pci_write_config_dword(chip->pci, 0x18, (mpu_port[dev] & 0xfffc) | 0x01);
-		} else if (legacy & VIA_FUNC_MIDI_PNP) {
+			mpu_port[dev] &= 0xfffc;
+			pci_write_config_dword(chip->pci, 0x18, mpu_port[dev] | 0x01);
+		} else {
 			mpu_port[dev] = pci_resource_start(chip->pci, 2);
-			if (mpu_port[dev] < 0x200)	/* bad value */
-				legacy &= ~VIA_FUNC_ENABLE_MIDI;	/* disable MIDI */
 		}
-		if (mpu_port[dev] >= 0x200)
+		if (mpu_port[dev] >= 0x200 &&
+		    (chip->mpu_res = request_region(pci_resource_start(chip->pci, 2), 2,
+						    "VIA82xx MPU401")) != NULL) {
 			legacy |= VIA_FUNC_ENABLE_MIDI;
-		else
+		} else {
+			mpu_port[dev] = -1;
 			legacy &= ~VIA_FUNC_ENABLE_MIDI;
+		}
 	} else {
 		switch (mpu_port[dev]) {	/* force MIDI */
 		case 0x300:
@@ -1583,7 +1600,6 @@
 		case 0x330:
 			legacy_cfg &= ~(3 << 2);
 			legacy_cfg |= (mpu_port[dev] & 0x0030) >> 2;
-			legacy |= VIA_FUNC_ENABLE_MIDI;
 			break;
 		default:			/* no, use BIOS settings */
 			if (legacy & VIA_FUNC_ENABLE_MIDI)
@@ -1591,22 +1607,28 @@
 			break;
 		}
 	}
-	if (legacy & VIA_FUNC_ENABLE_MIDI) {
-		if (check_region(mpu_port[dev], 2)) {
-			printk(KERN_WARNING "unable to get MPU-401 port at 0x%lx, skipping\n", mpu_port[dev]);
-			legacy &= ~VIA_FUNC_ENABLE_MIDI;
-		} else if (snd_mpu401_uart_new(chip->card, 0, MPU401_HW_VIA686A,
-					       mpu_port[dev], 0,
-					       chip->irq, 0,
-					       &chip->rmidi) < 0) {
-			printk(KERN_WARNING "unable to initialize MPU-401 at 0x%lx, skipping\n", mpu_port[dev]);
-			legacy &= ~VIA_FUNC_ENABLE_MIDI;
-		}
+	if (mpu_port[dev] >= 0x200 &&
+	    (chip->mpu_res = request_region(mpu_port[dev], 2, "VIA82xx MPU401")) != NULL) {
+		if (rev_h)
+			legacy |= VIA_FUNC_MIDI_PNP;	/* enable PCI I/O 2 */
+		legacy |= VIA_FUNC_ENABLE_MIDI;
+	} else {
+		if (rev_h)
+			legacy &= ~VIA_FUNC_MIDI_PNP;	/* disable PCI I/O 2 */
+		legacy &= ~VIA_FUNC_ENABLE_MIDI;
+		mpu_port[dev] = -1;
 	}
 	pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, legacy);
 	pci_write_config_byte(chip->pci, VIA_PNP_CONTROL, legacy_cfg);
-	if (legacy & VIA_FUNC_ENABLE_MIDI) {
-		legacy &= ~VIA_FUNC_MIDI_IRQMASK;	/* enable MIDI interrupt */
+	if (chip->mpu_res) {
+		if (snd_mpu401_uart_new(chip->card, 0, MPU401_HW_VIA686A,
+					mpu_port[dev], 1,
+					chip->irq, 0, &chip->rmidi) < 0) {
+			printk(KERN_WARNING "unable to initialize MPU-401 at 0x%lx, skipping\n", mpu_port[dev]);
+			legacy &= ~VIA_FUNC_ENABLE_MIDI;
+		} else {
+			legacy &= ~VIA_FUNC_MIDI_IRQMASK;	/* enable MIDI interrupt */
+		}
 		pci_write_config_byte(chip->pci, VIA_FUNC_ENABLE, legacy);
 	}
 	
@@ -1727,6 +1749,10 @@
 		snd_via82xx_channel_reset(chip, &chip->devs[i]);
 	synchronize_irq(chip->irq);
       __end_hw:
+	if (chip->mpu_res) {
+		release_resource(chip->mpu_res);
+		kfree_nocheck(chip->mpu_res);
+	}
 	if (chip->res_port) {
 		release_resource(chip->res_port);
 		kfree_nocheck(chip->res_port);
diff -Nru a/sound/pci/ymfpci/ymfpci.c b/sound/pci/ymfpci/ymfpci.c
--- a/sound/pci/ymfpci/ymfpci.c	Sat Apr 19 19:51:46 2003
+++ b/sound/pci/ymfpci/ymfpci.c	Sat Apr 19 19:51:46 2003
@@ -112,25 +112,30 @@
 	}
 
 	legacy_ctrl = 0;
-	legacy_ctrl2 = 0x0800;	/* SMOD = 01 */
+	legacy_ctrl2 = 0x0800;	/* SBEN = 0, SMOD = 01, LAD = 0 */
 
 	if (pci_id->device >= 0x0010) { /* YMF 744/754 */
-		if (fm_port[dev] < 0)
-			fm_port[dev] = pci_resource_start(pci, 1);
-		else if (check_region(fm_port[dev], 4))
-			fm_port[dev] = -1;
-		if (fm_port[dev] >= 0) {
-			legacy_ctrl |= 2;
+		if (fm_port[dev] < 0) {
+			// fm_port[dev] = pci_resource_start(pci, 1);
+			u16 addr;
+			pci_read_config_word(pci, PCIR_DSXG_FMBASE, &addr);
+			fm_port[dev] = addr;
+		}
+		if (fm_port[dev] >= 0 &&
+		    (chip->fm_res = request_region(fm_port[dev], 4, "YMFPCI OPL3")) != NULL) {
+			legacy_ctrl |= YMFPCI_LEGACY_FMEN;
 			pci_write_config_word(pci, PCIR_DSXG_FMBASE, fm_port[dev]);
 		}
-		if (mpu_port[dev] < 0)
-			mpu_port[dev] = pci_resource_start(pci, 1) + 0x20;
-		else if (check_region(mpu_port[dev], 2))
-			mpu_port[dev] = -1;
-		if (mpu_port[dev] >= 0) {
-			legacy_ctrl |= 8;
+		if (mpu_port[dev] < 0) {
+			// mpu_port[dev] = pci_resource_start(pci, 1) + 0x20;
+			u16 addr;
+			pci_read_config_word(pci, PCIR_DSXG_MPU401BASE, &addr);
+			mpu_port[dev] = addr;
+		}
+		if (mpu_port[dev] >= 0 &&
+		    (chip->mpu_res = request_region(mpu_port[dev], 2, "YMFPCI MPU401")) != NULL) {
+			legacy_ctrl |= YMFPCI_LEGACY_MEN;
 			pci_write_config_word(pci, PCIR_DSXG_MPU401BASE, mpu_port[dev]);
-			//snd_printd("MPU401 supported on 0x%lx\n", mpu_port[dev]);
 		}
 	} else {
 		switch (fm_port[dev]) {
@@ -140,10 +145,11 @@
 		case 0x3a8: legacy_ctrl2 |= 3; break;
 		default: fm_port[dev] = -1; break;
 		}
-		if (fm_port[dev] > 0 && check_region(fm_port[dev], 4) == 0)
-			legacy_ctrl |= 2;
-		else {
-			legacy_ctrl2 &= ~3;
+		if (fm_port[dev] > 0 &&
+		    (chip->fm_res = request_region(fm_port[dev], 4, "YMFPCI OPL3")) != NULL) {
+			legacy_ctrl |= YMFPCI_LEGACY_FMEN;
+		} else {
+			legacy_ctrl2 &= ~YMFPCI_LEGACY2_FMIO;
 			fm_port[dev] = -1;
 		}
 		switch (mpu_port[dev]) {
@@ -153,23 +159,20 @@
 		case 0x334: legacy_ctrl2 |= 3 << 4; break;
 		default: mpu_port[dev] = -1; break;
 		}
-		if (mpu_port[dev] > 0 && check_region(mpu_port[dev], 2) == 0) {
-			//snd_printd("MPU401 supported on 0x%lx\n", mpu_port[dev]);
-			legacy_ctrl |= 8;
+		if (mpu_port[dev] > 0 &&
+		    (chip->mpu_res = request_region(mpu_port[dev], 2, "YMFPCI MPU401")) != NULL) {
+			legacy_ctrl |= YMFPCI_LEGACY_MEN;
 		} else {
-			legacy_ctrl2 &= ~(3 << 4);
+			legacy_ctrl2 &= ~YMFPCI_LEGACY2_MPUIO;
 			mpu_port[dev] = -1;
 		}
 	}
-	if (mpu_port[dev] > 0) {
-		// this bit is for legacy mpu irqs
-		// legacy_ctrl |= 0x10; /* MPU401 irq enable */
-		legacy_ctrl2 |= 1 << 15; /* IMOD */
+	if (chip->mpu_res) {
+		legacy_ctrl |= YMFPCI_LEGACY_MIEN; /* FIXME: do we need this? */
+		legacy_ctrl2 |= YMFPCI_LEGACY2_IMOD;
 	}
 	pci_read_config_word(pci, PCIR_DSXG_LEGACY, &old_legacy_ctrl);
-	//snd_printdd("legacy_ctrl = 0x%x\n", legacy_ctrl);
 	pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl);
-	//snd_printdd("legacy_ctrl2 = 0x%x\n", legacy_ctrl2);
 	pci_write_config_word(pci, PCIR_DSXG_ELEGACY, legacy_ctrl2);
 	if ((err = snd_ymfpci_create(card, pci,
 				     old_legacy_ctrl,
@@ -197,25 +200,22 @@
 		snd_card_free(card);
 		return err;
 	}
-	if (mpu_port[dev] > 0) {
+	if (chip->mpu_res) {
 		if ((err = snd_mpu401_uart_new(card, 0, MPU401_HW_YMFPCI,
-					       mpu_port[dev], 0,
+					       mpu_port[dev], 1,
 					       pci->irq, 0, &chip->rawmidi)) < 0) {
 			printk(KERN_WARNING "ymfpci: cannot initialize MPU401 at 0x%lx, skipping...\n", mpu_port[dev]);
-			mpu_port[dev] = 0;
-			// only for legacy mpu irqs
-			// legacy_ctrl &= ~0x10; /* disable MPU401 irq */
-			// pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl);
+			legacy_ctrl &= ~YMFPCI_LEGACY_MIEN; /* disable MPU401 irq */
+			pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl);
 		}
 	}
-	if (fm_port[dev] > 0) {
+	if (chip->fm_res) {
 		if ((err = snd_opl3_create(card,
 					   fm_port[dev],
 					   fm_port[dev] + 2,
-					   OPL3_HW_OPL3, 0, &opl3)) < 0) {
+					   OPL3_HW_OPL3, 1, &opl3)) < 0) {
 			printk(KERN_WARNING "ymfpci: cannot initialize FM OPL3 at 0x%lx, skipping...\n", fm_port[dev]);
-			fm_port[dev] = 0;
-			legacy_ctrl &= ~2;
+			legacy_ctrl &= ~YMFPCI_LEGACY_FMEN;
 			pci_write_config_word(pci, PCIR_DSXG_LEGACY, legacy_ctrl);
 		} else if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
 			snd_card_free(card);
diff -Nru a/sound/pci/ymfpci/ymfpci_main.c b/sound/pci/ymfpci/ymfpci_main.c
--- a/sound/pci/ymfpci/ymfpci_main.c	Sat Apr 19 19:51:50 2003
+++ b/sound/pci/ymfpci/ymfpci_main.c	Sat Apr 19 19:51:50 2003
@@ -930,7 +930,7 @@
 	chip->spdif_opened++;
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
 
-	chip->spdif_pcm_ctl->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	chip->spdif_pcm_ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id);
 	return 0;
@@ -1022,7 +1022,7 @@
 			  snd_ymfpci_readw(chip, YDSXGR_SPDIFOUTCTRL) & ~2);
 	snd_ymfpci_writew(chip, YDSXGR_SPDIFOUTSTATUS, chip->spdif_bits);
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
-	chip->spdif_pcm_ctl->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
+	chip->spdif_pcm_ctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
 	snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE |
 		       SNDRV_CTL_EVENT_MASK_INFO, &chip->spdif_pcm_ctl->id);
 	return snd_ymfpci_playback_close_1(substream);
@@ -2058,6 +2058,14 @@
 	if (chip->saved_regs)
 		vfree(chip->saved_regs);
 #endif
+	if (chip->mpu_res) {
+		release_resource(chip->mpu_res);
+		kfree_nocheck(chip->mpu_res);
+	}
+	if (chip->fm_res) {
+		release_resource(chip->fm_res);
+		kfree_nocheck(chip->fm_res);
+	}
 	if (chip->reg_area_virt)
 		iounmap((void *)chip->reg_area_virt);
 	if (chip->work_ptr)
diff -Nru a/sound/ppc/awacs.c b/sound/ppc/awacs.c
--- a/sound/ppc/awacs.c	Sat Apr 19 19:51:48 2003
+++ b/sound/ppc/awacs.c	Sat Apr 19 19:51:48 2003
@@ -52,6 +52,18 @@
 #endif /* PMAC_AMP_AVAIL */
 
 
+static void snd_pmac_screamer_wait(pmac_t *chip)
+{
+	long timeout = 2000;
+	while (!(in_le32(&chip->awacs->codec_stat) & MASK_VALID)) {
+		mdelay(1);
+		if (! --timeout) {
+			snd_printd("snd_pmac_screamer_wait timeout\n");
+			break;
+		}
+	}
+}
+
 /*
  * write AWACS register
  */
@@ -60,13 +72,15 @@
 {
 	long timeout = 5000000;
 
+	if (chip->model == PMAC_SCREAMER)
+		snd_pmac_screamer_wait(chip);
+	out_le32(&chip->awacs->codec_ctrl, val | (chip->subframe << 22));
 	while (in_le32(&chip->awacs->codec_ctrl) & MASK_NEWECMD) {
 		if (! --timeout) {
 			snd_printd("snd_pmac_awacs_write timeout\n");
 			break;
 		}
 	}
-	out_le32(&chip->awacs->codec_ctrl, val | (chip->subframe << 22));
 }
 
 static void
@@ -101,11 +115,14 @@
 	/* Sorry for the horrible delays... I hope to get that improved
 	 * by making the whole PM process asynchronous in a future version
 	 */
-	do_mdelay(750, can_schedule);
+	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
+	if (chip->manufacturer == 0x1)
+		/* delay for broken crystal part */
+		do_mdelay(750, can_schedule);
 	snd_pmac_awacs_write_noreg(chip, 1,
 				   chip->awacs_reg[1] | MASK_RECALIBRATE | MASK_CMUTE | MASK_AMUTE);
-	do_mdelay(1000, can_schedule);
 	snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
+	snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
 }
 
 #else
@@ -626,12 +643,8 @@
 	snd_pmac_awacs_write_noreg(chip, 4, chip->awacs_reg[4]);
 	if (chip->model == PMAC_SCREAMER) {
 		snd_pmac_awacs_write_noreg(chip, 5, chip->awacs_reg[5]);
-		do_mdelay(100, can_schedule);
 		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
-		mdelay(2);
-		snd_pmac_awacs_write_noreg(chip, 1, chip->awacs_reg[1]);
 		snd_pmac_awacs_write_noreg(chip, 7, chip->awacs_reg[7]);
-		snd_pmac_awacs_write_noreg(chip, 0, chip->awacs_reg[0]);
 	}
 }
 
@@ -639,6 +652,11 @@
 static void snd_pmac_awacs_resume(pmac_t *chip)
 {
 	awacs_restore_all_regs(chip, 0);
+	if (chip->model == PMAC_SCREAMER) {
+		/* reset power bits in reg 6 */
+		mdelay(5);
+		snd_pmac_awacs_write_noreg(chip, 6, chip->awacs_reg[6]);
+	}
 	screamer_recalibrate(chip, 0);
 #ifdef PMAC_AMP_AVAIL
 	if (chip->mixer_data) {
@@ -748,6 +766,7 @@
 	}
 
 	awacs_restore_all_regs(chip, 1);
+	chip->manufacturer = (in_le32(&chip->awacs->codec_stat) >> 8) & 0xf;
 	screamer_recalibrate(chip, 1);
 
 	chip->revision = (in_le32(&chip->awacs->codec_stat) >> 12) & 0xf;
diff -Nru a/sound/ppc/pmac.c b/sound/ppc/pmac.c
--- a/sound/ppc/pmac.c	Sat Apr 19 19:51:51 2003
+++ b/sound/ppc/pmac.c	Sat Apr 19 19:51:51 2003
@@ -269,21 +269,6 @@
 
 
 /*
- * stop beep if running (no spinlock!)
- */
-static void snd_pmac_beep_stop(pmac_t *chip)
-{
-	pmac_beep_t *beep = chip->beep;
-
-	if (beep && beep->running) {
-		beep->running = 0;
-		del_timer(&beep->timer);
-		snd_pmac_dma_stop(&chip->playback);
-		st_le16(&chip->extra_dma.cmds->command, DBDMA_STOP);
-	}
-}
-
-/*
  * PCM trigger/stop
  */
 static int snd_pmac_pcm_trigger(pmac_t *chip, pmac_stream_t *rec,
@@ -696,245 +681,6 @@
 }
 
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
-
-/*
- * beep stuff
- */
-
-/*
- * Stuff for outputting a beep.  The values range from -327 to +327
- * so we can multiply by an amplitude in the range 0..100 to get a
- * signed short value to put in the output buffer.
- */
-static short beep_wform[256] = {
-	0,	40,	79,	117,	153,	187,	218,	245,
-	269,	288,	304,	316,	323,	327,	327,	324,
-	318,	310,	299,	288,	275,	262,	249,	236,
-	224,	213,	204,	196,	190,	186,	183,	182,
-	182,	183,	186,	189,	192,	196,	200,	203,
-	206,	208,	209,	209,	209,	207,	204,	201,
-	197,	193,	188,	183,	179,	174,	170,	166,
-	163,	161,	160,	159,	159,	160,	161,	162,
-	164,	166,	168,	169,	171,	171,	171,	170,
-	169,	167,	163,	159,	155,	150,	144,	139,
-	133,	128,	122,	117,	113,	110,	107,	105,
-	103,	103,	103,	103,	104,	104,	105,	105,
-	105,	103,	101,	97,	92,	86,	78,	68,
-	58,	45,	32,	18,	3,	-11,	-26,	-41,
-	-55,	-68,	-79,	-88,	-95,	-100,	-102,	-102,
-	-99,	-93,	-85,	-75,	-62,	-48,	-33,	-16,
-	0,	16,	33,	48,	62,	75,	85,	93,
-	99,	102,	102,	100,	95,	88,	79,	68,
-	55,	41,	26,	11,	-3,	-18,	-32,	-45,
-	-58,	-68,	-78,	-86,	-92,	-97,	-101,	-103,
-	-105,	-105,	-105,	-104,	-104,	-103,	-103,	-103,
-	-103,	-105,	-107,	-110,	-113,	-117,	-122,	-128,
-	-133,	-139,	-144,	-150,	-155,	-159,	-163,	-167,
-	-169,	-170,	-171,	-171,	-171,	-169,	-168,	-166,
-	-164,	-162,	-161,	-160,	-159,	-159,	-160,	-161,
-	-163,	-166,	-170,	-174,	-179,	-183,	-188,	-193,
-	-197,	-201,	-204,	-207,	-209,	-209,	-209,	-208,
-	-206,	-203,	-200,	-196,	-192,	-189,	-186,	-183,
-	-182,	-182,	-183,	-186,	-190,	-196,	-204,	-213,
-	-224,	-236,	-249,	-262,	-275,	-288,	-299,	-310,
-	-318,	-324,	-327,	-327,	-323,	-316,	-304,	-288,
-	-269,	-245,	-218,	-187,	-153,	-117,	-79,	-40,
-};
-
-#define BEEP_SRATE	22050	/* 22050 Hz sample rate */
-#define BEEP_BUFLEN	512
-#define BEEP_VOLUME	15	/* 0 - 100 */
-
-static void snd_pmac_beep_stop_callback(unsigned long data)
-{
-	pmac_t *chip = snd_magic_cast(pmac_t, (void*)data,);
-
-	spin_lock(&chip->reg_lock);
-	snd_pmac_beep_stop(chip);
-	snd_pmac_pcm_set_format(chip);
-	spin_unlock(&chip->reg_lock);
-}
-
-/* because mksound callback takes no private argument, we must keep
-   the chip pointer here as static variable.
-   This means that only one chip can beep.  Well, it's ok -
-   anyway we don't like hearing loud beeps from every chip
-   at the same time :)
-*/
-   
-static pmac_t *beeping_chip = NULL;
-
-static void snd_pmac_mksound(unsigned int hz, unsigned int ticks)
-{
-	pmac_t *chip;
-	pmac_stream_t *rec;
-	pmac_beep_t *beep;
-	unsigned long flags;
-	int beep_speed = 0;
-	int srate;
-	int period, ncycles, nsamples;
-	int i, j, f;
-	short *p;
-
-	if ((chip = beeping_chip) == NULL || (beep = chip->beep) == NULL)
-		return;
-	rec = &chip->playback;
-
-	beep_speed = snd_pmac_rate_index(chip, rec, BEEP_SRATE);
-	srate = chip->freq_table[beep_speed];
-
-	if (hz <= srate / BEEP_BUFLEN || hz > srate / 2) {
-		/* this is a hack for broken X server code */
-		hz = 750;
-		ticks = 12;
-	}
-
-	spin_lock_irqsave(&chip->reg_lock, flags);
-	if (chip->playback.running || chip->capture.running || beep->running) {
-		spin_unlock_irqrestore(&chip->reg_lock, flags);
-		return;
-	}
-	beep->running = 1;
-	spin_unlock_irqrestore(&chip->reg_lock, flags);
-
-	if (hz == beep->hz && beep->volume == beep->volume_play) {
-		nsamples = beep->nsamples;
-	} else {
-		period = srate * 256 / hz;	/* fixed point */
-		ncycles = BEEP_BUFLEN * 256 / period;
-		nsamples = (period * ncycles) >> 8;
-		f = ncycles * 65536 / nsamples;
-		j = 0;
-		p = beep->buf;
-		for (i = 0; i < nsamples; ++i, p += 2) {
-			p[0] = p[1] = beep_wform[j >> 8] * beep->volume;
-			j = (j + f) & 0xffff;
-		}
-		beep->hz = hz;
-		beep->volume_play = beep->volume;
-		beep->nsamples = nsamples;
-	}
-
-	spin_lock_irqsave(&chip->reg_lock, flags);
-	if (beep->running) {
-		if (ticks <= 0)
-			ticks = 1;
-		del_timer(&beep->timer);
-		beep->timer.expires = jiffies + ticks;
-		beep->timer.function = snd_pmac_beep_stop_callback;
-		beep->timer.data = (unsigned long)chip;
-		add_timer(&beep->timer);
-		snd_pmac_dma_stop(rec);
-		st_le16(&chip->extra_dma.cmds->req_count, nsamples * 4);
-		st_le16(&chip->extra_dma.cmds->xfer_status, 0);
-		st_le32(&chip->extra_dma.cmds->cmd_dep, chip->extra_dma.addr);
-		st_le32(&chip->extra_dma.cmds->phy_addr, beep->addr);
-		st_le16(&chip->extra_dma.cmds->command, OUTPUT_MORE + BR_ALWAYS);
-		out_le32(&chip->awacs->control,
-			 (in_le32(&chip->awacs->control) & ~0x1f00)
-			 | (beep_speed << 8));
-		out_le32(&chip->awacs->byteswap, 0);
-		snd_pmac_dma_set_command(rec, &chip->extra_dma);
-		snd_pmac_dma_run(rec, RUN);
-	}
-	spin_unlock_irqrestore(&chip->reg_lock, flags);
-}
-
-/*
- * beep volume mixer
- */
-static int snd_pmac_info_beep(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
-{
-	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
-	uinfo->count = 1;
-	uinfo->value.integer.min = 0;
-	uinfo->value.integer.max = 100;
-	return 0;
-}
-
-static int snd_pmac_get_beep(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	pmac_t *chip = snd_kcontrol_chip(kcontrol);
-	snd_runtime_check(chip->beep, return -ENXIO);
-	ucontrol->value.integer.value[0] = chip->beep->volume;
-	return 0;
-}
-
-static int snd_pmac_put_beep(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
-{
-	pmac_t *chip = snd_kcontrol_chip(kcontrol);
-	int oval;
-	snd_runtime_check(chip->beep, return -ENXIO);
-	oval = chip->beep->volume;
-	chip->beep->volume = ucontrol->value.integer.value[0];
-	return oval != chip->beep->volume;
-}
-
-static snd_kcontrol_new_t snd_pmac_beep_mixer = {
-	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-	.name = "Beep Playback Volume",
-	.index = 0,
-	.info = snd_pmac_info_beep,
-	.get = snd_pmac_get_beep,
-	.put = snd_pmac_put_beep,
-};
-
-static void snd_pmac_beep_free(snd_kcontrol_t *control)
-{
-	pmac_t *chip = snd_magic_cast(pmac_t, _snd_kcontrol_chip(control),);
-	if (chip->beep) {
-		/* restore */
-		kd_mksound = chip->beep->orig_mksound;
-		kfree(chip->beep->buf);
-		kfree(chip->beep);
-		chip->beep = NULL;
-	}
-}
-
-/* Initialize beep stuff */
-int __init snd_pmac_attach_beep(pmac_t *chip)
-{
-	pmac_beep_t *beep;
-	int err;
-
-	beep = kmalloc(sizeof(*beep), GFP_KERNEL);
-	if (! beep)
-		return -ENOMEM;
-
-	beep->buf = (short *) kmalloc(BEEP_BUFLEN * 4, GFP_KERNEL);
-	if (! beep->buf) {
-		kfree(beep);
-		return -ENOMEM;
-	}
-	beep->addr = virt_to_bus(beep->buf);
-	init_timer(&beep->timer);
-	beep->timer.function = snd_pmac_beep_stop_callback;
-	beep->timer.data = (unsigned long) chip;
-	beep->orig_mksound = kd_mksound;
-	beep->volume = BEEP_VOLUME;
-	beep->running = 0;
-	beep->control = snd_ctl_new1(&snd_pmac_beep_mixer, chip);
-	if (beep->control == NULL) {
-		kfree(beep);
-		return -ENOMEM;
-	}
-	beep->control->private_free = snd_pmac_beep_free;
-	if ((err = snd_ctl_add(chip->card, beep->control)) < 0) {
-		kfree(beep);
-		return err;
-	}
-
-	/* hook */
-	beeping_chip = chip;
-	chip->beep = beep;
-	kd_mksound = snd_pmac_mksound;
-
-	return 0;
-}
-
-#endif /* beep stuff */
-
 static void snd_pmac_dbdma_reset(pmac_t *chip)
 {
 	out_le32(&chip->playback.dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
@@ -1471,8 +1217,7 @@
 		chip->suspend(chip);
 	snd_pcm_suspend_all(chip->pcm);
 	spin_lock_irqsave(&chip->reg_lock, flags);
-	if (chip->beep && chip->beep->running)
-		snd_pmac_beep_stop(chip);
+	snd_pmac_beep_stop(chip);
 	spin_unlock_irqrestore(&chip->reg_lock, flags);
 	disable_irq(chip->irq);
 	disable_irq(chip->tx_irq);
diff -Nru a/sound/ppc/pmac.h b/sound/ppc/pmac.h
--- a/sound/ppc/pmac.h	Sat Apr 19 19:51:49 2003
+++ b/sound/ppc/pmac.h	Sat Apr 19 19:51:49 2003
@@ -22,6 +22,7 @@
 #ifndef __PMAC_H
 #define __PMAC_H
 
+#include <linux/version.h>
 #include <sound/control.h>
 #include <sound/pcm.h>
 #include "awacs.h"
@@ -95,24 +96,6 @@
 
 
 /*
- * beep using pcm
- */
-struct snd_pmac_beep {
-	int running;	/* boolean */
-	int volume;	/* mixer volume: 0-100 */
-	int volume_play;	/* currently playing volume */
-	int hz;
-	int nsamples;
-	short *buf;		/* allocated wave buffer */
-	unsigned long addr;	/* physical address of buffer */
-	struct timer_list timer;	/* timer list for stopping beep */
-	void (*orig_mksound)(unsigned int, unsigned int);
-				/* pointer to restore */
-	snd_kcontrol_t *control;	/* mixer element */
-};
-
-
-/*
  */
 
 enum snd_pmac_model {
@@ -125,6 +108,7 @@
 	/* h/w info */
 	struct device_node *node;
 	unsigned int revision;
+	unsigned int manufacturer;
 	unsigned int subframe;
 	unsigned int device_id;
 	enum snd_pmac_model model;
@@ -222,5 +206,10 @@
 int snd_pmac_boolean_mono_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo);
 
 int snd_pmac_add_automute(pmac_t *chip);
+
+#ifndef PMAC_SUPPORT_PCM_BEEP
+#define snd_pmac_attach_beep(chip) 0
+#define snd_pmac_beep_stop(chip)  /**/
+#endif
 
 #endif /* __PMAC_H */
diff -Nru a/sound/ppc/powermac.c b/sound/ppc/powermac.c
--- a/sound/ppc/powermac.c	Sat Apr 19 19:51:51 2003
+++ b/sound/ppc/powermac.c	Sat Apr 19 19:51:51 2003
@@ -37,7 +37,9 @@
 static int index = SNDRV_DEFAULT_IDX1;		/* Index 0-MAX */
 static char *id = SNDRV_DEFAULT_STR1;		/* ID for this card */
 static int enable = 1;
+#ifdef PMAC_SUPPORT_PCM_BEEP
 static int enable_beep = 1;
+#endif
 
 MODULE_PARM(index, "i");
 MODULE_PARM_DESC(index, "Index value for " CHIP_NAME " soundchip.");
@@ -48,9 +50,11 @@
 MODULE_PARM(enable, "i");
 MODULE_PARM_DESC(enable, "Enable this soundchip.");
 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
+#ifdef PMAC_SUPPORT_PCM_BEEP
 MODULE_PARM(enable_beep, "i");
 MODULE_PARM_DESC(enable_beep, "Enable beep using PCM.");
 MODULE_PARM_SYNTAX(enable_beep, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
+#endif
 
 
 /*
@@ -129,7 +133,7 @@
 		goto __error;
 
 	chip->initialized = 1;
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#ifdef PMAC_SUPPORT_PCM_BEEP
 	if (enable_beep)
 		snd_pmac_attach_beep(chip);
 #endif
@@ -181,8 +185,10 @@
 {
 	(void)(get_option(&str,&enable) == 2 &&
 	       get_option(&str,&index) == 2 &&
-	       get_id(&str,&id) == 2 &&
-	       get_option(&str,&enable_beep) == 2
+	       get_id(&str,&id) == 2
+#ifdef PMAC_SUPPORT_PCM_BEEP
+	       && get_option(&str,&enable_beep) == 2
+#endif
 	       );
 	return 1;
 }
diff -Nru a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h
--- a/sound/usb/usbquirks.h	Sat Apr 19 19:51:46 2003
+++ b/sound/usb/usbquirks.h	Sat Apr 19 19:51:46 2003
@@ -717,7 +717,7 @@
 	.driver_info = (unsigned long) & (const snd_usb_audio_quirk_t) {
 		.vendor_name = "M-Audio",
 		.product_name = "AudioPhile",
-		.ifnum = 9,
+		.ifnum = 6,
 		.type = QUIRK_MIDI_MIDIMAN,
 		.data = & (const snd_usb_midi_endpoint_info_t) {
 			.out_cables = 0x0001,
